pax_global_header00006660000000000000000000000064133167024530014516gustar00rootroot0000000000000052 comment=284e8ae1b2c831732e9dc6022f8d8ed040a48cf1 classified-ads-0.13/000077500000000000000000000000001331670245300143145ustar00rootroot00000000000000classified-ads-0.13/FrontWidget.cpp000066400000000000000000003310161331670245300172600ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #include #include #include #include #include "FrontWidget.h" #include "log.h" #include "datamodel/model.h" #include "mcontroller.h" #include "datamodel/profile.h" #include "datamodel/profilemodel.h" #include "datamodel/binaryfile.h" #include "datamodel/binaryfilemodel.h" #include "datamodel/binaryfilelistingmodel.h" #include "datamodel/privmsgmodel.h" #include "datamodel/contentencryptionmodel.h" #include "datamodel/camodel.h" #include "datamodel/ca.h" #include "datamodel/tclprogram.h" #include "datamodel/trusttreemodel.h" #include "datamodel/tclmodel.h" #include "ui/profilereadersdialog.h" #include "ui/newclassifiedaddialog.h" #include "ui/newprivmsgdialog.h" #include "ui/newprofilecommentdialog.h" #include "ui/profilecommentdisplay.h" #include "ui/attachmentlistdialog.h" #include "ui/newtextdocument.h" #include "ui/editcontact.h" #include "ui/metadataQuery.h" // for query dialog #include "ui/callstatus.h" static const QString internalNameOfProfileTab("profileTabNamed") ; static const QString internalNameOfCommentDialog("caCommentDlgNamed") ; static const QString internalNameOfCallStatusDialog("caCallStatDlgNamed") ; FrontWidget::FrontWidget(Controller* aController, QMainWindow& aParent): iController(aController), iParent(aParent), iSelectedProfile(NULL), iViewedProfile(NULL), iAddSharedFileAction(NULL), iRemoveSharedFileAction(NULL), iExportSharedFileAction(NULL), iViewSharedFileInfoAction(NULL), iCopySharedFileHashAction(NULL), iEditNewSharedFileAction(NULL), iSelectedProfileFileListingModel(NULL), iViewedProfileFileListingModel(NULL), iReplyToCaButton(NULL), iReplyToCaToForumButton(NULL), iNewCaButton(NULL), iCommentCaPosterButton(NULL), iViewCaPosterProfileButton(NULL), iViewCaAttachmentsButton(NULL), iAddToContactsFromCaList(NULL), iCaListingModel(KNullHash,iController->model(),iController), iArticleTopLeft(0,40), iPrivMsgSearchModel(aController->model(),*aController), iPrivMsgTopLeft(0,40), iReplyToPrivMsgButton(NULL), iNewPrivMsgButton (NULL), iCommentPrivMsgPosterButton(NULL), iViewPrivMsgPosterProfileButton(NULL), iViewPrivMsgAttachmentsButton(NULL), iAddToContactsFromMsgList(NULL), iContactsModel(aController->model(),*aController), iEditContactAction(NULL), iSelectedProfileCommentListingModel(aController->model(),*aController), iViewedProfileCommentListingModel(aController->model(),*aController), iProfileListingKeyboardGrabber(NULL), iWindowSizeAdjusted(false) { ui.setupUi(this) ; ui.tabWidget->setTabText(0, tr("Classified ads")) ; ui.tabWidget->setTabText(1, tr("My profile")) ; ui.tabWidget->setTabText(2, tr("Contacts")) ; ui.tabWidget->setTabText(3, tr("Private messages")) ; // connect signals of profile details tab, that is to be removed connect(ui.profileDetailsSendMsgButton, SIGNAL(clicked()), this, SLOT(profileSendMsgButtonClicked())) ; connect(ui.profileDetailsReadersButton, SIGNAL(clicked()), this, SLOT(profileShowReadersButtonClicked())) ; connect(ui.profileDetailsCommentButton, SIGNAL(clicked()), this, SLOT(profileSendCommentButtonClicked())) ; connect(ui.searchAdsButton, SIGNAL(clicked()), this, SLOT(performAdsSearchClicked())) ; connect(ui.profileDetailsVoiceCallButton, SIGNAL(clicked()), this, SLOT(voiceCallButtonPressed())) ; // add profile text editors to slot that enables "publish" button // when user edits the profile: connect(ui.profileNickNameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(profileEdited(const QString&)), Qt::QueuedConnection) ; connect(ui.greetingTextEdit, SIGNAL(textEdited(const QString&)), this, SLOT(profileEdited(const QString&)), Qt::QueuedConnection) ; connect(ui.firstNameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(profileEdited(const QString&)), Qt::QueuedConnection) ; connect(ui.familyNameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(profileEdited(const QString&)), Qt::QueuedConnection) ; connect(ui.cityCountryEdit, SIGNAL(textEdited(const QString&)), this, SLOT(profileEdited(const QString&)), Qt::QueuedConnection) ; connect(ui.btcAddressEdit, SIGNAL(textEdited(const QString&)), this, SLOT(profileEdited(const QString&)), Qt::QueuedConnection) ; connect(ui.stateOfTheWorldEdit, SIGNAL(textEdited(const QString&)), this, SLOT(profileEdited(const QString&)), Qt::QueuedConnection) ; // have context-menu for "shared files:" iAddSharedFileAction = new QAction(tr("Add shared file.."),this) ; iRemoveSharedFileAction = new QAction(tr("Stop advertising selected shared file"),this) ; iExportSharedFileAction = new QAction(tr("Save file to disk.."),this) ; iViewSharedFileInfoAction = new QAction(tr("View file information.."), this) ; iCopySharedFileHashAction = new QAction(tr("Copy file address (SHA1) to clipboard.."),this) ; iEditNewSharedFileAction = new QAction(tr("Edit+publish new text document.."),this) ; ui.sharedFilesView->setContextMenuPolicy(Qt::ActionsContextMenu); ui.sharedFilesView->addAction(iAddSharedFileAction) ; ui.sharedFilesView->addAction(iRemoveSharedFileAction) ; ui.sharedFilesView->addAction(iExportSharedFileAction) ; ui.sharedFilesView->addAction(iViewSharedFileInfoAction) ; ui.sharedFilesView->addAction(iCopySharedFileHashAction) ; ui.sharedFilesView->addAction(iEditNewSharedFileAction) ; ui.profileDetailsSharedFilesView->setContextMenuPolicy(Qt::ActionsContextMenu); ui.profileDetailsSharedFilesView->addAction(iExportSharedFileAction) ; ui.profileDetailsSharedFilesView->addAction(iViewSharedFileInfoAction) ; ui.profileDetailsSharedFilesView->addAction(iCopySharedFileHashAction) ; connect(iAddSharedFileAction, SIGNAL(triggered()), this, SLOT(fileToBeSharedAdded())) ; connect(iRemoveSharedFileAction, SIGNAL(triggered()), this, SLOT(fileToBeSharedRemoved())) ; connect(iExportSharedFileAction, SIGNAL(triggered()), this, SLOT(exportSharedFile())) ; connect(iViewSharedFileInfoAction, SIGNAL(triggered()), this, SLOT(viewSharedFileInfo())); connect(iCopySharedFileHashAction, SIGNAL(triggered()), this, SLOT(copySharedFileHash())) ; connect(iEditNewSharedFileAction, SIGNAL(triggered()), this, SLOT(editNewSharedFile())) ; // and initially remove tab 4 "profile details" ui.tabWidget->removeTab(4); connect(ui.publisChangesButton, SIGNAL(clicked()), this, SLOT(publishProfileButtonClicked())) ; connect(ui.revertChangesButton, SIGNAL(clicked()), this, SLOT(revertProfileButtonClicked())) ; connect(ui.imageButton, SIGNAL(clicked()), this, SLOT(profileImageClicked())) ; connect(ui.profileReadersButton, SIGNAL(clicked()), this, SLOT(profileReadersClicked())) ; connect(ui.isPrivateCheckbox, SIGNAL(stateChanged(int)), this, SLOT(isPrivateSettingChanged(int))) ; setupPrivateMessagesTab() ; setupClassifiedAdsTab() ; setupContactsTab() ; ui.contactsView->setModel(&iContactsModel) ; connect(& iSelectedProfileCommentListingModel, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; connect(& iViewedProfileCommentListingModel, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; ui.profileCommentsView->setModel(& iSelectedProfileCommentListingModel) ; ui.profileDetailsCommentsView->setModel(& iViewedProfileCommentListingModel) ; connect(ui.profileCommentsView->selectionModel(), SIGNAL(selectionChanged (const QItemSelection &, const QItemSelection &)), this, SLOT(ownProfileCommentselectionChangedSlot(const QItemSelection &, const QItemSelection &))); connect(ui.profileDetailsCommentsView->selectionModel(), SIGNAL(selectionChanged (const QItemSelection &, const QItemSelection &)), this, SLOT(viewedProfileCommentselectionChangedSlot(const QItemSelection &, const QItemSelection &))); connect(ui.profileCommentsView, SIGNAL(doubleClicked (const QModelIndex &)), this, SLOT(ownProfileCommentDoubleClicked(const QModelIndex &))); connect(ui.profileDetailsCommentsView, SIGNAL(doubleClicked (const QModelIndex &)), this, SLOT(viewedProfileCommentDoubleClicked(const QModelIndex &))); // interestingly "enter" key is mapped into "InsertParagraphSeparator" // but that seems to be true for all desktop configurations of Qt iProfileListingKeyboardGrabber = new QShortcut(QKeySequence(QKeySequence::InsertParagraphSeparator),ui.profileDetailsCommentsView) ; assert( connect(iProfileListingKeyboardGrabber, SIGNAL(activated()), this, SLOT(viewedProfileCommentKeyPressed()))) ; ui.tabWidget->setCurrentWidget(ui.myProfileTab) ; assert( connect ( iController, SIGNAL(userProfileSelected(const Hash&)), &iSelectedProfileCommentListingModel, SLOT(profileSelected(const Hash&)), Qt::QueuedConnection)) ; assert( connect ( ui.tabWidget, SIGNAL(currentChanged(int)), this, SLOT(updateFileSelectionActions()))) ; updateFileSelectionActions(); } FrontWidget::~FrontWidget() { disconnect(this, 0, 0, 0); delete iProfileListingKeyboardGrabber ; iCaScene.removeItem(&iCaText); iCaScene.removeItem(&iFromField); iCaScene.removeItem(&iSubjectField ) ; ui.caMessageView->setScene(NULL) ; delete iAddSharedFileAction ; delete iRemoveSharedFileAction ; delete iExportSharedFileAction ; delete iViewSharedFileInfoAction ; delete iCopySharedFileHashAction; delete iEditNewSharedFileAction; delete iEditContactAction ; if ( iSelectedProfileFileListingModel ) { delete iSelectedProfileFileListingModel ; ui.sharedFilesView->setModel(NULL) ; } if ( iViewedProfileFileListingModel ) { delete iViewedProfileFileListingModel ; ui.profileDetailsSharedFilesView->setModel(NULL) ; } if ( ui.privateMessageListView ) { ui.privateMessageListView->setModel(NULL) ; } if ( iSelectedProfile ) { delete iSelectedProfile; } if ( iViewedProfile) { delete iViewedProfile; } if ( ui.profileCommentsView ) { ui.profileCommentsView->setModel(NULL) ; } if ( ui.profileDetailsCommentsView ) { ui.profileDetailsCommentsView->setModel(NULL) ; } delete iReplyToCaButton ; delete iReplyToCaToForumButton ; delete iNewCaButton ; delete iCommentCaPosterButton ; delete iViewCaPosterProfileButton; delete iViewCaAttachmentsButton ; delete iReplyToPrivMsgButton ; delete iNewPrivMsgButton ; delete iCommentPrivMsgPosterButton; delete iViewPrivMsgPosterProfileButton; delete iViewPrivMsgAttachmentsButton ; delete iAddToContactsFromMsgList ; delete iAddToContactsFromCaList ; LOG_STR("FrontWidget::~FrontWidget()") ; } void FrontWidget::publishProfileButtonClicked() { LOG_STR("publishProfileButtonClicked() ") ; if ( iSelectedProfile ) { iSelectedProfile->iNickName = ui.profileNickNameEdit->text() ; iSelectedProfile->iGreetingText = ui.greetingTextEdit->text() ; iSelectedProfile->iFirstName = ui.firstNameEdit->text() ; iSelectedProfile->iFamilyName = ui.familyNameEdit->text(); iSelectedProfile->iCityCountry = ui.cityCountryEdit->text() ; iSelectedProfile->iBTCAddress = ui.btcAddressEdit->text() ; iSelectedProfile->iStateOfTheWorld = ui.stateOfTheWorldEdit->text() ; iSelectedProfile->iTimeOfPublish = QDateTime::currentDateTimeUtc().toTime_t() ; iController->model().lock() ; iController->model().profileModel().publishProfile(*iSelectedProfile); iController->model().unlock() ; updateUiFromSelectedProfile() ; } } void FrontWidget::revertProfileButtonClicked() { LOG_STR("revertProfileButtonClicked() ") ; if ( iSelectedProfile ) { userProfileSelected(iController->profileInUse()) ; // re-load } ui.publisChangesButton->setEnabled(false) ; ui.revertChangesButton->setEnabled(false) ; } void FrontWidget::profileImageClicked() { LOG_STR("profileImageClicked() ") ; if ( iSelectedProfile ) { QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("Files (*.*)")); if ( fileName.length() > 0 ) { QPixmap profilePic ; if ( ! profilePic.load(fileName) ) { QMessageBox::about(this,tr("Error"), tr("Can't load image")); return ; } else { // see if there is need to scale: if ( profilePic.height() > ui.imageButton->height() ) { QPixmap scaledImage ( profilePic.scaledToHeight(ui.imageButton->height()) ) ; profilePic = scaledImage ; LOG_STR("Scaling image to height") ; } if ( profilePic.width() > ui.imageButton->width() ) { QPixmap scaledImage ( profilePic.scaledToWidth(ui.imageButton->width()) ) ; profilePic = scaledImage ; LOG_STR("Scaling image to width") ; } ui.imageButton->setIcon(QIcon ( profilePic )) ; iSelectedProfile->iProfilePicture = profilePic.toImage() ; ui.publisChangesButton->setEnabled(true) ; ui.revertChangesButton->setEnabled(true) ; } } } } void FrontWidget::profileEdited(const QString& /*aNewText*/) { // user touched her profile ; lets give her a clue that "publish" // might be in order ui.publisChangesButton->setEnabled(true) ; ui.revertChangesButton->setEnabled(true) ; } void FrontWidget::profileReadersClicked() { LOG_STR("profileReadersClicked() ") ; if ( iSelectedProfile ) { ProfileReadersDialog *profile_dialog = new ProfileReadersDialog(this, iController,*iSelectedProfile) ; connect(profile_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; profile_dialog->show() ; ui.publisChangesButton->setEnabled(true) ; ui.revertChangesButton->setEnabled(true) ; } } void FrontWidget::profileSendMsgButtonClicked() { LOG_STR("profileSendMsgButtonClicked") ; if ( iViewedProfile && iViewedProfile->iFingerPrint != KNullHash ) { NewPrivMessageDialog *posting_dialog = new NewPrivMessageDialog(this, iController, iViewedProfile->iFingerPrint.toString(), "", *iSelectedProfile, iPrivMsgSearchModel, KNullHash, KNullHash, ( iViewedProfile->iNodeOfProfile == NULL ? KNullHash : iViewedProfile->iNodeOfProfile->nodeFingerPrint() ) ) ; connect(posting_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; posting_dialog->show() ; // the dialog will delete self } } void FrontWidget::profileShowReadersButtonClicked() { LOG_STR("profileShowReadersButtonClicked") ; } void FrontWidget::profileSendCommentButtonClicked() { LOG_STR("profileSendCommentButtonClicked") ; if ( iViewedProfile && iViewedProfile->iFingerPrint != KNullHash ) { NewProfileCommentDialog *posting_dialog = new NewProfileCommentDialog(this, iController, iViewedProfile->iFingerPrint.toString(), "", *iSelectedProfile, iViewedProfileCommentListingModel, KNullHash, KNullHash, ( iViewedProfile->iNodeOfProfile == NULL ? KNullHash : iViewedProfile->iNodeOfProfile->nodeFingerPrint() ) ) ; connect(posting_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; posting_dialog->show() ; // the dialog will delete self } } void FrontWidget::performAdsSearchClicked() { LOG_STR("performAdsSearchClicked") ; selectClassification(selectedClassification(*ui.caAboutComboBox,*ui.caRegardingCombobox,*ui.caWhereComboBox,*iController)) ; iCaText.setHtml("") ; iSubjectField.setText("") ; iFromField.setText("") ; iCaOnDisplay.iSenderHash = KNullHash ; emit displayedCaChanged() ; ui.caAboutComboBox->setEnabled(true) ; ui.caHeadersView->setEnabled(true) ; } void FrontWidget::caTabAboutComboChanged(int /*aNewIndex*/) { // parameter not needed as selectedClassification() will ask it by itself */ LOG_STR2("caTabAboutComboChanged selection: %s", qPrintable(selectedClassification(*ui.caAboutComboBox,*ui.caRegardingCombobox,*ui.caWhereComboBox,*iController) )) ; iCaText.setHtml("") ; iSubjectField.setText("") ; iFromField.setText("") ; iCaOnDisplay.iSenderHash = KNullHash ; emit displayedCaChanged() ; ui.caHeadersView->setEnabled(false) ; iReplyToCaButton->setEnabled(false) ; iReplyToCaToForumButton->setEnabled(false) ; iCommentCaPosterButton->setEnabled(false) ; iViewCaPosterProfileButton->setEnabled(false) ; iViewCaAttachmentsButton->setEnabled(false) ; } void FrontWidget::caTabConcernsComboChanged(int /*aNewIndex*/) { // parameter not needed as selectedClassification() will ask it by itself */ LOG_STR2("caTabConcernsComboChanged selection: %s", qPrintable(selectedClassification(*ui.caAboutComboBox,*ui.caRegardingCombobox,*ui.caWhereComboBox,*iController) )) ; iCaText.setHtml("") ; iSubjectField.setText("") ; iFromField.setText("") ; iCaOnDisplay.iSenderHash = KNullHash ; emit displayedCaChanged() ; ui.caHeadersView->setEnabled(false) ; iReplyToCaButton->setEnabled(false) ; iReplyToCaToForumButton->setEnabled(false) ; iCommentCaPosterButton->setEnabled(false) ; iViewCaPosterProfileButton->setEnabled(false) ; iViewCaAttachmentsButton->setEnabled(false) ; } void FrontWidget::caTabWhereComboChanged(int /*aNewIndex*/) { // parameter not needed as selectedClassification() will ask it by itself */ LOG_STR2("caTabWhereComboChanged selection: %s", qPrintable(selectedClassification(*ui.caAboutComboBox,*ui.caRegardingCombobox,*ui.caWhereComboBox,*iController) )) ; iCaText.setHtml("") ; iSubjectField.setText("") ; iFromField.setText("") ; iCaOnDisplay.iSenderHash = KNullHash ; emit displayedCaChanged() ; ui.caHeadersView->setEnabled(false) ; iReplyToCaButton->setEnabled(false) ; iReplyToCaToForumButton->setEnabled(false) ; iCommentCaPosterButton->setEnabled(false) ; iViewCaPosterProfileButton->setEnabled(false) ; iViewCaAttachmentsButton->setEnabled(false) ; } void FrontWidget::replyToCaButtonClicked() { LOG_STR("replyToCaButtonClicked") ; if ( iCaOnDisplay.iSenderHash != KNullHash ) { /* * before continuing check this: we have the CA but * it is possible that CA poster pubkey has already * been expired in db as they're kept in separate * tables -> check that key is in place before * continuing or message encryption will fail */ quint32 dummy ; QByteArray dummyKey ; if ( iController->model().contentEncryptionModel().PublicKey(iCaOnDisplay.iSenderHash, dummyKey, &dummy) == false ) { // key not found, insert first: QLOG_STR("CA sender key not in db, inserting first. " + iCaOnDisplay.iSenderHash.toString()) ; iController->model().contentEncryptionModel().insertOrUpdatePublicKey (iCaOnDisplay.iProfileKey, iCaOnDisplay.iSenderHash, &iCaOnDisplay.iSenderName ) ; } NewPrivMessageDialog *posting_dialog = new NewPrivMessageDialog(this, iController, iCaOnDisplay.iSenderHash.toString(), iCaOnDisplay.iSubject, *iSelectedProfile, iPrivMsgSearchModel, KNullHash, iCaOnDisplay.iFingerPrint, KNullHash) ; connect(posting_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; posting_dialog->show() ; // the dialog will delete self } } void FrontWidget::replyToCaToForumButtonClicked() { LOG_STR("replyToCaToForumButtonClicked") ; // check which article we're displaying: Hash hashOnDisplay ; foreach(const QModelIndex &index, ui.caHeadersView->selectionModel()->selectedIndexes()) { hashOnDisplay.fromQVariant( iCaListingModel.theCaModel()->data(index,Qt::UserRole) ) ; break ; } if ( iSelectedProfile && hashOnDisplay != KNullHash ) { NewClassifiedAdDialog *posting_dialog = new NewClassifiedAdDialog(this, iController, iController->model().classifiedAdsModel().aboutComboBoxTexts().indexOf(ui.caAboutComboBox->currentText()), iController->model().classifiedAdsModel().regardingComboBoxTexts().indexOf(ui.caRegardingCombobox->currentText()), iController->model().classifiedAdsModel().whereComboBoxTexts().indexOf(ui.caWhereComboBox->currentText()), ui.caAboutComboBox->currentText(), ui.caRegardingCombobox->currentText(), ui.caWhereComboBox->currentText(), *iSelectedProfile, iCaListingModel, &hashOnDisplay, &(iCaOnDisplay.iSubject)) ; connect(posting_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; posting_dialog->show() ; // the dialog will delete self } } void FrontWidget::postNewClassifiedAd() { LOG_STR("postNewClassifiedAd") ; if ( iSelectedProfile ) { NewClassifiedAdDialog *posting_dialog = new NewClassifiedAdDialog(this, iController, iController->model().classifiedAdsModel().aboutComboBoxTexts().indexOf(ui.caAboutComboBox->currentText()), iController->model().classifiedAdsModel().regardingComboBoxTexts().indexOf(ui.caRegardingCombobox->currentText()), iController->model().classifiedAdsModel().whereComboBoxTexts().indexOf(ui.caWhereComboBox->currentText()), ui.caAboutComboBox->currentText(), ui.caRegardingCombobox->currentText(), ui.caWhereComboBox->currentText(), *iSelectedProfile, iCaListingModel) ; connect(posting_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; posting_dialog->show() ; // the dialog will delete self } LOG_STR("postNewClassifiedAd out") ; } void FrontWidget::commentCaPosterProfile() { LOG_STR("commentCaPosterProfile"); Profile* posterProfile (NULL); if ( iSelectedProfile && iCaOnDisplay.iSenderHash != KNullHash ) { if((posterProfile = iController->model().profileModel().profileByFingerPrint(iCaOnDisplay.iSenderHash) ) == NULL ) { QMessageBox::about(this,tr("Profile not in database"), tr("Try viewing profile first to obtain data")); } else { NewProfileCommentDialog *posting_dialog = new NewProfileCommentDialog(this, iController, iCaOnDisplay.iSenderHash.toString(), iCaOnDisplay.iSubject, *iSelectedProfile, iViewedProfileCommentListingModel, KNullHash, KNullHash, ( posterProfile->iNodeOfProfile == NULL ? KNullHash : posterProfile->iNodeOfProfile->nodeFingerPrint() ) ) ; connect(posting_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; posting_dialog->show() ; // the dialog will delete self delete posterProfile ; } } } void FrontWidget::viewCaPosterProfile() { LOG_STR("viewCaPosterProfile"); if ( iCaOnDisplay.iSenderHash != KNullHash ) { iController->userInterfaceAction(MController::ViewProfileDetails, iCaOnDisplay.iSenderHash ) ; } } void FrontWidget::viewCaAttachments() { LOG_STR("viewCaAttachments"); if ( iCaOnDisplay.iFingerPrint != KNullHash && iCaOnDisplay.iSenderHash != KNullHash && iCaOnDisplay.iAttachedFiles.count() > 0 ) { AttachmentListDialog *listing_dialog = new AttachmentListDialog(this, iController, *iSelectedProfile, iCaOnDisplay.iAttachedFiles, AttachmentListDialog::tryFindNodeByProfile(iCaOnDisplay.iSenderHash, *iController)) ; connect(listing_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; connect (this, SIGNAL(displayedCaChanged()), listing_dialog, SLOT(reject())) ; listing_dialog->show() ; // the dialog will delete self } } void FrontWidget::viewPrivMsgAttachments() { LOG_STR("viewPrivMsgAttachments"); if ( iPrivMsgOnDisplay.iFingerPrint != KNullHash && iPrivMsgOnDisplay.iSenderHash != KNullHash && iPrivMsgOnDisplay.iAttachedFiles.count() > 0 ) { Hash nodeOfMessageSender ; if ( iPrivMsgOnDisplay.iNodeOfSender ) { nodeOfMessageSender = iPrivMsgOnDisplay.iNodeOfSender->nodeFingerPrint(); } AttachmentListDialog *listing_dialog = new AttachmentListDialog(this, iController, *iSelectedProfile, iPrivMsgOnDisplay.iAttachedFiles, nodeOfMessageSender) ; connect(listing_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; connect (this, SIGNAL(displayedPrivMsgChanged()), listing_dialog, SLOT(reject())) ; listing_dialog->show() ; // the dialog will delete self } } void FrontWidget::replyToPrivMsgButtonClicked() { LOG_STR("replyToPrivMsgButtonClicked"); /* * before continuing check this: we have the msg but * it is possible that msg poster pubkey has already * been expired in db as they're kept in separate * tables -> check that key is in place before * continuing or message encryption will fail */ quint32 dummy ; QByteArray dummyKey ; if ( iController->model().contentEncryptionModel().PublicKey(iPrivMsgOnDisplay.iSenderHash, dummyKey, &dummy) == false ) { // key not found, insert first: QLOG_STR("msg sender key not in db, inserting first. " + iPrivMsgOnDisplay.iSenderHash.toString()) ; iController->model().contentEncryptionModel().insertOrUpdatePublicKey (iPrivMsgOnDisplay.iProfileKey, iPrivMsgOnDisplay.iSenderHash, &iPrivMsgOnDisplay.iSenderName ) ; } if ( iPrivMsgOnDisplay.iSenderHash != KNullHash ) { NewPrivMessageDialog *posting_dialog = new NewPrivMessageDialog(this, iController, iSelectedProfile->iFingerPrint == iPrivMsgOnDisplay.iSenderHash ? iPrivMsgOnDisplay.iRecipient.toString() : iPrivMsgOnDisplay.iSenderHash.toString(), iPrivMsgOnDisplay.iSubject, *iSelectedProfile, iPrivMsgSearchModel, iPrivMsgOnDisplay.iFingerPrint, KNullHash, KNullHash) ; connect(posting_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; posting_dialog->show() ; // the dialog will delete self } } void FrontWidget::commentPrivMsgPosterProfile() { LOG_STR("commentPrivMsgPosterProfile"); if ( iPrivMsgOnDisplay.iSenderHash != KNullHash ) { Profile* posterProfile (NULL); if ( iSelectedProfile && iPrivMsgOnDisplay.iSenderHash != KNullHash ) { if((posterProfile = iController->model().profileModel().profileByFingerPrint(iPrivMsgOnDisplay.iSenderHash) ) == NULL ) { QMessageBox::about(this,tr("Profile not in database"), tr("Try viewing profile first to obtain data")); } else { NewProfileCommentDialog *posting_dialog = new NewProfileCommentDialog(this, iController, iPrivMsgOnDisplay.iSenderHash.toString(), iPrivMsgOnDisplay.iSubject, *iSelectedProfile, iViewedProfileCommentListingModel, KNullHash, KNullHash, ( posterProfile->iNodeOfProfile == NULL ? KNullHash : posterProfile->iNodeOfProfile->nodeFingerPrint() ) ) ; connect(posting_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; posting_dialog->show() ; // the dialog will delete self delete posterProfile ; } } } } void FrontWidget::viewPrivMsgPosterProfile() { LOG_STR("viewPrivMsgPosterProfile"); if ( iPrivMsgOnDisplay.iSenderHash != KNullHash ) { if ( iPrivMsgOnDisplay.iSenderHash == iController->profileInUse() ) { iController->userInterfaceAction(MController::ViewProfileDetails, iPrivMsgOnDisplay.iRecipient ) ; } else { iController->userInterfaceAction(MController::ViewProfileDetails, iPrivMsgOnDisplay.iSenderHash ) ; } } } void FrontWidget::postNewPrivateMessage() { NewPrivMessageDialog *posting_dialog = new NewPrivMessageDialog(this, iController, "", "", *iSelectedProfile, iPrivMsgSearchModel) ; connect(posting_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; posting_dialog->show() ; // the dialog will delete self } void FrontWidget::isPrivateSettingChanged(int aState) { LOG_STR2("isPrivateSettingChanged() %d ", aState) ; if ( iSelectedProfile ) { if ( aState == Qt::Unchecked ) { // public profile iSelectedProfile->iIsPrivate = false ; } else { iSelectedProfile->iIsPrivate = true ; // add self to readers if ( ! ( iSelectedProfile->iProfileReaders.contains(iSelectedProfile->iFingerPrint ) ) ) { iSelectedProfile->iProfileReaders.append ( iSelectedProfile->iFingerPrint ) ; } } if ( iSelectedProfile->iIsPrivate ) { ui.profileReadersButton->setEnabled(true) ; } else { ui.profileReadersButton->setEnabled(false) ; } ui.publisChangesButton->setEnabled(true) ; ui.revertChangesButton->setEnabled(true) ; } } void FrontWidget::userProfileSelected(const Hash& aProfile) { QLOG_STR("userProfileSelected " + aProfile.toString()) ; iController->model().lock() ; if ( iSelectedProfile != NULL ) { delete iSelectedProfile ; iSelectedProfile = NULL ; setUpSelectedProfileFileListingModel() ; } if ( ( iSelectedProfile = iController->model().profileModel().profileByFingerPrint(aProfile) ) == NULL ) { iSelectedProfile = new Profile(aProfile) ; } if ( iSelectedProfile ) { iController->model().profileModel().setTimeLastReference(iSelectedProfile->iFingerPrint, QDateTime::currentDateTimeUtc().toTime_t()) ; } if ( iSelectedProfile ) { iPrivMsgSearchModel.setSearchHash(iSelectedProfile->iFingerPrint) ; } iController->model().unlock() ; ui.privateMessageListView->resizeColumnToContents(2) ; iPrivMsgText.setHtml("") ; iPrivMsgSubjectField.setText("") ; iPrivMsgFromField.setText("") ; updateUiFromSelectedProfile() ; iContactsModel.clearContents() ; iController->reStorePrivateDataOfSelectedProfile() ; ui.contactsView->resizeColumnToContents(0) ; ui.contactsView->setColumnWidth(2,30) ; LOG_STR("userProfileSelected out") ; } void FrontWidget::fileToBeSharedAdded() { LOG_STR("fileToBeSharedAdded") ; if ( iSelectedProfile ) { bool isCompressed ( false ) ; QString fileName = QFileDialog::getOpenFileName(this, tr("Select file to be published"), "", tr("Files (*.*)")); if ( fileName.length() > 0 ) { QFile f ( fileName ) ; if ( f.open(QIODevice::ReadOnly) ) { if ( f.size() > ( KMaxProtocolItemSize * 10 ) ) { emit error ( MController::FileOperationError, tr("File way too big")) ; } else { QByteArray content ( f.read(f.size() ) ) ; QByteArray compressedContent ( qCompress(content) ) ; LOG_STR2("Size of content = %d", (int) (content.size())) ; LOG_STR2("Size of compressed = %d", (int) (compressedContent.size())) ; if (content.size() > (qint64)(( KMaxProtocolItemSize - ( 50*1024 ) )) && compressedContent.size() > (qint64)(( KMaxProtocolItemSize - ( 50*1024 ) )) ) { emit error ( MController::FileOperationError, tr("File too big")) ; } else { if ( compressedContent.size() < content.size () ) { content.clear() ; content.append(compressedContent) ; compressedContent.clear() ; isCompressed = true ; } else { compressedContent.clear() ; } // ok, here we have content in content and it is // either compressed or not. size is checked. MetadataQueryDialog::MetadataResultSet metadata ; metadata.iFileName = fileName ; MetadataQueryDialog metadataDialog(this, *iController, metadata ) ; if ( metadataDialog.exec() == QDialog::Accepted ) { QString description ; // TODO: query user QString mimetype ; iController->model().lock() ; Hash fileFingerPrint ( iController->model().binaryFileModel().publishBinaryFile(*iSelectedProfile, QFileInfo(f).fileName(), metadata.iDescription, metadata.iMimeType, metadata.iOwner, metadata.iLicense, content, isCompressed) ) ; if ( fileFingerPrint != KNullHash ) { if ( ! iSelectedProfile->iSharedFiles.contains(fileFingerPrint ) ) { // addFile will also modify iSelectedProfile->iSharedFiles iSelectedProfileFileListingModel->addFile(fileFingerPrint) ; iSelectedProfile->iTimeOfPublish = QDateTime::currentDateTimeUtc().toTime_t() ; iController->model().profileModel().publishProfile(*iSelectedProfile) ; } } iController->model().unlock() ; } } } } else { emit error ( MController::FileOperationError, tr("File open error")) ; } } } } void FrontWidget::fileToBeSharedRemoved() { LOG_STR("fileToBeSharedRemoved") ; // ok, see what user had selected ; one file only: iController->model().lock() ; if ( iSelectedProfileFileListingModel ) { Hash fingerPrint ; foreach(const QModelIndex &index, ui.sharedFilesView->selectionModel()->selectedIndexes()) { fingerPrint.fromString((const unsigned char *)(qPrintable(iSelectedProfileFileListingModel->data(index,Qt::ToolTipRole).toString()))); break ; } if ( fingerPrint != KNullHash ) { if ( iSelectedProfile->iSharedFiles.contains(fingerPrint) ) { // addFile will also modify iSelectedProfile->iSharedFiles iSelectedProfileFileListingModel->removeFile(fingerPrint) ; iSelectedProfile->iTimeOfPublish = QDateTime::currentDateTimeUtc().toTime_t() ; iController->model().profileModel().publishProfile(*iSelectedProfile); } } } iController->model().unlock() ; } void FrontWidget::ownBinaryFileSelectionChangedSlot(const QModelIndex &aItem, const QModelIndex &/*aPreviousItem*/) { iSelectedOwnBinaryFile = KNullHash ; iController->model().lock() ; iSelectedOwnBinaryFile.fromString((const unsigned char *)(qPrintable(iSelectedProfileFileListingModel->data(aItem,Qt::ToolTipRole).toString()))); iController->model().unlock() ; QLOG_STR("FrontWidget::ownBinaryFileSelectionChangedSlot fp " + iSelectedOwnBinaryFile.toString()) ; updateFileSelectionActions(); } void FrontWidget::viewedBinaryFileSelectionChangedSlot(const QModelIndex &aItem, const QModelIndex &/*aPreviousItem*/) { iSelectedViewedProfileBinaryfile = KNullHash ; iController->model().lock() ; iSelectedViewedProfileBinaryfile.fromString((const unsigned char *)(qPrintable( iViewedProfileFileListingModel->data(aItem,Qt::ToolTipRole).toString()))); iController->model().unlock() ; QLOG_STR("FrontWidget::viewedBinaryFileSelectionChangedSlot fp " + iSelectedViewedProfileBinaryfile.toString()) ; updateFileSelectionActions(); } void FrontWidget::exportSharedFile() { LOG_STR("exportSharedFile") ; // ok, see what user had selected ; one file only: if ( iSelectedProfileFileListingModel ) { Hash fingerPrint ; if ( ui.tabWidget->currentIndex() == 1 ) { // 1 == "my profile" so this is export of my own file fingerPrint = iSelectedOwnBinaryFile ; } else { if ( iViewedProfileFileListingModel ) { fingerPrint = iSelectedViewedProfileBinaryfile ; } } if ( fingerPrint != KNullHash ) { // aye, found a selected fingerprint; openBinaryFile(fingerPrint,true) ; } } } void FrontWidget::viewSharedFileInfo() { LOG_STR("viewSharedFileInfo") ; // ok, see what user had selected ; one file only: if ( iSelectedProfileFileListingModel ) { Hash fingerPrint ; if ( ui.tabWidget->currentIndex() == 1 ) { // 1 == "my profile" so this is export of my own file fingerPrint = iSelectedOwnBinaryFile ; } else { if ( iViewedProfileFileListingModel ) { fingerPrint = iSelectedViewedProfileBinaryfile ; } } if ( fingerPrint != KNullHash ) { // aye, found a selected fingerprint; doShowFileMetadata(fingerPrint) ; } } } void FrontWidget::copySharedFileHash() { QLOG_STR("FrontWidget::copySharedFileHash") ; // ok, see what user had selected ; one file only: if ( iSelectedProfileFileListingModel ) { Hash fingerPrint ; if ( ui.tabWidget->currentIndex() == 1 ) { // 1 == "my profile" so this is export of my own file fingerPrint = iSelectedOwnBinaryFile ; } else { if ( iViewedProfileFileListingModel ) { fingerPrint = iSelectedViewedProfileBinaryfile ; } } if ( fingerPrint != KNullHash ) { // aye, found a selected fingerprint; QClipboard *clipBoard = QApplication::clipboard(); clipBoard->setText ( fingerPrint.toString(), QClipboard::Clipboard ) ; if ( clipBoard->supportsSelection() ) { clipBoard->setText ( fingerPrint.toString(), QClipboard::Selection ) ; } } } } void FrontWidget::updateFileSelectionActions() { // first check if we have open "own profile" tab or // viewed profile tab QWidget* currentTabOnDisplay ( ui.tabWidget->currentWidget() ) ; if ( currentTabOnDisplay && currentTabOnDisplay->objectName() == internalNameOfProfileTab ) { QLOG_STR("updateFileSelectionActions viewed profile tab") ; // viewed profile. it has 2 actions, "save" and "copy hash to // clipboard" so lets handle those 2 only if ( iSelectedViewedProfileBinaryfile == KNullHash ) { // no file selected so lets disable the actions QLOG_STR("updateFileSelectionActions viewed profile tab disable") ; iCopySharedFileHashAction -> setEnabled(false) ; iExportSharedFileAction -> setEnabled(false) ; iViewSharedFileInfoAction -> setEnabled(false) ; } else { // file selected so lets enable the actions QLOG_STR("updateFileSelectionActions viewed profile tab enable") ; iCopySharedFileHashAction -> setEnabled(true) ; iExportSharedFileAction -> setEnabled(true) ; iViewSharedFileInfoAction -> setEnabled(true) ; } } else if ( ui.tabWidget->currentIndex() == 1 ) { // own profile if ( iSelectedOwnBinaryFile == KNullHash ) { // no file selected so lets disable the actions QLOG_STR("updateFileSelectionActions own profile tab disable") ; iCopySharedFileHashAction -> setEnabled(false) ; iExportSharedFileAction -> setEnabled(false) ; iRemoveSharedFileAction -> setEnabled(false) ; iViewSharedFileInfoAction-> setEnabled(false) ; } else { // file selected so lets enable the actions QLOG_STR("updateFileSelectionActions own profile tab enable") ; iCopySharedFileHashAction -> setEnabled(true) ; iExportSharedFileAction -> setEnabled(true) ; iRemoveSharedFileAction -> setEnabled(true) ; iViewSharedFileInfoAction -> setEnabled(true) ; } } else { // no profile tab so lets disable all QLOG_STR("updateFileSelectionActions other tab disable") ; iCopySharedFileHashAction -> setEnabled(false) ; iExportSharedFileAction -> setEnabled(false) ; iRemoveSharedFileAction -> setEnabled(false) ; iViewSharedFileInfoAction -> setEnabled(false) ; } } void FrontWidget::editNewSharedFile() { QLOG_STR("FrontWidget::editNewSharedFile") ; NewTextDocument *edit_dialog = new NewTextDocument(this, iController, *iSelectedProfile, *iSelectedProfileFileListingModel ) ; connect(edit_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; edit_dialog->show() ; // the dialog will delete self } void FrontWidget::openBinaryFile(const Hash& aFingerPrint, bool aUseViewedProfileNodeAsNetreqDest) { bool netRequestStarted(false) ; QByteArray fileData ; iController->model().lock() ; BinaryFile* metadata (iController->model().binaryFileModel().binaryFileByFingerPrint(aFingerPrint)); iController->model().unlock() ; // first check if we have // the file or just know the fingerprint. both are possible. if ( metadata == NULL ) { // got no file, ask it to be retrieved: NetworkRequestExecutor::NetworkRequestQueueItem req ; req.iRequestType = RequestForBinaryBlob ; req.iRequestedItem = aFingerPrint ; req.iState = NetworkRequestExecutor::NewRequest ; req.iMaxNumberOfItems = 1 ; // if the file was shared by some other operator, // ask node of that operator first if ( ui.tabWidget->currentIndex() != 1 ) { // was not our own profile if ( iViewedProfile && iViewedProfile->iNodeOfProfile && aUseViewedProfileNodeAsNetreqDest ) { req.iDestinationNode = iViewedProfile->iNodeOfProfile->nodeFingerPrint(); } } iController->startRetrievingContent(req,true,BinaryBlob) ; netRequestStarted = true ; } else { QByteArray fileSignature ; Hash fileOwnerFingerPrint ; fileOwnerFingerPrint.fromString((const unsigned char *)(metadata->iOwner.toLatin1().constData())) ; bool dummy ; iController->model().lock() ; iController->model().binaryFileModel().setTimeLastReference(aFingerPrint, QDateTime::currentDateTimeUtc().toTime_t()) ; if ( !iController->model().binaryFileModel().binaryFileDataByFingerPrint(aFingerPrint, fileOwnerFingerPrint, fileData, fileSignature, &dummy) ) { LOG_STR("Got no file?") ; } iController->model().unlock() ; } if ( fileData.size() > 0 && metadata ) { QString suffix ( tr("files")+" (*.*)" ) ; if ( ( metadata->iFileName != NULL ) && ( metadata->iFileName.length() > 0 ) ) { int periodPosition = metadata->iFileName.lastIndexOf(".") ; if ( periodPosition > 0 ) { QString filenameSuffix = metadata->iFileName.mid(periodPosition+1) ; suffix = filenameSuffix + " "+tr("files")+" (*."+filenameSuffix+")" ; } } bool saveToFile = true ; if ( metadata->iFileName.length()> 0 && ( suffix.toLower() == "tcl" || ( metadata->iMimeType.contains("/x-tcl" ) )) ) { QMessageBox::StandardButton reply; reply = QMessageBox::question(this, tr("Save location"), tr("Save to TCL app library instead of regular file?"), QMessageBox::Yes|QMessageBox::No); if (reply == QMessageBox::Yes) { saveToFile = false ; } } if ( saveToFile ) { QString fileName = QFileDialog::getSaveFileName(this, tr("Choose file name for saving"), metadata->iFileName, suffix); if ( fileName.length() > 0 ) { QFile f ( fileName ) ; if ( f.open(QIODevice::WriteOnly) ) { f.write(fileData) ; f.close() ; } else { QMessageBox::about(this,tr("Error"), tr("File open error")); } } } else { // do not save to file, save to TCL library: TclProgram p ; p.setProgramText(fileData) ; if ( metadata->iDescription.length() > 0 ) { p.setProgramName(metadata->iDescription) ; } else { p.setProgramName(metadata->iFileName) ; } p.iTimeOfPublish = metadata->iTimeOfPublish ; iController->model().lock() ; iController->model().tclModel().locallyStoreTclProgram(p) ; iController->model().unlock() ; } } delete metadata ; if ( netRequestStarted ) { iController->userInterfaceAction ( MController::DisplayProgressDialog, KNullHash , KNullHash ) ; } } void FrontWidget::updateUiFromSelectedProfile() { if ( iSelectedProfile ) { ui.profileAddressValue->setText(iSelectedProfile->iFingerPrint.toString()) ; if ( iWindowSizeAdjusted == false ) { ui.profileAddressValue->setMinimumWidth(ui.profileAddressValue->fontMetrics().width(iSelectedProfile->iFingerPrint.toString())); iParent.setMinimumWidth ( ui.profileAddressValue->fontMetrics().width(iSelectedProfile->iFingerPrint.toString()) + ui.imageButton->width() + ui.profileAddressValue->width() -55 ) ; iWindowSizeAdjusted = true ; } ui.profileNickNameEdit->setText(iSelectedProfile->iNickName) ; ui.greetingTextEdit->setText(iSelectedProfile->iGreetingText ) ; ui.firstNameEdit->setText(iSelectedProfile->iFirstName ) ; ui.familyNameEdit->setText(iSelectedProfile->iFamilyName ); ui.cityCountryEdit->setText(iSelectedProfile->iCityCountry ) ; ui.btcAddressEdit->setText(iSelectedProfile->iBTCAddress ) ; ui.stateOfTheWorldEdit->setText(iSelectedProfile->iStateOfTheWorld ) ; if ( iSelectedProfile->iTimeOfPublish ) { QDateTime d ; d.setTime_t(iSelectedProfile->iTimeOfPublish) ; ui.timeOfLastUpdateValue->setText(d.toString(Qt::SystemLocaleShortDate)) ; } else { ui.timeOfLastUpdateValue->setText("") ; } if ( iSelectedProfile->iIsPrivate ) { ui.profileReadersButton->setEnabled(true) ; ui.isPrivateCheckbox->setChecked(true) ; } else { ui.profileReadersButton->setEnabled(false) ; ui.isPrivateCheckbox->setChecked(false) ; } if ( !( iSelectedProfile->iProfilePicture.isNull()) ) { ui.imageButton->setIcon(QIcon(QPixmap::fromImage(iSelectedProfile->iProfilePicture))) ; ui.imageButton->setText(QString()) ; } else { ui.imageButton->setIcon(QIcon()) ; ui.imageButton->setText(tr("\n\n\nClick\nTo\nAdd\nImage\n")) ; } setUpSelectedProfileFileListingModel() ; ui.publisChangesButton->setEnabled(false) ; ui.revertChangesButton->setEnabled(false) ; } } void FrontWidget::showDetailsOfProfile(const Hash& aFingerPrint) { for ( int i = ui.tabWidget->count()-1 ; i >= 0 ; i-- ) { if ( ui.tabWidget->widget(i)->objectName() == internalNameOfProfileTab ) { ui.tabWidget->removeTab(i); break ; } } if ( iViewedProfile ) { delete iViewedProfile ; iViewedProfile = NULL ; iViewedProfileCommentListingModel.setSearchHash(KNullHash) ; // empty model } iController->model().lock() ; iViewedProfile = iController->model().profileModel().profileByFingerPrint(aFingerPrint) ; if ( iViewedProfile ) { iController->model().profileModel().setTimeLastReference(iViewedProfile->iFingerPrint, QDateTime::currentDateTimeUtc().toTime_t()) ; iController->offerDisplayNameForProfile(iViewedProfile->iFingerPrint, iViewedProfile->displayName(), true) ; } else { if ( iViewedProfileFileListingModel ) { iViewedProfileFileListingModel->clear() ; } // setting search hash to null will clear the model iViewedProfileCommentListingModel.setSearchHash(KNullHash) ; } iController->model().unlock() ; if ( iViewedProfile ) { iController-> sendProfileUpdateQuery(iViewedProfile->iFingerPrint, iViewedProfile->iNodeOfProfile == NULL ? KNullHash : iViewedProfile->iNodeOfProfile->nodeFingerPrint()) ; ui.tabWidget->insertTab(ui.tabWidget->count()+1,ui.profileViewTab, iViewedProfile->displayName()); ui.tabWidget->setCurrentWidget(ui.profileViewTab) ; ui.tabWidget->currentWidget()->setObjectName(internalNameOfProfileTab) ; updateUiFromViewedProfile() ; iController->model().lock() ; iController->model().profileModel().setTimeLastReference(iViewedProfile->iFingerPrint, QDateTime::currentDateTimeUtc().toTime_t()) ; iViewedProfileCommentListingModel.setSearchHash(iViewedProfile->iFingerPrint) ; // empty model iController->model().unlock() ; } else { ui.profileDetailsCommentButton->setEnabled(false) ; ui.profileDetailsSendMsgButton->setEnabled(false) ; } updateFileSelectionActions(); setVoiceCallButtonStatus() ; } void FrontWidget::showClassifiedAd(const CA& ca) { QLOG_STR("Show classified ad " + ca.iFingerPrint.toString() ) ; if ( ca.iFingerPrint != KNullHash && ui.tabWidget ) { ui.tabWidget->setCurrentIndex(0) ; // 0 is the ca tab if ( ca.iAboutComboBoxIndex >= 0 ) { ui.caAboutComboBox->setCurrentIndex(ca.iAboutComboBoxIndex) ; } else { ui.caAboutComboBox->setEditText(ca.iAboutComboBoxText) ; } if ( ca.iConcernsComboBoxIndex >= 0 ) { ui.caRegardingCombobox->setCurrentIndex(ca.iConcernsComboBoxIndex) ; } else { ui.caRegardingCombobox->setEditText(ca.iConcernsComboBoxText) ; } if ( ca.iInComboBoxIndex >= 0 ) { ui.caWhereComboBox->setCurrentIndex(ca.iInComboBoxIndex) ; } else { ui.caWhereComboBox->setEditText(ca.iInComboBoxText) ; } Hash groupFingerPrint ; groupFingerPrint.calculate(ca.iGroup.toUtf8().constData()) ; iCaListingModel.setClassification(groupFingerPrint) ; // then perform (perfectly linear?) search ; no hopping or jumping at all: QModelIndexList matchingArticles = iCaListingModel.theCaModel()->match (iCaListingModel.theCaModel()->index(0,0) , Qt::UserRole, ca.iFingerPrint.toQVariant(), 2, Qt::MatchRecursive|Qt::MatchExactly ) ; if ( matchingArticles.size() > 0 ) { ui.caHeadersView->selectionModel()->select(matchingArticles[0],QItemSelectionModel::Select) ; ui.caHeadersView->scrollTo(matchingArticles[0]) ; emit displayedCaChanged() ; ui.caAboutComboBox->setEnabled(true) ; ui.caHeadersView->setEnabled(true) ; } else { QMessageBox::about(this,tr("Error"), tr("Article not found from local storage")); } } } void FrontWidget::showSingleCommentOfProfile(const Hash aCommentFingerPrint) { if ( iSelectedProfile ) { activateProfileCommentDisplay(&iViewedProfileCommentListingModel, iController->model().profileCommentModel(), aCommentFingerPrint, iSelectedProfile->iFingerPrint ) ; } } void FrontWidget::updateUiFromViewedProfile() { if ( iViewedProfile ) { ui.profileDetailsCommentButton->setEnabled(true) ; ui.profileDetailsSendMsgButton->setEnabled(true) ; ui.profileDetailsNickNameValue->setText(iViewedProfile->iNickName) ; QString trustingProfileNickName ; Hash trustingProfileHash ; if ( iController->model().trustTreeModel()->isProfileTrusted(iViewedProfile->iFingerPrint, &trustingProfileNickName, &trustingProfileHash ) ) { ui.profileDetailsAddrValue->setToolTip(QString(tr("Trusted by %1\nSHA1 %2")).arg(trustingProfileNickName).arg(trustingProfileHash.toString())) ; QLOG_STR("Profile was trusted by " + trustingProfileNickName ) ; } else { ui.profileDetailsAddrValue->setToolTip(QString()) ; QLOG_STR("Profile was not trusted") ; } if ( isContactInContactList(iViewedProfile->iFingerPrint) ) { ui.profileDetailsAddrValue->setTextColor(QColor((Qt::blue))) ; LOG_STR("Profile was in contacts list, setting blue color") ; } else if ( trustingProfileHash != KNullHash ) { // was trusted by someone we trust: ui.profileDetailsAddrValue->setTextColor(QColor((Qt::darkBlue))) ; } else { // default color then: ui.profileDetailsAddrValue->setTextColor(QApplication::palette().text().color()) ; LOG_STR("Profile was not in contacts list, setting default color") ; } ui.profileDetailsAddrValue->setText(iViewedProfile->iFingerPrint.toString()) ; if ( iViewedProfile->iIsPrivate ) { ui.profileDetailsReadersButton->setEnabled(true) ; } else { ui.profileDetailsReadersButton->setEnabled(false) ; } ui.profileDetailsGreetingValue->setText(iViewedProfile->iGreetingText); ui.profileDetailsFirstNameValue->setText(iViewedProfile->iFirstName); ui.profileDetailsFamilyNameValue->setText(iViewedProfile->iFamilyName); ui.profileDetailsCityCountryValue->setText(iViewedProfile->iCityCountry); ui.profileDetailsBTCValue->setText(iViewedProfile->iBTCAddress); ui.profileDetailsStateOfTheWorldValue->setText(iViewedProfile->iStateOfTheWorld); QDateTime d ; d.setTime_t(iViewedProfile->iTimeOfPublish) ; ui.timeOfLastUpdateValue->setText(d.toString(Qt::SystemLocaleShortDate)) ; QString toolTipText ( tr("Time of last update ") + " " + d.toString(Qt::SystemLocaleShortDate) ) ; ui.profileDetailsNickNameValue->setToolTip(toolTipText) ; ui.profileDetailsGreetingValue->setToolTip(toolTipText) ; if ( !( iViewedProfile->iProfilePicture.isNull()) ) { ui.profileDetailsImage->setPixmap(QPixmap::fromImage(iViewedProfile->iProfilePicture)) ; ui.profileDetailsImage->setText(QString()) ; } else { ui.profileDetailsImage->setPixmap(QPixmap()) ; ui.profileDetailsImage->setText(tr("\n\n\n(No\nImage\nSelected)\n")) ; ui.profileDetailsImage->setAlignment(Qt::AlignCenter|Qt::AlignHCenter); } if ( iViewedProfileFileListingModel ) { delete iViewedProfileFileListingModel ; iViewedProfileFileListingModel = NULL ; ui.profileDetailsSharedFilesView->setModel(NULL) ; } iViewedProfileFileListingModel = new BinaryFileListingModel(iViewedProfile->iSharedFiles,iController->model()) ; connect(iViewedProfileFileListingModel, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection) ; ui.profileDetailsSharedFilesView->setModel(iViewedProfileFileListingModel) ; iSelectedViewedProfileBinaryfile = KNullHash ; assert( connect(ui.profileDetailsSharedFilesView->selectionModel(), SIGNAL(currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT(viewedBinaryFileSelectionChangedSlot(const QModelIndex &, const QModelIndex &)))); } updateFileSelectionActions() ; } void FrontWidget::setUpSelectedProfileFileListingModel() { // always start by getting rid of possible previous instance: if ( iSelectedProfileFileListingModel ) { ui.sharedFilesView->setModel(NULL) ; delete iSelectedProfileFileListingModel ; iSelectedProfileFileListingModel = NULL ; } iSelectedOwnBinaryFile = KNullHash ; //, if we have profile selected, set up model again if ( iSelectedProfile ) { iSelectedProfileFileListingModel = new BinaryFileListingModel(iSelectedProfile->iSharedFiles,iController->model()) ; connect(iSelectedProfileFileListingModel, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection) ; ui.sharedFilesView->setModel(iSelectedProfileFileListingModel) ; connect(ui.sharedFilesView->selectionModel(), SIGNAL(currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT(ownBinaryFileSelectionChangedSlot(const QModelIndex &, const QModelIndex &))); } } void FrontWidget::setupContactsTab() { ui.contactsView->setModel(&iContactsModel) ; connect(ui.contactsView->selectionModel(), SIGNAL(selectionChanged (const QItemSelection &, const QItemSelection &)), this, SLOT(contactsSelectionChangedSlot(const QItemSelection &, const QItemSelection &))); connect(&iContactsModel, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection) ; ui.removeContactBtn->setEnabled(false) ; ui.viewProfileBtn->setEnabled(false) ; ui.sendMessageBtn->setEnabled(false) ; connect(ui.addContactBtn, SIGNAL(clicked()), this, SLOT(addContactButtonClicked() )) ; connect(ui.removeContactBtn, SIGNAL(clicked()), this, SLOT(removeContactButtonClicked() )) ; connect(ui.viewProfileBtn, SIGNAL(clicked()), this, SLOT(viewContactProfileButtonClicked() )) ; connect(ui.sendMessageBtn, SIGNAL(clicked()), this, SLOT(sendMsgToContactButtonClicked() )) ; connect(ui.addToContactsBtn, // this button is in "view contact" tab SIGNAL(clicked()), this, SLOT(addContactFromContactViewButtonClicked())) ; iEditContactAction = new QAction(tr("Edit contact.."),this) ; connect(iEditContactAction, SIGNAL(triggered()), this, SLOT(editContactActionSelected())) ; ui.contactsView->setContextMenuPolicy(Qt::ActionsContextMenu); ui.contactsView->addAction(iEditContactAction) ; } void FrontWidget::setupClassifiedAdsTab() { // note that later the index of the combobox must match // the enum. this has things to do with "insert policy" of // the combobox. fillCaSelectionCombobox(*ui.caAboutComboBox,true,*iController) ; ui.caAboutComboBox->setEditable(true) ; ui.caAboutComboBox->setInsertPolicy(QComboBox::InsertAtBottom) ; connect(ui.caAboutComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(caTabAboutComboChanged(int))) ; fillCaSelectionCombobox(*ui.caRegardingCombobox,false,*iController) ; ui.caRegardingCombobox->setEditable(true) ; ui.caRegardingCombobox->setInsertPolicy(QComboBox::InsertAtBottom) ; connect(ui.caRegardingCombobox, SIGNAL(currentIndexChanged(int)), this, SLOT(caTabConcernsComboChanged(int))) ; ui.caWhereComboBox->addItems(iController->model().classifiedAdsModel().whereComboBoxTexts()) ; ui.caWhereComboBox->setEditable(true) ; ui.caWhereComboBox->setInsertPolicy(QComboBox::InsertAtBottom) ; connect(ui.caWhereComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(caTabWhereComboChanged(int))) ; // for the bottom-screen buttonbox we need only custom buttons: ui.CATabBottomButtonBox->clear() ; iReplyToCaButton = new QPushButton(tr("&Reply to sender")); iReplyToCaToForumButton = new QPushButton(tr("Reply to &forum")); iNewCaButton = new QPushButton(tr("&Post new ad")); iCommentCaPosterButton= new QPushButton(tr("&Public comment")); iViewCaPosterProfileButton= new QPushButton(tr("&View profile")); iViewCaAttachmentsButton = new QPushButton(tr("Attachments..")); connect(iReplyToCaButton, SIGNAL(clicked()), this, SLOT(replyToCaButtonClicked())) ; connect(iReplyToCaToForumButton, SIGNAL(clicked()), this, SLOT(replyToCaToForumButtonClicked())) ; connect(iNewCaButton, SIGNAL(clicked()), this, SLOT(postNewClassifiedAd())) ; connect(iCommentCaPosterButton, SIGNAL(clicked()), this, SLOT(commentCaPosterProfile())) ; connect(iViewCaPosterProfileButton, SIGNAL(clicked()), this, SLOT( viewCaPosterProfile() )) ; connect(iViewCaAttachmentsButton, SIGNAL(clicked()), this, SLOT( viewCaAttachments() )) ; ui.CATabBottomButtonBox->addButton(iReplyToCaButton, QDialogButtonBox::ActionRole); ui.CATabBottomButtonBox->addButton(iReplyToCaToForumButton, QDialogButtonBox::ActionRole); ui.CATabBottomButtonBox->addButton(iNewCaButton, QDialogButtonBox::ActionRole); ui.CATabBottomButtonBox->addButton(iCommentCaPosterButton, QDialogButtonBox::ActionRole); ui.CATabBottomButtonBox->addButton(iViewCaPosterProfileButton, QDialogButtonBox::ActionRole); ui.CATabBottomButtonBox->addButton(iViewCaAttachmentsButton, QDialogButtonBox::ActionRole); iReplyToCaButton->setEnabled(false) ; iReplyToCaToForumButton->setEnabled(false) ; iCommentCaPosterButton->setEnabled(false) ; iViewCaPosterProfileButton->setEnabled(false) ; iViewCaAttachmentsButton->setEnabled(false) ; ui.caHeadersView->setModel(iCaListingModel.theCaModel()) ; connect(ui.caHeadersView->selectionModel(), SIGNAL(selectionChanged (const QItemSelection &, const QItemSelection &)), this, SLOT(CAselectionChangedSlot(const QItemSelection &, const QItemSelection &))); iCaScene.addItem(&iFromField); iCaScene.addItem(&iSubjectField ) ; iSubjectField.setPos(0,0) ; iSubjectField.setPen(QPen(QColor((QApplication::palette().text().color())))) ; iFromField.setPos(0,20) ; iCaScene.addItem(&iCaText) ; iCaText.setPos(iArticleTopLeft) ; ui.caMessageView->setScene(& iCaScene ) ; iCaScene.invalidate(0,0,100,100) ; ui.caMessageView->horizontalScrollBar()->setSliderPosition(0) ; ui.caMessageView->horizontalScrollBar()->setValue(0) ; // ui.caMessageView->centerOn(0,0) ; // have context-menu for "ca listing" view iAddToContactsFromCaList = new QAction(tr("Add selected operator to contacts.."),this) ; ui.caHeadersView->setContextMenuPolicy(Qt::ActionsContextMenu); ui.caHeadersView->addAction(iAddToContactsFromCaList) ; connect(iAddToContactsFromCaList, SIGNAL(triggered()), this, SLOT(addCaSenderToContacts())) ; iCaText.setTextInteractionFlags(Qt::TextBrowserInteraction) ; assert( connect ( &iCaText, SIGNAL(linkActivated ( const QString & )), this, SLOT(linkActivated ( const QString & )))) ; } void FrontWidget::setCaDocumentSize() { QRect messageViewSizeRect ( ui.caMessageView->rect() ) ; messageViewSizeRect.setHeight( messageViewSizeRect.height() - 10 ) ; messageViewSizeRect.setWidth( messageViewSizeRect.width() - 10 ) ; iCaScene.setSceneRect(messageViewSizeRect) ; iCaText.setTextWidth(ui.caMessageView->rect().width()-10); const QSizeF documentSize ( iCaText.document()->size() ) ; const QSizeF subjectSize ( iSubjectField.boundingRect().size() ) ; if ( documentSize.height() > (messageViewSizeRect.height()-(subjectSize.height()*2))) { // for long articles we need to adjust scene size so that all // text fits. messageViewSizeRect.setHeight(documentSize.height()+(subjectSize.height()*2)); iCaScene.setSceneRect(messageViewSizeRect) ; } } void FrontWidget::setPrivMsgSize() { QRect messageViewSizeRect ( ui.privateMessageView->rect() ) ; messageViewSizeRect.setHeight( messageViewSizeRect.height() - 10 ) ; messageViewSizeRect.setWidth( messageViewSizeRect.width() - 10 ) ; iPrivMsgScene.setSceneRect(messageViewSizeRect) ; iPrivMsgText.setTextWidth(ui.caMessageView->rect().width()-10); const QSizeF documentSize ( iPrivMsgText.document()->size() ) ; const QSizeF subjectSize ( iSubjectField.boundingRect().size() ) ; if ( documentSize.height() > (messageViewSizeRect.height()-(subjectSize.height()*2))) { // for long articles we need to adjust scene size so that all // text fits. messageViewSizeRect.setHeight(documentSize.height()+(subjectSize.height()*2)); iPrivMsgScene.setSceneRect(messageViewSizeRect) ; } } void FrontWidget::setupPrivateMessagesTab() { ui.privateMessageListView->setModel(&iPrivMsgSearchModel) ; connect(ui.privateMessageListView->selectionModel(), SIGNAL(selectionChanged (const QItemSelection &, const QItemSelection &)), this, SLOT(privMsgselectionChangedSlot(const QItemSelection &, const QItemSelection &))); connect(&iPrivMsgSearchModel, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; iPrivMsgScene.addItem( & iPrivMsgFromField); iPrivMsgScene.addItem( & iPrivMsgSubjectField ) ; iPrivMsgSubjectField.setPos(0,0) ; iPrivMsgFromField.setPos(0,20) ; iPrivMsgScene.addItem( & iPrivMsgText ) ; iPrivMsgText.setPos(iPrivMsgTopLeft) ; ui.privateMessageView->setScene(& iPrivMsgScene ) ; iPrivMsgScene.invalidate(0,0,100,100) ; ui.privateMessageView->horizontalScrollBar()->setSliderPosition(0) ; ui.privateMessageView->horizontalScrollBar()->setValue(0) ; ui.privateMessageView->centerOn(0,0) ; ui.privateMsgsButtons->clear() ; iReplyToPrivMsgButton = new QPushButton(tr("&Reply")); iNewPrivMsgButton = new QPushButton(tr("&New message")); iCommentPrivMsgPosterButton= new QPushButton(tr("&Send public comment to sender")); iViewPrivMsgPosterProfileButton= new QPushButton(tr("&View profile of peer")); iViewPrivMsgAttachmentsButton = new QPushButton(tr("Attachments..")); connect(iReplyToPrivMsgButton, SIGNAL(clicked()), this, SLOT(replyToPrivMsgButtonClicked())) ; connect(iNewPrivMsgButton, SIGNAL(clicked()), this, SLOT(postNewPrivateMessage())) ; connect(iCommentPrivMsgPosterButton, SIGNAL(clicked()), this, SLOT(commentPrivMsgPosterProfile())) ; connect(iViewPrivMsgPosterProfileButton, SIGNAL(clicked()), this, SLOT( viewPrivMsgPosterProfile() )) ; connect(iViewPrivMsgAttachmentsButton, SIGNAL(clicked()), this, SLOT( viewPrivMsgAttachments() )) ; iReplyToPrivMsgButton->setEnabled(false) ; iCommentPrivMsgPosterButton->setEnabled(false) ; iViewPrivMsgPosterProfileButton->setEnabled(false) ; iViewPrivMsgAttachmentsButton->setEnabled(false) ; ui.privateMsgsButtons->addButton(iReplyToPrivMsgButton,QDialogButtonBox::ActionRole); ui.privateMsgsButtons->addButton(iNewPrivMsgButton,QDialogButtonBox::ActionRole); ui.privateMsgsButtons->addButton(iCommentPrivMsgPosterButton,QDialogButtonBox::ActionRole); ui.privateMsgsButtons->addButton(iViewPrivMsgPosterProfileButton,QDialogButtonBox::ActionRole); ui.privateMsgsButtons->addButton(iViewPrivMsgAttachmentsButton,QDialogButtonBox::ActionRole); // have context-menu for "message listing" view iAddToContactsFromMsgList = new QAction(tr("Add selected to contacts.."),this) ; ui.privateMessageListView->setContextMenuPolicy(Qt::ActionsContextMenu); ui.privateMessageListView->addAction(iAddToContactsFromMsgList) ; connect(iAddToContactsFromMsgList, SIGNAL(triggered()), this, SLOT(addMessageSenderToContacts())) ; iPrivMsgText.setTextInteractionFlags(Qt::TextBrowserInteraction) ; assert( connect ( &iPrivMsgText, SIGNAL(linkActivated ( const QString & )), this, SLOT(linkActivated ( const QString & )))) ; } void FrontWidget::fillCaSelectionCombobox(QComboBox& aComboBox, bool isAboutComboBox, MController& aController) { if ( isAboutComboBox ) { aComboBox.addItems(aController.model().classifiedAdsModel().aboutComboBoxTexts()) ; } else { aComboBox.addItems(aController.model().classifiedAdsModel().regardingComboBoxTexts()) ; } } QString FrontWidget::selectedClassification(const QComboBox& aAboutCombo, const QComboBox& aRegardingCombo, const QComboBox& aWhereCombo, const MController& aController) { QString retval ; // check out if pre-defined string from combobox or // something that user wrote himself to combobox. // it seems like digging that information from combobox itself // is difficult to do .. user would need to hit enter // to set the indexes correctly and she won't if ( aController.model().classifiedAdsModel().aboutComboBoxTexts().indexOf(aAboutCombo.currentText()) != -1 ) { retval = aController.model().classifiedAdsModel().purposeOfAdString((ClassifiedAdsModel::PurposeOfAd)aController.model().classifiedAdsModel().aboutComboBoxTexts().indexOf(aAboutCombo.currentText())) ; } else { retval = aAboutCombo.currentText() ; } retval.append(".") ; if ( aController.model().classifiedAdsModel().regardingComboBoxTexts().indexOf( aRegardingCombo.currentText()) != -1 ) { retval.append( aController.model().classifiedAdsModel().concernOfAdString((ClassifiedAdsModel::ConcernOfAd)aController.model().classifiedAdsModel().regardingComboBoxTexts().indexOf( aRegardingCombo.currentText()))) ; } else { retval.append( aRegardingCombo.currentText() ) ; } retval.append(".") ; if ( aController.model().classifiedAdsModel().whereComboBoxTexts().indexOf( aWhereCombo.currentText()) == 0 ) { // explanation: the country names in "where" are not localized. // except for the first entry, "Any country" and if we get that, // lets put un-localized "Any country" in there -> note that this // same string appears inside tr() in datamodel/camodel.cpp retval.append( "Any country" ) ; } else { // if not the "Any country", then just take the literal // string value, regardless of index retval.append( aWhereCombo.currentText() ) ; } return retval ; } void FrontWidget::selectClassification(QString aNameOfClassification) { Hash groupFingerPrint ; groupFingerPrint.calculate(aNameOfClassification.toUtf8()) ; iCaListingModel.setClassification(groupFingerPrint) ; // and, put a request pending to request for more articles // from this classification: NetworkRequestExecutor::NetworkRequestQueueItem req ; req.iRequestType = RequestAdsClassified ; req.iRequestedItem = groupFingerPrint ; req.iState = NetworkRequestExecutor::NewRequest ; req.iMaxNumberOfItems = 1 ; req.iTimeStampOfItem = QDateTime::currentDateTimeUtc().toTime_t() - ( 60 * 60* 24 * 140 ) ; // select 140 days req.iDestinationNode = KNullHash ; iController->model().lock() ; iController->model().addNetworkRequest(req) ; iController->model().unlock() ; } void FrontWidget::contactsSelectionChangedSlot(const QItemSelection &, const QItemSelection &) { LOG_STR("contactsSelectionChangedSlot") ; iSelectedContact = KNullHash ; foreach(const QModelIndex &index, ui.contactsView->selectionModel()->selectedIndexes()) { iSelectedContact.fromQVariant( iContactsModel.data(index,Qt::UserRole) ) ; break ; } LOG_STR2("Selected contact %s", qPrintable(iSelectedContact.toString())) ; if ( iSelectedContact== KNullHash ) { ui.removeContactBtn->setEnabled(false) ; ui.viewProfileBtn->setEnabled(false) ; ui.sendMessageBtn->setEnabled(false) ; } else { ui.removeContactBtn->setEnabled(true) ; ui.viewProfileBtn->setEnabled(true) ; ui.sendMessageBtn->setEnabled(true) ; } } void FrontWidget::ownProfileCommentselectionChangedSlot(const QItemSelection &, const QItemSelection &) { LOG_STR("ownProfileCommentselectionChangedSlot") ; foreach(const QModelIndex &index, ui.profileCommentsView->selectionModel()->selectedIndexes()) { iSelectedCommentFromOwnCommentListing.fromQVariant( iSelectedProfileCommentListingModel.data(index,Qt::UserRole) ) ; break ; } LOG_STR2("Selected comment for display %s", qPrintable(iSelectedCommentFromOwnCommentListing.toString())) ; } void FrontWidget::viewedProfileCommentselectionChangedSlot(const QItemSelection &, const QItemSelection &) { LOG_STR("viewedProfileCommentselectionChangedSlot") ; foreach(const QModelIndex &index, ui.profileDetailsCommentsView->selectionModel()->selectedIndexes()) { iSelectedCommentFromViewedCommentListing .fromQVariant( iViewedProfileCommentListingModel.data(index,Qt::UserRole) ) ; break ; } LOG_STR2("Selected viewed profile comment for display %s", qPrintable(iSelectedCommentFromViewedCommentListing .toString())) ; } void FrontWidget::viewedProfileCommentDoubleClicked(const QModelIndex &/*aSelection*/ ) { LOG_STR("viewedProfileCommentDoubleClicked") ; if ( iSelectedCommentFromViewedCommentListing != KNullHash && iViewedProfile ) { activateProfileCommentDisplay(&iViewedProfileCommentListingModel, iController->model().profileCommentModel(), iSelectedCommentFromViewedCommentListing, iViewedProfile->iFingerPrint) ; } } void FrontWidget::viewedProfileCommentKeyPressed( ) { LOG_STR("viewedProfileCommentKeyPressed") ; if ( iSelectedCommentFromViewedCommentListing != KNullHash && iSelectedProfile ) { activateProfileCommentDisplay(&iViewedProfileCommentListingModel, iController->model().profileCommentModel(), iSelectedCommentFromViewedCommentListing, iSelectedProfile->iFingerPrint ) ; } } void FrontWidget::ownProfileCommentDoubleClicked(const QModelIndex &/* aSelection */) { LOG_STR("ownProfileCommentDoubleClicked") ; if ( iSelectedCommentFromOwnCommentListing != KNullHash && iSelectedProfile ) { activateProfileCommentDisplay(&iSelectedProfileCommentListingModel, iController->model().profileCommentModel(), iSelectedCommentFromOwnCommentListing, iSelectedProfile->iFingerPrint) ; } } void FrontWidget::CAselectionChangedSlot(const QItemSelection &/*aSelection*/, const QItemSelection &) { LOG_STR("CAselectionChangedSlot") ; Hash hashToDisplay ; foreach(const QModelIndex &index, ui.caHeadersView->selectionModel()->selectedIndexes()) { hashToDisplay.fromQVariant( iCaListingModel.theCaModel()->data(index,Qt::UserRole) ) ; break ; } LOG_STR2("Display article %s", qPrintable(hashToDisplay.toString())) ; if ( hashToDisplay != KNullHash ) { iReplyToCaButton->setEnabled(true) ; iReplyToCaToForumButton->setEnabled(true) ; iCommentCaPosterButton->setEnabled(true) ; iViewCaPosterProfileButton->setEnabled(true) ; iController->model().lock() ; iCaOnDisplay = iController->model().classifiedAdsModel().caByHash(hashToDisplay) ; iController->model().classifiedAdsModel().setTimeLastReference(iCaOnDisplay.iFingerPrint, QDateTime::currentDateTimeUtc().toTime_t()) ; if ( iCaOnDisplay.iSenderHash != KNullHash ) { iController->offerDisplayNameForProfile(iCaOnDisplay.iSenderHash, iCaOnDisplay.iSenderName, true ) ; } iController->model().unlock() ; emit displayedCaChanged() ; iViewCaAttachmentsButton->setEnabled(iCaOnDisplay.iAttachedFiles.count() > 0) ; QString trustingProfileNickName ; Hash trustingProfileHash ; if ( iController->model().trustTreeModel()->isProfileTrusted(iCaOnDisplay.iSenderHash, &trustingProfileNickName, &trustingProfileHash ) ) { iFromField.setToolTip(QString(tr("Trusted by %1\nSHA1 %2")).arg(trustingProfileNickName).arg(trustingProfileHash.toString())) ; QLOG_STR("CA sender profile was trusted by " + trustingProfileNickName ) ; iFromField.setPen(QPen(QColor((Qt::blue)))) ; } else { iFromField.setToolTip(QString()) ; iFromField.setPen(QPen(QColor((QApplication::palette().text().color())))) ; QLOG_STR("CA sender profile was not trusted") ; } if ( iCaOnDisplay.iSenderName.length() > 0 ) { iFromField.setText(tr("From:") + " " + iCaOnDisplay.iSenderName ) ; } else { iFromField.setText(tr("From:") + " " + iController->displayableNameForProfile(iCaOnDisplay.iSenderHash) ) ; } iSubjectField.setText(tr("Subject:") + " " + iCaOnDisplay.iSubject ) ; iCaText.setHtml(iCaOnDisplay.iMessageText) ; setCaDocumentSize() ; ui.caMessageView->horizontalScrollBar()->setSliderPosition(0) ; ui.caMessageView->horizontalScrollBar()->setValue(0) ; ui.caMessageView->centerOn(0,0) ; } else { iCaText.setHtml("") ; iSubjectField.setText("") ; iFromField.setText("") ; iCaOnDisplay.iSenderHash = KNullHash ; iReplyToCaButton->setEnabled(false) ; iReplyToCaToForumButton->setEnabled(false) ; iCommentCaPosterButton->setEnabled(false) ; iViewCaPosterProfileButton->setEnabled(false) ; iViewCaAttachmentsButton->setEnabled(false) ; } ui.caHeadersView->resizeColumnToContents(0) ; #if QT_VERSION >= 0x050000 // qt5 ui.caHeadersView->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents); #else ui.caHeadersView->header()->setResizeMode(0, QHeaderView::ResizeToContents); #endif } void FrontWidget::privMsgselectionChangedSlot(const QItemSelection &, const QItemSelection &) { LOG_STR("privmsgselectionChangedSlot") ; iPrivMsgOnDisplay.iSenderHash = KNullHash ; Hash hashToDisplay ; foreach(const QModelIndex &index, ui.privateMessageListView->selectionModel()->selectedIndexes()) { hashToDisplay.fromQVariant( iPrivMsgSearchModel.data(index,Qt::UserRole) ) ; break ; } LOG_STR2("Display private message %s", qPrintable(hashToDisplay.toString())) ; iController->model().lock() ; PrivMessage* msg ( iController->model().privateMessageModel().messageByFingerPrint(hashToDisplay)) ; if ( msg ) { iPrivMsgOnDisplay = *msg ; delete msg ; iController->model().privateMessageModel().setAsRead(hashToDisplay, true); iController->model().privateMessageModel().setTimeLastReference(hashToDisplay, QDateTime::currentDateTimeUtc().toTime_t()) ; iPrivMsgSearchModel.setAsRead(hashToDisplay, true); if ( iPrivMsgOnDisplay.iSenderHash != KNullHash ) { iController->offerDisplayNameForProfile(iPrivMsgOnDisplay.iSenderHash, iPrivMsgOnDisplay.iSenderName, true ) ; } } iController->model().unlock() ; if ( iPrivMsgOnDisplay.iSenderHash != KNullHash ) { if (iSelectedProfile && iPrivMsgOnDisplay.iSenderHash == iSelectedProfile->iFingerPrint ) { iPrivMsgFromField.setText(tr("To:") + " " + iController->displayableNameForProfile(iPrivMsgOnDisplay.iRecipient) ) ; } else { if ( iPrivMsgOnDisplay.iSenderName.length() > 0 ) { iPrivMsgFromField.setText(tr("From:") + " " + iPrivMsgOnDisplay.iSenderName ) ; } else { iPrivMsgFromField.setText(tr("From:") + " " + iController->displayableNameForProfile(iPrivMsgOnDisplay.iSenderHash) ) ; } } iPrivMsgSubjectField.setText(tr("Subject:") + " " + iPrivMsgOnDisplay.iSubject ) ; iPrivMsgText.setHtml(iPrivMsgOnDisplay.iMessageText) ; ui.privateMessageView->horizontalScrollBar()->setSliderPosition(0) ; ui.privateMessageView->horizontalScrollBar()->setValue(0) ; iReplyToPrivMsgButton->setEnabled(true) ; iCommentPrivMsgPosterButton->setEnabled(true) ; iViewPrivMsgPosterProfileButton->setEnabled(true) ; } else { iPrivMsgText.setHtml("") ; iPrivMsgSubjectField.setText("") ; iPrivMsgFromField.setText("") ; iPrivMsgOnDisplay.iSenderHash = KNullHash ; iReplyToPrivMsgButton->setEnabled(false) ; iCommentPrivMsgPosterButton->setEnabled(false) ; iViewPrivMsgPosterProfileButton->setEnabled(false) ; } setPrivMsgSize() ; iViewPrivMsgAttachmentsButton->setEnabled(iPrivMsgOnDisplay.iSenderHash != KNullHash && iPrivMsgOnDisplay.iAttachedFiles.count() ) ; emit displayedPrivMsgChanged() ; } void FrontWidget::receiveNotifyOfContentReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfReceivdContent) { bool profileViewTabIsOpen(false) ; switch (aTypeOfReceivdContent) { case UserProfile: { if ( iViewedProfile && ( iViewedProfile->iFingerPrint == aHashOfContent ) ) { // ahem, we have this profile on display.. // do we have also the tab open: QWidget* currentTabOnDisplay ( ui.tabWidget->currentWidget() ) ; if ( currentTabOnDisplay && currentTabOnDisplay->objectName() == internalNameOfProfileTab ) { profileViewTabIsOpen = true ; } // ahem, re-display the profile if ( profileViewTabIsOpen ) { iController->userInterfaceAction(MController::ViewProfileDetails, aHashOfContent ) ; } else { // or just update the data: delete iViewedProfile ; iViewedProfile = NULL ; iController->model().lock() ; iViewedProfile = iController->model().profileModel().profileByFingerPrint( aHashOfContent ) ; if ( iViewedProfile ) { iController->model().profileModel().setTimeLastReference(iViewedProfile->iFingerPrint, QDateTime::currentDateTimeUtc().toTime_t()) ; } iController->model().unlock() ; if ( iViewedProfile ) { iController-> sendProfileUpdateQuery(iViewedProfile->iFingerPrint, iViewedProfile->iNodeOfProfile == NULL ? KNullHash : iViewedProfile->iNodeOfProfile->nodeFingerPrint()) ; } updateUiFromViewedProfile() ; } } } break ; default: break ; } ; } void FrontWidget::receiveNotifyOfContentReceived(const Hash& aHashOfContent, const Hash& aHashOfClassificationOrDestination, const ProtocolItemType aTypeOfReceivdContent) { switch (aTypeOfReceivdContent) { case ClassifiedAd: iCaListingModel.newCaReceived(aHashOfContent, aHashOfClassificationOrDestination) ; break ; case PrivateMessage: iPrivMsgSearchModel.newMsgReceived(aHashOfContent, aHashOfClassificationOrDestination) ; break ; case UserProfileComment: // listing models will internally check if the content was meant // for them so no conditioning here: QLOG_STR("Calling newCommentReceived for comment listing models with profile hash " + aHashOfClassificationOrDestination.toString() ) ; iSelectedProfileCommentListingModel.newCommentReceived(aHashOfContent, aHashOfClassificationOrDestination) ; iViewedProfileCommentListingModel.newCommentReceived(aHashOfContent, aHashOfClassificationOrDestination) ; break ; default: break ; } ; } void FrontWidget::addContactButtonClicked() { LOG_STR("addContactButtonClicked"); EditContactDialog *contact_dialog = new EditContactDialog(this, iController, KNullHash, "", false, iContactsModel) ; connect(contact_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; contact_dialog->show() ; // the dialog will delete self } void FrontWidget::editContactActionSelected() { LOG_STR("editContactActionSelected"); if ( iSelectedContact != KNullHash ) { EditContactDialog *contact_dialog = new EditContactDialog(this, iController, iSelectedContact, "", false, iContactsModel) ; connect(contact_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; contact_dialog->show() ; // the dialog will delete self } } void FrontWidget::removeContactButtonClicked() { if ( iSelectedContact != KNullHash && iSelectedProfile ) { iController->model().lock() ; iContactsModel.removeContact(iSelectedContact) ; iController->storePrivateDataOfSelectedProfile(true) ; // true == publish trust list too iController->model().trustTreeModel()->offerTrustList(iController->profileInUse(), QString(), iContactsModel.trustList()) ; iController->model().unlock() ; } } void FrontWidget::viewContactProfileButtonClicked() { if ( iSelectedContact != KNullHash ) { iController->userInterfaceAction(MController::ViewProfileDetails, iSelectedContact ) ; } } void FrontWidget::sendMsgToContactButtonClicked() { LOG_STR("sendMsgToContactButtonClicked"); if ( iSelectedContact != KNullHash ) { NewPrivMessageDialog *posting_dialog = new NewPrivMessageDialog(this, iController, iSelectedContact.toString(), "", *iSelectedProfile, iPrivMsgSearchModel) ; connect(posting_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; posting_dialog->show() ; // the dialog will delete self } } void FrontWidget::addMessageSenderToContacts() { if ( iPrivMsgOnDisplay.iSenderHash != KNullHash ) { EditContactDialog *contact_dialog = new EditContactDialog(this, iController, iPrivMsgOnDisplay.iSenderHash , iPrivMsgOnDisplay.iSenderName, false, iContactsModel ) ; connect(contact_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; contact_dialog->show() ; // the dialog will delete self } } void FrontWidget::addCaSenderToContacts() { if ( iCaOnDisplay.iSenderHash != KNullHash ) { EditContactDialog *contact_dialog = new EditContactDialog(this, iController, iCaOnDisplay.iSenderHash , iCaOnDisplay.iSenderName, false, iContactsModel ) ; connect(contact_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; contact_dialog->show() ; // the dialog will delete self } } void FrontWidget::addContactFromContactViewButtonClicked() { if ( iViewedProfile ) { EditContactDialog *contact_dialog = new EditContactDialog(this, iController, iViewedProfile->iFingerPrint, iViewedProfile->displayName(), false, iContactsModel ) ; connect(contact_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; contact_dialog->show() ; // the dialog will delete self } } QVariant FrontWidget::contactDataOfSelectedProfile() { return iContactsModel.contactsAsQVariant() ; } QList FrontWidget::trustListOfSelectedProfile() const { return iContactsModel.trustList() ; } void FrontWidget::setContactDataOfSelectedProfile(const QVariantList& aContacts) { iContactsModel.setContactsFromQVariant(aContacts) ; } bool FrontWidget::isContactInContactList(const Hash& aFingerPrint) const { return iContactsModel.isContactContained(aFingerPrint) ; } void FrontWidget::activateProfileCommentDisplay(ProfileCommentListingModel* aListingModel, ProfileCommentModel& aCommentModel, const Hash& aInitialComment, const Hash& aViewedProfile) { ProfileCommentDisplay* dialog = this->findChild(internalNameOfCommentDialog) ; if ( dialog ) { dialog->close() ; dialog = NULL ; } dialog = new ProfileCommentDisplay(this, iController, aListingModel, aCommentModel, aInitialComment, aViewedProfile, *iSelectedProfile) ; dialog->setObjectName(internalNameOfCommentDialog) ; connect(dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; // if selected profile is deleted (due to change), close // dialog also connect (iSelectedProfile, SIGNAL(destroyed()), dialog, SLOT(reject())) ; if ( iSelectedProfile->iFingerPrint != aViewedProfile ) { // viewing dialog is about "viewed profile" comments ; if // that profile is changed, also close the dialog: connect (iViewedProfile, SIGNAL(destroyed()), dialog, SLOT(reject())) ; } dialog->show() ; // the dialog will delete self aInitialComment ) ; } void FrontWidget::linkActivated ( const QString &aLink ) { QLOG_STR("FrontWidget::linkActivated " + aLink ) ; QUrl url ( aLink, QUrl::StrictMode) ; if ( url.isValid() && url.scheme().length() > 0 && url.host().length() > 0 ) { if ( url.scheme() == "caprofile" || url.scheme() == "caad" || url.scheme() == "cacomment" || url.scheme() == "cablob" ) { // classified ads link. handle internally. Hash parsedHash ; parsedHash.fromString(reinterpret_cast(url.host().toLatin1().constData())) ; if ( parsedHash == KNullHash ) { QMessageBox errorMessage ; errorMessage.setText(tr("Invalid SHA1 in URL") + " " + aLink ); errorMessage.setStandardButtons( QMessageBox::Ok ); errorMessage.exec(); return ; } else { if ( url.scheme() == "caprofile" ) { iController->userInterfaceAction(MController::ViewProfileDetails, parsedHash ) ; } else if ( url.scheme() == "caad" ) { iController->userInterfaceAction(MController::ViewCa, parsedHash ) ; } else if ( url.scheme() == "cacomment" ) { iController->userInterfaceAction(MController::ViewProfileComment, parsedHash ) ; } else { // handling for binary file. .. save it to disk, // we could also check other actions from metadata // but for now, lets just dump it into filesystem, // user does what user does. openBinaryFile(parsedHash, false) ; } } } else { QDesktopServices::openUrl(url) ; } } else { QMessageBox errorMessage ; errorMessage.setText(tr("Invalid URL") + " " + aLink ); errorMessage.setStandardButtons( QMessageBox::Ok ); errorMessage.exec(); return ; } } void FrontWidget::doShowFileMetadata(const Hash& aBinaryFileFingerPrint) { iController->model().lock() ; BinaryFile* metadata (iController->model().binaryFileModel().binaryFileByFingerPrint(aBinaryFileFingerPrint)); iController->model().unlock() ; if ( metadata ) { iController->displayFileInfoOnUi(*metadata) ; delete metadata ; } } // the "voice call" button needs to be enabled/disabled depending // whether we have connection to operators node available or not. // for this reason we have here connetion status observer. void FrontWidget::nodeConnectionAttemptStatus(Connection::ConnectionState aStatus, const Hash aHashOfAttemptedNode ) { if ( iViewedProfile && iViewedProfile->iNodeOfProfile && iViewedProfile->iNodeOfProfile->nodeFingerPrint() == aHashOfAttemptedNode ) { LOG_STR2("FrontWidget::nodeConnectionAttemptStatus %d in", aStatus) ; LOG_STR2("FrontWidget::nodeConnectionAttemptStatus %s ", qPrintable(aHashOfAttemptedNode.toString())) ; if ( aStatus == Connection::Open ) { setVoiceCallButtonStatus() ; } else { if ( iController->model().nodeModel().isNodeAlreadyConnected(aHashOfAttemptedNode) == false ) { // was one and only remaining open connection to given node setVoiceCallButtonStatus() ; } } } } void FrontWidget::setVoiceCallButtonStatus() { bool buttonStatus ( false ) ; if ( iViewedProfile && iViewedProfile->iNodeOfProfile ) { Hash fpOfNodeOfViewedProfile ( iViewedProfile->iNodeOfProfile->nodeFingerPrint() ) ; if ( fpOfNodeOfViewedProfile != KNullHash ) { iController->model().lock() ; const QList & connectionList( iController->model().getConnections() ) ; foreach ( const Connection* c, connectionList ) { if ( c->getPeerHash() == fpOfNodeOfViewedProfile ) { if ( c->connectionState() == Connection::Open ) { buttonStatus = true ; } break ; } } iController->model().unlock() ; } } ui.profileDetailsVoiceCallButton->setEnabled(buttonStatus) ; if ( iViewedProfile ) { VoiceCallEngine* eng ( iController->voiceCallEngine() ) ; Hash profileNode = KNullHash ; if ( iViewedProfile->iNodeOfProfile ) { profileNode = iViewedProfile->iNodeOfProfile->nodeFingerPrint() ; } if ( eng ) { ui.profileDetailsVoiceCallButton->setToolTip(eng->excuseForCallCreation(iViewedProfile->iFingerPrint, profileNode)) ; } } } void FrontWidget::voiceCallButtonPressed() { if ( iViewedProfile && iViewedProfile->iNodeOfProfile ) { Hash fpOfNodeOfViewedProfile ( iViewedProfile->iNodeOfProfile->nodeFingerPrint() ) ; if ( fpOfNodeOfViewedProfile != KNullHash ) { QString operatorNick ; operatorNick = iViewedProfile->displayName() ; iController->userInterfaceAction(MController::VoiceCallToNode, fpOfNodeOfViewedProfile, KNullHash, &operatorNick ) ; } } } void FrontWidget::callStateChanged(quint32 aCallId, VoiceCallEngine::CallState aState) { QLOG_STR("FrontWidget::callStateChanged " + QString::number(aState)) ; // if there is any call state activity, make sure there // is call state dialog on display if ( aState != VoiceCallEngine::Closed ) { CallStatusDialog* dialog = this->findChild(internalNameOfCallStatusDialog) ; if ( !dialog ) { dialog = new CallStatusDialog(this, *iController) ; dialog->setObjectName(internalNameOfCallStatusDialog) ; connect(dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; // and inject initial state: dialog->callStatusChanged(aCallId,aState) ; } dialog->show() ; } } classified-ads-0.13/FrontWidget.h000066400000000000000000000417301331670245300167260ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef FRONT_H #define FRONT_H #include #include #include #include #include "ui_frontWidget.h" #include "controller.h" #include "datamodel/calistingmodel.h" #include "datamodel/ca.h" #include "datamodel/privmsgsearchmodel.h" #include "datamodel/privmsg.h" #include #include "datamodel/contactlistingmodel.h" #include "datamodel/profilecommentlistingmodel.h" #include "net/voicecallengine.h" // for VoiceCallEngine::CallState class Profile ; class BinaryFileListingModel ; class QShortcut ; class ProfileCommentModel ; class QAction ; class FrontWidget: public QWidget { Q_OBJECT public: FrontWidget(Controller* aController,QMainWindow& aParent ) ; ~FrontWidget() ; /** puts profile of any operator on display */ void showDetailsOfProfile(const Hash& aFingerPrint) ; /** displays a selected classified ad */ void showClassifiedAd(const CA& ca) ; /** displays a selected profile comment */ void showSingleCommentOfProfile(const Hash aCommentFingerPrint) ; /** * Method for filling ad-category-selection -related * comboboxes. This is implemented here in frontwidget but * is used by dialogs as well, and that is the reason * why this method is public. */ static void fillCaSelectionCombobox(QComboBox& aComboBox, bool isAboutComboBox, MController& aController) ; /** * Method for getting the fully qualified name of the group * selection that user has made, for reason or another. Called * also from dialogs, thus public */ static QString selectedClassification(const QComboBox& aAboutCombo, const QComboBox& aRegardingCombo, const QComboBox& aWhereCombo, const MController& aController) ; /** * kind of "observer" method called from controller when there * is new content available ; odds are that we're displaying * or waiting some of that */ void receiveNotifyOfContentReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfReceivdContent) ; /** * kind of "observer" method called from controller when there * is new content available ; odds are that we're displaying * or waiting some of that. This variant is hit with notifications * about classified ads or private messages * @param aHashOfContent fingerprint of the object (ca or priv msg) * received * @param aHashOfClassificationOrDestination in case of ca, this is * fingerprint of the classification, in case of * private message, this is recipient profile * fingerprint. */ void receiveNotifyOfContentReceived(const Hash& aHashOfContent, const Hash& aHashOfClassificationOrDestination, const ProtocolItemType aTypeOfReceivdContent) ; /** * method for retrieving contacts list of the profile currently selected */ QVariant contactDataOfSelectedProfile() ; /** * method for retrieving trust list of the profile currently selected */ QList trustListOfSelectedProfile() const ; /** * method for setting contacts list of the profile currently selected */ void setContactDataOfSelectedProfile(const QVariantList& aContacts) ; /** * method for checking if given profile is in contact list of * selected profile */ bool isContactInContactList(const Hash& aFingerPrint) const ; /** * method for getting currently selected profile or NULL * if no profile selected */ Profile *selectedProfile() const { return iSelectedProfile ; } /** * method for opening a binary file, called from url handling and * from "save shared file.." selection */ void openBinaryFile(const Hash& aFingerPrint, bool aUseViewedProfileNodeAsNetreqDest = false ) ; public slots: virtual void publishProfileButtonClicked() ; /**< callback of publish btn */ virtual void revertProfileButtonClicked() ;/**< callback of revert btn */ virtual void profileImageClicked() ;/**< callback of image selection */ virtual void profileReadersClicked() ;/**< callback of reader-list edit */ virtual void profileEdited(const QString& aNewText) ;/**< callback for any UI actions that edit profile */ virtual void isPrivateSettingChanged(int aState) ;/**< callback of "is private" checkbox */ virtual void userProfileSelected(const Hash& aProfile) ;/**< called from controller when another user profile is selected */ virtual void fileToBeSharedAdded() ;/**< operator wants to share a file */ virtual void fileToBeSharedRemoved() ;/**< operator wants to stop advertasing a shared file */ virtual void exportSharedFile() ;/**< operator wants to save a shared file */ virtual void viewSharedFileInfo() ; /**< for viewing metadata of a shared file */ virtual void copySharedFileHash() ;/**< copies shared file SHA1 to clipboard */ virtual void editNewSharedFile() ;/**< initiates edit+publish of new text document */ virtual void profileSendMsgButtonClicked() ; virtual void profileShowReadersButtonClicked() ; virtual void profileSendCommentButtonClicked() ; virtual void caTabAboutComboChanged(int aNewIndex) ; virtual void caTabConcernsComboChanged(int aNewIndex) ; virtual void caTabWhereComboChanged(int aNewIndex) ; // slots for buttons at bottom of "classified ads" ta virtual void replyToCaButtonClicked() ; virtual void replyToCaToForumButtonClicked() ; virtual void commentCaPosterProfile() ; virtual void viewCaPosterProfile() ; virtual void viewCaAttachments() ; virtual void postNewClassifiedAd() ; virtual void performAdsSearchClicked() ; /**< callback of "search ads" */ /** * this slot is called when classified ads header listing view * has new selection */ virtual void CAselectionChangedSlot(const QItemSelection &, const QItemSelection &) ; /** * this slot is called when private messages header listing view * has new selection */ virtual void privMsgselectionChangedSlot(const QItemSelection &, const QItemSelection &) ; /** * this slot is called when contacts listing view has new selection */ virtual void contactsSelectionChangedSlot(const QItemSelection &, const QItemSelection &) ; virtual void replyToPrivMsgButtonClicked() ; /**< from priv msg tab btn */ virtual void commentPrivMsgPosterProfile() ; /**< from priv msg tab btn */ virtual void viewPrivMsgPosterProfile() ; /**< from priv msg tab btn */ virtual void postNewPrivateMessage() ;/**< from priv msg tab btn */ /** displays list of attachments of a private message */ virtual void viewPrivMsgAttachments() ; virtual void addMessageSenderToContacts() ;/**< called from messages tab */ virtual void addCaSenderToContacts() ;/**< called from ca listing tab */ // slots related to contacts-tab virtual void addContactButtonClicked() ; /**< new contact */ /** new contact from "view contact" tab */ virtual void addContactFromContactViewButtonClicked() ; virtual void removeContactButtonClicked() ; /**< remove contact */ virtual void viewContactProfileButtonClicked() ; /**< view contact profile */ virtual void sendMsgToContactButtonClicked() ; /**< send message to contact list profile */ virtual void editContactActionSelected() ; /**< edit */ /** * this slot is called when own profile comments listing is * changed */ virtual void ownProfileCommentselectionChangedSlot(const QItemSelection &, const QItemSelection &) ; /** * this slot is called when viewed profile comments listing is * changed */ virtual void viewedProfileCommentselectionChangedSlot(const QItemSelection &, const QItemSelection &) ; /** * this slot is called when user doubleclicks profile comment listing * of viewed profile */ virtual void viewedProfileCommentDoubleClicked(const QModelIndex &aSelection) ; /** * this slot is called when user hits enter while having keyboard * focus on profile comment listing */ virtual void viewedProfileCommentKeyPressed() ; /** * this slot is called when user doubleclicks profile comment listing * of own profile */ virtual void ownProfileCommentDoubleClicked(const QModelIndex &aSelection) ; /** * this slot is called when user clicks on link on document */ virtual void linkActivated ( const QString &aLink ) ; /** * called when user selects binary file from her own list of * shared files */ virtual void ownBinaryFileSelectionChangedSlot(const QModelIndex &aItem, const QModelIndex &aPreviousItem) ; /** * called when user selects binary file from list of shared files from * list of a viewed profile */ virtual void viewedBinaryFileSelectionChangedSlot(const QModelIndex &aItem, const QModelIndex &aPreviousItem) ; /** * sets up binary file listing actions in list of shared * files for both own profile shared file listing and possible * viewed profile shared file listing ; they share same * actions */ void updateFileSelectionActions() ; /** * when connection is attempted, @ref NetworkListener will * emit the status (failed or success) of the connection, * emitted signal is connected here, among other places */ void nodeConnectionAttemptStatus(Connection::ConnectionState aStatus, const Hash aHashOfAttemptedNode ); /** * Slot that is hit when user wants to make a new voice call to * operator */ void voiceCallButtonPressed() ; /** * Slot that is hit when call status changes. This is signal/slot * equivalent of call status observer. */ void callStateChanged(quint32 aCallId, VoiceCallEngine::CallState aState) ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; /** emitted when ca on display is replaced */ void displayedCaChanged() ; /** emitted when privmsg on display is replaced */ void displayedPrivMsgChanged() ; private: /** * method that reads @ref iSelectedProfile and updates UI elements * accordingly into "my profile" tab */ void updateUiFromSelectedProfile() ; /** * method that sets up shared file listing model based on selected profile. * if selected profile is NULL, this will tear down the model too. */ void setUpSelectedProfileFileListingModel() ; /** * separate init method for setting up the classified-ads tab * as it is fairly complex */ void setupClassifiedAdsTab() ; /** * separate init method for setting up the private messages tab * as it is fairly complex. This must be called after each * profile re-selection */ void setupPrivateMessagesTab() ; /** * contacts tab setup */ void setupContactsTab() ; /** * Method that set selected ad-classification on display * @param aNameOfClassification is the classification, like * "ToBeGivenAway.Clothing.AtYourPlace" */ void selectClassification(QString aNameOfClassification) ; /** * method that reads @ref iViewedProfile and updates UI elements * accordingly into "viewed profile" tab */ void updateUiFromViewedProfile() ; /** * method for bringing up dialog for display of profile comments * @param aListingModel datamodel holding the comments to list (UI model) * @param aCommentModel datamodel holding the comment data (storage model) * @param aInitialComment if non-null, hash of comment to initially focus * @param aViewedProfile fingerprint of profile whose comments are shown * @return none */ void activateProfileCommentDisplay(ProfileCommentListingModel* aListingModel, ProfileCommentModel& aCommentModel, const Hash& aInitialComment, const Hash& aViewedProfile ) ; private: // methods void setCaDocumentSize() ; void setPrivMsgSize() ; void doShowFileMetadata(const Hash& aBinaryFileFingerPrint) ; void setVoiceCallButtonStatus() ; private: Ui::frontWidget ui ; Controller* iController ; QMainWindow& iParent ; Profile *iSelectedProfile ; /**< components of selected "My profile" */ Profile *iViewedProfile ; /**< contents of "view profile" tab */ QAction* iAddSharedFileAction ; /**< context-menu action for adding shared file */ QAction* iRemoveSharedFileAction ; /**< context-menu action for adding shared file */ QAction* iExportSharedFileAction ; /**< context-menu action for saving to filesystem a shared file */ QAction* iViewSharedFileInfoAction ; /**< context-menu action for checking file metadata */ QAction* iCopySharedFileHashAction ; /**< context-menu action copying SHA1 to clipboard */ QAction* iEditNewSharedFileAction ; /**< context-menu action for editing new text doc */ /** model for displaying file list "operator profile" ; there may be 2nd instance * for displaying file list of some other profile that is not operators own */ BinaryFileListingModel* iSelectedProfileFileListingModel ; /** model for displaying file list of random viewed profile */ BinaryFileListingModel* iViewedProfileFileListingModel ; QPushButton* iReplyToCaButton ; QPushButton* iReplyToCaToForumButton ; /** button for opening dialog for posting a new CA */ QPushButton* iNewCaButton ; /** button for opening a dialog for commenting a CA poster profile */ QPushButton* iCommentCaPosterButton ; /** button for opening view of profile from CA display */ QPushButton* iViewCaPosterProfileButton ; /** button for displaying attachments of a CA on display */ QPushButton* iViewCaAttachmentsButton ; QAction* iAddToContactsFromCaList ; CAListingModel iCaListingModel ; /**< used for content of ad-listing view */ QGraphicsScene iCaScene ; /**< this is used to display elements of an ad */ QGraphicsTextItem iCaText ; /**< this is used to render text of classified ad */ CA iCaOnDisplay ; /**< Classified ad on */ QGraphicsSimpleTextItem iFromField ; QGraphicsSimpleTextItem iSubjectField ; const QPoint iArticleTopLeft ; // private message tab related variables PrivateMessageSearchModel iPrivMsgSearchModel ; PrivMessage iPrivMsgOnDisplay ; QGraphicsScene iPrivMsgScene ; /**< this is used to display elements of an priv msg */ QGraphicsTextItem iPrivMsgText ; /**< this is used to render text of priv msg */ QGraphicsSimpleTextItem iPrivMsgFromField ; QGraphicsSimpleTextItem iPrivMsgSubjectField ; const QPoint iPrivMsgTopLeft ; QPushButton* iReplyToPrivMsgButton; QPushButton* iNewPrivMsgButton ; QPushButton* iCommentPrivMsgPosterButton; QPushButton* iViewPrivMsgPosterProfileButton; QPushButton* iViewPrivMsgAttachmentsButton ; QAction* iAddToContactsFromMsgList ; // variables related to contacts-list ContactListingModel iContactsModel ; Hash iSelectedContact ; QAction* iEditContactAction ; // variables related to profile-comment display ProfileCommentListingModel iSelectedProfileCommentListingModel ; ProfileCommentListingModel iViewedProfileCommentListingModel ; Hash iSelectedCommentFromOwnCommentListing ; Hash iSelectedCommentFromViewedCommentListing ; QShortcut* iProfileListingKeyboardGrabber ; bool iWindowSizeAdjusted ; /** * binary file selected from "shared files" list of own * profiles shared files */ Hash iSelectedOwnBinaryFile ; /** * binary file selected from "shared files" list of viewed * profiles shared files */ Hash iSelectedViewedProfileBinaryfile ; } ; #endif classified-ads-0.13/LICENSE000066400000000000000000000636421331670245300153340ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey 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 library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! classified-ads-0.13/README.TXT000066400000000000000000000026661331670245300156640ustar00rootroot00000000000000Compiling: You need qt5, libnatmpm, openssl, miniupnpc and opus. The debian control file is made for qt5 but program compiles with qt4 also. In qt4-case add libmagick and libqjson into dependencies. So, using your favourite package-manager install qtbase5-dev-tools libssl-dev libnatpmp-dev libminiupnpc-dev dpkg-dev (if going to build with dpkg-buildpackage) libgcrypt11-dev (if going to build with dpkg-buildpackage, it checks for this) libqt5sql5-sqlite (is needed at runtime, not compile time) libopus-dev imagemagick (alternatively download https://github.com/operatornormal/classified-ads/blob/graphics/preprocessed.tar.gz?raw=true and unpack that into same directory with the sources and skip the graphics-highres -part below) Libgcrypt-dev or libgcrypt11-dev are needed for test suite, some bignum tests are done against routines in this library but in normal runtime there is no dependency. If compiling in linux or other unix-like system, you do the following: - but skip this part for debian+derivatives (ubuntu,mint) if building with dpkg-buildpackage: cd graphics-highres make cd .. Then just say "qmake ; make install" and that should do the trick ; or if inside debian-ecosystem "dpkg-buildpackage -r" in this directory should produce a installable package for your environment ; this is the correct way anyway. For compiling under ms-windows, see readme-file in sub-dir windows. License: LGPL. Happy hacking. classified-ads-0.13/README.md000066400000000000000000000030421331670245300155720ustar00rootroot00000000000000classified-ads ============== Classified ads is a server-less program for internet communications, including public and private messages. Things you can do with classified-ads include * Posting and reading of public messages, the "classified ads" that don't necessarily need to do anything with selling or buying of things ; consider this thing a public discussion forum. * Publishing of small set of information about ourself as user of the system. * Leaving public comments about operators ; if operator has decided to mark information regarding himself as private-within-group, then only the named group can read the comments. * Sending and receiving of messages between operators that are not intended for others to see. * Performing of (word-based) searches of content posted into the system. * Doing voip calls between operators in the network. Server-less means that system has completely distributed design, each node in the network implements a "mini-server" that serves other users in the network in form of data storage and data transfer. System has no concept of "service provider" or "server" that would later disappear leaving users without messaging capabilities. For keeping private things private encryption is applied whenever possible. Visit http://katiska.org/classified-ads/ for more details. Classified-ads is known to work in linux and other unix-like operating- systems and microsoft windows. Most of functionality is on top of Qt library so porting to other environments where Qt is available might be possible. classified-ads-0.13/call/000077500000000000000000000000001331670245300152275ustar00rootroot00000000000000classified-ads-0.13/call/audiodecoder.cpp000066400000000000000000000061621331670245300203670ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "audiodecoder.h" #include "../log.h" const int KDecodedBufferSize ( 1024 * 6 ) ; AudioDecoder::AudioDecoder(quint32 aSampleRate, quint32 aNumChannels ) : iDecoder(NULL) , iNumChannels(aNumChannels), iSampleRate(aSampleRate) { int errorCode ( 0 ) ; iDecoder = opus_decoder_create((opus_int32)aSampleRate, (int)aNumChannels, &errorCode ); if ( errorCode != OPUS_OK || iDecoder == NULL ) { QLOG_STR( "opus_decoder_create " + QString::number(errorCode)) ; } QLOG_STR( "decoder samplerate " + QString::number(aSampleRate)) ; QLOG_STR( "decoder channels " + QString::number(aNumChannels)) ; iDecodedData.fill ( 0, KDecodedBufferSize ) ; } AudioDecoder::~AudioDecoder() { QLOG_STR( "~AudioDecoder" ) ; if ( iDecoder ) { opus_decoder_destroy(iDecoder) ; iDecoder = NULL ; } } void AudioDecoder::frameReceived(quint32 aCallId, quint32 aSeqNo, const QByteArray& aAudioData, Hash aOriginatingNode ) { if ( iDecoder && aAudioData.size() ) { int frameSize = ( iSampleRate / 1000 ) * 60 ; QLOG_STR( "Number of frames in packet " + QString::number(frameSize) ) ; int resultLen = opus_decode_float(iDecoder, (const unsigned char*)(aAudioData.constData()), aAudioData.size() , (float*)(iDecodedData.data()), frameSize, 0); if (resultLen < 0) { QLOG_STR( "opus_decode() failed with error code: " + QString::number(resultLen)); } else { // this is not queued connection, will be processed // synchronously by mixer. note that in this // stage datamodel lock is *on*. emit frameDecoded(aCallId, aSeqNo, iDecodedData.mid(0,resultLen*iNumChannels*sizeof(float)), aOriginatingNode ) ; } } } classified-ads-0.13/call/audiodecoder.h000066400000000000000000000045121331670245300200310ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef AUDIO_DECODER_H #define AUDIO_DECODER_H #include #include // for data types #include "../util/hash.h" /** * @brief class for de-compressing audio received from network * * This class encapsulates opus decoder for packing audio over network. */ class AudioDecoder : public QObject { Q_OBJECT public: /** * Constructor. */ AudioDecoder(quint32 aSampleRate = 8000, quint32 aNumChannels = 1 ) ; ~AudioDecoder() ; signals: /** * This signal is emitted when decoded frame is ready for * further processing, typically by audio mixer. * @param aCallId call where frame originates from * @param aSeqNo sequence number of the frame in the call * @param aEncodedData raw de-coded audio data. In practice the * byte-array holds array of floats, each preseting one * sample, in range [-1,1]. */ void frameDecoded(quint32 aCallId, quint32 aSeqNo, const QByteArray& aEncodedData, Hash aOriginatingNode ) ; public slots: /** * Received audio frames to be de-coded are connected to this slot. */ void frameReceived(quint32 aCallId, quint32 aSeqNo, const QByteArray& aAudioData, Hash aOriginatingNode ) ; private: // members OpusDecoder* iDecoder ; QByteArray iDecodedData ; const quint32 iNumChannels ; const quint32 iSampleRate ; } ; #endif classified-ads-0.13/call/audioencoder.cpp000066400000000000000000000102351331670245300203750ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "audioencoder.h" #include "../log.h" #include "../util/hash.h" const int KOutputBufferSize ( 2048 ) ; AudioEncoder::AudioEncoder(quint32 aSampleRate, quint32 aNumChannels ) : iEncoder(NULL) , iEncodedData(NULL), iNumChannels(aNumChannels) { int errorCode ( 0 ) ; iEncoder = opus_encoder_create(aSampleRate, aNumChannels, OPUS_APPLICATION_VOIP, &errorCode ); opus_encoder_ctl(iEncoder, OPUS_SET_BITRATE(OPUS_AUTO)); if ( errorCode != OPUS_OK || iEncoder == NULL ) { QLOG_STR( "opus_encoder_create " + QString::number(errorCode) ) ; } iEncodedData = (unsigned char *) malloc ( KOutputBufferSize ) ; } AudioEncoder::~AudioEncoder() { QLOG_STR( "AudioEncoder::~AudioEncoder()" ) ; if ( iEncoder ) { opus_encoder_destroy(iEncoder) ; iEncoder = NULL ; } if ( iEncodedData ) { delete iEncodedData ; } } // note, this slot is connected synhronously and called with // datamodel lock on. it makes sense as there is only one // encoder and that encodes for all remote outputs. void AudioEncoder::frameReady(quint32 aCallId, quint32 aSeqNo, const QByteArray& aAudioData, Hash aForNode ) { if ( iEncodedData && iEncoder ) { int frameSize = (aAudioData.size()/ iNumChannels)/ sizeof(float) ; int resultLen = opus_encode_float(iEncoder, (const float*)(aAudioData.constData()), frameSize, iEncodedData, KOutputBufferSize); if (resultLen < 0) { switch ( resultLen ) { case OPUS_OK: QLOG_STR("Opus:No error.") ; break ; case OPUS_BAD_ARG: QLOG_STR("Opus:One or more invalid/out of range arguments. ") ; break ; case OPUS_BUFFER_TOO_SMALL: QLOG_STR("Opus: Not enough bytes allocated in the buffer.") ; break ; case OPUS_INTERNAL_ERROR: QLOG_STR("Opus: An internal error was detected.") ; break ; case OPUS_INVALID_PACKET: QLOG_STR("Opus: The compressed data passed is corrupted.") ; break ; case OPUS_UNIMPLEMENTED: QLOG_STR("Opus: Invalid/unsupported request number.") ; break ; case OPUS_INVALID_STATE: QLOG_STR("Opus: An encoder or decoder structure is invalid or already freed.") ; break ; case OPUS_ALLOC_FAIL: QLOG_STR("Opus: Memory allocation failed") ; break ; default: QLOG_STR("Opus: error " + QString::number(resultLen)) ; break ; } } else { QLOG_STR("Opus encoded data len " + QString::number(resultLen)) ; QByteArray encodedData((const char *)iEncodedData, resultLen ) ; emit frameEncoded(aCallId,aSeqNo,encodedData,aForNode ) ; } } } classified-ads-0.13/call/audioencoder.h000066400000000000000000000055701331670245300200500ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef AUDIO_ENCODER_H #define AUDIO_ENCODER_H #include #include // for data types #include "../util/hash.h" /** * @brief class for compressing audio to be sent over network * * This class encapsulates opus encoder for packing audio over network. * Future releases may include other options regarding the codec or * type of input (audio/video/feeling/touch/smell/other?) */ class AudioEncoder : public QObject { Q_OBJECT public: /** * Constructor. */ AudioEncoder(quint32 aSampleRate = 8000, quint32 aNumChannels = 1 ) ; ~AudioEncoder() ; signals: /** * This signal is emitted after audio frame has been encoded * into opus format. When audio data is sent in via slot * @ref frameReady then this signal is emitted as result * of succesful processing. * * @param aCallId call identifer of the audio stream * @param aSeqNo sequence number of frame inside stream * @param aEncodedData raw opus frame, as it comes out * from opus library call opus_encode_float(). * @param aForNode fingerprint of node supposed to receive * the frame */ void frameEncoded(quint32 aCallId, quint32 aSeqNo, const QByteArray& aEncodedData, Hash aForNode ) ; public slots: /** * Input to encoder cames in via this method. * * @param aCallId call identifer of the audio stream * @param aSeqNo sequence number of frame inside stream * @param aAudioData raw, unpacked audio samples. The * byte-array must contain an array of floats * in [-1,1] range. * @param aForNode fingerprint of node supposed to receive * the frame */ void frameReady(quint32 aCallId, quint32 aSeqNo, const QByteArray& aAudioData, Hash aForNode ) ; private: // members OpusEncoder *iEncoder ; unsigned char *iEncodedData ; const quint32 iNumChannels ; } ; #endif classified-ads-0.13/call/audiomixer.cpp000066400000000000000000000525711331670245300201130ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "audiomixer.h" #include "audiosource.h" #include "../datamodel/model.h" #include #include #include "../log.h" /** * How many packets to keep in buffer before mixing starts occurring. * This is not used in 1-1 situation (when there is only single call * in progress and no need to actually mix) but in multicall situations * this is used. */ const int KPreferredBufferLen ( 5 ) ; /** * If there is any queue with more packets than this, packets * start getting discarded. With 60ms frame size the queue len * 32 presents 2 full seconds. */ const int KMaxBufferLen ( 32 ) ; AudioMixer::AudioMixer( Model& aModel) : iModel(aModel) { } AudioMixer::~AudioMixer() { } // when this is called, datamodel is locked void AudioMixer::insertCapturedAudioFrame ( const QByteArray& aFrame, quint32 aSeqNo, float aVolumeLevel ) { doInsertAudioFrame ( aFrame, true, aSeqNo, 0 , aVolumeLevel, KNullHash ); } // when this is called, datamodel is locked void AudioMixer::insertReceivedAudioFrame ( quint32 aCallId, quint32 aSeqNo, const QByteArray& aFrame, Hash aOriginatingNode ) { // audio frames coming from remote nodes have no average // volume level calculated so lets do it here: float* samples((float *)( aFrame.data() )) ; float value ( 0.0f ) ; float volumeSum ( 0.0f ) ; int numberOfSamples = aFrame.size() / sizeof(float) ; numberOfSamples-- ; for ( ; numberOfSamples >= 0 ; numberOfSamples-- ) { value = samples[numberOfSamples] ; // in float presentation the samples need to have // numerical value between [-1,1] so lets scale the // values ; volumeSum = volumeSum + qAbs( value ) ; } numberOfSamples = aFrame.size() / sizeof(float) ; float volumeLevel ( volumeSum/(float)numberOfSamples ) ; doInsertAudioFrame ( aFrame, false, aSeqNo, aCallId, volumeLevel, aOriginatingNode ); } void AudioMixer::doInsertAudioFrame ( const QByteArray& aFrame, bool aIsLocallyCaptured, quint32 aSeqNo, quint32 aCallId, float aVolumeLevel, Hash &aOriginatingNode ) { bool inserted ( false ) ; int indexFound ( -1 ) ; for ( int i = iStreams.size()-1 ; i >= 0 ; i-- ) { const AudioFrameMetadata& s ( iStreams[i] ) ; if ( s.iNode == aOriginatingNode || ( ( s.iIsLocallyCaptured == aIsLocallyCaptured ) && aIsLocallyCaptured == true )) { indexFound = i ; if ( s.iIsLocallyCaptured == aIsLocallyCaptured ) { // locally captured audio comes in with no callId aCallId = s.iCallId ; } break ; // out of the loop } } if ( indexFound > -1 ) { if( iAudioDataBuffer.size() > indexFound ) { QQueue& buf ( iAudioDataBuffer[indexFound] ) ; if ( buf.size() < KMaxBufferLen ) { // if buffer is full AudioStreamMetadata& metaData ( iStreams[indexFound] ) ; AudioFrame f ; f.iCallId = aCallId ; f.iSeqNo = aSeqNo ; f.iFrame.append ( aFrame ) ; f.iVolumeLevel = aVolumeLevel ; f.iIsLocallyCaptured = aIsLocallyCaptured ; if ( metaData.iMaxSeqSeen == 0 || ( metaData.iMaxSeqSeen + 1 ) == aSeqNo ) { // easy, just enqueue normally buf.enqueue(f) ; if ( aIsLocallyCaptured == false ) { metaData.iMaxSeqSeen = aSeqNo ; // only remote stream seqno } inserted = true ; } else { // difficult. we got the packet in wrong order: try // to put it into queue into right position if ( buf.size() == 0 ) { buf.enqueue(f) ; inserted = true ; metaData.iMaxSeqSeen = aSeqNo ; } else if ( buf.first().iSeqNo > aSeqNo ) { // we got the packet that is earlier than // our head, it goes to pole position (index 0) // and becomes new first() buf.insert(0,f) ; inserted = true ; if ( aIsLocallyCaptured == false ) { metaData.iMaxSeqSeen = buf.last().iSeqNo ; } } else if ( buf.last().iSeqNo < aSeqNo ) { // we got the packet that is later than our latest // on queue so it will go to tail buf.append(f) ; inserted = true ; } else { // our packet is not first, not last but belongs // into the middle. If we came here, it also means // that buf.size() is at least 2. for ( int i = buf.size()-1 ; i >= 1 ; i-- ) { if ( buf[i].iSeqNo > aSeqNo && buf[i-1].iSeqNo < aSeqNo ) { // our pos is i: buf.insert(i,f) ; inserted = true ; if ( aIsLocallyCaptured == false ) { metaData.iMaxSeqSeen = buf.last().iSeqNo ; } break ; // out of for loop } } } } } // end if of if buffer was already full } // end-if of buffer was found if ( inserted && aIsLocallyCaptured ) { tryMixFrames(aCallId, aSeqNo) ; } } } void AudioMixer::insertStream (quint32 aCallId, quint32 aStartingSeq, bool aIsLocallyCaptured, const Hash& aOriginatingNode) { QLOG_STR("AudioMixer::insertStream " + QString::number(aCallId) + " local " + QString::number(aIsLocallyCaptured) + " node " + aOriginatingNode.toString() ) ; for ( int i = iStreams.size()-1 ; i >= 0 ; i-- ) { AudioFrameMetadata& s ( iStreams[i] ) ; if ( s.iCallId == aCallId && s.iIsLocallyCaptured == aIsLocallyCaptured ) { return ; // was there already.. } } // add metadata AudioFrameMetadata newStream ; newStream.iCallId = aCallId ; newStream.iStartingSeq = aStartingSeq ; newStream.iMaxSeqSeen = aStartingSeq ; newStream.iIsLocallyCaptured = aIsLocallyCaptured ; newStream.iNode = aOriginatingNode ; QLOG_STR("Appending stream to mixer callid = " + QString::number(newStream.iCallId) + " local cap = " + QString::number(newStream.iIsLocallyCaptured) + " hash of orig node = " + newStream.iNode.toString()) ; iStreams.append(newStream) ; // add queue for voice data QQueue buf ; iAudioDataBuffer.append(buf) ; configureMixedStreams() ; } void AudioMixer::removeStream (quint32 aCallId) { int indexFound ( -1 ) ; for ( int i = iStreams.size()-1 ; i >= 0 ; i-- ) { AudioFrameMetadata& s ( iStreams[i] ) ; if ( s.iCallId == aCallId && s.iIsLocallyCaptured == false ) { indexFound = i ; break ; // out of the loop } } if ( indexFound > -1 ) { iStreams.takeAt(indexFound) ; iAudioDataBuffer.takeAt(indexFound) ; } configureMixedStreams() ; // now, after configuration check that if we // were left with only local microphone stream.. it means // that it shall be removed too: if ( iIndexesToMixForRemoteOutput.size() == 1 && iIndexesToMixForLocalSpeaker.size() == 0 ) { iStreams.clear() ; iIndexesToMixForRemoteOutput.clear() ; } } // note: when this is called, datamodel is locked. // this is actual mixer workhorse, audio frames go through this method. // this will try to fetch packets from queues, mix them together // and emit() the resulting frames to both local output and // to networked remote parties void AudioMixer::tryMixFrames(quint32 aCallId, quint32 aSeqNo) { // lets see, we have several options for our mode of work.. if ( ( iIndexesToMixForLocalSpeaker.size() == 1 && iIndexesToMixForRemoteOutput.size() == 1 ) ) { // in this case we have single call and there is no need to mix while( iAudioDataBuffer[iIndexesToMixForLocalSpeaker[0]].size()) { AudioFrame frame ( iAudioDataBuffer[iIndexesToMixForLocalSpeaker[0]].dequeue()) ; emit frameReadyForLocalSpeaker( frame.iFrame ) ; } while( iAudioDataBuffer[iIndexesToMixForRemoteOutput[0]].size()) { AudioFrame frame ( iAudioDataBuffer[iIndexesToMixForRemoteOutput[0]].dequeue()) ; if ( iStreams.size() > 0 ) { emit frameReadyForRemoteSend( aCallId, aSeqNo, frame.iFrame, // here: we have 2 streams, one is local capture // and it has iNode value 0. This is the stream // that we're taking from. So the destination address // actually is found from the stream, that we're // not handling here, e.g. "for local speaker": iStreams[iIndexesToMixForLocalSpeaker[0]].iNode ) ; } } } else { // then non-trivial cases where mixing actually happens, previous case just // copies the frame as it is. // first check if we mix at all. The trigger is that there is at least one queue with enough // packets in there int longestQueueLengthDiscovered ( 0 ) ; for ( int i = 0 ; i < iAudioDataBuffer.size() ; i++ ) { QQueue& queueInBuffer ( iAudioDataBuffer[i] ) ; if ( queueInBuffer.size() > longestQueueLengthDiscovered ) { longestQueueLengthDiscovered = queueInBuffer.size() ; } } if ( longestQueueLengthDiscovered > KPreferredBufferLen ) { // there is enough packets in at least one buffer, go // ahead and mix int packetsToMixFromEachQueue = longestQueueLengthDiscovered - KPreferredBufferLen ; QLOG_STR("Going to mix " + QString::number(packetsToMixFromEachQueue) + " packets from queues") ; for ( int qIndex = 0 ; qIndex < packetsToMixFromEachQueue ; qIndex++ ) { // first mix for remote outputs because every stream gets mixed // to every remote output quint32 seqNo ( 0 ) ; bool callIdIsSet ( false ) ; int indexOfQueueWithHighestVolume ( -1 ) ; int indexOfQueueWith2ndHighestVolume ( -1 ) ; float highestVolumeSeen ( -100.0f ) ; float secondHighestVolumeSeen ( -100.0f ) ; int streamCountToRemoteOutput ( iAudioDataBuffer.size() ) ; if ( streamCountToRemoteOutput ) { // find queue with highest volume: for ( int i = 0 ; i < streamCountToRemoteOutput ; i++ ) { QQueue& queueToTry ( iAudioDataBuffer[i] ) ; if ( queueToTry.size() ) { AudioFrame& frame ( queueToTry.head() ) ; if ( frame.iIsLocallyCaptured ) { seqNo = frame.iSeqNo ; callIdIsSet = true ; } if ( frame.iVolumeLevel > highestVolumeSeen ) { highestVolumeSeen = frame.iVolumeLevel ; indexOfQueueWithHighestVolume = i ; } } } // find queue with 2nd highest volume: for ( int i = 0 ; i < streamCountToRemoteOutput ; i++ ) { QQueue& queueToTry ( iAudioDataBuffer[i] ) ; if ( queueToTry.size() ) { AudioFrame& frame ( queueToTry.head() ) ; if ( frame.iVolumeLevel >= secondHighestVolumeSeen && frame.iVolumeLevel <= highestVolumeSeen && i != indexOfQueueWithHighestVolume ) { secondHighestVolumeSeen = frame.iVolumeLevel ; indexOfQueueWith2ndHighestVolume = i ; } } } } // end of loop finding noisiest queues QLOG_STR("Loudest frame indexes " + QString::number(indexOfQueueWithHighestVolume) + " " + QString::number(indexOfQueueWith2ndHighestVolume) ) ; if ( callIdIsSet && indexOfQueueWithHighestVolume >= 0 && indexOfQueueWith2ndHighestVolume >= 0 ) { // now, do no mixing. Instead copy the queue with max volume // to everybody but not to originator. originator in turn gets // contents of the 2nd noisiest queue. this prevents very frustrating // echoes ; here nobody should hear echo of own voice. QQueue & loudestQueue ( iAudioDataBuffer[indexOfQueueWithHighestVolume] ) ; QQueue & secondLoudestQueue ( iAudioDataBuffer[indexOfQueueWith2ndHighestVolume] ) ; AudioFrame& loudestFrame ( loudestQueue.head() ) ; AudioFrame& secondLoudestFrame (secondLoudestQueue.head() ); Hash& originOfLoudestFrame (iStreams[indexOfQueueWithHighestVolume].iNode) ; Hash& originOf2ndLoudestFrame (iStreams[indexOfQueueWith2ndHighestVolume].iNode) ; foreach ( const AudioFrameMetadata& stream , iStreams ) { // first check if we have stream of local output: if ( stream.iIsLocallyCaptured ) { // if it is us that is the loudest, then take 2nd: if ( originOfLoudestFrame == KNullHash ) { // it was me making loudest noise: emit frameReadyForLocalSpeaker(secondLoudestFrame.iFrame) ; } else { // normally copy to local speaker the loudest // speaker: emit frameReadyForLocalSpeaker(loudestFrame.iFrame) ; } } else { // was not locally captured Hash fingerPrintOfStream ( stream.iNode ) ; if ( stream.iNode != originOfLoudestFrame ) { emit( frameReadyForRemoteSend(stream.iCallId, seqNo, loudestFrame.iFrame, fingerPrintOfStream ) ) ; } else if ( stream.iNode != originOf2ndLoudestFrame ) { emit( frameReadyForRemoteSend(stream.iCallId, seqNo, secondLoudestFrame.iFrame, fingerPrintOfStream ) ) ; } else { QLOG_STR("Audiomixer: Frame was not sent anywhere??") ; } } } // now both local and remote mixing done: remove one // frame from each queue for ( int i = 0 ; i < iAudioDataBuffer.size() ; i++ ) { QQueue& queue ( iAudioDataBuffer[i] ) ; if ( queue.size() ) { queue.dequeue() ; // one } } } // end if of "if call id was set" } // Qindex e.g. queue index loop end } } return ; } void AudioMixer::configureMixedStreams() { iIndexesToMixForLocalSpeaker.clear() ; iIndexesToMixForRemoteOutput.clear() ; // trivial cases first.. if ( iStreams.size() == 1 && iStreams[0].iIsLocallyCaptured ) { iIndexesToMixForRemoteOutput.append(0) ; QLOG_STR("Case 1 Mixing for remote node " + QString::number(iStreams[0].iCallId) + " is locally captured " + QString::number(iStreams[0].iIsLocallyCaptured) + " node addr " + iStreams[0].iNode.toString()) ; } // another trivial if ( iStreams.size() == 1 && iStreams[0].iIsLocallyCaptured == false ) { iIndexesToMixForLocalSpeaker.append(0) ; QLOG_STR("Case 2 Mixing for local speaker " + QString::number(iStreams[0].iCallId) + " is locally captured " + QString::number(iStreams[0].iIsLocallyCaptured)+ " node addr " + iStreams[0].iNode.toString()) ; } // then 1-1 cases, e.g. 2 streams and one is local if ( iStreams.size() == 2 && iStreams[0].iIsLocallyCaptured == false && iStreams[1].iIsLocallyCaptured == true ) { iIndexesToMixForLocalSpeaker.append(0) ; iIndexesToMixForRemoteOutput.append(1) ; QLOG_STR("Case 3 Mixing for local speaker " + QString::number(iStreams[0].iCallId) + " is locally captured " + QString::number(iStreams[0].iIsLocallyCaptured)+ " node addr " + iStreams[0].iNode.toString()) ; QLOG_STR("Mixing for remote node " + QString::number(iStreams[1].iCallId) + " is locally captured " + QString::number(iStreams[1].iIsLocallyCaptured)+ " node addr " + iStreams[1].iNode.toString()) ; } if ( iStreams.size() == 2 && iStreams[0].iIsLocallyCaptured == true && iStreams[1].iIsLocallyCaptured == false ) { iIndexesToMixForLocalSpeaker.append(1) ; iIndexesToMixForRemoteOutput.append(0) ; QLOG_STR("Case 4 Mixing for local speaker " + QString::number(iStreams[1].iCallId) + " is locally captured " + QString::number(iStreams[1].iIsLocallyCaptured)+ " node addr " + iStreams[1].iNode.toString()) ; QLOG_STR("Mixing for remote node " + QString::number(iStreams[0].iCallId) + " is locally captured " + QString::number(iStreams[0].iIsLocallyCaptured)+ " node addr " + iStreams[0].iNode.toString()) ; } // then non-trivial cases. there are more than 2 streams. if ( iStreams.size() > 2 ) { // this is only situation where actual audio mixing takes // place. Int remote put everything we have: for ( int i = iStreams.size()-1 ; i >= 0 ; i-- ) { iIndexesToMixForRemoteOutput.append(i) ; QLOG_STR("Mixing for remote node " + QString::number(iStreams[i].iCallId) + " is locally captured " + QString::number(iStreams[i].iIsLocallyCaptured)) ; } // into local put everything but the local itself: for ( int i = iStreams.size()-1 ; i >= 0 ; i-- ) { if ( iStreams[i].iIsLocallyCaptured == false ) { iIndexesToMixForLocalSpeaker.append(i) ; QLOG_STR("Mixing for local speaker " + QString::number(iStreams[i].iCallId) + " is locally captured " + QString::number(iStreams[i].iIsLocallyCaptured)) ; } } } } classified-ads-0.13/call/audiomixer.h000066400000000000000000000200461331670245300175500ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef AUDIO_MIXER_H #define AUDIO_MIXER_H #include #include #include #include "../util/hash.h" class Model ; /** * @brief Class for mixing together 0-n audio streams * * This class has 2 types of input and 2 types of output. * Input type 1: locally captured microphone data * Input type 2: 0-n streams sent from remote nodes * Output type 1: Audio intended for playback from local loudspeaker * Output type 2: Audio intended to be sent to remote nodes * Depending on situation this class will mix a bit differently. * If there is only type 1 input and 1 type 2 stream then no mixing * will occur: input type 2 becomes output type 1 and that's it. * If there is more than 1 streams to mix together then mixer will * actually mix. */ class AudioMixer : public QObject { Q_OBJECT public: /** * Constructor. */ AudioMixer(Model& aModel) ; ~AudioMixer() ; /** * method for entering stream metadata so that stream with given * callid gets included into mixer output * @param aCallId call identifier * @param aStartingSeq first sequence number to expect * @param aIsLocallyCaptured if true, stream is coming from * local audio hardware, not from remote node * @param aOriginatingNode Fingerprint of node sending this stream */ void insertStream (quint32 aCallId, quint32 aStartingSeq, bool aIsLocallyCaptured, const Hash& aOriginatingNode ) ; /** * method for removing stream metadata so that stream with given * callid no longer gets included into mixer output */ void removeStream (quint32 aCallId) ; signals: /** emitted when mixing done for local playback */ void frameReadyForLocalSpeaker(const QByteArray& aFrame) ; /** emitted when mixing done for remote nodes */ void frameReadyForRemoteSend(quint32 aCallId, quint32 aSeqNo, const QByteArray& aFrame, Hash aForNode ) ; public slots: /** * Method for inputting an audio frame from local microphone. * Frame is 60 milliseconds raw audio data in floating point format * with 8kHz sample rate. That means there are 480 samples, totalling * 960*2 bytes. See constants in top of audiomixer.cpp file. Each * floating point sample in array needs to be in range [-1,1] * * @param aFrame is the audio data. floating point, * native-encoding audio/pcm data. * @param aSeqNo Sequence number of frame. This is a incrementing * number that begins from 0 at stream start. Note that * it is entirely possible to start mixing a stream * from middle so when processing starts, this value * does not necessarily start from 0 * @param aVolumeLevel calculated volume level of this 60 ms snippet */ void insertCapturedAudioFrame ( const QByteArray& aFrame, quint32 aSeqNo, float aVolumeLevel); /** * Method for inputting an audio frame that is received from network. * See method @ref insertCapturedAudioFrame for more information, same * frame data format must be used. * * @param aFrame is the audio data. float, native-encoding audio/pcm data. * @param aSeqNo Sequence number of frame. This is a incrementing * number that begins from 0 at stream start. Note that * it is entirely possible to start mixing a stream * from middle so when processing starts, this value * does not necessarily start from 0 * @param aCallId Call id for keeping track which frame belongs to which * stream. Typically inside mixer there are both * locally captured frames and frames from remote that * both have same call id ; if there are multiple calls in * progress then one set of frames of local input and * several from remote sources. If aIsLocallyCaptured * is true, then value of this parameter has no effect * @param aOriginatingNode node where frame is from. */ void insertReceivedAudioFrame ( quint32 aCallId, quint32 aSeqNo, const QByteArray& aFrame, Hash aOriginatingNode ); private: // methods /** * workhorse method. will check for buffers and see if we have * frames for all streams to mix and if conditions evaluate true, * will output the mixed frame, or several if possible. */ void tryMixFrames(quint32 aCallId, quint32 aSeqNo) ; /** * method for figuring out which stream to mix into which * direction */ void configureMixedStreams() ; /** * workhorse of insertCaptured/ReceivedAudioFrame slots * * @param aIsLocallyCaptured is true if audio is from local microphone * and false if received from remote node */ void doInsertAudioFrame ( const QByteArray& aFrame, bool aIsLocallyCaptured, quint32 aSeqNo, quint32 aCallId, float aVolumeLevel, Hash &aOriginatingNode ); private: // members /** * Carrier-structure for audio frame. These sit in a queue * waiting to be mixed and sent to remote destinations or * local playback */ typedef struct AudioFrameStruct { quint32 iCallId ; quint32 iSeqNo ; bool iIsLocallyCaptured ; /**< from microphone input */ QByteArray iFrame ; float iVolumeLevel ; /**< avg volume level in this 60ms snippet */ } AudioFrame ; typedef struct AudioStreamMetadata { quint32 iCallId ; quint32 iStartingSeq ; /** * This is remote sequence number. Justification: seqno is for * ordering the packets. Our own microphone data will arrive in * correct order. Here store only seqno of streams sent over * network that are suspectible to droppage,re-ordering and multiplication */ quint32 iMaxSeqSeen; Hash iNode ; /**< fingerprint of node that transmits this stream */ bool iIsLocallyCaptured ; /**< concerns microphone input */ } AudioFrameMetadata ; /** * Voice data buffer. Must share same indexing with iStreams e.g. * if stream metadata for call x is in iStreams[y] then call data * for that stream needs to go to queue strictly at iAudioDataBuffer[y] */ QList > iAudioDataBuffer ; /** Metadata of streams being served */ QList iStreams ; /** List of indexes to iStreams that are mixed into speaker output */ QList iIndexesToMixForLocalSpeaker ; /** List of indexes to iStreams that are mixed into remote nodes */ QList iIndexesToMixForRemoteOutput ; Model& iModel ; /**< datamodel */ } ; #endif classified-ads-0.13/call/audioplayer.cpp000066400000000000000000000145141331670245300202560ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "audioplayer.h" #include #include "../log.h" #include #include "../datamodel/model.h" #include AudioPlayer::AudioPlayer(Model& aModel , int aFrequency , int aNumChannels , int aSampleSize ) : iAudioOutput(NULL), iNeedsToRun(true) , iModel(aModel), iFrequency(aFrequency), iNumChannels(aNumChannels), iSampleSize(aSampleSize) { QLOG_STR("AudioPlayer::AudioPlayer() fr " + QString::number(aFrequency) + " size " + QString::number(aSampleSize)) ; #if QT_VERSION < 0x050000 iFormat.setChannels(aNumChannels); iFormat.setFrequency(aFrequency); #else iFormat.setChannelCount(aNumChannels); iFormat.setSampleRate(aFrequency) ; #endif iFormat.setSampleSize(aSampleSize); iFormat.setCodec("audio/pcm"); // data is later fed to opus codec and that expects samples // in native byte order: #if Q_BYTE_ORDER == Q_BIG_ENDIAN iFormat.setByteOrder(QAudioFormat::BigEndian); QLOG_STR("QAudioFormat::BigEndian") ; #else iFormat.setByteOrder(QAudioFormat::LittleEndian); QLOG_STR("QAudioFormat::LittleEndian") ; #endif iFormat.setSampleType(QAudioFormat::SignedInt); QAudioDeviceInfo defaultDevice ( QAudioDeviceInfo::defaultOutputDevice() ) ; QAudioDeviceInfo info( defaultDevice ); if (!info.isFormatSupported(iFormat)) { emit error(0,tr("raw audio format not supported by backend, cannot play audio.")); return; } QLOG_STR("Output dev " + info.deviceName()) ; iAudioOutput = new QAudioOutput(defaultDevice,iFormat, this); if ( iAudioOutput != NULL ) { iAudioOutput->setNotifyInterval(60) ; connect(iAudioOutput, SIGNAL(notify()), this, SLOT(notify())) ; if ( iAudioOutput->format() != iFormat ) { QLOG_STR("Format was not supported") ; } connect(iAudioOutput,SIGNAL(stateChanged(QAudio::State)),SLOT(finishedPlaying(QAudio::State))); open(QIODevice::ReadOnly) ; iAudioOutput->start(this); iAudioOutput->suspend() ; } else { emit error(0,tr("Could not initialize audio player.")); } } AudioPlayer::~AudioPlayer() { QLOG_STR("AudioPlayer::~AudioPlayer()") ; if ( iAudioOutput ) { if ( iAudioOutput->state() != QAudio::StoppedState ) { iAudioOutput->stop() ; } delete iAudioOutput ; iAudioOutput = NULL ; } } // this slot is connected in synhronous way and called so // that datamodel lock is on. void AudioPlayer::insertAudioFrame ( const QByteArray& aFrame ){ // always append in into buffer .. but if buffer is very large // already, just discard the frame and some of buffers content if ( ( iAudioBuffer.size() / (int)( iNumChannels * sizeof(qint16) ) ) > iFrequency * 5 ) { iAudioBuffer.clear() ; QLOG_STR( "buffer reset" ) ; } else { const float signed16BitIntMax = (float)(std::numeric_limits::max()-1) ; float audioSum ( 0 ) ; QByteArray convertedSamples ; int numberOfSamples = aFrame.size() / sizeof(float) ; float* samples((float *)( aFrame.data() )) ; convertedSamples.fill(0,numberOfSamples*sizeof(qint16)) ; qint16* convertedSamplesData((qint16 *)( convertedSamples.data() )) ; for ( int i = 0 ; i < numberOfSamples ; i++ ) { if ( samples[i] < 1.0 && samples[i] > -1.0 ) { convertedSamplesData[i] = (qint16)((samples[i]) * signed16BitIntMax ) ; audioSum += qAbs(samples[i]) ; } } if ( convertedSamples.size() > 0 ) { iAudioBuffer.append(convertedSamples) ; emit readyRead() ; emit audioMaxLevel(audioSum/(float)numberOfSamples) ; } } if (iAudioOutput && iAudioOutput->state() == QAudio::SuspendedState && iAudioBuffer.size() > 2000 ) { iAudioOutput->resume() ; } } void AudioPlayer::finishedPlaying ( QAudio::State aState ) { QLOG_STR("AudioPlayer::finishedPlaying state " + QString::number(aState)) ; if ( aState == QAudio::StoppedState ) { deleteLater() ; } if ( aState == QAudio::IdleState && iAudioOutput ) { iAudioOutput->suspend() ; // lets resume when there is bytes in buffer } } void AudioPlayer::stop() { iNeedsToRun = false ; } void AudioPlayer::notify() { if ( iNeedsToRun == false && iAudioOutput) { QLOG_STR("AudioPlayer:: notify stopped player ") ; iAudioOutput->stop() ; } } // from QIODevice: qint64 AudioPlayer::writeData ( const char * /*data*/, qint64 /*maxSize*/ ) { return 0 ; } // From QIODevice: audio data goes to sound card via this method qint64 AudioPlayer::readData ( char * data, qint64 maxSize ) { qint64 bytesToWrite = maxSize ; // bytes to write into buffer of player iModel.lock() ; // do mixing behind lock if ( iAudioBuffer.size() < bytesToWrite ) { bytesToWrite = iAudioBuffer.size() ; } if ( bytesToWrite > 0 ) { memcpy(data, iAudioBuffer.constData(), bytesToWrite) ; iAudioBuffer.remove(0,bytesToWrite) ; } iModel.unlock() ; return bytesToWrite ; } // from QIODevice: bool AudioPlayer::open ( OpenMode mode ) { if ( mode & QIODevice::ReadOnly ) { return QIODevice::open(mode) ; } else { return false ; } } classified-ads-0.13/call/audioplayer.h000066400000000000000000000110401331670245300177120ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef AUDIO_PLAYER_H #define AUDIO_PLAYER_H #include #include #include #include class Model ; /** * @brief Class for playback of audio stream, via speaker or other audio dev. * * * This class encapsulates audio output device and expects input * as array of floats. */ class AudioPlayer : public QIODevice { Q_OBJECT public: /** * Constructor. Currently only samplesize 16 is supported, * all other sizes will output only noise. Also see input data * format at @ref insertAudioFrame method. * * @param aFrequency is number of samples per second * @param aNumChannels is number of channels in stream * @param aSampleSize is number of bits in each sample. * As currently the audio format is in array of floats * that are anyway in native format and in [-1,1] range * this parameter is a little bit meaningless. */ AudioPlayer(Model& aModel, int aFrequency = 8000, int aNumChannels = 1, int aSampleSize = 16 ) ; ~AudioPlayer() ; /** * method for stopping playback */ void stop() ; // next methods inherited from QIODevice: public: virtual qint64 bytesAvailable () const { return iAudioBuffer.size() + QIODevice::bytesAvailable(); } protected: /** * Write-method of QIODevice - QIODevice here is used for * feeding the player and data is actually written using * @ref insertAudioFrame method so implementation of * this method is actually empty. * * @param data that will not be written anywhere. * @param maxSize max data size to be not written * * @return always 0 */ virtual qint64 writeData ( const char * data, qint64 maxSize ) ; /** * From QIODevice: method that QAudioOutput class instance will * use to read the actual audio data. Data comes from internal * buffer and is inserted into buffer using @ref insertAudioFrame. * * @param data pointer to buffer where data will be written * @param maxSize max data size available in buffer * * @return number of bytes actually written into buffer */ virtual qint64 readData ( char * data, qint64 maxSize ) ; /** * method for opening QIODevice: sets the open mode that's about it. */ virtual bool open ( OpenMode mode ) ; /* * method for opening QIODevice: tells that this is no random-access * device. * * @return true always */ virtual bool isSequential () const { return true ; // is not random-access, } signals: /** * this is not method but signal ; if in error, get emit()ted */ void error(int aError, const QString& aExplanation) ; /** * signals that communicates max value of a outputted frame */ void audioMaxLevel(float aMaxVolume) ; public slots: /** * Method/slot for playing back snippet of audio. * * @param aFrame 32-bit, native-encoding, floating point format * audio/pcm data in 8kHz. Floating point range in [-1,1]. */ void insertAudioFrame ( const QByteArray& aFrame ); /** * Notify slot from actual player device */ void finishedPlaying ( QAudio::State aState ); /** * notify from audio output device */ void notify() ; private: // members QAudioFormat iFormat; QAudioOutput* iAudioOutput ; QByteArray iAudioBuffer ; /**< first buffered here, then written in chunks */ bool iNeedsToRun ; Model& iModel ; /** datamodel */ const int iFrequency ; const int iNumChannels ; const int iSampleSize ; } ; #endif classified-ads-0.13/call/audiosource.cpp000066400000000000000000000144341331670245300202630ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "audiosource.h" #include #include #include #include "../log.h" #include "../datamodel/model.h" #include /** how long time is recorded into each packet */ const int KProcessPacketSizeMilliSec ( 60 ) ; /** sound card sample rate */ const int KSampleRate ( 8000 ) ; /** how many bits per each sample */ const int KSampleSizeBits ( 16 ) ; /** record in mono, stereo would count as multimedia */ const int KChannelCount ( 1 ) ; AudioSource::AudioSource( Model& aModel ) : iAudioInput(NULL) , iSeqNo ( 0 ) , iNeedsToRun(true), iModel(aModel), iTimerId(-1) { #if QT_VERSION < 0x050000 iFormat.setChannels(KChannelCount); iFormat.setFrequency(KSampleRate); #else iFormat.setChannelCount(KChannelCount); iFormat.setSampleRate(KSampleRate) ; #endif iFormat.setSampleSize(KSampleSizeBits); iFormat.setCodec("audio/pcm"); // data is later fed to opus codec and that expects samples // in native byte order: #if Q_BYTE_ORDER == Q_BIG_ENDIAN iFormat.setByteOrder(QAudioFormat::BigEndian); QLOG_STR("QAudioFormat::BigEndian") ; #else iFormat.setByteOrder(QAudioFormat::LittleEndian); QLOG_STR("QAudioFormat::LittleEndian") ; #endif // There seems to be problems with both Float type and // unsigned int type, at least in linux. Opus library in // turn wants uint16 or float so some conversion later // will be in order. iFormat.setSampleType(QAudioFormat::SignedInt); QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice(); if (!info.isFormatSupported(iFormat)) { iFormat = info.nearestFormat(iFormat); } QLOG_STR(info.deviceName()) ; QAudioDeviceInfo defaultDevice ( QAudioDeviceInfo::defaultInputDevice() ) ; iAudioInput = new QAudioInput(defaultDevice, iFormat, this); connect(iAudioInput, SIGNAL(stateChanged(QAudio::State)), this, SLOT(inputStatusChanged(QAudio::State))) ; if ( this->open(QIODevice::WriteOnly) ) { iAudioInput->start(this); } else { QLOG_STR("ERROR: Audio buffer open failed??") ; } iTimerId = startTimer(KProcessPacketSizeMilliSec) ; } AudioSource::~AudioSource() { QLOG_STR("AudioSource::~AudioSource") ; if( iTimerId != -1 ) { killTimer(iTimerId) ; } if( iAudioInput ) { iAudioInput->stop() ; delete iAudioInput ; } } void AudioSource::inputStatusChanged(QAudio::State aState) { QLOG_STR("AudioSource::inputStatusChanged " + QString::number(aState)) ; if ( aState == QAudio::StoppedState ) { deleteLater() ; } } void AudioSource::processCapturedAudio() { if ( iNeedsToRun ) { /** how many bytes we have in buffer for one frame: */ const int frameSize ( ( ( KSampleRate / 1000 ) * KProcessPacketSizeMilliSec) * KChannelCount * sizeof(qint16) ) ; const float signed16BitIntMax = (float)(std::numeric_limits::max()-1) ; while ( iAudioBuffer.size() >= frameSize ) { QByteArray audioDataAsFloats ; QByteArray capturedFrame(iAudioBuffer.left(frameSize)) ; int numberOfSamples = capturedFrame.size() / sizeof(qint16) ; audioDataAsFloats.fill(0,sizeof(float)*numberOfSamples) ; float volumeSum ( 0.0f ) ; qint16* samples((qint16 *)( capturedFrame.data() )) ; float* convertedSamples((float *)( audioDataAsFloats.data() )) ; float value ( 0.0f ) ; numberOfSamples-- ; for ( ; numberOfSamples >= 0 ; numberOfSamples-- ) { value = samples[numberOfSamples] ; // in float presentation the samples need to have // numerical value between [-1,1] so lets scale the // values ; value = ( value / signed16BitIntMax ) ; convertedSamples[numberOfSamples] = value ; volumeSum = volumeSum + qAbs( value ) ; } float volumeLevel ( volumeSum/(float)(capturedFrame.size() / sizeof(qint16) ) ) ; emit frameCaptured(audioDataAsFloats, iSeqNo++, volumeLevel) ; iAudioBuffer.remove(0,frameSize); emit audioMaxLevel(volumeLevel) ; } } else if( iAudioInput ) { if ( iAudioInput->state() == QAudio::ActiveState || iAudioInput->state() == QAudio::IdleState ) { iAudioInput->stop() ; } else { deleteLater() ; } } } void AudioSource::stopCapturing() { iNeedsToRun = false ; } // from QIODevice: qint64 AudioSource::writeData ( const char * data, qint64 maxSize ) { if ( iNeedsToRun ) { iModel.lock() ; // do mixing behind lock iAudioBuffer.append(data,maxSize) ; iModel.unlock() ; // do mixing behind lock } return maxSize ; } // From QIODevice qint64 AudioSource::readData ( char * /*data*/, qint64 /*maxSize*/ ) { return 0 ; } // from QIODevice: bool AudioSource::open ( OpenMode mode ) { if ( mode & QIODevice::WriteOnly ) { return QIODevice::open(mode) ; } else { return false ; } } void AudioSource::timerEvent(QTimerEvent* /* event */ ) { iModel.lock() ; // do processing behind a lock processCapturedAudio() ; iModel.unlock() ; // do mixing behind lock } classified-ads-0.13/call/audiosource.h000066400000000000000000000077231331670245300177330ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef AUDIO_SOURCE_H #define AUDIO_SOURCE_H #include #include // type definitions #include #include #include class QAudioInput ; class Model ; /** * @brief opposite of audiosink. * * Class for capturing audio. This class provides 16-bit * PCM digital audio in 8kHz sample rate in pieces of * 480 samples, each exactly 60ms long. Output format is * in floating point numbers in range [0,1]. */ class AudioSource : public QIODevice { Q_OBJECT public: /** * Constructor. */ AudioSource(Model& aModel) ; ~AudioSource() ; /** * getter-method for next sequence number */ quint32 getCurrentSeqNo() const { return iSeqNo ; } ; /** * method for stopping capture */ void stopCapturing() ; // next methods inherited from QIODevice: protected: /** * From QIODevice: method where audio data will be written * from actual audio source: this class AudioSource inherits * QIODevice and will offer itself as data sink of iAudioInput * @param data audio data * @param maxSize max data size to be written * @return number of bytes actually written */ virtual qint64 writeData ( const char * data, qint64 maxSize ) ; /** * From QIODevice: in current implementation this method * does nothing, audio is processed internally and this * QIODevice implementation does not allow reading. * @return 0 always */ virtual qint64 readData ( char * data, qint64 maxSize ) ; /** * method for opening QIODevice: sets the open mode that's about it. */ virtual bool open ( OpenMode mode ) ; /* * method for opening QIODevice: tells that this is no random-access * device. * * @return true always */ virtual bool isSequential () const { return true ; // is not random-access, } /** * From QObject. Used for forwarding audio from buffer. */ void timerEvent(QTimerEvent *event); signals: /** * Emitted when complete audio frame is ready to be processed * @param aFrame is the audio data. Content of the byte array is * floats in range [-1,1] * @param aSeqNo sequence number of the captured frame, it will * sequentially increase as time passes * @param aVolumeLevel calculated average volume level * of frame ; will be used by audio mixer */ void frameCaptured(const QByteArray& aFrame, quint32 aSeqNo, float aVolumeLevel) ; /** * This is actually average audio volume, in range [0,1] */ void audioMaxLevel(float aMaxVolume) ; public slots: /** * Method called by timer every now and then that does processing * of captured data */ void processCapturedAudio() ; /** * Input status changed */ void inputStatusChanged(QAudio::State aState) ; private: // members QAudioFormat iFormat; QAudioInput* iAudioInput ; QByteArray iAudioBuffer ; quint32 iSeqNo ; bool iNeedsToRun ; Model& iModel ; int iTimerId ; } ; #endif classified-ads-0.13/call/callbuttondelegate.cpp000066400000000000000000000066561331670245300216120ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "callbuttondelegate.h" #include #include "../net/voicecallengine.h" #include "../log.h" const int KCallButtonHeight ( 30 ) ; CallButtonDelegate::CallButtonDelegate(VoiceCallEngine& aCallEngine, QObject* aParent) : QItemDelegate(aParent), iCallEngine(aCallEngine) { } CallButtonDelegate::~CallButtonDelegate() { } // idea stolen from // http://stackoverflow.com/questions/11777637/adding-button-to-qtableview // so thanks SingerOfTheFall and Kim Bowles SУИrhus void CallButtonDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionButton button; QRect r = option.rect;//getting the rect of the cell int x,y,w,h; x = r.left();//the X coordinate y = r.top();//the Y coordinate w = r.width();// fill whole rectangle h = KCallButtonHeight;//button height button.rect = QRect(x,y,w,h); button.text = iCallEngine.data(index,Qt::DisplayRole).toString(); button.state = QStyle::State_Enabled; QApplication::style()->drawControl( QStyle::CE_PushButton, &button, painter); } bool CallButtonDelegate::editorEvent(QEvent *event, QAbstractItemModel * /* model */ , const QStyleOptionViewItem &option, const QModelIndex &index) { if( event->type() == QEvent::MouseButtonRelease ) { QMouseEvent * e = (QMouseEvent *)event; int clickX = e->x(); int clickY = e->y(); QRect r = option.rect;//getting the rect of the cell int x,y,w,h; x = r.left() ;//the X coordinate y = r.top();//the Y coordinate w = r.width();//button width should fill whole rectangle h = KCallButtonHeight ;// height constant if( clickX > x && clickX < x + w ) if( clickY > y && clickY < y + h ) { const int callId ( iCallEngine.data(index, Qt::UserRole).toInt() ); switch ( index.column() ) { case 3: // accept call iCallEngine.acceptCall(callId) ; break ; case 4: // end/reject call iCallEngine.closeCall(callId) ; break ; default: QLOG_STR("Huh, editor-event in colum with no editor?") ; break ; } } } return true ; } classified-ads-0.13/call/ringtoneplayer.cpp000066400000000000000000000255701331670245300210060ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ const int KRingtoneBufSize ( 4096 ) ; const int KRingtoneSampleRate ( 8000 ) ; const int KPlayerBufferSize ( 1024 * 16 ) ; #ifdef WIN32 #define NOMINMAX #include // for ntohl #else #include "arpa/inet.h" // for ntohl #endif #include "ringtoneplayer.h" #include "../log.h" #include #include #include // for beep() RingtonePlayer::RingtonePlayer(Model& aModel, MController& aController) : iAudioOutput(NULL), iNeedsToRun(true) , iRingtoneFile(NULL), iTimerId (-1), iDecoder(NULL), iMutex(NULL), iModel(aModel), iController(aController) { switch ( aModel.getRingtoneSetting() ) { case Model::BowRingTone: case Model::ElectricalRingTone: case Model::AcousticRingTone : case Model::BeepRingTone : { // normal ringtones #if QT_VERSION < 0x050000 iFormat.setChannels(1); iFormat.setFrequency(KRingtoneSampleRate); #else iFormat.setChannelCount(1); iFormat.setSampleRate(KRingtoneSampleRate) ; #endif iFormat.setSampleSize(16); iFormat.setCodec("audio/pcm"); // data is later fed to opus codec and that expects samples // in native byte order: #if Q_BYTE_ORDER == Q_BIG_ENDIAN iFormat.setByteOrder(QAudioFormat::BigEndian); QLOG_STR("QAudioFormat::BigEndian") ; #else iFormat.setByteOrder(QAudioFormat::LittleEndian); QLOG_STR("QAudioFormat::LittleEndian") ; #endif iMutex = new QMutex() ; iFormat.setSampleType(QAudioFormat::SignedInt); QAudioDeviceInfo defaultDevice ( QAudioDeviceInfo::defaultOutputDevice() ) ; QAudioDeviceInfo info( defaultDevice ); if (!info.isFormatSupported(iFormat)) { emit error(0,tr("raw audio format not supported by backend, cannot play audio.")); return; } QLOG_STR("Output dev " + info.deviceName()) ; iAudioOutput = new QAudioOutput(defaultDevice,iFormat, this); if ( iAudioOutput != NULL ) { iAudioOutput->setNotifyInterval(60) ; connect(iAudioOutput, SIGNAL(notify()), this, SLOT(notify())) ; if ( iAudioOutput->format() != iFormat ) { QLOG_STR("Format was not supported") ; } connect(iAudioOutput,SIGNAL(stateChanged(QAudio::State)),SLOT(finishedPlaying(QAudio::State))); open(QIODevice::ReadOnly) ; } else { emit error(0,tr("Could not initialize audio player.")); } iTimerId = startTimer(30) ; VoiceCallEngine* eng (iController.voiceCallEngine()) ; if ( eng ) { eng->installObserver(this) ; } } break ; case Model::NoRingTone : // user requested silence so get out immediately deleteLater() ; break ; default: // should not happen break ; } } RingtonePlayer::~RingtonePlayer() { QLOG_STR("RingtonePlayer::~RingtonePlayer()") ; VoiceCallEngine* eng (iController.voiceCallEngine()) ; if ( eng ) { eng->removeObserver(this) ; } if ( iTimerId > -1 ) { killTimer(iTimerId) ; } if ( iAudioOutput ) { if ( iAudioOutput->state() != QAudio::StoppedState ) { iAudioOutput->stop() ; } delete iAudioOutput ; iAudioOutput = NULL ; } if ( iRingtoneFile ) { iRingtoneFile->close() ; delete iRingtoneFile ; iRingtoneFile = NULL ; } if ( iDecoder ) { opus_decoder_destroy(iDecoder) ; iDecoder = NULL ; } if ( iMutex ) { delete iMutex ; } } void RingtonePlayer::finishedPlaying ( QAudio::State aState ) { QLOG_STR("RingtonePlayer::finishedPlaying state " + QString::number(aState)) ; if ( aState == QAudio::StoppedState ) { deleteLater() ; } if ( aState == QAudio::IdleState && iAudioOutput ) { iAudioOutput->suspend() ; // lets resume when there is bytes in buffer } } void RingtonePlayer::stop() { iNeedsToRun = false ; } void RingtonePlayer::notify() { if ( iNeedsToRun == false && iAudioOutput) { QLOG_STR("RingtonePlayer:: notify stopped player ") ; iAudioOutput->stop() ; } } // from QIODevice: qint64 RingtonePlayer::writeData ( const char * /*data*/, qint64 /*maxSize*/ ) { return 0 ; } // From QIODevice: audio data goes to sound card via this method qint64 RingtonePlayer::readData ( char * data, qint64 maxSize ) { qint64 bytesToWrite = maxSize; // bytes to write into buffer of player iMutex->lock() ; if ( iAudioBuffer.size() < bytesToWrite ) { bytesToWrite = iAudioBuffer.size() ; } if ( bytesToWrite > 0 ) { memcpy(data, iAudioBuffer.constData(), bytesToWrite) ; iAudioBuffer.remove(0,bytesToWrite) ; QLOG_STR("RingtonePlayer::readData " + QString::number(bytesToWrite) + " asked " + QString::number(maxSize) ) ; } iMutex->unlock() ; return bytesToWrite ; } // from QIODevice: bool RingtonePlayer::open ( OpenMode mode ) { if ( mode & QIODevice::ReadOnly ) { return QIODevice::open(mode) ; } else { return false ; } } void RingtonePlayer::timerEvent(QTimerEvent* /* event */ ) { if ( iNeedsToRun == false && iAudioOutput) { QLOG_STR("RingtonePlayer:: timerEvent stopped player ") ; iAudioOutput->stop() ; } else { iMutex->lock() ; int audioBufferSize = iAudioBuffer.size() ; iMutex->unlock() ; while (audioBufferSize <= (KPlayerBufferSize*2) ) { if ( iRingtoneFile == NULL || iRingtoneFile->atEnd()== true ) { initInput() ; } QByteArray audioCompressed ; if ( iRingtoneFile && iRingtoneFile->isOpen() ) { qint32 bytesToReadNetworkBo ( 0 ) ; if ( iRingtoneFile->read((char *)&bytesToReadNetworkBo, sizeof(quint32)) == sizeof(quint32)) { qint32 bytesToRead ( ntohl(bytesToReadNetworkBo ) ) ; audioCompressed.append ( iRingtoneFile->read(bytesToRead) ) ; } } if ( audioCompressed.size() && iDecoder ) { int resultLen = opus_decode(iDecoder, (const unsigned char*)(audioCompressed.constData()), audioCompressed.size() , (qint16*)(iDecodedData.data()), iDecodedData.size(), 0); if (resultLen < 0) { QLOG_STR( "opus_decode() failed with error code: " + QString::number(resultLen)); } else { iMutex->lock() ; iAudioBuffer.append(iDecodedData.mid(0,resultLen*sizeof(qint16))); if (iAudioOutput && iNeedsToRun && iAudioOutput->state() == QAudio::SuspendedState && iAudioBuffer.size() > KPlayerBufferSize ) { iAudioOutput->resume() ; } else if (iAudioOutput && iNeedsToRun && iAudioOutput->state() == QAudio::StoppedState && iAudioBuffer.size() > KPlayerBufferSize ) { iAudioOutput->start(this) ; } iMutex->unlock() ; } } iMutex->lock() ; audioBufferSize = iAudioBuffer.size() ; iMutex->unlock() ; } } } void RingtonePlayer::initInput() { if ( iRingtoneFile == NULL ) { switch ( iModel.getRingtoneSetting() ) { default: // also the default case Model::BowRingTone: QLOG_STR("Opening :/ui/ui/bow.rawopus") ; iRingtoneFile = new QFile(":/ui/ui/bow.rawopus") ; // in resource break ; case Model::ElectricalRingTone: QLOG_STR("Opening :/ui/ui/electrical.rawopus") ; iRingtoneFile = new QFile(":/ui/ui/electrical.rawopus") ; break ; case Model::AcousticRingTone : QLOG_STR("Opening :/ui/ui/acoustic.rawopus") ; iRingtoneFile = new QFile(":/ui/ui/acoustic.rawopus") ; break ; case Model::BeepRingTone : QLOG_STR("Opening :/ui/ui/beep.rawopus") ; iRingtoneFile = new QFile(":/ui/ui/beep.rawopus") ; break ; } if ( iRingtoneFile && iRingtoneFile->open(QIODevice::ReadOnly) ) { QLOG_STR("Ringtone file open") ; } else { QLOG_STR("Ringtone file NOT open!!, error = " + QString::number(iRingtoneFile==NULL ? -999 : iRingtoneFile->error()) + " " + ( iRingtoneFile==NULL ? " " : iRingtoneFile->errorString() ) ) ; deleteLater() ; iNeedsToRun = false ; } } else { iRingtoneFile->seek(0) ; QLOG_STR("Ringtone file seeked") ; } int errorCode ; if( iDecoder == NULL ) { iDecoder = opus_decoder_create(KRingtoneSampleRate, 1, &errorCode ); if ( errorCode != OPUS_OK || iDecoder == NULL ) { QLOG_STR( "opus_decoder_create " + QString::number(errorCode)) ; } iDecodedData.fill ( 0, KRingtoneBufSize ) ; QLOG_STR("Ringtone decoder created") ; } else { opus_decoder_init(iDecoder,KRingtoneSampleRate,1) ; QLOG_STR("Ringtone decoder reset") ; } } void RingtonePlayer::callStatusChanged(quint32 /* aCallId */, VoiceCallEngine::CallState aState) { if ( aState != MVoiceCallEngine::Incoming ) { stop() ; } } classified-ads-0.13/call/ringtoneplayer.h000066400000000000000000000111031331670245300204360ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2016. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef RINGTONE_PLAYER_H #define RINGTONE_PLAYER_H #include #include #include #include #include // for data types #include "../net/voicecallengine.h" // for MCallStatusObserver #include "../mcontroller.h" #include "../datamodel/model.h" class QFile ; class QMutex ; /** * @brief Class for alerting user in case of incoming call * * Class that plays selected ringtone or remains silent, * depending on users selections. */ class RingtonePlayer : public QIODevice, public VoiceCallEngine::MCallStatusObserver { Q_OBJECT public: /** * Constructor. When constructed, immediately begins to * play. There is method for stop, and there is destructor. * Destructor should not be called, calling stop will cause * this class to deleteLater() itself. */ RingtonePlayer(Model& aModel, MController& aController ) ; ~RingtonePlayer() ; /** * From QObject. Used for feeding ringtone data to audio device */ void timerEvent(QTimerEvent *event); /** * Method that communicates changes in call state. From * interface MCallStatusObserver. */ virtual void callStatusChanged(quint32 aCallId, VoiceCallEngine::CallState aState) ; // next methods inherited from QIODevice: public: virtual qint64 bytesAvailable () const { return iAudioBuffer.size() + QIODevice::bytesAvailable(); } protected: /** * Write-method of QIODevice - QIODevice here is used for * feeding the player and data is actually written using * @ref insertAudioFrame method so implementation of * this method is actually empty. * * @param data that will not be written anywhere. * @param maxSize max data size to be not written * * @return always 0 */ virtual qint64 writeData ( const char * data, qint64 maxSize ) ; /** * From QIODevice: method that QAudioOutput class instance will * use to read the actual audio data. Data comes from internal * buffer and is inserted into buffer using @ref insertAudioFrame. * * @param data pointer to buffer where data will be written * @param maxSize max data size available in buffer * * @return number of bytes actually written into buffer */ virtual qint64 readData ( char * data, qint64 maxSize ) ; /** * method for opening QIODevice: sets the open mode that's about it. */ virtual bool open ( OpenMode mode ) ; /* * method for opening QIODevice: tells that this is no random-access * device. * * @return true always */ virtual bool isSequential () const { return true ; // is not random-access, } signals: /** * this is not method but signal ; if in error, get emit()ted */ void error(int aError, const QString& aExplanation) ; public slots: /** * Notify slot from actual player device */ virtual void finishedPlaying ( QAudio::State aState ); /** * notify from audio output device */ virtual void notify() ; /** * method for stopping playback */ void stop() ; private: // methods /** * initializes input and codec */ void initInput() ; private: // members QAudioFormat iFormat; QAudioOutput* iAudioOutput ; QByteArray iAudioBuffer ; /**< first buffered here, then written in chunks */ bool iNeedsToRun ; QFile* iRingtoneFile ; int iTimerId ; OpusDecoder* iDecoder ; /**< ringtones are also opus-coded */ QByteArray iDecodedData ; QMutex* iMutex ; Model& iModel ; MController& iController ; } ; #endif classified-ads-0.13/classified-ads.1000066400000000000000000000022361331670245300172540ustar00rootroot00000000000000.\" Hey, EMACS: -*- nroff -*- .TH "CLASSIFIED_ADS" 1 "Mar 01 2015" .SH NAME classified-ads \- Program for posting ads online for others to see .SH SYNOPSIS .B classified-ads .SH DESCRIPTION Classified ads is a program for online communications. Main features include server-less design, public announcements, private messages, user data and comments. For longer explanation of the program, please see "About" dialog inside the program. .SH FILES For each individual user a file $HOME/.classified_ads/sqlite_db is created. This is a normal sqlite database that contains state of the program. For backup purpose a copy may be made and later restored while the program is not running. Restoring an old file fully resets the programs state to moment when backup was taken. Upon uninstall of the program, the datafile is left lingering around. Users who are sure they'll never use the program again should delete the file by hand. Note that users' encryption keys are inside this file among other data so deleting the file will affect users' ability to access private messages later. .SH AUTHOR Classified ads is copyright Antti Jarvinen 2015. classified-ads-0.13/classified-ads.pro000066400000000000000000000216441331670245300177200ustar00rootroot00000000000000# # Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. # # This file is part of Classified Ads. # # Classified Ads is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # Classified Ads 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Classified Ads; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # QT += core network sql multimedia greaterThan(QT_MAJOR_VERSION, 4) { QT += widgets printsupport } #CONFIG += debug #CONFIG -= release CONFIG(release) { message("hardening flags for release build") unix:QMAKE_CPPFLAGS *= $$(CA_QMAKE_CPPFLAGS) unix:QMAKE_CFLAGS *= $$(CA_QMAKE_CFLAGS) unix:QMAKE_CXXFLAGS *= $$(CA_QMAKE_CXXFLAGS) unix:QMAKE_LFLAGS *= $$(CA_QMAKE_LDFLAGS) } else { message("debug build, no hardening") # enabled -DDEBUG to have console log via qDebug() QMAKE_CXXFLAGS += -DDEBUG win32.CONFIG += console } QMAKE_CXXFLAGS += $$(RPM_OPT_FLAGS) QMAKE_LFLAGS += $$(RPM_LD_FLAGS) CODECFORTR = UTF-8 CODECFORSRC = UTF-8 QMAKE_EXTRA_TARGETS += translations_compile PRE_TARGETDEPS += translations_compile unix { translations_compile.commands = cd po ; $(MAKE) QMAKE_EXTRA_TARGETS += test test.target = check test.depends = testca/testca.cpp test.commands = cd testca ; $(QMAKE) ; $(MAKE) ; mkdir test_home ; export HOME=`pwd`/test_home ; ./testca ; rm -rf test_home ; cd .. ; touch check QMAKE_CLEAN += po/*.mo check testca/testca testca/Makefile } win32 { translations_compile.commands = $(MAKE) -C po MSGFMT_PATH=/msys32/usr/local/bin/ QMAKE_CLEAN += po\*.mo } HEADERS = mcontroller.h controller.h FrontWidget.h net/node.h util/hash.h \ net/connection.h datamodel/model.h \ net/networklistener.h net/protocol_message_formatter.h \ net/protocol_message_parser.h net/networkconnectorengine.h \ datamodel/nodemodel.h datamodel/netrequestexecutor.h \ datamodel/contentencryptionmodel.h ui/passwd_dialog.h \ datamodel/profilemodel.h datamodel/profile.h \ net/publishingengine.h datamodel/mmodelprotocolinterface.h \ datamodel/mnodemodelprotocolinterface.h ui/profilereadersdialog.h \ datamodel/profilesearchmodel.h datamodel/profilereaderslistingmodel.h \ datamodel/binaryfilemodel.h datamodel/binaryfile.h \ datamodel/binaryfilelistingmodel.h datamodel/camodel.h \ ui/newclassifiedaddialog.h datamodel/ca.h \ datamodel/calistingmodel.h net/retrievalengine.h datamodel/privmsg.h \ datamodel/privmsgmodel.h ui/newprivmsgdialog.h \ datamodel/privmsgsearchmodel.h datamodel/contact.h \ datamodel/contactlistingmodel.h ui/editcontact.h \ datamodel/datamodelbase.h datamodel/profilecomment.h \ datamodel/profilecommentmodel.h ui/newprofilecommentdialog.h \ datamodel/profilecommentlistingmodel.h ui/profilecommentdisplay.h \ ui/profilecommentitemdelegate.h ui/dialogbase.h \ ui/attachmentlistdialog.h ui/settings.h ui/status.h \ datamodel/connectionlistingmodel.h ui/manualconnection.h \ ui/aboutdialog.h textedit/textedit.h datamodel/searchmodel.h \ ui/searchdisplay.h ui/insertlinkdialog.h ui/newtextdocument.h \ datamodel/trusttreemodel.h ui/metadataQuery.h util/jsonwrapper.h \ util/catranslator.h datamodel/voicecall.h net/voicecallengine.h \ ui/callstatus.h ui/callbuttondelegate.h net/mvoicecallengine.h \ call/audiosource.h call/audiomixer.h call/audioplayer.h \ call/audioencoder.h call/audiodecoder.h call/ringtoneplayer.h \ ui/tclPrograms.h ui/tclConsole.h tcl/tclWrapper.h \ datamodel/tclprogram.h datamodel/tclmodel.h tcl/tclCallbacks.h \ tcl/tclUtil.h datamodel/cadbrecord.h datamodel/cadbrecordmodel.h \ net/dbretrievalengine.h util/ungzip.h SOURCES = main.cpp controller.cpp FrontWidget.cpp net/node.cpp util/hash.cpp \ net/connection.cpp datamodel/model.cpp \ net/networklistener.cpp net/protocol_message_formatter.cpp \ net/protocol_message_parser.cpp net/networkconnectorengine.cpp \ datamodel/nodemodel.cpp datamodel/netrequestexecutor.cpp \ datamodel/contentencryptionmodel.cpp ui/passwd_dialog.cpp \ datamodel/profilemodel.cpp datamodel/profile.cpp \ net/publishingengine.cpp ui/profilereadersdialog.cpp \ datamodel/profilesearchmodel.cpp \ datamodel/profilereaderslistingmodel.cpp \ datamodel/binaryfilemodel.cpp datamodel/binaryfile.cpp \ datamodel/binaryfilelistingmodel.cpp datamodel/camodel.cpp \ ui/newclassifiedaddialog.cpp datamodel/ca.cpp \ datamodel/calistingmodel.cpp net/retrievalengine.cpp \ datamodel/privmsg.cpp datamodel/privmsgmodel.cpp \ ui/newprivmsgdialog.cpp datamodel/privmsgsearchmodel.cpp \ datamodel/contact.cpp datamodel/contactlistingmodel.cpp \ ui/editcontact.cpp datamodel/datamodelbase.cpp \ datamodel/profilecomment.cpp datamodel/profilecommentmodel.cpp \ ui/newprofilecommentdialog.cpp \ datamodel/profilecommentlistingmodel.cpp ui/profilecommentdisplay.cpp \ ui/profilecommentitemdelegate.cpp ui/dialogbase.cpp \ ui/attachmentlistdialog.cpp ui/settings.cpp ui/status.cpp \ datamodel/connectionlistingmodel.cpp ui/manualconnection.cpp \ ui/aboutdialog.cpp textedit/textedit.cpp datamodel/searchmodel.cpp \ ui/searchdisplay.cpp ui/insertlinkdialog.cpp ui/newtextdocument.cpp \ datamodel/trusttreemodel.cpp ui/metadataQuery.cpp \ util/jsonwrapper.cpp util/catranslator.cpp datamodel/voicecall.cpp \ net/voicecallengine.cpp ui/callstatus.cpp ui/callbuttondelegate.cpp \ call/audiosource.cpp call/audiomixer.cpp \ call/audioplayer.cpp call/audioencoder.cpp call/audiodecoder.cpp \ call/ringtoneplayer.cpp ui/tclPrograms.cpp ui/tclConsole.cpp \ tcl/tclWrapper.cpp datamodel/tclprogram.cpp datamodel/tclmodel.cpp \ tcl/tclCallbacks.cpp tcl/tclUtil.cpp datamodel/cadbrecord.cpp \ datamodel/cadbrecordmodel.cpp net/dbretrievalengine.cpp \ util/ungzip.cpp FORMS = frontWidget.ui ui/profileReadersDialog.ui ui/passwordDialog.ui \ ui/newClassifiedAd.ui ui/newPrivMsg.ui ui/editContact.ui \ ui/newProfileComment.ui ui/profileCommentDisplay.ui \ ui/attachmentListDialog.ui ui/settingsDialog.ui \ ui/statusDialog.ui ui/manualConnectionDialog.ui \ ui/aboutDialog.ui ui/searchDisplay.ui ui/insertLink.ui \ ui/newTextDocument.ui ui/metadataQuery.ui ui/callStatusDialog.ui \ ui/tclPrograms.ui ui/tclConsole.ui RESOURCES = ui_resources.qrc TRANSLATIONS = classified_ads_fi.ts \ classified_ads_sv.ts unix:LIBS = -lssl -lcrypto -lnatpmp -lminiupnpc -ltcl -ltk -lz -lbz2 win32:LIBS+=-ltcl86 -ltk86 -lz lessThan(QT_MAJOR_VERSION, 5) { unix:LIBS += -lqjson -lmagic } LIBS += -lopus # following line is needed for fedora linux, natpnp needs miniupnpc unix:INCLUDEPATH += /usr/include/miniupnpc win32:LIBS += "-L..\openssl-1.0.2o" win32:LIBS += "-lcrypto" win32:LIBS += "-lssl" win32:LIBS += "..\miniupnpc-2.1\miniupnpc.lib" win32:LIBS += "-Lc:\msys32\usr\local\lib" win32:LIBS += "-lintl" win32:LIBS += "-L..\opus-1.2\binary\lib" win32:LIBS += "-Lc:\msys32\opt\tcl\lib" lessThan(QT_MAJOR_VERSION, 5) { win32:LIBS += "-L" win32:LIBS += "..\qjson-master\build\src" win32:LIBS += "-lqjson" } win32:LIBS += "-lWs2_32" "-lGdi32" "-lIphlpapi" win32:INCLUDEPATH += "..\openssl-1.0.2o\include" win32:INCLUDEPATH += "..\miniupnpc-2.1" win32:INCLUDEPATH += "c:\msys32\usr\local\include" win32:INCLUDEPATH += "..\opus-1.2\binary\include" win32:INCLUDEPATH += "c:\msys32\opt\tcl\include" lessThan(QT_MAJOR_VERSION, 5) { win32:INCLUDEPATH += "..\qjson-master\include" } unix { TCL_VERSION = $$system(echo \'puts $tcl_version;exit 0\' | tclsh) message(Tcl version $$TCL_VERSION) } win32 { TCL_VERSION = 8.6 } INCLUDEPATH += /usr/include/tcl$$TCL_VERSION /usr/include/tk /usr/include/tk$$TCL_VERSION target.path = /usr/bin desktopfiles.path = /usr/share/applications desktopfiles.files = ui/classified-ads.desktop appdata.files = ui/classified-ads.appdata.xml appdata.path = /usr/share/metainfo/ unix { # in unix install translations as part of appdata: appdata.extra = cd po ; $(MAKE) install DESTDIR=$(DESTDIR) } desktopicons.files = ui/turt-transparent-128x128.png desktopicons.path = /usr/share/app-install/icons/ manpages.path = /usr/share/man/man1 manpages.files = classified-ads.1 # note this example file path appears also in file tclmodel.cpp examplefiles.path = /usr/share/doc/classified-ads/examples examplefiles.files = doc/sysinfo.tcl doc/luikero.tcl doc/calendar.tcl INSTALLS += target \ desktopfiles \ desktopicons \ appdata unix:INSTALLS += manpages unix:INSTALLS += appdata unix:INSTALLS += examplefiles RC_FILE=classified-ads.rc classified-ads-0.13/classified-ads.rc000066400000000000000000000001271331670245300175150ustar00rootroot00000000000000IDI_ICON1 ICON DISCARDABLE "windows/turt-transparent-128x128.ico" classified-ads-0.13/classified-ads.spec000066400000000000000000000136131331670245300200470ustar00rootroot00000000000000Name: classified-ads Version: 0.13 Release: 1%{?dist} Summary: Classified ads is distributed, server-less messaging system Group: Applications/Internet License: LGPLv2 URL: http://katiska.org/classified_ads/ Source0: https://github.com/operatornormal/%{name}/archive/%{version}.tar.gz#/%{name}-%{version}.tar.gz Source1: https://github.com/operatornormal/classified-ads/blob/graphics/preprocessed.tar.gz?raw=true#/%{name}-graphics-%{version}.tar.gz BuildRequires: qt5-qtbase-devel BuildRequires: qt5-qtmultimedia-devel BuildRequires: openssl-devel BuildRequires: libnatpmp-devel BuildRequires: miniupnpc-devel BuildRequires: gettext BuildRequires: libappstream-glib BuildRequires: desktop-file-utils BuildRequires: opus-devel BuildRequires: tcl-devel BuildRequires: tk-devel BuildRequires: zlib-devel BuildRequires: bzip2-devel %description Classified ads is an attempt to re-produce parts of the functionality that went away when Usenet news ceased to exist. This attempt tries to fix the problem of disappearing news-servers so that there is no servers required and no service providers needed; data storage is implemented inside client applications that users are running. Main feature is public posting. Other features include private messages, group messages, basic operator data, search, voice calls between nodes, UI extensions with TCL language and general-purpose database shared between nodes of the application. %prep %setup -q -a 1 %build qmake-qt5 QMAKE_STRIP=echo %make_build %install %make_install INSTALL_ROOT=%{buildroot} appstream-util validate-relax --nonet %{buildroot}/%{_datadir}/metainfo/classified-ads.appdata.xml desktop-file-validate %{buildroot}/%{_datadir}/applications/classified-ads.desktop %find_lang %{name} %files -f %{name}.lang %doc README.TXT %{_bindir}/classified-ads %{_datadir}/applications/classified-ads.desktop %dir %{_datadir}/app-install %dir %{_datadir}/app-install/icons %{_datadir}/app-install/icons/turt-transparent-128x128.png %{_mandir}/man1/classified-ads.1.* %{_datadir}/metainfo/classified-ads.appdata.xml %license LICENSE %{_datadir}/doc/classified-ads/examples/sysinfo.tcl %{_datadir}/doc/classified-ads/examples/luikero.tcl %{_datadir}/doc/classified-ads/examples/calendar.tcl %changelog * Sun Jun 24 2018 Antti Jarvinen - 0.13 - New upstream version: refactoring due to qt5.11 changes * Wed Feb 07 2018 Fedora Release Engineering - 0.12-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild * Sun Jan 07 2018 Igor Gnatenko - 0.12-2 - Remove obsolete scriptlets * Sun Nov 12 2017 Antti Jarvinen - 0.12-1 - New upstream version: new features, many new translations - Appdata moved to /usr/share/metainfo * Sun Jul 3 2016 Antti Jarvinen - 0.11-1 - New upstream version: bugfixes and support for OpenSSL 1.1 API * Fri Apr 8 2016 Antti Jarvinen - 0.10-1 - New upstream version: audio capabilities and translation additions * Sat Oct 10 2015 Antti Jarvinen - 0.09-1 - Fixes to serious networking bugs - Translation additions * Mon Sep 28 2015 Antti Jarvinen - 0.08-1 - Links against qt5 instead of qt4 - Translation system is gnu gettext instead of qm files of Qt. - Better tracking of changing local network addresses - Numerous small bugfixes, mostly in networking code * Sun Apr 12 2015 Antti Jarvinen - 0.07-1 - Removed intermediate PNG files into separate tarball - Included code to generate intermediate PNG files manually * Mon Apr 6 2015 Antti Jarvinen - 0.06-1 - Included original high-res bitmaps in different format, conversion routines. - Fixed potential SIGSEGV appearing in debug build - Code indented + typos fixed * Wed Mar 25 2015 Antti Jarvinen - 0.05-1 - spec-file changes due to review comments. - tagged a new version to allow building of latest version. - added copyright notice to FrontWidget.cpp. - included LGPL_EXCEPTION.txt from Nokia alongside sources. * Tue Mar 17 2015 Antti Jarvinen - 0.04-2 - Changed packaging to happen in more civilized way. Lot of changes into spec file. - Package name has changed classified_ads -> classified-ads. - Added appdata, re-wrote the small manpage in less personal tone. * Sat Mar 14 2015 Antti Jarvinen - 0.04-1 - License change GPL->LGPL due to OpenSSL license incompatibility. - Minor UI changes as some bitmaps removed due to licensing issues * Tue Feb 24 2015 Antti Jarvinen - 0.03-1 - Rpm build fixes for fedora linux - Slower connection attempts to unreachable nodes - Better file extenstion handling - UI tweaks for small vertical screen resolutions, affects at least users of some mac models - Classifications entered by user now actually work too - If no local search avail, still offer network search - Possible crash case fix. Still having random crashes inside json serialize.. - Links between documents, still does not work with profile comments - Try miniupnpc also in unix build - Basic support for trust-tree based on trust lists - Translations * Sun Jan 04 2015 Antti Jarvinen - 0.02-1 - Libnatpmp is not used in windows build, - Profile comment document width setting was missing - Made main window slightly smaller vertically. - Now compiles also under Qt5 - Fix for grave bug: only message sender (not recipient) can read binary attachments - Error messages for some file operations - Fix for situation where published private profile breaks every node in network - Require c++ compiler for compilation of c++, when building rpm. * Wed Dec 31 2014 Tuomas Haarala - 0.01-1 - initial spec file scribbled together classified-ads-0.13/classified_ads_fi.qm000066400000000000000000001720541331670245300202770ustar00rootroot00000000000000<ИdЪяœ•Э!П`ЁНнB Ј;EdўЩ“ўгVЩХVг4GtЬзGЄбјKG~LLЯЕZlЪВ[*:`_Ум˜“ЇдT‰ЈЅ\жР[ч–хЭь0W! LЯр“ kТHZА5HйА5KЕn”љ&1љS&mѓ7 &mѓФ )Џd@в*–$Mћ*ІyNa*ЛN*а%я*а%O++дOг+‹ЏPЏ+ФЏQѕ?–сGayЭG…дкyG–ФбУGп _IУ–IXГЮIf#IlШJ6•иѕJ6•фюL™btL™b*.L™b3фL™b=_L™b?ДL™bJL™bUIM– 5›T3ЯWTЩѓ‹[f3 2`аЕmУ–mУрcй ‘ƒСф ќ5а‘Ž‘Ž8+- Ž p-ўбzJЏ)МJЏ8Ў~^Ѕ+Ъ“.оКŠШ&ШЛ2ŠП'Ъ­iOxемЖў€$зIC*ѕјъЮЋДЂЌДЂ(FДЂ4 ЁЅ>+ ЁЅ?я?кЪ V.Q:јZULтZUЩ wѕЮ;Т{ќSФ`’`Е‹Іь6AІь<†Ї–Ф ЖŠЅPJЖх”EИЧ9,И§єPыУёхн=м^‚:“ум/%fєk@$MйррОTИ]‚#JcРtЕ’jьчЖm љ .SЖVˆйа™ДШNЊs+вцD,Rжд*cзKХжѓюЭФ5ђŠsШћФ5П!+ѓМъ(PGЛPšƒВŽkcЙCtШ”›‹Ї˜гd‹Ї˜дФ‹Ї˜жq—ѓт[GBЈЈРKЗUХШšХvNРшЬХГ‰舉ІуЃхц_$ОѕsDI,о#ЦC;2%FЯУNH8Р$dлд%fСMЧgв )fgв 5Dgв V"xкЩWˆ|DР&'›ˆ˜Ц“›ˆ˜лˆœJТK0Є!3NЇiГ хГ(ISКіІФц5GЦ­UмYЬZ‚S№лн% žц‹jн јJm7кћќ, ЦЮ-ЦSЭ3ЦTЭѓ#eDХї$eU6{ЎN/8*YYvFMЂцвVбЅЧLYu#zZ~2 Z~Ощ\Юхњ`9~ГslОPŸКЮbЁ"~/ЕБГ sЦlRШжнУзкaŠйŸ№ 4ќiZf0BYRЅ5Фѕ#Ъ8tѕ8uTEэZ єЫпhIB"ijцх јmйЮ\mdк‰pc\…U6†…UТжЁc’'YЋŒу IЋŒууИйYёЙ0ШХlгGоwгGоAСеСФЦСхCЂЧ’ь УН{эLiZхіЇ^!§ŠоЗŒ њЅ0О њЅT(Ј4чљ.o sW sW1"ЁЩў2ьЏЉе<мДE>\cИŒ…7_ЪZƒмЬHcй-ЬчЉНЬЬчЩОьq ЮgЂљAPs)VvУФЏa /teС9eСBdhЬƒ]舂-ќ‘O‡(Ў‘O‡4€›ыВзщЂCuЂCuУД NтвЫRЊай~RaрƒЇЫщщФУъeѓљ O]iшc0Valitse nimi tiedostolleChoose file name for savingAttachmentListDialog VikaaErrorAttachmentListDialog4Vika tiedoston avaamisessaFile open errorAttachmentListDialogBTallenna tiedostojфrjestelmфlle..Save file to disk..AttachmentListDialogtiedostotfilesAttachmentListDialog@Tiedoston nimi tai SHA1 tiivisteName or fingerprint of fileBinaryFileListingModelAikaDateCAListingModelAiheSubjectCAListingModelElфimiфAnimalsClassifiedAdsModelIlmoitetaan AnnouncementClassifiedAdsModel"Missф maassa vain Any countryClassifiedAdsModel PyіriфBikesClassifiedAdsModelVeneitфBoatsClassifiedAdsModelKirjojaBooksClassifiedAdsModelOstetaanBuyingClassifiedAdsModel AutojaCarsClassifiedAdsModelVaatteitaClothingClassifiedAdsModelKoulutusta EducationClassifiedAdsModelSфhkіlaitteita ElectronicsClassifiedAdsModelTapahtumiaEventsClassifiedAdsModelRaha-asioitaFinanceClassifiedAdsModel Ruokatarvikkeita FoodstuffClassifiedAdsModelHuonekaluja FurnitureClassifiedAdsModelAnnetaan Giving awayClassifiedAdsModelAsumuksia HabitationClassifiedAdsModelTerveydenhoitoa HealthcareClassifiedAdsModelKodin tavaroitaHousehold appliancesClassifiedAdsModel KorujaJewelryClassifiedAdsModelTyіpaikkojaJobsClassifiedAdsModelElokuviaMoviesClassifiedAdsModel"MusiikkivфlineitфMusicClassifiedAdsModel Muita ajoneuvojaOther vehiclesClassifiedAdsModelFilosofiaa PhilosophyClassifiedAdsModel2Uskonnollisia toimituksiaReligious ritualsClassifiedAdsModelVuokrataanRentingClassifiedAdsModelMyydффnSellingClassifiedAdsModelPalveluitaServicesClassifiedAdsModelOhjelmistojaSoftwareClassifiedAdsModel UrheiluvфlineitфSportsClassifiedAdsModelTyіkalujaToolsClassifiedAdsModelKuljetuksiaTransportationClassifiedAdsModelAjoneuvon osia Vehicle partsClassifiedAdsModelHalutaanWantingClassifiedAdsModelVerkko-osoiteAddressConnectionListingModelOktettia sisффnBytes inConnectionListingModelOktettia ulos Bytes outConnectionListingModelrSinun tietokoneeseesi tфstф solmusta siirretty tietomффrф'Data transferred from peer to your nodeConnectionListingModel~Sinun tietokoneestasi tфhфn verkon solmuun siirretty tietomффrф'Data transferred to peer from your nodeConnectionListingModelSisффntulevaInboundConnectionListingModel˜Sisффntulevat yhteydet ovat sellaisia, missф etфjфrjestelmф aloitti yhteyden=Inbound connections are those where peer initiated connectionConnectionListingModelAvaamisaika Open timeConnectionListingModel(Solmun verkko-osoitePeer network addressConnectionListingModel(Yhteyden avaamisaikaTime when connection was openedConnectionListingModelZOperaattorin varsinainen verkko-osoite (SHA1),Actual network address (SHA1) of the contactContactListingModel OsoiteAddressContactListingModel„Antamasi liikanimi; operaattori voi antaa itselleen eri liikanimen>Locally given nickname ; user may set her own nickname himselfContactListingModelLiikanimiNicknameContactListingModelŠJulkinen lausunto operaattorin luotettavuudesta asioiden hoitamisessa?Public statement if this operator to be trusted in transactionsContactListingModel&Julkisesti luotettuPublicly trustedContactListingModelTuntematonUnknownContactListingModelTosi onYesContactListingModeljAvaamiseen sopivaa salausavainta ei ole kфytettфvissф!No suitable de-cryption key foundContentEncryptionModel\Salaisen RSA-avaimen tallettaminen epфonnistui%RSA Private key key saving went wrongContentEncryptionModeljSSL-avaimen rakentaminen epфonnistui, pakko poistua..-SSL key generation went wrong, calling exit..ContentEncryptionModelxx509-sertifikaatin rakentaminen epфonnistui, pakko poistua../x509 cert generation went wrong, calling exit..ContentEncryptionModelTietoja&About ControllerVaihda salasana&Change password Controller.Poista valittu profiili&Delete current profile ControllerTiedosto&File ControllerBValitse kфyttііn toinen profiilii&Select another profile ControllerxValitse uusi profiili antamalla haluamasi profiilin salasana&Activate another profile with password Controller(Kelpaamaton salasana Bad password ControllerfViimeistф jфljellф olevaa profiilia ei voi poistaa.Can't delete only profile. Controller~Solmun salausavaimen tai sertifikaatin lataaminen ei onnistunutCant load node cert or key cert ControllernValitse valitulle operaattori-profiilille uusi salasana"Change password of current profile Controller.Luokitellut ilmoituksetClassified ads Controller$Sisфllіn omistaja:Content owner:  ControllerPHaluttua kohdetta ei verkosta lіytynyt.."Could not find item from network.. Controller"Luo uusi profiiliCreate &new profile Controller0Salausjфrjestelmфn virheCryptographic module ControllerTietokantavirheDatabase error Controller(Tietokannan vikatilaDatabase module ControllerPфivфmффrф:Date:  ControllerbPysyvфsti poistaa tфmфnhetkisen valitun profiilinDeletes currently open profile ControllerKuvaus: Description:  Controller SuljeE&xit Controller&Anna uusi salasana:Enter new password: Controller\Anna salasana viestiesi sisфllіn turvaamiseksi/Enter password for protection of your messages: ControllerSulje sovellusExit the application ControllerPKaivellaan kohdetta verkon syіvereistф..Fetching item from network.. ControllerDTiedostokфsittelyyn liittyvф virhe File error ControllerzJos olet luonnut useamman profiilin, voit tфstф valita toisen!If you have multitude of profiles ControllerLisenssi: License:  ControllerFLuo operaattorille uuden profiilinMakes a brand new user profile ControllerMime-Tyyppi: Mime-Type:  Controller Nimi:Name:  Controller"Verkko-yhteydet..Network status.. Controller$Solmun asetukset..Node-wide settings.. ControllerFPoistetaanko profiili lopullisesti?Permanently discard profile? ControllerJulkaisija: Publisher:  Controller SHA1:SHA1:  Controller Etsi..Search.. ControllerAsetukset.. Settings.. ControllerREsitф selvitys sovelluksen tarkoituksesta Show the application's About box Controller’Tфmфn profiilin viestejф tai muuta sisфltіф ei ole mahdollista nфhdф enффNфytф viesti-osapuolen profiili&View profile of peer FrontWidgetRLisфф valittu operaattori osoitekirjaan..#Add selected operator to contacts.. FrontWidget6Lisфф valittu osoitekirjaanAdd selected to contacts.. FrontWidget*Lisфф tiedosto jakoonAdd shared file.. FrontWidget^Artikkelia ei paikallisesta tietokannasta lіydy$Article not found from local storage FrontWidget Liitetiedostot.. Attachments.. FrontWidget4Kuvan avaaminen ei onnistuCan't load image FrontWidgetRValitse nimi tallennettavalle tiedostolleChoose file name for saving FrontWidget.Luokitellut ilmoituksetClassified ads FrontWidgetOsoitekirjaContacts FrontWidget\Kopioi tiedoston osoite (SHA1) leikepіydфlle..'Copy file address (SHA1) to clipboard.. FrontWidget4Muokkaa profiilin tietoja Edit contact.. FrontWidgetVMuokkaa ja julkaise uusi tekstidokumentti.. Edit+publish new text document.. FrontWidgetVikaa..Error FrontWidget:Ongelma tiedoston avaamisessaFile open error FrontWidget.Tiedosto on liian suuri File too big FrontWidget:Tiedosto on aivan liian suuriFile way too big FrontWidget,Kaikki tiedostot (*.*) Files (*.*) FrontWidgetKeneltф:From: FrontWidget>Viallinen SHA1-tiiviste URLissaInvalid SHA1 in URL FrontWidgetViallinen URL Invalid URL FrontWidgetOma profiili My profile FrontWidgetAvaa tiedosto Open File FrontWidget$Yksityiset viestitPrivate messages FrontWidgetDProfiilia ei tietovarastosta lіydyProfile not in database FrontWidget"Vastaa foorumilleReply to &forum FrontWidgetPTallenna tiedosto tiedostojфrjestelmфlleSave file to disk.. FrontWidget8Valitse julkaistava tiedostoSelect file to be published FrontWidget^Lakkaa mainostamasta valittua jaettua tiedostoa%Stop advertising selected shared file FrontWidget Aihe:Subject: FrontWidget6Viimeinen pфivitysajankohtaTime of last update  FrontWidgetKenelle:To: FrontWidget0Johon luottaa %1 SHA1 %2Trusted by %1 SHA1 %2 FrontWidget‚Yritф valita profiili katseltavaksi ensin, yritф sitten uudelleen(Try viewing profile first to obtain data FrontWidgetHTarkastele tiedoston ominaisuuksia..View file information.. FrontWidget kaikki tiedostotfiles FrontWidget&Vффrфn mallinen URL Invalid URLInsertLinkDialogFNimeф ei lіydy nimipalvelusta (DNS)DNS lookup failureManualConnectionDialog VikaaErrorNewPrivMessageDialogPVastaanottajan osoite ei ole kelvollinenRecipient addr is not validNewPrivMessageDialog‚Vastaanottajan salausavainta ei paikallisesta tietokannasta lіydy/Recipient encryption key not found from storageNewPrivMessageDialog`Kommentoidun profiilin osoite ei ole kelvollinen#Commented profile addr is not validNewProfileCommentDialog VikaaErrorNewProfileCommentDialogˆValitun profiilin salausavainta ei paikallisesta tietokannasta lіydy/Recipient encryption key not found from storageNewProfileCommentDialogNSSL-sertifikaatin lataaminen ei onnistuCant load SSL cert NodeModelBSSL-avaimen lataaminen ei onnistuCant load SSL key NodeModelXSSL-avaimen luonti epфonnistui, poistutaan..-SSL key generation went wrong, calling exit.. NodeModelfx509-sertifikaatin luonti epфonnistui, poistutaan../x509 cert generation went wrong, calling exit.. NodeModelZVфhimmфispituus on 5 (kфytф silti ainakin 10)Min length 5 (use 10+) PasswdDialogPValitse salasana viestiesi turvaamiseksi.Enter password for protection of your messagesPasswordDialogАJos unohdat tфmфn sanan, viestiesi lukemiseksi ei ole olemassa mitффn helppoa menetelmффHIf you forget this word, there is no simple way to recover your contentsPasswordDialogOKOKPasswordDialog,Salasana on pakollinenPassword requiredPasswordDialogКUnohdapa tфmф salasana ja viestiesi lukemiseen vain ei ole olemassa mitффn helppoa menetelmффPShould you forget this word, there is no easy way to recover any of your contentPasswordDialog&%1 johon luottaa %2%1 Trusted by %2PrivateMessageSearchModel SuuntaDirPrivateMessageSearchModelNViestin suunta, lфhetetty/vastaanotettu#Direction of message, sent/receivedPrivateMessageSearchModelOsapuoliPeerPrivateMessageSearchModelAiheSubjectPrivateMessageSearchModelAikaTimePrivateMessageSearchModelLisфф kommentti&Add comment...ProfileCommentDisplay^Kommenttia ei paikallisesta tietokannasta lіydy$Article not found from local storageProfileCommentDisplay VikaaErrorProfileCommentDisplayNTallenna liite tiedostojфrjestelmфlle..Save attachment to disk..ProfileCommentDisplayLiitteet:  Attachments: ProfileCommentItemDelegateLфhettфjфSenderProfileCommentListingModelAiheSubjectProfileCommentListingModelAikaTimeProfileCommentListingModel˜Kommenttiin liittyvфn profiilin tietoja ei paikallisesta tietokannasta lіydy2Profile related to comment not found from databaseProfileCommentModel(Tarkastele profiilia View profileProfileReadersDialog<Lukijan nimi tai SHA1-tiivisteName or fingerprint of readerProfileReadersListingModel Avaa..Open.. SearchDisplayLihavoitu&BoldTextEdit Vфri.. &Color...TextEdit Kopioi&CopyTextEditMuokkaa&EditTextEdit$Vie PDF-muodossa..&Export PDF...TextEditTiedosto&FileTextEditKursivoitu&ItalicTextEdit6Tasattu molempiin laitoihin&JustifyTextEdit$Tasattu vasemmalle&LeftTextEdit Avaa..&Open...TextEdit Liitф&PasteTextEditTulosta.. &Print...TextEditTee uudelleen&RedoTextEdit Tasattu oikealle&RightTextEditRTallenna paikallisesti ennen lфhettфmistф&Save locally before sendTextEditAlleviivattu &UnderlineTextEditPeru&UndoTextEditTietoja Qt:stф About &QtTextEditTekstimuokkain ApplicationTextEdit>Pisteellinen lista (ympyrіillф)Bullet List (Circle)TextEdit<Pisteellinen lista (palloilla)Bullet List (Disc)TextEdit@Pisteellinen lista (laatikoilla)Bullet List (Square)TextEditKeskitettyC&enterTextEdit4Kuvan avaaminen ei onnistuCan't load imageTextEditLeikkaaCu&tTextEdit$Muokkaa toimintoja Edit ActionsTextEditSisфllytф kuva Embed imageTextEditTapahtui virheErrorTextEditMuotoileF&ormatTextEdit:Tiedosto on aivan liian suuriFile way too bigTextEdit,Kaikki tiedostot (*.*) Files (*.*)TextEditfHTML-Tiedostot (*.htm *.html);;Kaikki tiedostot (*)(HTML-Files (*.htm *.html);;All Files (*)TextEditApuaHelpTextEditLisфф viite Insert linkTextEdit”ODF Tiedostot (*.odt);;HTML-Tiedostot (*.htm *.html);;Kaikki tiedostot (*);ODF files (*.odt);;HTML-Files (*.htm *.html);;All Files (*)TextEditAvaa tiedosto Open FileTextEditAvaa tiedosto.. Open File...TextEditDNumeroitu lista (pienin kirjaimin)Ordered List (Alpha lower)TextEditDNumeroitu lista (suurin kirjaimin)Ordered List (Alpha upper)TextEditBNumeroitu lista (desimaaliluvuin)Ordered List (Decimal)TextEditHNumeroitu lista (pienin roomalaisin)Ordered List (Roman lower)TextEditPNumeroitu lista (suurilla roomalaisilla)Ordered List (Roman upper)TextEdit$Tulosta dokumenttiPrint DocumentTextEdit0Tulostuksen esikatselu..Print Preview...TextEdit$Tallenna nimellф.. Save as...TextEdit@Tallenna paikallisesti nimellф..Save locally &As...TextEditNormaalimuotoStandardTextEdithTiedostoa on muutettu, haluatko tallettaa muutokset?AThe document has been modified. Do you want to save your changes?TextEdit†Luokitellut ilmoitukset on viestintффn tarkoitettu tietokoneohjelma6 Classified ads is a program for online communications aboutDialogAо<html><head><meta name="qrichtext" content="1" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Ubuntu'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Luokitellut ilmoitukset on vapaasti kфytettфvф ohjelmisto. Voi kфyttфф, kopioida ja muokata sitф noudattaen LGPL-lisenssin (GNU Lesser General Public License 2.1) ehtoja.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tфmфn ohjelman kopiointioikeudet omistaa Antti Jфrvinen, vuodesta 2013. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ohjelman keskeinen ominaisuus on &quot;ilmoitus&quot; - teksti, joka kuuluu johonkin luokitteluun. Ohjelma sisфltфф joukon valmiita luokitteluita ja kфyttфjiф rohkaistaan keksimффn uusia ; luokittelu-valintoihin &quot;ilmoitukset&quot;-vфlilehdellф voi kirjoittaa mitф hyvфnsф. Muut kфyttфjфt voivat katsella ilmoituksia, julkisesti kommentoida ilmoituksia ja lфhettфф viestejф toisilleen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ohjelman toinen keskeinen ominaisuus on, ettei se kфytф keskitettyф tietovarastoa millффn verkkopalvelimella - yksittфisten kфyttфjien tietokoneet, joilta ohjelmistoa kфytetффn tallettavat ja vфlittфvфt kaiken ohjelman sisфllф esitettфvфn sisфllіn. Liittyфksesi tфhфn verkkoon sinun on tiedettфvф ainakin yhden sellaisen tietokoneen (solmun) verkko-osoite, jossa jo valmiiksi kфytetффn luokiteltuja ilmoituksia. Mikфli tilanne on sellainen, ettф &quot;verkon tila&quot; -dialogi nфyttфф 0 avointa yhteyttф, sinun on kysyttфvф joltain ystфvфltфsi hфnen solmunsa verkko-osoite ja syіtettфvф se ohjelmaan saadaksesi yhteyden luokiteltujen ilmoitusten verkkoon. Kun ohjelma on kerran liitetty verkkoon, se pyrkii itse yllфpitфmффn listan verkon muista koneista.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Johtuen suunnitelusta, johon verkkopalvelimet eivфt kuulu tфmф jфrjestelmф toimii parhaiten, jos jфtфt tфmфn ohjelman pффlle myіs silloin, kun et itse aktiivisesti kфytф jфrjestelmфф. Ohjelma vie jonkin verran tietojenkфsittelykapasiteettia koneeltasi ja aiheuttaa verkkoliikennettф myіs silloin kun et itse ohjelmaa kфytф - mutta muut kфyttфjфt kфyttфvфt. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Yksityisyydestффn huolestuneet kфyttфjфt huomatkoot seuraavat seikat:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Tietovarasto on toteutettu hajautettuna tiivistetaulukkona (distributed hash table DHT), mikф kфytфnnіssф tarkoittaa ettф verkkoon postitetut ilmoitukset ja muu sisфltі pффtyvфt enemmфn tai vфhemmфn satunnaisille verkon solmuille sфilytettфvфksi, DHT-algoritmin mukaisesti.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Kaikki verkon tallettamat tietoalkiot (ilmoitukset, kommentit, tiedostot, yksityiset viestit jne.) ovat digitaalisesti allekirjoitettuja. Tфstф syystф on hankalaa pyrkiф esiintymффn eri operaattorina kuin oikeasti on. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Operaattorin ainoa luotettava tunniste on hфnen salausavaimensa SHA1-tiiviste. SHA1-tiiviste on nфhtфvillф operaattorin tiedot esittфvфllф vфlilehdellф. Muut tiedot kuten liikanimi tai kaupungin nimi ovat operaattorin syіtettфvissф ja luonnollisesti voivat olla ihan mitф tahansa. Operaattorin profiilin tiedot verkkoon julkaistuna ovat myіs allekirjoitetut, kфyttфen operaattorin salausavainta - mikфli haluat kohtuullisella luotettavuudella tietфф onko joku verkon sisфltі tietyn operaattorin julkaisemaa vai ei, tфmф tapahtuu tarkastamalla lфhettфjфn SHA1-tiiviste. Luokitellut ilmoitukset tarkastaa saapuvien tietoalkioiden allekirjoitukset ja jфttфф tallettamatta sisфllіt, joiden allekirjoitus ei vastaa sisфltіф. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Kaikki luokitellut ilmoitukset julkaistaan ilman salausta ja ovat kaikkien luettavissa. Kaikki julkiset profiilit julkaistaan ilman salausta, ja ovat kaikkien luettavissa. Mikфli profiili merkitффn yksityiseksi, se salataan siten, ettф lueteltujen operaattoreiden salausavainta kфyttфen profiilin tiedot ovat luettavissa. Tфmф pфtee myіs profiiliin liittyviin kommentteihin ja jaettuihin tiedostoihin. Muutos ei ole takautuva, eli jos profiili on aiemmin ollut julkinen, sen kommentit ja tiedostot eivфt automaattisesti muutu salatuiksi kun profiili muutetaan yksityiseksi. Yksityiset viestit kuljetetaan aina salattuna. Liitetiedostot noudattavat sen dokumentin yksityisyyssффntіjф, mihin ne on liitetty.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Kuten kaiken internet-viestinnфn kanssa tosi on, myіs tфmф pфtee: jos jotain sisфltіф verkkoon lфhetetффn, <span style=" font-style:italic;">ei ole olemassa keinoa pysyvфsti sitф poistaa.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Salaustoteutus on OpenSSL, useimmin kфytetyt algoritmit ovat RSA-2048 ja AES-256.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Solmujen vфlinen liikenne kulkee SSL-socketissa eli tietoliikenteen seuraaminen verkon ulkopuolelta on haastavaa. Vierekkфiset solmut kuitenkin nфkevфt toistensa tietoliikenteenteen sisфllіn. Vaikka tietoliikenteen sisфltіjen kerффmiseen ei ole helppoa yksittфistф paikkaa, operaattorien on silti turha odottaa yksityisyyttф koskien tekemisiффn verkossa vaikka jonkin verran vaivaa yksityisten viestien <span style=" font-style:italic;">sisфltіjen</span> suojaamiseksi onkin nфhty. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ohjelmointityіn on enimmфkseen tehnyt Antti Jфrvinen, taideteokset Meeri Jфrvinen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tфmф tuote sisфltфф OpenSSL-projektin kehittфmфn ohjelmiston, joka on alunperin tarkoitettu OpenSSL Toolkit-ohjelmistoa varten (http://www.openssl.org).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Riemullista ilmoittelua!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html>м

Classified ads is free software. You may use, copy and modify it if you follow the conditions given in GNU lesser general public license version 2.1.

Classified ads is copyright ТЉ Antti JУЄrvinen 2013.

Main feature of the the program is an "advertisement" - a piece of text belonging to selected classification. There are several pre-programmed classifications and operators are encouraged to invent new classifications for new purposes ; the selection boxes in classification-selection tab are editable. Other operators may then view the ads, publicly comment the ads, the operators and also send private messages to each others.

Another important feature of classified ads is that it is designed to be operated without any centralized server infrastucture - it is you and other operators whose computers store and transmit all the content visible inside classified ads. To get connected you need to know address of at least one existing computer (a node) so if your network connection dialog shows no connections, you may need to contact someone you know is using the software and ask for address of her node to make initial contact with the network. Once connected the software should maintain list of addresses of other nodes.

Due to its server-less design the whole system works best if you leave the program running always when you have your computer powered on ; while processing other operators requests it will hog some computing resources and generate network traffic also when you are not actively using the program youself - others are.

Operators concerned about privacy of the content should be aware of following items:

- Data storage implementation is variant of distributed hash table, practically meaning that content posted by you gets copied some more-or-less random nodes in the network.

- Any data item (ad, comment, binary file, private message etc.) is digitally signed. This makes it more difficult to try to pose as another operator.

- Operators are reliably identified only by the SHA1 hash of their generated encryption keys. SHA1 hash is displayed when viewing details of operator profiles. Other identifying information like nickname or city name are entered by operator himself and can be anything. The operator profile, as it is published to the network, is also signed with the encryption keys of the operator - if you identify an operator by her SHA1 hash, you have a mechanism for identifying if any content inside classified ads is posted by this operator or not. Classified ads internally checks for digital signatures, throwing away content that fails signature check and tries to provide SHA1 hash of the operator who posted the content.

- All classified ads are posted as plain text, no encryption is used. All public profiles are posted as plain text, no encryption is used. If profile is made private, it is encrypted to be readable only by selected other profiles. This applies also to binary files shared by operators private profiles and comments about private profiles after the profile was made private (previously plain-text comments or files don't get magically encrypted afterwards). Private messages are encrypted always to be readable only by recipient and sender. Attachments follow the privary rules of the document, they're attachted to.

- As is the case with all internet-communications, this small fact is true for classified ads too : once something gets posted online, there is no way to remove it from network.

- Data encryption implementation for content is OpenSSL, relying mostly on algorithms RSA-2048 and AES-256.

- While connections between nodes are implemented using SSL, other nodes inside network do get to know what content is being transmitted in neighboring nodes. While there is no central point for easily collecting this information about particular classification or operator, operators still should expect no privacy regarding their doings online, although some effort has been been put into hiding contents of private messages and private profiles.

Programming was (mostly) done by Antti JУЄrvinen, artwork by Meeri JУЄrvinen.

This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/).

Happy advertising!


 aboutDialogHTietoja luokitelluista ilmoituksistaAbout classified ads aboutDialog*LiitetiedostoluetteloList of attached filesattachmentListDialog <html><head/><body><p>Luottamuksen osoitus on profiilisi mukana julkaistava tieto, jonka profiilisi lukijat nфkevфt</p></body></html>n

Settings some trusted is public information to readers of your profile

editContactDialogBProfiilin osoitteen SHA1 tiivisteAddress (SHA1) of contacteditContactDialog2Muokkaa profiilin tietojaEdit a contacteditContactDialog*Paikallinen liikanimiLocal nicknameeditContactDialognTфmфn profiilin operaattoriin kelpaa julkisesti luottaa6This contact is to be publicly trusted in transactionseditContactDialog6 Klikkaa Lisфtфksesi Kuva Click to Add Image frontWidgetP<html><head/><body><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;">Ei</span></p><p align="center"><span style=" font-size:16pt;">Kuvaa</span></p><p align="center"><span style=" font-size:16pt;">Valittuna</span></p></body></html>Ї




No

Image

Inserted

 frontWidgetLisфф profiili Add contact frontWidget&Lisфф osoitekirjaanAdd to contacts frontWidgetBTC-osoiteBTC Addr frontWidget&BTC-lompakon osoite BTC address frontWidgetKaupunki/maa City/Country frontWidgetKaupunki/maa City/country frontWidget.Luokitellut ilmoituksetClassified ads frontWidgetKommenttiComment frontWidgetOsoitekirjaContacts frontWidget*Operaattorin profiiliDetails of operator profile: frontWidgetSukunimi Family name frontWidgetEtunimi First name frontWidget Koko maailmalle.For the rest of the world.  frontWidgetEtusivun lomakeForm frontWidgetTervehdysteksti Greeting text frontWidget–Jos meinaat saada maksuja bitcoinin kautta, julkaise myіs lompakkosi osoiteFIf you wish to receive payments via BTC, include your BTC address too. frontWidget,Viimeisimmфt kommentitLatest comments frontWidgetLVфhфn pidempi selitys maailman tilasta+Longer explanation about state of the world frontWidgetOma profiili My profile frontWidgetLiikanimiNickname frontWidgetFYksikффn kentistф ei ole pakollinenNone of the fields is mandatory frontWidgetSuoritaPerform frontWidget$Yksityiset viestitPrivate messages frontWidget Profiilin osoiteProfile address frontWidget0Profiilin yksityiskohdatProfile details frontWidget,Profiili on yksityinenProfile is private frontWidgetJulkaisePublish frontWidget"Profiilin lukijatReaders of profile frontWidgetPoista profiiliRemove contact frontWidget"Peruuta muutoksetRevert changes frontWidgetHakuSearch frontWidgetLEtsi luokiteltuja ilmoituksia aiheestaSearch for classified ads about frontWidgetLфhetф viesti Send message frontWidget8Lфhetф operaattorille viestiSend message to operator frontWidget Jaetut tiedostot Shared files frontWidgetMaailman tilaState of the world frontWidget>Edellisen pфivityksen ajankohtaTime of last update frontWidget"Katsele profiilia View profile frontWidgetLukijat View readers frontWidgetpaikassain frontWidgetkoskienof frontWidgetLisфф linkki Insert linkinsertLinkDialog>Linkin pффllepфin nфkyvф tekstiLink label in textinsertLinkDialogURLURLinsertLinkDialog.IPv4, IPV6 tai DNS-nimiIPv4, IPv6 or DNS namemanualConnectionDialog@Lisфф solmu yhteydenottolistalle%Manually add node to connection queuemanualConnectionDialogHSolmun vastaanotto-portti (TCP-port)Remote node listen portmanualConnectionDialog(Solmun verkko-osoiteRemote node network addressmanualConnectionDialogBSDBSD metadataQuery CC-BYCC-BY metadataQueryCC-BY-NCCC-BY-NC metadataQueryCC-BY-NC-ND CC-BY-NC-ND metadataQueryCC-BY-NC-SA CC-BY-NC-SA metadataQueryCC-BY-NDCC-BY-ND metadataQueryCC-BY-SACC-BY-SA metadataQueryKuvaus:Description of file: metadataQueryZSyіtф tiedoston ominaisuudet ennen julkaisua:0Enter information regarding file before publish: metadataQuery,Tiedoston ominaisuudetFile information metadataQueryGPLGPL metadataQueryLGPLLGPL metadataQuery2Kфyttіф koskeva lisenssi:License of use: metadataQueryMime-tyyppi: Mime-type: metadataQueryTiedoston nimi:Name of the file: metadataQuery&Tiedoston omistaja:,Owner of file (name or SHA1 if CA operator): metadataQueryPublic domain Public domain metadataQueryAiheestaAbout newCaDialog LisффAdd newCaDialog Liite: Attachment:  newCaDialog>Lфhetф uusi luokiteltu ilmoitusPost a new classified ad newCaDialogAiheSubject newCaDialogpaikassain newCaDialogkoskienof newCaDialog LiitфAttachnewPrivMsgDialogLiitteet: Attachments: newPrivMsgDialogVastaanottaja RecipientnewPrivMsgDialog0Lфhetф yksityinen viestiSend a private messagenewPrivMsgDialogAiheSubjectnewPrivMsgDialog LiitфAttachnewProfileCommentDialogLiitteet: Attachments:newProfileCommentDialog@Kommentoi operaattorin profiiliaComment a operators profilenewProfileCommentDialog(Kommentoitu profiiliCommented profilenewProfileCommentDialogAiheSubjectnewProfileCommentDialog LiitфAttachnewTextDocumentDialogLiitteet: Attachments:newTextDocumentDialogDokumentin aiheDocument titlenewTextDocumentDialogRMuokkaa ja julkaise uusi tekstidokumentti$Edit and publish a new text documentnewTextDocumentDialog<Kommentit koskien operaattoriaComments regarding operatorprofileCommentDisplayDLisфф valitut profiilin lukijoiksiAdd seleted to list of readersprofileReadersDialog SuljeCloseprofileReadersDialog2Lukijoiden nykyinen listaCurrent list of readersprofileReadersDialog.Ensimmфiset 100 osumaa:First 100 matching profiles:profileReadersDialog*Profiilin lukijalistaProfile readers listprofileReadersDialogPoista valitutRemove selectedprofileReadersDialog4Etsi lisфttфviф profiilejaSearch for profiles to addprofileReadersDialogVerkkohakuNetwork search searchDisplayHaeSearch searchDisplay$Etsi ilmoituksista Search ads searchDisplay"Etsi kommenteistaSearch comments searchDisplay(Etsi tietovarastostaSearch data storage searchDisplay"Etsi profiileistaSearch profiles searchDisplay SanojaWords: searchDisplay,Solmun nimipalvelunimiDNS name of nodesettingsDialogHTietokannan sisфllіn enimmфismффrфt:Data store limits:settingsDialogиJos solmullasi on pysyvф nimi nimipalvelussa, voit syіttфф sen tфhфn jotta muut solmut voivat siihen viitatagIf you have permanent DNS name for your machine, you may type it here to be used to reference your nodesettingsDialog˜Kuunteluportti. Tфmфn vaihtaminen edellyttфф ohjelman uudelleenkфynnistystф.8Incoming TCP listen port. Change requires node restart. settingsDialog Solmun asetukset Node settingssettingsDialog"Ilmoitusten mффrфNr of CAs to keepsettingsDialog0Binффritiedostojen mффrфNr of binary blobs to keepsettingsDialog6Yksityistien viestien mффrфNr of private messages to keepsettingsDialog"Kommenttien mффrфNr of profile comments to keepsettingsDialog>Talletettavien profiilien mффrфNr of profiles to keepsettingsDialog(Paikallisessa tietokannassa talletettavien ilmoitusten mффrф, koskien kaikkia luokitteluja. Viimeisimmфksi viitatut tullaan poistamaan ensimmфisenф.{Number of classified ads to keep in storage, total, including all classifications. Oldest referenced will be deleted first.settingsDialog$TCP-kuunteluporttiTCP listen portsettingsDialog SuljeClose statusDialog Avoimet yhteydetCurrently open connections statusDialog"Oma havaittu IPv4Detected own IPv4 statusDialogIPv6IPv6 statusDialog0Lisфф yhteys kфsipelillфManually add connection statusDialog2Verkon ja yhteyksien tilaNetwork and connection status statusDialogДJos ystфvфsi ei pффse verkon jфseneksi, yritф antaa hфnelle tфmф osoite porttinumeron keraRShould your friend have trouble connecting, give her this address with port number statusDialog2Kфytіssф oleva TCP-porttiTCP port currently used statusDialogˆclassified-ads-0.13/classified_ads_fi.ts000066400000000000000000006127171331670245300203150ustar00rootroot00000000000000 UTF-8 AttachmentListDialog Save file to disk.. Context menu item text for menu, that appears when right-mouse is clicked on top of a file in a list. Tallenna tiedostojУЄrjestelmУЄlle.. files In file open dialog this is text specifying what kind of files to include in listing, filtered by file name suffix. For example, user wants only PNG files, then text appearing in dialog filter field would say "PNG files (*.png)" and this work "files" here is the word after the word PNG. tiedostot Save location Appears as dialog title where text asks if user wants to save into "application library" or into local file Mihin tallennetaan Save to TCL app library instead of regular file? Dialog text regarding TCL app save location Tallennetaanko TCL-ohjelmien kirjastoon vai tiedostojУЄrjestelmУЄlle? Choose file name for saving Dialog title text for dialog asking user to give a name to file for purpose of saving it to filesystem. Valitse nimi tiedostolle Error Dialog title text for error dialog. Vikaa File open error This gives (no) explanation about reason for "file open failure"? Vika tiedoston avaamisessa AudioPlayer raw audio format not supported by backend, cannot play audio. Error message text displayed when audio output fails immediately due to format conflict. У„УЄniformaatti ei ole tuettu, УЄУЄniУЄ ei voi soittaa. Could not initialize audio player. Error message text shown in dialog when audio output is not possible. Possible reason could be missing soundcard or other disastrous failure. У„УЄnitoistimen alustus epУЄonnistui. BinaryFileListingModel Name or fingerprint of file Title text in a listing view where list of shared files are listed. This particular text gives text for column, where "name or fingerprint of file" is listed. Fingerprint in practice means SHA1 digest. Tiedoston nimi tai SHA1 tiiviste CAListingModel Date Header text for a column-list. The column that gets its header text from this string, is the date-column of an classified ad. Aika Subject Header text for a column-list. The column that gets its header text from this string, is the subject-column of an classified ad. Aihe ClassifiedAdsModel Buying Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Cars in Estonia" and this combobox text here is the first word of that phrase. Ostetaan Selling Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Selling of Cars in Estonia" and this combobox text here is the first word of that phrase. MyydУЄУЄn Giving away Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Giving away of Cars in Estonia" and this combobox text here is the first+2nd word of that phrase. Annetaan Wanting Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Wanting of Cars in Estonia" and this combobox text here is the first word of that phrase. Halutaan Renting Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Renting of Cars in Estonia" and this combobox text here is the first word of that phrase. Vuokrataan Announcement Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Cars in Estonia" and this combobox text here is the first word of that phrase. Ilmoitetaan Cars Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Cars in Estonia" and this combobox text here is the 3rd word of that phrase. Autoja Boats Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Boats in Estonia" and this combobox text here is the 3rd word of that phrase. VeneitУЄ Bikes Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Bikes in Estonia" and this combobox text here is the 3rd word of that phrase. PyУЖriУЄ Other vehicles Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Other vehicles in Estonia" and this combobox text here is the 3rd+4th word of that phrase. Muita ajoneuvoja Vehicle parts Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of vehicle parts in Estonia" and this combobox text here is the 3rd+4th word of that phrase. Ajoneuvon osia Habitation Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Habitation in Estonia" and this combobox text here is the 3rd word of that phrase. Asumuksia Household appliances Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Household appliances in Estonia" and this combobox text here is the 3rd+4th word of that phrase. Kodin tavaroita Furniture Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Furniture in Estonia" and this combobox text here is the 3rd word of that phrase. Huonekaluja Clothing Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Clothing in Estonia" and this combobox text here is the 3rd word of that phrase. Vaatteita Tools Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Tools in Estonia" and this combobox text here is the 3rd word of that phrase. TyУЖkaluja Sports Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Tools in Estonia" and this combobox text here is the 3rd word of that phrase. UrheiluvУЄlineitУЄ Music Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Music in Estonia" and this combobox text here is the 3rd word of that phrase. MusiikkivУЄlineitУЄ Books Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Books in Estonia" and this combobox text here is the 3rd word of that phrase. Kirjoja Movies Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Movies in Estonia" and this combobox text here is the 3rd word of that phrase. Elokuvia Animals Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Animals in Estonia" and this combobox text here is the 3rd word of that phrase. ElУЄimiУЄ Electronics Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Electronics in Estonia" and this combobox text here is the 3rd word of that phrase. SУЄhkУЖlaitteita Jobs Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Jobs in Estonia" and this combobox text here is the 3rd word of that phrase. TyУЖpaikkoja Transportation Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Wanting of Transportation in Estonia" and this combobox text here is the 3rd word of that phrase. Kuljetuksia Services Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Services in Estonia" and this combobox text here is the 3rd word of that phrase. Palveluita Healthcare Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Selling of Healthcare in Estonia" and this combobox text here is the 3rd word of that phrase. Terveydenhoitoa Foodstuff Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Selling of Foodstuff in Estonia" and this combobox text here is the 3rd word of that phrase. Ruokatarvikkeita Software Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Selling of Software in Estonia" and this combobox text here is the 3rd word of that phrase. Ohjelmistoja Events Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Events in Estonia" and this combobox text here is the 3rd word of that phrase. Tapahtumia Education Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Giving away of Education in Estonia" and this combobox text here is the 4th word of that phrase. Koulutusta Finance Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Finance in Estonia" and this combobox text here is the 3rd word of that phrase. Raha-asioita Jewelry Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Selling of Jewelry in Estonia" and this combobox text here is the 3rd word of that phrase. Koruja Religious rituals Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of religious rituals in Estonia" and this combobox text here is the 3rd+4th word of that phrase. Uskonnollisia toimituksia Philosophy Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Philosophy in Estonia" and this combobox text here is the 3rd word of that phrase. Filosofiaa Any country Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Philosophy in Any country" and this combobox text here is end part "Any country" specifying the location where announcement. MissУЄ maassa vain ConnectionListingModel Peer network address Tool tip text. When user hovers mouse cursor on top of network address field in a dialog, this text will appear. Solmun verkko-osoite Inbound connections are those where peer initiated connection Tool tip text. When user hovers mouse cursor on top of field specifying if connection is inbound/outbound this text will appear. SisУЄУЄntulevat yhteydet ovat sellaisia, missУЄ etУЄjУЄrjestelmУЄ aloitti yhteyden Data transferred from peer to your node Tool tip text. When user hovers mouse cursor on top of traffic-counter field in a dialog, this text will appear. Sinun tietokoneeseesi tУЄstУЄ solmusta siirretty tietomУЄУЄrУЄ Data transferred to peer from your node Tool tip text. When user hovers mouse cursor on top of traffic-counter field in a dialog, this text will appear. Sinun tietokoneestasi tУЄhУЄn verkon solmuun siirretty tietomУЄУЄrУЄ Time when connection was opened Tool tip text. When user hovers mouse cursor on top of time-field in a dialog, this text will appear. Yhteyden avaamisaika Address Column header text. Column view is used for listing network connections currently open, this text here gives title for column that shows network address (like IP-address) Verkko-osoite Inbound Column header text. Column view is used for listing network connections currently open, this text here gives title for column that shows direction (inbound/outbound) of the connection SisУЄУЄntuleva Bytes in Column header text. Column view is used for listing network connections currently open, this text here gives title for column that shows number of bytes transferred inside Oktettia sisУЄУЄn Bytes out Column header text. Column view is used for listing network connections currently open, this text here gives title for column that shows number of bytes transferred outside Oktettia ulos Open time Column header text. Column view is used for listing network connections currently open, this text here gives title for column that shows time when connection was opened. Avaamisaika ContactListingModel Yes Text in contact listing column view. This text appears in column telling if user is to be trusted or not and this value here denotes the positive case "user is trusted". Tosi on Unknown Text in contact listing column view. This text appears in column telling if user is to be trusted or not and this value here denotes the negative case "user trust is unknown". Tuntematon Actual network address (SHA1) of the contact Tool tip text. When user hovers mouse cursor on top of field where operators SHA1 digest is shown, this text appears. The field is part of contact listing view, where users frequent contacts are shown. Operaattorin varsinainen verkko-osoite (SHA1) Locally given nickname ; user may set her own nickname himself Tool tip text. When user hovers mouse cursor on top of field where operators locally given nickname is shown, this text appears. The field is part of contact listing view, where users frequent contacts are shown. Antamasi liikanimi; operaattori voi antaa itselleen eri liikanimen Public statement if this operator to be trusted in transactions Tool tip text. When user hovers mouse cursor on top of field where operators trustworthiness (boolean value) in users opinion is shown, this text appears. The field is part of contact listing view, where users frequent contacts are shown. Julkinen lausunto operaattorin luotettavuudesta asioiden hoitamisessa Address Column header text. Used in column view where operators frequent contacts are shown. This text gives title to column that shows operators network address (the SHA digest of operator) Osoite Nickname Column header text. Used in column view where operators frequent contacts are shown. This text gives title to column that shows operators nickname Liikanimi Publicly trusted Column header text. Used in column view where operators frequent contacts are shown. This text gives title to column that shows operators trustworthiness. Julkisesti luotettu ContentEncryptionModel SSL key generation went wrong, calling exit.. Error message that is displayed when SSL key generation failed. Text is displayed in a dialog, after user dismisses the dialog, whole application will exit. SSL-avaimen rakentaminen epУЄonnistui, pakko poistua.. x509 cert generation went wrong, calling exit.. Error message that is displayed when x509 certificate generation failed. Text is displayed in a dialog, after user dismisses the dialog, whole application will exit. x509-sertifikaatin rakentaminen epУЄonnistui, pakko poistua.. RSA Private key key saving went wrong Error message that is displayed when RSA private key could not be saved to database. This is rather fatal error, the operator profile that user tried to create will be un-usable. Salaisen RSA-avaimen tallettaminen epУЄonnistui No suitable de-cryption key found Error message text. This is displayed in situation where user tried to access content that he does not have encryption key for. This may appear frequently during normal operation and is no fatal error, only telling user that he is not going to see the content he was trying to access. Avaamiseen sopivaa salausavainta ei ole kУЄytettУЄvissУЄ Controller Classified ads Window title text for whole application. Luokitellut ilmoitukset Enter password for protection of your messages: Prompt text for password dialog Anna salasana viestiesi sisУЄllУЖn turvaamiseksi Fetching item from network.. Dialog text for a wait dialog (a progress-bar like thing will be shown next to this text and user is supposed to sit down and wait a moment..) Kaivellaan kohdetta verkon syУЖvereistУЄ.. E&xit Menu item text used in "File" menu item and when this particular item is selected, application will close Sulje Exit the application Menu item tooltip-text used in "File" menu entry and when this particular item is selected, application will close Sulje sovellus &About Menu item text used in "File" menu and when this particular item is selected, application will show a dialog telling why this application is and how to use it Tietoja Show the application's About box Tooltip-text of menu item text used in "File" menu and when this particular item is selected, application will show a dialog telling why this application is and how to use it EsitУЄ selvitys sovelluksen tarkoituksesta &Change password Menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to change her password Vaihda salasana Change password of current profile Tooltip-item for a menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to change her password Valitse valitulle operaattori-profiilille uusi salasana Create &new profile Menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to enter password for a newly-created user profile Luo uusi profiili Makes a brand new user profile Tooltip-text for a menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to enter password for a newly-created user profile Luo operaattorille uuden profiilin &Delete current profile Menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to confirm deletion of currently open operator profile Poista valittu profiili Deletes currently open profile Tooltip-text for a menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to confirm deletion of currently open profile PysyvУЄsti poistaa tУЄmУЄnhetkisen valitun profiilin &Select another profile Menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to enter password of another profile that user will use next Valitse kУЄyttУЖУЖn toinen profiilii If you have multitude of profiles Tooltip-text for a menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to enter password of another profile that user will use next Jos olet luonnut useamman profiilin, voit tУЄstУЄ valita toisen Settings.. Menu item text used in "File" menu and when this particular item is selected, application will show a settings-dialog Asetukset.. Node-wide settings.. Tooltip-text for a menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to enter password of another profile that user will use next Solmun asetukset.. Network status.. Menu item text used in "File" menu and when this particular item is selected, application will show a dialog detailing network connectivity of the node Verkko-yhteydet.. Search.. Menu item text used in "File" menu and when this particular item is selected, application will show a search-dialog Etsi.. &File Menu bar title text for "File" menu. Tiedosto &TCL Programs Menu title. Menu contains menu-items related to TCL-programs. TCL-Ohjelmat &Local library Menu item from menu of TCL-related items. Selecting this menu item opens library of TCL programs. TCL-Ohjelmakirjasto Locally stored TCL programs Tooltip-text for menu item that opens local TCL program library. Paikallisen ohjelmakirjaston TCL-ohjelmat. TCL &Console Difficult to translate: after selecting this menu-item you can write ad-hoc TCL programs to TCL interpreter that may be already executing existing program or is empty. Practically gives TCL command line access to possibly running interpreter. TCL-Komentokehote Display interpreter console Tooltip for menu-item that displays dialog where you can type in ad-hoc TCL-programs. TCL-tulkin komennot Enter new password: Password dialog prompt. Anna uusi salasana: Activate another profile with password Password dialog prompt. In this case the password dialog is not used for giving initial password or change password but instead password is typed for the reason of selection of another operator profile to be used. Valitse uusi profiili antamalla haluamasi profiilin salasana Can't delete only profile. Error message shown in dialog in situation where user tried to delete the last (one and only) operator profile in machine. There needs to be at least one profile and this error message is shown if user tries to get around that limitation. ViimeistУЄ jУЄljellУЄ olevaa profiilia ei voi poistaa. Permanently discard profile? Text shown in title of confirmation dialog. Poistetaanko profiili lopullisesti? There will be NO way to access content of this profile later Text shown inside a confirmation dialog. Dialog will have buttons OK and Cancel and this is the question. TУЄmУЄn profiilin viestejУЄ tai muuta sisУЄltУЖУЄ ei ole mahdollista nУЄhdУЄ enУЄУЄ Cant load node cert or key cert Error message that is shown in a dialog in situation where previously stored encryption keys of the node could not be accessed. Rather fatal error, will render node un-usable. Solmun salausavaimen tai sertifikaatin lataaminen ei onnistunut File error Error message dialog title text for a dialog that is shown in a dialog in situation where something bad happened during a filesystem file operation. Actual explanation of the error is shown inside the dialog whose title text this is. TiedostokУЄsittelyyn liittyvУЄ virhe Database error Error message dialog title text for a dialog that is shown in a dialog in situation where something bad happened during database operation. Actual explanation of the error is shown inside the dialog whose title text this is. Tietokantavirhe Cryptographic module Error message dialog title text for a dialog that is shown in a dialog in situation where something bad happened during a operation inside crypto-module. Actual explanation of the error is shown inside the dialog whose title text this is. SalausjУЄrjestelmУЄn virhe Database module Error message dialog title text for a dialog that is shown in a dialog in situation where something bad happened during operation inside database module. Actual explanation of the error is shown inside the dialog whose title text this is. Tietokannan vikatila Bad password Error message dialog title text for a dialog that is shown in a dialog in situation when password supplied by user was not good for any purpose. Actual explanation of the error is shown inside the dialog whose title text this is. Kelpaamaton salasana TCL Interpreter Dialog title for error dialog that displays error message originating from TCL-interpereter. TCL-Ohjelma Could not find item from network.. Error message text inside a dialog when user had requested for an item to be opened but program could not find the requested item. Haluttua kohdetta ei verkosta lУЖytynyt.. SHA1: Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies SHA1 digest of the file. SHA1: Mime-Type: Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies mime-type of the file Mime-Tyyppi: Description: Text field explanation text. Part of "file details" dialog. This text gives explanation of field that gives longer explanation of the file Kuvaus: Publisher: Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies name of publisher of the file (in practice, who uploaded the file into classified ads) Julkaisija: Content owner: Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies name of the person (or organization) that owns (in copyright sense) the file or its contents. SisУЄllУЖn omistaja: License: Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies the license of the file Lisenssi: Name: Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies file name Nimi: Date: Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies file date PУЄivУЄmУЄУЄrУЄ: DialogBase File way too big Error message text shown inside dialog when user tries to select for operation a file that is much much too big. (there is currently 2MB size limit for shared files) Tiedosto on ihan liian iso File too big Error message text shown inside dialog when user tries to select for operation a file that is just-and-just too big. (there is currently 2MB size limit for shared files) Tiedosto on liian iso File open error Error message text shown inside dialog when user tries to select for operation a file that can not be opened (for example due to file permission reasons) Ongelma tiedoston avaamisessa Select file to be published Dialog title text. Dialog prompts user to select the filesystem file that will be published inside classified ads. Valitse julkaistava tiedosto Files (*.*) Text for file type filter field in file-selection-dialog Kaikki tiedostot (*.*) EditContactDialog Error Title text of error dialog. Vikaa Operator addr is not valid Contet text of error dialog. Shown after user has tried to enter operator address with intent of adding it to contact-list and the operator address fails format validation. Operaattorin osoite ei ole sopivaa muotoa FrontWidget Classified ads Tab text. In "main window" of classified ads UI there a are 4 or 5 tabs, normally "Classified ads"; "My profile", "Contacts", "Private messages" and maybe something else. This is the text of the first tab. Luokitellut ilmoitukset My profile Tab text. In "main window" of classified ads UI there a are 4 or 5 tabs, normally "Classified ads"; "My profile", "Contacts", "Private messages" and maybe something else. This is the text of the 2nd tab. Oma profiili Contacts Tab text. In "main window" of classified ads UI there a are 4 or 5 tabs, normally "Classified ads"; "My profile", "Contacts", "Private messages" and maybe something else. This is the text of the 3rd tab. Osoitekirja Private messages Tab text. In "main window" of classified ads UI there a are 4 or 5 tabs, normally "Classified ads"; "My profile", "Contacts", "Private messages" and maybe something else. This is the text of the 4th tab. Yksityiset viestit Add shared file.. Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, a dialog will appear asking which file to share LisУЄУЄ tiedosto jakoon Stop advertising selected shared file Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, the selected file in the listing view will no longer be shared Lakkaa mainostamasta valittua jaettua tiedostoa Save file to disk.. Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, the selected file in the listing view will be saved to filesystem Tallenna tiedosto tiedostojУЄrjestelmУЄlle View file information.. Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, information dialog about selected file will be shown Tarkastele tiedoston ominaisuuksia.. Copy file address (SHA1) to clipboard.. Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, SHA digest of the selected file will be copied to clipboard. Kopioi tiedoston osoite (SHA1) leikepУЖydУЄlle.. Edit+publish new text document.. Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, an editor will be displayed prompting user to enter text that will then be published for other users to see. Muokkaa ja julkaise uusi tekstidokumentti.. Open File Dialog title text for "file open" dialog Avaa tiedosto Files (*.*) Text for filter field of file selection dialog Kaikki tiedostot (*.*) Error Error dialog title text. Actual error message will be shown inside dialog whose title is this text. Vikaa.. Can't load image Error dialog content text. Shown when image file that user selected could not be opened (maybe because file permission problem or maybe image format issue or ..) Kuvan avaaminen ei onnistu Profile not in database Error dialog title text. This dialog is shown when user tries to comment another operator but required operator data is missing from local storage. Profiilia ei tietovarastosta lУЖydy Try viewing profile first to obtain data Error dialog content text. This dialog is shown when user tries to comment another operator but required operator data is missing from local storage. YritУЄ valita profiili katseltavaksi ensin, yritУЄ sitten uudelleen Select file to be published File selection title text. Prompts user to select a file for publish purpose. Valitse julkaistava tiedosto File way too big Error text shown in dialog. Shown in situation where user selected a file that really exceeds size limit (of 2MB) Tiedosto on aivan liian suuri File too big Error text shown in dialog. Shown in situation where user selected a file that slightly exceeds size limit (of 2MB) Tiedosto on liian suuri File open error Error text shown in dialog. Shown in situation where user selected a file that could for some reason not be opened Ongelma tiedoston avaamisessa files Part of filter text field in file selection dialog. If for instance user tries to open PNG files, then the text in filter field will be "PNG files (*.png)" and this word is the 2nd word in the phrase. kaikki tiedostot Save location Dialog title for dialog that asks whether user wants to save TCL program into local library or into filesystem file Mihin tallennetaan Save to TCL app library instead of regular file? Dialog text in question dialog asking if user wants to save TCL app into local library or into filesystem file Tallennetaanko TCL-ohjelmien kirjastoon vai tiedostojУЄrjestelmУЄlle? Choose file name for saving File selection dialog title text. Dialog prompts user to select location+name for an file to be exported into filesystem. Valitse nimi tallennettavalle tiedostolle Click To Add Image Text shown in placeholder for operators image in situation where user has not yet selected any image. In practice it prompts user to insert image by clicking at the text. Klikkaa LisУЄtУЄksesi Kuva Article not found from local storage Error message dialog content text shown when user tried to access article, that was not stored in local database Artikkelia ei paikallisesta tietokannasta lУЖydy Trusted by %1 SHA1 %2 Tool-tip text. Shown on top of operators address when user hovers mouse on top of the address field. The %1 will be replaced by nickname of an operator who trusts this particular operator. The %2 will be replaced by SHA1 digest of the operator who trusts the operator whose SHA1 is under mouse cursor. Johon luottaa %1 SHA1 %2 Time of last update Tool tip text. Shown when user howers mouse on top of operators nickname field. In code a date-string will be concatenated to this string, so in practice in the UI it will read "Time of last update 31 aug 2015" or similar. Viimeinen pУЄivitysajankohta (No Image Selected) Text for image placeholder, shown in situation where another operator has not selected any image for her.This text is shown place of the missing image. (Ei Kuvaa Valittuna) Edit contact.. Context menu item text. Context-menu is related to frequent-contacts column-view. Muokkaa profiilin tietoja &Reply to sender Push button text. Pushing the button will open an editor prompting user to edit+send a private message to operator who sent the classified ad currently on display Vastaa lУЄhettУЄjУЄlle Reply to &forum Push button text. Pushing the button will open an editor prompting user to edit+send a reply to classified ad currently on display Vastaa foorumille &Post new ad Push button text. Pushing the button will open an editor prompting user to edit+send a new classified ad. Uusi ilmoitus &Public comment Push button text. Pushing the button will open an editor prompting user to edit+send a public comment about operator who sent the classified ad currently on display Uusi kommentti &View profile Push button text. Pushing the button will switch to view detailing operator who sent the classified ad currently on display Katsele profiilia Attachments.. Push button text. Pushing the button will open a a listing of files that are attached to classified ad currently on display Liitetiedostot.. Add selected operator to contacts.. Push button text. Pushing the button will open an editor prompting user to add to her contact-list the operator who sent the classified ad currently on display LisУЄУЄ valittu operaattori osoitekirjaan.. &Reply Push button text. Pushing the button will open an editor prompting user to edit+send a private message to operator who sent the private message currently on display Vastaa &New message Push button text. Pushing the button will open an editor prompting user to edit+send a private message to some operator. Uusi viesti &Send public comment to sender Push button text. Pushing the button will open an editor prompting user to edit+send a public comment about operator who sent the private message currently on display EsitУЄ julkinen kommentti lУЄhettУЄjУЄstУЄ &View profile of peer Push button text. Pushing the button will open view that will show details of operator, who sent the private message currently on display. NУЄytУЄ viesti-osapuolen profiili Add selected to contacts.. Context menu item text. Appears in "message listing view" when user right-clicks on messages view. When selected, the operator who sent the message that is selected is added to contacts. LisУЄУЄ valittu osoitekirjaan From: Text field label. Label tells who sent particular classified ad. KeneltУЄ: Subject: Text field label. Label tells subject of classified ads. Aihe: To: Text field label. Label tells whom a private message was sent to. Kenelle: Invalid SHA1 in URL Error dialog content text. Shown in situation when user clicked on a link that contained SHA1 digest that was not valid. Viallinen SHA1-tiiviste URLissa Invalid URL Error dialog content text. Shown in situation when user clicked on a link that was not correctly formatted. Viallinen URL InsertLinkDialog Invalid URL Error dialog content text. Shown in situation when user entered a link that could not be parsed. VУЄУЄrУЄn mallinen URL ManualConnectionDialog DNS lookup failure Error dialog content text. Shown in situation when user tried to add connection to node whose name was not found via nameserver. NimeУЄ ei lУЖydy nimipalvelusta (DNS) NewPrivMessageDialog Error Error dialog title text. Actual error message will be shown inside the dialog. Vikaa Recipient addr is not valid Error dialog content text. Dialog is shown when user tries to send a message to operator, whose SHA1 digest (as entered by user) does not parse as SHA1 digest. Vastaanottajan osoite ei ole kelvollinen Recipient encryption key not found from storage Error dialog content text. Dialog is shown when user tries to send a message to operator, whose encryption keys are present in local storage. Vastaanottajan salausavainta ei paikallisesta tietokannasta lУЖydy NewProfileCommentDialog Error Error dialog title text. Actual error message will be shown inside the dialog. Vikaa Commented profile addr is not valid Error dialog content text. Dialog is shown when user tries to comment an operator, whose SHA1 digest (as entered by user) does not parse as SHA1 digest. Kommentoidun profiilin osoite ei ole kelvollinen Recipient encryption key not found from storage Error dialog content text. Dialog is shown when user tries to send a message to operator, whose encryption keys are present in local storage. Valitun profiilin salausavainta ei paikallisesta tietokannasta lУЖydy NodeModel SSL key generation went wrong, calling exit.. Error message text. Will be shown in error message dialog in case when initial SSL key generation of node did not succeed. After user dismisses the dialog, the application will close. SSL-avaimen luonti epУЄonnistui, poistutaan.. x509 cert generation went wrong, calling exit.. Error message text. Will be shown in error message dialog in case when initial encryption key generation of user did not succeed. After user dismisses the dialog, the application will close. x509-sertifikaatin luonti epУЄonnistui, poistutaan.. Cant load SSL cert Error message text. Will be shown in error message dialog in case when SSL certificate of the node could not be loaded from storage. After user dismisses the dialog, the application will close. SSL-sertifikaatin lataaminen ei onnistu Cant load SSL key Error message text. Will be shown in error message dialog in case when SSL key of the node could not be retrieved from local storage. After user dismisses the dialog, the application will close. SSL-avaimen lataaminen ei onnistu PasswdDialog Min length 5 (use 10+) Error message text. Shown in dialog when user tries to enter a password that is too short. VУЄhimmУЄispituus on 5 (kУЄytУЄ silti ainakin 10) PasswordDialog Password required Password dialog title text. Salasana on pakollinen Should you forget this word, there is no easy way to recover any of your content Tooltip text for password dialog. Shown when user hovers on top of password dialog. Unohdapa tУЄmУЄ salasana ja viestiesi lukemiseen vain ei ole olemassa mitУЄУЄn helppoa menetelmУЄУЄ Enter password for protection of your messages Prompt text for password dialog. Valitse salasana viestiesi turvaamiseksi If you forget this word, there is no simple way to recover your contents Tooltip text for password dialog. Shown when user hovers on top of password field Jos unohdat tУЄmУЄn sanan, viestiesi lukemiseksi ei ole olemassa mitУЄУЄn helppoa menetelmУЄУЄ OK Password dialog button text OK Show password Check-box item text. If check-box is selected, password is shown in text editor, if not selected then "hidden text" editor is used that does not show the word being typed. NУЄytУЄ salasana PrivateMessageSearchModel %1 Trusted by %2 Tooltip text. Shown when user hovers mouse cursor on top of message sender name. First %1 will be replaced with nickname of the operator whose message is hovered, %2 will be replaced by nickname of operator who has expressed positive trust towards the operator who sent the message. %1 johon luottaa %2 Direction of message, sent/received Tooltip text. Used in column view that lists private messages of operator. Explains the field that gives title to column that specifies direction (sent or received) of the message. Viestin suunta, lУЄhetetty/vastaanotettu Dir Column title text. Used in column view that lists private messages of operator. This field gives title to column that specifies direction (sent/received) of the message. Suunta Peer Column title text. Used in column view that lists private messages of operator. This field gives title to column that specifies messaging peer (another operator) of the message. Osapuoli Time Column title text. Used in column view that lists private messages of operator. This field gives title to column that specifies time of the message. Aika Subject Column title text. Used in column view that lists private messages of operator. This field gives title to column that specifies subject of the message. Aihe ProfileCommentDisplay &Add comment... Push button text. Clicking the button will open a dialog prompting user to add a new comment LisУЄУЄ kommentti... Save attachment to disk.. Context menu item text. Context menu is shown when user right-clicks on file listing view. When this item is selected, a file selection dialog is opened. Tallenna liite tiedostojУЄrjestelmУЄlle.. Error Error dialog title text Vikaa Article not found from local storage Error dialog content text. Shown after user tried to access a profile comment and the comment could not be found Kommenttia ei paikallisesta tietokannasta lУЖydy ProfileCommentItemDelegate Attachments: Text field label text. The text field whose label this is will show number how many attachements there are in the comment. Liitteet: ProfileCommentListingModel Sender Column view column title text. The column view in question lists profile comments. This text gives title to column that tells who sent the comment. LУЄhettУЄjУЄ Time Column view column title text. The column view in question lists profile comments. This text gives title to column that tells when comment was sent. Aika Subject Column view column title text. The column view in question lists profile comments. This text gives title to column that tells subject of the comment. Aihe ProfileCommentModel Profile related to comment not found from database Error message text. Shown inside a dialog after user tried to send a comment to operator who had sent a comment and it turns out that necessary encryption keys of the commenting operator are not found and the replying comment can't be sent. Kommenttiin liittyvУЄn profiilin tietoja ei paikallisesta tietokannasta lУЖydy ProfileReadersDialog View profile Context menu item text. This context-menu is shown when user right-clicks list of operators that is shown in dialog that is made for listing operators (who are readers of another profile) Tarkastele profiilia ProfileReadersListingModel Name or fingerprint of reader Column view column title text. The column view lists readers (operators) of another profile. Lukijan nimi tai SHA1-tiiviste RingtonePlayer raw audio format not supported by backend, cannot play audio. Error message text, displayed in dialog if audio hardware does not support the format. Should be rare occasion or then gross error like missing soundcard. У„УЄniformaatti ei ole tuettu, УЄУЄniУЄ ei voi soittaa. Could not initialize audio player. Error message text shown in dialog if audio output API returned error in initialization. Should be rare error, or missing audio hardware .. or audio subsystem configuration error. У„УЄnitoistimen alustus epУЄonnistui. SearchDisplay Open.. Context menu item text. This context menu is shown when user right-clicks on top of search-results. This menu-item opens the currently-selected item from search results. Avaa.. TclProgramsDialog Evaluate Button text. When button is pressed, TCL program is started. Suorita Stop program Button text. If button is pressed, TCL program being executed is stopped. PysУЄytУЄ ohjelma Delete program Button text for button that permanently removes TCL program from local library Poista ohjelma TCL Program name Dialog title for dialog that asks user to type in name of TCL program. TCL-Ohjelman nimi Name: Text-input label text. Text input will contain name of TCL program. Nimi: Deletion confirmation Dialog title text for situation where user is about to delete a TCL program. Dialog includes question and yes+no buttons. Poistovarmistus Permanently delete program %1? Dialog text from deletion-confirmation dialog Poistetaanko pysyvУЄsti ohjelma %1? TextEdit Help Menu title text. This is the help menu. Apua About &Qt Menu-item text used in "help" menu. Selecting this item opens "about" dialog about Qt library. Tietoja Qt:stУЄ Edit Actions Window title text for container-window containing actions. It seems to me that this text actually does not appear anywhere in the UI due to way, how container-windows are used. Muokkaa toimintoja &File Menu text. This gives text to "file" menu of a text editor. Tiedosto &Open... Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "open a filesystem file" Avaa.. &Save locally before send Menu item text inside menu in text editor. When selected, the text being edited will be saved into local filesystem file. Tallenna paikallisesti ennen lУЄhettУЄmistУЄ Save locally &As... Menu item text inside menu in text editor. When selected, the text being edited will be saved into local filesystem file and user will be queried for file name. Tallenna paikallisesti nimellУЄ.. &Print... Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "print" Tulosta.. Print Preview... Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "open print preview" Tulostuksen esikatselu.. &Export PDF... Menu-item text. Used in file-menu for triggering "export as pdf" operation Vie PDF-muodossa.. &Edit Menu text for "edit" menu of text editor. Muokkaa &Undo Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "undo" Peru &Redo Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "re-do" Tee uudelleen Cu&t Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "cut" (to clipboard) Leikkaa &Copy Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "copy to clipboard" Kopioi &Paste Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "paste from clipboard" LiitУЄ Insert link Menu item text inside text editor "edit" menu. After this menu-item is selected, a dialog is opened, prompting user to enter a link (URL) to be included in the text. LisУЄУЄ viite Embed image Menu-item text for embedding an image SisУЄllytУЄ kuva F&ormat Menu text. Gives name for a "format" menu inside a text editor. Muotoile &Bold Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "toggle bold text style" Lihavoitu &Italic Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "toggle italic text" Kursivoitu &Underline Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "toggle underline" Alleviivattu &Left Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "left-justify" Tasattu vasemmalle C&enter Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "toggle centered text" Keskitetty &Right Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "right-justify" Tasattu oikealle &Justify Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "justify both right+left" Tasattu molempiin laitoihin &Color... Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "color selection" VУЄri.. Standard Combobox item text. The combobox is used to select text style. The text style selected with this text is "standard" Normaalimuoto Bullet List (Disc) Combobox item text. The combobox is used to select text style. The text style selected with this text is "bullet list (disc)" Pisteellinen lista (palloilla) Bullet List (Circle) Combobox item text. The combobox is used to select text style. The text style selected with this text is "bullet list (circle)" Pisteellinen lista (ympyrУЖillУЄ) Bullet List (Square) Combobox item text. The combobox is used to select text style. The text style selected with this text is "bullet list (square)" Pisteellinen lista (laatikoilla) Ordered List (Decimal) Combobox item text. The combobox is used to select text style. The text style selected with this text is "ordered list (decimal)" Numeroitu lista (desimaaliluvuin) Ordered List (Alpha lower) Combobox item text. The combobox is used to select text style. The text style selected with this text is "ordered list (alpha lower)" Numeroitu lista (pienin kirjaimin) Ordered List (Alpha upper) Combobox item text. The combobox is used to select text style. The text style selected with this text is "ordered list (alpha upper)" Numeroitu lista (suurin kirjaimin) Ordered List (Roman lower) Combobox item text. The combobox is used to select text style. The text style selected with this text is "ordered list (roman lower)" Numeroitu lista (pienin roomalaisin) Ordered List (Roman upper) Combobox item text. The combobox is used to select text style. The text style selected with this text is "ordered list (roman upper)" Numeroitu lista (suurilla roomalaisilla) Application Warning dialog title text. This dialog is shown if user tries to exit without saving her text. Tekstimuokkain The document has been modified. Do you want to save your changes? Warning dialog title content text. Text asks what to do with modifications. The dialog has buttons Save,Discard and Cancel and this text is the question. Tiedostoa on muutettu, haluatko tallettaa muutokset? Open File... File selection dialog title text. Dialog will prompt user to select a document for opening. Avaa tiedosto.. HTML-Files (*.htm *.html);;All Files (*) Text for file selection filter field to be used inside file selection dialog. There are 2 parts, separated by ";;" and those semicolons must be left in place. Also the filter parts like (*.htm) must not be edited. The explanations like "HTML-Files" may be edited. HTML-Tiedostot (*.htm *.html);;Kaikki tiedostot (*) Save as... File selection dialog title text. Dialog in question prompts user to select name for file to be persisted. Tallenna nimellУЄ.. ODF files (*.odt);;HTML-Files (*.htm *.html);;All Files (*) Text for file selection filter field to be used inside file selection dialog. There are 3 parts, separated by ";;" and those semicolons must be left in place. Also the filter parts like (*.odt) must not be edited. The explanations like "ODF-files" may be edited. ODF Tiedostot (*.odt);;HTML-Tiedostot (*.htm *.html);;Kaikki tiedostot (*) Print Document Dialog title text. The dialog is printer dialog asking user how to print the text currently in editor. Tulosta dokumentti Open File File selection dialog title text. Dialog will prompt user to select a document for opening. Avaa tiedosto Files (*.*) Text for file selection filter field to be used inside file selection dialog. The filter parts like (*.odt) must not be edited. The explanations like "Files" may be edited. Kaikki tiedostot (*.*) Error Error dialog title text. Tapahtui virhe Can't load image Error dialog content text. Kuvan avaaminen ei onnistu File way too big Error message displayed inside error dialog after user tried to select for operation a file whose size greatly exceeds file size limit. Tiedosto on aivan liian suuri VoiceCallEngine Accept Button text for "incoming call" dialog. When user hits the button, call is answered. Vastaa Reject Button text for "incoming call" dialog. When user hits the button, incoming call is rejected. HylkУЄУЄ Close Button text for "ongoing call" dialog. When button is hit, call is closed. Sulje Actual network address (SHA1) of the peer operator Tooltip text. Shown in listing of ongoing calls. This tooltip explains "operator address" column of the display. The text explained is SHA1-digest or operator name if known. Osapuolen profiilin SHA1-tiiviste Network address of the remote node Tooltip text for list display that lists ongoing voice calls. The text explained is (IP) address of the remote node of the voice call participant. Osapuolen kУЄyttУЄmУЄn solmun verkko-osoite Operator Column header text for display that lists ongoing calls. This gives header text for column that shows name of the call participant Operaattori Node address Column header text for display that lists ongoing calls. This gives header text for column that shows network address of the call participant Verkko-osoite Call status Column header text for display that lists ongoing calls. This gives header text for column that shows state of the call (like open, closed, ringing etc) Puhelun tila Controls Column header text for display that lists ongoing calls. This gives header text for column containing buttons for accepting, rejecting and ending a call. Hallinta Ending Column header text for display that lists ongoing calls. This gives header text for column that shows name column containing button for ending an ongoing call. PУЄУЄttУЄminen Initializing Call status text. When making a new outgoing call, this is status for new call that is not answered yet. Alustetaan Incoming Call status text. When receiving a new incoming call, this is status for new call that is not answered yet. Saapuva Open Call status text. When voice call is in progress, this is the status. Avoinna Closing Call status text. When voice call is marked to be closed, this is its status. Suljetaan Closed Call status text. When voice call is closed, this is the status text. Suljettu Error Call status text. When voice call attempt ends in error, this is text displayed. Virhe No call Call status text. When there is no voice call to display, this text may be displayed instead. Ei puhelua Audio call is not possible Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "general purpose" excuse, when no detailed reason is know. Puhelu ei ole mahdollinen Audio call is possible Tooltip text for button that initiates a new call. This gives an excuse why button is not dimmed and call is possible. Puhelu on mahdollinen Audio call is not possible: operator address unknown Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "SHA1 digest of operator is not known" Puhelu ei ole mahdollinen: operaattorin SHA1-tiiviste on tuntematon Audio call is not possible: operator profile not found Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "operators profile not found (from local database)" Puhelu ei ole mahdollinen: operaattorin profiilia ei lУЖydy Audio call is not possible: operator has no node information in profile Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "there is no network address included in node information of the profile" Puhelu ei ole mahdollinen: operaattorin solmusta puuttuu verkko-osoite Audio call is not possible: operators IPv4 address %1 not connected Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "there is no (ipv4) network connection to node" Puhelu ei ole mahdollinen: operaattorin solmun IPv4-verkko-osoitteeseen %1 ei ole yhteyttУЄ Audio call is not possible: operators IPv6 address %1 not connected Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "there is no (ipv6) network connection to node" Puhelu ei ole mahdollinen: operaattorin solmun IPv6-verkko-osoitteeseen %1 ei ole yhteyttУЄ Audio call is not possible: local node has no IPv6 address, operator has only IPv6 addr Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is protocol mismatch. Puhelu ei ole mahdollinen: paikallisella solmulla ei ole IPv6-osoitetta, operaattorilla on vain IPv6 Audio call is not possible: operator does not publish network address Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "operator does not publish network address of his node" Puhelu ei ole mahdollinen: operaattori ei julkaise verkko-osoitettaan aboutDialog About classified ads Dialog title text for "about" dialog. Tietoja luokitelluista ilmoituksista Classified ads is a program for online communications 1st line of text inside "about" dialog, placed next to the turle logo. This text is then followed by longer explanation detail why this program is and how. This is kind of title for the longer explanation. Luokitellut ilmoitukset on viestintУЄУЄn tarkoitettu tietokoneohjelma <html><head/><body><p>Classified ads is free software. You may use, copy and modify it if you follow the conditions given in GNU lesser general public license version 2.1.</p><p>Classified ads is copyright ТЉ Antti JУЄrvinen 2013. </p><p>Main feature of the program is an &quot;advertisement&quot; - a piece of text belonging to selected classification. There are several pre-programmed classifications and operators are encouraged to invent new classifications for new purposes ; the selection boxes in classification-selection tab are editable. Other operators may then view the ads, publicly comment the ads, the operators and also send private messages to each others. </p><p>Another important feature of classified ads is that it is designed to be operated without any centralized server infrastructure - it is you and other operators whose computers store and transmit all the content visible inside classified ads. To get connected you need to know address of at least one existing computer (a <span style=" font-style:italic;">node</span>) so if your network connection dialog shows no connections, you may need to contact someone you know is using the software and ask for address of her node to make initial contact with the network. Once connected the software should maintain list of addresses of other nodes. </p><p>Due to its server-less design the whole system works best if you leave the program running always when you have your computer powered on ; while processing other operators requests it will hog some computing resources and generate network traffic also when you are not actively using the program yourself - others are. </p><p>Operators concerned about privacy of the content should be aware of following items:</p><p>- Data storage implementation is variant of <span style=" font-style:italic;">distributed hash table</span>, practically meaning that content posted by you gets copied some more-or-less random nodes in the network. </p><p>- Any data item (ad, comment, binary file, private message etc.) is digitally signed. This makes it more difficult to try to pose as another operator. </p><p>- Operators are reliably identified only by the SHA1 hash of their generated encryption keys. SHA1 hash is displayed when viewing details of operator profiles. Other identifying information like nickname or city name are entered by operator himself and can be anything. The operator profile, as it is published to the network, is also signed with the encryption keys of the operator - if you identify an operator by her SHA1 hash, you have a mechanism for identifying if any content inside classified ads is posted by this operator or not. Classified ads internally checks for digital signatures, throwing away content that fails signature check and tries to provide SHA1 hash of the operator who posted the content.</p><p>- All classified ads are posted as plain text, no encryption is used. All public profiles are posted as plain text, no encryption is used. If profile is made private, it is encrypted to be readable only by selected other profiles. This applies also to binary files shared by operators private profiles and comments about private profiles after the profile was made private (previously plain-text comments or files don't get magically encrypted afterwards). Private messages are encrypted always to be readable only by recipient and sender. Attachments follow the privacy rules of the document, they're attached to. </p><p>- As is the case with all internet-communications, this small fact is true for classified ads too : <span style=" font-style:italic;">once something gets posted online, there is no way to remove it from network</span>. </p><p>- Data encryption implementation for content is OpenSSL, relying mostly on algorithms RSA-2048 and AES-256. </p><p>- While connections between nodes are implemented using SSL, other nodes inside network do get to know what content is being transmitted in neighboring nodes. While there is no central point for easily collecting this information about particular classification or operator, operators still should expect no privacy regarding their doings online, although some effort has been been put into hiding <span style=" font-style:italic;">contents</span> of private messages and private profiles. </p><p>Programming was (mostly) done by Antti JУЄrvinen, artwork by Meeri JУЄrvinen.</p><p>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/).</p><p>Happy advertising!</p><p><br/></p></body></html> <html><head/><body><p>Classified ads is free software. You may use, copy and modify it if you follow the conditions given in GNU lesser general public license version 2.1.</p><p>Classified ads is copyright ТЉ Antti JУЄrvinen 2013. </p><p>Main feature of the the program is an &quot;advertisement&quot; - a piece of text belonging to selected classification. There are several pre-programmed classifications and operators are encouraged to invent new classifications for new purposes ; the selection boxes in classification-selection tab are editable. Other operators may then view the ads, publicly comment the ads, the operators and also send private messages to each others. </p><p>Another important feature of classified ads is that it is designed to be operated without any centralized server infrastucture - it is you and other operators whose computers store and transmit all the content visible inside classified ads. To get connected you need to know address of at least one existing computer (a <span style=" font-style:italic;">node</span>) so if your network connection dialog shows no connections, you may need to contact someone you know is using the software and ask for address of her node to make initial contact with the network. Once connected the software should maintain list of addresses of other nodes. </p><p>Due to its server-less design the whole system works best if you leave the program running always when you have your computer powered on ; while processing other operators requests it will hog some computing resources and generate network traffic also when you are not actively using the program youself - others are. </p><p>Operators concerned about privacy of the content should be aware of following items:</p><p>- Data storage implementation is variant of <span style=" font-style:italic;">distributed hash table</span>, practically meaning that content posted by you gets copied some more-or-less random nodes in the network. </p><p>- Any data item (ad, comment, binary file, private message etc.) is digitally signed. This makes it more difficult to try to pose as another operator. </p><p>- Operators are reliably identified only by the SHA1 hash of their generated encryption keys. SHA1 hash is displayed when viewing details of operator profiles. Other identifying information like nickname or city name are entered by operator himself and can be anything. The operator profile, as it is published to the network, is also signed with the encryption keys of the operator - if you identify an operator by her SHA1 hash, you have a mechanism for identifying if any content inside classified ads is posted by this operator or not. Classified ads internally checks for digital signatures, throwing away content that fails signature check and tries to provide SHA1 hash of the operator who posted the content.</p><p>- All classified ads are posted as plain text, no encryption is used. All public profiles are posted as plain text, no encryption is used. If profile is made private, it is encrypted to be readable only by selected other profiles. This applies also to binary files shared by operators private profiles and comments about private profiles after the profile was made private (previously plain-text comments or files don't get magically encrypted afterwards). Private messages are encrypted always to be readable only by recipient and sender. Attachments follow the privary rules of the document, they're attachted to. </p><p>- As is the case with all internet-communications, this small fact is true for classified ads too : <span style=" font-style:italic;">once something gets posted online, there is no way to remove it from network</span>. </p><p>- Data encryption implementation for content is OpenSSL, relying mostly on algorithms RSA-2048 and AES-256. </p><p>- While connections between nodes are implemented using SSL, other nodes inside network do get to know what content is being transmitted in neighboring nodes. While there is no central point for easily collecting this information about particular classification or operator, operators still should expect no privacy regarding their doings online, although some effort has been been put into hiding <span style=" font-style:italic;">contents</span> of private messages and private profiles. </p><p>Programming was (mostly) done by Antti JУЄrvinen, artwork by Meeri JУЄrvinen.</p><p>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/).</p><p>Happy advertising!</p><p><br/></p></body></html> The long explanation of classified ads inside about-dialog. Note that this text must be valid html. Needs to start with <html> and end with </html> etc. This is easiest to edit like this: copy-paste the content in to a file, say /tmp/about.html. Then either open your favourite html-editor or open classified ads. In classified ads you can start constructing an ad, select from file-menu "open.." and select this file ;do editing and save from file-menu. The saved file is immediately in correct format to be be copy-pasted into contents of this field. <html><head><meta name="qrichtext" content="1" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Ubuntu'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Luokitellut ilmoitukset on vapaasti kУЄytettУЄvУЄ ohjelmisto. Voi kУЄyttУЄУЄ, kopioida ja muokata sitУЄ noudattaen LGPL-lisenssin (GNU Lesser General Public License 2.1) ehtoja.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">TУЄmУЄn ohjelman kopiointioikeudet omistaa Antti JУЄrvinen, vuodesta 2013. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ohjelman keskeinen ominaisuus on &quot;ilmoitus&quot; - teksti, joka kuuluu johonkin luokitteluun. Ohjelma sisУЄltУЄУЄ joukon valmiita luokitteluita ja kУЄyttУЄjiУЄ rohkaistaan keksimУЄУЄn uusia ; luokittelu-valintoihin &quot;ilmoitukset&quot;-vУЄlilehdellУЄ voi kirjoittaa mitУЄ hyvУЄnsУЄ. Muut kУЄyttУЄjУЄt voivat katsella ilmoituksia, julkisesti kommentoida ilmoituksia ja lУЄhettУЄУЄ viestejУЄ toisilleen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ohjelman toinen keskeinen ominaisuus on, ettei se kУЄytУЄ keskitettyУЄ tietovarastoa millУЄУЄn verkkopalvelimella - yksittУЄisten kУЄyttУЄjien tietokoneet, joilta ohjelmistoa kУЄytetУЄУЄn tallettavat ja vУЄlittУЄvУЄt kaiken ohjelman sisУЄllУЄ esitettУЄvУЄn sisУЄllУЖn. LiittyУЄksesi tУЄhУЄn verkkoon sinun on tiedettУЄvУЄ ainakin yhden sellaisen tietokoneen (solmun) verkko-osoite, jossa jo valmiiksi kУЄytetУЄУЄn luokiteltuja ilmoituksia. MikУЄli tilanne on sellainen, ettУЄ &quot;verkon tila&quot; -dialogi nУЄyttУЄУЄ 0 avointa yhteyttУЄ, sinun on kysyttУЄvУЄ joltain ystУЄvУЄltУЄsi hУЄnen solmunsa verkko-osoite ja syУЖtettУЄvУЄ se ohjelmaan saadaksesi yhteyden luokiteltujen ilmoitusten verkkoon. Kun ohjelma on kerran liitetty verkkoon, se pyrkii itse yllУЄpitУЄmУЄУЄn listan verkon muista koneista.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Johtuen suunnitelusta, johon verkkopalvelimet eivУЄt kuulu tУЄmУЄ jУЄrjestelmУЄ toimii parhaiten, jos jУЄtУЄt tУЄmУЄn ohjelman pУЄУЄlle myУЖs silloin, kun et itse aktiivisesti kУЄytУЄ jУЄrjestelmУЄУЄ. Ohjelma vie jonkin verran tietojenkУЄsittelykapasiteettia koneeltasi ja aiheuttaa verkkoliikennettУЄ myУЖs silloin kun et itse ohjelmaa kУЄytУЄ - mutta muut kУЄyttУЄjУЄt kУЄyttУЄvУЄt. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">YksityisyydestУЄУЄn huolestuneet kУЄyttУЄjУЄt huomatkoot seuraavat seikat:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Tietovarasto on toteutettu hajautettuna tiivistetaulukkona (distributed hash table DHT), mikУЄ kУЄytУЄnnУЖssУЄ tarkoittaa ettУЄ verkkoon postitetut ilmoitukset ja muu sisУЄltУЖ pУЄУЄtyvУЄt enemmУЄn tai vУЄhemmУЄn satunnaisille verkon solmuille sУЄilytettУЄvУЄksi, DHT-algoritmin mukaisesti.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Kaikki verkon tallettamat tietoalkiot (ilmoitukset, kommentit, tiedostot, yksityiset viestit jne.) ovat digitaalisesti allekirjoitettuja. TУЄstУЄ syystУЄ on hankalaa pyrkiУЄ esiintymУЄУЄn eri operaattorina kuin oikeasti on. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Operaattorin ainoa luotettava tunniste on hУЄnen salausavaimensa SHA1-tiiviste. SHA1-tiiviste on nУЄhtУЄvillУЄ operaattorin tiedot esittУЄvУЄllУЄ vУЄlilehdellУЄ. Muut tiedot kuten liikanimi tai kaupungin nimi ovat operaattorin syУЖtettУЄvissУЄ ja luonnollisesti voivat olla ihan mitУЄ tahansa. Operaattorin profiilin tiedot verkkoon julkaistuna ovat myУЖs allekirjoitetut, kУЄyttУЄen operaattorin salausavainta - mikУЄli haluat kohtuullisella luotettavuudella tietУЄУЄ onko joku verkon sisУЄltУЖ tietyn operaattorin julkaisemaa vai ei, tУЄmУЄ tapahtuu tarkastamalla lУЄhettУЄjУЄn SHA1-tiiviste. Luokitellut ilmoitukset tarkastaa saapuvien tietoalkioiden allekirjoitukset ja jУЄttУЄУЄ tallettamatta sisУЄllУЖt, joiden allekirjoitus ei vastaa sisУЄltУЖУЄ. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Kaikki luokitellut ilmoitukset julkaistaan ilman salausta ja ovat kaikkien luettavissa. Kaikki julkiset profiilit julkaistaan ilman salausta, ja ovat kaikkien luettavissa. MikУЄli profiili merkitУЄУЄn yksityiseksi, se salataan siten, ettУЄ lueteltujen operaattoreiden salausavainta kУЄyttУЄen profiilin tiedot ovat luettavissa. TУЄmУЄ pУЄtee myУЖs profiiliin liittyviin kommentteihin ja jaettuihin tiedostoihin. Muutos ei ole takautuva, eli jos profiili on aiemmin ollut julkinen, sen kommentit ja tiedostot eivУЄt automaattisesti muutu salatuiksi kun profiili muutetaan yksityiseksi. Yksityiset viestit kuljetetaan aina salattuna. Liitetiedostot noudattavat sen dokumentin yksityisyyssУЄУЄntУЖjУЄ, mihin ne on liitetty.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Kuten kaiken internet-viestinnУЄn kanssa tosi on, myУЖs tУЄmУЄ pУЄtee: jos jotain sisУЄltУЖУЄ verkkoon lУЄhetetУЄУЄn, <span style=" font-style:italic;">ei ole olemassa keinoa pysyvУЄsti sitУЄ poistaa.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Salaustoteutus on OpenSSL, useimmin kУЄytetyt algoritmit ovat RSA-2048 ja AES-256.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Solmujen vУЄlinen liikenne kulkee SSL-socketissa eli tietoliikenteen seuraaminen verkon ulkopuolelta on haastavaa. VierekkУЄiset solmut kuitenkin nУЄkevУЄt toistensa tietoliikenteenteen sisУЄllУЖn. Vaikka tietoliikenteen sisУЄltУЖjen kerУЄУЄmiseen ei ole helppoa yksittУЄistУЄ paikkaa, operaattorien on silti turha odottaa yksityisyyttУЄ koskien tekemisiУЄУЄn verkossa vaikka jonkin verran vaivaa yksityisten viestien <span style=" font-style:italic;">sisУЄltУЖjen</span> suojaamiseksi onkin nУЄhty. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">OhjelmointityУЖn on enimmУЄkseen tehnyt Antti JУЄrvinen, taideteokset Meeri JУЄrvinen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">TУЄmУЄ tuote sisУЄltУЄУЄ OpenSSL-projektin kehittУЄmУЄn ohjelmiston, joka on alunperin tarkoitettu OpenSSL Toolkit-ohjelmistoa varten (http://www.openssl.org).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Riemullista ilmoittelua!</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> attachmentListDialog List of attached files Dialog title text. Dialog in question produces list of file attachments. Liitetiedostoluettelo callStatusDialog Call status Dialog title text for call status dialog. Puhelun tila Input level Text in call status dialog for slider that shows audio volume of microphone Mikrofonin УЄУЄnenvoimakkuus Audio calls Title in call status dialog a column-list that lists ongoing calls Puhelut Output level Text in call status dialog for slider that shows audio volume of speaker Toistettava УЄУЄnenvoimakkuus editContactDialog Edit a contact Dialog title text. Purpose of the dialog is to let user change properties of a frequent contact in contact-list. Muokkaa profiilin tietoja Address (SHA1) of contact Text field label in contact-editing dialog. This gives label for field that shows SHA1 fingerprint of the operator whose data is being edited Profiilin osoitteen SHA1 tiiviste Local nickname Text field label in contact-editing dialog. This gives label for field that shows nickname of the operator whose data is being edited Paikallinen liikanimi <html><head/><body><p>Settings some trusted is public information to readers of your profile</p></body></html> Tooltip text of a checkbox label in contact-editing dialog. The checkbox is one that controls statement of trustworthniness of the operator whose data is being edited. Note html format. <html><head/><body><p>Luottamuksen osoitus on profiilisi mukana julkaistava tieto, jonka profiilisi lukijat nУЄkevУЄt</p></body></html> This contact is to be publicly trusted in transactions Label of a checkbox in contact-editing dialog. The checkbox is one that controls statement of trustworthniness of the operator whose data is being edited. TУЄmУЄn profiilin operaattoriin kelpaa julkisesti luottaa frontWidget Form Name of front widget. Wild guess is that this text actually does not appear anywhere in the UI. Etusivun lomake Classified ads Tab title text in front widget. When user clicks in this tab, the view is switched to one, that lists classified ads. Luokitellut ilmoitukset Search for classified ads about Prompt text next "search" button. User is supposed to enter search criteria for classified ads and then click "search" ; this is prompt text for this behaviour. Etsi luokiteltuja ilmoituksia aiheesta Perform Prompt text very next to "search" button. After user has clicked the button, he is supposed to be viewing list of classified ads matching the search criteria. Suorita of This part of search-criteria phrase. Normally the phrase reads something like "Buying of cars in finland" and this word is the 2nd word in that phrase. koskien in This part of search-criteria phrase. Normally the phrase reads something like "Buying of cars in finland" and this word is the 4th word in that phrase. paikassa Search Button text for button used to search for classified ads. This button has text "perform" just next to it so user sees actually 2 words "perform search" where the "perform" is in separate label above the button, and then is the text of this button. Haku My profile Tab title text in front widget for tab that shows details of operators own profile (==personal details) Oma profiili Profile address Text field label in "operators profile" tab. The field in questions shows SHA1-digest e.g. the real address of the operator. Profiilin osoite Nickname Text field label in "operators profile" tab. The field in questions shows nickname of the operator Liikanimi Greeting text Text field label in "operators profile" tab. The field in questions shows "hello world" text of the operator. Tervehdysteksti For the rest of the world. Tooltip-text of a text field in "operators profile" tab. The field in questions shows greeting text of the operator. Koko maailmalle. First name Text field label in "operators profile" tab. The field in questions shows given name (first name) of the operator. Etunimi Family name Text field label in "operators profile" tab. The field in questions shows family name of the operator Sukunimi City/country Text field label in "operators profile" tab. The field in questions shows place of residence of the operator Kaupunki/maa BTC address Text field label in "operators profile" tab. The field in questions shows address of bitcoin wallet of the operator. BTC-lompakon osoite If you wish to receive payments via BTC, include your BTC address too. Tooltip-text for a text field "operators profile" tab. The field in questions shows address of bitcoin wallet of the operator. Jos meinaat saada maksuja bitcoinin kautta, julkaise myУЖs lompakkosi osoite State of the world Text field label in "operators profile" tab. The field in questions shows what the user has to say about state of the world. Maailman tila Longer explanation about state of the world Tool-tip text of a field in "operators profile" tab. The field in questions shows what operator has to say about state of the world. VУЄhУЄn pidempi selitys maailman tilasta Profile is private Checkbox text in "my profile" tab. The checkbox is question is a toggle for public/private status of the profile. When checkbox is checked, the profile will be made private. Profiili on yksityinen Readers of profile Button text inside "My profile" tab. Clicking the button opens a dialog that prompts user to select list of operators that can read his profile that he has previously marked as private (e.g. accessible only to listed readers) Profiilin lukijat None of the fields is mandatory Explanation text inside "my profile" tab. YksikУЄУЄn kentistУЄ ei ole pakollinen Time of last update Text field label inside "my profile" tab. The field whose label this is shows the time when profile was last updated. Edellisen pУЄivityksen ajankohta Publish Button text for button inside "my profile" tab. By clicking this button user makes her edits known to rest of the world. Julkaise Revert changes Button text for button inside "my profile" tab. By clicking this button user discards her edits. Peruuta muutokset Details of operator profile: Text label on top of "my profile" tab. Below this label is a list of text fields and other stuff that user may edit regarding herself. Operaattorin profiili Click to Add Image Text in image-placeholder inside "my profile" tab. When user has not selected any image for her profile details, this text is shown in place of the image. Clicking on text gives user option to select the image file for profile. Klikkaa LisУЄtУЄksesi Kuva Shared files Title text inside "my profile" tab. Title text is for a list of files that user is currently sharing with other users. Jaetut tiedostot Latest comments Title text inside "my profile" tab. Title text is for a list of comments made by other users regarding operators profile. ViimeisimmУЄt kommentit Contacts Tab title text. When this tab is opened, user is shown a view of his frequent contacts. Osoitekirja Add contact Button text inside "contacts" tab. Clicking this button opens a dialog prompting user to enter details of operator to be added into contact list LisУЄУЄ profiili Remove contact Button text inside "contacts" tab. Clicking this button removes a contact from list. Poista profiili View profile Button text inside "contacts" tab. Clicking this button displays details of the selected contact. Katsele profiilia Send message Button text inside "contacts" tab. Clicking this button opens a dialog prompting user to send a message selected contact. LУЄhetУЄ viesti Private messages Tab text in front widget. When user selects this tab, he is presented with list of his private correspondence. Yksityiset viestit Profile details Tab text in front widget. This tab shows details of some other operator of classified ads. Normally this text is replaced with nickname of the operator but if nothing like this is available, this text may be shown, this is the "default text". Profiilin yksityiskohdat City/Country Label text of a text-field. The text-field in question shows place of residence of operator whose details are on display. Kaupunki/maa BTC Addr Label text of a text-field. The text-field in question shows bitcoin wallet address of operator whose details are on display. BTC-osoite <html><head/><body><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;">No</span></p><p align="center"><span style=" font-size:16pt;">Image</span></p><p align="center"><span style=" font-size:16pt;">Inserted</span></p></body></html> Text for image-placeholder inside "profile details" tab. When some particular operator has not selected any image for her profile, this text is shown in place of the image. Note html format. <html><head/><body><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;">Ei</span></p><p align="center"><span style=" font-size:16pt;">Kuvaa</span></p><p align="center"><span style=" font-size:16pt;">Valittuna</span></p></body></html> Send message to operator Button text inside "defails of operator profile" tab. When the button is clicked, a new-message editor is opened. LУЄhetУЄ operaattorille viesti Audio call Button text in "operators details" view. Pressing the button initiates a new voice call to operator. Puhelu View readers Button text inside "defails of operator profile" tab. When the button is clicked, dialog listing readers of the (private) profile. Lukijat Comment Button text inside "defails of operator profile" tab. When the button is clicked, a dialog is opened, dialog prompts user to enter a comment about the operator. Kommentti Add to contacts Button text inside "defails of operator profile" tab. When the button is clicked, the operator whose data is on display is added into contact-list. LisУЄУЄ osoitekirjaan insertLinkDialog Insert link Dialog title text. Dialog is for adding a link to text being edited. LisУЄУЄ linkki URL Label for a combobox-field inside "insert link" dialog. Next to this label is set of fields that together make up a valid URL to be inserted. URL Link label in text Label for a text-field inside "insert link" dialog. Next to this label is field where user is supposed the text that will be shown as the link. Consider <a href="url">the text</> then "the text" is text that user is prompted to enter with this label. Linkin pУЄУЄllepУЄin nУЄkyvУЄ teksti manualConnectionDialog Manually add node to connection queue Dialog title text. Dialog prompts user to manually add a network-connection to another node in the network. LisУЄУЄ solmu yhteydenottolistalle Remote node listen port Label text of numeric field. The numeric (input) field is TCP port of the remote node that will be connected. Solmun vastaanotto-portti (TCP-port) Remote node network address Label for text field inside "manually add connection" dialog. Text field whose label this is requires user to type in network address (ip addr or dns name) of the remote node. Solmun verkko-osoite IPv4, IPv6 or DNS name Tooltip text for a text field inside "manually add connection" dialog. The text field whose tooltip this is the remote network address input field. IPv4, IPV6 tai DNS-nimi metadataQuery File information Dialog title text for dialog that requires user to enter information about file to be shared with others. Metadata query dialog in practice. Tiedoston ominaisuudet Name of the file: Label text for a input field. The input field whose label this is asks for file name (filesystem file name) Tiedoston nimi: Owner of file (name or SHA1 if CA operator): Label text for a input field. The input field whose label this is asks for owner of the file contents. This may be copyright holder, depending on contracts and legislation followed. Tiedoston omistaja: License of use: Label text for a input field. The input field whose label this is asks for license under which the file may be used. Combobox lists some pre-filled options like GPL,BSD,CC-BY etc. but user may also enter any text into field. KУЄyttУЖУЄ koskeva lisenssi: Public domain Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated Public domain GPL Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated GPL LGPL Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated LGPL BSD Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated BSD CC-BY Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated CC-BY CC-BY-SA Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated CC-BY-SA CC-BY-ND Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated CC-BY-ND CC-BY-NC Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated CC-BY-NC CC-BY-NC-SA Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated CC-BY-NC-SA CC-BY-NC-ND Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated CC-BY-NC-ND Mime-type: Label text for a input field. The input field whose label this is asks for mime-type of the field about to be published. Mime-tyyppi: Description of file: Label text for a input field. The input field whose label this is asks for descriptive text about file about to be published. Kuvaus: Enter information regarding file before publish: Prompt text on top of "metadata query" dialog. Below this label is set of input-fields that make up the meta-data of a file to be published. SyУЖtУЄ tiedoston ominaisuudet ennen julkaisua: newCaDialog Post a new classified ad Dialog title text for a dialog that offers possibility to post a new classified ad for others to read. LУЄhetУЄ uusi luokiteltu ilmoitus About This label text is part of sentence, whole sentence goes for example "About buying of cars in sweden" where the words "bying", "cars", and "sweden" are combo-boxes that user may choose from ; this word here is the first word in that sentece. Aiheesta of This label text is part of sentence, whole sentence goes for example "About buying of cars in sweden" where the words "bying", "cars", and "sweden" are combo-boxes that user may choose from ; this word here is the 3rd word in that sentece. koskien in This label text is part of sentence, whole sentence goes for example "About buying of cars in sweden" where the words "bying", "cars", and "sweden" are combo-boxes that user may choose from ; this word here is the 5th word in that sentece. paikassa Subject Label text of a text field inside "post a new classified ad" dialog. The input field whose label this is, requires user to enter a subject (topic) for her posting. Aihe Attachment: Label text of a text field inside "post a new classified ad" dialog. The input field whose label this is, will show name file that is attached to the post. Liite: Add Push-button text inside "post a new classified ad" dialog. When user hits the button, another dialog is opened and user is required to select a file to be attached. LisУЄУЄ newPrivMsgDialog Send a private message Dialog title text for dialog that prompts user to edit+send a private message to another operator LУЄhetУЄ yksityinen viesti Subject Text field label for input field inside "compose a new private message dialog". The text field in question is "subject" or "topic" field of the message. Aihe Recipient Text field label for input field inside "compose a new private message dialog". The text field in question is SHA1 address of the recipient. Vastaanottaja Attachments: Label text of a text field inside "compose a new private message" dialog. The input field whose label this is, will show name file that is attached to the post. Liitteet: Attach Push-button text inside "compose a new private message" dialog. When user hits the button, another dialog is opened and user is required to select a file to be attached. LiitУЄ newProfileCommentDialog Comment a operators profile Dialog title text for dialog that prompts user to edit+send a comment regarding another operator. Kommentoi operaattorin profiilia Subject Text field label for input field inside "compose a comment about operator dialog". The text field in question is "subject" or "topic" field of the comment. Aihe Commented profile Text field label for input field inside "compose a comment about operator dialog". The text field in question is SHA1 digest (address) of the operator being commented. Kommentoitu profiili Attachments: Label text of a text field inside "compose a comment about operator dialog" dialog. The input field whose label this is, will show name file that is attached to the post. Liitteet: Attach Push-button text inside "compose a comment about operator dialog" dialog. When user hits the button, another dialog is opened and user is required to select a file to be attached. LiitУЄ newTextDocumentDialog Edit and publish a new text document Dialog title text for a dialog that prompts user to edit+publish a text document. Muokkaa ja julkaise uusi tekstidokumentti Document title Text field label for input field inside "compose a new text document" dialog. The text field in question is "subject" or "topic" field of the text document. Dokumentin aihe Attachments: Label text of a text field inside "edit+publish a new text document dialog" dialog. The input field whose label this is, will show name file that is attached to the document. Liitteet: Attach Push-button text inside "edit+publish a new text document dialog" dialog. When user hits the button, another dialog is opened and user is required to select a file to be attached. LiitУЄ profileCommentDisplay Comments regarding operator Dialog title text for dialog that will show a listing of previous comments regarding operator (user himself or some other operator, it is the same dialog in both cases) Kommentit koskien operaattoria profileReadersDialog Profile readers list Dialog title text for a dialog that prompts user to choose operators who will be able to read details, comments and shared files of his profile. Profiilin lukijalista Search for profiles to add Text field label inside "add profiles to list of readers" dialog. The text field whose prompt this is asks for search-words to be used to filter operator names/addresses from database. Etsi lisУЄttУЄviУЄ profiileja First 100 matching profiles: Text field label inside "add profiles to list of readers" dialog. The text listing-field whose explanation this is will list operators whose nickname,name or other search-term matches conditions entered by user. EnsimmУЄiset 100 osumaa: Add selected to list of readers Add seleted to list of readers Push-button label inside "add profiles to list of readers" dialog. When user hits this button, operators that are selected from neighboring list will be added to list of readers of operators profile. LisУЄУЄ valitut profiilin lukijoiksi Current list of readers Text field label inside "add profiles to list of readers" dialog. The text listing-field whose explanation this is shows current list operators profiles readers. Lukijoiden nykyinen lista Close Push button label inside dialog that asks for list of operators who are readers of operators own profile. When user this this button, the dialog is dismissed. Sulje Remove selected Push button label inside dialog that asks for list of operators who are readers of operators own profile. When user this this button, selected operators are removed from the list. Poista valitut searchDisplay Search data storage Dialog title-text for a search dialog. Etsi tietovarastosta Words: Label text of a text field inside "search" dialog. The text field in question requires user to enter one or more words that are then searched from all available (public) documents. Sanoja Search Push button label inside "search" dialog. When button is hit, search using given words is performed. Hae Network search Check-box label inside "search" dialog. When box is checked, the search is done also in neighboring nodes in the network, not only in local storage. Verkkohaku Search ads Check-box label inside "search" dialog. When box is checked, the search may include classified ads in its resultset. Etsi ilmoituksista Search profiles Check-box label inside "search" dialog. When box is checked, the search may include operator profiles in its resultset. Etsi profiileista Search comments Check-box label inside "search" dialog. When box is checked, the search may include profile commetns in its resultset. Etsi kommenteista settingsDialog Node settings Dialog title text for "settings" dialog. Solmun asetukset TCP listen port Text field label for input field inside "settings" dialog. The numerical input field whose label this is has TCP port number of the node. TCP-kuunteluportti Incoming TCP listen port. Change requires node restart. Tooltip-text for input field inside "settings" dialog. The numerical input field whose label this is has TCP port number of the node. Kuunteluportti. TУЄmУЄn vaihtaminen edellyttУЄУЄ ohjelman uudelleenkУЄynnistystУЄ. DNS name of node Text field label for input field inside "settings" dialog. The textual input field whose label this is requires user to enter DNS-name of the node (or leave it empty, if no name is assigned) Solmun nimipalvelunimi If you have permanent DNS name for your machine, you may type it here to be used to reference your node Tooltip-text for input field inside "settings" dialog. The textual input field whose label this is requires user to enter DNS-name of the node (or leave it empty, if no name is assigned) Jos solmullasi on pysyvУЄ nimi nimipalvelussa, voit syУЖttУЄУЄ sen tУЄhУЄn jotta muut solmut voivat siihen viitata Data store limits: Text label inside "settings" dialog. Under this label is set of numerical input fields that user may use to adjust the amount of items he wishes to keep in his local storage. Tietokannan sisУЄllУЖn enimmУЄismУЄУЄrУЄt: Nr of profiles to keep Text field label for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of operator profiles to keep in storage. Talletettavien profiilien mУЄУЄrУЄ Nr of private messages to keep Text field label for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of private messages to keep in storage. Yksityisten viestien mУЄУЄrУЄ Nr of binary blobs to keep Text field label for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of binary files to keep in storage. BinУЄУЄritiedostojen mУЄУЄrУЄ Nr of CAs to keep Text field label for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of classified ads to keep in storage. Ilmoitusten mУЄУЄrУЄ Number of classified ads to keep in storage, total, including all classifications. Oldest referenced will be deleted first. Tooltip-text for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of classified ads to keep in storage. Paikallisessa tietokannassa talletettavien ilmoitusten mУЄУЄrУЄ, koskien kaikkia luokitteluja. ViimeisimmУЄksi viitatut tullaan poistamaan ensimmУЄisenУЄ. Nr of profile comments to keep Text field label for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of comments regarding operators to keep in storage. Kommenttien mУЄУЄrУЄ Nr of db records to keep Settings dialog text for item that tells how many records of distributed database to keep Jaetun tietokannan tietuemУЄУЄrУЄ Ringtone Label for combo-box where user can choose between voice call ringtones. Puhelun hУЄlytysУЄУЄni Bow Selection-list item. Selection list is for choosing between audio call ringtones, this is for ringtone that is performed with a bow. Jousella Electrical Selection-list item. Selection list is for choosing between audio call ringtones, this is for ringtone that is electrical. SУЄhkУЖisesti Acoustic Selection-list item. Selection list is for choosing between audio call ringtones, this is for ringtone that is performed in acoustic manner Akustisesti Beep Selection-list item. Selection list is for choosing between audio call ringtones, this is for ringtone that is only a beep Piippaus Silence Selection-list item. Selection list is for choosing between audio call ringtones, this is for ringtone that is silent Hiljaisuus Accept voice calls Combox-box label text. Combo-box is for selecting which audio calls to accept, selections are like "all ; no calls at all ; from some operators ; .." HyvУЄksy puhelut All Combobox item text for selecting which audio calls to accept. Selecting this item lets all calls in. Kaikki From trusted operators Combobox item text for selecting which audio calls to accept. Selecting this item lets in calls from trusted operators. Vain luotetuilta operaattoreilta Accept no voice calls Combobox item text for selecting which audio calls to accept. Selecting this item rejects all calls. Ei ainuttakaan statusDialog Network and connection status Dialog title text for a dialog that shows network connectivity details. Verkon ja yhteyksien tila Detected own IPv4 Text field label for display-item inside "network status" dialog. The display-item shows ipv4-network address of the node. Usually it is (public) IP addr of the very machine that user is using at the moment. Oma havaittu IPv4 Should your friend have trouble connecting, give her this address with port number Tooltip-text for display-item inside "network status" dialog. The display-item shows ipv4-network address of the node. Usually it is (public) IP addr of the very machine that user is using at the moment. Jos ystУЄvУЄsi ei pУЄУЄse verkon jУЄseneksi, yritУЄ antaa hУЄnelle tУЄmУЄ osoite porttinumeron kera IPv6 Text field label for display-item inside "network status" dialog. The display-item shows IPV6-address of the node. Usually it is (public) IPv6 addr of the very machine that user is using at the moment. IPv6 TCP port currently used Text field label for display-item inside "network status" dialog. The display-item shows listen port of the node. KУЄytУЖssУЄ oleva TCP-portti Currently open connections Text field label for a list-item inside "network status" dialog. The list-item shows list of currently connected other nodes in the network. Avoimet yhteydet Manually add connection Push-button label for button inside "network status" dialog. When button is hit, another dialog is opened, asking user for details about the remote node to connect. LisУЄУЄ yhteys kУЄsipelillУЄ Close Push-button label for button inside "network status" dialog. When button is hit, dialog is dismissed. Sulje tclConsoleDialog TCL Interpreter console Dialog title text for dialog that displays TCL interpreter console. TCL-komentotulkin syУЖtteet ja tulosteet Evaluate Button text for button that runs TCL commands that user has typed Suorita Close Button text for button that closes TCL interpreter window. Not the interpreter but only the console dialog. Sulje Interpreter output label for text field that shows TCL interpreter output TCL-tulkin tulosteet Command input label for text field that shows TCL interpreter input TCL-kieliset komennot suoritettavaksi tclProgramsDialog TCL programs Dialog title text for dialog that lists stored TCL programs TCL-Ohjelmat Stored programs Label for list-item that lists stored TCL programs. Ohjelmat Program code Label for text item that shows program text of locally stored TCL program Ohjelmakoodi classified-ads-0.13/classified_ads_sv.qm000066400000000000000000001504261331670245300203300ustar00rootroot00000000000000<ИdЪяœ•Э!П`ЁНнB Ј;=юўЊ'ўВЮVЊKVВђGtЌљGЄБЪK?ђLLЏУZlЋ[*3о_Уl˜“OЇдLЈЅ>жЁСч–Уь0Ny LЏю“ЏkТ@”А5AА5Cйn”л&1љJД&mѓ0Н&mѓЄф)Џd9Т*–$Eџ*ІyFY*ЛF‰*а%*а%G ++дGЏ+‹ЏH‘+ФЏIŸ?–ПШGay­$G…дЙуG–ФБ‘GпEIУjIXГЂIf#иIl @J6•ИgJ6•Т L™bvL™b$ьL™b-аL™b6•L™b8ФL™bBLL™bLпM– /[T3ЏiTЩѓ[f3 v`А›mУvmУ5“mtU P}ВuНk еЅаЃ‰'ЁЌIЮ˜ЌR^ ХЩ|№ ЯЬ]е†ЭУЩsжЙЄЃKхTрcO ‘ƒЂі ќ/БޑŽ1п- Ž А-ўБHJЏ$hJЏ2@~^Ѕ&‚“.о †КŠШ!ИЛ2Š Ъ­iGhеМ>ў€$ЖчC%ŸјъЎзДЂЊДЂ# ДЂ-ћ ЁЅ7W ЁЅ8ћ?кЪuV.Q4tZUDоZUЉwѕЮ5&{ќSЅ.’`Е­Іь/яІь5ТЇ–ФЖŠЅH Жх”>ИЧ9'qИ§єHХУёхМСм^‚4ум/ xєk@UйрП|LB]‚# cРt—8jьч„m љœS—тˆйа.™ДЈдЊsевцD' жд%зKХЖЃюЭФЕђŠsЈ€ћФ5 ё!+ѓžR(P@3Pšƒ”žkcЙ;ЧtШ”—‹Ї˜Г‹Ї˜Дn‹Ї˜Ж—ѓРзGЈЈРSЗUХЉ0ХvNЂ.ЬХГ_舉VуЃТ<ц_Фѕs<Щ,о#Ї;2 FЯУцH8Р“dлГйfСEЩgв $gв /gв MšxкЩNш|DР!›ˆ˜Ї=›ˆ˜Л&œJТCPЄ!-PЇiГ =Г(IKКіІиФц5eЦ­UЛчЬZ‚K‚лн% јц‹jМ‡јJm1Žћќ&ЮЦЎOЦS­UЦTЎ#eDІЗ$eL—6{ЎF'8*YP FMЂУєVбЅЇЬYu#Z~,KZ~ E\ЮУ0`9~•alОGэŸКЮ|Ё"~)œЕБГнЦlIЫШжнЄБкaŠИћ№ 4›ќiQf0BYJM5Фѕи8tѕl8uT>gZ єЌ5hIBэjцх ШmйЮRЪmdЙ~‰pcШ…U0>…UЃРЁc’"=ЋŒу ‡ЋŒу/ИйQ Й0ШІ&гGоПгGо:‘еСФЇiхCЂЈ,ь УžээLiQЧіЇ^7§Šо˜ќ њЅ+D њЅKИЈ4Х) sW sW+ ЁЩў-ЏЉе6ДE>SИŒ…1ЪZƒЛ˜ЬHcИŸЬчЉŸ,ЬчЩŸjьq Ў‰Ђљ:*s)MтУЅ}a * eСkeС;*hЬƒTH€‚(Ц‘O‡#n‘O‡.^›ыВЗyЂCuрЂCuЄД NС,ЫRМай~JрƒЇ5щщФ7ъe љ OSВiХM2Vфlj ett namn for din filChoose file name for savingAttachmentListDialogFelErrorAttachmentListDialog,Fel i att іppna en filFile open errorAttachmentListDialog,Spara till filsystem..Save file to disk..AttachmentListDialog filerfilesAttachmentListDialogJNamn eller SHA1 kontrollsumm av filenName or fingerprint of fileBinaryFileListingModel DatumDateCAListingModel RubrikSubjectCAListingModelDjurAnimalsClassifiedAdsModelMeddelande AnnouncementClassifiedAdsModelAlla lфnder Any countryClassifiedAdsModel CyklarBikesClassifiedAdsModel BхtarBoatsClassifiedAdsModel BіckerBooksClassifiedAdsModelInkіpningBuyingClassifiedAdsModel BilarCarsClassifiedAdsModel KlфderClothingClassifiedAdsModelUtbildning EducationClassifiedAdsModel*Elektroniska aparater ElectronicsClassifiedAdsModelHфndelserEventsClassifiedAdsModel FinansFinanceClassifiedAdsModelLivsmedel FoodstuffClassifiedAdsModel Mіbler FurnitureClassifiedAdsModelDonering Giving awayClassifiedAdsModel Bostad HabitationClassifiedAdsModelSjukvхrd HealthcareClassifiedAdsModel"HushхllsapparaterHousehold appliancesClassifiedAdsModelSmyckenJewelryClassifiedAdsModel ArbeteJobsClassifiedAdsModelBioMoviesClassifiedAdsModel MusikMusicClassifiedAdsModelAndra fordonOther vehiclesClassifiedAdsModelFilosofi PhilosophyClassifiedAdsModel$Religiіsa ritualerReligious ritualsClassifiedAdsModelAtt hyraRentingClassifiedAdsModelFіrsфljingSellingClassifiedAdsModelTjфnsterServicesClassifiedAdsModelProgramvaraSoftwareClassifiedAdsModel SportsSportsClassifiedAdsModelVerktygToolsClassifiedAdsModelTransportTransportationClassifiedAdsModelFordondelar Vehicle partsClassifiedAdsModelжnskande sigWantingClassifiedAdsModel AdressAddressConnectionListingModelOktett inBytes inConnectionListingModelOktett ut Bytes outConnectionListingModel&Data frхn din dator'Data transferred from peer to your nodeConnectionListingModel&Data till din dator'Data transferred to peer from your nodeConnectionListingModelInkommandeInboundConnectionListingModelInkommande fіrbindelse фr sхdan nфr en annan dator іppnade datastrіmmen =Inbound connections are those where peer initiated connectionConnectionListingModelжppningstid Open timeConnectionListingModel0Grфnsande datorns adressPeer network addressConnectionListingModel4Tid nфr datastrіm іppnadesTime when connection was openedConnectionListingModel&SHA1 av din contact,Actual network address (SHA1) of the contactContactListingModel AdressAddressContactListingModelSmeknamn>Locally given nickname ; user may set her own nickname himselfContactListingModelSmeknamnNicknameContactListingModelLOm den hфr kontakt ska bli fіrtrіstad??Public statement if this operator to be trusted in transactionsContactListingModel(Offentlig fіrtroendePublicly trustedContactListingModel OkфntUnknownContactListingModelJaYesContactListingModelNHemlig nyckel fіr kryptering finns inte!No suitable de-cryption key foundContentEncryptionModel:Kunde inte persist RSA-nyckel%RSA Private key key saving went wrongContentEncryptionModelTKunde inte generera SSL-nyckel, utgхende..-SSL key generation went wrong, calling exit..ContentEncryptionModelRKunde inte generera x509-cert, utgхende../x509 cert generation went wrong, calling exit..ContentEncryptionModelOm &annonser&About Controller*Fіrфndra din lіsenord&Change password Controller$Radera vald profil&Delete current profile Controller &Filer&File Controller*Vфlja en annan profil&Select another profile ControllerJVфlja en annan profil med en lіsenord&Activate another profile with password ControllerFel lіsenord Bad password ControllerHMan kan inte radera den sista profilCan't delete only profile. ControllerDKan inte ladda smycken fіr din nodCant load node cert or key cert ControllerDFіrфndra lіsenorden av vald profil"Change password of current profile ControllerAnnonserClassified ads Controller Innehхllsфgare: Content owner:  ControllerPKunde inte hitta objektet frхn nфtverket"Could not find item from network.. Controller&Skapa en &ny profilCreate &new profile Controller$Fel med krypteringCryptographic module ControllerFel med databasDatabase error ControllerFel med databasDatabase module ControllerDatum: Date:  Controller<Ska glіmma allt om vald profilDeletes currently open profile ControllerBeskrivning:  Description:  Controller StфngaE&xit Controller Ge ett lіsenord:Enter new password: Controller"Ge ett lіsenord: /Enter password for protection of your messages: Controller"Stфnga av programExit the application Controller&Hфmtning objektet..Fetching item from network.. ControllerFel med filen File error Controller0Om du har flera profiler!If you have multitude of profiles ControllerLicens:  License:  Controller@Skapar en ny profil fіr operatorMakes a brand new user profile ControllerMime-Type: Mime-Type:  Controller Namn: Name:  Controller*Status av nфtverket..Network status.. Controller(Instфllningar av nodNode-wide settings.. ControllerRadera profil?Permanently discard profile? ControllerFіrlфggare:  Publisher:  Controller SHA1:SHA1:  Controller Sіk..Search.. ControllerInstфllningar.. Settings.. ControllerFVisa information av den hфr program Show the application's About box ControllertDet finns INTE en metod fіr att visa den hфr profil senare<head><meta name="qrichtext" content="1" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Ubuntu'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Annonser фr fri programvara. Du kan anvфnda, kopiera och modifiera det om du fіljer konditioner av GNU LGPL licens v2.1 (GNU Lesser General Public License). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright Љ Antti Jфrvinen 2013.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Den viktig funktionen av Annonser фr &quot;annons&quot; - dokument som har en klassificering. Program har flera klassificrings och anvфndarna kan skapa mera. Anvфndarna kan lфsa annonser, skapa kommentarer om dom och ha korrespondens.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">En annan viktig egenskap фr att Annonser фr inte serverbaserad, det anvфnder inte en databas i server іver nфtverket. Alla filer sparas i datorer av anvфndarna av Annonser. Fіr at kunna ansluta sig med nфtverket av Annonser man har at veta minst en adress av en dator som фr i nфtverket. Nфr program har anslutat sig med nфtverket det ska underhхlla sin egen listan om andra datorer i nфtverket. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pх grund av partnerbaserad-konstruktion hela system fungerar bфst om du lфmnar program pх ocksх nфr du inte anvфnder program sjфlv. Program ska ta datorkraft och generera traffic іver nфtverket nфr du inte anvфnder program, men andra anvфndare ska bli betjфnad. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anvфndarna intresserad av sina informationssфkerhet skulle veta att:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> - Databas фr en variant av distribuerad hashtabell (DHT). Det betyder att filer skickad i nфtverket sparas i flera datorer i andra anvфndarnas фgo.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> - Alla dataobjekter i Annonser har en digital signatur. <br /> - Den enda vфrdig identifiering fіr operatіr ar SHA1 kontrollsumm av hennes RSA-nyckel. Alla andra punkter om operatіr kan vara vad som helst.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> - Alla annonser ska sparas i nфtverket utan kryptering - alla kan lфsa dom. Alla publik profiler sparas i nфtverket utan kryptering. Operatіrprofiler som фr privat ska bli krypterad bara fіr listade anvфndare. Samma gфller ocksх fіr kommentarer och filer av profil. Om en profil blir privat, gammal kommentarer och filer av profil фr inte krypterad. Korrespondens (brev) mellan anvфndarna ska vara krypterad alltid. Bilagor fіljer kryptering av sina фgande dokument. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> - Som фr fallet med alla kommunikation іver internet, det hфr gфller ocksх: om nхgonting фr publicerad i Annonser, <span style=" font-style:italic;">det finns inte en metod fіr att ta det bort senare</span>. <br /> - Programvara fіr kryptering фr OpenSSL, algoritmen mest avфnda фr RSA-2048 och AES-256.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> - Kommunikationen mellan datorer i nфtverket фr krypterad med SSL. Din partners i nфtverket kan se alla trafik till din nod. Anvфndarna skulle inte ponera anonymitet eller hemlighet іver saker dom gіr i nфtverket. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Programmering gjorts av Antti Jфrvinen, konst av Meeri Jфrvinen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Denna produkt innehхller programvara som har utvecklats av OpenSSL project fіr anvфndning i OpenSSL toolkit (http://www.openssl.org).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html>м

Classified ads is free software. You may use, copy and modify it if you follow the conditions given in GNU lesser general public license version 2.1.

Classified ads is copyright ТЉ Antti JУЄrvinen 2013.

Main feature of the the program is an "advertisement" - a piece of text belonging to selected classification. There are several pre-programmed classifications and operators are encouraged to invent new classifications for new purposes ; the selection boxes in classification-selection tab are editable. Other operators may then view the ads, publicly comment the ads, the operators and also send private messages to each others.

Another important feature of classified ads is that it is designed to be operated without any centralized server infrastucture - it is you and other operators whose computers store and transmit all the content visible inside classified ads. To get connected you need to know address of at least one existing computer (a node) so if your network connection dialog shows no connections, you may need to contact someone you know is using the software and ask for address of her node to make initial contact with the network. Once connected the software should maintain list of addresses of other nodes.

Due to its server-less design the whole system works best if you leave the program running always when you have your computer powered on ; while processing other operators requests it will hog some computing resources and generate network traffic also when you are not actively using the program youself - others are.

Operators concerned about privacy of the content should be aware of following items:

- Data storage implementation is variant of distributed hash table, practically meaning that content posted by you gets copied some more-or-less random nodes in the network.

- Any data item (ad, comment, binary file, private message etc.) is digitally signed. This makes it more difficult to try to pose as another operator.

- Operators are reliably identified only by the SHA1 hash of their generated encryption keys. SHA1 hash is displayed when viewing details of operator profiles. Other identifying information like nickname or city name are entered by operator himself and can be anything. The operator profile, as it is published to the network, is also signed with the encryption keys of the operator - if you identify an operator by her SHA1 hash, you have a mechanism for identifying if any content inside classified ads is posted by this operator or not. Classified ads internally checks for digital signatures, throwing away content that fails signature check and tries to provide SHA1 hash of the operator who posted the content.

- All classified ads are posted as plain text, no encryption is used. All public profiles are posted as plain text, no encryption is used. If profile is made private, it is encrypted to be readable only by selected other profiles. This applies also to binary files shared by operators private profiles and comments about private profiles after the profile was made private (previously plain-text comments or files don't get magically encrypted afterwards). Private messages are encrypted always to be readable only by recipient and sender. Attachments follow the privary rules of the document, they're attachted to.

- As is the case with all internet-communications, this small fact is true for classified ads too : once something gets posted online, there is no way to remove it from network.

- Data encryption implementation for content is OpenSSL, relying mostly on algorithms RSA-2048 and AES-256.

- While connections between nodes are implemented using SSL, other nodes inside network do get to know what content is being transmitted in neighboring nodes. While there is no central point for easily collecting this information about particular classification or operator, operators still should expect no privacy regarding their doings online, although some effort has been been put into hiding contents of private messages and private profiles.

Programming was (mostly) done by Antti JУЄrvinen, artwork by Meeri JУЄrvinen.

This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/).

Happy advertising!


 aboutDialog.Information om AnnonserAbout classified ads aboutDialog"Listan av bilagorList of attached filesattachmentListDialogИ<html><head/><body><p>Om du trіst pх en profil, det фr publik information</p></body></html> n

Settings some trusted is public information to readers of your profile

editContactDialogLAdress (SHA1 kontrollsumm) av kontakt Address (SHA1) of contacteditContactDialog&Redigera en kontaktEdit a contacteditContactDialogLokal smeknamnLocal nicknameeditContactDialogBDen hфr kontakt фr tillfіrlitlig 6This contact is to be publicly trusted in transactionseditContactDialogF Klicka fіr at lфgga till en bild Click to Add Image frontWidgetL<html><head/><body><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;">Ingen</span></p><p align="center"><span style=" font-size:16pt;">Bild</span></p><p align="center"><span style=" font-size:16pt;">Valts</span></p></body></html>Ї




No

Image

Inserted

 frontWidgetLфgg kontakt Add contact frontWidget0Lфgga till din kontakterAdd to contacts frontWidgetBTC-adressBTC Addr frontWidgetBTC-adress BTC address frontWidgetStad/rike City/Country frontWidgetStad/rike City/country frontWidget"AnnonseravdelningClassified ads frontWidget&Skicka en kommentarComment frontWidgetKontakterContacts frontWidget6Detaljer om operatіrsprofilDetails of operator profile: frontWidgetEfternamn Family name frontWidgetFіrnamn First name frontWidget Fіr hela vфrldenFor the rest of the world.  frontWidgetFormForm frontWidgetHфlsningar Greeting text frontWidgetbOm du will ta mot betalningar, ge din BTC-adress FIf you wish to receive payments via BTC, include your BTC address too. frontWidget&Senaste kommentarerLatest comments frontWidget*Tillstхndet i vфrlden+Longer explanation about state of the world frontWidgetEgen profil My profile frontWidgetSmeknamnNickname frontWidget:Ingent pukt фr obligatoriskt None of the fields is mandatory frontWidget UtfіraPerform frontWidgetKorrespondensPrivate messages frontWidget Adress av profilProfile address frontWidget$Detaljer av profilProfile details frontWidget$Profilen фr privatProfile is private frontWidgetPubliceraPublish frontWidget&Lфsarna av profilenReaders of profile frontWidgetTa bort kontaktRemove contact frontWidget ХtergхRevert changes frontWidgetSіkSearch frontWidget$Sіk annonser efterSearch for classified ads about frontWidget4Skicka en elektronisk post Send message frontWidgetSkicka en brevSend message to operator frontWidget(Filer i fildelning  Shared files frontWidget*Tillstхndet i vфrldenState of the world frontWidget,Tid av senaste фndringTime of last update frontWidgetVisa profilen View profile frontWidget&Lфsarna av profilen View readers frontWidgetiin frontWidgetavof frontWidgetInfoga en lфnk Insert linkinsertLinkDialogLфnktextLink label in textinsertLinkDialogURLURLinsertLinkDialog2IPv4, IPv6 eller DNS-namnIPv4, IPv6 or DNS namemanualConnectionDialog@Lфgga till en nod (anslutningen)%Manually add node to connection queuemanualConnectionDialog TCP-port av peerRemote node listen portmanualConnectionDialogNфtverk adressRemote node network addressmanualConnectionDialogBSDBSD metadataQuery CC-BYCC-BY metadataQueryCC-BY-NCCC-BY-NC metadataQueryCC-BY-NC-ND CC-BY-NC-ND metadataQueryCC-BY-NC-SA CC-BY-NC-SA metadataQueryCC-BY-NDCC-BY-ND metadataQueryCC-BY-SACC-BY-SA metadataQueryBeskrivning:Description of file: metadataQuery@Ange information fіre publicera:0Enter information regarding file before publish: metadataQuery(Information av filenFile information metadataQueryGPLGPL metadataQueryLGPLLGPL metadataQueryLicens: License of use: metadataQueryMime-typ: Mime-type: metadataQuery Namn: Name of the file: metadataQuery Innehхllsфgare: ,Owner of file (name or SHA1 if CA operator): metadataQueryPublic domain Public domain metadataQueryI frхga omAbout newCaDialogInkluderaAdd newCaDialogBilagor:  Attachment:  newCaDialog&Skicka en ny annonsPost a new classified ad newCaDialog RubrikSubject newCaDialogiin newCaDialogavof newCaDialogInkluderaAttachnewPrivMsgDialogBilagor:  Attachments: newPrivMsgDialogMottagare RecipientnewPrivMsgDialog"Skicka en ny brevSend a private messagenewPrivMsgDialog RubrikSubjectnewPrivMsgDialogInkluderaAttachnewProfileCommentDialogBilagor: Attachments:newProfileCommentDialog@Skicka en kommentar av en profilComment a operators profilenewProfileCommentDialogOperatіrsprofilCommented profilenewProfileCommentDialog RubrikSubjectnewProfileCommentDialogInkluderaAttachnewTextDocumentDialogBilagor: Attachments:newTextDocumentDialog RubrikDocument titlenewTextDocumentDialogDSkapa och publicera en ny dokument$Edit and publish a new text documentnewTextDocumentDialog4Kommentarer av en operatіrComments regarding operatorprofileCommentDisplay.Inkludera vald profilerAdd seleted to list of readersprofileReadersDialog StфngCloseprofileReadersDialogAktuell listanCurrent list of readersprofileReadersDialog>Fіrst 100 motsvarande profiler:First 100 matching profiles:profileReadersDialog(Lфsarna av en profilProfile readers listprofileReadersDialog*Ta bort vald profilerRemove selectedprofileReadersDialogPSіk fіr profiler som ska bli lфggad tillSearch for profiles to addprofileReadersDialogSіk i nфtverketNetwork search searchDisplaySіkSearch searchDisplaySіk annonser Search ads searchDisplaySіk kommentarerSearch comments searchDisplay"Sіk lokal databasSearch data storage searchDisplaySіk profilerSearch profiles searchDisplayAlla ord:Words: searchDisplayDNS-namnDNS name of nodesettingsDialog2Begrфnsningar fіr databasData store limits:settingsDialogDOm du har DNS-namnet for din datorgIf you have permanent DNS name for your machine, you may type it here to be used to reference your nodesettingsDialogŒTCP-port fіr inkommande trafik. Mхste omstarta programmen om фndrats..8Incoming TCP listen port. Change requires node restart. settingsDialog,Instфllningar av dator Node settingssettingsDialogAntal annonsNr of CAs to keepsettingsDialogAntal filerNr of binary blobs to keepsettingsDialogAntal E-brevNr of private messages to keepsettingsDialog"Antal kommentarerNr of profile comments to keepsettingsDialogAntal profilerNr of profiles to keepsettingsDialogџџџџ{Number of classified ads to keep in storage, total, including all classifications. Oldest referenced will be deleted first.settingsDialogTCP-portTCP listen portsettingsDialog StфngClose statusDialog$жppna datastrіmmarCurrently open connections statusDialog6Upphittade egen IPv4 adressDetected own IPv4 statusDialogIPv6IPv6 statusDialog$Lфgga till en peerManually add connection statusDialog*жversikt av nфtverketNetwork and connection status statusDialogžOm din vфn kan inte ta kontakt med nфtverket, ge honom den hфr adress med port RShould your friend have trouble connecting, give her this address with port number statusDialogTCP portTCP port currently used statusDialogˆclassified-ads-0.13/classified_ads_sv.ts000066400000000000000000003117151331670245300203410ustar00rootroot00000000000000 UTF-8 AttachmentListDialog Save file to disk.. Man kan spara pengar ocksУЅ? Spara till filsystem.. files filer Choose file name for saving VУЄlj ett namn for din fil Error Fel File open error Fel i att УЖppna en fil AudioPlayer raw audio format not supported by backend, cannot play audio. Could not initialize audio player. BinaryFileListingModel Name or fingerprint of file Namn eller SHA1 kontrollsumm av filen CAListingModel Date Datum Subject Rubrik ClassifiedAdsModel Buying InkУЖpning Selling FУЖrsУЄljing Giving away Donering Wanting У–nskande sig Renting Att hyra Announcement Meddelande Cars Bilar Boats BУЅtar Bikes Cyklar Other vehicles Andra fordon Vehicle parts Fordondelar Habitation Bostad Household appliances HushУЅllsapparater Furniture MУЖbler Clothing KlУЄder Tools Verktyg Sports Sports Music Musik Books BУЖcker Movies Bio Animals Djur Electronics Elektroniska aparater Jobs Arbete Transportation Transport Services TjУЄnster Healthcare SjukvУЅrd Foodstuff Livsmedel Software Programvara Events HУЄndelser Education Utbildning Finance Finans Jewelry Smycken Religious rituals ReligiУЖsa ritualer Philosophy Filosofi Any country Alla lУЄnder ConnectionListingModel Peer network address GrУЄnsande datorns adress Inbound connections are those where peer initiated connection Inkommande fУЖrbindelse УЄr sУЅdan nУЄr en annan dator УЖppnade datastrУЖmmen Data transferred from peer to your node Data frУЅn din dator Data transferred to peer from your node Data till din dator Time when connection was opened Tid nУЄr datastrУЖm УЖppnades Address Adress Inbound Inkommande Bytes in Oktett in Bytes out Oktett ut Open time У–ppningstid ContactListingModel Yes Ja Unknown OkУЄnt Actual network address (SHA1) of the contact SHA1 av din contact Locally given nickname ; user may set her own nickname himself Smeknamn Public statement if this operator to be trusted in transactions Om den hУЄr kontakt ska bli fУЖrtrУЖstad? Address Adress Nickname Smeknamn Publicly trusted Offentlig fУЖrtroende ContentEncryptionModel SSL key generation went wrong, calling exit.. Kunde inte generera SSL-nyckel, utgУЅende.. x509 cert generation went wrong, calling exit.. Kunde inte generera x509-cert, utgУЅende.. RSA Private key key saving went wrong Kunde inte persist RSA-nyckel No suitable de-cryption key found Hemlig nyckel fУЖr kryptering finns inte Controller Classified ads Annonser Enter password for protection of your messages: Ge ett lУЖsenord: Fetching item from network.. HУЄmtning objektet.. E&xit StУЄnga Exit the application StУЄnga av program &About Om &annonser Show the application's About box Visa information av den hУЄr program &Change password FУЖrУЄndra din lУЖsenord Change password of current profile FУЖrУЄndra lУЖsenorden av vald profil Create &new profile Skapa en &ny profil Makes a brand new user profile Skapar en ny profil fУЖr operator &Delete current profile Radera vald profil Deletes currently open profile Ska glУЖmma allt om vald profil &Select another profile VУЄlja en annan profil If you have multitude of profiles Om du har flera profiler Settings.. InstУЄllningar.. Node-wide settings.. InstУЄllningar av nod Network status.. Status av nУЄtverket.. Search.. SУЖk.. &File &Filer Enter new password: Ge ett lУЖsenord: Activate another profile with password VУЄlja en annan profil med en lУЖsenord Can't delete only profile. Man kan inte radera den sista profil Permanently discard profile? Radera profil? There will be NO way to access content of this profile later Det finns INTE en metod fУЖr att visa den hУЄr profil senare Cant load node cert or key cert Kan inte ladda smycken fУЖr din nod File error Fel med filen Database error Fel med databas Cryptographic module Fel med kryptering Database module Fel med databas Bad password Fel lУЖsenord Could not find item from network.. Kunde inte hitta objektet frУЅn nУЄtverket SHA1: SHA1: Mime-Type: Mime-Type: Description: Beskrivning: Publisher: FУЖrlУЄggare: Content owner: InnehУЅllsУЄgare: License: Licens: Name: Namn: Date: Datum: DialogBase File way too big Filen УЄr alldeles fУЖr stor File too big Filen УЄr fУЖr stor File open error Fel med УЖppningen av filen Select file to be published VУЄlja filen som du will ha publicerad Files (*.*) Alla filer (*.*) EditContactDialog Error Fel Operator addr is not valid Adress av operator УЄr inte giltig FrontWidget Classified ads Annonser My profile Egen profil Contacts Kontakter Private messages Privat korrespondens Add shared file.. Addera en fil til nУЄtverk.. Stop advertising selected shared file Sluta annonsera den markerade filen Save file to disk.. Spara filen till disk.. View file information.. Visa beskrivning av filen.. Copy file address (SHA1) to clipboard.. Kopiera SHA1 till urklipp.. Edit+publish new text document.. Skapa+publicera en ny dokument.. Open File У–ppna filen Files (*.*) Alla typer (*.*) Error Fel Can't load image Kan inte ladda en bild Profile not in database Profil finns inte i lokal databas Try viewing profile first to obtain data Du kan fУЖrsУЖka att se profil fУЖrst fУЖr att hУЄmta data Select file to be published VУЄlja filen du vill ha publicerad File way too big Filen УЄr alldeles fУЖr stor File too big Filen УЄr fУЖr stor File open error Fel med УЖppningen av filen files filer Choose file name for saving VУЄlj ett namn for din fil Click To Add Image Klicka fУЖr att lУЄgga till en bild Article not found from local storage Annons kunde inte hittas i local databas Trusted by %1 SHA1 %2 Betrodd av %1 SHA1 %2 Time of last update Tid av senaste УЄndring (No Image Selected) (Ingen Bild Valts) Edit contact.. Redigera kontakt &Reply to sender Svara avsУЄndaren Reply to &forum Svara pУЅ &forumet &Post new ad Ska&pa en ny annons &Public comment &Publik kommentar &View profile &Visa profilen Attachments.. Bilagor.. Add selected operator to contacts.. LУЄgga operator till din kontakter &Reply Svara &New message Skapa en ny brev &Send public comment to sender Skicka en publik kommentar om profilen &View profile of peer &Visa profilen Add selected to contacts.. LУЄgga till din kontakter.. From: FrУЅn: Subject: Rubrik: To: Mottagare: Invalid SHA1 in URL SHA1 i URL УЄr inte giltig Invalid URL URL УЄr inte giltig InsertLinkDialog Invalid URL URL УЄr inte giltig ManualConnectionDialog DNS lookup failure Namnet kunde inte hittas frУЅn DNS NewPrivMessageDialog Error Fel Recipient addr is not valid Adressen av mottagaren УЄr inte giltig Recipient encryption key not found from storage Kryptering-nyckel fУЖr mottagaren kunde inte hittas i lokal databas NewProfileCommentDialog Error Fel Commented profile addr is not valid Adressen av profil УЄr inte giltig Recipient encryption key not found from storage Kunde inte hittas kryptering-nyckel frУЅn lokal databas NodeModel SSL key generation went wrong, calling exit.. Kunde inte skapa SSL-nyckel, utgУЅende.. x509 cert generation went wrong, calling exit.. Kunde inte skapa x509-nyckel, utgУЅende.. Cant load SSL cert Kunde inte ladda SSL-nyckkel Cant load SSL key Kunde inte ladda SSL-nyckel PasswdDialog Min length 5 (use 10+) MinimilУЄngd УЄr 5 (du skulle anvУЄnda minst 10+) PasswordDialog Password required LУЖsenord krУЄvs Should you forget this word, there is no easy way to recover any of your content Om du glУЖmmer det hУЄr ordet, det finns inte en praktiskt metod fУЖr att visa dina filer senare Enter password for protection of your messages Ge ett lУЖsenord If you forget this word, there is no simple way to recover your contents Om du glУЖmmer det hУЄr ordet, det finns inte en praktiskt metod fУЖr att visa dina filer senare OK OK PrivateMessageSearchModel %1 Trusted by %2 %1 Betrodd av %2 Direction of message, sent/received Riktning Dir Riktning Peer Peer Time Datum Subject Rubrik ProfileCommentDisplay &Add comment... Skapa en ny komment.. Save attachment to disk.. Spara filen till disk.. Error Fel Article not found from local storage Annons kunde inte hittas i lokal databas ProfileCommentItemDelegate Attachments: TillУЄggade filer: ProfileCommentListingModel Sender AvsУЄndare Time Datum Subject Rubrik ProfileCommentModel Profile related to comment not found from database Profilen frУЅn komment kunde inte hittas i lokal databas ProfileReadersDialog View profile Visa profilen ProfileReadersListingModel Name or fingerprint of reader Namn eller SHA1 kontrollsumm av lУЄsaren RingtonePlayer raw audio format not supported by backend, cannot play audio. Could not initialize audio player. SearchDisplay Open.. У–ppna.. TextEdit Help HjУЄlp About &Qt Information om &Qt Edit Actions Aktions fУЖr redigering &File Arkiv &Open... У–ppna.. &Save locally before send &Spara fУЖre skickning Save locally &As... Spara i lokal disk med namn.. &Print... Skriv ut.. Print Preview... FУЖrhandsgranskning &Export PDF... &Exportera som PDF &Edit R&edigera &Undo У…ngra &Redo У…terstУЄll Cu&t Klipp ut &Copy Kopiera &Paste Klistra in Insert link Infoga en lУЄnk Embed image BУЄdda in en bild F&ormat F&ormat &Bold Fet &Italic Kursiv &Underline Understruken &Left VУЄnsterjustera C&enter Centrerat &Right HУЖgerjustera &Justify Marginaljustering &Color... FУЄrg.. Standard Standardformat Bullet List (Disc) PunktuppstУЄllning (bollar) Bullet List (Circle) PunktuppstУЄllning (cirklar) Bullet List (Square) PunktuppstУЄllning (kvadrater) Ordered List (Decimal) Numrering (decimal) Ordered List (Alpha lower) Numrering (smУЅ bokstУЄver) Ordered List (Alpha upper) Numrering (stora bokstУЄver) Ordered List (Roman lower) Numrering (smУЅ roman) Ordered List (Roman upper) Numrering (stora roman) Application Annonser The document has been modified. Do you want to save your changes? Dokument har УЄndrats, spara? Open File... У–ppna filen.. HTML-Files (*.htm *.html);;All Files (*) HTML-Filer (*.htm *.html);;Alla typer (*) Save as... Spara som.. ODF files (*.odt);;HTML-Files (*.htm *.html);;All Files (*) ODF filer (*.odt);;HTML-Filer (*.htm *.html);;Alla typer (*) Print Document Skriv ut dokument Open File У–ppna filen Files (*.*) Alla filer (*.*) Error Fel Can't load image Kan inte ladda en bild File way too big Filen УЄr alldeles fУЖr stor VoiceCallEngine Accept Reject Close StУЄng Actual network address (SHA1) of the peer operator Network address of the remote node Operator Node address Call status Controls Ending Initializing Incoming Open Closing Closed Error Fel No call Audio call is not possible Audio call is possible Audio call is not possible: operator address unknown Audio call is not possible: operator profile not found Audio call is not possible: operator has no node information in profile Audio call is not possible: operators IPv4 address %1 not connected Audio call is not possible: operators IPv6 address %1 not connected Audio call is not possible: local node has no IPv6 address, operator has only IPv6 addr Audio call is not possible: operator does not publish network address aboutDialog About classified ads Information om Annonser Classified ads is a program for online communications Annonser УЄr en programvara fУЖr kommunikation УЖver internet <html><head/><body><p>Classified ads is free software. You may use, copy and modify it if you follow the conditions given in GNU lesser general public license version 2.1.</p><p>Classified ads is copyright ТЉ Antti JУЄrvinen 2013. </p><p>Main feature of the the program is an &quot;advertisement&quot; - a piece of text belonging to selected classification. There are several pre-programmed classifications and operators are encouraged to invent new classifications for new purposes ; the selection boxes in classification-selection tab are editable. Other operators may then view the ads, publicly comment the ads, the operators and also send private messages to each others. </p><p>Another important feature of classified ads is that it is designed to be operated without any centralized server infrastucture - it is you and other operators whose computers store and transmit all the content visible inside classified ads. To get connected you need to know address of at least one existing computer (a <span style=" font-style:italic;">node</span>) so if your network connection dialog shows no connections, you may need to contact someone you know is using the software and ask for address of her node to make initial contact with the network. Once connected the software should maintain list of addresses of other nodes. </p><p>Due to its server-less design the whole system works best if you leave the program running always when you have your computer powered on ; while processing other operators requests it will hog some computing resources and generate network traffic also when you are not actively using the program youself - others are. </p><p>Operators concerned about privacy of the content should be aware of following items:</p><p>- Data storage implementation is variant of <span style=" font-style:italic;">distributed hash table</span>, practically meaning that content posted by you gets copied some more-or-less random nodes in the network. </p><p>- Any data item (ad, comment, binary file, private message etc.) is digitally signed. This makes it more difficult to try to pose as another operator. </p><p>- Operators are reliably identified only by the SHA1 hash of their generated encryption keys. SHA1 hash is displayed when viewing details of operator profiles. Other identifying information like nickname or city name are entered by operator himself and can be anything. The operator profile, as it is published to the network, is also signed with the encryption keys of the operator - if you identify an operator by her SHA1 hash, you have a mechanism for identifying if any content inside classified ads is posted by this operator or not. Classified ads internally checks for digital signatures, throwing away content that fails signature check and tries to provide SHA1 hash of the operator who posted the content.</p><p>- All classified ads are posted as plain text, no encryption is used. All public profiles are posted as plain text, no encryption is used. If profile is made private, it is encrypted to be readable only by selected other profiles. This applies also to binary files shared by operators private profiles and comments about private profiles after the profile was made private (previously plain-text comments or files don't get magically encrypted afterwards). Private messages are encrypted always to be readable only by recipient and sender. Attachments follow the privary rules of the document, they're attachted to. </p><p>- As is the case with all internet-communications, this small fact is true for classified ads too : <span style=" font-style:italic;">once something gets posted online, there is no way to remove it from network</span>. </p><p>- Data encryption implementation for content is OpenSSL, relying mostly on algorithms RSA-2048 and AES-256. </p><p>- While connections between nodes are implemented using SSL, other nodes inside network do get to know what content is being transmitted in neighboring nodes. While there is no central point for easily collecting this information about particular classification or operator, operators still should expect no privacy regarding their doings online, although some effort has been been put into hiding <span style=" font-style:italic;">contents</span> of private messages and private profiles. </p><p>Programming was (mostly) done by Antti JУЄrvinen, artwork by Meeri JУЄrvinen.</p><p>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/).</p><p>Happy advertising!</p><p><br/></p></body></html> <html><head/><body><p>Classified ads is free software. You may use, copy and modify it if you follow the conditions given in GNU lesser general public license version 2.1.</p><p>Classified ads is copyright ТЉ Antti JУЄrvinen 2013. </p><p>Main feature of the the program is an &quot;advertisement&quot; - a piece of text belonging to selected classification. There are several pre-programmed classifications and operators are encouraged to invent new classifications for new purposes ; the selection boxes in classification-selection tab are editable. Other operators may then view the ads, publicly comment the ads, the operators and also send private messages to each others. </p><p>Another important feature of classified ads is that it is designed to be operated without any centralized server infrastucture - it is you and other operators whose computers store and transmit all the content visible inside classified ads. To get connected you need to know address of at least one existing computer (a <span style=" font-style:italic;">node</span>) so if your network connection dialog shows no connections, you may need to contact someone you know is using the software and ask for address of her node to make initial contact with the network. Once connected the software should maintain list of addresses of other nodes. </p><p>Due to its server-less design the whole system works best if you leave the program running always when you have your computer powered on ; while processing other operators requests it will hog some computing resources and generate network traffic also when you are not actively using the program youself - others are. </p><p>Operators concerned about privacy of the content should be aware of following items:</p><p>- Data storage implementation is variant of <span style=" font-style:italic;">distributed hash table</span>, practically meaning that content posted by you gets copied some more-or-less random nodes in the network. </p><p>- Any data item (ad, comment, binary file, private message etc.) is digitally signed. This makes it more difficult to try to pose as another operator. </p><p>- Operators are reliably identified only by the SHA1 hash of their generated encryption keys. SHA1 hash is displayed when viewing details of operator profiles. Other identifying information like nickname or city name are entered by operator himself and can be anything. The operator profile, as it is published to the network, is also signed with the encryption keys of the operator - if you identify an operator by her SHA1 hash, you have a mechanism for identifying if any content inside classified ads is posted by this operator or not. Classified ads internally checks for digital signatures, throwing away content that fails signature check and tries to provide SHA1 hash of the operator who posted the content.</p><p>- All classified ads are posted as plain text, no encryption is used. All public profiles are posted as plain text, no encryption is used. If profile is made private, it is encrypted to be readable only by selected other profiles. This applies also to binary files shared by operators private profiles and comments about private profiles after the profile was made private (previously plain-text comments or files don't get magically encrypted afterwards). Private messages are encrypted always to be readable only by recipient and sender. Attachments follow the privary rules of the document, they're attachted to. </p><p>- As is the case with all internet-communications, this small fact is true for classified ads too : <span style=" font-style:italic;">once something gets posted online, there is no way to remove it from network</span>. </p><p>- Data encryption implementation for content is OpenSSL, relying mostly on algorithms RSA-2048 and AES-256. </p><p>- While connections between nodes are implemented using SSL, other nodes inside network do get to know what content is being transmitted in neighboring nodes. While there is no central point for easily collecting this information about particular classification or operator, operators still should expect no privacy regarding their doings online, altough some effort has been been put into hiding <span style=" font-style:italic;">contents</span> of private messages and private profiles. </p><p>Programming was (mostly) done by Antti JУЄrvinen, artwork by Meeri JУЄrvinen.</p><p>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/).</p><p>Happy advertising!</p><p><br/></p></body></html> <html><head><meta name="qrichtext" content="1" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Ubuntu'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Annonser УЄr fri programvara. Du kan anvУЄnda, kopiera och modifiera det om du fУЖljer konditioner av GNU LGPL licens v2.1 (GNU Lesser General Public License). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright ТЉ Antti JУЄrvinen 2013.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Den viktig funktionen av Annonser УЄr &quot;annons&quot; - dokument som har en klassificering. Program har flera klassificrings och anvУЄndarna kan skapa mera. AnvУЄndarna kan lУЄsa annonser, skapa kommentarer om dom och ha korrespondens.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">En annan viktig egenskap УЄr att Annonser УЄr inte serverbaserad, det anvУЄnder inte en databas i server УЖver nУЄtverket. Alla filer sparas i datorer av anvУЄndarna av Annonser. FУЖr at kunna ansluta sig med nУЄtverket av Annonser man har at veta minst en adress av en dator som УЄr i nУЄtverket. NУЄr program har anslutat sig med nУЄtverket det ska underhУЅlla sin egen listan om andra datorer i nУЄtverket. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PУЅ grund av partnerbaserad-konstruktion hela system fungerar bУЄst om du lУЄmnar program pУЅ ocksУЅ nУЄr du inte anvУЄnder program sjУЄlv. Program ska ta datorkraft och generera traffic УЖver nУЄtverket nУЄr du inte anvУЄnder program, men andra anvУЄndare ska bli betjУЄnad. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">AnvУЄndarna intresserad av sina informationssУЄkerhet skulle veta att:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> - Databas УЄr en variant av distribuerad hashtabell (DHT). Det betyder att filer skickad i nУЄtverket sparas i flera datorer i andra anvУЄndarnas УЄgo.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> - Alla dataobjekter i Annonser har en digital signatur. <br /> - Den enda vУЄrdig identifiering fУЖr operatУЖr ar SHA1 kontrollsumm av hennes RSA-nyckel. Alla andra punkter om operatУЖr kan vara vad som helst.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> - Alla annonser ska sparas i nУЄtverket utan kryptering - alla kan lУЄsa dom. Alla publik profiler sparas i nУЄtverket utan kryptering. OperatУЖrprofiler som УЄr privat ska bli krypterad bara fУЖr listade anvУЄndare. Samma gУЄller ocksУЅ fУЖr kommentarer och filer av profil. Om en profil blir privat, gammal kommentarer och filer av profil УЄr inte krypterad. Korrespondens (brev) mellan anvУЄndarna ska vara krypterad alltid. Bilagor fУЖljer kryptering av sina УЄgande dokument. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> - Som УЄr fallet med alla kommunikation УЖver internet, det hУЄr gУЄller ocksУЅ: om nУЅgonting УЄr publicerad i Annonser, <span style=" font-style:italic;">det finns inte en metod fУЖr att ta det bort senare</span>. <br /> - Programvara fУЖr kryptering УЄr OpenSSL, algoritmen mest avУЄnda УЄr RSA-2048 och AES-256.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> - Kommunikationen mellan datorer i nУЄtverket УЄr krypterad med SSL. Din partners i nУЄtverket kan se alla trafik till din nod. AnvУЄndarna skulle inte ponera anonymitet eller hemlighet УЖver saker dom gУЖr i nУЄtverket. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Programmering gjorts av Antti JУЄrvinen, konst av Meeri JУЄrvinen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Denna produkt innehУЅller programvara som har utvecklats av OpenSSL project fУЖr anvУЄndning i OpenSSL toolkit (http://www.openssl.org).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> attachmentListDialog List of attached files Listan av bilagor callStatusDialog Call status Input level Audio calls Output level editContactDialog Edit a contact Redigera en kontakt Address (SHA1) of contact Adress (SHA1 kontrollsumm) av kontakt Local nickname Lokal smeknamn <html><head/><body><p>Settings some trusted is public information to readers of your profile</p></body></html> <html><head/><body><p>Om du trУЖst pУЅ en profil, det УЄr publik information</p></body></html> This contact is to be publicly trusted in transactions Den hУЄr kontakt УЄr tillfУЖrlitlig frontWidget Form Form Classified ads Annonseravdelning Search for classified ads about SУЖk annonser efter Perform UtfУЖra of av in i Search SУЖk My profile Egen profil Profile address Adress av profil Nickname Smeknamn Greeting text HУЄlsningar For the rest of the world. FУЖr hela vУЄrlden First name FУЖrnamn Family name Efternamn City/country Stad/rike BTC address BTC-adress If you wish to receive payments via BTC, include your BTC address too. Om du will ta mot betalningar, ge din BTC-adress State of the world TillstУЅndet i vУЄrlden Longer explanation about state of the world TillstУЅndet i vУЄrlden Profile is private Profilen УЄr privat Readers of profile LУЄsarna av profilen None of the fields is mandatory Ingent pukt УЄr obligatoriskt Time of last update Tid av senaste УЄndring Publish Publicera Revert changes У…tergУЅ Details of operator profile: Detaljer om operatУЖrsprofil Click to Add Image Klicka fУЖr at lУЄgga till en bild Shared files Filer i fildelning Latest comments Senaste kommentarer Contacts Kontakter Add contact LУЄgg kontakt Remove contact Ta bort kontakt View profile Visa profilen Send message Skicka en elektronisk post Private messages Korrespondens Profile details Detaljer av profil City/Country Stad/rike BTC Addr BTC-adress <html><head/><body><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;">No</span></p><p align="center"><span style=" font-size:16pt;">Image</span></p><p align="center"><span style=" font-size:16pt;">Inserted</span></p></body></html> <html><head/><body><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;">Ingen</span></p><p align="center"><span style=" font-size:16pt;">Bild</span></p><p align="center"><span style=" font-size:16pt;">Valts</span></p></body></html> Send message to operator Skicka en brev Audio call View readers LУЄsarna av profilen Comment Skicka en kommentar Add to contacts LУЄgga till din kontakter insertLinkDialog Insert link Infoga en lУЄnk URL URL Link label in text LУЄnktext manualConnectionDialog Manually add node to connection queue LУЄgga till en nod (anslutningen) Remote node listen port TCP-port av peer Remote node network address NУЄtverk adress IPv4, IPv6 or DNS name IPv4, IPv6 eller DNS-namn metadataQuery File information Information av filen Name of the file: Namn: Owner of file (name or SHA1 if CA operator): InnehУЅllsУЄgare: License of use: Licens: Public domain Lets not translate license names.. Public domain GPL GPL LGPL LGPL BSD BSD CC-BY CC-BY CC-BY-SA CC-BY-SA CC-BY-ND CC-BY-ND CC-BY-NC CC-BY-NC CC-BY-NC-SA CC-BY-NC-SA CC-BY-NC-ND CC-BY-NC-ND Mime-type: Mime-typ: Description of file: Beskrivning: Enter information regarding file before publish: Ange information fУЖre publicera: newCaDialog Post a new classified ad Skicka en ny annons About I frУЅga om of av in i Subject Rubrik Attachment: Bilagor: Add Inkludera newPrivMsgDialog Send a private message Skicka en ny brev Subject Rubrik Recipient Mottagare Attachments: Bilagor: Attach Inkludera newProfileCommentDialog Comment a operators profile Skicka en kommentar av en profil Subject Rubrik Commented profile OperatУЖrsprofil Attachments: Bilagor: Attach Inkludera newTextDocumentDialog Edit and publish a new text document Skapa och publicera en ny dokument Document title Rubrik Attachments: Bilagor: Attach Inkludera profileCommentDisplay Comments regarding operator Kommentarer av en operatУЖr profileReadersDialog Profile readers list LУЄsarna av en profil Search for profiles to add SУЖk fУЖr profiler som ska bli lУЄggad till First 100 matching profiles: FУЖrst 100 motsvarande profiler: Add seleted to list of readers Inkludera vald profiler Current list of readers Aktuell listan Close StУЄng Remove selected Ta bort vald profiler searchDisplay Search data storage SУЖk lokal databas Words: Alla ord: Search SУЖk Network search SУЖk i nУЄtverket Search ads SУЖk annonser Search profiles SУЖk profiler Search comments SУЖk kommentarer settingsDialog Node settings InstУЄllningar av dator TCP listen port TCP-port Incoming TCP listen port. Change requires node restart. TCP-port fУЖr inkommande trafik. MУЅste omstarta programmen om УЄndrats.. DNS name of node DNS-namn If you have permanent DNS name for your machine, you may type it here to be used to reference your node Om du har DNS-namnet for din dator Data store limits: BegrУЄnsningar fУЖr databas Nr of profiles to keep Antal profiler Nr of private messages to keep Antal E-brev Nr of binary blobs to keep Antal filer Nr of CAs to keep Antal annons Number of classified ads to keep in storage, total, including all classifications. Oldest referenced will be deleted first. Nr of profile comments to keep Antal kommentarer Ringtone Bow Electrical Acoustic Beep Silence Accept voice calls All From trusted operators Accept no voice calls statusDialog Network and connection status У–versikt av nУЄtverket Detected own IPv4 Upphittade egen IPv4 adress Should your friend have trouble connecting, give her this address with port number Om din vУЄn kan inte ta kontakt med nУЄtverket, ge honom den hУЄr adress med port IPv6 IPv6 TCP port currently used TCP port Currently open connections У–ppna datastrУЖmmar Manually add connection LУЄgga till en peer Close StУЄng classified-ads-0.13/controller.cpp000066400000000000000000001764741331670245300172260ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #include #include #include #include #ifdef WIN32 #include #include #endif #include #include "controller.h" #include "FrontWidget.h" #include "log.h" #include "net/node.h" #include "datamodel/model.h" #include "datamodel/contentencryptionmodel.h" #include "net/networklistener.h" #include "net/networkconnectorengine.h" #include "net/publishingengine.h" #include "net/retrievalengine.h" #include "net/dbretrievalengine.h" #ifndef WIN32 #include // for getpid() #endif #include #include "ui/passwd_dialog.h" #include #include "datamodel/profile.h" #include "datamodel/profilemodel.h" #include "datamodel/profilecommentmodel.h" #include "ui/settings.h" #include "ui/status.h" #include "ui/aboutdialog.h" #include "ui/searchdisplay.h" #include "datamodel/searchmodel.h" #include "datamodel/profile.h" #include "datamodel/profilecomment.h" #include "datamodel/trusttreemodel.h" #include "datamodel/binaryfile.h" #include "net/voicecallengine.h" #include "datamodel/voicecall.h" #include "ui/tclPrograms.h" #include "tcl/tclWrapper.h" static const char *KPrivateDataContactsSection = "contacts" ; static const char *KPrivateDataContactsCache = "contactsCache" ; static const char *KPrivateDataTrustTree = "trustTree" ; Controller::Controller(QApplication &app) : iWin(NULL), iCurrentWidget(NULL), iApp ( app ) , iLayout (NULL), iFileMenu(NULL), iExitAct(NULL), iAboutAct(NULL), iPwdChangeAct(NULL), iProfileDeleteAct(NULL), iProfileCreateAct(NULL), iProfileSelectAct(NULL), iDisplaySettingsAct(NULL), iDisplayStatusAct(NULL), iDisplaySearchAct(NULL), iTclMenu(NULL), iTclLibraryAct(NULL), iTclConsoleAct(NULL), iNode(NULL), iModel(NULL), iListener(NULL), iNetEngine(NULL), iPubEngine(NULL), iRetrievalEngine(NULL), iDbRetrievalEngine(NULL), iVoiceCallEngine (NULL), iInsideDestructor(false), iSharedMemory(NULL), #ifdef WIN32 iLocalServer(NULL), #endif iTclWrapper(NULL), iGetFileNameDialog(NULL), iGetFileNameSemaphore(1) { LOG_STR("Controller::Controller constructor out") ; } bool Controller::init() { QLOG_STR("Controller::init in") ; #ifndef WIN32 int pid ; if ( ( pid = createPidFile() ) != -1 ) { // there is old instance, if we have url to open, put it into shared memory QString sharedMemName ( QString("classified-ads-") + QString::number(pid) ) ; if ( createSharedMemSegment(sharedMemName) == false ) { return false ; } // segment before signaling the previously opened instance: LOG_STR2("Signaling old instance %d", pid) ; if ( kill(pid, SIGUSR2) != -1 ) { // was success kill(getpid(), SIGINT) ; // then signal this instance to go away.. LOG_STR("Instance signaled ") ; return false ; } else { // the process did not exist.. LOG_STR("But process was not there?") ; deletePidFile() ; createPidFile() ; } } else { // createPidFile() returned -1 meaning that the // process was not there: create a shared memory segment: if ( iSharedMemory == NULL ) { QString sharedMemOwnName ( QString("classified-ads-") + QString::number(getpid()) ) ; iSharedMemory = new QSharedMemory(sharedMemOwnName) ; } if ( iSharedMemory ) { if( iSharedMemory->attach() == false ) { // 1 kb and some extra iSharedMemory->create(1024,QSharedMemory::ReadWrite) ; QLOG_STR("Created shared mem 1kb, is attached = " + QString::number(iSharedMemory->isAttached())) ; } } } #else // in WIN32 try to check existence of previous instance // by using a local server. const QString KLocalServerName("classifiedads") ; QString sharedMemSegmentName("classified-ads") ; QString segmentName("classified-ads") ; createSharedMemSegment(sharedMemSegmentName) ; QLocalSocket s ; s.connectToServer(KLocalServerName) ; if ( s.waitForConnected(2000) == true ) { s.close() ; QLOG_STR("Exiting because there is old instace has been signaled") ; return false ; // job done } else { switch ( s.error() ) { case QLocalSocket::PeerClosedError: // ok, looks like the server is actually there: QLOG_STR("Exiting because there is old instace that closed connection") ; return false ; break ; default: QLOG_STR("Not exiting due to old instance, starting own local server") ; iLocalServer = new QLocalServer(this) ; if ( iLocalServer ) { if ( iLocalServer->listen(KLocalServerName) ) { connect(iLocalServer, SIGNAL(newConnection()), this, SLOT(newInstanceConnected())) ; QLOG_STR("Local server listen ok") ; } } break ; } } #endif qRegisterMetaType("MController::CAErrorSituation"); qRegisterMetaType("Hash"); qRegisterMetaType("ProtocolItemType"); qRegisterMetaType("QHostAddress"); qRegisterMetaType("VoiceCallEngine::CallState"); qRegisterMetaType >("QVector"); // used by dataChanged iWin = new QMainWindow(NULL) ; iWin->setWindowTitle(tr("Classified ads")) ; // somehow Qt should calculate size from widgets. it gets too small vertical.. iWin->setMinimumSize(450,600) ; createMenus() ; iLayout = new QBoxLayout( QBoxLayout::TopToBottom, NULL ) ; QWidget *centralWidget = new QWidget() ; iWin->setCentralWidget(centralWidget) ; centralWidget->setLayout(iLayout) ; iModel = new Model(this); iDisplaySearchAct->setEnabled(true) ; displayFront() ; // put UI in place only after model has been instantiated iWin->show() ; iModel->getNetReqExecutor()->start() ; iNode = new Node(iModel->nodeModel().nodeFingerPrint(), iModel->nodeModel().listenPortOfThisNode()) ; iNode->setDNSAddr(iModel->nodeModel().getDnsName()) ; iListener = new NetworkListener (this, iModel) ; // network listener enumerates network interfaces and sets // possible ipv6 addr into iNode() -> if (!Connection::Ipv6AddressesEqual(iNode->ipv6Addr(), KNullIpv6Addr)) { LOG_STR("We have IPv6") ; iListener->startListen(true) ; } else { iListener->startListen(false) ; // ipv4 only } // lets pass iListner to net engine because it is also observer // for new connections so lets have it observering the // newly-connecting outgoing connections too, it doesn't // need to know who originated the connection.. iNetEngine = new NetworkConnectorEngine(this, iModel,*iListener) ; iNetEngine->start() ; PasswdDialog *pwd_dialog = new PasswdDialog(iWin, *this,tr("Enter password for protection of your messages:")) ; connect(pwd_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), this, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; pwd_dialog->show() ; iPubEngine = new PublishingEngine(this, *iModel) ; iPubEngine->setInterval(5000); // every 5 seconds iRetrievalEngine = new RetrievalEngine (this, *iModel) ; iRetrievalEngine->setInterval(5000); // every 5 seconds iDbRetrievalEngine = new DbRecordRetrievalEngine (this, *iModel) ; iDbRetrievalEngine->setInterval(5000); // every 5 seconds // network listener is also connection status observer so lets // have it to signal the pub-engine when connections are opened/closed // (also the failed ones that are usually of no interest) assert( connect(iListener, SIGNAL( nodeConnectionAttemptStatus(Connection::ConnectionState , const Hash ) ), iPubEngine, SLOT( nodeConnectionAttemptStatus(Connection::ConnectionState , const Hash )), Qt::QueuedConnection ) ) ; assert( connect(iListener, SIGNAL( nodeConnectionAttemptStatus(Connection::ConnectionState , const Hash ) ), iNetEngine, SLOT( nodeConnectionAttemptStatus(Connection::ConnectionState , const Hash )), Qt::QueuedConnection ) ) ; assert( connect(iListener, SIGNAL( nodeConnectionAttemptStatus(Connection::ConnectionState , const Hash ) ), iRetrievalEngine, SLOT( nodeConnectionAttemptStatus(Connection::ConnectionState , const Hash )), Qt::QueuedConnection ) ) ; assert( connect(iListener, SIGNAL( nodeConnectionAttemptStatus(Connection::ConnectionState , const Hash ) ), iDbRetrievalEngine, SLOT( nodeConnectionAttemptStatus(Connection::ConnectionState , const Hash )), Qt::QueuedConnection ) ) ; assert( connect(iListener, SIGNAL( nodeConnectionAttemptStatus(Connection::ConnectionState , const Hash ) ), iModel->getNetReqExecutor(), SLOT( nodeConnectionAttemptStatus(Connection::ConnectionState , const Hash )), Qt::QueuedConnection ) ) ; assert( connect(iListener, SIGNAL( nodeConnectionAttemptStatus(Connection::ConnectionState , const Hash ) ), iCurrentWidget, SLOT( nodeConnectionAttemptStatus(Connection::ConnectionState , const Hash )), Qt::QueuedConnection ) ) ; assert( connect(iRetrievalEngine, SIGNAL( notifyOfContentNotReceived(const Hash& , const ProtocolItemType ) ), this, SLOT( notifyOfContentNotReceived(const Hash& , const ProtocolItemType )), Qt::QueuedConnection ) ) ; assert( connect(this, SIGNAL(userProfileSelected(const Hash&)), this, SLOT( checkForObjectToOpen(const Hash&)), Qt::QueuedConnection)); // after signals are connected, start publishing and retrieval iPubEngine->start() ; iRetrievalEngine->start() ; iDbRetrievalEngine->start() ; // instantiate voice call engine from UI thread, otherwise // some transient connection-related thread will do it and // problems start appearing after the thread finishes.. this->voiceCallEngine() ; connect(this, SIGNAL(startGettingFileName(QString,bool)), this, SLOT(getFileNameSlot(QString,bool)), Qt::QueuedConnection) ; /* // debug thing: iModel->classifiedAdsModel().reIndexAllAdsIntoFTS() ; iModel->profileModel().reIndexAllProfilesIntoFTS() ; iModel->profileCommentModel().reIndexAllCommentsIntoFTS() ; */ QLOG_STR("Controller::init out") ; return true ; } bool Controller::createSharedMemSegment(QString& aSegmentName) { if ( ( iSharedMemory = new QSharedMemory(aSegmentName)) != NULL ) { if ( iSharedMemory->attach() == false ) { iSharedMemory->create(1024,QSharedMemory::ReadWrite) ; } if( iSharedMemory->isAttached() == true && iSharedMemory->constData() != NULL && iSharedMemory->size() >= 1024 && iObjectToOpen.scheme().length() > 0 ) { iSharedMemory->lock(); strcpy((char *)(iSharedMemory->data()), iObjectToOpen.toString().toUtf8().constData()) ; iSharedMemory->unlock(); QLOG_STR("Copied to shared mem bytes " + aSegmentName + " " + QString::number(strlen((char *)(iSharedMemory->data()))) ) ; } else { if (iSharedMemory->isAttached() == true && iSharedMemory->constData() != NULL && iSharedMemory->size() >= 1024 && iObjectToOpen.scheme().length() == 0 ) { // there is shared memory segment but nothing in iObjectToOpen // so null-terminate the shared memory segment contents iSharedMemory->lock(); char* d ( (char *)(iSharedMemory->data())) ; iSharedMemory->unlock(); *d = '\0' ; QLOG_STR("Constructed shared mem segment " + aSegmentName ) ; } } return true ; } else { QLOG_STR("Could not construct shared mem segment " + aSegmentName ) ; return false ; } } Controller::~Controller() { LOG_STR("Controller::~Controller") ; iInsideDestructor = true ; if ( iGetFileNameDialog ) { iGetFileNameDialog->reject() ; QWaitCondition waitCondition; QMutex mutex; mutex.lock() ; // waitCondition needs a mutex initially locked waitCondition.wait(&mutex, 100);// let file selection call stack // collapse or it will return to deleted tcl interpreter mutex.unlock() ; } if ( iGetFileNameDialog ) { delete iGetFileNameDialog ; iGetFileNameDialog = NULL ; } if ( iTclWrapper ) { iTclWrapper->stopScript(true) ; // deletes self iTclWrapper = NULL ; } #ifdef WIN32 if ( iLocalServer ) { iLocalServer->close() ; delete iLocalServer ; } #endif if ( iVoiceCallEngine ) { delete iVoiceCallEngine ; iVoiceCallEngine = NULL ; // call status dialog, if open, will ask.. } if ( iListener ) { iListener->stopAccepting() ; } if ( iNetEngine ) { iNetEngine->iNeedsToRun = false ; } if ( iPubEngine ) { iPubEngine->iNeedsToRun = false ; iPubEngine->stop() ; delete iPubEngine ; iPubEngine = NULL ; } LOG_STR("Controller::~Controller 1 pubengine gone") ; if ( iRetrievalEngine ) { iRetrievalEngine->stop() ; delete iRetrievalEngine ; iRetrievalEngine = NULL ; } if ( iDbRetrievalEngine ) { iDbRetrievalEngine->stop() ; delete iDbRetrievalEngine ; iDbRetrievalEngine = NULL ; } if ( iNetEngine ) { #ifndef WIN32 deletePidFile() ; // if we did not instantiate net engine, we // did not create pidfile either QLOG_STR("NetEngine->terminate") ; iNetEngine->terminate() ; iNetEngine->wait(1000) ; // 1 sec max, then just delete.. QLOG_STR("NetEngine->terminate out") ; #endif } LOG_STR("Controller::~Controller 2 netengine gone") ; // .. connections reference iListener. // so in order to prevent random crash at closing, lets first get rid // of connections, only after that delete iListener ; if ( iModel ) { iModel->closeAllConnections(false) ; // after all connections have been instructed to close themselves, // wait for some time to give them time to do so.. unsigned char waitCounter ( 0 ) ; while ( ( waitCounter < 60 && iModel->getConnections().count() > 0 ) || ( waitCounter < 2 ) ) { ++waitCounter ; QLOG_STR("Waitcounter " + QString::number(waitCounter) + " conn count " + QString::number( iModel->getConnections().count() ) ) ; QWaitCondition waitCondition; QMutex mutex; mutex.lock() ; // waitCondition needs a mutex initially locked waitCondition.wait(&mutex, 500);// give other threads a chance.. mutex.unlock() ; QThread::yieldCurrentThread (); QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents) ; } iModel->closeAllConnections(true) ; // forcefully delete the remaining // now safe to delete listener (and net engine) LOG_STR("Controller::~Controller connections closed") ; delete iNetEngine ; // will delete also connections opened by net engine iNetEngine = NULL ; LOG_STR("Controller::~Controller netengine deleted") ; delete iListener ; // will delete also connections received by listener iListener = NULL ; LOG_STR("Controller::~Controller listener deleted") ; delete iModel ; } iModel = NULL ; LOG_STR("Controller::~Controller datamodel") ; delete iNode ; if ( iFileMenu ) { delete iFileMenu; } if ( iExitAct ) { delete iExitAct ; } if ( iAboutAct ) { delete iAboutAct ; } if ( iPwdChangeAct ) { delete iPwdChangeAct; } if ( iProfileDeleteAct) { delete iProfileDeleteAct ; } if ( iProfileCreateAct ) { delete iProfileCreateAct ; } if ( iProfileSelectAct ) { delete iProfileSelectAct ; } if ( iDisplaySettingsAct ) { delete iDisplaySettingsAct ; } if ( iDisplayStatusAct ) { delete iDisplayStatusAct ; } if ( iDisplaySearchAct ) { delete iDisplaySearchAct ; } if ( iTclMenu ) { delete iTclMenu; } if ( iTclLibraryAct ) { delete iTclLibraryAct ; } if ( iTclConsoleAct ) { delete iTclConsoleAct ; } if ( iWin ) { delete iWin ; iWin = NULL ; } if ( iSharedMemory ) { iSharedMemory->detach() ; delete iSharedMemory ; } } void Controller::userInterfaceAction ( CAUserInterfaceRequest aRequest, const Hash& aHashConcerned , const Hash& aFetchFromNode , const QString* aAdditionalInformation ) { LOG_STR2("Controller::userInterfaceAction %d", aRequest) ; if ( aRequest == ViewProfileDetails ) { iModel->lock() ; Profile *p = iModel->profileModel().profileByFingerPrint((aHashConcerned) ) ; iModel->unlock() ; if (p) { delete (p) ; iCurrentWidget->showDetailsOfProfile(aHashConcerned) ; } else { // seems like we do not have the profile. lets put a wait-dialog // in place and profile fetch request to network.. NetworkRequestExecutor::NetworkRequestQueueItem req ; req.iRequestType =RequestForUserProfile ; req.iRequestedItem = aHashConcerned ; req.iState = NetworkRequestExecutor::NewRequest ; req.iDestinationNode = aFetchFromNode ; // may be KNullHash startRetrievingContent(req,false,UserProfile) ; userInterfaceAction ( DisplayProgressDialog, KNullHash , KNullHash ) ; } } else if ( aRequest == ViewCa ) { iModel->lock() ; CA ca = iModel->classifiedAdsModel().caByHash(aHashConcerned) ; iModel->unlock() ; if ( ca.iFingerPrint != KNullHash ) { // classified ad was found from local storage iCurrentWidget->showClassifiedAd(ca) ; } else { // classified ad was not found from local storage, begin fetch NetworkRequestExecutor::NetworkRequestQueueItem req ; req.iRequestType =RequestForClassifiedAd ; req.iRequestedItem = aHashConcerned ; req.iState = NetworkRequestExecutor::NewRequest ; req.iDestinationNode = aFetchFromNode ; // may be KNullHash startRetrievingContent(req,false,ClassifiedAd) ; userInterfaceAction ( DisplayProgressDialog, KNullHash , KNullHash ) ; } } else if ( aRequest == ViewProfileComment ) { // ok, profile comment is tricky to display because it // is two-stage process. first state is finding the // profile, that may or may not be locally stored. // after profile is found and displayed, we may // continue with the comment itself, that again // may or may not be found. // // in order to know the profile, the comment is required // first. iModel->lock() ; ProfileComment* c ( iModel->profileCommentModel().profileCommentByFingerPrint(aHashConcerned) ) ; iModel->unlock() ; if ( c ) { // see if we have the profile too: iModel->lock() ; Profile *p ( iModel->profileModel().profileByFingerPrint(c->iProfileFingerPrint, true, /* emit */ true /* no image */ ) ) ; iModel->unlock() ; if ( p ) { delete p ; p = NULL ; iCurrentWidget->showDetailsOfProfile(c->iProfileFingerPrint) ; iCurrentWidget->showSingleCommentOfProfile(aHashConcerned) ; } else { // seems like we do not have the profile. lets put a wait-dialog // in place and profile fetch request to network.. NetworkRequestExecutor::NetworkRequestQueueItem req ; req.iRequestType = RequestForUserProfile ; req.iRequestedItem = c->iProfileFingerPrint ; req.iState = NetworkRequestExecutor::NewRequest ; req.iDestinationNode = aFetchFromNode ; // may be KNullHash startRetrievingContent(req,false,UserProfile) ; iHashOfProfileCommentBeingWaitedFor = aHashConcerned ; iNodeForCommentBeingWaitedFor = aFetchFromNode ; userInterfaceAction ( DisplayProgressDialog, KNullHash , KNullHash ) ; } delete c ; } else { // comment was not found, begin fetch for that: NetworkRequestExecutor::NetworkRequestQueueItem req ; req.iRequestType = RequestForProfileComment ; req.iRequestedItem = aHashConcerned ; req.iState = NetworkRequestExecutor::NewRequest ; req.iDestinationNode = aFetchFromNode ; // may be KNullHash startRetrievingContent(req,false,UserProfileComment) ; userInterfaceAction ( DisplayProgressDialog, KNullHash , KNullHash ) ; } } else if ( aRequest == DisplayProgressDialog ) { QProgressDialog* waitDialog = new QProgressDialog(iCurrentWidget) ; waitDialog->setLabelText ( tr("Fetching item from network..") ); waitDialog->setMaximum(0) ; waitDialog->setMinimum(0) ; connect(this,SIGNAL(waitDialogToBeDismissed()), waitDialog,SLOT(reject())) ; waitDialog->exec() ; } else if ( aRequest == VoiceCallToNode && iNode != NULL ) { QLOG_STR("Voice call request to node " + aHashConcerned.toString() ) ; // here let voice call engine handle all the logic: if ( !iVoiceCallEngine ) { this->voiceCallEngine() ; // has side effect of instantiating one } VoiceCall callData; callData.iCallId = rand() ; callData.iTimeOfCallAttempt = QDateTime::currentDateTimeUtc().toTime_t() ; callData.iOkToProceed = true ; quint32 dummyTimeStamp ; iModel->lock() ; QLOG_STR("unlock " + QString(__FILE__) + " "+ QString::number(__LINE__)); iModel->contentEncryptionModel().PublicKey(iProfileHash, callData.iOriginatingOperatorKey, &dummyTimeStamp) ; callData.iOriginatingNode = iNode->nodeFingerPrint() ; callData.iDestinationNode = iModel->nodeModel().nodeByHash(aHashConcerned)->nodeFingerPrint(); if ( aAdditionalInformation ) { callData.iPeerOperatorNick = *aAdditionalInformation ; QLOG_STR("Peer nick was set to " + callData.iPeerOperatorNick ) ; } iVoiceCallEngine->insertCallStatusData(callData, iNode->nodeFingerPrint() ) ; iModel->unlock() ; QLOG_STR("unlock " + QString(__FILE__) + " "+ QString::number(__LINE__)); callData.iOriginatingNode = KNullHash ; // or it gets deleted // calldata destructor will delete callData.iDestinationNode } else { LOG_STR2("Unhandled user interface request %d", aRequest) ; } LOG_STR2("Controller::userInterfaceAction out %d", aRequest) ; } void Controller::hideUI() { if ( iWin ) { iWin->hide() ; } } void Controller::showUI() { if ( iWin ) { iWin->show() ; } } void Controller::createMenus() { // first "file" menu: iExitAct = new QAction(tr("E&xit"), this); iExitAct->setShortcuts(QKeySequence::Quit); iExitAct->setStatusTip(tr("Exit the application")); iAboutAct = new QAction(tr("&About"), this); iAboutAct->setStatusTip(tr("Show the application's About box")); iPwdChangeAct = new QAction(tr("&Change password"), this); iPwdChangeAct->setStatusTip(tr("Change password of current profile")); iProfileCreateAct = new QAction(tr("Create &new profile"), this); iProfileCreateAct->setStatusTip(tr("Makes a brand new user profile")); iProfileDeleteAct = new QAction(tr("&Delete current profile"), this); iProfileDeleteAct->setStatusTip(tr("Deletes currently open profile")); iProfileSelectAct = new QAction(tr("&Select another profile"), this); iProfileSelectAct->setStatusTip(tr("If you have multitude of profiles")); iDisplaySettingsAct = new QAction(tr("Settings.."), this); iDisplaySettingsAct->setStatusTip(tr("Node-wide settings..")); iDisplayStatusAct = new QAction(tr("Network status.."), this); iDisplaySearchAct = new QAction(tr("Search.."), this); connect(iAboutAct, SIGNAL(triggered()), this, SLOT(displayAboutBox())); connect(iExitAct, SIGNAL(triggered()), this, SLOT(exitApp())); connect(iPwdChangeAct, SIGNAL(triggered()), this, SLOT(changeProfilePasswd())); connect(iProfileCreateAct, SIGNAL(triggered()), this, SLOT(createProfile())); connect(iProfileDeleteAct, SIGNAL(triggered()), this, SLOT(deleteProfile())); connect(iProfileSelectAct, SIGNAL(triggered()), this, SLOT(selectProfile())); connect(iDisplaySettingsAct, SIGNAL(triggered()), this, SLOT(displaySettings())); connect(iDisplayStatusAct, SIGNAL(triggered()), this, SLOT(displayStatus())); connect(iDisplaySearchAct, SIGNAL(triggered()), this, SLOT(displaySearch())); iFileMenu = iWin->menuBar()->addMenu(tr("&File")); iFileMenu->addAction(iAboutAct); iFileMenu->addAction(iPwdChangeAct); iFileMenu->addAction(iProfileCreateAct); iFileMenu->addAction(iProfileDeleteAct); iFileMenu->addAction(iProfileSelectAct); iFileMenu->addAction(iDisplaySettingsAct) ; iFileMenu->addAction(iDisplayStatusAct) ; iFileMenu->addAction(iDisplaySearchAct) ; iPwdChangeAct->setDisabled(true) ; // enable when profile is open iProfileDeleteAct->setDisabled(true) ; // enable when profile is open iFileMenu->addAction(iExitAct); // menu-items related to TCL interpreter iTclMenu = iWin->menuBar()->addMenu(tr("&TCL Programs")); iTclLibraryAct = new QAction(tr("&Local library"), this); iTclLibraryAct->setStatusTip(tr("Locally stored TCL programs")); connect(iTclLibraryAct, SIGNAL(triggered()), this, SLOT(displayTclProgs())); iTclMenu->addAction(iTclLibraryAct) ; iTclConsoleAct = new QAction(tr("TCL &Console"), this); iTclConsoleAct->setStatusTip(tr("Display interpreter console")); connect(iTclConsoleAct, SIGNAL(triggered()), this, SLOT(displayTclConsole())); iTclMenu->addAction(iTclConsoleAct) ; } void Controller::exitApp() { LOG_STR("Controller::exitApp") ; if ( iCurrentWidget && iLayout ) { iLayout->removeWidget(iCurrentWidget) ; delete iCurrentWidget ; } // iLayout is owned by iCurrentWidget so it should be // deleted there. if ( iWin ) { iWin->close() ; } } void Controller::displayAboutBox() { if ( iWin ) { const QString dlgName ("classified_ads_about_dialog") ; AboutDialog *dialog = iWin->findChild(dlgName) ; if ( dialog == NULL ) { dialog = new AboutDialog(iWin, *this) ; dialog->setObjectName(dlgName) ; dialog->show() ; } else { dialog->setFocus(Qt::MenuBarFocusReason) ; } } } void Controller::changeProfilePasswd() { if ( iWin) { // the last false tells dialog to behave in change-mode instead // of query-mode PasswdDialog *pwd_dialog = new PasswdDialog(iWin, *this,tr("Enter new password:"),false) ; connect(pwd_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), this, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; pwd_dialog->show() ; } LOG_STR("Controller::changeProfilePasswd out") ; } // Initiates UI sequence for new profile void Controller::createProfile() { LOG_STR("createProfile in") ; iModel->lock() ; setProfileInUse(iModel->contentEncryptionModel().generateKeyPair()) ; iModel->unlock() ; if ( iProfileHash != KNullHash ) { changeProfilePasswd() ; } LOG_STR("createProfile in") ; } // Initiates UI sequence for selecting a profile void Controller::selectProfile() { LOG_STR("selectProfile in") ; PasswdDialog *pwd_dialog = new PasswdDialog(iWin, *this,tr("Activate another profile with password")) ; connect(pwd_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), this, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; pwd_dialog->show() ; LOG_STR("selectProfile in") ; } void Controller::displaySettings() { LOG_STR("Controller::displaySettings") ; const QString dlgName ("classified_ads_settings_dialog") ; SettingsDialog *dialog = iWin->findChild(dlgName) ; if ( dialog == NULL ) { dialog = new SettingsDialog(iWin, *this) ; dialog->setObjectName(dlgName) ; connect(dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), this, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; dialog->show() ; } else { dialog->setFocus(Qt::MenuBarFocusReason) ; } } void Controller::displayStatus() { LOG_STR("Controller::displayStatus") ; const QString dlgName ("classified_ads_status_dialog") ; StatusDialog *dialog = iWin->findChild(dlgName) ; if ( dialog == NULL ) { dialog = new StatusDialog(iWin, *this) ; dialog->setObjectName(dlgName) ; connect(dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), this, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; dialog->show() ; } else { dialog->setFocus(Qt::MenuBarFocusReason) ; } } void Controller::displaySearch() { LOG_STR("Controller::displaySearch") ; const QString dlgName ("classified_ads_search_dialog") ; SearchDisplay *dialog = iWin->findChild(dlgName) ; if ( dialog == NULL && iCurrentWidget->selectedProfile()) { dialog = new SearchDisplay(iCurrentWidget, this, iModel->searchModel(), *(iCurrentWidget->selectedProfile())) ; dialog->setObjectName(dlgName) ; connect(dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), this, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; // pointer of current profile is inside dialog -> if that // changes, close the dialog ; user needs to re-open search // dialog if she switches profile in use assert(connect(this, SIGNAL(userProfileSelected(const Hash&)), dialog, SLOT(deleteLater()), Qt::QueuedConnection) ) ; dialog->show() ; } else { dialog->setFocus(Qt::MenuBarFocusReason) ; } } /** Slot for displaying TCL library */ void Controller::displayTclProgs() { QLOG_STR("Controller::displayTclProgs") ; const QString dlgName ("classified_ads_tclprogs_dialog") ; TclProgramsDialog *dialog = iWin->findChild(dlgName) ; if ( dialog == NULL ) { dialog = new TclProgramsDialog(iWin, *this) ; dialog->setObjectName(dlgName) ; connect(dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), this, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; dialog->show() ; // also connect tcl eval signal from dialog to wrapper tclWrapper() ;// ensure there is interpreter inside wrapper if ( iTclWrapper ) { connect(dialog, SIGNAL(evalScript(QString,QString*)), iTclWrapper, SLOT(evalScript(QString,QString*)), Qt::QueuedConnection) ; connect(iTclWrapper, SIGNAL(started()), dialog, SLOT(tclProgramStarted()), Qt::QueuedConnection) ; connect(iTclWrapper, SIGNAL(finished()), dialog, SLOT(tclProgramStopped()), Qt::QueuedConnection) ; #if QT_VERSION < 0x050000 // qt5 has no terminated signal in QThread // but if on older qt connect that anyway connect(iTclWrapper, SIGNAL(terminated()), dialog, SLOT(tclProgramStopped()), Qt::QueuedConnection) ; #endif if ( iTclWrapper->isRunning() ) { dialog->tclProgramStarted() ; } } } else { dialog->setFocus(Qt::MenuBarFocusReason) ; } } /** Slot for displaying TCL console */ void Controller::displayTclConsole() { QLOG_STR("Controller::displayTclConsole") ; tclWrapper().showConsole() ; } // Initiates UI sequence for deleting profile void Controller::deleteProfile() { LOG_STR("deleteProfile in") ; QMessageBox msgBox; iModel->lock() ; int numberOfPrivateKeys = iModel->contentEncryptionModel().listKeys(true,NULL).size() ; iModel->unlock() ; if ( numberOfPrivateKeys < 2 ) { msgBox.setText(tr("Can't delete only profile.")); msgBox.setStandardButtons( QMessageBox::Ok ); msgBox.exec(); } else { msgBox.setText(tr("Permanently discard profile?")); msgBox.setInformativeText(tr("There will be NO way to access content of this profile later")); msgBox.setStandardButtons( QMessageBox::Ok | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); int ret = msgBox.exec(); if ( ret == QMessageBox::Ok ) { LOG_STR("delete profile..") ; iModel->lock() ; bool deletiaResult = iModel->contentEncryptionModel().deleteKeyPair(iProfileHash) ; iModel->unlock() ; if ( deletiaResult ) { PasswdDialog *pwd_dialog = new PasswdDialog(iWin, *this,tr("Activate another profile with password")) ; connect(pwd_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), this, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; pwd_dialog->show() ; } } else { LOG_STR("user is unsure") ; } } } void Controller::displayFront() { LOG_STR("displayFront") ; if ( iCurrentWidget ) { iLayout->removeWidget(iCurrentWidget) ; delete iCurrentWidget ; } iLayout->addWidget(iCurrentWidget = new FrontWidget(this,*iWin)) ; connect(iCurrentWidget, SIGNAL( error(MController::CAErrorSituation, const QString&) ), this, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; // // important: // connection is queued. in practice this signal is emitted at // situation where datamodel is locked. // UI in question will immediately try to obtain lock to datamodel // so we would end up in deadlock situation. Use queued signal // here so call stack of the caller is left to collapse // until this signal is delivered // assert(connect(this, SIGNAL(userProfileSelected(const Hash&)), iCurrentWidget, SLOT(userProfileSelected(const Hash&)), Qt::QueuedConnection) ) ; LOG_STR("displayFront out") ; } void Controller::handleError(MController::CAErrorSituation aError, const QString& aExplanation) { LOG_STR2("Error enum value %d", aError) ; QLOG_STR(aExplanation) ; switch ( aError ) { case OwnCertNotFound: QMessageBox::about(iWin,tr("Cant load node cert or key cert"), aExplanation); LOG_STR("Cant load node cert or key cert") ; break ; case FileOperationError: // type of non-fatal error QMessageBox::about(iWin,tr("File error"), aExplanation); LOG_STR("File error " + aExplanation ) ; break ; case DataBaseNotMountable: QMessageBox::about(iWin,tr("Database error"), aExplanation); LOG_STR("Can't open DB") ; QApplication::quit() ; break ; case ContentEncryptionError : QMessageBox::about(iWin,tr("Cryptographic module"), aExplanation); QLOG_STR("ContentEncryptionError " + aExplanation ) ; break ; case DbTransactionError : QMessageBox::about(iWin,tr("Database module"), aExplanation); QLOG_STR("DbTransactionError " + aExplanation ) ; break ; case BadPassword : QMessageBox::about(iWin,tr("Cryptographic module"), tr("Bad password")); QLOG_STR("DbTransactionError " + aExplanation ) ; break ; case TCLEvalError : QMessageBox::about(iWin,tr("TCL Interpreter"), aExplanation); QLOG_STR("DbTransactionError " + aExplanation ) ; break ; } } Node& Controller::getNode() const { return *iNode ; } NetworkListener *Controller::networkListener() const { return iListener ; } Model& Controller::model() const { return *iModel ; } int Controller::createPidFile() { int retval = -1 ; #ifndef WIN32 QString path(QDir::home().path()); path.append(QDir::separator()).append(".classified_ads"); path.append(QDir::separator()).append("instance.pid") ; bool ok = false ; if (QFile(path).exists()) { QFile f(path) ; f.open(QIODevice::ReadOnly) ; QByteArray arr = f.readAll() ; QLatin1String content8bit(arr); QString content (content8bit) ; retval = content.toInt(&ok, 10) ; } if (!ok ) { QFile f(path) ; f.open(QIODevice::WriteOnly) ; QString content = QString::number(getpid()); QByteArray contentBytes(content.toLatin1()) ; f.write(contentBytes) ; f.close() ; retval = -1 ; } #endif return retval ; } void Controller::deletePidFile() { #ifndef WIN32 QString path(QDir::home().path()); path.append(QDir::separator()).append(".classified_ads"); path.append(QDir::separator()).append("instance.pid") ; QFile(path).remove() ; #endif } void Controller::setContentKeyPasswd(QString aPasswd) { iContentKeyPasswd = aPasswd ; } QString Controller::contentKeyPasswd() const { return iContentKeyPasswd ; } void Controller::setProfileInUse(const Hash& aProfileHash) { if ( iProfileHash != KNullHash ) { storePrivateDataOfSelectedProfile() ; } iProfileHash = aProfileHash ; iPwdChangeAct->setDisabled(false) ; int numberOfPrivateKeys = iModel->contentEncryptionModel().listKeys(true,NULL).size() ; if ( numberOfPrivateKeys > 1 ) { iProfileDeleteAct->setDisabled(false) ; iProfileSelectAct->setDisabled(false) ; } else { iProfileDeleteAct->setDisabled(true) ; iProfileSelectAct->setDisabled(true) ; } reStorePrivateDataOfSelectedProfile() ; emit userProfileSelected(iProfileHash) ; // must be Qt::QueuedConnection } const Hash& Controller::profileInUse() { return iProfileHash ; } // signal of received content void Controller::notifyOfContentReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfReceivedContent) { LOG_STR2("Controller::notifyOfContentReceived type : %d", aTypeOfReceivedContent); if ( iCurrentWidget ) { iCurrentWidget->receiveNotifyOfContentReceived( aHashOfContent, aTypeOfReceivedContent) ; if ( aHashOfContent == iHashOfObjectBeingWaitedFor && aTypeOfReceivedContent == iTypeOfObjectBeingWaitedFor ) { emit waitDialogToBeDismissed() ; iHashOfObjectBeingWaitedFor= KNullHash ; // do not wait any more if ( aTypeOfReceivedContent == UserProfile ) { iCurrentWidget->showDetailsOfProfile(aHashOfContent) ; if ( iHashOfProfileCommentBeingWaitedFor != KNullHash ) { // stage 2: we were waiting for profile but actually // user wanted to see an ad: as we now have the profile, // lets ask for comment too // // lets check if we have the comment: ProfileComment* c ( iModel->profileCommentModel().profileCommentByFingerPrint(iHashOfProfileCommentBeingWaitedFor) ) ; if ( c == NULL ) { NetworkRequestExecutor::NetworkRequestQueueItem req ; req.iRequestType = RequestForProfileComment ; req.iRequestedItem = iHashOfProfileCommentBeingWaitedFor ; iHashOfProfileCommentBeingWaitedFor = KNullHash ; req.iState = NetworkRequestExecutor::NewRequest ; req.iDestinationNode = iNodeForCommentBeingWaitedFor ; iNodeForCommentBeingWaitedFor = KNullHash ; startRetrievingContent(req,false,UserProfileComment) ; userInterfaceAction ( DisplayProgressDialog, KNullHash , KNullHash ) ; } else { iCurrentWidget->showSingleCommentOfProfile(iHashOfProfileCommentBeingWaitedFor) ; delete c ; iHashOfProfileCommentBeingWaitedFor = KNullHash ; } } } else if ( aTypeOfReceivedContent == ClassifiedAd ) { iModel->lock() ; CA ca = iModel->classifiedAdsModel().caByHash(aHashOfContent) ; iModel->unlock() ; if ( ca.iFingerPrint != KNullHash ) { iCurrentWidget->showClassifiedAd(ca) ; } } else if ( aTypeOfReceivedContent == BinaryBlob ) { iCurrentWidget->openBinaryFile(aHashOfContent,false) ; } } } iRetrievalEngine->notifyOfContentReceived(aHashOfContent, aTypeOfReceivedContent) ; // offer db records to db retrieval engine if ( aTypeOfReceivedContent == DbRecord ) { iDbRetrievalEngine->notifyOfContentReceived(aHashOfContent, aTypeOfReceivedContent) ; } // offer profiles to trust list if ( aTypeOfReceivedContent == UserProfile ) { iModel->trustTreeModel()->contentReceived(aHashOfContent, aTypeOfReceivedContent) ; } if ( iTclWrapper ) { iTclWrapper->notifyOfContentReceived(aHashOfContent, aTypeOfReceivedContent) ; } } void Controller::notifyOfContentReceived(const Hash& aHashOfContent, const Hash& aHashOfClassification, const ProtocolItemType aTypeOfReceivedContent) { LOG_STR2("Controller::notifyOfContentReceived v2 type : %d", aTypeOfReceivedContent); if ( iCurrentWidget ) { iCurrentWidget->receiveNotifyOfContentReceived( aHashOfContent, aHashOfClassification, aTypeOfReceivedContent) ; if ( aHashOfContent == iHashOfObjectBeingWaitedFor && aTypeOfReceivedContent == iTypeOfObjectBeingWaitedFor ) { emit waitDialogToBeDismissed() ; iHashOfObjectBeingWaitedFor= KNullHash ; // do not wait any more if ( aTypeOfReceivedContent == UserProfile ) { iCurrentWidget->showDetailsOfProfile(aHashOfContent) ; if ( iHashOfProfileCommentBeingWaitedFor != KNullHash ) { ProfileComment* c ( iModel->profileCommentModel().profileCommentByFingerPrint(iHashOfProfileCommentBeingWaitedFor) ) ; if ( c ) { // we were waiting for profile but actually want to // to display one comment from that profile. we now // have the profile+comment iCurrentWidget->showSingleCommentOfProfile(iHashOfProfileCommentBeingWaitedFor) ; iHashOfProfileCommentBeingWaitedFor = KNullHash ; delete c ; } else { // stage 2: we were waiting for profile but actually // user wanted to see an ad: as we now have the profile, // lets ask for comment too NetworkRequestExecutor::NetworkRequestQueueItem req ; req.iRequestType = RequestForProfileComment ; req.iRequestedItem = iHashOfProfileCommentBeingWaitedFor ; iHashOfProfileCommentBeingWaitedFor = KNullHash ; req.iState = NetworkRequestExecutor::NewRequest ; req.iDestinationNode = iNodeForCommentBeingWaitedFor ; iNodeForCommentBeingWaitedFor = KNullHash ; startRetrievingContent(req,false,UserProfileComment) ; userInterfaceAction ( DisplayProgressDialog, KNullHash , KNullHash ) ; } } } else if ( aTypeOfReceivedContent == ClassifiedAd ) { iModel->lock() ; CA ca = iModel->classifiedAdsModel().caByHash(aHashOfContent) ; iModel->unlock() ; if ( ca.iFingerPrint != KNullHash ) { iCurrentWidget->showClassifiedAd(ca) ; } } } } iRetrievalEngine->notifyOfContentReceived(aHashOfContent, aTypeOfReceivedContent) ; iDbRetrievalEngine->notifyOfContentReceived(aHashOfContent, aTypeOfReceivedContent) ; if ( iTclWrapper ) { iTclWrapper->notifyOfContentReceived(aHashOfContent, aTypeOfReceivedContent) ; } } void Controller::notifyOfContentNotReceived(const Hash& aHashOfContent, const ProtocolItemType #ifdef DEBUG aTypeOfNotReceivdContent // needed only in debug build #else /* aTypeOfNotReceivdContent */ #endif ) { LOG_STR2("Controller::notifyOfContentNotReceived type : %d", aTypeOfNotReceivdContent); if ( iHashOfObjectBeingWaitedFor == aHashOfContent ) { iHashOfObjectBeingWaitedFor= KNullHash ; iHashOfProfileCommentBeingWaitedFor = KNullHash ; emit waitDialogToBeDismissed() ; QErrorMessage* errorDialog = new QErrorMessage(iCurrentWidget) ; errorDialog->showMessage ( tr("Could not find item from network..") ); } } void Controller::startRetrievingContent(NetworkRequestExecutor::NetworkRequestQueueItem aReq, bool aIsBackgroundDl, ProtocolItemType aTypeOfExpectedObject) { // here queue the item into retrieval-engine iRetrievalEngine->startRetrieving(aReq, aIsBackgroundDl) ; iHashOfObjectBeingWaitedFor = aReq.iRequestedItem ; iTypeOfObjectBeingWaitedFor = aTypeOfExpectedObject ; } void Controller::startRetrievingContent( CaDbRecord::SearchTerms aSearchTerms ) { if ( iDbRetrievalEngine ) { iDbRetrievalEngine->startRetrieving(aSearchTerms) ; } } void Controller::storePrivateDataOfSelectedProfile(bool aPublishTrustListToo) { if ( iProfileHash!= KNullHash ) { QMap m ; m.insert(KPrivateDataContactsSection, iCurrentWidget->contactDataOfSelectedProfile()) ; if ( iHashDisplaynameMapping.size() > 0 ) { QMap cache ; QMapIterator i(iHashDisplaynameMapping); while (i.hasNext()) { i.next(); cache.insert(i.value(), i.key().toQVariant()) ; } m.insert(KPrivateDataContactsCache, cache) ; } m.insert(KPrivateDataTrustTree, iModel->trustTreeModel()->trustTreeSettings()) ; iModel->profileModel().setPrivateDataForProfile(iProfileHash, QVariant(m)) ; if ( iCurrentWidget->selectedProfile() ) { iCurrentWidget->selectedProfile()->iTrustList.clear() ; iCurrentWidget->selectedProfile()->iTrustList.append(iCurrentWidget->trustListOfSelectedProfile()) ; if ( aPublishTrustListToo ) { iCurrentWidget->selectedProfile()->iTimeOfPublish = QDateTime::currentDateTimeUtc().toTime_t() ; iModel->profileModel().publishProfile(*(iCurrentWidget->selectedProfile())); } } } else { LOG_STR("No selected profile while storePrivateDataOfSelectedProfile") ; } } void Controller::reStorePrivateDataOfSelectedProfile() { if ( iProfileHash!= KNullHash ) { QMap privateData = iModel->profileModel().privateDataOfProfile(iProfileHash).toMap() ; if (privateData.contains(KPrivateDataContactsSection)) { QVariantList listOfContacts (privateData[KPrivateDataContactsSection].toList()) ; iCurrentWidget->setContactDataOfSelectedProfile(listOfContacts) ; } if (privateData.contains(KPrivateDataTrustTree)) { iModel->trustTreeModel()->initModel(privateData[KPrivateDataTrustTree]) ; } else { iModel->trustTreeModel()->initModel(QVariant()) ; } iHashDisplaynameMapping.clear() ; if (privateData.contains(KPrivateDataContactsCache)) { QVariantMap contactsCache (privateData[KPrivateDataContactsCache].toMap()) ; QMapIterator i(contactsCache); while (i.hasNext()) { i.next(); Hash profileKey ; profileKey.fromQVariant(i.value()) ; QLOG_STR("Inserting into iHashDisplaynameMapping key = " + profileKey.toString() + " name " + i.key()) ; if ( profileKey.toString() != i.key() ) { iHashDisplaynameMapping.insert(profileKey,i.key() ) ; // not how i.key() is profile name. this is // because in QVariantMap the key is hard-coded to be a QString } else { QLOG_STR("..Or not, because name was profile hash") ; } } } } } bool Controller::isContactInContactList(const Hash& aFingerPrint) const { return iCurrentWidget->isContactInContactList(aFingerPrint) ; } QString Controller::displayableNameForProfile(const Hash& aProfileFingerPrint) const { return iHashDisplaynameMapping.value(aProfileFingerPrint, aProfileFingerPrint.toString()) ; } void Controller::offerDisplayNameForProfile(const Hash& aProfileFingerPrint, const QString& aDisplayName, const bool aStoreInPersistenStorage) { if ( aProfileFingerPrint.toString() != aDisplayName ) { if (aDisplayName.length() > 0 && ( ! iHashDisplaynameMapping.contains(aProfileFingerPrint )) ) { iHashDisplaynameMapping.insert(aProfileFingerPrint, aDisplayName) ; if ( aStoreInPersistenStorage ) { storePrivateDataOfSelectedProfile() ; } } else if ( iHashDisplaynameMapping.contains(aProfileFingerPrint ) && aDisplayName.length() > 0 ) { QString& contentAsDescriptor ( iHashDisplaynameMapping[aProfileFingerPrint] ) ; contentAsDescriptor = aDisplayName ; } } else { QLOG_STR("Offered display name was profile hash -> discarding") ; } } void Controller::displayFileInfoOnUi(const BinaryFile& aFileMetadata) { QMessageBox infoMessage ; QStringList info ; info.append(tr("SHA1: ")) ; info.append(aFileMetadata.iFingerPrint.toString()) ; info.append("\n") ; if ( aFileMetadata.iMimeType.length() > 0 ) { info.append(tr("Mime-Type: ")) ; info.append(aFileMetadata.iMimeType) ; info.append("\n") ; } if ( aFileMetadata.iDescription.length() > 0 ) { info.append(tr("Description: ")) ; info.append(aFileMetadata.iDescription) ; info.append("\n") ; } if ( aFileMetadata.iOwner.length() > 0 ) { info.append(tr("Publisher: ")) ; info.append(aFileMetadata.iOwner) ; info.append("\n") ; } if ( aFileMetadata.iContentOwner.length() > 0 ) { info.append(tr("Content owner: ")) ; info.append(aFileMetadata.iContentOwner) ; info.append("\n") ; } if ( aFileMetadata.iLicense.length() > 0 ) { info.append(tr("License: ")) ; info.append(aFileMetadata.iLicense) ; info.append("\n") ; } if ( aFileMetadata.iFileName.length() > 0 ) { info.append(tr("Name: ")) ; info.append(aFileMetadata.iFileName) ; info.append("\n") ; } QDateTime d ; d.setTime_t(aFileMetadata.iTimeOfPublish) ; info.append(tr("Date: ")) ; info.append(d.toString(Qt::SystemLocaleShortDate)) ; info.append("\n") ; infoMessage.setText(info.join("")) ; infoMessage.setStandardButtons( QMessageBox::Ok ); infoMessage.exec() ; } void Controller::sendProfileUpdateQuery(const Hash& aProfileFingerPrint, const Hash& aProfileNodeFingerPrint ) { NetworkRequestExecutor::NetworkRequestQueueItem req ; req.iRequestType = RequestForProfilePoll ; req.iRequestedItem = aProfileFingerPrint ; req.iState = NetworkRequestExecutor::NewRequest ; req.iDestinationNode = aProfileNodeFingerPrint ; // try to get time of last poll.. iModel->lock() ; req.iTimeStampOfItem = iModel->profileModel().getLastProfileUpdateTime (aProfileFingerPrint) ; iModel->addNetworkRequest(req) ; iModel->unlock() ; } VoiceCallEngine* Controller::voiceCallEngine() { if ( !iVoiceCallEngine && iInsideDestructor == false ) { iVoiceCallEngine = new VoiceCallEngine(*this, *iModel) ; assert( connect(iVoiceCallEngine, SIGNAL( callStateChanged(quint32, VoiceCallEngine::CallState) ), iCurrentWidget, SLOT( callStateChanged(quint32, VoiceCallEngine::CallState) ), Qt::QueuedConnection ) ) ; assert( connect(iListener, SIGNAL( nodeConnectionAttemptStatus(Connection::ConnectionState , const Hash ) ), iVoiceCallEngine, SLOT( nodeConnectionAttemptStatus(Connection::ConnectionState , const Hash )), Qt::QueuedConnection ) ) ; } return iVoiceCallEngine ; } MVoiceCallEngine* Controller::voiceCallEngineInterface() { return this->voiceCallEngine() ; } void Controller::addObjectToOpen(QUrl aClassifiedAdsObject) { iObjectToOpen = aClassifiedAdsObject ; } void Controller::checkForObjectToOpen(const Hash& /* aIgnored */) { if ( iObjectToOpen.scheme().length() > 0 && iCurrentWidget ) { iCurrentWidget->linkActivated(iObjectToOpen.toString()) ; } iObjectToOpen.setScheme("") ; } void Controller::checkForSharedMemoryContents() { if ( iSharedMemory ) { iSharedMemory->lock(); } if (iSharedMemory && iSharedMemory->constData() != NULL && iSharedMemory->size() >= 1024 ) { QString urlStr ( QString::fromUtf8 ( reinterpret_cast(iSharedMemory->constData()) ) ) ; QLOG_STR("checkForSharedMemoryContents content = " + urlStr) ; QUrl url (urlStr) ; if ( url.scheme() == "caprofile" || url.scheme() == "caad" || url.scheme() == "cacomment" || url.scheme() == "cablob" ) { if ( iProfileHash == KNullHash ) { // there is no profile in use addObjectToOpen(url) ; // <- goes into wait list } else { iObjectToOpen = url ; emit userProfileSelected(iProfileHash) ; } } } else { QLOG_STR("checkForSharedMemoryContents foud no content") ; } if ( iSharedMemory ) { iSharedMemory->unlock(); } } #ifdef WIN32 // WIN32 IPC callback void Controller::newInstanceConnected() { QLOG_STR("Controller::newInstanceConnected ") ; QLocalSocket *clientConnection = iLocalServer->nextPendingConnection(); if ( clientConnection ) { connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater())); clientConnection->flush(); clientConnection->disconnectFromServer(); } checkForSharedMemoryContents() ; if ( iCurrentWidget ) { iCurrentWidget->activateWindow() ; } } #endif TclWrapper & Controller::tclWrapper() { if ( iTclWrapper == NULL ) { QLOG_STR("Controller::tclWrapper instantiates new") ; iTclWrapper = new TclWrapper(*iModel,*this) ; connect(iTclWrapper, SIGNAL(error(MController::CAErrorSituation, const QString&) ), this, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; if ( iDbRetrievalEngine ) { assert( connect(iTclWrapper, SIGNAL(finished()), iDbRetrievalEngine, SLOT(stopRetrieving()), Qt::QueuedConnection )) ; } else { QLOG_STR("TCL Wrapper instantiated by retrieval engine missing?"); } } return *iTclWrapper ; } QWidget* Controller::frontWidget() { return iCurrentWidget ; } QString Controller::getFileName(bool& aSuccess, bool aIsSaveFile , QString aSuggestedFileName ) { if ( iGetFileNameDialog || iGetFileNameSemaphore.available() == 0 ) { aSuccess = false ; return QString::null ; } iGetFileNameResult = QString::null ; iGetFileNameSuccess = false ; // lock mutex once QLOG_STR("iGetFileNameMutex.acquire") ; iGetFileNameSemaphore.acquire(1) ; // go to UI thread: QLOG_STR("emit getFileNameSignal") ; emit startGettingFileName(aSuggestedFileName, aIsSaveFile) ; // stop here until UI thread calls iGetFileNameMutex.release QLOG_STR("iGetFileNameMutex.acquire 2") ; iGetFileNameSemaphore.acquire(1) ; QLOG_STR("iGetFileNameMutex.release") ; iGetFileNameSemaphore.release(1) ; aSuccess = iGetFileNameSuccess ; return iGetFileNameResult ; } // this will be executed in UI thread, called from getFileName // method via queued connection void Controller::getFileNameSlot(QString aSuggestedFileName,bool aIsSaveFile) { QLOG_STR("getFileNameSlot in") ; if ( ( iGetFileNameDialog = new QFileDialog() ) != NULL ) { if ( aIsSaveFile ) { iGetFileNameDialog->setFileMode(QFileDialog::AnyFile); iGetFileNameDialog->setAcceptMode(QFileDialog::AcceptSave) ; } else { iGetFileNameDialog->setFileMode(QFileDialog::ExistingFile); iGetFileNameDialog->setAcceptMode(QFileDialog::AcceptOpen) ; } if ( aSuggestedFileName.length() > 0 ) { iGetFileNameDialog->setNameFilter(aSuggestedFileName); } QStringList fileNames; if (iGetFileNameDialog->exec() && iGetFileNameDialog ) fileNames = iGetFileNameDialog->selectedFiles(); if ( fileNames.count() > 0 ) { iGetFileNameResult = fileNames.at(0) ; iGetFileNameSuccess = true ; } delete iGetFileNameDialog ; } iGetFileNameDialog = NULL ; iGetFileNameSemaphore.release(1) ; QLOG_STR("getFileNameSlot out") ; } classified-ads-0.13/controller.h000066400000000000000000000464731331670245300166660ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** * @mainpage Classified ads * * Classified ads is internet communications program that works * in distributed manner, requiring and supporting no concept of * "server". Classified ads supports * - Concept of operator, that is identified by encryption key and * can contain also other data like real name that human being * operating the profile wants to publish. * - Making some data available to listed operators only, this is * done by marking a operator profile private. * - Sending and receiving * -# Public messages, that are called "classified ads" due to * classification that they carry, * -# Private messages between operators, * -# Comments regarding operators, readable by group that see * profile of the commented operator. * - Basic word-based search functions. * - Voice calls between operator nodes. * * For more information see http://katiska.org/classified-ads/. In * order to use classified ads in meaningful manner, user needs to * have the operated instance of this program to connect to some other * program instance over some network. Classified ads tries to do * that automatically but it may be necessary to ask for network address * of node operated by a friend to get connected and started. * * Classified ads is released under LGPL license. * * \copyright Antti JУЄrvinen and others 2013-2016. */ #ifndef CONTROLLER_H #define CONTROLLER_H #include #include #include #include "mcontroller.h" #include "net/protocol.h" // for ProtocolItemType #include "datamodel/netrequestexecutor.h" class FrontWidget ; class PublishingEngine ; class RetrievalEngine ; class DbRecordRetrievalEngine ; class QMainWindow ; class QMenu ; class VoiceCallEngine ; class QSharedMemory ; #ifdef WIN32 class QLocalServer ; #endif class QFileDialog ; /** * @brief Class for keeping app state. * * C of MVC-pattern is considered here. * UI events are routed * via this class and this implements scheduling of events * so that things happen in correct order. */ class Controller : public MController { Q_OBJECT public: /** * constructor. see also method @init. */ Controller(QApplication& app) ; /** * Destructor */ ~Controller() ; /** * Constructor extras. Constructor may fail but there is no way to * communicate that. Design is now so that constructor only allocates * memory and initializes member variables, this method here, @init * contains constructor logic and it may fail. * * @return true if initialization is ok */ bool init() ; /** * method that starts actions regarding content fetch from * network * @param aReq specifies the content,at least iRequestType and * iRequestedItem need to be there * @param aIsBackgroundDl is true if the retrieval may be * queued into background as a low-priority item */ virtual void startRetrievingContent(NetworkRequestExecutor::NetworkRequestQueueItem aReq, bool aIsBackgroundDl, ProtocolItemType aTypeOfExpectedObject) ; /** * Variant of "start fetch" method that starts fetch of db records. * @param aSearchTerms Database query that fetched record should * satisfy */ virtual void startRetrievingContent( CaDbRecord::SearchTerms aSearchTerms ) ; /** * From MController. * * Method for requesting different things to take place in UI. * controller mostly routes these to FrontWidget but other actions * may be in order too.. * @param aRequest users orders * @param aHashConcerned possible hash parameter ; can be * null hash if action is not about specific hash * @param aFetchFromNode possible node hash parameter ; if * concerning item is not found from local storage, * try to fetch it from given node ; is KNullHash, * then just do fetch using normal algorithm. * @param aAdditionalInformation possible explanation or other info * @return none */ virtual void userInterfaceAction ( CAUserInterfaceRequest aRequest, const Hash& aHashConcerned = KNullHash, const Hash& aFetchFromNode = KNullHash, const QString* aAdditionalInformation = NULL) ; /** * method for hiding UI */ virtual void hideUI() ; /** * method for showing UI */ virtual void showUI() ; /** * method selecting user profile in use. */ virtual void setProfileInUse(const Hash& aProfileHash) ; /** * method getting user profile in use. */ virtual const Hash& profileInUse() ; /** * method for setting passwd used to open private content encryption * rsa key. this password is stored in controller * and is then used by content-open/sign-operations when crypto lib * asks for password. */ virtual void setContentKeyPasswd(QString aPasswd) ; /** * method for getting passwd of private content keys previously set, see method * @ref Controller::setContentKeyPasswd */ virtual QString contentKeyPasswd() const ; public: // methods /** * Method for node ; this may be changed during startup-phase * but not after that */ virtual Node& getNode() const ; /** * method for network listener ; it is parent of all connections, * also the outgoing */ virtual NetworkListener *networkListener() const ; /** * method for getting datamodel */ virtual Model &model() const ; /** * method for setting an URL to open. Url is opened only * if it is of classified-ads URL scheme, currently * supported protocols are caprofile, caad, cacomment and cablob * and if URL scheme is not among those, this method does * no thing. Host part contains hash of object, other parts * are ignored. * * @param aClassifiedAdsObject object to bring visible to user */ void addObjectToOpen(QUrl aClassifiedAdsObject) ; /** * method called if old instance of this program is signaled * from new instace, calling for this instance to bring * itself to front, and, in this method, to check if * there is object mentioned in shared memory segment * that needs to be displayed */ void checkForSharedMemoryContents() ; signals: void userProfileSelected(const Hash& aProfile) ; /** used for signalling possible wait dialog about dismissal */ void waitDialogToBeDismissed() ; void startGettingFileName(QString aSuggestedFileName,bool aIsSaveFile) ; /**< signal for launching file selection dlg*/ public slots: virtual void exitApp() ; /**< quitting */ virtual void displayAboutBox() ; /**< bragging */ virtual void displayFront() ; /**< this initializes the "normal" display */ virtual void changeProfilePasswd() ; /**< name says it all. initiates UI sequence */ virtual void createProfile() ; /**< Initiates UI sequence for new profile*/ virtual void deleteProfile() ; /**< Initiates UI sequence for deleting profile*/ virtual void selectProfile() ; /**< Initiates UI sequence for selecting profile*/ virtual void displaySettings() ; /**< Slot for displaying node settings */ virtual void displayStatus() ; /**< Slot for displaying network status */ virtual void displaySearch() ; /**< Slot for displaying search dialog */ /* tcl-related UI slots */ virtual void displayTclProgs() ; /**< Slot for displaying TCL library */ virtual void displayTclConsole() ; /**< Slot for displaying TCL console */ /** * Method for handling errors inside application. * @param aError Reason for error call, from error enum above * @param aExplanation NULL or human-readable description about what went * wrong. */ virtual void handleError(MController::CAErrorSituation aError, const QString& aExplanation) ; /** * This is receiving slot of signals sent from actual content handlers ; * when we receive new content, this method is hit, reason for this * is that we may be waiting for specific content somewhere * @param aHashOfContent item that was requested * @param aTypeOfReceivedContent item type requested */ void notifyOfContentReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfReceivedContent ); /** * This is receiving slot of signals sent from actual content handlers ; * when we receive new content, this method is hit, reason for this * is that we may be waiting for specific content somewhere. * This overload is mostly hit by classified ads. * * @param aHashOfContent item that was requested * @param aHashOfClassification of item that was requested * @param aTypeOfReceivedContent item type requested */ void notifyOfContentReceived(const Hash& aHashOfContent, const Hash& aHashOfClassification, const ProtocolItemType aTypeOfReceivedContent ); /** * This is receiving slot of signals sent from * retrieval engine; * when we try to receive content and we do not get any, * this notifies user that time-out is due * @param aHashOfContent item that was requested * @param aTypeOfNotReceivdContent item type requested */ void notifyOfContentNotReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfNotReceivdContent ); /** * Method for persisting profile private data inside datamodel. * Tnis is supposed to be called every time after private data * changes. * * lock the datamodel before calling this method * * @param aPublishTrustListToo if set to true, has selected profiles * trust list to be updated profile data and profile published * with the new trust list. */ virtual void storePrivateDataOfSelectedProfile(bool aPublishTrustListToo = false) ; /** * method for restoring private data of profile currently in use. * shall be called after new profile is selected in frontwidget. */ virtual void reStorePrivateDataOfSelectedProfile() ; /** * method for checking if a profile is found from contact * list of selected user */ virtual bool isContactInContactList(const Hash& aFingerPrint) const ; /** * method for producing a displayable version of a profile. * in practice this utilitizes the contacts of the selected profile * and a cache that is collected from private messages, * ads, profile comments and profiles */ virtual QString displayableNameForProfile(const Hash& aProfileFingerPrint) const ; /** * method for keeping profile hash<->displayname relation up to date. * this is called when display names are seen in profiles, ads, * private messages etc. */ virtual void offerDisplayNameForProfile(const Hash& aProfileFingerPrint, const QString& aDisplayName, const bool iUpdatePersistenStorage=false) ; /** * method that puts dialog or similar on display, about a published file */ virtual void displayFileInfoOnUi(const BinaryFile& aFileMetadata) ; /** * Method for getting voice call engine, if there is any. * From MController interface. * @return engine or null */ virtual VoiceCallEngine* voiceCallEngine() ; /** * Method for getting voice call engine, if there is any. * From MController interface. * @return engine or mockup. In normal runtime this just calls @ref voiceCallEngine. */ virtual MVoiceCallEngine* voiceCallEngineInterface() ; /** * Method for getting tcl wrapper instance. If there is no instance * one will be created. * From @ref MController interface. */ virtual TclWrapper &tclWrapper() ; /** * Method for getting front-widget, to be used as parent of dialogs * spawned from non-ui threads. From MController interface. */ virtual QWidget *frontWidget() ; /** * method for sending a poll around network regarding possible * update for a profile and possible addition of comments about * given profile. * * datamodel should not be locked when this is called. * * in practice this is called after user selects a profile to * be viewed ; it could be called periodically too for selected * profiles.. * * @param aProfileFingerPrint is fingerprint of the profile concerned. * @param aProfileNodeFingerPrint fingerprint of node that is suspected to * be the node where profile is published from. * this is naturally good candidate for * sending the query. */ void sendProfileUpdateQuery(const Hash& aProfileFingerPrint, const Hash& aProfileNodeFingerPrint = KNullHash ) ; #ifdef WIN32 void newInstanceConnected() ; /**< WIN32 IPC callback */ #endif /** * Method for getting file name. Method displays file selection * dialog and returns the selected file. Idea of this method is * that it may be called from background threads and it will * display the dialog in UI thread, then report results back. * This is a blocking method that will suspend execution of the * calling thread for the duration while user is doing the selection. * * @param aSuccess is set to true if operation ends all right. * @param aIsSaveFile if set to true, "file save" dialog is * shown, otherwise "file open" dialog. * @param aSuggestedFileName file name (pattern). If given empty, * any file is suggested in dialog, if "*.jpg" is given, then * dialog shall suggest only files with .jpg ending and * if "foobar.txt" is given, then dialog will suggest literal * file name "foobar.txt". * @return file system file name or empty if aSuccess is set to false. */ virtual QString getFileName(bool& aSuccess, bool aIsSaveFile = false , QString aSuggestedFileName = QString()) ; private: void createMenus(); /**< menus here */ int createPidFile(); /**< leave a mark to filesystem about instance */ void deletePidFile(); /**< remove mark from filesystem about instance */ /** * creates and possibly populates a shared memory segment * for IPC needs */ bool createSharedMemSegment(QString& aSegmentName); private slots: void checkForObjectToOpen(const Hash& aIgnored) ; /** processing of method addObjectToOpen */ /** * worker-slot for @ref getFileName method ; this slot will be called * in queued manner and have its code run in UI thread. */ void getFileNameSlot(QString aSuggestedFileName,bool aIsSaveFile) ; private: QMainWindow* iWin ; FrontWidget* iCurrentWidget ; /**< normally points to "frontwidget" instance */ QApplication& iApp ; QBoxLayout* iLayout ; QMenu *iFileMenu; QAction *iExitAct; QAction *iAboutAct; QAction *iPwdChangeAct; QAction *iProfileDeleteAct; QAction *iProfileCreateAct; QAction *iProfileSelectAct; QAction *iDisplaySettingsAct; QAction *iDisplayStatusAct; QAction *iDisplaySearchAct; QMenu *iTclMenu; QAction *iTclLibraryAct; /**< Menu item for opening tcl lib dialog */ QAction *iTclConsoleAct; /**< Menu item for opening tcl console dialog */ Node *iNode ; /**< our network presence object, there is single instance */ Model *iModel ; /**< data storage animal */ NetworkListener *iListener ; /**< Incoming connections handler, for ipv4 */ NetworkConnectorEngine *iNetEngine ; /**< Outgoing connections handler */ QString iContentKeyPasswd ; /** passwd used to protect profile private RSA key */ Hash iProfileHash ; /**< fingerprint of profile currently in use */ PublishingEngine *iPubEngine ; /**< Logic for handling content publish */ RetrievalEngine* iRetrievalEngine ;/**< Logic for fetcing stuff from other nodes */ DbRecordRetrievalEngine* iDbRetrievalEngine ;/**< Logic for fetcing db records from other nodes */ /** * if user requests for item that we do not have, lets put a * wait dialog in place and start wait for the object to appear * from network. in order to properly dismiss the dialog, * have here type (and later hash) of the objects that we're waiting * for */ ProtocolItemType iTypeOfObjectBeingWaitedFor ; /** * hash of object that user needs to wait. */ Hash iHashOfObjectBeingWaitedFor ; /** * hash of profile comment that user needs to wait. This is * used in two-stage fetch process of profile comment where * the profile may need to be retrieved first, then the * comment: we store there the profile comment hash for * duration of profile fetch */ Hash iHashOfProfileCommentBeingWaitedFor ; /** * Node where to ask for profile comment once profile * has been fetched */ Hash iNodeForCommentBeingWaitedFor ; /** * profile hash<->display_name mapping */ QMap iHashDisplaynameMapping ; /** * Currently there is support for one voice call at time */ VoiceCallEngine* iVoiceCallEngine ; /** * Flag for destructor. If this is on, don't allocate more objects */ bool iInsideDestructor ; /** * pending object to open */ QUrl iObjectToOpen ; /** * Shared memory block for receiving iObjectToOpen from * external process. */ QSharedMemory* iSharedMemory ; #ifdef WIN32 QLocalServer* iLocalServer ; /**< In WIN32 use named pipe for IPC */ #endif TclWrapper* iTclWrapper ; /**< wraps TCL interpreter */ /** variable used in @ref getFileName wrapper: holds result string */ QString iGetFileNameResult ; /** variable used in @ref getFileName wrapper: points to dialog */ QFileDialog* iGetFileNameDialog ; /** variable used in @ref getFileName wrapper: mutex that is locked for duration while iGetFileNameDialog is on display */ QSemaphore iGetFileNameSemaphore ; /** variable used in @ref getFileName wrapper: result from file selection dialog */ bool iGetFileNameSuccess ; } ; #endif classified-ads-0.13/datamodel/000077500000000000000000000000001331670245300162465ustar00rootroot00000000000000classified-ads-0.13/datamodel/binaryfile.cpp000066400000000000000000000131231331670245300210760ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "binaryfile.h" #include "../util/hash.h" #include "../log.h" #include "../util/jsonwrapper.h" #include #include "../mcontroller.h" #include "model.h" #include "contentencryptionmodel.h" static const char *KJSonBinaryFileName = "fileName" ; static const char *KJSonBinaryFileFP = "fingerPrint" ; static const char *KJSonBinaryFileDesc = "desc" ; static const char *KJSonBinaryFilePublisher = "publisher" ; static const char *KJSonBinaryFileContentOwner = "contentOwner" ; static const char *KJSonBinaryFileTime = "time" ; static const char *KJSonBinaryFileLicense = "license" ; static const char *KJSonBinaryFileMime = "mimetype" ; static const char *KJSonBinaryFileEncryption = "encrypted" ; BinaryFile::BinaryFile(const Hash& aHash) : iFingerPrint(aHash), iTimeOfPublish(0), iIsEncrypted(false), // initially all philes are phublic ; right? iIsCompressed(false), iLocalStorageStatus(LocalStorageStatusUnknown) { LOG_STR("BinaryFile::BinaryFile()") ; } BinaryFile::~BinaryFile() { LOG_STR("BinaryFile::~BinaryFile()") ; } QByteArray BinaryFile::asJSon(const MController& /*aController*/) const { // first have a map ; that is the top-level JSon-object QMap m ; m.insert(KJSonBinaryFileFP, iFingerPrint.toString()) ; // no non-ascii chars if ( iDescription.length() > 0 ) { m.insert(KJSonBinaryFileDesc, iDescription.toUtf8()) ; } if ( iFileName.length() > 0 ) { m.insert(KJSonBinaryFileName, iFileName.toUtf8()) ; } if ( iOwner.length() > 0 ) { m.insert(KJSonBinaryFilePublisher, iOwner.toUtf8()) ; } if ( iContentOwner.length() > 0 ) { m.insert(KJSonBinaryFileContentOwner, iContentOwner.toUtf8()) ; } m.insert(KJSonBinaryFileTime, iTimeOfPublish) ; if ( iLicense.length() > 0 ) { m.insert(KJSonBinaryFileLicense, iLicense.toUtf8()) ; } if ( iMimeType.length() > 0 ) { m.insert(KJSonBinaryFileMime, iMimeType.toUtf8()) ; } m.insert( KJSonBinaryFileEncryption, iIsEncrypted) ; QVariant j (m); // then put the map inside QVariant and that // may then be serialized in libqjson-0.7 and 0.8 QByteArray retval ( JSonWrapper::serialize(j) ) ; LOG_STR2("blob metadata %s", qPrintable(QString(retval))) ; return retval ; } bool BinaryFile::fromJSon(const QByteArray &aJSonBytes, const MController& /*aController*/ ) { bool ok; QVariantMap result ( JSonWrapper::parse (aJSonBytes, &ok) ); if (!ok) { return false ; } if ( result.contains(KJSonBinaryFileFP) ) { QString fingerPrintString = QString::fromUtf8(result[KJSonBinaryFileFP].toByteArray()) ; if ( fingerPrintString != iFingerPrint.toString() ) { // huhuu, inside is different FP from what the key says?? LOG_STR2("BinaryFile: Fingerprint in json %s" , qPrintable( fingerPrintString)) ; return false ; } } else { LOG_STR("BinaryFile: No fingerprint in json??" ) ; return false ; } if ( result.contains(KJSonBinaryFileName) ) { iFileName = QString::fromUtf8(result[KJSonBinaryFileName].toByteArray()) ; } if ( result.contains(KJSonBinaryFileDesc) ) { iDescription = QString::fromUtf8(result[KJSonBinaryFileDesc].toByteArray()) ; } if ( result.contains(KJSonBinaryFilePublisher) ) { iOwner = QString::fromUtf8(result[KJSonBinaryFilePublisher].toByteArray()) ; } if ( result.contains(KJSonBinaryFileContentOwner) ) { iContentOwner = QString::fromUtf8(result[KJSonBinaryFileContentOwner].toByteArray()) ; } if ( result.contains(KJSonBinaryFileTime) ) { iTimeOfPublish = result[KJSonBinaryFileTime].toUInt() ; } if ( result.contains(KJSonBinaryFileLicense) ) { iLicense = QString::fromUtf8(result[KJSonBinaryFileLicense].toByteArray()) ; } if ( result.contains(KJSonBinaryFileMime) ) { iMimeType = QString::fromUtf8(result[KJSonBinaryFileMime].toByteArray()) ; } if ( result.contains(KJSonBinaryFileEncryption) ) { iIsEncrypted = result[KJSonBinaryFileEncryption].toBool() ; } return ok ; } QString BinaryFile::displayName() const { QString retval ; if ( iIsEncrypted ) { retval = iFingerPrint.toString() ; } else { if ( iFileName.length() > 0 ) { retval = iFileName; } else { if ( iDescription.length() > 0 ) { retval = iDescription ; } else { // no filename nor description.. retval = iFingerPrint.toString() ; } } if ( retval.length() > 40 ) { retval = retval.left(40) ; } } return retval ; } classified-ads-0.13/datamodel/binaryfile.h000066400000000000000000000054231331670245300205470ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti Jarvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_BINARYFILE_H #define CLASSIFIED_BINARYFILE_H #include #include "../util/hash.h" // for class Hash class MController ; /** * @brief Carrier-class for binary blob * * Instances of this class are stored and retrieved using * @ref BinaryFileModel. Lets decide that this class carries * the metadata only, actual octet-stream of the file * is retrieved using a QByteArray only, there is method * for that in the model. */ class BinaryFile { public: /** enum for storing information if we have file locally or not */ enum LocalStorageStatus { FileIsLocallyStored, FileIsNotLocallyStored, LocalStorageStatusUnknown } ; BinaryFile(const Hash& aHash) ; /**< constructor */ ~BinaryFile() ; /**< destructor */ /** * method for string that is shown to user about the file. * Most often could be original name from filesystem but * other explanation too.. * @return string to display to user */ QString displayName() const ; QByteArray asJSon(const MController& aController) const ; /**< returns file data as JSon stream */ bool fromJSon(const QByteArray &aJSonBytes, const MController& aController ) ; /**< parses json into members*/ const Hash iFingerPrint ; /**< file hash */ QString iMimeType ; /**< what kind of data */ QString iDescription ; /**< what is inside */ QString iOwner ; /**< fingerprint of publisher */ QString iContentOwner ; /**< if someone owns the content, name or SHA1 fp */ QString iLicense ; /**< restriction in usage;PD or GPL or C-C or anything? */ QString iFileName ; /**< name of the file-system file */ quint32 iTimeOfPublish ; /**< seconds since 1-jan-1970 */ bool iIsEncrypted ; bool iIsCompressed ; /**< needs to be in DB, not in JSon */ LocalStorageStatus iLocalStorageStatus ; /** file is stored locally, or not */ } ; #endif classified-ads-0.13/datamodel/binaryfilelistingmodel.cpp000066400000000000000000000152141331670245300235140ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "binaryfilelistingmodel.h" #include "../log.h" #include "binaryfile.h" #include "mmodelprotocolinterface.h" BinaryFileListingModel::BinaryFileListingModel(QList& aFilesToList, MModelProtocolInterface& aModel) : iFilesToList(aFilesToList), iModel(aModel) { for ( int i = 0 ; i < iFilesToList.size() ; i++ ) { updateFileDataInArray( iFilesToList[i],false ) ; } beginInsertColumns(QModelIndex(),0,0) ; endInsertColumns() ; beginInsertRows(QModelIndex(),0,iNamesAndFingerPrints.size()) ; endInsertRows() ; emit dataChanged(createIndex( 0 ,0), createIndex( iNamesAndFingerPrints.size() ,0)) ; } BinaryFileListingModel::~BinaryFileListingModel() { } int BinaryFileListingModel::rowCount(const QModelIndex& ) const { return iNamesAndFingerPrints.size(); } int BinaryFileListingModel::columnCount(const QModelIndex& ) const { return 1 ; // for the time being .. maybe this could be configurable? // add one column for possible icon // add another for optional delete-button with a drawing delegate? } QVariant BinaryFileListingModel::data(const QModelIndex &index, int role) const { if(!index.isValid()) return QVariant(); if(role == Qt::DisplayRole) { return iNamesAndFingerPrints.at(index.row()).second ; //return iProfiles.at(index.row()).toString(); } if(role == Qt::DecorationRole) { // here return QIcon of size 26x26 featuring lenin reading pravda? // maybe iLocalStorageStatus could be used here? return QVariant(); } if(role == Qt::ToolTipRole) { return iNamesAndFingerPrints.at(index.row()).first.toString() ; } return QVariant(); } void BinaryFileListingModel::addFile(const Hash& aFingerPrint) { if ( ! iFilesToList.contains(aFingerPrint) ) { iFilesToList.append(aFingerPrint) ; updateFileDataInArray(aFingerPrint,true) ; } } void BinaryFileListingModel::removeFile(const Hash& aFingerPrint) { int i ; if (iFilesToList.contains(aFingerPrint) ) { iFilesToList.removeOne(aFingerPrint) ; for ( i = 0 ; i < iNamesAndFingerPrints.size() ; i++ ) { if ( iNamesAndFingerPrints.at(i).first == aFingerPrint ) { beginRemoveRows(QModelIndex(),i,i) ; iNamesAndFingerPrints.removeAt(i); endRemoveRows() ; break ; } } } } void BinaryFileListingModel::updateFileDataInArray( const Hash& aFingerPrint,bool aEmit ) { bool found = false ; int i ; for ( i = 0 ; i < iNamesAndFingerPrints.size() ; i++ ) { if ( iNamesAndFingerPrints.at(i).first == aFingerPrint ) { iNamesAndFingerPrints.replace(i, QPair ( aFingerPrint, fileDisplayNameByFingerPrint(aFingerPrint) ) ); found = true ; break ; } } if(!found) { // was not contained beginInsertRows(QModelIndex(),iNamesAndFingerPrints.size(),iNamesAndFingerPrints.size()) ; iNamesAndFingerPrints.append( QPair ( aFingerPrint, fileDisplayNameByFingerPrint(aFingerPrint) )); i = iNamesAndFingerPrints.size() ; endInsertRows() ; found = true ; } if ( aEmit && found ) { int minRow = i>0 ? i-1 : 0 ; int maxRow = i>=iNamesAndFingerPrints.size()? iNamesAndFingerPrints.size():i+1 ; LOG_STR2("Emit from row %d", minRow) ; LOG_STR2("Emit to row %d", maxRow) ; emit dataChanged(createIndex( minRow,0), createIndex( maxRow,0)); } } QString BinaryFileListingModel::fileDisplayNameByFingerPrint(const Hash& aFingerPrint) { // some kind of caching could be in order here? we'll repeatedly list // same profilenames, querying db for each and every listing is waste // of resources.. QSqlQuery query(iModel.dataBaseConnection()); bool ret ; QString retval ; ret = query.prepare ( "select display_name from binaryfile where " "hash1=:hash1 and hash2=:hash2 and hash3=:hash3 " "and hash4=:hash4 and hash5=:hash5 " ) ; if ( ret ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); ret = query.exec() ; if ( !ret ) { emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() ) { retval = QString::fromUtf8(query.value(0).toByteArray()) ; } } } else { emit error(MController::DbTransactionError, query.lastError().text()) ; } if ( retval.length() == 0 ) { retval = aFingerPrint.toString() ; } return retval ; } QVariant BinaryFileListingModel::headerData(int aSection, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) return QVariant(); if (orientation == Qt::Horizontal) { switch (aSection) { case 0: return QVariant(tr("Name or fingerprint of file")); break ; default: return QVariant(); } } return QVariant(); } void BinaryFileListingModel::clear() { #if QT_VERSION >= 0x050000 // qt5 beginResetModel() ; #endif iFilesToList.clear() ; iNamesAndFingerPrints.clear() ; #if QT_VERSION >= 0x050000 endResetModel() ; #else reset() ; #endif } classified-ads-0.13/datamodel/binaryfilelistingmodel.h000066400000000000000000000057351331670245300231700ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef BINARYFILELISTINGMODEL_H #define BINARYFILELISTINGMODEL_H #include #include "../util/hash.h" #include "../mcontroller.h" class BinaryFile ; class MModelProtocolInterface ; /** * @brief Model-class for helping display of shared binary blobs, * usually from a profile */ class BinaryFileListingModel: public QAbstractTableModel { Q_OBJECT public: BinaryFileListingModel(QList& aFilesToList, MModelProtocolInterface& aModel) ;/**< Constructor */ ~BinaryFileListingModel() ; /**< Destructor */ /** * method for removing a reader. * too. * @param aFingerPrint is fingerprint of the file to add */ void addFile(const Hash& aFingerPrint) ; /** * method for removing a file. * too. * @param aFingerPrint is fingerprint of the file to remove */ void removeFile(const Hash& aFingerPrint) ; /** * method for retrieving display-name of a file */ QString fileDisplayNameByFingerPrint(const Hash& aFingerPrint) ; /** * re-implemented from QAbstractTableModel * @return number of rows in list */ virtual int rowCount(const QModelIndex & parent = QModelIndex()) const ; /** * re-implemented from QAbstractTableModel * @return number of columns in model */ virtual int columnCount ( const QModelIndex & parent = QModelIndex() ) const ; /** * re-implemented from QAbstractTableModel * @return data to display in list */ virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const ; virtual QVariant headerData(int aSection, Qt::Orientation orientation, int role) const ; /** * method for emptying model contents when viewed profile changes */ void clear() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: // methods void updateFileDataInArray( const Hash& aFingerPrint,bool aEmit ) ; private: // data QList& iFilesToList ; QList > iNamesAndFingerPrints ; MModelProtocolInterface& iModel ; } ; #endif classified-ads-0.13/datamodel/binaryfilemodel.cpp000066400000000000000000001110211331670245300221130ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef WIN32 // include this as very first item? #define NOMINMAX #include #endif #include "binaryfilemodel.h" #include "../log.h" #include "../util/hash.h" #include "model.h" #include #include #include "binaryfile.h" #include "profile.h" #include "contentencryptionmodel.h" #ifndef WIN32 #include #endif #include "../util/jsonwrapper.h" #include "mmodelprotocolinterface.h" #include "profilemodel.h" #include "const.h" BinaryFileModel::BinaryFileModel(MController *aController, MModelProtocolInterface &aModel) : ModelBase("binaryfile",KMaxRowsInTableBinaryFile,aController,aModel) { LOG_STR("BinaryFileModel::BinaryFileModel()") ; connect(this, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; } BinaryFileModel::~BinaryFileModel() { LOG_STR("BinaryFileModel::~BinaryFileModel()") ; iController = NULL ; // not owned, just set null } Hash BinaryFileModel::publishBinaryFile(const Profile& aPublishingProfile, const QString& aFileName, const QString& aDescription, const QString& aMimeType, const QString& aOwner, const QString& aLicense, const QByteArray& aContents, bool aIsCompressed, bool aNoEncryption, const QList* aBinaryRecipientList) { LOG_STR("BinaryFileModel::publishBinaryFile()") ; Hash retval ; bool operation_success (false) ; Hash contentFingerPrint ; QByteArray encryptedContent ; bool encryption_was_used (false) ; QList namedRecipientsList ; if ( aBinaryRecipientList != NULL ) { namedRecipientsList.append(*aBinaryRecipientList) ; // encrypt to self too, or sender can not read the attachment if ( ! namedRecipientsList.contains(aPublishingProfile.iFingerPrint) ) { namedRecipientsList.append(aPublishingProfile.iFingerPrint) ; } } if ( ( aNoEncryption == false && aPublishingProfile.iIsPrivate ) || aBinaryRecipientList != NULL ) { encryption_was_used = true ; if ( iController->model().contentEncryptionModel().encrypt(aBinaryRecipientList != NULL ? namedRecipientsList : aPublishingProfile.iProfileReaders, aContents, encryptedContent ) ) { contentFingerPrint.calculate(encryptedContent) ; } else { return retval ; } } else { // no encryption contentFingerPrint.calculate(aContents) ; } // ok, now we have the content, encrypted or not, lets invent // some metadata. // fingerprint of a file is the content alone, metadata may change // but the file remains the same, from this programs perspective. BinaryFile metadata(contentFingerPrint) ; metadata.iMimeType = aMimeType ; metadata.iOwner = aPublishingProfile.iFingerPrint.toString() ; metadata.iContentOwner = aOwner ; metadata.iFileName = aFileName ; metadata.iLicense = aLicense ; metadata.iDescription = aDescription ; metadata.iTimeOfPublish = QDateTime::currentDateTimeUtc().toTime_t() ; metadata.iIsEncrypted = encryption_was_used ; QByteArray metadataJSon ( metadata.asJSon(*iController) ) ; // now, if the profile is private. .. we do not publish // plaintext metadata either. lets encrypt the metadata too if ( encryption_was_used ) { QByteArray encryptedMetadata ; if ( iController->model().contentEncryptionModel().encrypt(aBinaryRecipientList != NULL ? namedRecipientsList : aPublishingProfile.iProfileReaders, metadataJSon, encryptedMetadata ) ) { metadataJSon.clear() ; metadataJSon.append(encryptedMetadata) ; encryptedMetadata.clear() ; } else { return retval ; } } // ok, now we have content, possibly encrypted, and metadata, // possibly encrypted. ready to publish, except for the signature. QByteArray signature ; if ( iController->model().contentEncryptionModel().sign(aPublishingProfile.iFingerPrint, encryption_was_used ? encryptedContent : aContents , signature, &metadataJSon ) == 0 ) { // signature went ok, then insert/update table QSqlQuery countQuery (iController->model().dataBaseConnection()) ; operation_success = countQuery.prepare("select count(hash1) from binaryfile where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5") ; if ( operation_success ) { countQuery.bindValue(":hash1", contentFingerPrint.iHash160bits[0]); countQuery.bindValue(":hash2", contentFingerPrint.iHash160bits[1]); countQuery.bindValue(":hash3", contentFingerPrint.iHash160bits[2]); countQuery.bindValue(":hash4", contentFingerPrint.iHash160bits[3]); countQuery.bindValue(":hash5", contentFingerPrint.iHash160bits[4]); operation_success = countQuery.exec() ; if ( operation_success && countQuery.next() && !countQuery.isNull(0) ) { int count ( countQuery.value(0).toInt() ) ; LOG_STR2("Count of hashes in table binaryfile = %d", count) ; if ( count == 0 ) { // content was new -> insert QSqlQuery ins (iController->model().dataBaseConnection()); operation_success = ins.prepare("insert into binaryfile" "(hash1,hash2,hash3,hash4,hash5," "publisher_hash1,publisher_hash2,publisher_hash3," "publisher_hash4,publisher_hash5," "contentdata,is_private,is_compressed," "time_last_reference,signature,display_name," "time_of_publish, metadata ) values ( :hash1," ":hash2,:hash3,:hash4,:hash5,:publisher_hash1," ":publisher_hash2,:publisher_hash3,:publisher_hash4," ":publisher_hash5,:contentdata," ":is_private,:is_compressed,:time_last_reference," ":signature,:display_name,:time_of_publish," ":metadata)" ) ; if ( operation_success ) { ins.bindValue(":hash1", contentFingerPrint.iHash160bits[0]); ins.bindValue(":hash2", contentFingerPrint.iHash160bits[1]); ins.bindValue(":hash3", contentFingerPrint.iHash160bits[2]); ins.bindValue(":hash4", contentFingerPrint.iHash160bits[3]); ins.bindValue(":hash5", contentFingerPrint.iHash160bits[4]); ins.bindValue(":publisher_hash1", aPublishingProfile.iFingerPrint.iHash160bits[0]); ins.bindValue(":publisher_hash2", aPublishingProfile.iFingerPrint.iHash160bits[1]); ins.bindValue(":publisher_hash3", aPublishingProfile.iFingerPrint.iHash160bits[2]); ins.bindValue(":publisher_hash4", aPublishingProfile.iFingerPrint.iHash160bits[3]); ins.bindValue(":publisher_hash5", aPublishingProfile.iFingerPrint.iHash160bits[4]); ins.bindValue(":contentdata", encryption_was_used ? encryptedContent : aContents ); ins.bindValue(":is_private", encryption_was_used) ; ins.bindValue(":is_compressed", aIsCompressed) ; ins.bindValue(":time_last_reference",metadata.iTimeOfPublish ) ; ins.bindValue(":time_of_publish",metadata.iTimeOfPublish ) ; ins.bindValue(":signature", signature) ; ins.bindValue(":display_name", aPublishingProfile.iIsPrivate ? contentFingerPrint.toString() : metadata.displayName()) ; ins.bindValue(":metadata", metadataJSon) ; if ( ( operation_success = ins.exec() ) == false ) { QLOG_STR(ins.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, ins.lastError().text()) ; } else { iCurrentDbTableRowCount++ ; } } else { QLOG_STR(ins.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, ins.lastError().text()) ; } } else { // content we already had -> update QSqlQuery upd (iController->model().dataBaseConnection()); operation_success = upd.prepare("update binaryfile set contentdata=:contentdata," "is_private=:is_private,is_compressed=:is_compressed," "publisher_hash1=:publisher_hash1," "publisher_hash2=:publisher_hash2," "publisher_hash3=:publisher_hash3," "publisher_hash4=:publisher_hash4," "publisher_hash5=:publisher_hash5," "time_last_reference=:time_last_reference," "signature=:signature,display_name=:display_name," "time_of_publish=:time_of_publish, metadata=:metadata " "where hash1 = :hash1 and hash2 = :hash2 and" " hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5") ; if ( operation_success ) { upd.bindValue(":hash1", contentFingerPrint.iHash160bits[0]); upd.bindValue(":hash2", contentFingerPrint.iHash160bits[1]); upd.bindValue(":hash3", contentFingerPrint.iHash160bits[2]); upd.bindValue(":hash4", contentFingerPrint.iHash160bits[3]); upd.bindValue(":hash5", contentFingerPrint.iHash160bits[4]); upd.bindValue(":publisher_hash1", aPublishingProfile.iFingerPrint.iHash160bits[0]); upd.bindValue(":publisher_hash2", aPublishingProfile.iFingerPrint.iHash160bits[1]); upd.bindValue(":publisher_hash3", aPublishingProfile.iFingerPrint.iHash160bits[2]); upd.bindValue(":publisher_hash4", aPublishingProfile.iFingerPrint.iHash160bits[3]); upd.bindValue(":publisher_hash5", aPublishingProfile.iFingerPrint.iHash160bits[4]); upd.bindValue(":contentdata", encryption_was_used ? encryptedContent : aContents ); upd.bindValue(":is_private", encryption_was_used) ; upd.bindValue(":is_compressed", aIsCompressed) ; upd.bindValue(":time_last_reference",metadata.iTimeOfPublish ) ; upd.bindValue(":time_of_publish",metadata.iTimeOfPublish ) ; upd.bindValue(":signature", signature) ; upd.bindValue(":display_name", aPublishingProfile.iIsPrivate ? contentFingerPrint.toString() : metadata.displayName()) ; upd.bindValue(":metadata", metadataJSon) ; if ( ( operation_success = upd.exec() ) == false ) { QLOG_STR(upd.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, upd.lastError().text()) ; } } } } else { QLOG_STR(countQuery.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, countQuery.lastError().text()) ; } } else { QLOG_STR(countQuery.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, countQuery.lastError().text()) ; } } if ( operation_success ) { QList emptyBangPath ; iController->model().addItemToBePublished(BinaryBlob, contentFingerPrint, emptyBangPath) ; retval = contentFingerPrint ; } return retval ; } BinaryFile* BinaryFileModel::binaryFileByFingerPrint(const Hash& aFingerPrint) { LOG_STR("BinaryFileModel::binaryFileByFingerPrint()") ; BinaryFile* retval = NULL ; QSqlQuery query(iController->model().dataBaseConnection()); bool ret ; // note: here signature is not retrieved. signature is in // file content+metadata so we verify when retrieving the // content too ; from this method the returned metadata // might not be from correct sender -> again, this is then // verified in content-retrieval mode ret = query.prepare ("select metadata,is_private,is_compressed from binaryfile where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( ret ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) ) { QByteArray metadataData ( query.value(0).toByteArray()) ; bool isPrivate ( false ) ; isPrivate = !query.isNull(1) && query.value(1).toBool() ; retval = new BinaryFile(aFingerPrint) ; if ( isPrivate ) { QByteArray plainTextMetaData ; if ( iController->model().contentEncryptionModel().decrypt(metadataData, plainTextMetaData ) ) { retval->fromJSon(plainTextMetaData,*iController) ; } } else { // was then public and profileData is in plainText: retval->fromJSon(metadataData,*iController) ; } retval->iIsCompressed = !query.isNull(2) && query.value(2).toBool() ; } } return retval ; } // unlike previous method, this does check signature. // it might be useful to check for presence of aPresumedSender // public key before calling this method.. for the sake of // producing meaningful errormessages. bool BinaryFileModel::binaryFileDataByFingerPrint(const Hash& aFingerPrint, const Hash& aPresumedSender, QByteArray& aResultingFileData, QByteArray& aResultingSignature, bool* aIsBinaryFilePrivate ) { LOG_STR2("BinaryFileModel::binaryFileDataByFingerPrint() %s", qPrintable(aFingerPrint.toString())) ; bool retval = false ; QSqlQuery query (iController->model().dataBaseConnection()); retval = query.prepare ("select contentdata,signature,is_private,is_compressed,metadata from binaryfile where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( retval ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); } retval = query.exec() ; if ( !retval ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) && !query.isNull(1) ) { QByteArray fileData ( query.value(0).toByteArray()) ; aResultingSignature.clear() ; aResultingSignature.append ( query.value(1).toByteArray()) ; QByteArray metadata ( query.value(4).toByteArray()) ; bool isCompressed ( false ) ; *aIsBinaryFilePrivate = !query.isNull(2) && query.value(2).toBool() ; isCompressed = !query.isNull(3) && query.value(3).toBool() ; if ( fileData.size() > 0 && aResultingSignature.size() > 0 && metadata.size() > 0 && iController->model().contentEncryptionModel().verify(aPresumedSender, fileData, aResultingSignature, &metadata ) ) { // good signature // so check if de-cryption needed if ( *aIsBinaryFilePrivate ) { QByteArray plainTextContents ; if ( iController->model().contentEncryptionModel().decrypt(fileData, plainTextContents ) ) { fileData.clear() ; fileData.append(plainTextContents) ; plainTextContents.clear() ; } else { // signature was ok but obviously we're not among recipients: retval = false ; fileData.clear() ; } } if ( fileData.size() > 0 ) { aResultingFileData.clear() ; if ( isCompressed ) { aResultingFileData.append(qUncompress(fileData)) ; } else { aResultingFileData.append(fileData) ; } if ( aResultingFileData.size() > 0 ) { retval = true ; // uncompress returns empty if data corrupt - signature to save? } } else { // empty phile? retval = false ; } } else { // signature failed retval = false ; } } } return retval ; } bool BinaryFileModel::sentBinaryFileReceived(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QByteArray& aKeyOfPublisher, const unsigned char aFlags, const quint32 aTimeStamp, const Hash& aFromNode) { const QList dummyBangPath; return doHandleReceivedFile(aFingerPrint, aContent, aSignature, dummyBangPath, aKeyOfPublisher, aFlags, aTimeStamp, false, aFromNode) ; } bool BinaryFileModel::publishedBinaryFileReceived(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const QByteArray& aKeyOfPublisher, const unsigned char aFlags, const quint32 aTimeStamp, const Hash& aFromNode ) { return doHandleReceivedFile(aFingerPrint, aContent, aSignature, aBangPath, aKeyOfPublisher, aFlags, aTimeStamp, true , aFromNode) ; } bool BinaryFileModel::doHandleReceivedFile(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const QByteArray& aKeyOfPublisher, const unsigned char aFlags, const quint32 aTimeStamp, const bool aWasPublish, const Hash& aFromNode ) { bool retval ( false ) ; bool hostAlreadyHadContent ( false ) ; QSqlQuery query (iController->model().dataBaseConnection()); retval = query.prepare ("select count(contentdata) from binaryfile where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( retval ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); } retval = query.exec() ; int count(0) ; if ( !retval ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) ) { count = query.value(0).toInt() ; } } if ( count > 0 ) { // this is ok situation, we had the content already retval = true ; hostAlreadyHadContent = true ; } else if ( (unsigned)(aContent.size()) > 0 ) { // ok, we did not have the content ; lets handle the signing key // first, by checking if we have that: Hash fingerPrintOfPublisher ( iController->model().contentEncryptionModel().hashOfPublicKey(aKeyOfPublisher) ) ; if ( fingerPrintOfPublisher != KNullHash ) { quint32* metadataLenNetworkBo ((quint32*)(aContent.constData())) ; quint32 metadataLen ( ntohl (*metadataLenNetworkBo) ) ; if ( metadataLen > (quint32)(aContent.size()) ) { return false ; // soromnoo } QByteArray metaDataBytes ( aContent.mid(sizeof(quint32), metadataLen) ) ; if ( iController->model().contentEncryptionModel().verify(aKeyOfPublisher, aContent.mid(sizeof(quint32)+metadataLen ), aSignature, &metaDataBytes, false ) ) { // if we got here then signature in the file did match // they key. iController->model().contentEncryptionModel().insertOrUpdatePublicKey(aKeyOfPublisher, fingerPrintOfPublisher) ; // next: //in binary file the content dictates the hash Hash calculatedFingerPrint ; calculatedFingerPrint.calculate(aContent.mid(sizeof(quint32)+metadataLen )) ; if ( aFingerPrint != calculatedFingerPrint ) { // err, what? LOG_STR("Binary file received: fingerprint does not match?") ; return false ; } // content was new -> insert QSqlQuery ins (iController->model().dataBaseConnection()); retval = ins.prepare("insert into binaryfile(hash1,hash2,hash3,hash4," "hash5,publisher_hash1,publisher_hash2," "publisher_hash3,publisher_hash4," "publisher_hash5,contentdata,is_private," "is_compressed," "time_last_reference,signature,display_name," "time_of_publish, metadata,recvd_from ) " " values ( :hash1," ":hash2,:hash3,:hash4,:hash5,:publisher_hash1," ":publisher_hash2," ":publisher_hash3,:publisher_hash4," ":publisher_hash5,:contentdata," ":is_private,:is_compressed,:time_last_reference," ":signature,:display_name,:time_of_publish," ":metadata,:recvd_from)" ) ; if ( retval ) { ins.bindValue(":hash1", aFingerPrint.iHash160bits[0]); ins.bindValue(":hash2", aFingerPrint.iHash160bits[1]); ins.bindValue(":hash3", aFingerPrint.iHash160bits[2]); ins.bindValue(":hash4", aFingerPrint.iHash160bits[3]); ins.bindValue(":hash5", aFingerPrint.iHash160bits[4]); ins.bindValue(":recvd_from", aFromNode.iHash160bits[4]); ins.bindValue(":publisher_hash1", fingerPrintOfPublisher.iHash160bits[0]); ins.bindValue(":publisher_hash2", fingerPrintOfPublisher.iHash160bits[1]); ins.bindValue(":publisher_hash3", fingerPrintOfPublisher.iHash160bits[2]); ins.bindValue(":publisher_hash4", fingerPrintOfPublisher.iHash160bits[3]); ins.bindValue(":publisher_hash5", fingerPrintOfPublisher.iHash160bits[4]); ins.bindValue(":contentdata", aContent.mid(sizeof(quint32)+metadataLen )); ins.bindValue(":is_private", (aFlags & 0x01) > 0 ) ; ins.bindValue(":is_compressed",(aFlags & 0x02) > 0 ) ; ins.bindValue(":time_last_reference",QDateTime::currentDateTimeUtc().toTime_t() ) ; ins.bindValue(":time_of_publish",aTimeStamp ) ; ins.bindValue(":signature", aSignature) ; if ( (aFlags & 0x01) ) { // file is encrypted ; insert fp as displayname ins.bindValue(":display_name", aFingerPrint.toString() ) ; } else { // file is not encrypted, parse metadata and extract displayname: BinaryFile metaData(aFingerPrint) ; if ( metaData.fromJSon(metaDataBytes, *iController ) ) { ins.bindValue(":display_name", metaData.displayName()) ; } else { return false ; // metadata did not parse } } ins.bindValue(":metadata", aContent.mid(sizeof(quint32), metadataLen)); if ( ( retval = ins.exec() ) == false ) { QLOG_STR(ins.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, ins.lastError().text()) ; } else { iCurrentDbTableRowCount++ ; retval = true ; // data saved } } else { QLOG_STR(ins.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, ins.lastError().text()) ; } } else { // signature did not verify.. LOG_STR("Binary file signature did not verify") ; } } else { // end of "if signing key looked ok" LOG_STR("Signing key could not be parsed when processing published/sent blob") ; retval = false ; } } if ( aWasPublish && hostAlreadyHadContent == false && retval == true ) { // re-publish new content until bangpath is full iController->model().addItemToBePublished(BinaryBlob, aFingerPrint, aBangPath) ; } if ( retval ) { emit contentReceived(aFingerPrint, BinaryBlob) ; } LOG_STR2("BinaryFileModel::published/sentBinaryFileReceived out success = %d", (int)retval) ; return retval ; } bool BinaryFileModel::binaryFileDataForPublish(const Hash& aFingerPrint, QByteArray& aResultingBinaryFileData, QByteArray& aResultingSignature, QByteArray& aPublicKeyOfPublisher, bool* aIsBinaryFilePrivate, bool* aIsBinaryFileCompressed ) { return doFindBinaryFileForPublishOrSend(aFingerPrint, aResultingBinaryFileData, aResultingSignature, aPublicKeyOfPublisher, aIsBinaryFilePrivate, aIsBinaryFileCompressed, NULL ) ; } bool BinaryFileModel::binaryFileDataForSend(const Hash& aFingerPrint, QByteArray& aResultingBinaryFileData, QByteArray& aResultingSignature, QByteArray& aPublicKeyOfPublisher, bool* aIsBinaryFilePrivate, bool* aIsBinaryFileCompressed, quint32* aTimeOfPublish) { return doFindBinaryFileForPublishOrSend(aFingerPrint, aResultingBinaryFileData, aResultingSignature, aPublicKeyOfPublisher, aIsBinaryFilePrivate, aIsBinaryFileCompressed, aTimeOfPublish ) ; } bool BinaryFileModel::doFindBinaryFileForPublishOrSend(const Hash& aFingerPrint, QByteArray& aResultingBinaryFileData, QByteArray& aResultingSignature, QByteArray& aPublicKeyOfPublisher, bool* aIsBinaryFilePrivate, bool* aIsBinaryFileCompressed, quint32* aTimeOfPublish ) { bool retval = false ; QSqlQuery query (iController->model().dataBaseConnection()); Hash fingerPrintOfPublisherKey; retval = query.prepare ("select contentdata,signature,is_private," "is_compressed,metadata,publisher_hash1," "publisher_hash2," "publisher_hash3,publisher_hash4,publisher_hash5," "time_of_publish from binaryfile where " "hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( retval ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); } retval = query.exec() ; bool contentIsOk ( false ) ; if ( !retval ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) && !query.isNull(1) ) { aResultingSignature.clear() ; aResultingSignature.append(query.value(1).toByteArray()) ; *aIsBinaryFilePrivate = query.value(2).toBool() ; *aIsBinaryFileCompressed = query.value(3).toBool() ; QByteArray metaData ( query.value(4).toByteArray()) ; quint32 metadataLenNetworkByteOrder ( htonl((quint32)(metaData.size()) ) ) ; aResultingBinaryFileData.clear() ; aResultingBinaryFileData.append((const char *)(&metadataLenNetworkByteOrder), sizeof(quint32)) ; aResultingBinaryFileData.append(metaData) ; metaData.clear() ; aResultingBinaryFileData.append(query.value(0).toByteArray()) ; fingerPrintOfPublisherKey.iHash160bits[0] = query.value(5).toUInt(); fingerPrintOfPublisherKey.iHash160bits[1] = query.value(6).toUInt(); fingerPrintOfPublisherKey.iHash160bits[2] = query.value(7).toUInt(); fingerPrintOfPublisherKey.iHash160bits[3] = query.value(8).toUInt(); fingerPrintOfPublisherKey.iHash160bits[4] = query.value(9).toUInt(); if ( aTimeOfPublish && !query.isNull(10)) { *aTimeOfPublish = query.value(10).toUInt(); #ifndef WIN32 #ifdef DEBUG time_t t ( *aTimeOfPublish ) ; char timebuf[40] ; LOG_STR2("Binary blob time of publish from db: %s", ctime_r(&t,timebuf)) ; #endif #endif } contentIsOk = true; } } if ( contentIsOk ) { // still need to handle they key of the publisher: quint32 dummyTimeStamp ; retval = iController->model().contentEncryptionModel().PublicKey(fingerPrintOfPublisherKey, aPublicKeyOfPublisher, &dummyTimeStamp ) ; } return retval ; } void BinaryFileModel::fillBucket(QList& aSendQueue, const Hash& aStartOfBucket, const Hash& aEndOfBucket, quint32 aLastMutualConnectTime, const Hash& aForNode ) { QSqlQuery query(iController->model().dataBaseConnection()); bool ret ; ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5 from binaryfile where hash1 >= :start and hash1 <= :end and time_of_publish > :last_connect_time and time_of_publish < :curr_time and ( recvd_from != :lowbits_of_requester or recvd_from is null ) order by time_of_publish desc limit 1000" ) ; if ( ret ) { if ( aStartOfBucket == aEndOfBucket ) { // this was "small network situation" e.g. start and end // are the same ; in practice it means that send all data query.bindValue(":start", 0x0); query.bindValue(":end", 0xFFFFFFFF); } else { // normal situation query.bindValue(":start", aStartOfBucket.iHash160bits[0]); query.bindValue(":end", aEndOfBucket.iHash160bits[0]); } query.bindValue(":last_connect_time", aLastMutualConnectTime); query.bindValue(":lowbits_of_requester", aForNode.iHash160bits[4]); // allow 5 minutes of clock skew. it won't matter because this // "bucket fill" is called less often than every 5 minutes // so we won't end up re-sending same content again and again query.bindValue(":curr_time", QDateTime::currentDateTimeUtc().addSecs(60*5).toTime_t()); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { Hash hashFoundFromDb ( query.value(0).toUInt(), query.value(1).toUInt(), query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt()) ; SendQueueItem fileToSend ; fileToSend.iHash = hashFoundFromDb ; fileToSend.iItemType = BinaryBlob ; aSendQueue.append(fileToSend) ; } } } classified-ads-0.13/datamodel/binaryfilemodel.h000066400000000000000000000315601331670245300215710ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti Jarvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_BINARYFILEMODEL_H #define CLASSIFIED_BINARYFILEMODEL_H #include #include "../mcontroller.h" // because enum from there is needed #include "../net/connection.h" #include "datamodelbase.h" class Hash ; class BinaryFile ; class MModelProtocolInterface ; class Profile ; /** * @brief This is part of datamodel for any binary blobs * * Initially this is for "shared files" profile-functionality but * this practically lets you share any octet-stream over DHT. */ class BinaryFileModel : public ModelBase { Q_OBJECT public: BinaryFileModel(MController *aMController, MModelProtocolInterface &aModel) ; ~BinaryFileModel() ; /** * sends a file to selected nodes in network for others * to retrieve. * * Don't forget to re-publish the profile after successful * completion of file publish as list of files is part of * the profile itself. * * @param aPublishingProfile is the publishing profile ; it is used to * sign the content and its privacy-settings are used * decide if file content will be encrypted or not. * @param aFileName is string telling original file-system file name * @param aDescription is free text describing the content * @param aMimeType is mime type, like application/octet-stream or image/gif * @param aOwner who owns the file (content) * @param aLicense string for specifying usage permission, something like * "public domain" or "creative commons share-alike" * @param aContents is the meat being thrown * @param aIsCompressed indicates if aContent should be uncompressed * before use. * @param aNoEncryption If false then privateness of aPublishingProfile * is used to decide if content gets encrypted during * publish. If true then content will always go * out without encryption. Use-case for this is attachment * of public posting where everybody needs to be able to * read, also when poster has private profile. * @param aBinaryRecipientList Is list of fingerprints of profiles whose keys will * be used to encrypt the content. If these keys * are given, then normal "readers of publishing * profile" recipient-key-list method is not used. * Use-case for this parameter is attachment * of a private message; there is dual * recipient (sender and receiver) and that's it. * @return Fingerprint of the published file or KNullHash if * things went bad. */ Hash publishBinaryFile(const Profile& aPublishingProfile, const QString& aFileName, const QString& aDescription, const QString& aMimeType, const QString& aOwner, const QString& aLicense, const QByteArray& aContents, bool aIsCompressed, bool aNoEncryption = false, const QList* aBinaryRecipientList = NULL ) ; /** * Gets a file. Caller is supposed to delete the returned * object. Note that returned data contains metadata only, * for actual content use method * @refbinaryFileDataByFingerPrint and because signature * is calculated over metadata+content, this method does * not yet check for signature -> it is checked when * data is retrieved. * * @param aFingerPrint file serial number (hash) * @return file or NULL */ BinaryFile* binaryFileByFingerPrint(const Hash& aFingerPrint) ; /** * Method for getting file contents. Returned contents are un-encrypted * already when returned by this method, and un-compressed. And signature * is checked. Need to think a strategy around situation where we have * a file but we don't have public key of its publisher ; in this case * we just have no clue about origins of the file and this is possible * situation too. * * @param aFingerPrint binary blob serial number * @param aPresumedSender is fingerprint of the file sender from file * metadata -> file content verification against this key * must succeed. * @param aResultingBinaryFileData will contain profile data * @param aResultingSignature will contain profile signature * @param aIsBinaryFilePrivate will be set to true if aResultingBinaryFileData * is encrypted. * @return true if file was found */ bool binaryFileDataByFingerPrint(const Hash& aFingerPrint, const Hash& aPresumedSender, QByteArray& aResultingBinaryFileData, QByteArray& aResultingSignature, bool* aIsBinaryFilePrivate ) ; /** * called by protocol parser when a file is received due to publish * @param aFingerPrint is the profile @ref Hash received from protocol header * @param aContent is actual file data * @param aSignature is digital signature of the aContent * @param aBangPath is list of low-order bits of hashes of nodes * where this content has been. This is for preventing * sending content back to nodes where it has already been. * @param aKeyOfPublisher is the key that was used to sign the file. * that is transferred outside file just because the recipient * might not have the key beforehand ; if she does, the existing * key will be used in verifying process. * @param aFlags possible flags telling about encyption and compression * @param aTimeStamp timestamp of file (if encrypted, it must be carried outside..) * @param aFromNode hash of the node that sent the file. low-order bits * of the hash will be stored along with the content, serving * as bang-path of length 1. * @return true on success */ bool publishedBinaryFileReceived(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const QByteArray& aKeyOfPublisher, const unsigned char aFlags, const quint32 aTimeStamp, const Hash& aFromNode ) ; /** * called by protocol parser when a file is received due to send * @param aFingerPrint is the profile @ref Hash received from protocol header * @param aContent is actual file data * @param aSignature is digital signature of the aContent * @param aKeyOfPublisher is the key that was used to sign the file. * that is transferred outside file just because the recipient * might not have the key beforehand ; if she does, the existing * key will be used in verifying process. * @param aFlags possible flags telling about encyption and compression * @param aTimeStamp timestamp of file (if encrypted, it must be carried outside..) * @param aFromNode fingerprint of the node that sent the content * @return true on success */ bool sentBinaryFileReceived(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QByteArray& aKeyOfPublisher, const unsigned char aFlags, const quint32 aTimeStamp, const Hash& aFromNode ) ; /** * method that returns unaltered binary file metadata+data * in single bytearray for purpose of publishing to other node * * @return true if content was found */ bool binaryFileDataForPublish(const Hash& aFingerPrint, QByteArray& aResultingBinaryFileData, QByteArray& aResultingSignature, QByteArray& aPublicKeyOfPublisher, bool* aIsBinaryFilePrivate, bool* iIsBinaryFileCompressed ) ; /** * method that returns unaltered binary file metadata+data * in single bytearray for purpose of sending to other node * * @return true if content was found */ bool binaryFileDataForSend(const Hash& aFingerPrint, QByteArray& aResultingBinaryFileData, QByteArray& aResultingSignature, QByteArray& aPublicKeyOfPublisher, bool* aIsBinaryFilePrivate, bool* aIsBinaryFileCompressed, quint32* aTimeOfPublish) ; /** * Method for filling connected peers send queue with items * that we have and that belong to said peers bucket. * * @param aSendQueue is send-queue of the connection that * serves particular node * @param aStartOfBucket is hash where bucket of that peer * starts. In practice it is the hash * of the node itself. * @param aEndOfBucket is hash where bucket of that peer ends. * That in turn depends on network size, * or number of active nodes in the network. * See method @ref NodeModel::bucketEndHash * for details. * @param aLastMutualConnectTime time when node was last in * contact. In practice we'll fill the * bucket items published after this time. * @param aForNode fingerprint of the node that asks for the bucket * fill ; reason for this is the recvd_from column * for preventing immediately re-sending content * sent from a peer */ void fillBucket(QList& aSendQueue, const Hash& aStartOfBucket, const Hash& aEndOfBucket, quint32 aLastMutualConnectTime, const Hash& aForNode ); signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; void contentReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfReceivdContent) ; private: // methods /** workhorse of @binaryFileDataForSend and @binaryFileDataForPublish */ bool doFindBinaryFileForPublishOrSend(const Hash& aFingerPrint, QByteArray& aResultingBinaryFileData, QByteArray& aResultingSignature, QByteArray& aPublicKeyOfPublisher, bool* aIsBinaryFilePrivate, bool* aIsBinaryFileCompressed, quint32* aTimeOfPublish) ; /** * workhorse of methods publishedBinaryFileReceived and sentBinaryFileReceived */ bool doHandleReceivedFile(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const QByteArray& aKeyOfPublisher, const unsigned char aFlags, const quint32 aTimeStamp, const bool aWasPublish, const Hash& aFromNode ) ; } ; #endif classified-ads-0.13/datamodel/ca.cpp000066400000000000000000000173451331670245300173470ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "ca.h" #include "../util/hash.h" #include "../log.h" #include "../util/jsonwrapper.h" #include #include "../mcontroller.h" #include "model.h" #include "contentencryptionmodel.h" #include "profile.h" static const char *KCaJSonTimeElement = "timeOfPublish" ; static const char *KCaJSonAttachedFiles = "attachedPhiles" ; static const char *KCaJSonSenderName = "senderName" ; static const char *KCaJSonSenderHash = "senderFP" ; static const char *KCaJSonSubject = "subject" ; static const char *KCaJSonReplyTo = "replyTo" ; static const char *KCaJSonGroup = "group" ; static const char *KCaJSonText = "text" ; static const char *KCaJSonProfileKey = "key" ; static const char *KCaJSonCaVersion = "ver" ; static const char *KCaJSonCaAboutIndex = "aidx" ; static const char *KCaJSonCaConcernsIndex = "cidx" ; static const char *KCaJSonCaInIndex = "iidx" ; static const char *KCaJSonCaAboutTxt = "atxt" ; static const char *KCaJSonCaConcernsTxt = "ctxt" ; static const char *KCaJSonCaInTxt = "itxt" ; static const int KJSONCaVersionValue = 1 ; /**< if our format should change? */ CA::CA() : iFingerPrint(KNullHash), iTimeOfPublish(0), iReplyTo(KNullHash), iAboutComboBoxIndex(-1), iConcernsComboBoxIndex(-1), iInComboBoxIndex(-1) { LOG_STR("ClassifiedAd::ClassifiedAd()") ; } CA::~CA() { LOG_STR("ClassifiedAd::~ClassifiedAd()") ; } QByteArray CA::asJSon(const MController& /*aController*/) const { // first have a map ; that is the top-level JSon-object QMap m ; if ( iAttachedFiles.size() > 0 ) { QVariantList listOfPhiles; LOG_STR2("iAttachedFiles has size %d", iAttachedFiles.size()) ; foreach( const Hash& phile, iAttachedFiles ) { listOfPhiles.append(phile.toString()) ; } if ( listOfPhiles.size() > 0 ) { m.insert(KCaJSonAttachedFiles, listOfPhiles) ; } } m.insert(KCaJSonCaVersion, KJSONCaVersionValue) ; if ( iSenderName.length() > 0 ) { m.insert(KCaJSonSenderName, iSenderName.toUtf8()) ; } if ( iSenderHash != KNullHash ) { m.insert(KCaJSonSenderHash, iSenderHash.toString().toUtf8()) ; } if ( iSubject.length() > 0 ) { m.insert(KCaJSonSubject, iSubject.toUtf8()) ; } if ( iReplyTo != KNullHash ) { m.insert(KCaJSonReplyTo, iReplyTo.toString().toUtf8()) ; } if ( iGroup.length() > 0 ) { m.insert(KCaJSonGroup, iGroup.toUtf8()) ; } if ( iMessageText.length() > 0 ) { m.insert(KCaJSonText, iMessageText.toUtf8()) ; } m.insert(KCaJSonTimeElement, iTimeOfPublish) ; QByteArray encryptionKey ; if ( iProfileKey.length() > 0 ) { m.insert(KCaJSonProfileKey, iProfileKey) ; } if ( iAboutComboBoxIndex > -1 ) { m.insert(KCaJSonCaAboutIndex, iAboutComboBoxIndex) ; } else if ( iAboutComboBoxText.length() > 0 ) { m.insert(KCaJSonCaAboutTxt, iAboutComboBoxText.toUtf8()) ; } if ( iConcernsComboBoxIndex > -1 ) { m.insert(KCaJSonCaConcernsIndex, iConcernsComboBoxIndex) ; } else if ( iConcernsComboBoxText.length() > 0 ) { m.insert(KCaJSonCaConcernsTxt, iConcernsComboBoxText.toUtf8()) ; } if ( iInComboBoxIndex > -1 ) { m.insert(KCaJSonCaInIndex, iInComboBoxIndex) ; } else if ( iInComboBoxText.length() > 0 ) { m.insert(KCaJSonCaInTxt, iInComboBoxText.toUtf8()) ; } QVariant j (m); // then put the map inside QVariant and that // may then be serialized in libqjson-0.7 and 0.8 QByteArray retval ( JSonWrapper::serialize(j) ) ; LOG_STR2("ca %s", qPrintable(QString(retval))) ; return retval ; } bool CA::fromJSon(const QByteArray &aJSonBytes, const MController& /*aController*/ ) { bool ok; QVariantMap result ( JSonWrapper::parse (aJSonBytes, &ok) ); if (!ok) { QLOG_STR("QJson::Parser failed to parse " + QString::number(aJSonBytes.size()) + " bytes") ; return false ; } else { QLOG_STR("CA parse ok") ; } if ( result.contains(KCaJSonReplyTo) ) { iReplyTo.fromString((const unsigned char *)QString::fromUtf8(result[KCaJSonReplyTo].toByteArray()).toLatin1().constData()) ; } if ( result.contains(KCaJSonSenderHash) ) { iSenderHash.fromString((const unsigned char *)QString::fromUtf8(result[KCaJSonSenderHash].toByteArray()).toLatin1().constData()) ; } if ( result.contains(KCaJSonAttachedFiles) ) { QVariantList listOfSharedPhiles (result[KCaJSonAttachedFiles].toList()) ; QListIterator i(listOfSharedPhiles); iAttachedFiles.clear() ; while (i.hasNext()) { Hash h ; h.fromString((const unsigned char*)(i.next().toString().toLatin1().constData())) ; iAttachedFiles.append(h); } } if ( result.contains(KCaJSonSenderName) ) { iSenderName = QString::fromUtf8(result[KCaJSonSenderName].toByteArray()) ; } else { iSenderName.clear() ; } if ( result.contains(KCaJSonTimeElement) ) { iTimeOfPublish = result[KCaJSonTimeElement].toUInt() ; QLOG_STR("In ca time of publish = " + QString::number(iTimeOfPublish)); } else { QLOG_STR("Ca contained no time of publish" ); } if ( result.contains(KCaJSonSubject) ) { iSubject = QString::fromUtf8(result[KCaJSonSubject].toByteArray()) ; } else { iSubject.clear() ; } if ( result.contains(KCaJSonGroup) ) { iGroup = QString::fromUtf8(result[KCaJSonGroup].toByteArray()) ; } else { iGroup.clear() ; } if ( result.contains(KCaJSonText) ) { iMessageText = QString::fromUtf8(result[KCaJSonText].toByteArray()) ; } else { iMessageText.clear() ; } if ( result.contains(KCaJSonProfileKey) ) { iProfileKey.clear() ; iProfileKey.append(result[KCaJSonProfileKey].toByteArray()) ; } if ( result.contains(KCaJSonCaAboutIndex) ) { iAboutComboBoxIndex = result[KCaJSonCaAboutIndex].toInt() ; } else if ( result.contains(KCaJSonCaAboutTxt) ) { iAboutComboBoxText = QString::fromUtf8(result[KCaJSonCaAboutTxt].toByteArray()) ; } if ( result.contains(KCaJSonCaConcernsIndex) ) { iConcernsComboBoxIndex = result[KCaJSonCaConcernsIndex].toInt() ; } else if ( result.contains(KCaJSonCaConcernsTxt) ) { iConcernsComboBoxText = QString::fromUtf8(result[KCaJSonCaConcernsTxt].toByteArray()) ; } if ( result.contains(KCaJSonCaInIndex) ) { iInComboBoxIndex = result[KCaJSonCaInIndex].toInt() ; } else if ( result.contains(KCaJSonCaInTxt) ) { iInComboBoxText = QString::fromUtf8(result[KCaJSonCaInTxt].toByteArray()) ; } return ok ; } QString CA::displayName() const { QString retval ; if ( iSubject.length() > 0 ) { retval = iSubject ; } else { retval = iFingerPrint.toString() ; } return retval ; } classified-ads-0.13/datamodel/ca.h000066400000000000000000000052601331670245300170050ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_AD_H #define CLASSIFIED_AD_H #include #include "../util/hash.h" // for class Hash class MController ; class Profile ; /** * @brief Carrier-class for classified ad * * Instances of this class are stored and retrieved using * @ref ClassifiedAdsModel. */ class CA { public: CA() ; /**< constructor */ ~CA() ; /**< destructor */ /** * method for string that is shown to user about the ad. * * @return string to display to user */ QString displayName() const ; QByteArray asJSon(const MController& aController) const ; /**< returns ad data as JSon stream */ bool fromJSon(const QByteArray &aJSonBytes, const MController& aController ) ; /**< parses json into members*/ /** hash of the message text .. more specifically hash * of the ad when it is serialized into json */ Hash iFingerPrint ; QString iSenderName ; /**< nickname/display-name of sender ; may empty if private profile */ Hash iSenderHash ; /**< profile fingerprint of the sender */ quint32 iTimeOfPublish ; /**< seconds since 1-jan-1970 */ /** * file attachements ; they're published as normal binary blobs and * then just listed here */ QList iAttachedFiles ; QString iSubject ; /**< Subject of the post */ Hash iReplyTo ; /**< Possible reference to another post that this is reply to */ QString iGroup ; /**< about-concerning-where -string - a bit like usenet newsgroup */ QString iMessageText ; /**< actual message here */ QByteArray iProfileKey ; /**< in case of private profile, include only key */ int iAboutComboBoxIndex ; int iConcernsComboBoxIndex ; int iInComboBoxIndex ; QString iAboutComboBoxText ; QString iConcernsComboBoxText ; QString iInComboBoxText ; } ; #endif classified-ads-0.13/datamodel/cadbrecord.cpp000066400000000000000000000265111331670245300210470ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "cadbrecord.h" #include "../log.h" #include "../util/jsonwrapper.h" #include #include "../net/node.h" #include #include #include "../util/jsonwrapper.h" static const char *KCaDbRecordJSonTimeOfPublish = "timeOfPublish" ; static const char *KCaDbRecordJSonCaVersion = "version" ; static const char *KCaDbRecordJSonRecordId = "recordId" ; static const char *KCaDbRecordJSonCollectionId = "collectionId" ; static const char *KCaDbRecordJSonSearchPhrase = "searchPhrase" ; static const char *KCaDbRecordJSonSearchNumber = "searchNumber" ; static const char *KCaDbRecordJSonData = "data" ; static const char *KCaDbRecordJSonIsEncrypted = "isEncrypted" ; // search related json keys static const char *KCaDbSearchJSonCollection = "collectionId" ; static const char *KCaDbSearchJSonById = "exactId"; static const char *KCaDbSearchJSonModifiedAfter = "modifiedAfter"; static const char *KCaDbSearchJSonModifiedBefore = "modifiedBefore"; static const char *KCaDbSearchJSonByHavingNumberMoreThan = "numberMoreThan"; static const char *KCaDbSearchJSonByHavingNumberLessThan = "numberLessThan"; static const char *KCaDbSearchJSonBySearchPhrase = "searchPhase"; static const char *KCaDbSearchJSonBySender = "senderFp" ; static const int KJSONCaDbRecordVersionValue ( 1 ) ; extern Hash KNullHash ; CaDbRecord::CaDbRecord() : iSearchNumber(std::numeric_limits::min()), iIsEncrypted(false), iTimeOfPublish(0), iIsSignatureVerified(false) { LOG_STR("CaDbRecord::CaDbRecord()") ; } CaDbRecord::~CaDbRecord() { LOG_STR("CaDbRecord::~CaDbRecord()") ; } QByteArray CaDbRecord::asJSon() const { // first have a map ; that is the top-level JSon-object QMap m ; m.insert(KCaDbRecordJSonCaVersion, KJSONCaDbRecordVersionValue) ; m.insert(KCaDbRecordJSonTimeOfPublish, iTimeOfPublish) ; m.insert(KCaDbRecordJSonIsEncrypted,iIsEncrypted) ; if ( iRecordId != KNullHash ) { m.insert(KCaDbRecordJSonRecordId, iRecordId.toString()) ; } if ( iCollectionId != KNullHash ) { m.insert(KCaDbRecordJSonCollectionId, iCollectionId.toString()) ; } if ( iSearchPhrase.length() > 0 ) { m.insert(KCaDbRecordJSonSearchPhrase, iSearchPhrase.toUtf8()) ; } if ( iSearchNumber != std::numeric_limits::min() ) { m.insert(KCaDbRecordJSonSearchNumber, iSearchNumber) ; } if( iData.length() ) { m.insert(KCaDbRecordJSonData, iData ) ; } QVariant j (m); // then put the map inside QVariant and that // may then be serialized in libqjson-0.7 and 0.8 QByteArray retval ( JSonWrapper::serialize(j) ) ; LOG_STR2("CaDbRecord %s", qPrintable(QString(retval))) ; return retval ; } bool CaDbRecord::fromJSon(const QByteArray &aJSonBytes ) { bool ok (true); QVariantMap result ( JSonWrapper::parse (aJSonBytes, &ok) ); if (!ok) { QLOG_STR("QJson::Parser failed to parse " + QString::number(aJSonBytes.size()) + " bytes") ; return false ; } else { QLOG_STR("CaDbRecord parse ok") ; } if ( result.contains(KCaDbRecordJSonTimeOfPublish) ) { iTimeOfPublish = result[KCaDbRecordJSonTimeOfPublish].toInt() ; } if ( result.contains(KCaDbRecordJSonIsEncrypted) ) { iIsEncrypted = result[KCaDbRecordJSonTimeOfPublish].toBool() ; } if ( result.contains(KCaDbRecordJSonRecordId) ) { iRecordId.fromString((const unsigned char *)result[KCaDbRecordJSonRecordId].toByteArray().constData()) ; } else { ok = false ; } if ( result.contains(KCaDbRecordJSonCollectionId) ) { iCollectionId.fromString((const unsigned char *)result[KCaDbRecordJSonCollectionId].toByteArray().constData()) ; } else { ok = false ; } if ( result.contains(KCaDbRecordJSonSearchNumber) ) { iSearchNumber = result[KCaDbRecordJSonSearchNumber].toLongLong() ; } if ( result.contains(KCaDbRecordJSonSearchPhrase) ) { iSearchPhrase = result[KCaDbRecordJSonSearchPhrase].toString() ; } iData.clear() ; // note that it is ok for data to be empty. empty record is // possible record. if ( result.contains(KCaDbRecordJSonData) ) { iData.append(result[KCaDbRecordJSonData].toByteArray()) ; } if ( iRecordId == KNullHash || iCollectionId == KNullHash ) { ok = false ; } return ok ; } bool CaDbRecord::SearchStructure::operator==(const struct SearchStructure& aItemToCompare) const { if ( iFromCollection != aItemToCompare.iFromCollection ) return false ; if ( iById != aItemToCompare.iById ) return false ; if ( iModifiedAfter != aItemToCompare.iModifiedAfter ) return false ; if ( iModifiedBefore != aItemToCompare.iModifiedBefore ) return false ; if ( iByHavingNumberMoreThan != aItemToCompare.iByHavingNumberMoreThan ) return false ; if ( iByHavingNumberLessThan != aItemToCompare.iByHavingNumberLessThan ) return false ; if ( iBySearchPhrase != aItemToCompare.iBySearchPhrase ) return false ; if ( iBySender != aItemToCompare.iBySender ) return false ; return true ; } bool CaDbRecord::SearchStructure::operator<(const struct SearchStructure& aItemToCompare) const { // first test: if collection does not match, the item being // compared is no smaller because it includes records from // entirely different collection, definitely outside scope // of one being compared so return "false", saying that // record being compared is larger by size of resultset. if ( iFromCollection != aItemToCompare.iFromCollection ) return false ; // same for "by identifier" -> different identifier always means // different resultset: if ( iById != aItemToCompare.iById ) return false ; // if "modifier after" is after the item being compared, // say that resultset may be broader: if ( iModifiedAfter > aItemToCompare.iModifiedAfter ) return false ; // if "modifier before" is before the item being compared, // say that resultset may be broader: if ( iModifiedBefore < aItemToCompare.iModifiedBefore ) return false ; // if range of search number is larger, then this instance // is not less: if ( iByHavingNumberMoreThan < aItemToCompare.iByHavingNumberMoreThan ) return false ; if ( iByHavingNumberLessThan > aItemToCompare.iByHavingNumberLessThan ) return false ; // if limit "by sender" is different, then this is not less: if ( iBySender != aItemToCompare.iBySender ) return false ; // then try check for search phrase.. if search phrase // of this instance is fully contained in item to compare, // then this may be less: if (this->iBySearchPhrase.length() > 0 && aItemToCompare.iBySearchPhrase.contains(this->iBySearchPhrase) == false ) return false ; return true ; // everything is less, so total is also less } QByteArray CaDbRecord::SearchStructure::asJSon() const { QMap m ; if ( iFromCollection != KNullHash ) { m.insert(KCaDbSearchJSonCollection, iFromCollection.toString()) ; } if ( iById != KNullHash ) { m.insert(KCaDbSearchJSonById, iById.toString()) ; } if ( iById == KNullHash || iFromCollection == KNullHash ) { if ( iBySender != KNullHash ) { m.insert(KCaDbSearchJSonBySender, iBySender.toString()) ; } if ( iModifiedAfter > std::numeric_limits::min() ) { m.insert(KCaDbSearchJSonModifiedAfter,iModifiedAfter ) ; } if ( iModifiedBefore < std::numeric_limits::max() ) { m.insert(KCaDbSearchJSonModifiedBefore,iModifiedBefore ) ; } if ( iByHavingNumberMoreThan > std::numeric_limits::min() ) { m.insert(KCaDbSearchJSonByHavingNumberMoreThan,iByHavingNumberMoreThan) ; } if ( iByHavingNumberLessThan < std::numeric_limits::max() ) { m.insert(KCaDbSearchJSonByHavingNumberLessThan,iByHavingNumberLessThan ) ; } if ( iBySearchPhrase.isEmpty() == false ) { m.insert(KCaDbSearchJSonBySearchPhrase,iBySearchPhrase.toUtf8() ) ; } } QVariant v ( m ) ; QByteArray result(JSonWrapper::serialize(v)) ; return result ; } bool CaDbRecord::SearchStructure::fromJSon(const QByteArray& aJSon) { bool retval ( false ) ; QVariantMap result ( JSonWrapper::parse (aJSon, &retval) ); if (!retval) { return retval ; } else { // start by setting everything to default values: iFromCollection = KNullHash ; iById = KNullHash ; iModifiedAfter = 0 ; iModifiedBefore = std::numeric_limits::max(); iByHavingNumberMoreThan = std::numeric_limits::min(); iByHavingNumberLessThan = std::numeric_limits::max(); iBySearchPhrase = QString::null ; iBySender = KNullHash ; // then go on checking what we have in json: if ( result.contains(KCaDbSearchJSonCollection ) ) { iFromCollection.fromString(reinterpret_cast(result[KCaDbSearchJSonCollection].toByteArray().constData())) ; if ( iFromCollection == KNullHash ) retval = false ; } if ( retval && result.contains(KCaDbSearchJSonById) ) { iById.fromString(reinterpret_cast(result[KCaDbSearchJSonById].toByteArray().constData())) ; } if ( retval && result.contains(KCaDbSearchJSonBySender) ) { iBySender.fromString(reinterpret_cast(result[KCaDbSearchJSonBySender].toByteArray().constData())) ; } if ( retval && result.contains(KCaDbSearchJSonModifiedAfter) ) { iModifiedAfter = result[KCaDbSearchJSonModifiedAfter].toUInt(&retval) ; } if ( retval && result.contains(KCaDbSearchJSonModifiedBefore) ) { iModifiedBefore = result[KCaDbSearchJSonModifiedBefore].toUInt(&retval) ; } if ( retval && result.contains(KCaDbSearchJSonByHavingNumberMoreThan) ) { iByHavingNumberMoreThan = result[KCaDbSearchJSonByHavingNumberMoreThan].toLongLong(&retval) ; } if ( retval && result.contains(KCaDbSearchJSonByHavingNumberLessThan) ) { iByHavingNumberLessThan = result[KCaDbSearchJSonByHavingNumberLessThan].toLongLong(&retval) ; } if ( result.contains(KCaDbSearchJSonBySearchPhrase) ) { iBySearchPhrase = QString::fromUtf8(result[KCaDbSearchJSonBySearchPhrase].toByteArray()) ; } } return retval ; } classified-ads-0.13/datamodel/cadbrecord.h000066400000000000000000000131041331670245300205060ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CA_DBRECORD_H #define CA_DBRECORD_H #include #include "../util/hash.h" // for class Hash /** * @brief Data record in distributed database * * In same manner as classified ads are published in groups, * it is possible to publish records in a collection. * This class carries one record in a collection. Db records * may be accessed via TCL interface, alternative APIs are * possible too. */ class CaDbRecord { public: // data type definitions /** * Data structure for expressing db record search conditions */ typedef struct SearchStructure { Hash iFromCollection ; /**< Search from which collection */ Hash iById ; /**< Exact db record identifier */ quint32 iModifiedAfter; /**< Earliest permissible modification time */ quint32 iModifiedBefore;/**< Latest permissible modification time */ /** Smallest permissible special search number */ qint64 iByHavingNumberMoreThan; /** Biggest permissible special search number */ qint64 iByHavingNumberLessThan; QString iBySearchPhrase; /**< Search phrase */ Hash iBySender ; /**< Limits results by publishing profile */ /** Equivalence-operator */ bool operator==(const struct SearchStructure& aItemToCompare) const ; /** * Less-than-operator. If from 2 queries A and B the result-set * if A is subset of resultset of B, then A #include #include #include #include "cadbrecordmodel.h" #include "cadbrecord.h" // actual record that is handled here #include "../log.h" #include "../util/hash.h" #include "model.h" #include "contentencryptionmodel.h" #include "profilemodel.h" #include "profile.h" #include "const.h" #include "searchmodel.h" CaDbRecordModel::CaDbRecordModel(MController *aController, MModelProtocolInterface &aModel) : ModelBase("dbrecord",KMaxRowsInTableDbRecord,aController,aModel) { LOG_STR("CaDbRecordModel::CaDbRecordModel()") ; connect(this, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; } CaDbRecordModel::~CaDbRecordModel() { LOG_STR("CaDbRecordModel::~CaDbRecordModel()") ; iController = NULL ; // not owned, just set null } QString CaDbRecordModel::publishDbRecord(CaDbRecord& aRecord, const QList* aRecordReaders) { LOG_STR("CaDbRecordModel::publishDbRecord() collection = " + aRecord.iCollectionId.toString() ) ; if ( aRecord.iCollectionId == KNullHash ) { return "Collection is mandatory" ; } aRecord.iTimeOfPublish = QDateTime::currentDateTimeUtc().toTime_t() ; aRecord.iSenderHash = iController->profileInUse() ; if ( aRecord.iData.size() > 0 ) { const QByteArray compressedData ( qCompress(aRecord.iData ) ) ; aRecord.iData.clear() ; aRecord.iData.append(compressedData) ; } if ( aRecord.iIsEncrypted ) { QByteArray encryptedJson ; Profile* ownProfile ( iController->model() .profileModel() .profileByFingerPrint( iController->profileInUse(), false /* emit */, true/* no image */)); if ( ownProfile == NULL ) { return QString("Own profile not found from database") ; } // user wants encrypt the record: replace content with // encrypted content. QList recordReaders ; if ( aRecordReaders ) { recordReaders.append(*aRecordReaders) ; } else { if ( ownProfile->iProfileReaders.size() > 0 ) { recordReaders.append(ownProfile->iProfileReaders) ; } else { delete ownProfile ; return QString("No profiles to encrypt to") ; } } if ( recordReaders.contains(ownProfile->iFingerPrint) == false ) { recordReaders.append(ownProfile->iFingerPrint) ; } delete ownProfile ; ownProfile = NULL ; QByteArray encryptedRecord ; if ( iController->model(). contentEncryptionModel(). encrypt(recordReaders, aRecord.iData, encryptedRecord ) ) { aRecord.iData.clear() ; aRecord.iData.append(encryptedRecord) ; encryptedRecord.clear() ; } else { return "Encryption failed" ; } } bool isRecordNew(false) ; // hmm. record is new if it has no record id. // or if it has but is not found from db. // if it is has no record id, assign it one: if ( aRecord.iRecordId == KNullHash ) { isRecordNew = true ; QByteArray recordIdSource ( QUuid::createUuid ().toByteArray() ) ; // but uuid has less bits than SHA1. bartender, please make it double: recordIdSource.append ( QUuid::createUuid ().toByteArray() ) ; aRecord.iRecordId.calculate ( recordIdSource ) ; } else { // check out if record is in db already QString errorMessage ( this->isRecordNew(aRecord, &isRecordNew )) ; } QByteArray digitalSignature ; QString additionalMetaDataStringToSign( // see similar code in verify method aRecord.iRecordId.toString() + aRecord.iCollectionId.toString() + aRecord.iSenderHash.toString() ) ; QByteArray additionalMetaDataBytesToSign( additionalMetaDataStringToSign.toUtf8()) ; if ( iController->model() .contentEncryptionModel() .sign(iController->profileInUse(), aRecord.iData, digitalSignature, &additionalMetaDataBytesToSign ) == 0 ) { aRecord.iIsSignatureVerified = true ; // yes, we trust self Hash ownNodeHash ( iController->getNode().nodeFingerPrint() ) ; QString errorMessage = this->persistDbRecordIntoDb(aRecord, isRecordNew, digitalSignature, ownNodeHash.iHash160bits[4]) ; if ( errorMessage.length() > 0 ) { return errorMessage ; } // here user is publishing as "brand new" so set bangpath to 0 QList emptyBangPath ; // note how comments get published to address of the profile, // not to addr of the content iController->model().addItemToBePublished(DbRecord, aRecord.iRecordId, emptyBangPath, aRecord.iCollectionId) ; // and send notify to have possible ui-datamodels to be updated. // normally there is 1 or 2 emit contentReceived(aRecord.iRecordId, aRecord.iCollectionId, DbRecord) ; } else { return QString("Sign operation failed") ; } return QString::null ; } QList CaDbRecordModel::searchRecords(const Hash& aFromCollection, const Hash& aById , const quint32 aModifiedAfter, const quint32 aModifiedBefore, const qint64 aByHavingNumberMoreThan, const qint64 aByHavingNumberLessThan, const QString& aBySearchPhrase, const Hash& aBySender, const bool aForPublish ) { LOG_STR("CaDbRecordModel::searchRecords() collection = " + aFromCollection.toString() ) ; QList resultSet ; if ( aFromCollection == KNullHash && aById == KNullHash ) { return resultSet ; } QSqlQuery query(iModel.dataBaseConnection()); bool ret ; QString selectStm = QString("select hash1,hash2,hash3,hash4,hash5," "sender_hash1," "sender_hash2," "sender_hash3," "sender_hash4," "sender_hash5," "time_last_reference,signature,time_of_publish," "data,recvd_from,dbrecord.searchstring,dbrecord.searchnumber," "isencrypted,issignatureverified," "collection_hash1, collection_hash2," "collection_hash3, collection_hash4," "collection_hash5 %1 " "where ") .arg( ( aBySearchPhrase.isEmpty() || iModel.searchModel()->isFTSSupported() == false ) ? " from dbrecord " : " from dbrecord,dbrecord_search " ) ; // if phrase, join also search table if ( aFromCollection != KNullHash ) { selectStm = selectStm + "collection_hash1 = :collection_hash1 " "and collection_hash2 = :collection_hash2 " "and collection_hash3 = :collection_hash3 " "and collection_hash4 = :collection_hash4 " "and collection_hash5 = :collection_hash5 " ; } else { selectStm = selectStm + "1 = 1 " ; } if ( aModifiedAfter != 0 ) { selectStm = selectStm + " and time_of_publish >= :modified_after " ; } if ( aModifiedBefore != std::numeric_limits::max() ) { selectStm = selectStm + " and time_of_publish <= :modified_before " ; } if ( aByHavingNumberMoreThan != std::numeric_limits::min() ) { selectStm = selectStm + " and searchnumber >= :number_more_than " ; } if ( aByHavingNumberLessThan != std::numeric_limits::max() ) { selectStm = selectStm + " and searchnumber <= :number_less_than " ; } if ( aBySender != KNullHash ) { selectStm = selectStm + " and sender_hash1 = :sender_hash1 " " and sender_hash2 = :sender_hash2 " " and sender_hash3 = :sender_hash3 " " and sender_hash4 = :sender_hash4 " " and sender_hash5 = :sender_hash5 " ; } if ( aById != KNullHash ) { selectStm = selectStm + " and hash1 = :hash1 " " and hash2 = :hash2 " " and hash3 = :hash3 " " and hash4 = :hash4 " " and hash5 = :hash5 " ; } if ( !(aBySearchPhrase.isEmpty() || iModel.searchModel()->isFTSSupported() == false ) ) { selectStm = selectStm + " and dbrecord.hash1 = dbrecord_search.docid " " and dbrecord_search.searchstring MATCH :searchphrase " ; } QLOG_STR(selectStm) ; if ( query.prepare(selectStm) == false ) { QLOG_STR("Search statement preparation failure " + selectStm + " " + query.lastError().text() ) ; // return empty resultset. sucks. // in practice possible error causes are syntax errors that // release testing will catch, or database has been // corrupted somehow. in case of corruption we hope that // other tables are corrupted too so user will get meaningful // error messages in addition to these empty resultsets: return resultSet ; } if ( aFromCollection != KNullHash ) { query.bindValue(":collection_hash1", aFromCollection.iHash160bits[0]); query.bindValue(":collection_hash2", aFromCollection.iHash160bits[1]); query.bindValue(":collection_hash3", aFromCollection.iHash160bits[2]); query.bindValue(":collection_hash4", aFromCollection.iHash160bits[3]); query.bindValue(":collection_hash5", aFromCollection.iHash160bits[4]); QLOG_STR(":collection_hash1 " + QString::number(aFromCollection.iHash160bits[0])) ; QLOG_STR(":collection_hash2 " + QString::number(aFromCollection.iHash160bits[1])) ; QLOG_STR(":collection_hash3 " + QString::number(aFromCollection.iHash160bits[2])) ; QLOG_STR(":collection_hash4 " + QString::number(aFromCollection.iHash160bits[3])) ; QLOG_STR(":collection_hash5 " + QString::number(aFromCollection.iHash160bits[4])) ; } if ( aById != KNullHash ) { query.bindValue(":hash1", aById.iHash160bits[0]); query.bindValue(":hash2", aById.iHash160bits[1]); query.bindValue(":hash3", aById.iHash160bits[2]); query.bindValue(":hash4", aById.iHash160bits[3]); query.bindValue(":hash5", aById.iHash160bits[4]); } if ( aModifiedAfter != 0 ) { query.bindValue(":modified_after", aModifiedAfter); QLOG_STR(":modified_after " + QString::number(aModifiedAfter)) ; } if ( aModifiedBefore != std::numeric_limits::max() ) { query.bindValue(":modified_before", aModifiedBefore); QLOG_STR(":modified_before " + QString::number(aModifiedBefore)) ; } if ( aByHavingNumberMoreThan != std::numeric_limits::min() ) { query.bindValue(":number_more_than", aByHavingNumberMoreThan); QLOG_STR(":number_more_than " + QString::number(aByHavingNumberMoreThan)) ; } if ( aByHavingNumberLessThan != std::numeric_limits::max() ) { query.bindValue(":number_less_than", aByHavingNumberLessThan); QLOG_STR(":number_less_than " + QString::number(aByHavingNumberLessThan)) ; } if ( aBySender != KNullHash ) { query.bindValue(":sender_hash1", aBySender.iHash160bits[0]); query.bindValue(":sender_hash2", aBySender.iHash160bits[1]); query.bindValue(":sender_hash3", aBySender.iHash160bits[2]); query.bindValue(":sender_hash4", aBySender.iHash160bits[3]); query.bindValue(":sender_hash5", aBySender.iHash160bits[4]); } if ( aBySearchPhrase.isEmpty() == false && iModel.searchModel()->isFTSSupported() ) { QLOG_STR("Setting :searchphrase " + aBySearchPhrase) ; query.bindValue(":searchphrase", aBySearchPhrase.toUtf8()); } else { QLOG_STR("Not setting :searchphrase " + aBySearchPhrase) ; } QList > recordsToDeleteDueToBadSignature ; QList > recordsToUpdateDueToGoodSignature ; ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; return resultSet ; } else { //select hash1 0 ,hash2 1 ,hash3 2 ,hash4 3 ,hash5 4 ," // "sender_hash1," 5 // "sender_hash2," 6 // "sender_hash3," 7 // "sender_hash4," 8 // "sender_hash5," 9 // "time_last_reference 10 ,signature 11 ,time_of_publish 12 ," // "data 13 ,recvd_from 14 ,searchstring 15 ,searchnumber 16 ," // "isencrypted 17 ,issignatureverified 18 while ( query.next() ) { CaDbRecord* r = new CaDbRecord ; if ( query.isNull(13) == false ) { // there is data r->iData.append(query.value(13).toByteArray()) ; } r->iRecordId = Hash ( query.value(0).toUInt(), query.value(1).toUInt(), query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt() ) ; r->iSenderHash = Hash ( query.value(5).toUInt(), query.value(6).toUInt(), query.value(7).toUInt(), query.value(8).toUInt(), query.value(9).toUInt() ) ; if ( aFromCollection == KNullHash ) { r->iCollectionId = Hash ( query.value(19).toUInt(), query.value(20).toUInt(), query.value(21).toUInt(), query.value(22).toUInt(), query.value(23).toUInt() ) ; } else { r->iCollectionId = aFromCollection ; // must be } r->iIsSignatureVerified = query.value(18).toBool() ; r->iSignature.append ( query.value(11).toByteArray() ) ; if ( r->iIsSignatureVerified == false ) { // try verify if ( tryVerifyRecord(*r, r->iSignature, recordsToUpdateDueToGoodSignature) == false ) { // bad sig: recordsToDeleteDueToBadSignature.append(QPair(r->iRecordId,r->iSenderHash)) ; delete r ; continue ; } } r->iIsEncrypted = query.value(17).toBool() ; // for verification we need the key. .. we may have the key // if we've been dealing with the sender before, or not. // // sender information is only inside content so if that is // encrypted, we need to de-crypt first, so lets go: if ( r->iIsEncrypted && r->iData.length() > 0 && aForPublish == false ) { QByteArray plainTextCaDbRecordData ; if ( iController->model().contentEncryptionModel().decrypt(r->iData, plainTextCaDbRecordData, false) ) { r->iData.clear() ; r->iData.append(qUncompress(plainTextCaDbRecordData)) ; } else { delete r ; r = NULL ; continue ; // skip rest of the loop } } if ( query.isNull(15) == false ) { r->iSearchPhrase = QString::fromUtf8(query.value(15).toByteArray()) ; } if ( query.isNull(16) == false ) { r->iSearchNumber = query.value(16).toLongLong() ; } r->iTimeOfPublish = query.value(12).toUInt() ; if ( r->iIsEncrypted == false && r->iData.length() > 0 && aForPublish == false) { // there is data but not encrypted QByteArray uncompressed ( qUncompress(r->iData) ) ; r->iData.clear() ; r->iData.append(uncompressed) ; } setTimeLastReference(r->iRecordId, QDateTime::currentDateTimeUtc().toTime_t()) ; resultSet.append(r) ; } } query.finish() ; QPair deletee ; foreach ( deletee, recordsToDeleteDueToBadSignature) { deleteRecord(deletee.first,deletee.second) ; } QPair updatee ; foreach ( updatee, recordsToUpdateDueToGoodSignature) { updateRecordVerification(deletee.first,deletee.second,true) ; } // if user asked something else than "by id" and her // query went un-answered, give query to dht query engine // and do this only if it was user-originated query ; // also if user did not specify record id at all, give // query to retrieval engine - it has logic to prune away // overlapping queries so spamming the engine is no problem if ( aForPublish == false && ( ( aById != KNullHash && resultSet.size() == 0 ) || aById == KNullHash ) ) { CaDbRecord::SearchTerms terms ; terms.iFromCollection = aFromCollection; terms.iById = aById ; terms.iModifiedAfter = aModifiedAfter; terms.iModifiedBefore = aModifiedBefore; terms.iByHavingNumberMoreThan = aByHavingNumberMoreThan; terms.iByHavingNumberLessThan = aByHavingNumberLessThan; terms.iBySearchPhrase = aBySearchPhrase ; terms.iBySender = aBySender ; iController->startRetrievingContent ( terms ) ; } return resultSet ; } bool CaDbRecordModel::sentCaDbRecordReceived(CaDbRecord& aRecord, const QByteArray& aSignature, const Hash& aFromNode ) { const QList dummy ; return doHandlepublishedOrSentRecord( aRecord, aSignature, dummy, aFromNode , false) ; } bool CaDbRecordModel::publishedCaDbRecordReceived(CaDbRecord& aRecord, const QByteArray& aSignature, const QList& aBangPath, const Hash& aFromNode) { return doHandlepublishedOrSentRecord( aRecord, aSignature, aBangPath, aFromNode , true ) ; } bool CaDbRecordModel::doHandlepublishedOrSentRecord(CaDbRecord& aRecord, const QByteArray& aSignature, const QList& aBangPath, const Hash& aFromNode, bool aWasPublish) { bool retval = false ; // ok, lets see .. if we have this particular record already in storage bool isRecordNew ( false ) ; bool publicKeyWasFound ( false ) ; quint32 timeOfPrevRecord ( 0 ) ; this->isRecordNew(aRecord, &isRecordNew,&timeOfPrevRecord) ; // it is possible that we already have a more recent version // of the record: if ( isRecordNew == false && timeOfPrevRecord >= aRecord.iTimeOfPublish ) { // already got the record, or more recent record. return true ; } // ok, lets see .. should we verify first. // first, if we have profile, we can verify. // secondly, if we for some odd reason do not have profile now // but have a record in data storage and it is verified to be // ok then lets not discard the old record ; this deliberate decision // here to treat as "more meaningful" a record that is old // but verified, compared new one that is new but one that we // can't verify QByteArray dummy ; if (! iController->model().contentEncryptionModel().PublicKey (aRecord.iSenderHash, dummy) ) { // key of sender was not found from data storage. if record is new, // go ahead and insert it as new, we just don't know if it was from // sender who claimed to have sent it publicKeyWasFound = false ; } else { publicKeyWasFound = true ; } // next step, verify is possible. if ( publicKeyWasFound && aRecord.iSenderHash != iController->profileInUse() ) { QList > recordsToUpdateDueToGoodSignature ; if ( tryVerifyRecord(aRecord, aSignature, recordsToUpdateDueToGoodSignature) ) { aRecord.iIsSignatureVerified = true ; } else { // great, we should have been able to verify, verification // failed -> record is bad QLOG_STR("Verification failed, returning false") ; return false ; } } else { if ( aRecord.iSenderHash == iController->profileInUse() && aWasPublish == true ) { aRecord.iIsSignatureVerified = true ; // trust self } } // ok, we're this far that verification is either done or not // done, put record into db and make a notification about new item // available QString persistErrorMessage ( persistDbRecordIntoDb(aRecord, isRecordNew, aSignature, aFromNode.iHash160bits[4]) ) ; if ( persistErrorMessage.isEmpty() ) { if ( aWasPublish ) { iController->model().addItemToBePublished(DbRecord, aRecord.iRecordId, aBangPath, aRecord.iCollectionId ) ; } emit contentReceived(aRecord.iRecordId, aRecord.iCollectionId, DbRecord) ; retval = true ; } else { QLOG_STR("CaDbRecordModel::persistDbRecordIntoDb: " + persistErrorMessage) ; retval = false ; } return retval ; } void CaDbRecordModel::fillBucket(QList& aSendQueue, const Hash& aStartOfBucket, const Hash& aEndOfBucket, quint32 aLastMutualConnectTime, const Hash& aForNode ) { QSqlQuery query(iModel.dataBaseConnection()); bool ret ; // bucket of database record is determined by collection hash ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5,time_of_publish from dbrecord where collection_hash1 >= :start and collection_hash1 <= :end and time_of_publish > :last_connect_time and time_of_publish < :curr_time and ( recvd_from != :lowbits_of_requester or recvd_from is null ) order by time_of_publish desc " ) ; if ( ret ) { if ( aStartOfBucket == aEndOfBucket ) { // this was "small network situation" e.g. start and end // are the same ; in practice it means that send all data query.bindValue(":start", 0x0); query.bindValue(":end", 0xFFFFFFFF); } else { // normal situation query.bindValue(":start", aStartOfBucket.iHash160bits[0]); query.bindValue(":end", aEndOfBucket.iHash160bits[0]); } query.bindValue(":last_connect_time", aLastMutualConnectTime); query.bindValue(":lowbits_of_requester", aForNode.iHash160bits[4]); // allow 5 minutes clock skew between nodes query.bindValue(":curr_time", QDateTime::currentDateTimeUtc().addSecs(5*60).toTime_t()); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { Hash hashFoundFromDb ( query.value(0).toUInt(), query.value(1).toUInt(), query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt()) ; SendQueueItem recordToSend ; recordToSend.iHash = hashFoundFromDb ; recordToSend.iItemType = DbRecord ; time_t timePublish(query.value(5).toUInt()) ; time_t timeMutual(aLastMutualConnectTime); aSendQueue.append(recordToSend) ; #ifndef WIN32 char formatted_mutual [100] = {0} ; char formatted_found [100] = {0} ; ctime_r(&timePublish,&formatted_found[0] ) ; ctime_r(&timeMutual,&formatted_mutual[0] ) ; LOG_STR2("CaDbRecord bucket mutual %s", formatted_mutual) ; LOG_STR2("CaDbRecord bucket found %s", formatted_found) ; #endif } } return ; } QString CaDbRecordModel::persistDbRecordIntoDb(const CaDbRecord &aRecord, bool aIsNew, const QByteArray& aSignature, quint32 aReceivedFrom ) { bool retval (false); QSqlQuery query(iModel.dataBaseConnection()); QLOG_STR("CaDbRecordModel::persistDbRecordIntoDb is new = " + QString::number(aIsNew)) ; if ( aIsNew ) { // record is new, prepare an insert-statement retval = query.prepare ("insert into dbrecord " "(hash1,hash2,hash3,hash4,hash5," "collection_hash1," "collection_hash2," "collection_hash3," "collection_hash4," "collection_hash5," "sender_hash1," "sender_hash2," "sender_hash3," "sender_hash4," "sender_hash5," "time_last_reference,signature,time_of_publish," "data,recvd_from,searchstring,searchnumber," "isencrypted,issignatureverified) values " "(:hash1,:hash2,:hash3,:hash4,:hash5," ":collection_hash1," ":collection_hash2," ":collection_hash3," ":collection_hash4," ":collection_hash5," ":sender_hash1," ":sender_hash2," ":sender_hash3," ":sender_hash4," ":sender_hash5," ":time_last_reference,:signature,:time_of_publish," ":data,:recvd_from,:searchstring,:searchnumber," ":isencrypted,:issignatureverified)" ) ; } else { // record is old, prepare an update retval = query.prepare ("update dbrecord set " "collection_hash1 = :collection_hash1," "collection_hash2 = :collection_hash2," "collection_hash3 = :collection_hash3," "collection_hash4 = :collection_hash4," "collection_hash5 = :collection_hash5," "time_last_reference = :time_last_reference," "signature = :signature," "time_of_publish = :time_of_publish," "data = :data,recvd_from = :recvd_from," "searchstring = :searchstring," "searchnumber = :searchnumber," "recvd_from = :recvd_from," "isencrypted = :isencrypted " "where hash1=:hash1 and hash2=:hash2 and " "hash3=:hash3 and hash4=:hash4 and hash5=:hash5 and " "sender_hash1 = :sender_hash1 and " "sender_hash2 = :sender_hash2 and " "sender_hash3 = :sender_hash3 and " "sender_hash4 = :sender_hash4 and " "sender_hash5 = :sender_hash5 " ) ; } QLOG_STR("CaDbRecordModel::persistDbRecordIntoDb after prepare retval = " + QString::number(retval) ) ; if ( retval == false ) { QLOG_STR(query.lastError().text()) ; return query.lastError().text() ; } query.bindValue(":hash1", aRecord.iRecordId.iHash160bits[0]); query.bindValue(":hash2", aRecord.iRecordId.iHash160bits[1]); query.bindValue(":hash3", aRecord.iRecordId.iHash160bits[2]); query.bindValue(":hash4", aRecord.iRecordId.iHash160bits[3]); query.bindValue(":hash5", aRecord.iRecordId.iHash160bits[4]); query.bindValue(":collection_hash1", aRecord.iCollectionId.iHash160bits[0]); query.bindValue(":collection_hash2", aRecord.iCollectionId.iHash160bits[1]); query.bindValue(":collection_hash3", aRecord.iCollectionId.iHash160bits[2]); query.bindValue(":collection_hash4", aRecord.iCollectionId.iHash160bits[3]); query.bindValue(":collection_hash5", aRecord.iCollectionId.iHash160bits[4]); query.bindValue(":sender_hash1", aRecord.iSenderHash.iHash160bits[0]); query.bindValue(":sender_hash2", aRecord.iSenderHash.iHash160bits[1]); query.bindValue(":sender_hash3", aRecord.iSenderHash.iHash160bits[2]); query.bindValue(":sender_hash4", aRecord.iSenderHash.iHash160bits[3]); query.bindValue(":sender_hash5", aRecord.iSenderHash.iHash160bits[4]); query.bindValue(":time_last_reference", QDateTime::currentDateTimeUtc().toTime_t()); query.bindValue(":time_of_publish", aRecord.iTimeOfPublish); QString kiloByteMax ( aRecord.iSearchPhrase.left(1024) ) ; // actual column size is 4k if ( kiloByteMax.toUtf8().length() > 4096 ) { query.bindValue(":searchstring", QByteArray()); } else { query.bindValue(":searchstring", kiloByteMax.toUtf8()); } query.bindValue(":searchnumber", aRecord.iSearchNumber); query.bindValue(":data", aRecord.iData); query.bindValue(":isencrypted", aRecord.iIsEncrypted); query.bindValue(":signature", aSignature); query.bindValue(":issignatureverified", aRecord.iIsSignatureVerified); query.bindValue(":recvd_from", aReceivedFrom); if ( query.exec()==false ){ QLOG_STR("query.exec == false") ; return query.lastError().text() ; } else { QLOG_STR("query.exec == true") ; updateFTS(aRecord,aIsNew) ; return QString::null ; // as a sign of success, return empty string } } QString CaDbRecordModel::isRecordNew(const CaDbRecord &aRecord, bool* aResult, quint32* aTimestampOfOldRecord ) { if ( aResult == NULL ) { return "No pointer?" ; } *aResult = false ; bool retval ( false ) ; // need to figure out ourselves QSqlQuery query(iModel.dataBaseConnection()) ; retval = query.prepare("select count(hash1),max(time_of_publish) from dbrecord where " "hash1 = :hash1 and " "hash2 = :hash2 and " "hash3 = :hash3 and " "hash4 = :hash4 and " "hash5 = :hash5 and " "sender_hash1 = :sender_hash1 and " "sender_hash2 = :sender_hash2 and " "sender_hash3 = :sender_hash3 and " "sender_hash4 = :sender_hash4 and " "sender_hash5 = :sender_hash5 ") ; query.bindValue(":hash1", aRecord.iRecordId.iHash160bits[0]); query.bindValue(":hash2", aRecord.iRecordId.iHash160bits[1]); query.bindValue(":hash3", aRecord.iRecordId.iHash160bits[2]); query.bindValue(":hash4", aRecord.iRecordId.iHash160bits[3]); query.bindValue(":hash5", aRecord.iRecordId.iHash160bits[4]); query.bindValue(":sender_hash1", aRecord.iSenderHash.iHash160bits[0]); query.bindValue(":sender_hash2", aRecord.iSenderHash.iHash160bits[1]); query.bindValue(":sender_hash3", aRecord.iSenderHash.iHash160bits[2]); query.bindValue(":sender_hash4", aRecord.iSenderHash.iHash160bits[3]); query.bindValue(":sender_hash5", aRecord.iSenderHash.iHash160bits[4]); retval = query.exec() ; if ( !retval ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; return query.lastError().text() ; } else { if ( query.next() && !query.isNull(0) ) { if ( query.value(0).toInt() == 0 ) { *aResult = true ; // it was not in db already if ( aTimestampOfOldRecord ) { *aTimestampOfOldRecord = 0 ; } } else { if ( aTimestampOfOldRecord && !query.isNull(1)) { quint32 maxTimeOfPublish ( query.value(1).toUInt() ) ; *aTimestampOfOldRecord = maxTimeOfPublish ; } } } } return QString::null ; // success } bool CaDbRecordModel::tryVerifyRecord(CaDbRecord &aRecord, const QByteArray& aSignature, QList >& aListOfGoodSignatures ) { QByteArray key ; quint32 timeStampOfPossibleExistingProfile ( 0 ) ; if ( iController->model() .contentEncryptionModel() .PublicKey(aRecord.iSenderHash, key, &timeStampOfPossibleExistingProfile ) == true ) { // yes, we have key and can verify QString additionalMetaDataStringToSign( // see similar code in publish method aRecord.iRecordId.toString() + aRecord.iCollectionId.toString() + aRecord.iSenderHash.toString() ) ; QByteArray additionalMetaDataBytesToSign( additionalMetaDataStringToSign.toUtf8()) ; if( iController->model() .contentEncryptionModel() .verify(aRecord.iSenderHash, aRecord.iData, aSignature, &additionalMetaDataBytesToSign, false ) ) { aListOfGoodSignatures .append(QPair(aRecord.iRecordId,aRecord.iSenderHash)) ; aRecord.iIsSignatureVerified = true ; return true ; } else { return false ; } } else { // no profile key found return true ; // can't verify, return true anyway } } void CaDbRecordModel::deleteRecord(const Hash& aRecordId, const Hash& aSenderId) { QSqlQuery query(iModel.dataBaseConnection()); query.prepare("delete from " + iDataTableName + " where " "hash1 = :hash1 and " "hash2 = :hash2 and " "hash3 = :hash3 and " "hash4 = :hash4 and " "hash5 = :hash5 and " "sender_hash1 = :sender_hash1 and " "sender_hash2 = :sender_hash2 and " "sender_hash3 = :sender_hash3 and " "sender_hash4 = :sender_hash4 and " "sender_hash5 = :sender_hash5 " ) ; query.bindValue(":hash1", aRecordId.iHash160bits[0]); query.bindValue(":hash2", aRecordId.iHash160bits[1]); query.bindValue(":hash3", aRecordId.iHash160bits[2]); query.bindValue(":hash4", aRecordId.iHash160bits[3]); query.bindValue(":hash5", aRecordId.iHash160bits[4]); query.bindValue(":sender_hash1", aSenderId.iHash160bits[0]); query.bindValue(":sender_hash2", aSenderId.iHash160bits[1]); query.bindValue(":sender_hash3", aSenderId.iHash160bits[2]); query.bindValue(":sender_hash4", aSenderId.iHash160bits[3]); query.bindValue(":sender_hash5", aSenderId.iHash160bits[4]); if ( query.exec() == false ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; } } void CaDbRecordModel::updateRecordVerification(const Hash& aRecordId, const Hash& aSenderId, bool aNewVerificationStatus) { QSqlQuery query(iModel.dataBaseConnection()); query.prepare("update " + iDataTableName + " set issignatureverified = :s where " "hash1 = :hash1 and " "hash2 = :hash2 and " "hash3 = :hash3 and " "hash4 = :hash4 and " "hash5 = :hash5 and " "sender_hash1 = :sender_hash1 and " "sender_hash2 = :sender_hash2 and " "sender_hash3 = :sender_hash3 and " "sender_hash4 = :sender_hash4 and " "sender_hash5 = :sender_hash5 " ) ; query.bindValue(":s", aNewVerificationStatus); query.bindValue(":hash1", aRecordId.iHash160bits[0]); query.bindValue(":hash2", aRecordId.iHash160bits[1]); query.bindValue(":hash3", aRecordId.iHash160bits[2]); query.bindValue(":hash4", aRecordId.iHash160bits[3]); query.bindValue(":hash5", aRecordId.iHash160bits[4]); query.bindValue(":sender_hash1", aSenderId.iHash160bits[0]); query.bindValue(":sender_hash2", aSenderId.iHash160bits[1]); query.bindValue(":sender_hash3", aSenderId.iHash160bits[2]); query.bindValue(":sender_hash4", aSenderId.iHash160bits[3]); query.bindValue(":sender_hash5", aSenderId.iHash160bits[4]); if ( query.exec() == false ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; } } void CaDbRecordModel::updateFTS(const CaDbRecord& aRecord, bool aIsNewRecord ) { if ( iModel.searchModel()->isFTSSupported() == false ) { return ; } if ( aIsNewRecord && aRecord.iSearchPhrase.isEmpty()) { return ; } QSqlQuery q(iModel.dataBaseConnection()) ; bool operation_success ( false ) ; if ( aIsNewRecord == false ) { operation_success= q.prepare("update dbrecord_search set " "searchstring=:searchstring where docid=:hash1") ; } else { operation_success= q.prepare("insert into dbrecord_search(" "docid,searchstring) values (" ":hash1,:searchstring)") ; } if ( operation_success ) { q.bindValue(":hash1", aRecord.iRecordId.iHash160bits[0]); q.bindValue(":searchstring", aRecord.iSearchPhrase.toUtf8()) ; if ( q.exec() == false ) { QLOG_STR(q.lastError().text()) ; } } else { QLOG_STR(q.lastError().text()) ; } return ; } classified-ads-0.13/datamodel/cadbrecordmodel.h000066400000000000000000000304761331670245300215420ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_CADBRECORDMODEL_H #define CLASSIFIED_CADBRECORDMODEL_H #include #include "../mcontroller.h" // because enum from there is needed #include "../net/protocol.h" // for SendQueueItem #include "datamodelbase.h" #include class Hash ; class MModelProtocolInterface ; class CaDbRecord ; /** * @brief This is is part of datamodel for storing database records * * Because classified ads is a distributed database that holds * ads, profiles, private messages and profile comments, the * same storage implementation can be extended to general-purpose * database records. This is the implementation of local storage * for those records. See @ref CaDbRecord for records. This same * API is available via TCL interface with different syntax but * same concepts. */ class CaDbRecordModel : public ModelBase { Q_OBJECT public: CaDbRecordModel(MController *aMController, MModelProtocolInterface &aModel) ; ~CaDbRecordModel() ; /** * @brief method for storing and publishing a database record. * * Database records are published to the network when * persisted. There is separate local storage for * data not meant to be shared at the network but * database records do get published to all nodes * in the network. * * @param aRecord The db record to be published * @param aRecordReaders Optional list of profile fingerprints * to whom the record will be encrypted to. Only those profiles * will be able to read the record. This list is considered only when * @ref CaDbRecord::iIsEncrypted is true. If record is set to * be encrypted, and this list is empty, the readers of the currently * selected profile will be the readers of the record. If profile * is public ( there is no list of readers ) and record is set to * be encrypted then this list must contain at least one profile. * @return empty string if success, or error message */ QString publishDbRecord(CaDbRecord& aRecord, const QList* aRecordReaders = NULL ) ; /** * Method for retrieving db records. See @ref CaDbRecord for records * being fetched. Limiting criteria can be specified using several * optional parameters. Those parameters are considered together using * "AND" operation, meaning they all need to be satisfied at the * same time for a record to be returned. For example, if both "by sender" * and "modified after" parameters are given, result set contains only * records from that given profile and whose publish time is after * given time. * * This may have a side-effect when search terms are broad (like, only * collection specified) and it may be suspected that the search is * not fully served what it comes to potential resultset, this method * may give the query to @ref DbRecordRetrievalEngine that will * spam the network with the query. More records from neighboring network nodes * fitting the search criteria may then start appearing into database. * TCL app that originated the query will receive notifications about * new records but it will still need to use this same method here to * fetch contents of the new records. In particular, if record is queried * using aById parameter and the record is found, then no network-query is * started. * * @param aFromCollection Returns records whose @ref CaDbRecord::iCollectionId * match this parameter. Either this or aById argument must be * given. Specifying only this will return whole collection * that may be huge. * @param aById Returns record whose @ref CaDbRecord::iRecordId matches. Result-set * is either empty or contains one record. If user passes KNullHash * here then value of this argument is simply ignored and search * method will return records fitting criteria stated by other * method arguments like aBySearchPhrase. In theory it is possible * that 2 users end up publishing a record with same id but that * should be fairly rare occasion. * @param aModifiedAfter Returns records that have last been modified after * given time. Time of modification is stored in * @ref CaDbRecord::iTimeOfPublish. * @param aModifiedBefore Returns records that have last been modified before * given time. * @param aByHavingNumberMoreThan Returns records whose * @ref CaDbRecord::iSearchNumber * is more or equal than number given here. * @param aByHavingNumberLessThan Returns records whose * @ref CaDbRecord::iSearchNumber * is less or equal than number given here. * @param aBySearchPhrase Returns records whose * @ref CaDbRecord::iSearchPhrase matches * the string given here, according to rules of sqlite FTS string matching * implementation. * @param aBySender Returns only records published by profile given in this * argument. * @param aForPublish if set to true, data-parts of the records are * returned un-altered from database. Normally records are * de-crypted and un-compressed before getting returned * but if record is meant to be sent to another node, the * bitstream must be exactly the one that got signed. * * @return Pointer array of db records. Caller is responsible for deleting the * returned records. */ QList searchRecords(const Hash& aFromCollection, const Hash& aById = KNullHash, const quint32 aModifiedAfter = 0 , const quint32 aModifiedBefore = std::numeric_limits::max(), const qint64 aByHavingNumberMoreThan = std::numeric_limits::min(), const qint64 aByHavingNumberLessThan = std::numeric_limits::max(), const QString& aBySearchPhrase = QString::null, const Hash& aBySender = KNullHash, const bool aForPublish = false ) ; /** * called by protocol parser when a db record is received * @param aRecord * @param aSignature is digital signature of the payload of * the record * @param aBangPath is list of last nodes where this content * has been, idea is to prevent re-sending content to * somewhere where it has already been * @param aFromNode hash of node sending the record to us * @return true on success */ bool publishedCaDbRecordReceived(CaDbRecord& aRecord, const QByteArray& aSignature, const QList& aBangPath, const Hash& aFromNode) ; /** * called by protocol parser when a record is received by "send" * protocol type * @param aRecord * @param aSignature is digital signature of the payload of * the record * @param aFromNode hash of node sending the record to us * @return true on success */ bool sentCaDbRecordReceived(CaDbRecord& aRecord, const QByteArray& aSignature, const Hash& aFromNode ) ; /** * Method for filling connected peers send queue with items * that we have and that belong to said peers bucket. * * @param aSendQueue is send-queue of the connection that * serves particular node * @param aStartOfBucket is hash where bucket of that peer * starts. In practice it is the hash * of the node itself. * @param aEndOfBucket is hash where bucket of that peer ends. * That in turn depends on network size, * or number of active nodes in the network. * See method @ref NodeModel::bucketEndHash * for details. * @param aLastMutualConnectTime time when node was last in * contact. In practice we'll fill the * bucket items published after this time. */ void fillBucket(QList& aSendQueue, const Hash& aStartOfBucket, const Hash& aEndOfBucket, quint32 aLastMutualConnectTime, const Hash& aForNode ); private: // methods /** * Workhorse of methods @ref sentDbRecordReceived and * @ref publishedDbRecordReceived * @return true on success */ bool doHandlepublishedOrSentRecord(CaDbRecord& aRecord, const QByteArray& aSignature, const QList& aBangPath, const Hash& aFromNode, bool aWasPublish); QString persistDbRecordIntoDb(const CaDbRecord &aRecord, bool aIsNew, const QByteArray& aSignature, quint32 aReceivedFrom ) ; /** * method for checking if db record is in db already. * @param aRecord is the record to check * @param aResult gets set to true/false as result * @param aTimestampOfOldRecord if aResult get set to true, * this gets set to timestamp of previously persisted record */ QString isRecordNew(const CaDbRecord &aRecord, bool* aResult, quint32* aTimestampOfOldRecord = NULL ) ; /** * method tries to verify record. if verification * is ok, it sets @ref CaDbRecord::iIsSignatureVerified to * true value. * * @param aRecord record to verify * @param aSignature signature to verify against. The party * assumed to have signed the record is * @ref CaDbRecord::iSenderHash. * @param aListOfGoodSignatures contains list of records * that verify ok. Method adds record to list if it * is previously not verified and now verifies ok. * @return true if signature was good or there was no profile * to check against. returns false if profile was there but * signature did not verify. */ bool tryVerifyRecord(CaDbRecord& aRecord, const QByteArray& aSignature, QList >& aListOfGoodSignatures ) ; void deleteRecord(const Hash& aRecordId, const Hash& aSenderId) ; void updateRecordVerification(const Hash& aRecordId, const Hash& aSenderId, bool aNewVerificationStatus) ; void updateFTS(const CaDbRecord& aRecord, bool aIsNewRecord ) ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; /** emitted when new record is received */ void contentReceived(const Hash& aHashOfContent, const Hash& aHashOfCollection, const ProtocolItemType aTypeOfReceivedContent) ; } ; #endif classified-ads-0.13/datamodel/calistingmodel.cpp000066400000000000000000000240101331670245300217450ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "calistingmodel.h" #include "camodel.h" #include "mmodelprotocolinterface.h" #include "../log.h" #include "ca.h" #include "mcontroller.h" #include "model.h" CAListingModel::CAListingModel(const Hash& aForumToList, const MModelProtocolInterface &aModel, MController* aController) : iModel(aModel), iItemAndArticleHashRelation(NULL), iController(aController) { iItemAndArticleHashRelation = new QHash() ; connect(this, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; iModel.classifiedAdsModel().installCAObserver(this) ; if ( aForumToList != KNullHash ) { setClassification(aForumToList) ; } iListingHeaderDate = new QStandardItem (tr("Date")) ; ; iListingHeaderSubject = new QStandardItem (tr("Subject")) ; ; } CAListingModel::~CAListingModel() { LOG_STR("~CAListingModel()") ; // by this time ca-model has already been deleted // iModel.classifiedAdsModel().removeCAObserver(this) ; delete iItemAndArticleHashRelation ; delete iListingHeaderDate ; delete iListingHeaderSubject ; } QStandardItemModel* CAListingModel::theCaModel() { return &iCaModel ; } void CAListingModel::setClassification(const Hash& aForumToList ) { LOG_STR2("CAListingModel::setClassification hash %s", qPrintable(aForumToList.toString())) ; iCaModel.clear() ; iItemAndArticleHashRelation->clear() ; iForumToList = aForumToList ; if ( aForumToList != KNullHash ) { QSqlQuery q(iController->model().dataBaseConnection()) ; bool operation_success ; operation_success = q.prepare("select hash1,hash2,hash3,hash4,hash5," "display_name,time_of_publish,reply_to from classified_ad where " "group_hash1=:group_hash1 and group_hash2=:group_hash2 and " "group_hash3=:group_hash3 and group_hash4=:group_hash4 and " "group_hash5=:group_hash5 and jsondata is not null " "order by time_of_publish") ; q.bindValue(":group_hash1", aForumToList.iHash160bits[0]); q.bindValue(":group_hash2", aForumToList.iHash160bits[1]); q.bindValue(":group_hash3", aForumToList.iHash160bits[2]); q.bindValue(":group_hash4", aForumToList.iHash160bits[3]); q.bindValue(":group_hash5", aForumToList.iHash160bits[4]); LOG_STR2("Searching for ads with low-order group-bits %u", aForumToList.iHash160bits[4] ) ; operation_success = q.exec() ; QDateTime d; if ( operation_success ) { while ( q.next() ) { Hash articleFp (q.value(0).toUInt(), q.value(1).toUInt(), q.value(2).toUInt(), q.value(3).toUInt(), q.value(4).toUInt()) ; QString displayName ; if ( q.isNull(5) ) { QString displayName = "" ; } else { displayName = QString::fromUtf8(q.value(5).toByteArray()) ; } quint32 time_of_publish (q.value(6).toUInt()) ; quint32 reply_to (0); bool has_reply_to ; if ( q.isNull(7) ) { has_reply_to = false ; } else { has_reply_to = true ; reply_to = q.value(7).toUInt() ; } QList row_in_model ; QStandardItem* display_name_item = new QStandardItem ( displayName ); display_name_item->setData(articleFp.toQVariant(),Qt::UserRole) ; row_in_model << display_name_item ; d.setTime_t(time_of_publish) ; QStandardItem* date_item = new QStandardItem ( (d.toString(Qt::SystemLocaleShortDate) ) ) ; row_in_model << date_item ; if ( !has_reply_to ) { LOG_STR("Appending row to ca-model") ; iCaModel.invisibleRootItem()->appendRow(row_in_model); } else { QStandardItem* parent = iCaModel.invisibleRootItem() ; if ( iItemAndArticleHashRelation->contains(reply_to) ) { parent = iItemAndArticleHashRelation->value(reply_to) ; parent->appendRow(row_in_model); LOG_STR("Appending row to ca-model") ; } else { // there is parent but it is not found from our index -> display // as top-level item iCaModel.invisibleRootItem()->appendRow(row_in_model); } } iItemAndArticleHashRelation->insert(articleFp.iHash160bits[4], display_name_item) ; } } else { emit error(MController::DbTransactionError, q.lastError().text()); } } iCaModel.setHeaderData(0, Qt::Horizontal, QVariant(tr("Subject"))) ; iCaModel.setHeaderData(1, Qt::Horizontal, QVariant(tr("Date"))) ; } void CAListingModel::newCaReceived(const CA& aNewCa) { LOG_STR("New ad received") ; insertCaIntoModel(aNewCa.iFingerPrint) ; } void CAListingModel::newCaReceived(const Hash& aHashNewCa, const Hash& aHashOfClassification) { LOG_STR2("New ad received by hash, class high-bits = %u", aHashOfClassification.iHash160bits[0]) ; LOG_STR2("Currently listing classification high-bits = %u", iForumToList.iHash160bits[0]) ; if ( iForumToList == aHashOfClassification ) { iController->model().lock() ; insertCaIntoModel(aHashNewCa) ; iController->model().unlock() ; } } bool CAListingModel::insertCaIntoModel(const Hash& aArticleFingerPrint) { bool retval ( false ) ; QSqlQuery q (iController->model().dataBaseConnection()); bool operation_success ; operation_success = q.prepare("select display_name,time_of_publish,reply_to from classified_ad where " "hash1=:hash1 and hash2=:hash2 and " "hash3=:hash3 and hash4=:hash4 and " "hash5=:hash5 and jsondata is not null" ) ; q.bindValue(":hash1", aArticleFingerPrint.iHash160bits[0]); q.bindValue(":hash2", aArticleFingerPrint.iHash160bits[1]); q.bindValue(":hash3", aArticleFingerPrint.iHash160bits[2]); q.bindValue(":hash4", aArticleFingerPrint.iHash160bits[3]); q.bindValue(":hash5", aArticleFingerPrint.iHash160bits[4]); LOG_STR2("Searching for ads with low-order article-bits %u", aArticleFingerPrint.iHash160bits[4] ) ; operation_success = q.exec() ; QDateTime d; if ( operation_success ) { while ( q.next() ) { retval = true ; QString displayName ; if ( q.isNull(0) ) { QString displayName = "" ; } else { displayName = QString::fromUtf8(q.value(0).toByteArray()) ; } quint32 time_of_publish (q.value(1).toUInt()) ; quint32 reply_to (0); bool has_reply_to ; if ( q.isNull(2) ) { has_reply_to = false ; } else { has_reply_to = true ; reply_to = q.value(2).toUInt() ; } QList row_in_model ; QStandardItem* display_name_item = new QStandardItem ( displayName ); display_name_item->setData(aArticleFingerPrint.toQVariant(),Qt::UserRole) ; row_in_model << display_name_item ; d.setTime_t(time_of_publish) ; QStandardItem* date_item = new QStandardItem ( d.toString(Qt::SystemLocaleShortDate) ) ; row_in_model << date_item ; if ( !has_reply_to ) { LOG_STR("Appending row to ca-model from notify") ; iCaModel.invisibleRootItem()->appendRow(row_in_model); } else { QStandardItem* parent = iCaModel.invisibleRootItem() ; if ( iItemAndArticleHashRelation->contains(reply_to) ) { parent = iItemAndArticleHashRelation->value(reply_to) ; parent->appendRow(row_in_model); LOG_STR("Appending row to ca-model from notify") ; } else { // there is parent but it is not found from our index -> display // as top-level item iCaModel.invisibleRootItem()->appendRow(row_in_model); } } iItemAndArticleHashRelation->insert(aArticleFingerPrint.iHash160bits[4], display_name_item) ; } } else { emit error(MController::DbTransactionError, q.lastError().text()); } return retval ; } classified-ads-0.13/datamodel/calistingmodel.h000066400000000000000000000063441331670245300214240ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CALISTINGMODEL_H #define CALISTINGMODEL_H #include #include "../util/hash.h" #include "../mcontroller.h" #include "camodel.h" class BinaryFile ; class Model ; class MController ; /** * @brief Model-class for helping display of classified ads. */ class CAListingModel: public QObject , public ClassifiedAdsModel::CAObserver { Q_OBJECT public: /** * Constructor * @param aForumToList specifies the classification of the ads * to include into model */ CAListingModel(const Hash& aForumToList, const MModelProtocolInterface &aModel, MController* aController ) ; ~CAListingModel() ; /**< Destructor */ /** * method for getting the actual model for view to consume. * ownership of the pointer is not transferred. */ QStandardItemModel* theCaModel() ; /** * method for setting another forum to be listed * @param aForumToList specifies the forum */ void setClassification(const Hash& aForumToList) ; /** * notification method telling abuot newly-persisted * classified ad. From CAObserver. */ virtual void newCaReceived(const CA& aNewCa) ; /** * Notification method telling abuot newly-persisted * classified ad. Called from via controller. */ virtual void newCaReceived(const Hash& aHashNewCa, const Hash& aHashOfClassification) ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: // methods bool insertCaIntoModel(const Hash& aArticleFingerPrint) ; private: // data QStandardItemModel iCaModel ; /**< this model is exposed to UI */ Hash iForumToList ; /**< this model lists exactly one forum at time, given here */ const MModelProtocolInterface &iModel ; /**< datamodel reference */ /** * This qhash contains pointers to items inside iCaModel * but the key in hash is the low-order bits of the fingerprints * of the articles as there seems to be no convenient way * of finding items from model based on fingerprint, only * search seems to be text-based */ QHash* iItemAndArticleHashRelation ; MController *iController ; QStandardItem *iListingHeaderDate ; QStandardItem *iListingHeaderSubject ; } ; #endif classified-ads-0.13/datamodel/camodel.cpp000066400000000000000000001262471331670245300203720ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef WIN32 #define NOMINMAX #include #endif #include "camodel.h" #include "../log.h" #include "../util/hash.h" #include "model.h" #include #include #include "contentencryptionmodel.h" #ifndef WIN32 #include #endif #include "../util/jsonwrapper.h" #include "mmodelprotocolinterface.h" #include "ca.h" #include "profile.h" #include "const.h" #include "searchmodel.h" /** KStrToBeBought name of intent of ad: to be not localized */ const static QString KStrToBeBought("ToBeBought") ; const static QString KStrToBeSold("ToBeSold") ; const static QString KStrToBeGivenAway ("ToBeGivenAway") ; const static QString KStrIsWanted ("IsWanted") ; const static QString KStrToBeRented ("ToBeRented") ; const static QString KStrToBeAnnounced ("ToBeAnnounced") ; /** KStrConcerningCars name of object of ad: to be not localized */ const static QString KStrConcerningCars ("Cars"); const static QString KStrConcerningBoats ("Boats"); const static QString KStrConcerningBikes ("Bikes"); const static QString KStrConcerningOtherVehicles ("OtherVehicles"); const static QString KStrConcerningVehicleParts ("VehicleParts"); const static QString KStrConcerningHabitation ("Habitation"); const static QString KStrConcerningHouseholdAppliances ("HouseholdAppliances"); const static QString KStrConcerningFurniture ("Furniture"); const static QString KStrConcerningClothing ("Clothing"); const static QString KStrConcerningTools ("Tools"); const static QString KStrConcerningSports ("Sports"); const static QString KStrConcerningMusic ("Music"); const static QString KStrConcerningBooks ("Books"); const static QString KStrConcerningMovies ("Movies"); const static QString KStrConcerningAnimals ("Animals"); const static QString KStrConcerningElectronics ("Electronics"); const static QString KStrConcerningJobs ("Jobs"); const static QString KStrConcerningTransportation ("Transportation"); const static QString KStrConcerningServices ("Services"); const static QString KStrConcerningHealthcare ("Healthcare"); const static QString KStrConcerningFoodstuff ("Foodstuff"); const static QString KStrConcerningSoftware ("Software"); const static QString KStrConcerningEvents ("Events"); const static QString KStrConcerningEducation ("Education"); const static QString KStrConcerningFinance ("Finance"); const static QString KStrConcerningJewelry ("Jewelry"); const static QString KStrConcerningReligiousRituals ("ReligiousRituals"); const static QString KStrConcerningPhilosophy ("Philosophy"); ClassifiedAdsModel::ClassifiedAdsModel(MController *aController, MModelProtocolInterface &aModel) : ModelBase("classified_ad",KMaxRowsInTableClassified_Ad,aController,aModel), iNewCaObservers(NULL) { LOG_STR("ClassifiedAdsModel::ClassifiedAdsModel()") ; iNewCaObservers = new QList () ; connect(this, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; initComboBoxTexts() ; } ClassifiedAdsModel::~ClassifiedAdsModel() { LOG_STR("ClassifiedAdsModel::~ClassifiedAdsModel()") ; iController = NULL ; // not owned, just set null delete iNewCaObservers; iNewCaObservers = NULL ; } const QString& ClassifiedAdsModel::purposeOfAdString(PurposeOfAd aPurpose) const { switch ( aPurpose ) { case ToBeBought: return KStrToBeBought ; case ToBeSold: return KStrToBeSold; case ToBeGivenAway: return KStrToBeGivenAway; case IsWanted: return KStrIsWanted; case ToBeRented: return KStrToBeRented; case ToBeAnnounced: return KStrToBeAnnounced; } return KStrToBeAnnounced;// this statement never reached, but makes compiler // happy } QString ClassifiedAdsModel::localizedPurposeOfAdString(PurposeOfAd aPurpose) const { switch ( aPurpose ) { case ToBeBought: return tr("Buying") ; case ToBeSold: return tr("Selling") ; case ToBeGivenAway: return tr("Giving away") ; case IsWanted: return tr("Wanting") ; case ToBeRented: return tr("Renting") ; case ToBeAnnounced: return tr("Announcement") ; } return KStrToBeAnnounced;// this statement never reached, but makes compiler // happy } const QString& ClassifiedAdsModel::concernOfAdString(ConcernOfAd aConcern) const { switch ( aConcern ) { case ConcerningCars: return KStrConcerningCars ; case ConcerningBoats: return KStrConcerningBoats ; case ConcerningBikes: return KStrConcerningBikes ; case ConcerningOtherVehicles: return KStrConcerningOtherVehicles ; case ConcerningVehicleParts: return KStrConcerningVehicleParts ; case ConcerningHabitation: return KStrConcerningHabitation ; case ConcerningHouseholdAppliances: return KStrConcerningHouseholdAppliances ; case ConcerningFurniture: return KStrConcerningFurniture ; case ConcerningClothing: return KStrConcerningClothing ; case ConcerningTools: return KStrConcerningTools ; case ConcerningSports: return KStrConcerningSports ; case ConcerningMusic: return KStrConcerningMusic ; case ConcerningBooks: return KStrConcerningBooks ; case ConcerningMovies: return KStrConcerningMovies ; case ConcerningAnimals: return KStrConcerningAnimals ; case ConcerningElectronics: return KStrConcerningElectronics ; case ConcerningJobs: return KStrConcerningJobs ; case ConcerningTransportation: return KStrConcerningTransportation ; case ConcerningServices: return KStrConcerningServices ; case ConcerningHealthcare: return KStrConcerningHealthcare ; case ConcerningFoodstuff: return KStrConcerningFoodstuff ; case ConcerningSoftware: return KStrConcerningSoftware ; case ConcerningEvents: return KStrConcerningEvents ; case ConcerningEducation: return KStrConcerningEducation ; case ConcerningFinance: return KStrConcerningFinance ; case ConcerningJewelry: return KStrConcerningJewelry ; case ConcerningReligiousRituals: return KStrConcerningReligiousRituals ; case ConcerningPhilosophy: return KStrConcerningPhilosophy ; } // this statement never reached, but changes mood // of the compiler to be less angry return KStrConcerningPhilosophy; } QString ClassifiedAdsModel::localizedConcernOfAdString(ConcernOfAd aConcern) const { switch ( aConcern ) { case ConcerningCars: return tr("Cars") ; case ConcerningBoats: return tr("Boats") ; case ConcerningBikes: return tr("Bikes") ; case ConcerningOtherVehicles: return tr("Other vehicles") ; case ConcerningVehicleParts: return tr("Vehicle parts") ; case ConcerningHabitation: return tr("Habitation") ; case ConcerningHouseholdAppliances: return tr("Household appliances") ; case ConcerningFurniture: return tr("Furniture") ; case ConcerningClothing: return tr("Clothing") ; case ConcerningTools: return tr("Tools") ; case ConcerningSports: return tr("Sports") ; case ConcerningMusic: return tr("Music") ; case ConcerningBooks: return tr("Books") ; case ConcerningMovies: return tr("Movies") ; case ConcerningAnimals: return tr("Animals") ; case ConcerningElectronics: return tr("Electronics") ; case ConcerningJobs: return tr("Jobs") ; case ConcerningTransportation: return tr("Transportation") ; case ConcerningServices: return tr("Services") ; case ConcerningHealthcare: return tr("Healthcare") ; case ConcerningFoodstuff: return tr("Foodstuff") ; case ConcerningSoftware: return tr("Software") ; case ConcerningEvents: return tr("Events") ; case ConcerningEducation: return tr("Education") ; case ConcerningFinance: return tr("Finance") ; case ConcerningJewelry: return tr("Jewelry") ; case ConcerningReligiousRituals: return tr("Religious rituals") ; case ConcerningPhilosophy: return tr("Philosophy") ; } // this statement never reached, but changes mood // of the compiler to be almost cheerful return KStrConcerningPhilosophy; } Hash ClassifiedAdsModel::publishClassifiedAd(const Profile& aPublishingProfile, CA& aAd ) { Hash retval ( KNullHash ) ; QByteArray articleJson ( aAd.asJSon(*iController) ) ; QByteArray signature ; Hash articleFingerPrint ; Hash groupFingerPrint ; bool operation_success ( false ) ; if (aAd.iGroup.length() && articleJson.length() && iController->model().contentEncryptionModel().sign(aPublishingProfile.iFingerPrint, articleJson, signature ) == 0 ) { articleFingerPrint.calculate(articleJson) ; groupFingerPrint.calculate(aAd.iGroup.toUtf8()) ; QSqlQuery ins (iModel.dataBaseConnection()) ; operation_success= ins.prepare("insert into classified_ad(" "hash1,hash2,hash3,hash4,hash5," "group_hash1,group_hash2,group_hash3," "group_hash4,group_hash5," "time_last_reference,time_added," "signature,display_name,time_of_publish," "jsondata,reply_to,time_last_reference) values (" ":hash1,:hash2,:hash3,:hash4,:hash5," ":group_hash1,:group_hash2,:group_hash3," ":group_hash4,:group_hash5," ":time_last_reference,:time_added," ":signature,:display_name,:time_of_publish," ":jsondata,:reply_to,:time_last_reference)") ; if ( operation_success ) { ins.bindValue(":hash1", articleFingerPrint.iHash160bits[0]); ins.bindValue(":hash2", articleFingerPrint.iHash160bits[1]); ins.bindValue(":hash3", articleFingerPrint.iHash160bits[2]); ins.bindValue(":hash4", articleFingerPrint.iHash160bits[3]); ins.bindValue(":hash5", articleFingerPrint.iHash160bits[4]); ins.bindValue(":group_hash1", groupFingerPrint.iHash160bits[0]); ins.bindValue(":group_hash2", groupFingerPrint.iHash160bits[1]); ins.bindValue(":group_hash3", groupFingerPrint.iHash160bits[2]); ins.bindValue(":group_hash4", groupFingerPrint.iHash160bits[3]); ins.bindValue(":group_hash5", groupFingerPrint.iHash160bits[4]); ins.bindValue(":time_last_reference",QDateTime::currentDateTimeUtc().toTime_t()); ins.bindValue(":time_added",QDateTime::currentDateTimeUtc().toTime_t()); ins.bindValue(":signature",signature); ins.bindValue(":display_name",aAd.displayName().toUtf8()); ins.bindValue(":time_of_publish",aAd.iTimeOfPublish); ins.bindValue(":jsondata",articleJson); ins.bindValue(":time_last_reference",QDateTime::currentDateTimeUtc().toTime_t()); if ( aAd.iReplyTo == KNullHash ) { ins.bindValue(":reply_to",QVariant(QVariant::String)); // NULL value } else { ins.bindValue(":reply_to",aAd.iReplyTo.iHash160bits[4]); // put low-order bits there } if ( ( operation_success = ins.exec() ) == false ) { emit error(MController::DbTransactionError, ins.lastError().text()) ; } else { // insert was successful: index the article aAd.iFingerPrint = articleFingerPrint ; iModel.searchModel()->indexClassifiedAd(aAd) ; } } else { QLOG_STR("ca insert failure" + ins.lastError().text()) ; emit error(MController::DbTransactionError, ins.lastError().text()) ; } } if ( operation_success ) { QList emptyBangPath ; iController->model().addItemToBePublished(ClassifiedAdPublish, articleFingerPrint, emptyBangPath ) ; // twist, twist. // // classified ads get published twice. first to content addr, // second time to group controller addr. iController->model().addItemToBePublished(ClassifiedAd2NdAddr, articleFingerPrint, emptyBangPath, groupFingerPrint) ; retval = articleFingerPrint ; iCurrentDbTableRowCount++ ; } return retval ; } bool ClassifiedAdsModel::caDataForPublish(const Hash& aFingerPrint, QByteArray& aResultingCaData, QByteArray& aResultingSignature, QByteArray& aPublicKeyOfPublisher, quint32 *aTimeOfPublish ) { bool retval = false ; QSqlQuery query (iModel.dataBaseConnection()) ; Hash fingerPrintOfPublisherKey; retval = query.prepare ("select jsondata,signature from classified_ad where jsondata is not null and " "hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( retval ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); } retval = query.exec() ; if ( !retval ) { emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(1) ) { aResultingSignature.clear() ; aResultingSignature.append(query.value(1).toByteArray()) ; aResultingCaData.append(query.value(0).toByteArray()) ; CA ca ; if ( ca.fromJSon(aResultingCaData,*iController) ) { if ( aTimeOfPublish ) { *aTimeOfPublish = ca.iTimeOfPublish ; } aPublicKeyOfPublisher.clear() ; aPublicKeyOfPublisher.append(ca.iProfileKey) ; retval = aPublicKeyOfPublisher.size() > 0 ; } } } return retval ; } bool ClassifiedAdsModel::publishedCAReceived(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const QByteArray& aKeyOfPublisher, const unsigned char aFlags, const quint32 aTimeStamp, const Hash& aFromNode ) { return doHandleReceivedCA(aFingerPrint, aContent, aSignature, aBangPath, aKeyOfPublisher, aFlags, aTimeStamp, true, aFromNode ) ; } bool ClassifiedAdsModel::sentCAReceived(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QByteArray& aKeyOfPublisher, const unsigned char aFlags, const quint32 aTimeStamp, const Hash& aFromNode ) { const QList dummy ; return doHandleReceivedCA(aFingerPrint, aContent, aSignature, dummy, aKeyOfPublisher, aFlags, aTimeStamp, false, aFromNode ) ; } bool ClassifiedAdsModel::doHandleReceivedCA(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const QByteArray& aKeyOfPublisher, const unsigned char /*aFlags*/, const quint32 /*aTimeStamp*/, bool aWasPublish, const Hash& aFromNode ) { bool retval ( false ) ; bool hostAlreadyHadContent ( false ) ; bool operation_success(false) ; bool contentWasInserted ( false ) ; QSqlQuery query (iModel.dataBaseConnection()) ; Hash groupFingerPrint ; retval = query.prepare ("select count(jsondata),count(hash1) from classified_ad where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( retval ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); } retval = query.exec() ; int count(0) ; int countOfHashes(0) ; if ( !retval ) { emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) ) { count = query.value(0).toInt() ; countOfHashes = query.value(1).toInt() ; } } QLOG_STR("Saving AD,count of data = " + QString::number(count) + " count of hash 1 = " + QString::number(countOfHashes) + " for hash1 = " + QString::number(aFingerPrint.iHash160bits[0])) ; bool needsToInsert (false) ; if ( countOfHashes > 0 ) { if ( count == 0 ) { // ok, we had the hash in the db but we did not have the content. needsToInsert = true ; QSqlQuery deletia (iModel.dataBaseConnection()) ; deletia.prepare("delete from classified_ad where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5") ; deletia.bindValue(":hash1", aFingerPrint.iHash160bits[0]); deletia.bindValue(":hash2", aFingerPrint.iHash160bits[1]); deletia.bindValue(":hash3", aFingerPrint.iHash160bits[2]); deletia.bindValue(":hash4", aFingerPrint.iHash160bits[3]); deletia.bindValue(":hash5", aFingerPrint.iHash160bits[4]); deletia.exec() ; LOG_STR2("Delete done, rows = %d", deletia.numRowsAffected()); } else { // this is ok situation, we had the content already retval = true ; hostAlreadyHadContent = true ; } } else { needsToInsert = true ; } if ( needsToInsert ) { // content not found -> insert Hash fingerPrintOfPublisher ( iController->model().contentEncryptionModel().hashOfPublicKey(aKeyOfPublisher) ) ; if ( iController->model().contentEncryptionModel().verify(aKeyOfPublisher, aContent, aSignature, NULL, false ) ) { // if we got here then signature in the file did match // they key. iController->model().contentEncryptionModel().insertOrUpdatePublicKey(aKeyOfPublisher, fingerPrintOfPublisher); CA ca; ca.fromJSon(aContent, *iController) ; if ( ca.iProfileKey.size() > 0 && iController->model().contentEncryptionModel().hashOfPublicKey(aKeyOfPublisher) == fingerPrintOfPublisher ) { groupFingerPrint.calculate(ca.iGroup.toUtf8()) ; QSqlQuery ins (iModel.dataBaseConnection()) ; operation_success= ins.prepare("insert into classified_ad(" "hash1,hash2,hash3,hash4,hash5," "group_hash1,group_hash2,group_hash3," "group_hash4,group_hash5," "time_last_reference,time_added," "signature,display_name,time_of_publish," "jsondata,reply_to,recvd_from) values (" ":hash1,:hash2,:hash3,:hash4,:hash5," ":group_hash1,:group_hash2,:group_hash3," ":group_hash4,:group_hash5," ":time_last_reference,:time_added," ":signature,:display_name,:time_of_publish," ":jsondata,:reply_to,:recvd_from)") ; if ( operation_success ) { ins.bindValue(":hash1", aFingerPrint.iHash160bits[0]); ins.bindValue(":hash2", aFingerPrint.iHash160bits[1]); ins.bindValue(":hash3", aFingerPrint.iHash160bits[2]); ins.bindValue(":hash4", aFingerPrint.iHash160bits[3]); ins.bindValue(":hash5", aFingerPrint.iHash160bits[4]); ins.bindValue(":group_hash1", groupFingerPrint.iHash160bits[0]); ins.bindValue(":group_hash2", groupFingerPrint.iHash160bits[1]); ins.bindValue(":group_hash3", groupFingerPrint.iHash160bits[2]); ins.bindValue(":group_hash4", groupFingerPrint.iHash160bits[3]); ins.bindValue(":group_hash5", groupFingerPrint.iHash160bits[4]); ins.bindValue(":time_last_reference",QDateTime::currentDateTimeUtc().toTime_t()); ins.bindValue(":time_added",QDateTime::currentDateTimeUtc().toTime_t()); ins.bindValue(":signature",aSignature); ins.bindValue(":display_name",ca.displayName().toUtf8()); ins.bindValue(":time_of_publish",ca.iTimeOfPublish); ins.bindValue(":jsondata",aContent); ins.bindValue(":recvd_from", aFromNode.iHash160bits[4]); if ( ca.iReplyTo == KNullHash ) { ins.bindValue(":reply_to",QVariant(QVariant::String)); // NULL value } else { ins.bindValue(":reply_to",ca.iReplyTo.iHash160bits[4]); // put low-order bits there } if ( ( operation_success = ins.exec() ) == false ) { emit error(MController::DbTransactionError, ins.lastError().text()) ; } else { retval = true ; // yes, yes contentWasInserted = true ; /* also check that profile key is stored in table profile, it will be referended * later when sending messages to user */ iModel.contentEncryptionModel().insertOrUpdatePublicKey(ca.iProfileKey, ca.iSenderHash, &ca.iSenderName) ; ca.iFingerPrint = aFingerPrint ; iModel.searchModel()->indexClassifiedAd(ca) ; } } else { emit error(MController::DbTransactionError, ins.lastError().text()) ; } } else { LOG_STR("No encryption key inside CA") ; } } else { // signature did not verify.. LOG_STR("CA signature did not verify") ; } } if ( aWasPublish && hostAlreadyHadContent == false && retval == true ) { // re-publish new content until bangpath is full iController->model().addItemToBePublished(ClassifiedAdPublish, aFingerPrint, aBangPath ) ; // twist, twist. // // classified ads get published twice. first to content addr, // second time to group controller addr. iController->model().addItemToBePublished(ClassifiedAd2NdAddr, aFingerPrint, aBangPath, groupFingerPrint) ; } if ( contentWasInserted ) { emit contentReceived(aFingerPrint, groupFingerPrint, ClassifiedAd) ; iCurrentDbTableRowCount++ ; } LOG_STR2("CAModel::published/sentCAReceived out success = %d", (int)retval) ; return retval ; } void ClassifiedAdsModel::installCAObserver(CAObserver* aObserver) { LOG_STR2("Installing new CA observer, this = %lx", (unsigned long) this) ; if ( !iNewCaObservers->contains(aObserver) ) { iNewCaObservers->append(aObserver) ; } } void ClassifiedAdsModel::removeCAObserver(CAObserver* aObserver) { if ( iNewCaObservers->contains(aObserver) ) { iNewCaObservers->removeAll(aObserver) ; } } CA ClassifiedAdsModel::caByHash(const Hash& aFingerPrint) { CA retval ; bool operation_success ; if ( aFingerPrint != KNullHash ) { QSqlQuery query (iModel.dataBaseConnection()) ; operation_success = query.prepare ("select jsondata from classified_ad where " "jsondata is not null and hash1 = :hash1 and hash2 = :hash2 and " "hash3=:hash3 and hash4=:hash4 and hash5=:hash5" ) ; if ( operation_success ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); } operation_success = query.exec() ; if ( !operation_success ) { emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) ) { retval.fromJSon(query.value(0).toByteArray(),*iController) ; retval.iFingerPrint = aFingerPrint ; } } } return retval ; } void ClassifiedAdsModel::reIndexAllAdsIntoFTS() { QList articles ; QSqlQuery query (iModel.dataBaseConnection()) ; bool ret ; query.exec("delete from classified_ad_search") ; ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5 from classified_ad") ; ret = query.exec() ; if ( !ret ) { emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { Hash hashFoundFromDb ( query.value(0).toUInt(), query.value(1).toUInt(), query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt()) ; articles.append(hashFoundFromDb) ; } } foreach ( const Hash& a, articles ) { iModel.searchModel()->indexClassifiedAd( caByHash(a)) ; } } void ClassifiedAdsModel::fillBucket(QList& aSendQueue, const Hash& aStartOfBucket, const Hash& aEndOfBucket, quint32 aLastMutualConnectTime, const Hash& aForNode ) { QSqlQuery query (iModel.dataBaseConnection()) ; bool ret ; ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5 from classified_ad where hash1 >= :start and hash1 <= :end and time_of_publish > :last_connect_time and time_of_publish < :curr_time and jsondata is not null and ( recvd_from != :lowbits_of_requester or recvd_from is null ) order by time_of_publish desc limit 1000" ) ; if ( ret ) { if ( aStartOfBucket == aEndOfBucket ) { // this was "small network situation" e.g. start and end // are the same ; in practice it means that send all data query.bindValue(":start", 0x0); query.bindValue(":end", 0xFFFFFFFF); } else { // normal situation query.bindValue(":start", aStartOfBucket.iHash160bits[0]); query.bindValue(":end", aEndOfBucket.iHash160bits[0]); } query.bindValue(":lowbits_of_requester", aForNode.iHash160bits[4]); query.bindValue(":last_connect_time", aLastMutualConnectTime); // shall a node misbehave (merely by having its clock grossly wrong) // its published works would be sent over and over again and again // if we didn't prevent future times from appearing here: query.bindValue(":curr_time", QDateTime::currentDateTimeUtc().addSecs(5*60).toTime_t()); } ret = query.exec() ; if ( !ret ) { emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { Hash hashFoundFromDb ( query.value(0).toUInt(), query.value(1).toUInt(), query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt()) ; SendQueueItem caToSend ; caToSend.iHash = hashFoundFromDb ; caToSend.iItemType = ClassifiedAd ; aSendQueue.append(caToSend) ; } } } void ClassifiedAdsModel::caListingByClassification(const Hash& aClassificationHash, quint32 aStartDate, quint32 aEndDate, QList >& aResultingArticles, const Hash& aRequestingNode) { QSqlQuery query (iModel.dataBaseConnection()) ; bool ret ; ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5,time_of_publish from classified_ad where group_hash1 = :g1 and group_hash2 = :g2 and group_hash3 = :g3 and group_hash4 = :g4 and group_hash5 = :g5 and time_of_publish >= :startTime and time_of_publish <= :endTime and jsondata is not null and ( recvd_from != :lowbits_of_requester or recvd_from is null ) order by time_of_publish desc limit 1000" ) ; if ( ret ) { query.bindValue(":lowbits_of_requester", aRequestingNode.iHash160bits[4]); query.bindValue(":g1", aClassificationHash.iHash160bits[0]); query.bindValue(":g2", aClassificationHash.iHash160bits[1]); query.bindValue(":g3", aClassificationHash.iHash160bits[2]); query.bindValue(":g4", aClassificationHash.iHash160bits[3]); query.bindValue(":g5", aClassificationHash.iHash160bits[4]); query.bindValue(":startTime", aStartDate); query.bindValue(":endTime", aEndDate); ret = query.exec() ; if ( !ret ) { emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { Hash hashFoundFromDb ( query.value(0).toUInt(), query.value(1).toUInt(), query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt()) ; quint32 ts ( query.value(5).toUInt() ) ; QPair p (hashFoundFromDb,ts) ; aResultingArticles.append(p) ; } } } return ; } bool ClassifiedAdsModel::caListingByClassificationReceived(QList >& aReceivedArticles, const Hash& aRequestingNode, const Hash& aClassification) { // start by figuring out which articles we already have QSqlQuery query (iModel.dataBaseConnection()) ; bool ret ; QByteArray selectStatement ("select hash1,hash2,hash3,hash4,hash5,time_of_publish from classified_ad where group_hash1 = :g1 and group_hash2 = :g2 and group_hash3 = :g3 and group_hash4 = :g4 and group_hash5 = :g5 and jsondata is not null and hash1 in (") ; const QByteArray closingParenthese(")") ; const QByteArray comma(",") ; for ( int i = 0 ; i p ( hashFoundFromDb, tsFromDb ) ; aReceivedArticles.removeAll(p) ; // removes 0 or more } } } // now aReceivedArticles contains only articles that we do not have if ( ret && ( aReceivedArticles.size() > 0 ) ) { LOG_STR2("List of ads: we did not have %d articles", aReceivedArticles.size()) ; quint32 current_time ( QDateTime::currentDateTimeUtc().toTime_t() ) ; QSqlQuery query2 (iModel.dataBaseConnection()) ; ret = query2.exec("begin transaction ;") ; for ( int i = 0 ; ret && i #include "../mcontroller.h" // because enum from there is needed #include "../net/protocol.h" // for SendQueueItem #include "datamodelbase.h" #include class Hash ; class MModelProtocolInterface ; class Profile ; class CA ; /** * @brief This is part of datamodel for storage/retrieval of classified ads. * * This is persistent storage and search and retrieval of objects * that are the classified ads that this program is about. */ class ClassifiedAdsModel : public ModelBase { Q_OBJECT public: /** * In classified ads the ads are classified. The classifications * are defined here, first start about purpose of the ad */ enum PurposeOfAd { ToBeBought=0, /**< buy stuff ad */ ToBeSold=1, /**< stuff for sale -ad */ ToBeGivenAway=2, /**< crown jewels about to be given away here */ IsWanted=3, /**< something is wanted, against payment or not */ ToBeRented=4, /**< rental agreement, both ways */ ToBeAnnounced=5 /**< just announcement about topic */ } ; /** * Another classification for an classified ad: what item/real life * stuff the ad concerns */ enum ConcernOfAd { ConcerningCars=0, /**< is about cars */ ConcerningBoats=1, /**< is about thing floating */ ConcerningBikes=2, /**< is about 2-wheeled cars with no roof */ ConcerningOtherVehicles=3, /**< is about other vehicles like moon rockets */ ConcerningVehicleParts=4, /**< is about (spare) parts for moving things */ ConcerningHabitation=5, /**< is about places of residence */ ConcerningHouseholdAppliances=6, /**< is about machinery of residence */ ConcerningFurniture=7, /**< is about furniture items */ ConcerningClothing=8, /**< is about textiles */ ConcerningTools=9, /**< is about tools */ ConcerningSports=10, /**< is about sports, or items for sport */ ConcerningMusic=11, /**< is about music or notes or instruments etc. */ ConcerningBooks=12, /**< is about books */ ConcerningMovies=13, /**< is about movies */ ConcerningAnimals=14, /**< is about living creatures or accessories */ ConcerningElectronics=15, /**< is about electronics */ ConcerningJobs=16, /**< is about jobs like offers or requests */ ConcerningTransportation=17, /**< is about moving things or persons */ ConcerningServices=18, /**< is about services, any kind */ ConcerningHealthcare=19, /**< is about health-care services or products */ ConcerningFoodstuff=20, /**< is about things edible */ ConcerningSoftware=21, /**< is about computer sw */ ConcerningEvents=22, /**< is about events in time and place */ ConcerningEducation=23, /**< is about education */ ConcerningFinance=24, /**< is about financial services or products */ ConcerningJewelry=25, /**< is about items for accenting ugliness */ ConcerningReligiousRituals=26, /**< is about acts carrying attached meanings */ ConcerningPhilosophy=27 /**< is about meanings */ } ; /** * Classified ads are stored via this class (ClasifiedAdsModel) ; if * other parts of the sw wish to receive notifications about * about ads, here is observer that may be installed with * a method provided below. Method of the observer will be * called while datamodel is lock()ed. */ class CAObserver { /** * notification method telling about newly-persisted * classified ad */ virtual void newCaReceived(const CA& aNewCa) = 0 ; } ; /** * Constructor * @param aMController is application controller * @param aModel is datamodel * @return an instance */ ClassifiedAdsModel(MController *aMController, MModelProtocolInterface &aModel) ; /** destructor */ ~ClassifiedAdsModel() ; /** string returned here is used for constructing hash of the classification */ const QString& purposeOfAdString(PurposeOfAd aPurpose) const ; /** string returned is displayed to user. idea is that when hash of the * classification is constructed, non-localized string from @ref purposeOfAdString * is used and same hash will be obtained regardless of the language used */ QString localizedPurposeOfAdString(PurposeOfAd aPurpose) const ; const QString& concernOfAdString(ConcernOfAd aConcern) const ; QString localizedConcernOfAdString(ConcernOfAd aConcern) const ; /** * sends a classified ads to selected nodes in network for others * to retrieve. * * @param aPublishingProfile is the publishing profile ; it is used to * sign the content * @param aAd is the meat being thrown * @return Fingerprint of the published file or KNullHash if * things went bad. */ Hash publishClassifiedAd( const Profile& aPublishingProfile,CA& aAd ) ; /** * method for getting ca data for publish purpose * @param aTimeOfPublish if non-NULL will have its value * set to publish time of the CA */ bool caDataForPublish(const Hash& aFingerPrint, QByteArray& aResultingCaData, QByteArray& aResultingSignature, QByteArray& aPublicKeyOfPublisher, quint32* aTimeOfPublish = NULL ) ; /** * method for getting CA data for any purpose, like display */ CA caByHash(const Hash& aFingerPrint) ; /** * called by protocol parser when a CA is received due to publish * @param aFingerPrint is the profile @ref Hash received from protocol header * @param aContent is actual ca data * @param aSignature is digital signature of the aContent * @param aBangPath is list of low-order bits of hashes of nodes * where this content has been. This is for preventing * sending content back to nodes where it has already been. * @param aKeyOfPublisher is the key that was used to sign the file. * that is transferred outside file just because the recipient * might not have the key beforehand ; if she does, the existing * key will be used in verifying process. * @param aFlags possible flags telling about encyption and compression * @param aTimeStamp timestamp of file (if encrypted, it must be carried outside..) * @return true on success */ bool publishedCAReceived(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const QByteArray& aKeyOfPublisher, const unsigned char aFlags, const quint32 aTimeStamp, const Hash& aFromNode ) ; /** * called by protocol parser when a CA is received due to send * @param aFingerPrint is the profile @ref Hash received from protocol header * @param aContent is actual ca data * @param aSignature is digital signature of the aContent * @param aKeyOfPublisher is the key that was used to sign the file. * that is transferred outside file just because the recipient * might not have the key beforehand ; if she does, the existing * key will be used in verifying process. * @param aFlags possible flags telling about encyption and compression * @param aTimeStamp timestamp of file (if encrypted, it must be carried outside..) * @return true on success */ bool sentCAReceived(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QByteArray& aKeyOfPublisher, const unsigned char aFlags, const quint32 aTimeStamp, const Hash& aFromNode ) ; /** * method for installing observer for new ads */ void installCAObserver(CAObserver* aObserver) ; /** * method for removing previously installed observer for new ads */ void removeCAObserver(CAObserver* aObserver) ; /** * Method for filling connected peers send queue with items * that we have and that belong to said peers bucket. * * @param aSendQueue is send-queue of the connection that * serves particular node * @param aStartOfBucket is hash where bucket of that peer * starts. In practice it is the hash * of the node itself. * @param aEndOfBucket is hash where bucket of that peer ends. * That in turn depends on network size, * or number of active nodes in the network. * See method @ref NodeModel::bucketEndHash * for details. * @param aLastMutualConnectTime time when node was last in * contact. In practice we'll fill the * bucket items published after this time. */ void fillBucket(QList& aSendQueue, const Hash& aStartOfBucket, const Hash& aEndOfBucket, quint32 aLastMutualConnectTime, const Hash& aForNode ); /** * Method for fetching list of classified ads whose classification * matches given hash. This method produces content of reply to * protocol item KAdsClassifiedAtHash. * * @param aClassificationHash ad classification asked * @param aStartDate start of time period asked * @param aEndDate end of time period asked * @param aResultingArticles A list where results will be appended. * Hash is the CA hash, unsigned is its * timestamp * @param aRequestingNode fingerprint of node making the request */ void caListingByClassification(const Hash& aClassificationHash, quint32 aStartDate, quint32 aEndDate, QList >& aResultingArticles, const Hash& aRequestingNode ) ; /** * method for handling list of classified ads produced by method * @ref caListingByClassification. The thing is that we come to this * method when other node has sent us a list of ads available. * We may want to store the article fingerprints and try to obtain * them (the actual articles) later. For this reason the classified_ads * database table allows null values in content ; that may be fetched * later. Justification for this stupidity of not sending the article * with the hash is bandwidht: there may be a node keeping the list * of articles and rest of the ring keeping the articles. * * This will modify contents of aReceivedArticles to not contain * articles already found from db */ bool caListingByClassificationReceived(QList >& aReceivedArticles, const Hash& aRequestingNode, const Hash& aClassification) ; /** debug method, more or less. reads all ads and feeds them to * indexer */ void reIndexAllAdsIntoFTS() ; const QStringList& aboutComboBoxTexts() const ; /**< returns ui texts */ const QStringList& regardingComboBoxTexts() const ; /**< returns ui texts */ const QStringList& whereComboBoxTexts() const ; /**< returns ui texts */ signals: void error (MController::CAErrorSituation aError, const QString& aExplanation) ; /** emitted when new classified ad is received. * @param aHashOfContent is fingerprint of the article * @param aHashOfClassification fingerprint of classification * @param aTypeOfReceivdContent Type of content. This model mostly emits * ClassifiedAd -types */ void contentReceived(const Hash& aHashOfContent, const Hash& aHashOfClassification, const ProtocolItemType aTypeOfReceivdContent) ; private: // methods /** * this method is called from @ref publishedCAReceived and * also on method where CA that is sent to us is to be * handled */ bool doHandleReceivedCA(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const QByteArray& aKeyOfPublisher, const unsigned char aFlags, const quint32 aTimeStamp, bool aWasPublish, const Hash& aFromNode ) ; /** initializes string lists used for classification comboboxes */ void initComboBoxTexts() ; private: // member variables: QList* iNewCaObservers ; QStringList iAboutComboBoxTexts ; QStringList iRegardingComboBoxTexts ; QStringList iWhereComboBoxTexts ; } ; #endif classified-ads-0.13/datamodel/connectionlistingmodel.cpp000066400000000000000000000147751331670245300235420ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "../log.h" #include "../mcontroller.h" #include "model.h" #include "connectionlistingmodel.h" #include #include ConnectionListingModel::ConnectionListingModel(Model& aModel, MController& aController ) : iModel(aModel), iController(aController), iTimerId(-1) { iTimerId = startTimer(15000) ; // every 15 sec updateModelContents() ; } ConnectionListingModel::~ConnectionListingModel() { LOG_STR("ConnectionListingModel::~ConnectionListingModel") ; if ( iTimerId != -1 ) { killTimer(iTimerId) ; } } void ConnectionListingModel::timerEvent(QTimerEvent * /* event */) { #if QT_VERSION >= 0x050000 // qt5 beginResetModel() ; #endif updateModelContents() ; #if QT_VERSION >= 0x050000 endResetModel() ; #else reset() ; #endif } int ConnectionListingModel::rowCount(const QModelIndex& ) const { return iConnections.size(); } int ConnectionListingModel::columnCount(const QModelIndex& ) const { return 5 ; } QVariant ConnectionListingModel::data(const QModelIndex &index, int role) const { if(!index.isValid()) return QVariant(); if ( role == Qt::UserRole ) { return iConnections.at(index.row()).iNodeFingerPrint.toQVariant() ; } switch ( index.column() ) { case 0: // addr if(role == Qt::DisplayRole) { return iConnections.at(index.row()).iAddr.toString() ; } else { return QVariant(); } break ; case 1: // inbound? if(role == Qt::DisplayRole) { return iConnections.at(index.row()).iIsInBound ; } else { return QVariant(); } break ; case 2: // bytes in if(role == Qt::DisplayRole) { if ( iConnections.at(index.row()).iBytesIn < 1024 ) { return QString::number(iConnections.at(index.row()).iBytesIn) ; } else if ( iConnections.at(index.row()).iBytesIn < (1024*1024) ) { return QString::number(iConnections.at(index.row()).iBytesIn/1024)+"k" ; } else { return QString::number(iConnections.at(index.row()).iBytesIn/(1024*1024))+"M" ; } } else { return QVariant(); } break ; case 3: // bytes out if(role == Qt::DisplayRole) { if ( iConnections.at(index.row()).iBytesOut < 1024 ) { return QString::number(iConnections.at(index.row()).iBytesOut) ; } else if ( iConnections.at(index.row()).iBytesOut < (1024*1024) ) { return QString::number(iConnections.at(index.row()).iBytesOut/1024)+"k" ; } else { return QString::number(iConnections.at(index.row()).iBytesOut/(1024*1024))+"M" ; } } else { return QVariant(); } break ; case 4: // time when opened if(role == Qt::DisplayRole) { QDateTime d ; d.setTime_t(iConnections.at(index.row()).iOpenTime) ; return d.toString(Qt::SystemLocaleShortDate) ; } else { return QVariant(); } break ; default: return QVariant(); // for unknown columns return empty } return QVariant(); } QVariant ConnectionListingModel::headerData ( int section, Qt::Orientation orientation, int role ) const { if (orientation != Qt::Horizontal ) { return QVariant(); } switch ( role ) { case Qt::ToolTipRole: switch ( section ) { case 0: return tr("Peer network address") ; break; case 1: return tr("Inbound connections are those where peer initiated connection") ; break; case 2: return tr("Data transferred from peer to your node") ; break; case 3: return tr("Data transferred to peer from your node") ; break; case 4: return tr("Time when connection was opened") ; break; default: return QVariant(); break ; } break ; case Qt::DisplayRole: switch ( section ) { case 0: return tr("Address") ; break; case 1: return tr("Inbound") ; break ; case 2: return tr("Bytes in") ; break ; case 3: return tr("Bytes out") ; break ; case 4: return tr("Open time") ; break ; default: return QVariant(); } break ; case Qt::SizeHintRole: switch ( section ) { case 0: return QSize(300,25) ; break; case 1: return QSize(50,25) ; break ; case 2: return QSize(50,25) ; break ; case 3: return QSize(50,25) ; break ; case 4: return QSize(50,25) ; break ; default: return QVariant(); } break ; default: return QVariant(); break ; } } void ConnectionListingModel::updateModelContents() { iModel.lock() ; const QList & connections = iModel.getConnections() ; iConnections.clear() ; foreach ( const Connection *c, connections ) { if ( c ) { ConnectionDisplayItem i ; i.iAddr = c->peerAddress() ; i.iIsInBound = c->isInbound() ; i.iBytesIn = c->bytesIn(); i.iBytesOut = c->bytesOut() ; i.iOpenTime = c->getOpenTime() ; iConnections.append(i) ; } } iModel.unlock() ; } classified-ads-0.13/datamodel/connectionlistingmodel.h000066400000000000000000000054341331670245300231770ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CONNECTIONLISTINGMODEL_H #define CONNECTIONLISTINGMODEL_H #include "../mcontroller.h" #include "../net/connection.h" #include class Model ; /** * @brief Model-class for displaying open network connections * This is the underlying data-container of the "network status" * dialog */ class ConnectionListingModel: public QAbstractTableModel { Q_OBJECT public: /** * instead of relaying the connections from Model::iConnections * we keep our local copy of the same stuff here, updating * it as necessary */ typedef struct ConnectionDisplayItemStructure { QHostAddress iAddr ; bool iIsInBound ; unsigned long iBytesIn ; unsigned long iBytesOut ; time_t iOpenTime ; Hash iNodeFingerPrint ; } ConnectionDisplayItem ; ConnectionListingModel(Model& aModel,MController& aController) ; ~ConnectionListingModel() ; virtual int rowCount(const QModelIndex & parent = QModelIndex()) const ; /** * re-implemented from QAbstractTableModel * @return number of columns in view */ virtual int columnCount(const QModelIndex & parent = QModelIndex()) const ; /** * re-implemented from QAbstractListModel * @return data to display in list */ virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const ; virtual QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; protected: // methods /** * for periodical stuff inside datamodel */ void timerEvent(QTimerEvent *event); private: // methods void updateModelContents() ; private: // data Model& iModel ; MController& iController ; QList iConnections ; int iTimerId ; } ; #endif classified-ads-0.13/datamodel/const.h000066400000000000000000000026351331670245300175530ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2016. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CA_CONSTS_H #define CA_CONSTS_H /** * @file const.h * * file for application-wide constants for various purposes */ static const unsigned KMaxRowsInTableNode ( 10000 ) ; static const unsigned KMaxRowsInTableProfile ( 50000 ) ; static const unsigned KMaxRowsInTableProfileComment ( 50000 ) ; static const unsigned KMaxRowsInTableBinaryFile ( 50000 ) ; static const unsigned KMaxRowsInTableClassified_Ad ( 50000 ) ; static const unsigned KMaxRowsInTablePrivate_Message ( 50000 ) ; static const unsigned KMaxRowsInTableDbRecord ( 100000 ) ; #endif classified-ads-0.13/datamodel/contact.cpp000066400000000000000000000076271331670245300204210ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "ca.h" #include "../util/hash.h" #include "../log.h" #include "../util/jsonwrapper.h" #include #include "../mcontroller.h" #include "model.h" #include "contact.h" #include "../net/node.h" static const char *KContactJSonFingerPrint = "fp" ; static const char *KContactJSonNickName = "nick" ; static const char *KContactJSonIsTrusted = "trusted" ; static const int KJSONMsgVersionValue ( 1 ) ; Contact::Contact() : iFingerPrint(KNullHash), iIsTrusted(false) { } Contact::~Contact() { } QByteArray Contact::asJSon(const MController& /*aController*/) const { // first have a map ; that is the top-level JSon-object QMap m ; if ( iFingerPrint != KNullHash ) { m.insert(KContactJSonFingerPrint, iFingerPrint.toString().toUtf8()) ; } if ( iNickName.length() > 0 ) { m.insert(KContactJSonNickName, iNickName.toUtf8()) ; } if ( iIsTrusted ) { m.insert(KContactJSonIsTrusted, iIsTrusted) ; } QVariant j (m); // then put the map inside QVariant and that QByteArray retval ( JSonWrapper::serialize(j) ) ; LOG_STR2("contact %s", qPrintable(QString(retval))) ; return retval ; } bool Contact::fromJSon(const QByteArray &aJSonBytes, const MController& /*aController*/ ) { bool ok; QVariantMap result ( JSonWrapper::parse (aJSonBytes, &ok) ); if (!ok) { return false ; } if ( result.contains(KContactJSonFingerPrint) ) { iFingerPrint.fromString((const unsigned char *)QString::fromUtf8(result[KContactJSonFingerPrint].toByteArray()).toLatin1().constData()) ; } if ( result.contains(KContactJSonNickName) ) { iNickName = QString::fromUtf8(result[KContactJSonNickName].toByteArray()) ; } else { iNickName.clear() ; } if ( result.contains(KContactJSonIsTrusted) ) { iIsTrusted = result[KContactJSonIsTrusted].toBool() ; } return ok ; } QString Contact::displayName() const { QString retval ; if ( iNickName.length() > 0 ) { retval = iNickName ; } else { retval = iFingerPrint.toString() ; } return retval ; } QVariant Contact::asQVariant() const { QMap m ; m.insert(KContactJSonFingerPrint, iFingerPrint.toQVariant()) ; if ( iIsTrusted ) { m.insert(KContactJSonIsTrusted, iIsTrusted) ; } if ( iNickName.length() > 0 ) { m.insert(KContactJSonNickName, iNickName) ; } QVariant j (m) ; return j ; } Contact Contact::fromQVariant(const QVariantMap& aJSonAsQVariant) { Contact c ; if ( aJSonAsQVariant.contains(KContactJSonFingerPrint) ) { c.iFingerPrint.fromQVariant(aJSonAsQVariant[KContactJSonFingerPrint]) ; if ( aJSonAsQVariant.contains(KContactJSonIsTrusted) ) { c.iIsTrusted = aJSonAsQVariant[KContactJSonIsTrusted].toBool() ; } if ( aJSonAsQVariant.contains(KContactJSonNickName) ) { c.iNickName = aJSonAsQVariant[KContactJSonNickName].toString() ; } } return c ; } classified-ads-0.13/datamodel/contact.h000066400000000000000000000043271331670245300200600ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CA_CONTACT_H #define CA_CONTACT_H #include #include "../util/hash.h" // for class Hash class MController ; class Node ; /** * @brief Carrier-class for a profile that is in contacts-list * * Instances of this class are stored and retrieved by controller * directly. Also note @ref ContactsListingModel. */ class Contact { public: Contact() ; /**< constructor */ ~Contact() ; /**< destructor */ /** * method for string that is shown to user about the message. * * @return string to display to user */ QString displayName() const ; QByteArray asJSon(const MController& aController) const ; /**< returns msg data as JSon stream */ bool fromJSon(const QByteArray &aJSonBytes, const MController& aController ) ; /**< parses json into members*/ /** * Method for getting contact as JSon / QVariant */ QVariant asQVariant() const ; /** * reverse of @ref asQVariant() * @return node or NULL if */ static Contact fromQVariant(const QVariantMap& aJSonAsQVariant) ; /** hash of the profile that is presented here */ Hash iFingerPrint ; QString iNickName ; /**< nickname/display-name of contact ; may empty if private profile */ bool iIsTrusted ; /**< In addition to being in contacts-list, this user is also trusted */ } ; #endif classified-ads-0.13/datamodel/contactlistingmodel.cpp000066400000000000000000000171241331670245300230250ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include "../log.h" #include "../mcontroller.h" #include "model.h" #include "contactlistingmodel.h" ContactListingModel::ContactListingModel(Model& aModel, MController& aController ) : iModel(aModel), iController(aController) { } ContactListingModel::~ContactListingModel() { LOG_STR("ContactListingModel::~ContactListingModel") ; } int ContactListingModel::rowCount(const QModelIndex& ) const { return iContacts.size(); } int ContactListingModel::columnCount(const QModelIndex& ) const { return 3 ; // what are the columns? Hash, NickName, trust? } QVariant ContactListingModel::data(const QModelIndex &index, int role) const { if(!index.isValid()) return QVariant(); if ( role == Qt::UserRole ) { return iContacts.at(index.row()).iFingerPrint.toQVariant() ; } switch ( index.column() ) { case 0: // peer hash if(role == Qt::DisplayRole) { return iContacts.at(index.row()).iFingerPrint.toString() ; } else { return QVariant(); } break ; case 1: // nickname if(role == Qt::DisplayRole) { return iContacts.at(index.row()).iNickName ; } else { return QVariant(); } break ; case 2: { // is trusted if(role == Qt::DisplayRole) { if ( iContacts.at(index.row()).iIsTrusted ) { return tr("Yes") ; } else { return tr("Unknown") ; } } else { return QVariant(); } } break ; default: return QVariant(); // for unknown columns return empty } return QVariant(); } QVariant ContactListingModel::headerData ( int section, Qt::Orientation orientation, int role ) const { if (orientation != Qt::Horizontal ) { return QVariant(); } switch ( role ) { case Qt::ToolTipRole: switch ( section ) { case 0: return tr("Actual network address (SHA1) of the contact") ; break; case 1: return tr("Locally given nickname ; user may set her own nickname himself") ; break; case 2: return tr("Public statement if this operator to be trusted in transactions") ; break; default: return QVariant(); break ; } break ; case Qt::DisplayRole: switch ( section ) { case 0: return tr("Address") ; break; case 1: return tr("Nickname") ; break ; case 2: return tr("Publicly trusted") ; break ; default: return QVariant(); } break ; case Qt::SizeHintRole: switch ( section ) { case 0: return QSize(300,25) ; break; case 1: return QSize(450,25) ; break ; case 2: return QSize(30,25) ; break ; default: return QVariant(); } break ; default: return QVariant(); break ; } } void ContactListingModel::newContactAdded(const Contact& aContact) { // todo ; insert in correct order if ( isContactContained(aContact.iFingerPrint) ) { for ( int i ( 0 ) ; i < iContacts.size() ; i++ ) { if ( iContacts.at(i).iFingerPrint == aContact.iFingerPrint ) { iContacts.replace(i,aContact) ; emit dataChanged(createIndex(i,0),createIndex(i,2)) ; return ; } } } else { beginInsertRows(QModelIndex(),iContacts.size(),iContacts.size()) ; iContacts.append(aContact) ; endInsertRows() ; } } void ContactListingModel::removeContact(const Hash& aContact) { for ( int i ( 0 ) ; i < iContacts.size() ; i++ ) { if ( iContacts.at(i).iFingerPrint == aContact ) { beginRemoveRows(QModelIndex(),i,i) ; iContacts.takeAt(i) ; endRemoveRows() ; return ; } } } QVariant ContactListingModel::contactsAsQVariant() const { // for the qvariant to work, the list of contacts needs to be // of type QList so we need to make the contact to be // QVariant QList contactsAsQVariantList ; for ( int i ( 0 ) ; i < iContacts.size() ; i++ ) { contactsAsQVariantList.append ( iContacts.at(i).asQVariant() ) ; } QLOG_STR("ContactListingModel::contactsAsQVariant size = " + QString::number(contactsAsQVariantList .size())) ; return contactsAsQVariantList ; } QList ContactListingModel::trustList() const { QList retval ; foreach (const Contact& c, iContacts) { if ( c.iIsTrusted ) { retval << c.iFingerPrint ; } } return retval ; } void ContactListingModel::setContactsFromQVariant(const QVariantList& aContacts) { #if QT_VERSION >= 0x050000 // qt5 beginResetModel() ; #endif iContacts.clear() ; QLOG_STR("ContactListingModel::setContactsFromQVariant size = " + QString::number(aContacts.size())) ; for ( int i = 0 ; i < aContacts.size() ; i++ ) { iContacts.append(Contact::fromQVariant(aContacts[i].toMap())) ; } // ok, we've loaded the contacts, offer each and every one of // those to display-cache kept by the controller foreach (Contact c, iContacts) { QString fingerprintString(c.iFingerPrint.toString() ) ; QLOG_STR("Offering contact " +fingerprintString + " name = " + c.displayName()) ; ; iController.offerDisplayNameForProfile(c.iFingerPrint, c.displayName()) ; } LOG_STR("offerDisplayNameForProfile finished") ; #if QT_VERSION >= 0x050000 endResetModel() ; #else reset() ; #endif } bool ContactListingModel::isContactContained(const Hash& aFingerPrint) const { for ( int i = iContacts.size()-1 ; i >= 0 ; i-- ) { if ( iContacts[i].iFingerPrint == aFingerPrint ) { return true ; } } return false; } void ContactListingModel::clearContents() { LOG_STR("ContactListingModel::clearContents") ; #if QT_VERSION >= 0x050000 // qt5 beginResetModel() ; #endif iContacts.clear() ; #if QT_VERSION >= 0x050000 endResetModel() ; #else reset() ; #endif } bool ContactListingModel::contactByFingerPrint(const Hash& aFingerPrint, Contact* aResultingContact) const { if ( aResultingContact ) { for ( int i = iContacts.size()-1 ; i >= 0 ; i-- ) { if ( iContacts[i].iFingerPrint == aFingerPrint ) { *aResultingContact = iContacts[i] ; return true ; } } } return false; } classified-ads-0.13/datamodel/contactlistingmodel.h000066400000000000000000000057421331670245300224750ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CONTACTSEARCHMODEL_H #define CONTACTSEARCHMODEL_H #include #include "../util/hash.h" #include "../mcontroller.h" #include "contact.h" class Model ; /** * @brief Model-class for performing search on contact-list contacts * This is supposed to act as an underlying data-container for * an user-interface view (QTableView etc.) */ class ContactListingModel: public QAbstractTableModel { Q_OBJECT public: ContactListingModel(Model& aModel,MController& aController) ; ~ContactListingModel() ; virtual int rowCount(const QModelIndex & parent = QModelIndex()) const ; /** * re-implemented from QAbstractTableModel * @return number of columns in view */ virtual int columnCount(const QModelIndex & parent = QModelIndex()) const ; /** * re-implemented from QAbstractListModel * @return data to display in list */ virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const ; virtual QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const ; void newContactAdded(const Contact& aContact) ; void removeContact(const Hash& aContact) ; /** method for retrieving contact. * @param aFingerPrint tells what to seek * @param aResultingContact will have its field filled if match is made * @return true if contact was found */ bool contactByFingerPrint(const Hash& aFingerPrint, Contact* aResultingContact) const ; /** * whoever calls this method, must set Model.lock() first */ QVariant contactsAsQVariant() const ; void setContactsFromQVariant(const QVariantList& aContacts) ; bool isContactContained(const Hash& aFingerPrint) const ; void clearContents() ; /** * method that returns subset of contacts that are marked as * trusted */ QList trustList() const ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: // data Model& iModel ; MController& iController ; QList iContacts ; } ; #endif classified-ads-0.13/datamodel/contentencryptionmodel.cpp000066400000000000000000001226011331670245300235620ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef WIN32 #define NOMINMAX #include #include #include #include #include #else #include #include // for ntohl #endif #include "contentencryptionmodel.h" #include "../log.h" #include "../util/hash.h" #include "../util/jsonwrapper.h" #include "model.h" #include #include #include #include #include #include #include #include #include #include #include static const char *KJSonEncryptedMessageEkElement = "ek" ; static const char *KJSonEncryptedMessageIvElement = "iv" ; ContentEncryptionModel::ContentEncryptionModel(MController *aController, const MModelProtocolInterface &aModel) : iController(aController), iModel(aModel) { LOG_STR("ContentEncryptionModel::ContentEncryptionModel()") ; connect(this, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; } ContentEncryptionModel::~ContentEncryptionModel() { LOG_STR("ContentEncryptionModel::~ContentEncryptionModel()") ; iController = NULL ; // not owned, just set null } Hash ContentEncryptionModel::generateKeyPair() { Hash retval ; LOG_STR("ContentEncryptionModel::generateKeyPair in") ; EVP_PKEY * pkey (NULL); pkey = EVP_PKEY_new(); RSA * rsa (NULL) ; BIGNUM *bne ( NULL ); int ret = 0 ; bne = BN_new(); unsigned long e = RSA_F4; ret = BN_set_word(bne,e); rsa = RSA_new() ; if ((ret = RSA_generate_key_ex(rsa, 2048, bne, NULL ) ) != 1 ) { QString errmsg(tr("SSL key generation went wrong, calling exit..")) ; emit error(MController::ContentEncryptionError, errmsg) ; BN_free(bne) ; RSA_free(rsa) ; return retval ; } EVP_PKEY_assign_RSA(pkey, rsa); // after this point rsa can't be free'd X509 * x509; x509 = X509_new(); if ( x509 == NULL ) { QString errmsg(tr("x509 cert generation went wrong, calling exit..")) ; emit error(MController::ContentEncryptionError, errmsg) ; return retval ; } ASN1_INTEGER_set(X509_get_serialNumber(x509), 1); // key validity time ; starting from now X509_gmtime_adj(X509_get_notBefore(x509), 0); // and after 100 years someone needs to find a way to // 1) crack this encryption, or // 2) write feature for migrating the stuff to another node with a new cert X509_gmtime_adj(X509_get_notAfter(x509), 60L * 60L * 24L * 365L * (long long)(80+(qrand()%20)) + (long long)((qrand() % 10000)) ); X509_set_pubkey(x509, pkey); X509_NAME * name; name = X509_get_subject_name(x509); const char *countryCode = NULL ; const char *countryCodeFI = "FI" ; // Juice Leskinen const char *countryCodeSE = "SE" ; const char *countryCodeUS = "US" ; switch (rand() % 3 ) { case 0: countryCode = countryCodeFI; break ; case 1: countryCode = countryCodeSE; break ; default: countryCode = countryCodeUS; break ; } char randomName [11] = { 0 }; int nameLen = 5 + (rand() % 5 ) ; for ( int i = 0 ; i < nameLen ; i++ ) { randomName[i] = (char) (65 + ( rand() % 25) ) ; } char domainName [20] = { 0 } ; for ( int i = 0 ; i < 4 ; i++ ) { domainName[i] = (char) (65 + ( rand() % 25) ) ; } strcat (domainName, ".com") ; X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, (unsigned char *)countryCode, -1, -1, 0); X509_NAME_add_entry_by_txt(name, "O", MBSTRING_ASC, (unsigned char *)randomName, -1, -1, 0); X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC, (unsigned char *)domainName, -1, -1, 0); X509_set_issuer_name(x509, name); X509_sign(x509, pkey, EVP_sha1()); BIO *pri = BIO_new(BIO_s_mem()); BIO *pub = BIO_new(BIO_s_mem()); // EVP_bf_cbc() gives blowfish cipher ; is guud?? // at least it allows variable key len so user can enter crap of any len?? if((pri == NULL || pub == NULL ) || (!PEM_write_bio_PrivateKey(pri, pkey, EVP_bf_cbc(), NULL, 0, 0, (void*)qPrintable(iController->contentKeyPasswd())))) { QString errmsg(ERR_reason_error_string(ERR_get_error())) ; QLOG_STR("Write private key: " + errmsg) ; emit error(MController::ContentEncryptionError, errmsg) ; EVP_PKEY_free(pkey) ; X509_free(x509) ; BIO_free(pri) ; BIO_free(pub) ; return retval ; } PEM_write_bio_X509( pub, /* write the certificate to the mem-buf we've opened */ x509 /* our certificate */ ); unsigned char md[EVP_MAX_MD_SIZE]; unsigned int n; const EVP_MD * digest = EVP_get_digestbyname("sha1"); X509_digest(x509, digest, md, &n); retval = Hash(md) ; EVP_PKEY_free(pkey) ; X509_free(x509) ; size_t pri_len = BIO_pending(pri); size_t pub_len = BIO_pending(pub); char *pri_key = (char *)malloc(pri_len + 1); char *pub_key = (char *)malloc(pub_len + 1); BIO_read(pri, pri_key, pri_len); BIO_read(pub, pub_key, pub_len); pri_key[pri_len] = '\0'; pub_key[pub_len] = '\0'; BIO_free(pri) ; BIO_free(pub) ; QByteArray pubKeyBytes(pub_key,pub_len) ; QByteArray priKeyBytes(pri_key,pri_len) ; free(pub_key) ; free(pri_key) ; if ( insertOrUpdatePublicKey(pubKeyBytes,retval) == false || insertOrUpdatePrivateKey(priKeyBytes,retval) == false ) { QString errmsg(tr("RSA Private key key saving went wrong")) ; emit error(MController::ContentEncryptionError, errmsg) ; return KNullHash ; } else { // success return retval ; } } bool ContentEncryptionModel::deleteKeyPair(const Hash& aHash) { bool ret ; QSqlQuery query (iController->model().dataBaseConnection()) ; ret = query.prepare ("delete from profile where hash1=:hash1 and hash2=:hash2 and hash3=:hash3 and hash4=:hash4 and hash5=:hash5" ) ; if ( ret ) { query.bindValue(":hash1", aHash.iHash160bits[0]); query.bindValue(":hash2", aHash.iHash160bits[1]); query.bindValue(":hash3", aHash.iHash160bits[2]); query.bindValue(":hash4", aHash.iHash160bits[3]); query.bindValue(":hash5", aHash.iHash160bits[4]); ret = query.exec() ; QLOG_STR("deleted profile encryption public key " + aHash.toString()) ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()); } else { QSqlQuery query2 (iController->model().dataBaseConnection()) ; ret = query2.prepare ("delete from privatekeys where hash1=:hash1 and hash2=:hash2 and hash3=:hash3 and hash4=:hash4 and hash5=:hash5" ) ; if ( ret ) { query2.bindValue(":hash1", aHash.iHash160bits[0]); query2.bindValue(":hash2", aHash.iHash160bits[1]); query2.bindValue(":hash3", aHash.iHash160bits[2]); query2.bindValue(":hash4", aHash.iHash160bits[3]); query2.bindValue(":hash5", aHash.iHash160bits[4]); } ret = query2.exec() ; if ( !ret ) { QLOG_STR(query2.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query2.lastError().text()); } else { QLOG_STR("deleted profile encryption private key " + aHash.toString()) ; ret = true ; } } } return ret ; } QList ContentEncryptionModel::listKeys(bool aPrivateKeys, char * /*aKeyUidToSearch*/) { QList retval ; if ( aPrivateKeys ) { QSqlQuery query (iController->model().dataBaseConnection()) ; bool ret = query.prepare("select hash1,hash2,hash3,hash4,hash5 from privatekeys") ; if ( ( ret = query.exec() ) == true ) { while ( ret && query.next() ) { quint32 hash1 = query.value(0).toUInt() ; quint32 hash2 = query.value(1).toUInt() ; quint32 hash3 = query.value(2).toUInt() ; quint32 hash4 = query.value(3).toUInt() ; quint32 hash5 = query.value(4).toUInt() ; Hash hashFoundFromDb ( hash1,hash2,hash3,hash4,hash5) ; retval.append(hashFoundFromDb) ; } } if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } } return retval ; } int ContentEncryptionModel::changeKeyPassword(const Hash& aFingerPrint, const QString& aNewPassword) { int retval = -1 ; QByteArray pemBytes ; if ( PrivateKey(aFingerPrint, pemBytes) ) { EVP_PKEY *keyToModify = PrivateKeyFromPem(pemBytes) ; if ( keyToModify ) { // first set new password iController->setContentKeyPasswd(aNewPassword) ; // then update the key into database, this now happens with // the new password that controller has BIO *pri = BIO_new(BIO_s_mem()); if (!PEM_write_bio_PrivateKey(pri, keyToModify, EVP_bf_cbc(), NULL, 0, 0, (void*)qPrintable(iController->contentKeyPasswd()))) { QString errmsg(ERR_reason_error_string(ERR_get_error())) ; emit error(MController::ContentEncryptionError, errmsg) ; } else { size_t pri_len = BIO_pending(pri); char *pri_key = (char *)malloc(pri_len + 1); BIO_read(pri, pri_key, pri_len); pri_key[pri_len] = '\0'; BIO_free(pri) ; QByteArray priKeyBytes(pri_key,pri_len) ; free(pri_key) ; if ( insertOrUpdatePrivateKey(priKeyBytes,aFingerPrint) == false ) { QString errmsg(tr("RSA Private key key saving went wrong")) ; emit error(MController::ContentEncryptionError, errmsg) ; } else { retval = 0 ; } } EVP_PKEY_free(keyToModify) ; } } return retval ; } int ContentEncryptionModel::sign(const Hash& aSigningKey, const QByteArray& aData, QByteArray& aResultingSignature, const QByteArray* aOptionalMetadata) { int retval = -1 ; LOG_STR2("ContentEncryptionModel::sign in, bytesToSign=%d", aData.length()); EVP_MD_CTX *md_ctx = EVP_MD_CTX_create(); unsigned sig_len; unsigned char sig_buf [4096]; int err ; QByteArray pemBytes ; if ( PrivateKey(aSigningKey, pemBytes) ) { EVP_PKEY *keyToUse = PrivateKeyFromPem(pemBytes) ; if ( keyToUse ) { // taken from openssl examples by Eric Young & Sampo Kellomaki /* Do the signature */ EVP_SignInit (md_ctx, EVP_sha1()); EVP_SignUpdate (md_ctx, aData.data(), aData.length()); if ( aOptionalMetadata ) { EVP_SignUpdate (md_ctx, aOptionalMetadata->data(), aOptionalMetadata->length()); } sig_len = sizeof(sig_buf); err = EVP_SignFinal (md_ctx, sig_buf, &sig_len, keyToUse); if (err != 1) { QString errmsg(ERR_reason_error_string(ERR_get_error())) ; emit error(MController::ContentEncryptionError, errmsg) ; } else { aResultingSignature.clear() ; // EVP-functions want unsigned char and unsigned len, where // Q-methods eat signed char and signed length. aResultingSignature.append((const char *)(&sig_buf),(int) sig_len) ; retval = 0 ; } EVP_PKEY_free (keyToUse); } } EVP_MD_CTX_destroy(md_ctx); return retval ; } bool ContentEncryptionModel::verify(const QByteArray& aPemBytesOfSigningKey, const QByteArray& aDataToVerify, const QByteArray& aSignatureToVerify, const QByteArray* aOptionalMetadata, bool emitErrorMessage ) { return doVerify(aPemBytesOfSigningKey, aDataToVerify, aSignatureToVerify, aOptionalMetadata, emitErrorMessage ) ; } bool ContentEncryptionModel::verify(const Hash& aPresumedSigningKey, const QByteArray& aDataToVerify, const QByteArray& aSignatureToVerify, const QByteArray* aOptionalMetadata, bool emitErrorMessage) { bool retval = false ; QByteArray pemBytes ; if ( PublicKey(aPresumedSigningKey, pemBytes) ) { retval = doVerify(pemBytes, aDataToVerify, aSignatureToVerify, aOptionalMetadata, emitErrorMessage ) ; } return retval ; } bool ContentEncryptionModel::doVerify(const QByteArray& aPemBytesOfSigningKey, const QByteArray& aDataToVerify, const QByteArray& aSignatureToVerify, const QByteArray* aOptionalMetadata , bool emitErrorMessage ) { bool retval ( false ) ; if ( aPemBytesOfSigningKey.size() ) { EVP_PKEY *keyToUse = PublicKeyFromPem(aPemBytesOfSigningKey) ; if ( keyToUse ) { EVP_MD_CTX *md_ctx ( EVP_MD_CTX_create() ) ; int err ; /* Verify the signature */ EVP_VerifyInit (md_ctx, EVP_sha1()); EVP_VerifyUpdate (md_ctx, aDataToVerify.data(), aDataToVerify.length()); if ( aOptionalMetadata ) { EVP_VerifyUpdate (md_ctx, aOptionalMetadata->data(), aOptionalMetadata->length()); } err = EVP_VerifyFinal (md_ctx, (const unsigned char *) aSignatureToVerify.data(), aSignatureToVerify.length(), keyToUse); if (err != 1) { if ( emitErrorMessage ) { QString errmsg(ERR_reason_error_string(ERR_get_error())) ; emit error(MController::ContentEncryptionError, errmsg) ; } } else { retval = true ; // ahem } EVP_PKEY_free (keyToUse); EVP_MD_CTX_destroy(md_ctx); } } return retval ; } bool ContentEncryptionModel::encrypt(const QList aRecipients, const QByteArray& aPlainText, QByteArray& aResultingCipherText) { // significant parts of code here is stolen from openssl wiki. bool retval (false) ; // for SealInit EVP_CIPHER_CTX *ctx (EVP_CIPHER_CTX_new()); unsigned char **ek = NULL ; int *ekl(NULL); unsigned char *iv ( (unsigned char *) malloc ( EVP_CIPHER_iv_length(EVP_aes_256_cbc() ) ) ); EVP_PKEY **pubk = NULL ; int nr_of_valid_pubkeys ( 0 ) ; QMap resultJSon ; if ( aRecipients.size() > 0 && aPlainText.length() > 0 && iv ) { EVP_CIPHER_CTX_init(ctx); pubk =( EVP_PKEY ** ) malloc (sizeof(EVP_PKEY *)*aRecipients.size()) ; if ( pubk ) { QByteArray pemBytes ; for ( int i = 0 ; i < aRecipients.size() ; i++ ) { if ( PublicKey(aRecipients[i], pemBytes) ) { EVP_PKEY *keyToUse = PublicKeyFromPem(pemBytes) ; pemBytes.clear() ; if ( keyToUse ) { pubk[nr_of_valid_pubkeys++] = keyToUse ; } } } LOG_STR2("Encrypt nr of valid pubkeys: %d", nr_of_valid_pubkeys); if ( nr_of_valid_pubkeys ) { // we got at least one valid pubkey ek = (unsigned char **)malloc(nr_of_valid_pubkeys) ; ekl = (int*)malloc(sizeof(int)*nr_of_valid_pubkeys) ; if ( ek && ekl) { bool alloc_failure(false) ; int k(0) ; for ( ; k < nr_of_valid_pubkeys; k++ ) { ek[k] = (unsigned char *)malloc(EVP_PKEY_size(pubk[k])) ; if ( ek[k] == NULL ) { alloc_failure = true ; } } if ( alloc_failure == false ) { if (!EVP_SealInit(ctx, EVP_aes_256_cbc(), ek, ekl, iv, pubk, nr_of_valid_pubkeys)) { QString errmsg(ERR_reason_error_string(ERR_get_error())) ; emit error(MController::ContentEncryptionError, errmsg) ; } else { resultJSon.insert(KJSonEncryptedMessageIvElement, QString(QByteArray((const char*)iv, EVP_CIPHER_iv_length(EVP_aes_256_cbc())).toBase64())); QVariantList listOfEncryptionKeys; for ( k = 0 ; k < nr_of_valid_pubkeys; k++ ) { if ( ekl[k] && ek[k] ) { listOfEncryptionKeys.append(QString(QByteArray((const char*)ek[k], ekl[k]).toBase64())) ; LOG_STR2("Ek: %s", qPrintable(QString(QByteArray((const char*)ek[k], ekl[k]).toBase64()))); LOG_STR2("Eklen: %d",ekl[k]); } } resultJSon.insert(KJSonEncryptedMessageEkElement, listOfEncryptionKeys) ; QVariant json (resultJSon); // then put the map inside QVariant and that // may then be serialized in libqjson-0.7 and 0.8 QByteArray cryptoMetaData (JSonWrapper::serialize(json)) ; quint32 metadataLenNwBo ( htonl(cryptoMetaData.length() )) ; aResultingCipherText.append((const char *)&metadataLenNwBo,sizeof(quint32)) ; aResultingCipherText.append(cryptoMetaData) ; cryptoMetaData.clear() ; // only now go on with the actual data as we have keys and iv.. #define FOUR_KBYTES 4096 unsigned char buffer_out[FOUR_KBYTES + EVP_MAX_IV_LENGTH]; int pos ( 0 ) ; int len_out ( 0 ) ; bool failure = false ; while ( pos < aPlainText.size() ) { QByteArray fourKiloByte ( aPlainText.mid(pos,FOUR_KBYTES)) ; LOG_STR2("FourKByteLen: %d",fourKiloByte.length()); if (!EVP_SealUpdate(ctx, buffer_out, &len_out, (const unsigned char*)fourKiloByte.data(), fourKiloByte.length())) { QString errmsg(ERR_reason_error_string(ERR_get_error())) ; emit error(MController::ContentEncryptionError, errmsg) ; failure = true ; break ; } else { pos += FOUR_KBYTES ; LOG_STR2("CipherTextLen: %d",len_out); if ( len_out > 0 ) { aResultingCipherText.append((const char *)buffer_out,len_out) ; } } } if ( failure == false ) { if (!EVP_SealFinal(ctx, buffer_out, &len_out)) { QString errmsg(ERR_reason_error_string(ERR_get_error())) ; emit error(MController::ContentEncryptionError, errmsg) ; } else { LOG_STR2("CipherTextLen final: %d",len_out); retval = true ; if ( len_out > 0 ) { aResultingCipherText.append((const char *)buffer_out,len_out) ; } } } } } // free ek contents? for (k=0 ; k < nr_of_valid_pubkeys; k++ ) { free(ek[k]) ; } free(ek); free(ekl); } for ( int j = 0 ; j < nr_of_valid_pubkeys ; j++ ) { EVP_PKEY_free(pubk[j]) ; } } free(pubk) ; } // if pubk was mallocated ok free(iv) ; EVP_CIPHER_CTX_cleanup(ctx); EVP_CIPHER_CTX_free(ctx); } LOG_STR2("Res = %s", qPrintable(QString(aResultingCipherText))); return retval ; } bool ContentEncryptionModel::decrypt(const QByteArray& aCipherText, QByteArray& aResultingPlainText, bool aEmitErrorOnFailure ) { // Yes, Sir. bool retval ( false ) ; // We have come here with high hopes that we're among the // recipients of ResultingPlainText, right? bool ok; if ( aCipherText.length() > 256 ) { const quint32* lenPtr = (const quint32* ) aCipherText.constData() ; quint32 metaDataLen = ntohl(*lenPtr) ; if ( metaDataLen < (quint32)(aCipherText.length()) ) { QVariantMap result ( JSonWrapper::parse (aCipherText.mid(sizeof(quint32),metaDataLen), &ok) ); if (ok && result.contains(KJSonEncryptedMessageEkElement) && result.contains(KJSonEncryptedMessageIvElement) ) { const QByteArray iv ( QByteArray::fromBase64 (result[KJSonEncryptedMessageIvElement].toByteArray())) ; QVariantList encryptionKeyList( result[KJSonEncryptedMessageEkElement].toList() ) ; // then obtain our private key: QByteArray pemBytes ; if ( PrivateKey(iController->profileInUse(), pemBytes) && iv.length() == EVP_CIPHER_iv_length(EVP_aes_256_cbc())) { EVP_PKEY *myPrivateKey = PrivateKeyFromPem(pemBytes) ; if ( myPrivateKey ) { pemBytes.clear() ; // de-cryption context EVP_CIPHER_CTX *ctx ( EVP_CIPHER_CTX_new() ); // try out each key in array that is in the encrypted document, // if one of those would happen to be for ours.. .. bool keyFound ( false ) ; foreach( QVariant keyVariant, encryptionKeyList) { LOG_STR("Trying private key..") ; const QByteArray key ( QByteArray::fromBase64 (keyVariant.toByteArray()) ) ; EVP_CIPHER_CTX_init(ctx); if (EVP_OpenInit(ctx, EVP_aes_256_cbc(), (const unsigned char *)(key.constData()), key.length(), (const unsigned char *)(iv.constData()), myPrivateKey)) { // yes, success keyFound = true ; break ; // out from foreach-loop } else { // key not found, cleanup context and try again with next key: EVP_CIPHER_CTX_cleanup(ctx); EVP_CIPHER_CTX_init(ctx); } } // foreach key if ( keyFound ) { LOG_STR("Decrypt: key found") ; // allocate space for plaintext: int len_out ( 0 ) ; unsigned char* plainTextPtr = (unsigned char*)malloc(aCipherText.length()-metaDataLen) ; if ( plainTextPtr ) { if (!EVP_OpenUpdate(ctx, plainTextPtr, &len_out, (const unsigned char *)(aCipherText.mid(sizeof(quint32)+metaDataLen).constData()), aCipherText.length()-(sizeof(quint32)+metaDataLen))) { if ( aEmitErrorOnFailure ) { QString errmsg(ERR_reason_error_string(ERR_get_error())) ; emit error(MController::ContentEncryptionError, errmsg) ; } } else { if ( len_out > 0 ) { aResultingPlainText.append((const char *)plainTextPtr,len_out) ; } if ( !EVP_OpenFinal(ctx, plainTextPtr, &len_out) ) { QString errmsg(ERR_reason_error_string(ERR_get_error())) ; emit error(MController::ContentEncryptionError, errmsg) ; } else { retval = true ; if ( len_out > 0 ) { aResultingPlainText.append((const char *)plainTextPtr,len_out) ; } } } free ( plainTextPtr ) ; } // if we got plainTextPtr } else { // too bad dude, you're not in the club.. if ( aEmitErrorOnFailure ) { QString errmsg(tr("No suitable de-cryption key found")) ; emit error(MController::ContentEncryptionError, errmsg) ; } LOG_STR("Decrypt: key not found") ; retval = false ; } EVP_CIPHER_CTX_cleanup(ctx); EVP_CIPHER_CTX_free(ctx); EVP_PKEY_free(myPrivateKey) ; } } } // if parse was ok } // metadata length check } // length check return retval; } bool ContentEncryptionModel::insertOrUpdatePublicKey (const QByteArray& aPublicKey, const Hash& aFingerPrintOfKey, const QString *aDisplayName ) { LOG_STR("ContentEncryptionModel::insertOrUpdatePublicKey() in") ; bool retval = false ; QByteArray dummy ; if ( hashOfPublicKey(aPublicKey) == aFingerPrintOfKey ) { if ( PublicKey(aFingerPrintOfKey, dummy) ) { // key is already in db bool ret ; QSqlQuery query (iController->model().dataBaseConnection()) ; if ( aDisplayName && aDisplayName->length() > 0 ) { ret = query.prepare ("update profile set time_last_reference=:time_last_reference, pubkey = :pubkey,display_name=:display_name where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; } else { ret = query.prepare ("update profile set time_last_reference=:time_last_reference, pubkey = :pubkey where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; } if ( ret ) { query.bindValue(":hash1", aFingerPrintOfKey.iHash160bits[0]); query.bindValue(":hash2", aFingerPrintOfKey.iHash160bits[1]); query.bindValue(":hash3", aFingerPrintOfKey.iHash160bits[2]); query.bindValue(":hash4", aFingerPrintOfKey.iHash160bits[3]); query.bindValue(":hash5", aFingerPrintOfKey.iHash160bits[4]); query.bindValue(":pubkey", aPublicKey); query.bindValue(":time_last_reference", QDateTime::currentDateTimeUtc().toTime_t()); if ( aDisplayName && aDisplayName->length() > 0 ) { query.bindValue(":display_name", *aDisplayName); } } ret = query.exec() ; QLOG_STR("updated public key " + aFingerPrintOfKey.toString()) ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { retval = true ; } } else { // key is brand new bool ret ; QSqlQuery query (iController->model().dataBaseConnection()) ; if ( aDisplayName && aDisplayName->length() > 0 ) { ret = query.prepare ("insert into profile (hash1,hash2,hash3,hash4,hash5,pubkey,time_last_reference,display_name) values (:hash1,:hash2,:hash3,:hash4,:hash5,:pubkey,:time_last_reference,:display_name)" ) ; } else { ret = query.prepare ("insert into profile (hash1,hash2,hash3,hash4,hash5,pubkey,time_last_reference) values (:hash1,:hash2,:hash3,:hash4,:hash5,:pubkey,:time_last_reference)" ) ; } if ( ret ) { query.bindValue(":hash1", aFingerPrintOfKey.iHash160bits[0]); query.bindValue(":hash2", aFingerPrintOfKey.iHash160bits[1]); query.bindValue(":hash3", aFingerPrintOfKey.iHash160bits[2]); query.bindValue(":hash4", aFingerPrintOfKey.iHash160bits[3]); query.bindValue(":hash5", aFingerPrintOfKey.iHash160bits[4]); query.bindValue(":pubkey", aPublicKey); query.bindValue(":time_last_reference", QDateTime::currentDateTimeUtc().toTime_t()); if ( aDisplayName && aDisplayName->length() > 0 ) { query.bindValue(":display_name", *aDisplayName); } } ret = query.exec() ; QLOG_STR("### inserted profile encryption public key " + aFingerPrintOfKey.toString()) ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { retval = true ; } } } return retval ; } bool ContentEncryptionModel::insertOrUpdatePrivateKey (const QByteArray& aPrivateKey, const Hash& aFingerPrintOfKey) { LOG_STR("ContentEncryptionModel::insertOrUpdatePrivateKey() in") ; bool retval = false ; QByteArray dummy ; if ( PrivateKey(aFingerPrintOfKey, dummy) ) { // key is already in db bool ret ; QSqlQuery query (iController->model().dataBaseConnection()) ; ret = query.prepare ("update privatekeys set prikey = :prikey where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( ret ) { query.bindValue(":hash1", aFingerPrintOfKey.iHash160bits[0]); query.bindValue(":hash2", aFingerPrintOfKey.iHash160bits[1]); query.bindValue(":hash3", aFingerPrintOfKey.iHash160bits[2]); query.bindValue(":hash4", aFingerPrintOfKey.iHash160bits[3]); query.bindValue(":hash5", aFingerPrintOfKey.iHash160bits[4]); query.bindValue(":prikey", aPrivateKey); } ret = query.exec() ; QLOG_STR("updated private key " + aFingerPrintOfKey.toString()) ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { retval = true ; } } else { // key is brand new bool ret ; QSqlQuery query (iController->model().dataBaseConnection()) ; ret = query.prepare ("insert into privatekeys (hash1,hash2,hash3,hash4,hash5,prikey) values (:hash1,:hash2,:hash3,:hash4,:hash5,:prikey)" ) ; if ( ret ) { query.bindValue(":hash1", aFingerPrintOfKey.iHash160bits[0]); query.bindValue(":hash2", aFingerPrintOfKey.iHash160bits[1]); query.bindValue(":hash3", aFingerPrintOfKey.iHash160bits[2]); query.bindValue(":hash4", aFingerPrintOfKey.iHash160bits[3]); query.bindValue(":hash5", aFingerPrintOfKey.iHash160bits[4]); query.bindValue(":prikey", aPrivateKey); } ret = query.exec() ; QLOG_STR("inserted private key " + aFingerPrintOfKey.toString()) ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { retval = true ; } } return retval ; } bool ContentEncryptionModel::PublicKey (const Hash& aFingerPrintOfKeyToFind, QByteArray& aPossibleKeyFound, quint32* aTimeStamp ) { bool retval = false ; QLOG_STR("ContentEncryptionModel::PublicKey in " + aFingerPrintOfKeyToFind.toString() ) ; QSqlQuery query (iController->model().dataBaseConnection()) ; bool ret = query.prepare("select pubkey,time_of_publish from profile where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5") ; query.bindValue(":hash1", aFingerPrintOfKeyToFind.iHash160bits[0]); query.bindValue(":hash2", aFingerPrintOfKeyToFind.iHash160bits[1]); query.bindValue(":hash3", aFingerPrintOfKeyToFind.iHash160bits[2]); query.bindValue(":hash4", aFingerPrintOfKeyToFind.iHash160bits[3]); query.bindValue(":hash5", aFingerPrintOfKeyToFind.iHash160bits[4]); if ( ret && (ret = query.exec() ) == true && query.next() ) { // yes, found aPossibleKeyFound = query.value(0).toByteArray() ; if ( aTimeStamp ) { if ( query.isNull(1) ) { *aTimeStamp = 0 ; // we had only profile key, no profile data } else { *aTimeStamp = query.value(1).toUInt() ; } } retval = true ; } if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } return retval ; } bool ContentEncryptionModel::PrivateKey (const Hash& aFingerPrintOfKeyToFind, QByteArray& aPossibleKeyFound) { bool retval = false ; LOG_STR2("ContentEncryptionModel::PrivateKey in %s", qPrintable(aFingerPrintOfKeyToFind.toString())) ; QSqlQuery query (iController->model().dataBaseConnection()) ; bool ret = query.prepare("select prikey from privatekeys where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5") ; query.bindValue(":hash1", aFingerPrintOfKeyToFind.iHash160bits[0]); query.bindValue(":hash2", aFingerPrintOfKeyToFind.iHash160bits[1]); query.bindValue(":hash3", aFingerPrintOfKeyToFind.iHash160bits[2]); query.bindValue(":hash4", aFingerPrintOfKeyToFind.iHash160bits[3]); query.bindValue(":hash5", aFingerPrintOfKeyToFind.iHash160bits[4]); if ( ret && (ret = query.exec() ) == true && query.next() ) { // yes, found aPossibleKeyFound = query.value(0).toByteArray() ; retval = true ; } if ( !ret ) { LOG_STR("Error while doing select prikey from privatekeys where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5") ; emit error(MController::DbTransactionError, query.lastError().text()) ; } LOG_STR2("ContentEncryptionModel::PrivateKey out success =%d", (int)retval ) ; return retval ; } EVP_PKEY *ContentEncryptionModel::PrivateKeyFromPem(const QByteArray& aPemBytes, bool aEmitErrorMessage) { EVP_PKEY* retval = NULL ; BIO *pri = BIO_new(BIO_s_mem()); BIO_write(pri, aPemBytes.data(), aPemBytes.length()); retval = PEM_read_bio_PrivateKey(pri, NULL, NULL, (void*)qPrintable(iController->contentKeyPasswd())); BIO_free(pri) ; if ( !retval ) { long errorCode = ERR_get_error() ; LOG_STR2("PrivateKeyFromPem errorcode = %d", (int)errorCode) ; if ( aEmitErrorMessage ) { QString errmsg(ERR_reason_error_string(errorCode)) ; emit error(MController::BadPassword, errmsg) ; } } return retval ; } EVP_PKEY *ContentEncryptionModel::PublicKeyFromPem(const QByteArray& aPemBytes) { EVP_PKEY* retval = NULL ; X509* x509 = NULL ; BIO *pri = BIO_new(BIO_s_mem()); BIO_write(pri, aPemBytes.data(), aPemBytes.length()); x509 = PEM_read_bio_X509(pri, NULL,NULL,NULL); BIO_free(pri) ; if ( !x509 ) { long errorCode = ERR_get_error() ; LOG_STR2("PublicKeyFromPem errorcode = %d", (int)errorCode) ; QString errmsg(ERR_reason_error_string(errorCode)) ; emit error(MController::BadPassword, errmsg) ; } else { retval=X509_get_pubkey(x509); if (retval == NULL) { long errorCode = ERR_get_error() ; LOG_STR2("PublicKeyFromPem errorcode = %d", (int)errorCode) ; QString errmsg(ERR_reason_error_string(errorCode)) ; emit error(MController::BadPassword, errmsg) ; } X509_free(x509) ; } return retval ; } Hash ContentEncryptionModel::hashOfPublicKey(const QByteArray& aPemBytes) { Hash retval (KNullHash) ; X509* x509 = NULL ; BIO *pri = BIO_new(BIO_s_mem()); BIO_write(pri, aPemBytes.data(), aPemBytes.length()); x509 = PEM_read_bio_X509(pri, NULL,NULL,NULL); BIO_free(pri) ; if ( !x509 ) { long errorCode = ERR_get_error() ; LOG_STR2("PublicKeyFromPem errorcode = %d", (int)errorCode) ; QString errmsg(ERR_reason_error_string(errorCode)) ; emit error(MController::BadPassword, errmsg) ; } else { unsigned char md[EVP_MAX_MD_SIZE]; unsigned int n; const EVP_MD * digest = EVP_get_digestbyname("sha1"); X509_digest(x509, digest, md, &n); retval = Hash(md) ; X509_free(x509) ; } return retval ; } QByteArray ContentEncryptionModel::randomBytes(int aNumberOfBytes) { unsigned char* bytes = reinterpret_cast( malloc(aNumberOfBytes+1) ); if ( bytes ) { RAND_bytes(bytes, aNumberOfBytes) ; QByteArray retval((const char *)bytes,aNumberOfBytes) ; free(bytes) ; return retval ; } else { // memory allocation failed and random bytes would have // been needed: terminate, we're in deep trouble exit(1) ; // keep compiler happy, this line // should not be reached return QByteArray('0',aNumberOfBytes) ; } } classified-ads-0.13/datamodel/contentencryptionmodel.h000066400000000000000000000247071331670245300232370ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti Jarvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_CONTENTENCRYPTIONMODEL_H #define CLASSIFIED_CONTENTENCRYPTIONMODEL_H #include #include "../mcontroller.h" // because enum from there is needed #include "../net/connection.h" #include // for EVP_PKEY class Hash ; class MModelProtocolInterface ; /** * @brief This is content-crypto-operations-specific part of the datamodel. * * This handles encryption keys and encryption operations too. */ class ContentEncryptionModel : public QObject { Q_OBJECT public: ContentEncryptionModel(MController *aMController, const MModelProtocolInterface &aModel ) ; ~ContentEncryptionModel() ; /** * method for generating a new RSA key-pair. * @return Fingerprint of new key, null-key on failure */ Hash generateKeyPair() ; /** * method for permanently deleting keypair (and related data) * @param aHash is fingerprint of the profile to get rid of * @return true on success */ bool deleteKeyPair(const Hash& aHash) ; /** * method for changing password of (private) key. * * Old valid password of aFingerPrint key must be stored * inside controller before this method is called. Upon * successful pwd change, this method will replace the * password stored inside controller with the new one. * * @param aFingerPrint fingerprint of the key that is to have the passwd changed * @return 0 on success */ int changeKeyPassword(const Hash& aFingerPrint, const QString& aNewPassword ) ; /** * for signing content * @param aSigningKey is fingerprint of the private key that * will be used to sign aData * @param aData is octets to sign * @param aResultingSignature will contain resulting digital signature saying * that aSigningKey was most likely present when * aData was sent around.. * @param aOptionalMetadata is optional part of aData that will * be included into octets from which the hash is calculated. * This is because binary blobs have separate content and * metadata but we want't to sign both of them -> 2 separate * signatures is stupid, contatenating content+metadata would * be possible but heap-consuming so lets have a 2nd bytearray * @return 0 on success */ int sign(const Hash& aSigningKey, const QByteArray& aData, QByteArray& aResultingSignature, const QByteArray* aOptionalMetadata = NULL ) ; /** * for verifying content * @return true if aDataToVerify as indeed signed by aPresumedSigningKey */ bool verify(const Hash& aPresumedSigningKey, const QByteArray& aDataToVerify, const QByteArray& aSignatureToVerify, const QByteArray* aOptionalMetadata = NULL, bool emitErrorMessage = true ) ; /** * for verifying content * @return true if aDataToVerify as indeed signed by aPresumedSigningKey */ bool verify(const QByteArray& aPemBytesOfSigningKey, const QByteArray& aDataToVerify, const QByteArray& aSignatureToVerify, const QByteArray* aOptionalMetadata = NULL, bool emitErrorMessage = true ) ; /** * for encrypting content. * @param aRecipients is list of fingerprints for that we wish * to have public keys for ; those fingerprints listed * but having no public key in database will be silently * omitted. If less than 1 valid public key is found, * this method returns false. * @param aPlainText contains the data to encrypt * @param aResultingCipherText on successful completion, this * bytearray will contain the encrypted data ready to * be signed. * @return true on success. */ bool encrypt(const QList aRecipients, const QByteArray& aPlainText, QByteArray& aResultingCipherText) ; /** * Reverse of method @ref ContentEncryptionModel::encrypt. * @param aCipherText contains the data to decrypt using * private key whose fingerprint is returned by * @ref MController::profileInUse method. * @param aResultingCipherText on successful completion, this * bytearray will contain the decryped data ready to * be opened. * @param aEmitErrorOnFailure if true, will emit an error signal * so that UI can respond accordingly. There are situations * where decrypt is likely to fail because selected operator * is not in list of readers and in those obvious cases * we don't want to flood the UI with error messages, so * "false" value is supplied there. * @return true on success. */ bool decrypt(const QByteArray& aCipherText, QByteArray& aResultingPlainText, bool aEmitErrorOnFailure = true ) ; /** * method for retrieving list of private keys ; these * are supposed to have something to with user profiles * we have * @param aPrivateKeys if set to true, returns list of known * private keys * @param aKeyUidToSearch is a string that is matched against * UID:s of keys. If NULL is passed, then all keys are * returned. * @return list of private key fingerprints */ QList listKeys(bool aPrivateKeys, char *aKeyUidToSearch) ; /** * Inserts or updates a public key into storage. * @param aPublicKey Key must be in X509 PEM. * @param aFingerPrintOfKey SHA1 of given key * @param aInsertWasDone output variable ; if set to non-null on calling, * this method will set value of pointed boolean to be true if * a new row was inserted into table * @param true on success */ bool insertOrUpdatePublicKey (const QByteArray& aPublicKey, const Hash& aFingerPrintOfKey, const QString* aDisplayName = NULL ) ; /** * Inserts or updates a pХ•ivate key into storage. * @param aPrivateKey Key must be in PEM-format private key. * @param aFingerPrintOfKey expected fingerprint of aPrivateKey */ bool insertOrUpdatePrivateKey (const QByteArray& aPrivateKey, const Hash& aFingerPrintOfKey) ; /** * Method for finding a public encryption key. * * @param aFingerPrintOfKeyToFind fingerprint of key to seek * @aPossibleKeyFound if key is found, this bytearray will after * return contain the key * @param aTimeStampOfKeyFound pointer to quint32 that, if not null, * will be written to value of time when * associated profile was last published. * If we have only key, no profile, then * 0 will be returned in this parameter. * @return true if key is found */ bool PublicKey (const Hash& aFingerPrintOfKeyToFind, QByteArray& aPossibleKeyFound, quint32 *aTimeStampOfKeyFound = NULL) ; /** * Method for finding a private encryption key. * * @param aFingerPrintOfKeyToFind fingerprint of key to seek * @aPossibleKeyFound if key is found, this bytearray will after * return contain the key * @return true if key is found */ bool PrivateKey (const Hash& aFingerPrintOfKeyToFind, QByteArray& aPossibleKeyFound) ; /** * Method for opening PEM bytes previously obtained using * @ref PrivateKey method. * @param aPemByteArray the key that routine tries to open+return * @aEmitErrorMessage if set to true, will emit() error messages * to application controller to handle. * In profile change situation it hurts. * @return key if success, NULL if error. Caller of this method * is responsible for free()ing the key using EVP_PKEY_free() */ EVP_PKEY *PrivateKeyFromPem(const QByteArray& aPemBytes, bool aEmitErrorMessage = true ) ; /** * Method for opening PEM bytes previously obtained using * @ref PublicKey method. * @param aPemByteArray * @return key if success, NULL if error. Caller of this method * is responsible for free()ing the key using EVP_PKEY_free() */ EVP_PKEY *PublicKeyFromPem(const QByteArray& aPemBytes) ; /** * method for getting x509 fingerprint of a PEM key */ Hash hashOfPublicKey(const QByteArray& aPemBytes) ; /** * method for getting (pseudo) random bytes */ QByteArray randomBytes(int aNumberOfBytes) ; signals: /** * this is not method but signal ; if in error, get emit()ted */ void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: // methods /** * work-horse of verify-methods, * this is called from actual "verify" variants */ bool doVerify(const QByteArray& aPemBytesOfSigningKey, const QByteArray& aDataToVerify, const QByteArray& aSignatureToVerify, const QByteArray* aOptionalMetadata = NULL, bool emitErrorMessage = true ) ; private: // member variables: MController *iController ; const MModelProtocolInterface& iModel ; } ; #endif classified-ads-0.13/datamodel/datamodelbase.cpp000066400000000000000000000137061331670245300215460ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "datamodelbase.h" #include "../log.h" #include #include #include #include "model.h" ModelBase::ModelBase(QString aDataTableName, unsigned aMaxRowsToKeep, MController *aController, MModelProtocolInterface& aModel ) : iDataTableName(aDataTableName), iMaxRowsToKeep(0), iCurrentDbTableRowCount(0), iController(aController), iModel(aModel) { unsigned maxRowsFromDb ( getMaxRowsToKeep() ) ; if ( maxRowsFromDb == 0 ) { setMaxRowsToKeep(aMaxRowsToKeep) ; // side-effectively sets iMaxRowsToKeep } else { iMaxRowsToKeep = maxRowsFromDb ; } updateDbTableRowCount() ; } ModelBase::~ModelBase() { } bool ModelBase::setTimeLastReference(const Hash& aObjectFingerPrint, quint32 aTimeWhenLastReferenced) { QLOG_STR("ModelBase::setTimeLastReference table " + iDataTableName ) ; bool retval (false) ; QSqlQuery query (iModel.dataBaseConnection()) ; retval = query.prepare ("update "+iDataTableName+" set time_last_reference=:time_last_reference where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( retval ) { query.bindValue(":hash1", aObjectFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aObjectFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aObjectFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aObjectFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aObjectFingerPrint.iHash160bits[4]); query.bindValue(":time_last_reference", aTimeWhenLastReferenced); retval = query.exec() ; } if ( !retval ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } return retval ; } unsigned ModelBase::getMaxRowsToKeep() { QSqlQuery query (iModel.dataBaseConnection()) ; bool retval ; unsigned ret ( 0 ) ; retval = query.prepare ("select "+iDataTableName+"_maxrows from settings"); if ( retval && (retval = query.exec()) && query.next ()) { if ( !query.isNull(0) ) { ret = query.value(0).toUInt() ; } } if ( !retval ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } return ret ; } void ModelBase::setMaxRowsToKeep(unsigned aRows) { QSqlQuery query (iModel.dataBaseConnection()) ; bool retval ; retval = query.prepare ("update settings set "+iDataTableName+"_maxrows = :rows"); if ( retval ) { query.bindValue(":rows", aRows) ; retval = query.exec() ; iMaxRowsToKeep = aRows ; } if ( !retval ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } } void ModelBase::updateDbTableRowCount() { QSqlQuery query (iModel.dataBaseConnection()) ; bool retval ; retval = query.prepare ("select count(hash1) from "+iDataTableName); if ( retval && (retval = query.exec()) && query.next ()) { if ( !query.isNull(0) ) { iCurrentDbTableRowCount = query.value(0).toUInt() ; } } if ( !retval ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } QLOG_STR("Rows in db table " + iDataTableName + " = " + QString::number(iCurrentDbTableRowCount)) ; } void ModelBase::truncateDataTableToMaxRows(void) { QLOG_STR("truncateDataTableToMaxRows in, rows in db table " + iDataTableName + " = " + QString::number(iCurrentDbTableRowCount)) ; QSqlQuery q (iModel.dataBaseConnection()) ; q.exec("begin transaction") ; while(iCurrentDbTableRowCount > iMaxRowsToKeep) { if ( deleteOldestDataRowInTable() == false ) { break ; // out of the loop, if this happens we would get eternal loop } } q.exec("commit") ; QLOG_STR("truncateDataTableToMaxRows out, rows in db table " + iDataTableName + " = " + QString::number(iCurrentDbTableRowCount)) ; } bool ModelBase::deleteOldestDataRowInTable() { bool ret = false ; QSqlQuery query (iModel.dataBaseConnection()) ; // odd-looking sqlite-specific operation here. intention is to // delete exactly one row from table. we could delete several but // then we'll lose count because qt documentation says that // numRowsAffected() works only for select statements .. that might // be true for old sqlite versions. anyway, this should work // regardless of sqlite versions ret = query.exec("delete from " + iDataTableName + " where rowid = ( select max(rowid) from (select rowid from " + iDataTableName + " where time_last_reference = ( select min(time_last_reference) from " + iDataTableName + " ) ) ) ") ; if ( ret ) { iCurrentDbTableRowCount-- ; } return ret ; } classified-ads-0.13/datamodel/datamodelbase.h000066400000000000000000000100211331670245300211760ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti Jarvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_DATAMODEL_BASE_H #define CLASSIFIED_DATAMODEL_BASE_H #include #include "../mcontroller.h" // because enum from there is needed class QMutex ; class Hash ; class ContentEncryptionModel ; class MController ; class MModelProtocolInterface ; /** * @brief datamodel-parts common part. this is inherited and contains common funcs * * There are several datamodel parts (profiles, files, ads etc.) that * need some almost-equivalent functions ; this class is an attempt to * provide those with minimal code duplication. */ class ModelBase : public QObject { Q_OBJECT public: /** * Constructor. * * @param aDataTableName specifies the database table where (most) of the * data related to this model-part is stored in * @param aMaxRowsToKeep initial value (from const.h) for max * number of rows to keep in @ref aDataTableName table ; * class will check for modified value in settings table * and if there is any, it will be used. */ ModelBase(QString aDataTableName, unsigned aMaxRowsToKeep, MController* iController, MModelProtocolInterface& aModel ) ; ~ModelBase() ; /** * this method sets time of last reference for an object. * this is supposed to be called in situations where we * know that a human requested the object to be displayed ; * calls from UI layer are natural, also maybe situations * where neighboring node sends a request that can only * result from UI action. * * Reason for the UI-requirement is this: we use the time of * last reference to remove content from database, starting * from data that has not been referenced for some time. */ bool setTimeLastReference(const Hash& aObjectFingerPrint, quint32 aTimeWhenLastReferenced) ; /** * method for controlling table truncation length */ unsigned getMaxRowsToKeep() ; /** * method for controlling table truncation length variable */ void setMaxRowsToKeep(unsigned aRows) ; /** * method that truncates the main data table size to * @ref iCurrentDbTableRowCount rows. This is to be * periodically called, currently via timer in model. */ void truncateDataTableToMaxRows(void) ; /** method for getting initial value for iCurrentDbTableRowCount */ void updateDbTableRowCount() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: // methods virtual bool deleteOldestDataRowInTable() ; protected: /** * name of primary table where data related to each model part is * kept ; in runtime this gets values like "binaryfile" or "profle" */ QString iDataTableName ; /** * max number of rows to keep in db table whose name is in @ref iDataTableName */ unsigned iMaxRowsToKeep ; /** * Number of rows currently on table. This may get incremented by * classes that inherint this class. */ unsigned iCurrentDbTableRowCount ; protected: MController *iController ; MModelProtocolInterface& iModel ; } ; #endif classified-ads-0.13/datamodel/mmodelprotocolinterface.h000066400000000000000000000106261331670245300233440ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef M_MODEL_PROTOCOL_INTERFACE_H #define M_MODEL_PROTOCOL_INTERFACE_H #include #include "../mcontroller.h" #include "netrequestexecutor.h" #include "mmodelprotocolinterface.h" class MNodeModelProtocolInterface ; class ProfileModel ; class BinaryFileModel ; class ClassifiedAdsModel ; class PrivMessageModel ; class ContentEncryptionModel ; class ProfileCommentModel ; class SearchModel ; class CaDbRecordModel ; class TclModel ; class QSqlDatabase ; /** * @brief Pure-virtual interface of datamodel for message parser to use * * This interface is given to incoming-message -parsing part of * networking code. Main reason for existence of this interface * is testability; in unit-test situation we will have mock-up model * behind this interface, in normal situation the normal datamodel. */ class MModelProtocolInterface : public QObject { Q_OBJECT public: /** * method for adding a network request * @param aRequest is the request to add * @return none */ virtual void addNetworkRequest(NetworkRequestExecutor::NetworkRequestQueueItem& aRequest) const = 0 ; /** * thread sync: this claims access to datamodel */ virtual bool lock() = 0 ; /** * thread sync: releases data model to other threads */ virtual void unlock() = 0 ; /** * method for getting node-specific datamodel */ virtual MNodeModelProtocolInterface& nodeModel() const = 0 ; /** * method for getting profile-specific datamodel */ virtual ProfileModel& profileModel() const = 0 ; /** * method for getting blob-specific datamodel */ virtual BinaryFileModel& binaryFileModel() const = 0 ; /** method for getting the ads datamodel */ virtual ClassifiedAdsModel& classifiedAdsModel() const = 0 ; /** method for getting the private message datamodel */ virtual PrivMessageModel& privateMessageModel() const = 0 ; /** method for getting the en/de-cryption part of the datamodel */ virtual ContentEncryptionModel& contentEncryptionModel() const = 0 ; virtual ProfileCommentModel& profileCommentModel() const = 0 ; /**< method for getting the comment datamodel */ virtual SearchModel* searchModel() const = 0 ; /**< method for getting the full text search datamodel */ virtual CaDbRecordModel* caDbRecordModel() const = 0 ; /**< method for getting distributed database model part */ virtual TclModel& tclModel() const = 0 ; /** * Method for opening database connection. Since Qt5.11 database * class can't be shared between threads. * @param aIsFirstTime Optional parameter that, when set to non-NULL * will have its value set to true, if the database did not * exist prior to this call. * * @return Instance of database connection. Caller is responsible * to properly ->close() and call ::removeDatabase() in * correct way. */ virtual QSqlDatabase dataBaseConnection(bool* aIsFirstTime = NULL) = 0 ; /** * Currently open connections. Caller does not own the returned list * and should not try adding/removing items from it. */ virtual const QList & getConnections() const = 0 ; /** * Currently pending network requests. * Even as this returns a pointer, not a reference, * ownership of the list is not transferred ; caller * may modiify content but is not supposed to delete */ virtual QList & getNetRequests() const = 0 ; }; #endif classified-ads-0.13/datamodel/mnodemodelprotocolinterface.h000066400000000000000000000150451331670245300242120ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef M_NODEMODEL_PROTOCOL_INTERFACE_H #define M_NODEMODEL_PROTOCOL_INTERFACE_H #include class Connection ; class QHostAddress ; class Node ; class QSslKey ; class QSslCertificate ; class Hash ; /** * @brief Pure-virtual interface of nodemodel. * * Interface for node-specific part of datamodel. Exists Mainly for testing * purposes. Contains all methods of node-model that are of interest * to parties outside datamodel. See @ref NodeModel. */ class MNodeModelProtocolInterface { public: /** * structure used for communicating lists of nodes to connect * between datamodel and networking parts. Basically these * are nodes but reduced to plain addr/hash. */ typedef struct HostConnectQueueItemStructure { QHostAddress iAddress ; /**< ip addr */ int iPort ; /**< tcp port */ Hash iNodeHash ; /**< fingerprint of node, if known */ bool operator==(const struct HostConnectQueueItemStructure& a) const ; } HostConnectQueueItem ; virtual bool nodeGreetingReceived(Node& aNode , bool aWasInitialGreeting = false ) = 0 ; virtual Hash& nodeFingerPrint() = 0 ; /**< returns fingerprint of this node */ virtual int listenPortOfThisNode() = 0 ; /**< TCP listen port number method */ /** for setting of tcp listen port */ virtual void setListenPortOfThisNode(int port) = 0 ; virtual const QSslCertificate& nodeCert() const = 0 ; /** getter for ssl certificate of SSL sock */ virtual const QSslKey& nodeKey() const = 0 ; virtual QByteArray* getNextItemToSend(Connection& aConnection) = 0 ; virtual Node* nodeByHash(const Hash& aHash) = 0 ; virtual QList* getNodesBeforeHash(const Hash& aHash, unsigned aMaxNodes) = 0 ; virtual void closeOldestInactiveConnection() = 0 ; virtual QList* getNodesAfterHash(const Hash& aHash, unsigned aMaxNodes, int aMaxInactivityMinutes = -1 ) = 0 ; virtual QList getHotAddresses() = 0 ; virtual bool updateNodeLastConnectTimeInDb(Node& aNode) =0 ; virtual QList* getHotNodes(int aMaxNodes) = 0 ; /** * method for adding node reference from broadcast. * this needs difference in handling because in IPv4 * network this typically contains private addr space * addresses that we don't want to permanently store nor * give to others as node-references. * * For making connections inside LANs of organisations * having NATs and firewalls and whatnot this might * still be a handy feature. */ virtual void addNodeFromBroadcast(const Hash& aNodeFingerPrint, const QHostAddress& aAddr, int aPort ) = 0 ; /** * method for adding a node to connection-wishlist. * network connector engine will then later pick them up. * nodemodel will take ownership of the node and delete * the object later. * @return true if connection was queued */ virtual bool addNodeToConnectionWishList(Node* aNode) = 0 ; /** * method for adding a node to connection-wishlist. * network connector engine will then later pick them up. * @return true if connection was queued */ virtual bool addNodeToConnectionWishList(const Hash& aNode) = 0 ; /** * method for getting one node from wishlist. * caller is obliged to delete the node returned. * @return node or null if there is nothing in wishlist */ virtual Node* nextConnectionWishListItem() = 0 ; /** * method for checking if a node is already connected */ virtual bool isNodeAlreadyConnected(const Node& aNode) const = 0 ; /** * Method for checking if a node is already connected. * This version checks only hash, not addresses. */ virtual bool isNodeAlreadyConnected(const Hash& aHash) const = 0 ; /** * Important method regarding churn here. This is called from * @ref Connection class and this method is used to determine * what content belongs to same bucket with the node that * is being served by that Connection. Content in the same bucket * with the node is then sent over to node ; to keep the content * alive in the network. * * Intent here is find bucket size where we have approximately * 20 live nodes in a bucket. * * This is done so that we order the recently-seen nodes by hash * value of the node, then start from the fingerprint of the node * that is asking, and from that point we count to 20. The fingerprint * of the node at position 20 is the end of the bucket. The * fingerprint of the node that asks is the start. * * @param aFingerPrintOfNodeAsking fingerprint of node that wants to * have its bucket filled * @return Ending-address of the nodes bucket. */ virtual Hash bucketEndHash(const Hash& aFingerPrintOfNodeAsking) = 0 ; /** * updates last mutual connect time, used for deciding what content * to send automatically upon node connect */ virtual bool updateNodeLastMutualConnectTimeInDb(const Hash& aNodeFp, quint32 aTime ) = 0 ; /** called from settings dialog */ virtual void setDnsName(QString aName) = 0 ; /** called from settings dialog and own node construction */ virtual QString getDnsName() = 0 ; /** used to offer node to list of recently failed connections. * this model maintains a list of such nodes and tries to * not immediately re-connect a recently failed node */ virtual void offerNodeToRecentlyFailedList(const Hash& aFailedNodeHash) = 0 ; }; #endif classified-ads-0.13/datamodel/model.cpp000066400000000000000000002130201331670245300200500ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "model.h" #include "../log.h" #include #include #include #include #include #include #include "../util/hash.h" #include #include #include #include #include #include "../net/connection.h" #include "../net/protocol_message_formatter.h" #include "../net/node.h" #include "../net/networklistener.h" #include "netrequestexecutor.h" #include "contentencryptionmodel.h" #include "profilemodel.h" #include // library init #include // OpenSSL_add_all_algorithms #include // random seed things #include "binaryfilemodel.h" #include "camodel.h" #include "privmsgmodel.h" #include "profilecommentmodel.h" #include "searchmodel.h" #include "cadbrecordmodel.h" #include "trusttreemodel.h" #include #include #include #ifdef WIN32 #include #include #endif #include "tclmodel.h" Model::Model(MController *aController) : iController(aController), iMutex(NULL), iConnections(NULL), iNodeModel(NULL), iNetReqExecutor(NULL), iNetReqQueue(NULL), iContentEncryptionModel(NULL), iProfileModel(NULL), iBinaryFileModel(NULL), iCaModel(NULL), iTimerId(-1), iPrivMsgModel(NULL), iProfileCommentModel(NULL), iSearchModel(NULL), iCaDbRecordModel(NULL), iTrustTreeModel(NULL), iTimeOfLastNetworkAddrCheck(QDateTime::currentDateTimeUtc().toTime_t()), iTclModel(NULL) { LOG_STR("Model::Model()") ; connect(this, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection) ; iMutex = new QMutex(QMutex::Recursive); // same thread can lock recursive mutex multiple times initPseudoRandom() ; if (!openDB()) { QString errorText (lastError().text()) ; emit(error(MController::DataBaseNotMountable, errorText)) ; } iNodeModel = new NodeModel(aController, *this) ; iConnections = new QList() ; iNetReqQueue = new QList (); iNetReqExecutor = new NetworkRequestExecutor(aController, *this) ; iContentEncryptionModel = new ContentEncryptionModel(aController, *this) ; iProfileModel = new ProfileModel(aController, *this) ; iBinaryFileModel = new BinaryFileModel(aController, *this) ; iCaModel = new ClassifiedAdsModel(aController, *this) ; iPrivMsgModel = new PrivMessageModel(aController, *this) ; iSearchModel = new SearchModel(*this,*iController) ; iSearchModel->setObjectName("CA SearchModel") ; iCaDbRecordModel = new CaDbRecordModel(aController, *this); iTrustTreeModel = new TrustTreeModel(aController, *this ) ; iProfileCommentModel = new ProfileCommentModel(aController, *this) ; iNetReqExecutor->setInterval(1000); // start is called by controller iTclModel = new TclModel(aController, *this) ; connect(iBinaryFileModel, SIGNAL( contentReceived(const Hash& , const ProtocolItemType ) ), this, SLOT(notifyOfContentReceived(const Hash& , const ProtocolItemType)), Qt::QueuedConnection) ; connect(iPrivMsgModel, SIGNAL( contentReceived(const Hash& , const Hash& , const ProtocolItemType ) ), this, SLOT(notifyOfContentReceived(const Hash& , const Hash& , const ProtocolItemType)), Qt::QueuedConnection) ; connect(iProfileCommentModel, SIGNAL( contentReceived(const Hash& , const Hash& , const ProtocolItemType ) ), this, SLOT(notifyOfContentReceived(const Hash& , const Hash& , const ProtocolItemType)), Qt::QueuedConnection) ; connect(iProfileModel, SIGNAL( contentReceived(const Hash& , const ProtocolItemType ) ), this, SLOT(notifyOfContentReceived(const Hash& , const ProtocolItemType)), Qt::QueuedConnection) ; connect(iCaModel, SIGNAL( contentReceived(const Hash& , const Hash& , const ProtocolItemType ) ), this, SLOT(notifyOfContentReceived(const Hash& , const Hash& , const ProtocolItemType)), Qt::QueuedConnection) ; connect(iPrivMsgModel, SIGNAL( contentReceived(const Hash& , const Hash& , const ProtocolItemType ) ), this, SLOT(notifyOfContentReceived(const Hash& , const Hash& , const ProtocolItemType)), Qt::QueuedConnection) ; // connect same to controller too: connect(iBinaryFileModel, SIGNAL( contentReceived(const Hash& , const ProtocolItemType ) ), iController, SLOT(notifyOfContentReceived(const Hash& , const ProtocolItemType)), Qt::QueuedConnection) ; connect(iPrivMsgModel, SIGNAL( contentReceived(const Hash& , const Hash& , const ProtocolItemType ) ), iController, SLOT(notifyOfContentReceived(const Hash& , const Hash& , const ProtocolItemType)), Qt::QueuedConnection) ; connect(iProfileModel, SIGNAL( contentReceived(const Hash& , const ProtocolItemType ) ), iController, SLOT(notifyOfContentReceived(const Hash& , const ProtocolItemType)), Qt::QueuedConnection) ; connect(iCaModel, SIGNAL( contentReceived(const Hash& , const Hash& , const ProtocolItemType ) ), iController, SLOT(notifyOfContentReceived(const Hash& , const Hash& , const ProtocolItemType)), Qt::QueuedConnection) ; connect(iPrivMsgModel, SIGNAL( contentReceived(const Hash& , const Hash& , const ProtocolItemType ) ), iController, SLOT(notifyOfContentReceived(const Hash& , const Hash& , const ProtocolItemType)), Qt::QueuedConnection) ; connect(iProfileCommentModel, SIGNAL( contentReceived(const Hash& , const Hash& , const ProtocolItemType ) ), iController, SLOT(notifyOfContentReceived(const Hash& , const Hash& , const ProtocolItemType)), Qt::QueuedConnection) ; connect(iCaDbRecordModel, SIGNAL( contentReceived(const Hash& , const Hash& , const ProtocolItemType ) ), iController, SLOT(notifyOfContentReceived(const Hash& , const Hash& , const ProtocolItemType)), Qt::QueuedConnection) ; iTimerId = startTimer(60000*10); // 10-minute timer } Model::~Model() { LOG_STR("Model::~Model()") ; if ( iTimerId != -1 ) { killTimer(iTimerId) ; } if ( iNetReqExecutor ) { iNetReqExecutor->stop() ; delete iNetReqExecutor ; } closeAllConnections(true) ; delete iConnections; delete iNodeModel ; delete iProfileCommentModel ; delete iPrivMsgModel ; delete iProfileModel ; delete iNetReqQueue ; delete iBinaryFileModel ; delete iCaDbRecordModel ; delete iSearchModel ; delete iTrustTreeModel ; delete iTclModel ; delete iCaModel ; delete iContentEncryptionModel ; while ( iDbPool.count() ) { const QThread* firstKey ( iDbPool.firstKey() ) ; QSqlDatabase dbToClose ( iDbPool.take ( firstKey ) ) ; if ( dbToClose.isOpen() ) { dbToClose.close() ; } QLOG_STR("Removed db at model destructor") ; } iController = NULL ; // not owned, just set null delete iMutex ; } void Model::closeAllConnections(bool aDeleteAlso) { if ( iConnections ) { LOG_STR2("Model::closeAllConnections %d", iConnections->count()) ; // normally networklistener has been deleted before // model and networklistener is parent of connections, // that now have been deleted too due to parent->child // relationship -> usually the loop below is looped 0 times. for ( int i = iConnections->count()-1 ; i >= 0 ; i-- ) { Connection *c = iConnections->at(i) ; if ( c ) { c->iNeedsToRun = false ; } if ( aDeleteAlso ) { delete c ; } } } } bool Model::lock() { #ifdef __DEBUG__ assert(iMutex->tryLock(1000*15)==true) #else iMutex->lock() ; #endif return true ; } void Model::unlock() { iMutex->unlock() ; } bool Model::openDB() { bool tables_needed = false ; QSqlDatabase db ( dataBaseConnection(&tables_needed) ) ; if ( db.isOpen() && tables_needed ) { if ( createTables(db) == false ) { return false ; } } if ( db.isOpen() ) { // do cleanup to rectify previous bugs: QSqlQuery query (db); // removes every comment that does not begin with { as all json // is supposed but it still is not marked as private (==encrypted) bool ret = query.exec("delete from profile where profiledata not like x'7b25' and is_private = 'false' and hash1 not in ( select hash1 from privatekeys )") ; if ( ret == false ) { QLOG_STR("Profile cleanup: " + query.lastError().text()) ; } else { QLOG_STR("Cleaned away faulty profiles " + QString::number(query.numRowsAffected () )) ; } ret = query.exec("delete from profilecomment where commentdata not like x'7b25' and flags&1 = 0") ; if ( ret == false ) { QLOG_STR("Profile comment cleanup: " + query.lastError().text()) ; } else { QLOG_STR("Cleaned away faulty comments " + QString::number(query.numRowsAffected () )) ; } } if ( db.isOpen() ) { createTablesV2(db) ; createTablesV3(db) ; createTablesV4(db) ; QSqlQuery versionQuery("select sqlite_version()",db) ; if ( versionQuery.exec() && versionQuery.next() ) { QLOG_STR("Sqlite version " + versionQuery.value(0).toString()) ; } } return db.isOpen() ; } QSqlError Model::lastError() { const QSqlDatabase db ( dataBaseConnection() ) ; QSqlError e = db.lastError(); QLOG_STR(e.text()) ; return e; } bool Model::createTables(QSqlDatabase aDb) { bool ret = false; QSqlQuery query(aDb); ret = query.exec("create table settings " "(datastore_version unsigned int primary key," "node_listenport unsigned int," "profile_maxrows unsigned int," "private_message_maxrows unsigned int," "binaryfile_maxrows unsigned int," "classified_ad_maxrows unsigned int," "profilecomment_maxrows unsigned int," "node_maxrows unsigned int," "node_key varchar(5000)," "node_cert varchar(5000)," "dns_name varchar(256))"); if ( ret ) { QSqlQuery query(aDb); ret = query.exec ( "insert into settings (datastore_version) values (1)" ) ; } LOG_STR2("Table settings created 1 is ok, = %d", ret) ; if ( ret ) { QSqlQuery q2(aDb); ret = q2.exec("create table node " "(hash1 unsigned int not null," "hash2 unsigned int not null," "hash3 unsigned int not null," "hash4 unsigned int not null," "hash5 unsigned int not null," "listenport unsigned int," "last_conn_time unsigned int," "does_listen unsigned int," "ipv4addr unsigned int," "ipv6addr1 unsigned int," "ipv6addr2 unsigned int," "ipv6addr3 unsigned int," "ipv6addr4 unsigned int," "time_last_reference unsigned int," "last_nodelist_time unsigned int," "dns_name varchar(256)," "tor_name varchar(256)," "last_mutual_conn_time unsigned int)"); LOG_STR2("Table node created, retval = %d", ret) ; } if ( ret ) { QSqlQuery q3(aDb); // note how index is not unique. set of hash1+2+3+4+5 is // (fairly) unique but setting hash1 to be unique would // prevent storage of documents(nodes) where hash collides in // first 32 bits - that's fairly bigger chance compared // to hash collision in "full" 160 bits. ret = q3.exec("create index node_hash1_ind on node(hash1)"); LOG_STR2("Index node(hash1) created, retval = %d", ret) ; } if ( ret ) { QSqlQuery q4(aDb); ret = q4.exec("create table privatekeys(prikey varchar(5000) not null," "hash1 unsigned int not null," "hash2 unsigned int not null," "hash3 unsigned int not null," "hash4 unsigned int not null," "hash5 unsigned int not null," "last_msgpoll_time unsigned int," "private_data blob)"); LOG_STR2("Table for private keys created %d", ret) ; } if ( ret ) { QSqlQuery q5(aDb); ret = q5.exec("create table profile(pubkey varchar(5000) not null," "hash1 unsigned int not null," "hash2 unsigned int not null," "hash3 unsigned int not null," "hash4 unsigned int not null," "hash5 unsigned int not null," "profiledata blob," "is_private int," "time_last_reference unsigned int," "signature varchar(1024)," "display_name varchar(160)," "time_of_publish unsigned int," "recvd_from unsigned int," "time_of_update_poll unsigned int)"); LOG_STR2("Table for profile data created %d", ret) ; } if ( ret ) { QSqlQuery q6(aDb); ret = q6.exec("create index profile_hash1_ind on profile(hash1)"); LOG_STR2("Index for profile data table created %d", ret) ; } if ( ret ) { QSqlQuery q7(aDb); // usage of the following table is this: // when new item (profile,ca,privmsg,binary blob) is published // it is inserted into this table. // networking module will take items (identified by hash1-5) // from this table one-by-one, connect to 5 nodes one-by-one // (marked by bangpath1-5 where each bangpath contains the // low-order bits of the noderef of node where item // has already been sent) // when 5th node has been filled, row is removed from table // and stuff is considered published // itemtype is one of enum ProtocolItemType from protocol.h // // some object types have actually 2 addresses and are // published twice: classified ads to content address and // the group controller address ; profile comments to // content address and profile address. ret = q7.exec("create table publish(itemtype int not null," "hash1 unsigned int not null," "hash2 unsigned int not null," "hash3 unsigned int not null," "hash4 unsigned int not null," "hash5 unsigned int not null," "secondary_addr_hash1 unsigned int ," "secondary_addr_hash2 unsigned int ," "secondary_addr_hash3 unsigned int ," "secondary_addr_hash4 unsigned int ," "secondary_addr_hash5 unsigned int ," "bangpath1 unsigned int," "bangpath2 unsigned int," "bangpath3 unsigned int," "bangpath4 unsigned int," "bangpath5 unsigned int," "hostcount int not null," "last_time_tried unsigned int)"); LOG_STR2("Table for publish data created %d", ret) ; } if ( ret ) { QSqlQuery q8(aDb); ret = q8.exec("create table binaryfile(" "hash1 unsigned int not null," "hash2 unsigned int not null," "hash3 unsigned int not null," "hash4 unsigned int not null," "hash5 unsigned int not null," "publisher_hash1 unsigned int not null," "publisher_hash2 unsigned int not null," "publisher_hash3 unsigned int not null," "publisher_hash4 unsigned int not null," "publisher_hash5 unsigned int not null," "contentdata blob," "is_private int," "is_compressed int," "time_last_reference unsigned int," "signature varchar(1024)," "display_name varchar(160)," "time_of_publish unsigned int," "metadata blob ," "recvd_from unsigned int )") ; LOG_STR2("Table for binary files created %d", ret) ; } if ( ret ) { QSqlQuery q9(aDb); ret = q9.exec("create index binaryfile_hash1_ind on binaryfile(hash1)"); LOG_STR2("Index for binary blob data table created %d", ret) ; } if ( ret ) { QSqlQuery q10(aDb); ret = q10.exec("create table classified_ad(" "hash1 unsigned int not null," "hash2 unsigned int not null," "hash3 unsigned int not null," "hash4 unsigned int not null," "hash5 unsigned int not null," "group_hash1 unsigned int not null," "group_hash2 unsigned int not null," "group_hash3 unsigned int not null," "group_hash4 unsigned int not null," "group_hash5 unsigned int not null," "reply_to unsigned int," "time_last_reference unsigned int," "time_added unsigned int not null," "signature varchar(1024)," "display_name varchar(160)," "time_of_publish unsigned int," "jsondata blob ," "recvd_from unsigned int )") ; LOG_STR2("Table for classified_ads created %d", ret) ; } if ( ret ) { QSqlQuery q11(aDb); ret = q11.exec("create index ca_hash1_ind on classified_ad(hash1)"); LOG_STR2("Index for classified data table created %d", ret) ; } if ( ret ) { QSqlQuery q12(aDb); ret = q12.exec("create index ca_ghash1_ind on classified_ad(group_hash1)"); LOG_STR2("Index for classified data table group hash created %d", ret) ; } if ( ret ) { QSqlQuery q13(aDb); ret = q13.exec("create table private_message(" "hash1 unsigned int not null," "hash2 unsigned int not null," "hash3 unsigned int not null," "hash4 unsigned int not null," "hash5 unsigned int not null," "dnode_hash1 unsigned int," "dnode_hash2 unsigned int," "dnode_hash3 unsigned int," "dnode_hash4 unsigned int," "dnode_hash5 unsigned int," "recipient_hash1 unsigned int not null," "recipient_hash2 unsigned int not null," "recipient_hash3 unsigned int not null," "recipient_hash4 unsigned int not null," "recipient_hash5 unsigned int not null," "sender_hash1 unsigned int," "is_read int," "time_last_reference unsigned int," "signature varchar(1024)," "time_of_publish unsigned int," "messagedata blob ," "recvd_from unsigned int )") ; LOG_STR2("Table for private messages created %d", ret) ; } if ( ret ) { QSqlQuery q14(aDb); ret = q14.exec("create index privmsg_hash1_ind on private_message(hash1)"); QSqlQuery q15(aDb); ret = q15.exec("create index privmsg_dhash1_ind on private_message(dnode_hash1)"); QSqlQuery q16(aDb); ret = q16.exec("create index privmsg_rhash1_ind on private_message(recipient_hash1)"); LOG_STR2("Index for private message data table created %d", ret) ; } if ( ret ) { QSqlQuery q17(aDb); ret = q17.exec("create table profilecomment(" "hash1 unsigned int not null," "hash2 unsigned int not null," "hash3 unsigned int not null," "hash4 unsigned int not null," "hash5 unsigned int not null," "profile_hash1 unsigned int," "profile_hash2 unsigned int," "profile_hash3 unsigned int," "profile_hash4 unsigned int," "profile_hash5 unsigned int," "sender_hash1 unsigned int," "time_last_reference unsigned int," "signature varchar(1024)," "time_of_publish unsigned int," "commentdata blob ," "recvd_from unsigned int," "flags unsigned int," "display_name varchar(160) )") ; // display name might be message subject LOG_STR2("Table for profile comments created %d", ret) ; } if ( ret ) { QSqlQuery q18(aDb); ret = q18.exec("create index profcomment_hash1_ind on profilecomment(hash1)"); QSqlQuery q19(aDb) ; ret = q19.exec("create index profcomment_phash1_ind on profilecomment(profile_hash1)"); } // in sqlite there is special table type for full text search. if ( SearchModel::queryIfFTSSupported(aDb)) { SearchModel::createFTSTables(aDb) ; } return ret; } // method check datastore version. if is 1, upgrades to version 2. bool Model::createTablesV2(QSqlDatabase aDb) { QSqlQuery query(aDb); bool ret ; ret = query.prepare ("select datastore_version from settings" ) ; ret = query.exec() ; if ( !ret ) { QLOG_STR("select datastore_version from settings: " + query.lastError().text()); emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) ) { int datastoreVersion ( query.value(0).toInt() ) ; if ( datastoreVersion == 1 ) { // upgrade datastore to version 2 QSqlQuery q(aDb); ret = q.exec("alter table settings add column ringtone int not null default 0") ; if ( ret ) { QSqlQuery q3(aDb); ret = q3.exec("alter table settings add column call_acceptance int not null default 0") ; if ( !ret ) { QLOG_STR("alter table settings: " + q3.lastError().text()); emit error(MController::DbTransactionError, q3.lastError().text()) ; } } if ( ret ) { QSqlQuery q2(aDb); q2.exec("update settings set datastore_version = 2") ; } } } } return ret ; } // method check datastore version. if is 2, upgrades to version 3. bool Model::createTablesV3(QSqlDatabase aDb) { QSqlQuery query(aDb); bool ret ; ret = query.prepare ("select datastore_version from settings" ) ; ret = query.exec() ; if ( !ret ) { QLOG_STR("select datastore_version from settings: " + query.lastError().text()); emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) ) { int datastoreVersion ( query.value(0).toInt() ) ; if ( datastoreVersion == 2 ) { // upgrade datastore to version 3 QSqlQuery q(aDb); ret = q.exec("create table tclprogs " "(hash1 unsigned int not null," "hash2 unsigned int not null," "hash3 unsigned int not null," "hash4 unsigned int not null," "hash5 unsigned int not null," "prog_name varchar(256) not null," "prog_text blob not null," "prog_settings blob," "time_modified unsigned int not null)") ; if ( ret ) { QSqlQuery q2(aDb); q2.exec("update settings set datastore_version = 3") ; } else { QLOG_STR("alter table settings: " + q.lastError().text()); emit error(MController::DbTransactionError, q.lastError().text()) ; } } } } return ret ; } bool Model::createTablesV4(QSqlDatabase aDb) { QLOG_STR("createTablesV4 in") ; QSqlQuery query(aDb); bool ret ; ret = query.prepare ("select datastore_version from settings" ) ; ret = query.exec() ; if ( !ret ) { QLOG_STR("select datastore_version from settings: " + query.lastError().text()); emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) ) { int datastoreVersion ( query.value(0).toInt() ) ; if ( datastoreVersion == 3 ) { // upgrade datastore to version 4 QSqlQuery q(aDb); ret = q.exec("create table dbrecord ( hash1 unsigned int not null," "hash2 unsigned int not null," "hash3 unsigned int not null," "hash4 unsigned int not null," "hash5 unsigned int not null," "collection_hash1 unsigned int not null," "collection_hash2 unsigned int not null," "collection_hash3 unsigned int not null," "collection_hash4 unsigned int not null," "collection_hash5 unsigned int not null," "sender_hash1 unsigned int not null," "sender_hash2 unsigned int not null," "sender_hash3 unsigned int not null," "sender_hash4 unsigned int not null," "sender_hash5 unsigned int not null," "time_last_reference unsigned int not null," "signature varchar(1024) not null," "time_of_publish unsigned int not null," "data blob," "recvd_from unsigned int not null," "searchstring varchar(4096)," "searchnumber bigint," "isencrypted tinyint not null," "issignatureverified tinyint not null);") ;// will store boolean value if (!ret ) { QLOG_STR("create table dbrecord: " + q.lastError().text()); emit error(MController::DbTransactionError, q.lastError().text()) ; } if ( ret && SearchModel::queryIfFTSSupported(aDb) ) { QSqlQuery ftsQ (aDb); ret = ftsQ.exec("create virtual table dbrecord_search using fts3(searchstring)") ; if (!ret) { QLOG_STR("FTS3 table dbrecord_search creation: " + ftsQ.lastError().text()) ; return false ; } else { QSqlQuery ftsQ2 (aDb); ret = ftsQ2.exec("CREATE TRIGGER dbrecord_search_del BEFORE DELETE ON dbrecord BEGIN" " DELETE FROM dbrecord_search WHERE docid=old.hash1;" "END;") ; if (!ret) { QLOG_STR("CREATE TRIGGER dbrecord_search_del: " + ftsQ2.lastError().text()); emit error(MController::DbTransactionError, ftsQ2.lastError().text()) ; } } } else { QLOG_STR("FTS was not supported") ; } if ( ret ) { QSqlQuery q3(aDb); ret = q3.exec("alter table settings add column dbrecord_maxrows int not null default 1000") ; if (!ret) { QLOG_STR("add dbrecord_maxrows: " + q3.lastError().text()) ; emit error(MController::DbTransactionError, q3.lastError().text()) ; return false ; } QSqlQuery q4(aDb); ret = q4.exec("update settings set dbrecord_maxrows = 100000") ; if (!ret) { QLOG_STR("update dbrecord_maxrows: " + q4.lastError().text()) ; emit error(MController::DbTransactionError, q4.lastError().text()) ; return false ; } QSqlQuery q5(aDb); ret = q5.exec("alter table tclprogs add column prog_data blob") ; if (!ret) { QLOG_STR("alter table tclprogs: " + q5.lastError().text()) ; emit error(MController::DbTransactionError, q5.lastError().text()) ; return false ; } } if ( ret ) { QSqlQuery q2(aDb); q2.exec("update settings set datastore_version = 4") ; } } } } return ret ; } void Model::initPseudoRandom() { SSL_load_error_strings(); SSL_library_init(); LOG_STR2("Openssl %s\n", SSLeay_version(SSLEAY_VERSION)) ; #ifdef WIN32 OpenSSL_add_all_algorithms() ; #endif // first initialize random numbah generator QString randomFileName("") ; if (QFile("/dev/urandom").exists()) { // fast randomFileName = "/dev/urandom" ; } else if (QFile("/dev/arandom").exists()) { // bsd? randomFileName = "/dev/arandom" ; } else if (QFile("/dev/random").exists()) { // slow but good randomFileName = "/dev/random" ; } else { #ifdef WIN32 #define RANDOM_LEN (15*sizeof(quint32)) // this code is from MSDN examples HCRYPTPROV hCryptProv = 0 ; BYTE pbData[RANDOM_LEN] = { 0 } ; LPCWSTR UserName = L"Zappa, Frank"; // name of the key container if(CryptAcquireContext( &hCryptProv, // handle to the CSP UserName, // container name NULL, // use the default provider PROV_RSA_FULL, // provider type 0)) { // flag values QLOG_STR("Win32 seed: A cryptographic context has been acquired."); } else { if(CryptAcquireContext( &hCryptProv, UserName, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { QLOG_STR("Win32 seed: A new key container has been created.\n"); } else { QLOG_STR("Win32 seed: Could not create a new key container.\n"); } } if ( hCryptProv ) { if(CryptGenRandom( hCryptProv, RANDOM_LEN, pbData)) { QLOG_STR("Win32 seed: Random sequence generated."); RAND_seed(&pbData, RANDOM_LEN); unsigned int *pointer1intothemiddle = reinterpret_cast(pbData); srand(*pointer1intothemiddle) ; pointer1intothemiddle++ ; qsrand(*pointer1intothemiddle) ; } else { printf("Win32 seed: Error during CryptGenRandom.\n"); } if (CryptReleaseContext(hCryptProv,0)) { printf("Win32 seed: The handle has been released.\n"); } else { printf("Win32 seed:The handle could not be released.\n"); } } #else // oh dear. emphasis is on word pseudo. QUuid u = QUuid::createUuid() ; QString eight_letters = u.toString() ; eight_letters.remove(0,25) ; eight_letters.truncate(8) ; unsigned int seed ; char buf[30] ; sprintf(buf,"%.8s",eight_letters.toUtf8().constData()) ; sscanf(buf, "%x", &seed) ; LOG_STR2("Random seed %x", seed) ; srand(seed) ; qsrand(rand()) ; // note that in qt different threads may have // their own random seeds?? RAND_seed(&seed, sizeof(seed)); #endif } if ( randomFileName.length() > 2 ) { QFile randomFile(randomFileName) ; if ( randomFile.open(QIODevice::ReadOnly) ) { QLOG_STR("Used rnd-file " + randomFileName) ; QByteArray randomBytes = randomFile.read(1024) ; char *randomBytesPointer = randomBytes.data() ; RAND_seed(randomBytesPointer, 1024); unsigned int *pointer1intothemiddle ; unsigned int *pointer2intothemiddle ; pointer1intothemiddle = (unsigned int *)randomBytesPointer ; pointer1intothemiddle++ ; pointer1intothemiddle++ ; pointer1intothemiddle++ ; pointer1intothemiddle++ ; pointer2intothemiddle = pointer1intothemiddle ; pointer2intothemiddle++ ; pointer2intothemiddle++ ; pointer2intothemiddle++ ; pointer2intothemiddle++ ; srand(*pointer1intothemiddle) ; qsrand(*pointer2intothemiddle) ; // note that in qt different threads may have randomFile.close() ; } else { QLOG_STR("FATAL: Can't open " + randomFileName) ; assert(1 == 2) ; } } } // called from networklistener, at least void Model::addOpenNetworkConnection(Connection *aConnection) { iConnections->append(aConnection) ; // first thing for the new connection to send is some random // number to add confuzius // // second thing for the new connection to send is greetings // so that the other end can identify. // // wut next? aConnection->iNextProtocolItemToSend.append(new QByteArray(ProtocolMessageFormatter::randomNumbers())) ; // previous call to random number runs in same thread with model aConnection->iNextProtocolItemToSend.append(new QByteArray(ProtocolMessageFormatter::nodeGreeting(iController->getNode()))) ; // wyt next? we have node connected. what is she going to need? // lets do so that we wait until node greeting. there // she'll gossip us her latest node ref timestamp // so at least we can then send the node ref around // her starting from given timestamp .. for now, do no thing. // and did we already have too many connections.. if (iConnections->size() > KMaxOpenConnections ) { iNodeModel->closeOldestInactiveConnection() ; } } void Model::removeOpenNetworkConnection(Connection *aDeletedConnection) { int indexInArray = iConnections->indexOf(aDeletedConnection) ; if ( indexInArray > -1 ) { iConnections->removeAt(indexInArray) ; LOG_STR2("Removed client %d", indexInArray) ; } else { LOG_STR("deleted client not found from array???") ; } if (aDeletedConnection->node()) { for ( int i = (iNetReqQueue->size()-1) ; i >= 0 ; i--) { if(iNetReqQueue->value(i).iDestinationNode == aDeletedConnection->node()->nodeFingerPrint() ) { iNetReqQueue->removeAt(i) ; LOG_STR2("Removed associated netreq at %d", i) ; } } } } // this is called at least by connection itself, when // it determines it is open for communication. note that // when connection class this, datamodel is already locked. // void Model::connectionStateChanged(Connection::ConnectionState aState, Connection *aConnection) { // may be needed to call lock() in here.. LOG_STR2("Connectionstate = %d", aState) ; if ( aState == Connection::Open ) { // check that we don't have duplicate connection, it seems to // happen easily if we have broadcast together with multiple // ipv6 addresses per single network interface: broadcasts come // from one address, address included inside is another.. // and check self first if ( aConnection->getPeerHash() == iController->getNode().nodeFingerPrint() ) { // great, managed to connect to self aConnection->iNeedsToRun = false ; return ; } // then loop through connections foreach ( const Connection *c, *iConnections ) { if ( c ) { if ( c != aConnection && c->connectionState() == Connection::Open && aConnection->getPeerHash() == c->getPeerHash() ) { LOG_STR("Double connection to same node detected") ; aConnection->iNeedsToRun = false ; break ; } } } } } const QList & Model::getConnections() const { return *iConnections ; } QList & Model::getNetRequests() const { return *iNetReqQueue ; } void Model::addNetworkRequest(NetworkRequestExecutor::NetworkRequestQueueItem& aRequest) const { if ( iController->getNode().nodeFingerPrint() == aRequest.iDestinationNode ) { QLOG_STR("Skipping network request destined to self") ; } else { aRequest.iTimeStampOfLastActivity = QDateTime::currentDateTimeUtc().toTime_t(); if ( iNetReqQueue ) { iNetReqQueue->append(aRequest) ; } } } void Model::addItemToSend(const Hash& aDestinationNode, QByteArray* aBytesToSend) { Connection* c = NULL ; const Node* nodeOfConnection = NULL ; // connections are in no particular order so linear search.. for(int i = iConnections->size()-1 ; i >= 0 ; i-- ) { c = iConnections->value(i) ; nodeOfConnection = c->node() ; if (c->connectionState() == Connection::Open && nodeOfConnection && ( nodeOfConnection->nodeFingerPrint() == aDestinationNode ) ) { // yes. c->iNextProtocolItemToSend.append(aBytesToSend) ; return ; // work done, get out } } // no match found, just delete bytes delete aBytesToSend ; } MNodeModelProtocolInterface& Model::nodeModel() const { return *iNodeModel ; } ContentEncryptionModel& Model::contentEncryptionModel() const { return *iContentEncryptionModel ; } ProfileModel& Model::profileModel() const { return *iProfileModel ; } BinaryFileModel& Model::binaryFileModel() const { return *iBinaryFileModel ; } ClassifiedAdsModel& Model::classifiedAdsModel() const { return *iCaModel ; } PrivMessageModel& Model::privateMessageModel() const { return *iPrivMsgModel ; } ProfileCommentModel& Model::profileCommentModel() const { return *iProfileCommentModel ; } SearchModel* Model::searchModel() const { return iSearchModel ; } CaDbRecordModel* Model::caDbRecordModel() const { return iCaDbRecordModel ; } TrustTreeModel* Model::trustTreeModel() const { return iTrustTreeModel ; } TclModel& Model::tclModel() const { return *iTclModel ; } NetworkRequestExecutor* Model::getNetReqExecutor() { return iNetReqExecutor ; } /** * method for getting next item to publish * @param aFound will be set to true if there is an item to publish * @return if aFound is true, returned item contains details about * the item to publish. */ PublishItem Model::nextItemToPublish(bool* aFound) { PublishItem retval ; *aFound = false ; QSqlQuery query(iController->model().dataBaseConnection()); bool ret ; // don't pick up the same item again if less than 10 minutes passed ret = query.prepare ("select itemtype,hash1,hash2,hash3,hash4,hash5, " " bangpath1,bangpath2,bangpath3,bangpath4,bangpath5," "hostcount,last_time_tried,secondary_addr_hash1," "secondary_addr_hash2,secondary_addr_hash3," "secondary_addr_hash4,secondary_addr_hash5 " " from publish where last_time_tried < :now_minus_10_minutes" " order by last_time_tried desc limit 1" ) ; query.bindValue(":now_minus_10_minutes", QDateTime::currentDateTimeUtc().toTime_t()-(60*10)) ; ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) && !query.isNull(1) ) { retval.iObjectType = (ProtocolItemType) ( query.value(0).toInt() ) ; quint32 h1 = query.value(1).toUInt() ; quint32 h2 = query.value(2).toUInt() ; quint32 h3 = query.value(3).toUInt() ; quint32 h4 = query.value(4).toUInt() ; quint32 h5 = query.value(5).toUInt() ; retval.iObjectHash = Hash(h1,h2,h3,h4,h5) ; if ( !query.isNull(13) ) { // there is secondary addr quint32 h1_2nd = query.value(13).toUInt() ; quint32 h2_2nd = query.value(14).toUInt() ; quint32 h3_2nd = query.value(15).toUInt() ; quint32 h4_2nd = query.value(16).toUInt() ; quint32 h5_2nd = query.value(17).toUInt() ; retval.i2NdAddr = Hash(h1_2nd, h2_2nd, h3_2nd, h4_2nd, h5_2nd) ; } retval.iAlreadyPushedHosts.clear() ; if ( !query.isNull(6) ) { quint32 bangPath1Value ( query.value(6).toUInt() ) ; LOG_STR2("BangPath1 value from db = %u", bangPath1Value) ; retval.iAlreadyPushedHosts.append( bangPath1Value ) ; } else { LOG_STR("BangPath1 value in db was null") ; } if ( !query.isNull(7) ) { retval.iAlreadyPushedHosts.append( query.value(7).toUInt() ) ; LOG_STR2("BangPath2 value from db = %u", query.value(7).toUInt()) ; } else { LOG_STR("BangPath2 value in db was null") ; } if ( !query.isNull(8) ) { retval.iAlreadyPushedHosts.append( query.value(8).toUInt() ) ; } if ( !query.isNull(9) ) { retval.iAlreadyPushedHosts.append( query.value(9).toUInt() ) ; } if ( !query.isNull(10) ) { retval.iAlreadyPushedHosts.append( query.value(10).toUInt() ) ; } LOG_STR2("Publish item found was %d minutes old", (QDateTime::currentDateTimeUtc().toTime_t()-query.value(12).toUInt()) / 60 ) ; LOG_STR2("Publish had %u hops in bangpath", retval.iAlreadyPushedHosts.size() ) ; if ( retval.iAlreadyPushedHosts.size()) { for ( int ii = 0 ; ii < retval.iAlreadyPushedHosts.size() ; ii++ ) { LOG_STR2("bangpath content %u", retval.iAlreadyPushedHosts[ii]) ; } } *aFound = true ; // because item was found, mark the time when it was found // so next time it will appear at the bottom of our list QSqlQuery query2(iController->model().dataBaseConnection()) ; query2.prepare ("update publish set last_time_tried=:time where hash1=:hash1 and hash2=:hash2 and hash3=:hash3 and hash4=:hash4 and hash5=:hash5" ) ; query2.bindValue(":hash1", retval.iObjectHash.iHash160bits[0]) ; query2.bindValue(":hash2", retval.iObjectHash.iHash160bits[1]) ; query2.bindValue(":hash3", retval.iObjectHash.iHash160bits[2]) ; query2.bindValue(":hash4", retval.iObjectHash.iHash160bits[3]) ; query2.bindValue(":hash5", retval.iObjectHash.iHash160bits[4]) ; query2.bindValue(":time", QDateTime::currentDateTimeUtc().toTime_t()) ; if ( query2.exec() == false ) { QLOG_STR(query2.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query2.lastError().text()) ; } } } return retval ; } void Model::addItemToBePublished(ProtocolItemType aType, const Hash& aHash, const QList& aBangPath, const Hash& aSecondaryAddr ) { // short-cut handling for private messages that have // destination node set: if ( aType == PrivateMessage && aSecondaryAddr != KNullHash && iNodeModel->isNodeAlreadyConnected(aSecondaryAddr) ) { struct NetworkRequestExecutor::NetworkRequestQueueItem sendReq ; sendReq.iDestinationNode = aSecondaryAddr ; sendReq.iRequestedItem = aHash; sendReq.iMaxNumberOfItems = 1 ; sendReq.iBangPath = aBangPath ; sendReq.iState = NetworkRequestExecutor::NewRequest ; sendReq.iRequestType = PrivateMessage ; addNetworkRequest(sendReq) ; LOG_STR("published privmsg sent via short-cut") ; } else { // check we don't have the item already: if ( aBangPath.size() >= 5 ) { return ; // consider it published } int count ( 0 ) ; QSqlQuery query(iController->model().dataBaseConnection()); bool ret ; ret = query.prepare ("select count (itemtype) from publish where " "hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 " "and hash5 = :hash5 and itemtype = :itemtype" ) ; query.bindValue(":hash1", aHash.iHash160bits[0]) ; query.bindValue(":hash2", aHash.iHash160bits[1]) ; query.bindValue(":hash3", aHash.iHash160bits[2]) ; query.bindValue(":hash4", aHash.iHash160bits[3]) ; query.bindValue(":hash5", aHash.iHash160bits[4]) ; query.bindValue(":itemtype", (int)aType) ; ret = query.exec() ; if ( !ret ) { LOG_STR2("Error while selecting from publish %s", qPrintable(query.lastError().text())) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) ) { count = query.value(0).toInt() ; } QSqlQuery query2(iController->model().dataBaseConnection()); if ( count == 0 ) { // item did not exist beforehand ret = query2.prepare ("insert into publish(itemtype,hash1,hash2,hash3," "hash4,hash5,hostcount,last_time_tried,bangpath1," "bangpath2,bangpath3,bangpath4,bangpath5," "secondary_addr_hash1,secondary_addr_hash2," "secondary_addr_hash3," "secondary_addr_hash4,secondary_addr_hash5) values " "(:itemtype,:hash1,:hash2,:hash3,:hash4,:hash5,0,0," ":b1,:b2,:b3,:b4,:b5,:sa1,:sa2,:sa3,:sa4,:sa5)" ) ; query2.bindValue(":itemtype", (int)aType) ; } else { ret = query2.prepare ("update publish set last_time_tried=0,bangpath1=:b1," "bangpath2=:b2,bangpath3=:b3,bangpath4=:b4,bangpath5=:b5," "hostcount=0,secondary_addr_hash1=:sa1,secondary_addr_hash2=:sa2," "secondary_addr_hash3=:sa3," "secondary_addr_hash4=:sa4," "secondary_addr_hash5=:sa5 " "where hash1=:hash1 and hash2=:hash2 and " "hash3=:hash3 and hash4=:hash4 and hash5=:hash5" ) ; } if ( ret ) { query2.bindValue(":hash1", aHash.iHash160bits[0]) ; query2.bindValue(":hash2", aHash.iHash160bits[1]) ; query2.bindValue(":hash3", aHash.iHash160bits[2]) ; query2.bindValue(":hash4", aHash.iHash160bits[3]) ; query2.bindValue(":hash5", aHash.iHash160bits[4]) ; if ( aSecondaryAddr == KNullHash ) { query2.bindValue(":sa1", QVariant(QVariant::String)) ; query2.bindValue(":sa2", QVariant(QVariant::String)) ; query2.bindValue(":sa3", QVariant(QVariant::String)) ; query2.bindValue(":sa4", QVariant(QVariant::String)) ; query2.bindValue(":sa5", QVariant(QVariant::String)) ; } else { query2.bindValue(":sa1", aHash.iHash160bits[0]) ; query2.bindValue(":sa2", aHash.iHash160bits[1]) ; query2.bindValue(":sa3", aHash.iHash160bits[2]) ; query2.bindValue(":sa4", aHash.iHash160bits[3]) ; query2.bindValue(":sa5", aHash.iHash160bits[4]) ; } if ( aBangPath.size() >= 1 && aBangPath[0] ) { query2.bindValue(":b1", aBangPath[0]) ; LOG_STR2("### Query 2 bindval for bangpath[0] = %u", aBangPath[0]) ; } else { query2.bindValue(":b1", QVariant(QVariant::String)) ; // null value LOG_STR("### Query 2 bindval for bangpath[0] = null") ; } if ( aBangPath.size() >= 2 && aBangPath[1] ) { query2.bindValue(":b2", aBangPath[1]) ; } else { query2.bindValue(":b2", QVariant(QVariant::String)) ; // null value } if ( aBangPath.size() >= 3 && aBangPath[2] ) { query2.bindValue(":b3", aBangPath[2]) ; } else { query2.bindValue(":b3", QVariant(QVariant::String)) ; // null value } if ( aBangPath.size() >= 4 && aBangPath[3] ) { query2.bindValue(":b4", aBangPath[3]) ; } else { query2.bindValue(":b4", QVariant(QVariant::String)) ; // null value } if ( aBangPath.size() >= 5 && aBangPath[4] ) { query2.bindValue(":b5", aBangPath[4]) ; } else { query2.bindValue(":b5", QVariant(QVariant::String)) ; // null value } ret = query2.exec() ; } if ( !ret ) { QLOG_STR(query2.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query2.lastError().text()) ; } else { LOG_STR2("Added/updated item to be published, type = %d", aType) ; } } } } PublishItem Model::addNodeToPublishedItem(const Hash& aContentHash, const Hash& aNodeHash) { PublishItem retval ; QSqlQuery query(iController->model().dataBaseConnection()); bool ret ; ret = query.prepare ("select itemtype, " " bangpath1,bangpath2,bangpath3,bangpath4,bangpath5,hostcount" " from publish where hash1=:hash1 and hash2=:hash2 and" " hash3=:hash3 and hash4=:hash4 and hash5=:hash5" ) ; query.bindValue(":hash1", aContentHash.iHash160bits[0]) ; query.bindValue(":hash2", aContentHash.iHash160bits[1]) ; query.bindValue(":hash3", aContentHash.iHash160bits[2]) ; query.bindValue(":hash4", aContentHash.iHash160bits[3]) ; query.bindValue(":hash5", aContentHash.iHash160bits[4]) ; ret = query.exec() ; if ( !ret ) { QLOG_STR("addNodeToPublishedItem error 1 " + query.lastError().text()); emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) ) { retval.iObjectType = (ProtocolItemType) ( query.value(0).toInt() ) ; QLOG_STR("addNodeToPublishedItem object type at return = " + retval.iObjectType); retval.iAlreadyPushedHosts.clear() ; if ( ! query.isNull(1) ) { retval.iAlreadyPushedHosts.append(query.value(1).toUInt()) ; } if ( ! query.isNull(2) ) { retval.iAlreadyPushedHosts.append(query.value(2).toUInt()) ; } if ( ! query.isNull(3) ) { retval.iAlreadyPushedHosts.append(query.value(3).toUInt()) ; } if ( ! query.isNull(4) ) { retval.iAlreadyPushedHosts.append(query.value(4).toUInt()) ; } if ( ! query.isNull(5) ) { retval.iAlreadyPushedHosts.append(query.value(5).toUInt()) ; } } int howManyNodesIsEnough ( 5 ) ; if ( iNodeModel->getHotAddresses().size() < howManyNodesIsEnough ) { // really minimalistic network. might be a real condition tough, // a private installation of some sort. howManyNodesIsEnough = iNodeModel->getHotAddresses().size() ; LOG_STR2("Node-count to decide publishing completed = %d", howManyNodesIsEnough) ; } if ( retval.iAlreadyPushedHosts.size() >= howManyNodesIsEnough ) { retval.iObjectHash = KNullHash ; // set NULL hash to mark that this is now done for ( int ii = 0 ; ii < retval.iAlreadyPushedHosts.size() ; ii++ ) { QString qStr = QString::number(retval.iAlreadyPushedHosts.at(ii) ); QLOG_STR("Deleteting from publish because " + qStr ) ; } QSqlQuery q2(iController->model().dataBaseConnection()) ; q2.prepare("delete from publish where hash1=:hash1 and hash2=:hash2 and" " hash3=:hash3 and hash4=:hash4 and hash5=:hash5") ; q2.bindValue(":hash1", aContentHash.iHash160bits[0]) ; q2.bindValue(":hash2", aContentHash.iHash160bits[1]) ; q2.bindValue(":hash3", aContentHash.iHash160bits[2]) ; q2.bindValue(":hash4", aContentHash.iHash160bits[3]) ; q2.bindValue(":hash5", aContentHash.iHash160bits[4]) ; q2.exec() ; QLOG_STR("Deleteted from publish, nr hosts was " + retval.iAlreadyPushedHosts.size() ) ; retval.iObjectHash = KNullHash ; } else { QSqlQuery q2(iController->model().dataBaseConnection()) ; q2.prepare("update publish set bangpath1=:b1,bangpath2=:b2,bangpath3=:b3," "bangpath4=:b4,bangpath5=:b5 where hash1=:hash1 and hash2=:hash2 and" " hash3=:hash3 and hash4=:hash4 and hash5=:hash5" ) ; q2.bindValue(":hash1", aContentHash.iHash160bits[0]) ; q2.bindValue(":hash2", aContentHash.iHash160bits[1]) ; q2.bindValue(":hash3", aContentHash.iHash160bits[2]) ; q2.bindValue(":hash4", aContentHash.iHash160bits[3]) ; q2.bindValue(":hash5", aContentHash.iHash160bits[4]) ; int i = 0 ; // put the low-order bits into bottom of the list: if ( !retval.iAlreadyPushedHosts.contains(aNodeHash.iHash160bits[4])) { quint32 low_order_bits = aNodeHash.iHash160bits[4]; LOG_STR2("Pub: adding host low-order bits #1 : %u", low_order_bits); retval.iAlreadyPushedHosts.append(low_order_bits) ; } // and store list into db: for ( ; i < retval.iAlreadyPushedHosts.size() ; i++ ) { q2.bindValue(QString(":b%1").arg(i+1), retval.iAlreadyPushedHosts[i]) ; LOG_STR2("In addNodeToPublishedItem already contained : %u", retval.iAlreadyPushedHosts[i]); } // update remaining to be null: for ( ; i < 5 ; i++ ) { q2.bindValue(QString(":b%1").arg(i+1), QVariant(QVariant::String)) ; LOG_STR2("In addNodeToPublishedItem b %d is null", i); } if ( q2.exec() == true ) { retval.iObjectHash = aContentHash ; } else { retval.iObjectHash = KNullHash ; // set NULL hash to mark that this is now not done QLOG_STR("addNodeToPublishedItem error 3 " + q2.lastError().text()); emit error(MController::DbTransactionError, q2.lastError().text()) ; } } } return retval ; } // slot hit when content is received from remote nodes void Model::notifyOfContentReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfReceivdContent) { LOG_STR2("Model::notifyOfContentReceived %d", aTypeOfReceivdContent) ; switch (aTypeOfReceivdContent) { case BinaryBlob: lock() ; for ( int i = (iNetReqQueue->size()-1) ; i >= 0 ; i--) { if(iNetReqQueue->value(i).iRequestType == RequestForBinaryBlob && iNetReqQueue->value(i).iRequestedItem == aHashOfContent ) { iNetReqQueue->removeAt(i) ; LOG_STR2("Removed associated netreq bblob at %d", i) ; } } unlock() ; break ; case UserProfile: lock() ; for ( int i = (iNetReqQueue->size()-1) ; i >= 0 ; i--) { if(iNetReqQueue->value(i).iRequestType == RequestForUserProfile && iNetReqQueue->value(i).iRequestedItem == aHashOfContent ) { iNetReqQueue->removeAt(i) ; LOG_STR2("Removed associated netreq prof at %d", i) ; } } unlock() ; break ; case ClassifiedAd: lock() ; for ( int i = (iNetReqQueue->size()-1) ; i >= 0 ; i--) { if(iNetReqQueue->value(i).iRequestType == RequestForClassifiedAd && // don't remove requests of other nodes, only UI-initiated // (having null destination node) iNetReqQueue->value(i).iDestinationNode == KNullHash && iNetReqQueue->value(i).iRequestedItem == aHashOfContent ) { iNetReqQueue->removeAt(i) ; LOG_STR2("Removed associated netreq ca at %d", i) ; } } unlock() ; break ; default: // no action break ; } } void Model::notifyOfContentReceived(const Hash& aHashOfContent, const Hash& /* aHashOfClassification */, const ProtocolItemType aTypeOfReceivdContent) { this->notifyOfContentReceived(aHashOfContent, aTypeOfReceivdContent) ; } // // this method is hit every 10 minutes - housekeeping here // void Model::timerEvent(QTimerEvent* #ifdef DEBUG event // in debug build logging needs event id #else /* event */ // in release this is not used for anything #endif ) { LOG_STR2( "timerEvent Timer ID: %d" , event->timerId()); const time_t currentTime ( QDateTime::currentDateTimeUtc().toTime_t() ) ; lock() ; // update mutual connect time: for ( int i = iConnections->size()-1 ; i >= 0 ; i-- ) { Connection *connectedNode = iConnections->at(i) ; if ( connectedNode->node() ) { iNodeModel->updateNodeLastMutualConnectTimeInDb (connectedNode->node()->nodeFingerPrint(),currentTime ) ; } } // then check for dead connections: for ( int i = iConnections->size()-1 ; i >= 0 ; i-- ) { Connection *connectedNode = iConnections->at(i) ; if ( connectedNode->iTimeOfLastActivity < ( currentTime - ( 60 * (Connection::iMinutesBetweenBucketFill+2) ) ) ) { // no traffic for minimum time + 2 minutes -> ask non-gently for closing: connectedNode->forciblyCloseSocket() ; LOG_STR2( "Connection at array pos %d has been dead -> abort()" , i); } } unlock() ; // // dead process checking now done // // continue with database housekeeping // QThread::yieldCurrentThread (); lock() ; iNodeModel->truncateDataTableToMaxRows() ; unlock() ; QThread::yieldCurrentThread (); lock() ; // looks like profiles (or more specifically, public keys) are // inserted from multitude of places ; with profile model // lets do so that it is asked to update count first from table. iProfileModel->updateDbTableRowCount() ; // and then go to work iProfileModel->truncateDataTableToMaxRows() ; unlock() ; QThread::yieldCurrentThread (); lock() ; iCaModel->truncateDataTableToMaxRows() ; unlock() ; QThread::yieldCurrentThread (); lock() ; iPrivMsgModel->truncateDataTableToMaxRows() ; unlock() ; QThread::yieldCurrentThread (); lock() ; iBinaryFileModel->truncateDataTableToMaxRows() ; unlock() ; QThread::yieldCurrentThread (); lock() ; iProfileCommentModel->updateDbTableRowCount() ; // and then go to work iProfileModel->truncateDataTableToMaxRows() ; unlock() ; QThread::yieldCurrentThread (); lock() ; iCaDbRecordModel->truncateDataTableToMaxRows() ; unlock() ; QThread::yieldCurrentThread (); lock() ; QSqlQuery vacuumQuery(iController->model().dataBaseConnection()) ; vacuumQuery.exec("vacuum") ; unlock() ; // then check out for local network addresses: if ( (iTimeOfLastNetworkAddrCheck + (120*60)) < // every 120 minutes QDateTime::currentDateTimeUtc().toTime_t()) { iTimeOfLastNetworkAddrCheck = QDateTime::currentDateTimeUtc().toTime_t(); lock() ; iController->networkListener()->figureOutLocalAddresses() ; unlock() ; } LOG_STR2( "timerEvent Timer ID: %d out" , event->timerId()); } Model::RingtoneSetting Model::getRingtoneSetting() { RingtoneSetting retval ( BowRingTone ) ; QSqlQuery query(iController->model().dataBaseConnection()); bool ret ; ret = query.prepare ("select ringtone from settings" ) ; ret = query.exec() ; if ( !ret ) { QLOG_STR("select ringtone from settings: " + query.lastError().text()); emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) ) { retval = (Model::RingtoneSetting)(query.value(0).toInt()); } } return retval ; } void Model::setRingtoneSetting(Model::RingtoneSetting aRingTone) { QSqlQuery query(iController->model().dataBaseConnection()); bool ret ( query.prepare ("update settings set ringtone = :r" ) ) ; if ( ret ) { query.bindValue(":r", aRingTone) ; query.exec() ; } } Model::CallAcceptanceSetting Model::getCallAcceptanceSetting() { CallAcceptanceSetting retval ( AcceptAllCalls ) ; QSqlQuery query(iController->model().dataBaseConnection()); bool ret ; ret = query.prepare ("select call_acceptance from settings" ) ; ret = query.exec() ; if ( !ret ) { QLOG_STR("select call acceptance from settings: " + query.lastError().text()); emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) ) { retval = (Model::CallAcceptanceSetting)(query.value(0).toInt()); } } return retval ; } void Model::setCallAcceptanceSetting(Model::CallAcceptanceSetting aAcceptance) { QSqlQuery query(iController->model().dataBaseConnection()); bool ret ( query.prepare ("update settings set call_acceptance = :a" ) ) ; if ( ret ) { query.bindValue(":a", aAcceptance) ; query.exec() ; } } // see also method threadTerminationCleanup QSqlDatabase Model::dataBaseConnection(bool* aIsFirstTime) { const QThread* t ( QThread::currentThread() ) ; if ( iDbPool.contains ( t ) ) { return iDbPool.value ( t ) ; } // was not in pool, instantiate and put the db connection into // pool for further use. bool tables_needed = false ; const QString threadId ( QString::number((qulonglong)(QThread::currentThreadId()))) ; iDbPool.insert(t,QSqlDatabase::addDatabase("QSQLITE", threadId)) ; QSqlDatabase db ( iDbPool.value ( t ) ); QLOG_STR("Instantiated new db for thread " + threadId + " nr connections = " + QString::number(iDbPool.count()) ) ; QString path(QDir::home().path()); path.append(QDir::separator()).append(".classified_ads"); if (!QDir(path).exists()) { QDir().mkdir(path) ; tables_needed = true ; } path.append(QDir::separator()).append("sqlite_db"); path = QDir::toNativeSeparators(path); if (!QFile(path).exists()) { tables_needed = true ; } if ( aIsFirstTime ) { *aIsFirstTime = tables_needed ; } db.setDatabaseName(path); // Open database bool isDbOpen = db.open() ; if ( isDbOpen ) { if ( tables_needed ) { // first time here, set file mode QFile databaseFile(path) ; databaseFile.setPermissions(QFile::ReadOwner|QFile::WriteOwner) ; } return db ; } else { QLOG_STR("database open did not succeed " + db.lastError().text() ); return db ; } } // see also method dataBaseConnection void Model::threadTerminationCleanup( const QThread *aTerminatingThread ) { QLOG_STR("Model::threadTerminationCleanup in " + QString::number((qulonglong)(QThread::currentThreadId())) ) ; lock(); if ( iDbPool.contains ( aTerminatingThread ) ) { QSqlDatabase dbToClose ( iDbPool.value ( aTerminatingThread ) ) ; const QString dbConnectionName ( dbToClose.connectionName() ) ; if ( dbToClose.isOpen() ) { dbToClose.close() ; } iDbPool.remove(aTerminatingThread) ; // first remove, it de-allocates the db QSqlDatabase::removeDatabase( dbConnectionName ) ; // then update static application-wide QLOG_STR("Removed db for thread " + QString::number((qulonglong)(QThread::currentThreadId())) + " connection name " + dbConnectionName + " nr connections = " + QString::number(iDbPool.count()) ) ; } unlock() ; } classified-ads-0.13/datamodel/model.h000066400000000000000000000316121331670245300175220ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti Jarvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_DATAMODEL_H #define CLASSIFIED_DATAMODEL_H #include #include #include "../mcontroller.h" // because enum from there is needed #include "../net/connection.h" #include #include #include #include "netrequestexecutor.h" #include "nodemodel.h" #include "mmodelprotocolinterface.h" #include "mnodemodelprotocolinterface.h" class QMutex ; class Hash ; class QSslCertificate ; class QSslKey ; class SearchModel ; class TrustTreeModel ; class TclModel ; class QThread ; /** * @brief M of the MVC pattern. Handles permanent storage. * * All permanent data storage inside classified ads goes somehow * via this class here. If user wants to display data, view gets * it from here, if a peer wants to leech a phile, it comes from here */ class Model : public MModelProtocolInterface { Q_OBJECT public: // public enums /** * Enumeration for ringtone settings. Numbering of * the enum must exactly follow indexing of * items in ringToneComboxBox in settings UI * dialog. */ enum RingtoneSetting { BowRingTone = 0, ElectricalRingTone = 1, AcousticRingTone = 2, BeepRingTone = 3 , NoRingTone = 4 } ; /** * Enumeration for call acceptance settings. Numbering of * the enum must exactly follow indexing of * items in callAcceptanceComboBox in settings UI * dialog. */ enum CallAcceptanceSetting { AcceptAllCalls = 0, AcceptCallsFromTrusted = 1, AcceptNoCalls = 2 } ; // methods Model(MController *aMController) ; ~Model() ; ContentEncryptionModel& contentEncryptionModel() const ; /**< method for getting content-encryption-specific datamodel */ virtual ProfileModel& profileModel() const ; /**< method for getting profile-specific datamodel */ virtual BinaryFileModel& binaryFileModel() const ; /**< method for getting binary-blob datamodel */ virtual ClassifiedAdsModel& classifiedAdsModel() const ; /**< method for getting the ads datamodel */ virtual PrivMessageModel& privateMessageModel() const ; /**< method for getting the priv msg datamodel */ virtual ProfileCommentModel& profileCommentModel() const ; /**< method for getting the comment datamodel */ virtual SearchModel* searchModel() const ; /**< method for getting the full text search datamodel */ virtual CaDbRecordModel* caDbRecordModel() const ; /**< method for getting distributed database model part */ virtual TrustTreeModel* trustTreeModel() const ; /**< method for getting the trust tree datamodel */ virtual TclModel& tclModel() const ; /**< method for getting the storage of TCL programs */ /** * Method for opening database connection. Since Qt5.11 database * class can't be shared between threads. * @param aIsFirstTime Optional parameter that, when set to non-NULL * will have its value set to true, if the database did not * exist prior to this call. * * @return Instance of database connection. Caller is responsible * to properly ->close() and delete the instance after use. */ virtual QSqlDatabase dataBaseConnection(bool* aIsFirstTime = NULL) ; /** * Method for adding newly created peer-connection to list kept * by datamodel */ void addOpenNetworkConnection(Connection *aConnection) ; /** * Method for telling datamodel about a existing network connection * has been closed for any reason that is valid for a socket. * @param aConnection is pointer to the connection * @return none */ void removeOpenNetworkConnection(Connection *aDeletedConnection) ; /** * Method that other parts of this program use to append * items into send queue of node connection. * @param aDestinationNode specifies the node to receive bytes * @param aBytesToSend contains the message. Ownership of bytes * is transferred to datamodel i.e. after this method is * called, the caller is not supposed to delete the * bytes itself but that task is left to datamodel to do. * @return none. */ void addItemToSend(const Hash& aDestinationNode, QByteArray* aBytesToSend) ; /** * Currently open connections. Caller does not own the returned list * and should not try adding/removing items from it. */ const QList & getConnections() const ; /** * Currently pending network requests. * Even as this returns a pointer, not a reference, * ownership of the list is not transferred ; caller * may modiify content but is not supposed to delete */ QList & getNetRequests() const ; /** * From MModelProtocolInterface * * method for adding a network request * @param aRequest is the request to add * @return none */ virtual void addNetworkRequest(NetworkRequestExecutor::NetworkRequestQueueItem& aRequest) const ; /** * From MModelProtocolInterface. * thread sync: this claims access to datamodel */ virtual bool lock() ; /** * From MModelProtocolInterface. * thread sync: releases data model to other threads */ virtual void unlock() ; /** * From MModelProtocolInterface. * * method for getting node-specific datamodel */ virtual MNodeModelProtocolInterface& nodeModel() const ; /** * pointer to class handling network requests */ NetworkRequestExecutor* getNetReqExecutor() ; /** * Close all connections that might be open. Called before * deletia. * @param aDeleteAlso if set to true, will delete remaining * connections. if that needs to be done, * results easily in SEGFAULT as connections * are threads .. they should be closed so * that threads no longer run, run() returns * and thread cleans up itself.. */ void closeAllConnections(bool aDeleteAlso) ; /** * method for communicating the fact that socket is open or closed */ void connectionStateChanged(Connection::ConnectionState aState, Connection *aConnection) ; /** * method for getting next item to publish * @param aFound will be set to true if there is an item to publish * @return if aFound is true, returned item contains details about * the item to publish. */ PublishItem nextItemToPublish(bool* aFound) ; /** * Method for marking item already in datamodel to be published via * @ref PublishingEngine class. For example, if publishing a profile * user must first insert the profile into profilemodel, and only * after that call this method here. * @param aType tells type of an item - profile,privmsg,binary blob etc. * @param aHash fingerprint for identifies object * @param aBangPath list of low-order hash-bits of nodes where this content * is already supposed to be found * @param aSecondaryAddr is possible 2nd publish addr, used for CA and comment. * for private messages this is the destination * node, if known. */ void addItemToBePublished(ProtocolItemType aType, const Hash& aHash, const QList& aBangPath, const Hash& aSecondaryAddr = KNullHash ) ; /** * When publishing-engine is doing its job, it uses this method to * update the list of nodes that have received the published content. * * @param aContentHash identifies the published content that has been * pushed into one node * @param aNodeHash identifies the node where content was pushed to * @return The same item to publish, now updated. If the content is * already published into enough hosts (model decides) it will * return a PublishItem will null hash to tell publishing-engine * that this piece of content is now done and it is time to * move to next. */ PublishItem addNodeToPublishedItem(const Hash& aContentHash,const Hash& aNodeHash) ; /** * getter method for users ringtone-setting */ Model::RingtoneSetting getRingtoneSetting() ; /** * getter method for users ringtone-setting */ void setRingtoneSetting(Model::RingtoneSetting aRingTone) ; /** * getter method for users call-acceptance-setting */ Model::CallAcceptanceSetting getCallAcceptanceSetting() ; /** * getter method for users call-acceptance-setting */ void setCallAcceptanceSetting(Model::CallAcceptanceSetting aAcceptance) ; public slots: /** * notification of content received */ void notifyOfContentReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfReceivdContent) ; /** * notification of classified ads received */ void notifyOfContentReceived(const Hash& aHashOfContent, const Hash& aHashOfClassification, const ProtocolItemType aTypeOfReceivdContent) ; /** * Thread cleanup slot. Most importantly closes possible open database * connection that thread may have open. Should be used by explicitly * calling from end of ::run() method or by connecting a suitable * signal to this slot. */ void threadTerminationCleanup( const QThread *aTerminatingThread ) ; protected: /** * for periodical stuff inside datamodel */ void timerEvent(QTimerEvent *event); private: bool openDB(); QSqlError lastError(); // 1st-time initialization methods ahead bool createTables(QSqlDatabase aDb) ; // additions to first version of tables bool createTablesV2(QSqlDatabase aDb) ; // additions to 2nd version of tables bool createTablesV3(QSqlDatabase aDb) ; // additions to 3rd version of tables bool createTablesV4(QSqlDatabase aDb) ; void initPseudoRandom() ; /**< just calls srand() */ signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: MController *iController ; /** * Pool of database connections, one for each thread. See method * @ref dataBaseConnection. When thread needs database connection, * it acquires QSqlDatabase and the instance is stored here, * thread pointer being the key to the database instance. When thread * stops executing it should call a cleanup slot * @ref threadTerminationCleanup. */ QMap iDbPool ; QMutex* iMutex ; /**< this mutex protects access to this datamodel */ QList *iConnections ; /** Network connections currently open */ NodeModel* iNodeModel ;/**< datamodel about our peers */ NetworkRequestExecutor* iNetReqExecutor ; /** * have datamodel own network request queue, this is our queue * of pending tasks */ QList * iNetReqQueue ; ContentEncryptionModel* iContentEncryptionModel ;/**< cryptographic animal */ ProfileModel* iProfileModel ; /**< Profile data storage */ BinaryFileModel* iBinaryFileModel ; /**< Random binary blob storage */ ClassifiedAdsModel* iCaModel ; /**< Classified ads storage */ int iTimerId ; /**< id of our periodical timer */ PrivMessageModel* iPrivMsgModel ; /**< storage of private messages */ ProfileCommentModel* iProfileCommentModel ; /**< comments data storage */ SearchModel* iSearchModel ; /**< full text search model part */ CaDbRecordModel* iCaDbRecordModel ;/**< distributed general-purpose database */ TrustTreeModel *iTrustTreeModel ; /**< trust list handling model */ time_t iTimeOfLastNetworkAddrCheck ; /**< timestamp of local addr update */ TclModel* iTclModel ; /**< TCL scripts storage */ } ; #endif classified-ads-0.13/datamodel/netrequestexecutor.cpp000066400000000000000000001402571331670245300227410ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "../mcontroller.h" #include "netrequestexecutor.h" #include #include "../log.h" #include "model.h" #include "../net/protocol_message_formatter.h" #include #include #include "profilemodel.h" #include "profile.h" #include "contentencryptionmodel.h" #include "binaryfilemodel.h" #include "camodel.h" #include "privmsgmodel.h" #include "profilecommentmodel.h" #include "cadbrecordmodel.h" #include "cadbrecord.h" #include "../net/protocol.h" #include NetworkRequestExecutor::NetworkRequestExecutor(MController *aController, Model& aModel) : QTimer(aController), iController(aController), iModel(aModel), iNowRunning(false), iLastTimeOfNodeConnectedNodeStatusUpdate(QDateTime::currentDateTimeUtc().toTime_t()) { connect(this, SIGNAL(timeout()), this, SLOT(run())); } NetworkRequestExecutor::~NetworkRequestExecutor() { } void NetworkRequestExecutor::run() { if ( iNowRunning ) return ; iNowRunning = true ; iModel.lock() ; QList & requests ( iModel.getNetRequests() ) ; for ( int i = requests.size()-1 ; i >= 0 ; i-- ) { NetworkRequestQueueItem& entry ( requests[i] ) ; if ( entry.iState == NewRequest ) { // yes, process entry.iState = Processing ; switch ( entry.iRequestType ) { case NodeGreeting: LOG_STR("Network request type NodeGreeting") ; processNodeGreeting(entry) ; break ; case RequestForNodesAroundHash: LOG_STR("Network request type RequestForNodesAroundHash") ; processRequestForNodesAroundHash(entry) ; break ; case RequestForBinaryBlob: LOG_STR("Network request type RequestForBinaryBlob") ; processRequestForBinaryBlob(entry) ; break ; case RequestForUserProfile: LOG_STR("Network request type RequestForUserProfile") ; processRequestForUserProfile(entry) ; break ; case RequestForProfileComment: LOG_STR("Network request type RequestForProfileComment") ; processRequestForUserProfileComment(entry) ; break ; case RequestForClassifiedAd: LOG_STR("Network request type RequestForClassifiedAd") ; processRequestForClassifiedAd(entry) ; break ; case RequestForProfilePoll: LOG_STR("Network request type RequestForProfilePoll") ; processRequestForProfilePoll(entry) ; break ; case UserProfilePublish: LOG_STR("Network request type UserProfilePublish") ; processRequestForContentPublish(entry) ; break ; case BinaryFilePublish: LOG_STR("Network request type BinaryFilePublish") ; processRequestForContentPublish(entry) ; break ; case ProfileCommentPublish: LOG_STR("Network request type ProfileCommentPublish") ; processRequestForContentPublish(entry) ; break ; case ClassifiedAdPublish: LOG_STR("Network request type ClassifiedAdPublish") ; processRequestForContentPublish(entry) ; break ; case PrivateMessagePublish: LOG_STR("Network request type PrivateMessagePublish") ; processRequestForPrivateMessagePublish(entry) ; break ; case BinaryBlob: // in practice, some other node has sent us query LOG_STR("Network request type BinaryBlob") ; processBinaryBlob(entry) ; break ; case PrivateMessage: // in practice, some other node has sent us query LOG_STR("Network request type PrivateMessage") ; processPrivateMessage(entry) ; break ; case UserProfileCommentsForProfile: // in practice, some other node has sent us query LOG_STR("Network request type UserProfileCommentsForProfile") ; processUserProfileCommentsForProfile(entry) ; break ; case UserProfileComment: LOG_STR("Network request type UserProfileComment") ; processUserProfileComment(entry) ; break ; case PrivateMessagesForProfile: LOG_STR("Network request type PrivateMessagesForProfile") ; processPrivateMessagesForProfile(entry) ; break ; case UserProfile: // in practice, some other node has sent us query LOG_STR("Network request type UserProfile") ; processUserProfile(entry) ; break ; case ClassifiedAd: // in practice, some other node has sent us query LOG_STR("Network request type ClassifiedAd") ; processClassifiedAd(entry) ; break ; case RequestAdsClassified: // some other node has sent us query about CAs by classification LOG_STR("Network request type RequestAdsClassified") ; processAdsClassified(entry) ; break ; case DbRecordPublish: // new db record added and will be published LOG_STR("Network request type DbRecordPublish") ; processRequestForContentPublish(entry) ; break ; default: LOG_STR2("Unhandled Network request type %d", entry.iRequestType) ; entry.iState = ReadyToSend ; break; } } // remove entries that are done, or more than 10 minutes old if ( entry.iState == ReadyToSend || ( entry.iTimeStampOfLastActivity + 10*60 ) < QDateTime::currentDateTimeUtc().toTime_t() ) { requests.removeAt(i) ; LOG_STR2("removing completed/old network req at index %d", i) ; } iModel.unlock() ; QThread::yieldCurrentThread (); iModel.lock() ; // if there is a lot of requests in the queue, give other threads // also a chance } // then do a peridical check ; if enough time has passed since // last update of statuses of connected peers, update them: if ( QDateTime::currentDateTimeUtc().toTime_t() > (iLastTimeOfNodeConnectedNodeStatusUpdate+300)) { // every 300 seconds iLastTimeOfNodeConnectedNodeStatusUpdate = QDateTime::currentDateTimeUtc().toTime_t() ; Node* nodeOfConnection = NULL ; // problem here .. the node returned by connection may be // incomplete ; it is not based on node greeting of the // node itself, it actually contains only hash and // ip addr.. QSqlQuery query(iController->model().dataBaseConnection()); // sqlite documentation says that while single sql statement is // fast, transaction is slow. because here we after some time // running always make both insert and delete, lets have then // inside transaction so they hopefully will be handled // with single commit then..? query.exec("begin transaction ;") ; for ( int i = iModel.getConnections().size()-1 ; i >= 0 ; i-- ) { nodeOfConnection = iModel.getConnections().value(i)->node() ; if ( nodeOfConnection ) { nodeOfConnection->setLastConnectTime(QDateTime::currentDateTimeUtc().toTime_t()) ; iModel.nodeModel().updateNodeLastConnectTimeInDb(*nodeOfConnection) ; } } query.exec("commit;") ; // transaction } // that's all folks iModel.unlock() ; iNowRunning = false ; } void NetworkRequestExecutor::processRequestForNodesAroundHash(NetworkRequestQueueItem& aEntry) { const QList & currentlyOpenConnections ( iModel.getConnections() ) ; for ( int i = 0 ; i < currentlyOpenConnections.size() && i < aEntry.iMaxNumberOfItems ; i++ ) { const Node* conn_n = currentlyOpenConnections[i]->node() ; if ( conn_n && conn_n->nodeFingerPrint() != KNullHash ) { QByteArray* resultBytes = new QByteArray(ProtocolMessageFormatter::requestForNodesAroundHash(aEntry.iRequestedItem)) ; iModel.addItemToSend(conn_n->nodeFingerPrint(), resultBytes) ; } } aEntry.iState = ReadyToSend ; } void NetworkRequestExecutor::processRequestForContentPublish(NetworkRequestQueueItem& aEntry) { LOG_STR("NetworkRequestExecutor::processRequestForContentPublish in") ; doSendRequestToNode(aEntry) ; aEntry.iState = ReadyToSend ; } void NetworkRequestExecutor::processRequestForPrivateMessagePublish(NetworkRequestQueueItem& aEntry) { LOG_STR("NetworkRequestExecutor::processRequestForPrivateMessagePublish in") ; if ( aEntry.iDestinationNode != KNullHash && iModel.nodeModel().isNodeAlreadyConnected(aEntry.iDestinationNode) ) { doSendRequestToNode(aEntry) ; aEntry.iState = ReadyToSend ; } else { if ( aEntry.iDestinationNode != KNullHash ) { if ( iModel.nodeModel().addNodeToConnectionWishList(aEntry.iDestinationNode) ) { aEntry.iTimeStampOfLastActivity = QDateTime::currentDateTimeUtc().toTime_t(); aEntry.iState = NodeIsInWishList ; } else { LOG_STR("Failed to add node to connection wishlist??? when handling privmsg") ; aEntry.iState = ReadyToSend ; } } else { // destination node is not known.. aEntry.iState = ReadyToSend ; } } } void NetworkRequestExecutor::processNodeGreeting (NetworkRequestQueueItem& aEntry) { // here have possibility to have 2 meanings .. if iRequestedItem is // null, then just send some nodes. In practice send the hot nodes // or something. QList* nodesToSend = NULL ; if ( KNullHash == aEntry.iRequestedItem ) { // hot nodes nodesToSend= iModel.nodeModel().getHotNodes(aEntry.iMaxNumberOfItems) ; } else { // nodes around iRequestedItem -> lets do so that when content // has some hash, the nodes that store the content are the nodes // whose hash is immediately after the hash of the content. // // this is important tidbit of information if you need to // pinpoint a node containing some content nodesToSend= iModel.nodeModel().getNodesAfterHash(aEntry.iRequestedItem, aEntry.iMaxNumberOfItems) ; } if ( nodesToSend ) { if ( nodesToSend->count() > 0 ) { QByteArray* resultBytes = new QByteArray() ; if ( nodesToSend->size() ) { for ( int i = nodesToSend->size()-1 ; i>= 0 ; i-- ) { Node* n = nodesToSend->value(i) ; resultBytes->append(ProtocolMessageFormatter::nodeGreeting(*n)); delete n ; nodesToSend->removeAt(i) ; } } if ( resultBytes->size() ) { // datamodel will delete resultBytes iModel.addItemToSend(aEntry.iDestinationNode, resultBytes) ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } } delete nodesToSend ; } aEntry.iState = ReadyToSend ; } void NetworkRequestExecutor::processRequestForBinaryBlob(NetworkRequestQueueItem& aEntry) { LOG_STR("NetworkRequestExecutor::processRequestForBinaryBlob in") ; // ok, we'll want to send selected neighboring nodes // a request regarding a hash. if ( aEntry.iDestinationNode != KNullHash ) { // check if the punk is lucky right away: if ( iModel.nodeModel().isNodeAlreadyConnected(aEntry.iDestinationNode) ) { doSendRequestToNode(aEntry) ; aEntry.iState = ReadyToSend ; } else { // add host to connection wishlist: if ( iModel.nodeModel().addNodeToConnectionWishList(aEntry.iDestinationNode) ) { aEntry.iTimeStampOfLastActivity = QDateTime::currentDateTimeUtc().toTime_t(); aEntry.iState = NodeIsInWishList ; } } } } void NetworkRequestExecutor::processRequestForClassifiedAd(NetworkRequestQueueItem& aEntry) { LOG_STR("NetworkRequestExecutor::processRequestForClassifiedAd in") ; // neighboring node requested an classified ad if ( aEntry.iDestinationNode != KNullHash ) { // check if the punk is lucky right away: if ( iModel.nodeModel().isNodeAlreadyConnected(aEntry.iDestinationNode) ) { doSendRequestToNode(aEntry) ; aEntry.iState = ReadyToSend ; } else { // add host to connection wishlist: if ( iModel.nodeModel().addNodeToConnectionWishList(aEntry.iDestinationNode) ) { aEntry.iTimeStampOfLastActivity = QDateTime::currentDateTimeUtc().toTime_t(); aEntry.iState = NodeIsInWishList ; } } } } void NetworkRequestExecutor::processRequestForProfilePoll(NetworkRequestQueueItem& aEntry) { // profile poll has 2 functions: there may be update to profile itself // or new comments posted. we send single request for both those things, // and the receiver of the poll-request will send updated profile // and possible comments. // if node of the profile is known, it is stored at aEntry.iDestinationNode and // naturally we send the poll there, as it is the best place for // possible profile update. in addition to that, we'll find the normal // publish-nodes for the profile and repeat the query there. aEntry.iTimeStampOfLastActivity = QDateTime::currentDateTimeUtc().toTime_t(); // so, first possible destination-node if ( aEntry.iDestinationNode != KNullHash ) { if ( iModel.nodeModel().isNodeAlreadyConnected(aEntry.iDestinationNode) ) { doSendRequestToNode(aEntry,aEntry.iDestinationNode) ; } else { // add host to connection wishlist: if ( iModel.nodeModel().addNodeToConnectionWishList(aEntry.iDestinationNode) ) { } } } // then the normal publish-nodes sendRequestToNodesAroundHash( aEntry, true) ; // aUseContentHashNotDestination==true // above call will also set aEntry.iState so here we have no need ; // next state actually depends on that if all required nodes // were already connected.. } // very similar to binary blob handling void NetworkRequestExecutor::processRequestForUserProfile(NetworkRequestQueueItem& aEntry) { LOG_STR("NetworkRequestExecutor::processRequestForUserProfile in") ; if ( aEntry.iDestinationNode != KNullHash ) { // check if the punk is lucky right away: if ( iModel.nodeModel().isNodeAlreadyConnected(aEntry.iDestinationNode) ) { doSendRequestToNode(aEntry) ; aEntry.iState = ReadyToSend ; } else { // add host to connection wishlist: if ( iModel.nodeModel().addNodeToConnectionWishList(aEntry.iDestinationNode) ) { aEntry.iTimeStampOfLastActivity = QDateTime::currentDateTimeUtc().toTime_t(); aEntry.iState = NodeIsInWishList ; } } } } void NetworkRequestExecutor::processRequestForUserProfileComment(NetworkRequestQueueItem& aEntry) { LOG_STR("NetworkRequestExecutor::processRequestForUserProfileComment in") ; if ( aEntry.iDestinationNode != KNullHash ) { // check if the punk is lucky right away: if ( iModel.nodeModel().isNodeAlreadyConnected(aEntry.iDestinationNode) ) { doSendRequestToNode(aEntry,aEntry.iDestinationNode) ; aEntry.iState = ReadyToSend ; } else { // add host to connection wishlist: if ( iModel.nodeModel().addNodeToConnectionWishList(aEntry.iDestinationNode) ) { aEntry.iTimeStampOfLastActivity = QDateTime::currentDateTimeUtc().toTime_t(); aEntry.iState = NodeIsInWishList ; } } } else { sendRequestToNodesAroundHash(aEntry, true) ; // true == "use content hash" } } // in practice ; here we receive notifications about our wishlist-nodes void NetworkRequestExecutor::nodeConnectionAttemptStatus(Connection::ConnectionState aStatus, const Hash aHashOfAttemptedNode ) { LOG_STR2("NetworkRequestExecutor::nodeConnectionAttemptStatus %d in", aStatus) ; LOG_STR2("NetworkRequestExecutor::nodeConnectionAttemptStatus %s ", qPrintable(aHashOfAttemptedNode.toString())) ; // use model to lock our own resources too.. iModel.lock() ; QList & requests ( iModel.getNetRequests() ) ; for ( int i = requests.size()-1 ; i >= 0 ; i-- ) { NetworkRequestQueueItem& entry ( requests[i] ) ; if ( aStatus == Connection::Open && entry.iDestinationNode == aHashOfAttemptedNode && entry.iState == NodeIsInWishList ) { // was our wishlist-item and connection was success doSendRequestToNode(entry) ; entry.iState = ReadyToSend ; } else if ( aStatus != Connection::Open && entry.iDestinationNode == aHashOfAttemptedNode && entry.iState == NodeIsInWishList ) { // was our wishlist-item and could not make connection sendRequestToNodesAroundHash(entry) ; } else if ( aStatus == Connection::Open && entry.iWishListForNodesAround.contains( aHashOfAttemptedNode ) && entry.iState == RequestBeingSentAround ) { // was our wishlist-item for nodes and connection was success doSendRequestToNode(entry,aHashOfAttemptedNode) ; entry.iWishListForNodesAround.removeOne(aHashOfAttemptedNode) ; if ( entry.iWishListForNodesAround.size() == 0 ) { entry.iState = ReadyToSend ; } } else if ( aStatus != Connection::Open && entry.iWishListForNodesAround.contains( aHashOfAttemptedNode ) && entry.iState == RequestBeingSentAround ) { // was our wishlist-item for nodes and connection was not success entry.iWishListForNodesAround.removeOne(aHashOfAttemptedNode) ; if ( entry.iWishListForNodesAround.size() == 0 ) { entry.iState = ReadyToSend ; } } } // end of for requests.. iModel.unlock() ; } void NetworkRequestExecutor::doSendRequestToNode(NetworkRequestQueueItem& aEntry, const Hash& aNodeToSend) { aEntry.iTimeStampOfLastActivity = QDateTime::currentDateTimeUtc().toTime_t(); switch ( aEntry.iRequestType ) { case NodeGreeting: { LOG_STR("doSendRequestToNode type NodeGreeting") ; Node* n ( iModel.nodeModel().nodeByHash ( aEntry.iRequestedItem)) ; if ( n ) { QByteArray* resultBytes = new QByteArray() ; resultBytes->append(ProtocolMessageFormatter::nodeGreeting(*n)) ; iModel.addItemToSend(aNodeToSend == KNullHash ? aEntry.iDestinationNode : aNodeToSend , resultBytes) ; delete n ; } } break ; case PrivateMessagePublish: { LOG_STR("doSendRequestToNode PrivateMessagePublish") ; QByteArray msg ; QByteArray msgSignature ; QByteArray* resultBytes = new QByteArray() ; quint32 timeOfPublish ; Hash resultingDestination ; Hash resultingRecipient ; if ( iModel.privateMessageModel().messageDataByFingerPrint(aEntry.iRequestedItem, msg, msgSignature, &resultingDestination, &resultingRecipient, &timeOfPublish) ) { // message was found, lets send: resultBytes->append(ProtocolMessageFormatter::privMsgPublish(aEntry.iRequestedItem, msg, msgSignature, aEntry.iBangPath, resultingDestination, resultingRecipient, timeOfPublish )); msg.clear() ; msgSignature.clear() ; if ( resultBytes->size() ) { // datamodel will delete resultBytes iModel.addItemToSend(aNodeToSend == KNullHash ? aEntry.iDestinationNode : aNodeToSend, resultBytes) ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } } else { aEntry.iState = ReadyToSend ; QLOG_STR("Could not find msg supposed to be published, id=" + aEntry.iRequestedItem.toString()) ; delete resultBytes ; } } break ; case RequestForBinaryBlob: { LOG_STR("doSendRequestToNode RequestForBinaryBlob") ; QByteArray* resultBytes = new QByteArray() ; resultBytes->append(ProtocolMessageFormatter::requestForBinaryBlob(aEntry.iRequestedItem)) ; iModel.addItemToSend(aNodeToSend == KNullHash ? aEntry.iDestinationNode : aNodeToSend , resultBytes) ; } break ; case RequestForClassifiedAd: { LOG_STR2("doSendRequestToNode RequestForClassifiedAd (hash high-bits %u)",aEntry.iRequestedItem.iHash160bits[0]) ; QByteArray* resultBytes = new QByteArray() ; resultBytes->append(ProtocolMessageFormatter::requestForClassifiedAd(aEntry.iRequestedItem)) ; iModel.addItemToSend(aNodeToSend == KNullHash ? aEntry.iDestinationNode : aNodeToSend , resultBytes) ; } break ; case RequestForUserProfile: { LOG_STR("doSendRequestToNode RequestForUserProfile") ; if ( ! ( aNodeToSend == KNullHash && aEntry.iDestinationNode == KNullHash ) ) { QByteArray* resultBytes = new QByteArray() ; resultBytes->append(ProtocolMessageFormatter::requestForUserProfile(aEntry.iRequestedItem)) ; iModel.addItemToSend(aNodeToSend == KNullHash ? aEntry.iDestinationNode : aNodeToSend , resultBytes) ; } } break ; case RequestForProfileComment: { LOG_STR("doSendRequestToNode RequestForProfileComment") ; if ( ! ( aNodeToSend == KNullHash && aEntry.iDestinationNode == KNullHash ) ) { QByteArray* resultBytes = new QByteArray() ; resultBytes->append(ProtocolMessageFormatter::requestForUserProfileComment(aEntry.iRequestedItem)) ; iModel.addItemToSend(aNodeToSend == KNullHash ? aEntry.iDestinationNode : aNodeToSend , resultBytes) ; } } break ; case ClassifiedAdPublish: { LOG_STR("doSendRequestToNode RequestForClassifiedAdPublish") ; QByteArray ca ; QByteArray caSignature ; QByteArray* resultBytes = new QByteArray() ; QByteArray caKey ; quint32 timeOfPublish ; if ( iModel.classifiedAdsModel().caDataForPublish(aEntry.iRequestedItem, ca, caSignature, caKey, &timeOfPublish) ) { resultBytes->append(ProtocolMessageFormatter::contentPublish(KClassifiedAdPublish, aEntry.iRequestedItem, ca, caSignature, aEntry.iBangPath, caKey, false, false, timeOfPublish )); } caKey.clear() ; ca.clear() ; caSignature.clear() ; if ( resultBytes->size() ) { // datamodel will delete resultBytes iModel.addItemToSend(aNodeToSend == KNullHash ? aEntry.iDestinationNode : aNodeToSend, resultBytes) ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } } break ; case UserProfilePublish: { LOG_STR("doSendRequestToNode UserProfilePublish") ; QByteArray profile ; QByteArray profileSignature ; QByteArray* resultBytes = new QByteArray() ; QByteArray profileKey ; bool isContentEncrypted = false ; quint32 timeOfPublish (0 ) ; if ( iModel.contentEncryptionModel().PublicKey(aEntry.iRequestedItem, profileKey ) ) { if ( iModel.profileModel().profileDataByFingerPrint(aEntry.iRequestedItem, profile, profileSignature, &isContentEncrypted, &timeOfPublish ) ) { resultBytes->append(ProtocolMessageFormatter::contentPublish(KProfilePublish, aEntry.iRequestedItem, profile, profileSignature, aEntry.iBangPath, profileKey, isContentEncrypted, false, timeOfPublish )); } } profileKey.clear() ; profile.clear() ; profileSignature.clear() ; if ( resultBytes->size() ) { // datamodel will delete resultBytes iModel.addItemToSend(aNodeToSend == KNullHash ? aEntry.iDestinationNode : aNodeToSend, resultBytes) ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } } break ; case BinaryFilePublish: { LOG_STR("doSendRequestToNode BinaryFilePublish") ; QByteArray binary ; QByteArray binarySignature ; QByteArray* resultBytes = new QByteArray() ; QByteArray binaryKey ; bool isContentEncrypted = false ; bool isContentCompressed = false ; quint32 timeOfPublish ( 0 ) ; if ( iModel.binaryFileModel().binaryFileDataForSend(aEntry.iRequestedItem, binary, binarySignature, binaryKey, &isContentEncrypted, &isContentCompressed, &timeOfPublish) ) { resultBytes->append(ProtocolMessageFormatter::contentPublish(KBinaryFilePublish, aEntry.iRequestedItem, binary, binarySignature, aEntry.iBangPath, binaryKey, isContentEncrypted, isContentCompressed, timeOfPublish )); } binaryKey.clear() ; binary.clear() ; binarySignature.clear() ; if ( resultBytes->size() ) { // datamodel will delete resultBytes iModel.addItemToSend(aNodeToSend == KNullHash ? aEntry.iDestinationNode : aNodeToSend, resultBytes) ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } } break ; case ProfileCommentPublish: { LOG_STR("doSendRequestToNode ProfileCommentPublish") ; QByteArray binary ; QByteArray binarySignature ; QByteArray* resultBytes = new QByteArray() ; quint32 flags ; quint32 timeOfPublish ( 0 ) ; Hash profileHash ; if ( iModel.profileCommentModel().commentDataByFingerPrint(aEntry.iRequestedItem, binary, binarySignature, &profileHash, &flags, &timeOfPublish) ) { resultBytes->append(ProtocolMessageFormatter::profileCommentPublish(aEntry.iRequestedItem, binary, binarySignature, aEntry.iBangPath, profileHash, timeOfPublish, flags )); } binary.clear() ; binarySignature.clear() ; if ( resultBytes->size() ) { // datamodel will delete resultBytes iModel.addItemToSend(aNodeToSend == KNullHash ? aEntry.iDestinationNode : aNodeToSend, resultBytes) ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } } break ; case DbRecordPublish: { LOG_STR("doSendRequestToNode DbRecordPublish") ; QList dbRecordsToPublish ( iModel .caDbRecordModel() ->searchRecords(KNullHash, aEntry.iRequestedItem, 0 , // modified after std::numeric_limits::max(), // modified before std::numeric_limits::min(), // search number min std::numeric_limits::max(), // search number max QString::null, // searchphrase KNullHash, // by sender true) ) ; // is for publish, here "yes" foreach ( const CaDbRecord* r, dbRecordsToPublish ) { QByteArray* resultBytes = new QByteArray() ; resultBytes->append( ProtocolMessageFormatter::dbRecordPublish( *r, aEntry.iBangPath )); if ( resultBytes->size() ) { // datamodel will delete resultBytes iModel.addItemToSend(aNodeToSend == KNullHash ? aEntry.iDestinationNode : aNodeToSend, resultBytes) ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } } // db record model obliges us to delete the resultset: while ( dbRecordsToPublish.isEmpty() == false ) { CaDbRecord *deletee = dbRecordsToPublish.takeFirst() ; delete deletee ; } } break ; case RequestAdsClassified: // we come here after nodes have been put to wishlist LOG_STR2("doSendRequestToNode RequestAdsClassified %d", aEntry.iRequestType) ; if ( aNodeToSend != KNullHash ) { QByteArray* resultBytes = new QByteArray() ; resultBytes->append( ProtocolMessageFormatter::requestForAdsClassified( aEntry.iRequestedItem, aEntry.iTimeStampOfItem, aEntry.iTimeStampOfLastActivity ) ) ; if ( resultBytes->size() ) { // datamodel will delete resultBytes iModel.addItemToSend(aNodeToSend, resultBytes) ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } } break ; case RequestForProfilePoll: // this sends a poll-type requst to node, asking if there // has been any activity noticed regarding a profile. // in practice it would mean new profile publish or // addition of a new profile-comment. LOG_STR2("doSendRequestToNode RequestForProfilePoll %d", aEntry.iRequestType) ; if ( aNodeToSend != KNullHash ) { QByteArray* resultBytes = new QByteArray() ; // in case of RequestForProfilePoll the "iRequestedItem" always // carries the hash of the profile whose update is needed // while iDestinationNode may have hash of the node where // operator is publishing her secrets. // // message formatter calls this "request for profile comments" // but in practice nodes will respond also with // updated profile, if one is found lying around. resultBytes->append(ProtocolMessageFormatter::requestForProfileComments(aEntry.iRequestedItem, aEntry.iTimeStampOfItem ) ) ; if ( resultBytes->size() ) { // datamodel will delete resultBytes iModel.addItemToSend(aNodeToSend, resultBytes) ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } } break ; default: LOG_STR2("doSendRequestToNode unknown type %d", aEntry.iRequestType) ; break; } } void NetworkRequestExecutor::sendRequestToNodesAroundHash(NetworkRequestQueueItem& aEntry, bool aUseContentHashNotDestination) { // here you see important tidbit of information: if we wish to find // an item from DHT we use hash of the item. From the hash we produce // list of nodes that are supposed to carry that item. This list // is produced in publishing engine ( ../net/publishingengine.cpp method // ::run() ) where it right now says that take 20 nodes *after* the hash // in question. If we wish to find the same content again, we must // use the same formula here. QList* nodesToTry = iModel.nodeModel().getNodesAfterHash(aUseContentHashNotDestination ? aEntry.iRequestedItem : aEntry.iDestinationNode, 20, // 20 nodes 300 ) ;// at most 5 hours old if ( nodesToTry == NULL || nodesToTry->size() == 0 ) { // try widening the requirements a bit: nodesToTry = iModel.nodeModel().getNodesAfterHash(aUseContentHashNotDestination ? aEntry.iRequestedItem : aEntry.iDestinationNode, 30, // 20 nodes 1440 ) ;// at most 24 hours old // uh, oh. do not try then. the request has failed. if ( nodesToTry == NULL || nodesToTry->size() == 0 ) { aEntry.iState = ReadyToSend ; } } if ( nodesToTry != NULL && nodesToTry->size() > 0 ) { while ( ! nodesToTry->isEmpty() ) { Node* connectCandidate ( nodesToTry->takeFirst() ) ; if ( iModel.nodeModel().isNodeAlreadyConnected(*connectCandidate) ) { doSendRequestToNode(aEntry, connectCandidate->nodeFingerPrint()) ; } else { // put the node into wishlist if ( !aEntry.iWishListForNodesAround.contains(connectCandidate->nodeFingerPrint()) ) { if ( iModel.nodeModel().addNodeToConnectionWishList(connectCandidate->nodeFingerPrint()) ) { aEntry.iTimeStampOfLastActivity = QDateTime::currentDateTimeUtc().toTime_t(); aEntry.iWishListForNodesAround.append(connectCandidate->nodeFingerPrint()) ; } } } delete connectCandidate ; } // if we managed to put any nodes into wishlist, // then keep the entry, otherwise mark it as "readytosend" // e.g. finished from this classes perspective. if ( aEntry.iWishListForNodesAround.size() ) { aEntry.iState = RequestBeingSentAround ; } else { aEntry.iState = ReadyToSend ; } } } // another node requested a binary blob: here is served void NetworkRequestExecutor::processBinaryBlob(NetworkRequestQueueItem& aEntry) { LOG_STR("processBinaryBlob in") ; { QByteArray binary ; QByteArray binarySignature ; QByteArray* resultBytes = new QByteArray() ; QByteArray binaryKey ; bool isContentEncrypted = false ; bool isContentCompressed = false ; quint32 timeWhenBinaryFileWasPublished ; if ( iModel.binaryFileModel().binaryFileDataForSend(aEntry.iRequestedItem, binary, binarySignature, binaryKey, &isContentEncrypted, &isContentCompressed, &timeWhenBinaryFileWasPublished) ) { resultBytes->append(ProtocolMessageFormatter::contentSend(KBinaryFileSend, aEntry.iRequestedItem, binary, binarySignature, binaryKey, isContentEncrypted, isContentCompressed, timeWhenBinaryFileWasPublished )); } binaryKey.clear() ; binary.clear() ; binarySignature.clear() ; if ( resultBytes->size() ) { // datamodel will delete resultBytes iModel.addItemToSend(aEntry.iDestinationNode , resultBytes) ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } } aEntry.iState = ReadyToSend ; } // another node requested a private message: here is served void NetworkRequestExecutor::processPrivateMessage(NetworkRequestQueueItem& aEntry) { LOG_STR("processPrivateMessage in") ; QByteArray msg ; QByteArray msgSignature ; QByteArray* resultBytes = new QByteArray() ; quint32 timeOfPublish ; Hash resultingDestination ; Hash resultingRecipient ; if ( iModel.privateMessageModel().messageDataByFingerPrint(aEntry.iRequestedItem, msg, msgSignature, &resultingDestination, &resultingRecipient, &timeOfPublish) ) { // message was found, lets send: resultBytes->append(ProtocolMessageFormatter::privMsgSend(aEntry.iRequestedItem, msg, msgSignature, resultingDestination, resultingRecipient, timeOfPublish )); msg.clear() ; msgSignature.clear() ; if ( resultBytes->size() ) { // datamodel will delete resultBytes iModel.addItemToSend(aEntry.iDestinationNode, resultBytes) ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } } else { QLOG_STR("Could not find msg supposed to be published, id=" + aEntry.iRequestedItem.toString()) ; delete resultBytes ; } aEntry.iState = ReadyToSend ; } void NetworkRequestExecutor::processUserProfileComment(NetworkRequestQueueItem& aEntry) { if ( aEntry.iDestinationNode != KNullHash ) { QByteArray binary ; QByteArray binarySignature ; QByteArray* resultBytes = new QByteArray() ; quint32 flags ; quint32 timeOfPublish ( 0 ) ; Hash profileHash ; if ( iModel.profileCommentModel().commentDataByFingerPrint(aEntry.iRequestedItem, binary, binarySignature, &profileHash, &flags, &timeOfPublish)) { resultBytes->append(ProtocolMessageFormatter::profileCommentSend(aEntry.iRequestedItem, binary, binarySignature, profileHash, timeOfPublish, flags )); } binary.clear() ; binarySignature.clear() ; if ( resultBytes->size() ) { // datamodel will delete resultBytes iModel.addItemToSend( aEntry.iDestinationNode , resultBytes) ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } } aEntry.iState = ReadyToSend ; } // another node requested a private message: here is served void NetworkRequestExecutor::processPrivateMessagesForProfile(NetworkRequestQueueItem& aEntry) { LOG_STR("processPrivateMessagesForProfile in") ; // ok, what do we do here? // we were requested for all messages for profile .. we can't // send them at once, so lets make a network request queue item // of each message that we manage to find. QList messagesToRequest ( iModel.privateMessageModel().messagesForProfile(aEntry.iRequestedItem, aEntry.iTimeStampOfItem) ) ; foreach ( Hash articleHash, messagesToRequest ) { NetworkRequestQueueItem newRequest ; newRequest.iRequestType = PrivateMessage ; // single message here newRequest.iRequestedItem = articleHash ; newRequest.iDestinationNode = aEntry.iDestinationNode ; newRequest.iState = NewRequest ; newRequest.iMaxNumberOfItems = 1 ; iModel.addNetworkRequest(newRequest) ; } aEntry.iState = ReadyToSend ; } void NetworkRequestExecutor::processUserProfileCommentsForProfile(NetworkRequestQueueItem& entry) { LOG_STR("processUserProfileCommentsForProfile in") ; QList messagesToRequest ( iModel.profileCommentModel().commentsForProfile(entry.iRequestedItem, entry.iTimeStampOfItem) ) ; foreach ( Hash commentHash, messagesToRequest ) { NetworkRequestQueueItem newRequest ; newRequest.iRequestType = UserProfileComment ; // single comment here newRequest.iRequestedItem = commentHash ; newRequest.iDestinationNode = entry.iDestinationNode ; newRequest.iState = NewRequest ; newRequest.iMaxNumberOfItems = 1 ; iModel.addNetworkRequest(newRequest) ; } // in addition to comments, check if there as been update to the // profile itself: time_t lastUpdateTime = iModel.profileModel().getLastProfileUpdateTime(entry.iRequestedItem); if ( lastUpdateTime > (unsigned)(entry.iTimeStampOfItem) ) { // yes, the profile itself has been updated too NetworkRequestQueueItem profileRequest ; profileRequest.iRequestType = UserProfile ; // single comment here profileRequest.iRequestedItem = entry.iRequestedItem ; profileRequest.iDestinationNode = entry.iDestinationNode ; profileRequest.iState = NewRequest ; profileRequest.iMaxNumberOfItems = 1 ; iModel.addNetworkRequest(profileRequest) ; } entry.iState = ReadyToSend ; } void NetworkRequestExecutor::processUserProfile(NetworkRequestQueueItem& aEntry) { LOG_STR("processUserProfile in") ; QByteArray profile ; QByteArray profileSignature ; QByteArray* resultBytes = new QByteArray() ; QByteArray profileKey ; bool isContentEncrypted = false ; bool isContentCompressed = false ; quint32 timeWhenProfileWasPublished ; if ( iModel.profileModel().profileDataByFingerPrint(aEntry.iRequestedItem, profile, profileSignature, &isContentEncrypted, &timeWhenProfileWasPublished, &profileKey) ) { resultBytes->append(ProtocolMessageFormatter::contentSend(KProfileSend, aEntry.iRequestedItem, profile, profileSignature, profileKey, isContentEncrypted, isContentCompressed, timeWhenProfileWasPublished )); } profileKey.clear() ; profile.clear() ; profileSignature.clear() ; if ( resultBytes->size() ) { // datamodel will delete resultBytes iModel.addItemToSend(aEntry.iDestinationNode , resultBytes) ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } aEntry.iState = ReadyToSend ; } void NetworkRequestExecutor::processClassifiedAd(NetworkRequestQueueItem& aEntry) { LOG_STR("processClassifiedAd in") ; QByteArray caBytes ; QByteArray caSignature ; QByteArray* resultBytes = new QByteArray() ; QByteArray caKey ; bool isContentEncrypted = false ; bool isContentCompressed = false ; quint32 timeWhenCaWasPublished ; if ( iModel.classifiedAdsModel().caDataForPublish(aEntry.iRequestedItem, caBytes, caSignature, caKey, &timeWhenCaWasPublished) ) { resultBytes->append(ProtocolMessageFormatter::contentSend(KClassifiedAdSend, aEntry.iRequestedItem, caBytes, caSignature, caKey, isContentEncrypted, isContentCompressed, timeWhenCaWasPublished )); } caKey.clear() ; caBytes.clear() ; caSignature.clear() ; if ( resultBytes->size() ) { // datamodel will delete resultBytes iModel.addItemToSend(aEntry.iDestinationNode , resultBytes) ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } aEntry.iState = ReadyToSend ; } void NetworkRequestExecutor::processAdsClassified(NetworkRequestQueueItem& aEntry) { LOG_STR("processAdsClassified in") ; /* * ok, here make distinction. if aEntry.iDestinationNode is * nullhash, then it was UI interface request by local user. * if iDestinationNode is some other node, then the request * was sent by a peer */ if ( aEntry.iDestinationNode != KNullHash ) { QList > listOfAds ; // in request with type RequestAdsClassified the field // iTimeStampOfItem contains requested start time and // iTimeStampOfLastActivity the end time, not actually // the last activity time of the entry itself. // this can be done because // - it causes confusion to reader // - this network request is one-shot type, there is no long life-cycle iModel.classifiedAdsModel().caListingByClassification(aEntry.iRequestedItem, aEntry.iTimeStampOfItem, aEntry.iTimeStampOfLastActivity, listOfAds, aEntry.iDestinationNode) ; LOG_STR2("processAdsClassified finds %d ads in response", (int)(listOfAds.size())) ; if ( listOfAds.size() > 0 ) { QByteArray* resultBytes = new QByteArray() ; resultBytes->append(ProtocolMessageFormatter::replyToAdsClassified(aEntry.iRequestedItem, listOfAds ) ) ; iModel.addItemToSend(aEntry.iDestinationNode , resultBytes) ; } aEntry.iState = ReadyToSend ; } else { // was UI request sendRequestToNodesAroundHash(aEntry, true) ; } } classified-ads-0.13/datamodel/netrequestexecutor.h000066400000000000000000000207301331670245300223770ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_NETREQEXEC_H #define CLASSIFIED_NETREQEXEC_H #include #include "../net/protocol.h" #include // for time_t #include "../net/connection.h" class MController ; class Model ; extern Hash KNullHash ; /** * @brief Logic for handling tasks received from other peers or from user. * * Here is class that takes requests sent (or generated locally) * from queue, obtains data needed and puts results into * send-queues of nodes that need to see the results. */ class NetworkRequestExecutor : public QTimer { Q_OBJECT public: /** * requests may be new, being processed, or ready * to be sent, have enum indicating the state */ enum NetworkRequestState { NewRequest, /**< NetworkRequestExecutor has not yet touched */ Processing, /**< is working in this very moment */ NodeIsInWishList, /**< node connection in progress */ RequestBeingSentAround, /**< request is sent to nodes around hash */ ReadyToSend /**< request completed but not sent */ }; /** * @brief Work queue item. * * Have this kind of items in the queue waiting to be processed * and finally sent to destination (if still connected) */ struct NetworkRequestQueueItem { /** * this iRequestType contais dual-use values. * if request type is RequestFor..something * and the iDestinationNode is KNullHash then * it means that it the user that is requesting * the content so this request is sent to * neighboring nodes. * * other possibility is that we receive RequestFor..something * from neighboring node, in which case we have the * iDestinationNode set, pointing back to node that * wants the content. In this case we try fetch * the content from local reposity and send it to * given node. */ ProtocolItemType iRequestType ; Hash iDestinationNode ; Hash iRequestedItem ; quint32 iTimeStampOfItem ; quint32 iTimeStampOfLastActivity ; NetworkRequestState iState ; int iMaxNumberOfItems ; /** bang-path is used in publish-operations */ QList iBangPath ; /** * this is initially empty. when iState is set to * RequestBeingSentAround then this list here gets * populated with the nodes around */ QList iWishListForNodesAround ; } ; /** * constructor */ NetworkRequestExecutor(MController *aController, Model& aModel) ; ~NetworkRequestExecutor() ; private: /** * method for sending one or more node references to * given node */ void processNodeGreeting(NetworkRequestQueueItem& aEntry) ; /** * method for sending nodegreeting around given hash. user initiates * this and this sends around queries about nodes around * given hash. the nodes that are sent the query are already-connected * nodes */ void processRequestForNodesAroundHash(NetworkRequestQueueItem& entry) ; /** * method for publishing a profile+ad+binary file+profile comment + * db record */ void processRequestForContentPublish(NetworkRequestQueueItem& entry) ; /** * method for publishing a private message */ void processRequestForPrivateMessagePublish(NetworkRequestQueueItem& aEntry) ; /** * method for requesting retrieval of a binary file */ void processRequestForBinaryBlob(NetworkRequestQueueItem& aEntry) ; /** * method for requesting retrieval of a binary file */ void processRequestForClassifiedAd(NetworkRequestQueueItem& aEntry) ; /** * method for requesting update of profile data and comments */ void processRequestForProfilePoll(NetworkRequestQueueItem& aEntry) ; /** * method for requesting retrieval of a operator profile. so this * means that some neighboring node sent us a request regarding * a particular profile and this method then finds it from our * local data store, or does not. */ void processRequestForUserProfile(NetworkRequestQueueItem& aEntry) ; /** * method for requesting retrieval of a comment of operator profile. * this is called in situation where user wants to locally view * a comment and it is not in local storage so we need to ask * other nodes to send it to us. */ void processRequestForUserProfileComment(NetworkRequestQueueItem& aEntry) ; /** * method for actually sending the bytes to peer * @param aEntry is the request to send * @param aNodeToSend is fingerprint of the node where to * send ; if KNullHash then aEntry.iDestinationNode * is used. If aNodeSend is not connected at the moment, * request is simply ignored. */ void doSendRequestToNode(NetworkRequestQueueItem& aEntry, const Hash& aNodeToSend = KNullHash ) ; /** * method for checking nodes around hash, sending request to * those and if not already connected, adding those nodes to * wishlist */ void sendRequestToNodesAroundHash(NetworkRequestQueueItem& aEntry, bool aUseContentHashNotDestination = false) ; /** * method for producing reply to request concerning a binary blob -> * e.g. this method sends a binary blob */ void processBinaryBlob(NetworkRequestQueueItem& aEntry) ; /** * method for producing reply to request concerning a private msg -> * e.g. this method sends a private message */ void processPrivateMessage(NetworkRequestQueueItem& aEntry) ; /** * method for producing reply to request concerning profile comments * e.g. this method sends a profile comments whose commented * profile matches the one given in the request */ void processUserProfileCommentsForProfile(NetworkRequestQueueItem& entry) ; /** * method for producing bytearray to send to other node containing * single profile comment */ void processUserProfileComment(NetworkRequestQueueItem& aEntry) ; /** * method for producing send queue items for every private * message that the requesting profile has in queue. */ void processPrivateMessagesForProfile(NetworkRequestQueueItem& aEntry) ; /** * method for producing reply to request concerning a user profile -> * e.g. this method sends a profile to remote node */ void processUserProfile(NetworkRequestQueueItem& aEntry) ; /** * method for producing reply to request concerning a classified ad -> * e.g. this method sends an ad to remote node */ void processClassifiedAd(NetworkRequestQueueItem& aEntry) ; /** * method for producing reply to request concerning a classified ad * classification -> * e.g. this method sends an listing of ads to remote node, the * classification of the ads match hash given in entry */ void processAdsClassified(NetworkRequestQueueItem& aEntry) ; public slots: /** * this class is no thread but lets try pretending.. */ void run() ; /** when connection is attempted, @ref NetworkListener will * emit the status (failed or success) of the connection, * emitted signal is connected here */ void nodeConnectionAttemptStatus(Connection::ConnectionState aStatus, const Hash aHashOfAttemptedNode ); private: MController *iController ; Model& iModel ; bool iNowRunning ; time_t iLastTimeOfNodeConnectedNodeStatusUpdate ; } ; #endif classified-ads-0.13/datamodel/nodemodel.cpp000066400000000000000000002344431331670245300207320ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef WIN32 #define NOMINMAX #include #endif #include "nodemodel.h" #include "../log.h" #include #include #include #include #include #include "../util/hash.h" #include #include #include #include #include #include #include #include #include #include "../net/connection.h" #include "../net/protocol_message_formatter.h" #include "../net/node.h" #include "model.h" #include "camodel.h" #include "binaryfilemodel.h" #include "profilemodel.h" #include "privmsgmodel.h" #include "profilecommentmodel.h" #include "const.h" #include "searchmodel.h" #include "cadbrecordmodel.h" #include /** * How many nodes to keep */ static const int KMaxNodesInDbTable( 10000 ); NodeModel::NodeModel(MController *aController, Model &aModel) : ModelBase("node", KMaxRowsInTableNode,aController,aModel), iFingerPrintOfThisNode(NULL) , iThisNodeCert(NULL), iThisNodeKey(NULL), iTimerId(-1) { LOG_STR("NodeModel::NodeModel()") ; connect(this, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; openOrCreateSSLCertificate() ; // this method emit possible errors itself iTimerId = startTimer(20000*2) ; // 2-minute timer QSqlQuery duplicateDeletiaQuery (iModel.dataBaseConnection()); if ( ! duplicateDeletiaQuery.exec("delete from node where rowid not in ( select max(rowid) from node group by hash1,hash2,hash3,hash4,hash5 )") ) { QLOG_STR(duplicateDeletiaQuery.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; } } NodeModel::~NodeModel() { LOG_STR("NodeModel::~NodeModel()") ; delete iThisNodeKey ; if ( iThisNodeCert ) { delete iThisNodeCert ; } if ( iFingerPrintOfThisNode ) { delete iFingerPrintOfThisNode ; } iController = NULL ; // not owned, just set null while ( !iConnectionWishList.isEmpty() ) { Node* wishListItem = iConnectionWishList.takeAt(0) ; delete wishListItem ; } if ( iTimerId != -1 ) { killTimer(iTimerId) ; } } bool NodeModel::openOrCreateSSLCertificate() { if ( loadSslCertFromDb()&& loadSslKeyFromDb() ) { return true ; } else { LOG_STR("No ssl cert in place, generating") ; EVP_PKEY * pkey(NULL); pkey = EVP_PKEY_new(); RSA * rsa (NULL); BIGNUM *bne ( NULL ); int ret = 0 ; bne = BN_new(); unsigned long e = RSA_F4; ret = BN_set_word(bne,e); rsa = RSA_new() ; if ( rsa != NULL && ( ret = RSA_generate_key_ex(rsa, 2048, bne, NULL ) ) != 1 ) { QString errmsg(tr("SSL key generation went wrong, calling exit..")) ; emit error(MController::OwnCertNotFound, errmsg) ; RSA_free(rsa) ; BN_free(bne) ; return false ; } EVP_PKEY_assign_RSA(pkey, rsa); // after this point rsa can't be free'd X509 * x509; x509 = X509_new(); if ( x509 == NULL ) { QString errmsg(tr("x509 cert generation went wrong, calling exit..")) ; emit error(MController::OwnCertNotFound, errmsg) ; return false ; } ASN1_INTEGER_set(X509_get_serialNumber(x509), 1); // key validity time ; starting from now X509_gmtime_adj(X509_get_notBefore(x509), 0); // and after 100 years someone needs to find a way to // 1) crack this encryption, or // 2) write feature for migrating the stuff to another node with a new cert X509_gmtime_adj(X509_get_notAfter(x509), 60L * 60L * 24L * 365L * (long long)(80+(qrand()%20)) + (long long)((qrand() % 10000)) ); X509_set_pubkey(x509, pkey); X509_NAME * name; name = X509_get_subject_name(x509); const char *countryCode = NULL ; const char *countryCodeFI = "FI" ; // Juice Leskinen const char *countryCodeSE = "SE" ; const char *countryCodeUS = "US" ; switch (rand() % 3 ) { case 0: countryCode = countryCodeFI; break ; case 1: countryCode = countryCodeSE; break ; default: countryCode = countryCodeUS; break ; } char randomName [11] = { 0 }; int nameLen = 5 + (rand() % 5 ) ; for ( int i = 0 ; i < nameLen ; i++ ) { randomName[i] = (char) (65 + ( rand() % 25) ) ; } char domainName [20] = { 0 } ; for ( int i = 0 ; i < 4 ; i++ ) { domainName[i] = (char) (65 + ( rand() % 25) ) ; } strcat (domainName, ".com") ; X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, (unsigned char *)countryCode, -1, -1, 0); X509_NAME_add_entry_by_txt(name, "O", MBSTRING_ASC, (unsigned char *)randomName, -1, -1, 0); X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC, (unsigned char *)domainName, -1, -1, 0); X509_set_issuer_name(x509, name); X509_sign(x509, pkey, EVP_sha1()); BIO *pri = BIO_new(BIO_s_mem()); BIO *pub = BIO_new(BIO_s_mem()); if((pri == NULL || pub == NULL ) || (!PEM_write_bio_PrivateKey(pri, pkey, NULL, NULL, 0, 0, NULL))) { QString errmsg(ERR_reason_error_string(ERR_get_error())) ; emit error(MController::ContentEncryptionError, errmsg) ; EVP_PKEY_free(pkey) ; X509_free(x509) ; BIO_free(pri) ; BIO_free(pub) ; // rsa i associated with x509, no need to free() // bne is associated with RSA, no need to free() return false ; } PEM_write_bio_X509( pub, /* write the certificate to the mem-buf we've opened */ x509 /* our certificate */ ); unsigned char md[EVP_MAX_MD_SIZE]; unsigned int n; const EVP_MD * digest = EVP_get_digestbyname("sha1"); X509_digest(x509, digest, md, &n); iFingerPrintOfThisNode = new Hash(md) ; EVP_PKEY_free(pkey) ; X509_free(x509) ; size_t pri_len = BIO_pending(pri); size_t pub_len = BIO_pending(pub); char *pri_key = (char *)malloc(pri_len + 1); char *pub_key = (char *)malloc(pub_len + 1); BIO_read(pri, pri_key, pri_len); BIO_read(pub, pub_key, pub_len); pri_key[pri_len] = '\0'; pub_key[pub_len] = '\0'; BIO_free(pri) ; BIO_free(pub) ; QByteArray pubKeyBytes(pub_key,pub_len) ; QByteArray priKeyBytes(pri_key,pri_len) ; free(pub_key) ; free(pri_key) ; saveSslCertToDb(pubKeyBytes) ; saveSslKeyToDb(priKeyBytes) ; } return ( loadSslCertFromDb() && loadSslKeyFromDb() ) ; } Hash& NodeModel::nodeFingerPrint() { return *iFingerPrintOfThisNode ; } int NodeModel::listenPortOfThisNode() { bool ret = false ; int port = -1 ; QSqlQuery query(iModel.dataBaseConnection()); ret = query.exec("select node_listenport from settings") ; if ( ret && query.next() && !query.isNull(0) ) { port = query.value(0).toInt() ; LOG_STR2("Our listen port previously set to %d", port) ; } if ( port < 0 ) { // had no port, invent one. port = ( rand() % 15000 ) + 20000 ; LOG_STR2("Our listen port now set to %d", port) ; setListenPortOfThisNode(port) ; } return port ; } void NodeModel::setListenPortOfThisNode(int port) { bool ret ( true ) ; QSqlQuery q2(iModel.dataBaseConnection()); ret = q2.prepare("update settings set node_listenport = :port") ; if (ret) { q2.bindValue(":port", port) ; q2.exec() ; } } const QSslCertificate& NodeModel::nodeCert() const { return *iThisNodeCert ; } const QSslKey& NodeModel::nodeKey() const { return *iThisNodeKey ; } // As is the case with most (all?) of the methods of this // datamodel, the caller must have called lock() first. // // This method here actually pretty much determines the way // how classified ads network works. This gives the next item, // always. Items are sent in certain order and certain // intervals and implementation of order and interval etc. // lies inside this method .. note also part where // aConnection.SendQueue is filled QByteArray* NodeModel::getNextItemToSend(Connection& aConnection) { // LOG_STR("NodeModel::getNextItemToSend in ") ; QByteArray* retval = NULL ; // a trick played here ; connection actually already has // the data but lets route it via datamodel so we can // start preparing for the next if (aConnection.iNextProtocolItemToSend.size()) { retval = aConnection.iNextProtocolItemToSend.value(0) ; aConnection.iNextProtocolItemToSend.removeAt(0) ; } else { if ( aConnection.iSendQueue.size() > 0 ) { SendQueueItem itemToPrepare = aConnection.iSendQueue.takeAt(0) ; switch ( itemToPrepare.iItemType ) { case OwnNodeGreeting: { retval = new QByteArray(ProtocolMessageFormatter::nodeGreeting(iController->getNode())) ; } break ; case NodeGreeting: { Node* nodeToSend = nodeByHash(itemToPrepare.iHash) ; if ( nodeToSend ) { retval = new QByteArray(ProtocolMessageFormatter::nodeGreeting(*nodeToSend)) ; delete nodeToSend ; } } break ; case ClassifiedAd: { QByteArray caBytes ; QByteArray caSignature ; QByteArray* resultBytes = new QByteArray() ; QByteArray caKey ; bool isContentEncrypted = false ; bool isContentCompressed = false ; quint32 timeWhenCaWasPublished ; if ( iModel.classifiedAdsModel().caDataForPublish(itemToPrepare.iHash, caBytes, caSignature, caKey, &timeWhenCaWasPublished) ) { resultBytes->append(ProtocolMessageFormatter::contentSend(KClassifiedAdSend, itemToPrepare.iHash, caBytes, caSignature, caKey, isContentEncrypted, isContentCompressed, timeWhenCaWasPublished )); } caKey.clear() ; caBytes.clear() ; caSignature.clear() ; if ( resultBytes->size() ) { retval = resultBytes ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } } break ; case BinaryBlob: { QByteArray binary ; QByteArray binarySignature ; QByteArray* resultBytes = new QByteArray() ; QByteArray binaryKey ; bool isContentEncrypted = false ; bool isContentCompressed = false ; quint32 timeWhenBinaryFileWasPublished ; if ( iModel.binaryFileModel().binaryFileDataForSend(itemToPrepare.iHash, binary, binarySignature, binaryKey, &isContentEncrypted, &isContentCompressed, &timeWhenBinaryFileWasPublished) ) { resultBytes->append(ProtocolMessageFormatter::contentSend(KBinaryFileSend, itemToPrepare.iHash, binary, binarySignature, binaryKey, isContentEncrypted, isContentCompressed, timeWhenBinaryFileWasPublished )); } binaryKey.clear() ; binary.clear() ; binarySignature.clear() ; if ( resultBytes->size() ) { retval = resultBytes ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } } break ; case UserProfile: { QByteArray profile ; QByteArray profileSignature ; QByteArray* resultBytes = new QByteArray() ; QByteArray profileKey ; bool isContentEncrypted = false ; bool isContentCompressed = false ; quint32 timeWhenProfileWasPublished ; if ( iModel.profileModel().profileDataByFingerPrint(itemToPrepare.iHash, profile, profileSignature, &isContentEncrypted, &timeWhenProfileWasPublished, &profileKey) ) { resultBytes->append(ProtocolMessageFormatter::contentSend(KProfileSend, itemToPrepare.iHash, profile, profileSignature, profileKey, isContentEncrypted, isContentCompressed, timeWhenProfileWasPublished )); } profileKey.clear() ; profile.clear() ; profileSignature.clear() ; if ( resultBytes->size() ) { retval = resultBytes ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } } break ; case UserProfileComment: { QByteArray comment ; QByteArray commentSignature ; QByteArray* resultBytes = new QByteArray() ; quint32 flags (0) ; quint32 timeWhenProfileWasPublished ; Hash profileHash ; if ( iModel.profileCommentModel().commentDataByFingerPrint(itemToPrepare.iHash, comment, commentSignature, &profileHash, &flags, &timeWhenProfileWasPublished ) ) { resultBytes->append(ProtocolMessageFormatter::profileCommentSend(itemToPrepare.iHash, comment, commentSignature, profileHash, timeWhenProfileWasPublished, flags )); } comment.clear() ; commentSignature.clear() ; if ( resultBytes->size() ) { retval = resultBytes ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; } } break ; case PrivateMessage: { LOG_STR("NodeModel sendqueue handling for PrivateMessage") ; QByteArray msg ; QByteArray msgSignature ; QByteArray* resultBytes = new QByteArray() ; quint32 timeOfPublish ; Hash resultingDestination ; Hash resultingRecipient ; if ( iModel.privateMessageModel().messageDataByFingerPrint(itemToPrepare.iHash, msg, msgSignature, &resultingDestination, &resultingRecipient, &timeOfPublish) ) { // message was found, lets send: resultBytes->append(ProtocolMessageFormatter::privMsgSend(itemToPrepare.iHash, msg, msgSignature, resultingDestination, resultingRecipient, timeOfPublish )); msg.clear() ; msgSignature.clear() ; if ( resultBytes->size() ) { retval = resultBytes ; } else { // we obtained zero bytes -> delete empty bytearray delete resultBytes ; QLOG_STR("Got 0 bytes to send as message, id=" + itemToPrepare.iHash.toString()) ; } } else { QLOG_STR("Could not find msg supposed to be sent, id=" + itemToPrepare.iHash.toString()) ; delete resultBytes ; } } break ; case RequestForSearchSend: { // this request has been put into queue locally and is // from here spammed to connected nodes: QString searchString ; bool searchAds ; bool searchProfiles ; bool searchComments ; Hash searchIdentifier ; iModel.searchModel()->getSearchCriteria(&searchString, &searchAds, &searchProfiles, &searchComments, &searchIdentifier ) ; if ( searchIdentifier != KNullHash && searchString.length() > 0 ) { // there were something to search for QByteArray* resultBytes = new QByteArray() ; resultBytes->append(ProtocolMessageFormatter::searchSend(searchString, searchAds, searchProfiles, searchComments, searchIdentifier)); retval = resultBytes ; } } break ; case DbRecord: { // this request has been put into queue locally and is // from here spammed to connected nodes: QList resultSet ( iModel .caDbRecordModel() ->searchRecords(KNullHash, itemToPrepare.iHash, 0 , std::numeric_limits::max(), std::numeric_limits::min(), std::numeric_limits::max(), QString::null, KNullHash, true ) ) ; if ( resultSet.size() ) { QByteArray* resultBytes = new QByteArray() ; while(resultSet.size()) { CaDbRecord *r ( resultSet.takeFirst() ) ; resultBytes->append(ProtocolMessageFormatter::dbRecordSend(*r)); delete r ; } retval = resultBytes ; } } break ; default: // for rest of the types, there is no need to send LOG_STR2("Unhandled send queue item type %d", (int)(itemToPrepare.iItemType)) ; break ; } } } return retval ; } Node* NodeModel::nodeByHash(const Hash& aHash) { LOG_STR("NodeModel::nodeByHash in ") ; Node *retval = NULL ; QSqlQuery query(iModel.dataBaseConnection()); bool ret = query.prepare("select hash1,hash2,hash3,hash4,hash5,listenport,last_conn_time,does_listen,ipv4addr,ipv6addr1,ipv6addr2,ipv6addr3,ipv6addr4,last_nodelist_time,last_mutual_conn_time from node where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5") ; query.bindValue(":hash1", aHash.iHash160bits[0]); query.bindValue(":hash2", aHash.iHash160bits[1]); query.bindValue(":hash3", aHash.iHash160bits[2]); query.bindValue(":hash4", aHash.iHash160bits[3]); query.bindValue(":hash5", aHash.iHash160bits[4]); if ( ret && (ret = query.exec() ) == true && query.next() ) { quint32 hash1 = query.value(0).toUInt() ; quint32 hash2 = query.value(1).toUInt() ; quint32 hash3 = query.value(2).toUInt() ; quint32 hash4 = query.value(3).toUInt() ; quint32 hash5 = query.value(4).toUInt() ; Hash hashFoundFromDb ( hash1,hash2,hash3,hash4,hash5) ; QLOG_STR("Comparing hash " + hashFoundFromDb.toString()) ; if ( hashFoundFromDb == aHash ) { // yes, found retval = new Node ( hashFoundFromDb, (int)(query.value(5).toUInt()) ) ; retval->setLastConnectTime(query.value(6).toUInt()) ; retval->setCanReceiveIncoming(query.value(7).toUInt() > 0) ; if ( !query.isNull(8) ) { retval->setIpv4Addr(query.value(8).toUInt()) ; } if ( !query.isNull(9) ) { Q_IPV6ADDR addr = ipv6AddrFromUints ( query.value(9).toUInt(), query.value(10).toUInt(), query.value(11).toUInt(), query.value(12).toUInt()) ; retval->setIpv6Addr(addr) ; } if ( !query.isNull(13) ) { retval->setGoodNodeListTime(query.value(13).toUInt()) ; } if ( !query.isNull(14) ) { retval->setLastMutualConnectTime(query.value(14).toUInt()) ; } } } if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } return retval ; } QList NodeModel::getHotAddresses() { LOG_STR("NodeModel::getHotAddresses in ") ; if ( iHotAddresses.size() == 0 ) { retrieveListOfHotConnections() ; // fetch recent nodes from db } if ( iHotAddresses.size() == 0 ) { // if no nodes found // then try hard-coded one.. // QHostAddress seedNode("canode.katiska.org") ; int seedPort ( 31111 ) ; const bool hasIpv6 = !Connection::Ipv6AddressesEqual(iController->getNode().ipv6Addr(), KNullIpv6Addr) ; QHostAddress addrToConnect ; QHostInfo info = QHostInfo::fromName("canode.katiska.org") ; if ( info.error() == QHostInfo::NoError ) { // check for ipv6 addr if we have one foreach ( const QHostAddress& result, info.addresses() ) { if ( result.protocol() == QAbstractSocket::IPv6Protocol && hasIpv6 ) { MNodeModelProtocolInterface::HostConnectQueueItem p ; p.iAddress = result ; p.iPort = seedPort ; p.iNodeHash = KNullHash ; iHotAddresses.append(p) ; QLOG_STR("Added seednode IPv6 addr " + result.toString()) ; } if ( result.protocol() == QAbstractSocket::IPv4Protocol ) { MNodeModelProtocolInterface::HostConnectQueueItem p ; p.iAddress = result ; p.iPort = seedPort ; p.iNodeHash = KNullHash ; iHotAddresses.append(p) ; QLOG_STR("Added seednode IPv4 addr " + result.toString()) ; } } } else { QLOG_STR("DNS lookup error for canode.katiska.org") ; } } return iHotAddresses ; } QList* NodeModel::getHotNodes(int aMaxNodes) { LOG_STR("getHotNodes in") ; QList* retval = new QList() ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; QString conditional_recently_failed_condition ; if ( iRecentlyFailedNodes.size() > 0 ) { conditional_recently_failed_condition = " where hash1 not in ( " ; for ( int i = iRecentlyFailedNodes.size()-1 ; i >= 0 ; i-- ) { conditional_recently_failed_condition += QString::number(iRecentlyFailedNodes[i].first.iHash160bits[0] ) + "," ; } conditional_recently_failed_condition += "-1 )" ; } else { conditional_recently_failed_condition = " " ; } QLOG_STR("Failed nodes " + conditional_recently_failed_condition) ; ret = query.exec("select hash1,hash2,hash3,hash4,hash5,listenport,last_conn_time,does_listen,ipv4addr,ipv6addr1,ipv6addr2,ipv6addr3,ipv6addr4,last_nodelist_time from node "+conditional_recently_failed_condition+" order by last_conn_time desc") ; while ( ret && query.next() && !query.isNull(0) && retval->size() < aMaxNodes ) { quint32 hash1,hash2,hash3,hash4,hash5 ; hash1 = query.value(0).toUInt() ; hash2 = query.value(1).toUInt() ; hash3 = query.value(2).toUInt() ; hash4 = query.value(3).toUInt() ; hash5 = query.value(4).toUInt() ; Hash nodeHash (hash1,hash2,hash3,hash4,hash5 ) ; QLOG_STR("Hotnodes got node " + nodeHash.toString()) ; Node* n = new Node (nodeHash, query.value(5).toUInt()) ; if ( !query.isNull(10)) { Q_IPV6ADDR addr = ipv6AddrFromUints (query.value(9).toUInt(), query.value(10).toUInt(), query.value(11).toUInt(), query.value(12).toUInt() ) ; n->setIpv6Addr(addr) ; } if ( !query.isNull(8) ) { n->setIpv4Addr((quint32)(query.value(8).toUInt())) ; } if ( !query.isNull(13) ) { n->setGoodNodeListTime((time_t)(query.value(13).toUInt())) ; } if ( !query.isNull(6) ) { n->setLastConnectTime((time_t)(query.value(6).toUInt())) ; } if ( !query.isNull(7) ) { n->setCanReceiveIncoming((bool)(query.value(7).toUInt())) ; } retval->append(n) ; } LOG_STR("getHotNodes out") ; return retval ; } QList* NodeModel::getNodesAfterHash(const Hash& aHash, unsigned aMaxNodes, int aMaxInactivityMinutes) { LOG_STR("getNodesAfterHash in") ; // hmm hmm. // this program will do a lot of hash-matching, but in practice // the matches are made so that we know hash of some content // and that hash is exactly known in advance so search from db // table is easy. the "matching" part is about finding a node // whose hash is near the content hash and this is where this // method here comes into picture. ..if we keep only 10k // nodes in db table we can quite safely do things resulting // in full table scan and the performance will still be // in ok level .. or lets see. if not we'll need an extra column // that will somehow contain distance from hash in form that // is usable also when hash number rolls over QList* retval = new QList() ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; if ( aMaxNodes > iCurrentDbTableRowCount ) { aMaxNodes = iCurrentDbTableRowCount ; // don't try returning more than we have } // this is fine, will use index as there is index for hash1 QString conditional_inactivity_condition ; if ( aMaxInactivityMinutes > 0 ) { conditional_inactivity_condition = "and last_conn_time > :last_conn_time "; } else { conditional_inactivity_condition = " "; } QString conditional_recently_failed_condition ; if ( iRecentlyFailedNodes.size() > 0 ) { conditional_recently_failed_condition = " and hash1 not in ( " ; for ( int i = iRecentlyFailedNodes.size()-1 ; i >= 0 ; i-- ) { conditional_recently_failed_condition += QString::number(iRecentlyFailedNodes[i].first.iHash160bits[0] ) + "," ; } conditional_recently_failed_condition += " -1)" ; } else { conditional_recently_failed_condition = " " ; } QLOG_STR("Failed nodes " + conditional_recently_failed_condition) ; ret = query.prepare("select hash1,hash2,hash3,hash4,hash5,listenport,last_conn_time,does_listen,ipv4addr,ipv6addr1,ipv6addr2,ipv6addr3,ipv6addr4,last_nodelist_time,dns_name,tor_name from node where ( ipv4addr is not null or ipv6addr1 is not null ) and hash1 >= :hash_to_seek "+ conditional_inactivity_condition + conditional_recently_failed_condition + " order by hash1 limit :maxrows") ; query.bindValue(":hash_to_seek", aHash.iHash160bits[0]); query.bindValue(":maxrows", aMaxNodes); if ( aMaxInactivityMinutes > 0 ) { query.bindValue(":last_conn_time", (unsigned)(QDateTime::currentDateTimeUtc().toTime_t()-(aMaxInactivityMinutes*60))); } if ( ret && query.exec() ) { while ( ret && query.next() && !query.isNull(0) && ((unsigned)(retval->size())) < aMaxNodes ) { quint32 hash1,hash2,hash3,hash4,hash5 ; hash1 = query.value(0).toUInt() ; hash2 = query.value(1).toUInt() ; hash3 = query.value(2).toUInt() ; hash4 = query.value(3).toUInt() ; hash5 = query.value(4).toUInt() ; Hash nodeHash (hash1,hash2,hash3,hash4,hash5 ) ; QLOG_STR("getNodesAfterHash got node " + nodeHash.toString()) ; Node* n = new Node (nodeHash, query.value(5).toUInt()) ; if ( !query.isNull(10)) { Q_IPV6ADDR addr = ipv6AddrFromUints (query.value(9).toUInt(), query.value(10).toUInt(), query.value(11).toUInt(), query.value(12).toUInt() ) ; n->setIpv6Addr(addr) ; } if ( !query.isNull(8) ) { n->setIpv4Addr((quint32)(query.value(8).toUInt())) ; } if ( !query.isNull(13) ) { n->setGoodNodeListTime((time_t)(query.value(13).toUInt())) ; } if ( !query.isNull(6) ) { n->setLastConnectTime((time_t)(query.value(6).toUInt())) ; } if ( !query.isNull(7) ) { n->setCanReceiveIncoming((bool)(query.value(7).toUInt())) ; } if ( !query.isNull(14) ) { n->setDNSAddr(query.value(14).toString()) ; } if ( !query.isNull(15) ) { n->setTORAddr(query.value(15).toString()) ; } retval->append(n) ; } } if ( (unsigned)(retval->size()) < aMaxNodes ) { // we got less nodes so that means that hash we were trying // to seek was so close to end of list that there were less // than aMaxNodes nodes in table after the hash we were // seeking. so so .. here roll over, start from node zero QSqlQuery query2(iModel.dataBaseConnection()); // note here: no where-condition but only order by. // this will start from first node, return nodes // starting in order from zero, until maxrows is // reached. .. so in case we need to roll-over the // hash-space, this 2nd query here is our implementation // for the rolling-over. if ( aMaxInactivityMinutes > 0 ) { conditional_inactivity_condition = " and last_conn_time > :last_conn_time "; } else { conditional_inactivity_condition = " "; } ret = query2.prepare("select hash1,hash2,hash3,hash4,hash5,listenport,last_conn_time,does_listen,ipv4addr,ipv6addr1,ipv6addr2,ipv6addr3,ipv6addr4,last_nodelist_time,dns_name,tor_name from node where ( ipv4addr is not null or ipv6addr1 is not null ) "+ conditional_inactivity_condition + conditional_recently_failed_condition + " order by hash1 limit :maxrows") ; query2.bindValue(":maxrows", aMaxNodes - retval->size()); if ( aMaxInactivityMinutes > 0 ) { query2.bindValue(":last_conn_time", (unsigned)(QDateTime::currentDateTimeUtc().toTime_t()-(aMaxInactivityMinutes*60))); } if ( ret && query2.exec() ) { while ( ret && query2.next() && !query2.isNull(0) && (((unsigned)(retval->size())) < aMaxNodes) ) { quint32 hash1,hash2,hash3,hash4,hash5 ; hash1 = query2.value(0).toUInt() ; hash2 = query2.value(1).toUInt() ; hash3 = query2.value(2).toUInt() ; hash4 = query2.value(3).toUInt() ; hash5 = query2.value(4).toUInt() ; Hash nodeHash (hash1,hash2,hash3,hash4,hash5 ) ; Node* n = new Node (nodeHash, query2.value(5).toUInt()) ; if ( !query2.isNull(10)) { Q_IPV6ADDR addr = ipv6AddrFromUints (query2.value(9).toUInt(), query2.value(10).toUInt(), query2.value(11).toUInt(), query2.value(12).toUInt() ) ; n->setIpv6Addr(addr) ; } if ( !query2.isNull(8) ) { n->setIpv4Addr((quint32)(query2.value(8).toUInt())) ; } if ( !query2.isNull(13) ) { n->setGoodNodeListTime((time_t)(query2.value(13).toUInt())) ; } if ( !query2.isNull(6) ) { n->setLastConnectTime((time_t)(query2.value(6).toUInt())) ; } if ( !query2.isNull(7) ) { n->setCanReceiveIncoming((bool)(query2.value(7).toUInt())) ; } if ( !query2.isNull(14) ) { n->setDNSAddr(query2.value(14).toString()) ; } if ( !query2.isNull(15) ) { n->setTORAddr(query2.value(15).toString()) ; } retval->append(n) ; } } } // still got less nodes than expected: return any connected nodes int nodesMissing ( aMaxNodes - retval->size() ) ; if ( (unsigned)(retval->size()) < aMaxNodes ) { const bool hasIpv6 = !Connection::Ipv6AddressesEqual(iController->getNode().ipv6Addr(), KNullIpv6Addr) ; const QList& openConnections ( iModel.getConnections()); foreach ( const Connection *connection, openConnections ) { if ( connection->node() ) { const Node* connectedNode ( connection->node() ) ; if ( connectedNode->ipv4Addr() || ( !Connection::Ipv6AddressesEqual(connectedNode->ipv6Addr(), KNullIpv6Addr) && hasIpv6 ) ) { Node* n = new Node (connectedNode->nodeFingerPrint(), connectedNode->port()) ; n->setIpv6Addr(connectedNode->ipv6Addr()) ; n->setIpv4Addr(connectedNode->ipv4Addr()) ; n->setGoodNodeListTime(connectedNode->goodNodeListTime()) ; // is connected now: n->setLastConnectTime(QDateTime::currentDateTimeUtc().toTime_t()) ; n->setCanReceiveIncoming(connectedNode->canReceiveIncoming()) ; n->setDNSAddr(connectedNode->DNSAddr()) ; n->setTORAddr(connectedNode->TORAddr()) ; retval->append(n) ; } if ( --nodesMissing < 0 ) { break ; } } } } return retval ; } // // see also getNodesAfterHash // QList* NodeModel::getNodesBeforeHash(const Hash& aHash, unsigned aMaxNodes) { QList* retval = new QList() ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; if ( aMaxNodes > iCurrentDbTableRowCount ) { aMaxNodes = iCurrentDbTableRowCount ; // don't try returning more than we have } QString conditional_recently_failed_condition ; if ( iRecentlyFailedNodes.size() > 0 ) { conditional_recently_failed_condition = " and hash1 not in ( " ; for ( int i = iRecentlyFailedNodes.size()-1 ; i >= 0 ; i-- ) { conditional_recently_failed_condition += QString::number(iRecentlyFailedNodes[i].first.iHash160bits[0] ) + "," ; } conditional_recently_failed_condition += " -1)" ; } else { conditional_recently_failed_condition = " " ; } QLOG_STR("Failed nodes " + conditional_recently_failed_condition) ; // this is fine, will use index as there is index for hash1 ret = query.prepare("select hash1,hash2,hash3,hash4,hash5,listenport,last_conn_time,does_listen,ipv4addr,ipv6addr1,ipv6addr2,ipv6addr3,ipv6addr4,last_nodelist_time,dns_name,tor_name from node where ( ipv4addr is not null or ipv6addr1 is not null ) and hash1 <= :hash_to_seek "+conditional_recently_failed_condition+" order by hash1 desc limit :maxrows") ; query.bindValue(":hash_to_seek", aHash.iHash160bits[0]); query.bindValue(":maxrows", aMaxNodes); if ( ret && query.exec() ) { while ( ret && query.next() && !query.isNull(0) && (unsigned)(retval->size()) < aMaxNodes ) { quint32 hash1,hash2,hash3,hash4,hash5 ; hash1 = query.value(0).toUInt() ; hash2 = query.value(1).toUInt() ; hash3 = query.value(2).toUInt() ; hash4 = query.value(3).toUInt() ; hash5 = query.value(4).toUInt() ; Hash nodeHash (hash1,hash2,hash3,hash4,hash5 ) ; Node* n = new Node (nodeHash, query.value(5).toUInt()) ; if ( !query.isNull(10)) { Q_IPV6ADDR addr = ipv6AddrFromUints (query.value(9).toUInt(), query.value(10).toUInt(), query.value(11).toUInt(), query.value(12).toUInt() ) ; n->setIpv6Addr(addr) ; } if ( !query.isNull(8) ) { n->setIpv4Addr((quint32)(query.value(8).toUInt())) ; } if ( !query.isNull(13) ) { n->setGoodNodeListTime((time_t)(query.value(13).toUInt())) ; } if ( !query.isNull(6) ) { n->setLastConnectTime((time_t)(query.value(6).toUInt())) ; } if ( !query.isNull(7) ) { n->setCanReceiveIncoming((bool)(query.value(7).toUInt())) ; } if ( !query.isNull(14) ) { n->setDNSAddr(query.value(14).toString()) ; } if ( !query.isNull(15) ) { n->setTORAddr(query.value(15).toString()) ; } retval->append(n) ; } } if ( (unsigned)(retval->size()) < aMaxNodes ) { // we got less nodes so that means that hash we were trying // to seek was so close to end of list that there were less // than aMaxNodes nodes in table after the hash we were // seeking. so so .. here roll over, start from node zero QSqlQuery query2(iModel.dataBaseConnection()); // note here: no where-condition but only order by. // this will start from first node, return nodes // starting in order from max value, until maxrows is // reached. .. so in case we need to roll-over the // hash-space, this 2nd query here is our implementation // for the rolling-over. ret = query2.prepare("select hash1,hash2,hash3,hash4,hash5,listenport,last_conn_time,does_listen,ipv4addr,ipv6addr1,ipv6addr2,ipv6addr3,ipv6addr4,last_nodelist_time from node where ( ipv4addr is not null or ipv6addr1 is not null ) " + conditional_recently_failed_condition + " order by hash1 desc limit :maxrows") ; query2.bindValue(":maxrows", aMaxNodes - (unsigned)(retval->size())); if ( ret && query2.exec() ) { while ( ret && query2.next() && !query2.isNull(0) && ((unsigned)(retval->size())) < aMaxNodes ) { quint32 hash1,hash2,hash3,hash4,hash5 ; hash1 = query2.value(0).toUInt() ; hash2 = query2.value(1).toUInt() ; hash3 = query2.value(2).toUInt() ; hash4 = query2.value(3).toUInt() ; hash5 = query2.value(4).toUInt() ; Hash nodeHash (hash1,hash2,hash3,hash4,hash5 ) ; Node* n = new Node (nodeHash, query2.value(5).toUInt()) ; if ( !query2.isNull(10)) { Q_IPV6ADDR addr = ipv6AddrFromUints (query2.value(9).toUInt(), query2.value(10).toUInt(), query2.value(11).toUInt(), query2.value(12).toUInt() ) ; n->setIpv6Addr(addr) ; } if ( !query2.isNull(8) ) { n->setIpv4Addr((quint32)(query2.value(8).toUInt())) ; } if ( !query2.isNull(13) ) { n->setGoodNodeListTime((time_t)(query2.value(13).toUInt())) ; } if ( !query2.isNull(6) ) { n->setLastConnectTime((time_t)(query2.value(6).toUInt())) ; } if ( !query2.isNull(7) ) { n->setCanReceiveIncoming((bool)(query2.value(7).toUInt())) ; } if ( !query2.isNull(14) ) { n->setDNSAddr(query2.value(14).toString()) ; } if ( !query2.isNull(15) ) { n->setTORAddr(query2.value(15).toString()) ; } retval->append(n) ; } } } return retval ; } Q_IPV6ADDR NodeModel::ipv6AddrFromUints(quint32 aLeastSignificant, quint32 aLessSignificant, quint32 aMoreSignificant, quint32 aMostSignificant ) const { Q_IPV6ADDR addr ; quint32 ipv6addrPart = aLeastSignificant ; addr.c[0] = (ipv6addrPart & 0x000000FF) ; addr.c[1] = (ipv6addrPart & 0x0000FF00) >> 8 ; addr.c[2] = (ipv6addrPart & 0x00FF0000) >> 16 ; addr.c[3] = (ipv6addrPart & 0xFF000000) >> 24 ; ipv6addrPart = aLessSignificant ; addr.c[4] = (ipv6addrPart & 0x000000FF) ; addr.c[5] = (ipv6addrPart & 0x0000FF00) >> 8 ; addr.c[6] = (ipv6addrPart & 0x00FF0000) >> 16 ; addr.c[7] = (ipv6addrPart & 0xFF000000) >> 24 ; ipv6addrPart = aMoreSignificant ; addr.c[8] = (ipv6addrPart & 0x000000FF) ; addr.c[9] = (ipv6addrPart & 0x0000FF00) >> 8 ; addr.c[10] = (ipv6addrPart & 0x00FF0000) >> 16 ; addr.c[11] = (ipv6addrPart & 0xFF000000) >> 24 ; ipv6addrPart =aMostSignificant ; addr.c[12] = (ipv6addrPart & 0x000000FF) ; addr.c[13] = (ipv6addrPart & 0x0000FF00) >> 8 ; addr.c[14] = (ipv6addrPart & 0x00FF0000) >> 16 ; addr.c[15] = (ipv6addrPart & 0xFF000000) >> 24 ; return addr ; } bool NodeModel::nodeGreetingReceived(Node& aNode, bool aWasInitialGreeting ) { LOG_STR("NodeModel::nodeGreetingReceived in ") ; bool retval = true ; Node *previousEntry = nodeByHash(aNode.nodeFingerPrint() ) ; time_t previousConnectTime ( 0 ) ; if ( aWasInitialGreeting && previousEntry ) { aNode.setLastMutualConnectTime(previousEntry->lastMutualConnectTime()) ; } if ( aWasInitialGreeting ) { aNode.setLastConnectTime(QDateTime::currentDateTimeUtc().toTime_t()) ; removeNodeFromRecentlyFailedList(aNode.nodeFingerPrint()) ; } if ( aNode.lastConnectTime() > QDateTime::currentDateTimeUtc().addSecs(5*60).toTime_t() ) { QLOG_STR("Received node whose last connect time is in future -> discarding") ; return true ; } if ( previousEntry ) { previousConnectTime= previousEntry->lastConnectTime() ; // ok, we had previous information, now we have new ; what // data to merge? if ( aNode.lastConnectTime() > previousEntry->lastConnectTime() ) { // aNode is more recent, trust that more. Note that if // we came here via node greeting up-on connect then // time of last connect has been set to wall-clock time // just recently so most likely we have more up-to-date // information here. aNode.setCanReceiveIncoming(aNode.canReceiveIncoming() || previousEntry->canReceiveIncoming() ) ; if ( aNode.lastMutualConnectTime() < previousEntry->lastMutualConnectTime()) { aNode.setLastMutualConnectTime(previousEntry->lastMutualConnectTime()); } retval = this->updateNodeInDb(aNode) ; } else { // our own entry was more recent previousEntry->setCanReceiveIncoming(aNode.canReceiveIncoming() || previousEntry->canReceiveIncoming() ) ; if ( aNode.lastMutualConnectTime() > previousEntry->lastMutualConnectTime()) { previousEntry->setLastMutualConnectTime(aNode.lastMutualConnectTime()); } this->updateNodeInDb(*previousEntry) ; } delete previousEntry ; } else { LOG_STR("Node was new to us") ; retval = this->insertNodeToDb(aNode) ; } if ( aWasInitialGreeting ) { // this was not normal node ref but the initial greeting // sent as first time after connect -> lets grab stuff // that needs to be sent to that node // so send node greetings so that network stays alive. // actual bucket-filling code is in connection.. struct NetworkRequestExecutor::NetworkRequestQueueItem hotNodesSendingReq ; hotNodesSendingReq.iRequestType = NodeGreeting ; hotNodesSendingReq.iDestinationNode = aNode.nodeFingerPrint() ; // so, automatically send noderefs around that node so // that it will know its own neighborhood hotNodesSendingReq.iTimeStampOfItem = previousConnectTime ; hotNodesSendingReq.iState = NetworkRequestExecutor::NewRequest ; hotNodesSendingReq.iMaxNumberOfItems = KNumberOfNodesToSendToEachPeer; iModel.addNetworkRequest(hotNodesSendingReq) ; } return retval ; } bool NodeModel::updateNodeLastConnectTimeInDb(Node& aNode) { bool ret ( true ) ; if ( aNode.lastConnectTime() < QDateTime::currentDateTimeUtc().addSecs(5*60).toTime_t() ) { QSqlQuery query(iModel.dataBaseConnection()); ret = query.prepare("update node set last_conn_time=:last_conn_time,time_last_reference=:time_last_reference where hash1=:hash1 and hash2=:hash2 and hash3=:hash3 and hash4=:hash4 and hash5=:hash5") ; if ( ret ) { query.bindValue(":hash1", aNode.nodeFingerPrint().iHash160bits[0]); query.bindValue(":hash2", aNode.nodeFingerPrint().iHash160bits[1]); query.bindValue(":hash3", aNode.nodeFingerPrint().iHash160bits[2]); query.bindValue(":hash4", aNode.nodeFingerPrint().iHash160bits[3]); query.bindValue(":hash5", aNode.nodeFingerPrint().iHash160bits[4]); query.bindValue(":last_conn_time", (quint32)(aNode.lastConnectTime())); query.bindValue(":time_last_reference", (quint32)(aNode.lastConnectTime())); ret = query.exec() ; } if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } } return ret ; } bool NodeModel::updateNodeLastMutualConnectTimeInDb(const Hash& aNodeFp, quint32 aTime ) { bool ret ( true ) ; if ( aTime < QDateTime::currentDateTimeUtc().addSecs(5*60).toTime_t() ) { QSqlQuery query(iModel.dataBaseConnection()); ret = query.prepare("update node set last_mutual_conn_time=:last_mutual_conn_time,last_conn_time=:last_conn_time,time_last_reference=:time_last_reference where hash1=:hash1 and hash2=:hash2 and hash3=:hash3 and hash4=:hash4 and hash5=:hash5") ; if ( ret ) { query.bindValue(":hash1", aNodeFp.iHash160bits[0]); query.bindValue(":hash2", aNodeFp.iHash160bits[1]); query.bindValue(":hash3", aNodeFp.iHash160bits[2]); query.bindValue(":hash4", aNodeFp.iHash160bits[3]); query.bindValue(":hash5", aNodeFp.iHash160bits[4]); query.bindValue(":last_conn_time", aTime); query.bindValue(":last_mutual_conn_time", aTime); query.bindValue(":time_last_reference", aTime); ret = query.exec() ; } if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } } return ret ; } bool NodeModel::updateNodeInDb(Node& aNode) { QSqlQuery query(iModel.dataBaseConnection()); bool ret = query.prepare("update node set listenport=:listenport,last_conn_time=:last_conn_time,does_listen=:does_listen,ipv4addr=:ipv4addr,ipv6addr1=:ipv6addr1,ipv6addr2=:ipv6addr2,ipv6addr3=:ipv6addr3,ipv6addr4=:ipv6addr4,last_nodelist_time=:last_nodelist_time,last_mutual_conn_time=:last_mutual_conn_time,dns_name=:dns_name,tor_name=:tor_name where hash1=:hash1 and hash2=:hash2 and hash3=:hash3 and hash4=:hash4 and hash5=:hash5") ; if ( ret ) { query.bindValue(":hash1", aNode.nodeFingerPrint().iHash160bits[0]); query.bindValue(":hash2", aNode.nodeFingerPrint().iHash160bits[1]); query.bindValue(":hash3", aNode.nodeFingerPrint().iHash160bits[2]); query.bindValue(":hash4", aNode.nodeFingerPrint().iHash160bits[3]); query.bindValue(":hash5", aNode.nodeFingerPrint().iHash160bits[4]); // ..listenport is not supposed to change but .. maybe we'll have // UI feature for setting the port manually? query.bindValue(":listenport", (quint32)(aNode.port())); query.bindValue(":last_conn_time", (quint32)(aNode.lastConnectTime())); // if node has no network addr of any kind, don't set // "can receive incoming" as clearly there is no // addr to connect to: if ( aNode.ipv4Addr() == 0 && Connection::Ipv6AddressesEqual(aNode.ipv6Addr(), KNullIpv6Addr )) { query.bindValue(":does_listen", 0); // here 0 means false } else { query.bindValue(":does_listen", aNode.canReceiveIncoming()>0); } query.bindValue(":last_mutual_conn_time", (quint32)(aNode.lastMutualConnectTime())); if ( aNode.ipv4Addr()>0 ) { query.bindValue(":ipv4addr", aNode.ipv4Addr()); } else { // interesting ; null value is null string. even if the // db column is integer. query.bindValue(":ipv4addr", QVariant(QVariant::String)); } Q_IPV6ADDR ipv6addr = aNode.ipv6Addr() ; if ( Connection::Ipv6AddressesEqual(ipv6addr, KNullIpv6Addr ) ) { // has no ipv6, set null query.bindValue(":ipv6addr1", QVariant(QVariant::String)); query.bindValue(":ipv6addr2", QVariant(QVariant::String)); query.bindValue(":ipv6addr3", QVariant(QVariant::String)); query.bindValue(":ipv6addr4", QVariant(QVariant::String)); } else { query.bindValue(":ipv6addr1", (quint32)(ipv6addr.c[0]) + ((quint32)(ipv6addr.c[1]) << 8) + ((quint32)(ipv6addr.c[2]) << 16) + ((quint32)(ipv6addr.c[3]) << 24)); query.bindValue(":ipv6addr2", (quint32)(ipv6addr.c[4]) + ((quint32)(ipv6addr.c[5]) << 8) + ((quint32)(ipv6addr.c[6]) << 16) + ((quint32)(ipv6addr.c[7]) << 24)); query.bindValue(":ipv6addr3", (quint32)(ipv6addr.c[8]) + ((quint32)(ipv6addr.c[9]) << 8) + ((quint32)(ipv6addr.c[10]) << 16) + ((quint32)(ipv6addr.c[11]) << 24)); query.bindValue(":ipv6addr4", (quint32)(ipv6addr.c[12]) + ((quint32)(ipv6addr.c[13]) << 8) + ((quint32)(ipv6addr.c[14]) << 16) + ((quint32)(ipv6addr.c[15]) << 24)); } query.bindValue(":last_nodelist_time", (quint32)(aNode.goodNodeListTime())) ; if ( aNode.DNSAddr().length() > 0 ) { query.bindValue(":dns_name", aNode.DNSAddr()); } else { query.bindValue(":dns_name", QVariant(QVariant::String)); } if ( aNode.TORAddr().length() > 0 ) { query.bindValue(":tor_name", aNode.TORAddr()); } else { query.bindValue(":tor_name", QVariant(QVariant::String)); } ret = query.exec() ; QLOG_STR("updated node port "+QString::number(aNode.port())+" hash " + aNode.nodeFingerPrint().toString()) ; } if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } return ret ; } bool NodeModel::insertNodeToDb(Node& aNode) { bool ret ; QSqlQuery query(iModel.dataBaseConnection()); ret = query.prepare ("insert into node (hash1,hash2,hash3,hash4,hash5,listenport,last_conn_time,does_listen,ipv4addr,ipv6addr1,ipv6addr2,ipv6addr3,ipv6addr4,last_nodelist_time,last_mutual_conn_time,time_last_reference,dns_name,tor_name) values (:hash1,:hash2,:hash3,:hash4,:hash5,:listenport,:last_conn_time,:does_listen,:ipv4addr,:ipv6addr1,:ipv6addr2,:ipv6addr3,:ipv6addr4,:last_nodelist_time,:last_mutual_conn_time,:time_last_reference,:dns_name,:tor_name)" ) ; if ( ret ) { query.bindValue(":hash1", aNode.nodeFingerPrint().iHash160bits[0]); query.bindValue(":hash2", aNode.nodeFingerPrint().iHash160bits[1]); query.bindValue(":hash3", aNode.nodeFingerPrint().iHash160bits[2]); query.bindValue(":hash4", aNode.nodeFingerPrint().iHash160bits[3]); query.bindValue(":hash5", aNode.nodeFingerPrint().iHash160bits[4]); // ..listenport is not supposed to change but .. maybe we'll have // UI feature for setting the port manually? query.bindValue(":listenport", (quint32)(aNode.port())); query.bindValue(":last_conn_time", (quint32)(aNode.lastConnectTime())); // for nodes put connection time also into time_last_reference // as we use that for removing old entries from table, see // base-class ModelBase for details query.bindValue(":time_last_reference", (quint32)(aNode.lastConnectTime())); query.bindValue(":last_mutual_conn_time", (quint32)(aNode.lastMutualConnectTime())); query.bindValue(":does_listen", aNode.canReceiveIncoming()>0); if ( aNode.ipv4Addr()>0 ) { query.bindValue(":ipv4addr", aNode.ipv4Addr()); } else { // interesting ; null value is null string. even if the // db column is integer. query.bindValue(":ipv4addr", QVariant(QVariant::String)); } Q_IPV6ADDR ipv6addr = aNode.ipv6Addr() ; if ( Connection::Ipv6AddressesEqual(ipv6addr, KNullIpv6Addr ) ) { // has no ipv6, set null query.bindValue(":ipv6addr1", QVariant(QVariant::String)); query.bindValue(":ipv6addr2", QVariant(QVariant::String)); query.bindValue(":ipv6addr3", QVariant(QVariant::String)); query.bindValue(":ipv6addr4", QVariant(QVariant::String)); } else { query.bindValue(":ipv6addr1", (quint32)(ipv6addr.c[0]) + ((quint32)(ipv6addr.c[1]) << 8) + ((quint32)(ipv6addr.c[2]) << 16) + ((quint32)(ipv6addr.c[3]) << 24)); query.bindValue(":ipv6addr2", (quint32)(ipv6addr.c[4]) + ((quint32)(ipv6addr.c[5]) << 8) + ((quint32)(ipv6addr.c[6]) << 16) + ((quint32)(ipv6addr.c[7]) << 24)); query.bindValue(":ipv6addr3", (quint32)(ipv6addr.c[8]) + ((quint32)(ipv6addr.c[9]) << 8) + ((quint32)(ipv6addr.c[10]) << 16) + ((quint32)(ipv6addr.c[11]) << 24)); query.bindValue(":ipv6addr4", (quint32)(ipv6addr.c[12]) + ((quint32)(ipv6addr.c[13]) << 8) + ((quint32)(ipv6addr.c[14]) << 16) + ((quint32)(ipv6addr.c[15]) << 24)); } if ( aNode.DNSAddr().length() > 0 ) { query.bindValue(":dns_name", aNode.DNSAddr()); } else { query.bindValue(":dns_name", QVariant(QVariant::String)); } if ( aNode.TORAddr().length() > 0 ) { query.bindValue(":tor_name", aNode.TORAddr()); } else { query.bindValue(":tor_name", QVariant(QVariant::String)); } query.bindValue(":last_nodelist_time", (quint32)(aNode.goodNodeListTime())) ; ret = query.exec() ; QLOG_STR("inserted node port "+QString::number(aNode.port())+" hash " + aNode.nodeFingerPrint().toString()) ; } if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { iCurrentDbTableRowCount++ ; } return ret ; } void NodeModel::retrieveListOfHotConnections() { bool ret = false ; iHotAddresses.clear() ; int port = -1 ; QSqlQuery query(iModel.dataBaseConnection()); QLOG_STR("Hot addresses in") ; const bool hasIpv6 = !Connection::Ipv6AddressesEqual(iController->getNode().ipv6Addr(), KNullIpv6Addr) ; if ( iFingerPrintOfThisNode ) { // must be self initialized QLOG_STR("Hot addresses, my hash = " + iFingerPrintOfThisNode->toString()) ; QString conditional_recently_failed_condition ; if ( iRecentlyFailedNodes.size() > 0 ) { conditional_recently_failed_condition = " where hash1 not in ( " ; for ( int i = iRecentlyFailedNodes.size()-1 ; i >= 0 ; i-- ) { conditional_recently_failed_condition += QString::number(iRecentlyFailedNodes[i].first.iHash160bits[0] ) + "," ; } conditional_recently_failed_condition += " -1)" ; } else { conditional_recently_failed_condition = " " ; } QLOG_STR("Failed nodes " + conditional_recently_failed_condition) ; ret = query.exec("select listenport,ipv4addr,ipv6addr1,ipv6addr2,ipv6addr3,ipv6addr4,hash1,hash2,hash3,hash4,hash5 from node "+conditional_recently_failed_condition+" order by last_conn_time desc") ; while ( ret && query.next() && !query.isNull(0) && iHotAddresses.size() < 300 ) { port = query.value(0).toInt() ; Hash hashOfRetrievedNode ( query.value(6).toUInt(), query.value(7).toUInt(), query.value(8).toUInt(), query.value(9).toUInt(), query.value(10).toUInt() ) ; if ( hashOfRetrievedNode != *iFingerPrintOfThisNode ) { // don't connect to self bool alreadyConnected = false ; for ( int i = iModel.getConnections().size()-1 ; i >= 0 ; i-- ) { // and don't connect to already-connected nodes const Node* nodeOfConnection = iModel.getConnections().value(i)->node() ; if ( nodeOfConnection && ( nodeOfConnection->nodeFingerPrint() == hashOfRetrievedNode ) ) { QLOG_STR("Hot: Was already connected " + hashOfRetrievedNode.toString()) ; alreadyConnected = true ; break ; } } if ( !alreadyConnected ) { if ( hasIpv6 && !query.isNull(2)) { // prefer ipv6 Q_IPV6ADDR addr = ipv6AddrFromUints (query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt(), query.value(5).toUInt() ) ; QHostAddress a(addr) ; MNodeModelProtocolInterface::HostConnectQueueItem p ; p.iAddress = a ; p.iPort = port ; p.iNodeHash = hashOfRetrievedNode ; if ( !iHotAddresses.contains(p) ) { iHotAddresses.append(p) ; QLOG_STR("Hot: Added hot addr " + a.toString()) ; } } else if ( !query.isNull(1) ) { QHostAddress a((quint32)(query.value(1).toUInt())) ; MNodeModelProtocolInterface::HostConnectQueueItem p ; p.iAddress = a ; p.iPort = port ; p.iNodeHash = hashOfRetrievedNode ; if ( !iHotAddresses.contains(p) ) { iHotAddresses.append(p) ; QLOG_STR("Hot: Added hot addr " + a.toString()) ; } } } } else { QLOG_STR("Not adding self node to list of hot addresses") ; } } } QLOG_STR("Hot addresses out") ; } void NodeModel::closeOldestInactiveConnection() { Connection *c = NULL ; int indexFound = -1 ; int numberOfNodesInPrivateAddressSpace ( 0 ) ; QList & requests ( iModel.getNetRequests() ) ; // construct a map^H^H^Hlist for faster lookups of hashes: QVector nodesOfNetworkRequests ; for ( int i = requests.size()-1 ; i >= 0 ; i-- ) { if ( requests.at(i).iDestinationNode != KNullHash ) { if ( !nodesOfNetworkRequests.contains(requests.at(i).iDestinationNode) ) { nodesOfNetworkRequests.append(requests.at(i).iDestinationNode) ; } } } time_t oldestActivityTimeFound = QDateTime::currentDateTimeUtc().toTime_t() ; for ( int j = iModel.getConnections().size()-1 ; j >= 0 ; j-- ) { c = iModel.getConnections().value(j) ; bool isInSameLAN ( c->isInPrivateAddrSpace() ) ; if ( isInSameLAN ) { numberOfNodesInPrivateAddressSpace++ ; } const Node* nodeOfConnection = c->node() ; if ( isInSameLAN || ( nodeOfConnection && nodesOfNetworkRequests.contains( nodeOfConnection->nodeFingerPrint() )) ) { // do nothing here, node is in our local lan or it // had pending network request so lets not kick him out.. } else { if ( oldestActivityTimeFound > c->iTimeOfLastActivity ) { oldestActivityTimeFound = c->iTimeOfLastActivity ; indexFound = j ; } } } // we have a constant in protocol.h telling how many connections // we wish to maintain ; from that count out the nodes that are // in our local lan i.e. never disconnect them unless they // disconnect self.. int numberOfRealOutSideConnections = iModel.getConnections().size() - numberOfNodesInPrivateAddressSpace ; if ( numberOfRealOutSideConnections > KMaxOpenConnections ) { if ( indexFound != -1 ) { iModel.getConnections().value(indexFound)->iNeedsToRun = false ; } } } QString NodeModel::dataDir() { return iDataDir ; } void NodeModel::addNodeFromBroadcast(const Hash& aNodeFingerPrint, const QHostAddress& aAddr, int aPort ) { // first check if node is already connected ; our neighboring // node will broadcast its presence often so odds are that we've // already made a connection: const QList & currentConnections ( iModel.getConnections() ) ; for ( int i = currentConnections.size()-1 ; i >= 0 ; i-- ) { // and don't connect to already-connected nodes if ( aNodeFingerPrint == currentConnections.value(i)->getPeerHash() ) { QLOG_STR("Broadcast: According to ssl fp, this node is already connected") ; return ; // was already connected } } // if we got here, the aNodeFingerPrint is not self, // and we don't have connection already. Node* n = new Node(aNodeFingerPrint,aPort) ; if ( aAddr.protocol() == QAbstractSocket::IPv6Protocol ) { n->setIpv6Addr(aAddr.toIPv6Address () ) ; } else { n->setIpv4Addr(aAddr.toIPv4Address () ) ; } addNodeToConnectionWishList(n) ; } bool NodeModel::addNodeToConnectionWishList(Node* aNode) { if ( iController->getNode().nodeFingerPrint() == aNode->nodeFingerPrint() ) { delete aNode ; return false ; // don't queue connection to self } for ( int i = 0 ; i < iConnectionWishList.size() ; i++ ) { if ( aNode->nodeFingerPrint() == iConnectionWishList.value(i)->nodeFingerPrint()) { // node already found from wishlist, don't add again: delete aNode ; return false ; } } iConnectionWishList.append(aNode) ; return true ; } bool NodeModel::addNodeToConnectionWishList(const Hash& aNode) { if ( iController->getNode().nodeFingerPrint() == aNode ) { return false ; // don't queue connection to self } for ( int i = 0 ; i < iConnectionWishList.size() ; i++ ) { if ( aNode == iConnectionWishList.value(i)->nodeFingerPrint()) { return true ; } } Node *n = nodeByHash(aNode) ; if ( n ) { iConnectionWishList.append(n) ; return true ; } else { return false ; } } Node* NodeModel::nextConnectionWishListItem() { if ( iConnectionWishList.isEmpty() ) { return NULL ; } else { return iConnectionWishList.takeAt(0) ; } } bool NodeModel::isNodeAlreadyConnected(const Node& aNode) const { if ( *iFingerPrintOfThisNode == aNode.nodeFingerPrint() ) { // "self" is considered connected return true ; } const QList & currentConnections ( iModel.getConnections() ) ; for ( int i = currentConnections.size()-1 ; i >= 0 ; i-- ) { // and don't connect to already-connected nodes const Node* nodeOfConnection ( currentConnections.value(i)->node() ); if ( nodeOfConnection && currentConnections.value(i)->connectionState() == Connection::Open ) { if ( nodeOfConnection->nodeFingerPrint() == aNode.nodeFingerPrint() ) { return true ; // was already connected } } // there may also be connections in early stage where connection // is there but node greeting has not yet been processed: QHostAddress addrOfConnection (currentConnections.value(i)->peerAddress()); if ( aNode.ipv4Addr() && addrOfConnection.protocol()== QAbstractSocket::IPv4Protocol && addrOfConnection.toIPv4Address() == aNode.ipv4Addr() ) { return true ; // was already connected } if ( !Connection::Ipv6AddressesEqual(aNode.ipv6Addr(), KNullIpv6Addr ) && addrOfConnection.protocol()== QAbstractSocket::IPv6Protocol && Connection::Ipv6AddressesEqual(addrOfConnection.toIPv6Address(), aNode.ipv6Addr() ) ) { return true ; } } return false ; } bool NodeModel::isNodeAlreadyConnected(const Hash& aHash) const { if ( *iFingerPrintOfThisNode == aHash ) { // "self" is considered connected return true ; } const QList & currentConnections ( iModel.getConnections() ) ; for ( int i = currentConnections.size()-1 ; i >= 0 ; i-- ) { // and don't connect to already-connected nodes const Node* nodeOfConnection( currentConnections.value(i)->node() ) ; if ( nodeOfConnection && currentConnections.value(i)->connectionState() == Connection::Open) { if ( nodeOfConnection->nodeFingerPrint() == aHash ) { return true ; // was already connected } } } return false ; } Hash NodeModel::bucketEndHash(const Hash& aFingerPrintOfNodeAsking) { Hash retval ; // here it is good idea to use same method that publishing-process // uses for getting the nodes .. we get a bit extra but // for sake of consistency it might still be good idea. QList* twentyNodes ( getNodesAfterHash(aFingerPrintOfNodeAsking, 20, // ask for 20 5*60)) ; // that have connect time 5*60 minutes or less if ( twentyNodes && twentyNodes->size() < 19 ) { retval = aFingerPrintOfNodeAsking ; // we got less than 19 nodes so our network is really small } else if ( twentyNodes && twentyNodes->size() >= 19 ) { retval = twentyNodes->at(twentyNodes->size()-1)->nodeFingerPrint() ; } else { retval = aFingerPrintOfNodeAsking ; // something odd happened. send all data. } // we have ownership of the array, it needs to be purged. while ( twentyNodes && twentyNodes->size() > 0 ) { Node* n = twentyNodes->takeAt(0) ; delete n ; } delete twentyNodes ; return retval ; } bool NodeModel::saveSslCertToDb(const QByteArray& aCert) { bool ret ( false ) ; QSqlQuery q2(iModel.dataBaseConnection()); ret = q2.prepare("update settings set node_cert = :cert") ; if (ret) { q2.bindValue(":cert", aCert) ; ret = q2.exec() ; } if ( !ret ) { QLOG_STR(q2.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, q2.lastError().text()) ; } return ret ; } bool NodeModel::saveSslKeyToDb(const QByteArray& aKey) { bool ret ( false ) ; QSqlQuery q2(iModel.dataBaseConnection()); ret = q2.prepare("update settings set node_key = :key") ; if (ret) { q2.bindValue(":key", aKey) ; ret = q2.exec() ; } if ( !ret ) { QLOG_STR(q2.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, q2.lastError().text()) ; } return ret ; } bool NodeModel::loadSslCertFromDb() { QSqlQuery query(iModel.dataBaseConnection()) ; bool ret ( false ) ; QByteArray certBytes ; ret = query.exec("select node_cert from settings") ; if ( ret && query.next() ) { if ( query.isNull(0) ) { // normal situation in first time: there is no key, column is null return false ; } else { certBytes = query.value(0).toByteArray() ; } } if ( !ret ) { emit error(MController::DbTransactionError, query.lastError().text()) ; } if ( certBytes.size() > 0 ) { iThisNodeCert = new QSslCertificate(certBytes) ; } if ( iThisNodeCert == NULL ) { QString errmsg(tr("Cant load SSL cert")) ; emit error(MController::OwnCertNotFound, errmsg) ; return false ; } else { iFingerPrintOfThisNode = new Hash(*iThisNodeCert) ; return true ; } } bool NodeModel::loadSslKeyFromDb() { QSqlQuery query(iModel.dataBaseConnection()) ; bool ret ( false ) ; QByteArray keyBytes ; ret = query.exec("select node_key from settings") ; if ( ret && query.next() ) { if ( query.isNull(0) ) { // normal situation in first time: there is no key, column is null return false ; } else { keyBytes = query.value(0).toByteArray() ; } } if ( !ret ) { emit error(MController::DbTransactionError, query.lastError().text()) ; } if ( keyBytes.size() > 0 ) { iThisNodeKey = new QSslKey(keyBytes,QSsl::Rsa) ; } if ( iThisNodeCert == NULL ) { QString errmsg(tr("Cant load SSL key")) ; emit error(MController::OwnCertNotFound, errmsg) ; return false ; } else { return true ; } } QString NodeModel::getDnsName() { QSqlQuery query(iModel.dataBaseConnection()); QString retval ; bool ret (false) ; ret = query.prepare ("select dns_name from settings"); if ( ret && (ret = query.exec()) && query.next ()) { if ( !query.isNull(0) ) { retval = query.value(0).toString() ; } } if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } return retval ; } void NodeModel::setDnsName(QString aName) { QSqlQuery query(iModel.dataBaseConnection()); bool retval ; retval = query.prepare ("update settings set dns_name = :name"); if ( retval ) { if ( aName.length() > 0 ) { query.bindValue(":name", aName) ; } else { query.bindValue(":name", QVariant(QVariant::String)) ; // null value } retval = query.exec() ; } if ( !retval ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } } void NodeModel::offerNodeToRecentlyFailedList(const Hash& aFailedNodeHash) { bool seen = false ; for ( int i = iRecentlyFailedNodes.size()-1 ; i >= 0 ; i-- ) { if ( iRecentlyFailedNodes[i].first == aFailedNodeHash ) { seen = true ; break ; } } if ( !seen ) { QPair newItem ( aFailedNodeHash, QDateTime::currentDateTimeUtc().toTime_t() ) ; iRecentlyFailedNodes.append(newItem) ; QLOG_STR("Failed node " + aFailedNodeHash.toString() + " time " + QString::number(newItem.second)) ; iHotAddresses.clear() ; // causes re-fetch, without the failed node } } void NodeModel::removeNodeFromRecentlyFailedList(const Hash& aConnectedHostFingerPrint) { for ( int i = iRecentlyFailedNodes.size()-1 ; i >= 0 ; i-- ) { if ( iRecentlyFailedNodes[i].first == aConnectedHostFingerPrint ) { iRecentlyFailedNodes.removeAt(i) ; break ; } } } // // this method is hit every 2 minutes - housekeeping here // void NodeModel::timerEvent(QTimerEvent* /* event */ ) { const unsigned time10MinAgo = QDateTime::currentDateTimeUtc().toTime_t()-(60*10) ; iController->model().lock() ; // remove all nodes that have been more than 10 minutes on the list for ( int i = iRecentlyFailedNodes.size()-1 ; i >= 0 ; i-- ) { if ( iRecentlyFailedNodes[i].second < time10MinAgo ) { QLOG_STR("Removing failed node " + iRecentlyFailedNodes[i].first.toString() + " time " + QString::number(iRecentlyFailedNodes[i].second) + " because " + QString::number(time10MinAgo) ) ; iRecentlyFailedNodes.removeAt(i) ; } } iController->model().unlock() ; } bool MNodeModelProtocolInterface::HostConnectQueueItem::operator==(const MNodeModelProtocolInterface::HostConnectQueueItem& aItemToCompare) const { if ( iAddress == aItemToCompare.iAddress && iPort == aItemToCompare.iPort ) { return true ; // match } else { if ( iNodeHash != KNullHash && iNodeHash == aItemToCompare.iNodeHash ) { return true ; } } return false ; } classified-ads-0.13/datamodel/nodemodel.h000066400000000000000000000302761331670245300203750ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti Jarvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_NODEMODEL_H #define CLASSIFIED_NODEMODEL_H #include #include #include "../mcontroller.h" // because enum from there is needed #include "mnodemodelprotocolinterface.h" #include "../net/connection.h" #include #include #include "datamodelbase.h" class QSqlDatabase ; class QMutex ; class Hash ; class QSslCertificate ; class QSslKey ; class Model ; /** * @brief This is node-specific part of the datamodel. * * This is node-specific part of the datamodel ; this handled * storage and handling of data that is directly related to * nodes themselves. Node is a peer in network. */ class NodeModel : public ModelBase, public MNodeModelProtocolInterface { Q_OBJECT public: NodeModel(MController *aController, Model &aModel) ; ~NodeModel() ; virtual Hash& nodeFingerPrint(); /**< returns fingerprint of this node */ virtual int listenPortOfThisNode() ; /**< TCP listen port number method */ /** Setting of TCP listen port number method */ virtual void setListenPortOfThisNode(int port) ; /** getter for ssl certificate of SSL sock */ virtual const QSslCertificate& nodeCert() const ; /** getter for ssl certificate of SSL sock */ virtual const QSslKey& nodeKey() const ; /** * Method that network connections use to request for more * stuff to send to peers * @param aConnection is the connection in question * @return octets in QByteArray. Ownership of bytes is * transferred, datamodel does not keep a copy * and caller is responsible for deleting the * returned bytes after they've been sent. */ virtual QByteArray* getNextItemToSend(Connection& aConnection) ; /** * Method for getting node details by hash * @param aHash tells which node to retrieve * @return node or NULL if not known */ virtual Node* nodeByHash(const Hash& aHash) ; /** * method for getting node-connection prospects. lock() must * be called by caller. This does not return addresses of nodes * that are already connected-to. And this does not return * address of this same node. Idea is to use this method * internally to fish out some addresses that might be * worth connecting. */ virtual QList getHotAddresses() ; /** * method for getting node-connection prospects with idea * that we make node-greetings out of those and send to * neighboring node. This may and will also return address * of this node and this may and will also return addresses * of nodes currently connected ; it makes sense to give * others list of addresses that are known to be online. * @param aMaxNodes max number of nodes to return * @return a qlist that the caller must delete after it * is used. */ QList* getHotNodes(int aMaxNodes) ; /** * From MModelProtocolInterface. * * Method related to node database handling ; generic node * reference update method, that is used also to update * reference of this node (self). NodeModel must be locked * before this is used. * * Practically this is called on 2 occasions: one is a new * connection to peer, there peer sends node greeing as * the first thing. This may trigger other things inside * datamodel. * * Second possibility is that we've asked for node * references (around some hash) and then we'll receive. * * @param aNode is the node that had its ref sent * @param aWasInitialGreeting is true if this call was due * to initial node greeting * sent just as first time * after connect * @return true if data update was successful */ virtual bool nodeGreetingReceived(Node& aNode , bool aWasInitialGreeting = false ) ; /** * Method for getting node-connection prospects around * a given hash. This is used to obtain nodes that might * contain content with hash-value near hash-values of * nodes. * @param aHash is hash where to start returning * @param aMaxNodes max number of nodes to return * @param aMaxInactivityMinutes leave out nodes that have last activity * time older than this many minutes, if * negative value specified, just include * all. * @return a qlist that the caller must delete after it * is used. */ virtual QList* getNodesAfterHash(const Hash& aHash, unsigned aMaxNodes, int aMaxInactivityMinutes = -1 ) ; /** * this is like updateNodeInDb but updates only the time * of last connect */ bool updateNodeLastConnectTimeInDb(Node& aNode) ; /** * method for updating last mutual connect time of * a node */ virtual bool updateNodeLastMutualConnectTimeInDb(const Hash& aNodeFp, quint32 aTime ) ; /** * We'll try to maintain the connections in hash-space in * ring-like structure where each node is connected to the * adjacent node, "adjacency" means that nodes whose hash-values * are closest to ours, are our adjacent nodes. For this purpose * have methods for retrieving list of nodes just before * us in the ring and later list of nodes just after us in the * ring. */ virtual QList* getNodesBeforeHash(const Hash& aHash, unsigned aMaxNodes) ; /** * method that picks up a connection that may be closed with * smallest amount of hassle.. * * method also works a bit conditionally, it may be that * if there is for instance a lot of connections from * same subnet with us, it will not close any connection.. */ virtual void closeOldestInactiveConnection() ; /** * Method that returns path of directory where datafiles * are kept */ QString dataDir() ; /** * method for adding node reference from broadcast. * this needs difference in handling because in IPv4 * network this typically contains private addr space * addresses that we don't want to permanently store nor * give to others as node-references. * * For making connections inside LANs of organisations * having NATs and firewalls and whatnot this might * still be a handy feature. */ virtual void addNodeFromBroadcast(const Hash& aNodeFingerPrint, const QHostAddress& aAddr, int aPort ) ; /** * method for adding a node to connection-wishlist. * network connector engine will then later pick them up. * nodemodel will take ownership of the node and delete * the object later. * @return true if connection was queued */ virtual bool addNodeToConnectionWishList(Node* aNode) ; /** * method for adding a node to connection-wishlist. * network connector engine will then later pick them up. * @return true if connection was queued */ virtual bool addNodeToConnectionWishList(const Hash& aNode) ; /** * method for getting one node from wishlist. * caller is obliged to delete the node returned. * @return node or null if there is nothing in wishlist */ virtual Node* nextConnectionWishListItem() ; /** * method for checking if a node is already connected. This * will try matching against hash and network addresses. */ virtual bool isNodeAlreadyConnected(const Node& aNode) const ; /** * Method for checking if a node is already connected. * This version checks only hash, not addresses. */ virtual bool isNodeAlreadyConnected(const Hash& aHash) const ; /** * Important method regarding churn here. This is called from * @ref Connection class and this method is used to determine * what content belongs to same bucket with the node that * is being served by that Connection. Content in the same bucket * with the node is then sent over to node ; to keep the content * alive in the network. * * Intent here is find bucket size where we have approximately * 20 live nodes in a bucket. If size of nodes alive in network * is less than 20, returned hash is same as the one given * in argument, methods using the value must then implement * something like "send all data". * * This is done so that we order the recently-seen nodes by hash * value of the node, then start from the fingerprint of the node * that is asking, and from that point we count to 20. The fingerprint * of the node at position 20 is the end of the bucket. The * fingerprint of the node that asks is the start. * * @param aFingerPrintOfNodeAsking fingerprint of node that wants to * have its bucket filled * @return Ending-address of the nodes bucket. */ virtual Hash bucketEndHash(const Hash& aFingerPrintOfNodeAsking) ; /** called from settings dialog */ virtual void setDnsName(QString aName) ; /** called from settings dialog and own node construction */ virtual QString getDnsName() ; /** used to offer node to list of recently failed connections. * this model maintains a list of such nodes and tries to * not immediately re-connect a recently failed node */ virtual void offerNodeToRecentlyFailedList(const Hash& aFailedNodeHash) ; protected: bool insertNodeToDb(Node& aNode) ; /** * method for updating existing node in db table * @param aNode is the node to update * @return true if success */ bool updateNodeInDb(Node& aNode) ; void retrieveListOfHotConnections() ; /** * for periodical stuff inside datamodel */ void timerEvent(QTimerEvent *event); private: bool openOrCreateSSLCertificate() ; /**< opens the node cert that is for network traffic */ bool saveSslCertToDb(const QByteArray& aCert) ; bool saveSslKeyToDb(const QByteArray& aKey) ; bool loadSslCertFromDb() ; bool loadSslKeyFromDb() ; void deleteOldestConnectedNode(); /**< prevent db table from overflowing */ void countNodes() ; /**< internal book-keeping */ Q_IPV6ADDR ipv6AddrFromUints(quint32 aLeastSignificant, quint32 aLessSignificant, quint32 aMoreSignificant, quint32 aMostSignificant ) const ; void removeNodeFromRecentlyFailedList(const Hash& aConnectedHostFingerPrint); signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: Hash* iFingerPrintOfThisNode ; /**< set by method openOrCreateSSLCertificate */ QSslCertificate* iThisNodeCert ; /**< set by method openOrCreateSSLCertificate */ QSslKey* iThisNodeKey ; /**< set by method openOrCreateSSLCertificate */ QList iHotAddresses ; QString iDataDir ; QList iConnectionWishList ; /** * this variable holds list of nodes that we've tried to * connect and failed. purpose of this is that we don't * immediately try again */ QList > iRecentlyFailedNodes ; int iTimerId ; /**< periodical timer */ } ; #endif classified-ads-0.13/datamodel/privmsg.cpp000066400000000000000000000146631331670245300204530ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "ca.h" #include "../util/hash.h" #include "../log.h" #include "../util/jsonwrapper.h" #include #include "../mcontroller.h" #include "model.h" #include "contentencryptionmodel.h" #include "privmsg.h" #include "../net/node.h" static const char *KPrivMsgJSonTimeElement = "timeOfPublish" ; static const char *KPrivMsgJSonAttachedFiles = "attachedPhiles" ; static const char *KPrivMsgJSonSenderName = "senderName" ; static const char *KPrivMsgJSonSubject = "subject" ; static const char *KPrivMsgJSonReplyToMsg = "replyToMsg" ; static const char *KPrivMsgJSonReplyToCa = "replyToCa" ; static const char *KPrivMsgJSonText = "text" ; static const char *KPrivMsgJSonProfileKey = "key" ; static const char *KPrivMsgJSonRecipient = "to" ; static const char *KPrivMsgJSonSenderNode = "senderNode" ; static const char *KPrivMsgJSonMsgVersion = "v" ; static const int KJSONMsgVersionValue ( 1 ) ; PrivMessage::PrivMessage() : iFingerPrint(KNullHash), iTimeOfPublish(0), iReplyToMsg(KNullHash), iReplyToCa(KNullHash), iNodeOfSender(NULL) { LOG_STR("PrivMessage::PrivMessage()") ; } PrivMessage::~PrivMessage() { LOG_STR("PrivMessage::~PrivMessage()") ; delete iNodeOfSender ; } QByteArray PrivMessage::asJSon(const MController& /*aController*/) const { // first have a map ; that is the top-level JSon-object QMap m ; if ( iAttachedFiles.size() > 0 ) { QVariantList listOfPhiles; LOG_STR2("iAttachedFiles has size %d", iAttachedFiles.size()) ; foreach( const Hash& phile, iAttachedFiles ) { listOfPhiles.append(phile.toString()) ; } if ( listOfPhiles.size() > 0 ) { m.insert(KPrivMsgJSonAttachedFiles, listOfPhiles) ; } } m.insert(KPrivMsgJSonMsgVersion, KJSONMsgVersionValue) ; if ( iSenderName.length() > 0 ) { m.insert(KPrivMsgJSonSenderName, iSenderName.toUtf8()) ; } if ( iRecipient != KNullHash ) { m.insert(KPrivMsgJSonRecipient, iRecipient.toString().toUtf8()) ; } if ( iSubject.length() > 0 ) { m.insert(KPrivMsgJSonSubject, iSubject.toUtf8()) ; } if ( iReplyToMsg != KNullHash ) { m.insert(KPrivMsgJSonReplyToMsg, iReplyToMsg.toString().toUtf8()) ; } if ( iReplyToCa != KNullHash ) { m.insert(KPrivMsgJSonReplyToCa, iReplyToCa.toString().toUtf8()) ; } if ( iMessageText.length() > 0 ) { m.insert(KPrivMsgJSonText, iMessageText.toUtf8()) ; } m.insert(KPrivMsgJSonTimeElement, iTimeOfPublish) ; if ( iNodeOfSender ) { m.insert(KPrivMsgJSonSenderNode, iNodeOfSender->asQVariant()) ; } if ( iProfileKey.length() > 0 ) { m.insert(KPrivMsgJSonProfileKey, iProfileKey) ; } QVariant j (m); // then put the map inside QVariant and that // may then be serialized in libqjson-0.7 and 0.8 QByteArray retval ( JSonWrapper::serialize(j) ) ; LOG_STR2("msg %s", qPrintable(QString(retval))) ; return retval ; } bool PrivMessage::fromJSon(const QByteArray &aJSonBytes, const MController& aController ) { bool ok; QVariantMap result ( JSonWrapper::parse (aJSonBytes, &ok) ) ; if (!ok) { return false ; } if ( result.contains(KPrivMsgJSonReplyToMsg) ) { iReplyToMsg.fromString((const unsigned char *)QString::fromUtf8(result[KPrivMsgJSonReplyToMsg].toByteArray()).toLatin1().constData()) ; } if ( result.contains(KPrivMsgJSonReplyToCa) ) { iReplyToCa.fromString((const unsigned char *)QString::fromUtf8(result[KPrivMsgJSonReplyToCa].toByteArray()).toLatin1().constData()) ; } if ( result.contains(KPrivMsgJSonRecipient) ) { iRecipient.fromString((const unsigned char *)QString::fromUtf8(result[KPrivMsgJSonRecipient].toByteArray()).toLatin1().constData()) ; } if ( result.contains( KPrivMsgJSonSenderNode ) ) { iNodeOfSender = Node::fromQVariant (result[KPrivMsgJSonSenderNode].toMap(),false) ; } if ( result.contains(KPrivMsgJSonAttachedFiles) ) { QVariantList listOfSharedPhiles (result[KPrivMsgJSonAttachedFiles].toList()) ; QListIterator i(listOfSharedPhiles); iAttachedFiles.clear() ; while (i.hasNext()) { Hash h ; h.fromString((const unsigned char*)(i.next().toString().toLatin1().constData())) ; iAttachedFiles.append(h); } } if ( result.contains(KPrivMsgJSonSenderName) ) { iSenderName = QString::fromUtf8(result[KPrivMsgJSonSenderName].toByteArray()) ; } else { iSenderName.clear() ; } if ( result.contains(KPrivMsgJSonTimeElement) ) { iTimeOfPublish = result[KPrivMsgJSonTimeElement].toUInt() ; } if ( result.contains(KPrivMsgJSonSubject) ) { iSubject = QString::fromUtf8(result[KPrivMsgJSonSubject].toByteArray()) ; } else { iSubject.clear() ; } if ( result.contains(KPrivMsgJSonText) ) { iMessageText = QString::fromUtf8(result[KPrivMsgJSonText].toByteArray()) ; } else { iMessageText.clear() ; } if ( result.contains(KPrivMsgJSonProfileKey) ) { iProfileKey.clear() ; iProfileKey.append(result[KPrivMsgJSonProfileKey].toByteArray()) ; // set sender hash from the key: iSenderHash = aController.model().contentEncryptionModel().hashOfPublicKey(iProfileKey) ; } return ok ; } QString PrivMessage::displayName() const { QString retval ; if ( iSubject.length() > 0 ) { retval = iSubject ; } else { retval = iFingerPrint.toString() ; } return retval ; } classified-ads-0.13/datamodel/privmsg.h000066400000000000000000000053161331670245300201130ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PRIVATE_MESSAGE_H #define PRIVATE_MESSAGE_H #include #include "../util/hash.h" // for class Hash class MController ; class Profile ; class Node ; /** * @brief Carrier-class for private msg inside classified ads * * Instances of this class are stored and retrieved using * @ref PrivateMessageModel. */ class PrivMessage { public: PrivMessage() ; /**< constructor */ ~PrivMessage() ; /**< destructor */ /** * method for string that is shown to user about the message. * * @return string to display to user */ QString displayName() const ; QByteArray asJSon(const MController& aController) const ; /**< returns msg data as JSon stream */ bool fromJSon(const QByteArray &aJSonBytes, const MController& aController ) ; /**< parses json into members*/ /** hash of the message text .. more specifically hash * of the message when it is serialized into json */ Hash iFingerPrint ; QString iSenderName ; /**< nickname/display-name of sender ; may empty if private profile */ Hash iSenderHash ; /**< profile fingerprint of the sender */ quint32 iTimeOfPublish ; /**< seconds since 1-jan-1970 */ /** * file attachements ; they're published as normal binary blobs and * then just listed here */ QList iAttachedFiles ; QString iSubject ; /**< Subject of the post */ Hash iReplyToMsg ; /**< Possible reference to another private message that this is reply to */ Hash iReplyToCa ; /**< Possible reference to classified ad post that this is reply to */ QString iMessageText ; /**< actual message here */ QByteArray iProfileKey ; /**< key of the message sender */ Hash iRecipient ; /**< Hash of the profile that will receive the msg */ Node* iNodeOfSender ; /**< When sending a reply, send it here */ } ; #endif classified-ads-0.13/datamodel/privmsgmodel.cpp000066400000000000000000000652071331670245300214740ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "privmsgmodel.h" #include "../log.h" #include "../util/hash.h" #include "model.h" #include #include #include "privmsg.h" #include "contentencryptionmodel.h" #include "const.h" PrivMessageModel::PrivMessageModel(MController *aController, MModelProtocolInterface &aModel) : ModelBase("private_message",KMaxRowsInTablePrivate_Message,aController,aModel) { LOG_STR("PrivMessageModel::PrivMessageModel()") ; connect(this, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; } PrivMessageModel::~PrivMessageModel() { LOG_STR("PrivMessageModel::~PrivMessageModel()") ; iController = NULL ; // not owned, just set null } bool PrivMessageModel::publishPrivMessage(PrivMessage& aPrivMessage, const Hash& aDestinationNode) { LOG_STR("PrivMessageModel::publishPrivMessage()") ; Hash messageFingerPrint ; bool retval = false ; QByteArray messageJSon ( aPrivMessage.asJSon(*iController) ) ; QList keysToEncryptMessageTo ; keysToEncryptMessageTo << aPrivMessage.iRecipient ; keysToEncryptMessageTo << aPrivMessage.iSenderHash ; // so that sender can also read later for ( int i = 0 ; i < keysToEncryptMessageTo.size() ; i++ ) { QLOG_STR("keysToEncryptMessageTo["+QString::number(i)+"]="+keysToEncryptMessageTo[i].toString()) ; } QByteArray encryptedJson ; // practically this also means that before we can send a private // message to any profile, the profile key must somehow magically // be stored in db.. this should be the case in every situation? if ( iController->model().contentEncryptionModel().encrypt(keysToEncryptMessageTo, messageJSon, encryptedJson ) ) { messageJSon.clear() ; messageJSon.append(encryptedJson) ; encryptedJson.clear() ; // so ; now ; the message json is encrypted -> proceed by making signature // of that } else { return false ; // encryption failed ? } if ( messageJSon.length() > 0 ) { QByteArray digitalSignature ; messageFingerPrint.calculate(messageJSon) ; if ( iController->model().contentEncryptionModel().sign(aPrivMessage.iSenderHash, messageJSon, digitalSignature) == 0 ) { QSqlQuery query(iModel.dataBaseConnection()); retval = query.prepare ("insert into private_message(" "hash1,hash2,hash3,hash4,hash5," "dnode_hash1,dnode_hash2,dnode_hash3,dnode_hash4,dnode_hash5," "recipient_hash1,recipient_hash2,recipient_hash3,recipient_hash4,recipient_hash5," "time_last_reference,signature," "time_of_publish,messagedata," "sender_hash1,is_read) values (" ":hash1,:hash2,:hash3,:hash4,:hash5," ":dnode_hash1,:dnode_hash2,:dnode_hash3,:dnode_hash4,:dnode_hash5," ":recipient_hash1,:recipient_hash2,:recipient_hash3,:recipient_hash4,:recipient_hash5," ":time_last_reference,:signature," ":time_of_publish,:messagedata," ":sender_hash1,1)") ; if ( retval ) { query.bindValue(":hash1", messageFingerPrint.iHash160bits[0]); query.bindValue(":hash2", messageFingerPrint.iHash160bits[1]); query.bindValue(":hash3", messageFingerPrint.iHash160bits[2]); query.bindValue(":hash4", messageFingerPrint.iHash160bits[3]); query.bindValue(":hash5", messageFingerPrint.iHash160bits[4]); if ( aDestinationNode != KNullHash ) { query.bindValue(":dnode_hash1", aDestinationNode.iHash160bits[0]); query.bindValue(":dnode_hash2", aDestinationNode.iHash160bits[1]); query.bindValue(":dnode_hash3", aDestinationNode.iHash160bits[2]); query.bindValue(":dnode_hash4", aDestinationNode.iHash160bits[3]); query.bindValue(":dnode_hash5", aDestinationNode.iHash160bits[4]); } else { query.bindValue(":dnode_hash1", QVariant(QVariant::String)) ; //null query.bindValue(":dnode_hash2", QVariant(QVariant::String)) ; //value query.bindValue(":dnode_hash3", QVariant(QVariant::String)) ; query.bindValue(":dnode_hash4", QVariant(QVariant::String)) ; query.bindValue(":dnode_hash5", QVariant(QVariant::String)) ; } query.bindValue(":recipient_hash1", aPrivMessage.iRecipient.iHash160bits[0]); query.bindValue(":recipient_hash2", aPrivMessage.iRecipient.iHash160bits[1]); query.bindValue(":recipient_hash3", aPrivMessage.iRecipient.iHash160bits[2]); query.bindValue(":recipient_hash4", aPrivMessage.iRecipient.iHash160bits[3]); query.bindValue(":recipient_hash5", aPrivMessage.iRecipient.iHash160bits[4]); query.bindValue(":time_last_reference", aPrivMessage.iTimeOfPublish); query.bindValue(":messagedata", messageJSon); query.bindValue(":signature", digitalSignature); query.bindValue(":time_of_publish", aPrivMessage.iTimeOfPublish); query.bindValue(":sender_hash1", aPrivMessage.iSenderHash.iHash160bits[0]); retval = query.exec() ; } if ( !retval ) { LOG_STR2("Error while private message insert %s", qPrintable(query.lastError().text())) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { // here user is publishing as "brand new" so set bangpath to 0 QList emptyBangPath ; iController->model().addItemToBePublished(PrivateMessage, messageFingerPrint, emptyBangPath, aDestinationNode ) ; iCurrentDbTableRowCount++ ; } } } if ( retval ) { aPrivMessage.iFingerPrint = messageFingerPrint ; } return retval ; } PrivMessage* PrivMessageModel::messageByFingerPrint(const Hash& aFingerPrint) { LOG_STR("PrivMessageModel::messageByFingerPrint()") ; PrivMessage* retval = NULL ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("select messagedata,signature from private_message where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( ret ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) && !query.isNull(1) ) { QByteArray messageData ( query.value(0).toByteArray()) ; QByteArray signature ( query.value(1).toByteArray()) ; QByteArray plainTextPrivMessageData ; retval = new PrivMessage() ; if ( iController->model().contentEncryptionModel().decrypt(messageData, plainTextPrivMessageData ) ) { LOG_STR2("message: %s", qPrintable(QString(plainTextPrivMessageData))); ret = retval->fromJSon(plainTextPrivMessageData,*iController) ; } else { delete retval ; retval = NULL ; ret = false ; } if ( ret ) { // hmm hmm. public key of the sender is inside the message // itself. it is possible that we do not have the key in // advance so the verification process may need it. verification // still ensures message integrity but origin of the message // surely is now unknown. QByteArray key ; quint32 timeStampOfPossibleExistingProfile ( 0 ) ; if ( iController->model().contentEncryptionModel().PublicKey(retval->iSenderHash, key, &timeStampOfPossibleExistingProfile ) == false ) { // we did not have the key: store it iController->model().contentEncryptionModel().insertOrUpdatePublicKey(retval->iProfileKey,retval->iSenderHash) ; } if ( iController->model().contentEncryptionModel().verify(retval->iSenderHash, messageData, signature) == false ) { // bad signature ret = false ; delete retval ; retval = NULL ; } else { // good signature retval->iFingerPrint = aFingerPrint; } } } } return retval ; } bool PrivMessageModel::messageDataByFingerPrint(const Hash& aFingerPrint, QByteArray& aResultingPrivMessageData, QByteArray& aResultingSignature, Hash* aResultingDestinationNode, Hash* aResultingRecipient, quint32* aTimeOfPublish) { LOG_STR("PrivMessageModel::messageDataByFingerPrint()") ; bool retval = false ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("select messagedata,signature,time_of_publish,dnode_hash1,dnode_hash2,dnode_hash3,dnode_hash4,dnode_hash5,recipient_hash1,recipient_hash2,recipient_hash3,recipient_hash4,recipient_hash5 from private_message where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( ret ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) && !query.isNull(1) ) { aResultingPrivMessageData.clear() ; aResultingSignature.clear() ; aResultingPrivMessageData.append ( query.value(0).toByteArray()) ; aResultingSignature.append ( query.value(1).toByteArray()) ; if ( !query.isNull(2) && aTimeOfPublish != NULL ) { *aTimeOfPublish = query.value(2).toUInt() ; } if ( aResultingDestinationNode != NULL && !query.isNull(3) && !query.isNull(4) && !query.isNull(5) && !query.isNull(6) && !query.isNull(7) ) { aResultingDestinationNode->iHash160bits[0] = query.value(3).toUInt() ; aResultingDestinationNode->iHash160bits[1] = query.value(4).toUInt() ; aResultingDestinationNode->iHash160bits[2] = query.value(5).toUInt() ; aResultingDestinationNode->iHash160bits[3] = query.value(6).toUInt() ; aResultingDestinationNode->iHash160bits[4] = query.value(7).toUInt() ; } else { if ( aResultingDestinationNode ) { *aResultingDestinationNode = KNullHash ; } } if ( aResultingRecipient != NULL ) { // in db receiver hash is not null aResultingRecipient->iHash160bits[0] = query.value(8).toUInt() ; aResultingRecipient->iHash160bits[1] = query.value(9).toUInt() ; aResultingRecipient->iHash160bits[2] = query.value(10).toUInt() ; aResultingRecipient->iHash160bits[3] = query.value(11).toUInt() ; aResultingRecipient->iHash160bits[4] = query.value(12).toUInt() ; } retval = true ; } } return retval ; } bool PrivMessageModel::sentPrivMessageReceived(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const Hash& aDestinationNode, const Hash& aRecipient, const quint32 aTimeStamp, const Hash& aFromNode ) { const QList dummy ; return doHandlepublishedOrSentPrivMessage(aFingerPrint, aContent, aSignature, dummy, aDestinationNode, aRecipient, aTimeStamp, false, aFromNode) ; } bool PrivMessageModel::publishedPrivMessageReceived(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const Hash& aDestinationNode, const Hash& aRecipient, const quint32 aTimeStamp, const Hash& aFromNode ) { return doHandlepublishedOrSentPrivMessage(aFingerPrint, aContent, aSignature, aBangPath, aDestinationNode, aRecipient, aTimeStamp, true, aFromNode ) ; } bool PrivMessageModel::doHandlepublishedOrSentPrivMessage(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const Hash& aDestinationNode, const Hash& aRecipient, const quint32 aTimeStamp, bool aWasPublish, const Hash& aFromNode ) { bool retval = false ; QByteArray key ; bool flagThisNodeAlreadyHadContent ( false ) ; // messages do not change nor get re-published. either we have // it or do not. if we did not, save it. QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("select hash1 from private_message where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( ret ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) ) { flagThisNodeAlreadyHadContent = true ; retval = true ; // this is normal situation, report as success } } if ( ret && flagThisNodeAlreadyHadContent == false ) { // store the message QSqlQuery query2(iModel.dataBaseConnection()); retval = query2.prepare ("insert into private_message(" "hash1,hash2,hash3,hash4,hash5," "dnode_hash1,dnode_hash2,dnode_hash3,dnode_hash4,dnode_hash5," "recipient_hash1,recipient_hash2,recipient_hash3,recipient_hash4,recipient_hash5," "time_last_reference,signature," "time_of_publish,messagedata,recvd_from) values (" ":hash1,:hash2,:hash3,:hash4,:hash5," ":dnode_hash1,:dnode_hash2,:dnode_hash3,:dnode_hash4,:dnode_hash5," ":recipient_hash1,:recipient_hash2,:recipient_hash3,:recipient_hash4,:recipient_hash5," ":time_last_reference,:signature," ":time_of_publish,:messagedata,:recvd_from)") ; if ( retval ) { query2.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query2.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query2.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query2.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query2.bindValue(":hash5", aFingerPrint.iHash160bits[4]); query2.bindValue(":recvd_from", aFromNode.iHash160bits[4]); if ( aDestinationNode != KNullHash ) { query2.bindValue(":dnode_hash1", aDestinationNode.iHash160bits[0]); query2.bindValue(":dnode_hash2", aDestinationNode.iHash160bits[1]); query2.bindValue(":dnode_hash3", aDestinationNode.iHash160bits[2]); query2.bindValue(":dnode_hash4", aDestinationNode.iHash160bits[3]); query2.bindValue(":dnode_hash5", aDestinationNode.iHash160bits[4]); } else { query2.bindValue(":dnode_hash1", QVariant(QVariant::String)) ; //null query2.bindValue(":dnode_hash2", QVariant(QVariant::String)) ; //value query2.bindValue(":dnode_hash3", QVariant(QVariant::String)) ; query2.bindValue(":dnode_hash4", QVariant(QVariant::String)) ; query2.bindValue(":dnode_hash5", QVariant(QVariant::String)) ; } query2.bindValue(":recipient_hash1", aRecipient.iHash160bits[0]); query2.bindValue(":recipient_hash2", aRecipient.iHash160bits[1]); query2.bindValue(":recipient_hash3", aRecipient.iHash160bits[2]); query2.bindValue(":recipient_hash4", aRecipient.iHash160bits[3]); query2.bindValue(":recipient_hash5", aRecipient.iHash160bits[4]); query2.bindValue(":time_last_reference", QDateTime::currentDateTimeUtc().toTime_t()); query2.bindValue(":messagedata", aContent); query2.bindValue(":signature", aSignature); query2.bindValue(":time_of_publish", aTimeStamp); retval = query2.exec() ; } } // if we already had the content or not if ( retval && ( flagThisNodeAlreadyHadContent == false ) ) { emit contentReceived(aFingerPrint, aRecipient, PrivateMessage) ; iCurrentDbTableRowCount++ ; } if ( aWasPublish ) { if ( retval && (flagThisNodeAlreadyHadContent == false) ) { iController->model().addItemToBePublished(PrivateMessage, aFingerPrint, aBangPath, aDestinationNode ) ; } } LOG_STR2("PrivMessageModel::published/sentPrivMessageReceived out success = %d", (int)retval) ; return retval ; } void PrivMessageModel::fillBucket(QList& aSendQueue, const Hash& aStartOfBucket, const Hash& aEndOfBucket, quint32 aLastMutualConnectTime, const Hash& aForNode ) { QSqlQuery query(iModel.dataBaseConnection()); bool ret ; // note how the private messages are placed into buckets // based on recipient hash, not by hash of the content // (like almost all other content) ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5,time_of_publish from private_message where ( recipient_hash1 >= :start and recipient_hash1 <= :end and time_of_publish > :last_connect_time and time_of_publish < :curr_time and ( recvd_from != :lowbits_of_requester or recvd_from is null ) ) or ( dnode_hash1=:dnode_hash1 and dnode_hash2=:dnode_hash2 and dnode_hash3=:dnode_hash3 and dnode_hash4=:dnode_hash4 and dnode_hash5=:dnode_hash5 and time_of_publish > :last_connect_time2 and time_of_publish < :curr_time2 ) order by time_of_publish desc limit 1000" ) ; if ( ret ) { if ( aStartOfBucket == aEndOfBucket ) { // this was "small network situation" e.g. start and end // are the same ; in practice it means that send all data query.bindValue(":start", 0x0); query.bindValue(":end", 0xFFFFFFFF); } else { // normal situation query.bindValue(":start", aStartOfBucket.iHash160bits[0]); query.bindValue(":end", aEndOfBucket.iHash160bits[0]); } query.bindValue(":last_connect_time", aLastMutualConnectTime); query.bindValue(":last_connect_time2", aLastMutualConnectTime); query.bindValue(":lowbits_of_requester", aForNode.iHash160bits[4]); query.bindValue(":curr_time", QDateTime::currentDateTimeUtc().addSecs(5*60).toTime_t()); query.bindValue(":curr_time2", QDateTime::currentDateTimeUtc().addSecs(5*60).toTime_t()); query.bindValue(":dnode_hash1", aForNode.iHash160bits[0]); query.bindValue(":dnode_hash2", aForNode.iHash160bits[1]); query.bindValue(":dnode_hash3", aForNode.iHash160bits[2]); query.bindValue(":dnode_hash4", aForNode.iHash160bits[3]); query.bindValue(":dnode_hash5", aForNode.iHash160bits[4]); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)); emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { Hash hashFoundFromDb ( query.value(0).toUInt(), query.value(1).toUInt(), query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt()) ; SendQueueItem privMsgToSend ; privMsgToSend.iHash = hashFoundFromDb ; privMsgToSend.iItemType = PrivateMessage ; time_t timePublish(query.value(5).toUInt()) ; time_t timeMutual(aLastMutualConnectTime); aSendQueue.append(privMsgToSend) ; char formatted_mutual [100] = {0} ; char formatted_found [100] = {0} ; #ifndef WIN32 ctime_r(&timePublish,&formatted_found[0] ) ; ctime_r(&timeMutual,&formatted_mutual[0] ) ; LOG_STR2("PrivMessage bucket mutual %s", formatted_mutual) ; LOG_STR2("PrivMessage bucket found %s", formatted_found) ; #endif } } } QList PrivMessageModel::messagesForProfile(const Hash& aProfileHash, const quint32 aLastMutualConnectTime) { QList retval ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; // note how the private messages are placed into buckets // based on recipient hash, not by hash of the content // (like almost all other content) ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5 from private_message where recipient_hash1 = :h1 and recipient_hash2 = :h2 and recipient_hash3 = :h3 and recipient_hash4 = :h4 and recipient_hash5 = :h5 and time_of_publish > :time_of_publish" ) ; if ( ret ) { query.bindValue(":h1", aProfileHash.iHash160bits[0]); query.bindValue(":h2", aProfileHash.iHash160bits[1]); query.bindValue(":h3", aProfileHash.iHash160bits[2]); query.bindValue(":h4", aProfileHash.iHash160bits[3]); query.bindValue(":h5", aProfileHash.iHash160bits[4]); query.bindValue(":time_of_publish", aLastMutualConnectTime); ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { Hash hashFoundFromDb ( query.value(0).toUInt(), query.value(1).toUInt(), query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt()) ; retval.append(hashFoundFromDb) ; } } } else { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } QLOG_STR("Returning list of private message len = " + QString::number(retval.size()) + " for profile " + aProfileHash.toString() + " since timestamp " + QString::number(aLastMutualConnectTime)) ; return retval ; } void PrivMessageModel::setAsRead(const Hash& aMessageHash, bool aIsRead ) { bool retval (false) ; QSqlQuery query(iModel.dataBaseConnection()); retval = query.prepare ("update private_message set is_read = :is_read, time_last_reference=:time_last_reference where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( retval ) { query.bindValue(":hash1", aMessageHash.iHash160bits[0]); query.bindValue(":hash2", aMessageHash.iHash160bits[1]); query.bindValue(":hash3", aMessageHash.iHash160bits[2]); query.bindValue(":hash4", aMessageHash.iHash160bits[3]); query.bindValue(":hash5", aMessageHash.iHash160bits[4]); query.bindValue(":is_read", ( aIsRead == true ? 1 : 0 ) ); query.bindValue(":time_last_reference", QDateTime::currentDateTimeUtc().toTime_t()); retval = query.exec() ; } if ( !retval ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } } classified-ads-0.13/datamodel/privmsgmodel.h000066400000000000000000000263771331670245300211460ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_PRIVMSGMODEL_H #define CLASSIFIED_PRIVMSGMODEL_H #include "../mcontroller.h" // because enum from there is needed #include "../net/protocol.h" // for SendQueueItem #include "datamodelbase.h" class Hash ; class MModelProtocolInterface ; class PrivMessage ; /** * @brief This is is part of datamodel for storing private messages * * Encryption keys related to messages need to be done using * ContentEncryptionModel but after it has done its job, * this part of datamodel handles that actual message-content. * * Private messages are handled differently in (at least) one * way worth mentioning: when other published content is * sent over network, the content is accompanied by public key * used to sign the content. Private messages have the public * key of the content inside the content and the content * is encrypted. This means 2 things: * - only the recipient knows who sent * - only the recipient can verify integrity of the data * so, while storing messages here, we do not try to verify. * When user opens a message, it is first de-crypted and * key obtained from inside, then verification takes place. */ class PrivMessageModel : public ModelBase { Q_OBJECT public: PrivMessageModel(MController *aMController, MModelProtocolInterface &aModel) ; ~PrivMessageModel() ; /** * sends private message to selected nodes in network for others * to retrieve. as a side-effect will update aPrivMessage.iFingerPrint, * supposing the publish is successful. * * @param aPrivMessage is the message to publish. Messages are * "sent" so that they're published into * network. Recipient then may poll them. * Networking logick will try to short-cut * this if correct node seems to be already * connected but in principle messages are * sent by process of publish. * @param aDestinationNode if node of the recipient is known, * it may be given here. * @return true if things went all right */ bool publishPrivMessage(PrivMessage& aPrivMessage, const Hash& aDestinationNode = KNullHash ) ; /** * gets a message. caller is supposed to delete the returned * profile. * @param aFingerPrint messaqe serial number * @return message or NULL */ PrivMessage* messageByFingerPrint(const Hash& aFingerPrint) ; /** * Gets a message. Because message is signed .. and that means that * a particular byte-stream (containing actually a serialized json * object) gets signed those bytes can't be altered or signature will * not verify. This methods gets the actual signed bytestream * that has been checked against a public key. * * Note that this method does not check the signature any more, * idea is that we don't store into db messages that fail the signature * check so this method only gets the message, does not set it. * * @param aFingerPrint message serial number * @param aResultingPrivMessageData will contain message data * @param aResultingSignature will contain message signature * @param aResultingDestinationNode output parameter will get its value * set to fingerprint of the node where * the message is supposed to go. * May come out as KNullHash if the * node is not known. * @param aResultingRecipient output parameter will get its value * set to fingerprint of the profile that * is supposed to read the msg * @param aTimeOfPublish is output variable, if non-NULL, will * get its value set to time of publish of the message * @return true if message was found */ bool messageDataByFingerPrint(const Hash& aFingerPrint, QByteArray& aResultingPrivMessageData, QByteArray& aResultingSignature, Hash* aResultingDestinationNode, Hash* aResultingRecipient, quint32* aTimeOfPublish = NULL) ; /** * called by protocol parser when a message is received * @param aFingerPrint is the message @ref Hash received from protocol header * @param aContent is actual message data * @param aSignature is digital signature of the aContent * @param aBangPath is list of last nodes where this content has been, idea is to * prevent re-sending content to somewhere where it has already * been * @param aDestinationNode node where the message should be * delivered to ; may be nullhash * @param aRecipient recipient profile hash * @param aTimeStamp timestamp of message (if encrypted, it must be carried outside..) * @param aFromNode hash of node sending the message to us * @return true on success */ bool publishedPrivMessageReceived(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const Hash& aDestinationNode, const Hash& aRecipient, const quint32 aTimeStamp, const Hash& aFromNode) ; /** * called by protocol parser when a private message is received by "send" protocol type * @param aFingerPrint is the message @ref Hash received from protocol header * @param aContent is actual message data * @param aSignature is digital signature of the aContent * @param aDestinationNode node where the message should be * delivered to ; may be nullhash * @param aRecipient recipient profile hash * @param aFlag possible flags telling about encyption and compression * @param aTimeStamp timestamp of message (if encrypted, it must be carried outside..) * @return true on success */ bool sentPrivMessageReceived(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const Hash& aDestinationNode, const Hash& aRecipient, const quint32 aTimeStamp, const Hash& fromNode ) ; /** * Method for filling connected peers send queue with items * that we have and that belong to said peers bucket. * * Note that for private messages the bucket is kind of * 2-way process. This method checks for private messages * that are destined for this particular (connecting) * node. In addition this method checks for messages * where the destination profile belongs to bucket defined * by aStartOfBucket/aEndOfBucket. In addition to these * mechanisms this is also exploited by 3rd logick * (possibly to be implemented in networkconnectorengine) * that every-now-and-then creates connections to nodes * that (according to hash) are supposed to contain * private messages destined to profiles whose private keys * we have in storage. * * @param aSendQueue is send-queue of the connection that * serves particular node * @param aStartOfBucket is hash where bucket of that peer * starts. In practice it is the hash * of the node itself. * @param aEndOfBucket is hash where bucket of that peer ends. * That in turn depends on network size, * or number of active nodes in the network. * See method @ref NodeModel::bucketEndHash * for details. * @param aLastMutualConnectTime time when node was last in * contact. In practice we'll fill the * bucket items published after this time. */ void fillBucket(QList& aSendQueue, const Hash& aStartOfBucket, const Hash& aEndOfBucket, quint32 aLastMutualConnectTime, const Hash& aForNode ); /** * method for getting list of messages destined for given * operator that has been posted after the given date. * This is called upon network protocol message * KPrivMessagesForProfile. * * @param aProfileHash operator profile fingerprint whose messages are * requested. * @param aLastMutualConnectTime messages that are sent afer aLastMutualConnectTime * will be returned. * @return list of message fingerprints */ QList messagesForProfile(const Hash& aProfileHash, const quint32 aLastMutualConnectTime) ; /** method for marking private message as read */ void setAsRead(const Hash& aMessageHash, bool aIsRead ) ; private: // methods /** * Workhorse of methods @ref publishedPrivMessageReceived and * @ref sentPrivMessageReceived * @return true on success */ bool doHandlepublishedOrSentPrivMessage(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const Hash& aDestinationNode, const Hash& aRecipient, const quint32 aTimeStamp, bool aWasPublish, const Hash& aFromNode ) ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; /** emitted when new message is received */ void contentReceived(const Hash& aHashOfContent, const Hash& aHashOfRecipientProfile, const ProtocolItemType aTypeOfReceivdContent) ; } ; #endif classified-ads-0.13/datamodel/privmsgsearchmodel.cpp000066400000000000000000000370651331670245300226630ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include "privmsgsearchmodel.h" #include "trusttreemodel.h" #include "../log.h" #include "../mcontroller.h" #include "model.h" #include "privmsgmodel.h" #include "privmsg.h" PrivateMessageSearchModel::PrivateMessageSearchModel(Model& aModel, MController& aController ) : iModel(aModel), iController(aController), iLeftIcon(":/ui/ui/leftarrow.png") , iRightIcon(":/ui/ui/rightarrow.png") { } PrivateMessageSearchModel::~PrivateMessageSearchModel() { LOG_STR("PrivateMessageSearchModel::~PrivateMessageSearchModel") ; } int PrivateMessageSearchModel::rowCount(const QModelIndex& ) const { return iPrivateMessages.size(); } int PrivateMessageSearchModel::columnCount(const QModelIndex& ) const { return 4 ; // what are the columns? Direction, Peer, time, subject? } QVariant PrivateMessageSearchModel::data(const QModelIndex &index, int role) const { if(!index.isValid()) return QVariant(); if ( role == Qt::UserRole ) { return iPrivateMessages.at(index.row()).iMessageHash.toQVariant() ; } if ( role == Qt::FontRole ) { QFont font; if ( iPrivateMessages.at(index.row()).iIsRead == false ) { font.setBold(true); font.setItalic(true); } return font; } switch ( index.column() ) { case 0: // direction, show icon if(role == Qt::DecorationRole) { if ( iController.profileInUse() == iPrivateMessages.at(index.row()).iRecipientHash ) { return QVariant(iLeftIcon); // here return image telling direction of message: to me } else { return QVariant(iRightIcon); // here return image telling direction of message: from me } } else { return QVariant(); } break ; case 1: // peer, either name or hash if(role == Qt::DisplayRole) { if ( iController.profileInUse() == iPrivateMessages.at(index.row()).iRecipientHash ) { // to me, from recipient, so recipient is peer if ( iPrivateMessages.at(index.row()).iSenderName.length() > 0 ) { return iPrivateMessages.at(index.row()).iSenderName ; } else { return iPrivateMessages.at(index.row()).iSenderHash.toString() ; } } else { // from me, so destination hash is peer if ( iPrivateMessages.at(index.row()).iSenderName.length() > 0 ) { return iPrivateMessages.at(index.row()).iSenderName ; } else { return iController.displayableNameForProfile(iPrivateMessages.at(index.row()).iRecipientHash) ; } } } else if(role == Qt::DecorationRole) { // here return QIcon of size 26x26 featuring lenin reading pravda? return QVariant(); } else if(role == Qt::ToolTipRole) { Hash peerHash ( iController.profileInUse() == iPrivateMessages.at(index.row()).iRecipientHash ? iPrivateMessages.at(index.row()).iSenderHash : iPrivateMessages.at(index.row()).iRecipientHash ) ; if ( iPrivateMessages.at(index.row()).iTrustingProfileName.length() > 0 ) { return QString(tr("%1\nTrusted by %2")).arg(peerHash.toString()).arg(iPrivateMessages.at(index.row()).iTrustingProfileName) ; } else { return peerHash.toString() ; } } else if ( role == Qt::ForegroundRole ) { Hash peerHash ( iController.profileInUse() == iPrivateMessages.at(index.row()).iRecipientHash ? iPrivateMessages.at(index.row()).iSenderHash : iPrivateMessages.at(index.row()).iRecipientHash ) ; if ( iPrivateMessages.at(index.row()).iTrustingProfileName.length() > 0 || iController.isContactInContactList(peerHash ) ) { return QColor(Qt::blue); // color blue if sender is in contacts or trusted } else { return QVariant() ; } } else { return QVariant() ; } break ; case 2: { // message time if(role == Qt::DisplayRole) { QDateTime d ; d.setTime_t(iPrivateMessages.at(index.row()).iMessageTimeStamp) ; return d.toString(Qt::SystemLocaleShortDate) ; } else { return QVariant(); } } break ; case 3: if(role == Qt::DisplayRole) { return iPrivateMessages.at(index.row()).iMessageSubject ; } else { return QVariant(); } break ; default: return QVariant(); // for unknown columns return empty } return QVariant(); } void PrivateMessageSearchModel::setSearchHash(const Hash& aSearch) { emit beginResetModel (); iSearchHash = aSearch ; // ok .. what next. .. don't search with empty if ( iSearchHash == KNullHash ) { iPrivateMessages.clear() ; } else { performSearch() ; } emit endResetModel () ; if ( iPrivateMessages.size() ) { QTimer::singleShot(0, this, SLOT(doUpdateDataOnIdle())); } } void PrivateMessageSearchModel::performSearch() { QSqlQuery query(iController.model().dataBaseConnection()); bool ret ; iPrivateMessages.clear() ; ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5,recipient_hash1,recipient_hash2,recipient_hash3,recipient_hash4,recipient_hash5,time_of_publish,sender_hash1,is_read from private_message where ( recipient_hash1 = :hash1 and recipient_hash2 = :hash2 and recipient_hash3 = :hash3 and recipient_hash4 = :hash4 and recipient_hash5 = :hash5) or sender_hash1 = :sender_hash1 order by time_of_publish" ) ; if ( ret ) { query.bindValue(":hash1", iSearchHash.iHash160bits[0]); // destined to me query.bindValue(":hash2", iSearchHash.iHash160bits[1]); query.bindValue(":hash3", iSearchHash.iHash160bits[2]); query.bindValue(":hash4", iSearchHash.iHash160bits[3]); query.bindValue(":hash5", iSearchHash.iHash160bits[4]); query.bindValue(":sender_hash1", iSearchHash.iHash160bits[0]); // or sent by me } if ( ret && query.exec() ) { while ( query.next() ) { PrivateMessageListItem item ; item.iMessageHash = Hash(query.value(0).toUInt(), query.value(1).toUInt(), query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt()) ; if ( !query.isNull(5) ) { item.iRecipientHash = Hash(query.value(5).toUInt(), query.value(6).toUInt(), query.value(7).toUInt(), query.value(8).toUInt(), query.value(9).toUInt()) ; } item.iMessageTimeStamp = query.value(10).toUInt() ; if ( !query.isNull(11) && query.value(11).toUInt() == iController.profileInUse().iHash160bits[0] ) { // was sent by me, yes item.iSenderHash = iController.profileInUse() ; QString trustingProfileName ; Hash trustingProfileHash ; if ( iController.model().trustTreeModel()->isProfileTrusted(item.iRecipientHash, &trustingProfileName, &trustingProfileHash) ) { if ( trustingProfileName.length() > 0 ) { item.iTrustingProfileName = trustingProfileName ; } else { item.iTrustingProfileName = trustingProfileHash.toString() ; } } } else { // was destined to me, cant't check for trust yet } if ( !query.isNull(12) && query.value(12).toInt() > 0 ) { item.iIsRead = true ; } else { item.iIsRead = false ; } item.iMessageSubject = "-" ; iPrivateMessages.append(item) ; LOG_STR2("Appended into model a private message with ts = %u", (unsigned)(item.iMessageTimeStamp)) ; } } else { emit error(MController::DbTransactionError, query.lastError().text()) ; } } QVariant PrivateMessageSearchModel::headerData ( int section, Qt::Orientation orientation, int role ) const { if (orientation != Qt::Horizontal ) { return QVariant(); } switch ( role ) { case Qt::ToolTipRole: switch ( section ) { case 0: return tr("Direction of message, sent/received") ; break; default: return QVariant(); break ; } break ; case Qt::DisplayRole: switch ( section ) { case 0: return tr("Dir") ; break; case 1: return tr("Peer") ; break ; case 2: return tr("Time") ; break ; case 3: return tr("Subject") ; break ; default: return QVariant(); } break ; case Qt::SizeHintRole: switch ( section ) { case 0: return QSize(30,25) ; break; case 1: return QSize(100,25) ; break ; case 2: return QSize(150,25) ; break ; case 3: return QSize(150,25) ; break ; default: return QVariant(); } break ; default: return QVariant(); break ; } } bool PrivateMessageSearchModel::updateSenderAndSubjectOfMsg(PrivateMessageListItem& aItem) { PrivMessage* msg ( iModel.privateMessageModel().messageByFingerPrint(aItem.iMessageHash)); if ( msg ) { aItem.iSenderName = msg->iSenderName ; aItem.iSenderHash = msg->iSenderHash ; aItem.iMessageSubject = msg->iSubject ; aItem.iMessageTimeStamp = msg->iTimeOfPublish ; QString trustingProfileName ; Hash trustingProfileHash ; if ( iController.model().trustTreeModel()->isProfileTrusted( aItem.iSenderHash == iController.profileInUse() ? aItem.iRecipientHash : aItem.iSenderHash , &trustingProfileName, &trustingProfileHash)) { if ( trustingProfileName.length() > 0 ) { aItem.iTrustingProfileName = trustingProfileName ; } else { aItem.iTrustingProfileName = trustingProfileHash.toString() ; } } else { aItem.iTrustingProfileName = QString() ; } delete msg ; return true ; } else { // we have got a message but could not open it via datamodel // so the message is somehow faulty. return false ; } } void PrivateMessageSearchModel::doUpdateDataOnIdle() { LOG_STR("PrivateMessageSearchModel::doUpdateDataOnIdle") ; int indexUpdated(-1) ; bool updateSuccess ( false ) ; iModel.lock() ; for ( int i ( 0 ) ; i < iPrivateMessages.size() ; i++ ) { if ( iPrivateMessages.at(i).iSenderHash == KNullHash ) { indexUpdated = i ; PrivateMessageListItem& item ( iPrivateMessages[i] ) ; updateSuccess = updateSenderAndSubjectOfMsg(item) ; break ; // out of loop, e.g. do only one } } iModel.unlock() ; if ( indexUpdated > -1 ) { if ( updateSuccess ) { // so, if we updated something, give UI a clue emit dataChanged(createIndex(indexUpdated,0), createIndex(indexUpdated,3) ) ; // and re-schedule self to check if there is more // messages to handle } else { // update was not success, lets remove the message beginRemoveRows(QModelIndex(), indexUpdated,indexUpdated); iModel.lock() ; iPrivateMessages.removeAt(indexUpdated) ; iModel.unlock() ; endRemoveRows() ; } QTimer::singleShot(0, this, SLOT(doUpdateDataOnIdle())); } } void PrivateMessageSearchModel::setAsRead(const Hash& aMessage, bool aIsRead) { for ( int i ( 0 ) ; i < iPrivateMessages.size() ; i++ ) { if ( iPrivateMessages.at(i).iMessageHash == aMessage ) { PrivateMessageListItem item = iPrivateMessages.at(i) ; item.iIsRead = aIsRead ; iPrivateMessages.replace(i, item) ; break ; } } } void PrivateMessageSearchModel::newMsgReceived(const Hash& aMessage,const Hash& aRecipient) { bool wasAlreadyContained ( false ) ; if ( aRecipient == iController.profileInUse() ) { // was for me iModel.lock() ; for ( int i ( 0 ) ; i < iPrivateMessages.size() ; i++ ) { if ( iPrivateMessages.at(i).iMessageHash == aMessage ) { wasAlreadyContained = true ; break ; // out of loop, e.g. do only one } } iModel.unlock() ; if ( !wasAlreadyContained ) { beginInsertRows(QModelIndex(),iPrivateMessages.size(),iPrivateMessages.size()) ; iModel.lock() ; PrivateMessageListItem item ; item.iIsRead = false ; item.iMessageTimeStamp = QDateTime::currentDateTimeUtc().toTime_t() ; item.iMessageHash = aMessage ; item.iRecipientHash = aRecipient ; item.iMessageSubject = " " ; iPrivateMessages.append(item) ; iModel.unlock() ; endInsertRows() ; QTimer::singleShot(0, this, SLOT(doUpdateDataOnIdle())); } } } void PrivateMessageSearchModel::newMsgReceived(const PrivMessage& aMessage) { beginInsertRows(QModelIndex(),iPrivateMessages.size(),iPrivateMessages.size()) ; PrivateMessageListItem item ; item.iIsRead = true ; item.iSenderName = aMessage.iSenderName ; item.iRecipientHash = aMessage.iRecipient ; item.iSenderHash = aMessage.iSenderHash ; item.iMessageSubject = aMessage.iSubject ; item.iMessageTimeStamp = aMessage.iTimeOfPublish ; item.iMessageHash = aMessage.iFingerPrint ; iPrivateMessages.append(item) ; QLOG_STR("PrivateMessageSearchModel::newMsgReceived iSenderName = " + item.iSenderName) ; QLOG_STR("PrivateMessageSearchModel::newMsgReceived iRecipientHash = " + item.iRecipientHash.toString()) ; QLOG_STR("PrivateMessageSearchModel::newMsgReceived iSenderHash = " + item.iSenderHash.toString()) ; endInsertRows() ; } classified-ads-0.13/datamodel/privmsgsearchmodel.h000066400000000000000000000077141331670245300223260ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PRIVMSGSEARCHMODEL_H #define PRIVMSGSEARCHMODEL_H #include #include "../util/hash.h" #include "../mcontroller.h" #include class Model ; class PrivMessage ; /** * @brief Model-class for performing search on private messages. * This is supposed to act as an underlying data-container for * an user-interface view (QListView etc.) */ class PrivateMessageSearchModel: public QAbstractTableModel { Q_OBJECT public: // types: struct PrivateMessageListItem { Hash iMessageHash ; Hash iRecipientHash ; Hash iSenderHash ; quint32 iMessageTimeStamp ; QString iMessageSubject ; QString iSenderName ; bool iIsRead ; QString iTrustingProfileName ; } ; public: PrivateMessageSearchModel(Model& aModel,MController& aController) ; ~PrivateMessageSearchModel() ; /** * Calling this method will populate the model with * messages that are either sent by profile given in * parameter, or destined to given profile. * @param aSearch profile fingerprint whose messages are * the item of interest * @return no thing, always succeeds */ void setSearchHash(const Hash& aSearch) ; /** * re-implemented from QAbstractTableModel * @return number of rows in list */ virtual int rowCount(const QModelIndex & parent = QModelIndex()) const ; /** * re-implemented from QAbstractTableModel * @return number of columns in view */ virtual int columnCount(const QModelIndex & parent = QModelIndex()) const ; /** * re-implemented from QAbstractListModel * @return data to display in list */ virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const ; virtual QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const ; void setAsRead(const Hash& aMessage, bool aIsRead) ; /** * notification method called when new private message * is inserted into database */ void newMsgReceived(const Hash& aMessage,const Hash& aRecipient) ; /** * notification method called when new private message * is inserted into database , this variant is called * from UI */ void newMsgReceived(const PrivMessage& aMessage) ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; public slots: /** * method called via QTimer::singleShot() that is used for * filling missing parts (message subjects etc.) from data that * model is listing */ void doUpdateDataOnIdle() ; private:// methods void performSearch() ; /** * Updates single private message from database, e.g. tries * to open encryption and everything * @return true on success */ bool updateSenderAndSubjectOfMsg(PrivateMessageListItem& aItem) ; private: // data Model& iModel ; MController& iController ; QList iPrivateMessages ; Hash iSearchHash ; QIcon iLeftIcon; QIcon iRightIcon; } ; #endif classified-ads-0.13/datamodel/profile.cpp000066400000000000000000000312241331670245300204140ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "profile.h" #include "../util/hash.h" #include "../log.h" #include "../util/jsonwrapper.h" #include #include #include "../mcontroller.h" #include "model.h" #include "contentencryptionmodel.h" static const char *KJSonNickNameElement = "nickName" ; static const char *KJSonFPElement = "fingerPrint" ; static const char *KJSonTimeElement = "timeOfPublish" ; static const char *KJSonProfileVersion = "profileVersion" ; static const char *KJSonNodeRef = "nodeRef" ; static const char *KJSonEncyptionKey = "key" ; static const char *KJSonIsProfilePrivateKey = "isPrivate" ; static const char *KJSonStateOfTheWorld = "stateOfTheWorld" ; static const char *KJSonListOfProfileReaders = "readers" ; static const char *KJSonProfilePic = "image" ; static const char *KJSonSharedFiles = "sharedPhiles" ; static const char *KJSonGreetingText = "greeting" ; static const char *KJSonFirstName = "given" ; static const char *KJSonFamilyName = "family" ; static const char *KJSonCityCountry = "city" ; static const char *KJSonBTCAddress = "btcaddr" ; static const char *KJSonTrustList = "trustlist" ; static const int KJSONProfileVersionValue = 1 ; /**< if our format should change? */ Profile::Profile(const Hash& aHash) : iFingerPrint(aHash), iIsPrivate(false), // initially all profiles are public ; right? iTimeOfPublish(0), iNodeOfProfile(NULL) { } Profile::~Profile() { if ( iNodeOfProfile ) { delete iNodeOfProfile ; } } QByteArray Profile::asJSon(const MController& aController) const { // may then be serialized in libqjson-0.7 and 0.8 QByteArray retval ( JSonWrapper::serialize(asQVariant(aController)) ) ; LOG_STR2("profile %s", qPrintable(QString(retval))) ; return retval ; } QVariant Profile::asQVariant(const MController& aController) const { // first have a map ; that is the top-level JSon-object QMap m ; m.insert(KJSonFPElement, iFingerPrint.toString()) ; // no non-ascii chars if ( iNickName.length() > 0 ) { m.insert(KJSonNickNameElement, iNickName.toUtf8()) ; } if ( iStateOfTheWorld.length() > 0 ) { m.insert(KJSonStateOfTheWorld, iStateOfTheWorld.toUtf8()) ; } if ( iGreetingText.length() > 0 ) { m.insert(KJSonGreetingText , iGreetingText.toUtf8()) ; } if ( iFirstName.length() > 0 ) { m.insert(KJSonFirstName, iFirstName.toUtf8()) ; } if ( iFamilyName.length() > 0 ) { m.insert(KJSonFamilyName, iFamilyName.toUtf8()) ; } if ( iCityCountry.length() > 0 ) { m.insert(KJSonCityCountry, iCityCountry.toUtf8()) ; } if ( iBTCAddress.length() > 0 ) { m.insert(KJSonBTCAddress, iBTCAddress.toUtf8()) ; } m.insert(KJSonTimeElement, iTimeOfPublish) ; m.insert(KJSonProfileVersion, KJSONProfileVersionValue) ; m.insert(KJSonNodeRef, aController.getNode().asQVariant()) ; QByteArray encryptionKey ; if(aController.model().contentEncryptionModel().PublicKey(iFingerPrint, encryptionKey)) { m.insert(KJSonEncyptionKey, encryptionKey) ; } m.insert( KJSonIsProfilePrivateKey, iIsPrivate) ; if ( iSharedFiles.size() > 0 ) { QVariantList listOfSharedPhiles ; foreach( const Hash& phile, iSharedFiles ) { QVariant v ; v.setValue(phile.toString()) ; listOfSharedPhiles.append(v) ; } LOG_STR2("Number of files in profile serialization %d", listOfSharedPhiles.size()) ; m.insert(KJSonSharedFiles, listOfSharedPhiles) ; } else { LOG_STR("No shared files in profile serialization") ; } if ( iTrustList.size() > 0 ) { QVariantList trustList ; foreach( const Hash& trustedProfile, iTrustList ) { QVariant v ; v.setValue(trustedProfile.toString()) ; trustList.append(v) ; } m.insert(KJSonTrustList, trustList) ; } if ( iIsPrivate && iProfileReaders.size() > 0 ) { // insert the readers so replies always get encrypted to // every operator in the list QVariantList listOfEncryptionKeys; LOG_STR2("iProfileReaders has size %d", iProfileReaders.size()) ; foreach( const Hash& reader, iProfileReaders ) { if ( reader != iFingerPrint ) { // self is reader LOG_STR2("adding reader %s", qPrintable(reader.toString())) ; encryptionKey.clear() ; // but has separate placeholder for key if(aController.model().contentEncryptionModel().PublicKey(reader, encryptionKey)) { listOfEncryptionKeys.append(QString(encryptionKey)) ; } else { LOG_STR2("reader pubkey was not found %s", qPrintable(reader.toString())) ; } } else { LOG_STR("not adding self to readers") ; } } if ( listOfEncryptionKeys.size() > 0 ) { m.insert(KJSonListOfProfileReaders, listOfEncryptionKeys) ; } } // ok, profile picture. if ( ! iProfilePicture.isNull() ) { QByteArray bytes; QBuffer buffer(&bytes); buffer.open(QIODevice::WriteOnly); // PNG might be politically more correct but replacing JPG // below with PNG caused .size() of bytes to jump from 18160 // to 72368 with my test image. This just won't do. iProfilePicture.save(&buffer, "JPG"); // writes pixmap into bytes in JPG format LOG_STR2("Size of saved image %d", bytes.size()) ; m.insert( KJSonProfilePic, bytes.toBase64()) ; } return ( QVariant (m) ) ; // then put the map inside QVariant } bool Profile::setFromQVariant(const QVariantMap& aJSonAsQVariant, const MController& aController, bool aOmitImage ) { if ( aJSonAsQVariant.contains(KJSonFPElement) ) { QString fingerPrintString = QString::fromUtf8(aJSonAsQVariant[KJSonFPElement].toByteArray()) ; if ( fingerPrintString != iFingerPrint.toString() ) { // huhuu, inside is different FP from what the key says?? LOG_STR2("Profile: Fingerprint in json %s" , qPrintable( fingerPrintString)) ; return false ; } } else { LOG_STR("Profile: No fingerprint in json??" ) ; return false ; } iSharedFiles.clear() ; if (aJSonAsQVariant.contains(KJSonSharedFiles) ) { QVariantList listOfSharedPhiles (aJSonAsQVariant[KJSonSharedFiles].toList()) ; QListIterator i(listOfSharedPhiles); while (i.hasNext()) { Hash h ; h.fromString((const unsigned char*)(i.next().toString().toLatin1().constData())) ; if ( h != KNullHash ) { iSharedFiles.append(h); } } } iTrustList.clear() ; if (aJSonAsQVariant.contains(KJSonTrustList) ) { QVariantList trustList (aJSonAsQVariant[KJSonTrustList].toList()) ; QListIterator i(trustList); while (i.hasNext()) { Hash h ; h.fromString((const unsigned char*)(i.next().toString().toLatin1().constData())) ; if ( h != KNullHash ) { iTrustList.append(h); } } } if ( aJSonAsQVariant.contains(KJSonNickNameElement) ) { iNickName = QString::fromUtf8(aJSonAsQVariant[KJSonNickNameElement].toByteArray()) ; } else { iNickName.clear() ; } if ( aJSonAsQVariant.contains(KJSonGreetingText) ) { iGreetingText = QString::fromUtf8(aJSonAsQVariant[KJSonGreetingText].toByteArray()) ; } if ( aJSonAsQVariant.contains(KJSonFirstName) ) { iFirstName= QString::fromUtf8(aJSonAsQVariant[KJSonFirstName].toByteArray()) ; } if ( aJSonAsQVariant.contains(KJSonFamilyName) ) { iFamilyName= QString::fromUtf8(aJSonAsQVariant[KJSonFamilyName].toByteArray()) ; } if ( aJSonAsQVariant.contains(KJSonCityCountry) ) { iCityCountry=QString::fromUtf8(aJSonAsQVariant[KJSonCityCountry].toByteArray()) ; } if ( aJSonAsQVariant.contains(KJSonBTCAddress) ) { iBTCAddress=QString::fromUtf8(aJSonAsQVariant[KJSonBTCAddress].toByteArray()) ; } if ( aJSonAsQVariant.contains(KJSonTimeElement) ) { iTimeOfPublish = aJSonAsQVariant[KJSonTimeElement].toUInt() ; } if ( aJSonAsQVariant.contains(KJSonIsProfilePrivateKey) ) { iIsPrivate = aJSonAsQVariant[KJSonIsProfilePrivateKey].toBool() ; if ( iIsPrivate ) { // add self to profile readers ; later used by encryption // routine.. iProfileReaders.append(iFingerPrint) ; // try to get possible keys of readers.. if ( aJSonAsQVariant.contains(KJSonListOfProfileReaders) ) { QVariantList keysOfProfileReaders ( aJSonAsQVariant[KJSonListOfProfileReaders].toList() ) ; LOG_STR2("Number of profile readers is %d" , keysOfProfileReaders.size()) ; foreach ( QVariant pemBytesOfKeyOfAReader , keysOfProfileReaders ) { QByteArray bytesOfKey ( pemBytesOfKeyOfAReader.toByteArray() ) ; Hash hashOfReader ( aController.model().contentEncryptionModel().hashOfPublicKey(bytesOfKey) ) ; if ( hashOfReader != KNullHash ) { if ( ! ( iProfileReaders.contains ( hashOfReader ) ) ) { // ever possible to have duplicates? sw bug? iProfileReaders.append(hashOfReader) ; } aController.model().contentEncryptionModel().insertOrUpdatePublicKey(bytesOfKey,hashOfReader) ; } else { LOG_STR2("KNullHash as profile reader out of key %s", qPrintable(QString(bytesOfKey))) ; } } } } } else { iIsPrivate = false ; } if ( aJSonAsQVariant.contains(KJSonProfilePic) && aOmitImage == false ) { QByteArray imageBytes ( QByteArray::fromBase64(aJSonAsQVariant[KJSonProfilePic].toByteArray()) ) ; if ( imageBytes.size() > 0 ) { QImage profileImage ; if ( profileImage.loadFromData(imageBytes) ) { imageBytes.clear() ; iProfilePicture = profileImage ; } } } if ( aJSonAsQVariant.contains(KJSonNodeRef ) ) { iNodeOfProfile = Node::fromQVariant (aJSonAsQVariant[KJSonNodeRef].toMap(),false) ; } if ( aJSonAsQVariant.contains(KJSonStateOfTheWorld) ) { iStateOfTheWorld = QString::fromUtf8(aJSonAsQVariant[KJSonStateOfTheWorld].toByteArray()) ; } return true ; } bool Profile::fromJSon(const QByteArray &aJSonBytes, const MController& aController, bool aOmitImage ) { bool ok; QVariantMap result ( JSonWrapper::parse (aJSonBytes, &ok) ); if (!ok) { return false ; } else { ok = setFromQVariant(result,aController,aOmitImage) ; } return ok ; } QString Profile::displayName() const { QString retval ; if ( iIsPrivate ) { retval = iFingerPrint.toString() ; } else { if ( iNickName.length() > 0 ) { retval = iNickName; } else { if ( iFirstName.length() > 0 ) { retval = iFirstName ; if ( iFamilyName.length() > 0 ) { retval = retval + " " + iFamilyName ; } } else { if ( iFamilyName.length() > 0 ) { retval = iFamilyName ; } else { // no nickname, no first name, no family name.. retval = iFingerPrint.toString() ; } } } if ( retval.length() > 40 ) { retval = retval.left(40) ; } } return retval ; } classified-ads-0.13/datamodel/profile.h000066400000000000000000000103061331670245300200570ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti Jarvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_PROFILE_H #define CLASSIFIED_PROFILE_H #include #include "../util/hash.h" // for class Hash #include #include // actually for qvariantmap class MController ; class Node ; /** * @brief Carrier-class for user-profile data * * Instances of this class are stored and retrieved using * @ref ProfileModel. */ class Profile : public QObject { Q_OBJECT public: Profile(const Hash& aHash) ; /**< constructor */ ~Profile() ; /**< destructor */ /** * method for string that is shown to user about the profile. * displays nickname or real name etc. or hash fingerprint * if no other data avail. the string returned by this method * must be no longer than 160 bytes in utf-8. some chinese * glyphs take up to 4 bytes so lets here limit max-len to * 40 characters. * @return string to display to user */ QString displayName() const ; QByteArray asJSon(const MController& aController) const ; /**< returns profile data as JSon stream */ /** * Method for getting profile as JSon / QVariant */ QVariant asQVariant(const MController& aController) const ; /** * reverse of @ref asQVariant() * @param aJSonAsQVariant is qvariant supposedly containing the profile data * @param aController application controller * @param aOmitImage if set to true, possible image will not be loaded from * data ; in cases where we know that we'll need only subset of * information and no image, we can skip this costly operation * @return true if QVariant looked like profile */ bool setFromQVariant(const QVariantMap& aJSonAsQVariant, const MController& aController, bool aOmitImage = false) ; /** * parses json into members * @param aJSonBytes is json text supposedly containing the profile data * @param aController application controller * @param aOmitImage if set to true, possible image will not be loaded from * data ; in cases where we know that we'll need only subset of * information and no image, we can skip this costly operation */ bool fromJSon(const QByteArray &aJSonBytes, const MController& aController, bool aOmitImage = false ) ; const Hash iFingerPrint ; /**< profile encryption key fingerprint */ QString iNickName ; /**< nickname selected by user */ QString iGreetingText ; /**< short hello-world by user */ QString iFirstName ; /**< given name */ QString iFamilyName ; /**< family name */ QString iCityCountry ; /**< location of residence */ QString iBTCAddress ; /**< payment addr */ QString iStateOfTheWorld ; /**< State of the world as explained by user.. */ bool iIsPrivate ; /**< if set to true, profile is published encrypted */ quint32 iTimeOfPublish ; /**< seconds since 1-jan-1970 */ /** * in case of private profile, list of reader encryption * key fingerprints */ QList iProfileReaders ; QImage iProfilePicture ; /**< If V. Lenin is too fine for you */ QList iSharedFiles ; /**< Fingerprints of files shared */ Node* iNodeOfProfile ; /**< physical contact addr of this profile */ QList iTrustList ; /**< Fingerprints of trusted profiles */ } ; #endif classified-ads-0.13/datamodel/profilecomment.cpp000066400000000000000000000153471331670245300220070ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "profilecomment.h" #include "../util/hash.h" #include "../log.h" #include "../util/jsonwrapper.h" #include #include "../mcontroller.h" #include "model.h" #include "contentencryptionmodel.h" static const char *KCommentJSonProfileFPElement = "commentedProfile" ; static const char *KCommentJSonTimeElement = "timeOfPublish" ; static const char *KCommentJSonProfileCommentVersion = "profileVersion" ; static const char *KCommentJSonEncyptionKey = "key" ; static const char *KCommentJSonAttachedFiles = "attachedPhiles" ; static const char *KCommentJSonCommentText = "text" ; static const char *KCommentJSonCommentSubject = "subject" ; static const char *KCommentJSonCommentorNick = "nickName" ; static const char *KCommentJSonReferences = "ref" ; static const char *KCommentJSonReferencedType = "refType" ; static const int KJSONProfileCommentVersionValue = 1 ; /**< if our format should change? */ ProfileComment::ProfileComment(const Hash& aHash) : iFingerPrint(aHash), iIsPrivate(false), // initially all profiles are public ; right? iTimeOfPublish(0) { LOG_STR("ProfileComment::ProfileComment()") ; } ProfileComment::~ProfileComment() { LOG_STR("ProfileComment::~ProfileComment()") ; } QByteArray ProfileComment::asJSon(const MController& aController) const { QByteArray retval ( JSonWrapper::serialize(asQVariant(aController)) ) ; LOG_STR2("profilecomment %s", qPrintable(QString(retval))) ; return retval ; } QVariant ProfileComment::asQVariant(const MController& /* aController */) const { // first have a map ; that is the top-level JSon-object QMap m ; if ( iProfileFingerPrint != KNullHash ) { m.insert(KCommentJSonProfileFPElement , iProfileFingerPrint.toString()) ; } if ( iCommentText.length() > 0 ) { m.insert(KCommentJSonCommentText , iCommentText.toUtf8()) ; } if ( iSubject.length() > 0 ) { m.insert(KCommentJSonCommentSubject , iSubject.toUtf8()) ; } m.insert(KCommentJSonTimeElement , iTimeOfPublish) ; m.insert( KCommentJSonProfileCommentVersion ,KJSONProfileCommentVersionValue) ; if ( iKeyOfCommentor.length() > 0 ) { m.insert(KCommentJSonEncyptionKey , iKeyOfCommentor) ; } if ( iAttachedFiles.size() > 0 ) { QVariantList listOfAttachedPhiles ; foreach( const Hash& phile, iAttachedFiles ) { QVariant v ; v.setValue(phile.toString()) ; listOfAttachedPhiles.append(v) ; } LOG_STR2("Number of attached files in profile comment serialization %d", listOfAttachedPhiles.size()) ; m.insert(KCommentJSonAttachedFiles, listOfAttachedPhiles) ; } else { LOG_STR("No shared files in profile comment serialization") ; } if ( iCommentorNickName.length() > 0 ) { m.insert(KCommentJSonCommentorNick , iCommentorNickName.toUtf8()) ; } if ( iReferences != KNullHash ) { m.insert(KCommentJSonReferences , iReferences.toString()) ; m.insert(KCommentJSonReferencedType, (int)iTypeOfObjectReferenced) ; } return ( QVariant (m) ) ; // then put the map inside QVariant } bool ProfileComment::setFromQVariant(const QVariantMap& aJSonAsQVariant, const MController& aController) { if ( aJSonAsQVariant.contains(KCommentJSonProfileFPElement) ) { iProfileFingerPrint.fromString((const unsigned char *)aJSonAsQVariant[KCommentJSonProfileFPElement].toByteArray().constData()) ; } if (aJSonAsQVariant.contains(KCommentJSonAttachedFiles) ) { QVariantList listOfSharedPhiles (aJSonAsQVariant[KCommentJSonAttachedFiles].toList()) ; QListIterator i(listOfSharedPhiles); iAttachedFiles.clear() ; while (i.hasNext()) { Hash h ; h.fromString((const unsigned char*)(i.next().toString().toLatin1().constData())) ; iAttachedFiles.append(h); QLOG_STR("ProfileComment had attached file " + h.toString()) ; } } if (aJSonAsQVariant.contains(KCommentJSonTimeElement) ) { iTimeOfPublish = aJSonAsQVariant[KCommentJSonTimeElement].toUInt() ; } if (aJSonAsQVariant.contains(KCommentJSonCommentText) ) { iCommentText = QString::fromUtf8(aJSonAsQVariant[KCommentJSonCommentText].toByteArray()) ; } if (aJSonAsQVariant.contains(KCommentJSonCommentSubject) ) { iSubject = QString::fromUtf8(aJSonAsQVariant[KCommentJSonCommentSubject].toByteArray()) ; } if (aJSonAsQVariant.contains(KCommentJSonEncyptionKey) ) { iKeyOfCommentor = aJSonAsQVariant[KCommentJSonEncyptionKey].toByteArray() ; iCommentorHash = aController.model().contentEncryptionModel().hashOfPublicKey(iKeyOfCommentor); } if ( aJSonAsQVariant.contains(KCommentJSonCommentorNick) ) { iCommentorNickName = QString::fromUtf8(aJSonAsQVariant[KCommentJSonCommentorNick].toByteArray()) ; } if ( aJSonAsQVariant.contains(KCommentJSonReferences) && aJSonAsQVariant.contains(KCommentJSonReferencedType) ) { iReferences.fromString((const unsigned char *)aJSonAsQVariant[KCommentJSonReferences].toByteArray().constData()) ; switch ( aJSonAsQVariant[KCommentJSonReferencedType].toInt() ) { case ClassifiedAd: iTypeOfObjectReferenced = ClassifiedAd; break ; case BinaryBlob: iTypeOfObjectReferenced = BinaryBlob; break ; case UserProfile: iTypeOfObjectReferenced = UserProfile; break ; default: iReferences = KNullHash ; } } return true ; } bool ProfileComment::fromJSon(const QByteArray &aJSonBytes, const MController& aController ) { bool ok; QVariantMap result ( JSonWrapper::parse (aJSonBytes, &ok)); if (!ok) { return false ; } else { ok = setFromQVariant(result,aController) ; } return ok ; } classified-ads-0.13/datamodel/profilecomment.h000066400000000000000000000066231331670245300214510ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti Jarvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_PROFILE_COMMENT_H #define CLASSIFIED_PROFILE_COMMENT_H #include #include "../util/hash.h" // for class Hash #include #include // actually for qvariantmap #include "../net/protocol.h" // for ProtocolItemType #include "../mcontroller.h" // for KNullHash /** * @brief Carrier-class for comments of a profile * * Profile-comment data-item behaves much in same way as profile. * These are either public or encrypted to profile readers, * they might follow the same publish/retrieval procedures as * profiles do. */ class ProfileComment { public: /** * Constructor. Fingerprint must be given, this is normal when * fetching a comment from storage. When publishing a new comment, * the fingerprint naturally is not known in advance, in which * case KNullHash may be used and real fingerprint can be then * updated during publish-process */ ProfileComment(const Hash& aHash = KNullHash ) ; /**< constructor */ ~ProfileComment() ; /**< destructor */ QByteArray asJSon(const MController& aController) const ; /**< returns profile comment data as JSon stream */ bool fromJSon(const QByteArray &aJSonBytes, const MController& aController ) ; /**< parses json into members*/ /** * Method for getting profile comment as JSon / QVariant */ QVariant asQVariant(const MController& aController) const ; /** * reverse of @ref asQVariant() * @return true if QVariant looked like profile */ bool setFromQVariant(const QVariantMap& aJSonAsQVariant, const MController& aController) ; // data is also public Hash iFingerPrint ; /**< fingerprint of the comment */ Hash iProfileFingerPrint ; /**< fingerprint of the profile commented */ Hash iCommentorHash ; /**< fingerprint of profile that posted the comment */ QList iAttachedFiles ; QString iCommentText ; QString iSubject ; bool iIsPrivate ; /**< if set to true, profile, and this comment too, is published encrypted */ quint32 iTimeOfPublish ; /**< seconds since 1-jan-1970 */ QByteArray iKeyOfCommentor ; /**< public key of profile that sent the comment */ QString iCommentorNickName ; /**< if commentor is public profile, its nick */ Hash iReferences ; /**< if comment is reply to another comment, this is the hash of the commented comment */ ProtocolItemType iTypeOfObjectReferenced ; /**< if comment reference is CA, or profile, or another comment */ } ; #endif classified-ads-0.13/datamodel/profilecommentlistingmodel.cpp000066400000000000000000000366211331670245300244200ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include "profilecommentlistingmodel.h" #include "../log.h" #include "../mcontroller.h" #include "model.h" #include "profilecommentmodel.h" #include "profilecomment.h" /** * as default content give user some indication that more is * to be expected..later */ static const QString KDefaultProfileCommentContent ( "...") ; ProfileCommentListingModel::ProfileCommentListingModel(Model& aModel, MController& aController ) : iModel(aModel), iController(aController) { } ProfileCommentListingModel::~ProfileCommentListingModel() { LOG_STR("ProfileCommentListingModel::~ProfileCommentListingModel") ; } int ProfileCommentListingModel::rowCount(const QModelIndex& ) const { return iProfileComments.size(); } int ProfileCommentListingModel::columnCount(const QModelIndex& ) const { return 3 ; // what are the columns? Sender, time, subject? } QVariant ProfileCommentListingModel::data(const QModelIndex &index, int role) const { if(!index.isValid()) return QVariant(); if ( role == Qt::UserRole ) { return iProfileComments.at(index.row()).iCommentHash.toQVariant() ; } if ( role == Qt::UserRole+1 ) { return iProfileComments.at(index.row()).iCommentText ; // here return html } if ( role == Qt::UserRole+2 ) { // return sender+date+subject as single string QString headerTextForListings ; if ( iProfileComments.at(index.row()).iSenderName.length() > 0 ) { headerTextForListings = iProfileComments.at(index.row()).iSenderName ; } else { headerTextForListings = iController.displayableNameForProfile(iProfileComments.at(index.row()).iSenderHash ) ; ; } QDateTime d ; d.setTime_t(iProfileComments.at(index.row()).iCommentTimeStamp) ; headerTextForListings = headerTextForListings + " | " + d.toString(Qt::SystemLocaleShortDate) ; headerTextForListings = headerTextForListings + " | " + iProfileComments.at(index.row()).iCommentSubject ; return headerTextForListings ; } if ( role == Qt::UserRole+3 ) { return iProfileComments.at(index.row()).iNrOfAttachedFiles ; } if ( role == Qt::FontRole ) { QFont font; if ( iProfileComments.at(index.row()).iIsRead == false ) { font.setBold(true); font.setItalic(true); } return font; } switch ( index.column() ) { case 0: // peer, either name or hash if(role == Qt::DisplayRole) { if ( iProfileComments.at(index.row()).iSenderName.length() > 0 ) { return iProfileComments.at(index.row()).iSenderName ; } else { return iController.displayableNameForProfile(iProfileComments.at(index.row()).iSenderHash) ; } } else if(role == Qt::DecorationRole) { // here return QIcon of size 26x26 featuring lenin reading pravda? return QVariant(); } else if(role == Qt::ToolTipRole) { return iProfileComments.at(index.row()).iCommentHash.toString() ; } else if ( role == Qt::ForegroundRole ) { if ( ( iController.profileInUse() == iProfileComments.at(index.row()).iCommentedProfileHash ) && iController.isContactInContactList(iProfileComments.at(index.row()).iSenderHash ) ) { return QColor(Qt::blue); // color blue if sender is in contacts } else { return QVariant() ; } } else { return QVariant() ; } break ; case 1: { // message time if(role == Qt::DisplayRole) { QDateTime d ; d.setTime_t(iProfileComments.at(index.row()).iCommentTimeStamp) ; return d.toString(Qt::SystemLocaleShortDate) ; } else { return QVariant(); } } break ; case 2: if(role == Qt::DisplayRole) { return iProfileComments.at(index.row()).iCommentSubject ; } else { return QVariant(); } break ; default: return QVariant(); // for unknown columns return empty } return QVariant(); } void ProfileCommentListingModel::setSearchHash(const Hash& aSearch) { emit beginResetModel (); iSearchHash = aSearch ; // ok .. what next. .. don't search with empty if ( iSearchHash == KNullHash ) { iProfileComments.clear() ; } else { performSearch() ; } emit endResetModel () ; if ( iProfileComments.size() ) { QTimer::singleShot(0, this, SLOT(doUpdateDataOnIdle())); } } void ProfileCommentListingModel::performSearch() { QSqlQuery query(iController.model().dataBaseConnection()); bool ret ; iProfileComments.clear() ; ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5,profile_hash1,profile_hash2,profile_hash3,profile_hash4,profile_hash5,time_of_publish,sender_hash1 from profilecomment where profile_hash1 = :hash1 and profile_hash2 = :hash2 and profile_hash3 = :hash3 and profile_hash4 = :hash4 and profile_hash5 = :hash5 order by time_of_publish" ) ; if ( ret ) { query.bindValue(":hash1", iSearchHash.iHash160bits[0]); // destined to me query.bindValue(":hash2", iSearchHash.iHash160bits[1]); query.bindValue(":hash3", iSearchHash.iHash160bits[2]); query.bindValue(":hash4", iSearchHash.iHash160bits[3]); query.bindValue(":hash5", iSearchHash.iHash160bits[4]); } if ( ret && query.exec() ) { while ( query.next() ) { ProfileCommentListItem item ; item.iCommentText = KDefaultProfileCommentContent ; item.iIsUpdated = false ; item.iCommentHash = Hash(query.value(0).toUInt(), query.value(1).toUInt(), query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt()) ; if ( !query.isNull(5) ) { item.iCommentedProfileHash = Hash(query.value(5).toUInt(), query.value(6).toUInt(), query.value(7).toUInt(), query.value(8).toUInt(), query.value(9).toUInt()) ; } item.iCommentTimeStamp = query.value(10).toUInt() ; if ( !query.isNull(11) && query.value(11).toUInt() == iController.profileInUse().iHash160bits[0] ) { // was sent by me, yes item.iSenderHash = iController.profileInUse() ; } item.iNrOfAttachedFiles = 0 ; item.iIsRead = false ; item.iCommentSubject = "-" ; iProfileComments.append(item) ; QLOG_STR("Appended into model a profile comment with ts = " + QString::number(item.iCommentTimeStamp) + " from " + item.iSenderHash.toString()) ; } } else { QLOG_STR("At profilecommentlisting " + query.lastError().text() + " line " + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } } QVariant ProfileCommentListingModel::headerData ( int section, Qt::Orientation orientation, int role ) const { if (orientation != Qt::Horizontal ) { return QVariant(); } switch ( role ) { case Qt::ToolTipRole: switch ( section ) { default: return QVariant(); break ; } break ; case Qt::DisplayRole: switch ( section ) { case 0: return tr("Sender") ; break; case 1: return tr("Time") ; break ; case 2: return tr("Subject") ; break ; default: return QVariant(); } break ; case Qt::SizeHintRole: switch ( section ) { default: return QVariant(); } break ; default: return QVariant(); break ; } } bool ProfileCommentListingModel::updateSenderAndSubjectOfMsg(ProfileCommentListItem& aItem) { ProfileComment* msg ( iModel.profileCommentModel().profileCommentByFingerPrint(aItem.iCommentHash,false)); if ( msg ) { if ( msg->iCommentorNickName.length() ) { aItem.iSenderName = msg->iCommentorNickName ; } else { aItem.iSenderName = iController.displayableNameForProfile(msg->iCommentorHash) ; } aItem.iSenderHash = msg->iCommentorHash ; aItem.iCommentSubject = msg->iSubject ; aItem.iCommentTimeStamp = msg->iTimeOfPublish ; aItem.iCommentText = msg->iCommentText ; aItem.iNrOfAttachedFiles = msg->iAttachedFiles.count() ; QLOG_STR("Nr of attachments in comment " + aItem.iCommentHash.toString() + " = " + QString::number(aItem.iNrOfAttachedFiles)) ; delete msg ; return true ; } else { return false ; } } void ProfileCommentListingModel::doUpdateDataOnIdle() { int indexUpdated(-1) ; int indexDeleted(-1) ; iModel.lock() ; for ( int i ( 0 ) ; i < iProfileComments.size() ; i++ ) { if ( iProfileComments.at(i).iIsUpdated == false) { indexUpdated = i ; ProfileCommentListItem& item ( iProfileComments[i] ) ; if ( updateSenderAndSubjectOfMsg(item) ) { LOG_STR2("ProfileCommentListingModel::doUpdateDataOnIdle index = %d", indexUpdated) ; item.iIsUpdated = true ; } else { indexUpdated = -1 ; indexDeleted = i ; } break ; // out of loop, e.g. do only one } } iModel.unlock() ; if ( indexUpdated > -1 ) { // so, if we updated something, give UI a clue emit dataChanged(createIndex(indexUpdated,0), createIndex(indexUpdated,3) ) ; // and re-schedule self to check if there is more // messages to handle QTimer::singleShot(0, this, SLOT(doUpdateDataOnIdle())); } if ( indexDeleted > -1 ) { beginRemoveRows(createIndex(indexDeleted,0),0,2) ; iProfileComments.removeAt(indexDeleted) ; endRemoveRows() ; // and re-schedule self to check if there is more // messages to handle QTimer::singleShot(0, this, SLOT(doUpdateDataOnIdle())); } } void ProfileCommentListingModel::setAsRead(const Hash& aComment, bool aIsRead) { for ( int i ( 0 ) ; i < iProfileComments.size() ; i++ ) { if ( iProfileComments.at(i).iCommentHash == aComment ) { ProfileCommentListItem item = iProfileComments.at(i) ; item.iIsRead = aIsRead ; iProfileComments.replace(i, item) ; break ; } } } void ProfileCommentListingModel::newCommentReceived(const Hash& aComment, const Hash& aCommentedProfile) { bool wasAlreadyContained ( false ) ; if ( aCommentedProfile == iSearchHash ) { QLOG_STR("Got new comment for profile hash " + iSearchHash.toString()) ; // was for profile in display iModel.lock() ; for ( int i ( 0 ) ; i < iProfileComments.size() ; i++ ) { if ( iProfileComments.at(i).iCommentHash == aComment ) { wasAlreadyContained = true ; QLOG_STR("but comment was already found..") ; break ; // out of loop, e.g. do only one } } iModel.unlock() ; if ( !wasAlreadyContained ) { beginInsertRows(QModelIndex(),iProfileComments.size(),iProfileComments.size()) ; iModel.lock() ; ProfileCommentListItem item ; item.iIsRead = false ; item.iIsUpdated = false ; item.iCommentTimeStamp = QDateTime::currentDateTimeUtc().toTime_t() ; item.iCommentHash = aComment ; item.iCommentedProfileHash = aCommentedProfile ; item.iCommentSubject = " " ; item.iCommentText = KDefaultProfileCommentContent ; iProfileComments.append(item) ; iModel.unlock() ; endInsertRows() ; QTimer::singleShot(0, this, SLOT(doUpdateDataOnIdle())); QLOG_STR("Comment added to model.") ; } } else { QLOG_STR("Got new comment for profile hash that we don't search " + iSearchHash.toString()) ; } } // note that this method is called from ui/newprofilecommentdialog and // it does the calling so that datamodel is already locked -> no locking again void ProfileCommentListingModel::newCommentReceived(const ProfileComment& aComment) { if ( aComment.iProfileFingerPrint == iSearchHash ) { // was for profile in display bool wasAlreadyContained ( false ) ; for ( int i ( 0 ) ; i < iProfileComments.size() ; i++ ) { if ( iProfileComments.at(i).iCommentHash == aComment.iFingerPrint ) { wasAlreadyContained = true ; break ; // out of loop, e.g. do only one } } if ( !wasAlreadyContained ) { beginInsertRows(QModelIndex(),iProfileComments.size(),iProfileComments.size()) ; ProfileCommentListItem item ; item.iIsRead = true ; item.iIsUpdated = true ; // no need to update, we already had it all item.iSenderName = aComment.iCommentorNickName ; item.iCommentedProfileHash = aComment.iProfileFingerPrint ; item.iSenderHash = aComment.iCommentorHash ; item.iCommentSubject = aComment.iSubject ; item.iCommentTimeStamp = aComment.iTimeOfPublish ; item.iCommentHash = aComment.iFingerPrint ; item.iCommentText = aComment.iCommentText ; item.iNrOfAttachedFiles = aComment.iAttachedFiles.count() ; iProfileComments.append(item) ; QLOG_STR("ProfileCommentListingModel::newMsgReceived iSenderName = " + item.iSenderName) ; QLOG_STR("ProfileCommentListingModel::newMsgReceived iCommentedProfileHash = " + item.iCommentedProfileHash.toString()) ; QLOG_STR("ProfileCommentListingModel::newMsgReceived iSenderHash = " + item.iSenderHash.toString()) ; endInsertRows() ; } } } // this gets called when we're listing the "own profile" comments and // the selection of the profile changes. void ProfileCommentListingModel::profileSelected(const Hash& aProfileHash) { QLOG_STR("ProfileCommentListingModel::profileSelected " + aProfileHash.toString()) ; setSearchHash(aProfileHash) ; } classified-ads-0.13/datamodel/profilecommentlistingmodel.h000066400000000000000000000114171331670245300240610ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PROFILECOMMENTLISTINGMODEL_H #define PROFILECOMMENTLISTINGMODEL_H #include #include "../util/hash.h" #include "../mcontroller.h" #include class Model ; class ProfileComment ; /** * @brief Model-class for performing search on comments about a profile. * This is supposed to act as an underlying data-container for * an user-interface view (QListView etc.) */ class ProfileCommentListingModel: public QAbstractTableModel { Q_OBJECT public: // types: /** * Structure that holds profile data inside model .. could be as well * the actual comment but this has some lazy-loading stuff in it */ struct ProfileCommentListItem { Hash iCommentHash ; /**< from ProfileComment::iFingerPrint */ Hash iCommentedProfileHash ; Hash iSenderHash ; quint32 iCommentTimeStamp ; QString iCommentSubject ; QString iSenderName ; bool iIsRead ; QString iCommentText ; /**< comments are html so this text is ..*/ bool iIsUpdated ; /**< updated via lazy load */ unsigned iNrOfAttachedFiles ; } ; public: ProfileCommentListingModel(Model& aModel,MController& aController) ; ~ProfileCommentListingModel() ; /** * Calling this method will populate the model with * messages that are either sent by profile given in * parameter, or comment a given profile. * @param aSearch profile fingerprint whose messages are * the item of interest * @return no thing, always succeeds */ void setSearchHash(const Hash& aSearch) ; /** * re-implemented from QAbstractTableModel * @return number of rows in list */ virtual int rowCount(const QModelIndex & parent = QModelIndex()) const ; /** * re-implemented from QAbstractTableModel * @return number of columns in view */ virtual int columnCount(const QModelIndex & parent = QModelIndex()) const ; /** * re-implemented from QAbstractListModel * @return data to display in list. If Qt::UserRole+1 is used to * obtain data, html of the comment is returned, Qt::UserRole * returns comment hash as QVariant. UserRole+2 returns * header data as single string, intended for list displays. * UserRole+3 returns number of attached files as unsigned. */ virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const ; virtual QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const ; void setAsRead(const Hash& aComment, bool aIsRead) ; /** * notification method called when new comment * is inserted into database */ void newCommentReceived(const Hash& aComment, const Hash& aCommentedProfile) ; /** * notification method called when new comment * is inserted into database , this variant is called * from UI */ void newCommentReceived(const ProfileComment& aComment) ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; public slots: /** * method called via QTimer::singleShot() that is used for * filling missing parts (message subjects etc.) from data that * model is listing */ void doUpdateDataOnIdle() ; /** * called from controller when user profile is selected */ void profileSelected(const Hash&) ; private:// methods void performSearch() ; /** * updates profile comment subject etc. from dabase. * @return false if update was not success indicating that * comment should be removed from list */ bool updateSenderAndSubjectOfMsg(ProfileCommentListItem& aItem) ; private: // data Model& iModel ; MController& iController ; QList iProfileComments ; Hash iSearchHash ; } ; #endif classified-ads-0.13/datamodel/profilecommentmodel.cpp000066400000000000000000000712241331670245300230240ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "profilecommentmodel.h" #include "profilemodel.h" // we'll need that also #include "profile.h" // profilemodel deals with profile so we need to include that #include "../log.h" #include "../util/hash.h" #include "model.h" #include #include #include "profilecomment.h" #include "contentencryptionmodel.h" #include "const.h" #include "searchmodel.h" ProfileCommentModel::ProfileCommentModel(MController *aController, MModelProtocolInterface &aModel) : ModelBase("profilecomment",KMaxRowsInTableProfileComment,aController,aModel) { LOG_STR("ProfileCommentModel::ProfileCommentModel()") ; connect(this, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; } ProfileCommentModel::~ProfileCommentModel() { LOG_STR("ProfileCommentModel::~ProfileCommentModel()") ; iController = NULL ; // not owned, just set null } bool ProfileCommentModel::publishProfileComment(ProfileComment& aProfileComment) { LOG_STR("ProfileCommentModel::publishProfileComment()") ; bool retval = false ; QByteArray commentJSon ( aProfileComment.asJSon(*iController) ) ; if ( aProfileComment.iIsPrivate ) { QByteArray encryptedJson ; // dig out the profile that is commented, readers of that profile // will be the recipients of this comment: Profile* profileCommented ( iController->model().profileModel().profileByFingerPrint(aProfileComment.iProfileFingerPrint,true /* emit */,true/* no image */)); if ( profileCommented == NULL ) { emit error(MController::ContentEncryptionError, tr("Profile related to comment not found from database")) ; return false ; } QList profileCommentReaders = profileCommented->iProfileReaders ; if ( !profileCommentReaders.contains(aProfileComment.iCommentorHash ) ) { const Hash& commentorHash ( aProfileComment.iCommentorHash ) ; profileCommentReaders.append(commentorHash) ; } delete profileCommented ; profileCommented = NULL ; if ( iController->model().contentEncryptionModel().encrypt(profileCommentReaders, commentJSon, encryptedJson ) ) { commentJSon.clear() ; commentJSon.append(encryptedJson) ; encryptedJson.clear() ; // so ; now ; the profile json is encrypted -> proceed by making signature // of that } else { return false ; // encryption failed ? } } if ( commentJSon.length() > 0 ) { Hash messageFingerPrint ; QByteArray digitalSignature ; messageFingerPrint.calculate(commentJSon) ; if ( iController->model().contentEncryptionModel().sign(aProfileComment.iCommentorHash, commentJSon, digitalSignature) == 0 ) { QSqlQuery query(iModel.dataBaseConnection()); retval = query.prepare ("insert into profilecomment (hash1,hash2,hash3,hash4,hash5,profile_hash1,profile_hash2,profile_hash3,profile_hash4,profile_hash5,sender_hash1,time_last_reference,signature,time_of_publish,commentdata,recvd_from,flags,display_name) values (:hash1,:hash2,:hash3,:hash4,:hash5,:profile_hash1,:profile_hash2,:profile_hash3,:profile_hash4,:profile_hash5,:sender_hash1,:time_last_reference,:signature,:time_of_publish,:commentdata,:recvd_from,:flags,:display_name)" ) ; if ( retval ) { quint32 flags ( 0 ) ; query.bindValue(":hash1", messageFingerPrint.iHash160bits[0]); query.bindValue(":hash2", messageFingerPrint.iHash160bits[1]); query.bindValue(":hash3", messageFingerPrint.iHash160bits[2]); query.bindValue(":hash4", messageFingerPrint.iHash160bits[3]); query.bindValue(":hash5", messageFingerPrint.iHash160bits[4]); query.bindValue(":commentdata", commentJSon); QLOG_STR("Length of profile data at insert = " + commentJSon.size() ); query.bindValue(":signature", digitalSignature); if ( aProfileComment.iIsPrivate ) { flags = flags | 1 ; } query.bindValue(":profile_hash1", aProfileComment.iProfileFingerPrint.iHash160bits[0]); query.bindValue(":profile_hash2", aProfileComment.iProfileFingerPrint.iHash160bits[1]); query.bindValue(":profile_hash3", aProfileComment.iProfileFingerPrint.iHash160bits[2]); query.bindValue(":profile_hash4", aProfileComment.iProfileFingerPrint.iHash160bits[3]); query.bindValue(":profile_hash5", aProfileComment.iProfileFingerPrint.iHash160bits[4]); query.bindValue(":sender_hash1", aProfileComment.iCommentorHash.iHash160bits[0]); query.bindValue(":time_last_reference", QDateTime::currentDateTimeUtc().toTime_t()); query.bindValue(":time_of_publish", aProfileComment.iTimeOfPublish); query.bindValue(":recvd_from", iController->getNode().nodeFingerPrint().iHash160bits[4]); query.bindValue(":flags", flags); if ( aProfileComment.iIsPrivate ) { query.bindValue(":display_name",QVariant(QVariant::String)) ; } else { if ( aProfileComment.iSubject.length() > 0 ) { query.bindValue(":display_name", aProfileComment.iSubject.left(40)); } else { query.bindValue(":display_name", aProfileComment.iCommentText.left(40)); } } } retval = query.exec() ; if ( !retval ) { LOG_STR2("Error while comment insert %s", qPrintable(query.lastError().text())) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { aProfileComment.iFingerPrint = messageFingerPrint ; // here user is publishing as "brand new" so set bangpath to 0 QList emptyBangPath ; // note how comments get published to address of the profile, // not to addr of the content iController->model().addItemToBePublished(UserProfileComment, messageFingerPrint, emptyBangPath, aProfileComment.iProfileFingerPrint) ; // and send notify to have possible ui-datamodels to be updated. // normally there is 1 or 2 emit contentReceived(aProfileComment.iFingerPrint, aProfileComment.iProfileFingerPrint, UserProfileComment) ; if ( aProfileComment.iIsPrivate == false ) { // index it too iModel.searchModel()->indexProfileComment(aProfileComment) ; } } } } return retval ; } ProfileComment* ProfileCommentModel::profileCommentByFingerPrint(const Hash& aFingerPrint, bool aEmitOnEncryptionError) { LOG_STR("ProfileCommentModel::profileCommentByFingerPrint()") ; ProfileComment* retval = NULL ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("select commentdata,signature,flags from profilecomment where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( ret ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) && !query.isNull(1) && !query.isNull(2) ) { QByteArray commentData ( query.value(0).toByteArray()) ; QByteArray signature ( query.value(1).toByteArray()) ; quint32 flags ( query.value(2).toUInt() ) ; bool isPrivate ( flags & 1 ) ; // if bit 1 is on, it is encrypted // for verification we need the key. .. we may have the key // if we've been dealing with the sender before, or not. // // sender information is only inside content so if that is // encrypted, we need to de-crypt first, so lets go: if ( isPrivate ) { QByteArray plainTextProfileCommentData ; if ( iController->model().contentEncryptionModel().decrypt(commentData, plainTextProfileCommentData, aEmitOnEncryptionError) ) { LOG_STR2("profcomment: %s", qPrintable(QString(plainTextProfileCommentData))); commentData.clear() ; commentData = plainTextProfileCommentData ; } else { return NULL ; // no need to go further } } retval = new ProfileComment(aFingerPrint) ; if ( retval->fromJSon(commentData,*iController) == false ) { delete retval ; return NULL ; } // ok, now we have the content, also the sender ; so lets try verifying // it is possible that we don't have the key yet. QByteArray dummy ; if (! iController->model().contentEncryptionModel().PublicKey (retval->iCommentorHash, dummy) ) { // didn't have key iController->model().contentEncryptionModel().insertOrUpdatePublicKey (retval->iKeyOfCommentor, retval->iCommentorHash, retval->iCommentorNickName.length() > 0 ? &(retval->iCommentorNickName) : NULL ) ; } dummy.clear() ; // ok, now we supposedly have key in the table, lets verify the bytes if ( iController->model().contentEncryptionModel().verify(retval->iCommentorHash, commentData, signature) == false ) { // bad signature delete retval ; retval = NULL ; } else { // this method was called from UI so lets update the reference // time too setTimeLastReference(retval->iFingerPrint, QDateTime::currentDateTimeUtc().toTime_t()) ; } } } return retval ; } bool ProfileCommentModel::commentDataByFingerPrint(const Hash& aFingerPrint, QByteArray& aResultingProfileCommentData, QByteArray& aResultingSignature, Hash* aResultingProfileFingerPrint, quint32* aFlags, quint32* aTimeOfPublish) { LOG_STR("ProfileCommentModel::commentDataByFingerPrint()") ; bool retval = false ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("select commentdata,signature,flags,time_of_publish,profile_hash1,profile_hash2,profile_hash3,profile_hash4,profile_hash5 from profilecomment where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( ret ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) && !query.isNull(1) ) { aResultingProfileCommentData.clear() ; aResultingSignature.clear() ; aResultingProfileCommentData.append ( query.value(0).toByteArray()) ; aResultingSignature.append ( query.value(1).toByteArray()) ; if ( !query.isNull(2) ) { *aFlags = query.value(2).toUInt() ; } else { *aFlags = 0 ; } if ( !query.isNull(3) && aTimeOfPublish != NULL ) { *aTimeOfPublish = query.value(3).toUInt() ; } if ( aResultingProfileFingerPrint ) { aResultingProfileFingerPrint->iHash160bits[0] = query.value(4).toUInt() ; aResultingProfileFingerPrint->iHash160bits[1] = query.value(5).toUInt() ; aResultingProfileFingerPrint->iHash160bits[2] = query.value(6).toUInt() ; aResultingProfileFingerPrint->iHash160bits[3] = query.value(7).toUInt() ; aResultingProfileFingerPrint->iHash160bits[4] = query.value(8).toUInt() ; } retval = true ; } } return retval ; } bool ProfileCommentModel::sentProfileCommentReceived(const Hash& aFingerPrint, const Hash& aCommentedProfileFP, const QByteArray& aContent, const QByteArray& aSignature, const unsigned char aFlags, const quint32 aTimeStamp, const Hash& aFromNode ) { const QList dummy ; return doHandlepublishedOrSentProfileComment(aFingerPrint, aCommentedProfileFP, aContent, aSignature, dummy, aFlags, aTimeStamp, false, aFromNode) ; } bool ProfileCommentModel::publishedProfileCommentReceived(const Hash& aFingerPrint, const Hash& aCommentedProfileFP, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const unsigned char aFlags, const quint32 aTimeStamp, const Hash& aFromNode ) { return doHandlepublishedOrSentProfileComment(aFingerPrint, aCommentedProfileFP, aContent, aSignature, aBangPath, aFlags, aTimeStamp, true, aFromNode ) ; } bool ProfileCommentModel::doHandlepublishedOrSentProfileComment(const Hash& aFingerPrint, const Hash& aCommentedProfileFP, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const unsigned char aFlags, const quint32 aTimeStamp, bool aWasPublish, const Hash& aFromNode ) { bool retval = false ; QString displayNameForComment ; quint32 senderHashLowBits (0); // ok, lets see .. if we have this particular comment already in storage QSqlQuery existenceQuery (iModel.dataBaseConnection()); retval = existenceQuery.prepare("select count(hash1) from profilecomment where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5"); if ( retval ) { existenceQuery.bindValue(":hash1", aFingerPrint.iHash160bits[0]); existenceQuery.bindValue(":hash2", aFingerPrint.iHash160bits[1]); existenceQuery.bindValue(":hash3", aFingerPrint.iHash160bits[2]); existenceQuery.bindValue(":hash4", aFingerPrint.iHash160bits[3]); existenceQuery.bindValue(":hash5", aFingerPrint.iHash160bits[4]); retval = existenceQuery.exec() ; if ( retval ) { if ( existenceQuery.next() && !existenceQuery.isNull(0) ) { int countOfComments = existenceQuery.value(0).toInt() ; if ( countOfComments > 0 ) { // we already had the comment, so lets not continue return true ; // return with success } } } else { QLOG_STR(existenceQuery.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, existenceQuery.lastError().text()) ; return false ; } } // ok, lets see .. should we verify first. // verify, if we can, e.g. the profile is public. ProfileComment c (aFingerPrint) ; if ( ( aFlags & 0x01 ) == 0 ) { // no encryption, lets go if ( c.fromJSon(aContent,*iController) == false ) { LOG_STR("Profile comment did not parse, returning false from datamodel..") ; return false ; // didn't parse } // it is possible that we don't have the key yet. QByteArray dummy ; if (! iController->model().contentEncryptionModel().PublicKey (c.iCommentorHash, dummy) ) { // didn't have key // lets see that the key parses.. EVP_PKEY* key = NULL ; if ( ( key = iController->model().contentEncryptionModel().PublicKeyFromPem(c.iKeyOfCommentor) ) == NULL ) { // did not parse LOG_STR("Encryption key from profile comment did not parse") ; return false ; } else { EVP_PKEY_free(key) ; key = NULL ; } iController->model().contentEncryptionModel().insertOrUpdatePublicKey (c.iKeyOfCommentor, c.iCommentorHash, c.iCommentorNickName.length() > 0 ? &(c.iCommentorNickName) : NULL ) ; } // ok, now we're supposed to have the key in storage, so lets try verifying if ( iController->model().contentEncryptionModel().verify(c.iKeyOfCommentor, aContent, aSignature) == false ) { // soromnoo.. LOG_STR("Profile comment signature verify failed") ; return false ; } else { displayNameForComment = c.iSubject.left(40) ; senderHashLowBits = c.iCommentorHash.iHash160bits[0] ; } } // also content of the comment should match the content: Hash checkFingerPrint ; checkFingerPrint.calculate(aContent) ; if ( checkFingerPrint != aFingerPrint ) { retval = false ; } else { // content had hash that was claimed to have.. QSqlQuery query(iModel.dataBaseConnection()); retval = query.prepare ("insert into profilecomment (hash1,hash2,hash3,hash4,hash5,profile_hash1,profile_hash2,profile_hash3,profile_hash4,profile_hash5,sender_hash1,time_last_reference,signature,time_of_publish,commentdata,recvd_from,flags,display_name) values (:hash1,:hash2,:hash3,:hash4,:hash5,:profile_hash1,:profile_hash2,:profile_hash3,:profile_hash4,:profile_hash5,:sender_hash1,:time_last_reference,:signature,:time_of_publish,:commentdata,:recvd_from,:flags,:display_name)" ) ; if ( retval ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); query.bindValue(":commentdata", aContent); query.bindValue(":signature", aSignature); query.bindValue(":profile_hash1", aCommentedProfileFP.iHash160bits[0]); query.bindValue(":profile_hash2", aCommentedProfileFP.iHash160bits[1]); query.bindValue(":profile_hash3", aCommentedProfileFP.iHash160bits[2]); query.bindValue(":profile_hash4", aCommentedProfileFP.iHash160bits[3]); query.bindValue(":profile_hash5", aCommentedProfileFP.iHash160bits[4]); if ( senderHashLowBits ) { query.bindValue(":sender_hash1", senderHashLowBits); } else { query.bindValue(":sender_hash1", QVariant(QVariant::String)); } query.bindValue(":time_last_reference", QDateTime::currentDateTimeUtc().toTime_t()); query.bindValue(":time_of_publish", aTimeStamp); query.bindValue(":recvd_from", aFromNode.iHash160bits[4]); //NULL query.bindValue(":flags", aFlags); if ( displayNameForComment.length() == 0 ) { query.bindValue(":display_name", QVariant(QVariant::String)); //NULL } else { query.bindValue(":display_name", displayNameForComment); } } retval = query.exec() ; if ( !retval ) { LOG_STR2("Error while profile comment insert %s", qPrintable(query.lastError().text())) ; emit error(MController::DbTransactionError, query.lastError().text()) ; // .. so. we failed to insert, that was our fault. it still might be // better to disconnect the peer by returning false, so she will not // waste her time sending more content to HD with 0 bytes left? retval = false ; } else { emit contentReceived(aFingerPrint, aCommentedProfileFP, UserProfileComment) ; QLOG_STR("Emitting contentReceived for profile " + aCommentedProfileFP.toString()) ; if ( ( aFlags & 0x01 ) == 0 ) { // index it too, as it is public comment c.iFingerPrint = aFingerPrint ; iModel.searchModel()->indexProfileComment(c) ; } } } if ( aWasPublish && retval ) { iController->model().addItemToBePublished(UserProfileComment, aFingerPrint, aBangPath) ; } LOG_STR2("ProfileCommentModel::published/sentProfileCommentReceived out success = %d", (int)retval) ; return retval ; } void ProfileCommentModel::fillBucket(QList& aSendQueue, const Hash& aStartOfBucket, const Hash& aEndOfBucket, quint32 aLastMutualConnectTime, const Hash& aForNode ) { QSqlQuery query(iModel.dataBaseConnection()); bool ret ; // in bucket filling we actually have 2 cases .. we may be bucket determined by the // comment content fingerprint or in the bucket determined by the commented // profile fingerprint. here fetch comments based on profile fingerprint ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5,time_of_publish from profilecomment where profile_hash1 >= :start and profile_hash1 <= :end and time_of_publish > :last_connect_time and time_of_publish < :curr_time and ( recvd_from != :lowbits_of_requester or recvd_from is null ) order by time_of_publish desc limit 1000" ) ; if ( ret ) { if ( aStartOfBucket == aEndOfBucket ) { // this was "small network situation" e.g. start and end // are the same ; in practice it means that send all data query.bindValue(":start", 0x0); query.bindValue(":end", 0xFFFFFFFF); } else { // normal situation query.bindValue(":start", aStartOfBucket.iHash160bits[0]); query.bindValue(":end", aEndOfBucket.iHash160bits[0]); } query.bindValue(":last_connect_time", aLastMutualConnectTime); query.bindValue(":lowbits_of_requester", aForNode.iHash160bits[4]); // allow 5 minutes of clock skew between nodes query.bindValue(":curr_time", QDateTime::currentDateTimeUtc().addSecs(5*60).toTime_t()); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { Hash hashFoundFromDb ( query.value(0).toUInt(), query.value(1).toUInt(), query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt()) ; SendQueueItem commentToSend ; commentToSend.iHash = hashFoundFromDb ; commentToSend.iItemType = UserProfileComment ; time_t timePublish(query.value(5).toUInt()) ; time_t timeMutual(aLastMutualConnectTime); aSendQueue.append(commentToSend) ; #ifndef WIN32 char formatted_mutual [100] = {0} ; char formatted_found [100] = {0} ; ctime_r(&timePublish,&formatted_found[0] ) ; ctime_r(&timeMutual,&formatted_mutual[0] ) ; LOG_STR2("ProfileComment bucket mutual %s", formatted_mutual) ; LOG_STR2("ProfileComment bucket found %s", formatted_found) ; #endif } } } QList ProfileCommentModel::commentsForProfile(const Hash& aProfileHash, const quint32 aSinceTimeStamp) { QList retval ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; // (like almost all other content) ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5 from profilecomment where profile_hash1 = :h1 and profile_hash2 = :h2 and profile_hash3 = :h3 and profile_hash4 = :h4 and profile_hash5 = :h5 and time_of_publish > :time_of_publish" ) ; if ( ret ) { query.bindValue(":h1", aProfileHash.iHash160bits[0]); query.bindValue(":h2", aProfileHash.iHash160bits[1]); query.bindValue(":h3", aProfileHash.iHash160bits[2]); query.bindValue(":h4", aProfileHash.iHash160bits[3]); query.bindValue(":h5", aProfileHash.iHash160bits[4]); query.bindValue(":time_of_publish", aSinceTimeStamp); ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { Hash hashFoundFromDb ( query.value(0).toUInt(), query.value(1).toUInt(), query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt()) ; retval.append(hashFoundFromDb) ; } } } else { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } QLOG_STR("Returning list of profile comments len = " + QString::number(retval.size()) + " for profile " + aProfileHash.toString() + " since timestamp " + QString::number(aSinceTimeStamp)) ; return retval ; } void ProfileCommentModel::reIndexAllCommentsIntoFTS() { QList articles ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; query.exec("delete from profilecomment_search") ; ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5 from profilecomment where flags & 1 = 0") ; ret = query.exec() ; if ( !ret ) { emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { Hash hashFoundFromDb ( query.value(0).toUInt(), query.value(1).toUInt(), query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt()) ; articles.append(hashFoundFromDb) ; } } foreach ( const Hash& a, articles ) { ProfileComment *c ( profileCommentByFingerPrint(a) ) ; if ( c ) { iModel.searchModel()->indexProfileComment(*c) ; delete c ; } } } classified-ads-0.13/datamodel/profilecommentmodel.h000066400000000000000000000225301331670245300224650ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_PROFILECOMMENTMODEL_H #define CLASSIFIED_PROFILECOMMENTMODEL_H #include #include "../mcontroller.h" // because enum from there is needed #include "../net/connection.h" #include "datamodelbase.h" class Hash ; class MModelProtocolInterface ; class ProfileComment ; /** * @brief This is is part of datamodel for storing comments of user profiles * * This behaves largerly in same manner as profilemodel, data-carrier * is different */ class ProfileCommentModel : public ModelBase { Q_OBJECT public: ProfileCommentModel(MController *aMController, MModelProtocolInterface &aModel) ; ~ProfileCommentModel() ; /** * sends profile comment to selected nodes in network for others * to retrieve. As a side-effect will set iFingerPrint of the * comment. * * @param aProfileComment is the profile to publish * @return true if things went all right */ bool publishProfileComment(ProfileComment& aProfileComment) ; /** * gets a comment or null. whoever calls this method is * obliged to delete the returned comments. * @param aFingerPrint profile serial number * @param aEmitOnEncryptionError if set to false, will return NULL * when no suitable encryption key is found and will not * emit error message that would be catched by UI and * shown to user * @return profile or NULL */ ProfileComment* profileCommentByFingerPrint(const Hash& aFingerPrint, bool aEmitOnEncryptionError=true) ; /** * Gets a comment. Because profile comment is signed .. and that means that * a particular byte-stream (containing actually a serialized json * object) gets signed those bytes can't be altered or signature will * not verify. This methods gets the actual signed bytestream * that has been checked against a public key. * * Note that this method does not check the signature any more, * idea is that we don't store into db profiles that fail the signature * check so this method only gets the profile, does not set it. * * @param aFingerPrint profile comment serial number * @param aResultingProfileCommentData will contain comment data * @param aResultingSignature will contain comment signature * @param aResultingProfileFingerPrint is output variable, that * will have its value set to containt fingerprint of the * profile that the comment is commenting. * @param aFlags will be set to flags values ; bit 1 on means * that content is encrypted. * @param aTimeOfPublish is also output variable, if non-NULL, will * get its value set to time of publish of the comment * @return true if profile was found */ bool commentDataByFingerPrint(const Hash& aFingerPrint, QByteArray& aResultingProfileCommentData, QByteArray& aResultingSignature, Hash* aResultingProfileFingerPrint, quint32* aFlags, quint32* aTimeOfPublish = NULL ) ; /** * called by protocol parser when a profile comment is received. * note the absence of signing key. if the profile commented is public, the * key is found inside the comment. if the profile commented is private, * the comment behaves like a private message, the recipient needs to * first open the encryption before she can verify that the comment * is from certain operator * @param aFingerPrint is the content @ref Hash received from protocol header * @param aCommentedProfileFP is fingerprint hash of the profile that the * comment concerns * @param aContent is actual profile data * @param aSignature is digital signature of the aContent * @param aBangPath is list of last nodes where this content has been, idea is to * prevent re-sending content to somewhere where it has already * been * @param aFlag possible flags telling about encyption and compression * @param aTimeStamp timestamp of profile (if encrypted, it must be carried outside..) * @return true on success */ bool publishedProfileCommentReceived(const Hash& aFingerPrint, const Hash& aCommentedProfileFP, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const unsigned char aFlags, const quint32 aTimeStamp, const Hash& aFromNode) ; /** * called by protocol parser when a comment is received by "send" protocol type * @param aFingerPrint is the profile @ref Hash received from protocol header * @param aCommentedProfileFP is fingerprint hash of the profile that the * comment concerns * @param aContent is actual comment data * @param aSignature is digital signature of the aContent * @param aProfileCommentPublicKey is the key that was used to sign the profile. * that is transferred outside profile just because the recipient * might not have the key beforehand ; if she does, the existing * key will be used in verifying process. * @param aFlag possible flags telling about encyption and compression * @param aTimeStamp timestamp of profile (if encrypted, it must be carried outside..) * @return true on success */ bool sentProfileCommentReceived(const Hash& aFingerPrint, const Hash& aCommentedProfileFP, const QByteArray& aContent, const QByteArray& aSignature, const unsigned char aFlags, const quint32 aTimeStamp, const Hash& fromNode ) ; /** * Method for filling connected peers send queue with items * that we have and that belong to said peers bucket. * * @param aSendQueue is send-queue of the connection that * serves particular node * @param aStartOfBucket is hash where bucket of that peer * starts. In practice it is the hash * of the node itself. * @param aEndOfBucket is hash where bucket of that peer ends. * That in turn depends on network size, * or number of active nodes in the network. * See method @ref NodeModel::bucketEndHash * for details. * @param aLastMutualConnectTime time when node was last in * contact. In practice we'll fill the * bucket items published after this time. */ void fillBucket(QList& aSendQueue, const Hash& aStartOfBucket, const Hash& aEndOfBucket, quint32 aLastMutualConnectTime, const Hash& aForNode ); /** * method for producing list of profile comments that comment * aProfileHash and that are more recent than aSinceTimeStamp */ QList commentsForProfile(const Hash& aProfileHash, const quint32 aSinceTimeStamp) ; void reIndexAllCommentsIntoFTS() ; private: // methods /** * Workhorse of methods @ref publishedProfileCommentReceived and @ref sentProfileCommentReceived * @return true on success */ bool doHandlepublishedOrSentProfileComment(const Hash& aFingerPrint, const Hash& aCommentedProfileFP, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const unsigned char aFlags, const quint32 aTimeStamp, bool aWasPublish, const Hash& aFromNode ) ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; /** emitted when new comment is received */ void contentReceived(const Hash& aHashOfContent, const Hash& aHashOfProfileCommented, const ProtocolItemType aTypeOfReceivdContent) ; } ; #endif classified-ads-0.13/datamodel/profilemodel.cpp000066400000000000000000000764351331670245300214520ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "profilemodel.h" #include "../log.h" #include "../util/hash.h" #include "model.h" #include #include #include "profile.h" #include "contentencryptionmodel.h" #include "../util/jsonwrapper.h" #include "const.h" #include "searchmodel.h" ProfileModel::ProfileModel(MController *aController, MModelProtocolInterface &aModel) : ModelBase("profile",KMaxRowsInTableProfile,aController,aModel) { LOG_STR("ProfileModel::ProfileModel()") ; connect(this, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; } ProfileModel::~ProfileModel() { LOG_STR("ProfileModel::~ProfileModel()") ; iController = NULL ; // not owned, just set null } bool ProfileModel::publishProfile(const Profile& aProfile) { LOG_STR("ProfileModel::publishProfile()") ; bool retval = false ; quint32 timeOfPublish(aProfile.iTimeOfPublish) ; QByteArray profileJSon ( aProfile.asJSon(*iController) ) ; if ( aProfile.iIsPrivate ) { QByteArray encryptedJson ; if ( iController->model().contentEncryptionModel().encrypt(aProfile.iProfileReaders, profileJSon, encryptedJson ) ) { profileJSon.clear() ; profileJSon.append(encryptedJson) ; encryptedJson.clear() ; // so ; now ; the profile json is encrypted -> proceed by making signature // of that } else { return false ; // encryption failed ? } } if ( profileJSon.length() > 0 ) { QByteArray digitalSignature ; if ( iController->model().contentEncryptionModel().sign(aProfile.iFingerPrint, profileJSon, digitalSignature) == 0 ) { QSqlQuery query(iModel.dataBaseConnection()); retval = query.prepare ("update profile set profiledata = :profiledata,signature=:signature,display_name=:display_name,is_private=:is_private,time_of_publish=:time_of_publish where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( retval ) { query.bindValue(":hash1", aProfile.iFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aProfile.iFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aProfile.iFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aProfile.iFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aProfile.iFingerPrint.iHash160bits[4]); query.bindValue(":profiledata", profileJSon); query.bindValue(":signature", digitalSignature); query.bindValue(":is_private", aProfile.iIsPrivate); query.bindValue(":display_name", aProfile.displayName().toUtf8()); query.bindValue(":time_of_publish", timeOfPublish); } retval = query.exec() ; if ( !retval ) { LOG_STR2("Error while profile update %s", qPrintable(query.lastError().text())) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { // here user is publishing as "brand new" so set bangpath to 0 QList emptyBangPath ; iController->model().addItemToBePublished(UserProfile, aProfile.iFingerPrint, emptyBangPath) ; if ( aProfile.iIsPrivate == false ) { iModel.searchModel()->indexProfile(aProfile) ; } } } } return retval ; } Profile* ProfileModel::profileByFingerPrint(const Hash& aFingerPrint, bool aEmitErrorOnEncryptionErrors, bool aOmitImage ) { LOG_STR("ProfileModel::profileByFingerPrint()") ; Profile* retval = NULL ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("select profiledata,signature,is_private from profile where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( ret ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) && !query.isNull(1) ) { QByteArray profileData ( query.value(0).toByteArray()) ; QByteArray signature ( query.value(1).toByteArray()) ; bool isPrivate ( false ) ; isPrivate = !query.isNull(2) && query.value(2).toBool() ; if ( iController->model().contentEncryptionModel().verify(aFingerPrint, profileData, signature) == true ) { // good signature retval = new Profile(aFingerPrint) ; if ( isPrivate ) { QByteArray plainTextProfileData ; if ( iController->model().contentEncryptionModel().decrypt(profileData, plainTextProfileData, aEmitErrorOnEncryptionErrors ) ) { LOG_STR2("prof: %s", qPrintable(QString(plainTextProfileData))); retval->fromJSon(plainTextProfileData,*iController,aOmitImage) ; } else { delete retval ; retval = NULL ; } } else { // was then public and profileData is in plainText: LOG_STR2("prof: ->%s<-", qPrintable(QString(profileData))); retval->fromJSon(profileData,*iController,aOmitImage) ; } } } } return retval ; } bool ProfileModel::profileDataByFingerPrint(const Hash& aFingerPrint, QByteArray& aResultingProfileData, QByteArray& aResultingSignature, bool* aIsProfilePrivate, quint32* aTimeOfPublish, QByteArray* aResultingPublicKey) { LOG_STR("ProfileModel::profileDataByFingerPrint()") ; bool retval = false ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("select profiledata,signature,is_private,time_of_publish,pubkey from profile where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( ret ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) && !query.isNull(1) ) { aResultingProfileData.clear() ; aResultingSignature.clear() ; aResultingProfileData.append ( query.value(0).toByteArray()) ; aResultingSignature.append ( query.value(1).toByteArray()) ; if ( !query.isNull(2) && query.value(2).toBool() ) { *aIsProfilePrivate = true ; } if ( !query.isNull(3) && aTimeOfPublish != NULL ) { *aTimeOfPublish = query.value(3).toUInt() ; } if ( aResultingPublicKey != NULL ) { aResultingPublicKey->clear() ; aResultingPublicKey->append(query.value(4).toByteArray()) ; } retval = true ; } } return retval ; } bool ProfileModel::sentProfileReceived(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QByteArray& aProfilePublicKey, const unsigned char aFlags, const quint32 aTimeStamp, const Hash& aFromNode ) { const QList dummy ; return doHandlepublishedOrSentProfile(aFingerPrint, aContent, aSignature, dummy, aProfilePublicKey, aFlags, aTimeStamp, false, aFromNode) ; } bool ProfileModel::publishedProfileReceived(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const QByteArray& aProfilePublicKey, const unsigned char aFlags, const quint32 aTimeStamp, const Hash& aFromNode ) { return doHandlepublishedOrSentProfile(aFingerPrint, aContent, aSignature, aBangPath, aProfilePublicKey, aFlags, aTimeStamp, true, aFromNode ) ; } bool ProfileModel::doHandlepublishedOrSentProfile(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const QByteArray& aProfilePublicKey, const unsigned char aFlags, const quint32 aTimeStamp, bool aWasPublish, const Hash& aFromNode ) { bool retval = false ; // ok, lets see .. should we verify first. QByteArray key ; // ok first stupid check: // lets say we have a node in network that says that profile is profile. // it has data and signature and public key, all is made public. // information about encryptedness of the profile is outside the // signing process. .. it is just a bit in the binary procotol between // peers. malicious node in the network starts flipping those bits, // causing non-encrypted pages to be tried with encryption and // nice-versa. so .. if it parses it is not encrypted. then check the // flag. // // we still have that malicious node that deliberatedly changes // content of the profile to be non-encrypted while it was originally // made encypted but that will then fail in verification stage bool parseResult(false) ; if ( ( aFlags & 1 ) == 0 ) { // try parsing only if non-encrypted // looks like QJson will set parseResult to true also // when content is actually encrypted so we can check only // for non-encrypted data here. it still needs to parse. QVariantMap dummyResult ( JSonWrapper::parse (aContent, &parseResult) ); } bool flagThisNodeAlreadyHadContent ( false ) ; if ( ( parseResult && ( ( aFlags & 1 ) == 0 ) ) || (( aFlags & 1 ) == 1) ) { // it did parse and encryption flag was 0 quint32 timeStampOfPossibleExistingProfile ( 0 ) ; if ( iController->model().contentEncryptionModel().PublicKey(aFingerPrint, key, &timeStampOfPossibleExistingProfile ) == true ) { // we have got the key, // check if we already had this version: if ( aTimeStamp > timeStampOfPossibleExistingProfile ) { // lets try verifying: if ( iController->model().contentEncryptionModel().verify(aFingerPrint, aContent, aSignature) == true ) { // good signature QSqlQuery query(iModel.dataBaseConnection()); retval = query.prepare ("update profile set profiledata = :profiledata,signature=:signature,is_private=:is_private,display_name=:display_name,time_of_publish=:time_of_publish,recvd_from=:recvd_from where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( retval ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); query.bindValue(":profiledata", aContent); query.bindValue(":signature", aSignature); query.bindValue(":recvd_from", aFromNode.iHash160bits[4]); LOG_STR2("### profile update, is private = %d", ( aFlags & 1 ) ) ; query.bindValue(":is_private", (bool)( aFlags & 1 ) ); query.bindValue(":time_of_publish", aTimeStamp); if ( aFlags & 1 ) { // profile is private; use hash as displayname query.bindValue(":display_name", aFingerPrint.toString().toUtf8()) ; } else { // profile is public ; dig out user-friendly name Profile p (aFingerPrint) ; p.fromJSon(aContent,*iController) ; query.bindValue(":display_name", p.displayName().toUtf8()) ; iModel.searchModel()->indexProfile(p,true) ; } retval = query.exec() ; } if ( !retval ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } } } else { LOG_STR("We already had the profile -> not continuing ..") ; retval = flagThisNodeAlreadyHadContent = true ; } } else { // we did not have the key already. published content is supplied with // key so we must trust that key is the key. lets try verifying.. ; // first check fingerprint, then save key.. Hash hashOfKey (iController->model().contentEncryptionModel().hashOfPublicKey(aProfilePublicKey) ) ; if ( hashOfKey == aFingerPrint ) { iController->model().contentEncryptionModel().insertOrUpdatePublicKey(aProfilePublicKey,aFingerPrint) ; if ( iController->model().contentEncryptionModel().verify(aFingerPrint, aContent, aSignature) == true ) { // good signature QSqlQuery query(iModel.dataBaseConnection()); retval = query.prepare ("update profile set profiledata=:profiledata,signature=:signature,is_private=:is_private,display_name=:display_name,time_of_publish=:time_of_publish,recvd_from=:recvd_from where hash1=:hash1 and hash2=:hash2 and hash3=:hash3 and hash4=:hash4 and hash5=:hash5" ) ; if ( retval ) { query.bindValue(":profiledata", aContent); query.bindValue(":signature", aSignature); query.bindValue(":is_private", (bool)( aFlags & 1 ) ); query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); query.bindValue(":recvd_from", aFromNode.iHash160bits[4]); if ( aTimeStamp + 60 > QDateTime::currentDateTimeUtc().toTime_t() ) { query.bindValue(":time_of_publish", (quint32)(QDateTime::currentDateTimeUtc().toTime_t())); } else { query.bindValue(":time_of_publish", aTimeStamp); } if ( aFlags & 1 ) { // profile is private; use hash as displayname query.bindValue(":display_name", aFingerPrint.toString().toUtf8()) ; } else { // profile is public ; dig out user-friendly name Profile p (aFingerPrint) ; p.fromJSon(aContent,*iController) ; query.bindValue(":display_name", p.displayName().toUtf8()) ; iModel.searchModel()->indexProfile(p) ; } retval = query.exec() ; if ( !retval ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } } } } else { LOG_STR("Hash of published/sent public key did not match the fp supplied in protocol") ; } // ok we got that far e.g. possible fingerprint+verify is done. // try save the actual stuff } } else { LOG_STR("Non-encrypted content did not parse") ; retval = false ; } if ( aWasPublish ) { if ( retval && (flagThisNodeAlreadyHadContent == false) ) { iController->model().addItemToBePublished(UserProfile, aFingerPrint, aBangPath) ; } } if ( retval && ( flagThisNodeAlreadyHadContent == false ) ) { emit contentReceived(aFingerPrint, UserProfile) ; } LOG_STR2("ProfileModel::published/sentProfileReceived out success = %d", (int)retval) ; return retval ; } void ProfileModel::fillBucket(QList& aSendQueue, const Hash& aStartOfBucket, const Hash& aEndOfBucket, quint32 aLastMutualConnectTime, const Hash& aForNode ) { QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5,time_of_publish from profile where hash1 >= :start and hash1 <= :end and time_of_publish > :last_connect_time and time_of_publish < :curr_time and ( recvd_from != :lowbits_of_requester or recvd_from is null ) order by time_of_publish desc limit 1000" ) ; if ( ret ) { if ( aStartOfBucket == aEndOfBucket ) { // this was "small network situation" e.g. start and end // are the same ; in practice it means that send all data query.bindValue(":start", 0x0); query.bindValue(":end", 0xFFFFFFFF); } else { // normal situation query.bindValue(":start", aStartOfBucket.iHash160bits[0]); query.bindValue(":end", aEndOfBucket.iHash160bits[0]); } query.bindValue(":last_connect_time", aLastMutualConnectTime); query.bindValue(":lowbits_of_requester", aForNode.iHash160bits[4]); // allow 5 minutes of clock skew between nodes query.bindValue(":curr_time", QDateTime::currentDateTimeUtc().addSecs(5*60).toTime_t()); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { Hash hashFoundFromDb ( query.value(0).toUInt(), query.value(1).toUInt(), query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt()) ; SendQueueItem profileToSend ; profileToSend.iHash = hashFoundFromDb ; profileToSend.iItemType = UserProfile ; time_t timePublish(query.value(5).toUInt()) ; time_t timeMutual(aLastMutualConnectTime); aSendQueue.append(profileToSend) ; #ifndef WIN32 char formatted_mutual [100] = {0} ; char formatted_found [100] = {0} ; ctime_r(&timePublish,&formatted_found[0] ) ; ctime_r(&timeMutual,&formatted_mutual[0] ) ; LOG_STR2("Profile bucket mutual %s", formatted_mutual) ; LOG_STR2("Profile bucket found %s", formatted_found) ; #endif } } } Hash ProfileModel::profileWithOldestTimeSinceMsgPoll(quint32* aLastPollTime) { Hash retval ; QSqlQuery query(iModel.dataBaseConnection()); quint32 timestampFromDb ( 0 ) ; bool ret ; ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5,last_msgpoll_time from privatekeys where last_msgpoll_time = ( select min(last_msgpoll_time) from privatekeys ) or last_msgpoll_time is null order by last_msgpoll_time asc limit 1" ) ; if ( !ret ) { emit error(MController::DbTransactionError, query.lastError().text()) ; QLOG_STR("ProfileModel::profileWithOldestTimeSinceMsgPoll " + query.lastError().text()) ; } else { if ( query.exec() && query.next() ) { Hash hashFoundFromDb ( query.value(0).toUInt(), query.value(1).toUInt(), query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt()) ; if ( query.isNull(5) ) { retval = hashFoundFromDb ; } else { timestampFromDb = query.value(5).toUInt(); if ( ( timestampFromDb + ( 60*10 ) ) < QDateTime::currentDateTimeUtc().toTime_t() ) { // was older than 600 seconds retval = hashFoundFromDb ; *aLastPollTime = timestampFromDb ; } } } } return retval ; } void ProfileModel::setPrivateMessagePollTimeForProfile(const quint32 aTimeStamp, const Hash& aProfile ) { bool ret ; QSqlQuery query2(iModel.dataBaseConnection()) ; ret = query2.prepare("update privatekeys set last_msgpoll_time = :last_msgpoll_time where hash1=:h1 and hash2=:h2 and hash3=:h3 and hash4=:h4 and hash5=:h5") ; if ( !ret ) { QLOG_STR(query2.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query2.lastError().text()) ; } else { query2.bindValue(":h1", aProfile.iHash160bits[0]); query2.bindValue(":h2", aProfile.iHash160bits[1]); query2.bindValue(":h3", aProfile.iHash160bits[2]); query2.bindValue(":h4", aProfile.iHash160bits[3]); query2.bindValue(":h5", aProfile.iHash160bits[4]); query2.bindValue(":last_msgpoll_time", aTimeStamp); ret = query2.exec() ; if ( !ret ) { QLOG_STR(query2.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query2.lastError().text()) ; } } } void ProfileModel::setPrivateDataForProfile( const Hash& aProfile, const QVariant& aPrivateData ) { QByteArray dataJSon (JSonWrapper::serialize(aPrivateData) ) ; QByteArray encryptedJson ; QList privateDataReaders ; privateDataReaders << aProfile ; // private data is encrypted only to self QLOG_STR("private data = " + QString(dataJSon)) ; if ( iController->model().contentEncryptionModel().encrypt(privateDataReaders, dataJSon, encryptedJson ) ) { bool ret ; QSqlQuery query2(iModel.dataBaseConnection()) ; ret = query2.prepare("update privatekeys set private_data = :private_data where hash1=:h1 and hash2=:h2 and hash3=:h3 and hash4=:h4 and hash5=:h5") ; if ( !ret ) { QLOG_STR(query2.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query2.lastError().text()) ; } else { query2.bindValue(":h1", aProfile.iHash160bits[0]); query2.bindValue(":h2", aProfile.iHash160bits[1]); query2.bindValue(":h3", aProfile.iHash160bits[2]); query2.bindValue(":h4", aProfile.iHash160bits[3]); query2.bindValue(":h5", aProfile.iHash160bits[4]); query2.bindValue(":private_data", encryptedJson); ret = query2.exec() ; if ( !ret ) { QLOG_STR(query2.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query2.lastError().text()) ; } } } } QVariant ProfileModel::privateDataOfProfile( const Hash& aProfile ) { QVariant retval ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("select private_data from privatekeys where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5") ; if ( ret ) { query.bindValue(":hash1", aProfile.iHash160bits[0]); query.bindValue(":hash2", aProfile.iHash160bits[1]); query.bindValue(":hash3", aProfile.iHash160bits[2]); query.bindValue(":hash4", aProfile.iHash160bits[3]); query.bindValue(":hash5", aProfile.iHash160bits[4]); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) ) { QByteArray encryptedPrivateData ( query.value(0).toByteArray() ) ; QByteArray plainTextProfileData ; if ( iController->model().contentEncryptionModel().decrypt(encryptedPrivateData, plainTextProfileData ) ) { QLOG_STR("priv data: " + plainTextProfileData) ; retval = JSonWrapper::parse (plainTextProfileData, &ret); if ( !ret ) { retval = QVariant() ; } } } } return retval ; } time_t ProfileModel::getLastProfileUpdateTime( const Hash& aProfile ) { time_t retval ( 0 ) ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("select time_of_update_poll from profile where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5") ; if ( ret ) { query.bindValue(":hash1", aProfile.iHash160bits[0]); query.bindValue(":hash2", aProfile.iHash160bits[1]); query.bindValue(":hash3", aProfile.iHash160bits[2]); query.bindValue(":hash4", aProfile.iHash160bits[3]); query.bindValue(":hash5", aProfile.iHash160bits[4]); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) ) { retval = query.value(0).toUInt() ; } } return retval ; } void ProfileModel::setLastProfileUpdateTime( const Hash& aProfile,time_t aTime ) { QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("update profile set time_of_update_poll = :time_of_update_poll where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5") ; if ( ret ) { query.bindValue(":hash1", aProfile.iHash160bits[0]); query.bindValue(":hash2", aProfile.iHash160bits[1]); query.bindValue(":hash3", aProfile.iHash160bits[2]); query.bindValue(":hash4", aProfile.iHash160bits[3]); query.bindValue(":hash5", aProfile.iHash160bits[4]); query.bindValue(":time_of_update_poll", (unsigned) aTime) ; } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } } void ProfileModel::reIndexAllProfilesIntoFTS() { QList profiles ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; query.exec("delete from profile_search") ; ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5 from profile where is_private='false'") ; ret = query.exec() ; if ( !ret ) { emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { Hash hashFoundFromDb ( query.value(0).toUInt(), query.value(1).toUInt(), query.value(2).toUInt(), query.value(3).toUInt(), query.value(4).toUInt()) ; profiles.append(hashFoundFromDb) ; } } foreach ( const Hash& a, profiles ) { Profile* p ( profileByFingerPrint(a) ) ; if ( p ) { iModel.searchModel()->indexProfile( *p ) ; delete p ; } } } bool ProfileModel::deleteOldestDataRowInTable() { bool ret = false ; QSqlQuery query(iModel.dataBaseConnection()); // this overridden version from datamodelbase is different in // that way that this looks also into table privatekeys // and does not delete profiles that we have private keys for. ret = query.exec("delete from " + iDataTableName + " where rowid = ( select max(rowid) from (select rowid from " + iDataTableName + " where time_last_reference = ( select min(time_last_reference) from " + iDataTableName + " where hash1 not in ( select hash1 from privatekeys ) ) ) ) ") ; if ( ret ) { iCurrentDbTableRowCount-- ; } return ret ; } classified-ads-0.13/datamodel/profilemodel.h000066400000000000000000000267211331670245300211100ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti Jarvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_PROFILEMODEL_H #define CLASSIFIED_PROFILEMODEL_H #include #include "../mcontroller.h" // because enum from there is needed #include "../net/connection.h" #include "datamodelbase.h" class Hash ; class MModelProtocolInterface ; class Profile ; /** * @brief This is is part of datamodel for storing user profiles * * Encryption keys related to profiles need to be done using * ContentEncryptionModel but after it has done its job, * this part of datamodel handles that actual profile-content */ class ProfileModel : public ModelBase { Q_OBJECT public: ProfileModel(MController *aMController, MModelProtocolInterface &aModel) ; ~ProfileModel() ; /** * sends profile to selected nodes in network for others * to retrieve. * * The reason why this method is in model (and not for instance, * in Controller) is that "publish" means that a particular * profile is stored into and marked as "needs to be published". * Before that happens we need to open network connections to * nodes that are supposed to contain the profile and once * connections are open, then same profile is pushed into several * nodes until it is considered "published". That opening and * pushing-part happens by networking-parts. * * @param aProfile is the profile to publish * @return true if things went all right */ bool publishProfile(const Profile& aProfile) ; /** * gets a profile. caller is supposed to delete the returned * profile. * @param aFingerPrint profile serial number * @param aEmitErrorOnEncryptionErrors if true and profile cannot * be opened because selected operator is not in list of * readers then an error message shall be emit()ted. * This is set to false for trust-tree related operations * where it is likely that selected operator is not reader * of every operator trusted by selected operator. * @param aOmitImage if set to true, possible image will not be loaded from * data ; in cases where we know that we'll need only subset of * information and no image, we can skip this costly operation * @return profile or NULL */ Profile* profileByFingerPrint(const Hash& aFingerPrint, bool aEmitErrorOnEncryptionErrors = true, bool aOmitImage = false ) ; /** * Gets a profile. Because profile is signed .. and that means that * a particular byte-stream (containing actually a serialized json * object) gets signed those bytes can't be altered or signature will * not verify. This methods gets the actual signed bytestream * that has been checked against a public key. * * Note that this method does not check the signature any more, * idea is that we don't store into db profiles that fail the signature * check so this method only gets the profile, does not set it. * * @param aFingerPrint profile serial number * @param aResultingProfileData will contain profile data * @param aResultingSignature will contain profile signature * @param aIsProfilePrivate will be set to true if aResultingProfileData * is encrypted. * @param aTimeOfPublish is also output variable, if non-NULL, will * get its value set to time of publish of the profile * @param aResultingPublicKey if non-NULL, will be written to * contain the public key of the profile * @return true if profile was found */ bool profileDataByFingerPrint(const Hash& aFingerPrint, QByteArray& aResultingProfileData, QByteArray& aResultingSignature, bool* aIsProfilePrivate, quint32* aTimeOfPublish = NULL, QByteArray* aResultingPublicKey = NULL ) ; /** * called by protocol parser when a profile is received * @param aFingerPrint is the profile @ref Hash received from protocol header * @param aContent is actual profile data * @param aSignature is digital signature of the aContent * @param aBangPath is list of last nodes where this content has been, idea is to * prevent re-sending content to somewhere where it has already * been * @param aProfilePublicKey is the key that was used to sign the profile. * that is transferred outside profile just because the recipient * might not have the key beforehand ; if she does, the existing * key will be used in verifying process. * @param aFlag possible flags telling about encyption and compression * @param aTimeStamp timestamp of profile (if encrypted, it must be carried outside..) * @return true on success */ bool publishedProfileReceived(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const QByteArray& aProfilePublicKey, const unsigned char aFlags, const quint32 aTimeStamp, const Hash& aFromNode) ; /** * called by protocol parser when a profile is received by "send" protocol type * @param aFingerPrint is the profile @ref Hash received from protocol header * @param aContent is actual profile data * @param aSignature is digital signature of the aContent * @param aProfilePublicKey is the key that was used to sign the profile. * that is transferred outside profile just because the recipient * might not have the key beforehand ; if she does, the existing * key will be used in verifying process. * @param aFlag possible flags telling about encyption and compression * @param aTimeStamp timestamp of profile (if encrypted, it must be carried outside..) * @return true on success */ bool sentProfileReceived(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QByteArray& aProfilePublicKey, const unsigned char aFlags, const quint32 aTimeStamp, const Hash& fromNode ) ; /** * Method for filling connected peers send queue with items * that we have and that belong to said peers bucket. * * @param aSendQueue is send-queue of the connection that * serves particular node * @param aStartOfBucket is hash where bucket of that peer * starts. In practice it is the hash * of the node itself. * @param aEndOfBucket is hash where bucket of that peer ends. * That in turn depends on network size, * or number of active nodes in the network. * See method @ref NodeModel::bucketEndHash * for details. * @param aLastMutualConnectTime time when node was last in * contact. In practice we'll fill the * bucket items published after this time. */ void fillBucket(QList& aSendQueue, const Hash& aStartOfBucket, const Hash& aEndOfBucket, quint32 aLastMutualConnectTime, const Hash& aForNode ); /** * method for find a profile that we have private keys for and * that has not had its private messages polled for given * time (say, 15 minutes). See method * @ref NetworkConnectorEngine::createConnectionsToNodesStoringPrivateMessages * @param aLastPollTime output variable. this points to quint32 that * (if profile is found) will have its value set to time * of last message poll for the profile returned. * @return fingerprint of node or KNullHash if every profile * with private keys has had its messages polled recently */ Hash profileWithOldestTimeSinceMsgPoll(quint32* aLastPollTime) ; /** * method that is called after successful message poll ; it set * the message poll timestamp for a profile */ void setPrivateMessagePollTimeForProfile(const quint32 aTimeStamp, const Hash& aProfile ) ; /** * Updates private data of a profile whose private key we * stored locally. In first stage this private data includes * contact list, later maybe trust settings etc. */ void setPrivateDataForProfile( const Hash& aProfile, const QVariant& aPrivateData ) ; /** * Getter-method for private data of a profile. This "Private data" is * locally-stored settings-type of data specific to profile and it is * not shared inside network. */ QVariant privateDataOfProfile( const Hash& aProfile ) ; /** * Gets time of last (successful) profile update+comment poll. */ time_t getLastProfileUpdateTime( const Hash& aProfile ) ; /** * sets time of last (successful) profile update+comment poll. */ void setLastProfileUpdateTime( const Hash& aProfile,time_t aTime ) ; void reIndexAllProfilesIntoFTS() ; private: // methods /** * Workhorse of methods @ref publishedProfileReceived and @ref sentProfileReceived * @return true on success */ bool doHandlepublishedOrSentProfile(const Hash& aFingerPrint, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const QByteArray& aProfilePublicKey, const unsigned char aFlags, const quint32 aTimeStamp, bool aWasPublish, const Hash& aFromNode ) ; /** * Overridden from ModelBase */ virtual bool deleteOldestDataRowInTable() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; /** emitted when new profile is received */ void contentReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfReceivdContent) ; } ; #endif classified-ads-0.13/datamodel/profilereaderslistingmodel.cpp000066400000000000000000000152151331670245300243770ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "profilereaderslistingmodel.h" #include "../log.h" #include "profile.h" #include "model.h" ProfileReadersListingModel::ProfileReadersListingModel(Profile& aProfile, MController& aController ) : iProfile(aProfile), iController(aController) { for ( int i = 0 ; i < iProfile.iProfileReaders.size() ; i++ ) { updateReaderDataInArray( iProfile.iProfileReaders[i],false ) ; } beginInsertColumns(QModelIndex(),0,0) ; endInsertColumns() ; beginInsertRows(QModelIndex(),0,iNamesAndFingerPrints.size()) ; endInsertRows() ; emit dataChanged(createIndex( 0 ,0), createIndex( iNamesAndFingerPrints.size() ,0)) ; } ProfileReadersListingModel::~ProfileReadersListingModel() { } int ProfileReadersListingModel::rowCount(const QModelIndex& ) const { return iNamesAndFingerPrints.size(); } int ProfileReadersListingModel::columnCount(const QModelIndex& ) const { return 1 ; // for the time being .. maybe this could be configurable? // add one column for possible icon // add another for optional delete-button with a drawing delegate? } QVariant ProfileReadersListingModel::data(const QModelIndex &index, int role) const { if(!index.isValid()) return QVariant(); if(role == Qt::DisplayRole) { return iNamesAndFingerPrints.at(index.row()).second ; //return iProfiles.at(index.row()).toString(); } if(role == Qt::DecorationRole) { // here return QIcon of size 26x26 featuring lenin reading pravda? return QVariant(); } if(role == Qt::ToolTipRole) { return iNamesAndFingerPrints.at(index.row()).first.toString() ; } return QVariant(); } void ProfileReadersListingModel::addReader(const Hash& aFingerPrint) { if ( ! iProfile.iProfileReaders.contains(aFingerPrint) ) { iProfile.iProfileReaders.append(aFingerPrint) ; updateReaderDataInArray(aFingerPrint,true) ; } } void ProfileReadersListingModel::removeReader(const Hash& aFingerPrint) { int i ; if ( iProfile.iProfileReaders.contains(aFingerPrint) ) { iProfile.iProfileReaders.removeOne(aFingerPrint) ; for ( i = 0 ; i < iNamesAndFingerPrints.size() ; i++ ) { if ( iNamesAndFingerPrints.at(i).first == aFingerPrint ) { beginRemoveRows(QModelIndex(),i,i) ; iNamesAndFingerPrints.removeAt(i); endRemoveRows() ; break ; } } } } void ProfileReadersListingModel::updateReaderDataInArray( const Hash& aFingerPrint,bool aEmit ) { bool found = false ; int i ; for ( i = 0 ; i < iNamesAndFingerPrints.size() ; i++ ) { if ( iNamesAndFingerPrints.at(i).first == aFingerPrint ) { iNamesAndFingerPrints.replace(i, QPair ( aFingerPrint, profileDisplayNameByFingerPrint(aFingerPrint) ) ); found = true ; break ; } } if(!found) { // was not contained beginInsertRows(QModelIndex(),iNamesAndFingerPrints.size(),iNamesAndFingerPrints.size()) ; iNamesAndFingerPrints.append( QPair ( aFingerPrint, profileDisplayNameByFingerPrint(aFingerPrint) )); i = iNamesAndFingerPrints.size() ; endInsertRows() ; found = true ; } if ( aEmit && found ) { int minRow = i>0 ? i-1 : 0 ; int maxRow = i>=iNamesAndFingerPrints.size()? iNamesAndFingerPrints.size():i+1 ; LOG_STR2("Emit from row %d", minRow) ; LOG_STR2("Emit to row %d", maxRow) ; emit dataChanged(createIndex( minRow,0), createIndex( maxRow,0)); } } QString ProfileReadersListingModel::profileDisplayNameByFingerPrint(const Hash& aFingerPrint) { // some kind of caching could be in order here? we'll repeatedly list // same profilenames, querying db for each and every listing is waste // of resources.. QSqlQuery query(iController.model().dataBaseConnection()); bool ret ; QString retval ; ret = query.prepare ( "select display_name from profile where " "hash1=:hash1 and hash2=:hash2 and hash3=:hash3 " "and hash4=:hash4 and hash5=:hash5 " ) ; if ( ret ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() ) { retval = QString::fromUtf8(query.value(0).toByteArray()) ; } } } else { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } if ( retval.length() == 0 ) { retval = aFingerPrint.toString() ; } return retval ; } QVariant ProfileReadersListingModel::headerData(int aSection, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) return QVariant(); if (orientation == Qt::Horizontal) { switch (aSection) { case 0: return QVariant(tr("Name or fingerprint of reader")); break ; default: return QVariant(); } } return QVariant(); } classified-ads-0.13/datamodel/profilereaderslistingmodel.h000066400000000000000000000056701331670245300240500ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PROFILEREADERLISTINGMODEL_H #define PROFILEREADERLISTINGMODEL_H #include #include "../util/hash.h" #include "../mcontroller.h" class Profile ; class Model ; class MController ; /** * @brief Model-class for helping display of readers of a profile */ class ProfileReadersListingModel: public QAbstractTableModel { Q_OBJECT public: ProfileReadersListingModel(Profile& aProfile, MController& aController ) ;/**< Constructor */ ~ProfileReadersListingModel() ; /**< Destructor */ /** * method for adding a reader. this change will be made to iProfile * too. * @param aFingerPrint is fingerprint of the reader to add */ void addReader(const Hash& aFingerPrint) ; /** * method for removing a reader. this change will be made to iProfile * too. * @param aFingerPrint is fingerprint of the reader to remove */ void removeReader(const Hash& aFingerPrint) ; /** * method for retrieving display-name of a profile */ QString profileDisplayNameByFingerPrint(const Hash& aFingerPrint) ; /** * re-implemented from QAbstractTableModel * @return number of rows in list */ virtual int rowCount(const QModelIndex & parent = QModelIndex()) const ; /** * re-implemented from QAbstractTableModel * @return number of columns in model */ virtual int columnCount ( const QModelIndex & parent = QModelIndex() ) const ; /** * re-implemented from QAbstractTableModel * @return data to display in list */ virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const ; virtual QVariant headerData(int aSection, Qt::Orientation orientation, int role) const ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: // methods void updateReaderDataInArray( const Hash& aFingerPrint,bool aEmit ) ; private: // data Profile& iProfile ; QList > iNamesAndFingerPrints ; MController& iController ; } ; #endif classified-ads-0.13/datamodel/profilesearchmodel.cpp000066400000000000000000000070541331670245300226270ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "profilesearchmodel.h" #include "../log.h" #include "../mcontroller.h" #include "model.h" ProfileSearchModel::ProfileSearchModel(Model& aModel) : iModel(aModel) { } ProfileSearchModel::~ProfileSearchModel() { } int ProfileSearchModel::rowCount(const QModelIndex& ) const { return iProfiles.size(); } QVariant ProfileSearchModel::data(const QModelIndex &index, int role) const { if(!index.isValid()) return QVariant(); if(role == Qt::DisplayRole) { return iProfiles.at(index.row()).second ; //return iProfiles.at(index.row()).toString(); } if(role == Qt::DecorationRole) { // here return QIcon of size 26x26 featuring lenin reading pravda? return QVariant(); } if(role == Qt::ToolTipRole) { return iProfiles.at(index.row()).first.toString() ; } return QVariant(); } void ProfileSearchModel::setSearchString(const QString& aSearch) { iSearchString = aSearch ; // ok .. what next. .. don't search with empty if ( iSearchString.length() == 0 ) { iProfiles.clear() ; } else { performSearch() ; } emit dataChanged(createIndex(0,0),createIndex(iProfiles.size(),0)) ; } void ProfileSearchModel::performSearch() { QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5," "display_name from profile where " "display_name like :searchcriteria " "order by display_name limit 100" ) ; if ( ret ) { QString queryString ("%" + iSearchString + "%") ; query.bindValue(":searchcriteria", queryString.toUtf8() ) ; ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { quint32 hash1 = query.value(0).toUInt() ; quint32 hash2 = query.value(1).toUInt() ; quint32 hash3 = query.value(2).toUInt() ; quint32 hash4 = query.value(3).toUInt() ; quint32 hash5 = query.value(4).toUInt() ; iProfiles.append( QPair ( Hash ( hash1,hash2,hash3,hash4,hash5), QString::fromUtf8(query.value(5).toByteArray())) ); } } } else { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } } classified-ads-0.13/datamodel/profilesearchmodel.h000066400000000000000000000040401331670245300222640ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PROFILESEARCHMODEL_H #define PROFILESEARCHMODEL_H #include #include "../util/hash.h" #include "../mcontroller.h" class Model ; /** * @brief Model-class for performing a name-based search of profiles. * This is supposed to act as an underlying data-container for * an user-interface view (QListView etc.) */ class ProfileSearchModel: public QAbstractListModel { Q_OBJECT public: ProfileSearchModel(Model& aModel) ; ~ProfileSearchModel() ; void setSearchString(const QString& aSearch) ; /** * re-implemented from QAbstractListModel * @return number of rows in list */ virtual int rowCount(const QModelIndex & parent = QModelIndex()) const ; /** * re-implemented from QAbstractListModel * @return data to display in list */ virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private:// methods void performSearch() ; private: // data Model& iModel ; QList > iProfiles ; QString iSearchString ; } ; #endif classified-ads-0.13/datamodel/searchmodel.cpp000066400000000000000000000633451331670245300212530ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include "searchmodel.h" #include "../log.h" #include #include "ca.h" #include "profile.h" #include "profilecomment.h" #include "model.h" #include static const char *KJsonSearchResultId = "id" ; static const char *KJsonSearchResultSet = "set" ; static const char *KJsonSearchItemType = "type" ; static const char *KJsonSearchItemTypeCA = "ca" ; static const char *KJsonSearchItemTypeProfile = "prof" ; static const char *KJsonSearchItemTypeComment = "comm" ; static const char *KJsonSearchItemFP = "fp" ; static const char *KJsonSearchItemSnippet = "text" ; SearchModel::SearchModel(MModelProtocolInterface& aModel, MController& aController) : iModel(aModel), iIsFTSSupported(queryIfFTSSupported(aModel.dataBaseConnection())), iController(aController) { } SearchModel::~SearchModel() { } int SearchModel::rowCount(const QModelIndex& ) const { return iDisplayedResults.count() ; } QVariant SearchModel::data(const QModelIndex &index, int role) const { if(!index.isValid()) { return QVariant(); } else if ( role == Qt::UserRole ) { return iDisplayedResults.at(index.row()).iItemHash.toQVariant() ; } else if ( role == Qt::UserRole+2 ) { return iDisplayedResults.at(index.row()).iFoundFromNode.toQVariant() ; } if ( role == Qt::UserRole+1 ) { return iDisplayedResults.at(index.row()).iItemType ; } else if ( role == Qt::DisplayRole ) { return iDisplayedResults.at(index.row()).iDisplayName ; } else { return QVariant(); } } // datamodel better be locked when calling this method void SearchModel::setSearchString(const QString& aSearch, bool aSearchAds, bool aSearchProfiles, bool aSearchComments, bool aNetworkSearch) { #if QT_VERSION >= 0x050000 // qt5 beginResetModel() ; #endif iSearchString = aSearch ; iSearchAds = aSearchAds ; iSearchProfiles = aSearchProfiles ; iSearchComments = aSearchComments ; iDisplayedResults.clear() ; if ( aSearch.length() > 0 && ( aSearchAds || aSearchProfiles || aSearchComments ) ) { // ok, user has something to search for if ( aNetworkSearch == false ) { // then search locally iDisplayedResults = performSearch(aSearch, aSearchAds, aSearchProfiles, aSearchComments) ; } else { // spam search to every connected node. Here don't use the normal "net request // queue" but instead short-circuit the query into each connected nodes // send queue - will be faster, will query only already-connected nodes. this // is all right. SendQueueItem itemToSpam ; iSearchId.calculate(aSearch.toUtf8()) ; itemToSpam.iItemType = RequestForSearchSend ; itemToSpam.iHash = iSearchId ; QLOG_STR("Starting network search, search id = " + QString::number(iSearchId.iHash160bits[0]) + " model = " + objectName()) ; LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Searchmodel ptr") ; const QList & currentConnections ( iController.model().getConnections() ) ; for ( int i = currentConnections.size()-1 ; i >= 0 ; i-- ) { Connection& c ( *(currentConnections[i]) ) ; if ( c.connectionState() == Connection::Open && c.iNumberOfPacketsReceived > 1 ) { c.iSendQueue.append( itemToSpam ) ; } } } } #if QT_VERSION >= 0x050000 endResetModel() ; #else reset() ; #endif } bool SearchModel::queryIfFTSSupported(QSqlDatabase aDataBase) { bool retval ( false ) ; QSqlQuery query (aDataBase); if ( query.prepare ("select trim(upper(sqlite_compileoption_get(:optNumber)))" ) ) { int i = 0 ; QString queryRes ; do { queryRes = QString() ; query.bindValue(":optNumber",i); if ( query.exec() ) { if ( query.next() && !query.isNull(0) ) { queryRes = query.value(0).toString() ; if ( queryRes == "ENABLE_FTS3" ) { retval = true ; QLOG_STR("FTS is supported") ; break ; } else { QLOG_STR("Sqlite option #" + QString::number(i) + ":'"+queryRes+"'") ; } } else { break ; } } else { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; break ; // out of loop } i++ ; } while ( queryRes.length() > 0 ) ; } return retval ; } void SearchModel::createFTSTables(QSqlDatabase aDataBase) { QSqlQuery q(aDataBase); bool ret ; ret = q.exec("create virtual table classified_ad_search using fts3(senderhash,sendername,subject,text)") ; if (!ret) { QLOG_STR("FTS3 table classified_ad_search creation: " + q.lastError().text()) ; return ; } // this trigger will handle unfairly documents where there is // hash collision in the first 32 bits, e.g. no full hash collision // needed. // // but this simplifies things, we don't need to fetch rowid after // insert and it is only 1/(2^32) chance so lets go. should be fairly rare // and then we lose only the search, the document is still there. ret = q.exec("CREATE TRIGGER classified_ad_search_del BEFORE DELETE ON classified_ad BEGIN" " DELETE FROM classified_ad_search WHERE docid=old.hash1;" "END;" ) ; if (!ret) { QLOG_STR("FTS3 classified_ad_search_del trigger: " + q.lastError().text()) ; return ; } // then search for profile: ret = q.exec("create virtual table profile_search using fts3(profilehash,nickname,greetingtext,firstname,familyname,city,btc,state)") ; if (!ret) { QLOG_STR("FTS3 table profile_search creation: " + q.lastError().text()) ; return ; } ret = q.exec("CREATE TRIGGER profile_search_del BEFORE DELETE ON profile BEGIN" " DELETE FROM profile_search WHERE docid=old.hash1;" "END;" ) ; if (!ret) { QLOG_STR("FTS3 profile_search_del trigger: " + q.lastError().text()) ; return ; } // then search for profilecomment: ret = q.exec("create virtual table profilecomment_search using fts3(profilehash,commentorhash,comment,commentsubject,commentornickname)") ; if (!ret) { QLOG_STR("FTS3 table profilecomment_search creation: " + q.lastError().text()) ; return ; } ret = q.exec("CREATE TRIGGER profilecomment_search_del BEFORE DELETE ON profilecomment BEGIN" " DELETE FROM profilecomment_search WHERE docid=old.hash1;" "END;" ) ; if (!ret) { QLOG_STR("FTS3 classified_ad_search_del trigger: " + q.lastError().text()) ; return ; } return ; } void SearchModel::indexClassifiedAd(const CA& aCa) { if ( iIsFTSSupported && aCa.iMessageText.length() > 0 ) { // dig out message text in plain text QLOG_STR("indexClassifiedAd setHtml, len = " + QString::number( aCa.iMessageText.length() ) ) ; QTextDocument* htmlParser = new QTextDocument() ; // create every time, because this method // is called from multiple threads htmlParser->setHtml(aCa.iMessageText ) ; QString plainText(htmlParser->toPlainText()) ; htmlParser->clear() ; bool operation_success (false) ; if ( plainText.length() > 0 ) { QSqlQuery ins(iModel.dataBaseConnection()) ; operation_success= ins.prepare("insert into classified_ad_search(" "docid,senderhash,sendername,subject,text) values (" ":hash1,:senderhash,:sendername,:subject,:text)") ; if ( operation_success ) { ins.bindValue(":hash1", aCa.iFingerPrint.iHash160bits[0]); ins.bindValue(":senderhash", aCa.iSenderHash.toString()) ; ins.bindValue(":sendername", aCa.iSenderName.length() > 0 ? aCa.iSenderName.toUtf8() : aCa.iSenderHash.toString()) ; ins.bindValue(":subject", aCa.iSubject.toUtf8()) ; ins.bindValue(":text", plainText.toUtf8()) ; if ( ins.exec() == false ) { // if indexing fails, put out only log message, because we'll want // to have the actual document anyway.. QLOG_STR("insert into classified_ad_search exec : " + ins.lastError().text()) ; } } else { QLOG_STR("insert into classified_ad_search : " + ins.lastError().text()) ; } } delete htmlParser ; } } void SearchModel::indexProfileComment(const ProfileComment& aProfileComment) { if ( iIsFTSSupported && aProfileComment.iFingerPrint!=KNullHash ) { bool operation_success (false) ; QTextDocument* htmlParser = new QTextDocument() ; // create every time, because this method // is called from multiple threads htmlParser->setHtml(aProfileComment.iCommentText ) ; QString plainText(htmlParser->toPlainText()) ; htmlParser->clear() ; QSqlQuery ins(iModel.dataBaseConnection()) ; operation_success= ins.prepare("insert into profilecomment_search(" "docid,profilehash,commentorhash,comment,commentsubject,commentornickname) values (" ":hash1,:profilehash,:commentorhash,:comment,:commentsubject,:commentornickname)") ; if ( operation_success ) { ins.bindValue(":hash1", aProfileComment.iFingerPrint.iHash160bits[0]); ins.bindValue(":profilehash", aProfileComment.iProfileFingerPrint.toString()) ; ins.bindValue(":commentorhash",aProfileComment.iCommentorHash.toString()) ; ins.bindValue(":comment",plainText.toUtf8()) ; ins.bindValue(":commentsubject",aProfileComment.iSubject.toUtf8()) ; ins.bindValue(":commentornickname",aProfileComment.iCommentorNickName.toUtf8()) ; if ( ins.exec() == false ) { // if indexing fails, put out only log message, because we'll want // to have the actual document anyway.. QLOG_STR("insert/update into profilecomment_search exec : " + ins.lastError().text()) ; } } else { QLOG_STR("insert/update into profilecomment_search : " + ins.lastError().text()) ; } delete htmlParser ; } } void SearchModel::indexProfile(const Profile& aProfile, bool aWasUpdate) { if ( iIsFTSSupported && aProfile.iFingerPrint!=KNullHash ) { bool operation_success (false) ; QSqlQuery ins(iModel.dataBaseConnection()) ; if ( aWasUpdate == true ) { // was insert ; also do insert into index operation_success= ins.prepare("update profile_search set " "profilehash=:profilehash,nickname=:nickname,greetingtext=:greetingtext,firstname=:firstname,familyname=:familyname,city=:city,btc=:btc,state=:state where docid=:hash1") ; } else { operation_success= ins.prepare("insert into profile_search(" "docid,profilehash,nickname,greetingtext,firstname,familyname,city,btc,state) values (" ":hash1,:profilehash,:nickname,:greetingtext,:firstname,:familyname,:city,:btc,:state)") ; } if ( operation_success ) { ins.bindValue(":hash1", aProfile.iFingerPrint.iHash160bits[0]); ins.bindValue(":profilehash", aProfile.iFingerPrint.toString()) ; ins.bindValue(":nickname",aProfile.iNickName.toUtf8()) ; ins.bindValue(":greetingtext",aProfile.iGreetingText.toUtf8()) ; ins.bindValue(":firstname",aProfile.iFirstName.toUtf8()) ; ins.bindValue(":familyname",aProfile.iFamilyName.toUtf8()) ; ins.bindValue(":city",aProfile.iCityCountry.toUtf8()) ; ins.bindValue(":btc",aProfile.iBTCAddress.toUtf8()) ; ins.bindValue(":state",aProfile.iStateOfTheWorld.toUtf8()) ; if ( ins.exec() == false ) { // if indexing fails, put out only log message, because we'll want // to have the actual document anyway.. QLOG_STR("insert/update into profile_search exec : " + ins.lastError().text()) ; } } else { QLOG_STR("insert/update into profile_search : " + ins.lastError().text()) ; } } } QList SearchModel::performSearch(const QString& aForString, bool aSearchAds, bool aSearchProfiles, bool aSearchComments) { QList results ; if ( aSearchAds ) { QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("select classified_ad.hash1,classified_ad.hash2," "classified_ad.hash3,classified_ad.hash4," "classified_ad.hash5," "classified_ad_search.subject from classified_ad , " "classified_ad_search where " "classified_ad.hash1=classified_ad_search.docid and " "classified_ad_search MATCH :searchcriteria" ) ; if ( ret ) { query.bindValue(":searchcriteria", aForString.toUtf8() ) ; ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { quint32 hash1 = query.value(0).toUInt() ; quint32 hash2 = query.value(1).toUInt() ; quint32 hash3 = query.value(2).toUInt() ; quint32 hash4 = query.value(3).toUInt() ; quint32 hash5 = query.value(4).toUInt() ; SearchResultItem i ; i.iItemType = ClassifiedAd ; i.iItemHash = Hash ( hash1,hash2,hash3,hash4,hash5) ; i.iFoundFromNode = iController.getNode().nodeFingerPrint() ; if ( query.isNull(5) ) { i.iDisplayName = i.iItemHash.toString() ; } else { i.iDisplayName = query.value(5).toString() ; } results.append(i) ; } } } else { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } } // then search profiles if ( aSearchProfiles ) { QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("select profile.hash1,profile.hash2," "profile.hash3,profile.hash4," "profile.hash5," "profile.display_name from profile , " "profile_search where " "profile.hash1=profile_search.docid and " "profile_search MATCH :searchcriteria" ) ; if ( ret ) { query.bindValue(":searchcriteria", aForString.toUtf8() ) ; ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { quint32 hash1 = query.value(0).toUInt() ; quint32 hash2 = query.value(1).toUInt() ; quint32 hash3 = query.value(2).toUInt() ; quint32 hash4 = query.value(3).toUInt() ; quint32 hash5 = query.value(4).toUInt() ; SearchResultItem i ; i.iItemType = UserProfile ; i.iItemHash = Hash ( hash1,hash2,hash3,hash4,hash5) ; i.iFoundFromNode = iController.getNode().nodeFingerPrint() ; if ( query.isNull(5) ) { i.iDisplayName = i.iItemHash.toString() ; } else { i.iDisplayName = query.value(5).toString() ; } results.append(i) ; } } } else { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } } // then search comments if ( aSearchComments ) { QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("select profilecomment.hash1,profilecomment.hash2," "profilecomment.hash3,profilecomment.hash4," "profilecomment.hash5," "profilecomment.display_name from profilecomment , " "profilecomment_search where " "profilecomment.hash1=profilecomment_search.docid and " "profilecomment_search MATCH :searchcriteria" ) ; if ( ret ) { query.bindValue(":searchcriteria", aForString.toUtf8() ) ; ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { quint32 hash1 = query.value(0).toUInt() ; quint32 hash2 = query.value(1).toUInt() ; quint32 hash3 = query.value(2).toUInt() ; quint32 hash4 = query.value(3).toUInt() ; quint32 hash5 = query.value(4).toUInt() ; SearchResultItem i ; i.iItemType = UserProfileComment ; i.iItemHash = Hash ( hash1,hash2,hash3,hash4,hash5) ; i.iFoundFromNode = iController.getNode().nodeFingerPrint() ; if ( query.isNull(5) ) { i.iDisplayName = i.iItemHash.toString() ; } else { i.iDisplayName = query.value(5).toString() ; } results.append(i) ; } } } else { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } } return results ; } void SearchModel::getSearchCriteria(QString* aSearchStrPtr, bool* aSearchAdsPtr, bool* aSearchProfilesPtr, bool* aSearchCommentsPtr, Hash* aSearchIdPtr ) const { if ( iSearchString.length() > 0 && ( iSearchAds || iSearchProfiles || iSearchComments ) ) { *aSearchStrPtr = iSearchString ; *aSearchIdPtr = iSearchId ; *aSearchAdsPtr = iSearchAds ; *aSearchProfilesPtr = iSearchProfiles ; *aSearchCommentsPtr = iSearchComments ; QLOG_STR("SearchModel::getSearchCriteria, search id = " + QString::number(aSearchIdPtr->iHash160bits[0])) ; } else { *aSearchStrPtr = "" ; *aSearchIdPtr = KNullHash ; } } QVariant SearchModel::serializeSearchResults(const QList& aResults, quint32 aSearchId ) { QMap m ; m.insert(KJsonSearchResultId, aSearchId) ; QList resultSet ; for ( int i = aResults.size()-1 ; i >= 0 ; i-- ) { QMap itemContents ; switch ( aResults[i].iItemType ) { case ClassifiedAd: itemContents.insert(KJsonSearchItemType,KJsonSearchItemTypeCA) ; break ; case UserProfile: itemContents.insert(KJsonSearchItemType,KJsonSearchItemTypeProfile) ; break ; case UserProfileComment: itemContents.insert(KJsonSearchItemType,KJsonSearchItemTypeComment) ; break ; default: QLOG_STR("Unhandled search result type " + QString::number( aResults[i].iItemType ) ) ; break ; } itemContents.insert(KJsonSearchItemFP, aResults[i].iItemHash.toString()) ; itemContents.insert(KJsonSearchItemSnippet, aResults[i].iDisplayName.toUtf8()) ; QVariant item ( itemContents ) ; resultSet.append(item) ; } m.insert(KJsonSearchResultSet, resultSet) ; QVariant toplevel(m) ; return toplevel ; } bool SearchModel::deSerializeSearchResults(const QVariantMap& aResultJson, QList* aResults, quint32* aSearchId ) { bool retval ( false ) ; if ( aResultJson.contains(KJsonSearchResultId) && aResultJson.contains(KJsonSearchResultSet)) { retval = true ; *aSearchId = aResultJson[KJsonSearchResultId].toUInt() ; const QList resultset (aResultJson[KJsonSearchResultSet].toList()) ; QLOG_STR("Search results set size = " + QString::number(resultset.size())) ; foreach (const QVariant& item, resultset) { const QVariantMap m ( item.toMap() ) ; SearchResultItem resultingItem ; if ( m.contains(KJsonSearchItemType) && m[KJsonSearchItemType].toString() == KJsonSearchItemTypeCA ) { resultingItem.iItemType = ClassifiedAd ; } else if ( m.contains(KJsonSearchItemType) && m[KJsonSearchItemType].toString() == KJsonSearchItemTypeProfile ) { resultingItem.iItemType = UserProfile ; } else if ( m.contains(KJsonSearchItemType) && m[KJsonSearchItemType].toString() == KJsonSearchItemTypeComment ) { resultingItem.iItemType = UserProfileComment ; } else { retval = false ; break ; } if ( m.contains(KJsonSearchItemFP) ) { resultingItem.iItemHash.fromString(reinterpret_cast(m[KJsonSearchItemFP].toByteArray().constData())) ; } else { retval = false ; break ; } if ( m.contains(KJsonSearchItemSnippet) ) { QByteArray textOfResult ( m[KJsonSearchItemSnippet].toByteArray() ) ; QLOG_STR("Text of search result= " + QString(textOfResult)); resultingItem.iDisplayName = QString::fromUtf8(textOfResult) ; } else { retval = false ; break ; } aResults->append(resultingItem) ; } } return retval ; } void SearchModel::appendNetworkSearchResults(const QList& aResults, quint32 aSearchId, const Hash& aFromPeer) { if ( aSearchId == iSearchId.iHash160bits[0] ) { beginInsertRows(QModelIndex(), iDisplayedResults.size(), iDisplayedResults.size()) ; foreach ( const SearchResultItem& i, aResults ) { if ( ! iDisplayedResults.contains(i) ) { SearchResultItem newItem ( i ) ; newItem.iFoundFromNode = aFromPeer ; iDisplayedResults.append(newItem) ; QLOG_STR("Search result name " + newItem.iDisplayName ) ; QLOG_STR("Search result type " + QString::number(newItem.iItemType) ) ; QLOG_STR("Search result hash " + newItem.iItemHash.toString() ) ; } else { QLOG_STR("Offered search result item was already included") ; } } endInsertRows() ; } else { QLOG_STR("appendNetworkSearchResults, our id = " + QString::number(iSearchId.iHash160bits[0]) + " offered = " + QString::number(aSearchId) + " model = " + objectName()) ; LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Searchmodel ptr") ; } } bool SearchModel::SearchResultItemStruct::operator==(const SearchResultItemStruct& aItemToCompare) const { return iItemHash == aItemToCompare.iItemHash ; } classified-ads-0.13/datamodel/searchmodel.h000066400000000000000000000165561331670245300207220ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef FULLTEXTSEARCHMODEL_H #define FULLTEXTSEARCHMODEL_H #include #include "../util/hash.h" #include "../net/protocol.h" #include "../mcontroller.h" #include // is actually typedef class MModelProtocolInterface ; class CA ; class Profile ; class ProfileComment ; class QTextDocument ; // for parsing html class QSqlDatabase ; /** * @brief Model-class for performing text-based searches on objects in db * This datamodel part is dual-use ; it inherits listmodel so that * it may be used as underlaying data-container for list views. * It may also be used as engine of network searches that happen * invisibly to user e.g. those queries do not modify the content * shown to UI via QAbstractListModel. */ class SearchModel: public QAbstractListModel { Q_OBJECT public: /** * Data structure for search results. */ typedef struct SearchResultItemStruct { ProtocolItemType iItemType ;/**< If is CA, profile or comment */ Hash iItemHash ; /**< Fingerprint of item found in search */ Hash iFoundFromNode ; /**< Fingerprint of node where item was found */ QString iDisplayName ; /**< String to show on UI for this result item */ /** eevil thing, a method in struct. c++ permits. only the comparison */ bool operator==(const struct SearchResultItemStruct& a) const ; } SearchResultItem ; SearchModel(MModelProtocolInterface& aModel, MController& aController) ; ~SearchModel() ; /** * Method that performs search from local UI. This * will change model contens as is shown via * QAbstractListModel inheritance * * aSearch is the string to offer to FTS implementation * aSearchAds if true, classified ads are to be searched * aSearchProfiles if true, profiles are to be searched * aSearchComments if true, profile comments are to be searched. * aNetworkSeacrh if true no local search is performed, and datamodel * is emptied with idea that search results from * remote nodes will populate the model */ void setSearchString(const QString& aSearch, bool aSearchAds, bool aSearchProfiles, bool aSearchComments, bool aNetworkSeacrh = false ) ; /** * re-implemented from QAbstractListModel * @return number of rows in list */ virtual int rowCount(const QModelIndex & parent = QModelIndex()) const ; /** * re-implemented from QAbstractListModel * @return data to display in list */ virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const ; /** * method for actually searching the index. datamodel must * be locked when this is called */ QList performSearch(const QString& aForString, bool aSearchAds, bool aSearchProfiles, bool aSearchComments) ; /** * Method called from protocol parser in purpose of appending * search results from remote node into datamodel. Model is * locked during this call */ void appendNetworkSearchResults(const QList& aResults, quint32 aSearchId, const Hash& aFromPeer) ; /** * Method for serializing search results to be sent to peering * node. Usually items sent over to peering nodes like profiles or * comments are classes and they will (de)serialize themselves. * Search resultset is list of structures so lets have just * serialization methods here in model, these are called from * protocol formatter/parser. * * @param aResults actual results of search * @param aSearchId id from peering node * @return JSon-obj as QVariant */ static QVariant serializeSearchResults(const QList& aResults, quint32 aSearchId ) ; /** * opposite to @ref serializeSearchResults * * @param aResultJson json object containing search results. * @param aResults array where contents of aResultJson will be appended * @param aSearchId pointer to unsigned that will contain search identifier * from aResultJson * @return true on success */ static bool deSerializeSearchResults(const QVariantMap& aResultJson, QList* aResults, quint32* aSearchId ) ; /** * method for querying if search is supported at all * @return true if search is supported */ bool isFTSSupported () const { return iIsFTSSupported ; } /** method for checking if database has support for full text search */ static bool queryIfFTSSupported(QSqlDatabase aDataBase) ; /** method for creating db tables related to FTS */ static void createFTSTables(QSqlDatabase aDataBase) ; /** * method for adding a classified ad into index * @param aCa is the classified ad to add to index * @return none */ void indexClassifiedAd(const CA& aCa) ; /** * method for adding a profile-comment into index * @param aProfileComment is the comment to add to index * @return none */ void indexProfileComment(const ProfileComment& aProfileComment) ; /** * method for adding a profile into index * @param aProfile is the profile to add to index * @param aWasUpdate if the profile was updated instead of inserted * @return none */ void indexProfile(const Profile& aProfile, bool aWasUpdate = false ) ; /** * method for obtaining the search criteria inside */ void getSearchCriteria(QString* aSearchStrPtr, bool* aSearchAdsPtr, bool* aSearchProfilesPtr, bool* aSearchCommentsPtr, Hash* aSearchIdPtr ) const ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: // data MModelProtocolInterface& iModel ; QString iSearchString ; const bool iIsFTSSupported ; QList iDisplayedResults ; MController& iController ; Hash iSearchId ; /**< searches may be lengthty: this connects results */ bool iSearchAds ; bool iSearchProfiles ; bool iSearchComments ; } ; #endif classified-ads-0.13/datamodel/tclmodel.cpp000066400000000000000000000360641331670245300205660ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "tclmodel.h" #include "tclprogram.h" #include "../log.h" #include "../util/hash.h" #include "../util/ungzip.h" #include "model.h" #include #include #include #include #ifdef WIN32 #include #endif TclModel::TclModel(MController *aController, MModelProtocolInterface &aModel) : iController(*aController), iModel(aModel) { LOG_STR("TclModel::TclModel()") ; connect(this, SIGNAL( error(MController::CAErrorSituation, const QString&) ), aController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; installExamplePrograms() ; } TclModel::~TclModel() { LOG_STR("TclModel::~TclModel()") ; } Hash TclModel::locallyStoreTclProgram(const TclProgram& aProgram, const Hash& aPreviousFingerPrint ) { TclProgram possiblyExistingProgam ( tclProgramByFingerPrint ( aPreviousFingerPrint ) ) ; bool ret(false) ; QLOG_STR("Storing TCL program with hash " + aProgram.iFingerPrint.toString()) ; if ( aPreviousFingerPrint != KNullHash && possiblyExistingProgam.iFingerPrint != KNullHash ) { // there is previous version of the same program QSqlQuery query(iModel.dataBaseConnection()); ret = query.prepare ("update tclprogs set prog_name = :progname, " "prog_text=:progtext, " "time_modified=:time_modified, " "hash1 = :new_hash1, hash2=:new_hash2, " "hash3= :new_hash3, hash4=:new_hash4, " "hash5=:new_hash5 " "where hash1 = :hash1 and hash2 = :hash2 " "and hash3 = :hash3 and hash4 = :hash4 " "and hash5 = :hash5" ) ; if ( ret ) { query.bindValue(":hash1", aPreviousFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aPreviousFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aPreviousFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aPreviousFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aPreviousFingerPrint.iHash160bits[4]); query.bindValue(":progname", aProgram.programName()); QByteArray programTextCompressed (qCompress(aProgram.programText().toUtf8())) ; query.bindValue(":progtext", programTextCompressed); query.bindValue(":time_modified", QDateTime::currentDateTimeUtc().toTime_t()); query.bindValue(":new_hash1", aProgram.iFingerPrint.iHash160bits[0]); query.bindValue(":new_hash2", aProgram.iFingerPrint.iHash160bits[1]); query.bindValue(":new_hash3", aProgram.iFingerPrint.iHash160bits[2]); query.bindValue(":new_hash4", aProgram.iFingerPrint.iHash160bits[3]); query.bindValue(":new_hash5", aProgram.iFingerPrint.iHash160bits[4]); } ret = query.exec() ; if ( !ret ) { LOG_STR2("Error while tcl program update %s", qPrintable(query.lastError().text())) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { QLOG_STR("locallyStoreTclProgram update " + QString::number(ret)) ; } } else { // there were no previous version of the program QSqlQuery query3(iModel.dataBaseConnection()) ; ret = query3.prepare ( "insert into tclprogs (" "hash1,hash2,hash3,hash4,hash5," "prog_name,prog_text,time_modified) " "values ( " ":hash1,:hash2,:hash3,:hash4,:hash5," ":progname,:progtext,:time_modified)") ; if ( !ret ) { emit error(MController::DbTransactionError, query3.lastError().text()) ; } else { query3.bindValue(":progname", aProgram.programName()); QByteArray programTextCompressed (qCompress(aProgram.programText().toUtf8())) ; query3.bindValue(":progtext", programTextCompressed); query3.bindValue(":time_modified", QDateTime::currentDateTimeUtc().toTime_t()); query3.bindValue(":hash1", aProgram.iFingerPrint.iHash160bits[0]); query3.bindValue(":hash2", aProgram.iFingerPrint.iHash160bits[1]); query3.bindValue(":hash3", aProgram.iFingerPrint.iHash160bits[2]); query3.bindValue(":hash4", aProgram.iFingerPrint.iHash160bits[3]); query3.bindValue(":hash5", aProgram.iFingerPrint.iHash160bits[4]); ret = query3.exec() ; QLOG_STR("locallyStoreTclProgram insert " + QString::number(ret)) ; } if ( !ret ) { QLOG_STR("locallyStoreTclProgram " + query3.lastError().text() ) ; emit error(MController::DbTransactionError, query3.lastError().text()) ; } } QLOG_STR("Going to return hash " + Hash(ret == true ? aProgram.iFingerPrint : KNullHash).toString()); return ret == true ? aProgram.iFingerPrint : KNullHash ; } TclProgram TclModel::tclProgramByFingerPrint(const Hash& aFingerPrint) { LOG_STR("TclprogramModel::tclprogramByFingerPrint()") ; TclProgram retval ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("select prog_name,prog_text,prog_settings,time_modified from tclprogs where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( ret ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) && !query.isNull(1) ) { retval.iFingerPrint = aFingerPrint ; retval.iTimeOfPublish = query.value(3).toUInt() ; retval.setProgramName(query.value(0).toString()) ; const QByteArray programTextCompressed ( query.value(1).toByteArray() ); retval.setProgramText(qUncompress(programTextCompressed)) ; } } return retval ; } QMap TclModel::getListOfTclPrograms() { QSqlQuery query(iModel.dataBaseConnection()); QMap retval ; bool ret ; ret = query.prepare ("select hash1,hash2,hash3,hash4,hash5," "prog_name from tclprogs order by time_modified" ) ; if ( ret ) { ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { while ( query.next() ) { quint32 hash1 = query.value(0).toUInt() ; quint32 hash2 = query.value(1).toUInt() ; quint32 hash3 = query.value(2).toUInt() ; quint32 hash4 = query.value(3).toUInt() ; quint32 hash5 = query.value(4).toUInt() ; QString programName ( QString::fromUtf8(query.value(5).toByteArray()) ) ; QLOG_STR("Appending to list of TCL programs in storage: " + programName) ; retval.insert(programName , Hash ( hash1,hash2,hash3,hash4,hash5) ); } } } else { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } return retval ; } bool TclModel::discardTclProgram(const Hash& aFingerPrint) { QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("delete from tclprogs where hash1=:hash1 and hash2=:hash2 and " "hash3=:hash3 and hash4=:hash4 and hash5=:hash5" ) ; if ( ret ) { query.bindValue(":hash1", aFingerPrint.iHash160bits[0]); query.bindValue(":hash2", aFingerPrint.iHash160bits[1]); query.bindValue(":hash3", aFingerPrint.iHash160bits[2]); query.bindValue(":hash4", aFingerPrint.iHash160bits[3]); query.bindValue(":hash5", aFingerPrint.iHash160bits[4]); ret = query.exec() ; } QLOG_STR("TclModel::discardTclProgram " + QString::number(ret)) ; return ret ; } QString TclModel::storeTCLProgLocalData(const Hash& aProgram, const QByteArray& aData) { QLOG_STR("About to store data len =" + QString::number(aData.size())) ; QLOG_STR("Storing TCL program data, prog hash = " + aProgram.toString()) ; // check if program is there: TclProgram prog = tclProgramByFingerPrint(aProgram) ; if ( prog.iFingerPrint == KNullHash ) { return "No program found" ; } else { QSqlQuery query(iModel.dataBaseConnection()); bool ret ; ret = query.prepare ("update tclprogs set prog_data = :d where hash1=:hash1 and hash2=:hash2 and " "hash3=:hash3 and hash4=:hash4 and hash5=:hash5" ) ; if ( ret ) { query.bindValue(":hash1", aProgram.iHash160bits[0]); query.bindValue(":hash2", aProgram.iHash160bits[1]); query.bindValue(":hash3", aProgram.iHash160bits[2]); query.bindValue(":hash4", aProgram.iHash160bits[3]); query.bindValue(":hash5", aProgram.iHash160bits[4]); QLOG_STR("About to store data " + QString(aData)) ; if ( aData.size() > 0 ) { QByteArray programDataCompressed (qCompress(aData)) ; query.bindValue(":d", programDataCompressed); } else { query.bindValue(":d", QString()); // null value } ret = query.exec() ; if ( query.numRowsAffected() == 0 ) { return ("Data not saved, is program stored?") ; } } QLOG_STR("TclModel::storeTCLProgLocalData " + QString::number(ret)) ; if ( ret == false ) { return query.lastError().text(); } } return QString::null ; } QByteArray TclModel::retrieveTCLProgLocalData(const Hash& aProgram) { QByteArray retval ; QSqlQuery query(iModel.dataBaseConnection()); bool ret ; QLOG_STR("Retrieving TCL program data, prog hash = " + aProgram.toString()) ; ret = query.prepare ("select prog_data from tclprogs where hash1 = :hash1 and hash2 = :hash2 and hash3 = :hash3 and hash4 = :hash4 and hash5 = :hash5" ) ; if ( ret ) { query.bindValue(":hash1", aProgram.iHash160bits[0]); query.bindValue(":hash2", aProgram.iHash160bits[1]); query.bindValue(":hash3", aProgram.iHash160bits[2]); query.bindValue(":hash4", aProgram.iHash160bits[3]); query.bindValue(":hash5", aProgram.iHash160bits[4]); } ret = query.exec() ; if ( !ret ) { QLOG_STR(query.lastError().text() + " "+ __FILE__ + QString::number(__LINE__)) ; emit error(MController::DbTransactionError, query.lastError().text()) ; } else { if ( query.next() && !query.isNull(0) ) { const QByteArray programDataCompressed ( query.value(0).toByteArray() ); retval.append(qUncompress(programDataCompressed)) ; } } return retval ; } void TclModel::installExamplePrograms() { if ( getListOfTclPrograms().isEmpty() ) { // this is our first run or user deleted all example programs. // bring 'em back: #ifdef WIN32 // in windows try fetch examples from path relative to // the executable, see file windows/nsis-installer.nsi for details QString examplesDirName(QCoreApplication::applicationDirPath()) ; examplesDirName.append(QDir::separator()) ; examplesDirName.append("examples") ; QDir examplesDir (examplesDirName) ; #else // in unix this path appears in classified-ads.pro and // is used by "make install" phase. QDir examplesDir ("/usr/share/doc/classified-ads/examples") ; #endif if ( !examplesDir.exists() ) { return ; // no examples, obviously } examplesDir.setFilter(QDir::Files | QDir::Readable) ; QStringList fileTypes ; // debian installation insists on compression of example files ; we // need to apply un-gzip here to make examples usable again: fileTypes << "*.tcl" << "*.tcl.gz" ; const QStringList exampleFiles ( examplesDir.entryList(fileTypes) ) ; foreach ( const QString& exampleFileName, exampleFiles ) { QLOG_STR(exampleFileName) ; QFile exampleFile(examplesDir.filePath(exampleFileName)); if (exampleFile.open(QIODevice::ReadOnly)) { QByteArray exampleContents ( exampleFile.readAll() ) ; if ( exampleContents.length() > 0 ) { TclProgram p ; if ( exampleFileName.toLower().endsWith (".tcl.gz" ) ) { QByteArray uncompressed ; bool success ; uncompressed.append ( UnGZip::unGZip(exampleContents, &success) ) ; if ( !success || ( uncompressed.length() < 1 ) ) { continue ; } else { exampleContents.clear() ; exampleContents.append(uncompressed) ; } } p.setProgramText(exampleContents) ; p.setProgramName(exampleFileName) ; const QFileInfo info ( exampleFile ) ; p.iTimeOfPublish = info.lastModified().toTime_t() ; locallyStoreTclProgram(p) ; } } } } } classified-ads-0.13/datamodel/tclmodel.h000066400000000000000000000076441331670245300202350ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_TCLPROGRAMMODEL_H #define CLASSIFIED_TCLPROGRAMMODEL_H #include #include "../mcontroller.h" // because enum from there is needed #include "mmodelprotocolinterface.h" #include "datamodelbase.h" class Hash ; class Profile ; class TclProgram ; /** * @brief Datamodel-part of storage related to TCL-programs * * This class provides with storage of TCL-scripts themselves, * possible settings related to TCL-scripts. See class @ref TclProgram. */ class TclModel : public QObject { Q_OBJECT public: TclModel(MController *aMController, MModelProtocolInterface &aModel) ; ~TclModel() ; /** * Method for putting tcl program into local storage. * Method performs insert or update. Logick is this: if there is * program in db with @ref aPreviousFingerPrint then update is * performed. In this case previous fingerprint won't be valid * any more. Otherwise insert is done and method returns fingerprint * of the program stored. * * @param aProgram is the program to store. * @param aPreviousFingerPrint if persisting program from UI, fingerprint of * the program * @return fingerprint of program saved. */ Hash locallyStoreTclProgram(const TclProgram& aProgram, const Hash& aPreviousFingerPrint = KNullHash) ; /** * method for getting tcl progrom from local storage */ TclProgram tclProgramByFingerPrint(const Hash& aFingerPrint) ; /** * method for removing tcl script from local storage * * @return true if program was deleted */ bool discardTclProgram(const Hash& aFingerPrint) ; /** * method for getting list of tcl programs in local storage * @return Listing as qmap where key is the program name, * and value is fingerprint of the program */ QMap getListOfTclPrograms() ; /** * TCL programs may store data locally, key to the data is * hash of the tcl program itself and the data is a * byte-array. Previous contents are overwritten. * * @param aProgram identifies the program * @param aData is databytes * @return empty string on success */ QString storeTCLProgLocalData(const Hash& aProgram, const QByteArray& aData) ; /** * Method for retrieving local data of a tcl program * @param aProgram identifies the program * * @return data or empty */ QByteArray retrieveTCLProgLocalData(const Hash& aProgram) ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: //methods /** * Method that scans directory /usr/share/doc/classified-ads/examples * for files ending *.tcl and installs them into database table * of tcl programs. This is done only if db table is empty, as it * is during first install. */ void installExamplePrograms() ; private: // member variables: MController& iController ; MModelProtocolInterface& iModel ; } ; #endif classified-ads-0.13/datamodel/tclprogram.cpp000066400000000000000000000033751331670245300211340ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2016. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "tclprogram.h" #include "../util/hash.h" #include "../log.h" #include "../util/jsonwrapper.h" #include #include "../mcontroller.h" #include "model.h" TclProgram::TclProgram() : iFingerPrint(KNullHash), iTimeOfPublish(0) { LOG_STR("TclProgram::TclProgram()") ; } TclProgram::~TclProgram() { LOG_STR("TclProgram::~TclProgram()") ; } QString TclProgram::displayName() const { QString retval ; if ( iProgramName.length() > 0 ) { retval = iProgramName ; } else { retval = iFingerPrint.toString() ; } return retval ; } void TclProgram::setProgramText(const QString& aText) { iProgramText = aText ; if ( iProgramText.length() == 0 ) { iFingerPrint = KNullHash ; } else { iFingerPrint.calculate(iProgramText.toUtf8()) ; } } void TclProgram::setProgramName(const QString& aName) { iProgramName = aName ; } classified-ads-0.13/datamodel/tclprogram.h000066400000000000000000000033721331670245300205760ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2016. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CA_TCLPROGRAM_H #define CA_TCLPROGRAM_H #include #include "../util/hash.h" // for class Hash class MController ; /** * @brief Carrier-class for TCL-program and related settings * * Instances of this class are stored and retrieved using * @ref TclModel. */ class TclProgram { public: TclProgram() ; /**< constructor */ ~TclProgram() ; /**< destructor */ QString displayName() const ; Hash iFingerPrint ; quint32 iTimeOfPublish ; /**< seconds since 1-jan-1970 */ const QString& programText() const { return iProgramText ; } ; const QString& programName() const { return iProgramName ; } ; void setProgramText(const QString& aText) ; void setProgramName(const QString& aName) ; private: QString iProgramText ; /**< used with setter and getter */ QString iProgramName ; /**< used with setter and getter */ } ; #endif classified-ads-0.13/datamodel/trusttreemodel.cpp000066400000000000000000000343221331670245300220400ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "trusttreemodel.h" #include "../log.h" #include "../util/hash.h" #include "model.h" #include #include #include "profile.h" #include "profilemodel.h" #include static const char *KTrustTreeTimeStamp = "treeTs" ; static const char *KTrustTree = "tree" ; static const char *KTrustTreeTrustingFp = "fp" ; static const char *KTrustTreeTrustedFp = "trustedFp" ; static const char *KTrustTreeList = "list" ; static const char *KTrustTreeLevel = "level" ; /** * How many levels of trust-lists to dig through */ static const char KHowManyLevelsDeep ( 3 ) ; TrustTreeModel::TrustTreeModel(MController *aController, const MModelProtocolInterface &aModel) : iController(*aController), iModel(aModel), iTrustTree(NULL), iLastUpdateTime(0) { LOG_STR("TrustTreeModel::TrustTreeModel()") ; connect(this, SIGNAL( error(MController::CAErrorSituation, const QString&) ), aController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; iTrustTree = new QMap() ; } TrustTreeModel::~TrustTreeModel() { LOG_STR("TrustTreeModel::~TrustTreeModel()") ; delete iTrustTree ; } void TrustTreeModel::contentReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfReceivdContent) { if ( aTypeOfReceivdContent == UserProfile ) { QLOG_STR("TrustTreeModel::contentReceived(), profile=" + aHashOfContent.toString() ) ; iController.model().lock() ; TrustTreeItem operatorFromTrustList ( (*iTrustTree)[aHashOfContent] ) ; if ( operatorFromTrustList.iTrustingOperator != KNullHash ) { // ok, operator was in trust list. operatorFromTrustList.iNeedsUpdate = true ; recalculateTrust() ; } iController.model().unlock() ; } } void TrustTreeModel::offerTrustList(const Hash& aTrustlistOwnerProfile, const QString& aOwnerProfileDisplayName, const QList& aList) { TrustTreeItem defaultValue ; defaultValue.iTrustingOperator = KNullHash ; TrustTreeItem operatorFromTrustList = iTrustTree->value(aTrustlistOwnerProfile,defaultValue) ; if ( operatorFromTrustList.iTrustingOperator != KNullHash ) { // ok, operator was in trust list. if ( operatorFromTrustList.iLevel < KHowManyLevelsDeep ) { // ok, we need to consider her trust list too: iTrustTree->remove(aTrustlistOwnerProfile) ; TrustTreeItem itemToAdd ; // initially set trusting operator to self, it gets updated later itemToAdd.iTrustingOperator = aTrustlistOwnerProfile ; itemToAdd.iOperatorName = aOwnerProfileDisplayName ; itemToAdd.iTrustList = aList ; itemToAdd.iLevel = operatorFromTrustList.iLevel ; iTrustTree->insert(aTrustlistOwnerProfile, itemToAdd ) ; recalculateTrust() ; } } } bool TrustTreeModel::isProfileTrusted(const Hash& aProfile, QString *aDisplayNameOfTrustingProfile, Hash* aFpOfTrustingProfile ) const { TrustTreeItem defaultValue ; defaultValue.iTrustingOperator = KNullHash ; TrustTreeItem operatorFromTrustList = iTrustTree->value(aProfile,defaultValue) ; if ( operatorFromTrustList.iTrustingOperator == KNullHash ) { // default value was returned, profile was not found from trust list return false ; } else { if ( aDisplayNameOfTrustingProfile ) { // get name of operator who trusts: TrustTreeItem trustingOperator = iTrustTree->value(operatorFromTrustList.iTrustingOperator) ; *aDisplayNameOfTrustingProfile = trustingOperator.iOperatorName ; } if ( aFpOfTrustingProfile ) { *aFpOfTrustingProfile = operatorFromTrustList.iTrustingOperator ; } return true ; } } // work-horse here void TrustTreeModel::recalculateTrust() { Profile *currentlySelectedProfile = iController.model().profileModel().profileByFingerPrint(iController.profileInUse(),false,true) ; if ( currentlySelectedProfile ) { // stage 0 // initialize level of every potentially untrustworthy sucker on the list QMutableMapIterator i(*iTrustTree); while (i.hasNext()) { i.next() ; i.value().iLevel = -1; } // stage 1 // initially trust self setProfileTrustedInList(iController.profileInUse(), iController.profileInUse(), 0) ; // stage 2 // loop given number of levels of trust. must start from // 0 as it was given to self as trust level for ( char level = 0 ; level < KHowManyLevelsDeep ; level++ ) { QLOG_STR("Calculation level = " + QString::number(level)) ; QMutableMapIterator iter(*iTrustTree); while (iter.hasNext()) { iter.next() ; QLOG_STR("Item " + iter.key().toString() + " has list len " + QString::number(iter.value().iTrustList.count())) ; if ( iter.value().iLevel == level ) { foreach( const Hash& trustedProfile, iter.value().iTrustList ) { setProfileTrustedInList(trustedProfile, iter.key(), level+1) ; } } } } // stage 3 // should there have been any operators previously on list that still have // level -1 it means they're not trusted by anyone -> removal QMutableMapIterator iter(*iTrustTree); while (iter.hasNext()) { iter.next() ; if (iter.value().iLevel == -1 ) { iTrustTree->remove(iter.key()) ; } } delete currentlySelectedProfile ; } } void TrustTreeModel::setProfileTrustedInList(const Hash& aTrustedProfile, const Hash& aTrustingProfile, int aLevel ) { QLOG_STR("setProfileTrustedInList " + aTrustedProfile.toString() + " l " + QString::number(aLevel)) ; TrustTreeItem& operatorFromTrustList ( (*iTrustTree)[aTrustedProfile] ) ; if ( operatorFromTrustList.iTrustingOperator == KNullHash ) { // default value was returned, profile was not found from trust list // try obtain profile from model TrustTreeItem newItem ; newItem.iTrustingOperator = aTrustingProfile ; newItem.iLevel = aLevel ; newItem.iNeedsUpdate = false ; Profile *newProfile = iController.model().profileModel().profileByFingerPrint(aTrustedProfile,false,true) ; if ( newProfile ) { newItem.iTrustList = newProfile->iTrustList ; newItem.iOperatorName = newProfile->displayName() ; delete newProfile ; } iTrustTree->insert(aTrustedProfile, newItem) ; QLOG_STR("Operator " + aTrustedProfile.toString() + " was not on list, added, name = " + newItem.iOperatorName + " level " + QString::number(newItem.iLevel) + " list len = " + QString::number(newItem.iTrustList.count())) ; } else { if ( operatorFromTrustList.iLevel == -1 ) { // do not set 2nd time operatorFromTrustList.iLevel = aLevel ; operatorFromTrustList.iTrustingOperator = aTrustingProfile ; if ( operatorFromTrustList.iOperatorName.isEmpty() || operatorFromTrustList.iNeedsUpdate ) { // try update name Profile *oldProfile = iController.model().profileModel().profileByFingerPrint(aTrustedProfile,false,true) ; if ( oldProfile ) { operatorFromTrustList.iTrustList = oldProfile->iTrustList ; operatorFromTrustList.iOperatorName = oldProfile->displayName() ; delete oldProfile ; } operatorFromTrustList.iNeedsUpdate = false ; } QLOG_STR("Operator " + aTrustedProfile.toString() + " was on list, modified, name = " + operatorFromTrustList.iOperatorName + " level " + QString::number(operatorFromTrustList.iLevel) + " list len = " + QString::number(operatorFromTrustList.iTrustList.count())) ; } } } void TrustTreeModel::initModel(const QVariant& aPreviousSettings) { iTrustTree->clear() ; QVariantMap m (aPreviousSettings.toMap()) ; if ( m.contains(KTrustTreeTimeStamp)) { iLastUpdateTime = m[KTrustTreeTimeStamp].toUInt() ; } if ( m.contains(KTrustTree)) { QVariantList tree ( m[KTrustTree].toList()) ; QListIterator i(tree); // tree is actually stored as a list while (i.hasNext()) { // item in tree is a map QVariantMap itemInTree ( i.next().toMap() ) ; if ( itemInTree.contains(KTrustTreeTrustingFp) && itemInTree.contains(KTrustTreeTrustedFp) && itemInTree.contains(KTrustTreeLevel) ) { TrustTreeItem newItem ; newItem.iTrustingOperator.fromQVariant( itemInTree[KTrustTreeTrustingFp] ) ; newItem.iLevel = itemInTree[KTrustTreeLevel].toInt() ; newItem.iNeedsUpdate = false ; Hash trustedFp ; trustedFp.fromQVariant(itemInTree[KTrustTreeTrustedFp]) ; if ( itemInTree.contains(KTrustTreeList ) ) { // if profile has no trust list, this is missing QVariantList trustList ( m[KTrustTreeList].toList() ) ; foreach ( const QVariant trustListItem , trustList ) { Hash trustListItemHash ; trustListItemHash.fromQVariant(trustListItem) ; newItem.iTrustList.append(trustListItemHash) ; } } } } } if ( !iTrustTree->contains(iController.profileInUse()) ) { // must include self .. should have been there in settings but // maybe we're initializing for the very first time setProfileTrustedInList(iController.profileInUse(), iController.profileInUse(), 0) ; } // then update profiles that are on list and that have // been updated since last time QSqlQuery q(iController.model().dataBaseConnection()) ; QStringList queryString("select hash1,hash2,hash3,hash4,hash5 from profile where time_of_publish > :last_update_time and hash1 in (0") ; QMapIterator i(*iTrustTree); while (i.hasNext()) { i.next() ; queryString.append(","+QString::number(i.key().iHash160bits[0])) ; } QList profilesThatNeedUpdating ; queryString.append(")") ; q.prepare (queryString.join("")) ; q.bindValue(":last_update_time", iLastUpdateTime) ; if ( q.exec() ) { while(q.next() ) { Hash hashFoundFromDb ( q.value(0).toUInt(), q.value(1).toUInt(), q.value(2).toUInt(), q.value(3).toUInt(), q.value(4).toUInt()) ; if ( iTrustTree->contains(hashFoundFromDb) ) { profilesThatNeedUpdating << hashFoundFromDb ; } } } foreach ( const Hash& profileInNeedOfUpdate,profilesThatNeedUpdating ) { Profile* p ( iController.model().profileModel().profileByFingerPrint(profileInNeedOfUpdate,false,true) ); if ( p ) { TrustTreeItem& operatorFromTrustList ( (*iTrustTree)[profileInNeedOfUpdate] ) ; operatorFromTrustList.iTrustList = p->iTrustList ; operatorFromTrustList.iOperatorName = p->displayName() ; delete p ; } } iLastUpdateTime = QDateTime::currentDateTimeUtc().toTime_t() ; recalculateTrust() ; } QVariant TrustTreeModel::trustTreeSettings() const { // in practice the qvariant is a qvariantmap. data is stored in // keys in the map. QMap m ; m.insert(KTrustTreeTimeStamp, iLastUpdateTime) ; // insert the tree as array of qvariants if ( iTrustTree->count() > 0 ) { QVariantList tree ; // tree is actually stored as a list QMapIterator i(*iTrustTree); while (i.hasNext()) { QVariantMap item ; i.next() ; item.insert(KTrustTreeTrustingFp, i.key().toQVariant()) ; item.insert(KTrustTreeTrustedFp, i.value().iTrustingOperator.toQVariant()) ; item.insert(KTrustTreeLevel, i.value().iLevel) ; if ( i.value().iTrustList.count() > 0 ) { QVariantList trustList ; foreach ( const Hash& listItem, i.value().iTrustList) { trustList.append(listItem.toQVariant()) ; } item.insert(KTrustTreeList, trustList) ; } tree.append(QVariant(item)) ; } m.insert(KTrustTree, tree) ; } return QVariant(m) ; } void TrustTreeModel::clear(void) { if ( iTrustTree ) { iTrustTree->clear() ; } } classified-ads-0.13/datamodel/trusttreemodel.h000066400000000000000000000136551331670245300215130ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti Jarvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_TRUSTTREEMODEL_H #define CLASSIFIED_TRUSTTREEMODEL_H #include "../mcontroller.h" // because enum from there is needed #include "datamodelbase.h" #include "../net/protocol.h" // for ProtocolItemType class Hash ; class MModelProtocolInterface ; class Profile ; /** * @brief This is is part of datamodel for trust tree related operation * * Trust list of part of operator profile. Simple as that. This class * contains algorithms manipulating a tree constructed from lists of * operators where operators expores (dis)trust of * each others in complex web of nodes and vertices. Main goal is * fast query about trustworthiness of given operator profile. * * Classified ads treats trust as boolean ; operator either is trusted * or not. There is no distinction between recognizing the operators * identity and assigning trust to her - if operator is trusted it must * mean both at the same time: trusted operator is identified at * least somehow and in addition is recognized as trustworthy animal, * person or bot. * * Output is also boolean. There are algorithms for producing floating * point numbers for this purpose .. say, half of your trusted friends * give some unknown operator "true" for trust, the other half does not * (either recognize or trust) so you could decide that his operator * enjoys some 50% trustworthiness - this is not done. Motivation is * simplicity both in concept and algorithms, the floating point * methods tend to be computationally rather expensive. */ class TrustTreeModel : public QObject { Q_OBJECT public: TrustTreeModel(MController *aMController, const MModelProtocolInterface &aModel) ; ~TrustTreeModel() ; /** * method for injecting a trust list into model. This is called * when there is suspicion that trust list of a profile may * have been changed and this causes re-calculation of the trust * tree * * @param aTrustListOwnerProfile fingerprint of profile * whose list is about to get processed * @param aOwnerProfileDisplayName human-readable name for * the profile * @param aList is the list. This is a list of fingerprints * of other profiles that aTrustListOwnerProfile indicates * to be trustworthy. */ void offerTrustList(const Hash& aTrustListOwnerProfile, const QString& aOwnerProfileDisplayName, const QList& aList) ; /** * Method for making a query about a profile. * * @param aProfile fingerprint of the profile queried * @param aDisplayNameOfTrustingProfile pointer to string that, * if non-null, in case of this method returns true, * will have its value set to display-name of some * profile that trusts aProfile * @param aFpOfTrustingProfile behaves the same way as * aDisplayNameOfTrustingProfile but instead of display-name * carries a fingerprint * * @return true if profile is trusted. */ bool isProfileTrusted(const Hash& aProfile, QString *aDisplayNameOfTrustingProfile, Hash* aFpOfTrustingProfile ) const ; /** * method for initializing the model when profile changes * @param aPreviousSettings settings previously obtained using * @ref trustTreeSettings method * */ void initModel(const QVariant& aPreviousSettings) ; /** * Method that exports model state as QVariant. */ QVariant trustTreeSettings() const ; /** * method for emptying model contents in event of profile change */ void clear(void) ; public slots: /** activated when new profile is received */ void contentReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfReceivdContent) ; private: // methods /** * method that takes contents of iTrustTree and if there is * any additions etc. takes them into account */ void recalculateTrust() ; /** * sets profile trusted in trust list. called from recalculateTrust */ void setProfileTrustedInList(const Hash& aTrustedProfile, const Hash& aTrustingProfile, int aLevel) ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: // member variables: MController& iController ; const MModelProtocolInterface& iModel ; /** * internal trust list item */ typedef struct TrustTreeItemStruct { Hash iTrustingOperator ; /**< who trusts this operator here */ QString iOperatorName ; /**< name of operator */ QList iTrustList ; /**< trust list of the trusted operator */ signed char iLevel ; /**< how many levels deep from our own profile */ bool iNeedsUpdate ; /**< profile needs to be updated from db */ } TrustTreeItem ; QMap* iTrustTree ; unsigned iLastUpdateTime ; /** ts of latest model update */ } ; #endif classified-ads-0.13/datamodel/voicecall.cpp000066400000000000000000000122531331670245300207160ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "voicecall.h" #include "../log.h" #include "../util/jsonwrapper.h" #include #include "../net/node.h" static const char *KVoiceCallJSonTimeElement = "timeOfPublish" ; static const char *KJSonVoiceCallVersion = "version" ; static const char *KJSonVoiceCallOkToProceed = "okToProceed" ; static const char *KJSonVoiceCallOriginatorKey = "key" ; static const char *KJSonVoiceCallDestinationKey = "destkey" ; static const char *KJSonVoiceCallOriginatingNode = "originating" ; static const char *KJSonVoiceCallDestinationNode = "dest" ; static const char *KJSonVoiceCallAesKey = "aeskey" ; static const char *KJSonVoiceCallId = "callid" ; static const int KJSONVoiceCallVersionValue ( 1 ) ; extern Hash KNullHash ; VoiceCall::VoiceCall() : iCallId(0), iOriginatingNode(KNullHash), iDestinationNode(KNullHash), iOkToProceed(true), iTimeOfCallAttempt(0) { LOG_STR("VoiceCall::VoiceCall()") ; } VoiceCall::~VoiceCall() { LOG_STR("VoiceCall::~VoiceCall()") ; } QByteArray VoiceCall::asJSon() const { // first have a map ; that is the top-level JSon-object QMap m ; m.insert(KJSonVoiceCallVersion, KJSONVoiceCallVersionValue) ; m.insert(KVoiceCallJSonTimeElement, QDateTime::currentDateTimeUtc().toTime_t()) ; m.insert(KJSonVoiceCallOkToProceed,iOkToProceed) ; m.insert(KJSonVoiceCallId, iCallId) ; if ( iOriginatingOperatorKey.length() > 0 ) { m.insert(KJSonVoiceCallOriginatorKey, iOriginatingOperatorKey.constData()) ; } if ( iDestinationOperatorKey.length() > 0 ) { m.insert(KJSonVoiceCallDestinationKey, iDestinationOperatorKey.constData()) ; } if ( iOriginatingNode != KNullHash ) { m.insert(KJSonVoiceCallOriginatingNode, iOriginatingNode.toString()) ; } if ( iDestinationNode != KNullHash ) { m.insert(KJSonVoiceCallDestinationNode, iDestinationNode.toString()) ; } if ( iSymmetricAESKey.size() > 0 ) { m.insert(KJSonVoiceCallAesKey, iSymmetricAESKey.constData()) ; } QVariant j (m); // then put the map inside QVariant and that // may then be serialized in libqjson-0.7 and 0.8 QByteArray retval ( JSonWrapper::serialize(j) ) ; LOG_STR2("voicecall %s", qPrintable(QString(retval))) ; return retval ; } bool VoiceCall::fromJSon(const QByteArray &aJSonBytes ) { bool ok (true); QVariantMap result ( JSonWrapper::parse (aJSonBytes, &ok) ); if (!ok) { QLOG_STR("QJson::Parser failed to parse " + QString::number(aJSonBytes.size()) + " bytes") ; return false ; } else { QLOG_STR("VoiceCall parse ok") ; } if ( result.contains(KVoiceCallJSonTimeElement) ) { iTimeOfCallAttempt = result[KVoiceCallJSonTimeElement].toInt() ; } if ( result.contains(KJSonVoiceCallOkToProceed) ) { iOkToProceed = result[KJSonVoiceCallOkToProceed].toBool() ; } else { ok = false ; } if ( result.contains(KJSonVoiceCallId) ) { iCallId = result[KJSonVoiceCallId].toInt() ; } else { ok = false ; } if ( result.contains(KJSonVoiceCallOriginatorKey) ) { iOriginatingOperatorKey.clear() ; iOriginatingOperatorKey.append(result[KJSonVoiceCallOriginatorKey].toByteArray()) ; } else { ok = false ; } if ( result.contains(KJSonVoiceCallDestinationKey) ) { iDestinationOperatorKey.clear() ; iDestinationOperatorKey.append(result[KJSonVoiceCallDestinationKey].toByteArray()) ; } else { // it is ok if this data is missing } if ( result.contains(KJSonVoiceCallOriginatingNode) ) { iOriginatingNode.fromString((const unsigned char *)QString::fromUtf8(result[KJSonVoiceCallOriginatingNode].toByteArray()).toLatin1().constData()) ; } else { ok = false ; } if ( result.contains(KJSonVoiceCallDestinationNode) ) { iDestinationNode.fromString((const unsigned char *)QString::fromUtf8(result[KJSonVoiceCallDestinationNode].toByteArray()).toLatin1().constData()) ; } else { ok = false ; } if ( iOriginatingNode == KNullHash || iDestinationNode == KNullHash ) { ok = false ; } if ( result.contains(KJSonVoiceCallAesKey) ) { iSymmetricAESKey.clear() ; iSymmetricAESKey.append(result[KJSonVoiceCallAesKey].toByteArray()) ; } return ok ; } classified-ads-0.13/datamodel/voicecall.h000066400000000000000000000063031331670245300203620ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VOICECALL_H #define VOICECALL_H #include #include "../util/hash.h" // for class Hash class MController ; class Profile ; class Node ; /** * @brief Carrier-class handling audio negotiation setup and data * * DTO object that typically is not stored but may be transferred * in network. This contains data related to real-time audio data * sent between nodes, either directly, over some protocol, or * via proxy host. Here "VoiceCall" means a audio link between 2 * nodes. If there ever is some kind of "conference call" function, * it will include or encapsulate several instances of this class. */ class VoiceCall { public: VoiceCall() ; /**< constructor */ ~VoiceCall() ; /**< destructor */ QByteArray asJSon() const ; /**< returns voicecall data as JSon stream */ bool fromJSon(const QByteArray &aJSonBytes) ; /**< parses json into members*/ /** * Call-id. This is identification number chosen by originating * party ; subsequent transactions will contain this number to * help in keeping track about what belongs where */ quint32 iCallId ; /** * voice calls have direction at setup phase: one node initiates * call attempt that is destined to some other node. Here is * originating node */ Hash iOriginatingNode ; /** * Call destination node */ Hash iDestinationNode ; /** * Encryption key of the operator who is initiating the call. PEM. */ QByteArray iOriginatingOperatorKey ; /** * Encryption key of the operator who answered the call. PEM. * This is empty when call is initiated and if call accepter * of the call wants to retain her identity. */ QByteArray iDestinationOperatorKey ; /** * Verdict of the call attempt from destination node: if the recipient * does not wish to receive the call, she will set this to false * and return this DTO. Initial value is naturally "true". */ bool iOkToProceed ; /** * time of call attempt */ time_t iTimeOfCallAttempt ; /** * Symmetric encryption key to use if sending call data over * unsecure channel */ QByteArray iSymmetricAESKey ; /** * Who are we talking with, friendly name. Used for UI purposes, * not transferred over network */ QString iPeerOperatorNick ; } ; #endif classified-ads-0.13/doc/000077500000000000000000000000001331670245300150615ustar00rootroot00000000000000classified-ads-0.13/doc/Doxyfile000066400000000000000000000007701331670245300165730ustar00rootroot00000000000000PROJECT_NAME = "Classified ads" INPUT = .. RECURSIVE = YES EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES FILE_PATTERNS = *.h INCLUDE_PATH = . WARNINGS = YES PERL_PATH = /usr/bin/perl SEARCHENGINE = NO OUTPUT_DIRECTORY = doxygen.generated GENERATE_HTML = YES HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = GENERATE_LATEX = NO GENERATE_RTF = NO GENERATE_MAN = NO GENERATE_XML = NO classified-ads-0.13/doc/ads-search.png000066400000000000000000003747031331670245300176170ustar00rootroot00000000000000‰PNG  IHDRЂb/nТbKGDџџџ НЇ“ pHYsФФ•+tIMEп 'фWРtEXtCommentCreated with GIMPW IDATxкьwœѕ§џŸŸйv ИТGЏVˆXE”Ф.hь-Б‹‰-~=ж_ŒЦо VPlIŒБЗиЂ$*6Tšєw\Пл:Ÿп{ЗЗefvfwoя€Я‹ЧrЛ3ŸЯћѓ™ЯДїsоŸЯgФЗп,#Єш€.Hа… ЛЊ:а—вђ ž|ъ)ЊЊЊшеЋЅЅЅтёx№zНhš†ЫхBг44M@г4„†РєoћwблDIIIIIЉЋеPЗ…ђŠо<ўФ“TUUQZZJii)xН^<.—+vnПЗЦпЇуязFї_ЃпЩŠ_жддDП~§ђк7nЄwяо–iVз§ФWОЪкњ…„e˜в‚J&9ž]њMъš'сЛŸыйeXOXќ}OjІJJJJJJёїg@м§9ЂЙ:юЯDлНЙ§ўћ'л3ўoм§7љ~œpї•2х~џ+(! чзЉIWц>с…OPвЫGЏ>…[šygщ3Ќo^ЫЄa'ц}пљƒ:7Э\ФcзьN"З:˜•ђ~ўИ ЃЇДЫƒЎЙ‰hnЂ*э`ˆH8СuКЫЫBд%xМ |BDЏ:\m­эƒ”hš0ќ+Dл5Љ­ „шXоС€шЖlДэ \€ІKJЄ&а„D  Z”+бЃuЁ к'M€;,!нEXDo нйКоO ]#р.@зМD„‡0nBвК†д5\BЃ§_КЇщžЖnЯO;””””””нŸУ‰їчtЁIДнЃ5:юбІQ=–в§ъўpљ)&Y9™‘•“i lсЭвкА‰‚=Рќѕ_0Иl}{ Эka№xн"р(џF)џчЛ $ —./aсAŠ(ˆ z„FOэŽуS:сх шD ]>tЭу—tŒg„h J“mзžЖПBoЯјыMXЖƒi:шмAгd D]ЂЏ$.-Кё!й š Ё€; ЛˆˆдЩшН FЛЋš ?@A!КзGФу%фrЃЙмH—]sсв:К§˜ниДЖpПaW\„!ѕ'? PRRRRRRjЛ? ?"сўv{ЂїgЭ…lЛ7k"њINЬ‡ЭФп›уяШТр~П> 4ZeўлСN™.o9у†ŸФ'+ц@OxЫ"|НёS~Y’gEр-і@р–ъXVЪџљу.щ@Єэк!нЎ|F{Іюл>х>"ЩьЗWSлФвщ[цуЈ_іЇЌ‡‡ „‚^ZЅ ”Ьzc%cFіb}u+Ѕ=МLо#:цѕЃy›in0uR?uРorr,g+O^бгм[HиЫOб1F4>мЈы:КЗ –7€†ЋэёДЋ< ЂœН „бklГ+ @Д§Z"у#ЂfŒРvЧ IIиЁxu№Ж BFЃ "mщ"2кХYhэсŒ;(ЃРMˆh?ъЎnн5з/5Дˆ@јŠан>"./!с\Иp‘Zл'љЉFћAЛсIу‰‰RЈ_uЭURRRRRJ{vEHИ?‡5рBn\ИЂЉ!єИ‡Ф’œuХMc]аЮЏWшзn‹2[C|Вє…И шіЦ~†"A^љсёияёƒ ЌЈ*бЯ•№Ъ'мЏˆƒіэ‡?С]рІ9$љч60ЄЊ˜C&UБdUџќl#'2)ЁІ9ЬqТчејђЧZ>јІš)ћŠ@A‘DђоМMTѕ+fєŽЅ{јnI}Ќ зз…=ЂgолTЉ‹Ющ<ž?о’(Lъž".вЅЕŸрAЄ”1Ђ’ˆ;Ыы—"x бн>Тš— .dDt %єŠŒеі‘Дw эxHжA˜Щ—Б’ЈІ \@XO;™ъбёЂЁБЖƒЖqЄ’6•H…Qw;„pТCА­‹n З„ЛсЌE-ИаuE=ˆјŠy|h./Ээ’лўЄешЉFќг LКтšD?UDTIIIIIЩ\мШЄћsРх%ЌЙp‰шЇ§О\]bхz?уvщХ†š ыkьЙS/t­jfЭ&?шWсcЗ‘=ЧfЅ‰ˆЦ+„+ъ˜цйOAЗxXэъЩžУ~Уќѕ+‚цDтЖЁ H]ТN}&т)ЈЄ))@P]@їКНk9B <4щбхЏ›]v‰.пa‡2–VXZ o™_ЂР№КЕC)Ÿ|]M“.ы_џ]вH@г˜А[oštAyŸ"š5АЙEЧыеhCiяBоћn ы6ћ˜Д[}+ д А Њ%чЇW9aoAЁЕwЧэафrR“„Н2–ЗYКыYXBи[HаэCг<„…;z Т‚" †%Ў:Ў3жОЖЧи”[—xD4тЉ НцiржAhQ№tщ—+:ьSG"mŸЖv{хыяd+nxh•.‚И9fdo” ‡УD"u*mнЏpбЭЖUdšYфЇ’ЂS2ˆ\gЭйоЭЬМшќCIфЖLaјCtЭYškяAЪ.zF)SMцЪІ…AйYлс  й™хк,@vNцnЏЬKШтј—zfфЏР.мV%Ѕ|Шхv#\.ж5ыќkŽO@ЁKP AЁ…Bрг$>MрuƒGИ5№hржn}…‹Kм!]AЉnЮмЅўКj6д‡Кѕ+\”Ж#žйeЮ,Л0єEЇчN~к(ЧЎ=aYIakCD^6ЩG8FF;,#џsМ>z8eЖŽи“мLж Ћ]fНHѓU˜ЌKwмчћй!ŒкU‘Кѓ­—mр˜ M  вˆmЎO™й@ЈДрЮt š”B&~‘ІyЅYГ-3]пБ-[жr}tїeЖЎ}ПЩŒз“ўИА\’ўaAњ§lя)ƒL›Fš&и*QккB; l&—NЯŒђ]sВИЬ()uuQрrёлСН™НJтŠH\€[‚лnк"Ѕ2:Ё”.EьјmMЈржЕш˜ад8zd%ўкj—o`ДџА4|•Šвvƒ  DEКйЈ!xиQ €9Jг~БNh3ƒ=•Ыk–љЕ*К%вДfmWdažЗs+пQ„aMS~Ъ”с ˆФщJdI0”n}ЪтиT†Та_Œu2€вlУЬс3еЛЬ-„:€œAhg‚ЈДhО4—1hv&ˆJћ šю!…х.Я.•HЮр9БЗ}Ј"вюЊЮф—юd[FШjŽЌЊрэѕрE  ащ˜Зукеж-ЗэЦн>ё”['њЮаJ|lЌ‡YОbe›o/ш]QNiiЉaкККz6WW3lшмnћ/Eжu`0H РуѕQPP@ЋпO(РчѓсѕzcЏbQк.NчЈУ*Гƒб<ИёCN*oš.ƒ­ЯИС2Ьш8›E`‰-щјЯТЊ.ZТfілi™ЄmЅЩ–™ЌO!LѓmЭ1ŒЪdM!KгФŒ$жŽиl_ŸД$Ќ2Юd Щ(zoхЂк L%jZИH—ЮNtk›€P›qЂ !”м@hN*žя>Б2‡™dІйЗ ЫЖІ BЛЏ:“_КЛэP(Ф€b7aFз%КН/ыztќЎоіrœф;Ћ”бї‹Ц(б-26}PгааHAa>Ÿ€х+W3ІЄ$4§~?K–.ЃgЯž465QfЋFRW_Я AƒЈЈш‚ˆ})Њ”’ъЭ›YГf ЅЅН№x<ъЈWъ˜˜>e†\™mrЩЅ&X‘UƒYWУyІœЕk–†вFEлf‰Žз[СfзТhєц"L`4amY&ІIN™7в4PšMрKaУŸ•Й=GmAЊ]ЈЕЕ )vь э*Э—мМа…3вy.™уњЪУjОЦmц<ЊЄ”G~йlK$z$ŒG11Ь KI$6MX^^Ц†ѕыhhh`Ы–-ђуќ№,ћзІБt_}§ ………ддTл†а@ Рцъvмq'zі*% тo#rПпO ЄWY;ьИ›6o&Ј#_Щ.dwћъ’Лtђ3kЯC:*$]™™ƒo‘Iкt"К‹укuнјRз'ЖЂДјjЕ^ІRAMœМ61L\`АЈэN\ЏKЩЗп~K$IL'e‚q™TT4IДћv>˜|lфm/gуЦ)ŒmХ-ŠKБqгІЄД6ї_Ъ.3п{(§~ДЛџЬkкэ!Д;uЩЕh%ћзџ Ч†кНfЫЬn™мКГJЊAžл”:“_Ж&л‘H˜žйБэ(–ћ‹1ЃYНz5с№ZZZЈojІ!И­ €љ?ќHAŸяПџž}&ŒЗe3‰АaуF…”рom% ;>ўжV„€Q;ьШњ ыеlОлIцфк-s^ЃЬa6_ГL:сRiЃfвЖУ"3Aп Кпmу0j:8J&ќБZoщМ2I'ЉL^kЅ2%$…$illрЄŽЧ№Тf œBjb9'p<яМѓиДigžq:cvй…ГЮ8ƒeK—1yв$›’™3Ћ ™ћљgќіф“ @5•+№yючŸqъ)'ЊLФl ј”к)jё№)е†4>B-жПЗuЕ{пЖуe ЁщгюиP{ЕъД;cFCUЗмmOЩ/љДнквbhЛЕЅ%/мхv’И(PЯфЏпх?у&‰Ht]чн%MЙУўlоД‰eЫWааА–cйWSz^im644PRв—лПЕХ2m(ФуѕQTTLCCeeeъLPВw"ƒ^—І§ ѓрТюOвwЮ АAУ.КvzвІЄ1™МЧ"“ё№Oг–Ш~МЈХњxGеЌ+nњnК …й tкИݲлБПЅс|Uэ^Ўˆџ“:ђ2БgkмiД0СyMшŽg#й-х$ЇƒnЗР–кюОѓN>ќїПinnfјˆ\zйхŒ;6hЄAљI |Ифі:циcйqЧAJyј!ŠŠŠљрУ№  СЩЇќ†ЂТBлOХ:Њ&M0cФ{вбkTвѕЈШ>uСЕаЮ~ˆdуЩЅ”йtеЭ#„к™ H:?œ=ЄЬ]Фд nKбPЛЧЅвжЅЮф+л[jj(ЏЈШ™эoИо•НЙшЂ?Ф|–gžyšoПљ–{яЛЏгЙЫvDTkЌЇђЭу(йu7ƒ46дSWW‡Œ„јъЋЏјјЃЉнRУЈ‘ЛQ\Д оІябZZвPЙNMM5}њєСпкD0HћёЗ4гЗo_jjЊ‰Dtu&l$й…з№lЃšйфяž]tэŽ#ГыЈ:щЪ+mЄЩЬЉ• !ЩцЕ–Žm{7NKЇVЦ"g†Ј’Е™&%цЂ /фЅ_bЮ /0dШМp—mѕљ>Ёе7 €%%ŒЛ;сж\КŸѕ6ВiгF†wђxХХ–6CЁRъ~‚Ё`ЪчЉ3hlnJXhЃџH$B(RgУіƒ 9ЃX™iй2›Ze Ѓv^2онaTZq%†“˜ЄёHЬ'<Бpнr•™GGг;Мq“мX9Ћв^TK •щaѓ tЌ#p6СTƒЉ$кŸ}і9‡v8ЗЉыH]GDаЅ;Ђкг|шЁМљі;Мњњ,]К”ПНєHИх/сЬГЯсЫЏПсўB xџНїXјгOМѓоћМѓоћьПџў ЃЏsBФЎї?ј —,сЩ3КШCA.Ир|і4‰ї?ќˆ~U§ИѕЏЗФѕк?]Эез\У?_{ё&nћШ#™ѓТ‹|јё' 4˜{юЙ‰dЩ’Х\{ЭŸ:ђя=!vэzђ‰'<1yЄ0{ЙGlœБсkAшЈtќuL$хOv~EЊЖъIу}&ткA ЯlЗaо P˜Єщј*тЊl‰Ћ‹ ѕ-Бc$iЁEкxеежВЧž{˜LІ#юW§ЋњЧVO™2•eЫ–!ЅЄЈИ˜eKFъ††”’ттbЖlйТЦиy—]‰ВЇLЕіяКЎ'КёRђнЗпввмЬyч_РДsЧI'Dђжлo1љ—Пт№)SКdП§іу§wпMЙЗ•єшAž=‘РЩЇœТѕз] о~Ћ-џс‡#ЅdR{~$Х%ХќМd1MMM 8А ТЌUщР™—Є}„Б_-г<{Г3 YšюVЅ  IЊДїБІ6‡jЪДC"Ќ;UHћ,ѕdЭЌ{ЏД“Х2ДiЫ Ќ:QbsŠЇœ†We–йdE+?ЗћЙЃЉќ xvіNћЭ)L;g={–ђТK/бдXO(ДЯ/ЖзЎ^Ч§>Ш^{эЩ’E?1jфž|joМёZжЖўЏ§ы f>3‹ЋЏМœ;n sцYg"„HoлК;WZi†O>х•VѓЩЇŸВvЩ72tЧ_аЗ—@‹ДВaэjžŸѕdЧ37amгэёр+,dУ†uDєpЪxаŸ§„ппšАLшЌпА_a!nЧКЮъГэ}кЂEzFљуЦ‘ed#1ПДsо$чѓЃэй0yEк<2MZ™:БЈAdЬКLƒšE:LгЅФЮ ъ%Э<–ЖŒгIГо mу5ЅљБ'Ѕљў’э@c_Œ{Ѕ‡ё5З#(ЅyHЦEMSг$к0ъІk•&Йж&“НDEЭьa”ЦC7“ўѕ*эEѕцЭР•un:ћЙg9ј йcьn<;kVєЉ/’ЛюО‡хЫ—ѓЋЩ“yђЩ'HілІћ;Ю63O?ЫWЄžˆF;Йmй†ѕЈЉЉaь˜бŒ3šc> ПпПЕ•Э›6QеПŠH{фVe•|ёХџ8ўиcиkїБќёџ.Ž9›7onЫЏЃыєЯџќ .dфЈQL=ќ0ЎЛіš[š“ЂШFCaЭg NB+ вZL>lіŠœ8{Щ]ƒ­вЫIЧК4|f.ЭЯyЩ5’qOУ]n?aыЅ™ўžaЌNнцAm™r]$-уsпњšm'хОЧњ:›:&къ~oѓžhtкJћљвлŽ|=Ыќ‰6ЄђћКсЧˆ_ъjkиАvЯ<7›>}ћёмœйдеVГЅfГ#~1В}ўEВћюЛГ|щ‚СЋV.cјˆa\qхUYл~х•WјзЋЏ1ћљчйuз]˜§ТK|ўљ\f=ћЌ-лйЪvзмцР|gT\№o>|љЪ чџс Юšv.У‡ЦЋ …[YГl_|ё?4‘јЌ з4JKKљqўOИ]ž”1Ђэ§Ќу?šЫХѓ ДДMгPк>ŸD‘ё `gТgљwЯЕ|Zm–ЯЩЌ™жиK$ЭІ@Mњък{M„щb‹qfVЖЬгЅ›4Хќ2›№J“У3J1ЗaБЯЅ4†вј‚Ь 4a‹dbїBУV”ЦcL'нСтѕ#F“ѓX=00Ÿцјёxянw CIР!цЕыжrћmЗё№#гљю‡9§Ь3b›6pр@žœ1“Їf>Эу>Ъ—џћ=ЂsцYgёб'Ÿ2h№`nИюКD`4ЧіeНћTвЗo_~\И(іYИфg|ОњїяЯЪ+-<лшчк?§‰“N9…oОŸЯН<Г]еП?+WЌ0,зчѕrуŸoтнї?`бЂE<=c†сћSЭ€г*M гjБ]™rЮЄšжч•эsKZž[щЯЏФ‡&щЮ-ыѓЪо$aцWœд‹TКёнЦ—Мќ^ЇэЃШx†\гЬ6Лхf Е;”CEB•ЬјЅvK kW-ч_ЏПACнj6orЬ/FЖ—.^ШвХ xhХв%,^№CжЖ++ћ№ќ‹/RTшeЩТ‰„ќ<џђп:dh^ИЫЖХЦНІбњ§ МЋžІŸЏ‰_u:;ь0 —Іqкя.gєˆ2мZ€ е[јђƒ'ћWІŸЅM—ЫEEy9ОЂц}ѓ-ОТЂФїи$} ‹˜їѕ7•QQ^ŽЫхRgƒ‚б.‚Q;“O8ƒQ™a^ы[Еqв ћьŒ+ЪbŠ™Жв2‡@*Ээ™ЯКb1‘Š…уlq˜JP›k(Е_š˜:…SГw^ZЭ›”ў„O@Сяw.п~ѓ5ЋVЎфгO>слЏПІА MгX№гєptђ„@0Hc}}tL”зn‹‡„6Рж@:‡аt+„*йс—-5е|іёlмА>#~1Вэїћ ЙШяїgmћзG…ЧэbеŠхƒAж­YM Е‰уO<1/мeD#‘r^ќr4?деrќoћpШ#2ъ 4ˆI‡œФˆAvсЁРЛW_љи–н={2lшPъыъјцыo№Ђ z8B($Žрв\ј љђЋЏЈЏЏgиаЁєшйS FЛFГБ!-Ÿ†gšзќжk^€Д&P4ьЄЇю˜{.Й‹ZЭъiщїЂЩЮ IDAT Z)d%Е†вєб‹ˆŽ”™ƒЉе+^,вvK ЈжZXTФœ_ЂЂЂ7чŸwGy$wпy6nФхvqжйчpнЕз0p№ .њУХœwю4Цл‹9Гg3pр@’ЛяМ“§&NфЈ#Ž`тФ‰LžќK~˜џЇžr 'Lрџј;Кікфў‹˜q\š‹Їf>ЭW_|Щ‡ЮoN>™џ|ђi,ћиOђђK/qјЁ‡rзwАлиБ)ліџnњ 3gЬ`яёуИј1bф($’tф?Ќ#ћlМ‡rLžL]]g}NzиД œца)M `#­ №”вђ\БгЋР.|f§LPlL6”nVъ\ЈXц/ jx—0#<ѓ{5СкHћy; „n/ъL~ЩЇэ5ЋWБaэкл5›6БrљВМp—˜ѓѕВUїа„—swЎЄzѓ&УщyзЌ\ЮЂ7ў€((dтoІФ@†zёѕ ѓЪуВdЭOHсehU“|€C†Ѕ­D(bѕš5,Y̘КкZ†JпО} јј |lмАe+WR^VЦЈv`аРx<u(ЕХq“Ћ8Яœ№5уIRM9/пБ ‘с"‘ІhaЃŠТFЙvы'lnžАZl˜IЄБ•о„0Џ–АоK"щиД>|Eš4ТіБd/ЉpvŒй>.…Уcйzп !№xМhš†Љы„У!"‘n—ЫMРпŠлэСхvGгHI$&уѕља4 )Ѓ…BA\.nЗЇ-­N(BзuМ^‘H˜H$’№НН>_~kJНЄ”„Уa"‘hdSг4мnObЙqюh.'6KЏЎыƒЖќ.мžјќ‚С З;:П`ћ2ЉЫt.­ѕГв;ЭвклЮкЁvђŽD™жžДчУK™~ ОявМѓгђЁevЏeIEЦє‡CЦ3уцЅЎƒcЬК№ ldвyљЦѕPК5Љ3љekБэrЙЈш]ЩŒUzИ Ш-(в P@|šРчИ4№iржn \\šбЌЙ&**.фЇ†1ь=ў8Š ŠбфfBОЊиzЗлЭˆНЯaнћЏАЙ ‹‹lйіx< 4ˆ’тж­_ЫЦ YГf mгRвЃ;яМ§ЋP^^Л+)%\Илf5u>n›ч+лfNЭдF\fћѕHš5Б:ilЬƒk)5Uм Р†E›з)оэiт]‘\?“tщг&–[%MtќJ™^6qAТ/ѓ)ўJ,ЇLЪ$ЇТ &eœ#LШ9й7Ж% ќa ІFН с4ЭЬКТДu,gуMоЇТь”j›‰а№F ":•|("NV>№Ї№m$&ЇЄ ЦЅ &х“RтomIјœІ]z$B0Бt‹Ѓ6м…энvSЗ7иД6ЁбЁsœЉSю4Š#ЅPАžv‹ЖeЋсг €к}u‹%Tv9€ZbtV™m7\c* Њф\Щ/[ЋmЇВMЩHIn+&Ѕ$ бмм‚ппJ(ЦуvSPPHqqQЧd%%ггnЄЧјЈ6ёБлШШŽHW%gљm…ьЙ‰І€ІхfлI'ьЌТ~єгIкt‘RыНц,ZjяАm8КŒ:>Ї„“Убё1,2=ЛзгГьRfуМgшџ””ЖUЙSOЉNЅmFлbчcGлЯ‘йvєЫ Œу2ЩиБЌSR!ІьgнЂQвtуW;J6ыщdЛe2IЛNBњžГ2iПЄДжЮЇАб~–нуѓЄРŽАJ-„хmAX< rтВ Гsатъ™_:•йoП”ŽŽ ;ЮГЬEлieкЪJGг™K›|!p„ДЙivсVк`hiГ;щЄ#Ј”98ŽqgчwGOHГЎМЪПVкF}эм€Ј’вЖ{’dе]7уЩŒŒC™і@в$ВiлNњќЦ№HТ6хIIkв0)]lMы”в0]ђгљЖ§iЩьH­щŒЎ­BX4žLrE2и›ёх —лœM&7™ИЁIЭc!&є-вмhЄЕK{pџРШ‰ЃžЄЁs>(2)3sdgкpšЯQziЋђвf:gрщ>ЅЭfБ”і 2'№ihN@аy/ѓL'лъ"Э"ПP%%ЂJJЙвŒЛыцH-Sd˜пФэВбХ6)­М–K(Mv„:ъ˜кKVZBЉ0Mю–(Ќ&.ВSѓFOгX;9„гL5HЕЊvl•эф•Ž&kніњд)Е—2{Л™@Њу< г>];d‰\ƒЇѕУ[[;>гЄЬIєSЈ’’’Q%Ѕмi4dЄжvв‡D­эXфЗ„в„јcк(iдфJуё9 HVPš;0Me,aІ6сTšИ|F€*MмY€šRгСfКМN€еМf[љžGWvвѕ+Їu2sхэ рьLшЬ<|f˜<УуRuСURкzATВЗQRЪ%Ь"› а:їŽuЛЭj“wi”ЯВ\ƒ вЅKЖ™HO‰CЅ0MџЭpж] 0F>D0Fpjѕj#‡Kи@&3K˜•aе5}wZуМЮЂšІ{:Ч€™-”eћj0йЭЯœеGкш‚iжвЖ92нLЫЖ,M>Ї32л}5Š§Д–H—бlЖЦз<+јДЙ лc‘3œH+чe љd\ @•Ж{W:KnTQ%Ѕœ)H)вњщжX63ьІЅ%ћ9„Zcо4ШдВ“НDaТ25†g1;o‡%s€MvќвЉ40bјaфќ™DcM`SРЉ0_+УЊ šеЛOeHM;ГЏ GKи„жlA)зя”оfA2зy)N@гœЧМlСjgBggЇEjщЈ&–@ж9№™СžЬr&ш\tŸM<Вœ‰ZЈ’RїQПпЯъеЋ5j”jiЅmH;nIR ;~И”fйэзДьAЉ=u ЅI… 7цЮєбRiˆ‚9г8š4Ь‘&jjN“š@štгЕЈжЮžДКПrЦ4Э^c<ЖРеСI#•уgиЦйЗŠ4њ“Q^guЪ8эQ­гЎАIWtGЬе9р™>3Žzv5|:;ТЄ}ЃN JJлˆ>ўју„Ca.И№ц}5чž{ŽщNW-­ДеЉs(ЭQ”4JmG7ггЃs(M–(DЦбR’{пІ‰–цL-сTXф0эѓi ЇЉ€* w4^`мŽТљвMц!lЇнH„1єŠєnhŽ™yЛ,fюŠg—2л2%p™вs›ŽXвIфвЄZBg‚gње žŸ6Ў9іOУќП‡WII)Ч zѕUWѓх—_&,Лх–[иsЯ=б#КjYЅmHуЁДыЂЄq w(MoЇSЂЅ ІЄŽ1ЕЇАiжб5]З^ћ€—в0h*вАl jтќ‰ДhНN($ьсf.&хщ†Ђ Р-{лЮэЫLe%ЬЈ{mІа™)фх<|f{ЦЈшЇ’R7Q€гN?_џњзБп=zєРуёЈVUкfЁДыЂЄЙ†Rk(Ь JЭ™аQ2г”КРІ`• œšљ7ТЬЦsЕЇ6гH˜%ГMiNЎжћF˜cbz?Sк3eBNёl•Ћ8iзИЉіщTцrЋ2зlъ*3Ќžtм] ]žРЇЬўhЫ%|&2ЃŠ~*)m5 *žГEEE”——',{єбG ƒ\|ёХ)щWЌXС}їоЧвЅKйqЧЙъЊЋЈьSЉі‚вVЄЙ€RUљ‡Rk 4B›pkŸUsІщ'?ъb8MЈ`оХз.Є‚Њ5dкUѓ}–ž4НŽбfWп’Ѕь*•f93K2›ВeŠ’YT9ГЪч:Л<Г„Ц\F=|*)mKОqŽ@4vђй:Ѕqкіy|eм„ОR‡Йсњ8јрƒИёЦxьБЧyф‘‡ЙёЦеTкf 4ѓЎЛ4šЉ(3$2КŠтп•bџэ0`)ь Ќ§ЎФ‰˜c€ЃиaP‘ЮСЉoˆщ[ƒїxІyЊХhM[яQuBЄЛ“ˆ,œ[ГїБfFŒ2ƒS"gDЮiАKН‚ь}ь\йЗвiўДWщЈZ2ƒ<™BnNзEfР­йМц$7^l.КЭЊЎЗJJЙё…sЂ4sцг<їмlЊЊЊxьБGMг.XА€––N=ѕT„œtвI†QS%Ѕ­љD”d”6œл1˜ш(Щˆ#0MqtІi*’Ѕ:y ЈiXЩ —4йз"Г˜HЩ†нlM_#jqiђЇДАMяе~Ф^8М?й3šqР2G‘ЮœћЇЙя–џњШ\> А§ —lКgœі9[шД٘н<Л2GvŒM(јTRккхюИ„:??ўxІN5фЖfкM›6SWWЧс‡O‰-‹D"|>ŸкJ JMnА2'Pк‘;Ћhi‚i6нlcц-`гьh ЈV/З‚T+Ї24… HM]™ЯЄЭ@dсЪ EŽl{q2Г}…EŽЫВ§ъ—LAБ“a3ЇР™&W. Гg"фхц\T№ЉЄДЭƒhfъбЃ„~§њйJ[^^FяоНyс…чUЋ+mзPъ(“_>Ÿmо8PЪ*ZjL­э…ErЇ‹MFV:ŒžІT+HЕ8„йVІPsšіЕ†LiV“]8Є™™ЏgЉ]}‹nЗЙѕЁeц—CfЦ ™X;8г\6х:s žцк%аЈЦ|*)mm šуѓДААˆъъjъъъ3f BfЬ˜Щ”)‡Ѓы:КЎ3pр@Е”Ж+(ВHІQЮСmќ €ЙгИœ–хNM`г:zjQSa§тzAњ(Њ1Єv”)lфЗР7{АšfgH€o Џ™˜9к.‚Е­ЁNПFf•LциІtb#ЇА™8hgBЇНњхЂ{lŽСSСЇ’вжшрцDsЌбЃwe№рС<њшЃ\}ѕUм~ћmм}їнМјт‹sъЉПU ЊЄ 4(EŽьt-˜лВ`Є<РЉ  ZFOMе ЪвDQ-!5 4Э}й4ћи6Ќšя aЕ„Ул‘ЬœDMЇ\лЫuЂ3а8w3ћЪ\”‘62*ГЌc6љ3ЮŒЖ аЙm‚gb•x*)mmГч§([Ѕ›&щхм+йМi#КQ-ЃЄд•'fЎњ#fІоFpjЯ^vМ!lNэ8*BdiRdT-Gv2мq"лЃ(g)ђSLзpfЮ3Wf2™CТЩl:йЭi%&s2ѓДАн:Лxv˜QрЉЄдеrЙ\єЎьУЬе^zИ Ш-(в P@|šРчИ4№iржn \\ИЃЏaQ ЉЄд­T)sЅ1MјšƒЈi’НxCYENЭь’6 iэtI‘Іi\W‹ЎОв$JнЄu иБ“hЫСIМ ™ŸїuЪm‡DsTŒЬc]ЅГ,6)4WАjšTfОсœ цfdn—Ѓ‚O%ЅmKwЭ=шРƒ —ПџСћЊU•”: JsІqpš™U“юМy†гЮT[j‰вœўL@еЌf˜вЂNцiПЕ; dѓМ[ v*єЪЬВЫлv•”9А‘]v™лнгЉа™c№Ь1(*№TRR Њ€SIi[г8Ч!L3У ‹ЈiNсДГ5ЧjTsЋг \JѓŒ€l@л€ЗыбЙQйщuЫZeЗCfП! ›љЮМAЇO%%ЅlAT’щ[D•””К#˜f ЇQгмСiвдAнPsЉЮ@5 Ќš@ІАi+[p5NъxneЧefМmВгюН9zOЈь”2ЬЁ+sЗЁЮMЩЮiў­8t*))u:ˆv\XтўЊ‹ƒ’в6ЇЙŠšцNу- УЏЮСбPЮЌ›)ЄZЯ`dчŠ*ьжLІ_”Ўdaп€В2Л_tVїйм™ЭлЮN2+ЛЈŽ2ЛMЫŒFsT–ЬGГАutнЭ§ЉРSIi›t8ГQ‰тN%Ѕэ LЛœцЉы­ДШщEZ0ЕQЫ `еј4[EdѓвYы[зЁг,k лQоn~ѓьŠЈhце™›аљ ™# ьšHЊ‚N%%ЅЎ‘;eЎ%%%ЇЇнP@jg€j†АъXMл@’Y‹х4JЦ{-/ч†нўНнцЦ);Пzљь"›ШЬ4Гл’.NJJJн DЃOtewЛЋ*))mƒpjЈЮJАЈи\ШІћ–cPЭV;ZmРЋ-cN^гНЩnЋуаœTRvЎљ<СeV9enЗNцБЌT~эœЃSAЇ’’RNAT URRЪ;œ&9J‰<™ƒjšPЭ ЌšзХ ДZlQж№jœSфœђ)5AO^ЉВkЋ.;ЏФмuеЭC]ђQf':p :•””:D;bЁъ‚ЃЄЄ”ƒ’k@Е‚дŒЃЈ†о\ЎA57АъдuvыbлxfaхNшќ—?<эЗТnq7–љЋaюЛъцiFcйyэ’шІN%%ЅЎQ)Ѓ!ЁCIIЉj’C–Ъ’9zХL@5ЗАja1У(kжыИ0б)I•ћLЗ пvзnК[“yЌC`PЇ’’RЗбјk`ћhQuЉRRRкЊеЄvЈкƒеьЖ6нqEцNyЮыоЅt™Џ'ЏлЮн4ї3чЪЎ­ЛьќњфГ­N%%ЅЎК7dsЩ‰‹ˆЊ —’’RїдЮ„дЮU{А*Рaі[я\­K—9цЗЎэ„Гэпяђ3cЎь~л—Gшэ*аTАЉЄЄД­Шэ„ЙКЎ‰D…‚Њ5s Ч‹ЫхBг4еJ RѓЉv@ЕГ`етк+jn[$г1Ѕіk&Л•ngє)ЗЎЊww%d*иTRRкn@Д="*3ˆˆ†B!„цЂjР |>ŸjЭ( В~нZ"ЁG5ˆ’RZЮA5CXЭŽБd‹Sjч3 ЬI’м)пдЛ}СDfsuu7нЎйG 4•””ˆ’4.Tк{ŸK8&Ž0j‡‘ДЖЖамдЈZ3в4aУ‡ГxсBрvЛжЋtTщ"ЧлS;ЉЖШED>a$}wмі}шЪК'„ѓHІ­—ЎфlrІnJл­ВІnпнth*))mŸ7ьfrыЉIGvъыыЕгЮДЖЖ‰DдŽШ‘t]ЇЅЙ…ƒБdс***bыbшƒЗћt0d§к5†‘уэ­T[t.BЪ<ќ ƒЌ[З–H8ˆЧуЕMyyщŽkгw—™жLdПЖ; Ь™mЁ›ЎŠf*)))m­rыRЂ#б\T#‘ЕЕЕбми Z1ЧŠ„C”єьImm-ЅЅЅИ\Ўh:Ђ3rјHЊ7oЂ&иЎлШыѓ1dи0~^М!ТБШёіиNЊ-КTsYѕzН :”ЅK– D(Ѕ'DFнq3_•_œ’YRwХдэ|В$йНлFAІ’’’RО@Tз‘B"uћ^]зimѕ#ЅŽЎыЊ;щFикъGзu\.W,НqУ:BеХвпвТІѕR"Члc;ЉЖиZ еbЖ†йМa§фчE ЈЈш—?л.Й6YЎћF%PфМЕфжйц .•”””К!ˆ†УТB'тЪ (u]uЫэlХG 7­_ЋЄM­­Mєэ_‹лm;ЉЖињniЂOU[ЖдвЋWijTДЋ№УQЗ\‡HЊКхvЪЩМ—ЈРRIIIIЩ9ˆЖј„4AаэЪ D#™ь–-[hnnfа AнмСo%‰PRRв%љЃАпŽ„УъЈMrFк#Чбіо~лIЕХЖЕ3uДѓ;S–@Г]vЫнzсOЅ’’’’RNAДЙйOи-y3бLo"ГfЭТхrqбEхdC>ћь3fЮœЩ“O> РЋЏОЪЬ™3ЉЎЎfњєщМўњыєяпŸ3Ю8У‘нK/Н”ЃŽ:ŠC=4Ѓze›?YлкФP~ПŸЕkз1bФ№œкUhЉЖPŽ}цъZ˜U Ї RIIIIiЛбК†&ЄW'Rйkd𛧇~ШГГžeХŠ”””0nм8ЎНюZлљэjШа!L™:‰ЄККšx€[oЛ•QЃFQRRТ–к-”––:.Џ§F›i=ГЭП-@ХТE‹˜>§1жЎ]Ы)'ŸDyE9Ÿ~ђnИс:ОўцўіЗПsчЗoѕ№Вš™VзЃcЎsн%3WmQWWЯхW\ЩэЗ§5a6чЎо>Ѕ­ 0Ж ШUћRIIIII)kн{ПУh@Ѓ.;oƒБ;Mџ[oОЩwоЩДiги{Ÿ},\ИMsйЪяD ф˜cАbХJњіэЫИqуcыїпrЖюS—ф— тЁ‡ЁЅЅ…+ЏИ}њdTўчsчђюЛяёџnМ!уmИф—qюДsиuз]ђж>є0Ÿ~њ„”––2fЬhN>щDzїN,ЇАА€ƒ:тттŒіWЎЖoЛ€Жнxž#%%%%%ЅmЧ_Щ DъёKVм@A0ЎB$aњєщœwўyœpт‰Бх;эМВ-—lЫ 9§дгиМy3•••\pсь?y2сp˜лoНO?§Ё ў№‡‹™2u ѓОšЧ=wпЭњѕы4hOЯz†ЙsчђиєGyцйY‚V­ZХ~“&0§БGy§ЕзщгЇ’ГЮ>]з™ѕЬ,ўљЪ+И\.NљЭo8ў„уhhhржПоЪ—_|AUџ*cѕŒззпРмЙs),,фШ_ЩДsЯM›џЅ_bіsЯбммЬЁ‡ЪW^щИН­`Ы–ZцЯŸЯвeЫ:dHlљ‹/Н@]]%%Хy=@Ус0kзЎeџ§ї‹•=`Р QЄЬyгЪоš5kИюњ™8qЎПю љёЧ)(,ЬИС`ЉgЗсp]зѓкѕuѕwмБvш!дззѓWўЩ_oНЭ0B-„р˜cŽЖњљм>%%%%%%%%Ѕ­OбзЗ шQ4”mKњŒKcђк—Ÿ/ЁЖЖ–У=Ь8MЛ ]тu{јЫ_ўBee%яМѓЗпv;“іФЇТтХ‹yійgб4-њ$]—мп}œpТ |№СlкД !уъЁGг 6Œ3fрrЙx§_ЏEЩW—МѕЦ›М§ж[мwп}455qйe—БЧюЛ3|јpюОѓ.ТЁ3fЬ ЖЖ–›nК)VЯx}ій\rЩ%ЌXБ‚Ы/ПœЩћOfдЈQІљkkЖ0§‘GxќёЧЉЊЊЂООоДэ лЙэЏеФ3ѕѕѕьИуŽќыеqсчА|љ VЎ\EUП~дее‚дЙњšыxтБщxН^чўў|юНћ.**ЪcЖž~f_Э›GccН{W№›“OfЯ=ї`Юѓ/0їПџЃЁЁ}їШяІУ† yь‰'XОl9 фwгЮa№рСќ~Є”œwў…œtт ”——ѓбGsнЕBDШиv­YЛ–3ŸaхЪ•Œ>œпџюм„zхЂ^|ёeFяК+гЮ>+ЖЌЊ_пXОoПћŽgf=KmmЛнsЮ>‹’’–-_ЮуOђ3ž~†ўUUœpќqМѕі;,\Дˆ?ўпХ<№рУ|ѓэЗpРЏ~KcД}ЭЭЭ<3ыYОљі[ЪЪЪ9ыЬгйyЇъпю иwтDš[šљц›oёИнœ~њЉьГїо–ЧOMM OŒeЫ–Q\TФŸЎО’ЊЊ*т)Оš7Mœњлп2yџ§xыэwјЧ+џDзuЦŒЭyП?—‚‚шCК7пz›з^ПпOYY'Ÿt"уЧэ…”’Wўљ*|№o„ІqфS9єƒcm“б>T‘C%%%%%%Ѕю,)ГЂ?ЅŽ IDATrWВЌe­ЋЏУуёPвЃФr|dћК‘ЃFpмёЧ1}њtjЖдPXXH]][jЗАУ;ФвВjе*4—ЦаaCл"Ќc1лПk.-ЁŒіuяНї'žt"C†FЃ†уЧчЫ/ПdарA|ќёЧ<5у) Ф СƒшзЏ_‚Эv 2€Бecйe—]XБrC‡ 5ЭяіИб4-ъ AqIqFуF­:ј656rъoNсО ЖЖ–ђВ2оzћm;ф`~ZА€ІЦ&vйi'њіщУ‚ ЛлnќќѓЯєэл‡оIАїѓвЅyФьЕчЬŸџ>є07§љF† ЬO pФ”Уйgя бЈf$Т]їмЫЛх‚пџžЯцЮхŽЛюцžЛюŒеwњCPRR‚Іi|іљмиЖˆИэ ‡Умsя§ьЗяD.љУ…ЬyўEž›=›K.ўCNлiў?pўяg˜fгІЭ<№РCL;чlFŽЮœ^ф‰'gpщ%гPWO0фŽ[џJss =2їо{Ÿ#˜ŠvкiGЎНњЊиУтТBЎПю xvі^|щe.ћу%lкД™{яЛŸГЮ<ƒ]wй…ІІІX]ЎЙњ*vоiG4MЃБЁч_x‘ПќљFњTVвии˜Qoa3Mss3я№={є ИЈˆ+W2tШnИіOј§ў„}ЕћnЛёбЧŸФ–§јгOьЕЧрјуŽсЌ3NcЭкuм~ЧŒЗW,BП}xіййДЖњЙѓЖлјjо<~d:їпswТ8в†Кz‚Сwнq;55[ИэŽ;йwт>ќѕц›јюћя™љє,&Œ‡”вєјyэѕ7шлЇ’Ы.љ?›)//gоМyЌ\Й’ЛюИ MЄŒnлИНіdяёу…BмyЯН|јбЧL9ьP>Ÿћ_^уMўpсљєЏъЯOЭ`у† руO>хгџќ‡kџtЭ--мvЧ]ьКѓЮєъе3'ћPIIIIIIIi[“–­)ЅсЇG„B! зЧчпДiW\~SŸТqЧ‡”’P(Фј у9љ”“ЙђŠ+Йфџ.aѕъеH)ЙцкkXЕj'ЯЯy>jOЖfвї„ђdGy=јxxŸ}іЕЕЕджжЂы:}њєщШ‹Œхkџ„B!юЙћŽ>ъhІ>…E‹ †,ѓsѓ-73ыйYœњлSљяџkкvVcЈ„ІŸІцfњіэУФ}ісƒHcc#п|ћt EEEQр‚q{эХWѓОFСЂE‹3ztŠ-€ђВ2*{їц€_§’ ЦѓŸЯ>яXW^Nii),]КŒЦЦFN9щDњіэУБG…зых‡~ˆЅwЙ\ИнQB€ Ё,!K—-Уяїsь1GSZZЪ‘GNeўќ,Зйi;…У‘ЖhVЉсњЯчЮeܘбLкw"§њѕуЬгOуЋyѓhmm!№x=TTT0x№ &OоŸ%?/MШяvЛqЛн!())ЁUeeexРЌ]З!ŸЭЫ˜1c˜Мџ~єю]СаЁCbmтriБvђx ihlЄЁЁВВ2ЪЫЫBаЇВ’ŠŠ њѕыЧ>&Аnн:„|єё'L=ќ0FяК+ххeбЎцmuќьѓЙL=ќpШŽ;ьР/ЦŒaў?цl*)))))))mkЪ~њJh1|8%%%|№ўћuдQFлЩЇž|ŠВВRўёП#„`ъд#b]гN:ёDŽ>ъ(юПџ~юМуNюПџ> ШwмЮ‚ Иќђ+иiЇлlЕз'ў{jyхххœrЪ)L:%ЁFэ3zЎ]Г&-ЛЩНџоћ|џ§їЬ˜1ƒ^Нzrйe—’ђВ2ЫќЦgќИqМўњмp§ МњъЋ8œeеФY …ТƒAŠŠŠ8єCИхж[qЙ\Œ7Ž’=(,,ЄЅ Ііоg7пr+gŸu&п~ї=Ч{Д]бВŒ.япП?ЋV­jћИЎzK ИтЂX}*+ЉЎйвaЗ (RЗЅнž fЫ8уьsbI"@(„ЯыЭI;yМ|^/ѕѕ †iЊkЖPYй'ЖЎМЂ—ЫеЖ-‰Ж{іьIKKKЂИя?-XРsГŸg§њѕxН^М^/AuM •••ЦuŒkЇЂтb.§у%Ьžѓю”д7$э›Єv/..Ёея!а\. ё–ЧЯ1ЧЭœ9ЯsщхWВїо8§ДS;v7Ž’ТТ"–,YB $‰ 4A ФуёФьЎ[ПžH8BEя ТтХKРќљѓ6lН{гЃGšš›б4-7Sъ&у>t sцЬaр  ш?€ѕж3zєh„Іq№!sџ§№ЧKџHЯž=ёћ§)3XЖOЖ ‡…У Ђы­ђћ§–.[ЪАaУ>b8С`P8„g j†ўж |> @џЊ*^љчЋќхЯ7"ŸЯGkk+:x0єчƒўЭЦM›иmЬ 04Ёыluu5ЅЅЅ ЫлзѕЎЈ`KM z$‚ЫyгцЭєЎЈHшЮ) ьЧ/ыUJYYw.уік3e]яŠr–-_Ы_SSC$Ёwя jjЊЙЈэШ€лэŽЧqЖ}ьqŽ:ђH<рWќД`г{"КЅЅЌ^Н:ЅŽnЗ=œhcїнvcь/~СП?ќˆ{я{€'›юЪEšu=JJЈ4˜%WXќРФ}іцЫ/ПЂЈАˆ}&L@Ÿ}ў9 .тЎлoЅЄЄ„[nН=–>yћzѕь‰Іiмuћэєэл'm§“x4qЙ”iŸigŸХqЧЭwпЫoМЩёЧЫSІpШA1ѓщY<ёфS\pояyіЙйм|гџcШрСќ§ЏАys5(.*ІЎЖЮ№8.эе‹ЃŽ<‚_§2uvю\ьC%%%%%%%%ЂЩ jбєјуЇА —_~™G~„ЂЂ"ЦŒУС‡ЬР‡~ШЛяМЫiЇŸЦmЗоЦБЧ‹ЫхЂ_П~xН^Оћю;юЛї>ZZZ8p _|1RJў(‹/І  €§їпŸ &№Х_Фъ{wg|нbQЩS ЎЖŽoИ‘––њїяЯC?DQQ]tг™Юх—]Nkk+•••TVV&и:рРјђЫ/9ує3…BБnЊRJгќ›Ћ7sгŸoЂККšВВ2.Кш"Š‹‹ПЪР$Кеъї#„РгцрyФTЬЫ№сУ№Жh{ўУ?œ‡~„§ї›„Л ў“ѕУ 6lkжЎхѓЙџхšЋЏŠ+П#В5jд(Jz”№ќ‹/qШСёйчs CќтП@JНЃо ‘ЕшяТТBЖдnЁЁБ‘wкMМјђп8рWПl{яЄЄЊЊ_$jŽ_Чw,7ўљ&f<3‹ƒјnЗ›ЅЫ–3zз]иwп‰МњкkќчѓЯ9r$Гч<Я^{юIqqqBН“ЗЃoпОЌ^ЕšЋVЁ AEяоD"бз!C!тЃ‹ћNœШез\Ы‡Ь/ЦŒЁЖЖŽ‘#GаЇOОœ7Њў§iimЁoŸОЌZНŠA2xШ`BЁсHŸг.œ"ŠšЄFћ­cйЄ}'ёїПП‚лэцЖ[o!ЂГ G"DкОЗлIоОСƒ1aТxž~іY~{ЪЩвааШАaC ъ/Нф: ayќЌXБ‚вв2М>••НiimeSu5‘p„ВВR шЯђ+Ђut)л2uDџ'юГ7oМљ;эДnЗ›umГv#DєИљзkTUUбЗo6mоЬŽ;ь@ ЬЭ>TRRRRRRRR šBЂ–ЋЇN’в`ШрСЬšѕLьїC=˜’ц—“'ѓЫЩ“SЪ3JЛЯо{GgЮ”2с{Л.ПќВX~!рДгNхДгNMБ]XPРЅ—ў‘K/§ЃщvњМ^nИсzУЖ0Э<џќGmgмоЦ‹ў@ДыgлњнЧŽeїБccП}^/ѕ БпуімŸЯЧО'šк\ђѓЯќщšыpЙнќі7ЇАУЈQЉafРЅЙИъђЫ™ўиуМ§ЮЛ 4ˆЋЏМŸз‹пяOxА vмaєРГЯЭсТѓЯуOW^ХуO>ЩkЏПAaa!Ч}4U§њхЌFŽСѕз^У /ОФЕзпˆІi :”!ƒ3xа .Йјbf>3‹ккZіи},г~7ЭДўэ‡ЦФ‰љѓM7SXPРe—ў‘sЮ:“gŸ›ЭгЯЬТчѓХкo@џў\rё˜ѕмlž|j&•••мyл­œpьq<јШУ|ќё'Œ?žуŽ=†ћxˆккZzѕьЩЇFqa‘ѓ—6Щ гHѓ§†ŒFGо•P(LEyHиwŸ‰|џ§|.НќJТс0НzѕЂgž IйО Я?igŸЭЬЇŸ‰ю!и}їнЙјЂ ы&-ъ,Сэr›?Ÿўч3оџƒшў9’3N;E‹—0cцLZZ[ЉЊЊтЌ3NЇoŸО{Ьбмvћ455QRRТ!=ф6mоЬџЛщ/ј|>4!(,( p мsп§ДЖЖвЗo_ўђчџG}}}nіЁ’’’’’’’в6&qљьdAЏrŠ*њrёшB6mм€žц=ЁPˆE qшдЉlXЛVЕb'Јjр@о~§uvмiG€X{џ№ѕМЌьA@ђщgŸёсGsЫM6LїЇkЏуЈ_џšН'Œяжэ4fЯН:ЅЖFЉЖш\544ќіЮ;>Šт§уяНЛє’PBBНї.нЈtь ˆв,€"`А€єfС(н‚ўО (`ЁHz…)@i—kЛП?.wф’KUРyП^ћкdwЖЭЮЮ=Ÿ™gžAЏ7ртъТ… XђоћLŸі CCoШ;tЈТSA рV@­VуW;OвЈЅW„Ћ \$p戓JТI-ЁV“ 4*  дЈU iбВ1I)—.W|VзKСЭi9ИF—ОЃЧŽВ|х*BB№мдg.m•л6’Їˆ@*ђтzУ'ŸmЂЈЈ___ю6ŒА2зw@ С•Ё)е–рыыGvqщU@“ЎпTЎщјž={бГgЏЫІ[Вxё:ŸD™TЄWЏоєъе[d„@ СѕЂёёёШЮh<М…Н…Pd…RŽ’’$ tКRŠŠŠP$‘пх)**DЇ+E[5јПœO"/юЌwh0з\@ 7дjЕu&’›Д9EЇ”ђѕ&k`тТЙLыє$Ua0HHH`ррЁœ=}JМЙ@§†”M c‘Іe‹ЕX‹ЕX‹ЕX‹ЕX‹ЕX‹ЕX_ПЕ^o уьd“БЦq*дj5ў|’ю|ucDЯef •%є'РM(Р[„3ЇRE&@ ‚Ž“Г3Ё УHLˆG2бh47ќšЊ“'OrўмЙЫі‚ @ рЮCWZЪљs™дЋЬХ‚‹7хššN]КRЄ7qЁH+о€@ @ ќ)еjЉD^^^ž^Јеъ+Ds.œG‡j@Ч@ ‚џ"ŠЂPЊ-E–х.DU"Л@ @p3BT @ Bˆ @ р?#DХФї@ @ ИЉBT`!33“mлЖqъдЉлўYŠ‹‹йИq#{іьљЯНЧ_~љ•Э›ЗмАѓkЕZvюмХО}ћnJ™мН{7gЮœЈ@ ріЂ~Е№іёХУгKфF9ЖlйТЊUЋqqqЙтcu:Ÿ~њ)уЧO`ШЁ<єа(ОќђЫэYŽџ‡ЏОњњІ_WQ^zi6&LDЋеVˆ“&Mfшаa 0Я>лDff&cЧŽхНїоП.з/,,фwо!))ё†=убЃЧXО|9…7eР€Л™1}КMњ.]КАdё"5jt]Ўc‰Э›пРМСУУƒ маМЬЩЩ!33“оН{пєђŸ@bb"&ŒП @ vиѓнwЌZЕƒС€‡‡aaaŒ;Цмt…|ёХ—ИИ8ГaУzsgЮŠЦЎЎ‰H.їwuЌ^Г–’’оxуuкЖmkГOЋе‚$нr!’ЂЃcЬ=iЭ#Џјо~ўПџУЯЯо}њмЯЅеjINNЁC‡іџJ^— 4ЫuљuFЃ‘|АђНHЭ"#kTЎjєcbpwwЇAHШ yюввRRRRшаЁУ ЯлQбDF6Лщя0**Ъ*шE83@ ‚ЪЩœ9Г)))aџў§Ь™3—uыжтяяEчJ=™ЪАaїрыы{ньт+AЙ MxUBtљВe8К{rߘгл‘šš‚ЇЇg% TyрРvюмIJJ*jЕšV­Z2eЪММlЧЏЦЧЧГgЯwDEE‘››‹““сссЬž§nnnГiг&ЂЂЂ9wюEEEВvэ4 zНžmлЖГoп>222 iРлoПГГ3ббfЃЧŽЌ[ЗЕZM“&MxњщЇЈ[Зn•Яj4љчŸащt 4€€€>љфcРЮŸ?ЗЗ7§ћїcєшбЈеjыyЖn§†?ўјƒєєtђѓѓqssуЭ7прЎЛюВ{нјјО§і[ЂЂЂ(,,Фгг“qуЦ1hа@bcуe™Ш2w%љh4йЖm?џќœ;wGGGъж­Ыєщг&//Я?џ‚#Gސ““C­ZЕ cоМWаh4МїоћьнЛ—O?§„кЕk№їп№иc[яУВдЈбxyyйИфххёх—_qј№aђѓѓ `єшбєщcл3XRRТЎ]Лј§їƒddd еj‘e™Ž; IRЕeєrљ`!33‹элЗsфШВГГ1˜L&š7П”ЗП§іп~ЛГgЯb0`ьи1tяоНZAћнwпёлoПsіьYДZmY~"%%…№№ЦЬœ9~љх>џќ ЮŸ?ŸŸ6ЌGЏ7№ілoѓілoгЖm[оxуuўњы/VЌXANN.:tрйgЇтссбhфеW_%99­VЫ3ЯLA–eОўzГе>2d0ЧŽ'!!€€цЮCHHШПŸ_SІNЅФЈPxƒz}§ќќ9}њ4щщщUŠ8EQјрƒјёЧНдЏ_ŸaУ†’••ХО}ћ‘$sцЬ@–eVЎ\ХЎ]Л№єєЄ]ЛvјњњАsч.’’’puuрФ‰lлЖШШH†Š^ЏG­VЁбhШЭЭeіь9ЄЅЅСрСƒ­ћЫ я( Ѕ}ћіœ9s†?ўјƒѓчЯГjеЪ*…MBB:Ž>}њаАaC‚‚(((р…^$--Ю;бЕkWŽ;ЪІMŸЃVЋ=z4EEEЌ_ПžРР@њіэ‹Z­&33ƒааPЛзмО};ЋWЏСЭЭ•N:сххEFFпe}РFˆж4WЎ\Хž={шдЉНzѕттХ‹œ:uŠ   ŒF#sчОЬ™3gшпПўўўœ?•JFcюh‰‰1i,ЁВ,KDD]ЛvРСACэкЕ­ЂЛ[ЗЎжћLNNfЮœЙгГgOќ§§јх—_YДh †Z? јј,X@~~>-[Ж`№рAœ;wŽ}ћіYЕ[nMѓрЛяОgхЪ•ЈT*:tш@=8rф жkьлЗŸЗоz‹АА†мsЯ=шѕ:’’’ЋmМHJJbС‚…dggIпО}8}њ GŽБ №dЂЇOŸІsч.hЕ%ќєгЯЬž=‡?оˆ‡‡Ч•3ЫљЪ‹шђл-Яd2™ˆ‹‹#88˜ЛяОлšЎeЫтзF Рƒ§ћї“ŸŸO:u0,XАО}ћ2wюж­[ЯъеkxљхЙ$'ЇЦЂEяки~sцЬІkзЎЈT*23Гx§ѕ7xюЙчhв$œuыжѓС0oо< GŽeщвёѕѕХССЏПоLDDž|ђIўўћ‹/fцЬ™Ьœ9ƒM›6БaУF.\№я б}бЃGѓілo3}њ ЦЫ AƒpppАIГmл6~ќq/={і`жЌYж§'Ož$..ЮšnѕъеькЕ‹СƒёдSOсффDAA[ЖlЅ]ЛvVhщС™4щiТТТlя›oОХщгЇ™1cКamСтЪкЉS'^zщEыіз^{пџsчЮhїYOœ0‹О1cFSЏ^=›}‹/!--_|‘^Нz0vьЦЯЯ?џŸU ФФ˜н‚‡ Ц№сїW›ЗGeеЊе4iЮќљѓ+ѕ[„…ЃЃЃЭИЫšфЃ,ЫќєгOДnнšљѓ_­tоииXRSS™8q"ЃGЊД???Ÿєєt›qЖЩЩЩhЕZњѕыЫ!C*мЇљ5+ѓЃ/))aўќшѕzо}їыіАА0о|ѓ- !##ƒ9sцрффФ{я-!""€O?§ЬЎа*OMЫгў§ћYКt)M›6eюм9V7‰'NрттBЃFц2іу?тттТћяП_Ѓ\YYYМєвlYВdБѕWЌXЩ‘#GhбТ,і IKKЃ}ћv,\Иаz_ѕыГfЭ<ШРЏЈœEEй ЮŠх%<М1))цжЕЎ]Л0rфёЫ"@Pџ§7їо{zНІOŸFXXCЂЃЃбjЕŒ3I’xр‘LŸ>Уzœ‡‡оооx{{[ЗI’ЪъЩіыЏПаІMЋGрфЩ“7n.d[{SRRйБc':uтйgŸ-'ўN ( -Z4З1І]]]­ЧZјѓЯ?‰ŽŽfј№сvE(@\œХ•еv`q:u(..ЉђYOœ8ЗЗw%ЫŸўIЯž=ЌтАККІІІVdі\i+ВqуЧИИИ0oо<Л"дh4’H“&MЌН”5ЭGY–1™LфццR\\lуЂj97@FF:ŠЂTъ%Ž-–M+ u{Яc+DwьиIvv6Я<3ХК 11 €€€кebr ЅЅЅМ§ілж^`ГаВˆDћjšzНž+VRЛvm^{mЁ5єz= Дhб•Jem§2dffж(xбš5kаjЕМѕж[6ї~тФ <==­чА4NДmлж&Ÿ-ЎкйййW\ЮЂЂЂ№№№ 8ИОЭ;‹‹'<<мZ^,уCkR@ ўЫ4oоœiгІQЋV-мн/йЮ.\ ??Ÿ{юЙзКЭd2ЁгщjtоѓчЯ`§пЯЯЕZЭ… чЋь +O­ZюжожZЕм)-еољЅZОlй ПHюњ‚f IDATлЖmYЕj%гІ=Gaa!ѓцНЪЉSЇјыЏП)**ІwяоqђфIvяоЭsЯMУ`0№шЃ№§їп№№У+ˆ?ГЁlщ=вщt$''гДiгJтшРмwпНUоыЅž"[У;33ГLи=Юh4РьлЗЏьКїUкwётE<==mDtљ^ЖЊШЪЪ"))‰nнКсууc7MBBzНоцYjš†QЃ"--Ч‚oПнfŸ–ќiеЊ?§є3“'Oс№сУ•Фwyai5UEя­шЦћыЏПтььLЧŽЩЪЪтШ‘Ѓ,Yђ[ЗnЅ}ћіДlй’мм\ўќѓOКtщb#фєz=ёё DDDиŒН-OMѓсрСCфчч3rф1С`Ащq}№С‘$‰gž™ЪЪ•ЋШЯЯЏђ§хххqшасJї^PP@ZZЭ›7З–_K™lомжЖААРкŠv%хЌЈЈ˜SЇNU*уЩЩ)шt:›(Убб1ЈT*kOГ@ Р>NNNкˆPoo|}}йЕkЇuљюЛ=5žоппŸЌЌs6Тжd2ся_Л†w&Ё”›ŠEЙEЂOЊІLzS.$Iф‘GСh4ВПY&%%№еW_1vь8&MšЬъеkЎoуЎƒOЅЕ{ттт1™LvсЩ“Ї№єєДŠ{DGGуььlувk>ouыж­TА,$&&ЂгщьŽILJJBЃбT *“™™EffІе RЏз“””DDD„Е—­*,BоrЌ=,bА|^д4ЦЯтХ‹ dЭš5Ь™3зZˆU*oНѕ&3gЮЄИȘљѓXнaЭз1їJ[ЦЖ*ŠBLL4ЭšUn АИёZоЕ^Џчєщг”––2~ќ~јцЮЫ‰'˜8q"/П<I’ˆ‹‹CQkяzu"бž№­YyŠЕ6ІTLgiљВаО};VЏ^MїюнйЙs'“&M&''ЧюѕЋКw{=ќQQQИЛЛбАЁэ8сПџ>@гІMЏЈœ%$ФЃ(ŠѕИђeп^y Б/+@ Ј9‘‘ЭPЉT|ђЩ'œ;wŽЬЬLвггk||яоН9zє(џћп/dddАrх*:wю\Ѕ.Й]амь жЉ€Vkvq-**`сТeниюTcWPPP)Гu:iiitъдЉмјPћ=šƒоъrhГ+kM›6ЕщIЫЪЪ"''Ч:Я—„IхырщщYI\юиБEQЌU0vEtEєz=juеЯ“’’ @уЦсWœ—>œHо{o oМё&П§і'OžДКќ№ЖlйŠЋЋ+cЦŒЎ6 Ѕ­}ФЫ/ЯeХŠdgчаБcGž}vъэŸ/6џ)˜ћj/з_[>MiгввЈ[ЗЎ№гjЕ|ѕхWДlй…€кfWWйd"ЂI›k”{шээЭщгЇ)*,Фнн€пџEQЈ[ЇŽѕ>ЂЃЃqpp МqуJїVЏn=>LJrВMЇ,ЫЈTЊrЎЌЭlŽЕЮЃYхѓž8qw77BCB*Ѕёѕѕ%66–‹љљVїШЃGБkз.Т6Є{Зn (D[Цу5kvйwPЏЌрўѕз_ 8 вГXD €ФЅїU“|4™LЈT*kоK\rџTЋT ›їъьф„“Ѓ#Z­…„јxГ nжєв{‰:QхГХX55ЇїіђТбб‘ чЯг4"т’ЋP&|}ЬКуутшйЃЛU =rфRU‘5-OОeт7>.žЮ;pўќRR’ РAЃEСh4кф‰ЇЇ%ПдvяСлл<І7))‰eБИȘcЧŽ™Eb PbcbЭSФD6ЗžчдЉSЬ_АY–™:ѕ™KїZУrцфhvɘбzlFFББqxxxрть ŠТХ2зbwwї[Ч‡C рфЁЈвf Ў_%‹WвTO<ўX%MЕlщ‡•ЖЕoзŽ6T:оХй™ОџЮ&}ХsnмАоњHƒ|ГuKѕЖEыеD^УLЂ7dбЂЂ"žсET*‘‘Э№№№Є р"ЧŽЇИȘ>}њаЉcGРЬшЋЏПцѕ7оЄk—.јћћSXTDtt4 ЬЗЖєьбƒѕ60ыљчщиЁ#щщ:d—h(Лh2™ˆЇqуЦ•"ѓŒ1œC‡ѓќ /вЕK\нмH;uŠˆІM™8a|•НЉ—йяa3™LФЦЦб<2вюд.}ћєцФ‰<џТ‹tюд‰sчЯsрР|}}xх•—mЂ§j4š”фUаАaCZЗnЭСƒ™>c&7ІИЈˆуџќУЦ ыqpp Ix8ќё'ЏЮ_Р”Щ“ ­Q>юоГ‡=ЛїаКM<>žќќ‹„‡7fтФ‰Œ=ЪjЛЛЛгЅsgв3в9vь8БqqвЂE :uъhФоƒб@TT4б11ИЙЙѓќЌ™фххсычK›ж­IJJbїю=єщг›ж­ZUКЏкЕkг4Ђ))Љ)џч222pЏU‹оНzRЗn]Оўz3чЮу™)“mzЗж­[ГГ3уЧГ› ьйѓмmюёЋ@XXnnn$$$pфшQJŠ‹ЙћюЛyс…ч­SШВЬђ+ cШрС5zy]:wІD[Btt qqq”hЕДnнŠіэкЁVЋ чтХ‹ФЦХвЗo_МННk”Єž<ЩбЃG‰ŠŠFЏз3dШ`&OzRRSINJця#GHLLТЭнqуЦ2ќ~ѓt3›ЫђqJЙ|\О| CC4ШжНYЇгБjеjZ4oNŸ>}ЌллЕm‹‹Ћ 1ББќѓЯ?ЄЅЅсююNЏ^= )ПЉбhhгК5ЉЉ'9rє(gЮžЅsЇNŒ;†ЬŒ š7oŽŸŸŸнМЋI>јјј\?˜иИ8Ž?ЮХ‹Œ9‚6­[sБр"нЛu#''‡ГщџчŽ;FNn.кЗgцŒщдЎэoїњДjйŠФФDŽ;FfV}zїfшАЁфццвЂE МММ8{ц gЮž%..ŽSЇваЈе 8€_|ЁвмВ5)g`ve %:&†cЧЃе–2bФp:wъduХuqqСбб‘   “’ˆŽŽЁ Рќ wюмYдœ@ w žо>$%&рчч[eаO *• 7їZќSш€“ T8H QF’аЈ$Th$PIцП-‹Д%UЏ” M0БŽ–sY™Ш&SЕ5 $$$2hш0ЮœJ§ЯПАЬз_ofхŠх•Ф“’xійч˜0~џь3‘р–žх@ ѕƒ@ мyз\@pK—@p-u‡ш-!D@P@№Џд'B Сэ*DХМT_лc и+ I@ Ј@ ‚T ю”šДцš№l:б#*ny*„Ћ@ ИRa)Љ@ ИRdYЦd2a0яИgsаhPЋеЈTЗЮьжЈЙ…ІsММ|“QpptД>МЂ(H’$жb-жЗщР з сwн…——зu“еЅЭХ‰?дu9ЋИ–™—х$IЌХZЌoзѕЅяYЁ.%t2eрЎЪzЁІгRoUeЃ$%%!ƒАQФZЌџУ6 €С`@урHƒPœœ-§‚HwШZЇг‘~: ƒAƒƒУ­!DЇLJ‰ёЦє6\Мx‘Иј8šЕhYЃ n?ђѓѓ‰:AГІxxx^“Н\К\œјF #ФIЂ—ЋШ{рэћфT‰+пhУЁЄиˆбЋэёД'F…"Х‚бhD‘TмоN‡NWzЧх…ZЅцЎ№&ФЦDc4бhў}Чиz'гNбВu5К W77ё5w %ХХhдj’hйЂХ  I;)ДїVся ђ^ ИSёw’e™УЅ "­FѕЧхiХtТFўл6Jy.аЌEKJKЕШ&г™&YFЇШ7!&ъ|}|юl!Њ–T„††RЫУC| СJ-BCBIMJМbqYsЁj^ЇуJ/7~…:NцmŽ*ё‚[ Н|mЧ+ „КJќZъZСmїњRI’Ъl”†ТFўƒ6Š@3™ШЫЫЧХХmIё-§<В,sсТЎюxЃWWђђђёђєD­V_ѓ=]‹_­ЦоЩ”^№ri]]psЏ%ОрЧ­V-\\]/е —˜їЧЧЧГtйGdfdpїн§™4i’н l e“и—isT][рюЌЌ,ќќќўUїY–9wюAAAWuќЩдT<<<№ѕѓQpЫрp ёєВйИP,п|9qjA’Ь.wЯ=7%K–рчч{E‚TQ”2Х§Šю­ЄЄ„д”"›7/Y ИMm”JBT–)еi‘eŠ"пвЯђл§,§p)[ОйzѕТQQ(еi1Щ2*;BДІ:яZE(Р-з—}Nэл‘™™yMiСПУ•ŠP€—.ЃwЏžlмИQЃF•38• Ыеc2™0 жџ‹‹‹щжЙџj~§њЫ/<:q‚н}яО§6ЏПЖАкуЇ>3…ўљG<С\ЋTЊммн8p ЕЎ[]T#pі‹/^ї'~пНќ№§їтU џvm#+5^ўњуOЦŒMчŽxїПЛшŠŽПЊEЙђћЌИмJXЃцоlіьоЭђ–‘”˜ˆ››экЗgё{яущщХшБcёЉЦoЙ&iСэ!BF#gЯœЁ_П~xzzU):•Вљ‹EБN[UўtЛwяbѕЪ•$'%сээЭаaї0cж,œЭ‘яР‚з^ЃcЇNжѓ•_ўэ<ГwЛvA6Щ5ЪW1ХрЮЉGЪ}пeeлЖwг\ж5j5ЃFВcЏДКˆЙ—ЋГ†пw/ююю|КщѓўЬ#FŒ$МIёђ‚[мŽ)oЛЬš5‹1cЧђюЂEфцц’ŸŸУ‹Хь%rЇќцkІLЪкŸrߘё7эЂ[Зlfі‹/2ѓљчщгЗк’~џэ7<<ЩЩЩ3mк4BCC0 (ŠТИёц^С‰&№Р#Џшaѓз_ГpўЋМ8{6={ѕцєщ4Ь›Grr>ўƒAлН‡nнК‹Т(ИcШж›ХЂЏCћ_ЧЫ‡aЉеjyрС‡јтѓMИКК2{і222())!44”^xž   ЫŠQ{ФDG“˜ˆNWJZZ 4ИЁy3vќxQ@‚бFЙTздЬ577'‡ТТBюПџ>|}} Д/Ы2жo`ыж­Јд*&L˜`m4ћт‹/XЗv&“‰Ž:2ў|\]]љс‡XЗv™™™№эЖoбjЕ,^ĘН{їтшшШ+ѓ^A­V“™‘СР((( WЏ^МќЪЫИИИм–яRUОМткh4ђж›oђќ‹/ђєЄЩ4nм˜–­Z1љ™gPЉTRПЙЙЙL~њ)–,Zd=v§кЕ<ѕФу6iєz=#юП6-[а(4„{‡сдЉSжcЮœ9ЭCŒЄqXCкДlСИ1Ѓ+нг‘ПџІ}›ж„7 уоaCI*амЎukьпРйГgh‚^o6fПјќsЦŽeНЏЭšв,Ђ O?љХEEЄІЄpWУPДZ-`Wв(4„ЬŒ QƒnyцЮžЭШћя#­мЗцёˆŒЮЋЏМ\­ЁhяЛ_А`!Mš4aхЊ•tюм™W_‡Ngž–A6}і);ЖocФˆсv{ј.mГэЩ4 ,~ї^š3‡qу'PП~}КvэЦЦO?хряПѓлжs=ŠFЁ!1—[,ъѕriЪKNv6#G>pй›ынЇ‡Вў№ряєюгз&С`рШпѓЩІMќoп~BBC­аd2ёШ„‰4nЮџіэcщGЫљѓ?*]Їб]wБyы78xˆњѕƒyї­ЗшиЉ#Чрш‘#FbЂЃ8~ь˜еХoР ќјѓџБчћHJJтЋ/ПЄaX „Xяџш‘#4 !ЈNQƒnyfО№Z­–'{”мм\sEv6?њ(КвRІЯ˜iЧГ_(ВLB|/ђ№Ф жЎЭC>ˆЃЃGЕŽWPI*IB*WЏ(Вl]('ИЪ/БББфццrЯНїкlЏSЇ.э;tА QEQјфГMФ&$ђжляXЯЗоy—Ÿўя4 cСЋfб—š’ТЌг™={лwэтјБc|§е—(ŠBtTM#šђыЌнАбцš=zіфУ‡­џ:t={Ёзы™єфtюк…Ÿџї?x§Е…жtоо>lњтKЖямErrŸ}њi%‘ЙэлoљxуF–.ћˆњ™#АйЏ( пlнТЗ[ЗђЩІM|Аtя/YL||<{ќ‘и˜~ић?ќє3нКїТH,7}ш:“Тњ32…FѓЖƒТКг2“Тп*\цэеŠ%šбЅПРпЯ€кмџ}$$$TЊ‹ЊВQЪ‹бввRvэиСˆ#ЙяўсlнВЃбXЉžЌЮЦ0 <љиЃtэо}ШТѓHOO'//Ÿўї?vџ=!ЁЁ5ВI™Y/МxE6JЭ5ŽЙGГ& (,_Бœ† 2iв$žzђI’““P™~јбcFв€цЭ#щдБ#ќёŠ"€ППuыеЅoпОœќџ?ŽЂ(ьйГ‡={вГW/ъдЉЫƒЃFйєЌzyyсууKppp!к‹уЧQPP€С`рЯ?џЄg/ѓЖЂЂb&Mž‚/=ё$П§і›ѕ8WW„„а0,ŒсУGpќиБJЯџэ7[yєБЧiпЁAA4 Љ”fчŽ<ђиc„…5Ђu›6tыоп;€ЋЋ+99Й\8???ќ§§…0ЫM_‚ ‚ТЧgdŠŒ Ÿ•Щг+Œ‚zЮvŽ“Эnnіъ{ѕ…Хрєє№ЄИИјŠ<7,ћ~ўi/nnnДiл–~§ћSPPРў}ћ*ЅЏЮЦ8vь(EEХL}і9ќќќyjвdіяпoняььlЕ*FэЎЪ&WnЃ\)WRЇyxx0cц vэоEЃЛ1ѕ™Љ”””pюм9>xџКwыNїnн9pр€ейВe #† wЏоlйВХ:< ХіњйййFmч*ЄѓєєЄАА№ŠюћVтІЯYрщх…^ЏЇААZЕ.EК[ќюЛбКMы6š6mЪО_Сгг“ьўИX№ѕѕЕFС<{ц,ѕъзЧССЁк{:|шoМіЉЉ)8ЛИXƒ›єшй‹7^{ Н^ЯсC‡xсЅљтѓЯ8hљљљДjн€O?љ˜ukжЃЃ#}ћї`шаaŒѕЏНё&Пўђ?žуZЗdіœЙМљЦыtlз€yѓчгЇoПWцќќ§ЩЩЮЦh2ЁVЉ…ЌsчЈэ_Л’AYЕqI9бzЉ!ЮЫл‹’’ pЏ0]TVVf™+‹bWр–пцээMAAŠЂ•™СO{ївМi„5MгfЭь_БўiвЄ іяУУУƒрр`ќ§§љу№arsshйЬІ7ЅЄЄЄвљММН)(ИXщZ™д­[ЗВ›bЙgШЪЬфЭз_чэ7пЬSУѓ№#ђј“O№јcrз]wБрЕз …\pг‰t‡!Еaї9……‰цВ|o D„ЛRЉ!О|+{љoA’$›ЦЄђuƒэ—a?ˆбхЦŒnпЖ~§яF’$мммшбЃ';ЖoЃO_[ЌъlŒЬŒLrrВirW#›oо2\чjl@p§l”*mљЪЇoqvrт™)Sјfы7ЄІЄрууУИqу6lh…z!ƒЅ.eнКЕ4jдˆ 6™™iлШ^v}/OOT*™4jдЈ\§%лЄ“,6€,п–яёІїˆFDDрссСЎ;j”~иНццпэйУаЁУ.@Й.œ?Yѕ?kЦ FCTl-_aнLНzѕйКe nnЎєюг—'N№у?аЛOдj5щgЯђк‚ЌZГ–˜ј~фбKЯкД)нХч›>#--={ŠšCp[1ё‘G˜0q">і8cЧЏRlVЗНIx8юЕjёЩ'Ÿ••Щз›7ЃзщhеЊЅ]CгвbZГвЮѕТУ›рэуУЮ uJzњYўўы/Кv3{.888b0jTwјљљ3dшPNФФr"&–Ји8ОоRГ9Л† ЦофЧ~`№р!eчѓ# РzО1БФФ'и .`зРќ§ks6=Нкkћљљ3сBы5Ђут™љќ <ђшcќяз}дЋWŸWцЮ…[№ЏбЭК–НясНЊmбЊ4SЅ:ЂЊЦ,{њє2uW^^ПўђiЛŒ4 IDAT п~Г•ж-šгКEsиЯO{їRRRb“Ж:УппŸРР@SR­KЪЉДЉЪ&WfЃ\•­aЏb~~>_Н™ддTЮž=ЫW_}…FЃ! €ЛяюЯgŸ}ЦёуЧЙpсџќsEQЌ.ў&“Љ,ю„ЅсэR-g9ПZ­Іoп>Мџўћ$%%‘‘‘AzzzЙ;ЅЪиЗ]шчŸ}vгЂц:::ђмДщМЖp&йDžН0шѕж @Йяўс|№ўћ8:8№н?^бЕ:wщ‚ЂРGЫ–2jєіФИКЙБnэМњ*...„5jD@`€нVХЎ]ЛЁзыЎ8аЋЋ++зЌц•ЙsYЙ|9 УТpЏUyтызоx“з.реyЏрттBлvэЌћю1‚?xŸ™<саСƒV №ьДiL?ž‹љљxzyY[gю0юЛИЈ-З%jЕšvэллm5ЌЊ5бAAAМћЮл6iEСХХ™лЗ]j­Ћ @m\h‘AQйФ>b$ЎЎЎЌYНšХ‹оХлл›СC†ђьДiжу'?3•fЭdлЗпpї€М<яU;­ŠцџУТТXДd ‹оy‡єє ќkћГhЩ{ДёіЖ9ЦОООtъдƒAO@йиFУšЕы˜їЪЫЌ_З–ZЕjёдЄЩ•ЦyVЕV…#G’““ЭЌг)**ЂџнXДd cЧуѕ… шїнŒ|№Arrs˜іьГЬ_o&ъDЏ-˜OaaЁЁ!Ь}ež0pџ*аРkЁJэN–јgeD’$ХЅЖL:9;Б}лЗeUbчŽэ6псю;lФhMиГ{<јP%{cи=їВsЧN>ZБ‚FwнХыЏ-фН>ЌвЦpppргЯ6ёв‹/АzеJjеЊХ3Я>W#!ZM"*л(зѓЉЉ‹kн:uXВdБну%ЬSбMœ0ЁвО уЧ3ЁТtMŠ,3yђЄJзwuuсх—чsmвwюдЩšЎџ~єяпяЖuЭ•ЖЄъ•ЃBЁ Ц•p>3“ЉzUj0HLLdаА{9š\eКф”dњ Œ““гПі€)ЩЩјјњb2йєщgDGGБnУЦ~]­V‹Ђ(lпЖЭ_ХіЛDm!ИЃ(/dt:џЗї{Т†й™jrЦ`еBыRŠЪдТЉ нН%"м!аQСQ%оƒ@pЇЁ—!K/[Ј№[><ЊФ_2ZЪz)-‚”rг2vДRКrЉЪїŠІЄІар+O^ZгyGџ-C дœђ6JUК&9%…ŽЛЂQIшѕК;6/œаMќuјТТьzk6Л‹яvnЇqуЦ—ѕцTЋедЌУgYЎдRƒЋFТU.8kРI%сЄ–PЋРI•„Fj д*;СŠ*ФАo€–KЃ\&]IqёП&DEaжЬФХЦтшшHћxэѕ7nЪЕџячŸ˜1mЭ"#YњбrQ юX PR\„BeзЊDЈЕЉF„VЊ  H&t:#ВЋ#ВЌP*#ФЈ@p‹ŠЩkA–ЭЦ ";`TЬ= ’ezЇ2Y)•)KKЇЂ(жtхы*ѓџ•]t ЈААRлуnMC д‹R•f‘дjммнљыЯУєюг$аыю<1ъшф„ГЋ+Пџє3nююHju•yЂ\&Мnhд\23гёєђBЅКљжЂ$IцqџC‡нУаaїˆЏ_pЧ#›LdffрьфRуjЊ’;l"T–хKуП…@Š8Y "РY…Щ$‰ЬюPВu2' дЁд%ВL„JŠ‚JЅВжіФhy r]$йи(Y™щxy{_•ђoкрzй( VЉ№іђ&77—яvяЄeыЖјћћнqyqўТŽџє3*ЕŠzuыЂОNкьZФш Ђ>о>фч“šœH`P\нмџA*n@х.Ы”‘•™AA~>>>оФfeё и~Є**[&Ђ/[кШщь‘Bј=Ѓ`W‡šE ЗŠ‚Сhрt‰L6N х В$_*I ЫеŠбђuŽ% Еm/ЉЙк№іђцb~>)I еЉ+lрЖQ|}}ЊMяъъB§њѕI?{–Ÿ~ќо:ф„‡‡д­WWW—[тžnxЈJ%‘—“CсХ‹тЋю;бVHF\]\pА3ЮЪžKЎх›РDB‹ЫхцгR“,ЃШ2юВО†xŽ*>,vtт…w A’–~R.nЃJBRЉPЋTH’„ЌRЁШ2ЊrтВМЕД‚UчЂ[бF)ЊТш”DC—@p[cБQ/3LPЅRсхщ‰‹Г3ЕkPЂ-ЙуђТеХZ899н2nжЈЙV›Б|(ЪЊ-бъ'ш*‡“ЃNŽNтKюP!jнfВ>›ЕЕWД|tЗђhEVЬЎxj2a2ЩFє=эŒй˜d“xСŠZЅF­QSтр€Ѓƒ#д*дjЕЙ>QЉP$’Њ‚а,ŽŠЂ •ѕšV“=ZСFБ':…юухВIT’„‹Г3ЮNNwddљђн.ЏѕЎ@^ƒsЎfЪдЉЌнјщM›GT ќъћYЅтџжоаЪ"ToаЃ+еQЊ+Х`0 г™чжh4ж ЂСƒЃЃ#NNŽ888`r2сфь„#fЏ ЕZ ВŒЌIQY ,Ћ+.х‚U!$k>Ё‹@ јЏa#и7Ш@pcдhѕѓcVLcqЩЕєšdйкЊ+еQ\R‚NWŠZуРа{яУЧЧЃСpйщІСэƒZЃAЃб“Э?|ЁЄ“ЩьAЁ’TfГE’ЬnКeu†ЊœёX>,nХ1ЂVaZ>tЎ@ „ЗƒЖTЎЫёŠѓ™5ш%A*›ddй„о ЇTWŠNW ’ŠG&'ћ<gOszЮBŒjдЈеj5š/>пdn€RЋPkдЈT’Щм[!YЎ.MЩrНЂ5­ГDЯˆ@ !*nqЊдќРЪч(ЄHVdLВŒС`@ЏзSRЂeфƒ‘sс<&“_џк899 #Q И9}*ѕЊ•ѕ& @nN6ƒ‡ х›-›бh48:š]u%•ŒJ6Gа•Є ‚Б†=žUEйСЭAФ)7\ЄV5u‹Э>k„]Ќbдd2a41”––туы‹б`РЧЯgga4 ЗюЧm ƒ_??JKK1 FL&“u ЙЕ§Šд/едA@ ј—„шђeЫ;^*зйНŠф—ŒE‹U0Щ&dймSa0gg‘ЧС­\\ыRVєz$• ЙЌ.0GеVьж7ВŽС ЂSІN­№г!ЗFЃS5rїьоЭрhжЖ­[1эйЉШхЇ‰З&“ЃС 2B ю@nјбММ<убkQЄKsrUЭNЌХZЌoнЕ,Ы—MWўћЖЄ—-џ›d$ЉВ›œY0JцЙA0šŒШeуCKKu”––RXXXe=ГuЫfцМє3fЭЂwŸО”––rтŸуЗЬ„Эръ‰‰1OТюш„‹Ћ jЕFƒJЅBЅR!!ЁR™m UймЁцuйPQЫT хЦ€Zъ+UЙЙFЋŒВ ЂўkБыmmЉƒ$œ\œ‰h——з'DЫЛХTGљ4еЅНxё"‰ ёxz{QЇN=ёk*мцдd|•%ђ­Нє–JХМгъbЇ(ц1_rйи/ЃбˆбdТ`0P\\ŒVЋ%//пn e4yыЭ7yiі}ќqыі–-[А~эZ>ќр}LВLїюнYђоћИЙЛГcћv>ќр}вЯž%((ˆ_ќЦњЕkYБb9E…… 1‚ЗоyWМtръ*‹jыˆььќќ|Ћч]vŽ€€@МННpqqСЭЭ 4ebT’$Г•$$I…di№–$k ЂŠ RхХeMЦ™‹БшрVЁЈЈˆјИ8"š5ХУУѓЦUсW  Џ›ЕVќ—36ЫЈ.э™гiд Жmœ]Ԙ.рNЂvЃцV D–/5a)ŠRiўP“Щ„lЂF#zНžЂЂ"Š‹‹Бš•n!..–œьlF<№€н{0h ƒ‡EЇгёи#ѓе—_ђиOEГf‘lоК•ЂЂbrВГyыЭ7иБk7ѕƒƒЩЭЭ/\ ИDGGsъф)М<НшоГ{ѕ†>оојњњрцц†ЛЛ;ŽŽŽhЪцUIjЕ$ U™АМ$0-НЄR%ZіR DЇЂрVЁTЋхœГ3gвNг,2ђЦЩP›рq5б„зKˆ^G4* ??\нмDЩ„,=ЂцiЌНЇВ‚")ЈЪ*4•Є2/*UY/‡ I%йmЫЫЭУббOOћ-ƒѕъеЗў=tш0’““Ќџ{{{уччŸŸ?ЈT*RR’iкЌт… WoЦи%%9…S'O1ŸддTB6Ќі\’JВж*•ЪІ~PIR9ї\ЋЕг#*„Ј@ ИнqusУ_Q8[RTm:“,CГШfЈoсaJ7єЮpvvЅF м0<НМаыѕинџщ'гЃkš†7ц“7ЂЏ"№‰‡‡kж­чЃЅKщгГПўђ‹Ш\р:’™‘A\l,Auъ№иSODLt ™™Y"s †8;;уррPх~EQиАa# .dіKsnщgЙ-"y”––RRR"Jž@№_ЧтЋWŽˆˆ<<<иЙc{ЅфщgЯђк‚ЌZГ–˜ј~фбjOпЋwo~ќљџxтЉЇyњЩ'аjЕ"Я‚ЋњVm]Лђrr8vє^ооєэпŸ Y™єэ7žž^;z”Ммм*чAЭйЙk7?ќ№)Љ)ьоГGбkaіœ9;vЬюОYЯПРСƒ‡ЎњмzН^”Xр6Цбб‘чІMчѕ… љфуœLM%.6–/6mТh2`’MшtКjЯЃеj9vє(%%%DDD гщ0ˆi#‚ыBBB"NNN <˜‚‹љШВLQA>‡ СбСЄЄ$‘I@p:tˆO?§”6mкp№?hйЊќ ‡џqKоЏцf_pїю=lлОММ<ќќќ5ъ!њєю]э1еэлЇ7!! Ўъ^VЌ\‰—ЇcЦŒ%W И-А_<іФИКЙБnэ^[А€ZЕjбЎ}†ЩГгІ1qќx.цчущхХ„‰эžумЙs<3e2чВВ№ѓѓуе Х8Qр:бЛ_œ(.Мˆli 2™а—–0тС‡0є”ŠŒ‚*0Щ2Y™™јљћлнЯ‡K—ТЛ‹s>#E‹—№иЃ№свЅx{ПJxxуџЎMJJbУЦМ№ќ,BCCЩЬЬТн§к 4шЊ5ŒЂT w„…бcЦ0zܘJлЇ>ћSŸ}ЎвіЙЏМbѓHHП:,2X ИпЉ^WŠ^ЇХhД§не Ш…€Rщс˜+—ШЪЬфи‘ПщбЛŸн§_~ѕЕjеbщGЫ)ʘЩdЂЄЈ€eЫ—ѓ№јёlоК…WцЮНЅžщІКцІЇЇSлпŸN:@ЋV-iдЈO<љ$QQQжДEZZšѕџЭ›З0jєЦŸР{їZЗO›>ƒпџ0Я­ГxЩ{<4j“'O!::њвЫЫЪтЅйsИяўс<ђшc\ИpўŸНѓŽЋВzјї^.K†€Ј   С;­м{я•š™ГЬНЕЁцЮQYцЖa§*Ы…[L­MsІ™“”!ŠЈLЙƒћћНpЙИ *иѓхѓ~юНч<чМч=я{ЮѓžёпЏ_OЧNНщлЇlЯ.E#„ТпLѕ“‡^кЛ Т#юЦнСЪЪќ8ЂBЏ#5%ЦxџujjКЋМBЈNŸъˆhЩ’%љpёbюФХёцАЗXђЩ'$$XЖ&ЄfЭxzzђђK/бЈQCuŠАГa$%%ЁP(2щ/— ppp VЭZT­V+•J*N! Іц–ѕђтіЭˆчтšŒЕН^ўс‘њLОНr’MŸUc>?wwwzѕьХМљѓбыѕ88уюНЛВFiѕ†МЂЂЂpww7ŠsrvFЉTВ|љ2<=<ŒЮЦ;wаjЕXYYe\МJ…VЋЭѕzA ліž5LџЈёgŠЫј|$Ѓ7в7z2}ЯђлрKPŸ)џЇ@JJ іііrг!?К‚є—Сž9ЭЩ“'ащвАVЉHŸŒЄ0y1œ’œЬёуЧAЁ jѕ(•ЪŒЖЎ7t LuФ#§Ђ07cB‘k?EЁ(ѕСюо‰EЉTйEOJ‹[j>N)žъkЧ .pћv,*јЃбhиЗ?^^etЇєЛvэЦЯз[[[tYІшФХХЧŸўЩсУGXМh‘ё…XYб A}жЎYЫР(VЌїяпЧппŸЪ•+ckkЫ_|IЇЮPЇІтцVв>r„6mZsїо=*ЪS.…Н{kF)6iи€ˆˆ”J%eЪ”Ёs—ЎŒŸ81пГ nнКEНыr%ќ_ЉrAШ_ €‹—.тфьDйВeщжЋ7NŽNёQ›NHH`ы–мŠŽцЪхKT­^УА>TlHA„tbЂЃ9sњ›Е0 OKKут?јћќy’S’Ю8QšЬ<)VЬž  jјњњЃPŽНqžЊ!š˜˜Ф–р-мИЪЪŠŠ•*2yв$њіщУЧK–0~Bzчбгг‡tз.ќИa_­[‡ЇЇ'“&NФЯЯзPљэŽ1‚UЋW3qвd uыдaђфIX[[3kцћ,]њ#†РбЩ‰iгоЃeЫ–œ8y’с#FRКti>§d жжжђЄ B#::šяј‘ *pіьY&Oœ€#GЮW~:ЮАуœ ѓsdЯВ+  $юЮ>_Л–ОЏєцЇˆŠŒФЛœЗAЮлл›ЈШєЕбббМ=e2ЇOТжжН^FЃЦЪЪT5Ž3†љѓчбЌIc:vьФŒ™3 ыиAАФ65нmпВ]sг вЧсПиг@–шн'gчЉыœШV Њ. Тsж‘Ь),ѓvпY?9Ќ7rеЂз“––†^Џ78Езh4h4RSSЙџ>‰‰‰и‹ЩБlЎЎЎ”*UŠRЅJёж№сДlоŒ„„<Ы”сЦѕЙызЏSІlњnн-^ŒЛЛ;'NŸAЁPP­Jelъ,­Vkuptdоќ3vC bэъеŒЫfMК fˆёgжяйє7Ъx—Їtщв8::RМxqlmmБЖЖЦккЅR‰•••ašБŸвє]!MO{є;ѓчЃяШњ;Л0A„g…FЃспkзžœš;яqЧUљЩ//я!CЖn2Y,+Тѓcˆš“1 Y:›i™:ЂпSz=iY R­V‡NЇEЃб’”œLJJ їюпЇSЧйž7>>žиилDGGГlщRќ+TРйй™žН^aёТдЈY[[[>[њ)§ћПЄOT*•ЄІІН0squХЩЩ‰элЖQЇn] ˆПOЉвЅБГГУЫл‹ј„xy !O§гUŸЙy гgŽХЅxqьээq(V kkVV*T*cTЉP€Bт‘ёјШ}dH>2@3˜–™bˆ ‚P˜HпYм=флMBЉ4 фf‹цзžЭ—!ZаДяўJЎ#Ђ;‚7гЉ[yВЁЂOcD4!!˜˜˜l8{xx№jŸо#ВnнК|ёе:КuяЮЭшh†dи5wР AŒ7ž уЦRЇVMT*^ооиййaeeХД3˜7wЕšЩSЇђoјП|їэџЈYЋ3fЮ’Brа&m5ЇEЂfвъЎ Џ§R}J—.“““Œˆ ‚№ŸGЃбВ=јЙИqд• IIIшѕi8::IeB!ча‘пВS(Œ5ŠЃF™ФљњњМmЛйtНћєЅwŸОFaгВq1%‚%ЦЉЉэ)ћ ‚ qнўi•E§тOЋ~U(•aЙщW=к„wEzjЎZ­FЏзSЗv-|МНXЙ|9zНž•Ы—SЋz5ЊUЉЬ‡‹Ёгщ 7)Л8s,_і5ЊQЇV-~XПоўХкЕTЊBPхJМѕц$%&АmыVš7mBХ ў4mдPкˆ < НћЩЃЃЂјћќyЉGAxђMеЄ­fЕ/ГГ5ѓт9@с?Џoѕzдj5 ‰IмOр^|їтуЙwпјHLL$5UmЁџцЇƒ*;хoщ?˜Тp)'ЯœСХХ+++ЖѓЭзыXћХ—ийй1zдHмJ”`№!9Ц™ЃFЭšРБ$š IDAT,_ЙŠKџaьшбTЌX‘ZЕkгІ][кwьHjj*C ф‡ѕыђЦќuі,AAUйАi‰‰Iв2ЁА`ў|д53оŸЩ—_|Ajj*ГчЮ•Š„gbžЄ™ AђЊQuii]нЅp/ю.ZісŽрщ# ™БVЉ(QЂj]Ў[ђjЈбgХŽрЭЩ™sѓЂTZœЮoкИ7оFКu3vkVЏb№!9ЦеЊ^јјtП€_М@У†№ёёСЧЧ‡Ž:Г}лVjеЎ——Зсм;vтђхK†пЎЎЎИЛ—”ЉТ‚№ЛБYiвА(•JЪ”)Cч.]?q"JЅ’’ІK“Ъ„gн~-š+‚ X„BЁ@Ѓе{'–ВeЫв­Woœ@‘ЩеЇ‘Рж-ЙЕйЉЛЯ‚Bcˆ”бЈШHМЫeŠоооDEFцЗqѓУлs~OНЫysсяПјцыu|Оf БББиииаЂU+i ‚№ MбшшhОџсG*TЈРйГg™[њ)§ћПžkœ9bbbˆ‰‰сШсУьмБƒрmлб>ммH—І#55UžzAxк§л\тcbb=J^=Г•љуЬfЯšЩї?ќˆ››WЏ\aќи1,[Б’РŠ 4ˆѕпЧ€ƒ˜9cC†ЅkЗnDEE›}Q%Bю=‰Ь›5f 3—V6+AА\гЊеЉ9Ю( юнЛ‡g™2єьеЫЌ\DФ о:„>^BЅJ•иЙsM›5Ѓy‹єэзаC‡0pХŠqѕЪЌЌTЪ=„ќ6_™š+‚№ЄьPt:mŽтFёi‡>ЊЂ\џ„пˆ0 S(Œ5ŠЃF™Шч—•yѓ?`оќЬЦ3–бcЦš„П7}К4 AxЂ:7{ЗlХJ‰Лs‡ЯзЎЅя+НљщРЙгЇNЁP(№ёѕ5„EGEБ7$„@?CчИjЕj|ђщRfО?ƒz/жeјШ‘ {kИмAШŸ%jќ™ѕЛ ‚№ŸB%U B‘ьЬfСее•RЅJQЊT)о>œ–Э›‘`"зЙKWœœ<рuЖэм…ГГ3%K–Ђs—.,љtЉ‰МЏŸ_џя[ў8s†ў§^ЅFšМ\ЏžмAШ­fiЋ^$ˆš{ЙdДFTЊR!Я*Иˆ”SiЎр–X/‚№4ˆ'6і6gЯ†БxбBќ+TРйййЌьф)SЉШЛoO cчЮ„ьйУЮл‰ŽŽцТ… ФнЙР‰Ч‰ЇД‡Х‹Л/•-a›ъѕњLGnƒЂв›Axк1Пі]Aк|*Qј‚ uХыссСЋ}zртъJнКuљтЋu9цГ`сBš5iЬў}ћhйЊK—-cоœ9DDDPЊti–~Ж З%˜?w.gУТ(VЌэкw YѓrСТމ%šљ3ыїl:@‚ B{IFКЕ№jвчnзмќ{›„ј|§ќHNNцъ•+†ѕaЙ‘Wљџ"WЏ\Ёxёт”pwЗ8ЭЭ›7qwwGЅ’йуBюКєа‘пВM’yэvця%мн ;wо№ЛUы6ДjнЦ$}№ЖэRя‚P ЭWoє™ѕЛ ‚зN‘о|?)W;ДpьVЄЬёМ–ŒС>ЉБкЇШŠeЫјўЛя8zˆwІNЕ8m^х‹:)))FПЬŸЯьY3sL3rФpўју‹Я‘””ФЫuы/S 3 J67„"аTѕц§Зdw˜єCdЈ B^эФŒ`SЭл{yБ гUЪ,eчŽ `ьwЕAЃ†4iвT*GAШХ6M_š–щx&‚ ќїy‚Хh4“CЃFЅb„Їз‘}јйrsŒT† b–W2gˆf§žsЋAž7ŠєˆЈFЃЁП~дЎYƒŠќйИсGвввјє“%д­]‹—ыжсЋ/П4ШБv-еƒЊTЙoНљI‰‰9ц?zфH>\ДШ№{с‚˜2iRŽiЎ]ЛFЯюнєїЃSћіќ}ўМEqI‰‰L?ŽJЈїв‹ьмБУЂИїо}‡—ъМ@€Ÿ/ѕ_~‰_~ўй—’’ТдЩ“ЉR1Њ•+гОmЎ]ЛfTоддT7ЈO Пд'dЯžlырїcЧ№ёіТЧл‹ˆˆЬ›3‡гІђ[Лf5Еkж R@~0пЄ~rК?YщкЉ#~Оtщи№№pCјоš7mBЊAМ3u jЕ€m[ЗвМi*V№ЇiЃ†\Мx‘Wzє Јr%^эг›шЈ(iѕ‚w{%VŠg[…Jк[х;НЗ“ [™м".LfxЅešЫe4%WBё(о8­˜ ‚ љеОOsНdўѓV.џь3‹Š^—ˆЊеjBфЋЏПсрс#ДlеšM7АyуFОџёG–Џ\Х‡‹rсТкДkЫо§иЕ'„K—.ёУњѕ9цпІm[B4ќ>qќ8›d?Јеj2h Еjеfџ/ПвКmОоŸ”””уfЯšEtt4ЛCі2kіlІLšШЙПўЪ5.ь?>r‡ŽќЦ!C7f4<`ЮЌ™\О|‰­;vВя'nоМЩНЛwЪlkkЫЪеk8vќЏШдЩ“ащtfырХ—^тђЕp._ ЧЫЫл(Џ-›7ѓхчŸГbх*~ўѕ ЏєюcRG9нŸЌ,ўшc~=Š… М?=ниНzх уЧŽaкєь сЬщгЌџ>}}я_gЯT•#ЧŽБюпЂбhxsШ`4jШСаP<<Yђ1зЎ^%АbE6mмШЦЭ[ LЏ kѓеGљ 4˜љsч‹ЃЃЃIн(ŠlwВнДqo {‹—ыеЫЖŽrК?Y  ФЭЭ!Cп oяWиЙsM›5Ѓy‹t}ћѕ#єа! €ЋЋ+юю%qw/ЩёуП“˜˜Фш1cQ*• >‚ю]ЛˆіzNiцmGŸŠ”wВ"^­ччјъ\"ЉКt5љyЋ|z&?oЋ‹Ь5ŽQЃTШНŠ&VVJЌЌЌаћїэЇYѓц”ђ(“> “бyїnЁЂRЉPЉЌАВ’~A„|[˜я-уОХ’ЋГќЪЭ˜љ!:*Šй3g2wіl }*Јп|НŽЯзЌ!66ZДj•c^ŽŽ4iкŒ];vрчяO``E#Ѓ,+Q‘Qx–)cdЈy—+Gdd))В‹EЃбр]Ў\І8oЮ†…х—…BЋЋ+ёёёмКu ЕZŸПЮѕЭлS&sњд)lmэаыѕh4љыЈGEFтээ•яћ“nnn†tЃЃЂиB ПпУ†ІЯжuNtT4wюФR) ‚!LЇг‘’’‚ННН(ЋЂ­chяkЯШNЌ=›Шё›Љx:X1І–3хUМs8}€ЊZtЇnЉх† E…BЕЪWюХнeЫІM(  P(Mk•Š’%K’”œŒB!o_Arя ™кlz3%}Žщ-9G^{eљ5Dѕy7Ђ%K–т­#шнЇЏQxdDsfЭbлŽTЎR…O—,сFФ\ѓ0p ГgОOн_ЂcчN9Ъz–ё$:* ­Vk08o\ПNйВepquЭ6Юннkkkn\ПN•  Ўџ{ВeЫц—н?~Н^““# …‚˜›7qrЪ~jпG‹уююЮ‰гgP(TЋR9[YkkkДZmЖёЅJ•цЦˆ|нŸ\z3Fщ;wщТ’O—Z№,”ФУУƒЃЧOˆОzŽP•†9В:,‘эW“г_Š$щ˜z—umмЉ]Ъ†г КЛ№гП)|іGЫšЙQв^Щ•ћZцПOdЂ€†elRе[%Ё‘Љ|іGš4=ЭНэш_йвХЌИ’Ц€НS gМ\œ :О:—ОўМG@1ЊЙл0ѓш=|œUŒ­х„П‹5џмеАшD<ЗSвЯхQЬŠ Jтh­рHT*ŽчVЯАъNи(1”ЕW@1њTtРNЅ јr2Ÿџ•hвT^Ћф@'ПbЄщсЧ‹I_NFЅ„‰/ЇA[єzX–@HxІ BЁГEŸDкЇуFдxшѓ ёЛtэЪЪхЫ9~ќwbbb8y"нбъв;|К4ЉЉЉFiЙrх2ЉЉЉ888rѓf4qwюа aњTмЭ›6вЙKW“ѓe–Џ]ћ\\]YјС\П~eŸ-хСƒ4jм$Ч8+++КuяСм9ГЙzх ћ~кЫЮлщоЃgŽq9сшшDГцЭYИ`бббœ~SM їŒѓе*iУё›ЉЈ” fеsсє-5Bb‰MIcDІЕŸїдiL8Ч[т(яЌЂЋ1“KoUЮŽю՘§ћ}§tЧЌ!йІМ=­Ыл39є.s~ПЧр G|‹ЋhPЦŽƒŠeаOБœИ™*Я’№„›jz[U(ииирфш@qg'\œpqvЦЅИёсшшˆ­­сeЊсKTс1,ЭТ­C•#G~ЎЊНoП~tяй“сУ†бИA}о}{*I‰‰”/_ž1уЦ1 ‚*Uф›oОЦллл`М^Лv-›7SЇn]*0wЮlCžНћєЅFЭšxzzšœ/ГМJЅтЫu_sцЬiZ4mТо=!Ќћциллч№ўЬ™xxxаОmfLŸЮЂ?2L9Э).'ц}АЕ:•M›№о;o“–ІУбЩбHfЬИё\Нz•:ЕjђBЭxy{cggg6ПъеЋгЅK^щй“Џї7йЗOпОєыпŸ1ЃFвЄQCV,_Р€AƒјтѓЕ„_Л–э§Б”РР@–.[Ц‡‹бЈ~=РеlŒKkkkОљпЗ;v”fг­s'~љхбMЯЮ6 hѕ$kL•mlrЮ™6#Jгƒ.Ы~GџЦk‰IжБљR•nњгФЫ–у1Љќ~3•›Щ:v]Kс…LmМ:ЛЉi†бг C4•Jnж8X+P)ЁzI~NЅВ›Šbж ОНФнд4~ќ'Щ(ПZ=‰:Ў'hйћoŠЁ™iэcЯЦ‹Щќy[Э­d‰І/ŽZ”ГcгЅdўзrюކ“1j^(eCŠVOq[%ЎЖVФ=HуЮƒ4yp„Ї†BЁ@ЉT>\jўАR*eJЎ B Os йќQЄ§ˆ:88že*ЈRЉdЬиqŒ;ЮD~є˜БŒ3ж$МB@Пќx жжжœ:y’ЗЇLІ|y“2oлnЖLсfІйЮ_Аљ ~зЈQУЈюЭеqЧNши)cZsvї'ЛћъщщiєЛUы6ДjнЦ$н{гЇ›НЗйеЙ№|ЏжcЇRPЬZabŒКSrёЎЦЂ|юЇъqДNя—ВЗЂa;іtГMяH—юisЭ#юAWяkЈ[к–DMQ‰:ю%]›ІGeс€Kмƒ4~Оё€'ючЙŒПмx@ЃВЖ$iєќ‘юJщюƒ4bStєнkб5*Ь–I‡G1Ћ\Ъ­у‡’иcfкюЦKЩlПšТшšNLЌэЬ„CwхŠfЃA,з™…yзмхŸ}Ц сЃHа=*kюk2єYўžWі§ќs‘.џєя3}Цћв(…ч>џ+‘Q5АVТ™лj<ŠYёfu'NпJхЬУŠЂ“t4(cЫDж n&e?"јkФ–7wуXДчюhpДQї ћЉЙOi=pу§Ћ8ЂMг3lgяhаыaP#{ЎЅ TЄћ5ШУЈфўыш_й‘№x-7t8й(Иz_KŠF_qПпLхчшSбˆD-Q‰:<Ќ8wGƒ‡ƒ*мyЦѕ-.тwTKTЁhkЧќлa9ЅеgБѕžTрЁбd­>ыйsџПPHwЭсyжКІ›ь O!EЋЇo%оЈцhфGє_ŸOтн‹гЦЧžC‘Љ,=ŸэiТуЕЬ;~Ÿaеœ(]ЬŠИ:цПo‘!ї 3ЗдX+1ьŠЋMгѓіс{LxС™оХHвшљюB—“-Оєнс)Ии*yяХтГV™Ъќуї О’Ь˜šN„FІВѓZ Хm•МџВ ХT Ђ’tŒљ%ŽŠЎжŒ­хD1•’ˆD-ЫюТ+OЎЉšoЋyI›пє‚ џKдФГx@Д wЭ} U§ŸŸšХН{їЈ\ЅŠ<а‚P„љ5тa*Ќ9.ое0pЏёди–›c пoЇшŒ~џ•ЪoQІЛЫЎЫнˆ{џш=“Аы ZЦ§g~,:•cбчй§ћЏ?09—^п]HтЛ ЦЛ_ŒxРСLз§эпI|ћwЮ2‚P”њY‚ ТуhЭТЋIŸ[CtџО},§d лwэЮQюЫ/О 55•йsч>‘rЄЄЄvЦЁдЋ^BжJ*X)X+Aѕ№гJ‘Оc­J™щS‘oW˜ЦЋ”ѓUfфkЅxјљPЮZЉР*“œ*‡ѓхїPN,EЇOMзІЅъє NгЃKЭУO­>#^“К‡П5™вiГШ=њ­бЅђгgЄгeЪO§№З!}–r=њ­yј;M_€#Ђ2**‚=Z4ЪYЄ бvmZѓїљѓ&сЏОіУоNЏоНŸiљnнКEНыr%ќ_i‚PР V­гЃЮ0OAAўу$“/EЧ-j/П§ю{д —/]dШ Aз%8;;гџѕЯД|:N\$BZ шйпЃДд… bЮ§љЁЂсˆ]Ax<”й+џмЂъ-Hѓd)сюŽЇЇ'%JИщў&===qvvцРў§Дnб€АА0кЖjIЕ*•ЉXСŸб#G’œlКIШжр`жЋG\\ЉЉЉ4nPŸ@?7ЈOШž=h4њїыGэš5ЈXСŸ~ЬVі>о^јx{Бiу†eG‹ЪМPЋ&.ZdŸ?w.ѕ^ЌK€Ÿ/S&MЪW‚№\йЂ€Z­&6іv>Ы чЬщгђЂIrhЇљmЋвъNёAЬjK ц…_~эМЧЗї”y)VvХ|6fЈхмОu‹””~:№3лvютт?јzн:#™?ЮœaіЌ™|ўеWИЙЙakkЫЪеk8vќЏШдЩ“ащtЈеjBфЋЏПсрс#Дlе:[йG\ОЮхkсєшй+Gйё&rјЗЃ,_Б’5ЋWqюЏП8њлoМ1ь-Ž?Юј‰ѓ•‡ в[ГV-._Оlѕ№№РнНфcх!E_ыšГ шџўўўЬ˜9Ы(|дˆИКК2gоМ<ŸІGžTЬЄ го}wwwЦM˜ ЯƒPЄкjžгЪhЈ BЮVЈ>ŸЦWAЙfyL5]h6+ЪЏ™ммJп№ћєЉS( ||} aбббМ=e2ЇOТжжН^FЃ6›_vВVV*‹eЕZ-3gЬ`ЯžнЈSSбщty>_^ђ„ЂJVOžэкw`щЇŸЂjЕš_~љ™ЯПј2_чшзПЁН~F#PdњHлПSTсљх?щL@ЁP­;щмЅ+ЏОіƒМN||К“ћ/ЦннЇЯpфи1Ќ­­ГЭ/;Y›‡ŸZ­6WйmССœ8ў;?элЯgџЂFЭšy>_^ђ„чЅ{лКMnХФf;rј0vvvМјвKь Ёyг&дЈФ;SЇ VgМœйНkU+WІzP>[š1MЗSћіьоЕ €ффdІLšDхРjVЋЪO{CLJuџў}ЦMЕ*•iеМ9П;f"sіlm[З"Јr%ЊT dТИБмПŸўB,/kв>Yђ1>о^4ЈїВсz›5iL_ZЗh.ыъ„чЧ•gY!ъS‘щр‰Ое{5-^э2yЪT*ђюлSащД†bn’d'ытъŠ““лЗmуњѕымИq=[YэУpЕFƒVЋEЁPфљ|yЩCž—О­››ѕ4 dO†ЯрН!{шиБџ†‡3~ьІMŸСЎЮœ>ЭњяП3ШеЉ[‡ŸіяgѕкЯYЙ|9œ9crЪ™3fpуЦuЖэмХ–­лЈ§Т &2ГоŸAbb"ћљ•з`ЬЈ‘&#—Зbn‘’œЬOћіГ9x+‘‘‘L< OkвЦŒЧхkсzИSјЬ32t(œ=ЫВ•ЋЄэ Я*‚ ф…"у(Ь(sџ/№]ЪЬїgPяХК 9’ao —чDxіэД`ќЗH] ‚ фЩРД$Ќp ’&BQ6BŠ+F‡ŽиВe3ЗoнІGЏ^”,YŠЮ]КАфгЅЙf­P(LtЕЛЛ;VVVDмИAх*UЬІ+QЂVVVьћљЪ—/oёЅмМy­VKЩ’Ѕ˜;{ЖaнЗBЁ Z•ЪйІГЖыЧаЇ IDATЖFЃ5žіыычЧзџћ–?ЮœЁПWЉQЃ&/зЋ'Я‹№\vЉA„чС Э257ыKШмr‹A(`ЋЯFЅОкЏ;Жm#єаAzіz€Ž;Вg;wl'::š .wчŽХчSЉTtш艙яЯряѓчЙqу:зЏ_ЇXБb(•JЮћ •JEЛі˜ѕў .^МHtT=k6ПииXŽ=Jxx8sgЯЂQЃЦИИИфiMzЙђх8JDФ Уšж'ŽOiŠw!!!^сЗU}ЖmевДz™ +‚НЎ,Р‰'YэЗ<йƒeˆ ‚  kд 5kеТЫл›F›рсс@`` K—-уУE‹hTПƒръеЋy:нМ>Ргг“ю]ЛаЖuk~>p•JХЁo0љЁ/Яљ рььLзNiйЂ9ЋW­2›WZZ3gLЇu‹цмН{——,Шгšє^ЏєЦооž–Эš1yтDдj5ѓчЮЅvъДiй‚ вЌy yN„gпNХ‹ ТГбНEdыžџЬдмшЈ(юнЛg2Н.)1‘sчЮётK/=сЗz~;r„К/ОˆQмпчЯутъŠЇЇчS­“иил$Ф'рыч' Wx.иВз$ЌUы6ДjнЦ$<ѓњp€…‹Оg^—эффФ'K?3›ўQЮЮЮfeВRЊT)Bіэ7 Яiнwж5щЎЎЎќАaЃQXviAAј/ЂШbNў3#Ђ_~ёыПџо$ќиБcL{ї'~ўффdњѕэCтУ233eв$Юdй­`СќљЬž5ѓ‰•iХВe|џнwвV…"ƒ^Џ™‚№œЗеGiЅН ‚ фYƒІŠLG!U™-|Ў…е[he[vбКѕШї4ЌWˆˆикктщщI‡N;n<666МўZ?6jФ›Уо*’RƒF IгЅI›„ч€ЌЛw ‚ ‚ <–Сљиk BІР бЇЫ§ћIJJЄs—ЎљЮуж­О[џ•ЋTсп№pо{ї™5gN‘Ф5j,эLђЌA(кmUˆ ‚ фW{BQ™˜knjЎЅ>KѕШчBZšŽ‰уЧГ`ўќ\wŠЬ 'ggмммЈUЛ6§њНЦбпŽф(П58˜†ѕъg~љв%jзЈЮЉ“'‰ŽŽЦЧлЫwўм9jUOї?FлV-ЉVЅ2+ј3zфH’““є]/7ЈO Пд'dЯ“ѓЇЄЄаЎMkжЎYmїі”Щ <Н^ЯМ9s˜1mš‰ЬќЙsЉїb]ќ|™2iС[ЖаЛWOCќ—ŸЮ№aoф—™Q#Fруэe8Z4k*­Y(| Ж€wфжjЕyкEW„'пVvd”ЊAШоъ,ЈMсђcчР;Ce~ьP}фsЂUы6ќАa#7nр­7о ЩЬњЩМpуЦuЖчИљЮgЮ0{жL>џъ+ммм сwяох!ƒywк4^ЈS'ЧѓмОu‹””~:№3лvютт?јzн:lmmYЙz ЧŽŸрѕ™:y’Б‘­з3aмXЊёЦ›УŒђ§ъЫ/9sњ4Ÿ.§,нЇa6§э7оіGgќФ‰ђ,/]ЖŒЫзТ ;wžrхЪ1є7Ѕ Я=‹,р“‡;зfeџО}tюао№;%%Хт|ГЪ>щѕо‚№\[Д‚ BЖіZž Ь<ˆщyтvшГпЌш…:uXОb%ћі§ФЊ•+ с;‚7›=ЬёJюT№ѕЁYуЦw)Ю š•‹ˆИС›C‡№бЧKЈTЉ’!\­Vѓц!Дmпор07­I­TЉНzї6кl(ЈjUмJ”`р С$$$kˆћ`ў|юмЙУ‚…‹Œђ;АЋV,чЫu_урш˜ыљ=<|НюЋ\њИйЋЯ€Р@zѕю РЮ;4рu‹JhNЖAЃ†4iвTnŸ№ь&hKAАEІЃ№ђЬнЗ?ў;#оFлvэ>rЄ!u …BЏЏQјэлЗ‰ŒŒdШodмО‡#’zН>ЧбI7ЗФЧп ::šЗЇLцєЉSиккЁзыбhдй}?эЅ[їюX[[g1Dїуыч‡[‰yдŠl;д9Хeхph({CBиwрgiПBськ>ХОiљђхщџњ4ХэШœЌЌїў‹mUІц ‚ PšЯ,/БљЈнГ{7§њєсе~ЏБbеjŠ+–Џ‹№№,ƒ‡‡GŽF(@ч.]yѕЕз<рuтуу сeЫ–eэ_2qТxУЈŠ““€бhІ%†рG‹уююЮ‰гg8rь˜‰СљЭwпГ{з.“‘šїgЭЦооžIЦчљњœœВ-gNq™QЋеLя]ІП?“юювŽ…BЌ`ѓЎ№ОXЛ–ъAUЊ\‰Зо4^zш ѕ^ЌKPЅŠЬœ1­V ЄПjнЂЙAюїcЧ kЈ#"npъфIъжЎEХ ўtщд‘K—.f+›yНЗ^ЏgхђхдЊ^jU*ѓсЂE†щћ9­?„џB[5щWШд\A„'ЋgѓlпдФмg<5зооžO?[ЦЄ)SP*ŸNQ&O™J…€@о}{ЊQxгfݘ0a"Ѓ†ПERRTЊ\™хŸ-%2"‚шшh‹ђзщв;БЉЉЉf7`ђђђbЭч_А№ƒ8юœ!мжж–UkжrцЬО§п7yКІ5kpуњu6oкDLL wтюXчррШ•+—IMMх›ЏзсффDћHMME­VKћžлІ][ію?РЎ=!\Кt‰жЏ7ФЙКЙёхКЏљaуFBCCYЛzЕй<^|щ%._ чђЕpМММЉР†M› §э(оохXєС‚le3Г58˜oО^Чк/Оd§иЕkЇayNыЯс?й?AKѕfuњL бІЭšбОC‡Ї~о rшрAіялg>xшPJ•.Э’>рУ>цјёу4kв˜Щ'PГV­\ѓ3n>>tьи‰Ы—/тЊV­Fх*UЈV­:#GfлЖ­fѓW(ЈT*УЬ‹тХ‹уычGЉRЅшїкkFyf•ЭЬІxуЭaдЉ[—ЊеЊ1fь86nјбŸгњsA(JэєёьаŒ?AсљDeЂ§!oўM рФŽрЭyZš™‹WЎfїЭЗпОП7}Кс{ wwТЮ7ќ~фd^ЁPАiKpFЕZ5v‡ь5Щ7ЋcњnнЛг­{w|}} оЖнlyТoDОOž2•ЩSвGewьоmoдЈ1чўО`RfЃњЪ$џˆ={вЃgOГђйХUр—ƒ‡ds"ЁШГtй2+flB6qќИ ]№ѕ:>_Г†ииXlllhбЊ•й<МЫy[ќшибЃЬ›3‡ЋWЏ`gooђТ);Ђ"#ё.—1JъээMTdЄYйЬыЯAAЬкc9йrz гfГd(ѕ1э@eц&‚№$unЛ—xx–СЧЧЧp<2 ##"˜3kЋжЌхм…8hpЖљ‡_ЛF™2eLТ­­­ kG1iТњОњ*gЯџЭВх+r”ЭŒg™2мИ~У№ћњѕы”)[жЌl^6„BпAЪkZ™ž+‚P@жiсTІЊьtПЅ—(џ#AxК*6oZGћp­Ж.MGjjЊIќН{їˆ‰‰!ќк5–|ќБ‰_€rхЫsсТЮŸ;‡RЉЄLйВшtZєz=<02ЭЩfІgЏWXМp5jжФжж–Я–~JџўЏЫžЛvšпiЕњ,‚ ‚e&gAЅ}JЂЯvзмBySѕzо:”Q#Fp§њuУzQKˆНMлж­XЙbЛvю$єаAi%…ˆcGвДQCBCБ№ƒљмЛwO*Ѕ€‰НMћЖmXНjЛwэтpш!‹гž8~œЮкsьиQ–ЖдhgыЧбzхЫ—gЬИq шпŸ Jљц›ЏёіNŸ[! 'Ož Q§zŒ7–о}њ№њ€&yTЏ^.]К№JЯž |Н?зЎ]cЮМљЌ]ГšъAUіЦPВ•ЭLЗюнщџњ†DпоЏаЁCG $ =ЄьК!‚ Т0 jзмќ—C%7ᘘ˜ЊTЉB• * x­Ÿ,§ЬтДЇNžbЪдЗ9}ъЋWЎрлѕ?H…>х—П9Bн_ФЦЦЦ$ўрЏП№эњѕМ?}:...ИИИ<ё2]Нr…тХ‹—8jЕšјјћИЛ—ЬwŸ?‹Ћ+žžž&qЇOfђ”Љœ>uŠЕЋWБюпZœя‘УЁЌZЛ–цЭЧЩЩggg“L}6ŽDЭ­џ.Sћ=f,ЃЧŒ5‘щнЇ/Нћє5[žЌkСч/XШќ dZfГж4Ћl5 п #FbФЈQЙž3ѓњsAKTAАEб(ІђП|RRRLТ<<<7a­лДх—CЁдЈYгтќкДmKѓ-˜4e лwэЦййљЙЋЃиилМ\ЗŽСЙ:|šd.Orr2§њі!1“ШЬL}ч]МММљтЋu|Дф“-Ч‚љѓ™=kІIјШУљу?LdВЪ?x№р‰еQцs-^ИЅŸ|jVЎ{з.„ьй“k~S'OЮv'зжmкаЌys&LšD№іyjу&LЄL™В|њйgМ?kvŽ]TAФ ArзНEЫ}Kš>o#АOЮЧižЧЧлЫь0sмКu‹Њ•+™‹Їr`+—/Яs9BФЧлыЙpЙ`ЎŽŠwЁoП~ИЙЙхX‡O‹ЬхБ„E PЃjP~ 5ЄI“ІЫdў>энwYЕbХЋ#KЪаЃGOƒkŸЧсpш!*јњ№Ч™3yNЛєгOhвЈaіэ8‡ЭŠA(dНЁ‚шMI{AА\GъѕйXhПYjу€žўЯŽˆъt:t71ЩЪЦФЮЮŽяО§–ДД4CјпчЯsэjЦРp`џ~ЃДпЌћWWWўїЭзFс?8`4zЮЙПў*rudmmЭиqуБЕЕЭБŸ™Ы“jЕšжЏGЉTВ=‹ЏШнЛvПP=”§E34jд˜&M›Z,“љЛFЃyЂudIйњѕяЏЏяcŸя_ƒ‹‹ пўяЃ№_љХЈ ќћяПќ}ўМб§ оВЅBЩоН!Fi?vЌ{И‚ <Н^вуіАЄН ‚ фEІЃ№ђмЂ#‡ПEхР^ЈU“-ЪVЮЧл o/6mм`ћўћя˜6} ё„Ъиl%,ьO^эг›ІђRшвБлЖf47oоф—_~fстХькЙгШйБ}];uфЅ:/аЄaњОв‹?џќгЄ<зЎ]ЃgїnњћбЉ}{CG]­VгЃ[WjзЈN_Кtь@xxИIњГgУhлКA•+QЅb Цхў§ ?„Пќќ3дЇb†{“ЛwящО _щбƒŠќЉ[Лџќѓй:JJJТЧл‹ИИ8ГёС[ЖаЛW†Яв/?џœсУоЬѕY ЃmЋ–TЋR™ъAU˜1mcGЂjхЪдЎYƒлЗ˜-ЄOnзІ5kзЌ6„э йƒ‹‹ oСїпeј˜MJJту?ЄKЧд­]‹Žэл1zФn\ПnRЎН!!4oк„Uƒxgъдj5ѓцЬaЦДi9>“™eВЪВфc|МНhPяeЎ^ЙB€ŸЏСhKNNІ‚ЏбQQFљНїю;МTч§§в7ЩZОœVЭ›шяЧыЏѕ#11СьЙvякEеЪщѕњйвŒiКкЗ7ф?Ќ_O“† ЈPСD.3яLТCvНyѓ&Пўњ ,\Шю]ЛŒкРЮлyЅGwеЏGыЭиџ5Юž=›щeЭ~œ‹gррAoоbt/7nиР‡‹ІwK qП4!!„„„<ЇЛzх wbcЭЦiЕкlу ’ффdўЪt?сБЬP}ўлjN/ёA„ч‡чж?a"‡;Ъђ+YГzUЖЃ—Џ…sљZ8=zірєЉSФмŒЁcчЮДяаXoэмЅ+:ŽoОћž_CуршHя>} ё[6mЂ^НњДnг–2eЫВ58Ѓ3нЇяЋийлѓkшaОћсДZ-]Кv5щp4ZЕjГџ—_iнЖ _яOJJ †S'OђѕЗпђѓСCјјњђўtSУчVЬ-R’“љiп~6o%22’Љ“'щў GМ5Œ “&Гwџввв˜:y2+WЌРЛ|9~?yŠ ›6SЎ\Йlы(З:ЬŽœЮ‘•лЗnёрС~>xˆџ}Пžm[ƒqqqeWHуЦgкЛяfяЋQЏgТИБT 2rХБсЧ єшб“Ю]КічŸ\Мx:vюDЭZЕ9qњ cЦŽ%  ЊUMŒ…ёcЧ0mњ v…„pцєiжџ]<ЏcЦŽуђЕp>‚ŸП?хЫћpьшQУ3YоЧЯ,ў-Уўј“QcЦpјш1ъж}‘5ЋW1сію?Р­˜#c;3uъжсЇ§ћYНіsV._nv э•Ы—ЉQГ‡ŽќЦђUЋЬЪ}ѕх—œ9}šO>]ŠB‘ўЦ-xѓf^~Й­ZЗЁLйВF#ЯЏєюƒН=?ј™ЏОљ­VK‡Ž ёС[‚щмЉ3mлЕчяѓчИњpіНН=ѕъзУЧЧїaЏД№іL_энлшх•Х/Ю2­%ЮЪЇK–АhсТ'^іУЁ‡xgъTРt-И фУœDFDA„<Ђњ‡jпВ?r‘Э ;‚7[tXJ…€JИЛѓrНzдЌU‹Ы—/›•SЉTЈT*CGzѓцM4oб[[[:tьФОŸ~2Œ(FEFтууKЙrхАЗЗЇq“&\Й’‘яцЭ›hзЁ:tdг†ŒQжЫ—.бЄISьээёђђЦПB"##ЪrцЬiюЦХ1ѕw(WЎЃЧŒХЮЮЮШ LйВ^”+WŽ7о–э:T[[[ЪzyQЙJ}ј!{і”˜ШЖ­С4l䘡нКсууУЬйsјioёёё888pуњuдj5О~~иллg[GЙеavфtsиииPВdIjдЈСЫѕъсYЦ“ђхЫгяЕў$%%™дп#>˜?Ÿ;wюА`aЦHxLL G‡вОC<==Љ§Т YюЯeкДm @ЫV­M\nьмЙƒІЭšбМE МММщлЏ_ОŒГ QЉDЅRaee@›vmљщсєдЧгЈQ#ГщJ”pЇTЉRє{э5RRRЈ[їE|}}iзЁƒбДзЬ”*Uš2eЫRЏ~}4hШщlž#J•*EЃFЉп ‘мЯіГzх ОјjŽŽ™кРfкЖo@ћіиВi“‘qлЈQcьээ)[ж ?ƒЁsыж-ާ–­ZQКtiЊUЏn4]:2"’ъ™vžЭJ ПaaaFa§њісыu_§юќ3ЪыкkAAžrџ §5чХОг ЗgЅq‡чйUfЇn=,:rCЁP еj™іюЛМPЋ&еЊTцЏГgбhдЙІеjЕьоЙ“жmк№rНz8:::ФeНМИrѕ џќѓїяпчРО§№зйГ\Лz•V­[аЎ}{ТТТ M@Х@іяпЧ§ћїЙxё"—.]2ј2|DTdžeЪ Rexеё.WŽШШ(3H ‹ж0–/_•JETtQ‘‘x—Ы8ЇЇЇgz\d$ЃЧŒ! 0fM3uђd’’’ђu EЖчЧ9Gёт.$%ІЫ[YYсшшHr6щї§Д—   Ќ­­3^tlп†ŸŸ?О~~щїЇ]{vlпf(k`Х@ЖmнŠVЋeлж­јљћ™фХо§§єїcюьймЙsч‰Д‡Ž;ВgZ­–_љ™F›фR?Хy№рaЭnёт.$%%чzW77туяч*чцVТHюРў§”)[З% a=KјЕЋ—&mлЕ#,,Ь0…МB`?џ|€ћїяsщв%._ОLйВeйГ_ЪћјаМy іяћЩpММН9yђdЁŸšћМ—Ез‚`ўŠLЭAxњЦ)f‹вЎЙE”{wяbccУџй;яИ(Žџ?зш  €tЄ)64ŠНwŠ-ЛXЂЦhь11bя&ПФ[ŠБDcWьНEMb4_{EЉА€‚pэїpоС ЂЂЮУk_мNлййнйyяЬgЦЬЬŒ­›7ѓї_Вwп~ў=Сш,f™"Exч‘У‡y№р_§‚JЪќA%’““uCl7Ќ_‡Е5C>D‹fM‘ЪЄ,џхgЖnй‚VЋЅiЃ†TЊPžю]3ж&мКy3+–/G!—гЂYS>4kkжЎYc'Wтут ђ…››Ћ1Х—ЏrЙ}ћ6*• GG'\\]‰ŽŠ6V*• W77Ќml˜6}свХ‹,[ВФhхU†ЖЖЖ$˜Аg3vŒИЙ оЋcчŽНa[7oсж­›TЊPžJЪѓп~K||<ž:Х“ЧйИ~=QQЗЈQ5˜5П­цъџхАсuttЂMHWЏпръѕ\ЛЩц­л ЄбЏTNXXІ ~~ўЌ^Е’[ЗnQЗ^НМ (ГЇеэцЇ'M"‘фЋvЪ.lт$,--=r„Юmлж aпМIcЊTЊHЯюн2м3эЈW­\‰B.'Єu+F|>kk6Ќ_РŽ№эDGGQПNmд­Ыв%KИ{ї.џћї_RSR8zфp†ф Э}ђј1#‡ЃДП5ЊUe{xИЮя‹бЃљюлouћ§ћіен;?-[FхJ)хчЫ—_Œб…1e+ 0uЪd|}ЈYН‡ЬWєQЋеЬš1rT­ќ{vя6юЇeЫЈPЖ eK3№“ў<Щ\ЖhняkЉWЛЅќ|Љ\Љ" цЯг} ШЫ†\—зlЖзІlюГь”§}Jц8п””ЦŒE`€?Ы—гѕ№›*Л?ŽЇAНКј•єІiЃ†oЄ'X№*šC/Wм@џъ3ŸГцф/єю($яˆЕkжрццŠЃ“3 , Иjе aЄЮFщJ%*•ЪшбЂііиккВmыVЊ#‘РЖ­[hбВ%a'щТ=s†Я>Ф;wЈYГ 6Т5Г'ЫnSЋеВ=|_}§5­ZЗ1h(†‡ocиˆєшй‹*WжѕвХЧХхшќрƒЪЕЗgжŒєше‹m[З№єщSъд­g0{o^$$$pъфIJИИ0wі,ъдЉKбЂE iлŽE Вeѓf*VЊФŒiSiвДvvv\Мp'gg,,,pїp')9Щh98ЫЕ ƒ*ХЦ Ј]Ї‰їŸѕ;FRRЪ–сфŸхА|QмннYњуOtщм‰ррЊXZYqўќ96lкŒ›ЛЛ.мрAйЖm+еkд`ъєщНŽџœ>ŸŸŸAК­кД!Єе‡4jМЪU‚yєшNŽŽН‚йББЖсЪхЫ4hиаdO/OvlпN—Ў]IИ—@ХJ•шгЏУ†Ё}‡НЛ…sss-YJ‹fMYНj%]ЛugЧіpО7Ž–Жв‰ˆŸќ‘;Ж3фѓЯщж­;A+ЂP(аjЕКgрж­[\Мx‘ЋVс\ЂЅRЩи/ЦpррњѕыOп~§pr.‘QнМ@3yв$тууйЙ{з6t(%K–ЬaЌObB3ІOckјv<<=uЂ,ЫVxС‹(@ПаPжќЖš^НCшбГmлЕcЯюн :„?Oџƒ……EОѓАцЗеlлЖЋVamcУф‰ŒцЏY‹цДlеŠДД4њ†іfэš5єэпŸkWЏTБkЧ#"тЃGŒРЦЦ–оЁЁ6фIIILœЦЃGБxщВ\Ыoјˆ‘Lž2•kзЎбГ{7ZДlIйrх8їяџ4ј3š5oЮЮэл ЮwbXббQlнОЙL†]Л\ЫnbX}ћѕЃmЛvФХХч9д_№шPa"*/TЯj_"nŽzјUеѕМх=Ђ ї5b­[ЖрбУ‡ЬШД iлџ€7ЈOЙРвDFFRЌXqƒИ2™ŒЏУҘ6u ­Z4gпоНьпЗ={сттЂлZДl‰ЇЇ';ТУёёѕе‰PШшЩЊ^ЃЇOџЭЃGшкЕ›Aмо}B‰МqƒK/R­zu1стъŠŸППсWЙœŸ—џЪйГghTП{vэfљŠ•yкRfGЃб01l __š6kNы6!lмА>зѓS˜™!•JЙ~=[[[М3‡ чe+ьхх•qюН{ЃбhˆМqуЙђАmыVњ2€*WІTЉRTЊє‰.ИИИрээMЋV­‰ˆИіь#QбЂИИИPЇN]†ЩЦѕы >"Г!ЯмlюœœpqqЁOП~9Ю7lТD№ёѕЅxqЧ\ЫЮЪкŠзЏ#“Щ  ŒЗО}TЖKЁCрFўbвVћrњеёйЁ|6dhw ќА(Яј?юBчЛшіћєэ—#ŒD"с№БуЙІ\•Kџ]5кPМq+ъЙЮЉdЩ’lиД9‡ЛЕЕ57Ѓcž Yƒ}}œœœиНoПQП в с‰ю_‡…ёuXXžeз˜‡ŽщаБcОŽБ{з.ЊVЋІ›Є'‹FгЈqcнўЌ9s ќЯž;o4?њПGљ‚бc2fђљч9ђгОCкwш№\зЇIгf4iк,‡ћИёу†oеК5­ZЗЮFџЗНН=kз= ЉЉЉЄЄЄАeѓfМK–ЄZѕъFгпЙгф§аЋwЈЎ‡ЮдqГ—Ћ~zІТiЕZЖщM"TЇN]Ю_ܘщТх+К0YИЙЙsѕњ\‡Yє)Ÿ ˜#Lѓ-hаАЁсаб\Њ”y PЊДnф№a™ЌP*•xшЭвьсщСљЬЩL cЖГГcщ?1}ъўя›o˜0i2ѕ40АЮ:пrхЫ­;ьээIJJЪ3њмНsЧјpќlЌјu9?.]JBBfff4ЪДЭЭŽЏ/БqЦ'івЗ!7…JЅbbXЛvэ$=- ЕZmдц^џ|янЛ‡JЅТ=›|neїнїѓ˜8!ŒUƒ4x0ohЂKT LеeёЊУ˜F*.ЄрMтююЮ№‘#EAшq`џ>*–/ЧњuП3oСBQ й›Є&ъЛ.Ўx{{ы6 Š/ŽBЁ0X6ъV”nЂ$[[;ю%м3šf§ иГџ§ dр'§IMM}.[с,[цМђ Ћ››б5‚ѕ‰‰aЪЄI,^КŒ‹WўЃwhŸ\ТЦтффdдOп†мљБЙ7vО2™Œ˜шhџмЪЎЄПЎ\Хђ+Y0ožЎG[№–З‘^Ж}%tЈ@ М~њšцUџ›кђ^№ziдИ1{|kђ[Ў|y‚ƒЋŠ ЇGЋжmИz§›ЗnЫu­еїЕf}ос~2™Œvэ;0uЪdn\ПЮОН{иОі2zэЋГgїnўўћ/юмЙУ“'УTSSS9{ц )))’––†RЉЄU›6ьоЕ‹эслˆчЪ•+мЯcіфМђeKЌбhшјQ'–,ZЬБЃGИ{ї.їячL[•9љZЃ&---‡џХ‹Иrх /\`сќљДжГ]ЯВ!Пyѓ&S'Oвй[[лpћv|ŽsЩЭ}vфr9ЖjЭФ a\Оt‰шш(ЂЂЂr-ЛПџў‹ЄЄ$œK” H‘Ђ$''‰л§­R bY@ ф[gцsВЂ‚аx1]\\J@№жеМЯЩ„‰џѕ8Z6o†НƒГч~ЃкЄiSў#Y I$цжMдjUЎ‘”*7Ўп }чЮ\ќїЌЩpББб|июЃ- B (Viс]”ЙА0nќxЃНЁ№ій огgеРЎIЅ@ МГBtсќљйп<п”EbЊЂм0ЖЬ@ xСіЉЈY‚ЗцYЯК@ М™VQоjьeє]СiОlCsпNкЖn…ПOIBZ}hАьСЁƒЉ[Ћ&Ѕќ|4р`џЁУ4mоŒо={ššЪžнЛЙxсцРс#д­W_—Пеkжy“9sП Y‹цьй€Лvsэк5жЎY# +б§ћібцУ–К§ддTq)‚WЎDA|y‚ќзВЯt˜с2XІУН|шЫ  їющ–dШB&“ЬъыююЁћнЊUk""Ў‰ЇI ШOЅkТd,Рз‡єtУa№Џќ‡ЕЕuз? €:w`{x8ЋVЎ`эКѕт‚ЏP† *ЏИЂ}йŠј%+ыBГцЩ‹.пЂƒƒƒnнИиX<<Ÿ >фr9qББЙњyxzЄ)•Jёіі&..–Чутъj *=<=‰#ДO HЏž=`њЬY”,Yвh>WќКœ—.%!!3335i"& П5Ї‰с%+V­&АLнО••UеЫЫ‹=3жщT*•bИ @чЃZ0“‰GM о]Єядйш­ѕхтъJtTДn?>.•J…Ћ›[Ў~Цˆ‰СЩЩW]и,ЂЃЂpss џ'јуф)<<<;&cЈЏBa†RЅ4HkЪЄI,^КŒ‹WўЃwhq @Q{{u›D"Ё^эZœ:yRІ|™@ўћя?ІOJЊСјћ”dЬЈQœ;wŽцMSОL Ѕќ|2x0)))@Цњ›M5дЅѓчЉSx{ИуэсNLL4_ŒЭwп~ЋѓяпЗ/П.џ€­[ЖаА~=JљљRПNmЎ^НJЇ(XšЎw&>.N\@ Ї"Eє‹ С{#D_Ф ДpЮšвЖЧeЫцЭмМy“‰ТhвДvvvЙњeБп^bbЂYМш>|HэкЕљрƒЪЕЗgжŒDEEБ`ў<ž>}JКѕˆŽŽ"ђЦ дj5~ў~$''рщхЩон{ˆ‹хЪ•+Ј2•UkдЄЅЅ‰;P xžfiклŸr$їюо%55•НВuћЎўw…_—/7ЗjЕjDDо$"ђІСP{c\8žВeЫёЧЉS,_Й ЅRЩ'}ћPЋNmŽ;F‰%˜ушшH‰%8љзпт‚ оiф Х ЧSgšБрхDaaўœ'ЭžбьЖЦ6В–PШGИЗЌ^VcНЁрэЂJpV,џ•ыФХЦЂбh^:MO//Ў\ЙТЅ‹Йrљ2IIIT fЯюнќ§ї_мЙs‡'O›Œ\Е*Љ”ЙГgЭ­[ЗˆМqC\,С;‡™™љk'я“т,H[ќьvљљбyЁїЄтJ ‚ЗЊц}†Ž­ ­?lIгЦёєђТЮжіЅrPЁBBBBшдБ#Н{і 22’&M›Т€~§ЈWЛБ11&'1R(ЌXЙŠSЇNв n]кЕiЭЁC‡ФЅМs(ЬЬ^k<@ ЮIdM!7}љm ОйKHИ‡НН2™Lм{С{ЪеыЦ{эээљхзF§Тwю4иoдИ17жэЗkпžvэлѕ›>sгgЮ2ˆ6qa'х8ЮИё9'Nђѓї7jk.МKШdrlllаЈе ЫлH­б`eeƒL?Ќ0‚Ї&|ёŠњ­юMIIЁJЅJl)юm@ ^•J‰‡—7щщщyNцЅеjIOKУгУЅ2]Џ‰#”Ј@ <ЗО|;:Dпn!Њ}3Bљ№QчЮ’ж;whлІ5Ѕ§§ЈVЅ2{їьˆ@№ВЌ@ x+x˜€Џž^оЈ5ввв2ЖЇ97•Z›‡'nž^<МŸ( O ^R#em…1kn6МММшбГWЄUМxqЦ~љхЫ—gэš5Œ3†ІЭš‹B^X‡ %*МMФGGсъцŽщ@фrгГшЊTJž$'% M ^ИєvёNLVдЏO(ў4iиPЗ}||<оюК0—.^ЄR…ђК§?ŽЇAНКјћ”ЄzpцЬЮАї:А?M54њeaбТ…TЊPžђe™;{ЖnzљЕkжPЏv-JћћQЁlцЯћ™LFѕ5АЖБЁBХ ёto€зЏ“˜№Bqггг_xљ@СН;ЗЙqˆ+—Ln7#ЎqяЮmQX@№!ЭІЖr[llЌq!‹ќQЇЮьй€ЖэкбЇw/žWКqББxx>[аУУƒИиXЃaŠ‘””1“ЏFЃср|?xb‚WФ†ѕыјjьXFŒEƒ†xњє)чўї/Riў­”JхsѕwыбCМ@№ФЦп&!ё>V––јћ–ЬЃЕ!КD wЙј"в+/НїzЄЈtсќљяЬ%бh4мКy Wl3­O0bfggЧн;wž+mWWЂЃЂuћQQQИКЙ +‘HtзD*•ђчщ0 t SяfCЅR1cњtЦ~љ}JЉRЅ 2:щXnЖоž:…З‡;оюФФd<я;wь \` §7@ы–-йЙcуОњ’jU*уяS’šеЋqшрA]ИддTО=š2Ѕ(HЫцЭˆŒŒзR№^r/!‘„ФћЄЄІ’(fШ‚‚F"‘шЖТŒt№!Ќ^Йђ­.ьшшhbcb˜1mjЕŠZЕkcmmMщР@ЮŸGlL ёёёК№­кДaпоН:xлЗoѓяй3yЃуGXЖt џœ>Э…ѓч™?я{>њЈSžё=zФЈУ Ž/^T‡цTЂ—/_"1!}”gќмlНЊVЋFDфM""oтюž1ЂJpіюпЯ’e?цАџЮтмПџcарЯ8њЧ њіэЧАЁCxњє)S&M$"т[ТЗГ{п^nпОЭУФХМwž~}BQЉTєъJЏаа<ѓ˜œœФп§Хƒћїqqqwœ@PР<Иџ333Š)’gиМlН% rЙaЕшффŒЋ›ЎnnдЊUлРўл0œ...єщзяўя["oм  T)6Ќ_Яњ›ШЈcЬ qбяORRˆŽ‰ЃЈН=ЕыдхпПNQЇn]іюоCTl,Оr/ЌЌ,EA СK`ьƒ}a6qЩэ›™­ш033cѓжm&§Ы•/ЯЮн{rИЇЇЇSГV-Z‡„№шбC&†…QщƒhдИ17ЮG"‘№щgŸёщgŸх№7~МСўЌ9stПнн=јп…‹тЩ^EŠ%==ЄЄ$ьььr ћ<ЖоЦАwpай›B"‘`ooORRwяо%==§Йmв‚w{ ї177ЇqгІD^НŒJЉ$ђк4nоŒ[Зrяў}МЌŒ˜Лh…Ј@ фЉЧ :юkš­HОpў|ЬlŠМWз-:*Š>Н{GбЂEiбђCzѕ7Д@№ˆлЖnЁ{žЙ†ЭЭж[ЁP RЉђ™љЉp% Z­[[$ wnпжй­ я#ѕ5ЦЪкšџ]BЉT LO'6ђ:m;~Фг'‰МіŸб6Ž@ оMфƒ‡ aй/+2+ќgЙ‹пgђ7ЗА…ѕтычЧ‘уˆЋ/М˜™™ёљАсL<ЕZMнКѕxњє)gЯœЁkїюиXлpхђe4lHЧ:1gжL‚*VФммœљѓОЇGІxѕєђтЪ•+\КxЉTjr2ВчСЦЦ– 2kцL&OJlL ?M№оq;цZ­–ДLлщ,RSRˆќя’шј‚ч@ЋЇлŒ‹/НIŠДЦ‡ыjѓшЭП&| !*.Ѕ@ x{j^у^пў§БВЖцЧeK™2iЖЖЖT ЎJћŽщJизуhбВeЎЖо*T $$„N;bccЭ’*,O›1“БcFгЈ~=<<<аhдиикˆk)xЏxššњB~@ x$ЦФiсCбl\Оt‰ЂііљžX(%%…зЏSЎ|yQxСЄKзЎtщк5‡{Ћж­iеКЕnп”­7Рє™Г˜>s–n?((ШР_пў;|чNЃПƒjЕŠЙпў …‚NŸfь˜бxyy‹ & €бfъP­ž‹іЕѓE.œ?џН[˜=5—ЏЏcFть™3љNыјБЃ|љХтО^[ѕњvёЫЯ?гА^]jT цћџћ–?,ы @ x%э$S[aD:xШїъm'ДWOqЇ ‚зТјА œПt™ЫWЏБmЧNЊUЏ. E С{мЄŒЮKnћ§ T*бŠY@ (ќˆїЕ@ ˜жcЏbљэsЄџ’н­Rг)цgƒ7й œžžN‡vmљ Ј~%Н iѕ!7oоDЋеR­JeŽ;І л.Є ›6nрЯSЇ№іpЧлУ˜˜h“щ3š~}BбjЕќsњ4СTЂ”Ÿ/!­[qэкUЃqH`€?•+Udюьйт! ДMЊ}хUKJJ ЮŸ…-†6–аЁ@Ј“aНݘ,{}WpzOњіЪаŒоЭNŸцзUЋ8xф(о%K2aќзH$š4mЦБЃGxњє)ЮŸЇNнКT­VˆШ›DDоФннУhкПќќ3gЯœсћyѓ‘H$јљћГnУFŽ8‰‡‡'ГgЬ4oјˆ‘?q’…?,bщ’Х\МpA<'AAUЙЭ+Џ]„нЗ@P№мНw—{ F§юнЛЧН{ FлXZž@ фO†>CЂЗхЗ dшЫДЪ ЭЌЙс›7ц+\ыvrИЙЙЙурр@џOаѕуЮ4kбœАqујrм8Юž9ƒЏЏ/ŽŽŽзF"A.7}ъіяујБclкВk›ŒeŠ)B‘"EшжН;_5оPѕѓї XётTЌT‰ˆˆЪ–+'ž аh49мZ4kЪхK—rИwэощ&> ‚зЫЊ5ПЫЃFрфшЄsП}ч.ГПљo//†”ЃЉdь™AnђдpжмТlGYh„Ј1љМ+VŒЄЄ$jдЈЩЃЄ$.^ИРсC‡ЈSЗ^Ог9А?%}|p(VLчvъфIІM™ТзБАДФТТ"G<•JХФА0vэкIzZjЕЅ2]<A бœН#ЋVџFКRIФЕЋє е-bmm- L ($Œ1ŠЁC‡А`бFŽ­ ЩII,јajЕšс#F NЫ9ЃНVQ@ xg‘ОSg#yжџ,—Ыщж­;ПЏ]Ы§ћiеІ …•J•k2&MЦвв’Q#†ымFA—Ў]9щ2 ў`4ожЭ›љћЏ?йЛo?џžП@PХŠт RˆЊ59Оы+^Š+€‹‹ ...иййqшрAъжЊI)?_ ј„штхц—…JЅbФАЯ)XšђeYПюwq‚РЮк’щ3gqїю=-YЦ“'OXИd)‰їя3{ю\ЌЬ/i$zD џМuЫЗd>k"‚2}УgнЃW/6mмˆZ­в-LящхХ•+WИtё"W._жѕ ъcnnЮтЅЫ8{і,ЋVЎ2ЅзjЕ<}њд`ж]kknпŽч~b"*u†РMW*QЉTH$ёD)DЕš|Я^ХЇ0bдhіь?€FЃс‹бЃѓєгgЯюн\Мp‡sр№ъжЋ/.‚@№$=zˆ—› cЦŽхњŒ3–Ш›ЗјђЋqИ8'9щ‘б•Ђ@‡т4Ъk4-(!њЎсффDš5 iзNчVЁBBBBшдБ#Н{і 22вh\;;;fЭ™УŒщгЙ{ї.SІMgйв%T([†§ћсŸi Z%8?ІN™LHлvјаИA}Ъ–&22RзK# @ˆЊѓп(нКe3ЕыдЅmЛvx{{3qђіюйMRRRЎ~њX[[“˜xŸ„{їprrТййY\рIМw—к5Њг­Gz‡†R-И2їю™h( Q@ x!š—[!AžП30цЭŸ™ЕЕ57Ѓctћ...мŒŽAЋе’œœLФЕk\8ŽYй–Q™>sгgЮ2šfјЮКпuъдхтк*С IDATх+4nв„ЦMšфonnЮšпзщіќАH<СЋЂЯб(‹ХУгУ ~ЫхФХЦцъЇO§ 0h Нzі €щ3gQВdIq!‚$.:ŠнКвДi3œŠ#ъFDЯ̘5W žOu’Э]›ЯИЏ*ŒiоЩбјИ8ЊUЉЬАЁC˜9{ŽСЄCр§Ђ.ЎЎDGEд *• W7З\§Вгџ“ќqђžŒ3Z\р%‰Кqs)DE^ЯЧ3/‚ч%Й…љЫjпТјŠpusуђеkт.о1ДMОыœЖэXДp![6oІbЅJܘ6•&M›agg—ЋŸОнї“”'Ј”*œœёѓїуТ…ѓт"/ћkЕМ_†@№ V !*&EЇі%уЎх[ Z‰ц/w­лuxmзl{x8ЁНzŠ›W xнѕeцкќќЯкєуЪd2?yРЕЫxx?б Œ@ xїH~’‚L&ЫQшзљ§/яž 5ОVKЮЙкBЉDпшамћїѓфЩcк„Д}mЧT*•тЅ$rБЊT*E*•bnnNBb"V––šЪљ3ЇE я0J•ŠФGIи;гељЉ3@ y+r)]8ў;ИFЃfф№сЬœ>§…†пЄЇЇгЁ][>Њ€_IoBZ}ШЭ›7бjЕTЋR™уЧŽщТЖ iУІјѓд)М=мёіp'&&:GКSЇL&Рз‡šеЋqшрAћ“Ч9|Ѕ§§ЈQ­*лУУѓх7~м8ЊUЉŒПOIд­УОН{ђO x/ЊJ‰ФшяЌ}Й\Ž\.ЧЬЬ KK"cтx”$&1оQ4 %‡Й…%fffКzРXaЊўСырХ?ЪТВ_VаІkзžэ&M›Бvнz>щпы|7oж66љŽЏT*љчєiТwюЄH‘Ђ|3g6ЦЭЏ+WбЄi3Ž=Jэ:uxњє)ЮŸЇNнК?vŒЊеЊёлкп3 @žГSИGЯ^ДmзŽ=Лw3lшў<§Lž4‰јјxvюоCDФ5† JЩ’%)[Ў\Ў~џž=ЫРOгЌY3Ž=ЪрAƒиОР2er'МЯт4ЋDЁP`ff†ЙЙ9666HЅR=&юnЂ(Јїщ5ЇеВ`о<ММНiдЈ7nРнУƒ† ””ФЗsчђеИq˜™›Ф]Зv-6ЖЖДќ№CbccйВyƒ>Ьт~ IгІјфšЮ‰?ўржЭ›tщжMч–žžЮ‚yпгЗџ'œјуdR)M›77yS&Mт“qvvрџО§†Ц›PОBЖoл†RЅЂ]ћіl\Пž*UЋтррРЬгљђЋqиdОч}џuыжЃbЅJЙžKGсцЭ›єье •JХљѓчйДa=Ÿ~6333.X@—Ў]йЙ};ŸŽFЃс›ЙsщдЙ3?-[ЪиЏЦaeeѕZЏЗЙЙ9ЖvEАВВТмм333 …Ў^ЂS LKBmШФW<ЏЬ›:Щ‚ZGДr•*,ќawњˆХ‹1rtЦ‚ёс›7 oЬžдЭЭњ2€Ўw Y‹ц„Ч—уЦqіЬ|}}qttд5r а,МММpqqЁWяо|3g6‘7nPЊ›6n`kјv||}ёёѕЅu›6nXOщР@“~Y‚вййW77>юв…?OdгЦŒЭ%M!DяЃјЬњЏПЩd2,,,аh4hЕZЄR)fffЂGє=ЄSчЮќєу2.]М€T*ЃOŸО8+РЅK)[Ж,юqŽ;ЦэлЗљВo_Ќ­­XЕr]КtЅD‰˜››Sдо''Ї\гБГЕХввR2цЈYЋ6ўўўœћї_Є2ЉŽЎ\FБbХž…бjqrvжэл;и“˜x'''  РН{їIЅИЙЙaž)Œmmžх%ЗsЩТжЦ†з#˜:yJЅ{{z…†ФЭШHьlmЉYГ&ћіьс~b"iщi8илЬкпVcia‘ыyН Вžs ,--БАА@&“хЈєы@ xпDЇі•h^жЏkQљ ЅX€JєЏПўфгhоЂ…юХkJpцEБbХHJJ Fštˆ:uыНPУиооžЄЄ$P*•xxzъќ=<=8ю\Ў~Ц№ёѕхЪхЫЯO xФЈ~oЈT*E.—ЃP(АААа}DR*•b6ЭїŒ””~[НŠ 'стъЪoЋWГdё"ІЭ˜ РљџЃVкК^C€Пџњ‹лУїѕx]/dФЕkhдjЊ “ЩАДДдХ3–dєаЩr{ZZ'OќСД3БББСЬЬ ™Lš#^vqeeeЅ cWЄR К}­FKБbidєўIQш[ЅRтшшШэјј\ЯE?яeшлП?666Н›Z­[lmmiбВќqœДД4Z~ј!666X[л ‘Hr=ЏWL&CЁP`nnŽЙЙ9 …Й\nP7ш‹Q@ JT_˜iо %*_8>f6EоˆнЕs'C?Ь€ƒ1j”б‰žГћьФфrКuыЮяkзrт?јцЛяP(ЈTЊчjkЕZŠ/ŽBЁ :*Š2eЫu+ 77З\§Œƒ““гsЧоv‘ЉеjsќЯђгЂYb4kЖL333]Ѓ<ы=Ђяџ]Й‚НƒƒnДHЏоНщйНRЉZЭѕы|ѕѕзК5 cЂЃљuљ/„Mœ„ŸŸŸA:‘‘‘єъб]чіЭœйLœ4™’%KцH' KЫ [E;;Л Сzю>d№ †сЌЌщжНЛI!jccЃKУЫг“ЛwящіoпЙMЭš5uћvvvилл“˜ˆЛЛJЅ’{їюсчяЯЧŽ™<— ŠunииX”ƒ>VжVиййбМEK6nи€L.Їq“&( ЌЌЌH$yzd}„ЪњeffІЋєEhіобьѕ‰ў@ x”h>еYA*б—ЂY6ЂY‰НЮqФ–––|?ЮnЇ щбЋ ыеУбБ8AAAxzyqхЪ.]МˆT*ХеЭ-_/X™LFЛі˜:e2SЇMчњѕЖ‡ocн†Йњeqт?(WО<зЎ^%|л6VЌZЏxСл,:_DЄf5BГ–lЩJGП!ЊP(Фl™я~ўўмН}‡Ы—.Q:0#‡сфш„““ЛvюЄ|љђК^O€M7вЖЅK—жЙ) њіяOпў§unCІWh(UЊT1šNYцdѕ&VЋ^=ћіыќ—-]Š\&%ДoП\Х•……….ц-ZђЭм94jдˆиИ8nD\gТФIXYY1gжLZЖjEйВхhкД)›6lРЧ燹­л№ёёЁtщв”.]кфЙф–w}45VVжXYYaeeХG;cІ0ЃH‘ŒдVV–h4šзn#šѕ1*KŒЪd2нІ?ƒю‹ŠM!NрЭѓF—oЉп С+MпЩЩ‰5kRЖ\Y[…  ЁSЧŽииXГфЧŸt"5/&LœШјЏЧбВy3ь˜=їЪ•/ŸЇРйГghеЂ9 33Ої5•3 yХоAjЌдTЉTŠFЃ1!ЁпK*—ЫuіЂ‚ї___FУќyпѓ№сC||}™%Нsм5у8rмН}иšъŠ­ ЌфЌЄ`) 9˜K%˜Ы$ШЄ`.ЙT‚\ 2 ШЄ™6ЂЁƒ>#љšї#>.ŽF ъушшШЬйsоЈоЕ†сЫˆРќи‰ыЭj4ъ T2ЬЇ}щ }С™]|fЏВ‹Ц‚ъ"T fЬfКпZMЮN€Ќп‰­FkЯ”}ШBŠ*3г<ŸYj~Ь\пЎnn\Оz­ам$с;wŠ'E№оŠжМФgv?§!Кй+Tcn‚ї›Жm iлЖаЄ#(ИњCџv!š]„žІќ„Иo;YLfіLˆ>|ˆЕ-)OЈ0‰D‚ЕЕ-їtn233ДOђwŒќhТЂ9ЈЭиr=jfжВТПЮ‚зТ™ЛJ.о}JђSБ|ƒ@№к+?cЯМ7-Яъ]œЌ!ЙzћZН:GЫГ}­AA:кќдSрmVЂFЄT7;ОD"б…‘ 1Œ“%^%Ям Ј~œlЧ4%ˆрMcg!ЃœЃ9e$Кі‘™Ћg2чГпК№ZэГxЩ3­–ьЂ‰ *ъ@PH0WHq+jЮХЛЩЩt{єр>eKЅФХЦ’ž––iC/A&3ЂfццИККтэуЧИ!D_„'iЬфTz"єЯƒ;йЖ|q7#АДБЅ|ек ›‹PkДa_5иСўMЋЗ№ЗB‘VAцG ШMˆšЃй цubдшЬК9‡ёцЂЯDЊр§#љбО;ˆZЭлв фc&оcЭќ\>s K[š~д“FэКФ;{ђОe* АВцї%пrbя6Д-AЕъгуѓёШ2g\•ы7ЇыА0ф 3ЃЧЫТXZN.l_ёGЖќ†D&Ѕy—OhдБЇюœv­^Тг'ЉоЌ-=GO5™Ÿ,V}Цџў8РуG)сщCеЦ­8Еg wcЃ(UЉ&ЭУвк­Fѓ\ЧНќЯ V;‘„јhœ=J2qљ$‰ЩВLšЪšяЇ№їэHe2ŠЛz0pв<œмН‰‹МЦЊoТˆŽИŒwщ „~5 'QыR1Š‘5EŠQ#Н њCsЕ&вбІ‚ї‹„лqt9‰У›WЃA‚&shl™Њu)SЕ.і%мйђгїм‰Сйл?CІІpхьŸ|<фklœш>zЊ.Эв•kp7.Z—VЪ“$ьŠ#U˜ыоЏYЗž~:­„„;ЗЉжИ5OSSЙqщЌ.,6§єЕZvфЬбНhДф№wђєЩќ`ј-рфц‰F+AЃU3ЉW+Z‡ЁJƒ–”,W9CP>М-ŽЎ^КДž$'cc"Пzв ™B…M,lŠаЈcolXIфх ˜YZЃRЉptѓфФоmдjй€cЛ6стхЫKџC­бцњ•§5T6†Жšњћ=ЁНгЌZТАW4GяЇЩоP1,W ^5oЇЭьн‹Кz‰ф‰TmвVч–Н=\/Є+Сл№яБ}ќ8e3зCanA…ZMЈXЗ9Њє4~јjGЖ§NЃBЙyхю~eўнjвRž RkљАзP: #ўfѓЧє%ЈvS<ќЫ№лџM&сv cm@*“cicЫ•гр_!˜aпЎ@*“{ѓ?MEП путэЯЂq8МѕwъЗыnєxYh4кiлЙЛ6ёљЗП’њ8‰yЃћрT ;‡blX4‹Б‹6RмХЧ RkІЁŒШЫчiо}k7eзЪиГцGN]„}1–NјŒУ[звЄs_Nькј\Ч]ѓнvшEе&mxp7Е&Ѓ9dЊ,зЬ›FмЭы|БhfVЬдG`чшЪ‚ЏQ­i§&ЮcгтйЌ7O&ЭOя["DГТі†цCŒ"Щ1ДW№~г CЦЧУ›~гxЩЮ˜›ФТвšІ]њГyЩЊ7яˆFЋц№–5є3y_єхqR2VЖEоtѓL ъzH {BuН њНЃzНЂњћy}ЯНЁрmFЃб№пеk” №з­Л,„h.„oо˜П€юt=Ђ<@Ў0УЬкЮЈЈ-.žиsІvH7ТўŽИЈHм|KSФЩUЎRНФнКŽJЃEЃ+лЂX)†U‘bЈ4ZŠ{d|ЕіЉPяР boFр\2€?їmaєqє|6ќK­­D‚&ѓыБFЃхяƒ; ЌZ—вUыPѓУЮ\ќћ8ЕCК=^ni§Йo > ХбУ€Рр:\<}œЭ; •ЪˆЛu>ЅБЗВEЅбM#{Y)†Е}qjДъЬ‰нё.ћAu›qе зЬвŠјЈh$R=§tчeЊ,OэйЬАяVыЪR.W жhЙ~ё_žІ<ЁiЗAH$RuъЧ7C;ПVЛ_СЫ‹QуCsѓАеЄйgнМчїZ4Z-ЊlїYjr2?OIѓžŸaYĘޟьё}”Ћба МVЋeЭџMРХ;€вUыщќšїјŒ‡ w8Еw ;WўР№яУІЈƒЩttu5Иo§ёZѕŽ)ZД™CssоЛДЄT•коМ’%aƒљrY8f––t1%C,gЦщ0t<>юЯІE3X9{}&~@х†­‰МЪѕ‹gйігwє8П `У‰.џs‚бmЋЃTІQДx :†sЩЂџЛ€ЅОЋƒ.Ÿ§“ДдЌ‹Х#0 Kk=|€™нЙж9fНЭъђеŸ”уЖЃ:ЛP]ЏЈЕ)zCС;и6ћ}§F=Š—Ї'_}1ZбМhнЎCОТ-ќћЁnЖ\3;TЪt’’aiф%Љеf уЭ oeW”фф$”-ЧЗ­цШ†х$?H@Ў0Ѓl(5]ЕJХцІqюи^TЪt4jСЪімOИ‡ZЅТЮЩе`і^ufŽО[тнxЮпЯ№цхu7ˆЛЃЧ3lмфLыСнx6§0Э‹ffІЅССХЙ•-ЁОl6;–ЯЃэЇуЌZзhІЪШЬкeкSвT*ЄRцжvїqЛ~1›Э?Lc|чz4њјtъkВ,янEЅLЧСЭ[—ЯŒF$о‰чёУDFДzжЈRЋy’šŠ™^O… p QSb­6ЧOmіaЙbHЎ $hЬZ›žžЦ?У?Ј:ЕBК“5№C™žЦџќAЫ>У Т‡/KтэXњM[jрTП%ѕ:†ВьыпЙž&]šL'уž–dŠЭ ї[WЮ‘ž–†OP5]>4ZLЮВkfS„І=>уЏН[јямiн0уьїН“+­њbЮ€RRR1ЗДТЛ|0охƒЉбІ~_ЦО5K)YЁjЖђŸrаaшЌl‹`imЋаЩ“БАЖAƒ”­Лp|ћя(гžRЋMWдZ V6ŠŠтРЁC4jарmЂoЧРЌЁЅN^XкиrњРvjДъbМСЂбъ E• RkИЫжE3ђ§:\|JБѕBюп‰ЭЪЊ%уK{fœі‡sуќiF,оŠ•]Q–}йЕF‹…­RЉŒ{q1Иј”~v@Љ•Je0ќеІh1*жџЧЬЪqйg€БДь‹SЏSЊ6ы#-џЪuўAmўкЕžх“†2q§IЃi˜*ЃЌЁ^*•Љ,cйŒ,Пч=ЎН‹}І,%ъЪ9~зWџr<МgД,хжH$юпНƒ“ЇюVTkДX)†]1gЦ­:dђ>МKb4[/h~–‰М‡ї\іК6/˜†]ё4я3вР§впЧ)цъ‰]qWћйƒс\9}œsW"•™™ЌKœ<|IО•Zk4нGУЬЁЏYю—џ>Fєе |бЊЂ.ЬЯ:y1~AеLž—T&CЃ•фZЗi‘"‘ќ?{ї^EБ7pќ{Jz!„@€є„Ž‚@шНзаЅЊ Йш‹ŠTE”о{'єŠ: -д„’FzяЇяћGтаDЎ ѓyžѓВ;;;;ЛgйпЮьl~7рЇг•vЎР哇ŠL7@ijN‰вNEЮЙйY˜˜šЁгKx7ыШсuѓ+L0ёWtz 3srВГџЖѓmбїxJЦw„>н=їqYLZЄKЎЌиkй3І ‚ М ._НŠџЮ]дЎ]›‹3rФЖяи…}I{|jе|лбwƒБ[ІТ„§ўУўeГбщѕTЌэ‹V­&њюuъuшџLŒє8Н„„о ЁеъаъuЈд* ву–СќР№ё2ZIЕFƒRЃ5n’\A&эиНx:Fќц–VHHи9:Fє§;Шd2ьЪ”Їzуі,л›J'›тVЭ‡МьLlJ:`UТОШњžT\^оЭ:ёћжeи—sУОœ i pЋV­ZE|x(Žn)у^ VZЃ)6ѓ‚Лс\а§QG”AgЫ$ckЊЮ Нђz#УnQжН"VіЅБАЖ%';ы™uЉ4ЗЂRн&\ѕ џѓ-снX  IDATщ‰БЈђrа$\ЊеF&“qhЭЏМпжЩ`Р`аурф.Ю6o{ њ'ƒбbвgф%ќ{#QCAwW€ЄGсмЙt’б‹vЃбj  9 Ѕ’gS­~+cZI’8В~>=ЧўˆмФ ЕFШPš˜MfJ5оGafZЃ%,ј4e=*‘—ЩЉЋqЏN‘2 P]lйѓrsQšхъЋ4ГФЗлLLM)L ІY—“УпvпOz2Р,м=їЩ‹Œi^Њ%єй]oEkЈ яЊћВzэzмнн™6}wЎ_eЦŒŒ1‚Ukзђ…эчxzzˆ@єu=љ*’z]Ё0Гфмю5\> 3 k\ЋецНця}2Но6eœiкїSж|7‚МЌ ,lJPЏc?Дњ?КЪ>^ІZ“„]>ЫмсаыДXл•Тмж­^ЂУЇпq`Щ,зЙ\AЫcј ѓj4эРВџТЬТŠОчсTё=ќЦџФ‘•?‘‘‹uЩвјџ Wы’EжїЄ2žе‹фхгЦЌДT6Nƒ:/ћВ.|ќѓ&rвSиOвР€TьМ?ЮГEц?Мq™'їЃгЊqtЏLП‰ 0БАAЃеuћ*^ЕRжЋ:WNьcџВ˜˜šу^Ѓ.]Ч|‹ЮY™юXEbф=,lJPБvcZ|8ІШzєe(Ў|ЊМ<”fцЦyО=?*И!Yp‘`fNnnЮ3Зэ3›kѓq+ЉєTєјФ€FHЦ`Дh~Я BEkЈ яЎ}bccУмyѓˆ‹ GЇеџ(ŠпцЯcир!8r„ЯG~њV•YЖ§ЁFЪеIdщЁЋE QсбыtЯ]HЇгAяƒИzём3г%%'бЙgL оKіЬŠлЕуЅŸ]z9…ЙИkљ’žƒвФ …‰ ю\cџТЩŒ^€ТФTTЮ?<}zўKПЃT^рўх3œXї УлљVф#МN<*{ёє'ў-+юач4wЪDSЈ яƒ*ЕŠВсG(эPКаМRхœАВД"16U^žqК…Ѕ%ЅЪ9ЃЮЭ!).ц…ыЈг [жЏСУнЅђљm–JЅwOіЈœАQ€ЅR†Ѕ,d`Ў3Й 3… …Ьф ”ЫPЪA!…ќlu+aBxК…\&Каќƒ\иЗ‘c;1шu”rёЂЫИŸ0(LŠŒђ+ќГ‚бBЉxTј‹нЙpŒ Д@'НљЏur)>h|Њ[юуєUКуŠQrAx7Nƒ:ƒї’ІЈТ‹ЮЯIO%;-ЕJUhz^n.ЩБбoх5е;ˆЖіД"рAZDŒђЯбxр8Whšцoы &М‘@єe‚бчЅŠТ+j9|в_r.љЋђўМТ-–RсГ`ZБ]qiЄ—Ь[сm=‚‡ Э]M9xЅшќ'[A_ežD_Bэ+Z‰ЃQоб`єyѓЅч>#*‚P4p”НF—[„ ‚№Ўб Ъї6HJNІМЫŸЗEўoлy o$_ƒС@\\м г%''ў№с+хЫлЗпъzеh4$''Нбuшt:R’“ХшЛH|•љВ‚з2Шž!ѓщi‚№Т_sNyоЙAЁ‚ ааPввгE њ2Юž9Cяž=ўдВЩЩIдЏћО1иЬ{Њ‰ћї'ќс€цГhС6mмРБЃGщвБУ —YЕr%›7mњSхЮ{CMёOчћгЌYЬћѕЗ7Кџ~›;—йГfН“Ч^о[к%тя F_6Э“щžО ёyњ3чЇŸPЉToM>тѓњŸч^чќ"‚ Мž&ЭZрющ%бнК2шрыtѓ+QТŽ~`ooObb"яU­ђкeЎXЉНњєycuђW•ѓiћїэcшрAџѓ}ќЎvг|Sћс]F_і‚Q тѓф'-5•Ю;А~нк"ѓbcbx№рM›5cлж­Дlж”еЊ2p@bbг­[Л/w7уч› ž™L&У`0№пЏОbдШO Ѕ -”O‹ІMžYюъдЊIXXXЁщПўђ ЕjМGЃѕ9rј№3—/Ў …жџЧGЏзZvЫІMTЋ\‰ юд­S›С~Hppq~cп†ЌYЕЊШ:/\H›–-пК€єЏ8Ÿ‚ Џ/!.†єд”w zыцMТBУ8ю‘‘‘od&&&Œћfffшѕzєz§kчщццЦРAƒпXНќUх|šVЋЯюНћс] FџЪ Hспэрtыв…шЈЈbч>|ˆ&M›bffFpP?NŸСўC‡1 ܘ6ݘ.';›?ЮА{м ЛЧгЇ›ЙЙ97oм _яо 8Rd}9ййx{{ѓ 8~ЂHNЧ‚љѓјdи0ВГГ Э;t№ 7n`ѓжm|7y _ŽSь#Я*ƒЏЏ/зnм4~LЛіэ‹ ЗŸ‘‘AнКѕИr=„НћігЈIc† H\l,I‰‰,YМFShл–/[JZzš8Я‚ Х %§по5wуЦ tщж•FГeгЦBѓіюйM§КяSЃZUfЯœQьђяћјp:№ESСУнјђІаЏ/999ИЛ8“ššj\ЮнХwgќЗo+XіѕъдІr/>5Šмммч–ћјБcДi™џікЕnEjUŸЛќю]Лhд ЉЉЉФЦФаЛgO*W№ЂnmBCC‹]Ягхќ§Ф šј6Єr/FŽNZZб I’XМp!>о5ЈQ­*?Яž](˜Кxс‚1пGЂ‰яU­ŠwѕjЬŸї[Ё‹ БЃ?ЇFЕЊДnб‚‹.кPЛVM*W№bћЖ­EИY3Іѓ^еЊдЋS›#‡Пtљ–/[JэZ5ЉRБГfф_d6mфЫ…ѓчijTЋJhh(†žнЛQЛІ7U*V`Ш Ьš9ƒоЏCеJ™6uъ ЗхЩ<*xИгЕSG"""žЙ^vп§“вПђ‚RјwŠŽŽbжO?ёA§ХЮ?t№ э;t@&“ёгœ94єѕХнн={њ=fddрPк333ЬЬЬŠnфK??F[d}™™™и—*eЬЇИwfЫхrR’“йОs'EЮч§ћ ZѕъДkпяš59tрzНž&ООьйНћЙeP*•иккbkkKZZ;wю`ђї?[7&І&”(Q‚ђNN ё)VVж\ЛvЬЬLДZ-nnюь№ї7ІпВe3•*U&#=ƒС№жžW^хм"‚№OІжh нP|’FЃA§ŒyЏуЏэšћ6rЉT*іэйCЯž~tыоџэлбщt„……1~м8&~їћ~цХЫѕ?ркЕk\Й|NЧ­›7Иvѕ*дЏ_ьrїУ#ИAOП^ил—bыv:ЬН{aЌ]ГцЅЗ#)1‘ММ<ŽŸ`Яў„…о-ВќЕЋWљсћ)ЌXН{{{/Z„‹›+ƒ/ГЭЎЎЎ/,gTTџљt_~5ž#ЧŽc0˜0~|БяКЕkXОr›ЗnуР§…ЪSяƒŒљ:;Лфєuп'ри1–._Ст… Йvѕ*пOžDvv6Ч~?Щ !ƒ§й(ДZ-†гЇXНvЇЮœЅUы6…ЪАyгFіюнЫК XПi3eЫМTљvюиСЊ+XДx 'NžЂwŸОЯ­{­VЫхр`6nоТб'HOO'јRы7mfнЦlXПŽчnЫyЌнАЇqї№`ђwп>s?МьОћ7ЃO^`ŠРTxвˆOGв aУbч%$$pћж-ZДhYdощРг…–KMMхќЙsЌ[ЛЦи*јЌ|ZЗiKп~§Š=гRS‰ŽŠfљВЅ\П~Нјџdхr&џnnEGМwџ•ЋT6ў]ЅJUТТТP(дћ NNN/,УVЏ\Iзnнptt|nj4vэмIjj nnnЄІІbmmУgЃGГjХ уMР5ЋW3О ЫrFFЦ[xОъyAœCAј7ˆ‹чоУ№"ЇJ­соУттџђuцwЭ§ѓ‰О5ЏoйЗkЧKЅымНgЁП РЪЪŠкuъPЅjUўће8OЂEЫ–иЗц-ZаЙKWš6kFР‘УEђlаА!GчwyКtёUЊT!88ŸкЕЙpўsћЮ+ОђžК‹nii‡Ї'НzѕцтХ‹ЏTfff”+WŽrхЪбЋO.]МdœїшQ4У?ўˆ9ПЬЅJ•ќч ­ЌЌ Н‹FЃ1ЎїEхмГ{7Ё[їюLљa* ъе%33[[[c:џэлјdјоЏ[€бcЦВlщ†}є‘ё?іЇЗПLGЪ;9QоЩ _пF\Йr…ооьлЛ—‡ршшШРAƒљхчŸ Н{зXfьээ‹”{яž=|2|ЕыдРЧЇ6III/,Ÿџіm|2тSъ7h№JѕяXЖ,іііtэжS'ЇRЅJдђёсЮэ[TЏ^§…лтффŒНН=Ÿ AџО}žЙ^vп§SƒбWэк-.$…тއ'‹€#‡iшы‹ЕЭS7Д6q§кUіь?`LпгЯЛwяr9ј2ГfЬ`ХЊе4єѕ}n>OBЈYЋУ>њˆ{їТќс>1‚Я>§RС€:/KK+уп––ЄЅЅх–4їз.џ‡мм\vјogЯО§Яќ­ž:Eѕ*•QЉT”+_ž™ГgS§НїИ~эЖ%liвД)2™ŒsgЯ’››C){{ъжЋ‡ЕЕ5щiiХžЃџI7ПAоu 5цибЃDDEухсŽRЁ@Ћг™пsБЏ/qбэ#ŒЁЁЁИzxСŸ|Гц[ˆ>\ОŠнЛvбЊud2VVV4iв”=ЛwбЂeKт)_pGљyš4mЦДЉSбh4\8žџ~=M7вЎ}{вггЉхуƒJЅzЅr•ДЗ'3ѓЯпEЖЗ/Uhљ+—/#“Щpї№0Nћ|єhІOŸFѓІMшдЉ3“ІLСЪъљGBlL .Ў.ЦПЫ•+‡RЉ$6&ІP њt:bcb^yћ“““бjЕtjпЮ8Я`0œœќТ,1!'Їђ/ЕO–/6&чb/J^&*QЂ9й9…џЮЩ}Ѕm)UЊ™™™Я\ЧŸйw" „g;|шн{§аСƒЬѓ3[Зћcggїј?ы† iаА!C‡ cўМп˜?я7c Z\>ЯRЁbE*TЌ@‡NаЗ/ŸŽќO‘›tЯbWВ$ЙЙ9O”y”*ѕъп™г899сUЁТ3гдћрfЮў ;;ЛBчњŒŒ lmlЩd 2˜ѕыж’——ЧрЁУАЖЖ!++K ‚ oЙмЬ ZЖnMРЁCDF=Тне™ˆЈh4Z m;t ;-ѕ/_g~з\OЮўЩЗcОгЯˆІЇЇsђїпйЙУяјxзрєщ@ސ››Ky''"ŸzNЏ8ЎЎЎ8;ЛрП};VV–4oб’Ž>Lѓ-P(…в›<єGрg§Gј:йO/пЅk7њј!У28VжжL›>ƒ'Oqћж-–/]њТr–+_žшЈhупqББшtК"ћгщЂЂЂŒiLLLžЛэЦ )? S(=ё;aір!їУ#hжМљ ы М“S‘ч,_І|eЪ8§ЈШ266Ж/ѕЎS™L†єD?ѕќm‘^m[žИ*n?Мhп§›Rqб(МЎд”.ъоџо=&~ѓ5+VЏyюMЏЪ•+“œ”ќЬ|^VхЪUаjЕdМТ  žžžмНsзјwhшнB7_жЩпЇeыжЯMcaaЋЋkЁ ђŸs5/xvЕGžœ?wŽ›7oвЉsgуrяJ *Ю'‚ ќ›efЄЃSхбЈIВsrИy'”мм<7iŠ:'›ЌЬПў1 ƒVMVЦПtАЂCтррРёпOr№Hp(р(’$qќиQКtэЦй3gиДaёёёФЧЧ=3Џ;2{ц ZДj…‰‰ uыжeСМyДяаБHZЛ’%БББaяž=DEEѕвeЖВВцСƒћЈеъWооёџ@…Š•јПЏ'љЃ'%%annŽГ‹3™Y™/,gзnн9s:нЛvС”Щ“hнІm‘‹П^НYОl)—ƒƒЙyуѓч§FЏ^Нѓw77юоНЫэ[ЗИ{чЮs[ў”J%э;tфћЩ“ #.6–›7nМдіњѕъЭвХK8xŠФФDRŸњyхыжЃЫ–,цЬщгФХЦrїЮ џжukжђрў}bcb^yŽ?Л-Хэ‡эЛk@*."…?уШ‘#д­W’%KЇЭћэ7LхЪ•QЋеЈеj$IBЃбpја!"##Й~§:K/6vу/.Ÿч9~ьїю…ёрў}fLћ‘ *RЪСсЅЫнЃЇ›7mфі­[9SSг‚@дМШhПтм!‚№vJIJФЦЪяšЕЈUЛ6–fЄОDCЬпAљ.Wіў}{щнЇ/хЪюОйЙKWіюйKч.]YБj53ІOућ)“БВВЂq“&ХцеНgO~ћu.mлЕ }‡Žœ?wŽ-‹|ЁP(јvв$І§8­FУј (_ощЅЪмЕ[7іяпЧЮ;(SІЬ+oѓЬYГhоД ЧŽхТљѓlмА>џ@ѓёaв”я_XЮƒГhЩR&ї-ёёёДlеŠ™Гg­=ˆ‹ууaCбщt 2”СC‡рээMзЎ]щэч‡ЕЕKWЌ|n™ЇЯœЩЄo'в­s'dr9-ZДdўТ…/q‘ж“ДдTўяыoˆУССO†xaљњіыGJJ2Ѓ?Evv6экw`о‚Œћ_ŽCчސЫИКЙa[Ьs`ѕЖЗ"#"ŸЛяўэAщ“Dї]сE:Hлvэ MЛrх2ћіюaоoŸЕ<}юІІf,YД;wю`ggG‹–-™№ЭзЯЬчyvэмСЩ“'QШхдђёaщђхЏTю-[вР‡єще kk+цЬ§{{{t:A—‚hвДС?“$I<|№?їЌynn^Ёб|Ÿ~ЦемТ‚ььЌЗіќ ‚ …gХJxUЌ€^Ћ%ђСН7ЛТзИL“mЈ‘ruYzшjCTФCє/шvЉгщˆ ї€A\Нxю™щ’“’щфзЛи!эAсueffђОO-ЮœП№Їnю§ељ‚ Т›ЄеjйяП ‡вЯю#“ЩА)aGfF:Мт §: Бe§<мн_8цRЉФйЭƒНjgl`Љ”a) ˜+СL.УL!C!39(х2”rPШ@!У]ser9QсФ#‚ МGЈсэ§кСу_• ‚ МI‘я#—??„“$‰ЬєДWBџзоh jiiЩЃШpТя‡‰ЃFAјЫѕєѓcЧЎнoM>‚ ‚№І„п #&*ЫШ›ош3Ђцh4*ю\ПЦkЏ<8Œ ‚ ‚ ТПн­ ffц˜››§ѓб7бxkjjŽЉЉЙ8zAAA„ќрZT ‚ ‚ ‚ QAAAAЂ‚ ‚ ‚ ‚№QётxAAAсˆ ‚ ‚ ‚ ‚DAAAˆ ‚ ‚ ‚ ТŸЃ|г+ШШЬ$"2užI2dHHШ‰oё-ОХЗјпт[|‹oё-ОХЗј.цђу'™&fІxzx`kcѓ DџтБŠВВГAЁЄžocJ–ДaП ‚ ‚ ТŸš’Bb|<й9йX[YПe’^#€|Ѓ-Ђ ‰‰М_П!ююXZY‰ЃGAAсO(ыX KKЎ^8‡ЕЇѕ;П=o453Qръъ†­-zН…BёТхдj5_}љnnю|ѕпџ™ŠЇЇ'&&&[ХmXПžуGВ`ёbЌD-‚ ‚ Тdck‹›Ћ7/_|aкЌьlЌпюхVdna‰Ѕ•;wь iуF4Ќ_ŸfMГfѕъч.wіЬ<Фі­[Š BявЗW/Кuщ‚NЇ{х21kњє—^іъеЋєшої}|ј юћ 4ЌЌL&;‘sчЯї?нaпL˜@HШѕзЮGЃб0vєhbccўtII‰Œї%тЬ ‚ ‚ o˜Ѕ•ц–ЯMЯУˆHю=џїЂ;ќ§;z4iiiH’DFFгќёХ“ЫЩ‹ЏlйrXZXрщщ‰Rљъ К}{їbхЪ•ФЧП8€Мzх НztчкеkЈT*$IтдщгLžєШdШdВџщЮZМhыжЎeўМyЏзФџћ†mлЖВzхЪ?ЧGC†Аmл6<(Ю ‚ ‚ ‚№7KJN!9%€мМ<’SRоо@tсќљotЋV­ФдЬŒй?§ФХ  і8ШЁ#GШЩЮfи!,˜ŸTЅЇЇгЏoo6Ќ_o\6''‡цMšаВy3іюй€RЁ BЅJTЈXб˜nкдЉ4oж”~}zzїnЁѕ9’6­Zб­KgЮŸ;‡С`@iЂруaУhзКqББ,^И€#G -—››KЏž=АВБeмW_xц ПŸ dхЊUЬљхW$IтгУiьлŸњЩИь–Э›щиЎmZЕф“?6ЖО††охЃЁCёmPПюн9uъ цЯЇeГfДhо”БcF*У–M›hоД 6dЬшЯPЋUhu:nнИIЇэљ~ђdRSS

Дkгšў§њђшб#dr9:НžХ вЁ]vјћгK’Фк5ЋщзЇ4 MЋœ9s†Q#GвОMkєэ‹FЃ1І ЅgюДkлкxLDGGглЏ'экЖсУ§IJJ`ќWуhгВ%={tcЯюнhЕZ~˜2…†ѕыбЌi&~ѓuЁК\ВhЭ›6СЗA}}ј!ЇNž4Ю›1}:Э›5ЅOЏ^мЙ}[œСAA„wNzf&Бё ”+_žFŒ lЙrФФ%‘™ѕV–W9ъѓЯYОz]њ|#+АЖВ&5-еЋVagW’њ љ]dЯœ9MppŸ}>š KЙtёQQL6 ™LFZF&r…•JЭcЧ`_Њцffœ?ŽЫСAŒ;–бŸЦЮ;(эP†ииX:wъШўёЊPпѕyєшeJ—FЅRБiуВГs јƒСРВЅKXЗn=––lкВ•5jљЯ€цффPПAF}і™q{š7oaќwvV6)Щ)Ј5j~љхg2t(Ы–-%91 …RСѕ7ИЦЩР@zћљ‘˜”Œc™вмОs›ЋW.ГvэZt:J…‚M7‘Рц-[йЕs'_O˜€•Е&&І?vŒТ`0’œLJJ2I‰‰Œ;–M›’›—‡ЕЕ5K—,смљГ:@_??R3в)SК4ЩЗnqхђъж­g,ПNЇ#1)‰ФЄDдjнКwЃCлvш ,-ЬљyЮЯ\Йr™ѕ7бизƒdРккšШˆŽ @­R‹$IьнГ›ž~~Ц ?ў№zIТЎ„IЩЩєэн k+k,­, Йqƒ&ОО\ "єю]КvэŒ\&ЧдФ”гІsѓц-–,]Jѓ&Q*MАДВ"*2‚гЇ№їїчt` іііФХЧВrХrZЕj…џіэш :”Ъ\–/_^o`цьйЬœ> `gWЙ\ЮБЧКx‘;їю1ю‹БlнВ•2eЪK—ЮиЛџUЋVg3AAс“›KєЃXьJ–ЄQу&\ЛtЦMšpјQ11x)нАДДxЛQ€’Ѕ3+XЙj-[Дрјё„мИIХ ^lиДШo•{В{ЋL&3f$INхЪБcз..œ;Ч”)S?nѓ,@.Я_юX@‡Цгн“ЇOgй’%žф—9s(]К4їюнЃaУ†ќ:o>’$сююЮ§ћ173cс’%8::RЃ†7iЉixUЌ` BюоЙƒVЇЧййљйAЖ5 /–"RЄ IDAT&;'›/Пј’%‹3h№`6oйJјУЄЅЇ3mъTbуb  B† k+ІOŸA•jUёєєЂGO?"#УЩЬШфлo'rэЪBBЎ1эЧЉ88”bР‡s&§ћѕ%*"’ЃG˜ѓѓ$НФРaƒЉV­уПЧсƒиЖu j­ŽšЕ|˜З`ЙЙ9”*хРЬ™3)ушШќљ pї№РмЬ +kkvэйCєЃGФХХ1kњtЖoлJOПžlиИ‘Вe;і Ъ;;ёŸс#+ќўћяь?pwwІЯ˜ЩђхЫўh(H зщЙsч6ссци–АЃoП~x=€Щd2ЊTЉ‚ГГ sчЭ+ђМЇB™'&&>Ї|2Ъ”)CВо˜*• zвггYЙ|9›ЗlF­V$$у€>2и—*…Їg~™fNŸЦЉSЇашtH …œ!7ЩHOЧЎ„_Œ€НН=ЧРЦЦooo Пћ­VЇgџОНьпПIЪя~іЬ™ќѕ!УССЁHњ‡Rx{{c0 Л‡V­aгІ lкД™L†о Чвв’Š*r18П=hкЌ?ߚ՘‡ГГГБ<Х)]К4Еjљ`ni\.ЧббWBУю‘œ’JTd*ЕŠе+W€ Щ”.]OwЮ;Kї.]hзЁ?LJїnнXДh1У‡LЏŠlк’?Је„ёуЙ}ћ6ƒЕV‹R.чж­[Є&'улЈФ!љ; НKbb}ўё#I еj‹tяAA„ЗYГ–­АДДтaшmДZ-Z†˜№tѓы…*7‡№АЗыїwЭ011с›‰љfтDКuюЬљ‹8uђ$ ђђђ^ИќУ+фЈU*,ž%JЁcЂ4СЮЮwїќж8I’hпЁ=7lР`аyйЋЃcYД:rљузШH’T$}ПN6nиHшна–O.—“‘‘Ž\.gыцMЬ_ИъUЋаЄi3‘_|0;uЪЖћћѓAНzдЉѓ>ћію%//$РЬмМpPom^2PЊ”ƒqšVЋСЦЪ //Jи–@ЏзбЖm[ІM§с™eЖ+i‡A’(aWвИ kkkМ<=я}577ЧЗQ#кЕoЯДЉSYПn-kжЌEЇгSКti H/еЬЏеj##!!€ЌЌ,d’„^Ћ%77k+kМММ0ЗА0ляз­ЫёпOђУ”)ь№пЮ’Х‹аiЕLŸ9gW–,^Фх+—iнВ%епЋЮЉР@š4mBЕЊеиНs'*Е MMPЉTEї›Lމ‰;;;<<<ŒЧB›ЖmФйLAAxgФGG"IъЇЎyѓrs Н$Io]™-ЂoЊkюosч’‘™Iя‘‘‘Сƒї135ЅAУ†ьоЕН™)“'}‡Ѕ…E‘ RЋе;z”Y3g–žAѕъеАЗЗ7ЮoмИ Ѕ$ююю4kоœ№ˆњјŒєtfЭšЭТ… ащuшѕz<<=115%3+‹€#Gаh4јљљёйЈџрццЮŒYГŒyїщзŸяЇL!:цŸŽNЫ–­ШЩЩсмйГ|3qт3З7=#ZЕ•5Э[ДррОНЯL›˜œ”)]†жmкАuK~—хїjдРвЪŠŒЌLfЯœI­ZЕˆХмм3SSТТBйПo/™™™Дjг†Еkж=zі@’@ЉTPЪСсЙћХжж™LЦ•Ы—йНkƒDC__Ž Рггƒў§ћ“››‹}ЉRXXX0яЗЙдђЉ…ЉЙЋW­ццЭxПWužŠѓgЯ’“CйВeiоВх+2™ŒїыехьйѓxH>8ЬЬLœœœ011aсќљдoаSSSжЎ]CHШuVЏZ‰ЅЅ%?L§‘џћf9йй<ŠŽЦТТЇђNДhеŠжЃP(hоЂцццм Ѕ_ŸоЈ5Z4Z5 K5iŒƒC)d€›Ћ+-[ЗцСƒ 4XœЭAA„w†ъ9{Њ—hјћ[бQŸNЎюЭEШћіэу^h(fцц$ƒV­ZбЂeKО™ј-уЧgеЊUШe2дZ5Ж%lББЕAЁPŸШЧŒJ•‡ƒ})vьиЩ§ЩdXYYQУл›ЩпџРфяОeуІlлЖЙ\†Л›_ŒћŠ7npє_~ё%Hz<<Мџпџ2њѓЯ˜ќнD H>ФеkзИyѓC‡ ЃRхЪЦВ_НFЭїоcїю]>xI’ає(фr$I2ŽN љ-iƒФ СCйНs‚.1lШ`дj5ц˜››Ѓзыбы Цe&|§ Ї9rєЇQЋеикк`nfЦЎн{шдБПўі+fІf˜(,[Й7W7  ТЪЪŠCGŽpуЦ n„„№ѕ„  lmmщщз ƒС€с‰ѕ=i№!Ќ^ЕŠƒ‡pќј1lmm<}–іmлpљЪUn‹^ЏЃlйВЬћm2@o0 T(љђЫqx{{sєи1жЎ_‡ЩІM”q,CахЋЦu †B7d`ь* бhўш!ЫКѕiPџ._ОҘЯ?CЇзуццЦ_ŽcюЏП —) ”J%Ÿ~:’Џ'L ;; ЅRVЋЃKЗn ћшc>ьп]Лvr№рT*5%K–Рдд„s/бБ][Ў]НŠ\Ё@.WRЎ|yЊV­ЦSЇёэџ}УІЭ›ёїї™ WW:wщ*Юh‚ ‚ ‚№Іб7Н‚­лЖБ{ї.Ў\Й‚­-;uЂy‹ќ‘g{єь‰™Й9ЯŸ'//ЊеЊб­{wьээYИh1.œ'+3 F}ў9 ёёмПЕZmlёыгЇNхЫs4рЙЙyјјдЂcЇNЌZГ†ызsыж-J—)MП~§)[ЎjšыWЏQІL†}ќ1іяЧУгГP `iiЩН‡YВxЗnнТТмœšЕ|шлЏWЎ\&)1 Џ XГn:'''ŽŸ<ЩЪх+HHLЄdЩ’xзЌ‰oЃFlнОлЗoGvvv&риqжЌ\IZz:ЅЫ”цƒњ ŒЯs:t˜ ызЃQЋЉщS‹fЭ›sіТfLџ‘œькДm‡ЋЋGŽВnэюоН‹ЅЅ%~НzчwіпСƒћїёЉ]ЛШ~БЖЖ!№ЬY~ž=ЕZMЯ^Н(ioЯ… `–/[ЦУАЗЗЇOП~ИКК2ѕЧ ЦОЄ=нКwЇFС3ЁЛїьaѕъU˜˜˜0ш‰–Ф’%KВ|х*”JVVVєщлЌЌ,:vъ Рђ•ЋиГ{цw ПrƒЅ‹‰ƒƒ§ћ \љђdgeqуЦ Jк—ЄGO?ЊV­ŠcйВјћoGЁPа AC:uюŒL&cџƒЌ_ЗŽ>"AAоIB20žнИ(—ЫЩхШŸzёя$лўP#хъ$ВєаХьб‘сш о{љ,:Ž№ˆzФе‹чž™.)9‰Ю=ћ`bbђ—Ж~НїIINAЇзГbх*ZЖj%Ž<сЙєz=U*x!Щф˜™™’••M [і<ˆЛЛ‡Ј AAсЁеjйЗc+ЅJчЁzс‘мЛŸœм\d2йЄќq:---Љ\Љ2.хЫ#“ЫŸ™иВ~ юю(•ЯoГT*•8ЙЙГOэ‚,•2,х`!s%˜Щe˜)d(ф`&Ѕ\†R (фOЕˆJHomЅK’ФШ‘Ѓ8}:Ё}„Џo#q$ /ЄP(XКb%;ќ§ЩЩЭсНїj0tша>C+‚ ‚ o3ƒ$Х­лЗбы ˜(•ОЩ?lЊђђИuыr”/яєзЕŒОFјЈ|W*Z&“1xшP*Ž:с•Дhй’Џ8ˆ’ ‚ ‚ МЭф2backƒ““н{ѕСЦк†ќ‘YGŠYYYьоЙФИ8bутpvr~+ЪЏЛPAAснb0аыѕшt::uщŽVЅ":%Љаk* =Vж6tши…K"“+0 EZLџ–@ZьBAAA„w—ЙЙ9YY™ щ‰A"+3 ‹ЗЎЬЂETAAсІбЈ‘Є‚з6JЛцў1MЃQПЈ$vЄ ‚ ‚ ТЛBЏз! qшhС4Н^їЂ‚ ‚ ‚ Т;хїˆ>9 юѓо-*QAAAсЕќб WТPdклH Vє—юќЧ:_DЏџѓхвы_-Нс5~[:8fџ †7ћ;јГЧ˜С і ‚ џЫk"ƒщ‰Ягў•ш§ћрс‘‰Їg†ёут’ХЅKњПmЃзЎегЎ]Їž^8jй2…>J.vЙ%Kђ№єLЦУ#‚jе"1"?нВej||"ё№ˆЂiг(ттђЗ-- |}SЈV-oя(||’љёЧМbѓ~јPЂvэTЮž}нН+ст’UЈоюоЭŸЉУЧ'wї(ZДˆE­–ŠtХmЫ;:|}cЉ];’J•hг&†Йs5Цљ'NЈЉ_?МНЌ*Rж•+гЉX1ƒјјЂWџН{'тхMЭšБ$'чзCj*ДkGнКдЌMЃF1|§uNЁхNœШЃ\Йt\]3&Э8}фШt<<2 ?]ЛІЂVУШ‘ЉИК&рш˜ТЈQёХжkpp&eЫцrхŠўЉѕщЉ[7…ђџVЉ џ$о? ŸHЊUKцЫ/3Q=Бљ.hЈR%•вЅГёєLЂyѓ$Жl)ў8>yRТЯ/•ъеSyј22 eЫdjдˆЁV­(jжLfђфмb—ML„КuS8|јё~9|XGНz№№ˆ nн(nоЬр<%|}S еЛ{&“&eЪSЃ‘xџ§dўяџ OЯЩЩ_зФ‰ЉЯМ1аИq*+Vф™}”NЅJЉhИwЏшo§Вшѕ0dH^^QXYхбПrЁ=zЄ—ё№Шр“Oџ0Пћ.%ВББЩс‹/R н„щб#gчxмм’йЙ3xЙКоМ9›ZЕтqqIХе5•Ў]9~МшёмЉS<^^‘дЋ‡N—?ПИэtuЭ2юЏУ‡sЈX1gчxКvMЉ ‚ џ’d(јHO| omЋшDwя†ЈЈУЄЄФ””MRR6ЩЩšП-mг&‚QЃЖsёbЁЁїxоФ‰yœ>Н…эляАsgс‹в)SЂ;і™™ЁшѕЦІMЬš'ž$11аsхЪQЊVЭЄію…+WюœNJJБќ№УfММЂаjч?i’šzѕЂЙzu!ыз?Ў—-[ДФЦю$.N"!AGRмО PЏ^ЩЩЫ•мМЙ‘Ъ•Ѓ •їYлђгO:Ю;@lЌ†Œ ССс|їнЏќіл#њѕS‘‰$ЩHI9AЛvзЙxёqО))№йg&мПџ;j†}РГQЋ$%RНњCвв`з.8yђ6‘‘ЉЄЄфЧмЙгщлї>шщбу62й t: Ы—/cоМXжЏЗ !a#‰‰ЙЦучђeшп?ƒЕk “х “eБdЩi *\ZZЗ%!a›6IwŠ`ܘzїОУэлGиЗ/?mh(ьлЇхсУ;$&f“СќљЛqtL$&&?РјёG ЁЁ›ЩтШЪЪрЪ•[ rЁ>uЌDвЙѓТ WЧŽС… ‘ФЧ?$99ЈЈІOп‚‹Ы#ђђяŸщгЕTЏўˆррŸYГ&џІФѕы0|x0‘‘HёћЪхФ‰ТП/;;5—/cѕъТ?љaУ2Й|љ,H%(Ј№oeСЮЮёœ9ѓ=ЋWыžњ]'QНz[Жмсб#9:юм„‰‰5ФЧыˆŒœУБcZ,аГkWqqик&А}ћBzєˆ1SgЯІšFB‚ŽФD=чЮхЏчЋЏљљчCXYeac“ЦЂE;?>€F"9~|: †(† ЙРЎ]ъ—ЊыI“ мОН•*ƒЬЬ\ŽПL—.зљёЧ(у6vшpSЇ~A­VЙwїђђ`чЮтЮijNŸжВ{З†оН/——†™™ŽуЧ—г A”јŸQA„7Ю`Š}}ЫлњœшџЈkЎ)UЊИpњДЇO;qў|)ўѓSЖoWбІM,Еj=ЂC‡т Е>ќ0Ÿ(кЗO 66Пт4шз/ƒš5ЉS'Š.]йЗOKЋV1дЊУШ‘[PцЭKaћіє"Ѕhз.РРKјјДч№aoBBJQЕъуљЛvХЃTіAЃ‘XЖьq лО}z~њ)GЧЊьнлА0w‚‚jБm›'&Рˆ ЈKxИеЋЗE­ОЬž=љЫЪdZJ”xsчjА{З75jє&.юМН1"—йГ/‘џNYЗBЇЅЉ03+Яєщv\П^Š›7mшб&MЪ )щнКu$<МddЬЂjеќжС TL„BЁ*#“хћ5kТчŸзРпПю4jд•*€хЫѕuЋУ`ЈoЌŸ3gЪrр€НqЛМНSQ(B17_Ф“я.ЮЬ„‹cP(&‘›ТтХ[/ж3aТ $)Sгњ…– авП"%KъYА >ССvќ№ƒ%]КРЕkv—&8И4juI{БtЉcЦ(№їјxK‚‚мqtьFpp.))љ-˜GЅJN\П^Šызэ9wЮ6lаSКt5юм)ЧеЋЮ88дdћv ЇOУнЛёxyuрСgцЬёAЇЫ`Щ’Д—ЊkЅв€RщУ7пxpђЄ3ызЗЅT)[ІOПРвЅy8ПџžAЕjŸэDЛv}‰‹ тлosŠ=Ї;чР”)VќђK*’”УтХеwЦУЃ‘‘б\И ўsAсЭzм"Zєѓ/DAЃ‘ ‘‘љЧЧУ!j.]:ERR&AAїю—W${і,#11›‹PЋV(11ЋWУЮ7‰‹ #!!'ІгЏпfЎ_O'>>™•+ч№еWqькп~ЪШ‘qЦV€ѓч!$ф2juoъе3сїпЕ”-ћxўš5ЂЃЃЉSGŽ™™чЯЋAжьйЉЈе5Ъ™† e˜›ƒЃ#Дo/+>,Љ^=„Њьl5ЖЖž|gЌBaРЭ š6…Ы—­qtУЃGљ-PгІY2lXzі,иЊГЄ$ …hАВ‚ ёTbЂЙЬ ;ДZkNŸЮyсЖ<Ю[NP„„h1`jЊФмœœРв6o–NСвВ:˜—›1CI‰Ешп_MLL 3gцw‡<~\OnnЕk[cn;[RЂ„'N<ŽЌеjAApс‚™,–МkV6ссAДn]“ТнТчЬQћЮЕикжcѓfsR bбAƒ T™‘#ЋŽ…–›81“ъе+УнЛ*0ngЅJPЅ ќђK& …?Э›{PЃFўМж­!(/ЮEЅ ЁLKJ•ЪяТЎзчЂR)‰7PЁB~љMMA.7CЅКРЏПjйГGZ}WW9•+ƒJхEZZ"ћіIјћЋаыЈ^нъЅъКрО!ііPЋtя.gк4wd2-3fфrр@.*UОО%Q( sч˜›+9x№ё;ИT*ЙБЮssСФЪ—W’—УЦ™„…AjЊkk{*Vџ9 ‚ ‚№ƒPƒd|.ƒdќHƒiHoaЋшџ$•ЩЂ ЛBџўЗшпџ-ZЄ‘””!˜•е‡ Њqюœ3ЛveБ†*UЦrљr5|}ћ“›Л—Сƒу ђQсььЭЅKоИК~RщСдЉейЖ­&ЅJuaл6]К@Ÿ>|іYI6|\†ыз $$Єafv–ЅKo0yђœœbЩ-xtl§њ8фr1Ђ$;ЫЩЮ>Хš5Y$$шАВВЧееєЙл9p`2юЅ~}кДyv:[[k4šЋмМ Аh‘%ffEг=zЄ”,YrWзTњіђ/ŠMMЫБbE4C†$Бo_*№™Ь№ТmЩw…РРЛєыw†щгЗ’™йџЧAY‡ |‰+WжRЃ†Эšх&ўўLLRКД#&X`mнsч’0 )I…$ecaan ж $I› ЩгHH8Oяоg;v7‰‰Q|ћ­ŽЌ,ppˆ@Ѕ*OЩ’Ѕм.Кр•j?ќp›ў§oбЇO$Ÿ|’UЈž† Ч`Hф›oЪА`šK—Тщке gчТuъсЁdо<ѓ—>vннэаjуИr%ЛиљUЊдРк:œ€HL”PЉ.Г}ћMцЬ9CнКˆŒд>3{{ђђBИu ьэaёbKlmŸ]žЏОЪ$(h?еЋ7eшPYСяBСА…!CB2$„>}bёї‡иX˜93›7ЮЊH^ЛwЧciщј1жT­jƒСрЯъељMЪVVљeyђfMў %ИrЅ<*еЎђџьнwXззРёяzQAХŠЈ * *JГMь]Бї{Ib/1&1šФо51**vН{‰%lЈDХADиђўЎЎДХ–ќђžЯѓИ3Г3wЮН3;gчЮн)SŽаЌй>vю|есйГд/2ђч/ЩфЩЏЖ мaмИх<{V‰еЋѓОHЌAЇЫЫхЫRЅЪ%rцМЯЭ›Љ1;sЦ­ж—ёуw3dHрЧ–-Ш›VЌаrџ~$­Z`їюi.숉эLŠuzŠWbgW„јx=<’БЗЗ2Дg ‹œ$'ЇМˆљu.]:bˆy­ZИt –-ЫMŽMXЗnўўgxђфызЦбQ> …Bёс<~єKkkєњзКшъєшѕ`iiЭУїџ}‰шŒiг^KЅ?P†ЎЯGО|^ЙфBЧŽ*rОvѓ/~(^ія†ЕЕ]КЄ^ЁЦЮЎ'NXFХ47зQ ИК*аhюao~~ TцEЉ|ТЃG0o^~F6О‚Оv- юŸ}цЫš5)_О.qqsщжэ!.ЄоЉIIЉШО}ЯyњTMEІNЕyqёmVЋцбЃŒїёћяoБyѓ@<<ЎaУ†XbbД@>МН­Гм—T%qs+JлЖ^4iRƒќљџЄnнXCзшА0[њіѕЁL™Юœ<Й€!CR3Т~ј›фdkrчЖbъд$,,ˆ‹;ЧмЙ:єz%`ЭƒŠЩ#ЄЄи№єЉ5:=ŽŽ~ДhсMhh єфЛя.qќИ†'Oђ’˜hgшСs 'ъ?.deеŸТЙ˜‹О}-_KcЙ{w)нЛ7 C‡д/ ОјBIJJьэ­_<пšBTit2ХЭ› Р++UКѓ>„чЯЭ‰wссCP*OсщщЯђххЈ^Н* ХF5К“I[АDЉЬMжeYЙђKџŽоh IDAT—#gЮЦ>ьќкёЅТвВuъИQЇŽM›Іvюкѕ1II)[жŽ™3Ешѕ ž?WrќИŽ;скЕ‡@a/NТкк Екёу“3-УŸBО|‡(XАaa~ДkW+ЋdКtЙgјkю\ ЯŸ ўТ8Нv358&NЬMлЖ prкK`р5ттр“O`йВ"ЬBѕъ.ЈT;ЈZѕЏ‰ї=єњ 4nьEЮœ%HLœMЗnЉн*†M GŽт4iтŒMcnоѓц5ќхqЪGВ&…}{ї VЋQЋU(•яя^ЄўHuЏ>}˜їл"ъЗjћУdNЁB ЖouЋчЏПв.ЅгЉаjSИљbЬ™лЗAЋеёќЙ•бГ“Y е:˜˜к-0.Ў ffI/жCš.‘ЅJЉ_œœžѓйgжЄЄXвВЅ77n<#<<‘gЯ&ЂV7#,ЬђEХžЧж6‚•+ЛЈ#<ќ,ЛwWЁGДWБп}ЯиБ(QтNœ(˜i$Ž ‹ЫXXф0z>5=yђ@ыжJьэ]швх ЁM›|ёEš5Kэ†йМљM,,JRЏžE–ћ’Ъ3gІюKѕъ•йЛw#ЋWЇW/(]ZХЯ?Ћ8yв…Я> bэк$zї†{їЎЁVчШ‘М9 EЋ]ТЪ•ehкДццOЙ{7 АсЏП@ЋН‚—WРPaoѓцЅЖ1clљњыЌ^]‚ќљŸ’˜Glly €јx іі B™ƒŸ~В!8и8>~~ЗјыЏ єъе“яПOНК?ий]#1ёГfй ЧŽљ1yr>VdЋхž=›LŽZ­‰‰I{W4<\ƒVЛ7ЗкTЊdУѓчј™ЅPЗ.јјЈтёуфt‘ЋWAЃЙEюм9(U*ѓr,Yђœ^НŽ’+зW\Нš?Э|­жТшЎЖFЇOkQ*яАc‡P г#9ЙЭš’ТгЇs13ыHX˜љ‹vr•ъ‘‘ѕвФњ%__ИsЇ" мІAhмXAётХxі,–˜˜т”)aacnЎЃo_л7N–а­›šnн ЉЭСƒ{иМйŽ1є hгЦWзJ$&ЦА|Й+;v\'99”Х‹SїЭеЕ/[Жh?.]:H‰ XАРŽcЧœЈ];Ž‘#“љљчЗ‹ѕЪ•‰$$ьЁR%||XГцonо| фрж-=ЯŸ_#(ШѕХвfИИшYЕЪіЕѓLžќ OІOwТпЊWџœШШ?XЕЪ•–-хS!„яBЉФLmFЮœЙxќ№kV­BЁP PЄЮ{™ZMžu*‰п~{ЬнЛщн;ˆВeЁjеЬїЅlйд8ЦФЈ˜?._NтђхЋ8:куъ ƒ=УУУ’\ЙL™ђœЄЄэфЭлƒ9s’Йuы*^^}шз/ѕтћяПaдЈ);–Ь˜1 ”kзЎцРЌYIJВЄV­WЯ:ЦЧЋ ƒЛw5,]zKЫ‡xzкђј1lмx‰Бc=ёѕЕтљѓЃ<}Z52ŽЯМyЮžЄhбVфЩ“ƒ  W.шд /v'.u`U–-гВmл\>§4ƒ)Mh? цЭƒ#GRXО\CRвlJ–ьBhЈ‚ЅKS—9yRСјёzЂЃВ{їatКŠќјcnŠKK nмИСoПфђхіQКt ЬЬRп›”Єfю\8~<‰Х‹u$'яЁAƒFTЈyЙFК‹Z&M 3qbъДњѕy-ёTёЭ7Џ^—)[З:rєh5 ѕ'GІNƒ……;vXуюЎХжv8ƒ9ўААтьоЦФ‰ёgмХеЫызЎХ0vlA T”t 3ГВ†gAOžЬ‰НН^^Џ’ў‹5,X % Р‚Ј(Иt)‰9,(PvьxЮбЃJЪ”1уьйєњ˜›УХРšЫhc“кbлЖЭlпЎF­Ж 9ЙЛw?!$$5гXНZI‹бЇЯS4=ЖЖЭXЛ6?ЧиѓрСzіЬфТбб’–-ы2yrоtŽ4šдcуєixј0‘'O.2yђѓmЬ’ ŠnKJŠ=‰‰Ћ=КРkћS‹­ща!ѕuTLœhЕЕž­[u(•WЩ‘У‰сУ_m1~ЎЪкЕЦIЈNWШшј]ПО оо~јa EЌЌђБk—#*DGƒЙљž<)`tЧШD6m:ƒ……&ЕZGџўeЉQ*THф?ўРвRСГg)XZzВzЕ#0jT~сrїюпЃ^“цŒoF—.Єјd§zАЕM}FьuГfi9q"77k†}5@аЯ?C‹ЉЃšЦЦТŠ№ХЉѓvюLHЅvmJО|JBBвŽŠ:{Ж†ШШ'*dХиБЉѓПћ.ѕІЋЋёВpсtы–њњњu˜9ѓББOЩ“Ч’Р@BCЬœ wяПЗ[7(P.„Ы—Sащ4,hIHˆ"н.ЙЩЩ0v, ––ЏіiуЦюоMЦЧЧŽСƒЭ^$!Аh‘ %eЪМ0“іЅC˜?_O\\ :K†QV##сїпŸrыVХ‹л2p 66А}{ъOЂ„†Џ7) Цƒ.]Rы%<\Ч–-)ZдšЏП~u{щRˆ‰IсщS >>цЋ(Pрѕ/+`Р€Ї<~œBчЮ9ЈT)ѕ 9r$Емэкoїю]˜9гxšƒєэ›~\GŒР№ЬщЫїЯŸŸя—Жo‡ЃG5<}š‚ЃЃ9~~**W~5џщS˜9SЯѕыЩилC‰цДmЋHгm|уFЫ–=СкZЭЗпкž“ ‡ѓч“бjЕфЯoAхЪJМНг?vFNmл/.ZК45Щ{]h(”, @LŒёМ2e aCуi‹AйВрц?ў˜+‡7Ы ЉЧйыЧ]ЋVезХ‹0n\UJu !„B!„ј˜$B!„BёqбгІБ$,L"!„B!„тЃPїъг‡—Яˆ !„B!„štЭB!„B!‰ЈB!„BID…B!„BID…B!„BH"*„B!„B˜žˆъбKD„B!„BdJoјЯ{HD…B!„BˆMQ!„B!„’ˆ !„B!„DєsётE\]œЙrљђ;Џы“ЊU˜6uЪ;ЏчоН{ИК8sєшiAйрыэХ’ААВю ыЇЈkсх~/\№х}}3]&6і&Ў.Юœ>}њЃ–mеЪ”єpЯrЙŸwЃwЯžвˆMЈ;SъвдИ‹Я1 „BˆџH"šЯуЧRЅ2юEн№*щIы–-иЛgдЪGє2ЉŽНљŸпзў}ћаЕsgЉєзvuЅaуЦ†зЫТУё*щ)Щkkš4k†ƒCЎt_П/еДkгФФФрътЬЙ?џќ лyђф Ў.Ю, џз—U!„ј'Љџ‰>~ќ˜&ђьй3ОјђKМ}Ъџф ыжЎЅcћv 6ŒЯЛїкџˆ””ЬЬЬў_ьЋŸ_ќќ*HЅП&Lœ”сыџm_ЏзЃеjQЋев@„B‘ЎфŽшияОуЏиXVЎZMгfЁИЛЛSЎ|yО§ў{Кvћœё?ќРЅKбОЦДix•є$rџў —9}њ4 ъеЅИ[ЊёћКui–iоЌ)cFm4mэš5Иu3šЖfѕj*т^д†ѕыёчйГiжuчЮњѕщЏЗЅJxаИaЂ"# ѓ5 пŽљПђw+By__:Жo—­И…6iТ7_2М[ДWg‡-2L=j$ЁMš˜\Ў7/+2сЇŸвЬЋR•1пŒ6М>qќ8­Z4ЧгН8e}МщжЅ зЏ_Яr’’’1lоЅJRЮЗ ЃG$%%Х0џњѕы|оЕ Ы—УЃXQ>ЉZ…_цЭEЇг–бjЕŒ;–В>о”єpЇgїЯyј№aІл

єјМНztgв„ TЌ€WIЯtпЗmыVjзЌAqЗ"”-уУаСƒHHˆ7ЬйНyѓІMT Ё”g ъжЎХ‰уЧГlsПЮ›Gэš5(UТƒВ>оtъаžЋWЎ-Г,<œj!Uq/ъ†OщR4iдаh™ИИ8ОшпВe|p/ъFHхJ†іѓ6]sг“й1•QнdжЎ“““љqќ8§+т^дъ!!,ZИНўе8ыЕ§ЌтёІ—ѕГfѕjBЊTІDёb†ЖjЪЙтф‰ДmеŠRž%(щсN§:Е}ШjYЕлЗoSЕR0ЕkжРеХ9нюђzНžЪ•?ю‡tЇџэЗях30Гc;ГВоО}›юнКRжЧїЂn0iТ„ ЗcЪчŽ)ѕѓЖч{!„т_•ˆj46Ќџ&ЭšQай9ЭќО§ћЁP(XЛfMšyZ­–ЁƒЖh!+WЏ!ИRЅtЗёфЩкЗi“S>6mнЦ”iгљeю\юмОэђ9|˜/єЇqгІьиН‡={1bи0ЃeтiжИ1:žEK–Аiы6jеЎM‡vm IыЏПЬcѓІML1ƒШƒ‡[В„ррJй*K`pQ"‰ƒЃугЂzqcJЙT*… F­6CЁPаЄYSVЏ^etБњЧЩ“\Й|™fЭB8sц4­Z4' 0›ЗАlх*lmmhеЂ9OŸ>ЭtfLŸFС‚YЙf-пŒУВ№p–,^ќ*–ёёј2СBvюйCПў˜ƒ]{їђ§уАБЕ}oчХЌŽЉŒъ&ГvнЏOo"іэуЧŸ~fзоН|5h“'Ndс‚Fл~ГэgŒђчЯЯо§ЉЧРц­лˆЙЫБ“'гьƒBЁ uлЖЌ\ОFc˜~№РbbbhеІЭ;зuVЧvfe6d0OžВtљ "Ђ0eк4 ЛКfќ%LŸ;ІФі]ЮїB!ФП*НuыЯž=ЃD‰щЮЗЕЕЃ@‚iО}O|–H—N9qќ8kзo „gЦЯБ-_ŽVЋeв”)ИЛЛSЦз— “'“˜˜˜эђЮ™=‹ р`њј‚Т… SЃfM>ябнh™ЫW гы˜2m^^оИККвЕлчT­ТвЅKˆНKЁB…(_о'''>ܘ6-лыONNц‡ёу)ячGбbХїуфШ™“… ~KwySъ.н6RЉ’!щ<юЯ““щаБ#Q‘Љѕyр@VVVј–-›э}АЗЯС„I“ёііІBХŠtяй“§™єJxЩЭЭо}њbaaНН=экw0zпЬгёѓЋРасУ)ZЌUЊVeьуиБc;.\0њkьуppp@­VгНg/тттИxёBІляіyw*WЉBЁB…(UК4SІMчЮл?vьХБyK++B>љ„|љђсVД(7ЦѕХўђeсFЏ 4ўвAЃб№ЫМЙlпЖИИ8ž'=')) ;ћд:Пsћ6 ё†‹дWuтЯж-[оК}yОёХFtt4JЅП ЦЯOњћАэЎИІАДДЄД—зЋO­ІL™2D_ȘюђoSwAAСќќуФХХIХŠЉR5„_цІvoŽŠŒФЏB…ЗzАdЉ’FЯќ(XЇ <{і,гv\ДX1ЃзŽŽŽFя‹Оx‘њ ІЉЯдуя‚сK+жpџо§д/Q7тф‰†љЧNўAЎ\Й8sц4sfЭ&њт=z„^Ÿš4Н ЋJе*ИИИф_‘ЪUЊр@šЕШ›7/gNŸІ„Ї'Йsчљ`чЗw9ІвsъдЉд} J{вуЙЭ7л~VёШˆ­­]š^.Іьз™гЇiвЌ …тb“Uћ0UŽ9ЈWПK—,ІNнК<|№€m[З0eкєїVзosltюк•У†В{ї.ƒЈ\Ѕ AССЦ.ЋЯSbћОлІBё%ЂљѓчЧЪЪЪшNЧытууЙuы/ъ5Јo4§гO?cYјRЂ"#ЉYЋV–л177ЯršR™і†АNЋMч}™ЎGЋеQЦз—uы7dœ€yyy№ћ#"8xрcПџžё?Œc§ЦFO™V–ZME"їячіэ[јbnnN@@‘‘ћЙrљ +V4\hšRЎє4mЪˆaCљюћіюнKbbЂбн­VKž=MTdmГљlђKffцiъ0z~7=Jeњ]:Гz_vз3eъ4’’’ гэээ‰‹‹Ѓehs6jФ„Щ“Щэ˜Е™U+W"%9Х@mкВ•ЃGŽЙ?Ы—-cьwпБ`Q˜!!ўаох˜J7&Z-JЅ’Гч/`mm­ЖџЖёHяzћeъ:оW;hлО= ъж!&&†m[З3gN>ЋQу=еѕлл-ZЖ$ф“OиЛg7‡L}žопŸ_[юЙ(ЋЯSbћОлІBaјьўи433ЃnНњЌ^Й’ПbcгЬŸ>u*zНž†MoпЁп~џ=}zѕ4tгЬˆЛ‡;б/%їяпKѓ<žЃcю4ƒм\О|)ЭКоBџЭgєМ}М9їчŸщюЯыlllЈYЋп|ћ-;wэ&.ю{їюЭVќ‚‚‚‰ŠŠ$j$С/ž ЊT‰ЈШ(ЂЂ"žџ1Е\oЊ]ЇJ•Š7АzеJЊUЏNЎ\ЙŒ’];w=CѕОDю Дy jдЌI‘"EШ“'7^#_ўќиккeY'%RZ­ievwwGЇгqєˆёoХ:tаЈ[yjz”i‚д„Юž9cx­бhју?(žСяОmнЉT*ќ§иЛgG&ЈR%”J%„/]ТЭ›72}6йЬЬьН$вйсюс‘fрІУ‡͘WТфѕtvІhБb†?•JХЩ'HL|Ъш1c№ђђ&$%=уiBBкИ№е AlмМЯ’%YНjUъХМЗ7ЮŸчў§{,ІSеMzэкЫЧNЧЎ;оЊ<™Ху}я——З7‘FЯЅgwйљLcBћіііЦлл›Ѕ‹ГlщRšЗhљоF6хиЮЌЌNNN4oб’ISІ2{ю\vяк•щј™}ю˜лyОB!‰шG7tјpђ(@hГІЌ^Й’K—Ђ9qќ8ЃFŒ`юœй :wїДшЭ[ДdТЄI ќђ‹L4ныE IDATЃ-Дy ™:y2:ŽЄЄ$F‘цуЪU*Г{з.Ў]Н Р‘#‡гЌЗлчнйВy“сїMoпКХдЩЦ?ЭаЂe+ђхЫGЇэйГ{77oорд0}кT6nXРЌ™3йАўwЎ^ЙТэлЗљ}н:ДZ-Хн‹Љп:/\№[–#mUЊФ­ПўтрС†gAƒ‚ƒ8x Š[§E`ppЖЪ•+++ъдЉЫoПўJФО}4 mn4Пп€/ˆ‰‰ЁgїюœœnЗБ7v-ЬљѓчЙ|щ>4 V“žв^^TЉZ•!ƒЙ?W._fЬ7Ѓ9}ъ={ї6jCЫ—…“VЋeбТF ЇсТвмœЁƒsќи1Ў^ЙТAƒxќшэ;tLwћo[w/лШ–Э›АЖЖСУУуE fеЪ•888žѕM7F… “˜˜Шў§<|№ MТі!єън‡ЃG0nьXЎ^ЙBФО} :„O?Ћ‘сГфІruuEЏзГяХ…їЃG:x0ЊзойКe ПЭŸЯљsчˆ‹‹cџўbЎ]3Ф.Дy r98аЙCЂ"#ЙyѓЂЂВќB,;L9І2Њ›єкЕ——75kеbф№с,_ЮЕkзИpў<Ы—…3yтФLЫ’U<ої~ѕщлsчЮёх€ўœ9sšызЏГyг&Ž9ќ^Я7yœАДДdЯю]мПЧgК|ліэљmўЏ\П~V­SGСоДq#M7">>>ЫэнОu‹sўiєwћіm“ŽэŒЪ:bи0"іэ#6і&111lоД‰\Йr‘'ƒnгY}ю˜[S–‰‰‰ЁiуF:xPЎЊ„BМe"Њџ8uppрї Љ_П>гЇMЅvДkг†Ы—/1СТLCД~ƒ†Ь˜5‹Q#†3џз_г]&GŽ,ZМ„Н{vуыэEъе(WЎ|šб7iJѓ- mк„ђООќ:oнпјЙŠŠўўŒџё'FNy__:uьРч=Œ—БГГcѕКпё)уЫ ЏО$Єre>як…гЇNЖimmХьYГЈWЗеЊVaщв%L>//o ѕїћО9’Ј,ё№№Р1wn)V<ѕbЂxqwЩ;б…Л)хЪHГцЁ\Иp\ЙrQЅjUЃyоооЌZЛŽ””dкЕiMѕќ &…\oёюыFўkkk‚єЏШЦ ы?€о}њRЛNеЏ‡П_yІM™BЯ^НВ\wЋжmpwwЇa§њ”ѕёfеŠ™.?uњ *њаЇWOj~і)GfоЏѓ u0lФђфЩKp@СмИ~ƒщ bcoŸƒ>§њђе—_№YѕjќљчY~[И''ЇtЗ§.u„FЃ!шЕчƒƒ+Ёбh Ъ№y2€ђ~~Дяа‘ў}ћRЮЗ ƒ њрчпВe™=wћіэЅЦЇещпЗ•+Wfв”ЩяМюžž|?іО9Пђ„6iB“ІЭШ•ЫсЕКБgы–ЭДnй‚JŒ:”v:аБsgУќUЋзPиЕНztЇZеЊ 6є­?Ыˆ)ЧTFu“QЛž6c&;wfжŒ|њI-›‡Вzе*Š/–iYВŠЧћо/Ÿ2e_Б‚[ЗnкЄ Еk|ЦœY3Q*”яѕ|ЃVЋљіћяYЙ|ў~~T Щtљzѕ`eeEе ,@м;;zдш'Ї22eђ$jзЌaє7mъ“ŽэŒЪЊеjјzфЊU­JƒКuˆ§‹А%K3М[›ечŽ)Б5e™ФЇO9vєh–?Ѓ%„тПGџ Єbхеd}ЂFOМъšнрЏзГьОЈбhИChыvœ<| УхюнПGН&ЭпЫЄџз8~œцЭšВ'"gg ˆBќƒюнЛG@?цЬћ…jеЋK@„Bќ+ЄЄЄАaѕrђфЮƒJЅтшБЃ899aІRЃPЄіT(FНП^вjЕмЙ{Џв^>ŠU. ˜ea (тъšхc)*Еš.…и”R;XЋX+СJ–jАP*АP)P)СB jЅЕT P)џ‡FЭ§ЏлП?‚V­лH*„џ№ќЃG7і{\]‹№IЕj!„тDє_Ђ_џ!„ј‡mнВ™ОН{уъъЪфiг3эЪ.„BID…BˆwVЏ~ъеo B!>0Ѕ„@!„B!„$ЂB!„B!$B!„B!$B!„B!‰ЈB!„B‘ѕ§Лql"ЊгщаjuhбJ4„B!„B˜Hџі‰шщгЇ1ПzГрц-БB!„BёAЉ›ЗhСsН’g 5№ЗDD!„B!Ф‡MDеj5ZН*‰†B!„BˆŸˆ*•J”z% НBЂ!„B!„тУ'Ђ*•Ѕ.5}‡gM…B!„Bќ?ђ.щЃZЁPЂP(P wD…B!„B|xj…B!‰ЈB!„BˆFљ2B!„B!>Z" H2*„B!„тЃxб5—зКцЪˆEB!„B!>%ШнP!„B!„1]Нj%зЎ^•dT!„B!ФЧID=š7kŠЏЗЅJxа nіюйcђњп”еў_ИpЖ­[ущ^œ’юthз–+—/ц_МxWg6nи@hг&”ієЄR` сK—–ЉФ;wѓЭhC™Ў\ОŒVЋeШ T ТЃXQ§+2|иPž>о‹о={fZoІДA_o/ІLžDЏн)уUšаІMВн6_:yтm[ЕЂ”g JzИSПNmЃЎžлЖnЅvЭw+Bй2> <ˆ„„ј4ЧоОН{љє“O№(V”Ц Ctt4ЁM›рщ^œЯЊ}bДо—uЛ{з.Z6ЅDёbT­Ью]Лxђф њѕЅ”g *јЖhЁQ™џўћo~љ%Оо^w+BнкЕиЕsЇб2Оо^ܘ6ў}ћрыэ•юёѕКukзRЂxБ4mdнкЕИuубЃGщОяаСƒИК8Їy_•р fݘaђy#ЋsРšеЋЉˆ{Q7жЏЧŸgЯfй>пьšћЖЧдѕызљМk*–/‡GБЂ|RЕ ПЬ›‹NЇЫжё’е9  ЧчншеЃ;“&L  bМJzвЉC{тттŒ–[Б|•_ХcпоНiК*ЛК8Г}лж4чхvmZgЋL†oЧ|ƒЏЗ%=мщй§s-\@QзТйњ,B!$5BЁРЩЩ‰#‡ѓјёу —;sц4­Z4' 0›ЗАlх*lmmhеЂ9OŸ>5,їјё#жџОŽЋWsъЬYќќќшёy7’““ЩŸ??{їGАyы6bnЦrьфЩїЖ~€јјxš6jФхK—˜6}ЛіюхћЦackkXGП>Н‰иЗњ™]{їђе ALž8‘… pъд)†Bп~§‰ˆ:РкпзгІm;”*UКБџгO4lдˆO?ЋAЬЭXbnЦвКm[УќгЇQА`AVЎYЫ7cЦА,<œ%‹ц?yђ„6mлВrѕ6lкLHЕjtщд‘шшh“жџКЌі?!!žж-[ PРЊ5kYОjЩЩЩДnй‚ФФDЃuMŸ6•яЦўР™sч2lУ† цТљѓь‹Œ"_О|ŒњzДЁLE‹CЏз“ЫСISІВkя^~њyЧŽaјаЁYЖХЬЖ—б—(oЛ­ьШЊm6jм˜q?ў„!гgЮЬДоВjƒ/Э™5‹кuъrьф,^В4лmѓe{mк„мyrО|[Жя {Я^†ЄїФёуtяж•J•*Гuћ&MžBDDњі{Ѓm=aњдЉ|7v,+VЏсљѓчєщй“_  KзЎЌ]ПтююєюбУp<Оєэ˜ohнІ-ПoмDЙђхщгЛНzєРЇŒ/k_Oлvэ5b„Q}їэн‹У‡2uЦ ЖlлN…ŠщкЙgЮїд˜3{ѕ4фјЇXОb%ПЏ[gt|НЎv:XлиАzе*ЃщK/Іv:фЪѕінХГЊSЮqGцЫ§iмД);vяЁGЯ^Œ6ь­Ы”нc*!>џ€@ц/XШЮ={шз“'NbY ь›В:ЇНД}л6ЬЬЭиБŸЈC‡љћяПљzфУќQQ 8–­ZБsЯ^њіыЯшЏGНU,L)гдЩ“YЙ|9п§m;wRбпŸ‰?џќVŸ…B!ФGїŽнЊџ‰2O˜4™/єЇМoCЉLЭЇM™J­кЕщѓкХщO&RЎŒ{vяЂnНњ@ъ7Ъc‡ƒƒн{ітЗљѓЙxё^^о–с}­љВp<ИЯкѕП“;w\\ жyўм9ЖlоЬОШ( .l˜џWl,a‹вЁcGboоФвЪŠO>СооЗЂEп:ОUCBшбЋькЙ“§ћшаБ#uые3ZОџ€/8ХЦѕыљтЋЏВЕ­ЌіYx8IIILŸ9ЫАo3fЭ&АbV,_n(@п~§qwOНЫRЇn]~ўq<ћїGPТг3уЌV3xШЋDайй…бcОЅMЋ–Lš2Е:у&žнэНЫЖВУдЖi*SкрЋФЉ.uъжMн_[лЗj›гІLЦг㓉“Ї~ŸјхvfޘŽŸ_†@бbХћУ8кЗmУ… (QЂЯŸ?gТфЩ*”кžzѕюCЯюŸ3sі>ЋQ€AC†R%8(ЭёоЃgOC;>rЋW­ЂH‘"†}uww'lбBC}Ÿ=s†}{їВtйrƒ‚ѕѕhN?ЮŒiг˜=wžaн 5ц“jе(VМ85kе2:О^gnnNѓцЭYКx1;uрЪхЫ9r˜•kжМS;ЩЊnLiGsfЯ"(8˜ўО0дгнЛqŒ|Q7й•нcЊTщв”*]к№кХЅWЏ\aнкЕДjгЦфэšzNsssЃwŸОXXXаЎ}† b˜?oюЊ†„аГwo *Фƒїјх—йŽEVeвщtќњы/єэзЯpЬЕяа‘гЇNБnэкv>B!ў-дK—,ЁtЙŠ8)іб6ZоЯНћ#9їчŸœѕwюмam:k111†;88рршhxэјтпїянЯД яk§gNŸІ„ЇЇ! {гЉSЇ€д.uщ%6UЊVСХХ… џŠTЎRџ€jдЌEоМyп*О^о>FЏ ,hд]яюнЛЬš1#GŽ№рў}4-ёёOpvvЮіЖВкџш‹бxzz.”rхЪ…Л‡б/-[ЌxqЃзŽЙsgY›7m"|ЩnоМABТSt:-Z­–[Зn’˜єМЭіоv[йajл4•)m№%Я7†Зi›gNŸІIГf†$4m›ИH§ ІUєї1яU"š#GЃ˜цЫ—€в^^†iNNNщяоЏ˜™™QкЋДб2yœ я‹ŽŽFЉTтWСјЙGџЖНбГXqуsЅЃcюLCkнЖ-sfЯцшб#јљU`Щ’ХxxxМѓ3–Yе)э(њb4MC›НQo]ІьS†_цЭeћЖmФХХё<щ9IIIийлekЛІžгŠ{ГюyšРГgЯАВВтRє%ZДjiДLЙrхп*Y•щі­[єњ ЫiЕ(•JЮžП€ЕЕuКЫиккБiЫVŽ9Bфў§,_ЖŒБп}Ч‚Ea† єь0c€ tКWїЮ;uh­­-#G}MAч‚XZZёх€ў$'ЇќЃQЅTf;Ю;wь _Ÿо 1’ р`rфШСЅшhкДjIЪн5пu{яВ­ь0ЕmšЪ”6ј’ЅЅхm›йaffžцœ‘:н,ЭД7ыэЭA– EКыЫюГˆЉэF•NЛЩИoŠГГ UCBXКx1>>eXГjВИУІT*3h:“ыЦдvdnnёЦkѓv ;–M70zЬЗИ{x`kkЫв%‹ [И([л5ѕœіЎчѓ7лн›Чэл”щcŸ„Bˆ ЅoйВИrсжэ[џhA vрў§{xћјАkчN4Э;­їeRІyу"с}­пЫл› чЯЪfО7:Ž];wd~ЇRсРWƒБqѓхЮл&з)эШнУ=Эн\S+zŸЧThѓдЈY“"EА'OndsSЯiІ(ю^œуЧŽM;~ќX:ѕ“›‡šК|љRЖЪ”П@llmгЌџЭзяыГJ!„јз%ЂГgЭфЦ›$?Oўh­Uу3цЮ™ЭЈ(ЂЃЃйЛgН{єРЬЬŒjеЊаoРФФФаГ{wNž8СЭ›78t№ #† 3q5+yœАДДdЯю]мПЯ0@вћZhѓфrp s‡DEFrѓц DEКVyyySГV-FЮђeс\Лv чЯГ|Y8“'N`ы–-ќ6>чЯ#..ާћ#ˆЙv ŒwзТœ?žЫ—.ё№сCž?nRyэээqptdяž=шѕz4 ?Ž—&Ё2u§Yэ‹–-БДДЄOЏžќyі,gЮœІWюиллг,ДyіОЌp-ЬсC‡И}ћ6>DЋеRФЭKббќ ЄŽа;uђ”вn?жЖLi›… &11‘§ћ#xјрO2Ќ7Sк`FоІmіщлsчЮёх€ўœ9sšызЏГyг&ŽIM>{ѕюУбЃG7v,WЏ\!bп>† ТЇŸеx/Iпл(эхE•ЊU2h ‘ћїsхђeЦ|3šгЇNž|UЊVХЩЩ‰Бп}KНњ АГГЫЂ­ЛттRˆп~§NGbb"#‡ЫVн˜вŽК}о-›7FsН}ыS'МŸ:*тцЦЁC —mйМ™6dkІžгLбЕлчьнГ‡™гЇsуЦ vякХЬЃ+xuДr•Ъ,_NBBЉRЅRСg5jМењГк[[;–„/CЇггДq#š7mŠЙЙ9‹—†gйMєM цЮ;T­LYobЎ]Ѓu›Жд­WŸ†ѕыPБ#† Эі€KІњXл2Ѕm–їѓЃ}‡Žєял—rОeсrїюпЃ^“цižзBˆџoО9’ЧГaѓf ЦџЭ›6бЛgN§3Ы;йя%91‚'ŽГqѓ ОBˆ4RRRиАz9yrчAЅRqєиQœœœ0SЉQ(RП U(ЈвљЉ=­VЫЛwё*э•aОW. ˜ea (тъšх/BЈTjђ;;ГY[;XЋX+СJ–jАP*АP)P)СB jЅЕT P)A™’’ТНЛїЄV…тxђф GaХђetыўЙф_nЮьY\КЭнЛwйЕs'п};†Кѕъ$єњѕыЌZЙ‚›7o№Wl,‹УОt ­ZЗ‘ŠBёŸЇоНkчGэ–+„џŸ4Ќ_лЗnбИiSљЭЧџGfіЬ™$$$PА`A4h@ППГњО) ‡…ёѕЈQшДZ\‹сџиЛяјšю?ŽуЏ{Г' ADlБї^UЊTэ=лR{tEQZЕ7еіЇЈЊYЋf[ŠЂZEK‹šAЌDЌьфŽпИЭ•„!x?ќєž{юї~ч9чѓ=уŽ3&ЭїЯ‹ˆˆ<‘hцЬ>8{f&Т  €TDфaкВu›*с 2gюМGі]ЙsчfеšяUщ""ђФzѓ™Ž•ЋT!кdНˆžRmŠˆˆˆˆˆHК2Њ DDDDDDDЈˆˆˆˆˆˆ(Q *"""""" DEDDDDDDˆŠˆˆˆˆˆˆQQ *""""""’Jж''§eћ6 фЭcћћhј0тууэ–НњJš5ilЗќъеЋŒ7жnйЦ в%ЭŒ˜ЇфвЬˆyJ)ЭŒ˜ЇфвTU}\ѕ$"""ђЌ0,;o6Y‰0C=‡S\9‹йlОы‡L&Ї‚ƒiбЖћл•тza—УhаД%NNNЖeббб\8оі:SцLdЩ’•“'Nи–9Л8˜›s!!ФЦЦк–чЭ—ызЎqѕъUлВ9r`0zšю.OЩЅ™5Ћ_†ЫSJi^ ЯpyJ.ЭИИ8ѕQѕбЧRO""""w“Рїп-С/ЋьљcйГgЧЩСƒŒF#ƒ‡$Ÿ5›Э\ Ѕd‰’)Ц{хЋж`ё‚yфЫ›GGЧЛцХСС‘lАфЧЫм ИСЭЎŽрb4рт`РС.Fp4p4‚ƒŒF)tО IDAT!‘g;е=Ђ""""""ђHйЂVЋ*DDDDDDDa *""""""Ђ@TDDDDDDˆŠˆˆˆˆˆˆ(‘'1егŠDDDDDDф‘Ђ""""""" DEDDDDDDЈˆˆˆˆˆˆˆQQ *""""""Ђ@TDDDDDDˆŠˆˆˆˆˆШГТqюœ9˜œШš;?ЏжєWˆˆˆˆˆˆHњЂ•*W&“_т]€Pеˆˆˆˆˆˆˆм“ењhё%ˆ6Y‰0Ѓ@TDDDDDDвуЬгqіЬЄKsEDDDDDфбЂ:t$жj ЦрœSˆˆˆˆˆˆHњЂ^оо8˜ЌXЬЊ IњљЙїџД"Ђ""""""ђH)Ђ""""""ђŒЂђƒЄ"""""""iDEDDDDDDˆŠˆˆˆˆˆˆб'ЩПџўKоР\œ8~\љКw}›^=zhфL#G 'o`.^Џ_/Щ{СССфЫHоР\ьпЗя‰ЎмW_ЉCП>Нэ–§Й?хЪ”цэЮ‰}*;етE‹(YЌh’х§њєІЫ[o=єя›ѓх—4iд№žЫDыђц›Œ;ц‰ЬћoЛwгЋGwЊVЎDс‚ЈUЃ:уЧ%&&&I@›70—н_Г&3|},]˜ƭ[QЎLiŠЂ^нWXВxQ’ѕNž8A‡vm)TˆRХ‹ёNп>\НzеnШШ шOйR%)RЈ ­Z4ча?џ$й.wэв™UЋ’70ћїOu^S“~hh(яПћ.U*V pС4|­>;wьx(щЧЦЦ2yтDдЋGёЂE(SВm[Зтїп~г ЂЩЩšе#GŽ№Япл-_Дp!9Ъw$$$dЈЪўё‡MДjбœз_й_|ЋЋk†я &“‰K—.eш›9€aУG0fмxъПіхЪ—Їгo№vЗnlкИ“ЩdїYŠ/nћK.аКГ>>:„šеЊ1~мXŽ=њШїK–-чНў§yсХЉXБУ† JеЊЌ]ћНmхЫ–Цє™Г(]І еЊWgє˜Бьйѓ;{~ПY—GŽaЫцЭ ёЯзЎMЩ’Ѕ˜>c&БББ|ѓЭcЌZѕъ|0d 5ТЭн=ељLMњ<ШсC‡јhд(ЊT­J‚щїЮЛ”)Sжжž’ОПП?kзoрЭЮЉZ­5k>ЧџОњ ЃбШ?lвQŽˆˆ(MN›vэXНjQQQlмАžЏ];I`фуыЫфЉгиМu+у'LфпgШ$Isк”ЩŒ9’ПЁWя>Iк`СзѓYін jдЌ™ъМ4ЈШ(О]В”э;w1uњtђЄbцмjЕ2fєh>9’ЉгgахэЎїUW#†ЃiГцЌYЗž&M›2xа@Ž>lЗЮчГ?уѕ†ићч_,YКŒеЋVБ№›oR§‡ўљ‡бLЕЪ•шдЁ=7nD0~тDКvыžф јЯ§ћјќЫџ1wо|N<Щ№‡аИIЦŒ——СgC>ТŒYГ;~<7цх:Џи–Зmпо–цьЯfбЂeKіьлЯк јeћ6Ц~њЉэ§ИИ8ђцbњДЉvyйДqХŠ'00wВЫЪWЈ€ГГ3Пюкe ИЂЂ"‰ŠŠфпџ`зЮИИИPЁbХt_џN4kм˜уЧŽ1}ЦL6oнЪ'ŸŽСУг3еэvЏ4в2~FќˆЖэкГzэ:ЪWЈ@я^=щйН;ЅЫ”eхъ5Дяа‘aC‡&щ{‰EFDPЅj5Оš7ŸŸ~ў™О§оaЪЄЩ,N4yђз_бЂYSВњeeб’ЅlјсGКѕшiw&ыA] ЇU‹ц\Лv•яV­" W.л{жЏЗ›МH;МэлЖђя‘#Ь™;Г>уч-[шб­+sПšУ˜qујvё.]МФˆaк>ГkчNіяOы6mјщч­єщлУ‡нѕ{—.YLз.]=цSКїь™тzqqqИЛЛурр`З|тФ  *D­ељ`рТТТ’|іЮњ˜z О№JнКМєђЫцІпЛяёўЛя№Ю{ясссбhЄLйВIк-Й€"ё2*VЊФЮ;ЈWП>Лvь RхЪX­VvюиAсТ…йЙs*VФйй нзOlЩтE„‡_fхšеdЭъg+Zм+ДŒŸю=z№Zƒ љpп-_NО|љl}(((ˆ_ЯOвї+^ЂХK”АН ЬЭЩ'XЕr%mкЕ`њд)-Z”ISІb0Ш“'ЯCлЖœ:uŠNэлQВTi&M™bWїqqqќМe _ГаЖьТ… L?Ž-?§d h5nLѕ5IHH`ёЂo1МнЕ›э3™2efќФIЖРЏQу&|Грk~пЛзжпюb76ОќтsžЏ]›Нz;wnТУ/'{I-Рф‰™ћеОš7Ÿ*UЋІXо#‡3ю\о0аVŸо|“ВeЫ‘йЧ‡ЃџaђЄIlлЖ~њ OOЏыУлл›–­ZгВUk._cэїkYГzуЦŒЁB…Š4lдˆњ 9sцGВЏXКd1рЛUЋmЫBC/сччg?Гj4’%K.]МtkP\]]meНЭЯЯПў§РљJMњ%J–ФЯЯI&0~тD|||йДq#;wьРd2a2™ьЦ`ZгOЮ№?Ф/[6ZДlЁЃQ š’6экБhсBЊV­Ъ{і0eкtЎ„‡'а-ZИГgЯ…ХbЦl6sўќyrчўя ;ЅƒуЗ;wЦзз—х+Wсхх•ц|ОеЅ CР–-›ЉV­:ЯеЊEѕ5ьњ’SКLЮŸ?ЯЄ (]І ОООїUOЅJ•Ж{3gN.‡]Ж[VАPAЛзYВdMђаŒфXЖlоL­чŸgстХdЯž§žy)V̘нSЮ€Ђ"#‰‰‰I2ыŸZ‰€%J@№ЉS/Q'''V­љоnЋWЏђћoП1ъуOюКЌzѕ,]В€;wPНF ЌV+ЛvюрЭЗоbзŽДlнц‘­ŸиС(RДЈ-pЙЉI#Еу'q?ѓѕѕХЩЩ‰%эл&[іьIњ^b&“‰џ}љ?lкФЅK—ˆ‹#66/o/Л<7mоќžуч~DFFаДQC^Ўѓ cЦKђлЗmХгггn"iфˆсфЭ›—ЏцЭ'22‚Ÿ~ќ‰ "ќђeŒF#5Ÿ{ŽGN2Ÿ}Ь‘#йsфАk‡ьйsиcGбЊ§­хЫ'?Ё5cЦtnмИСЪеk JБМGЅ}л64kо‚7яxXп~я$jлR”.S†—_x5ЋVл&’ЋФВfѕЃгoащ78pряіэЫСpхъzїщ›ьgЦЫьYГlЏg~6w:uш`[жЁcG†4ђžэЙіћ5|8d“ІLЁtщвe?Oб BЖзA… ГaгЉњЌ‡‡џ›;! ЂBйВ888PЈP!^kа€еЋVa0(§ФЌV+ Цж­[YДdi’VDD$ЂжGžІЭš1ігб 2˜кЕ_ GŽIбŸ~ќ‘ОН{1xш‡TЏQƒL™2qьшQкЕiMТ­ЫžnKщ@/П\‡Х‹ОeчŽIЮ IЏPƘЭvЏ[ЕnMэ^`ыЯ[и§ыЏ7яЋR…9sчнѕ`:WЎ\LŸ1“ЖmZгЂiSОYДˆ9r`0юљНЗ999йН6 IюЙЛѓL2€Хrї6§`Ш‚‚ ГfЭj^xОuъдЁСы yЎV­gщœьЯь0мњ.Ы}їS‚§eЉЙ?єЧ6‘/_~ ,xзeеkжdь˜O9sц ЛwяцНїћcЕZ™>ugЮœ!88˜ъ5j<ВѕЕДŒŸфњY’іNІя%6fєhж­§ž#GTИ0žžž|Л№ЬџњЪ‘šq рююNѕ5йЖѕgN2„&M›ЅЛvэbљw+Ш—?ПŽpDD$=XьјиGдлл›њ АsЧZЗm›ь:;~йNйrхxуЭ7 "{іь\ИЖ{•:vъФЈO>ЁwЯЌZЙвюН,YВrхЪЛeЧK’FіьйiйЊ5“ЇNcі_Аeѓf.^ИpЯяіЯ™“хп­РХе…fsњєiВfЩЪе$пћh/ДPЁ  ЬЮ_w3wў|м=ˆvrrТœL€рффŒйlJі3ЗящJќкЩЩ‰МљђЅј=ж'ѓДмd–•(Q‚L™21kЦt\œ)ZЌХŠЧйй‰Y3І“)S&J$:#›оы'VВT)Ž>ЬхЫaїн†їJуaŒŸДиёЫvZДlХ+uы’/_>ќќќ8sЋЯ'ЮѓŽэлгtOhjЧЉбшРдщгЉљ\-š7kЪ‘#GьжњёЧ$}$qš8№ѕЯ™ѓЁ>нКPP!іўё‡нВН{џHvнrхЪѓэ’%,]˜‡ IRWлЖnЅmыVtэж=UA(м<{A@Ю€ЛжGLL kПџžЎ]:SОLІM™LЉRЅйєуOЌпИ‰ЎнК'Й,61п,Y(PА эЯУгwwwЛeїК `ъ”ЩŒўфcОœѓU’  BХŠ>tˆааPлВ_wэ">>žJ•*Pўж}й[оj['**Š?іьЁbЅJЉn7ƒС`—їл—ОЇ5}OOВeЫЦ… јaгFъеЏџPвПљPЎЗиЗoп­XЉ TDDžЦŒ‰бŸŽaп_RМ‡2_ўќ;zдідЫ#GŽ0mЪд4OЫV­™8y2§п{—Х‹ўћMКчj=Ч–Э›9uђЄ-Jќ>РаСƒйОm!!g f§Кuјјјр—шAwу›% ‹—.УппŸцMsєшQЊUЏNXXыжЎр\HHŠOњMoƒJ•*ѓЩшOйГo?'O!*ъц}Е‰/БKЭњuыь&$:ЖoЧœ/ПLг8Mм&у&L ~§зhеМмќ™Œ;vршшHх*UЫ8ыђvWЖўќ3ГfЬрЬ™3lйМ™YЗžœzћЪЛ€Нd)/[Ю†ѕыщџо{ЖIЁukзђжhмД)ЕžžCџќcћЛ§PЅ-›73nьЖўќ3ћїэcщ’ХМбБ9rф AУ†w­>={2bи0ќ§§YМtлvьфНў§эЎ4HO#G gњдЉ 2___[йŽћoтЁYѓfјљљбЛgўњѓOvэмЩрAЉXБ’-H+RЄ/Мј"Ѓ>СЖ­[9x№Н{іРее•ЖЗ.MОШнўŽииXЎ]ЛЪЁўЙчЯŸЄ6§Х‹Бfѕ*іэнЫwЫ–бМIrцЬIЏ>}8§шшhкЕiЭ_§ХШQЃИvэš­,ѓсR"""їт˜2стт‚‹‹KŠяЗmзžуЧŽгшѕ8:9РЛяПЯ;}ћЄљЛ^oиWWWzѕшAtt4oОѕMš6уибcДhжЋЪW(OЗ=˜8ўП аl61ќУЁœ?WWWJ•.У‚…пІxљjrМММјzсBКНн…M›0С7Œ›0‘qc>eшрШ']Лї GЗЎЗS8:ђтK/ётK/Э•+сiњ|…Šщищ њѕщУ•№pъПж€ГfбІm;іќў;^ШШ>§ЉэЩЙНњєц№ЁCМZчeŒF# 5fаƒmiZ,ўиГ‡ZЯ?РцŸ~"gЮœ-VЬЖNrЫnЋ^Ѓ7l zš‰–еdнкЕЩ>=9НжПtё"ьйcЛєилл›хп­ргбЃщйНбббфЪuзЇ+;zŒгСЇlЏя•ЦУ?ЉЩЯА1xа@jTЋŠЋЋ+eЫ–ЅGЏ^v—ц–.S†EK—2qќxZ4mŠбhЄ`С‚|8|„m}{ї’'O^лыдŒг;'WF~ќёЭп]lй’Й_ЯgУњuМєr$O–}TЊUЏЮ˜qу˜>u“'MЄx‰ єною‚‹ЋKŠСШВяОЃMЋ–єще‹)гІБіћ5˜L&.XфЇ~~§}ўўўјјј№Чž=,ZИШШHќ§§ЉUЋ}њНƒЗЗї­I‚фыуƒ!CШ“7яcЋЇ•+V`2™2јƒ$“\лvмќ$OO/О]М„У‡гВy3œœœxёЅ—6т#ЛЫŒЇЭ˜СЈFвЇWObcc)SЖ,п.^bwFіф‰дЋћпYзS'OВiуF8|њЎyMMњБББL›:…аK—Шœй‡—ыМЬћ§иксAв?{і,мzКnћ;Ў*jйЊ5cЧGDD$#2,;o6Y‰0C]У .?—ьe•‰™L&NгЂmіџЖ+ХѕТ.‡б iЫ$ї‰$VЖTIоя?Рюч\юЅлл]Ш“'/ rзe"џM&™ЉXО'M~ 'X?lыз­ЃWюќѕї?їѕ ЕЇ­>DDD$e |џнќВњсррРž?і={vœ1n^f0’L6›Э\ Ѕd‰’)Ц{хЋж`ё‚yфЫ›їž'мШž3€жx9€ЛЃw#ИРе\Œ\ 8СХŽFŽFp0€ƒ1ƒœIs№ZЎuюИo,Йe"З]Пv;ІщїƒгУчГ?у…_$SІЬПk:§оy—7;wІTёbЩОПgп~ќќќRќќкяПч‹йŸqтФ )VМ8яОџ>+VвADDDDфprv~ЄŸ{иi ъццЦњ›lЏ8Р §™:}… Jsz+VzррчФёуtыб“ЌYџ МF:цЁ—нзз—‰“&Ї{w~ћm' Юія››#FŽД-ѓЫ–Эіп}ћНУ+uыкЅсу“rАќћяПбЛgоъм…ЩSЇЫДЉSшаЖ-[йAіьйЕUIgŽxzzb1›СсоaйbСннЧ ‘џGziЎбhЄXётЖПМyѓ/~ЛхЗХЦЦ2t№`J/FљВe1ьClяпyiю… шіvЪ•.EPќдЈZ•Щ'І€ц ЬХХ‹1ьCђцВћK|iютуу7v еЊT&Ј@~^Њ]›ЏчЯУjMљмє—цšL&Fќˆ*+P(>*”-Ы;}кіўќysЉPЖ,ыз­уЅкЕ)^ДЏе{•}{їкЅsщв%оэз—reJT ?ЕŸЋiwї‘#GhпЖ-Eƒ QЌp:ДчФёуvi8pРvIv­еYНjе}ЕГйlfЬшб”+]Šb…ƒшб­+WЎ\б–QDDDDв•Щ”@`žМФЧЧп5АZ­ФЧХ‘;0„„јg/MЋ™3ІРВ+љhфH/ZФТoОIq§СƒХЗK–В}ч.ІNŸNž[Сю ,H№йВfѕуЃQЃ>bћswwПkОњіюХіmл7~›Зnх§˜2iѓчЭKuйцќяKжЏ[ЧД™3йёыn,\H53|‡Ўжѓ888Аxб"L&111,њі[ВeЫF™ВeSќмСƒhгЊ%UЋUcэњ ,^ЖOOкДjITT”mНkзЎВfѕ*–~їќ›Š+вНылФЧп04kм˜уЧŽ1}ЦL6oнЪ'ŸŽСУг€ШШ˜qІ IDATкЖn…СЫWЌdЩђхФЧЧгЖu+ЂЃЃИqулЕ%{іЌлИ‰Љгg№П/Орт… inч™3ІГ`СзŒ9’?ўDщ2e˜8~МЖŒ""""’ЎЎ†_&‚фЮ“ГХB\\мЭПиЄ&Г™€РмфЮУЕ+с"џŽЙrŸЏ]›ю={PИpa6џєПlпFЇ7оHv§Г!МZЏEŠ GŽ”ЏPсЁцщ№ЁClXПžm;vкю# ЬЭЙ|=?ХМ%—змЙsSЁBEŒF#йГgЇhБbМŽ шЯ §mЏ›6o~зKˆ .ЬWѓцгЋGw>2‹ХBюмЙYДd)ооо)~nњдiМZЏžн§­у'NЂ|™вќМe3Џ5x§жЬŽ‰бŸŽСзз€n=z2їЋЏјїп#”,YŠ%‹~™•kVл.Ї ЬmKsёЂEФЦЦ2cжgЖќЬќl6е*Wbщ’%tzу –,^„йlfђдЉxxx0qЪъМјBšкйbБ№ХьЯщоЃЏ7l@зnн9№з_lмАA[GIWЮž!g@. )ŠЃcЪOУ5™ˆŠˆрBШ™‡њ§жxZQ†DK–*mї:g@'OœHq§ЗКtaшриВe3еЊUчЙZЕЈ^ЃƒсЁхщЏПў VъI+г1ѕейЂUK:ДmKЭъеxюЙчЈVН:/Н\77ЗGZЧwо#š9sf€›‡џ.юаБ#У?ЩСƒшкЅ -[ЗЂqу&ФХХёхŸгБ}{Vџ=YВfMі{ќѕ'/^Lі’чрр`лћњњт›%‹эu–[џ}9ь2 HбЂvїє&vєпЃ-Zд.(іёё!ЈpaŽў{ФЖNё%lA(@PP-јMm;_МpШШ*UЊlї~х*UˆŠˆˆˆШ#vщ"a—.>qљЮаЈѓПqcР€Х’rднЊukjП№[оТю_Ѕk—ЮTЎR…9sч=Д`дb6c4љћ№‘{^Т{з Лd)vќК›_Жoчз]Л§Щ'Œ§t kжЎЕ ФьъУй…зo$Y~эк5\\вў(цлїˆоЉ|…Šќ№гfлыL™3№ХьЯЩ'7n{Џt™2”.QœХ‹бГwяdПЧl6гНG~0јЎљ1’Џw‹хсі­dž–xYZкљЮДъ#БEDDDDžBЦЇ­@йГgЇeЋжLž:й_|С–Э›“мћї J–.…ХbaѓO?>pZд}ѕU>5ŠŸ6oсвЅ‹lнК5Хѕ *Шў§ћ’,пЗw/ŽŽŽѕ'gмнн)PА эяіHЋе‚б˜LЗ10[Ь)ІWЊti6џє&“щСъПT)Ž>ЬхЫaЩОT8ˆУ‡sуЦћеЋW9vє(…o]ВT8ˆЃџў‹йќ_~/_#444MэœУпOO/§ѓнђўў[[yl""Ѓˆ>JCfћЖm„„œ%88˜ѕыжсууcїs%ˆ–,EнW_хУ!CXВxЇNтШсУ,YМˆ)“&Ѕ:ЯfЭтћ5Ћ9yт.\`ѕЊU˜Эf Ѕќ36ЛМЭ{і0lшPіўё<ШџОќ‚ЙsцаЎ}{л{вSнWыёїСƒŒ;†cЧŽђЯпѓnП~ФЧХёђЫuRќ\пwо%88˜нКБп>Юž=Ую_eшрСIžh{7-ZЖТЧз—З:ubчŽœ={†];wВjхJрцYqWWWzїьС?џЭСƒшйНооо4oбв–Ftt4гІLСbБЫАЁCэЮšЇІF#пюТЌ™3m—џўлoI.?ІY“ЦьўѕWmEDDD$]Лp‘“СЇ9vтT†ЮЇ§ЅЙж'ЛвЭfУ?ЪљѓчquuЅTщ2,XјmšюнLщ3g1kц >›9“!|€——…‚‚шаБcЊгpwwcіgŸŒеb!L›1“’%KЅј™з4Рлл›гЇБЖѓїФХХ‘'O†|ј!mкЖ{$uќZƒФЦЦ0їЋЏ˜?w.ŽŽŽ.R„y_/ИыУ–J•*Хђ•Ћ˜>ž9rPЕZ5|н›y/ооо,џnŸŽMЯюнˆŽŽ& W.КМнOO/.ZЬ'ЃFбЌIc •*Wц›oй.БЭ”)_ГaC‡0oюWdЮœ™;qфŽŸŸIM;їън‡шЈhПо  ЂGЯžLœ№п“sЃЃЂјcЯ§Ќ‹ˆˆˆˆЄЋАЫс\ПyЬУх№pВІpлпуfXv2оmВa†WЌЧ Нxою’Хф˜L&NгЂmіџЖы.FƒІ-qrrRЏy |џнќ’ypчЕ78}&џœ9Љз ыжЌст… фЭH&oЏTЅ_Оj /˜GОМyяy2ЯССПўќ`(„—И;p7‚›\СХhРХС€ƒ\Œрh4рh8ŸТ{DEDDDDDž%Qббœ 9Ofjд|Ž?пMЭчž#SІЬœ9wŽшш˜ —gЂ""""""OАА№+ИИИ№R:œ:zSBЇŽ§ЫKu_СйЩ™А x‹˜нљVы“~“ЈˆˆˆˆˆШ3цљ_Тннƒ“џ"!!€„јxЮ:AЃfЭ‰Žтдб#7‘'ЫХГЇБZ­ФХЦк-‰ŽцдП‡АZ3о GЂ""""""OА蘘ћzяqв=Ђ""""""Ђ@TDDDDDDˆŠˆˆˆˆˆˆ(Ђ""""""" DEDDDDDžVЁaЁ„]Оœь{aaa„…]ЮјЈUэ("""""ђФјцлХŒ?аАPЛх/…ђщј‰,ZК,}Ој‚Gy‚Нћ~LЬјьs""#Иqу3f}†йlцwпЭpyV *"""""ђѓvwcє˜Б„††ёйч_ХЬЯП ќЪЦM˜€Л‹ГQyxn\ПFž Ф‰“'ywР ‚ƒOѓСр!јћe%тЦuЂ""""""ђp…‡…RЃjкЖo@Ї7о rХђ\Й–!ѓыЈ&yђ?{†іmл№Ъ+uёЫтЫ™“Ч3l^uFTDDDDDф)qцф œ VЮœ:‘ЁѓЉ3Ђ""""""O ЋеЪkW3|>гѕŒЈСjPOQŒѕQЃ1УŸyœ>yЃёщИЛ2]KсююNШщSœ:~TНFDDDDDф>:v”sgNуюс‘aђdХzпŸMз{Dнм\‰х№_rјРŸX,ѕ ‘4И}дХХWW—ЇЂLщўА"ggWœ]гє‹еŠеbСbБЊз‰ˆˆˆˆШCц ŒFŒ=Чц™DгЪbЖ|ц48 3Ј"""""ђQ#89оGdЌ7џussЃpЁ ќГчР`TPћTЂЋ•р3gјћŸpvrФd6Ћ…DDDDDфС2gіСЭе''' їyf46.ŽУGŽ€еBЮœЊи‡ˆ>ц+a­ СЇƒ1  ЂI‹Vxyzqs BDDDDD$ЭQ7nА|йbB/\Фг3 žї§єй„јx\\œ9{юœб‡ˆ>"Qбб\ИJю\8;9й–[,V, ЮNN4hи„ј˜Ю\U+‰ˆˆˆˆШ}ѓєєІAУЦ|1k&‹ƒС€ƒƒУ}ЅхрцFf 6&іОbž;…†…2џ›oiкА!љѓчS š^Ў_ПС™sчqvvТХеы—п:ЛИ`Š7тъъJшЅѓ5"""""ђ@nмИNЖьў ŒFЃэя~ЙИКсъцvп1Obnю„…]fђДщМйЉ#eЫ”V њА…]чќХKdЪœ™WыечфбУФнб(FƒƒтЙ}IЎ§…Й†фўIє_жDџŸьи_lMВ$бтфЏUОл{ )_Hœт{ЛB>Py“)гу,oвђм­LIы#i]ЈМЯzy“ы‡[офѓœњ1ЌђЊМІМaŸt?хНW™ИМщИ6ЄzџЌђЊМмѓx35ezфЧ”ЯxyMІŒ†›ЛЃС№@OЯЕРј1Ob~YГђѕТ…єъбƒЯџ7‡цMѓbэк D–s.p9ќ*ў9sRћХ9qфqББЩ'Рl1cБ˜яЛјыПї ЩnЪRu№~з eк7Ђї(ЉйH>MхНW ’ЄМ‰*сAЪ›К2ЉМ*oкƒы{я{—їЮoHУЮ?C—зОбUо PоЧ№“RоДф>Ш>ј^х%йm–Ъћt—7™}RJ'8юYІG{LiH’ћJ0<Ѓх5›Э€сцџ †ћ~XбЭьlћ•ћ‰y‹‰сzи%ц|5—ўяПЧвх+ИNѓ&MшЌэˆZгщiEQбQ\П @ЭчžушпHHHHВžƒƒУ­ю7^dНsЖЦмВ&гя=юЙБLaљЭїЌ)vЪоС`H.5ЌЌЩ  ћ(oЊ6АМ$ЛсПUk2хMВэHvЋЉђЊМщVоф?eАХ1жdш­i(/ЩЩ? х§Џ\*oЦ(oЪc8Ѕђкя“юПМwьƒ­ЄШЄT),OЯ}pвЖЗІ0СЄђЊМi ЬЧ1хнЪKrЧ”ЯLyБ #Н}ŸЉљжйЮдЦ<Щ‰‰Ž&фдqЦŒУЋuыВхчmT(WŽљѓ?hzёЯ™ woќљ'ыОџžМЙsс˜ЬЭСŽNN7gCnѕ ‹ХœtіжšЬЌе( ;џ{мпNВГ<ждЮJ?§хЕŸƒ3мyЬ—ДМ‰ГЋђ>ухMi'™ОхНї$хM2†яQо;Чpvўї>ш{ŒхMДЭRy3FyS,ѓ“RоtнfЉМ*o*Ъ›Ь>ЦšЦхэ˜2ЅЋvž™ђо~я!ЂŽNNЖ@4Е1OJТ/_fф'Ѓшєц›”.S–Шзˆ>ˆзЏ‘П`оооьиОу'‚Щ—7ggЛѕœ]lџm1™S=ƒ """""rЗРбl2=єt]l—оІ6цIЮХKЁЬ˜ѕсWЎ0фУa5їќй3dёЫЦыѓћю_“<ЪиЩЩoOoЎ^ПЪЯ[Ж№\­ZdЭ–…Ё"""""r_(pѕъ~йЖ 'GGœœ1<рC€Ь ююž888І9цЙ“Ћ›%J–ЄoП~8рBШйgЂ]љяˆ†‡…’ЯѓЕksь№?v26›MфЩ—ыI ‘7XНjЅFŽˆˆˆˆˆ<0'GGВљeУХйхС~КХj%>.ŽмЗ~r2m1ЯќќВ1iв$NŸ8Ю•Їјžа$ш_пў@–rEqЪ—ы‘}щызј{џо$ЫЏ_НBЁ Т8:9‚)Ўу‘gЃЃ#NŽŽ`ЕпщЬ@ BЮЄ9цЙSlLtЊж{ъкУЏh^Nя9D6Шњј3tёмYrцЁbЕšvї†F\ПЎб#"""""ї@:8`4јЗ9MІЂ""ю„J*бœeƒИv=šˆѓ—3D 7Oe‡‡…ЊuDDDDDDžЦ‰пgЏфњ™K˜туU""""""’:№ы&Ц’-_"S`6єhZyŒn>^XLfе„ˆˆˆˆˆˆ<š@д’`"*ьšjBDDDDDDM z|ЫvOЇIOŽn™Н№ёє$BWчЪ]XЌV,f3І„UЦГАaprВ=т\§CддІjSѕѕ“gЛMдІO<Ї4Ж}j=ШщLЧРЪХ‰6YoЂ–Ѓj%IТd2стцNЎЖŒnС‚…\Йr…wощЃ6 DѓцЭЈYГz’ї>љфS:vlOхЪ•˜3g.&“‰Ў]Л<ѕћыєюЯЙŸМѓЮћ4kж„ъеЋeиіYП~ ."<ќ “&gгІШ‘#­[ЗМЏ§вЃhгИјXЌV+VЫЃoглy2$zЈŽХbСh4оwšWЎ^хєщ3”-SњБл=Hўn[lэћИщŒЈЄr=ќЮ:aТ$~ўy+ƒ___Ъ”)MЧŽэЩ’%ЫmX­ждчwцЬЯШœ9mлЖЩ0um6[lužѕЎўёhњЧ”)гxс…кдЉѓ2Vы“г–OB№ёёЁL™вtша??ПД\ЙB‡oАvэъ'dР<о>”п§ЦoqщR(ЮЮЮdЭš…š5kвІM+œœœю™—ЛЉлcМL™2X,цЇ~ь§ђЫж­[ߘ1ЃŸКБПlйrЖmлЮŒг’vkж|ЯьйГxёХШ“'O†mч№№+Ьž§%У‡Hўќљ№№№рЪ•ЋdЪ”щV_Nл~щ‘Зi:N.œ9ТЅKЁ”/_Ц.HћѓЯƒфЯŸoooрцCvіэћ“*U*>ppky “%'OуффD` ЎЦR *ї9yђ№юЕkзhгК МЦх№Ы,ќf<šIЧ?ШЄa/!!сБЭјнЋЎ­– /ЋњЧ§є“ЩФйГ!Мєт dКЕ#ЭH}ьIязЎ]cё’% іГfNKћdЩŒХbybкФjНuАšљ}ŒmzхЪU>љd$љѓхуќљ ЬœѕбQQtыіі=3вИМ]OV‹…2ЅK==cяnлЉјјєп_<І~R­ZUцЮЯ…ѓчЩ‘#‡mљЎПRНz5Ќ Џж}%CЗѓ™гЇЩ–ЭЯжЊVЉќ_žгИ_zєmš>ВХb%44€ААpВљeM4Ž-X-џ}ЗеbЙ5ця?/џmG}РoЕмnc]yЊ@Tюoƒ‘N3H.ЎЮxxКус™›ц-šђо{ˆ‹Уйй‰_нЭќљпp§њuЊWЏJзЎ]prrтЧ7ГlйrТУУqssчѕз_ЃYГ&FЌЗўgƘщдЉ3яМг‡2З.Уxџ§дЏџ*Еk?oЗaњілХ|ћэbВeѓcЮœ/ˆ‰‰aіь/йБc'оооМѕV'jдHz иъеkXЖl11бдЎ§<НzѕРjЕВdЩ2жЏп€бш@гІiа >ГfЭцЗпіpуЦ |||шбЃ+*”рдЉ`&OžЪЙsч)XА€­Ю-V ‘‘‘|ўљ—ьйѓООYшбЃ+%JЧd21rф'œчвЅKфЬРŒSlљЋџZCњѕыЭ‹/О`ћž~ј‘хЫW~'''7nHЫ–Эm}"Й1>vьќ§sаЁC;оzыmњіэMЉR%9wю<}њМУ’% эюћ^Нz ‹-ХbБPЖliњѕыƒ››‹… В~§F\]]№№№ЄH‘Тe&?НлдЭЭ O/O‚ ЂnнWXЛv=Ћ…iгfІиџ–,YЦєщ3qttЄ}ћ6дЉѓђA*V,V _}5јјx[`ЛrхjОћn11БМўњktьио.//^bъдщ9ђ/>>>Œћ YГfMБo%ю'^^^д­[‡Пў:РбЃGЩ–-ƒ Ožм$$$0dШ0Ю;Oll,%K– _ОМlйВ•ЈЈ(ъеЋЫ›oомVЄДНOœFttљђхЃџwёїїЧbЕr№яПm§yЮœЯЩ–-лSбOrфШNО|yйЙk7 **Š№ц[АX-v—цІTiŸЗы;$ф111.DЯžн Lqп›ві=.>ސsЖі™0a,›6§hыпжD}HqпіиЦ~:ШсWЎрррˆŸ_VB/…’5‹Џн„вЁУGШš5 ЙrАћЗ=фЯ—__ў}ШvћLюР\јјмМ7<..Ž“ЇN‰““ХŠЦjБЧо}b6›ёЩœ™|љђ`4 ЛЬљ IHHРббl~~\ПATTЮЮЮ*˜777рц=НgCЮa2%рууCо<Й1 vi ќsd'gNлV)фмyBЮЧХй™вЅKrёв%.\Иˆйl!K_ђхЭЃ@T$Хйчt™‰ЗкfqcccйКuйВљсфш@Шй&MšТ€ўя‘;w Ѓ>УІ?PПўЋœ9s†B… ђЩ'# 9Тдi3psuхЕзънšёК9ѓTЙrEіялOщR%‰чФ‰“”.UъŽВXiйВ9­Z6Ч`0`ЕXјђЫ9\О|™ЉS&rіl“&OС?GђчЯgћдѕыз™;їk&NKіьйИq#ЋХТO?maѓц-|<ъ#ЂЂЂ6|$%K#Ož<;zœfMSЅjevюмХФ‰S˜7їKŒF##G~ТѓЯ?Чƒpєш1:|kFаТ_ќшЈhfޘЪюнП3~ќ$ўїхg˜L&іяџ“‰Цтыы‹ГГгcšVџИГмNуыљs№ђђТh4rсќЦŒOЯžн(ФМy_3mк 0аKЁDDD0cЦтШ–ЭяцtѕГфЗ^;zœЭ›RЕje–,]ЮŠЋ2x ™3gцг1уйИa7|jЗ‘‘‘Ќ[ЗžL™МqwscыЯлXЗv=C‡ Тйй™ &“Щл› ъѓљч_ђzƒзЈUЋ&—/‡пLчжпЪKnNR$ЪѓйГ!*T1Ÿvтєщ3Œўt,eJ—"(ЈPŠcМDёbќК{7V‹…ЋWЏЦПџЅd‰тќ{ф_Š)ŒУпSЅr%ЊUЋJB|Ѓ>ЭІM?а№ѕlмА‰элaФ№ЁИЙЙёП9_Ѕ_Н>Ю6MдЇ/] eыжmфєПѕ])їЌTЈ МЧ™3g˜8i Й)\8шПГ'ЗЮ pы щЯ?ocЭъя0р}rdЯ~sВ(QкfГ™#FRЁ|yњіщХ7Шты{зОuіl…ƒ‚xы­NьнЗŸ)SІгЏooњіщХЂEK˜7яk†}8SB‡aъ”‰ИЛЛ3~Т$:ЬШ†Щ№ЃЈYЃ: Иыіў№с#Lš4OO.\Фьй_2bјPАZ)^Ммќ‰†Їi_PГf vэкMЃ†Џ№ћя{ w`.[И}†<ЅњKыјМнf&ŒСЫг‹язЎcи‡1{і ,K’}янЖяV‹…мЙ™:eЂ­}6mњСжŸoя—Ќ чЮOqпіиŽгЉ/]ЛLж,ОјfЮЬйГ!DGEуццj{ПpPAМ<=1 ФЧ'PЁ\рП{G цЯ‡ГГ—УЏpъT0™МK№ябcdЪ”‰|yrc2™prtФjЕрфшHPЁ‚XБrђd0/^Т?Gvbbb№єp'00зЏпрT№iђхЭCО<Й9сТЭ}BСФЦЦqтф) фЯ‡››+ЧŽŸ$єR(йВљƒ‡‡;ЙsЫБ'ёіђФУУЌVrњч ЇџЭГњёёёœ={ŽbE уттŒЩdzъЏмH‰‘TЮˆ=ь?+№эЂ%Дnг–­кqрРп и‹ХТ/Пь \ЙВ”+W–ЌYГRЇЮKьлџчЭЯY­xzxтыуCЉR%iнЊ%›Зќ|sжЮzћо! •+WbїюпБX,>|„€€œdЪфmŸЋCЂšЩdтчŸЗёFЇјћч RЅ дЈQЭ›Зи}Юh4b49{і,ЎЎЎdЯž ‹ХТж­лx§ѕзШIЭё2+wIDATPP!Ъ–-УО§н*Џ•Ь™3уыуУkѕыёџіЮ<:ЎтЮїŸКїі*ЕКЅ^$y“-/0Цlƒ-‹Хи&УА„$L Щ„!@B€„Ьœ™w^2“эф„sоМ™ˆ М— 1Ы„ `cШbЏ`[6Т’мRkЕКЅюО5tЋе-йВМ[ђяу#Woїіэњ}kљU§ЊЎmлдззГukfDяЖПў+"‘0W\бВ“JЅXЗю-О№…л\wн’Щ${ыъrЃ”сp˜ввEEE'нFЂугGоЉŒЋ5kжОЩЌ‹gRЛА†ђђwп§%6n|—ЮЮNДж8NЪJK)/фŽщЛжОkЗГЯ5š’’ќ~?K_KOOгЇŸGEE9ѓч_ЮžНuЇФ&gZO?ѓ,Ÿ§ьчЙэі;йБc'їНяЂ”bеъ7ИщІ8яМiLš4‘Янњ^_•Б‰лэІООЅуЦ-ЩUЊп>э^\TŒпяgцЬ‹ИшЂ‹иОcчe|ЦŒ йЙsЩd’>иJUеЖmлŽmлlйђ3/š1ш7…BЁœЭЬП‚їзcл6oЎ[ЯM7оРДiS?~гІNtЃСІп}єяљє-Зђѕ{ОAQQїмѓЕœ †вџЬ™Q^aЮœЫЈYА€Еkзe#w\ў9VЏ~ƒ›nО‘ /8Ÿ`АŒЪŠŠ‚kйО}мyч‡CLž\жzHmѕэмыѓљИъЪZŠ‹‹;v сpˆE‹Ўfo^9(--%Q[[ƒлэfмИБLŸ~гІMeЯžНУЊяCС‘H˜oњKvюм•9П.дѓhгЩТšьмЙ‹ІІІLљxs=ЕЕ ѓъ†Ь еPљw<х ŽP^с+_О eќљЯ›лі­~hŸ|mцЗKCЕmgЬІйшЌ“љзглC{G'ў@ –УЄИИˆhKsю§\ј}vІиЦЮ‹wаЙЯЙ=. г ’JЇщMівйеE*•fь˜ N з­3ynN——ЫIYА”ЎC‡2яЁ1Lг4(+ `š&.—‡г",ЃЛ;Ž­mZb1ќ%>JJŠq8,BЁ2к::rч0Mг2)ісѓгйu(їнљџњтЂЛq”Ёp8Ї$ŸєwVЭˆОГq#Ээ]8KC,žсK8}#bZsу зГtщbž{юз4551БjкЖ‰67ГqуЛ|южлВеTWOЪ­Їаy#Џc*+ˆF›Г#‹§Ѓц3.8ŸЎC‡иН{яНї>Г.ž9јwфЄДЦZIЅRDТЁмkх‘0Лwя-8жыё№нGтWO=ЭГЯ§šЛП|ГgЯ"кмТВe+xђЩЇrreEyџКOнп іљ|tuvk‰ –ЁђFђћђМяzО§аw њЖXcВыeєYАжMєQЈ|і=ŽFЃD"смѓВвRLгфрСhоњ‘ўs(В›Ви§ 0yњщгR‘зKoo/щT У0(ђzIФуgTЇNЩuKЏЅЄЄ$ЗCЈЖmЂбf"сўМ-‡inŽЂm›oоџ ~Й|_Йћы|ц–›ИљІ ьsФYК< •ј|ъъЪjя№e|ь˜JŠ‹‹йЙc'›6mсsŸН…'~љ$Љd’M›6sнвoњОпџўU^|љwДЗЕa9ЬЙьRДmk‰ ѓlMnfoДЭŠ<ј­ћ™2e2П?wmлУж?@$ІnпОмLjnНdžЃбf"ЁаGє`”`0˜Ћ‡sЏЁ­:)**ІЛЛ;W.‰Ф :НяНx^-*ђwS}_RьуаЁC§k 9;жHžŠkЫИ№‚ѓYГцM–,^ФІM›љ›Џ~ЅАЮеCЗ—ГgЯ:ІђyИ:МВЂ<[_Ÿx§žпЖфЗKCЖmgЬІ']c,жŠлэТхpЂmMРяЇщ`”Б••y6Э[S™[+к-Щd’}зsшP7FvАиNлєєєfB™5ЛТfœСўsX†I:•Юꇂ5œ–йџžaЄmmkz{{ikярOяoюяz=G8‡•щЬ|/yыS e0yвDъ4pр@#уЧŽЁЄФwNњVУДvї0Ў4„ 5"vв+74Џ‡ввwмy;їнї oЎ[OMЭ|~?55ѓyрў{]‡Ю†lѕ]SSє ЅЅм{}ЃeЪP,YВˆUЋVГхƒ­мї{§г2IЅRЙзKќ>,ЫЂЁЉ)ЏпаиD0tьЌKfrёЌŸАjеќјЇ?cХ“јљєЭ7АhбеƒѓЏoд37zy=*#m&™Jbšfю}[kўb УрБŸџ”ŠŠђ‚s&‰Ьч8ѓ#\ЂB}фl˜g›`АŒ=Лїцž77ЗNЇ Ы8=ˆЏ‡ЖЖжўзњfzh)лФ‘Жгя•B&=ћŠ†‚ƒО#*ЃБЉ)їZCc#ЁP[лTT–ѓїї>ќ№#ўїїШфЩеŒ7.г‘Щ–ЙУ}WО†P§ГC•ёЫ.Э{zŸЭ[>р‹wмFUе^[Е[лLœTUpЭбh3ЫW<Х~є&VMрзПyžƒЃик&r Ё!їљkШF‹MЪЪJsыКŽGџ4 •Л|;J4l:тя№ќДДФib(m д‰RdvщэЋkД.˜ШЏ–QлжјJ†_пї•{[л˜fa=5кк€kЎЙŠпЎ|—ЫЩљчOЇ,XšЇL^•ЧZ>gГƒбfџIЉпѓЫtўуЁкЖ3т„žЂяŽХкшщщeѓ–­ЙќHЇm::;)..ъŸйЯЋћкЙОЅOБL“ /8”bЫ–mикЦВL’ЩdСgћЪyѕh єр:ЖЏьъ\ŸЬЦВ,?UЦ ю{ :G Вƒ"љч/і1§М)ДДФиSЗN?{nяr1–~ъSЄгiёД„Ё—S’Bхѕxјьgnцйч~M2™фŠ+цёЮ;яВ~§Ђбfъъібжж– iйГЗŽКК}ьоН‡чŸљѓ/Я†сЙЈЏ?@OOЖmГdёЕЌYЛŽt:MuѕЄA牄йДy MMMьмЙ €к… XБтiъы?сwўШ[oНMmmMСqёx‚;wЧ?a<Щd’оо$55ѓљэЪйКu;---lлОЃ Д0?дЌoЛі)S&уї—№јЫihhЄББ1—чJ).П|.Ы–џŠ}ћіFљhїž‚а} lsV„э`}Ю65 Ў`гцЭЌ]ЛŽXЖ|sц\ŠЧуЮ’цоДiМѓюйЖ-ЃЅюxМ?фp€–ђЭ5†ЃXџЎКВ–—^ўOЖoпСGЛї№›џXЩUWжbл6лЖmЇГГ‹@ BзеuˆЂ"/^Џ—uыоЪ–ЙІAЁЙ…eЕџљPe|охsyѕЕU„‚eИ]..Нєž}іџ3wюœAзžJeж<ЅS)zzzrk—ћ~Я /ОЬћяoЂЅ%F{{ћЈ Э=в{GгK,FKK kжМЩ[оІvс‚\(v]н>вщtнj.р…_цЯ›6F ТfmлfкД)И\.ž\ё4 дэлOGGЧкЌrсУЖ.,гѕAж™Јэc­яћЮ‡иП?{іьeяо::;ЛF•N2K)цаккЦѓП}‘Eз\5(l8љw,хГя7ПћюгддФЪ•/бееХŒž”њ=_;љэвPmлhБi<ž ;ЇККŠЉSЋ™:ЕšiS'уѕzhmЭќVЇУA[{;===twЧQЪР4 b­m$ ‰žЬl2št:ѕcl[уёИ1 Х'Ÿ4H$шюŽ“L&ћrхPуч§ЕЌkл””јhoя жк–ЛЖоофсЯ‘w~‡гAgW‰D]]‡HЅRЙдхraл6щtšІІ(бh3Жm<>SЖ?-3Ђ‡@ ž–0єЈи)Эа†1,КцjVЎ|‰ 6RГ`>їпw/O?ѓ,бh3ЅЅИя^|Х>аабоС?§ѓ9tЈ›+krУѕЖ55ѓчГaУFжЎYЧЂEW№ћ™qсLœXuипpUm-zя}Ољ­GˆDТќј‡?рЮ;ОШВх+xј‘ясѓљјлЏIU…ЧЧZb<іѓџCЌЕПП„Люќ"^‡kЏЙšŽі~іГЧшŽЧЉ(/чпџ_ЙјЗзZc(ƒя~ч!~Йl?ђ( ˜\= ЇУЖ5_§Ъ—YўфЏxє{џ€a(f_r мoоЖцg~KpбGсё‡ГM$сСoоЯђ'Ÿ"жкЪьйГј›ЏољLnS•ўs\vщlЖnнЦO~њszzz(--% ѕŸЛoѓї]Jч…qъQ­‡|jЬЇЙЙ…џфgЄг6з-]ЬuKЃmЭSO?Ыž={qЛ]Ь›;—Kf]ŒBqЧoуЉЇўT:ХчџъV–.ЙЖрЫ ЖљЯЫгЁЪјгЇуrɘ3ч2Д­™;ч2VЌxš… цКюH8ТgnЙ™њчŸаееEqq1K—\‹Ж5 kаббСуO,ЫмoАЄ$Гйж(ГiжЄ‡=їPњŸ<Йšп>џЯ<ѓххЬ/~ё|ѓaŠ‹‹yфс‡дж dІF2ЯSфл„ъмэh†_пч—ћъI“X0>џ№пЧуqѓ№ЗПХфЩеЃJ'ЫС•Е5МѕжлЬЭ–ЏB Р1•ЯОчЋWџeЫV љЮУтvЙrГг'RПчз)лЅ#ЖmgЌьŸ\ЧЅ­­"ЏЏЛp9`А4@CуA*+"DТ!>Ў?@kk;%%>Ц­ЄВи”Y8ЉTŠНuuмzћМџЮёвF)ЉTŠ=uu\у|МoЯYs]Я<ѓНЩ$_ўвCtn4нё8Ÿ|r€Чћ~єУяŸГёї'ТјЊ)ќюЅЈž8БрЖЂбУHбƒ 6D'ЧJ"‘рЎ/}'џПј|ОsдІ{Йfё>оЗW Р(cBе$VПўе' В=РЅWд№џž^СЄУhc ІiŒ”ГЪ<Ÿ ^Kс5РЃРmЫPИL…i€ЫЫPX˜ L#{ћ–оо^ъ{(M‹N]}!ˆMбЩ1џfЗ{TkpИ6mыhХхvг“ GF>‡–XlHлŸVGєѕW_Х<ЪДЋpЎ:ЁE^я§ёдд.ЄГ­…Dќф50вб8{qyМј!жЎ]C‘зsимNЕ>F:ЃIпgƒЄО› Ђсєйдыѕђчї71яђЫщl‘HHћ>ђ <јќel|{^ЏїЌиЅзŠT”Ck'–У!UD~_ uѕГъЕз™yё,ЪB™{<)2 Б%})@KЌ™пџз+(­)7ўˆ •шCє z™ЉиTR)ћRіfгЖі§Ќ§У.œqe‘ЬНl•­$‰i,уoЌЦ4 *#хg‡#:oо<žћЭJЪ'yёО„ТбЏ‡Б•445ёЦыЏвйе%™rр+.& SYQлы}ˆDbSБЉшDtrйдуѕ0Жb MЌ_ћІиt”и>SY^Ч{vьd­_Зžžо^ЦŒ ШЎxB!†RјJ|ИœBeeЙmЫ…Q>сvS\фХщvcфнZє!z=ˆMб‰шфмБЉгщ X›Ž"лЛŽbћгъˆFЃQЎ]|-‡вb$с№•‘луСхvчю]&Œn”RЈaVRЂбƒшAl*ˆND'ЃгІЗиєœГ§isD?}Ы-tЇ4т„ #PР‚шC=bSAt"ˆM…‘‡!Y ‚ ‚ ‚ 3'0[.ŽЈ ‚ ‚ ‚pZGTAAAŽЈa˜ДЖЕRфѓI. ‚ ‚ ‚ Œ`JЂЭQ У<{QУ0№yиАюMЊЊЇP\тЫ ‚ ‚ ‚ Œ@|~?уЊЊy{§zМE удЮZЧыˆњ}%ьћјc^~щEцЬЛ‚ЉуЋаZЃ”’TRI%•TRI%•TRI%•tЄ-ЭЭМјТJRН ЊЦ?=Žш/ўэ_ VŽcђE— ЫmцЦGn‡1•465ёђЪџ ГЋK†AAAFкŒhq1Ё`ˆ1•И=žaЃћvЭЕўтњы‰Жuq0EG\ з5”ТWтУхr –‘H$Ф‚‚ ‚ ‚ # ЗлMq‘ЇЫ1мћЦjаЖ}ќŽш„ U„ЦhЦІ4щФЧtАЁnЗ—Ы>oXAAA83(ЅPУu@ѓ$‰ШŒЈ ‚ ‚ ‚0,NhзмЏпѓЗtЇ4iАї"sЂ‚ ‚ ‚ ТPhРNŸЌ]sЕ–ЭŠAAA„ЃxЂ:у?ž G4б[QAAAA8"ё№ 0 …Ѕ цHn ‚ ‚ ‚ G%ц`ЉŒ?i*ы`*TvЦSК`љЇR*ѓОЁ5&‡‚ЦРк\AЩQAAAсˆДzТ4ІрP`Ђ1ДЮ9ЃŠОџ2NЉTіЙжЧдp˜ ‡Ёpš —‚}‘™4ЇзtIю ‚ ‚ ‚ 9zMEуйšK3ыO:L…C)LР †RЊп эsH`Y€А•SaІ5Бв) L‘\A„QB*•:ъg,ЫЂЛЛћ˜ЯэѕzшьhЧсpАmћ|>nЗЗлeY˜І‰iš™ЌРгЁѕš #‹W^yЅрЙЧуAkM"‘єYЗлRŠx<^№њМЫ.ХщvѓсGЛЅ:ХX МY'дЉ4р0Р4†‘йŒЈЯUшЌCЊ2ŽЈЫЉШ|ЪЮxЋ&рDaлВ{Ў ‚ Œ’Уhз&РБoХя33iZЇp*яТrY8-…л6qh0ЕЦ e ”Т0ŒьЙЮvтtA%ПƒWиЧгƒ:}т‡ Т(ЈЃкcžѕйУПюЖ“ИЕ%uаiР0TfyЇnœ ,,РЬЎ0”Ю:Ѓ ай@]Аœ`gœQ А4и lCjuAA-єуžуNK‘4Ž} кkeњ qeуRzу)–mсФ…K)†Ц0l”20 э№ѕwђњ:€ƒg&№ќh@щУТˆЋЃКкOјNRИ”-uащpDCgf@-2NЈгШLj:LА …ЉВ)§сИ9gАйЉSЫ†Є –™ёKe>TAFІ:zЫю2 ћ˜ЯэЭо ЎKЇq+?„™,ТL:pЄ“И,K+кРаІЁPи™™ 4J:љТќйˆў™‹ўрсТфФо‚0вHvžG4ФЅгR2AЕ™5Ё#3j’uF …Ё2yefCsћfHћRА\&$г  0ШLYkРЖЅ@‚ Тшщ4нu+шжЧо№d;].Ц­mHФ1z{АR.щNлТЁ кЦDaшLаШ^S_ЊђџњBхшŸ["wјŸ8Ђ‚0ђHuužG4…KЇЅ: dnб’й-з4ВыCЭŒкч|:TпбЬŸЧџржЭlvѕ`хIENDЎB`‚classified-ads-0.13/doc/calendar.tcl000066400000000000000000002141041331670245300173400ustar00rootroot00000000000000# -*-TCL-*- -*-coding: utf-8-unix;-*- # Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. # # This file is part of Classified Ads. # # Classified Ads is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # Classified Ads 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Classified Ads; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # This file implements gregorian calendar with shared calendar events. # # # Workflows in operations: # - Operation when starting up: # -- Init UI # -- Load local settings # -- Set day to display (current time, in practice) # -- Fetch events of selected day. As Db records in db contain events so # that from each operator there is one months records in single record # the search is done by month and all events found for month are # appended into global array "::allEvents" # -- Events from "::allEvents" that occur on selected day, are drawn into # canvas for user to ogle # -- Fetch event comments from storage like what is done to events. # Comments are stored in a dictionary containing list of dictionaries, # key to first dictionary is the event that is commented, inside # is a list of comments, each being a dictionary. In storage # (local and published records) comments are saved in similar # structure. # # - Operations when user selects another day to be shown or changes # event collection to display # -- Fetch events of selected day. The database implementation of # classified ads will not re-send db record queries to remote # nodes if query criteria remains the same, so re-doing same # query multiple times is only small waste of resources. # Anyway, by checking whether month changed and querying the actual # database only when month changes will speed up operations # -- Events from "::allEvents" that occur on selected day, are drawn into # canvas for user to ogle # # - Operations when user posts a new event # -- Event is appended into "::allEvents". # -- Local database (the application specific non-shared db) is # updated to contain the event (and retain events of other operator # profiles that may be stored in same database record) # -- Depending on publicity setting of the event (public, by profile setting) # a shared database record is created/updated to contain the new event # and that record is published to network # # - Operations when user deletes an event # -- Same as "post" put event is removed from storages and records. Publish # needs to occur if deleted event as public or by profile settings publicity. # # - Operations when new database record is received into system # -- This record may or may not contain records from collection in display, # it may or may not contain events that belong to our selected month/day. # If there is events for selected collection it is easiest to prune all # events from "::allEvents" that originate from newly-received record, # then do a re-display of selected day. # # procedure for initializing global variables proc initGlobals {} { # Month on display, global variable set ::monthOnDisplay [ clock seconds ] # Selected day on display, global variable: set ::dayOnDisplay $::monthOnDisplay set ::leftMarginInPixels 100 # This is used in canvas resize event to not try updating until # initialization is wholly done set ::initReady false # Timer for delaying re-draw events when user keeps on scaling the window set ::resizeEventTimer -1 # Global list for events in calendar set ::allEvents [ list ] # Global list of events to store locally set ::allLocalEvents [ list ] # Global dictionary for db records whose events are in ::allEvents. # Key in dict is the record id, value is publish time. Idea is that # if we fetch same record again and the publish time is same # as previously then content has not changed and there is no need # to process it at all. set ::allDbRecords [ dict create ] # Program settings is a dictionary set ::settings [ dict create ] # What is the intended audience to new events: set ::postPublicity public # What is the default collection for events set ::collectionInUse "GlobalEventCollection" # Dictionary for comments, key is the commented event, # inside is a list of comments set ::allComments [ dict create ] # in similar manner as there is ::allEvents and ::allLocalEvents, # lets have also set ::allLocalComments [ dict create ] } # # Init procedure for user interface widgets. Contains several sub-procedures # that are called by this proc. # proc initUI {} { # figure out initial size for widgets, something smaller than screen size set ::initialWidth [ expr int ( [ winfo screenwidth . ] * 0.90 ) ] set ::initialHeight [ expr int ( [ winfo screenheight . ] * 0.85 ) ] # frame for display day-selection calendar frame .s -borderwidth 2 -relief ridge -width $::initialWidth -height $::initialHeight grid .s -row 0 -column 0 -sticky news # frame for buttons on top frame .rightframe grid .rightframe -row 0 -column 1 -sticky news # configure grid for expanding: grid rowconfigure . 0 -weight 1 grid columnconfigure . .rightframe -weight 1 frame .rightframe.buttons -borderwidth 2 -relief ridge button .rightframe.buttons.dayview -text {Calendar view} -command showDayView button .rightframe.buttons.settings -text {Settings} -command showSettings button .rightframe.buttons.newEvent -text {Create event} -command showCreateEvent pack .rightframe.buttons -side top pack .rightframe.buttons.settings -padx 5 -side right pack .rightframe.buttons.dayview -padx 5 -side right pack .rightframe.buttons.newEvent -padx 5 -side right frame .rightframe.dayframe -borderwidth 2 -relief ridge set dayFrameWidth [ expr int($::initialWidth * 0.75) ] set dayFrameHeight [ expr int($::initialHeight * 0.90) ] canvas .rightframe.dayframe.daycanvas -relief ridge -borderwidth 2 -height $dayFrameHeight -width $dayFrameWidth -scrollregion " 0 0 $dayFrameWidth 1000 " # ask for resize events: bind .rightframe.dayframe.daycanvas { daycanvasResizeEvent %w %h } scrollbar .rightframe.dayframe.hscroll -command scrollDayview .rightframe.dayframe.hscroll set 0 0.3333 # set up things visible in settings frame frame .rightframe.settingsframe label .rightframe.settingsframe.collectionText -text {Name of event collection in use: } entry .rightframe.settingsframe.collectionEntry button .rightframe.settingsframe.changeCollectionBtn -text Change -command changeCollectionCallback pack .rightframe.settingsframe.changeCollectionBtn -side right -anchor sw pack .rightframe.settingsframe.collectionEntry -side right -anchor sw pack .rightframe.settingsframe.collectionText -side right -expand y -fill x -anchor sw .rightframe.settingsframe.collectionEntry insert 0 $::collectionInUse # UI frame for writing and posting a new event frame .rightframe.newEventFrame constructNewEventView .rightframe.newEventFrame } # # Procedure called when "new event" is selected ; initializes start+end time # labels. See also displayNewEventDates. # proc initializeNewEventDates {} { set currentLabelText [ lindex [ .rightframe.newEventFrame.timeFrame.startDayLabel configure -text ] 4 ] if { $currentLabelText == {} } { set month [ clock format $::dayOnDisplay -format {%N} ] set year [ clock format $::dayOnDisplay -format {%Y} ] set day [ clock format $::dayOnDisplay -format {%d} ] set hour [ clock format [ clock seconds ] -format {%H} ] set min 00 # remove possible leading zeroes: regsub {^[0]} $month {\1} month regsub {^[0]} $day {\1} day regsub {^[0]} $hour {\1} hour regsub {^[0]} $min {\1} min set ::newEventStart [ clock scan [ format "%04d %02d %02d %02d %02d 00" $year $month $day $hour $min] -format {%Y %m %d %H %M %M} -gmt false ] # push start time to next hour set ::newEventStart [ clock add $::newEventStart 1 hour ] # and end time one hour after that: set ::newEventEnd [ clock add $::newEventStart 1 hour ] displayNewEventDates } } # # displays $::newEventStart on labels # proc displayNewEventDates {} { .rightframe.newEventFrame.timeFrame.startDayLabel configure -text [ clock format $::newEventStart -format {%d} ] .rightframe.newEventFrame.timeFrame.startMonthLabel configure -text [ clock format $::newEventStart -format {%B} -locale system ] .rightframe.newEventFrame.timeFrame.startYearLabel configure -text [ clock format $::newEventStart -format {%Y} ] .rightframe.newEventFrame.timeFrame.startHourLabel configure -text [ clock format $::newEventStart -format {%H} -locale system ] .rightframe.newEventFrame.timeFrame.startMinuteLabel configure -text [ clock format $::newEventStart -format {%M} ] .rightframe.newEventFrame.timeFrame.endDayLabel configure -text [ clock format $::newEventEnd -format {%d} ] .rightframe.newEventFrame.timeFrame.endMonthLabel configure -text [ clock format $::newEventEnd -format {%B} -locale system ] .rightframe.newEventFrame.timeFrame.endYearLabel configure -text [ clock format $::newEventEnd -format {%Y} ] .rightframe.newEventFrame.timeFrame.endHourLabel configure -text [ clock format $::newEventEnd -format {%H} -locale system ] .rightframe.newEventFrame.timeFrame.endMinuteLabel configure -text [ clock format $::newEventEnd -format {%M} ] } # # button callback called from plus/minus buttons at event date selection # proc modifyEventTime { startOrEnd modification } { if { $startOrEnd == "start" } { set dateToModify $::newEventStart } else { set dateToModify $::newEventEnd } switch $modification { +d { set dateToModify [ clock add $dateToModify 1 day ] } +mo { set dateToModify [ clock add $dateToModify 1 month ] } +y { set dateToModify [ clock add $dateToModify 1 year ] } +h { set dateToModify [ clock add $dateToModify 1 hour ] } +mi { set dateToModify [ clock add $dateToModify 1 minute ] } -d { set dateToModify [ clock add $dateToModify -1 day ] } -mo { set dateToModify [ clock add $dateToModify -1 month ] } -y { set dateToModify [ clock add $dateToModify -1 year ] } -h { set dateToModify [ clock add $dateToModify -1 hour ] } -mi { set dateToModify [ clock add $dateToModify -1 minute ] } } if { $startOrEnd == "start" } { set ::newEventStart $dateToModify } else { set ::newEventEnd $dateToModify } displayNewEventDates } proc showDayView {} { pack forget .rightframe.settingsframe pack forget .rightframe.newEventFrame pack .rightframe.dayframe.hscroll -side right -fill y pack .rightframe.dayframe.daycanvas -fill both -expand yes pack .rightframe.dayframe -side bottom -expand yes -fill both } proc showSettings {} { pack forget .rightframe.dayframe pack forget .rightframe.newEventFrame pack .rightframe.settingsframe -side top } proc showCreateEvent {} { pack forget .rightframe.dayframe pack forget .rightframe.settingsframe pack .rightframe.newEventFrame -side bottom -fill both -expand yes initializeNewEventDates } # # basic structure: fields on top of each others # first is start time, then end time, then title + desc # followed by possible attendees and publish options # times are constructed as grids with fields for date-values # and +- -buttons # proc constructNewEventView { baseWidget } { # buttons for start time frame $baseWidget.timeFrame pack $baseWidget.timeFrame -fill both -expand y button $baseWidget.timeFrame.startDayPlusBtn -text "+" -command {modifyEventTime start +d} -repeatdelay 500 -repeatinterval 150 button $baseWidget.timeFrame.startMonthPlusBtn -text "+" -command {modifyEventTime start +mo} -repeatdelay 500 -repeatinterval 150 button $baseWidget.timeFrame.startYearPlusBtn -text "+" -command {modifyEventTime start +y} -repeatdelay 500 -repeatinterval 150 button $baseWidget.timeFrame.startHourPlusBtn -text "+" -command {modifyEventTime start +h} -repeatdelay 500 -repeatinterval 150 button $baseWidget.timeFrame.startMinutePlusBtn -text "+" -command {modifyEventTime start +mi} -repeatdelay 500 -repeatinterval 150 grid $baseWidget.timeFrame.startDayPlusBtn -row 0 -column 1 grid $baseWidget.timeFrame.startMonthPlusBtn -row 0 -column 2 grid $baseWidget.timeFrame.startYearPlusBtn -row 0 -column 3 grid $baseWidget.timeFrame.startHourPlusBtn -row 0 -column 4 grid $baseWidget.timeFrame.startMinutePlusBtn -row 0 -column 6 label $baseWidget.timeFrame.startTimeLabel -text "Event start: " label $baseWidget.timeFrame.startDayLabel label $baseWidget.timeFrame.startMonthLabel label $baseWidget.timeFrame.startYearLabel label $baseWidget.timeFrame.startHourLabel label $baseWidget.timeFrame.startTimeColonLabel -text ":" label $baseWidget.timeFrame.startMinuteLabel grid $baseWidget.timeFrame.startTimeLabel -row 1 -column 0 -sticky e grid $baseWidget.timeFrame.startDayLabel -row 1 -column 1 grid $baseWidget.timeFrame.startMonthLabel -row 1 -column 2 grid $baseWidget.timeFrame.startYearLabel -row 1 -column 3 grid $baseWidget.timeFrame.startHourLabel -row 1 -column 4 grid $baseWidget.timeFrame.startTimeColonLabel -row 1 -column 5 grid $baseWidget.timeFrame.startMinuteLabel -row 1 -column 6 button $baseWidget.timeFrame.startDayMinusBtn -text "-" -command {modifyEventTime start -d} -repeatdelay 500 -repeatinterval 150 button $baseWidget.timeFrame.startMonthMinusBtn -text "-" -command {modifyEventTime start -mo} -repeatdelay 500 -repeatinterval 150 button $baseWidget.timeFrame.startYearMinusBtn -text "-" -command {modifyEventTime start -y} -repeatdelay 500 -repeatinterval 150 button $baseWidget.timeFrame.startHourMinusBtn -text "-" -command {modifyEventTime start -h} -repeatdelay 500 -repeatinterval 150 button $baseWidget.timeFrame.startMinuteMinusBtn -text "-" -command {modifyEventTime start -mi} -repeatdelay 500 -repeatinterval 150 grid $baseWidget.timeFrame.startDayMinusBtn -row 2 -column 1 grid $baseWidget.timeFrame.startMonthMinusBtn -row 2 -column 2 grid $baseWidget.timeFrame.startYearMinusBtn -row 2 -column 3 grid $baseWidget.timeFrame.startHourMinusBtn -row 2 -column 4 grid $baseWidget.timeFrame.startMinuteMinusBtn -row 2 -column 6 #end time selector: button $baseWidget.timeFrame.endDayPlusBtn -text "+" -command {modifyEventTime end +d} -repeatdelay 500 -repeatinterval 150 button $baseWidget.timeFrame.endMonthPlusBtn -text "+" -command {modifyEventTime end +mo} -repeatdelay 500 -repeatinterval 150 button $baseWidget.timeFrame.endYearPlusBtn -text "+" -command {modifyEventTime end +y} -repeatdelay 500 -repeatinterval 150 button $baseWidget.timeFrame.endHourPlusBtn -text "+" -command {modifyEventTime end +h} -repeatdelay 500 -repeatinterval 150 button $baseWidget.timeFrame.endMinutePlusBtn -text "+" -command {modifyEventTime end +mi} -repeatdelay 500 -repeatinterval 150 grid $baseWidget.timeFrame.endDayPlusBtn -row 3 -column 1 grid $baseWidget.timeFrame.endMonthPlusBtn -row 3 -column 2 grid $baseWidget.timeFrame.endYearPlusBtn -row 3 -column 3 grid $baseWidget.timeFrame.endHourPlusBtn -row 3 -column 4 grid $baseWidget.timeFrame.endMinutePlusBtn -row 3 -column 6 label $baseWidget.timeFrame.endTimeLabel -text "Event end: " label $baseWidget.timeFrame.endDayLabel label $baseWidget.timeFrame.endMonthLabel label $baseWidget.timeFrame.endYearLabel label $baseWidget.timeFrame.endHourLabel label $baseWidget.timeFrame.endTimeColonLabel -text ":" label $baseWidget.timeFrame.endMinuteLabel grid $baseWidget.timeFrame.endTimeLabel -row 4 -column 0 -sticky e grid $baseWidget.timeFrame.endDayLabel -row 4 -column 1 grid $baseWidget.timeFrame.endMonthLabel -row 4 -column 2 grid $baseWidget.timeFrame.endYearLabel -row 4 -column 3 grid $baseWidget.timeFrame.endHourLabel -row 4 -column 4 grid $baseWidget.timeFrame.endTimeColonLabel -row 4 -column 5 grid $baseWidget.timeFrame.endMinuteLabel -row 4 -column 6 button $baseWidget.timeFrame.endDayMinusBtn -text "-" -command {modifyEventTime end -d} -repeatdelay 500 -repeatinterval 150 button $baseWidget.timeFrame.endMonthMinusBtn -text "-" -command {modifyEventTime end -mo} -repeatdelay 500 -repeatinterval 150 button $baseWidget.timeFrame.endYearMinusBtn -text "-" -command {modifyEventTime end -y} -repeatdelay 500 -repeatinterval 150 button $baseWidget.timeFrame.endHourMinusBtn -text "-" -command {modifyEventTime end -h} -repeatdelay 500 -repeatinterval 150 button $baseWidget.timeFrame.endMinuteMinusBtn -text "-" -command {modifyEventTime end -mi} -repeatdelay 500 -repeatinterval 150 grid $baseWidget.timeFrame.endDayMinusBtn -row 5 -column 1 grid $baseWidget.timeFrame.endMonthMinusBtn -row 5 -column 2 grid $baseWidget.timeFrame.endYearMinusBtn -row 5 -column 3 grid $baseWidget.timeFrame.endHourMinusBtn -row 5 -column 4 grid $baseWidget.timeFrame.endMinuteMinusBtn -row 5 -column 6 frame $baseWidget.titleFrame pack $baseWidget.titleFrame -fill x -expand yes label $baseWidget.titleFrame.titleLabel -text {Event title: } entry $baseWidget.titleFrame.titleEntry pack $baseWidget.titleFrame.titleEntry -side right -expand y -fill x pack $baseWidget.titleFrame.titleLabel -side right frame $baseWidget.descFrame pack $baseWidget.descFrame -fill both -expand yes label $baseWidget.descFrame.descLabel -text {Event description: } text $baseWidget.descFrame.descText pack $baseWidget.descFrame.descText -side right -fill both -expand yes pack $baseWidget.descFrame.descLabel -side right -anchor n frame $baseWidget.postOptionsFrame pack $baseWidget.postOptionsFrame -fill x -expand yes label $baseWidget.postOptionsFrame.publicityLabel -text "Intended audience of the event: " radiobutton $baseWidget.postOptionsFrame.publicPost -value public -text "Public to all users having same event collection" -variable ::postPublicity radiobutton $baseWidget.postOptionsFrame.accordingToProfile -value byprofile -text "Follows your profile privacy setting" -variable ::postPublicity radiobutton $baseWidget.postOptionsFrame.privatePost -value private -text "Private to local calendar only" -variable ::postPublicity pack $baseWidget.postOptionsFrame.publicityLabel -anchor w pack $baseWidget.postOptionsFrame.publicPost -anchor w pack $baseWidget.postOptionsFrame.accordingToProfile -anchor w pack $baseWidget.postOptionsFrame.privatePost -anchor w frame $baseWidget.buttonFrame pack $baseWidget.buttonFrame -fill x -expand yes button $baseWidget.buttonFrame.okButton -text {Post event} -command postNewEventCmd button $baseWidget.buttonFrame.cancelButton -text {Cancel} -command cancelNewEventCmd pack $baseWidget.buttonFrame.cancelButton -side right pack $baseWidget.buttonFrame.okButton -side right label $baseWidget.buttonFrame.errorLabel pack $baseWidget.buttonFrame.errorLabel -side right } # # called when user changes size of tk window ; we must scale some of the # widgets too and most notably re-draw the actual events-view # proc daycanvasResizeEvent { newWidth newHeight } { puts [ format "resize canvas %d %d" $newWidth $newHeight ] # update scrollbar: set nowat [.rightframe.dayframe.daycanvas yview] eval ".rightframe.dayframe.hscroll set $nowat" .rightframe.dayframe.daycanvas configure -scrollregion " 0 0 $newWidth 1000 " # if init is already done: if { $::initReady != false } { # dont't draw straight away, because usually we get multiple # events in succession and drawing is heavy operation: instead # set up 200ms timer and if it expires (meaning no resize event # seen in 200ms) then do the redraw in there, in procedure # redrawAfterResizeEvent if { $::resizeEventTimer != -1 } { after cancel $::resizeEventTimer } set ::resizeEventTimer [ after 200 redrawAfterResizeEvent ] } } # # procedure called in async via $::resizeEventTimer # proc redrawAfterResizeEvent { } { displayDay [ clock format $::dayOnDisplay -format "%d" ] set ::resizeEventTimer -1 } proc scrollDayview {args} { eval ".rightframe.dayframe.daycanvas yview $args" set nowat [.rightframe.dayframe.daycanvas yview] eval ".rightframe.dayframe.hscroll set $nowat" } # # procedure that updates buttons in selection calendar. # in practice it shows selected button as "lowered" and # the rest as "raised" # # selectedDay is date whose button is pressed # proc updateSelectionButtonsState { selectedDay } { set currentDayNum [ clock format $selectedDay -format "%d" ] foreach btn [ winfo children .s.selectionFrame ] { if { [ string first .s.selectionFrame.button $btn ] != -1 } { # yes is button a button, check if it is button for to-day: if { [ lindex [ $btn configure -text ] 4 ] == $currentDayNum } { # yes, is for to-day $btn configure -relief sunken -bg green } else { $btn configure -relief raised -bg lightgray } } } } proc displaySelectionCalendar {starttime} { frame .s.selectionFrame set month [ clock format $starttime -format {%N} ] set day [ string trim [ clock format $starttime -format {%e} ] ] set monthFirstDay [ expr $starttime - [ expr ( $day -1 ) * 24 * 60 * 60 ] ] set row 0 set weekCounter 0 button .s.selectionFrame.minusYear -text {<<} -command {updateSelection [ clock add $::monthOnDisplay -1 year ]} button .s.selectionFrame.plusYear -text {>>} -command {updateSelection [ clock add $::monthOnDisplay 1 year ]} button .s.selectionFrame.minusMonth -text {<} -command {updateSelection [ clock add $monthOnDisplay -1 month ]} button .s.selectionFrame.plusMonth -text {>} -command {updateSelection [ clock add $monthOnDisplay 1 month ]} grid .s.selectionFrame.minusMonth -row 0 -column 1 grid .s.selectionFrame.minusYear -row 0 -column 0 grid .s.selectionFrame.plusYear -row 0 -column 5 grid .s.selectionFrame.plusMonth -row 0 -column 4 label .s.selectionFrame.yearNumber -text [ clock format $starttime -format {%Y} ] grid .s.selectionFrame.yearNumber -row 0 -column 3 label .s.selectionFrame.monthName -text [ clock format $starttime -format {%b} -locale system] grid .s.selectionFrame.monthName -row 0 -column 2 incr row for {set currentDay $monthFirstDay} {$weekCounter < 7} {set currentDay [ expr $currentDay + ( 24 * 60 * 60 ) ]} { incr weekCounter set labelDayOfWeek [ expr [ clock format $currentDay -format {%u} ] - 1 ] label .s.selectionFrame.l$labelDayOfWeek -text [ clock format $currentDay -format {%a} -locale system] grid .s.selectionFrame.l$labelDayOfWeek -row $row -column $labelDayOfWeek } incr row for {set currentDay $monthFirstDay} {[clock format $currentDay -format {%N} ] == $month } {set currentDay [ expr $currentDay + ( 24 * 60 * 60 ) ]} { set buttonDayNumber [ string trim [ clock format $currentDay -format {%e} ] ] button .s.selectionFrame.button$buttonDayNumber -text [ format {%02d} $buttonDayNumber ] -command "displayDay $buttonDayNumber" set buttonDayOfWeek [ expr [ clock format $currentDay -format {%u} ] - 1 ] grid .s.selectionFrame.button$buttonDayNumber -row $row -column $buttonDayOfWeek if { $buttonDayOfWeek == 6 } { incr row } } pack .s.selectionFrame } # # This procedure is called when user selects another month/year from # selection calendar. This causes re-draw of the calendar under # month/year buttons # proc updateSelection { newtime } { destroy .s.selectionFrame displaySelectionCalendar $newtime set ::monthOnDisplay $newtime # fetch events of newly-selected month eventsByTimeAndCollection $::monthOnDisplay # and update calendar view: displayDay [ clock format $newtime -format {%d} ] } # # procedure that is called when user selects a day from selection # calendar ; will force selected day on display and update its # events # proc displayDay { dayNumber } { puts [ format "display day %s" $dayNumber ] # figure out start and end time of the day set month [ clock format $::monthOnDisplay -format {%N} ] set year [ clock format $::monthOnDisplay -format {%Y} ] # remove possible leading zeroes: regsub {^[0]} $month {\1} month regsub {^[0]} $dayNumber {\1} dayNumber set start [ clock scan [ format "%04d %02d %02d 00 00 00" $year $month $dayNumber ] -format {%Y %m %d %H %M %S} -gmt false ] set end [clock scan [ format "%04d %02d %02d 23 59 59" $year $month $dayNumber ] -format {%Y %m %d %H %M %S} -gmt false ] puts [ clock format $start ] puts [ clock format $end ] updateSingleDayCanvas .rightframe.dayframe.daycanvas $start $end updateSelectionButtonsState $start set ::dayOnDisplay $start } # # procedure for drawing single event into canvas, this is called from # proc packevents below when it is known which event collide with # each others # # c is canvas # ev is the event # startOfDay is [ clock seconds ] from midnight when day started # proc drawSingleEvent { c ev startOfDay } { set secondsFromStartToPrevMidnight [ expr [ dict get $ev startTime ]-$startOfDay ] set startPos [ expr 25.0 + ( ( $secondsFromStartToPrevMidnight / ( 60.0 * 60.0 ) ) * $::heightForSingleHour ) ] set secondsFromEndToPrevMidnight [ expr [ dict get $ev endTime ]-$startOfDay ] set endPos [ expr 25.0 + ( ( $secondsFromEndToPrevMidnight / ( 60.0 * 60.0 ) ) * $::heightForSingleHour ) ] set scSizeOption [ $c configure -scrollregion ] set regSize [ lindex $scSizeOption 4 ] set width [ expr [ lindex $regSize 2 ] - $::leftMarginInPixels ] if { $width > 6 } { set left [ expr {$::leftMarginInPixels + int ( $width * [ dict get $ev left ] )} ] set right [ expr {$::leftMarginInPixels + int ( $width * [ dict get $ev right ] )} ] set eventRectangle [ $c create rectangle $left $startPos $right $endPos -fill green ] set eventTitleText [ $c create text [ expr $left + 5 ] [ expr $startPos + 5 ] -width [ expr ( $right - $left ) -5 ] -fill white -text [ dict get $ev title ] -anchor nw ] $c bind $eventRectangle "displaySingleEvent [ dict get $ev identifier ]" $c bind $eventTitleText "displaySingleEvent [ dict get $ev identifier ]" } } # procedure for drawing times+events into single canvas that # re-presents single day # proc updateSingleDayCanvas {c start end} { #figure out canvas scroll-region size set scSizeOption [ $c configure -scrollregion ] set regSize [ lindex $scSizeOption 4 ] set width [ lindex $regSize 2 ] set height [ lindex $regSize 3 ] puts [ format "scroll area w %d h %d" $width $height ] # this same variable is used also event drawing procedure # assumption is that all day-specific canvases have same # $height set ::heightForSingleHour [ expr ( $height - 30.0 ) / 24.0 ] # clear canvas $c delete "all" # print day number on top $c create text [ expr $width / 2 ] 15 -text [ clock format $start -format "%A %d" -locale system] # figure out dimensions set hourCounter 0 while { $hourCounter < 24 } { set month [ clock format $start -format {%N} ] set year [ clock format $start -format {%Y} ] set dayNumber [ clock format $start -format {%d} ] set currentHour [clock scan [ format "%s %s %s %s 00 00" $year $month $dayNumber $hourCounter ] -format {%Y %m %d %H %M %S} -gmt false ] set textPos [ expr 25 + ( $hourCounter * $::heightForSingleHour ) ] $c create text 35 $textPos -text [ clock format $currentHour -format "%X" -locale system] $c create line $::leftMarginInPixels $textPos $width $textPos incr hourCounter } # http://stackoverflow.com/questions/11311410/visualization-of-calendar-events-algorithm-to-layout-events-with-maximum-width set eventsOfDay [ lsort -increasing -command startComparator [ eventsBetween $start $end ] ] set columns [ list ] set lastEndTime -1 foreach ev $eventsOfDay { if { [ dict get $ev startTime ] >= $lastEndTime && $lastEndTime != -1 } { packevents $c $columns $start set columns [ list ] set lastEndTime -1 } set placed false set colCounter 0 for { set colCount [ llength $columns ] } { $colCounter < $colCount } { incr colCounter } { set col [ lindex $columns $colCounter ] set lastItem [ lindex $col [ expr [ llength $col ] - 1 ] ] if { [ overlaps $lastItem $ev ] == false } { lappend col $ev set placed true # lets put col back to columns set columns [ lreplace $columns $colCounter $colCounter $col ] break } } if { $placed == false } { set col [ list ] lappend col $ev lappend columns $col } if { $lastEndTime == -1 || [ dict get $ev endTime ] > $lastEndTime } { set lastEndTime [ dict get $ev endTime ] } } if { [ llength $columns ] > 0 } { packevents $c $columns $start } } proc packevents { c columns startOfDay } { set numcolumns [ llength $columns ] set numcolumns [ format "%0.2f" $numcolumns ] set iCol 0 foreach col $columns { foreach ev $col { set colSpan [ expandEvent $ev $iCol $columns ] dict set ev left [ expr $iCol / $numcolumns ] dict set ev right [ expr ( $iCol + $colSpan ) / $numcolumns ] # position of event is now known: draw drawSingleEvent $c $ev $startOfDay } incr iCol } } # # procedure that checks if it is ok to extend event over multiple columns # proc expandEvent { ev iCol columns } { set colSpan 1 for { set i [ expr $iCol + 1 ] } { $i < [ llength $columns ] } { incr i } { set column [ lindex $columns $i ] foreach listEvent $column { if { [ overlaps $listEvent $ev ] == true } { return $colSpan } } incr colSpan } return $colSpan } # # procedure returns true if event a overlaps with b # proc overlaps { a b } { set aStart [ dict get $a startTime ] set aEnd [ dict get $a endTime ] set bStart [ dict get $b startTime ] set bEnd [ dict get $b endTime ] if { ($aStart == $bStart ) || ( $aEnd > $bStart && $aEnd <= $bEnd ) || ( $aStart > $bStart && $aStart < $bEnd ) || ( $bStart > $aStart && $bStart < $aEnd ) || ( $aStart > $bStart && $aStart < $bEnd ) } { return true } else { return false } } # # procedure called when user presses button saving a new event # proc postNewEventCmd {} { set duration [ expr {$::newEventEnd-$::newEventStart} ] if { $duration < 1 } { .rightframe.newEventFrame.buttonFrame.errorLabel configure -text {Event end date too early} } elseif { $duration > [ expr 60 * 60 * 24 * 14 ] } { .rightframe.newEventFrame.buttonFrame.errorLabel configure -text {Event max duration is 14 days} } elseif { [ string length [ string trim [ .rightframe.newEventFrame.titleFrame.titleEntry get ] ] ] < 1 } { .rightframe.newEventFrame.buttonFrame.errorLabel configure -text {Title is mandatory} } else { .rightframe.newEventFrame.buttonFrame.errorLabel configure -text {} # so, construct the new event dict set ev startTime $::newEventStart dict set ev endTime $::newEventEnd dict set ev title [ .rightframe.newEventFrame.titleFrame.titleEntry get ] dict set ev senderId $::profileInUse if { [ string length [ string trim [ .rightframe.newEventFrame.descFrame.descText get 1.0 ] ] ] > 0 } { dict set ev description [ string trim [ .rightframe.newEventFrame.descFrame.descText get 1.0 end ] ] } # invent identifier for the event dict set ev identifier [ calculateSHA1 [ format {%s-%s-%s-%s} $::newEventStart $::newEventEnd $::profileInUse [ clock seconds ] ] ] # include variable telling if event is supposed to be local, private or public if { $::postPublicity == {local} } { dict set ev publicity $::postPublicity } else { if { [ isProfilePrivate ] } { dict set ev publicity {public} } else { dict set ev publicity $::postPublicity } } # timestamp of creation for the event dict set ev createdOn [ clock seconds ] # set collection name into event. in our local storage we may # have events belonging to multiple collections but at # publish we may publish only events that belong to selected # collection dict set ev collection $::collectionInUse # and store event into datamodel storeNewEvent $ev # and clear fields using "cancel" methods cancelNewEventCmd # and update the calendar view: displayDay [ clock format $::dayOnDisplay -format "%d" ] } } # # cancel creation of new event by clearing input fields and navigating # to calendar view # proc cancelNewEventCmd {} { .rightframe.newEventFrame.timeFrame.startDayLabel configure -text {} .rightframe.newEventFrame.titleFrame.titleEntry delete 0 end .rightframe.newEventFrame.descFrame.descText delete 1.0 end showDayView } # # Procedure called from button, changes event database (collection) name. # All events in memory need to be discarded, and re-fetched from the # newly-selected collection. # proc changeCollectionCallback {} { # set collection into settings: set collection [ .rightframe.settingsframe.collectionEntry get ] if { [ string length $collection ] > 0 } { set ::collectionInUse $collection dict set ::settings collectionInUse $collection # save settings into permanent storage: persistLocalData # remove all events set ::allEvents [ list ] # set all records as un-seen set ::allDbRecords [ dict create ] # re-load local events loadLocalDataFromStorage # load events of other operators from shared database: eventsByTimeAndCollection $::monthOnDisplay # and display currently selected day displayDay [ clock format $::monthOnDisplay -format "%d" ] } } # # Callback procedure for adding a comment to an event # proc addCommentCallback { eventIdentifier } { puts [ format "addCommentCallback %s" $eventIdentifier ] # first see if we have any text.. set commentText [ string trim [ .rightframe.dayframe.daycanvas.singleEventFrame.commentsFrame.newCommentEntry get ] ] if { [ string length $commentText ] < 1 } { return } # we had some text, so lets construct the comment. dict set newComment commentText $commentText dict set newComment commentTime [ clock seconds ] dict set newComment commentedEvent $eventIdentifier dict set newComment identifier [ calculateSHA1 [ format {%s-%s-%s} $eventIdentifier $::profileInUse [ clock seconds ] ] ] # fetch the event set ev [ eventById $eventIdentifier ] # comment publicity follows publicity of the event dict set newComment publicity [ dict get $ev publicity ] dict set newComment collection [ dict get $ev collection ] # in profile comment also set start time of the event commented, # it will help in deciding which is the right db record dict set newComment eventStartTime [ dict get $ev startTime ] dict set newComment senderId $::profileInUse # getProfile will fail if operators profile is not published: if { [ catch { set p [ getProfile $::profileInUse ] dict set newComment senderName [ dict get $p displayName ] } fid ] } { dict set newComment senderName $::profileInUse } # see if this event already had local comments: if { [ dict exists $::allLocalComments $eventIdentifier ] } { # yes, this event has already been commented set eventCommentList [ dict get $::allLocalComments $eventIdentifier ] lappend eventCommentList $newComment # and put the list back into dictionary dict set ::allLocalComments $eventIdentifier $eventCommentList puts [ format "comment appended to existing event comment list of %s" $eventIdentifier ] } else { # No, event did not have any local comments. Create the first one set eventCommentList [ list ] lappend eventCommentList $newComment dict set ::allLocalComments $eventIdentifier $eventCommentList puts [ format "comment appended to new comment list of %s" $eventIdentifier ] } # see if this event already had any comments from any operator if { [ dict exists $::allComments $eventIdentifier ] } { # yes, this event has already been commented set eventCommentList [ dict get $::allComments $eventIdentifier ] lappend eventCommentList $newComment dict set ::allComments $eventIdentifier $eventCommentList } else { # this is first comment for given event set eventCommentList [ list ] lappend eventCommentList $newComment dict set ::allComments $eventIdentifier $eventCommentList } # then persist locally persistLocalData # and conditionally publish if { [ dict get $newComment publicity ] != {private} } { publishEvents $ev } updateEventCommentsDisplay $eventIdentifier } # # Procedure for updating comments of event on display. This updates # the comments-section of event display. # proc updateEventCommentsDisplay { eventIdentifier } { if { [ dict exists $::allComments $eventIdentifier ] } { # yes, this event has already been commented .rightframe.dayframe.daycanvas.singleEventFrame.commentsDisplayFrame.oldCommentText configure -state normal # wipe out old content: .rightframe.dayframe.daycanvas.singleEventFrame.commentsDisplayFrame.oldCommentText delete 1.0 end set eventCommentList [ dict get $::allComments $eventIdentifier ] puts [ format "updateEventCommentsDisplay: %d comments for %s" [ llength $eventCommentList ] $eventIdentifier ] foreach c $eventCommentList { .rightframe.dayframe.daycanvas.singleEventFrame.commentsDisplayFrame.oldCommentText insert 1.0 [ format "%s (%s) %s:\n%s\n" [ dict get $c senderName ] [ dict get $c senderId ] [ clock format [ dict get $c commentTime ] -locale system ] [ dict get $c commentText ] ] } .rightframe.dayframe.daycanvas.singleEventFrame.commentsDisplayFrame.oldCommentText configure -state disabled } else { puts [ format "updateEventCommentsDisplay: no comments for %s" $eventIdentifier ] } } # # data-model part. # # data-model here is more or less the calendar-events. events may be # created and deleted. there might be a "comment" on event, maybe something # like "Yes, I will attend" # # Event is a dictionary with values # startTime : number, something that [ clock seconds ] returns. mandatory # endTime : number, mandatory # title : title for the event, mandatory. # description : longer description for the event, optional # invitees : list of classified-ads operator profile addresses, SHA1-format, # optional # # # Procedure that returns events in currently open collection between start- # and end-date. Events are returned as a list of dictionaries. Resultset # includes events in selected collection and events posted by operator. # From usage point of view that makes sense ; user always sees her own events # and then additionally events of other operators that are in the # selected collection # proc eventsBetween { start end } { set retval [ list ] dict set dummyComparatorEvent startTime $start dict set dummyComparatorEvent endTime $end set eventsInStorage [ llength $::allEvents ] set i 0 while { $i < $eventsInStorage } { set evInStorage [ lindex $::allEvents $i ] if { [ overlaps $evInStorage $dummyComparatorEvent ] == true } { # also, for display purposes select events that either belong # to selected collection or are posted by current operator if { ( [ dict get $evInStorage collection ] == $::collectionInUse ) || ( [ dict exists $evInStorage senderId ] && [ dict get $evInStorage senderId ] == $::profileInUse ) } { lappend retval $evInStorage } } incr i } return $retval } # # Procedure that is called when user clicks on event on display. # This displays details of the event for user to see. # proc displaySingleEvent { eventIdentifier } { puts [ format "displaySingleEvent %s" $eventIdentifier ] # get rid of possible previous display: catch closeSingleEventDisplay # which canvas to use set c .rightframe.dayframe.daycanvas # calculate size of canvas to create: # figure out canvas scroll-region size, first ask size of the # canvas, including possible unvisible parts set scSizeOption [ $c configure -scrollregion ] set regSize [ lindex $scSizeOption 4 ] set width [ lindex $regSize 2 ] set height [ lindex $regSize 3 ] puts [ format "scroll area w %d h %d" $width $height ] # then figure out the visible rectangle set visibleYStart [ expr int ( $height * [ lindex [ $c yview ] 0 ] ) ] set visibleYEnd [ expr int ( $height * [ lindex [ $c yview ] 1 ] ) ] set visibleY [ expr ( $visibleYEnd - $visibleYStart ) - 50 ] set width [ expr $width - 50 ] puts [ format "frame size %d %d" $width $visibleY ] # first create frame to host contents of event display frame $c.singleEventFrame -borderwidth 2 -relief raised -width $width -height $visibleY # fetch the event set ev [ eventById $eventIdentifier ] if { $ev != {null} } { # then populate things into frame: label $c.singleEventFrame.titleLabel -text [ dict get $ev title ] # see if we know the event sender profile: set p [ getProfileAndEmptyIfNotFound [ dict get $ev senderId ] ] if { [ dict size $p ] == 0 } { # profile not found: label $c.singleEventFrame.senderLabel -text [ format "Posted by %s" [ dict get $ev senderId ] ] } else { label $c.singleEventFrame.senderLabel -text [ format "Posted by %s (%s)" [ dict get $p displayName ] [ dict get $ev senderId ] ] } label $c.singleEventFrame.startTime -text [ format "Start time is %s" [ clock format [ dict get $ev startTime ] -locale system ] ] label $c.singleEventFrame.endTime -text [ format "End time is %s" [ clock format [ dict get $ev endTime ] -locale system ] ] if { [ dict exists $ev description ] == false } { label $c.singleEventFrame.description -text { } } else { label $c.singleEventFrame.description -text [dict get $ev description] } frame $c.singleEventFrame.buttonFrame button $c.singleEventFrame.buttonFrame.closeButton -text {Close} -command closeSingleEventDisplay if { [ dict get $ev senderId ] == $::profileInUse } { button $c.singleEventFrame.buttonFrame.deleteButton -text {Delete event} -command "deleteEvent $eventIdentifier" } pack $c.singleEventFrame.titleLabel -anchor nw pack $c.singleEventFrame.senderLabel -anchor nw pack $c.singleEventFrame.startTime -anchor nw pack $c.singleEventFrame.endTime -anchor nw pack $c.singleEventFrame.description -anchor nw -ipadx 15 -ipady 15 pack $c.singleEventFrame.buttonFrame.closeButton -side left if { [ dict get $ev senderId ] == $::profileInUse } { pack $c.singleEventFrame.buttonFrame.deleteButton -side left } pack $c.singleEventFrame.buttonFrame # comments-section of the event: frame $c.singleEventFrame.commentsFrame label $c.singleEventFrame.commentsFrame.newCommentLabel -text {New comment: } entry $c.singleEventFrame.commentsFrame.newCommentEntry button $c.singleEventFrame.commentsFrame.newCommentBtn -text Add -command "addCommentCallback $eventIdentifier" pack $c.singleEventFrame.commentsFrame.newCommentBtn -side right -anchor sw pack $c.singleEventFrame.commentsFrame.newCommentEntry -side right -anchor sw -fill x -expand yes pack $c.singleEventFrame.commentsFrame.newCommentLabel -side right -anchor sw pack $c.singleEventFrame.commentsFrame -fill x -expand yes # next is one single entry for all the comments posted by all # users: frame $c.singleEventFrame.commentsDisplayFrame label $c.singleEventFrame.commentsDisplayFrame.oldCommentLabel -text {Comments: } text $c.singleEventFrame.commentsDisplayFrame.oldCommentText -state disabled pack $c.singleEventFrame.commentsDisplayFrame.oldCommentText -side right -anchor sw -fill both -expand yes pack $c.singleEventFrame.commentsDisplayFrame.oldCommentLabel -side top -anchor sw pack $c.singleEventFrame.commentsDisplayFrame -fill both -expand yes # populate possible comments regarding the event: updateEventCommentsDisplay $eventIdentifier # put the frame into window that is in the canvas: $c create window 25 [ expr $visibleYStart + 25 ] -window $c.singleEventFrame -width $width -height $visibleY -anchor nw -tags singleEventWindow } else { catch closeSingleEventDisplay } } # # Procedure for closing single event display. UI-button callback. # proc closeSingleEventDisplay { } { set c .rightframe.dayframe.daycanvas destroy $c.singleEventFrame $c delete singleEventWindow } # # Procedure for deleting a previously posted event. This is UI-button # callback. # proc deleteEvent { eventIdentifier } { puts [ format "deleteEvent %s" $eventIdentifier ] # first delete from storage, will cause publish also if public event deleteEventFromStorage [ eventById $eventIdentifier ] # close the dialog showing the event about to be deleted closeSingleEventDisplay # and update the event display, now with one event missing displayDay [ clock format $::dayOnDisplay -format "%d" ] } # # Procedure for comparing durations of 2 events # # a and b are events from procedure eventsBetween and # this returns 1 if a has longer duration than b, 0 # if durations are equal. # proc durationComparator { a b } { set aStart [ dict get $a startTime ] set aEnd [ dict get $a endTime ] set bStart [ dict get $b startTime ] set bEnd [ dict get $b endTime ] set aDuration [ expr { $aEnd - $aStart } ] set bDuration [ expr { $bEnd - $bStart } ] if { $aDuration == $bDuration } { return 0 } if { $aDuration > $bDuration } { return 1 } return -1 } # # Procedure for comparing start-times of 2 events # # Used for sorting by start-time order. If 2 events # have same start time, then by end-time # proc startComparator { a b } { set aStart [ dict get $a startTime ] set aEnd [ dict get $a endTime ] set bStart [ dict get $b startTime ] set bEnd [ dict get $b endTime ] if { $aStart == $bStart && $bEnd == $aEnd } { return 0 } if { $aStart > $bStart } { return 1 } if { $aStart < $bStart } { return -1 } # start-times did not differ, next is to compare end times if { $aEnd > $bEnd } { return 1 } if { $aEnd < $bEnd } { return -1 } # following line should not be reached return 0 } # # Procedure for storing a single event # proc storeNewEvent { ev } { # check if that particular event was already in storage set found false set eventsInStorage [ llength $::allEvents ] set i 0 while { $i < $eventsInStorage } { set evInStorage [ lindex $::allEvents $i ] if { [ dict get $ev identifier ] == [ dict get $evInStorage identifier ] } { set found true set ::allEvents [ lreplace $::allEvents $i $i $ev ] break } incr i } if { $found == false } { lappend ::allEvents $ev } puts [ format "after storeNewEvent num of events = %d" [ llength $::allEvents ] ] storeEventsLocally if { $::postPublicity == "byprofile" || $::postPublicity == "public" } { publishEvents $ev } } # # Procedure for deleteting a single event # proc deleteEventFromStorage { ev } { # check if that particular event was already in storage set found false set eventsInStorage [ llength $::allEvents ] set i 0 while { $i < $eventsInStorage } { set evInStorage [ lindex $::allEvents $i ] if { [ dict get $ev identifier ] == [ dict get $evInStorage identifier ] } { set found true # replace with empty -> is removal set ::allEvents [ lreplace $::allEvents $i $i ] break } incr i } puts [ format "after deleteEvent num of events = %d" [ llength $::allEvents ] ] if { $found == true } { storeEventsLocally if { $::postPublicity == "byprofile" || $::postPublicity == "public" } { publishEvents $ev } } } # # Method for locally storing own events in program-specific database. # Now, a caveat. TCL programs are stored only once per classified-ads # installation. Locally stored data is a single file per program. # If user has multiple profiles in use and uses calendar app on many # of those, we must be careful to not accidentally delete events # posted by other profiles the operator may be operating. # proc storeEventsLocally {} { # set list empty: set ::allLocalEvents [ list ] # pick own events foreach event $::allEvents { if { [ dict get $event senderId ] == $::profileInUse } { lappend ::allLocalEvents $event } } persistLocalData } # # Method for persisting locally stored data (events and settings, in practice) # # Structure of the data storage is this: # at top level there is dictionary. Keys into dictionary are of form # -settings # -events # because there may be several operator profiles and idea is to keep # settings and events of each operator intact # proc persistLocalData {} { # store local data in dictionary. one item is settings. another is event data. # yet one more are event comments set blob [ retrieveLocalData ] if { [ string length $blob ] == 0 } { set blob [ dict create ] } dict set blob [ format "%s-settings" $::profileInUse ] $::settings dict set blob [ format "%s-events" $::profileInUse ] $::allLocalEvents dict set blob [ format "%s-comments" $::profileInUse ] $::allLocalComments # this extension method writes data to local database, specific to this particular program: storeLocalData $blob } # # Method for loading locally stored data upon startup. See format description # at procedure "persistLocalData" that is counterpart to this. # proc loadLocalDataFromStorage {} { set blob [ retrieveLocalData ] if { [ string length $blob ] > 0 } { if { [ dict exists $blob [ format "%s-settings" $::profileInUse ] ] } { set ::settings [ dict get $blob [ format "%s-settings" $::profileInUse ] ] } if { [ dict exists $blob [ format "%s-events" $::profileInUse ] ] } { set ::allLocalEvents [ dict get $blob [ format "%s-events" $::profileInUse ] ] } if { [ dict exists $blob [ format "%s-comments" $::profileInUse ] ] } { set ::allLocalComments [ dict get $blob [ format "%s-comments" $::profileInUse ] ] } # because this procedure is called only at start-up there is no need # merge events. the locally stored events are at this stage # all that we've got set ::allEvents $::allLocalEvents set ::allComments $::allLocalComments } } # # Procedure that applies settings that must have been previously # loaded using procedure loadLocalDataFromStorage - settings are # stored in global dictionary ::settings proc loadSettings {} { if { [ dict exists $::settings collectionInUse ] } { set ::collectionInUse [ dict get $::settings collectionInUse ] .rightframe.settingsframe.collectionEntry delete 0 end .rightframe.settingsframe.collectionEntry insert 0 $::collectionInUse } } # # method that returns true if selected profile is public profile # proc isProfilePrivate {} { # getProfile will fail if operators profile is not published: if { [ catch { set p [ getProfile $::profileInUse ] # profile is a dictionary if { [ dict get $p isPrivate ] > 0 } { return true } else { return false } } fid ] } { # if failed during query, assume it is unpublished and # assume that user wants to keep the profile secret. return true } } # # Publish procedures - publishes all public events in same month # with given event. It could be possible to post every single # event as db-record of its own but that would lead to huge # number of records - lets instead list all events belonging to # same month into single database record and publish that. That # will lead each user having about 12 db records per year. This # method also makes it easier to detect situation where event # is deleted by user. # # If user has public profile, all published events will be # published with "public" setting because that is users # selected setting. Otherwise, if user has "private" profile # setting, and event is set to be sent with "byprofile" # setting, then event will be encrypted only to readers of # the current profile. # # Additionally this procedure takes care of including # event comments into published record. # proc publishEvents { newOrDeletedEvent } { # check out publicity setting of the new event, it determines # the database record where it will be published. set publicity [ dict get $newOrDeletedEvent publicity ] # for db record pick up every public event by me # whose start time is in the same month. set startTime [ dict get $newOrDeletedEvent startTime ] set monthStart [ startOfMonth $startTime ] set monthEnd [ endOfMonth $startTime ] # pad start+end with one day to get around events not # beloning to same month in all timezones: set monthStart [ clock add $monthStart -1 day ] set monthEnd [ clock add $monthEnd 1 day ] # fetch all events of month, will include events from any operator: set allEventsOfMonth [ eventsBetween $monthStart $monthEnd ] set myEventsToBePublished [ list ] set myCommentsToBePublished [ list ] # pick own events that go selected collection foreach event $allEventsOfMonth { if { [ dict get $event publicity ] != $publicity } { # not our kind of event, don't publish continue } if { [ dict get $event collection ] != $::collectionInUse } { # event belongs to other collection than the one we're # publishing now continue } # at this stage we've noticed that we're dealing with # event that has suitable publicity setting and belongs # to right collection. lets see if there is comments # regarding that event that should go to same db record: if { [ dict exists $::allLocalComments [ dict get $event identifier ] ] } { # yes, this event has already been commented set eventCommentList [ dict get $::allLocalComments [ dict get $event identifier ] ] puts [ format "For publish event %s has %d comments" [ dict get $event identifier ] [ llength $eventCommentList ] ] foreach c $eventCommentList { lappend myCommentsToBePublished $c } } else { puts [ format "For publish event %s had no comments" [ dict get $event identifier ] ] } # then check by sender id if this was our event, and decide # if that should be published if { [ dict get $event senderId ] != $::profileInUse } { # not my event, don't publish continue } lappend myEventsToBePublished $event } # fetch possible previous version of the months record dict set searchDict searchPhrase [ searchString [ dict get $newOrDeletedEvent startTime ] ] dict set searchDict senderId $::profileInUse dict set searchDict collectionId [ calculateSHA1 $::collectionInUse ] # getDbRecord returns a list if dictionaries. each dictionary has # key "data" that is our actual payload set previousDbRecords [ getDbRecord $searchDict ] set previousRecordFound false foreach r $previousDbRecords { if { [ dict exists $r data ] } { set recordData [ dict get $r data ] if { [ dict exists $recordData publicity ] } { set publicityOfRecord [ dict get $recordData publicity ] if { $publicityOfRecord == $publicity } { set existingRecord $r set previousRecordFound true break } } } } if { $previousRecordFound == true } { puts "In publish found previous record whose data is updated" set recordToSave $existingRecord set recordData [ dict get $existingRecord data ] # replace the events in data: dict set recordData events $myEventsToBePublished dict set recordData comments $myCommentsToBePublished dict set recordToSave data $recordData } else { # construct a brand new record, record is a dictionary puts "In publish no previous record found" dict set recordToSave collectionId [ calculateSHA1 $::collectionInUse ] dict set recordToSave searchPhrase [ searchString [ dict get $event startTime ] ] if { $publicity == {public} || ( [ isProfilePrivate ] != true && $publicity == {byprofile} ) } { dict set recordToSave encrypted false } else { dict set recordToSave encrypted true } # construct another dictionary for the record data dict set recordData publicity $publicity dict set recordData startTime $monthStart dict set recordData endTime $monthEnd dict set recordData events $myEventsToBePublished dict set recordData comments $myCommentsToBePublished # and finally the events+comments: dict set recordToSave data $recordData } # record is ready, publish: publishDbRecord $recordToSave } # # method that returns beginning of month where given time belongs # to # proc startOfMonth { timeStamp } { set yearNumber [ clock format $timeStamp -format {%Y} ] set monthNumber [ clock format $timeStamp -format {%N} ] set timeOfstartOfMonth [clock scan [ format "%s %s 01 00 00 00" $yearNumber $monthNumber ] -format {%Y %m %d %H %M %S} -gmt false ] return $timeOfstartOfMonth } # # method that returns end of month where given time belongs to # proc endOfMonth { timeStamp } { set timeOfStartOfMonth [startOfMonth $timeStamp ] set timeOfEndOfMonth [ clock add $timeOfStartOfMonth 1 month ] return $timeOfEndOfMonth } # # method that produces db-record search string based on event start time. # search string has structure "monXX-YYYY" where XX is month number # and YYYY is year and it is calculated according to event start # time, using UTC timezone. Because events starting first hours of # month may appear in previous month in some timezones, it is # convenient to pad each month to contain also events from start+end # of next month+prev month. # proc searchString { startTime } { return [ clock format $startTime -format {mon%m-%Y} -locale UTC ] } # # Procedure for fetching events from database by collection # and time. Updates in-memory catalog of already seen db records # to make it easier to prune deleted events when same db-record # is published again by another operator. Does not return anything # but updates the global ::allEvents list. # # parameter startTime determines the time, global variable ::collectionInUse # the collection # proc eventsByTimeAndCollection {startTime} { # set search phrase to search dict dict set searchDict searchPhrase [ searchString $startTime ] # set collection id to search dict dict set searchDict collectionId [ calculateSHA1 $::collectionInUse ] # do actual search set dbRecords [ getDbRecord $searchDict ] # then loop through results. note bad algorithm .. this goes through # $::allEvents as many times as there are records in db so this is # O(n*m) while we could extract all changes from records in first pass # and then loop the $::allEvents with all changes to reduce the load # slightly foreach r $dbRecords { # if throws an error, $fid will contain error message if { [ catch { updateOneDbRecordIntoEventCollection $r } fid ] } { puts [ format {updateOneDbRecordIntoEventCollection: %s} $fid ] } } } # # Proc that updates content of one db record into in-memory event # collection. Should be called via "catch" method because input comes # from other nodes and can be potentially *anything* # proc updateOneDbRecordIntoEventCollection { r } { # see if this record has been seen already: set recordIsSeenAndNew false if { [ dict exists $::allDbRecords [ dict get $r recordId ] ] } { # yes, lets see if timestamp is the same set timeOfPreviouslyPublished [ dict get $::allDbRecords [ dict get $r recordId ] ] set timeOfNewRecord [ dict get $r timeOfPublish ] if { $timeOfNewRecord < $timeOfPreviouslyPublished } { # record has been seen and is same, or older: return } else { set recordIsSeenAndNew true } } # if my own record, we can skip because all my events should # be in local storage also so lets not bring them in twice: if { [ dict get $r senderId ] == $::profileInUse } { return } # stupid validity check: if { [ dict exists $r data ] == false } { # ugh, malformed record it must be, yoda ask for details return } set recordData [ dict get $r data ] # first remove all events by operator of record and matching publicity # each operator for given month (== searchPhrase) has either public or # private record, or both but no more than that, lets remove events # from in-memory list based on operator and publicity if { $recordIsSeenAndNew == true } { removeEventsByOperatorAndPublicity [ dict get $r senderId ] [ dict get $recordData publicity ] removeEventsByRecordId [ dict get $r recordId ] } # then, after events from that data record are not in # our in-memory collection any more, lets add them # back foreach e [ dict get $recordData events ] { # before appending event to in-memory collection # set event owner to event, key in dictionary is senderId: dict set e senderId [ dict get $r senderId ] # before appending event to in-memory collection # set id of the originating db record dict set e recordId [ dict get $r recordId ] puts [ format "Adding from record %s event %s" [ dict get $r recordId ] [ dict get $e identifier ] ] lappend ::allEvents $e } # After events from record have been processed, lets continue # with comments. Note how ::allComments is a dict where # key is the commented event id ; published comments in turn # are just a list of dictionaries and the event id is # inside each comments dictionary. if { [ dict exists $recordData comments ] } { foreach c [ dict get $recordData comments ] { # before appending comment to in-memory collection # set event owner to comment, key in dictionary is senderId: dict set c senderId [ dict get $r senderId ] # before appending comment to in-memory collection # set id of the originating db record dict set c recordId [ dict get $r recordId ] puts [ format "Adding from record %s comment %s" [ dict get $r recordId ] [ dict get $c identifier ] ] updateOneCommentIntoDictionary $c } } # update dictionary that keeps cache about which dbrecord has been seen # and which not: dict set ::allDbRecords [ dict get $r recordId ] [ dict get $r timeOfPublish ] } # # procedure that removes from event collection "all events" by operator+publicity # proc removeEventsByOperatorAndPublicity { operator publicity } { # loop through events from end to start, removing # every event matching search criteria set listLen [ expr [ llength $::allEvents ] - 1 ] for { set i $listLen} { $i >= 0 } { set i [ expr $i - 1 ] } { set eventInList [ lindex $::allEvents $i ] if { [ dict exists $eventInList senderId ] && [ dict exists $eventInList publicity ] } { set eventOperator [ dict get $eventInList senderId ] set eventPublicity [ dict get $eventInList publicity ] if { $eventOperator == $operator && $eventPublicity == $publicity } { # remove puts [ format "Removing by operator event %s" [ dict get $eventInList identifier ] ] set ::allEvents [ lreplace $::allEvents $i $i ] } } } } # # procedure that removes from event collection "all events" by record identifier # proc removeEventsByRecordId { recordIdToRemove } { # loop through events from end to start, removing # every event matching given record id set listLen [ expr [ llength $::allEvents ] - 1 ] for { set i $listLen} { $i >= 0 } { set i [ expr $i - 1 ] } { set eventInList [ lindex $::allEvents $i ] if { [ dict exists $eventInList recordId ] } { set eventRecordId [ dict get $eventInList recordId ] if { $eventRecordId == $recordIdToRemove } { # remove set ::allEvents [ lreplace $::allEvents $i $i ] } } } } # # Procedure for digging out one event by its id # proc eventById { identifier } { foreach event $::allEvents { if { [ dict get $event identifier ] == $identifier } { return $event } } return null } # # procedure that returns operator profile or if no profile is # found then empty dictionary # proc getProfileAndEmptyIfNotFound { identifier } { if { [ catch { set p [ getProfile $identifier ] } fid ] } { # error return [ dict create ] } else { return $p } } # # procedure that updates one event comment into in-memory dictionary # proc updateOneCommentIntoDictionary { comment } { if { [ dict exists $comment identifier ] && [ dict exists $comment commentedEvent ] } { set eventIdentifier [ dict get $comment commentedEvent ] set commentIdentifier [ dict get $comment identifier ] if { [ dict exists $::allComments $eventIdentifier ] } { # yes, this event has already been commented set eventCommentList [ dict get $::allComments $eventIdentifier ] # see if this particular comment already appears in the list: set commentAlreadySeen false foreach c $eventCommentList { if { [ dict get $c identifier ] == $commentIdentifier } { # yes, is seen return } } # if we got here, this particular comment is not yet on list: lappend eventCommentList $comment dict set ::allComments $eventIdentifier $eventCommentList puts [ format "Appending comment %s from published record" $commentIdentifier ] } else { # this is first comment for given event set eventCommentList [ list ] lappend eventCommentList $comment dict set ::allComments $eventIdentifier $eventCommentList puts [ format "Creating comment list for comment %s from published record" $commentIdentifier ] } } } # # Notification procedure that classified-ads host program calls whenever # there is new content added to database. # proc dataItemChanged { itemHash itemType } { if { $itemType != {dbrecord} } { return ; } # it was db record, see if we're supposed to be interested: set currentSearchPhrase [ searchString $::monthOnDisplay ] set collectionHash [ calculateSHA1 $::collectionInUse ] dict set searchDict collectionId $collectionHash dict set searchDict recordId $itemHash set dbRecords [ getDbRecord $searchDict ] foreach r $dbRecords { set recordCollectionHash [ dict get $r collectionId ] if { $recordCollectionHash == $collectionHash } { if { [ dict exists $r data ] && [ dict exists $r searchPhrase ] } { set recordSearchPhrase [ dict get $r searchPhrase ] if { [ string last $currentSearchPhrase $recordSearchPhrase ] != -1 } { # if throws an error, $fid will contain error message if { [ catch { updateOneDbRecordIntoEventCollection $r } fid ] } { puts [ format {updateOneDbRecordIntoEventCollection: %s} $fid ] } else { # update display displayDay [ clock format $::dayOnDisplay -format "%d" ] } } } } } } # # execution starts here # initGlobals initUI # load local events, not posted in public: loadLocalDataFromStorage # process settings loadSettings # load events of other operators from shared database: eventsByTimeAndCollection $::monthOnDisplay showDayView displaySelectionCalendar $::monthOnDisplay set ::initReady true displayDay [ clock format $::monthOnDisplay -format "%d" ] updateSelectionButtonsState $::monthOnDisplay classified-ads-0.13/doc/clock-app.tcl000066400000000000000000000003651331670245300174420ustar00rootroot00000000000000# # hugely useful program # proc timerprocedure {} { set ::timervariable [clock format [clock seconds] ] after 1000 timerprocedure } timerprocedure pack [label .l -textvariable ::timervariable] pack [button .b -command exit -text Exit] classified-ads-0.13/doc/interactions.txt000066400000000000000000000034661331670245300203350ustar00rootroot00000000000000 * connection -class - is related to one node - sends protocol packets - receives protocol packets - hands protocol packets to -> protocol_message_parser - may ask from datamodel for more packets to send - normal mode of working is this: 1. wait for input from other node, for some time 2. if indication of received data is present, try receiving data, handing it over to parser class 3. if no indication of received data, ask for datamodel for next packet to send to this peer ; it may or may not appear 4. that's all folks, connection should be simple? * datamodel class - has list of all known nodes - has list of all connected nodes - has list of "good" nodes, that it will spam around. ..good methodology for producing this list needed? - for each node, based on info given (available) produces a queue of protocol items to send. queue contains 1. node greeting 2. if last contact is long time ago, a fresh list of nodes 3. possible private messages destined to said node 4. any object that belongs to nodes in vicinity - when more object appear (are sent from other nodes, or appear by user from UI) they are subsequently put into queue of each node. * protocol_message_parser - gets raw bytestream parts from connections - sees if they look like a valid protocol element, if yes, gives them to datamodel for storage and re-send to next nodes; in practice the datamodel may put the newly-received objects into send-queues of connected nodes. * Network listener listens to incoming connections - connection -instances notify datamodel directly about the node connected, network listener only needs to listen and traffic does not need to through it, instead see protocol_message_parser classified-ads-0.13/doc/luikero.tcl000066400000000000000000000120251331670245300172370ustar00rootroot00000000000000# -*-TCL-*- -*-coding: utf-8-unix;-*- # Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. # # This file is part of Classified Ads. # # Classified Ads is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # Classified Ads 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Classified Ads; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # This file implements the classic worm game in TCL # proc game_init {} { set ::area_max_x 100 set ::area_max_y 100 # after how many steps the worm gets longer set ::worm_extension_speed 5 # counter where we're now regarding extension: set ::worm_extension_counter $::worm_extension_speed label .l -text {The game is to slither} pack .l canvas .c -width [ expr $::area_max_x * 3 ] -height [ expr $::area_max_y * 3 ] pack .c frame .f button .f.b -text {Stop stop} -command button_procedure pack .f.b -side right -padx 10 set ::game_speed 300 scale .f.s -orient horizontal -showvalue false -label Speed -variable ::game_speed -from 100 -to 500 pack .f.s -side left -padx 10 set ::wurm_len {Len 0} label .f.l -textvariable ::wurm_len pack .f.l -side left -padx 10 pack .f # initialize worm at beginning set ::wurm_dir up set ::color_counter 0 set ::color_increment 1 # on-off -switch here, if game is on or not set ::wurm_moves 1 } # function that draws frontside of the worm proc display_worm_head { pos_x pos_y } { set actual_x [ expr $pos_x * 3 ] set actual_y [ expr $pos_y * 3 ] set tag [ format {%d_%d} $pos_x $pos_y ] set wurm_color [ format "\#%02X%02X%02X" $::color_counter 167 50 ] set ::color_counter [ expr $::color_counter + $::color_increment ] if { $::color_counter > 254 } { set ::color_increment -1 } if { $::color_counter < 1 } { set ::color_increment 1 } .c create rectangle $actual_x $actual_y [ expr $actual_x + 3 ] [ expr $actual_y + 3 ] -outline $wurm_color -fill $wurm_color -tag $tag # last item in list always head, first item then the tail if { [ lsearch $::wurm_tail $tag ] == -1 } { lappend ::wurm_tail $tag incr ::worm_extension_counter if { $::worm_extension_counter > $::worm_extension_speed } { # do not remove tail, reset counter: set ::worm_extension_counter 0 } else { # retrieve item: set tail_item [ lindex $::wurm_tail 0 ] # remove item frontmost item: set ::wurm_tail [ lreplace $::wurm_tail 0 0 ] # un-draw the tail: .c delete [ .c find withtag $tail_item ] } } else { # game over, worm eats its own tail set ::wurm_moves 0 .f.b configure -text {Restart} } } # non-slithering version proc advance_worm {} { switch $::wurm_dir { up { set ::wurm_y [ expr $::wurm_y - 1 ] } down { set ::wurm_y [ expr $::wurm_y + 1 ] } left { set ::wurm_x [ expr $::wurm_x - 1 ] } right { set ::wurm_x [ expr $::wurm_x + 1 ] } } # keep body visible: if { $::wurm_y < 0 } { set ::wurm_y $::area_max_y } if { $::wurm_y > $::area_max_y } { set ::wurm_y 0 } if { $::wurm_x < 0 } { set ::wurm_x $::area_max_x } if { $::wurm_x > $::area_max_x } { set ::wurm_x 0 } set ::wurm_len [ format {Len %d} [ llength $::wurm_tail ] ] } proc button_procedure {} { if { $::wurm_moves == 0 } { set ::wurm_moves 1 .c delete "all" worm_init .f.b configure -text {Stop stop} } else { exit } } proc worm_init {} { # keep the animal in a list so we know where it is: set ::wurm_tail [ list ] set ::wurm_x 50 set ::wurm_y 50 display_worm_head $::wurm_x $::wurm_y advance_worm display_worm_head $::wurm_x $::wurm_y advance_worm } proc keys_init {} { bind . {set ::wurm_dir up ; break} bind . {set ::wurm_dir down ; break} bind . {set ::wurm_dir left ; break} bind . {set ::wurm_dir right ; break} bind . {exit} # every time we gain focus, set keyboard focus to . (e.g. all windows) bind . {focus .} } # game is played here: proc game_loop {} { if { $::wurm_moves == 1 } { advance_worm display_worm_head $::wurm_x $::wurm_y } after $::game_speed game_loop } # execution starts here: game_init worm_init keys_init game_loop classified-ads-0.13/doc/profilecomment.png000066400000000000000000002345201331670245300206200ustar00rootroot00000000000000‰PNG  IHDR]ћ7Ёѕ…bKGDџџџ НЇ“ pHYsФФ•+tIMEп evжtEXtCommentCreated with GIMPW IDATxкьw`ХіЧПГїІ') ‚JQ”ІbУ‚ѕЁ?}ЂЈЯЂ‚ }ЯgБЁя=БKQ@PDбWlt%H(!хж=П?іцц–эЛїцsє’фюЬ™ййййѓй3s†oпF€ъ?D  ~‡†я˜єєє=’sсЂ_ГаuXдЏЬL~ІЊY_љІNТxСЬ@ЙЬа™ш?І+3žЉu C ԘсЦTЊЉŽ|LgZfМ›0fљž2аыЬѕU+З}œ‡Jš9ШB-uф%ЙoHOНЩр)Sxrв_3"gAZœ”Ž’І 2P-внX*)Щ@ZеJ’ХŽJАV,/žlКзˆР…‹еa>јHeg ЦЄc ‡ыП“ЌƒzЎbAšœѕПŠ Р%†ТV}БО.L:Ќяр\L ІŒЬк7ЅІо˜`&Bв„'fж Sх1в~L-mTЖˆtЄ“/Iё€<дЩъU(ЬHZйУЄЋaУке@џa‘њ™RЄ’ŒъLXщ‡™ю&>c;cЬтp’XЯ лъCdоќдЭLЄц v2й4aШ$dщТвHpЃžžєRBeлnOВI)й4fй4цp[”‹=O$ šФР#—$’@KВ“I %0‰“QОBС‹х ‚T=pшѕž-1@TЁž. Й%X .­.аЃЉЦФ#ƒ€&•ќЄЩ9ъДE† 0–дЪ&uХLqщЈЂ„A?XЩ;ОдСŠЩ]+ІR{RШЧtœ1щiLІ™о„_Lw‘vУ”UHj,ИKˆ##g­ чЄ+ŸZЁ@^˜i'2XSШŠќšщ"вyd_зŽч‰юК„ZВvџ‘>z3ЩHЬD=јД+.všЃ DЦЄљ€ЌТB<]ВOƒ—‹І0{Vњо\`AяV(p‰ˆѕяЮыŒБ†iœИИиcхи_d˜v4ѓ›šКЈЫАЖ`LяC9N^А0L"Н•Ui/…i†Ьа3žЉsšN›“ЇГ(+G9 гmD1]yѕлAЬь[‹~излdsГмSyеЩ \)Љ`ЦKЁ­}|dФлЫTAE?ПФТ›%пfъЄо†z.гyЩ\~“ЂЖИpБпe$љЌъНZ,0KE ‚x\ŠФ € TРЫY[DRЮ pL-"@CМ]`Э f\ИизйЃ?ЋfўнгтKЖ3b8шЈчеДWд LЃNP06­:Ÿ‘2ˆЩцб6ђєУ˜ЖЗJ Е.Г+˜щьdGзVHаHoЁ5Rqy„щ†fИ–dфэтWЬrхЩp™:Ы№зF Kп9“ъНЏ10л:mа>“ЕЛ–4ЉЫ„WЪr~pЯ—˜ ,ЬНLђrI>/b ~щeЊБ x…ЬŒ<]A˜ Ў€K$b€(JЖ+СO,Ф;ЦЄ5^Œw{.Б6”ЬТSєРlnэ—Qhвi ˜2„zСH7(1-#‚…з‰щИЄi†Рy№`rѓšKkЖТжpIЦ  о-‘"IрхІ•ОG0N.Ч€… `*њ˜‰61 az]fŸы:СJе# fВ‰™ЩkЊ˜9ђХПШxГЋЂ:ц*2yьDRЛ/5cБ-„Х­ПЦщ§Ъq3Л(жkШHЇёk 5‹ƒЦцї‘‰<цЊNІ§–dOSщ­ІЭ7YЯIvшрІ —Ф!0Ѕ~=— шСr‚р`d BРЛР/FAф МЩuўњЫЏakКФ@‡—<_’ЫŒˆСG5—_Dр˜єSчzz.\ЫЦ1ЎУŽ  Ж­ЁPєdЃaLЦ*Т —Ю5[ЊѕcЦ+ЂHатк-ЕМІМYFћ-щ„3ГН•bЂеvЈЃФ0bїœг /дM`eњЄИ2{п™Ѓ.ГЫŸ4WДRЌzŽYПOIБCђя\Na`€иА†Ыс'8išЁ7Ёа )юD аLњUh ЊŸfXгхrЛсv{”œDCR& „ŠЏ.?Єщ„>b№3`сX(Аqс’hЗŽхЧнc‚‹•'Ьj&е+СlЎ–ЩВtkВшЁŠЫ+n%vуйњ)ѕ@Г€ЬFHвЪЅ^–БѕtdgХ`$N­6)БЦэЊ@‹ФрrМˆш' І(y˜|VA iЭc7е{ЙX}дwVpЖхЗmT<Ѓ~НV§дAI…љћ!Р/М$@d ~b№ƒ7pћуOx.'‰ЩУОnyЭ‹СљЦv˜ЅЦ`із”ХМївУя"&№нz’l†ƒ(ЦqъХЂdѓг yЏЈ1.ЁШŠп•–WNБь9\И$цS‡$_v'ЃРz.Bс!ѕS 'k˜‚(@šRX?Еа!Hї‘ГДД-[Е†}'Qr‡љƒг Cжw‘\>МxС 2Ÿˆ‚Рo..ЧйeПkФСИfVrФЫј'+чg’>)v-ЬЌ^ŒFd‘єЁN ќФгЕAБ‘ѓ`1k.Хя:л,ЩzћOеІQ“КqЫЫёk" ЂQ˜'‰IŒDЩЛEŒVшgЅ§ЛH )ZМr0чO?џŒ1­ZЂkH`p}“<]ѕkИ|$A–—x Р“М`ќотr\IЬњk І"ЦЩЦ<.@LЋ@P•XСŒŸŸTprŸЉШ”0чпuZvVжXTEjєўР,ЈЁуџ>сТХfшr0)ŠЛ#И‚S„РŸШF`ކ(…RyiyVрџрŒёОqыv ZшЌуђeјIRю%/|$РE №0x‰СiКЁSђrсТmЊXЈdЧељZ+Ž—чШГQЙ ”ИB‰]):nл€Ћй)q•гIгЏЙpБ.Fp‚ФNˆH&B2DЄ2‚“‰HЊ?&Hг  8i-˜ƒЩO1tТЬ#А> ИЪ$ Yч”сƒ@У ИмФрa&tЬ@›Ь$пПпЯЏ—1ђX|Ћd)о‹Sy,і9XŒЏMŒн@цдГиw%fo™ђыХicdЛЇћ5’=HQЦЈэссѕlЧ+kкŽЭ”ЭZёd%ЗЅЬ6ž/Х%‹Баїё)Šwɘ-ЇLp`O•ьЌ…H"РL„ >„Рl@1А' xЛDBрй ЦЬ‚$8ыЉџъ“‚jіщЊ‡­€ЬЧЄ5]&р–ю™№­@y•—O1<‘й‰YЫl)@3kjšЭЯŒќЉЃНњДЂъ9­НЌєNЫгš&ЉВfI+!гаЪд•0fюл[0SЧ™кЅж8Ю4~e ЧДњ 3~ ‚—0cбЯаёњЭ#m/Mи"9.вy\ ЈЌЉ0–t‘ТЌ8™ш ђ/КŽ7\Gе–U=.]>sЧ1ЅЧјqhї еoєF!,кDMšiHЉ›@W‰Єы ѕ|Ё3ЙЩА0жВ…nXkr˜сrBƒ—™&uЫХыПUC ЄM p0G‘ъЗInш[˜OHўHs†> Y0Оa§Фњ\b# ФH B€Ўш˜Я‘ ИнЎFo$" ФФg†3рУЁKэ+kа%kdы.Xb6ЅЉD˜В2qЅь”ящLHБfСŽ)чmхЖФ%ЊІQRxŸ;NК\&K˜"­уQ_Э1Yлˆ…mЌЦl5„ЬƒVД%e/p0ДmЎXBЉ4Ÿ˜†ЊXBщ‡.- WНфжв.}бѕC—}'t%}Хв>Yt‹?МRЉ—wШС';jФD’fѓеs‘„Iд04В@y™Ос fОdџ2)АћpБ†щ†~b(ЬLBy•WЖв>Ÿ;wэим yЙЭ-›іШ‘Ѓ8XQіEэрt:u7Є(Š№x,dў!kx‹I'ШяW|YPUu ЉiщHIIьм]‚S33Ѓ ЪхraлŽb4iвЧЊЋ‘ЃfrqфшQ"77Œ1јEiЧh"BХСƒиЛw/ВГ›"))‰Гг ‡Ršd(Ћ5В“СLhK І^ у™lkW‹Š4Н]Ф”ZЊЧеРЊqСKъ™x… Ј№4сpEažMYјвА0яVK1Жй{ъ2НЇгГЅЖЂєшYДеXРџi…qБЄѕЈ1aбю Œd3˜Хk•э^..qБ…Ovн‰~$ Lђ6ј'$FШиF=–ЂzАгЪ…іСяї)oж,;~ќ 9Эrсѓљ––†Э7Ё_гLˆ™Y№чЗќјѓ/ШЮЮAeeКvюЈЋlЗлЪC‡бГgO8“’ріx‚pш…DЂMsrž‘‰M›6 /77\ƒ’ЬКЩ­лјЃ^p3IZzŒk§€ЂЧУЁЈŒM3“?dвлЅr\Ќ МЂƒ)ќЊvœТ'…FS^Љ€“ГdXЈБЮdрŠBŠŽ˜\+gа‡е‹)YсжЇXŽ ОјJЯCEиRдиЊЌЌФБcU(**2[Чp%вДB•VвOY&зrщЅ2{Wю"‰Ќz›NEYБД…ЙnIќ~МЂ;\71Ÿwзыдž())ЯW†ккZ­ЎA•g„дУ€›6#5е… 6рЬgшвщїћQV^†Ю:ƒpееСуvУуё4|мnИъъРаЙKWь/лЯЃ*к0Т%ШЫHƒКД ЅижШШ›NвQ3в§p&]Ї‘чЇсц'‚БІИ˜Т~ЈW5дHюнXDЦА_I)Sјл9ШЬb;*cМТок…І {™GRУИъjУJЃˆ$‘щƒŸ”$SŽœ.йRz%2 \u.]rљТ/kT}=ЂгE_™Ћ!s] ‹Н‡s‡EЯюнёыЯПрсщсеWц МўкЋј№ƒŒ{ЗHО‘Цq„^уИє>7єРИо1ŸŒшњзrщЋUЬžŒшх:‘ІЪйТ•јЫнїрœСƒqї”)8xр€)[8–vvˆ9tЅЛbшЯ+qш G…зчУЪmеpgvEљ(оЙ [ЗnУEі€ЃКJ—ЮЊЊ*dffСсtТUW ЏЧЃјЉЋ­…гсDzzЊЊЊРЅ1ЙLUдˆcљ†о„›~“iМДfkщ/=ы;МЌE<#“2ФdжaИДс‹"њТoПmХ­Зм‚ўЇ†§ћcвM7aпоНКс‹фр‹ЂсK/€‘œ.Y#8xЇїэ+OFъшЃФ_*teєЃРYХЭœё^{ѕеФD*gCre Дє^Уђ0чЉЇ№є3Ят??ў„^Н{cи№с8cр@ЩЉЪdЏqToв€-вqп’Œ!4PљH… \z‚g˜ѓ)Fc>,љіF,Œэc™Lf;1М\rЖpyy9rѓrёђ+Џ"-=ГŸœeЪŽЅ­ІЛ|џ~[uOŸ6 ћыГ№ИнAЏПі*юИ§іFсƒ˜B—pь(š~)2{єЦБcЋ:Š#GŽ€ќ^ќјујfЭз8|Ј;ѕFFњ)HЎоЁЖVƒbETVV ??ЎКjxц2їг ѕ,АW}.[[ћбxрЅ6EIxis*fЦqНЦœ|‘цлs-јЂ(;]Ю œћвK8{а <1kКuя†ТТЖИъъЋ‘™• јі›Е5ђ|єылwпu9АyгFŒПј" pЮ<у <љјуxрОћ0А :ћ,|ўљВ ёџиЃ3qю!шлЋЦ_t^ѕU\8v,њіъ…›'§ ЧЊ@№‹~Ь{i.†œ}6Ю2oџѓŸСЖž9s†„^={`иЙчр›oО‘жЫuявнЛtС'}Xn— #‡CЏž=0bј0Ќ\Й"‰јfЭŒ6 Н{іФ“'у№с# 6mм„‹ЦŽУщ}zЃoЏSёР}їЂъШ‘ ў/WЎРЈ‘#pFП~xxњCpЛ= –,^‚Q#GЂwЯžyоy оzsњї;Їїэƒ;&пŽъšъ вМєТ шоЅ3†Ÿs@„šъLНџ~єэе чŠ/>џˆ—^xQіf\ЕjЦ‹ГЯ<Ю˜л#{‡O%KАе&FїЇъ”п№уЦЇќЪ<'Ї'Рeh=ŸjЭьйг9Іš4^Э9Іd зTCЩюXњйgxцщY8{а УЖАœюyѓцaкдЉЈ­Љ‘tеес‰'žРГЯўеВnЏЧƒЏПњO>ё$˜:ѓ^š‹%‹лRяќцyXјўXГцLО§vМПш}Мћо{hзЎ~н6^ћ˜zКRRжЂ.e +3=ћє…ЏЎ б…§eх8p :ЖщдI Œ U^ЏD"}хy‹дЭ;М^І-iwѕ`Ѕ1эєНm‡|}Пn.Кx<ію-С=wп…ЛюЙЫ–ЏЬ|јa€€ЪC‡рqЛБrе*МѕЯaйВeШЩЩСgK—тЮ;ЇрёGƒЯыиДinЛ}2жЌ§§ћїЧ› р‰'gaйђ8x№ >Xє>@РЇŸ|‚Я>§џ|ч<џв\ќ§Йч№ћПƒˆАiуFќпmЗсЋoжт†oТ§їн W]]№Œ~лЖ Пmл†ё—^цыINIС‹ѓцсляРФkЏУCгЇУяѓ‡9aJіьС”;яФ”ЛЅѓ$"<єр4 ]ЊЎЎЫ–ЏРћ~„§ћїcњєA я,Ц§їо‹iгТт%KБ~§Џј`б"€[ЖlЦ)=zbЭЗпс7пˆ0ђќѓёљђјlщ2ьиБОџ~№‚м~Чјmл6Ќ^Г`іЌ'Q^^ŽХK—с‘30}к4lйВ ТџѓLКљfЌ]ї=Ім}VЙ [ЗnХŠ/WaХ—Ћ0hШа0•ЯыУ/?џŒ7М‰/V~‰SN97Oš—ЋЏпЏ[‡зоX€е_ЏСyчРо=%ИgЪ]Иыю†ы>ус‡‚}Їsч.СіюгЇ/A€рЂюЩ;wтСЉSёрƒгёй’ЅиИa#>њ№C^-=ї[Ћ‘:iТ”ЮiР6zЗT&EЊЄS)в> 4Ъ‡Рч=Й,xЙьV˜єЅf Л=n<їќѓ1т|<0uЊa[XNїУ<‚к:yфЋ>†YГgcзЎ=xrж,ЫКПYЛГgЯЦп_xзпp#^}c^zi.–}ОЬВюC‡*‘œфРи /ФцЭ[0|јpфф4EEХFсAiЪ†ьРЊx#ШOнp$U‚2›џ^ёХјхЇџbЧжјьѓ•јfнёеЪЯq№рС†|4чыЛ]nxН>јМо(Oз?ўѕ6’ŽАяќ>oаћeпš“љ#JН•ѕbƒakИlЂ`~sk=HVщЭj`!ЦМЮњJ?дЫDd•tQu„ђ9’bšшЖ Јы’OЇœFuZZЄ1(ЄЁСа#™ќQЦ мТŸБ-* …Ѕ‰0f#єИнnджж"ЗY3Ш­'ZЖt) ŒQЃGЃE~>І?ќVЏ^cЧЄyчЩЩЩh’•…nнКbР€hйВ-ђ[рВ+Ў@mm ія/HŠ˜““ІM›тŠ WТхrЁwяоhUP€ FТќ€АlЩмєЇI(jзНzѕТр!CёУКяƒ ѓrѓ›л з]HБkзЮ ‘,њ§§~(F]ГЎ]К"+3ЏЛеЧŽЁЂЂ"Ќ­–.Y‚AƒaьИБhнКzdVЏZ…ЊЊЃ )))hб":wТЌЇžЦ—+WЂККЫ?џCЯ9ƒ‡ A‹–-pх•WaнКя1;ьlщœлДi "BAA+фхцЂuЋV=z Š‹‹ƒѕg`§"HсїљАјГЯ0эСQXиУ† УиqтгO> ъЮЯЯGгІMаwHiLеѓLTв!ъЫЇњ#lнЯааќцЪІ`ˆ e‹ЉйТƒЮ„‹/ЙG2e GъіИнјз;яЂЎЮ…Iš„нЛKАpбЂр˜dEїО’R<џт‹шзяtlћ} :wъˆзпX€ВВrЫКНцП<ОџоќЧ?ё§їы0gіь >]К 0‘жtxЇаЏcдЌ9RwяСQцУкЕ?`пЖ_–žЂЎНАџ@)ЊEйО,ќчыИуžЉ<Uп#8“’’–†ВВRdffHsђCdћя[Ђh59)ћЫЪ’–gRпяС‡—о\$w­лЦђКїgђ!йеuШдRГт1ПЕТШЫ„g!М•ТУ3™Н‘”вEН0TиМ‰!b6ŸBјw2Јl%“NОQъ7жЅˆMu#=ЅŒ1•ЗЁВCAdл4ќUR^yџ%ЖгьSšŸdt тGrr2вввp№рСР=ŠvmлEw5ЅњјEДmзћЫЪк–(PPVV&]їРV,ЙЙ!з]ѕe}И—ЂММ_Ў\‰ОН{Ы8ЅGgF ;M•Џ‡ž жtФ(ь{,‚%‘•h…†іcSœ3Ё?p†UO—…yŠFњj,ђля%ГOДlсЮ;cяžтАћFЏ-,ЇлуqУчѕрoПƒ‰W_…зпxGW ъшЫКo›|;D‘АsЧ6РžнХшаБ=юЛџьиі›%нЫ–}ŽХŸ-СЛя-B‹љxчНїqех—Ap:pе•tъЖяк ЕuЕЈ |\uЕpЙjQчЊCЋ.— .wмnWpA›зызыЯчƒO#Фb{4RЎ/€gыWјњƒyh–ЪpлїсЦI7ЃCQ[$ x}uи[ќўћпџ@Р1ду№ ‚€ььllоИNGRнзЯ7 §6mм„ььlг;[sQ|кšьŽz3Ыob(7XНSBь{H“м#S+DИхt*г I~" iшRNЇЕ _йЧў6^ЭoeкSшлxхћ€BІ#*O} kЦ€ј<А^(2MAA+ь-) žyщўRј§~Дjе*Њг3†АЉ,еC‚a­a‡, x›7oŽЧžx›ћ›ћ[џи†{яН/joG xЯ@R’єЮЎЄжiIŸŸyyyјў?џХšoП“6 ŒxэWPP€Н%%AнЅЅћЄѓ,(_ЄџъУњцх7G^ѓц;n\АО[~џяјaј5”QКЏO?ѕцЮ{ы7mЦu7\<ž”” ЏЯ,?77III(й[,ЗЄd ZЕ’ ~!њE\уXГі[Жm+M­щ*нЗљљљ!Ђ†є­АwoI0эўв§ыо:”рЂюdŠ№Ю*ЗdТFЪєV]їЉо[кїWУ}ЅчоRПЏєАQqЂ)Еѕ˜fІЦbœж;м^рв~кZ.НгбOVрвc W:€КкZSЖА’юУ‡*БoЯN,^К UGЁђр[tяју7ьјckX]wэи†?ЖnВЌЛyѓ|,\ДщiЩиілfјН.,ќрCЕ+j>:vъŠКЂ}Ч.(ъаэкwBЛЂŽhлЎ лЕG›Т"Дjг- ZЃEЫVШkоЭr›ЃivВВšЈ*?жoъ6ьBђžЗа2Ѕч\tКtщ ‡ рк[юEЯŽ9p n”UТџVПŸk7|hЉЊгсp ЗY3ЄЄЇтЇ_~EJZzxќ§ˆOjZ:~њљЄgІпs9‘РKЯТhcрE&ѓЊ?–ф %ФбГ oPIГf&р‹”ѕEoЅ/z‘ПŠ‘ЈвMIРй `jыСўћєьйН ›6n@yyYDmЅџъНFnA—D1и………јaн:ьнЛжo€Р\tёx<ѓєгиUМ_­^Я—-УХ_5­” ­НлБ}ъъjбБCGTWзDGmАцЋЏPКw/Мё:Ž=ЁgŒœС 0fьXЌ[ЗЫ–,Сž=ЛёєSГЅіШЬMz]223P\\ —лQЃFaХŠјјУQМc;~§хg”юл­uYv‚–(ЉоCЁ:TюЭ`5ЊАEPпŽС lЉ?DьѕnщYŸK*cЗЪ 1g –Œ—ж‹Й“ИєиТSюњ 0e Ћщ>TYuпЌFyй~лtЛ\.YћнхrYж}сE!ЩщРž];сёxPКЗюКj\vХТBMM5jƒŸде>uЕЈЋ­ xПърvЙрvЙ›ŒЙсѓzсѓЉ/:ѓћ›aбџzbг‘УИьš|Œо ŒЄqлТB 9 “а­cR“Ы№й'пшЊtV“&h_T„ЃGŽр—ŸAJjц€шѓцhњсHIMУџ~ќGEћЂ"d5iТ!щ„/+:Hѕ-ЇйМЪвщѕвГqnŒоІBљ)mŸч‹ЂЭѕL о/ир§R0эЗє*oъ#з­D”жН{wќыwБmлИіъЋqѕ„ јшƒqфh ZЕТ‹sчbомЙИtќx8œ<1k–4…BOnC_u#0ВОрВЫ/УјK/Снwп…бчŸЧfЮDMuuЙ…х#€ ІMŸŽgž™ƒЫ/Лп~їmPн>љьмЙC ТрГЮBы6mš’ЖЖЃMыжxaю\Ь}ёE\ˆ\уЕF=тБސэ*­ р ~‘Aр‰С-JПЛ§ .0дСхgЈ&†[;9Pq№€lЈХНЛwтїew€ЅІсЌЋч"3й ђ6?Ѕ)Рчѓс“WoЧЖН[@,Eщ:юДiз^ѓМН^/JіюХЖ?ўР‘У‡QTT„-ZРэr#%5хee(оНЭrrаЙKЖi#Moс;aыwŒeћ•™Ћ€œ*ухжСL~Х4Šf:ЊШt”ЋЗ~Lчщ1ЕЏe31 ]к*˜rŘњUb}SНћ24Lw_в“дсt"99EzУFП(E^E‡)))`‚ŸЯл Ссp"99Ў:iOУф”iН”ЧHKЯ€л%щHMKƒзы…пяc iiщЈЋ­8Ixм. ЮЄ$8N0Ц Š"мn7BJJ*|>/ќщфЉЉiС@‡ЮРИъѓyсїљBкJ@RrrpЪIч@жЬ‚р@RRc№ћ§№љМ "|Лv-žћы_Бlљr0&@ExНž Qšˆрѕz Š"œЮ$0†АЕНNЇ‡3˜жяѓСч“кЄОŽD"м.Љ-’’“рp8AD№y=СsOŽh ‡УЄЄф`›yН^ˆ!гюkkk1№Œўјїџ~Dnn.Hсёx^@†єєtдеж†’p8HNIcќ>i-A\їККк U˜Иі‚ %5Mšўяѕћ–  Q„ЫUЌЗЪЛ3}Џœ4QвgЏi›ђїг4ідR}Ag-|l<[ Љmэ–о-;`‰Œ—/_уcѕ,maЎ;р=ЫkŽЗИ?R™ˆј‘"ŠHD$3B2FHf"ŒС!Œ 08Уч•зП”`*cђ^P`V?Љ[щiиRu*žq)вS3 аAxS Т„ў ЅЋ>Ќв2вu5jRRк"3#ЅћїЁМЌ{їю­_р€ЬЌ,tяо ­ ZЃYГ8Np‰ЧЫ\€№ ФЬР…єO вјAO ЅМѕ_1­T!Ad‹VЎSш#–ЉЄ }\30*“<€EЅюИђ4ќE‘lўEи_ЪD=›ƒ9eР)2€8…` ”ilЪы’ Рd!ЬяѓЁЮч“}yсїћP[ы“ЩуE]p–ƒлхЋf=T‚Y}нkkЊƒчфѕz  ыžЈђмЉѕљЄpёО8ѓ…ж?ДлЗл%Ѕ!m#њ}pћ}Šw—BбЂ”Oю|^/|^oєЃŒHІŽигЪЃQ оќ>ŸтˆPџгуrЁЖІ&ъЈt="ъъїУW[e€†_ї@}BъюEджж;^§9Ћз:bЅзNеЅ+† eЖєлPЈF‡-UdДL‰,У~ЧWЈЕXкТ\w |;KЪIрЅж~|Фр nb‰Су<ИХ€Ї‹ИDЩгu[gЇЂЇ+њ§Џ{ONzУщEM4 выѓ!ЩщDjj22вƒoBЙФY3M–›)№’Бў ыaZU2–_—‰щШnч+ ЊTO[O:Ічє{ЕŒЄеђ€Љ_5c^0}=@џxУ`hh2|O1#нбpffяGтp8рLJR„.›ž жRj›Œ!==uЕ5AиАmџ"ЦЁН€e ВtyГЂ4hй[– ьx…-3§им§Ш+~Ж№ЩЌлvO—(њ!B.QD0PРHd bвБњП™ХЫ vlћi’1†ффd$''ШцА“8#€єУ|…{Ќ,yНL…ІW№\щЎ‹К‡J>UD}eГGx{T=_iЂNЧ‚їKХ[Ѕш§ЂМUъŽ,{<`aЙѕxС ,rъ•„щѓ†Z—фсDоІ`d)оcZые@пL”N•Л‚3f$OŸ_Хf ЁєdА`Ме‹Hвк8њЬУ•A˜Œ;dєiЎŸ=AЫ”Y„ЈуЖьЅ“Жтa sні‰ГdO ZЗ ьТЄ§XˆDщЇє{`o9Q1A}A,.ЁƒcJм?ј2ЅЃ1с+КMH‹њгтдCSiу ` ˆщš2^А№g2ЉЎ3 aj ІdдъŸšЎ3*›V ХЕ–z PY*“­;Г‰_ћбbЇЁЊЉЦрƒ”LzHw9dЌZq‡ЌЦ-§e ЖШ@?ГДf‹У–хћ Kаѕљ_рІI“Ђk…х ПY`p`ђQ”xЧхЂe%иБ™r€EЌN5!™Ш=ЊuŠ(D‘sд[ДСћЅЕоЌЁtІГžFЮ›"€є>ЕgџQФu‰j?ЈZLGћЉNЁ эц'ЧLіL-5cЊC-SyёaФ,тff!Љx—хbІѓZšrh:а†М‹J4)xЌtыбЮ/J;gЙJЧ‚ž.зƒЛюњ ­BГм|\qеUшyZ?јќ~МїоиКЃЮд Н`кwяƒ*АqЧ.моuП*\ОТ dы№ЅЎGлеЅЎG%П*€…љ•4Н_ |ќ,%P0ћ ,š'˜„щ1R0oф`ŒL70ІdZ`Ѕ•зœ5`я˜ВЃёЫж:™зa*o,р*–€eВ8h™LnВ_ђi„\И„‰ДO—HHr8qЯ=ї ЛY.ж~ї=оzы-ЬщнжoРО}ћ0yђdјр€›96ЌGaз2;Оsсв№%ЭЯ МЗM4p‘†*ЩхS-W&8‡VКHсЄОЄ‡˜bКапdЃЊ@“{^j@“1ЕpєrЦгJЦS*Cm.žі”@љМЦМUŠWкf˜В VЗј 3ВlЋщ˜FІдвК™I+тЅ.каШg42ІоpьњгЊт‹ЉЈ‚ђcžhщ<нk­nLlW А˜Уa‹KlђH#ŒЦVз"б>ЏрєBiј)*j?1Œ9яјЊЊЊ’’‚ъšjTзT#ЗE+8!РicуккZ~!И$|е}Б=ТŒ +‘ЃсI•s œ<[)УRtй‘S`,ŠіЭЈDIlаЄ k‘FŽ„‘ŒйШуLЮаQ№В)€Щ€Sў"X†к4ЕНХHШ4#,ъ0*˜N@Г vяƒxТB“†…iО#PЅLE†}КР,–€+ШRIM†jЂ Б-WвbDN;І†п #‚rит’РтЌЈTTVт•љЏa[ёN$ЅЄˆрѓља­{7 :яМ§6ђ[ЕХ9ЃF#5ЛN;э4lмБлі Й\.””” sчЮ еP•••ШЭЭх=І‘сЋЄЄYYYШЮЮж~‰˜›SР,N]” }ІЖ XDЁL6хKл FВиc„…“l o˜n‹hR˜jЈЦд RqІЩ‡ЙW…*ЅPѕ ЦН.H3pг7rdлиzЋшй4X_^cu2WњЮшtОˆн_ФВ4@ЫД7ЋБAЫXГmccВ~Чpитr<‰Pя {oс{hвД ^zщEќѕйgсt8‚ЋЧŒ)SІ iгІXѓѕ@ff&zѕъeK%^}ѕUЬ›;№г?сo§[B5вЯ?џŒЛІм8|ј0&\1ИнюКƒ4ъљі+uд>ішcиКuЋсXњ˜лW.tK„АŒŠ6F щ’YžЉя+Э„Њщ‰г’Ё:EЦFUЌlXк†VЮYЁ[GЗВю2УoУЈ+ЅZџЈ[Xe\ˆдѕЇђНЏ0К™ЛMсі ™;;іc‡zZЅГˆК‰Uюs5НJу‚С/еŸ@ВЩѕ?бdu™\`в0 ˜ЬVОe—уGœ%%{сіx!њ§`'<^/˜#)иБ+++сіR›4EГм\м%yЗ*++сlв @ВюТІ>0џћпџТО{ђЩ'qњщЇCє‹q?љ ЮП^Џ7ьЛїН‡цЭ›+ОЪЪЪТиБcбДiSTVVтЪ WтЫU_ЦМ^K—-EZZZ\лgЭš5XМx1ўі7{!xъSqкщЇсŠ+Ў~їілocЧі˜1s†цd+o­{П€Шщ‡ пш}ЯhжІ­'&^0™ЁЉ)‚Jc‚z>#сз5jFЮОМYfы`L—ещƒtзу.€ГДДпЌYƒK.ЛѓцН‚ЩЗO†#)ЙyљHJJТЖХјшг%№1ђ к`шљ€ˆАyѓдУ”SG*№кыЎХ…^1IIIжO=§:vьќ;''GНСœN\{нЕQ!Šb\ъ•ššїЖёy}‰!…Ьmаѕ@5ЕіЫnS KІЬ?†ъ`ТЂъ.VФT Т ˆ)=Ы™’бХфуfдЇVŒЗС”’ЉB)SšњЕaЪHЄmS‘>U „eдшД*ЬО!ЂqЁLl<+SfЅЎdВzdИ1АВL€Yяmv‚V8йаы9lq9оЁkюМЙ ~9"1ј №CŸоНqЪЉНс!(РЭЄ@ƒB-† LOOGГfЭТО›?><юМѓЮЈєЛvэТпŸћ;vьиЎ]Лт@ѓќцЖ5@“&MЂъ_}ѕ^™џ ъъъаІM›рїuuu;f,>ўфурwУ‡ мџ§8џ‚ѓcV/"Т{яН‡їНПп‹Ч_ŒnИ‚  ИИЯ>ѓ,JJJsчЮХЧŒяПџUUU(,,ФАсУ№хЪ/QZZŠ>}њр‘ ==›7oЦЬ3Q]]:рўюGЛvэызЏžп;яОƒ–-[Цоt!Тлџz‹/† ˜pх\rЩ%Q#љ_|wпyHOOЧ%—^‚ЋЏО‚ Ю) т`ъ№$?:AN?—йaк9ФД` ž1#@& eъ@ЅЬ”Џ™6UлюˆЌƒ3z75vQЬ4›гDVЪ&Š" U6WљxVЃC–E@Вг›ХA‹ —8BWаk@бЫ"Їр‡Mу…Ь=З’\кЈ9бвя>Ÿ<ќFŒ83f<‚W^yѓцЭХŒ3lД№Ѓoъ]Лvс™9ЯрўћяCзЎ]БxёЌ[З.Ђ1~_ЙrHЦОmсЃыЕzе*|іщgxќёЧ’’‚'žxйM›т’K.СђrTUUaС‚7рёxаЂE ќўћяИцšk0hа МѓЮлxбћxќёЧ““ƒ3fbщ’%ИтŠ+аЖАЯ=ї7ЄЅЅcоМyx§Езёју єъе Я>ћ РQПЮЯŽ“‹ьд№§ђ/–cХŠxійgP]]˜ŠО}њ }ћіaљwякnнКс–[nЦž={0gЮ3HOOЧјёуM˜n!f*zЂ€…(2`!єb8"Н D1=ИІ:dИIЏі$[І2LۘcбQщ™–'ГO–‘ЭžхyM1ЏQаaLЫ`b 9Ѕ§ЮЬб™И%lЫРl'ŸXПBвiœ6Ж~}РCFѓk:дШPЕШDГ@g+Ь#&Œf%ДК=Џь˜њЧЇrIМ!моMБœDb71iЪUp!.‘а0+P81 YiLо|ѓ-М§і;€‚‚МђЪ|ХД[ЗnEmm-&NœЦ&L˜ ы Г"љЫ_‚ž‘ГЯ> <№жЌљœsЯ=pЦ§%шR‡Уaћu­зШ‘#0yђdЌXБ—_~zіь Иік‰xџ§‚^ ”””Јѕh99йШЭm†БcЧbљђСМC‡СŽХЄ)žYYY€qуЦтo{.ЬX‹ХљНёЦќуџ ўэѓљpжYgJpЙz5.ПќВ З­џ~јщЇŸB ЋAВВВаМys4oо7мp=/^‚ё_Ж™+3u“EokvЃ\DУІщI2aбЦ†Џй"ІС2ЙHсZ3-У(œeЇ *nгЅьIcљЃZXЇЅІпЫ п:зx™vDйфСВ‡cѓЯсF€4sхы‡2ЃG—cЭ \щ‡AЋ€Ѕ“ЇВŒї]ВIМ Z\Иш„.5D<‚р…zCHtЌр&`цЂ—]vЦŒ-юtЊІ=pр Ž9‚QЃFПѓћ§pЛнHIIБЅІO0hЬЇІJ**++‘ŸпЂQ/LhНвггххаВeA0MЫ–-qрР]њВВВрvЛ!Š"A@ffъъъHSчЯ%%%HIIБ­mефђЫ/УЈQЃ‚/^М8x.РМy/ух—чЦbBЋV­5uтРrUx2 `’]o€5фЖфkDГ2U0Ј^Ќ”Œ&uSлРT Шд ЈhЈb:€, ъH EHg`І<ц@‰й '‹Ae5lЖЭeнй0ХЌl…+\vVAV8аиs/rатТХш ьЕB2!ˆы!,$žk§Ÿfn—ЌЌLны‚š5ЫA^^о{oaЬ YГмЈњфччуЗп~гЬ[ФчѓiЄ]ѕ*+лќ{џў§ШЯЯ7ј€}c.§>gЮ3ИъЊ+1fЬЌ_Пsц<€т$ј|ў˜Д{“&MаКuы~б$]Эš5УUW]ezЄММЭšхЊZ6–МW‘™Z†–М`:!L]ЏмыnћAЌсk…•PНbк0Іd*§€)e!jДЏ:P‘0‹РtУ‹ЊЬй52H†F–P gЏНHц‡›Ъ4TiТY рJƒVЌ­ˆ;`й YЪФе(€Фзhq9оХяїСG>L„ њђƒ˜‘„Ря&}F ўЮ‚аХющ‚Ь0‡7…ьW‹‡^ZZ:***pфШQœzъЉ`ŒaС‚71zєЈ`ДРаРVЅЊЊ ‡ ў‘‘aУЮХТ… БtщR 80И'—8dddрыЏПFЯž=С‹i ‰ѓЯ‰7оX€nнК!99oП§.Мpœ Щ"‚лэлшД  ;wкž IDATюФіэ;  љљљШЬЬŒyч>|.|mкДAЋV­АџўрДШДД4cР€€элЗcчЮ№ћ§xчwqоyУС“iя•M њH { ,$Їj8‚˜XЉ{ХTjЪд7AeаіŽЩYC™LG~TбfƒtРЌ*Ј™ы˜6Р[#ЩёP'гaчЩR2ВY'бa+XiР•ъŠ%`щЋŸSќl†,Z\И%ЋId @КHc@#Є8€Hqp„d8Р)0 О‡`Ќ1gЂXЯž=аЖm[ЬŸ?SЇ>€ЇŸ~ §ы_Бhб"ddd`тФkl…ЎЉSЇ†§}з]S0nм8<ёФуxх•W1wю<ЄЅЅЁ_ПгЃђ ‚€лnЛѓчПŸЯ‡›nК ]taЬкцМѓЮУСƒxшЁ‡Ѕш…_ŒёуЧ[ж;eЪxљхљxёХ—ššŠ=zКvэ‚aУЮХнwпєєt<іиЃшкЕkЬћРиБcqфШQЬœљ(jkkбЊU+Мјт С /М№ 8rфІN†ъъjŒ9"lя/#р O–І!& „ЩыRс8€˜ŒЉzХ`L @4МcЊ@UЪv›Ц5ж fЪƒЉ]fаа#ѓдЅЄбН_ЫV Ѕ&’“ehzМШb­ф7WІЮ €ubBVx•8dq9БЄЖІ€>&ТM~д‘ˆdADЩ‚фЩJfƒ\ѕž.A ‚Р yЛ~нј‰ŒA "1јСр /ƒGd№Ђ!dМ›9р"ЕpрŽSвp№@9DбЯЏ —ИЪ+ѓ_ЧуСwоГ2˜]sЊ,A˜ŠЅk ФєщГf[3] ˜Q=†Š`U2Sе2ЄЧф…cV{‘mАФтSLу0•mxe—2ЃР@ЄkёVШh2c€DцOR?Ќ%:`%d5ЈсХхФ‡Умцљxi‹ щ№#•‰H!?RLB—“7).њ&–,žАА_m№†Eш UdЩ#ІЄšŽ*uƒ˜F$_W•щŠЄ?ЊnЄоzє„ы2p՘Iу;TХg?,:qЈЫІb(Žu%cYt—]`І˜дТFСБ‚ЋX–ВВЗЛиGДИp1.6@—ўяМсчЩ~ПjѕЊF9љDЋйњ&rc)џwыџ5€йa! ֍쇑g‹5Œщ2 "eвQ€2=`fІHЅNЪРЄПЕcmё‡Лу†b xd.;йЌл З‰lаa-;й{yb X6C–ЭPФ!‹ —„€.§’h`pМЪЩV mЈй a!ЩH3gZЋxУlБXӘЭ@ІЪl30eЄH9Ѓ hГo wCЦ•RЬыfаШЦѓ ы'kАŠ\Х А8dqсТЁ‹ —“Т,ƒ˜Š7Ь>‹k‘p0fƒ2 0S*ІS—UH“Oj8ЦЅс2­УIz‹-5ђ~Чš)&eˆeHіЈqU›ц?NрŠ.КТ‡~гrсЂљ0ГЫfˆ…jbВП‡$93са,ЉGза3J1Н5#эЏДJfњш(ЫмЋ)€іЉл‚ЋЉЅFЊ#Y;5sфeSYfСё1§аўŽЩ!‹ 6—З їtqсвˆ–X ЇщƒЄ’г $1MгQK`&іо`Ћ0ѓО FЦZ_Н1Ѓ ЫТt{ямˆl o—yZˆх)ФЊl‚ŸЦёqРтТхD]\Иœ„ –80fШbe&СЬœ)ЖС\‹йъх‚щЋ—{ƒYл8QшŠb_„Љв(&u!ћOI3Уq6§.КИpсrr€˜Œ+AŒAoр ІŠЭPfЬbh:@M—2#Ёч›bŽ;цВЅ’[ѕq)K9ЩоГЃ8–ЭjБщАИpIИС[КОї.Йф8œЩ ƒ…~˜є 76.\8ˆ™„БpvВС3fШь2{РLЙ.FMхŒ,ƒš|Nfћs$Ž0Ћр‰ѕŽiе)v%к7н0u‰G™1„ X\И4ЎЌ[З)>7Fž3Иa ’о R(8EќNЁ1/Ю­›ЗР9aƒС…Ы bБ€15 3э“Е\ь†2{РЬЈ™ЦєжEЗrsюТL`ŠŠ%Р3)!‹Пк?н0N‘%)vэЏ‡+.\[њѕыTбcYsкƒгЦТtPФ'r№сУ.'1ŒEбмdSX{ Ь^0Sбhв{fж Цb’”?PnЙDjhZХБqW\И_’’’Œ48@ЃЦ 9f"…3555 B’ќЋП^‹НЅћСRва­ћ)}сxЄdd†Uр№сУиuрЈ{Џ(8уТ…ЫI c€,6PІЬЌ­ S ™yдіК7*IХkКт‰ѓ„В?‚!5nн)іѕ‰чT@W\Иœ@6SрчкЕп"'Х!ћcOЩ|Лr%Њ@ЧЖ…ИєЂБШЬHƒпчЧмysБgW1ъjЊq§uз€D?>§фSЊ<ˆЬєД†@D„7М‰яж§-[ЗС!CpрШQlиАфHЦ%WLˆDјщЇŸАk9вr[№+Т…Ы cБВи@™>0# d§ьBšzщd3Ћ4nœТп(OфBJМѓ‹#р5TqАтТхфСƒ!~TWУЊ/Wсœ3ЯDaAsЌ^ў>њ№#\§Dј|>lоВ=јše7EJ’‹/F—ЮqУсз_~i€ЎхЫ—улЕпbР™gтњ›&9œ№УГЯ>‡’’’`С?ќ№ўиГO9E=zѓ+С… ВјAYЌРLХ$ƒ4fo‹˜]ІПf”8v’‘_Uo$рkL т`Х… —z[‡aїюнhнІ Кuя†&bь˜1˜3ћIдеЙ*Hi›чхЁIf„Рѓ4=#M›6ХЙч• ЫэrугO?A^^nМёFN'ќTЋЦ‘ЃGQPиp№РAlоДEнOСЉНzЁП\Иp ‹”™3kt†…DфТ… —F„2у­бЇjиДКНл8$сБрфНgbGTWїЦ^KЦэ.\Ии`KЄЇЇЃb_e№яЃGТ/њ‘“ЃKŠ‹‹K—,СВЯ—'’SRбљ”žyСhДlS/ЅЅћžž†Іййpѓ1Œ .q0†ь3#S №Ѕ1ЇъДSЩlЭ,žФ‰63‘тЊрD˜jШНT\Иp9БЅ]QжџчќЖѕЗрšЎ=z --фvщƒЎšкРнwп…єЬ,ЄЄg"ЛY.Ш™ ‘xcZЫ…ДœfМеЙpсr‚‚™ЭІƒHb +ё‹VHЧ%’ф<(Бл†.\I233qоˆѓ№эЪ•X^YŽNэктвё—ъЮяšч5ˆЂˆŽ:РG ~<€Ф@Ьe†Œєt­:л $ЅžД~ј№aќўћя№‹gRA> cќ'џЩђŸќ'џЩђŸќ'џЩЦљgНxН^а­k7фdgл№іJк Ћm›BмxуHD$AD@„””dМ2џe8гOМцjиX‹Hђtuц@|Жd)^ziњѕяьмцЈЉscлю=˜4щ4ЭЭtщвџўuVЏ^VEPMpJŸ“ ИŽ=ŠЭ›З {ЯžШЖzЙpсТ… .\ИpсbПЭ~ф6oо„S{іDгІMН>NhžŸGgЮРЛ пЧњ р'†œмцшд§ЄЇЇŸжЗ/ъиБЏ Х;w"Їuл“ююмЙНњєAЧŽž‘С{4.\ИpсТ… . &Е55Hr:PМ}њєiќmЎ‚ћtЕnеЙчˆ@ШєB"Брš.СсР€3Ю@oц€›д6d‹дееˆžžоh цŠŠк#ЋIЭДЧŽd…„—фТ… .\ИpсТ…Kl%ЋIЕЧЎтІuиЙДTЬ4”§ љ›dО‹—м{я}јёЧŸdM™rОћю;гКнnЗЎtiiщШШЬд•іъ №экЕqяduuu ЅЫЮњpсТ… .\ИpсЂG22Гžnmfš"ЫЛ“ЩЯЇŸ}†kЏНcЦŒХ 7мˆ/W­вЮРMЙcч8Eэл›ЊЫ /МˆE‹оз>R–-]Šбœ.;рєО}pзw@ХFщ\K—,Сз_—0КьЌ.\ИpсТ… .ё`ЛKЮЦ8љпџЏНњ|№AtшиЅЅЅ–Їр;жt^ЏЯk:я‡МЇNХ=їо‹s‡ ‡ЫхТ†ѕП#Ц[М^Џmavэаeg}ИpсТ… .\Иp9Х:H.(CŸ}{ї"??gu&ZЖhгњіEчN"мp§ѕXџыњ`кёЧЎ;ƒ“*.\ˆKЦ_‚ WLРŸLwћŸo—ІђЁњи1<5ћ)ŒПx˜ц‰ЧC—ŽpжРјњЋЏ‚пПёкkшеуєшо Зоr3jЊЋŸ}њ)†3];uФ9ƒnПэVtявЇїэƒgчЬ ъЈ­­Х§їо‹ю]:ЃЯЉ=БrХrРў§oЖAQaьн[XБ|9†3Н{іРДю‡ЧуQ,/T"u‰ЂˆчџўњŸжћїУ› „гщ}ћ kЇŽ˜іР§Š:Beњƒг0 пщшвБ.9/Я‹У†ЁKЧИnт5ЈЎ–жХ-wнwпсмЁCаЉ}F?ЅЖЌЋЋУїн‡SКvAЯюн1њ‚ѓБsчNРќ+.Н=КwУеWNРўвR>rpсТ… .\ИbS”ьўЦ‡.вГgOTTTрХ_BEE…ЁМ]ЛvХK/Нˆ)SІрх—чcыж­QiцЭ›‡ккZМўњkИ№Т 1{іS№љ|№ћ§˜>§!tъд М‡~Э›K{”]sЭ5јт‹ЯёќCw]Жnн‚ЪŠ \zљхŠiЎНюz|ѓн:мђЗтЎ;я€Ы%эX}ўЈ Аbеj,ћb9Жmл†ї.lкИ=zєФКџo§ыmРнїќп}џцЮ{ЏО2›7mЬ|ф””ьСgK—суO?УiЇŸ8cРlпЙ лwюB›6…(оБwOЙ=ќ–-_Ž_~ў п}GБМP‰дѕсяуЃ>РЛ‹aюЫѓёьœЇёлoПЁВЂГg=‰ўыmќяч_№З§YQGЈlјu=&пy'Оћспшпџ МњЪ|Ьzњ)ЌXЕЪЫёю;R=–;ѓ‘G№ЇI“№ыЦxщхљСЭs•кђёGgbћіmјtЩR,џr%ЪЪЪpф№axН^мђЇ›pірAјцлoбВeK<ішL>€qсТ… .\ИpIlшЪЯЯЧѓЯџ•••Ис†ёЬ3Я#§iЩiЇѕEЋV­pжYgbшаЁјњы5aЧEQФš5прOК ЙЙЙ7nМ^/vэк…­[ЗтиБcИх–›бВeKtэк%hŒ ƒУс04-№№ЁУHNNV§пЎ];рњn€(ŠиY\ hгІ(**ТиБуА}ћЖ`žœœфх5GQQ SчЮШЭЫУР3ЯDŸО}Б}ћvј§~|ќб‡xdЦLtщв:vD^`“kЦœN'œNiішвЅKpЮЙчbи№сhгІW]sMX€ШђB%RзЇŸ|‚IЗм‚ЮЛрє~§0dшP|їэZ$%'CьиБYYYaК"uDJnnђѓѓqЭФ‰ЈЋЋCџўg }ћі5f ЖnйbЊмєŒtяи‡У‰.]КЫRjЫ?ј и–mк"9) №Ы/?ЃККwм9yyЭёЗ§k!8 .\ИpсТ… ]†Ѕ}ћі˜9s,xeee˜3ч™zz]y-qшаЁp:|>Ÿўѓэ3f,ЦŒ‹šš>|@^^žmы­šfgУуё ЊЊJ3-c 999СДџќЧ[rіY8Ѕkќу­7сёЪЏ+ѓљ|xшСqzп>8ѕ”юиДq#М^<ŸЯ‡6……šeя/-ХŠхЫбЅctщиO<і*++MѓўвR<6sfPз—+WЂВЂMš4СЋЏП—^xУ†СšЏП6оžM›ТхrСяїўЮFЭџГwосQTmОgЖ'йєNBЏщи_EдW?Q)bE+bEEAEQ;ŠXшХNя’ЄїьfлЬїЧn–,^лЙЏk2›™9§ььљЭsЮ3е–sJwњŒ7ЩЬЬЄgїnЬyчэгжeAAvЛцIIѕ”їХХEДjй‚фЄц 8€ЋUxd@ 4­zе#zTѕјZ-е#„Tе­‰|4ŠШШHnЙхf&O~JKKіШ‘#ощuюВ,3oо—_Nя>}XМhїн3’m;wеЧi*ШнЋ<§N’Ž>лt›5oЮ‚В}л6nЛu8:tфHnnНui6 Iљyy'9t‰ˆˆ ::šп6nw @ ‚'шяz/@Њoэ—ъ9ЮqM…њчXКіюнЧњѕы9zє(999,_ОœИИ8кДiУвЅпrј№a NrН^\\Lqq1ЋV­f§њ \yхО*RЋхвK/хэЗg“““Caa!оИF#sцЬсшбcdggSYYItt [Зn%??ŸДДД—CЏзѓРƒёќsЯБрƒїЩ:x}{їВhсТг†sz,9.ХuЦїƒ9]nСbw8p:ощZ­–Aƒ‡№ь3OГoя^>ФЁC‡Hhк”ДД4іюйCкО}TTT0xшP~ќс–}Л”cЧŽ‘––FI,]ѕХ5ьškx{ж,6nќƒќќ|6or‹ЋеЪЖ­[БX,Дnн›Э†УсЈ7ŽsсlгнДi#DEGLeeХ)ы2 РЬх}ћђЪЫ/sьи16oкDUU5нКwG’e^›:•ммУфффxЇˆ @ ўйИ\.œN'‡ЛgГйэиь6jlvjl6яfЕеИЗš:›еŠЅІэЎНћP$—",уR%TIЦ ’'.'Z\Z=N­ЇF‡]cŒgљЊЊJ>ћьs:„VЋЅuыжLšє8#FмЪдЉЏ2fЬXdY&&&їKЭRR’YДh1ѓцНKll,?>‘$Я”0EQМжЋЧ[oЭтўћЧ!I]t“&=ŽNЇуХ_рѕзЇqїнwc6›™<љYЎОК7ўСнw$::ŠйГgЃѓЌщ9џ7r$~ўўМ;o.S&OЦl6гЕ[wЎЛс†S†iкД)у|;nЛђВ2‚‚ƒЙ§Ž;N!6ЎхЇ Иђђ>иэvТ#" р…—^тЉ'&qн5У5Ц?6џоy'У† уІn РŸ9яОG‡xѓ­ЗxaЪrss‰ŒŠтЭ™ovкВЕoпўЄИnЙѕVŠKŠuяНTUVвДiS–|Г”ТЂ"ЦŽM~^ссс<3љ9ыЃC‡gнgЮ6нŸž];wтччЧ€ƒИМя8ЮгдхЫL|leШС\pеbЕX„шњ‡ёўќљ|іЩ'8NZЖlЩ[Гп‚K рoŒеbi|$ЊŠЊЊžхYю5\ЊЌ‚ЂЂJ’{/ƒЊxЮKxўWЉ]эЅJ •[ѕDбхT8­шВ(`qЊTКрŽ&5фџi–Ўџ5ЙGr‰‰%)Йеyѓ‚(@ ЮŠЂq cЧŽзЄЩY‡ЏЕtН›­!@VМ–.ƒЊ`Џ.'"8ƒЦmХ2ШnЫ–VRбд™^Xзв%TУYFEy9‡ГR]]u’Ѓ@ @№ч‰­ъЊ*eЄВМœ№3ј083u=ЊЄ8Р{яО‹ŠтЖ€Ё Њ ЈžџUХГе§ЌPялjKKK3f /Пё&С!ѕgДІЦЪъѕПpЧ—x"Uџ i4‘$ЗХђВrбГ@ ‚ПN—“Щ„о`8'R;ЅTЉЮєBЏКswO3tŸSeO8№§,іц›n"+; џ3э;vaТOb6›щ?p ЇЬˆ^o ЁiТПВ #ƒQєf@ рŒЪёwmЙ—tеЎе:.ФTщјыКT`ЋћYД§єчтЫzcБXйДi (Ш ~ЋwMW}ШВLЫ–Щ@h @ @№cяžНIOCЉЉтђžнбЋ*e%Ѕ<ѕф“X*ЪhпЖ їќпјn%еZЩ$ЏhSљПwоERRЉmк0тіл‘eЋеЪ §ЉЈЈ`њгјъЫ/Н џёћя|џнw8О[ЖLД„@ @ јGbЕZщлЗ/ƒ &::№ѓїcьиБ<>iGŽaХђ(ЊŠЂЈЈŠŠЂPчГ{;Ѓ#N:Бп>яџййYџ3зь@ @№g‘œмs ™  @L&ЊЊЂзы '**’‹/юEFF†Џ# ”“jјˆЎОџŽТТBŸ„:tьDцСLЌV+ŠЂ“sˆІBt @ ‚4*FЃбћЎ.Ÿ3ž5\ўXЊ-žЕ[ЊзСр‰›шš7g‡rr|" &!!}{ї™‘NhhўўўЂ @ С?ЋЕЦы.оэОжЋЁл’%сYЗЅЈЈŠ‚ЊЈрйЋŠЧкЅœТeќ‰tябƒэлЗc№&5ЕЈ}@ @№'=§ЦЄDќu26ХI­СЋжЅМЊz}Кѕ{8”?ћєrssЩЮЪТсpд›XЯžНиГ{ЛwяЂmЛvЂі@ С?ƒСРњѕXКt)йYYxќЧзПМ›ЂЊю пНЊЊ(*h?Y̘з^{ “_‰Э“?)Б   RZЕТ‰†РР@,uмШџKо‰,Ј‡ввRі8€ЊЊhuzdYі*I’Ф^ьХ^ьХ^ьХ^ьХ^ьџgћZ;­R’ nдxЗuыжtMMС(ЋUZэq’нЛwу’‹ККЇJž)зО,йcёBЉмЊЈ рRT\ ИTp*рTTя{Кl.›ЂRуЋ ,N•Jм[CaAŠЫ%TШПˆђђrvяйMjліюЬ@ СљЄЌЌŒ}ЛwбІm‚ƒЮ:МFЃ!<2Š9 ў’т#К ВŠ^RбЫ KюЯZ 4’ћВ ВЊЂ‘A’hиšЎгSЧЎ&јз••E‡Hjб?сXE @№ТR]VЃс`z::Д?‰s~ЕV4ЩŸCMM .—ыOѓYZZJЕХB\“&ч^–$›5Ч(S @№—ТHГФfdeЄ7*F‹FVаЪ “4шPбiTєKd$Ё•Ud 4’ŠF–q[Оdщ<‰.›њ6› ƒСpNa'=ё$ƒ ЄoпО,пџ=МˆттbІM{хЫ—У-ЗмЬ'Ÿ~†FЃaфШЛЯ)nЃŸўт-@ јKтo6cђї;'R&33Э‚ьЈAВY‘э6$— йх@V\ЈŠ­тDR$\HŠИTеsЬэf^оЕm ЛЖoeїŽmьйЙНЛvАoїNвіьцРО=ЄяпGц§dgfp(ћ G"яшŠ ђ)+)iTEќєгOŒ3љHс IDAT†!C†rѓЭЗ0uъд“^<іWeУ† <ѕдг”ЊŽттbоyg<ђ0Ÿ~њ ЩЩЩ\tбEДoсМOцхх1щё‰єьо)ЯMі9WQQAыф–М=kжIсJŠ‹џШ#tюаžфЄц ь5ыз­УnЗѓТ”)tюаžŽэк2ў‘GМ6їэнKЛдж$ЦЧбЊe РяПЂ(>qЛ\.}јaFн{ЯёоŸФј8я6aќxяЙo—~Ух—]JЋ–-xшqX­ж•eёЂEДi•BГ„x:ДmУmУ‡ГsчNяљщгІqQз.ЄІ$sгѕзs03ѓЄКИюšaм>тж“ŽgЄЇ3xрRZ$qЯнwS]U@ZZкЗЃYB<Љ)Щ 8€oОўк'ьДз^Ѓ]jkzvяЦпя=~ћˆ[}ъ 1>ŽеЋV‘——ЧН#яІMЋzvяЦќwп­ЗНGпw/з в њОЄgOууhб,‘>—^Т SІPQQс=ПhсBRZ$‘GЛджм6|8ыжЎmPkh_ЈmЃ.:њћdёbњ\z Љ)ЩмzЫЭфціžKNj~R;vЌоОdГй|яoж“ЧЖ­[ы­ПњђRћ0gц›3ИђђЫ6xыз­;)‰ёq8Nвгpгѕз“в"‰нК2ѓЭ>ёulзЖоќчччѓwў—6­[qUпОќєгo˜-›73dр@кДJс–џмФсУ‡\з iЫSѕчm[ЗžTЦо—\ €гщф™ЇžЂs‡ієшж•ysчˆб„@ .8!!!DDDC\| M›вМys’ZД 99™”V)ДjнšжmRiгІ mкЕЅ]ЛvДяаžі:аЁcG:vъˆl4š0ыn#FƒƒС€AoР`аЃгыбыєшt:t:Z­FsЮXЙr%SЇОJŸ>}˜9ѓMž{n2ЉЉЉH’єЗhЇгљ—ˆ‡"22’Ю;„VЋЅWЏ^ДisaоГv$7—k† &2"’…‹3ўБ >ч?џєSŒF#/\ш3@ГZ­ќчЦЩЬЬрЭЗfБbѕFKpHЅЅЅ””Гш“OY№бBжЏ[ЫтEющ™NЇ“ЛїАjэZю5Š9яМЭƒуЦyуоНk7пx#+–џxR~ЋЋЊyЯНьЯШdF&/Мє‡тБGхљ_тз?6RUUЭ›3І7Ј,eЅЅtэжЛї№ѕвoIHlЪэЗЇКК€^—\ЬТХ‹YБz5С!!МўкЋ>ёюйН›ћ№лЏП’Sч%хЊЊ2fд}єшб“еыжQYYС+/ПьЎ?‹‡УЩЖЛXНn=џЙљfyшA6oкРїп}ЧТ…ёщч_№єГ“yшq>ЂсbгжmоэвЫ.cяž=$'Ї№УŠ•LzђI^x~ ћїяїЩы{ѓцБiуFŸcЇЋя‚‚|}ђ)ПmмФ‹/ПТіmлИvиPЊЊ*Зc–юн/bчžН|љѕ7\rйЅŒКї-\xЦ>жОPTTШЃ?ЬЫ/ОруєGUU6orчщћх+P…Ÿо'я.ќиЇŽЂЂЂМчvlпЮœwоЎї;ёс  сЃј?U^jя+З Ю§x§7јhбb.ОфvюйынnПуП 8­VKtt cЧcнO?ѓъыЏ3}к4вгxуЌЊЊbчžНоОР3O=I||<7mfд˜1ŒЙя>l6.—‹{FоЭШ{ясЭ›IJjС““&5ИЎЯд–ЇыЯ&“ЩЇО—,§€…}ФЎ];YЙz яНџ3gЬ`ћЖmb4 ‚ ‡ ~~~˜ $$8˜АаPТУУˆ  *2‚шШ(bЂЃˆŽ&6&†&11ФХЦКЗ&MˆїlЪš.—ЫХ{яЭчЎЛюткkЏёONNіФgЭšХ† ?ФШ‘wsйe—№у?ђщЇŸQ\\Œйlfа lлЖ§ћїХOL"11‘в™6m………H\~y_ЊЊЊју?ащtŒ5Š>}z““УЬ™o‘™™IJJ2<ђ>q8zіьЩC=ˆбh`зЎ]єя?€ > 22’E‹Гlй2dYцІ›ndиАaTVVђњыгиКu+ббQTVVT/‡ƒ‰'rјp.‹…V­Z1nм§$$$ИŸђ>ѓ ™X­VЦŽCП~§иДiГgЯІИИ„юнЛ3nм§bЗлЩЭЭѕцoњє7јс‡‰ˆgФˆ'Ѕ§ыЏП2ўћ”••qщЅ—0zєht:]ƒлєЙЩЯђ#G2ђž{ы=ПhбЧ<љдг<7љY~кАо}њ№щ'ŸPQQЮвяОУd2˜˜ш їњЧЯЅ—]FvvЖїI’ "((ˆИИxRZЕb@П~мvЧэtыжЃGpн 7`ЉЎfѓцM>љ)//'<"ќЄщЁлЖn%ЉE .Офю9’ё<Ь„‰ŸБ,zНРР@™0ёq>ўш#rssIIIЁ{ї‹(.*BUUšж)'РЧ/dш5У8vє(Ÿ,њ˜ ЛКiћі‘™™Щ7ЫОУh4ђРƒ1ђџюbђ”)žz€рр`‚ƒƒЙэі;XєёЧьйГ›ЎнКёѕ’%мzыRлД!ЕM>x>п/[Цџ €€?>љш{ХєНт xщХ9”“MJJŠWа/ќшCтI>\№7мщъ Рl&""‚ˆˆКvыЦ}њ№ўќљм?юtzЗю’““1›yёљчЙіњы1™LЇэcgъ ее"Ѓ"™7>їо}ЗOИзІMѓўнѕзѓўќљ>q{žpеїрeт„Ч˜њкkм6|ИЯЙММ<жЎ]Уьwосў1cxіЙ)zж?ž*/}ј!ц@33OАЂjЕZoјœœОќђ жЌ[€йlцВоНq:dfdHhH(‹Nч [—Д}ћИѕЖл№`шАa<ђаƒ”••ЁЊ*%ХХє0Н^Я€yrву Ўы3ЕevVжњГTo}ЇэлKЯ^Н ',<œ””VфффаБS'1(СCBB’<2ВЄ"I2ВЄ IВЄ ##K Ы*2*’g—Є‚ф9&џ™?x№ eee\uе•ѕžч91{і,FХДioщ™Šuјp.­[ЗтУpчwђс‡бЏ_?цЮCJJ2ѓчП@ii vЛwпЧ‹/ОШкЕk1›ЭЬšѕ#FмЪ[oН…гщФщt2yђstъд‰љѓп#,,œ9sцzуАйlЬ™ѓoО9ƒœœ–zžКДkз–яО[Цwп-#**Š+VВjеJ^yхežxb|АР+fЮtЇ7kж[мџИz­„NЇ“={і2eЪsЬ;‡ЄЄцLšєvЛ‡УС–-[™2х9о>=zєриБ<žўnЛэvоyчmEaњєу"ЅiгІоќЕjеъ”э‘››ЫдЉЏrЯ=#™5ы-іэKу‡~hp{VWWГjхJ>]ќ )-’шпя*віэѓžпКe љyљ :”ƒёщ'‹Нч~кАžƒyзЉАлэlќc#={ѕ:х5-[&гБS'~Zяž&еяъўм2|xНжг’’~ћѕW|№>ЧŽѕOJjAfFлЗmУсp`БX8ZчќщЪREQјъЫ/ !!!С{|Тјёtщд‘ьЌ,ю5к{МІІ†oПљ†ыЏПkЎНŽ/>џЇг Ип„о41б+іSZЕЂВВ’МММ“внЖu+йYYДoпС6ЅUŠї|ЋV­9pр@ƒл63#ƒВвR:vъ|\`?ћ M|œ  _їЋЇЋябыѕ Лцo[еЧ 7оˆХRЭЖ­[ЯиЧЮдš6mЪc&рњuˆ?mјщД}Ќ.М?Ÿюн/Ђsч.'ћъ‹/шйГ§ЎюOl“&|Нф+ŸяхЉђђЭзKШHO'5%™‹КvслЅпœtЭќwпхškЏѕБИ;vŒЭ1ќ›ј8aсюї-––” I3пœСЪ•+|Ќѓ—ѕюУєiгШЭ=ЬьYoбЃgOЂЂЂˆŠŠ"%%…чž}–тЂ"о7—kЎЛЎСu}ІЖ<›ў\—ЫzїсгХŸАiгF~љљgЪсВоНХh@  ўбUQQNЇ# G ŠЂАzѕjFŽМ‡ИИ8zѕъIяоНYЙr•їџ‚ƒƒЙђЪ+ !!žшшhЎОК?є^Їгщ !99™іэлNLL ƒ ЂІІ†ТТBвввАZ­ ~ !!!мxу lйВХgpNbb"§њ]EZк>эЋбhМjэк5\wнu$$$ššJ—.]иКu+NЇ“Ÿў™Ляў?тууiзЎ-QQ‘ЇЌŸ˜˜bccЙяОћe™muІаDGGF`` ыж­ЅsчЮєэ{9БББŒ=Š_§ЊЊjяѕuѓw*6lи@Зn]щоН;QQQ 8€­ЇX‡RYb4y{юЖякMџ3z”w€їх—_аїŠ+0 <„•+VP^^ю?‘‘QЇ_UU&Œ”жЉЉ\uUПг^MIж^У єюs9›7mІoŸоќњЫ/Дiл–‡}”ћюIЛдж<7љYДкусг•`§КЕtэд‰Ж­[ёьгOqЯ}Ѓ|хЫSЇђѓoПŸЯCŸ’Еjх ќ§§щмЅ W^ulXяЖdX­Vќ§ќМзњy>[-Р=}ЌkЇNДo“ЪЕУ†выт‹iзоэЕЦjХЯЯПNXO8€з_}•vЉ­i—кšAњћдQyy9ЃяЛ—GЧ?цЕ<ќёћя”—•3`рРFпЂcNпVzНžаPJJJЮиЧгjYМhлЗmѕZоjЙхІНuєШCzыцƒљяѓрУзз—_~С€AюѕXƒ ц‹Я>kPвггydќxЖюиЩЋЏOу‘‡тш‘#оѓ‹…/>џŒЛюњП“юiщЬzћІL~–лЗnыт3“'cЗйy~ђdюИm„wJьЈ1cШHOч†kЏхз_чю‘юux’$1~ТD–,љŠЫ{_ЦŽэлЙс†ѕНЋл–gъЯ‹Х[пэR[Гxб"ЎюпŸ&qMИєhF П…kЎНސё+.!КN…йlЦсpјˆƒZJKKq:DGGљќ œ"ЎЏЃГ9€šы)ЏГXмчdYЦd2aЕZ),,ЄЌЌŒЁC‡1dШPюП6›эЄEёAAAѕцЙ–ТТ"цЬ™Ы!C2d(Пџў;eee”——Ѓ(JНSfN‡$IФЦЦRXXXяљ‚‚Ÿz GЃбPXXpVщђЫ/Пzѓ=wю<ЪЪЪОж"гВe2&“‰‘#я!3#ƒТТBœN'п/[FПЋЏ GЯž№§wпюiqgЪя”ЩЯrша!fЬœyЦМ=z”ааа3^зГW/юМы.fЮšХшБc}жmМч^~пД™Дє ЎЛўzš5oю-чщЪRя+VАrѕцНїѓцМУВoПѕiгИИxžzњVЏZхu №ѕ’%\yU?$IТппŸЫ.ыЭ7_/м 8ЋыЅк5bЁaaо‡?ЌXСŠеkјќЋЏ(**тйЇнN^‚CBАXЊы„ЕvМ~юОч~XБ‚VЌрНї?№ЗZ­мyЧэ\|Щ%мUg м[3g2цўћЯЫ}рLmeГй(-)!44єД}ЌБ}р‡яПgкkЏВрЃ…'Нь{ЦЬЗМuєФ“O№ёG1xШz§Лwэ"ырAЎъч~@0`р@vюмIVVж™ПKЭš7Чh4rYяо$ЇЄјLеќљЇ 4iв„Є-N k44x0W^еo—.ѕоГўsѓ-<2~<пџИœлЗ{зт=њ№CŒŸ0п7mfкєм?f4yyyTTT0ёБё|ље6oлЮЁУјПЛю>п6nbйї?№ХŸГќЧХЏИ@ .чг{УŸВІЋYГfјГnн:{Мsе‚VЋ%//ŸЄ$ї`7/я‘‘ЇВ I>OЛO§р[ђЉ:I’PU %,,Œ… ?jЊMKЋет:a|HH7нt#W{хЕ(Š‚VЋхшбЃДlйђЌъЊ  р”ƒ™ˆˆвг3|Ф“Ых"""ђ”"Е>BBBщгЇ=6ўœк3&6–ъъjЋРї VƒСРњuы(--eвФ <ѕ„{Ree%_/љŠ[†чЂ=X№С<ўФ“ѕЎ!ћђѓЯYЛv-_/§іŒSгввиБ};?ёФYх?%%…o–|}вёВВ2~ј!ЗоvРЫю5]ЕтКI\п|§5[Зlf№_/­ж= O’(++cнкЕшѕzО[і­WєШВŒХbЁYѓцфdgSSSƒбhфРў§„††zХ$сM3::šoК‰=N š7oNкО4q\їяOcр A>тттO*ћSOзоpнЕ|ёе’ГЊѓššО^ВФ[oѕёщ'‹ёѓѓЇSчЮTTTœВ5Ж/dЄЇ3iт,ќи+АыuR­[Л–џрЗgяG-’ШШЪц›ЏПFUUњ]сћ:ˆo–,9ЅeЌ–ииXrВshзЮmЉДеи0ŒоѓkзЌсЪ~ЇЗіjЕdљфчiўФ6iBaa!еUUќђѓЯЬ~Чэ№кыЎуйГиБ};†А№pZЕn Рƒ?LЇіэ|,Кg[зuл27ї№њГToŸ\ўум?ю$IЂMлЖ <„пћ•ЋћїЃ@ ќхiМшR=Jч,<љщДZ†ЮмЙsQ\.КtщŒЭf#--rEпОЬ›;—БcЧpјp.ызoрЕWЇzв№luгЋM_­ћ=*L=Q•ЉДm“Š,K,ј`§ћ_Ђ((ŠB“&MNŽЃЮ>::š,Я‚pY’ˆˆŒфђ>}јєгЯhKLL yљљДIME–$Ўшл—йГпцўБc ЄЦZsrНy>џілotьа ~ЂВВ’N;њцСѓЙ6Н5kжа*%…wп›OЯž=№їЋПќuъРd2‘™™‰нfЃїe—2юYПО;mRSЉЊЊ"$$фЄ5;Оё7**ŠЎнК1mкы<6a"3пœСE=zФвoОfРР<§ьqђлЖneьшQфчч3ќж|И`ЗИ•GЧ?FXx8йYY˜Эf:wщТдW^fкєFl6’$Ёзы=YP),,ЄЂМœэлЖёЪЫ/1`р яbўSaЗлYГz5­SS)++уэйГщбГЇї|II {іьfъK/тvuІВ8vї*‹…7ВvэZ^™:€/>џŒ;Ђ(*ЏНђ ={ѕТппŸХ‹Ю’o–К”G” МКЋW­dШаaЄІІђъдWИѓЎЛ˜ўЦ4nИё&ŸІ())Ссp‘žЮ‚ї? {ЗгŽыoИ‘G~ˆƒ‘ЭЮ;xлГfёTdfdАrХrжЎп€нnw‹D­VKжЁуюдWЏZХЬ7g4Xp•–”›{˜Œє :ƒџоy—їМЭfЃАА|Š™3f№єГЯb2™0™LЇьcщ 3ІOчі;ўKJJŠWЬщѕzякДВвR‹šйlцГ/Пєў_]]M›V)ьЯШDЃбАьлЅLzђIЏаЗЗЧoП]zFб5h№цЭy‡={№лЏП’—wŒ^_ь=ПcЧFэfлж­X­VттйЙc'?|џ= <Ђ{ѓІMш BB‚YЛf YвЙsgќќ§‰mв„?њˆЗпЮŽэл8tш-[ЖD’erВГйА~=:wц“E‹ˆ‰‰9ЋК>][Жl™|†ўЌždС %99™ЏОќ‚.]ЛP^VЮ† ыЙїОQтW\  г*gюќО‰X{~Jrі\wэŘL&Оњj sчЭУЯЯ6mRЙђЪ+ЙяО{ykж,FKPP?є-ъ™Ns^*@ЋхљчŸgЦє|ўХјљљ1ќ–[мЂы4$ЗlЩх}њ0~ќc˜L&žyњ)@yy9ЯП№"‹…˜˜ІП1 “ЩФ}їнЫМyя2щ‰'БX,^/nѕёуЫ™5k6‘‘‘<ћь3оЉ'У“OLbіьЗ)*.цЂ‹К3юўTюЫ/яУ† XНf њїgт„ Ь{ї]e-„ &œ^tРє7пфб‡ІGЗЎЄЖiУ[ГпІІІ†U+W2яНљ^7еб’Рwп~Ы]wпЭ_~Х‹/<ЯoПššš5kЦИфШ‘(ђѓѓЙѕ–›Нa›ФХёЫoПc2™ащttым ƒС@ѓЄ$ю5š;юМѓŒy-++уэYoБoп>‚ƒƒщ{ХLЌуэš!ƒбhЕєяпŸбcяЧЯЯЏAe  спЇs‡і yф‘G‡ Цвo–2dш0ІMŸСуючЃ шнчrxанЮ&??ДZ ;ДGЋеMпОW0щЩ'З'Т[GмЦM7м@@€?гІЯ8у”ЛmлЖR^^NчŽМЧЎПёF^ŸіЦ9ЯЂЂЂЙуЖhЕZbbbЙъъ~Œ{рAЬf3AССlоД‰n;`І]ћvМ=g.W\yхiћаЈОАuыО]њ 3І/пЯП§цЕЖœјоД^|Щk§<‘Э›7Q^^Ю№сЗњМ<ќПwнЩќїоeяž=ЄžцЕ cЧ#//ОН{ФМїц{ыHUUffвЌ™Џ5.;;›WЇОBQa! MyўХ—Мž2ЗlйЬМ9sЉЊЊЄEЫ–М=g.Бž{лœyѓx|Т:qqq<џТ‹4OJрЅWІ2qТc”гЊukЏPoH]7Є-OеŸСmхэжйз#съЕыxђЉЇ™8aїшA`` УЎЙ–oКI &@№З@š>ѓU•IFQ%ЕИT U–qЂAвhqЂAбhqI:Н—Ю€Ђ3ра™˜|i ђѓNzпŒрьБZ­\{нѕ|іщ'ѕКxў+‘ž‘С•§њЃ?Хє.@ рЯФfГБfхrZx*ž †№Јhž§щZЛЫ†ЦnУˆBBL$Сў&tШ’‚šZї№’ћI=юF^лЌY3Яњ&E•Q$ E•qN4Ј’ŒC•qЩ2U‹CЋХЁбуДи4zбšџb,–j!К@ IЌееŽ# ƒKNuЂsйQЊЋ9rфКИX‚ќ§ЈГјщЄ­аFGGЃŠ Š*сBТЅJИTpЈ2 vUТ‰Œ]‘БЩl’dДЧ—‰vm4F“‰~јўoQŸ&“‰МcЧ ЎwбО@ @№gЁ(.ђђŽa4Яi\]Цd4aB‡е…lаcбI”ид}ЅTзџУ ’ЫsL–eY–‘<›\g“dЩѓЦeљј›˜ыlHЂAџ­„††RQVFіС ЊЋ*Няў@ ў<БЅPUYIvf&ee„y^IrЮHјшНо@ йŒц :ШЅ(ьнГ—gŒЌM#8L&В,QR\LEyЙЈ@ С_Їг‰ŸŸщ‚,…бщuhДЇ‘QЊЪтХŸАfе*т™ђм3 ]‡ЛKЃIДЂƒСшѓ!@ рпЮŠ•ЋYГv-Y9йќИ|9 ^ŒГhёb:$jQ @ ъaлж­|ёхДoзŽя—/ЇmЛv|ќё"ф‡y”ŸљхŒЈТS†@ @ ј—ЂЊ*Ѕee(J§ТшрСƒМџС‡ФЧХёд3ЯR”wŒ)Sž'6.љЎџў—&'М”U @ ЧЉЈЈрPN6Ng§я'^інwјјѓмѓ/P]YŽKQАTWђкыЏЃmлЎ-*рRсёI“ИуŽ;IJNрЉЇŸfєшћ Œ`гцЭЌлИ CPm:u%,>БVі S˜@ @ јgPО $8Е ссСT—œфсGЦcвыpк-(. 8ш4ђйy/ŒŠŠЂ}ЗюV[йВkƒУ€0б(@ рOuu5ešS›Tі'.—УЧЅМнfC~чwЈЊЊjP" ёё˜iKLL4……EЂц@ С?ž3M/t:8œŽzЯi ™3g.>ќ0 5јЭ~~~TиэЂі@@A~>;vэє>Ф“p?тSQ‘Юi_7žsэлЕ'22RTЖ@ ўЮ4Н№th‡ЦoО ЊŠŸЩDyE9ЊЊКЇ0ЊžŸLЯ?Њч'мІ5C`ˆЅ\@№ЏІАА-[ЗJLTдIЃкbaыж-tщк•ˆ№Qщ@ јпЁЊ ЙНVWUQІQ<ЫНмšIѕш$еч“'Јчэњѕы‰q;ЪhlІњ IDATб"‰ѕыжгЄIНEQ|єЊЋБX,.,сиБ<К$ЅˆF‚92Kxh(у…yaК­ІЃбHЦt!К@№ЇPYYСБC9ЖNі9Ў(*‡r’•‘NЕ й3oCFUAkБZ=z4C† сН№ЪдWбшt„EХ`єќ€ЦФФАiг&ўиБ“˜8:vьŒ€?ЕБѓa№ВZ­d<ˆЫх:х5:­ŽИј8Эцdc:tˆ§4шк”фdўІ $ЩїнмŠЃ[Щ8*їсЈHУQ™€>(9]`*њnШк€ѓžЇгIYYU••TVVRYщž"`і' РŒ9РLHH0Zю„rЈH’tЮщ–••aЗ;ˆˆ?e<ЊЊRTXˆNЏ'88ИQпЏЃЧŽžSии˜XL&гyЉыŸљ“Щtвї\BТщrбВEсссчЙПЉTW[eI’МћкЯВ,5ЊџъьоГ—ђŠ L&бQQоm'RRZF~AVЋ•’[ЖhPќ’Ђ‚ЩЯя‚•СфчGЈч Ѓ˜`!‚ >V­Gп˜Эющ…aсСTzчЪсРў§јdF#+Ш€F’‘$IUбNxь1T@QСппŸБcЦрR%\*иU Л§њ]EEƒ]–БIZlЊL•ЂPз|жX~§эwFНџ”чэ6хќ№§їјћiлІЭyIїЙ)/pјp.ВFцG& гШО."eЩ=$”ŽЏ/ЈŸI’„ЭсфW_Fq)tьи‘1Ѓя=чМь?p€БуlаЕoН9НQЂKQTЊkœи\*И\рt!ЋJУТJ2’N‹*Iј4ѕšZЋr> *kК€TBкП‚ЌЧšї^$$ЪNHˆ– І §/IЦ^sŒЊ’Ѕ”|@б>[=‰1ђЪѓіЅ***ф@к~є#~~&ТBУHlкН^еjЅЄД”#GrIЯH'))‰ЈЈ(ьv;ћіюЅВВ’ІM›ŽэPXTH\L %%Х„…е/4JJŠ №ї#їh^ЃDзбcGЙЄg/ Ж,ЫЇМОюЙ ПќLRѓЄѓRпСССєОќ ЊЋЋOИ‘™љјЃœ_QэrЙјьЫ%И\.ќќќ№її?iѓѓѓУh4bГйАлmШ’„б` РпяscWUŠJJЩЬчp.ЉЉЉH’ФЗп.ЅyГDДк3;Й5šLоtЃбˆЩЯ„@ В,ЁгщЈ,+ѓ9~шPС!!„јaаiаШnљ •eмjJ=;—ё' тŽ…жЭЮ[AjЧь–ъjŸМЫхТnЗSU]ЭсУ‡išJFz:ЛvяІ]лЖN7їШzш!223щжыR‚ќŒ^!)љф­VxсyJюо—W[ЩиЗ—ЫХђЫџ6ЇКЦЩЊ…”Y%Њ ‹аL#РVб щ_iЧž˜Œ1аŸЖMLti‚QпАюT™1‹.юцHњ 7н…6 :зOtИИ њ€KбD!UPЫаJ­1D8‰+!ЎlvŒЧšA)#ыЯ}`ъp8ШHOЇДДŒииXL~~єz4 .— ЋеŠFЃ!,4s@Ћ•ьЌlŠ ‹АTWЃ7шiзЖ-;vэ:gбe2њЫЮ]Л >i€ыt:ЉЊЌІybsJЪЪнцŠЂxE—,ЫЇ`'N/n гпœЩю={йЖm‡bюмЙLœ8бчš—_~™QЃFLrr2њ_Э}їŒlДЊКкByy9SЇNѕZЗjЗКeu:8ЊЊЊШЫЫ#33T•”–IшNАpžoь'ZžkЏЛŽУ‡ѓХчŸqѓM7ž7б)IўўўюДьUЅ>ЙmЗл1 hЕZEХЅ(чє#ёћІ-фžsžЃ##шб­KЃЪНjЭZч9ч№ёqMИВяхЛєџьr СПГŸ?zƒй#КdYFFA‚Ц‰ЎИИИѓ–еEПW№сЇл5†уƒ!ЩmW’5dYF#ЫєzvяйУm#F№љчŸГ{ЯžF[МEaкгHINСсt"KО^=zыБхў,Kрp*ЄЇЇуrЙP”Цл§œNgƒž.7›SЁШкЗ$kSсљ{‰/ЬhPиƒёШkлsl,йХ…ДiЊbд7А[*5HЖЭФ7я‡бoЊК‰Ј˜+‘›#I6TW.#ˆ[lШ&#УPRЛю ?g GўиFјEŸ“№r8lоМ“бHBB<:UQЈЉЉ9e?“‰ФФІc6› ЄЌМх4гaЯD€9€‚Т|:ДoЧЮнЛOВ\=z”эл‘_O@Рљ›R[W`Юкеѓgтѕ7Іsфш1"##iоМ9ћіэ#::š9sцј\УЎ]ЛhоМ9Н{їІМЂ’—ЇОЦуЦ7*}Г9€€€žyцТУУ8p -ZД№Ÿ’ф~rЅзыёѓѓ#""‚””ўју~ўэ.ъж?г…ГАTVWгЊUk 111”WTœзјNЇW8кlЖS^gЕZбщthЕкгNѓ>Лїю;Љ}ыцХсpрp8МŸNЇЧa“›)SІ4ZtmлОЃбyhŒјјГвџ3ЫнЊMЛFЕYкž]bм&ў–hu:Дњг? еž~5ж‰вC­чјљaЧС"Z4o~<5YvЇЈЊ^Б#Ы2Z­жmаjщгЛ7Ћж§ФНЏ,ЅIJW$еэI$&дШШ> _ЂЊ*NЇEQ% NfљІ†‰AЕDEѕZTѕм­Њ 6››ЭэŠџtТЫщtbГйнЮTЮб NE!ЗФJюбœ{в0нн АЧЊќШiQŒ‚%зйї Ї Щ/‚А№H?0QlvŸhT4H’ >ujGђO%"!ЇcХћІкaкY—§Рў˜ŒFТBCqЙ\' 0eIBQы/S`` [И9ЈДјћ“‘™IbгDLF#UUUощuUUU˜ŒFL&YY9ДLny^WUUГВЮ|Н$qьXОЯБГYуѕЫЏПa0иКu+Ы–-#11‘ЄЄЄSцэНїоЃOŸ>$$$ зыЦ‰.I’ўŸБXЌ”•—Бjе*š5k†гщє~ЯжЏ_OPP$%%Ёеj1 \|ёХ8Nв32щаЎэЛYлl6***0Ќ_ПžЖЉЉч]tеоOjjj|йuБX,шt:4 vЛ§”з‰р@3з_§9чЗEѓЦЯ ˆkTZЗJљ[Іџg—[ ўЙдеAѕ}>ƒ0kйЊ рRT\ ИTp*рTTlŠ{­—Э6EЅЦ V, Xœ*€Х­дЦ 1kU9ŠтЊ%сUE!Щ2’,Ѓб_;фчяOпЫzЊ№ѕЎZЖыРЎ[А9У0h–ЖЂ(ДJiхxВ„N#1ИGЫ“‘ZывуR_QUl'.—тИ+.хœыЂЄД”ђЪ*ЊЊЊqЙ Ц§$^UUOZNl6х•U””–rŽSьм…ђЂ1‰4ˆ€цЭ)пНYЏЧ?1—еJоЊUФєы‡Њ(”эм‰ZщЎ7—Ы…ЊQЯКИTŠЭк@T їg { еY{qУQœЌб  ‰ЦлS\3Р#r4aDЧЇRДy жЃЫ0Х jpкљљљ”””з„šžњзддxМtZQTƒо€бh 00ЦнЁŽу/НгzŽk›k54ВD~AmSSYџЫ/ЄДtїНм#GИьт‹Щ/(@Ѓе ‘хЦ}ЯдуS eYц`V;thаЏіэлћЎёњљg’ъ<$9эwлjѕљЎэмЙг;˜—$ ›ЭЦбЃGНпkEQhлЖ-‡ЦЯЯН{їЁ(.ДZ-ZVCXXиY9г‘%‰?$ ВВ—Ых]’$QVV†ПЩHvжA, :t@’$ДZ-ЉЉЉ,\Иmл\АлxH ™_~љ™мУɘЭєЙє’FпSы~Я‡звeБXм ъ‰ПЊЊЪ]ЯZ­ЛŸŸуН§†k‡]рпН3чщПЗјŸЄѓWKџЯ.їп2]@ 8Э8й„Y~Z ?LhqR’wьЌlкUп}ƒ*I(Њ„Š„"Щ(Њ{іЁCв "уDƒKжрД8Е:=NYMk€˜аѓRЎъЊRЈѓВeЉv€WgpІбhащѕžЇп 7№Wш{щХ8ьыxoэ КєКŒъЊrO8ЉuъЖTI’„ЫЅ`Е;YН5ЋAa/iSQ=S •SZG†ФбЃGЉЌЌТщtbЗM*22’ввRl6ƒс‚ДƒŸЩDЗNщжЉу‰ПvњЄWtЂnЋЊЊМг ыŠe@ ў­фЩЅдiCЋибЙьh4.;ZЩ­ЙdЙacqmП!зЂ?~џ}ћ <ЩвхRРцRыЕtUКЊЯK,e…Ш.Лw€PыŠЛіщwэдBНС@ddЄ[tщѕFƒ‚Й}Ф-ј›Пу§ѕПRUV€FnИЉ’$сRЌ6'З‰?>Pѓќѕ†TХcёЊБЗt)ŠrVгЭ,V++VЏ№zQ+**ЂЌЌЛнбhGЇгz­{ЕE‡УIMЂЂ"Вr‘q0‹ŠŠ ЊЋЋщwХхZ{ЂѕѓУKХО}hŒF жЏGD“‘u:4~~(Kлљ€ ѕ| (Њ —г  4рЊ)Ѕ<џДў.ќcВ(8ЌTt'qm5}˜Š]ы0Зю ’ЛUєRkєЦ?А•ўŽ)Њџг-)-ёZOklЧзo•WT`4 ЁИИЋЅКV§еjХbБ"IВїЫЅ(j#EЖ›авіРZSCг„ІlјymлДХZSCYy9­R’ЯлЭЃ>kж…\уUз­ОVЋEЏз{уЈ§^dч:ЅшЊ{/hšпˆ‡VЊwк\]iЕZ=l›Эцѓ ЦjЕ"I’р>_ьOЯрh^>NЇ“ђђrJJJшкЙ;v8яЂЋ6џ‹х”зUVVb0аxжбž+iщЄШh№ѕ­’[аЊющЯ–э;wБmЧЮ_пЉC{:ЖoїЗЭЧйІѓП*П@ ќ]‰‰‹?ЩвЅ“\ькјлйБџ*r:l(іšк‘бё5]дYЯЅбряO‹Є$V,_NYy9vЛ—g!pгФDЦ bЬ ›<ЂЋaтК,ЇKЅЦю`kz^ƒТЖMŒ№Š.UUQЮbMWAaрvƒl6›)//Ї  €вв2яSuНо=Х№ИшrbЗЛ-]”——ыd…EE4?їAЉНД”ђН{Щ[Нš–#Gbjв„€-ЈЩЯGыяOоЊUд=ŠˆЫЅ :ч&<œNœд сLльG@+)TWK8ьўDєќYAMў ВіПDГе8гŠЈЮйƒ1ЊЙЇ}§0њЃ|oƒDWUe%FƒЛнюYЧЇтt9бiĘЭ””–’œм’ˆˆьv;[ЖlЁІІНчeс.—а6jэ^}"&аlцш‘#4kжŒж)­(((@’рш‘#šЭvfбPu!œjдЕtе ъ|Џыz<ё:їћГŽПGK="їФЕJЊЊbЕZЩ+( ЈИ˜&qёžѕ™nЖџ~ТBCЮћ{М\.{іЅqѓЭ7{эоН›ƒ™чџўъqšрччwЪ5]ЊЊRYY‰NЇѓ™~y.ќќыя'9sЈѕBkЗл=ЎљЯl˜2eЪ]+WЏ9ыМ\бёПЪG}щœиЮфHCˆ.@ №ў:žЗ˜ў2ЂЫaЗcЗXНƒ-ЗЧ@ YUqЉ‹‚,Ёгщ  УшчУaGqКp) .ЇKK;Е'џоg}§~œЉ:ХыЎжве:!МоjЏ§qRыXК.wxUUЯЪвUT\Œ,Ы^+WUUеџГwпёQдљЧ_3Г›lz %Ё„оЄŠz Š vАќP<і;ЛbAEядѓєЮ‚чЇой*и{Ч ˆд-=[gцїЧl–$$йЩюlфѓфБ%ЛГ3ГГ“ЩМїћЯ—ььlцЭћSх˜ѕЎЉ{т—m•OOOќнОcgЬЁЫ)]ОœЊеЋёQњ§їt<рjŠ‹йИhy‡BхЏПZczuC70B:Ібђ“бЏ„šђpgхтЪШ!)Г€Єœ„ЬЕЄ–г1Џ†ВŸoЁуЈЧЌыЕTЂUз“пХE \G ИQ ?І™Lzš‹me?лZnUU%ЉЉ)TUUЁЊInЊІтvЙиБc'§єЃsЇЮЌ\Е’фdOфD5))9ќ™сЧ ccuьи‘MХ›шоН;:ubХЪ•lйВ…т-[(Ш/HhрЊНЦЫЩ UoПjфwЂБВэЕћ{mWbkат]KQтКЕ-Yu—]{эVye=z2rфHРъvXRRТsЯ=ЧIЧ›moš&K–,сшЃрћяПgдpчOx›6m"%%ЅЩ№XnблКu+555ЭVђŒf`џО-*ц0іп%l9|X‹жхЈ GьеыбвхДжћBˆіЎM„.аC!М~oнГ2k<Ј?_§АŠ›JТзŸ˜˜І>™3MЋKŸa‚nшќЖЅ_ €в‚oФ г дЉ=Gl˜лъЎКE5 rmPKZ}юЯф)S#?oлЖž={ЖhлѕяпŸМММШЯkжЎŠљsаkjиђю7VЈ6Нў:›/ЦдutŸšѕы#Я™`ЕtC˜fЫv#-ЕЅ5[ЩJ_ ц:Ь %) EƒdеtЪ‡пэz/)ŽЄь' Cѓc$х &ЁИГ T‰[I"Xi/tUVV‘л1UгТ…44г…aш˜ІAЇМN‘iЋ+ЋшоН;ў@ 2ЦQУсѓљЌ5%ХƒišlоМ™‚‚F ЮGLfV&))ž=ђ{щTыZню…ЎH гФ­ihš†ІЉ‘аe Эnщr0tеFQ…sЮ9ЇўКK—.хЭ7пЄwaa\ƒR7EQ† Hye)))ј|>ж­[ЧIЧMux9VИsЛн‘}ЗБ/‡***ЩШШ@зuмnw\-{cўcў][јѓТ‘Gо&Цj­ѕh+яW!D ]†aR^Б“лwђ№“Џь:іІCŸ§#Aˆz'pu ™ РѓoОЩв ы8Ќ‡НЗgЛЎя˜{ѕХёдЕ`œЎdOJНыDЪЫЫyђЩ'[ДМkЎЙ†‚‚‚zѓŒхЬ4рIЇ"#ЪQ\uf ƒ‰ Щс З<Щ„4щ ЈJHЧ4ZVL"kШŸйДђЏЌЏZ‰jTЁтМѕ>Kе•NFп‹ы,›ІIHW Ѕ!вРяЧ№{СэЧФf0Q‚Ё .MУэr…ЛnBUU в’ЙvЈW/жўі[$P7&--A9ђ{““УЖэлшиБ#ЉЉЉЄЇЇ‘––ОGТ•“н–уo,€UaахвPU-мвeu?TХъn\џ—=ЎахrЙъ]g6ў|ђѓѓщгЇЃFТуёpјс‡“ŸŸЯ“O>Щ /НЬє“NtМ‹с† 9tм8’““YНz5§њіqМ+ijj С`У0HNN&;;›Ѕe4Иіѓ—+шйГgНp&„Bˆ&Я*ъUŒЗzМ™„ SЕЪ Ј˜(˜„.Го]L^ўЁš<њЗ№ЕYЛZ‹4ЭХЮеЌпXYЏхЉідЧд:щ€KЋсЇЯ>ха3ЕњL#ЎnыHУіЖpiюzЁKзuJKK#?kšF—.]ъu/мКukН’хʡ盇KscкМЃюzІtыAё‰БjћvЋ5БЮ5-‘жХ№Юd* jzZj:Ё`гtЗ`”HЮHзџб`Ї5QКkчщнќ:.M'ъŠ+ЛКсC1]„‚Хјuwц [ЫOЯHMбHJNFS­nl>ŸU:ОЄЄ„.]ЛŸŸO~~~н3і]IП™mЋP(D~~~dЌЎсУGP\\ьXobгfЈВsвп’ЯЛЙю…uC˜ЫUлЪЅЁ†[Ђ"з}…УWМлмФ*љяrЙъЕt•””0tШ`VЎј…wоy‡K/НАК№^~љхмwп},ћфSsˆc‡ъP(ФŠ•+9їќѓqЛн|ѓЭ7 0€DЭЮЮЮЂММœŒŒ ЬляОЧш§GбЋА'55^VЎZХч_~Хe—]ЙІ+žэќй—_ГeыЖ&Ÿяв)/ЎСcYЇwпџЂM›š|О[AG1ОеўT'j}ЂЭ7šжоNG…ТЩc’эуRИ:rPa„Ј*Ј˜И…p}јЖбвѕЭЯE$Ѕt"Єя *TCAЧJ‹Šb…,-ЖjџЏЊ FИtЃbZ%№mo'Уtь›н–XаTŸўydй†apЭ5зд T ЏЋ№x<‘“EАЦ•њєгO#'Ы;wF'дЂ=Ъ4LtHM#ЃР…K5УнэЌqСЌn:Ё?!г…‰B( ?oЦљЧвŠгІa€b€RЇ,ЛюЅІф]*VнCf†Š™1<9ђaКR1|?рЋ2qwВ7†RFz%[JШЩЩ!й“ŒЊЈЈšF†™з[УЏЋ­"y:елЮЕ4rНЁгПиІIZj*ђ:ёез_3bјp<IЩIЛuЯ‹GУВ№БЎXп_нРUwyЛ*”jЛЎх ЏШ}ƒ‚NЌOm Ћ-ЄбЕKшЯ_}Х‚ ˜1cС`єєtІOŸЮŸyЦбаЕfэ:Вsr(**Тыѕђх—_rљe—$dћїъй“ЏПўšž={2eЪ222јёЇŸxmсЄЅЅбЃGHЋЙюРP?ўќKНbVѕЯšHњлnЛ-Ўа‹я–/КN­6Е> чл0шл)ЄБЇB—BьСЬ0­jо^ŸЊВ2єпjнR TРК"НAKз{‹a( сqКа@Q ЂЂ+!\]nz ц№ ™UЂ^7дpˆŠŒ>%š …)ж Юn h йДюЊо‚n~Vщѓ]Aхжлц’™™ѕ5ЬК€ЪЪ BЁ=Кu%ћЁKQT† R/@5ЇБ*cuO>SRR№x<,]К”ƒ>˜ŠŠЪo|У4ЈЈЈЄ|Ч6’C‡d/6nРчѓгНGwВГ2 †Bx}жn АЁЪƒ?hRКГ<м%Яˆ—UjУ—BmћeYёЧ”НzIƒа3тЮ†4?„ќшЁbBOЦ`лЁЋ(TD0 Щ•>СWIё$cUUеьиБƒВђr:wюDNN‡†пБ“ўEEИ4 наљщЇŸЉ(Џр”i'“š’ЪoП§FFF&‹НMVVƒDQtCЇ  лn­>1АѓˆИъŽщOшЊн‡V/tiсаУзrašќ~Д№ѕwNЏВ2ЋBhэЕeтСњІщВУуіYех иБs'ЁP(Rт>^ПЌXЩАaУpЛнќ№Ує.,tlо :v ,ј'ЃFЂџўLš4‰)SІDŠˆ˜ІIqq1?ў8чœsNмс;;3Ѓйb}{їjѕ?ŒЙ;6ЛN и'ж'к|Ѓiээ „{;…`(DiY];х2ё˜ЩdeЄYч˜€І‚кАЅkТФIЖЧщr6t™сІ+]‰ W:V‹–‰еšЅсЩУ§ ƒXЇ…ТЇыnнz]Е•шjэмЙ“›nИ‘@ @JJ 7п2gЗѕ …BфчГuЋ‹ВввШыuн~+г–-[qЛw}<№~јadК• .EQHIIс№Учј>ŸЪЪJЖlйJnާы€LЌ–.EQHOMІkЧdŠW-чЅЇžbћіЬК№|z@Р"U R‘ЊГMwЃ%ЙиБЃŒ`а*ЛюФ.‹тbWљƒ`ШGJЧИ4дЬЄЄхb>а“A р­јŠjC!ркфŽіZ r:фтё ŸLgdfX-,ЊB—ќ|є№ЗПŠЊрvYн&•КAз4у^[6oaблoЃы:eee‘ЧѓrѓЙЌТ(ў@€Вђrж­_Яђя­qwВsВqiЧLœDЇЮb [-<ЁЎ [ЛЪь-jэЋmMjќ‹‡:н U-Ф4UЅММŒЏОњŠввВШрОЩЩЩєщгЗE_n4І6мд4xзя)]Кt! ЂыzН.МN”ЌЏЯok~cъБЧтvЛљх—_<АТў ЄЄЄpќБSxт‰'1b#GŽ$??Ÿ””JJJXЗnЏПў:~П?Fу)\2эФулмХ&№l+ IDATпЯ<Ѓ]ЌO[{ŸBБЏ …Чъеѕу'…№ГЅИЗKC4ХФ4t'КšЕѕгу™CИЅ+RДаъ6h„CAј1+p™жxК]с,dU”Ч4AWLkь\›ыЄы:Ё:ЁЫ4MМееѕК]д­кюЁP=гФФ$ Ђišе5Чцr7mкBjЊU†<pйe—БpсЬ›wIIIИнюШрШЕзЗдЖšІЩœУe—]ЦцЭ›щзЏхххlкД…мь>vЯќЌxc˜‘.–@ŠŠJЖoпСіmл)/+ЃЊВŸЯЯчЃКк  1 …є№њ&сбЂуи aНШœ.П#ЈФ“кŒ˜>@гЎд„*№j‡аa№dT-Эжђ]šЦ AƒиЙsЇu ‘ЊЂЙvuaKNё ЄЅE Жд­‚ЉдйnБ*++у“O?хєSЇ“œьсљ_dУ†$'%qмБSpiZdўЩn7Ч;…gўћ,ЁPˆ>Н{sТёЧQSSУoНХФЃŽ&33Ѓ%gњ-b†aP\\\oКввR:ффио.—kЗВкБЛъ†Mг"3ЌV-•Э›7sўљГ"гƒ}ьQђrscќЬШ:еНf `ѕoЋ ‚|љЭЗŒ3&2ž—ЊЊlнК•ЬЬ м.WмХ<JЖ”––Nnn.КЎГfЭІN:к‘y7ЅWЯž\tўy|іХ,|§uJKK щ!:vшHЧ8щјуиT\Ьѕз_@їnнHvЛКNqЄVљ+П/’ЯUБ—“’““Љ*пiбhx>до“еєІЂ*&AУ:ЙеТgЙV7BS%|нVmЉ5Ц’CГZшTLUХе‚ЏтuC'XЇ{ЁU%O'Єы(555ЛЎP(„?ќMИa˜C!ђ иPДбіrЫЫ+иВХ„йяїгЕkWЦŒCЧŽHNN"))Щ*kюrEJhз=?ўpEaѓцЭ$''Gцй’}Щ0t4еŒ ыїћHIёаЛw/rrВq'Й)/ЏРыѕтѓљЈЊra$с2џ:С@Шю…JЃЙ\4wИ*ЁjbšЩсђз !ГwцўduЬ#-Їeнaвггёx<ІІЈVЋ‰Њ Љ ЊоЦ КvыЧтƒ&9йz_=zє`уЦ"&MšиhYђМм<Žš0З/І{ЗnЄІІrрЃљщчŸ9јwй^v—ЮљрУ#?o)йЪˆ#šэ2Xћ\З№ВWЌXA0"77зіrfHOЏп›••офJНыЗLгD7v]KW^QЦ‚Ч ƒL8ьАmwУ0ЈЈЌdЫ–RSS#нъ\.КЎ“‘‘СЏП­ЅcЧŽ}єб <˜ВВ2ыККЄ$VЎ\IчNлжЎ_ЯРqЛнЌ[ЗŽммŽ‘псDJNNbмЁc›|ОGїn|аq/'Z!&їб8 l4єюRДЉИХЏыVЯ‘‡п+з!жх%тН !D;Hfдm0†ПАЕ†– 7м„џп&BWIiЫ–ЏВZLТ-9nќ&Є(0œŸ‡ћ|сщŒ: %К .еХж [ьŸђ›рѓz#]Žќ~?С`ЏЯG’žDeeхn+ сѕyёћ}жЯС •-К§АCFжћљщЇŸцШ#ЊКм‘oфk‰­н†a2yђdž~њщzуњєюбЭў ˜[ЅАc;JЫШ№(дјUj|:Й]z0ёи№zНdffQVФя3№љ !HNUp)žЂ‘™’B‡Ьd”D$E%вСIq…C‚–ЄсqЇ“œ•ѓЌk?kУ0p)jmТ&# SжoиРяъЅ ызsРш§щлЇщжЩСƒQМɘѕ6АџўЃ"aь“O>kQшJKKЃ_П~ЛОьаš.ѕЏЊ*ЁPˆ@ ylеЊUј|~rѓr[єžнn7™™™tщв вr[ЛœM›6Y]:ыŒпщv>`mлОЧ,РЅ*7uJ‹–Џы:/ј'ЅЅЅЄЄЄpЪ)ЇдkС6 ƒЛяО›@ €пяЙP.лŸЮO?§ФлoПЭ™џwšcћAQб&?ЗлMII хeхмћРƒtяжi'яhA“–.c§†1НЖgю~иЁ-~]УBЕъr‘.œЕœ.Аёнђяc^Ї‚GkЏCSЫkИЬf iHшBћ™ЋУhњ2#—УЫŠIя‚ дЭаЉНМЋЖBЁ]Е]]XзpЙУЯЛъ<Џ›VЋ—ЎЙј ћ'чŸw.<њщiiИ\.*++Йъšk ж7фЛЎ`0HMU5>Џ` @0)‰тттИ*эиБƒЁC‡“IRвюЁЋaїТœœvьигВеЅtKЋ&XSF’' н„ЎC йЄuЬ"еД*ъ†–jт1p*ІЫtю—Ч…y&eлq+Yѕv(yељЏ EQ1№8Vа"rrkZЅ№•џnVVUђЩЇŸ3`@_–ї=( cЦŒ‰њКУЧчйчžунїоcша§јљч_ЈЎЎvvд;h‘3.—‹+VФИ€HЫв AƒHII!55Ч)ŽёЫ/ПXЫlPсPUUввв(*.т?O>IВцbЪфcbицU”––2ў|мnw$p[е9ѕHзaŸЯGMM 555”——ГvэZVЎ\Щ–-[8mњЩt ‡F'ЄІЅRUU…лэцР$;;›ў§ћ3ў||>?Љ И]ї$ќяџ{ЃŸqн“як[н–ЯyѓцХКЂвhŠг6r;vˆi=шПзЎCЌЫsтНџђУr9BьгЁ*mЂЅЋЊ&@EyЕuвešЈŠŠ†ІL IрQ `@ВjѓЈ§о ЋUlЛ™I*eхіЋјwмT гр?‚ЁЌ\Й’ЄЄЄШ Yэ hУnX›Š‹ Ќ‹ЮkЋІgФ>˜эр§2d0™™сЎ…ЛJh7fиА§јхЧяcZ–ІiЄЄxШЯеш˜­[УЖ5RИЃЩ(Є(@* n$%Йw+Hр|јRЌš2ћФ.€ƒw0}ќ1ЫП_N^n.ЧwЌ­J„šІqьдЉМЖp!??ї.—‹Уšщ&цŸЯЧіэл щFL ррCЃhУz6mмHEEEН§LQ6lи@‡н+ѓђђ8fђdюЛя^6Іхgfd““Уuз]gkПvЛнx<zvяЦШсCщ{тёЄЄЄ8К]{ВtщR ЩЮЮ&0oо<њѕэуhрШЫНšн~CЧєКЖRHуїgžбюжЁ-Мg!„ЛђZЄC^Йз0 `б›opФб“mW/Ќ ™Tъ0ЃsлЖlŽЋ…gењЭМОє{Ћ+™ib˜ †5`ЎiЂ›fјzЎpх ”ШxIŠЊXЇbЕ)сЎbSNџž]лќЂС@ŸЯЧЦЂMќјуC!‚pЗ“@Рjqг\.’мVИЉ-Д1d№`ztяŽ'Хƒ'9ЙйЖлЮPЇ‹U|yЅў ЗbяP]]]ЏHFSGŒмМ\rrrb^ЮЖэл)++krџјёЇŸ#БКЖЫЃІЊnэЪЭЭхРFЧ5€ЙЎыTVU5jUфdыwЊЕіух?ќРч_|E(Ђkз.Аџ(Кьuћ‘Њj|ѓЭWtяж­оиv 9^ъ:E›Š9r4†ЁЫ/БBˆ„б4МЮ]yzk:ЄКRUЋ‘Ч­шќ№Х'tыкЬŸ.y=рŒџGРчESL\uЊтLѕТјѕяй•ЋЮьк>?PUEѓx№x$'ЇШ'D;уїћйИ~AПЗлuњвВ2VЏ^ЉЈ$%%EТšiš(Š"їr/їћш=@ рУЄ_ПОdgeй:ЦШ1CюхО§+b=^4ЊтNdŽг‹P(ЊFџƒ№ћМјЅдАэŽЊYЧ€Ÿ~јžP(„Ыеє!ЉММ‚+W0tјHВГГeу б•••ђуђх 4ЬЬцOЄф˜!„/ь/œеАrЁѕџ=К***:b$>o5КЎяБФыѕЂы:щщщmb>BД'FШРєšіъЭп}K‡9MNЛnУ:FŒMПО§HMK“'D;TS]ІjќКbУ† mvZ9f!Ч ЛЧ‹жАGB—Ўы”–•‘’šJMUЅН“Г№Е_vК ЕФХ]ЬД“Ofђ”)mb>BД7!#HjZ:ЅeedeeЂiZЃгiŠBя^НЩШЬlбќЋЋЋ1Mƒєє йиBьх223щеЋ7П­ZuкXBˆіwМp”йроЉаKWGУ0№љМКŽiж/…јьГЯђєSOГmл6КtщТyчŸЧ”)S˜>mГgЯfџбћ;Л]LsЗѕиSѓЂ=2Mг:&F“ЁЫ“’JZ -ЩЇŸ2 /ОФб/DМ^/))rЊ{BzF)Љб[Ўb=f!кпё"іdЦ6NWЌЉЫ4ЭzЏй9СЊk†Быu?џќ3їпw?wЬ›Gџў§)**"##У0 ƒІYozЇвЈi80_Їц#Dћ^ЭKyмяї3 o>\і………‘ЧЧќ;цнyуЦЧtјWrыж­|рќЖnН|dBьЉЃ…ѓŽfžпЙcgž1ƒSN=•Г~6[Жlс–›oтЃeЫШЬЬфќYpЮyчЩЦЂ=/Ђф•цЮџNb6rs&tХН!vЕ ­_ПŽЎ]Л2nмatэкЅо4^pSІNс–[naіьй|ќбЧЄЄІpТ 'pбEpз]wБlщ2ЪЪЪшиБ#з]cЦŒ ЂЂ‚ЙšЫgŸ}F~A>х‘Њgžy†Ч<ŽЎыtаAмrы-ЄІІВxбb,XРцЭ›щмЙ3/ОєbГѓЂ=+*кˆЊjфччяімІЂ"E!П `Џ}КЎябыP…изЌ_ЗUгшоНћюЯ­_Ђ(єшбУБхНБp!wоqххeѕџљЇŸшп7о<‡хп}Ыхјc=”Ш‡$D;=^Ф‘pvЛпуƒу˜ІЙ >Œ­[Зrїќљ””lЉї˜<јапјфгЙщІ1MƒYГЮч•W_fоw№єSOБbХ LгрчŸ~fцY3yщх9эДS™sѓ|>/Іipзw јЯSџсњыЏУхr…АСјёуxцПOѓŸџ<ЩкЕkxхх—1Mƒ+~Ёџ€ўМњк+мџ}Qч#7ЙЕчлќЛюfжљчГqу†zЏ_ПžYГ.рž?џyЗз$кCўсћ aєШ‘ќяПџ<>nь>ћєгШЯCbхЪ•N>ёF Fп^…?u ыж­Ћ7ЯТюн(ьоžŽ—_z‰SЇO‹<їЯ Иш‚YђзQn˜}=гN<ѕ ~ЧжЎYУє“Oт–›orty7nрžПќ…п|HНЧ˜0ЋЎЙ†=zpьqЧгЙK6Ќ_'эјxoь2Э]ю{|]КtС w[ьмЙ ЙЙyфpФ„ Ќ]Л.ВьЌЬ,ВГsШ/(ˆ:ЙЩ­=пЎИђ*|>?з\s;w–b&;ЖяркЋЏ!№ЧЫЏмэ5‰ю”;|Ф^]јwЮП‹ЙЗоТЗп|гьєС`ЏПњŠ?ѕя/YJaЏ^ЛШWЏ]ЧъЕы8yкtљ+(DЎОі:М^/чŸ{;wю`ћіэœwЮ9ј}>ЎИђ*G—wсEs№!‡4;ЭoЋWSVZЪˆ‘ЃфЂ/bO[u—i‚Iлjщ2MƒоН{qз]wђьsџЃxS1sџ47ђMxн–Є`0Р=wпЭфc&sд‘GБrХ С@ЄU гŒќ?3+“ЪЪ vюмatъ”Wџі№Д/<џ<'Ÿ|2G~8/<џС№ќЬксзD›мфжžo}њітЮљwSМi7мpххeЬž}[JJИч/ЁWaVoщ;іP 9ъш‰L=і8^{ѕ[Џ+(шF=8жЛ5—Ы…ЫхBQљ+(DFŽЩ=Й— 6pбЌY”••qсЌѓ).оФ}§+У†oеѕ)//чт /ръkЎ%//O> !фxсЎщ2уzЅйDс‰Ny˜9ѓLfЯОг0qЛн„‚СШєo/~›яО[Юўѓ$YYYќё—[Ё'м2e†џ  `&r:рrЙ(кXTЇЖuqнцтЭ<№РпxьБGщлЗ/џќчlоМйšG8ЅжЮЏЙљ˜RHCДsŸŸƒЭЕз_Яќ;яфјуNрЦ›ч0rФ~ŸcЫЊ­t ъЏƒппdФю=КГт—_ЌcCƒь›вБcG***š|ою|„›8iГoИ‘ywмЮAс*ХsnН•#&йЊысѕz9ћЌ™Œ;VŠh!Ч )ЧФnr9ЗJfLгuОхўёЧŸ())aР€ƒ.\H=0LƒЎљ]YВd)нКwЃКЊš`(˜С(Vа2ъДŠеЗa РФ‰Йїо{ЙъъЋШЪЬТыѕaš&СP€Тчї… @ZѓЈ­z™_3ѓ1Є†xН5ќёёєўУяЯ>›)SŽЁІКЪЦqСД}шsЙ\tюм™_W§JП~§Ћ*йіэл)шж­бЙЌ[Л–Ў]­"™lпО-њЊгš•+0 сrЙТѓЩ`ћіэђС ‡ГЮ>›ЂЂ<љяsЮЙч1уŒ3у<яhљ!7пx#љљљм|Ы­ђбЎŽБНЎБ)Ь&nѕBз{‹a( * A4PT‚ЈшŠFA—›^C†9•Й0]!ЅВЂœџ>ѓ ызo@г4† Ь-ЗмŒiœ§ћпsлmЗѓж[o1nмa\}ѕU|ёљܘqЁPˆœœВГГТѓЋmu2" 4 ыч?ќсRzшя\yХUдддаЉS'ђђђШяк•ГЮšЩеW]CEE™™™œxт ˜†БЋ;fumj>uЇЂ=ЋЎ,ч’K.сшЃ'вП__Њ*Ы›?(˜БO8ё$цп9єєtВВГЙџоП0bфHzѕъ™ІЄЄ„’’>ўш#Оў:/ПњЃЭ“џњ7ƒ!%%УЦяovNМіъЋŒ>р†ЮЦ xё…{шЁьиЙCv!bp§ 72щ˜ЩŒeуZ*‡—[Нšwо^ЬK–X­чšІEО\BДГу…нsГЙюКЏw$™0qК !B†‰пнПnт7L|!№šPc4žцbyuЛфtаAtаAЛOoš аŸЇžzВоуЗо:Їбi}є‘zѓ~ц™Ї#?{<ЎКъJЎКъЪн^wц™gpц™gьіјХ_ИлК67!„ЅЊЂŒТнЈЌ(Г}\АпЮeЙъšk\vЩХј§~Цz(<Ж ђќАУy№opчЗSXXШ>Фр!CЌ/O.П‚+/џ#ЧN™ŒЊjєшй“ЬŒŒfзSг4nš3‡;nП` Р5з]Ч™3ЯтЎЛясоПќ™ыЏН†:pњŒВбBšІБџшбЖЯ%œ<Чњілo(//gдˆ]з„œ<}:Йї>љ`„иЧNНІ9{јыгж7ЫBˆН—з[умЃ‘юЛIIIЬЙѕOЬЙѕOОцŽywrЧМ;}.''‡'ў§dЃЯ­лXљзЎ]ы§|ъiЇsъiЇз›ўфiг8yк4љР…HА–œ74WЈчБЧЏїѓДщЇ0mњ)В…hЇЧ уMј^БўЏцЇKU5Jwь$)9Yі!кБd‡элЖЁЊZдiЋ*Ћdƒ бЮUWVкžVŽBШёbOQ”№­6ћь‰•а4єєtОјќ3RгГHNіШ^!D; \Љi|ёйчЄЇЇ7Yq Х“ТцM1t]6œэ”ЎыlоДбжyƒ3„у…нуEьZГza UU%;;›5kж№цkЏ2bџ§ЩЫ•Б0„hoЖnпЦ{яМЂB~~TЕщяr:t МД”еЋVаЕ iщЭN/„иw†Aue%›7mЄМЌŒŽ:D}3„у…нуEт‚X…4bžqmyПHѕxш^P@Qq1‹пzГй1p„ћІЬЬL:wюLЗќ|R=žf#)ЩЩЈ˜ьмЖŠвRйxBДCЁNŠЧc]šхМCŽBШёТюёЂёˆ[)ЦЪХУ,ЄЁЊ*YYYx<:ххсѕzeяЂIII!3#ƒффd[п@''{Є;ВТ69f!Љ%ЙЬ‘аыcŠЊтII!йу‘RыBДCŠЂ „–#€B!кL Šѕм$RБАўџлФˆuOМ„B!„ЂM$ЏиNНŸd˜u!„B!„p,Љ™ д/ЈЙˆтЈI“e !„B!„нpeЗdќв%KЈіжpфб“XЈB!„Bь+Ё*ўW™€Ы0 n3‡•+хќ /UKdШB!„BˆЖŸЙЬeъјё‡ѓШc xу…м4{6оšйШB!„B%“™Э…Б:Й† ЮэwЬувK.хПЯ<УЬsЮрЃ%‚ЂDEW4BИКмє2ЌЮ<Ѕ‰K!„B!viЄzсЗп~УГЏgмјёœ>cFфЩБуЦЃрзMќ†‰/^jŒЦУ\,6ћ5^мžТЪjWНеЋ[т^юх^юх^юх^юх^юх^юхоЮ=РРд'vђв5I)ЃФоЌдxѕBз{яОЫ 7ЬцЬГЮцœѓ/РTTBFыфПЭ~{ŠВм1™г{ШˆёB!„Bˆј§МУЧŸ‹’ЙК[YЬСЫI.ЧУэѓюdќа аczЙх/|q{ ƒ;&3Љ0ƒn2d˜B!„"~=2мМДЭУ%U1цgR‘ ИЦŒ‹шFзfХиПpeЕ‹г{xш–сЂ_v’ьB!„BG юшслjbЫO&˜ІsЕ+"ЭKя,z“#Žnн’•?{\ЊьB!„Bˆ˜љZыZЉІšЕъ>ОиLRŽB!„B$0‰IшB!„BтUS\N-LFыB!„BДХp”˜зиŸГ” B!„B')އ.iыB!„BДUfЋ.Љб’ё’Й„B!„’ЙZ№šІ2~а4Уе MЉ^(„B!„ЮSънKшB!„Bˆ’а%„B!„ѕ˜Ž^>UяšЎї/ТP T ‚h ЈQб.‚.7Н† “ЯA!„BбŽc™ѕЏХЁkТФIш&„ &~tќК‰п0ё…РkBбитЄ’†B!„Ђэ…ЃDЊњЏЋћњ]їRНP!„BБ/ЇЎжy ь^НаДў/зt !„B!DВ^mv“а%„B!„ $ЁK!„B!ZФlpп<—S‹BˆНZQ|ђ |ѓ ќіlмUUрѕ‚ЧiiPPНzСАap№С0`€l7!„B4’ъє/t9;з6ТчƒТB()i~КЄ$XЗКvmљ2юП~ќБm}И> jЦЫЗо‚_l[ыxеU0hаюџы_pій­П>—\>иќ4ќ#<ћlгЯїщoМййЮЌг“OТЕзFŸюŠ+рКыюЂ‹ l;Ÿ{П~MЏыX'šoПэwЕ9ыз[ћо /ић}ўђЫњ?wя'žgž ЃG;Лn7ZлІ9ѓцС9ч8ЗЬaУ`ыжшгmкšжќ4O<_}^“&СдЉђЧY!D‚ГљІЩvЎШѕ iИœzmЊХы‰'Ђ.€@Р OѓчЗ|‹СтХmkzјсњЁkљrxќёЖЕŽЇжxшjЫЪЫ›пŸJJ`ЪxчHMy55ііпЪЪцќўЖГ ЧŒi:tmлfя§ъКsыѓуpЫ-№ъЋёЭwуFxрыv№СpгM0yВ3ыЈыбЗЫЌY•'ŸьЬ2ЗnЕїY˜6Žј‹7џeE­ьl ]B!кdфŠ/ЭЫA IDAT™сџ[џS{'БмAзсЯЖ?§#@E…ь">Ÿ|'Ёl‹ЖЌЊЪj1^zЩй їщЇVј>њhXЛЖuоЎУџ§Мїž|ЖB!„УY%ъwŒ-Ш3ћ^!чžƒ5kьO_^n/!тЕx1\zЉl‡ЖъЋЏЌАѕ№УЮ†­†оyЧZЮџўз:я+€iгр—_ф3B!кЈ}/tХвU№ўћ­!тѕШ#№—ПШvhk^{ ЦГ dД†Š 8§tыšЋжPVfuблЖM>k!„bŸ ]fКšынw­ы˜ZЊИиоЕBиqэЕ№њыВкŠ—_ЖК~ждДўВoМбКvЌ5ЌY'œ _ !„­ІщkІ>Ѓ:ЛР=|Qз}їэ™з Q—aРgРŠВ-іДeЫЌЇDv'Œfю\ЋВhkјфИь2љм…BˆИГJЌ‹ _ fдПпwКЎ\i•HеЗпТ‡Ъ>)œQQaЕ:H‘–=gл68ѕдЖQХё€яОke=њЈ\Ї*„BДR”k>о™‘ъ…ѕJЦПЗx†Ђ` b DE%ˆŠЎh„ptЙщ5dXл{зїпWЧћюƒёуejЫіпп 3N‰6RМ_ܘa]OЄ(ђйЕЖѓЮƒЭ›[і—ЫК6ъју­}­АаРы… Ќ“_^yЅeнјќ~ЋЪрђхрvЗNШ:9Dі!„"‘ЉЫfќЈК&Lœ„nBШ€aт7@7РЏ›ј _М&д –eюсKЛJK­eуЕp!Ќ^ }ћFŸvбЂ–ЯџџГК:E3c<ѕTќячњы­[Klйboк‚(*j§ЯzФk,ЄНХТ…pчpУ ­Л\ŸЏхЏЙ№B{-$=fšЖь7ЌАлGiU6ьгgїчвгa№`ыvЦжОџЧ?Zeчэњхk ю+ЎHќћр”SЌќМ<љЃ(„Ђ}g#3Цз8pію…џќgє‹фЧЗNœšc№аCВg gЭ™яП/лЁЕ\}Е§щХмјw\щж ^|бЂЂ%-WsчЖ^—гM›Ќ/y Cі !„bлћC—aР?ў}КYГьЕ2=ёTWЫž!œЃыжОW\,лЂ5МќrЫŠ˜<єPьХ'ІOoY№*+ƒ Zo[Мїžњ…B‘бЏъЊНэ§ЁkбЂшcяdeYз{nєљ•—Уў#ћpжж­{ОŠ^{qяНіЇНјbИшЂј–wТ -+ џЗПЕnьyѓрэЗ[џsа4gЇB!і–fюКќЊіOОъиœїTЩјŒ>ЭiЇAJ t тЬ<…hЉЅK­юe"qжЎЕЪІлQP`]oч„kЏЕwlXЗ>џМў&Ьœ %%­ћYиm§kТ"B!$ ЕvViКію–Ў5kьД8чœ]џЗгкѕгO№СВ чн~Л MHЯ?oк9s 3гЙ€qлm‰YO'””X@Zѓњ. ]B!$оEnjТцм ]?Н›Ю~ћСюњљЬ3!)ЩоМ…h‰œœшг†Urћvй^‰№о{іІKOЗJИ;iъTшмйоДNo;ћРЛяТќљК„BHr"Ћ˜ЛЊИлЁюЉїwц р_џŠ>]нV.€м\{у<НќВuŽv§§яаБcєщŠ‹сќѓe{9Э0ьwл›>=z5гXBЦŒіІ§ўћшWэ:№@ИђJ{гоr |ѕ•„.!„’Й–WŸ“kЏнz/МлЖEџc~ЦБчžkўЕС <ў8Ьž-{j[ВqЃ5іUМF†.]œ]ЗТBk,ЖI“ЂЬxхЋŠ][яjoВfUЧŽD ‚>nœНBЁќјc§Vјxм}7|ї]єЁ ‚A+~ћ­5шs"йJŠьЛB!іђ8ноКьtџ›:ЕёA: КwЗNр›ѓиcpнu ЊВOЕoПэL%ЖчŸ‡iгœ_П#ДŠ3\{mєiЏИТ:љЗ3ЗˆnэZћг:vт™яКuЮ­‡ІСГЯZ_&Ќ_пќДЋVY-c‰юBэьtB!Фо’Уи=‹ЉЮЭН;ўђ ,[}КГЯnќqUЕЎэВsЗ'J-‹Нл5зРЉЇFŸЎЊЪj‰•2ђЮXЗЮоtЉЉ0`@bжЁKћ-ЈбТQKхцТK/Ч}кGqІХИ9vЏ5“а%„"с)(Ц[C̘сз›{uѕТЧ‹>MчЮpЬ1M??sІНe=њЈьЋЂх†>нчŸ;WЖМНлЙгоt;‚Ђ$n=rsэMWZъќВGВ•чŸŸи‚.вв%„B"žƒе [[ `o№т3ЮW3Н' АзЕgсТжпFь§ввЌb,vОэŸ;зКGФЧna Л-0‰NвhhцLИьВшгmйџРаNlg ]B!кJЦ›­лЛ№•Wь};kЇ%ЫNУ`ў§oйSDЫѕщO=НU%ДіEП_ЖY<|>{г956WSВВьMчѕ&nюНЦŒ‰>н /Р3Я$fКvЕ7]ЇNВя !„HЌDх”FЇЕQН№НХ‹0… (*ATtE#„‹ ЫMЏ!УімF{ќёшг УlЌуiЇY”ƒб—iЇ0‚ Mž —\>иќt?ўЗо*] уaЗєxuubзУюќэŒ+—Ыъ0|8TV6?эЅ—Тс‡лIvѕш}šддФ‡`!„"СYЮжŸцК?L˜8 н„!УФo€n€_7ё&ОxMЈ1b_`\жЏЗјŒЦN Xз^s МіZѓг­ZK–Xх …hЉЛяЖJyџќsѓгнsœt’lЏXй-Q^V–иѕА{­VЂKЖїъe…§ГЮŠОО\§8иR™™ж­ЂЂщiœЖA!„h"9ЈЬцчо`{WѕТ§ЫЕ9Њ ЇŸnžv3ЕгТ&DcRRрщЇЃЗlш:ќўївЭ0ž“|'CQЂCWkД№Ьœi ЭыЏлЛVЖЅЂЕv9нК&„B8šUboVR%rs0tЕЦЖ2э][5fŒu2SUeяvФž}О/НdM/іЌsЯ _Gч-ct5gФИэЖшг§ќГНСuХюКwЗ7]Ylк”˜u(/>ўŸн@т”G‚‚шг§ёЮwНŒі™фчЫ~+„Ђ]ˆ;t™­ЕІK—кќtй2ШШАЫЫГІЊЋ­u…ˆееW[ƒ!GГaƒlЋXкŸіѓЯГ_|aLž=[gЛффX_XE+шRZъќKб‚ekm!„Ђ•˜MќSš{т[ыкBС§Kі$;U…'Ÿ”й‰2`€§bŸ|’˜uјш#ћгмzлfТИтŠжџLЂ…Ў–e!„ЂГЪ–Э›бCzєљк= м+6TMUкxO[ЖЬ^k›Mщоўёй‰рёиЋZ V™єPШсКi `GŸ>іQvЪМyіЗ“ћЛ„.!„{ЁОџžэv†ЉкЇBз‹/F/{м*)й”1ЛDќN; Ž?^ЖC"zЈНщ6oЖŠG8щ§їaЭ{гŽлњл&9й*Єi­ЗLiщBБ—?с(zѕщ-`6lюŠД–)unN ŽœhO>йv>'Ÿlї,іm=$у%Т‰'кŸіЖлЌŠ‘N0MјгŸьOТ {fћŒmЬh-уЦ5_аfШйg…BДI;Ж•PYЧ03JЕt™1ўГeг&ыфЖbэZјјcйE| d фD;ж~ђoП…ћюsfЙ XнэШШ€I“ім6š;WZ˜„BД+Бф”иЛZM]JŽвHЄЇžŠ>6WkkK-obяuбEpШ!ВœЄЊpс…іЇŸ3>ќ0Оe~ё…U™вЎГЮВЎ?лSввфКB!„"ŠёŽДбНАЉШЕћmя]mЭѓЯЫЖ"~Š=}аdб2_l Hm‡з SЇЦМ>џŽ>**ь‡Тжьоз”I“ь ЏхЫaж,ЋZc~>ьП?\wЩО*„ЂЭкОu+хЅŽЭЏm—Œ_О~ќбо‰Lqqќц.Zdя§–•СТ…В7Šј  з_/лСIЙЙpеUіЇЏЎ†#Д^cwpрš+8Œk ˆlзя}ћЖэtп}аБcb—qгM0rЄѕхТ/ПXLОљюОДЊH !„‰cNљё‡яйБ}‡НyлрjгЩn+зјёіЏуhЮ‘GBчЮPRboнN>YvфжінwpћэЮЯїКыьёфДn€чžƒ+фѓuЪѕз[уъйmMбuИї^+œ}6L™b……ддњAыЛяр7р‰'Ќбщщ‰йwc•—gНчГЮJЬќoПюИЃљА{ц™•emo!„Ђ БКісЃЭ-L]Е?†Ћж>цPшŠeДу( ўћ_{гўпџ9ГLMƒSNП§-њДoО ;wB‡ВWЖІЏПЖnNЛќђ=К’“с‘GЌJoТiiж№GеВkBЗlБ œмyЇе§ГC+xyНАcG|•KxР™/‡œ4sІЕœ.VДukѓЋюqўђЫ%t !„HА–џ§v) е••@jlsUъм7 ]я-^„Ё(Ј(б@Q ЂЂ+!\]nz з›АeЩЋrЁV'[œfЬАКkРцYГd?ё;ь08ѕTxіYйN9тЋ{лмЙ1ŸM+hэиџКœ~Ке‚ж§ѕЏ0b„sхѓСъЊэѓй›vѕjјс:TіY!„ћHРЋ_НаФЌК&Lœ„nBШ€aт7@7РЏ›ј _М&д g›€шѕєгіІ;цШЮvnЙ}њРoПEŸі™g$t чмs5`oMl ЇќщOАqЃеpO7nЯ.?š§іГ*i>ј sѓДsќЌkЭ ]B!ƒZу5Эi›е §~xёE{гžrŠѓЫ?ѕT{г-[&И„sКwЗЎ-Юzь18џќ=Гь#Ž€з^ГZфлВЙs-Њбвn˜mmX!„"Ž€зXэ@5!sŽЗzс[oYЃёxриcпZгЇл?Qю`ТIз\={Ъvp’ІСЃZ-‰­yноЙчZЧВЬЬЖПrrрЖлœ›_K_–Сš…BДvВq3эЮЛQJ[[mщВ[Fј˜cЌŠ`N1њѕsv]…А#%ўќgй‰pѕе№щЇ‰яЦжЙГUrС‚Нk ЖYГ`и0gц5q"ИlжiъжЭ:ц !„ћRРk№Xл ]UUіЧРВл" ЛѓўцXЕJv0сœiгЌa„ѓіпО§жЊщt‹bVмx#ќњkbM‰ЂiVQ 'ињюЛ­J‘B!Ф^™АšK^ЛnmЏd|I \{­НiбЕАжЙчкяŠTQ!ћœpж_џ ЃF9[QNь ГfYПуЏОj•LћmћеіЮыCЌъ„gž™˜–їж4~МŸ>ўyЭŸouќёЦŸwЙЌVнгO—}R!Ф G‰Ы7u;š82N—УЕ=њє[oнѓŸMяоЮЏЧ~ћС-ЗDŸЮЉ.>БHOЗЗŽN_Їђћп[ЗЖш_џВn­iи0…Zw™SЇB—.бЇ5ЪйхЎ[ЗчТзI'YЗъjјш#јь3јў{ЋšоІMVЫЛпouLKГЖOЏ^0dˆUщєаC!771ыWXпИ`Бzю9чЖя‚pкiVeФ?†ђrЋћхQGС•WZЧD!„b/Эj-љ+эrb]R2~_Дп~mџ$#=Нm„^бњІNЕnэQZšuвФ‰В8эШ#­›Bб6Г“cЏЉŸ”z9ЩхШЛд%„B!„иWR—“Ы2лjѕB!„B!„hыaЮf ‹„ЎЃ&M– '„B!„-J^ЛџЌ„;жv2t-]В„jo G=ЉubžB!„BьБ`дљІўp(Њaм:g§эoшRžZ!„B!ЅŽ8<Ж€7оXШMГgу­Љ‘­"„B!„1j8<В `и№см~Ч<.НфRўћЬ3Ь<ч<>Zђ!(*ATtE#„‹ ЫMЏ!УdK !„B!кuАjђAГўџ]п~ћ 7ЮОžqуЧsњŒ‘зŒ7нПnт7L|!№šPc4HqцžУS!„B!š GflЏ‰њКF/ћЊ}а n[—њоЛяrёpТ‰'1їі;HIIIќЛB!„BˆН;ЮбTБ†CЛ<ЗЯЛ“ёGL@7@7уYhkМF!„B!SœЫ*Ў1cЧbК!H!„B!œљEoЖrzB!„BˆН—+9ЉщxTЇБЬ%›J!„B!ZЮ­Йwх,УФ4MLТїІ.:hюjщB!„B]m??ЭН+tUT”‘’–†Ђ(д­Џ(Jь-]лМ%^Rqњ:3!„B!„p6!Еє5&ЌоФmЈ@šІа#MЃw–žЦФЅiЈЊ š‹O>ў„C~ї;r;uAsЉЈІ‰ІІ[шк\ePцеIKвъЎ“B!„Bь+™‹м4) $k шХ•Ёz]CЁ}њѕЃx§zЊ*ЋXєж›Ј˜(Šд”№x]1…Ўm5Aв’\#MgЛ„B!„ћRьУCБ†еJVrR]UxЩOU]YAЏ^НIRЖoнLШяCSЌзЛT%жа™dx 9K!„BБЧ5Ћ(ш@’Ір ‘аАsыV КucР€ўhŠ‚Њšh (€І˜ЈJе Œ№ !„B!ФОЙ г il(Н‰ьSЖs'•Ѕ;P1P1QХU1Pˆ3tIрB!„BьГБЫ0У#ЦKЊb.ouZЙЬoB!„B‘афћЭ4­мc ›&Кa?+­њu5†a…žz-]я-^„Ё(Ј(б@Q ЂЂ+!\]nШщ‰еНP!„B!іE†ib*DКкЩ?&&ЏНО?ў˜n]Йњ—е]&NB7!d@Ш0ёVџEПnт7L|!№šАДШg­JxЖж?!„B!„hKbЩ)ЕщІЖЁЩ@AЧD5ЂЯkйЧŸ№ёgŸАБЈˆ%Ы–ЦбНаДnB!„BБ/ЊЭ<†ibMвЈѕУO?ёЦ[‹6t(o.^Ь~C‡ђђЋЏЧКLLщ^(„B!„иG™fИ‚amјjІеi§†М№т+tяжй7мШЊŸ~р–9sШяж-Ю’ёђ9!„B!іQЕ™Ч0MtгDi&}Аd iщiм2w.%›6 C”qї=wЧКT LE>!„B!ФОЩ4УзuŠ !гDmЂЏрхW^EzЇв­Х„‚A P]К3Жа•хбищ3Ќ–ЎxJРKяD!„B!DB“SьЏ1АZИЌLtн KšЋбоЪ2|!ПЕNу”ЗЦл5]НГнd$)сЌGс{<јЗ=r$;Жowќѓ9sЦ N>MvT!„B!іъдл ]†a]ЧЅVјЪMеи//ЙбЅј}~~ЃЯХКzdЙщ“уŽчm4щЊ+Џ`фАЁ>wљ.cєШ‘‘Ÿkjj№њМ„tнёЇККŠšъšИч˜wћэ|јСВЯЗџyђпќsС‚Јг-[К„97н”u}B!„ЂЭЦ­Ш­o7ћuJftО‡1нSк)Й^+–]ъоО!ЏНюz–џ№#;wv|о/Мє2Џ.\ї||>>ђ0ызЏ“=П xцщЇљђЫ/ЂNїСћяѓњkЏ&ddŸB!„h?\ћФ›p%цmЈЊ*{ˆB!„"О\БЗП<є…нЛ …"­ўѕWЮ>k&ƒњїcфАЁмxУl|>_фљ/Ојœ3gЬрпDПоН8`дH~[НzЗyЯw.ю?Šў}zsјИУXЖliфљeЫ–rтёЧбПOoН?wЭ›‡ПN?еЂЂœuц|рєэUШР~}ЙфЂ YКd чs6ћ ФИрќѓиЙcGфu~№гN:‘‘У†вЇА'#‡ х/їмУЋЏМТ ЧЫ€О}5b8ѓnП=В}kНџо{L| §zїbьСѓФ?џYяљ‡џёw&OšШ~ƒбЇА'оŸљwн‰о ћщ[oОљ,ŽžpD“ћWiiiНЯsчЮTVVrУьы9l(ƒњїуьГfВqу УрФууˆёу‘ЯmњI'qќд)ѕж%к>!„B!і~ё79[#Т0 6oоМлу^ЏЗйзmоМ™щ'ŸDZZ:з\{[ЗnхБGСяѓѓч{яры/Пbйв%\~х•tъд™’-[шšŸпь|ЋЋЋ9ћЌ™єэз;юМ ŸЯЧ–Э›#­aї?№Ёu2]Кs'ЗЬЙ™aУ‡“’’BUUЇžv:уЦ ААpЗe6n<Я?ї,@€ЄЄ$Оќт ’’’8рРƒ˜ч<ќП3mњ)Œ9’џўїЮ>k&‹пy—^Н{VїЙ§†хъkЏEз Кvэкш{КјТ XЖt)ЇžvdSб&ђrѓXКd gŸ5“!C†pѕЕзў?{їEџqќ5ГЛй’оZBяН *XЛЂžэ,gїьэєьbЏ(JUwиAD@AŠ"НЗ@zo›н™п СH‚@x?\ЬьЬwf>;Щэ›яwОУ–Э[x§ЕWYЛv oН3€ЬŒLfЯšХˆѓЮЇKзЎlоД‰7пxЯ>§”ЁУ†qлЗГyг&ЦНѓ‡ƒ—_} €•+V№гТ…м~ЧDEE1oо<ЦО№<>ŸѓЮ?ŸГЯ9‡яП›УыЏНJƒ† ИlфхеыяW\Nї=xрС‡˜;ї{Мџ>"ТУ9wФцЭKNv67џѓŸ˜?ЬŸЧ+/Н„ЯчcЬ 7VŸ{ч.]ИњškпчћЦ“O=]§sxx8С`‘—^ТŠхЫЙцкыˆŒŒфЅЧ2ђвK™ўѕ78NџЯ“ <ˆ—_|‘›ўљO&Мџ>K–,цг/ОФсpTЗw kBDDDDA^љ+Ж9ЌЁы0ЩЯЯЇwю{}-Ў*ьЭ+/НDaa!г>ћŒ† UжЬЖyыЭ7Иїўћ‰ŒŒЌ^wє˜zhт–Э›ЩЯЯчкыЎуДAƒїx§ЗЫЎyсссМќъk5†(Жiл†г‡нч>N0€ёяНЫќyѓЊ?ˆ/\И€ЎнКсёxШШШрЭ7^чќ .ф‰'Ÿ`ШаЁєще“ |РПюНЗК­NшSVіцЛйГ™ѕэЗќћ‰џpсEэёњc>Bƒ ˜њёџсvWЮа’’šТЃ?Ь‚ЄGЯžеыžyжYє=ёDќўrо7ŽЇŸ}Ч@NN_}љхћИцКыp:\tЩ%lиАЏзЫ= РЅ—ЄOя^|;sfѕy<ўиЃ4iк” “&уt:ЙјвK9sј0ЦНѓNuшhаА!ПњъЪїтЪ+9sј0І§ї5BWRRв~п‹]B\Ў=жћќГЯXМhЯ>џgŸsMš6хŠ‘—1{ж,N0€–-[2jє^zq,={ѕтё?Ц?ЎEЋV­jДu kBDDDDŽ ў ?lмЎ=ѓХ!^xшЇŒ ч­wЦэёеЋwя§nї§їsшвЅ+ ‰”——S^^Nž= ЌZЙђŸajуЦФХХѓи#0cЦє=†ЋэђоЛујvцLž|њ’’’jЕО'žHtt4_}UP‚С ‹-ЂOпОќјУ|У†Ћ>ЗааPZЖjХВeПдj_3ІOЧщt2тМѓіx-++“U+Wrі9чV. :œЭž=kŸэЖkп`0XЃ—В}ћ”––жjЙЧvэкГmыжнІiвЎm;В2+™™Щš5k2фt‚С`ѕљїъе›•+Wьѓ§шнћвvЄВ_ЈяПŸƒгщdрiЋЃ[їю†Qу}}У ЄЄЄrЩE’˜Ш˜oд_#‘Пм_ѓˆЋŒЬ,6nйJy…ПЦђrППfOз7_}‰eX˜XTрУЄ“ с €“ Ї‹Цm;івИ\NN0`хŸLћыжЎлчvyЙЙlXПž–ЭšюљZ^о>ЏзЫЄ)SxшСИњЪ+iа !wмu'УЯ8Гz7ђи#pбХ3`рРZяУщt2tиp>џьSzј/^DAA}ћVі"хцц•ЯћНV­[зj_ййYDGGяЕЇ/'Їr? {aŸЯЗпgЂ…††Pі›a ОЊeЅЅ%еЏяЙoЁЃОP%Ѕ%5Ю§ХБ/№тиіиОЈЈЈF/fЖУB)Ўтy(фхцhЗ—šчџцsЙ\є;Й?ыж­ЅE‹еCFEDDDЄющмЕѓnЇ› IDATПŸУЖэ;hмЈ.гЄ"dѓ–mЛCзРСЇД hCР‚€eSnAа‚ђ MЙeS€RJЌНчЦЃAdd$Љsя}їяёZ“ІMџTлЭš7чНї?`еЊU<њаCм0z4ЩЩѕшжН;ЖmsзЗЧПюЙЗЦvЛюс ­юуТ‹.т§ёяёэЗ3љiСBшиЉSеЙE№ŸЇžЂyѓ5CЁЯWы:ххх kмc]™ж32~l )))!6.nŸэUЯ-Аmћ7ЫŒЊeьg;ЃЦ6П_Ж+P]6ђђъ!}5aиС‡[‡ѓ о ‡УЙзДШШH<&MЎ>З]~TW,_ЮЛяМУщC‡ђљgŸ1§Ћ/Ћ‡Ёжцš‘?юЏКЅЋДЈњіхћY3йЖ=Fѕ“йВmў@ХЁИЇЫ>ЊŠкГW/>ћєS4lH||ќaйGЋV­xѕѕзiлК?§ДnнЛѓёGёУќљМёіл„ў.„††тrЙиО}ллnлЎ:wцƒёуйВe CNZ§СОG˜ІЩ†ѕ8яќ ўdz3qТ>œ:…ѓ/ИАЦkqqёДoпџ§їџИ~єшъšЩ'pъЉўђї511‘ддT–-ћ…zшOMч}PяEtt4………ОGэ шђЩ{н6 rы-џЄOпОМќъk\}х•м}ч]єье›ШШШ§^[ЗnСщtэsљ ТZ-cNQa!!.'н{ітЇчГrЭ:L,њєэ[7žгѕ[зУчŸ}ЦУ†ђЗП ))‰‚‚"ЃЂИh/УђжІM›x§еWшвЕ+.WпЯ™SРZS^^ЮSџy‚† a[гПк=iDŸ>} у„>}˜œЗп|ƒЛяМ“E?-ЂMлЖфххвЊUkТНїпЯч`Ф9g3tјpЖnйЪ„оgшАatщкѕˆМЗwмu7з_w-чœu&ƒ &22’ДД4N<щ$zіъuаэœаЇOќћ1Ия^š6kЦъUЋyфБЧіКžmлм0zЇœz*›7mцтK/eи№сМѕЦ\нЕќmФy4kоŒ@E€ЬЬ юИыn&Nј€ukзђЪkЏ№аЃrJП“јЯѓшcџЎnџїзФe#/чДSOХуёАhщЯzVœˆˆˆШ1$/'›фzЩДiлŽП.Ѓ}ЧŽјŽЧуЁSчЮ5^ЛїўЈWП>“&NdЦєщ„‡‡гДiГїP ЇгЩћ'ёфO№е—_№б‡SIHH`Ь7аЃgOо?žЇўѓž|т ЂЂЂИђяWqЫmЗБїvШщЇѓж;уxqь <џмГ8œN6lHї=jеЮхW\Сњuы˜:e †aвКukŠ‹‹їИпЌSчЮм}Я=МњЪ+Ь›;—ддT†Ÿy&NЇ“&эЎн„В‰‹‹ЋЃEE…<ѓєг\6ђrRRR*sr2W_s-/Н8–ЋЎО†Цяѕš ЁQЃFјBCИDDDD…ПxЪјєД4R›6ЁqуTVАmуzŒќRЫЖ€ eзъžЎ’€Ma†‡l%mы‚С@­шžŒЦ\а&–ъyi‚ЧЉ™Л>ДŸдЗ/ЗоvћŸъ9о”,жцљ™—VЪФ•й<ПБжm8œN’4фS#ТрsјL№р2‚ќ§ф“ъЪЪЪИѓілyјСYКtiu‹ŒŠ",<Мj- 3‘у[AQщ™$&%qЩШ‘$$&’–žљуѓџо{ќђѓR~љљ&Mœ€a@aQ1EE…dчd3yвD6nмHVV;wюdУњѕЊЌˆˆˆˆˆїJЫJйБ#ˆШ(zєьХВХ?бЛO"#"1MЃrbŒ] УРQ5ЄаЖ!.6–|ˆ ЮП—гХ'гІUЏї›ЭDDDDDDŽ[9Йљ„„„pbП“иВa-СŠ›зЏЅџ€SqhcУ€ИјxzХЦёёДЯ)//ЃАА№7khhЁˆˆˆˆˆд1ЕŒ9=zŸ@ЈЯЫі kTT`ПŸ›7тtИ\”••А‘єєt г рtЙє&ˆˆˆˆˆˆTЩкЙlл"P^†љ›Ѕ%Ѕ8Ню,гУгO=‰ЧКЧГЗ***XКd M›FII) ъ5РыёЈЊ""""""UЪЫЪ1Бі:=Мyу?oЁ  Щ“'ѓўјё”–—†/д‡щ0ЩЩЩхљчŸgЫж­x=F^~9ІУ8NUWDDDDDd?œУ† #ФуaбO‹(+Џ i‹–є?u Ёсмzыm,_ЙŠЂR?БIЩє0˜Œ‚Bж­]ƒ тvЛuG—ˆˆˆˆˆзll,+ˆД0 гУЖ1 Лr"pђ)ЇД hCР‚€eг­{w:wэNyаІмВ) РлoНI…У…гA‹-€RUYDDDDDŽK–eБ#m;[ЗlЄДИƒ 6† ІФЖlj5>аЖmN8Ё›vІгКSWBуMЊДˆˆˆˆˆЫЖЩиЙ“uызc+p:•С ``€iе.t†Aї=hkAIРІ0ˆfŒ‘:шРAЧ4 в3в %9!ŽACN'2<г41m‡ ІQЫž.Љdй–e шъ@ххЄхgсt80Љ \иСНЮh(""""""ЕрvЛ)..ФВРВ+‡ZЖeЉЇKDDDDDЄІ?p U…пmлии`еиЖЅа%"""""ђgYVлВАMл6*˜ЖЅа%"""""rh‚—mƒecYTvt™д~Ъxй;лЖЈ`haSљаdлVш94ЁЫВБ , лЎ ]–†ŠˆˆˆˆˆЂаЕЋЇЫ6СІђО.MЄ!"""""rhX– FхTё`TMяœ6­œёф’c‘”l№я'’ˆŠ{юЩcнцrCИё–HBЃ €ї'–‘]Фn–ртє“lUWDDDDDъћФœЪ{Й*яуЊКЃ лЖ0G.gЩ’љdgёѓЯАi œЦЌY‘›[ТЪ• =z;996sчТ/Пь Ј(‡’’r22Vън…4ЫЎœ2~їг‘Ёj™ EEg2mZs>њ(‰3ŠHKћ/ЉЉѓЮ;iзюTЪЫрЅ—ђ0Œ œ{n,>_+UWDDDDDŽ{yИН^*gЗБ-ЛrИЁ цЎ• 5~њЉ ЇgŸэ!6.ЙФзл‰CЊЛи›аP№љT\9>™†‰iš8NцЭGАТ"6.шИ8Ђутˆ‰'6!qЯ‰4lлA0`чЮЪŸГГСВ,‚ ЃцКUZDDDDDŽзд…ЫщФFQ^_~ё9&6†aa•OIо#t ъуЙJљц›|ZЖ‹dмИrŠ‹—аЇрRaEDDDDDг0p:x=МёqX?І &6NУРРЦРТ КАэн]XџЛ›•ЋЛёэь/yрІ`Єб ѕЦŒ gЦЗ`Yбƒ•ы[– -"""""Ч1УРхrтv‚У‡гЈьѕТЦљж[ЁјТРщД V…ЈЧoШФЩ#XБЖ„њ :qюљЪ-›~§ ФŠЃu'›>}дѓ%"""""uбСЯo†iT.LœІ‰‰UК Њз.#F˜”[a-(юоaџўPbAIМ^Н""""""ћcЊ""""""Gqшњ#OjQш….….…Ў?J7u‰ˆˆˆˆˆЦа%"""""" ]"""""" ]"""""" ]""""""Ђа%"""""Ђа%"""""Ђа%"""""r<Бс“Б*tmлЖбзџƒЬŒ U_DDDDDЄœc_xžofЮ$==З7”жmлqюyвЙ[wUGDDDDDфЯ†Ў/>џœыFЂeыЖ3}Цзмsї]\yЭЕ ;g„*$"""""ЧЁC7ОаљжляXЏAЫ&hAыvэ ёјїілtьо“zѕэuУ_—-cѕжэ вBя‡ˆˆˆˆˆШ>˜ЩѕъэБ№тK/У`іьй{МfYпЮќ†5ЋWгЛї Њ ˆˆˆˆˆШ~8їЖач %>>Дmлk,/їћљtђ$Š6ƒ‡ŸEаэУЖГTE‘}Је”ёяН;ŽЂЂ"Ю1ŸЯЇъ‰ˆˆˆˆˆќ‘аU\\LffѕдЏБМM›ЖdffВuыVUNDDDDDф`BзŽДД=NјрАmњдЏЦђ>}њ0dШщ|ѕхlмИQе9чпџ~%џИ~-лДЁ А„щ3ОfкДOИђškiиЈAЋц:wЏяцЭЅHQEDDDDDіКЬ[oОЩЮєtмо0ZЗmЫУ>F—ю=(ЗіОQ‹-Б]ц/§RZЉŠ""""""ћ ]7мtЃoКЉњ9]AЌнkа /Оќ e(­ZмАa#Ђъ56ЈŠ""""""ћ`ўљ&lUQDDDDDъC›qLTDDDDDф№QшQшљыи‡p„ЁB—ˆˆˆˆˆШaЄа%"""""Ђа%"""""Ђа%"""""" ]"""""" ]"""""" ]""""""uгЁ›3^ЁKDDDDDф0RшQш9NC—mЋˆ""""""‡-t‰ˆˆˆˆˆˆB—ˆˆˆˆˆШБК4ОPDDDDDф0†.Qш9œGгС”,Н#"""""rфй€QBWгRVd—б(мЅ7UDDDDD‰m…Vd—бмUzTЯ ]CBГx-'€6Б]"""""ђЇ­Ш.cUn9з†f)t%8ќ\Ж‘/rу˜˜сее!"""""ZsW)з†fя№+tэ ^##вteˆˆˆˆˆШQУ>„Цвь…""""""‡‘B—ˆˆˆˆˆШQКlQDDDDDф№….QшQшЉcўє”ёЖnъ9цXЖ ЈЈЈ{!ЧхТt80 Ѓn„.9Жм^ RRpЛниvнј^QюgыІM”—–рtљШЃа%""""r<Ў`‡+„ц­ZSZRLIqQ;G‡УIѓV­Yљы2 œ‡B—ˆˆˆˆˆќ5Š iпЕ+%%…К,~JJ,RšЄђЫЂХDEE)t§UJKK№zНњm‘уN0Є  зKQ~оQ}ЌЖm“M\\мкођћ ŒЂ  №№pGАЗыЈНаяїдВкxтЉgјuХŠЃц|DDDDDўъ Sц/ЫЦВЌCі№ћ§5–•––ўЉ6јсGюОћž?е†mC™Пл>В“џ’аѕgNс‘?ЮгЯ>_cй‚…?ёЬѓcИьX‘—ŸЯuЃoаoЙˆˆˆˆ=ЬВj§ѕЮ;у1тЪЫЪj,ПюКQ,_ОМњчьЌlЮ9gФкЧЎ/Њ‚вŸjуH…œп9ЂУ 7oйТіД4**ddf’@ иу,їЖьXБ+i‹ˆˆˆˆ5ŸQэк}>­ЈЈрЋЏІcпЮšХРvVT`лvu›` ђ3Аm§‰уГБmўTGK|8ЂЁkжьяшеЃй9ЙЬўn#Ю=ЇњЕUЋзpљUз№дуџоыВМќ<ЦОќ %%Ѕ4lа€ЋЎИœzѕ’јuљ ЦO˜@vvMЇrїЗ0iђT^{у-"#"yщХthп€wпџ€%KІЈЈˆфЄ$zѕьСмљѓЩШШЄuЫ–\нЕxНlлfкЇŸ1sж,LгфєСƒxъ){ДёћіъcПъŠЫiнКЏНё7mТчѓrл?oІ^r2Зп§/Ю=ы,zїъЉП""""r˜иЕю˜7o>aaс x*_|1SЋ>CeЇд]wнР)ЇœЬ%—\РАagpуЃ9ёФ=њВГsˆсŠ+FвЛw/vюLч…^dеЊеDGGёјуaл\zщбГgOЦŒЙЧsЬUћˆ….ПП‚,ф–›n ++›‰SІpЮйgс0+G<ЖlбœлoН‡iВfнк=–y}^юК§6<'MaъЧsушQdffђТK/sй%гІUKŠŠ‹Ћї{ЪЩ§щнЋ'‹/сЕ7отйЇž$$ФХЦ›>єtКvщЬ'Ÿ~Ц_}Х ЃFСиW^aжwп1dаi|?wпЯ›ЯЗмBIi O=ѓ­[ЖЄAƒњlмИ‰aCгЅKgўДЈК§]оz§ULУр§ IˆуЦбзSXTDLt4ІiвВE ттbѕw@DDDDoьЊeшњzЦ7œ|r?N:БяО;žЭ›6гЈQУъзzш~кЕmƒišффф№ёG“+?џš&†apЧэЗЫЌog3vьKєшо лЖy№С‡щкЕ 7ŒEAAБ1бlмИ‘ˆˆ| ђОЎ'Ÿz–O?§œsЯ9ы˜Ћѕ›HcЩЯKёxм4mв„N:RRRЪЏП.Џ~н0 ІYТіЖ,дч#)1‘ЈШHњї;‰Д;˜џукЕmCпzCЃ†Л/†„„xbЂЃ9ѕ”“Бl›єєєъз""ТЋлђћ§ДhоŒФФКwэЪж­л*ў?2јДдЋ—LГІMiзЎmЩ9"Ѓ"‰‰ŽцДЇюбўЎc7 ЗлMfVI‰‰„„„pѕ•WаМY3§‘УЊ6RdeeГєч_шнЋ'бббДlй‚oО™љ›лhlŒЊЯыЖНЛЭ0ŒЫRSS уєгS\\BNN.+WЎЂАА‘—]B||M›6СЖmlЫТуv“””DНzѕ8љфўЌ^НКVЧ}Д8b=]ѓX@чŽ1 лMЛЖm˜џуtьаў лXЕz5“І|ШЮ; СU\fjIУ0 ЃИЄdзB}>ќў ,ЫТ4MB}>ЪЪЫШЩЭaТЄ)Lœ<Еђ_l›Ф„„§ЖКЧыg Ъф?тЮнKюнИш‚ѓёT= \DDDDфpЋMOзœ9пSП~=’“Б-‹оНz2э“OЙє’‹0 ЃњsёЎ6mЫоcйй9МќъkЌ^Н–~?™™™ФЦФbќn}лЖБйнfDXХEХ~‚Œ#КЮ>ŒєЬLМОPъ7Hс„~§Иш’‘‡uЇХХХ,ћѕWœN' ~њ ЈœRн0LЪЫЫq:œСšК—eoО3ŽЁC†аџЄYЕz oО3€ШШHЖmп~РуЈК<і–ШjОbе?DFD2t№`N:БяAЗяtVfл`0X§|ЧУШK.цЬaCynьK|љеtЮ:cИ~ћEDDDф/Q› *О›ѓ=;wІ3ђŠЋ‚”––ђыђхДmлЇУIE ЂКMгQ92­"PQ§љwТФIDDD№ц/c—М ‹ШЈHВsrjЌЛ+t§і8mlЌпLжqL…Ў+ЏКŠVmкRRZЦКѕXЕfэaпщO‹ЮНwнYp*ќмћрC,§љиЖ};[ЖnХ0 bcbˆпc™ЌœJВђXЛУSЏž=ИяС‡љnЮїДkл†мМ|š6i|HŽНwЯ|іХ—$%%’OfV懆…†тѕzљqСBš7k †AII Q‘QИBBˆ‹‹ЅЄъСЭЏПљ6§ћD‹цb(""""‡1tdбŽ;йАa#?t_бdЯ>7–яПŸGыж­HHŒgС INJЂЄЄ„ ъ󃚘3g.-[ЖР0 С ІaTvВTuJи–E‹цЭpЛнŒ7žгO„п_AttTeИВwguћ‹zКьC8ѕЁѓŒ3ЯТ‚–MЋ6эbCр7чБvЭ&}ј›ЗЇс ‹"Еu[њ„+4тяєЧ… 9БObbbj,яйЃ;?.XШ ЃЏЇWќћ?OтёxИaдѕ4NMнcйe—\ФФЩSyТDBмюЪ@дKNfдuз2qђоџ>qёq<њр‡Є`§ћDaQ/Оќ*Ѕee$ФЧsянwюwг4Й№МLš2•@0ШЙgŸEff&3gЭ i“Ц\tСљ-‹5ыжвО][Pш‘У*2МЬ›7ŸV­Zюб)0pР)М7~W\~)#Ю=›^|…YГПЃgюŒКўZ.НфBЦŸ@ р‚ Fpю9gђвЫЏsѕ5Ѓp8Lтууp98юКѓV^}эMnКљvТТТИ§ж›РЊ9МаЖmјЭЦc‰БegЎIаВ ZЌ ]ЫfХкuмп ?чotьжƒВ СЗѓц“–“Ый\LЉст4{-;w`ƒКrEDDDDŽb@€ ›61єŒ3иВq]?пF[№йДџв$5ЕКwэ`8т“˜aЖ м>ЇЯЏ.#Швљsˆ‹Чс€5+–CˆУР…УгЇibba`c8љd.ОшBўѓФу|7{vюКЉSІвЃgO†Ÿq&‰II$&&2ќŒ3Ј№WА}лv]Е"""""Чгt“›‡лу­гчщёњШЪЮТ4GќXœу?ј€_~]Ц/П,уСћяЇUлv<ёєГ'ызЎ%ПАˆЙ?,Рщѕсp‡т ‹ $"ŠТТBbрЈyЪГˆˆˆˆˆ(p™„њМ,ZИО'Ha^6eUs д%nЏШЈ8fЯžEЈЯ‹išGєxœ­ZЗІEыжœ}ю†ŸЕ”1cn`жЗпrђ€­ gœy&чœх–MYJm(Б $`SЈ…"""""ЧTшŠ `гЖ­|=}:v"&.ЈœyлЎ#пГsВјтЫЯ1l›Ф |шњэѕы7 7/€fЭ›Гxб"Юќлљ`˜КJEDDDDŽqŸ—њIЩьHOgцŒЏ(,*ЊsчF\\<ЩIIx|G~Ѕsс‚DХЦВcЧNо}w<.Ї“^={pољpџНїѓђ‹/rкАс„„F’‘_РђѕiеЁ3FXф!JQDDDDD/г0Чт".&†ВВВК,=ТB}„x<˜UЈ:ЂЁыŽлoЃИЄ„˜и8кЖяШѓc_ЄQJ ЫІYГf<№№УLљшc^;лс&К^=RZЖСэёрз5+""""rL/з‹луЉ~ўU]bЦQЖЊCзЬYГЋŸгѕл)уwiвЄ 7џѓ–Ногхз=]""""" 'ВџЋˆˆˆˆˆˆ(t‰ˆˆˆˆˆ(t‰ˆˆˆˆˆˆB—ˆˆˆˆˆˆ;гZ’ IDATB—ˆˆˆˆˆШsgutЊš""""rДАl+$дйst:˜ЧA??ЊК&К@ЖЦ.W­j|иGo‰ˆˆˆˆ сQбДhгwˆЇЮžgЙПœ5+–S˜—‹гщ<`Mм^ RRpЛниЖОяя{EЙŸ­›6Q^ZrР+t‰ˆˆˆШёИ‚AМaсtъжƒВвЪЪJыьЙ::uыСO?ЬЃДИЇУБЯš8\!4oеšввbJJŠtЁt4oеš•П.#ЈиgїчP>2ZЁKDDDDŽИЂЂ":їшMiI1С` NŸk `QVZLЋЖэ™3sQ‘‘{ЏIa!эЛvЅЄЄ`  ‹Є65Жќ”и)MRљeбbЂЂЂŽшё(t‰ˆˆˆШ )((ФыѕR\\x\œГпя'44œ‚‚BТУТpќЎ'fWM<^/EљyhV^>лŸ~–‚•Ћpј§aaи“а&MЈѓ˜Q‘uКЦ–пOxdTeУУїЈБB—ˆˆˆˆ7lлІм_Fа b[ж!o?-=‹OgЬуТГц;ъЮлоЫ,yЖmSц/ЫЦЖk_“М/ІГспOлЕ  ",1У0(ЪЬ$ыЇŸX4ќ,šнuQCN;fЎ“mлЖVЋ^+л†2љ^k|l…Ў#|""""RwXіЁ ][г28џІБ <ГЏy”_П›АPяБUЋvŸЗѓПœСКGЁйЅ—тіљи4sХлЗуѕК‰hж”˜эё6NaеНїбв†ШС‰:<іи\vйЅєш᧘ˡнКtцМ /dє 7qJџ“1.p8ImкŒЇЧОЬїнЧКM›qz}8мЁмvџƒќАx)ЫVЏХУРСЭєзADDDD‰Cйг•–‘ХeЗНТ…ŸC‡N­)Йюю—џьЭмvЦŒЏџо{lкД™ШШ<kЏЛІzС›nК™юнЛsёХ№ЩДOx§ѕ7xыэ7IHH8иГ=ф5Бђ XљјЄ =’;X2ы;š^v)ŸF0;‡Ќлю Чwb}ŸЦЪЧŸ {Яю˜‘l{У†М3ю]–/_išДlб‚nEbbт_smи•ЕЈе5r”є9?ќшcТ"#p:МїўmкІЫРш1c(*ѓSп2qЛнtьд‰д­)Цlз_9$jлЋѓо‡_ёцџЭgPцќыЦ‹Ћ—Їgц0ђж—8ј“bIп™AИЧ?<р>>™і Я>ћ,ЃFЂWя^ЄmOущЇŸfуЦ<§ЬгецmлЦВl~јс^zщe^ћqqёЕ>‡жЄНыž{а„('ПЬўš>“'M '—ьЧŸРн­A\фяиŠУхЦ—ЭКч^ й}wяЗн-[Жpлэwrт‰}yєб‡№љМќќѓ2|ЁОCо;ЙПecџ…ћ;„Ё+Еqc, hй4JI!hCР‚€eSnA\|<сA›rЫІ,Ѕ6xН^l—#ѕЧADDDDбЧъZєbŒџh:gЎуЬГOcщ’5<њќћм=ц"2sђyы t;Ё'‘‘>2в3Hп™ЭŸЫИЧЎкя>ЏМђ ЃGтьГЯ ^r2Я<ѓ ^x! , [ЗnЛRЫ§•xGy˜ІMš†{вьZЕ™ПnсБ1l§yM.КWT$ййЄпr;Б[SО=›вђ,–џА„”†DХЧ‘ПnнїёўћщиБcFџЃzYƒњѕ(/+gє˜ЩЮЮ!66†+.ПŒоН{QQQСПюЙŸДДгЄIcnНхf’““иЙ3ЦОФЊUЋ‰ŽŽтё?J\\,“Ї|Ш_|‰išœsЮY 6ДЦѕq8юћ;ьЁKПк""""rДЈM/ЦG3гОc{ ‹hм8‰%Ы~хgоaўвЕДъдЗлЩЮєL*Ъ+˜5ѓ{^{ш Z4mИп}ЌYЛ–ќќ| PcНФЄ:tшР?. Kз.и6ЌпА &rлэЗвЉsЇУжcе"dlкŒЇkJГГh9dўь2nњ' ЭSАVlРvљѕчхєКѕ6Мў*;ЪŠ0 ќмЧ’%KЙщЦ1{]ЯщtpћmЗЫЗГОcь‹/гН{7***XЕj5O?ѕaaЁ|0aЏНіїнї/‚С >є]ЛvaЬшы)(, &&š_У7п|ЫCоOqq1<јэкЖ%%ЅQх№BлЎU=ŽІ~ЕEDDDфЈ№›{vцЋ{ы,YМŒŒ”””гМu[–Ќ]CjыЂЃ’ЈЈА”–№эз3yююKhз<ѕ€mцчхсёx№yН{МG^^^UO‹ЭЌogсp˜4kкЌVЧ]лоšкДЖ,Y‚UTD '—Дn&Є рœ…јгж3џчхtЙѓ"ћˆз ЬЭ!p€}јЫЫ)++#:*rŸы4NM!<,ŒЁCQ\\BnNnѕ9ЦХЦ’Я™У‡БzЭZlЫbеЊе2ђв‹IˆЃY“&`лЬž=‡3‡ЅA§zДlбœЮ:Вtщвъšл–}Xj|ИЉЇKDDDDŽЕщ-К}дyфўћ-–­]A“fэp…и4os"Nђr‹ЩЩнЮъKxўž1tlгє кŽˆ ЇЌЌŒЂЂ"|Ё5Ї—ЯШЬЄeЫXЖ…mУЅ—]ТŽ;5j4/Œ}ŽњUУэŽdMм))[V`2oПГ8oV„;™[џѕ/Ђ$ћУё:l|Nƒ`Ѓ”§юУсtрvЛЩЩЭныzйй9МђъыЌ^Н–Ъy!ќ~є*+з, UлSq…Dуp:).]ЯŠ_~ф™нHчvЭКнЦЩWгЇsц™gT/пЙ3eП,уЂ‹.ЌjЫЦ4MnОљFLУрж[oчх—_$2ђр8l†šxš6-+№њЉ№f‘U†стПMчЛю"њДјГГ ~4•`^ ІЯЋi“юЃM›VЬ™3—nнКьёк„‰“‰ˆˆрз_Т0 F^~5ЖmUЗi[•џНыYY–eIvN.5ZЩYgч”SњяYЛВЇKУ EDDDDў„?2LяЩ{ЎЁi|"›зЯ&>)žŸ…s?ч‰лЎЇGЧЕjЫ4 ўўї+yэезљpъGЌ_ЗžЙпЯхŽляЄK—ЮtюдБr]›ъЁncЦŒ"5%…‡z+< У эƒўjsнеd™xcBl/СяцKПEѓЋЏ%ЌSGВ&MЅ№Ц1„dь„шv8"hsнеlїoчžУ ђц›уиДi3лЖmчЛйп““C0лЦ_ю'ж8цЧoяўЙEѓцИнnо}ї}vюиЩ–Э[),(Єя '№џЦŠЋШЩЮaеЪеел{М^6oо‚ДКG /‘Ѓ†eџБЪЯ<0Šбw?Ыw3пeчж- a>:нz3‹яПŸжѕ<и9œъ pв;”~ј>ё 3Ї„ДH+В+шђрЭažіНiгЦм{ЯLš4•Лџu?Іiв85…†) 8їœ3yщхзЙњкQ8&ёёq8]ЮнCmЋjHцюŸNwнy+ЏОі&7§ѓvТТТИэж›8хдўф№є3ЯSZZJbb?t?^Џ‡Aƒ№ілябН{WъеK>ІЎk#ПДВAЫ&hБЧ”ёA Ъ7e|‰%›Т Ў&+#+ЈЙуEDDDЄі7oт‚K.'mлІ?мŽmлLљd6Э7 KћfG§yзoд˜‰яНCу”TœNч5йАiCЯ8ƒ-зеКэпЭeсгЯбд,Ђ^ˆA!†AАеdU0ŒюЗмDђI}ъєЕеЈq >›і_šЄюYу§q8Ф&$ђЕЃ%с№9 |&x pA–ЮŸC\D8ЌYБŒј˜B,&˜8M [=]""""rф™Іƒмм\м/хeЅЈ У08џŒўЧФљzМ>ВВВ0MЧ~k’“›ї‡j’|RNяв‰ХЏНХїЫ—ШЪТt8pЦФпН Ї_ћwœaЁuњšђx}deяПЦ….9ТЫФчѓ1wЮl JЁ‘CYii=_зGxd_|њ>Ÿг4їZ“PŸ—E вїЄ)ЬЫЎuMœaЁєИх†]‘Дъћё1 žлы#2*ŽйГgъѓюЕЦ ]""""r\…ЎШ№6oлТ?ў={[gЯ7++‹гПІТ_JJƒFћ ]‘сlкЖ•ЏЇЯ CЧNФФ%WЧ'[пїћ=;'‹/ОќУЖIlа№….ћаT….9т<^ѕ“й™‘Юџ>žJaQQ=з№А0тттЈ—˜ŒЧыйwM|^ъ'%Г#=™3ОЊг59<5Ž'9) Я{ФGЁKDDDDŽ8г0Чэ!6&–ВВВК0=ТB}„Ин˜†qрš„Иˆ‹‰Љг59l5іxі[c….9ю‚—ЧуСэvW?гЉ.2 у ƒ€ixМ^мOЎЩ‘ЌБB—ˆˆˆˆшГЈ&ЧИ?=‡eYЧЫ$("""""rАwхœЃ%tй–…R—ˆˆˆˆˆдЅдeйGQшВ‚AН)"""""RЇR—<šB—mЉŸKDDDDDъVь:š†ЪБŽ""""""GкІŒз]"""""Rg‡ібXšHCDDDDDЄFъВЎс…х†KoŠˆˆˆˆˆд)e‡0ч˜†и```ЦюpW§П6&•Џ›&UIЭ4 œфјєŽˆˆˆˆˆH’уKРiTцžЪџєтутШЬЮУЈ^hšрРРTСX† Gа&'КQЭі8pЫВ(..цЛйГщзП?aaaiсц|їсссtъм€єє,YМ„†вІMлC*їЅАА№ˆџЎФ\^^ŽЧу`ёЂE†Aч.]іЙЭж-[XЙrЇ \cљв%KƒtыжэуќyѓHLJЂI“&ћ]vЌš9ѓRSSiвЄЉўРІM›XЗv-мяz@€ЏgLЇї }ˆŒŒ<ъЮcЦєщДlй’F)){}}ХŠхAттуёx<фччГzеJkќnޘ>F))$''W/s8„††юЗЅЅЅxНо#vў?ЬŸOLL Qбб8NvюмСЦ iпО}uMГgЭ"44”V­[ XЖьмnНO8ЁК­… PŸO‡ qЛYГf5yЙЙєызŸwх?жege‘™™IDDkжЌ!&6–:дБЈ}Ы˜ћ§їДiлЗлЭŽД4ж­[Ч }|§Ј§ВВ2~ZИњ m[lXПььlњєэKDD„ў0ˆˆCœјЊWˆaуТР ИLp˜ІUЌА111ьЪџfзMYP5ќpWЧ–ѓДгђбGSЙѓю{1€` ‚ЏОјœГўvяОїP9Žб™№ю{ЌнИ‘ќтr"bуhжЖ=НћѕУы !ƒœœ\>§d}њєeЭšефццбВeK7iB  ‡P‚„;*OцзeЫXОќWNъзŸффdІOџŠ˜шКuя^}Т7l`ўќљ\tёХ”””Аpс2вгЉЈрѕziкД):vмw`)ЮЧt„;`Эъе,\ИЮ]КаІM~љљgЖnнТаaУЋЗ)))су>d№р!ФХЧ$H  ЛИ€  ##ЏЧKліэiоМyѕvSЇLІuы6фчч‘––†aЄЄІвЕk7LГіs–ЄЇЇГiуF6oоL›6mhзО}eŠ.-Т0 ЖЏ]ХŠхЫёћ§$&&вЋwoМ^/7l`ёмЪџ›PљІЄЄтrЙиМn-лзЌ gЯ^4oб‚ЉS&гВe+rssЩЬЬФВ‚4nм„Ўн|ьЅЅЅdnZЯ ;циsYQцNОž1чЛъж‡SЇ№З#(//gъ”Щ xРa]?))iЏчАdё"ЖoOЃЂЂ‚ааPкДiCѓ-*џё 0WEYѕѕЛЏ:ьЋ лЖљё‡HпЙ“’’м^ѕызЇsч.„„„——ЧЇŸLуф“OaХŠdeeтѓљшж­;ё ,\А€­[ЗтЂ]ЛіДhйrПџPАxб"ВВВ№——Jѓц-hеКuhШЪЬфчŸ&33А‰ŒˆЄkїю$$ь§^Эƒљ= ”,ЬЋЎU0фћ9s(ШЯч”ЇZљ›ЗnУщ/ЃAЬ \пЭžaФЦЦВrхJ**ќ4hи^НzГ#-ЅK–PT\L|B<'œаŸЯWНэњuыXіЫ/””–M‡Ž˜љЭзœ6hpѕЙ s ”WŸЧŽi|7k6экЗЇmЛvєlпЖцХEcчѓыВeєэкЉњї&X˜KЄ3•њбћџр§ћzќДp>љЙyЄ6nLjуЦDEE§Ѕџ‡3Аoя?ЇФЧPАc;iыVгЖIeшZНvХ;єЗПUDеšЏПžAi‹І$$&’——GккUœxтIЄ$Wж6ЉkgІNТіuЋшаЁђяwxbЉ‰qЌћe1Ž2Я~пv9˜іГrВЩйЖ‰г "!Ёr8|rd В6o`УВЅœдЏпŸj?<дУў'жиЎQ\ S&O"{ыFъwшЈO0""Чг4*oЅ2С…Ч„œ&8й5:АrЁU=фАђПэЪ{КЬнЃmРљЗ#=j47оt ŸйГfсrКшбЃ;яއ‰У‡сЁF^zЁ‘‘ьЬЬс“/О МĘЁgœ…e№џэwxењЧ?3ЛЩ&›Є‡Љ$Ё)$!TADКŠzх*іђУŠ ЂWQDEАqХЎщHБ ]Š ЁP@‚Ё‡є­3П?vwv'xНо{еѓyž<ЩО{цЬ™S&ѓїœїP))иЪKйЕm W @TT$v›ВђrlхЅ˜d•@Ќ_ї ЧŽcШ!„GИўЩ*–J$ЛГбћ@hTьи+J5лкѕkQ…A§ћa2™(//ЇДДTwLMœеЈ&ђЖK~~§њ]AВP’VœеК<YХV^ŠПЄ`6JTЛЏkл†Еdgча-Л‡dгзkˆ гЎС^YFўŽ­єыпŸОНzpЁЄ„E‹вЬа 0єхь™3rшаA, ­['в+7›V ШВ{ЉЕŠуEЧ‘ьЎшн‡нЮ7kзВcг:Ўx™ЉIHv ›7oтЖлЧзЈrl6;W ЄГл+ЫШлў-§ЏМ’+ћіІЌЌ”хK—apкшоЃ‡і№ќцыЏ““л…ЌЌlяьбУ„ње4ЄN[xˆguчŠ‹HNNцмЙsT]8ы*Ѕч ч—#ЧQЊ+Е‡šп3НС я/6›•‹Рх=Кк$”ВВ2*+ЋД~сЈ*УрАелз.–‡ЂИњ~яюЙQZZЪІй^^Jџ.oЄЇŸmпДŽœ.Й„хtfзЮјfЭJbbbhнК5крШO?Бљ›/iЁѕНšT:Ќ4 Ѓs‡Ж˜Lўœ,>ЩњuыU2лЖеD§ч‹?#%%•A§ћb2™8sц ў8ъНЮЦŒSƒг†ЃВЬ5vЊЋYГbƒЬАAƒ5Q pьаZХF58~k_Q41ЃZЋ8~ќ8gkєщEeU_}ёжВ 8vzцц"Щ2п|§5пm^Я•Џ Јш8ОZMnnWRRS8О„ЭжКЦЄІж/vUKЊЕŠ`ЯЌoW>пЛ‘­жd"ОE<9]ru"АЎњшлГ;?ўx˜ƒ…йЕ} aaсЄЅЅ‘ššJpHШхŸНВГ9H+ущЂc„њтН–жёБ8Ћ*8ћЫqтbјЉИ[y)I-у№їДЕбŸˆа N§|ѓЅыМoc jTпhLўХŽ­МГQжх);mœ8R„љђЫ~Sўuозx”љU}\ џЂ U—gЫˆKpљЫюЅV@‘Q‘нž,Pн[hyюїn—Ч&БSЇЮDGEГfѕ*†_} K—,bарAјЩ2(Š+3 ќŒ2ЃFТсTБ)б 3ћŸя0bшP%LЊ[йКєюEBŒћMy€?ж2—]ЖYXБ`.eЅЅм0zŒnЪ…ZYŒйЧЉbtкБ•_аlŠOа&=‘Ў7•QЁСл`Ѕ9+ЫйєNЇ“ыG"99E_Љ6 ЮЪrнy(иЪ.`R˜eЈp_Wіe=ш˜юzрŠшТюл8ёг!ZDЙ|хЅddЖ%#1€ ˆ0’тšsЌp].щаР›діьaOA%%%$%'б3'›ддTЭ ЂwЉTbА[вПŸіZбЁ_~љ%цAЎKƒУ†НМTw]juЊЭVЫю(/%1)‰ЬЄж˜›6ЁkчKYБl—хцряяS…Ша šјыŽ?Д;Ÿ”ж ѕлd1M›PtИіЉЩьљщ0БЭš ЊPќгaZD†Stј бMC ёsНкўНгћRЗ“ВгХмxЯ=š&ІЉоћтЈ(У`ЗдЊЗFч!Ы\он;н*Кi(ў=КёщЧ3tРШВЌыgв\§4МGwvoпFГж­Д>ЦЎo7ыњ^MZEGв*:RћгД eЇŠйПѓ{ВкЛDзwзhbHџ~šї+ЖYУ^ЇЦŒSƒнŠНЂЫ…ѓЬћєbc›3tи0 oн;ф1jЬ кqeeeЌ_ЗŽУ‡КЎ!!ЖэкбКu"NЇ“]Лv"K]rЛzЧУЪ ~}Еq№sBK~јс{юр­ЪкeъЦЦЮ-›hAьЮZниЫ.АbљrLЊC+ЃМЃУЦїзГcЧЎ9’V ѕжЭщSЇјaѓ.ынГь}ШО$=ИИxЭfЮœ>Х† јiяn?^Ёuе‡9аDчЖ™tn›Ieeћіюcяž|6|БŠё-hлЎщџБ)ˆyyЛ(:|›ЧоЂ•БќЬI§ќkŒ ?ЇЊsg0Ы`)9‡Z]Aг§НЬ,УЩт“uŽ)ge9XBъoО4&џVб‘ј+vЖ­ћšСC†hІА№?э+@q* дыбџWЪ№ѕЋ№W\š™ŽI0@№GТЕ^ЫЕ†ЫOvyИ И…—,ЙƒЊШ(ШШШЊw —kкЁфž^(!ЛЇ% Ў9’% вЙsљyy<љє3””” Њ В~Ј’ФЖ­[љzэ7œ9{Ћ]Ѓ{U5–ВТТУ1Љ ŽŠ2ZDFшѓbЯcŸїо‚‚‚И}ќкњ$_1 л,КуŒ;ЮŠrЭжЕѓЅ,Y̘ƒЛѓHJJ&5-фффзe)U•Ф†5хТ… Ќ[ЕŠФqуtk)d›ЅЊRw^*ŽŠ2ќ'’Зќ­cbtщBќŒTŸ?Џй•D7 ­•цф™г:[Mц-YЬ§ћIKkУ­їоsёљџ–jЂ›4!Шр§ODеЙ3ь6ќ§§1:lККг:‘ЕЌЖZvGeqсa:{Btжв*ЯžЁI\ мyы­КуЊЊЊјiп† шЏ[—-9О9пэјŽРЋЎтШўН$'&ЂЊptџ>zuЩсЇНdeчќЧвћR|фG"CBˆh`НžГВƒнVo;6&‚нЛйОm%%чБXЌЈЊ‚­ВkщТТТъьgAfдъ*т#Уuч2ШКОWЋп+ 7n`пžН”–•сАлБлэhЧ:DЇЮuсb4fœэvЊЮeЮЬddЖхъЋGдЃћbpиIiЏнЄ-[JxD87މеjaпО§Ќ˜?ŸŠŠr$I&55•a#FxЯ]Ч8h`Т,KКv3ъЦЦЉЃGЩЮбї…Єј8혿Œ‰ _ЌЦRmсЎ{ю!::Коz9uъЭ~‹экгЋKŽюЛ+|ІЎ%6%!6–—_šFaо.rКtЉЗ>| ІgN6=sВ)**bўмЙ,Ÿ?Ы€\~yп:ЫДfЭj6Ќ[Ї}sУ˜LўМ;gŽfЫэк•!C‡]Днѓѓѓј|СЎНn$IqЭѕиuЄLIDAT/qœŽZ§аYYdГ(lЗсЈы^dБдКїњоЗ%ЋОŸ9&M|мћт"&†ћxАQљšќЙaфH–,^ФДЇŸB–eЂЂЃЩLJ$oз.%PœџzўК1ЂЊЌXЖŒƒљљм6~bDUrєШоx}нКї`шА‹ ˜VqбјI ЅчNjчЊЋ>tяY,ефчхѓ§їпQx ицБ xй9йѕЖ_п^нЩэ|‰W6m ’ФЃ=ЈйЬAц‹ЖџцYМx7пr‹ЖўЪCЈйФщгЇє}SU);ŠІ!0BГр,РQM@€з+WVršГ_чWmеH5кQ5te7њUў)­[№№џнеbСbЕвЄIо3‡PГ ГПŒЊJП)pMСўє“)tŸ+ўЇOлЗˆa~з жЈ(žЇХjГrћИ[ywЮІ?ї,=ђ(ёёёкƒiоŽэм}ЯНК|L!СuоіbТылuйщ@БZ1aќt`?ІЕ4?>шЊgUечЄV-щлЛ/Н8 {U%7мxЃЎЎ x}цk 2Дж:Щњ8qт%чˆhв“,е[6›М]ЛиО}ЛwгЌY3rКф2ъškˆmоќЂч15 %МImЏyh`lЃџщ,[Ж”5ЋVqїНї‘™™Yыћ”„V|Зe3еeЅк‹Ќ}{їa)/#=) “,‘–œ„ЃКŠТ‚Вsrм"вТЁН{8hP}XБYьЖпIДl^ЛьП6“9Ps чЯŸgчЖoщля wšп–ПЭfcіЌYœ}ћ\F“ зл]‡УСГSІачђЫщйЋUUUьЭлЩЈ‘зjeЉЫцЙЖŒдd6Џ[Kvv6Fз”АŒд6Џ[KЇN4ля~лж­ЌYНš‡}ГйLпоНјjѕчܘізMTt4gNŸІфТКwяЎЕ­СЇ­чЭЫљѓчИѓЎЛ]^…‹фХЖM(?–ˆШH~ўљg–/ќLзЏъыgиkї+ЩЁя{5ЫNсО2“ЩФŽэлйОy#fsvЬеC‡№ффIМћі Иr AAA=r„&M›аІM:SŸŽіэ;0№ЊЋ=N ЊF™;nЧћяНЧд)OђиФ'HLL$П`ВтЄ}fКц_z UЧ80ЊNЈ1оќPtcc№•јЧГЯАfХRrЛvуDQ+—.Ў]їюёœ–”ШЄ‰ёмГЯтЈЎфі;Ц#I2лЖneжЬзшнЇ:Дуфёcк9у[ДР`0АkчN i“žNPP'ŠŽГhб"š…бГ[.&ƒTo}Ьš9ƒC‡“›л…'L)ѕ?С‡МЯ—_|СЭco!<4XЛ>ЃбHœ[@їще•KёіЌŒs‹…оy›ДФжДMOC’$’ZЕ cЛLц~јЁцBBCYјйќ$•ў—їжълfГQќЫ/Ў._UAUљз9%‰Vѕ„эџ7п|C€ЩŸШШ(Š‹‹Yјйg„7 сšсCМ?7&ЋеЪєчџAёЩbюОћnlUœЌЊ 8$„p!Рр†kw-YrЏЩ-А ,Й‚z"ЪЈрўлхѕryС$UвМ\’ЊКІJ˜0™L(*(ЊЧгхDЦ5Нpиа!?vŒюНЃŸ‘11Œu=/OЩUdIХaЗ"K*>Ы,jй{єшŽЩпШєi/a­ЎdарС\vY/Žџ|ŒЩввл0x№UЬ§фS-/‡УЪœйoqіьќ§M$ЅЄ0qтујћеWищАЃ(-`3'MфХЉS™єј#L~ђ)ЦПO>zŸйoНNLL У†`к‹/ Ѓ4x]NЇ е'o‡н ЊS—FU8v­1dYYШЪъ„ХbЁЌЌTЫCuкQа—EBб•1#=+њѕeЦЫ/QVZFзюнљП шзЏ/ћі№и#Q]]Хэуя џ€8ьV† СбЃGXќй|$YІGЯ^мpУhэ<ŠЄВwO>э;ДХ УЎОЃi“[{ˆъВyhл6ƒoЗlЂmлL-ЯЖm3иМi=экeжЊЃп+}ЩЙ3ьн“ЏЕ]HА™gІ<Э‡|РєiSБZЌDFE2dш0эЇнІkлуЧŽpВј]Пj(ў§ћQtќ=2ƒбHdd$зŽМ†ЏОЂЕY}§ЌЎ~UГяе,ЯиБ7ѓжЏsчэЧпфOjj*C‡fЭЊеZšддd&?9‰ЙŸ|Тф‰"KёёёŒНuœ–fџоЂ"ТЕЯЇЈNœvЋћГФИqЗ`ђ3№дЄ‰<1yлЖnцвK:рgќmбъЊъФщА586кЗoЫпoЧТљ ˜їщЧДNLdдЈыyё…Љ˜ќ uŽчж -yzЪS<9щ fМђ2ї?№пnо€еRХšUŸГfечКВ§sЮЛ„‡‡ФўН|Йf%ее儇‡гЁCGЎНю:B‚Эю—uзЧ 7Ž!&6і_кnтпСњoОЦjЉтэ7gщь111Мёжл.AdfђфIМѓЮ;L~т1ŒF#ГВИхжq}„Ь§їпЫ{sохещгАйЌЄЄІ2iђ$ТšyУрŸ,>С„яз>џљ([ЗlB–e.^в`Y“ПЭZЭgѓ?ЅфќyB‚CШЪЩfєш1Z;ќ–ќЯž9Хо=љLyjВюиО}ћqчнw‹ч@ јƒ!Йƒ`И„—{пbЗSTЗЬ-а<ž.Tdw Щ§—‡LВ:Uu -зк/ХчГчoEQЕЯNе“NеŽё ’(ју1jфHnМщ&ЭЃбўёь3ФЦ6чŸрuйŠЂpУшQ<№ШђйыыПЭцM›xсљч˜їйТZ›џыC ‚П2]уйgK–\{<]N‡ƒЕkV†б “—З‹шШќ mн—,IŒю“%ЩхщТ=_бхѓЈ6ЏЧЫЅк$е}rEEuЯgTTwсTб@шЮхt ЃbќгНвлЄб­k7н1uйЅeх tY.§Џі‘ ц“““CHH( љчлoвГGš„џ%ыC ЯnYBлќX–нО+YBrЏщ’дkК№ёtЉю}М\!у%Mч\ОТK$ЏИТ%РTOьyїnЬТЭѕGБc@сзЬј}§uВ ТУš2іц›ўыхи“П‹Ÿ|DUUбббєэн‹Пн<ЃќзЌ@ u/мSqyЋ<ž/OфBЯњ-ЏрBrлМСЗTЩсєlя…[HyЇz~ƒїГ7­Я1ЊЋ@Њpw @ ‚?ВиrыIђˆ.яTC p8ь|Еr)сaсјdvюкItT$~Fƒ+ЂЁlpmЛe0И—ф/yЯ ЭєdюgЎРО‚Ыѓ’;‚‡з&@ HбЈ>bЫWyЖжТ3НаЋ\ž(яCpŒЅ^Јк/й-І|Н\H^ё…фГžKЊK @ ќQѕвFђnЛЅ‰.ЯєB$МS ё .еGpQН.Љ†ФѓxЏХЦG`ЉођhŠй…@ рŒTcЗNtI^O—${іщђЬt 1UU]{ozTЈ.O—G8е^.ЃAЎэйв‰ЎтK @ ў"Lв/Н’нћЋzТСKЊ7RЁGpyвЛCbФоWxЙч0zD•oЌz№ђM/@ FСЅ§MэЉ†оп’[pyэЊ‹Ъш{„ЄzєxН$IвЂzж{iyLB| @ ‚?“иRы^žžOBOљbЫ#ЕŒ5-zсхUuюхažа№О%AФа@ &ххZИЇШnсхEеM'є§V ЄЁ—Nš<ЋW|oьzo†b.@ @№Їа[ОЅКЧЃ}|їюrI/U'Ц|џ6њшЌкЊЎЕЇ А'–„ЋK @ ќљ˜юO_Ёх‰NXз”BjŠ.t ­ёUK•!ТФ @ ‚П†ов-ЛТ ЃvЇNтСћяувŽHMJЄwЯКЉЈрЦ1cHOM!#-•›џv#?>ЌЫcїюнкДв^нЛБlщвЉN'SŸ{ŽK;Д'#-•;ЧпЮљѓчХ]@ @№Лтpиiб*›Эж Йh зgЭ$..ŽЯ/сщ)S˜7w.Ÿ|ќqНщє*+*љtў6nљ–3gвЪ-ьj’”œЬбуEDDDђє3Яpєx‘іc6›,з}їмЭЦ xqкKЌ]Пž ?ЬЋ/ПЬяПпшJšѓЮ?YЕr%ЏНў:›ЗnуЃO>Ё{їџѓлГзe цЭ‹Ус ККšЙŸ~JTT/ЙЄоу v3њњыШэк•ЯW­fоg bєѕзQYYЉЅЛpЁ„хЫ–В`б"ђ і••ХЗп†Эf ММœk†ч№ЁCЬœѕ:kзЏчЯO%(8€ŠŠrЦŒКI‚…‹—0сBl6cF]OUUeeeмtУЂЃcXЙц fЬœХ;ГgsВИјWЗѓыГfђбGђд”)Ќљъk:tьШєiгФ]@ @№ЛRrю,‰IЩДl•€SQАZ­Ў‹ўЧxБŒ.ын›;юК €ДД4ж~§5›6nрцБcыL_tМˆ+ЄM›6ФФФаЉsчыХэпЗеЋVБaѓmнW‹-9QTФG~Poйъ*kЫ–-щм9 Y–‰ŽŽ&=#у?оX>ќ>ќіљъkЏmpdZZяОџwпy“&>ŽЂ(Дlй’ЙѓZяq3gМЦ•ъжЃM›ў2:v`н7k4xˆ[Б;xюљЉ„……0ўЮЛxянw),<@Лvэ™?o.чЮeЩђeк”а-ZjyЮ›;‹ХТЌ7одЪѓњ›oб5'›ѓчsѓиБЬŸ7ЇгЩ+3fРєW_хŠЫћќЊvV…йoНЭwоЩЁУИ}ќьЮЯgЭъетN @ ј])>ў3ЭутIi“ŽбXw4Уџ€іC [3дIENDЎB`‚classified-ads-0.13/doc/scenarios.txt000066400000000000000000000007641331670245300176170ustar00rootroot00000000000000Small stories that have some consequences and hopefully not many unintended consequences: 1. node with empty datastore connects a node -> good outcome is that it can receive list of other nodes currently on line and connect at least some of those so that its own presense in the network with valid network address gets shared. 2. node with stored list of peers is opened -> about some intention as in previous case "with empty datastore", now we have some nodes to start with. classified-ads-0.13/doc/sysinfo.tcl000066400000000000000000000013141331670245300172560ustar00rootroot00000000000000# # small tcl/tk program that just displays values of platform strings # set sysinfostring platform=$tcl_platform(platform) set sysinfostring $sysinfostring\nbyteorder=$tcl_platform(byteOrder) set sysinfostring $sysinfostring\nengine=$tcl_platform(engine) set sysinfostring $sysinfostring\nwordSize=$tcl_platform(wordSize) set sysinfostring $sysinfostring\npointerSize=$tcl_platform(pointerSize) set sysinfostring $sysinfostring\nTcl_Version=$tcl_version set sysinfostring $sysinfostring\nTcl_patchlevel=[info patchlevel] set sysinfostring $sysinfostring\nTk_Version=$tk_version set sysinfostring $sysinfostring\nTk_patchLevel=$tk_patchLevel label .displaylabel -justify left -text $sysinfostring pack .displaylabel classified-ads-0.13/frontWidget.ui000066400000000000000000001077121331670245300171570ustar00rootroot00000000000000 frontWidget 0 0 855 950 Form QLayout::SetMaximumSize 0 0 4 0 0 Classified ads 0 0 0 0 14 true Search for classified ads about Perform Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 of 0 0 in Search 400 400 QDialogButtonBox::Cancel|QDialogButtonBox::Ok 0 0 My profile QLayout::SetDefaultConstraint QFormLayout::ExpandingFieldsGrow Profile address 0 22 16777215 22 10 Qt::ScrollBarAlwaysOff Nickname 290 0 Greeting text For the rest of the world. First name Family name City/country BTC address If you wish to receive payments via BTC, include your BTC address too. State of the world Longer explanation about state of the world Profile is private Readers of profile None of the fields is mandatory Time of last update 0 0 Publish 0 0 Revert changes 13 75 true Details of operator profile: QLayout::SetMaximumSize 0 0 354 451 354 451 Click to Add Image 354 451 0 0 Shared files 0 0 25 25 16777215 16777215 QLayout::SetMaximumSize Latest comments 0 0 Qt::ScrollBarAlwaysOff QAbstractItemView::SingleSelection QAbstractItemView::SelectRows true true 0 0 Contacts QAbstractItemView::SingleSelection QAbstractItemView::SelectRows true false 10 10 Add contact Remove contact View profile Send message Private messages Qt::ScrollBarAlwaysOff QAbstractItemView::SingleSelection QAbstractItemView::SelectRows false true false false false QDialogButtonBox::Cancel|QDialogButtonBox::Ok 0 0 Profile details QLayout::SetDefaultConstraint QLayout::SetMaximumSize QFormLayout::ExpandingFieldsGrow Nickname 0 0 160 0 Greeting text 0 0 160 0 First name 150 0 Family name 0 0 150 0 City/Country 0 0 160 0 BTC Addr 0 0 0 26 16777215 26 Qt::ScrollBarAlwaysOff State of the world 0 0 QLayout::SetMinimumSize 354 451 <html><head/><body><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;"><br/></span></p><p align="center"><span style=" font-size:16pt;">No</span></p><p align="center"><span style=" font-size:16pt;">Image</span></p><p align="center"><span style=" font-size:16pt;">Inserted</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 16777215 26 Shared files 0 0 0 0 Qt::Horizontal Send message to operator Audio call View readers QLayout::SetMaximumSize Latest comments Qt::ScrollBarAlwaysOff QAbstractItemView::SingleSelection QAbstractItemView::SelectRows 130 true true Qt::Horizontal Comment Profile address 400 0 16777215 26 10 Qt::ScrollBarAlwaysOff Add to contacts profileNickNameEdit greetingTextEdit firstNameEdit familyNameEdit cityCountryEdit btcAddressEdit stateOfTheWorldEdit isPrivateCheckbox profileReadersButton imageButton publisChangesButton revertChangesButton profileCommentsView addContactBtn removeContactBtn viewProfileBtn sendMessageBtn privateMessageListView privateMessageView privateMsgsButtons caAboutComboBox caRegardingCombobox caWhereComboBox searchAdsButton caMessageView CATabBottomButtonBox profileDetailsBTCValue profileDetailsStateOfTheWorldValue profileDetailsSendMsgButton profileDetailsReadersButton profileDetailsCommentsView profileDetailsSharedFilesView profileDetailsCommentButton profileDetailsAddrValue contactsView tabWidget caHeadersView classified-ads-0.13/graphics-highres/000077500000000000000000000000001331670245300175435ustar00rootroot00000000000000classified-ads-0.13/graphics-highres/Makefile000066400000000000000000000035031331670245300212040ustar00rootroot00000000000000# -*- Makefile -*- -*-coding: utf-8-unix;-*- # # Classified Ads is Copyright (c) Antti JУЄrvinen 2013. # # This file is part of Classified Ads. # # Classified Ads is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # Classified Ads 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Classified Ads; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # The file turt-transparent.xcf is highest-resolution version available # of the turtle logo. It is not used in runtime in that high-res but instead # converted to 2 smaller resolutions. This makefile handles the resizing # using imagemagick. If turt-transparent.xcf is modified, say "make all" # in this directory to generate the small-resolution versions that are # used at build stage. # all: ../ui/turt558.png ../ui/turt-transparent-128x128.png ../ui/turt558.png: turt-transparent.xcf convert turt-transparent.xcf -resize 558 +set date:create +set date:modify -define png:exclude-chunk=time ../ui/turt558.png ../ui/turt-transparent-128x128.png: turt-transparent.xcf convert turt-transparent.xcf -resize 128x128\> -gravity center -background none -extent 128x128 +set date:create +set date:modify -define png:exclude-chunk=time ../ui/turt-transparent-128x128.png clean: rm -f ../ui/turt558.png ../ui/turt-transparent-128x128.png classified-ads-0.13/graphics-highres/README000066400000000000000000000007041331670245300204240ustar00rootroot00000000000000The file turt-transparent.xcf is the highest-resolution version available of the turtle logo. It is not used in runtime in that high-res version but instead converted to 2 smaller resolutions before build. If you modify the high-res original, have imagemagick installed and say "make all" in this directory to produce the smaller-resolution versions that are then used at compile+install stages. Smaller-resolution versions reside at folder ../ui/. classified-ads-0.13/graphics-highres/turt-transparent.xcf000066400000000000000000102512041331670245300236070ustar00rootroot00000000000000gimp xcf fileяђC•џьC•џьG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ЎяђLiitetty tasoџ     lяђ!RT!R`!Rl!Rxяђœ/WUі{G›ЖВЃЭЄѕл%ЂUќ†>ЕMрs J5s\XtЎ—шК†о…Ц/ _{eРБ№§!?QzЖГvтќ Š.ŠVS€ЌА"пzЮ@kpQ …аНљ13ak’ ТVь( Ј4UaЧŒzВ оx Т >ї o) Ÿ| Яу G 0К a ’щ Т тЗ  ?В o ŸЩ аФ $ 1{ a9 ‘ Ся ђb "Ч RГ ƒ, Д еC7sgъ˜ˆШыљQ)ЂYћŠNКUъ0nJЎzљЌvЯ„Y1Юb~“(Ф(єЈ%UN…ИЖц…мGAwЈЉЬ`ќТ,kY~W­ьп]п@ip№ЁqбшŠ3 cЏ”ЪЙГтФчA"oA˜hЩјњ”+е\NŒлНэТZNш§ЁЯцћ)ZIђiЮš№ЫФљa МJvЃЈи— "9ЭZМЎ•зк38cц”ЁТЬсW 7eh1˜РЩ_љи•:хVaq—•WЛ&сž ‹ -ц S xt ž; Фф ы !U!7‚ўњўўўћўўњњ§§ўћўўєћ§§љєёёњўўћўўѕћў§ћўћў§љњ§§ћўћщўљј§ўњ§§љјћљ§њ§§љ§§ћљљўўѕњјєѕћ§ўўњћўўўћўў§ћўћћўђћўљњ§§їїћ§§ћћ§§ўўћўўќћўў§§ѕўњјјєїћўўћўўћўўћў ў§ќљњњ§§ўўћўў§ўњ§§јѕяєњћћ§ўўћ§њўўћўўў§ўўќ§њљћћљ§§њ§ўўяћўњяыђїћњ§њѕљ§љћўўєћњјљўўћ§§њћўўёњћћўћўў§§ћўў§ћњњ§юњ§§ћ§ўўљњўћ§њѓёѕљ§§ўњћўўњњўўўћўўё§љ§§њ§ћўўњћљћњ§§ўњўўўњ§§іњђёєјљћњ§ўўќћўљ§§ўќ§ўћўўћњўћћўљўўи§њљјјњљћјјћћ§љћ§ўўћ§њњ§јљђёљ§§њ§њљћћ§њћўў§ўѓљјљћњ§ў§њ§њ§ўўїњ§њћњњљћљљ§љѓћ§ўўњћјђѓљ§њў ўќњћљћћ§њѕњўўћўўєћўў§ћњ§њњ§§ўў§§ћўўљ§ћѓяѕљў ў§§јњ§§љљјњ§§њўўѕ§љ§ўўћў§њ§ўўњћўўћў§§љ№§ўћѕяѕњ§ўўћўўћћўўљћ§ћљљ§ўўѕ§њ§ћљњљњ§њўўќћ§љўўњўїўўї§њћњ§њ§§њњѕћљћћ§ўўўљўўўћўўўњўўњўќћ§§ўўўћўўћћўћћўў§шћљђюђј§ћўў§§љњћћ§њ§§њў§њњ§ўњўўўћўў§јћњ§§ћўћўўўћўўњ§їѓѕ§ўў§њ§њњэ§ћ§њ§њњ§§ћћјћ§§њ§љћћ§§ћўўњ§ћќњўћўўѕ§њ§јѓѕљ§ћў§§чњўњљјјћљљћјћ§ћјљјћ§њ§ўўћўўљћўћўњћўўўћўўўћўў§ћјїѓјўў§ћћњўћћўўўћўўљњ§§њ§ћўўќћўћўў§ўњ§љѓѓј§§ўўћўўўћўўћћўўћўўћјњњјљњњ§§ћњ§§ћўўђћўўћ§њњћљјєњћўўќ§љњ§§ўћ§ўћўўћљљћјїћ§ўўѓ§јљћ§њ§њ§§њїўўє§јєєћ§ўўћњљўўіњћ§њћљј§§ўўў§ўўћ§ўў§ўўяљњўўњћњўўјљ§§љ§њўўї§ћљїђѓњ§ўўќљћ§ўўўћўўўћўў§ўѓћ§њ§§ћњљ§§њњўўљћў§§њїѓѓњћ§ћћ§њњњ§ўў§њ§§њњ§§ўћўўўћўўш§њјјћљ§ўў§љїїјљљјњћўў§§ўўѓћєюѓћўћ§§љћ§ў ўіњљњљјљ§§њ§§ў§ўњўўћћўћ§ўўѕњ§ўў§јѕј§ў§§ћўўћўў§ўњ§§њўћ§ћћ§§ўњћћ§њћўўћ§њњљјјўљ§§ѕњўўњљљјћўћўўўћўўћўўћўўќћўћўўќћњ§ўўўњ§§ќћўўњњћ§њ§њ§§јљјјѕњ§њўўўћўў§ќњ§љ§§њ§ўўћўў§ћў§ћ§ўўњњўўћћўўњўіћјєњњ§њњљ§§ќўћў§§ќњ§њ§§њ§ў§ўћўўњћ§§ћћ§§љїѓѓњўћўўќ§њћўўўћў ўўћўўњ§ў§§ў§§ќћўў§§їћўўћњљћћ§§јћјњјёёјўў§ў§ўћћ§љњњўўў§ўўљ§љљћњњўў§ўћћњ§њўўёњљњєђјњ§њ§ўћ§љ§§ў§ћ§ўўўћўўі§ї§ўў§њўћ§§ќљ§њўўўћўўўћўў§њё§ћљѕєјћћјўўњўћўўўљўўўћў ў§њћўўјћўўњњљ§ўў§јўћѓяёј§ўўќњћћўў§§ўћўўўћўўћўњњћћўћўў§ћ§њњ§ўў§§љ№§њ§јєїћ§њ§§њјњњ§§њўћўўњњћўўћ§ўў§ћїў§љљ§§њњ§§ьљјј§њљљћљ§љљћњјѕѕћ§ўўѕ§њњ§§ћў§§њ§§њћўњўћўў§ўњ§§њц§ў§§ћўўњ§§ўўњњљњєєѕ§ў§ўћћўўћћўћў§§ўќћўћ§§ѓњљ§ўў§њћўћў§ўўшћў§јљћјєњњўћўњњ§§ўњўў§ў§§ўђ§ћњ§§љїћў§§ўўњњ§ўщњљљѕћљљњўўћўў§њѕњњћўў§љљўњ§§ўьњ§§ћљ§§љљћњњћљћ§ћћљўўўњўўўћўўќћўњ§§љћњўўљњњјѕєћћўўћўў§ў§§њ§ўўі§њўўћћ§ўћўўі§јѕяєћћўў§§ћњї§ћўўѓћўў§њ§§њњ§њ§ўў№ћўћў§њљ§њњ§њњ§§ўўфњјѕњњ§§њ§њњјѓюѓњљћњўўњњў§њ§ўўў§ўў§§њўў№ћўўњўњ§§ўћўў§§њ§§їњўњљњњ§њ§§љћњѓёђњ§§§љ§ўўфћўћўћњљњ§њњ§њњјѕћ§ћљљњ§ћћўћўў§љўћћўћў§§ў№ћ§ћћљљњљѓѓєћ§§ћўўўћўўќљўћў ўўњ§§ћў§§ћ§§ћьў§§ћћљњњїђїњћњ§ўўћћўўўћўўњњљћ§§ў ўњ§ћњјљћћјњ§њњћљ§ўўєњљњљёцыїј§њўўў§ўўјњ§§ћљћљ§§§ћў§§ўњ§§љњ§њ§ћћ§§ўћ§§јњ§њњ§њњ§§ыћљяьёњ§њ§њўўњћћљћћњњўў§њї§њћўњ§ћћ§§ў§§ў§§їњ§§ћў§§љўўє§ўў§§ћћїєљњ§§§њ§ўўѕ§ўћўћћњњўў§§ўњ§§ћњљ§ћ§§ћўљ§§ўљ§§яњ§њћјљѕђяѕњљ§њўўћћўўћ§§ыљћ§§љўўћўў§ћљљћ§§њ§§ўў§ўњ§§ў§§љћћљјїѓѓї§ўўѕћњ§§њљљћ§§ўў§ў§ѕћљ§§њћћ§§ћўўщћўћ§§ўўњњћњ§јѕѕћњћ§§њњўў§јљ§њњўњ§ћћ§ўј§љ§§њ§љћћј§љ§љ§§ћљљїњјћћњњљљћћѓљїћњњ§§њњ§љљўў§§ћў§ §њћ§§њўћћљћѓљћњћ§§љљјљњљћћњјёљјјњљћјњњљћљ§љ§§њ§ў§њњћњќўћў§§ќћўў§§ћў§§њ§§яћўў§§њ§ўў§ћѕѓєњљ§§ѕљ§§ћљћћ§§њ§§њ§јў§њћћ§§ўўј§њљўћўў§§ў§§ўћўўњ§ѓћїєѕљўћўћўўћ§§§ћљ§§њњ§ћњњ§§ўў§ўўќ§ћљ§§ћўљ§§ўћљљѓњїјљјјѓюёјћћ§§ћ§љў§ћјљјњљ§ўћўў№§ћљјјњћ§њ§њў§§ў§§ўћ§§љњђюђљћ§§ћўњ§§ћ §ўћњњ§ћћј§§ў ў§њљјєїћ§§§њ§ўўѕњ§ћћљћћљ§ћњњўјћћљћљўъ§њ§§ћћј§њ§§њ§њњћћљѓђї§§§њ§ўўћ§њњљћћі§ўў§ћњњћњћћ§љћ§§нћљ§ў§њ§ћњјљѕљћљћ§јћћ§§њљћјљѓѓљ§ўћ§њњѕ§њўў§§ћјјљћћљћћјњћљ§§ћ§њ§љљёјћјњ§§ўћњ§§ўњљћћљљјњјєљ§ §ћ§ћњљљ§њ§њћћ§§ў§јњ§ў§ћћ§ўў§ьўћ§їїљѕјњћљњ§љњћљћћ§§§ћјћћ§љћ§§ћњ§§њ§§ћќљћљ§§ќњ§ћљљ§ўў§§јћѓєїћ§§ћ§љћљ§§ћљћћ§ўњ§§ўћ§§ћ§њєљњјњїњјљ§§љћћхњїјѕєљњћњўўћњљљћњ§ћћљњўў§љўўыњ§ўў§њњћћњ§ўў§§љ§њ§њћћяјљћ§њћћљљјњјюѓјљ§§ў§њ§ўў§§њ§њњў§ћў§§ўњ§§ќњ§§ўўћ§љљјћћ§љњјјћ§њћћљљћћ§§ћўўћћўћњўў§ўљ§њњ§њњўўљўћњћјјћћљтћњєђђѕњњћћљћљљњ§ћњњ§§ўћў§§ћљљњњќ§њљўў§ўў§ўў§ўћўўјћ§ћїяѓљўўў§ўўўћўў§§ў§ћћў№§ћћ§ў§ћ§ћ§њћћ§ћ§§јћњћћ§ў§ўўј§јђєњ§§ўўў§ўўў§ўўю§ў§ў§§ћћњћћ§њћћ§ћўўќ§ў§ўўў§ўў§§ћ§§ћјэѕњўўњ§ў§ў§ўўќ§ў§ўўў§ўўё§ћ§ћћ§§ћ§ћ§ћў§ўў§ўћ§§ђћ§ћѕьѓљћњ§ўў§ўўћ§ћ§§ўўњ§ў§ў§ўўќћў§ўўќћ§ћњњћљ§ћ§ћ§ћўўљљѓьєћћ§§§ћ§ўў§ўќћ§§ўўќ§ћњўў§љћў§ўћў§§ўћ§§ъћњћў§ў§ўў§љѕѓјћ§ћ§ћ§§ўўў§ўў§ўќ§ў§ўўђ§ў§§ћ§ћ§ћў§ў§ћћ§ьћ§§ў§ў§§ћ§љєюїњћњ§ћўўї§ўћ§ћ§§ў§§ўў§ўўќ§ў§ўўєћ§ћ§ћ§ўћћњњћћњњ§§ўў§§јћ§јєђљћ§§ў§ћ§ўўрћ§ћ§ўў§ўћћњ§ћўћ§ћ§ћў§ўў§ћ§њ§§ћњћћў§ћћђњћўў§ћїёёјћ§§ўўі§ў§њћћњћћ§§ўў§ўўћ§њ§ћ§§шћў§ў§ў§ў§§ўў§ў§ўћћѕђєћ§ўўъ§ў§ў§ў§§ћ§§ћћ§ў§§ћћ§§ўўќћўћўў§ўњ§ў§ў§ўўћћ§ћ§ћћ§љћјјњ§ћў ў§ћњћћќў§ў§§ћњћ§ў§§љў§ў§ўћўў№§ўў§ўў§ўћ§њ§ћ§ћ§§ўњјјњ§ћў§ў§ўўў§ўў§ў§§ћўўќ§ў§ўўќ§ў§ўўіћ§њјєяѕњћўўђћ§ў§њњћ§ћ§§ўћ§§њћ§ћ§§ў ў§њћў§§ћўўў§ўўђ§ў§§љѕњ§§ў§§ћ§§ћ§§ћ§§ћђњ§њ§ћ§ћћњћњћћўў§§ў§§ћњў§ўўђ§ўћ§ћњѕђј§ўўћ§§тћ§ћ§§ў§ў§§њћћњћњћћњјњњћ§ћў§ў§ўў§ ўў§ўўјћ§ћњѕїњўўј§ўћ§њћ§ўўў§ўў§ўћ§§ўќ§ў§ў ўќћ§§ўўіћјєѕњ§ћ§§ўўў§ўўќ§ў§ўўў§ўў§§ћњњњљњћ§§ћћ§ўћўўњ§ў§ўў§§ўїўљўўђ§ћў§ћ§ћў§ў§ў§ўўў§ўўћњњћњ§ўў§§ќћњћ§§њћ§ўў§ўўѕћњїїњ§§ўў§ўўў§ўўєћ§њћћ§ћў§ўћўўъ§ўћў§ћ§ў§ў§ў§§њ§§ў§ћћ§§ўў§ўўћљљєѕљ§§ўўј§ўњ§§ў§ўўј§ў§ў§ў§ўў§ўћўўїћ§§ћћљћћ§§ўь§ў§ў§ў§§ћљљѕюѕњ§ўўћ§§§ћў§§ќћ§ћ§§ўћўўў§ўў§§ў§§њћє§ўћћњћ§ћћ§§ўўњћ§§ў§ўўђњїяѕњўў§ћћњ§§ўўы§ў§§ў§ћњћ§ћ§ћ§ћўў§ћ§ў ўўћўў§ёў§њїњћўћ§ћ§ўў§ўўў§ўў§іћ§ћ§ћўў§њћћў§§ў§§ўћњњђћ§ћ§§ўў§ћљїћ§ўўў§ўўў§ў ўњ§ўў§ћўўљћ§ћ§ўў§ §№ћ§ћћњїјљћ§ўў§ў§ўў§§ўћћљ§ћўћ§ћ§§ќћ§ћўўў§ўўєћ§ў§њ§ўў§ў§ўў§њўњїїњ§§ћў§ўў§§ћ§§ќћ§ћ§§ќћ§§ўўў§ўўќ§ў§ўў§ћ§ўўя§ўў§ћћњ§ћ§ћ§њѕєњўўі§ў§ћ§ў§ў§ўўў§ўўќ§ў§ўўў§ўўя§ћ§§ћўћ§ћў§ўћ§ћ§ўўњ§ћ§ћћњљїѓєњўўћїў§§ћ§ўў§ўў§ћў§§ў§ћў§ў§ћћќњ§§ўўтћ§§ўў§ћ§§ўў§ћњїєї§ћ§ћўўћћ§ћ§§ўўћ§ўў§ўўљ§ўћўћў§§ўѕ§ћ§ў§§ў§ў§ўўў§ўўќ§ўћ§§њћњјєїњњќ§ў§ўўў§ўўў§ўўќ§ў§ўўў§ўў§щўћў§ў§ў§ў§§ћ§ћ§ўћѕьѓњћў ўњћ§§ў§ўўў§ўўњ§ў§ћњўўў§ўўўћ§§ўћ§§§ћ§ћћ§јїђѕћћ§ћ§§ќћ§ћ§§ў§ўіћў§ўў§ћ§ћўўћ§§ћ§§ќћ§ћ§§ћѕ§ћћњњїєјћћўўў§ўўўћ§§ѕў§§ћ§ћ§ћ§§ў ўўћ§§ўћ§§шћўћ§ўў§§ћ§§ў§§ћњїѓј§ў§§ўўє§ў§ўў§ћ§ћ§ћўўў§ўўє§ћ§ћ§ў§ўўћ§ўўњћў§ў§ўўэћ§ћћїїљ§§ў§ў§§ћў§ў§§јћ§ћ§ћў§ўў§ѓњ§ћ§ћћњўћ§ўў§§ђћ§ўў§ћћ§њћћ§§ўўњ§љјљ§ўўў§ћћћ§ћ§ћўў§ћў§ћћѕњ§§њћњ§њћћўўў§ўў§§ћ§ћћ§ѕўћљљњјїњў§ўўљћ§ћ§ћ§ўўі§ўћ§ћ§ћ§ћўў§љў§ўў§§ўўќ§ў§ўўў§ўўі§ўў§§јїїњўўјћ§ћ§§ўћўўњ§ўћ§ћ§§ќћ§ћўўў§ўў§§ўћ§§§ћ§ўў§ћ§ѕњѕёѕљћњ§ўў§§ў§ў§ўљ§ў§ў§ў§§ў§оћ§ћ§ћ§ћ§§ў§ў§§ћ§ћ§ћћљѕьєљ§ћ§ћћ§ў§ўўў§ўў§ўћ§§ћ§ўј§ў§ў§§ћўў§ќћ§§ўўћєњћћљјѕђїњ§ћўўњ§ў§ў§ў ўў§ўўў§ўў§јћ§ћўћ§њ§§ўћўўёћ§њњћњљѕєѕљћ§§ўўќ§ў§ўўј§ћњ§ћў§ўўя§ў§ў§ў§ўћћљ§ћћњњ§§чњћћў§ў§ў§ў§§ћљјятэѕњћ§ўў§§ў§ђћ§њћњћћ§ћў§§ћ§§юћ§ћ§ћ§ћћњ§ћ§ў§ћ§ћ§§іћ§ћћјђыѓљ§§ў§§њћћєњ§§ў§ўћ§ћ§ћ§§шў§§ћњњ§ћ§§ўћўћ§ћ§ћ§ўў§§ўўь§ў§§ћћњљїљ§§ћ§ћ§ћ§ћўў§§ў§§ў§єў§§ћћ§§ћ§§ўћћ§ёњћћ§ћ§ћ§ћ§ћ§ћћ§§њјљєэєљћћўўє§ўћћ§ўњ§ћў§ўў§ўњћћ§ўћўўј§ћ§ћ§ћ§ўўў§ўўћіњћњњљѕѕљћўўћ§ћ§§ћћ§ќў§ўћћэ§ћў§ўћ§њћћ§§њњ§ћў§ў ўќ§ћў§§ѕћ§§њјјћ§ўћ§§ўњ§ўћ§ћ§§ђћњњћњ§ћ§§ўћўћ§§ћіњћћўћўћ§њћћьљ§њњ§§ћћњћњћњљљћ§§ћ§§ћуў§ўћ§ћ§ћўў§ћ§ћ§ћ§ћ§ћ§њ§ћ§ўћњћћўњћћъљћћ§ћћ§ћ§ћњћњћњњљљњњјњњћ№њљљћњћћўћ§ћ§§ўћ§§§њћ§§ўэ§ћ§њўў§ћ§ћ§ў§ћ§ћ§ћўўўћ§§чўћњјѕїњћ§ћ§ў§ћњћњњ§ћ§ћ§ћ§§№ћўћ§њњћ§§ў§ўћ§ћўў§јћ§ћў§§ћўў§§ў§§їћ§ћћљїјћўўш§ўў§ћ§њћћ§ћ§ћћ§§ћ§ћ§§ўћўў§§ўћћя§ћ§њћћ§ћ§ћ§ћ§ћ§њћћшљћњћњњѕьэїњћћ§ћ§њћћ§ћ§ћўўт§ўћ§ћ§ћњњћћ§ћ§ўў§ў§§њћњњљњћ§ћ§§мћўћ§ћўћ§ћ§ћљєђєљњ§ћ§ћ§њћ§§ћ§ћћњћћ§ћ§§їћ§ћ§ћ§ћћ§§юћ§ћ§ћњћ§ћў§ў§ў§ў§ўў§ћїъљћћ§ћ§ћў§ў§§ћћњћњћћ§њљљњљћњњћћњћћўѕ§ў§ўћ§ћ§њњ§§ђћ§ћ§§ћњљѕѓљ§ћ§§ћў§ўў§§шћњњћћў§§њљљћ§ћњћћњћ§ћњћ§§фњљњћ§ћњћњ§§њњ§ћ§ћћњљѕѕј§§ўћ§§љћ§§ўћ§њњћћњћњћћњіљњћћ§ћњњ§ћћё§ћ§§ћ§§ў§§ћў§ћњњыћњљїїј§ћ§ћ§ћ§ћ§ћ§њћћ§§њ§љњћћя§ћ§њћћ§ћў§ў§§ћ§ћ§§ѓў§њњћў§ўћ§ћ§ћћўћ§љѕјњњєћ§§ў§њћњњћ§ћћњћ§§ћ§§юћ§ћ§ћ§ћњњћћњћ§ћ§ћ§§ўњћћ§эћ§§њїїљћћ§ћ§њњ§§ћ§ћћў§ћћњїћ§ћ§ћ§ћ§ћћш§ћ§§ћњњћ§ћ§§ћљњљћљњћ§ћўњњїљїєїјњњ§ўўя§ћћњ§ћћњћ§ўў§ўў§ўўќ§ћў§§њ§ўћўў§§шћњњ§ћњ§§ћњћћњљјђяїћћ§ћ§ўўѓ§ў§ў§§ћў§ў§ўћћ§§ћ§§ўќћ§ћ§§ќћ§ћ§§тћў§ўў§ћћњћњћћ§ћњїїњ§§ћњњћћњ§ћўўњ§ў§ў§ўўњћ§§ўћ§§ћў§ў§ў ў§§ћњњ§ћњћћчљїєєјљљћњћњћћ§ћў§§ћ§ўў§§ћћ§§ћ§ўўў§ўўў§ўў§ћјєїћўўќ§ў§ў ўљћў§ў§ў§§єћў§ў§ў§ў§ўћўўњјѓї§§ўўє§ўћўћў§§ћў§ў ўѕ§ў§ў§§јћј§ўўњ§ў§ў§ўўќ§ў§ўў№§ў§ў§ў§ўѕєѕћћ§§ўўў§ўў§њћ§§ў§ўўіћїѓѕћћў§ў§§ўў§ўўў§ўў§ћ§ўўў§ўўі§ў§ў§ў§ў§ўўў§ўўє§ћїїљ§§ў§ў§ўўў§ўў§§ў§ўўјћ§ћў§ў§ўўє§ў§ћѕїјћћ§§ўўњ§ў§ў§ўўў§ў ўў§ўў§ѓў§ўћўњ§ћўћ§§ўў№§ў§ў§њјљљў§ў§ў§ўўў§ўўќ§ў§ўў§ўќ§ў§ўў§§ў§§ѕўћ§ћ§ћў§ўў§§ўјћљѓћњў§ў ў§љћ§ћў§§ў ўј§ў§ў§ў§ўўў§ўўњћљѕљћў ўќ§ў§ўўќ§ў§ўўў§ў ўќ§ў§ў ўћ§ў§ў§§љўћћ§њ§ў ў§ўћўў§§ў§§ћў§ў§ўў§ўѕ§ў§ў§ўњћљњ§§ўў§ўўў§ўўў§ўў§њњјїљњўў§§ў§§ћў§ў§ўўў§ўўќ§ў§ўўў§ўўў§ў ў§ќљњ§ўўф§ў§ў§ўћў§ў§ў§ўћ§ћ§§ў§ўћ§ћ§ћўўњ§ўћ§§ў ўј§ўњљњњ§ўў§јў§ў§§ўў§§ђћ§§ў§ўћўњћ§ў§ўўљ§ўћњњћўў§ўћўўњ§ў§ў§ўўў§ўўјњћљћ§ў§ўўќћ§њћћќ§ў§ўўќ§ў§ўўї§ў§ў§љњћў ўќ§ў§ўўјћў§ћћ§§ўў§ўњ§ў§ў§ўўњќј§§ўўў§ўў§§ў§ўўў§ўў§ў§ћў§ў§ўўјћ§њјљћ§ўў§ўўћўўў§ўў§§ўћћћў§ў§ўўі§ўћњїђї§§ўўќ§ў§ўўі§ў§ў§ў§ў§ў ўљ§ўћўћ§ўўјћўћ§ћ§§ўўў§ўўі§јњї§ўў§ў§§ ўј§ў§§ћў§ўўў§ўўќ§ў§ўўј§ўў§ћўћўўќ§ў§ў ўњ§ў§ў§ўў§ўћў ўћ§ў§§ћћћў§ў§ўў§ќљћћўўў§ўўќ§ў§ўўъ§ў§ў§ў§ў§ў§ў§ў§ћљћћў§ў ўў§ўўќ§ў§ўўў§ў ў§§ў§§ ў№§ўў§љњњў§ў§§ўў§ўўі§ў§ў§ў§ў§ўўќ§ў§ўўў§ўўђ§ўћ§§ў§ў§ўїћњўўў§ўўў§ўўќ§ў§ўў§ѕў§ўћўћљїњњўўќ§ў§ўўќ§ў§ўўў§ўў§ўў§ўўќ§ў§ўў§њњѕљ§ў§ўў§§ў§ўўў§ў ўў§ўўњ§ў§ў§ў ўі§ў§ў§њїњњ§§ўў§ўўќ§ў§ўўє§ў§ў§ўћљєїћў ўў§ў ў§ћ§ўўѓ§ў§ў§ў§ў§ў§ў§§ыў§љѓњћў§ў§ў§ў§ў§ў§ў§ўўў§ўўќ§ў§ўў§њў§ў§ў§§ћў§ўћ§§јћ§њљїћћўўђ§ў§§ўў§ў§ў§ў§ў ўј§ў§ў§ў§ўўў§ўўќ§ў§ўў§јњјјћ§ў§ў ўњ§ў§ў§ў ўј§ў§ў§ў§ўўў§ў ў§ћќјћ§ўўђ§ўў§ўў§ў§ў§ў§ўў§їў§§ћ§ўў§ўўњ§ў§ў§ўўј§ў§§ћ§§ўўњ§ћјћ§ўў§§ў§ўўљ§ўћў§ў§§ћў§§ћ§§§ћ§ў ў§§ў§§єў§ўў§ћћњћј§ўўњ§ў§ў§ўўњ§ў§ў§ўўў§ўўў§ўў§ћљћњ§ўўќ§ў§ў ўј§ў§ў§ў§ўўє§ў§ў§ў§ў§ў§ўў§§ў§ўўє§ў§ћїєїћћ§§ўўњ§ў§ў§ўўў§ўўў§ў ў§ўі§ў§ў§ў§ў§ўўэ§ў§ў§ў§ўћћїјѕћ§ў§§ў ў§ёў§ў§ўћўћўћ§§ў§ўўў§ўўќ§ў§ўўєћ§ћ§ћњїєј§§ў#ўќ§ў§ўў§ў§§њћјјћ§ў§ў ўќћ§§ў ўћ§іћ§§ў§ў§§ћўў§іћњђђёњћў§ўўў§ўў§§ў§§§ў§ўўх§ў§ў§ў§ў§ў§ўћ§§ў§ў§ў§ў§ў§ў§§ёў§ў§ўћњѓяєћ§ў§ўў§ќћ§ћ§§ўј§ў§ў§ў§ўўј§ў§ў§ў§ўўі§ў§ў§ўў§§ўўя§ўў§ўћ§њњљў§ў§ў§ўўў§ўўў§ўўќ§ў§ўў§ћў§§їћў§ў§ў§ў§§ўє§ў§ћњћѕљїћћў ў§ћў§ў§ўў§јћ§ћў§ў§ўўј§ў§ў§ў§ўўіћ§ћ§ћњїљљўўі§ў§ў§§ћў§ўўў§ўў§ћћў§ў§§ўў§ўўі§ўћў§ћљћћўўќ§ў§ўў§§ў§ўў§њћ§§ў§ўўё§ў§ў§§ћ§ћў§ў§ў§§ўћ§§ў§яћ§ћ§љ§ћў§ў§ў§ў§§ўўќ§ў§ўўѕ§ў§ў§ў§ў§ў§§єў§ўћ§ћ§ћ§ћ§ћћшў§§ћ§ћўћ§ћ§ћ§њћћўћњћћњ§ћћ§љў§ў§ў§ўўј§ўў§ћў§ўўю§ў§§ўў§ў§ў§ў§ў§ў§ўўќ§ў§ўўѓ§љљњњ§§ў§ў§ў§§їў§ў§ў§ў§ўў§§ў§ўў§ўќ§ў§ўўў§ўўі§ў§ўћњјљћўўю§ў§§ћў§ў§ўћў§ў§ў§ўўяћ§§ў§§ћ§§ў§ў§ў§ў§§ћюўћљєѕљ§ћў§ў§§ћў§ў§§ўћ§ў§ў§§ўў§§ў§ћј§ў§ў§ў§ўўў§ўўу§ў§§љјѕјљ§§ў§ў§§ћў§ў§ўў§ћў§ў§§ыў§ў§ў§ўћў§ў§ў§ў§ў§ў§ў ўі§ў§љњњћў§ўўј§ўћ§ћ§ћ§§јћўћћ§§ћ§§ќћ§ћ§§ў§§ў§§§ў§ўўђ§ўћ§љљњњ§ў§ў§ўў§§ў§§ўћўў§ћіўћ§ћ§§ў§ў§§ѓў§ў§§ћћ§ў§§ћ§§њў§§ћћљљ§ўў§ўўў§ўў§ћ§ќћ§ћ§§ћњ§ћў§ў§§ѕў§§ћ§ћ§§ў§ўўў§ўўўћ§§ћюљјњ§ў§ў§ў§ў§ў§ўћў§§ѓћњ§§ў§ў§§ћў§ўўї§ў§ў§ў§ў§§ўќ§ў§ўў§рјњњўњ§ћў§ў§§ћ§§ў§ўћў§§ћ§ћў§ў§ў§ўўј§ў§ў§§ћ§§њў§ў§ў§§юў§ў§ў§ў§§њњјњћў§ў§§іў§ўћ§§ўћў§§§ў§ўўы§ў§ўћў§ў§§ћ§§ў§ў§ўћўћћњўћ§§ў§§њљњјњњ§§ўўі§ўћ§§ўћ§§ўўў§ўўў§ўў§§ў§§§ў§ўўњ§ў§ўћ§§ьћ§§ўћ§ћ§њћјјѕљћў§ў§ўўў§ўўњ§ў§ў§ўўє§ў§ў§ў§ў§ў§ўў§ёўћ§ћў§ўњћљ§§ўћ§§ќћ§§ў ўў§ўўњ§ў§ў§ў ўў§ўўћћ§ћ§ћ§§ћјћћўћ§ћ§§ўќ§ў§ўўњ§ўћ§§ўўќ§ў§ўўў§§њћўўўћ§§њњ§ўўњ§§њј§њ§ћљ§§ўўѕ§њ§њ§§њћўўћћ ўћћўўњў ўўћўў§ўљўўўћў ўћўћўўћўўћўўћўўћўўњўўўћўўўћў ўћєўћўўњўћ§њ§§ўўўњўўћўў§ўўћўўћўўў§ўў§ўњўўћћўўћўўўћў ўћўўћў ўѓћўў§њљљћ§§њ§ўўўћўўї§њћўњњўћўўјћўўњћўњўўћ§њўћўўњћ§ћњљ§§љљћћљ§§ўўћѓўћўўњљћўћўўћўўўћўўщњ§љћ§њўљњ§§њўўћўћўћњљњўў§њљ§ўћћўўўћўўўћўўќњ§њўў§їњўўўћўў§§ћўўћћўў§ўўўћўў§§љ§§ўћўўћљўћўўћ§ўўїњљј§њћљњўўћќўњћўў§ўќћ§§ўўћўќ§њ§ўўќћўћўўўћўўќћўћўўўћўўўћўўљњ§§њ§§ўўўћўў§§љћ§§ў§ќњ§ћўўїћўћћўў§њ§§§ћўћћјњ§њњўўћўўт§ўўњћћ§ћћўўћћљљћњўўљ§њ§§њў§§ћўў§ўўћўўћ§ўћ§§ўћўўўћўў§ўћ§§ўљўў§ќњ§њўўћћњћћўўўћўўўћўўћћўў§ўўњ§§њ§ўўяћўўћўћўћўўћўў§ўў§§ћњў§љўўћ§њњ§ўўљћўў§§њ§§ўњўўј§њћўћўў§§ўћўњўў§ћњўўћўў§ўўўћ§§ўљ§ўў§§њўўќћ§њ§§ўћўўўћўўўћўўјћљўћњ§§ўўћўўћўўўћў ўј§њ§ћљљњљљћњјћћљћ§§њ§§њўўќћњ§ўўўћў ўўћўўћљ§ћ§ўў§їњљћјљћћ§ўўў§љљћњ§ћњўў§ћў§§ћњў§§ўўћўў§ўўўњ§§ ўћћ§ћћ§§§ўћўўћ§ћћј§§љюћљљћћњ§§њўўљј§§њ§ў ўќ§њ§њњћ§ў§ћў§§ћћњњ§ўўї§ўў§§ћўў§§ќў§§ўўњрћўў§њ§§ћћ§љљ§њ§§њ§§ћ§ў§љњ§ў§§ўў§§ў§ћћљћћўўѓћўўћјћљјљ§§ћўўўћўў§№ћљћњў§њ§§њ§§љћ§ўў§ўїћњўў§ўњљ§§љњ§§љ§ћўў§ўќ§њњ§§ѓћўўћћ§§њўў§њў ўњњ§§њћўўўћўўќњљ§ўўўћўўўћўўћћў§§ћћіљћ§ўўћўћў§§љњћўўћћўўћ§ћљ§ўўј§ўўћўћћўўўњўўќћ§§ўў§§ўћ§§њњ§§ў§љљёћљћјњљњ§§њњћ§њўў§щљ§§ўўћћўћўћћўњ§§њ§ћў§њ§§§ўћўў§ћ§ўњ§§іћ§њ§њ§њ§§ўў§ћ§ќћўћўўюћ§§њ§њўў§љћљћњјњћ§§§њ§ўўќћ§§ўў§њѓ§ћўћўў§њўўћњў ў§ђњѕћ§њњљћћљјћћ§§ўќћў§ўў§њўћћў§ўў§ўњ§ћ§њњћћћ§њ§ћ§§ўњ§§ўїћ§ћћјїјљўўћ§њ§§ўўі§њћћўўћўћ§§ўњ§§ўњ§§ћј§њ§њ§ћ§ўўі§њљ§§ўћўњ§§љћў§ћњ§ўўўћўў§ћў§§ѕњ§њљћ§§ћљћ§§ўћўў§юњўћўўћћ§њњ§§њњ§њњ§§ќњўћ§§ўњ§§ћњ§§њ§§ўњ§§ѕћ§§ўћў§њћјўўўћў ўєћўў§§љ§ў§ћљћћљ§ўљњў§§љћ§§њћјјћњ§§ўњ§§їћўћ§§њњ§ўўјњ§њњ§љљ§§хў§њњ§љћљњ§љћљ§њ§§ћљ§§њћћњ§ћћіј§ћњћћ§§њ§§ўўћўўўћўўђ§њ§§њ§њњ§§њћљћћќ§њљћћў§ўўќ§њ§ўў§эўћў§њўў§§ўўћ§§љћљњ§§ўњ§§љћљ§њ§§ћћє§њ§§њ§њћљћћ§§њў§ўўћўў§њњ§љћњњў§§ћћў§ўўљ§њћўўњћћњ§ў§ўѕћ§§ћљћ§њ§§ўўў§њњє§ўњљњўћћў§§ўўўљўўњњѕєћњ§§§ўћўў§њў§§љ§ўўёњ§њњ§њ§§ў§ћћњњўў§§ћўўќњћњўўюћ§њњљ§§ўў§§њ§њ§љ§ўў§ўўњўўњћўўћў§§ќўћћ§§§ўћ§§ўњћ§ћљњ§§њ§§љўўч§љўћњњ§§њћўў§§њћўў§ў§ў§ћўўў§ўўќјћўњњ§іў§§њ§њњ§њ§§ќўћћўўњэ§њ§§њћћњљљјјїњјћ§ћ§§§ј§ўў§іњўўњўў§ћћ§§њў№ћў§њ§§ћў§њљћјјћ§§љћ§ѓћљћњїјњјљћ§§ўўќњ§§ћћљњ§њ§§њљљ§§ћѓјјўњћћѓљјјњћљ§§ћљћљ§§њњ§§ј§ћћљћљћ§ѕћљћ§§њњ§љњјјђ§љћїїѕѕјћћљћ§њњ§ьћј§§ўћ§њ§њ§њ§§њ§§њў§§ћўљћћ§ўњ§їљћњјћњўў§§јњћ§§ўўњ§§ќў§њўўњ§њў§њўў§ћњ§§јњћљћ§ўў§§ў§ўіћўљ§њ§§љћ§§ўћўўўћўўјћўўћћ§њ§§њљћњ§§ўўї§љћњўћћ§ўўіћ§§љњ§ўњў§§§ћљ§§ўњ§§їњ§§њњ§њљ§§§ћ§ўў§ћљ§§§њ§ћћўљ§§іњ§ўћ§§їїљ§§ћљ§љњ§§ћњ§њњ§§ўўћ§§њ§§ўњ§§§ћњ§§ћјј§§ўњћњ§§ыњ§§њћњ§§ћњ§§њ§її§ўў§њњўўћўўќњўћ§§ўї§љћљ§§ўў§§њљћћљњ§§ўќћўћ§§ќњ§ћ§§юћ§њўћўўњ§§њћ§§љ§§ўўўћ§§ўњ§§јћ§ўўћўў§§ѕўњў§ћљћљљћ§§їњўўћћњ§њ§§§њћ§§њќўњ§ћћћ§њћћўўї§њљњ§ўћљћћ§іњ§љјљљћњ§ўўќљјј§§љўљ§§ћ§ўўўћўўѓ§њўў§њ§љўўћћўўќћ§њ§§ў§њњ§јћћ§§ў§§ўћўўќњ§ў§§њњ§§ўћўўўћўў§ћ§љћўіњ§ћњ§љ§њњўў§ўљ§ћ§њўў§§ќњ§ў§§ўўћўўћўь§њ§§љћћ§ўў§њћћњњ§јј§§ѓўњљћљїјљўў§ћўўє§ћўў§њњ§ў§ћ§§ќўћћўўљњїјћћњ§§ћњћѕћ§§љћіљћјјћћ§§ћўў§њ§ўўєћ§њњ§ўў§љњћ§§ўћ§љљ§њњ§§њўўўњ§§ўњ§§ўћў§ћ ўњќљ§ћўўќїўў§§ўћ§ћ§њўўьљћћ§ўћўўћўћўњ§њћїћљ§§§ўћўўўћ§§ћњўћ§ћћћљћ§§ўўљ§њ§њ§њўўћјў§§ўў§юњћљћњ§љљћ§§љњ§§љћў ўїћў§ћћј§§ўўћўћљўњ§§ћћјјќњјћ§§ўўњўў§ўњўў§ўњ§ћћљ§ўўњї§ћћїєњљћјј§љ§ўўћєў§§ў§ћћњ§љ§ўў§њќ§њњўўў§ћћјќћјј§§њѓўћ§њ§њўћўћўў§§ў§ћўћўћўў§ћўњњћўќћўў§§љ§њ§ўњўўўћўўјћљ§њљ§§ўўўћўў§ўўћўў§§њ§ўўіјљљ§љљњўў§§ќћўћўўў§ўўј§њљјј§њўўћќў§ўћћї§ћ§ћ§ўў§ўўќ§ў§ўўќ§ў§ўўў§ўў§§ћ§§ћў§§ћ§§іћњўћ§§ў§ў§§ўћўўў§ўўќ§ў§ўўў§ўўў§ўўў§ўўђ§ўћ§ўў§ў§ў§ў§ўўњ§ў§ў§ў ўќ§ў§ўўў§ў ўў§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ўўў§ўў§ўћћ§ћ§ўўќ§ў§ўўў§ўўў§ўў§§ў§ўўќ§ў§ўўў§ўў§ќћ§§ў ўў§ўўў§ўўєћ§ћћњ§ћ§§ў§ўўћћ§ўў§§ўў§ўў§ўў§ўўќћ§ћ§§ў§юў§ў§ћ§ћ§§ћњћћ§ћў§ўў§ўў§ўўќ§ў§ўўю§ў§ў§§ћўњћ§ўў§ћ§§ўўє§ћ§ў§ўћ§ћўћўўў§ўўў§ў ўў§ўў§ўћўў§ўўћўўў§ўўў§ўўўћўўќ§ў§ўўє§ў§§ў§ћ§ћў§ўўў§ўўў§ўўў§ўўі§ћћ§§ћћ§§ўўў§ўўћ§ўћ§ўўќћ§§ўўњ§ўћ§ћўўў§ўўў§ўўі§ў§ў§ў§ў§ўўў§ўўў§ўўў§ўўў§ўўў§ўў§јћ§ћ§§ў§ўўѕ§ћћњ§ћ§ћ§ћўўєћ§ћ§ћў§ў§ў§ўў§§ћ§ўў§ўђ§ў§ў§ўћўў§њћћўўўњћћў§ўўюћ§ћ§§ўћ§ўў§ўћ§ћў§ў ўќ§ћ§ўўє§ў§§ћњћ§ћў§ўўі§ћћ§ћ§§ў§ўўў§ўўј§ў§ў§ў§ўўў§ўўў§ўўў§ўў§ў§јћ§§ћ§ў§ў ў№§ўћў§§ћ§ћ§ў§ўў§ўў§ўћўў§їћ§ћ§ћ§§ў§§ѕў§ў§ў§§ћў§ўўў§ўў§ў№§ўў§ћ§ћў§§ўўћ§§ўў§ћ§ћћўў§ўўљ§ћ§§ў§ўўў§ўўў§ўўў§ўўќ§ў§ўўў§ўў§ћњћћљћћњїћ§ћњћњ§ћ§§ќћ§§ўўћ§ћў§ўўќ§ў§ўўў§ўўњћњћў§ўўђ§ћ§ўћњћњћћў§ўћћћ§ћў§ўўў§ўўў§ў ўў§ўўјћ§ћ§ў§ћўўіћў§ў§§ћ§ћўўў§ўўі§ўћћњ§ћ§§ўўо§ўћњњ§ћ§ћ§ћ§ћћњћћњњ§ћ§§ўўћћ§ћ§ћў§ўўў§ўў§ѓћњћћ§ћ§ћў§ў§ўўіћ§ћ§ћњ§§ћўўњћў§§ћўўљћ§ћўћ§ўў§іў§ўћ§ћ§ўўћћ§сћ§ћ§њ§ў§ў§ћўћ§§ўћ§ћ§ћў§ў§§ћ§ћ§ћћў§§ўњњњћ§ўћ§ўўў§ўўў§ўўј§ўћ§њћњ§§ћћ§ћ§ћћўќћ§§ўў§§ў§§ќў§ћ§§юћўћў§ў§§ћў§ў§ў§ўћ§§§ћ§ўўѓ§ћ§§ўћ§ўў§ў§ўўљ§ў§§ћ§ўўњ§ў§ћћў ўє§ў§ў§ў§§ћњњћћўі§ў§§ћ§§ў§ўўђ§ў§§њћћў§ў§ћ§ўўў§ўўь§ћў§ў§§ћўў§ћ§ћ§ћ§ў§ћћњћљћ§ћ§§ђњ§§ў§ў§§ћ§ћў§ўў§ўћ§§ўўћ§§ўћўўќћ§ћўў§§ћ§ћћэ§ћ§ћ§ћ§§ў§ўћ§њћћ§ћўўў§ўўћ§яў§ћ§ћћњљњљћћ§ћ§ћўўі§ўў§ћў§ўћ§§ў§§ў§ўўќ§ў§ўўў§ўў§ъћ§ћ§ћ§§ћћ§§ћњћћњњћћ§ћўўќћў§ўўњћ§ћ§ћўўѕ§ћ§ў§ўћ§§ўћћ§ѕћњћћ§ћњћ§ћ§§§ћ§ўўћњюјњћў§ў§ў§ў§ўћ§ћћ§ўў§ўі§ўћ§ћћ§§ћ§§њћ§њћњ§§ўћ§§њћ§§ћћўўњћ§ў§ћўў§ђћ§ўўћћ§§ўў§ў§ўўњ§ў§§ћ§§њћњ§ћњћћѕ§ћ§ћ§ћ§ћў§ўўі§ўў§ћ§§ў§ўўўћ§§ўћ§§ћћ§ћ§ћћ§ўўћћћ§ћ§ћ§§њћ§ћ§ћ§§їћ§ћ§ћ§ћў§§ўў§§ћ ўі§ў§ў§ўћ§ў§§њњћњћњћћї§ћ§ћ§§ў§ўўѓ§ў§§ћћњ§ћ§ћ§њњљћ§§ћ§ћ§§ћћ§ћћўў§§ћ§§ў§§ћ§§ћ§§ћ§§ћќњћ§ћћ§ћј§ћ§њњ§§њњёћњ§ћћљњњ§ћ§ћ§ћўўќ§ў§ўўќ§ўў§§шћ§ћ§§ћћ§њћњћњћћ§ћћњћњћћўўљћ§ћў§ў§§ў§ћў§§ћўў§ћ§ћћў§ћћ§цћ§ўўћ§ћ§њћњћ§ћћ§ћ§њћњћћ§ћ§§ќћў§ўўњ§ў§ўћ§§їћ§њ§§ўћ§њњў§ўўєћ§ўў§§њћњћњ§§ёћў§ў§ў§§ћў§ўў§ћћњњћ§ћ§ўўўћ§§њћў§ў§ўў§ўћўўћ§ў§ў§§ѕћњ§ћ§ћ§ћ§ћўўє§ўћ§ћўћ§ћћ§ўў§їћ§ћ§ў§њћ§§ќў§§ўўц§ћ§ў§ў§ўў§§ўў§ћў§§ћ§ћ§ћўћўўі§ўћ§ћ§§ў§ўўќ§ў§ўў§њћ§ћ§ћўўьћ§ћўў§ћ§§ўў§њћ§§ћ§ћ§§ќћў§ўўіћў§ў§§ћ§§ўўяћ§§ў§ўћўћўћў§ў§§ўўў§ўў§ќћўћ§§јћ§ћ§ћ§§ўўч§ў§§ћ§ћ§§ћњ§ћћњњљљњћћњћ§ћћ§ўћћ§§ў§§љўћњњ§ћ§§ў§§ў§§§ћў§§ўћњњ§ћ§њ§ћћљјњљњћњ§ћўўє§ў§§ћ§њћњћњћћћ§ћ§§ћћћ§ћћ§њњьљњњћћњњљњћћ§њћњћћ§ћ§§њћ§ћњњћћјњћњћћњњћћ§њћ§§ћўљњњ§єћњњћљњњћњћњ§§ћћ§ћўў§§ћЮ§ћ§§ўћ§ћ§ћ§ћћњћњћњћћ§ћў§ў§§ћ§ћњљњњ§ўўћ§ћ§§ћћ§§ў§§ћћњўћ§§ў§§їўћ§§ў§ў§ўўх§ћ§ћ§њћњ§§ўћ§ћ§ћ§ћў§ўћ§ћў§ўў§љћўњ§ћ§ў ўќ§ўў§§јћ§ћћ§§ћўўї§ў§ўћћњ§ўў§чў§ўћ§ћ§ћў§ўћ§ћ§ћ§њћћ§ћ§ћ§§њћ§ћ§ћ§§ќћ§ў§§ќњ§§ўўћ§ћ§ћ§§јўћњњћ§ћ§§ќўћ§ћћѕ§ў§ў§ћ§ћћњ§§ќћ§§ўў§ьћ§ћ§ћ§ћ§ћ§ћћ§§ћ§ћ§њћћїў§ў§§ћ§ћ§§іћ§њ§ћ§њ§ћ§§ў§ћў§§ўк§ў§ў§ў§ўў§ћ§§ў§ћњћћ§§ўћ§ћћњћћ§ћ§ћў§ў§ўў§§ћ§§ћњ§ћ§ћћ§ў§ћћ§њ§ћћ§ў§§ћ§§љћ§ћ§њ§ўў§ђћ§ћ§ћ§§ўў§њћњћћў§ћћс§ћ§§ў§ўў§ћ§ћ§ћ§њ§ћ§ћ§ўў§ћњћњ§§ўў§ўћ§§ћњћ§јћњћћњ§ћўўќ§ћ§ћћўљ§ћњћў§ўўљ§ўўћ§ў§§ўў§ўўњ§ў§ўћ§§цћўў§ћ§ћ§ћ§ћ§ћ§њњћ§ћў§ў§§ћўўћ§ў§ў§§јћ§ћ§ћ§§ўўїћ§ћ§њњћ§ћћїњў§ў§§њ§ћћ§љў§ўћ§§ўўф§ўћўћ§§ўћ§ћ§ћ§ћ§ћ§ћўћ§ћ§ћў§ў ў§ћћњћћў§§§ћњ§§яћ§ћ§ћў§ћњћћњћў§ћўўќ§ўћўў§єў§њ§ћ§ћ§ћ§ћўўўљњњьћ§§ћ§ћ§њ§њ§ћ§ћћњћњћњњљћњ§ћў§ўў§ў§ѕћўў§ћњњ§ћћўўћў§ћћ§эћ§§ў§ў§§ћ§ћ§ћ§ћ§ћ§ўўў§ўў§ўћўўњ§ў§ў§ўў§§ў§ўўѓ§ћ§ћ§§ўў§њ§§ўўќњћћўў№§ў§ў§§ћ§њћњћћ§ћўўђ§ћ§ћ§§ўў§њћњњћћў§ўў§ўѓћ§§ўў§ћ§њћњ§ћћї§ћ§ћ§ћњ§ў ўћћњ§ћ§ў ўў§ўўќ§ћ§њњїљњњћ§ћ§ћўўў§ўў§§ћ§ўўёћ§§ў§§њњћ§§ў§ў§§ћљњћћљћћњњћ§ў§ў ў§іћўћћњ§ћўћўўі§ў§§ћ§ћ§ћ§§ўћ§ћњћњњіћ§ћ§ћ§§ўў§§ў§ќћ§§ўўќћ§ћўўќ§ў§ўў§ў§§ћ§ћћ§ќћ§ћ§§њћ§§ў§ўўў§ўўў§ўўўћ§§ўћўўў§ўў№ћ§ћ§ћў§ў§ў§§ћ§ћўўѓ§ћћ§ўў§ў§§ћ§ўўј§ћ§ў§ў§ўў§љћ§§ћ§§ўўў§ўўўњ§ў§ў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўў§ўўњ§ў§ў§ў)ўў§ўmўў§ўўў§ўўў§ўўў§ўўќ§ў§ў1ў§ќў§§ў ўў§ў ўў§ўўњ§ў§ў§ўўѕ§ў§ў§ў§ў§ў§§ќћ§§ў ўў§ўўћ§ўў§ўўў§ўўўћўўў§ўўў§ўўў§ў!ў§§ў§ўўў§ўўј§ў§ўћ§§ў ўў§ўўў§ўўў§ў=ўњ§ў§ў§ў ўі§ўћ§§ў§ў§ўўў§ў ўњ§ў§ў§ўўќ§ў§ў ў§ќћўћўў§ўћўўњ§ў§ў§ўўў§ўўў§ўўќ§ў§ў ўј§ў§ў§ў§ў ўќ§ў§ў-ўў§ўўќ§ў§ўўј§ў§ў§ў§ўўќ§ў§ўўј§ў§ў§ў§ўўў§ўў§ўў§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ў+ў§§ў§§ьћў§ў§§ћ§ћ§ћ§§ў§ў§ў§ўўў§ўўќ§ў§ўўў§ўўћ§ўћўўњћ§ћ§§ўўњ§ў§ў§ў ўќ§ў§ўўњћ§§ў§ўў§єћў§ў§ў§§ћ§ћ§§§ў§ўўњћў§ў§ў ўђ§ў§ў§ўћ§ћў§ў§ўўј§ў§ў§ў§ўўў§ўўў§ўўў§ў ўў§ўўќ§ў§ўў§њў§ў§ў§§ћў§ў§ўўў§ўўќ§ў§ўўї§ў§ў§ўћ§ў ў§§ћ§§ўў§ўў§ђћ§§ў§ў§ў§ў§§ћўўў§ўўє§ў§ў§ў§ў§ў§ўўў§ўўњ§ў§ў§ўўќ§ў§ў ўќ§ў§ў ўў§ўўј§ў§§ћ§ћўўќ§ў§ў ў§ўў§ўўў§ўўї§ў§ў§ў§ў§§ѕћ§§ўћў§ў§ў§§ў§ ўњ§ў§ў§ўў§ўў§ўўј§ў§ўћў§ўўќ§ў§ўў§ќћў§ў ўў§ўўќћў§ћћ§ў§ўўў§ўўњ§ў§ў§ўўў§ўўъ§ў§ў§ў§ўћў§ў§§ћўћ§ћў§ў ўќ§ў§ў ўў§ўўьћў§ўћ§ћў§ў§ў§ў§ў§ў§ўўљћ§ћўћ§ўўў§ўўў§ўўі§ў§ў§ў§§ћ§§љў§ў§ў§ўўўћўўў§ўўќ§ў§ўўќћў§ў ўљ§ў§ў§ў§§ѓў§ўћў§ў§ў§ў§ўўќ§ў§ўўђ§ў§ў§ў§ў§ў§ў§ўўў§ўўц§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўў§§ўўќ§ўћўўћ§ў§ў§§єћўћ§ћў§ў§ў§ўўѕ§ўћ§§ў§ў§§ћћѕў§ў§ў§ў§ў§ўўњ§ў§ў§ўўс§ў§§ћў§ў§ў§ў§ўћ§ћўў§ћ§§ў§ўћ§§ў§§ўў§§љћ§§ўћћ§§ћў§ў§ў ўј§ў§ў§ў§ўў§єћ§ћў§§ћ§ћ§ћўўў§ўў§ўў§ўўў§ўў§ќћ§§ўўј§ў§ў§ў§ўў§ўћўў§іћ§ћў§ў§ў§ўў§§ў§§ў§§ў§§ўў§ўў§јћўћ§ўў§ўўў§ўўі§ўћў§ў§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўў§іћ§§ў§ў§ў§ўўў§ўў§ўў§ўўі§ў§ў§§ћў§ўўў§ўўўћўўў§ўўў§ўўў§ўўў§ўўќ§ў§ў ў§ћў§ў§ўўў§ўўќ§ў§ўў§єћў§ў§ў§ў§ў§ўўў§ўўќ§ў§ўўў§ў ўў§ў ў§ў§їў§ў§ў§ў§ўўј§ў§ў§ўћ§§ћћўћњћћћў§ў§ўўў§ўўў§ўўў§ўў§§ў§ўўќ§ў§ўўљ§ўћ§ћў§§§ўћ§§іћў§ўћ§ћћњћћ§ўп§ў§§ћ§ћ§ћ§ћў§ў§ў§ў§ў§ўћўћўћћ§§ћ§ћћќў§ў§§уў§ў§ў§ўћў§§ћ§ћ§ћ§ћў§§ўўћ§§ў§ўўњ§ћћўћ§§эўћ§њћћ§ћ§§ў§ў§ўћў§ўўњ§ў§ў§ўўў§ўў№§ў§ў§ўћ§ћ§ћ§ћў§ўў§ћ§ў§ўўј§ў§ўћў§ўўў§ўўў§ўўў§ўўў§ў ўћ§ў§ў§§ўњ§ў§ў§ўўў§ўўћ§ў§ў§§§ў§ўўі§ў§ў§ўћў§ўўќћ§§ўўў§ўў§ўх§ў§ў§§ћў§ў§ў§ў§ў§ў§ў§ў§ў§ў§§ўі§ў§ў§ў§ўћ§§ћў§ў§ўў№§ћћ§ўў§ў§ў§ў§ўћ§§§ў§ўўш§ў§ў§ў§ў§ў§ў§ўћў§ў§ў§§ћўў№§ўў§ў§ў§ў§ўў§§ў§§ћў§ў§ўўќ§ў§ў ўє§ў§ўў§ћ§ћў§ўўі§ў§§ћ§§ў§ў ўћ§ў§ў§§љў§ўћў§ўў§§ў§§ћўћў§ўўї§ў§ў§ў§ў§§ўј§ў§ў§ў§ўў§ќћў§ўўќ§ў§ўўљ§ў§ў§ў§§ѓў§ў§ўў§ў§ћ§§ўўъ§ўћў§ўћў§§ћў§ў§§ћ§ћ§§ўўќ§ў§ўўќ§ў§ў ўќ§ў§ў ў§ў№§ў§ў§ў§ў§ў§ў§ў§ўўў§ўўњ§ў§ў§ўўў§ў ў§§ў§§іў§ў§§ћ§ћ§ўў§§ўћўўў§ўўў§ўўі§ў§ў§ў§ў§ўўќ§ў§ў ўј§ў§ў§§ћўўљ§ўћ§§ў§§ћў§ў§ўўљћ§§ћћ§ў ўё§ўў§ў§ў§ў§ў§ў§ўўѓћўћ§ћў§ў§ў§ў§§іў§§ћ§ћ§ћ§ћћ§ ўў§ўўќ§ў§ўў§ќњ§§ўў§ћў§§љў§ў§ў§ўўє§ў§ў§ў§ў§ў§ў ўў§ўўќ§ў§ўўњ§ў§ў§ўў§ўќ§ўћўўі§ў§§ћ§ћў§ўўњ§ў§ў§ўў§јћ§§ўћў§ўўњ§ў§ў§ў ўў§ўўѓ§ў§§ћ§§ў§§ћў§§ўў§§ўњћ§§ў§ўў§§ў§§ѕўћўћћ§ў§ў§ўўў§ў ўў§ўў§§ў§§ўѓ§ў§ўћўћўћ§ћўћћўў§ўўњћ§§ў§ўўє§ў§ў§ў§ў§ў§ўўўћ§§іћў§ў§ў§ў§ўўќ§ў§ўўќ§ў§ўўў§ўўћ§ў§ў§§їў§ў§ў§ў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўў§§ў§ўўќ§ў§ўў§§ў§§§ў§ўў ўњћўљўћўў§ў§їњ§§њњ§њћўўњњўћњ§ўўќњ§§ўўњњўўњћўўўћў ўўћў ўўћўўўћўўі§њўћўўњ§ћўўќћїћўўњ§љћјљњњ§ўћўќћўћўў§ўљ§§юљњњћ§§ўњњ§њњћњ§њ§ўўўћўўўћўўўћў ўћўўћ§§ќўћў§§ўћўіљњћ§ћўћўћўўўњ§§ўў§ўўљћў§§њљўўўћўўўћўўўћўў§§њћўўѕћўњўў§§ўўћўўјћўўћўўћўўћ§ўћњўўјћўўћћўў§§ўўћўў§њ§њњ§ўњўў§ќљњ§ў ў§ўћћљњ§ўў§ўћў ўєћўћўўћўўћўћўў§ћќ§ўњўўўњўўђ§њ§§ћјјњњјњљ§ўўўћўўћћўњњўў§ћњўўћћўўњўў§ћљ§ћњ§њљ§§іўћўў§ў§§њљљ§ўњўўўћўўўћўўўњ§§ўњќћ§њўўўћўў§ ўў§ўў§ўњ§§§њћўўўћў ўђћўўћўўћћњ§ўўћўўўћўў§§њћўў§§њ§§§њћўў§ўњ§§ў§§ўћ§§эњ§њћўљў§§њњ§ћ§ўў§ћўўћў§ўўћў ўћћўњљўўўћўў§љ§§ўћўўћћ§њњ§§іњ§њ§ўћўћњ§§ў§§љ§§іўћўўћ§њ§§ћћ§њў§ўўћ§њ§§ўўћ§ўћћўў§їњ§§љћћ§§ўўњћњ§њ§ўў§њњ§§ўў§§ўў§§ў§њї§ћћњћ§§ў§§ўћљљ§ўњўўѕћўћћњ§њњ§њ§§ўћћњї§ўўћўў§§§ћљ§§ў§ћўњќ§ўў§§ўћўўћўў§ўўћўўјћўћўў§§ўўўћўўљ§њ§љњ§ўў§ќњўў§§ўљњћ§§ўћўўўћўў§ў§љўћћў§§љљњўў§ўўћ§њњћўўіћўў§њ§њљљ§§ўњћў§§љўўњ§ќњўў§§ўўћўў§њў§њ§њ§§ўўћўўўћ§§ўўљ§§ўћўўўћўўўњ§§ќњ§§ўўќ§њ§ўўѓњ§њ§ўўњ§ўў§њ§§њўуњ§њўћћўўћў§ўў§њћўўћ§§њћћ§њ§§ў ўўћўўѓ§њ§њ§ўў§§њ§њ§§юњўўњњ§§ћѕѕјњ§§њ§ў§§ќњ§њўўўћўў§њўћўў§ўўћўўіћ§ўўњњћљљ§§ќњ§§њњћ§њњ§ўў§ћўњ§њ§§ќњ§§ўўћћўўћўўќњћ§њњ§њљљјћћљћ§§јћў§§њўћўў§іљњњћ§§њ§§ўў§ѕњћў§јїїњћљ§§ў§љњ§§њўў§ўўњћ§§љњўўў§ћћўњ§§ћњљљјћћѓљїѕњљљїјјљљњўў§њўћљ§њўўўњўўњїў§§љ§њ§§ўўћ§§љћћ§њљћћ§§ћћєљћљ§њњћљ§њ§ўўњњ§љњ§ўўў§ўўўћўў§ќћљњ§§ўљћћќ§њњ§§ћ§ћ§ў§ћњўў§ўў§ў ўњ§§ћљћћћњ§ўўњњњјћ§ўў§§ўћўўўћўўр§њћћљљ§њўўњљ§§ўћўўћўў§њ§њ§ћљћћњ§§јћљљ§§њњ§§ўњўў§ћњўўўћўў§ќўљњўў§ћўўћўўѕћўћўў§њ§њњ§§јњ§§њ§§ћ§§§њ§ўўњўћ§§ќљјљ§§њћјљ§ћљћљњўўќњ§њўў§љћ§ўў§ћћ№љћћ§§ўў§љљ§§ўћў§§ў§ўљћћќ§ћћ§§ќњјћ§§ќћљ§ћћљєћљљћњ§§ў§њњћћќўћ§ўў§юњўњњљћњ§§ўћўњњ§љњ§§ўшћњ§њ§њ§ћћљ§њћљћћј§§љњўў§ §ўў§њњўўњ§§ўљњћ§§ћћ§§ћљћ§§ўўњ§ћўћў§§ћўљ§§ћњљљћ§§ћ§ўњћћ§§љћ§§ќњ§љћћў§ћћўљћћ§іћљњ§ћљљћћ§§њ§ћљћћћ§њ§§ћћ§ўў§§ќњ§§ўў§њћјњјљћћ№љћћјљљћљјјњјјњћ§§§ў§ўў§§њ§ўўўњ§§ўћўўћ§њћјћћјїњјљћћј§§ ўіћњ§§јѕћ§њ§§щњ§§њњ§§ћў§§њњ§њћљ§њњ§љ§§тњўў§§ў§§њ§љ§§љћћљћћњўў§ћћљћћљ§§ўњўўћљ§§ћўў№§љћћ§§њ§ўћў§њ§ћ§§їћљ§§њ§ўў§§іњ§§њ§ћљњ§ўўљћўњњћ§ўў§ћ§§њ§§§њ§ўўљћўўњњћўў§§ћњўў§ўўћўўјњљљњњћ§ўўћўјљ§ћћ§ўў§§јњ§ўћ§њљ§§ўќ§њћўў§§њўўћћўўћўўўћўўпњ§§њњћўўњћћљ§§љћ§њњўўћ§§јћ§§њўћћўўњѓћјїњљљњљљњ§§ўўћћњљ§њ§§ќў§љћћ§ў§§њ§§§ћў§§јў§јљ§њљ§§§њћ§§ьњ§ўћ§њњ§љњўўњњ§§ўўћўўўћўў§ћљћћ§ўўўњўўњѓў§љјњњљљћћњћўўўћўў§ўњўў§ћў§§ў§љ§ўќ§њў§§ћњ§ўў§§ў§ќњ§њўўўћў ў§ёњ§ўў§§ћњўў§њњ§ўўљњ§§њ§њўў§љњљћњїљ§§јњ§њ§њўњўўќћўњ§§њѓљњћњ§ўћўў§§њљљі§ўћњњўўњњ§§њ§ўў§§ўўњўўўћўўњћ§њ§ћўў§ўћўўћћўњњ§§њћљћ§ћ§§њћљћ§§ўўћўї§ўћў§§ћјўў§ўњ§§ў§ћњ§§ђњ§њ§њўћў§§ћћ§ўў§§њўўќњ§§ўўєћўў§§ћћљ§§њўўўћ§§іћўў§§ўўћ§њњ§ў§ўћћўњћўў§љњ§ўў§ћ§§§љ§ўў№ћўўћ§§љ§њ§ўћћњњ§§ў§ќњ§њў ўўћўў§§њ§§ўћўўћўќћ§§ўўќ§њњўўўћўўћ§ћљј§§§њћўў§ўў§§љњ§њћћљўўѓ§ћў§ћћўћўћў§ўўј§љўћўўћўўѕ§ўўћ§§ћўўћўўїћ§§ўўћўћўў§ћ§ў§љ§ъћ§ўўћ§§ўўћћў§§ћў§њњ§њўў§ўјњ§§ўћўћўўўћўўўћўўјњљћ§њ§њўўјћњ§љ§ўў§§ўњћ§ћ§§ўўњў§ўў§њ§ўўћћњ§њўўћљ§љљћћ§ўўўћўўўћўўћў§§љ§§ўў§§§ў§ўўњћўўњ§ўў§§љўўёћ§њњ§§њўўњўћ§§ўўіћўћўћћўўћўў§§њўўћўћўўћўўћљ§ўўћўўўњћћўўћћўћўћ ў§§ћўўў§ўўјћ§ўўћћњўўњ§ўў§§ўўћўќћўћў ўўњўўўћўўўћўўљњўўћўњўўўћўўўћўўўњў$ўўћўў§§љћўўўћўўўћўўўћў ўћўўћўў§ўўћ§§њ§§ўћћўјћ§њ§ўўћўўўў§ўўњ§ў§ў§ўўћў§ўўјћ§ћ§ћ§ћ§§ђћ§ўў§ў§ў§ўў§ћўў§§ћ§ўўў§ўў§ўў§ўўў§ўўў§ўўў§ўўїћ§§ў§ў§§ў ў§ћћњ§ў§§јћў§ў§ў§ўўњ§ў§ў§ўўњ§ўћ§ћ§§ћљ№њ§ћў§§ћ§ўў§ћ§ћ§ўўњ§ў§ў§ўўќ§ў§ўў№§ўў§ћ§§ў§§ћ§ћ§§ўўј§ў§ўћў§ўўў§ўў§њћ§§ўћўўњћ§§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўўє§ў§ўћ§ћ§ўў§ўў§§ћўўњ§ў§ў§ўўћ§ў§ў§§ўў§ўўј§ўћ§ћ§§ўўћ§ў§ў§§ўў§ўўњћ§ў§ћўўќ§ў§ўўѓ§ў§§ћ§§ўњћ§§ўўќ§ћ§ў ўў§ўўќ§ў§ўўђ§ў§ў§§ћ§ћ§њњћўў§§ў§ўўћћ§ћ§њњљїњљћћў§ў§ў ўќ§ў§ўўќ§ў§ўўфћ§ћ§ћћњћћ§ћ§ћ§ў§ћ§§ў§ўћўћ§§ћћ§ўђ§ў§ў§ў§ў§ў§ў§ўўє§ў§ў§ў§§ћ§ћўў§ћ§ўў§ўўў§ў ў§јћў§ў§ў§ўў§ћў§ў§ўў§љћ§ћ§ћ§ўўў§ўўў§ўўў§ўў§ўљ§ў§§ћ§ўўїћ§ћ§ћ§ћ§ўўўћ§§њћ§ћў§ўўї§ћћўў§ћћ§§љў§ў§§ћ§§јњћўўћў§ўўў§ўўі§ўў§ћ§ћў§ўўў§ўўў§ўўў§ўўќ§ў§ўўєћ§ћ§ћ§ћўћ§§ўўўћ§§ўћ§§яў§ў§§ћ§§ўћўћ§ћ§§ўўћћ§§ћњњћ§ўў§§љћў§ў§ў§§ўо§ў§ў§ў§ўћ§ћ§ћ§ћ§ћњњ§ћў§ў§ў§ўў§ћ§ћўў§ьћ§ћ§ћ§ўўћ§ћўћ§ћў§ўћ§§ўћўўї§ћўћ§ћ§њћћї§ћ§§ў§ў§ўў§њћ§ћ§ћўўќ§ў§ўўў§ўў§іћ§њћћ§ћ§ћўўјћ§ўў§ў§ўўў§ў ўў§ўў§§ў§§љўћ§ћ§ћўўў§ўў§ўћўўќ§ў§ўўі§ў§ўћ§§ў§ўў§ьћ§ћў§ў§ў§§ћ§§ў§§ћ§ћўўћ§њ§ћўўў§ўўў§ўўіћ§§ў§§ћ§§ўў§ћ§ћћ§яў§ўћў§ўћ§§ў§ў§ў§ўў§ћѓ§ћ§ћў§ў§§ћў§ўў§ћі§ў§§ћ§ћў§ўўќ§ў§ўўќ§ћћ§§ѕћ§§ћ§ћ§ћ§§ўўы§ћ§ћ§§ў§ўћ§ћў§ў§ў§ў§ўў§ўћ§§щћў§ў§ўћ§ћў§ўў§ћ§ћў§§ћў§§ўћ§§ѓў§ў§ў§ў§§ћ§§ўў§§ў§§ќўћ§ўўћ§§ћњ§§ўћўўў§ўўќ§ў§ўўљ§ў§ў§ў§§ќўћћ§§ўћ§§іћ§ўў§§ћ§њ§§јћ§ћўћ§ћ§§ў§ўћ§§ўі§ў§ўћ§§ў§ўўђ§ўў§§ў§§њћћ§ћ§§ўћ§§ўћ§§ћў§ў§ўўћћ§ћў§§ћ§ќћў§ўўў§ўў§ўњ§§љћ§ћ§§ћњњёћњ§ћ§ћў§§ћ§ўў§ўўє§ўћ§ћ§ћљљћћ§§ўћўўіћ§ћ§§ўў§њљљњњћћ§ћўўў§ўўы§ћ§ћ§ћ§ўў§ўћў§ўў§ћў§ўўѕћњњћ§§ћ§ћ§ћћњћљћњћ§ћў§§ћўўјћ§§ў§ў§ўў§њў§ў§ў§§јћўћ§ћ§§ўўў§ўўћњћј§ћћњћћ§њњїћњўћ§§њћ§§ў§љћ§ћў§ў§§јў§ў§ўў§ћћђ§ћ§ћ§ћўњћњћњћњњчћ§§ћ§ћ§њћћ§ћ§ћ§њњћ§ћў§ў§ўўіћ§ћў§ўћў§ўўћ§ў§ў§§ѕћњћћњћњ§§ў§§іњћў§§ћ§ћ§ўўј§ў§ўћ§њћћ§їў§ўћ§ўў§ўў§ѕњћњћ§§ћ§ћњћћ§њћ§ћ§§ўўў§ўў§§ў§ўўєћ§ћ§ћ§ћ§§ў§ўўќћ§ћўўњ§ў§ў§ўў§№ћ§ћ§ћ§§ћћўћ§ћ§ћ§§ў§єњ§ћ§ћ§ћњћ§ћ§§њћўњћћ§ќў§ў§§ў§ћ§ћћ№§ўўћћњћњћњњћ§ўўћћўпћ§ћ§ћў§§ћ§ћ§ћ§ћћњћњ§њћћ§ћ§ћ§§ћћ§ћћћ§њћњћћўњћћ§њћўћ§§ўўўћўў№§ў§§ћ§§ў§§ћњ§§ћўў§іћў§§ћ§ћ§ћўўм§ћ§ћ§ћћњћћ§њћњњ§§ћћ§ў§§ћ§ћ§ћ§ћ§ћ§ћў§§ў§њћ§ћ§ћўўї§њћ§њћћ§ћћјњћ§ўў§§ўўшћ§ћћњћћ§ћ§§ћћњћ§ћ§њћћ§§њњќ§ћ§ћћ§§ћ§§њўњњћњћћњћњј§ћ§ћњў§ћћ№њћћ§ћ§§њћњњћњћњ§§ћхњћњ§ћўћ§ћ§ћћ§§ћў§ў§§ћћњљњћњњїћњћњћћњћњњіљћћ§ћўћў§ўўњћ§ћ§ћ§§ў§іћ§ћ§ћ§ћ§ћўў§§ў§§юћњћњћћљњћњћ§§ћ§ћ§ћћ§§ћўўў§ўўь§ў§ў§ўў§ћ§ћ§њћ§ћћ§ћ§§ўћ§§њћў§§ћ§§ћ§ћб§ћ§ћ§ћ§§ўў§ћўћ§§ћћ§ћћњћћњњ§§ўћћњћњћћ§ћ§ћ§ћ§ћ§§ўўњ§ўў§ћўўђ§ў§ў§§ўћњ§ћ§ћўў№ћ§ћўћ§ћ§ћ§ћ§њћћ§§ўњћ§ћ§ћ§§§њћ§§ќў§ў§§§ўћўўћ§ћњњ§§фћ§ћ§ћ§ћў§ў§ў§ў§ў§§ўў§ўў§ћћ§ўўќћ§§ўў№§ўћљљћћў§ў§ў§ў§ўўћјњ§§ўћ§ћ§§їўћ§ў§ћ§§ўў§§ў§§§ў§ўўќћ§§ў ўў§ўў§ќћ§§ўўљ§ћњўћ§ћћ§ўјћ§§њћ§§ўў§ѓћњћљћћ§ћћ§§ћўўў§ўўј§ўћ§ћ§ћ§§ћљњћћ§ћў§§тћ§ўўћ§ћ§ћўћ§ћ§§ўћ§ћ§§ћћ§ћ§ћўў§§ћ§§ў§§њћў§ў§ўўї§ћћњћћў§ўўў§ўў§§ў§§єўћћњљљћћњњ§ўўњ§ўћ§§ўўѓћ§ћ§ћў§ў§ў§§ћћї§ћў§ў§ўћ§§цћ§ћ§ћ§ћ§ћўў§ћ§ћўў§ћ§ћ§ћ§§ўўј§ў§ў§ў§ўўўћ§§ўјћ§њ§ўўћ§§ўу§ћ§§ћ§ў§ў§§ћ§ћћљћћ§ћ§ћ§ћ§ћ§§ўўя§ў§§ћ§ћ§ћ§ћ§§ў§ћ§§љў§ўћ§§ћћў§ў§ќћ§ћ§§іћўћ§ћ§ћў§ўўў§ўўў§ўў§ўў§ўўњћ§ўў§ўў§№ћ§њћњ§ў§ћ§њћњ§ћўўј§ў§ў§ў§ўўќ§ўћўўѕћ§ўў§ўў§ћ§ћћ§§ћўў§ўћ§§ўњћ§њћћўўєћ§§ў§ў§ў§§ћўўѕ§ўћ§њћћ§ћ§ўўќ§ћ§ўўљ§ћў§ўћ§§іћ§ћ§§ўћ§ћўўў§ўўю§ў§§ћ§ћў§§њ§ћ§ћўћўўќ§ў§ўўі§ўў§ћўћ§ћўў§јћ§ћ§§ўћ§§§ў§ўўќ§ў§ўўќ§ў§ўў§єћ§ћ§ўў§ў§ў§ўўў§ўўћњћ§§ўў§§ў§ўў§јњћћ§ћ§§ўў§ућ§ў§ћ§ћ§ћ§ћ§њћўў§ўћў§§ўў§ў§ў§§јў§ў§ў§ћўў§§ў§§ў§§ў§ўўі§ў§ўў§ћў§ўўё§ў§§ћ§њњћ§§ўћ§ћћљ§ћ§ћўћўўќћ§§ўўћўў§§юћ§§ў§§ћ§ўў§ў§§ћ§§ўўњ§ў§ў§ўўќ§ў§ўўќ§ћњ§§§ў§ўў§іћ§§ўћ§ћ§§ўўцћўћ§§ў§ў§ў§ў§ў§§ћў§ў§ў§§ћўўў§ўў§ ўћњћ§ўў§ўўќ§ў§ў ўќ§ў§ўўќ§ўўћћ§ўћ§§§ў§ўў§іћў§ў§§ћў§ўўў§ўўќ§ў§ўўќ§ў§ўўј§ў§ў§ўћ§§юћў§ў§ўў§ћў§ў§ў§ў§ўўў§ўў§§ў§§ўќ§ў§ўўў§ўўў§ўўќћ§ћў ўў§ўўў§ўўў§ўўў§ўўў§ўў§ўў§ўўіћў§ў§ўў§§ўўњћў§§ћў ўў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўћ§ў§ў§§§ў§ўўў§ўўњ§ў§ў§ў ўє§ў§ў§ў§ў§ў§ўўў§ўўў§ў ўљ§ў§ўћ§ўўў§ўўў§ўўў§ўўў§ўў§іћ§§ўў§ћ§ћ§§ўў§ўўў§ўўњ§ў§ў§ўўі§ўћ§ћў§ў§ўўўє§ў§ў§ў§ў§ў§ўўў§ўўќ§ў§ўўў§ў5ўў§ўўў§ў ўћ§ў§§ўўў§ўў§љўћўћ§§ўўў§ў/ўќ§ў§ўўњ§ў§ў§ў ўў§ў ўќ§ў§ў ўќ§ў§ў%ўќ§ў§ўўў§ўўў§ўўќ§ў§ў ўќ§ў§ўўќ§ў§ў ўќ§ў§ўўќ§ў§ўўќ§ў§ўўћ§ў§ў§§ўў§ўўћ§ў§§ћћќњћћўўю§ў§ўћ§ћ§§ў§ў§ў§ў§ўўј§ўћ§ћў§ўўќ§ў§ўўњ§ўћў§ўўў§ў ўў§ўўј§ў§ў§ў§ўўў§ў ўќ§ў§ўўњ§ў§ў§ўўњ§ў§ў§ў ўў§ўўў§ўўљ§ў§ў§§ўўќ§ў§ўўў§ў ўі§ў§ў§§ўў§ўўј§ў§ў§ў§ўўќ§ў§ўўќ§ў§ўў§§ў§§јћў§ў§ў§ўў§ўў§ў ўї§ў§ў§ў§ў§§ ўў§ўўј§ў§ў§ў§ўўў§ўўў§ўўў§ўўў§ўўє§ў§§ћ§ћў§ў§ў ўј§ў§ў§ў§ўўў§ўў§§ў§§ћў§ў§ўўў§ўўќ§ў§ўўќ§ў§ў ўў§ў ўў§ў ў§§ў§§ўќ§ў§ўўќ§ў§ўў§ўў§ўўќ§ў§ўў§§ћ§ўўў§ў ўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўў§ўўќ§ў§ў ўќ§ў§ўўј§ў§ў§ў§ўўњ§ў§ў§ўўќ§ў§ў ўњ§ў§ў§ўўў§ўўќ§ў§ўўў§ўўј§ў§ў§ў§ўўќ§ў§ўўў§ўўў§ўўіћў§ўћ§§ў§ўўњ§ў§ў§ўўћ§ў§ў§§§ў§ўў§§ў§§љў§ў§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўўў§ўўў§ўў§№ћ§§ў§ў§ў§ў§ў§ў§ўўў§ўўў§ўўќ§ў§ўў§§ў§ўўђ§ў§ў§ў§§ћ§§ў§ўўќ§ў§ўўћ§ў§§ћћћў§ў§ўўќ§ў§ўўі§ћњ§ћ§ћў§ўўј§ў§ў§ў§ўўћ§ўў§ўў§љћў§ў§ў§§ђў§ўћўћ§ћ§ћўћћ§§ўў§ўўў§ўўў§ўўі§ў§ў§ў§ў§ўў§їћў§ўћ§ћў§§ў§§ў§§§ў§ўў§ўў§ўўю§ўћ§ўў§ў§ў§§ћ§ћ§ћ§§ўѓ§ў§ў§§ћў§ў§ў§§§ў§ў ўў§ўўі§ў§ў§§ћ§ћ§§ў§§ў§§ўњ§ў§ў§ў ў§њћ§§ў§ўўў§ўўц§ў§ў§§ћ§ћў§ў§ў§§ћў§ў§ў§ў§ўўі§ў§ў§ў§ў§ўўў§ўўє§ў§ў§ў§ў§ў§ўўј§ў§ў§ў§ўў§§ў§§щў§ў§ўћ§§ў§ў§ў§ўћў§ўћ§§ўўў§ўў§ўіћ§ћ§ћ§§ў§ўў§ўќ§ў§ўўє§ў§ў§ў§ў§§ћ§§ђћў§ў§ў§§ћў§ўћ§§єћ§ћ§ћ§§ўћў§ўўќ§ў§ўў§§ў§ўўі§ў§ў§ў§ў§ўўѕ§ў§ў§ўћ§ћў§§§ўћўўє§ў§ў§ў§ў§ў§ўўќ§ў§ўўњ§ў§ў§ўўђ§ў§§ћў§ўў§§ў§ўўў§ўўѕ§ўћ§§ў§ў§ў§§іў§ў§§ћў§ў§§эў§§ћў§ў§ў§ў§ўћ§ћўћ§§§ћў§§їў§ў§ў§ўћ§§љћў§ў§ў§§ђћ§ћ§§ў§ўћ§ћ§§ўўќ§ў§ўўў§ўў§§ўћћ§§ћў§§ћўњћћ§ў§ўўј§ў§ў§ў§ўўі§ў§ў§ў§ў§ўўљ§ўћўћ§ћћѕў§§ћ§§ў§ў§ўўў§ўўћ§ў§§ўўњ§ў§ў§ўўў§ўў§§ў§§яўћ§§ў§ў§ў§ў§ў§ў§ўўў§ўўѕ§ўў§§ўћ§ћў§§ў№ћў§§ћ§§ў§ў§ў§ў§ўўў§ўўј§ўћ§§ў§ўўў§ўўђ§ў§ў§ў§§ћў§ў§ўўљ§ў§ў§ў§§§ў§ўўў§ўў§§ў§§їў§ў§ў§ў§ў ўў§ўўќ§ўћўўў§ўўћ§ћўћў ўќћ§§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ўўјћ§§ў§ўћўў§§ў§ў ўљ§ўћўћў§§ћў§ў§ў ўє§ў§ў§§ћ§ћў§ўўњ§ў§ў§ўўќ§ў§ўў§ўі§ў§ўћў§ў§ўўњ§ў§ў§ўўќ§ў§ў ўњ§ўћ§ћў ўў§ўўў§ћћ§ ўў§ўўќ§ў§ўўњ§ўћ§§ўўє§ў§ў§ў§ў§ў§ўўќ§ў§ўўј§ў§ў§ў§ўўќ§ў§ўў§ўќ§ў§ўўќ§ў§ўўћ§ўў§ћћ§љў§ў§ў§ўўі§ў§ў§ў§ў§ўўќћў§ўўњ§ўћ§§ўўў§ўўј§ў§ў§ў§ўўќ§ў§ўўќ§ў§ўўў§ўўѓ§ў§ў§§ћ§§ў§ў§§ўў§ўўќ§ў§ўўў§ўўј§ў§ў§ў§ўў§ўћўўў§ўўў§ў ў§њћ§§ў§ўўќ§ў§ўўў§ўўј§ў§ў§ў§ўўў§ўўќ§ў§ўў§ћў§ў§ў ўў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўј§ў§ў§ў§ўўќ§ў§ўўќ§ў§ўўј§ў§ў§ў§ўў№§ў§ў§ў§ў§ў§ў§§ћўўў§ўўў§ўўў§ўў§ ўў§ўў§§ў§§§ў§ўўј§ўћ§§ў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўў§§ў§ўў§ўќ§ў§ўўўћўўў§ў ўў§ўўў§ў ўў§ў ў§§ў§§ўѕ§ўў§ў§ў§ў§ўўў§ўў§ўќ§ў§ўўў§ўўў§ў;ўќ§ў§ўўўћўўў§ўўў§ў ўў§ў‚ўў§ў5ўќ§ў§ўўј§ў§ў§ў§ўўўў§ўўі§њњўўћўўћўўїћњ§љњ§њњўўї§љћљљњ§§ў ўўћў ўќћ§§ўўўћўўћўњњ§ўћћўў§ќњ§ћўўљћўћўўњ§§ў§њўћћўўћўўљћ§§ўўћўўўћўў§ћћўњњўў§ўўћўўыћўћњ§ўўњњ§§ўў§§њ§§ўњ§§ћ§ ўјњўўћўўћўўњ§§ћўўѕ§њ§ўћћўўћћўўњќћ§љћћњ§њўўћўў№ћўў§њњў§љњўўћњњўўѕћў§ћљ§њўћњўўћўє§јљћ§§ўўћ§§ўўўћўўўћўўћўўћўўњћ§§ўћўўћўјћўўњњўћўўўћўўћў§ўўўњ§§ћљўўћўўўћўўўњћћўњћўўњљўўћўўћўўћіўњў§ћљ§§ћўўўћўўўћўўўњў ўўћўўќћўћњњ§§ў§§ћњћўћў ўўћўўќњ§ћўўњћўћўћўўўћўўўћ§§ўўћўўўћўў§ўњљљўњўўўћ§§ ўћњћўћўўўњў ў§§ћўўє§њњ§ўўњ§ўўћўўћўљњњўћўћўўћћ§ўњўўњ§ћў§їљњљјљ§ўћњњў§ўўњљќћњњўўўћўўў§ўўћўўћўў§њћ§§ўў§§њњ§њћћўўћњљћљ§§њћљ§њ§ўў§ћњўў§ћњўўћћўўћўўћћўњ§ўўћўћў§§њўў§њ§ў ўўћўўўћў ўўћўўћ ўўћўўћћњўћўўўћўўћ ўўћўўўћўўјћўўћ§љљ§§§ўћў ўўћўўјњћў§ўўћў ўњ§ќњўћўў§њћўўўћўў§ћњ§§ўўћўўљњћ§§ўћўўќ§њ§ўўўћўўўћўўї§ў§љ§§ћћљљђ§ўўћћўў§§њ§ўћўўќћўћўўќћўњўўўћўўўћўў§њћ§њњїўўўњў ўћћўўћўўў§ўў§ўўћўўўћўў§§ўћћўќњўћўўќћўћўўўћўўўћўўўћўўў§ўўќ§њћўўњўћњ§ўћўўќћў§ўўї§јљ§ўћўћўў§§љўўўћўўћўћўўћўўўћўўњћњ§§ўћћўіћ§§ўћў§§ћўўјњћўўћўћў ў§ќњ§§ўў§ќћўћўўўћўўўћўўјћўўћњћћўўњћўўћћў ўє§љљњњ§§њњўў§§ўћ§§ўћћў§њ§§ў§њ§ўўўћўўћ§їњ§њўўћўћўўћњ§љњўўўћўў§ќњ§ў§§љўћ§§ўў§§ћњ§ћљ§§ћљ§ўћўўўћў ўўњўў§ћњўўўћў ў§ћ§ўў§§њ§§ўўћўўѕћўћўњ§§љ§§њњўўћћўўћ§§њ§ўћўў§ўћўўўћўўћўњ§§њј§ўўћў§њўў§њў§ўўћў№§љњ§ўў§јћћ§§ўўћўўўћўў§њ§ўїћњњћњ§§ћ§§ќћўћўўїњ§љћљњўў§§ђњ§ў§њ§ћ§љћљњћўўўћўўјћ§ћљћ§њўў§ўњ§§їњ§ўћўћўў§§ўњ§§ўўћў ўћњ§њњўўњњ§ўўћўў§њ§ўўўћўў§ћњўўј§ўћњўўћўўўћўўчњ§ўў§њљћћўў§§њўўћўў§§љћљ§§ў§ўњўў§ўћўў§§ўћўўѓћўћћ§§њ§§ўўћўўў§ўў§љў§§ўўћўўі§ћњ§ў§§ўћ§§єћўўћўћўћўњњўў§ўќљ§§ўўћ§ўўћўўїћ§§ћњњ§§ўўќњ§§ўўќћ§§ўўћ§ўћўўћћўўћўўћў§§њўўѕћ§ў§њ§ў§ўћўўўћў ўћћўћћўўў§љљќњўћўўўћўў§њњўўћў§§ўћљў§њўўћўўњўћў§љўњўўўћўўўћўў§ў§§ћўўўћўўўћўўє§љћћ§ўў§§ўћўў§§ћ§ўўўћўўћћњўћўўї§њўў§§њћўўњњљњ§њ§§ћ§ўњўўњћўўћћўўўћўў§§њ§§јњ§ўћў§ћ§§ў§ў§њў§§њћљљјјњљ§§ўћўўћњўњ§ћћњ§њ§§ћўў§ўўњ§§ўіћўћў§ўћўћўў§њў§ўў§§ћјљљђћ§њ§њ§љћћљњњў§§ў§§њ§§љўћћўњћ§§ўћў ўўћўў§§њ§§ўј§њ§њњ§њўў§ќњћ§ўўўћўўў§ўў№ћњњћўўћўћў§§ћћњ§§№њ§њњўўћўўњћїјљњ§§ўўћўўіћўўћўўћ§ў§§ў§§њ§§ўв§њњ§ўњ§§њљўћўњ§ћљћњ§ћћўњћѕ§ўћ§§ўљћћў§њћў§љ§њљ§§јњ§§ћњљ§ўўћў§ўўћўўќћўћўўтћўћўћћ§њ§њљћ§§њ§ўўћўў§ћљјљ§њ§ўўњ§ьљћјїњјїћљњњ§њћћўўћў§§эў§њў§љ§§ћўў§§њњјћ§ўўўћўўЬњћўћўўњљљћ§њњ§њ§ўћў§§ћћљљћ§§љњўћўў§ћљјјїљ§ў§љћњ§§ўў§§ўўћўўўњўў§§ўћўўўњўўњ§њ§ўњўўњњ§§ўў§§љўћћўћћўўўћўўћўћ ўћ§ўћўўќњ§§ўўѓћў§љљћ§§њћўњў ўќћўњ§§ўћўўўњўўј§њњљњўћў ўў§ўўўћўў§њљ§§ћћў ўўћўў§ќўћўћћўљ§љј§§ћўўћўў§§ў№ћњ§њўњўў§§ћўўћ§љљїњћ§§ћљ§њўў§ўћћњ§§љљ§јћ§§њјћњў§ћљ§ўўўњ§§ђўћљњјјћ§љњњјљћћ§ўўћўўњћўњ§§ўў§ќњ§§ўў§ўїњљћ§§ћљљ§§ўљњ§§ўўћўўїћўњўў§њ§ўўыћўњ§њ§ћћўћ§§ў§§ўћўћћўўћњ§њ§ўўѕћ§њ§ўў§љњ§ўўўћўўўћўўњњў§ћћўўіњ§§њћљ§§ў§§јњ§§ћўўњўў§ўўћўўћћўўћўўўћўўњў§љўћњљљњўўќћўћўўњў§ўўўћў ў§ћ§ў ўўћўўѕћўўњ§њ§§њ§ўў§ћњўў§њћўўўћўў§ўљ§§ўњ§§љўњўўўћўў§іћљћњ§љћўћўўїћњљ§њ§ћћўўћ§ќћўў§§ћў§ўўћўяњ§ўўњ§љћњљћ§њћўћўўѓњљћћњ§§њћћњћўў§ўњўўћўў§њњў§ўћ§ўњўўћћњћњў ўўћўўјћўћњњ§§ўўћћўў§ўўўњ§§љўћћњњ§ў ў§ў§ўє§љћљ§ўўћўћ§ўў§њљћћљўў§§ўўћ§§ўї§ўў§ћў§ћ§§ўћѓњћћ§ћ§§ў§ў§§ўўў§ўўљ§ћў§ў§ўўў§ўўў§ўўў§ўўќ§ў§ўў§§ћўўў§ў ўў§ўўќ§ў§ўўщ§ћ§ћў§ў§ў§ў§ў§§ћ§§ў§ў§ўўі§ћћ§§ў§ў§ўўј§ўў§ћў§ўўќ§ў§ўўќ§ў§ўўї§ў§ўћ§ўў§§яў§§ћ§ўў§ў§ў§ў§ў§ўўќ§ћў§§јћў§§ћ§ћ§§јћ§ћњњ§ћўўќ§ў§ўўќ§ў§ўўў§ўў§ў§ўў§ўўю§ў§ў§ў§§њћћњњћћ§§ўўє§ў§ўћ§§ўћў§ўў§ўіћњћ§§ўў§§ўўќ§ў§ўўѓ§ћћњ§ћў§ўћ§§ўўў§ў ўї§ў§ў§ўћћўўў§ўў§§ў§§ўў§ўўў§ўў§їў§ўў§ћ§ћўўў§ўўў§ў ўў§ўўќ§ў§ўў§ћњћћ§ўўў§ўўў§ўў§ўў§ўўќ§ў§ўў§§ў§§љћўћ§ћ§ўў§ўљ§ў§ў§§ўўў§ўўє§ў§ў§ў§ў§ў§ўўє§ўћ§§ў§ў§ў§ўўњ§ў§ў§ўўќћ§§ћћў§ўўќ§ў§ўўќћ§ћўўќ§ў§ўўў§ўўњ§ў§ў§ўўў§ўўі§ў§ў§§ўў§ўўўћ§§ўў§§ўў§ўў§ўў§ўўў§ўў§ўњ§ў§ў§ўўќћ§ћўўѓ§ўћ§ў§ћ§ћћ§ў§§ў§ћќњ§§ўўў§ўўќ§ћ§ўўў§ўў№§ў§ў§§ћўћћ§ўћ§ћ§§ўћ§ў§§ћћ§ўў§§їў§ў§ў§ў§ўў§ћў§ў§ўўќ§ў§ўўќ§ўў§§§ў§ў ў§§ў§ўў§ўњ§ў§ў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўў§ўўў§ўўў§ў!ўў§ўўў§ўўі§ў§ў§ў§ў§ўўњ§ў§ў§ўўћ§§ћў ўў§ўўј§ўў§ўўћўўў§ўўў§ўўј§ў§§ћ§§ўўќ§ў§ўўў§ўўј§ў§ў§ў§ўўў§ўўћ§ћ§ћўўў§ўўњ§њћ§§ўў§ўќ§ў§ўўњ§ў§ў§ўўїћўћўћ§ўњћћўўћ§§§ў§ўўў§ўўў§ў ў№§ў§ў§ў§ў§ў§ў§ў§ўўў§ўў§§ў§§ўў§ўўљ§ў§ўћћ§§ќћ§§ўўў§ўўќ§ў§ўўў§ўўі§ўћў§ўў§ћў ўў§ўўў§ўў§ўњ§ў§ў§ўўў§ў ўќ§ў§ўўј§ў§§ўў§ўўя§ў§ў§ў§ў§ў§ў§ўћ§ўў§ўњ§ў§§ћўўў§ўў§ѕў§ўћ§ћ§§ў§ўўњћў§ў§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўўћ§ћ§§ўў§§ћўў§ћ§ў ўў§ўўќ§ў§ўўј§ў§ў§ўћ§§ўћўў§§ћ§ўўў§ўўў§ўўў§ўўў§ўўў§ўўћ§ћ§ёў§ћћ§њ§ћ§ћ§ћў§ўўјћ§ћ§ћў§ўў§ўў§ўўў§ўўћћ§ћ§§ўў§ќћў§ўўч§ў§ў§§ћ§ћўћ§ћўўћћў§§ћ§ћ§ћћљ§ћћў§§ўўј§ў§ў§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўўћўўњћ§ћ§ћўўў§ўў§ ўў§ћћ§ўќ§ў§ўўї§ћћ§§ўў§ўўў§ўўћ§ўћ§ўў§§ћ§§ўћўў§ў§ќћ§ћ§§ўў§ўўю§ўў§ў§ћў§§ћњњ§ћў§ўўќ§ў§ўў§§ћ§§яћ§ћў§ўў§§ћ§§ћњћ§ћћў§ўўш§ћћњћ§§ўћ§ћ§ћўћ§ћўћћњћ§ўўў§ўў№§њћњћ§ў§ў§ў§ћћ§ћћ§§ў§ўўћћ§ћ§ћўўў§ўўќ§ў§ўў§§ў§§ў§ўў§ўўђ§ћ§ў§ў§ў§ў§ў§ўў§§ў§§ўў§ўўў§ўўў§ўўў§ўў§ќўћ§ўў§ќћ§§ўў§ћєњћћ§ћћ§ў§ў§ўў§§ћ§ўў§іћ§ўў§§ћ§ћўўў§ўўўћ§§ўћўў§§ў§§ўў§ўўјћ§ћўћ§§ўў§ћњ§§ћўї§ћ§ўў§ў§ўў§ў§ћ§ўўќћ§§ўў§§ў§§ўќ§ў§ўўьћ§ў§§ћћў§ў§§ћў§ў§ў§ўўћ§ћў§ў ўњ§ў§ў§ўўю§ў§ўћ§§ў§ўћўћ§ћўћўўќ§ў§ўўѕ§ў§ў§ў§ў§§ўўљ§ў§ў§§ћћљ§ўў§ў§ўўќћ§§ўўї§ћ§§ў§ў§ўўќ§ћ§ўўњ§ў§ў§ўў§ћў§ў§ўў§ћ§ўў§ўўњ§ўћ§§ўў§§ћўўќ§ў§ўўћњњћў§§ћўўі§ў§§ћњћў§ўўќ§ў§ўўў§ўўэћ§§ўћ§§ў§ў§ў§ў§ў§ў§§ћў§ћћњјћ§§ў§ў§ўўќ§ў§ўў§ћ§њў§§ў§ћћяў§§ћў§ўў§ћ§ћўћћ§ћћљњљћћ§§ўўё§ў§§ўўћћњњћ§ћ§ўўђћ§ћ§§ў§§ћ§ћў§ўў§ўј§ў§§ћ§ћ§§ўћўўљћ§ћ§ћњћћ§њћ§§ў§ёў§ћ§ћў§ў§ў§ўћ§ћћў§ћњ§ћ§ўўќ§ў§ўў§ћ§ћћѓў§ўў§§ћ§§ћ§§ўўіћ§ћ§њћ§ў§ўўќ§ў§ўўћ§ў§§ўўї§ў§§ћћњ§ћћљ§ћ§ћ§§ўўў§њњњћ§ћ§ћўўњ§ў§ў§ўўяћўћ§ћ§§ўћ§ћ§ћћўў§§љћў§§ћ§ўў§њњћњ§ћўў§§њ§§ћўћ§§ўў§ўўћ§§ѓўћ§ћ§ћћњ§ўћ§ўўє§ў§§ћў§ў§ў§ўўќ§ў§ўўјћ§ћ§ћњћ§§ў§јњћњћћ§ћўўў§ўў§ћњѓљњћњћ§§ћ§ўў§ўўћ§ўћ§§ќў§ћўўћ§ќћњћўўі§ў§ў§ў§ў§ўўў§ћћ§ўћ§§ѕў§§ћњњћћњћ§§ѕў§ўћњћњњћћ§§фћњ§§ћў§§ћ§ћў§ў§ў§ў§ў§ў§ўў§ћўўќ§ў§ўўњ§ў§ў§ўў§ўў§ўўї§ћ§§ўћ§ћўўў§ўўќ§ў§ўўј§ў§ў§ў§ўўў§ўў§њћ§§ў§ўўћ§ўў§ўў§ўў§ћћўќ§ў§ўўј§ўћ§§ћ§ўўў§ўўј§ў§ў§§ћўўљ§ўћ§ћ§ћћўў§ўў§ўћўўђ§ўў§ћ§ћ§ўў§ў§ўў§§ћ§ўўћ§ћ§§ўўћўћ№љњћ§њћћ§§ў§§ћў§ўўљ§ўў§ћ§ћћљ§њ§ћ§ћ§§ўћ§љў§§ћ§ћўў§њћљ§њћњњ§§ћўўў§ўўў§ўў§шћў§ў§ўћ§ћ§ћћ§ў§ў§ўћ§ћ§§ўўѓ§ћњћ§њћћ§ћ§§ўўћ§ћ§§ўўў§ўў§ћћ§ў§ўўќ§ў§ўў§ўўћ§§ўћўўћ§ў§ў§§ёћ§ўўћћ§ћў§ћ§§ћў ў§§ў§§§ўћўў§њћ§њћћ§§ќћ§ћ§§ўћўўў§ўў§§ћ§ћћ ўў§ўўў§ўўў§ўўў§ўўў§ўў§ў§ћў§ћќ§ў§ўўў§ўўђ§ў§ў§ў§ў§ў§ў§ўў§ўќћў§ўўў§ў ўў§ўў§ћћ§ћў§ўўў§ўўў§ўўё§ўћ§§ћћ§ћ§ћ§ћ§ћћѓ§ў§ў§ў§ў§ў§§ћћљњ§ћўў§ўўњ§ў§ўў§§ўњ§ў§ў§ўўў§ўўљћ§ўў§§ћћї§њњћў§ў§ўў№§ўў§ћў§§ћћњљћњћўўђ§ў§ћњњ§§ћ§њњ§ўў§ќћ§§ўўўћ§§їўћ§ћ§ћ§§ўўў§ўўћњљњ§ўўњ§ў§ў§ўўў§ўў§ќћ§§ўўј§ў§ў§ўћўўў§ўў§ќћ§ћўў§ќћў§ўўє§ў§ў§§ћў§ў§ўўў§ўўў§ўўє§ўћ§§ўћћњћћўўњ§ўћў§ўў§ўћњњћўў§ўўў§ўўў§ўў§ўў§ўўў§ўўў§ўўў§ў ўќ§ў§ў ўў§ў ўў§ўўў§ўўќ§ў§ў ўў§ўўќ§ў§ўўѕ§ў§ў§ў§ў§ў§§ўќ§ў§ўўќ§ў§ўў§ў§ќћў§ўў§ўў§ў ў§§ў§§ўў§ў+ўў§ўўў§ўўћ§ў§§ў<ўј§ў§ў§ў§ў=ўў§ўўў§ўўў§ўў§ў§§ў§§ ўў§ў#ўў§ўўў§ўўў§ўўў§ўўў§ў ўў§ўўљ§ў§ў§§ўўў§ўўњ§ўћ§§ўўў§ўў§§ў§§ ўєћ§ўў§ў§ў§ў§ў ўў§ўўў§ўўў§ўўў§ўyўќ§ў§ўўў§ўўќ§ў§ў%ўў§ў ўќ§ў§ўўќ§ў§ў%ўњ§ў§ў§ўў§jўў§ўўў§ў/ўў§ў'ўў§ў ўў§ўўќћў§ўўў§ў3ўў§ўўў§ўўў§ў'ўќ§ў§ўўќ§ў§ў5ўќ§ў§ўўў§ўў§ћў§ў§ўўќ§ў§ўўў§ўўў§ў ўў§ўўў§ўўі§ў§ў§ўћ§§ўўў§ў7ўќ§ў§ўўі§ў§ў§ў§ў§ў ўў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўўј§ў§ў§ў§ў ўќ§ў§ўў§§ў§§ ў§§ў§§§ў§ўўі§ўћў§ў§ў§ўўў§ўўќ§ў§ўўў§ўў§ўћў ў§§ћ§ў ўќ§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ўўў§ўўќ§ў§ўўј§ў§§ћў§ў ўќ§ў§ўўќ§ў§ўўў§ў ўќ§ў§ўўў§ў ўў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўў§ў ўќ§ў§ўўў§ў ўў§ўўў§ў%ўј§ўћ§§ў§ў ўў§ўўќ§ў§ў#ў§§ў§§ўў§ўў§ўў§ўўќ§ў§ўўў§ўўў§ў ўќ§ў§ўўў§ўўќ§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўіћ§ћўћў§ў§ў ўќћ§§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўќ§ў§ўў№§ў§ў§ў§ў§§ўў§ў§ўўј§ў§ў§ў§ўў§§ў§ўўў§ўўў§ўўў§ўўў§ўўў§ўўћ§ўћ§ўўў§ўўў§ўўј§ўћў§ў§ў ўўћўўќ§ў§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўў§ўўј§ў§ў§ў§ўўў§ў ўў§ўўў§ўўњ§ў§ў§ўў§ћў§ў§ўў§§ў§§§ў§ўўіћўћ§§ў§ў§ў ўњ§ў§ў§ўўў§ўў§ќћў§ўўў§ўў§§ў§§ћў§ў§ўўђ§ўћўћ§§ў§ў§ў§ўўќ§ў§ўўўњўўў§ўўњ§ў§ў§ўўќ§ў§ўўў§ў)ўќ§ў§ўўњ§ўћў§ў!ўќ§ў§ўўћ§ў§§ўў§ ўњ§ў§ў§ў ўќ§ў§ўўў§ў ў§ќў§ў§§ўў§ў ўљ§ў§ў§ў§§љў§ў§ў§ўўќћў§ўўќ§ў§ўўѕ§ў§ў§ў§ўћў§§§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўє§ў§ў§ў§ў§ў§ўўў§ў ўў§ўўќ§ў§ўўќ§ў§ў ўў§ўўќћў§ў!ў§§ў§§ѕў§ў§ў§ў§ў§ўўќ§ў§ў+ўњ§ў§ў§ўўќ§ў§ў!ўќ§ў§ў'ўў§ўўў§ўўє§ў§ў§ў§ўў§§ў ўњ§ўћў§ў ўњ§ў§ў§ў ўў§ўўў§ўўќ§ў§ў ўў§ўўј§ў§§ћ§§ўўљћў§ў§ў§§ўў§ў ўќ§ў§ўўњ§ў§ў§ў ўћ§ћ§§ўўў§ўўќ§ў§ўўў§ў ўў§ўўў§ўўќ§ў§ў ў§ ўўћўў§ўўћўўќћўћў ўѕћўњўўњћўўћў ўњћ§§љўў§ ўћўћўќ§ўћўўќћўћўўћў§ўљ§§ћњ§њћўўњѕўћњ§§ўўћњњўў§ўћўў§ўўўћўў§§њўўќћ§§ўўўћўўўћўўўћўўўћўўћўўћўўќћўћўўўћўўќћњћўўўћўўњљ§њњћўћўўћњ§њћў ўћўўћўўіћљ§њљњљ§њ§§ўњўў§ўўћўўћќ§ћњўўњћњўўћў ўўћўўўћўўўњўўўћўўћўћљњ§ћўўћўўћўўўћўўњћўўћњў ўњўћўўўћўўјњ§ћўћўћўўњ§њњљњўўўћўўўњўўўћўўўњўўњњ§ўўћўўњћ§ўўћўўўћўўїњўўї§ўўћў ўўћўўўћўўќћўћўўќћљћўўў§ўўўћў)ўћў§ћњўўћћўўћў ўўћўўћњўћћў§ўўўћўўў§ў ўўћўўўћў ўўћўўќњ§§ўўќћўћўўўћў*ўћћўћњўўћўљўўў§ўўјћўўћўўћўўўњўўўћў ўћћўўћў ўўћўўќћўњўўўћўўњћўўњћўўўћўўўћўў§ўњўўўћўўўћўўўћў ў§њ§ўўќћњ§ўўўћў ўћ§ўўћўўќћўўћћњ§њїј§ўўћћўўћўўћћўўћўў§ ўўћўўќ§љ§ўўў§ўўўћўўќћ§§ўўћћњ§љњўўќћўћўўћіў§ўў§љўўћўўўћўўўћўўљўћўўќћўћў ўћњў§њљћўў§њћў'ўћўћ ўўћў ўћћўўћўўќћўћўўўћўўўћўўћўќћўћўў§јћўўќћўћўў§§ўћўўћўўћўўўћўўўћўўўћўўўћўўўћўўћўўћўўўћўўў§ўўўћўўўћўўќћўћўўѕћўўћўўњћўћўўўћў ўљћ§њ§§ћўўў§ўў§ћ§ўўћўћћўўњўўњ§ўћўўўћў%ўў§ўўўњўўћћўўћўўћўўћўўћ§ўћћўўўћўўќћўћў ўѕћўўћњўўћўћўўќћўћўўњћўћўћўўћўўћўўўћў ўќ§ўћўўўћўўћўњћўўћћўўћўћўљћўўњћћўўўћўўќћњњўўћ§ўћўўњћўћўћў ўћњўћћўћўўћўўћўўўћўўќњўћўўўњў ўў§ўўўћўўўћўўўњўўўћў ўўћўўўћў ўћўіњ§ћў§њўўћў ў§њћў ўћћў§§ўўќ§ўћўўќћўћў ўј§њ§§ўўћўўћўњћўўћћўўћћљўћћўўњћўўљћў ўћќ§ўњўўўћў ўўћўўњћњўўћўўљћўњўўћўўўћў ўўћўўўћўўўћўўўћўў§њћўўўћўўўћўўќћњћўўў§ўўћ§ўћўўњљ§ћўћўўљћўћўў§ўўћўќћўћўўњћўў§њўўћћўўњўўўњўўўћўўўћўўћћўўћўўћў§ўљћўўћўћўўќћўћўўћўћўўћўўћўўћўўћћўўћўўўћў ўіћўўћњўў§њўўў§ўўњ§њ§њњўўўћўўіћўћўћћўћћўўћћўўћўўўћўўњќ§ўћ§§ћњћўћў ўўћўўњўћўћњ§§њўўўњўў§ўюћ§§ћћјњўћўўћњ§§њњўўїћўўћћўћњўўіћ§§ћїњћњ§ўў§§њ§§ўўњ§§§ћ§ўўћњ§љ§ўўўћўўћўўћўў§§њўўј§љљћ§§њўўњњћћ§њў ўћњўўћўўќћ§§ўўэњўћћў§§ћ§њ§§ўћ§ўћћўўљљњўћўћўўќћўћўў§ўњўўўћўўћ§њћћў ўћўўњўўњћўўћћўўќћўћўўўћўў§њ§ўў§§ўћ§§јўћўћўўћўўћ§ў§њњњ§ўўћћўўќћ§њ§§§ўћўў§ў§ўўћўўўћўўўћўўѓ§ѕёѕўўћў§њћў§§ўћўўћ§њ§§ўў§ўњўўћњђєњўўўћўўўћўўћўј§њ§§ћўўњњўќ§ўћўўћ§њ§ўћћљўњљђђ§ўў§ћўћћўўњ§§ўћўўё§њўћўў§њ§њњћ§§ўўњўћ§њљ§ўўљ§ћћњўћў ўўћўўњ§њ§§њ§§ћњћљњўў§ў§ўњ§§јњћјљћ§љ§§ў§ўўћўўћўў§§њ§ќњ§ћўў§ћў§§ў§§ўћўў§љїјњљњ§ўћњўўўњўў§њ§ўў§ўњ§§њћ§њўћ§§§ўћў ў§ў§ўљћ§њћћўўѕћ§ћўћўўћўњ§§ќњ§њ§§ћњљћљ§§ўћўўўћўўћў§ўћўћїў§њљјјљљ§§ў§§њ§§јўћўўћўўњњћ§ў§њ§ўўўћўўњњћљћ§ўў§њљ§§їњўћњ§ўў§ўўє§њљўўњљїїјњўўєћўћўћњњ§њњ§ўўўћўўўћўўі§њ§ћћњћў§њњћ§ў§ў ўў§ўўљ§ћў§ў§ўўў§ў ўќ§ў§ўўў§ўў§њћўњ§ўў§ћў ўў§ўўќ§ў§ўўќ§ўћўўњ§ў§ў§ўўћ§ў§ўћћњ§ћ§ћ§ўўў§ўў§ўќ§ћ§ўў§§ў§ўўј§ўћ§ћў§ўўў§ўўќ§ўћўўќ§ў§ўўіћ§§ў§ўћ§§ўўў§ўўў§ўўў§ўўў§ўўў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ўўі§ў§§ћ§§ў§ўў§§ў§§ўў§ўўќ§ў§ўўќ§ў§ўўћћ§ў§ў§§њћ§ћў§ўў§ўћўўў§ўўћ§њ§§ўўќ§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ўўј§ў§ўў§ћўўў§ўўў§ўўў§ўўў§ўўј§ў§ў§ў§ў ў§ўј§ўћ§§ў§ў ў§§ў§§§ў§ўўў§ўўў§ўў§ ўўћўўќћў§ўўў§ўўў§ўўў§ўўє§ў§ў§ў§ў§ў§ўўќ§ў§ўўќ§ў§ўўќ§ўћўўњ§ў§ў§ў'ўј§ў§ў§ў§ўўў§ўўў§ўўќ§ћ§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ў ў§ўћўўў§ўўў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўўў§ўўќ§ў§ўўў§ў ўў§ў ўќ§ў§ўўў§ўўў§ўўў§ўўњ§ў§ў§ўўћўі§ў§ўў§ўў§ў ў§ў§§ћўўў§ўўў§ўўћ§ћ§ћўўє§ў§ў§ў§ў§ў§ўўљћљљњ§§ўўў§ўўќ§ў§ўўњћ§ћ§§ў ўў§ўўќ§ћ§ўўў§ўўј§ў§ўћ§§ўўј§ўў§ћў§ўўў§ў ў§§ћўўў§ўўў§ўўў§ўўў§ўўў§ўўў§ўўў§ўўў§ў ўў§ўў§ћ§ўўў§ўўў§ў ўў§ў ўќ§ў§ўўў§ўўў§ў ўћ§ўў§ўўў§ў ўў§ўўњ§ў§ў§ў ўў§ўўќ§ћћўўў§ў ўў§ўўќ§ў§ўўў§ў-ўќ§ў§ўўє§ў§ў§ў§ў§ў§ў ўў§ўўў§ўўќ§ў§ўўќ§ў§ўў§ћєў§ў§ў§ў§ўћ§ўў§ћ§ўўњ§ў§ў§ўўќ§ў§ўў§ўў§ўўў§ў ўў§ўўў§ў ўў§ўўќ§ўћўўў§ўўў§ўўќ§ў§ў ўњ§ў§ўћў ўј§ў§ў§ў§ў ўњ§ў§ў§ўўў§ўўі§ў§ў§ў§ў§ў ўў§ўўў§ўўў§ўўќ§ў§ў ўў§ўўў§ўўў§ўўў§ў ўў§ўўќ§ў§ў ўў§ў ўў§ў ўў§ў ў§§ў§ўўќ§ў§ў'ўќ§ў§ўўў§ўўў§ўўњ§ў§ў§ўўўћўўў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўўі§ў§§ўўћ§§ўўј§ў§ў§ў§ўўў§ўўў§ўўў§ўў§іћў§ў§ў§ўћўўў§ў ўњћ§ћћ§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ўўў§ўўў§ўўў§ўўўћўўў§ўўў§ўўў§ўўў§ўўў§ўўќ§ў§ўўў§ўўў§ў ўў§ўўў§ўўў§ўўў§ўўў§ўўў§ўўќ§ў§ўўў§ў ўў§ўўї§ў§ў§ўћ§ўўў§ўўўћў ўќ§ў§ўўќ§ћ§ўўњ§ў§ў§ў ў§ўў§ўў§ўў§ўўў§ўў§ќћ§§ў ўў§ў+ўў§ўўў§ў ўў§ўўќ§ў§ў ўў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўўў§ўўђћ§ўў§ўў§§ў§ўў§§§ў§ўўќ§ў§ў ўў§ўўў§ўўў§ўў§їћ§ўћ§ћ§§ўўњ§ў§ў§ўў§ўў§ўўќ§ў§ўў§ќћ§§ўўў§ўўђћ§§ў§ўў§ћћњ§§ўўј§ў§§ћ§§ўўў§ўўћ§ўў§ў ўмћ§њћљћ§§ўў§ў§ћ§ћћ§ћў§ў§§ћ§њ§§ўў§ћўћўўў§ў ўў§ўў§яў§ў§ў§§ћћњ§ћ§ўў§ўўњ§њњћ§ўўў§ўў§ѕў§ў§ў§§ўў§ўўє§ў§ўў§ћў§ў§ўў§іћўћ§ћ§§ўћўўў§ўўў§ўўљ§ў§§ћ§ўўќ§ўћўўќ§ў§ў ўў§ўў§ўў§ўўє§ў§ў§ў§ў§ў§ўўј§ў§§ћў§ўўў§ўўј§ў§ў§ў§ўў§ћћўў§ћћќ§ў§ўўќ§ў§ўўў§ўўў§ўўўћ§§ўі§ў§ўћ§ћ§ћўўі§ў§ўћ§ћ§§ўў§ћў§ўўў§ўўќ§ў§ўўќ§ў§ўўј§ў§§јђњўў§іў§§ћ§ўў§ў§§ћ§ў§ўўњ§ўћ§§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўћљєї§ўўњ§ў§ў§ўў§ўћўў§ў§§ў§ўўќћ§ћўўњ§љѕљћўўў§ўўі§ў§ў§§ћ§ћўўўћўўђ§ўћ§ћ§§ўћ§ўў§ўў§ёў§ўћ§ў§§ў§§њћ§ўўў§ў ў№§ћ§§ћ§ћ§ћ§ћ§њћ§ўўцћ§§ўўћћ§ћ§ћ§ћћ§њћћњћў§ћ§§ўўћњ§ў§ў§ў ўљ§ћ§ћ§ћ§§њћ§ћ§ћўў§јћ§ўўћ§ћўў§ћ§ћћћ§ў§ћўў§§ў§§§ў§ўў§ўўћ§§ќћ§ћ§§ўћ§ћћ§ўў§§ў§§ћў§ў§ћћўќ§ў§ўўў§ўўћў§ўўћћ§ўў§ў ўљ§ў§ўў§ўў§ьћ§ћ§ћ§ћ§ћ§ћњћ§ћ§ћ§ћўўј§ў§ў§ў§ўўј§ўћ§ћ§§ўўў§ўўў§ўўў§ўўїћ§ћњњћћ§ћћў§ўў§ћ§ћћ§ў§ўќћ§ћўў§ћў§ў§ўўю§ў§ў§ў§ў§њћњћў§ў§ўў§ћњ§ћ§§ў§§јўћў§ўћ§ўўљ§ћћњ§§ўў§ўћў ўј§ў§ў§ў§ўўє§ўћ§ћњњ§ў§ћ§§њўў§ў/ўњ§ўћў§ўўў§ў4ўћ§ўў§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ўqўќ§ў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўўў§ў ў§Mўў§ў5ўў§ў-ўў§ўўў§ўўўў§ўъўў§ў!ўќ§ў§ўўћћњћ§ў#ўќ§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўў§ў-ўў§ў€ўў§ўfўў§ўДўў§ўўў§ўўў§ўMўў§ўўў§ў ўў§ў-ўќ§ў§ўŒўў§ўўњ§ў§ў§ў3ўў§ўўќ§ў§ўўў§ўўќ§ў§ў ўў§ўўњ§ўћ§ћўўў§ўў§њћўћў§ўўў§ўў§§ў§§ўў§ўўў§ўў§њћ§§ў§ўў§ўў§ўўў§ўўў§ўўў§ўўў§ўўќ§ў§ў?ўў§ўўў§ўўў§ўўќ§ў§ў ўў§ўўќ§ў§ўўў§ўўћ§ћљњўўў§ўўќ§ў§ўўў§ў ўў§ўўћћјњ§ўўќ§ў§ў ўў§ў ўў§ўўћ§љћћўўќ§ў§ў ўў§ўўў§ўўў§ўўў§ўў§ўћўўї§ў§ў§ў§ў§§ўў§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўђ§ў§ў§ў§ў§ў§ў§ўўќ§ў§ўўў§ў ўќ§ў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўўў§ў&ў§§ў§ўўў§ўўј§ў§ў§ў§ўў§ћў§ў§ўўќ§ў§ўўћ§ўћў§§ўў§ўўў§ўўў§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ўўљ§ўў§ў§ўўў§ўўў§ўў§ќћў§ў ўќ§ў§ўўќ§ў§ўўќ§ўў§ўљњ§љ§ћўћћ§њћўўў§ў ўўћўўђњ§ўўћћўћ§§њ§§ўўўћўўўњў ўўћўўўћўў§ћ§ўўјћўћїїћњў ў§§њўўќћ§§ўўўћўўўћўўўћўўў§ўўњ§љјљљўўћўћўяћўћўћўћ§њљўўћўўћњњћ§ўўћўўћћўўћўўћўўћўўўћўўўћўўћћўўћўўўћўўўћўўћўќћ§ћўўњ§ўўћўўўћўўўћўўћўљћњћўў§ўўўћў ў§§ћўўњ§њљ§њ§§ўєћўћўўћњћўћў§§ћўђћўўћћўћўћћ§њњўў§њўћўўћўўўћўўўћўўќћўћўўќ§њ§ўўўћўўћўўћўўћћўўћў ўўћўўўњўўўћўўўћўўўћўўћўќћўћўўњћўўћў ўёћў§§ўўћљїїј§ўћў ўўћўўўћўў§ў§§ћўўўћўўўћўўўћўўўћ§§§њ§ў ўќћўћўўћўћћўўћўўўћўўћњћ ўўћўў§§ўњ§§ўўћўўњћўўњњўўўћўўўћўўћћїњњўў§ўєћўћ§ўўћћўўњ§§ўњћўћ§§ў ўўћўўєћўўћўўћўћўћўўњћўћћњўўћ ўўћў ўўњўўўћўўќћ§§ўўўћўўўћўўёћўўњўћўўћўўћњћўўњ§ўћўўћћўћњўњ§ћћўўћ§єљјњўњњўўћўћўўўћўўћў§§њўўўћўўљћњ§њ§њўўўћўўўћўў§њ§ўўќњћћўўћў§ўћў ўњ§њњ§љўў§ўћћњўњўўўћўўўћўўћќўњњ§§ћі§ћћљћљ§§ћўўњњљўўћўўћўўћўўўћўўёњ§ўўћўў§§љїљ§§ўўћўўћў ў§њљўўўћўў§ўќћ§§ўўљћўў§љњўўћќўћ§ўўўћўўўћўўћћњўћўўўћўўћўєњ§§њћў§њўўћўўћўљћўћўўћўўўћўўћћўўћўўўћўўњњ§ћћ§ўўћ ўћћўћћўўћўљњ§ўўћћўўўћў ўўћў ўћњўўћўў§њљўўўћў ўњњ§њўўћў!ўћњўўћўўћўњўўўћўўўћў ў§ћћљљћў ўћ ўўњўў§ћ§ўўїљ§њљ§љўў§§ќћўћўўљ§ўў§њ§ўўћўњћўўљ§ў ўўћўў§ќљ§ћўў§§њ§ў ў§ї§ўў§ўњў ўўћўў§њћў ўўњ§§ўўћўўўћўў§ўћўўўћўўћўў§§§ћ§ўўњћўћўћў ўўћўўўћўўћњ§њћўћўўљћўўћњ§ўўћўўћўўћўўћў ўўњўўњћ§њљљўў§њћўўћћў§§ўўўњўўўњўўўћў ўўћўўўћўўћўјњ§§љўўљ§§ўќћ§ћўўўћўўѕћўћћўўњўўћўўћўўћўўўћўўјћўўњћўћўўўћўўўћўўћўўћўўўћўўљ§њњўўћўўўћўў§ўўњњћћўўћўўўћўўќ§њњўўўћўўњћўўњ§ў ўўћўўў§ўўђ§љњћ§§ћћўћўўћўўўћўўўћўўќћў§ўўўњўўўћўўћ§њўћўў§ўўћўўўћўўќћўћўўј§ћўўћўћўўћћјћћўўњ§љћљћўўћўўћўўўћўўћњўћћўўўћўўћ ўћњўўћўўўћўўћћўў§ўўўћў ўћўјћњў§§љњўўўћў ўўћўўќћўћўўўћўўїћўўћўўњ§ўўќ§љ§ўўќњўў§§ћњўўћўўўћўўўћўўўћўўўћўўљ§љљўњјўўњћўљ§њўўўћўўўћўўў§њњўћўўўћўўўћўўєћўћћњ§ўћћўћў ўўћўў§єњўўћ§њњ§ўўњўўљўћўўїћўўћўўћћўўўћўўўћўўўћўў§њњ§љ§њћўў§љњўўќћўћў ўўћўўћўўћўўў§ўўћћўўћў ўћўїћњњўњњћћўўћћўћћўўўћўўўћўўћўѕњѕњўћўњ§ўћўў№љњјј§њљ§§њўўћўњ§§ўўћўўўћўў§§њўўўћўўќћ§§ўўћћў§§ўў§§њўўўћўўќћўў§§ўўћўўўћў ўћњ§њњўўўћўўўћўўћћўўћў ўћўћўўћўўћ§њ§њў ўўћў ўўћўўўћўўў§ўў§ћњўў§ћў§§љњўўћћўћћўўћў ў§ўњ§§њ§§ўќњ§§ўўўћўў§љў§ўўћў§§ћњ§ћ§ўўўћўў§њћўўў§ўўє§њ§§њљ§§ўњћўўђ§ћўћў§љ§њ§њњўћћўћ§њ§§ўўўћўў§ћњў ўќћўћўў§ћњ§§ћўў§§њ§ўўћќўћњ§§ўњўў§њћўўј§њљљјљћ§§§њ§ўў§њњ§њ§њўўљ§њ§њўћў ўї§ћњ§њ§јћўў§ўњ§§ўњ§§ўњћљў§§ўўўћўўўћњњўћўўћњћўўћћўљ §ўљ§§ўњє§њњ§ћњўў§§њўўўћўўўћўў§ћљюјњњјјћћ§њњўў§§ў§§љљћљњњўўћћ§§ў§ўўћўўњћўћ§њўўїћўўћ§§љћ§§љќћ§§ўўљ§ўћўњњ§§ќњ§§ўў§§ћўўјљњњўў§њ§§§њ§ўўћљўћћўў§ўўѕ§њ§§ўћўўћћўўўћўў§њљ§§§њ§ўўю§ћјњљњњ§њїњљ§ўў§њўўіћњњ§њў§§њ§§ўўњўў§єљћїљљњњ§§ўћўўј§ћљњ§њ§ћћў§љњ§§ћ§ћ§§њљљўњ§§ў§њњ§њ§љјћћѓљћјљћњ§§љјјљњњўќљњњўўњ§ѕњ§њ§§љљњ§њ§§ўћўў§ўљ§§њњљњ§њ§ў§§ўћћ§ў§ўўќ§ў§ўўњ§ў§§ћўўњ§ћ§ћ§ўўќ§ў§ўўў§ўўў§ў ўљ§ў§ў§ў§§§ў§ў ўі§ў§ў§ў§ў§ўў§ўљ§ћљљњ§ўў§ў§§ћўўќ§ў§ўўў§ўўў§ўўў§ўўў§ўў§ўљ§ћњћў§ў ўў§ўў§§ў§ўў§ўў§ўў§ўќ§ў§ўў§ўў§ўўў§ўўќ§ў§ўўќ§ў§ўўћ§ўў§ўў§јћў§ў§ў§ўўў§ў ўў§ў ўќ§ў§ўўј§ў§ў§ўћўўњ§ўћ§ў§§јћ§§ў§ў§ўўќ§ў§ўўјћ§ћ§ўў§ўўў§ўўў§ўў§ћ§ўў§ћќ§ў§ўўў§ўўќ§ў§ў ўќћ§ћўў§ўў§ўўў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўў§ўўќ§ў§ўўў§ўўў§ўўћ§ў§ў§§ў§ўќ§ў§ўў§іћў§ў§ћњ§ћўўќ§ў§ўўў§ўўў§ўў§ћў§ўўќ§ўћўўљ§ўў§ћћ§§ўў§ўўў§ўўў§ўўў§ўўќ§ў§ўўў§ўў§ўў§ўў§ўћ§§ћў§ўўў§ўў§§ў§ў ўў§ўў§ўќ§ћ§ўўќћў§ўў§іћ§ћў§ў§ў§ўўћўќ§ў§ўўў§ўўў§ўўњ§ў§ў§ў ўў§ўўў§ўўњ§ў§ў§ўўј§ўў§ћў§ўўў§ў ў§ўќ§ў§ўў§§ў§ў ў§ўў§ўўћ§ўў§§ўў§ў ўў§ўўў§ўўќћ§§ўўњ§ў§ў§ўўў§ўў§§ћ§ў ўќ§ћ§ўўў§ўўј§ўў§ћў§ўўі§ў§ў§ћ§§ћўўє§ў§ўћ§ўў§ў§ў ўў§ўўњ§ў§ў§ўўў§ў ў§ћўї§њњћњћ§ћўўњ§ў§§ћў ўў§ўўў§ўўў§ў ўў§ўў§§ћўў§ћ§§ў§ўўў§ўўќ§ў§ўўў§ўўќ§ў§ўўј§ў§ў§ў§ўў§§ћўўђ§ўћ§§ў§ў§ўћў§ўўў§ўў§ўў§ўўў§ўўњ§ў§ў§ўўў§ўўѕ§ў§§ћ§ўўћ§ўўў§ўўў§ўўў§ўўќ§ў§ўўј§ў§§ўўћўўў§ўўў§ўўў§ўўў§ўўќ§ў§ўў§§ћўўў§ўўј§ў§ў§ў§ўўў§ўўў§ўўњ§ўў§ћўўў§ўўў§ўў§ћў§ў§ўўњ§ў§ў§ўў§§ў§§ў§§ў§ўўў§ўўў§ўўњ§ў§ў§ўўљ§ў§ў§§ћћ§њћўўў§ўўў§ўўўћўўђћ§§ћ§ўў§ћ§ћў§ўў§ћўћ§ћўўў§ўўј§ўћў§ў§ўўњ§ў§ў§ўўћ§ў§ўўћ§§ў§ў ўўћўўў§ўўј§ў§ўћ§§ўўў§ўўњ§ў§ў§ўўј§ў§ў§ў§ўўљ§ћ§ћў§ўўњ§ў§ў§ў ўњ§ўў§ћўўў§ўўў§ўўў§ўўјћ§ћњћў§ўўў§ўўј§ў§ў§ў§ўў§ћ§ўўў§ўўј§ў§§ўў§ўўў§ў ўў§ўўў§ўўў§ўўў§ўўў§ўўѕ§ўћ§ўў§ў§§ўўќћ§§ўўў§ўўњ§ў§ў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўњ§ў§§ћўўљ§ћ§ћ§ћўўў§ўўў§ў ўў§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ў ўў§ўўј§ў§ў§ў§ўўќ§ў§ўў§ўў§ўўў§ўўў§ў ўў§ўўў§ўўўћ§§ ўіћ§§ў§ў§ў§ўўј§ў§ў§ћ§ўўў§ўўў§ўўј§ўћў§ўћўўјћ§ўў§ў§ўўњ§ў§ў§ўўў§ўўў§ў ўў§ўўў§ўўў§ўўў§ўўў§ўў§ўј§ўћ§ћў§ўўњ§ў§ў§ў ўў§ўўў§ўўќ§ў§ўўђ§ў§ў§§њў§ў§ў§ў ўѕ§ћњўў§ў§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўј§ў§ў§ў§ўўќ§ў§ўўў§ўўі§ў§ў§ў§ў§ўўќ§ў§ўўў§ўўњ§ў§ўћўўѕ§ћћ§§ўў§ў§ўўњ§ў§ў§ўўў§ў ўў§ўўў§ўў§ћћў§ў§§ўў§§љўћ§ћ§§ўўќ§ў§ўўў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўћ§ў§ў§§ўў§§§ў§ў ў§§ў§ўўћ§ў§§ў ўўћ§§ўў§ўўў§ўўќ§ў§ўў§ ўј§ў§ў§ў§ўў§њћ§§ўў§§§ћў§§ўќ§ў§ўўў§ў ў§§ў§§ћў§ўўњ§ў§ў§ўўі§ў§ў§ў§ў§ўўў§ўўј§ў§ў§ў§ў ўў§ўўћ§ў§§ўўў§ў ўў§ўўќ§ў§ўўќ§ў§ўў§ў§ћ§ўўц§ў§ћљњћ§§ўћћ§ў§ў§§ћ§ћ§ўў§ўўт§ў§ў§ў§ў§ўћ§§ў§ў§ў§ў§ў§ўћ§§ў§ўў§ћћў§ў§§ўў§ўўў§ўў§іћ§ћћ§ў§ў§ўўѕ§ўў§ў§ў§ў§ўў§ќћ§§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ўў§ ўј§ў§ў§ў§ў ўјћ§ћ§§ў§ўўў§ўўў§ўўў§ўўќ§ў§ўўљ§ў§ў§ў§§їў§ў§њ§ў§ўў§њћ§§ў§ўўў§ўўў§ўўц§ћћ§ћў§ў§ў§ћ§§ћ§§ў§ў§ћћў§ўўц§ў§§ћћ§ўћў§ў§§ћ§ћ§ћњћ§§ў§ўўў§ўўќ§ў§ўўѓћў§§ћ§ћ§§ўћ§ўўќ§ўћўў§ћў§§ћ§§ўє§ў§ћ§§ћў§ў§ўўњ§ўў§§ўўќ§ў§ўўќ§ў§ўўњ§ў§ўћ§§іћў§ў§§ћ§ћў ўј§ў§§ћ§§ўўў§ўў§ћўњћћў§ћћћ§ћ§§ўўё§ўћ§ћ§ћ§ћ§§ў§ў§§§ћ§ў ўў§ўўћ§ўћњ§§ўў§ўўђ§ўћћ§§ћ§ћ§ћ§ћўў§ўќћ§§ўўў§ў ў§ўў§ўўћћ§ћ§ћћј§ћ§ћ§ћўћћў§єћў§ў§§ћ§§ў§ў ў§хћ§ћ§ћћњћћњљљњњјњћ§§ў§§ћўћ§ћћњћ№§ў§ўў§ћ§ћў§ўћ§§ўўў§ўў§ў§ћ§ћћў§ћћљњ§ћў§ў§§ўў§§іћ§ћ§ћ§§ў§ўў§§њўў§§ў§§їўћ§ћ§ћ§ћўўў§ўўў§ўў§ў§ўћўў§ћў§ћ§ћћљ§ћў§ў§ўў§њјљћ§§ћ§ў§§ќўћ§ўў§№ћў§§ћ§ћ§ћ§ћ§§ў§ўў§ћјљјјњљ§ћўў§їўћњћ§ћ§ћўўў§ўў§ѓћ§ћћњ§ћ§ўўћ§ћћї§ћ§ћћ§ўћ§§ђћ§њћњћћњњћњ§ћ§§ўў§§ў§ўў§§ћј§ћ§ћ§ўў§§њћ§ўў§ўўјћ§ћ§ћ§ћ§§§ћ§ћўў§ў!ўў§ўўў§ўўў§ўAўў§ўўўћ§§ ўў§ўўў§ўўў§ўў§ќћ§§ўўќ§ў§ўўќ§ў§ўAўў§ўўќ§ў§ў=ўњ§ў§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўMўќ§ў§ўўў§ўўќћў§ўўў§ўўў§ўўў§ў1ўў§ўўњ§ў§ў§ўўў§ўўў§ўўќ§ў§ў ўў§ў]ўў§ў/ўў§ў ўў§ў ўў§ў?ўў§ў'ўў§ў ўќ§ў§ўўў§ў)ўў§ўўј§ў§ў§ў§ў;ўј§ў§ћ§ў§ў1ўў§ўўў§ўўў§ў#ўќ§ў§ўўў§ў3ўў§ўQўў§ўўў§ўKўў§ўў§'ўќ§ў§ўўќ§ў§ўўў§ў'ўў§ў ўў§ў ўў§ўўў§ў#ўќ§ў§ўўў§ў#ўќ§ў§ў7ўў§ўCўў§ўўў§ўўў§ў/ўќ§ў§ўўњ§ў§ў§ўўў§ў{ўў§ў/ўќ§ў§ўCўў§ўEўў§ў ўў§ў7ў§ўќ§ў§ўœўў§ў3ўќ§ў§ўўў§ўўќ§ў§ў5ўќ§ў§ў ўў§ўўў§ў5ўў§ўўќ§ў§ўўў§ўўў§ў,ў§ўў§ўVўў§ў)ўў§ўўј§ўћў§ў§ўўў§ўўў§ў ўў§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўMўў§ў)ўў§ўўў§ўўќ§ў§ўўў§ўўќ§ў§ўўћ§ўў§ўўј§ў§ў§ў§ўўў§ўўў§ў ўќ§ў§ўўў§ўўў§ў ўў§ўўќ§ў§ўўќ§ў§ў ўќ§ў§ў ўі§ўћўћўћў§ў ўј§ў§ў§ў§ўўў§ўўњ§ў§ў§ў ўќ§ў§ўўў§ўўў§ў)ўќ§ў§ўўј§ў§ў§ў§ўўќ§ў§ўўќ§ў§ў ўь§ў§ў§ўћ§ћ§ћўћўћў§ў§ўўў§ўў§њћ§§ў§ўўќ§ў§ўўў§ўўў§ў ў§љћў§ўћў§§ўў§ўўј§ў§ў§ў§ўўў§ў ўў§ўўњ§ў§ў§ў ўў§ўўќ§ў§ўўњ§ў§ў§ў ўі§ўћў§ў§ў§ўўў§ўўў§ўўі§ў§ў§ў§ў§ўўњ§ўў§ћњњ§ћ§ўўњ§ў§ў§ў ўі§ў§ўћ§§ў§ўў§ћў§ў§ўўљ§ў§ў§ў§§љћ§ћ§§ў§§ќў§ў§§§ў§ўўќ§ў§ўўќ§ў§ўўє§ў§ў§ў§ў§ў§ўў§ћў§ў§ўўў§ўэњћљїљћјјїїјѕњ§ўћўћўўћ§њ§§љљўњўўѕћ§§њўўћћўћўў§ўћўўћњѓ§ћўўћў§§ћўњ§ћћљўћ§§љыјћљ§§ў§§љњўў§§њњљњўћўў§ќњћћўўўћўўўћўўќњ§њ§§њ§ўњ§§њі§њ§ўў§њ§§ўўўћўўў§ўўўњўўў§ўўњњ§ћўўћћўћњњљћ§§ўўќћўўћћћўћњ§ўўыњ§ўўњњ§§ўў§ўўћ§§њњ§§јјўљўўўњўў§ўњўў§ўўњ§§њўї§љљћњћљћ§§њћљњјјњњћўўўћўўњўўћўў§ўњ§§љїїљћњћњ§ўў§§єћјјљљћљљњ§њўўў§ўўўњ§§њў§ўўўћўўћўў§§ћњ§ўћ§§§њљўў§ћ§ўў§§њўўў§ўўўћў ўћ§ўћўўћўќњћњ§§љњћўћ§њўўћїўћўћўўћњўў§ ўўћўўљ§љ§§њ§ўўћѕўћњ§§ўњљњњ§§њў§ўўњўћћўўћўў§§њўў§њ§ўўњ§іћўў§њћ§њњ§§јљўўћўў§њњ§љјљљўњ ўљћ§ћўўћўў§љ№§ўўњ§ў§њ§ћ§§ўўћўўєљњњ§ў§њ§§јњ§§њў§ћњ§њ§ўўћ§ќљњїћћњљћјљћ§§њ§њњљњњћўўўћўўўћњњљўњў§њ§ўў§љўњ§§њў§§ўњ§ћњљњњўўёћў§њ§ћљњўћўћћњўўўћўў§ўњљўћўў§§ўў§ћћќњ§§њњўіћњ§ў§љћўћўўѕњљјјњ§њљњћўў§њ§ўўўћўўњћњўљ§§ћјјљћћњ§њў ўўћўўўћўўўћўўўћўўњэўћўњћўўћћ§§ћїѕ§ћўћ§§њ§ќћљ§ўўєњћњѕјњћўў§њўўќ§љњўўћўўћўўѕћўћўў§ћѕ§§ўў§јћјїїјћ§ўўјћњѕј§ўћњњфјљњљљњ§ўўћўљ§ўўћўў§њўўњњ§ўў§§ћјљ§ћўўњћњњ§ў§§ў§єњћўў§§њљ§§ћљљђѕ§њњ§ћўћ§§јўў§§ћўўћўўњќў§§ћћљњћњљћ§њњўћўўўњўў§ћњўў§ќњ§њ§§ ўє§њњ§ў§ћљљћћ§§ ўўћўў§ќћўћўўўћјјњљ§§ћћўўў§ўў§ўђњўў§ћўћўў§љћў§§§ћў§§њќ§њљўўўћўўњћўўћћўўќњў§њњњћ§њўњ§§ў§ѕў§љњўўњ§љњ§§§ўћўўќћўў§§ќњ§ћўў§љћўў§§њ§§ћїўћћўў№§њћљјњћјѕїњћ§њ§ћћј§§ў§њњцћјљјћјћ§§ў§њљ§љњў§§њ§§ўўћ§§ў§ћњ§§њњљљћљћћђ§њњљћћљ§§ўў§§ўўћњ§§њўў§ї§њњў§ў ўќћўћўўўћўўќњ§ћўўѓ§њњјћњ§ў§њ§ћўўњђ§ў§ћћўћћ§§њљ§ўўљћўћћўў§§ўјњљњ§њ§§ў ў§љћўў§јњ§њўћўћўўў§ўўўћўўћў§ўўњѕ§њњћћўњњ§§ћћ№њћўћў§љњњўўћўўћўў§ўўћўўњћ§њ§ћўўќњ§ў§§ўјћў§§ћ§њўў§ёњўћўў§§ўћўњ§љњўўѕћўўњњўўћњњўўћћўўћўўўћўўњћ§њљћўўѕћњ§ћњљ§§љћ§§ўўћўўѕћњљњњ§њўћћўўћўњ§ўћўђћўўћњ§њ§§ћљљ§ўўўћўўўћўўћћўўћўўўћўўёњ§њљћўўћћ§§њњћўўѕ§љ§њ§ўўћўћў ўўћўўўћўўњѓћ§њњћњ§њ§ўўћўўўћўўўћўўљћўћўћћўўќњћњўўєћ§њјљ§ў§§ћ§ўўїћњћјњ§§њў ўўћўўўћўў§ќњ§њ§§њњўћўўњњ§њњ§њ§њћўўњњўћњљ§§§њ§ўўћўњћўўћћўў§ќћљїњњў§ўўўњ§§ўњ§§ћљћјћ§§ћњљ§ћўўњ§ћћўћњљўў§§ћў ўљћў§ћўћњњћўћђ§љњњїјћ§§њ§њ§ўўќћњ§ўўўћўўюћўў§њњўћўљњњўў§њњўўљ§ѓўћњ§њњ§§ћљћљ§§ћјњћ§ўўўћўўўћўў§ўњ§§щњў§њ§§њ§§љ§§ўћњћўў§њ§њћћ§їњ§ўў§њ§§ўўўћўўўћўў§њїћў§§ўўћћўўќњ§ћўўћћўћћўў№§њљјћљўўћўў§љњћўўўћўўјћўўњ§ўў§§њћљјћћљљў§њњў§ўўјњљ§ўўћњ§§њћњљїєѕѕ§њ§ўўіћўўћњњћњњ§§ўї§§јњ§§ў§њњ§§ўїўўєњ§њћ§ћ§§ћјєђђќєїјў ўќњ§њћћљљћ§§ўўћ§§њњ§њўћўў§њ§љљўњ§§єўњњ§§ћћјєєюђђѓ§љњўўўћўўї§ћћњ§љ§§ўў§ћўњњї§њ§§њ§ўћўў§іћљњ§§љ§њљјјїїѕєѓђѓђѕєўўўћўўўћ§§ўќћўћўўћўўњњтћ§њ§§ћўљ§ћ§§љїѕѓєѕѕєєђђѓѓђђћњћћўўћўўўћўўѕњ§§ћљњ§§њњ§§ћўћњ§љљпјїѕѕѓђђёєѕєѓєђяяыяђўћћўњњўў§§ћўўћћ ўњѓјљјљј§љњљњ§ў§§јћїєёэёєїї§јѓђђћїћњњљљ§љњћ§§ўћ§§њ§ў§йљћљњљјћјљљјњјїєїєяьэёѓєєѕѕяѓћљ§нћў§љћћњњ§ќљ§§ўў§њ§ўўњю§ўў§њњљћљљћљћљїїєѕѕчѓђѓѕїѕїѓїјёѕмЃaћў§ћћ§њљ§ўўўњ§§ў§њя§љљјњњ§§њњ§љјєѓёѓѓ№єѓєяёёћёžˆoT`њљ§§ћњ§§њљљ§§ў§§ѕўћњљљјљњњ§ўўѓњљљћњћњїѕѓёђѓѓѕѓєѕїћћЅQOOQ^ћўўћўјћ§§њ§њ§ўўўћўўћњ§§њ§§кљћ§§јїѕєђёђєєѓђёѓљїэпа—J@hN?Yћўњ§њ§њњўўыћўўњ§§ўћњњўћўўћњљјїћ§§њњљјєѓєѓѓьѕїѕѓѕљњєШdPaQJTNI@ўћћўў§њњыў§њ§ћјљњњћўўћњњљјћљћљљѓ§њљїєёэёѕѓђёѓѓюѕяэОЁge[ZYTYHL§§ўў§јњ§§њ§љљ§§бћўў§§ћјћљјјћљ§ћѕєђђяђїѓёєѕєњћх”Z\ZTPLVZVTMCўњњўў№ћњў§њњ§§њ§§ћљљћљљњћљљјјїїмјєёююђєѕєѓѕ§љдЈnLEANILLPVNHGGўўћћљњў ў§љвїјјњјјљћ§јљјєђёђђёюђєѓјїњёК„TFPEOQQPTNQSVSPўћўўћўѓћ§§њ§њўўћўћўњњд§њњћљћѓјљѓёэяюђєѕѓђћѕЩ|PCLM^PNMOPPLSSPPTњњ§њњўњ§ѕћљјћћњ§ћўљ§§ќњјљјјўїђђтєѕѕј§ѕЪnLCUIPMBMLSVMILIFHHVehњњћљљљњљњњћњћћъњ§ћћўўћ§ў§ћњјѕѓєёюѓѕљўўољЦoCIZ`ZYZQW`cZSNOPNT^dњљћћ§ћњљњћ§§Чћў§ў§ў§§ћњњ§ћћњљїђыьыяєѕњўђТƒqdMV\ZWJJLMTYTZ\[]\TWPћњћћ§ћћ§ўћ§§Юў§ћћњћњћљљјјѕђьчщяѓўўњЋVJghNUWPJHCFJMPMQUPTQOOPњњћћјњћ§§ћ§§ћћО§ћћњћњњјѕєєѓђяюяїўўщJZkzd[UOLJPNNJOQPQQUQJFLQћћў§ў§§ћ§њћ§ћњ§ћ§ћ§ћћњвјєёђѓђђєїўљМkHJJHSTTUQNOZVLQTQPOUWTPHGF§§ў§§њћћњќљњњљљжњљљїѓьяёѓјўўа˜x]QQh\[VPVSAdaVNNQSUNLIUUMOWє§ў§ўћ§§ўњ§ћў ўј§ў§ў§ў§ўўќ§ў§ўўќ§ў§ўўў§ўў§ѕћ§§ўћў§ў§ў§§їў§ў§ў§ў§ўўў§ў ўњ§ў§ў§ўўъ§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўўќ§ў§ў'ў§ўў§ўўќ§ў§ўўў§ўўњ§ўћўћў ўќ§ў§ўўќ§ў§ўўњ§ў§ў§ўў§ў§њў§ў§§ћћ ўў§ў ўњ§ў§ў§ўўђ§ў§ў§ўћўћў§ў§ўў§§ћў§§§ў§ў ўњ§ў§ў§ўўў§ўўќ§ў§ў ўў§ўўў§ўўќ§ў§ўўў§ўўў§ўўњ§ў§ў§ў ўў§ўўў§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ў ўј§ў§ў§ў§ўўў§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ўўў§ў ў§їћўћ§§ў§ћ§§ёў§ў§ў§ў§ў§ў§ў§ў ўў§ў ўќ§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўўќ§ў§ўўјћ§ћ§§ў§ўўў§ўў§ ўў§ўўў§ўўє§ў§ўћўћ§§ў§ў3ўљ§ў§ў§§ўўў§ўўќ§ўћўўњ§ў§ў§ў ўў§ўў§ўў§ўўі§ў§§ћўњўћўўќ§ў§ўўі§ў§ў§ў§ў§ўўў§ўўў§ўўњ§ў§ў§ў ўќ§ў§ўўњ§ў§ўў§§ўў§ўўў§ўўў§ў ўј§ў§ўћ§ћ§§§ўћўўў§ўўў§ўўњ§ў§§ћ§§§ў§ўў§§ў§ўўў§ўўі§ў§ў§ў§ў§ў ўў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўў§ўќ§ў§ўўў§ўўј§ў§ў§ў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ўў§їўћ§ћ§њћћўў§љћў§ў§ў§§ў§§ў§§љў§ў§ў§ўўў§ўўў§ўўќ§ў§ўўі§ў§ў§§ћ§ћўўћ§ў§§ўўў§ўўў§ўўў§ўўў§ўўў§ўўў§ўўј§ў§ў§ў§ўўў§ўўќ§ў§ўўў§ўўњ§ў§ў§ў#ўќ§ў§ўўћ§ћ§§ўўў§ў ўў§ў ўќ§ў§ўў§ўќ§ў§ўўў§ўўў§ўўў§ўўў§ўўќ§ў§ўўў§ўўў§ў ўќ§ў§ўўњ§ў§ў§ў'ўў§ўўў§ў ўќ§ў§ў1ўў§ўўў§ўўќ§ў§ў/ўў§ўў§ўў§ўўў§ўўќ§ў§ўўј§ў§ў§ў§ўў§ўў§ўўќ§ў§ўў§ќћўћўў§ўў§ўўў§ўўў§ўўў§ў ўє§ўћ§ћ§§ў§ў§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўј§ўћ§ћ§§ўўќћўћўўў§ўўќ§ў§ўўў§ўўў§ўўњ§ў§ў§ўў§§ў§§§ў§ўўў§ўўў§ўўў§ўў§§ўћћў§ўўў§ўўћ§ў§ў§§ќў§§ў ў§ўѓ§ў§ў§ћњ§ћћљћўўўћўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўѓ§ў§§ћњјјљњјћў ўљ§ў§§ћў§§ўќ§ў§ўў§ћў§ў§ўўљ§ў§ўљњјјљ ў§њћўў§§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўљ§ў§ў§ўћћіњљњїјљћљњўўў§ўўј§ў§ў§ў§ўўя§ўћў§§њћњњљћњњљјљљўњўўє§ў§§ўў§ў§ў§ўўў§ўўч§ў§§ћўњћћњјњјњљћјњјљѕњїјўўў§ўўљ§ў§ћћ§ўў§§ў§§№љјїјїњњ§њћљњѕј§ўўї§ў§ў§ў§ў§§§ў§ўўў§ўў§§ў§§јў§ў§ў§§ћћђ§љљјєєљјћљћљљўўѕєўў§ў§ў§ў§ўўњ§ў§ў§ўўў§ўўј§ў§ў§§ћ§§шўњћљћљћјљљ§љњї§ў§ўѕЖ‚ўў§§ўў§ўўў§ўўј§ў§ў§ў§ўўї§ћћљњїњљњњљ№њўўЕœ‰k|ўў§ў§ў§ўўі§ў§ў§ў§ў§ўўј§ўћ§ўў§ўў§іћўћћњћїїѕљљћћљњћўўљЗcdet{ўўќ§ў§ўўэ§ў§ў§ў§ўў§§ў§ўњћћљјјщњљњјљўўљэщЎ\\|eVpўў§ў§ў ўў§ў ўя§ўћў§ў§ў§§ћњљњјњљљћњљћћўўѕй}g{j^kd\Yў ўњћў§ў§ўў§ўў§§эўћў§ўћўјљїљїљјњїљњўўѓШКЊˆ‚|xtmmjeўўє§ў§ў§ў§ў§ў§ўўі§ў§§ћўћўћ§§јљњјњјљјњњў§ўўюяЅjvvtoenzpmcdўў§ў ўі§ў§ў§§ћ§ћ§§эў§ў§ћњ§њљјљєљјњљњљўўяцМ|b\\mememzmmcgўў§щўћўћўћ§§ў§ўњњјљјјїјјњјўўюЪh[o^ehnmejtvrnoў ўў§ўўћ§ў§ў§§ићўљљїљїњїњљљћўўс˜e^bg…mjjmooiojnhk§ў§ў§ўў§§ў§§ўћ§§ўў§ўўЫ§ћћўњћјјљњљћ§ўўл\PgeW`dggkcbe^^di||§ўћ§њ§њ§ћўћћ§§ћў§§ўё§ў§ўњћљњјєѕїј§ўўмЫ|S\e{zmppnvtoknhdknx~ћўћў§§ћўњ§§ў§ўў§ѕўњњѕїяїѓјїўўдЭ‹~{amtum^c\`gmooqkumijq§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўўёћ§ћћњћљљѕѓђђѓјўўжЛd]{u`bhkj`daZ^bbnmiihijk§§ўў§ў§ў§ў§ў§§ћў§§гў§ўћћїјјњѕїѕїњўўјžZkƒ…pmkcbc`a`V]dehohd^abk§ўўњ§ў§§ћ§§ў§ћјкѕљѕјѕ§ўўШ|[WT[jgegjbgjdh`dccjgnth[^c§ўўє§ўћўћ§§ўћўњћћ§јљћјѓяјїўўтлЈ‡tgq|ojiikdQ}tgc^[gdc]dhojjn ў€;wўџ:ўwџџ8wџ7ў€џџ4wџ3ўwџ џ0w џ/ў€џ џ-wџ+wџ)wџ(ў€џџ'ўwџџ%wџ#wџ#џ#џ"ўwџџћ§ўє§њ§њњўў§њњљћћўљ§§ўњћћ§ў§ў§§ћјјјїјљ§њ§§ўўљ§ћњћў§ўўћў§єњўў§њ§љјћ§ї§§ќњ§§ўўќ§љљћћ§ў§ћњћћў§§§ўћўўўћўўњ§ўў§њўў§ќњўў§§ќљ§§ўўњљ§§ћ§§јўљљњўћў§§њўћєўћћў§њњћў§њ§§§њћ§§ћљњ§љњ§њ§њњ§§ћѕјљљњљ§§ўћћўўіћўўњ§§њњ§ўўўњ§§љў§њљљћљљѕјћљ§ћ§§њћњ§§єњ§§љћљљјјљњ§§њ§ѓњ§ў§§ћљћљ§њњўўў§њњў§ўў§ўњ§§ўјњў§њљћћњњўћўўўњўў§§њ§ўўњњљљјј§§ћњљ§ћњњў§ўўю§њњљјћћљјљљћљћ§§њ§§§ћљ§§ќљјњ§§ѕўњњ§њљљћћў§§ўњћўў§ћљљўњўўњћ§§њњљљћї§љјљљб§ўњ§§ўњ§њљћјјљљњ§§ўўћў§§њ§њ§њ§њ§ћўўћў§љ§њ§§ў§њ§§єљ§њљћўў§њћў§§њњ§њ§ћўўэљ§§ћј§њ§њљћћўўћњњћўўњ§ўђ§љњћљљњ§њ§њљљ§§ўњ§§яћјјљћљјјњћњњ§љ§ў§§њ§§њ§§јўћћў§§ћњњљў§ўћћњ§§ўќћњњўў§§њ§§эњ§љјњћћљїїћњўўћњ§њ§§ўњ§§ўњљљш§њ§§ўњ§њ§ўў§§њњ§њ§§њ§ћћљљўњјјњюљјљљћљћљј§ћћўћўўњўўјћўўњњ§§њњўіњ§њ§§њјћ§ўў§јљїјњћљћјјњљїїњљїїщѕђјћћНўўћў§§њўўћўћўўћ§ўўћўў§§яљ§љњћ§§љ§њ§§њњ§њ§§ъљћљјњћљј§ў§ЭМЂ\ўўћўўћўўўћўўўњўўњ§єљјїћћєѕјњћњўўшћ§њњ§§љјњјљњћљ§ћћљЖ{IJNўўћўўњњќ§њ§љљљћ§њ§§њ§§яљ§њћљјњјћљћљјљњјљљјўєјјўћ§§гыОuI`x\?ўћ§љїљ§§ѕљњўўњњљљњ§њ§§њћјљљјљ§њњјїѕїјјљў§љљхѕјѓћћюЮ’a^gT^]`Pљћљљћ§§њ§§ўўђ§њњ§ћљљћћљјњјљљќћљљјјљрћњ§њ§њћљњјљљк—]FCg„tkjV8ў§ўњњ§§њњъ§ћ§§ћљ§§ћљњ§њљћћљјћјћљљ§јњјјЭћјњјљ§§ллЦ~gPSYWTUH89Hњўўњњљњ§§њћўњљњјњїјљћљњњ§§љћ§§њљћљјљјјуњјїјљїьм”NUUQhgVYUeC12Aўћўўћўўћњ§§ћ§§ўњ§§љбњ§§њћћљњњљљњїѕїћ§§ѓдДo@:FTFB>@>>FHBNpўћўў§§љљњ§§ќњ§§њњ§ўњ§§ћћљћљњњђѕєјћћїеŸ`Y\?POOѕQONMOSIGP\ўў§ђљјљљћ§љћјћљљњ§§жњ§љњ§§љљњјїєѕј§ьБ‰d:WJQ:MOPMBGLMZ\UQSU§§їњњї§њњљ§§њ§љљ§ћњ§§њжљїїњљћљїѕђѓјјѓтЖ„L7@P^PLEMMIP[SNJNUTNNO§ћўў§§њ§§§љ§ўўўњ§§ћћљѕљјјиїєјїѓыТ[TNCSSQHIGOLJMQNTTLJ:?EIўњћњњљћ§§іљћљћљљњњљ§§ањћћ§ћјћ§§ѕспЊmLILWY``TIHGLMNNWPNOJG5@II§ўћњ§§ћ§њњћљ§њ§њњЧ§њћљљјїћњљєѕєыёР”YCJ@GFM284?GHHEF@JO§љјљљћњ§ћћўўЭњћљ§њ§љјјњјњїћјчшуЋiJELjmUIC9@ZONH?><5(%.8>@EIJPHAJPH8GIIJHCHFCEGAIJSOLљћћўўћўўўћўўлњјїѕєѕѓћ§ћнЖvmNQ\d\USQLNG@CFJIQQPPLIJJєIBCEFEQTSJPћћ§љћљљ§љњтѕѓёэёјћѓЖ`F::NTY`QUQPMMTTNIFNQQэNHFBG@74AHGAPQV\dљћћќљћљћћУјїљєїёѓ§ўћёг|IWVTNQYMBMCMJU[NIGEIHIQJC>A<5.;<@PNSWVbdћљњљћљјїїќјѕѕєєЫѓя§§У‡QCFVWTJY^Z5>@?>EJOMHMHMJMIF??89@:79BM]TLOVљљћћљљЦњїљѕєєѓѓёє§јФjYLH4JA:AIUJ3?AJJOPUUTJNTљљњњїєѕєђђтѕєјёеЋeI@GSIG5GH8ECFAIFIE?OJF@@ыC@?BABC<<@I\VMOt„qQCC;AJTљјјТїѕэюыюћ§жСФ‹VOE[VSLIBBHLG>GCE>:?G9?F>O‚БДƒI9-(B3?GNQ[[WNOV`bUMF:4C`OBEau‰„z˜‡C49:98;-7::CAPVWћр‚j`…iANQJIOZYZVQT@ENUQIMHTa`ZZTO>5:AYeo‚„›˜c#@55@:@CHAGMOJMPЕ{e``BO`WOJHFFGL>W^WMMUNNMPYddNFPU;PЋœmtŠžŽ}U?"&7;88?AJEBMJHNOooUUC7CB>EMGF@EGdTTWZVSGJSTWSQPEYTNˆпшЌ…‚p‚gMMBC3>JJC<52?B>C@AAEB@0@BLhS7*-7GPUYPOMMOE@GLNS[`\TQLICOQAZ‹ˆˆ‡tt‹~F!*8.22;BBHE>5>CB;3@JNPNJGAGFNGH?BGBBF;GEHHLS\WQFFQm’|toopxpjQ:%$1.223.AMMJI<:5AICBGFG?C;NLGHJJCBEHPTMGHJHMV\YMVaq‰”{{ncL~H(%))€д-5885:GILLHHF@GIJCCIhtLPLQJQOPB7LJNHPQTQZWJ9@aЎеЧœvjWek[[8&AE;5&2;CBBCBFGCHNNGJE@C?MLMIIMQTVI<48@AIINSUQYcB9IŽ–’‰™‘k\dZ8*%F?804>>BBI@9:@@GGJEMNMQ^ULJg”ОЄƒ‹ˆ‚‘{woPM.<9>A:;<AGOQOMJLNU?Aw‹’Ћ”~ƒ}r‹}|nB!)01@GOJCBGLL€ћTMLHMMP5<`joSNOWYULOLLPTUTUUMUVG„Џž’–ˆ|zp`2%7E94-(,FHG?CGEHOHNPUNANU\……otI)HI@:70?EJNNI:[ŸЇ…zƒ{wLIJCFLHFOV•ž”ЇВЄ‹ŠДЏАŸˆg{ЄЇg2 &&*EQJFFHEAEE7:2FB;5a™”ƒ}„‹}\aU[YWTLGPii…™ЖЋ‡ecŒЈНЦЋn]rŠ‘I:G!3:>CHFCC>7?H;(5@9<>OМŠvnrŒƒcSўя§ћў§ўћ§ћ§§ў§ћ§§ћњњћь§ћ§ћ§§њњћћ§ћўў§ћў§§њњўћ§§ѕў§ўћў§ўўћ§ўўќ§ў§ўў§§ўћћњ§ўўћ§ћћђњћўћ§ћ§ћ§ўў§ўћћњјћ§ћ§ћ§§ўў§ќћ§§ўўќћ§ћўўњ§ў§ў§ўў§ћўћ§§ўўў§ўўщћ§ћ§ћ§§ў§§ћ§ў§ћў§ў§ў§§ћћёњћ§ћ§§ўў§§ў§ћћ§§§ў§ўўў§ўўћћ§§ў§§јћ§§ўћ§ћўў§ўћ§§ћћ§ћћњњћ§ћўў§ўўў§ўў§ўћ§§№ћў§ў§ћћ§ћўћ§ћћњћћќў§ў§§їњ§ћ§ћ§ћ§ћћњћћ§ћ§ћћ§єћ§§ћ§§ћњћњћ§§ћў§ўћ§§ўћўўќћ§ћ§§єћ§§ў§ўћ§ћњњ§§ўњ§ў§ў§ўўыћ§ћ§ћў§ў§ўћ§ћ§ћ§§ўћў§§ўћўўјћ§§ћћњњћћўњћћ§ћюњўћ§ћћ§§ћ§ћў§§ћ§§ўў§јћ§ћў§ў§ўў§§њћћј§ў§ў§ўћ§§ўїћў§ћњћћў§§№ћ§§ўћ§ћњњ§ћў§§ћўў§іћ§ћ§ћ§ћ§ћўўіћўћ§ћ§ў§§ћћєўћ§ўў§ўћ§ўўћћ§ўў§ћћ§ў§ў§їћ§ћў§ў§ў§§їњћћ§ћ§ћ§ћћї§ћћ§§ћ§ћњњћњ§љњ§§њћ§ў§ћ§§јћ§ћ§ћ§§ўўќћ§њ§§ўљ§ћ§ћ§§ўў№§ўў§§ў§ўћ§ћ§ћ§ћ§§цћњљњњћњљў§§ўў§ћ§ћ§ћ§ћ§ћћ§ћћ§§ћ§§юћ§ћўў§ћ§§ћ§§ћ§ћњњћћўљњњљћўњћћў§ўўў§ўўњ§ў§§ћ§§ёў§ў§ћ§§ћ§ћњћў§ўўѕћ§ћ§ћћњљњћњњёјљћљћњћљјѕњўўСўўћ§ћћ§ўўј§ўћў§ў§ўўєћ§ћўћћљњћ§ў§§ўћ§§ћў§ћћњњљњћњўўїжУЃZў§ў§ўўў§ўўќ§ў§ўўў§ўў§§ћ§ћћњљћњњљњ§ўў§ѕћ§ћњљњћ§њћўўљњЗwOOJўў§§ћ§ћћўњ§§юћ§ћ§ћ§ћ§§њћњљњњћњћћ§ћњўћњњўєђЦ‚Mg~a;ўў§ћћі§ћ§§ў§§ћћ§§ѓћ§њњћћ§ўћ§§њљљњћў§ћћр§њњўўёЯ’j`oU`^`Cћњћћњћћ§§ћў§ў§ў§§ѕћњћћњњћњљ§ћћіњћћ§њњћћњ§§чњћ§њћ§цœ`GFmŠkjiS0ўћў§§ћ§§§њ§ћћѕ§ћњћ§ћ§ћћњћћњћіњљњњћњњљњўўктрЩƒqUVQVYOA+58§§ў§§ћ§ћ§§ўў§ћљњљњњћњћ§§ћєњ§ћ§ћ§ћњћ§ћњњшљњљњћњюм—SV[SghZSUk@<3?ўўў§ўў§ћ§§ћ§§§ћ§ћћю§ў§§ћ§њњћ§§ўћљљјљўўьљжЖqAF^ZSFB7<;804:7@NNHCJLњћ§ћ§ћ§§ќћ§њћћў§ћћРњљјїєющМ™…VP\ESa]YE??ALSUVNCHFFA;B@INIOLLQўў§§ў§§њў§§ћћњњвљњњўјумуАbHVZUMHLHGNQNLOQLOHHJNOHAGIEFMGVZUWўўў§ўў§љњљјјљњўўЮрИ{iOP]ec[STPLNOOILVUUVOSOMISQNGIINP`\QOњњћћњћћў§ћћљЭјѕђѕјњўљЖ]M<:UT`[]ZVTQSUTOCLUUWYQOOHCGEBGINPT\a]^ћњњњћњћњћњњљљјјѕјїўўбљй}IT]OJOZQOLMGQTVVMLQNNQNMGHFBCA@ECH[c^bhjњћ§ћћўњљљќњљјїїЫѕїўўР‰TEN[\VPTa^BJGCEHHMNHLMG@ITS^bdhea[VOћћљјмїєѓєїћўѓзЎdJ>HQLAJGFE9<@ECJHFFJPHFNLLэJLJOQPSSUbno\TQUUћњњтљјѓёєѕєєѕылОЅmFZM;JUSCEGC@9:BNNMIшJNMJLJMWjh`a–М›eYIIPYWћњњРљјїьэяўўмШЩŠ\TE^[QMJHCGGHG@>GQOFHMNLLNOMIFBH?;MxЊЖЊˆUB@IMNMEјјљїї€шѕєїўўхŒwbNHTY]^UJHIQTWVNJBGNFCEBEIGGLOTGI[Lc›лцЏcB;@B@@584>CmT7.9:GU\SVQMUTJGGNTW^ea][ZTN[dW…УбедММжКo?HGONIOFLIHEGE>?F>9B@FHC@JNIU?LMMOTOJIINNSSOPNOQVWZ]qn„ОжЦРЕЎžФСvBGCIGJMPNFEHMNMGGCIIOC<>N„mVPSMQQVQJFGUSTOZWYY\QEGmСѕюлЛЌЄЌДž‡U>AALPONWW^rbUS‚ЩэшШЪЪЭбЦФБviHMNTTQNQSNJJGHGELMPPQQ<AGONMMUUOIVaWBUЇщкЕАLGP]VMJOOSWG\juЊЩЧцўямеШУФРШУИuE>:GFLJIIFC<:BIPLHGCFTr]cЁЊЦдМЗБQMNUUMJJ@]aPmЅншЫСйшпЭСЖСШЋЏ‹QPBMGEC;JOIHHJB@GG€JOOSN?nТпЭЧШРЛВMMLLMSJL[dЋСЮмылФШёчюмТЅРэцžT93GA><<7OVSGGNHEFAB@BGG:>xШйЭШЪЩЮЊЇYZ`e\PU^ˆЂШмусЩЇЁЪнщядЎЂЛкН]PZ3>7CHJHBILCBF@ABHGA@\ўўє§ўћў§ў§ў§ў§ўўњ§ў§ўў§§ўћћ§љ§ўўэцС|TG`jba\O`Vd[Ziўў§§ў§§љў§ў§ў§ўўў§ўўњ§ў§ў§ўў§љў§ћљњћўўыуЊqmvUgcjdbdWhkj[eqxўўѓ§ў§ў§ў§ўћўћў§§ўќ§ў§ўўі§ўћ§ћўњњћўўщРЁuEm^eUakoda^\kxxknmoўў§§ў§§ќў§ў§§ьўћў§ў§ўў§ћ§њ§ћ§ћ§ћњўўхїТЂWMSiqjccai`kmqj^aitnjo§ўўј§ў§ў§ў§ўўћ§ў§ў§§йћўћўћўњћћўўњбhd[Wak`]b[bi\kjenr`hUVaaўўњ§ћў§ў§§ўћ§ўў§ўў§ўћўўѓуТ~^a`mp~|hh[\^icenqccVWYWbh§ўўў§ўўњ§ў§ў§ўўн§ў§§ћўћ§њ§њўњѕћШ˜cWNTcdWBWmQdY]bdHHWјZ``VWag§§ ўЬ§ўћўћўњўўѓяьКpZI[~‰g[VM]}pba[^JNGQSYSboh`^a`ћў§ў§ў§ўўј§ў§ўћ§§ўўвћ§ћ§љњјњѓЮЈ‘j`rZhz~oYTJ`^gkm^^TbYUSOWYhjegcjћўўљ§ў§ўћў§§ћћўћ§ўўлЭˆU^j]ojkuki\[\`^]`edV^h[TNOWcge\eikў ў§§ўћћћўћўћўўжьчђИr[otobaY^bgecdjdga^`adgW]]aa[]gcqmp§ў ўј§ўњћћў§ўўыыЦŽ}cehx{nmcbieg`b^ikkтrcbWjge[bY`Ydozio§ўћ§§ў§ў§ў§§ћћћљћњ§ўўжФi]IJadkvnktjdhhneeaopmghg\]WWS^^]^ejpzt§§ўћ§§јћ§§ћњ§ћњњўех‡WeweZjdd``Z\btojcidkob]\`aYZOQQYZ^pqvq{}§§Сћ§ћ§њ§ћ§љњјњљћўўЯ˜cY`xoecopzMU[WVa`d[hgojhbcb]SQPZYUWZhqphnp§ў§§їў§ћњ§љ§јљљЯњўўн~q]YE]]VUgchC`S\POY`]^U][][c`^STYW[henkthjgj§§їћњћљњјњѕўў€ічЛza[^iYWTWQZVOGMV]\\becUYZ\]Y[YWY`Z^`SZ^he^c`iћўћўњћїљѕњїћљєцШЗ~VkgSdicZTYUPOVT]]Z\[][\QPWYTNV]atpdkЄƒ`V\SUbp§ћћўњћјєёїўўцжмžtcSwvi`^TZ^b[[SY[ab\Q]WY]e[YSNNSH@MpœД–tPJETT`]cљћљњјјїјњўўѓŠwb[hoqnkd^chngjdPVVZUNEQP\VTT][SM]WaУЧ–bJ9?NQ\c\ZљћїњјљўўШђИ‡V]udaxvtmkknbohopp^d`k]VNGBFF?MJI[YVSQIIMEIJVpooga`[c``[]Wa^WYWP[]dhieuk^am‘Ж—Žˆ‚‘ƒcNAGHMIPGMEZigda[VLWZ[MPZe`kUgabgpbbZ\aige`dgiagnmkttˆžЏ•”ˆ}e‘b:LJSHBIHQU[\hn`g\^VkdbVS`›”maae`kgh[[]ipmoknipnbQWzТђеЕƒr}pmL?bY]GHBOSWV^c`YYdjcei`VT]]`daecrno^Y]ON\dhgituqtYMhЈБАЃЕЁz}nII@(SWWNGP[[UVWTUOY[hjvhYY\erha]UY`W^U\Wgbjiiaghcoqb‘ЕФБ™•ЁЖЖŒPFVSGSNTHLVY[OMZWQVaakkbOS:Ejnkja^][Z[WV]hhdbkh|i`[{ЋжЦЂЁ™Є•‡b]SLNNYLOQVZZYaYWQ]akebeOEEWnaadnqkob`[]gjheacouVZ„˜ЄСВ’‘Ё–…^458FGGQ[a^i]^ee€єhc\gcgghUNtvhkvzpek\hotppomdrpV›ФЕЅДЏЅ˜”Œ‘ŠqJJMPPZbZ]he^^dix`GS‡УА~|a\bpna]egedPeopБŸЧыйСЊ’”’—™–ЁmFUhdZ]aa[\UOL\ZYOEwБЌЁ—–Ÿ˜putqptn`WaxƒЕСЭЂƒxЂЛЯкЕwjˆЋЇWG]18HBJILZ]a]ZV\PYNVPNB\Q`ЏеЂ‹‘Јn]Пўw<§wџ;ќwџџ8wџ8ўwџџ5wџ3w џ2ў€џ џ1ўwџ џ-w џ+wџ)wџ'wџ$wџ#ў€џџ wџwџў€џџw!џў€џ#џw%џўwџ'џў€џ(џw*џў€џ+џўwџ,џў€џ-џў€џ.џ ўwџ/џ w2џw6џўwџ7џўwџ8џw:џw§џўљћўњћ§§ўўњћћўћ§ўўћ§ўњјјйєїљљ§љ§ћ§§ћћљљ§љјјдЩБЪчЫКНЂЈЇ{žА~§§ўўћўўш§ћљљћњњ§§ћўў§§њњћљљћјїї§§сїзлТИ’”x\v…‚JUMdmnqQS^NATV>§њљўўћўё§љљћљ§§ўњћѕјћљњњ§кћљћяэЯКŸ^aWA;;I^P0:NNOFL\b[B>5TOMP:јїљљ§іљ§њ§§љљјћљљЭћ§ћ§§љ§ѓВ}UN]CPQJp[?;GOPOLMNMLPW^VSI@FFOLE8ћјљћљљѕјј€Пѓїїјјљјћћ§ћ§ёШЇbgcYemZ\m[EN\ZQWTZWTEELMHNSVWLMG?@>FNB*љњ§ўњ§њћћљљјјљ§ћћ§рЏ‘tbO89EZgZP4I\PCLOVY\b\ZULOVUONJOOUPI>>CHHE4§њ§њљћљѕњњћљ§§ьЪЈ…VMU^rnSCHVYTNJB1@A@@LUa\YUQVSSPSSQTWSWVF:4:?4.љћњљљћњў§§œяЩ™wc{t`noedgZFGJSZOO@@EBEAIOYZYZVVUSPTYQMPQWSEB;B8јєјїѕљ§ћь‰kbYV[iaVQZ[\W`WFOWYc›kOHH9?7OE07јњћ§§чСЃJ4PP9F]^TTSWPW][GILOHFFIBG;;BHIHCLYVIFJNPP`drLEIS[UOH?9ћћыз–W`z|PEBIQTTVVOSUUYUUQNPCA@;B@C@3343?CIQTUT[YL57Wg1-Z[QGBBYJЫ~OL?H^eB&2BGQQJY`[ZWGLQNIJIB978??5HN;9;HCIJOJNOME2-Bk:05>$!(&4io]QhbeexJLQFBHOQV]^SJ;EB?B@@AHFFAFPYWOHIV[LIMHH@B:1;@77254&171+FO;BIHMPOMGOMLNJOPZ`xNAEE9@GIMNOFELJJPMALSTSNJIHFIA<53.1,."$%4ZYTMVOOаSIINMPLIJGJVYTMMHNFLBELECBHBGHLOOTVPOG@:27+)9A344€&"##9FLJPMLHPTNVQNHHMHPMOPPNONISHICELJEIFFNLQMLHNPIE:;879BI4"#MGJFGAGMS\[VYSGMUQSTUUVZULMNMP92P@I>-.2S|YHCINF0>CCGIG-!"#&! EEMJF>CGCGSTSMQSZWQVOMFN[>104**:>0+*<.AFMHCEQPH0<#! EBPMHJEJ>BJLMTOLMLEC>>@QO+54%%#)(0" #9A8J>%0QS]tj2%%#()&C?GMGJFQPIGA:B33@GIGINQ`L8431*,3<:<80(.J>I98]x}ސˆv!#$!*{cOGIJGC?E<:MWTeQTOUWYQO;..&&%2531.)3-GIdZI‹wwx{–}A"- %eWG@?84?@ES][[JIFNOPPVSFA+-%+&14..508;P@FH>J~Ё‡or{m1  J9*;7;?EFEWGQQLFHIB>PO5>:*.HS]NC?C:;,84C@7CSVuŽŠ–};"F:?GHE><8@IOJGCFJB4-02-3?I:@[NA23:A70:   ICBBHEBI99>GF:@CCaQGaVFFLYTTU^PI<1<72(:TGNME@81LUUQPJFBEBWZUUVQNJLIFCIJILB@;47?O@)7?E1;bi9)01(  HLOH<@`iSZQONW`OZ[PTUWOPPHId}\?1*%1780&%$*-5:2O;0;  !!C:JOTW]bVTVUMO\WPUMLQOAEA;GSZZ{xB0:30+."!!237.M.]|B  ,2+SOH:FNLQPNSWPFIMOTPGFMISLMPNOUHB"0??4$*!$+2HJG!+5F5* #1 YZ\SVTYQUSTVY\WWaVOFA8;MGJQSQ@A;41*270179$ Egg\7-5.(" Z\[PZ[Y`ZHHOLmŒjuM-49;?CEEBHMI;75*,""13,*Pj\I7%*G# $okgcb[QPQTOH31FSBBZIIJC?79:>IJJCC:4.A::1$25:81!)w™…voi&BJ-&3-LQZdpFGHHJGGB@83:?CCBA>GH::579CB8.L9;LmƒŒŠƒ`0B:+!3>,SQSUP9CHIFBCA,9002013C?BF>78?AE>CEWahZdx˜ihaHG;4*#$()($"C+MQOUVMEBJOTYME;8:?G<4@CIUQ97BHH\P;@x˜‡xw‚‹c;#- $&"#!*;Y+HGHMQJ;FE>>F@GFGIFFB>;<3FLC>?F;LE7+*2!:A<(*3OeECJNE?9<;C5*)($782.$#%;BCFnƒo\biaYpqrptuj5$%.$%%14;.5PdrEEFI@GAB@@97-,1*+,-;:9GWMO„žЁŽmQSIHCZjtu}ƒi97 ($MSbNLGF8@?;-.14@B:("3:5&+@hŽЁ›xv{bLPPMMIhhgv~]&%:-20(( O‚~YUTJ?;?A.+&)CIL:074)"Oz~Ё˜~kppaSWnvaWCg˜IBC &08&-$*3.*&,GPWjTVTH48>B:3107;B,"B?LmЅŒ‹~pPe\U[]`gh`[gv8;g7!+40..*% FZLaUJMOLCECG3!-3&!,cj|Ž‚‡ƒ~wojhYddv{|tqg}ЁЅFr~I,"12-%,,0.!2Vuu`dQUVG89A?..0(!$-Unpquokz…~nZ[^``brmenj^jКЇO;  -",-Ui]doPSNA3@$4:JwŒn\q„‡~|wbL`i]V[gg€hckˆМ|(%+%.0A*7TmgZNI<4BHNb…Šxr{vuƒxtkijnrnWYbYOen•Јe*!-%70$8-YixkkiIF:89;EHk—{Z\]b^aevtuzmjZcpontL7OP]]cm›Ѕb??4901,IA+&,JS]‰xvtCFGGE22Givhppi`korzxxojbdvzme[bpneaopr…d-$97492$&UkijdbH?A??CNakbWi‹t]MNgropjbb^d`…‰…v]h]UWYWSOYb^WV[k{”—Y2)#%.,*.:1+FGad^iv|d[\IEQ[Zg~„hodVmormkib\b`Z[ccZ[]jroti %#FBB;.)!>atYPWb„ˆzdid`hzwxbbhg]]aipqeaZTMPQZbc`SQJT8 *0((0A>B?0!")Z‰‰{‰zqij|{xjachaVY\]]ZdtqaZ^aWhTapicVVgeF ).+47;@;>7.!EPE[nptjd^M|”~O$OLUGQadV?E>OZTWIњњћћў§ћћќ§ћ§ћћўњћћўдѓБaZcLWOIn^@8GUWUMLQLNQ[`[JHNLSTZQEњњћњћћ§њњљћњ§ћњўўдѓЭЉjnk\dr^ax`FQ]`WNY]a[MFJOMMPZWPIILGEJSQGў§§ћћ§њњћћ§§ћўўбчБnQ<>IbkUP;IbPPJU[\`\[aVIOY]TOOMNJPVNEBCFLML4A§§ўў—юФЃ‹L7PQABaeYUZZUZgZTPQLILJMNB>:AECAENSWNIIOSV^nzQMSY^]UNLIўўёзЁ^d{WEFOTPSTPSV\[WYUYTJHBACAEB:229B?>FT[VV€‹N2>Yq9+WaTM<9:;HHA89CHHLJOJMJG?0Hn>&AP,)45;qn\WhbgeEJJLFJJMV]`YFB>EBBEBBEB>EHP^^VMLSZN??ECFEBCFGC?E?744€Є5;LS7><;315A]^MSPOSVMHJLQSMPONQV^YMIIELFGGEFEABC?BHHNSSMHHF?>VL;CdmˆI(+,(-))--8EIGH@FHJEA><9>@EGEEINYjJ5;4,%+:899€О.#3IIQ;>rЃЏЗЛЪмдœ@,40,!(,,44iEB?@BA>3>@NYVmYY[UV[ZME()*0+12440.,,8ENxe\ЗхФУФЧпУd;2:-$%>j[FA;::9<@Y]a^ZTMMVTV]WJA5-0,,0753477@YMM]N`ЁмЭЖРЧб—H2$*# H?,79<@?@L^MPQONIIFBSOH?39)(IVWN>BB€х>B?HHNI]jЊЫЮмЖY>3.%$NGEILEC:;BQTLHHB?<7:;;38CC@E\OF?;?A>99CJTaw8>TxЉЗК}PcoP$-#"(1JEAGGJNHEBMQIGFGB]UMaWJIP\UZ^iOI88;@9;A[S[aWIThžмУnB:!$$&"$(-PNGE?BGQOQYPE@@OY\LP\WTJHGHPZUUN85097:ECOWZSF4:{Е‰aJ434*,%%#TSJ>8+QOTT€нF:??I`bVZ]ZSNJJGHQPNQBA@<:LVYYQYQO>MŽЂP4525:81*$"#&OOMM;Aad]QVOOQcPaZUU]]VNMNOhƒY>>31><:CLJBEBLP[Uxh-&E@()++().7;2GIIS\]dg^Y[SPT\^]SSQPPMFHMQ]dg~|E;FI@FAA<8AGMO\{]47iŠE,+7++>?@ATSPIJMTQQVZ]VPOPTUQMLMTQTPOQNIPN8FIJEF>??€ˆ,IF^xg:"1??O@?;4>AC>;[bWPUWTWZYYZ\\]^b\TA@HLFJLLTTPOLHCGEAAFLLJ5n”Ѕ‚NB3789?CB<5754,5*bi^[a`a`WOMNJgŠoxF3@?CAEIIMNVSPMCCBACCHI@&uВЉkI833€—,?O;848<7:;3jphecY[TPQVM87NWGAVNPQOAB>?LGC4O™ТЃQA<#0(%(+,221:;9>&bbd[VTSCIQWVVPMLJMNOTOGCBC?BGEAEB?>A;?AN^…ЛЧЦm#9?;20&%&-2,9@;4MWY]UUOJFBGNSVUNHE9EIPOIAA@HBCAEEAMNTMCFЪОЗЖ™BLS><941-)*,-+5>?-5QU^bnGGCIMOGIH@?@CGOOILOPJFGFJJIMAGb\g…ЏШЫУНŽ+598>AB;11Ab<@zEHQSIIGIJGMTOQTVSOQLHIPOUUSU[NS~ДТЧФАžЋФбЯЛJB3*-4::CAB9CGLLMQIGIJIGGBIH>CeqkœУОЌЉЄЊЁНЮдДHLSLA97:<8?CMI?9-8SˆЌEHLMIE@?E@EBGFHF?EEIJH;8SYV[”УМЈЏЄЂЉОЕЗКМЦ™&$B0@42238;:CIH2I…ЊЋEINGCBGCFFIEC?8?EJNPNQVdggАбхрСЄŸžЄЈНМЛС֘O?31,089415857>2;ŽЉЉNOOGE@E@?AGGьJIHMOTT@FP„СарФШЫБЁЈЈоŸ”ЕЖЗЖЛz43B33.:>?:8;2*,)4rРаЭ^`SCFF<€Й?EHL]\QLQL?FuЉДйзУФСНДЈВДЖВЊ›ВдпЕ[GP-$7ABGBJA>7:5A!7„ЅœЃЉQWVOIIQLGLMGA$>F[”ЕФеЭбЫЩФНЕАЎЅВМСМЛЖЕУьн] 0‹^:;BG?>?CFH7GˆИНЗКQWUMFFJLLCMP>C]ŽЗЛОСЛРФЫЯРЈББЌЈБЗЗИЕАБВцОYJ>1%#)8>:0::?CAGV™МЏБЕPTTNNIY[T4HTWwЕФШВЈМРТФФНДЅЌБАЋЌЎЏЎЌЋЖЭя4>E93..-247Hg™КЕАЏЏБЏБКОСОКВЎЎБДАЎЎ€ыАДБДДЕЖР…<,:HE:;5983JEA,1IŒЉЌБЕЊ‹CIOJaq–ОМЪИДЎАББЕОУРРЗАЉЏБЗВЋЅЄЊЌЉЋАЕУЩ’B45?B@@BFJ@NdT[zn„ЋСЊЉКБ@?:MŸТБАЅЅЄЃЂЇАЕКНМЋЖЎЄЃЅАЗЕЏЉЂœЄЊБЕРРž?&#)4-2??HGMUa\V;:cœЧƘ™ЉUMOiœИ˜ЂЅЃŸЂЅЊАЗМОРРЋœžŸЈЌЏЎЉЇЋБЖЗЗЦС‡CIOQM8A‰НМДœЖЈЃКОЉЏЋЎЏЏэЋЅЉЏАЌ™œА–ƒ›œ™™œЃЌЌдЊААЛЩЕS(98;?CNPOJ5C‰›ЂЌЄžЁžНЈЋЋЉЋЎЈЇЅЉЉШАВДЎЉЅЃžЄЈЈЉЇЇЉЏВЏЋДДАБЃe5>95+-9AHBHj”Ѕ›ЉЖЗЎАЇЃЄЋЋВКСМКЌЉЊИМЖАВБЊЃЁœЁЇЇЄЄЈЃВВМЈW(E83,554+JIJEAA:@?BCEHF0OЁŒЈЕДБЏАЅ•ФпЪœŽ‘ЊЎЎЌЊЇЇж•ЕЪДАЊЇЈЏЕИЗИЖЊЇŠŽŒm,9,+ 31>BIECH:YžСОЈЈМЃЄЅЉ„ЊФЖЇЉЈЎВВАЉЄЁ˜’ЋЉЉŸžЃЈАЗКЛЖЏЉЗĘj50#($%&?:;B@HQOB;eВЏЌЉЅЅЃЇЄў§ўў§ўў§§ў§§їўћўћ§ћўћў ў№ьлацўмбЮАККŒЋЛўў§ ў§§њ§ўўфчєжЩŸЉrЎbva}……hk{dWheP§ўў§§ў§§ќў§ў§§ўў§§ўнсеИxwqUSLZwkBTbgh[ZtƒqPUNe``cOћў§ў§§њўћў§ў§§ўў§§§ў§ўўЫЦœzj{`qo^‰uTLUhqm`ahc]eqvmm`ZaZehbJ§ўћ§§ў§ўћў§§њў§§ћўўапД~zuxŠ}|ˆoYjq~vpvv}iaY^^`bnpqb]VSU\]bWPўў§ў§ў§§њў§ў§§ўўЮѓСЎ”~aOP\v~n^Geuma`mnwx~|xigkwqecbhc\a`\UYW]YS§ў§ўўћ§ўћћўўЦћмТЃpdmv”‚n^dnrwpZVWWZ^]]{|ƒrprtitnojhjmjqodU[V[C<§§ўўћ§ћўўЦрД}•’‚‡…tgcgnnjnQT[Z[[^kurptqwqgkhoieihocYUTQOEAћўњ§љўўЧЂ{qpp‚}}n{txx|rnjqvxВ…Y^V`QYbhnktmmp^``c\hedSMSMQWY\CB§ўў€1§ЭНœ^CaeST|vwhhgpgtoghg[\a\c^]JNYVYQY]hb]Q^b]`rvˆZT`adb^WSWўў§ђЗvw‘œoU\gcbhoriojpooqdgaZVUWUWVMQQJHOPUagiec^]CIcu@7bmaYOSkZп’dgShv„^@?O^jejvvoqkcehb][USPNNLPGV]VLTZ[]UZ^\YUHE1TxCCPU>1.;8Iƒ…to‚~{‚•c^[U^Zehpntd^PZQ[PTMUTTUMWahod`YgnYUJJSNOSQISMPHIC>17CHtqghciinb\TWdbaaО\Vdgh][SQWYYVUYNUNVUNPYchb\[SNPJHGSMUVQFBEB:#)CbV^^cchaba[cbW[Y^VV€1a`ZVZW\YWLTVTOMJQOOYUM`dgZ[TWUVVY[M;9+2;4:3V]eaZ]^[[e``]]Vg^`]\a]ad``TQPZC?VIMEHA9cmYYmh\YYa`c]cG<@7550-10QZYVUPJSOTc^^cZ^Y]WUYWVWeF95@:3%$JP@33FOI[^^bWU`dTBOG;?1).?;434U]TUQNUNIOFTYUYQQSA8FLUnh7JCB;C95B@@1.%>@TQIcU?Meku”|F7.9??B@>UPY]QVTUVTJMIGCSWW[`chi~`ALG8;B?PNJLB>N^ZcJGr•‘™ЅЎЇ~<$A>9)25@>:~VNSTOL9GEWaku‡dkkqjhkjM85E<<@LIJC?GHNda‰uaЁИŽ–‹Ћ‘T:5C:.+.+8TzqZLCECLNVkwtuohgdgjikj\QNGC7AGCFPHNLSi`Yi\b‹А‡‰˜Ї{E4!1*+#$7cV;FFPSTVZo`hneb`c^UbkYQMP9CTov\PYVSJHO]W\J^ixŠЂŸЊŽO;9502:.4-7`ZWhb^YUQQeg`[[d\]UJLFTUSYSVoeWTLN[ZVNTVVa}9C;902,(3#]hh€УOUt}quhier~cqzhknrpnacgƒ›mUN;>SHGJJNCOHOUZTmZ-)G@7&>71"(8-7:`jinnruxrkjniojvrnhghd]\Yaeq}|•—QHSMZJNG@E@EOUVgN4AxŒT&;4-55BIGjkbc]dhnhjqpkdbkeihd^ghghkdhegb]:IOWTJGE@A.JOad^;3A;@2&vzu{oqqzug^e`}ЊŠ`FYQL`[Ydaa^]ZPONHIFHJPU%%a{uYN9?:41HWCA<-7CH@3…ƒ{uvthodmghII^jZVh`^i^`O^P\agd]PQJHAQLOB8SqtIG9-8<*;33(&,<:AE&w|wohpaa\eeqmc`a``hegie^YVNWPONOA1.((-7.:C@.Eqphgdee]W]ceojdYOOPceb\\YYTUNONNFLWTJA<…Ї‘‚~x@TZLCE:>&$%,,4;AG85dpqŽ]U^`kccUPTOUV]\Y]ZcbYSQ[^[UOFQeNNa„œ›˜|.BVOF5<;.@B<3)C[]:ImnnthJQ][ckcUTGPVWOPOUO^bZWTSYZVZ]qw{vx‘ЖЌ|}|e^SMG:<5?@EC5!8\M;^nmina^[^itpdUUWTOZUPT`^ieePWS^{oSUˆЃ•‹Ѓ”ЁŠxP?:I??>:?JGH@8?Jc49Q`bdg^WQ\`cdgaa]\\ZVWQOWW]`\[]OVm„–—•~bq‘ž•‡A>82F9ACIHIOqQ-3><7Mb[^bhVTHVW[TVQVVUZJTUPSPONWEN`eUrœxmiciƒ–ЉŽBLm\WE<2A@NL\OL;25JiS[`bYWLLQQJHH>HHPNQLPI;FQ^Z]˜ˆnxmkq„‡‹‰‹+-U?.B@488kˆŠ‚bgi`QMSSCMEI5>Hp‹ŒŠ’‚‹–Ѕ™Šmpx{rƒ‡}}~u}ЭЏcPC42(.93-GBA>IEIMo‹z…^ggcUVVcV4Smxtt]dcOUZ`NEV`k{•™”‹„‡–›‹|}…~jkmonq|–ЊС|2?2??C:&+AQME>3HEh‚‹|[QIFGIЊ‰…x{qpkq|‡‹•’}zoomt|~rmb]ip{‡‹~?0,>>II@JT\j^S83Ce‘„bewWEBJqŒexvpzzwu~‰•Ё—•uacgmu~|tvv}ƒz{}Œ’uC]T?95JBOGLMTTU.MVЖСЈjajOh|„’Ѓ‡}~vr~Ё„ˆ•Цžw{edahdimqqpu{{…Šm-2;ILALGIGHSa\P3BxŒ”‹dbnŒ‘”x|xwxvz}|{rxhPqihcbmtw{rqw…•|G,>MBGEPHSOOV[QS+;h`ezp`bjŽnrxrnpumjquzuw{}qpnnptzrgk‚ƒxuz~|‚ƒU4F58-0@OLVWZVd\E3GƒЇ˜ˆwjrjxwrzvz{xtvnqm˜—‡zohejne`dt{‚zt{|i{zSSY44ё:AGUPYVYY[Veww€ƒ–Є‡vhiˆ‚~{wzrЁЂ˜…puuiigdbZgpkmkm|‹ЅЋk0*H;;9?3BCPJJN[QJ@Vbzqip‡‡otv^mnvq—›}ƒqt‚…ˆ{~wwoqqovvq{w‚ƒ„‡x;-M814.407ZWSOOL:?F9:5QSPSOL?B}›АЁŠ‘•Œ’~tuŠ‹Ž|}vqppqnqm}Š‚vnpogip{tkn{z`#,,4@G?FJWOTPSE+4auZh}ƒˆ{vnbЎ”eQWpprqohbT~Ž‚{rku‡—…}}~xoVV]O@$+&3AGMLQML2Ux‰roiomjoSVœ~oo}‚{tkinYYomdjgpnv}Žxpxz‚dS8:%))-)OALIW[^WF3SuŠ~vvptmh(ўwџџwўџ&ўwџџ!ўwџџўwџ%џw'џўwџ+џ wљwџџwwџ,џўwџ5џўwџ6џw:џw }џбrn]kYa]ƒЉЈm`T`ЋдКЛЭТшј§ћћ§ћ§ћљћјљјїїѕјњћ§ўўњћўўњћњ§њћўўћнўћї?SbBE7;Q^PWNHI>`^IJE:FNq}w—Ярљћ§§ћћљњћњњїљњњљњћ§§ўўЬњљјѕљњњїCc[SM>BHHOQJQTTM<55?SQcv]:LdheuuzЃБЂЋОкўћљћ§§љўљ§јћљїїљЪћѕћ1>H:;B@EY@@<4erj’ЇЫѕјћї-94*(7:AFGES{VFJjeaet…$0.2:;:<.3:BAFMQ??BEIFIMNIMUJBFMA>HMNNVTOSQP[VTOTESSBPUdVUjn;95:>E;;54@:A@;ACjOCECCB;IHA;>BEBBPGIJILFINFJNPPNGGBFLMMNSTS8HM[j5(.73;<@>;>9>@AFA4HMJ?GHH8GNI@9?>95;HNZ[SMOLAOONMLPiQB5<:,+YeS40B58>8B8>A:HCA<>>?4CC>C?;:;:5(9BYUa][VTSWW?CE?7  >V9!989HE<@15>:CJHJLHC545?GA984545BF;FIFNNLQ172;@;,"$! JIC,ESe> :@FBA:?CE@01@7<9<<@gU>C<@9?<<>9<:3AGFE:8.2@?-.32* *0<9FNIS20",CIJ77::81?^! !057:  ,!!).#(M>81-A>8**2*$ * !*-!-~5H.  # $ G`ZUZP3!  % &    ! л#CO[ˆ‡j.%..#"#!.!  я %9M? "Щ  $1‚‚OB;,#+"+5   !AЏ  $!I`HTT58-1&"+9?4^8 #% ж  #!>O;&  ! :Ta9О  !"!)#*!$   !Lkia?!€E1&     ":4 !&-&- 4-OOW>#( . "#(!%.! (*3(Q`iaCA[IB5-#%  %3.!0.++ "&"Eh\S-3ImqY70(&!!-0  %<(#* ", &SSYQ! IbzeVcjgA5:4&2&),&,( @$7[J<&+-"44+*" &mjVCOV5:I`gn|…ndhW@?E0E1*%&"! 0G#Ze`UO7$+-0$)0QiVSUWCni`]cjnodamcVq}dUdv^0NUbeY]cekaZiWP^!#)GO(!&#& +, *?hiutJ4""GPWˆg]^`JgˆmBczŠp[IATHV`eZHQC*LTOP]kbenn€z‡”|I4 #!" -!@qhkpdkzO+^j{bc^EC4&.P^YSFQSb``bYx—ЅЫНžb#%:8&# "!Ht‡ƒpmcmO^hYTZaZGF2IYdTNEVMpe^jk]‹ŸИТ—‡aC !# # $1SjeZVBOHIJOY\TQZHI#UPJIn`qwuvoq‹ЈСЛЂœ‚c&   * $8^}t`VSO{\LUa\T7:8LCB@<&WUJaaejrq‚‹˜—nka5&>2 !%  О2\jod[P[`Z`bPLN^b{mQ@G2BaTIMYzxŠ””–~ˆ‡xT,   € 7emb]TaY^PPbjog]oŽ}LHSNNIYowv{Ž™œ”‰Ѓ”™?# "  ""UkodZgcWTS[V\W?LQ]dPECJQ\ugt~~ŠŒœ˜Œ…}‚~eG"$( (*(" 8djˆgd^VJP:5PSVcbZJSm\-Pnxkke~Љ››‰‰ЃЋ|xE% %IaqFcq‚aLJWWISTcTWezBCocabd‚œ›”‘‘Œ‡{m…|eA"+(#)QQnha`]Fht{h^[aiS,?QQgh\„ЗБ™”–’ВНŽhWduP%+0.$  "3 $Jhh\Q<&2aceTBI9B<$*[U,Am„ŠŽ–ЁœЂДбИ‰MH^rL)$.* €E9"MWEJM<(,-9FZoQ>4.")cZYMk‡ˆŒ–ЂЈЎЧЛЁkUemwS!0  .(^Yc@2[j8-2joB-$Th}qan|‘…|ЃЎА”—ЗТ‚N^‡Ѕ–‰L.!4,,#47!#@P:]E85BFNeY1O<:HTScwx‡ЏЛВеУН‹ŽŒŠt>d”’e4(8J- %TTAP- UW]Y]0$FU077Q^tgQ!;<Am‡eghpЋН™ƒ…‚ТЃjbtrnud33  8C?.h^W^OGJ[W\OI,V\TII&JYLbdjwuvˆЃŽ‘˜’›Л˜|nkeZvaF:?;8!%()A,3a^U@B%G;(75JSZUSLkŒ’–’‰‡–”ˆ|ƒ‰Š‡wkn‘Ђƒ02#!$ $h`JLAPN3#FT(-IUM8.>LOMMHJLhv|•…{}v{|wx…wppqp„•YB<#)!.G+9H9" .iWSH73LT\ki‚‰…’‚m‚|xu…‰‡|xbiqw–C&!*+*"1@vxqQVSUQ5F77HOH8BJOOMSEM`ˆmW`okqzznc‰НЁ›Јx[hnut‚j|m+3))*!?8"]cQT]50BH11MUN#(.B.4>>-B[Tbh]cpwpWtЈœ‘…‚zrkorru}Œg.*,4*Na]TT.%OIIdUPGBMMPPNOWaZb„ttum]‘…|k™œ™‘ƒuhmnw{xz„Є”G &,4&щŠˆk‚n{kДЎ™ue[gЎкРМжШыўўѓћњ§ћњњљљњљћћўўї§ў§ўў§ћ§ўўп§ўћGZjOTJI[kQ\WNPCncPMFAFVz‰ƒžжцўўНћ§њљњљљћ§§ў§њћ§§ў§§ў§§ћ§§ћMjbaVNQMOOMNO\ZQ>A@?PZgueCPihp{‚ЉВЈЋЦс§ўўќћ§§ћћўњћћЮњ§ўCFIOOWZUSTUTUUMPOONNVT[a\J\i>I\\]bmnMHOWuin…Ъєўў§њљћћШњўBGINOVUIF>@PTOIILJHNUOIJJHHGLLPQT]OLQd^V[NBO`Lc~Œ”Шьўўчњў@GIHEFFHLEAQUOTVTMIFHCJJмNEGHJMQSVNIIGEBMST>8E@FgCB?Amzr„™Ќгўўю:BHB;?MQOICC98>C>HHŒLCEAOPIHHIHLGCILFCAGOSOJQTOZb[E>U”~[MSqjehtŽ9AFCGFB>>€0;>><>>Ek‹T>>?;<>>B;5<@?>CCHFCBHLG?BFLLEFOJHEGHLSQONAPhGIJLH@EB@@;BN]r5!488745:87;>A?BCE@BAECF<@?CCA?<8459BQ`bWSQNNLEBLMGaO@3>42*)[bS+,0<.9><<-7?CG@B@BB:.7<@;39:<:77;59<84:IG?GLHLPSP?;@AFBA:1+&"VdF$AF`>2;:?;@>>@?:5:GF@>;EkMFCBECC›ACCAC<;?HHE?%@C1" 0577;HC;;AOLB:9INEJS9?&-+2PNIELG@88Hc"1AHFA1!",3!&,)($TEE@@€ЫG>::;4&!+%##$! !)8<9##;Š,)#$+10.+"!#GVgzo]795#&#"#*%!*4?PNJLHB59.$*53!!:9FŸыыМa#*1*(&#!#&&!&$$#(#%1+!%:FJPQGTB(*"( )#B—шеd#-7)%$"#!(""#"$)21$%5LNLB8*-#! +.8BxДŠSG30(+.,)$"$"#(",,.1(4TtqdgSB1+$"2TLcbiЋЖŠ>$+11€Р+)*!#(*+# ""7Hgh.2374274210 %!$%#$)0<4-LŸЄZJA*152+($)*..,$".+)+Ip0+*01+%*%$-))")*#"%#)(.33>?e|W[\H870+&%&,)$!"&&LSiœ\(3-%($!%,5813102) 2,*)2743JQ7--œ(&($)*0.)+%*&%:dƒЇp0".+#+($0*,)*&%.022338:58<$&02.&%%&)"%*")&48iЊКœq<$# +J580*))Ж0,*#!++1;;330.22+*&0341-.,%(#"HM83tЄЃ‡r[YhH-,;8-8954,,44)(*F*##€2"$!&#"$#$049031,52%#:?AJ‹ЂЌЁ{J{ŸŸ–khOI?05475;4)$.9:70#.:4(%#E:3&&"(18720,0-7822-)!9oЏЉЁƒV@kx™ЛМ™pZM<>57;;:4-",8@>B9*--,0-0*-*,@P@H<#(1453485>3!-TЁЃЉƒmwm‡ЅЛЖЋАЛЎvZUN0&:C952;<<;403;:82(05"3U>4IpdS?E;@GGFA8#4)LЃМЁ–Ђ˜hcjЅЈВЭЭЛЇЄ‚dYcS^NE99354:58<2.80122C];,8pˆŠ‚jF8EF>?A<:)YžЖЉЁЇЂe^ŒЕЗВЉАЗККЊЋД›qM?CHA@<2.4<45)%$,541 *:F]uУнЕ‚cVA20EC@`’ТЪЋ™ЌО›v˜ЎЋЏЋБЗДДБДЅЂ–\FB\pHC;:>923++3470,*%1A(3;\ЁЛЂЕЅpI;9;:}ŸЊЯЏЊЃЅ…|~‚ЏФЋЋЏЌЇЋЗМТЎИЇ„A),9979:A8,1522-+&#(.!#8YŽРЇˆЋСМžmc™œЇЌЌЃ˜ŸŽm^zœЌЂЂЉЈЏАДЖЖИЧЯжЇb?5*92:E?984>82,..0*,-1.CGiЂЂАРЖЗЛ”UžДШВЌž—‡„{›ЌЁЂ›ŸЇЌЋЉžОйрѕјЮ‡90LCJMMC:577)$%+,,7:A98kЋЮЫЖАЉЈŒЇДЃЄЇЇž‹Ž’’ВЈЁЁž™КВЏЊЏЈЫпюјжИ‹b7)AJC>?>?B:-($&*!08AB78G{ЉАЊЇ’—™››€ЅЉž›”…ŽuЃœЄНВЕМЛЛСМЫуюёхпЩЅS)4JB@:@;:<72"!$39C<+&9MˆМЖЃЁžИžžЂЉЉœ‚‚Žž‰Œ‹‰ЃЅЉЕДАНЛВЦЮбеЭЖА›Z@UH><798<3?,!($)**31&$M‹ЌЛЊЃЁŸЇЉЈЃЁŸЌАТИœ‹•АЂЁЌЦЧУФЯббаУЪЭАwI)+:4893--&#"#((*")1*)3J‘ОЏЄЃЎАЊЊЄЂЊЌЋЊЋдΘ{ž™™˜œ™ЉЗТШЪаккгЧсбгЈe9:F838528+)*#$*,137<2HwЊКЋ›ДЋЋЃЅЅ€­ЂЁ‡™ЃЌЉ•—œœЃТЕЧТЪлЯежеЫЦУФИœk>1:CFA>>97+)05ECC934),8bЃДЭЌЉЌЈœ‘ЉЏЅЄЃЗ›uУУКЖДФЦбдеаЭпуеТБpB&-?E:A91+.*+8:?+*))?1;|ЃЗБАЗЪЌ’‘ŸЅ‹›ЇЈЉЉЊЧ”oНИЖЕАШлзййдЯгЮУЗШЛ•Y24HEA;82.&*88€ш53221)W‰ЖИИВЈ„ЉТТЈЃЇЅЖЌ‚‡…‘ЅЏНДЇЖчшбгджлщїдАžЅЕ‹?8LGB>;3+#,4;:.*250>O4TŠЖКЕŸ‚n„ЇЖБ}‰˜Œ…u}ЉЈ„‡БЫЪгежммпїцЭ‘БИwFA>;<8;9753+29A?)ЏБмН‘r‹‹Že`Y]cnƒ™ЌФЖЂЖТЮбЧЕмуыЩЦмђЪ–ЄЯцлРnB:CIB@973+.>CGVA>92iŽЇ—Ѕˆ‰ЂЎ‚iuœ’‚‘œЃЊОМКгстўчђЦШЭйЮЎƒŸбжг•O;GeE>,1*(+G`aVhC<88ž›ЄЉБmŒЂŽ’ЁЊКАЄ™Œˆ]b’ЌИЋЉЏЏжщйУЮгмїнЏЇДКВКŽQ@;3.973.48CLIC997?ЈЂžЄ•‘’œœ–„ƒЂКЌœ—›‘™•ЕЏЕЗМЛУсжЭЪЫЮбшнТИВЌŸЖФ\[TLJ?<;03FNGM338<ЌЏЂ–…‰‡™œЁeWЁ‘Ž‘–ЇЃЋДЗТМЫЯаадзжгЮУЌЕЏЎАЮКiZU9<:EB59:<914239ЋЌЛЂ„|Š—™ЅЏžˆ˜œžЄЌЉЄЅЌЉФебеджзклдЛЗТФСИЖИЏ~Y`U49<>7:94*&-;>>˜››ЉНЁœœ™™Œ‚–vStžНЄЊЉЊЉЇЂЋЊЛЮдккжжддЯеФОРЛДДЗЧЯž{W8;:;:392+*5BB?–‡–ЁŒ‡ЁЃceiНЗВ››•ŸЂЂœŠЂМкжж€KежййеУДМККЗВВЌауAC782-259835>;7Б›–ŽŽŠ‡‘БВ”‹„Š”‘”–˜žŸœž’ВЫаЯбЯЮЮЯЮШТЛОТЦНЖДЕЫкЂEE>.A428?7959<)ЏЄ–˜”‘…’~w–Є‘’”˜›˜–˜’ЊЗФббЫЧФУТСЛМССТНВБЏЕСФuZQBB>:;B;54(+(Žuo‰‘‘‚wj~jВž—zžžЁЁЏЉЧШУЦКЎОМРТОНОЦЪТДВБЗНУкРa.GJ@BAGE9*LCFP$&*8ЕЪЅ‰”—‰Ž‰Œ••Œ‡‰—›žЂЁЁЫВЈЌАДИИДЖЎаяаЯнСЅИИДОКУШЩ—S1ICBC@?IC513ЉДžŸЊˆ„Š•˜›–”ސ‹’”–—™t”Ѓ›ЏЏВЕЛОЛОчеЯЫЦНЛЗДЗЛКМОЦŒONI?99Л>;748ЇЁЃЇЁzw‹ЃК˜˜œ™™—•˜ЂЉЈЁЊЯдРМЖБЉгШТБмдЯЩЧРИБЖЗЛМНТуШk88>;7?:>A?;щ„‡u„n|u™ЗЗЉ‰xguНуШЧубњўў§њўћўњ§ћћ ўў§ўўсћNj{VVOScuhodchYz~^WYMbhŠ™”Њчђў ўђ§ћњўћ§§ў§ў§ў§ўўа§ў§ў§ў§ћU‚zmW]T\]]cijnodQQVOkk}ŒvPc„‚‰”Ž’МНБКдяўў§їћўћўћў§ў§§Яў§ўHZ\YTVdccgahkjmebheidhjwwiivTWumm|„]^bi„xv˜еўўћўў§§ЧўњўLY]PW`^`QSY\dham`^^baZ\i^c]\`a[cgt]\j{kjn`Mcrew‘ЗЁЇжљўўСњўTZPPQT\Y\WWb^[ejmhUWSVZdi`][^eW]gab\V\PYW\`LIQNYuZQNJ{ˆ„–ЈИсўў€!AOOJLOZ`\TYQPZQUZWVSU\VcZ\\Y\^ZTTWQWUWOSZ\WU\gaeqhUNdЏ•n[c‰}ww„žBBFGVYPPIJFSHLIOJVc]GMBONIMUWVSVSQTTOTWWZca]Q\][b^be^gagVgjxno‡MSTPOOPMOHJTOPJQNŸgILJSHJONPH?HQJJY[ZTSLWQOHUVY`\VST\V^`dgeZP`rZ\WSYT@FJGHLMLGUYm‡C1@?JFLIILIFNHZQPTWTOPSPNEUWOLHHCAOEUZrpg\a[^TYQPVUeZH?G@).4jto-".JCTOPPLULINWWU€’TIGUMQGBNNINHMNESebpnjidgmoJJHL?)%&,1:iu\7EISW^VMTSVYY`h^Z[UWMWUTNSUa\UOLEGNUNQEPVUV[cdAMNVOPM@708?9!g|h>!&SgvN$-IQSSQS]\VSPSPVN\P[V‰gTYUWUSPQQ€|NQOSOSPONFPUQ0&$%2Pe3 ?-#&)BAMQOUTSN\bhSOWZ^d^oPT2+&B?@Gc]]SNPIFFSr4>?LLJQ4#&#-"EA,1.7@AIC04dUNZZWQPULWJ78;!&-4513,-%!(87IH2(G›%9MVPTM;*4,0.))!&))",;130*BHTUQGHQTTevT?39:5314+,45#&,,07<23*!$&(&044$##"%$53O–зНV"157-&,-83*$>..02%04,!)+:7:?;3##!.+8.8127.18]gk›Є„@23@>?34389057,12+%!#295ANeU-)*,259?177#*1"0(41),(.1*;9B3#2S–›`SJE?7;581>IEA-$%)0#<@E2&@V2,-1"(..3105)8-,01**"+0)A08AFIawZgmVHCC>73:79B;:27,&-2-7:\WWpT#*(-&.$08:.)$&1+-&,+"8*3??@P\BB;88324*-2>0)(.2*.&"!%&(24:959;98>-B7:?241(-#31>9U„„kM1,I8,$-.)$.,)4+)**)"3>HF@>0029?.7,8<@>9319870(&"MUB3\gu[G71E2%1B27395?*9,*531W8$0"7+2(##%**-+>;92@7>G?780.1!?LJ?gx~tWGehr`W?A@$98475;201BBJHE3:>G,$"S?99+47<;B?:73EA;A>:2%4UugU&:I`‰vIL;57<>;0A9159>EHNAB83&.! 7?0+22EWHIA%)7>@:?5?F<-LmxutH7A8]w…|oz…‚bFN>,)AL8<0.7CA4B:A?:0>18&>^H;JrgVGG€{AJHH>;%2M…‰peinC-4N[vq{’Ÿ‰tZWcNaWGB13,BE>?H<1*7494T`9,:jztcL9CHLCJA8Ammeeo32N|}zrzŒ‰x}ˆz[B8EPOC5F;H,4$,0&)42-"47EatЉЕ—t\PC30?C2OnŠŒrbu‡eGhjwznpv‚~xz…jqrHECZmE<@C:2?5-%8<<;&0*;5+9CT‚’zЇ^G<8;7Wp{ЃwvmqZMNIxŽrvw‚x‚‚„’~…}vB*,58<84:723$+01-43..(,B[…œVx‘ŸˆtaZhhmxtg^e[9%Eboim{ƒ{}‚ƒƒ‰™ЄЌŠZB.3:-<79:.2,,?14"(#397FAVz„ƒ~…iGozŠxro^VJOIjrnac^irvu|mŒЅЛтгВp2$F0%&*0;*4;C78Mn}rq]bd\edigc\h[N@2ek[`zv„‡‡‹‰ЁШагЛЗ™{119;A57---04)94(Bpx‡~wvxuumutpgO`g{~^[Vgnv„zŽ””ЅЄБАœ˜‘™uT:0@eo~~wdPv‡‰qknnthJWJUopz{t‹ЫЪЋЁЊЅЊУйЂxor…n:3HBGB87)!79+,!0(-VGtm~[90&*+;@vЇ}UEWTFSM.!(19ZuŒ‚kƒ’ЅЂ‘ŒНУТЇžШж•cpœИЏ˜]<;HPB.)25"7F@LSA5>%:Te[r\EMPUb{eO5H\QJWdn{‘‹”ИбШюййЁЌЋŸ…OtЉЉЅ{H@MhC;:&.3.LohYdF55>djmoqLAUpQZ\qq…t`V\Q0.]‚wƒ‹Мг˜˜ЖлЕ{p‡Ž|Ž{UF1439.::*9SPMA0->C}tgrWVbade[TLi{k`\\Zc[x|‡Œ„‡•СЗŸЉЂЋЪВ…z}k‡”xUWHZO?;?89MULL434;tzkSWS`jgedH1)PgVTOM\gwoq}‹‘‰ЂЇЁЅЉЉВЊЃ”||x‚ŸVUSA18@EE<>?:3+754r„hUP@T`krwcOGN^Sakmwtpruu˜ЇЊЎЊБВБВЅ‹…”›˜‹‡…„d]bU:E>??€Ў<0-5BF2<@;8:BHFLzdZ`aZPP]vpWOTHVPLHV[d`dec{œЇАЉŸЁЏАЇ˜’’€Й•™–‡ˆЃД’GH<.8874>CC@B@)wp]bTcbcM\^IEda[STT^^a`[[Wp„‘ИЖЃ˜™”—Œ’”Ž•—މ~‡ŒœЉrVO?CAB7>E@);2)VGI5CPbTG93I8TxocWPE`b^m~|Ÿ™ЃŠ{ŠŒˆ’‘”Ё™ƒ{~ƒ‰’ЋЅW4;H?9;GLF-*I\‡…zjgcj^MINTJ@S\ZUacpztzoYw›Œ‚‚‚‚Ÿœ€и›Ž…~Š•˜РМ](,>{ŒcHT@\VPP[aaYU]^`bcee^k›pv}|‡}ЃаВЅН‹w…ˆŽŒŽ™Ё}G.MHG@ILQUQ`ZGe”Апїћў§§њњўїњњ§ўЬ<.,>1#)!#! $+8>.FE8MNC?74@>?AQe[MGGaoPan~Трћћ§§ћљљУ§њњўJ?;E$75:MG::;GG?U^\eW^–Уђћ§§њў€d$$9<  ")&?IHHNBC?A@?;.CFAFG;A@G4)(&.<>>HECFIIQWU@nuY[MISbЕйь§ћ§cdW-  #(E9@A?25C2*79CGC?B@;(&@LJA0EBOSS`tnSGMOavЏы#>7$    (0)19>@BA?>CLGAA@FTZEe[TJNUSJJLQTV`\aje]m!($ # ,<>>AA<>7JVYOGC?*Ad`aMJSQYWGG;CPZ[\b]V]ai"#!  !"#9<8A3239MEGQF59?24.327<@B;274BCFHC??EGGLOS "!%!  %%BFGFA<$ ()(90+$7AHG72842->B:0<@CEGJ€= # PgQNIB:2 $#*;C494.#:932-81*@JB-*:CFJP   !)!%0+8..751(,"$)2-554-$"2:1)1-212AEB@3<@AG:  "*)%!& A?EC41573.;@;5+)#!$.123099BEC?E@;<8%) 535^p\$&*#*"0;:8+,%&,7();5.05<<:@FF@7:;  ,$ Gpp~|kVO<135"93.($"!#*-))00-0-7>72?BC>A? ".WZ@Cj~hBb|xYNC.)AWSH4!$"$.2,82;:4722+-9C   4>&$  8]hƒŠrmoWJT—zovV?2.$!$*0%78*"3AEEA ,\W9$ *.-$O\V^mj]`cr}™ДТТЧ™J14+$+%%.0+5::"(1! %3PgVUmgW^chvŒЋЂ˜ЈНЋxM&)$.*22%1>< #!  )5&#(74[hvVZwTi”˜™•ŒЉМЎoOTU4&#$":< !   ( + -8 !  )<[kg[LP~‰}ƒ™›–u]qnbcY#%""87)!)-2   $  +#GWSBU{pxДЏoJkvn{ŠrO3Q# &"8+€Ÿ !& )2-&  *#EOA]igu‚~‚tWp{qjaanZH;9.$?%$T(  ("$0.  $%*Ojz‡|oj}aYkmgqnecLGaQ9JBc^@ -&%24) %$8oz|wcWbZ^edii][U`ˆt]gYVPLZ>"-\G),  ""Adˆtdgd[``[[kb^ceodpdT]NLhtM3C4:G)8h]  #$%+A3ALhnC;F^``extdmko{m^cZVP?OEMi5) 0AT8   &*LB?H33NAJ;AUTZkvonmpkeae[]F@W^cU{q" ,"-%%  +$$+7`xPGY]nh]kwrjaŸp]wuUtŒ}dLC48)0C1".423YaN``d]djojnˆS@[\]zV+GEUjuS,393"&    1E4-;F]^vdbabmP^d\a^WQYALGGE@bZUN8!9:  ,b(€Щ 1 2NeNS[]jUhqkigPQH<@HMOUm{t’…P$!   *   8 PnbdbEhj|tmJ.BNSUZacbTYh‘•xN?>M" +)#    !&SbhW Zi‚qOI9CQNJijmqozqj{|mYb]\P[[]`mP0)B  !(1IASS8#>]db[[cm{wt{xonmkdVJQbxrd`nI   У[mZQYG?[qe[mmpmbqpo|zTObmoc\\deaWjˆh3  ўєI3  +[mkLL€ІFQCV[[Zdon]PTSPVY^MG8diU]n}…wV(   ).)#LVSI"#7.O]Y\d]rmWVZ[`\]comSU^[ent~ƒ‚T4!4   & 1nqM>FIHLQZbgdo‚I!IA>FF\vu^V\WZhop„[S?&  $*%! OicTL%:BGOJU]]\V^VTMMOPhmm^J[^Ucnhd]SI>GN+#  # "Z^OEMJMLIYVNNкPHLNSaumh\WUPSWjgSP?&#J%  єїљѕѓјљљњћ§§ўўќ§ў§ўўў§ўўќћўћўўђ§ў§ўў§§ўћ§ћ§§ўўў§ўўњ§ў§ў§ўўьэѕєљјјљњњћћўўћ§ћћ§§ўўў§ўўў§ўўћ§ў§§ўўэёхэћўёѕёѕјњчѕ§ўњљћ§§§ћ§ўўў§ўўў§ўўќ§ў§ўў§ўъ§ўўюФЌЯыѕыщыѕўўцйљ§япўў§ўћўўћћ§ў§ўўў§ўўў§ўўьяЪЫущшђцргенИЇЮлжжјўўњњ§ўў§ўўў§ў ўъьЮФрщўёСŠЖЉ{SkЇƒŠЌЅчўўўњћћї§ў§ў§ў§§ўў§ўў§ўўў§ўўс§ў§ЊЕЇЄФЉЉЕЅ{W?7:FBA7GSPv‚ЄЭѓўўў§ўўјћ§ћ§§ў§ўўќ§ў§ўўў§ўўп§mWPJVGY\P8IJ:>BCHB][AB`\IP^vŠОнўўё§њњћћ§ў§§ў§ћ§§ўўў§ўўй\YJ<4?SG.9874982"N{UB?8:Nbc^NVjŽЇаяяѕўўўћ§§ћќњ§њ§§ќћ§ћўўд§H?EAFA<<80,0+&*,+3IA@?@HSWYLQQW`aЄWg‰ЊНыўўћј§њ§њћћњћћў§дZSG7JHONIHECHGLLP\oibQ\hzYmtƒШчўўћўў§§ШWM[MP?0-,)#(&1527EIMLLJLLUOOFMOSTQOONCF\ddkYe’Ујўў§ўФ§z5:@P%"#&"!#%+,%4AGJOPPLMLGFBGMTTPUZVVUUreUh…ƒdmƒЦѓўўТM7JJ@!"%&!;BA74?:@ECE<5CIMINQMGNWY[ZPQHJ^a`grvWIOSbxАя4WI@00+("--8:;@GIPFFMUOLJQPhnZ{dZWUUZVQMSab\Wbqkeu+0+-030+)#$"$$"91@GGIIGNT\ZSJEB9ItoiYZS^a]WHGHSZ\`cY[Zgh!%!,:013+"#33*&&€‘8?AIJLCA;AFFINNLE>FEFJMIGFHJMOUS"!!+.11.*+!#&&..-54CCQOOJ<11957:5AAЅ>?CU]VJHFC9@MOICAMNILN$,*,1(,$))-&*!,*-JtWUTOO@799?@@JPQGBFSQMGEFAMUSUЌ"&-:9@?;8;<EEIG;CA9BABFJNOLF@IJFC?@@CEIQQEA@MTQQ%",47;;89?<19UTTЂOMLHBFIIGINNEH>:GIJIJHIIBGLPMMGHJC?"!!"$%).0",,159:OO]‘˜xC::@AFCIFEGJLA?8>CBGMIHIBAGGJJMM‰J@;!"#&(00503+,248+(%-3jЊЗЫЯМЃ‹|aPSL>GLIC@@B?Y”Ÿ„ˆБСВЎТАv]T?Wig]P?>FBEAAFFH€˜FGAEEFJ!$&(++!C@9734512:-2a‘ЖШЯИЕДКŸ•МУŸŠ‹mTF>-:BFBH@?GGF@@HB@@GBGB@C::>I2%"F3355с040>?;AYt‘œЄКЂЃДДТЭпмзтэж•bJBGGъ?@EEBEFAHFCE97>NE!%)((€;J3-84422157*8?ISbŽДЛЅЊКŸВЯжсгЭшљцЉ–ŽƒbICLOCH>C;?GBG238@<9)&)($!"$)-833,$#.,-3;;.1Lk–ЎЋЗЭКЋЈКЭЧеїлЄ–ЊЃ™˜iW5.::7@LmœРЭЗНдычДЕКОРЫУž\AF?>89A`H%5::8940,).7;?E;.22323:BNGQFGo‰Ž˜АЎИУУСИАЕКЖДЛОЅ•Œƒe:5H:8>9;:""%.($.,8?A>#%&7hЂТФРЋЈЇЋЋЎЎЏВЎЅžЈдР›ЋЈЉЃžo;.<<:MiV<>530(,&()((0098797&4[™ЦРАЎЌЌЋЎЎАЌЎЇЉВЕББЊЈЇЂ—ЌЎŠriY\cC*8;CV„u<174**(*-11.(,+)79>@A1@chg…ЏК›ŠЇЋВБЖММКЖМОИДЇЉЋЈ˜‘›ULo}UB??E[eF&5>972-*-245,0*,(1AMd^TVW55hŽŽŠŸЇЁЎОТОИКЛЗЋЊЋЇВx˜ББŸЈL04<09:>4BE93@,++8,155**%9?A@9@A8.TdŠЗ˜ЂАЗЖВБЖЛВЈмИЎРЛМкЦЕЅ‰bBEJWJLMLCIH?%-$&,0.$&<4:318BW3A?0Wˆ˜ЖЮЗВБВДАБЕсьСДЌДКуЏЅЅ‹zgIM9CCFFLeW9,%-&%.-)($&01.,.1HU\qC,\ŠЎЋДИАВААДЖЕСž‘ЈЇЊСЁƒ’”ЇЗУ‘b\U@4+<),1472028-&(.0)&212305+HhQ7@TeЉЗТЌЋЉЎБЉЋЉЈЈЄЃЄЇ•‘—œœ”ЋЇ‘~N8LN).4073::999<;+%++€j0!(,30..8@HEA:>2+U…ЇЗЃ5”БЧКЈ•…‹‘|‚˜ЊБЎЌЛЛЪОЇž‰]>?4@CJHE@@73124**-54+)2,,@JF@9>4))N{ЂЃ7mУзЫВВАƒvƒv‹ЖЧВВДКМбШКО›vNB;@BJ@C;:97972-%%1+%2)&#<78M>><:89;<0&*)03%%))+( $@S@4>Q>;nЈЧЎЄЋЕƒkЊЛебФШЩФРСЦЧУкзИЁ}WSBUIA:>BEBB8-.+7+.+.+#$4<8:;E:M\˜ЇžЈm””ДбЭОКЕЕКТСНБИŸ‘–Ž„h?*7AA@A?GF70.-#(&#!#$*%#(054"7;;7rœЁАСЅŠmczŸЧСžŸЕЖЛСРНЛЇ–—›ЋДАŠoMEJJAFILA7;5+).1"&(&%05A?>85c–ЊЂЊЈЃ›erˆ’žЛВЖВЗМСРЧЎЌЋЉЂАБЈŠmdP08FB?<34(.0.,"("),#$-:@@<;I`{ВВЌЏЭЌ~ˆŽ•œАДЕЗОМКЗКЕЏЎЈЌЈЇЗЭмШ}JNdH>HAB8:940-2120*(%0:<4,).153++$(.22--(CE8[•™™nu‡•…žЃЋЏЏрБЏВНСМЕВДЏЊЃЄЈЏТКЅžЈt4<>CBEBA;288ю0.)(%0$&&(5>8F’Ак”ŠœБЇЁЈАБЎЌЈЋЏТФŸœЊААЋЈЉБЗДЌДЮа˜Q.0;9;;€K983.-+&&!(WG3+$4Q‡ЋБЁ”ˆi‰•ƒ›ЁЃЅЅЈЄžЁЂžžЃЋЈЇžЁŸЈЋЉВЦЮОž]:2>A;2?53,--+!&#$$?<>4&.ALh—‘’„ˆ‡’˜ЂЈЉАББЈŸЁЇЈЇЉЊЗД™–ŸЇЎКСЫЦСŒiE;O[80089:1#$,,*+7..-**??dЉБ™‹‚ˆ•—™žЉЏАЏНx—ŸЁœ—ЈЖИЏЄЁЇБИНОШЦЋŠZ<7%)49897:98%*:SMYSUUgik]VU[eg…Џ]m‡ЈЌпўўќ§ћў§§њћ§ћў§ўўв§ўgUNFEFAJA7-31.*2887@5gVZZWaca[\YW^pŒ^kkw”ВЮўўњћ§§ў§ўўЬ§ў§ўjt\L?;9.>90*2?2:3.$>Z|ccZdoea`[T\c`\[]cd|q[~ДЩјўўў§ўўќ§ў§ўўоNPHOEA>9A:9:82$$.152LLJ]amb`WPVQUU№V`zu`U^tŽi}‰•бѕўўСћ§ћў§ў§ў][d[^I7+-2-2*"%7)*718@JVZ]`eZUSVSULG\^[PYTZUVj|v~mvЂбўўў§ўўЦ…>3NW$!*!.&-!*&&2*2.@PQU``^TYQUQNQZ]WQ]`c^^d‡th{œ•x™жўўТQBIIC(+!""$,+$!*-),4GNIITOPO:?G>HOTQUS\gbbeoo\‹Žpoj\d{Фщњўў€W|„oM9",0-"%#"()"!0>?FIIBITIAMIUYQTVSTQIN]\SVa[vmpƒ‡‡jY^kuˆКў.9--(!(! *)*$"2@MOGHMLNUJNWVVQIITouW{mc^aejg``eqrpnvz…?@47247;&)$".*(351()%NIJQSQPHMSdd[NNH;NxuqV`chrrg\WWVjoxvtnkzˆ-&*)7<;<78(0)"23>@.,+4CQSTWTLGGEVSWGGMUPVdcMPPLSGHHLQV`Wdbgcjna$$#$&%$.:8?++$3,7>.+*3<>ISSUFHEQ[TME@BBFMGMSNJJFINTPZ\UOV^a`hjm,*(*")<3?;7+*-%7$+)59:MOSZMJG*0400@;@HIAFMS[QFLQFGMQYOMSVQ[^d+*#&%+17.:2<52-7*0"#,`}`ZWUOB>:9:EBFWYGEENNJEILLAHScZWSQWZch.+,*)%,,",2&5BBCF@EJMQ?>AHIOHJMNGINWTWOVVYUa.%!%!!,109@@?B.,?48OQVSGMOPGIELUSTBE@:99BEBIJMHMPVNWOQMPQM+$*!+$*..795G59++78NMNm‰m@47@>EQIIMPOJC99<>?ABLLPOPHJIPY]TTII&&**.),:,<1?PTN?@A;48?;<9(;HqnZ\‚—‚YumWMBA]qk`NB?2CJBCEFJ@JFHGCGVMJ$1-0H748;7)FOFG8;5-<4)+Lex›‰‚‰h[b‹ЉŽ…ŽgQA909CGB;:EIFFCBBEHWSP!+"+)"%-)"E|tOE34508EE€'A\qr|}zv‚‘œВЩдзлАYEF5N9&%*+b8F4@;<(..071<>@.?CC<0!"0.!*$?:@:023+,)54&#@Pg~u‚ž…utЃ”АЮИvcpncq`P:(*3899;AF,2A?A;;)330"+(;797701+-+0.-!+&?Om|}j[i–Є‘œЕЕЏ‹m„”„t}m3#EF8ELHHЯFIJ-7380505430:>@1<48*,(,0.->?:BYcmSd‹›‰ЊУСˆ[{‰‰€K˜‰mLeJ8:@.B5I]O%40-9508:-5.@-5?HC>.&(!-88FGE5;UaZjwrˆ˜Œi…Œ‡|x‰kaZUN-:9TG:<8PuH,404:4984@1;@HTS$$%,.9@;09BA`ˆ›…xzr‚z|~td]~kAW^ztJ3#*EC4CAC.C3B>NF<7585&#-%,0A??#"#+S}ŒŠvppowxt{vxbdp‘quqrtkjP%"0CB@83227>Pp[FH933$#)#!+@8733&H|™‡zvunrtrtvtqz}{xq{ni‚‰kbWPS^4%;EFV’„B;95)"&**%&,%1<9@<5BZJG^‚aIiwwuŽ‰|z„Œ„oumkaVa^EB^wMA+AN]pQ%::;89!+1).*,,+);:A\ZVYC4,Q^P]aagcwƒ‰Œˆƒˆ~|~wnx]LcxvmŠ…>,1-3@>>8LJ;8E7+("((2#",;:?E@J0#dxqwzVz™‹‡eIUdmimrprmox—…ZNVj>,93EI?89:")).++*+0%57C5<.&;arvj.m~œ„u^F]Y>IMbq~pŒ–‰t{uN99.3A?N@<<1+32#*,%*-#*$!$9AA8771#%Eqwv0SnŽЄ”w~p@3?8Ln‰xtw…ŽˆtY>7%84;?-%&(+$..& )-C7+-74:U8Jo‘™}{oMA7Wrmwƒƒ‚Œ‘ŠŽnG+%5:C8,04+334)0(()&(!& "AN8-%C<;iŒ–}{zpQ;duŒ˜”Œ’’œ‘‰’”’ЊЄƒnVHC;C?47:A<7B2-+.-*%!#$..,+;H?JLvt`orU;][UЄЁˆ{z‚––{…p\ba^?,0599<>7<4-01-%!!$))-1->9+PkixƒiVF)Hh’rju}…‰Ž‡‡p`baiv}ZT:>G;7A?>99,+&% %$1-GA<;3Pmztqpd`F:BNYiŒ~~‚…‡ˆŒ‘pr~umvze\\G"1>7.,-+-!*1#(3-)(*>FEICVZVvxq|”zMJS`mivw~Їˆ…ƒŠ}qjrtm}’АЃk@Ga<5C0:30*,$%&.8$+*3@S<3;,:&&5(#!).-.4$BNBJaUbaC@YQPitmoov{…„ƒŒ‹ƒ~|xm`gq…‚omƒa11*5+-29-%)5!%$#.2*91!8qodiTQi‚tmz‚~{z‚{„™‘ierzvoktxwpn™™w>#58.53-5124#$cL5B3Im|}gaYE4YgTgmnmr{~kideceenkdaoxep~˜…k@!%2+)$$))##(&(&EHB82@;9jd`YC7LIdhhqut‚}reemptor‚xaajpxƒŒ—ž`I;4>C)#&)-*&,A@98,5>.L}‚hQLNYa]djpzv‚Œ]CZZSY[q‡ˆujmu|~ƒ„—”tj]A5)z&%+04552*+Eku^;3T\]\]^hnjca]WW[dt„|ijicbjwng[H2GZE0%,3>8.)7!"3ўw(џўw ўwџџўw$џwќџwwџџw џўw$џўw)џўw*џўw-џўw0џўw 5џўw8џўw:џўw;џ;џўw<џќ€џ џўћў ўљћў§ўўћ§§ўўћўўњўћўўўћўўћўњўћўўшћўўћ§њўўњ§§ћў§ћўћў§ўў§њўўїћўћўћћўћўўїћўўћўўћћўўљ§њњўћўћўўѕћўўћўўћўњњћћўћўўћўўўћў ўћўўћўўњ§ўћўўњћўў§§ћћј§њўў§§њўўўћўўћњўњ§ћњ§§ ўўњўўњћўўћћўўћњљњ§ўўт§ў§њљљњ§§њћўў§њ§љ§§љ§ўћћўўћ§§ўўјњўћўўћћўўўњўўўћў ўћ§ўћўўўњўў§њћўўћ§њўћўў§ўќћўћўўўћўўўћўўњўќњћњўўў§ћћ§њћњњ§§ўўћўўћўўњђ§њљљјјљ§њ§ћћљ§§ўљњўўћўћўўўњўўўћўў§ўњњљ§њћўўњћўўћњўў§њљ§§ўўћўўўћўўљћўўћўћўўћўўћўўљ§њ§ўўћўўўћўўўњўўљћў§ћ§ћўўќњўћўўћ ўўћўў§ћў§§ўўћўўўћўўќ§њ§ў ўўћў ўщћ§њљљјћјљ§ўўњ§§њ§њ§§њњ§§ўўћў ўћјў§ћ§§ўўњњўњњўў§њўў§њў§ўўљљ§§ћћњ§§ћћљ§§њњўўћ§§ћўўћўўі§њљўњ§њўћўўћћўўћўўўњўў§њ§њњ§§ўћћў§љћўњ§љљўўњўћўўіњўћўўћўўћўўћўћћўћјўўђћўњјљ§§њњўћћњћћє§њњўњћўћўўњўўўћўўћ§ьњћўўћўћћњ§њњ§§њћ§њњ§§њјњћљљ§§ћєљ§§ўўћўњћўћўўўћўўќћўў§§ќњ§њўўьњўўњ§§њ§ћљљ§§‘Кћ§ћ§јјќћњћўўњїљњ§ўћњўћўўћћ§јљўўўљўўўћўўќ§ћћњњњ§њљ§њ§§юњћd`Оѓћћњј§§ћўћњ§§ћўљћ§§ўўћўўќ§њћўўїћўў§љјњ§ўўюQmWNhŸє§љ§§ћњњ§§љ§§њї§ћњ§њљјљњњ§ўўћўў§ћўћћ§ўћўўєћў\]UIY[gЦ§§єћїјљ§њ§љ§љћ§§ќњ§§ўўћўѓњћћўћћўњ§њўћўўўћўў§пњSVU4<}\UvЉх§ћїјљ§њ§ћўњ§§ћ§њњ§њўўїћўћўћўўћў ўћ§њьљYNPOHW^MFAH|сњћ§§љ§§њћўўњњ§§њљ§§ћўћћўўћўўжћњ§њљњ§ў§љ§§ћћўљJNMMCCJNWFFiue•пљ§њљљ§ўўћ§§ўњўўћѕњўњўўћњўњ§ўўћћўўћўўћу§>CNJ>8?BIC5Oq>-,>?:BHTJLFEHLIIOYZQ;A|Тљ§§њњњљ§§њњ§§ ўћоў52231-,*::28NLGGFG2@?JA@wа§§ўїљљєћјјњљўўћ§ћћњњ§ўћўўм3.$-35,(321755-BG@AA>A?<HJI:75<;@C<@9<>88;3FEZY[Nnкћўћјњјљњ§§ћњ§њљ§§ўЯA38-"#%$-#1.1:49;<>@>IHFCEGBNiVQZ[UTxЯєћ§њјћћїљљ§§ћљљњўб§њ§§?!-LGH:75:(2;C?;FF>GHGE@E;;JOM?NbaS?Patp~дћћјлњ§њ§њљљ§ћњњ§ћљ§ћdŒƒB*%1.1-)3<9::ACEFLLЂOQMIJSQ>?a`A7;$@M?OŽзљљћњћјљљњ§њ§§љ§§њ§§њ^nnghI&0#!0.135;4B@FFLNTOOT\]c"?C@9BE<7BLNWЕђћћљјљћњњУћљ§§њ§љњњ[Q?NSJAL.(@:17-53;EHGHC@BEI<:1+>AA2:OEHBH>9LxЕњ§§ћ§§ўњ§§ХљYZWUV\`rVHP8BUTB;@MSTPJC><>@G<4:9>>50gVTQVr`WBFлћ§ћ§§љјј§§„e`mh`MVTYeƒxbL;,%-PNUI9HC<98<>>88>CFEYMGLPNMACLvpЧ§ћ§їїјљ§§љњњўўggmvrYYU`qx]ZQPI)(kZ47BABAC>?7<532?JWMIJMWWSNk„]F‡к§ћљњљћћ§§Фњocdm]\][Th`UhdgS#*}p-(32>@BB@??7-)3)%&+2MTUO;G^`AGPcФћ§ћњћ§§€—љ§§xucq|ЖАtPTQSPPewn‡, *&.179714;43;;><3:;$)0Ch–Яћћљјјљљ§cquuvrkmocU]e[PˆЁhL$,#.+)&,:7<8A@28@HG::BGLMF4HW^Z]Щћћљїїјї]btoqj`ekicVVm{PHZ]]cU,847PW4,40:?CG8,8?>4;3,,BELWP`Цћ§§јњ;exxnchjxj]dih\QHO]c`jpeYJE4+$#,84>:*59:?41.05@>?3GVBJ?4JЕћљњњ%Tewkhiedbhbb[WUU[YY€Q\zogr`4028A71,9BABEA;9508<@EGPNE0)#OРљћѕ &U^coh^Z\\io]\TVZNBOEWЖЪВ”}]!AWZP014?EEC@>G:A52995BPPNS[SOmп§§5M^ŠnbY[WYUSV\\THAE42+mvz~ghZ3!;+)-<3aTb{zvrŠgM>3TZVVPIPm‡ЉЎКЇ…gB5"75059;32774.9<<@941GM?M),QƒitwnG‰ЇœzF&87942+1\TUPI&# ASU]vZScm˜А„]5@ZTTUTQ>N\i„kcptea>!A7$,-:?E[ˆŠ}|…•‘o1(")*4:@E>;9:80&+:!"JwuWGc|‡UFTYZ\QCIBI4@b^n}x~rENƒz+%G*5709;:942*12:>8& >\gOUN‰™cULMIHP^[NHBUphaahWQQUrpM4!I7(,(+$"BA,-&:ўў§ўўўћўўјћ§ћ§ћ§ћў ўў§ўў§ўє§ў§ў§ў§ў§ў§ўўў§ўўў§ўўќ§ў§ўўў§ўў§ўў§ўўѓ§ўћ§§ў§§ћўў§ўў§ћў§§ўў§ўўў§ў ўћ§ћ§§ўўў§ўўў§ўў§њўќ§ў§ўўќ§ў§ўўў§ў ўў§ўўў§ўў§ўў§ўўћњ§їў§§ћ§§ў§ўўў§ўў§јћўў§ћћ§ўўў§ўўў§ўўў§ўў§эў§ћў§ў§ўћўћ§ўў§§ћ§ўў§ћћ§ћўћўўі§ўў§ћў§ў§ўўў§ў ўў§ўўќ§ў§ўўќ§ў§ў ўє§ў§ў§ў§ўћ§§ўўў§ўў§јћў§ў§ў§ўўќ§ў§ў!ўў§ў ўіћњњћћ§ћ§њ§§ўћўўў§ўўї§ў§§ћ§ўў§§ќћ§ћўўћ§ўў§ўўј§ў§ў§ў§ўўќ§ў§ўўќћ§§ўўє§ў§ў§§ў§§ў§ўўњ§ўў§§ўў§њў§ћ§ћўўў§ўўў§ўўў§ў ўў§ўў§ў§§ў§ўў§§ў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ў ўў§ўў§іћ§ћ§ћ§ћў§ў ўњ§ўћ§ћўўў§ўўъ§ўў§§ћћ§њњћ§ўў§§ћ§ћ§ћ§§њћ§ћ§§ўўў§ў ўў§ўўљћњћ§§ў§§ћў§ў§ўўўћўўњ§ў§§ћ§§љў§ўў§ћўўјћ§ћ§њўћ§§ўјћ§ћ§ўў§ўўљ§ў§ў§§ўўў§ўўњ§ў§ў§ўўњ§ў§§ћ§§ўћўўіћ§ўў§§ўў§ўў§ ўў§ў ўў§ўўј§ўў§њћћ§§ўў§ўўќћ§§ўўњ§ў§ў§ўўў§ўўў§ўўјћ§ћ§§ў§ўў§їўћ§§ўћ§§ўў§њљћћї§ћ§њћћ§ћўўў§ўўў§ўўў§ўўњ§ўћ§ћ§§§ў§ўў§ўћ§§јњћћ§ћ–Кўўяњ§§њ§ўў§ўў§§ў§ћ§ўўђ§ўў§ћў§ў§ў§ў§ўўљ§ў§§њћ§§ьўћ§ћ§ћ§ўhd…Цѕўў§§ћ§ўўњ§ћ§ћћўўќћ§§ўўї§ў§ў§ўћ§ў ў§§ў§§ўў§ўўї§SjZSpЄ§ўўўњ§§јћўћ§ћ§ћ§§јњ§ћ§ћ§ћ§§ќћ§§ўўќ§ў§ў ўё§ў§ў§OjVJdgi~Ъўўњўћ§§їћњћ§ћ§ћ§ў ўў§ўў§ўў§ўўшћ§§Yb]5Fƒ‡c]}Џюўўћњћћ§ћўўќћ§ў§§§ћ§ўўњ§ў§ў§ўўќћ§ћ§§№ўZ[YUNYdQOFNƒщ§ўў§ѓћў§ў§§ћ§ћўћ§ўўў§ўўљ§ўў§§ћ§§ќў§ћўўяPSYQMHILVBJnzj•чўўќћўћўўјћ§ћў§ў§ўў§ў§§ћўўў§ўўў§ўўтћ?L[WQJOMF>TTNUPbЈзўўјљњњћњ§§ўў§єўћ§ћ§§ў§љњ§ўўњ§ўў§ћўўыBHSMOTUOGHMJFYW`iˆЗьўўў§ћћь§ў§§ћў§ў§ў§ў§ўў§ћў§ўўћ§ў§§ўўч§ћHGFBEGEECCMMx™^9@V9J‘тўў§ћњћћњў§ћ§§ўўќ§ў§ўў§ћ§њњќ§ў§ўўпћ§ћў§ўўMGIGHEGHNJ?OЈ@1JSHB9[Џ§ўўљ§њћў§ћўў§ўћўўўћўўў§ўўп§ў§§ўHGFGEC@BFM?P|?7IFOZaNhrYuЅѕўўќ§ћ§ћћќњћћ§§ў§§ћ§§ўрћў§IIF;EBA>?EP^{N)ABFISP?WcMUНўў§ўћ§§ђћў§ћњ§ћ§§ћћўў§§ўсFGC>@FG<;BBFPNLEGJOQOOT``T@F|Чўў§§ўћ§§іћ§ћ§ћ§ћ§§ў ўпJA;;>C@?;@?ACAFACCOPAEG?8;?QAEйўўћ§ўњ§ўў§ў§§ўм§H@?;<<:>8;@?AFIIC;?<;@M[ZOLgvзўўўњћћљ§ћў§ў§ўўа§ўћў§ў§ўў§ћBBABFA@;9;<>BIGC?@@B?HFCBGILNEBQZgИљўў§ў§ќћ§§ўўе§ћ§§:9A@BB?:48>;5>;3:<8;@BHHACEAELEQ[ghƒЌ§ўўњћ§ћ§§ўўћ§јћ§ћ§ўўћ§§и38??@;??7;319;89EHCBB>ABCB?AC;<;>:;A@ACEEGBBEJICBTp]]`bY\еўўў§њњћ§ўў§§дћjIPbk]JA>AJAEFIJCEFCLHABAECINL@Ugh[@Um|qйўўњ§ѕћ§ћ§ћўћў§§ћћб§њЊЭДmJ@JG;H}БўўСћ§ћ§ћ§ћ§ћ§ћ§ћЅЂŸЂ™–Аx]jSU^^E@HWZZQG@<25ABC?8>B<:5d^WW]x\SCHсўўС§ћћ§§ћ§ћ§ћ§ћЏЈЗЎЎž–ЃМЃz^O;L:[a^PAIE94:@@>??BHIJ`SMMOUN@IP}wЫўў€љћ§ўћ§ћ§§ў§ЕДЛОЗЃž™ŸЋМЂŒ…m]?0Ha8EGFC@AA;>9;:9BC@EE@>@B;:5144.;9T\[O8Nce;HQmЮўўњТ§ћћў§ћЕЏБЗОчыЗœЂŸЃЂЎЗЎШЕT+7J?89847378:959;?bv[UOI@SGILTUe^‰ђўўљћњћњ§§ЉЉХЋЇИРШМЎЄœœЅЇ„kЅЌr27T80-58.3?9<>>CG;FBA@<7CB5!+-3@j›еўўћњ§ћћтЈЊДММЛИЖСЖЎЋБЭмЉcеуРžzH51,:@;;ц7<>CC<>>BGM?77JNH@9AAIUQThYIhiЉхўўСћ§њЊФЧЛМОУФЦЪСАЎДДАЇЅЊАКБЗЉЋ{^VHB@>>;7>>:5QdUeЫўў§€ѓwЖЮЮМИЖМННЏКБЏАЉЃЃЊЋБДФЕЅ‰i^UB:98;?;81424@@;:?@@EB8?EQCF:1PМўў§љQЏОЮИИЗДВДЖКЕЌЅЁЃЂЃЇЅЂРВАА‰P4EFJC8289>?>FHC??;>CFCJOPJ8&VЩўў§38\ŸАЖЗВЏЌЊЏЗБЏЄЂžžœ”ЄєўяеТ’JVdc]@>BEJJCCB>@7598>CJLMMTaZPrцўўN9Iq˜ФЕЈЉЇЉЉЈЅЃЄЂ›™˜‘—|ДИЧШАЃ‰S4G?HGE@>702.:8;;AFFЉBILQUQW`rзў@1BBP—УЗЈЋЋЊЂЃЄЋЊЂœ›—ЗБАЏЈАЉЋуж—QJM7>>?A?95EPPTMPQQgjN{щ:98:GQ›ЦЌŒžЃЃ€юЈЏЌЉЃ••’{’•ЌЅЇЖДЩФИБ›YBJVPMLFFHNGBCEHHLJNNMMQOMH>‹40#13ASt”~~ЁНААЊЗРЎŸŸŽŠŸ™™ŸЄЊЊСЭдуЦ”[8ISTNA2:>BH?899;BNPSPSbQAC$+12CF83zЈЈФННМШжИžŒz’ЂЁЃЅЅЈŸИЫтщђнФЁgL5JE88:49;58374<@A@.8TPCQ(++3AF-#uММИФЗВ—УкжЦ–iŠЄЇЇЄЂЄАРзтЗ‘œА–qH8@755.3329:95;9881YY…UJ*(5:A@*8Z~›ЋЗЄ—ЉКпяЯЊ„‹žЁЇЌЊ›}n˜ЁБЪВЎИМВ‘ZHSM;47.0:>E?C?0?9INQ`r1782403F>Pp–ŸЋЎЋЊОебЇ„ƒœŸŸЁž™”–‰ˆЂЫЪУРФбаŸZC@2-%&,1;<>349PУЧЏЄВМлФ”˜žЃЁž˜˜•––˜МСНИКЊМА—xTYoT<039<>;98:>AI97B4452487558@AwНТЇ‘ЋКЮЦœЃЃЄЅЃЄЂ”’‘„’АЋДКНЩН‚ŠШЉSGZ8559;2-3:<<;@CB?*(#9AA-,5*0mЇЎ–••ЩаœЄЄЁЁЃЁ–•›ЖВЇЎБЅ–—›МИŽTJ7SA<7,#%*#JGG;@?ўњ§ў§ў§ўўў§ў-ўў§ўўў§ўўў§ўўў§ўў§/ўњ§ў§ў§ўў§;ў§ўќ§ў§ў ўў§ўўў§ўўќ§ў§ўўј§ў§ў§ў§ўўњ§ўў§§ўўў§ўCўў§ў=ў§іћў§ў§§ўў§ўўњ§ўў§§ўўў§ўўў§ўўќ§ў§ўўњ§ў§ў§ў!ўќ§ў§ў ўў§ўўќ§ў§ў*ў§љў§ў§ў§ўўў§ўўі§ў§ў§§њ§§ўўю§ў§ў§ў§ў§ў§ў§§ўўћўўќ§ў§ўўў§ў ўњ§ў§ў§ўўў§ўў§§ў§§ћў§ў§ўўќ§ў§ўў§ўў§ўўќ§ў§ў ўў§ўўў§ўўўћўўћћў§ў§ўўў§ўўќ§ў§ўўјћў§§њў§ўўў§ўўђњћћ§ћў§ў§§ћў§ўўњ§ў§ў§ўўћ§ў§ў§§ќўЅШўўўњ§§ўў§ў ўќ§ў§ў ў§њћ§§ў§ўўѕ§ў§ў§ў~v˜дўўќ§ў§ўўќ§ў§ўўў§ў ўў§ў ўњ§ў§ў§ўўљi…geЗўўѕ§ўў§ў§ў§ў§ўў§§ў§§ўў§§ћў§ў§ўўіpi^twx”мўўљњў§ў§ў§§љў§ў§ў§ўўў§ў ўъ§ўk{qHS˜ž{q•Лљўўћўћў§ўўј§ў§ў§ў§ўўь§ў§ў§ўnpjaZkzm\YZёўў§ўќ§ў§ўўў§ўўі§ў§ў§ў§ў§ўўяYehdZ[aijVZŒzЅјўў§ўў§ўўў§ўўў§ўўфS\baTZac\SemiiguЗчўўћ§ћ§§ў§ўўђ§ў§ў§ў§ўў§§ћ§ў ўў§ўўыJ\``Pagh[^^[`pjp~žЩћўўќћўћўўў§ў ўў§ў ўў§ўўч§ўPWTGJNTSVW^^ƒАkPVjC\ёўўўћ§§ўќ§ў§ў ў§ќћў§ўўў§ўўчJVQWQPLZ^]IeМ—YH^ebTJk•Уўўћ§ћў§ўўќ§ў§ўўу§ўSVZTPTJSZZGc’QI]abjtaŠtŒАўўњ§ў§ўћ§§њћў§ў§ўўј§ў§ў§ў§ўўс§ўPUJNMJGMON`p]?PZabg`Okvhh”аўўі§ў§ў§ў§ў§ўўј§ћћў§ўћўўў§ўўсTMAIHMHJFFGNdc^a]``[[genwcSWŒйўўў§ўўє§ў§ў§ў§ў§ў§ў ўюJFFBCIEHNHFITPU\VbbѓTOZVCQYbQV‘щўўѕћ§ў§§ћ§§ў§ўўў§ў ўнJHCEE?FCGFLGLNNPV[][VZOMSZaoqgcxŠуўў§ќћў§ўўк§ў;EFLE@BEBGJTUYZUOPTW`W^YWW`ehaVbn}Тўўў§ўўќ§ў§ўўж§ў§ў5@EF@C;<7IFBICEJTPIMUSY[]hu;\`ZWVS[NZeioСўўљ§ћћ§ўў§§ыў§ў§ў§ўvqQWi]Q]IANJEGGрINPJPILFJOQJBO77W`Y\PehgZ\LJ\Сўўф§ў§ў§ў§ў§ў§§qmhjhnp„hQVNV`bOOр[\ceVHAFLLOQUSMQPYMononpiVUэўў§§ў§§Цў§ў§ў§ўru„|rcimmw‘‰m`JAHCankaH\YMJIHOLJMTZ`]whdagcdT\c—‘пўўњ§ћ§ўў§§ўŠ{‹ƒrjou‡—ngoaWA.GŒm>PVWNTMIJIMCHS`cqagbenrmk…žt]žюўў§ћћ§§ў§ў§ўƒ~u‚~tnjdrucuzu\;FŠLCHNMVOLIIJJAFE@>@EBJBJLJLNv”oh^Y`i]d^hivg˜ўў€€ћ§ћ§§ўxpw}t„Ÿƒ|kbgejT:t~[%.S9#5;<1EGHHLJQNQI]UTOPLUTV19<;QzЊпўў§ћ§§ћўt}‚„ˆˆ{w‚{pq{–Ѕn-cЁК™ue@3:.GB<;@FFEPNNMPO\Y\LQb^ab@\kxoqлўўСћўћўur~ƒˆ|z||zoqv„ЋŠcintqpoALJSgnHGECHGPMHCIHHBEGMMA?-JJNVY@HPN]wdqеўўСћўS~”‚|x‰‚z~vpoaahtpz„ƒqWSPE:@F8@CGANMCJLJIGMNVTTVZPmZ^S@YЪўўСћEcr‡Ž‡|xwr{„|pjgeirioapŽ‚„‡qE1GMNSJ;HGJJMOTJQGLI]YYad]`LF.gжўў€0J{tz‚wtmr}‡redkjbUY\nЫнЭД‹r:TnpnNENPVTQIQHLHCGLP`^badhxjd…їўўV9;]p‘}vt|xtkjmmncYaT^[Gi‘’ŽtuwJ>WOEILQF>:4CAGEOPWWYa`gdpjgq‚хў9+.;8h‹‚pqtwrgmotm\`bh}~z{}zЛЇwPNJ;AJSHHMMT]aedjddi„a‹ї44944>u–}Zhnnioxvq`VMHFVWppo‚ƒ”‰ŒMANbSTWPMSWOSLVSVVebb`bdk`eTЁ+,99NcOOjƒxqp}ŒridMTcY\biqir—ЂЉУ›uN4QWZ\ICHGJPNFQC[UdbcchuoSW2(2:AE1$ZmctŠ„‚œzbI:ShiodhdqŸЗНкР•zSN:OJH9CBACJBJ?JJVWWAFdkVd.0->IG+"g”ˆ‡ŒŠ|]žЗЎ^5QPgnm^]htˆЃШˆaexgW?8L<:@E>:>?I@I<7G1*5?gŒŽwnxƒЊƒZ[ighk\WOV`[dŠŽ’wpm\IWneE:3@@?JHGEFLTGFS-25<3;<;59?;W‹„e^t”–mgbjmhhZcY\OWrw‚™•›ŠYU—F>[AC:F?@B<82.OOLGNN€ўw=џўw;џўw:џўw9џўw4 џw2 џў€0џўw.џўw+џў€*џўw&џў€%џўw#џўw!џў€ џўwџў€"џўw#џў€$џў€&џўw(џўw*џўw,џўw.џўw/џўw 0џўw 1џў€ 5џ 4џўw5џўw6џў€7џўw9џўw:џ:џ:џ:џ:џ:џ:џўw;џўw=џ§wџ=џўwџ~џўў§§ўўћўўўћўў§§њ§§іљњњћљ§ўћўњњі§њћўўћ§§ћўўўћўўўћўўў§љљ§њќўћћўўя§љјњїєљњњљўўњљ§§ўўў§ўўј§њ§њ§њњћћћўњўћўў§ўўћ§§ўљћўћћўћўў§ѕњ§§љљјњ§ўћўўљ§њ§ўўћўўћјјћњ§§њћўўїћњњћўўћ§ўў№њўўћўўћўћўњњ§ћўњњ§ўњўќћўў§§ў§ўћ§љї§ўў§њ§њ§ўўўћўўњњўћ§§ўўў§љљўцњ§§ўћўў§њњ§њ§ўњњ§§ўћўўњњћўў§њ§ўўѕ§њ§§њўў§§њ§§ўћћўў§ћћўўћўўїћўњ§ўў§ћўў§ќў§§ў ўіћњћћњћ§§њўўѕљњњ§§њў§њ§ўўч§њљњћ§ћўўћўћћўћњ§ўњ§њ§ўћ§§ўњ§ўўњўў§іњћљћљњњћћўўўћўўў§ћћўў§§ўўћўўўћўўўћўўўћўўї§њњ§§њњў§§ўўћўў§ўіћ§ўўћўўћћўў§ќњўўћћўћіњљљњћћ§§ћ§§љњћћјњ§ўўўћ§§ўњў№§ўћўўћўћ§§ўћўњћўўћ§ї§§ћћђјњ§ћ§њ§њ§љљ§ћўў§ўї§њ§њћћ§ћўўѓћўћўћўњћљ§ћћўўћћњљ§ўўћћўў§ўўћўыћ§§њўћўћўўћћўћњћљ§ўћў ўєћўўњњљљў§њњўўє§њљњ§§ћћњ§њ§§ўћўўћўіњўўћ§њњ§§њњш§њ§љјњ§њљ§ћ§§ћ§ћ§њ§љјћљћћўў§§ўєњ§§њўўњљћљњўў§§њўўћўњ§ўњ§§ѕљўўћљ§ўўћњўўњ§ћєњљў ўјћњ§§ўўњћћќљћ§ўўўћўўћўјћўњћўўњўўўњ§§іњ§њљћўњ§§ўўўћ§§юћљљ§§ў§њљўўњ§ћљћ§ћћ ўїћўўћўўњњ§§ъўњњљњњ§§љјїљ§ўў§њ§§ћј§§њћѕјўћњ§ћљњњћўўіћўћўњњ§ўћўў§љ§ўўћіўћ§§ћћњ§§ўўљ§љ§§ћћљљ§§ћўўћћљ§§љ§§ўћўў§ўў§ў§§њўў§љ§ўўћ§ў§љљћљљ§§ўўіњљћјљ§§ћњ§§ўќћўћўўќњ§§ўў§ўњўў§ћњ§њћўўў§ўўћјўћ§§њ§њўўќњ§§ћћќњўћ§§њі§њ§њўўћћў§§ќўћ§ўўє§њ§§њ§§ўњ§§ўўчћњњ§§њўўћћўўћћ§њљћћ§њ§њћўўўћўў§§љ§њњ§їўћњљљ§њ§ўў§ћў§§јћўїјјљљ§§ћњўўћўўњњ§њ§§ўўћў§ўўћўўўћўўќ§њћўўўћўўђњ§§ўўњ§§њ§§њњўўњ§ћїєљ§§ўђћўў§§њўўћўћўћўў§ћњ§њћў ўњћўњљљњњў§љљў§ўўє§ћљ§§ћ§њћћњўўёћўўћњ§§љјљ§§љњўў§ћљ§њ§ўўћњћљљў ў§њљ§§њљўўўћўўњњ§ўўћўўљњў§§ўћўўўњ§§њќћјјљљћў§ўўўћўўњјљњљ§њњћўў§ћњўўўћўўњњ§њњћўў§љљњ§§ўў§§ў§ўїћў§ўўћўњ§§љў§§њ§ћњњў§ўўњњ§њ§§ўўњ§ћћ§њ§§ўњњ§§ўћўўѕљўўћўўњњ§њўўўћўў§§њљљќњ§§ўўўћўўјћўћў§§њ§§ўўћўўњ§ ўўћўўњ§ѕљ§њ§§ўћўўћўўљњћћ§њљ§§ўўћўўќћ§њўўњў§ѕўћўћўћњћћўћћўўњ§§ѓљњ§ўњњљњўћћў§§ўњўўњєўћћўћњўўћўћўўќ§њ§ўў§ыњўћўў§њўўњњјњњўў§њўў§§ўњ§§љњћњћљљ§§ёўћўњ§§њљ§њљћњ§ўўћј§њўўћњ§ўўўћўўї§њўўћўўћўўђ§њњўњњћњњћљ§ћўў§њўћьљћћ§љњ§њћљљњ§њљњљљњљљў§ўўћўћњ§ўћ§§ћњ§§њўўћ§ўћўўљњ§ћўўћўўљћ§§њ§§љљќњ§њўўћ§ћўћ§§ћ§ћњ§ўњўўїћўў§љј§њўўњњ§§љњўўх§љ§ўў§њ§њ§ўћћўњћћљ§њ§§њ§љћ§§їћў§њ§њўўћћ§њћјјћћњўўћћўў§§њњўћўљўў§њ§єљњ§ўўћўў§ўћўў§њ§їњ§ћљљњ§§ўўљї§ўўљњў§§њњ§ўьћў§њјњ§ўўљњњўў§њ§ћў§§љњ§ќњ§§ўўўћўўњћ§љћ§§њ§ћўўўћўўўћ§§јњ§њ§њ§§њњў§њљњњ§ьњ§ўў§њ§ћљљ§§њ§§ћ§§њўўђћњњ§њљћљћљ§ўў§§ўї§љћњњ§њњ§§ѕњћўў§њўўћў§§ќњ§њ§§њћўћњ§ўўўћўўёћўў§њ§њ§ўћњ§њ§ўў§ўќћ§§ўў§њљћћљћ§§ќљ§њ§§§ћњўў§ќњћў§§№њ§§ў§§ўўњ§§њћљ§ўў§ўњ§§ўїњ§§ћћњ§ћўўњ§љсћњ§§њњўўћњљљ§ў§§њўљ§њ§§њ§§љѕњћљљћњ§ўўњ§ўўћўъ§њњћњњ§ўћў§њњљњ§§њћћљ§§юњўўћўўњћ§§ў§§ћћ§њўўђљњ§ћўњ§§њў§њљћћљ§юўњ§њ§ћћўў§њњ§јњћ§ћћэљћ§§ў§ўўћћўўћўћўћћўў§§ћљљќјћљћћ§єћў§њўўњћ§§њўўѕћўњћћјљћљћ§§їћљ§§ћњњ§ўў§іњ§ћўћњ§њћўўћіўћўў§ўљ§њ§§§ўћўўўћ§§њ§ћњ§§ўќћ§§ўўѕћ§ћљћ§§ў§§ўўљ§њ§ўўћўўўћўўы§їљ§љљјјљњњ§§ћўў§§ўћўў§ўћўўћљў§§њ§§ўўћ§ћўњ§§ќњ§њўў§ћќ§љњ§§ќњ§љ§§іњ§њ§ўћћўћўў§ўњўўћўњњ§њ§§ўўіћўўћўћўўњ§§єћ§ўњњ§љ§§њ§њњїўћћўњљњ§ўўцњ§њ§њљјјѕїјљ§њјћљћћј§ўўћћўў§ћ§љљћљњ§њљљјћћј§њљјљ§њўў№§љјћ§ћў§§ћћљћљњ§§њћљњ§ў§§ўў§§ў§ђў§§њћљћјљљћњњ§§ћќљћњћћћњ§љљ§§юњћўћћў§њњ§ўћћњћў§ћћљљћјњћ§§ўўюћ§ўњјјљљћљјћњ§ћћњћћѓљћћњ§њўњњ§ўћўўф§ћћљћљњњўў§§ћћљљћњњ§§ћћљћњњўўћіљњјјћљћј§њњъўљјћћљїјјћ§§јјљљєћћљћљљёћ§њљћћљљ§§њ§њ§ўўэћ§јћ§ўћћ§ћјљјјљ§њљњњ§ўўљљцјћ§§љјљ§§љћ§њ§ћў§ћ§њўћ§§ў§§лњ§ћњњїњњјћћјјїјљюљћњњ§јћљћњњљ§§њ§њњ§ўўѕљњ§љ§њўўћўћћїўћ§њ§§ћћњњъ§љћћјњљћњћћљњјњ|шћљњћ§§њђ§ћћњ§њ§§њ§ћ§§ћћђјћ§ўў§њ§њ§ўўњљљњљћ§њўў§§ўђњ§њ§SiРћћјјњїљљљјєјјљћњњ§ћњ§§§ћјїїјљ§ћ§њ§њ§§ў§ўњћћ§ћєў§§UVƒ§§ћјљћћљтћљћљ§љњњ§њ§љћўў§љњћ§ћўўћњ§§њњ§§ўњ§§цњ§љ§ўў§љљћ§§ўўU9:Зљ§љїћљљ§§ўљћћјљјњћўўњ§§ќћљћљљїјљћ§§њ§њ§§ўў§ўўэ§љљјјљ§ўmkSnцљћјљћљљќ§њјћћьњјћ§њ§ћљљћљћљћљћћљљћћїјљ§§њ§њљ§§љјњ§њљ§њ§ўў№]\J?pю§ћїљњљњњ§ћћіјљ§§љћљћњ§§њњ§њўў§§јњљјјљњ§ћћќљ§§ўўњы§њўNMI]r˜јљћјљћјћњ§§њњљћ§Йњћў§љњ§јјљњњљњ§њ§љћћ§њљћ§§њљљњњ>23G7<•ј§ћјњјїјљљјљјјљјјљјљїћўњѕјїњљїјћљљћћљњћљљјћјјљљјѕљљќїјјљљўћ§ћ§§ўўў§ўўќ§ў§ўўќ§ў§ўў§§ў§§ѕћ§ћ§ў§§њћ§ўў§їћ§ўў§ўћ§ўўќ§ў§ўўў§ўў§ћќў§ћ§§ўў§ўўў§ўўў§ўўћјњљњћћ§§ўўњ§ћћ§§ўў§ўў§§ўў§ўўіћ§§ўў§ћ§§ўўў§ўўњћ§ћ§ћ§§ћ§ў§ўњћ§ћ§§ўўћ§ў§§ўўћћў§ў§§ўћ§ў§ў§§ќћўў§§ќћ§§ўў§ў§ќћ§§ўўјћ§ћ§ўў§ўў§ћ§ћћўў§§ўћ§ў§ў§§єўћ§§ў§ў§ў§§ћћў§ќћ§§ўўўћ§§ўћўў§ѕў§ў§§ћў§ў§ўўѕћ§ћ§§ў§§ћ§ћћ§ў§ўў§ўўў§ўў§ћћў§§ўўќ§ўћ§§ќћў§ўўї§њњљћћ§§ўў§јћ§§ўћ§ћўўєћ§ћ§ў§ўў§ў§ўўќ§ћў§§ўћћ§ћў§§ќћ§§ўўѕћ§ћ§њћњћ§§ўўћ§ўў§ўўќћ§ћўўќ§ў§ў ўќ§ўў§§ўћ§§іў§ћ§§ў§ў§ўў§ў§ ўћќ§ў§ўўрњћљћћ§ўўћ§ў§ћ§ћ§ћ§њћ§§ћў§ўў§ћ§§ўў§§ў§§§ў§ўў§§ћўўќ§ў§ўўь§ў§ћћњћ§§ћўћ§ћ§ћў§§ўўќћ§ћўўі§ўћ§ћ§њњћў ўћ§ћћ§ўўњ§ў§ћћўўў§ўўќћў§ўўў§ўўў§ўўі§ў§ў§ўћ§§ўўћ§њћћўўў§ў ў§ўјћ§§ў§ўћ§§ћћ§ўў§§§ћ§ўўў§ўўў§ўў§ўћ§§§ћ§ћћі§ћ§ў§њ§ћўћћњ§ћћњћўў§юћ§ўў§§ћ§§ў§ћњћ§ў§ўўњћ§ўў§ўў§§ћ§ћћ§ў§ўўўћўўњ§њћљћўўў§ўў§ђћў§§њћњћњ§§ў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўќћ§ћ§§ў§ўћўў№§ћ§њћћ§ћўћ§ўў§§ћћ§њћўўў§ўўў§ўў§јћ§ћў§§ћ§§ьћњћћ§§ўћ§ћ§њ§ћ§ћ§§ћњњўў§ћћ§§ў§ўў§ўћўўњ§ў§ўћўўў§ўўя§ћњњ§ћ§§ўў§ћ§ћћњћћ ўљ§ћўћ§ћў ў§ўћ§§ћўў§ћ§ўў§ўў§ўўрћ§§ў§§ћћњћћ§ћў§ў§§ћњњћћ§ў§ћ§ћў§ўўю§ў§§ћ§§ў§§ћ§§ў§§ћ§§ўќћў§ўўћ§ў§ћјњћ§ўў§ћ§§њћ§ћ§§ўў§ѕћ§ћ§ћўў§§ў§§ќћ§ћ§§ђћ§§ў§ў§§ћ§§ў§ўў§ўћћ§ћ§ўўќћ§ћ§§іћўў§ўўћ§ћўў§љћў§ћњњћћћ§ћ§§ўў§§ў§§ўћўўў§ўўћ§ћў§ўўњ§ўў§§ўўў§ўўў§ўўі§ў§ћћў§§ћ§§ќћ§§ўў§ўњћћћ§ћў§ўўіћ§§ў§ў§ў§ўў§ћћ§ћ§ўўў§ўўў§ўўў§ўўќ§ћћ§§ћўћїўћ§њћ§ў§ўўѓ§ў§§ћћњћћ§ў§ўў§ћ§ћћѕ§ћў§ў§§њћћўўђ§ў§ўћ§ћўћ§§ў§ўўў§ўў§ўј§ў§ўћ§§ўў§ўћ§§њћњўћў ўњ§ўћ§§ўў§ўќ§ў§ћћ№§ћћў§§ћ§ћ§§ў§ў§ўўљћ§§ў§ў§§ў§ўћ§§ћћ§ћћ§§ўћўў§њћ§ћ§§ўўю§ўў§њћћ§ћ§ћ§§ў§§ћўўў§ўўў§ўў§ў§§ў§§ћ§њћў§ў§ў ўўћ§§ћћ§ћ§ўўў§ўў§ќћў§ўўў§ўўќ§ў§ўў§јћ§ўћ§§ћўўю§ў§ў§ў§ўў§§ўћ§ћў§ўўљћ§ўў§ў§§§ў§ўўњ§ћћ§§ў ў§ѓћ§ћ§ћ§ћў§§ћ§ўўѓћ§ћ§ћ§ћ§§ў§ў§§ ўќ§ўў§§ђў§§ћ§§ў§ўћ§§ў§§ўў§§№ў§§ћ§ћ§ћ§ћ§§ў§њћћь§ћ§ћ§ћ§§ў§§ћ§§ўћ§ўњ§§ёў§ўў§§ў§ў§§ўў§ўўў§ўў§§ў§§ўў§ўў№ћ§§ў§§њљљћћ§ўў§ўў§ўћ§§ўў§ўў§ћў§§ќњћћ§§іћ§ћ§§ўћћ§ўўў§ўў§§ўћ§§њћ§§ў§ўўі§ў§ў§§ћў§ўўѕ§ў§ўў§ћ§ћ§ћћўў§§ўц§ў§ўћў§ўћ§ћ§њћћ§ћ§ћ§ћў§ў§ўўћ§ўћћ§§ў§њћ§ћ§§ўў§іў§§ўћ§ћ§ћўўў§ўў§єћ§ћћњ§ћ§ћўў§§§ў§ўў§§ћњњ§ћ§ўў§јћ§ћ§§ў§ўў§ўћ§§єћ§ў§ћў§ў§ўћўўњћ§ћ§ћ§§љћ§ћ§ћ§ћћ§ўў§ћћўќ§ўћ§§ќћ§§ўў§ў§ўў§§ў§ћ§ћћ§њћ§ћ§§ўў§њўѓ§ћ§ў§ћ§ћў§ў§ўўў§ўўіћ§ћ§ћ§ћ§ћ§§љў§ў§§ў§§ўћ§§ќў§§ћћ§іћўћ§§ў§ў§ўўќ§ў§ўўљ§ў§§ћ§ћћёњћ§§ўћ§ћў§ўћўњ§§ћћ§ћ§ўў§ўћ§ћ§ћ§§ћћ§ћ§ўўћ§ћў§ўўў§ўў§ўў§§ћў§§ћўўќћ§§ўў§ћњћў§ћћю§ћ§ћ§њ§ўў§ў§§ћ§§ў§§ђћўћ§§ўў§ћ§њћћўўшћ§ћ§ћ§ћ§ўў§§ћћњњ§§ўў§ў§ўўќ§ўў§§јћ§ћћњ§ћ§§ўў§ћћќўћћўў§јћ§ћ§ћ§љћћњ§ўў§§ ў§ўў§§ў§ђћ§ћ§§ћњћћ§ћ§§ўўќ§ћћ§§ћцњ§§ў§ўў§ћў§§ћ§§ўћ§ћћњћњћў§§ќћўћўў§ќћ§љћћњїћњ§ћўћў§ўўќ§ў§ўўў§ўў§§ўћћњзћњћњ§ћўў§§ўў§ў§ћ§§ў§ў§ў§§њћ§ћњћњ§ћ§њћћ§ў§§ў§њћ§ћ§ћ§§ўќ§ћ§ўўў§ўў§љўћ§ћ§ћўўњ§ўў§ћ§§јћ§§ћ§ћ§ўў§§ћўўћ§ћћў§ў§§ўў§ўў§§ўћћљ§ћћњњћ§§ћћў§ў§§§ў§ўў§јћ§ўў§ў§ўў§ђћ§ћ§ўў§§ўў§§ћ§§їў§ў§§ћћњћћ§ћћ§ћ§ћћљ§ћ§ћ§ћўўђ§ў§ўў§ћ§ћ§§ў§ўў§ћћ§ћ§ўўў§ўўі§ў§§ћ§њ§ў§§њћ§ћ§ћ§§ўћ§ў§ћўў§ѕћњњљљњћћ§§ћћќњ§ћўўў§ћћњ§ћж§њћњ§§ў§ћћ§§ў§ў§ћњћћўў§ћћњћњћ§§ћ§ћ§ћ§ћ§§ў§§јћ§ћўћ§ћўў§іћўћ§§ћћњ§ћћ§њћ§ћњњћћ§§ћњњѕ§ћўў§ћ§§ў§ўўўћ§§ўљ§ўўћћњћћњіљћћ§ўў§ўў§§њћєњћњћ§§њћ§ћњћћќњ§ћ§§ўю§ў§§њћћњћ§§ў§§ћћњћћ§їћ§њћћњ§§ўўњљ§њћњ§ћ§§ўћ§ћњћњњћ§ћќњћњћћњњ§§ўњћћ§ў§§њћўўіћ§ў§§ћ§§ў§§їћўўћћ§њ§ћћў§ћћъ§ћўў§њ§§ўў§ћўћ§ћ§ћњљњљљњјћњњљњћїўўѕ§ћ§њћњ§§ўћ§§ўћўўў§ћћў§ўў§ћўњ§§ћ№њћњњћћ§ћњћљњљ}эўўќњ§ћ§§њ§щћ§ћўћћњћњ§њ§ўўћ§ћ§ћў§§ћћ§ћ§ўы§ћ§ўў§ў§§ћ§ћUqЦўўњњљћћљњћњњћњ§§јў§ћћ§њњљљћњћ§ў§§ќћ§ћўўѓ§ў§§ћ§њћњ§ћ§ўўњ§ћ]\„ўўљњћћњћњћћ§§ў§§ўј§ўћћљћћўў§§ћ§§фћ§ћ§ћ§ћ§ћўћў§§ћћњ§ћў§[;4Оўўћћњўћ§ћўњњєћ§§ўў§§ћ§ћ§ћћёњћњ§ћ§ћ§ћ§ћў§ў§§пў§§ћћњњћ§ўumZmяўўњћњћћўћ§§ћњћљњњ§§ўњћћўњћћўњћћњњћ§ћћ§§ѕўћ§ћўћ§ћ§ў§§ўѓeiQ@wѓўўћћ§ў§§ёњћњћњњћ§ћћњћњ§ћћ§ўѕ§ћ§§ћњњћ§ћњњьћ§§ў§ў§ў§§ћ§§UQQ^t—ўўјњћњ§њ§ћ§§ћсњћћ§ћ§ћ§§ў§§ў§ћ§ћћљљћ§ћ§ћћњћћ§ћћ§ћ§јG?;L;Bœўўёњљњћ§ћў§ћ§њћ§§ћћў§њћўњћћћњћ§њћћњћ§ћњћўќ§ў§ўўѕ§ў§ў§ў§ў§ў§§ў§§ў§ўўў§ўў§љў§ў§ў§ўўћљўћў§ў§ўўќћў§ўўў§ўў§ћў§ў§ў ўў§ўўќ§ў§ў ўї§ў§ў§ў§ў§§§ў§ўўќ§ў§ўўљ§ћ§§ў§ўўў§ўўў§ўўў§ўўњ§ў§ў§ў ўќ§ў§ўўќ§ў§ўў§ўћўўњ§ў§ў§ўўў§ўўў§ўў§ўќ§ў§ўўі§ў§ў§ў§ў§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ў ўў§ўўў§ўўќ§ў§ў ў§ћ§ў§ўўњ§ў§ў§ўўў§ўўќ§ў§ўўў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўі§ў§§ћ§ћў§ўўў§ўўў§ўўє§ў§ў§ў§ў§ў§ўў§ўў§ўўќ§ћћ§§ўђ§ў§ў§ў§ў§§ћ§§ўўќ§ў§ўўў§ўўў§ў ўі§ў§ўћ§ћ§§ўўў§ўўў§ўўў§ўў§ ўќћў§ўўў§ў#ўў§ў ў§ўћўўј§ў§§ўў§ўўў§ўўў§ўўњ§ў§ў§ўў№§ў§ў§ў§ў§ў§ў§ў§ўў§ўћћў§ўћћўќ§ў§ўўќ§ў§ўўќћ§§ўўќ§ў§ўўў§ўўў§ўў§ћў§ўќ§ўћ§§$ўј§ў§ў§ў§ўўў§ўў§§ў§§ўў§ўўњ§ўћў§ўўњ§ў§ў§ўў§ў§ћ§ў§§ў§§їў§ў§ўћ§§ўўњ§ўћ§§ў!ўј§ў§§ўў§ўў§ћўћ§ћ§§ўњ§ў§ў§ў ўў§ўўў§ў ўў§ў ўў§ўўј§ў§§ћ§§ўўј§ў§ў§ў§ўўў§ў ўќ§ў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўўњ§ўћ§ћўўі§ў§ў§ў§ў§ўўњ§ў§ў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўј§ў§ў§ў§ўўў§ўўў§ўў§ўіћўћ§ћў§ў§ўў§ўў§ў ўў§ўўј§ў§ў§ў§ўў§њћў§ў§ўўўћўўў§ў ўњ§ў§ў§ўў§љў§ўћў§ўўўћўў§ўћўўі§ў§ў§ў§ў§ўўњ§ў§ў§ўў§ ўј§ў§ў§ў§ў ўў§ўўћ§ўў§ўўђ§ў§ў§§ћў§§ћ§§ў ўњ§ў§ў§ўўќ§ў§ўўўћўўљ§ў§ў§§ўўў§ўўў§ўўђ§ў§ў§ў§ўћў§ў§ўўњ§ў§ў§ўў§јћў§ў§ў§ўўў§ў ўќ§ў§ўўј§ўћ§ћ§§ўўј§ў§ў§ў§ў ўў§ўўњ§ў§ў§ўўў§ўўўћўўњ§ў§ў§ўўў§ўўў§ўўў§ўўћ§ў§ў§§ў§ўј§ў§ў§ў§ўўќ§ў§ўўќ§ў§ўўќ§ўў§§ўў§ўўі§ў§ў§ў§ў§ўў§іћў§ў§ў§ў§ўўљ§ў§ў§ў§§§ў§ўўў§ўўў§ў ў§ ўў§ўў§ћ§ўњ§ў§ў§ўўў§ўўё§ў§ў§ў§ў§ў§ў§ў§§ ўў§ўў§§ў§ў ўў§ў ўє§ў§ў§§ћ§ўў§ў ўє§ў§§ћў§ў§ў§ў ўќћ§§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўє§ў§ў§ўћў§ў§ўўќ§ў§ўўњћўћўћўўњ§ў§ў§ўўў§ўўі§ў§ў§ў§ў§ў ўњ§ў§ў§ўўѓ§ў§ў§ўћ§ћў§§ўўќћ§ћўўў§ўўј§ў§ў§ў§ўўњ§ў§ў§ўўќ§ў§ўўј§ў§§ўў§ўўў§ўўђ§ў§§ўў§ў§ў§ў§ў ўє§ў§ў§ў§ў§ў§ўўъ§ў§ў§ў§ў§ўў§§ўћ§§ў§ў§ўўў§ўўњ§ў§§ћ§§ўў§ўў§їў§ў§ў§ў§ўўў§ўўђ§ў§ў§ў§ў§ў§ў§ўўў§ў ўњ§ў§ў§ўў§ўў§ўўў§ўў§§ў§§ѕћў§ў§ў§ў§ў§§ўќ§ў§ўў§§ў§ўўў§ўўњ§ў§§ћўўј§ў§ў§ў§ўўј§ўў§§ў§ў ўћ§ў§ў§§ћў§ў§ўў§ўљ§ў§ў§ў§§ћ§ўћ§§ўў§ў ўј§ў§ў§ў§ўў№§ў§§ўў§ўћ§§ў§ў§ўўіћў§ў§ўћ§§ўўќ§ў§ўў§љћ§ћўћў§§§ў§ўўћ§ў§ўћћ§ўћ§§ќћ§§ўўњћў§§ћ§§ќћ§§ўўў§ўўњ§ў§ў§ўў§ўћ§§ћћ§§ў§§љў§ў§ў§ўўі§ў§ў§ў§ў§ўўў§ў ўј§ўњў§ў§ўў§§ў§§їўћў§ў§ў§ўўў§ўўјћ§ћў§ў§ўўќ§ў§ў ўўћ§§ћ§§ў§ўў§ўќ§ў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ўўъ§ўћ§ћўћ§§ў§ў§ўћў§ў§ў§ўўњ§ў§ў§ўўњ§ў§ў§ў ў§§ў§§ќў§ў§§љў§ў§ў§ўўќ§ў§ўўь§ў§ўћўћ§њћћў§§ћ§ћ§§ўўўћўў§ўћ§§ќў§ў§§іћ§§ў§§ћў§ўў§ћўц§ўћ§ћ§ћў§ў§ў§ў§ў§ў§ў§ў§ў§ўўў§ўўў§ўўќ§ўћ§§ђћў§ў§ў§§ћ§ћ§ћ§§ўќ§ў§ўўќ§ў§ўўў§ўўљћ§ћ§ћ§ћћ§ў§ўўт§ў§ћњ§ћ§§ўћў§§ћўћ§ћ§ћ§§ў§ў§ў§ўў§ўћ§§ўќ§ўћ§§єћў§ў§§ћ§§ў§ўўхњў§§ћ§§ў§ў§ў§§ћ§ћўњћћў§§ћ§ћћю§ћ§ћ§ћ§ћ§§ў§§ћ§§ў§§§ў§ўў§ўјћ§ў§ћ§§ўўќ§ў§ўў§ѕўћўћў§§ћў§ўў§ўў§ўўї§ў§ў§ћњњћћў§ћћќ§ћ§ўў№§ў§§ћ§§ў§ў§ў§ў§ўўњ§ў§ў§ўўј§ў§ўћ§§ўўэ§ў§§ћћњ§ћўћ§ћћњћ§ўўљ§ў§ў§ў§§љў§ў§ў§ўўљ§ћ§ћў§ўўќ§ў§ўў§ўќћ§§ўўќ§ў§ўўј§ў§ўbƒбўўћ§§ћўћћ§§ў§ўў§№ћ§њ§ћў§ў§ў§ў§ў§ўўі§ў§§ћ§§ў§ўўњ§ўqt—ўўђћ§ћ§ћ§ћ§ћ§ћ§§ўўќ§ў§ўўћўј§ў§ў§ў§ўўњ§ў§ў§ўў§ў№rJIЪўў§ћћ§§ў§ўў§§ўш§ў§ў§ўћ§ћ§ћў§ўћ§§ў§ў§ў§ўўў§ўўђ§ў§ћћў§ў…ƒj§ўўяћ§ћ§§ў§§ћ§ћћњ§§ў§§ўћ§§ыћ§ћ§ћ§ћ§ћ§§ў§ў§ў§ў§ў§§љў§ў§ў§ўўњwriVƒўўъћ§§ў§ў§§ћ§ћ§њ§§ў§§ћ§§ўўќ§ў§ўўѕ§ў§ў§ћћ§§ў§§ўѕ§ў§ўccbu‡Ћўўўћ§§ўў§§§ўћ§§іћ§ћў§ў§ў§ўўч§ў§ў§ў§ћћў§ў§ў§§ћў§§ћў§ў§§їўTOM^JNЈўўћіњћ§§ў§ћ§ћ§§§ў§ўў§ќўњ§ћћ§ћћ§ћ§ћћ§ќњћћ§ўўћўўёћ§§ўћў§јљ§ўў§§ўў§ўћ ўњќћ§њ§§љўћћўўћўўћњ§ўћўў§ђљ§ўћўў§§њњ§§ћўўњяћ§§ўў§љїљ§§њњ§§њўўўњ§§ќћўў§§ўљћ§§ўўњўўћўшћўћ§§ћћ§њ§§ўў§ћ§њ§њ§§ўњ§§ўњўўёћњњ§ћњћ§ў§§њ§§ћћљљћ§§њ§ўўљћњћў§њ§§ўњўўўњўўј§њњћў§њћћљєўњњ§љћњўјљљ§§ўўћўўєћњљ§ў§§њњ§§ўўћєљ§§њљ§§ўў§§ўўњ§љ§ўўўћўўьћўў§§њ§њ§њњ§§њ§§њ§§ўўћўњ§§њўўў§ўў№ћўўћ§§љ§ў§љљћћ§ўў§юњ§ћўћњњ§ўўћћўўћўњљљњћљћ§њўўќ§њ§ў ўѓћљњ§§ћњљњљњ§ўўћў§ўў§§ўјћћ§љћ§§ўњўўє§њўў§њўћњљњўў§њљћ§њ§ўў§њљ§§ыўњ§њњ§§ў§§ўўњљљњљљћћ§§ўћўўѓ§ѕљћљўўњ§њћ§ўўїњ§јљњћ§њ§§ўљ§§њў§їњ§§ћўў§ћўў§њўћі§ўў§њўў§§ўў§ћ§ѕњ§§њњ§§њћћўўў§ўў§њ§ўњ§њћў§љ§ўўќ§њњ§§єњ§љљ§ўў§ћ§ћўўћћў§љ§§ћ§њ§њњё§ћјћћњ§ў§§њ§њћўў§ўўћўўіћ§§ћљћ§ўћўў§јњ§§њњ§њ§§јњ§ћћ§њњўўѕћ§§ўљ§§љњ§ўўўћўўјљњўћў§њўўѕњћ§љїњјћјљ§§њіљјєїєѕћ§њ§§њ§§ўњњїў§љјјњљњўўћћўўћўўяњ§њњљ§§њўћўћў§ўў§§љћ§ўћў§§ўўћ§§ўњ§§ўќљў§ўўўњўўўћ§§ћ§ўћўўўћўўњўќњ§§ўўћћўўћўўмћў§њ§§њ§њ§ўўјјћћјјњљћ§њ§§јћјјћњњўћў§§ўїћњ§§ћњўў§§њ§§ў§§ўј§ћћўћўў§§ў§њњ§§ўћўўћў§њљ§§јљћћ§ўўћўў§§њўў§ћњўў§њњ§§њљ§§ёћўћўў§њ§њ§§њ§§ўўщ§њўў§§ћ§§ўўњ§њўћў§љ§ћў§§§ўћў ўўњ§§ўў§љљ§њ§ўўћќўњћўў§§ўћўўё§њўћў§§ўћў§ўћў§§њ§§њўў§ў§њўўћўўяћўћћў§ћћљ§ћњњ§§њўў§њј§§§њ§ўўўћўў§ ўћўў§ўўћ§ўћўўћњ§§њ§§љўћўћњњ§§іњ§ћ§§њћўћўўїњљњ§§њљћўўў§ўўїћњ§љј§ћў§§ћљ§њ§ўўї§њ§њ§њўћ§§§љњ§§њњљјћћўў§ћњ§ўћўўяћ§§њ§њ§њљњ§§њћљ§њњњў§њ§§ўўо§њ§ћј§њњћў§њњ§ў§њљ§§љ§њ§§њ§њњўў§§ўўћ§ў§њњ§§љ§ўўћћ§§њўўјњ§љњљћ§ўўєћў§њ§љњњ§§њ§§ћјњњћўў§ўњћћ§ўњ§§ўўћўўњћўўњњ§§ќљўњ§§ќњўњўў§ћў§§њњљњњ§ўў§іћўўћњњ§ўћўўўћў ў§њњ§њ§ћўўўњўўњћ§§ўћўўњћўў§§ўўћњ§ўўњ§њњў§ўўўћўў§§њўўї§ћљћљ§ўў§§ќћљњўўлћљ§ўћўћў§љ§њњ§ћўўћў§ўћўў§ўћ§њ§љљћ§§њ§§њ§ў§ўњ§љц§ўў§ћњћўў§ўћњљћњћљљј§ћўўћўўњќ§ўњ§§ўўћўўћєњљћљћћљћљљњ§§ыњ§§ћљљњ§љњў§§ћјљљ§ўў§§јњћјљљњњ§§ћљћ§§ўўњћўљ§ §§ћў§ §юњљ§ўўћўўњ§њњљљћ§ћљљћј§ћ§њўњ§јјљљћ§§ћўњ§§јћљ§њ§§љ§§іњ§§ўћћ§њћўўјћ§§њљўўњњ§ўћћўў§ўўєњћљћљњ§§њ§§ўў§ўч§ўўћњњљ§ћўўњўўћў§єљ§§ўўњ§§њ§§њ§љљђћњњ§ўў§ў§§їњћўўу§љ§§ўљјћћ§љњњ§ўћўўћћњћћњћўўћ§§љњ§§ћћј§§љћјљ§ћљћћќњљћ§§њ§§њ§ў ўќ§њ§ўўјћўў§њћљ§§іњ§§њ§њ§§њ§§ўљћћ§њўћўћћўўћ§њљ§њњ§ќњ§§ўў§ћј§њњ§ўўћўўќ§ў§ўўњћўўњњ§§ўњўўљ§ў§ў§ћєљћњ§§ўўњљљњ§§ўљ§ћљ§њњ§§ўўњ§§їћљњ§ў§§њ§§ѕљ§ўўћћњћћ§њњ§ќј§§ћћ№љјљ§§њњ§ћ§§ўў§§ўўљћ§§њ§§љљјћ§ћљњўў§§њћў§њњ§§ўњ§§ѓњљ§§ћўўћў§њљћћіљњ§ћљ§ўў§ўў§њў§ўўњњ§ћљљ§§љ§ўњћўў§§ўў§ўњўўўћўў§ўј§љљ§ўў§ўўѕ§љњњјїјћњ§ўўњ§ћ§ўћњњ§§ћўўј§ћўћўћ§ўўњђ§ћўљ§њ§§њњ§§љ§§ўњ§§љыћ§ўў§§љљ§њњљћўў§§ћћў§§ќњўўћћўљћўў§§љ§§ѓњ§§љћ§ўћўљ§њ§§љњўњ§§њўўў§ћћљљјћ§ўўћўўх§ўћ§§љљћћљљњ§ўўњ§§њњљњ§§ћ§ўў§їљћћњ§љ§њўў§яћјњљњњўћўўћў§ћјћ§§ўћ§§њїўљћћљњ§њ§§ўњћўћўў§§њњ§§њјљљѓњ§§ўў§ћћў§§ћљљ§яњћћњњ§њ§њљјћјјљљ§§ўўћњњ§ёў§њћљњ§ћў§§љћљћћ№њ§њњ§њ§њ§§љ§њњў§§ћњ§ћњ§§їњћњњљљњњ§§хћўњљїћљљћ§љјїѕјћљњўўњљљћћњ§§ѕњ§§њ§§ћўўћўў§ў§њћ§њ§њ§§ўћўїњљћјћћљљћћёњћњ§њњ§§њљ§ў§§ўўњ§ќњћў§§ўњ§§љўќћјћ§§ћўљ§§ў§њ§њў§ўўя§љћћ§њњўў§§ўўћ§њ§§шћўў§њњ§њ§§њ§§њћў§њ§ћћ§§ўўь§њўў§њ§њњ§§ћћљ§њ§љљћћўіћўўњ§јћћ§ўў§§ў§§ћљ§ћјїїћ§§ўњўўў§ћћ№ј§§љњѕљњљћ§§њ§љћћќў§њ§§љќћ§§ўў§гљ§њњўў§њ§њ§§ћљ§§ћћњљїјћћ§љјњїїљњјњјћ§ћћљћљљћўўј§ћљљјјњћћїљјјћјњћњ§§ќћљњјјєїјљјњњјјћљњјјћљћћ§њњћћ§ћћњњ№јћћўћ§§њ§ўў§§ўў§§ўћћўњњ§§јљћ§њ§§њ§§ьћњ§њўњљћћљљћљ§§ў§§ў§§ўўћ§§іћїјїјјћ§њ§§жњ§ћћ§њ§ћјјљ§§њљ§ћўљ§§љњ§ў§ћћљћњ§њ§§ћ§§ћјњўўћўњ§њ§§њ§§љћљј§ўњ§§ќњ§љ§§яњ§§ћ§њћў§њ§§љ§§ћ§§ўј§ўћ§ћјњћћ§ѕњўљњјњљљћљћћћљјјљ§§ћљјњјјћљ§§њ§ѕњљћћљњњљњ§ўў§њљћћљљћћ§§њ§§ьњћљњћћљјјњњјњњїљїљїњњјчњљљ§ћћљћњњјїїљњљћћљјјўњњ§§ўљ§§ў§њ§ћћјњ§љћ§ћћјјъњјїјљћћјњњљћ§§њ§§ћ§§ћјјнњљћћњњ§§њњўћ§љљў§њњћ§ўўњ§ћ§њ§§њљјћ§§ўћњњљђћњїјїљћљїїњћћ§§ѕљ§§љћћњ§ћљћћњўћў§§ћћєљњњљћћљћњ§§ћћњ§њ§ћљњњѕјњњјћљљїїљћћљ§ћ№§њ§ћўў§ћљ§њ§ћјљ§§јўњ§ћњ§њ§§њї§њњ§љњњћ§§ѓљћћјјњћ§ћљћћ§§ўїњ§§љ§§њњўўѕ§њ§§ћћљљ§§ўўўћ§§ђћўўћњўњў§§ћљћ§§ћљћўњ§§ѓў§ћљњ§ўњ§§јћњњќћўћўў§єћўњ§ўћ§ћљћњ§§ѕћљћћљјјїјћљљ§љёњљћљљћљљ§ўўњ§ћ§§ў§ћ§ўўї§њћћўў§ћўўќћ§§ўўў§ўў§їўћ§ћ§ћ§ћўўў§ўў§ўћўўў§ўўєћ§ћ§ћ§§ў§ўћ§§§ћ§ўўѕ§ў§§њ§ћўў§ћћ§§ћ§§њћ§ўў§ўў§§ћ§ўўќ§ћ§ўў§§ћўўў§ўўў§ўўћ§ћњњ§§њћў§ћњ§§ћљў§§ћ§§ўў§јћњ§ћћўћ§§ўћњњјћњћ§§ћ§ўў§ќћ§§ўўѕ§ў§ў§ўћ§ўў§§њћў§ћћњ§ў§ћћќ§ћћўўў§ўўў§ўў§§ћ§§ўћ§§ќћў§ўўќ§ћ§ћћўћ§ћў§ўўі§ў§ўў§§ћћўўў§ўў§њћ§ћ§ћ§§ќћ§ћ§§ўћўўў§ўў§ўўћўўќ§ў§ўўњ§ћўћўћћ№њ§§ўў§ћ§ћў§ў§§ћўў§ћјњћњ§§ў§ўўј§ў§ўћ§ћўўў§ўў§ћћљћ§ў§§§ў§ўўф§ў§§ћўћ§ћ§ћ§њћњћњ§ћ§ћ§ћ§§ў§ўў§ў§ўѕ§ў§ўў§§ћћњ§§ў§ђўћћ§ћ§ћў§ћ§§ћ§§щћў§§ўў§ћћњњћћ§ћ§ўў§ўћўћћўљ§ћ§ў§§ўўў§ўў§эћљћћ§ћ§§ўћ§ћ§§ў§ўћ§§јћў§ўћў§ўўј§ўў§ћ§§ўўљ§ћњћћў§§эў§§ћў§ўћ§ћћњ§ћ§ћ§ћ§§ћў§ўўі§ўћў§ў§§ћ§§ѓћ§ћ§ћ§ћ§§ў§§ћћўќ§ћ§ўў§№ћ§ћ§ћћў§§ўћўћў§ўўѓ§ћ§ћ§ћ§ћўў§ћ§§ћј§њњ§ћўћ§§ў§ўћўўў§ўўћ§ўў§ћћ§њћўўњћ§ћ§ћ§§њћ§ћ§ћ§§ьњћћ§§ў§ўў§ћўў§ћў§ћ§ў ўљ§ўў§§ў§§ўэ§ўћћњљњњ§ћћ§ћ§§ћњћљљћў§ћћ§§ћў§§їўћћњњљћ§ўўў§ўўў§ўў§јћ§§ўћ§§ўўљћў§§ћ§ћћ§ћў§іћў§ўћ§ћ§ћ§§ўўћўўў§ўўё§ћ§њћћ§ћ§ћў§ў§ўў§§ў§§љў§§ћ§§ўўќ§ў§ўўћ§ў§ў§§ѕћ§ћ§ћў§њњћњњўљћћњ§ћ§§ћњњ§ўќћ§ћўў§ћі§ў§§ћ§ћ§ћ§§њћўћ§ћўўўћўў§§ћ§ўўќ§ўћ§§ўћўўђ§ў§ўћ§ћ§ћњњ§§ўўјћ§§ў§ў§ўўњћ§ћ§ћ§§љћ§ў§ћ§ўў§њћ§ћћ§ўў§іў§§ћњћ§ўў§§ўєћўћў§§ћ§§ў§ўўш§ў§ў§ў§§ћ§ћў§ў§§ўћћ§ћў§ўўњ§ўћ§§ўў§ўћћ§§ў§§ћў§§ћ§§ў§єћў§§ћ§ћ§§ў§ўўі§ў§ў§ў§ў§ўўєћњњћћў§§ћ§§ўў§ќћ§ћ§§ўў§ўўќћ§§ўўј§ў§ў§ў§ўў§§ў§§ў§§ћ§§ѓћ§§ў§ў§§ћ§ћ§ћћ§§ў§ўўј§ўў§ћ§§ўўњ§ўћў§ўў§іћ§ћў§§ћ§ў§§сў§ў§ўћ§ћ§ћ§§ўћ§ћ§ћў§§ћ§ћ§ћ§ћ§њўўўћ§§ўќ§ўћ§§їћ§§ћ§њћћ§§ўў§§ћўћћ§ћњ§§ўўћ§§ћўћ§ћ§§іћ§ћ§§ў§§ћўўў§ўўўћ§§ћћ§ў§ўўѓћ§§ў§ў§ў§§ћљћћўќ§ў§ўўјћ§ћў§§ћ§§єћ§ћ§ћ§ћ§љљњўўї§ў§ў§§ћ§ўўјћ§ћ§ћ§ћўўц§ў§ў§ў§§ћ§ћў§§ћ§ћ§§ў§ў§ў§ўў§єћ§ћ§ћћ§ў§§ћўўћћ§ћ§ўў§ўћўўў§ўўє§ў§ў§ў§ў§ўћ§§ўў§ўўј§ў§ўў§ћўў§§ћўўў§ўў§ўў§§љў§ў§ў§ўўшћ§§ў§§њћњћћў§§ћ§њћ§ў§ў§ўўўћўўћ§ў§§ў§§ўќћўў§§ћћњ§ћ§ћћ§ѓћў§§ћў§ў§§ћ§ћћ§ћўћћ§ўўјћўў§ћњ§ћћ§ўќ§ў§ўў§іћўў§ћ§ћў§ўўн§ўў§ћњћћњћњћћ§ћ§ћ§ћ§ћ§њћћ§ћћ§ўћћњ§ћћѕў§§ћ§§њњћћ§§ѕћ§ћњћћўў§ў§§оњћњћћ§ћ§ћ§ћ§ћ§ћ§ўўћ§ћ§ћ§ћ§ћ§ћ§§ўћўў§ћњњ§њћћўўћїў§§ћ§§њњћћїњ§ћў§§ћ§ћћ§іћўћ§ћ§ћ§ћ§§ўћўўњћ§ўў§ўўї§ўў§ћ§ўў§§ўћўўњ§ўћў§ўўц§ў§§њћњћ§§ћ§ћ§§ў§ў§ћћ§§ўћўў§ћў§ўў§§ўћњ§ћў§§ћћ§§ћ§§љћ§ћ§ћ§ћћўњ§§щўћў§§ў§ўў§ўћўћ§§ћћњњћў§§§ў§ўўю§ћњ§ўў§ўћ§ћ§ћ§ћћњћћя§њ§ћ§њћњћњћ§ћњ§ћ§§јћ§ћ§ћ§ћўўў§ўў§ў§љњћ§ћ§ћ§§њћ§ћ§ћ§§ќћ§ћњњјћ§ћ§§ў§ўўќ§ў§ўўќћ§ў§§ўћ§§ќћў§ўўљ§ћћњњћ§§ўњћўћў§ўў§ьћ§ћ§ўў§ћћўћ§ћ§ўў§§ћўўфћ§ћ§њћњћњ§ћ§§ў§ћћ§ћ§ћў§§њћћ§§њћ§ћ§ћўў§ћћ§њћ§§§ћ§ћћ§ўћўўћ§њћћ§§ўћ§§ћјњћћњћ§ћ§§јњ§ћўў§ћўўљ§ўў§ћ§ћћўњћћ§њўћ§ћў§§њћ§ћ§ћ§§§ћ§ћћўїћ§ћњњћћ§ћћ§§ўћўўўћ§§ўћўў§љњћћ§ћ§ћћ§ў§ўћўўќћ§§ўўќ§ў§ўўљ§ўћ§§ўћћ§ђўћў§ўћћљљњљњћ§§ўћў§іћў§ў§ў§ўћўўђћў§ў§§ћў§ўћ§ћ§§њћ§ў§ћ§§ѕћ§ћћњ§§ўћ§ћћ§ў§ўћўўћћ§ћ§ўўў§ўўћј§ћ§ћ§ћ§ћћў§іћ§§ў§§ћ§§ўўћўњћћ§ў§ўўћћўў§ћћіњћћ§ћў§§ћ§§јў§ћ§њ§§ўўю§ћћ§ћ§ћћњћ§§ў§§ў§ўў§јћњњљћ§§ўўў§њњї§ћ§њ§ћ§§ўўђњћћ§ћ§ћ§ћ§ћ§§ўўў§ўўњћ§ћ§ћ§§ћљ§ћ§§ўћўўќћ§њћћљ§ћ§§ћњ§§ћќњћ§ћћ§§ћўў§ўћ§§яњћ§ћў§§ћћњћњћњ§ћ§§мћўћ§§ўћ§ћ§ћў§§ћћ§ў§§ћћ§§ћ§ћ§ћў§§ћћњћћюњљљњњћ§ў§§ћћњћ§§ћ§§ћћ§ћ§ўў§јћў§ўћ§ћ§§іћ§ћ§ћ§ћ§§ўўћ§ў§ћњњћ§њћњњї§ћ§§ћћ§ћ§§ўћўў§јћ§ўў§§ћ§§їћ§ћ§ћ§ћћўўю§ў§њћ§ћ§њњћ§ћ§ўўћ§§ўћ§§№ћў§ўћћњћћ§§ўў§ћўўєћ§ћ§ћ§ћў§ўћ§§јћ§ћ§§ўў§§ћњћћ§ўў§ўў§§ќњћћ§§ћјњћњў§ў§ўўс§ћ§њћћў§ў§ў§ўћўћ§ћўў§њ§њћњ§ћ§§ўўўћњњ§ћјљјјљћњћ§§ћњјўћ§ћ§ћ§ћћќњ§ћўўїћ§ћўћ§§ў§§ћђ§ћћњњјљњћњ§ћњљљіјљњљњњ§њњћћ№њў§ўћњћћњњљћњњћњњѕљњ§ћ§ћ§њћљњњў§њњќћњљњњїћљ§њњћњњ§§ћњљњўё§ћ§ћўў§ћўў§ћ§ћўў§ћ§§ћ§ћћ§іћ§ћ§ћ§њ§ћ§§ћўњћћ§§ўћ§§цћў§ўћ§ћ§ћћњњћњњћћ§ћ§ћ§ћћњ§§њћ§цўћў§ўћ§ћ§ћўћњњћњ§ћ§ћ§њ§ћћ§§ўќћ§ћ§§їћ§њћ§§ў§ћћ§ќћ§ћ§§ћх§ўўћ§ћ§ћ§ћўћ§ћ§ћ§ўў§ўў§§ўћњњѓћњћћ§ћ§§ў§§љћћњђћњћњњћ§ћ§њћњљњњћ§§ћ§§№ћ§ћ§ћ§ћћњћљљћ§ћўў§§ћњњ§ћњћћ§љњћ§њћћњњ§љњљљїјљјњљљњљњњкљћћ§њћћњљњњљљјљћњћћњњў§§ћ§ћў§§ћ§§ў§§ћњњњ§ћћњ§њњьљњћњћњљљћњ§ћ§ћ§њ§ћћњњћљћћњ§§љћ§§ўў§ўў§јњ§ўў§§њ§§іћ§ћњњ§ћ§њљљћїњљљњћћњћљљњќ§ћ§ћћњ§ћћњ§ћћњўю§ћћњћњћ§§ћћњћњ§ћ§њњ§ћњ§§§њћљљ§њљњњћјљћћњњћњћћє§ћ§њћ§§ћў§ўћћ§ѕњ§ћ§ћ§ў§ћћ§§ќћ§ћ§§ћљљњ§ћ§ћћњњэ§њћњћћ§ћў§§ћ§ў§ћ§§ўў§ёћњњћћ§ћў§ўў§ћ§ўўў§ўўєћ§њћњ§ћ§ћ§њћћъњћ§§ћ§ћ§ћўћњћ§ћўў§ћ§њ§§ўѕ§ў§ўћ§ћ§ўў§§эўћњћњ§§ћ§њћњњћ§њћњћћћў§ћ§ћћ№§ћњћћњћћ§§ў§§њ§ћўў§ўўќ§ўћўўў§ўўў§ў ўў§ўўњ§ў§ў§ў ўў§ў ўњ§ў§ў§ўўў§ўўў§ўў§ў§іћ§§ў§ў§ў§ўўќ§ў§ўўќ§ў§ўўў§ўў§§ў§§ў§§ў§ўўќ§ў§ўўњ§ў§ўћўўћ§ў§ў§§§ў§ў ўњ§ў§ў§ў ўў§ўўј§ў§§ћ§§ўўљ§ўћ§§ў§§ўў§ўў§љў§ў§ў§ў ўћ§ў§§ўўў§ў ўќ§ў§ў ўќ§ў§ўўі§ў§ў§ў§ў§ў ў§§ў§ўўў§ўў§ќћ§§ўўќ§ў§ўўў§ўў§њћ§ћ§ћ§§ ўў§ў ўі§ўћћ§ў§ў§ў ўў§ўўј§ў§ў§ўћ§§љў§ў§ў§ўўў§ўўў§ўўќ§ў§ўў§§ў§§§ў§ў ўќ§ў§ўўњ§ў§ў§ўўђ§ў§ў§ў§§ўў§ў§ўўєћ§ћ§ўў§ў§ў§ўў§ћќў§ў§§ћў§ў§ўўќ§ў§ў ўќ§ў§ўўќћ§ћўўў§ўўў§ўўј§ўћ§§ў§ўўќ§ў§ў ўђ§ў§ў§ў§ў§ў§ў§ўўў§ўў§ўє§ў§ў§ў§ўћў§ў ў§ћў§ў§ўўј§ў§ў§ўћ§§ўќ§ў§ўўў§ў ўњ§ўћ§§ўўь§ў§ў§ў§ў§ў§ў§ў§§ћў§ўўў§ўўќ§ў§ўўў§ўўћ§ўћћ§§њў§ў§ўћћљ§љ§ћў§ўўќ§ў§ўўў§ўўњ§ўћў§ўўќ§ў§ўў§ўќ§ў§ўўќ§ўћўў§ўћ§ў§ў§§ ўі§ў§§ћў§ў§ў ўў§ўўќ§ў§ўўњ§ў§ў§ўўћў§ћћє§ћў§ў§§ћўћ§ўўў§ўўќ§ўћўўі§ў§ў§ў§ў§ўўў§ў ўќ§ў§ўўќ§ў§ў ўћ§ў§ў§§ўў§ўўђ§ў§ў§ў§ў§ў§ў§ўў§§ў§§§ў§ўўў§ўўњ§ў§ў§ўўў§ўўў§ўўќ§ў§ў ўќ§ў§ўўћ§ўћ§ў ўў§ўўў§ўўў§ўўў§ўўј§ў§ў§ў§ўўў§ўўњ§ў§ў§ўў§ўќ§ў§ўўј§ў§ў§ў§ў ўў§ўўў§ўўњ§ў§ў§ўўі§ў§ў§ўћў§ў ўњ§ў§ў§ў ў§ўј§ў§ў§ў§ўўў§ўўќ§ў§ўўљ§ў§ў§ў§§ўќ§ў§ўўѕ§ў§ў§ў§ў§ў§§§ў§ўўў§ўў§§ў§§§ў§ўўї§ў§ў§ў§ў§§љў§ў§ў§ўўў§ў ўј§ў§ў§ў§ўўў§ўў§ќћ§ћў ўы§ў§ў§ў§ў§ў§ў§ў§ў§ўћ§ўўќ§ў§ўўњ§ў§ў§ўўі§ў§ў§ў§ў§ў ўњ§ў§ў§ўўў§ўўќ§ў§ўўў§ўўњ§ў§ў§ў ўў§ўўў§ў ўў§ўўў§ўўў§ў ўў§ўў§ў§§ў§§ўў§ўўњ§ў§ў§ўўў§ўў§§ў§§§ў§ўўќ§ў§ўўў§ўў§§ў§§ўўћўў§§ўћ§§ўќ§ў§ўўќ§ў§ўў§ўћ§§ѕћ§§ў§ў§ў§ў§§§ў§ўўћ§ћў§ўўѓ§ў§ў§ў§ў§ў§ў§§ўь§ў§§ћ§ћ§§ў§ў§ў§ў§ў§ўўђ§ў§ў§ў§ў§ў§ў§ўў§§ў§§ќћ§§ўў№ћўњў§ў§§ћћ§§ћ§§ўўъ§ў§ўћ§§ў§ў§ў§ў§ў§ў§ў§ўўў§ў ўќ§ў§ўў§§ў§§ў§љў§ў§ў§ўўў§ўўќ§ў§ўўў§ўўў§ўўў§ўўќ§ў§ўў№§ў§ў§ў§ў§§ћ§§ў§ўў§ўђ§ў§ў§ў§§ўў§ў§ўўќћ§§ўўі§ў§ў§ўў§ћўў§љћ§ћ§ћў§§ѕў§ў§ў§ў§ў§ўўќ§ў§ўў§§ў§§№ў§ў§ў§ў§ў§ў§ў§ў§§ћў§ў§ў ўњ§ў§ў§ўўњ§ў§ў§ўўі§ўћ§§ў§ў§ўўќ§ў§ўўєћ§ўў§ў§ўў§§ўўє§ў§§ћ§ћ§§ў§ўў§§ў§ўў§їў§ў§ў§ў§ўўє§ў§§ћў§ў§ў§ўўў§ўў§љћў§ў§ў§§єўћ§ћ§ћ§§ў§ў§§ўў§ўўў§ўў§ќўћ§ўўў§ўўў§ўўў§ўў§ќў§§ўў§јћ§ўўћ§§ўўњ§ў§ў§ўў§єћ§§ў§ўћў§ў§ўўў§ўўў§ў ўў§ўўќћ§§ўўі§ћћўњћћў§ў ўўћўўќ§ў§ўўў§ўўѓ§ў§ў§ў§ў§ў§ў§§ў§§ў§ўўў§ўўќ§ў§ў ўѓ§ўў§ў§ў§ў§§ћўўњ§ў§ў§ўўќ§ў§ўўјћ§ћ§§ўћў ўњ§ўћ§ћ§§ўї§ў§ў§ў§ў§§ўє§ў§ў§§ћў§ў§ўўј§ў§ћћ§§ўў§ћћ§§ў§§§ў§ўўѓ§ћ§§ў§ў§ў§ў§ў ўў§ўўі§ўћўћ§§ў§ўў§шћ§§ў§ўћ§§ў§ў§ў§ў§ў§§ћў§ўўљ§ў§ў§ў§§ўь§ўћ§ћ§ћ§§ў§ў§ў§ў§ў§ўўќ§ў§ўўў§ўў§љў§ў§ў§ўў§ђћ§ћ§ћўћўњ§ћ§§ўў№§ў§§ћў§ў§ў§ў§ў§ўўў§ўўј§ў§ў§ў§ўўќ§ў§ўўњћ§ћ§ћ§§ўћ§§њњ§§ў§ўў§§ў§ўў§§ў§§№ў§ўў§§ў§ў§ў§ў§ў§§ў§ќў§ў§§§ў§ўўј§ў§ў§ў§ўў§ќћў§ўўў§ўўњ§ў§ў§ўўі§ў§ў§ў§ў§ўўј§ў§§ћў§ўўў§ўўћ§ў§ў§§ѕћ§§ў§§ћ§ћ§ўўњ§ўћ§ћў ўў§ўў§љўћ§§ў§ўў§ёў§ўћњћ§§ў§ў§§ћ§§ўћ§ў§ў§§ўў§ўўў§ўўю§ў§ў§ўћ§§ўћ§њ§њћћ§§ћњћ§ўћ§§ў§ўўћћ§ѕњћ§ћћ§§ў§ў§§ыўћўћ§ћўћўњћњўћ§§ўћћњ§§їў§ўћўћ§њћћ§ўќ§ў§ўўў§ўўќ§ў§ўўў§ўў§њў§ўћў§§ўў§§њў§ў§ў§§ѕў§ў§§ћўћ§ћ§§ў§§ў§§ўљ§ў§ўћўћћыў§ў§ў§ўћ§§ў§§ћў§ў§ў§ўў§ў§љћ§§ў§ў§§ћўћ§§ў ўє§ў§ў§§ћ§§ў§ўў§ўў§§їў§ў§ўћў§ўў§§ў§§ўњ§ў§ў§ўўў§ўўь§ўњ§ћ§ћў§ў§ў§ў§ћ§§ћ§§§ћ§ћћ§ќў§§ћћъ§ћў§ў§ў§ў§ў§ў§§ћ§ћўћ§ўў§ќћ§ћўў§ѕў§ў§§ћ§ћћњћћњї§њўћћњћњћћ§фћ§§ћњћњ§њћћ§ћ§њћўў§ў§ўў§§ў§ўў§§ў§§ќў§ў§§ћјўњўњў§§ћћ§ќў§ў§§ёўћўњћћ§ћ§§ў§ў§ўўљ§ў§ў§ў§§ў§ёў§ў§§ћ§§ў§§ћўћ§§ћћ§ћ§ћћњ§ћ§њћ§§ѓў§ўћў§§ћ§§ўћ§§ўя§ўћ§ћ§ћў§§ћ§ћ§ўў§§љћ§§ў§§ћћјњћ§§ћ§ћ§§№ћ§ћ§ћ§§ў§ў§§ћ§§ўўћћ§§ў§§§ў§ўўјћў§ў§ў§ўўю§ў§ў§ћћ§§ў§§ћ§ћўњ§§њћ§ћў§ўўњ§ў§ў§ўўі§ў§ў§§ћ§§ўўќ§ў§ўў§ьћ§§ў§ў§§ћ§ћ§ћў§ў§ў§ўў§ўј§ўћ§§ў§ўўќ§ў§ўўў§ўў§єў§ў§§ћ§§ў§ўћћї§ћў§ў§ўћ§§ќћ§§ўў§ў§ў§њњ§ўњљћћѕњ§§ў§њїћ§њўўўћўўўћўўљ§ћљћљњўў§ћњљљчњўўћўўћўў§њњўў§§њљ§§њњ§§ўўћ§ў§ћћіљњўћўўћўў§§ўњ§§ќњ§§ўўћ§њѕ§њ§§ћљ§ћўћўўѕћњњљњ§ўўћў§§§њ§ћћћњћўћ§§ўњўўћ§њћћўўћ§њўћўў§ў§ўњ§§ќљћљ§§яњўўњўћўўћћўўћћўћўўњћ§§њњўўћћ§ў§ўўѕћўњћ§§њў§§њњ§њњў§њ§ўўѓ§ўўћћўњљ§њ§ў§§§њћўў№ћўћћўћ§ћњ§§ўўћў§§ћњ§њ§њњў§ћћўћјў§§љ§§њ§§ў§њ§ўўћћў§§ўўўћўўћћ§§њў ўќћўўњњўћњњ§њ§љћњњћљўўњўўћћўњњ§§њћў№њ§ўў§ўћўўћўў§њћўўњѓљћљ§њљ§ўћўўћўў§њњ§§ўћўўўћў ўђ§њ§ўћћў§ўћљ§§ўў§ћ§ўўўњўў§њњ§§ћ§ўўљ§љј§ўў§§ўћўў§§њўўє§ўўњ§њљљњ§њўўћћ§ўћўў§ў№ћўў§§њњў§§њњ§њ§ўўѕ§њћљљ§ўћўњўў§ўљ§§§њ§ўўўћўўўћўў§ўі§њ§§њ§ћў§њњћћ§љњ§§§љњўўўћўўќћўў§§ћљўћћўўћў ўѕћ§§ћўўњ§§ћўўћўћў§њў§ўўјћ§њњ§ўћўўћўњў§њ§ћћ§ћћўўћ§§ќњ§§ўў§ќњ§§ћћў§ћ§љљў§ўўїњўћћў§њњ§§њњў§њћњ§§њћ§њљ§ўўћћўћћ§§ўњўўћў§ѓћўў§њўњ§§њћћ§§єћ§њњ§њ§њ§§њ§ § ўќљњћ§§ћћў§њ§§њ§ћњљ§§ћћ§§ўљњ§§њўћўўўћўўёћ§њ§ћћўњњ§њњўњ§§ўњ§§ћњ§§њ§§ў §§њћ§§ўћўўњћ§§ўњ§§ўљћўўћўў§§ўљ§§ўњ§§§ўћўўўћў ўўњ§§љњ§§ћўћўўўћ§§ўўћўўў§ўўўћўў§§њ§§њњљўўћўў§ўњўўќљ§§ў ўў§ўў§њ§ўўћўў§ўўњў§ћћ§їњ§њўњњ§ћўўћ ўь§љљ§ўњ§њ§њњ§ўўћўўћњ§§њќў§§њњ§њі§ў§њ§љјљ§ўўј§ћ§њњ§§ўў§§њўўэ§ћљ§ўњљўћљњ§њ§ўћћў§§ўўњ§§ўє§ўў§њ§јјљћћ§§ќњ§њўў§љ§ўўћ§ћ§ћўўћ§њњћўўї§ўўћўўњў§§ћњ§њ§ўўўћўўўњ§§ўћњјў§ўў§§ћўўўљўўћ§њўћўўў§ўўћћўў§ћћј§њћ§њљњ§§ћњ§њ§ўўўћўўј§ћћљ§ўћўўќћўў§§ѓћ§§љљћ§§љћ§§ўў§ў§њљњљ§§ўўў§ўўќ§њњ§§ў§ћћњўў§ўўўћўўч§њћ§§ў§њўўњ§ўўћћўћў§њ§ўў§§§љ§ўўўћўўћњљўў§§љђњўў§§љ§њў§њ§§ўўјћўўћ§§њўўўћўў§єљћљћњњ§њўўћўў §јўћ§ўўћћўўўњўўўћўўћ§њћћўў§њ§ћњ§ћљћњ§§ўњўў§љњ§ў§ћћўўўћўўјћўўњўўћўўўћўўќћўў§§ўљ§§ќћњ§ўў§њњљїўў§§ќљњћў ўќћўћўўї§ўћўћўўњ§§ўњ§§ў§ћњўў§ћћ§юњљњ§§њљљћљ§§њњў§њ§§ёљ§ћћўћўў§§њ§њћўўўњ§§ ў§ўњ§§њќљћ§њњњ§њњљњўў§ќћўћ§§њў§ўўћўў§ўў§њљњњ§њўў§ўћўўћћўўћўўў§ўўљњ§њњў§ўўўњўўўћўўјћ§§ўў§§ўўќ§њ§ўўќћ§§ў ўўћўўћћ§њ§ўўќћўњ§§ўї§ўўњ§ўўћўў§ћ§љќћ§ў§§ўўћўўќњўў§§њљ§ў§њ§љўў§§ћѕћћјљ§§ўўћћ§§јўћ§јљ§§ўўћњ§ў§ўўћў§ўўћўў§ћњ§§ћњўћўўћўўўћўў§§ћўўјњљљ§њўћў ўјћўћў§љ§ўў§ўўћўўњћўў§љў ўўћўў§њќћ§њўўўњўўўћўўћўўњўўў§ўўўњўўљ§њњўўћўў§ўљћ§§ўћњўў§њ§њћљјљ§ўў§ ўћўўћў ўћ ўўћўў§ўўћўўў§ў ўіћњћњ§§ўўћўўћћўўњ§§њјћў§§њ§њўўўћўўћћўўћўўўћўў§њћўўћћўўћўў§њ§ў ўј§њ§ўњњ§ћћќњ§ўњњ ўўћўўћћў§њ§§ўњњўњўћўў§ћў§§њќћљ§њњќ§ўў§§єњ§§ў§ћўћћўћўўўћўў§ћўћњћўўѓњ§ћўўћћўў§њћ§ §њћў§§ћўў§ўћўўўћўўќћ§§ўў§ѕўњљјћћ§§ўў§§ѓўњ§љјјљ§ћўўћў ўѓњ§§ўљљњњ§ўўћў ўј§ћљњћћљ§§њї§ћћњ§§њ§ўў§ўњ§§ў§ ўјњўўћћ§ћ§§ќњ§§ўўіћўћў§њњ§§ўўўћўўњ§ќњўћўўўћўўъћўћўўћћў§љјј§§ћљљјљ§§ўўћ§ћљљ§§ўћўћўћўўћўўќњћћ§ §њћљљћћ§§ћћўћ§ўўјљњћјљњћў ўўњўўћћўћўћћљўјјљ§њ§§љћњљћљљњњі§ўўћћўўњњ§§њќљњљўўўћў ўњ§ћўјћ§§њ§ўњ§§ў§ўћўўћћўќћ§§ўўњћў§§њ§§ўћўўі§њ§њћћљћћљљћєљћњўў§ћљїїљћћ§ћћўўћўўў§ўўљћњ§§њњ§§їњ§љњ§љјјћћўњ§§ў§§ћ§§ўћњњ§љћљ§§ћћўўшћњўўћў§ћ§§љ§§љ§њњљљ§ў§њ§§ўњћ§љћљњњъљћћ§§ў§њ§ў§њљљ§њ§§ўћњўўёњ§њ§њ§њљћўў§њњ§§јњ§љљ§§ј§§їњљљјњјњћјј§ћљћћ§љ§љљў§ћћьљ§њў§љћјїљљ§ћљјљћў§ћћ§љћ§§уњ§љћїјјљћјњћћјћјјњј§њ§ћћљњ§њћћљћњћјћ§§ў§єљјњјљњўў§§њ§§ўњ§§љјўљћћїљњ§ўў§њњ§§њњ§§ћћ§§фјњјћ§јћљљћњ§§њљњ§њљљћ§ћћњјћ§§ћэљћ§ћћњњћљћћљљ§ћљћћјјљћ№љћ§§ћћјњћљјњјїћ§§§ћјљљћђњјјњћћ§§ћћљћћ§§їћјѕїњћћјљљћ§њђ§ћњњјјњјљ§ў§љ§§ўѕјјћь§њљћ§§ћњѕњјљћљћ§њњ§ћћюљћљ§њ§њ§§њћў§§ћљљ§§ўњ§§ћў§њњћ§ћђљј§њ§љј§њ§§љљћћјљ§ћћљјјћћ§ћ§ћ§ўњ§§ўў§§§љјљљјњљјјљљћћ§јљ§§ўћ§§ѕљњјјљћћљ§њћћьљњ§§ў§§ћћ§§ћљћљ§ћљћ§§тћњћћљљћ§§љљћћјћћјјљ§§љ§§њ§§њњљљ§јїљљћјћ§јїѕѕэ§ћ§ў§ћ§ћ§ћў§ћњћњ§ћ§§љўњ§§ў§ўўў§ўўў§ўўћќў§§ўўѕ§ћћўў§ў§ў§ўў§ўњћ§§ўћ§§ќћ§§ў ўћњњћњў§ўўя§ў§ў§§ћ§ћ§ћ§ћ§ћ§ўўў§ўўќћ§ћ§§ћў§ўўї§ў§ўў§§ћ§§ў§ўћ§§ўћўўљ§ў§ўћ§ћћќ§ўў§§§ћњўў§ў§ќћў§ўў§ўћ§§§ћ§ћћњ§ћ§ћ§ўўў§ўўў§ўўў§ўўўћ§§ўќћўћўўї§њћ§§ўћћ§§јћ§ћ§ћ§ў§§ў§ў§§ћ§§њћ§ћ§§ўўќ§ў§ўўћ§ўћў§§љў§ў§§ћ§§ўў§ўўіћ§ў§ћ§ћ§ћўў§§ў§§ў§ўћўўў§ўўћј§ў§ў§ў§ўўї§ў§ў§ў§ў§§§ў§ўў§њћ§ћћњ§§ўў§ўўљ§ћ§ћ§§ўўє§ў§§ћўў§ўў§ўў§ў§јћњћ§§ћћўўњ§ў§ћћ§§ўћў ўќ§ў§ўўќћ§ћўў§ћі§ћў§ўў§§ў§§љў§ўў§ћ§§ьўћў§ў§§ћ§ћў§§ћ§ўў§ў§§јў§ў§ћ§ў§§ћќ§ћ§ўўўћўўј§ў§§ћў§ўў§њћ§§ўћ§§ўтћ§њћћ§ўў§ў§ў§ўћ§ћ§ћ§ћ§ћ§ћ§ћў§ўўќ§ў§ўўћ§ћў§ўўќћ§ћ§§ў§ђў§ў§ћ§ћ§ћћ§ў§ўўў§ўў§§ўћћќ§ћ§ў ўў§ўўїћ§ўў§§ћ§ў ўќ§ў§ўўћ§ўћўўўћ§§ ўѕ§ў§ў§§ўў§§њњћў§ўў§єћ§ћ§§ў§ў§§ћ§§ўћўўћ§ўў§ћћ§ћў§ў§ўў§ьћ§ћ§§ўћ§ўўћ§ћ§ћ§ћ§ћ§§§ўћўўє§ў§ўў§ћ§ћ§§ўўў§ўўњ§ћ§ўў§§ѓў§§ћ§њњћ§ћўћ§§№ћ§ћ§ћ§ћ§ћ§ћ§ћў§ўўќ§ў§ўўш§ў§ўћ§ћ§ћ§ћ§ўўћ§ћ§ћ§ћ§ћ§§ьћ§ћћњћћ§њњћ§ћў§§ћ§§ўўњ§ў§ў§ўўќћ§ћўў§јћ§§ў§§ћ§§ћћ§ћ§ћ§§ќћ§§ўў§юћ§ћ§ћ§ћ§ћ§ћ§§ўћ§ћўўќ§ўћ§§ћћ§ћ§ўўў§ўў§ћїўћ§ћ§ћ§ћўўќ§ў§ў ўѕ§ў§§ћ§ћ§ћ§ўўє§ў§ўў§ћ§ћў§ўўћ§ў§ў§§фў§ў§ў§ўћ§ћ§ћ§ўў§ў§ўў§ћ§ћ§ћ§ўўљ§ћў§ў§ўўќ§ўћўў§§ћў ўў§ўўћћў§ў§§љћњћњћћ§§їў§§ћў§ў§ўўќ§ў§ўўќ§ў§ўўў§ћћўў§§яћў§ў§ўў§ћ§ћ§§ўћћ§§ўћ§§ћћњћ§ўў§§њ§§ћ§§ў§§ѕў§ў§§њћћў§ўўћ§ћ§ћўў§дћ§ћ§ћў§ў§§ћ§§ў§ў§§ўўћ§ћ§ћћњњћ§ћ§ћ§§ў§ўћў§ў§ўў§іњ§ўў§ўћ§§ўў§ў§§ћ§§ ўљ§ћ§ћ§§ўў§єўћ§ўў§ў§ў§ў§§ўљ§ў§ў§ў§§ўњ§ў§ў§ўў§ў§ћљ§ћ§ћ§ћ§§§ў§ўўѕ§њћћ§§ў§ў§ўў§юћ§ћ§ћўћ§ћћњ§ћћњ§ћўўц§ў§§ћ§§ў§§ћ§ћ§ћ§ў§ћ§ћў§ў§ўўњ§ўћў§ўўўћ§§ёћ§ћ§§ўў§ћ§ћ§ћ§њњћ§ўўћўўќ§ў§ўў§§ўћ§§љў§§ћў§ўў№ћ§ћў§§ћ§ћ§ћ§§ў§ўўї§ў§ў§ўћ§ћћј§ў§§ћўћ§§ќћў§ўўў§ўўћњ§ў§ў§ўўєћ§ћњћњ§§ћ§§ўўў§ўўќћ§ћ§§ѕћ§ћ§ћ§ћўў§ўўђ§ў§ў§ў§ў§ў§ў§ўў§ўј§ў§ў§ўћ§§њћ§ћњњћћќњ§§ћћ§§ў§ўўіћ§ћ§ћ§ћўћўўў§ўўў§ўўў§ўўќ§ў§ўўў§ўўьћ§ћ§ћ§ћ§ћ§ў§ћў§ўћ§§ўў§њћ§ћћ§ўўі§ў§ў§ў§ў§ўўўћўўї§ћ§ћ§ћ§ћўўї§ўћ§§ўўћњњё§ћ§§ў§§ћ§ўћњћћ§§єћ§ў§ўў§ў§ўћ§§ў§њћ§ћў§ўўў§ўўю§ў§§ћ§ћ§ћ§ћ§ћ§ћ§ћ§§ћ§њћ§§ў§ўўќ§ў§ўўѕ§ћ§ћў§ўћ§ћ§§§ў§ўўє§ўћў§ўў§ћ§ў§§њў§ўћ§ўўў§ўўњ§ў§ў§ўўњ§ўћў§ўў§њћ§§ўћўў§ўў§ўўі§ўў§ћў§§ћўў§ўћў§ўўў§ўўў§ўў§ўѓ§ћ§ћў§ўћўў§ћўўѓ§ў§ўћ§њћњ§ћ§ћћїњћўћ§ћ§§ўўє§ў§ў§ў§ў§§ћ§§ъћўћ§ћў§ў§§ћњ§ћњћњћћ§§ўўєћ§ћўў§§ћћ§§ўў§ќћўћўўќ§ў§ўўњћ§ћ§§ўўј§ћ§ћћњћ§§§ў§ўўў§ўўѓ§ў§ў§ўћў§ў§§ћћ§ћў§ў§ўўњ§ў§ў§ўў§єў§§ў§§ћў§ў§ўўќ§ў§ўўі§ў§ў§ўћў§ўўќ§ў§ўўў§ўўя§ўћ§ћ§ћ§ћ§§ўћ§§ў§§їў§ў§ў§ў§ўўў§ўўќ§ў§ўўіћ§§ў§ў§ў§ўўў§ўўњћ§§ў§ўўі§ўў§ћўў§§ўўўћ§§яћ§њћњћћў§ў§§ћ§ћ§ўўў§ўўњ§ў§ў§ўўј§ў§ў§ў§ўўў§ўўњћ§ћ§ћў ў§ўќ§ў§ўўі§ў§§ћў§ў§ўўѓћ§ћ§§ў§§ћ§ћ§ўўј§ў§ў§ў§ўўќ§ў§ўўќ§ў§ўўў§ўў§§ў§§ўќ§ў§ўў§ќў§§њњќ§ћў§§ўў§ў ў§њћ§§ў§ўўў§ўў§§ў§ўўіћ§ћ§ћ§§ћћ§§ўїћ§ћ§ћ§ў§ўўј§ў§ў§ў§ўўњ§ў§§ћўў§§ћўўр§ўћ§ў§ћ§ћ§ћ§ћ§ћ§ўўћ§ўў§ў§§ћ§ћ§ћўўќ§ў§ў ўћ§ў§ўўњћ§§ў§ћћяњ§ћў§§ћ§ўўћћњ§ћ§ўўў§ўўє§ў§ў§ў§ў§§ћўў§ўћў ў§њњћ§њњћћ§јњћ§ћћ§§ўўђћ§ћ§ћ§§ћћ§ћћ§ўў§ќћ§§ўўќ§ў§ўўщ§ўў§њ§ћ§ћ§ћ§ћ§ћ§§ў§ў§ў§§њћ§§ў§ўўћ§ў§ў§§јћ§ўў§ў§ў ўј§ћњћ§ћњћћў§ўў§ћњћћ§§ћўўў§ў ўќ§ў§ўўў§ўўў§ўўѕ§њћћ§ћ§ћ§ћ§§ћњњћћ§ћўўўћўўњ§њњћ§ўўќ§ў§ўўў§ўўќ§ў§ўўњћљ§ћ§ћ§ћ§§§њ§ћћ§ўј§ў§§ћ§ћ§§њў§ўў§ўўў§ўўў§ўўў§ўўьћў§§њ§ћ§ћ§ћ§ћ§ћ§ћ§ћ§§шћ§ћ§ћ§ћ§ћў§ўћ§ћ§ћ§ћ§ћў§ўўў§ўўі§ўў§ћў§ў§ўўј§ћ§ћ§ћ§ўўіћ§ћ§њњћћњћћїњћњћњ§ўўћћєњћњћњ§ћ§ўў§ўў§ћў§ў§ўўњ§ўў§ћ§§пћ§ћ§ћ§ћћ§§ћњ§ћњњ§§ћ§ўў§ў§§ў§ћ§ћў§§ћ§§ћўў§јњ§ћўћ§ў§§ћјўћ§ћ§ћ§ўўў§ћћ§ѓћњњћћўћ§ћўћ§ћћї§ћ§§ў§ў§ўў§ќћњў§§њћ§ћ§ћ§§ћ§ѓћ§ћ§љјјњљњљћњњћњ§ћ§ћћў§ўўѕћ§ў§ћћњћћўћћя§ћў§§њћњћњ§ћ§ћ§ћ§§ћњјћњњљћњ§њњўљ§§њѕћ§ћ§њћњћћ§њњы§ћ§ћ§ћў§§ћ§ћњљњћ§ўўћ§§ћњ§ћ§ћ§ћћњіћњћњћћ§ћў§§хћ§ћ§ћ§њњћ§ћ§љњњ§§њћћњ§ћ§§ћ§§ћіњљњњћ§ћњњћћјњљљћћњњћћ§њћњњћцњћњњћњћ§њћњљњћњљњћњ§ћ§ћњњћћћњћњћњњѕћљњњљњћћ§њћћєњ§ћ§ћћњјљљњћћќњ§ћ§§юњљљњњљњћћўћўћ§ћ§§њњњћњћћ§ћћѕ§њљњљњћњћњ§§ћэњћњћњћћ§ћ§ћ§§ўў§ћњћћѕ§ћ§ћ§ћ§њњћ§§§њћњњ§ћњ§§№ћ§ћ§њћњћњћњћњћћ§§ѕћ§ћ§ћ§ћћњћњњїћњћћ§њњћњњёћњ§ћ§њњћ§ћњњ§ћ§§іћ§ћўћ§ћћњјјњќјњњћћчњћњћ§ћћ§ћўћ§ћ§ћљњњћћњћћ§њњѕћ§ћ§ў§ћћњ§ћћѓ§њћњ§ћ§ћ§њ§њћћ§њ§ћћњєћ§ћўћ§§ћћ§§ћћ§§њћћ§њћњњњћњ§њњјќ§ў§ўўў§ўў§јћ§§ў§ў§ўўў§ўўњћ§ћў§ўў§ ўќ§ў§ўўў§ўўў§ўўў§ў ўњћ§ћ§§ўў§§ў§ўўў§ўўў§ўўє§ў§ў§ў§ўћ§§ўўњ§ў§ў§ўў§ўў§§ ўў§ўўў§ўўћ§ўћ§ўўў§ўўў§ўў№§ў§ў§ў§ўћў§ў§ў§ўўќ§ў§ў ўќ§ў§ўўђ§ў§ў§ў§ў§ў§ў§ўўў§ўўє§ў§ў§ў§ў§ў§ўў§ўє§ў§ў§ў§ў§ў§ў ўќ§ў§ўўў§ўўў§ўўў§ўўў§ўўћ§ў§ў§§ћў§ў§ўўњ§ў§ў§ўўў§ўўў§ўўў§ўў§§ў§ў ўќ§ў§ўўў§ўўњ§ўћ§§ўўў§ўўў§ўўљ§ў§ў§§ўў§ўќ§ў§ўўў§ўў§§ў§§§ў§ў ўў§ў ўў§ўўќ§ўў§§ў§§ў§ўў§їў§ў§ў§ў§ў ўў§ўўь§ў§ўў§ўў§ў§ў§ў§ў§ўћўўќ§ў§ўўў§ўўќ§ў§ў'ўў§ўўў§ўў§ўў§ўў§ћў§ў§ўўњ§ў§ў§ўў§§ў§ўўњ§ў§ў§ўўў§ўўі§ў§ў§ў§ў§ўўў§ў ўњ§ў§ў§ў ўќ§ў§ўўў§ўў§§ў§§§ў§ўўь§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўўј§ў§ў§ў§ўўј§ў§ў§ў§ўўљ§ўћ§§ў§§§ў§ўўќ§ў§ў ўў§ўўў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ўўђ§ў§ў§ў§ў§ў§ў§ўўў§ўўў§ўўќ§ў§ў ўў§ўўќ§ў§ўўў§ўўј§ў§ў§ў§ўўќ§ў§ў ўў§ўўњ§ў§ў§ўўњ§ў§ў§ўўў§ўўў§ўўє§ўў§ћ§ћў§ў§ўўў§ўўўћў ў§ўњ§ў§ў§ўўњ§ў§ў§ўў№§ў§ў§ў§ў§ў§§ћ§§ўў§ўў§ўўќ§ўћўўў§ўўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўћ§ў§ў§§љў§ў§ў§ўўў§ў ў§ўў§ўўў§ўўј§ў§ў§ў§ў ўњ§ў§ў§ўўќ§ў§ўўў§ўўў§ў ўў§ў ўў§ўў№§ўћўў§§ў§ў§ў§ў§ўў§ќћ§§ўў§ћў§ў§ўў§јћ§§ў§ў§ўўё§ў§ўў§§ў§ў§ў§ў§§ўј§ў§ў§ў§ўўљ§ў§ў§ў§§ўў§ўўќ§ў§ўўў§ўўў§ўўј§ў§ў§ў§ўўў§ўў§§ў§§ўі§ў§ў§ў§ў§ўў§§ў§§§ў§ўў§§ў§§љў§ў§ў§ўўў§ўўў§ў ўў§ўўє§ў§§ћўћ§§ў§ўўў§ўўќ§ў§ў%ў§§ў§§љў§ў§ў§ўўќ§ў§ўўњ§ў§ўћўўј§ў§ў§ў§ўўў§ўў§ёў§ў§ў§ў§ў§§ћў§ўўј§ў§ў§ў§ўўќ§ў§ўўќ§ў§ў ўц§ў§ў§ў§ў§ў§ў§ў§ў§§ћў§ў§ў§ў ўќ§ў§ўўњ§ў§ў§ў ўј§ў§ў§ў§ўўў§ўўќ§ў§ўўў§ў ўў§ўўў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўў§ў ў§љћ§§ў§ў§§ўќ§ў§ў ўњ§ў§ў§ўўў§ўўє§ў§ўћ§ћ§ћў§ўўў§ўў§ќћў§ўўў§ўўќ§ў§ўўі§ў§ўћ§ћў§ўў§§ў§ўўќ§ў§ўўў§ў)ўј§ў§ў§ў§ўўў§ўўў§ўўў§ў ўў§ўўў§ўўў§ў ўћ§ў§ў§§§ў§ўўњ§ў§ў§ў-ўќ§ў§ў ўў§ўўў§ў ўў§ўўњ§ў§ў§ў'ўў§ў ўќ§ў§ўў§ўў§ўўњ§ў§ў§ўўў§ўўђ§ў§ў§ўћ§§ў§ў§ўўј§ў§ў§ў§ўўў§ўўў§ўўђ§ў§ў§ў§ў§ў§ў§ўўў§ўўњ§ў§ў§ўў§ўњћўћ§§ўўќ§ў§ўў§ћў§§ўў§ўўў§ўў§ћў§§ћўўњ§ў§§ћўў§ўњ§ў§ў§ўўў§ўўќ§ў§ўў§ѕў§ў§ў§ў§ў§ўўў§ўўў§ўўќ§ў§ўў§ћћў§ў§§ћў§ў§ўў§§ў§ў'ў§їћў§ў§ў§ў§§їўћ§ћ§ћў§ўўўћўў§ќћ§§ўўќћў§ўўћ§ў§ў§§ќћўћўўў§ўў§їў§ў§ў§ў§ўў§ђў§ў§ў§ў§ў§ў§ў§§ћў§ў§ўўќ§ў§ўўј§ў§ў§ў§ў ўў§ўўј§ў§ў§ў§ўў§§ў§§ѓўћ§ћ§ћ§ћ§ћ§§ўўєћ§ћў§ўћ§§ў§ўўў§ў ўі§ў§ў§ў§ў§ўўђ§ў§§ћ§ћ§§ў§ў§ўўњ§ў§ў§ўўј§ў§ўћ§§ўў§ѕў§ў§ў§ўў§§ўўњ§ў§ў§ўў§ћћ§§ў§§ўў§ўўј§ў§ў§ў§ўўч§ў§ў§ў§§ўў§ў§ў§ў§ў§ў§§ћў§§ѕў§ў§ўњњћћњћћ §ўљ§ў§ў§§ћћ§ћўћ§§ўў§шћ§ћ§§ў§ў§ў§ў§§ћўћўћ§њћћ§§ћ§ўў§§ћў§§ћ§§јћ§§ў§ў§ўўі§ў§§њўћ§§ўўќ§ў§ўўю§ў§ў§ў§ўћў§ўћ§ћ§§ўўї§ў§ў§ў§ў§§љў§ў§ћћ§§оћ§§ў§ў§ў§ўћ§ћўћ§ћў§ў§ў§§ћ§ћўћ§ћўћ§§чў§ћ§§ўћў§§ћўћ§§ў§ў§§ћўћ§ћћіўћ§§ў§ў§ћ§§ќћ§ћ§§ћъ§ћў§§ћ§ћ§§ў§ўћўљ§ћ§ћў§§њћў§ў§ўў§ћў§ўўо§ў§§ћўћўћ§ћў§§ћў§§ћњћў§§ћ§§ў§ўћ§ћ§§јћў§ў§ў§ўўѓ§ў§§ћў§ў§ў§ў§§љў§ў§§ћ§§ўћ§§юў§ў§§ћ§ћ§ћ§ћ§ћў§ў§§ќў§ў§§ўћ§§ќћ§ћ§§ћ§ћћ§§ў§§ќў§ў§§љў§ў§ў§ўўш§ўћћњ§њћњ§ћў§§ћ§ћ§ћ§ћў§ўўѓ§ў§§ћўћ§ћ§ћў§§ѓў§ў§ўћ§§ўћ§ћ§§ќў§ў§§юћ§ћў§ўћ§ћ§ћ§§ћњ§§ўўў§ўўѓ§ўћ§ћ§§ўћ§ћ§ћћљ§ћ§§ўњћ§ў§ўўћ ўќ§ћћўўўћў ў§§њћўўїћўў§§њўћўўљћўњ§§ўћћўў§ў ўёћ§ўў§њњћћ§ћўўћўўћћњћћў ў§ћў§§јћў§њљљ§ўўэћў§ўўњ§љћјњљ§ўўћў§ўўѓ§њњ§ўћњ§§ўўћўў§љћўћўў§ўўў§ўўњўћў ўўћўўўћўўўћўўќћўћўўўћў ў§§њљ§§јњ§њњљњ§ўўўћўўўћў ўўћў ўўћўўљњ§њўўћўўњћўћњ§ўў§ўњћўў§њўў№ћўўћўўњ§§ўўћўўћўўј§ўў§§ћћљљў§ўўўћўўћўўћўўћ§њ§§ўўўћ§§ўњ§ћљћњўўўћў ўћћўњњў ў§ўњ§§ўќњ§ћўўїћўћўўћўўћћ ўњ§ўћўўљњ§§ўћћўўўћўў§ћњўўєћўўћўўћћњјћўўћўќћўћўўўњўўњћўћўћўўћ ўљ§ћ§§ћ§ћћўљћўўћўћўўњќ§њљўўѓћўћўћ§§њ§§ћћўўјћўћў§§њўўћ§ўўћўўўћўўўћўўњћўўћў§§§ћўћћњўћўўћўўћ§ўњ§ў ўњћўўћ§ўўћўќћў§ўўўћўўы§љћ§ўўћ§§њўўћў§њўћўћўўћў§§ћўўўћўўћўћў§ўўўћў ўўћ§§ўћўўћћў§њўўэњўў§љј§§ћўўћўњ§њ§§ў ў§њђўћћўў§њ§ўў§њљўўњ§ўћўњ§ўў§њўўўћўўћћўўћўўќћўў§§ўћўўўћўўўћўўўћўўўћўўїћўўћњљ§њўўўњўўўћўўўћўўњ§њњ§§ўўљћўўћњњўўћ ўђњћљ§ўўћћўў§ўћў ўћўїћўњњ§њ§§ўўћ§§њўўћћўўћўўўћўўўћў ўўћў ўћўќћўћўўўћўўўћўўўћўўћўўћўўўћўўњўќћўћўўњћњ§§њўўўћўўћўќћ§ћўўјћў§њўўћўўѓћўћљ§ўњ§ўћўњўўўћўўќ§ћћўўћћўћћўўіћўњ§ўўњ§§ўўўћўўўћўўћўўћўўќ§њњўўќ§ўћўўћўў§ўў§ўјћўўћўў§ўўњћўћўћў ўћћњљ§ўўўћўў§§ўћў ўњњ§ўўћў ў§§њўўўћў ўўћўўўњўўћћњ§§ўў§љћўўњ§ћўўўћўўћ§ўђ§њћћњњћјљњњљњ§§ў§ўўћўў§љўўћўўћўњјљћћ§њњ§ўў§§њўў§њ§ўўњћњ§ўћўўћўћў§ўњў§ўўўћўўўћўўќћўћўўћњ§§њўўцћњ§§ўўћўњћћўўљўћўўћўћћўўњўўўњ§§ўў§ўўњћўћўћўўўћўўўњўў§ћўўћўўўћўўўћўўћў§јњћ§§ўўњўўц§љ§§ўў§§јљ§§њљўћњ§њ§§ўўћ§ўў§ўћ§љљ§ўўўћ§§ћї§љљ§ўћ§љњњ§ ўўњўўўћўўѕ§њњўњњ§§ћћўўљћ§ћћўћў ўћўўћўў§њ§ўўњњ§њњ§§ўўњўўћўўћўўћўўўћўўћљ§§њўў§ћљјњ§ў ўѓћўћўћў§§ўўћћўўў§љљђћњњўўћў§љљ§§ћљљў§ўўћўўєћўћўў§§ћ§њ§њњщ§ћњ§ўўњњљ§њўўњ§њ§њњ§ўћўўэћўўћћўўњўћћњ§§ћјјћ§§ўђњ§њј§§ћјљљ§§њўўўћўўљњ§ћћњћўўшњљћљћћ§§ћљћјјљ§ўњњћњљњ§њњ§єљ§љљ§§љљњљљћћљћќљњљ§§хњ§§љћљћјћљћ§§њ§§ўў§њ§њњљћјњњпћ§§њ§ћћњјјћ§њњћ§ћћљ§§љљјћњјљљ§ћћ§§ћўњ§ў§§ыћљћљјљњљњњ§§љўў§§љћљћћ§љћљљћћљ§§ќћјњ§§ёћљћћљїјћ§§љјљћ§§ћїљћ§§љћљљ§§дњ§§њ§ћљћљљјјњћ§њ§§љњћ§њ§ўў§љћћјїѕњљћ§ћљћљћћљљяћљћ§§љњ§ўў§§њ§њњ§§ьћјјљћћљ§§њњ§§ўўњћљћјјћўљћћќљ§§ўў§ћјљњћљљїњћћћ§ў§ћјјњј§ћљ§§ўў§§љњљћ§ћћљљьњљћњ§ћњљ§§љјјњљњћћњ§§№љћњ§љћњњ§ћљљјћћ§§љњ§ћћљћљљѕњ§§њњћћєјљ§§ѕћўћ§ћљћљћћ§§јњ§§њњўћўўцњў§ў§љјћ§њ§§њ§§ћљћњљћћјјћ§§ћ§љћљљђ§њћўћ§ћјјћњћћљљћ§њїјјѓїѕњћ§ћјљљїњњљљљћјћ§љљњњќјњјљљўњћћ§єїјјљњћјюњјњїћћњјљјјћљћћљјљљћњћњ§§њљ§ўћўўќ§ў§ўўќ§ў§ўўў§ўўўћўўў§ўўў§ўўћ§ў§ћўўњ§ўћ§§ўўќ§ў§ўў§ўћўўў§ўўў§ў ў§ўњ§ў§ўћ§§ўќћў§ўўў§ўў§§ў§§љћўўћ§ћ§§ ўёћў§§ћћњ§§ўћў§ў§§§ў§ўў§ћў§§ћўўќ§ў§ўўј§ў§ў§ў§ўўќћ§ћўўќ§ўћў ў§§ў§ўўў§ўўў§ўўќ§ў§ўўў§ўўў§ўў§њћ§ў§ћ§§јћ§ћў§ў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўў§ўўљ§ў§ўћ§ўўў§ўўљ§ў§ў§§ў ўў§ўўќ§ў§ўў§ћ§ўўќ§ў§ўў§ћ§ў ўљ§ў§ћ§§ўўђ§ў§ў§§ћў§§ћњњћћўј§ў§ў§ў§ўўќ§ў§ўў§ўћў ўќћ§ћўўњ§ћћњ§ўўў§ўўў§ўўў§ўўј§ў§ў§§ћ§§ќћ§ћ§§љћ§ўў§§ў ўў§ўўљ§ўў§ў§ўўў§ўў§ђћў§ў§ў§ў§ў§§ћўўў§ўўў§ўўў§ўўў§ўўў§ў ўў§ўўќ§ў§ўўў§ўўљ§њ§ћўћў ўќ§ў§ў ў§§ў§ўўэ§ћ§ћ§ўў§ў§ў§ў§§ћў§ўўј§ўћў§ў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўћћ§ћ§ў ў§ўў§§§ў§ўўў§ўўќ§ўћўўќ§ў§ўўўћўўќ§ў§ћћљў§ўћ§§ўў§ўќ§ў§ўўў§ўўї§ў§ўў§ў§ўўќ§ў§ўўќћў§ў ўќ§ў§ўўњ§ўћ§§ўў§ўъ§ў§ў§§ћ§ћ§ўў§ў§ўћ§ћ§§ў ў§§ћ§§ўѕћ§ћўў§§ў§ў§§њћ§§ў§ў ўў§ўўў§ўўќ§ў§ўў§љўћ§§ў§ўўў§ўўў§ўўќ§ў§ўўљћ§ћ§ў§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ўў§ўў§ў ўў§ўўў§ўўўћ§§ќћў§ўў§ўў§ўўќ§ў§ўў§ќњћћўў§ћў§ў§ў ўў§ўў§ўћўўў§ўўњћ§§ў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўўў§ўўќ§ў§ўўў§ўўў§ўўў§ўўќ§ў§ўўў§ў ўў§ўў§§ў§§ћў§ў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўў§§ў§§ўќ§ў§ўўќ§ў§ўўў§ўўј§ўћў§ў§ўўќћ§§ўўў§ўўћ§ўћўўў§ўўў§ўўўћўўў§ўўў§ўўњ§ў§ў§ўўѓ§ћў§§ћ§§ў§ў§ўўќ§ў§ўўў§ўўў§ўў§љў§ћ§ў§ўўќ§ў§ўў§їў§§ћў§ў§ўўў§ўўќћў§ўўѕ§ў§ўў§ў§ў§ўўђ§ў§§ћ§§ў§ў§ў§ўўў§ўў§ўў§ўўў§ўўі§ўћ§§ў§ў§ўўќ§ў§ўўў§ўўў§ўўј§ўў§ћ§§ўўў§ўўђћ§ћў§ў§§ўў§ў§ўўў§ўўљћ§§ћў§ўў§ў§ћ§ўіћ§ћ§ћў§§ћўўў§ўўћћ§ћћўўў§ўўј§ў§§ћћњ§§ўћўўђ§ў§ў§ўћ§§ў§§ћўўљ§ў§ў§§ўўќ§ў§ўўъ§ўћ§ћ§ћў§ў§ў§§ћў§ў§ў§ўўў§ўўљ§ў§§ћ§ўўљ§ўў§ћ§ўўќ§ў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўўі§ў§§ћ§ћ§ћўў§ўў§ўўў§ўўѓ§ў§ў§ўў§ў§§ћўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ў ўў§ў ў§ыћ§§ўћ§§ў§ў§ў§ўћўћ§§ўћћ§їў§ў§ћ§ћ§ўўћћ§ў§ўўќћ§ћўўћ§§ў§ўўњћ§ћўўћћў§§ћљљљ§ћ§ўў§ўўќ§ў§ўўў§ўўч§ў§ўћ§§ў§§ћ§ўў§ў§ў§ўў§њњўўљ§ў§ў§ў§§ўў§§ўћ§§ўћўў§§ў§ўўў§ўўў§ўўў§ўўё§ћ§ўў§ў§ўћ§ћ§ћ§§§ў§ўўў§ўўў§ўўќћ§§ўўћїњ§§ў§ў§§ћћ§§њћћў§ўћў ўљ§ћњћ§ћ§§§ћњ§§ѓў§§ў§§ў§§ћ§ћ§§ўў§ўўў§ўў§ћ§њњёћ§ћў§ў§§ћ§ћ§ћњћћљ§ћў§ў§ўў§ќњћ§ўўѓ§ў§ўњћњћћ§њћњњћїў§§њ§ў§ћ§§іћ§ћ§ћ§ћћ§ћћљљћћњћњћћѓњћљћћ§ћ§ћ§ћњћћўњћћ§§ћў§§ћўњљљїњ§ћ§ћћњљњњ§љў§њћћ§ћћѓ§њљњћћ§њњћ§ћ§§њћўћ§§ћћћњјњћ§§ўћўўєћ§ћњћњњћћ§њћћсњћћ§ћњ§§ћ§ћњћћњћћњћћ§ћњјћћ§ћћњћћќ§ћњћћћ§ћ§ћ§§ћћ§ћњћћњсљћћ§ћ§ћљћћ§ћўў§ћћњњљњљћњ§њћњћњћћўњћћѕ§ћ§ћўў§ћ§ћ§§ћћ§§ћњњњћњњћћ§§њћ§ўў§ћћў§њњќћњћњњћ§ќў§§ћћў§њњ§§њћћ§љћњњќ§ў§њњљњ§ћэ§ћ§ћ§ў§ћ§ћ§ћ§ћњћњњћћєљћњ§ћў§ћћ§ћњњэјљњћ§§ћ§ћ§ћћ§§ўћ§§ћћњњћњ§ћ§§њ§ћњћћ§§ћ§§єњћћњћ§ћ§ћ§ћўўћњћ§ќћ§§ўўћ§ў§ў§§ќћ§њ§§ѕћ§ћ§њћњ§ћћњњћі§ћ§њћњњћњћћ§ўћњќ§ћњћћњњћњљљњњќљњљћћљњјјљљњћћ§§њћћќњљљњњћљљћњњљљњњћљђњћњњљњљћњњљњјњњћўњћћњњљљћњ§§ў.ўў§ў ўў§ў ўў§ўўў§ў ўќ§ў§ўў§ўќћў§ў ўј§ў§ў§ў§ўўў§ўўћ§ўў§ўўў§ўўўћўўў§ўўў§ў.ўѓ§ў§ў§ў§ў§ў§§ў?ўў§ў ўў§ў ўў§ў ўќ§ў§ў ўј§ў§§ћўћўўќ§ў§ў ўў§ўўћ§ћ§§ў ў§§ў§§їў§ў§ў§ў§ўўў§ўўќ§ў§ў ўў§ўQў§ўњ§ў§ў§ўўњ§ў§ў§ўўў§ў,ўќ§ў§ў ўћ§ўў§ў*ў§ўћўўў§ўўў§ўўў§ў+ў§ўў§ўўњ§ў§ў§ўўќ§ў§ў ўў§ў ўў§ўў§ўў§ўўў§ў ўў§ўўў§ўўќ§ў§ў$ўў§ўўќ§ў§ў ўў§ўў§ўў§ўўњ§ў§ў§ўўў§ўўў§ў'ў§$ўў§ўўњћ§§ў§ў(ўў§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ў$ўў§ў ўќ§ў§ў ўў§ўўў§ўўќ§ў§ўўў§ўў§ў§ўў§ўўј§ўћўћў§ўўќ§ў§ўўў§ў ў§ ў§њћ§§ў§ў ўў§ўўў§ўўќ§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўў§ўўў§ў4ўўћўўќ§ў§ўўў§ўўќ§ў§ўўѓ§ў§ў§ўў§ў§ў§ў ўў§ўў§ўў§ўў§§ћўў§ћќ§ў§ўўў§ўўќ§ў§ўў§ўў§ўўј§ў§ў§ў§ў$ўќ§ў§ўў§§ў§§§ў§ўўў§ўўўћ§§ў§ўў§§ўћўўў§ў ўђ§ў§ў§ў§ў§ў§ў§ўўў§ўўј§ў§ў§ў§ўў§ћќ§ў§ўўє§ў§ў§ў§ў§ў§ў ў§ўћўў§єћ§ћў§ў§§ћћ§ўўљ§ўў§ў§ўў§§ў§§кћ§§ўћ§ћ§ћ§ћ§ћ§ћ§§ћ§ў§ў§ў§ў§§ћў§§ћў§ў§ўўк§ў§ўў§ћћўћўћ§§ў§ўћ§ћўћ§§ў§ў§§ћ§§ўћў§§ћћ§љў§ў§ў§ўў§ёўћ§ћ§ћњњ§§ў§ў§ўў§ѓћў§§ћўћ§ћў§ў§§хў§ў§ўћў§ћўћў§§ћњћў§ўћ§ћ§ћў§§эћў§ў§ў§ў§ў§ў§ўћў§ўћћћў§ў§ћћ§ў§ўў§јћ§ћњњћћ§§ѕћ§ћ§§ў§§ћў§§ўё§ў§ў§ў§ў§§ў§ўћ§§§ў§ўўў§ўўєћўћ§ћў§§ћ§ћ§§ќћў§ўўў§ўў§§ўћ§§ќћўћ§§ќў§§ћћэњў§§ћ§§ў§ў§ў§ў§ў§ў§§ўў§§ћ§ўлћў§§ћўњњћ§ћў§ў§ў§§ћў§ўћў§ўћ§§ўћ§§ў§ў§§ъћўћ§§ў§ў§ў§§ћўћ§§ў§ў§ўўќћ§ћ§§ўњ§ў§ў§ўўћ§ў§ў§§њў§ў§ў§§єћ§ћўћў§ў§§ћ§§ўћ§ќћ§ћ§§ћћ§ћ§ћћѓ§њћћўћћњ§њћњ§§ёћ§§ў§§њћћўњћћ§ћћ§§љ§ћћ§ћф§ћўњўћўћ§§ћћњћў§§ћ§§ў§§ћўћ§ћћ§ќў§ў§ Рќўћ§ћћщљјјњњјњљћњ§§љљћјћњїэёї§§ђљњ§§ўў§§љћњљњ§§ўўњ§§ўѓњ§§ћјјћљјјћ§ўўћђ§ћїњѕѕђђёћ§ўћўўђћ§њњ§§њ§§њ§љћ§§ўњј§ўў§ўњњ§§§ћљ§§ёљћћњўў§ћїђёєљњўўў§ўў§ћўѓњўњ§њ§§ўћ§§њ§§ўўћў ўї§ў§ћјєѓњўў§ћљ§§ў§§њ§§ўђ§њњ§§љћљћљљ§њўў§§њўў§ћњ§§ўћ§§єў§љјїљњјљњљ§§§њ§ўўќњћћ§§ћ§ќћјјћћў§ўў§ћ§ћўљћ§ўўі§ћћјєњ§ўў§§яўћњљћ§ў§ўћўњ§ћјјћћў§ўў§ў§ћћ§ћўћўў§ћњ§ўћ§§ўўўћўўћћў§§ўўќљјњћћ§ўћ§§§ўћ§§ћњўћњ§§ў§ў§ъњ§§ћјєэјљњњћћљћњ§ўўњ§ўў§ћљє§њ§њњљљњ§ћў§§ў§яћљ§ћўўњћјњјїѓѓѕћўў§ћ§љ§ўў§јњ§§ћљњў§§ўњўўљњў§§ћў§§їљћ§њ§§љњ§§№њѕѕєљљ§§њћ§њўћў§§ќњљњ§§юњ§њўњњљ§§њ§ўћўўњ§ўўќњ§§ўў§ћ§ўћўўќњјљћћ§ўњњўћў§ћћёљњўћўўћўўњњўћћўўћњ§§ћўўўћўўњј§љњјњ§ўњњћћљњ§ўў§ ўўћў ўњћўњњћўўыљјћћ§ў§ћ§§љјјњњљїћ§ў§§њўћўўѓћўћњўўћћўћ§§ўўўћўў§ ўєћўў§§њ§їј§ў§§ўњ§§ўћ§ўћўўѓњћўўњ§ўўњ§њњўў§њё§ћљћњ§љћљњљњ§§ўў§ќњў§ўўљ§њћј§њўўћўћўјњћўўћ§њ§§щћљљњњ§њ§њ§§љћћ§ўў§єёїљ§§ўїћўў§§њћљњњ§ћўњњћўўјћўћўћ§њў ў§љћўў№§љ§ћљїюуѓњћњ§ўћўўўћўўўћўўўћўў§ѕњљњ§ћўўћўћўўїњ§ћњњѕљћ§§ћўћўњ§§ўўћўў§ўћњ§љњўў§§њ§§ќњ§§ўўћ§њљћўўўћўўўћўўўћўўўњўўћўў§ўў§яњўў§њњ§їѓѓљљјљњћўўћ ўњњ§ўўњ§§ўћњћ§ћўўё§їљљ§ћљјјњїјћ§ўўў§њњ§§њ§ўўћўњћ§њ§љў ўњ§ћјњњўўћ§ћљ§ў ўї§њ§љњ§ћћ§§ћўјћўћѕљћ§ўўњњўў§§ћћј§њ§§љњћ§§њјћїјћўўўћўўћўћўњ§їљћ§ўўў§ўўћўћњўўћ§§ўћўќћ§§ўўё§ўћњ§њћ§§њ§§ўў§§ўћ§їћњћ§ўћўћўўў§ўўў§ўўћјўњўў§њ§ўў§њ§ўўї§ћљњїєїљўў§ўљўўѓ§њљћљ§ћјљњ§ћўў§ўђћўћўў§§ўўњ§ћћўў§юљјћњљњўўћ§ћ§њўћўћўў§њ§ўўќљ§ў§§ў§§њ§§јћљљјјћ§ўў§ўўћўў§ѓњћ§ўўњњјћ§њ§ўўу§ћћ§§ћћњћўўћў§њ§ћўћў§ћўў§§њњ§§§ўћўўћњўўњўў§њ§§љ§§ќљ§§ўўѓћјћ§§љ§њ§ўўћўўўћўў§§њўў§ўўћў ў§ўўћ§§ћљјћ§ўўќћўћўўћћўўћў ўўћўўњї§ў§њћљ§§ўўўћўўїњћјљњїјћўўћўўћўўћ ўўћўўї§љљћ§§ћћўўўљўў§јњћї§ўўњўўљ§њ§ћўћўўшњў§љљ§§љ§§њњћћўћњ§§ћўњ§ўўћўэ§њ§ћћњўў§ћљњїѕњњ§§ўўўћўўјћ§§ў§њ§ўў§§њљљ§ћ§ћћўфћ§њ§ћўўћўћњ§§ўў§§ћїїј§ўћћўћўўі§ўўњћ§§ћў§§ўћјў§љњўўћ§§ўњўў§§ћљўўљћўўћўћўўўћўўўћўўў§ў ў§њ§ўўњ§љњ§њўўћћўўћўўў§ўўўћўў§ўњћўўћћўўњўўћўўћћњћ§§ўўўћў ў§њ§ўўѓћњ§њњ§§ўўњ§§ўўљњ§§њ§§ўўўћўўњ§љјћ§ўўўћўўўћўў§ўўћўўћ§ўњўўќњљ§ўўћєњўћўў§§ћјјћў ўј§љ§§ўўћўўћўўћўўљћўўћўћўўўћ§§ўў§§њњљїј§ўў§љњћљ§ўћўўєћўўћўўћњ§ћћўўћўўћўўўћўў§ўњўўўћўўћћўўћўўљі§ўўћўў§§ћўўљ ўћћ§§њўў§ўўћўўўњ§§ўјњљјћ§§њ§§ўљјјїћ§ўўњњ§њўўѕћўў§ў§ћўўћўўќћўћўўћ§ўћўўњїћћ§§ћћћљ§ўў§§іћњњћ§§ў§§ўўўћўўўћўўњў§ўўўћўўўћўўўћўў§ўћўўь§ћћ§ўўњњ§ћўўћўўњ§ўў§§ѓјњњ§§њ§ўћўћћўўћњў§ћўўќ§ћћўўѕћ§ћўў§§ћњћ§§ўї§њћ§§њў§њњ ўћў§ѕўћўўњ§§ўўћўўњ§љєѕћўў§ќћњћўўўћўўћяўћ§њњ§§ћћўўћћўў§ўўќ§њћўўўћўўўћўўўћўўїћўўћўћўћўўўћўўўћўў§ўўњўў§§њ§§љћјљ§ћћўўќћ§њўўјћўўћњ§њўў§їћўўћўўћћўўђ§љїјњїљћњњ§§ћўўў§ўўћўљ§ћ§ћўўњњў§ўўі§ћјїњљјћ§ў ўўћўўўћў ўўћўўњћњњ§њўўїћў§њјјћ§ўўўћўўўћўўўћўўћ§њ§ћўўўћў ўўњ§§ўњ§јњљњўўћћўўћў ўћћ§§ћўўћўьћўўћўў§§њ§ћњљћћјћњљ§§їўћў§љїїћўўўћўўќћўћўўўћўў§ћњљўћўўћ§љљ§ўўљњ§ћњњћў ўєћўўћўћўњўўћўўќњ§ћўўћћўўћўўўћўўќћњј§§§њћўў§ўўћўў§цћљћ§ўћњ§ўўћћњ§љў§§њљљћљ§§ўўћ§њћњ§§ќњљ§ўўєћўћљњ§ўћўћ§ўў№ћњ§§ўў§ћљњ§§њћћ§§љј§љўњ§ћњўўћњјћ§ўўїћў§њћўњњўўњ§љ§њћњњѓћўў§§ћћљљњў§ўўќњўў§§ў§ћљњћњ§§§њљћћўўћўў§ў§ћњ§§њ§§ўћ§јјћ§ўћўћўўћ§ћњћўў§ўњўўћўїњћћ§њўўћўўќћўћўўќ§ћћўўўћўў§єњ§ћљћ§њ§њ§ћўўљњ§§њњ§ћћўї§ћ§§љћњ§ўўј§њ§ўћљ§ўўёљћјљљћјїїљ§њ§§ўўћўћљьћњ§ўўћњ§љљ§§њ§ўўњ§њўўћћўў§ўўєњўћўњћљљ§§њљљыјїћњўћўўћўўњ§§њњ§§ћћ§§ўўћўўѕћўў§ћљ§њ§ћјўў§њњєћњњљљњљћћ§§ћћрњћћљїєєћ§ћ§ћ§ћ§ћ§§ўћ§ћњ§ў§§ћ§ћ§ћћђў§ўў§ћ§ћў§§ћ§њњћњћћ§ў§ўўё§њћљњјєяјњ§§ў§ўўќ§ўў§§ћ§яћ§ћћњ§ћ§ћў§ў§§ћў§§љћ§ћ§ћ§ћћя§ћћњ§ўўћћљєѓљћ§§ўўє§ћ§ў§ўћ§ћ§ћўў№§ў§ў§ў§§ћ§ћ§§ўћ§§њћ§ћ§§ў ўіћўћњњїѕњ§ўўў§ўўюћ§ћў§ўћ§ћ§ћў§ў§ўћ§§ћќњћњћћў§ўўоћ§ўў§ў§ў§§ћ§ћўћ§ћўћљїљћ§§ћљћћ§ћ§ћўўѓ§њћћ§ћћњ§ћћ§њњыћ§ў§ў§§ћ§ћ§ћћњ§ћўўћћўўє§ўћњњїїњћўў§§эћ§ћ§§ў§ћњћ§§ўў§ўћћњњѕћњћњ§ўў§§ћўўј§ћ§њћњ§ўўў§ўўєћ§ћћњ§§ўћ§§ўўќћ§§ўўцћњљњњћћ§ћўћ§ћўў§ћ§§ўў§ћ§ћўўтћ§§ў§ўћћ§ћћњњїјњћљљћњћњ§ћўў§ћўўјћ§ћћњћњћћђ§ћ§§ћћ§ћў§§ћ§ўўњћ§њўћўўѕ§ћњљњљїѕјћўў§њњћњћћўўњ§ўў§ћ§§ћћ§ў§ћ§§ўѕ§ўћ§ўўћ§ћ§ћћщў§§ћ§§ћћ§§љјєїјћ§ћ§њћ§ўўѕћ§ћ§ћ§ћ§ћћ§§їў§§ћ§ћ§ћўў§ўћўў§ўћўў§ўђ§ўљїјћњћћ§ћў§ўўћ§ўў§њњ§ў§ўў§ў§ўћўўќ§ўў§§љћљ§§ћў§§ћњјљ§ўў§ћ§ўўў§ўўў§ўўў§ўўћ§ў§ў§§щў§ў§ў§ћњ§ў§њ§§ћњњљњјљњ§§ќћ§ћ§§ўў§ўўў§ўў§§ў§ўўў§ўўњ§ўћ§ћўўњ§ў§ўћ§§№љњћўћ§ћ§ћ§ћ§§ў§ўўљ§ў§ћ§ў§§ўў§ўў§§ћ§§ћќњ§§ћћљ§ў§ћ§§ўўњћ§§ўћўўљћ§њ§ћ§ўўў§ўўў§ўўќ§ў§ўўќ§ўў§§њћ§њћћ§§ћіњћћўў§їѓѕћћў§ћћ§њћ§§ўћ§§§ў§ўў§ўњ§ў§ў§ўўђћўћњћљёэђљњ§ћўўў§ў ўїћ§ћ§§ћ§ћўўў§ўўы§ћћљљјјњ§ћ§§ў§§ћ§ћў§ўўќ§ў§ў ўіћ§§ў§§ў§§ўўїћ§ћ§ћ§ћ§ўўћ§љјњўўњ§ў§ў§ўўў§ўўў§ўўў§ўў§§ў§ўўъћ§ў§§ћ§§ўћ§ў§љїњћћ§ћ§ў ўќ§ў§ўў§ѕў§ћћ§§ў§ў§ўўј§ў§ў§ў§ўўш§њћў§ўў§љјћ§њћњњљљњћћў§ўўњ§ў§ўћ§§ўћ§§ ў§§ў§§ ўћќњљ§ўўћћњћ§ўўш§ў§ў§ўћ§ћў§§њњћ§ћ§ћћњў§ў ў№§ў§ў§ў§ћјјњ§§ў§ўў§ў§ћ§ўў§ћїљћћ§ћ§ћ§ћћњўў§ўўў§ў ўљ§љјњ§§ўўў§ўўў§ўўњ§ўћ§ћўўч§ўћ§§ўў§ўў§ћ§њћћ§§ћў§§ћ§ўўјћ§ћћљћћўў§ўў§ў ўўћўў§ўѕћ§ћў§ў§ў§ў§§ўї§њћљљѕљћўўќ§ўћ§§ўў§ўў§ћ§ћћї§њ§ћ§ћў§ўўћўј§ћћў§ўћўўў§ўўѓћ§ћћњћ§ћ§ў§ўћћ§ўј§ў§ўў§ћўўў§ўўќ§ў§ўўњћўћ§ћўўќ§ў§ўўїћ§ћ§ћњћћњњљ§ўў§ў§ўў§ќћў§ўўў§ўўў§ўўў§ўў§ђћ§ћ§§њћў§ў§§њ§§§ў§ўў§іњћћ§њњ§ў§ўўђћ§ћў§ў§§ўў§ћћ§§њћ§ћ§ћўўњ§ўў§§ўўўћ§§ћў§ћћ§§ў§ўўњ§ћћ§ћ§§ўў§ўўў§ўў§їў§ў§ўћ§§ўўў§ўўў§ўўњ§ўћ§§ўўѕ§ћ§ћ§ћћњњћў ўњ§ў§ў§ў ўў§ўўѓ§ћўћ§њћћ§§ў§ўўў§ўўј§њ§ћљљњўўў§ўўќ§ў§ўўў§ўўў§ўўў§ўўљ§ћћњ§§ўўў§ўўъ§ў§§ћ§§ћњ§ўў§§ўўћ§ћў§ўў§§ў§ћћ§ќћ§§ўўњ§ћ§ўў§§ў§ўђ§ў§ћњћљљјљ§§ћўўќ§ў§ўўќ§ў§ўўє§ћўћ§ћў§ўћ§ћћќњћњўўњћ§ћў§ўўѓ§ћ§§ўћ§њљљ§ћўўњ§ў§ў§ўўў§ўўю§ў§ўћў§§њ§ћў§§ћ§§ўў§ѕў§§ўў§ћ§ћ§ўўќ§ћћўўњ§ў§ў§ўўў§ўўў§ўўў§ўўќћў§ўўў§ўўѓ§ћўў§ў§ў§ўћћ§§ў§ўў§ўўњ§ў§ў§ўўќћ§§ў ў§љў§ў§ў§ўўіњљњ§ћў§ў§ўўќ§ў§ўў§§ў§ўўўћ§§љћўў§ћ§ўў§§ћ§§ўћўўњ§ћњњ§ўўў§ўўў§ўўњ§ў§§ћўўј§ў§ў§ћћўўў§ўў§ў§ћ§њњўў§ўўњћўћ§§ўўў§ўўќ§ў§ўўў§ўўў§ўўшћ§ћўћ§ћ§ћљњ§§ў§ћћ§§њћ§§ўўњ§ў§ў§ўўћ§ў§§ўўў§ўўј§ў§ў§ў§ўўњ§ўћ§§ўўў§ўўў§ўўў§ўўў§ўўё§ў§ўўћћў§ў§ўћ§ўўќ§ћ§ўў§јћ§ћ§ћў§ўўј§ўў§ћ§ћўўј§ў§ћ§ћћ§§ќћ§ћњњ§љў§§ћ§§ўўў§ўўћўў§ўўў§ўўў§ўўњ§ћћњћ§§ыўћ§ћњљњњ§ћўћ§§ў§ў§ў§ў ў§ќћў§ўўў§ўўў§ўўњ§ў§ў§ўў§§ўћћўњ§њћћў§§ў§§ў§§љўћ§ћ§ћ§§ўћ§§ўў§ўў§ўўћўўў§ўўу§ўў§§ћћљћћ§ћ§ћ§§ў§ўў§§ўћ§§ўћ§§§ў§ў ў§ўћўўќ§ћ§ўўў§ўўј§ўћћјјњўў§ўћўўњ§ў§ў§ўўў§ўў§§ћ§ўўќ§ўћўўљ§љћўў§ўўў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўўў§ўўњћ§§ў§ўўіћ§ћ§ћћњћћўўў§ў ўќћ§§ўў§§ў§§ў§§ћўўў§ўў§ћњњљљјњ§§ўћўўў§ў ўў§ўўњ§ў§ў§ўўќ§њ§ўў§ўћўўќ§ў§ўўі§ћїљљћ§ћћўўў§ўўќ§ў§ў ўў§ўўў§ўўњ§ў§ў§ўў§њћ§§ў§ўў§§ў§§њћўќ§ў§ўўў§ўўћ§ћ§§ўў§њћ§ћ§ћўўњћњљћ§ўўў§ў ўў§ўўћ§ўћћўўќ§ў§ўўќ§ўћ§§цў§ћњњ§њљћ§ћ§§ў§§ћљљћўў§ў§ў ўў§ўўѕ§ў§ў§ў§§ћ§ўўў§ўўў§ћћёў§ў§ў§§њњљћ§ў§ўўњ§ў§ў§ўўќ§ў§ўў§ўў§ў ўў§ўўў§ўўјњљњ§ћ§§ўў§§ў§ў ўћљњћњћ§ў§§ў§јўћћ§ћћњћћчў§ў§ў§ў§ў§§љћ§§ћ§ћ§§ћћў§ўў§ўќћў§ўўо§ћћўў§њћ§§ћ§њћћ§ћћў§ўў§§њ§§ў§§њћћўўљ§ўў§§ў§§ў§ћў§§ў§§ѓў§ўћ§њњћћ§ўћўўќћ§ћўўёћ§ћ§ћћљњ§§ћ§ћ§ўўў§ўў§§ў§§їў§ў§ўћ§ћ§§іћ§ћ§ћ§ћў§ўўљ§ћ§§њћўўћ§ћљћўўњ§ўћ§§ўў§њњћћ§§ў ў§§њўўў§ў ўяћ§§ћњћњ§§ћ§§ўў§ў§§ўљ§ў§ў§ўћћќ§ћњ§§ў§ў§ўћњњљљћћ§§ўўњћћќњ§ћўўў§ћћ§ў§їў§ў§ў§ўћўўў§ўў§§њћћ§ћњјїљћ§ўў§ђћ§§ћћњњ§ћ§§ў§ўўќ§ў§ўўљ§њћћ§ћњњў§ђўћћњћћўћ§ћў§ў§§єўћћїљјћ§ў§ў§§§ў§ўў§їў§ў§ў§ў§ўўў§ўўї§ў§§ћўћ§ћћў§ўў§ћјњћѕћј§§ўўќ§ў§ўўў§ўўњћ§§ў§ўўъ§ў§ў§ў§ў§ў§ўћ§ўў§ўћ§§ўўљћњјїљ§ў ўќ§ў§ў ўњ§ў§ў§ўўј§ў§ў§ў§ўўњ§ћјљњўўќ§ў§ўўќ§ў§ўўі§ў§ўћ§ћ§§ўўў§ўўќ§ў§ўўў§ўўќљћњ§§ћћў§ў§ўў§єћў§ўћ§§ўћ§ћ§§ўі§ў§ў§ўћ§§ўўўћўў§ќљњњўў§ћў§ў§ўўўћўўў§ўўіћўћ§ћ§ћ§§ўўў§ўўј§ў§§ћ§§ў ўњ§ўћ§§ўўў§ў ўў§ўўї§ћў§§ћў§ўўў§ўўќ§ў§ўўў§ўўў§ўўљ§ћјўњ§ћћ§ўў§ўўњ§ўћўћ§§јў§ў§ўћ§ўўќ§ў§ўў§ўћњќїљћўў§ќћў§ўўѓ§ў§ў§ўћў§ў§ў§§ўў§ўўј§ў§§ћўў§§ў§ћїїњњ§§ў§§ўў§§ў§§§ў§ўўў§ўўќ§ў§ўўў§ўўў§ўў§ўїћљ§ћ§ћў§ўў§ћў§§ўў§ўўў§ў ўј§ў§§ћ§§ўў§ќњћ§ўўў§ўў§ўњ§ћ§§ў§§ћ§њћњњ§їў§ў§ў§ў§ўў§ ўў§ў ў§ўћўўї§ў§ў§ў§§ўўў§ўў§§ў§§ёўћ§§ў§§ћў§ў§ў§ўўў§ў ўћ§ћў§ўўћ§ў§ў§§ўў§§љў§ўћ§ћўўњ§њїјћў ў§§ў§§їў§ў§ў§ў§ў ўў§ў ўў§ўўє§ў§§њєьїћ§§ўўњ§ў§ўћў ў§§ўћћљљњ§§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўў§ўўў§ўўћ§ћњ§ў2ўќ§ў§ўўі§њ§§ћў§ў§ўўў§ўўў§ўўў§ўў§єњ§§ў§ћћўњўћў ўњ§ў§ў§ў ўњ§ў§ў§ў ўћў§ўћ§ў§ў§§љў§ў§ўћўўјћўћћњ§§ў ўў§ўўђ§ў§ў§ћћў§ў§ў§ўўћў§ўў§ќњ§§ўўў§ўўў§ўўў§ўўў§ўўў§ўўќ§ў§ўў§§ўћћ ўў§ўўў§ўўў§ўўў§ўў§ћћњ§њћўў§ў§ўћ§§ўј§ў§ўћўћўўќћў§ўўў§ўўў§ўўў§ў ўћ§ў§ў§§ћўћ§§ўўў§ўўј§ў§ў§ў§ўў§§ў§ўў§§ћў§§ўў§ўўў§ўўј§ў§ў§ў§ўўў§ўўє§ў§ўћў§ў§ў§ўўї§ћў§ў§ў§ў ўў§ўўў§ўўў§ўўі§ў§ў§ўћў§ў'ў§ќћў§ў ўј§ў§§ћ§ћў%ў§ ўј§ў§ўћў§ўў§њћў§ў§ўўќ§ў§ўўў§ўўќ§ў§ўў§љћњћћў§ўўў§ўўў§ўў§њћўћ§ћў ўќ§ў§ўў§ќњ§§ўў§ўћ§ў§§ўўў§ўўњ§ў§ў§ўўќ§ўћў;ўќ§ў§ў ўў§ўўў§ў ўў§ўўћ§ћ§§ўўў§ўўќ§ў§ўўќ§ў§ўўњ§ў§ў§ў ў§ќћ§§ўўў§ўўў§ўўў§ўў§ќћў§ў ўў§ў#ўў§ўўј§ўў§њћ§ўў§§ў§§ўў§ў!ўў§ў!ўў§ўўў§ўўў§ў ўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўў§ђћў§ў§ў§ўћўћ§§ўўў§ў ўў§ўўј§ўћ§ћў§ўўј§ў§ћњ§§ўўў§ўўў§ў!ў§ўћўўќ§ў§ўўў§ўўє§ў§ў§ў§ў§ў§ў ўќњў§ў ўў§ўў§§ўћћљў§ў§ў§ўўў§ўўў§ўў§ўў§ўўў§ў ўћћўљ§ўўў§ў#ўњ§ў§ў§ў ўќ§ћћў-ўў§ў ў§§ўћћўў§ўўў§ўўў§ў ў§њћўћњњ§§$ў§ўї§ћћњћ§§ћў'ўў§ў ўњ§ўћўћўўў§ўўњ§ў§ў§ўўќћў§ў'ў№§ў§ў§ў§ўћ§ћ§§ў§ўў§ќњ§ћўўў§ў ўќ§ў§ўў§ќњўћўўў§ўўљ§ћў§ў§ўў§ў§ўў§ўўў§ўў§ ўє§ўћў§ў§ў§ў§ў ўў§ў ў§ѓў§ў§§ћў§ў§ў§ўў§ўќ§ўћў ўў§ўўќ§ў§ўўў§ўў§ўћў ўў§ўўє§ў§ў§ћ§ў§ў§ўў§ўє§ў§ў§ў§ў§ў§ўў§§ў§§ўћ§ћўћўўў§ўў§ќћў§ў ў§ўќ§ўў§§ўў§ўў§§ў§ў ўјћў§ў§ў§ўўќ§ў§ўўў§ўўѕћў§§ћћњ§ћў§§ўўћўў§ўњ§ў§ў§ўўў§ўў§ћў§ўћ§§ќљњћўўў§ўў§§ў§ў ў§ћў§ў§ўќўњ§ўўћћњњљ§§ћўў§§ўєћњљ§њў§§њљћўў§§ћўўћўіћ§љ§ўћў§§ўў§ћљњљћ§§ўњўўћў§ћ§ўўіћ§њ§§ўўњљўў§ ўћјў§§ћљњћ§§љћїјљћњўўћћўўћўўўћўўђћњњ§ўўћ§§њњ§§ўўўћўўёћўћўљ§§њ§§ўў§§ўўц§ћјљћ§§ћјљњ§§ўў§їљїїњљљ§§ўў§ўў§ўўќћ§њ§§ўў§§їњўў§§ћњњ§§ўєњў§љјњћљј§ћўўўћўўћў§ўўќћњ§ўўћћўћћўўўћўўў§ў ўћ ў§ў§ћћњ§§ўў§њћў ўўћўўћњ§§њўў§њњ§љўћўўѓћ§њ§§ћћљўў§љўў§ћў§§ћўє§њћћ§ўўњљ§ў§§њћљћ§§ўўћњўўћўўїљћ§§ћўўћўўћњўћ§§ћўў§ћэ§љ§ћ§љ§ѕљњ§§њўўњћћўўўћўўіњ§§ћљљ§љ§ўўўћ§§ўћћўўћўўќћўћўўљ§ћўў§ћљљѕњўћ§њ§њњ§њ§§ўќ§љљ§§§њ§ўўћћўўњўўўћўў§ў§§њўўї§њ§ћљјљ§ўўћјўњћћљ§§ўўћ§њ§§ўўљњћ§ўўћўўќћў§ўў§ћљўћћўўњ§§ ўѕћўўћњњ§ўўћўў§ўўћўўўћў ў§ўўћўў§ўўћў ўќљњњ§§ќњ§њ§§ўўћўўќћўњ§§ўўћўў§ў§ўњўў§љњ§§ї§§ћњ§ўў§§ќњ§§ўўљњ§љљ§§ўў§ћўћўћўўшћњ§ћјњўћўўћўћњћћјљ§§љ§§ўўўћўўяћўўњњ§ћћљћљ§§њ§њ§§§ћўћћўї§ћљ§§ўўћўўўћўўўћўў§ў§ў§§њ§ўў§ћў§§єўћў§јљћ§ўњњў ўўћўўћўќ§њљў ўњћў§ў§ўў§ ў§ќўћћўўќћ§љ§§ћћљњњ§§ўўћўўўњўў§§њ§ў ўў§ўўњў§ўў§њў§њ§§ўўћјў§љўўћћўўўћўў§ћў§§ўѓћ§ћ§§њ§§њ§§ћўў§ћўћћ ўўћўўћћ§§њўўўћўўќћўћўў§ћў§§§ўћўўњ§њњ§њўўў§ў ўўћўўњ§ўўњ§ўўѓћўўћћўљњ§§њ§ўўњћўў§љўўќћњњ§§їўћўўћћўћўўљћўћўћћўўїљ§ўћў§њњ§§ў§њў§§њўў§§њўўўћўўќ§њ§ўўљћўўћўћў ўўћў ўќїљ§ўўўћўўћ ўўћўўјћўў§ў§§ўўўћўў§ўќћўћўўўћўўўњўўўћўўўћўўўћўў§ў§§љ§ўўї§ўћў§ћ§ўњњј§ўў§§ћћўўўћ§§ўїћўўћћў§њў ўўћ§§єћўўћўћ§§ўўћўўљћ§ўљњ§ўўўњўў§њћ§§ќњљ§љљ§їћљћћњїїћ§§њњ§§ўћўў§ў§јњљў§њ§§ўў§ўьњљ§§ћљљ§јћ§њћ§ћљ§ўћўўўћўўўћўўўљўўў§ўўњћ§ўћћўўўћўў§ ўўћўўѕћўўњћћўћўў§§ћњ§њћўўђњљћјљњћјћ§њўў§§љ§љљњњљ§§ўўћњў§§ћћўўњћўћњ§ўўхљњўўћўўњ§ћ§њ§§њ§ўўљњ§ћ§§њћўўќћўћўў№§ћјњћўћњњћўўћўћ§§ўћў ўјћўўћћўћў ў§њћўўўћўў§ђљћ§§ўўљњњћ§њњ§§ћћњ§њ§ўўўћўўўћўўьћ§њњ§§ў§ћћњћћ§њњ§§ў§§ўњ§ўћўћўўћўўћў ўўњ§§іў§њњћљ§§ћў ў§ў§њ§ўўјњ§њ§њћћўў§ўњњ§ћ§ўћўўўћўў§њёў§§њћўў§љћ§§ћћў ўўћўўўћўўўћўўћћ§ўўћўўїњ§њ§§њћњ§§ў§љњўўўћў ўњћўћўњўўўњўўќљњњўўћ§љ§њўўѓњ§ѕћ§§ўўћў§њўўўћўўњљ§ћћўћћўў§їњ§§њўўћ§ў ўќњї§ўўўћўўўћўў§ ўћў§њњ§ўўћўўњћљњћћў ўјћўћўў§§ўў§ќљ§§ў ўў§ўўіћўў§§њ§ўў§§ќњўћўўўћўўўћўўљћ§њњ§љўўўћў ўћћўћћўўќ§ћ§ўўўћ§§ћњ§§њўўќ§ј§ўўћњ§§њў ўљћўњ§љ§ўўіљїїћ§ўўћћўўў§ћћљўњўўћ§ўўћўўљћўњ§§њ§§ўњўўўћўўј§ћћ§ўўћўўќћўћўўїћњћћљ§њњў ўђћўћўћ§њњ§ўўћ§ўўўћўўљњ§ўћњћўўњ§њј§§ўў§њњ§ўћўћўўў§ў ўљ§њ§њ§§ўўќћўћўў§ќњ§§ўўўњў ў§§њ§§§њћўўў§ўўљћў§љўћўў§§ўћўўћњ§§њўўѕћљњњ§ўћў§љўўўћўўћњ§§њўўўћўўўњ§§ћњ§ўњўўў§ўўјћ§њўћћ§ўў§ћњўўўћўўљќћњ§ўўўћўўњњћўњ§њњ§ћљћљ§ў ўћћўўћ§§ћў§њ§ўўћћўўћўўўћўўјћў§њўўњўў§ўћў ў§ћњ§ўћўўќћўћўўўћўўјћ§§њ§§њ§§ў§ў§ўћ§њћў§§њ§ўўћўўў§ўў№§ўћўћћ§ћљњњ§њ§§ўў§ўћў ў§ћўћћўћњўўћўўћ§ўћўњ§њ§§њ§§љњ§њ§љљўўўћўў§ќњ§њ§§ўўћўўўћўўќ§ўћўўќ§њ§ўў§њў§ў§ўўћў ўўћўўќњ§§ўўћњћўћўўћњў§њ§љ§§ўњ§§ќљ§§ўўќћўћўўњїћ§§њњ§ўўњњўјћњњљњ§§ўўўћўўљћўў§§њ§§ў§ўњћћ§љћ§§њ§ўў§§ўњўўћўўљћўњ§њћў ўњ§ўў§ўўќћўў§§ќљ§ћўў§ўє§њњ§ўћўћўћћўў§њў§§ћњњ§§љњ§§ўўћўўњљўћњњїљћ§ћ§њ§љ§§њљ§њў§ўўўћўўю§ўћўњљњћ§ўў§ў§ћћ§ўўј§љјњћ§ћўў§§ў§ћћїњ§љњљћ§§ћћњ№ўћўў§§љўћћїћ§§ўћћўў§ўў§ћћ§њњ§љљћћљ§§ўўљћ§ћљћњ§§њїћљњ§§њ§њ§§њьўћўњ§њ§§ўћўћ§§ћћјљљњњўћ§§њўљ§§тњјћћљјїњјњћћ§§њўўћўћўўћў§§ћљњ§§ћ§ўў§§ћ§ќћљјїїѓљјјњћ§§ў§ў§§љљјјћћјћљј§§ўњўўѓ§њљћћљ§ўў§ћћљљћљяћљћњ§§њ§њћљ§љћ§њћћёњ§њ§јћћљћћљћћ§ћўў§§ѕў§ўў§§ўћ§ћўўѓ§ћ§ћў§ў§ў§ћћ§§іћ§ўў§ў§ўћў ў§љў§§ћў§ўўђћ§ћ§ћў§ћњ§ћ§§ўўњ§ўћў§ўў§ќћ§§ўўў§ўў§ќћ§§ў ўьћ§њћљћћ§ћ§њћњћњ§§ў§ў ўў§ўў§ў§§ћ§§њћў§ў§ўўі§ў§ў§ўўћћ§§њћўў§ћўўћ№њћњ§ћћњћ§§ћў§§њљљћ§§ћўў§ќћ§ћўўћ§ў§§ўў§ќћ§ћ§§фћ§§ў§§ћў§§ћ§ћ§ћў§ў§§ћњљћћ§ћў ўў§ў ўѕћњ§ўў§ўў§ћўўў§ўўў§ўўў§ўўќ§ўћўўў§ўўїћ§ўўћ§ћњ§§§ў§ўўў§ўў§њћ§§ў§ўўўћ§§ўў§ўўђћ§ћ§њћћўў§ўў§ўўюћ§ћ§ўў§ўћ§њћћў§§ў§§єћ§ћњћњћ§ўў§ўўў§ўўњ§ћњћћўўў§ўўў§ўўћ§ў§ўўъ§ўћ§њћћўћўћўћ§ћ§ћ§§ў§ўўў§ўўў§ўўљ§ў§§ћњћћіўћў§ўў§ћ§ўўѕ§ў§ў§ў§ў§§ўўї§њћћў§ўў§§ѕћ§ћ§ћў§ў§§ћћћ§ћ§ћўў§ўњћ§ћў§ўў§ќў§ў§§ўњћћ§ў§ўў§њњћћ§ћўўі§ўћ§ћ§§ў§ўўќћў§ўўў§ўўў§ўўј§ўћ§ўў§ўўі§ўћ§ћ§ўў§ўўў§ўў§ў§§ћўўю§ўћ§ћў§ў§ў§ўћ§ўў§ўўў§ўўќ§ў§ўў§ўћ§§ќћ§ћўўў§ўў§њћ§ћў§ўўя§ўў§ћў§§ћ§§ў§ў§§ћћ§юћўћ§ћ§ћў§§ћ§ћ§ћ§§ўўў§ўў§ћћ§ўў§ўўќћ§§ўўќ§ў§ўўњ§ћњ§§ўўє§њњ§ћ§ћўћ§§ўўќ§ў§ўўэ§ўў§ћћњћњћћ§§ћ§§ћ§ўў§ўњћћў§ўўў§ўў№§ў§§ћў§ў§ў§§ћ§§ўўћ§ћ§ћўўј§ў§§ћ§§ўўљћ§ћњћў§§§ў§ў ўў§ўўћ§ўћ§ўўў§ўўќћўћўўћ§ўћ§ўў§ћ§ўўњ§ћ§ћ§ћћ§ќћ§ћўў№§ў§ў§ўћ§ћ§ћў§ў§ўў§ќў§ў§§єў§ўћ§ћўћ§ћ§ўўў§ўў§ўў§ўўў§ўўў§ўўќћ§ћўўі§ўў§ў§ћ§ћ§§ўћўўў§ўўў§ўўў§ўўў§ўў№§ў§ўўћћ§ўў§ў§ў§ўўў§ўўќћ§ћўўў§ўў§ў§§ў§§ћў§ў§ўўќ§ў§ўўў§ўўњћў§§ћўўњ§ў§ў§ўўїћ§§ћ§ћў§ўўў§ўў§јћ§ћ§§ў§ўўў§ўўў§ўўћ§ў§ў§§ўў§§јћ§ћ§§ўћ§§ёў§ў§ўћ§§ў§ћ§ў§ўўќ§ў§ўўєћ§ћў§ў§ў§ў§ўўќ§ў§ўў§§ў§ўўќ§ў§ўўў§ўўў§ўўњ§ў§ў§ўў§ў§ќћў§ўўє§ў§ўћ§ћ§ћў§ўўќ§ў§ўўў§ў ўў§ўўњ§ў§§ћўўј§ўћ§ћўћўў§їў§§њ§§ўў§§љўћ§ўў§ўўќћ§ћўў§§ў§ўўќ§ў§ўўњ§ўћ§ћўў§§ћўў§§ўћћ§§ћўўї§ћћ§ћ§§ўћћњ§њћњћљљѕњћ§ћ§ћћўў§ўўћ§ћ§ћўўђ§ўў§ћ§ўўћ§ћ§§ўўў§ўўў§ўўћї§ўў§ћ§§њћћњ§њ§§ўћћ§§ў§ўўє§ў§ў§ў§ў§ў§ўўњ§ў§ў§ў ўў§ўўўћўўўћўўў§ўўј§ўў§ћў§ўўў§ўўў§ў ўў§ўў§њћ§§ћ§ўў§ћђў§њњћћ§§ўћ§ћ§ћћѕ§ў§§ћћ§§ў§ўў§ўћўўѕ§ћў§ў§ў§ў§ўў§ўњ§§ѓћ§ћў§ў§§ў§ћ§ўўў§ўўћјњљњўў§§ўўќ§ћ§ўўў§ўўў§ў ўў§ўўў§ўўњ§ў§ў§ўўх§ћћњ§§ўўћљљњћ§§ћ§ћ§њћњ§ћ§ћўўў§ўўў§ў ўў§ўўќ§ў§ўўю§ўўћћ§§ћћўћћњљњњћ§§іћўћ§ћ§ўў§ўў§ўќ§ў§ўўў§ўўў§ўў§єћ§ћўћ§§ћћ§ћўўў§ўўі§ўў§ћў§ў§ўў§ўћўў§§ћ§§ўў§ўўћўў§§јў§§ў§ў§ўў§ўћ§§ћўћћ§ўўћќњ§ћўўњ§ў§ў§ўўў§ўўќ§ў§ўўў§ўўў§ўўњ§ўў§§ўўў§ўў§іћ§ў§ћ§ћ§ћўў§§ў§ўўў§ў ўў§ўў§ўў§ўў§§ў§§ўі§ўћўћ§§ў§ўў§§ў§§ћ§ўњћ§§ў§ўў§ўћўўі§ўў§ћ§ћ§§ўўўћўўў§ўўќ§ўћўўў§ўўќ§ў§ўўє§ў§§ћў§ў§ў§ўўќ§ў§ўўљ§ћ§ћў§ўўў§ўўў§ўўќ§ў§ўў§іћў§ўћ§ў§ћўўў§ўўќ§ў§ўўўћўўќ§ўћ§§љўћ§ћ§§ўўў§ўўўћ§§ўў§ўўќ§ў§ўўќ§ў§ўўњ§ў§ў§ўўќћњћўўў§ўўєћ§ћ§ћ§ћћ§ў§ўўј§ў§ўћ§ћўў§ўћўўў§ўў§ќћўћўўў§ўўјћљљћћў§ўўј§ў§ўћћњћћў§ўўє§ўў§ћ§ћ§§ў§ўўў§ўў§§ћ§§ћљ§ћ§§ў§ўўљ§ўћњњ§ўўў§ўўј§ћњћћ§§ўў§ўћўўўћў ўў§ўў§ћћўў§ўўќ§ўћ§§їў§ўћ§ћ§ћ§§ўћўўњ§ўћў§ўўў§ўўі§ўћ§ћ§ћ§§ўўќ§ў§ўўњ§ў§§ћ§§ќћў§ўўў§ў ўљћ§§ћ§§ўўќ§ўћўўњћў§ў§ўў§§ћўў§јћ§§ў§ўў§§ўў§ўўў§ўўў§ўўј§ў§§ћ§§ўўє§ў§ў§§ћ§ћ§ћўўў§ўўќ§ў§ўўіћў§ўў§ў§§ўўќћў§ў ўќ§ў§ўў№§ў§ў§ўўћњ§ћў§ў§ўў§ў§§ћ§ћћў§ў ўј§ў§ўў§ћ§§ ўў§ўўўћўўў§ўўі§ўћ§ћ§ўў§ўўў§ўўўћ§§ћў§ў§ўўњ§ў§ў§ўўўћ§§іћ§ћ§ћў§§ћў ўў§ўўћ§ћ§ћў ўў§ўўћћ§ўўћћ§њћ§§ў§ўўі§ў§ўў§§ў§ўўўћўўќћњћ§§ўћўўі§ў§ўћ§ўў§ўўњ§ў§ў§ўўі§ў§ў§ў§ў§ўўњћ§ћў§ўўю§ћ§ћћ§ћ§ћ§ћ§ћћ§ў§ўўў§ўў№§ў§§ћ§ћ§ћ§ћ§ћ§ћўўќћў§ўўњ§ў§ў§ўўњ§ўў§§ўўќћ§ћўўћ§щў§§ћ§ћ§ћ§ћў§ўћ§ћ§ћў§ў§ўўў§ўўў§ўўќ§ћћўўќ§ў§ўў§ћ§ћћё§ћ§ћ§ћ§ћ§ћў§ў§ўўў§ўў§§њћ§§ќћўў§§ѓў§ў§ўў§§ў§§ћўўў§ўўў§ўў§§ћ§ћћїў§§ћ§ћ§§њњјћњћ§ћ§ћ§§§ћўћћ§ў§ўў§єў§ў§ў§ўў§ћ§ўўћ§ў§ў§§іћўў§§ў§ў§ўўі§ћ§ћ§ћ§ћ§ўўјћ§ўў§ўћ§§§ў§ўўў§ўўі§ћ§ўў§§ћћ§§њћ§ћў§ўўю§ў§ўў§§ўћњљњљћњ§њ§§єў§ћ§ћ§§ў§ў§ўў§§ў§§аў§§ћљњ§ўўћўћўў§§ў§§ћњљћћў§ўў§ћ§ў§њћњ§ћў§ћњ§ћћњћ§§њў§ўћћўўњћ§ўќ§ўћўўў§ўў§ћўњ§§ћьњћћ§§ў§ўў§њћњ§ћ§ћ§ћ§§юњћ§§ћ§ћ§ћ§ћ§ћ§ћ§§ўў§ўћўўј§ћћњњћћљљјњ§ћ§ћ§ћ§§ъћ§ћ§ћ§ћњњћњљљњљћњ§ћ§§ўў№§ўў§ћњћ§ћ§ћ§ўўћ§§№ћў§§ћћњћњћћ§њћњљљѓјњњљњ§ћў§ўћ§ћћў§њњћъ§ћ§ћ§§ў§ў§§ћћњћћў§§њњћћўњћћњњћњ§ћ§§ћў§ћћњ§њћњћ§§њ§ћњћћ§њ§њўў§ўўњ§ў§ў§ўўќ§ў§ўўјћў§ў§ў§ўўј§ў§ўћў§ўўє§ў§ў§ўћ§§ў§ўў§§ў§ўўќ§ў§ўў§ћѕў§ў§§њћћ§§ўўќ§ў§ўўў§ўўў§ў ўњћў§ў§ўўў§ўўєћўћ§§ўћў§ў§ўўі§ўљ§њћћў§ўўќ§ў§ўўў§ўўє§ў§ў§ў§ў§ў§ўўў§ўўњ§ў§ў§ўў§ћ§ўќћ§§ўўў§ў/ўў§ўўљ§ў§ў§§ўўќ§ў§ўўќ§ў§ў ў§ўћўўў§ўўњ§ў§ўћўў§ўћўўї§ў§ў§ў§ў§§§ў§ў ў§ў§ўћўў§§ў§§§ў§ўў§§ў§§ўќ§ў§ўўў§ўў§ўі§ў§ў§ў§ў§ўўј§ўћў§ў§ўўў§ўўў§ўўў§ўў§§ў§§§ўћўў§ќћ§§ў ўќ§ў§ўўў§ўўў§ўўќ§ў§ў ўќ§ў§ўўў§ўўў§ўўў§ўў§§ў§§ћў§ў§ў ўќ§ў§ўўў§ўўќ§ў§ўў§§ў§§§ў§ўўќ§ў§ўўќ§ў§ўўў§ў ў§ќћў§ўўў§ўў§ў§јћ§§ў§ў§ў ўі§ўћ§ћ§§ў§ўўќ§ў§ўў§ўў§ўўќ§ў§ўўќ§ў§ўўћ§ў§§ўўќћ§§ўўў§ў-ўў§ў ўў§ўўј§ў§ў§ўћўўќ§ў§ўўў§ў ўў§ўўў§ўўў§ўўў§ў ўў§ўўў§ўўі§ў§ў§ў§ў§ўўў§ўўў§ўў§§ў§ўўў§ўўў§ў ўњћў§ў§ўўў§ўўј§ў§ў§ў§ўўў§ўўј§ў§ў§ў§ўўќ§ў§ўўў§ўўў§ў%ўќ§ў§ў#ўќ§ў§ў ўќ§ў§ў#ўўћўўў§ў ўќ§ў§ўўў§ўў§ўќ§ў§ўўў§ўўў§ўўў§ў ўў§ўўў§ўў§ўѓћў§ў§ў§ўћўћў§§іћўњ§§ў§ў§ўўќ§ў§ўўў§ўўќ§ў§ўў§ћўћ§§ўўќћ§§ў%ўў§ўўў§ўўќ§ў§ўўѕ§ћў§ў§ћћў§ўў№§ў§ўў§§ў§ў§ў§ў§ўўў§ўўў§ўўў§ўў§ћў§ў§ўўњ§ў§ў§ў ўјћўћ§ўў§ўўќ§ў§ў+ў§§ў§§ўюћўћ§ўў§ў§ў§§ћ§§ў§ў%ўўћўўіћ§ћ§§ў§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўњ§ўћ§§ў ўў§ўўў§ў ўњ§ў§ў§ў ўќ§ў§ў ўќ§ў§ў)ўў§ўўє§ў§ў§ў§ў§ў§ў!ўў§ўўќ§ў§ўўњ§ўћў§ўўў§ўўў§ўў§)ўў§ўўќ§ў§ў ўў§ўўў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ў'ўў§ўўќ§ў§ў ўў§ўўў§ў ўў§ў ўћ§њ§ћў ўњћ§ћў§ўўњ§ў§ў§ў ўњ§ў§ў§ўўќ§ў§ў ў§ўќћ§§ўўќ§ў§ўўў§ўўў§ўў§ўј§ў§ў§ў§ўўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ў ўњ§ў§ў§ўўў§ў#ў§ўў§ўўє§ў§ў§ў§§ћ§§ўўј§ў§ў§ў§ў#ўќ§ў§ў ўќ§ў§ўўј§ў§ў§ў§ўўў§ўўќ§ў§ўўў§ўўќ§ў§ў ўў§ў ўј§ў§ў§ў§ўўў§ўўў§ў ўі§ў§ў§ў§ўћў ўќ§ў§ўўњ§ў§ў§ўўў§ўўў§ўўў§ўўј§ў§ў§ў§ўўќ§ў§ў-ўѕ§ўћў§ў§ў§ў§§ ўј§ў§ў§ў§ўўў§ўўњ§ў§ў§ў ўќ§ў§ўўљ§ў§ў§ў§§ћў§ў§ўўќ§ў§ў ўў§ўўќ§ў§ў ўќ§ў§ўўў§ўўљ§ў§ў§ў§§ўў§ўўќ§ў§ў ўќ§ў§ўўћ§ў§ў§§§ў§ў ў§§ў§§ќћњћ§§њў§ў§ў§§ўў§ўўў§ўў§ќћў§ўўў§ўў§ќћўћўўѓ§ў§ў§§ћў§ў§ў§§љўћ§ћў§ўўњ§ўћў§ўў№§ўћ§§ў§ўћўћ§ћў§ўў§јў§ў§ў§ў§§ёў§ў§ў§ў§ў§ў§ў§ўўќ§ў§ўўы§ўћ§ћ§§ћћўћ§§ў§ў§ў§ў§§њў§ў§ў§§ќўњўћћ§§ў§ўўі§ў§§ўў§ў§ўў§ў§јўћ§ћ§ћў§§њћњ§њ§ћћ§ўљ§ўў§§ћ§§єћ§§ўћ§ћў§ў§ўў§ќћўћўў§ћћ§§ў§§љў§ў§ўћ§§ѕћў§§ћ§ћў§ў§§њћ§ћ§ћ§§ў§єћ§§њњљ§њ§ўћўўќњљ§њњў§ўўњ§ћўћћўўўћўўћўіћўў§љљњ§ћўўўћўў§ўўћўўўћўў§ўўћўў§ўўћўўљњўў§§ћў ўіћў§њ§§њ§њўўњњїјћ§ўўќћўћўўћўўћўўљ§љљћ§њўўјћўўћў§њўўўњўўњ§јљњ§ўўўћ§§ўњўўћўўћўўћќњўћўўўћў ў§єњўўћўњљљ§њћўўўћўўћћўўћўўќћўћўў§ўўћўўјћњњўћў§ўў§ў§њ§ўїћњ§њ§§ўћўўћ ўўћўўљ§њљў§њљљ§ћ§ўњ§§ўўњ§§ќљћљўўўћўўј§љћћ§ўћўўћљўћћўўћў ў§ ўјћўћћњњћўўўћўў§їўћў§§ўўњ§§§њ§ўўќћўўћћўњњ§§љ§ўўёћўў§њўћћўў§§њ§ў ўўњўўњћ§§њ§ўўўћўўўћўўќћ§§ў ўћўўћўўѕћ§њњћњў§§ћў ўўћў ўўњ§§ўћўўўћўўўћ§§§ўњўўќћўњўў§ўњўў§ћў§§§њљ§§њњћћљ§ўў§ ўўћўўћ§њљћўў§ћўћўћўў§љ§ћћэљњњћўћўўњћ§њљћњјћњўўєћњ§њњ§ўћ§§њўўѓћўў§њўњњ§ўўћў ўј§њ§§ћћљ§§јњ§њў§§њўўўћўў§ўћўў§ўћўўћћўћњ§§ўўћўўє§ћћ§§ўў§§њћў ўћњ§ўћўў§ќўћћўўћўўћў ўњў§ўїћ§њњћўўћўўћњ§њ§ўўљћўўћўћўўўћў ўњўїўўћўћўњћўў§§ўўўћўўў§ўў§ћ ўќћўў§§ўњўўў§ў ў§ўўћўўўћўўўћ§§§њћўў§ћ§ўћўў§іўћўў§§љўў§§ўїћўўњњ§§њ§§ћћ§љњ§ўўїўћўўћўўўћўўћњў§§ўў§њўїћњ§ўљњњћўўћ§§њ§ў ўћћўўћўў§ђњ§њ§ћ§ћўўљ§њ§ўўћўў§§ў§§њћўўўћўўљ§ћ§§њў§§ўў§ўўўњ§§ўњњ§§ўўћћ§њўўћўў§ў§їћўћўћў§њћћјўњњўўћ§ўўћў§њў§ў ўўћўўўћўўќ§њњ§§љћўўћўћўў§ўў§ўўўњўў§ў§§њ§ўўўћўўњїћљўў§§ўћўўўћўўћћўўћўўћўћћўўћўўўћўўєћ§§њ§ћўўњљћ§§ћў§њњўўўћўўћэў§§ћћњћ§ўўћўўћ§§њ§ўў§љ§ўў§їњўў§љњћњ§§ўў§§ў§ѕў§љћћњљљњ§ўў§ўљ§§ў§ ўўњ§§ўњ§ўўћўўўћ§§њўњњ§ў§§њў§њ§§ўўјћўўћўћћўўњћўћњ§ўўќњ§§ўў§ўћўў§ў§ўћўўћўўўћўўў§ўўїњ§§ћўў§§ўўіћўў§њ§њ§љћћ§ўўћў ўњњў§ў§њњћўћўў§§њ§§ўћўў§§њљљ§ўў§§ ў§ўћўўњћў§ўћўўћўњ§ћћљњ§§ў§ўћњњќјљљ§§ќњ§§ћћљћћљњ§ћўўўћўўќћўў§§ўћўўўћўўіћўћўў§§њњўў§ўўћўўх§ћњїјћ§ўћ§ћўўћћўў§љћћљћ§§њ§§ўћ§§ўњўўј§ћўњ§њ§ўўњћўћўћўўњћўњ§§ўў§ћў§§ўўћўўћ§ўћўўћ§њњћўў§њў§ћћ§ўў§§ѕћўўњљћњ§ћљ§§§њ§ўўљћўћћ§ћўўі§љљћ§§њ§§ўўћћўўњўў§ќњ§ў§§њљ§§њ§ўў§њљѕћ§њ§§ўўћћ§ў§ўўћ§њ§ћўўљ§њўўњј§§ўўњ§§ќћўћ§§ўўћўў§ў§ђљ§њ§§ўћ§§њў§њ§§ўћўў§ёњ§§њ§§ўўћўћў§§ћћ§ўљ§§јў§§њњ§§њњќ§њўњњєљўњ§ћљљ§§њ§ўўћћўўћ§§ќњўћўў§њљћ§јћў§§ўўћ§§ўўћўў§њћљјћ§ўўќ§њњћћ§ўњ§§ўќ§ўў§§ќћўў§§ў§јњћ§њћўћњњў§ўўќћ§ћўў§ўњћўўћў§§ўќћўћ§§ў§§ћљ§§ђњ§§ў§њ§јћјћћњљљўњўўљћўњњ§§ўўўћўўўћўўјћњўњ§§љ§§јњ§ўў§љ§ўўўћўўїћўћўўњ§§ўў§ѕјћ§§ўћћ§њћўўћћўўћўўћћўњњ§§§ўћўўўћўў§ўћўўїћ§§њ§ўў§ћћў§ўўўћўўў§ўўў§ўўўћўўўћўўўћўўћћўўњ§§ўњ§§ўњўцњ§§њ§ћўўњљњњўўћћ§§ўњ§§њњ§ўўќћўћўўћ§њћћ§§ћњљњ§ўўєњўўћћљ§§њ§ћ§§ў§ў§ћњўў§јћњњ§§њ§ћћ§ўћўћќўћњ§§ћўћўњ§§ќћўў§§ѕўћўњљј§§ўћўў§ѕћўћњ§§ў§њ§ўў§ ўўћўўћњ§§њ§§љўњњ§§ћўўєљ§њў§њ§§њњћўў§ћњўўѕћў§љћ§§њўћўўє§љћјљћњ§њњћ§§ѕї§§њћћўњљљўў§ћњ§§ѕў§ћў§њњ§њњў ўўћўў§§љ§§§ћ§ўўћўћћўўћўўўњ§§њўћўў§њњќ§љљ§§ўы§њ§§ћјљњ§ўћўўћўўћњ§љ§§ў§єў§§јљњљћ§њћњњќљћњ§§њ§њў§ўў§ёњћјїјљјњљњ§њ§§ўў§ќњ§§ўў§ќњ§љ§§ћњ§§ў§§њњ§ўўћўўњ§јјћњ§ў§њ§§ьћњ§ўў§љћљјљљ§§ћљ§ўў§§ўњўўќћўў§§ўњћќљ§ўћћњљњњ§њ§§њ§ўљћћ§ўўћўўѓњ§њљљјљј§§ўў§§ќљјј§§ўќћўњ§§љћ§њ§§њўў§ўўћўўћ§ў§ўў§єњўўћўўћўњ§њћћљљўў§§љ§§ќњўћўўљћўћўўњ§§њїўћ§§ўњ§§ўўі§ћћ§њ§§љћљљђ§ћћјњјїћ§њњўћўўўћўў§ћњ§§њўўћћ§§љ§§ўќ§њњ§§ћљ§њњ§§ў§њ§ўўў§ћћљњч§љ§§ћљћњњўў§ћ§§њћљјћ§§њћўў§ћ§љїћљјћљљњњўў§ў§љјљљјјћљ§ўўќ§јј§§ў§ћўў§§њљћ§ўў§§§њ§ўўќћўў§§ў§ћљјњ§§ўћ§љ§§ўў§ўўћћњ§ћћ§§ў§љћњљћјћљ§§јњўћўњљ§ўўыћўњњ§љћјћћљћњ§ўўњћћњўўњё§ў§њњћњ§§њ§§љљ§§љў§ќћњћ§§ўў§§§ў§ўўќ§ўћ§§ўњ§ўћў§ўўў§ўўў§ўўћ§§ћўўќ§ў§ўўќћ§§ў ўі§ўћ§ћ§ћ§§ўў§њћ§§ў§ўўњ§ўўћ§ўўќ§ў§ўўў§ўўќћ§ћ§§ўў§њњў§ўўў§ўў§§ў§§ћќњ§§ўў§§ћўўћ§ў§ў§§ўћ§§§ў§ўўњћ§ћ§§ў ўќ§ў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ў ўќ§ў§ўўјћ§ћ§ћў§ўўњ§ўў§§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўњ§ў§ў§ўўћ§ў§ўўќ§ў§ўўў§ўўў§ўўњ§ў§ў§ўў§ўў§ўўј§ў§ўћ§§ў ўў§ўўі§ўћ§ћ§ћ§ћ§§їћ§ћ§ћў§ў§§ўћўўў§ўўў§ў ўќ§ў§ўў§ўў§§ћў§ќћ§§ўў§јћ§ћњћў§ўўј§ўћћњњћўўў§ў ўі§ў§ў§§ћў§ўўў§ў ў§ўў§ўўў§ўўў§ўў§ќћ§ћўўіћ§§ў§§ћ§ћ§§ ўы§ў§ў§§ћ§ћћ§ў§ў§ў§ўћ§ўў§њћ§ћў§ўўќ§ў§ўў§љў§ў§ў§ўўў§ўўў§ўўі§ўў§ћ§ћў§ўўі§ў§ў§ўћ§§ўўў§ўўў§ўўў§ўўў§ўў§ўќ§ћћўўў§ўўў§ўўў§ўўў§ўў§ќћ§ћўўў§ўўђ§ў§ў§ўћ§ћ§§ў§ўўќ§ў§ў ўќ§ў§ў ўі§ўћ§ћ§§ў§ўўь§ў§§ћ§ћ§ћ§ћ§ћ§њћћ§§ўў§§ўћћўў§ўў§§ў§§ўў§ўўэ§ў§ў§§ћћўў§ў§ў§ўў§њњћћљљњўўє§ўў§§ћњљњњ§ўў§§ћ§§ўќћ§§ўўўћ§§ўў§ўўј§ў§ўћ§ћњњќћ§ћ§§ћўћ§§ўўњ§ў§ў§ўўљ§ўў§ћ§ўўј§ћћў§ў§ўў§јћ§§ў§ў§ўўч§њћћ§§ўћ§§ў§ў§ў§ў§ў§ў§§ћўўњ§ўў§ћўўў§ўўќ§ў§ў ўќ§ў§ўў§ў§ќћ§ћўўќ§ўў§§ ў§њћ§ћў§ў ўњ§ў§ў§ўўў§ўў§ўќ§ў§ўўњ§ў§ў§ўўў§ў ўњ§ў§ў§ўўў§ўўў§ўўќ§ћћўўў§ўўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўўњ§ў§§ћўўј§ў§ў§ў§ўў§ћќ§ў§ўўўћўўќ§ў§ўўњ§ўћ§ћўўќ§ў§ўўј§ў§ў§ў§ўў№§ўў§ћ§ћ§§ў§ў§ў§ўўю§ўћ§ћ§ўў§ў§ў§ўћ§ћўў§§ћўўњћ§ћ§ћўў§єћ§ћ§ћўў§ћ§ћўўў§ўўў§ўўќ§ў§ўў§§ў§§єћў§ўћ§ћ§§ў§ўўђ§ўў§ћўў§§ў§ў§ўўўћ§§ўў§ўўў§ўўў§ўў§єћ§ћ§ћњћў§ўў§§§ў§ўў§ѓћ§§ўў§ћ§ћ§ћ§ўўі§ў§ўў§њ§ћ§§њћ§ћў§ўў§ѕў§§ћ§ћ§§ў§ўўћ§ћ§§ўўњћ§ћ§ћ§§ўё§ўћ§§ў§§ћў§ў§ў§§ўў§ўўјћў§ў§ў§ўўќћ§ћ§§јћў§ў§ў§ўўў§ў ўў§ўўўћ§§њћ§ўў§ўўў§ўўь§ўћ§§ў§ўћў§ў§ў§ў§ў§ўўњ§ў§ў§ўўѕ§ўћ§§ў§ўћћ§§ўљ§ў§ў§ў§§ћћў§§ћўўў§ўўў§ўўі§ў§ў§ў§ў§ўўр§ўў§ћ§ћў§ў§ћњ§ћ§ћ§ћ§ћ§ћўћ§§ў§ў§ўўў§ўўюћ§њњљћ§ў§ў§ўў§ћ§ћўўњ§ў§ўћўў§ѕћ§ћ§§ўћћљћ§§јћ§ў§ћ§ћўў§§ћ§§ћъњљјјљ§ўў§ў§ўћ§ў§ћ§ћ§§ўўњћ§§ў§ўўя§ћћ§ћ§ћ§ћ§§ў§§ћ§ўўц§ўћ§ћ§ћў§ўћўћ§ћўћ§ћ§§ў§ў§ўўў§ўўў§ўў§§ћўў§ўћўўњћ§ћ§ћўўў§ўўљћ§§ў§§ћћўќ§ў§ўўќ§ў§ўўўћўў§јћ§ўў§§ћўўќ§ў§ўўљћ§ћ§ћћњњћ§ў§ўўќ§ў§ўўў§ўўњ§ўћўћ§§ў§ўћ§§ѕћ§ћ§§ў§ў§ў§§ћљ§ћў§§ћўўў§ўўњ§ў§§ћўўќ§ў§ўў§§ў§§ўў§ўўћъњћ§§ћ§§ўћ§ћ§њњљљњћћ§ћ§§ќћњњћћјњћћ§ћў§ўўў§ўўў§ћћ ў§ќћ§§ўўћћ§ћ§ўўђ§ћњљљњњ§ўўћў§ўўћўњћћ§їћ§ћњћ§ћ§ўўў§ўўіћў§§ћ§ћў§ўўў§ўўќ§ћ§ўўћ§ћ§ћўўў§ўўќ§ў§ўўќ§ў§ўў§ў§ўћ§§шњћњ§ћ§ћўћ§ћў§ў§ћњ§ћњћ§ћ§§§ў§ўўўћўў§§ўћћ§њћ§§ќћў§ўўј§ў§ў§§ћ§§јў§ћ§ћўћ§§ўјћ§ћ§ћ§њ§§ќћ§§ўўњ§ћ§ўў§§ўњўўіћ§ўў§§ћ§ћўў§ќћ§ћўўњћ§ћў§ўўѕ§ўћ§ћћўў§§ћћэ§ћ§§ўћ§§ўћ§ћ§ћ§ћў§ўўў§ўўў§ўўј§ўў§ћ§ћ§§яћў§ў§ў§§ћћњћњ§ћўћћ§§ћ§§ўћ§§ўћ§§ўћ§§шћў§§њћћ§ћ§ћў§ў§ў§ўў§ћ§§ўўј§ў§§ћ§§ћћіњ§ћ§ћў§§ћўўћўў§ўўпћ§њћњњћў§ўћ§§ћњћћ§§ћћ§§ў§§ўўћ§ћ§ўў№§ћ§ћў§§ћ§њ§§ў§ў§§ўђ§ўћў§ў§§ћ§§ў§ўўў§ўўњћ§ћў§ўўэ§ћ§ћў§§ћ§њћћ§ћ§ћ§ћ§§љћўћ§ћ§њњњ§ўћћ§ўў§§ў§§ўћўўў§ўўц§ў§ўў§ў§ћ§ў§ћ§ћ§ћў§§ў§§ў§ўў§§ћ§ўўљ§ћ§њ§ћўўјћ§њў§ў§ўўњ§ў§ў§ўў§њћ§ћ§§ўў§јћ§ћ§ћў§ўўѓ§ћ§ћў§§њћњ§§ўўќ§ўћўў§ўў§ўўњ§ў§ў§ўўќ§ў§ўў§ќћ§ћ§§ћћ§§ў§§љў§§ћ§ћўўќ§ћ§ўўўћ§§ўћ§§ўћўў№§ў§§њћћ§ћ§ћ§ћў§ўўў§ўўћ§ћњ§ћ§ўўљ§ћ§ћ§§ўўњ§ў§ў§ўў§ьћ§ћ§ћћ§§ћћ§§њћњ§ћ§ћўўў§ўўў§ўўћ§ћ§ћўў§іћ§§ў§ўћ§ћўўњ§ћћ§ћўў§ћ§ўў§§ћ§§ўќћ§§ўўј§ў§ў§ў§ўўў§ўў§§ћ§ћћяў§§ћ§њў§ўў§§ўћ§ћ§§ ўћњњ§ћ§§ўў§ћю§ћњ§ћ§§ћћ§ћ§ћўћ§§ўўѕ§ћћў§ўў§ћ§ћћї§ћ§ў§ўўћ§§ ўў§ўўў§ўўћћў§§ћћўў§ўўў§ўўќ§ў§ўў§ќћ§ћўў§ћћ§ћўў§§ћћњњћ§§ў§§ћ§ћћћў§§ћ§§ћћ§ћњћћѕ§њњљљћћ§§ћ§§ўћ§§йћў§ўћ§§њњћњћњљћ§ћ§ћ§§ў§ўћ§ћћ§§ћў§ўў§ћ§ћћ§§ћ§§њћўћ§ћ§§ў§ёћ§ћ§њ§§ўћ§ћ§ћњ§§чўћўњћњћћ§ћњћ§§ўћ§ћ§ћ§§ў§ўў§ћћ§§ў§§ѕћњњў§ўўњњћ§§ћћ§ћ§ћ§§їћ§ћњњћћ§ўўф§ў§ўў§ћ§ўў§ћ§§ћў§§ћ§ћћњ§ћ§ћўў§іћ§ћўћ§ћ§§ўўіћ§ћў§ў§ў§ўўіћў§ўћ§§ў§ўў§ыћњћўў§§ћўћ§ћ§ўў§ў§ў§ўў§ўћ§§ўўћ§§ќћ§§ўўі§њћћ§ћ§ћњћћї§њћњљњћњ§§ўњњў§ўћ§§§ћ§ўўюћ§ћ§ћ§ћў§ў§ў§ў§ўћ§§іћ§ћ§ћ§ћўћ§§іћ§§ў§§ћў§ўў§њћ§§ў§ћћ§ўяћњћ§§ћјњњ§ћ§ўў§ўћћэњћњћћ§ћ§ћћњћњњћћ§§ўўў§ўўљћ§ўўћ§ћћњўћњњћўы§њњћ§ћў§ў§ў§ў§ўћ§ћ§ћўўљћ§ћ§ћ§ћћўї§ћ§ћ§ћў§ўўцћ§ћ§§ўћ§њњћћ§§ћўў§ћ§ћ§§ўћўў§њѕћ§ћ§ћўў§ћ§ћћњѓћњ§њћћ§ћ§ћ§§ўўњ§ћ§ў§ўў§ћљњ§њћћњ§§јў§ћњ§§ў§§ќў§ћ§§ћќ§ћ§ћўњ§ў§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўќћў§ўўў§ўўњ§ў§ў§ў ўў§ўўў§ўўў§ўўњ§ў§ў§ўўњ§ўћ§§ўў§§ў§§ў§§ў§ўўќ§ў§ўAўќ§ў§ўўќ§ў§ўMўў§ўўў§ўўђ§ў§ў§ў§ў§ў§ў§ўўќ§ў§ўўі§ў§ў§ў§ў§ўўќ§ў§ўў§§ў§§ўќћ§§ўўў§ўўў§ў ўќ§ў§ўўў§ўўј§ў§ў§ў§ўўћ§ў§§ўўў§ўўќ§ў§ў ўў§ўўќ§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ў+ўќ§ў§ў ўћ§ў§ў§§їў§ў§§ћћ§ўўў§ўўў§ў ў§ћў§ўўј§ўћ§ћў§ўўњ§ў§ў§ўўў§ў ўќ§ў§ўўќ§ўћ§§ћў§ў§ўўў§ўўќ§ў§ўўќ§ў§ў ў§ќћў§ўўў§ў ўў§ўўў§ў#ўќ§ў§ўўќ§ў§ў ўў§ў!ў§pўў§ўўў§ўўў§ўўњ§ў§ў§ў ўќ§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўј§ў§ў§ў§ўў§ўќ§ў§ўўў§ў ўў§ўў§ ўќ§ў§ўўј§ў§ў§ў§ўўќ§ў§ўўќ§ў§ўўј§ў§ў§ў§ў ў§љў§ў§ў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўј§ў§ў§ў§ў ўў§ўўў§ўўў§ўўќ§ў§ў#ўќ§ў§ў ўў§ўўў§ўўў§ў ўј§ўћ§ўў§ў5ўќ§ў§ўўєћ§§ў§ў§ў§ў§ўўў§ў ў§ќўћ§ўўќ§ў§ў ўњ§ў§ў§ўўћћўћў§§љў§ў§ў§ўўђ§ў§ў§§ћ§ћњюћ§ўўј§ў§ў§ў§ўўў§ў ўј§ў§ў§ў§ўўќ§ў§ў ўќ§ў§ўўўњўўў§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ў ўў§ўўћћў§§ўўў§ўўќ§ў§ўўќ§ў§ўўќ§ўћ§§ў§ ўў§ў ўў§ў ўјћ§§ў§ў§ўўѓ§ў§§њћћўћ§§ў§§ћў§ўћ§§њћ§ћ§§ўўў§ўўќ§ў§ўўљ§ћњњ§§ў ўюћўћўћў§ў§ў§ў§ў§ў§ў ўў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўє§ў§ў§§ћ§§ў§ўўў§ўўћ§ў§ў§§ћў§ў§ў ўјћў§ў§ў§ў ўі§ў§ў§ў§ў§ўўќ§ў§ўў§§ў§§ћў§ў§ўўћ§ў§§ўўў§ўўќћў§ўўќ§ў§ўўў§ўўў§ўўј§ў§ў§ў§ўўў§ўўњ§ў§ў§ўўј§ў§ў§ў§ўўј§ўћ§ћ§§ўўт§ў§ў§ў§ў§ў§ў§ў§ў§ў§§ўў§ў§ў§ў§ўўќ§ў§ўўє§ў§ў§ўћ§§ў§ўўў§ў ў§§ў§ўўј§ўћўћў§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўў§§ў§§ўќ§ў§ў ўќ§ў§ў ўў§ўўќ§ў§ўў№§ў§§ћў§ў§ў§ў§ў§ўў§ћћ§§ў§§ўќ§ў§ўўє§ў§ў§ў§ў§ў§ўўќ§ў§ў ўќ§ў§ўў§§ў§§ў§ўњ§ў§ў§ўўњ§ў§ў§ўўќ§ў§ўў§ќћ§§ў ўў§ўўі§ў§ў§ў§ў§ўўў§ўўќ§ў§ўўў§ўўњ§ў§ў§ў ў§ћћў§ў§§ўў§ўў§§ў§ўўњ§ў§ў§ў ўі§ў§ў§ўћў§ўў§њћ§§ў§ўўќ§ў§ўўћ§ў§§ўўў§ўўќ§ў§ўўў§ўўј§ў§ў§ў§ўўў§ўўќ§ў§ўў§ўў§ўўњ§ў§ў§ўўўћўўњћ§§ў§ўўќ§ўћ§§їў§ўћў§ў§ўўў§ўў§ўќ§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўў§§ўћўўќ§ў§ўўі§ў§ў§§ћў§ўўі§ў§ў§ў§ў§ўў§ўт§ў§ў§ў§§њ§ћў§§њўћ§ћў§ў§ў§ў§ў§ўўљ§ў§ўћўћћ§ћў§ў§ўўў§ўўў§ўўє§ў§ў§ў§ў§ў§ўўњ§ў§ў§ўўь§ў§ў§ў§§ў§ўў§ў§ў§ў§ўў§їћ§ў§ў§ў§ўўњ§ў§ў§ўўќ§ў§ўўі§ўћ§§ў§ўў§§ўќ§ў§ўўї§ў§ў§ў§ў§§ћўћў§ў ўњ§ў§ўў§§ўі§ў§ў§ў§ў§ўўќ§ў§ўўў§ўўў§ў ўў§ўўњ§ўћўћўўј§ў§ў§ў§ў ўњ§ў§ў§ўўњ§ў§ў§ўў§ўћўў§ћ§§ў§ў ўњ§ў§ў§ў ў§§ў§ў ўю§ў§ў§ў§ў§ў§ў§ў§ў§ўўў§ўў§ѕў§ў§ўћ§ћў§ўўі§ў§§ћњњ§§ўўїћ§ћ§ўў§ў§§љў§§ћў§ўўў§ўў§§ў§§ћ§ўњ§ћњў§ў ўќ§ў§ўўј§ў§ў§§ћўўњ§ў§ў§ўўќ§ў§ўў§ќћў§ўў§§ў§ў ўј§ў§ў§ў§ўўњ§ў§ўћ§§єћ§ћ§ћў§ў§ў§ўў§ўє§ў§ў§§ћ§§ў§ўўќћ§§ўўё§ў§ў§ў§ў§ў§ў§ў§§ўў§§ъћўћ§ћћњћўњњћњ§ўћћўўћћўў§ћў§§ўњћћўї§љћјћћљ§ўўјћўў§њў§ўўќћўћўўњўћљљ§јћ§§ўўћўўњўћ§њ§њўў§ћљњўўћћўўћўўўњў ў§ћљўў§ћћўћ§ў ўўћўўњ§ў§ї§ўў§јњ§ўћўўћўўќ§њћўўћ ўјњљљјћўћўўіњ§ћ§ўћћўў§§ћўќћўћњњўњњ§њ§§ўўў§ўў§ќњ§ћўў§ћў§§ўўћўўўћўў§њ§ўўў§ў ўўћўў§§ћљ§§ўј§ўўћўћћўўљћ§њ§ўћўў§ѕњ§§њ§§ўћўњ§§§љћўў§њћўў§љњўўўћўў§њ§ўўќћўўњњў§ўў§ћў§§ќў§§ўўў§ўўњў§ўўќ§њњўўўћўўіћњњ§њњўўћўўўћўўјљ§§љњљћўў§ўљћ§ћўњ§ўў§ў§ўћўўўћў ўўћ§§ўќ§ћ§ўўўћў ўўћўўўћ§§ўўћ§§ћўўћўў§ў§њ§ўўўћўўўћўў§ўћўћћўўћўўўћўўќ§ћ§ўўўћўўўћўўќћў§ўўњћўў§ћўўьњўўћўўћћўўћўћўћўўћћўўўњўўўћўўѕ§њњ§§ўў§§њўўўћўўўћўўў§ўўњеўњ§љљ§ўћћ§ўўњћћљњљњ§§ћўћўћўўљ§§ћўўћ§њљљћћ§ўўќћўћўўћћўћўњњў§ўўўћўў№ћ§§ўўћўўћљ§§ўњ§ўўўњ§§ќњћњў ўўћўўјћў§§љљ§ўў§ ўћ§ў§ўўўћўўћўѓћўћў§§ўћўњњ§ў ўњћ§њњћўўћњўћњўўўћўўўћўў§ўњ§§ўўћў ўћ ўўћўўў§ўўћќўћћўў§ўњўўћљћљ§ў ўњћўћўћўўўћў ў§њ§§њ§§њ ўњљћљљњўўўћўўњњ§ўўћћўўўћўўўћўўњћ§њ§§ўўёћў§ўўњ§ћїљ§ў§њ§§ўњўўљћў§§ў§њњў§ўўўћў ў§ќњ§ў§§јњ§љљњћ§ўўћўїњљћњ§§њћўўўњўў§ѓњ§њњўўћћўў§§ўўћ§њ§њ§§ќњ§§ўўќћўћўў§њњўћўћўўњћў§§њўўќћ§§ўўў§ћћў§ўўўњўў§ќў§§ўў§§њўўќ§њ§ў ўўћўў§њљ§ћљњ§§ўўўћўўјћўў§§њ§ўўўћўўќћњћўўћћ§њ§§ўўўћўўѕћўўњ§§ў§ўў§§§ўћўў§§ўћўўћ ўѕ§њћћњљ§§њ§ўўўњўў§ўў§§ўљњ§§ћњњ§§їњ§ћћњњўћўўўћўўўћўўў§ўўњћў§§ћўўќњ§§ўўўћў ўћћњљњ§§ўўћў ўўћўўўњўўћњљњњўўќњ§§њњ§ў§§њўўў§ўў§ў§ќњ§њўўўћўўњ§њњўњ§§їњљњ§§љѕљ§§ў§јљ§њњ§§ўњњ§§ћўўќћњњўўћўћў§ўњ§§ўћўўќњљћ§§ќљћ§ўў§тљћљ§јљљ§ўћўњўўћћўњ§њ§ћњјљ§ўўћўў§њ§ўў§ќњ§ў§§ў§јњћўћўўћўў§ўљћўњњўў§§ћїњ§њ§§ћјљ§§ўњўў§ћљўћћўўљћўў§ћњ§§ўў§§ћќ§ўћўўљњљљћљјћћ§§ћў ўќ§њ§ўўќњўћ§§ўњњў§ўўњњќ§ўћ§§ўњ§§ўќ§њ§њњїљћљ§њ§њ§ўў§јћљ§§ћўњ§§ўў§§ўў§§њњ§ў§љ§§ўќћўћўўћћўњ§њњі§ўљњўў§њ§ўўљћњ§§ћљўўыћўўћћўћ§§њљћљњ§ўўћ§ћўў§љљ§њ§ўћўў§ћљћ§§ўўўњўўу§љљћњћћљ§ўў§њ§§њўћўўљњћћљљњ§њњќ§љњ§§ўњљ§ћљљћњ§§њўћљўў§§њј§ћљ§§ўў§§щњљћљћћ§§ў§њ§њ§§њ§њ§ћћўњњ§ўћўўі§љљ§§ўўћњ§§іћ§§њ§љћ§§ўўњї§љћјњњјћњњњ§њ§њњ§§ќњљ§ўўњ§ўћўў§§јљћњ§њћћўўўњ§§ўў§њњћўљјјљљћ§ў§њ§§ќњ§§ўўўћўўћўњ§њјљћљљўњ§§њ§ўїњ§§њњ§§ў§§ќњћћ§§ў§ўўћўўў§ўў§ў§іљјњљљ§§љњўў§њњ§ўћў§§§ўћўўїњ§њ§§њњ§ўў§ўњј§њћ§§ўћ§§ћ§ѕћ§§ўћћў§§њњ ў§ўљћўћ§њ§ўўђњћћљ§§љћљћћљљ§§ѕњћ§§ћ§§њ§§ўўќ§њ§ћћ§§њ§§њ§ўћ§§ўћўўњћўўњљ§§ћ§љ§ўў§ўћ§§јћўўњњўњ§§ў§ѓљћњўњњљћњ§§ћўў §ђњљћљћњў§ћћјјћ§§ўњњљјњ§ўўќ§њ§ўўяћў§њљњњћ§§њ§ўў§љ§§ўљ§§ўњ§§њћљљ§њ§§њћ§ўћњ§§љ§ћјћўћўў§ћўћ§§ўўќ§њњўўў§њњўќ§ћљ§§§њ§ўўћћњ§њ§§ћњ§§њ§§ьў§§њћўўћўўћњ§њўћўћў§§ћ§§ћўў§яњўў§њ§§њњ§њ§§њљљ§§§њљ§§ўњ§§ќјљ§ўў№ћўўћўўћўў§§ћљћћ§§ўњўў§хњ§§њ§њњ§љћћњјћћљћћљљ§ўў§ўў§§њњљњћћўўсћўўњљљ§ћћљљћћљћћљљ§§ћљњљњ§њњ§њ§§ўѕ§њўўћ§ћ§њњ§§ѕў§ћјћјњ§§њўўќћўў§§ў§њїќњћ§ћћіљћ§ћљљћћњ§§ўњћ§§љљћћњњїњјљўў§њ§ўњ§§ўћўў№ћњ§њљћћ§њњ§§њ§ћўўѓ§ћћљљњћћњ§§љ§§ѕјњћљљ§§њњћљљќћљљ§§ўњ§§ўњ§§ўњ§ћљ§њў§њњ§§§ћњ§§љњ§љљћ§ўўљњў§ћћњўў§њљўўћ§ўњ§љљњњћћљћћљњјњ§§ј§§§њћ§§њњћљ§§љўў§жћљћјјљћћ§ћўўњ§ћјљљћћљћљћћљљћћљћ§§њћ§љћјћјљљћќљћћ§§њќћљ§ћћћњ§§љњњ§љћ§§ћњћљљћћћљ§§ў§§ўїћўўћ§§ћљ§§ѕљћњљћјјћљљ§§ўќњ§љњњїў§§ћљћћљ§§њћљјћ§ўў§њў§њњ§њўѕћ§ўў§§њћљљћћј§њ§ћљјћўўќћяљћћ§§њљћћы§њїљћљ§њњ§љљћјњ§љћљљ§§ёљјјљјћљ§§њљћћњ§§іњ§ћћњѕєшј§ §љѓћ§§ѕљћ§њњћљћ§§њћјјњјњњјјњљћљћћљ§§щњ§§ў§њ§ћјјћ§ў§§ўў§§њў§ўў§ў§ўњ§§ћ§њљ§§ћєљћ§њ§§ћћ§њ§ўўњ§ў§ўћ§ўњ§§§њћўўћўњћљїњ§§њ§њў§ћћ§јћљћћјћњ§§љћћ§ћћњњщљ§љћћљјћјћјљћљљћћњјњћћ§§ќњ§њћћљљ§§ћјљћћіњћљљћљљјјћћљћ§јњјјјљћљћћ§ў§§јљћћљћћљћћёѕ§њњ§ћјјїјћ§ћљјјћљ§ћћјјјњћѕјњћљћћўєћўў§ўў§§њ§ћўўў§ўўї§ўў§ћ§ћ§ўўђ§ўў§ћњћћњћћў§ўўўћ§§ ў§ўњћћњћ§ў§ўўш§ў§ў§ў§ўћ§ћ§§ўў§ћ§ћћ§ў§ўўј§ў§ў§ў§ўўљ§ўў§ў§ўўњ§ў§ў§ўўў§ўўј§ўћ§ћ§ћўўўћўўў§ўўі§ў§ўћўћўћўўў§ўўў§ўўћ§§ћўўў§ўўє§ўћ§ўў§ў§ў§ў ўј§ў§ћћњњўўў§ўўў§ўўў§ўў§ћўћћ§ћ§ўўў§ўў§§ў§§ѕў§ў§§ћ§ћ§§ўў§ўњ§ўћ§ћ§§ўі§ў§§ћ§ћ§ћўўў§ўўў§ўўћ§ў§ў§§љў§ўћў§ўўђ§ў§ў§ў§ў§ўћ§њћћљў§ў§ўћўўў§ўўќ§ўў§§ћў§ў§ўўј§ў§ћћ§ћ§§ўћўўј§ћћ§ўў§ўў§ўў§ў ўђ§ў§ў§ў§ў§ў§ў§ўў§ќћў§ўў§ќћў§ўўћќўћ§ўў§ў§ўћўўќћ§§ўўў§ўў§ќћ§§ўўў§ўўћ§ў§ўћћѕ§ўў§ўўћћў§ўўъ§ўћў§§ћў§ў§§ћў§§ћў§ў§ў ўї§ћ§§ў§ў§ўўј§ћњ§ўў§ўўќ§ў§ўўў§ў ўњ§ўћ§ћўўј§ћ§ўў§§ўўў§ўўў§ўўі§ўћ§§ў§ў§ўў§ўњ§ў§ў§ўўћў§ўўі§ў§ў§ў§ў§ўўў§ўўќ§ў§ўўў§ўўў§ўў№§ў§ў§ў§ў§§њ§ўў§ўўў§ў ўќћў§ўўў§ўўўћўўў§ўўќ§ў§ўўў§ўўў§ўўў§ўўќ§ў§ў ўќ§ў§ўўўћ§§єћў§§ћ§§ў§ў§ўўљ§ўћў§ў§§ќў§§ћћўѓћў§§њћ§§ћ§ћ§ўўћўі§ўћ§ћћњњћў ў§ўў§ўў§ћ§ўў№§ћў§§ўў§§ћ§ћ§њ§ўўў§ўўў§ўўў§ўўќ§ў§ўўњћ§ўўћўў§ќћ§§ўўў§ўўў§ўўўћўўў§ўўў§ўўќ§ў§ўўћќ§ўў§§ ў§ћ§ўўќ§ў§ўўј§ў§ў§ў§ўўў§ўўў§ўўў§ўўє§ў§ў§§ћ§ћ§ћў ўў§ўўў§ўўў§ўўў§ўўњ§ў§ў§ўўј§ўћў§ў§ўўў§ўў§ќћ§§ўўћ§њћ§ў ўў§ўўў§ўўў§ўўі§ўў§§ў§ў§ўўќ§ўћ§§§ћ§ћћ§ўі§ў§ўўњћћ§ўўј§ў§§ћў§ўўќ§ў§ўўў§ўўў§ўўќ§ўў§§ўћўўў§ўўъћў§§ћћљћћўћ§ћ§ћ§§ў§ў§ўўј§ў§ћћўћ§§ўћўўъћ§ћ§ћ§ћўћ§ћ§ћћјљњ§§ў§ў ўј§ћњ§ћ§§ўў№§ў§ў§ў§ў§§ћ§ћ§§ўў§јћў§ў§ўћ§§ќћ§ћ§§њћў§ў§ўўў§ўў§јћў§ў§ў§ўў§ќћ§§ўўњћ§ўў§ўўњћњњћћўўў§ўўј§ў§ўў§ћ§§ўћўўњ§ўћў§ўў§їў§ў§ў§ў§ўў§ћў§§ћ§§њњћ§ћћўўў§ўў§ќћ§ћўўћ§ўў§ўўі§ў§ў§ў§ў§ўўњћ§ћ§§ўўў§ўўў§ўў§ѕћўћў§§ћ§ћ§ћћўј§ўћ§ћ§§ўўў§ўўћ§ў§ў§§њљ§ў§ћ§ћўўў§ўўіћ§ћ§§ћћ§§ўў§ђћў§§ћ§ћ§ћњњ§§ўўќ§ў§ўўћ§ў§ў§§ўў§ўў§ћ§ўўќ§ћћўўў§ўўў§ўўў§ўўє§ўў§ў§ћ§ћў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўў§ќў§§ўў§§ћ§§ћў§ўўћћ§ўў§§ўћ§ћ§§ўўќ§ў§ўўў§ўўўћ§§ўњ§ў§ў§ўўфћ§§ў§§ћ§§ў§§ћћ§ћћ§ћ§§ўћ§ћўћ§§ќћўў§§ў§§ў§§ўў§ўўї§ў§§ћћ§§ћћўы§ћњ§ћ§ћњћў§ўћ§ћћњўћ§ћћў§§ў§ћћїў§ў§ў§§ћўўћћ§ћћ§§љћ§ћў§ўћћў§ўўі§ў§ў§ўћ§ћўў§ўѕћ§ћ§ћ§ћ§ћ§њњё§ћ§ћ§њњћ§ћ§§ў§ўўћ§ўћ§ўўў§ўў§ћњ§ћ§ћћ§§ћ§§јћ§ћњњћћўў№§ћћњћњњћњњћў§ў§ўў§ўў§§ўўћћќў§ў§§ўў§§ўђћ§ћћ§§ћ§§ўћ§ћ§§їћњћћ§ћ§ћўўѕћ§ћўў§ћў§§ћћўўћћіўћ§ћ§ћўћўћћ§ў§ўўў§ўў§ўћ§§єћўў§§ўћ§ћў§ўўќ§ў§ћћўў§ўўќ§ћ§ћћљ§ћў§ўћўўў§ўў§ћ§ћћ§§ћўўќ§ў§ўўў§ўўю§ў§ў§§ћўў§ћў§ў§ў§ўўя§ћћњ§њћћ§§ўћ§ћћ§ўўі§ў§ћњћћ§ћ§§ћ§ћћ§ўў§§їњћћњ§§ћ§ўў§ќћ§ћ§§ѕњћћ§§ўћ§ћ§ћћњї§ћўћ§ћ§ћ§§ў§ћћ§ћћўўю§ћћ§ћў§ў§§ћ§ћ§ћњћ§§љћњћ§ўў§§јћњњљљњњ§§ќћ§ћ§§їћ§§ўћў§ў§§ъў§ўћ§ћћњ§ћ§ўў§ў§§ћ§ћў§§њўћњњћћњ§ў§§ўћ§§њћў§ў§ўў§§ў§§§ћњћћ§ўћ§§оћ§ћў§§ћћ§§ћ§ў§ћ§ћ§њњћ§ћ§§ў§§ћ§ћў§ўўќ§ўћўўяћ§ћў§§ћ§ћ§ћ§ћћњљћћѕ§ћ§§ў§§ћ§ћўўќћ§ћўў§јћ§ћћ§§ћўўћќ§ў§ўў§ѕћ§њ§ћўў§ћћњњљ§њ§ћ§§ўўўћ§§ўі§ўў§ћ§§ў§ўўќћ§ћўў§ѕњћў§ћћњћњњћћх§ћ§ў§ћњћћ§§ћў§ўћ§ћћњћћ§ћ§ћ§§іћ§ўў§ўўћћўўў§ўў§їў§ћ§њњћ§ўўћ§ћ§њћћќ§ўў§§ёў§§ћ§§ў§ўћ§ћћњ§§њћњ§ћ§ўў№ћ§ћ§ћ§ћ§ћ§§ўњћњ§§њѕ§њћћ§§ў§§ћ§§ўў§§ћў§ў§ўўѓћ§ћљљћћ§§ћ§ўћћњ§ћ§ћ§ћћћ§ћ§ћ§§њћ§њћћ§§ќћ§ћ§§ѓћўў§ћ§ћ§ћўў§ћћў§љўћ§ўў§ўўњ§ўћ§§ўў§йў§ўћњћ§ћ§ћ§ћў§ўў§ћ§ћ§ћћ§§ћ§ћ§ћ§ћўћ§§ў§ўўњ§ў§ћ§ўўѕћ§ћњњ§ўў§ўћћѕ§ћ§ћ§§ўћ§ћ§§чћ§ћ§§ћћ§ћ§ћ§ћ§ћ§§ћћ§ћ§ћ§ўўў§ўўс§ўћћњћњњћ§ћ§ўў§ўћ§§ћћ§ћ§§ћћњњљњњќћњњћћўў§§яўћ§ћ§ћ§ћ§ў§ўў§ў§ўўђ§ћћ§њњћћњњћњњћћљњћљћ§ћ§§ћљ§ћўў§§ўўќћњћ§§№ћ§ћўћњћћ§§ћ§§ў§ўў§§ўћћі§ћў§ў§§ћ§љљ§њћњњћћњћњћћѕњ§ћ§ћ§§ўў§ћћњљъњћў§ўћ§ћћ§§ћ§ћ§ћ§ћ§ћ§ўўѕ§ћ§ћћњћ§§ћ§§ўіћњњћћ§њњ§ћћѕ§ћ§ћ§ћ§ћњљћћ§ыњћћўњћћ§ћ§ћ§ћ§ћ§ћ§ћў§§њћ§њњћ§§ћј§њ§ћ§ћ§ћћ§њћўўѓ§ўћњњ§§ў§ў§§ўўћ§ћ§§ўў§ћї§ћў§§њћћњњћё§ћ§ћ§ћ§§ћћ§ћ§ћ§§њњћћ§ћўўщћ§њћњ§ћћњњћў§ў§§њ§ћћњњћћњћњїћњ§ћ§ў§ћњњў§ћћњъћњњћћ§ћ§ћ§§њј§њћњ§ћ§ћљљћё§ћ§§њћћњћњћњћћ§§ёћ§ўў§ў§ў§ўў§ћњћћє§ћ§ћњљћњњћњћћў§ћћоў§§ћћљњ§ўћћњћњњћ§ћ§њћћњћў§ўћ§ћ§§ћ§§ќћ§§ўўјћўў§ћ§њћћћњћћ§ћћњўёћљјћњћћ§ћ§ћ§§ћњњ§ћўћњћ§§ћх§ћћњћћ§ћ§ћћњ§ћњњћћ§§ћњћ§§ћ§§њ§љњїїќ§ћ§ћћќ§ћ§ћћь§ћћњ§ћ§ћњћ§§њћњћ§ћ§њњ§љњљљњљљћњћњњћћћ§ћ§ћ§§њѓћ§ўћ§§ўћћ§ўћўўшћ§ћ§§ў§§ћ§ћ§ћ§ћћњ§ў§ћ§њћћї§ћ§њњћ§ћўў№§ў§§ћ§ћў§§ћ§ћ§§ўў§јћ§§ў§ў§ўў§њћ§§ћ§§§ўћњњћє§њћњњћњ§§ћ§ћћњљјћ§ћњњћћњњњ§ћњћћњњїљњњћ§ћ§ћ§§њћћ§њ§ћњњј§њћћњћћњњ§ћњћћ§њћњњф§ћњћњњћўћ§ћ§ћњњћњњћћњњ§ћ§§ћњњњ§њ§њћњњћњјљњ§њљњћњњ ў§ўў§ўўј§ў§ўћ§§ўўќ§ў§ў ў§§ў§§ћў§ў§ўўќ§ў§ўўњ§ў§ўћўўў§ўўќ§ў§ў/ўў§ў ўў§ўўќ§ўћўўќ§ўћўўќ§ў§ў ўў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ўўњ§ў§ў§ўўў§ўўќ§ў§ўўќ§ў§ў ўњ§ў§ў§ўўў§ў!ўў§ўўў§ўўќ§ў§ў ўў§ўўў§ў ўў§ўўў§ў ўў§ўўў§ўўў§ўўќ§ў§ўў§ўў§ўўќ§ў§ўўў§ўўў§ў;ў§Xўў§ўўќ§ў§ўўќ§ў§ўўќ§ћў§§§ў§ўўў§ўў§§ў§§ўќ§ў§ў ўў§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ў/ўќ§ў§ў7ўњ§ў§ў§ў?ўќ§ў§ўўќ§ў§ў5ўќ§ў§ўўў§ў ўќ§ў§ў#ўќ§ў§ў ўњ§ўћ§ћўўќ§ў§ўўў§ўўњ§ў§ў§ўўі§ў§ўћ§ћ§§ў ўў§ўўў§ў ўќ§ў§ўўў§ўў§љў§ў§ў§ўўў§ў ўќ§ў§ўўў§ў ў§ўћў ўњ§ў§ў§ў ўќ§ў§ўўў§ўў§ўќ§ў§ўўў§ўўќ§ў§ў ўў§ўўњ§ў§ў§ўўќ§ў§ўўі§ў§ў§ў§ў§ў ўќ§ў§ўўў§ўўў§ўўљ§ў§ў§§ўўў§ўўў§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўў№§ў§ў§ў§ў§ў§ў§ў§ўўј§ў§ў§ў§ўўў§ўўў§ўўў§ўўјћ§§ў§ў§ўўі§ў§§ўў§§ћў ўј§ў§ў§ў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ў ўў§ўўў§ўўї§ў§ў§ў§ў§§ўі§ў§ўћў§ў§ўўў§ўўњ§ў§ў§ўўє§ў§ў§ў§ў§ўћўўі§ў§ўћ§ћ§§ў ўќ§ў§ўўў§ўўў§ўўќ§ў§ўўў§ўўќ§ў§ўўє§ў§ў§ў§§ћў§ўўў§ўўў§ўўў§ўўќ§ў§ўўў§ўўў§ў ў§ћ§ў ўј§ўў§ћў§ў ўќ§ў§ўўў§ўўў§ў ўі§ў§§ў§ћ§§ўўў§ўўю§ўћў§§ўў§ў§ў§ў§ў§ўў§јћ§§ў§ў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўў§ћў§§ўі§ў§ў§ў§ў§ўўњ§ў§ў§ўў§§ў§ўўѕ§ў§ў§ў§ў§ў§§§ў§ўў§§ў§§ћ§ћў§ў§ўўќ§ў§ўўў§ўў§§ў§§§ў§ўўќ§ў§ўўў§ўў§§ў§§ћѓў§ў§ў§ў§ў§ў§ўўї§ў§ў§ў§ў§§љў§ў§ў§ўўў§ўў№§ў§ў§ў§ўў§§ў§ў§ўўќ§ў§ўўў§ўўю§ў§ў§ў§ў§ўћўћў§ў§ўўў§ўўў§ўўў§ўўў§ў ў§ўќ§ўў§§ћў§ў§ўўў§ў ўќ§ў§ўў§љћў§ў§ў§§їў§ў§ў§ў§ўўў§ўўђћ§ћў§ў§ў§ў§ў§ў ўљ§ў§ў§ў§§ўќ§ў§ўўў§ўўќ§ў§ўўї§ўћ§§ў§ў§§§ў§ўўі§ў§ў§ў§ў§ўўў§ўў§љў§§ўў§ўў§§ў§ўўќ§ў§ў ў§ћ§ў§ўўэ§ў§ў§ў§ў§ў§ў§ў§ў§ў§§їў§ў§ў§ў§ўўњ§ў§ў§ўўў§ў ў§ўў§ўўў§ўўў§ўў§ћў§ў§ўўњ§ў§ў§ўўў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўњ§ў§ў§ўўў§ўўћ§ў§ў§§їў§ўў§§ў§ўў§§ў§§ў§§ў§ўўў§ўў§§ћў§§ўў§ўўі§ў§ў§ў§ў§ўў§§ў§§§ўћ§§ђћ§ўў§§ћ§ўў§ў§ўўў§ўўў§ўўј§ў§ў§ў§ўўј§ўћ§§ў§ў ўў§ўўі§ў§ўњ§ћ§ў§§ў§їўћў§ў§ў§ўўћ§ў§ў§§ћўњўћўўў§ўўќ§ў§ўўќ§ў§ўўђ§ў§§ћ§ўў§ў§ў§ўў§ўъ§ў§ў§ў§ў§ўћўћ§ћў§ў§ўћ§§їў§ў§ў§ў§ўўў§ўўћ§ў§ў§§љў§ў§ў§ўўњ§ў§ў§ўў§ўќ§ў§ў ўќ§ў§ўўў§ўўѕ§ў§ў§§ћ§§ў§§юў§ў§ў§ў§ўћў§ў§ў§ў§§ќў§§ўў§ўў§§ў§ўћ§§љћў§§ћў§§ќў§ў§§ўў§§ўў§§ўж§ў§ў§ў§њ§§ћ§ўў§§ћўћўћў§ў§ў§ўћ§ћ§ћў§ў§ў§ў§ўўї§ў§§ўў§ў§§њў§§ћў§§§ў§ўўњ§ўћћњўў§ўў§§ўў§§§ў§ўўќ§ў§ўўќ§ў§ўўќ§ўў§§ѕћ§ћў§ўћўћ§ўўђћјњћ§ћў§ў§ў§ў§§ў§їў§ў§ў§§ћўў§чћў§ў§ў§ћ§ўћў§ў§ў§§ћў§ў§ў§§їўњјљљ§ў§ўўќ§ў§ўў§ўў§§шў§ў§ў§ў§ў§§ћўћўћўћўћў§ў§§ўў§ўўљ§ў§ў§§ћћћ§ўў§ў ўќ§ў§ўўь§ў§ў§ў§ўћ§§ў§ў§§ћўћўў§ўќ§ў§ўўќ§ў§ўўќ§ў§ў ў§§ў§§ўќ§ў§ўў§ў§эў§ў§ў§ў§ў§§ћўћ§њћћ§§љў§ў§§ћ§§ыњўћў§ў§ў§ў§ў§ў§ў§ў§ў§§ќў§ў§§ўћ§§ћўћ§ћ§§ђћ§ћћњћћ§§ўћ§§ўў§§ў§§§ўћ§§ќћ§§ўўљ§ў§ўћў§§юў§ўћў§ў§§ћўћў§ўћў§§§ў§ўћћўћћўўїњ§§ћўћ§ћўўјњ§§ўўћўћћљўћўўћњўўќћ§§ўўўћўў§ўўћўўўћўўўћўўћћўњљњњ§љўњўўљќћј§ўў§іћў§љћњ§§њ§§ўњ§§љњ§љњњћўў§§њўў§ўљўў§ўћ§§љќњљљ§§ћљ§њћ§§ўњўўњњ§§ўњ§§љўћњћ§§ўўўћў ў§ћўўњљљњњћўў§ўўћћўўњўўўћўўњ§њ§њ§ўўўњ§§љўћ§§њ§ўўјћўћњ§њ§њњћ§ўњ§ўўўњ§§ўћћўў§ў ўїћњ§§љћўў§§эњћўўћ§§љљћњ§њћњ§§ћўў§§љў ўў§ўўљ§ў§љњњљљћћњўўћћў§§њ§ўў§ўўњњњљћћўћўўўћўўўћўўўћўўўћўў§њ§ў ўўћўўњњ§њ§њ§§ўў§§§њ§ўўљ§ўњ§§њ§§њ§љћўўњ§њўў§ўћљљјјћјјњњћўў§ћў§§ўњ§§шњ§§њљјљљњњ§§њўў§§њ§њ§љћ§§эњ§љљњњ§§њ§§ўћўњ§њњ§§ќїљћ§§ўњўў§§ўћњњљѓўћњ§ўћўњ§§ўћўўўњ§§ўњћ§§ўћўўў§ўўќ§ўћўўўћўў§ќњўћўўћ§ўўњў ўћћњ§ћћњњ§ў§ўћў ўљ§яћњ§§ўўћўўћўњњљљњ§§ўщћўћўњ§ўўћў§љјњћ§њ§њ§§ћўўў§њњўћ§ћљњ§§њњљћ§§њњћўћ§њўў§ў§ћњ§§ў§§њљћћјљ§§ћњ§§ўў§§њ§§ўњ§§§њљњњў§ўўў§ўўћ§њњ§ўў§ћќњ§љ§§љў§њ§њ§ўў§їњљљњњ§ћјћћ§§љ§§ўѕљњ§ћўўћўњ§ўўњ§њ§§њљљ§іў§њ§§ћў§§ўў§§њ§§љўћўўћћўў§ёњјњњ§њњ§§њ§§љћ§§ўјћўў§§љљ§§ўѓћў§љњ§§њњўў§њњљђћ§§ўўћўўћў§њ§ўўќ§ћњ§§ќў§§њњќ§ўћўўћћўњ§њњ§љ§ўў§ёњўћўўњ§љћћ§§ћњўўќ§ўў§§ќљњ§ўўўћўў№ћўћўћўў§њ§§њўўћўўўћў ў§њ§§њ§§яњ§њ§ћўћўў§ўў§њћћ§§ќћљ§ўўћ§њњ§ўў§њћўў§ђњ§ўў§њ§љјљњ§њўўѕ§њјћјјљћ§њ§§іњ§ў§§ћ§§ћўў§§ўћўў§іћѕєљњњ§§њ§§љњ§њ§љњўўэњљњћљљњ§§њњў§§њ§§љўўўћў ў§јўћћўўћћўў§ў§§њ§ўўљњ§љ§ўў§§љњ§њ§§ћўўїћўў§њњўћўўћћўћћўўќ§ћћўўўњ§§ћќ§њ§ўўї§ўћћў§§ў§§ёњћўўњўћў§§њ§§ў§§ўњўў§ўљ§њ§§њљ§§ў№њ§§ћљљњўњњ§љљњ§њњќ§ўў§§ў§ћўћўћўў§§љўў§ўћўўў§ўў§§ћњ§§єћљћ§ћјјљўљћўўѕћњў§њ§ћўўћўў§ћў§§њ§ў§ўћјў§§њ§§љ§§њљўћўњ§љ§§ћњ§§њ§§ў§§ѕ§§ў§њѕћ§њ§ћ§ћћ§њ§§ў§ўє§љјљњўў§ћ§§ўўќ§љў§§јњ§њ§љ§§њњўѓњ§њ§§ўў§љ§ўћўў§§љ§§љ§ўћ§ѓњ§ўўћў§ћћ§§њўўњї§ўў§њўћћўўњ§њњћў§§јњ§§ўњњ§ўў§ўљњљјѕљћ§§ћњ§ўћњњќ§њ§ўўћ§ўћўўћўјћўћўњўў§§њў§§њњ§§ќњ§њ§§ѕњљјјњїљћњ§ўўѕњўњ§§њ§§њ§ўўўћўўўњўўўћўўѕ§љњўљ§§њљљ§§шњ§§њ§љћјјљљјљљћљњњћў§њћ§§ѓњ§ћљ§ўћўњњўў§§њўћўћ§ўўўњўўўћўў№ћўў§ћўћўњљјњћћљ§§јў§ћ§ћћјўў§іћ§њњ§њљљњўў§јћљњўўћўњњ§§њћўўў§њњї§њ§њ§§ў§јјѕљњљ§ў§њўўћњњ§ќћ§њ§§ў§§њ§§ўјћ§§њњ§§ћћўўћўўўћўў§љњћјљљ§ўў§љў§ўўўњ§§ўњќ§ўў§§ўњ§§ўљ§§яњўћ§њњ§§ћћ§§њњћћ§§§њћўўќћљњўўјћўћў§љњўўх§њљњњ§љћњїјљњљјљњўўљљјљ§њњ§§ўљ§њњўўћўўќћўњ§§јћ§ўў§§ћ§§љњ§ўњ§њ§§ўњ§§ќњ§§ўў§ѕћўўњ§§ў§§њ§§њ§ўэћ§њњ§§њћјњњћљћљ§њњ§§јљ§ћ§њњ§њњўјћ§љљњ§ћўў§ћў§§ў§љўћ§§ћњіћјјїїњљ§§ў ўћћњ§§њ§§љњ§§њ§§љљќ§њ§ўўњў§ћў§§љў§ўўћћ§§шћљ§§ћљњ§ў§њљљѕњ§§ў§§љћњўўћћњћў§§ўћўўћ§ўўћўў§іћљњ§§њњ§ћўў§ўѕ§њљ§ўў§њўћњњўћњњћўћњ§§њљљ§§њ§§ћћ§јњ§ў§ўўћ§§њўў§ўўюћўўћўћў§њ§§ўўњћ§ћўў§јћљљћљљћ§§њ§љњ§§ў§§њњ§ўњўў§ѕћњўўљњўўћћ§§їћ§§њ§љ§њўў§ўљњљћ§§њ§§ўњ§§њўњњ§ў§§ўќћў§ўўћљ§њњ§§ў§ўїћ§§њћљ§§ўўўњ§§ўўћўўў§ўўіћўћњўўњ§њ§§ўњ§§§њ§ў ўњћўўћњўўўћўўќћ§њўўіћў§ћћ§§њ§ўўђћўўћћўў§ў§§љј§§њщ§њ§§њњћўћћ§њўўћўњћўўћў§§ќњљњўўўћўў§ќћјљ§§њ§чўћўў§њ§§ўўњњљ§§ћўў§§њўў§ўўћў§іњ§ўћўњ§§ћўў§§љјјљљњ§§њ§љљќњ§§њњ§ъјїћљ§ўўћўўњњ§ўћ§§ўў§§ўўђћўњ§§њљћљ§ћў§љљњј§§њљњњ§ў§ћњ§љњ§§ўљњњњ§ћјњњљљќјњ§ўў§ћћљњ§ўўўњ§§ўњўўќњўћўўїћўў§ћћљћ§§ўћўў§ћў§ўў§щћў§§њњљјїїјћљљ§ћўўћўњњ§§њ§§ћ§§ўѕћћљћю§њ§ўў§§ў§§њ§ћ§§љ§ўўьњћћј§њ§њћў§§њњљ§§ћљћћѕљћјљћљћњћљ§§ўњ§§њ§§ћјјљћ§§њњћўўњ§њј§ўњњ§§њўўё§ћјљ§љљћњўў§§ћўў§ћ§ўў§ћљѓ§ўњ§ћљ§њњўўњ§§ўќћўћўўэћў§§ўўћ§љљћљћћ§§ћћ§§ў§њњ§§ћјћћњ§їљ§њљњљћњўўћ§љњњўўћщўњ§њ§њ§њњљњњ§ўњ§љњјјљљћћ№љњћћ§њ§§њњ§ў§њњўў§њїћ§ћјћ§ўћ§§ћј§њїјјўїћћњљ§љћћљљ§§ќњ§ў§§њњї§§ћљљїјљћјѕїјјћћ№јїћљћћљїњћћјњјљїїѓњјјїѕљ§§ћ§њћјјњўћљљћљњјјћљјљљ§§ў§§ќў§њљљѕћљјјћљ§§ўў§§ўљјјљјћњєїї§њљљћ§љђћљ§њ§њћўў§§љћ§§§њ§љљўњўў§єњћћљјљћњјљљћћјљњљїњ§§ћћ§њѕљњ§њ§њ§§ћљјјўћљљўњ§§ёў§§њ§ћўўљњњљњњћћњјњїїјїї§їљћњ§љћљљћћњњћљћљћћћ§њ§§ўўїћ§§ћљћљћ§§ћяњ§ћћњјљљћљјѕѕјљљ§§ўћ§§ћјъљњ§њ§ћљљњ§њњљћ§ћў§њљљ§§ыћљњћјљљњѕљјћћљјњњјјљћћюљњњјњљ§њњћћљ§њ§ўљ§§љљћћњљћњњјїљњљћњљћ§њћћўњ§§љћњ§§ћљјјѓљћћљћћ§љћјљљ§§љћљњ§§њ§§њћљ§§њљљћјэћ§§ћћљјњјјїїљњїљњљћћќљ§§ћћ§ў§ўўі§ў§ћћў§ўћўўќ§ў§ўўј§ћћў§ў§ўўў§ўўђ§ў§ў§ў§ўћ§§ў§ўўі§ў§ў§§ћў§ўўј§ў§ў§ў§ўўў§ўўј§ў§ў§§ў§§њћ§ћћ§ўўі§ў§ўћњћ§§ўў§тћўў§ћњ§§ћ§ћ§ћћ§§ћ§ћ§ћ§ћў§§ўў§ўў§§ў§§ўњ§ўћ§ћўў§ѕћњћ§ћ§ћћ§ўћћў§ћћљ§њ§ћ§§ўўё§ў§ў§ў§§ћў§§ћ§ўўўћ§§ѕў§ў§ў§ў§ў§ўўњ§ўў§ћўў§ћѕ§ўў§ћ§ў§ў§ўўј§ў§ў§ў§ўўњћ§ћ§§ўў§њћ§§ўћ§§§ў§ўўћ§ћ§ћ§§§ћў§§ўў§ўўј§ў§§ћћ§ўўј§ўћў§ў§ўўњ§ў§§ћўў§їћ§§ў§ўў§ћћўњ§§эњ§§ћў§ў§ў§§ўў§ў§ў§ўўђ§ўћў§ў§ћ§§ћ§§ћћ§њ§ўўљ§ў§ў§§ћћі§ћў§ўћ§ћў§§ўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўћ§ў§ў§§ўў§ўў§чћ§ћћ§ћўћ§ћ§ћў§ў§ћ§§ћћ§§ћ§§§ћ§ўўќ§ћ§ўўћ§ўћ§ћћхўћ§њ§ћ§§ў§ў§ў§ћћ§§ћћ§ћ§ћ§§ћћ§ёћ§§ўћ§§ћ§§ћњћ§ћћќ§ћ§ћћѓ§ў§ћ§ћ§§ўў§ћ§§ђћ§ўўњћћ§ћ§ћ§§ўўї§ў§§ћ§§ў§§ћў§§ћўў§ўћўўў§ћћљў§ўћћ§ўў§їў§ў§ў§ўћўўў§ўў§ќћ§§ўўќ§ўћўўћ§ћўў§§ќћў§ўўљ§ўћ§ћ§ўўў§ўўќ§ў§ўўћћў§ћ§ўў§§ў§§ћў§ћћ§§ў§ўў§§ћўўя§ћћњљњћ§ћ§ћ§ўў§ў§§ў§єњћ§§ћ§§ћњ§ћ§§ѕўћ§ўў§ћћ§§ўўў§ўўђ§ћ§ћў§ўћ§ћ§§ўњњћјў§ћ§§ў§ўўєћ§ћ§ћ§ћ§ћ§ћ§§ќћў§ўў§ћў§ўћ§§ўј§ћњњ§ћўћћфўћ§ћ§ћў§ў§§ћ§§ћћ§§ћњ§њћњ§ў§ћћыў§ў§§ўў§ў§§ћў§ўћ§ћ§§ћћ№§ћўћ§ћ§ўўћ§§ў§ў§§ћ§§ћўўўћ§§ўћ§§љћ§ћ§ћњћћўў§ћћё§ћ§ћў§ў§ў§ћћ§ћ§§ўўћ§§ћјњ§ћў§ў§ўў№ћ§ћў§ўћњљ§ћ§ћўћ§§ўћўўў§ўў§ўћ§§ўт§ћћ§§ў§ў§§ћњњ§ћњ§ў§ўћў§§ћ§ћ§ћўўў§ўўђ§ў§ў§ўћ§ћћ§ў§ўўў§ўўў§ўў§ћ§ђћ§ћ§ћ§ћ§ћ§ћў§ўў§ћў§§ѓћњ§ћ§њћћў§ў§ўўўћ§§ўў§ўўь§ў§§ћ§ћў§ћ§§ћњћ§ћ§§ўўљћ§ћњ§§ћћё§ћ§ћ§ћўћ§њ§ћў§ўўњћ§§ў§ўў§ћї§њ§ћћ§§ћ§§ўћ§§§ћ§ўў§јў§њћћ§ћ§§ћў§ћ§ћћ§ў§ўўў§ўўў§ўўќћ§ћўўў§ўўћ§ў§ўћћў§§ћ§§ўь§ў§ў§§ћ§§ўћ§ћ§ћ§ћ§њўўў§ўўі§ў§ў§ўћ§§ўўќ§ў§ўў§ўљ§ў§§ћ§ћћњўћ§§ћў§ўћўўї§ћўћ§ћ§§ўўўћ§§єћўћ§ћ§§ў§ў§ўўћћ§§ў§§ўћ§§ъћ§ћћ§ў§§ћњћћ§ў§§ћўћ§ћ§§ёћў§§ћ§§ўў§ћ§ћ§ћћўдћў§ў§§ћ§ўў§ў§ўћ§§ў§ў§ў§ўћ§ћћ§§ћ§ћ§ћњћњћћњњћўўў§ўўњ§ўћ§ћўў§ўћ§§іћ§§ў§§ћў§ў ўўћ§§јћўћ§ћ§§ўў§јў§ћ§ћ§ћ§§§ћ§ўўхћ§ћ§ћў§§ћ§§ћћ§ћўћњњћ§§ћ§§ўћћсў§§ћњћ§§ўћњћ§§ў§ўў§ћўћ§ћ§ћ§ћўћ§§ѓў§§ћ§ћ§ўўћўћўўћ§ў§ўћћў§ћћћ§ћў§ўўћќ§ћ§ўўљћњњ§ћ§ўў§њћўў§§ўў№§ў§ўћ§§ў§§ћ§ћ§ћ§§ў§§ўћћѕў§§ћ§§ћњ§ћ§§ўў§§њћ§ћў§ўўќ§ў§ўўќ§ў§ўўњ§ў§§ћ§§ўћ§§ўћ§§јћ§§ћњњљћћ§ўј§ўў§ћ§ћ§§ўў§ўўњ§ў§ў§ўў§јў§ўўћ§§ћћљ§ћћ§ћћњњћы§ћћњћ§§ўўћ§њћћ§§ћњўћўў§ўўћћў§§ў§ўўќ§ў§ўў§ўд§ћњљњћћ§ћ§ў§њћњћћў§ўў§ћ§ћћњћ§§ћ§ћћ§ў§ўћћњў§ўў§њћ§ћћ§ўў§ўћ§§ђћўћ§њњћ§ў§ў§љўў§§ћ§ћћљўћ§ћ§ћўў§§ў§§ѓћ§§ў§ўћћ§§ћ§ўўњ§ў§ў§ўўў§ўўћћ§§њћћ§§ў§ўўћ§ўћ§ћћ§іў§ў§ў§ў§§ћћ§ўў§§њћў§§ћ§§№ћ§ћ§ћ§ў§ћ§ћ§§ўћ§§ћ№њ§ћ§§њњ§ћ§ћ§ўў§ўўќ§ў§ўўњ§ў§ў§ўўќћў§ўўќћ§ў§§јћњљљњћ§ћћј§ў§ћћ§ћ§§њћ§ћ§ћўў§ўќ§ў§ўў§тћ§њ§§ўћ§њ§ћ§ћ§ћў§ћ§§ћ§ћ§ћ§ћ§ћ§§ьћў§ўћћўў§§ћ§ў§ћ§ћ§ћ§§њћ§§ўў§§єћ§§њњљљњћњћ§§јћ§ћћ§ћў§§ўћ§§ўћ§љ§ўўћћ§ћ§ћћ§ўћљњ§ћћњњ§§њљћ§ћў§ў§ўўќ§ў§ўўўћ§§ўћ§§§ћ§ћћ§ў§§ў§§ўќћ§ћ§§ўѕћ§ћћњћћ§њћ§§ћ§юћўћ§ћњ§ў§ўў§ўўћ§ћўў§ўі§ўћ§ћњћ§ћ§§іћў§ў§ўћћ§ўўї§ўў§§ћћў§§ў§ўю§њўў§ћ§ћћ§§ћ§ћ§ћ§њњћё§ћ§ћ§ћўћў§ўћ§ћ§§ўў§§ ўњћ§ћ§§ўўцћў§ў§§ћ§ћ§њћћњћћњћћ§ћћ§§ћ§§ќћўћ§§фћ§ћ§§ў§§ћњ§ў§ў§ў§ўў§ћ§ћўћћ§ћћў§ўў§§ўћћў§ћћўі§ћњ§ћ§ћ§ћ§§їћ§ћў§§ћўћћї§ћ§ћћ§ў§ўўќ§ћ§ўўњ§ў§ўў§§ћ§ћў§§ћўў§ўї§ћ§њћћ§§ўўњ§ў§ў§ћћћ§ћў§ўўўћўў§ўў§§ўћ§§іћ§ћ§ћў§ў§ўўќ§ў§ўўў§ўўў§ўўј§ўў§§ў§ўўіћњњћћ§ћў§ўў§ћ§љћ§ћћ§§ўў§ћ§ўўќ§ў§ўўќћ§ћ§§ўў§ўўјћ§њ§ћ§ћ§§ќћ§ћўў§§ћў§§ёўћ§ўў§§ћ§§ўћў§ўўљ§ў§§ћћ§§њў§§ћ§ўўћњќћ§ћ§§ћ§§ћ§§ћњ§ћњћћўў§іћўў§ћў§§ћўў§їћ§ћњћ§ўўћћ§ўћ§§њћўў§ћ§§ћћ§ћћ§§§ћњ§§ћ§ѕў§§ћњћ§ћў§ўў§јћ§ћ§§ў§ўўќ§ў§ўўќ§ћњћћњ§ћ§ћ§ўўћњєћў§ўћ§ћ§ўўћ§§ќћњљњњћ§ў§ўў§ќћ§ћ§§ћє§ћ§ћ§ћ§њћњћњњћњ§§ўћ§§яћ§ћўћ§ћ§§ў§ў§§њњ§§лў§§ћ§§ўћ§њћњћњњћњњћњћњљњћћ§ћ§ћ§ћ§ћ§ћ§§ћњўћ§§ў§ўћ§§ўў§§§ћ§ўўќћњњћћі§ў§§ћў§ў§ўўі§ўў§§ў§§ћњњћєў§§њћћ§§ўў§ћћўў§ўўњ§ў§§ћўўћчњћњњ§ћњњ§ћ§§ўћ§ћ§ћћњ§њћњ§§ћљ§ў§ћњ§ўўі§ћћ§§ў§ў§ўў §ћљљњњљјћњњћћљњњ§§ўћ§§ўў§§ўє§ў§§ћ§ћ§§ўћњњїћўў§ћ§њћњњњљћњ§§њњўћ§§ћњњћћ§ћ§§ђўћћ§ћ§ћ§§ўћћњћћњљњўћњњћѕњјљљњћњљњјљљњљћћ§њ§§њњљўњћћњљљњћњћ§ћћіўћ§ћ§ћў§§ћћ§њћњњіћ§ћў§§ћ§ћњњћњњјљњћ§ћћњ§ћ§ћћ№њћћ§ћ§ўў§§ћћњ§ћ§§ћь§ўў§ў§§ћ§њњћ§ћњљњћћњњћёњјљљ§ћњњћњ§ћ§ћ§§ѕћ§ћ§ћ§ћ§њћњњћћ§ћ§ћ§§ќћ§ћўў§іћљљњћњћњњљљњіћњћћ§ћњ§§ћћљњћњњ§њћћњњћ§ћ§§ўўйћ§њћњћњ§ћ§ћњњ§ћћњљњћћњћњљњњћћ§ћ§њ§ћ§ћ§њњўћњњїћ§ћ§ћњћћ§§ћћњћў§§ћј§ћ§њћљњћћљўјњњэћњљљњњћњћњћњћљљњљћ§§њћ§ўћњќ§ћћљљњљјљыњљћњ§§ћњћ§§ћ§ћћ§§ћњћњњћќњћњћћ§њ§ћћь§ћ§ћ§њћ§§ћ§ћ§ћњћћ§§ћћњц§ћћњћњљњњљљјљљјљћњћњћћ§њћњ1ўў§ў ўў§ўўі§ў§ў§ў§ў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ў ўў§ўўќ§ў§ўўє§ў§ў§ў§ў§ў§ўўћ§ў§ў§§§ў§ў ўў§ўўќ§ў§ўўў§ўўў§ўў§§ў§§ў§ўќ§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ўўў§ўўќ§ў§ўўє§ў§ў§ў§ў§ў§ўўў§ўўў§ўў§ ўў§ўўў§ўўў§ўўў§ў%ўў§ўўў§ўўў§ўўў§ўўў§ўўќ§ў§ўўў§ўўў§ўўќ§ўћ§§§ў§ў ўў§ўўі§ў§ў§ў§ў§ўўќ§ў§ўўў§ўў§§ў§ўўў§ўўі§ў§ў§ў§ў§ўўј§ў§ў§ў§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ў ўў§ўўў§ўўў§ўўў§ўўќ§ў§ў ўў§ўўќ§ў§ўўћ§ў§§ўўў§ў ўљ§ћў§ў§ўўў§ўўў§ўўї§ў§ў§ў§ў§§ћў§ў§ўўў§ўўў§ўўќ§ў§ўўњ§ў§ўў§§ўќ§ў§ўўђ§ў§ў§ў§ў§ў§ў§ўўў§ўўќ§ў§ўўј§ў§ў§ў§ўўќ§ў§ўўњ§ў§ў§ўў§њћ§§ў§ўўў§ўўў§ўўі§ў§ў§ў§ў§ўўў§ўўў§ўўў§ўўў§ў ўі§ў§ў§ў§ў§ўўќ§ў§ў ўњћ§§ў§ўўљ§ўў§ў§ўўў§ўў§ўњ§ў§ў§ўўў§ўўў§ўўў§ўў§ћў§ў§ўўќ§ў§ў'ўў§ўўє§ў§ў§ў§ў§ў§ўўљ§ўћ§§ў§§ўќ§ў§ўўќ§ў§ўў§ќћў§ўў§љўћў§ў§ўўќ§ў§ўўў§ўўў§ўў§№ў§ў§ў§ў§ў§ў§ў§§ўўћ§ў§ў§§§ў§ўўў§ўўў§ўўў§ўўњ§ў§ў§ўў§ўї§ў§ў§ў§§ў ўў§ў ўў§ўўќ§ў§ўўў§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ў ўў§ўўќ§ў§ўўќ§ў§ўўњ§ў§§ћўўў§ўўќ§ў§ўўќ§ў§ўўњ§ў§ў§ў ўў§ўўќ§ў§ўўѕ§ўћў§ў§ў§ў§§њўћўћ§ўўў§ў ўј§ў§ў§ў§ўўў§ў ўќ§ў§ўўќ§ў§ўўђ§ў§ў§ў§ў§ў§ў§ўўќ§ў§ўўј§ў§ўћў§ўў§ўќ§ў§ўў§ќћў§ўўќ§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ўўј§ў§ў§ў§ўўў§ў ў§§ў§ўў§ўў§ўўє§ў§ў§ў§ў§ў§ў ў§§ў§§ћў§ў§ўўў§ўўў§ўўф§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўћўћ§ћў§ўўў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўћћўћћ§§ўў§§§ў§ўўў§ўўў§ўўў§ў ўў§ўў№§ўћ§ћў§ў§ў§§ў§ћўўђ§ў§ўў§ўў§ўў§§ўўў§ўўќ§ў§ўўќ§ў§ўўі§ўћ§§ў§ў§ўўў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўј§ў§ў§ў§ў ў§§ў§ўўў§ўўў§ўўў§ўў№§ў§ў§ў§ў§ў§ў§ў§ўўј§ў§ўћ§§ўў§ћў§ў§ў!ў§§ў§§їўњў§ў§ў§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ў ўњ§ў§ў§ўў§ћў§ў§ўўђ§ў§ў§ў§ў§ў§ў§ў ўќ§ў§ўўј§ў§ў§ў§ўўў§ўўљ§ў§ўћў§§ўў§ўўќ§ў§ўўћ§ћў§ўўќ§ў§ўўў§ўўј§ў§ўў§§ўўі§ўћ§њћ§ў§ў ўј§ў§ў§ў§ўў§ўў§ў ўњ§ў§ў§ўўь§ўў§§ў§ў§ў§ў§ў§ў§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўўј§ў§§ўў§ўўќ§ў§ўўў§ўўў§ў ў§ўќ§ў§ўў§ќў§ў§§јћў§ў§ў§ўўќ§ў§ўўў§ўўў§ў ўў§ўўћ§ў§ў§§ўў§§ўў§ўўњ§ў§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўј§ў§ў§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўўќ§ў§ў ўў§ўўў§ўўі§ў§ў§ў§ў§ўўў§ўў§ ўњ§ў§ў§ўўў§ўўў§ўўў§ўўў§ў ўќ§ў§ў ў§ѕў§ў§ў§ў§ў§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ўўў§ўўў§ўўў§ўўю§ўћўћ§ўў§ў§ў§ў§ў§ўўі§ў§ўў§ћў§ўўў§ўўў§ўўў§ўў§§ў§§ў§§ў§§ўў§ўўў§ўўє§ў§ў§ў§ў§ў§ўў§ў§ћў§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўўѕ§ћ§ћў§ў§ў§ўў§ўќ§ў§ўўє§ў§§ћ§ўћ§ў§ўўь§ў§ў§ўћў§ў§ў§ў§§ћ§ћ§§ўў§§§ў§ўўњ§ў§ў§ўўќ§ў§ўў§§ў§§§ў§ўўў§ўў§§ўћ§§ўў§§ёўћ§ћў§ў§ў§ў§ў§ўўќ§ўћўўњ§ў§ў§ўўњ§ў§ў§ўўў§ўўќ§ў§ўўј§ў§ўћ§ћўўў§ў ўў§ўў§§ў§§§ў§ўў§ўў§ў ўў§ўў§ўў§§љў§ў§ў§ўўў§ўў§іћ§ўў§ў§ў§ўўў§ўўў§ўў§§ў§ўўћ§ў§ўћћћўэ§ћ§§ўћ§§§ў§ўўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўўљ§ў§§ћ§ћћ№њћ§§ћў§§ћў§ў§§ћ§§ћў§ў§ўўњ§ў§ў§ўў§єћўћ§ћ§њўћ§ћўў§№ћ§њ§ћ§ћўћўњ§њ§њћћћњ§§ў§§§ў§ўўљћўћ§ћў§§ћњў§ў§ў§§ўё§ў§ўў§ў§§ў§§ћћ§§ўђ§ў§§ћўћ§§ўњћ§ўў§§ў§§їў§ў§ўћ§§ўўў§ўў§§ў§§ќў§ў§§§ў§ўў§§ў§§тў§ћћў§ў§§ћ§њ§њћ§ў§§ћ§§ў§ў§ў§§ўў§§ў§§ќўћў§§їў§ў§ў§ў§ўўю§ў§ўћ§ћўћ§ћўњ§ћўћўўъ§ў§ў§ўћў§§ћ§§ў§ўћ§§ў§ўўў§ўў§јў§ў§ў§ў§§њўћўћћ§§ћћ§њў§§ўў§§хў§ў§ў§§ћ§§ўћ§§ў§ў§ў§ў§ўў§§ўўљ§ўћў§ў§§єў§ў§ўћ§њў§ўћћчўћўћ§ћўћ§§ћћўћ§§ў§ў§§ўў§ўў§ўўћћєўњ§њ§њњћћ§ћ§§цўћ§ћў§ў§ўћў§ў§ўћўћ§ћў§§ћў§§јў§ў§ў§ў§§ѕў§ў§ў§ў§§ў§§рћ§§ўћў§ўћ§ћўћўћ§њ§ћ§њў§§ћ§§ў§§ћ§њћљљћћ§§ўћў ўўћњњ§њўў§§їћљћћљћљњ§§ћ§ў§ћљњњ§ўўј§ѕў§ћ§њ§§ўњ§ћћјљљњњў§њњ§іљ§§љљ§њћљћћћљћњњ§§§њ§њњ§ўљћћїљјјєјјљљћћјўљћћќљјњ§§ћњ§§ў§§яљњјњћљ§њ§њћљњјјњћћ§њў§ўўћћў§љћћўљ§§љљћљјљјљљѓњ§§љћ§ў§њњћјљљїћњљћљњ§њћћюњљ§§њ§љјћљ§§ўўњњ§љљ§њ§§љњњњћўўњћўўјћњ§њ§§ћ§§љћ§њљћљљўћљљћљћј§њћ§§њћљћљњ§§љњђћљј§§љњ§њћј§§ўўў§ћћўљћћљ§ў§ўњ§§їјљљњўћўў§§ѕћљљћљњњ§§љ§§ќјћљћћљьњћ§§њљљћћљ§§ћѕјјћ§§њњ§јљћњњјњћўўћўє§ћљљјјљљћћ§њњї§ћћњ§§њњћћњщћљ§§њ§§љћћљјјћ§§њљјјљљјјиљ§§њўћўњ§§ћћљљ§њ§§ћљћћ§њљ§ћљћ§§њљњњјљ§љјјњўљћћўјїї§њїјјљћўљ§§щљћ§§њ§§њ§њ§љљјљљћљћ§њ§ћћцњљ§§њљ§§јјњњћјћћјљћљљњјљћљљјјњїѕ§§њ§§ћѕ§ў§њ§њћў§§ўўўњ§§ћњ§§њ§§ћћљћ§ў§§љћљљћѕћљљъјљћ§§њ§§ћњњ§§њљћљњўўћўўћћ§ћљљ§§чљјљљњўў§§ћћљћљћљљјїјјїїјћћ§љњ§§ѕњ§љћљњ§§њў§§њњљљћњ§§јћљљјљћљњњућ§њ§§љћјјѕїѕѓњјљњї§њњјћљљћ§§ћћѕјїњћћљњљљћ§§њњћњњћћљљћ§іњ§ћјњїћњљћћѕљћљљћљњјћљ§§љћћњћљњјјїћў§љ§ћћћ§њјјњњљљћћљћћљљејљєјљћјјїњћњ§њ§њљћњїјњјћјћњњјњјљљћћљјљјїњј§§ўњ№љ§ћњ§§њњљћћ§њ§ћљљћњїјљ§§№љјїїљїљјјћњјњјљћћэљѕћћљјњјјїјћћ§§њћ§њњі§ў§§њњјћњ§§ђњјїїјњѕїљјјњїљљћјњ§ћљћћљћћ§ќљўў§§ћњ§њћўўђћў§њњљћљљњњ§љћћ§јў§§ћљїјљљљћјљ§њњљљхјљћљћјїјљњћ§љўў§ўћў§љћ§§ћњљљ§іњ§§ћћљњ§§ўўњ§єў§љљћљћ§љ§њћћљљњ§ћљћљљїѓѕјјљћјїїљїњњїїўњљљж§љљњњ§ћљњ§њћјїїњљњњћњњјњјњћљњљњћћјћћљјєјїјјљїћјѕїѓїї§јњћћљъњ§ћјљ§§њјњљњњ§ћљјњїєјћћєљ§њљњ§§ћјљљ§§ћљјћњ§эњћљљћњњ§њћћјјїћ§§ў§§пћјњјјљљћ§§њљљ§§њ§§јїѓјљ§љєјњјљ§§њњщћљљјєјјљљћћљћљљїљћћљћњ§§єљћјњњћљћћњњљљ§љѓјљћљјњћјјїњјљљўњњљћљљћћљњхћљјїјљњњљјєљ§њ§њ§њњ§њў§§њјћћљћщљћљ§§њњ§ћћљјјљѓэрљћљћљ§§ќў§§њњј§јљјћ§њ§§ўў§§ћњ§љњ§§њ§љћљјїњљј§љѓнŸљљњэјїѕјјїѕњњјјїјњљњњћјјћєљћћјјћљњїїћјјћљњјїјћљћћјєѕјњђЯЃnQњјћ§§ћ§љњ§§ўў§§яјћћ§§ѕјїћћљљњ§ћћњњјћњєјњїѕїїяѕїїљ§ћдЊО‹VF§ћљћ§§ћћњ§§њњљ§њ§ўћ§њњњў§ћћњ§§љќћљљјјіћ§њљјјњњјїїѓћ§щЄucMQaBћњ§§їњ§њ§њ§§љ§§ѕћ§§њљћћљћћњњ§лњўў§ћљњјњњјљљњњћљјїєљћѕАtUVINU<§њњ§љ§§ћњљћћ§§тњ§њ§њ§§ўў§ћјћјљћљћ§ћњњћјѕїљїїјјїђјћ§ї”YVJNQC:7§§ћ§ўќћўњљљћљэјћљћїљјћљћ§њљћњњ§љћћэљјјѕјћ§є‰OJ89MLE.:§§ќњљљ§§ўїњљјњјљјњјј§ћњ§§ћћјјїјјфїјљјїѕїљї§ћљ˜PAHJLBF?1<њњћћљљяћ§§ћњјћћљћљљњ§љњљљњїљћљїѕїјљїїљјљјјљњљљр§яŒ\HFQBALMB8@ћљљїјћћ§§љ§љљјњћљ§§ўѓ§љљјћњњ§љњњљ§§ћє§њ§љїѓ§ћЗdJEEјIA@CQOOњњ§іћљ§ўў§љћ§ўўіћ§њљњљјљњ§§єњљ§њ§ћјјїєјїїъјї§љћ‹IMQ>B;?A7CQOўў§њњ§љ§ў§шљјћљљјїљћјљњјћћљљјљљћљћјјщњљўўјЛaQTN.90(-++OHћњјљљ§ћіњўўћ§§јљњ§§ўњјјЫњљљћљћћњњїїјљјјїї§ћь`U`ZGJ9+*98>98јљјњћўњњћљћћљћљћћ§њњ§ў§ўљ§§ўљјјїчњћћјјћћђЈ]VTEB5F:9<2755њўўѓћљњ§њ§§јљјњјљљѓњљљ§ўњњјљ§§љјјрњјњјљћїїјїєћћНYIeiYSNPEA79MFEўў§§№ћљњўћњ§ћ§§њ§њњљ§§њљ§ўўњ§ћљљќћјїјјцњћљйgbi]-BGNNB?58@>@њјјљљјјќљ§љ§§юљјљљњ§њ§јћ§§њ§§њњ§§нњ§њ§љљћћ§ѓu7GJG<5@9;@A>:.3;§љљјљљњ§§јњћўўњ§њўўљ§љљ§њ§љљўњ§§хљјјћ§їƒCWzn4?F:<4]NB04<њњ§§їў§њ§ўћ§њўўѓ§њ§§њњ§јћћљљ§§љћњхїѕєѕјћћФL9k]I53JF@7(NE+0+§§Ыњ§љћћљјјљћ§њ§њ§њўў§§ћљ§§ў§њљћљљјњјјїїѕ§ћсwm]]PJEGFA<44ѕ87(ў§њљњ§§јћў§њ§ўў§§гњ§§њ§њљћћљњњ§§њњљјїїјјћу~YMPTMHEHB@5A3<5..%2ўўє§љљ§њљњњ§љњўў§јћљ§§њ§§љљмњ§§ћјїјњјјћњљя–`\G#GHOPVNIJG>82!0Gўўњ§ўўљњњёўћўћ§њњ§њ§§ћљћљљјдїјїјј§ђЉ„k]`@&?C?FLHIHF50*ћ§њ§ўў§§ўћў§њ§§њѕ§њљљјјєјћ§ћћўјїїу§јЌˆk>4<@><@A>HF?;3)( јљ§§ўшћўў§њ§§ћјљћљўћўўњ§њњ§§њћћ§уљ§§тrE8A&AA@CEFGJJEA7*-#!ўўў§ўўњФ§њ§§њ§§њ§§ўўћўћўњ§§њћћјїѕї§ћјŠQELLHF525?HOPC+11003(9"§њўўћўўњћ§њњ§њњћјѕљљјћћњљљкћїјїљ§м‰TB:JPONFE:9ACF*!!,)! 85,њ§ћћўўњ§љњ§њ§ћћљљћўљћћ§јљћћнњ§§ВcTS`[SGHGCB:GLLA[4-)Fўњљљ§§ў§ћПљћљћћѕњњ§љњћњ§љћњ§§зtJYOFBHFBEC:7GP?+0-ZO(b§њљ§љћљљјњїўўњљљњ§§њљ§ћїѕѕвјљћАc\SM3:87F<34:[A 23*(ћїѕєѓѕѕ§јљјјўїѕѕыїјљњїєѕљўї[0#+%-F!ы !1 *.1<їњћћњњћ§ћўўў§ўў§ћ§ќўћ§ћћњшћњћ§§ћ§ћњњ§ћў§§ћ§ћ§§ћўў§§ђўћўћ§ћ§ћ§ўў§ў§§љћ§њ§ћћ§§ћў§ћћі§ћћњњћњћњ§§ћ§ьћўњћњћњњћњњћћњњћћ§ћњњўћ§§ўћ§§шћўћ§ћ§ћћљњљњћћ§ћ§њћљњњљњњћ§эў§ў§ћћњњћњћћ§ћ§ћћњћћ§ў§ћћјњћўћ§§њћћїњ§ћњћ§ћ§њњњљћ§ћ§ћћњњћ§ћў§§ћ§§ћў§§їў§ў§ў§ў§ўў§§ў§§љћўћ§ћ§ћћќ§ћњћћњћ№§ћ§њ§ћ§ћ§њћњў§§ћћћў§§њћћњў§ћ§њћћњў§ў§ћњњўћњњћї§ћў§§ћ§ћ§§јћ§ћ§ћћљўў§јћ§њћћњћ§§ћћўћ§ћћњњћћњњћћ§љњ§§ћјњћћ§ћћ§њњўћ§§ћјњљљњљў§ўўў§ћћљ§ћћњњћ§§ћќњ§ћ§§љњћњ§§њћћј§ћ§ћњњћњњњ§ћ§ћњћћњћ§нў§§ћ§њћћўћ§ћ§њћњћћ§ў§њћњћћ§ћљљњћ§ћњњћљњљћњњћћњ§њљљўћњњћњћѕ§ћ§ћћњ§ћ§ћ§§ћљњћњћ§ћњњщћ§ћ§ў§ћ§њљљћ§ћњ§ћњћћљњћћпњљљј§ћ§ћ§ћ§њњћўћ§ћ§ўўћ§ўў§ў§§ћ§ћ§§іћ§ћ§ћћњћњ§§ћќњўњћћіњћњћћ§ћ§њ§§љћ§ћњћ§ўўў§ўўћн§ћ§ћ§ћў§ўў§ћћњћњћњћћњљњњљљњњћњћ§§ћ§§эћњћ§ћ§§ўћ§ћ§ћћњ§ћ§ћћ§њћљљћј§ћ§ћћњњљљьњљњћ§ў§љљњњћћњ§ћћњћњњѕљњћћ§ћћњћћ§§њњљљњњћћьњћћ§ћ§ћњњљћњљћњћњћњћћћљњњћ§§ћљњћ§ћћљњњљћўћўћњњќћ§ћ§§љћњћћњњћћњ§ћћњћњњќћљњ§§сћњљњњљњњ§њљљњљ§ћћњњћ§ћњњ§§ћћ§ћўўь§ў§§ў§њ§ћћ§§ћњњћ§§њћћљ§њћ§§јћњљљјљјњњыљњљњћњњћњћћ§њњћњљњњћњњћ§§ў§§ќў§ћ§§ѓњ§ћ§ћ§ћ§ћћљњљљћјњњљћћњэ§ћњћњњћњћњ§ћ§ћўў§ћ§§ў§їћњћћ§§ћћњњѕ§ћћ§§ћњћћњћћќњ§ў§§ћў§ћћњљћњћљњћўўўћўўјћўњ§ћћ§ћћ§ћјњћ§§ћў§ўўњ§ћўћўћћќўћ§њњљћ§§њћњћћєњљљњњћњњљљјљљћњљјљћћђ§ћћ§§ћњў§ћ§њњљљмћ§§њњљњљњљњћ§ў§њћћњњћњћњћњ§њњљћњњјњљљ§њљњњћ§њэћ§ћ§њљћ§§ћњћњљњћ§ћњњьћњћћ§ћ§ћ§њ§ћћ§§ћ§њњћћњ§јћ§§њћћњ§§њшћњ§§ўћ§ћ§ћ§ћњњљњњћћњћћ§ћћ§њћњљњњћћљњљњћ§ћ§§ђњћћњћњњћћњњћњћћэњћњ§ћ§ћћњњљљњћњћ§§ћћў§ћћћњћњљњњљ§њјўў§ћћњћћњњћ§ћњњћ§§ћњћћ§ўћ§§ќћ§ћњњћњњћњћ§ћ§§њ№ћњњўћѕчћњћњћћ§ћ§§ўћ§§ћэ§ћ§ћўћ§ћ§ћў§§ћ§§ћћ§§љћ§ћћњњћћѓ§ћњњљћњўўћкЄћћљљњљљњњћљљњљћњљћ§§њњќћњћњњќћљћњњіћњљњћњњћћњњщјњўњжЈrSљњњћ§ћћњњў§ћ§ћ§§эћ§ћњњ§ћўњћњњћћ§§њћљљњјћњћњљљјљљьћўўлЖФŽZF§њћњћћ§њ§ћ§§ўћ§§§ўћ§§њћ§ћћ§ћћњ§фћњњљљњљљћњўўяЅ|hTP^?ў§§ћ§§ћ§§ћђ§ћ§ў§ћ§ћњњћњћ§§вћ§§ў§§њћљњљљњћћ§§ћћњљјћўћЖz[WEMO8ћ§§ћўћ§ћ§§ћњћћ§щћўў§њ§њ§ћњћњћў§§њњљљјљњњљшїўў§Ÿ^[LNLB@9ћћ§ћ§ћњњћћўўў§ћћўњћћћњћћњћћј§ћћ§§ћћњњшћњњљїўўњ‹`S>>NC@@9§ћ§§ўћћў§ћћєў§ў§ћњљњћњљњњ§ћћ§ћћњњх§ћњљњљјљўўњЁVEIFGHB9<<љљњњћћњњ§§ћљњњћ§§ў§ћћ§ћёњљћњћњћњњћ§ћћљјјэћўї–cBGVGA@A@A?њћћњњћ§єћјњљњћћ§ћ§ћўўћњ§рћ§§ўћ§ћ§њћћ§ћћњњўўОkSF?BBJCJNTQ§§єћњћ§ўўћћњћ§ўўэћ§ў§ћњћ§ћ§ћ§§ўћ§ћћњњ§ћњљљ§њљўўёŒONNE<§ўў§ўў§ѕћ§ћ§љњћћў§ћћќў§§ћћњвљњљњћћњћњљјўўЧZ@geUVTNL@@BFLFў§§ћ§ћ§њћ§ўў§ћњћ§§њўћћ§ћ§§љћў§§ћњћћсњћ§њњљўўнkdbZ7AGJLHGB@@QMљњњћћњњћі§ћ§ћ§ћў§ћ§§§њћ§§ўћ§§ќћ§ћ§§ћъњўўѕ|9FEI@@BB?@IIFBCBћћі§ћћ§ћ§ћ§§ўўљ§ћ§ў§ўћћ§ћєў§§ћ§ћ§ћћњњўўщƒ?Yu‰p8FF?8)`VMEFM§§ћћ§§њўћ§ўў§§ћ§ћёњћћ§ћ§ћћњћњњљљјјшњўўУM8k^H;05E<0)TL7*:?§ћћѕ§ћўњњћњњћњ§§єў§§ћњћ§ћўћ§ћћбњљњњљљјўўшƒm]ZVIGFGHA9:FHA849ўћ§ў§ћ§ћ§ћўў§§ћ§ўћћѕ§ћћ§ћ§ћњњћ§§рћ§§ћњљљїўўь„WSBTQIIHHC@8FCCB?F<ўўћ§ёћ§§ћў§ў§ўћћњћћ§§ћ§ћ§њљњњўцѕœc[B"@ILOWUMIPNH@883>43.)+?§ћ§ћћ§ў§ўўїћ§ћ§њ§ћћўў§љћ§§ћћ§њњё§ћћўўыzM>@2>>?FFђEJMMHB?<<9905ўў§ўў§§ќћ§ћ§§ўћўўђ§ўў§ћ§§ћњњљњљўўмVAINHBA87>IOMG7.5>>BCMNGa;55:CF@?iў§ўћ§ћ§ћ§ўў§ўћ§њњћњћњњ§§ћиљћ§§ћћљўўлpPWVFHCEGC>??BMC>>::&BAEB@AH‚A:HC?:9hST—Эњћўћўў§§ћ§ђћ§ћ§ћўћ§њћћњњћћУљїїўшmTPVVB@BEGB>@CHTNHMLE%FOj‚‹Ђћњћњ§§ўћ§§ћљњ§§ћ§ћ§ћ§ћ§њћ§§њњгїѕћўКIVcCI?;?C:479@SYVLVN^IbZ…БНИњћ§ћ§ћ§ћ§ћћљљћ§ћењљћћ§њљњїхй~J\[TYc),E8 $.HkS>3.$3|‚žЎњњљљјўљњњќљњњћћўљњњ§ћўћћйљјћясЋWVIFS8&%&G <9BSNd]ћњћњњљћћњћћ§ћћдњ§ћўў§њњљ§ўєИxFJA?&)F%  -+5-1F8ћћњюћњћћњћњћ§ћў§§њћћ§њњљўпшoE70%A*0*`-3W‚e)41љљњ§ћ§ўўўћ§§ўЧ§ћћњјљљњјљјїљўѕЊVI7!*8.  )A%,1Opp;$<јљљњњћ§ћў§§ћњЦћљљјїјјїјїљўўш‡F72T7?, (4+!+Z˜[#9ћљљњћњљјњљљјјќљјјїїљањљљјјїўўж‹VF5-9:$(Q@.@ћљјїїјј§їјњњўљјјдљњћљљјјћўљŸY4.%*7S4   5J435;9?AEC§§ў§§§ў§ў ўќ§ў§ўўў§ўўћ§ўћў§§њў§ў§ў§§ўћ§ў§§ўўў§ўўњ§ў§ў§ўўў§ўў§§ў§§љўћў§ў§ўўј§ўў§§ў§ўўњћў§ўћ§§ўў§ўўў§ўўэ§ўў§ћ§§ћћўћў§ў§§ћў§§їў§ў§ў§ў§ўўѕ§ў§ў§ўћў§§ўўљ§ўћўћћ§§ўќ§ў§ўў§ёћ§ћў§ў§ўћў§ў§ў§§§ў§ўўў§ўўѓ§ўћ§ћўў§§ў§ў§§їћ§§ў§ў§ў§§ў§§ў§ўўў§ўўў§ў ўќ§ў§ўў§§ў§§ў§ѕћ§§ў§ўћ§§ў§§ќў§ў§§љў§ўў§§ўўў§ўўў§ўў§ўў§§ўў§§§ў§ўўѕ§ў§ў§ў§ў§ў§§ўћўўћ§ў§ў§§љў§ў§ў§ўў§їћ§§ў§§ћў§§єћ§§ўћўћў§ў§ўўў§ўў§ћћўћћў ўњ§ћўћў§§ьў§ў§ўћ§§ў§ўў§ћ§ўў§§ўў§§ў§§№ўћў§ў§ўћў§§ћўћ§ўўј§ў§§ћў§ўўї§ў§§ћў§ў§§ў§ђћўћ§§ўћўћћњћћ§§јћ§§ўњ§њћћўў§§њў§ў§ў§§љў§ў§ў§ўўч§ў§ў§ў§ў§ў§ў§§њў§ў§ў§ў§ўћћ§§ћ§§ћ№§ћ§ћ§ћўњћ§ў§ў§ў§§ўў§ўўэ§ў§ў§ў§ў§ў§ўћ§§ў§ў§§§ўћ§§јћ§ћў§ў§ўўі§ў§ў§ў§ўў§§ ўљћў§ў§ў§§ўх§ўћ§ћў§ў§ўћ§ћћњ§ћ§ћ§§ў§ў§ў§§§ў§ўўќ§ўў§§ыў§ўћ§§ў§ўћўћўћў§ў§§ћўўіњ§§ўћў§ў§ћћ§шўћ§ћ§ћўћ§ћ§ўў§§ўў§ў§§ћћ§§юћўћў§ў§ў§ўћћ§ћћ§ћ§§љћ§ћ§ћў§§љћ§ћўћўћћњўћўњ§ўўќ§ў§ўўј§ў§ў§ўћ§§ћ§юћўћў§ў§ў§ўћ§ћўћўћ§§љћўњў§ў§§їўћў§§ўў§ўўњ§ў§ў§ўў§ў§њўћ§ћў§§ђћ§њ§њ§ћў§ћћўћ§§ћћ§ћў§§ћыњўћў§§ўў§ў§ў§ў§ў§ў§ў§§шў§ў§ў§ўћњћћ§§њўћўћў§ў§ў§§ўў§§ђћ§§ў§§ўў§ў§ў§ўўѓ§ўў§§ўћў§ў§ў§§ўљ§ў§§ћў§§јў§§ћў§ў§§ѓў§§ћ§§ўћћ§ћ§ўў§ќўћў§§ѕў§ў§ўћ§§ў§ўўў§ўўњ§ўћ§ћўў§§ћў§§ђў§ў§ўњ§ћў§ўћ§њњћјўњўћ§§ў§§шў§ў§ў§ў§§ћ§њўћў§§њўћўћў§§ўќ§ћў§§ьўћўћў§ћћ§ћћњў§§њ§ћћ§§ёў§ў§§ћў§ў§ћћў§ўўј§ўћўћ§ћ§§яћ§ћўў§§ў§ў§ўћ§§ў§§хўћўћўћ§§ў§ў§ў§ў§§ўў§ў§§ћўћ§§ўп§ў§ў§ў§ўћўћў§§ўў§ўћў§ў§ўћ§§ў§ў§ўћћњў§ў§ў§§ћћўћћ§§яћўћўћўћ§§ў§ў§ўћ§ћћ§ћћў§ў§§њў§ў§ў§§ћјўћўњўћ§ўў §ѕўћўћўњ§ўў§ўўі§ў§ў§ў§ў§ўў§§ўћ§§ў§ўћўўюј§§ћ§ћў§ў§ў§ў§ў§ў§§§ўћўўў§ўўя§ў§ў§ў§ў§§ўў§ў§ў§§ѕў§ў§ўћўћўћўўёщЖћ§§ћћўњ§ћўћ§ћћїўћўћ§ўў§ўўђ§ў§§ћўњ§§ўћў§ћћїўћўћћ§§ћ§§ќћўљўўйтЛ‚\ћў§ў§ўў§§ў§ў§ў§ў§ў§ў§ў§ўћўћ§§ў§ў§ўћћљ§ћўћ§љњњ§ўњўўљьЯк˜pT§§ў§ўў§ўўў§ўўћ§ў§ў§§ў§§ћ§ћћњўћ§§ўћћљўћўњ§ћўўђљКŒ{`ejSўў§ў§ўўђ§ў§ўћў§ў§ў§ўў§§іћ§ћў§ў§ў§ўў§ўўћћѕўћ§§ўћ§ћ§ћўўїТŒpk[adSўўј§ў§ў§§ћўўњ§ў§ў§ўў§љў§ў§ў§ўў§ѓћ§њ§њўћўћ§њљўўюЏqx^^aVSYўў§ў§ў§§ўўх§ў§ў§§ћ§ћўћ§ћў§ў§§ћў§ўћў§ў§§ћўћ§љўўь˜ngSMaZYTM§ў§ўў§ўў§ўўя§ўћћ§ўћўћћ§ў§ў§ўћћќўћўћћіў§§ћ§њ§њњўўяЕi[`\VQVLLJћў§§ћ§§єћўћ§§ўћ§ћў§ўўц§ўћў§§ћўў§ћў§ўћўћ§§ўћўњ§њўўѓЃtU]hb[OP[NV§§ћўћў§ўў§іњўћў§ў§ў§ўўи§ўћ§§ў§§ўў§ў§ў§§ћў§ў§ўњўўЪzgPQN^WZ[bg^§ўўњ§ў§ў§ўў§ўє§ў§§ћў§ў§ў§ўўќћўћўўљњ§њ§ћњўўхЃbaVUOWYNOYijўў§ў§ў§ў§ў§ў§ўў§њў§§ћў§§ќћўћ§§єћ§ћ§ћўћўћћ§ўўюЫ}hj^>GLEPIA[`§ўћўўћ§ў§ў§§ў§ўѕ§ў§ўћўћўћў§§ѕћњ§њћћўћўњўўюqenjSVFSFHLPTOћ§§ўў§јћў§ў§ў§ўўы§ў§ў§ў§ў§ўћўћ§њўћ§§ћўўяМh`cNFJULSU`OOJ§ўўљ§ў§ў§ў§§њўћў§ў§§ўљ§ўў§ћўћћр§ћўћўњћўўбnNnzi^]V\WMOYUZўў§ў§ў§§ўј§ў§ў§ў§ўўњ§ў§ў§ўў§§ў§§гћўћ§ћўћўўя{qui?VW\V[WSHPY`ћўћўћўћўћ§ўў§ў§ў§§ўў§ьў§ў§ў§ў§ў§ў§ў§ў§ўћ§ўўэŠCZ[TVVMOBPZbVUSSў§§ћў§ў§ў ўљ§ў§ў§ў§§ўі§ў§ў§ўћўћўўэ”Nc‚ž{NTTQGCm[PNN^ўўњ§ў§ў§ўўў§ўўў§ўўь§ў§ўћ§§ў§ў§§ћ§ћ§њўњћћўый`L|r]NCiYNN?`WF3@O§ўўї§ўў§§ўћў§§ћў§ў§ўў§§ў§§ўћ§ћў§ћћц§љћўўљ’}kik^V[[VTHQPWZGB@ўўњ§ў§ў§ўўў§ўўў§ўўјћў§§ўў§ўўу§ўњ§љўў§—k^^da`[b`\VWSQOLMFBўўј§ў§ў§ў§ўў§эў§ў§ў§ўћў§ўћўњћњћћўўъЈkoQ5S\`djmc][\ZICGM^ўўў§ўўќ§ў§ўўј§ў§ў§ўћ§§лўћўћћњћћўўТ›|imJ5O]W[ca^^]VPF>35F§ў§ўўў§ўўі§ў§ў§ў§ў§ўўћ§ўћў§§оћўњ§ўўОžxNGHLQPT\P\WSQUI>8193<§ў§ўў§§ў§§ўћўўў§ўў§тў§ўў§Š^IWBQQTPYT`Y\^VOHBHC<8?ўўў§ўўє§ў§ў§ў§ў§ў§ўўѕ§ў§ўћўћ§њ§ўўхЂePU[YVQOMU\]^]CLGQJILN<8§ўўЩ§ў§ў§ўў§ћўћ§ћ§ћў§§ћ§ћ§ћћњўўѕ›kOL]ih\ZUCQSa^J8:?HG`C*)4!5-:SC§§ќўћћ§§§ў§ўў§Ьћў§§ћўћ§њ§ўўѓ|SFEAC1#&!$%BM*9 #t9>Y~].#3"ћ§њўћ§§ўўќ§ў§ўў§ўњ§§ањ§љћљ§ўўЖaYB,18@;2(%!)0&>.-Oth4#?њ§ћў§ў§ўўњ§ў§ўћ§§ћЫњћњ§јњљњћўў§—PCA`FA: 0%)# !$.*),T™^"Eћ§њўћћњ§њњРћљћљћљ§њ§њњћ§њћљњўўу˜^SMBHG^P -+%!14)2V:(7$*QC8Fћ§љњњћљћљ§ћћљ§љћљћњћћќњћљўўоЌcF>;1ECY>"$%5I:.02;HFITПўw;wўџ9wџ9ўwџџ8ў€џџ7ўwџџ6ўwџџ5ў€џџ4ў€џџ3ў€џ џ2ўwџ џ1ўwџ џ0ў€џ џ0џ/ўwџ џ.ў€џџ-ўwџџ,ў€џџ,џ+ўwџџ*ўwџџ)ўwџџ(ў€џџ'ўwџџ&ў€џџ%ўwџџ$ўwџџ$џ#ўwџџ#џ"ўwџџ"џ!ўwџџ ў€џџ џўwџџџўwџџў€џџ!џ!џ!џэљњњћ§њ§љћћљћјљјљљћљљ”јїѓєєѓђђѓѕљ§Ч‚zzFBGJCAAEEA-:*2>F?>@IJNNOSљљїјљјњњ§ћћљћћїјјїјњњљєђђѓђѓєѕћљЮWHII9)HPEFFH:?:2BB>GQYSNWZQ^V;F§§юљћјљћљљћњљїѕљїђєёээжѓ§ћюЩ›iOSTPYUWTOGSSPWZVOPFAFMNNQTYŽoeћ§ћўўћ§љљћ§§љФјїѕєђьтуѓ§јтЉTMjgOSSUVNLGMPJLLJNLLE8EL?E9E\i{}Щљњњ§ћљћћљљјїљљјЮїѕѕєёьчнјђКj8APJTYPQZaYYWNP[WF5FCIF;GJNJSWevŠЕОјјљљЗћљ§њ§§ћљљћјѓёьяяьццшуЇT9GIML?>HILV\]IMHYr}Z99<7:>E]9;vЅЦСЅњєїјћљњјјљљћїѕѕЩђэющущђбФžQEFVPWUMHJTTZ]WQ@+@Pg]7C@EG4G82iИтхЛИЕњњљјјљћћјї€ДѕѓёярчэлzjtUmMHLNYUTNLENLGF8501JB)#31*,[ˆАЮУЦЪУФАљћ§њљћћјњјњїјїєѓђѓѕлЖ•dSISI]UNLHPHNNJQVTNE8:@A744CJU[UMNPFAFF<37ELLSHd‘ШмЖ—ЈМСЊ–—јјћћјЦєјѕѓѓєђсЋmJ[[SMPNMOQOOTWWVLHCY\PhwˆžœАБЉЋЖТАЋŸАљљјј€Йѕђяѓ§ѕЦƒp:?aMF;<03HVUTSQUPGH?35HPLE:+GNSp|‰Š™ЁЎЕЃ˜–ˆ‹Ћ—їњћјјњјїєѓѓѕјтАQCWJ>PJB;CNve`QPOTLHHCCEA<?EVPOOLE;BAP[[A@MQJ;853<;:9B:MQhzkjtv‹Œ—Б~…‚zp›}dјїїѕ€ћјњњьДvMGEOLLPU[QIJJOMJ::?A?E;3,:(0AASx{jro{…‹qN\…‚z„wVјњјјїѕє§јЦS\QSNNTLQTQNNILFNPJEEAB::71:90,Bo‰Ї‹k~‰•Œ‰xgiuƒvz~xtјћјјѕјїјЭzMLUNMPJPSNZMGFIEEB@EJLF7019T[B8I‡жтVk}•ˆ‡|‚~|ƒ|}|z…їјїљљѕуЕ‹aMGTUMIJLGGMJFEGI>ECLLIE+44BIUVqtt—‡vai}Ÿ–”‘ˆ}‚Ž‘Œq}gwїљ§§шУqPLAMOOICGTTPIOMIEELHFEIGC<24>!(`Œ‘Žˆvpjoxvq~–™›Ÿ—ЌсНk!8Gwѕћ§нЄ}N8JUNN?917GJOLJBFFPVSOOL;:BBMFM^w‡~pptnnquŽ˜–Ё™–™АмЪВi>L˜•ћљк~^MAJTMH@@C;99>38@ABIGB8EA;($,.Pn]]rjkjkopv|ˆŒ‰‘‰{ЌОŒŠ›™ˆ‡Ђћщ”nQ:2STTI:?HFE@?@?8A:9Ek\H5>>N>aŒmcnv{uw||kkpŒŽ‚Š’|—žЅŸ~u1:ЩB:BEBE+?FGCLNEBBGSOC)BSˆ‡N,+AWv‚vzjYmemmpopgt‚˜xz„}™зЏБВŽ…wV}HGECCHB58BLMJ@895CMrzZp‚Œz}onhhgkvq‰”Š…‚{~‚ƒ’ŽŽЋЎЎ–—Ј—thNPPJEPNUMFEBB?B>GIEA@FJ3:4101.59BIHCJNEIOOGE49q„ƒ~gdjkiaVEONYj{kmoohn˜КЃЇЌДž›ЌМЫЧЄvb]! B@;?4CFEEz~|zvphЅЌЉЕЧЎЕЧТЦУЇ`\LEBBA;@AL>9AGC3;@)#HeŒ}dej”РД}ogiYTabcrrqq€ЏprŠ—ЎЁ—ЋШœЖЧьцЗxc`1-*G:GNL04M]peQE:9I3:a|ˆjneaPe‚ujZ`b]Z\^kocdggn‡™•—”’–ЄЫюޘ•vH@5I,I>HMJ,Z’‘U:8?Mb–‹„{z‚~ovzi[\qomknronoin}‡•‘{”ЩФсыаЦЄx]$ ,)18AC;]gB?C5]E?j‚ˆw‚v}‡}||€Ђuqqh^a]kwomhtx}{‡‹ЏбуЌ”ЄЁЌ•ŽŒL!2)+,-0:APAALOCIZSnˆƒ„Œ‡tbvzmbt|nnbikedabb{zt~||‡•ŽžНОЇŽ‹‚~ˆƒa3.:,..0.??972(>^P<|ˆƒŒow~vvrzkew~zruqtrpwrvx}~|xt‰‹™ЌИЕДЈ~PWЈ‘Q5,,ŸBGF5)0)G\LpЕŠ‚}ox‡ˆtrtzƒ|x{vnYgv~xuvkhŒЅ›ЂБКНЌŸŒ^rЪI5>%-:5)(7488^„ŽБœŒ…odzzxvhebj~…‹|xxnn€knvumaGhžЂžЇŸЌБЊЂ|b‘ˆA &15%.O*7Ad‘‹ˆŒ„|w|pgNIQSb[w‰‰jWirwvvukqZYPvЅМЄŒ‡˜Ђ•|‹ŽEk+*.4*A;-B@J]o•Žw„~u{‡ˆƒknU?^m}А’…W@Zh‡ƒvwvmЎУЕЈŽ„rr•ЂЇe8+2<28;47(3;izŒ‘„{ggpƒœt79io‚hntodTbowwutwvwc~ТЫРН•|r^O[xŽЁ„’~MI857<@(E39@ŠЏŽzwtoqq|ƒŽxVVp}vpnrb[]juxpnYWi‡‹„Œ…Œ‚jcW]ZVjJ%C;)*0#2?B?dE,(<1>9L‚‡v{zƒŠ‰}gimvtqmn‡„e`uzuptv~‰‰‹q—Э‡vmvuuxg@,( (vmI934<.e{rmmv}w‡zmqjqjwr‡ˆzumjrŽz{z‚ˆng‚eZYnrpjea; !H]IEBGaZ9`ˆ’…‡wvwƒŠƒ~twrvnt‚‘’~jcjqv„ŠŠ‡Œ‰ˆŽ’…ƒtv‡‹oia[]W#&3EMLML?}ŒQtv›„wqxƒŽˆz{~|rcZtvh^bcrˆ{”Ќ„qtˆŠŽЋ›}}||Š~V>amS;#0*+-5@kY21822LkZPavpog…Н›’Š„}vvwh\hvqUbpL )*)%% #(9:+<&#3<&7;>N[ˆЋ•–ŒŽ—”‘ƒvvqvnhic[…tT)+1" (#+."!,10,"--#,*3",B?0$SB&+TББЁ’ƒ{…„ƒ…‡ƒthjkkgV]…j43*,  !;9+%!()%"1.!0)4G!"FTHtŽ{n‚ztgmekiqjn`#$ * "B).1$"".1!!"B9)<9\ŠŠwcgjgwmot‚}cH2&&#  *&B&$!,+#!*00)12% hŒ…P`[n~r‡ƒn;,$W 51%Mэћљљњ§§ћћњњћњ§ћ§ћћњћћ§њљїїйѕѓєѕљўўЫƒ{|N>@IHEIIG@2:F58IOQTMPOQQNLYћћ§њћ§§њћлњћњњћњљњјїѕєѕѕїјљўўе^JQO@.FJLBHM;CE@OO€™PY`VU\c^ia@L§ћ§ћ§ћћњ§ћњћћњњјљљјљљїѓёёєѕўўєЮžpVWOYTZ\\TV^^Yae`[YQNQTSQWW^•Ђ}tўћў§ўў§ћћњ§ћ§ћ§ћћњљјїѓюцьњўўыЋTIigNTZ\WQQTQW]VTYVYYNMPQPJ@L]u‡нћ§§ћњћњњћћ§њћћЭњљјјїѓэхпћјРk7pЮўћчур§§ћњњћћњћњњљˆјѕѓїцщянtmzZqMLJQVZMGIOOSQMIBH?ZO7,:jŒЗшюёєчутћњ§§ћњћњљњљњњљјїєїїлН•kWHTL\ULFHCJQUSU^\TMHFGFLMIYIOce|чўјйхчтрлјљљњњљњњпљњњљјѕєѕяѕаˆeNPO;LIPUMLJQZ^VSTPTWWыOMPQ^`d[pЎэўюкччштмлњњўћњњшћњјѕїѕѓчЌnLTZQOLOGIVUMU[[іVPOMNYWYPUUЎ`m‹Чцььчхшюцшштњћћњњћћљњљјјїї§эгОiMOaOGFJIQVWPQOUVSMLQ[a]YUWkdgЈбссшсхчщтхпмшћћњњ€ЙјєёїўљЦ„u?EaOFBB19TU\[SW[VUPSJM[^^[U:VavЅСЭЯпхцпйгЪТШхмћљћћњљњљљѕѕїѕхДYCZGCNLC@CLvbZZVTZWMLQWPMYVQYc`v•ЏЗТжлймулЦЮжЮезгљљћњћњћљїї§ялE;@EFGIHMGMMSLNA:;MY—ЦЃЁДЖЗЛЗБЖИТЫбебдШхюЧУйнШЩгўяm[97GVVJ;;8MOPJ4Pg‘ƒЊЭмгТНОЛИИЗЗ—КЩЧШЫЭЪЦШЭЪйдУЫмкзйзчжЗБHUVOPMOQTMHIIG?HOOPOMUbVh‘КЗеШТМЛКЖЗВВАБЧхШСФЩЪЖСгррнйчєјљщцшЦЛЎ?A<LPE<:;>0Vj]ŒёшзжСМОШЫШФРЖИТЦЧОКОИМИНУФРКЖЏЩгннстцтнмбЄЛїЋYCA*$GvАЯьсбЪДЊИРНОЕЎЎСФЭЪЧРНКЖКСУОКВЏЉнсзкжчюсйТЎЯЎP)*1>EA>;<8A]@EN‚ТегЭЧШШаИЌ›”ŸЋЌУЯЫЯЖЄБЖНОНН€,ВЁŸ•ЏтѓдЯЯгегЩЭЯНb08rOE?:>OHFGPUq…ЦЪРЩОНСЧдЩЖЕŸ‹АКУуЪЭШžЏЗЗММННМЊЮчћєсЮЫЮеИИзшл”N@JO1ACEAFM>")H…ЇЩжФОЗЕРЩыуВ„ЅЏТЯРОТЛВЇЎВЗЛМЗЗННЂВшїх§зТЖЊžЋЪраЉЇ‹U]LA;>EAWHGVЈуйЪТТМЛРФЩеО›™ЖКТМНКВЎЈЊДЛМОЕД™БЦЮФЮТЧмЧАЉЌЊЏЉЕu>BB?@C?2EZcЌОЅЛМСУЧЦШЧЩбЖЕБЏкФОЗЕЏАДНРРКДАЄЖкбехйбеРЊЌВУС•U9%739;AGNMYTQwЈОЗИОШШУОНКТФНН€“ОУЪФНБДБВВИЛОТНЛУбнезбЉœВЕЖЖЩЩСЈH8SGSGjQA-?;OFqУбЗТСУШЫУОЖККОНМРФЩЫЪМДБНСНКНЦЦЧЧФОЇа§чЯМЖЖЛРжЫЇi-;?;"?‡tQ7@@]N—ФЭФФЦШЪбЧОКИООУРЦЩЮЦРЕЏИРФРМНТЦФЩЧОЃШЧЅŸЋЕККЗКЋq2-,E:\gQQIBebPЭпгЦТНРУЪЪФССУРМЛСЩзТЖБЏАДЧШФУФССЦЪЩЩУРЛНЮЕЕВАЉB,3>@FQVQQM>Š—wОЮсЭЦНЗИРТТФТТСКЗЈРОЌЊЏДЛЦСбыНРЏШШЭтеУМРЦРМžŒЂЖЄp88CA?@GHHLGLoqЅЭЫЪЦРКИОРСТТЦФНИДЕИБЋАМРМЩкгЫЌЗЕЧхлпЭЎКРЛКЄЄЎЗБx;(AJHFG@BGLE3PZЃЄœАИОРРФУЩУШЩФСОНЗИАЏЖМУУТтаЩРТТадедСЋЖИЛЖААУШЅ<1-FFLMHGJGHEEG\ЌЈЈАТнЪЧЫЪЭбеаЪФФТМЛЖАВЏДЌЈОЧЩЭШЩЭкСКЕЊАДБИМКЉЈj!(?@AEGHM[QA?AGIФОЛАСпЭЫЪШЭажЯЧУЧУЛЖИМЗЛЛНОМЦШЫЩЮЯЯбКŸЄЏВЏЎЗЖ–r0*C<;5;;&>BBJP48ЕЕРБхїмгедёеЎЛЛИМЛНТЖОйьяѓђкЯЭЪЧШУЦТУЕЉЉ€јЋЅЅВnZr>>:31399>AH1"31;ЇЛЮЯххййсЮЮШЫФФУСОУОЉСўњтулЪШЧФШЮЪЫЪСВАЌЏВТаСTAQ3-98<;<9>A?70232cŽ˜‘БгЯштЕООСФЭИЏЗЛСœИЮШЧЩгЮЧТШЪЩУРЗЖДЗЕАЃЉЈq#-.58A?::?<;92&$-7MUQtgPFQLUp‹–‘ŸЎЎЃЁЛѓбЭЩЦЩЭЦЦОММКЖЕВВЎЉЂЈЗƒ5$;;>9:85:59751;-%"81GTHHC@;;MS7:QTPc}ВпйдЮЪШШЪЫЧЦНЖЖнЎЄŸЁЦИƒH@C44*49:549:>754:B@BB„AFO]GGhM9@hЭпеаЛНУФУФФОЛЕЕЗДЈЈЎаœPEGQ@5-),+29;72,+@CF<(@;5>>:>@;?2-47V?#,>:88;;‡<>;;@3@.UWCV\‰ЮдРБЋЏЗЗОИКСМdO#9;>21**;8B758>-40,Y>82287:??FF??4?>@;;A@C?2--C‘ЭЭЃЄЇЖМИЗШЫВ^H:+<;8200?o@ *+B?>9-92xј§ћћ§§ўў§§ўћ§§Ыћ§ћў§ўњњјњїњјљ§ўўнŽŽ‹bJZ^W]]YVTbƒЁЃ˜‰xvЅзЩ‚|zqw{pwƒˆ‚‡ŠŠŸДЫЖВМкЊЩмў§Ц‘}pFBC[^^e[COi~‘…teQS]MW}—ž‚Š|r^x—‹ƒ}truru{„zv~|œЇЋЏЇЅЅЕрћкБЗ‰Y[NZLbZ\re@vЏЏŸtYT:[ivЋŸžЊ•‘•‘„‡}qx‡ƒ„‡}„‡‚‹Œ™ЊЇЄБылјўюзК›–v4%$&JHJOWWSz\M]MiTW…•—’Б›Š”—’–‘Ё‚v~{ˆ‰‰ƒ‡‹‘›™žЏСсѕОЉДРФЏЈœ]%?IPISIPU[mYdhk`epkŒЂ˜™ЄЂŽ˜‚‚‰Ž||{}}”Œ”’›ЌЃМеаОЁЇЂ—›˜zEP]POMLSYUU[TFTueP‘Ѓ–ЇˆŽ‘”–—„„‘œ‡„ŠˆŠ‹”•–”‘‰™ЁБагедȘnhОЂ]*9GGNHVYZMNJJ8YteеЗЅŸ…Œ•ŸЂŸ’…Œœ˜Œˆ‹…q|Ž–Œ‹ƒ–ЃКДИШЫЮУЗЇuˆрЄ[;UNICLTHHBIL7,Ip™ЏУЖЇžˆ{‰Ž‘‹ƒ{w’ЁЄ˜‰ƒ~‡…‹…ug…ЕЛЖЗИТЮУВwЇžV)4;EFNPBFQgBSWxЌЉЄœ‘™…xicaiqnŒŸЁ|p~…‚‹…ˆˆ}qpa‡НЭИЅœЎВЊ—ЁЁЂY09wGAI[„•‹ЁЪСпШŒ’‡’˜…|‹˜tЋАЉЉИБ—’žЌž’ƒ‰‹”‰zuu\-;8B?5HBFB7EE><>75OTZ„rQFPJIhuvq|Š…un›сРЈЄЈЁЃЅ”–”ˆ‰‡„|kt‹k1,5@BJFF>3>:B797?HGJC@;IFMV1C@GOJGMG?CHU^FFhS:@eШдКЈ—–——˜žœ’ƒƒ‚~qkŸLOPUI;7.32JMP"EBCL><>EA>@LHFA<7*&2.1;8922F>B,QJ8H>-`wџў€џџw!џw#џўwџ$џў€џ%џw'џўwџ(џw*џў€џ,џўwџ-џўwџ.џ ў€џ/џ ў€џ0џ w2џўwџ5џўwџ6џўwџ7џw9џw;џ§€џ<џўwџ Оџ€фWA;;GgДА”‰…tЋЖ•Wp™‹wbnx„{B&;9 #&5A?A?L@A<>>3:CB98-"NŠЊЏ„zqm|xe[`WW‚РУ˜‘„ežжЖc?w…•Ѕ„uƒg>3,#!!5YYCCEBFGJH>ACA;5!4O‚Ј—iVddi[8M~™НЅЇ™˜ЄЂr{Ї‹]MbŒ‘|xwcE183(#"H[QMB@IFNHE@@NH@3;[‘…ti[`chkjg\юбДЅ›–™ЗФ{Œx‹Š{Аz{rQ@^M53*%G89<@IILGBFCH94,&aŒ’‘‡th^NP\WeaЊ•—‘•™žЈКЕ•’œ››•œДŒƒ`EN@)20.17>EILHL[VQJGAF>-%+FtКЯЊtrcdFMGLMQQЃЇЁ‰‡›œ˜Єœˆ|tu‰Ђœi,;5+)$2%)CHF?A?JTYNF9:F:5C`k‹Ї‚]FHFPIV`ijaЌ›”Œ”ˆŽ™—…}|‡–Љ–L,97+,9,*,%.;;98?IMMCA;<>1@Qa\QZcme\ZYg4;JSZ`ЌЋЌ‹„…‹’œ•Š|wƒ}ЋЅz&8.$$))44FS9BobgZZ\jdrkoiB0M`onЇДЗЏВ—iz}‚‡}qxžuL+#&$(.,07TQJFFMG?71*0BE`urjc`\dgd\m}k^p|xzœЂ˜ŸЅ˜}uqz…xtŒ["-)$3ZPUSNJIJC;A?>#%2`‰}hacZdoiimacmt}xrЂˆŽЄИ˜Ž|{„…˜‰……u@ $#);<9?G8JGLJGJH;)3-#7HOhpˆ}rdepiZY]`b\croq`?ž}udƒЃ™…wuˆ…ubG& !*ALIULOHGFGC??;24E>UŽzxvntrgabcjmjge^jgmuvmk‹•ЋЕЄОАŽˆ…kL%$C#$!1@EG;9FLHC9:"P][ЂД~qmxoS9I[Z^eaOgegmbbnbV›ЈЎž–ˆ‘‹hwvYP.()#!!(2AGLQGGHSL>9Otœ˜‡jSacWUVL`qvcZPdYgwqd^\mƒ‡…‰Ў™nerjJ3) &05C>BECC747>??:BBC.5;B]pn\YY]`WMJ`ZaiiacjrjTMHBS`to{{pibui9*@VF?9*%+.02?A>@B@5-95;1%.(&2;BH;($.7Nn”|k]OLOWM`j^Od„„ŠxxrP[a\iigIB]m„xwƒЃ((&,.(1*;FB@@;?B;9;FHYЏЁ~eLTOJPWMUejcgemnkM@>@1Z]OP]idv‰{1"&&0:@5?LB:AEJJE>8<-2!Z”’wg]\adYVZLSVUV``T[^^OCC^a\\]ghcЂV"181.3?JBL@@EIEF>:2%8hhtjdkpnqe^rr[OPV^hjdWAVH:FQ[dppmчŸ\B"#(-@CAB7#>`{taeet|}}MN^inp`\`]hjkqeF$@@YQ;;9M[a^M2IQQnu{eie]euke[SJZYLG+8QT8->L`Q~`@&-)84;CENVbV:,AE@1+5(FF-GCNih^hivirYS`mePZ\MNMYegN7OCWo[QCN@@( (+5FH@AG9>J02728!)QgaZUMOVVaaYNEN\]chYLQLET`Pa]OHYPQY[QbJ84A?-0.-(,7;3),($#@\g\ZVbdVYdehh‰c^‚~m`bVNLO[`MJFML20;`BJ\&-$**%!+]tC9;;>32<4)02-JeUAGS[SU[NbmjS)bmga\\WHAM[WG0GBG FAWt!1,%2EB75<<97.;B:AYTWUUйVZgdno`QSW~ƒr^W^NHWTOSOHL`dNIILY!0595*,,€&ELG?BGgS.A@$.H^GN1BFF8I@^eYSUEMQUdS9ECO)-FOIOQONQdtm,2>:<-*+.>EH@CHPT-+#Mi!ETGUP31Y|gbTMMLFHWW-SeTC,>;8MTY`aVW^`it55>CGB@F?EAA9B:-7*JHMZcC)FIWbudoe]VTTVOFS3JghMneQ"F3?Y[MB@GT[o--&OLNUPcidcWV`]aYFV`Z]d<<;\\% Ahwk]O@EHJB\gqcI$&)5?CG1+23@LP<;P[QLCANM\g\A1FV[cS<;NQ[^jTNSG €)Ej`cMMbuqnwbeu^+*:;7ECH?81(*CegWFCE7UYPQ>1 2W]\QHCAMJAFNSjuWV:EaASoV:Tmpthkhp3:JNHF;1E;3HWSQTZC&8+)9O‡pd]EHHONH?AHEkqni`[c`ZQJ<0L5,PZ]j‚S-!%T`”Žvpngp‰‡;-%#*0(%$?IcUYMUH7;MSYaQMHI9SbY]gdGGQ?FG*IpS+EYeMbjŽqejmv~!.%0%&&+&(g|^YUP3$0#7?JUNOUZ[]kbO:7B@MA<8-+1N;LTYIw—}rpquvCC$ (%Hz|vxj;@(2#\gku{rngkx}~‰iA20b{qjcIGI-[a;<:E:CM;EGONgxi^YUQ;C$(BGJYJ\OWehxhu~n`u|to31!Otqgi`TNU::I03.5A0:-CI€ѕGWjYQ[1 THAA(NtO,:zui^[cbmh\ccS&UƒgSLHOL:AT<. 8LmU8r‘aEa]SMVVHE*@SOUZZ`U‰zbSYbgjmbdVS(1o`zjd]U]I3O:>zcEBV#%JGUrqP8J;MQ\[T?44T1IzYLc`Wij^bhxxounhZGbcnb\NFJ`M*A|YA >[2`oePN\iP",L4FHMP\YYjohbo{ngiou\O 7vrqdUH<@0-JB €АO!%JE@V^P0MN(I?JZkJ>T]PVd^mrojpiomoru\CU#qˆmvS9NIHruI>2> 4@<3(ka85JOOhw}|d„ЊВmSOG3*I€"]QAAMvЯмеЫЦДсѕг™ЏзсгКЅЏУЮЊ^FPNLH<0\ЖчяФЗЗКЭЦЎЁm]ažФуцдЫЫΘޢчœwНЯЫчЪРЪŸ^IGC@<:OnoWLFHEFIJEBITMG5HgЎнкЫЖЅБЕЗЋ„ˆŽЉЯщйлЯжсжЎИцШ”…œЪЯИЛЛЂnJ@MQG<>B[iZQHEHSOPJFNUWQHNwЕкЯОДЉЅЇЉДДЅЁўўэрйезкїѕРРдРЪеСазСНЉk[jdUNIE?1SMBCGGQPNOONINNF2FŽЫзбЭОЏЇ››ЃЌЇЈцблйддзрусмгкзаЯЯэйС—xeO:GIJILGEJOO PU[PMLNEBFAGjЈцўшСКЛЌ’˜™™ЄЎунйдггжйнреШЪЩСОШссЂNPLCFEGIJLNFE@GNWZQGGMONG:Ha™ЖЮсЧЊ™›‹›ЁžЇЊЉДлдЮббешзмжЩЩЧФЧсьжvFFGJQQHHIGGW`G[ЊВЌЇЊЌЊВААЎЗŠ~—ЈДДсххцёйКЩЮЯЪЦРМРЮЫ›i>LFBGPMJNHSWOMQSI?@:>5J[mЗЧЫИЕДЏЊЋЋЎЌЇЂЈУСЖЄƒеЫШМЇЦшЯЫУСЦЪЗœgA+4;908;?OOUQVTNEGGCFGICJkЇЖЌИКНЗЏЋЅЁЅЉЇЄЃЊВВЄŒ–РДСРРЩегЩРМЧРЁnH88CC88-3LMMTTUMINPJLMF7Fe—ОСЖЕЗЗВЊЉЅЄЇЋЊЋЋДЗИКУŒМЩмдРбцтУБКЩЊY:9EPILHIMIEI?)2c|бяУЖКИБЋЅЂЅЎАБЌАЌЎЏЕБАЌЉЅЮкгаеЦЯУЎЛЉteBG;>>?9:7>HLQVWMLNNPG,FcЮрЮЕžЌЎЋЃ›žЅЏББЈЊЂЅЂЅЅІЊЏЎЮЫФЩшмКАБ–gFE8%93197;<B\C:542403:@@чCGHLJJLoZM‰ВЖЂЈЌЋЉЂЁЄЎАЎЋЋ€иЌЊЇЃЂЁЁЄЋЏЎжСРИЏЛБ›eJ0*:B<79><:9BCBCFEIIFB8CQjœЖЇЈЈЌЉЈЉЅЄЅЊЋАВВААВА›˜ЁЅББВСКЗЏЉТUG]mYQ\E>;@CC@@?@JHCCEE@)S…ИИЕЊЎЏЏЊАЎЊЇŸu‹ЗККЕДББЌЅЅЄЈЎЖДВЛКЛЫКj7ALHIJEA?;?EIGA@FNH@A2@E`ŒУРЌЅŸŸŸЌААЉЌАЫУбНСИЅЇЉЏБДЌЉЇЋЖТРНЩнБM47;?EHHСEFCGJC8;HIGGHSTmБтуЩА˜œ™›œžЇЊЊЋЏЏАБЎАŸŒœ™‹ЋББЋЊЎАШеРБДF9@EIPTSS€SOHGIJFCEJEF?&7zЫеРКЈЇЊЅЄЂЁЃЂЃЉЋЋЎЈЇЄЂžЃЅЌБЎЏБДЏщлО”N4:?B@HJNPOUMJLMOMFMIC98<]ЁДМАЎЊЏЕБЋЋЌЌЊЈЂЅЊЎВБЌ‘ž•t”ŸЊАМЕИЕўнœ^59;>?8GFHMHEGNILSMIOLE5Z}ЗЮТЎЊЌБЛНИ‹ЁЅЏЕДАЉЇЏДИДЗЌ’••Ž~Ђ–ЋЏжУn208AFB:CEJG8IŠ}P:814#UCE<1488@A;858<:V…ЏЈЂЇЄŸЂЄЄЉАДБЋЇЧЖВЋЅЃž–”–˜–”žЁЇŽŽ’И•–ЇCIGB@>5:e{F7;>A<<>5O‰Ў”ЂЃžŸЁŸЉАВЉЁ}ЈНЏЊЊЄ˜—ž˜’Œ–h’žМ$:IJ@;94;CGAC@BEB@@GG8FUctž‘–˜ŸЁЇЊЏДЏЅ™˜ЇЭЮБЇЄЂ–™˜˜™–•–•ŸЋ”›‘™CCMOE<::;IMCEHQkT;FI8Ftœ…‹Œ’ސ‹ЅЈЅžž—˜ЃНЂ^dŽ•‰eŽu‹‡žЂŸœ˜ЃЊИЏB?FJGF><;AMIMHMW`+@8?Ѓv„œ…™Žwg—УБЉЁ™˜™˜›žž{ЂЄŒˆ…‚„Œ‘œЅЄœžžЅЊЏБGJOWUTMAHFGGIA@@I2O[|œЏ|3?m”‘œИЛЊМАЃ—œЃЂ››ЊЈЇЖ”ВЋŒnŠ—œžЂœ™˜—˜ЉЏHHFEHPC>AAGJPHIJ>+HЋ•‘–i…›™‡[}ЃЕВОЂЈЈЅžЂœiˆŒ‚Š‡‰”•˜›˜ЄŠ™ЋУАF@CHC>??HFLGEJLI9GqЇЛwVW`z’Ÿ’ŽrŸТЖФŸЂЂЈЇЃЄЇ•’ЏЇcqo‰‹”•—Є™ЁЇРШКЕ>9C<B@>24>*BV›ЧБŸЄ…‹••’–”›ЎИЎЌЈЉЇЁ—–‘Ž‹‘ЈЉЅЗК‘{ƒ‚—ЇжгЛИБАЖНФC:0-1-85,+M`Œ™›˜›˜‰‰Œ’”–˜˜ЁžЈЇЈЈЇЂœž˜”˜‡…rv’ЗrƒЄЎЁЈЖЭКЕЖЕДМЦО<77472<@,.zЄžŸ•rŠƒ‹‹ˆ•˜›ŸЂЄŸЁ˜••›•–˜–‹‹€Ы~’˜‚ˆˆŸ–™ŒžКЖЖБЏЏлуС9;578>A?4]œЕЇЇЛЗp‰ЋЇ——˜—™žЈЋЋЄЁЁŸЁžœ™œœ’‡‘•Ž‹ŽŠ‚™˜œ˜ВИЗЗЏЋŸЋЪм:$5188"0ЉхИЋЂЊ›˜ЎЋžœ›ŸŸЄЅЃЄЁ›Ёœ™•‘–——•‘–”˜’•”–—–˜’ЅЗКздОБЊЕОС~T0-4?)%jлШБСН•qwo[kЂœ˜–—Є–›ŸЅЉЄŸ–””’•—‘Ž—ŽŒ˜ЁЁЉЅЮйШЦЗДЕСТРgQ&59E{ШСМŸ›…‡„’™А—‘‹Œ”•™ЁЃ™™œ™ž—Žˆ‡‹ƒ…‰‹›ŽœЁ‘СмФЛИАБДЉ‚J8(;B2jБОМФБ‹zox‚‚~‰Ž’ˆ‰Ž˜˜›œ‘••ЁЁЉ•‹t[`‰–Œ‹…gb‡‹‡ЇИУЦТОЕАЎАД\>7938UœаЩЊА—njq‰‡Ѓ–ŽˆŠŽŒ‹…–ŸЅЇЁŸ›А~ŒУйеА™’——Ž”ЃЕЖЕЗМКОФССМИЛ)+>C”УЛАЅЁ••ЉЈЧШ‘{”Œ‘–”–˜žЃž•{„…‰r„›”kY”P\v‰‰ЉЏДЕЖЖ€ЧДЖЗСТЧЄGN8>TЄЦОЏЊЃ™‘rNZžЌŒŠŠ‡‡Š–•œžЄЌНЎЄЊ–Œ‡dŠrZzˆŒœЅŸЈŸЊЊЏЎЖДЖКИЖЛОЕEG1#G‹ДДЋЉЇŸ™—Šƒn~˜„„‚ŽŒ–›ЂЊЄ–ސƒ…v—ŠœИœ›ЁŸЉЇЌБЏВБЛСНЗВЋЏЉEGJ2rМЧДЉЈЂЄЈЊ•—Œ‡Ž‰„vz„Ž‘ŒД‰–›ŸŸ‘ƒage‹˜ЌЄ~|•ЄŸˆКЖДЈЉЎДЕВЎАЎЂ41)7ЅгФЋЃЁЄ™•Ž„r|ƒ‚‹…„}jp?>PY`‰™БЃž„Z`k—v—’‰ЕЂЅˆОЕЉЄЅЄЊЌЈЈЊЇЁ%<3~ЩУЄŸœ›˜‘”™„~„„ƒ„ƒŠЕЇДЯЋjmЉž›žžŒe‹ueŒ˜žЂЊЈЄЁЭВЉЅЇЉЉЏЋЉЄЃž9ZЄЏЗЏЉЃЂЈˆ‰ƒŽТА—™›ju|™—žЗЏ™Œ’~–’–›Єˆ‚…œ…˜ЦЈЃЂЂЉЌАЎЎБДЖЗЎЎЊŸ’:—ДЕЌЄœ—”ЎdrWŠРЋˆrxjŠЌ‡Q[™Аœ—Џ›qQw|t•k4™ЃЃЅЊЏВЏВЕВЖЕБДЏЈ–)dЛИЖЄ™‘zjz—‹zm]LTH:N•vx’‘‰ЂžŽu—vkŠˆ‹•Д”˜ЅЄЃЉЎЖЗДДЛЗИИЖТЎƒ˜FЉЦЕ؜‘’™СФœ…‚‰~ŒntpŽ–‰ЊДЏ›™Є}‹Š]xg—„ЄОеК•ЂЅ‰ЏИЗДДЖЛОИНТЎ‘ЃалТА•ŸЌ‚p}tYewg…hz~[a”Ї‡‰‡gŒ‹igozmvei{m‡ЃБЖБСзЛААЗЖМžА™—ЕЦеВЊЈЇŸ}qQTLOwЅЉ…}„ttƒ™~–•ЄЎЕЌЌА}[xt|p|ЏЃ‡ƒ›•ЏНТМЇЧцуЄžЃ—œ™€„r`YV`|ШЦБЁ˜‡УбЊrЊЕЃw|ЄZBOU$@?O[]Wb\WU[SSQUW[ZV?9ZТг—‹ƒ…—”vo‚pnžСеаЗЇЄ–rДыЭoM‰•ЏУ˜Œž~TLIBF8?Pzu^`YQYZ^Z^U\YUQ5FZ•РКžw{{|qP\”ЊИаЖРЌЌМЌ‚˜ТЈn[kЁЅ”ŠnVInЃЋЇ›‹woghkopoЪБЌЌЎЋЏОаЪЌЈБВАЈЉЯЋ—qbdU7VHFNPU\]begkvnhZ^T\TPNGAM]e`NUWgnnh]UeWWO9AUr…ЇМ›tcbPjgkowuxЩЖЅЇЉЎЁЅЋБЇ›˜›ЃВТЉZ9SGA>GGFIMWYYQY^cde^WYVWBYi{rcm|‚zkvo}SZZdqzКФРЖЅ™˜ЄЋЏЅ›’›Ё–ЯУˆ@4MJAJB?;FMT`Y\`ee\[ZQTbiIP~}xrru{x„„|}WOguМЯжЫаЕ„™˜›œ’„‹™ЅЎ‰`A;>H@@GGJNUojb\aiaUSTF8O]UzŽˆzzvwvoq{—…o—‘”ВЖДРСЕ•‡‡Ž™—‹ŠЄm.585F<@FLUrirgeca^\SWSQ58>Ap˜‘|poku„|~utt‚ˆ•‡ˆЛЃЗЪДŸŒ™ŸЎЅžžV,@B9AENV[^Zcgemec]UOFMCH^a}|ž‘„{xtj{vvpnp‹„pWЏ›—|›МЌ™ŒŠžu^:-73:4<3J[hbejecbZW`TOUNTc‚ˆuƒ‹‘‡}td`emtidpxxq[^ŽƒŒ‹—ЄЎЃ–…”…oZA8?C8A7,@S\ckrhdd^a^\UTBG\z‰z|{|zvonjkr{|u~„‰•W‰˜ЎЉ‘ЎМИ–ƒ‰ЁŽN?B:?BIA3*FwemjghWWY]VNWI7oЅ•„vˆ‚|rtwv~|v}w~„‡Œ‚~ЅННЧЧ€PмаЇЃƒ\90?WFB@.:BIOIYGLTWZ^Z[WPWTPQ\atЈРК›}bdgcegiprvv|…~x[VY\Imqmitwz›Ѓ‹…™ŽF*LFHTQ\\cbgZY[\W\WUNO29tЊЎŒztprnihYjihpuqrvque\cnvuor}‚МВj@88>JTEFI[ac`^Yab^TSLL<>9Lx‡‡tx}…„wn„„xjcbp~{{p\i^CVbkr‡…‚ўНmS:1;F::;Nmebvjqppz‚„tg]x’›‚tgqadebghc\[g|d^^Yc5MZUJJHFU\cWW[e‰hNUTAEZp`bN\\Y^bLu{vidaiair<:erFWgTcbM>ZeЁqje`^\bgrStuYQMLYO[donkkqnw}…QVWa^^VWU\\^[UUPWBN^^quOAZSew’{ˆ‚hbitucaevkw|\|z\8VV`jjѕdg`anJMUU\\€№SOQ[`[^UVI9Lnq\[jEZa\L-L|Š~‡iaewwjni`[8VcNc[S[Wce]^[Z`t‘ˆSLJSS`PSV[YVY[^]COkˆ‹G,,8PWmgbBzŒŠ’eaorxouoj`Zwu:E;NUV`cWcnm‹ˆ‚G@HMOP`edcV\S]YAJЇ•h\ZFS^Waa]Qˆvtpz‚rchdZ\NU0 Ea[VUZmkmgte…Š„MHNIP[WaY\]]`mhmbozpZBE^pqWhbjouponhkt}vtoaboŠhqPPZa\Z``V\T…~‡MIIPVYYWY]`bajm[e„rVUYZb]vxwtworggpcewpruWWQojE>^Š~vaYaa\Zm|‡vUCHMMV\WMQHYbaeUWmkcYZW[jp{|YLcnwqrbbgijt{h]pT(Z‚xvu\zƒ‡‹{zq5HLa`^`ZVGC?;I`ouoa[TTYipgPNYVepmn`cbc]\]ke‡he]iqBVb„jUm‚ˆŠ{…z|IO]od^T^SSLG\’‡odS.HWiZ`VO`cba`eedVZkb]^WQagkS,$ieCOz{„™—z}ŠeUYaVWSNLOCGY’Ÿ}hTPOS[Z?QJOJ^jeggmUUT[^VZ`gqqhL:JAQkV…Ѓ—…q~ƒ›UUTWW`WPAOkvatЄ‘„~‡{Š”OHJFJJBMC<~•opeaCJMNO\[hjdhbiwtmb\]YW\\[VWWVHM`MQUjtbSe‡~xnЖΘNMBEHLJMMPOPQWYGMa\ZohTT]`ikkOV?2)NPVLN53FZHrŠ‘›—Šˆu‹‰mVCG>8Ev›|^33ENPocYUMSV^Gdq}vmecvZF\‰œ™r\hd`]U^o}n…„‰””Є••ƒ?1@-LFt•‹~nm\eokŽ˜Y?I[]a\VYknnpkGJFVWAYhU+!gN-AGPw‹ŠŠˆw}…‘”tS^B?Iz’Š{re^^? #nvZOOYPFLV`^]a{‰zpncaY0OE.IMOgoeqho‚‹‹€‡‰‡’•‹…MJ3!?k‰‰tpneamPI8IgSQTPFQQUCaY^qii^IOHNJ?dPi‡p^[punx„‡w‚‰Žˆ~{txHGN+ZŽ•ƒzrnijxYWTMYVHLJOW``]zZP\odbcWM(1EkxkM9VtkYƒˆpv~„}xzzv|94!3ŠЂЁzoi]b^ZI:9IHTTVN75 1.^p‚pcnN#0:i`>eQUYibNˆˆ|puow‚xo{xc.@*gЁ”{id`^]VbhMEB@FBMV}eEЃx1;^jkm``kY0\G-V]Zdrjmgž”zjmq{zqwod$3S‚}Ž{roduaJVIV~Sbc3FGhbbƒt]P`@V^bkrv^GIiITŒdirxj~|uwˆŠ„…pY8w|ˆzmb[Wpb-G#PrP:@8T|M"7r{z[ai}mHICCQFc< MZjktu‡„xƒŒ{zˆˆq^S„‡Šwb`WaLAFaQFA.-$cHE`TJkteAh]H:W\Yiabdr`jtgx…„zƒz‚‚|ˆŽxYj5…‚…dacY]‡•`WFLUZGMA<7QZSp„wkqxPP\*8\B0hPn„›vY`c\|‡„‚‚ˆ˜‡‡u?W~ЉА–w`iuI3833@$@E0C9&(W}VSO,J5YC+#(9,8FB,#A4Qgu~‚ŠЉ‹z{‚‹’ketYIhŠŒЌ~rrnpUI#)9r{Z;HB9GoFT^xk~rktEEEP:@@<~zWIWbaw‹—|œЭЮ~hmZUYdџ€9G^ortkaddciqaVLJMNN^ghZ[UUaoq`SPnc? 03$%#2?5-:9^iginmh\cdUQakmj\a[N^dcCCEG)VN[a^UT[eh`d`]VA ..,+27-S`ˆŽ{{mrvkq[^\a[ZQ^bdoupjMQ\>Vthbjdd[cc[\^`PJL# -19315A51(37^wД—rhV^mnq]^hutqnpmkjckriakpjhdicZJTTUQ]chq> "-$(29*@Zc’~ONZYJ>dheehe[akdZ[dvpgapwxpibhbMOZbOSMHmb ($!!((EGGB!BJZqt>U[JGTPqpmtjb[Wa[Yqwoqonwxuqwz]^^dYP^j~gP,.8*$,:WMPIAAp‡‡‰‰‡ƒg[SIiqtohhnenomqpd{|}{onh]OZiN-CPVSC&2  O@8#4UNMH5Gkktptqo[PmZQu{dVSheUqzibjz{wqqgg`V\^gq\V}h+) .((0>:4NechknwcEP?3nmeYbc[\jehcW[w~}w}zun]WTPG.eo; 8+*84((>C<7>.!w‹hurmm™rzcMVovoVY`inoimu}z||z}|utqjSOWk^`e}}9.9((43+A?843[~…qWaUY[}V!EOqo`UPhvpZbkinzuor{zpG%JH;@Yh‹t €*4"("$:CFBB,-&`{ebc4CCF4HMae\^akjg]anvwvptrgbaB:7J03NYr„^$2+%#CE@;>%%IuŒvmqh`^TciMCcckgqmdZSQP`jjntquzƒ~`08QUGB[[L !*%:9AGHHa@7twV\brmUTJdaOHxn^\ijaid^noedihaitwwa[UQC;BIN3%2;G<.hW~QYcij\Y\N[a\U][icQGZbgegh\Y^cje`[H@PJ-:ALaoM +%""! 2BF8,N‚|jF*P]]OVZg`MNjgmTJ]i^bqodivv€cnjg[^SA%3L?Oj> "-%%-EC3MaME5+]w…jIN[T[YVNOY^Ucmmpp^eidb[ibgdmibUS97C;>HW^ *-3!%7FOIIHH32SSBP[`Y\^Z;MGCoj}zzvtgme^biaorr–„qJFT\ci;G^ *)$02%E@9BGC.(%OUeb]‹t8ba^I)ZB&a`\g`Q[gdihZ]]t|…hU`ngZMG9-E(WHC?B80:3}ajbBP?OSb]EjhigYV]jmoYdcjuv{r\nkYOTC9J%8)*9?HLC0:gpzn\M‚]HLE^1F"^]aYWcdpkoneagmkmm;G;-1QF:W3#$.7B<7%,P}ƒjSYaehSZ^`%qzrjauiYeF(NZO2:LVprYVcko`YWYMY]NMB>HPod:#)"$377EE3%?GB(O˜„{qqГvj\LN2FOJ@HNdeZ\^[SaZiojb\TaF5TjY)^U""!&+$(79+-4--BSРК’mZBObgIPPAWP?:@FLWW€•oxo\Hw}zrdeh}ˆ]>F\A?" +92&2*:,H@x˜z`HHr‡ePU<@O``VNPa`Zjr{thSc—ohqUQYetn[aƒpO +*%*887<8:0+UccuO8oi]JQW>dWQZg|aunv|i`ZGWxxmWnQ;I\QOOZd[nB*-,A4.07733&>OQq‚gcUJWmq|nQ"`TŽzŽzA#&@hwvhUWPJAM*OQdBNO%40&0:2@@:3!0-08GC<88")J~‹odWecghoQ>:‚{ŒЎŒJEzni`TZ^\imQNUZZ]*$Ad^dYG#$%7?EG@:]PB []qiUSLh•Ÿ‡o`[^OI>7#4!GZ@--Scd?%&;LCE?H37r{ru{v <<,ITLc2NeQg^[ShtzvjWmh][\TM9;8$#7?:5I"$:GF<7-jQeWZkz‰ƒ„wZSGI&ZOHP7T39%4BB@EF<3*#,)Fjx]ZgjkU$+TV&(G-I-d[Mjp{ƒ~hPL?1SH7MWG\74$41(7&(@€§eZm‚|‡}r|]++VCEG@24H70>949<553 OObHJB&gN89gj* O:E?FF4Ckqtg^WGTwL>PHGFC>TUrn$!"&5:?FIE18*,1Y‹‡ƒE1HSQG9ebtzZVP>WNgbjem\;JWJESPH;0`qhcG#-)+88?GJIFE<)Yktthh^i{YSZh4C`h;< 3kcv}nj``^G95G, ES[}U($1411."<,EHHC>%Hwœƒ‚\T[o|^detWJ%LO€0*pir…ƒYihqc@:NFPT8Qk„I"$)*-2>@4.3@-.7d}‚Z$WV^m7g{gNJ 0"G)‚ƒkgnIGQO97Ow@,)A0TLj$ +84750"-GCF]НЅwVSIIVUbALH[;2@:9 ]‚ptkeWcuC; 71:MbB($% &&!:*4NШжŒQ9;EAPQOEQ^\+*1>v}gY[akˆg`bG`Z5TUJQCE""(3+05&%5##qqk@CGAA#QmnCV2MJJC%r›ˆB27WYHLL;PdgSWQ[bS :@73$&!( ?Ѕža33-;SM\ƒpN^;O;[UTQS[V1M$(++,.*) ?x~{‡hU,O[^PUMCNWM,U-+9HBiYGggLQFETJ(* G0)&N[]NVTYWN>;CMMI;#M„{#4>%%(!3A@54!?`}PbcLTW\JT\*QI IP<]095BaFB`OVegYL;Q\TF*7HW2)>7( &2-)1 aƒw]ZVV\YabYJWk#n2MNTFIP@g`g[WJZUN?\cƒoQC:}G7JGp”SaE %[$: ]cZEBNH8:FU{YG+".MQ3;CdEOP|‰^IehbƒuYV[eƒ}9)# +!1)J‹ƒYCF>1YM•ŒHHS#^~nI;EQLjEBt’t>CGibCBCJz[#  $ *,!0q…Q!CJYNaqV€H4LhgvJJMY7c; ,()!9@TqM1MC.5TULHgOhTTZieF;)YE\|?t‘ˆwvdeQLZ`kpTV]>h[F8I`c^”‹WQVCLU"T}xiN #  ,3-"A™™z`1IxB?>0aSn B*bGN]Tg`b„jNa2@@30MohrmP%LJ!0,)M`ogb;epUa[P%>]NS-TOe`]e\E47EB8Lr\bYM+!-2() ,0HIae$3^jk`qk VC|cVxЋWBqxW`JњžЁЕОЕДД€~ЕВБЋЌЄŸž˜—œЏЋЏДЎЌЌБКЖЎЌЏИЅ~M14$$(17<82;BJSQNiœВЌЏЏЎЇЅЂžœЃЋЌЎЋЌЎЎВБЏЉ—ދޙx›ЈЇЏАЎЈЌБДВЌЈЈm@$#+2494418CFEMI2S‘БпЫВЈžžЅЏЗЊЊЌЎВЎДЖИВЏААБЏЇЕЦУАЌЋААЌЌЉЉЃЄЃЃАЋg;%"-05<<937@@BEG2e—ЇЦИ‡Œžœ”ЉЎЎЏЌЎЋАДЖАЊВЕЗБВЗОНЗББДЌЈЇЋЇЅžŸЇК˜7-#8;8>;575@MLNN9?q•ЁЖЎž›œ˜•–ЕЗЕВДЎЎЏЏЌВЖМННТСООЕБВЖАЊЈЌЇЄЅЁДО•kL2.$>B<95FcZZYUcЅЮгЮШЪММЇЁ˜’ЛНЗДБВВєЕЛМЗЗИФШЦТЛВВ€ŸЎЌЊЊ……”ЄNB*(+)aH>?@[PUVFrЇЖЕЖЖЗЗЁ‘Лž‘НЗЏЃЈЊЎЕЖЛСКЎЊЖСЦРНЗЗВЋЇЊЎРЖ—hЄЫ•GH?%(.$%4>79CFG1&vРЋЋЈЌДВЉ‡Žƒ—ЛДЋЉЊЊЇЉЏЗИИБАЗФФУНКИВЋЂЄЉœxPpЖРm,LB734>>A;@BEBCBBFЌгАА€ђВАБАШЌ™™НМЕЎЅЅЉЌЌБИРЛКМКЗРУСОРБЃЉЋЗЊЇЌЦЖNABA;519B?HHCCBA3IЃаЩВЂЋЃŸ›ЧЂt—™МЕЌЁЁЌИЗВАЗНСОЕЎЗМЧаС”~—™˜–™ДдЊ1-4O;7,7>BMLGJP@.QЃЩЧБЉЅŸ•ˆŠrŽ’БЌЏЋЏАВЎЊЌБЗОНКЕЗКВЈ•…Ž’™—•ЂРЩŠ(.(059<>GIMHPQ:@|ЛШДЖОАЄЁЊВ˜‘ЃЋЊВЕЗАЊЅЄАВДЖЖЕЕИКЩЧЃ|–›™™ЈЇ’J)7702379SELOLUoOVЋБœЌЏЌЇŸЄЂЅЁŒББЌЌЏБДЏЌЋЎЏЌЈЊЌЕЛМШЩЇœ—•–•‘—p3F,45-)+(,8LHHB}mŸО‘ЁЃЈЈЃ—‘™ЁЅЂЃЋЉЇЅЅЉЏВАДЏЌЌЋЏБДВЉЂ—›•—Ž‘˜ЅЅh&27>84211CNCAB`ЗМЈŒ™›—’˜Ÿ›–АБЌЌЉЇЊЏЎЌАЌАЖЛИЖАЏЋЌ‘–’Ž–˜ЧЃ[:)5:?;:;JJCQgTNCAuНЪБ‘›œœ–‘–žЅžœАЗФЕДБДЌЎЌЈЇЊВЕЗЕЖЊ™…Š‘ЅЊa$(03;?;-9>ENNP€іVAOŽЅŠžЁЁŸЃЂ››‘™œЕВНЦФРОЕБЌЋЌЏЎАДИСрбК—ЁЃЁЌ”—ЃM)5<>@?723MCEFNILC?|™ЌЈЎЯЖxЃЌЋ–Ё›БЏДЌЋЎЌЇЌЌЉЄЃЏКРТРИЅЁЈЋЂ˜–‰741..2(.7cLBCAF;3:8;VgжыЯЉŠЇЉЌ––›’‘‘’–›ЁЃЈЎЕЖЏЂˆОЫИВАЎЎТЦЄƒp–Ј’—q9&089>837:878@97MT•ЭРЃ‚ЗШЇЁ–›˜˜™ž˜ЁЇЅЌАЕЕБЏ”ЉндЗЕТœЃЇЛРВЄЅМЁœi.%347128;C?8@>9B97ЂЉЕ›ЎЉЄЄ”‘Ѓ’–ŸКЧЎВИКСЕЋЅŒЁЧЛВŸЛЃ››œ™ЂŸœŸВk#9;72-8>?;9?<@>?CC€№F9?pТЪЖЊЌЋЋЇЉЗž‘ООдюЮ”‰ЗВЊЋЇŸЃЌЏЈЊЈЂŸ›Њ~ˆЋЄЌЃ’Y+:25-0.ABILBACEHFLЅШЌЌЉЄЄБТБЌŒ˜Ѕ‹НнЇˆЃДБЊЄЄ–œЊЈŽŸŸЄЃЅЋ‰’‡ЎЌБЋM&0kkA+&,BQQMPNJ5HЦЧЌДЋˆ{p™ŒSJ…e[ŸЏh;UБЈЃ—ДехЩЕЄЇЁЂ„Ž{p™Ј…7)C?ZvjA4?GCHIQM@FЛТЗКЩКa{Œ–’ŠЊ‡œБЁg:IЊžœ–ЏЗТНБЋВЌЊ˜—˜•–‘ŠŽœ}1&G-?S:*?GNG?>FOFVЏЛЊЎШЇIŒ˜‘—ЏММЁЋ›БЂЌЂЁАРЯУЫРЄЃž’rpЄ–™–ЁŸn723@CGIFFEBAHBBuЗФЅЁБДАЈˆ—’Њ›w…–ŒHoœЎЇЏМТУФЏ˜Š‘Žuu—•’–œЈ•k8,3<:;;@>CECAHMONF‰ЛНž™—ЂЂŽ{nM[|\GUdoЊžДЪлЦЩУЛСЎ}uЃˆŠ‘••ˆzA;44BCA?:28)co–ЭРŠ‘ŽЁ”Ÿ‘„ЇЉ{tЅŽ‹v‘ž•n‘ЕРДВЇž’ЄС•™™›’’”–ŽžБ™B(5178:?HNSM:>F>50.3AABESVWW9cКкЮЫ—ЈЉЌЋЎЃЇКœ‘‚Ђ”VQ~|НКЛМСŸЌЏИЈ’•’™–ŽƒZm•БРn8@>349:>HH?BHGL;ZняЧœ‡ˆŽŠ—›NQ|ŒŸЅ™…}}……‰ЗНЎŸЅЇЌаЎЅЏЁБЇ‰œ‹˜˜E05:9?B>:893:VC*BЈИž‰…‰ŠpЕВ•ЅƒhvESŒ‘‰ŠtЖкТ‡~ЄŸž‘œЂЁЂЄ—–•Њ–?+AFEAC71141-5?4+ZмйЊŒ‚”ž’ЈШИ•Њ””m?ЁцИУЊЉДЉИОБЪВ”ЂЈЃ‹›‹ƒ‹‰–ВнКЁНБЄЅ—”‰bžВ–•Ž’›œЂ@434957:?C8455;59dЕИЗЕ•œ™ЂЇЈАЏœЂ˜iŒˆŒŒˆЯДŽЦЌЅЊ˜›Ž„ƒŒЅ››—~‘|V(%19><;;8<@;B?>%)ZВЧИЪЌ—ЇЃЇЇЃЂƒ’ž™‰ЁŒƒ‰Њ’‚ЂЂЃЄ–•””ЁЁЅЃЖЫЄP$415<@FBB@@>B>->gЗНЕВЏТЌЎЏЈЂЂЖЖВУ[e|…ŸŠtЉ‡Œ•Ÿ™‚‹’‡›ЌŸ—›œИ”-,78??77:?EJMHCB.HaЉДЉЈЄЉЇЄЂŸ™Ž@3ƒno{Ž‚wS”Ђ›žŸЈЇЃ›‚ˆ‘‘…‚t–ЪЃ<)F@<@:45@GEHB@!&–жНЈЇœЁЂЁЉЅŸЈВ`bА‹Œ—••–”‘ЎЎЋЈžЇЁЇœ––™ŸБЊЖСОuM&;>:>83:@HCA>@7)jУцСŒŽŽ—™ЁЇЂ’{Їzrwž‹‡Š…”•‰ЃЂЅЋЊЈЉЊМ™‹ŠŠ™’АЄžˆO-9GBB€f>:>BH@4:+>—ЅЧЇo|‘‘•ЈЏŸ’–ŸUV•ˆƒ…–ŸЄЁŸЁЂЇœ™‚‘Ž”…‰ЂžЂЉwn\-+17;>E?:954,@ЊЄЈЌ–‘—ЕАЖаРЇœ9>B?FQhУЮЅ~ˆ‹‰’‚Ђ™аНŒ›Ђ‡ЈТД—‰k™ž”ЏŽbЛкВ””m—ИЂ„•‹ЂЗ„A"%).4-.*,7?@?@C[МСœmŠƒ”›ЌИ˜\O-# NkWhАЁТАЮгЏq[uЈВ„…’’™F*980.%),+*3;>;8)O[О™‰‘ˆŒ—™œ™ŽЏЇ›’Ё|БИ›‚r™ЁУ‚ВзЭЧТБЄ™ЄiTxЇРгИ;O.&&$(#,97>EA?.EСсЗЅЃ|Š•›—˜——ЇЈОС›ЂЈ›—}œЋЃžЪС›—Є•ЄiaœЧЛЎp&.(*+1533,+02JHH3YечМЎ}cŒЛ•–ŸЌobjŸРZ<ˆvЂЁ——ЂžВЈЩА–žˆ–Œt‹АЈВЈz<0a^*,49922:8E9F;SŒДЗЌЋШЃžЊЋ›ˆ„dGud‘ŸŽQzœœЅБЄЈ‰wpŽЉ‹ŒЛЇЌ›v>*>A4;39@@-.3(2IJg}ЄЕxv‡ЃАОЌЕЊhVk–‘ЛДЋжŸŠЛУЊЌшivƒ…~~{‚}z{tjihb]bwwvvrr€2z‡‚ttr…{TA%-,.*?NGM;CAHJIITt‡{z{rkrjdpxzxxuwuqv|za[\VNAgazutpe|ƒ{vnrunV918B?>@9JNQYG<1ez–›‹ˆ‚„„ƒnvvwjkdmr}ˆŠ~bhrZhƒqrƒ}{rvrutnbebH$1GEJBINSUUPM.Ek‰ЮВ…xgex|ƒmpu~‰„‚ƒ{rx}rv–ˆx|wrpjmmhhqv{ƒT2-)8<Urod^PZƒ•œЃ˜œ‹wogY~‡‰w‚~u~‹ˆ~Œ–’Š‚~‚vtqwtHIceqLBA)(-&7kOSMProedBY{ƒ„‹…m\}j[Š’|ojxt‚”‹Šzw}”’Œƒƒ}xqqm|‚‚k3jwGL4*75*+GCLVV^T8$gwvxz„„w`bMU‰„nqu{nkw„~~vtˆ•ŒŒŽŒˆ~n`ovbF@ŠP*F<:03GIJNJTWZVUIEЃ{„‚…„ŒrZiƒŠƒvtqpxƒ|‚€A‹––’‹„xinuqouŽL":GFB+EMLWQTbSPJ-4p”˜|oxhd`Œh@SiŽƒvhgxŽŠuv~‡’…~ƒ‡•›‡]Fcg\Ic}žŒ)!0VF@JCISZab[[M2;uŒw}{hVQTBM\^zutwuxxr……}mZOV[^V]e‰p(8B@IGOQ^^\][:9W‹™ˆzŒ}xio{x`Vjvx|‡‡wuihozz}~„ˆŠ™‘rHZa[]bqnc>7571@@I]U`ab^{QP…ŠarmzrmcivodY‰ow{z{}uw„uwu‚~~„–wgmdQW[\]Q%B)8<.24B98J][cI}m•Ёdktke`aenrjevzxoiexzvvrmwxx€Яwnd]hg`W\dq~`45GPTFBA]Z`^Z\VC>^btvtЁ‹Uprw`[ge`|}iquupwu|tqcn…‘Ÿ’ƒkkm^gaUa&012@9BAN|dcUVOFNE‘ЏŒ~‡Q#aTa[eobxz||pqv}~‚xtqx„Œ‹oƒxpjnYLOdB)4<:?ANHIQSYd`VMJ\ƒŒ^CU9@\a]`g\V„uxv}~‡}|r|}x…™œk‚}ukcY>Cbc>CB;?ALQYSVQSYd^>Lu‰•ŽrY•jUaduM`B3dvrmzwux~‚~rq|{{„~VES[ULk^H2UkQBAA€LIQ]TTYZ\?E^Ž›|eg|~vikwn8@[rhquw‰‚}r}|vux‡‡gamjcW\]UN+0EIP?BHGG?[e[UUQE?q–‰|jdwio`WOYQ8Lrt|rik{Œ‰|wpotr‹rkpqzjgucjJQTJ8FCNLPU\ZW`O>FQ‹—ˆŒwz‚|exOFbg^NQ]i„‚pov}opjkenhgYZH[bƒr!5TW??MCB4GMP[^OQO[Y52cЅЋ”Ё•…rYSQQ]`[]jvzrzqcgrw~oinnQ1Pmj?Agi&?GHBFJEUPYIVYWG[dЯЩЊtoWmq}`dgVb^VQU][mr}…Žn[Ž‡ƒzx|‹™iQ>ao]dO5%,<>FBHGMVPMWPO\QБuV]•tkaU[^eoeegutt~Š„…v^uЎŸ~Šcdi‡{jn‘}^<"031?;FQTSPPTUAC.epwŠ[M|~mid^[ob`k}”wŠˆ‰•|}mYg‰~h}dZejki]kmt~Y8F?9AGOWNVO[ST?Sag‚˜tjc`p}|މe.1AtkЈ”Ј—W:HU}ŠŠ}bb[UaaSdhjWUdEFJCABHE?QZZVYa?^t„„||ui^covub7jwzkpk•’—r\gee‚…xrc`T]OSNHoj]PP5%!03>HAIOSVQTPTFE^‘˜}{pzvzt„hOEАœО›UUއwrjpmw{|icknhvEQQtpupd>$4G88@LGY[]a[[WWOVŸkvhmp|…uvY]`QŽЉpUvƒ}vxj^evtQ^c`egqYOM|o‚vW2ziH4;?ZedcZ`aAC›wƒwPO2JdW U#!hn#‚‚eZ^{ЅИžƒpmvi[SJJL8C^jJ)IIe„ŸNNST[[€њ^hFJˆ‰Œ…‹‰7GUO]a[rI^w`0zoiew‰ŠŽzwuxmib]ZNOI>VU03N4!I]E?QW`[SMSgLJƒto‘pdgY[]~‚~eqE[vhutiz‚Ÿ”œŠqkiT8?Gtgdg]mcP!4:.?MVZVZVYWNLFC[Žre~w…xNM[xoENSI5`Zqp`xƒ’–vcVV[A?c[Qab`oYT@0W{„„…qgYo‡[c]b\SZWebvC+>@BNMNU``aWWNJ9UuЁ–•Z@ceeZZx„Œk^14GgUh[xx‚wthShd`]ih^TTh„t}Y92VTIIGM[\hdY\S@,?i‹Ž}zz…kgarQZo{PQ1$S:|w‹•ˆwnnZ1MMLVYE7^hn’b@HPEHCLEPSWUgdaZ>^ЎŸien„moqˆdZF^](JM‰ˆ’•g~v|ZS[WbeI!2d‚‘b:@CJPNJJIOWSTSY:EuЂ‘—oJihk}Gu‡u]]()*,CFJEHSFCF@AAVM%?‚ŒnNWTQP3c‡YtG$7 VVUQEˆД›PMbmocbb^iz{c\`brq:#O[SJIEG?@H7;>4,SЖБpQPPFhSnƒ\pS\@Tp][zчТ…kop\`b`][\eaHMdpvrCIA;Ёж’•ujt{ˆŽz•‹]rkjPaIFOQ`}НŽv‹o}oe]YA,gxn`V^bZuE2>FJI5GJJN5?;;AFEG2)QŽ™x]ZYkquheM\geUhA@EYT[u^Htvki^]iW^[ZcnrŠŸ‚J&4?FM>3@IYJUSJ8^„’amxmdodcbtMcU2 ^aNiOLS[p[utqb|vvaQ\ihpI3JneM2@MJH?G%;BITLJB#(ЉŽzujnucjqtcrz&3‡Nb]bTYcSvpteemcunjVQgp‰…’˜rO(JQG@?29GHII€žF3&[–ЋŠYTaU\cmk]Em9EI^UTFMQ]Mhbuw{qiv…kTYJF]nmriL2>JOIIH?CLMF85%;x‡ЂxABaUcovo^Qb%#\wjcFOWYcutprmgkOBVYCNVWne`‚^pU-9,CkL@988Q,,nznb^\V[YVe˜x\C%8CgbPHIuOabŠ˜o]|ux‘„gbxƒž‰W<.410:&3TGA?GOJ^ŸoA]PPQOh\˜UbaFn”‚]N1`^UwQ2]ЊƒPZ3]‡uQZTj‹oE-&--498548FAHM??E‹•n4FMYeir^+$ (F(%G\}p‹STvЃ™u0-FutLUbjer@1@4@54%)4>@F@G9HTgŠ\T]QIUecUZz`rbLu@z|^JBq\m‹QŠЃ–••tu[tA.Cu‘ЕЃ>U+*-0-3+1-5@QFG7BЉЊƒqoIQTei^Yh]iu‚‹cudUmcY>`rhqЁžmhg`hr2:dŸ‘…]-+!($5:8<+#,&:NTM;LЇЕ‚tI0^MOY`v@&bƒ%TBke]ggqztUuVdVT>\{xƒ|d7-W\)*A3C?4&+8G;H5E]{eFw•}dnvjQL(7.ej`(Cg\vnuqZMJ5TjSIMƒtzqc?&GF?731M@5*.99SQUbvƒH1"+3,-5IG7N\[^]h}urpq}ВЃŽ|ƒ„”Žuxqooxpx‚O##&!vˆd^WhL2)-Ca^)4Ug\^a]bktmSAt~r[eƒqZ„rr‚‹‚xmbdkjp}‹t;  !uzŠtF.5U,$.9jW]zegaTUNMSV?zŸwOHNWNevŽ”•”tvrvwu•Аtk> )%%$$"[Tui:"1JMQY? J‚jcczxpd`[\[U^z—|xxkkak}—›žzw~~vvŠМЄuu[325#%Q;UvIPabaG871SrhdG]x]L][S]WOoЂŒ‡znY`\oƒЎ•{~‚{{„|‡oqcVB"++:5JHO7:";@3#2MEJYWEMTYT]cct„ƒvtnjnmp~‡Œ|rnux|{x’enjBB30 AB54bi[bhnn^^‚z~}mqri[ZbqŸ”‚vqkw|{r}|{wnu` #!INT]q:#4)*>OST-(Hgh^db`YPYdadqwznqd`YVYr||ƒ~w}{xvwvhruV  VSNPP70SVML; +93Jpkhnx[Y[cn{ˆŽ˜|˜a]dioq|…~tk}{z}|}{h; LEEA{ˆ>;&Zq@\@@;dYETIZ[^a`OIPO]ntqxj`chgnkkokjonruzmb[Zapxrmde\aY]ae]A91ZGI|T((HYM[eg`gm^ZQTPO>@p`]ahthr}{hmodjknbgcaa^]hh`T]^U[`rZ?<"?kB-:ULE,ddWZdkg[W[^Y?J``[OSUo|ˆ}qtwxwtihij^TY[ehbZ\ZNO^}zY CVBQJ #2L>3[^PNIZN*SZ[^OPTZZšmrx„uzx{ot‚xhcc^VZdZ^\emdUZiqEaI-%ECTjTQP]^U^QMWbhhg^knrz{oh^cjujikdV`^`dckmdegdaa]`wEJS3!€й #5U^\ONF5SZNJeoiikq~z~ƒ…rug[bhidZaW`dnvmj[cjmhJv^VO**+7)8EIQPYYVSV[Zdpro`agcwƒŠ……uge]`eZggjppiewqohWYdjqwp^e7%92W3<]x…SNcrpmdehSWYcgH\htp|ƒ~om\toonqohe]U[TV[eb^[^bb^g‰œH8;P`hrNCcdnjibbtbbeI1B‡meUemuqzugbmmjmjgneMJOGHNU^b[YSO:[noOUH;U8]bYS]dc^Zaji`e\A4HxЄ|oxƒwx„m`nmmjnvd@LYY]WMQZ[OLNBNO]^ceTOMVhk?Z]\UMPH`|‹hegnmEapoŒ‡„…vmehuw{xrtqkoi^YSY[OJHV\P39WPYU2Oa [UG4QacUGAU]Skunmjqumap|}wrzqbqƒwtnmvotre]ejiYZWH^gV(H`VG‹eG7 G>.QNIF-Ia\B[a34JUYdcZC?tuejŠoIh]QY^]`hvmZSETjnb`b\\curg*@WL Nk2 HgY^da[PVb`TZY`WVYWNQ]gopigY]Ud^e^Y\e``MPi‚ibggZTgƒccV(]ƒ<,.$3+]]hjUMJPNTSLTMIAQbbijjdd[[^aVN2MWVdiTw>No`djmWncmk`Zu\*Ub]S!C+bUQYNJCCEA7!BOYYgZdhhdncij]UVUchgbQmn*Gb`i`Ydia``gj]B(:OIHJAH ^^CIWNLB]htex^`ZWUYiejmppa]VTJVbZ?BTZOPNc{umz[9Sdam) +e‚Vz}wCP`\N[Z]YgFBJYQSLM\`We^]\mgk$N[F4J]TE}^Y[SWQ`eT}ВmCQWZSJbkjm]NY\^[^MP^N3QHTdWYV[^[OVcZ`c&Z 5G4#>`8(eIEE8ULc`HSE?:HQMPTS`oebYJpqowWPUOSik][\Zihcg]a^b˜ЌC9P)2@? N|‹TPVghYEbSixcGWQMSL)[ngL.Mixzgq]YHBJQWT\`LITaik^hj@]&; 52 V^a\Oja\OHFmtkhabYNCNeothVJ]upijejgZWUTd`bUWad`V^cmpT``Œ`5auS+?N@)F[IMJS\UWZU]^\VIMUdY^jkiJJjp^Q\agk[2NNG?LU]WWTM[VO?GcdbgjQHN\iddjpC(TQ-1+$?>]qiYtpmkm]`ZW[YP;7B9FQLYNbaM@(;A5NgOJ^\^]^dodimoq3NJ7a‰wgFE"BMNWMup~{VaFPA-@GIN\cZm`9*A5>Tg\TWYNUJ]hnmjmh?\4(7`[ZF@ ;L~uieG[\) 3ZPNq[QTb^VHQ&5GHFLVUPZ`[WU]krod]HaŽpiO:8vTFWVYLC2tgccm9%AHY7M55QWYEjgULELE31H@JSLN]ghaL]mrg]cd‹™n7jY(:L2JQY^duVLWPGL<32OLZGT^V^O*S[Q#OIIWOUaidjcSjZgnvVqom\&e‘h+%ZupnOYg`WVgb`ALZNE-EF>0J5QN,BH8^U[h|rh^bZUU#YrQ[V$,Y^`]Y[ZbYAGEEi‚GSPWWP[MLQiZQOJMN[gkpmkuiachda|hF qjrQ4w\;2- Q%LrUG]]эLb^]T[gZPadipc]ejb€чЂ›ŽwjqiStƒzu‹”——›ЄЇЅЅЏЖЗКИДЗРыЮЪШЧЧЫЫЮФЛВЖЕЗДИИСТ‡@<7BB@98;>:ЕШДЄЃЇxzx{‰ЉЊ„ŒЅЗЂŸЁžЂБЈ’МЗЗžЅТАЈШРУШЫЧИВАЋЋЊЏЗЩФЏg-->>A42403ЛКаЖŠv–zz]^•ЗЅЕЎЎЋЈœŸžœ|ДкД‰ŒžЌИЮЪЭЪБЕЖККНЖЭьаЖЃV*<@?;<>;ЇЄНДziސ••‹…c—ЮЏЌДЗЛЕБЇЂЃЃЄŸКжЩРОНЉЅЁЊМЪамЗОТУУССЩёжЛЕ‚O;?FEEA@”…ЂЛ•˜ЇЄŸ••xŒИЗЊЇЖЂŸЇЃЃЁЃ—ЖзЦТРЖАЈЏВЩпдаЭФФЦСНЧСМЗЎЃ|L138FH<@:ŠŠŸŽI.Zwm‡ˆˆtp‚•œ—ЁœŸžЉЇЃžЄЉВЫРКЛЗЕАЏВЖТЮЮЫТРОНОСМРгЧКК™M0-<;241‹Ž™ng~wx‚ŒŒ‹Ž{ЉЃЈЉБЏЄŸЇТКИЖОМИВЎЌЌКФйЪФСНМНТРОНСФНКИ‹>7A;142‘’ЂВqˆ‰o‡‰˜–‘ŒЏБЎЊЎЋЅЃЋБДВЕНООКЕЌЊ›БСТСТНОСРОТСОЎБА•@).9021™•”–|\‚”’”•”˜Š‰zt”ИБЕЖЧЇЂЇДЌРаЫЦЩжИВЎЏБВИРУТНМЛСРУЦЧСЧРЌk70)-47›Žƒ”ЫЭ…|”‡˜МЉcqЂДЋВОЕДДЉ‰‡˜ЊЃЁЪШЦУЭМВАЕЖЕМРЦСКЗИКЛННРМЎЋЄ—I31515Œˆ]h‡Ћ‚kraV…ЛЊ’АЈЇЄЉЅИЄ|nrŒЅЖЛНЗЛЛНМЖЕЎЕЛССОЖДБЖЗИЗКВ—œМУ~B?F-8‹ŒЁЁˆb{Š‘АЦДЌЏЎЊŽx•ИЏЃ‘’Žx’ЋАВВМСЦТЗЗДБЗКРТКБЌАЕЕНССЖЊДЦ›TCG8‹~‘Ћœ‘vgdx•ЇžЕОЋЃ’—ЏЇЂ——ŸАЋЧЗДКОФТНЖЖЕЖДКРРИКННЛМЛНЛЕББКpBG]JœЃ]||ŠˆŠ›˜qŽЅЃ˜˜ЇЉЌАЎЊЇЉЈАВЏБЛОНКДБАЕЛКЖВЋВМСРРЗКЗБЋЊВЕЖˆUUYŸР’Ѓˆj‡ŒЎ’›•œœЃЅЅŸ›˜›”ЇБДЖВАЈЉЎБВЗМЛЖЖДЖНРКЕЎЅЈЏЗМНКЗЎЌЉЉЈЌЎWTLžŽuН”h”™˜œЄЋЌЌЊЇЁЂžЁЇ‰ŒНБЉЇЌМЎЕЛНСЛЗЗ€№ДЕЎЇЈЇЊБВДЌЄЃЇЊЉЋЗžh<0‡‡hŠЕ‰|‹ЄЂ„ЄЌЌЈЋЌЈЅŸЃЅœ™˜ŸЅŸŸЃЏМОФТСРННМЗДБЊЃЁЄЋЎЏЊЄЂЅЃЁЄМР35˜Ÿ—”dh~›Œ[k™ž—–›—”Ÿ›Ђ™—ŸЃЈЅЁЈЕРММЕЖЗРОРМЛЗЖВЊЅЈЇЊЌБЋЎЎЋЅЁžЕЖ^3˜ДЇuTcxŽ„rJ\ŠЌАŸž›œ›™•–ЎЋЌЈЋЊБЕККЖААБВЏЏБВААЈЇЉЈЏДЕБЎЎАЌЅЄЎФz5‘Є‘j4<]vu]S\e…ЁЄЄŸ™›Ё˜›‡‘ДД€™ЏАЗМНТЦУСООЎЉЈЎЎЊЉЇЉЇЉДИРРЗАЋАБЉŠЉ‘I–œ‡{k7Aunq|—˜‘–ЁЄЄЁœЂЉЎВВБЊЈДЛРРСФОЛДЎЊЋЋАЋЌЋЋЌЏЕЖМЖАЈЇЊВБИЖЋ–…uocqŸ~z^e›Нט”ЊАЗДЋЄЁ—™žАЛАЈЏДОУТНЛЕЖЗКЗЕАЏАЌЈЄЁŸЂЋЋЇЊ€ИЎСж‘‹‚ЂЏЖC9gŽЉЏЌЊЈЌБЌЏЋБ”}[‚ЩДЌЕВДКФСМЕВВБАБЕЗАЉœ—–™œЁЃЇЇЈЂЁ›‹ЇЕЏ›•‡~–cgЂЏ’žЌЏЋЈЉАЕЕЊЁˆvŒМеДЗНТУОРСНДЎЎЕВЖЛМЦАˆЅЂЁžž™˜ŸЃž–”’ŸАЁЄœ‰ZˆœКА|™ЄЃЁЁœ”ЈТМбЖЌЌЎВ’ЄЋЖТЧЦУУИВДЛРЛЗКМЛИАЊЇЂžž€ъ–œЁЂ›——ЃЁЁƒŽЅ<^ŸЂ˜ŸЉЃ•‘›Љ›ЏДДАЏЋЎЌЎДРЗЗКРНЕВЖКНЗЛКЖМКЖЌЇЉЊЄЁ›–ЃЈЁЂЁНИЧЄWHtW\p”žžŸЊЊž™”•œЉИВДЎЄЊАИЗЎЉЌДКНТОЗЗДЏЏААЛТОаСžЉЉЋЃЂŸЁЃРЇ•œЏЕЊ˜ƒc–НЊЗЯЋŸЅЇЈЊЃ–‘wЅЯИБЏЊАИЛНВБЖЗЛЛМВББВВЌЏВКЛСРТŸŸžЄЃЂЁЃЎž[qЉЎvCZ‰ŸZЛ—„Š’ЄЋŒЌЎœŸЅАЉЃ‘аЫЄŸЎЏЕЕ€0ЖЕДВАДЎЊЕЖЖВАЏЖЅŸЁЅЄЁЅЎЦ™~t•Єœa…бЏ•}kZxu‹Œ‰Ћ›ЌДЅœœ˜ЁЂЅƒЃРЅ–ž–МЩœДпЪЉŸЉЈЅЋЏЋЎЊЏЏЎЎЋЇЊЃЊАЦЈВЌ—ЃgPbЕКДŠdj™Д’ŒŽ‹ЊОВЊЂЁ˜–™™ŸЈЎЈž‹БЪЩЉйњмЉЁЄŸŸЅЇЌЌЉЈЏАЏЎЇЅЋЄЊЌЎЈЄЇ‰]:wЌЎ‰e’˜•’’ЎЁЃœœŸ—™œЃЇЉЁœ„ДЖЎАУЊЇЄЂŸЂЃЉБДЌЃЁЅАБЋЅЈЊЄЋЗеРВŒ•Љ—SaŠБ…YŒВЁЅЊЇŸž›ŸЈЁŸЈЅЂŸŸžЃЉЋЌЕЕŸЂЂœЃЇЇЄЊЌЌЇЎСЌАБЌЈЇЋЎЖЉЋxЖЩ~r‹‰xwœžЏЃ˜—™™—›œ˜™™ŸЃЈЉЉЋЌЄЅЃЄŸ––ž—žЇЉЇЌКŽF‘КЋАЏЈЌЈЏАБЏЊУЅqƒ•kŠЋЈ˜|‹ЇŸ––˜ŒŽŽ™˜ŸЁЉЊЏЌЏЉЈЉЏЏЉЃЅЁЁЄЇЇŸЃЖЈt•ЕЎЎЌЊЌЎЉЊВВ€вЏ’z”Ÿ„Œ–’—‹qЃœ˜——•›œЉЗЖОЏžžЄЅЊЎАЏБАЎЏЋЉЉЅЃЇЁ——››–•ЉФЕВМЃЃЂЋББo1%w}ˆŠ‹ЅЉЊЌЖ—Ђ–žЂžЁЂŸВВАЉž›ЈСЯЖАЎЏЋЋЎЋЇЊЇЉТЁœ™œ•—ƒДЖЕДЉЄЄЉЄЉ„v{rtEMq\[GE’ЕŸ™ЁЇЅЇЉЈЊŸ™œЌЌ…ЏЭНОЎНЅŸЇЄЌЌЃЉОЌq^””™ЂЂЊЏЎЌЅЈЉЉА‰ŽŒ›ВqaЁРТ–]ŽВЫЈЈЌЌ€ЂАЏЅЄЌ˜m”wŽВЛЃНЦЛЋŸЇЈЌЅЇЃЇЌ‘ƒЄЅŸžŸЄЋЏЈЅЁЈЈЎА]dwƒЃЈ‡‹™Е›c•ЩЈЄ›žžЄЋЉЎЈрЋˆ‘Єžž—ЃЉВЋЅЂЄЄž™—™ŸЄŒЊ˜ЉЄЃžЄЈЉЈЂžЂЄЅА{~Ёt‹Œ~›Ѕ~bt˜™˜––žž›ž—Œ™–˜ž™›ЇАБЅ–ЕЌЌЊ›˜™ЁЄЇЉЌЈЄЇЇУЊЉЊЁЅЈеуƒtˆ‘zŒ’hc’НФ™—œЁЃœœ•”ЇНЏ™žž›™•kЁЋА’ЁŸКАЎ›ЄЈЂŸЁŸЁžŸЅЅ€тЂЅЊЉЄЇЄА„Љu‡uЕЗЏЉЋБбсЌgW`ˆБЂWnjMe‚™‘ŸЇЋРЃ’œ’„ˆ‘’—˜›ŸЂЂД—•™—žŠ–œŸЈЅЉАЗВЋДЌДЎЖНМУЊЇ{rВмЎˆ„—НРМЅЄЋЊЅЄЇЅЇ™’—Œ‘‹œЈ™–›—”•žЁ˜•–›ŸЄЅЅЎДАЇЊЌАБДБЊ˜Л‚^k]~œŠS[JcЉ›œЋЏБЏЇЇЈЁ’•bЇЖœœ–z|ЊЄЄЃžЁЂž˜ž˜•—‘˜ЅЋЏЌЉЂЇБИЛНИ™tpruŒЁЖ‘e‡‹gЅЊЇДЇЌАЄЇЁЅЂ’’ОСЉoЅкЌЃЂœžЈЇЈž˜™–ЄžЃЅЅЄЇЏБЊЈЋДККЕКБƒSgЋ›Б™ž›™‡QjxŠ‘r…Ѓ‘œžЃЁЉЎЎЩИˆЈЪЌЈ™œŸЄЉЁœЁЄЉžЄЄЇЄЅЈЎДД€ЗННЕББŒwvŠŒ™ЉБ˜’™ch”ШЛЂ—›œpЂЖЁЅ‘x\œ’ОУŽ’–œЃЉЁŸЂЃЉЂ˜•ЅЌДИЛМНКДАДЗЇЦКŒPjbw›’ЉСЊАЁЃЉЈ›ŽпЯЕЏЈ‘dŒ•ˆŽ˜•’ЃКЅw’žЂЁ——•„ЋžАЖЕЗВАЉЌЊŒnqZ^vN}ЄuЏŸ‰”ЅЃЁЈŸž–|ЭСОАЊ”ŠoŠ‹„œЏ–‘ЃРО~—™žŸ™ЂЃЅЇЎЎБЎЊЌЉЊЊЇu{u›m,`{‰‡•‰œЁЁ˜–’Ÿ‚ВВИž…ОЇŒ„|TIp•qРЧ˜ЅЉЇЉЈЃЁЄЈЋЌЉЉВЗЖЏЅЎЎБЌg€5T[@18(!5IA>VM\]][dmnjrw‹Žƒ‡‘…•аНЈ™—˜žЈЃ™‰‹‚‚ƒƒŽ˜›a-32><;BEGE@‚pmu\IGB>LvtNZp‚njjrz|ˆwjb‡Špv’|n™‹Ž˜Ё›Ž~r|u{Ÿ˜ƒM#%,?7>289>‡Œœ‹TAOa<4.,7\wkd‡vvxqe^dqmS‹ЕYVZg\užЄЇЃ…Œˆ‹ŽЇРЅŒI#3:A5B?GmoˆO7O\`geY2a”{p~‹{wujprjЎ”Š‘rt‚–ЈАМ‹”˜’ŽЁкК‡…gJ94EHILBZUk‡\cihnZa\AY}ˆv\mŒjimknrmd~ؔƒvrv„™ФЎЃ’™•Œ”™Š…{mL90$AJJH@AQ`eT%#9@ZSNCJJ]baie`imk`honƒŸ””„‡|~z~‚”ž›‘‚‡…Œ‡ˆЈ•ƒ|5">-29>QOJ^[22VJJSLELVQMLzrqqwx{mq•Š‘—މ‰vqq|‡–ЗА›Žƒ„‹ˆ„’•Љƒˆu9539:;8Zg^nH@TB:GSZi\SEYzwmvurhho{xx„Žˆ„‡‰{uep‹•Ž—‘•‰’Š‹•‹|„m#&%132emhcbM+Fa[\YVZIOB@Z…}~‰mhp|}”˜ЂЈ—ЌŽvx|~„‰™”ƒ„’މ‰’”‰xT3"%0.-ZTOc”˜NMVUc„o<>exz}wzvtYY\woržŸ›ŸŠ‡„ƒ„•–‘‹~ƒ‚‰…Œ‰uvpn;0*+5YQ.1QjI5<,M~vWgqqhio‰pI;C[qˆƒ…ˆ„ˆƒƒ|‚‹–˜}u|ˆ…ˆ…Š`h‚‘a@@9"2UVZkc^J->Yav‚vv|xzWCYŒqiVY]C`}x~…„žЄˆƒ}{|Š’–ˆvrzƒ‰–‘vrxŒoB7?-ZSMZ{dS8*$EQjjw„qq\U`„wqmohw‚‘™™…‚~‡}}‹˜Ž‚ŠŒ„…Œ}}Юƒ`S79QBbpJ2C:JQTVagUCZhjeZWmokw{vnot~|wŠ‡ƒ…vw„‹‚‚€‹}‰‹–‰‡‚…{qjzQVSb…btP4ONqbZb``nnopaWY\jƒ„‚‹pwz~~}„‚ƒ}ŠŒ}trmt~ŽŒ…{vrvtzt{rNONgaGW‡]5FL[i[art{x~oimpkmP[‡ppuv‡…—’ƒ‚~zzrxpupo‚{ojhtmorƒh\5*YU;Q{QJOa\MGuwpnrwuchknkZ]ptkjkj‚‘Ё—ŒŠ‰‹‡zz~{kjkqxtrvnm]`pŠ‚h,&^nc\Z04JVL)>Iehh^^nd[coqaejqmem‚’‚ސ’˜’•‰Š‹•Žqknmrzwuqv|pjr|‹E+Ywg@<9QI31Oo|gahntgngbgw}‚rnvŠˆ~{t}ˆƒ|{zwuoozv|}{x~vvowt’ZZeW: .M<#+&Lhrmhc^`ge\Yv|{|…”‘ŒŒ”•ˆ’vnvz‚vwrtoq‚™”‡rtzv]ƒm;gjT<5 CH5BW\gYbinigbZju‚…„|nqzŠ—›™Ё”‡v{t~wotxxxƒŽ‡{pkv}„ƒ„zqVISF$4hEQ*7q…d`r„~|tuvk`o~„gq„ƒ‹’Ž„}}‰‡„}}uurqittwoontrwquЏUII]hwˆ-Pabojgj‚~zmrmtovVbhao03gˆŽTV|Њwnovwxmo}i5O@Vpe’–dnnzgrgomqWMgqonbcoru~npn|v„)7:LeePQUmb5`›~jkeekqxpŽТ|Qgnrdap}ƒdnkmqrbd[mcQicouicijxtZgrttzEMh;FYHH^qC+Bh`YUccbnjWe\SI[^`ajcw{xug]|„mebdo{}ktmp{w{‚xtvЕЧJAVS>JCNP.)^ˆ™\hh|rngd^}‡v]eaabYGq„c[gqm‚wce]b`eekvhcr~||ho~NpELNQGhj{jbwvhaYVvˆ~rnrjdWYv‚~|d\p‰ƒwuu}tgnc}uukkqwuipn||er™c@+1Nej{xqƒu{tzdYZPŠƒrropzkh|„q‚zxmgdpurommacce{vtn}‡‘‚qwv~nGJV~S35:9Y:2CJ~zabbWmaed^bmeeƒb8\^ginqumkqpkd\jzuortomu„uimh`vS75JG:CPQPQ\PPUuUiwmgj`cgihe`^]gc`Yieuu~~jpguu{Š…|}„…‰~vuhdnrƒ’m7-;>UZTUYHYzŠВ‰cuwo‘iF`xPGOmimpcagrzpd[rt}}qP|Ч‹x„mЕЏ‹rZio{E:S[C?bZGnQg\mjj—ТД]Fm}}<@adE#2oihmwiw~tqxuv‡|™Œƒ‹‡MmЖСvntxp[HG[CbˆOE–‰v}‰x|œƒUCnƒ]HWZQIS(n`b]akjqzmjmkia\o|kn…]Y}„vhqvv~!H)pFTv!8I\aCY;BO,Ph„}m’}wz|ttoikma@TNUV`egjgurgJ9W[QW`}bmtompru|w}„‰‹C`T7g—”tTW%I]okmZŽƒŽ…kobjWJS]?1MOFZ]]ajuw}gLMNPYi|qggpcddpx|‚}}zNEjCI8E`ukYY78N]˜ˆ|wSquJ9;MMcnNp‚gYg|rp`eCNTWZcihcmrmmjpzƒ}xp`wž‰IAV‰Y^gebY]L‰‰tvw}Y9>PciMjPYhZom}ob`[WZbYZU^gkp~wtip‚‹zpv–Љ{37*Lzc7<";J^;\YpqrŒqcncZZMFNPbaddqtkvd][ee]Sdchjptx{vi‚o~„bŽƒd55rЉ|LEn…~‚bvuwhiwwk\^h[J@PNWYkdbca[[UVjooZT]jieuz‚x{ox{~{weŠO&F#IVT*.{gi}}‚wopnhiT-]vYg`4Ewupqmeji`Oc[ZU]Vjow{}ndk}ˆŠ„‰aB:BQ9Ng‡S-WQ2eo|mo‚ubpxvWj‡Šj;mЋtme]bnrh]Z]j^[k{zrnrx|zhoz……tM$1tjxb^d`jL"3JWgEOpWckegbz•vNnurojkngk]e[j`Zcqo{um|…u}„}~xV[IG]\crzh]j89a‰|tgahFjxq^YN+`\Y„ŸacdpvkmWaj{wm`]`kr{~ƒ„…‚x~}{g™}U@7Aa\i’v‚LUFtubgЖœwtm7?gWYVP^ZegkSNB[mjbhkcYJud{}…‚mjjmTC>3BCj;Ubhodtjgd[MžŠƒ|zZNALOPi}dTtŠ…NT\hgnca`a[eippx|vwno~mqmIB>BYB#@?SATctxm]aiJ}}aG‡aWLM$Gg>^‚jerrjumopmjwqhvwz‚up{‹zjџ€ >S[F+IFJJUgg[IJMO\]][gk`SNSNJY\ZOTWJQGI0 "5A<7+HC"Wia``bi^WQM[SSei\ZZebVZW[b4&JOLA-Wn3  %  #,P1,4<)HOPLS^b\UUW]^dnh`YVQPW[YWZNO9O[PBWnQ $ ,& €>]9(*@@IPMLMUYQSUU^ajbWLLOPU[QOT]`UPGVQ118HNP9  $ %B28Q\MPOSLJP\\^c[<;".FMJ?EWe\BQVC<1AOPIQW5(S[jr[^d( 0++ €Р"?9GBPgqg]W\QG?IVZP\jgL ME332IWHM[Y,PN[U:2JS{”tmpuWn]L    &LU9ZiaVL>B?8"&NVON`m--&JSWQVMAhhdTY[VUnZ(    Т 5LANUMSTGTTVEMNQIOUV,!?C;*3@:>YkehaWNSUSiAТ+MQTHGUJJVL5&-EL3VTWTB*O<8--;GOMOTYWWakn^\HUJQ( )  УMqdTJLW`YH@1)CFWcQ[[\SZLW\\UTM  #ў Ф4JZ8-CF@JVHE@EF"EU?$<49)!LQMac]aQ]]bVT]g`"!" € >J;4BP^TYOFIAHG!GB28(0 ;L?L>igUY^OTH\ihYO?   *+49FWL74048;.$CE:@)]i\[Qi„m29Ye^VZgU91 *"  GA-F^jJ@2,3  *S)>IVr”jBMQTTakjaZZ%! NmTdjdd^SSZB-1Ote1$L(W[cv‡{VPPMQV\[]Y2-, ш 0LSH*7E;Pcž..F8:^uj\^i^egab`hdiE297 FYjkOU]ZH57731JGO`L"<AM0I{ˆ‚nerWNk``SLaCH8  )Ф,L>OJM\C,0&$%л77?GP~Žx~|cWcgt‰^Y~–M %э;MagIBUZj‰}tОEokae4"IV%# Ц.>MQHHF;4:B@--:&5Jiirgd^ccYaJq\w‹a#ы ,>aeWTU@U:0(  е-#!\^`he`^UJPZbaeY~ЄмЁ4 7 Я3Jab`VUG29&CFJJ. 5N^^W`^Y\\]YTIbaˆ[U21љ Ч Vi`W^{Z$.$:Je-A>.dLZb`]SPjrmi[hU]™˜dP, 0(!Н :tugdSFWH0C*(EV["$`TJ[UMVZZqjqa|w{znTPP;4F;  э  junO.%&)J!п%CGbd[Uhgkounmkhu~nbg,7*Ш.`d@2:1-@LOQSO%]iJ)TiqjaY^mo`nonjZhgVe]8!$щ 5e`OMFB00I@ESWŸN1I[xY]]W)A:#)!0"E5.-54H2?Sxbgxvi]`~umk~rPAEU?#)P^AA !Q`E+IVOQCY?Jx‹pqrЁ‰x+$ „ U39FLIJ###$ *%.(OMFQTWV\dQb‰~kkz‚{q\O?& ,  V+HJ< &7&@c%<":<%!%:2>;5%(NQ^SN>NOY]iggqc[`m`dmtmG  % :cZSjP1#*!>hME>OQVVr`k…oVZjrtx‹ƒF-25MPы   $gcC3P л% (UF<>MN[GagGoŸ„uUdu‡wuzz]`JA& €F?#ALI2Nn5,"P?$B##:N;YZMAOi„xˆЯИzVjvbh{a?EZ3,.  @<.]kdvc<2#9$ 41$ ;B7-F]diƒЕœjjgjhZSdxp""MЇ~ht\7%49 82#): HSJTIq‚w„Qdt\oacV•‰Œ>H#8*>Qe-@G%#9-,C."@b<€ћ ;’b<;0BC >8e.,7+31GUC]aZg\’Єguuq|peqˆ‚` 9nN >Ž`EGAi9 LJ!%?GGHE005(4SWz—ЭЎ^ckd~weebN›•Y;  *CC?ING54#95N:5Cr‘СݘV]k\q}zwgQnЁV0# Lq&4I0II+G8!(3 %G^1,+>[vghdmw……}b]^[VU\PЃcH8A   FOaLSLG$""$37)$ +{gI3E9jmc`v{~„jenupUWY0n–M?4;)8d! ;M!-&%*]M8%(aaju\YNNtqucŠ™Žni`aFU—ŽMœ—.П 4nZ+3b9EGMLLH** JM$SUT"G)jp|w‰‡~|qnnpbeUŸ…ЁЃFA   У#A;2!8<975:-0 1;J4.aevzƒwx‚n[`nbUPd8n‡L7$O"Ф% (1)-,FBE3OS*PaVMA.Aquj‰Š„ogm[Y[YcMgpŒЂ‹S-;;?рFL8A]QN1HIE\T@@aVC1к&),%(,$:SBg›Ќ…ŽŒˆ›Ё‘—ЈЎЌЅЃ˜–”—ЂЇБДДЎЅœœЅЉЌЇЅЅЉ’œЁ—~P9BEAA740..&4,4,)0(?PI8p˜„}}‘މЄЋЏЏЌЗžЁЂЇЋАЗИЕЊ””ŸЈЂœ’‘–›ЖЁ‡V7.3>74."*,;,4),,*;:.-:xЅЋ…„p…ŸЗЈЋЌААНЎЋЋЅЅЌВЖДЋЌЈЅЂЂЉЈЌ{’‹——{kЄP!57;81.3380,-421:4B4Qk—˜Šˆ‰Œ˜ЁЂЇЈЇЊЊЈЇЊЊ€žЌВЕЌЄЂЄЉЈЇЊЊЅ’ˆŠ••˜ЌТ„GB@W@;188:3-*--*cx`8Gdx|‹”–˜œžŸЈЋЈЇЈЈЂЇЉЉЃŸЄЈЇЄЄЊЊЈЂ–ސ˜™•Œ–œŠb5&.;9;@1-5&#-:GiiY@(I’Љ™žž˜ЁЃЇЋЏ}|…˜žŸЁ™˜ЁŸžŸЁž™ЂЅЄž–—ЄЈОЖT:4877€н,+8-125>*$$`Ђ™˜œœ˜ŠЂЎЌЋАЁ…Œ•’ЂЉЂ™–›™’”‘‡Ž‘—ž˜”™ЋЇЃФžЅŠB2;:92*110372:74<-8.Z™Ё‰””œЩбДЋЊ˜•’ŒЃЇЃŸœŠ‡}z…Ž’——’wŸЃЋЋžЄŸS7;FV?:<7(+38;>;30*Z‡•––ЊОЌЉЄЎЃŽ›‘—ЃЂЈЈОЛŒQS…žœ—™žœ„‰МОБЖСебИŽT,#:343,-210>?<2:>;EPxŸЄ‹™ЄЃž™œ™œ•’—–——€щЇЕm@t}~„—ž—•‘ЎЎЋЎЊЇЈЎДЊa11).44021938732-!$TŽ’ˆ–ž›œЁ›ž—•”™—œ•—–bFx„{‰‡…•™žŸЄЎЎЌЈЇžЃЊ|9)$7370.(3841478+Z•—›–˜–ЂЃœ–‘‘‘”ž’”™ŽˆœŠ„~~˜—•–žŸЅЎАЊЅ•›••[-8B?4184:4*2551БЁ–™ЄЈЄ”‘•”—˜–—˜—zh{„r–”‘”•›ЅЎБЌЁЄЈЈ–ž‰13874378983055“-)-tЗЗŸ›žЂЇЊЋЅ„”•”‘‡ŸЇА‡p}‡‹‚}{‰”™ЂЊЊЋЉЇЃЅАЊžД:7832?@994-&)+;382SЈЖЁœ˜™˜ЁЃ…„„ސˆŽЅСЂmn…Є›‚iƒЅЊЄЈЇЃЂžЃЅЈЈ€Iž˜>007>;010--.5,5;0V„Ј‹‘ŒŒ–›Ђ”–›”‹‘ŒЅƒ‡‰ZG|‰…w‘™œЄЉЇЋЄЅЃЂЇЈЈЅ@04Q„•Š—ЁЇЃŸžЂ›ЁЂЌЏЁ•A,??<:;U7,-*-5-3:;&AŽz‚‘–›…Œ……‚ˆ„‚‹‹…oŠrUiЄЖЅЌŸЌСoœžž›ЈЇЁ—G1;?@7;72-).:84C93G~Šo}ŒЌВ–•‹Œˆ‘wƒzƒ„‹oir[n•ˆ™ŸБаЋ~‘›ЃЅЇЊЉЈЂq;2940,--.434+251<.47L›ЕЅЕДЌЗЄ˜œ˜•Ž„ƒ[›С~xch‘…ЁЃЋЖЦВ—–˜žŸЄЅЂЃЈЊE9G5#..€\2,9>I14344<%$\…™Š›ЄЂЌ––ŒŒŽ‰‹ŽЂЉWF7<:3.377-$!$+2+B|‘Єœ—–”™”‚„ЇУž[ObwnŠ–ЇВВ™…ЁЉДВДВЕц•КИЎ”QNko<:970&+,9&$.$((&HmŠ™—˜’•Œƒ‚ƒ‰z„„ooЙNpœЂЌЏЏВЏЋЃЁЂŸЗЇНмгЈN%@F0#-.,2432-)**0,45HmЎВЃŸ—•ž…~‚}‚gghkoj~wЊЋЎЛЌЌ€ЉЄŸЂЅЖ›Ицўйv+B\873:2994.-&#()"((O}ВЏЅЇЁ™Š„~‰‡˜ŒcMorvT^k–ЃЅЈЉЄžžЁЄЃЉŽЁЉТЧЈ‡QT2-339723**(##&;31PžЛЊЉЄОŸ‚uƒ‚‹–Ї—œ|n‹Б˜ЂЇЈЇžžЄААЉЇА”йзЏ›M?T?&9:;92-($&+$&84%*qЛУЈЌ™Ž˜…{}‹x•ŸЂ‚U[ƒЅЄЇЈЉЈžŸЌДИААВДЖМКЄЁˆYUn[127241103.0%%,-+ZЋСЕ”uIq„ƒ…Ž”zOBCTFQ}w~”—ЉЌЉЇЄЈЌАБЌББ€тЎЦЖАЌVLWI1854%&$%%#(3"@mЌЅ„z{Š…‡Ž™ЅqWoЉВ’žМРВЌЇЅЄЁЅЉЇДЏЉЅЋЊАЅxN3%285>2$!$&237:[ŸЅ–•’‰„ƒˆ‡Œ–ЉЂgZkqi‘{•ЋЦЕЊЄЃЄЄЋЪЗЕВВАНЕЗФoN\]A5:;@S$&"#&-98:)19i•|‹Ž‡„‡ˆŠq…{u`V–Ÿ™c‹ЕЦДББВЎЊЈЛМЈЋТТp„Ѓ~S?,8145$-!#(08357135›…ŽŒŒ€””ejqkqAˆ—Œ[Z‡БЕЌЈЉЊЇЇЊЗєѕйэёОЫЪЩНqG;)>E;5)+74410&).&5(+(530?•Ÿ•Ї‰‹zxtw5B8H\\TƒЊЊИД„|r„u|xwz|v|}{‡Œ”Ž˜—ЄЊЇЛсЮЕСЏБАЇЂŸАДЎH:ACCBA7.&),5>><5+;mЩаЖЛЂ‰xƒw„zƒ‚|‰‡ˆ|ˆze‰”œ›ŸЖФУЧЊЌЛВЖЉАШЩФe.<[B<!,.54;;<58NLZ9|ЌƒŒb~…x}„{‡ƒ‡‹ŒƒЅЪНžž™œžЗЕЖЕЕЏББЏБАВАЗЏž^I8%Uw\%2:0.01;9%.bЮБ–‡ˆŸŽHN‡žЏŠh{{xMW}ƒ•Ў•vЄЉЄЎЁЫмЌЖЕИЖЕВЗЧЯЗ|0:Vƒo085--!"*-220ZДŸ‘‡‘В|AbuАЅebxz‡‹‡‰‰‹Šƒ‰‘ЂžРжўуžЈЌДДЖЗЖЕ•гЩnJ53+%99;03+00€Ђ&;Bzƒ•–~[ekŠŒ\wxx—‡‘‰Ž‘•œЃКЪѕљаЁДЌЕДЛКВЈЇБаoB<>!789-55,571++!uЉŠŽ—Š~Œƒ…‡ƒ‰…q|‹‚Œ‰’”›™бЗЃœЕАВЕЯЃЏЊЎАkS:+0,$(-#**1.143;M;YŠЂt™`5H~t„ˆƒžŸw—Ї•…ЎМЋЂ›~™’НЛЛЗНТФƒr›ЅАУВe-1A34*.(!.43+0;>L9>—Т–ˆ…t‡{{„ˆ‚…Ž‚]‰АЎ›œ›žБœЎЇЇМОКРЖЗДЏЅЅ€ВŸžЂЫ^;0&7520*(?@,"O~pG8(\”Е—’•’–’Žƒ…‹}˜wrЌЉЋŽ‹АМКТЧЫЦТЕЌЎЉЇЅЄйШлйaS,,8))-+28,4:B#8)CŒŒ‹•‘’Ž‘‹’‚ˆ}|wvaS‘Œ”ŒŽБЌНУТСМСДБЋЇЇ•ЁЈƒЌШpL3Be;>$(135*%4>:9.>uˆ‹‡’›”•–’Ё{pUPˆЁЏЉ”Œ•ŒОЖЏШЭСЕЕЌЋЊЈžДЉЌЈЛкУvGFUOF5)10)2398>17??,.193034-0#gZ8)EIGU`Vaedbjggmmhkpprmiijdmmigdvpn[S]aZVO\bcM.##&5?9:55-2:LcgU75`wc`]ha]]ivoxxJV>41;>);^\YU\ZT`tupvcMOHVYjvj\jc]^]YSLTVbi[Uqo|Ёboo.145:7173:81+3-3+.->dYUV[Uk’Ќ}tpdbSSPUjpjaZn[TLEO^V\gmV@]dupdq<$8AZC9A8;?:1-();A(7*%?G\UI]t^i^`ZTTFWddgng#$28A\[ig\V[^…›…{‚Šv‰p\?).,45>(.*79474+$78H]aOmvxg`V`]VU\^ab[n‚B7MNMamedb]\z~tpknkpxuL*;0;;4148.4,+0# 1OZO^ekhihb[d[[ce`Z][-B?PNLHJYZUhnv|rripektL,4G>9+-40+,.5Jb\b\\cZbjcYLP[^T[[\^TL^PPBUY\bb]ammkz„vjgcgbgE,3@B?):24%%ˆ1 Zxi\YhgujWQJV\[b]Z^bL5ANINJHZ]ZWUipn‰wqtujSh^335:479;<:5.(2)2(#QƒueaadwojiM\aY^TjkvQ?IMNQITVc]]gen{}xmgmu~h^-:-8+99€#(1%2+$%0>|}dcacrncOIHQUOQd~c3,Qh\PU8A9Ohohenjpjikqnkn^:..89B1(*+F\jWPPTeci[Z[ZSPQTWkOLMT0GQF@Vgcnoprdmrphbwrt@85:EG?>74$%3?+.;OV1C4742,*3:%!.1]}d{wz~ribdZSNM*bƒzV:(78]Ngkx‰”…dgcbdgkihg—F7@:(-,,-<@%!!1+ 3W`Mdbkq^WYVLMPQou"*JQTLMn‰~rp|pkkthuprzUQUO"")3#?g3-&")#)!?qx~hmpnaTSWZV[WZnVF&,]H9OTGY„–|~a]qmjg^oQ7bQ$,71,M$""3M[]dakzZPN`ZNHLL>`H -?;O[TPq‘ЋЅОУvOied`cƒŠjxF!.03(:9($)%&"!AMaqu\+LOTOPLWUib*$2+5BPnnu~}Ÿеžg>bbaecˆŸaIA*27>571-,.+)"-2,MeB?ooZMNn{PIJSS\TIVB@>qŒjr‡urŠ‚„qtzpjbŽjM92:2.--+%!&#"-IASuxdahqmibqd]MEYT+B[T`„—ƒx~ƒ}ttzŽЊ‰`‰ŽvI-,),*%5%-))&% #&*Ng~vtne^[UQQJEHLB$(HVL\jЃ—”‡uoww„›|n‘БВc8-$%132.:8($(&;H^dohZ\\NMCAIY`"  c{ŒЃЊ‰˜•vƒЁŽw|‹WH1(89;<.1()+#%%#BYUc`Vc\LMJ@Am‰d#2LASUit„dcrzˆŒ~žЪg‰‚woICdw7:B>973$$$ "1ETcha[\ZLGSL>JMCOB8*;:YW~}{z~ztuhk\ˆtŽДЃx2>C.))70%-9(+%$+)(;IawujepYbI<:IO^xvrorjdimpocotŸžqjIQ7.*9<#((+("5B9P]pT\90ISOtYmppmdd}„rm{bpЕД|j@.I;,?.>C3#-%<-P‚ˆuwjVcYIEJGHgaj@%MCvmnqrhknqz}~•ˆ’ƒjk[AT^S#-8B2-,4-($&.)>ˆ”ˆ]F@JINQW< >?C\bpuoqpqzz}{…‚wŒ–ƒv‡orMGHMTPV\bj`@+7Mrt]Nk„{tmj~vqx‚ƒzzuv‚pFF.+$05*%#)")@w[`\PHNJ[VWh`E0!.38cJ[q‘|vkmphЈ‹„|ƒ‘x–›S?aY@*9-.:< !##giiOJTZhWF8>H2dmOJIC[zWY^ggjVqY`ˆ™z„…ŒБŠG95<;,".#$.% 0mTSVZ]WF5B>@9FWIN. >jc]bijqjwkvЇ’ˆˆ‹”Ž‚z`3ZGLB:4+(% ""132(2tSa`SA@I:GIIA?5AACW"Q‡h\`^juoo}d„–ˆ‡uˆŽ”k-)ILB*+22).,(*$Q‚TSLB?OOCF>3>GLJNI>Naxjnhaiccp|{„zr}}pu|tY(>J@()4)A48;7(!8Vrme{bHF0H724@:F,:9B^qcW\ddhk…w‡ˆdo‚…‡’žŽW-IPUe]* 83,-0107) ?ttVCa,7*!-4812,PdWN]ƒC8FF::BGGAMSTUbkv{™ШЏ‚‘w~~wm|w…„A;IHH?5.+))Ÿ192:21gД›{‚nZJBHCGC?>HC@FHBJ@4S]g`^~Šc{w‚|urЂžЁY.I\?<(132*:>-.E;Z1bq@[M2FJNHFNILVZYUBc‡~ebb€B\aˆ‰v‡~x{nu—wz[I0&LV,7320").&ZЂp]PJ`LM^uQ4IGN*1;[mT:kjqmЁЖ}ƒ……ƒ’Ђ™k(*]o,$4-0&!0N˜i[LWvL,2qc$-C>QUZSQWFHB]peŽЇшСopv‚‘„{~|ZБВkP9)"+.523!#)*(EH\TI^a\S05ZQLLGF[P@IZ``Z`cЉкпЌr‚‹‚‰’Œ„rmОwF?23(,&(4)!%9,b|LS]HG^LNLHNME>;ELNMCFYcecokЋ’piz…x…•wYƒuz{^H2&-%&!##"$+3?@>M\pL?^0:9LQL]b8\bQFo‹hb`Nhd‰Š„‹‰…ŒŸSSqhx‡›e&2<33#"*&&$4G??>nŒUPF@OAFFJIENZT(Nkmcbbgr`zo|‹—Љˆvzxoq]hhЉUF,,+&>m+%4..(+Hgb^NOPBFONLUPWI$@VuW\WNWk‰‚uz}—‘zwvggdonЉ{VN&0 - [8(:17)Wagia]P8BLTFIJ8HE7U›‡bJZYz}z}…’—Єˆ‚|rirYЄY)QQP5%3M:1;WG08Y^TYLB8Oq`Q;J@?E7nv‡„xgg\~‡uЂЉ’Њƒ‚vnerЃЉbЃ™@+-$?%"*53)*QŒtG7;Yx]W[^TZWOHEAO`E?FoutOUE‚‘”Ё˜’‡{~{ouАЖЖIJ&A1%3)&87>*""%9-*-!);PIJMOVZZSce?;!-PgtpgTQTˆƒxŸЂЁƒ{}quvc|r{{‘Ж^HLa]M)*)23G37,@YcSVh\^TT\ZkbA$(AETW|i[IџТ->8TEcuqUBTUNLLITPP?@MEZiqpcW]QTiqV9#+5*%)#3>;3+5Ч  )VSg„‚vjurUSPS\PMQW]`kqjjnrw^GNMTP<313$.3#,7:M>%.У 3T}‡Š‰З…TcWMSQFTOI`jqonv|jLONC8HC-(5% 1<<€‚ +;)-UzŒ~ztn[UZMQPGF82Y[oqap‚aZYQ[O;Pk447#%9A:  Fu‰{qxudZTNTTUSZcQhbZrrxcQWC<,B˜q%%$-"  Ъ!Emrtojne[VQNPLQViihd`^Y?"IP<]MVA.0. !Т   ?kŒ…cZ`\\QGLB3?U][TOUB$AOcB:.-Oqˆd2   Л   5aurc\^a]MFMCGZ`ZSVN:V`\[I?-:a[`gH"5";Š&9!Zˆƒub[PJNHSZTULMWQ[dUTZUNOpz‡o]# "&%    ?VWc]NSOPMJJOecaOVYWYSYWW]W[c]`rV#+H"$ €‰ (1}™‰pVFJHU^amkeSPPUSJ9BJ<9H[EWu^i[  )3$*0 ")  PŒ~‚r[YbYMS]UOLFV[[WP<0+IOJEWggiE"!   €4bE1[•˜ŠiUUJ\`die[QVPSZPJ5!>^tab|—ЁW745  0T<PqŒjETS]W[nqaTYZVWUhGBEU[˜vxž–Œ…N o.    7% (U|nTPY^YYеaZT\WUIEHSH<$,pim{to{e".+SU8)( !8^gbb\Wgkhi^VUPVTSa`QM7Z^hhgdgT%-3g|]8(%L?$+)Wz`VV\itpd`c`[WZOOEGJ5e…}kpk^bWA+%YVLH ! €†1bze\\O]bb^Y`gkhaZC#CIGF9i~wcV\@)OQIZC    2PcONZUULMUOUcqwrV`[?UwovŸЊt]q~BT[SIIM( # $!!  T—YQMILSCM]hnodenPFHUcnq„—torwGd`bmh[J.   *Z’Š``FHLMPLOT^otnd[#>@IWet‚ƒtneW`PAQ\dM?$  "8 78,3CMANQPZPWwwrhi??JSJISi{|urJLMH3NkqecVQMONVSYthwrp|\ZO*%9FWaWL+) Ц *kg>O;F2-AJSUeibZE9@CUi‰–žЅТЋP]L<`debu|]@ ,!!  Р QqdVM.I>GJHI9\]`o"#€Œ   0^c[PAH[][dbmwk8 *..>he]›ЎPYNF%?HPMP?+ME !   @;@Q[P8J"]}t„umUSCOJWt~ЌБTE0JBF>8CA;OT-*  п4]\SFQgЁ—uQYCBQ]O]\tЋ‡toZSZrrщYTTIP]A3"€Н*HOZcL&L\jokz‚‹aAL@$MWtˆd IISVHGAQUOHI.CEТ >JevidVAYvh^u}ƒgZ8>J:c`h`cV]O;B-LO%&;\dF.# …B^CYS\QF1Cgihin\QE>JA;kW\M;4,IO1> -805.Lk‰h29C3$ Saa\[„ULYpkYYgbYcF"AQ]WI2>9)N;SGF7NTQSa%?:$   YhScceQQNYhjcrjiMIMWLi^VLLM-SWiAPt„uTGMig09#  " H`dZHdwmHa[VP8NuЂe@SNvMZTGO`]3," Ш!\‘xq*$0$;@&U9@;N;Mn]G,З P9#Iup`vnM]GAFJL1G%%;JGJ?Tho-*!,.B5QONnuwx{}oIbt}mttjWdV[LF;BE7E1,#;Mccxo?,%+)#9rzxi]cu…wh^`chUT]icgWSQBFI@>@;#>.BWJpO"ўЩ!30L|‚ihjhttjcb\ZT[aPdacWA4AIB#"-(-7(-OUPht1 €=  $ivESu‚k}ueQOS]mcgd]iQ>PQ;j0!9;!0GAPZO}o 5 LiSuНЪkrh``mQ`‹mkwnMBOJ2@5! LV<BFVUZW[Uaj„Š^77  1OieQUTW\`tˆVmZSLc]’n\A<O\IY`Lo[2QZM?V’Є|*& Р  ,Shwj^aZU[z#W[ThhN^xrh?B9C4EI:CS0"@IGLM„Жž-, Х  2%BdvgYdphLdJviTNpxˆrTMBCOMJO<$EACG5?gЁ`;%  ўЭ(%,Youpkwh”9(FiuŽЪЭ”wehpLTQVVG3:7>Q[AGT|˜|m9ќ  Х$,(Sx„u{ЂЗЂE#IWL[^PA[|Nb7QYM[N%"AH>B4Yx•ŽŠˆ~I) …5(o[JY|~˜H31bhvkb][WZ…P$F.+)#)aL@ 0gEJbp”’|5 8  4 4IVVIH9SbadŸАx1"S5 "11S{ehaл%@C71cB9(1p›•ЉККœ„ЁЁЂ›˜ЂЅЂ—™˜—™ЌЏЏ€kЅŸ›ЂЄЕРžq<.<820842,,LL::<& #G82,-L~—ЕЪЩНВУЛЁЃЄЁžŸЇЄЂЇАВААЎЌЗЄŸ™ЈЊq7G<398189;;VB00$)$#*.1-9oЎУСЖЏЌЌЅЁžžœœžЋЕДАЃžž•}voZ„Њ—‡kCGG2-!"!%+&+#&++30,2,%144055€pЊЮЦЏЌЇЄЄЂœ””—ŠЇЎЎЈЇЁ’”•В‹Š„~—ЖН}H<%.0+(&$>&"*-*"&$%$#*%##9591jЉНЗЏЋЅЄ›–’˜ЂЅЈЇЈЃЁž™ŸЂЊ‹„ЈЂžiA>?73%*&Cc0!$!#!#)1.2GC49ŠЪФТЎЎЇЃŸ™™˜ŸЇЂЄЇЂЂЃЄЅЃЂ—ЁЗФОШЏ–J3421$&)<:I<2$+-)%*&.+*&-+HužЅЉЉЋЄЄЁЂЃЄЈЌЖЎЄž˜›œŸЏЊЋЉЂЁДLFW81+BCQH8+-$"0-.&C83;A58[БгЧБЈŸЁŸЇЈЊЄŸ˜™–——›’ˆn‘™•„›К‹m32BLGGMY22,2%-10#%79O7((-0*0|ЪЧЭНЃЅЂŸЂЃЄЂŸ›–ŸЁŸŒ‰ƒr˜Љ›ЊКЃ˜]*-7$ AJCAG5.-2.*-.$,+0&*Irc73N‘зшбЋ›ЁЈЅЊБЕДЋЅЃЉЄЃЁ˜ˆŠƒЊКЎЉНйаО‡QLE+Q)(983:7.9+$$&!$4No[3.!:vЊЦЋ‰˜ЁЇЊЉЅЊЉЇЅЇЃ›ŸА‘ЉЃЌжОСгЯаТv,,0-Џc.1A455;4,*.0%,$–•oBA05455341.1:(M>5,&(AnЃЗЉЇЊЈЎДЗЕАЇž—˜Ÿž™—’ƒЁЏБАЏЋЈ‘SHM5ДСЋtL5)544519?C[ 3bS04>;–БЅŒ\41*2:75:;;.%(*1@*+#373PЁШДЃЇŸЅЌЈЇЉЌВЕВВЃ‘q‘h˜~КЫЛЉœ–j8–”ž”™q):9::>4980(#$""&€{*$&(Z‰œ˜”žЁЅЈЇЌВККРУБ˜ЋЋ|œМБСунЗЄИЅ^žЁЁŽžŒd?C?;:938%)&"%&-00.158:-&;}знЉŸœ˜—œЂЃЇБЛЛБЕКЂ‘”КНМажКЗНРqЄЊЇБЏЄ–i5:LYE>85143),-053$*(+,$9:^ЋЕž”‰”›Ž˜ЃЉЊЌЊЄ‡•—ЉЛУжнЪюуЅŸ‘Ž’”–МУЄk<>@A?<9:11е3)-+$)1%8:9ˆФЕž’ŽŒ–ŸЈЉЎБЏЎБЌ„a…ЅЉЄЧОЉАДœ››ц˜czЋИЊВk75@;91.,&*.(*.+*,,Х% N™ЅЌž–˜ЁЈЎЎЕБЗМЎ…hŒЇАДСЗЕзэ~Ž’•˜–ƒQ}ЌЅЄЂ]>BCC+)#&()**€0*&)*39oАЖЃЁž›™ЁЂЋЖБДЗЇƒWh~uЇЃжс–Є›˜ž•–‹‹’–w‘ƒAGGA13,+*%#$&!$"!(.12#G„–žœ—–Š|ЄУЖЭФСЕЁ”‹•ŠМОтюœ‹„˜›–„OIŠ‘’ЇŽICEB:<.+"**%)..+*00"-kЅЄ—Ÿ–ŠjvœЗкбА›Ђ‹ˆ—Ѓ’ЃЃИщШМИЂЄАЛДБЉЂ—›ЂЏu.-UC !*1.!)0**&.,("9u–ЋЕr^ŒЃЌДВСЦЯЉŽ˜™o”œЕЪЎwk„–ŸЅŸЁœ—–”ЊŸ^@Ec]>($$.%),&$*188€7V•ЃЏЛА˜Š™‹vЁУйжЃ‰Њž’ƒœЎТЖЇŠ‰Ž™›•—–’••›ЊuIMQ<.(&,0+*%#$11.5&E’•žЈЂ‡‘w™Ј•ВлсАƒƒœ›ЌЧДЂЊТЂ|•˜”‘Ž—˜–Ž‚t[@9&-3(&"&--,()$#+1B2>h–ДТЉЋЃˆ\žФНЎЗЪЧВž›nŽˆwЄЈЈЅЁ™••‰‘‰‹ž|WkŠVAA3$0,*-20,)$"" #F{Ѕ•œЈЊЃˆ—ЗАЎЏМЊЇœ’–ˆЌЌЄ™˜—Ѕœ•”}‰‚ƒxvЌБƒIT`G51511.1,**&(-39@9TžЈœŸЇОЁ™ЊИЋЋšЊЉЉБ—™…kžЈžž˜›—ЁЂ–’}™Ÿ˜ƒ™•Ђ„A^ZG%.)(*).1$.*+-0898@‰ЎЈЅЊЇЂ™ЁЅЌЎБЋЏЕ˜žЂ’ЎЅ’—–‘ž˜žАpžЛФД”ŽБ”FMC)-+%$$+€”&*-035?N0Q˜ЌКЂЋРБŽЉЎЌЉ›НцИŽžЕЂЫЗ–™ЄЂЇЅЂЃŸž™•ЊЎbNO9!>>:*))$*(!&+,04,#7„ЊЏ™ЉЋЎЉЇЊЉЈ—ДхёА˜ž™гЇЃЧИ—{zЎФЅŽ—››‘Ž–НOMU@;73++%**+%%3-821-&W™ž–ЂЈЖЋЂЉЉ€_АЖВме›ЏЕФЂ‘‘‰”‹vДЌŽ‚v™Ђ”‹‡‘Ÿa;("4485,*,0-%".54-(3Ez•~ˆŽЎЌДЉЃЇБАКШмЏ„žžЩрЦžˆoer˜‘Žw……Œ‘•’–œŠ‚U$0285-.22+%-04341SLV’—›ЄКДЏ””™ЅЏВСЕŸЅЅЕўўаЁqVwЅЖЌЁŠ••‘”‘’™ЕЁB.17-&*-*"-.*5>&04c›ŒЇЩИНЎƒ˜ЁЃЄЄЅФМЋ›™гїЫŸt|™ЋЂ‹Š‘’‘•ЎЂYC3,>."&.2,"$.99A--Jp‘ЃЕгКŸ’™—•’™Ї’zcˆЫЖЉhr‰—Ÿ~}Џ—˜ŒŽ’•ЕЉ‡T<%1&$#,,.$! -^P8435.59;129A>:**!>3[^‹Ё–ЊДЛММЖА•ЊЎЫЏБДЋВЌЂ’”‘Šˆ’ƒ‡‰ˆ~}Œ™ЈДЩЏ\SEH52,:;,,++(?%,ISF1uКЦНЏЎАЛРЛАЊЎДАЇЋЎЊЏЎЉ™”›‰‹„Œˆˆ„„…œžКr9#102%"#"!$&"$7VG3CŠТЫЏЏЌЗКМВЋЈЋЋЈЋБЌЎЕ•””•’{ƒz‡‹Œ…ŒŠ•˜ЄБS0E554+*%#(&>90:JЄО‰’МШЌРЕЌЄЂЃЃВЛВВЉБt‡—˜žД‹‚xƒŽ—Œ˜••˜ЩЃ;3289<744L%$%!)3:5>@G„ЖœМѕњЛДДАЈЇЅ˜ЊеМСДФӘ’ž™Š|iƒv„ЄЊ„œ–…ЛЗv>32>;4+11)%*+%$$*+2, -`ЇДИйзЂ’ЇЎЌЌЉ’–АЏМКЌЖЋЁ›jPO–’ž•ЅУ››€іЁЏЩаБT2++5,)($&"+254%0+)..WUjЊœЅЅЃЋЕЗЖБ›™ЖЕЗРИпЮТЃxen‹Žu~‹ŸЈЅЃŸЁЂЋФФŠVQ3@:307:,+,357327?4,J]ЊЋЋЇЃЅЉЋДЕ›КВЅЉЊЇЧгРЊ–}{œЎœЁЁЉИЂ‚™œˆ~žкн—J(CI9424.((+(,0(,3, @ET˜НРЎЋЂЃЁЋАЉЉЎЏЎ•ЊБОЏ’Œ…‹•–™Ё™›~’ŒŽŠ‘ЧяЫQ4^I+,,+%-*$#"*+(>IIoЋОКАЌЎЎЅ`UmŠЛЎ—’ИФЯЛЊ‹‹€№”›œ™‘‘‹”’tЏгр[Q?1:410%2&%,&-ac7,IF:F9 >@E< "(&,0+29ISB>gЅŽ‰mkac`b]aPOev~z‰˜tkqdjbYdzOLG33?$8EIG9"#-$!#$$11%9T‚—Œ‰Žqpd]gpikqwkz{p‚‡•ƒra[[EUЋC0:@1)E,7-%159)-021!)-1.&$5^x‰Š}x{}urjgbbhnˆƒxoo€BrUL[`81QmUcOFC<23&"-&1)#%%&2.,&-*&++*T‚˜›uqnomj`aWUPhvremh[TUaqOPSIY‹ŸuB8$2531+(0;.-5!&#*)#.Tt…ujntnajc\borpnoh`iurxaWEQprm\89@@;4"4@`$#%"210$G825gŸŽ’ƒwnjca[dpnnqkojnun`meY`~ŽŠ•‚k>34:,$&"-BJA:(%)-"+)&$%);[iknrmohiddgru}zjemiicihjpzvwjj~h9HS;1+"@HGE*%(0+>33;@*2JˆЈ~u`cchmwz{una`aaЩTV`O9TdaUmŽj{d1-;#>AELO.+**00);HV7+5,(1bЂ™ŒnqwrhkkjИ^[hqjgWLN;Una\qn{U$-4)>::;94)*7#*".*$"Sd.5BkЎИЂqghkiw{~zvomhogi]OO€xqˆkpˆЅЁ–iIJI$@ "-&,&&! :[t^>&3b‰›uSagjnkvvtnopojmxaSUi|Ќ‹‹ЉЄŸŽT*,4‚Q-%#.+&&*0*.-2VE(>c•jentoqvvuqtkcedhcUO:Qƒx‹…„‹u:3FBeeW1$)$32-&0+-4 &W?@&$.7Pw}p{ppv~…~tmd`^ckreWSMhuwxwtre@:2(!*(1$%.3J}Žzvvenzttovz{‚}wWBV[-V]O„™ŠwmqW9c`aaj[$)%:(.5.#)+*0("#I^0CIQSa\UYgcmguŒŠ}QS`b]^jz–•—Ž…h^\TQZ]r]Y7*90,&-19$).15:5"7:^zrnehb[[€АHa}ˆ{u`e[]dngoƒwˆ‚•ko]EBQYjtmb*:GB3+8.?;73+045-#3&H|{^ZUIOVN^iir|uqMLWWi~’ЋКВеЩiv`Oikja‹iI)"?AB@?77942&,#%&,<7a‹{k^ZUieko{w|p{kF1Qqqi›‹ƒˆbjg`k^?St‚p}O*-8523:))2.(0,++0„*>okzgZU[`hpzu}x‰wV3Up{w–ƒЖкHZVW[\\"Swpm|E9BC:&*)*$&:7),+%, 2Sqzni`bepgpvzŽ{M0EEHPrznЈМbn[`QT\[\Y\C[[+;BA,0+)&"37+##…,",0,&?\TU^i`Z[Ow”‹™˜‡haYcTb‰ФЩgSG[Z\M!NWVVmi;BA2<@-&(,&&+!)"Qrmad]S:>Si‚ЌЌaeYVZqdokЪ‘‡zmeo|}}ohg^cnL$-@H $$55€60,.!"&+ JYbv‚aA1Vt‚ˆ{‘—žvZbS9\p~Ÿ‚;5QUbddkgiYZ\kmF9CghG5+-)-%2"%-)5.,1Hhuz‹|^QgaLijБЎpSweaYo~”ˆkCHTO\ZcbgSGVdpH;F`G31+),("(**!Aja`vp]ZZFcx]‚ЏЖ~LI[jv’ˆ{r…iJY^gjSSVacZSYLZQ?>.-8?!).!!$)2%*Uhx—~~qO.j‰ƒjŒ”–zg`>Y`NopxemneaWQLSU[E%9@epkop–j^i…~|pjntwYQO8huobYQ\U^^[Eba`OPedavAd]F+-+,03*"&&35,(45h|n|rqjddtx}v~x{`[bq[wnn]hZW]gxU7cƒ•„]\YzvHQM.455$%-+(.*1+-5J,;^j|m`rˆ{Zqrik[iŠЗ}Pe\ƒIh{bctnvrhihj`[^iYPSC9?<,1&*"+2<*9)!*]wubLrƒzwttvdАФ}k\aИxdƒxdMFtgOZdgaS^WƒkIOS;5<5,$!%&#("!$#%Lib[jp‡qqbauzЉЁc|{a—t^^NcTCkQGGajZVMMceF8.2@B@9)-+%)*25"3\cCPZ~{uie{‡МzQ\pЄЏŒhH22H^`S>GS]b][Z^W[B%3.477.5)(%,)1,8NQNZeduƒ\Z^ncw|Œxnmmƒї§œj:#CjwkPYa\ZZ]bbxA0-892%8-)!%!!37+,4VgSm–„ŠwV^gitnkŠwg`dЊсАk>1),4.44+5<7%45##(,CFgcoquwŽ…Œukkh]‡Žt|dW]eZVZVY>;:IQQ]Igx}9*1@F9@>+>7#19A@0#$#<2SLdd^iŒ—‰‰{\r}„…‰xix{jcVLUZHEAJLN:ZPcpzPM5B**!GJ".&;7 )!BSA)P‚‹…}t~‰›Š{qr|}tqxuxvmbZY[`\QMSJTBFLNQh^V5 1$$"$%,!9TT,9[Žwƒvˆ‡vvjocq}vzzvkUT[^YH<8MIWVPWajim‰I%C3>0-*,!%"!&+*13v]eŒ–v•…tigneuƒ|xp|g9J^]ewU@LL€UTPV^igZˆ53075701:N+"$)35371epŒлпŒ|}ro{a|Ўž|މ`YZYL9>+4;GejBUT^Qƒ]@2.3171&(5.$(#"&-,%S}„ЗЖp\rwtm]g}qn‚qmd-!H\`dUio]amr˜ˆT7"$$,0%,4$.543$83)L?Wm}hrnip‡ŒzT[{ˆ‘—М’oH@GP[?JLekojihov•‘qSM.<8<3.<>(-073,"88&EOdtwpqthiq‡—cwtmmqj’ЈƒoYJ@^oWnnm~iHbbZHgЎЕ’I$?H<2*)7(#$(*5*21GiƒŠ}nkgjt‡Svnpv~]‰…w\ZTVNWbUicMYYZWV[œЧНI.NA&)+,**€00&&%":C>O|‡vz‚ˆ\p9&?[‡wgj…ŽŸ…gZCV\a]iTOS[Q\B\|ЂЗvSG383-224)8FABj~‹~w”ЄSF\…ŽЇлщЎŠ‚‚…egaei[`ZMGOVeO^jŽЇ‹}V*3;+)4.. #+;?7IJc…‚{ЈСЋZ;WnimrpSm™pjJckhnS[YZUZQOtŽŸЃ™Ѓ‰]4;W:&84! &JM< !‰uWj‘ƒЊQ]Qrpmhqxe\UQCLM;t^U4Ctc[oЈЊ™N.$S;3#>0*%&1)!)V+S\E\–ЅЛYoeW|ˆ”‰pkzrn`]Pdb][Uu›dPTdn``}‡ŽЁc:0(1.85%(.9C3:.?!;7[u[„r{B2a`kz™‘^ba]e\^^db[\[ShY:,Pqk[rЊРК\1*N<8>+24#90B3eїћњїјјєјјїћ§ћћ§§ћјћћ§њ§љљћўјћћљњјїѕїњћћњїћљљ##!с5B3SpЊї§љѕјїљљ§јљјјѕїїњћљљ§§њњ§§ўњ§§ѕљћљњјћљјњљјј§љћљљЇћ!+$#4??HQLЎљћѓёѓєєїјјїљњњїјјћњ§љјћћљћљљјјњїјјћљљћјњћћљљћњњљћ &*30%9I^]Тљљыяёѓѓѕѕїєљњљњ§ћћњїњњљљјзљ§ћљјїїјјљћљјјљљїїљ-++25H<4G?pтљњєљњњјтїњїљћњћјїїѕѕёѓѕѕјњћљћјњјњњјљћљљЫћ§ўў -,$,9BQF9;Gœщљљјћљљњњјїїѕѕєїјїїѕѕљјњјїјїјїїјј§љћљљћћљћњ§§ш &!!,8<7)E2;Їяљљѕѕїї§љїѕѕєЫёѕѕєѕїњїїѕїѓєѕїљїїљћљћљњњїїјљї !!.12*9@\S5eЧѓјєїїѕљїѕѓѕѕљїїћѕѓїѕїїўљїїћјћњњјјќљћљћћп .-345JG@*aЛёљїјњјјљћїјїјјїєјњњјїјћљљћљћћйљњљјїїјјћљјћњ+9 !*G@G5+74eНЭуєёєѕѕѓєїјљѕїїјїљїљїїїјїїјїњјњјјіљњљћ б#.<9+(*C‚зжкэїјњїѕїњћћљјїѓїјїјїѕѕїљјјљљїљњњјіћњљ)9 ц ;:8@9>B28Ћбёњїїѕїѕїњјїїњљњјњїјјјћ§§љјјљњњўљћћžљU# %+01(1+.A.YУєљїѕѕѓѕєєјјїљїїјћјјљљњјњњјјћјїѕїњћ§§ћљљћxO$ #:0079P3Vсћѕѕѓїјїјјљѕ§їјїїўјѕѕћїњћћјј§књљћћƒc #5717&(8^УљћїєѕѓєїѕїѕѕєїљѕјљїїњјјњѕѕљєљјљљћјјкКОC+,*%",5?FCFHIHA`дљ§їјћљјљїѕїїўљїїјњЭїљєѕљїїјјљњјљјЫкзz2@ " )8:@<FL8@bнћјѕїїњїїѕѕєїєѓєєѕѕ§љїѕѕїьљѕѕїїљјћј›ЏЫШЁi7 "в!18.&>BB?>0<2љ§јѓѓєїїѕїјњїјљљњјњјјњњјћљљјїњњјлТюёШЕ™zG>4,&+*&771541EuЋьћљєѓјїїћјњјїѕѕјјїњјњјїјјЩљћћ§§њњћЈЏНИЋ…Y0 #%,*11>7A,SJBЇђћєєѕѕєјѕєєёѕљјїїљљѕєїјћјјмљћњpœv„}x…n;@3).+$%&73;?A9>aп§§§јїѕѕўєїїѕўјѕѕУєїѕїїјћњѕїѕїњљ„ЁпЂЄлЖЂœC   !(+"3"074725cлјљєјјїјјїѕїїљїїљгѕљјњњјїїљјћkbƒŽŽЕКЊ~e@&)  +0);:C "F;?,-1AEINM]^jCjсљњѓѓєђѕїїјѕїїѕШјљњ58LjZQimw‰’’~unO(15.*%(9@?GNNBEOhЗ§§їјѕѕјђљљїїЧљјїљїњњћљuIFGV2g……™ЉtŠƒj>"# !&"%5:B15ABHGOGeх§њјѕїїФјљїљјњњјјњњѕѓјdZJG@FFmƒŸМЗŠq…‚M>G  )3.A@A%$^И§ћћїїљєјѕїѕјїїњЯљZ>2#LNZx}{…‚}„‘ŽvM+%,"!""$-151;@.0MТћћѕѕієїјћћњјїјћћ€ГY[|LF55,USm‚ЁШЌ…j[#+"(&$$*#7$"-AF42[зљ§љєїїѕјњјћїњјїѓєїgWeG? 0jZP]ˆ˜Ž‘Б‹}L+  &*%.%%(#-3),4bяћ§ѕїїѕјњњјљ§ћїјњј\^S.bt1!VSUC\u‡}Œ”Џ—p”x"" $(&$?,ƒёћјѕѕИїљїїѕљїѕљљјUWVT:,MMSWWhbY|x{m…™™НЃI !%".&"#(AŒјљјѕєєљњњјјњјјЪїhZOPIE5 J}‚uwmvumurqr„[ #.&%)( ",B8288HЯљ§јѕѕЛњјјћјљљјјt\]^JVPYJabWO8rŒzmhc^НЭu  &+&  !&(4?7.3vщ§ћѕѕїїѕїѕїїЦѕїjmQQMNFMZObhYVhb`W]]ev[e^?C7&%- $"%$()+128*9<{є§јєљїї€џѕјљљћћˆvVSWb7!OOEHL[hhe]bujSh[Q%$, )09)%,00<4OLѓ§љїїѕїєѓѓєїє—hTgirYrQIFi[i`hda\koŽm\E1"0>2-"!$4>43&(-5AMILЁљљ§јјїљїјѕѕїЋw@miiu‡u0&?OQmehYTmbm|r]9EZ@",SB"%,?cPY>I—ћ§љѓїїјњњјјЃŒme~qdŠ]IF:LNerc[emnr…^Yak450&!+(89CA<9YЫјћѕѕ€™јљѕzmnp~mN`UVH3SOnpmdg`]bhgbjP\M02-%)(""+04<;!*<„ућ§єљѕїѕїѕ…ŠitvoeadMTa8;FUmknag[OZg`[MVL&))$*!,(#.;9;3!C}юј§јјљљњјt”Ўttgc]`YVUU^`bZ`a\^]]˜p`UHPQa1# !#%""$&*4??2L\ћљњђєѕїјTEd–ŠTQahiOUNM`jbcc`gŠuPiOQOPY[O73 . #$$(0?MP8I3ЋћљєѕїјљїNWoxG5IЎўўўћњњ§ћї§ћ§ћ§ћњњћћ§њ§ћћ§§ћўћћўњћћхњћћ§ћћњћњ47FHajA5Їўўћњјљњњћћћњћ§ћ§§їњљљњњћћ§ћћњќћ§§ўў§њћўћћњ§§ўщ§љ;0+HTOBN]еўўћњћљћњ§њћћњћє§ћћњ§ћ§ћћњћ§§ћ§њљњњэћљњњ§ћ§ћ;7>t[TJN@uўўѕљћћњћћњњћћњњћњћ§ћњіћњљњћљњњћљљњјљљћћњњыљњњћ8B\dWU?+8ˆђўўљљњњљўћњњёћљ§ћњћћњћћ§ћ§њћћјњљњћњћћњњх§ћ§њћљћњ0033>GO?BG\Аўўњљњљњњўљћћ§§ћњљљњћќ§њћњње§њћћњњћњћњћ§ўў§ћњњћљљњ*179:AHB8OLQЭўўњњћћљћћ§ѕћўћ§ћћњћњћ§§јћљњњћљјњњќ§ўўћћь§ћўћ§§.45703>G88?.bўўћљњњћњњћ§њ§ћћљњћњћ§§ћћњпћ§ћњћљњљјљљњћњћњћћ.,(*$!.;?L9WpЏўў§љњћћ§ќћњњљљњћ§§ћ§§ўћ§§юћ§ћњћљњћћњљјњњћћњћћрњ""$&,7:ABAU]OЕўўѕєѕїјљњњћћљњљњњ§ќћ§њћћњњљћћ§њћћќњљњћћвњљљћњ&348EJidШўўєѓѕѕїјњљњљљјљћ§ћћњњљњљћћњцћ§њћњљљњњћњћњњјјљћћ",188№@PF7FArцўўїјљњљњњѕћљљјњ§њњљљјјњѓљњћњњљњљњњћњћћъњћў§#!!(030+5?ZM8BSЅўўњћљњўљјјћљњћљјјњљћњћњљљњњћсњћњ§ћ§ћ0)$*550-.4?<7NEJНўўћјјљљ§јљјјїјћїјљњљљњњљјљјћћоњћњћљњњљњјљ1#&#(,3589CLSi^Cxыўўћљљњќљјїјјљњљўјљљћњћљљњњќћњћњњш$&#"((<9:;?IIC(4vсўўљњњљ§ћћњњљњњљњњљњљњњћћдњћћљјїљљ§§њћњћ§:L4)##2>>H89>QPG^Лўј§ўњњ§§њњљњљњїћљњ§ћћњњјјмњћљјјљњ"80!&)#)-378B5WНгмыѕјљљјјљўњљљњњћћњљјјлљњљљјјљљњA.,(&&!*,GF:JMT‚уўћўјљјјіљњјњљљњљјљљњњљљїљњњСјљћњ5.0"55:;5@S™њћєјљњљљњљњњћћњљњљњљњљњљљјњњјјљјљљњљњњл§ћJAL#! 59?9>?VFEСњўўљљњљњљљњљљќњљљњњљ§ћћњњјљљћЪњћњњћ„H;$*+(&!!27897?AL9hеўўћљњњјјљїїљјљљњћњњћћљњљњњљљњљњњ§ћћоњЗiH9&1+*"$+*99:?TN$^ђў§јњћњљњњћѕљјјљњћњљљїјјљўћњњ§сћ§ћћњШС„04F:52&(#",32129,>;JЕўўєњљљјљњњћћњ§њњќљњњљљљњљјљњњћћЬ§ћћњћљњКдЕ;+1<51%((!&)),.34>EC7gЭўўћјјњљљњљјјњљјљїјљљњ§љњјјўњћћњй§цєйa2I9.;9;4-.03548?@>BBF^кўўљњњћњјљњљљўјљљњљбјљјјћћњњћљњјњюјїЈZU,$>:3.!+:;48?<;ALN>uјўћјљњљљњњ§њћљљњњљћ§ћњњћњњћоњћјјљђчеФЖm;.>A@#.-55--002)I[bОўўѓјљјљњћњћћњљљњњўјљљјўљњњљњйћєыѓнМt0*4EF,.2.)+42:;8:FG:@^сўўјљљњћљјјћѕїјїјјўљјјљјљйјњћњжцњюзЅP+9I)*+3401408;<59745-–ўўћјїљљыјљњњћњјљљњљњњљљњњћћњљљњлѓўўѕыжЄiZA41,1;<40-112158((HrДѓўўїјїљљњэљјјљњћљњљњћњњ§ћњћћ§§дњЎЮкзхнК<7;A:0734732#!-2?A@Јўўћљјјњњ§љњћћўљњњбћ§ћћњњљњљФТИНбаеснШ—aQ;995&08.%.??@:8GTCVОўўљјјњ№љњћћљњњћњњљњњћњћћЮ§ћ•КИЮбазкуЪЕ‘Y2PA8..93.3,+078;OV>Geпўўњњљјљјјљјњљљіјљљњњћћљњ§§й‚žЩШИСбмњпдРr&9\?3243-.(%#&"075BFkўў§љљўјљљіњјјљљњћљћњњзћљљћ…ЇМШааШнгЭйдЏPB18345:;9*+*18;8;@9EЎўўќєјљњњїљћљњћњљњљљўњљљјгљЃДЉЈЕЈЏБЧЪЩУЌd>:B9984<951(387;LEJNdАўьШаўўљљјЩњљњљљјљљњћЅŸœ’ЌЭдЪЯаБЅЂNAO5.2 J;7+-+3IG<*Eˆ‘~ЇўўљјјљјљњўћњњШљћƒ‚‹{—ЎМШжбыЭВОЖqAmVA.1,.-MC>4%)EFEJPT`d:hхўўјїїљјљљњњљљХњљњњћ§ˆˆ‰АЊžЈЋАЩбЩВЗЌp.GE`тў§їјљљіњјљјњљљњњљљњвАВ’’”‚ЈРпѓюФБЧбДe?S`..)18*..1.839@GB@F@NwМўўјјњљњљњњљљўјљљЯm’‘•’–™НпэЯЊУбдж•>:>B-12>4>A@:745><5<9;0.3+18:.<;8™ћўўљљјљјјњћЮњљјїѕЈЋž•rŒЏНЌ˜ЌЉШЧУЋЦЧЏo2-;3.4748:3.1:34:J@+-]ЕўўљјїјљњњћњљљЮњјЅœ™{ЄЃЌСОТТЪЧОасжТŒI!EL143<3492((227.+.74(JЫўўјјљњгћљњљњњћњЊЋФ—Ž”ƒ{ЁЅЛШШЩаећуНИ•AQ?0824;?<5*+*2))В2IH05YкўўћјљљњњљњћњљњљњљљЏБВŒ—xS‚ИЌЊЖеребсЩЮЮЕiPA,:25511*#""&51"1dѕўўјљљњњФљњћ§њћњљњЈЂ™‡АКƒˆЁ›Ё‘ЃРЮНЪЭпбЕؘ;EB?<@LYLiŠСўўћ§њћћ§§ћћ§њ§њ§§іў§ў§ў§ў§ў§§ћѕ§њћњћћўћ§ћ§§ш)*.5958GJYL^jeУўўљјљјћњћћњќћ§ў§§њћ§ћ§§ћћњў§§ћ§ћћв§ћ§ћ§ћћ§ў"&5,47FEOCQ]pдўўѕљѕљњћњ§њ§њњћ§§ўћ§њњћ§ћ§јўњ§ћћ§§ћћњу§ћ§&!.:9??CCYNFZN}юўўњњћњћњћћ§§њ§§шћњњљљњјћњўћ§ћ§њћњћњћ§§ћ§§ўй*(+8:3-?INbQLN`А§ўўњ§ћ§ћўћўњћјћњўћњјћњњћњўћћљ§ћћЫ§ћ§ћўћ§ћ§§ў§ў32-,-?:279HNFE[IOСўў§љљ§њ§њњљћљњјњњћљњљњњз§њ§љћњњћћ§§ћ§§ўњўњћњ§;1+*#-)AF:;EMaroQ}пўў§њ§њњћљњљљњњѕ§њ§њ§њ§њ§њћћўўћћ§п5&7)&,?I:GI^TL+8hбўўљћњћ§§ћўћњћћЦ§њћњћњ§њ§ћ§ћ§ћ§ћ§ћ§љ§њ§ћ§ћўћў@Z4+*#7JH[EEPd]SnТўї§ўњћћ§ћћяўњ§ћћњ§њ§љњњћњћћ§§јћ§њћљњњћћнњћњў(B?8$%02!)*2;?HFI5ZЖСРйѕћњњљћљљќћњ§њњ§љ§њњћЫ§ўћњљћњћћ§њћљњњћA1.4$+*$#!+4)A[UJQOL‚Яцѕўњљћљћљћљћњћњњў§њњ§§љњњЗћњњљњњћњўћћњћћ§343!(22AHAJCBU”ёяѓћњћћњњ§њ§ћ§ћ§њ§ћњћњњ§њњћўњњљ§ћћњћћ§х>GP%%+$$AMMGMQTCJСыўўњњћњљ§њ§љћћѓњћњћњ§§ў§ћћ§ћћд§ћ§ћ§§ўgAA(*2+-$"#,>;8ALFBQ?J>G?HJTСўўёњћљњњћћў§§ћћњўњњѕ§ћњњћњ§ћ§ћ§§ћи§Є’4*,72,.%1*.8<@<;NTOJ{кўўћћљ§љ§њ§љћњњњ§љњљ§ћћіўњљљћњћ§§ћћм§ЭжЏW0I;->@59:44CCFCBLQSUUrтўўњћ§ћћњ њћжњ§љћњћћўћ§ћћњўйтч–NU0$8B5&&5IBFC@GJNabSўўњј§њћўћўњ§§ћіњ§ћ§ћ§ћћњ§§ћњтћмаИЎd47GH3018;8C93BA:?VjwЩўўюћљћњћћ§ћ§њ§њћћўњ§њњтљћљ§ћўћњљћњ§еЮкԘ]2%>GN,2994.+,??71:3@FL?ocSЖўўчљ§љњљћјњњћњўљњњ§њњљћњћћўћћмўћў{ЃЕ‰–’…˜|PLP8:-.35:1925:?C@H?Etшў§ћћћњћњћњњў§њњќљ§њћћўўњњн§ƒr•›’НЦРvF:0H;"&750%.*5?AACGNPQАўўћїњћћўњћћ§ћћќњ§њ§§ћ˜њћњћ•œ‚—ЈЗАРВЄtSJ43<.?075@97EGLOOYdYiдўўћљљћљњњћњўћћњ§§ћћњћўћ§ћ§ћ§§ўS~wЄЂЅЕОНЉ•pI2TI0<8>??C8-FEHEbcYYwыўўэћ§љћјћљљњњљ§љ§њћњ§ћћ§йў§ўLbŽ˜”ЛФнМЌ•Y;a;:.930-7<@:43G3BUVxўўљњ§њ§њ§њњљњћ§гњћњћњ§њћUtЁЅАУЖЋЗЇ„H;1&(+8>JGL93@;E?EVMWЖўўјњўўћћћ§њћћњњЧљ§њ§њ§љћљњp~ru‡uwvœЇ•~o^>;A48:5;HFEF?;E;^Wb]uТўюЩаўў§њ§њњўљњњў§њњЬ§њ§h`ad`zžЂЄŸxuwC5N<-( $ZOMI?CB[YL?T›ЅŠВўў§љћњ§њњїљћњ§њћћўћћЪўEQVJbˆ˜ЃЊСЄ—˜m@^M<21)8>[TSE;@MP[\gbjk>gыўўјњјћљњњћњњў§њњЦ§њўћўO^]ujx|…œЂЃ‡„c13F&55OLOC?4GFSMbYPGOkИўўњћљћљћњ§њњФћњњ§ћћ§§‚c%dbeN}œ˜БК‚˜™[;A>%%+4>BFF>AEOGEMVSMJLxЧўўћљћњўћўћћњ§њ§њ§њњЧB^^Q[\^hКЫЉvŽЏЈ|7%>*-%;.BHOSEIEGINS\ZPd˜щўўћљћљљњ§њћљ§њњŽћњњљњZckb[m‡ЏКпОžžŽz—‡],78)4577LCE7?B@JELG?HCB–њўўљњњ§љћљћњўњ§ћўљћјјnnga7OoŽxd‚wžƒ|—‘‰c)$-40#IALAB>G@??;UM35bИўўњЖ§љћљ§њћћўњ§њћњњoZWW;eg|‰‹••Ÿ–ЁАЁ‹`5?F:+<>;FA@9<2E?<438<>Vйўўћљћљћљ§ћ§ћћњњЦ§ћ§nt][WFMgj’”ЁЁКшЧ—}nBI3*48?IP@A<7:87;92NW;9cчўў§ћњ§њўћћнўћћњ§љ§wtYV9I{tcxЃДЉЇЯЁЄ™‘]A828??я>C>@<95.(+:;+,7tўўўљњњћћњћћ§§ћаotbTr…HQnchWkŒЁЁЄСЊ~Ќ’;8)9::E@<873(,1,+7418B:™ўўИљћљњњ§љ§њ§љ§њћrztiZc]edkk~ou‘”‘ž™аКZ))%3@NCCG>35.**01+-..-PŸўўћљљћњћњћћФњћњњ{qgobdV+`–œŠ‚’Œ…„…™p35?9G:?C<0*!)-53BBFCAHWрўўћљћњћћ§ћЮixpieir[oouhM‰ЌŠ‚…{t”лэ‰#0:7><54>1"".33.E7?…ўў§љћњњЦ§љ§њ§њ§w|iijuY`egprnnrtqv}‡xƒtPUT5F?I;2,20)18@79>E@1?>‹ўўњХ§њћћ§ћ§ŒedkrTA@E^b\^gt{zrv||~n‚pkE2GEH;5<75*,8BF,:9BCC[W›ўўњХљњњћњў™wgwx‹oˆi`M?d„nzx~{v}}ˆžqbNFTZQ;?C9<10E@E3.05BHWT[ЕўўТњ§њњљћљ§С’N‚‚‰ŽЁ…MHLTxu{x~|vzxŠ{nTjnS.-275)0cQ-12JrWdS[Ћўўњљ§њћњћћкВ—{{‹”ƒ‚™n``0Ncaw‚trwt{pvzM-PFE7G>??я0.),!?EIJSLgрўўљљƒћљћњњ‹„|~ˆ™‚kxgn^Ich‡ƒzzvtq|}{mt^5ATI2,:>3-97509BC@O&>Oљўўћњ§њћњћ–ސ„||qcgnZE[p~}opetut`k\C??**37<7<>>5.79B>@IB0]œўў§њћњњЦўС‰|~vkngi`grmo{u|x|pv}th`aetJ(9*;;32;*13&2548,@CLChpЌўўЛћљћњўiZkДŸoZ|wvdadhwwjtjuxž‹`wae^`ttiJI%3L+*(1$47413NUWH^.EРўўњљ§њ§ўw=§џ€<џ=џўw;џўw5џў€4 џўw2 џw0џўw.џў€-џ.џўw,џў€+џў€*џ+џўw)џўw'џ(џ(џўw&џў€%џ&џўw$џўw#џ$џўw"џў€!џ"џўw џў€џў€џў€ џ џўw!џў€"џ"џўw#џў€'џўw(џў€)џ)џ)џўw*џ*џ*џўw+џў€+џўˆ+џ+џ*џўw+џўw,џўw-џ-џўw.џў€/џўw 0џўw 1џ 1џўw 2џў€ 3џ 3џ 3џ њјћљ§њ§§ўљ§§њя§ћў§љћўўњљњ§ћљјљ§§ћљљћјјћљћљљрјљљћћљљћљњјњљїїљћћљ§њњ§§њљ§§љ§њ§§ћљ§§њ§§ћ§ўћ§§ѕњ§§јљљћљјјљљ§њїљћћјњњћњ§§іўњљјјїјћ§ўў§јњљћљ§њў§§љѓ§ћћњњљјјљћ§њ§§љћљљћљћљљљ§њ§§њљћћ§ўћљљсњјњјћњїїљјљћћ§њњћљћљљј§њњћљјћљћћњяљјћљјљљћљљ§њљћћљ§§њљћћјњјјљјўћ§§юљ§ћћљљћћњњ§§љћјјљјјљљњњјјїћћњљјњљљ§§јяљћљјјћљњћљ§§њ§§љћћјіњћјјњјјљћ§§ѕћјјњњїѓїљ§ћћьљћћњјњјљћћјјїјўў§§ћљљћѕљћ§ћљјјїјљћћь§њњ§§њњ§§њјљћћњѕјљћ§§ћћњјљљћћјњљўњ§§ћў§§њ§§њњ§њ§њћљљўњ§§эљ§§љјѕїљћњ§њ§љљћљћ§§ўњљљљћљћјћњљљљњ§§љљњўў§ѓў§§љћљћћљљћљ§§ќњ§ћљљќјљћљљћ§ў§ћњ§§љћљјїјљћћїыјњљћљ§љјјћћѕїїј§ћљљћљљђ§љћћљ§њ§ћљљњњћћќ§ўћ§§њ§ћњљћљћћјњљ§ћњ§§ћўљ§§§љјћћїјљћљљћјћ§§ќљјљ§§љ§єў§§ў§њ§§ћјјћћћљјљљ§§ўњ§§ћћљњњ§§ћћљћ§њћћ§њјїјїћ§§њ§њ§ћ§§ўњ§§њўљ§§ћчљћ§љћћљћљљћћљћљљћ§љљћљћћљљѕќїјњћћьљћћљљњћћ§ўњ§§љ§њњћј§§ћњљњњјјњљњћјњћћ§ћјїїљљћћјњњїїђјњїљћљћ§ўўћўўњњїљњ§њ§§њљ§§ћњ§ћћљљњћ§ўћў§§ўњ§§ѕњљћѕјћјћљљњњѓљїїјїјјљљ§њњ§§їў§њ§њ§§љ§§ћўћ§њ§§ўу§љјјљ§§љјњћћљњјјћљјњњјјњњљћјљљњјїјљћјјїќјљћ§§ћљ§ўњ§§ћљ§ћљјњњљљѕјљјљћћљњ§љћћцљћјјњїјїјњјјњћћјњјјљћћљјјњњїіјћћ§њ§§љј§§њўћљљ№ћјјњћћљљјјњљњјљјјёњїјљљћћњљћњћћњ§§ўњ§§љўћјјёњљјјљћњњ§§њ§њњ§§љћјњњћ§§ќљћћ§§ћўљ§§ћњ§§њ§§ѓљћљћћљїљћљћљ§§њўљ§§њљ§ћљљћјњњќ§ћњјјыњљћњћєїљћљћњћћљљњљћћ§§ћ№јњјјњћљ§§њ§ћјїјћћ§њ§њњ§ўљ§§їњў§ћћљјјћћцњ§ћљљњјћћљћњњћ§њњћћљћћјћљ§§вњљћћјњљћјћћњїєљњўў§§ўћњ§њњћљћћ§јљћћљјљљћљљ§§љћћ§љјњњ§јљ§§њ§оњљљћћ§њ§љјљ§ўў§њ§§њњљљ§§љњњ§§јњћљ§§ўє§њ§њ§јјћ§ўўњњї§ўўћњ§њљ§§ћј§њњ§§ћўњњс§љћћљ§§њњ§§љњћљљјїѕїјљ§ћљљћ§§њљљѕјћљћњљњљљћљљ§§љћћлњ§§ћљњљњњў§§ўў§ўўћњћћљћњ§§њњјћјњњћљљћћњљћњљћ§§ўѕњ§§ўў§§ўўћ§§§ћљ§§юљјћћјљћњ§§љљјјљјћ§§ќћ§ћљљ§јћ§§ќћ§§ћћќљјћ§§ћћјљ§ўў§§њ§§њљљ§њ§ћћ§§ћљјїјњњїјўњјјћїњљћљљњћљћљћљљћѓњјїјјљћљћћњњўў§јњљњњ§§њ§§їѕјћљјїњјљћљћћ§ѓћїјїљљјћљљћћ§§ћ§іўћ§§њћјјћ§§њњў§§љјњњћќ§њћ§§њр§њљћљњћљћћ§§ћћјћљћћљјјњњћљћўћўћјјљћњ§ўћћўў§ћњ§§эћљјњјљљћћїјљ§њ§љ§њ§§њљ§ћєљјњїєѕїљјљљћћљљћ§ћћ§§љљћўјћћпјњњїљљћћјњљ§њ§љћњ§§њњ§ћљљ§ћ§њњћњљљќјљњўўћ§ћљћљљљћ§љљњњћћјћљћ§§љљї§њљћћњ§љћћ§љќњ§њ§§љѓ§њ§§ћ§њ§§њўўћћўў§§їў§љ§њ§§љћћѓљјњјјћ§ўћўњњ§§ћђ§љћљљњ§§љљ§§њљљїћљћ§њ§§ћ§§ ў§ъїљїњљљњјљљћњњјљљ§§њњљћћѕљћљљћљ§ћћљ§§іљјњћ§§ћћњ§§ўћ§§љћ§§ў§њљљ§ќљјњљљјщїѕїїјњњј§§њљ§ћћљћ§§њ§љћћъј§ћћљћ§ўћњўћћўў§ўњћљњ§§њїњњ§њ§§ѕјїјњћћљљњљћћљљћљњ§ћ§§ћљћћјћњњ§§ћјћ§њ§§ўњ§§ўѓ§њњјїњљћјћљљјјщњїјћљљћћљјњ§љћўў§ћћ§§љћћѓљћћјћћњјљћ§§њњј§ўўћў§њўўћјњїїјјы§њњћљљћљћћїјћљњњћ§§љ§§ѕћљ§§ћ§§ў§њўў§ћњўўёњў§§ћљ§њ§ўўљњјњњљћљќњћћљљјњ§ўў§ўў§§јўћ§§њ§љћћњњћњњ§њ§§њћ§њўўњњїў§§ўљљјјњњј§њјљљњјљћћјљљхћњјћ§њ§ўњљ§§љћћњњјјћ§§љћњљ§§ўъћўћўњ§§ћљљјњљїїјњјћњј§§ќњ§њћћќјћљ§§§ў§ћћўљјјћњ§љћ§§ћўљћћњњ§љћњћћљћ§ъњћ§§ћћјљ§§ћљљњ§њњў§§њ§§ќњ§љћћўљ§§шћјћ§ћњїљјљ§ћ§њњ§љћљљћ§њ§§ћёјїј§ћћ§§ўћћ§§ћ§§њ§њѓ§ћћўў§§њњјљћ§§ыњјјћљјјњћћљјјѕїѕјњјїћћђњћ§њ§љњњљњўњњћћ§ѕўћћњћїћ§њњ§§ў§ьєѕїјћјљјљљњјїљїјјћљјјўњћћїљњњ§њ§§јћћњћљ§ќњ§ў§§ыћўў§§љљњљљјјљљјљ§њљљћћј§љњјјхњјјћјћћљћ§њ§њ§њ§њ§ћ§њ§§њ§њ§§ќћњ§ўўпѕєљњћљћљћњјјљљјљћјјњћјјњјљћљљћ§§љљћ§њњ§ўў§ѕў§§љћњњћљћ§§њ§њњїїњїјјсїњјјњјјњјћћњњљљњљљћљјћљєњјљћљљ§§ѕљњїјљњ§ћў§ћћ§љ§љљ§ќљњћљљўјїїњїљћљљјјљћ§§їљїљњљљјљјјћэљњ§њњ§љћјћљћ§њ§њћњ§§ўћљљјЛњљћљјјћјјљњ§ћ§ћўў§§љјћ§§ћћ§ўў§ћћјњјљљћ§ўў§ћљћњњљјњћўў§њњ§њ§ћљљћ§§њљљћћъљјњ§ћљљћјјћјњњјјњњјїљћћљќ§љљћћ§§ўњ§§њу§ў§§ѕєјјћћљљјјљћњ§ћћ§ћїјљћљљћћ№њљѕєњљћљћћ§§ћћљ§§ѕљћјјћ§ўћљљ§§єњ§њ§§ўљљћљјљљєњћћјјїїљїјїјјљї§њ§њћїћљ§§ћў§§ћњњ§ћњ§ћ§ўўљ§љљ§§њўўњїјјљљњњјњїїњћјњњљљћљљэј§њњћљћ§њњљћјљњћћ§ўўїњўћў§њ§љ§§єў§ћљћјњјїљїјјѕљћљљјњјћљј§§ћјћњћљљћўљћћј§њўў§§ћ§§іњ§§љїћ§њљјјьљњњћњњјјњњљ§§љћљїјћљљЯјћљјљњ§ћњ§њ§њњћ§§њћљњћљљјњљљњћўўћўњћћўїљћљљїјјћљ§§№њ§љћјњљћљљћљћљћњњ§ћњњ§њ§њњ§§ ўћѕјїљјљљњљћћљљќњ§§ћћљћ§њ§њњјў§њњљћћ§§њ§ўљћћљ§тљћњћљ§§їїњјїјјњ§њ§њ§§ћћ§§ћћјјљљћљћјћ§§ћћљјњѕ§љљјїѕєѕјїљљ§ћљ§§нўљїљїјєјњјїїјїљћћ§§љћїѕѕљљћ§§љћјљћ§§љќћ§њ§§ќњљћљљћ§ёњ§њ§§љјњјћљљњјњњўјћћћ§њњ§љљјїјљы§њ§§љљћњ§ћљјљ§ћљјњљњ§§ўњўў§ђњ§§ћљћљћћљљѕљјјљѕњ§јѕјњљћћ§ћћќљњ§њњ§ўўњњю§њћљћ§њ§јљћљћљњ§§ўў§їћљјњїјљљјјћѕјїјљљїїљ§§њњўњљјъљћњјљљ§§љњћ§§њ§ћћљњ§њ§§њћї§ћ§ћўћ§ћ§§ўўћўўё§ћ§ћњћ§ћ§ћ§ћњњћћњ§ћњћћ№њћћњћљњњјљљћњћћ§§јћ§§ћћ§ў§§ђћ§ћ§ў§ћ§ћ§ћ§њћћћўћ§ћ§§їћ§ћћњћ§§ћћ§§ћ§§ўћњњљЮњ§ћ§ћ§ў§ћ§њљњћћў§ўћ§ћ§ћ§ћњћ§§ўћ§ћ§ћ§ћўћ§ўў§§ћњњћњ§§ќћ§њћћўњћћ§ѕћ§ўћњћњ§ћњћћњљњљњњљљєјњћњћћ§§ћћњћћ§мњћћњћћњћњ§§ў§ћћ§ћћњћћ§§ћњћћ§ћ§ћ§ћ§ћњњўљњњћњћљ§ћўћћњћћўњ§§ћњўјњњќћљљњњьћњћћњљћћ§ћ§ћ§ћњњћњћњњђћљћћ§ћ§ћ§ћћњћњњќљњњћћ§§ћњњыљњљњљћћњњћњћњћљњљњћћњњјћњў§§ћњћћљњћњ§њћњњћњњћњћњ§§ўћ§§ўћ§§ћћњљљњћћэ§ћ§њћљњћћњћњћњњљњљћћ§њћ§ў§ћ§§єћ§ћћ§§ћ§ћ§њћћ§ёћ§ћ§ћўћ§ћњљљћћ§§ћјњћњ§ћ§§ћћќ§ћ§ћћ§њћ§ћћ§ўўљћ§ћўћ§ћћњћћ§ћ§ћ§§ўњћћўњћћќњ§ћўў§§ћ§ћћњћљњћћљњљћћѓ§ћњњћњ§њћ§§њћћђ§ћћњћћ§ћњћћљљњњ§ѕўћ§ћ§ћ§ћ§ћ§§§ћ§ћћњўћњњљћ§ёћ§ћћњћћ§ћ§ћ§њћњњ§ћњћћї§њћ§ћ§ћњћћў§ћћї§ћ§ћўћ§ў§§ћ§њћћњћњћћђ§ћ§ћ§ћ§ћ§ћ§ћ§ћћч§ћ§ћ§ћ§њћ§§ћ§ћћњћњћ§ћњњћ§§њљњќ§ћћ§§ќњ§ћ§§ўћ§§їўћ§ћ§ћ§њћћўњћћњћјњ§ћћњћњћћјїљњљњћњћњћћїљћњ§ў§ћћ§§ѓњ§ћ§ћ§ћ§§ћљљњњњћљњ§§њњћћњћћ§§§њћњњћњљњњљћћњћћў§§ў§§ѕў§ћ§§ћ§ћ§ћ§§ўњћћўќћ§ћ§§ђћ§ћ§ћћ§§њ§њћћљљіјљљњћњњћћ§§чћ§ћўћ§ћ§ћ§ў§ћ§ћ§ћ§ћ§§ўћ§ћћўу§ћњњћћ§ћњљћњћљњњћћњљљњњљљћћ§ћћћњћњћњњљєњћњ§ћ§ћћњћњћћ§§ћ§§њћ§њћњћћќњљљћћ§јњћћѕњћћ§§ћњћњћњњўљњњяљњњљњћњљњњћћњћњњљљњєћ§ћ§ћ§ћ§ћ§§ћћњѓљћњћћ§њљјњњћњњяљњњћћњњљћњљњћ§§ћ§§љћ§ћўћћњњіљћњњћњ§§ћ§§§ћ§ћћћњљњњ§§љћњњ§ћ§њњћљ§ћ§ћ§ћ§§јћ§ћћњћњћћћњћњћ§§ќћ§ћ§§ћўњ§§ћўљњњђљћњ§њћњћњћњ§њћћјљћњћћ§ћњњјљњњљњћћ§§њљљњњћњњ§§њћўћ§ћ§§ќњћћњњ§нњћћњњћњћњљљћћ§§ћњћњњћњћ§ћ§ћ§ћћњњљћњњзћљљћћ§ў§§ћўў§ћ§§њћћњ§§ћњћћ§ћћњћћ§ћћњћњћћ§§њћ§ћ§ћ§§јћ§§ћћњњ§§іћ§ћ§ўўћ§ћ§§ћ§§ћ§§њћ§љћћ§§ќћ§ћўўєћ§ћ§ћ§§њћўў§§ћћў§ў§§ћљ§ћ§ћћњ§§ћћ§ўў§§њћњњћћ§§ић§ћљњћћњљјљњў§њћћњћ§§ўћћ§ћћњ§ў§ўћњћћў§ћњњ§ћѕ§ћ§§ўћ§§ўћўўј§ўўћњ§ћ§§ћћњњљћћ§њћњњьћњ§ћњ§ћ§ћў§ў§§ћў§§ћўўыћ§ћ§ћ§њћћ§ћћ§ћњ§ћћ§§ћћњћјњћћ§§њћ§њ§њћћщњћ§ћўћ§њћњћњћћ§ћћњ§ћ§§ўў§ѓћ§ћ§§ўћ§ћћњ§ћћќњћњљљњўљњњ§ћњћћњњћњћњћћрњћљњљњњћњћњћ§§ўў§ўћ§§ў§§ћ§§ћћ§ћљљњњћњљљњћћіњћћ§ћ§њћњћћљњћћњћћ§§љњћћ§ўў§§ўћњњѕ§ћ§ћ§§ўћ§ћ§§љњ§љўћ§ћ§ћ§§§ћ§ћћщ§њћњњћ§њћ§ћћњњћњњљљњћњўўњќћ§§ўўќ§ћ§ћћњ§љњћћњњўћ§§ўў§§јћ§ћ§ћ§§ћћя§ћ§њћњћћњљљјјљјњћћўњћћљњ§њњћ§ћћќўћћњњїћњћњњљљњћћњіљћћ§ћћњ§ћ§§єћњћўћњћ§§ћљјјњњћ§ў§ўўћўњћћўњћћ§ќћњћњњћў§ћћ§љћњћ§§ћњњћћ§ћћ§§§ћ§ћћћ§ћ§њ§§ќћ§§ўўюћ§ћўћўћ§ћ§ћћњћћњљњњўћўў§јћ§ћ§ћћњћћљњћћ§ћ§ћћ§ћќњћњ§§ћї§ћў§ў§ў§ўўѕ§ћћјљљћћњњћћљїњћћ§ћ§§ћњњмћњћћњћ§њњћ§ћ§ћњљњћ§њћ§§ћ§њ§ћ§њ§ћўћ§ћћћ§ћњљћћњрљћњљљ§ћ§§ўћњњћњ§ћ§ћћњћњ§ћћњћњ§§ўўєћў§ћћ§ћ§ћ§ў§§яћ§ћ§њњљњњћћ§ћћњњћћў§ћћї§ћћњћњћњћћњїў§§ћ§ћ§њ§§ьћ§ћ§ћ§ћ§ћ§§ўћ§§њњљћњњћњўљњњћњћ§§ћўў§њњћ§ћћњћћљњ§њњљњћћ§ўќћ§§ўўўњљљњћ§ћ§§ћћ§њћњњњћ§§њ§ћћђ§ћ§њћћ§њ§ћўћ§ўўў§ўўќ§ў§ўўѓћ§њўћ§ћў§ћљњљљћљњћ§§њњћћ§ўіћўў§ћ§§ўћ§§ћѕњћњ§§ў§§ћ§ћћ§ќћ§ў§§ўћњ§ћћњњљљњћњ§ћњћ§ћћјњљњћћ§ћўўшћ§ћћњњљњњћћ§ћћ§ўћ§ћў§ў§ўў§ћњјјљљњљњњ§§їћ§§ћ§ћњћњњвћ§њћ§ћ§ћўћњњћњћњњћћњљљћњ§ћ§ћ§ћ§њћњњћћњњ§§ћћљћњњћпњћћ§§ўћ§њћњћћ§њћћ§ћ§§ўћћ§§ћ§ћ§ћћњњћќ§ћ§њњљ§њљљјњћћ§ћўњ§§ќћ§ћњњћќњ§ћўўј§ћњћћ§ћ§§ќћ§ћ§§ўќ§ўћ§§єћњ§ћ§ћ§ћ§ћљњњіћњњљћњћћњљљњњљњњћњњ§§њ§§эў§ў§§њћњ§ћ§§ўў§њћњ§§њћ§ћ§ћўў§яћїјљњћњћ§ћћњњљјљњњ§ћ§њњњљњњћћ§§њћ§њћњљљзњћњћњћњћћ§ћ§ћўћ§ћ§ўў§§ћљјњћћ§§ћћ§ћћ§ћћњћњњ§ћљњњўљњњњћњњћњ§§ўњ§§ђћ§ћ§ћ§ћ§њ§ћў§ўўњ§јљјљћћюњљњњћћ§ћћњњљћњњљњћћ§њ§ћћ§ўўћ§§ћєњ§§њћњћ§ћ§ћ§§§ћњљљўћњњ§ћљњњўљњњ§ћнљћћњћњњћћљњћњћћ§ћ§ћћљћњћ§§ўўћћњћћ§ћћћ§ћљњћћ§њћљљћїњ§ћњћ§ћ§ћћњ§ћћ§ћњњќћњћ§§ћњњ§њћњ§§њў§§ћ§ћћњўљћћњїћњњћ§ћњћўўћн§њ§ћћњ§ўўћћњњљњћћњ§ўўћњћћ§§ћњљњ§ўћ§§ўњћћ§ћњћћњњћ§§ўњћћњљњќљњњћћќњћњћћњњћ§ћ§ћ§§ќћ§ћ§§шћњћњ§ћњћћњњћњ§ћћњ§њћњћњћћњяљјјљљћњћњћћ§њњћ§ћћњ§§ўћћї§ћ§ћ§ћ§§ћћў§ћћњіћњњљљјљњћњњћё§ћ§њћњћћ§ћўћ§њ§§ћћ§ћ§ћћўћњў§ћў§ўўі§љњњћћљњљњњ§љњљљњњљњћћњћћ§ќњћњ§§ћљ§ћ§њњ§ўў§ўў§§їў§ћ§ћ§ћўћћњќљјћњњѕћњћћ§љњњћћ§§§њљћћўњћћшњћњћћ§§ўћ§њ§ћћ§§ћћњњћ§ћњњяћ§§ћљљњњљњћ§ћћњћњњћй§њћњћ§§њ§ћ§ћ§§ћћ§§ћћ§њћћњљћў§ўў§ўў§ўў§ћћњћ§іћ§ћћњњљћњћћќњћњ§§њћ§ћћњ§§ќћ§ћ§§ўћ§§ўћўўў§ўўђ§ўўћњћћ§ћћљћњћћіў§ћ§њћњћњћћ§њћ§§ѓўћ§§ћњћћ§ћ§ћ§§њћ§ћћњћћї§ћћ§ћћ§ћљљњњћњњљ§§ћћњ§ћћњњћѓњћњћћ§њ§ћћњњћћ§ћ§њљјјќїљјћћя§ћ§§јљјњњћњљњљљњћћщњ§ћћњљїњћћњ§ћћњ§ћњћ§ћ§ћћї§ћ§ћ§§ћњћћђњ§ћ§§ћ§§ћћњљњћћ§љњљљњ§їћўћћ§њњљњњћ§ћћњ§§њћћѓњљћ§§ћ§§ў§ўћ§§ћњњћћ§ћњњћ§§ћ§§§ћњћћћњћњћ§§ћћ§ћў§§ћќ§ћ§ћћј§ћ§ўў§§ћћљњљћ§ћћњњ§ћњћћќњћћ§§ў§ћњўћњњћљ§ћў§ћћ§§їњћћ§ћ§ћ§ћјћ§§ў§ў§ўўњ§ў§ў§ўў§ўў§§јў§ў§§ћ§ћћ§њћўћўћ§§§ћўњњ§тћ§§ў§ў§ўћў§ў§ў§ў§ў§ў§ў§ў§ў§§ћўўі§ў§ў§ў§§ћ§§њћ§§ў§ўў§ћ§њў§ў§ў§§ћўњўћўўћ§ў§ў§§ўі§ў§ў§ўў§§ўўќ§ћћ§§ќў§ў§§щћў§§ћ§§ў§ў§ўћ§ћ§§ў§§ћ§ћћё§ћњ§њўћўћў§ўћў§§щў§ў§ў§ў§§ћ§ћ§§ўў§ћ§ћ§ћ§§єўћ§ћў§ў§ў§ў§§ћќ§ћ§ћћ§ў§ўўўћ§§ђћ§§ў§ўћ§ћўњўњћћшўћ§ћ§њћћў§ў§ў§ўћћ§ў§ћћ§ћћ§јў§ў§§ћ§ћћ§њ§ћћљ§ћў§ў§ћћўњ§§їћў§§ћ§ћ§ћћюњ§ћ§ћўћћўў§ў§§ћ§ћ§§ћёўћ§ћ§ћ§ћ§§ў§ў§ўўя§ўћ§ћ§ћ§ћ§ћў§ў§§ћћ§ѓћ§ћћњћњўћ§§ў§§њў§ў§ў§§§ў§ўўй§ў§ўў§ћ§ћў§ў§ў§ў§ў§§ћ§њ§ћў§ў§§ћ§ћ§§ў§ў§§јћ§ћ§ћўћ§§јћў§ў§ў§ўўў§ўў§ўћ§§єћ§§ў§ў§ў§§ћ§§іћ§ћ§ћ§ћ§§ўўь§ў§ўћ§ћўћ§ћ§ћћњўћ§ћ§§јћўћ§§ўћ§§њћ§ћ§ћ§§љћ§ћў§ў§§ћ§ў№§ў§ў§ў§ў§ў§ўў§ћ§§ќћ§њћћ§ѓћў§ў§ўћ§ћ§§ў§§щћ§§ўћ§ћ§ћ§§ў§ў§§ћ§ўў§ў§§§ў§ўўі§ў§ў§ўћ§ћ§§ъћ§ћў§§ўў§ў§ў§ў§ў§ў§ў§ўўљ§ў§ў§ў§§їў§ў§ўћ§§ўўщћ§§ў§ў§ћћ§њ§њўћ§ћў§ў§ў§§хў§ў§ў§ў§ў§ў§ў§ў§§ћ§ћў§§ћ§ћ§§ўћ§§ыћ§ћ§ћ§ћ§љћњћћ§ћ§ћ§ћ§ћћ§§ў§ўўё§ў§§ћў§ў§ў§ў§ўћћњўњћ§ў§§њўћ§ћў§§ћњўћўћ§ћћў§њњћ§ўћўўї§ў§§ўў§ў§§љў§ў§§ћ§§ўћўўђ§ў§ў§ў§ў§§ћ§ћ§§§ћ§ћћњ§§њћћ§ћў§ў§ўў№§ў§ў§ў§ў§ў§ў§ў§ўўў§ўў§єћў§ў§§ћўћ§§ћћќ§ћўћћ§§ћ§§№ўћ§§ћћў§§ћћњ§њћ§§їў§ўћ§ћ§ћ§§яћў§ў§ў§ў§§ћ§ћўћ§ћћѕ§ћ§њўћўћ§ћ§§ўћ§§ћќўћўћћќўћ§ћћћ§ћ§§ћћі§њ§њ§§ў§ў§§іў§ў§ўћўћ§ћћ§ћњћўўћћъўњ§ћ§§ћ§§ћ§ћў§ў§ў§ў§ў§§§ћўћћ§љў§ў§ў§ўўј§ўћ§ћћњ§§ўў§§ђў§ў§ў§ў§ў§ў§ў§§ќћ§ћ§§ў§љў§ў§ўћ§§їў§ў§ўћћњћћ§њћўћ§ћ§§оћ§§ћћ§ћў§ў§§ћўћўћ§§ў§ў§§ћ§ћ§ћў§ў§ўўў§ўўѕ§ў§ў§§ћ§ћћ§§їў§§ћ§њћћ§§ћћў§ўћ§§ўў§§§ў§ўўђћ§ћў§§њ§ћћњў§ўўў§ўўў§ўў§ўћ§§ќћ§ћ§§шў§§ћ§ћ§§ў§ўћ§§ў§ў§ў§ў§ў§§ќў§ў§§ўї§ў§ўў§ћў§§ќў§ўћћ§§ў§ўўј§ў§ўћ§§ўўќ§ў§ўў№§ў§ў§ў§ўћ§§ў§ў§ўў§іћў§ў§ў§ўћ§§њьљ§ћў§§ћ§§ў§ўў§ћ§ћ§§ўў§§ћў§§ћў§ўћ§§ўў§ўўюћў§ў§ў§§ћћњћћ§ћ§ћ§§їў§ўћ§§ў§ўўў§ўўў§ўўу§ў§ў§§ћў§ўћ§ћ§ћ§ћў§ў§§ћўњћћў§§ўў§§јћ§§ў§ў§ўў§іћ§§ўћў§ўў§§ў№§ў§ў§ў§ў§ў§ўћ§§ўў§§ўћћќ§њўћћћўћўњ§§љўћ§ћ§ћ§§ћћ§ћ§ћћѕњћћ§§ћ§ћў§ўўј§ў§ў§ў§ўўч§ўњ§њ§ћ§ћўњћћ§ћ§ћўћў§ў§§ћћќ§ћў§§§ћў§§№ћў§ўў§§ўћўћ§§ў§ўў§љћў§ўћћ§§ўђ§ў§ў§ў§ў§§ћ§ў§§љў§§ћ§ћ§§њћўћўћ§§ўў§ћћ§ў§ўўі§ў§ўћ§§ћћ§§еўћ§§ў§ў§ў§ў§ў§ў§ў§§ћў§ў§§ћ§ћ§ћћњћљ§њћ§§ћ§ћ§§ўў§§ѕў§ћ§ћ§ћ§ћ§ћћїў§§ћўћћ§ўў§њў§ў§ў§§ѓў§ў§ўћўњ§њў§ўўўћ§§јўћў§ўћ§ћћќ§ћў§§њўћ§ћў§§ўў§§єў§ў§ў§§ћў§ў§§ћў§ў§ўўў§ўўї§ў§ўћ§ћ§ћћў§ўўѕ§ў§ў§ўћўћў§§ўў§§ћў§ўћ§§іћ§§ў§ўћў§ў ўѓ§ўћ§њћ§§њћћ§ћћўў§§ќў§ў§§ўћ§§ђў§§ћћ§ў§§ћў§ў§§ўў§§ў§зў§ў§§њћћ§ћўћўњ§ћўћћ§ў§ў§ў§§ћ§§ў§ўћ§ћ§§ўћ§§ ўјћ§§ў§ў§ўўђ§ў§ў§ў§ўћћ§§ћ§§ўћ§§жћ§§ўћў§ўћ§ћ§ћ§ћ§ћ§ћ§њў§ў§ўћ§§ў§ў§ў§ў§ў§ў§ўўї§ўњўћ§§ћ§§ћћўњ§ћ§§ћў§ў§ўў§їў§§ћ§ћ§ћ§§ѕўћ§ћў§ў§ў§ўўў§ўў§њћњњљћ§ў§ўћ§§яћ§§ўћ§§ўў§§ў§ў§ў§§ўў§§ўў§ў ў§§ў§ўўћ§ћћ§§ў§§њћ§§ў§ўўќ§ў§ўўі§ў§§ћ§ћ§§ўўў§ўўў§ўўќ§ў§ўў§ћ§ћћњњћ§§ћ§§љћ§§ў§§ћћ§ў§ўў§№ћ§њўћўћў§§ћў§ў§ў ўљ§ўћ§§ћњњћ§§ў§ўўќћ§ћ§§ўћ§§§ў§ўў§§ћ§ћћњўћ§ћў§§їў§ў§ў§§ћ§§љћ§§ў§§ћћ§ўћ§§ќћў§ўў§ћ§§ў§§§ў§ўўљ§ў§ў§ў§§јћў§ў§§ћ§§ђћ§њћ§ўћў§ў§§ћ§§ёў§ў§ў§§ћўћўћ§§ўўя§ў§ўў§ў§ў§ў§ў§ў§ўў§§ў§§ѓў§ў§ў§ўћўћў§ћћј§ћўћ§њ§ћћ§ўћ§§љў§ў§ў§ўў§њћ§§ў§ўўє§ўћў§ў§ў§ў§ўўё§ўјћњћћўћ§ћ§њўњњћъ§ћ§ћўћў§§ћ§ўў§ў§ўћ§ћ§ћћѓ§ћ§ћ§ћ§ў§§ў§ўўќ§ў§ўўњ§ўљњњ§§ћћ§ћў§§§ћ§ћћўњћћљњў§ў§ў§§јў§ў§ў§ў§§§ў§ўўљ§ў§ў§§ўўљјњћћ§ћ§§ћћњ§ћ§ћўћћўўћћ§§ћ§§§ўћ§§ќў§§ўўї§ў§ў§§ўў§§ѓў§ў§ў§ў§ўњ§њћћўњћћѓњћћўћ§§ў§§ћћ§§љњ§§ўћў§§ѕў§ў§ћћў§ў§ўўќћ§ћ§§іўћў§ўћ§ћ§ћћњћњ§ћ§ћћ§§јў§ў§§ћў§§ёћњћћ§ћ§§ў§ў§ўћ§§§ў§ўўї§ў§ўћ§§ўћћќ§ћ§ћћ§§ў§ўў§ћўћ§§ўўњћўћўћ§§ў§јћў§§ћў§ўўћ§ў§ў§§їўћ§§ў§§ћ§§ёћ§§ў§ў§ўћ§ћўњ§ћћуњћћ§ћ§ћ§ћ§ћўћ§ћ§§ў§ў§ў§ў§ў§ў§§ђў§ўњўћ§ћўћ§ћћ§§§ўћ§§ћє§ћ§ћ§§ћњћљћ§§ќўћў§§эў§ўў§§ћњ§§ўћўћў§ў§ўўњ§ўћ§ћ§§§њ§ћћў§њњўўћћёўћ§§ў§ў§§ћ§ћў§ўў§їў§ў§ў§ўћўўќ§ў§ўўіњўћ§§ћњўњћћіњ§њ§ћ§ћћњ§§яћў§ў§§ћ§§ў§ўћ§§ў§§ўў§ўўі§ў§ў§ў§ў§ўўєћ§ћћњўњ§ћћњћћ§њўћ§ћў§§ћ§ѓўћ§ћ§ћ§ћ§ћ§ћўў§ўї§ў§ў§ў§ўћћќў§ўћћіњ§§ўћ§§ўњ§§јў§§ћћ§ў§§ѕў§ў§ўћў§ўћ§§ћ§ў§ўўў§ўўљњ§ћ§§ўћћ§њў§ўћ§ћћћ§ћ§ћ§§іў§ў§ў§ўћ§ўўљ§ў§ў§ў§§ ўќћўћ§§ћ§ђћ§§ў§ў§§ћ§ћ§ћ§§њћў§ў§ўўп§ўћ§ћў§ў§ў§ў§ў§§ћ§ћ§ћў§§ћўћ§§ўњњћћьњћ§ў§ў§ўћ§§ўћ§ћў§§ћ§§ўћ§§ћў§ўћ§§ёў§ў§ўћўћ§љћљћњ§§ѓћў§ў§ўњ§њўћўћћЭ§њћћ§ћ§§ў§§њўњ§ћ§§ўћ§ћў§ў§ў§ў§ўћў§ў§ў§ў§§ћў§§ћ§§ў§ўўѕ§ў§ћћўћћ§ўћћ§єў§§ћ§ћўњўћћ§§ќў§ў§§ўў§§ѓў§ўћ§ћў§ў§ў§ўўє§ў§ўћ§ћўћ§ћ§§ћњћњћ§§щўћ§ћў§§ћўћ§ћ§§ў§ў§ў§ў§ўўь§ў§ўћ§ћў§ў§§ћ§ћћўў§ўўћ§ўћ§ћћќ§ћ§ћћ§ўўћћї§ћўћў§ў§ўўћ§ў§§ћћќ§њў§§яў§ўћў§ў§§ћ§§ў§ў§ўђљјїјљ§ћљћљ§ўў§§ќў§њ§§ћњ§њљћћ№љћ§ћљћљћј§§њћћљћћєљћљћњјњњјїїјјў§ђљњ§ў§ѕљјљљјљњ§§єљћљљ§ћљљјћћјјљч§ћћљћљћ§њ§љ§ћћњљљјњћћјјњўў§ђљћћ§§љљєљїјљћ§§љћіљћћјјћћњјњњљіћњ§ўў§љћњћћјўћљљј§ћўњњ§§ўўјњћїјљ§§ћћљнћ§§ћјњїћљњљљћјњїјїѕњћћњћјјћњњ§§ћћјћћљ§њљ§њљўў§љњ§§ћўў§§ўњљљћєњћ§њњ§§љїњїјјњњћћ§љћћљыјњјћљћћљћњјћћљљћљљјњљљќћљљћћљњјїѕњљћћўљјјћўљјјїњљћјћљјћ§§чљћћјѕїљїїњћљјљљїћћїљїљњћ§§цњ§ћљћљћњјљћљјљ§ћњњјљ§§ћњњћћўњћћљњ§ў§љћјјњњјљљ§њ§§ўљ§§љњћўў§њ§§§ћљћћјљјћљћљ§ўў§јћљћјњјјћћјіїјљљѕљ§§ў§§§ћњјј§§њ§§ћ§ќћљљћћ§§њљћћіљ§§њ§§ћљћљљшњљ§јјїњўњ§њљљјљћћљћјњћћ§§ћюљ§њћћљћћјјћњјњјћћњњћ§эњћ§ћљћљљћћљјјљїњњћљљ§ћљћћ§ўљћћћјњљљћћыљњљћћјљљј§њ§љљћњњ§ћљ§§ў§ўћ§§эњљћ§§ћћњ§њљљњ§§њ§§ћћ§§ћў§§љ§ўљ§§§љћ§§њс§ў§ћљћћњ§љљїљћњјћ§љћћљћљњ§љљ§§ћћюљјјљјјљћјљњ§§њњћћљљоћљћњњљљј§§ћљљћћљ§§њћњїјјћћљјњ§§ћљћћљєћњ§љљћљљћљћ§§ўњ§§ћ§ьўћўћњћўў§њ§ћљћ§љљћћ§§ўњўўѓ§ўўњ§њ§§њ§§ћљљ§ўњљљўњ§§ўјњљњљ§§њ§§ў§ўњ§§ёўћ§јјљћћјјћљљњ§§ў§ќўњњ§§пљјћљћћљј§ћћњїјњљћјњљљјљјјљљћћљњљћћ§њћљљћў§њњћьњ§§ћ§њћїєњћћ§ў§љћњћ§§ўњ§§њљњћћњјјњўљјјћч§њ§ћћњўўњћўњњ§ўћў§§њ§њњў§§ўѓњ§ў§§њ§ћўўћў§§ќљћћ§§ўњ§§ўь§њњ§ў§§ўўњ§њњљ§њ§§ћљљў§ўўќћњ§љљђњ§ћў§§њљјљ§њ§ўў§єљ§љ§љћљљ§§ћўў§їњљ§§њ§§њ§§ќњ§§њњ§ўћ§§ўњ§§ћўњ§§њњ§ћў§ўўѕ§њњљ§§ўў§њ§§ ў§њљ§љњјїјћљ§§ќў§њљљњ§ћћљћў ўћ§ћћњњљ§§њў§єјљћ§ћўўњ§њ§ўўў§ћћљљјјћљљ§§§ўњ§§љћ§њ§њњћћњ§њј§ћњћ§§њўўўћўўі§љћћ§љўў§ўўўћўўњћ§§њњ§§ўљ§§§њ§њњћљќ§ћљ§§љњ§њњћљ§§њљїјћњ§§ўь§њњ§њ§§њљљћ§§њњўўћћ§§ў§єњљ§њў§њ§§љљћћ§љћў§њњћїј§ўћў§§њ§§ѕњјљњњљљ§њ§ўўўњ§§њўўћўўњ§њљ§§ўўљ§њњ§јњўў§ўћў§§љћ§§ўљћўўћўў§§ўђћ§§ћљјњ§њљљјј§§ћњ§њћўў§ћћљљњўўёњљ§ўўњ§љћ§ўћњ§њњќћў§ўў§ћћўўћ§§§љ§ўўќћ§њ§§ыњ§ў§јћљћљћљњјљћљћћ§§ўў§њѕ§њћ§њ§њ§ў§ўў§ўёњ§ўћћљ§§њўўћћњ§§ўў§§љљ§§ўћў§§њњ§њ§њўўї§љћ§ўў§ћљљћї§љћћјјћњ§§љ§ў§§ћўўўњ§§ћњљ§§ўўћўўћ§§ћњћњњ§§јњћљњ§§љ§§іћљћћљєїјњўў§ўќћўћўўўћўўћ§ўћ§њљљћћўњўўхљћћ§њ§§ў§њњўћѓ§єћўўњ§ўўћљ§ўўћћњ§§ў ўћўіњћћљ§§ўў§ўў§ёљњ§§ўљљјћњњ§њњћћ§ўљ§§љњ§њњ§ћўўєћњ§ўўћўў§њ§ўўјћўњ§§ўў§§њїћљћљћћљњўў§јћ§§љњ§њўў§ѕћњїљјћњљ§њўўњћўњћћ§§ќњ§ћўў§ћљјљ§ўў§ўњўўцћўўњўћўўњљњїјјєњјљ§§њў§њљјјѕљћјћјјљњ§њўўўћўўіњ§ћў§њў§њўўўћўўћўё§њћ§ћљј§љ§њ§§ў§§ћў§њњ§§ўњ§§ўћљљў§ўў§ћў§§ѓћўў§њ§ћўћ§њ§ўўу§ћљљјћ§ў§§ўў§њ§§њ§ўўћўњўўњљњ§§яњ§њ§§љњњ§§њ§§њў§ўў§њ§ўў§ѓљ§њћњњўњ§ћњ§ўў§§њћўў§ўњўў§ћў§§ў§љњ§§ћћўўћўўћћўў§ўўэ§њ§њњљћљјћ§њњљ§ћўћўўіћ§њўћўћўћўўўћўўєћ§§њ§ћўћўўћўўўћўўўћўўћїњћ§§ўћњћ§§ќњљњ§§љњўћўћўћћ§§ўњ§§ў§љњ§§њћћўўњ§№љјјћљњљ§њјћћњ§ў§§њњљњћў§§ўќ§њ§ўў§ў§ўљ§њљјјљћњњ§њњўўўћў ў§љ§ћѓљ§§њўўћўћћўњўў§ћў§§ў§ўўћўўћ ўњ§њњ§љ§§љњћљћ§§ўўнћўўћўў§§њ§§ўўћ§ћљћњћњћў§§ўўћў§ўўћћўўћўўћўўюњ§њћљћћ§њў§§ћў§§њ§§ћјћњјћ§ўў§ќљћљћћћљјјћњњўўћўў§њћўўў§ўў§ўњўў§љћљ§ўўћўўћ§ўњњўў§§љ§§ўў§§ћў§њ§љљўњўўќћўћўўўћўўќћў§ўўљћ§њњўћўўўњ§§ьњўўћўћўў§њљњ§њњ§њ§§ўўћ§ўћўўњў§њњљ§ћ§ўњћўўњ§§њ§§љљ§њњўў§§ўњўўѕ§љљ§ћ§њљћњ§§њ§§ўњ§§§љћўў§ћњ§§ћўћњ§ўўќ§њ§ўўќћњ§њњћљћћњ§§щљ§§њ§њ§љ§ўўљњљѕљљњњ§§љўўњћў§њ§ўўћўўњ§§ўљ§§њ§§ў§њў§њ§ўўіћўў§њњ§ўћўўўћў ўў§ўў§њћў§њћўўщћў§§ћў§§ўћљ§§њ§ћўўћћўћўўљњ§§њ§њўўўћўўћ§ўћўў§њћўјћўўћўћћљљ§ўњўўћўўўћ§§њјї§ў§§љ§ўўќ§њ§ўўћўў§§ќў§њ§§ў§§њ§§ўўћўўўћ§§ўўњћћјўљ§§іўњћћўљњћљ§§эљћљ§ћћњ§њњ§њљњ§§њ§ўў§ќњљћўўўћўўќћўў§§ќњ§§ўўћ№§ћћњ§њљ§ћћ§§ўўћў ўњ§їўћўў§њњ§ўў§њў§ўўћї§њўўћўћњўўљ§њў§§њўўўћњњєўњўў§§њњўўћўўўћўўњ§њћ§§ўўўњўў§ћўњњќћўў§§ќњ§њўўіћ§њљњўўћў§§љњљўў§§њњўњў§ўўќћўўћћў§ўўћўўўљ§§ўќћўћўўўћўўѕћўўљ§ћўћўћўўњ§їљћљ§њћ§§ўўєњ§§ў§§њњ§§ў§§ћўћњўћћўўћўў§ў§ўњўўѕћўў§ћљћљљ§ўў§ў§їњ§§њљљњћўў§ќћў§ўўћўљћўўћњћўў§§њўўў§њњў§ўћўў§ћћ§њћўўћў§§њўўўњўўяћўўћћњ§љњ§§њћћўћўўњћўћўћўўјљњћ§§ћљћћќњ§§ўўѓћў§§ћљњњћўўћўў§ћћњ§§њ§§ўњўў§ў§§ћўў§ўњ§§ўњ§§ћћўћў§§ўњўў§љўњћћђ§љљ§ўћ§њ§љ§ћћў ў§ћњћћћњћњћћшњћ§§ўћ§ћўћ§ћ§ћ§ћ§ћ§ћћњњћћўњћћљњ§§ћ§њћћёњћњћњћњљњљљњљљњњњў§§ћћ§§ђћ§ћћњћ§ћ§ћ§ћњћћ§§ћњњћњ§њњћњћћў§ћћлњљћћњљњћњњљў§ўћ§ћ§ћњњ§ћћјљјљњћњ§ћ§ћ§ћћњћћњ§њћњњљюњљњћћњ§ћў§§ћћљћњћњњћў§№ћ§§ўў§њљњћћ§њћњћћї§њњљћњћ§ћћѕ§њћњљњљћњ§њњ§тћ§њћњћњћћ§ћ§§ў§ў§§ћ§ћ§ўў§§ћ§§ћћњњћњ§ў§§љћ§ћћљћњњ§љњћћєњћњћћњљњњћњћћўљњњћњњћћњљћћўњћћњћіњљњљћњћњћњњќћњћњњўљћћ№њћњњ§ћ§ћћњћњњљјљљћќ§ћћњњєљјљјњњ§ћ§ћ§ћћњњћћљњћћѓ§ћ§њљљњћ§ћћљњњє§њћњ§ћўћћњ§њњљўњћћћ§ћ§ћ§§§ћ§ћћу§ћ§§ў§ўћ§ћ§ћ§ћ§ћњћњњћћ§њћњћћўўёћ§ћ§њћњњљњњћњћњњіћњћћ§ћ§ћўћћи§ћњљњњ§ћ§ћ§ћ§ћ§ћ§њњћ§њћћњњћњ§ћ§ћ§ћ§ћ§§ўњњћ§ћї§ўћњњў§ў§§ћшњћћњћњњљњњ§ћ§њњћ§§ћњћњћњњќљњљњњљљћњ§ћ§§ћћњїћњњљљ§§њћћњњћњћњ§§щћ§ћћњћњљћћњћњњћ§ћњњ§ћћ§§ћўњ§§ўђћ§§ўў§ћ§њ§ћ§ћ§§ћќ§њћ§§ћ§ћњ№ћњћњ§ћўў§ћ§ћ§ћ§ћћэ§ћ§ћўћ§ћ§ћ§ћћњ§ћ§ћ§§чў§њћњћ§§ћћњћњљњњћўњћћњћ§ћћщ§ћћњњћ§ћћњњћњћћ§§ћ§§ћњћћєњћњ§§ћћ§ћћњћћїњћћ§§ћљћњњћ§ћќњћњћћ§љўћњћћњћћы§ћ§ћ§ћћњћћ§ћ§ћ§§ў§ў§ўў§ћ§ћћђњћўћћњ§ћ§ћ§ћ§ўў§ѕў§ћ§§ћ§ћ§њћћў§ћћћ§ћ§ћўўњ§ў§ћћ§§ќћ§§ўўю§ћ§ћ§ћ§ћ§§ўћ§њћњћњњћё§ћ§ћ§ћ§ћў§ўћ§ў§§тћ§ћ§ћњњћњњћ§ћћњњљњљћњњљћћ§ћњњћћіњћ§ўњћњљњћћќњћћ§§ўъ§ћћўћ§њћћљњњћўћћњљњ§ћ§§їћ§ћћљћњљњњўљ§§ўћњњ§ќњћ§ўў§ўћўўўћ§§љў§ћ§§ў§§ќћ§ћўўёћ§ћ§ћ§ћћњћћ§ћ§ћћј§ћ§ћ§§ў§§љћўћ§ўў§§ўћ§§§ћњћћ§њў§ўў§ћћє§ћў§§ћ§ћ§ћћ§§ёў§ћћўћўћћњћћ§ћўўіћ§ћ§ћ§ћ§ћ§§јћ§ћ§ћ§ћ§§хћ§њ§ћ§ћ§ћ§ћ§ћ§ћ§ћњњ§ћ§ћ§ћў§§ў§ћўў§§юћ§ћў§ў§ў§ў§ў§ўћ§ћ§§ћѕ§ћћњћњћћ§ћ§§ћјњўњў§ў§ўўў§ўўщ§ћћљљћ§ћ§ћ§§ў§ў§§ћ§ћњћўў§ўњ§њћњћњњћ§§ћ§§ђћ§ћњћ§ћ§§ћњћњ§§ўћ§§ыњљњ§ћ§ўў§ў§ў§§ћћњ§ўў§§ўњ§ў§ў§ўўўћ§§§ћ§ћћ§§ћ§§лћњћњћћ§њћћ§ћ§ћ§§ћћ§ћ§ћћњћ§§ћ§ћў§ў§ўћ§§ећ§ћћњ§ћ§§ў§ўў§ћ§ћў§§ћ§ћ§ў§§ўћ§ћ§ћћњћњћњ§ћ§ћћўњ§§ћћњ§ћўўўћ§§ўћ§§ќћљњћћэ§ћў§ўў§ћ§ћ§ћ§§ў§ў§ўўј§ўћ§ћ§ћўўўћ§§ўћ§ћ§ћўўђ§ўћ§ћћњ§ћ§ћ§§ўўї§ў§ўћ§ћ§ўўћ§ћњћ§§ћѓ§ћ§ћ§ћ§ћ§ўў§ўў§ћў§ўў§ћўі§ћћњћўў§ћ§§ўў§§њў§§ћ§ўўіћ§ћўћў§ўў§§яћ§ћ§ћўћ§њћњћњћљњћћќњ§ћўў§§ћ§§їњћ§ћ§ћўћўўљ§ћ§ћ§ћўўќ§ћ§ўўьћ§§ў§ўў§ћ§ћўћ§ћ§ћ§ћўўњћ§ћ§ћ§§ўћћњ§ўўћћћњ§ћћњњћ§ћћ§ћћ§ыў§§ўў§ў§§ћ§ћ§§ўћ§§ў§ўў§§ўћћ§уњ§§ћ§ћ§§њћ§ћ§ћ§ћ§њћњћјєѕњ§ў§ўўњћ§ћў§ўў№§ћ§ўўћ§ћћњћњћњ§ўўњњћћ§ћ§§јћђцѓћўў§§ўўћўўѕ§ћ§§ў§ў§ў§ўўє§ў§ћњћћ§§ўћўўь§ў§§ћ§ћћў§ћ§§ўјїћўў§§њњћњ§ћ§§ќћ§ћ§§ќћў§ўў§§ћўўќћ§ћўўў§ўўј§ћћў§§ћ§§іњћњћњћћ§§ўўђ§ўћ§ћ§ћўћ§ћ§ћўўю§ў§ўћ§ћћљљјњњ§ћћ§ўўќ§ћњ§§ёћ§ћў§ў§ўћ§ћ§ћ§ћћќ§ћћўўјћ§ћ§§ў§ўў§ўю§ћљћњњћљњћћ§§ўћ§ћњњќћњ§њњўў§§§ў§ўўњ§ў§ў§ўў§ўњћ§ў§§ўўў§ўў§јњ§њћ§§ў§§јћўћ§ћ§ў§§ќћ§ћ§§ћўњћћ§ўћѕ§ћ§ћў§ў§§ћўўцћ§ћў§ўћњћћњњћўћ§§ўћ§ћ§§ћ§ўўљ§ўў§ћ§ћћљ§ћ§ћ§ў§§юћ§ћ§§ўћў§ў§§ћў§ў§ўў§ћѕ§ў§§ў§ћњ§ћўўћ§ћ§§ўўь§ў§ўћ§ўў§ў§ўў§ћ§ћ§ћўў§ќћ§ћў ў§ўќ§ў§ўўъ§ўћ§ћ§§ћњћњњћ§§ўћў§ў§ўўњћ§§ў§ўўњ§ў§ў§ўўє§ў§ўў§ћ§ћў§ўўќ§ў§ўўы§њ§ћўў§ў§ћ§§ў§§ћ§ћ§§ўўэ§ћў§§ћ§ћў§ўћ§ћ§ћ§§ўў§іћ§ћњњћћљћ§§эњћ§§ў§ћ§ћ§ћ§ўўћ§ћ§ўў§ўћўўэћ§ћ§§ў§§ћў§ўўћћ§ў§њњїћ§§ћ§§ў§ўўњ§ў§ў§ўўў§ўўѓћ§ўћћ§њњћ§ћ§ўў§§ў§ўў§њћ§§ўћ§§ўќ§ў§ўўќ§ў§ўўў§ўўўћ§§№ў§ћ§ћ§ћ§ћ§њћњћћўўњ§ў§ўћ§§ўћўўєћњћњљћ§ў§§ћўў§ўў§ўў§§ў§§ћіњ§§ўћ§ўўћ§§§ћ§њњђљњњћў§ў§§ћћњћњњўћњњ§ўў§ўў§§ў§§љў§ў§ўћўўњћ§§ў§ўў§єћ§ћ§њћћў§ў§ўў§ўљћўћ§ћўћћќўћ§ћћќ§ў§ўўў§ўўќ§ў§ўўђ§ў§ў§ћ§ў§ўћ§§ўўў§ўў§ќћ§§ўўў§ўўњћ§ў§ћ§§ўћў ў§њћњ§ў§ўў§јћ§ћ§ћћў§§ѓўћ§ћ§ћ§ћ§§ў§ўўћѕ§ў§§ўњ§ћ§ћ§§њћ§ћ§ћ§§ќћ§ћўўѓ§ў§§ћ§ўў§§ўў§§ў§ћ§њ§ћћћ§ћўћ§§ёћ§§ў§§ћ§ћў§§ћ§ўўњћ§ћў§ўўђ§ў§§ћ§ћ§§ў§ў§ћћї§ћ§ћ§§ў§ўў§љћ§§ў§ў§§§ў§ўўђ§ў§ўћ§§ћ§ў§ў§ўўў§ўўя§ў§ўћў§ў§§ћ§§ўћ§ўў№ћ§ўўћ§§ўў§ћ§ћў§ўўќ§ў§ўўљ§ћ§§ћ§ўўў§ўўј§ў§ўћ§ћ§§ўў§ўўћї§ћўў§§ў§ўўћ§ћ§ћ§§ўў§§ћљў§ўћ§ћўўў§ўўђћ§ћ§ћ§ћўћ§ћ§ћўў§јћ§§ў§ў§ўўћ§ћ§ћўўѕ§ћњћњњћ§ћ§ўўі§њћ§ћ§ћћњћћќњ§ћ§§љћ§§ћ§ћўўљ§ў§§ћ§ўўќ§ў§ўў§іћ§ћ§ћ§§ў§ўўћєњ§ћ§ў§њћћ§§ўўќ§ў§ўў§јћ§§ў§ўћ§§љў§ў§§ћ§§ћў§ў§ўўќћ§§ўўў§ўўўћ§§јћ§§ў§ўў§§ўўћ§§ўќ§ў§ўў§ћ§ўќ§ў§ўў§їў§ўћ§ћ§ћўўњћ§ћ§§ўўіћ§ћ§ўў§§ћ§§ўќ§ўў§§§ў§ўў№ћ§ћў§ў§ў§ўћ§ћў§ўўќ§ў§ўўќ§ў§ўўљ§ў§ўў§ўў§єћ§ћћњћћ§њ§ћўўў§ўў§§ћў§§ўћ§§њћ§ўў§ўўў§ўўіћ§§ў§ўћ§§ўўј§њћњћћ§ўўў§ўў§јћў§ћћ§ћ§§јћ§ћћ§ў§ўўјћ§ўўћў§ўўў§ўўў§ўўќ§ў§ўў§ўњ§ў§ўћ§§ўўћћўї§ўў§ћўћ§ў ўјћ§§ў§ў§ўўў§ўў§њў§ћ§§ўўў§ўўь§ў§ў§ў§ўћ§њћњћњ§ћ§§ўў§ћ§§ў§ўў§ћќњ§ћ§§єћ§ћ§ћ§ћ§§ў§ўўєћ§§ўћў§ў§§ћ§§ыћ§ћ§ћ§ћў§ў§§ћ§ћ§§ў§ўћћў§ћћў§њњў§ћћў§§ћ§ўўќ§ў§ўўў§ўє§ўћў§ўћ§§ў§ўўў§ўўє§ў§ў§ў§ўў§ћ§§њћў§§ћ§§їў§§ћ§ћ§ћ§§§ћўћћћ§њћћўўї§ўћў§ў§ў§§љћ§§ў§ў§§ѓўћ§ћ§ћ§ћўњ§ћ§§ёћў§ўћўћ§ћў§ўћ§ћћўћ§ў§ў§§јўћњљњњћ§§їў§ў§ўћ§ћ§§ђћ§§ћћўњўћћњћњ§§ў§ћї§ћ§ћћ§§ћўўќ§ў§ўў§јњћћў§§ћ§§ъћў§§ћўћ§ћўћ§ћ§њћњ§њћћ§§ќћў§ўў§ћљ§ћўў§§ўўњ§ў§ў§ўўэ§ў§ў§§ћ§ћў§ў§ў§ў§§ћћѕўћўћ§ћўћ§ћ§§єњћњ§ћ§ћўћўћ§§іњћ§§ћ§ћ§ћ§§ѕћ§њ§њћћ§ћ§ћћ§ьћњћћ§ћў§§ћў§ў§ўћ§ћћњњћ§љў§ў§§љњњ§љў§ў§ўћ§§ћњњ§ћ§ћ§§ћ§ћўћўњ§§§ћ§ўўћћ§§ўћћј§ћў§ў§ў§§їў§ўў§§ў§ўўђ§ў§ў§ў§ў§§ћ§ћ§§ўё§ў§ўћ§ћўњўћ§ћ§ћћќўћў§§ўј§ў§ћћўћўўљ§ў§ў§ў§§ьў§§ћў§§ћ§§ў§ў§ў§ў§ў§§эћў§ў§ўћ§ћ§ћ§§ў§ўћћўўѓ§ўћ§ћ§ћ§ћ§ћў§§ўў§§№ўћ§ћ§ћўћ§ћўћћ§§ћћёўћ§§ў§ўћўћўћ§ћ§§ћіљ§§ў§§ћўћ§§ўћ§§њў§§ћ§ћћ§ўћ§ §ўў§§йў§ў§ў§§ўў§ў§ў§ў§ў§§ў§ћў§§ћў§ўћ§ў§§ў§ўћ§§њћ§ћ§§ўўї§ў§ў§ў§ў§§эў§ў§ў§ў§ў§ў§ўћ§§ў§ўў§§ў§§§ћў§§ѕў§§ћћ§ў§§ћ§§чўћ§§ўћ§§ў§ў§ћњ§§ўћў§ў§ўћ§§ўў§§ў§шћ§§ў§ўћўћўћ§ћ§ћў§ўћ§ћ§ћ§§ћћў§ў§§эўћў§ў§ў§ўћ§ћў§ў§ў§ўўю§ўћ§§ўў§ћ§§ў§ў§ў§ўўў§ўўљ§ў§ў§ў§§ў§њћў§ў§ўў§їў§ў§ў§ў§ўўі§ў§ў§ў§ў§ўўћ§ўћ§ћћ§љў§ў§ў§ўўђ§ў§ў§ў§ў§§ћ§ћ§§ђћўћ§њ§ћћ§§њўћ§§ћы§ћ§ћў§§ћ§ћ§ћў§§ћў§ў§ўў§њћўћ§§ўў§ёћ§§ў§ў§ў§ў§ўћ§ћћћ§ў§§ћћ§ћў§§ћўўў§ўўќ§ў§ўўќ§ў§ўўњ§ў§ў§ўўђ§ў§ў§ў§§ћў§ў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўў§§ў§§ќў§ў§§ў§§ў§§ў§§ў§§ўў§ўўј§ўћ§ћў§ўў§§ў§§ѕў§ў§ў§ў§ў§ўўў§ўў§ђў§ў§ў§ў§ў§ў§ў§§§ў§ўўў§ўўќ§ў§ўўњ§ў§ў§ў ўї§ў§ў§ўћў§§ўўћћ§ѕў§ў§ў§ўћўћ§§ ў§§ўћћ§ћў§ў§ўўњ§ў§ў§ўўќ§ў§ўў§ьћ§§ўћ§§ў§ў§ў§ў§ў§ў§ўўюћ§ћ§§ў§ў§ў§§ћ§§ў§ўў§ўћ§§ўў§ў ўъ§ў§ў§ўў§§ў§ў§ў§ўћ§ћ§ћ§§ъћў§ў§ў§ўћ§§ў§§ћўћў§ў§ўўќ§ў§ўў§§ў§ўўќ§ў§ўўј§ў§ў§ў§ўўц§ў§ў§§ћўћ§§ў§ўћ§ћ§§ў§ўћ§§ўўћ§ў§ў§§ћњњ§ћў§ўўќ§ў§ў ў§ў§§ў§§ўќ§ў§ў ўі§ўћў§ў§ў§ў ўќ§ў§ўў§§ў§§ёў§ў§ў§ў§ў§ў§ў§ўўњ§ўћў§ўў§ў§ўќ§ў§ўўў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўў§§ў§§іћўћ§ћ§ћ§§ўўє§ў§ў§ў§ў§ў§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўў§§ў§§ўі§ў§ў§ў§ў§ўўќћ§§ўўњћ§§ўћ§§њћ§ћў§ўў§љў§§ўў§ўўі§ў§ў§ў§ў§ў ўѕ§ў§ў§ў§ў§ў§§њў§ў§ў§§њћњєјњўўў§ўўќ§ў§ўў§њћ§ћ§§ўў§№ћў§ў§ў§ў§ўћєйѕћўўў§ўўў§ўўќ§ў§ўўњћ§ћў§ўўќ§ў§ўўф§ў§њљћўў§ўў§ћ§§ў§ў§ў§ў§ў§ў§ўўў§ўўў§ў ўћ§ў§ў§§ќћ§§ўўќ§ў§ўў§ўј§ўћўњ§ћ§§ўўћ§§§ў§ўўњ§ў§ў§ўў§ўќ§ў§ўўў§ўўћ§њўћћ§ў§ўўњ§ћўћў§§ћќ§ў§ў ўў§ўўќ§ў§ў ў§ћў§ў§ўўъ§ў§ў§ў§ў§ў§ў§ўў§ћ§ћў§ўўќ§ў§ўў§ўў§ўў§§ў§ўўў§ўўќ§ў§ўў§ўђ§ў§ў§ў§ў§ў§ў§ўўў§ўўј§ў§ў§ў§ўў§ўќ§ў§ў ўў§ўўњ§ў§ў§ўўќ§ў§ў ўў§ў ўћ§ў§ў§§ћў§ў§ў ўў§ўўў§ўў§ўє§ў§ў§ў§ў§ў§ўўј§ўў§§ў§ўўњ§ў§ў§ў ўї§ў§ў§ў§§ћћ№ўћ§§ўћ§ћў§ў§ў§ў§§ўќ§ў§ўўў§ўўј§ў§§ўў§ўў§§ў§§ћ§ўћўўў§ўўћ§ў§ў§§§ў§ўўў§ў ўќ§ў§ўўў§ўўѕ§ў§ў§ў§ў§ў§§ ў§ў§§ўћўўў§ўўў§ўўј§ўћ§ћ§§ўўў§ўўћ§ў§ў§§љўћўћў§ўўќ§ўћ§§ћћ§ўў§ўўў§ўўћ§ў§ў§§ўќ§ў§ўўў§ўў§§ў§§ўў§ў ўќ§ў§ўўі§ў§ў§ў§ў§ў ўє§ў§ў§ўў§§ў§ўўј§ў§ў§ў§ўўќ§ў§ўўј§ў§ў§ў§ў ўљ§ў§ў§ў§§эў§ў§ў§ў§ў§ў§ў§ў§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўі§ў§ў§§ћ§§ўўў§ўўћ§ў§ў§§ў§ўќ§ў§ўўў§ў ўњ§ў§ў§ўўіћў§ў§ў§ў§ўўќ§ў§ўўў§ў'ўќ§ў§ўўў§ўўў§ўўј§ўў§§ў§ў ўќ§ў§ўўњ§ў§ў§ў ў§ ўњ§ў§ў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўњ§ў§ў§ў ўќ§ў§ўўіћ§ћўћ§§ў§ўў§§ў§§эў§ўћўћўћ§§ў§ў§ў§ў§ўўќ§ў§ў ўј§ў§ў§ў§ўўєћ§ўў§ў§§ћў§ў ўќ§ў§ўўў§ўўљ§ў§ў§§ўўў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўњ§ўћў§ўўќ§ў§ўў§ўќ§ў§ўўў§ўўў§ўўў§ў ўў§ўўќ§ў§ўўў§ўў§јў§ўћ§§ў§§ўђ§ўў§§ў§ў§ў§ў§ў ўў§ўўў§ўў§ќћ§§ўўў§ўўі§ў§ў§ўў§§ўўў§ўўў§ўўќ§ў§ў ўў§ўўў§ў ўў§ў ўњ§ў§ў§ўўў§ўў§њћ§§ў§ўўњ§ўћ§§ўўю§ўћ§§ў§ў§ў§ў§ў§ў§ўўў§ўўє§ў§ў§ў§ў§ў§ўўњ§ў§ў§ўў§§ў§ўўњ§ў§ў§ўўў§ўљљјћ§љћљљ§љљћјјћјћћѕљћљћїјњ§§њ§§ўђњћљљњњ§њљњјјњјјяњјњљћћљјљћљћћњњјљљ§јљћњњћљљћћўјњњёїјњљћ§§ћњјњјћњ§§љљћљ§§њ§§ћіљњњљљјњћјћћїњ§§ћњјњјћћљ§ћљљћћ§§§ћљћћшљ§њћљњћљњ§ў§§љћјњћљљ§§њћћъјљљ§љ§§њ§§ћљ§§њ§њ§ћћњ§§ўћ§§ў§њ§ўўќћљјћћљњј§љљћљљћћјјєїїєљјћћљљњ§њњћ§§юњљјјљћ§њњ§љњњљјјњћћљљјїїњјљњњћњ§љћљњћћљњјћћ§њ§§ћњуљњ§ћћљњ§љјјњјњњћљњњ§њљћјїїѕћљљїћњ§§ћ§ћљћћїљјїјјћћ§љљ§ћёљћ§ўњ§§љљјїјљјљљљјїєєѕѕјјьїјћћљљњљљїјјљ§§ћњјњћћќјћјћћўљћћљ№§љћњїљњћ§љјњј§љћћ§ћћљљћ§§ћњяјљїїњћљћљїјјњїїљјјћі§љћћњљ§ћљћћљљ§§ўўњ§§яљћњјњїњјћљћ§§љћјћћ§љћ§§єјњјњњј§њ§§њ§§ћњўљљјјћќ§њў§§љњћљњ§§љљ§чў§ћјњћљљњ§њ§§њ§њ§њўў§§љјћћ§ђљњ§ћјњјљћјћљћ§§ћдњ§§љћј§§њ§§њ§њћњ§љљ§ћћ§љљјјїђїѕјњјјїћљјћћјјљљѕ§љћ§њљљћћњћћ§љћјјљћ§§љјјяљјњјјїљјљћјјєјњјљљљ§ћћњ§њћћёљјњљљјјћљњ§њљљћћјыѓєѕїјљ§њљљњћјјњјјћ§§ўўјњћљ§њ§њљљў§љљћќљћ§ћћяј§§љїјћ§§ўњљљћћљћћљјћјјљ§ћљћћ§§ј§§љќћ§њ§§ўѕ§ўў§§љћљћљ§§яљњ§§њ§њћљјћљ§њћљ§§јћљјћњ§њ§§ќњћљ§§яљ§ўў§§ћѕљј§љњ§§њ§§яўћћљ§ћјљњ§љљ§§њљњњє§ћјјїїњњ§§ўњњє§ћјљњљ§ўўћћњњѕ§љ§ћ§њћћўњ§§ћў§ўў§§ўњ§§јюїјј§њњ§ћћњљјљћњ§њ§§ћњ§§њ§§ћћўў§љљђјѓјљћљњљљјљћњ§§їњљњ§њў§§ћћѓїјј§§їњ§ћћљўњњ§њќ§ћў§§љ§љѕћћљћњўў§љљћ§§ћћўўїћўћўў§њћўў§ўћљљ№јћћљћљћћ§ўў§§љћўў§іўћ§љћћњћљћћђљњ§§њ§ћ§њ§јљњ§§ћїљ§њ§њ§§ў§§оћљњўў§§њ§§ћ§§љљ§ћљњћћ§љљћњ§љљћћљљ§§ђњ§§њ§њњ§ўўћ§§ўўўћўўњњ§њўў§§њё§њћљњ§ћћњ§њњ§§ўўќћњў§§ўњ§§ѕњљ§§њћљћљљћћњљћљћ§ўў§ђћљјѕѕјћњ§ћјћњ§§ѓљјјњјїјњјњњћ§§їљјљјћ§њњўўњћ§§ўњ§§јћћњњљ§§њљ§њ§ћ§§ќћњћ§§ђўњ§§њћјїїјјћљ§§ўћўњ§њ§ў§ўў§єљњ§§ў§љљћњ§љљњ§њљћћљљјўћ§§ў§ўћўў§ћњўўєњ§ћљљ§љ§§њ§ўў§ўњ§§ћњўў§ўў§ўњўў§§њљ§§§љњљљњ§ўњ§§ўќ§ћћљљтћјћјљћ§ћљј§§ћљњњў§њљћўў§ћљ§ўњ§§ћњ§§љ§§љіњјњљљћћљњўўнћўћ§њ§ћћљ§§ћ§§ўћ§ћћ§ћ§§њљљћј§њ§§ўњ§§§њћўўўћўў§њ§ўћћ§љћ§§јњ§§њ§њ§ўўћ§њћћўўћлўћњ§љ§§љњћўћўћў§љљўўћўћћ§љѕљљњњћљћўћўўњћ§њ§§ўўўњ§§§њћўў§іњћ§њљјњћћ§§ўљћўў§ћјљљќ§њњўўић§ћѕњљјћљјћ§§њ§њ§њўўћўўћўўњћўўњћ§§њ§§њ§њњў§ўўўћ§§їљјљљ§§ўў§§іњ§§ў§њљ§§ўўћўћњ§ўћўўњ§њњ§њћћљљ§ћўњњћљљњў§ѓњ§њљ§ўўњ§ў§§ўўћэў§њљјћћљћ§§љћњњљћћљљ§§љ§ўў§љќјєў§§ўќћўћўў§§љњњљћўћ§љњўў§ўћўўњњ§ўўћўўњњ§§њ§ўў§§ћў§§ўћўўћњ§ћћўўўћўўўћўўћ§ўюћњ§ћў§њћ§§њ§§ћљјљњњ§ќњ§њ§§ўћўў§§ќљ§§ўўюњћўњљљћњћ§ћћўњ§љљ§§ўєљњљ§§љ§љњћћўўќ§љљ§§ћѓў§њљћћњљњћњ§ўў§њќћ§њўў§њч§њ§ўўћўўћ§љљњњ§§љћљњњљћў§§њьћљљњ§§њў§њ§§њљњ§ћўћўўўћўўќ§њљ§§єњ§њ§ў§њ§њљљ§§њњ§ў§њљ§§єњћ§њњ§§ћ§ўў§§ћњўўћўўў§њњї§ўўћўўћњ§§ўў§њњљўћўњљљ§§ћў§љљќњўћўўћћўћћўў§ўѕћ§§њ§ўћњ§њ§§ўў§ў ўўћ§§њўћњјћ§ўўў§ўўўћўў§§єўўњўѕ§љј§§љћўўћўўўњўўўћ§§№њљњ§њ§њ§§њ§љјїњўўяћўўћў§љћћ§љћћјѓњ§§ўњ§§јљњ§њњ§§ўўћўѕ§љљ§§ћљњјћ§§ќљћљ§§ћћјїљ§§ўњўўћњљ§ћў ўј§њўћћўћўўїњћўў§§ў§ўўћтњјњ§§ћћў§ћў§њћћўћўўњ§њћўўћўўњў ўї§њ§њљћњњ§§щљњљјїљ§ў§љў§љњљљ§ўўћўў§§ќў§њўў§ѕљјљ§љљ§ћўў§§њ§љўћћў§њўўјћљўњўћњ§§њђ§њ§љ§ўћњћћ§њ§ўўј§ў§§њ§љўўјћўўњ§§ў§§ћўќ§њ§ўўф§њўў§ћїњћњњ§§њ§њ§љ§§њњ§ўћўў§§ѕњ§§љ§§ћњ§њ§§ўњ§§цћјјћњњ§љ§ўњ§§њћ§ћњ§§њўњ§ћўў§ћљ§№њ§њ§њњ§љјјћ§њњў§§ўњ§§ўћўі§љћ§§ў§§њўўѓ§ўўћњ§њ§њўўћўўћ§љњ§ў§јњћћўњћћќ§ћћњњ§ћ§њњѕћњћњћњћћ§ћ§§їћ§ћ§ћў§§ћћ§хћ§ћљњњљњњ§љњљћњњћ§ћњћњњљљњћћї§ћ§ћћњ§§ћћњњћћњњљљќћњљћћќ§њљњњјћ§§ћ§ћ§ћћњ§ћ§ћ§ћћз§њћњћ§§ћћњљћњћњћ§§ћћљњљ§њћњ§њћћњњ§ћ§ћ§њћњњћ№§њћљћћ§ћўћ§ћћњљћћ§ѕћњњ§ћў§ў§ћ§§ќњћћ§§љњћ§ћћ§ћћљ§ћў§§ћўўћј§њћњћћ§ћћњѕћљљћћ§њњћћ§§єњ§ћ§ћ§ћ§ћћњ§§іћ§§ћњњљћњћћўњљљ§њћљљњў§ћћњљћњљњћњ§§§ћ§њњпћњ§§ћ§§њњћ§ћћњњљњљљњћ§§ћ§ћћњљћ§њћћёњ§ћ§њ§њћњћњћњљњњў§ћћј§ћћњћњњћћќў§§ћћњ§ћњћћњњљјљјњњіљњћњћћ§ћћњњћў§њњўљњњф§њ§њћњћњћњћћ§ћњљљјљњ§ћњљњ§ћњњќћ§њћћі§ћћњћљљњјљљћњљљјњњћћњћћјњћљј§њћњњћі§ћў§§ћ§ћћњњљњћїњћ§ћњњћњћћі§ћ§њљњљљњ§§іћ§ћ§ћ§ўўћњњіћњ§§ўћ§ћўћћќ§ћ§ћћ§њўљћћћ§ћ§ћ§§љў§§ћћ§њњпћ§ў§ћћњљњћњ§њћњ§ћ§ћ§њњ§§ћћњ§§ћ§ћ§§ќњ§§ћћњњ§ћћњњљљњћњ§њћњњћћѓњ§§ўћњћ§ћњњћњњћќњ§ћњњіћњљњњљјњћњњћћњљњћћњы§ћ§ћњћћњљћћ§њћћ§ћ§ћћњњўћњњјїљњћ§§ћћ§њњўљњњѓ§ћў§ў§њћћ§ћ§ћћы§ўћћњњћњ§њћњ§ћ§ћћњњћ§§ћўњћћўњћћњјћ§њћњћњ§§ћэ§ћ§ћў§ўћў§§ћћњћњћћ§§шћ§ћ§§ћ§ћћ§њћ§§ћћ§ћ§њћћњ§§кћ§ћ§њћћ§ћўћў§§ћћ§ћ§§ў§ћћ§ћћ§§ўњћ§њ§ћ§ћћћ§ћ§ћ§§ўћњњљ§§ћ§§ћјљћћў§ўў§§љћў§њ§§ўў§єћ§ћўћўў§ћ§ћ§§ъћ§њћњ§ћ§§ћњћ§ћ§ћњ§ћ§ћ§§јћ§ћ§ћ§ћўўћэњ§њћњћ§ћћ§ћћ§§ћ§§ў§§ќўћ§њњїћњњ§ћў§§ўў§ћ§ўћћ§ћ§ћћї§ћ§њњћћ§ўўѕ§ў§§ћ§ћћ§ћўўў§ўў§ўљ§ћ§ћ§њћћњѓўћћњњ§ўўћ§ћњўўё§ў§§ћўў§ћћњ§њћњњњћ§§ћ§ћћн§ћ§ћ§ћ§ћћњћћ§ћ§ћ§ўћ§ћћњў§ўў§ћ§ћ§њ§ћћѕњћ§ћњ§ћћњ§ћћњњћћ§ћ§§љћ§ћ§§ћўў§ўў§ўўє§ў§§ћ§§ўћ§ћ§§їћ§њћ§§њњ§§§ћ§ўў§ўћ§§ѕћ§ћ§§ћћ§§њћћїњћњћњћњ§ўў§рћњћњјљњћ§§њњћ§§ћ§ћњњљњљњљњљљњћ§ћћљ§ћ§ћ§њ§§ўёћ§ў§ћ§ћ§§њњљљћ§§ћў§ћћ§юњљњ§ћ§ћ§ў§ћ§§ћњљљњњњћ§ћ§§ўў§ѓў§ўў§§ћў§§ћўћћќњ§§ћћћ§ћњњћћњћ§ћ§ћўў§ћ§ўўў§ўўў§ўў§ќњћћ§§ъћ§ћў§ўћ§ћ§ћ§ћ§ћ§§ўў§§ўўўћ§§ўёћ§§ўћ§ћ§ћ§ћ§ў§ћћ§№ћ§ћ§ћ§ћ§§ў§ўћњњћћњјћњ§њћћ§ћћ§јўћ§ўў§ўћћ§ућ§ћ§ћ§ћ§ћ§ћ§ћ§ћћљњљћћњњћ§ўў§ўў§цњћћ§ћўћћ§ўћћњ§ў§ћ§ћћњ§ћ§ћ§§љћ§ћ§ў§ўўў§ўў§ўћ§§ўћўўћњњ§ћ§ћ§§ўљћ§њњў§ўўћ§ў§§ћћіў§ў§ў§ў§§ўўы§ћ§ћћ§§ћўў§ў§ў§ўћ§§ћўўі§ћћ§ћ§ўў§ўў§ьћ§њ§§ћћ§њњћ§ћ§ћ§ћ§§ўўќ§ћњћћ§ўў§ўўјћњ§§ћ§њћћ§§ў§ўўў§ўў§ћ§ќћ§ћ§§ѕћў§ўў§ћ§ћ§ћћ§ћўћ§ћ§§јћўћ§ћ§ћўўћ§ў§ћўў§ўћ§§§ћњћћљ§ћў§§њћћ§ьўћ§ћ§ћ§ўћ§ў§§ўћ§§ў§ўў§ёћ§ћњћњ§ћўњ§§ћњћћў§ћћњў§ўћ§ћћљўћ§ћ§§ўў§ћў§§љў§ўћћ§ўўќћ§ћўў§ўћўўћ§ў§ћ§§ўё§ћў§§ћ§ћ§ћ§ћў§ўў§ўј§ў§ў§ў§ўўц§ўћњ§ћў§ў§§ўўћ§њ§ћ§ћ§њћњћ§§іћ§ћ§ћ§ћ§§ўўў§ўў§њћ§ћћ§ўўў§ћћќљњћўў§ћ§§ћўўї§ў§ћўћў§ўў§ћќ§ћ§ўў№ћ§ћћњњјњњ§ћў§ўћ§§ќњћ§ўўўћ§§њћ§ћў§ўўќ§ћћ§§єћўњћ§§ўў§§ћ§§яњћћ§ћ§§ўћ§ћ§§ћ§§ў ўщ§ў§§ўћ§ћ§ћ§ћўћ§ћ§ўў§§ћ§§єћўћ§ў§ћ§§ўћ§§ћљў§§ћ§§ўў§ўј§ў§§ћ§ћўўўћ§§ќў§§ћћћ§ћ§њћћњў§ўў§ўўў§ўўі§ўў§ћ§ћ§ћўўўћ§§ёў§ћ§§ћ§§ў§ў§ўћўўў§ўўў§ўўў§ўўќ§ћћ§§ў§ћѕў§ўћў§ў§ў§ўўћђў§ўў§§ўў§ћ§ћ§ўўќ§ў§ўўє§ў§ў§ўћ§ћ§ћ§§њћ§ћ§ћ§§љћњњ§ў§ўў§эўћњ§ћћњ§ў§ћ§ћ§ћ§ћў§§§ћ§ўўќ§ў§ћћх§њћљњњ§ћ§ћћњћћ§ћњњћћ§ћ§ћ§§ўўљ§ўў§ћћўўљ§ў§ўў§ўў§ўќ§ў§ўўѕ§ўў§§ћўћў§ўў№§ћ§ћ§ўў§§ўўћ§њћўў§§ћ§ўўї§ў§ў§ў§ў§§ў§ыћ§ў§ћњњћћўћћўћў§ћћ§§ўўј§ћ§ћўћ§ўў§ћ§ћћў§ўўљ§ћ§ћ§ћ§§ўћўў§ћ§ўўў§ўўњ§ћћ§ћ§§ћ§ћў§ћњ§§ўў§§эћ§ћўў§ў§ў§ў§§ћўћ§ћўў§ўіћ§§ўћћљљњ§§ћћ§ћ§ћћ§љў§ўћ§ћ§§ыћўћ§њ§ћ§ћ§ћ§ћ§ћ§ћ§ћћњњ§ўў§§щћ§§ћ§њ§ћ§§ў§§ўў§ў§§ћ§њћћљ§ћ§ћ§ћ§§єћњњћћ§ўўћ§ћ§§§ћ§ўўў§ўўћёњ§ћўћ§§ў§ўћў§ў§§ѕў§ў§ўў§ћ§ћўіњћћўћ§ћ§ћ§§љћў§ўћ§ћћ§эўћ§ћ§ћ§ћў§ў§ў§ў§ў§ўўі§ћ§§ў§ў§§ћћў§ћћ§ќћўћ§§ќў§ў§§§ўћ§§ћў§ћћч§ћў§§ћћњћћў§ў§ў§§ћ§§ў§ў§ўў§љћ§ћў§§ћћјўћ§ћў§ўћћ§ўћ§§ќў§ў§§іћўў§§ўћ§§ўў§ѕћњћћ§ћў§ўћ§§љћў§ў§ў§§іћў§ў§ў§§ћўўњ§ўћў§ўўў§ўўўћ§§ўћ§§№ћўћ§ћ§ћ§ћћњўњ§ћ§§чў§ўў§§ў§ўў§§ўћ§§ў§§ў§ў§ўћћј§ћ§§ћњ§ћћ§љћ§њ§ћ§ћћ§ќў§ў§§љћ§§ў§ў§§ўў§ћћђўћ§ћў§ў§§ћћњћ§§ўў§§јћ§ћћ§ћћ§§ћўћ§ћ§§ўћўўѕ§ўћ§ћўћ§ћў§§љћњћљћњћћјўћњўћ§ћ§§ѕўћћ§ў§§њћћ§§њћ§ћ§ћ§§љў§ћњ§ћ§§ћ§єў§§ћўћў§ўћ§ћћрўњ§њўћ§ћ§ћўћћњ§њћћўћ§ћў§§ћћњ§ўћ§§ќћ§§ўўя§ў§ўћ§њћћ§њћћ§§ў§§ћї§ћ§ћў§ў§ћћќ§ў§ўўђ§ў§ў§ўћўћ§ћ§§ўўы§ў§§ћ§§ў§§ћ§ћ§§ў§ў§§ћћ§їў§ў§ў§ў§ўўќ§ўћ§§іў§ў§ўћўћў§§ќў§ў§§ћў§ўћ§§ўљ§ў§ў§ў§§ўў§§ћѕ§ћ§њўњћћўћ§§ћњ§ћ§§ў§§юў§ћ§ћўћ§§ў§ћћўћ§ћ§§§ћўћћюўњ§њћћўћўћўћў§ў§ў§§ўюћ§ћ§њћћ§§ўћ§§ў§§ћ§§ћіњћљњћ§§ўћ§§ћћўћ§§ўўѓ§ўћў§ў§§ћ§§ў§§єћ§§ў§§ћћ§ў§ўўђћ§ћ§ћ§ћў§ўћўћ§§ўћ§§їў§ўћў§ў§ўўї§ў§ў§§ћў§§§ў§ўўсћ§ћ§ў§ўћ§§ў§§ћў§ў§ў§ў§ў§§ћў§ў§ўўћ§ўћў§§ўќ§ўў§§ў§ўў§§щў§ў§ўћ§њћ§ў§ў§ў§ўћў§ћ§ўўї§ў§ў§§ў§ўўќ§ў§ўўљ§ў§ў§ў§§ёў§ўћў§ў§ўў§ћўћ§§јў§ў§§ў§ўўќ§ў§ўў§ў§№ћўћ§§ўћў§ў§ў§ў§ўў§њўћўћ§ўўќ§ўћўўў§ўўў§ўўў§ўўћ§ў§ў§§ўў§§ўћўўљ§ў§§ћ§ў ўў§ўўћ§ў§ў§§їўћўћ§§ўћ§§ў§ўў§ўў§ўћ§§іў§ў§ўћў§ў§§юў§ўћ§§ў§ў§ў§ўў§ўў§§ўћ§ў§ў§§їўћ§ў§§ўћ§§ћўћ§ћ§§їў§ў§ў§ў§ўў§ ўќ§ў§ўўљ§ў§ў§ў§§ўў§§љў§ў§ў§ўўъ§ў§ў§ў§ў§ў§ў§ў§§ћўћ§ћ§§ўь§ў§ўћћ§ўћў§§ўћў§ў§§ћћўњћћћў§ў§ўў§§ў§ўўѓ§ў§ў§ў§§ћ§ўћ§§јўћў§ўћў§§јћ§§ў§ў§ўўї§ўћўњ§ћћ§§§ў§ўўњ§ў§ў§ўўў§ўўў§ўўљћ§§ў§ў§§ўў§§іћ§§ўћ§§ў§ўўў§ўў§љў§ў§ў§ўўі§ў§ў§ў§ў§ўўў§ўў§ўє§ў§ў§ў§ў§ў§ўў§ѕў§ў§ў§ў§ў§ўў§јћ§ћ§ћ§ў§§љў§ўћ§§ўўѓћў§ў§ў§ў§ў§ў§§ќў§ў§§ћ§ўј§ў§§ћ§§ўўјћ§§ў§ўў§§ѕў§ў§ў§ў§ў§ў ўј§ў§ў§ў§ўў§ќў§ў§§ћў§ў§ўў§ў§ ўќ§ў§ўўќ§ћў§§§ўћўў§ўќ§ў§ўў§§ў§§ќўћў§§їў§ў§ў§ў§ўўќ§ћў§§§ў§ў ў§ѓў§§ћўћў§ў§ў§ў ўѕ§ћў§ў§ў§ў§ўў§§ў§§ћўћў§ўўњ§ў§ў§ўў§ўў§ўў§§ў§§ћўћ§ћ§§ў§§ў§ўўќ§ў§ўўћ§ўў§ўўэ§ўћ§ћ§ћ§§ўў§ўўћ§ћў§§ўў§ўўњ§ў§ўћўўќ§ў§ў ўў§ўўўћўўў§ўўў§ўўќ§ў§ўўў§ўўј§ў§ў§ў§ўўў§ўўќћ§§ўўў§ўў§ыў§ў§§ћў§ў§ў§ў§ў§ў§ў§ўўљ§ў§§ў§ўў§ћў§ўў§ќћў§ўўќ§ў§ўў§ў§ћћ§ў§ўў§ћ§њњ§ўћ§ўў§ўўњ§ў§ў§ўў§іћ§ў§ў§§ћ§ўў§§ў§§њћ§§ў§ўўј§ў§ў§ў§ў ўў§ўўњ§ў§ў§ўўћ§ў§ў§§§ў§ўўњ§ў§ў§ўўњ§ў§ўћўўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўў§ѕћў§ў§§ћў§§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўљ§ўў§ў§ўў§ўћўўўћўўњ§ў§ў§ўўј§ў§ў§ў§ўўљ§ў§ў§§ў ўќ§ўћ§§єћў§ў§ў§ў§ў§ўўў§ўўў§ўў§§ћў§§щўњ§§ў§ў§§ћў§ў§ўћ§§ў§ў§ўўў§ў ўў§ўўў§ўўў§ўўў§ўўў§ўў§ўћўўќ§ў§ўўю§ў§ў§ў§ў§ў§ў§§ћў§ўўњћўў§ў§§ўќ§ў§ўўў§ўўі§ў§ў§ў§ў§ўўі§ў§ў§ў§ў§ўўў§ўўў§ўўі§ў§ў§ўў§§ўўњћ§§ў§ўўј§ў§ў§ў§ўўў§ўўў§ўўќ§ў§ўўјћ§ћ§ўў§ўўї§ў§ў§§ў§ўўї§ў§ў§ў§ў§§уў§ў§ў§ў§ў§ў§ўћўћ§§ў§ў§ў§ў§ўћ§§§ў§ўўў§ўўэ§ў§§ћ§ћў§ў§ў§ў§ў§§ћћ§ў§ўўј§ў§ў§ў§ўў§ўў§ўўќ§ў§ўў§ў Ршў§њћјјљ§§љљћћ§§њ§§њѕєљ§ўўћњў§§њ§ўўћўќћўћўўїњ§ўњњ§ўћ§§ўњћўћў§ўўњљљњљњўћўўїњўћњўўћћўўћэњ§њ§њ§§љњјјљ§ўўћўћўўјћњњћўўћўў§њјљіњ§јїјјњњћ§§§њ§ўў§ћў§§§љњ§§ќћљћ§§§њ§ћћўю§њњљ§ћ§ћј§ўњ§ћјћ§ўўј§њ§ћћ§§ўўћћљњ§ўўћћ§њ§ўў§їљњ§ћ§§њћўўўћ§§ўў§§ўћ§ћљњ§§љћ§њ§ћћўўћњўћњ§§ўўћўў§їњљ§њўўњ§ўўќњ§§ўўљћїњ§њ§ўў§ўћўѓњ§§ћ§§ў§љћјјћћ§ќњљњў ў§јўћјѕєњ§ўўћ§ў§ћћі§њјћ§ћўњ§ћћ§ћ№љ§ўњ§§ў§§ўћњ§ўњ§§ўњћўў§§ўўњ§њѕњ§ўўћ§њљ§ўўќ§ћћњњ§§ўћўўњ§њћўў§§ўћўўљћўћўћћўўћћ§ћїћўў№њћћўў§љ§§њћљњћ§ўўёћў§§њ§§јњ§љћљњўўњћўў§§ўўїћўћў§њїћўўќћў§ўў§јњ§њўўњ§ўўіћўўћўўћўћ§§љњ§њњўћўў§§њўўўћўўљ§њљј§њўўћ§ўћўўљћ§њ§§њўўўћ§§ўњўў§ўћћўћћўўѕ§љ§ћњ§њ§њ§ў ў№ћ§§њ§§њ§§њљїћ§§ўўњ§ћѕїјўўў§ўў§ўћўўљ§ћјјћ§ў ўђћўћўўћњ§ћљћћј§§љєћљ§§њ§§ўўњћўўяћ§њ§њњў§ћљїљћћљ§ўўћ§ьњљћ§§њ§§ўў§њљ§њњ§њћўў§§ћ§ўў§эњўћўњїњљљ§њћўўћљљћ§§ѕњўў§љљјћћ§љљў§ўў§љњ§§ўўњ§§ўњўўќ§њћ§§ћњ§ўћўўћњјћ§ўњў ўј§њњљїћ§ўў§њ§ћћћ§ћњ§ўўќћ§љўўћ§њћ§ўўї§њ§§ўћ§§ў ўљњ§љ§§њћћ§љћ§§ ўў§ўўі§њјљњѕїћњ§§їњ§ўў§§ўћў ў§№јћ§њ§§ћћјїљћљљ§ўўћчў§ћћљћљћњљљњљјѕїљћљћљћ§њў ўќњљљ§§ћљњјћљћћ§§ћўёћўћўћўўњљњљјїњћћ§§ўњ§§ўћўў§ўў§ћћ§љњ§ћўўћў ўіњ§§ћћњљњњћћіљ§њћјїљўћўўў§ўў§їћњјњћњњ§ў ў§ќњ§§ўўўћўўќ§ћ§ўўњќїј§ўў§ўњўўћ§љљјћћўљћћњіљњњћ§§ўўњўў§ўћќїњ§ў ўўћўў§ўљ§§ёњ§њ§ћћљњ§§њ§ўўњњ§§ћўў§ђљ§§њ§њ§љїѕїћ§ўўћў§ўўўћўўћћўў§ћћўњ§§§ћўћћ§ўўћўўэ§њ§§њ§ўћ§љєљ§ўўћўў§§ў§ўћў§њўљ§ћћ§§ўѕ§њњљ§љљњўћўўј§јјїћ§§ўўњћ§њљњ§§ўњўўјћњћўўљљ§§ћћњћњ§ўў§ўўњўўё§ўўњ§њў§јѕїћњ§ўў§љћўћћўћўў§њњ§ўўњ§§ћ§§ћўў§њ§ўў§їћљљў§ћњњ§§ўїћўњњ§ўў§ўўѓњ§њћўўњ§ћљ§§ўў§љћўў§ћћўўўњўўыћ§њњ§§ўўћўў§њј§ўў§ўћўўэњўў§ћњњ§њјњљљ§§њ§§ўўћ§ўўћўўћ§њњћўў§њ§ўўјњћњѕјњњў ўўї§§ўћ§§ўћўў§лњ§§њ§ћ§ўўћћ§јњљјєїјћљї§њ§§ћћїєљћ§§ћћўў§ў§ўњўўѓ§ћћ§њ§ћ§§ћ§§ўўќ§ў§њњўќ§љћ§§љњ§њўўњ§§њћ§њўћ§§љњћњћћў§§єћљњ§§ћў§§њљў ўќ§ћћ§§ўќ§ћћ§§ўўћўўќ§њ§ўўћюњљ§њ§њўў§§ўўћўњњ§ўўћўњ§ћ§§љ§§ўљњјћ§§њ§§§ўњўўњ§їњћљћ§њўў§§љ§ј§ўўњў§ћћ§§љћ§§ўћўє§њ§ћў§њ§ўўћ§§ћњљљњўў§њ§§ўњўў§љљњљ§ўћўўўћўўўћўўћћњњ§ўўўћ§§ўў§§ў§ћј§њўў§§њ§§ќљј§ўўќћўћўў§њ§ўў§ ў§§ў§§ў§№њ§ј§њўў§љўўћњ§§ўўћњ§§њўўќћўў§§§ў§ўў§§њўўћћ§ўћўў§єњјјљјѕїјћ§ћ§§іњ§њљњ§ўћњћћўњ§§ѕњ§§њ§љ§§ћћўўўћўў§ѓљјћњњўњљѓєїњ§§њћљћћ§ўўј§ћўћћўћўўяћў§њ§§ћљњўў§љѕњњ§§њ§ўћћєљ§ўўќњ§њ§§ўћ§љћўў§§њўўћў§ў§ўњўўћ§ћљ§ћћљљѕјјњјњњ§ўћћўўћ§§љњѕњљ§њўў§їњ§§ўў§ћљў ўў§ўўјњћ§§ћћ§ўўќћўў§§ўљ§§љѕћљћћљ§ўћњ§ўўў§ўў§ўћўўўћўў§ћњўўњ§љњћњў ў§§њўў§§ўњ§§ў§ћў§ўњўўѕњ§ўў§§љјј§ўўњќљћ§ў ўўћўў§ѕћў§§њ§њ§њњ§§њћў§љ§ў ўњњћїїњў ўљћ§§ўўћўўєћў§њ§§їњ§§ћ§§ў§њ§ўј§ћњћљ§§ўў§ћ§ўў§ќўћў§§ўљћўў§§ћўўўњўў§њ§ўў§ўћўўѕњ§љјљ§§њ§њ§§ќњћћ§§ћєљїњ§§њћ§§ўљўўњћўўњ§ўўћ§ўўњ§§щћњњљљјјїѕљћ§њљћњ§њњљћљ§§ьњўћў§§љњ§§ћ§њњ§њ§§ћўў§ўњћњ§§ў§§ћфѕ§ўћћў§њљњћњљљ§§њњ§§њў§§љљњўўўћўў§ўќћўў§§јњ§§ћћўў§§ћћўўћўўћ§ћњ§ўў§ў§ў§§њ§ў ўќ§њ§ўўњћњ§ўњ§§їњ§њ§љљћњ§§ќњ§§ўўќ§ўў§§ўѕњ§ўўћћўў§љћћ§ќљњ§ўў§ў§§ћ§§ў§ўћўў§ўў§ўўћћўўњ§§ќљ§§ўўў§њњјћўћўћўћўўђњћљ§ўўћ§њ§§њ§ўўћ§њ§њ§§ќў§§ўў§ўўћўў§ўњ§§ћњ§§њ§§ўіњ§ћўў§њ§ћ§§§љњў ўў§ўўѕћў§ўў§§ўўћ§§ћўўњњљѕћљјљљў§§ўў§§ў§ў§ћў§њ§ўўўћўўћљўћўў§§ўўўћўў§ўћћўћћў ўћў§§њў ўрњ§§ўўћўўњўў§њўў§§њњ§њњљјњњћўћћњ§§ќћљ§ўўћћњўў§§ўўћўў§ћ§ў ўўњ§§љћ§§ўў§ћћўљ§§§њ§ўў§ћ§ ўўњўўіћњ§љїљћљњ§§ў§§ћўўќњћћ§§іњўў§љ§§ћ§ў ўўћўў§ћўћћўњњћљњўћўўўњўўѓ§њљћўћ§ћљљ§ў§§ўњ§§ћ§ўјћўњљ§ћћўўќ§ўўћћўњћњ§ўћўўќћўћўўўћўў§§љњ§§ўљўўћўў§§ўћўўэ§њ§њћћў§§ўў§§њћћў§ћћњ§њўћћў ў§ўўњўўќ§њњ§§іў§§ћљ§ћўћўўў§ўў§ќћўћ§§ќћњћ§§ў№љј§ў§§љљїљћћ§§њ§§ћ§ўњ§ќўћ§њњћљ§ћћњњћ§§љћ§љїј§ўўў§ўўўћ§§§ў§ўўў§ўўў§ўў§ђћў§§ћўў§ћ§ћ§ћўў§§ў§§ўў§§ћћљћ§ўўў§ўўњ§ў§ў§ўў§ћ§љњћћ ўћ§ўў§ўўѓћ§ћ§љњњћ§§ћ§њњљљњћ§ћ§ћўў§їћ§ћ§ћ§ћ§ћћљ§ћ§ћћњўў§ѕў§ў§њ§ћў§ћњњ§ѕў§ў§§ћћњ§ћўўў§ўў§ў§ўљ§ћћ§§њ§§ќњў§ўўіћ§ћўћ§ћў§ўў§ђњјљ§ћ§њћ§§ўў§ўў§їў§§ћ§ћ§ћўў§§ў§§єћ§§ў§§ћў§ў§ўўњ§ў§ћћўўќњљљ§§ўњ§ўў§ћўўў§ўўі§ћ§њћћўћћњњѓћњњћ§§ћљў§ў§ўўў§ўў§їўњњјїљ§§ўўћињћћ§§ћћўў§ћћњњћ§ћћњћћ§ў§ћ§ў§ћўў§ћў§§ћ§ћўў№ћ§§ўў§љјљ§ўў§ўћ§§ўќћњњ§§ўћўўїћ§ўў§§ћ§ўўњ§ў§ў§ўўў§ўўі§ўў§њљњў§ўў§єў§ћ§њћљћћў§ўўўћ§§ўћ§§ћћњћ§ўўў§ўў§№ћў§ў§ў§ў§§љљњў§ўўўћўўћњ§ћ§ўў§§ўў§ўўў§ўўјћ§ћ§ћ§§ўў§§ў§ўўє§ўў§љјњ§§ў§ўўў§ўўї§ћ§ћў§ў§ўўј§ўћ§ћ§§ўўє§ўћ§ћ§ћ§§ў§ўўњћ§§ў§ўўћўў§§ўћ§§љў§ў§ў§ўўћ§ћ§ћ§§юћ§ћћњ§ћў§ўћњљљњў§ўў§єў§§ћў§ў§ўћћњњ§§ў§ў ўѓ§ў§§њћњњ§§ћ§ћћќњћћ§§ќћў§ўўў§ўўю§ўћ§ћ§§ўћњјѕјћњўћўўў§ўў№ћ§§ћњћћ§ћ§ўўћ§ћ§§ьћ§ўў§ўћ§њ§§ў§ў§§ћ§§ўўщ§ў§ћћ§§ў§ўњјјћћ§ћ§ћ§ўўћћ§§њћћўўћ§§ѕћў§§ћ§ћ§ћ§ўў§§њћ§§§ў§ўўў§ўўњ§ўў§ўўр§ў§ўћ§§ћњњћў§ў§§њћњћњ§њ§ћў§ўў§ћўўў§ў ўњћљњ§§ўўіњћ§ћћўўћћўўќ§ў§ўў§юћ§ћ§њћњћњћњ§ћ§ћў§ўўю§ўћў§ўћ§§ћљјљћ§§ћ§§ўќћ§§ўўў§ўўё§ў§ўў§ћ§§ћћ§ћ§њњћў§ўњћћјљјјљјїјћћўњћћў§ўўў§ўўщ§ў§ў§ћћ§ћ§њћљњњћњћћ§ћ§њњ§ў§ўўк§ў§ў§ћљјїљљћњћњћњ§ћў§§ћ§ўў§ў§§ћ§ћ§ћў§ўўўћњњўћ§§ўў§ўўќ§ў§ўў§щћ§ўў§ћљљњћњћћ§њњљћўў§ў§§іў§ў§ў§§ћ§њњ§љњ§§ўњ§ўў§ћ§§ќћў§ўўњ§ћћў§ўў§љђњ§ўў§ў§ўћ§ћ§§ўўћњќћњћњњѕћ§§ћљљњћ§§ўўќ§ў§ўўћ§ћћ§ўўјњљљ§ўў§ўўќ§ў§ўўњћ§ў§ћ§§њќћ§ћ§§ў§ўќ§ў§ўўь§ўћћў§ћ§ћ§ћћљјљћћў§ўўўћўўќ§ў§ўўў§ўўѕ§њћњћњ§ћ§ћўўќћ§§ўў§ѕћ§ћўў§јїј§ўў§ђћ§§ў§ўћ§ћ§ћ§§ўўѓћ§ћ§§ўћњњ§ћ§ўўћћ§§ўћћ§ўў§ўў§шњїљћћ§ўў§ўћ§ў§ћ§ћ§ћ§ўў§ўўў§ўўэћ§ћћњ§њ§ћў§ў§§ћўў§ўўј§ўћўў§ћ§§ћњјљћ§§§ў§ўў§њћ§ћў§ўўўћ§§ў§ёћ§ћ§ћ§ћћњ§ўў§ў§§ўћ§ўћ§ћћўѕ§њљљћћ§§ў§ўў§ѕћўў§§ўў§ћ§ўўў§ћћї§ћў§ўў§ћўўћўњўўў§ўўўћ§§ќћў§ўўј§њњ§§ўћўўѓ§ў§ўћњ§§ћ§њљћћ§єћў§ў§ўћў§ў§ўўќћ§§ўў§ўћўўј§ћљјїњ§ў ўш§ў§ўћ§ћњћ§ћ§ўў§ў§ўў§ћ§ћ§§ќњ§§ўўєћ§љјњћњ§њћў§§ћјњљјјњ§ћўўў§ўўќћ§ћўўц§ўћ§ћ§§ў§ў§ў§§њњћ§ћўћ§њ§ћўўќћўћ§§ўћќњ§ћ§§їў§§ћ§ћ§ћ§§ўљ§ћ§§ў§ўўђћ§ћњћ§ћ§њўћћ§ўўў§ў ўћђњ§ћ§§ўћњњ§ћ§ћўўќ§ў§ўўєћ§§ў§ў§ўў§ћ§§ћў§§ћўў§§ў§ўўў§ўўѕ§њ§ћўћ§ћ§ћўў§ќћњћ§§ѕћ§ћў§ў§ў§ў§§ѓћ§њћњ§§ў§§ћ§ћћ§§ћўў§ђћњњћћ§ћњћ§ћў§ўўј§ўћ§ћўў§§ўѕ§ћ§§ўў§§ўў§§ўћ§§њћ§ў§§ўўєћ§ћ§ћ§ћћљћћўўў§ўўў§ўўў§ўўќ§ў§ўў§аћў§ў§ў§ўћ§ћўћ§ћў§ў§ўў§ћћњ§§ў§§ћ§ћ§ћћњ§§ў§ў§ў§ў§ўўј§ў§ў§ў§ўў§ќћў§ўў§§ћ§ўўќ§ў§ўў§єў§ћ§ўў§ў§ўћ§§ѕў§§ўў§ў§§ћўў§ќћ§§ўў§§ўћћћ§ћўћўў§§ў§§ў§їў§ў§ўў§ћ§§шњјїјљњњ§њ§ћ§ћ§ћ§ћ§ћ§ў§ћўўѓ§ћ§ћ§ћ§§ћў§ћў ўхћ§ћ§ћ§ћ§њ§§ў§јѕїњ§ћ§ћ§ћ§ћ§ћћљњ§ўў§§ўўќ§ў§ўўєћ§ћ§њћ§ў§§ћ§§ќћ§ћ§§ўћўўћћјјћўў§ќћ§§ўў§§ћўўјћ§§ў§ў§ўўъ§ў§§ћ§ўў§§ћ§ўў§ўў§њћћўўў§њњўћ§§јћ§§ў§ў§ўўс§ћ§ћ§§ў§ўћ§§ў§§ћ§ћ§ћћ§ўћњћў§ў§ўўћ§ў§ў§§§ў§ўўњћ§њћћўўў§ўў§љћ§ћўћ§ћћёњћћњћћўў§ћў§ўћўўќћ§њўўў§ўўќ§ў§ўўћќљћ§ўўќ§ў§ўў§ћ§ўўшћ§ћ§ћў§§ћ§ћ§ћ§§ў§ў§ўў§ћўўћяў§ў§ў§§ћў§§ћћњњћўў§їћњћ§ў§ў§ўўў§ўў§іћў§§ћ§ћ§ћ§§ћћ§ўўћћўј§ў§ў§ў§ўўњ§ћљћ§ўўі§ў§ў§ў§ў§ўўќћ§§ўў№ћ§ћ§ў§ћћњ§ћ§ћ§ћўўўћ§§јћ§§ў§ў§ўўч§њљњћћ§ўў§ўћў§ўћ§§ўў§ћ§§ўў§ўћўўј§ў§ў§ў§ўў§јў§ў§ўћ§ўўћ§ўў§ћћ§їћ§ћ§ћ§ўўћћя§ћњњћў§ћ§§ўћ§§ў§ўўј§ћў§ў§ў§§ъў§§ћ§ћћ§§ћћњњљјјћћ§ћћ§§ћћ§ћ§§ўўјћ§ћ§ћ§њ§§ћћ§ћ§ўўњ§ў§§ћўў§іћўћ§ћћњўћўў§іљјљћ§ћћ§ћ§§ўћ§§ћ§ўў§ўў§њћ§ћў§ўўя§ћ§ћ§ћ§ўў§ўћ§ћў§ўўћѕљ§ўў§ў§ў§§ћћѕў§ўў§ћ§ћ§§ўўў§ўўў§ўўіћ§ћ§ћ§ћ§ћўўў§ўўќћ§ћўў§јўћ§ћ§ћ§ћћѕњ§§ћ§ћ§ћ§§ўўє§ўўћ§ўћ§ћў§ўў§ўћїњћњ§ћ§ћў§§ёў§§ћ§§ў§ўћњћ§ћўў§єћў§ў§§ћ§§ў§ўўўћўў§§ћ§ћћ§ўў§§љў§ў§ў§ўў§ќњћћўўћћ§ћћ§§њў§ў§ў§§ќћ§ћ§§іћў§ўћ§§ў§ўў§јћ§ћ§ћ§ћ§§їћ§ћў§ў§§ўў§§њ§ћћїў§ў§ў§ў§ўў§§ў§§ў§ќўћ§ўўх§ћ§ўў§ў§§ћћњћњћўћћ§§ўћ§ћў§ўў§єћў§ўў§ћ§ћ§ћ§§ўј§ў§ў§ў§ўў§ўћўўў§ўў§њћ§ћў§ў ў§ў§ћ§ўўў§ўўі§ў§ћћў§ў§ўў§ћў§ћћ§§њћњљљњўўљ§ћћ§ћћ§§ўў§ўўі§ўћ§ћў§ў§ўўќ§ўћў ўї§ў§§ћ§ћ§ћћ§ќўћћњњћћ§ћ§ћўўў§ўўіћ§њћћ§§ў§ўўў§ўўє§ў§ў§ў§ў§ў§ўўц§ў§ўў§ћћњћњў§§ћ§ћў§ў§§ўў§ўўь§ћњ§ћ§ћ§§ўћўћ§њ§§ў§ў ўў§ўўў§ўўѕ§њћ§§ў§ў§ў§§ўў§§ѓћњўў§њћћ§ў§ћ§§єћ§ћ§њћћ§§ў§ўўќ§ўћўў§§ў§§ў§§ў§ў ў№§ў§§ћ§ћ§ћ§ћў§ў§ўўќ§ћ§ўўшћ§ћ§ўў§§ћў§§ћ§ўў§§њћњ§§ўўў§ўў§јћ§ћ§ўў§ўўўћ§§ўћ§§њћўў§њўўђ§ў§ў§ўћў§ў§§ћўўєћ§ћћљњћ§ћ§§ўўў§ўўћ§ћў§ћћяњћћ§ћ§ћћњћћ§ћ§ћ§ћў§ћўў§§ѕў§ў§ў§§њњ§ўўќ§ў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўўј§ў§§ћ§§ўў§їў§ўћћњўћў ўў§ўўў§ўўюћў§ў§ў§ўћўћў§ў§ў§ўўћ§ў§ў§§ђў§ўћ§ћў§ў§ўћ§ўў§ёў§ў§ў§ўў§ў§ћ§§ўў§ћўћ§§ўўќ§ў§ўўќ§ў§ўўљ§ў§ў§ў§§ўў§ўўў§ўў§іњў§ў§§ўў§ў ўў§ўўњ§ў§ў§ўў§ќў§§ўўљ§њћ§ў§ўўў§ў ўћ§ў§§ўў§ћ§ћћ§њў§ў§ћў ў§јў§ћћњћ§ўўјћ§ћў§§ћўўь§ўћ§§ў§ўћ§ћ§§ў§ў§ў§ўўў§ўўќ§ў§ўўў§ўўњ§ћљћ§ўўќ§ў§ўў§ћў§ў§ўўў§ўўќ§ў§ўў§§њ§ўўћ§ў§ў§§§ўћўўє§ў§ў§ў§ў§ў§ў ўў§ўўћ§ћњ§ў ўќ§ў§ўўў§ў ўњ§ў§ў§ўў§ ўњ§ћњћ§ў ўќ§ў§ў ўќ§ў§ўўњ§ў§ў§ўўў§ў ўўћўўў§ўўў§ў ўў§ўўі§ў§ўў§ћ§§ўў§§њћўўў§ўўў§ўўћќњ§§ўў§ўћ§§ёў§ў§ўћ§ћ§ћў§ў§ў ўќ§ў§ўў§ћњ§ћ§ўўі§ў§§ўў§ў§ўўќ§ў§ўўў§ўў§ўќ§ў§ўўњ§ў§ў§ўўѕ§њ§ћў§ў§ў§ўў§њћў§§ћўўќ§ў§ўўј§ў§ў§ў§ўўћ§ў§ў§§§ў§ў ўћ§ћ§§ў ўњ§ўћў§ўўњ§ўћ§ћ§§ў§ўќћ§§ўўі§ў§ў§§ћ§ћ§§§ў§ўў§ћіљ§ћў§ў§ў§ўўў§ў ўї§ў§§ћў§ў§§љўћ§ћў§ўў§ьћ§ћ§ћўњњћњљћћ§ћў§§ћў ў§љў§§ћўћ§§ћћў§ў§§ ўћєњћњћћ§ћ§ћ§§ўўќ§ў§ўўњ§ў§ў§ўў§ћў§ў§ў ўљ§ў§ўў§ћћѕ§ћ§ћў§§ћ§ћўўў§ўўє§ў§ўњўћ§§ў§ў ўњ§ў§ў§ўў§§ћўўњ§ћњћ§ўўќ§ў§ўў§њћ§ћ§ћ§§іћўў§ћћ§ў§ў ўў§ўўћ§њћ§ўўї§ў§ў§ў§ў§§ћў§ў§ўўќ§ў§ў ўє§ў§ў§ўћ§ћ§ћўў§јћ§ћ§§ў§ўў§ ўњ§ў§ў§ўўў§њњў§ўўќ§ў§ўўњ§ў§ў§ўўљ§ў§ў§ў§§§ў§ўўў§ўўќћў§ў ўј§ћљњћў§ўўј§ў§ў§ў§ў ўњ§ў§ўћ§§ўў§ўўў§ўўє§ў§ў§ћљ§ћў§ўўќ§ў§ў ўќ§ў§ўўє§ў§ў§ў§ўћ§§ўўў§ўўђ§ўћ§§ў§§ћћўў§ў ўў§ўўќ§ў§ўўњ§ўћ§§ўўў§ўў§ћ§ў ўў§ўўћ§њў§ў ўђ§ў§ў§ўћў§ў§ў§ў ўў§ўўў§ўўљћўљћњ§ўўј§ў§ў§ў§ўўљ§ў§ў§ў§§ўћћњўћў§§ѓў§ў§ўћ§њћњ§§ў ўў§ў ўќ§ў§ўў§§ў§ўў§ўў§ўў§ћў§ў§ўўђ§ў§ў§ў§ў§ў§ў§ўўќ§ў§ўў§§ў§§ќў§§ўўў§ў ўњћ§§ў§ўў§§ў§ў ў§ў§§ў§ўўў§ўўќ§ў§ў ўќ§ў§ўўќ§ў§ўўі§ў§ў§ў§ў§ўўі§ў§ў§§ћ§§ўўј§ў§ў§ў§ўўљ§ў§§ћў§§§ў§ўўќ§ў§ўўќ§ў§ўўў§ўў§їў§ў§ў§ў§ўўі§ў§ў§ў§ў§ўўў§ўўў§ўўў§ўўќ§ўћ§§ўі§ў§ў§ўћў§ўўќ§ў§ў ўњ§ў§ў§ўў§§ў§§ўў§ўўў§ўўќ§ў§ў ўў§ўўў§ўўў§ўўє§ў§ўћћњћљ§ћ§§ѓў§ў§ў§ў§ў§ў§ўўј§ў§ў§ў§ўўў§ў ўљ§ў§ў§ў§§ўьњљјў§ў§ў§ў§ў§ўћ§ћ§§ўўў§ўў§ўћўў§њў§ў§ў§§ўћўњўўњ§ў§ў§ўўў§ўўў§ў ўќ§ў§ўўќ§ў§ўў§ўњћўњў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўў§ ўў§ўў§ўћў ўќ§ў§ўўќ§ўћ§§ќћ§§ў ў§ўћў§ў ўў§ўўќ§ў§ўўј§ў§ў§ў§ўўў§ў ўў§ўў§§ўћћўћ§ўћ§ўўў§ўўќ§ў§ўўњ§ў§ў§ўўў§ў ўќћ§ћўўў§ўўђ§ў§ў§ўў§§ў§ў§ўўў§ўў§ў§њћ§ћў§ўўў§ўўќ§ў§ўўў§ў ўў§ўўў§ўўю§ўћўћў§ў§ў§ў§ў§ў§ўўі§ў§ў§ў§ў§ўўќ§ў§ўўў§ўўў§ўўљ§ў§ўћў§§ћэ§љњћў§§ћў§ў§§ћ§§ў§ўў§ўў§§ўў§ўўў§ўўў§ўўњ§ўћ§ћўўљ§ћњћћў§§ўў§§їў§ў§ўћ§§ў ўќ§ў§ўўј§ў§ў§ў§ўўў§ўўћў§ўўў§ўўњ§ў§ў§ўўј§ў§ў§ў§ў ўў§ўўѕ§ўњў§ў§ў§ў§§їў§ў§ў§ў§ў ўў§ўўў§ўўјћ§ћ§§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўњ§ўћў§ўўћ§ў§§ўўќ§ўћўўў§ўўє§ў§ў§ў§ў§ў§ўўў§ўўђ§ў§ў§ў§ў§ў§ў§ўўў§ўўњ§ў§ў§ўўў§ў ўў§ўўў§ўўў§ўўќ§ў§ўў§іћ§ћў§ў§ў§ўўў§ўўў§ўўє§ў§ў§ў§ў§ў§ўўў§ўўќ§ў§ўўў§ўўў§ўўћ§ў§ўћћў§ўўњ§ўћў§ў ўў§ўўі§ў§ў§ўћў§ўўјћў§§ћў§ў ў§ќћў§ўўє§ўћўћ§ўў§ў§ўўў§ўўјћ§§ў§ў§ўў§ўќ§ў§ўўў§ўўц§ўћ§ўў§§ћ§§ў§ў§ў§ў§ў§§ћў§ў ўў§ў ўў§ўў§§ў§§ћў§ў§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ўў§ќћ§§ў ўї§ў§ў§ўў§ўўј§ў§ў§ў§ўў§ ўў§ўўі§ўћћ§ў§ў§ўў§ўъ§ўћ§ћ§ћ§ўў§ў§ўћ§ћў§ў§ўўњч§ћљљњћј§ў§§ћљ§§љ§ћњњљћњњ§§№њћ§§ћћјљљњ§§њ§§њњњљћљљћљљћѕ§ўў§ћњљћ§§ћћ§љ§ўў§уљћ§њћљћ§§ў§ћњћћљћћ§њ§њ§љћћ§§љљ§ѕўњ§§љћћ§њ§ўўљюћ§ћљћ§ћћўў§ў§њ§§њ§§ћћљћћ§§ўњ§§ћњ§ћў§§њљћћљ§яћ§њњ§њўўњћ§§ў§њњ§§ћўћ§§ћћљўјїїїњћ§§љњ§ў§§њ§ћ§љњ§§ўњ§ћљ§ћ§§ћў§њљ§§ћўћў§ўўњ§љћљљћћ§§ўњ§§њ§ўљћћђњ§§љћ§ў§§љњљ§ўўя§њљљћћјњћњ§њ§§њњ§§љ§їљћћјћљ§њ§§ћњћћљ§§ўњ§§ѓњ§§њњћљњ§ћў§ћћјњјћ§§ћњ§§ћў§ўўћ§ў§љњњўћ§§ў§ў§ѕў§§ћћњ§њљњ§§ћ§јњ§љјћћњ§§њњљљ§§ўўњўј§ћћ§§њ§ўўќћўњ§§ћњћњ§ўўєњўњ§ў§§ўћўў§§ќљњ§ћћѓєјћћ§њўў§§ћљ§§ћћјїћљ§§ќћјћ§§ўњљљћћњњ§ўўўћўўчљ§ўћњ§њњћћјњјјїєјљ§ћњ§§љ§§ќњ§њ§§ўћ§§њњћўў§ћћіљћ§§љћћњњ§§ўњћћјћљћ§њўўіћ§ћўўћћўў§§љњјњњљ§ўў№ћўў§љ§њњ§ћћ§ћљћ§§ўћћ§њ§ў§§ў§ўћ§љњ§ўўѓњ§ћћњўћў§ћјњћћ§љћћњ§њ§ўўї§њ§§ўћўў§§їћ§ўўћў§њ§§ќљћљ§§ђњ§ўњ§њњ§ћћ§§њ§§ћљћњњћћ§їњ§§љ§§ўћ§§ёљћћљљјћњњ§њ§љљ§§ћќ§њ§ўўњфў§§њ§§њ§§ўў§§ћ§ћћљ§ћћ§ў§§њ§ўўїњљјјљ§ўћ§§ў§ўўћ§§јњ§§њљњ§ўў§ќљ§њ§§§њ§ўў§ћћљњћўўєћјљћћљ§љњ§§ўў§ўњ§§њ§њ§ѓљјћћ§њњ§ўў§§ўўў§ўў§љљ§ўў§§ўў§љќњўњ§§ўњ§§јњћћњјћћљљіј§ўћўњњ§њ§§їљћ§§ўћ§њ§§ќњ§њўўўћўўњћўћ§њ§§ђћљћљљ§ў§§њљљћ§§ѓјћ§њљљћњњ§њ§ћћ §№њ§њ§§љћ§њ§§њ§њњ§§ѕњ§§ћ§§ўў§ћ§§ў§ћјјїљћў§§њ§§ў§іњћ§§ў§§ћњ§§ўљњ§ўўћћўў§јћљњ§§ћ§ўўя§њћјїїљњјћћ§§љљћњњ§љњў ўљћўўњњљћћ§ўќћ§§ўў§ћјѕљјњњљћ§§ўћўў§ўўњ§§ўч§њ§ћ§§ўўњњћћўўћњ§§њ§ћњ§ў§§ўњљўўћћўўў§ўў§јєљћћњўўћњ§§њ§§ѕљ§ћћў§§њ§њ§§ўњ§§ўќћ§њ§§ўњўўѕњ§њљћњћћ§§ў ў§ќњ§§ћћћљ§§ў§§ўћ§§їћњњљћљћ§њњћљ§§ў§§§љћ§§§ћў§§ћ§§њ§ўўћѓў§§ћњ§§ћћ§ўњ§§ћњљ§њћљ§§ћ§§§њљ§§ќћ§§ўўя§њ§љћћ§љћњњљ§њ§њ§§ќњўў§§ќјњњ§§юљћ§ўўњ§ўўћўњљњїјў§§іњ§ўў§§њ§ў§§ћњћ§§ўўўњљљїћљ§љ§§њ§ўўэћўњ§њ§§њњљћћњ§ўў§§ўўјљћ§ў§§њ§§ћњў§§ўўћћ§§њ§§јљ§ћљљјњўўў§ўў§§љћњњўј§§јњ§ўў§§њўўћњљљњ§§ўўњ§§ўјћ§ўў§§ћўўї§љњњћљћ§ўў§ќњўў§§ќњ§њўў§ўћў ўўћ§§ўќљ§ћўўњћ§ћњћ§§їћ§љј§ў§§ў ў§ў§њ§ўўўњ§§њњ§§ўў§§ўћ§ћ§§ўўўћўў§ўўћўўшћїљљћ§њћћўў§§љћћњњ§§њ§њўўє§љњ§§њ§њўў§ўўћўўњ§§ћ§ќћўў§§ўћ§ўўћўўќњћћўўћєўњ§ћћјљ§ћў§њњ§їћў§ўћўў§ћћ§њўѓњ§§ћћљњ§њњ§њўўњћњ§§ћљљњјљ§ўў§§ўяћўћўў§§њ§ўўћўўћў§§ў§ћ§ўўћўў§ўћћўўњ§§љ§ўјћ§§ўў§§ўўўњ§§іўћњ§њ§§њћўўћўўћўўћћў§§ўў§ўљўўўћўўњњ§§њљўў§§њ§ўў§ћў§§їњљћїјљћ§ўўњ§јў§њ§њ§§ўў№љњ§њ§љњјњљћћњћћ§§јљћ§њ§ћћ§§§љњ§§њћљ§§њ§§њэ§љ§њ§§ћ§ў§ћљњ§§ћљ§ћћ ў§ћў§§ќљћћ§§ўї§§њ§ёўћњ§§љћ§§ћўў§ћ§§ќћљћ§§їњ§§ўўњњћўў§§њўўњ§њ§њљўў§§њўў§ўњ§§ ўќ§њ§ўўљњ§§ў§њ§§ўњћўўћћ§§§ўћўў§яњўўњљљћ§њ§ћў§њ§њўўћћ§§њўўўћўўћ§ўќћ§ў§§§ћљњњ§ў§њў§ўўњі§ћљћњ§§њ§ўўјљњ§§њ§§ўўф§ўўћћўў§љљћ§§ўўћ§њћљћћ§ћўў§ўўјћ§њўћўћўўћ§ћљљ§§ќћ§§њњќљ§§ўўќ§љ§ўўј§љњћў§њ§§ќјћњўўўћўўїћўўњ§§љљ§§ўќћўў§§љ§ўљ§§њі§њњћ§§љћњ§§њњ§њ§ў§ўў§њўі§њ§§ћњ§њ§ўў§ўњћћў§ћћ§ўќ§њ§ўў§ћћ§ў§њ§§ў§ќћљ§ўў§ўћ§§ќњћњў ўюћ§њўўћў§ћћ§§ўћў§§ўў§ўўћўўњћў§§њ§§іњ§§ўў§§ўў§§љњ§ћ§њњўўќћ§§љљњїћ§ўў§§њњўў§§њ§§љјљћ§§ѕўў§ўћўўў§ўў§§ћ§§ўћўў§ћўє§љћјћћњ§§ћјњњѓљњњјћ§§љљћњћўўўћўўт§њ§њњў§§њњ§ўў§њ§ўў§њ§њ§ў§љ§љљ§§њўўћўўљћўўћўћў ўќћўћўўўћўў§ўњ§ў§§њ§§ў§ћў§§ўћ§ћ§ў§§њ§§ћўў§ѓњћў§§ћјњ§ўў§ўў§ўњ§§њњ§љћњ§§іњћћљ§ўњјћљљўћ§§ў§јњћљћћњњ§§њ§ќљњ§ўўјњ§ћўћ§§ўў§їћљћћ§§ўљ§§ўњ§§ў§јў§њњўў§јјљїєїјљ§ўўўћўў§ќћўћўў§§њ§ўўі§јњћ§§ў§њ§§§њў§§њ§ўіћўўћ§§ўўћўўљ§њ§§њњўў§ўў§§ў§ў§њњ§њ§§ўўњя§ўўћўћў§њњў§њ§§ў§§ћўњ§њ§§њћў§§њўўўћў ўўћўўњћў§§њўўћћўўњ§§ўўњћћ§ў§ ў§ў§ўў§§ўљћ§њњ§§ћћћљ§ў§ћћѓ§њљћ§љћњљћ§§ў ўўћўў§ќљ§§љљ§ў§іњ§њ§њ§§њ§ўў§ўї§љћљ§§ўћўўљњњ§§њћўўћћўўћ§§ў§њ§§њўў§ыћљ§њљћ§§њњ§§њљњњўћў§ўў§њ§ўўўћўўњњј§§ўў§§ћљ§ћљљћћјјћў§ўўњ§њ§љћўљњњ§ў ўўћўўћ§ўўћўў§ђњўў§ћћљњјћћњћ§§ўњ§§ћћў§§ўў§њўў§§ўў§ўўћћўњ§ўўїћўўњћћљљњњћјљћљљјљћ§§ў§ўќ§њ§ўўќ§ўў§§ўў§§њ ўљ§њ§ўўћ§§ўўћўў§ъњћћљњ§§ўћ§њћћ§ћ§њњљћњ§§ђћ§§њћ§њћ§ћћ§ћ§§ўћ§§њћњћћњћћѕњћњћћў§§њ§ћћљ§њћњћћўўсћ§ћњћ§њћњ§ћўћњљћњћњћћ§ћ§ћћњћћ§ћћѕў§§ћћњћћ§ћўўќ§ў§ћћў§ћч§ћ§ћ§ћ§њћњћћ§ћ§ћ§ћ§ћ§њћњ§§ќћ§ћўўљ§ўћ§§ћњњћў§ћћ§ўљ§њ§§ўћ§§єћ§ћ§ўўћћњћњћћћњћњћљљћѕ§ў§ћўћ§ћ§ћ§§ђћ§ћ§ћћњћ§§ћ§§ўўјћњћ§њ§ћ§§ћ§§ћўўёћў§ўў§ћњћћњћњ§ћћє§ћў§ћћ§ћ§ћ§ћћ§ьћ§ћћњњ§§ћћњ§ў§ћћљћћўў№§ўћ§ћћњњћ§ў§ћ§ћ§§ћћ§ћ§ћћј§ћ§ћ§ћћњњћѓ§ћ§ћ§њњћ§ћ§ћ§§њћ§ћ§ћ§§фњћ§§ўўћћњћњљњћћ§њ§ћ§ћ§ћћњ§§ўўхћўћћљњљћћ§ћ§§ў§ћћў§§ћўћћњњ§§тў§§ћ§ћћњ§ћ§ћћ§њњ§ћ§ћ§§ћћ§ћў§ў§§ўћ§њњћ§§§ў§ўў§јћ§ћ§њ§ћўў§ќў§ћўў§ѓћ§ћ§ћў§§њћњћњњ§ќў§§ћћќ§ћ§њњјћњўћ§ћ§њњљ§ћ§ћ§§ћћўњ§§ўі§ўћўў§ћ§§њњѕљњњћћњћ§њ§ћћљ§ћ§ћ§ћ§§ћ§њ§ћћњ§ўў§§њњѕћњњћњћ§ћћњ§§цћ§ћ§ћ§§ћњћњ§њћњ§§ў§ўўћўў§ўў§єћ§ћћњљљћћў§ўў§ўў§§ђћњњ§њћњ§ћ§ћ§§ўўйћ§ћўћ§ћ§§ўћ§§ўћћ§§ўў§§ћњњ§ўў§§њњљћњћњ§ћћњњ§ћ§ћўўѕћ§ћ§ўў§ўћ§ћћќў§ў§§іћ§ћўњћћ§ћ§§ўћ§§ќњћћ§§оћ§ћ§ћћљљњћњ§ћ§ћ§ў§ћўўћћ§ћ§ўћњћћњњ§§ћљ§ћ§њћњ§§ўќ§ўћ§§ьћ§ћ§§ўћ§њ§њњћ§њћћўћ§§ўь§ћњњћћўў§ћ§ћ§ўў§§ћћўўю§ћ§ћћ§§ћ§ћ§ћў§ўћ§ћћс§ћ§ћ§ћў§ўћ§њћ§ў§ў§њ§ћњћћ§ћ§ћ§§ўўћ§ў§§ћћ§ћ§§ћ§§ўћ§§јћ§ћћњћњ§§њћў§ћћўў§§ў§ўўќ§ћ§ћћєў§§ћў§ў§ўћ§ћћю§ўў§ћ§ћ§ћ§ћ§ћ§ћ§§њњћќ§ўў§§ђћ§ћњћ§§ўћ§ћ§ћ§§§ў§ўўќ§ў§ўўї§ў§ўћ§ћ§ћћћўћ§§ћћѕ§ћ§§ћћ§ћћњ§§њћї§ћ§ћ§ћ§ћ§§ќћўњ§§ќћ§ћ§§ќћ§ћ§§љћњћ§ўўћћ§§ћўўљћ§ћ§њћњњћћњўћ§§§ћ§ўўщ§ћ§§ћћ§ў§ћћ§§ћ§ўў§§ћў§ўўћ§ўћ§ћћљ§ћ§њ§§ўўїћ§њњљљјљњњў§ћћ§ћў§ў§ўўў§ўў§јћњћњ§ћ§ўў§§ћўўѕћ§ћ§ћ§ћ§ћћњњїћњљљћњ§ћўўњћ§ћў§ўў§ъћ§§ўћ§ћњћ§ўў§§ўў§ўў§ћ§§іњ§ћўћ§ћ§ћўўќ§ў§ўўўћўўь§ўћ§ћ§ћ§њњћћњ§§ўў§ћ§§њћ§ћўћўў§іћ§ћ§ћ§ћў§ўўњ§ў§ўў§§§ћ§ћћ§ў§єћ§ћћљћњ§ћў§ўўў§ўўўћ§§ўћњњљћ§ћўћ§ћћњ§ћћљљћћ§ћхўћ§ћ§ћћњ§ћ§ўўћ§ћ§њћћ§ћ§ћў§ўў§ыћў§§ћћњ§ў§ћ§ћћњћњћљњћћ§вћ§ћўћ§ћ§ћ§ћ§њ§ћў§ўћ§ћћњћ§ўњљљћћ§ћ§ћ§ћ§§ўћ§ћ§ћ§§їћ§§ћњ§§ў§§ўљ§ћљћњўћћє§ћўў§ћ§ћўћ§ћћћ§њћћўўў§ћћї§ў§ћ§ћў§ўўѕ§ћ§§ћ§§ћњћ§§їўћ§ўў§ћњ§§іћ§ћ§ћ§ў§ћўўф§ўў§ћ§ћ§ћ§ћ§ћ§ў§њћћ§§ў§ўћ§§ўў§ћћ§ћћљљјњћ§ћ§ћў§§ўј§ћћ§ћ§ћўўј§ў§§ћ§ћўўш§ў§ўћў§§ћў§ў§§ў§§њћњћў§ўўјћ§§ў§ћћ§§ў§ћ§ўўќ§ў§ўў№§ў§ўћ§ћ§ћў§ўћў§ўўя§њљњ§ћ§њ§ћ§ћўћ§§ўўъ§ў§ў§ў§ў§§ћ§ћ§ћў§ў§§ћўў§юћ§ћ§§ћћў§§ћ§§ў§ў§ўўћ§§ў§ўўјћ§ўў§ў§ўўъ§ў§ў§њњћћњћ§ўў§ўћ§ўћњ§§єћ§ћ§§ў§ћћ§ћ§§ўў§ўў§ьћ§ћ§ћћњ§ћ§ћ§ўў§§ћ§ћўўќћ§§ўўў§ўў§ўў§ўўѕ§ћћњњћ§ўўћ§§њћ§ўўћўўљ§њћњ§ћ§§ъў§§ћ§њњў§ћ§§ћўў§ў§ўў§ћћї§ћ§§ўћ§ћ§§ўў§ўў§ќћ§ћўўњћ§ћў§ўўіћ§ћћњћњ§ћўўў§ўўјћ§§ў§ў§ўўї§ў§ў§§ћ§ћћјў§ўў§ћў§§јў§ў§§ћ§ћћѓ§ћўў§ћ§ћ§§ў§ўўў§ўўў§ўў§§ў§§ў§ўу§ў§ў§§ћ§ўў§ў§§ћ§ћ§ћў§ў§ў§§ћ§ћћћ§ћ§ћњњќћњћўў§єћ§ћўћ§ћ§ћ§§ўў§ёћљњљћћњ§ўўћ§ћ§ћћы§ћћњ§ћ§ћ§ћ§ћ§ћ§§њњћў§§њћ§ћ§ћ§§јћўћ§ћ§њ§§ћњћ§§ћћў§њњ§ў§ў ўюћ§ћ§ћ§ћњњ§ћ§ў§ћ§ћ§§ѓћ§ћўў§ћ§ћњћ§ўўѕ§њ§ћ§њћњ§ћ§§јћўў§§ў§ўўѓ§ўћ§§ў§ўћ§ћ§ўўќ§ћ§ўўњ§ў§ўћ§§ќћ§ћў ўћћ§ћў§§јћўћ§ћ§ћўўў§ўўў§ўўќ§ћ§ўў§јћ§ћ§§ў§ћћќ§ћў§§ёћ§ў§ўў§ћ§§ў§ў§ўўљћњњћ§§ўўѓћўћ§ћ§ћ§ћ§њћ§§јћ§ћў§§ћ§§ўў§ўў§њњћњ§ћ§§ў§§ћ§§ўћўўќћў§ўўя§ћћњ§ћў§ўћ§њћњњћўўўћўў§ў§§ўћћў§ћћћ§њ§ћ§§ђћ§ћў§ў§ћћ§ўў§ўўї§ў§ўћћ§ў§§§њ§ўўў§ў ўќ§ћ§ћћћ§ћ§§ўўќ§ћ§ћћњ§ћ§ћ§ћћћ§ћ§ћ§§іў§ћћњ§ћ§ћ§§ћў§ўћ§§ў§ћћњ§ћ§§ѕў§§ћ§ћ§њћњћћњњћ§ћ§ћўўю§ўћ§ћў§ўћ§ћ§њћњћњ§§љћ§§ў§§ћћ§ўъ§ўћ§ћўћ§ћ§ћ§ћ§њ§ўў§ў§ўўў§ўўќћ§§ўўњћњњ§§ўўњћ§§ў§ўўќћ§ћўўў§ўўў§ўўўћ§§ћ§іћўў§ћўўћћ§§ўњ§§ ўѓ§ћўћћљњњ§§ўћ§§ўѕ§ўћ§ћ§ћ§ћ§ћћ§ѓў§ў§ћћў§ў§ўћўўћѕ§ћ§ўў§ў§§ћўўћњљћ§§ћњњљљёћљљњњћ§ћћњ§ўў§ўўў§ўўі§ў§ў§ў§ўў§§ћў§§ћ§§њўћ§ћў§§ћў§ў§ћћ§іћ§ћ§§ў§ў§ўўј§ў§ў§ў§ўўў§ўўќ§ў§ўўў§ў ўјћ§ћ§ћў§ўўїћўћћ§§ћ§ўўђћ§ћ§ћ§ћ§ћў§ў§ўўј§ў§ў§ў§ўў§§ўћћўўћћ§оћў§ў§ў§§ћ§ўўћ§њњљ§§ўћў§ў§ўў§ћ§ћ§ћ§§№ћњ§§ћ§§њњўћў§§њћћьњ§ћ§ўўћ§ћ§њћњћ§§ћ§ћ§§јћ§ћ§ў§ћўўўћўўћў§ўў§ћ§ћћюњ§ћўў§ћ§ћ§ћ§ћў§ўћ§§ќўћ§њњїћњ§ћ§§ў§ўўљ§ў§§ћ§ўўђћ§ћ§ћў§ўћњљћћ§§јћ§§ўћ§ћ§§јћ§ўў§ў§ўўњ§ўў§ћўў§§ў§§ћ§ўэћ§ћ§ћўћ§ћў§ў§§ћ§§ўћћѕ§ћ§ћ§§ў§ўў§§ўјћ§§ўћ§ћ§§їћ§ћў§ћ§§ћћѕў§ћћ§§ў§ў§ўўў§ўўў§ўўќ§ў§ўўњћ§§ў§ўўў§ўў§ѓћ§ћ§ўў§њњћћ§ўў§јћў§ў§ў§ўўљ§ћ§ћў§ўўѕ§ўћ§ћ§ћўћ§ћћўўћ§§њћњњћћ§§њ§ѕћњ§ћњљћњ§ћўўќ§ў§ўўђ§ў§ў§ў§§ћўћ§ўћћ§§ўћ§§ќћ§ћўўќ§ћ§ўў§њћњћ§ћўўі§ў§ћћ§ћ§§ўўќ§ў§ўўђ§ўћ§ћ§§ў§ўћ§ћ§§ўћў§ћћ§ћћњ§ћ§§њћ§ћ§§ўўіћў§ў§§ћў§ўўф§ў§ў§ў§ў§§ћ§ћў§§ћ§ћ§ћўў§њћћњњћў§ќћ§ћ§§ђћ§ћў§ў§§ћў§ў§ўўќ§ў§ўў§§ў§§ўё§ўћ§ћ§§ў§§њњћљњњќ§ћ§ћћу§ћ§ћ§ћ§ўўћ§§ў§ў§§ћ§ћ§§ўћ§ћ§§ўўјћў§ў§ў§ўў§ѕў§ў§ў§ћњћћљљїњћњћњћћњћћѓ§ћ§§ўћ§ўўћ§ћўўў§ўў§ўјћ§ћўћ§ћ§§ўѕ§ў§ў§ў§ћ§§ўўѕ§ћ§ћ§ћ§§ў§ўўя§ў§§ћўћў§§ўў§§ћў§§№њћћ§§ў§ў§ў§ў§§ћ§§ѓў§ў§ў§ўў§§ўћ§§ќћ§ћўў§їўћў§§ћ§ћўў§ўў§§ўя§ћћ§ћ§ћў§ў§ўћ§ћў§§ўј§ўћ§ћў§ўўјћ§ћўћ§ћўўќ§ў§ўўр§ў§ў§ў§§ћ§ћў§ў§ў§ў§ў§ўћ§§ў§ў§ўћўўќ§ўћ§§ћў§ўћўўў§ўў§ўј§ў§ў§ў§ўўњ§ћ§ћ§ћћѕўћњњћћў§ў§ўўњ§ў§ў§ўўє§ў§ўћ§§ў§ў§ўў§їў§ў§ў§ў§ўў§ќћ§§ўўў§ўўњ§ў§ў§ўўѓ§ў§ў§§ћ§§ў§ў§§љў§ў§ћ§ўў§эћ§§ў§ў§ў§ў§ў§ў§ў§ў§§яў§ў§§ћ§ћ§ћў§ў§ўў§§ќў§ў§§јў§ў§ў§ў§§§ў§ўўћћ§ћ§ћћўў§§їў§ў§ўћ§§ўўі§ћњћћў§ў§ўўў§ўў§§ў§ўўѕ§ў§ўћ§§ў§ў§§њў§ў§ў§§ўў§ўў§ћў§ў§ўўћ§ў§ў§§ўќ§ў§ўўё§ў§ў§ў§ў§§ћўћћ§§ўљ§ўћ§§ў§§ћщ§ўў§ў§§ћ§§ў§ў§ўћ§ћ§§ў§ў ўђ§ў§ў§§ћћњћћўћ§§ў§ёў§ў§ў§ў§ў§ўў§§ўўў§ўў§ўћ§§ћў§§ћўўё§ў§ў§ў§ўћ§ћ§§ў§§ ў§§ў§§ћўћћ§ўўљ§ў§ў§ў§§ћў§ў§ўўў§ўўќ§ў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўў§ћѓ§ћ§§ўћ§ћ§§ў§ўўќ§ў§ўўќ§ўћўўњ§ў§ў§ўўч§ў§ў§ў§ў§ў§ў§§ћў§ў§ў§ў§§ћћѕ§ћ§§ў§ў§ў§ўўі§ў§ўћўћ§ћўў§§ў§§ѕў§ў§§ћ§§ў§ўўќ§ў§ўўў§ўў§ўћўўќ§ў§ўў§ќњўћўўі§ў§ў§ўў§§ўўќ§ў§ўўњ§ўў§§ўўі§ўћў§ў§ў§ўў§ў§ўћ§§§ў§ўўў§ўўќ§ў§ўўь§ў§ў§ў§ў§ў§ў§ўћ§§ў§ў ўў§ўўњ§ў§ў§ўўў§ўўњ§ў§§ћўўѓ§ў§ў§ў§ў§ў§ў§§§њў§§§ў§ўўљ§ў§ў§ў§§§ў§ўўњ§ў§ў§ўўі§ў§ўћўћ§ћўўы§ў§§ћў§ў§§ћў§§ћ§§ў§ў§§ўм§ў§ў§ў§ў§ў§ў§ўў§§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўўќћў§ўўю§ў§§ћўћўћ§ўў§ў§ў§ўў№§ў§ўћў§ў§ўћў§ў§ўўў§ў ўљ§ўћў§ў§§ў§љћњњ§ћћ§§ћўћ§ћўўў§ў ўі§ўћ§ћ§§ў§ўўў§ўўђ§ў§ў§ў§ўћ§ћў§ћћ§ўў§ў ўќ§ў§ўўњ§ў§ў§ўўў§ўўћ§ў§ў§§ўќ§ў§ўўў§ў ўє§ў§ў§ўћўћ§§ўўі§ў§ў§ў§ў§ўў§ѕў§ў§ў§ў§ў§ў ўњ§ў§ў§ўўў§ўўћ§ў§§ћћ§ ўљ§ў§ў§ў§§ўљ§ўћў§ўћћі§ћ§ћў§ўў§ўўћ§ў§ў§§§ў§ўўі§ў§§ћў§ў§ўўў§ўўщ§ўћ§§ў§ў§ўћ§ћ§ћћњўћў§ў§§ў§§ў§§ўў§§ўњ§ўћ§ћ§§єћў§ў§ў§ў§ў§ўўї§ў§ў§ў§ў§§ўў§ўўћћўћћўўў§ўўў§ўўў§ўў§ў§јћ§§ў§ў§ў ўі§ў§ўћ§ћў§ўўў§ўў§ѕў§ў§ў§ў§ў§ўўў§ўўђ§ў§ў§ў§ў§§ћ§§ў ўћ§ў§§ћћ§ў§ўў§ў§§ў§ўўќ§ў§ў ўў§ўўћ§ў§ў§§ўў§ўўќ§ў§ўўў§ў ўќ§ў§ў ў§ћћ§§ў§§ўў§ў ўњ§ў§ў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўќћў§ўўў§ў ў§§ў§§ўє§ўћ§ўў§ў§ў§ўўќ§ў§ўўў§ўўђ§ў§ў§ўћ§§ў§ў§ўўќ§ў§ўўў§ў ўў§ў ўј§ўћ§ћћ§ўўў§ўў§јћ§§ў§ў§ўў§§ў§§§ў§ў ўќ§ўћ§§ў§§ў§§ ўў§ў ўў§ўўј§ўћ§ћ§§ў ўў§ў ўљ§ў§ў§§ўўў§ўў§ўќ§ў§ўўў§ўўќ§ў§ўў§ў§ ўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўўі§ўў§§ўћ§§ўўњ§ў§ў§ўўќ§ў§ўўѕ§ў§§ћўћўћ§ўўњ§ў§§ћўўљћ§§ў§ў§§њў§ў§ў§§іў§ў§ў§ў§ў§§јў§ў§ў§ў§§їў§§ћў§ўћ§§ ўћ§ў§ў§§їў§ў§ў§ў§ўўў§ўўј§ў§ў§ў§ўў§ўў§§ћў§ў§ўўў§ўўў§ўўќ§ў§ўўњ§ў§ў§ў ўў§ўўў§ўўў§ў ўќ§ў§ўўњ§ў§ў§ўўќћўћўўў§ўўќ§ў§ўўњћ§§ў§ўўљ§ў§ў§ў§§їў§ў§ў§ў§ўўњ§ў§ў§ўўє§ў§§ћ§§ў§ў§ўўњ§ў§ў§ў ў§§ў§§ў§§ў§ўўў§ўўњћ§ћў§ўў§ўќ§ў§ўў§ ўў§ўў§§ў§§ўі§ў§§ћў§ў§ўўх§ў§ў§ў§ў§ў§ўћў§ў§ў§ў§ў§ў§ў§§ѕў§ў§ў§ў§ў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўўю§ў§ўў§ћ§ћўћ§§ў§ў§ўўў§ўў№§ў§§ћ§ћ§§ў§ў§ў§ўўњ§ўћ§§ў ўў§ўўі§ў§ў§ўў§§ў ўў§ўў§ўў§ўўў§ў ўќ§ў§ўўў§ўўў§ўў§§ў§§§ў§ў ўі§ў§§ћћњ§§ўўќ§ў§ўўѕ§ў§ў§§ћў§§ўўњћў§ў§ўўў§ўўцћ§ћ§ћў§ў§ћћўћў§ћћў§ў§§ћ§§ўўќ§ў§ўўњ§ў§ў§ўўў§ўўї§ў§ў§ў§ў§§ўў§§ћў§ў§ў+ўќ§ў§ў ўќ§ў§ўўј§ў§ў§ў§ўўўћўўў§ўўў§ўў§ќћў§ўўї§ў§ў§ў§ў§§њў§ў§ў§§ўќ§ўћ§§§ў§ўўъ§ў§§ћ§ћў§ў§ў§ў§ў§ў§ў§ўўј§ўћ§ћ§§ўўј§ў§ў§ў§ўўњ§ў§ў§ўўљ§ћћўћў§§ўќ§ў§ўўќ§ў§ўўєћўћў§ў§ў§ў§ўўј§ў§ў§ў§ў ўў§ў ўў§ўўў§ўўќ§ў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўў§ў!ўў§ў ўњ§ў§ў§ўў§ќћў§ўўў§ў ўќ§ў§ўўќ§ў§ўўў§ўўї§ў§§ћ§§ў§§§ўћ§§ўћ§§ўў§ўўј§ў§ў§ў§ўўі§ў§ў§ў§ў§ўўќ§ў§ўў§ў§§ў§ў ўќ§ў§ўўњ§ў§ў§ўўё§ўћў§ў§ў§ў§ў§ў§§ўў§ў ўќ§ў§ўўњ§ў§ў§ўў§њћўћ§ћўўњ§ў§ў§ўўў§ўўў§ўўў§ў ўќ§ў§ўў§іћў§§њ§§ў§ўўј§ў§ў§ў§ўўў§ўўќ§ў§ўўќ§ў§ў ўў§ўўўћ§§ћ§ўћ§§іћ§ћ§ћў§ў§ўўў§ў ўў§ўўў§ўўњ§ў§ў§ў ўў§ўўј§ў§ў§ў§ўўѓњїљїљ§љњїљњ§ўўћћўћћўўьћўўњ§§ћњњ§§јљњѕњ§њћљљћћјћ§њ§§ўэ§ћљјћћњ§§љ§љ§њўўћўњњ§њ§§ћ§§ўј§§ўђ§њ§§њ§ћћљ§њљћ§§ѕўћўўћўљ§ћїјјћ§§њ§§§њћ§§ћќљћњўў§ѕњљјњўўћўњ§ўўћћњ§ў§§ўњ§§љљћјјљћ§§ћљћћљ§§њљћј§ў§§іћўћ§§јљ§§ўў§§њ§§ўў§§№љњ§§ћјїјјњњћ§њњ§§ыљњјјїјљјљ§§ўћўћ§ћњњљјјќљ§§ўўќ§ћјћћ§§њ§§іћјљј§ћћљћ§§њў§§љћ§§ѓњ§љјћљ§§љћљћ§§њћљњ§њ§§њљљњњјњїћћў§ўў§љњљћўўњћћјњ§јљљњ§ўўѓ§ћњњћњјћ§§ўћўўѕ§њ§§њљјћћ§ўўј§њ§ћћљњўўљћў§љћ§ћћђљѕљљћјјїјїћћјњњђјљњїїјћњњ§§ўћўў§њў§ўў§ћў§§ўќљћњїїјњљћўјћћўљћћљђ§ћћјњ§ћўћў§§ўћћёњљјћ§ўўћњ§ћјјњјјєћ§ћћљћјѕјњћ§§љћљћјјњїїљѕ§њ§§љјјљњ§ў ў§ѓў§§љјњїљњћћј§§њўњљћћ§§§њ§ћћўњїїўјћћљюћњ§јљ§љћјњўў§њњљљ§§њњј§§њў§§јўћўўћўў§§чњћћљљћћљћћљћљћњљћљј§љљјїјјћў§љ§ўў§ѕњ§ћ§§њћћ§ћ§§ћњ§§јљљ§цњј§ћћњ§љ§њљљјњњјњїїњћћљћћњњћ§њ§љћћя§њў§њћњ§њ§ћјїѕјї§§ѓљћћњ§ћўў§ћљ§ўў§ыљћћљљћјњћћ§§љњљѕѕїїјћћѕљњ§њњ§љ§љљњњ№јњў§§ћўў§ћњћћ§њ§§ќљ§љ§§ћњ§§љњњђћљњљњјљњњїљћј§§ўњ§§ўћљљїћўў§ћћљљћћўљ§§§ћў§§ћєјљљћњњћћњ§§ћћєјњ§§јљљјћљљћћ§зљўўњ§ћјѕїјћћ§љћћњњљ§ћњјљїїјјњјњљјћћњїљћљњњўїјјїљѓїњјљћћјљљјљћљљѕњ§њљјјљ§§љћћ§ўљњњљјњїїјњјјэѕїјјљћљћћ§§ћљјњјјїњњљўњћћљќ§ўћ§§ў§ћщ§њўћўў§њўћ§љјјљљ§љјљњў§§єў§ћћњјїњјјљћћќљћљћћњч§ћњћћњ§њљњњјћ§њ§ћћњљћљјћ§ §љњћ§њ§њ§§ўњћћќљћћљљћўљћћљљ§§ћњїћћќљћљћћќњљљћћјјљ§§њњљ§§іњїњїїјјћћ§§љјљћљћњјј§ёљ§њ§§љњ§§ћћљ§ћљљћћњјњћ§§јћљћћљѕљњњ§њў§њ§њљљћјўћ§§ћћљјјљљќњћљ§§ўњњћ§ћњљљћ§јљћ§§ўњ§љљћњљћљљћ§§љњћїїњћ§§ћљјљјјћћљљѕћљћњ§ў§ћўў§§ѕљћљљ§§ћљ§§ўўэ§њјѕљјѕњјјљљјјћ§§њ§§ѕњћјњњћљћћњ§§ћљјћћ§§љњєўћў§њ§ўўњћћљљюћјљњ§ћљљјјђїјћћљљњњњљћљњ§ћћњњ§§ћљћћї§њ§љћњљћ§§ћ§ўљњњћјљњњћћѕєјјћѕјљјїїђјљљћјњїїћ§њ§љћћќљћљ§§ўѕћњћўћўњњ§§ўў§§ћљљі§ўћћ§§ћљљ§§љјћљћ§њљљћћїњїјљ§љјјњњїћљљћ§ћљ§ћўў§јћљљјјњњћћ§§ћјјњћѓљјјїњњїјјѕїїњњќћљ§ћћ§ћљјњ§§њ§ћћт§ћћљњњљљ§ћћљћ§њћњїљїћљћљћјїјљћћјўљћћћљћљљћћўљ§§ћњ§ћћўўј§ћљљњњћ§§њьјњћјјїїњјјїјњљјћјјљ§§ў§њ§ћћ§ў§ўћ§§іљјўћў§§ћљћћѓ§ўў§љљћћљњ§њўўјћњљїјјљћћ§њќ§њљњњ§љњ§љћњјїїљјњјјњћўўэ§њ§љћћљ§§њўў§њњћћ§ўўъ§љљјњњћћ§§ћѕјћ§§ў§ћў§ћћ§їљњљћљ§ћў§§ўјћћўљ§§іћљћњћјїњњћћјўћ§§ћјћјјћћњёљїјјњљћћљ§§љћљћћ§ќћљљћћ§§љћћїљћ§њњљњњ§§§њљњњэјћ§њћљљ§љјљљњњћћњњ§§ўњњљњјљћћћљ§њћ§§њјћћ§§љљьјћњ§§њњљљњјјћћ§љљћћ§§ёњљњ§њњ§љјїјћћѕ§§ђњ§§ўў§§ћљ§њўћўў§§ћњњћ§§ў§ћћљљћљїћћ§§њћыѕљћћњ§§ћјћ§§ћўўљљћ§§ўўу§ћћњ§§љљћјјљљћћјћљљћ§ћў§§ћљљ§§ћёњјћћљћљ§§њ§§љљ§§ўя§љћ§ћў§ћјњјјїјїјљљъјїћљљјњћљљћћљћћ§§њљћљћћ§њ§§ўћ§§эњљљ§ћјѕїњћњљћћљћ§њ§§єћўўњ§§њљ§§њ§§њњљ§њ§ћћљљћњљћћ§§њњћ§њ§њњўіћў§§љћ§љћјјћёљћјљ§њњўћўўћ§ў§§ћѓљњњўў§ћ§ћўњњ§§ўўњ§§ўћ§ў§ћћьљ§њњ§љљћњњєњњїўў§§ћљљ§њєљњњ§ћ§§њћў§ўўњ§ќљњњ§§тљњ§њ§њ§њљ§ўћў§ћљћћљњ§ћњљћћ§ўў§§ћћљћ§§љљћјљћњћћћљћљћ§§ѕњћїјјљљ§§ћ§§ўѓњјљћ§§њљјњњљћћ§ћў§§ћ§§ёњ§ўўњўў§§љјљљјїїнѓїѕїѕѕљјњљїњњїљјњљћћљњјјљћ§љјїјљўў§§ќћљњ§§ўѕњ§ћ§§њћљћћ§§іћљћљћњњљїњњєјњњћљ§§љћћљћћћљћјњ§§ўє§љљјљ§§њњљћјјћћљ§њњ§§њћшњїјњљћћљћњњћљїєљљћјњњћћњњћюњјњј§§љћ§ўў§§њљј§ћћ§љћјѕјћ§ўўћ§ћљћ§§єљћїјјѕјјћљљ§§ћљсћ§љјњјјћњњјћ§§ўў§§њњ§ўў§ћљјћ§љћћјњјљјћћ§ўўћ§љєљ§§љњ§§љћљћћњљњјћњ§§љћћјјњћћњ§њћћўћћїїјљљ§ћћљ§§ў§ўњ§§ў§љ§ёњ§§ћјњћјїѕї§њ§љљћ§љњ§§ўњњ§§пњ§§љћћљљ§§ћјјћћјћћјљћћњјњћћ§њ§љ§ћћљћњ§ћў§§ўњўў§ђњ§§ўў§§њ§§њњљћћњ№љћћљљјњјјњњљћћљћћ§ќњћћ§§ўћўў§њњљјљћ§§љ§ќњ§§ўўч§љљћїњљ§§љјїћ§њ§§ћљ§њњ§ў§§ѕњљћљњ§ўўћ§ўўњ§њ§§њ§§§њљћћчљћњ§њњћ§њ§§ћћ§§њ§§њ§§њ§§ўўј§ћњљњћћ§§§љћњњљјљ§њјљ§§јћљљјћћљћћќјћћљљ§ћљћћѕњћјљїїњљћљњњыјљљїјѕњћћїїљјћљњјїјћўўќњ§њ§§ўј§ћљ§ћјјљљњљћњћњјїљїќјњљ§§ћћљћљ§§єњ§§њћћ§ћўћ§њњёћљјћћљћ§§ћјњїјњњсјћћ§њ§ћ§§њ§љ§њ§њ§§њјњјјњљ§§њљљ§§ќњ§њћћќњјјћћўњ§§ћ§ќљїјњњэїњњћјњјћњћ§§њљћљљћљљ§ћюњїљћ§§њ§ўў§њ§ў§ћњјјљњћњ§§њћћњќїњњјјњїљњљј§§ў§ўћ§§эћљ§§њ§љ§§ћћљњњ§ћљћ§§ўњћћћљ§љћ§§ёћјјљћћјљљћћ§§њ§§№њ§§њњ§§њ§њ§ћћљљћћ§§њ§§ќњ§љ§§ўњ§§ћ§§њ§ћћі§њ§њ§ў§§ў§§эњўў§§љљћљљѕњ§ћїїјјћћќјћћљљћјљћ§ўўљ§њљљћћ§§ћўјћћјћћљјћ§§ьћјњћћїћљ§§њћљћљћћљјњњўјњњјіњћ§љ§љјњћ§§ћљ§љњ§§њђљјљљћѕјјљћљћћљљћј§њјњњјћўљћћњјњћћјћћќ§ћњ§§љљњћљћћјћћэљћљњ§§њњ§њћј§§ўўњњ§§ћўљћћ§шћўўњ§§љћљ§њњ§њњ§ћљћћљљћ§§ћўјћћќњ§њ§§ўњ§§ћчјљљњ§§љјћћљњ§§ћњњћ§љ§§ћћ§§ьњ§§ўў§ћћјњљїјѕїїљјљ§§јћњњ§њћћ§§ќљњњјјћђљјћљљћњїљњћћљ§§њ§ўљћћљѕјљћћў§ўў§ћўўя§ў§ў§ў§§ћў§§ћ§§ћљљ§ўћђњћ§ћћ§ћ§ћ§ћ§§ўў§ђњћњћњ§ћ§ў§ћ§§ўў§ўћ§§ќњ§ћ§§њћ§ўў§ўўќћ§ћ§§єњћў§§ћњ§ћ§ћўўћ§ўћћњњіћњћћ§ћ§ћ§ћћ§§њћ§§§ћ§ўўјћ§§ћћ§§ўў§ў§§ў§§іћ§ћ§ћ§ћ§ћњњыћњћ§ћ§§ћњћћ§ћ§ћ§ћ§ўњ§§§ћ§ўўљ§ћ§ћ§ћўўшћ§ћ§ћўћ§ћ§ћћ§§ћћњљњњљљњ§§рћ§ћћљњњћњћ§ћћ§§ў§ўћћљљћњњ§ћ§ћў§ўў§уњ§њћњњћ§ћ§ћћњ§ћ§ћњњћњ§ћ§ћ§ћўћћ§§ћ§§їў§њћћ§ћњћћ§§ћ§§ёў§ћ§ћ§ћ§§ћљљњљњњћћњћћўў§ћ§ћћў§ўўѓ§ћњћњ§ћ§ћћ§§ўўѕ§њњљћљњњ§ћўўў§ўў§юћ§ћ§њњћў§ўћ§ћћњћ§ўўє§ћњ§њћњћ§ћћњњћњљєњћљћљњњ§§ћћўўј§ў§ў§§ћ§§§ў§ўўјћ§ћўўћњљљњљћњњћњћњћћњћўњ§§ўќћ§§ўўѕ§ћњћћў§ў§§њњўљњњћёњћњњљњљћћ§ћ§њћњњљћј§ћ§ћњњћ§§љў§ў§ў§ўўьћ§ћ§ў§ћћњљљјљћњ§ћ§ћ§§јћњњ§ћ§ћ§§ћњћњњљљњќћњњћћ§ћћњ§§ў§§ўћћ§ћ§ћ§§јћ§§ўћ§ћўўђ§ў§ўћ§ћ§њњћћњћћљњћњћњ§ћћў§ћћ§њљњњї§њў§ў§ў§ўўћћ§ћ§ћћ§њѕ§њ§ћ§ћ§ћ§§ћћ§ћѓњ§ћўћ§ћћњњљњљљњњћћњњ§§йћ§ћћњћњћ§ўћ§њ§ћ§ћћњљљњљ§ћ§ћ§ћ§ћњњ§ћў§ўћћў§ўўњћ§ћњњћћїњљњњћ§ћљјјљњљћњћћ§ћ§§ћћ§ћћљљхњљўћ§ўў§§њљњћћ§ћ§ћ§ћ§ћ§ў§ћ§§ћљњхћ§ћљњјњљћћњ§§ћ§ћ§ћ§ћ§ћ§ћ§њћћњњўў§њћћоњћњћћ§ћ§ўўћ§ћ§ћ§њћњ§ћћњњљњњ§ћ§њћњ§§§ћ§ћћњћћ§ћ§ћўўљ§ћњњљљњњљ§ћћњљљћћ№љњјљљњњљњљћ§њћљћћљ§њћњњљјљїњћњћњћћњћћўў§§јћњњћ§ћћњњљћњћћ§ћљљћњљњћњњѓљњњћњўњћћ§њћњњ§љњљљћў§њњюћњћћ§ўћћ§ћ§ўў§§ћ§њњ§ў§ўЫ§ћњњћћ§ћ§ћ§ў§ћ§ћўћћњљњћљњњћњћњћњћњћњњ§§ћћљњњ§ћ§ћљљњњ§§ыњћљћњћћњћ§ћ§ћ§ћ§ћ§ћ§ћћё§ћ§ћ§ћ§§ћњћњћњћћњўћњњјўћ§њљњћњњїћњћњћњћљћћњњћњћћ§§ќћ§ћ§§щњљњћњ§њћћ§ћ§ћњћћљњњ§ћ§ћћѓ§ћ§ћ§ћ§њћћ§њћћюњћљњљћћ§ћ§њћњћћ§ў§§ѕћ§ћ§§ўћ§ћ§ћћњ§ћњћєљћћ§ћ§ћў§ў§ћћўљћћѓњћњ§ћћњ§ћў§§ћћшњћњћћњћ§ћ§§ћњћљћћ§ћћњњћњњћјњћњ§ћўћўўїћ§ћћњћћ§ћћі§ћў§ў§ўўћ§§іћњњљњ§ћћ§ћћ§јћ§§ћњљљћћљњ§ћ§ћћњњћў§ћћ§ў§ћў§ћњћћћњ§ў§ћћњіћњћњћћњљљћћі§ћњњћњћ§§ћћэњћћ§ћћњ§ћњћ§ћ§њћћ§ћћ§§ћљљњјў§§ћњ§ћњњ§§ћњљљчњћћњњљљњћћ§ћћњћњћњћћ§ћ§ћўўў§ўў§ќћў§ўў§ћњћћ§ўў§ћћѕ§ћ§ћћњћњ§§ћћњњћљљњћћњѕљњљљњћњћћўћћј§ўў§ўў§ћћњљњў§њњљјњћћњњљљњњљћѓ§њћњ§ћ§њћ§§ћ§§ђњћњ§њњћњљћћ§њћћљ§њњљјњћћћњљњћњњјћњ§ћћњћњњ§ћњћћёњћњћћ§ћ§ћћњў§ўћћљќњ§ћ§§љ§њљњњљњчљћњћњњћ§ћ§§ў§§њћњћћ§ћўў§ћћї§ћ§ћ§ћћњўўћћ§њћњњ§ўўћћ§њћ§§ўѓ§ћћњњћћњћћ§ћ§§ќћ§ћ§§ўћ§§ћћњљњљљ§њљњњўг§ўћ§ћћњћћ§ћ§§ўћ§§ћњ§§ў§§ћћњљљњњ§ћћ§§њ§ћў§ў§§њњрћњћњ§ћћљћњћћў§§ћ§§ћњњћ§ћ§њћњ§њњљљќћњћњњћњ§ћ§ћ§њњцћњћљљјљњ§§ўњћћ§ћћњћњћњћњ§ћћїњћњ§ўћњњћћ§їћљњћ§ћ§ћљљшњћћ§њћћ§ћ§ћћљљњћ§§ћ§ћ§ћўўщ§ћљњћћњћњћћ§њ§ћ§ћ§њћ§§ћћњ§§ћ§§ћяљњњћњ§ћћњћћ§ћ§§ћ§§ћыњљњћњ§ћ§ћ§ћ§ўўћ§њћ§§ўў§њљіњћћ§ћўћњњћћњќћ§ћ§§њљ§ћњњ§§ћћў§ўўћі§ўў§§њћ§§ћћњћњћюњ§ўўћћњћћ§ћ§њћљњњћћђ§ћ§ћћўўћ§ћў§§ћћѓў§§њњљњњћњћњћћњћќњљњћћѕњћњћћ§§ћњћњњљћњ§ћ§ћ§§ѓћўў§ћ§§ћћ§њњљљћћ§ўњћћћ§ћ§ћўў§єћ§ў§ћ§ћ§ћ§ћ§§№њћњњћњ§ћњћћ§ћ§њ§§ўј§ћћњ§ћћњњ§§њћћњњћћ§§ўўэ§ўћўћ§ћћњћ§§ўўћњћў§§№ћ§ћў§ў§ў§ћћ§§ў§ўўіћњњћњћњћћ§§ћњ§љћљљќў§§ћћћ§ћ§ћ§§ўћ§§јў§ћ§ўўћўў§њћ§ћ§ћ§§ћћ§ћў§§ћўћыњћ§§њ§ўћњ§ўўћ§ћ§ћ§њњћћў§ћћљ§ћћ§ћњћћ§љћ§ћћњњћћќ§њ§ћћэў§§њћњ§ћ§ћњљњћћњћћ§§јћўћ§ћ§ћ§§ў§ћюњјјњћљљњљњљњјјњљјљљёјњњћћњћљњњћњ§ћњњљћў§§ћ§ћћы§ћ§ћ§ћ§ћў§§ћњћ§§њћћњ§§їњћњћњљљјљљєњљњњћћ§ћћњўњњ§ћњ§§ћћ§§ўћћј§ћ§ћ§§ћњњћћњћћ§§ўћ§§њєљћ§§ћњњћњ§§ћћњњљљћњ§§њюљњљњ§ћћњ§ўўћ§§ћћ§њњёћ§§њњљњњ§ўў§ў§ћћ§§ћњњѕ§њћћ§ћ§њћњћћгњ§ћ§љњњћљљњћћ§§ўћћ§§ћўў§њћ§ћћўњћњљњћћњњ§§ўў§ћћј§ћ§ћ§ћ§ћћѓњћњћљњњ§ћ§ћ§ћћњёљћњћћ§ўў§ўўћњњћћљњћћ§ћ§ўў§њћ§ћ§ћўў§§ћ§ћћ§ћњќљњљ§§ћњњћ§ћ§ћ§§ўћ§§ћўњћћў§њњёћњ§њњћћњћљњљћњ§§§ў§њњћњљєњўћ§ћ§§ў§ўћ§§јћўў§ћ§ћ§§оўћњћњћљњљљћћњћћњљњњљљћњћћњњћћ§ћ§њћћ§§ћўўў§ћћј§ћ§ћњћ§ћћѓ§ћ§ћ§ћ§§ў§ў§ћћњјћ§ћћњћњ§§ћ§№ћў§§ћ§ћњћ§ћў§ўћўўќћ§ћ§§ћ§эћњћњћњ§ћ§§ўћ§ћ§њћћ§§ќћ§ћ§§ўћўўћ§њњјњњўћ§§ћюљњљњћћ§§ћ§ћ§њћћ§њћћ§њћњњ§ћњћћѕњћњћњћљњњјљљхћњћљњљњјјљїјњњћљљјњњћљњћњњўў§єћ§ўўћњћ§њ§њћћ§ћїњћљљњћњћљљњљјљэњљћћ§ћ§њћњћћ§ћ§ћ§ћ§§њћ§њћћўўўћ§§ўњћћљњћњ§ћћњњћљњљљњњ§ћњ§ћ§ћћћ§ћ§ћ§§ўљњњћћ§ћ§ћћі§ћ§ћ§њћњљњњёћњ§ћ§ћ§њћћ§ћћњљљ№ћњљњћ§ћћ§§ћњћћњћћё§ћћњљћћњ§ћ§ћўў§§§њљњњѕ§ћ§§ћњћњљљњњўљњњіљјљћ§§ћ§ћўўїћ§ћњћ§ћ§ћћѕ§ћ§ћўћ§њњћ§§єњћњ§ћ§ћ§њћњћћћњ§ћ§њњўћњњћњї§ћ§ћ§ћ§ћ§§ўћ§§ўњћћќњћњ§§ўћ§§ќў§ћ§§ѕћ§њћњ§ћ§ћћњњ§щћўћ§ћ§ћ§§ў§§ћўћњћћ§§ћћњњњћњ§њњћћўњћћўјћ§ўћњњћ§§њћ§њњћњњћљ§њ§ћ§ћњњћђњћ§ћ§њћњћњњћњљљўњљљњљљћћўћћњњё§ћ§ў§ў§ћ§ћ§§ћњћћј§њњћњћњћћњ§љ§љљњќћњћњњћћљњћ§њњђ§њ§ћ§ћ§ћћ§њћћњњљћњћ§§ћ§§№њ§§ћўў§§ћћ§њћњћњњѓ§ћў§ў§§ћћњћћ§§ћўњћћќ§ћћњњўћњњз§ћ§ћ§ћ§ћ§ћћњ§ћў§§ћћњћњћ§§ћњљљњ§ћ§ћћњ§ћ§ћ§§ќў§§њњёљјљїјљљјњћ§ћ§њ§§їћњ§ћ§ћљљњњћњћљўјњњіћ§ћћ§§ћ§ћњњєћњњ§§ў§ў§ў§ўўў§ўўі§ў§§ћў§ћ§ўў§ђћ§ћ§ћў§ў§ў§ў§ўў§јўћ§§ў§ў§§ўї§ў§ў§ў§ў§§ўў§§§ў§ўў№§ў§ў§§ћў§ўћ§§ў§ўўє§ўћўћўњ§ћ§ћўўќ§ў§ўўћ§ў§ў§§§ў§ўўњ§ў§ў§ўўў§ўўѕ§ў§ў§ў§ў§ў§§јћњ§§ў§ў§§ѕћ§§ў§ў§ў§ў§§ћў§ў§ўў§§ў§§ўќ§ў§ўўо§ў§ў§ў§ўћћњћћўћ§§ў§ў§ўћўћўћўћ§§ў§ўўћќ§ћў§§ў§єћ§ћ§§ў§ў§ўў§§ўў§§ћў§ў§ўўђ§ћў§ў§ў§ў§§ћў§§яћў§ў§ў§ў§ў§ў§ў§ўћћљў§§ћ§ћўўў§ўўў§ўўєћ§ћ§§ўћўћў§ўў§ўњћћ§ўћ§ў§ў§§ўњ§ўћ§§ўў§яћ§ћўћ§§ўћўњћћ§ћўћћћ§њ§§ў ўљ§ў§ў§§ўўў§ўўїћ§ћњњ§њўћћѓўћ§ћ§ћўћ§ћ§ћ§§іћў§ўћ§§ў§ўўў§ўўќ§ўћўў§ћўўћћјўћў§§њ§ћћђў§ў§§ћ§њћћ§њњ§§ѕў§ў§§ћћ§ў§ў ўъ§ў§ў§ў§ћћњњўћ§§ў§ў§ўў§§єў§ў§ў§§ћ§њ§њњ§§ћ§§јўћў§§ћў§§ўњ§ў§ў§ўўі§ў§ў§ў§ў§ўўў§ўў§§ў§§іћ§ћ§ћ§ћ§ћ§§їћў§ўћўћ§ћћќў§§ўўў§ўўї§ў§ўћў§ў§§ъў§ў§ў§§ћ§ћў§ў§ўћ§§ў§ў§§шћњћћўњ§ћ§ћ§§ў§ў§ў§ўћ§ћ§ўў§№ў§ўћћњ§ћ§§ў§ў§ў§§ўќћ§§ўў§чћўћ§§ў§§ћ§љћњњћ§ћ§ћ§§ў§ў§§ћљўћћўў§ўў§ѕћ§ћў§ў§ў§ў§§№ў§ў§ў§ў§ћћўњ§§ўћћњћ§пў§ў§ў§ў§ў§ў§§ћўћ§ўў§§ћ§ћ§ћ§§ў§ў§ўўј§ў§ў§§ћ§§ћћ§њћ§§ёў§§ћ§ћў§ў§§ћўћ§§їўћў§ў§ў§ўўњ§ћ§њў§§§ћ§ћћўўћћњі§њћћўћўћ§ћћє§ћ§ћћњћћўћ§њњў§ћћщ§ћў§§ћ§ћў§§ўў§ў§ўћ§§ўћ§§љћ§ћў§§ћћєўћћњўњћњ§ћћ§§§ћў§§љћњћћ§њћћ§єћ§ћ§§ўћў§ў§ўў§§ў§§ўў§ўў§ћћўћћ§§ћў§ў§ўўњћ§ћћњћћѕ§ћ§ћ§ћ§ћ§§ўўћ§Эў§§ћўћ§§ў§§ћћ§§ћў§ў§ў§ў§ў§ў§ў§ўћ§ћў§ў§ў§ў§ўћ§ћ§ћ§ћ§§љў§§ћўћ§§ўћ§§ёћ§ћћ§§ћ§ћў§ў§ў§§№ў§§ўўћўћўћ§ћў§ў§§ћіў§ў§ў§ў§ў§§ћў§§ћ§§љћ§ћ§ћўћћѓў§ў§§ћ§ћ§§ў§ўўю§ў§§ўў§ў§§ћ§ћ§§ћћ§§ёўћ§ћћ§ў§ўћ§§ў§ўў§ћўћћ§ћћ§§ў§§ў§яћ§ћ§ћ§ћў§ў§ў§ўћўћћэў§ўћ§ћ§ћў§§ћ§ћ§ћ§§ўўє§ўћ§§ў§ўћ§§ўўщћ§ћћњћћ§ћ§ћўћў§ў§ў§ўћўћћы§ћ§§ў§ўћћ§§ўў§ўћ§§ў§ўўќ§ў§ўўѓћ§ћ§§ўћ§§ўћ§ћћўўћћз§ћ§њћћ§ћ§§ў§ўћ§ћў§ўћўћ§ћў§ў§§ў§§ў§ў§§ћў§ўў§ћ§зў§ўћ§§ўћћњ§ћ§ћ§њ§ћ§ћ§њћњўћў§ўћ§ћ§ћ§ћў§ў§ўўќ§ў§ўў§ќћ§§ўўх§ўћ§ћў§ў§§ћ§ћ§§ўћ§ћ§ћўњћћўћћђњўњўћўћ§ўўћ§§ўўі§ўћ§§ћћўћ§§ћўўћћё§ћ§ћћњўњўћћњ§њћћ§№ћ§§ў§§ћ§§ў§ў§§ћ§§ќњћћ§§љћ§ћў§§њњіўћ§ћ§ћўњў§§ћ§ќћ§ћ§§јћ§ћ§ћў§ўў§ћ§ўў§ћ§ћћ§ћў§ў§ћћњ§њћњњћћћўњћ§ћћћў§ў§ўў§њћ§ћў§ўўѓ§ўћў§ў§ў§ў§ћўў§ўћ§§ўјћ§ћ§§ў§ўў§ёњћћ§ћўћў§ў§ў§ў§§њў§ў§ў§§ћі§њ§ћўћћњ§ўўі§ўћ§ћ§§ў§ўўњ§ўћ§§ўў§ћ§ќўћў§§ўќ§ўў§§єћ§ћ§§ўћўћ§§ўўњ§ў§§ћ§§ћў§§ћ§§њћќ§ћ§ћћнў§ў§ў§§њўћ§ћўћ§њўћў§§ћ§§ўћ§ћ§ћ§ћ§§ўўўћ§§њћ§§ўћ§§ѓћў§ўћћњў§ў§§ћћўў§§ћї§ћў§ў§ў§ўўь§ћњ§ћ§ћ§§ўў§§ў§ў§§ћ§§їћ§ћ§§ў§ў§§ћ§цћў§ў§ў§ў§ў§ўћћњўћ§§ў§ў§ў§ўў§ќћ§§ўў§јњћћ§ћў§ўў§ѓћ§ћўћ§§ў§ў§ў§§ўў§§їў§ўћўћў§ўўћ§ћў§ўў§љћў§ўћ§ћћ§ћћ§ћ§§ўў§ыў§§ћўћўћ§ћ§§ў§ўў§§ў§ўў§ўћўў§§ћўћћэўћћ§§ћ§ћўћ§§ўћ§ћ§ћ§§њћў§ўћ§§іћ§§ў§ў§ў§ўўћ§ў§ў§§№ћ§њћћў§§ћ§ћў§ў§ўўў§ўўљ§ў§ў§ў§§№ў§§ћ§§ў§ў§§ћў§ў§§§ў§ўўќ§ўћ§§їћўћў§§ћ§ћћ§ў§ўўј§ўћ§ћў§ўўў§ўўњ§ў§ў§ўўў§ўў§їћ§ћ§ћў§ў§§§ўњћћљњўў§ўћ§§ёў§ў§ў§ў§ў§ў§ў§ўў§§ў§§ћў§ў§ўўј§ў§ў§ў§ўўљћ§ћ§ћў§§ћўћ§§ўўћ§ў§ў§§ќўћў§§ыћўћ§ћ§ћ§ћ§§ў§ћћўћ§ћў§§ў§§ў§§ёў§§ћћњ§ћ§ћў§ў§ўўј§ў§ў§ў§ўўѓ§ў§ўњ§ћћњ§њ§њњ№ћњћћ§љћћњњћњ§ћ§ћћўў§§ьћўњ§ўў§ў§ўћ§§ў§ў§ў§ўўі§ў§ў§ў§§ћ§§љћ§ћћњ§ћћјњ§ћў§§ћ§§ўў§§ћў§ў§ўў§ьў§ўћ§ћўћўћ§ћў§ў§ў§ў§§§ћњ§§щћ§§ўћ§ћў§§ћўћўћ§§ў§ў§§ћћњ§ўћ§§ўўћ§ў§ў§§ўћ§§њћ§ћ§§ўўћ§ћ§ћўў§љўћўњўћ§§љў§§ћ§ћ§§ћћўћў§ўўў§ўў§љћў§§ћ§ћћўў§§ў§ућ§§ў§ў§ў§§ћ§ћ§ћў§ћћ§§ў§ў§ў§§ћћћ§ћў§ўўђћўњ§ћўћў§ў§ў§ўў§ћў§ў§ўўћ§ў§ў§§№ў§ў§ўћўњ§ћ§њ§§ў§§хў§ў§ў§ў§ў§ў§ў§ўћ§ћ§§ў§§ћўћ§§ќў§§ћћјўћ§§ў§ў§§їўћ§ћ§њўћўўќ§ў§ўўќ§ў§ўўў§ўўў§ўўяћ§ћ§ћћњћћ§ћ§§ўћўћћ§§ћ§§јћў§ў§§ћўўў§ўўў§ўў§ѕў§ў§ўћ§§ў§ўўў§ўўф§ћ§ћўњ§§ўћўћў§ў§ўћў§ў§ўў§§ў§§ўњ§ў§ў§ўўњ§ў§§ћ§§§ў§ўў№§ў§§ћў§ў§ў§ў§ў§ўў§љњ§њ§§ў§§ћљњћњ§ўў§§ћў§§ћ§§ђћ§ћ§ћ§§ћћ§§ўћ§§яћ§ћћ§ўњ§њћћ§ћћњћњњєљћњ§ћ§њ§ћ§§ћћў§ўўњ§ў§ў§ўў§њў§§ћў§§љћўћ§ћ§ћћўњћћљњ§њ§њ§ћћќў§ў§§№ћў§ў§ў§ў§ў§ў§ўћўў§§ў§§ёўћ§ћ§§ўћўњўњћњћћ§ўў§§ьў§ў§ў§ў§ў§ў§ўћћњ§§ў§§цў§ў§ў§§ћ§ћўњ§ћ§§ў§ў§§ћў§§ћћў§ћћіўћў§ў§ўћў§§їћў§ўћ§ћћ§§§ў§ўўљ§ў§ў§§ћћфњ§§ў§ўћ§ћ§ћўњўњўњћћ§њўћ§§ў§ўўђ§ў§ў§ў§ўћ§§ў§ўў§ўў§§щў§ўў§ћ§ћўћ§§ў§§ћўћ§§ћћ§§ћў§ў§ўўи§ў§ў§ў§ў§§ћ§ћ§ћ§§ў§ў§ў§ў§ў§ў§ў§§ћ§§ў§ўћ§§ћў§ў§ўўњ§ў§ў§ўўј§ўў§§ў§ўўўћўўќњ§ћ§§њћ§ћ§ћўўљ§ўћ§§ў§§њћўћўћ§§іў§ў§ўњ§ћћ§§ўў§§ўћ§§љњћћўћўћћмњћћў§ўћћњ§§ў§ў§ў§ў§ў§ў§ћ§§ћўћў§§ћ§ћ§§јћ§§ўћћ§ћћћ§ћ§ћ§§њћўћ§ћ§§ќў§ў§§љў§ўћ§ћ§§ѕћ§ћў§ў§ў§ў§§ўў§ўў§ќћ§ћ§§ў§§ў§§щў§ў§ў§ўћ§ћ§ћ§ћў§ўћ§ћ§ћ§§ўј§ў§ў§ўћ§§ўђ§ў§ўћ§ћў§ў§ћћ§§ђўћ§§ў§ў§ў§§ўў§§ђўћњњћљ§њ§ћ§§ў§§№ў§ўћ§§ў§ўћћњўћћ§§єћ§њ§§ўћћњ§њ§§ў§§ў§§ўљ§њ§§њ§њњў§єљјљћ§љћћљљњ§§§ћљћћ§љћ§§ћ№љѕћљћјњћ§§ўў§љњ§§ќљ§њўўј§ћљљ§ћљћћ№§ў§њ§љј§љ§§љљћћјјћфљјјљћїјњјњћљљњњјјњћўћўћћ§§њ§§іј§§ћ§ћљ§њ§§ћўћўў§§ћіњјјљљћ§§њ§§љћљјљјћ§§їў§§ћћњћ§ўў§јљњ§§љјљ§§ќњ§њ§§іљїњљћљјјњћћіљћљћљ§ћљћ§§ќњ§ў§§ќў§њћћѕ§ћљљћћљљћјїїђєїїјњњјњљ§њ§§ћћѓ§ў§§јљћљћћљћјјћ§ўћ§§іћјїњј§§ћљћћљјћњјњњјњћћ§јњјјљњјјћ§§ћћёљћ§§ћћљћљ§њў§§љљћјієњћљћљ§§ўњњћ§њ§јљљўњћћ№јљћљљћћљњњјјњјћ§§ћћљћ§§ўўў§љљћў§ўў§љ§ћњћћ§ўў§§§ўћ§§ђљ§ћў§љљњљћћљњ§§љћљјјљћ§§яћљ§ћњћў§ў§њўў§§њўў§ћкњїїјїјљњ§њў§љћљћљћљјїјћ§ўў§љћћљћћ§§њ§љљћњ§ћљћћќљ§ї§§њщ§ў§ћјљљћ§§њ§њћљћћњ§ћћљ§§ыўћ§§ћњјљљ§љћњјјљћћљјїїљљјљ§ћћ§§њњћїљњ§§ў§ќћљћњњћ§љњ§љљѕљ§§љћјўћ§§ћљўјљљ№ћљљћћјїїјјљћ§§ћљљіћњјњњјљћћ§§єў§ћјїјїјњјћ§§ћъїјјљљћћјїїњњћћљћњњїљљјјѕњјјїѓљљїїјћћћјћљњћћњњљњљљ§§рћљњ§љјљћљјјњњјїјћњјћ§ћљ§ћњњћћ§§ћћ§љјћћ§ёњљњњ§њ§њљћћљљћ§§ќњ§§ћћљўњ§§ў§§њ§§ќћњћ§§іљћљљїјњїј§§ўўљ§§цў§ћћљљћљћљћ§§њљїћњљљ§§ў§њљљњћ§яњ§§ћјїѕ§ћњ§§љћњњјјћљћ§њўўє§љљњјїїѕѕљњћћ§ћјљњ§§ћ§љћћ§ўљ§љјїњћ§§ќћ§њ§§ћћњјїјјћљћљњїїюљїњїњљјјљћћ§§ћћљћ§§њ§јјњћћљњјњўўљ§њњўў§љљљћ§§љјјїїќєїњћћњљћћљњїїђљњјњїїѕљљњјљћљљфћљћћ§§љљјљћњїјњљњ§ћћљљїјћћљћћўљ§§јћљњњ§§љћћ№њћћљјїљњјѕјњљ§§ћћё§ћћљљћљњњ§ћјњњћћљћјљљћљљћћјјњљљћўњ§§їћјњјјїѕѕњњјћњјїњјјќћљњћћњћћ§њљћћїјіїјћљњјјћћ§§љіћљћљњњјњњћћ§іћїњњљїљљњ§§ћчњјњјћ§ћљћљїњћ§ћћљћћњѕїјјћћѓјяѕїњјјњћљљћјјї№њјљћљљјјћћљјљѕљ§§іњћћњјљї§њћћ§њћљљћњћћ§§ћњјјљ§љєћљњћјњљњћ§ћјјћљћјїјњћћњљћјјљ§§љјћљћљњјњћћљљћљћ§њ§§іњљљћљљњљљћћљјћўљ§§ўћљљј§ћљ§§ћњћћћљћјњјјќљћћјјўћ§§њўћњ§§ўў§§љјјіљћљљњ§ў§њљљ§њљ§јњ§§љћјљіћљљњјїјњїјјђїњљјћїїљ§љјјљ§§љћўј§§њ§љњ§љ§љљћћјўљјјћѕјљљ§љћљћћњћћ§ћћљјїјјљїљјљ§§ўўї§ћћњјљћћ§§њћ§љљ§њњ§ўћјјоњћћњњљ§§њ§§ўњ§њљљјѕїїјјљјљјћћљљ§§ћћјћљћљљћћ§ћіљјѕљїјћћљ§§њ§ћѕљћљљћљћњљљ§§њћ§ћшјњјїљљјїѕѕєєѕѕјљјјњћљљћ§§їљћ§§њњ§§њњ§ўњ§§љтњјћљљјљјљјїѕљњћљћћњјњјјњњљњњїјјьћљјћљћљњ§ћњћћљљ§љљњћћљћќњѕјїїюљїњћљїњїїјјњїљљјѕјјќњћћљљјћљћ§§њњљљьћњјћљљћ§ўњ§ћјљѕљћ§§ћћћњ§љћњњућљјњѕћјћљљњљљћћљљ§§љ§ћј§§ћўћўў§ў§ўћ§§њьљћњњљљћљјїјљѕѕјћћ§јљљљћљћљљ§ћћљ§ћ§ћћ§ћћљћћјїїљљћњ§њљјјљњјћјљјљћњљљћљћїљћ§§њњ§ў§§іјњ§њ§њ§ћћ§§тњљћћљјњјїјјћ§јћћљ§ћњ§њўћўў§ћљ§§њљњ§њ§њњељ§§њћ§њљћњ§њ§ћљў§ћњњјјљјњљїїјјњљћљћњјјњћћљјјўљ§§њ§§љћ§§љљїјљћњ§§ћћњћћ§§ћћљљ§љљњєјњїїјјњљ§ўў§§ћћљњјњњіјћћљњјјњћљљѕјћјњњљљњћћ§§єћњ§§њћљљњљљ§§ћФљ§§ћњјњ§њ§љјјћ§њј§љљњњїњћљљћљћћјћ§њ§њ§§њ§§њњљћћ§§ћљјњњљћљ§њ§§ў§§ћљљњќ§њ§ћћјћїѕјћ§§ќћљћ§§§ћњ§§ў§њ§ђљћ§њ§їјћњћљћћљљјћљњљљћћіљћћљћјїѕѕїїўјћћљћ§љјљљўћљљљњ§ўў§ў§§ўщћјњљ§§њњљљћћ§јћњњўћўўљ§§іћљљћљјјњћљљћњљћ§§њ§§ѕћјјћљћљ§њњ§§ћ§ћў§§ћљљјіљћћ§њјћљљ§§ўњ§§ђљњ§јћјјћљћљћњћћљіћљњ§§њњ§њљљќ§ћј§§чњћљљњўўњ§§њљњјјїїњјћћљћљњњ§ћјјћћ§ћћњљљђћљљ§§ћјљјјљћњјјћї§њ§ўўјњ§ћ§§ћћ§§њљћњ§ўћўўњњћ§ћљјљљїњћљљјљњњљљњљ§љњљћ§љљћћђ§њљјїїјњњ§§њ§љљћєњ§љјјљ§ћљљ§њњ§љјљўјљљћњ§ўћўўћћўњ§ћћјўћјј§іњљћљїјјњљћћъљћћњљ§§њћћљћњ§§њ§§ћљљћћѕјїјњљ§ў§њ§љљ§ћ§њјїїјјљћћљћ§љљ§яљћћ§њћљљћћјїјћљћјјљ§њњ§§љњ§§ћ§ъљѕѕљљїњњћћњњјјћњўў§њїјјљєјњјїјњћљ§њ§ћћњњјћњњўў§ћљћ§њћћќ§ўў§§ћ§ќњ§§ћћїњ§§јїєїљњњўјїїћјњњћ§§јњѕћњјљљ§§ўў§§ћ§ћљќ§њњўў§ђњљљћњўў§їїњћћљљ№ћ§§ћћјљњ§ћљњњљљјјљсћљ§њћјљњ§њ§§њ§љљћћљћ§§њ§§ћљјїљ§§чњ§ћћњјњћљћ§§ў§њ§њ§ўњћљћћљљоњћљјћћ§ўћ§њ§њљљћљћћљћћљћћјјњљњїјњљљћљљјћћљћ§§њ§јљјњјјљљ§§ўњ§§юћљћљјљњљљ§њњљћћјїјјѕљћјљњ§ћљћљћћћ§ћљћ§§ўї§ћћњљў§љћћќ§њњ§§њёћљљћћ§§њў§њ§љњ§§њі§њ§ўў§љњљ§§тў§њњћўў§§ћ§њ§ў§њљњњљ§њ§§ў§љњњ§§ъћњ§љћ§§ћљјјљћћ§ћњѕїјј§§ќљ§ўњњіљћћљјїјљћјјїїјїћћњњ§љљї§њ§§њљјѕїїўј§§њњ§ћћњ§ўўћњћљљўўѕћўў§ћћљјњњјјѕњјљљћљљјњњјјљћљњњљљћћљ§њћјїјћћ§љњ§§ѕјљ§њњљњїєїјјљћ§њ§љћіњ§њ§§љћљљ§§ъўњљћљ§§ћћњїјњњ§љјљ§љћљљєћљњњћњљѕѕјћ§§њњјјљљ§§ьњ§§љћљћ§§њ§њ§§њљћћљ§§юњ§њ§њћљњ§§љњњљ§љљњњї§њљїїћњїѓјћћљќ§ўў§§ћљјљћ§§њћћ§лњ§ўћ§љћўў§њњ§ћјњњћњѕѕїљћћ§ћљљћњљљћљћ§§ў§ќў§њ§§ўў§§ѕћљјјњљћљ§§ўўђњ§ўў§јјїїњљ§љјјћѕј§њњ§ўў§њљћћјљъћњњљњњ§ћљјљћљ§§њ§§ўўћўўўљўўёћљ§ўўњљљњњћљћ§њњР§њњћљјјљљћјћљјњљљћ§ћћјљњ§§њ§њљўўљ§њ§јљ§њњљћ§њњ§§ћљ§§њћљјћљћњ§§њўўћћ§ћљ§§ўњ§§ѓњљћ§§њљњњ§§њўўіњћљљњўўњјљљѕћјњћљ§§њ§њўўђњ§§њњћўћўњљљ§ўўњћ§§њњўўўњљљќ§њњљљѕћјјїјљ§§њјћљў§ўћ§ћ§§ўћћ§ћ§ћћњћ§њћ§ћњћњњ§ћњћћў§њњфћњћ§ћћњњљњ§ћў§ћў§ћ§ћўћ§§ў§ўћћњћќўћ§ћћњћњяћњћњљњљњћћњљњњљњўўўћ§§§ћ§ћћћўћњћ§§ћ§јў§ўћ§ћћњњќљњњћћ§њћ§њћ§ћћ§§ћ§§ёћњњљњ§§ў§§ћћ§§ћћ§§ћ§§ѓћ§ћћљћњћћњљћњњћђњћњћ§њћњћћ§ћћ§§ћ§њћњћњљѕјљћњљљњљћћ§§№њћњћћў§§ћћњћњћћњњћј§ћ§њ§ћ§њњїљњ§ћњћћњћћєњљњљљњљњћњћњњўљњњўљњњ§§ћњњёћњћћњњћњћ§§ўћ§ћћњіћљњћњћ§ћў§§ўћ§§ћцљњћњ§ћњћћњћћљљњњљњћћ§ћ§њњћћ§§ў§ћћљњ§§ў§§ћћюў§ћњћњћ§ўћ§ћўў§ћ§ћћсў§§ћћљћњњћ§ћ§ћњћњњћњ§ћ§њћ§ў§ўў§§№ў§§ћ§§ўў§ћ§њћљћњњѕћ§ћ§ў§ћњћњћћюњљњњ§ўўћћњњћњњ§ћ§ћћњљ§њћњњћўўћћ§гў§њ§ћћњ§ћ§ћ§њћњњ§§њњћ§ћ§ўўћћњљњћћ§ћњљ§ћћњњћњљљшјњћћњњ§ћ§ћ§њљјљћ§ћ§§ўў§ћћўњљљњќ§ћ§ћћќ§ћ§ћћњўћњњі§ћ§ћћњћћ§ћћђњћћњћњљљњњћњ§ћћђњљњљљ§ћњњ§ћ§ћ§§њљљњњ§ћ§њњћњљњћўњљљјњэљњњљњјјљљњњћњњћњћљњњ§љћўћ§ћ§ћћы§ћћњћњћњњљљњћњњљњњ§њћћљћњћћ§њњыћњћњћњњћ§§ў§§ћ§ћ§ћњњћћј§ћ§ћ§ћ§њњћў§ћћ§юў§ўћ§ћ§ћ§њљњ§ћ§ћњћћяњљћ§§ћ§ћ§§ўў§ћ§ћ§§њћѓњћњћњ§ћ§ћћњљћћћ§ў§§ћћ§њўћ§§ћѓ§љљ§њ§ћ§ћњљљњњћћњ§§ўўѕ§ў§§ћћљњљљјјэљњћњњћ§ћ§њњћ§ћ§њћћњњьћ§§ўў§ћњљљњ§ћ§ћ§ћћњ§§ћћ§ћћљњњћљ№јљљњљјњњћњњћ§њњћћ§§ћ§§єћ§ћњљњњћљњљўўњћ§§ў§ћћљњћ§ћњњљљќћњљњњћћњћћљљќјљњљљјћљњћњћћњњћћњ§ћћ№њћњљљњљћ§ћњњћћљњњўћњњцћњћћ§ћ§њћ§§ћ§ћњњћ§њњћњљјљњњљљћ§ћћњћћњњћћњћ§§њљњћћњћћњћћњўљћћњ№§ћ§ћ§ћ§њњљњњљљњљљњћљњљљњњ§ћ§њњљњњћ§ћћњњўљњњ§ћљњњх§ћ§ћћњћњћљљњњљњњћњ§ћ§њћљљјћћ§ћњ№љњљ§њ§њћњћњљњ§њћћћњљјљњњєјљљњњљњћћњ§њњљљњћњћћ§њњюћњћ§ћћ§ћ§њњљњћўћ§њњћ№§ћ§њћћњљћњњћ§њљњњћ§ћїљњњљјљћћњњћћњћћњњљљњњћњћњњћў§ћћпњћњћљњљњћњћњћњ§§ћћ§§ћћњћћ§ћћњњћњћћњћўњћћј§њћћ§њљњњћћњњљњњўћњњѕ§ћ§ћ§ўў§§ћўўћњіћњћћ§ћўћ§ћћщ§ћ§ћ§§ћћњљ§ћ§ћ§ћћњћњ§њћћљљњљњљћњњђћљћ§њњћћ§ћњћўћћї§ћћњњћ§ћ§§ћћ§ћўћћњўћњњќћњ§ћћяњћњњљњњћњ§ћ§њћњћњњљљјњћ§ћўўћёњљњћњњћ§ћњћў§ћ§§љћ§ћ§ћ§њњјљћњ§§ўћ§§§ћў§§ћўњљљњђћњјњћњћћ§ћњњћњњшћњћћњњћћ§ћ§ћ§ћ§ћћњћњњјљњњћ§§ћ§§ћњїћњћћњћњљћћ§§ћ§§њќ§ћћњњјљњљјјњљјјјљњћњњљњћћљ§ћ§ћњћ§§ўћ§§ўћ§§јћ§ўћћљњћћюњљјјљћћњњљњљњњљљћљљњћњіћњћ§§њ§њњћћћ§њћњћћљњћњљљњљљљјљљњћњљљњўљћћњ§љњћћюњћњ§ћ§§ўћћњљњњћћњ§§ѕћњњјљћњ§ћћњњ§§ћњљљњњћњљ§њњћћ§ћћњћћњњ§ћ§њўўў§ўў§ўў§ўўї§ў§ў§ў§§ћћѓ§ћ§§ћњљљћћњћњњјњћў§ћћљњћњћћ§њњћ§ў§њћћњћћњћњњћћ§ћћ§њњћћљўњћћ§њ§ћћњћњќћњћ§§њћўћ§ћ§§ќњћћ§§љћњћћњљњњћѕ§њњћ§њ§ћ§§ўўєћњћ§ћ§ў§ћ§ћ§§ћи§њ§§ћњ§ћ§ћњћўћћљљњњјњљјљљњњљћњћњљњњљњњћњњћ§§ћ§§чћ§ћњћ§ћћњњћњ§§ћ§њљњћћ§ћњћћљўњљљњёљћћў§§ћ§ћ§њћљњљљњљћљњњљњћћш§њњљљћћ§њњћћ§ћњ§§ћ§њћћ§ћћќ§ћ§њњћіњљњ§ћ§§ћњћћ§ћљѕњћћњћњњ§њћ§§ќћ§ћ§§ћўњњ§ћћљњљ§ћњћ§§љћ§ўў§ўћћ§§њћњњьљњњћћ§ћњћњћ§ћњ§ћћ§ћўў§ўћ§§№ћ§ћњћ§ћљњћљњћћњћћњћќ§ћћњњљћњњћњњљљњќћњњћћњ§ћњћћўњћћ§ќўћўћћюў§ћњљћ§ћ§§ћћњњ§§њ§§ѕў§ўў§ћ§ћћњћћњ§љњћћњяћњ§ћ§ћ§ћњ§§њћњћћ§§њћ§ћ§њћћ§§ћњћћњјћњњћ§ћњћћ§§ћ§§љћ§ў§ћ§њњћћњћњ§њњћњњћ§§ћ§§ћыњ§ћ§ћ§њћћ§§ў§§ћ§ћљњњљљњћ§ћњћ§њњљћћђњћћ§ћћ§ћћ§ћћљњњќћњљ§§яў§ў§ўў§ћњћ§њћћ§ћ§§ћњўћўў§ћћњћ§ћћї§њћћ§ў§§ћћ§ћ§њћњ§ћћњњ§їћњљљњљ§ћ§§ћњў§ћћљ§ћћњћћ§§ћњћўњћћ§§ћўўј§ћћњћњ§њњтћ§ћ§ћњћћњњљћњћњћњћ§ўћ§§ћњћњ§ћ§§љћњћћњћњњљљћћўћ§ћћњ§њћљњљљјћњћњњћњћћѓўћ§ћћњњћ§њћћњњћљњњћњњћє§ћ§ћ§ћ§ћ§ћћњњ§§ћјјљњљњіћ§ўў§љћњњћћєњљњљњљћћ§§ћњњќљњњ§§ў§ћ§ћћёњћ§њћњ§§ўћ§ћћњ§§ўћњњї§ћ§њљјљјљљўњљљњѓљњћ§ћ§ћ§§ћљњћћќ§ћўћћњћњћ§ъў§ўћ§ћ§ћ§ћћњ§ўўћћљљњњћћ№њћ§њћ§ћ§§њћ§§ћћњњћјњћћ§њћћ§§§ћ§ћћфњћњ§ћ§ћ§њћњћћ§ћ§§ћњћљњљњћњћ§§ћњћњњћћќљњћњњф§ўўћ§ћ§ћћњћњћћњњћњћњњљћљљњљћћњўћњњљћњћћ§ћ§§ьћ§ћњљњњћћ§ћћ§§ћ§њћњћћўљћћ§ўћњњўљњњњћњ§ћ§ћћчњћћњћћњћњћ§ћ§§ўўћњњ§ў§§ћњњљћ§§ћ§ћ§§ўњћћќњ§ћ§§іћ§ћ§§ћћ§ћ§§юћ§ћўў§ћљћ§ћ§ћўћ§§ўўќћ§њ§§ўћ§§ѓћўћў§§ћ§ћћ§§ћћѕ§њћњњћћњ§њљљћњ§ћ§ћћќўћў§§їћњћћњљњћњњ§ћј§ћ§§ћњњљљћћ§ћ§ћ§§ћќњ§ћў ўј§њњћњљљњњѕљњћћњћћњљљњњњћ§§ћћњњћќ§њ§њњѕћњћћ§ћ§ћ§ћ§§њћљљјљњњћњќћ§ћ§§ѕћ§ћћњћњ§ћ§ћћўњћћш§ћў§ћњћћ§њћљљњљљ§ћ§ў§ћњћћљ§ћљјјњўћ§§ћћ§ћњћћћ§ћ§§ћћхњћњ§ћ§ћ§ћ§§ћњњћ§ћ§ћ§ћ§ћ§њў§§јћљљћ§ћћљљўјљљњћ§њўћ§ћ§њњњћњћћ§њњј§ћ§ћўў§ўўўћ§§њљьњљљјљјњћћњћћњ§ћћњћњ§§ђўћ§ћўћ§ћ§ћћ§§ћћјњћњњљћњћћўќ§ћў§§ўњљљћњ§§ћ§§іўћ§ћњњћњ§ћћћњ§§ў§§ўњћћќњћћ§§њћў§ў§ўўю§ў§ћћ§§ў§ћћ§§ћћњћ§§љћ§§њћ§ћћѓњљћћњћћњ§ћ§ћ§§љў§ў§ћ§ћћ§§ћњ§§аћ§њўћ§§њћ§њћњ§ћ§§ў§ўў§њћћ§ћ§ћ§ћ§ћ§ћ§ћњћ§§ў§§ћ§§ўўѓ§ўў§њћћ§ўў§њћћќњљњћћ§іў§ў§§ћћ§§ўўў§ћћі§ў§ўў§ћ§§ўўў§ћћ§ћњћљњћћ§§њўј§ў§ў§ў§ўўљ§ў§ўћў§§њў§ў§ў§§ўў§§ў§єћ§§ўћў§ўћ§§ўўњ§ў§ў§ўўіћ§§ўћў§§ћўўі§ў§ўў§ўўћ§§№ћўћўћ§ћў§§ћўћўћ§§њњћћўћўўњ§ў§ў§ўў§§ў§ўўў§ўўќ§ўў§§єўћў§§ћў§ў§ў§§№ћўћў§ў§ў§ў§§ћ§§ўўт§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўњћ§ў§ўћўћ§§ћћ§§ў§§љў§§ўў§ўўў§ўўѕ§ў§ў§ўћўћў§§іў§ўћ§њ§ћ§ћћњўћў§ў§§їћ§ћўў§§ў§§№ўћ§§ўћўћ§§ўћў§ў§§ёў§§ћўћћ§ў§§ћ§ћ§§ћђўћўћ§ћ§§ўћўћўћћ§ќў§ў§§ў§ћў§ў§ўў§ўў§§ѕўћўћћ§ў§ў§ўўў§ўў§јўћ§ћ§ћў§§јў§§ћ§ћўћћњўћў§ў§§ћўћў§ўўњ§ўћ§§ўўў§ўўў§ўўіћ§ћ§ў§ўў§ўўњ§ў§ў§ўў§ўў§§№ў§ў§§ћў§ў§ў§ўћ§ўўќ§ў§ўўќ§ў§ўўє§ў§§ћћњўћўћўўћ§ў§ў§§їўћ§ћ§ћ§§ўўћћў§ў§§эў§ў§ў§ў§ўћћ§ў§ў§ў§ўўў§ўў§§ў§§ќў§ў§§ўў§§ћў§ў§ўў§ћў§§юў§ћ§ўћ§§ўћ§њ§њўћў§§ѓў§ў§§њ§ћў§ў§ўўя§ўћ§§ўћў§ў§ў§ў§ў§§ў§ўў§§іћўћ§§ў§ўћ§§ўћ§§ћћњ§ћћ§§ћўћ§ћ§§ћ§юў§ў§ў§§ћўћўћўћ§§ў§§ќўћћ§§ёћ§њћњўћў§ўћ§њ§ћћшўћўњ§њ§њ§ћ§ћ§§ў§§ћў§ў§§ўўђ§ўў§ў§ўћў§ў§ћ§§ћїўћўћћ§ўћ§§ўўћћќ§ћў§§ћљ§ћ§§ў§ўўў§ўў§ўћўўќ§ў§ўў§ќћ§§ўўў§ўўѕ§ў§ў§ўћў§ў§§ћїўћ§§ў§ў§ўўљ§ў§ў§ў§§ўў§§сў§§ћ§ћ§§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўћ§њ§§ўў§§ћќўћў§§ў§№ўћ§њћљ§ћ§ћ§§ў§ў§§ѕў§§ў§§ў§ў§ўўю§ўћ§ћў§ў§ў§ўў§§ў§ўўч§ўћўћўћўћўћ§ћ§њ§њњћўћ§ћў§§ўў§§ѓћў§ў§ў§ў§ўћў§§§ўћўўў§ўў§цў§§ћўњ§њ§ћўћ§§ўћ§ћ§ћ§њ§њњћћј§њћњњћћ§§цћ§§ў§ўћ§§ўњћћ§§ў§§ћў§ў§§ћ§§љћў§ў§ў§§ў§щћў§ў§ўњњћўњўћў§ўћўћўћў§§њў§ў§§ћћ§ћћўћў§§їћ§ћўћў§ў§§јў§ў§ў§ўћћњўњ§њўћћ№ўћўњћћўћўћўћў§ў§§щњћћў§ўў§ћ§§ў§ўћўћ§§ўћў§§ўў§§яћ§§ўћћњћ§§ћ§§ў§§ћћљ§ћ§§ў§ўў§ћ§эў§§ћўћў§§ћ§ћ§ћћњўћ§§ѕћўћ§ћўћћ§ў§§іўћўњ§ћў§ў§§єў§ў§ў§ў§ў§ў§§ќўћ§ўў§ўэ§ў§ў§ў§ўћ§§ў§§ћўћў§§йћ§ћ§ћўњўћў§ўћўћ§ћ§ћ§њўћћ§§ћ§ћ§ћў§ў§ўћў§§їћўћ§ћ§§ў§§ўћ§ў§ў§§яў§ў§ўћ§ћ§§ћћўћ§§ўў§ўћ§§њћў§§ћ§§§ћўћћњўћ§§ўћћ§ћў§ў§ўўў§ўўі§ўћћ§§ћў§ўў§§ў§§рў§ў§ў§ўћў§ў§ў§§ћўћў§ў§§ћ§§ћћ§ћўћћќўћў§§їўћў§§ћў§ўў§§ў§§їў§ў§ў§ў§ўў№§ў§ўћ§§ўћў§ўћўћ§§ђў§§ћ§§ћ§§ћ§§ў§§ѕўћўћћњ§ћ§§ўўђћ§ћў§ў§ў§ў§ў§ўў№§ў§ў§ў§§ћўћўћ§§ўўќ§ў§ўў№§ўћўћ§њ§ћў§ўњўћ§§јў§ўћ§ћў§§ъў§ўћў§ў§ў§ў§ўћ§ћћњ§њў§§љў§ў§ў§ўў§ўў§§іћ§§ўў§ў§ў§§ђўћў§ўћўћ§њ§ћ§ћћњўљ§ћўћћј§ћ§ћў§ў§§§ў§ўўт§ў§ў§ў§ў§ў§ўћўћўћ§§ў§ў§ћњћњћћ§§щћўћўћўћ§ћўњўћўћ§ћ§ћ§§ў§§вў§ў§ўў§ћ§§ўћ§ћўћ§ћ§њ§њ§ћ§ћўћ§њўћўћ§§ўњўћўћ§ћў§§јћў§ў§ўў§§ћћў§ў§§ўќ§ўњ§§§ўћ§§ўў§§тўћў§ўћў§§њ§ћ§§ў§§ћў§ўў§ўў§ў§§ўў§ўс§ўћў§ў§ў§ўћў§ў§ўћўћ§љћћўћў§§ћў§§§ћў§§јў§§ћўћў§§§ў§ўўт§ў§ў§ў§§ћў§ў§ўћў§ў§ў§§ў§§ў§§ћ§§ћў§ў§ўўѓ§ў§ў§ў§ў§§ћў§§њў§§ћ§ћћјўћўћў§ў§§ўў§ўўњ§ў§ў§ўўї§ў§ў§§ўў§§їўћ§ўў§ў§ўўћѕ§ћўњ§њћћўћ§§ћћўћћ§§єўћў§ў§ў§ў§ў§§шў§ў§ўњў§ў§ў§ўћ§ћў§ў§ў§ў§§ћїўћ§њћћў§ўўћ§ў§ў§§ўўћћіўћ§§ўћўћў§§ьў§§ћўћ§§ў§§ўў§ў§ў§ў§§љў§ћў§ў§§ўќ§ўћўўљ§ўћўћў§§љћўћ§ћў§§ћў§ўћўўэ§ў§ў§ў§ў§ў§ў§ўћ§ћў§§§ў§ўўўћ§§чў§ў§§ћ§ћўћ§њўћў§ў§ў§ў§ў§ўўў§ўўљ§ў§ў§ў§§ћў§ўњћћ§§ћў§§јўћў§ў§ў§§ўў§§ўћ§§јњ§њ§ћўћ§§ўў§§ћў§ў§ўўћ§ќў§ў§§§ў§ўўњ§ў§ўў§§њћ§ћўћ§§њў§ў§ў§§ќћўћўўј§ў§ў§§ћўў§§ў§§ќўћў§§ёў§ў§§ћў§ў§ў§ў§ўў§ќћўћ§§ўў§§ьћў§ў§ў§ў§ў§ўћў§ў§ўў§§ў№§ў§ўћўћ§њўњ§ћ§ћўўљ§ўў§§ў§§ўў§§јўћ§§ўћ§ћћїўћўћ§§ў§ўўѓ§ў§ў§§ћў§ў§ў§§ўў§ўў§§ў§§ъћ§§ў§ў§ў§ўў§ћў§ў§ў§§ћ§§єў§ў§§ћћўў§ў§§ёў§ў§§ўў§ў§ў§ў§ўў§љўћў§ўћ§§ўр§ўћ§ћў§ўћ§ћўћў§ўў§§ўћўћў§§ћ§ћўћўўш§ўћў§§ўў§ў§ў§ў§§ћ§ћўћўћўў§§ў§§њў§§ћћњњќ§ћў§§іў§ў§ў§ў§ў§§ѕў§ў§ў§§ћ§ћ§§ќћўћ§§ћў§ў§ўўј§ў§ў§ўћ§§яўњћљ§њњћћ§§ћћњўћўўї§ўћўћў§§ћћў§ћћ§ў§њћў§ў§ўўє§ўў§§ў§§ћ§§ўўќ§ўћ§§ќў§ў§§іў§ў§ћњћњ§ћћ№ўњ§њћњў§ў§ў§ў§§ћћ§§ў§ўўў§ўўќ§ў§ўўћ§ў§ў§§ўќћ§ћ§§іў§ў§§ћ§§ў§§ў§ћўў§§ўы§ў§ў§ў§ў§ў§§ћ§§ў§ў§ў§§ђўћў§ў§ўў§ћўћў§§іў§ў§ў§ў§ў§§њўћ§§ў§§ўќ§ўў§§ўћ§§ћѓ§ћ§ўћў§ў§§ћў§§ўў§ўў§ћћўћћ§§ў§§ў§§ўўћћў§јўћ§ћўћћ§§ћў§ўћ§§єћ§ћў§ў§ў§ў§ўўў§ўў§їў§§ўў§ў§ўў§шћ§§ў§ў§ў§§ўў§§ўў§ў§ў§ў§ўўј§ўћў§ў§ўў§ѓў§ў§ў§ў§ў§ў§ўўѕ§ў§ўћў§ўћў§§ёўћўћў§§ћ§њў§ў§ўўя§ўћ§ћ§ћў§ўћўћўћў§§ўў§§эў§ў§ў§ўњ§њ§ћў§ў§ў§ўўќћ§§ў ў§іўћўћўћўћў§§кў§ћћўћўћўћўћў§ў§ў§ў§§ћўў§§ўћ§ћ§ћ§§ў§ў§§эў§§ћ§ћ§ћўћ§§ў§ў§ў§ўўі§ў§§ћ§§ў§ўў§§ў§ўўѓћўћў§§ћћњўћў§§ўў§§њў§ўћўћћљњћљћ§ў§§ѕў§ўћ§§ў§ў§ўў§іў§ў§ў§ў§ў§§ђў§ў§ў§ў§ўў§§ў§§ћ§ћыўњ§ћ§њ§њ§њўњўћў§ў§ў§ўў§§ў§§њў§§ўў§§§ў§ўўў§ўўэ§ў§§ћўћ§ћ§ћ§њ§ћў§ў§§§ўћ§§ўў§ўўќ§ў§ўўў§ўўњ§ўћўћ§§ ў§ѓћњњў§ўћўћўћў§§ћў§ў§ўў§ћћ§§ў§§ў§§ў§§їў§§ћў§ў§ў ўќћ§§ўўўћўўѕћў§ў§ў§ў§ў§§№ў§§ћўћ§ћў§ў§ўћў§§ћў§ў§ўўў§ўўќћ§§ўў§ў§§ў§§љў§§ўў§ўўё§ў§ў§ў§ў§ў§ў§ў§§§ў§ўўќ§ў§ў ў§§ћ§ўўћћ§§ўћћ§§ћўўў§ўўў§ўўў§ўў§ўў§ўўэ§ў§ў§ў§ў§§ћўњўћў§ў§§§ћќ§ўћўўі§њљљћј§ўў§§ђљ§њљјјњљљ§љњњљљыћјјћњ§§ћјјїљїїљљћљ§ћјј§њљ§§ўњ§§ёљћљњљћћљњїѕњ§ћўўл§љћњўў§њљљ§њљћјљњјѕљїјјєњћћјљћњљљ§ћњ§§ўї§њљ§љћљљ§§љёћљ§њњ§љћњјѕћљљ§§јћљїїњљњљљќјњњ§§љћўљ§§нў§§љњјј§§ћљ§ћљљћљљј§§њјјћљјїѕїїњљћїїјўњљљћјљћћњїњњћћэјљјљћљјјљљћљћћљљњњ§§хљћјїєїњћљїїјњљћљћјјњјћ§ћљћ§§ѓњљћњњћљ§ћћјјћћ§ўь§ћљ§ўў§§љјјљљјїѕљјљїїѕјњљљћљљјїњјјўљїїѓјњјїјјљћљїњћ§§њ§§ў§§ўѕћњў§ћљ§§љљ§§њћіјњјјљћћјњћћщњјјћјїњњљћљњјјљљ§њћћ§§љљћ§ўљ§§њў§њ§ћћљћ§єњ§ћћјјњїѕїїјјіћљћ§њљ§љћњњјьњљљњјјїћљћјњњћ§§љњћўўёћў§љјћљћњѕѕїїћ§§јљјњїљћјљљэћјњїїђњ§њљљћњјјњјїњњќїљњјјўњћћьјњљјјњљ§љјјћ§ћљјњљњјјўћњњљњпљјјћћ§њ§§љјјњїїѕѕїњїјљљћњїљљїѕїљїїюљњ§њ§љљјњ§љјћјјњњћћљ§њћїїјљїјњњјњјјћћљјїћћђјњїѕљњљјњњјћљћћљђћљћљљјјїљ§ћћљјјпљїњћњљћљїѕїѕїљјљ§ћјњћљњ§§њ§§ћњјњїїјјњњљїѕїћћјўљ§§ўљјјљљњ§§њ§љљіјњљћћљњњљ§§іљћ§ћјјљћљјјћыјћјњљћњ§ћў§њћћјљћћљћ§§ўћљљљ§њњ§њ§љљѓјїїњјћјљћјћћњњј§љљјњљћ§§ѕћљћ§§њњћћјѕѕљќѕњњљљїћ§љњ§§љћјјљјљћњјјњљјј§љћљљёјїљїњљћњњјњѕљјїїѕјїјјїљјњћћљљћјћљљћћљљ§§њљћљљћћјљїјјќљћјѕѕљїћљћљњјјўїјјќїјњјјфїњїјљјњјјњљјњїњјњљ§љјњјѕљћљћћяњ§ћљљћјњњјћћљћњјљљћ§њњўў§ћјјыљћљљ§њ§§љїєћјњљљ§§љћљљ§єљ§§њњ§ћј§§љњњіћњњ§§њ§љјїїіѕјћћљљћњјљљю§њўў§§љњ§љћјљљћћїјјєїјїћљј§§њ§њћћѓљјћћљњўћ§§ћїјјьљћљљћћљљћљљћљћјљљ§ћјјѓїјњћћљћћљљїњ§§ќў§њ§§ўњљљіњљ§§љљњњљ§§јњ§њ§љћ§љљцњјњїїјњїјљћљћ§ўћўў§њ§љљј§љљњў§ўўїњўўњ§њњ§ўўѕњљњјѓјјљћљ§§єћљљћјјњљћљљњњќўњљ§§рћњћћјјњњљ§ћєњјјњјћљћјїњјњњљљњњїјјёњћљљјљјїѕєїј§ѕћћћљћјїјјућљљћљљ§њ§ћ§§љћћљћњїїјјљћљћјјїїљќњљћљљћчљћњљљјјїїњњїїѕїѕѕїјјњљњ§њњёћљјњћћ§љљћљћљљ§§єў§§њ§љњ§§њ§љљћјљћ§њњћўїјјљ§јїјјёїјјћљјњјћљљћњјљљќјћљјјљњ§јњ§ў§њћљјјљћзљћћљљћљ§њ§љїјћћљћљїїј§љћ§њћћјјљїљњћљљћ§љ§§іњјњјїљљњњљљђћњїјћљїјњћ§§ћњњјјљјљљѕїјїїхљјїљљћљћјњљљћ§њ§ћћїјљљјћ§њ§§ђћ§§ћљїјїњјћњћљљ№§ўўњ§њ§ћљћћјљјјћћћљјјћљљћ§њ§§ћљљљњ§§ћўў§§њњћљљ§њљљјўїљљю§ћљљћљљјјљјљћјјћјћћѕљћћљћљћњњћњњ№ћљћјјљ§§љљїїљњ§ўўхњљ§њў§љїѕїјњљћљљћљјљ§§љїљјљљјњ§њ§§њ§љљўћјјњњљћљћ§§њэљ§ўў§їљљћјїїјћћ§ћћљљђјћјћљјљљјћ§њ§ћћљфћјњјћћ§њњ§јљљћљїјћљјљїјѕїјљјјњјїљјѕјїјјљљѓњјїѕљјћљљћјњјјўѕљљќћљ§ўў§њ§њњ§ўњљљћ§љћ§§їњїјљјњєњјјэїњјјљљњї§њњћњњјљљѕљљ§ћ§ўўќћњћљљ§ѕј§§ъњћ§ї§§ћљј§§љјњўўњћњ§њљљћ§њ§§љљфћљјљљњћњљ§њћљћљњћћўћћў§љѕїњјјўћ§§ќњ§њ§§нїјњњ§ўўњ§ї§§њљ§§љ§њљѕљљјћјјћњљћ§љљћћљњ§§њ§ћљљћљћљ§љњјїјљљїїјяњћљєѕѕјћћјїїјјћњјјљјћ§§њљњїѕѕјаљ§§ў§њњ§њ§§њљ§љћћљѕћћјѕїїјћћљњњјјћћјњљ§§љљјїѕћћ§§мћјїјћљљћћ§§љјљ§§љ§љњ§ћљњњљљјїїњјљњ§љљцјїјћ§ћїїљњјїїјљћћѕ§љјћ§њњјјѕљћћњ§љ§љјљ§§ўњ§§іњ§њ§њ§§љљ§§юљћ§§њћћїјљљћљћјњјїїљјїњ§ўўњњёћ§§ўў§љљћћ§њњјљљўћ§§ћјћљјљљўњљљ§їјљљїђњјћљћљјїѕїїјљјјў№§љћјљћњјљћ§ўў§§љљъ§љњ§љ§ѕљ§љњўў§§љјњљљјћћўљћћќњјњјјїќјїљїїјњјћ§ўњ§§њ§§њ§ўћ§њјћ§§њхћ§њўњњ§§љљњ§§њњ§њћ§њ§њљљїњјјіѓїїјћљ§њљњњу§љјѕѕєѕњўў§њљјљљњљћљћ§§ўў§§ў§§њћћўўћўў§њњ§љјјїїєљћ§ћљћњњ§§ў§§њўљњњуў§њњ§§љњўњњ§§љ§§њњ§§љјј§§њ§ћњњњћљјјљїїјїўѕ§§ўћ§њљћњњўњѕ§ћћјјљ§њ§љўўѓ§љљћљљ§ћў§ўњ§§юљјљјљ§њљљћ§њљјљљј§§ў§ћў§§єљћљћљњљїѕјљўў§љђћљћљ§§њњўњўњўњњ§ћіљ§§њњљћљїјј§ћў§§ћўўј§њњ§ћўў§§яўњњћћљљїћћљљћјћ§њњљі§њўў§§ћјљ§§яњ§њљ§љ§§љљњ§љ§§њћћў§њњіўћћ§§љјїїјјўљ§§їјљћљїѕљѕїїюѕњїѕѕѓїїљћњјјћљљћљљќњјњўўћљћ§№ўћћў§§ўў§§љјљљ§ўўѕ§њњљћћјјљљјјіњћљјљјљљѕїїўјљљ§їњўўђћ§љљћњ§ўњ§љћњ§§ўћўўўї§§ў§ћ§ўўќ§њ§ўўѓњљљћјјѓјљњјњјјюљјјїјјћїѕњћћјѕљјјљљўјїїёѕїљјћћњњўўњљљћљљўћњњўѓњўў§§њѓїїјњњјј§Юњљњљљњјљїїјјїїјљћ§§њљљ§§ћњњјјљ§њњ§§љњ§§њљљћ§ћїјљњ§§їјњљњљљћїјї§љљ№њ§§њ§§њњ§ћў§§љљ§§ћњ§§њ§§§њћљљќ§љјїїєѕјљјњјјљљћјњњљ§їјїїЭ§љїѕїјјњљљћљјљћљћљ§љљўњњљњњљњўћћўњїљњљњ§§ў§§ћїїјѕїјјў§њњі§љћљљўћћњјј§њјћћњ§њћќ§њљ§§ўю§ћљњњ§њћўўњјјњњ§њљљіћљ§јєѕїїѕјјїѓћэћ§§њ§њњўћўўњћљ§§љјјњїљѓјњїїфљјјїљњњљјћњ§љ§љљјљћљћ§њўћўњ§§љпћљљј§њњў§ўў§эњ§§њћјћњ§њљћљљ§ўў§ћћјљљ§љљјћ§љљјњєјћ§ўњњјћ§§Щ§љћ§§єњ§§њњљћљљњњўўѕћў§њ§њ§њўўњњјљѕћљљ§љјј§єїјјїѓѕјјњњ§љО§њ§ћљљћіљћћњњћўћў§§јёљћљњўћћњћ§ўўњ§љљы§њ§њњўўњјїјїѕєњєЏЌўў§§њ§њ§Эњўћўћў§§љљћћ§њљњ§§њ§§њњљљњ§§њљ§§њ§њ§ўћ§њћљљћ§љћЩЧћўўјћўљћ§ћћўўњњ§њљ§ћўўшњўћњњљљњ§ћњљљћњўўњњ§љјњ§§ќњўћњњјћ§М„Šљ§ўўц§љљћљљћњњ§њњљљ§§љ§њњљћњ§§љљњњ§њћћўўќћњјљљёњ§њњїљћ§ћЦpe§љ§§њ§єћ§§ўњњ§њљјћљљљћ§љ§§ўњњљѕњўњљјїјћњњ§§љюјљњ§њњћ§Лma§§њљљ§ўў§ќњљ§ўўљ§њ§њ§§њњўњ§љњ§§ќћљљјјєћљљєѕѕїћљ™hWљ§ћ§њњћўўъ§ўћ§ћћњ§ћў§§ћ§ћ§§ћ§њљћћ§ћњѕ§ћ§њ§њљјљњћћў§њњ§іўћ§ћ§ћ§ћ§ћћє§ћ§ўњћљћћњћљљѓћў§ў§ўў§ћћ§ў§§ћ§мћњњћ§§њјљњњћљњњћћњ§ћўћў§§ћ§§ўћ§ћ§ћњћћї§ћ§ћћњўћ§§ћћљњ§њћћў§ћћљ§ћ§ћћњњљњћ§ћћњћє§ћ§ў§ћћљњњ§ћћэ§њћћњћћ§§ћ§ћ§њћњљјљљїћњњљљњњљћћѕњћћњњљљњљћњњ§ћњћћіњћњњћћњћњћћ§ћю§ћњњљјљљћћљљњљћњћњњ§љњћћёњћ§ћ§ћ§ўћљљњћћњњф§ћ§ћ§ћў§ћњўћўў§ћћњњћћњљјјњјљљѕњљћћњћћњљљњњћљљњљњћњњћћњљњћ§ћ§§§ћўћћфў§ў§ўћњћ§ћћў§ћ§ћ§ћ§§ћњњљњњћњњњљњћњљњњљђћњћљњњћћ§§ћњ§ћћїњћњћњ§ћ§ћћњ§ћ§ћ§ўўђ§ўўћњћњњћћњћћ§§ћњћћњљљњ§ћњћћњ§ћ§ћћљљњэљћћљњњћњћћњљљћћ§ў§ўўћыњћћњљњјљњњћ§ћћњљњћњ§ћћњяљњљљ§ћ§ћћњљњњљњњљљћњћ§§њњѕљњћњњљћњњљћћњє§њћњљћљњњћћ§§ћ§њћњњћњ§§ћњљјљђћњћћњљљјјљњљјљљўћ§§ћќ§ћћњњљ§њћњњјћўў§ћњћљљјјљњљљњљњњўћњњљјєљћњљљњњћњћњћћќњћћњњћ§њћњњњјљљњ§ћћљєјњћ§њњљњћ§ћ§§ћћњљњљљћњљљјљљњћћ§ћ§ћћљ§ћ§ћњћ§§ћъњљћњћћљљћћ§ћћњ§њ§ћћњћњњўћњњч§њњљћњ§ћўў§§ћњ§ћњњћњ§ћ§њћћ§ћј§њћљњњ§ћћњ§ѕћўћњљћњ§ћ§ћћ§њћ§§єњћњњјњјјљњљћћўњ§§ќћ§ћњњћњљћљњњљјњњќћњўћћёњљјљљћњљљњљ§ћњљљњљљјњљћњћћњћіњћњћћ§§ћњћћњ§јљњњћѕњљјјљњћњћљњњўћњњћљњљ§њњяљњ§ћњљњњљћњљћљњљћћѓљњ§ћњћћњњ§§њћћѕњљљњњћћњљњћћїњ§ћ§§ўў§њњ§ћњћћќ§ћ§ћћњўљћ ћљ§ћ§ў§ћ§§њњ§ћ§ћљљўњ§§љћ§ћћњћљљїњјњћћњљњћћђ§ўўћ§ћ§ћћњ§ћћњњњљћћ§ћ§§њѓћ§њћћ§§ўћћњћњњэћњћћњњћћњћћњћћ§ћћ§њњыљњњћњћћјљљћ§ћўћ§ћ§ћ§ћћї§ўћ§ћў§§ћћ§ћўљњњњћњљњњћћў§ћ§њ§ћћ§ќћў§ўўњ§ў§§ћ§§љў§ў§ћљњњњћњћћ§ћћњњљћњћћ§§љў§ў§ћ§њњљыћ§њћљњњљњњћњњћљњљљћћљљњєљњћћњћњљјїљ§§їћњћњћњњљњњћќњћћ§§їњ§ћћњњћћљљњќћњћњњљћќ§ўњћћѕњћњћњљјјњњљљўњљљјфљњњљћ§ћљљњљћћњљњњћўћњћњћћ§ћ§§їћ§ћћ§§ћ§ћћў§ћћ§§њћњњћ§њљњњћіњљњњћћњљњћћѓ§њћћњњћћў§§ћ§§њў§§ћћњњћњњћћњњћћ§ћѕњћњћњћњћњ§ћћў§њњїјљјљњћћњћћљ§ћљњљњћћ§ћќљћ§ћћљњљњ§ћў§§њћў§њњ§ћњћћьњћњњљћћњћ§ћњњћњћћњњ§§ћћ§њ§ћћјњћљњњ§њћћќ§ўў§§ќњћњћћіњ§њћњћњњћњњћњњ§ћ§ћ§§ћї§ћ§ўў§§ћ§§њњћћ§§ћћњћїњўћ§њћњћњњё§ћњњћњњћњћњ§§њљљ§њћњњћћ§ћўћћ§ўј§ћ§§ў§ћњњђљћњћћњћ§ћ§ћћљћћ§§ћ§ћћњуљћњћњћ§ћ§§ўћў§§ўћћњњљљњњћћњњћћё§ћћњћ§ћћ§ћћ§ћћњњњћўњњљњњўћ§§ћњђћ§ћћњњљњћ§њњљњњљљњ§§ћњњћћѓљњљљћћњћћњњљњњў§ћћћњћћ§ўў§ћњёћњћ§ћ§§ћњћњљћљњњїћљњњћћњљ§§јњљљњћћ§ћћќњ§§ўў§§њћћф§ћ§ћ§ћ§њћў§ћњћ§ћ§ћ§§ў§§њ§ћ§ћћќ§ћ§ћћяњћ§ћћ§ћљћћ§њћњћ§ўў§ћћњљљњњќ§ћ§ћћ§ѓћ§њњљ§§ўў§ћў§§ћї§ћ§§ћ§ћћњњєљћњ§ћћњћњ§ћ§§ўњћћњћњћї§ћ§њљњћћљљњяљњћћљљњњћњљљњ§ћљњњћјњ§ћ§ћњљјјјњ§ћ§ћўћ§§ћє§ћ§ўњњћ§ћњњљљњтћњљњњћњњљћћ§ћћњљјћњ§ћ§ћ§њњљњњћћњњ§ћћњћћќ§ў§ћћ§ћўњљљќњћ§ћћў§њњэ§њћњћљњњћњћњћљ§ћћњ§§ўћњњђћњњ§ћў§ћ§ћћ§ћ§§ўћ§§ќћ§§ћћў§ћћїњћ§§ћњћњћћќњљњљљњћ§ћўў§§єњ§ћўў§ћћњћћ§§ћўњћћњ§ћњћ§ћћў§ћћњћёњљњћћњћњљјљљњћњњў№§ћњ§ћњљњћњ§§ўћ§ћћш§ћўћ§ћ§ўў§ўћ§ћ§§ћћ§њћњћњњћћљњљњњљњўјљљњљѕњћў§§ћ§ћ§ћ§§ќћ§§ўўђћ§§ћћ§ћ§ћ§§ўћ§§ћќ§ћћ§§ўњ§§ћўљњњљњћ§ћњ§љћ§§щўћ§ћ§ћћ§ћњћњ§ћў§ћћўћ§ћ§§ўїћ§ћ§ћћњњљљљћњ§њћњ§§їћўћ§ћ§§ў§§§ўћ§§ћі§ў§§ћ§ў§ћ§§ћќњ§ћ§§ўњљљѕњћћњјљњћњњљљі§ћ§§ўћ§ћњ§§ў§њўћ§§ћў§ў§ћћьњћў§ўўћў§§ћ§ћњјњћ§§ћћє§ћњћћњћћ§ћ§ўўћяњћњћ§ћљљњћ§ўў§ћ§ћћїњћњћ§ћ§§ўў§§ў§§ћўњћћ§ћњї§ћўћ§ўў§ўў§јћў§ўћ§ћ§§§ћњћћўњћћќњ§њ§§ў§ўї§ћњњћћ§ћ§§ђў§ў§ћў§§ћўћ§§ўўўћ§§ўњ§ћћњћњњѓћ§ћ§§ћњћњњјњљљіњљћљњњљњћњњњ§њћћњћћќљњ§ўўњќћ§§ўўћљ§ўћ§ћ§ћћўѓ§ўћ§§ћњћњ§ћћњњѕљњћњћњјјњњљљўњћћњ§ўў§ўћћўњ§§ћњњ§ћ§ћўў§§ўћћўјћў§ўћ§ћўўњ§ћћњћњњћћњњљњњўћњњќљњљњњјњћќњљћљљѓјњћњ§§ўў§ћћњћћўњ§§ўіћ§љњљћњњљњњоћ§§ў§ћћљњјљљњњљљњћњ§ћ§ћў§§њљљњњћћ§§ћ§ъћ§ћћњ§њћњћ§§ћ§њћњњљњљћћ§ћњ§љ§ћћ§ўћ§§ў§ћ§ћћ§§ћ§§ћў§ћћћўћћњљљѕјїјњљњњћћњ§§ћўњљљьўћљјљњњљћћњћњћњћњћћўў§њў§§ў§ўўы§ўў§ћ§§ћўћ§њћњњљћњњћ§§ћјњћћўўћљњњўљњњ§ўєћ§ћ§ћ§§ўћњћ§§ў§њћ§§ћ§ћћњњћћ§ћљљњћўєњћ§§ўї§ў§§ў§ћћњњъљјњњљњћњћћњњћ§§ћ§њ§ћўћћќ§ћњћћў§ўўљћ§ўўцњћћ§ўћўўі§ћ§ћ§§њћњ§§їћњћћ§§ўћњњћњўћ§њ§ћћј§њћњћћў§§јћўўг§ћњћћ§іћ§§ўњћћ§§ўў§ў§ќћ§њћћњћњёћљњ§§љ§ў§Фћ§§њћћњњћњњ§§ўўћї§ћњњћњћ§ўўљ§ћћўў§ћћ§ќў§§њњєј§ѕЛЕў§§ћ§ћ§§ўћ§§ћў§ўўєћ§ўћњњћ§ћ§ћ§§ёћ§§ћћ§ћћ§ћћ§§ћ§§јўћ§њћћњўў§Юдўўћў§ћћ§ў§ўў§ћі§ћў§ћћњ§ў§§ўћ§§њћ§§ўў§§ўчЧ…ћћў§ўў§ћћњћћњ§§ћ§§ћћ§ћћ§ќћњ§ћћї§ћ§ўў§ў§ўўў§ћћћ§ћ§§ўўјЫxm§ћ§ћ§§ћѓ§њ§ћў§§ћ§ћњњћћљњ§§ћћў§§ћ§ўћњњ§ћў§ћћ§њћ§§ўіУtdћћ§ћўћўў§њћ§§ўћўўњћ§ћ§ћ§§§ў§ўў§ѕў§§ћ§ћ§њћћњњћјњљћўў›k]§§ў§§ў§ў§§ў§§јўћ§њў§§ўў§§ў§§њўћ§§ў§§щўњ§њў§§ћ§§ўћўћў§ў§ў§ў§ўўў§ўў№§ў§ў§ўћўћ§ћћ§§ћўў§ўћўў§§ў§§ыў§§ћў§§њ§њћњўћў§ў§ў§ўўќ§ў§ўў§љћў§ў§ў§§њў§ў§§ћћѓў§ў§ў§ўћўћ§ћ§§ућ§ћўњў§ў§ў§§ћў§ў§ў§ў§ћћў§ўћў§§ќў§ў§§хў§ў§ўћўњћњ§ћў§ўњ§ћўћў§§ћўћ§§њћ§њћћ§§єћў§ў§§ћўћўћ§§њћў§ў§ўў§єў§ћњћћўњ§ћў§§фўћўћўћўћў§ў§ў§ў§ўћўћ§ћў§§ћў§§ћў§ў§ўўў§ўўЪ§ў§ўћ§ћўњћњўњ§њ§њўћўћ§ћўћ§ћўћўћўћ§њћћўћўћ§ћўћў§ў§ў§ў§ў ўя§ў§ў§ў§ў§ў§ў§ўћўћћўў§§ђўћ§ћўћўћ§ћ§ћћ§§ћўў§§љўћ§§ўћ§§№ћ§ћ§ћ§§ў§ў§ў§ў§ўў§§ћ§§чћ§ћў§ў§§ћўћўњ§њ§ћўћў§§ћў§§ќўћўћћђўћћ§§ћўћћ§§ћўћћћў§ў§ўўщ§ћћў§ћњћњў§ў§ў§ўћўћў§ў§§њўћўњћўўќ§ћ§ћћќўћўћћ№ўћў§ўћўћ§ћўћў§ўћћћўћўћ§§ћєўћўћўћў§ў§ў§§Щў§ўћўћ§§ў§ў§ўћўњ§љћњћћў§ў§ўњ§њ§њ§њ§њ§њ§њ§§ў§ўў§§ў§ўћў§ћћ§§ћ§§ўћўўѕћўћ§њ§њ§њўћћїўћўћўћўў§§№ћўњћњћ§ўћўћ§ћ§ћ§§ўћ§§ёўћў§ўћ§§ўћўњ§ћ§§ќћўћ§§њљћ§§ўћў§§љў§ў§ў§ћћјњ§њўћћњ§§љўћ§§ў§ўўњ§ў§ўћ§§ўў§§ђўћў§ўћ§ћў§ў§ў§§њў§ў§ўћћ§јў§ў§§ћћ§§ўќ§ўћ§§№ў§ўћ§§ўћў§ў§ў§ў§§іўћўћў§ўћў§§јў§ў§ўћў§§ъў§ўћ§§ў§ў§§ћўњћњ§њ§њћ§§ў§њўћўћў§§њўњўћўћћк§ћўћўћў§§ўў§§ћ§њ§ћ§§ћћўћў§ўњ§њ§ћўћўњ§ћћ§ўў§§їћ§ћў§ў§ў§§ђћ§њўћўћ§ћў§ћћ§§љћўћўћўћћк§ћћ§ўћўћў§§ћўћўћ§ћўћўћў§ў§ўћў§ў§§ћ§§ў§§§ћўћћё§ћ§§ўћў§ўћ§§ў§ўў§§ўћћшў§ў§ў§ў§§ћў§ћћў§ўў§ћў§ў§§оў§ў§ў§ў§ў§ў§ўћўћ§§ў§ў§ўћўћ§њ§њ§ћў§§ѕўћў§ў§ў§ў§ўў§§ўћ§§юўћўћўћўћ§ћ§§ў§ў§ў§§ўћўўїћўњўћўћў§§шў§ў§ў§ўћ§§ў§ўћўћўћўћўћў§§јћ§њ§ћў§ўўќ§ў§ўўќ§ў§ўўў§ўўь§ўў§ў§ў§ўћўћў§§ћўњўћћљўћ§ћўћўўљ§ў§ў§ћ§§§ў§ўўў§ўўў§ўўь§ћћ§ћў§ў§ў§ўћў§§ћўћ§§§ў§ўўю§ў§ў§ў§§њў§ўћўћ§§ўўћўў§§жўћўћўћ§§ўћ§ћўћўћў§§ћўћ§ћњњ§§ўћ§ћ§ћ§ћ§ћўћћ§§ўў§§ўў§§ћћњ§ћў§§єћўњ§ћ§§ўў§ћ§§ўћ§§яћ§њўћ§њћњ§њ§њћљ§ћћ§ѕўћћњћћ§ћў§ўў§аў§ў§ў§ў§ў§ў§ў§ў§§ћ§ћў§ў§ўў§ћўњўћ§§ўћћњўћћњўћўћўћћі§ћ§§ћћ§§ў§§хўћў§ў§ў§ў§ў§ў§ўћўћўћў§§ћ§ћ§§Ьўћў§ў§§ћўћ§ћ§§ўћў§ўћў§ў§ўћњњ§ћ§§ў§ўћў§ўћўћўћў§ў§ў§§ћћї§ћўћўћў§ўўљ§ўћў§ў§§№ўћўћў§ўћ§ћ§§ўћћ§§№ў§ў§§ћў§ўћ§§ў§ў§§їўћўћўћўћ§§ћў§ў§ўў§§ў§§мћў§ў§§ћ§ћ§§ўћў§ў§§ћ§§ў§ў§ў§ўћ§ћ§§ў§ўўћ§ў§ў§§ќў§ў§§єўћў§ўћ§ћўћў§§ѓў§ў§ћћ§ћћ§§ћ§§№ћў§ў§ўћў§ў§ўћў§ўўћќ§ў§ўўщ§ў§ўў§§ўњўћћ§§ћ§§ў§ў§ў§§ўў§§ћў§ў§ўўцћ§§ў§§њўћўћўћўћў§ў§ў§ў§ў§ўў§§ў§§јўњ§ћўћў§§§ћў§§їћў§ўћ§§ў§§яћўћў§ў§ў§ў§§ћ§ћћ§§сћўњ§ћ§§ўћўњћћ§њў§§ћўћ§ћ§ћўњ§§ў§§їћўћўћўћў§§ўў§ўў§ўў§§№ў§ў§ўћў§ўћўћўћўћћіў§§њ§§ў§ўћћ§ўў§§ўќ§ў§ўўѕ§ў§ў§§ўў§ў§§ўў§§ў§љў§ў§ўћ§§ќў§ўћћўў§§§ў§ўў§єњ§ћўћўћ§§ў§ўўы§ў§ў§ўћћ§§ўў§ўў§§ў§ў§§єў§ў§§ћ§ћў§ў§§эћ§ћ§§ў§ў§§ћ§§ўћ§§ў§§ўў§§їў§ўњўћ§њ§§яћўћ§§ў§§ћ§ћўњ§њ§ћћ§ўћ§§ѓў§ўњ§љћћў§ў§ўўќ§ў§ўў§ўў§§йўћўћ§њ§ћў§§њўћўћ§ћћ§ў§§ћћљћћ§§ў§ў§§ћ§ћ§§јћ§§ў§ћћўўў§ўўъћ§ўў§ўћ§њўћў§ўћ§§ў§ўћ§§єћў§ўћўћўћ§ћ§§љў§§ў§ўћћ§ў§єћў§ў§ў§ў§ў§ўў§§ў§§ўъ§ў§ўћ§ћў§§ћ§ћўћћњ§њ§ћўў§§ў§§ў§ѕўћў§ў§ў§ў§ўў№§ў§ў§ў§ў§ў§ў§ўћ§§юћўћўћў§§њ§љ§њћ§ћћўўї§ў§§ћ§ћў§§ўћ§ў§§ўўњ§ў§ў§ўў§ђўћў§§ћ§§ў§§ћўћћєўћўњ§ћўњ§њ§ћћ§ў§ўўў§ўўј§ў§ў§ў§ўў§њћў§ў§ўўћ§ў§ў§§ў§ѕў§§ў§ў§§ћўћћѕ§њ§ћ§§ў§ў§ўўјћўњ§ћў§ўўћ§ў§ў§§§ў§ўўќ§ў§ў ўі§ў§ў§ўћ§њ§§њћ§§ў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўя§ў§ў§ў§ў§ў§ў§ў§ўћћј§ћўћ§њўћћњ§§ў§ўўњ§ў§ў§ўўє§ў§ў§ўћў§ў§ўўњ§ўћў§ўўц§ў§ўћ§ћў§ў§ўћў§ўћ§§ћўў§ў§ўўљћ§ћ§ћў§§§ў§ўўћ§ў§ў§§ўў§§ ўњ§ўћ§ћўўќ§ћўћћ§ў§ўўў§ўўќ§ў§ўўђ§ў§ў§ўћ§ћўћўћ§§§ў§ўўў§ўўь§ў§ћ§ў§ўў§§ў§ў§ў§ў§ўўў§ў ўѓ§ў§ўћўћўћ§§ў§§ьўњ§њ§њ§њћћ§њ§њў§§њћ§§љў§§ћў§ўўќ§ў§ўўњ§ў§ў§ўўї§ў§§ћў§§ћћ§єў§ћњ§њўњ§њў§§ўћўў§ѕў§ў§ўћ§§ў§ўўў§ўўк§ў§ўћ§ћўњћћўћћ§ћћўћў§§њў§§ћћњўћў§§ћ§ћ§§њњўћ§§ўўћ§ў§ў§§§ў§ўўу§ћњ§ћўњћћўћў§ў§ўћ§ћўњ§њўћ§њћ§§ќў§ў§§№ћўћўћў§ў§ў§ў§ўў§§чћўћў§ў§ўћўћћњўћў§ў§§ћўћњ§§љў§ў§ў§ўў§ўњ§ў§ў§ўўжћ§§ў§ўћўњ§њ§љћњћћўћ§ћ§§ў§ў§ўћўњ§њў§§ћ§ћўћ§§§ћў§§ћў§ў§ўўў§ўўј§ў§ў§ў§ўў§ћћўћ§ћћїў§ў§ў§ўћ§§ўїћўћўћўћў§§ўў§§§ў§ўў§§ў§ўў§§ў§ўўў§ўўфћўћ§§ўћў§§њўћўћ§ўљ§ў§ў§ў§ў§ўўц§ў§ў§ўћўњ§§ўћўћўћўћў§ў§ў§ўў§§ў§§љў§ўћў§ўўі§ўўї§ў§ў§ўўё§ў§ў§ў§ў§ў§ў§ў§§ўі§ў§ћћў§ўў§§јћў§ўћўћўўє§ў§ўћўўн§ў§ўўј§ў§ў§ўў§§ўњ§ў§ў§ўўљ§ў§ў§ў§§эўћўћўћўћўћўћўћ§њ§ћўўќкўў§§ўў§§§ў§ўўј§ўћў§§ћўўўћўў§§ў§§љў§ў§ў§ўўш§ўћўњћў§ШЧўў§ў§ў§ў§ў§ў§ўўђ§ўћ§§ў§§ўў§ў§ўўќ§ў§ўўќ§ў§ўўў§ўў§§ў§§ўнўўћўўњ§ў§ў§ўў§§ў§§ўќ§ў§ўў§§ў§§ћў§ў§ўўє§ў§ў§ўўЭŸœ§ўў§§ў§§§ў§ўў§њў§ў§ў§§ў§ћў§ў§ў ўј§ўћў§ў§ўўїзŠ}§ў§ў§ўў§ўў§ўўјћ§ћў§ў§ўўѓ§ў§§ўў§ўћўћ§ўўя§ўў§§ў§ў§ў§ўўд„{ўўњ§ў§ў§ўўў§ўўќ§ў§ў ўћ§ў§ў§§эўћўћўњћћў§ўњ§ћўўЏ‚pўw<§wџ;ќwџџ;џ<џ<џ<џћјњјјљљјјљјњљћњњјјїьљѕѕєѓј§Н™V>-40)9:"ш   &+љ§§њњн§јїѕёѓяєѕљјїѕѕєєѓєѕѕћ§Ю‚{M812277-,ї {ѓ , јјїћћўњїїіљјєљњњєњјїї№ћљљЇЁd:028A1.ўў є"2-#јјњњїѕѕїћћНњїѕѕїњјїїњјїїћ§§НŽb\hWJ(7+57  ! јїѕѕїїљѕѕєѕїјїїјхїјјњјћћбk]UGOHYU*"ђ%:(0 јїїјћњјїїњњјСњїјјїњ§§Є|I>\MF8-M -`WE1 +," 1<&@:§ћљљњјњјјњјјњјњјїїѕЧ§љЖd[LVPLLGJF95G!#E7&ћљљћљњњјњњјјїѕђѕѕїбѕєєїдКIV]MGJBCAGF<""#"#%-1&.1+:& (їњјјњїѕњјћљљЦћѕљљјњјїњћє›^?]]FCO40;;&(:1 Cg‰x{‚ДЉŠ……iA&OћћљњјјїїПѕїљљјїћњљјїљљјЯ”‡O:JGA;@4)#",.""; F^|‹‹ЋЂЇž„”Œwe3Ѓњјїїѕїѕёїјј§њљїїРѕєє§§тrI@ELUGC52.38.&!+4C:*MZjv|{КЋ—ƒ}n\pmŸїљїїѕѕёёѕѕљїїєѕѕєєбѓћћŒ\]YTHE?940..>3&.!$<@H>`Ž}ee\wОЎŽƒcmvxzƒћјјќѕљњїїљѕїјњїѕѓѓвёћщx]NJHHGE->9>8?@1**35B5w‘ŒtdQp‘КАЃˆpiv|twјјљѕїјїљљњѕїїѕѓѓв§љœ]Q^M9@<9&%51-0+73@F2-7?mЃž”ƒoЊЎЅЊ›eorz„јјўїѕѕїјЩњїѕљєѕєћ§щ}HHJ<33>?A2421-*%WA$HeqŒw‡t™ЊАЃЌКŠ~rœН‡}јїїљјїїѕєєѕѕїЩєј§єŸu;9^?E41540>5##,$8C;."q‚[V`ŸŽx™ЂŽŠЃˆMWcndq……љјњњїјѓѕѕїјєјї§љЯcA7>HJB@B@?FE;+2$%1- W‹jb[\tnИВ•’|Ё‡?Z]pox‹‰wљјјїјїїѕєђѕєѕњ§ьqJCAEJBGF::@>?A40>)-%UŽ~giwŠw{ށ~xncimwwqvqkgkћњњјјїУѕ§ћСP<>;MNHSFB71B@?<8-$!34 T›vmqwŽz}…‡‡‚‡e]v|wjj{pcEeњћљљћњјј€ќїњћјwZEBEG>8:2*"(+&*14…ikmup[™УЎŽn„vC;<98@8:32$Snq^ijhhŸ—ŒŠ‘t4F{iYuwxopi|‹…ѕїјїѕѕѓѓїљжP?BB?@823<5+.)(LmY^ˆ‚ceg‰Ї››ЮЛ{NxЌ’‘`c\^o’g|ˆјћјјїїѕјљМQctTMEC@B:C>3;BA@B>)d{{mninnt˜лАЃЫ˜t9OWƒ{bp]cp|u‚ƒњјјњњѕјљљˆWOCPHH@<@ECG337<@A24$FOQ`vokjr}ˆСАЁŸ‡vJ[o|jcjq{u…Œ–єє€§їєѕ§ћФcWT,-W|U2ACHPN(1$59<p‡Y>@-8B51224302#NShdcrru{{kžЃ}ƒvmh`outxrgnuq‚ƒŽїјѕїї§§рAH2A>BƒqTv[(7^ONW;?91.%Grrxxdrqƒ~ˆ‘”x[pqweqrv|xjhgv~‰јїїѕє§§”MVHHCS}dY;LSOW\\S;B5:$]aLnx}rq}„–Ўžd\kkecep~‚‰Œh\j\xrѓѕѕєљ§љ`CINIA>\gWNTV[VJ1GGFEJh`^`eit~Ž‚~ŠВž]Zm]``qv}‚{rtpp}rv|ѕѕїїљћдA>JIIHF~ЁS"H@FIBFA%&M;S\phq|ngzЄŒ{|ƒŸ…p~vhkcmw{}xtnnw~…wїєїћљєЊ:>ZHHC)(7(BC:544<%(Aintie}ePdŠ…~Œ…ƒYmbtpv{}ƒ‡ˆvnhrw…‚kїѕѕњћчT80;AB34174?@;30;2,!m~„ЉpheYdOtzŽˆ˜aNQ]kt}rttqzdhhaozwxјњєљљ–>;>:2:+<1,(25>BGB2-4&>L(`Š‹nid^wŠЏ•‰v„wMgqq}xw~h‹x^hirx~єљ§§ѓ`IBFIEF84850,)2?F+4).[|b\~mnTFHVpzxœ}tokkrijq{‰ŒŸ–unb^opzvљјљ§Шw[E@C@)+1210(-5.45,&mZQdzhnkYcpŽŠw”‘}–jhnxmx~…}hh[^ibirpїї§ћw4WB>A0*?V50975..";Na\e^Z^Y|r”ŽЄ‘zYdp”~ƒ„rvocc\[wwtbbїћљмcGA;EA89ENLFHG><8<1!LO|pmpq]žˆ•ЇУАPGow|Œ‘‹‚tutjWhpr{zvh[їљјЇLA?@992.5297372"843^d`tpmUE]—ЋЂЊЃЇ‰mVSm‹{ˆ”’Š}{qqr]Nro‰|kgўћї0CTIH@899cM??>91&(7)@moeŽxd[dxЊЄ’–‰Ђ›eng}{nwЗ}ticia’СЂ‘kT§эЩuAPL;:9:2a|2.4*+.*t{g|qiQWЕН‹zˆkP^|wqjŠ—~`eoro}—…‰Д‘`љзФ‡W4C@FIMIS797.2;q`wmpWo”‰‹‡‘jƒprqqnox}omexvrpoxxt{dєЪЏTNbMSO@2+8:A771-#)1w`JZYmdTYv‡ˆ‘ž—vkghoqow}}x}……~‚x{xr^`ЗЌ`NGT:BHG<1-+232)+9OcG^T`EiužŒ‰„Ё‘–npw}|x}c\kŒ‹ŒŽ‚{z{otvwЕ•gv^MJ>B;&7Q`‹wpx`ƒБ–…^PtŸtމœ|u}ŠŠˆ’—„ur|‚‰‰лjU`FFNIB9-I1*3"2JBLˆHJT„МЛ–q8n™ЕЌjShz‚rt„Š‘ЅНƒgjm„ƒ‚„{‚ЊA-3@C7030041NG#09>N#B–\C*8nw•ОЛ—‚‚}||‡••}mˆ‚„~~ЇС˜o?n{ŒˆŠŒ„xk]8@A?50Ax}e?>on‚ЗШЎ}c„‚ƒz„Žzcq‚~p}—Є•uhn…Œ„œœЇ`G::FB>:EC?;@E?087, [hC[aCQ˜ЊБЇ|u~}|v{}qt}nŽ˜‚uŠˆ…|mzƒ”œЉЁ—JGYNFF@8:?32?EE@3.?zjGPTEb„Ї‹~x‚m~„xrv{w‘’•c|‰ˆ‰„z{Š„Œ‘–‹Œ™YJWG>:;:@CAA>7:<@<* TncaG>‰ВЛ„{™ЃŠ‹‡~‚‡ƒŠŽ›zYi‡™„v…ˆ…‡˜‹‡ƒbpQA49<@AC7;EJC:$(-ZobYW;?щz &&*171+$$+њњћњћњљљѕјїјјљљћњћћљљўѓЎЁe;+,75;-?ъ %%#185.%),њњљјўљњњљњјњљљњљљЮњљљњўўЧb^i\G4;8-J  &&+.94("(#%њљјїљљјј§љњљљњдљњўўк˜pZSLHEOJ+ 2-  7,?TG1J% (#њљљњ§љњљљ§њљњњХћњњљ§ўўЅ‚L;^N<95I4khG8( $ 1&>FE(JG@ST.2&§њћћљњљњњљњњљњњљјўиЗ–a]EWPOGIICEHZ21:1#"7,7NE;4<@1.ћћѓњћљљњљљњњљјљјјљбјїјњйС’FY\NHHBC7$<@@>E@7;1,-O80•РБКЗжйТДАŸrZ{њњћљњњљљћУњћњ§ћњљћўўз•‡U5FF>@:.*359@><>@3,.;9;<89?CC@?;@EPaQwССВЅЁИжызЮМЊДЖКРТњњфјњњљљњљњљљјїєѕјўэ`LQIIC?A599у>AGHCGO22MЃЭЩДЊ’ЏЮхктЪАЖЗДМОњњј§љњћћљјаїјўўЃdS^O;;503+2922CHQVZQFLL˜кцкЯНЎУтунтеЎИСЦЦОњњјљњљјУїўўюMGM9:85@>;9479BA#>nO>AtЇАЪЦЧОблшлхяЮНИпѓбТњњћћњљљјјїјјњљљмњўњЄtG@aFL:815<>>:2:ABECJZQ-”ЫОЊЇЈМзьзпёрЖЅЛсююЩЄљњћњњљљјљљјїїѕїїўўїo\Y:@>;A>;;89.xЇЎЎТкжЊЊсцмхзЦЇЇЭКОРУњљјњњљјљЬњ§ўў‰P?EHC>79><;9;87;9<@>0ЫЃˆажЯбшФбкЧМЋЎВЕКМУСћњњќ§ћћњњ€ћњљљњўў›bL:CNE?@B?<9;;3*,*ЈУЌžЇжЭНжгжбрЭœЎАЃОЩЫЦћњљљћњњљњњ§ћњљўўжhH;FHJJ??вCJ:>507;54HЈЖАЌЌЄАЧадИУЧОЅЃЉЛжтЯЪЭУћњњћћњћњљљЫїўўЈUYS3>@B@45>;BB77ЄЦКЗЖРНФЦЧСРКВДЏДБЇЄНСООМћњћњљјљљЦјњўў‘wx@POFGLHEFIC@<;BBFFH&$zбЪЎЗММУЦШЦОРЛЌЊЊАЕЕЗКЗБЈБњљљњњўћљљУјўўТT;<;HJEAJA4BFB>>?@>@FG(L’лЛЏЖНдНЧЫЪФЩМАЎАЖЗЗИЖДЈЌАљњћћњљњњ€Кљ§ўў|`IEU98,-BCHGGHEFB@<,7ЌРЖЅЄ|ЃЕЪЧЦЭмЂŠЏИОСОНКЕЩЖДИњљћњћљљјњўўєod`k^GH;74?AC@?>CHII<8:QИЎЕЕЏДЄйўђЭЕаО…•БЛКТТЧФОРНОСљјїї‚јїїўўЌcFO}j>>AAF?@B@A>?AETZ[54HFA?@<9::39;?A<4GwЌЅЃЕЕБŸЌЮцднўыД‘ТнкЫЕЌЌАКжТМЪ§њњљХјўўНMe|ZSJEHA@;AFBC?@?9:4).HБТРЌВЕВЕКтўмзчЧЇvžОСЗЏЗЖИЩТЦањњљЯ§ўў‰WJ?JHB>BB@LJE1:EFA?191?}ЂžЁАЗДЖИСШэжЧаЫУŸЋАЏЖЖїМНУСЫЭїїљљУјўўЮi^Q22\‚V2AEMUL,747?A@F:GЕРЏЖЛЛИКТрєсЭМаЊЇЈБИЖКРСУЦФШШЭїѕѕщїјўьqICO:BL4@A??€‡C7:{ŸЗИЈКОМРНБлзМДРЗВЎБДЛТРНМКИТЧЭЭћњњљљўўчFN7@@CŠ|TrY2:bZL\CFEAV…iW;<;>1.N˜УЫмИАЌАЉ—ДРШаЩпЇ‹ЇЏИРОТФУТАЎАБЕКСУОњљљўў›CA@854:5<:14<?528>B@GCB<;29::FVTJIHC;>E<*;<ƒЂСВКВЏгмУзрћцЯЂ—ЖМОдаЪФТТРИЕЎЖРССИБЎљўўЊNB@GE>7;AE>:@A9,+2M7IƒЊАЕЕБЏ—лшйжлуЩЗЕОаЦЮгзбЩУУНДЕ–УФбЩЗЌўў§7CZOH@7:@eQFC;>98:M8VŸБДгЕЏЂЇРтлдгЮнЯФЌЖСЮНЊУяжЮТФУНЛВаёхнƘўєЮu>JJI;9;<*i}33;4027:&AЊЧЊЛИЏœЉюѓЩЫЯЭеКžЇНСНЗРУрЪЅКМОРЦрШЭбэйЋћпаŽ^:JHACNMQJG:9**,(3,PeИЩБИКЏЛжаЮбдаНЩЗДКНЛКРУУКИЗООСЦЦСЛРЕРЈўдЗ—\QgTOLE>?CE;?:83-;09;C?<,%˜Ж™žЇЃƒЎМмгЩЮЯаазДООЫЩЪЩСЊЛЗкйкйзЪУРКЖИИКС”mqdL?C89:>CGB@ECNSMHAЃЉЕТЖДЕЛекеШЪИžттагЮОшзћсЧФжегбедЫУЛКСЗНОЛTGJ?>EE;<@ELPJ@<@BH:>kЅАнУНКЋЦзхксЩŸ˜ОчумЧОЧгеСЛЭЮЯгдееЩСНТЦСУТтkVcLHLLC:2-VC?2@A@HMMGCHI">™Ј”ЇЅ‘ЂжщюрСУЩЪЧШЩУТТФНаьжЭЩШггбЩНЦЪЮббежлтEOZLLBA@@9?CIPQHEHH%TОЌЇЄЁŒЄЭёжЯЪШЫЩЭЪЭФУСУШЯатмЃРЮеЯШЧШЪббджедрWPSHE?GI?78?ILABE4MЊФДЏЄˆ‰ИжЪЩЛКШЪФЪЭЮЯЯажжлжЧЉЛСШЫЮЮеабЮбежббзёћўћў§ўћў§§ћўћ§ћћ€†ўћ§њ§њћљћјўўдАjH>JFC:B;0 !&:.7BLC  (&$$??@@C050ћўћўћ§ћ§њ§њњљћњћћўњўћ§њњўдМБxNC?JPQAG+!))(:;>8149ћўћћњћћ§§Цћњћњ§ћўњ§ћўњ§§ўўдŸrn|kY:MHCQ+)-&0-15?7-.ћ§ћўњњћУ§њ§њ§њўћўћўћћўўсЌ‚n]][Y]^>A<! #   #4IVM8Q2 !-ћ§њ§ћўњћћї§њўњўћўњћћўњўўЯКŽYGia^MF]0@|vVO4!*3>JQC3MJJW^802§§ћўћўћўћўћћЫўњћњ§њ§љћљўўЪЂrmUb^WTY^^UL]A?%;95%!;1>[GG79!24ћ§§§ћўћћћўћўњћћУљћњњљњћўшЯUhpY[TPMU\^NC:+!3;C>J80(A?AEEFNF+%;њўћўћ§њўћ§§ў§§љў§ўњўњўўЫЏЖrOioQT^FJOFGFHNITZ&1Tt‡˜žИОЛД™ЌЃvJЗњўњ§њ§љўњћћўћ§њ§њћјњўўљ‹[QV]aYLQIGEOUFB:EONZZIdk}›’‘ЋЫУЎ‘{wˆ~Ењ§њ§њћњњљћњ§њћћќљњњўўдžmqoaWZJSIFEMSQJHB;PU^gVq›~xj…ЇаРЁ›}„‰‡™§ћћ€†њ§њўњ§њ§ћћњћњћљ§ўў‹mW`\TSJHLSOMOISQIQ[`>,LŠБЄ„{q}ЉЪФОЁ‚‰ћўћўњ§њћћўћў§§њћјњјўўДuemZJGFMHNAIMQNPSY^cZYQ‚ЋМЎЃŒ~’СУММЎ{Œ…›—ћўћўњћљ§њћћљњ§њћљњўўв™`\\JJIMTQFLTBIJA?q]@?]tЊ‹™ŽЗКФЗСЯ‰‰ЗпЃ—ћўћћѓ§њћћњљћњ§њ§љўўвД‰VNnVZF:IHQLOGI:E?IY\Paˆ…‚w›ЇНЗККЌŽt›ЖМvћ§§Тћўњ§њўћ§љћљ§љўўлЇQIg^MFCGEPEGAFJEGHTP-gŒ”„h™™АЕЗКЎ’ŠzuЏтУ|ћ§§РўћўћўћўњњїњјўўžcYPb[ZHMGMMINJEQWOMQc[*z›‘w{rƒАЫСКдН„rŠШдЭŸ|њўћўћћі§њ§љњјљїњўўƒ…oiMIQSL@EJNTLIMNIF:CM@CŽ—uzvqРзЖЖпЖ~}wЃЂЂ„ћўћўћ§љћјћњћњћњћўўнmaj[ULIBFFJIULQJNFB;?8uo{”ЌЎx}УЫБЭЏ–p^pЄŠ‰Œћ§њўћћњ§ћћњ§њ§њўў™iYQ\TMNJLMHSLQSFSJHB:x—wQkЄЏЁЌР›ЋЏ‡vtƒސ˜–§ўћў§ў§§њўћўњ§ћўўЌw\P‚bYFGO]]PPZSJEJG@,,$ŸpioАЇ‘ДИЃЄРЄdh{‡qŠ›Ѕ›§ўћћНў§§њў§ўћ§ўўтzTJQ^ZQTP]Z`UZNLWBC>. #npqx}ŒгЩЈЌ‡Ў—Mm}‰—ЅЅ’§ћћ§ћ§њћћќљћћўў‹‚[SO\TSSONQ[^TPQILFAAB~vu{pˆЎК…›Ÿ‹qmqС—›œ–ћўћ§ћўћў§§њўњўўЕhoeBPSSYU`eanV@B9GLFG*h˜Ÿo{ŠЃАœ”ޒЁoout—œ—œ”ћўћ§ћћњ§ћ§§ћўўЪ‘nch]YPNVahg\OVBJGPNH?(p…zz‹‘”’›‹ŠŒwz…‰uuˆœ–‹Šћўћўњњћ§њ§љўўƒŸ‹ŠUWW\VUPPWVVSLUOTPNC*eЁœvzˆ••Ё™”•„qw‚‰Œ|‰ƒ‚r§ўћўћўћ§њ§љўўеjOPIW^YNZV[V\aSPMNIQIL"*cЋ‡u‰ЂЅœ˜™}xˆŠ~ˆƒteћ§§ў§ўћўћњўўŒŽr[J`WWQUTV^gg\YSHCJLG1\…ЎœmnUvŸž—™ztwŠ•‰x‡jrwћ§§ў§ћњћљћўўЫvnnIT]UHJOSg\ZWY`PIE?)4ˆ~qhPAu‡Ё—žЄЖpa}‡’’‹Š…™}ƒŠћћљўћ§њ§ћўўЩxtƒv[^PLPLWbYPSWYYHI58<’w{‚|…hАчЭЄ…Ђ‹Z^uˆ–›ˆŒ–•˜њћњњ€‚љњњўўРrYizSJVWZU[W\NHO[MPH:3d{™‚vt~|uЎА›ЌƒPYŠ}kƒ‘‘‚~‡ˆ–—њ§ћ§њ§љњўўчdThinBB[a[ZWSVSSPFQHG:#<ƒmq•}ikЈЕЉБЦˆeЗк…ev{xxˆ•›Є§ћћ§њ§њўўЗЄYv‡uoc]TWY][bWTVVSLGFAC^vqo—’tx}ЅРЋТђй’c–ИЊЄwrwt‡Б}ŒЁћ§ћўњ§љўўаcuŒme]W\UUвWSZZ^ZSOE>-,%{•‹}~||…ˆЛыЦОпJ[g’Œ}~z—‚•œњўћћ§ў’ŸqcZiYY[LQ[\aMZPY[[FEE9:Zihn|„|}‡дЛЋЖ—ev}‰|}}Љ‘‰•ЅЏњњљ§љћўўлvo>Co‹iBQ[jhg?IOJTSVG49d‚Šwˆ‡‚Š…ŠИщЯЃ…Ђrt~|ŽŽ€ЬŒ–œ›Ёžј§љљњћў§ž‡`\gQŠЁmQVYZ^QO\YWOTL34Qi…„p~ˆ‰’‚Л̘ˆ›„|~}‡„ˆŒ~ˆŒœЁЄћўњ§њўўјWZIUOW–b‡tHS{ngkUVQOJE`ƒ‹Š‹Œ™›–›ЃВr‰v‰ƒ}—–•}ƒŽ‘žћ§њћћўўЎ^j[bPm—xkObmhrwnbe[ZV2Iu~^…‹Œ„„–•ЈУЗuq‡~|t‚‚—•™œЂ{uz{‰’§ћљћўўƒtQa`UOYrjbknmohObb[W)#\{rw{z‹Ѓž”ŸЦЗjj{vrt|…Œ’‰Š„ŠŒ‘ˆ’љћњ§ўўыYZ\]SQP‰Еc8\]`]Y^WQAdLavŠr‘……}ДЄ”›НЇŽ‹Ž{~z„•—‘ƒ}}˜žњћњўў€ЛЦQWxjVN:>H;F[b\YPWPO4GP‚‹~ˆŽ~[rЇ••›•—Ÿeuv„‰…‡–—›Š‹”ž˜ŒњћћўўљePSMUEOMF@BPZTVVP[Q<-F—”Кƒ}uvub‰™ŸЏНi`j|„‡›”Љt}wg‰‘ŠŒћћљўўЖVYOULIQFUHNST\`cW[ILJY\?n—œuwoˆЁШЌЃ–Žbx‹‡ŒŽˆŽЁ‘Є‘zx‚’Š‘ўўУzUQ\TLHCHGIMUMYYUWIFN|ŠrdŠxznh]o…‰‹ЂЏ”„‡~|‹z…ЉЉЕЋŠƒ|~‰ŽŒŽ§ўў€šзzZNYIMLMFHSQLM]MGN3Fojz}|u~Œ—‚ЎЈŽЖzw‚…Ž˜›Ћzzpz{||‰„њ§ўў‡Hq`NSS8bgŠˆˆŸƒpЋМ•ЌТуШЋo]~”•ЇЊЂ—‹‡~vz‚Ž‘”ŽurњўўС]YTUQOTLP]YSPUSLEGW>Cx{x‚zjWoЊУБМЗСž‡nnЈ’žЃЋЂŽ’ƒ~{c‹ˆž•‰{ўў€Ф•B]mbbNVP\rcVVYOMLGO0)%  žZЪЩЌ‹J80*.*  @ƒƒ+F5-$*00!7n‰‡M#"   %)L?|r €ж  )*"!$* `()#  0!  ?pecqv $1 % ,8Ы.) * ) . SagkbgJ9&%(& C$  М ")йAwro…S&N‰~}~z„…|„’xZ„[*2$b3ўўз P[\mm}tY\kq~ƒx‚’ž˜‹Ž—nh˜–vpc1!>nCќ  е 5TVA5Vrtn{rmc”ˆ„‚ˆˆŒr‚„‘‡‹x]M ўћў §й (93C.HmecijqŽ„ƒ‰ƒ•Œ‹‹‚{{ˆ›Є‹^FFU ќ л#-IJMmuhim{~‡}~ˆŠ‰žŸž–ЅЌœ•{\xxўз MHdwotm{„}}}zƒŠ˜—™„›ƒuTN›КYўў и$  Zk|}u~‹Š”‡…ƒ}{‘Ђœ‰‰vYQ(0|c§  бZnwrƒ‘Š˜•˜‚ˆ„~ˆ˜œЂ„P7owYќ,:ўб  k‹- ~q|„‚vЅЅ›„~{{ƒˆˆ‚Ÿ…dH[tI ўУ  8Q( ptƒkh|`‚ЋЩТ”ru‚qЊЂŠjod1ƒa! +ћ г w’Ђ‡wqddxmubWpƒ‡zA$BQk‹Цx #"ў њ г ok‰q]tr~qukrtz~z9]jo{›[#&ќ Tћ) Э vzut[Pav}‚vqŠ‘|„*i7)@puŒ‰5% $ !Ц(%-#7t|‚}wodhmwuc{n+ 4Y0Q`mo ,4 ?F)# Ц,   {~…vv{w}…dE{n2"L-BnmjS4.4!" )"%nv™ƒd}ŠЄ{‘z".! |Š…„vzЎjL c}[U]ie:" !1 ?3]j‡‚zdgzt›ОŸB,€ш}Ž…ŽŠ‚‚~‚8P—vUŸ‰zZ`ULwh&$*(%-   %`‚vuiocx‰ƒƒ—ЗД[…xxˆ‰‹||$4emo™Šn\de5 !&)%"01akYknartv„ˆ‹Ћ|oixW˜ŽŠvcbFj+Zw|x„”ЦНcj‚]+,! (.1jˆ‹jurkpriY‡ž{r}o[7J–…ƒtvaptk›|ƒ`jm`w<& !# *. +nibw{Štn…„‡…œ~09;\UJ…ˆu{|wwcjqv›ШеЕ[VmcbY     "1\bagkuudkЃЯгЕ‘]. , $.",1-2&11%M9v‡Ž‚tqrW‚naДВ‰‡V>J@Zƒo\8B}v{{z}|iƒ™˜Y*&-%#;(*)84.:5?4r–ށT]nj{dP~ŒЃЋŒt`SZhdMP8H>x•Ѓƒ‚}i~™аЇM;B!  (0)(BAQ]x‘›Еƒridmq‡xhbŒŒЎ˜rwMY]WNT^B8h]‰r‰Œ}rŸФФU3$$"#$)S4)^„‰Œbm|tooьij{…ƒziNE4o]a`euoitt€€`‹p”ВСБv-$(0%.0@EB7Czƒƒ|{~„‚tku„~‰”‡e`Vmh[IYZoojv{bn|xj•ИДЌU $ "-1&(,)1.04>B92[oonot‡}ˆŠ‰‘{<`I\bZH@IqLc{n[ww›ŠŽŠ7!8-.3-1+.11?4#7igŒ™‡YZjt{rƒ‹Š‹rpgnIQaejŠiE2;[™‘˜~ЌŒ‚x~p-#3)-)-"&##,1#2MqMЖЈ|ekjr{x{‰Љo@5W3CJWVE)>BЇž„‚x|i’e9 "!&$*()+B1MnЌ››‰ujdn|x}}„ž˜’~Y(2W(Ug! 1O]Nn”k{zŒ•–a(3&(-(0,19B<.&07]Б‹‡ŽœŒdLC{‘~{‚~ŠchVE[@q}M-PrJkb…wxxяC;*2;;9;;@>B8;>:88€Т3>GLLG9:VœЉЏŸЎДЖМЖЛ„;55+9:71,+21 .HJ>-*uБ3;99CA?<:C;.>?B;9497589;BVM3.(S›ЦВРМЄ„?3(7-.:504*"&+4182,$%8ЁК2-134;9(#!+~сясН„0+SNC@?801,,*%3>B;23%1&uНЩ(-)*%+!8PA88<<::88€щ:81+*+%)S’БЦƒ-2AAB:2.+250434:227:8OrŠЛЕ!&(&%$$)+#)(+>4520441-0.27>72-7>"*@I*;@<;5,27135272-*%!%4d”ЊЇ&*+%0$&1G8C:9..-**##,-8>CH8?UZ:J,#W9.49>BAGC93518:513+.@ŠЄžЋЈ,--3.07MYejB@874-(%,,<>G,*0QNBC?Q)!"",4JPA@<3(%,+.70%tЖЌЉКЕ..Б:22;?971@@>:5+1(,9@( ">?F>:2$"*0#2$$!#*23I$~ЇЗЌЌЎgT7A?8A<")2N732)&&Њ!#0VjI72((5[C3*+Q!"-4.0+2dЁЈКЈЂžцШЋНД‰jhoqVeb-0,&*,.+ 5E3,#2 5 Ц  2,$,AЋШДЕƒqŽыУкдЪЧСКЮОИИ–^JN0GVnŒВВЕЖЗКФУЦСЧЦЦЩШЫЧШУШЩтгЫЗ2     +J:3?55hЋЗЛКСТФФТСОЛРУЧШШЮЧЩаШЛВ‘‡Ырq  085.121(,C›ЖЛМНСЦЩЩиЦТТУЦЩббЫУЦИЋ–gkЗб‡  0 €1A,*.9#+1ИЕНМТСОУЦЪУШУТУЧЩаЫкТ”u0jДЖ‡+!  (?   ,(),(jC0(5ООЦМССРДнжйЧТРССЦЧТйУЄ‘.”НИЗ~9LU;78@74VWEUB@+!&!2+#"*+СЛММКСОРСУКВЗŸ~eOŒwЕУКВ„;9,.--+2#@FbI1.*3&%+!АЌЕВМРФСНЕЕДЛЄŒ*JОЧЖАЇ›Єx5.52)).*302;01)77:2hУЛСлЭЮФ•wNM(+4!$ИННЖЗТШЫУКВНЗwn#’ШЗЏЋНТ›cQ>1-.).,0(057-%4@HA&]ЕОЪЖЖНШдДБF>98?*)УШЭСНОЦынЎСЧŽ7BWžУЇЊЈЗЅo>-20..,514079>375;]Q;™ЊСНДЎДМОЎЯэЦvL>0#7ЮЪЯЫШЧФЩЮrтС•аЫОŸЅЃО•J1%(0)#(0-104.;440+@ŽЦТМЛВЖЖТЫЩеѕьŸT: 5ЫЪЮЧТУЖОЯUrОЎВеанЯКЋЉЊZ"1*7@)".<82).1.324PIЏЏЋБАКСУШбтЭКАОx(%ЮгЯаМВЏ—Ћ|ЁУСТЩеђэЋАШ‰C!*:BQ3455053394:1&EWЊгФЖВВЗИЛЛЄФуРВТКЂnhЯЧЦРЛОЖЅДОИмЪЧЭЇЏРАЂЎ[E377г91-%*,.+(-.*7B(GŸЖЊМНЯЛЗИФНМЩН‰m‹‰Ѓ›—аЧФРУТКИИОБаюњщЎ™ЎЎЈw)$83-01-*$#,1--%((7C-ZЂœ‚ЕнТРСТТКВŒЉŠ‰Ž”ŸŒЯгЭТРУМИКНЦЪЪЁЩŸЂЁИ<15<@>;.341;98:;4:42ˆЋДЂЖЗКМЧЧТУБЅ™—–œ–qЭЧЩСНМИЖКРУЩФУОЉ˜•tq45824>;@9<ЅДЈЈ€„Ђ‹ДНШШЧТЩаЇ•’Ÿœ|ЭЭЩЧММЗЕИЛРОСЗНЋЈJQI*4-OG:;;EBCB?;:>@#JœЯЮЩЏЁЂЅТУЫЩТЦЄ—}‹’˜™”dШЮЯШНЗЗИБЖСРОЛНЕЅxLC5(+7iJ@:9733CFHA75BNB?<0J>]ЧЎЇЌЎАЋгјЩШФШФМЗЈКШƒŽŽ…ЛФЩпг‰ЊЩЩЯбпЛŸРЈƒ142;990)2E?83;<<410A:ŸЪСАЏБВЋУмФУУТЛОМЛŸŽ›ˆYHnУШЮЮККЦЪЩЭауЪСЮƒBSTBB;5,,&8I@45;>>7&7?aЭеЎЕВЗЕЇ•АЋВММИВЪФБВМЪЃ˜УРФШЩЮаббЭЮааЯббu5A100110489;4:::4FA˜жаМЗНРТЗЏББЖНСеНœ„w—ЂЇŽ™žОФТШЭЫЭЪШЪаалпЇ]7;52-010107?;9>GB;4+AbзёмЧРФЩФНОтеМУЧЩЄ{Ye^n{ЛЂССТУЦЧгЮФЌЫкљыo(0&3243:95:;;94<>A?VŸйаЩЧЩЦЩУШЩбЯЪЫга—”Ž˜О‘nЌОЌВЕБЕЦЮЫЮДНгкбJ&8;;1485495><:7:CC€;(„кЪФФЦЮЮЯШЪЯйдбршЪœ—–œЅœжШБЋВЌЕлггзЛйўяŸ<*@I;@9?:?><8<;@<;BGH2HЧхЈРЭЫЯагЯЯдаЮЯеС•’}—œ›Ž•ЈЋЏЏДАЦсзлжЯЛШЮj$.A;<97990;?ACB?@BJGM’ШаЁЭждЫУШЧЭЭпСОМЎ™˜ŸŸ•’ЄzЉШЎœОлщмжгйЪшЪP20<>99€§:8:;7OoOFbFEc^\ИЭЭТЦбгЮЩРТФЮгЩТЯБАЋЊЋЅ‰œvmЇЗББЦЋнйзФЫЪТv>IHA82;99;;??o\8]–„UA5^ЎСООРТЮЪТРЗЦжзблЫЏЋЂЅ›ССž˜‰ЎЇЎЕЪНЭдчФСг—--9p{GM>:577:??8%1Pd947C?@AC;B@C)FŽкчЫЩЩЯЮОМЗЮЮймдНЎК’ЅЦВЛ•žЏЏЋЎОМИЉЋжўўрС•O+)@3?`OœРкдТОЛЃЯЕЈбтзаЮЭœ‚–ЅЇеЛШЉœŽУЧЧЋОННАУлрЭˆ<,:CHIE>85;8B@C@>4GOMSLЇмЦЧ’ЁВЕЋЎЦеЮецюгЛЃžЇЏБЋЈƒƒˆНцєЩШФДЧуўнtVc>?:>;+779<<€щ;:?EMcq’ЖдёаОЊЌИУТНЖЇЧггхнЖС•ЂЄЄЃœЎ…~АЂЪЖЫЪЪЗрњїŠTPJ:?3103:47;57504aM2C‹ЩедЏВЗКЛКМЛЗИЦбЧЦБ•ˆ‡ЎВЈЋЖФМЏРДББЦЦЕйьђч”?AUVMdБМШЩЩУОРСМИТЧЯаЭлЯЋžЂЅБЇЄЅВЖЗЛНМЖНТЛЎпєѕуp2-B>GAG?73:>?GBCAEUGNˆЕЕЦТРЗМШЩТФЫаЯаЮбНŠ™ЃЂЈЇŸ‰™Нp—КЦЗЂРТМпдйЂL3;AA:?EGE?><@E>>EBGFSЋЅазЮАЖРНСЩЯбЪгЖЕЋЌ–ŸЅЌВЫЏ‘ƒЁуумЯьЪЧЦУЌT;9(:<8>;A>B??:>BCG53JŠЈ˜шчНЎДЖКМОТЫбгэЗ„wwŒЅЉ™‹wz‘`‰ящагЩУЋгЎ\F544;;AAB<7;EC<AJLIC;EB8?oсбЮЮжуЭЎ‡‹ОжЪЦЧгаАЗœdŽЄœРЧž{œЛ™ЌВмОФСнE99>8EC@B>+(* ?FSC<7:H8d`QMWJE:;A4?;;.&tклЦž]#)UOEJJ:!.&1&*B>>391(U–Ѕ2!##8#04MiPLHIF>97"1785"%!!%P~Ђ–g%:A;@A@34!(!&02$3-0,3IWT•‹&!"&.&5+4)2:8);:?;75*0<$!)9t@%@?EEB>:4:784383!#"8Uhreh")9):0!<32(,%79FCBL@;]U?G.0P9?IEELT?>;4-)<517-%,Brxpv|)!%0$,9GUkmOSJL:<1!$?ILS40JGLHAH59%09:7S]LE:+(+-8*())T„uz‚ƒ&01<3,;A7AIJFG;9>:04IE,%".BA@FB28,,31,".;<#(*)-B)Yrzz~dV7FA9C@*$$8QC@9433)+&)%#8aq@%?+#;7>vT?9BJ%&+0.@8405Jwt…}|hЯЇ…ЁxYbaoZdc*,-&(.(0#(( 2<-9.2#PJ:#A{T%& !   %\{}ƒˆ|jk‹‘”œ›ЎЛЎЄЄЎwАБŒ…•vI93Qj !!%$$€#% "-+1\ViLGrŽ”ˆƒЈЖЊЇœ’™™Ѓ…–—Ÿžƒv] .#!"!!  ,;YPFPG>^„x|ƒ‚ƒЂЇœ›ŸЄЇžœ–•ŽŽ—ЏЗ˜qS!Yk0;"#& *(?73HC 0<0)(+"## ƒ„‘žˆu…‰„ƒ……‘˜Ho*xЇm!-25?B-7AV?5@dkGM<  ;?(-.2.%+-+)21•˜—Œ…–Œˆ™›qb˜Q53^J czd-J[:7E5A;dcVcPE" 1$240)$#+)+#Ž’‰…Ž—‘’ƒˆŠqOC#TZPF‰w|h805393<3!+"2CWaE9+4"8LIU5,-1?+.%# "ЂŽŠƒ‘—˜›Œ‹‡Œir];>}Ђ…vw~‚^G-2?:02591:E80??C@#1]hg‘›c1C^;9#""vz‰™˜•„~tqzni&˜Ž‚ub|[(%:>:87EHHBB>8A>AA2U™Œ‰ЕЅЄЅ||TV++) "ޒއ~ŠЃ™‰…|‹OM hƒ|~ˆ”xQI*$059A>99><<>I7BNG?…‹Љ”uœФ‰Љ‘:C5,B8%—Ÿœ’ЉЪА‘’d%.n”pmw}xM;-..11EC?CCH>75F:?]S:u{˜‹q‘•‰ДжБ]T3€˜ЊЃЂž’™˜ЁE]ДŽhЏЂˆnqhh’w@&"3#0+BBEA?8@5.@73Bw•‹ˆ„qŒ•˜—Ћжбt7%1—™‘Ѓ—Ђ‘•Є9Mx‚ЈЁЏЃ|}vF,3B<*2@CF?>,289G:MOx~e~wˆˆ’››ЋМ’‡ƒn%ЋЖЃЅˆŒxbxUqЉˆДйЯm~–r@%;7F.H@Єœˆ‡ƒ~…zn›Џ—ˆ—wrMSЄЂ›•‹‰nƒ‹‡И—˜Ѓ{{›x‡[E074@:?>A874(729:AL5Eƒrˆ’Єƒ{–——•Ї•PASOticЂž’•Š‘|~Œ…Ўкцаui{}ve#.:314;;82759$-2,?EQ,Ntba[ŠЉŽ…ŠŠ‰‹\wWUPjjSЂЅ˜‹Š’‚‡–ЉЂЈ›mcxpœ?(<4HLB8@@4A:@+rv‚aaŠ‹˜‘}pjj[Wc\@ЎЌ›‘}ˆ‘„‘œ™•˜z^jHW0$:AMGJHG?GEB5E>E?M11r{ew}z]z‡—•–ЉxThYdoM’•Š‚…}„ЉŠ‘‹ora;UQ+*MA?ŸЅ’zr{t’ŒœЎŸ›|kLWZ[eY4”œЄ‰„~„}‡‡ŽŽ‚nFFN3)0AeSOAA@GEJOVVH>)+`ЌЅP‹Šrx‡ЈЃЈЉ’„YCPIjiF[ЈЄЇЉo›‰Œž—ŽŒœ…T&,?4-JBJNF<>CZ\]UCI8;™–‚rz…Œ—„•ЁЌДЖ–v–”A#Y}Y‹ŽЈQ\Œœ˜—˜‡Œz”H1%14**8:QSHFM[SG@4Q;UЅ}ox}„|ЎйЃ”˜’–”}x‚‘LZZOY‡’œКŸUz™•ЉЖДp–zb132A;;0?%7LBIAHOJMLILHE:?A8uЋ˜ˆˆŒ”‘ƒ……‚Œ‘ЃƒvQ>VkpTae„„’˜Ђž™’œЇБЋЛƒP04.1:2@@:>AJJ8IJOA3(>UЗСЖ•‘—™‰ЗžŒ’–—dnI++)JABIHHACFI0JrЇЈ–—Ј–”‰ŸЈ˜–˜ЉЂ]^W[…]:t‰pz~{}–›ЃЃ‹}ЉЃ›uI+:4?750CIM<>*gЋŽ—˜˜Ї••ŸЌЁ›ЂЏИЁbb]aenk›w‡x‰ЖЋЇЗ‡АяТt:-;QG>?,<>?JFFEBIMHJQ0?ЅКvŽŸ›—œ—žЈЉЄ˜Ё”^[GWedQ]hpq}}zŽВНДЎЄŽ™ЁN+;<99.>EHHLQLNIJLWGG‚˜Јm•ЃœžŠ•Ї•‰~‘|eVdd]TSgAk‹pg‚КЫВВЊАЃАБH27<1BE@>HGIC[[OnOLebaЁ™‡œ•›—’”ˆ˜ЋЅž”™zottweYh70eo~{•xИДЏЃœ—a2SGMA>CSPJPE07^mAJqžЅЋœ™ŸŒvza‹ЃВе—Žv.2z‡|qgopi|x„Š„ЄБЊ’ƒ’`N7V\`BGFABYHOGHEA:GN+BoЅР˜™ЃЃ{–ЃЎДЄŠwŠam…{\avq{u…Š}|БьђЦЅqB.;G1HEGFEUPF:OGEB;?5>;?ACQHB8PT]k{•ЋЇг™ˆtu‚‡–‰{r‹ЁžНВ…‡]hmnei~WQ{k—…Ёž˜ЕмзhIFG28?:;@AMGCLEGC@cW4;~žœЄ}‰‘‡…~ƒŒ––’–|iZV~vpu|ƒ|{…{…~–ЎЮкЩŠ952E;<@G;C@HIFGBETQTPW‹Ё’Ž”„‚‹™ЁЋЊœwjkxwp`et~‚ƒ‚‰v‹’}ЗлеЦi--C<:EIHHLCGHCGMTUYSIhƒ™—ƒ‚‰›Є‘‰Ё˜ЂžЂЂ’PqhgtreO`„>ax’}j•…АЈЊ•N2:3G>INUJLLMB;@SW]HAN„tЂЗži~}‰’‡‹ЉЂ›Ѕˆw{bequ{•`NPoЉЇЋ—Уž’›ˆP32-597HLL€ЏPIIA@FPJ@2>^~jЫСŠv|މ–”œЄЪ‚MMb@SahiTHAQ0QКЛ™˜Ÿ”‚ЅxNB5095;;IAPHINGJHMN[PcТБ˜ИЂ{|‹‹”‰˜ЋЊЇ‘j8[kQo~N+FY}b~~ŒƒЅЊЉq.AO@2C>IPMQPSYSPECO9GiЧЂЂЁЕЖŸt[TŽЂ‘—’žz‰^0OjT„ˆ]>c…Yw{›ŠŽџn€z^[^UFInFBacJ.A 5Q1.H"BT9EQ}Q3-NMJ"19aYB%HAYw}…xi}Ž‹MYaa`UZcg[S^ZB<>Gk`g]O.Q7NL>5a\> Nh+QOVS0:JUn}„„Šzu~’d;YCLUWw[VSVSHG*:W95 &1PELO.Iu5 +YE``…~M,:ti~‡‚{x‚tVZTIVUZWim^]g[b,F (0;94HT!C^hhUYM;J:CL]NPAEqŠw…|xrevxbd`dhWaaho]]LgwxN WGPQHb{;I?xxV88273JO7.7 ,JJSoYŽ•ƒunhwx}‚dbQHN`n\gkibG 4LrJJ-I*jeTL2?-0V:zo72FQ>g?LOWjw‡‹}|u{~wwtST]anu}kT>n` B@€O 7TZ%(H17J1-AETZkGWwcYQ,3V‚phdihrq~cmznarv}{ЌŽUk|e(AFL^bQ@I,2#75.:O9>V2PYHZaMTtzkid`arw|ug[Y]]hqbuzM%:o:Z,AWYFPQ^VJa374OU &U(<+pV5E2B*@I[`qc[e`jdjjqaaZCWTebb^8C@*PaIL550*3FqQ`tourhmJ @ 17,H$F;%H9U?ZmSQOOYVFIJIESQQekwiYVB*;"9h0L%QO)>SahcL T”qgNM(&%>!>+<*;cS`nZOOaehjg[\\dZ]c^j^YagVpT4#>5xcO#YhIVPP\:о%@I?i`waOhdmh]PT`hj]SNPUWZYbikbZ3€ўMAL8)gc(,on,>JqtLG3iG9E-Mbjug[IL\aeLZLH,QQPGa\dxJ>NU`LNEIJV ^H?#[mejWQ2J9GPEUVba[MO[^Ye`TGNS+SIQIOIHC53<$7hW]G)2<-P`gve[@O%:3dS%Jh:"V2IPIS^YOPJQUVa`UJ3Pb(4jZu…V &Or[TYB)3`<HI1 #JE9TWZZTLB9GbZA<91-^w`P?Mu\ InkWB?adNIbd^a`S.G,TdHHIGN@@(<1LJLVAAi|TWLW^`%.$CO‰k‘VA^okeTF]iI\WL\F2<%AkZQ[^ST[UWJ3N5PBNe]wneTMLbm С&$@Z;WY4o! Ono`HLTbvY.)&M">U^WcQYMGNNQ1BECCHVQ`cL[OUZ`Т 9A#.0F)%"bUZ^:5eB@>P!Z\M!-VS#Fc^VTIJY:EGA)QA[b^]dbdmdХ p?h‡Ћh™РL5E?BP|phUYhiZFU`‡oTLN?-;7J]bUIBVPUQЯ Cr gЅ^@aiZ:PŒ`^g[ec^Z^T”S$8E>22+%*$ 0H48&%)$%)2&)+#&\}wPgL4IƒЎ›GL)$‚WPO?BL71&<+")-!%#!$%%,5-(2(.-)ah}’…}z;o›ˆac}]qPaEbu~mpn!" "%*$ "$5!(#..;..4h‚eTPS‚UHnwoOvnŠ|P8244,10-!(0-&hgd:T4cmce]cnœ–{nCTW~v3 #372"+134-")#"-&.-*#1*#$VceZUWwЋV—vNo{h3vGZqc„ДБhqnk—xƒqVoT@1"QN7@FAA29:S>.,!#&(&]d].F…~—’zIFa[bknQV…viЊo—‰ŽiSY`rq[h`nNbG#FacqI1*8EE983"52! (8M%LEQn|qxohY\j`W@xНˆ~tgrquhUNWTemvun]`hrjNC^ŠV`STg™„OZLZ@V•Ф•‡ƒz}{uTgnaO^h[JLJIWW>$ˆЁ„[jVr|oz•rO44€# %VUoh[brqb[[`?HBrЅˆ|tƒŽƒhrzq`d]]d>Z^oUETuœžzod„‰xw„ˆv’ˆˆ‚? ‚5e|Ob…S5tqi|vghoƒœnpnv‡ˆ{einnpk[h^\iqtjI9Hhptvhpzƒ‡‡В›TSS€‚AGo|p”p~wkxuokpGbŸЭ„d|„‡ˆvprZakuneYpzzummhmgcjxox{}•Ž„}Е‹N@:,"(#eToY[nejg~rkY?Su˜i…Œˆ{rcr^gN$+AumjZZYUxtvng`ikreZc’–Ї–dJ8*(*8WGmaomL–Žvg{wkdq{]amˆ…‘wiv„”urmOFGPekpgk~}v‚wjUe~u‘˜ŽgL;GHI?ЂœzAkiŽВЁ„u}vuzwi|vx}‚Šƒ~qqw}pbb[viU^Vehq|”‚‡}U™Ё|•Ј‚UJONCBCrŽEh„ˆtŽ|^qqƒrG}’}Šˆƒ~urzikoqd”Š]AUSScgˆpjp‘ВШŸЄ‰or…d[Q0B?CIrt^dqc[‡n`dLkJPCxmnqnˆ|LY`mkeuz|ou|zjm~uxUiagrgЌ‰wkk’A9.2B>@EЅЖСЄЈЉœŠ’А”•БЈˆjz˜‰‹‰‘••œОЄzz–Ž}h„‚ˆЏД—™”ŒžЗСМТММНЭУ„ŸБЂŸЁ›ЄЇЄžЊЁŒƒF;eЉАДmC[Єi…ЊŒ‡…˜ЅЎŽmЎz”Šzi›‚ˆ›ЋУУѕСНЖКйЯž‡™Ёœœ€СКЇЁœŒk}‡geЁ’Šqbmqt{—VP‰’Œ•ŒК}SkNxŸ˜ЅЁЪӘjJДДОРНМЛНЛЂ›ЁЂЂЃЁЈЊЅЅЇЂЁЃ|a‰rTEz„‡‡‰™jj›ЊАž˜‘‹—pUpk„‚g~ˆ‹Ѕ–ž}~МЯУНМЛЛМЖЇЎКЇЅЅЉВЋЈЋЊЗЊЄЏЕО”5eЉ”–‘•ЊМ‡БТŸ‚ށ‡z‘•}~~iUcnp•œŸЈУгССЛЗЕНСИЋДž›˜ЅАЋЋ€/ЏЉŒmEctžБd‰SYƒЇŸ›’—~Y…‡––КЊvp‘˜ƒЋ…‰–žЋЛШЦОТФСМИНОНКМ™”ЅЌВЛЖВ‘ƒЛЇdiЗФТЉ˜™—›œ›€•—’Ÿ›””žЁЃЅœnˆЉ][O|{~„wbxg˜ЈЅ‰Œch{Š–™žЇЧЉ~˜БŒv•ЖЇНБЎŸ—™˜ž›ŸЇЁœ—˜ž–™ЃОЎЋЂ›ЄБж(Fm…m}Јn~ЋЛЇЕУž`Sq‹БŸ•”~„ЕO|ŠrpaS›’—›™˜Š‡œЏ‘‡zƒЏОЄ˜›‘ВЌ745;LFOˆЉЊ}ЂЖCOœžЂЃЄžcj{\\vŒ~kOjЃЎ‘‡‰’•–ŒŒ‚ƒ…•”—ƒ^Z‘ЖТЅ•–—ŸЁ873C[kjNk‡hСЗбŸЇАЏЇœž—Љ’œ‘ˆ˜Q?ЇrcvЃ”˜•™™••’—Š–Œ„•ЌЈТЏЄ›’•žЊ723::(I[vƒ{’–‘ЗpZŒЌНЃž˜™ЁМœttpc[n—~d~ЄŸ›ž™˜”••Œ‚…ˆŠ’ŸЈЉЋŸЁ›ЁЄ+3,32-*(Nou^dzg^hmЃ›ЁЃ”|Ѕ‡q}‘„˜ЉЅpmЊŸz˜ЂЉЄ”Œ’˜Œ‡‡’œ•ЃЇЅЁЃЊЊЈœ"3-51 1C‘ir‹ƒ—hwЃЁ›|~‹v”—ЎД–‡СБŸ‡••™ЄЄЁ˜Бސ”‘ˆ‘ЃŒ–—™ЂЂЎЋЇЃ,74,. .7:H`oYw—ЄМД›‘К™}Ёwg:vбЇЃЃЁ•‘‘˜—ˆhx~Šz—›ЂЄЅЁžЂЄЅЉЇЇ($.&*!$&$&TFUMaЄабЩсЖvWMa—‹ЎЃŸœ••”‘’•—’ЧБ‘Ѕ‰ЁВ‘”ЃЅЃЃœŸЁЃŸ&$#)%*)%5C8OFU‹Ой›Шё‘9Zuˆ„‚ŒТАЈŸ˜ŸŸ˜žЅТБ’–™–”]‡z‘ЂЁœœœЂЃЂ"%(#(#("#*)*4?Nm<™рЃ›ЌŸWxžЮАЉЂЅŸЁŸ™ЊйŸj’’ЅЄŸЃЃžžŸЂЃЁ&#)1+%)%#+*d‘E7u|i—ЕaipžЊЅЂЁЃ››™ŸИИw‹‹—žЉЇЅЄЅЅЁ˜ЂЇЊЋ€Ф$$0(.C:3hO+:PЇБССЩЗЄ˜Ћva›ЃŸЇЇЅЗЁ•’…˜МБЉЊЋЊЋЎЊЈЈЉЈ)"&#-.(*2!<;<&#E4&.0?g}ЕФКЗВФК‹”Ÿž›ЄЁЄŸ–ЄžдгРВЖАЉДИНИЗЅ+!"!")-.7550,"0-;-382.27.-34AIv—ЉБЪУЎЖЊЅЅЌ‰Ѕ‚q”Ќ˜ВлаШМААЌНТУУСС5)%#1--€б28.>.,0,32,77471>.@ToNk‹|–Џ–—СЌu’‚uˆЉЦхюадНАЉЎЕЛКДЎБ,4"#"*31(%,++4579)1.798HQ305)@HCnŸЦеЇ…–Œzt‡—ШдУткАЋЊЖКИЕАЗc\@70)(++#"&3:9<8))$%**(899"09IO`…БйлЎТМВРЎЄЇБИrZEMJ?Me<7.+"1(#!$,,..49,097254:13:989;@A@@NbuMIWA2..1:9<335>><5<55B::<(;UYSS0IMc‘ЎИБ˜ЛЧ~bVe]>821\\1.5@3*.!!1903:30,34;?978;<@<757<:;8;>CCH@H:HGECt˜ЏЏЕЭЎ’‰›nB%LW9.:>CBB^!"*&%.80)-01817385EEFA:;:>AAB;>>;>GCGMOMАЇЇ‡ЃдьпКЄzNJ@FFBB@?GB:8,35<77ї-+0%7439??€Ч>877AIEMEH>CEAHES[PŸŸЂЁЂЁЇЖ›ЖШЏЉЉœW+A@??945<4(4>8278:<359;79-98>@CJFICEBMEB?@<ЮОЅœœ”ЕŸ’ЉЗКИнаŽg~UQt<"><252<89537:4>:>82:?ECGJJHGEAA;:ЄЄ›˜ŠЁЁДЉБхЪŸž˜—ЌРЖb`SV^>-.:CGB:;945>?>:*:9<7F`OG@@EE”FHGLFFB>9ЅЦТ|Џ‘v‹Ъэуž”ƒrxuЯ›ˆƒ\UdFLALC@<<><8A952)08.+92889@EBBIIC?B<@54*ЗЛЪыЪЪР‚КхнЫЃЕЩЊНŸЄ‹ЈЗКŽŠC25-$88>??€;AB7::77?337@EH@FHMJELGC:2+ЕЧЖЇ”˜Ч–‹ДЖЕЁЗОЪИˆЉМЩЖ›КОЉmQICC:8BFTOLGB@CJ@531A@@GMGFOTPPH@757ЄЅžŸЂЈЂЕФЉКˆ–аЂo˜ЫЖИ‡t”ЧкТСЁhEANcUMSLLEBGH><5@>@<ЊЅЃЇЈЃЉБЊЅЏƒt…izžАЗЉ™‘ЌЕЮгОЗРЪŽmFWpUCHHFAEICCJPQLB:;24975>CA9"$ААЅЉ„ŠЊŒАЂ…‹•ЄŒЏЋЃЁЃЄКстШЈv’œФЃqEG3BNWMOMLJLMTI@;:49<;37;;8*!ЉЉЊž™œОбђШcžщЦЇЛЭЅzН‡”УДЧчѓРЗДВБмЧсЧЖ—ž~\LCibWVW[PBENeJ;>:9;<5+ЉЅžx˜еЧдтט–ЉЋЊАИœ—бТСцДЧбдЏЅАЕИЗЕАЏБЅЈe}‹ž•dTSWTLFQWICA:;;50)%АЁœ”ЕѓчЫайЄžžŸœ’ЕэгЫЩУФЦШЄЁОЅЈЏЌДЉДЖЕzЄЁ‡™еюЦИ•vom]NGA:CM;%+,-0”oŸŽ”ЌТРССЛŸЊЉŸ„ТћаЪШЪУТКДЈžЈЉБЗИАЏЋААвЌ‹АЧАЉЃ›БмК}qoxWUaJ.1.(Н‘ЉЦМАЖДМЭЩН—ЄžуўкЮЩЪЪ€&ЫКЁЊЋЎЏЉЋЎЋЇЄЊЉЅ‡uЩчЪЋААНМДМЮЈpVO[@#!ŸeLНЋЉЊВЛЛЂЅЂ‡‚ОьаЧЦЦЮгЮМЛКЖЛБЋЉЃЎЊЗВВЁТюяРЖМНФУОЭаЗЪФФЌL*Щ‡ЊШЁЏЩœДЗЖаФЛВДЪхЕАИСббЦРКЖБДКЛЌЇЈЕНРЗЏ‘›ЛУЛРОКМРЦУУЦТѕл‚b]UEЃРЫМмЫЧУНЛМЛТаД–ЁуўЩМЫЯгЯШТРБžЉЊЎЏЌБЗНРНЖВВБВИНИЛМТЧеЫЫРѓМiMOA3mvБŸИИВДЛИФЦЦЎЎ„‘КмКбгаЭШНТРСЂŒmiwКЏЋВВДžШРЛМКЗБЖИЛНЄейюжƒbC7<59Ѕ–ИЖТЛžпкЛНМРЖЖЗСЇЋТУЭЫЭУОМСмСЗБ–˜”ЁЇАЖИЖгаЮЧФЗ—ВбЫЫЛзцхб‚ZHPQH?ючТŒВЪрўыбОНФРЕЗСЛЦФЩбггЫФШЧФЦЎЏЈФЕЄЈЋЌЛУЩЮеЭгЩЌсхЯжгЯрэОh^VOLJJМд‘ВзкМрЦСЊКТМИˆЪсЯЭЭбдЫФТОНЛЕЖАЖкжЉ—ЂЂЂЏйШЫЛРсћ§чщЮЏЗЪ‰m`9HHCBЛДБЅУИЎЭОЁАœЗ˜—ˆЫЛЛВДкЩЁžТРНОЛНЛМОСТБЄТФС™ЖКИОБкяеКФЋЉЮЧLLB5IIAA€Жxƒ‘pt{mTYvVd||^T\;FaVOVO\k\bi‰iJ8W[W0>JQEtqZ[]TjŠ‹ŠŒ‹ƒЉUhwkuhhq|jdtqZMPO 8}x};.m`1>kGZdS`zqT:ZzN:WPB)dWGM\g‘‘›ƒ‹АŸwPgdgmpmqmno\d7GS@G:b`k{eЁЉ—’„…Œ‘›|wj`jq…z~qY5:EcYbGZ%&HqwccOeL&MO`]zGHWaOwM`^exŒ’ž•™˜˜‹–‰‡jdrr~‹‰{iO‰n( C[2TgkJ>VHPSVMOU\g‚\ 29eƒh`YACb•™‹{ƒ‰‰Тq}•„q‚Š‰ЗЇe{Ši0ETNYktpbQV@#0ML]3<2FFAN[„‰tƒrj[e&)Qog5‚›’v^gacprvhniP[[qii\kjhpo]:Y|JA+SUB05(G+G^qqEN\14>SjdnpŒpH`rbAe‹~‰xu^`jonmpn{khYj^YboŒƒwtpn}Є1NhUVSv5Nx‡iˆ™i(Cik^heZ]xY,PT;F:IeZZcmemmaSMbx`NMMPSwpaO]‡r53,70b}„e]LowV(Qhjtxne@7E0C]N7#>btWSP\\eVSGVSQad\50\t’picmmn,-!?OF)LG;b}ЂaQq}~tg`gzVmiPdTMI0Atcamnmjdhb[YVOWZZ}wzpkW[i‚&%1-FZkPdjS‚E2m‡ƒcnbhqˆnBGL3*:iJ?Lvjnnmg^]]О\^WLL``[wuwji`itp35* 1S^H>GP%!:3nghm[MxSINnFpud;@ji@`p{ji\[c\WW€ POiUprmpqux|j "*( +„OU^Uo2OxqhIMICktxdN„rkTjZacg…paFUHTV[VFZxUd\Y^gq|~r*((-1 *,+CJ(Qoq–zaNŒoF\H@C <–rm^nm]\`gNPi9E>LBBbkqnpeoiqxuqu) J897C}ЅЌЃЖ‰M$-`Mjupmeh^dg[ed]‘}PmZUm{bQYtjmdphjxw)&",!95>0O›ЛjЁЭ]5HZEUYƒxoipxicbq”ˆacaaH+MLdnqc`njmht "&-9.Uƒ#tЌmPv~p"Pc—‚vqu{ujokdЄn3V^cjgrnmmkvbcevgn"&$  %až7k>N7a…-<1gwrjmrnumea”‘>\acZkrrtiidpi[u}{# * ,#7WP(,G]…Ž‘›‰vo{?2kw\gr~w}hciTiˆwuqnrjktzrqo !* )"!!C>594+<>"H0#4$ $*1I0.+YUwˆknW˜Šphv„ŽŠ…‚ƒF &;a4?3()1"(+2%#")&&541(:)883:2;(+(#0A317Lb…œ}}…Ž…ƒ‡‚|{{0&234QoZF!.!$-"#0)88"212:,2?@3.2,(4@+,-.-BLYhЏИŒ”~‘{wwŽJ9.QL0P`4#!€Ї")&0:-I*(;B3:<,%)2;1B;;83J\uN>LB43GrƒŒ–[Ё‹rgbTdeJF>05(#!#.$3)?BA9&*5+9.@#5><;7-?&#.7!1TWUS7FB`~q|ƒ\ŠM4#PB3&*0[V2$B*--),.%B@B,..AF334<8G5-,.787:@@GCI11G>AE-a{„‚›ƒdYpb5EP9*084AIa(#-.;8>>*.1;A:5%?5>??>>AE8@G?2:@>;;MWLQQz`ahYQqœЗЅŽxkF;:<::A7BC?A8*-@9443+(*,0-14@F@0C7;(30?<8089E;BILNFHAAHFF?:‹‚ra^i~gWw…ƒЎ™W2]2E\;$*>;?05I97.5;98F@A41-9+7IGAE?ELMELELCSCJE>eoYZ]di„pzЉŸhh^[w‡NHEJ[>41;@OP<,,2-5?-71)<58I\QIB;@AECFBIJM?H:Ak‡”gL|T:QНЋd\CCEC˜m[hGVZHNFNL1:9>?E<;2+0.+0514E8FEHHIINLLCG5r’kcic]‚‡k„‡zcQi}’ƒc…‹ŠbULAJ0A>JLTI>AI@:795?ACMLLPYL`PMNLCB@nednnijmu„Ÿu‚SbЄqJa’‚‘O@dœЎŽ–Œ[ECJVEFHJH>C>GE3?8BP@FCCJMMGIPGOLL}emtutuwrrmTLdH?<>3>8?OFOTTNL1>>:A4?8HFG,#xvp`]]bTtS^wpJU[oOvwhuooЕЈ‘Pcd’ƒN31*550wddb‚НДƒЂnYWnjdg‚Ќ–—ˆƒž˜woŠvwkrrq|‚PhjWbЂД’oYP`PNLJ@MOB,<;74[AibW{‚‹„hh}jmMˆЯ˜‘…ŽŠ…}haoq{zˆ…puq„ˆrV‡Єwmik~БЅgka|VJaW1?>B‡]zŒ|tƒ‰‚‡`p]\iИжЅ•—’˜˜Žmz‚nox{qnbgjxh`B–З–q~wŠ‘Џ…cCQSI-4-a9)eƒ{krˆ||guhHTLУ„›ЁЄ’ˆƒŠ{}qotYrv‚v\mИЗ}‚•Ї™ЄŸЂ’U00œHrkx˜bH„z‰„‚}žБ}wˆ’ЁЅ’‚ƒƒ~woq~„‡rT`ޒއ‰‡…Ž‘˜ž›ЪЎkh^d[,[Š™ƒЇ‹”Šˆ‚u–…gqЕц•„™ЁЄŸ‹Žvq{…zut~Œ‹Šz~}zr„‰„Ž–ЊЂž•ЪЄbSQM<29@„g|wh„~t…˜ttUbƒЋ‚—Ё›‘Œ~Žzv[FCP‚„vqqtb–‘‡}|t‡ŽЋБОЇtaP>HBMkh~x‡bЉŸƒz…Š…zƒŒmxˆ•ЁЃŸ‰Š‹Љ’{]]`gq|‡…ƒžЁ–›’…n|œ—˜‹ЈДКЁ}\O[\]YУЖŠT{ЊШАŸ‚މz„Š‹•–Ž’ŸЁ••‡——‹t{q‰|ukot‚—Ѕ›™Ѕ›uЕЖ–ЊЉЂБТ™kcdZ\O[‚ŸQ‚œЇ‰ЊˆŒt‡Š„SŠЇ™––Ѕ›–’‘Œzx~wЊœoVkrhnwœ˜‹ƒŽВзцЛС™‚ŒЂuu`CPUQ\…}ur‡|r˜‡bvg}^^Q’„}Ї‰c^{‡Š}‰Œ‡z’˜Œxu”•Žbxz„~ЇШЇ˜~}ЂЅQPLLUVUSџЏQW[a]1QFWbcv}U!1.7-( #>.LoY[G0J \rg)‡- @(@—~SPI?L0S`,;LmBF)?bW:1TjV^\VSej>YZqrxxq7!!45)J@M"1zcdQgc|tˆŒ(7# "o@Q”‚<$9AI8j]P>#-Z]bhGQOSbƒ‡~O8WFY&1aoQWhq?\meewz„{a733+$ "(2 wЗj]nJ)B]SOLBea5QUIF‰?Eiixjm~•-J`p\`Ž~}OB2..€m!%&Yœ‹p~Y(Odtkj`G<% 47mW:)I@BSu]peam{|,44ZmwЂ›`!!$".&$%"$aЇnPueTc[ePPI+Gg\ma`:Ft~k‡rYr[TQ[U]d‚`VVƒ„žžY$"..:.35%&9d›bQUPYcdVpd4&Z]ˆ`^h-&G``SII)pWTTZebSEk{u]VVahP;Zb^g‰…N<  % "›—^i|uinqc~ngUE.TkNM\%5|}i‘ž‰{|eOLOF[Omov\[P-!  %›™EU`d`ecm^]~d{Y[pe;`7?qŒrciaP:JQVOL•`na^0%I*;4"050\}…n9PaeZ#`OWV?cukOP)?OLq^u{zEY`UVA(G›ZopH+&$# 4mpogVUUFNVm‘P1–Ёe:eSMBI[xp{xvdYQ@^UZ\e^8tW3!&10J#$1cwV^ZO^m{Z”ZОu%5J44…cdnqrrinWdehaOIUS\xH" 2,"Œw‚neQ3VrHG&Vx`›’ed1GYtCtQ}Кzp|v~YJaZ\^dgZUe3+* !#"-+d~]\`VapiG>[]LS[aazML1\B-]eZJQ]ZWSBOU\‹…žn?.,& %&\„}ceP`gZO3SiYQ[?mYˆadˆaY^\Ya[OŠZZ\]Y@QgO‚”g3,%! (" :QН…t|OAP]jiLYWbVOLb…wtSYIJH`b]`ZeWJcd`jbrp\a^H>)!""&1%. &[ЌmVwcbPO0GMMVQQJP>9drb1THC[P`WJ`beY[jrtw~^F(&,&!7$-jЌo$+r\((#,PI3q•vHhhPk{e9I`jWgakvЇhOU]Sjuh^qL+3!&E#70v„nL-BMO*EYG!M‡–‚c(YjumeW3\„vP7HEYNZUag`r<3M   "+A(mg‰TTVUM[PaL\3‹zP[?gmdjtH>0:`kQGTYYSLVQ\YT{SA7A# !& ,**&,I?‡rkigSO4:4H@:P‡e[`P@@PSYChhv]Pa\d]VBE^qO^ŽqN1$b]Z[mŒ—gL$% +80,7‰–}po`SHG3EILYjN\ppiST\gYE;bnizEI,?u‚…jd|”[ 50""(#0*1.!&3:qzYT5:UdaOV[PkuZ,OJuTJE[u[@Le^\FMBvo~Œ„vv€IJ#&%"-)*"%F17b{bY4WPUGY[\gkd"(&Wˆg+]Gxbv‚4"QcnrqO?>PiQ;O|‰‡„n7:3-"$!%<<2%bˆ‹J[xFI`bj„gˆqeN&bhW?1$HaqPVm‹ZkA$^x‹œV0N2588.%)38;,!3Fœ—ŽpFF?(PwŠrqk~W]Wd\0:3Pavi^jmjYHY]]|i…aJFSF@?;83#%0->:1$#‰Њ‹’™{cuik}vxˆ‡vŒemOWp;;*Ih]`[a]QMdjkmrpa20:A511{YG1* `ШЈu|z[<{g`gx|Œ{{‚‡~xUodaSEMPMTgU\`jn]uw[b4A&%21W9**(Sua"$% u•”ŠzdP^TVguC9r‰vYrbohIGQ(,AL-4!5)( .H9)!EБЂ{p]<;5UPSEPe`ozwoSaUUjhamF`ƒˆk2Zc{nm  $,AOFCE*L{bZmQIGNH,YT`U  .50,):2už•zMhSSOZ}tIc|pueenVHbmnmkooge\akQCCUV`od"$"# $!%JZЁŸЄu[uAL$1JuUZkrwkcd^UUZQW[ebpd]bcm{…oNMI() "43"C\e‰„oHBSeehreVq„e2Anje\OHbbeeQ;W7 @innd2$$ 2P. #BCTb…bn”n}htv}^ct˜W%CvkzGLSQC@N?ScqJ]aYcB?&$+#  # EB7*0!::3*4$%4MLvЅP[ŠˆƒgH…zePbjq`ЄЂCA5]Z`o…~to;I%)*$?5($&WA$."LVG—\jz~WdgVcUQžМ•bELzu`][;3 ! #)"$"$+B?8B3:2(-MA881FSP]MIdŠpuq&\jdwzm@  -&1+!!%7&%;eEIB5-5#0 "0P1@\vƒkqwB#$%# "€й%!&,-(-(! %VG30))!!)"22;+7573CU<4IQ5*%)(,,)-(*%&#)#(3B355830,$"&)3<4<0!$0,2>;NE>8>8<&((*#!#"*1*-8FF<378,,)(",%%83-+13:0&11H<:%$%+(,,"&""%)03((5@C<@*#* """$%"&,"#7A9* "!$ " !(+%+.&+$*8@A+0*% ! "!955.*$(&*$&4)4%  &$014$22!+-.$+310#,#2..94;;*"*+*"-3-*$)Bd) "&*"%!,3+$"$14?;.4((*.AHL?(,34.94#)-:25,)2&%+:)(!&*!(#.-)4,,29:+1.#*..432A:4@>,#*%"*207 92;<3P0:793.*2%!CC>GI?$,;CG8:%!-(--$#()@CAF>-4-"! $+,7*.1%-29?H@2YIB>;?:FMC<]]OB:;44-1>?8IP2tn‚M"+4("897>8#),314$)(4:7&+((+1"((347""€ [žЄЇАЉxL^މ…oŸЉЉАŒ]9I>;B9::42-37AYH`ЄЄЇ‘˜Šh‚ЁЃœЈЖЏ››ЅЂРЧ~O”žЇЎЧЁЇЂˆŽИЄ‘ƒj|ЈУДp4:2@>>@4%5T?8)aдФЃЁŠz‚ЄБƒ„ŸЗЃ™tБž‰e|W`•ЏЃЗЋЇЃžЋЦШЊ‰—ЁБЛССЂJ+;?<5219IF;3^U[;LŸеЖŸЂЂЊМКаг‚{xrk^PДŸдЩ‹ˆŽ~АЅ˜—ˆŸ›—Ђ—ЅСЩФ‹N0;F<.42?<97TFN%TЏР‡xjzЃЃЏБ’™‰ŽЄЦЮР”„›ec‘žBp…ЂЎ––ЋЖ…]ИЌБЎЕФК‚I7AFE798;5<@E@AU*ˆхВ™Џ‘in”ЁžŸ—mkrŠДгЉ…•ŽЦ‡[…ЎЛДВЎЩсФ‰ЋАЉЉЭРЗiMGC5oгЭЖЦŸ‡ДТЇЈЇrmc‚Вž——tŽЖЉЎЈЌДФУ‰nŠ—БАзп74-?@?CC?>:<9<8B:?заБ›ИЇ˜ЂЇŸ›…ŒЈЅЊЈЋŒ‰ЏМЉЭДЃЖЌŸŸ™ЈЊЗРЃ––НОееv25?CCIB955>;8:>A9FzалЁœ›ŸЄЄЎЎ‡zАШЅ™Ј}kN^uЎИДбОЅЄЋДЏЏЉŸЂ—ДЭСrJ0M9#%>H%*:>28:?)0›ѓх™t–™—žœ„•Ž3AŒВВЅœŒ—œИВЃЖВЌВЏАЏЈЎЇЇЉАЪйЅtC,"$$&-.#:75-9<2"’шטЂ‚‘ЋЊ’•ƒA1|КЌЇЃŸЅЇœc[‰ДЦЦЃЄЇЋЇЄЇŸЃЃЇЦСТ…O&(&*00)-0,")4.+AбрЈЌСЎЎЏВЕЦРЕЁƒu’ЇŸ•ЂkvЗФЖЯнжШЩœ›œŸЃ—›ЋЏАРЇЅiN>-!3.033*,0*19G:;,19B72(5-5)!.ЛЮБr™ŸЖžižœЂЁ„ЈКА™mi’t’ИЄЖИР•››—–—zŽеЯЇЎžu*@:25+&.:0)&$*:I?9›ЗЗЄЂЁЃž”m–МЮ•}дэЋxЉ‰…„”ЇТЖНВЛжЌЂœŸŸ™ЂЋЊ‰БЇe(5;-+341CIa72).CCYЁФœЇЁœžЛЖbqЈкРžдњЛek‹‰rtФЕЏЛЗВОЎЇЄЃЃЁЁ™•—ЂВu572(#-70@@;BAEB>EВФЮЏЈЅЃМ‚`…wЃРЏлйЗЉožЛ‘ИžФїОЕСЗБЉŸ›ЁžЃЃŸœ–P%758-$()4275;??N#C”ОБЉЇЂŸОМ–‹ВЃ’ŸЏЛ‘œœЃБ‰ДЪЏИЅ}ЉЊЄЇЁЂЂЅЄ•ЏЎgS%B:)-.-;@CBB7?n51ВБЄЈЋЊЏЄzV]g{ЇЉЂ–™•‘cY„ЊЊЇЯБЈИxhЄЇЂЃ—ААКЛœ™vAH%73.058OIHMF9J>PАКЇЅЃЄЂЅ{}‹’МЁЎЊЈ›Ѕœjž‡›Є„œЏНЄЁžЋЋЁŠЌУМРЄ”V`YBI;4:9?A@FJN@?JO~ШеЏЈЂЄЪРЎŠ—ž™›ЃЂЉТŸhŽˆ–~ЂЊЅ•ЅЇЅЃœ˜•ŸЋТФйЇ[@@7>;752.3<;G;787<754(-54;G@?B;A>5Mc>7ЇИЭž”œЂЈŸЃžЇЂ„йШœЈ‰ЂЌАЛТ™–~ЌОœ˜˜Їž™”œЂЅЉИ^SV4583234@CG:FNa0SСЛЋЇŸ™›”Ž™™ž‡гЊЄЕЂЁ™ЂЊuŽ˜ЈœŸЄСЃЊŸЇŸ›œЄЉБ}Z<.+37<9177?GBHNWI*{СЯЏЉЃŸМ’Š”Ј›ЉЊДЊАЈЂžЃЉЅŽ‰ЈЖ˜АпУ—}uЃЂŸЂЃЦеŒS77 (-05;-5@4FOSTW8-ДцЫДЕЂЅ‚–’™ЈЇАЏВВЛЄžЉЈЊ‚T‚ЅЕЖЦ—Œ…ƒЏРРЊœАЦb+IC799841;EGIOQO;IOДЧЉ’ЄЂЂЁЃЂЇЎБВЇЌŸ–РЇ–™ЁСЉ‰”ИБЉ‘ˆŠЛЏРФЧСММЎY8@<359<9<0CHFEHLeJI‚УМŸ}—ЇžŸЉЎЋКАЃЃ–˜tСЋЄ›ŸЈЌЎЇŸУМPОЦФЫЏЎ‚pN3521;B@>>:›чуžiŸЈЅЈЅЏАЋgТЯОТžŽpŸВЉ‘‰Ўž˜ЋЌЕЇ[GСШЦУЎ—]N:H@-15><@>@FB@>?I,2ЁаЫЦЧœЋŽ~v…Їž–ƒЖЫнНЦ›‹›АЉЗаž‚OpЈКЗ‰‚cРНатгkkIFPF;9;:7;@FAF?LG?4aеФ{ŒСe|}АдЏŠЅЖДОЩ~w˜ЎЛЮОД’ƒŠЂК›‚”WМРЧШ›.HH5<<59;?GJPIF<>P1-Žга•ЎОŽ–зЌЇУЫЌЯКЌžАЁЛ˜i‰w–ВƘœЛЫžВrЃСЮлО~0B[A:BEEA9?CHIF@?4F:`руЯТдЛ‘˜…›ТНТРВФŸЅЅЋЅz‹›ЋЫЎАВЕВЈ–››ЊВЉМ‘WZ`HEHGFE?;CJFIB>>80@ВђзЮдЦЃМББШСУЯЫЦЛеВЕ—ЄД„‡vЕЁ›ŸЉЉЈЇЃААИВФ}@,27AJOG5O„iVEQ<*,C…јёСУТœ‚РЋЎИСЩЧШТРЦбФУŸЖЋЁž˜œЂЉЃЃЋЈДДЄ‰‡@I<)(7>dE?>EgˆiBQEB,EктдТЩВЉЄЇЌЗДнЩ„{ОТНАБЌЌЇ˜˜mj˜”ЃŸЊЌЂЈКSQN;34I$-9>>2MTA4#8712}РЅЋЄžžЅ–ŒŒ˜СсЭЛЋЎЛЦЖВБДВИЕЌЏЗСТНАЈj›œ‰.*"!*OS:L9>9B+51hглЖШЦЇ—ЁЄЋЌЩРтйКЂЉЄИйЭДЗДЖЎВЌЗЗИЧЗНЪ‘œ™ЁŸ.!&*$(2&*78?A@ELE7ЋцмЌ…ЌЁЄЁУКЈКЛКБЋД‡ЈБЉАЖЖЕИАЈЏЌЅœ›–•ŸЗЌ*23.+)-%*%+4,*431AaƒсхтН˜Д–—tВЃЈАИЛАЊЊЅœŸœЇЋЗДЎЁЈЈЗСбЈŒ…Šb+3,"E30;;0%P…ЃИЭдЎˆ”ЇЈЯКЛЋЎБУЂ}‘ЛБЌЁ•›ŸЉАЋЃŽЄ™`ŒЖЌДЅwŽ++(%>29>`H"2[ZvŒЗ™ЎЯЊЗЏИОЗВЋИйq‘ЧКО…žŸ—žЇ‚™œРЂЈЊБˆ’-,73%&051.QSI>;IAH]PGHM[YTo‹‘ФхЁЮжЩЊ’ЯБЅЂЃЌНЌщцŒ{atЄЌЈЇШШИТFO+&".252B(,N8GA@JGYN;5;F\{`cˆ–ЕЅЂЊ”!("!($&),)$03()08;;:EGMPOLMNN–CFIBCEHLTYQNE<<@A>;;3BBJ@BAHHJOIGCJMQQEFC!%),(!-58>49@CEA?8ABCGJJ€ДG?A?A198??З@HHIHIHA5>?GG??>BJFACEHJFH?98TB#7?9+,307@@GBFFHGC:4AB??9:7CG??GA99Ш;7<9A@:@BBAABFE98>?F>59>@@FEAA>72,158:;?@>:9;9@>>ђ;<941+:0::EEFEE€ЫIHLOGAB@BB`FEIJG@EIIFIF%&:BGACJBB@?BLJNPNMMHBA<34220(239>ECCEB@?ECBGOMJHGIuEGB?CHPVSNeh]bUYWPFHNQMGJJTNOVVTOIGH99::5.455?BEAJLHLYkLЇЕВxFCHJ?13OVUQOQLHFLC@49@B;>;:9A@GLFABBFGC>IJJG5.3€ЉmpnmoI-OcV5jqu‹oMT@JBCB>;-(0ABQGg„nmcY[2P^aoet{nbaihkP%ahptxowZO„j]ZH7Mo‹‚M;>.B7BG7@gL:+]Бn`kTUIcuIH]„\c:OeZ;Q$*b{m”wvopz”{[qq„ƒ‹ŽˆF5;@<85GL\MC.cbd>NЅ}omtoŒ…žSEG54,&I^cЉœ\SQT]O~neZQkhY[rjz›Ѓœ|L8FF?@8EGE;7 [ET$L–•kPMGFiqxrZbabz‹žŒ]Gm0*dj>Lm~bd{Nh‚u{‡‰•”wJ?OIGCC@ILCC19LT*‡Ч}ezY5-OLeYIQV3Wjƒr…~tˆ›—J>GnzƒЗАq::@AJPYIMNJGH>AA9:xЖЁƒhŠtnn€‹ojZUTQukouPYn˜p…wVeext~–rgg•–ЎЎj2:MCNNHУНn~•ƒ||t–zhQFmvj`r?8‰•ЃЎЂ”’rpbhcrd|„‰vw\NH0::94>0@+1-0"21;IЋКQapm{v{tnmzŠex}u`}L5NzЁ–ƒ~~pe``dboYЄŽz‚omJBoLHGP;AIE9*+53%!1q’›ƒJ[n|g.jjtnU|…|WZA.Ud2,9BL>82,4U>:„ˆxkjeab;ix–^IЊДwI{`[Jcpˆ‡’ЇЂzeYhnqjnzpTˆuA$,931*5PGLgA+H17;IxhqejqŠ3@mЈhŸЮ‡41-,7CIIEB7@94AЁŽ—z~gYoO.QBmkАЉ„u@Zm‚W\•ж‡ŒŒ„obhqtmtuqap<FB3+3*9E1378)7V&;‚‘{ukik„ZQUTQxw^h{ƒccu[Z{SЂu~pIuq{qotquj‡‡^Y5J?9-#5CGNE4>Ix85˜xugvzjFI411IkohTcS^,(HkpcŽwnA5epvma…|”˜tjaFN.@73:P>AŽrhe\jmM@N[{hvridgm@n[WkTpq‡kiinukj\S‚›™xkN]kBW5B>A9JPPNN98GJn’Їonmp–‘}VPch`Znoqƒc8dPYONvrkdPghkmbWaqzœ•Д…VJE8;<5(-57-II9E2>uЂ”wjjzppCSixkgiYxu—|w˜pgmztmce—ogookJbqa–ŸnJF<8E0>2549;>BJE;952:pУgtmejJ``hkhhjaTL{}|LgS\jkpmh|t2oenw„„‡œx`CCIF9:7-3>˜”^C\ccYSi\5bŸЏ˜xIhx‡„|mV%%ocAaZh]ghuxw„’WJj- !-)02;1?B>2QZ@3~ƒœk]jkck^ugpHЄŠchVv‚vƒ‡dYMIvƒgbbime`hnntmmeS`<$8B5.0GMB<<;A>CEPTOQH?LMАoaHi`xqahpn}‡pYh\Œk``xŠnO\xkYZS„‚ŒЁŒ–d5B@HGL?F;FHMPGEO]IJzŽ~pThab^eo{u~wSJinV\UAe‡vi^iqtwwh‹Š›žž{…qvP2B>ABHIH>FLA;?5G::}ВБi;axibp|}nk;\Œ„Ž^IA]|uUT|raruq*–——˜|^TEPEE@5F2)œ—‹ŽYnVMCUppcOЉ‚]SStuœaJ&?n~ƒPL,ŠŸЈАЋxnUL`OE9058EME:EAG@MЄI^‰C0?MQrzVrWЁ‰LIa}‡„zbMVo‚aJ`%Œ™œ™}4ST0BBIFC8@LVWV<.:M%"jЄ™d~Š[bЂv{„œxЂ„uimxve4@JA[}~chЁj{JAmŽЄЗ’q>CdVW[WH:@ABWSE<:0G7MЏЊ•ŸŒLW]Im”˜’‚whnjrkGV\txŽzt}}{v\aqmŒ~•zaciWVSTO:3??€ъNOJ?:127ТЉЌƒm„zt™Ž—Ÿ–‡~}bpƒHZBUƒpahqpb`gxz‡ˆЇ}B45)EOWPIqкЛˆ‹gN•wpz‹’Ÿ•’•—ž’o‡ttejbedgtukuxr„‡r|MNF3GINuTJBOk–}?LAL$.~БЗЌŠŠwhpnk‚Ї–NPˆ•Žg‡ƒvg\a;9^\`rpvˆmqŠSIP@:@S<&B?5?&PaQE%*:,[ФУƒpQW]dii`cz}‚ˆŽarkwurkYu‘—|Jjr‹ƒH|1% @*-;GA8?Vh^ZaF"7(#iŒvm`>c`eiIMzЛ›Ѕ‚”‡rxe|bmeŒ’•]xoN>’#.07-7<1SUQ^VYBB8$3hŒwvu^iwk[]Uc‹Џ‹‡mŠ’gz„t{„}c‡„ŒquBmiPY08$%&:2-,YUEPEAL327)SЅЇƒq^iiwz—…ЗЎ„xmpЇ”|z‚|vu„~~‹}zŒ[nZjq<$*&(4.:3,!**ABLIE@TF.‚ЎЌ~Yejgiˆ…Tqˆ…„zeUj{}‚ˆ‰ƒ…‚quze]cc€p‚z;85A7;*?#-2-.<<><+ ,"(42<9I;#)Wp{‹œЂ~M]^qn›{ƒ|t‡ŸP\„ztmcnt|nzrSnN4V{xrH`&%> 1&$3:81NzT88PHer˜tžv‡w„‡|vŒЎn@VŒ‡VjpucdiGgjh‚bkmuwT\>>GB3(-?C8&#YaMG5?;;YSL9@A+4C\]ŠМcqœ—|d‚vem‚„vНЕPH3EmpgzŽ‹„‰Lb4-%$+17C0;F":S:Q8<$;EHI4jO9.*(<]n0ZЏЊtwŠˆhvtcqegРд–Љzb`Š…tnj]V#"+)%2)&0((0$)7?88.15;HFIVFUQFE;*A@2@OeUHSF[rhmiTqŽ•‡H9vr{„‡rS*,5,&58+0*"-49>0@ECE:BA?NHSIa{b\QE:MQM?;3;>*+7?295Q^FUo}–~~|^+05?0.&9*109>*-393?7@?@44C9IkaLJ?C>%?A>BJEJTTJLG9S]aMB\b^:(C854<<€~51++741,74(2239:C;?:&>INIF?CJMML:>7>@CGIAQSTLGGNNLQZdUOOTOF@3?2>+,-$,)1&B?EF2*HFLB@NQFPOFOF@EC>A*&:?;@CC<372-)(%$(,32?87*@HGJ<<;HNOMOPLHA5F>:->4?9;,50CC:@<<>GPII84#++%1<5348"&(4%3#@G845<;<0GB:<@NLNLBA;.3?149?F?CJHTNFM:FF>?#!)2+:,343.+-)1;;B:75;11(AHGENLOYOHNFIG5E;5EI8423[{<+-3:0>944BA4@C9C9NMIJMO@CFHJJTVO5F>CHJGM>@FMJOPMCEFC;JJ2E0HC<&839HCA@HC;FPMH@E;A9?8>;@FJTNOJLCB2A73JC542<>59B2&+MG908;BBAA9<@?NE@>A;??IHH?JCJ?F@(.-(98>8ABFAA8MH9A<28<7ZJYTLOGI?JA7:?<:,F<@5;;FF>I@FBC?B<7;FB294+&%&8EGFAHELHNHEFHI:9`S^T^NP:LU]QU)3<;EFCEBE;?:GEOUSQPFEC874)($,*87FBB:HLF@H.?ENML?A9r[YUU…TJaYYcn`ZMMPHFJIGBIFMFUST[YUMAC?9?<,-1>:8E@4:5:;C@52BMNNI;>>JA:@4;CF:1;џ€Х]!@QHT8nZ?BkY@]]cVUMYTi]bH$B5IMZhLnbU\MWLLaee[T\UMehpqoaZpc?COOS*WU@"8A:GQTaZ;OeJPB-AJ@AWZ(QaSJSU.:AZW\jprc]WTTYhZ^hbeZ];Ohd(eN@$!8SWpieUWdwH(UHQCI93PAVdUFgV‹ŠH180rggebH3WZ5T`S[VVeeineZ]}p`H\ZcpwbgqUj[jnohhrxtVTECCaWVAu^+ OFv][inGjYYN0V*F2,>BFZUM\wtm[YUbqraYUdOLIF^]Paz}w-17M`HW\ZT\WW>:Zezx…tUŠ~B(z‚obBNk1#ZkScTNV]j`hg%NHPYL d|akpo`LOJZV`gjhdhdPEIujbptuUpn:"ZJ@UGBL#-cw`cW[hdb\`waI@(NEGk5dnxŒ{{jzN^`tkjc\iiZkjmcd`aYOYioœzG?%SVTkYcGUi]V]]egGVm‘za`AHV`0Bhik‘qhrveY]GUYWaW]vpjapj[j19F&4ZuT7I\ahue^QWQNP?AE[dTSLLQervokczO…2C CV7@oŒ‚‚~miem]]UPT`[rjwcC9-O#37xWPWMS);j|~wb^pj]c—|mzmb9%:+mTFTYemFU8oqwZW[^jkmnJS(?GLNEc`LC*@NaS^e[L‰„{{[[Y^CZVGcit‹Ђ‘m@?NQnam)(d;JM^ihEz„hu›]gYLAI)kWYu{ƒЅ—}up1:^`cLu……‰•˜E8ILZaN&Y4UdUhmj][:#}~mtn@ICCTQPP48d}WZv‚‡’Љ‰Џc&^b[W^‡ƒ|{q|h\]Zda;Ga>Y^ŽqhpWB!NI‚•vi]Y^UJHPJ?Yibb„–q’žhaP]hZa^]Wt{tobx-$L+S9ajGN\mZ~:h‚w…p\`^ak`PVb`~rjT8Vci‹‡cžvjn^Zokjkov|wuF;(LYV\J%W\Y\}^Febgeo„nndnc|i@FC…u{{uxb^Z[9hЈ|qoiFBo’‹gSwQ5[–”‘Ђ›’žЊЌЈЃ™Žwojr|xzvih[Ndib\dQO{„‘z|hhjogWS{i{zoe5h‘e\uZY™ЅŠ•›ЃЈЁ˜Ÿ—ŽŠ‡{ƒ‹’ƒ‰…‚„…ZTcVmjd^#8FmkmorvvtmogirijZINcbtbMQЊВ–••„’˜ŽŒ„}ua‡ЛЉˆŠ™ˆwOpЂ›зМŒƒ—Љ›Ž’›‘•К•Œ…rwz‚wpv‚-&#)TNQ]:;wwI8ON@.>3>* )3T]0*,4@042>EOB4?2$&<>;.*AHC?B0(!$,>,4*404#02%,&.83IEH--#+7<>,,$"&)$1828*#*-4;E511*8>,:-$9A@># *1).%#!,$&52&57+,*,98:2)*.+:3>A;0+ &,@:++*+-)$,30.&4&(21+.(#(108@?2",C ##Ј(4<:;?:02*.(%5>412#(#+(74457:;8+""&4($"9:)!#88b[9(%#!37>3(8715>B<#&4-+"1,€л$3?;-8.180%"-&".0**&+-"A+$%.0?780-?G)4EEB*%.*0&(-*04()$%!1-;>4>>4-1@;;A8%!"$.-3<3$88-:7;7.03%19?8(+:4,,2;0*-)(3585);7-2+)173897>)29.!%!""2+%(-#"":5984(*.()&%&"#"Z>$)^jC31+"ыЊrˆ‚VŒЂx‹МЇ‹ŒАЊ•žœž€…ЇЃЂЉ’’ƒ””ЇЦЧЈ‘ДЁ’ЊЂžЅЊЏЎЎЊЁЂŸЇЋИЗЗАЇЌЋЊx•’ЁЄ–Ѕ‘Š…‚‹i•ЃЇЅЁБ‘eŒx‹’–•‘ЁœŸ™—›Ž”™œЅЈВМИБЉЅŸЃЄžЋЎЋЊЊАЇ|—ЏЊnБ™C\Š‚ŒœЃЛЏЌЈЃЅОhŒ›’——€ž•ŸŸЁ}‰~ŽЂУЕЎЉЏВЛЛЕЏЏБЋЊЈЈБААИКДžКЋЋMwЏЅuдЪcx‡ˆНЌЇЋЋ{—˜”ЈŸЄЄЁЃЎЉЄ”VŸЯБЉЇЃЋДЛЕАЏЌДЉЌЎИЖБАЛРМНЅ–ƒ7КŸ›‘МД‚bg”МЉЌЎМ‹ЃЂœ‘›‘Ђ‘ƒ|‡}›™‹œМКБЊЁЇЌЕИЕЋАЊЂ˜‹ЅА•ЄРФУЦˆ}Iv‹Ё–ŸŽ™ОЕŽŠЄТОЏВЗВЉЁЂŸЃЁ–‡\‡™ЃЋЈЋЏЎЈЋАЎАЈЉВЧœw”—™ЅŸСФООМ™VtАЎЎЊЌ‚ˆžЂ˜‡ЕЂУЛЛИЖВЏБЏЋЕТЌЌ••ŸЄД˜ŒААДЗИАЈЇЏАЊЁЇИжБœЂЃЁŸЏЗООНК›„œЩЇqЏУББЫЊ]™h•ЭЗЗБАЏВЗВЌДНk’•Ž”ž•ККВЕЛДЋЃЂЉЉЅŸŸЊЌЉЄЊЂž…ЈЌДМЗД–ЪаˆjБЪЉЈЉžЖw|ОхАВЅЄЃЈЏЋЈЁЖw–•’–•hYŸТЇАИКЋ‘™™€ЎЄЌВЕАЌЅœ–ŽСБВЕКЗЉЗЎ‚eЁžj’ЉŸžtr‹ЕУЊŸЅЇЉЎЃЁŸМЁ‘ŽЁ˜Љ…ЊЕТлТЪБЗЅЂЎЏБАББЎЎЈЎЉВЎБАЌ”ЃЊЎйЪœ‹–Ђ˜ЄЗЇЊ—ЂЉЎЎЏАЌЄЅЂЇЎФСБ›Ё›Ÿ›™nŠЉЇЊбАЌЌЋЎЎЂЇŸЅЋЉЃЋЩЖЏДАЕЊДz9Qz{ZvibˆЈМбЌ|œЃЎАЏБЌЇЁЃ”„‡‹ŸŸЂŸ’…|ЄЅz…ЋЇЈЏДИЖЁЄЁЅЊЁЄуОЛКВИЗ”iT|ЗЦ‘zЇаЮМлЧ›ŸЅЎЏЌЎЄЂЄЋВЇЅЂЉЄЇЖ™pŽЕЂ›ЂЎЊЌЃЖЪШКЁ{ЊБЏ‰žЄЛЛКЖЛЗЁбœˆ4iЁЊ„ЌЩЦЦУДЊБВАЉЉЄЁЇИИЕУЋ•‚Žzpi{ВЂЁЁŽžtƒЎЦШлНЊЊЎЎЉДжЖЕНЕЖЌ|ƒ|b…ŠОЉЂЈБВ”ЅЌИРŸžЁЋЏАВЎЃЅwg‡…‘Ÿ‚——ŸАЌ•‹—ЌЪбЎЅВЅЂŒЄЏ˜™ЅОгД‡]Џ‡L—гЦŒŽ™Ђœ…’zЅЯЖ‰xЕзЖЕМУŒˆ„ЋЄ”ˆ‰•›А–™ЂЎ•ШаЩЦФЈЃЊЅЉžŸ‹ВЖРЮхчУˆŒЃžВЂДdjYbM„Ћœ•ŽЏЊbМЧЛКуцРЈЁŸ›‰–b4uЗЇ™КТФчнФМНЛwЄЄЇЃ’МШЮЫебдт‹”–ЁЕž7pn”‹›ЌЂЌЈЏЅŸŒtТЪКЕȘ‘‰Ѓ›––Ё‰ŠЊШžŸКЗСЩЯЭФцЉwЉЉЃЅЫЮУСШУТАЁžЃЂЉг•{™Ї”žЁеЖЏЌЄxd’}НЮОЕЂЄЃœ——‹‘Š›БКЊАЧЭеИЩСЃЅ—ЊДДЌЊЋЈИТСРМУРx`e‘ˆ‘oŽЌА•–БЭБЕаР>0~ЂЮЯУШИЄЊЊ€АЋ‘ЈЊРИЎ™„ЋДбЧЋхФОДБВВДАБМРТОНМ~c~ŠFcžЅЄœhŸЕЋЊОЃ„žЈЉБЖСДБИВДгЭЎ‰’‘НМЫњЏ•™žКЋx…аЧФЛБАЗБЎЉЈЪЧЦИЛЉ‹‡…ЇЩУ–ЉРЃВЏЖЌБЫЂvЛЁЄАНУРОЕЏЌ„\[˜zUgŠВНЎЖЗЗмаЉЏОНСТСОДБЊЊЖММ€НЛЖj”’nvw„ЊВВЇЌВЌАЖЧ„ЋЏЖЛФТООЎƒЃЕЎ–””ƒЭйМОРЪпїяеОНМЛУТОБЋЎАЕЖДБАЛb—ТбЯЧЋŒžЈЉЇЈБЉЏЌЖККЛЕФЩЭСРМИкШ—œЂ”ntяяОЊЅЕШђцНЌлБ‘ТдРЗЕВМНЕЊЇЌМu‡Ѓœ…›‚ЗМйЦВЄЇБМНШ”žЎЯдУЛРЈЗВnЁ˜›…™ЃНВŸЇЖяђмЫЦЌ‚‰ЛКИМИММЗЉЄЈЎБИ‰‘…‹˜œЭЅVЭсzpЏ’ЗСгУŽ”ЏЛзпушЩК™ƒЦž™˜ЄнЭЮдТСщцнЫ~ЊЛžЖНУЛКДЊЋКБЗŽ}˜ЫЏВ”uvЉ›ЇБбНЭлбЖŠ–…ЂЮцерЧЊYTŠ™™–‚—ОєўѓУ˜ЭЫЯнЕ›НЭЌРСЦУОИЖММТЦboЉбЧœ‹‹t–}УЪББ’‘›Ÿ‡ŽФЫжппЎ™В›ŽЁŸ”ЇВЈ›ЄВЖНЭЩВКЗŸЕНЭЦШФРОРРС5 ZМД›˜™–•”ЃЌуљК˜žŸœЄТБЧЫЉŸ›ŸŸ|’–ЂЩНДАЕВДЊЎЗТОМКЌЎЈШЖЎЌЖБИЗТОoˆqw”Œ—˜žЋКЁЄУБŸЉЈЋЃЈЇЅЋЛР—{o{q‡ur•КББДДЗЏЊЌКОРТЦЛУЋЇЇЊЊЉЉЂКлЧ[›G?p~–ЉЇЊАБААЎ›ŸЌЉЃЛйКЈСЦН…q{ЖСУЧФ›ЌЋАБВАВЕРэжЭЭнЖŸЂЅ™ЫНzЎрЭФ›ppЏx…ЉЏЋЌЈЉЃЄЊЅДЩШРЖДа–…МФЯЉЁ™uŠ—ИЯЋБФзЭЮЭЪЧУД–ЄЅЎМмАB’ЩИŸЎЮЃmŒ˜ЇЎЈЊЂЁЁžЂŸЅВЛЧЦЦЛЖЕЖКЈдЄiƒŠ•ЧСяўћТВЪЯгжгЫЧгЭР•k–ЧБ›)ДчбНЏЩvU—Є›ŸžЂžЂrc’˜—œЂНЗМНММКСНБ’‹Ї˜ББ‹ыњтЋШЮждгЭЧСТЏЋЃЊЃЈРoЩхЕБлЃF‰У’œ’–™Ё—S‹Е˜’ЁЋЋЗННИИКРЯŸˆЉЄ}dVxУѓяшйЭгжлеЭЧННКЗЗКЗВУжŠбсЗЏБЈnrЎЂ˜Ÿ”ЁФИ‰ЕрНЕС‘ЄЕМТОЖЎЏВШИЁТМЭЕœЦЫТЯазеЯааггЯЭЧЦФФТТМФСККНЗʎ˜n•›™––МЂЂДеЫСЭЧw™ЕгЕВАЎЄТюўЦМЭŽ~m•АМяёљљјдЯтЛенКДУУРлЭЯУСИЕКЗБЧЛ‚ЂЂЇŒnДŸНШУЧЦЫУАž‘БЛНЖЕ—ЌЊ›–‰Ÿgj\oŠžхўўяњўћєптхЏžК”…згЪЪССНЛМ`‚Ыг‰ЧсЄ‘ФжЁŒВМЛЖДЉЋЏКИЖЏЎВЕЛЛСЉ™Ѕ•vЉжЯЎСЖСзцзРлСЄžЊ‰ЂмыЪУУЪЦТИ‚Cr™–БЧ‰АЖЖЌЏБЖИМЕИШрЏЖЇЋЉЏИКВЗ’˜РЪєуЧЩЦТаЯЯЪОжМНЯУo‹ЩуЛŸКбдКИ›’ŠЇ˜Є›ЌФСРИМЛРМИКЛСЦСЩИАЌЎЌЊЂЮЂЂУЃЂ•УОЦОйзбдРзЯШШЦЫТзнМЎm•—ЂМ”ŽxŸЁŸˆЇЫУФМЕИУФ͘’ЄБДЭдеДЌЉЃЃœ—ŽgК늘ЕЛВžТмкзджешгЏАзсѕщОД‡žЫТННЇЅœ–ЅЌББММОАВКФпЪЇ”ŽЖдзТЊДЕЉt‹››Œ…УЯађнЫЄЌрзмгегна•”ЎНжУЄŽБЎЭйУЈ–ˆЛЅЊБœСВДЗИЖМФФЉˆv‚{РЪШТНгЕЅЃЋЏБ’ЖИЌжЯауЭЧаЯежйбе„ЏОЪМЄ›ЗОСЦУРj‡‰Ї—Ѓ™ƒЈЉЎАЗНОЗœ™‘Ћ›УшпЪЫЦЕЌМДЎ’ЂžАœЛТТЩазкйдлнйЪйЧЮМККАДОО€•ИКЃ‡ŸœаŽ~Œ‘НКДИТУБž’ЃЃ}ЎсРСЗАЏрйЎ™ЖЂq›традкртрнрмппШЦУРНОУЧЧТННК–e^ЋЗЎЄЊŒŠРЩЫКЗЗЏАЏЎЃžСОЛРДЉЌбрВЂЧŸM˜тшжгйклзмкздгЩЫЧдблЫЩаШФЪ寘ЂЃЎЏЊЏ„r„ЄРЖКЗЕИИ€ЛДИООРМЭЁžЏЏЛЂ—U‹яњсннмджагййгЯЮКŸЦљёбЧацаФ—ЄОЦ”xЅДn|ЎЦЗМКРУТРЛНФлЫШУСЇŒ™žЅЋ…Д…‘юѕуцмеззжбйлжЫк@‡чўЖЇЮешИJ>uЏgkЫп”›ИУДБАЄОлКЖОШщюпЈˆЏЁЁЌЌЇзЧУчњшрмгдзежзлеЧчБSЋсьФЖ™РаАzx’ВРƒc’˜‹ЅЎМЉДۘЅЏ™ŠЎЈЯмЧЎБВЎ—ЂЧ’oŒŸаётмгЮеггбеЯаЧнЅ˜˜РдтЄЎВМE1SSFNMGMVe}[?`ŒhQ…’‰…”—˜‹ŠŠЇИТ•p\tЎтЪењѓЦНбхеггж€"пїддЫЖЗСТНЕККPGIHHEOQi]dkQW——iMkr\4BSNU?2AUmtMMCZpQ`‚•uЇагеМЛССгЫщзКТЋ”ЅлжЧШАCC?C@FEBG4EO`}ВЕ|`SgwFSUTLNLOCgqTZ\SPF4PIdTTS[‡c{ЎЫЏž~EC?A@AC?GHI,*:HLU^81LHLSNIEIG?HJIOOJGBHJHM]`]P95cQMA?FHF5@?FCIENGCEIIЛQUMGEFEJNMMOMIE:ANLJMQUEN?BBAJLOJPNMNLQNN7@GHMF??>??AIHIGLJQIICBEE€ЭNPJNONGGEFPUVU]WMGHGFFLPQUYVQJMIFC3@84:>:HSTPOMGNICB@GNNJA@CCBJGJIBFMPSNMPSUUQPOGG@CBEJOWTJHH@9>BCEH~pT720@FIG@EJIIHQQMEFIIGAA?;@A?>@ELHBB8AHMJJ€ЉLJIHHC@ABGEGECCGGJA`E?OAHGCJJCHMIOOQQLIHJLBEGCEGCGCC?JJFFCGSTPHHIINSPF?91;5B;?BIFFB00>EGGFEFCB>BBLLMHFBCMOBAECBAFFH<:HLIMJIGCEECEFGQQMGBUSŠG1C;54.37<@C:>CHBFEGGMIF:48B??и<@FBA;35rƒLJLE!;3€пmFP^%U[?UwiWZ…uYrhqghhij{np`;PPU[p‘q`‚oWodeagqv{ijroiwƒˆƒ}rtrPVbdhPj]YHQOOW7ZgnqmYbwZ8a^@QYWYib]ipaahc;U[rkq{ƒ‰wpkibnum|{urjjIdvvuu‚tuGI^cd^hŠˆ{~‡x~|xp{ˆgqZaduzePxp„„‚|miz~jp{Ё|bjkjbx‘’…bSip5ƒ‚}zž{)mBbI],Tt|Wat˜…uЃŒ Gz—™›œ…owtp|u^dtwЇ}eSdxЂ™tМŠˆ„xt„~‰ˆ”Ђ‹Q7PJ,bhgo[:hvpo‰oUvm~wŠœ„|zЂ’wS]b‰Ёт}ejx‘‡GZЃ™’ˆ}}z~putž—Ћ‹}z`OOp‘gr…q{tƒuznE‡go‚‡”‰}Š}oG0c@#.UŽr‚{~ЎЂ|zŠŽ’Ёwr~ŒŒ—{‡?Z`@A8[N~Œqm|„‡–ЏUx~t‚˜ŽƒJqzwZWTM`””…Ž’РЯМЎ‹{…‘”ƒxmq}}€.…Š*qƒ—‘Œn[]o{hw}{k‡ˆ„„˜Ё˜‰…‹‹Є‘b`eS:Iжбvp‡ŸеН”Ћ~`•Ї…‡‹–’~ww‚~>UnWEaF‡iЂ–‚`mv}‚…’WpuЉВ‰‚{~z;gcUQkt‰~em|злǘœ{EVˆ‰‚„‚‰‚umv{‡OSMYgb‘i#•ЗOB]{‘™ˆLdzˆЅЌАЛ–‡eM‹nch`qЅ›™›‹УЖВЁWOqˆi•™‹‰zw|މˆZNc—m`r[@:p[rƒ”ƒЁЇ˜NdVoŸЛЄЎŽw0#P^^jQn‰шћЪžnЂ–—М‰i›|Ђ‹ˆŠ‰…‘–4AuŠ^QUUWUQnUžŸ{U^^iPd‹’ЇЋЊvag`ihLWmƒqoYq‚ŽЄƒƒ{rŠ„•œŽ…Š”‹0ƒzgd^[ZZimxВз‚imddjkqˆxxnb~zNaWh‡ˆ‚Š}{‚Ž—‚„dq”}rwˆhƒ’—A]9<\S]ccav|‡tz”|oveokumo‡ŠiC@JF[A;aqz|‰}…}Œ”’‹ƒrjru{wxmŠЏ!b9QIgtwvxzˆ‰jnuqiˆЄŠn‹–ƒVG9|ƒ‹‹‰j~xpwxt…ŒЖЅŒžД„bk\eЂŽVOtД’ЇcAAzZ2IYJj}ƒq}zw^cbqoŸžŽ‡‚Ё`PƒŒ•}cb;U]}œv{–А’›Ÿ’›—ƒ`zq‚’Ѓˆb’Šhc‹j:UpJnxtognmneaci‚z˜›’‰~}‹m–z?STZ‘‰Эја’{œ˜ЂЇ—•œ’‚g@k™ut „Л˜ƒuB,nidordooC3[`cdnˆ}Љ~tƒ‡q^IhmGxwTgЯхС|ŠЊЎБЊ‘ЇpwpurZtGА~u™oQ‰UhcVdjk,Z{j\qtjw|‚ƒ‚~…ŸhO}jI+"?ŒЮгЕЈŸЌЋЌЄЂ™•‘”ˆ‚…ˆ•Џ`МЗ‡rtq<>t`h^beŠ~V{ЈŠ{Œemz…”~vƒ’i~˜ƒeŽ”‘ЋЊЋЂЎЃЅЃŸЄ–Œ—™‰’‘ƒ~ž˜Š–|b[g8ech\h—kqzЄ–‘ЈžBeБ–~vqo—Оћ‚–\QEe|ŒЭУщтыœЉЛŒЂЋ…~”‰‹Ќ‘Ё‰…ƒ‹…|™LmekT<}m—›™‹„’trU‰„‹‚budOa873.2E47Pd|Q7W„\Gr{uidvr^gŒЉƒI7N„З™АёеЄ–ЌЩАžЅЏЉЊЗдЋЄœˆŒ‰•‹Œ—ŒO>B99EEHiceuEW”‘cJ`[W#@SPO<.4E`nAA@JY?T~Œq–ЫЯЭЄ–žЕБйИ˜vjvВЂ›Є…4:;8@08FO3CVO{НВp^S\nCPUNLHCI9ZdF<9040;SQ?VaVO5"HSgWNHGn|VrЅИw[0?3>C><1>5:FJCHHGESQNbg\\+$iQL:G`QudTS^iaW[CE98-<:EIF>LI`SWNI?@G;MLGEIBL?EG`VaHmM>GHHIIGUWT^QM;PVF0?@<<:>AEBBFJFIW\TICAINQQI?:.E:@JMCAMEG@GLCWYQW>AC@@CNLQWHSPPвZM>9132<>LMM>IBGGINFHOFPNNMNE@EOPHINLF:CIIPLCAJEBHIBJ@G>CLMLMJPLUW[bWIGJCFOLST]WLIA-??HGHH>;.8>;;ECIFM9:FHOOUSVH@FEBLLHTSQ:@;@75>?@GFFBACHOOUOVLQPFHAHB>GCGENGSOEaC:ANAAUOO?MYTSQWWTFCJEGE?>@5FC?8A+MHPJTTVQMCOTSQVOMG.09GGFI;SPG$:HJIHBNLJOBFGSNQPFGNNGFAIHF;>>BHJ:FGTONFNFEHNIIOVHOL^L‡•E:FA@9C32EA83@MIMHIGTJNGCE;AE:BHBGLEAGNPIHGCOELABAEGC(BkPOLI48z‰TIEG.>+џЙm‹‹””tgirda`Z‰~АЅ•”}`, %"#-?jEE;Mk<#4&gaVPHI~‘‰q{{юqW[]i‡‚–МЦT (H"ƒ  +NJ,5HHEV;4")TBF>@m}”Œ‰zjoqeaebkЈУѓкw2)9I+ %* 9U209-:OA`I281jm`M[anum‚‰‰gnhpjYSkqЅБˆœ˜›\*%)Ѕ $(F4PY>NG8%ArN"$SSUeIw{Œœ–phxron„ЄЖИŽŠЂЦЕ`+  &%IzQ,C4JIP7€l1BY”{pon{Œ‡ƒagcg\9?aƒ‘Ёƒg‡‹4 )" (O„Q#G9TEbJ )2&nž–ƒtƒЇ{Gxœ`H\Pn”…ƒР`1$ "  @J,NM`Z^G,>JCNC^…ƒtkwЌ–WowptqdhЃмУwˆ{>.  IP\`UMEYŒjPZbF?9\iS{x{~Š„}cvpz~q\Š„гЎЖлŽw. & 0^u;ЁmVSvŒН‚^-&.)9Zcu{‘žŽŠzohtzpF[w{˜˜ЉŸЗЏh"3#-5.  hЊUpp2@BŒ›c&"EC@2PI[QQ{–„|vuvrmtijŽ|ˆОЗžЅ–]2 );.4 „ gwV^‘eaIQ|Ў~L*?>MMN^kbƒ›˜zjrirz~cqu‚ŽžЊрьŸ1!2 0   NbTrwJ;?!^Š[>AI4-MiƒtWvОШ”mxz‚Š|vhmw’ЋНЎЈЋŽC0*   Ц0idaa:WH$GQVY;@4 )FrcjYb‹Žxettkkr}‡uwЊСЄБЦЫŽE))ѓ -9iW]]€wQE(Hnr<-MAB+ƒr|‚p|;Y›Ÿ‚ЅаЅƒС :e‰…iaUOczg\oU3*v~\ЖбР—Lt„v{…Ђ›q]kƒВЫЧp% €Р ;–”tiiMH[V\T`UOCNvYŠ”tƒ}‚‰‚‚|okGBYcooQexŽЎŒC1"  0‘О™SSJCEJQhig.3•БwqpˆƒŽ‰‡…‡‚ŠY]tcpibju…Ђ‡‰4.  ,5Y‰xWkcYTF^I)AFd˜мМŒ~‹•…Œw}‹{‡ˆOTdtm\ptƒ~–V$+   љ,\›xbb€жN@IWUƒk3>9t|}|‡u‹„qxoqqa>GWpgZGp\w„˜—q8    !#.&H‚…{ohe LFqЛo2PSuqx|zuŒ›Šxpqgo‡gb|‰‡^`—œЂБ˜ŒB   * 2w…pi}Fh>Uƒ—tAPbwkxŒ‰Ž„nzt|ir^r|tqotN}Š—Е’gcQ8  cВž~piL[HYnxN:p‡eŸЉŒ‡ƒ|wu||€˜memku~}Œ’ЁŠ}˜O ?kЎ‹\xc\\OabWW^Z[G{Н‚\rzko~}mgjmc–‹‚kqŒ…‡ЁxŽE>A )(1$IASm–omULjVT[SagkrwЏorxu{znj`i~hxŽwhuŠk{—ЈpZ>7"% PhbY„vp`GEair[gzƒ•v‚{v{qcozpn]u}xv‡||ŠuimƒŠi   :j„‰|dTiTGjmaŽˆdhnhmz””„xzˆtekt~ƒ‡…vƒcdx„}|p,.$"  )U‚YA]|ddYcU^дЫmeo{‡ˆ–ˆŒ˜Šƒ~hr^okxoihb\|›…t9$)%   5o[JCŒqvzi]Ja‘Vwprz‡”›ŽƒYngckqhpitv‚„}xƒpwY#$    i‰ž}rŠК˜rBY>barqvqw‘‘Œ——‰chbYa[nr|~ˆ…vv}v^pM#+  "#`u{tvmcHNTOUqqz|zw’‘kSejbd^Zguv‚’„‹prtrh|O2-" !Tt~xzŠBce^Yq|}x|u…”РžzxzrxZQMqpZgkqo‡|m‰aP%  (% ŒЛŠp{rw‚}PTOir)‡‡|‹ˆŒŠP]vntePP^erkrzn`p|kmˆ0 $(%):}‘gM‡qe`]bSt‰\qpp‚Œ~vrnuxvaaq{cxvwrhrž‰`|•P;&( % BO5‰t9p”ƒtdem`z„gmq~‡{Ž…~„vrh]gZ9@GFMQNO#25*!3VadCZPV9L]*# #3`5e’vUk[biub^h+#*AECA?BBC0"!)FMGZU\STZIB*   3!B;CYjt^OŽ}41.3-%)533BAIJCCE?EBFHH€C3:2&075 #"  (MA2$"PZ-)(9:$19:GNL>@++.".48NF9?4<9-"  !9&*$"3-?@JQH@8)-+$&( :   ,?7:8@BC.(%-C?@>8HFEAEE>`SOFAB;EF@4:Ng9   " (1*",7 !*&&9@<7YA-.1(B3BB>A?G>^F Д!%%#$59,494:3!((- !+28BNMA@Y>!..  &*-+,"€eЗдЩЯЭАЊКВБЋЅЉШШннЮйУ…7;4(4,-%&415:<@H?<`ugv›З‘Qk™–žЗwqtdŒДКЇЅЂШмдаНСРИБДЈЄЏДОгыўп$.CBa™—|Ѕ•c—Ћ˜‘{Bw||mc„ЁЂ™‹ˆЕЮЭагСКЖЖЗЎЅЅЌШнюўўž@>ZWE&%*-172+.-9?I>J}‚…ŠŽŒŒ—ŸИЂzƒqБДРЌЉЗДННЫЭжБЏЏААЌŸАЌнлЛЦЫЧt;2.244212<9>8>?VwqдЂuˆŽ}‘žАˆ[920,-8<0>488ТU]ZnЃе›CdŒ’›Єt[px…‹ŽЕДВДЗТЩЪШОБЏЇЅЂЏЗЮЪШЗЭЖ`$9:752)77:77588€f[Oq˜ЃИЅhMЅО–ž›iGWT{~‹Љ›ЏДаЪЪЦЗВАДРЕЅŽ’АгУЩтђЧY3@@99238@aœЁ”ОЛ^[ЌИ˜˜ЕЊqOL|ЈЊ›™ЖЈЦЭЦСРКАЯнзФЊАЪМУШзк|8:V9119;:>73.9@?2>MS™ЉЅ‚[xЈАŸ›Ў‹dЉЈ|”Ћ—ЖРмжЧЦШФЗу§ДЇВЁБСУШЦТСw>7391099>@;><58;493:;;9…•˜œ@:ŽЉЏЇ™‰{”’ƒjZžЅЉФУРМТрЯЖВЎЉЊžЊкўщМаНЋP4<@:9,08993.24;9;?;n˜ЎЎ™S––˜ЩаЋ˜ЇА™”ŠЉМ™СУЧЦЦТУТЌЕОНЕБЌЯЪїчьњЧАN$:FCGF8,7,:51+3:5)LPЉР’йД”АТєУЋ~i„r‘–АЗОнЯабУКИКЗЎБЂЗКЩйеЩччŠ4H3-33+0.39.2>ЅЩžЇЭЋ–ŠžФѓЫŒ}‘ŽЄ”ЋВЊШцЩУСИМЖЛФЪННДДНейтўўЯE3G:<7(J778743385?88{ЎЅБЦ‘~…pЄаЎ„ˆ‘oxr•БЮМЈМєљгЕКЕЕЛРММ€‘РЩчїцЮуТY>4(192:048;594430*:UЊЋЉБƒЂЂmŒ–žЊŽ‰}Uu–ЖЏЗЂЌггРЎКВБЖЛУЫЫДВш§туўљЃN;>?<97,558,3..7:CP^МКЅЇЄ™ЃŠ•ž›’ˆ…`e}ŸТМЖВдНЗЛНВБЎ™ЦЩЧЧФрШбеЯШЩg@,@G:1-0)70)-13@82BЧŸДЖЋЛ—™˜—’’ž—ЖСНЗБД”ЕйюРЕФРЧТЪЮеабагаЖr88>><>02275>3@<<;2*iЖВаЏ•‘”˜–™™•™’‹˜™ЉКРУФУЎзјьЧЋОЦЦЩТОВэђхтФдь|2%!58:4;1378@F>@B;0I˜ŽАБЋ™”’—”’›…ˆwx’‡МСФЩжТ”ЌЧКСТФЦЧОˆŽрїрнхўў]C743F@7;(9740.*-A;BAC@.1дЯКА™Ї…{™ЫФ}‡”’”{ИОТООЧƒƒФЮЕВЕЖФШЩИржездЛхйcPE;:@>443-A8<8:.2?A@51-77EO”сЦВЉЎЂ|zЂŸЯК}‹НФЪФРЧЩЭООККЛКЋ‹‡•БКЌ‰ЋЅФЪйеF+.::8179:A:5<8N4;NuакИДКЊg’ЃЧўЗb™ИМССФЩЯдЮУНИИМЫЈЉШЮЫДЋлнйьугŸU8.:4518978:>A@GE87UЕНЛЖШЩ™К…™ЫлЇ…›ИЗНМУЫЫЩЦИНМСЗЛЛТТММЕ™Тбжэн™–hN2,;<;;17:4C?9;BA@WЂчЮЄИАЇЁЄЊЈЄЄЇЈЎŒЕюжОЁОРОЛНТСЗДДБубЦЛКФЦЭхЭеt9Z\*9B@<13;;<7EFMJWo‰™ЈЯЖЌЁœ›ЄЂЄЎАВЎОТђЖЈМСМОМКЏВЛКВЮаЪМЛБИНЪрьЊkbVB;8C:;::>@<@B54?vБЂЅБАИЄ™ЂЖФРŸРКМаУРЛМОНММИЖЏЗОЦЦЫЫЭЩЦЛЕОТаУ’*0(.77849:;7953;:;cЎБЧЎЌЁЏЇЅВЖКдкКИЛМВЩгжбЩШЯЛДЗРУЧЭЮЩЩМКЖОУУФЎHJFG;;8>B?:899:8;>œШйМКЩыбИЁ˜ЕБОЛЛОЦЮджзпсЯКАДЖЕЛМСЧЮЯЮСМНЖŸН…8@HCIBHOJ^ТаЇ•ЮНИАЌЋЃЛЯЗИЗФЦЦФЧЭШТКМОКДБСУЏИККИДДпЯЅЫеuN??>>;7>9@+2WoYТТ~ЋкРМЗБЎЋЧУВИУУЧЫЩЧЫЪШФОКЗЏА™ЫэШОЛЦЫУњшФздZ58AFB?@@??8??EHJLWE˜Н‘ЃОНЕЖЇЇœЊР}ЎШОЭЮЫЪУЪЮШЮЗАЏЏНЫчЮЪЩЩЫдждФгЎUE9>G?:4;:>>1>CBE74>‚шжЮЪРЏМЄ‰Ž›ЖžБУРТзыЪФННТЦЅЃŸžŒМеЭЯгбейкебрМ‘o`ZPB;7A@>>:8;@EN88>IFJcg˜УЇЈСншсД‘ŸИЦЛБЎАЩУШЯЮФОТМ•ЁБазбб€)шЯЦНЩЦКОЄNHEA737:37;77>9+8I7~ЯЛЄŠЉТУзЕ•—ŽБИЖМИЖЛКООИЛФеЉЃ~БЮЏРФШЩЗсшэбИЋP14875C:;84859>*,8{ЧЯЕАЖЛНФбЃЇЄbЁшззЫДаСНрУТжОЫНЁЅЋŸУлждаднюгСЫp&29?;?B824;IEMTTSWWVPWLOILCZNLP^^UTQOLJFA?4N)%0($0#"$..13ALSYUZZYZFIF@@?HPSTNIJhV0-FB,&(("#"!&&%**28>?EFGFA@FJ€ „АЉБЋ‹z„…}xvh˜‹НМЅА”t3@",$*#-#)758;422&Nc^cQU‚˜ЏЂЋ‘ˆ~Ž{pvuzЂРрўцƒBGZcC(!8*#$+(4?.#1S^HELPJ\bczdGIH@3&(!12!45:->9BF[,?tgHT]TNOZ7#JViimz]‘‹˜ЅЋА‚|ŠŽ}}žЫЯЫœ™НзНp%2G<8.(<23&)(.32!1>N>[Œh7PPFbbcS#!7T[qЊ–‡„ˆ•—œ˜t}}roVZ}˜ЇЖ˜v—ЂE(3@8&)2,.24"!>@.5a›a:ZYcWjPA-9HSS[v}xƒ‚‹Ђ„wou^|Š™Ђ›ЅŸ\&-8B72025003-.)50OFCakth<g‚d]gb30*FSVqcpvЈ•ЃŠ~tƒˆpWUnЁ•˜МЦЃ^8B80;:%9@955*$20 *Wju^z}.)oxa]„t@Gnp^eb„w–™ВŽ–ˆx™ЈЅ•tZ|™’’ЅЗtGCU-3$;HA78--%3B3aooE*@ej]WO>GiaCJ^jZ~‘ЌЊ—–ЁœСкˆmˆn…”–™’–iA:>)5$:>;041*;),G7OboZ2;N``a{jBWLB5[WMНБЇ’ОŠWƒ›d[tmƒЉŸ‘ŸЮiO<.3>B3>::59)+-24"]bN^Wmuo]MAS]H:%^]Vv•–‰„‘ЛЄi~‡„v}zВјЮ”Ќ‘T4HA..,7410%((+(WWotb3\Ui‘–uairZWNwƒb•Œ•ŠЁ”‹r…ŒŽ‡wЄ›ыШЮыœ…J,A43982(0-21%+*$3G9x‘[В{ha‹ЂкŸzL4HCOF\a|ŒАЕЉЂ—‡ˆŽ‚zrŠˆЄЉБЁЫУ8T?HMI4&"*2;+)#+,1"!wО`…ŒCHW–ЊwLEYQYYn^|dj—Д•–‹Š‡‹ƒvЃ‡”еЩМЛЌxA2MPIH7)&()!%"7vˆgoœptTa‘д™V>UVUo`z…wœЗЄ—‡ƒˆŒ–•—u‰„‘ЈАЪљ§Е?4G?;4B1(<517)##+&0]ug‰‹ZNY;rЁqIP\CJE`|Ÿ‡nŠбуЏ}‡‰™Š|{ŒЃЛйФЎТ–V@87;714013*$":AtptzG`iC]`kkQMQ2C^…xe|ЅЈ’v…ƒ‚…ˆ”—‚„РуИЛеьЌV@@;<4**")%0.2:BJŽhmudbMT\WhdLS5BQ^‰|~Ї˜…ƒƒ‚u…e‹Ћ™œБЇДžЉН^C2BB1:#&(+##%%4"07iŠiu}iƒ`Uhea[Zjc\b‡……{‚bЃД‘r‹ŒЃ‰‹‘ЅЋЈЁЇЎЎœt;AA9<2.$#5*#5<%!SŸ}[OZVZe`eY[[\\o”œ‘Ž•ЕеТ›xŠ”’‰ТзЖФœДЮ{0&.;70392!:9,79.:8cQxvgbJUSYZ[LPMFVMˆƒ’ЁВЂp‰}‹‘–’Œ\eЕйЧШТюш‘gM3$178,%,18>2>;Ag|›Š~UYOW`YOGJ^T\a•‚™ЅМЏ8U‚ŸŒ‡˜Ÿ”œрљЛЗРШЧF7841+.3&%%#-,A&V’œ…qaiSG[‹…GN[T^O–…Žœƒ”LL”—~v}‰‡ЄŠМИœЈЂЖВ`OL.27893(%.&%(!! $Ÿй–ƒz”…d‚’^ocdkŠŠ›’Ÿ‡io}…„„ЄЂзїЦККЁœЉИN287+940,)*45985$$!08{…ƒž‡q{`h`~{u]btm””Ÿ‹–‘}…Ž~‘~uvd‡›МАЉŸЋ˜ДQ2-,,.#8:34(&+3<v}\GeACvВˆ‡hbeG”–”ƒŠ…”Љœ—’ˆ‹В„ZtЉА—ЩхФ•5!,)0*5.0"","+-@#J{œŒxte8gxˆnkzhT@‡–tйякЌd‡™˜‰‰Œ•ЕОm•”}Šгцр‡)A7-?@2)5.&"&02;AŸЎŒq^Zp^obmkbd]”‰gЌŽŸ••ЁŒŒ˜ˆ{VUm|‚„nxЉЧME@,:43-,.#%3%34MЂпДdhYZ^]d{‡d*@HЌЩ•‰–™ЁŸœ”•ž›˜Ўqpƒx‚wx}’žЕ™ЁW3J;7;73-%%&083OHnА‘d|t`[Tt”^PTQtОљЮŸ•ЁЊЃ’‹”™‹ŸЄijq‚u’žВp+03B<140-51)&%,7ArЌ…{nbEFqq˜|JSP‘‘˜Œ•‘Ÿ™’ˆ„‰~„iNWkrtO{z–ЎЋ…O+-5>B9**-*90.5F5#?W–—Œ„v7[cŠж‚?abЉޕ‘•ЅЉ’‰…ˆŸqpŽ™ЁwuЌМЏжЕЊZ9!)97),$-+139:.00*G‰Žˆve}Nc˜Њ„ZjwЁޙЂŸ‰Œ‹ƒ‚ƒ’ˆ‰ˆ`ŠЄАЫЏktkP251;A2*+.(1*-51A0)vЫФ–qgdSizŒdH\…—xЕРЂž’‰„‹ƒt‡Š˜˜Œ’ЊЊЛ˜ŠАZ%,$%*19-,4-)LI?]VbzЄ{vhdvjdjno„„€q‘Ъ‡v‹Š‡Šˆƒ{w~Ž„Љˆ‡Œ‚’ЃЈНƒeZ\A78":,.+<.:,5(8buwt‘…nabx„‰kŠ”Є–‹Š‡‡ˆ‰„|p‘‘Ÿ•’™‰|Ё™}(!)7%)884,2--9&",1P}”›‘wonb{z|Є›|ƒ„ˆ—ЊЋŸŽ—ƒz~‡‹˜Є›ˆŽ‘v…Œ…‘‚8??CE;0)0%+&%2+00>.5n‡iFrœwrpwgwщу‚|…žЃЈЂЂЌЁЁŽ~Žv~‚’’}~xr‹‰›Ў–‡F1(BGE<*0+1%5%0);IvucY›‚ЇpWp˜`އ‹––ЏАЉЉЁz{rz‹}‡‰‡•ŽŽЁˆ‡’›…Žg;0>@:9@8.8>4-3+)15,z–ЅŒ—ЩЇ„[iVzz…‡ˆŠ—ЌЊЇБЇ›v{wvrƒ‚‡”œŸ›ŽŒ‰jg79:AB15.$"00+(9592pЗƒ‰rU:cngdŠ’”•АЊЅ}r‚~voq}Š‹—ЋЂЃŠ…‰Š…ŒdJ?59?83%5.*1*49728eˆ›Œƒ‘Љ™ŠQwmjrŒЅ–Œ•ЃДбМ”–”…ˆrqpˆ™…v‡”ž‘whM1:)29:5;*?.8CA38žЫ‹…‚…›”gkhx‚?ž—•ЂžЊЌЁi{ƒ{n^d|Œ‡}…x‰’•‚z–A!#+8,):1?I;,7FL<83.9?@8>-3*UiJ™‡M}Ѕ‹‡{wwq‡Ÿz‚Ž—–ŒЅœœ™‰…„z|oZЩ„ƒ„ƒгБЁЉO4%9A-;7.3>0204:1?355)%#>;2)5ZЫЗŒ”u{hNOdxg{ˆ‹™ЖКž‹Š‰ˆ—mjkq[…Є’žЄЇЃЃЋœЄwj\ZC?803;:5B:24C;*FQЊмŒŽЃŸЌ”b^i‰~Šœt2…ЂЎŽ~}‚ŒЃqvmmސƒ–гЪ‹—ЛОr›x[I)7LE3:-BF2793:2.79>>C8&11)$%01,(1:C5j•Šj[eˆ‰Ђ‚ajgj……ƒ~}ŒŒ|„‚ЂjgOuxސ˜…ИНОЇ‰‚F."0329.40-1240!(`˜›w‚ƒ„~qr}?{гНЇЄˆЅ‘ŠЖ‰ŒЋ‹‘i[tg–ЉКЏЅЌВЫЇŽЃg##1(18877<.;.12-&5aˆ•w~Œ‡‹Ž‰}}qNQLJ`kIBUkЈЉ–h>xiedxЗСНЉžНОЄ‚‡w]JOIFBJN,20354;5@&:hœŒvx{‹‹…‰{UbEYVYMAC^VOI]LMPJ\ovЃВЛЫВИŸ‘xˆ…OC.GGN{T&75-8-85>A0&2+!%A*&EPLJ]r‚ˆqh›•GJNQIQVUVWUUS\VYLPNLTWT\\PTUCNOT*1#+)7>E?*$+(,*(7:CEaUQC9:b|LOQSNTMSZ]c^VWLHL<2:8VT]bVTNQUH>10)45781!)0&):<*7;?HZakH97E:C3I.##!*#((-++83FNQNS[^P::@@>AFCGUZW]``WVSa\Vƒjd\ZVZPZNSU^ŠN",*&(-$%-2)$"(()::€ŠGF::;8)3+G42-?CGMFJQSVMVeaA.9E?ENWTVPUV\N{Q3%#"(+($!0)3<8B8AH??@3CџЮE?cU3SIQPTAJJkH[\YQLI,I[IGC.IUoSi‰Ј|?N Ф!#)[qUO&#;F@PWPSWWS@4dm\YnJ@i<L .hF^qotiŒv" HI  € ?*?HmŒn]AN18QUALMSQOI;c]ЪŒ?0E #;^jPSh…Œi#)A tЂY*AQNUM@>SZT>cZJH`oggE5G89E8>AZZ]Uq…ˆ‘J)&  €ј-)hЪi(@LMMJP[`]i3][O3W]`rB>B;(edSd…mˆ‘Иk7)  S .3@QoœPL0NH5PUJNc`Vitrg$",("#?aA+Q.HP? Hhk`WOJMSQW[^V\I0E>5>!5&Ežghpr„4$ Ч +-+"IMN5MOL>PTHYHPO>2;@H{gGE[Q:A;0FGTj‘œ‚—cТA"+$;C*@8$O?-58GJFM7Pct;5CBaE!!E;.-<>L@N>BeIYMYM,!boxYTG@99n‘^JSFF[?UkzN>>LAC3hWZYLZQt{o{GMG,"%))o@:9Sb]TJ]caVO?8kQIgoqgM4ZOC9N`uhd]^kmct‡}g( "&)™dIHHc^GF1LbQa?FB5JO\VTcU)JZFGVQL`d`MYSLLMUTVBL*9(zE8B QКЫzqm}vxt2 П T—|@SZ]SSBMTcZUVeTeaPEVdwP4tкZ;L@P9Pj{Œdnvp„‹1Т <#ЏКo[YTOGWLSYVZ\c`aSLQSOF7 ?„.C7.:jjijWg{j|—T;#+7* ‚"n˜`tk^YUVTOOYMmcNQYMMYcpoQNgua[ :QJOp|amrt|x{œtA !!m~VJTTS\L%apwowqibWW\EIP-BL`M.Nzpgwh`ijvzƒ‹œhЉ ~С‹‡h`tPETJSoo^`[``CFaa9UVPcLOJWhteokW[bp|~ˆƒ‘H<  ((+j‘Z^TjI1EU`\edd€`[MHB7G[WOU[bVZJUEFL`iYci}~‹ƒ…•U "&Ic~`^]Ni[`Tg]PUV]5NS[\Imvob9N9UTkˆЃ^CO^\UMSNVFjzqri^F$LUZT\dHu~xx}w•™xƒ‚W-   $^onZZg[q\etrhIHPPTY\C3Nb`ju!-JSUJI^8Qini[]‚‡‚|qh%   #cqhccm[hdAe}`TQFCYTG9BQ^WUN4CL„mno‚{oЂZMNSGVkte\jkxtgv\YVVZhbNG`aYOUQcZ5kU]^29Za^YWt„wƒ]S.&&! Hdb]d^j^]cnvkrpwueq[SFJO^Z]mM:c`VHGT>Y`uvcnqk…Н›tE!  YeSZ\b]WQYW]~‚„vhFb]>]w`I:@(:!B`POVdvZmtgidjƒЮЋiZB32  a[P\jmkkeaNdurrnm{}vzcIo˜wWO;G>WWNBOJO^wbckwr~ЁВ}\H@7 SJ`@^ojkZF,E…—|netwjh[2ZˆqC0MVx]P<5W`ZWQ`W`P^ma~ˆЊЉVBY.## ]ONdЊЄ{ƒgSPVe…oUcttpr`T^oS*;HBWaU:I\]WQ\bPPhdrzŠmPpq* kdUT~wzw|uW\YЇOip}‹uvkZbuaN`bd`G@GQVVPV]Yadk|~œtojh2%!%uIZi‡^h}woqb–аž–Џžž‹UFJbhd`]ZObJ.E"hƒ|aeZ}{pzƒ„ˆ‰kG&)72.™O38VqT]}^k|aaqp‘Ѕ•Ћ„r?U]k\[QGUJH4"+dˆWa\m~~€…ށz{{Y#*!#‹473]N8b[cjwŽtnenvŒˆcidYY^H*GAU>;3 Laeiwhv„‚‚|—ДŽmYZ#+&$,,1,V[7UNY[QgЌ‰ƒƒ|rx‚…{‹‹rЁ‘VGcgSN2-J[japI?b8]bgp~ˆˆ‘œЎŽrq’Q$-++0-2QJ$B;dZ{nxx|zjdgv”ˆЇЖŠ>[Z`AGLB2PLedSIZgx^x…zm‚––tezgA>%#$$UN0,]\W]^tx{qjdtr~{|ƒ…‡ˆcbddO1W]^hGpkca]]Џžw~Šgžˆx[`ZE)720(@zxbb@`Qp…tichziizr|zx’ЈЗЈpvj^UNLJ`U?LaN[+g{kqnk‡ЎЄмŸ„~o„ŒŒh@;3*˜WJT8dЅ{wLVOЧ`ž…}}xЈФЄЋ™vt’‚mUCLEJZU[g[nŽroeZguk‚ƒj~‚wuav>0O;9,pMnjZc…[QjzjkŒ–‚›—С™g?nЪшЁT2!8[ULQY,nm^UBrŸ‡„‰„„‘nuiS1  xZ^Z[UŠЃh>U{uo|„‰‹ЌЯЋZFZ™Њ‹‚kox|WY^]mo}ciSVc‘Ж–p——‡ƒ…cJnG tjm3Bƒ’jzr‚„x}ˆŠ„ЅО›ƒ„ŽЂ•jFtd,23Upjzo^Wkgnˆ\^aaqˆga^! }œ„hMVqnrjt{jawƒ}k]okЧИЏ—}ƒЖ’Ueec>&OQwwqkZ[bhnbcce]‚oVSTGjmPkhU]c]mˆniegbbM|бАЇИЈ[S›Ј„\~mjd&BMZ]zxhSadivnazŒ{q]H#") me]ton`WWnjtv|`haanvŠehЃЖ…io…ŒƒqqUOWUOeii|‹qS4C™œˆr‚ФБC!7NV*]`SmnddVbkŠ{hdb\YZuihzn‚|pŽ•ž–qhjPCF8E`•}bJ>r’tMH44($! ZYe[u{idQc`Fhuuzhdrhhmzcpœге~z~{r\zLFNaH"(>*$&&&"<2+&Vbbxn^iupgYitwovcm{rehtjixŠƒZr|wN?eZYJF7%*%.$"&!2.<;$(5  ]Yepp`Oq–tnmercwnr‚xici‚ŸЌЃ‡QGmedY?N@><&8".$#-,7;>3%#!#zOeqk^Fkvqgt\r‰tYpu}pb}‰wTAAO5@. 970&!*(*"#*<44FE5.$-1%JH"49QNC;`coGHHbI2JQ>Uj\IIAF049E3%+-;A@@?>4#2).1.10#%54)*1Q\G:8;5,8+-4)-;CF79@@,#5@a4A>;;758;-,$+-.8&1,!")7(,737!.4?CO^Z+@$,""(&,>,*+*$"A&4EW)+@cЯў™ŸЄЉЇž™—ЎТДЕЎЋЁŸЃЁЈЊЁ–˜–‹‹~ŽЅŸ™ЖВЈЖСУЇ@HLI-,..9@E7+.;A@<3AVФ›Ѕ›ЋЃЂŸo”КВВЈЈЉЅ››ЄЈЅЉЂ–œ—‹‚ˆpZƒдМЛНФРjNE0.*04+!+0.(3; #PSEJOŠ”••›’™‰ЈЈЂЅ‚”ЄЂ›–”’›ФМ—ž™™Ž‘ŒŠœБЛдпШгœ5710--5$"0,-7+"%VJ#1Z”‘ޔޖ›ŽŠŒ—Ÿž”•—ЕдС‰nˆ—•Д……q~”Œ’РенйН^3.%$.%%0+,+.3#4\I?\h‰‘‘ˆ‹’•ЂŸ”iŽЌ›˜Ѕž™™wЏУТЁЂ˜ƒ‰‚‰zuИмВ”КИЦгЫž:8;EB0&%+,((5.$(3,*?[’ŠŒqpЂ˜ЎЫДЛШœ››žŸŒЛЦаЅWaˆƒƒ–|…ЁЂžŒ›ЄЋдкУ‚L+3,4a–Œ`$97>8%#);;@<гБ‹•ЉЏЋЈЌББЉ‰ž–˜œœŒЕЗЦœ‡—’ŒzWˆМЊЇЃЈЈЇИКРШЫr;>no8! +;3244594;?@?М‹‡›ŸЉЋЂЅЂЋЏЇ›‹h•ЕЃЅЌЕУЏ•Ÿ•˜{ŸЏВЏЌДДБАИИЫЮЂEEUM4(&4;<7,),2($&!$"#&),нЛŠzœŸЄЂ››žЁЌЋЈЂЅЅžžŸŸ–zz…Шžj‹™igЊэ§ШОСНТЮЩЉ[,C*.,&")!,,0-4"9jнО—ЇЅ™—•œЃЋЊЏЌЏЅЂЃЇЈЊСЁZ~ЕўЕFƒ„ŠЃ’—ВЧЭЗЖНОЫЦNEON>N%%(8-14*GIцїЕœЎЇžœ˜™™ŸЇЎЏЎЈЃŸЅЊ™{]e‹ЩGp‚ƒ‡ŒАЖЖБЕЗИРФш„ZVVWH)-)%"!$9;9>ЛгВЖАЉž››™‰ЄЇВВЋЇЂЂЃЂЂРД’ЁМУАžu„››СЪОЛЛОФЦЧрИg;$,)9*-,(-)47?;9БЪЁ‘—ЉŸ’™ЌТЩНЛКВЊЅЄЂЋЇ›ЂЎЁuat™ФОЕИККЗЛТЫабт™I7"+55*,-2395.1.ОћзЭКЋЭ™cŒЉœЁДЖЗБЎЉЋ™ЅœžŸ˜žŸЄ—Ѓ˜žЕТДЖЖДДЛУЩабжеjWAI@843-24@<457ДйС•˜ЅЉЄ‡žЈЊЎАЎЌЋЇЃž™•›ЄЁЁ€’ЃЁЃžЄЂŸЇЎЏББЛОЪЩФФеŠ21<<89584327:5;”ЏОЏАЅАЈЇЉЉЗЊЈЇЈЄЁ•ЄЋЇЃЕШЖЎ…–˜‘–—™ŸŸЊЎАЖКТЩЧФВраN+0C.3::73101.7nЄЯВЎЄЇЇ˜ВИйЉ•ЉЈЉŸЁЃЈЄ’АТЖЗЕЋ”›’•™ЁЁž˜МЗМКЮШЫЭЧЪаˆJ8820.49447<:9ЅЖЕЋАЌВЎЊЖМРД™•ЁЃŸЄЃЁ‘j•ЗЉЖН’–•––v™ДЉЎВАЯЩЪТТмЊO<;;A08>>0.,*5БЧДЏЕБЗЋЌ›КЯЮЄ™—žЁЃ•‚”žАЈЈЇ‚ŽŒ‹|‰oЂКТДЎЇЯбЯЦЧža?><9359>5728:ЦАБДРЕАЊЄУРЮЕЂœ™ЈЪЈŠ—ЂЇЇžœ—‹Œ˜‹Žu~йЮЛМКУеУЛшДŒH)2?910.3@+44ЃЈ‹ЎЗЕБЏЎННОЇЖЄЉЈЇЏЏЈЃЄЅЇЄЂœЈЗЋ‡ДЂЊЉ‘m}ЇДЖЖИМФФЦаЌЄ]?@CA@BB;<3))ŽЃЊАБЗЏЊЌАДТОКЖКИЖРЏЈЁœЈЋЎЋИŸzZВВЈЃЂЂœЅЌММ€ЛТМЪєтМ‚H17.<752+)-0ЃЉАЊЏДЖЋЇЂЊЊгФУФРМƘāŒЉЫМЁ‘–~‚~p•А—žЈЉЖДЖЛРРФЗУјцЗ^JN7%-$&2-,+ЇЎЏБВВЕБЎЈЉЧЫРЖИСУШЪЅ”МшШ–‚‹[aЉЕ––‘–•ВНЈЎМЯОЯпёЩЂƒi[L(10,($"(ЈЋ˜ЗММЗЇ…‘ЫщОАВКОНТЉБжК‡u‹ЂШЏ—”‚ЄЈЄŸЃЃЄЅВДИЏФЯыхЁŒ|NJF?5983.-ЄЈžЊёяЧдЛЂЄ›ДбНЕЏКТНШЌЊЋЖЅ‡w›ЄЈЂЁЁЊЏЊЅЅЂЁЊЌЕЖШШашЦЏУЈT;7@:9;297ЌЋЃЃЪЦТУЭЦЌБЎьз•ЌОжЩЭКДАЄДНЎЂЃЇЊЋ—›ž›ЃЂŸœЄДЎНЛЧЯЫМЛЦЎV4):>;<432Р™ЇОклНЖМОМДЭўеЩйшйпЫ‹ЅЈЏЋЇЄŸЊНœYeЖжЪЋЊžОТУУЪЭЭдЯВe@:GEHFG90м–tЖРžАЦДДБ™™ШРЎЫдгпЩЕЃЊЉЇŸœЃŸ•‘u:8kОаАЉЊБаФЩгедЩЫЮŽGAJC?CB;0О]r~ˆВ•ЏАЕВИИРЖИЗЛФУЖЯЗЎКБЋЅЁЂ•™žЉ™{o›ЈЋЎШВТбШШджьбЛВЈG@CB@@€{AB——„ŒЅДЂЛяЫЩТМИВЗНЩЦЩБтт›ŽЎЌЎЁЁ˜ЇМКЧЂ•Є…ЄЗЗНЦЩЮЮжэпСОк|5?A@FFCHЅ‘ŽЊДЛАРФФТМВБМЪЮеЯЭцяУŠЉБЈЅœ—›ЂЁЄВЌžœ™ВбВТФШЦФЭЯеЛБеЁZU:A?43i”oQrЃЁЦИЖЗДНЛВБЖОШЦШСЫЮлЩœАБЎЅЊЅЌЌАЋИМБЂŸЅтФФРЪЪЌуббНЅВЉjEJMF:NˆНВЊŠЊЊРеШБЖЛЖБАЖОКОИнчёшИБАЋœЉЂЄŸЂ”‘ЌДЄzЋОКНЛДСптўзШФЖЭзШ‹WWO15?рЅwЃьаР’œЂљОЅсЮНОЦсёрызСКзЮЕ–”œЅЄЊЌЋЎРсШРДЃБЛБШЪБРРЛДЌ•NM]JAEИЖЌЅЉЩЩЮЇЊШЛКНФШЫкСзѓж›‡БўўрЇ‚tЄЇЉЅЁ™tЗЮНЗЎ‡ОщЯЭШЧЭдИАЉxG$%:0ФЅУБЉЌЂжпЉ…˜ЧТРФЭЭдемйўу—ŠŸмщжУЏВФЦЊЅЏЊАМЦДЈЋœЌжюЯДкШНСОž|‰V711НЛИxu{q‘епЪРУУТЦЩЪЫждеыјхССбцрАˆЇЌjg{kСНЛЕЋЇЌЕМа˜‡ОЩ™›ВКЊ…x;#%УщЭЂЅЂБЖЛУШТНТРКТЊЎДЌаљёшмНЩгїЫŒŸБА‡qt‘МРРАЊЏАЕВЅŸЅЈ–ЛРД™qke4,МŘЅЎЊЃЂЋЕСРЕЕЗДВА–ЛўЮшщѕнŸ’жщШЃРЎЖЈx~ŒЁЊЮЫА‹ЉЉЎЉЄœКЫЖЄrFE8-0ЕБАЏЗЏЅЃЃЛРТОЖЖЌЋЌЖТЩЎВняЪЊЖРаЮЖЖЂ•™—”ЃКЗднНŒжкСЅЧєпr@EJce@,*,ЊЉЋЈЈЄЁЃžБдЭНБЇЂЅЊМЗДИДОЦУУЫмужМЕВ™—Š„žбЪзШЃˆzВЮЌƒm{‚OECF@2-1-*ЏАДВДЅЂ•‹ЄИЕЎЉЋЎЎЌЏШаЩЧФЧРТЭЮЯОЦКЏ˜i‘…ЗШЩЧЁŠƒЄЗ{PPM^dY8HA84$!#ЗЛжЩЉ|ЖЌžЁЂЃЅЌАЖЛИЛЗИОдлгЮТФФЩмРИАТСАЋ–‰ЈЖКБ‹q[^TYV`QHGEEOEG?%$ЋЎК”ŽŒœЇЇЎЃg„ЩЏБЖЖЕВЄЏЯгѓткнЖТФСŸЌБЛ””Ёž–œƒbehQQ?2P[MGALIHC<42)ЅЋБЄРИЏЌœЅžŒЖСИДЖКИДДЗРЇАдљћУЗРСМЎЁР‡‘rO^ZE8HBIFHTQPTPMNOG<3)(ŸЈВЌЋЊЏДЖЌЄЈЗОНЗНРТМДАВЊЈЗЭЧЄМУКЏŠmœ„vpaQ@:@HILEGBCLNUPHGIHE?..(ЄЋАДЎЈ‘АдКЖВЗВНЗНРСРБЊЌМтщпЧ—›‹|VgVJW@S<@>GFEACFGMQJGC@@€>79B@?AFOIHHGIPVOIGMFA;<@FJLHHFE@AISMJCEBBIVNHBFHOSWPINUULGI[N€с`PWqqageek^PV[pPhouj^dJTea\T?hk…jœН9F]j:$%++ "%)+C>Ji|nbLPOVZghienmgS[wetbg|WA\;Iq[{ˆ’ƒ…~Ÿ‡7*]i;,8,"+7#%8[GBN]~™mY\QW`hjb]]ebc’mJr~м›Z:IA"&#%,(4j?1MP4Pe‰Бc^W[dYTZdkpnmrkd[dhmpgTTaSO8>q‚rw‚ƒŽЎ›a731*%&(CbG;@8*(8@!-2494"EP}Љ]\ad^cV4Z„wvnicdeagqmpnbQSa[NPG@$OБ‚~‡ˆ‘M>5$! $!(0- %OA>NGid\UZcb^\pqdhIZdg[WSW^Š~bWqddNUIPSbqƒЊО˜Єt2-)!"&%1., 2MC$,\F@@$))5>GF8\E]Q„ƒebgvm^cSbbcc`pЈ‡Цn3I^NG]L—zaYcbewŠ‘ž„L!5[Ÿ—j ;C3::,5?83"Ÿ~V^dttoitzrgP^e]YeOq}ŒaMZWVP-NzdrromjŒ–Š‘Z0:jc9! (4>:,54,?FAeNHЉjtikgijgrmzuxGUŽo]ZZ`[aUi\C>5 Pz[:nžŠZgxˆŒ˜‡[1@CE!$);,& *УŽVGgda]d^cnwuehjac`egeb^BEI~c-Ub2+kЪхŠŒŒ’‹”ЉH;$-%)!-20"$8mЎ”PapnaW]bdtoppqjxkjbkv‡g,L~ыrN\W^U^{ŽŸ|„„œE0I?28&*#+02<8HAМб…gpk[^b^jderxvrxih[ajZC.1N‘E4NMIT}„‚v‚Œ…‘ВjJIO;L*"$+0>38F‡Ђw‹z{jgd\cUnkƒqoieebcn|ˆ]d~…~n>TaYd‡Œ‚…‹ŒБ„U0,5&#.17?>B?}peikmqZNSrŒŒ‚xkjrpijh`^ijeA7@a–„{…„~|…‹œЂА};1#)!!%*,4;.++жžЄ„uŽp8Lm`c~zrqoqV[Yri`hi^o]a[e~‡z‡…r|‡—›Ј™ЇZS3E-*&1-5:3?>+4wЌ”dhizuYVbuovvquup`YbQ[jddgpoqj`ecbdtpw…ˆ‘ЁœЊh!&).(,28+#7.8,au}{pkpmb}tnhkmi\oqt^‡‡tOW\jqYWaaextozƒ‰‘™”{ЉžC,<9324;)-.0-&?tЃ{{qcugƒžЖvYknkoanji\Š~~nZYZjj€Uuj^ƒ–‹‡–’ЂЊŒ–p?,*(,*$".32>B2*103^oru{x„qkr‚‹…‡ˆ…xja`iwkn[G(Pqvka]gTejŒˆ}}Š‚”ЭЕ„Z92533€'0%(1!+pxqptwuw]hqtŸžŽ‘ˆ{\wc]p•ƒgZPGJC7Zx`]r}‡owƒ|ƒ–рСzoPEN4))(.urkt{v}v|erŠŽ‰uŒ”‰’{c…ЖigSdQ"1tv^ThhapŽx{„™ˆ—ВШgWbO?$$.3)*&&juu[z~rcM]И”‰rŠ…„„nOwœ‚VCWiƒpU^Npuqjg`phpnu’—РИn\`F?C>8037-9igdxСЪŒžxpdcx˜uxˆ„‹‹o]i}jJCM\gmbUgpzockike}…ŒœЕˆkŠŠ:7-><:7%,7vthqˆŒ–’‹rutУЋe~Ђ’™‚ˆxtr~p`upxu]^gmdmmajkwq~‰ЇЎ}‚ƒzJ-&:4>2<94dg„•Ќz{Œ…~‰qЇхЎœЏНАДžh\extrnkph{`EF%:x™Œ}th‹ŠŠ‰’—•Ё‘{T51CEALG<3Вg>Qu„kuv~{c˜„‚ЃЏЇМ•‹Tet}vii[mbWS55˜{to}•›ЁЉ›—‘’k<+;EBLA97˜.CILve]xj‚…œ‡ƒ}™œŒŸw}pom`Y[\d^`C;Wop‚Ž‚‰›˜Ÿ™АШЃ}un;.IB;EI>?I>Nq^M[Umo‚v‡Ž{uŒ™ЇЃЄЊНТ–TowpgVa\kiquzd`c|Ј‚w‹ž‹ŠžЄЃƒ{•zOO:AF89pYB1ChŸ{xz‡‡|zŽŒ”Œ˜›Є–ov{t`]kkrxjƒ‚vounМАˆ”Ÿ{ЛœЈ‘rvwYEEHI;Z”‰}rWwuŽЃ‘~qv‚z‚„Š‰ЏОУЛƒukZgagikW]tkhHt|‡„˜ЛИјД™’}™ЄЊTWA35<Вjdae‰‚ˆƒncvw‚›td•žmj‘…oh@"(‘Е—nghxƒ…„ˆ‡„АŽxtzЃмжЧЈ—ЋкЊ`o{rM;?WcŒ‚zrovw~uj{}kŽ’ˆw]eg;2}}crpnhpq}˜•z{{v{v\•чЅЧРаЛkcЊЦ—jŠ{|zLJ]it—{Ut}z‡{p—Š~nVC@<,(&‚xw~x|vvj‡ƒ‡‡„xxt~‰ЁxИбЂw‡ŒЋ‚‚darm`w„|œž„\CUЖБ˜u›йСY8:)4!„Џ•i?{‚kdkrxunƒŽŽ…‡”ЈЏЇ—Ž›™Д•ˆ…’‘ƒ…k`ƒŠ|…jVOQ[\PJUVOL>C58F>1,n~„b]UYt}wnF\Ђ{z|uq„–žпШЖЌ‚ŽЂ‘hxzcemtie‚nHO`NF:&US`LJCJE7A>22kpwxŒŒ{uiko]{ˆˆ‹||‰…{„‹v…Ахщ—ސ–‰‚jaWZpY>IN@4>BCB?NOYVNHL8C;:3*ev{~mpt‹„okv‰‡‚„x‡‰‚v}~}ˆЂЂq–œeFueba\M:,4:AH?9B;GLMWOE@8B94)kp}…‚ug|Јˆƒ{ƒvŠ‹‹˜ˆzq~”ЗЧС™cbz{tbE\PPS?L;8;;ECFBA4LJPTQB?8\HM%,-584EZH:&8Z>7ENu’COT\MVNMFFOM€ЩSNHBF?-8@EGGJJLFGHGHUk|m8NPJIMHLE@@HP[WJHOSBB7LZwONSPLPTHLLAL@TQMGNGGH3?BIHCNHLHIHQTZi~wEPL3G@7:B28:3FML8GFB@>2?>4A@FCFHH99GLLH?3GHHAGNJHLGB::@HH:EFCBA@LE?ABCNHSSNPTUILQbZџ€ЉPkoА›VQe|mYL`[GPSUZWZ…hHOLOUJY^I<3  05VE?\с§§їєїїYWPŸŸ‚`pqo`VTSPLEIO]jO@Zzq}zYdpN-51 !#(*732<;]пћњєѓєM^`•И~OzйЅc\LCMOF@>Uh|tQ?ijjo][H4Zk%#!$+(0,O:?H@Gwьћ§яѕ13Nm{}j‚YT`LL>5Lpˆ^]bZ‡œ\egB?gkƒg.&"#uC;@HOQљћњїW\ƒwuƒwvˆajhjS>?ed™{BOV;Qƒ‚ЛЉi4PŠvwZ #.4^3Sm518Е§ћїcAZI]n‰wpoh}‚cQYQLmŠ"MN]c^gc›„BA[dmpL) ")>30.0B1B:aЦ§љWj]MISv›|u~xЎЉ[:LkmdacTG1ohJiАgSPdhvj5З  -4*&+CB989gпћc{eSO\T‡˜ˆ‚j‘znt\BdYAS[[UVWQT‹œzJJ`rnae>   &€š;<;LNCzэxmYbQSx…ИЊvgTaWGZcg\``bUJLg~}GZ[qkoob>$)  #"#?-839Y?V}›vtn``\Yjv|xidPIT‹jSLPV^ZpwuotnIuu‡z2,9"!,$&$4EMJ`NmM1TSu|b`cw{rxhggcgkZNG`c^awdhh^UŒƒpxjU@ ##!".8MFC +za]]PeidtЁrkv|`{jg\FPQUnrcOZVYPiq‹˜ƒOIdv8" #)!)%WGBG"*aqYMca^Y`ƒj`˜~xS;&T\jgcbaVQO>e`dvŽg\]ƒj-%,"+$#(&"0VJNP&4AeQZbTI]Šƒ„vpgwaqjeQdЗУ‘iZZieZ[p`hoxa[j‰‰S +(&" )((8`T@>0&>prhmadcŠ‚ruovpp€OnpSZTgJNdpe]cxvdtЄŸ}7VZ„7- ..*&-+A8.9!`Ї‚gcng„Уuvu`hqepcV`bP>^kYYZbjjiœРЋ…OTm‹^1!" !"*CZN? ;—žmh]eˆАˆ~|ucdmmgim\wqhab[^YVgjxw[k]u‹v‹j& $-#WC?>eY;|ЃoGH[~Џ‘rtd|ƒqxmx…—wM]hodkhaea]SFEhNHA)#8*#&(2)3($(t”vYZuvwrhd^uucga’kk]^dhrqZ]g‹MOm&8B&,"$+,*$8!B}wehiknpw|pjmgaxŽЂ’Ђ{qd[hzvz˜i09 ($%#EcdE& &*#&*(+32-#-‡ˆZbaT[qwtrxt]`^g‡‰…vc`\ivqiS?:;1#@ˆ™>!!!.*397-A>87vz‚aacduwvoxoЇЛ˜|œ–jW^hj„‡T"%+Œ’Q;24!*#!.-%;>\h‚™~ueg}}wrd™жР‹{\gj[cuŽe& ($" Mv…](##&5,$4-!(7#!a~Žˆ…v]P@v~wgxƒЉЄm^jb`OG7љ  ""€ е 2˜Ѕ„ ,-24.3.2- *V„gdtƒWk‚hw`ЄжžЂДŸju„}eQI-7 !* .EЉ‘`F!%$--$0.75"!%k‹ŠŽ‹Td^kbinЊБЃЎУj^J@8,M<++"#%$#,"%*5G›Š{`k?5ca{\W^iFBQ85-523"& "%)$)0732.Q^z`jv—‡jd{k>4-&(.,3.3qg„qZ9@W!0)-,%02!1,,15:0Hp…ŽG[mrxwzvweizY?(("-%#Cii.#2:EUxL->55-14372#(%&8J;?^Ѕ‹•‰mhhqzxwnx„„c<-(1)(,#*$2(c~H*Fok<3&$7,!:0.(84-125QSb„ƒƒoirwxux{vgr{‹‚C.L4 &*-5-!3c578B0 &7(!0#SY`~uЇЋŽ‹qB?Mu{|x{xz‚rB9t$01#% ?2*5( *&%#("J~[^vx’—ƒ[^}z‚|{rzt|‰‡`’[ (% &:("4114)(g–В‘]gVŸТКŽh]xzut{rmpxuƒk  -,$)(,452GV”Œh}Šp…~„‹‚‡„wxunir‚‡ˆ’5 !,%+.-)0,)"5;OpzŽ˜‰‚~ƒwz”ƒqkvuz~Œ„mj{Мю70""%(.2:02)*!)%i‘‹q^t‰žЃŽktwƒ„|tm`t{zv|~~‰xŽ   8BA@?9351TcVkžВ˜˜–ˆ‰Š‚„„’ƒ‚ˆ‰tjp~trrƒ‚……    "21-7&1$131Y|Y\И›˜„}”›‰–•Œx}‡q[>E{htqrˆˆ…‹    094.&(@>7UuIt‘owˆ˜ˆ‚hЈеЗЊЏЕЎЄ›{‚kH[ignv{x‚ˆ#  $3#8}CBgvVkebh•З‡{~Ž…Œ‰ŠŠ˜К”Lipko|‚~ƒ‚ !0),,&0!BLu}rropog‡КЉx‡”ˆ‘–„‚Œ”Е…IUbhq‚x~v{#,(%  +$!.1$277Yq^|hr}b{ЗО‘ŒŒ‹|~—‡Š~qkw~npvvrnuƒ   $"! 0!%>J˜„Ž‘МЄ‚cJcxŽ‹‹ˆ}…}‹ьс„kБЁqvv~z}    !G) +%$C% 8[[d{x”ФРYPo‘ОЁ—‡‚~wQprЇŠr}Ž…„…‰‰ƒ‡u N*& +Gn2F?hŸ‡Yb{z‰Ў„U\~~u‡„xzwidЁЊЄŠvrjigwˆ{„{  # .VG(Vk|Ÿ~qgŒ‡~}j™Ј|„{’›‡…|zxmА–ЌТАƒzaadqtƒ…|{ %)!"07)Imƒ–œ}‘‡”xЯЉE:)::9GQTSO[gbwЇ‰ƒvk]ЅŸ™j[ciz˜‘‰ƒƒœ‘uug~ЎЛЁЋ—ir~…# 2H>9;A>:A8JO:\zgSPnx–Р‰nipЪкЦŽewnސ™Šq~™ž‰zQoЋМД{px}}# )13EJLF:7AA?GG4TxceFY|БŽ}ƒwr‘}‚Š}wrЄ‘‹p{‘”„wpv‘БЏqTp…!""Ф+0@<>FBB>4;E81,4Fƒpehaimƒ„‡‡„„xЉ~|~”Ё”‚hvŽœ›~{gY‘”…wiˆŽ„€иЃДВпб™‘ЏТЕŸЅžЂЄЁЅЉЇЄЉЪЇaŒ˜ЄЄЋЃ‰H7VQ1#-+(#"*;^LCcщўўљјљљЅЊ˜йыШЁЖаЛВЄЃŸŸœžЃЇЅБ”СКАББЋБ•~c>:LA47"!&,&<..CAbсў§їјї•ЈЇйёС‰ЗўтЉЃЁЁžœ–”ЊЊУТЂ…ЗИЕЎЈŸzЇАLOHLxюўўљљuq”ДСРКЊЭЩЧ—ЇЃЄ—™‰œМЮАЌЅЂгуžЅЌŠx•ВЩ™J82;5-*"")"pE?ASUV™ўў§љ—`ЃОЗСУЦУЫЌЕИОЃ…ЌЗпТ••’ЋРИяяЖr”ЩЩО…;4C8-*!$3+h>Vn12:ЛўўљЏŽŸ˜ЄКжУНЗМЛЭЛЊž—–ДЮpj—ЇЉЕЏИЖеУ‰”ЋЕКИq@I:3#*!-2:74@H5G;hШўўЄЃЂœЁРнУОКЦђьФЁŽœЂЋЄЉЉЂ˜ЛʘЕшВЁЊЊВТЉ[:!#")-4FG99;oхўАКЇЁŸ›ЪзЭЦАЩЗВЖ”™ЈЋЈЈžžЄ€žЫлКžЄЋДЏœcB0:""##&A?5GMEяЗЪЎЎЉ™•ЛжясЮЗЂœЉžžЄЋЇЈЉЎЏДŸЖЯЦУ•žЈЏМДИ‹Y?>B!%($,<;>49]>W–ДнУЋЏБЌЏœЊЏЭНАБЋЅ•–ЮЎЄЂЈЋБВСТОДЋЅ„ВМОСЌ[HPG&-3-&%&#$,0(8MGQhuВ—~Ÿ–АЖДЌЏЛОЛНЕЏЋАЕЊŸ•ЅЋЌЗбУЋЋЏЏ˜ЧдТДЗ‹mT0$*00($#*"1>NHE?NЏЉЃœЅЋАЋЗТШОКОФВТЖЏœ™ЃЎЎЏЕЇЁ–ЅЄЏИСйО’‘”ƒL70$%#€#%%14[H?HELЈСЃЃœžЃœЅСОЕИЛРЫЖЄƒx›ЎЛЖЇЌЌЊЄ—œЊЅЊНгЏ•žИ‘GCF2)"#&!(,(#%77VCIUGHmВ™ЂŸ–ЈаФФОЕКИЇЕВŒЌьєаЎЋЌЊЋЇЇЊЌБЖОЂЄКЕt-E7+!$1..0*nYB:TBVИСАЋЎЌЉЮЪФМКЗМННЛЕŸ––Њ‹•БЏЎЎЏЏВЋИмаВp’СУQ1C0$*.-,:5;@TU:мТВЏЋЋбєШНМЕАБЕЗЏЎЉЄЈЈЎЈЈЉЇЅЇЊЅЃНпеВžЊЪ4FF4"B[LG@7$iесЛЌАЋЧшУКОМДАВВ€КЋ›МКЌЋЉЉЇЃЂžœЅœ––МРКЩЃH255""$[GEAzh;YКнЛ›ЃУщбАБЗОТРЖБОУзнЛ‹ЉЋЊЌœ‘–”„bgŸ{^]I2A`<4"!)1-*5-C23?лСЅЈЎНМКИВДЖЖВДЇТЪЭЪЉЋЁЂЌЉŸ‘”Жo7vŽ:J\;1Wa5!%&%("!$)20:;N;bШУЌЎБВЕЛРНОЛАЌДЖЧпЫлМБЄЁЅЈЉВЪž[W3*AJ89?,4t”ŠY4%(*$&&"$*,-8:@<8B@HAСЭT8<4.320**0),3>CQS>B”ЋЩШдЪЛБИМУЦУЌаўёТЏ”—–ŸЅСж‘V<-;7,-4:<?:84897177>18O‚ШККМУ—ЏФМЖЈлљдЮнаЏЂИЦО•vdPW..:539B8:<8H4bпб‹Z48;>532289595B>8>@LБЮЪзУ™ВБЋБЏЋбежгпЩЎЁ‰eLGhWMC;@@?E>9>B0@CrгдС™H9@I3,+41%)2:@AEIVbЛрлЫцОЉАЉЎАЃАаЯЅˆ–ŸmBE+![LZc?>8:99:+24.,):5GLQQBBШЗЌЏЇ–ЃЄЇВЕЗЏЎВЁЊ•>.I?AIGCFE308;740.4CIHF`LqАЦИВАЈЋТзЯЏŸЅСТE@#287ACC<24&+2?;@GG<%IЉФЋАЅЊ—oP4..)+(0+CB<@3<<^НЮЗЋЇ|tДлЪЛЂЊЂqF?N@@C<<>9?>891>IA>EJU>€#9rЃœЎЏŽt’Њ„›Ÿž}`?5]QQIFA:<>@7749>?A>BL-eЖжскУВЮЧ‘TFW??7<48>><7-B~I‡Œ™™ЃЄЖВ~BLE9CIQB?<378@;243?;?GOE9QЕлаШТМЖЎЋ‰Z3$45;1550434LVQ”›ДЉЉЃЎ™Œ{J9PMPWUBA4.:;>C??ACGFIJ?FЅнцЧЦЫЫспУЈЇ\7;;>5847-.*817M{ЁЅЉЌЊ•nhO@LIMSV^JA>A84:ABBEBFBEGBIˆЏЗАУЦРТЕЎТЂNA97<9>;;?@E>0(G”ЌЪЩЊNWn:LSUPMLIMGCB;>>AJ>CBIGLF:ZВФЉЉАЭТУФШЩУЗ|EI<:03578;F@@39zЇЁ’ePIMOHN\ZMWH@CHFGEPHGGJFHOO2EYЮлžАВОТФРМЖЌЉДqN01.252;8BEE55\œ–[7?:NPO\…ZFIE\YSwжглЯЖЉЏЛРЦЧЦТДКФА‚L@:?;:5>;@@B>GC@~‘jAA€л>E?BL?irИФчјЮгВƒ‚žЧНООСОМКЌЏYS}*#178>C95873>.1\HC@CHCA98:FCA@;?@;(7AbЊСŸЇМйЪнрТŸБФРНТССККДЛБ‚Їm#,85<92,.,00<49BCAABH;4;BBJMHAE?G;>G—ШѓлЂЇžШтѓєйЏЃРРТФОКВЎБЗЎЏ~441)+&*)#*)452;99BAA@A;B4:?FCGSJBT—\`МЇАЕДЊрєЯЧШлбдЫйаЭабйўпЂЕНООЧЮЧООТ1.+*&$%.*"#14AIJG`e`ŒМИЫЯРУУКЎЫёјкйкаЫЯЩЫЪбйЪЗДУЪРКУЧУСС€ОУ*$#%&)+*%%0;?>AGIP,EQSLJIJLPY]b[…ЗБЁМЪтлёдКЏЕњўћЭЎИЕйтбгЭЯбкйЮЦЇБйюћщШНСНОЪ-0.-1;HFLTVNJIJQWUVQ~ОЕЌЄЈЮчђйЩЩАОжзЮЮЧУЧФхййУЫбймлбЗКОЪьхЗ›ОЧЩЩ083-8FIOTSQICHPONTAL]КТБАДДЗЩЩЭЮЮЫаЩббЯЪЩЯккрТЦШллѓгаЦОžжуЮСЕаеб€§]„КЈk[p‚hamjekjgund–u3Ycghrbpk^5.U\9 ,191&0%:FE@QIqьўўњјњ]koЈЯ–V›юТkkcd]b[dSp”„hNz{„|whWHu…H.1.$).774;ASJQgZ^‹ћўўј§ABb„‘•’Ё”enuo]QSgƒ™qkwcœЗtx{WFnz•w?897-(0.$1100.|OUUijeВўў€ y§m3hŽˆˆ˜Š‘v‡ƒˆnSZu|В’Yae]p‹‘дЧ„Ce—Žo87A%&$#30,%#(E9eA*^„IEIЧўў§xWkixЂ•‡‚|™ƒkmchxЉ>?gurxwƒzЌZ[vˆ…`9F3.($(5:21?J:B@NTHVOxеўўnvnmacЖ‹„Ž”ЯЫœqWd{|wqwg\PŒ}^{Фxgox„•ƒG<)%((0<<9APVGOJƒёўpŠqceiaЅБЂ—~œ‡‹dbrvgjjpbirtnЁЇŠ[hnƒu~T:,(2&1%$$&4!,J^Jba[‘§ˆ‹{pqgjžбФЅ‚tdvgdqvnoopxwbjˆЁ”‘[rq…‚ˆ~vTF;E*2*-$*5,7G>GH+SoS^Ђ—В……|rvtk{„ЄŠƒ||h\ZЇ}e\cgngˆ•—„|‚T‡ƒ–˜ˆF4((8472,!1("5,15&*CIPQWU9mК’|xw‘г’ŠˆŠvw‡x{}mnxnn~toim|wpЁЯР•bn›n3HE9&%#0*:VnW[30$UЋЖwz—Ч•‹”Œ|v~xxwgˆ‚x|otrkxtƒ„pzuЄ•ЊxA$)((!(*-010q]ZW~j8OЖ‚g[nФЄ‡ˆ~—™„Œ{™РСŠ\p}~zxjprnphQV~nY[?4:T@?+1$+0+&,)9:@BB@*3;ŠЋqmƒ‚„~ƒxwƒƒ}uœ™Єž~|ivv‚vknpœ^3nƒAN[13IO1,+.0-+&3"471GG@HQBZ•Œ}|~{…ˆŒˆ„ƒoxŒЅКЊК‡‚zm|~„‘ЎiEH-"@B:>?4:Zzx]>017,8.1973B@O>B@;LŒ˜txtnt|ˆ‡‰zot™–˜Š||muŒ‚{Ђg)8N9-aPT<9JЈЕQ2.-8A0@>0?BEL(EZQTQ•Š‰trt‚}……ƒЫаЋŠДЎ|h~}ƒ™˜d4C3$8?@G%:ЈЅnL@A8:>:C.75>A?8?ЂН( 8LHCE?@EA34L4,1>`—t‡–j…uОцДЊШИ”|Š’›{jiNV1.0>4274<>8G7YМЄqT;;:A<;>?@:C;:BE4C1:‚Ѓ›Ћ–ewvp‚ƒКНДЛжА}vaTFIaSFEB8@C@9:AA08Q[ЛЅ‡v>5GH2.><52,:AAIFUNTАЅЈЛˆeup}xo‹ЖА‹bhqG:>#VPObC7,912,:E>Yc‡–}‹xiGiA*A0918AFEOHI?@AJ;(E––v~krwnQ819;<>F5GJMF)0;QЌŸ‚uvPN‹ЎŸovtJ>AL9><2<:2<,8MLNCF+]‡БКА‹Ј›tI@`JBBA5>A>;H*JxJ`^bpiitv‡{e8CF2PL[L:+7$BA;3.37?750.@>E:C&*B{˜”}dNVg;LVZ[MLSEHHG8AB5NNHC5ZАuv}—„Œ’•‹˜hFMNBFAJCFGNg`NmСЃЋwtv~‹‘›™‘‚„•–pEC7>AB8AAGFB:G5@v’Z9F>UrYTHMSHAJOGHTNPHJ8Pndo–œ˜ž„z‰–Ž’„ˆŒž–QBL]I,>B??FI>F1#1WwO.2CNML,9>B@9F8@*5>\’–kqŒЌ—ЌЊ™kx•—‘’Œ……Žž•qАu)59LAA9&&:3&78?59FGE?575LMJFI?>79>A‚ЋШДkzi˜ИЯЯДwo‡‹ŠŽŒ~„„”Œ˜ƒ<$?52$3+$,35*4<"45<;C@<;.878BGWmЖЈ‚{”ЁЂЃ—˜”ސ’…ƒz…‹œO4,2(.050&(44C425<>AGEHG>?7?4G<897E@JITMLM3>;?ЃЂ‡q‰ЁЌВŸŠŒ”›žœŽ~|~‚”‘›‘•‡™‚œ"+#%(("#&%!#153:,7:AHSNUVQNLFhwpЛНЌЎЏ™Є›˜››ЄŸ™žЈœ‹z”–‰Œ’›–—+,3,#"(+,.#1.-5A:.?FJPIAEE@HHp‹xuИеЕБ—–ЋБЄЎЎ˜Ђ‘x[[‡ŠŠГŽŸЅ19$&3,,*%3))*1&5GGPG;:4BBFEAIBNWJqŽ}›–ˆ‰œ•w”бЯЇŸЅЈ™™Њ—žЂЅ‘ƒ~АŠ}Œ‰ˆˆ•™)13*"*!2A5?2CFG337<912+&M`S7Q|ˆv}‡ЄЄЇœ•ŠŠ˜ЏЗФНЃž}‘ЁУТЂЉЇЈЅЅŠ…”—АЕЇ–Љ‘—’!>5>@<0<+@02NhBJFQjcpŽnu‚ЂЃЇŒ„ƒбэдеЂƒWЏрФБЌКЈž‹…—МНК}’˜›”"914>?>OYQ@?VtPTTUW`jcbho~–Їž˜Œ{tВРНД„hrˆЎЊ™–žЌЇŠˆ~™ЩзЛФЏˆ‡”’™.)2.5@&FSUPMNTVSYbcPnŽ~ek~‹ЗВЯЁ}пэй{…}ЈЃЋŸ”ЂЌДЂm‡БЮзЫ–‹‹Ž‰—7@24?@BJP^ZUINSPOc\Ibƒtuag‘ЛТЈ—ŒˆžЈ˜—‘…ƒˆЗЌЄˆ”—ЁЊЋŸ‡ЧТ…k—˜–5;;>?LVTVYVZLOPUPSJFNƒxxwp„–•‹–’Ÿ™ž’ЂŸ‘‹—ЊБЉ•‡•ЉЌЋБ’„oЊД›•~ЅŸ3џ 3џўw 4џў€5џў€6џ6џ6џўw7џў€9џўw:џ:џ:џ:џ:џўw;џ;џ;џўw=џ§wџ=џў€џ ?џіїєїјњјљћ§њњ§ћњјјёњћљћћјїјјљљ§њљњњыћў§њћјјљћљњўў§љћњњ§њ§§щљћњ§§ћњѕѕєѕїњјћљїјљљњјїїыѕїѓјјћњ§њ§њљјјћ§њњ§§љљчјћ§§њ§њ§њўў§ўћўњ§§ћўњ§§јїїљѕєїњјњїїрћјјљјњјћљ§њљћљћљћљћћљ§§њњљљћћїћ§§єўћўўљ§§љ§љљјјўћїїћјњјњїїъѕјјѕљњ§њ§§љјћћљљїљћ§љћћяљ§§ўўљўўћ§њ§§њўњ§§§ўњ§§§ўѕјјнљћ§ћљћћњјњјјїљћјїљљћ§§њ§§ћјїјїјјљљњњћ§љ§њњљўћљљё§ў§§ў§љјїћћ§љјљљўњјј§њћјјњњјјљљјјчћљљјћ§ћљјјїћ§§њ§ўўћ§њ§§љњњ§єѕїљћљљњјњјїљљъјїјљњњљћњћєєїїјјњјљљћ§§ќћљњ§§ўћ ўўњ§§ќїјѕїїјјљљњ§ћў§§њњћљљ§љљюјњћћњјљљ§њ§ўњ§§љ§ўў§ўћў§њњј§§єїїљѕїјћњ§њњ§ћњљњїјњўўѓћ§§ћћјћћњњ§ў§§ћћњљњ§§њњљћўњ§§їўСј§ђѕїњјјєїјћ§§ћњїјјћ§§§њ§ўўѕћўћ§§љћ§§њ§§њ§јњўўњћњњ§§§њ§њњі§`Њљ§њјїјљљњіљјјњјїњјљ§§ѓћњ§њњћћў§њ§њ§§ўљ§§іљњњ§ўћўћў§§їњљNBЊћ§њјјѕћљ§§љњњјјњјјљћљчѕћјјћљћљјљјћљјїљњњљјјњњљ§§№њ§ўўњњўўL[{с§њїѕѕєщѕјљљћљ§ћљјљњћћ§њћљћ§њљћћї§ћњњўў§њћћ§ќњ§њўўј54PЌј§јїїєћїјїћњњё§њјљјњљћљ§§њўњ§§јљћ§§ўўћ§§ў§ўњ§§уњљњњјњљў>IBeВљ§§їјњєјњј§њ§§ћљљёњ§§њњ§њњљјљљ§њўў§§њ§§іњ§њњ§њљњњ§§ўї8EIOjЮљ§їїўјїї§ћјїїјљё§ўў§ћћљљћћљ§њњ§§ќљњ§ўўўњ§§њњ§ћ§њўўъћ:3CB3[м§њјљјїњїћћїјћњњ§ыњћћљњјњљћљљ§њ§љ§ћў§њ§§єћўћњ§њ§ћћњњ§§ўхCIPPLO~љ§ћїјјљћљљћљњћўў§љјљљ§§љћ§§ўїњ§њћћјћћ§§њњ§§њ§њњя§ј7CMU:9UТћћїїљљ§§ѓћ§љћћљљћљћћ§њњћ§ўћ§ўўї§њњљљћјћ§§ћцљјћћ§њў§§?Feжљ§јљљћћљњ§ћљљјљ§§њ§ѓњ§њ§ћњњћћљћ§ўўќ§њњўўъћ§§ћћ§%3@IHH0,A§§ўћ§јјљїјћљјљ§њ§ўўё§ћћ§§њјјѕљљ§ћћўўћљњ§§ћў§ћћъ§409M@@5gPTЉљ§їјћ§њ§њўў§ўњјјљњћљњ§њўўўћўўјњљ§ўўћў§§ћ§шў00795>AV;9NЭ§ћјјћљјћњњ§§њя§љћљћ§њ§ўњњўћўў§њњ§нњћјјћљ§§ўў8.8::@LPW?A›§ћ§јјљћљњњўўћћјўћў§њњ§ўўћћ§љњ§§їњ§њ§јљћњўўУ§њљњ§$$.;@:$IdUUZСљљїјј§њ§ћјљљћћјљљ§§ў§њњ§§њ§ј§њўўњљљњ§ўћў§§љљтћ§§њ§љ"%&0:99I9,QU^ƒ§ћўљ§§њ§њ§њ§§ўў§њ§щњ§њ§њ§њњ§њјћћњ§§њњћљћћ§§э$(1535391#GVZ\Зћљњљљїћјљјљњњћўў§ћњўўњ§§§ўњўў§о&-1,8AFG18Ld\Z`ч§§јїїњїїћћ§њњћїљћ§§ўњ§§њј§ћњ§њљ§ўўўћўўє§њћ*-+:>??GNNіTGJH’ј§ћ§љљя§њњћњ§§ўњ§њ§њ§ћў§§њњ§њњ§ћљљўћўўнљњћњњ89>A?BIEBJNIHA@ZЧ§ўљњћћљјљњћћўўўћўўњћў§њћўў§§њ§§рћўўћћўўћ91,7>9.3>?HC4$<4;H@9CSTwпћ§ћљ§ћљїљ§§ўўћўў§љѓњљ§§њ§њ§ў§ћљћћц§W20<@>LE>7<5BIHHQPPO:nїћ§§шљњњўўњўўћћ§њњ§§љљјњљћ§њ§§љњўћўћў§§їi3A@LJG@HH§EHIIђCEI?4GЃ§§ўјїћ§§ћњўў§§§ћљ§§ўњўдћўњњўўбj95NG@>GNIMIOLFGEJFA;]У§§љћћљјљћљјњј§§ёњјјљљћћљћњћњћћ§§њрљњўЃtQQHTC:>:HHLNHQYƒјћў§њњѕљјљјњљљ§§ј§§њ§ѕњўўћ§ћљ§њ§њњ§м˜ƒrW?^:I:3?C@@>;5>BEOiU^Дћ§§њљљ§§ўў§§њ§ўњўўўћўўаћўў§§њ‘…ŒoJP?.92:C979:?GGH<9#)Pцћ§ћљ§њћћўњњћћљњ§§§ўћўўў§ўўнћњўўЄqLCA9E@<5;:3>BHPQPYW7Bˆћљ§јљљјјњљћљљ§њњљ§ўўњ§§њњ§ћњ§ћњўўХћўў}ˆ„wUaWYC?9#05:>@GFBLNQ40?Џћ§љћј§§њ§њ§§ћј§њў§њћћљљћ§§њ§њњк§њћ§њљ|{|e4*&;83-378CB@EMM1EQˆє§ћњ§§љўњ§§ўњ§§ўЫћўњ§§ўўћўћў§ћ}|vŒ›aB9,3-@:>88FEPJLLPLE?AMcZNGMQ;-cљћ§њїјћћљљјјљљћћ§§ўћњ§ћћЭјљњ§ўњћљћћzЄЖ}~c|]C:CJIELGB>?CIFCEHABGqљћ§јљћћњјљћћљљћњњљљћћвљ§љ§§ћјјљ§§ŽЅСЏƒJNŠИrG@BGB9GHHFFNA:;:[Y]HЇћ§јљљјљў§њњњ§ћњљћ§§Цњ§§ћћљљћљ‰ŸИžzvo‡ЁxHHMNJG?31GECћ§ћљњњї§ћњњјљјљћћјШїјћћјљћ§§z‹ЂЏЊœ‘v„•tG@W]\TIGBJBJFMFEIO&Mы§§љњњ§§њ§§љљћљљјћљ§њњљћљљјаŠ|ƒЂž›Š‹–bJI@LHCCEF>78:?@IN:IЛ§ћћљљњњљћћљћ§њ§§ћў§ўўњ§љљјљћће„}k—Ћ›—Œ‘—ЖЖЁqMNMEJE9@8BBC:AJ[^Jˆмћ§љљњљ§§ўўћњљћћјјКћљћљћљљјћћ…‚z~„ˆ—Є™›ЋО‘ZAF>:4ACAG8?;538CHJOPOV]ТћћјћњњјДїѕѕїїњїјћ§њћ§§ћћјћњ§{r{„ƒˆŒ…~ˆСЫ—dQEIFIGF@289GUUOS\cŽћћњјљјћјљњћћљњјљћњ§ћљљўјљљўћњїљјљњљњћњ§§§ћљњњўљћћњїљњњћћ§§ў§§ўў§§ќћњњћћљ§ўўћћњ§§чћ§ћњ§§ћњ§јјљјљљњњћњњћћљњљљ§њљњњѕ§ћ§ћ§ћњњћћ§§ћќњћћ§§ўў§§ьў§§ћ§ўў§§ћњњљљјјљљњљљђњћ§§ћњљњњћћ§ўћћљњћћњћћ§§ћњњћ§ћ§§ўўў§ћћњљ§њљњњљњѕ§ћ§ћ§ћ§ћњњћћњњћњ§ћњњіћ§ћў§ў§ўў§§ўћ§§єћ§ћ§ћў§§ћ§§њњѓћњ§њћњћљњљњњћћўњћћіњ§ћ§ћ§њњљњњћ§ќњћћ§§ћўњћћ§јћўћћњћњћћў§ћћўљњњќљћ§њњљљњњћћ§њњћў§ћћњёћњ§ћ§ћў§ўћ§ћ§ћ§§ђћўњћћњћћљњљњњћћњјћ§§ћњљњћћњ§љњћћѕ§ћњћ§ћ§ћў§ўўј§ў§ў§ў§ўў§љћўўћњњљљёћ§ћћ§ћўў§ћ§ћ§§ћћёњљњћ§§ћўћ§ћў§§ћћїў§ўћ§ћў§ўўњ§ўћ§§ўўўјљљќћњћ§§њћ§њћћњњт§ў§ўў§ћњњ§њћ§§ћўћ§ћ§ћњљћ§§ћ§§ўў§єћ§ћ§§Ъўўѕјљњњыћњћћ§њљљњњћћ§ћ§ћў§ў§ўўњћ§ћњћ§§ћ§јћ§§ў§ўў§§њћ§ћ§ћ§§ќћhЖўўќњћ§ћћ§яћњњљњљљњћ§ћ§ћ§ћў§§ў§ћѕ§ў§ћ§ћў§§ћўўђћ§ћ§ћ§ћNIЋўў§њњћћ§ћћљњњўљњњћўњћћў§њњцћњћњћњњћ§њћ§§ћњњљљћћ§ћ§ћў§§ѓў§Fc‚цўўљљјјїїќјњњћћь§њћ§ћљњњ§§ћћњћ§ћњњћњњњ§њ§§ў§§їћњњћ§§ћ§ўўї§90YДўў§љљљјљљњњћ§§ѓћњљћњўћ§§ў§§ћћ§ўё§ћ§§ўћ§ћ§ћ§ћ§ў§§јў§AOIaКўўѓљњњћњљ§ћ§ћ§њћћ§ўћ§§§ћ§ћћў§ўўі§ўћ§ћ§ћ§ћ§§эў§§ћ§ћ§ћў§9HNVpеўўљљўњћћ№њ§њљљњњћћ§ўўћћњћћќњћћ§§њћ§ћ§ћ§§ўћўў§ўћ§§ќњ§§ўўюA3H@3bтўўњћњћљћњћњњ§ђћ§§ћњћљњљћњћћ§§ѓћ§ўўћ§ћ§ћў§ў§§њ§ѓћ§ћў§3jUZЎўўњњ§їў§ўћ§ћ§§њњћ§њћ§§§ў§ўўќ§ћћўў§тћ§ћћњ§ћ§§)&1;@EFW@AUгўўњ§ћћњњ§§ћ§§ћњћћѕ§ћў§§ўў§ўћ§§тћ§ћ§ћ§ћ§њ§ћњћ§§ў§-4:<@EJUWAIЂўўњћ§§ў§ўў§§ў§§ўћўўј§ўћў§§ћ§§ћ§њ§ўўщћ§ў§ћ$,5C<:2Pk`Z`Ъўўњњ§§ђњ§ћћњћњћћ§ћўћ§§ђћ§ћ§ћ§§ў§ћћ§§ўў§ћ§ћћ§хћ&+35;<;FneI8gыўўћћњњћњћћ§ћћћ§ћћњћћћў§ў§ўў§њфћ§ћ§ћћљњћћњњћ-$+15BN>3QPb‹ўўѕћ§ћ§ћ§ћ§ћ§ўў§§ћ§§ўћ§§јћ§ћњњ§ћ§§цњћњњћ§ћ,1523:@80$?UZaИўў§ћћіњ§ћњћ§§ў§ўўєћ§§ў§§ћ§ћў§ўўў§ўўў§ўўо§ў§ўў§ћ:;9.0>HB93PgbYhщўўњњћљћњћњ§§ўњћћ§§ћ§§ўћ§§ћ§§ўћўўш§ў§ўћ§њ;;A;>>GGMUVSJPE˜ўў§ћўћћ§њњ§§ћў§§ўќћ§ћ§§ћўњўўћ§ў§§@@>щECBIMGOPI?Vаўўћ§њњћ§ў§ўўў§ўўў§ўўіћ§ўў§ўћ§ћ§§ўћўўо?@E<>?:9;FEGHNmwœњўўћ§§ћўћћљљњљћњ§§іћ§ћў§ўў§њћћ§ћуњћћ9843FJ@;:@GLBH@WbОўўћњћ§§ћћњёјљљњћњћћњњ§ћ§њћћйњћњ§ћ§ћ§§ў§ў§§ћ§ћ75>;CC>:+4?E>2*$EhЧўўњњўћ§§њћјў§§ћ§ћ§ўў§§ў§ўўў§ўў3ю7+32-0..BPMEC@UTtўўњћљ§њћ§§іћ§ћ§ћ§§ўћ§§ёћ§ўўћ§ћ§ћ§ћ§ћ§ўўн§;9<4@A:4;QTTYZUMFQQБўў§њћљћњћњ§ўў§§ћањћ§ћ§ўў§ўў§ћ§ћћњћћ§ћ§ћBCjhaZH;;ABIT][Y>CT~яўўњћ§§ўўћћѓ§ў§ћ§ћ§ћў§§ћўўћ§ў§ўћћ§хLAUTQPIE<>?JPU\[Lkƒ‡Рўў§ћћ§§ћћњњћ§§ћё§ћ§ћ§ћ§ћ§ћ§§ўћ§§дћ§ўў§ўўPG>INQM?8>BY[уўўћћ§њћњћћ§ћў§ўўў§ћћќ§ўћ§§тњћњћњћћoBC>?<9-1;CBJLO:#*Uьўўћћ§§ўў§њњћ§ћ§ћўўі§ў§ўћў§ў§ўўт§ўўЩмЫЉcNOILIAC>4;?ACOY]^[;Cˆўўў§ћћ§ћ§њћў§§ћ§§јћ§ћў§ў§ўўеФЪУЋzuc^LF>;2.5?GHLNTZS54@Еўўћњ§§ћ§ћ§ћ§њ§ћ§§њћ§ўсћ§§РЛЛЖИ|AA$?<<903;<@IFELQ+GU‰ўўќ§ћ§ћћѓў§§ћ§ћ§ћ§ћ§ћўў§шћў§ў§ў§ћњСКРЏЪФtOB:?H??>>ьAHAHTSNPGIЩўўћљњњљћ§§ћ§§ћ§§јњћњћњљњћћжњ§ћў§КСШщхєЇk^JPVMCHEAHJI\h[OA<*n§ўўњ§ћ§ћ§§ўћ§§§ћњћћд§ћћњ§ћћњћњћ§§ћЛИЕёцпЊZ?SV`UMOF;C@ECITYJC;‰ўўПњћћњ§ћ§§ў§§ћћњ§ћ§ћ§ћћњљњљњњљњљ™ŒФЦЖФРЧЪ•I2@MME><;:AHMAFMPPJzЅўўњћ§ћћ§њњђ§њ§ћ§њљњњћћњ§ћћ‰њЪУСМОТЪЫФЩФТФАcLJ;59@?<527BMNTYV\`Шўўњћљњљњњљјјљћљћњњћ§њ§ћћњ§њ§ћЫШРММРШаЫФФЛккžjWFNNBCC;:5ENOVZYhh–ўў§§ћ§њ§ћ§њћћљњћњ§ћћў§ћћўњ§ќњћњћћ§љў§ўћћњћћё§ћ§ћ§ћћ§ў§ў§ў§ўўі§ўћћњ§ћ§§ўўїћ§ўў§ў§ў§§юў§ў§ўљћљћњћњ§§ўћўћћэ§њ§њ§њўћ§§ў§ў§§ћўћўўђ§ўћ§ћўћў§ў§ў§ўўў§ўўќ§ў§ўўі§ўћўњ§љћњћћїњ§њўћ§ћ§ћћї§ћў§ўћ§ћ§§юћ§§ў§ў§§ћ§§ў§ў§ў§ўўђ§ў§ўћўњўћ§њ§њћћ§њўњњњ§њњћў§§ѓў§ў§§ћ§ћ§§ўћ§§ўў§ўўє§ў§ў§ў§ў§ў§ўўњ§ў§ўњћћўў§§§ћ§ћћўўћћь§ћўћ§ћ§§ў§ў§§ћ§ћўћћ§§їў§ў§§ћ§§ўўўћ§§њћ§§ў§ўўѕ§ћћ§ћў§§ћ§ћћўўћћў§ћћўўћћ§§ћўћћ§єћўћ§ћўћ§§ў§ўў§їў§ў§ўўњћ§§ћнў§§ћ§ћўћ§§ў§§ћ§ћўћўћўћћ§§ћў§ў§§ўў§ўўў§ўўћњћ§њ§ћ§§ўш§ў§ў§ўћ§§ўћ§§ћћ§ћў§§ўў§ўўќ§ўћўўў§ўўў§ўўўћњњў§ћћёў§ў§ў§ў§§ћ§њўћўў§§ў§§ќћў§ўўє§ў§ў§ў§ў§ў§ўў№§ў§ў§ўеўўћљњњћњћћѓў§§ћ§ћўћў§ў§ўў§ћў§ў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўў§xЧўўщћњ§ћ§ћў§§ћўћўњћњ§§ў§ў§ўўќ§ў§ўўќ§ў§ўўі§ў§ў§ў§ў§ўўі§ў§ўў§^ZЕўўўњћћ§ћўћћњћћлўћўћ§ћ§§ў§ўћ§ћ§§ћ§ћ§ў§ўћўў§њўћћ§ў§ў§ўўў§ўўь[t’ѕўўњ§љћјњјћњћћ§ћ§§ћћ§ћћ§§њўћ§§ў§§ўћ§§ўј§ўћ§§ў§ўўїOHjТўў§§њњыћљ§ћўћў§ў§ў§§ћћ§§ўў§ўўў§ўўќћў§ўўќ§ў§ўўў§ўўќ§ў§ўўў§ўўњWdZ|Шўўщњћњўћћ§ў§ў§§ћў§ў§ў§ў§ў§§ћўћў§ўўі§ў§ў§ў§ў§ўўњ§ў§ў§ўўїM^`d|сўўњњєћњћћ§§ўњњћћ§§ўьћ§ћ§ћ§ћў§ў§ў§ў§ў§ў§ўўћ§ў§ў§§ўѓQCZ]Crьўўћћўћћђ§ћўћ§§ў§ў§ўћ§ћћ§ўў§§ўќ§ў§ўў§§ў§§ћў§ў§ўўј[e`ngd•ўўіњўћўћ§ћ§§ўў№§ўћ§ћў§ў§§ћў§ў§ўўд§ўћўћ§§ў§ў§ў§ў§ў§ў§ў\[ceQLgгўўњў§ў§ў§ў§ў§ўћ§§јћ§§ў§ў§ўўтћ§ћ§ћў§ўћ§ћ§ћ§ћў§ў§ўT[^gZ]Yvыўўќћ§ћ§§єћ§§ў§ў§ў§ў§ўўў§ўўє§ў§ў§ў§ў§ў§ўў§№ћ§O]^gjwU]‚ьўўћ§§ђћў§ў§§ћћ§ў§ў§ўўљ§ў§ў§§ћћ§ўќ§ў§ўўќ§ћўIIј\d^:;IIW`gqPZАўўњћўћ§§ўўќ§ў§ўўћ§ў§ў§§њў§ўћ§ўў№§ў4>AWLV;\…tmwзўўћћ§§ў§§§ћў§§ўі§ў§ў§ў§ў§ўўћћ§ў§ўў§кћў§ў§§839MQ^Oa‚\G}јўўћў§ћћ§ћў§ўћ§§ўћ§§љћўћ§ћ§ўў§їў§ў§ўћћњ§§№ў?B7CLOaO)C`g{œўў§ћў§ў§ўўў§ўўђ§ў§ў§ў§ў§ў§ў§ўў§хў§ў§§ћ§§ў§ў>>4FOMUMP8VijpЫўў§§ў§§ўћўўў§ўўќ§ў§ўўщ§ўCGAMFMW]JIbtwnzїўўћўћћчўћ§§ў§§ћ§ћў§ў§ў§ў§ў§ўћў§ў ў§яFEGNNS[cdcjgacVЄўў§іћ§ћў§ў§ў§ўўњ§ў§ў§ўўі§ў§ў§ў§ўћ§§ўш§ў§ўGPJMQQY]ZZcddZSjнўў§§§ў§ўўў§ўў§§ў§§ўюHUMTNJIEGTY]aeƒ‹Їўўљћў§§ў§ћћѕўћ§§ў§ў§ў§ўў§№ћў§§ћўћ§ћў§ў§ўћ§§вGH9VQULISPZZS[PdmЪўў§ўћўћ§ћ§ћћњњћ§ћ§ћ§ћў§ў§§ћ§§јћ§§ў§ў§ўў§ыўG@2HZ[QFISUVP>9:O~Яўўѕњћњћћў§ў§§ћћўњ§ў§ў§ўўќ§ў§ў ўьC:+@BC;>A>Yh`[]Wd^ƒўўўњћћ§єћў§ў§ў§ў§ў§ўўњ§ў§ў§ўўі§ў§ў§ў§ў§ўўыABF?FPMNJddjqxneYmcОўўћћ§ћ§§ўў§§ў§§їў§§ћ§§ў§ўўи§ў§ўћ§ћў§ў§ўJLtnheTNLIUdiuokVQbŽњўў§ћў§ўўќ§ўћўўў§ўўў§ў ўрћ§ћ§ћў§ў§ўNGW]VOPNSJUbihpuk~›žШўўяћў§ў§ўћ§њў§ўў§§ў§§їў§ў§ў§ў§ўўњ§ў§ў§ўўцTL?PPU\SMGN^gnpvNZpr‘ѓўўћ§§њћў§ў§ўўё§ўў§ћў§ў§ў§ў§ў§§хћ§ћў`?BNS\]UNJGQTa`ghdhcO„ўўњ§ў§ў§ўўў§ўў§єћўћ§ћў§ў§ў§ўўф§ў§ўv?QP\b`TV\ZW\^ec\VWVF`Бўўћќ§ў§ўўў§ўўђ§ў§ў§ў§ў§ў§ў§ўўў§ўўў§ўўтш|GFc`\PY`c[[ad^^`ZaSUxрўў§§ћ§§№ћ§§ў§ў§ў§ў§§ћ§ћ§§кў§§ћў§ў§ў§ў§ўЏ‰jtb}`QOVWZZMWY[\\ecpn˜ўў§§ў§§ћ§љў§ў§ў§ўўў§ўўмћ§§ў§ў§ў§ўЋ|xW|[ePNSLOPSYVSZag‡irЧўўћ§ўў§ўўє§ў§ў§ў§ў§ў§ў ўо§ўЏ›—}YmSLQMNVGJGNSYabTN33gјўўћ§§ўў§ўў§ўўхЄЛ–…VT[WZVSQJILQVZdprvqNV˜ўў§јћ§ћў§ў§ўўі§ў§ў§ў§ў§ўўт—Ё”‚b|pqSTMMVpœўўю§ў§ўћ§§ў§ў§ў§ў§ў§ўўў§ўўк§•„ЁЌuUOCOMSPLSSW^Sbgide]Vдўў§§њ§њћ§§яћўћ§§ў§§ћ§ћўћ§ћў§§ўу”•АЫНеЁmSZ\[ZZYV[^\qzrbQL4ўў№ћ§ў§ў§ў§ўў§§ў§ў§§§ўћ§§яћ§ћў§§’މуЯФZCWiiяa^YTSUJg{r`^tmaЏўўў§ўўЬ§ў§ў§ў§ў§ў§ў§ў§ў§ў§§ћўŽ”œ‘txЉHCdbdccWSO`b~okh^cNBўўќњўћ§§ћљ§ћ§ћў§ўў§њћ§ћў§ўў§пћ§ŒœЊЩ’‚‰gQOZ^abZVWUZ]h\`^kZ]aўўћў§ћћњ§ћ§ћ§ћћ§§ћ§§Ућ§§ў§ўћ§ћ§§ўЈМајZV™Ш}YMZb]WUSO`[`[\OPojtZИўўћћ§§ћћ§ћў§ў§ўћў§§ўў§§зў§ўћ§ћ§ћ§ЌБУК‘ˆƒ™Ў„Q\ejcWLMTYZ\Ya^gk^ZO›ўў§§ў§ўўЗ§ўћ§§ў§ў§ўћўћўћћњћњ§ea›ЉŠœŽ—Ђ„@?J[[UHNHPNV^bdkde[I\сўўћ§ћў§ў§§ћ§§ў§ўћўћ§ћћз§ўњћћўћћ|…БЕЈœŠ”ЃЌŒ^Y[aicT\YN]W]W`Z`kTTЊўў§§ў§ўў§ўћ§§ћћ§ћ§ћћћ§ћ§ћ§§бў–ŸВСТДЊЃƒ‘ŸƒPQmuujaWTUY\\c[Z[g4\ћўў§§ў§ў§ў§§ћ§§ѕћ§§ў§§ћ§§ўћћо›‘’ЅДЕДБ–œЇrWYYb`]cZYZWYYO[\bIYЩўўўћўў§єћ§§ў§ў§ўћ§§ўў§ећ§ћ§ћ§˜‚ЋСЕЏЄЁЊШТЋgjh]^Z`WPaZWVVdzxb–юўў§§§ў§ўўќћ§§ћћ§жўћ§§ћћ§ЃœŠ‰”žЉЊМДЏИФŸnT[OTTUV[YYSQW`jb^ˆБўўќњ§ћ§§ўћ§§їў§§ћўћ§ћ§§жћ§ћ§™•ˆ’ŠŽ•Ÿœ’ЈКЎkUPJLTQMSOIJV`ggmnomдўўћћїњћњўњћљњћћ§§ў§§§ўћ§§лў–މ‘ž™—”Ž–бкЃraY``\UOQLP]enjppw{Јўў§ћћўћў§§ћўћ§ћ§§ўРўw=§џw<џў€;џўw:џўw9џўw7џўw6џў€5џўw4 џў€3 џўw2 џўw0 џ1 џ1 џўw/џўw.џў€-џўw,џ-џ-џўw+џў€*џўw)џўw(џ)џ)џ)џўw'џўw%џ&џўw$џў€#џўw"џў€!џw џўwџџўw џ џўw!џ!џўw!џўˆ џў€ џћ§њ§ўў§ў§њњ§§њ§ўўј§њ§§љ§ўћћљўћўћўћўўћ ўўћњњ§ќўћњ§§ћњ§ћў§§ўњћўў§њ§§ў§§њўў§ћњўўўћўўўњўўщљњљљ§ћњљ§њњ§§љњјљњћўў§ўўјћўћћў§њўўћўёњћўћћўћћў§§њўў§§ќњ§њўўјћўўљњњ§ўўўћўў§ўўћў ўўћўў§ўѕњ§§њўў§§ўћўўъћўў§§њ§ўўћњўћўўћўћўў§ўў§іњ§§ўў§§њ§ўўі§њњћ§ћљњ§ўўѓ§ўўћћ§§ћ§љћў§§§њћўўю§љћ§њљћћљљћљњјјћ§ўўњў§ћћљћѓњљњўўћ§ћў§њ§ўўё§љћјњћљћ§§ћўўћўўѓњљјєљ§њ§§љ§§ўўїћў§љћјјћ§§§њљ§§ўќ§њ§њњў§ћ§љћјњўўћћћў§ўў§§ўњћў§љњўўќћ§§ўўћў§ўў§§њ§§ьњўћ§њ§њњљћњўў§§њ§ўў§§ўћњ§§њўўљ§ћўћўћўў§ќћј§ўўћўў§§єћњљ§§њ§ћўўћ§§ў§ћ§ўўђ§љљћјњћ§ўћўћћўўљљћћљљњ§§ўњўў§єљјјћ§ўћћўў§ўў§љќћўњўўўћўўўћўўўћ§ §ўўћўўњ§ћћљћ§§њўћўўі§њ§ўћњћћ§ў ў§ћўѕ§њјћњ§§ўў§ўўўћўўјћјїѕјљ§ўў§њўќ§њљћћїќћњљ§§ўєњ§§ћўўћњ§ўћўўіњ§ўўњ§њ§њўўўћўў§ћ§ћћљљћњїјљ§§њўћєўњ§§ўўћћўўћ§§ўљљњ§љћ§ўўќњћљўўі§ћўў§§ћ§§ўўщ§њ§§њћћљ§ўўћњ§ўўњ§ўљњ§ўўњєўћћўћњ§њўћў§§њў§љњћњњў§њћўўњ§ўў§ўўћўўћќњ§ћ§§ўњ§§ўњ§§ћщ§њ§љћ§њ§њ§њњў§јљњўўћўћўўњўњћўњњ§ўўњў§§њ§§ўўћўў§њњ§§ћћўў§§ў§§їћ§љћ§ћњњ§§ўћ§ћћјўўўљ§§ўњўўўћўўўћўўѕ§љћњњўўћ§ћўў§ўў§§јў§љ§љљ§ўўя§њј§§њћљ§њљ§§ћљњўўѓћ§њ§њњћљљћљ§ўў§њ§ўўўћў ўќћў§ўўћ§ћјњ§љўў§њўў§ћњ§§њ§ўт§ћљљњ§ўћўў§ўћўўћў§њ§ўўњњћљћњњўў§ў§ўўћўўэњ§§ў§§љ§§ўўћўўћўћћўўњ§њ§ўћўўўњўўќћўўћћљўњљњ§ћўўўћўўўћў ў§њўўћўўљћўћ§ћћўўўћўў§ўћ§њј§њћљ§њћўў§њ§ўўщћњ§њљћў§љјћўў§љљћћ§ўў§њњў§ѓћљљњ§њњћњ§њњ§§њћћ§љјљљ§ыјљ§њўћњ§§њ§§ўўћ§љ§§њ§§ўњ§њ§ћ§ўў§ћ§ўћ№ўљ§њћљћњњ§љ§њўћ§§јњћћўћћў§§њ§ўўљ§§§њ§ўўёћўћњ§ћўўћћўљњ§ўў§њў§§ўћўў§њї§ўў§§њњ§ўў§њ§ўћўўїћўћћ§ўўћўўј§ћњћ§§њ§§ў§ўћњћўћ§§ћњ§ўў§§ў§ўћўўўћўўўћўў§ўѕ§њ§§ў§љ§§ћўўћњў§љјћњљ§§њћўў§ћ§њњќўћњ§§ћўћўћўўўћўўќћ§§ўўњњћћњњ§§ћњћўњ§§ѕљўћўў§њћњњ§§ўў§§ўўћўў§њћ§§љћ§§ћў§ўўўћ§§ћњљљњўў§ћўћћћў§њ§ўўўњљљ§љ§ќњћ§њњђўћў§ћјј§њњљћћ§§ќўћћ§§ўћў§§њўў§ўњ§§ёњ§ўўћ§њћљњ§§ћћўўў§ўўў§ўў§§ћ§ўўўњ§§ђњ§§њ§њљ§ћћљ§§ўўњѕ§ў§њ§ўўћњћ§§ћ§ўљёћљћљљ§њ§њљљјћ§њњј§њљљ§њ§ўўїљћћљј§§ћўўљ§ћћјњњћћўљћћћљњ§ћўўњў§ўў§ћљ§ў§њћ§ўўј§њїїјљћ§§§њ§ўўі§њ§§љњјћћ§§ўћўўћўў§§њўў§ў§јњ§ћјјћ§ўўў§ўўіћў§§ћў§њ§ћћ§ўћўўўћўўњўўћўўљ§њњ§§њ§§њњћћўћўўў§ўўќњљ§ўў§їљ§њ§ўўњћљљѕ§ўў§ћћљљћ§ўў§љћјљљ§ўў§§ў§§ў§ћў§§ўўћўўћўў§§іњ§љјїјњњў§§ћћљ§ўћўў§яўћў§њ§њњћўў§њћћ§ўўљћњњ§§ћўўѕћўћўў§§њћ§њњў§љњ§§љњўћўўћўўыћњњ§§њ§§ў§§њ§њ§њ§ћ§§ўўўћўў§ўћў§§њўўўћўўћўљљјљћјљћ§§ќјљњ§§ћњўўћўўўћўўќћўћўўћњљњ§ўћўўќћўћўўћћ§§њўўђ§њћўћ§њљ§§љљ§ўўћ§ўўћўўђћ§§њ§§ўўћўўњњўўј§ўўћў§§њњўњ§ћўљ§§ѓћўўћў§§њњћўћўўћ§ўќћўўњњтћўўћўњљњљљћљјћћљњ§њњ§§њњ§§љ§њ§§ћћјћ§ўўљњ§§ћљ§ўўљ§њўў§њ§§њљ§ўўћњ§њњў§ўў§ўњ§§їў§§њњ§љњ§§нўњћњћњћљ§њўћў§љ§њ§§љњ§§ћ§§ћўћњ§њљњ§§ўў§§ћј§§ў§§ќћ§§ўўњћѕћљњ§§љїїћљ§§ћјљ§§ўў§љљ§ўљ§§ўћўўћњљљ§њњ§љћ§§§њћљљњўњєљјљњ§њћљ§§љ§§ьћ§§ў§§ўћћў§§њ§њњ§ћћ§§њє§њ§ўў§§ћљњљ§§њё§ћљ§њњћљћљ§ћјњїїєљјјљ§§ћћљћљћћёјљ§§ўўћў§јј§§њ§§ўњ§§љѓјљњ§§њ§§јњјњ§§ћњћћљ§§ћўјћћхјљћћљћјјљћћљћљћћ§ћј§њњ§ўўћўў§§љ§§ўшњ§§ћћјњјћњ§љњўћ§ћўўћњ§њ§§шњў§§љћљњљљ§§њ§ћљљћљљјјћ§§њћњ§њњ§§љњ§§њћћљљћњ§§ў§§ъњ§љљњњћћњњћљљјњњ§јћ§њ§§љў§§њ§§њњ§њўќћўў§§њј§іћљњјјљјїєїїўѕїїљјћјћјљ§§ѓћљѕћ§ћћ§њ§§њ§§їћ§њ§§њљљ§§іћљјњљћћљњјјњњјјљљћћљљћћљњ§ўў§ёњ§њљћћљћјјћћ§љњњ§ћњћљ§њњ§ѕњћїїљњњјћћ§§ѕљњ§§ћїјњјљ§§љ§§јљњњйћ§§њњ§њћћњљјћћљљћћњ§њў§њњ§јњјћњјњјњљљћљљїћёљћљљћљ§§њў§њљљ§§ў§іњљћљљћћ§§ўў§ўїњ§§ўњњћљћћ§єњ§§љїјњњјћћ§§ќњ§љћћ§њ§ўњ§§њ§ћ№§ћў§ћљљјљћћ§§ћљћћјїїћљћћљћјјћћјњјѕїјћћјјјїѕјїјњјћћѕљјј§§њ§ћјћљљьњ§њўћ§њњљћљћћљјћћљњћћљїњћћјњљћјњњќћ§§љљќћ§§њњ§ќњўћўўќ§ўўћћўѕћљ§њћјћљћљ§§љћњљћњћћшјљљћљћћ§§ћњўўњћјћљ§њњљ§њњєћўћўћљ§њњћћљљїћњњћљјјњљљ§јњ§љљћљљ§§їљ§љ§њ§јљ§§ѕњ§§ўћўў§ў§љљњ§ћэ§њ§љћћ§§њљљћљљјјљћ§§ћ§љўњњ§§њљљїјњ§њ§њћћљљћј§њ§њ§њ§ћћюњћљљњњўўњњљ§§љљњћљљћўљјј§љћ§§љі§ћ§њњ§љћљћћљћћњ§љћћєњ§њљћћњ§љњњ§ў§§ћўўњћ§§ўћ§§ќћ§ћўўјћ§ћ§ћ§§ўўњ§ў§ў§ўўў§ўўў§ўў§јћ§§ў§§ћ§§ўќћ§ћўў§іћ§§ўћ§§ў§ўўў§ўўў§ўўќ§ў§ўўї§ўўћњ§ћћ§§іў§§ћ§ўў§§ўўў§ўўјћ§§ў§ў§ўўќ§ў§ўўў§ўў§јћ§§ўћ§ћ§§ўђ§ў§§ћў§ў§ў§ў§ўўњћ§ћ§§ўўјћ§§ў§ў§ўўє§ћћў§ўћ§§ў§ўў§ќћ§ћўўў§ўўќ§ў§ўўўћўўќћ§ћ§§іћў§§ћ§ћў§ўўћћ§§ўћћ§§ћўў§§ў§§ў§ъњ§ўў§§ћћ§ў§ў§§ћњћ§ћћњћћўљњњ§јў§ў§ў§ў§§њћњќ§ў§ўўљ§ўўћ§§ўўћњ§љњћћћ§ўў§ўў§§ћњћћў§ћћћ§ћў§ўўћ№њ§њћћ§ћ§ћ§ћ§ћў§ўўќћ§ћ§§њў§§ћћњњќ§ћ§ћћ§§ў§ўў§їўћ§ћ§§ў§ўўњћў§ў§ўўњћ§§ў§ўўўћўў§љћ§§ўўћ§§ёћњ§ў§§ћ§ћў§ћћ§ўўћ§ћ§§ўўўћўўў§ўўі§ў§ўћ§њ§ћўў§іћ§њљћ§ћ§ћўўњ§ћ§ћ§ўўћћў§ўћћњћљњ§§ўўњ§ў§ў§ўўќ§ў§ўў§ћњћћ§ѓћ§§ў§ўћ§ћ§ћћњњ§ћ§ўў§ѕў§ўў§ћ§ћљћўўў§ўўќ§ў§ўўў§ўўъ§ўћ§ћ§ћ§ћ§ћ§ћў§ў§ў§§њћћі§ћ§§ў§ў§ћ§§њў§ћњћўўі§ў§§ћ§ћ§ћўўѕ§ўћ§§њ§§ћў§§§ў§ўўі§ўњњљњњћћўў§ўћ§§јўћ§ћћњњљљѕњ§ўћ§ћ§ћ§ћўў§ќћў§ўўўћў ў§ўў§§ ў№§ўў§њћњћњљњњћ§ћ§§ў§ўћўўћпў§ў§ў§§ћњћў§ў§ў§§њћ§ў§ўћў§ўћ§ў§ћўў§ьћ§њњћћ§ўў§ћў§§ћўў§ћўў§ўѓ§ћ§ўў§§ћ§ћ§ћ§§ќћљњ§§ыў§ўћ§ћ§ўў§§ћў§ў§ў§§ћўўў§ўўћ§ўў§ћћћ§ћ§ћ§§ўћ§§јћ§ћўў§§ћћѓ§ћ§ћ§§ўћ§ћ§§ўў§§ў§§ў§ћћў§ў§§ўјћ§ћ§ћў§ўўў§ўў§јћ§ћ§ўў§ўўщћўћ§ћ§ў§ћњћў§§ћ§ћў§ў§§њњѓў§ў§ўћ§ћ§§ў§ўўќ§ў§ўў§§ћњ§§ўѕ§ўў§ў§ў§ўћ§§ўћ§§ўўћћћў§ўћ§§їћ§њћћ§ў§ћћ§ў§јњћћњў§§ўўћ§ћў§ўўќ§ў§ў ўњћў§ў§ўўїћ§њћ§§ўў§§їў§ўў§ћ§ћ§§ъћ§ћ§§ў§ў§ўћњћћ§ћ§ў§ўћўўћ§ў§ћ§§№ў§§њћњ§§ў§ў§§ћ§ўўќ§ў§ўў§§ћўў§єћўћ§ў§ћў§ў§ўў§ўў§ўўќ§ў§ўў§ўў§ўўє§ў§§ћ§§ў§ў§ўўў§ўў§§њўўў§ўўў§ўўіћ§§ў§ў§ў§ўўўћ§§ђћ§њћћ§ўў§ў§ў§ўў§ўћўўў§ўў§іћњўћћ§ћўўћћњћћўўћ§§ўѕћ§њћћ§ћ§§ћ§§љћ§ћ§§ўћћ§ћ§ыў§§ћ§ћ§§ўў§ў§ћ§ћ§ћ§§ўўі§ў§ўћ§ћњћўўјћ§њћћ§§ўўј§ўћ§њћњ§§ђў§§ўў§ћ§ћ§ўў§ўў§ћ§ћћ§§ћ§§№ћ§ћў§ў§ў§ўћ§ћ§ћўўљ§ў§ў§§ўўя§ћў§ў§ў§ў§§ћ§ћ§ћўў§ќћ§ћ§§§ўћ§§ўћўў§ќћ§§ўўњ§ўў§§ўўў§ўўъ§ў§ўћњљћћ§§ћћ§ћў§ў§§ћўўњ§ўћ§ћ§§ѓўћ§ћў§ўћ§ћў§ўўќ§ў§ўўљћ§ћ§§ў§§љћў§ћћ§ўўћ§ўўћ§§ыў§ў§ў§ўћ§ћћњ§ћ§ћ§ўў§ўўўћ§§ѓў§§ћ§ўў§ў§ў§ўўј§ўў§ћў§ўў§ьњћ§§ћ§ћ§ћ§ћ§§ў§§ћ§ћўўњ§ўћ§њ§§ўћ§§ќћ§ћўўў§ўўђћ§ў§ћћњ§ћ§њњћўўј§ћ§§ћћ§ўўў§ўў§ўњ§ў§ў§ћћў§ћћћ§ћ§њ§§ўўћњњіћ§§ўњћћ§ћўўјћ§ћ§ћ§§ўўъ§ўў§§ў§ў§ў§ў§§ћ§ћ§ћ§ћўўјћ§њћ§ћћўўќ§ў§ўў§ў§ёћўћў§ў§§ћ§ћўћћ§§йўћћњћћ§§ў§ў§ў§ў§§ћўћ§ћў§ў§ћћ§ћ§ћћњћћ§ћўўћ§ћќ§ћћ§§іћ§ўћћ§ћў§ўў№ћњћћ§ћ§ўў§ў§ўў§њњљњ§ћњћћњњћћ§ћўўћ§ў§ў§§ёў§§ћ§њњћўћ§њ§§ўў§љѓњћњћ§ћ§ћў§ў§ўўюћ§ћ§ћњњћњ§ћ§ћ§§ў§ў ўў§ўў№ћ§ўў§ў§ўћ§ћ§ћ§ћўўќ§ў§ўўњ§ў§ўћ§§њћїў§ў§ўћў§ўўђћ§ўўћ§ћћњћњћћўў§ўѕ§ў§ў§ў§ў§ў§§іћ§§ћћ§ћ§§ўўќћў§ўўј§ў§§ў§§ћћљ§ћўў§њћћ№ў§§њњћћњ§§ў§§ћ§ћћђў§ўў§ў§ўћўћ§ћўў§ќћ§§ўўў§ўў§їћ§ћ§ћћњћ§§їўћ§ћћњћћўўї§ўў§ћ§§ў§§ў§њ§ћў§ўў§§ќћў§ўўќ§ў§ўўњћ§§ћћ§§їў§ў§§ћ§§ўўі§ў§ў§ў§§ћ§§ќћўћ§§ќњ§ћўўў§ўўј§ў§§ћў§ўўў§ўўў§ўўњћ§§ў§ўўў§ўўћўњћћїњћћ§§ћ§§ћћ§§ў§ў ўў§ўў§§ў§ўўє§ў§ў§ў§ўћћ§ўў§ћ§ўў§ќўћ§ћћ§ў§ўў§ўљ§ћ§ћ§§ўў§ћў§ўћўў§ўћ§§ўш§ў§§ћ§њњћ§ћ§ўў§ў§§ћ§§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўўќћ§ћўў§§ў§§§ў§ўўђ§ў§ћћњћ§њћћ§ћ§§іћўћ§ћ§ћ§ћњњљћў§ў§§ћћ§ќў§ў§§ўў§§ќћ§ћ§§ћћў§ў§§ўћўўњ§ўћ§ћ§§ўћ§§ўћ§§юў§ћћ§§ћў§њљћљњћ§§ўўяћў§§ћ§ў§ћ§њ§ћў§ў§§ћў§§ћ§§њћ§ћ§ћ§§ѕћ§ћ§ћ§ћњћ§ўў§ѕњћ§§ћ§ћ§ћ§ћћђњћћ§њ§ћ§ћ§§ў§ўўћљ§ћўћ§ћўў§ћ§ћћ§ћ§њћћ§ьў§§ћ§ћ§ћ§њћћ§ћ§ћ§ћ§ћћ§ўћўў§ќћ§ћ§§њќћ§ћ§§ѕўћ§њћ§ўћ§ћ§§ќћњћ§§ќњћњћћўњљљєјњњћ§ћћњћњћњњєћ§ћў§ўў§ћ§ћ§§љћ§ћ§ћ§ћћћ§ћ§ћ§§ќћ§љ§§єћ§§ћњћћ§ћћњћћэњћњћњћћњћњћћњћњћњњћћ§ќћў§ўў§§ўћћѕ§ћ§ћў§ў§§ћњњѕљњњ§ћў§ўў§ўў§љћ§§ўћ§ћћў§ћћ§ўњћћњљ§ћ§њ§ћ§§єћ§ћ§ћ§ћ§§ћњћћ§јћўћ§ћ§ћ§§ћ§јњћљњњћћ§§ќћ§њ§§ќћ§ћ§§ќћ§ћ§§ўћ§§ў§§ћ§§ћћ§ћ§ћћјљњњћњљјљљњыћ§ћћ§ћ§ћ§ћњћ§њ§њћћ§ћ§§ќћ§ў§§ћћ§ўўћћјњљћњћћљњњїљњњћћњћњћћ§њћ§§ўўћ§§ћћњћћњњћўў§§њћ§§ћћ§§ћѕ§њљљјљњњћњ§§љћ§ћћ§§ћћјњљњћ§ћ§ћћњ§ћ§§ћљљћ§№ћ§њћ§ћ§ћњћћњњ§ћ§§ќћњљњњћљћћњћћќњћњћћїњћћ§§ўћ§ћћѕ§ћў§§ћ§§ћњћћёњ§ћў§ўў§ћўў§ћћ§§ћњњћњћћ§§ћњьљњњћњ§ћ§ћ§ћ§ћћњћњ§ћ§§њћ§ћ§ћ§§ћъњћћўў§њћћ§ћњњ§ћњћћњњ§њњїљћњћњњћћњњіћњљњњљњњћњњљњіљњњћњћ§§ћ§§ќњ§њћћ§ў§ћєњћ§ћњћљћњћњћћђљњћњљћћњљљњњ§ћћќњ§ћ§§ќћ§§ўўћ§ў§§ўўы§њћ§§ћ§ћћњћ§ћ§ћћ§ћњљњњ№§ћћњћњћћ§њ§§ў§њћћ§ўў§§њў§ў§ў§§ўњћћ§њњћњњљћћј§ћ§ћ§ћўћћљ§ћ§ў§ћ§§ћє§ћ§ћ§§ў§ўћўћћў§ћњ§ћцњ§ћ§ўћњћћњњћњ§ћ§ћ§ћћњћњ§ћ§§§ћ§ћћ§§ћњћћэњћњњћ§ћ§ћ§ћћњћ§њћћ§§њў§§ў§ћћ§§њћћѓњћњћ§њњћњ§ћ§ћћ§ўћ§§јћњћћњћњћћэњ§ћћњћњ§ћ§ћћњ§ћћ§§ћўў§ўўў§ўўњ§ў§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ўўў§ўўя§ў§ў§ўћў§ў§§ўў§§ўўў§ў ўў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўўќ§ў§ўўў§ў ўў§ў ўќ§ў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўќћў§ўўў§ўў§ўў§ўўј§ў§ў§§ћ§§§ћ§ћћ§ў§ўў§§ўћ§§§ў§ўўў§ўў§ўіћ§ћў§§ћў§ўў§іћў§ў§ўў§§ўў§њўћў§ў§§§ў§ўўњ§ў§ў§ўўќ§ўћ§§љў§§ћ§§ўўў§ўўќ§ў§ўўў§ў ўњ§ў§ў§ўў§§ў§§ўў§ўўў§ўўћ§ў§§ўў§ўћўўі§ў§§ћў§ў§ўўњ§ў§ў§ў ўјћў§ћћ§§ўўіћўћўћў§ў§ўўї§ў§ўћўћ§ўўў§ўўљ§ў§§љћўўі§ў§ў§ў§ў§ўў§јћ§ћў§ў§ўўў§ўў§ћ§ў ўњ§ў§ў§ўў§§ў§ўўў§ўўљ§ћњњўћўўќ§ў§ўў§ўћ§§єњ§§ў§ў§ў§ў§ўўў§ўўў§ўўћ§ў§§ў ў§єћ§ћ§ћўћ§§ў§ўўў§ўў§ў§ўћўўќ§ў§ўўћ§ў§ў§§ўў§ўўў§ўўў§ў ўќ§ў§ўў№§ў§ў§ў§ў§§ћ§§ў§ўўќ§ў§ўўў§ўўў§ў ўю§ўћў§ў§ў§ў§ў§ў§ў§ўўі§ўў§ћў§ў§ўў§ ўў§ў ўў§ўўќ§ў§ў ўњ§ў§ў§ўўћ§ў§ў§§ўќ§ў§ўў§ўћўўќ§ў§ўўњ§ў§ў§ўўў§ўўє§ў§ў§ў§ўў§§ўў§ўў§§їў§ў§ўћ§§ўўє§ў§ўў§§ў§ў§ў!ў§ќћў§ўўў§ўўє§ў§ў§ў§ў§ў§ўў§ўћў ўў§ўў§ўќ§ў§ўўў§ў ўў§ўўќ§ў§ў ўќ§ў§ўўќ§ў§ўўў§ўў§ ўў§ў ўћ§ў§ў§§§ў§ў ўў§ў ўі§ў§§ўўћ§ћўўћ§ў§§ўў§ѓў§ўћў§ў§ў§ў§ўўіћў§ўћ§§ўћўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўў§ќћў§ўў§ћў§ў§ўўњ§ў§ў§ўўў§ўўј§ў§ў§ў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ўўј§ў§ў§ў§ўўќ§ў§ў ўќ§ў§ў ўў§ў ўњ§ћћў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўўў§ўўќ§ў§ўўі§ў§ўў§ћў§ўўќћў§ўў§§ў§ўўў§ўўќ§ў§ў ўў§ў ў§ўћўўј§ў§ў§ў§ўўњ§ў§ў§ўў§їў§ў§ў§ў§ў ўї§ў§ўћ§§ў§§ўј§ў§ўћ§§ў ўќ§ў§ўў§ќў§ў§§ў§ўў§ўўє§ўњў§ўў§ћў§ўўњ§ў§ў§ўўў§ўў§ўќ§ў§ўў§ўћўўў§ўўў§ўўў§ўўњ§ў§ўњўўі§ў§ўћ§ћў§ўўў§ўўў§ўўєћў§ў§ўћ§ћў§ўў§љћ§ћ§ћў§§єћў§ў§ў§ў§ў§ўўјћ§ћ§§ў§ўў§ёўћћ§§ћ§ћ§ћ§ћ§§ў ўў§ўў§§ў§§ў§ўє§ўњњћ§§ў§ў§ў ў§іњћћ§§ў§ў§ўўњ§ў§ў§ўўћ§ў§§ћћўў§ўўљ§ўћ§ћ§ў ўў§ў ўњ§ў§ў§ўўќ§ў§ў ўќ§ў§ўўњ§ўћў§ўў§ќћ§§ўў§ўі§ў§ў§ў§ў§ўўў§ўўќ§ў§ў ўѕ§ў§ў§ўћўћ§ўўњ§ўћ§§ўўќ§ў§ўўќ§ў§ўўњ§ў§ў§ўўќ§ў§ў ўј§ўћў§ў§ўўњ§ў§ў§ў ўњ§ў§ў§ўў§ќў§ў§§ ўў§ў ўў§ўў§ѕћўћ§ћў§§ўў§§§ў§ўўў§ўўў§ўўўћў ўў§ўўў§ўў§ўћўўў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ўў§§ў§§§ў§ўўќ§ў§ўўў§ўўў§ўў§§ў§§љћ§§ў§ў§§§ў§ўўі§ў§ў§ў§ў§ўўњ§ўћ§§ўўў§ўўі§ў§ў§ў§ў§ўўјћў§ў§ў§ўўь§ў§ў§ў§ў§ў§ў§ў§ўў§§ўўў§ћћ§ў§њў§ў§ў§§ўф§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўўы§ў§§ћў§ў§ў§ў§ўћ§ћ§§ў§§§ў§ўў§јћ§§ў§ў§ўў§яў§ў§§ћў§ў§§ћ§§ў§ўў§њў§§ћў§§ѕў§ў§ўћў§ў§ўўљ§ў§ў§ў§§їў§ў§ў§ў§ўў§ѕћў§ў§ў§ў§ў§§ѕў§§ћ§ћўћўћњњћ§ћўћ§ћ§§ќћ§§ўў№§ў§ў§ў§ў§ў§ў§ўћ§§Яў§ў§ў§ћ§ў§ў§ўћ§ћў§ўћ§ћўћ§ћћ§§ћў§ўњ§ћ§ћ§ћ§§ўћў§ў§ўўњћў§ў§ўўє§ў§§ћўћ§§ў§ўўў§ўўњ§ў§ў§ўў§њћ§ў§ћўў§ѕћ§ћўћўћ§§ў§§їў§ў§ў§ў§ўўі§ўћ§ћ§§ў§ўўщ§ў§ў§ў§§ћў§§ћћњ§ћ§§ў§ў§§ыў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўўѓ§ў§ў§ў§ў§ўћ§ћћф§њ§ћ§њ§њ§њњљњњћ§ўћ§ћў§ў§ў§ў§§ўћўўі§ў§ў§ў§ў§ўўѓћ§ћћ§§ћ§ћўћўћћѓ§ћ§ћ§ћ§ћ§ћў§ўўђ§ў§ўћ§ћ§§ћћ§ћўўє§ў§ў§ўћ§§ў§ўўї§њ§њћњўћ§§јў§ў§ў§ўћћєўћў§ў§§ћў§ў§§ћяўћў§ў§ў§§ћўћ§ћ§ћ§§јў§ў§ў§ўћћї§њўњћћ§ћ§§№ћ§ћўћ§ћ§ћў§§ћў§ўў§§ў§ўўњ§ў§ўћ§§ќћ§§ўўў§ўўў§ўўЬ§ўћ§ћ§ћ§ћў§ў§ў§ўњћњћћ§§ў§ў§ў§ў§§ћ§§ў§ў§ў§ў§ў§ў§ўћ§ћўў§§ў§§ћў§ўћ§§ћ§§њ§§ћѕњ§ћ§ћћњ§њ§ћћћњ§њўћћі§ћ§ћ§§ў§ў§§§ў§ўўу§ў§§ћ§ћ§ћ§ћ§ћўћ§ћ§ћ§ћ§ћ§ћўћ§ћћњўњ§§ў§§§ў§ўўќ§ў§ўўў§ў ў§ћўћ§ћ§§їў§§ћў§§ћ§§ўћ§§ћћў§§ўўє§ўћ§§ў§ў§ў§ўўњ§ў§§ћ§§§ћў§§ћъўћ§ћ§§ў§ў§ў§§ћ§ћў§ў§ў§§ѕў§§ћў§ў§ў§ўў§ўњ§ў§ўў§§мў§§ћ§§ў§ўћ§ћ§ћўћ§§ў§ў§ўћ§ћ§§ў§ў§ў§ў§§эў§ў§§ћ§§ў§§ћ§§ў§ў§ўўћћ§ћў§§§ў§ўўќ§ўћ§§ќћ§ћ§§§ћў§§ћў§§ћўў§§ў§§њћ§ћ§ћ§§љўћ§ћ§§ўўњћ§§ўћўўњў§ўўўћњњцљњћњљљћњњ§јњјїљњ§§њўўћўўћўўўћўўѓ§љњљљњњ§ћћ§ћ§§њћўў§њ§§ћљ§§љ§§ўў§ўўэ§њ§ћњћћљћљњ§њ§§ўўљўўєњјћ§ўћњћћўћњњљћўўњљћ§§ѕћљў§ћ§јљ§ћўў§ўўћўўћ§љљњ§§ў§ўћўўћњўћўўћўўћўыћў§њ§ў§ћњћ§§ўћўўњљ§љў ў§ќњўўћћњўњ§ћјїїъј§ћў§§ћћњњ§њњ§њњ§§ћў§љљњ§їњћў§§ўўћўўјћўў§§њ§ўў§єљњћўў§њўўћў§§ѓњ§ћўћўћўїљњћўўўњ§§ўњўўўћўўћўј§њњ§њћћўў§ћњўўњј§њљ§љљњљљњћ§њњ§ћћќ§њњ§§њќћ§§ўўљћўўћў§ўў№§њњљњљјљљћ§ћћљћ§§љѓјћњєјљљ§ћљљ§ўўњ§ў§ўћўўёћњўњ§њјјїј§љјњ§§ў§њ§јњљћљћљњўўњ§ьљ§њ§ўњ§њ§љљћљљњ§§ћљ§§їўћўўћћўћ§§ѓў§њ§§њ§ўў§§њўўќћњ§ћћћљ§§љ§§ўѓћњћћўў§љљћљ§ўўќ§љ§ўўўћўўњ§їњ§ћўўњ§§ўўїћўћњњ§§њћћћј§њњ§§ў§§ћўњњ§ћјўћўћўўћўўѕ§њњћўўћўњћ§§§ўћўўўћўў§§љ§ўў§ћњўўћўўўћў ўўћўўѓ§ћњ§§ўћњ§ћћ§ўўљћўўћўў§§ўўћўўљњ§ўўћћўўўћўўіјљћљ§§ўњћўўћћўўћўўљ§њ§ўћћўўќћўћўў§ўњћћўќћ§ћўўќћўћўў§§љ§§ў§ћњў ў№ћўўћўўћўўћ§њљћ§њњ§ћњ§ўў§§ќўћћўўўћўўќћ§§ў ў§њўћўўњћўў§ћўў§ўћўў§ў§№ўћў§§ћўљћћњўўњћўўћњљљњўўњ§њ§§ѓћњ§ћљњ§§љ§§ћ§§§ў§ўўќњ§§ўўќ§њ§ў ўѕћў§§њњўњ§§ўў§§њћўў№ћњ§њ§§њљљњ§ћ§§њћћыљћўћўўћўўћћњњўўћўћњ§ў ўє§љјјњ§ў§§њ§ўўўћўўѕ§љ§њўўћўўћўўќњ§§ўўїћў§§ўўћў§§ёћњ§ћћљљњћћў§ћћўўўћўўќ§ћћ§§§њ§ў ўј§љјјћ§§ўўўћ§§њ§њ§ўњљљћ§ўўћўўўћўўћћўўћўўќћўў§§ћў§ўў§њўњњўў§§§ўћўўћћўўћўўћ§њ§њўў§§њўўћўўћўўўћўўњ§§ћ§§ћќў§§ўўў§ўўўћўўњћўўћњўўњћўњ§њўўўћ§§љўћўћўў§§ўў§§№љўњљћћљљњўћўћ§њ§§ќњћ§ўўўћ§§ўѕњјњњљњћўћћўўљћ§њћўћўўўћўўїћ§њћўўћ§ўўїћ§§ўў§ўў§§ўјћўўњ§љ§ўўўћўўњњ§§ћљњњќ§ўў§§ўћћўћў§§ьњ§њ§ўћњњ§§ўўћћўўћўћўўўћўў§њ§ўўўћўўќ§њљ§§ў§ћ§ўў§§њ§§ћ§ўћўўўћўўњ§ћ§ўў§§ў§њўў§ўўќњ§љ§§ќў§§ўўїњ§ўўњљћћўў§ћљњ§њ§ўћўўњ§љњљјљљ ў§§ўћўўќљ§§ўўіћў§њњў§љ§ўўњ§§ўћў ўюћўњњљљћњњ§њљљїјћћ§§ќњ§§ўўўњўў№ћ§ћ§ўўћў§ћ§љј§њўўў§ћћњњ§ўўћўўњ§љў§њ§њњўўўћўўћ§ъњ§њўћћўўћўћўћўў§њћўћћўў§њќ§ўўћћўўћўўіћ§§ўћўўћћ§§ўў§§ћ§њћўўў§ўўўћўў§њ§ўўўћўўћћўўћўўќ§њћўўћћњ§§ўўћћўўћўўўћўўћ§њ§§ўўњў§ўўјљ§ћћўћћўўўћўўћћњ§њ§§єћњ§њ§ћћўўћћўў§ў§ўўћ§§њў§ћћѕњўўћўћўњѕћ§§ўў§љљўћўўўћ§§ќњ§ў§§њљњњ§њўўцћљ§љ§ўўћљћћўўћ§њћљњћў§ї§њ§§їћљњ§њ§§ћўўўћўўњўќћўњ§§§ћў§§ѕњ§ћўўњ§њ§§њњўѓћ§њњ§ўћ§ћљљј§§ћњ§љњўўўћўўўћўўљћ§њњ§§ўўљњ§њњљћ§§њъ§њ§ўћў§§ўў§§љ§ўњњљћњў§§§ў§љљїћњљњ§§ўћўўў§њњ§єњљјћљїїјћљљћћ§љњўў§јћўњћљј§ћћў§§њ§§ўњ§§ўў§§ћљљћ§§љљўў§љўњ§§ўў§§јљяћ§§ћњ§њњ§њљ§ћ§љїћћјљќћљљ§§њњћўўћўўїљјљ§ћўўњ§§ьћјћ§§љ§§њњ§ўў§ћјљ§њ§§њ§їћўћўўћћљ§§§ћ§ўў§ћўњ§њ§§ћљћ§ў§ьљ§њћўўњ§љљ§§ўўћў§§љ§§ъњћћљћљјїїјљ§њ§§ћљћњћў§§ђћјїљћњ§ј§§њ§њ§§ћўњ§§ў§ўњ§§ўњћћщњћјљњјјљћ§ў§ћњ§§њ§§ўїљ§§ўќњћљ§§љњ§§њњћўў§њч§ўћўў§§ўў§§ћљјљ§ўћўў§њћњ§§јњћљћ§§ўўћ§љњњў ў§ўёћњ§ћљћљћљњњћћљ§§§њљћћ№љњјјћ§§ћўўњўњ§§ўў§љђњ§њ§§њљћљјјљћ§§ў№њ§ўў§§ўў§ўў§њ§ћ§§ђњћўћљў§§ћћўўћўўњѓў§§љјљљћљјћњўўўћўўўњўўѓћ§§ћўў§§њњ§§ўўњјљћњћћљ§ўўўћ§§ўѕ§њўў§§њ§њ§ўў§ў§ьў§ў§ћћњ§§ћ§љњњћ§§ћ§ўўќ§ў§ўўї§ўў§ћљћћ§§ўњћћъ§ћ§ћў§ўћ§ћ§ћўћ§ў§ћ§§ў§§ўў§ўўљћ§ћћ§њћћљ§ћ§ћ§§ўўі§ў§§њ§§ў§ўў§ўю§ћњ§ћ§ћ§њћўћўћ§ћ§ўўћў§ўў§ћ§іћ§§ў§ўћ§ћўўў§ўўў§ўўў§ўўў§ўў§њ§§ћўўљ§ћ§ўў§ўўў§ўўєћ§ћ§ћ§ћћ§ў§ўў§ћ№њћљљњ§ўўћ§њћ§§ћ§§ћћ§ўўћћ§єћ§§ўў§ћў§ў§ўўўћ§§ў§ћў§ўўќћ§§ўўїћ§ћ§ћћ§ћўўю§ў§ўў§ўў§ўў§ћ§ћ§§ўўњ§ў§ў§ўў§§ћ§ўўђ§ў§ў§§ћ§ў§ўў§ћћўњ§§ћњўћ§§ћ§ќњћћўўћ§ўўћўў§іћ§ў§ћћњ§њћћэ§ћ§ћћњћљћњћћ§њћћ§§ўў§ ў§ћ§§ћ§§њћ§§ўћ§§ћћ§ћ§ћћќњћ§ўў§јћ§ћ§ћ§ў§§§ћ§ћћ§§ћњћћ§§ћўўў§ўў§њћўћ§ћ§§ћўћ§§ўўѓ§ў§§њћњћњћћ§ћћћ§ћ§§ўўў§ўўў§ћћ§ўў§§ўњ§ў§ўў§§ќћ§ћўў§ќћў§ўў§љћ§њћњњ§§їћ§ћў§§ћў§§ћўњ§ў§ў§ўўќћ§§ўўї§њћ§ћ§ћ§ўўћ§ў§§ћћўќћ§§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўѓ§њ§ћ§§ў§§њћћўўќ§ў§ўў§ќћ§§ўў§§ў§§ўќ§ў§ўўў§ўўўњћћўў§ўўў§ўў§ўў§ў ўќ§ћ§ўўј§ў§ўћў§ўўі§ў§§ў§ћ§ћўўў§ў ўў§ўўћ§ўћ§ћћ§ўћ§§ћўћ§ћўўќ§ў§ўўќ§ў§ўўћћ§ў§ўў§рў§ў§ў§ў§ўћў§ў§ўћ§ўў§ўћ§ћ§§ў§ћћ§ўў§ћ§ўўњ§ћў§ў§ўў§ћѕ§ўў§ћ§ћ§ћ§ћћѓ§ћў§§ћћ§ћ§ў§ћћ§ўћўўў§ўўњ§ў§§ћўўјћ§ћў§ў§ўўз§ћ§§ў§§ћў§ўћ§ћ§ўў§ўў§ћ§ћ§§ћћ§ћўћ§§ћњћњћњўўѕ§ўў§§ў§ў§ў§§ћў§ў§ўўў§ўў§јћњ§§ћўћ§§ўў§ўўј§ўў§ћ§§ўўј§ў§§ћў§ўўќћ§§ўўѓћ§ћ§ў§ћћњћћ§ўўўћў ўњћњњ§ћ§§фў§ў§ў§ў§ў§ў§§ћњ§ћћ§ўў§ўўћ§ћ§§ќћ§ћ§§§ћ§ћћјњћћ§§ў§ўўј§ў§ў§ў§ўўќ§ў§ўў§ъћ§њћћў§ўћ§ў§§ўўћћ§§ў§ўўљ§ў§ў§ў§§јћ§ў§ўћ§ўўў§ўўў§ўў§§ў§§ћў§ћ§ўўќћ§§ўўўћўўў§ўўў§ў ў§яў§ў§ў§ў§ўћ§ћ§§ў§ўўќћ§ћ§§ѓћ§ћў§§ћњњћћ§ўў§ўћ§§ђњ§ўў§ў§ўћ§ћ§§ўўў§ўўї§њљљћ§ў§ўў§§ў§ўўѓ§ў§ў§ў§ў§ўћ§ўўўћўўє§ў§ўў§§ў§§ў§§§ћ§ўўі§ў§§ў§§ў§ўўў§ўў§ћ§іћў§§ћ§§ў§ўўѕ§ћ§ћ§ћ§ћўў§§ўћўўќ§ў§ўўќ§ў§ўўў§ўў§§ў§ўў§ћў§ћћўўћўўњћ§ћ§ћўўќ§ў§ўўў§ўўё§њ§§ўћ§ћ§ћў§ўћ§§ўўћўў№§ў§§ћўћ§ћўћ§§ў§ўў§ћўљјћўўћћ§ўў§§ўќ§ў§ўў§ќћ§ћўўў§ўўў§ўў§§ћўўў§ўўћ§ћў§ўўёћ§§ўћўћў§ў§§ћ§ўўќ§ў§ўўї§ўў§§ћћњ§§ћјњћњ§ћ§ћ§§ўћўўў§ўўј§ўў§њћ§ўўїћњ§ћ§ћ§§ўўћњ§ў§ђћ§ћўћ§ћ§§ў§ў§ўўў§ўўћ§ўў§ўў§ўќ§ўћ§§ўћўўў§ўўќ§ўў§§§ў§ўўќћ§ћ§§ѓћ§ћћњћ§ў§ў§ў§§§ў§ўў§§ў§ўўї§ўў§ў§ў§ўўћ§ўћ§ўў§ќћў§ўўќ§ў§ўўў§ўўї§ўћ§§ћў§ўў§§ў§§ўќ§ўћўўў§ўўќ§ў§ўў§їћ§§њ§ћ§ћўўў§ўўє§ў§§ћў§§ћ§§ўў§§ћ§§њњћњ§§ўўљћљ§ћў§ў§ўўћўњўўє§ўћ§ћ§ћ§ћ§ћ§§ќћ§ћ§§ўљњћ§ў§§ўў§ћі§ўўћўћ§ћ§ћћњ§ћ§ћ§ўўў§ўў§ўђ§ћћ§ћ§ўўћ§ћ§ћўў§ўћ§§ў§эћўў§њћћњ§ћ§ћ§ћ§ћў§ўўі§ў§ў§ў§ўћ§§ўћўў§ћћ§ћ§ћ§§јў§§ћўў§ћћєў§§ћћ§ўћ§ћўћћќњљћ§§§ў§ўўћ§ў§ў§§іћ§ћ§њћњћњћћјњћњњћ§§ўўћў§ћћјў§§њћ§§ўў§ђћ§ћ§ћ§ћ§ћ§ћ§ћ§§ђћ§ћ§њћњњћњћ§§ўўіћ§ћў§§ћў§ћћі§ћњћћњ§§ў§§ўћ§§љў§ћћњћњњћєњўў§ћ§ћ§§ў§ўўћ§ўћўў§іћ§њ§њ§ћўћ§§јћўў§њњћ§§ћ§§ћ§ўўђћ§§њ§§ў§ў§§ћў§§њћ§ћћњћћњ§§ћўўћћ§ћ§ћћў§ўўў§ћћ§ўћћ§ўћ§§ѕћњћњћњљљњћ§§ћљ§ўў§ћ§њњшћњ§ћ§§ћ§ћ§ћ§ћћњ§ћ§ћўў§ћ§§ъћ§§ћњњ§ћ§ћљњњћњ§ў§њ§ћ§§ёћўћћ§ћ§ћ§ћ§ћ§ћўўі§ћћ§ћ§ћ§ћ§§ўњ§ўћ§ћ§§ўщћ§ўў§ћўў§ћ§§ў§ўћ§њ§ћ§ћ§§№њћњ§ћў§ў§§ў§§ў§ўў§§ў§§ўћўў§щњћњћњћљљњњћ§ћ§ћ§ўћњњћљњњѕ§ћў§ў§ў§ћћўўњћ§ћћў§§§ћ§ћћ§јћњ§ћ§§ў§§їўћ§§ўћўў§§іњћћ§ћ§§њ§ўў§§ћўўў§ўўі§ў§§ў§ћћ§ћћќ§њ§ўў§§ў§§ўј§ћў§ў§ћ§§ўћўў§јћњљњћћ§ўўњ§ћ§ћў§§їў§§ћ§ћ§ћўўќ§ў§ўўў§ўў§ѓў§ў§ћћўћў§ў§ў ў§ёў§§ўў§§ћўћў§ў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўўё§ўћўўћ§ћ§§ў§ў§ўўќ§ў§ўўќ§ў§ўўљћ§§ў§ў§§ўќ§ў§ўў§ћў§ў§ўўў§ўўі§ў§ў§§њ§§ўў§ўњ§ў§ў§ўўі§ўћўћ§њћ§ўў§ќћў§ўўњ§ў§ў§ўўї§ў§§ў§ў§ўўў§ў ўќ§ў§ўўќ§ў§ўўў§ўўљ§ў§ўў§ўўќ§ў§ўўњ§ў§ў§ўўњ§ў§ў§ў ўѕ§ў§ў§ў§ўћў§§ѕў§ўћ§§ў§ў§ўўћ§ў§§ў ў§§ў§§ћў§§ћ§§љћ§ћў§ў§§њўћўћў§§ўќ§ў§ўўљ§ў§ўћў§§ћў§ў§ўўѓ§ў§ў§ў§ў§§ћў§§ўў§ўўф§ў§ў§ў§ў§ў§ў§ў§ў§ўћ§ћ§ћў§ў§ўўў§ўў§ўњ§ў§ў§ўўў§ўў§ђћўћ§ћў§§ўў§ў§ўў§ћ§ўќ§ў§ў ўќ§ў§ўўў§ўўё§ў§ў§§ћ§ћ§ў§ў§ўўў§ўўў§ўўў§ўўј§ў§ў§ў§ўўќ§ўћўўў§ўў§§ў§ўў§ўћў ўќ§ў§ўўў§ў ўћњ§ћ§ўўќ§ў§ўўќ§ў§ўўњ§ў§ў§ўў§ўћўўњ§ў§ў§ўўў§ўўў§ў ў§ўў§ўўќ§ў§ўўў§ўўў§ўў§ ўњ§ў§ў§ўўў§ўўќ§ў§ўўў§ўўѕ§ћ§§ў§ў§ўћў ўў§ўўў§ў ўќ§ў§ўўў§ўўќ§ў§ўўў§ўўњ§ўћ§§ўўї§ўћ§ћ§ћ§ў ўў§ўўў§ў ў§ќњ§§ўўќ§ў§ў ў§ ў§ўў§ўўј§ў§ў§ўћ§§ў§ћў§ў§ў ў§њћ§ћў§ўў§§ў§§њў§ў§ў§§ўў§§њћ§ћў§ўўњ§ў§§ћўўў§ўўў§ў ўў§ўўў§ўўј§ў§ў§ў§ўўў§ўўў§ў ўќ§ў§ўўј§ў§ў§ў§ўў§ўћўўћ§ў§ў§§ўќ§ў§ўўў§ћћ§ўў§ўўў§ў ў§ўњ§ўў§§ўўќ§ў§ў ўј§ўћў§ў§ўўќ§ў§ўўј§ў§ў§ў§ўўќ§ў§ўўў§ўўњ§ў§ў§ў ўў§ўў§ўќ§ў§ўўќ§ў§ў ўњ§ў§ў§ўўў§ўўљ§ўўћњћўўў§ўўќ§ў§ў ўћ§ў§ў§§ ўў§ўўў§ўўў§ўўў§ўўќ§ў§ўў§јў§ў§ў§ўћћ§љў§ў§ў§ў ў§ў§ќћў§ўўњћ§§ў§ўўў§ўўќ§ў§ў ўў§ўўќ§ў§ўў§ўє§ў§ў§ў§ўћ§ћўўў§ўўў§ўўў§ўўў§ўў§ ўў§ўўў§ўўћ§ў§ў§§§ў§ў ўў§ўўќ§ў§ўўє§ў§ў§ў§§ћ§§ўўњћ§ћў§ўўћћў§§ўўь§ў§ў§ў§ў§ў§ў§ў§§ўў§ўўњ§ў§ў§ўўў§ўўњ§ўћ§§ўўє§ў§ўћ§§ў§ў§ў ў§ ўќ§ў§ўўў§ўўј§ў§ў§ў§ўўќ§ў§ўў§їћ§ў§ў§ў§ўўќ§ў§ўўі§ў§§ћў§ў§ўўљ§ў§§ў§ўўў§ўўќ§ў§ўў§§ћўўў§ўў§§ў§§ўћ§§ ўљ§ў§ў§ў§§§ћўћћћ§ћ§ћ§§ўў§ўў§ќћ§§ўў§щў§ў§ў§ў§ў§ў§ў§ў§ў§ў§§ћ§§ћў§ў§ўўњ§ўў§§ўўњ§ўћўћ§§њў§§ў§ўўъ§ў§§ћ§ћ§§ћћ§ћ§ўў§ў§ў§ўўў§ўў§§ў§§љў§ў§ў§ўў§њћ§§ў§ўўќ§ў§ўў§§ў§§ўў§ўўі§ў§ў§ўћ§ћ§§ўћ§§ўј§ў§ў§ў§ўўљ§ў§§ў§ўўш§ўў§§ўћ§ћ§ћћњ§ћ§§ў§ўћ§ћўўё§ў§§ћў§§ўў§§ў§ўўј§ўћ§§ў§ўўэ§ў§ў§ў§ўћ§§ўћ§§ўћў§§ўў§§юў§ў§ўўњ§§ў§ў§ў§ў§ўўєћ§§ў§ў§ў§ў§ўўќ§ў§ўўў§ўўћ§ўў§ўў§ў§ќў§ў§§ўќ§ў§ў ў§ў§ћћ§ћ§ћћ§љў§ў§ўћ§§њћўћ§§ў ўѓ§ћ§§ў§ў§ў§§ћ§§§ў§ўўў§ўўў§ўўє§ў§§ўў§ў§ў§ўўў§ў ў§ѓў§ўћ§ћ§ћўћ§§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўў§њћўћ§§ўўќ§ў§ўўў§ўўњ§ў§ў§ўў Рўћ§ўћўўћ§ћћљ§§ўўћўў§§ўћўў§ў§ћўў§§ќњ§ћўўўћњњ§тћњ§ў§њњ§ї§§њ§§ўћ§ћћњћћ§њўў§§ћ§§§ўњўў§њ§ўўћў§ћњ§§іў§§њћљљ§§ўўї§њњ§ўњљћ§§ћњўћ§§њњћўњјїўўўњ§§ў№њ§§ўћўњ§ћљљћћ§њ§§ўњњ§ћљћ§§ўљ§љћљћћљљћ§ўњўјўўўћўўхћўћўћћўћћў§§ў§§њ§ўўћ§њ§ўўћўў§ќў§§ўў§њњћћ§њўў§њ§ўўў§ўўўћўў§ќљўњўўќњ§§ўў§ўіћў§§њ§§ўћўўљћўћўўћўў§ћ№§ћўўњњћѕјљљєњћћ§§њь§њ§§ўў§§љћ§§њ§њњ§§њ§§њш§ћћњ§ўўћў§њ§њјћ§§њ§ў§§њ§§ўў§§ћя§њ§§њ§ћњ§ўў§§њўћўў§ўљ§ўў§§ћ§§§њ§ўўњ§њћ§§ўў§љј§њ§ћў§њ§§ў§ўњћў§ўўњ§ћћўћњћўўќћњћўўўћўўѓћ§ѓєѕ§ўўћљњ§ўўћћўў§ўўќњљљћћљ§ћњ§ўў§§ўљ§§ћ§ќўћћўўя§њ§§љјїјјњћљ§њњўњњђљћћљћљ§ўњўћўў§§ў§ў§ў§ўњћћ§њљћљћњўў§ў§§њ§ўў§іћљјљ§ћљљ§њњї§ћћўћўњћўўўњўў§ћ§љљњў§ћњ§§ћњ§ћўўћ§§№ўћћў§§ћћљљ§§њћћњњћћљћћўў№ћўћћ§њ§ўћўњ§ўў§ўў§ѕљћљјњ§§ћјјљљјєћ§§љћњњјћћњ§§ўњ§ћјњњ§§ўњўўіњ§ћћ§ћљ§§ўў§ћў§§ѕћ§њўћ§§љјљћћ§ўњ§§ўњћћўћњ§ў§њњў§њў§§ўўћўў§ў§ёћњјњњћ§§њћ§§њў§§§љћўўћў§ўў§ўў§љћў§ўў§ћ§ўњ§§ў§ ў§§ћўўјћўњ§љўў§§ўэћњњћјћњњўњ§ћљњљћњњ§§љћљћћњ§ўўћњ§§њўўўћўў§§ў§§ўўћўў§ћў§§ўњ§§ћ§ўњ§§ўўћўўљћјћћ§§ўўўћўў§ћњћ§њўў§ўїћ§§њњўћў§§ќњўў§§ўэ§љјјљ§ў§§њћ§ўў§ћћ§ўў§ўѓ§њћљћјћћљљћћ§§њў§њ§§ўўјћ§§љљ§њ§§єў§§ўўњћјјњћљљўѓњ§њћћњћ§§њњ§ўў§ўњ§§љњјљ§ўњўў§§њўў§ў§ћў§§ђљћ§ўў§§љљћћ§§ўў§ћњћћ§ўўћў§ќњ§§ўўљћ§ў§њ§ўў§њє§ћћњњ§§ўўњњ§§ѕў§§ћћ§њўўћў ўљ§љћјћ§ўўњў§ўў§љљћћњ§ћ§§яњ§§љјњћњўћў§§ўў§ў ў§§њўўћў§їћјћ§§њњ§ўўњќ§њћ§§ћўќћўћўў§њ§њўћўўћўў§ѕњўў§§њћ§§њ§§єћњљ§§ћ§§ћћљўўё§ћљ§љјћ§ў§§ћћ§њњћ§њњљ§§њј§њњўў§њ§§ўњћћўљћћіљћћ§ћћњћ§ўўќњ§њ§§§њў§§§њ§ўў§ќњ§§ўўќ§љ§ўўўћ§§љ§ћ§ѕњ§ћћўўћњ§§ўўў§ўўћ§ў§§ўў§ўўћ§§їћљњњўўћў§§ќўћў§§ўї§ўўћњўўћўў§§ћў§§ў§ўћў ў§ѕњ§§јћјћћ§§ўўћў§ўћўў§ћљћњ§љљ§ўўћ§§њ§ѓћўўњњ§§ўћ§§ћљљљ§љљњљњ§§њќўњљћћ§њ§ўўћ§њњћ§§ў№њ§ћўўњљ§ћљјљћ§ћ§§ќћљњ§§§ћљўўюћўў§ћњљћ§њњ§ћјњњ§ўўњѕћљћљ§ўў§ўў§§ѓћ§њљњњљј§ћўћўў§ћњ§§ћљћћњўўј§ћљјљљњ§§ќњ§§ўў§єњ§ў§§њ§њњ§њ§§јћјљћљљћ§§ўњ§§§њў§§§ћњ§§љљћўў§њ§њњњ§ћћўњ§§ќљ§§ўў§ў§њё§њљљ§§ћћ§§њ§§љ§§ў№§јњљјњћўўћљћў§љ§§њ§ўў§§ўћ§§њњљ§§љ§§ћ§№ћњњ§ћћњў§њћўњ§њ§§ўљ§њњўўћўўљ§љћћ§§ўўўћўўў§ўўэћўў§ўў§њ§§љљћћ§§ћљћћќњљ§ўўќ§ћћ§§ўњћћ§§ћўў§ќћљљўў§њ§ћћўљ§§ћљћћљ§§њћњљљћ§§№ћљћ§њ§§њ§ўў§ћ§ћўў§№њ§§ћћјјљњњјљ§њњ§§ўњ§§ћљћўљћћўљ§§іћ§§ћћўњњў§§ўћ§њ§њ§§ўћ§§љњїњњўў§§љњљљћћљ§§њћ§ћћљћћўљ§§ћјћ§§ўў§ўўћўўўћўўјњћўў§ћљћћљљїѕѕњњћћьљњћћјјїћћ§љћљћўњћњњћћ§§њћўўўћўўњћўўћў§§ћљћ§§ћљ§§љўјћћїљ§ўћ§§ћћўўўћ§§ўќћўћ§§§љњўўўћўў§ў§ћћўўљ§§ў§љњћљљ§њ§§§ћњўўћ§ўўћ§§ќљ§§ўў§њќ§љњ§§§њјћћ№љћљћ§њ§ћљћ§њњ§ћљљђјљ§§љ§ћљ§ћљћљ§§їњћљњњћ§§ўўэћњ§њњўў§љћћњјћљњ§њ§§§љ§ўўќћўћўўоњћјљћљћ§§ўў§њ§§њўћўњћљћњњ§§љ§њњ§њ§§ќњ§љ§§їњ§§љћјћ§ўў§ўј§њњ§§љћ§§єњ§ў§љњњљ§§ћўў§ќћўњ§§ћ§ўў§§ьњ§ћјћ§њ§њћњ§њћ§§ў§§ћћўљњњўљ§§§ўћ§§ўљћћћљћћ§њњ§ћє§ў§§ћћ§ћ§§њ§§љљћ§њ§ћўўўћўў§уњ§јјљћћњ§§ћћ§љљћљћљњ§љњў§§њ§ў ў§§њћћї§ўўњњ§њњўў§ўњ§§ўў§§ў§§њ§ўў§ўћўўћў§ћўњ§§№ћљћњ§§ўћћўўћћўћ§§ўћ§љћљћћ§§њўўўћўўё§њ§§љ§њ§љјћћњ§ўўњћўћўћ§§ўћћў§§ўў§ћђў§љ§§њўў§§њ§ћ§§ўќћўћўў§§ћњўўўћўўњўћўў§ўљћњћћўў§§ўўћўўћњћў§ўўў§ўў§ ў§ўњ§§љљћћ§њњ§§љљћљљћјћћјљћћњњўњўўќћўњўў§ўўћўўћўњ§§ѓљћћљњ§§ћјњћ§ўў§яљњ§§њ§љћћ§§ћўњњ§ўў§ўўњњ§ћњ§ћ§ўўўњўўў§ћћшљћљћћјљљћњ§§ў§§њ§њ§њ§§ћўўўњ§§№њў§§њ§§ћљ§§ћўў§ћћњљїњ§њ§њ§ћў§§яљјјњћ§ћў§њљјљњњ§ўў§ўљћўў§§њ§§ўў§§њњ§ўўћўў§љўћћ§§ћўў§њ§§јћћўњ§§ўћў§єњ§§ћћљћ§§њњ§§ўў§§књ§њћљњ§§њњўћўњ§ў§љњћљ§§њ§ћњњћљћ§ўћў§§ўў§ќљ§§ўў§ћў§ћћўўёћ§љљћћњјјљњ§љњ§§ђћў§ћ§§ћўў§§љ§ўўђћў§ћљњ§§ў§њ§§ўў§§њўў§њ§§њ§ўўј§љјјњјљћћ§ўњўўћўњю§њ§§њ§§њ§§љљњћћњ§ўў§§ћ§ўўўћўўў§ўўљ§њ§њњ§ўўўћўў§§ў§§§љњ§§§ћњ§§њћ§њ§њўўўњ§§њњ§§ћћ§§ ўўњ§§љњ§§њўћўўњё§љњ§њ§њњљћ§§ћљ§§њћљљјћљљ§ќћљјћћќњ§њўўѓ§љ§§љ§§њ§ј§§ўўњў§њњљ§ўњћўћўў§§ўў§ўўю§ў§ў§ў§ўћњњћћ§ћ§ћўўѓ§ў§ў§ў§§ћ§ћћўўіћ§§ў§ўћ§ћўўіћ§ћ§ћў§ў§ўўќ§ўў§§ђћ§ћ§ћ§ћ§њ§ћўћ§§цў§ћ§ћ§ўўћћњљњћћ§§ўћ§њћћ§ћ§§їў§§ћў§ў§ўў№§ў§ў§ў§§ћ§ћўћ§§ћћ§ў§їћў§ћњ§ћ§ћћѓ§њњљљњ§ћ§ћ§ћ§§ўњ§њљў§ўўя§ў§§ћ§§ў§§ћ§§ў§§ћћњѕћ§ћ§ћў§§ћњћћѕ§ћўў§ћњћћњћћњѕ§ћў§ў§љњў§ўўў§ўўў§ўўў§ўўђћ§ў§ћ§ћў§ўћўћўўќ§ўћ§§юћў§ў§§ћ§њњћ§§ў§§ћўў§ўј§ў§ўў§ћўўі§ў§ў§§ћ§§ўўё§ћ§ўў§ў§§ћ§ћ§§ўўњ§ў§ў§ўў§ѓћ§њћћў§ў§§њ§ћћћљћњ§ћћ§§ћ§§єћўў§ћћњ§ћ§ћ§§њћ§ћ§ћ§§њћўў§ћўў§јњ§ћ§ћўћ§§ўћ§§јћ§ћћњћњ§§ћћ§ћћ§§ћўћ§§ўўљ§ўћ§ћћўўіћў§§ћўћ§ћ§§ўіћ§њ§ћў§ў§ўўћћ§ћ§ћћќ§ћў§§њћ§ћ§§ўўђћ§ћўў§§ћњ§§ўў§§њћ§ћ§њўўў§ўўў§ў ўќ§ўћ§§ў§ўўћўўў§ћћўњћћ§ыўћ§ћ§ћ§ћ§ћ§њћњћћ§ћ§§ўўћ§ўћ§ћћў§њњћ§ўў§§јћњњћњћћўў§ќћ§ћўўњ§ў§§ћўўћ§ћ§ћўў§тћ§§њњћњњћ§ћ§ћњћћ§ў§ўћ§ўў§ћћ§ћўўњћ§њћњћћ§ћўњўўў§ўўќ§ў§ўўфћ§ћћњ§ћ§ћ§њ§ў§ћ§ћњњ§ўў§ўћ§ћўў§ћїњћћ§ћ§њњљљћњћў§ў§ўўќћ§ћўў§§ўћўўё§ўћ§ћ§ћћњћћ§ћћњњћы§њ§ћћњљљњњћ§§ћ§§ў§§њ§§њћ§ћ§§ўўш§ћњњ§њћћ§§ў§ў§§ћ§ћњћ§§ўћћѕ§ћћњћњ§ћ§ћ§§іћ§ћ§њћњў§ўўј§ў§ў§§ў§§ўі§ў§ўћ§ћ§§ўўљћ§ћў§§ћћѓњљњљљњ§ћ§њ§ћ§§ћўњўўќ§ў§ўўњ§ў§ў§ўўћўў§§§ў§ўўћќњћћўў№ћ§њћњ§ћ§ћ§ћўў§ћўўќ§ў§ўў§ўђ§ўў§ћў§ўћ§ћў§ўў§њ§ћ№љћћ§§ћ§ћ§ћ§њћњњ§§ѕў§ў§ў§§ћ§§ўў§§ў§§јћ§ўў§ў§ўў§ьћ§ћ§ћ§ћћњћћ§ћ§ћ§ћ§ћўўю§ў§ў§ў§ў§њћњњ§ћў§ўўјћ§ћ§њ§§ўўћў§ўўўћ§§яў§§ћ§§ўў§ћ§ћ§ћў§ўў§оћ§њћ§ўћћ§ћћў§§њћћў§ў§§ћ§§ўћ§њћњ§њћћњїћ§ћўћ§ћ§ўў§ћ§ћћ№§ћ§ћўћ§§ў§ћњњљњћћѕў§§ћ§њћљћћ§§ќћў§ўўўћ§§§ћ§ћћўќ§ўћўўњ§ўћ§ћўў§їћ§ћњћў§§ћћќњ§ћўўјћ§§њњ§§ў ўќ§ўћ§§ќћў§ўўњћўћ§ћўўўћ§§ћљњ§§ћћў§§єћ§ћў§§ўўћ§§ўўњ§ў§ў§ўўў§ћћў§ўѕ§ў§§ћ§ћњњ§ћћћ§ћ§ћ§§јћ§ћњљњ§ўўњћ§§ўћўўў§ўўў§ўўіћ§ўў§ў§ў§ўўћ§ўћ§њњ§§ћ§§эў§ў§§ћ§њ§ћ§ћ§њћњў§ўўў§ўўўћ§§ќћ§ћўўп§ў§ў§ўћ§§ў§§ћ§њ§ћ§ћ§ћ§ћ§ћ§ћ§њљћ§ћћћ§њћћўўђћњћ§ћњњ§ў§ћћњ§§чћ§ћћ§§ћ§§ўў§§ћћ§ћ§§ћњћњћњњћјњ§њћљўћўў§јћ§ћў§§ћ§§ѕў§§ћ§ћ§§ў§ўў§ѕў§§ў§ў§ўћ§ћћќ§ћ§њњћ§ћ§ћўўї§ў§ћћў§ў§§§ў§ўўє§ўћўћ§§ў§§ћўўј§ћ§ўў§§ўўюћ§ћ§ћ§§ў§§ћ§ћ§ћў§ўўўћўўў§ўўіћ§ўўћ§ћ§§ўў§јћ§ћ§ўў§ўўў§ўўћ§ў§ўћћё§ћ§§њћћњ§ћў§ў§ўў§ћ§ўўњ§ћћњ§ћћѓ§ћ§§ў§ў§ўћ§ћ§§ђћў§ў§§ћ§§ўћћњћћљ§ћ§ћ§ћ§§їў§ўњћњ§ћўўа§њљћћ§ћ§ћ§ћў§ў§§ўў§§ў§њћњћњ§њ§ћ§ћ§ћ§§њћ§ћ§ћ§§ћћўў§њћ§њяљ§§ў§ў§ў§§њћњћћў§§ћўћ§ћ§§єњ§§ћљњћ§ћў§ўўє§ў§§ћ§ћњњ§§ўўщ§њћњћћ§ћ§ћ§ћ§§ў§§ћ§ћўћ§§юћ§ћ§ћћњњћњћћњ§ћ§ћ§§яћ§§ўћ§ћћ§§ћ§ћћњў§§ў§цћ§ћ§ћ§ћ§ћў§ўћ§ћ§ћў§ў§§ћ§ћ§§іћ§ћўћћњћћ§§ђћўћ§ћўў§ћљћ§§ўўјћўћ§ћ§ћ§§фћўћ§ћ§њ§ћћ§ўћ§ћ§ћ§ћ§ћћњћћ§ў§§њљ§ўћ§њў§§јћ§§ўћ§§ўўў§ўўћњєћ§§ў§ў§ў§ўћўўў§ўў§ћў§§ћњњ§§њћњњќ§ў§ўўћіњ§ћ§§ћњњћўўќ§ћ§ћћ§§њўўш§ў§§ћњњћћ§ћ§ћћњњћ§ћ§ћњ§ћћљ§ћ§њћњ§§юћ§ћў§§њћўў§ў§ўћ§ћ§§ћњќћ§§ћћ§ўћ§§љћ§ћ§ћ§ћћ§§њћћњћљњћћ§ћ§ћћј§ўў§§ўўћћўў§ўўѓћ§ћ§ћ§ћўћ§ћ§ћћыў§ў§ўћ§ћ§ћћњћћ§ћ§њ§њћћњћы§ћ§њ§ћў§ў§§ћ§ћў§ў§ў§ўўћ§ў§ўћћіњћњћљјјљљњњћћ§њћњњђћњ§ћњћў§ўў§§ћњњѕ§ћ§ўў§ў§ў§ўўў§ўўў§ўўѕћ§ћћњћћњњ§ћћў§ћћё§ўћћ§њћњћћўў§ћўўі§ў§ўћ§ћ§§ўўј§ўћ§ћў§ўўњ§ў§ў§ўўњ§ўћ§ћўўў§ўў§ўћўўћї§ћў§ћћ§§ћћѓ§ћ§ћ§ћ§ћћ§ў§ўўэћ§§ўў§ћ§ћ§ћ§ћ§ћў§ў§§јћў§§ћ§ћ§§ћњћњњћћќњћ§ћћ§њћ§§ўњћћјњћћ§ў§њћћѓ§ћ§§ћћљљћћ§§ўўѓ§ўў§ћ§ўў§§ћћњњєћ§ћ§ћ§ћћў§§ў ўь§ўў§њњћњћњћ§§ўћ§ћ§§ўўі§њћћ§§ћ§ћ§§ђћ§ћ§ћ§ћ§ћў§§ћ§§ћ№њ§њћ§ў§ў§ў§§ћў§ўў§§ћ§ћћѓ§ћ§ћўћћљњћ§ћўўэ§ўў§ћ§ћў§§ћ§ћћњ§ћ§ћћш§ћ§ћ§ћњњћћ§ћ§њ§ћ§њ§ћўћ§њњўћњњўў§§ћі§ћўў§ћ§ћћњњћћњњћ§§іћ§ћ§ћ§ћњњ§§№ћњњ§њћћ§ћ§ћ§ћћњ§§ўњ§ў§ў§ўў§§ћ§§ћњњ§ћ§њћћњ§ћў§ў§§ўў§ўўљ§ў§ў§ў§§чћњћњ§§ў§§ћ§§ў§ў§ўћ§ћ§ћ§ћ§§§ћ§ўў§§ћ§§ўњћ§њў§ўўћ§ћћ§њњ§јћњћћ§§ћўўц§ўћ§ћ§ћў§ўћћњћњћњћћ§§ў§ў§ўўќћ§ћ§§јћ§њћ§ћ§ўўј§ўћ§ћ§§ўўќ§ў§ў ў§њћў§ў§ўў§ўћўўюћўћ§§ўў§ћ§ћўћ§ћ§§ўўі§ў§§ћњ§ў§ўў§ў§ўћўўў§ўўќ§ћ§ўўќ§ў§ўўўћўўўћўўћ§ў§ўћћ§ў§ўў№§ў§ўў§ћ§ћ§ћћњњћ§§ћїњ§њћњћњњ§§ў§ўњћ§ћў§ўў§§ћ§§ѓћњњћ§§ћћњљњ§ўўњћ§ћ§ћ§§љћњњ§ћў§§ћў§ўћ§§ќћ§ћ§§ћњ§ўў§§ўѕ§њћњћњћњћ§ћћ§ќћўћ§§іћў§ўў§ћ§ћ§§ыћ§ћ§њћћ§ўў§§њћњћ§§ћћ§§ќћўўћћя§ћ§ћњњљњ§ўўћ§ћ§ў§§ћў§§ћўўў§ўўўћ§§єћ§ћ§ћўћ§ћ§ћўўћћ§ћ§ўўћ§ћў§ўўќћ§ћ§§ѕћњњ§§ћ§§ў§ўўќ§ўћ§§ћњњћњ§ћ§§юћ§ћўћ§ћ§ћ§њћ§§ћ§§ўў§њћљњћћ§§јњљљћћњћўўљћ§§ў§§ћћ§§ћўўђ§ўћ§§ўћћњў§ўўћћяњћљњњћ§§ћ§ћ§ћ§ўўћћћ§ўў§ћћьў§ў§ўў§њћ§§ћўћ§ћ§§ў§§љў§ў§ћћ§§цћ§ћ§ћў§ў§ўћћњњљњћћњњћ§ћ§§ўўў§ўў§ќћ§ћ§§єћ§ћ§ўў§њњ§ћўў§ќћњћўўў§ўўў§ўўў§ўўўћўўќћ§ћ§§§ў§ўў§ђћ§ћў§§ћ§њ§ћ§ћ§§ъћ§ћ§§ў§§ћ§ћ§ћ§њћћ§ћ§§ў ў§јћ§ћ§ћ§§ўўћ§ў§ў§§ћі§ћ§ћ§§ћњ§ћћї§ћ§њћћ§њћћі§њћњћњћњћ§§щў§ўћўћ§ў§ћ§ћ§ћ§§ў§ў§§ћ§§ћў§ўў§ћў§ћў§ў§ў ўќ§ў§ўўў§ўўў§ўўў§ў ўѕ§ў§ў§ў§ў§ў§§ўі§ў§ў§ў§ў§ўўјћ§ћ§ћў§ўў§ўњ§ў§ў§ўўў§ў ўќ§ў§ўўј§ўћ§ћў§ўўќ§ў§ўў§§ў§ўў§ѓўћ§§ў§ў§ў§ў§ўў§ћ§ўўќ§ў§ўўќ§ў§ўўє§ўћў§ў§ў§ў§ўўј§ў§§ћў§ўў§љўћ§ћ§ћ§§ўўћўўњ§ў§ў§ў ўќ§ў§ўў§§ў§§§ў§ўўў§ўўў§ў ўќ§ў§ўўќ§ў§ўўќ§ў§ўўњ§ў§ў§ў ўњ§ў§§ћўў§їў§ўћўћ§§ўўј§ў§ў§ў§ўўь§ўћ§§ў§ў§ў§ў§ў§ў§ў§ўўў§ўўћ§ў§ў§§§ў§ўўш§ў§ў§ў§ў§ўћ§ћ§§ў§ў§ўћў§ўўў§ўўў§ўўў§ўўњ§ў§ў§ўў§ўј§ў§§ћў§ўўј§ў§ў§ў§ўўў§ўўњ§ўћ§§ўўў§ўўљ§ў§ў§§ўўњ§ўћў§ўўќ§ў§ў ў§іћ§ћў§ў§ў§ўўю§ў§ў§ў§ў§§ћ§ћў§ў§ў ўі§ўћўњ§ћў§ўўў§ўў§ќћ§§ўўќ§ў§ўўў§ўўќ§ў§ўўю§ў§ў§§ћ§§ў§ў§ў§ўћўўў§ў ў§ђћ§ўћўћў§ў§ўћ§ўўя§ўћ§§ў§§ўў§ў§ў§ў§§ўў§ўўє§ўћ§ћ§§ўў§§ћћ§ўў§ў ўћ§ў§ў§§§ў§ўўћћ§ўћў§§ќў§§ћћљ§ћў§ў§ўўі§ў§ў§ў§ў§ўў§§ў§§ћў§ў§ўўј§ў§ў§ў§ўў§эћ§ћ§§ў§ў§ў§ў§ў§§ћ§ўўќ§ў§ў ўќ§ў§ўўў§ўўў§ўўў§ћћ§ў§ћў§ў§ўў§ћ§ўўў§ў ў§ўћўў§јћ§§ў§ў§ўўў§ў ўў§ўўў§ўўў§ўўћ§ў§ў§§№ў§ўћ§ћ§ћў§ў§ў§ў§§§ў§ўўў§ўўњ§ў§ў§ў ў§§ў§ўўђ§ўћ§ћў§ў§ў§ў§ў ў§§ў§§ў§§ў§§ ўќ§ў§ўўќ§ў§ўўњ§ў§ў§ўў§ќўћ§ўўўћўў§ўћўўќ§ў§ўў§ћў§§ћ§§§ў§ўўќ§ў§ўў§њћў§ў§ўўў§ўўћєў§§ћ§ўў§ў§§ћћћў§ў§ўўћ§ў§ў§§§ў§ў ўў§ўўњ§ў§ў§ўўј§ў§§ћ§§ўў§§ў§§ўќ§ў§ў ўў§ўўј§ў§ўћ§§ўў§љў§ўў§§ўўў§ў ўњ§ўћўћўўќ§ў§ўўћ§ў§ў§§јўћў§ў§ў§§љў§§ћў§ўўў§ўўў§ў ў§јћ§§ў§ў§ўў§јў§ў§§ћ§ўўњ§ў§ў§ў ўў§ўў§§ў§§шў§ў§ў§ў§ў§ў§§ћ§§ўћў§§ћ§ўў§ёћ§§ў§ўћ§§ў§ў§ў§§ўќ§ў§ўўў§ўўі§ў§ўћ§ћ§ћ§§ўћ§§ћ ўњ§ў§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўўќ§ў§ўўї§ўћў§ў§ў§§§ў§ў ўў§ў ўў§ўўў§ўўј§ў§ў§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўў§§ў§§ћўћў§ў ўў§ўўђ§ў§ў§ў§ў§ў§ў§ўўў§ўўў§ўўќ§ў§ўўј§ћ§ћў§ў§§ћў§ў§ўў§§ћ§ўўѕ§њћћў§ў§ў§ўўў§ўў§ћ§њў§ў§ў§§јў§ў§§ћ§ўў§ѓњ§ћў§ў§§њћ§§ўў§ўў§ўў§§ў§§љўћўњ§§ўўћ§ў§ў§§ў§ўћ§§§ў§ўўў§ўўќ§ў§ўўф§ў§ў§ў§ў§ўў§ћ§§ўћ§§ў§ў§ў§ў§ўўљ§ўћў§ў§§ўќ§ў§ўўў§ўўљ§ў§ў§ў§§ўќ§ў§ўўњ§ў§ў§ўўў§ўўѕ§ћў§ў§ў§ў§ўўњ§ўћ§§ўўў§ўўі§ў§ў§ў§ў§ўў§§ў§§ў§§ў§§ђў§ў§ўћ§ћў§ў§ў§§ўї§ўў§ў§ў§ўўў§ўў§§ў§ўўј§ў§ўћ§ћ§§ќў§§ўўіћ§§ў§ўћў§ўўќ§ў§ўў§ўѕ§ў§§ћ§§ў§ў§§єў§ў§ўћўћў§ў§§ћў§ў§ўў§ўы§ў§ў§ўћ§ћћ§ў§ўћў§ў§ў§§љў§ў§ў§ўў§ўћ§§єћ§ћ§§ў§ўћў§ўўў§ў ўњ§ў§ў§ўўљ§ў§§ћ§ўўѕ§ў§ћћ§ћ§§ў§§ќћ§ћ§§ќў§ў§§ўќ§ў§ўўѓћ§ћ§ћ§ћ§љћћў§§ћ§ўћ§§ўћ§ўћў§§§ў§ўўќ§ўћ§§ћўћ§§ўўќ§ўћ§§ќћ§§ўўў§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ўў№§ўћ§ћў§ў§ў§ў§ўћўўў§ўўљ§ў§ў§ў§§ў§ўє§ў§ў§ў§ў§§ћ§§ѓћ§§ў§ўћ§§ў§ў§§њў§ў§ў§§єўћ§ћ§§ў§ўћўћћ§ў§ўўќ§ў§ўў§ћћ§њў§§ћў§ў§ўўў§ў ў§ўћ§§§ў§ўўќ§ў§ўўљ§ўћў§ў§§єў§ў§ў§ў§ў§ў§§љў§ў§ўћ§§ўў§ўўє§ў§ў§§ћў§ў§ўўњ§ћњ§§ўўќ§ў§ўўъ§ў§ўћ§§ў§ў§ў§ў§ў§ў§ўћўў§ўў§§ў§ўћ§§ўњ§ўћў§ўўњ§ў§ўћ§§ћћ§§ў§§ђў§ў§ў§ў§ў§ў§ў§§ўє§ў§ў§ўћ§§ў§ў ўћ§ў§ў§§шћ§§ў§§ћўћўћ§ћ§§ў§ўў§§ў§ў ўј§ўћ§ћ§§ўўќ§ў§ўўў§ўўј§ў§ў§ў§ўўњ§ў§ў§ўў§ ў§ўў§§љў§§ћў§ў ўќ§ў§ўў§њћ§ћў§ў ўћ§ў§ў§§§ўћў ўќ§ў§ўўў§ўўў§ўўќ§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўќ§ў§ў#ўю§ў§ў§ўћ§§ў§ў§ўў§ћ§§ўћ§§ћў§ў§ўўў§ўўў§ўў§§ў§§ќў§ўћћ§ў§ўў§ў§§ў§§ўќ§ў§ўўѕ§ў§ў§ў§ў§ў§§ўў§ўў§ќћўћ§§ўћ§§ќћў§ўўј§ў§ў§ў§ўўѕ§ў§ў§ў§ў§ў§§§ў§ўў§ћћ§ћў§§ћў§ў§ўўі§ў§ўћўћ§§ўў§ћў§ў§ўўў§ў ўј§ў§ў§ў§ўўќ§ў§ўўќ§ў§ўўў§ўўђ§ў§ў§§ћ§§ў§ў§ўўњ§ў§ўћ§§љў§ў§ў§ўўє§ў§ў§§ћў§ў§ўўѓ§ў§§ћ§§ў§ў§§ћћ§ўў§ўўў§ўўў§ўў§ў§ћ§ўў§ћѕў§ў§§ўў§ў§ўўќћў§ўўўћўў§ќћў§ўўќ§ў§ўўў§ўў§ћў§ў§ўўђ§ўћўћ§ћ§§ў§ў§ўўњ§ў§ў§ўўў§ўў§ўќ§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўў§§ў§§ѕў§ў§ў§ў§ў§ўўђ§ў§ў§ў§§ћў§ў§ў ўј§ў§ў§ў§ў ўё§ў§ў§ўў§ўў§ў§ў§§іўћ§§ў§§ћў§§ўў§§ћљ§ћ§ћ§§ўўє§ў§ў§ў§ў§ў§ўўљ§ў§ў§ў§§§ў§ўўў§ў ўўћўўїћўўћ§§ўћўўќ§ўўћћўћ§ўяћў§ўў§љњљњўўћў§§ўў§ѓњћљ§ўўњ§њ§ўћ§§њў§§ћћ§§њћљљћљћћњ§ўћ§§њћљњћљњњў§ћћ§њ§ўњњ§ћљљ§§њў§ћћь§љћ§§ћћјћћ§§ћћ§њ§§њ§§ђљћ§ўўћ§§ўўњ§§ўўїћ§§њћћўћўўўћўўј§њ§ћћ§§ўўя§њљјљ§њўў§њљћўўћўўњ§њўўћўўќћўњ§§њљ§љљјћћљњ§§ўњ§§ўњ§§ўњ§§њљћћ§ѓўћњњ§ћћ§ўўћў§§ўїћ§§ўћњ§§ўўё§љњ§ў§§љјњјћ§§ўўѕ§ћћљјјњ§њћјјёљ§§ўўљљћћ§§ў§њ§§ўњўўћћ§§ћ§§ўњ§§ќћ§њ§§ўњ§§єљћћ§§ћћ§њњ§ўўњўћ§§јћ§§њ§ў§њњ§ў§ќњ§§ўўўћ§§ўћўўќћ§§ўўјњљћњўўћўўћўѕ§њ§ўўћњїљћ§§ўњ§§љўњўўўћўўќ§ћљ§§ўњ§§§њ§њњѕћў§њњћ§ћ§§ћћ§ўњ§§ћќљћљћћњ§ўў§љћћ§њјћњ§њ§§їњ§§њ§јљјћћњљ§њњ§ўўёћў§§ћћјћљљћњўћ§§ў§ўї§њњ§љћјћљљљјћћ§ўћ§§їњў§њљћўћўўќ§ўћўўўћўўі§ўћ§§њ§јћ§§ўљћћћ§њ§љћћ№љњњ§њ§ў§§љћћјњјњњћ§ћюљћњњ§§ўћљљћѕљ§њ§њ§§њћњњ§§ћћ§љ§ћћэњ§њљћћєљћ§ћљћњјїїјњњъћјјњ§ћјјњћ§њўњ§§њ§§њјљљўњљљўћ§§ўћ§§§њ§ћћіљ§§њ§§њ§§ћћѕјћњјњћ§§ћљјјљіћљћћ§љћћљћћ§ћјљћљљ§ўў§§њћњјјћњњ§шљјјљјљћљљ§њўћўћў§ћњњјјњћћђљјћћјљљ§§њњ§љћћўњ§§ѕљћјћ§њћњљћјјў§њњњ§њ§њњ§§ћљ§§њўўј§њћљћћљћћ§ќњўў§§ўљћћќњўў§§ћњљћљљ§ћћ§ўњ§§ћћўћўњ§§љ§ў§ўљ§§ўњ§§§ўћўў§§ћљљњэ§ћћ§§љ§§ћјљљћљјјћљ§§ў§њ§ўў§ўёћўўњў§§ћљ§§њ§§ћћњњ§§њљ§§ўћљљћњљјјћ§њњўјћћљњїљњњћўў§љћ§љљјћјјњњјћћ§ћћљлњћћ§§ћљњ§§ў§њљњў§§ћ§ћ§§њ§ћћљњљљћњ§ўў§§ћјљїљњњљљћљћјїљћћќ§њћљљћљњјїјјћјјіѕїњњћћњ§ћјјѓљ§§љћјљњїњјњјјў§ћћ§ўћ§§ўњ§§њ§сњљћ§љћљ§ћћљ§§ћћњјљљњћћљћћљћћљљћћўњјј§њј§§њў§§ћ§ўў§§њ§§њќљњў§§ћћѕљћљљўћ§§ѓљћњ§§ћњљћћјћ§§ћ§§њћћєљћјљјћћљћљњћћљњ§њљћљћћ№љ§ћћјљ§§ў§љњ§ћ§ћћўљ§§љћјћћјљ§§ў§љњ§§љљћ§§іњ§§љћњњћљћћ§њљ§§ћњ§§љ§§§ћў§§§њћјјўљћћ§љўњјјљњљћљћћ§§ўћ§§ўћ§§ќњўћ§§№њ§ўў§њњћћ§§ћјјњјјќћ§љћћѕјћћ§љћљћњњљљќњћјњњїћњљљћњњћљљњ§ўћљљћўљћћќљћ§ћћўњ§§њћљњјљћћђљћћљћћљћ§ћњљњјјќњћњ§§љрћ§§ћљћћљ§њ§§ћћљљћљ§§љњљћљћћњјњјћћїљћјїљљўў§§§њў§§шўћїљјњљљћ§§љћ§§ћћљћ§њ§њћћјьљ§њћјјњћћљћћ§ћ§§њ§§ў ўђ§њјњњ§§љљєїљњјјєњћћљљјјљћљљћћњўћљљћћљћљ§§ќњ§§ўўцћўў§ћўћўњ§ћјњњљјњћљјјїјјљјјхљњћў§ћћјјћ§§ћњћњјњ§§ћјњњћћ§§ьњљ§§ўўћїјћ§§њћћњљћјњњј§їјњњћљћћљ§§ў§њјљ§њ§ћјњћћ§ћіљјћњћћњ§њћћћњ§љљ§§ћќљјљћћ§йћљјљњњў§њјјћћјњњјјїїјњїѕјњљњ§њ§ћљњњћјћ§§љњјљјћљ§§§њ§ћћ§ўў§§рњ§§њ§ўў§њљћљћљћћљ§§њљјњјјћ§§њ§њ§§єњ§ћўћў§љћљћ§§§ћў§§ћѓљ§§њљљћћјћљљћћя§њњ§љјљљ§њ§њ§§ћљћћњљ§ћ§§ўўўјљљјћјћјјњљ§§ўњћћњщ§ћњњјјњјљљћљћљћћњњјљјћўў§ўћ§§іљ§њ§§њљ§љ§§шљњ§ћћљћљћљњћњ§§љљњїїњћњјјіњѕїїјјћ§§ћћљљјљљћћљљ§ўњўўњј§њћўљњљ§§љєћљћњћ§§ў§§ћ§§ѕљњјњћћ§§њћ§§іњћћїњљїўў§§§њ§ўўђ§њ§§љ§§љћјїїјћћљыњјњјњљ§ћјњѕљћћјњјјљљћћїњјћ§њ§§ћ§§ќўњў§§ёњ§њњ§§њўўњ§ћ§њ§§ћљњ§§ћћђљћљњњљ§§њ§§ћћ§§ёљјљњњўўњ§§ћћљћ§§ћњўўћўў§§њ§ћћљ§јїћћћ§ћ§§ћћќњ§§ћћљјћњ§§ћ§њ§§ћјўњјј§ћѕљњњ§љјљћљљћћњјћњ§љљћљћћњщјћњћњњјљ§§љјњјјћћ§§њјћ§§ћћјјћ§§ћ§љј§§јњћљ§§њњ§§эњ§§њ§§њ§§ћћљњ§њ§ўўњњ§ўўћ§§ў§юњ§њ§§ћњѕ§њўўћћ§ћљ§§ўњ§§іњ§§њ§њњўў§§љњ§§њњћўўўћўўѓ§њ§ўћўћўљћјјћћќјњ§ћћ§ўњ§§ѕњ§ўћ§§ћ§§љўўўњўў§№љ§ћљ§§љљњ§§њљњћ§§ёјљљћј§њўћ§§љћљ§§ћњ§ћў§§ў§ўњ§§ќњ§§ћћњњјјњњљљўћ§§њ§љћњі§њњ§§ћјљљћћћ§ўўњўўњћўў§ћ§§§ўњ§§љћњјћљљњњўњњ§њ§њ§§љўћћўўњ§§јњ§§ћћ§њ§§сњўўћўўњ§њ§ћћњ§ўћўўњ§ў§љ§ўћў§њ§ўў§§ћў§§њћўўћћўўѕћўљњ§ўћ§§ћ§§ўћљљћ§љћљћћћљћ§ў§§њњўњњљ§§ўњћћ§§њ§ўўїћўў§њ§њњўў§їњћљ§§њњ§ўў§ћў§§ъћ§§ўўљњ§њњ§ўўњћљћ§јљњ§§яћ§љћљ§њ§њ§§ћћ§§њ§§ў§ћћљ§§ўўўћўўњ§§њ§ўў§ўўњўўїњўў§§њ§њ§§ўњ§§љ§ўќћўћ§§њћљћћљ§§ћ№њ§§њ§§ї§§њћљј§§ўў§ў§ ўўћўўјћўњћћљћ§§ќћ§ћ§§ўљћў§§њњўўіћўћўўњњўў§§ў§ўћ§ўўћўўјћўјћў§њўўњћўўњћўў§њљњњ§ў§ўћ§§ћ§ўњўў§§ўћўўљ§ўўћњћўўњў§јћј§ћ§§њ§§ўїњўћњў§љљ§§ъўљњњ§ћћљ§§ўћћўўљњ§ћўўњњў§ўўћ§њљ§ўўі§њ§§ўњ§§ў§§ў§§њўў§ў§ћў§§ўњўўћћўўњўў§їњ§љњњїўў§§ќўћћўўўћ§§ћ§§њўўї§њ§§ў§њљћћќ§ўў§§ќћўћўўјњ§ўћћўћўўњїў§љњљњњћўў§ћўњћћўўўћўўљѓ§ћћ§ўўћ§њјљ§ўўўћ§§§њ§ўўїћў§њ§љ§ћўўћћўћћўўўћўўї§ћј§ў§§љў ўчћ§§њњў§њћћљјљљћњ§§њњ§§њњ§§ў§§њ§§ўўћўўќ§њњўў§јњћћљћ§§ўўьњ§њў§§ћјљ§љ§§ћў§§љњўўћњ§§њўўќњ§§ўўњ§ћћј§ўўїћўўћљћљћ§§ьљјјњћћ§ћ§њ§њ§§њ§њ§њ§§ўћўўўћўў§љњўљўўњ§§ўў§§љ§њ§ўўћћјњљ§§ўў§§ўћјјљєћњњ§ћљјљћ§§ўўќњ§њћћ§ўѓ§њ§ћўў§§ўўњ§љљ§ўўћўў§ўњ§§ўњўўљ§њ§љњћўў§ўњўўќћўўћћ§ўћўўў§љѓў§ў§ў§ў§ў§ў§ўўќ§ў§ўў§§ћўўў§ўўўћўўќ§ў§ўўіћ§ћ§ћ§ћ§§ўўіћў§§ћљј§§ўўёћ§§ў§ўћ§§ћћ§§ў§§ўѕћ§ћўћ§њњћ§ћћњњћњћњ§§єћњћ§ћ§њћљњћ§§њћњњћћ§§оћ§ћ§ћ§ћ§ћ§ћ§ћ§ћ§ћ§ћ§ћ§§ў§§њћћ§ћ§ћ§§§њћњњё§ћњћ§њћњћњ§ћћњ§§ћћ§ћ§ћћўьћ§§ў§§ћў§ў§ўў§ћ§ўў§ўўў§ўўфћ§ћњњ§ћў§ўћ§ћ§ћ§§ўў§§ўњў§ў§ўўќћ§§ўўќ§ў§ўў§ьћ§ћ§§ћћ§ћ§ћ§њћў§ћ§ћ§§ўћ§§ћћ§§ў§§єћ§ўњњћћ§ћўў§§яњћћў§ў§§ћ§ћў§ўћ§ўў§§ћўўћ§ћљњљњћћ§ўўћ§њњћ§§§ћ§њњьћ§ћў§ўўћњ§§ўћ§ћ§ћ§§ўўс§ћњћ§ћ§ћ§ћ§ћўћ§ћ§ћ§ћ§ћ§ћњњ§ћћњ§§ћћў§ў§§ѓњћ§ћ§њ§ћ§ћўћ§§тћ§§ўў§ћ§ћ§ћ§ўў§ўћ§ћў§ў§ў§ўћ§§ўў§іћњ§ў§ў§ў§ўўі§ўћ§ћў§ћљћћј§ћ§ћ§ћ§ћћ§ўў§ўўј§ўћњћ§ћ§§ўћ§§ўў§§јў§њ§ћћњћћ§яћ§њћњћњћњћњ§ўўћћњњњ§ћ§§њ§§њћ§ћ§ћ§§ћњўћ§§ѕћў§ў§ў§§ћћњњћщњ§ўў§ћ§ћ§§ў§§ћ§ћ§ћ§§ўћ§§ќћњ§ћћю§њњћўў§ћ§ћ§ћћ§ўћ§ўўўћў ўє§ўўћ§§ћ§њћ§ћћт§ћ§ћњњћћ§ћћњћњћ§§ћ§ћўћ§ћћњњљњљљўћњњћљ§ћћњћњ§§ќћўўћћє§ћћ§ћ§ћ§ћ§њ§§ћћњћћ§њњѕћњћњ§ћ§ћћњћћњљњљљњљљўћ§§њѕљњ§§ў§§ћ§ћ§§ћўљћћў§ћћѕ§ћ§§ћњћњћћ§§ћћ§ћ§њњј§њљњљњ§ћћњў§ћћ№њ§ћћњћњћњњћ§ћ§њћћўє§ћ§ћ§ћћљњњћ§§ћњ§ћњћћ§єў§ў§§њљљњњљњњњћ§ћњњћћ§ћяњћњ§ћ§ћћњ§њ§§њљћњњ§§ћ§§ќћ§ћ§§ђћ§ћ§ћ§§ў§ў§ћ§ћћ§њћњњѕ§ћ§§ўў§ћ§ўњњё§ў§§ћ§ћ§њћњћћњћћњўћњњљ§ћ§ћ§ћўў§§ћ§ћћ§ўў§ћћљ§ћ§ћ§ћ§§ѓћ§ћ§§ў§ў§ў§ўћћ§њјћ§ћ§ћћ§ћћњћє§ћ§ћ§ћ§§ў§§ўўє§ўћ§ћ§§ў§ў§ўўј§ўћ§њўћ§§ћёњћ§§ћ§ћ§ћ§ћ§ћњћћњћњўћ§§ўћњњѓљћћ§§ў§ў§ў§§ћћў§њњќљњњћћќњћњћћћљњњ§ћћщ§ћ§ў§§ў§ўћ§њ§њћћ§ћњњћ§ћћ§ўёћ§ћњјљјњљљћћњћњњўћњњ§ўњћћќњћљњњўћњњїћљљњњ§ћћњњѓћ§ћћњ§ћљњљњљњњј§њћњ§ћ§ћћљ§ћ§ћ§ћ§§љћ§§ћњ§ћћё§њћћ§ћћњљњјјњњћћќњћњћћ§њћњњйљњ§ћ§ћ§ћўћ§њ§ўў§ў§ў§ўћ§ћ§ћ§§ў§њћ§ћњ§ћњћћђњ§ћ§ћћ§§ћћљћњћћё§ћ§њћћ§ўћњћњњјњњћњућњ§ћ§ћњћћњћћ§њћњћћ§§ћ§§ћўћћњћћќ§ћћњњї§ћ§ћ§§ўћ§§ћћњћ§ћ§§ћђњљљћћњњћњљћ§ћ§§ћј§ћўў§ћ§ћћў§њњћћњћњ§ћћњхљћњћњњ§ћ§њ§ћ§ћ§њ§ћ§ћ§§ўў§ћ§§ѓўћ§§ћњ§ћћњњљњњђ§ћћњћњћњћћњњ§ћћљћђљњ§њљњњ§ћћњ§§ћћ§ќћ§њћћњћњњћњћњ§њњў§ћћ§ѕћљњћњњћњћњћћїњћњ§њљјљњњѓљћ§ћћ§ћ§ћ§ћ§ћћљ§њћњњћ§§ћщњћћњў§ћў§ћњћњћљњљњњћњћњњћпў§§ћ§ћ§ў§ћ§ћ§§ўўћћњјјњ§ћћњ§ћћњћњ§§њыћњћњњћ§§ћњњљњњћњћћњћ§§ќћў§ўўў§ўў§§ў§§їћ§ћљїѕјљњњ§љњћћ§§њћћњњћњњљћћўњћћ§§ћ§§ўћўў§ў§№њ§љљјњљћћ§њљїїјњњцћ§ўўћњњ§ћњћ§њ§њљ§§ћ§њњљљњћћљ§ўћћўўњњ§љњћљћњњљљњ§љњљљѓњћћњћћ§ћўў§ћ§§чўћ§§њњљњњћњ§ћ§ћћњћћњњљњћ§§юћњћњћ§§ўўћ§ћћњћ§ћњњћі§ћ§§ўћ§ћ§њњѓљњњљљњљћљњљћ§§іњћљљњ§њ§ћ§§ъћњњћћ§ћ§ћњњћћ§ў§ћ§ћ§ћ§§ќўћ§ћћєњћњњћћ§§ћњљњњю§ћ§ћ§ћ§ћ§ћ§ћў§ўў§ћћѓ§ћ§ћў§§ћ§њћћ§§ћіњћћњћћњћњ§§ћќњћћ§§ћњјў§њ§ћў§ўўў§ћћѕ§ћњњљћћ§ћ§њњ§ќњљљњњћѕњћћњљљњјњњўўјћ§њ§ћ§ћ§§щћ§ћћў§ћ§ў§ћћњћњћњћ§ћ§§ћћљљњћљњљњњэљњљљњ§њ§ћћњњћњћћњњћћі§ћ§ћ§§ў§ў§§ўыћљћћ§ћ§ћћњћњљњ§ћўћ§њ§§рћ§ћћљњљњњ§ћ§њ§ћћ§ћњћљћўў§§ћ§ћ§ћўўўћ§§єћ§ћћњ§њљњћњћћѓљњљњљћћњњљ§ћњњћњтљњћћ§ћ§њ§ћ§ћ§§ў§§ћ§§ћ§§ћ§§ў§§ћћщ§ћ§ћ§ћ§ћў§§ћњњћћњћљљћћ§§ћтњ§ћ§ћњћ§§ў§§ћ§њњћњћ§ћ§ћ§ћ§§ў§ўўє§ўў§ћ§§ћњћњћћыњћњћњ§њ§ћћњћњћњ§ћ§њћњњћњњ§ћ§њ§§ћћ§ћћњњіљњњ§ћ§њћћ§§§ћњћћїњћњњљљњ§ћћыњћћњћљљњћ§ћљљњћћ§ћњљњњє§ћ§§њћ§ћ§ћћњњы§ћ§ћћњћњ§ћ§ћ§ћ§§ћћ§ћ§§ўћ§§ќћ§ћ§§ћ§њћ§§ў§бћ§§ў§ўў§ћ§ћў§ўћ§ћ§ћ§ћ§њљљ§§ў§ўў§њћћ§ћ§ћ§ћ§ћ§§ћ§§љўћ§ћ§ћ§§ўќ§ў§ўўў§ўў§ўњюћњњћ§§ћњњћћ§ћ§ћ§ћ§§іўћ§њ§ћў§ў§§фў§§ћ§ў§њћћ§§ћ§§ћ§ћљњ§ћ§ћ§ћ§ћћ§ўк§ћћњћћ§ћ§ћў§§ћ§§ў§ўћ§ћ§ћ§ћ§ћ§ћ§њћњћљњ§§ћќњ§ћ§§§ћ§ћћњћћ§§ћ§§њћњњћћњњќћў§ўўђћўћ§ћў§§ћ§њљњћћ§ўў§ўў§§ў§§њћ§ћ§ћўўј§ў§§ћ§ћ§§ќћўў§§њћ§ћ§§ўў§§њћ§§ќў§ў§§ў§ѕў§ўћ§ўўћ§ћў ў§ўјћ§њ§ћ§њћћэў§ћњћћњћћњћўћ§ћ§§ў§§ћћ§ћ§њњіћ§ћ§ћ§ћ§ћўў§§ў§ўўјћ§§њћ§ћ§§ў§ћќњћћўў§ъћў§§њћњ§§ћ§§ћ§ћ§ў§ўћћ§§яћњњћћ§ћ§ћў§ўћ§ћ§ћћ§ў§ўўў§ўў§ўћ§§їў§ўћ§§ў§ўў§§ў§§§ўћ§§ўћ§§§ћ§ћћ§§ў§ўўђ§ћ§ћ§ћћњћњњћ§ћћэ§њћ§ћћ§ћ§ў§ћ§њћћ§ћўўј§ћћ§ћў§ўўєћ§ћ§§ў§ў§ў§ўўј§ў§ў§§њћћ№§ћ§ў§њ§ћ§ћ§ћ§ћ§ўў§§ћ§ўў§ёў§§ћ§ћ§§ў§ўћ§§ўў№§ўћў§ў§ў§ў§ў§ў§ўўќћ§§ўўћ§ўў§ўў§ўў§§їћ§ћ§ћў§§ћћэ§ћ§ћўћ§ћћњћњ§ћ§§ў§ўўіћ§§ў§ўў§§ўўъ§ў§§ўў§§ћћњ§ћўћћ§§ћ§§ўўў§ўўў§ћћћ§ћўў§§њњћћ§ћўўї§ўў§ћў§ў§§ћў§ўћ§§ўў§§іћў§§ћўћ§ћўў§ўьћ§ћў§ў§§ћ§ћ§ўў§ў§ў§ўўњ§ўћ§ћ§§ќў§§ўўњћ§ћ§§ўўї§ћ§ћўў§§ўў§ёћўћ§ћњњћћўў§ћ§ўў§ў§ёўћў§ў§§ўў§ўћ§§ўўў§ўўю§ўўћћ§ўўћў§ўћ§§ћћўўі§ўў§ћ§ћ§ћ§§ўјћ§ћўћў§ўўў§ўўђ§ў§ў§§њћћўћ§ћўўў§ўўћё§ўўћ§њњћ§ћћњ§ћ§§ўћ§§їћ§ћ§ћў§ў§§ќћ§ћўўћ§ў§ћ§§ўєћ§ћ§§ћњћњ§ћўў§ћћў§§ћћѕўћ§ўўћ§ў§§ўў№ћ§§ў§ў§§ћў§ў§ўћњњўћўўў§ўўћѕ§ћћњњљћњ§њ§§ћћ§ћ§ћћћў§ў§ўўњ§ўћ§§ўўј§ћ§ћўћ§ћћћ§ћў§ўўђћњљћ§ћћў§ћ§ћ§њњї§ћћњ§§ћњћћѕњ§ћў§ў§§ћ§њњњ§ћ§§ў§§ўњ§ћўў§ћћћ§ћ§ћўўј§ў§ў§§ћ§§ћѓ§ў§ў§ўў§§ћў§ўўђ§ўћ§ћ§ћ§§ў§ў§ўўћ§ўў§ћўў§ўўј§ў§ў§ў§ўў§ќћ§§ўўў§ўўњ§ўћ§§ўўќ§ў§ўўў§ўўї§ў§ў§ўћў§§ѕћ§§ў§ў§ў§ў§§ўћ§§їў§ў§§ћў§ўўш§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўў§їў§ў§ў§§ћ§§ќў§§ћћ§ёўћ§§ў§ў§ў§ўў§ћўўќћў§ўўў§ўўќ§ў§ў ў§§ў§§ў§ўќ§ў§ўўў§ў ўљ§ў§ў§ў§§ўў§§№ћў§ў§ў§ў§ў§ў§ў§ўўі§ў§ў§§ћў§ўўњ§ў§§ћўўќ§ў§ўўў§ўўў§ўўђ§ў§ў§ў§ўћўћў§ўў§ў§ћ§ўќ§ўћ§§ўњ§ў§ў§ўўє§ў§ў§ў§ў§ў§ўўї§ў§ў§ў§ў§§љўћў§ў§ўўљ§ў§ў§ў§§§ў§ўўў§ўўј§ў§ў§ў§ўўў§ўўў§ўў§ ўў§ўўюћўћ§ћў§ў§ў§ў§ўћў§ў ў§ѕў§ў§ў§ў§ў§ўўћ§ў§ў§§ћўћ§ћўўњ§ў§§ћ§§њћ§ћ§§ўў§ўў§§юў§ў§ў§ў§ў§ў§ў§ћ§ў§§§ў§ўўњ§ўћўћ§§ўњ§ў§ў§ўўј§ў§ў§ў§ўў§§ў§§ўћ§§ўњ§ў§ў§ўўў§ўўј§ўў§§ў§ўў§§ў§§ђћў§ўћ§ћ§§ў§ў§ўўї§ўћўћўћўћћ§њћў§ўћ§§§ў§ўў§ѕћў§ў§ў§ў§ў§§љў§ўћ§ћ§§яћ§ћ§§ў§§ћ§ћўћўћ§ћћњќўћўћћ§ќў§§ћћ§ўл§ў§ў§ў§ў§ўћ§ћ§ћў§ўћў§ў§ўў§ћ§ћў§ў§ў§ў§§эўћўћ§§ўћ§ћўћћ§ўћ§ћ§§юћ§ћ§ћ§§ў§ў§§ћ§ћ§§ўўљ§ў§ў§ўћћњў§ў§ўћћї§ћўћўћў§ўў§ћ§ъћ§ћ§ћ§ћў§ў§ўћўћ§§ў§ўћ§§ьў§ћ§§ћћ§ў§ў§ў§ў§ў§ў§§ўњћ§ћ§ћ§§§ў§ўўћ§ў§ў§§ўі§ў§ў§§ћ§ћ§§ћў§§ћ§§ћў§ў§ўўі§ў§ўћўћў§ўўю§ў§ў§ў§ў§ў§ў§ў§ў§ўўўћ§§ўў§§ўў§§§ўћ§§§ћ§ћћ§љў§ў§ў§ўўў§ўўќ§ў§ў ў§ў§јўћ§ћў§ў§§њў§ў§ў§§јћ§ћў§ў§ўў§ћўћ§§ўўњ§ўћўћ§§єћўћўћўћўћ§ћ§§ўў§§ѕўћў§ў§ў§ў§ўў§ўє§ў§§ћўћ§ћў§ўўі§ўћ§њ§њћћ§§ћћ§ћў§§ўў§§ћєўћћ§ўћћњћћў§§ўўћћњўћ§§ў§§§ћўћћѓўћў§§ћ§§ў§ўћўўђ§ў§ў§ў§ў§ў§ўћ§§ўћ§§№ћ§§ўћ§ћћњ§њ§ћ§ћ§§юћ§ћ§ћ§њћћўћћ§ў§ў§ўў§ ўќ§ў§ўўћ§ў§ў§§ўў§§сў§§ћў§ўћћ§§ћўћў§ў§§ћў§ўћ§§ўћ§ћ§§їћ§њ§ћ§§ў§§ќћ§ћ§§њћўћў§ўўў§ўўѕћўћ§ўў§ўћћ§§§ў§ўўь§ў§ўћ§§ў§ў§ў§ў§§ћўћ§§ђћ§ћ§§ў§ў§ўћў§ўўќ§ў§ўў§юћўћ§ћ§ћ§§ў§ўњўћўћ§§ўў§§ќў§ў§§ћў§ў§ўўњ§ў§ў§ўўћћў§ўћћ§ўћ§§їћ§ћ§ћ§ћў§§§ћ§ћћ§љў§§њћњ§§љўћ§ћ§§ўў§§ў§§§ўћ§§ўћ§§ўћ§§ўњ§ў§ўњ§§іћ§§ўћ§ћ§ћ§§§ћ§ћћћўћўћўўя§ў§ў§ў§ў§§ћў§ўћў§§ћў§ўћ§§іў§ў§ў§§ћ§ћћћўћ§ћ§§юћў§§ўў§ў§ў§ў§ў§ў§ўўї§ўњ§њ§§ў§§шўћ§ћ§§ў§ў§§ћ§ћћњ§§ўћўћў§§јћў§ў§ў§ў ўі§ў§ў§ў§§љњњђћўћўћ§ћ§ћ§ћўћ§§њћ§њћћ§§їўћ§§ў§ў§ўўў§ўў§ћў§ћћ§ёћњћљ§ћўњћћўћ§§ўў§ќў§ў§§єћ§§ў§§ћўћ§ћўўў§ўўќ§ўћ§§ћ§ћўўћћў§ћћїўњ§ћ§ћў§ўўњ§ў§ў§ўў§књћ§§ћ§§ў§ўў§ћ§ћ§ћўћў§ўћ§ћ§ћў§ў§ў§ўћ§ћ§§ўњћ§§ў§ўў§§ў§§јћњўћўњ§ћћј§ћћ§ў§ў§§ћ§уў§ў§§ћ§ћў§ў§ў§§ћў§ў§ў§ў§ў§ў§ўўє§ћ§§ў§§ћў§ўћћ§ѕў§ў§ў§ў§ў§ўў§јћ§ћў§ў§ўўњ§ў§§ћ§§§ћў§§їћ§§ў§ўћў§§љў§ў§ўћ§§ўў§§ў№§ў§§ћ§ћўћћ§ў§ўў§§юў§§ћўћўњћ§§ћў§§ћ§ћћќ§ћ§ўў§ўў§§ёў§ў§§ўў§ў§ў§ўћ§§чћ§ћўћ§§ў§§ћўћћ§ўћўћўњ§њћ§§эўћ§§ўћўћ§§ў§ў§ў§ў§ўўќ§ў§ўўћћ§ў§ў§§љўћўћ§§ўў§ћў§ў§ћћ§ўў§§ўњћ§ћћ§ўўњ§ў§ў§ўў§юў§ўћ§ћўњћћ§ћ§§ћћўћћњў§ўћў§§љўњўћ§ћ§§љћўћў§ў§§ћў§ў§ўўќ§ў§ўўў§ўўь§ўћў§ў§ў§ў§ў§ў§ў§§ћ§§ћёў§ў§ўћ§§ў§ўћ§§ўў§їў§ў§ў§ў§ўў№§ў§ўў§ћ§ћ§§ћћ§ћ§§ѓўћ§ћ§ћ§ўў§§ћ§§њўћ§§ў§§јў§ў§ўћўћћяўћћ§ў§§ћ§§ў§§ћ§ћ§§ёћ§њћћ§§ўћ§§ўћ§ћћќўћўћћјў§§ћўћћ§§ўў§§њў§ў§ўћћ§эў§ўћ§§ў§ў§ў§ў§ўћ§§ўўь§ў§ў§ў§ў§ў§ўћ§§ў§ў§ўўњ§ў§ў§ўўќ§ў§ўўє§ў§ў§ў§§ћ§§ўў§ѕў§ў§ў§ў§ў§ўўў§ўўј§ў§ў§ў§ў ўќ§ў§ўўщ§ћў§§ћ§§ў§ўћў§ў§ў§ў§ў§ўў§ўў§ўўћ§ў§ў§§чў§ўћў§ў§§ћ§§ў§ў§ў§ў§§ћ§§ўўі§ўћ§ћў§ў§ўўќ§ў§ўўё§ў§ў§ў§ў§ў§§ћ§ћћ§§ўћ§§јў§ў§ў§ў§§ѕћў§ў§ў§ў§ў§§ ўю§ўў§§ў§§ћўћ§§ў§ў§ўў§їў§ў§ў§ў§ўўј§ў§ў§ў§ўўј§ў§ў§ў§ўўј§ў§§ћў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўў§ў ўў§ўў§ўў§§ўў§§њћ§ћ§§ўўќ§ў§ўўљ§ў§ў§ў§§їў§ў§ў§ў§ўўњ§ў§ў§ўўі§ў§ў§ў§ў§ўўћ§ўў§ўўњ§ў§ў§ўў§чў§ў§ў§ў§ўћ§§ў§ў§ў§§ўў§ў§ўўљ§ў§ўћ§ў ўњ§ў§ў§ўўў§ўўў§ўўѕ§ў§ў§ў§ў§ў§§§ў§ўўњ§ў§ў§ўў§§ў§§ў§ўћўўє§ў§ў§ўў§§ў§ўўў§ўўќ§ў§ўўі§ћ§ћў§ў§ў§§їў§ў§ў§ў§ўўў§ў ўў§ўўњ§ў§ў§ўўў§ўўў§ў ўі§ў§ў§ў§ў§ўўў§ўўќ§ў§ўўі§ўћ§ћ§§ў§ўўў§ўўў§ў ўњ§ўў§§ўўќ§ў§ў ў§ќћў§ўў§ќћ§§ўўў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ўўњ§ў§ў§ў ўі§ў§ў§ў§ў§ўўќ§ў§ўўќ§ў§ўўў§ўўќ§ў§ўў§ўћўўќ§ў§ўўў§ўўў§ўўў§ў ўќ§ў§ўў§ўі§ў§ў§ў§ў§ўўќ§ў§ўў§ў§ ўў§ўў§§ўћ§§љў§ў§ў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўўњ§ў§ўћ§§ўў§ўўі§ўћў§ў§ў§ўўќ§ў§ўўў§ўўў§ўўў§ў ўђћ§ћ§ћў§ў§ћћўћ§§ќў§ў§§ўў§ў ўў§ўўќ§ў§ўў§§ў§§ўћ§ўѕ§ў§ў§§њўћћ§§ў§ўў§§ў§§ў§ўўќ§ў§ўўў§ўўі§ў§ўћў§ў§ў ўњ§ў§ў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўќњћњ§§ўћњњїјњјјћљ§ћ§§ўљћћ§ћћјјћ§§њўѕ§јљњїјљ§§њ§§ћуњ§љћљљ§§ўў§ћјћ§§ћћљћ§ћћљћћљ§ћћљ§№ўњ§§ўњњћљј§§ћћњљљі§ћљћљљћ§§ћћћ§ўў§јјћљћћњњ§ћћњћ§§њљљ№§њ§§љњўўњћљљћ§ў§§єњљ§§ћћ§§ў§§ћћђњїїљљћ§§њњ§§ў§§ўў§§юћљ§њ§љјјљ§љћћљћ§ћјјўљ§§ќњ§§ўўњў§љљ§§ћњ§§іўљ§ўњўў§§љљѓћљљњљћљ§§ћљћ§§єњљћћљљћћњјј§§њљћћљљ§§ўў§§ўћ§§ўњ§§ўњ§§ћњљњјћћ§§ўњ§§њћ§јјћњњч§ћњћљљћћљјјњјљћ§ћјљ§љјћ§њњ§ўћ§§ћњћѓњјњћ§§њ§§ўўћ§§ђћў§ћѕљјћњћјњљ§§ћњјўћљљѓ§њ§њ§ўўћ§ў§§ћћјњїјћњњўў§љ§§№њћћ§§ћљњ§јћћјћ§ўў§юћ§§ћњњљљ§ћћїљјћћљ§§ѕљћћјјњћ§§њ§§ўљ§§ћъљ§њњћњ§љћњњјћљњћљћ§њљ§§ўњ§§њљјјњњћћјўћ§§ўю§ћћљћћњњћјјњњљјћћ§§§њ§ћћ§љњјјћўљјјђњјљћ§§њ§§ћјћ§њњ§єњ§ўў§ћћњћћљћћ§§љћћэљћ§§њњ§§ћћњњїљјљњ§ћћї§ўў§§ћњ§ў ў§шњ§ў§њљљ§§ў§§љ§ћј§§ў§ћћљјјіњљћћљћћљћ§§ћїљ§њўўћўћўўћў§ћїњ§њ§ћћљ§ўў§їњўў§§љћњ§§њў§њ§њћћ§ќњ§јњњѓћ§ћњњљљ§§ћјљћћћњјћ§ћћ§љјћћўњ§§ў§§њўў§§љ§§ьњ§њћљљјљћјїјњћћјїїњћћўљјјўљ§§ћє§ћљљњјњњћћ§ўўћїў§њ§§ўў§њњљњ§њљћ§ўўў§њњм§ћљћњ§ћљљѕ§§њ§њ§љћљљѕ§§њ§§ћњљћњњ§§ћ§§љћњ§§љћ§§ўћњћћљ§§ќњћљ§§ћљјљљ§§ћўў§лњ§§ћљњјїњњћћњћљ§њљћћ§§њ§ћљљћ§њћћјћљћ§§њўљ§§ўўћћўўћўўѕњўћ§§ћћљћ§ћћњ§ў§ћћ§§ёљћјљљ§§ћ§ўў§§ћ§§ўњўўњњљњўў§§њў§ўўћўўўњ§§ќњ§ћјјљћљњљљњ§§ћћњјћћ§§ўњ§§љњўўњ§љ§§ќњћћљљ§єў§§њ§ўўњ§§љњњ§ћљ§§љћњјјњћ§§ћјўњ§§юљј§§ћћљ§§њћћљћћљ§њњэ§њјћћїїљїљћњњ§ћћљљћћћ§љћћљљќњ§§љљўњ§§јљ§ћўўћљўў§ќљћ§ўў§ћљўњ§§ўљ§§ќљњњ§§њћљ§њ§ћћ§љёњћ§љ§§ј§§ўў§њћўўљћўўњ§љўў§§љјћћєјљїїјћјћљњњ§§ћњњјћ§њўўќњї§ўў§§љњ§§љќћ§ў§§ћњїјњїїљљњћ§§ўіњ§§ћњћћљћ§§њўљћћќљћћ§§ў§§њ§§њќћњњјјѕњљћћљћњћћљћћљљјљћ§њћћў§ўў§ћљћћљћћ§ўўћўўў§ўўљњїљњњљ§§ўњўўћ§љљјїїћјћљјћћўљњњ§їњ§њљ§ћћ§љљћ§ћќўћ§ўўљћ§њ§ћћјјљћ§§ћћ§ћћ§ўњ§§ўћ§§њћ§јљ§§ыљјјљ§§њ§§њћћ§љљ§ўў§њ§§ћ№њїїјћћљљ§§ћљњљљўўё§ћљњњљљћљљ§њњћјјћєћ§§ўўшњћћјљљ§§ћўў§§ћћљћљњ§ћљљ§§ѕћњњљ§ўћў§њ§§њ§ ўўњ§§ќњћћўў§ћўћћєўћћ§ћљ§љћћљњњќ§љњ§§ћў§§ў§§іњ§њњ§§ћўћўўэћўў§ўћљјѓјћњљњ§ћўћўў§ў§ћћ§ўў§љљѕћ§ћў§§ўћ§њ§§љњљ§§њ§ўў§єљњјњњјњјљ§§ўўљѕ§њ§њћљ§ўўњўўё§љјћ§§њћћљћњ§ћўўўћ§§ћњ§љћљљўћ§§ўљћћљ§њ§§ўћўў§ў§њёћјјћћ§ў§њћ§њ§§ћћљ§ ўў§ћћ§ў§щњ§§љјјњћћљљћњњ§ћљ§§њ§љ§§ьћљњјјљ§§ћ§љњљјљћ§њћўў§ўўћўў№њўњ§ћњњљћљћ§ћћљ§§ўњјјјћњ§њ§ўў§§ќњ§ћўўѓњўњ§§њњўњ§њљў ўњњћ§§ћ§§ќњ§љ§§ђћњ§§њћћљ§љљњ§њњ§љљ§§ўўћўўєћўў§§ўўћўћњ§§пњ§§ўў§§ѕїљљ§ћћљљ§§њ§њ§њљћ§љљћўћћў ў§њњ§§њ§ўўњљН§њ§ўў§њ§§љўўњ§§њ§§њ§ћљљјљљ§§њњ§љўўњ§ўћћ§њ§ћћњ§ўў§њњћљњўўњћћљ§ўўњљ§ўўўћўўя§ћњ§§њљњ§§њљћљљћ§§ћљўћ§§ўў§§ўќћњ§ўўјљћўў§њњ§§ўћўјњћўўћўњ§§ўњ§§§њћўў§њђ§јњљњўўћўћ§§љ§§ўњ§§ ўћћњ§ћўў§ўўњўўћўњ§§ћўўїњўўљљњћћњњўћ§§љћ§ћўћћў§§ќўћўћћў§ќњћљ§§§њ§ўўћўўњљљќњјјљљљј§ўўћћўў§ўєћў§§ћћ§њ§§љ§§њўћћўўћўўќ§ћћ§§ћћ§љћ§§ќњћљњњўјћ§ћ§њ§§ўўћћ§ћњўўіњ§§ўўњўўћўўўћ§§њљ§ўўћўњ§§нћњћїћљћјњћћљћњњ§љўўњ§љ§ў§њў§љ§ўњћћ§§ћњ§§њўўўћў ў§њќљўћўў§§њ§§ўјћўўћўћћўўў§ўўјњ§ў§њ§§ўўњњ§§ўћ§§ћњ§§ћўўўћўў§њљњњћ§ўўћ§ўўћўўўћўў§љњ§ћљњћ§§щћ§њћћљ§њ§ўў§§њ§§ћ§§њњ§ўў§ўќ§њњўўў§ўўўћўўіњћћљњљћўћ§§§њ§ўў§ўќћ§§ўўюњўў§§ўћўњћїјјћєњћљљђњ§ћўў§њњ§§њћљ§§§ўћўўјњћјљ§§њўўїњ§§њњ§§њ§§ќћљ§ўўё§њљћ§њћћљ§§ў§§ћћ§ћћјїјўўўћўўњ§ўћњ§ўўјћ§§ўћ§љ§§љѕћјјћ§ўћ§§ў§§ў§ѓњ§§њћћњјћћ§ћўўќћўў§§ћњћ§§ўў§ќњ§§ўў§ђњ§§ћ§§њ§ўўћ§њ§§ўћўўћ§ќћњ§ўўўћўўѓ§њўћў§§ўў§њ§ўў§§њўў§ћњ§§ўўћўўўћўў§њљћ§ўўћўўўћ§§№њ§ўњ§љљћњ§њћћўћ§§§њћўўѓћўў§§љњћњћўћўў§њ§њњќ§ўћўў§ўќћ§§ўўі§ўћўћўўћў§§љћўў§њћўўћўўћўўј§ћћ§§ўў§§ўўћўў§ћњў ўќћўћўўѕ§њїњљњћ§§њўўћў§ўўћўўўњў ўўћўў§ўў§§яћўўћњ§ўў§§ўўћў§§ўўўћўўњћ§§ћўћћўўћўўќћ§њўў§ ўўћ§§щњўўћўўћўў§њћћљ§§ћћ§њњ§ўўѓћўўћўў§њ§§ўўњњўћўђњ§љўўћўў§§њњ§ўўє§љњљњ§њљўћ§ўў§ќўћў§§ћњ§ћћў ўіћўўњјљћ§њўў§§љўўњўў§њњўћўў§§ўћўў§ўўћўўњ§њўўћўў§ўћ§ў§њўўњћў§§ћўў§јњ§§ўўћћўўљ§ўћћўћўўў§њњќ§ўњўўќћ§§њњўћў ўѕћўўћ§§њўўћўўўћўўќћњћўўњ§ћљ§§њњ ўћ§ўћўўэћўўћћўўљњњљћњ§ў§њ§ўў§ћў§§ўњў ўў§ўўўћўўќ§ўћўўћў§ўњўўїљњ§ћ§ћ§њљљ§њљњњћѓњћ§ћ§ћћњћњ§ћњњ§§ћ§§ќў§ў§§љћљљњћћ§§ћс§ћћњ§ћћњћћ§ћўўћњ§њ§ћћњћњ§њњћћњћћњћ§ўћ§§ћљ§ћ§њћљћћќњ§ћњњћћўў§њњіћњћћњ§§ћћњњіћњћљљњћћ§ћћ§јћў§ўў§њћћуўћ§ћ§ћ§ћ§ћњњ§ћўћ§њћњћљљњћћњћ§§ўћ§§їћ§ћ§ў§ћ§ћћ§ќћњњћћўњћћњћі§ћ§ћ§ћ§§ў§§ћѓ§ћ§њ§ћ§ћ§§ўћўў§ћћњћћ§ћћў§ћћљ§ћ§§ћњћћ№њћљњћ§ћ§ћћњћћ§ћ§§њћ§ў§ћ§§ућ§ћ§ћ§ћћњћљњњћћ§ћ§ћ§ћ§ћўћњњћ§§ќњљњћћѕњћњњљњћћ§њћћњўћ§§юћ§њ§ћ§њњљљњћљњљћћ§§тћў§ўћ§ћ§ћўў§њњјњњ§њњљћћ§ћ§њћљњњћћ§ћ§ћўўљћўћ§њћњњљ§њћ§§ўўћћъ§ћ§њњћ§њћ§§ћћњ§њ§ўў§§ћћє§њљљћћ§њћћјњњћќ§ћћњњ§љњ§§оћ§ў§ћ§ћ§њћњћћ§§њ§§ћњљљ§ћћљњћњ§§ћћ§§ўћ§§їћ§ћњњљљћњњё§ћ§ћў§§њћћњњў§њњљщјњњћћ§ћ§ћћњћњћљњњ§њћњћњњђљњћњ§ћ§ћ§њ§њћ§§ъћ§ћў§§њњљћњћњћњ§ћћњћњћћ§ћћ§њћљљэјњћ§§њћњ§ўўћ§њ§ћў§ўўќ§ў§ўўїћ§ћ§ћўћ§ћћ§ћєўћћ§§ћўћћњћњњљљћћњћњћћѕ§ћ§њњћћ§ў§ў ўљ§ўћ§њњ§§њњћћ§§ўўщћ§ћ§§ўћ§ћњ§§ћ§ћ§ћўћ§ћ§њњ§§ћ§љљњђ§њљљћў§ћћњћњћњњћёњћћ§њћњћ§ћћ§ўў§§ўї§ўћўћ§ћћ§§њњћћњћњњћљћњњљљњќћњћњњћћ§ћ§њћћіљњљљњњћў§ўў§§ћў§§ћ§њћњ§§ў§§ћњћњ§ћћ§єћ§ћ§ћћњћћ§ћ§§ћќљћњ§§ћм§ћћ§§ћћњ§ћ§§ў§ў§ў§ћњўћ§ћ§ћ§§њћ§ћ§ћ§њњћї§ћў§ў§ў§ўўхћ§ћ§ћ§њћљњњљљњњљњћћ§ћћњ§ћ§ћћєњ§§њњ§њћњ§ћ§§њў§ћ§ћўўќ§ў§ўўў§ўўш§ћћњћњ§њћњћњ§ў§њћћ§ћ§ћњћћў§ћћќў§§ћћћ§ћ§§ўў№§ў§ў§§ћ§ћўћў§ў§ўў§њћ§ћ§ћњњьћљћћ§§ћ§њћљњњћћ§ћ§ћ§§ьћ§ћ§ћћ§ўў§ћўћ§ћ§§ћњћћ§ћъ§ћў§§ћ§ћњљљњћћ§ћ§ћ§ћ§њњїљћћ§ћ§ћ§њњ§ћљ§ћ§ћ§њћћ§§њћћќњћћ§§њљђјљјњ§§ћњњћћњњћћњћќ§ћ§ћћѕ§ћ§ћ§ћ§ћўћўўь§ў§ћћ§ўњћў§ўћ§ћњњћћ§§эћ§ћ§ћ§ћў§§ћў§§ћ§ћ§ћћ§јћњћњћћ§ћћѕ§ўћўћ§§ћћў§§ўљ§ў§ў§ћўўљћ§ћ§ћћњњїјљљњћ§ћћ§§єћ§њћњћљњњ§§ўўўћўў§ђћ§ћ§ћћ§§ћ§ћћњ§§іћ§ћ§њћљњњљљјњљћћ§ћўўтћ§ў§њћћњћ§ћ§§ћњћњњћћњ§ћ§ћ§ћ§ћўў§ћ§§ћљњњїљћћњћњљњћћћњћћ§ћћќ§њћњњ§їў§ў§§ћћњћћєњћњћњ§ћў§ў§ўўщћў§ў§ў§јјљјњљћћ§ћ§§ў§ўћћњљњ§ћ§њњўћ§§ўћ§§њўћўў§ћћњ§ћ§ўў§ўћћ§ћћњњі§ћћњ§њћњ§ћћћ§ћ§ћ§§ъћ§њ§ћ§ћ§§ћњ§ћ§ћ§ћњњћћ§§ћћ§ўўћћє§ўўћ§ћ§ћ§ћћњњљљњћњћћ§ћћ№љћћ§ў§ўћњћ§§ћћњћћ§ўћњњћћњ§ћўўљ§ў§ћњњћћф§ўў§§ћњњћњћ§§њћћ§ћ§ћћљљћ§§ў§§ќћ§ћ§§њћў§ў§ўўў§ўў§ќћ§§ў ўїћўў§ћњњћ§§јў§ћ§ћўћ§§њћ§ћ§ћ§§њћў§ў§ўў§ўњћ§ў§ћўў§§ћўўїћ§њћћўў§ћћюњ§ўўћ§§ўћ§ћ§ћ§§ћћ§§чў§ў§ў§§ћ§ћ§ћљњљљњљњћ§ћў§ўўћ§ћ§ў§§ўћћ§њћћњ§ћўўў§ўўі§ўў§ћ§ћ§ћ§§ўўћћѓ§ћћњћњћћ§ћ§§ўў§њћ§ўўћ§§њёћњ§ў§§ћћ§ћ§њћњћћїўћ§ћ§§ў§ўўў§њњ§ќћў§ўўќ§ўћ§§ћњќљњњћћ§ћл§ћ§ћўћ§ћ§њћљњњћћ§њ§ў§ў§ћњћ§ўў§ўћ§§ў§ўўў§ўў§№њљљћњћњ§њњћ§ћ§§њњї§ћ§ћўў§ћ§§ўѕ§ў§ўў§ћ§§ў§§§ћ§ўўў§ўў§§ў§ћћъ§ћ§ћ§ћўћ§ћў§§ћ§њћћ§ћћ§§њћўћ§§ўўљ§ў§ўћ§ўўєћ§ћ§ћ§§ўћ§§ћћњћѕ§ћ§ћ§ћ§ћњћўўў§ўўў§ўўќ§ўћ§§ќћ§ћўў§ў§ўіћ§ћ§ћўў§ћ§§ћћ§ћњћћѕ§ћ§§ћўў§§ћўўїћ§ћћњ§ћў§§юњћ§ў§§њћћ§§ў§ўћў§ўўў§ўўј§ў§ў§ў§ўўњ§ў§ў§ўўћ§іћ§ћ§ћ§§ћњћћ§§ћўўє§ўћ§§ўћ§ћ§§ўў§ў§іћ§ћ§ћ§§ў§ўўў§ўў§ѓћ§ћ§ћ§ћ§ћ§ћ§ўўў§ўў§ўћ§§њћ§љћ§ўўњћ§ћ§ћ§§ќћ§ћўўў§ўў§ў§іћ§§ў§ўў§§ўўў§ўўњ§ў§§ћўўѕ§ў§ў§ћћљњћ§§њўћ§ћ§ћћњќћ§§ўўјћ§ћ§§ў§ўўє§ўћ§ћ§њћћ§ћ§§ўќ§ў§ћћќ§њњћћ§ўњћ§ћў§ўў§ќћњњ§§ћћ§ћ§ћ§§ўц§ў§ў§§њћћ§ћўћћњ§ћ§ћ§ћ§§ћћ§§ўћћ§ћ§§ўўј§ў§ўћћ§ўў§ќћў§ўўі§ў§ў§ўўћћ§§ўћўў§юћ§ћ§ў§њћњћњ§љњњћњ§§ўљ§ћўћўћ§§ћў§ўўіћ§ћ§ћ§§ў§ўўў§ў ўћ§ў§іћ§ћ§ћў§ў§ўўў§ўўј§ў§ўћў§ўўњ§ў§§ў§§ўћўўю§ў§ў§§ћўў§ћ§њћ§§ћўўў§ўўі§ўћ§ў§§њћўўќћ§§ўўў§ўўў§ўўщ§ў§ўћ§§ћњў§ў§§ћўћ§њњћћ§§§ўћ§§ќћњћ§§ўћўўў§ўў§іћ§ћў§ўћ§§ўўјћў§ў§ў§ўў§њљў§ћў§ўћћ§§ћўўєћ§ћў§ўћ§§ў§ўўњ§ўўћћўўќ§њћњњќћљњћћ§§ћўўўћ§§њћ§њўћ§§ў№§ў§ў§ў§ћњћћ§§ў§ўў§ўћ§§ёћ§ћ§ћ§њћћў§ўћ§ћћі§њњћ§ћў§ћњњљ§ћњњљњўўќ§ў§ўўђћўў§ћў§ўў§ћўўћћў§ћћњ§љўћ§ў§ћ§§њћў§ўћ§§єћ§њћљњњћћў§ўў§рћ§ћ§§њћ§§ўў§ћ§ћ§ўў§ў§§ћ§ћћњ§ћ§ћўў§ћ§ћћћ§ўў§ўўњ§ћ§ћћ§§ўў§ўўїћ§§ў§§ћў§§ўњћ§§ў§ўўћ§ћ§ћўўј§ў§ў§ў§ўўі§ў§ў§ўў§ћ§§ћљў§ў§ў§ўўц§ћ§ћ§ћў§ћ§ћњ§ћ§ўў§ўћ§ћ§ћ§ўўљ§ўћ§ў§ўў§§ў§§ўћўўіћ§§ўў§ћў§ўўўћўўѓ§ў§§ћ§§ў§ўћ§ўўў§ўўў§ўўћєњ§ћў§§ћ§§ў§ўўљ§ўў§ў§ўўќ§ў§ўў§љѕў§ўћ§§ў§ў§ўўў§ўўіћ§ћ§§ў§ў§ўўў§ўўў§ўўў§ўўќ§ў§ўўі§ўў§ћўћ§ћўўя§ћў§§ћў§ў§§ћў§ў§ўўћ§ўћ§ўўњ§ўў§§ўўќ§ћћўўў§ўўћ§ћ§§ўўў§ўў§ўњћ§ўўћ§§ћў§ў§ўў§ћўў§§§ў§ўўў§ўў§ѕў§ў§ўћћ§§ћўў§§ў§§§ћ§ўў§љў§ўћ§ћўўњћ§ћ§ћўўя§ў§ў§ў§ў§ў§ў§ў§§ћћ§єў§ўћў§ў§ў§ў§§ўўћ§§ўј§ў§§ћ§ћўўі§ў§ўў§ћ§§ўўј§ў§ўћ§§ўўј§ўћ§ўў§ўўђћўћ§ўў§ў§§ћў§ўўјћ§§ћћў§ўўў§ўўўћўўњ§ў§ў§ўўўћ§§ќћў§ўўќ§ўћ§§ўў§ўўў§ўўћ§ћ§§ўўў§ўўњ§ў§ў§ўўњћњћ§ћ§§ћў§ў§ўўў§ўўќ§ў§ўўў§ўўњћљљћћ§§ўћ§§ѕў§ўў§ћ§§ў§ўўў§ўўўћўўњ§ў§ў§ўўќ§ўћўў§љћ§ћ§ўў§їћ§§ў§ў§§ћћуўћўћ§ћў§ў§ў§ўћ§ћ§§ў§ћћ§§ў§ў§ўў§ћјњўћў§ў§ўўљ§ўћ§§ў§§ў§љў§ўћ§ћ§§њћ§ћўћ§§яћў§ў§ў§ў§ўћ§§ў§§ћћє§ћўћ§ћ§ћ§§ў§§ўњ§ћћўћ§§ўїћ§§ў§§ћ§ћћќ§ћў§§§ў§ўў§ўћўўћ§ў§ў§§ћў§ў§ўў§љћ§ћўњў§§оў§ў§ў§ў§ў§ў§ў§ў§ўћ§§ў§§ћўћў§§ћўћўћћїў§ў§ў§ў§ўў§ўў§§љў§ў§ў§ўўј§ў§ў§§ћ§§№ћ§§ўћ§ћў§ў§ўћ§ћ§§ћљў§ў§ўћ§§ъў§ў§ў§ў§ў§ў§ў§ў§ў§ўћ§ћћѕ§ћў§ў§ў§ў§ўўћљў§ў§§ћ§§ќћ§§ћћѓ§ћ§§ўћў§ў§ў§ўў§ўў§§ћў§ћћћў§ў§ўўќ§ў§ўў§ќњ§ћ§§ђћўћў§ў§§ћћњћњ§§њћў§ў§ўў§ћћ§њўћћћўћў§ўўћ§ў§ў§§ўў§§їў§ўћ§ћ§§ўўљ§ўћў§§ћћьў§§ћћњћ§§ћў§ўћ§§ўњў§§ьў§ў§ў§ў§ў§§ћ§§ў§ў§ў§§ћє§ћ§ћў§ў§ўћў§§їў§ў§ў§ўњћћ§ћ§§ў§ўў§ўћ§§ђњў§ўњўћ§ћ§ћў§ўўѓћ§ћ§ћўћў§ўћ§ћћўў§§ќў§ў§§ўњ§ў§ў§ўў§љўћ§ћ§ћ§§ёћ§ћ§ћ§ћў§ў§ў§§ћћќ§њћ§§ќћ§§ўў§ ўќ§ў§ўўњ§ўћў§ўўќћ§§ўўіћ§§ћћўћ§ћ§§љћ§ћў§ў§§ў§їў§ў§§ћ§§ўўќ§ў§ўў§љў§ў§ў§ўў§§ў§§ўўћћўњ§§цћў§ў§ўћў§§ћ§њўћўћ§ћ§ћ§ћ§ћўўў§ўўў§ўўў§ўўк§ў§ў§ў§ўћўћўћ§ћ§њћ§§ћ§§ўћћ§ў§ў§§ћўћћ§ћћ§ўќ§ў§ўўї§ў§ў§ў§ў§§ўћ§ў§ў§§§ўћ§§њў§ў§ў§§іў§ў§ў§ўћћ§§яў§ўћў§ўћў§ўћ§§ў§ўўѕћ§§ў§ў§ў§ў§§ќў§ў§§ћў§ў§ў ўћ§ў§ў§§ћэўћў§§ћ§§ў§§ћў§ў§ўћ§§ўў§§њћ§§ў§ўўќ§ў§ўўќ§ўћ§§яћ§ћ§§ў§§ћў§ў§ў§ў§§§ўћўўј§ўћў§ў§ўўќ§ў§ў ўы§ў§ў§ў§ўћў§§ћў§ў§ў§§ћћё§ћў§ў§ў§ў§ў§ў§ўўі§ў§ў§ў§ўћ§§ќћў§ўўу§ў§§њћћ§§ў§ў§ў§ў§§њўћўћў§ў§ў§§§ўћ§§ўь§ў§ў§ўћ§ўў§§ћўћ§ћў§ўўд§ўћў§њњ§њ§§ў§ў§ўћ§§ўћўћ§§ў§§ћ§§ў§§ћ§§ў§ў§ў§ўўў§ўўќ§ў§ўў§§ў§§јў§ў§ў§ў§§ўя§ў§ўћ§§ўў§ћ§ћў§ў§§ўћ§ў§§ўўў§ў ўљ§ў§ў§ћ§§юўњ§њћћ§ћ§§ў§ў§§ћ§ћћ§ўў§ўў§іў§ў§ў§ў§ў§§ыў§ў§ў§§ћћњўћ§њ§њћћў§ўў№§ў§§ћ§§ў§ў§ўћўћ§§іћ§§ў§ў§ў§ўўў§ўўр§ў§ўћћњўћўћ§ћ§ћ§ћ§ћ§ћ§ћ§ћўћў§§ћ§§ўђ§ўћ§ћ§ћ§ћ§ћ§§ў ўњљћ§ў§ў§ўўјћ§ћўњњћ§§ўќ§ў§ўў§§ў§ўўў§ўўћ§ўћ§ћћ§§ўћ§§ќћ§§ўўї§ў§ў§ў§ў§§љў§ў§ўћ§§ѓў§§ћўћў§ў§ў§ўў§ўј§ў§ў§ўћ§§№ћ§њўћ§ћ§§ўћ§ћўћўўѓ§ў§ў§ў§§ћў§ўћћћўћ§§ўўјћ§ћ§§ў§ўўї§ў§§ћ§ћў§§њў§ў§ўћћ§ўі§ў§ў§ў§ў§ў ўќ§ў§ўў§єћў§ў§ў§ў§ў§ўўњ§ў§ў§ўўќ§ў§ў ўў§ўўќћ§ћўўў§ўўў§ўўќ§ўћўў§ўћ§§ўў§ўўє§ў§ў§ў§ў§ў§ўўљ§ў§ў§§ћћћўћ§§ўўіћ§§ў§ўћў§ўўљ§ўћў§ў§§ ўф§ў§ў§ў§ў§ўћў§§ћў§ў§§ћ§ћў§ў§ўўќ§ў§ўўъ§ў§§ћўћ§§ў§ўћў§ў§ўћ§ћ§§ўќ§ў§ў ў§ўї§ў§ў§ћћў§§№ўћў§ўћ§§ў§ў§ў§ў§§ћќў§ў§§їў§ў§ў§ў§ўўў§ў ў§ћ§§ћ§§ѓў§ў§ўћўћ§ўў§ўўњ§ў§ў§ўўў§ўў§§ў§ў ўј§ўћў§ў§ўўў§ўўњ§ў§§ћ§§§ў§ўўў§ўўў§ў ўў§ўўњ§ў§ў§ўўя§ўћ§ћў§ўћ§§ў§ў§ў§§ўњ§ў§ў§ўўј§ў§ў§ў§ўўё§ў§§ўў§ў§ў§ў§ў§§љўћ§§ў§ўўў§ўўњ§ўћ§§ўўњ§ў§ў§ўўњ§ўћ§§ўўюћў§ўў§§ў§ўћ§ћ§ћў§ўўў§ўўќ§ў§ўўў§ўўў§ўўі§ў§ў§ў§ў§ў ўђ§ў§ў§ў§ў§ў§ў§ўўі§ў§ў§ў§ў§ўўі§ў§ў§ў§ў§ў ўў§ўўќ§ў§ўўў§ўўј§ўћ§ћў§ўўћ§ў§ў§§§ў§ўўќ§ў§ўўє§ў§ў§ў§ў§ў§ў ў§їўћўћўћў§ўўў§ўў§§ў§§ѓў§ўћў§ў§ў§ў§ў ў§ќћў§ўў§ѓў§ў§ў§ўћ§§ў§ўўњћў§ў§ўўўћўўў§ўўќ§ў§ўўъ§ў§ў§ў§§ћ§ћ§§ў§§ћ§§ў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўўј§ў§ў§ў§ўўњ§ў§ў§ў ўў§ўўј§ў§§ћў§ў ўњ§ў§ў§ўўў§ўўћ§ўў§ўў§ў§ўў§ўўі§ў§ў§ў§ў§ўўќ§ў§ўўў§ўў§ќў§§ўўў§ўўў§ўўў§ўўђ§ћћў§ўћ§ћ§§ў§ўўљ§ўў§ўў§§ўњћў§ў§ўўѕ§ў§ў§ў§ў§ў§§ў§ќћўў§§ў§§ў§§ћў§ўњў ўў§ўўў§ўў§ћ§ўћ§ў§ў§§ўљ§ў§ў§§ћћ§§ћўўі§ў§ў§ў§ў§ўўњ§ў§ў§ўўі§ў§ўў§§ў§ўўў§ўўў§ўўј§ў§ўћў§ў ўў§ўўў§ўўќ§ў§ўўў§ўўќ§ў§ўўћ§ў§ў§§ ўњ§ў§ў§ўў§§ў§ўўњ§ў§ў§ў ўќ§ў§ў ўў§ўўў§ўўў§ўўў§ў ўћ§ў§§ўўў§ўўќћ§§ўўќ§ў§ўўњ§ћњћ§ўўў§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ўўў§ў ўў§ўўў§ўўќ§ў§ўўў§ўўќ§ў§ўўќ§ў§ў ўў§ўўќ§ў§ў ўў§ўўј§ў§ў§ў§ўўў§ўўў§ўўќ§ў§ўў§ќћў§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ўўќ§ў§ў ўќ§ў§ўўќ§ў§ўў§ўў§ўўј§ћћ§ћў§ўўў§ўўќ§ў§ў#ўњ§ў§ў§ўў§§љ§њњ§ўњ§§вјљјјљњ§ћїјљ§ў§њљљ§ўћў§њ§њ§њїњ§§њћјљ§љњјјњљљћїјјєњ§љ§§ў§§љ§њўў§ћјљљњ§§ќљћћ§§ўє§ћћў§§њјљљћљљўјћў§љјћћљљёћ§§ћњћљњљљћњ§ў§§љї§њњ§ћјћљ§§юњ§њў§§њ§§љљ§њњў§ћўўі§њњ§§ўў§њ§§ыњћ§њњўў§§љ§њћљћљ§њњћўўёњћљјћљљњјїјћњњўўќћ§§ўў§§ј§§ўўћўўх§ћљњњ§њўў§§ћћљњјњјјћ§ўћўї§љљіњљћўўћћњљўў§ћњўўў§ўў№§љљ§ћљ§§ћ§§ўћўћўўјњјїѕїљљћћћљћћ§ўўћ§љљ§ўўєћўћўћўў§њљћўўљ§љ§њњ§ўўі§ћњ§њљњњ§ўўњ§їњ§ћћ§§ћ§њњ§њ§њљ§љћўњњ§§ћўўњ§ўњўўќњўў§§ўћ§оћљћћљ§њ§§ўћўў§ћњњ§љћћњњ§ўњ§њ§ўўћћўўў§ћћјќїјљ§§ѕљ§ўў§њўњ§њ§§эћ§§њњ§ћїњјјћћњ§§ћњўў§§њ§§ўњўўїљњљ§ћњљћ§§ќљћ§ўўўћўўёћў§§њ§њњћ§љ§ўўњњ§щњўўћўўћћўњ§§њ§њњ§њљў§њ§§њњ§§њњ§§№ћўўћ§§њњ§њћ§ўўњ§§ўњћўћўћўўњњ§ўўћњўўњ§њ§ўћўўњ§ўўњ§ўў§ўѓњ§§њўў§љ§љњљ§§ђњ§§њњ§њћўў§њњ§§њўћћўўћўў§ўњћўњ§љћћјюїћњў§њ§ћў§§љїєљ§§ўўўћўўњњ§§њћўўћ§ћњ§ўўє§ћњїїћ§§њўћ§§ѓўћ§ћјјљљћљћљћћњў§ўўњўјћўњћћњњ§§ќњћћўўћћњљћћњњ§§њ§§ўўћ§§јњ§њ§ў§њўў§§ћўўю§ћљњў§њљњ§§њ§§њћћўўњћўћ§§ўўћ§ћѕћ§§њњўўћћўўќћўћўўюћўћњћњњ§ўўћўњ§јњ§ўўѓљ§§ўћ§§њўћў§ўў№њљўўљњљњўћњ§ћў§њњѕ§ўўћ§њњ§§ћўўњћўњљћўўќ§њћўўєћўў§§љљ§§ўўћћ§јњћћ§§ўћўўўћў ўшћўћћўў§њ§ўњ§њљћњ§ўў§љўў§§ўіћўўћћўўњ§ўўў§ўўўћўўіљ§§њ§ў§њ§ўўіћўўћ§њўўћўўњќ§љ§ўў§ѕћ§§њ§њњ§§ћўўљ§ћљљњњўўц§њўўћў§љјјћћљњњ§њ§ў§§њњћћўў§њћўўљ§њ§ћљ§ўўљ§њћјћ§ўўќћўћўўњўї§њћ§§њ§њ§§њ§ўњ§§їљјљћ§§ўћўўќћ§њўўїћў§њ§§ўћўўўћ§§њўўћўў§ќўћў§§ўўњўўєћўў§њ§њћњљњ§§ў§љћћљћї§ўўўћўўўћўўќ§ћћўўћўћћўњ§§ўў§ў§§ћў§§њў§ўљћўўћ§њўўјћўћ§§јњў ўѕ§њљј§њў§њ§ўўљћўћћ§§ўўўћўў§ўўћўўўњўў§њћўўўњўўќњ§§ўўњўћўўїњћўўћњњ§ў ўўћўўј§њ§њ§ўўћћўўћўўњ§њўћћўўўћўўыћўўћўўћ§ўў§§њњ§ћћўўћўўњ§ўћ§§ўўўњўўї§љ§ўў§њћўўћў§ўў§њљ§ќў§њўўћјўћњћћў§њњ§ўћў§ўљўўўћў ўјњљћњћћњ§§ўћћўўћўўўћ§§ў§њ§њњ§ўўћўўћўўћўў§ћњўўіћў§ўћўў§ћўўћљўњјјѕљјїѓї§ўўњњ§§іљјњўўњћўћўўњ§ўћўўўћўўњњ§њ§§ћўўћјў§њ§§њ§ўўћћўўћўўўћўўћўўћўў§јљєћ§§ўћўўћўїћўћўњ§§њўўќ§њ§ўўў§ўўњћњњ§њўўљ§љ§њћњўўњћўћўћўўјњ§ћњћ§ћўўћњўњњўўћњ§љћўўя§њўўћўћ§§њњљ§ўўћўўћўѓњљњћј§ўћўўћћўўћћўўњўў§ћњўўљ§§§ўћўў№њ§њ§§ўўћњ§§ўўњў§§ўћўў§ў§§њ§§ўўћўўћњ§њ§ўўћћўћњ§§ўњ§§§љњ§§ўјћњњ§§њўљљ§ўњўўћўўњўў§ћњўўўћўўњћў§њ§њњїўњњ§њњ§њўўїљњћћўћјјљљ§ћњўўўћўўћ§њј§ћўўћўўњњљ§ўћўўћўўњњ§њ§ћўўіћўўћўў§љљўў§§ћљњњўљўўћљў§љћўњўўѓћ§јљ§§ўљўўћћўўєњ§ўњўњћћўњ§ўўўћўўў§ўў§ћњўўјћў§§њўўњњяћўћў§ћўўћўњ§љљ§§ўўѕ§љћўў§ўћўћўўќњўћўўўћўўўћў ў№њћњўўћўњ§њњљњ§њћћ§їњў§њ§§ўћўўћ§ўўћўўўћўўњћ§ћ§љўўўћўўњљ§ў§њўўўћўўћћў§§ўўћўњ§њўўћўўі§ў§§ћћўўћўўєћњњўўњ§ћћљ§ўўќћўћўўњћњ§§њўў§§ўћћўњћ§њњ§ћћўњјѓљ§њ§ўћўўњњўњ§§ќћўћўўћќўћў§§ўѓњљњњўў§§ћјљњўўі§њ§ћ§§љњњўўђњ§ўћћўњљ§§њ§§ўўћћўњћўў§ћћљ§љўў№§ўўћўўљљњ§§љўћћўўњњ§њ§§ўў§§њўўќћў§љљўњі§ўў§њ§њ§ў§§ўњўўўћўўўћўўћўћќ§њў§§јљњ§ћњўћўўњћњ§љњўўѕњћў§§ћћљ§§ўўўћўўўћўўўћўўќ§ћћ§§яњ§§ћўћўў§§њ§њ§њ§ўўўћўў§ќљћ§ўўўњўўјћ§ћљћњћўўц§њњ§љјјљ§ў§§ћћўў§§ўў§љћ§§ўўќћў§ўўјћўњљјјћ§§јњўў§њўњўўћњўћ§њ§ў ўњўї§њјњ§ўўњљљ§§њ§§ўњљљ§ўщњћњўўћ§§њ§ўў§њ§њћћўўћћ§§ў§ћњ§§ўњўў§ўњўў§§љ§§ўўћў ўхћњљ§ў§§ћ§§ўћўћ§њћўўћ§њ§§њћўўћўћћўўћўўјћўњўўћўњњў§њњў§јјљјљљ§§ўўњњ§§ўћўўўјўў§ўњћћўћўїћ§ћўўћўљ§§ўќ§ўћўўћ§њћ§ўўіћњ§§љїњћ§ўўќћўћўўўћўўќћўћўўё§љ§§ўўњ§§њљ§њ§ўўќћўњ§§ќњћњљљ§ћњћљњ§§ќњўћўўќћњњ§§ўлњћ§ў§ћљїїљћ§ўњ§љљ§§ўўћўљљњ§љїєѕјњ§њћ§§ўњўўћњњ§ћўћў§§ѓћ§§њњ§§њ§§ћћ§§ћњ§ўћўўћњљљњ§§ўљ§§ўњ§ѕњљ§ўћўћўўћњњў§ўў§§њ§§ўњўў§ўыњў§ўў§§ћљљћ§§ћљ§ўўњњљљљњ§ўњљ§ўўїћўў§§љўћўўўћўў№њ§ўўћ§њњћћњ§§њ§љљјћљїїњљњ§§ў№ћњўљњўћњњ§њњ§љћ§§ќў§ћўўћ§ўћўў№њљћћњ§ўћўўћўў§њ§§§љњўў§§ћ§§єћўўћў§њњѕћњ§§ў§іўћўў§§њњ§њњ§§ўћўўћўўћўўя§њњ§њћљћћўћўўњњљўўљћўњ§ў§њњќўћў§§ћњ§§њ§§ўћўњњ§§ўўњњќћљћљљю§ўўћ§§јљњ§њ§§ћўў§ў ўњћўћўўћћўљ§љљњїїѕѕєїјљј§§ўўћўў§§ыљњ§њљљ§§ћљљ§ўћ§љљњ§њўўўћўўћѕњ§§ўў§њ§њћўўё§єјњјњћљњ§љњ§њ§§§њјљљљћљњ§§њ§§§њ§ўўћќ§ћ§ћћ§ћє§ћћ§§ћњњћ§ћњњўћ§§ћ§ўў§§ўћ§§ёў§§ћ§њ§ћ§ћљњњљћћњзљ§ў§ћўћ§ћ§§ў§ўћ§§ћћ§ћ§ћћњњћ§ћ§§ў§§ўў§ћћ§ћћ§ў§ўўћ§ћ§њћћёњ§ћњљњћ§ўћњ§ћўћћ§њћњ§њўћћі§ћ§ў§ћ§ћ§ћћ§ћўћў§ўўљћ§§ћћў§§њћ§ћ§ў§§ѕўћ§ў§§њћњћ§§ў§шњћћњћћљњљњњ§§ў§ў§ўћ§§ў§ћћ§ўў§ўўћ§ћћ§ў§ћћњњћљњљњњўћўўў§ћћїљћњў§ўў§ўўќ§ў§ўўљ§ћ§ў§§ћћўё§ћњћ§§ў§ў§ў§§њљљћњљћњћћў§ўўў§ћћўў§ўўќ§ћ§ўўњ§ўћўћ§§ўј§ћў§ћ§ў§§ў§љћ§ћћњ§ћћ§ўћ§§їћ§ћћўў§ў§§ў§јћ§ћ§ћ§§ўўі§ў§ўћ§ћ§§ўўє§ћњћњњћћ§ћ§ўўёћњ§§ћћњћ§§ћў§ћ§§ўѓ§ўў§њћњћњњљњћћ§§ўћ§§іћ§ћ§ћ§ў§ћ§§њўљњњї§ћ§ўў§ў§ўўѕћ§ћ§ћ§ўў§ў§§ѓћњ§ћњћ§ћћњ§§ўўў§ўўўћ§§ўњ§§ў§ўћ§§ќћ§§ўўў§ўў§їћ§ћ§§ћ§ў§§ћћ§ћ§ћ§§ќћ§ћўўћ§ѕњћўў§ћ§ћў§ўў§ўћўўє§ў§ў§ў§ўћ§ћўў§ќў§§ўў§ћ§ўўэ§ћ§§ўў§ћ§ў§ўћћ§ћ§ћ§§ћћ§ўў§§ћ§ћў§ў§ўўљ§ўў§ћ§ўў§ћў§ћћњњыћ§ўћ§ћўў§ћћњћћ§ћў§ў§ўў§ќћ§§ўўћ§њ§ћўўќ§ў§ўўї§њљњћњ§ћўўљћ§ћўў§њњћћњћњћ§§ў§ў§ќћ§§ўўќ§ў§ўўќћњћ§§ћќ§ў§ўўя§ўћ§ћ§ћ§§ўћ§§ў§§ўў§ћўћњў§§їћ§ћћ§ћ§§ўўў§ўўёћ§ўў§ўћњ§њћ§ћ§ћћў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўў§ў§щћ§ћў§ў§§ћўў§ћ§§ў§§ўў§§ўўї§ў§ўў§ћў§§ў§§ћ§ўўў§ўўў§ўўњћ§ўў§ўў§ћћ§ћў§ўўћњ§њњ§ћў ўј§ў§ў§ў§ўўў§ўўўћ§§№ћ§ћњ§ћ§ўћў§ўћ§ћўўў§ўў§љў§ћ§ў§ўў§іћ§ћўћ§ћў§ўўњ§ўћ§§ўўў§ўў§јћўћў§ў§ўўѓћ§ћўћћ§ћ§§ћ§ўўљћњћћ§§ўў§ћ§ўўћњњ§њњћ§§ќћ§§ўўљ§ў§ў§ў§§їњћћў§ўћ§њњ§ћ§ўўъ§ў§ў§ў§ў§ўћўўћћ§ћ§ћ§ћ§§єћ§ћ§ћћњћњ§ћўў§ўў§ўў§ћўјћ§ћ§§ў§ўўў§ўўќ§ћћўўєћ§ћў§ў§ў§ў§ўўєћ§ћ§ў§ў§ћ§ћўўў§ћћњћћњўћўўќ§ў§ўўќ§ўћўўў§ўўў§ўў§ўћўўў§ўўєћ§§ўўћћўў§ћ§§іў§ў§ўћ§ћ§ўўњ§ўћ§§ўўёћ§ћ§§ў§ў§ў§ў§ў§§їћ§ћ§ўћ§ћўўќћ§§ўўњ§ћћ§ћў ўў§ўўў§ўўў§ўўќ§ў§ўў§ќћ§§ўўј§ў§§ўў§ўўў§ўў§ўў§ўўў§ў ўў§ўўў§ўў§ўў§ўўњ§ўћ§§ўўў§ўўў§ўўў§ўўј§ўћў§§ћ§§ўў§ўўє§ў§ў§ўћўў§§ўў§ў§ќўћ§ўў§їў§ў§ўў§ћ§§ћљ§ћўћ§§ўўќ§ўў§§ћўћљ§ўў§ў§ўўќ§ў§ўўў§ўўє§ћњ§ўў§ћћ§§ў ўћ§ў§ўў§§ћ§§§ћ§ўўќ§ў§ўўќ§ў§ў ў§ўўћўўј§ћўў§ў§ўўўћњњѕћњљњњћў§ў§ћћ§§ў§ўў§§ў§§§ў§ўўђ§ў§ў§§ћ§ћ§ўў§ўўў§ўўќћ§ћ§§ўў§ўўў§ўўњ§ў§ў§ўўў§ў ўі§ўћ§ћћњћћўўќ§ў§ўўў§ўў§ћћ§§ў§§§ў§ўўј§ў§ўћў§ўўќ§ўў§§§ў§ўўћћ§ўў§ўўў§ўў§ћќљњћўўў§ўў§ўћ§ў§ћўўў§ўў§љў§ў§ўћ§§ќў§§ўўў§ў ўћ§ћљћ§§ўъ§ў§ў§§ўў§ў§ћћў§ўўћћ§ћўўљ§ў§ў§ў§§ўћўўѕ§ћћў§ў§§ћ§ўўћњў§ўћ§ћћ§ў§ўў§њћ§ћў§ўўы§ћ§ћ§ћ§ћ§ћў§§ћ§§ў§ўў§§ќћ§§ћћ§§ћўўћ§ўў§ўўў§ўўў§ўўќ§ў§ўў§ћў§§ћ§§ўў§ўўњћњњ§§ў§ўўњ§ўў§ћ§§ў§§ў§§ўќ§ўў§§ўў§ўўћў§§ћ§ћћ§њћ§§ўў§ўўў§ўўќ§ў§ўўњћ§ћ§ћўўў§ўў§§ў§§ѕў§§ўў§§ћў§ўўќ§ў§ўў§§ў§ўўѕ§ў§ў§ћћ§§ў§§ўў§ўў§ћѓ§ћў§ўў§ћњ§ўћўў§§ў§§§ў§ўўќ§ў§ў ўў§ўў§јћ§§ћ§ћ§ўўяћ§§ўћ§ћ§ўў§ў§ў§ў§§ўў§ўўњ§ў§ўў§§іў§ўў§ў§ў§ўў§§ў§§ћў§ў§ўўі§ў§ў§§ћў§ўўў§ўў§ўў§ўўћћўћ§ўўќ§ў§ўў§ўї§ћњњћћў§ў ўє§ўў§ћ§§ў§ўћўўѕ§ў§ў§§ћ§§ћўў§њњћћ§ћўў§їў§§ћ§ћў§ўўј§ў§§ћ§ћўўѓ§ў§§ў§§ћњћў§ўўіћ§ћўћ§ћ§§ўўў§ўўњ§ў§§ћўў№§ћ§ћ§ћ§§ў§ў§ўў§ўўњћ§њўћўўќ§ўћўўі§ўћћ§§ћў§ўўў§ўўј§ћ§§ћў§ўўэћ§ўў§ўў§ћћ§ў§ў§§ћў§§ћ§ѓў§ў§ў§ў§ў§ў§ўўц§ўўћ§ўћ§ћў§§њ§ўў§ў§ў§ћћ§§ўўї§ћњњћћ§§ўў§ўў§ўўў§ўўћ§њ§ћћ§ћљў§ў§ўћ§§§ћ§ўўє§ўћ§ћњћў§ў§ўўљ§ўў§њћўўт§ўћ§§ћћњњћћўћ§ўў§ўћћ§ўћћњ§ћў§ўўфћў§ў§ў§§ћ§ћњћ§ћ§§ўћ§§ў§ў§ў§ўўњ§ўћ§ћўўў§ўўў§ўўњ§ў§ўў§§§ў§ћћѓ§ћ§ћ§ћћў§ћ§§ўўў§ўўѓ§ўў§ћ§ћў§ћ§§ўўќ§ўўћћўћ§ўў§ћћі§ў§§ћ§ћ§§ўўў§ћћ§§ў§ў ўў§ўўў§ўўі§ўћўћ§њћћўў§іў§ўўћ§ћћ§ўўў§ўўў§ўў§ўћ§§ўўћћњ§ћћ§ћўўі§ў§ўў§ћ§§ўўў§ўў§§ўћћў§ўўў§ўўњ§ўћў§ўўѕ§ћ§ћў§ў§ўћўў§§ў§§§њћўўћ§ўў§ћћћњљћ§ўўў§ў ў§§ўћћљ§ўў§§ћ§§ўѕ§ўћ§ћ§ћ§њ§ћћј§ћ§§њћ§ћћ§ўќ§ўў§§§ћ§ћћэў§ў§§њ§ў§њћњћћњћў§ћћў§ўўћњ§ћћњћ§§јћ§ўћћ§§ўў§ўћўў§њћ§њћћ§§іћ§ћ§њћћ§ћ§§ў№§ўў§ћћ§§ћ§ўћћ§ћўў§ђћ§ћ§ў§§ў§ў§ўў§§ўћўўіћ§ћ§ћ§§ў§ўўє§ћ§§ўў§ћў§§ћћ§њ§ћћњ§ўў§§ћћї§ћў§ћћў§ўўў§ўў§ћ§ўўў§ўў№§ў§§ћў§ўћ§§ћњ§ћ§§ћјњћћњњћ§ћћ§ў§§ў§§єў§§ћ§§ћћўћ§ћћћўћў§ўўљ§ў§ћњњ§§§ў§ўўє§ћ§§ћ§ћў§ў§ўў§§ўћћўўћ§§§њ§ћћўјћ§§ў§ўћ§§ўћ§§ќћ§§ўўў§ўўќ§ў§ўўќ§ўћ§§ћўњўў§§ў§ўўћ§ћўћ§§§ў§ћћ§њћ§ћ§ћў ў§ќћўў§§ќњћњћћї§ў§ўћ§§ў§§ўћўўўћўўњ§ў§ў§ўўў§ўў§§ўћћљј№љњћћ§ћў§ў§ўћ§ћћ§§ћќ§ћњћћўї§ћћ§ћ§ў§ўўъ§ћ§§ўћ§ћ§ўў§ўћћњљњљњћ§§љћ§ћ§ћ§ћћѕњў§§ћ§ћ§ћћ§§ўў§ўўј§ў§ўћў§ўў§§ўћўўє§ўћ§§ў§ў§ў§ўўў§ўўў§ўўћ§ў§ў§§№ћўћћ§§ћўћўћў§ў§ўўќ§ў§ўў§ѕў§ўћ§§ў§ў§ўўў§ўўі§ў§§ћў§ў§ўўы§ў§§ћў§ў§ў§ў§ћ§§ўў§§ўўќ§ў§ўў§ўњ§ў§ў§ўў§§ў§ў ўє§ў§ў§ў§ў§ў§ўўљ§ў§ў§ў§§§ў§ўўѕ§ў§ў§ўћ§ћ§ўўў§ўўў§ў ў§ћ§ўўіћ§ћћњўћў§ўў§ћў§ў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўўњ§ўњ§њ§§ћў§§ћў ў§ўќ§ў§ўўў§ўўў§ўўќ§ў§ўўњћ§§ўћўўќ§ў§ўўќ§ў§ў ўў§ўўј§ў§ў§ў§ўўќ§ў§ўўћ§ў§ў§§ћў§ў§ўўў§ўўњ§ўћў§ўўў§ўў§ђћ§ћўћ§ћ§ўў§ў§ўўш§ў§ў§ў§ў§ў§ў§§ўўћў§§ўў§ў ўќ§ў§ўў§љў§ўћ§§ў ўі§ў§ўў§§ў§ўўћ§ў§ў§§§ў§ўўњ§ў§ў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўўў§ўўќ§ў§ў ў§ћўћўћўўј§ў§ўћ§§ўўќ§ў§ўў§ ў§њћўћ§§ўўў§ўў§ђћў§ўћ§ћўћўћўћўўў§ўўў§ўўњ§ў§ў§ў ў§ўћўўќ§ў§ў ўі§ў§ў§§ўў§ўўў§ўўј§ў§ў§ў§ўўќ§ў§ў ўў§ўўј§ў§ў§ў§ўўў§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўў§ўўў§ўўњ§ўћ§§ўўќ§ў§ўўј§ў§ўў§§ўўў§ў ўў§ў ўќ§ў§ўўў§ўўў§ў ўў§ўўќ§ў§ўўќ§ў§ўўў§ўўћ§ў§ў§§љў§ў§ў§ў ў§§ў§§ўўћўўќ§ў§ўўї§ў§ў§ў§ў§§ўў§ў ўў§ў ўў§ўўў§ўўў§ўўў§ўўћ§ў§ў§§(ўў§ў ўў§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ў ўћ§ў§§ўўў§ўўў§ў ўў§ў!ўў§ўўќ§ў§ў!ўњ§ў§ў§ўўў§ўўњ§ў§ў§ў ў§ўў§ўўќ§ў§ўўў§ўўў§ўўљ§ў§ў§ў§§ўў§ўўў§ўўќ§ў§ў ўў§ўўќ§ў§ўўў§ўўј§ў§ў§ў§ў3ўі§ўњћћў§ўњўў§ ўў§ў ўќ§ў§ў ўњ§ў§ў§ў'ўћ§ўў§ўўќ§ў§ўўќ§ў§ўўў§ўўќћў§ўўњ§ўћћ§ўўў§ўўў§ўўў§ўўњ§ћћ§§ўўў§ў ўќ§ў§ў ўќ§ў§ў ўў§ў ўќ§ў§ўўі§ў§ў§ў§ў§ўўќ§ў§ўўє§ў§ў§ўћ§§ў§ў#ўќ§ў§ўўќ§ў§ўўў§ўўљ§ўћў§ў§§ ўќ§ў§ўўў§ў ўў§ўўќ§ў§ў ў§ўќ§ў§ўў§ ў§ ў§ ўў§ўўў§ў ўў§ў ўў§ўўў§ўў§§ў§§ўќ§ў§ў ўў§ўўњ§ў§ў§ўўў§ўўќ§ў§ўўў§ў ўњ§ў§ў§ў ўќ§ў§ў ўў§ў ўў§ўўў§ўў§§ў§§ўќ§ў§ўўќ§ў§ўўј§ў§ў§ў§ўўў§ўўќ§ў§ў ўќ§ў§ўўќ§ў§ўўќ§ў§ў ў§ ўў§ўўј§ў§ў§ў§ўўў§ўў§ ўњ§ў§ў§ў ўў§ў ўќ§ў§ўўј§ў§ў§ў§ўўў§ўўў§ўўў§ўў§§ў§§§ў§ўўќћ§§ўўў§ўўњ§ў§ў§ў ўќ§ў§ўўў§ўў§ ўќћў§ўўў§ўў§ ўј§ў§ў§ў§ўўў§ў!ўњ§ў§ў§ўў№§ў§ў§ў§ў§ўћў§ў§ў ўў§ўўў§ў ўў§ўўќ§ў§ўўў§ўўў§ўў§ўў§ўўў§ўўќ§ў§ўў§ ўў§ў'ўќ§ў§ўўќ§ў§ўўї§ўў§ўўћ§ўўќ§ў§ўўј§ў§ў§ў§ўўї§ў§ўў§§ў§§љў§ў§ў§ўўў§ўўњ§ў§ў§ўў§ўў§§ћўћў§ўўќ§ў§ўў§ў§§ў§ўўў§ў ўћ§ў§§ўўў§ўў§јћў§ў§ў§ўў§ћў§ў§ўўў§ўўњ§ў§ў§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўўє§ўћ§§ў§ўћў§ўў§ћў§ў§ўўў§ў ўў§ўўў§ўўї§ўћ§ўў§ў§§њўћўњ§ўўў§ўўў§ўўќ§ў§ўўў§ўў§§ў§ўўњ§ў§ў§ўўўћў ўќ§ў§ўўў§ўўќ§ў§ўўў§ўўї§ў§ўћ§ћ§ўўќ§ў§ўўў§ўўў§ўўњ§ў§ў§ў ўў§ўў§њў§ў§§ўў§ћў§ў§ўўђ§ўћ§њћљћњў§ў§ўўђ§ў§ў§ў§ў§ў§ў§ўў§ ўќ§ў§ўўќ§ў§ўўєћўћўћ§§ў§ў§ўўў§ўўє§ў§§ўў§ў§ў§ўўў§ўўё§њўў§§њћѕњ§ўўњ§§ѓњљ§љњњ§њ§њњћўўњё§ћўўћў§њљ§ўњ§§љљјэљћјї§§ж~eV§§ћљ§§њ§ўўћњљє§љњњ§§њњ§ўўњњћ§њњ§ўў§ћњ§§ќњ§§ўўх§њ§ћ§ћљ§љЂpaUўћўўљњў§њ§§њїўўє§љљ§њ§љњћўў§§њсљјї§ўћћўў§ћљјљћјјњ§ћљјћћєtee^ћўўі§њћљљ§§њ§ўўњњ§ћў§њњ§ўў§§њўћў§§њњўўњњя§ћњѓїј§§ЖZmmjњ§§ўўї§њ§њњўћўћћўўњњ§ќњ§њ§§ўћўфњ§§љ§ўў§јјљјљў§љœgh|Pњ§ўўљњ§§њѕ§ўў§њњўњњћўўўњ§§њўћх§љњњ§ћћ§љ§§ћїљћћљнbmxoTћњ§њњ§ћћљљњљљ§ћњїћў§§шћ§њљњњўћ§ћњњћ§љћљљњњ§§љ§§ђњ§ўћЭw}^Yљљњўўњќ§ў§њњєћўћўњ§љјјљћўўќ§њ§њњўєћўњћўўћўћў§ўўь§љ‡it]99ћ§љћўњћњўўћњњ§ѕњўўэњћљћњњјљ§ћћњћћ§§њћўўўћўўт§љљјњњћ§ѕћћБQP[eh\њ§§њњ§ў§њљјњњўћўўў§њњўћўўќћўћўў§ўщћўћўўћ§јћћo]n^VQHў§њўћўўўћўўўњ§§ўћўѓњ§§њў§њљ§§љљјјшћњљјћћ§ћљњћ§йeaNSVN@ўњњ§§ћўѓњћўћў§§ћћњћ§ўўћў§ћћ§њљ§§§ћњ§§љјђѓјљћћ‚>LPZTJIўўђ§њїњњ§ўњўўњњ§ўў§§њўўјћўўћћўћўўїћў§љљ§њљ§§ќјљјћћєў§ђ[SweZFC3ўўћў§§њћў ў№ћўћўўћў§љћћ§ћ§§ўў§њљ§§ўэњљјљёTZOVI(<:ћўў§њњўўћўўіћўћўћўў§§ўўћ§њ§њўў§шњјљјљљ§ћшiJW^pNJ?Aўў§њ§ўўє§њњћћ§њ§ћўћўўњўй§њћћ§њ§§ћљћћљљјћ§§ўћњ§њњљ§їŒ`W[\[UL@Hњўўћћў§ћўўіњўўћўўћўўљљ§єњћўћ§§њћўў§љљэїјљ§љўјь|YUEUPM@<9ўўўћўў§§ўћўўєћљњњ§ћўўћў§њњчљ§ўўћ”MF@ALLIњњўўўћў ўўћўўі§њўњњјјљ§ўўњъ§њ§њ§§Кpt\PSVSFAF@8.ћўўјћўљљћўљ§§ёўћўњљњўћўў§њњ§ўўўћўўљыћљјў§ћv95;QQIA:0;:>:ўўўћўўњ§љњўўћўќћўћўўћўћў§§њўўчћњљ§љлgPEHGCE;??AC?&њ§њўњњћ§љњњ§§њћљњњћўўќћўћўўќћњ§ўўпћў§љљ§ўўњћљљT[ZVUHC5>BB;0+ћћўўћў ўћўўћўў§§њљљ§§љўўњэў§єk7GOPHJNQMCE@83ўўњѕўћљћўўњўўњў ўќћўћўўўћўў§ъћљї§љВ`C9)+-9>A4-9:10ўўћњ§§њ§§їћ§§ўў§њ§ўўєћўўћўўћћўњњ§§љ§ьћЩZ0*A?))!73829?Aћўў§њ§ўўћћўў§ўўўћўўћтњљњњ§њњў§ћј˜?#HY5,&"1<82-ћћќњћћў ўўћўўћўјћ§§ўўћћњњх§ћљ‚UEEB:71)*$"-)($*ўўћўўўњўўьњ§§ћљљћњљћ§ћљњњ§ўўћўўўћўўч§њ§љb+0>E03.)3+#+#&.ўў§ўњўўњ§йњўўћћўўњїњњћўњњ§§Ы\IA1*7-$!$)#28#ўўћќњ§§ўўіњљјјљћўўћўўућ§љ§љEMBA-%"%*%)A)ўў§§ўўћўўіћўўњњћўўћўўЬљњ§љјљћљМU4C58((,.!" ў§њњљљњњ§ўћўњњ§њљўљ§њ§ўўњћ§љљњ§§ћћў§њ§§чњћ§Ы4#C1%  #§§ќў§њ§§ўњўўўћўўћњўћњ§§чћ§§›Q7H9&)-#&e)#ўўљћ§§њїњўўїћўћўћ§ўћўўїћўўњћўўћўўш§НkqPB,#()" ўўіћњ§њћћњ§њўўїћљљ§њљўћўўйћўћ§ћ§уmW^UV;!"!  ўњћўўћўўћўўќњ§§ўўє§њњ§ўўћћўў§њњм§љњ§љnW[eznP9%2 §§њ§ћњљўўћћњћўњ§§аўћћўљњћ§њњљ§ў§§јўў§ЗWa^WQMHC18C  ћў§љ§§ѕњ§ўћў§ў§њњўў§§њўў§йњўў§њ§љљ§ћэWE`me[PFB^F7! #§љ§ўўћћљўњўўћўгћў§њ§§њ§њњѕјјїљљћў§Ќc5VI,$$ ўўћњўћўўћўўћќ§љљ§§мњљњљљјјћћу`Mk\ZYQWLMSWY-> 0 %;,)ћћўѓњўўњћј§њ§њћћўўћћўћў§§ћхžgV[[U^`Z]TM@FEI5VP43%(+23ўўўћўўѓљ§њ§§ўћњ§ј§§ўўлћњћўўћАbF>ZTPMOVJFB;9?>SŒ[VSF0,>B§њњћћўњ§§љћўћўўњ§§Тњ§ћћљњ§ћћљјћ§§щbTW>EINGA:09G?@GMO@3QiQ5AQAљ§§ћўў§њљћјћ§ўћњ§§ћўўи§њћѕїїѕѕ§ћ–c]\iWNQTLJGFGEIHHMGNcxQSЎЎhў§§Пњћљљћ§ў§њљљјљ§ўўћўўћўў§њў§§ћљ§ћаmgaYQMJSUPMJGG?>LPPU\bNFˆЩјўњњјљљљ§њ§љњ§ўўЯћ§ћћ§њњћјћїљљўўљ•`ZkjUMIIHLOMIGACBGLU[LEgЖИ~љњњ§§ўћўањ§§њ§§њ§љјѕїїјњ§љО‚keg[TQNMLLPMPNPMAIOWiUVŒЎŽ‡‹ўўћћўћњ§ўўўњ§§бћњћњ§њ§јњњљћј§§ыoaVFSVTJIMJGLI@IPQVYWnoTtЉЃxvxўўяћўў§њњ§ћ§љћљ§ўћ§љљгњїїјљ§ћщ„]ZG@AIGF<>IN^SQ„‡m]h`gљњњ§њ§ўўћФњўњ§љњ§ѕїјїјјєєњћЯr^\JJF??BHSQJFCENIA>AI7LIZ}„aYa]cxљћљћ§ў§љљћ§ћў§њњўћњјїњїїѕњљђwUW^\TNQPSTJLJFCEIC;EHO78Sz}kbhh\FUљћљњњўћњ§ћјјњўўљњњљњ§§љљњ§§јœYS\[NLW\a[UPHLA>HFHAEEPFLŠknkSNdboўў§њњ§§њ§§њ§§њљјјЪћљљїїєљјєŽedabVLAMWUMJGNVOLCLHEJHIq”•{tbA:V[\Zњљ§§њ§ў§§Тњљљњјїјїјјњѕї§§љ‘dFPcUTJEFMONHGMLSNIJNI88d„ˆzj0 NwdQhњњљљ§ћўњњўљћћљЦњљјїјјћљћЂGYLSLMPEBQWOB>:,;GPOMIJ>CVtj]hW.P^bohZћўћћўў§љњ§§ўЮњѕј§јїїћ§љЅFTnmNIB29CPVQNC7-%UIB5BGGJzŽqrxuk[]Yu§љў§§ћ§њ§§ў§ђћ§§ўћў§§ћ§ћ§§ўўј§ў§§ћў§ўўўћ§§ўўћћњэћњњљўўт‡mQ§ћњ§§ћ§ћўў§ћ§§ћ§§ўћ§§ў§іћў§ўў§ћ§ћ§§юћў§ўћ§ћњћњћўўЈvg\ўўі§ў§ўћ§ћ§§ўўќ§ў§ћћ§іў§ўў§§ћ§ћ§§њћ§ў§§ўў§ўњћћћњ§ћ§ћћђњўў§xihZў§ў§ў§§ћњћўћ§§§ў§ўўј§ў§§ўўћ§§јћ§ћўћ§ћўўўћ§§ўў§§юћў§§љњўўН^nqi§ћ§§ўўі§ў§ўћ§ћ§§ўў§ўћ§§ћ§ў§ўўў§ћћўљ§ћ§ћ§ћўўјЄom~U§ћўў§ќћ§ћ§§ўњћ§§ў§ўўі§ўў§ћ§ћ§ћ§§§ў§ўўхћў§§ћћњ§ў§ћћњћњўўчcuwOў§ћ§§ћј§ў§ўћ§§ўўѕћ§ћ§ћ§њ§§ў§§їўћњ§§ўћўћћ§ъћ§ћ§ћ§ћ§ћўўд„cWћћ§§ўў§ўћ§§ў§њћњњћњўў§ўў§ўўў§ўў§ўїox]>@ћћўўќ§њ§ўў§ўљ§њћћ§§ћћўћў§ўўф§ў§ў§ў§ћ§ћћ§§ўћ§ўўИSOVhjW§ћ§§њћўћ§ћ§§§ў§ўўўћ§§ўў§ўўћћ§ћ§ўўш§ўћ§ўўucmZYTCўћ§ўў§ў§ў§ўў§§ћ§ўўј§ў§ў§§ћ§§ћњќћ§ћњњы§њћ§ўўсihTTNIGў§§ћ§ћўўў§ўў§§ћўў§§ў§ўў§ќћўћ§§ѕћ§ћћ§§ћ§ћћњњєћўў?WP\UOLўўќћ§ў§§јў§§ў§§ћўўњ§ўћ§§ўўў§ўўћ§ўў§ћћњ§ў§ћ§ћћњёћўўї`YqaZ@ECў§ўўќћ§§ўўў§ў ў§§ў§§ўљ§њ§ћў§ўўќћ§ћўўэ§ћњўњ‘ZZPVG0<:ў§ўћ§§ўў§ўў§ўћўў§ќћ§§ўў§§ћ§ћћ№ўћўўђpOScrMEJJў§§ў§ўќћ§ћўў§ўєћ§њћћ§ћ§њћњћћљњћћ§§ў§§№ћўў’c[Ya^UIEB§§ўўўћўўќ§ў§ўўћј§ћ§ћ§ћ§ўўќ§ћ§ўўў§ћћўќћўћўўює‚]ZFWVNEABў§ў§ў§ўўў§ўўњ§ўћ§§ўўў§ўў§ќћў§ўўўћ§§§ўћўўш›QG@QUTTMHFў§ћћў§§ћў§ў§ўўѕћ§ћ§ћћ§§ўў§§љў§ў§ў§ўўћ§ћ§§ўў§ўяїqTNVVTNHFIE§ћў§ўўњ§ў§ўћ§§ћћњ§ў§ўў§§ў§§§ў§ўў§цћ§ў§ћ§§ў§ўўяgNcbWPJBCISў§ўўў§ўўћ§ўў§ўў§ўћўўў§ўўя§ћўўЎC>BOLLJEEGIўўњ§ў§ў§ўўњ§ў§ў§ўўќ§ў§ўў§ўў§ўўъэrA^]LFIJILQO§ћ§§ћћў§ўўі§ў§ў§ў§ў§ўўњ§ў§§ћўў§љћ§ћ§§ў§§§ћ§ўўятwdMLJJHE:ў§ў§ўўњ§ћћ§ћўўќ§ў§ўўњ§ћ§§ћў ўћћњћ§ўўё~:24POA:722@@;ўўј§ў§§ў§§ў ўў§ў ў§ћ§ўўў§ўўюсmPILLGAC>::E@:§ћ§§јћў§§ћ§ћ§§ќў§§ўўќ§ў§ўў§§ћўў§ћў§§ў№•YVZWQMFEFAHJA1ўўў§ў ўў§ўўў§ўўћ§ў§ў§§јўћўћў§ў§§ўэq5HLLMLNLHECH?5ў§ў§§ў§§ў§ўўў§ўўц§ўћ§њћљўўЗh@4!*+:B7<<>@<;ўў§ѕћ§ћ§ћћњ§ћў§§ўў§ўў§§ћ§ћћўьЪW2*B75+02<>BBў§ўў§љў§ў§ўћўўў§ўўќ§ў§ўўј§ћ§§ћ§§ўўэŸB$HY22&!!").78;AAўўў§ў ўі§ўўћћў§ўў§§ўх{WE>C94+.2,#$,())(01ў§ў§ў§ўў§єћњћћњ§ўўћњћ§§ўћ§ў§§ўўщ^%$@?*+.-(&"#!!),323ў§ўў§§ўћћ§ўї§ў§§ћ§ћ§ўўј§ў§ў§§ў§§ўъг\M<-4-%&%$#+42,ўўј§ўў§ћ§§ўўћ§ћћ§ўўў§ў ўћўр‘GNG9*(%""!&(#B#5ў§§ћ§ћ§ћў§ўўў§ўў§§ў§ўўќ§ў§ўўў§ћћўѓСQ.<1&*&(+#*ѓ"-ўћ§§ћћ§§ў§Шў§ўћ§ћў§ўў§ћћ§§ћ§ўўћ§ћ§ћ§ўўг:;2."##$ !%§ћ§§ћ§§ћћ§ўќ§ў§ўўў§ўўћ§ћ§ћўўшЇT7@5*))%#&&5n4*ў§ўўњћ§§ў§ўўќ§ў§ўўўћўўў§ўўў§ўўщЧtwP841""ўў§§ў§§ўћ§ћ§§ўўћў§ўўў§ўўў§ўўс§ўўшnY`YL,(ў§ў§ўўў§ўў§ћћ§§ў§§ўћўў§§ћ§§ћўтuTWcwjU"-$."( §ћ§ћћ§ўўў§ўўў§ћћ§ў§§њ§§ћў§ћ§ўўцНWa]TUOEE.@A# !"%$ў§§ћ§љў§§ў§§ўўєћ§§ўў§ћ§§ўў§§ћўхѓU?amgcMAH\?1!ћ§§ўў§ўўў§ўў§ќћ§ћ§§њћњњћћўўцИbAPcca]SHC:SP-!() %)ўўў§ўўћй§ћћ§ў§ћћ§њўўыeQob[WZVWQNQ]58(8)$@9;ўўў§ўўў§ўўћ§њћћ§§ ўћћ§ћ§ўўхЃkWb`a`^]Y]SMGLH;WL53$4>>Aў ў№§ўћ§ћ§§ў§§ћ§ћў§ўўфЏgE:WPVL[VGLG@?CAO‹aQNG+5?<§§ўў§ћћўЩ§ў§§ћ§ћ§ћњњў§§њћћ§њўўьiPTBJGIME@AFBCCGLJJ2VnW:G]Jўћ§ўў§§юћњ§њ§§ў§§ћў§ў§ў§ў§§кћ§ћљњјўўЁd^[hTU[TLECJJLGFILMSb|U^Щжˆўћћэ§њћћњћўћ§ћћњћћў§ў§ўў§иўћ§њћўўзte`YYJNWVNHFLJIIHIQT]bPJ—ўўзў§§ћћ§ќћ§ћўўѓ§њњћ§§њ§ћњћћўўйЂ[^kiUSOOSQLLOLIGIOQT`SIuчўэЩў§§ћ§ћ§ћ§ўўў§ўў§ќћ§ћ§§ићњљљћњљўўО|njeaUPSSMLJUYZUMNNT`jYjЌягбйўў§ўѕ§ўў§ћ§ћњ§ў§§љлћњњўўэueUJW\UNPQOMFHTWTWVQ\r{`„рчЪЮЭўў§ѕћњћћњўћўў§ћћљкњћўўё‡b^I8TQOOVWTNFBLOPNOVUGYzТцеаЧЇ§ћћўј§ўћ§§ћћ§§ћњњћћљњљљкћ§ўўWan[NOSUZ][SPPMQTYSSUQ`uЎмбЧОЗ–ў§§ќў§ў§§ўќ§ўў§§ЯўћњњљљјљўўТVNZVWSVZb\WSTUVZYPIGNUgbžатШУНЛТ§ўў§§ўўР§ў§ўћ§ћўћ§ћ§ћ§ћћњњ§ўў§˜]LNHJFP\^N2BGHILIFJJUd`pСЯАЅДЄВЧў§§ћ§ћў§ўў§§ћў§§ћћњћњїїўЮжu`aMGFFBHPTSLEEGMOFBGPIge‚ФЫВЌЊЉЈРћњћњ§ў§ћћў§ўўћ§§ўў§њњдљј§ўњ}[\caTQWTMNSSUNBENLHFN[JNtЗФЖДЏЋЈŸћњћ§§№ў§ћњ§ћ§§ўў§§ў§§ћћўљўўйŸZZ\WOOYdbd^OOMHHJJGIJOg]aЎеОЛАЄЃŸЏМўў§§ѓћ§§ћћ§ћ§§ћњњћћФњћћўўј•dhe[YMHMVUTOJQWUOLGOPSZcЦрЦСБ™ЃЎЌЋ§ў§ћ§ћўћ§ћ§ћћљњћњњљўї˜\LQbQTOLL§QSNNтPQYNINUIN{ЎЩОКŒhkžФЕЊЏ§§ћў§ўў§§ўћњњћљ§ћњљњњўўжЃL\FPMLIFHPTOQH>2CFWQIO`S^‹ОЕЎНЇŠ™ЅЌМЛЂў§ўў§јў§ћ§ћўў§§ћћ§њћўўиЊFVorSECAEJWZSLH?72UOHHNeapДкЧОИСФДЋЅСмЫў§ўўј§ў§ў§ў§ўўј§ў§ў§ў§ўўќ§ў§ўўў§ўўы§ћўћћ§§ћ§ўўя˜}h§ў§ў§ўў§§ў§§ўњ§ў§ў§ўўњ§ў§ў§ўўј§ў§ў§ў§ўўѓ§ў§ў§§ўўН‹zjўўќ§ў§ўў§ўќ§ў§ўўє§ў§ў§ўў§§ў§ўў§ѕў§ў§ў§ўћ§ћўўћŠ‚ugўўі§ў§§ўў§ў§ўўў§ўўњ§ў§ў§ўўў§ўўў§ўўў§ўўѓ§ћўўЮq‚~§ў§ўўќ§ў§ўўі§ў§ў§ў§ў§ў ўќ§ўћўў§§ў§§ўљИƒ|‰h§ўўј§ў§ў§ў§ў ўј§ў§ў§ў§ўўщ§ў§ўћ§§ў§ўћў§§ўўђw…eўўњ§ўћ§§ўўў§ўўћ§ў§ў§§ћў§ў§ўўќ§ў§ўўђћў§ў§ў§ў§ў§ў§ўўіт›‘™um§ў§ўўў§ўўў§ўў§§ўћћў§ўўќ§ў§ўўў§ўўіЃ‡ŠkMLћў§ўўў§ўўў§ўўј§ўћў§ў§ўўў§ўўђ§ўўЩecmwwcўў§ўўў§ўўќ§ў§ў ўќ§ў§ў ўѕ§ўўŒx‚uhc\ўўќ§ў§ў ўэ§ў§ў§ў§ўў§§ћћўћў§ў§§ўђђ‚ijdbaўў§ў§ў ўў§ўўў§ўўў§ўўї§ў§ўћў§ў§§ћ§§ћўўї•ShmkibVўўќ§ў§ў ўў§ў ў§ѓў§ў§ў§ў§ў§§ћўўїrpˆzjUOQўўў§ўўў§ўў§ўў§ўў§ѓћўўЁmtcgQCVVўўў§ўў§§ў§ўўю§ў§ў§ў§§ўўњ~aiv‚aWWўќ§ў§ўўќ§ў§ўўў§ўўў§ўўњ§ћў§ў§§јћ§§ћћў§ўўї§ўў§ўўЊzttљuqgTa§ўўі§ў§ў§ў§ў§ўўќ§ў§ўў§§ў§ўўќ§ў§ўўѕ—pkYgib`T^ўўў§ўўў§ўўєЕd]Vdgh`ccbўўў§ўўќ§ў§ўўў§ўўў§ў ўў§ўўѓŠcciigg[`b\§ў ў§§ў§§§ў§ў ўў§ўўј§ў§ў§ў§ўўєwZzpgc^Ucddўўў§ўў§ўѓЦWMVbaba\Ydgў$ўў§ў ўёћ…Wom]bT[dbcm§ўўў§ўўњ§ў§ў§ўўњ§ў§ў§ўў№ю„wa^g^\P^]eag§ўўј§ў§ў§ў§ўўњ§ў§ў§ўўёЪŠŽjYg`\OS\USUўўў§ўўў§ў ўў§ў ў§ўёNFPd[WTJP[SOOўўќ§ў§ўўў§ўўэ§ўўєj\d^`PLQSVWTJўўў§ўўќ§ў§ўўў§ўўў§ўў№Ќhqjjc^P\VV]`UFў ўў§ўўў§ўўў§ўў№‡M[]b``^a^[cYVEўўў§ўўў§ўў§ўяЩzOJ8>7PQMMVYUILўўњ§ў§ў§ўўў§ўўќ§ў§ў ўћ§ў§ў§§ўюнc?8,LPH<9CAPP[YYўўў§ўўњ§ў§ў§ўўэАY8ViCI77??;72?Bўўњ§ў§ў§ўўў§ўўѓ§ўўпjhI4224:-)17;ўў§ў§ў§ў§ўўќ§ў§ўўў§ўўј§ў§ў§ў§ўўр§ў§ў§ўўуC0QF<23.*+$5!&.-0%§ў§ўўў§ўўў§ўўќ§ў§ўўъЗaEWIB94:)7)31374OA:ўўў§ўўщд…jL*!-3+("5-§ўўќћў§ўўў§ўўў§ўў§ўњ§ў§ў§ўўтЩhoqhk^TYLH@)%(-&"!*453ўў§ў§ўўў§ўўќ§ў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўўф`Qt{}u^Z]zQ:"80299&"%097ўў§ўўё§ў§ў§ў§ў§ўћўћ§ўўцЦvP^rz|qq`[IdaA28B;+932+ўў§ўњ§ўћ§ћўўхљxdˆwoonjhcddpGJ9:7890-@@A;,@+([cYcYF‰œ™kx˜ž~hu‚nz–ŠˆŽŒ‹Ti…„Ž|‚{ƒ|pqŠ–„ƒ„A0?A92233<-*7385$)33gv‚qxxd’”–’‡…~ƒŠŽ—œŒ‘‹‰q‚œ‘”…zxzx}qv}ŽŠ}SGA<>?<.AC;"()*0}t{nzx‡™‰{{‚e{{…„Š–ЄЁ—Ё……‹‡ˆ{…ƒ…|w‚‘|qMOB2@G<:9:,(,141($V˜xNAJ•Б‡‚qhzˆ‡|Œ„‹ŠŠƒ‰‚Ž’–Ђ‹}„Œ…ƒ~xˆ•‰aIC[;PgV.$.@;4  ehr~OcŽhL|EZz{k{‰‘wow‰ƒŽ•€хŸ›ˆ}‡Œ‚„ˆƒŽ{’‡BIYrucjbFC+&(,;-(1v‘’c‡„ƒˆ‚wzƒ‰z‚‡–œЄЄ–”Ž™—‰t”Ž„‹‘™x`vŠМ—$(8LLEB:<43+$$ M{tjРЇ—w~‰}‰Œzxp|wtЂŸœ–„ƒ‰‰‡…‘˜™‰ˆ„xЄ‰i[8@BIJ #105,!"Tq\Ov’‘tx}uwn‹‹…|‡—”—”Š‚„t‡‘Ё™Šž—‚„ˆ–Š˜…r""HUJO[”N;7&::P03ctxКЁŸЇŒƒ‡’‹‘”‰‰ˆ•—Д››—ŽŒƒ‹ЎдООЗЇžŠ”••‹ЈЏH<>74<@$@7-9CFA73p{x„УЛЖ}z„ˆŠ…‰‚…””ЇЋЋ—–žБ—‚АЫИŒƒŠŠ„•™™„ŒŽj,(&33HEFEG1*1359WpxДОtkt{…Š”ЃŽ‹›•ŸЌЇœЛДžœŽ•Њ‰‡œ˜‹Œ™\EGA:>BB?*73EOC>4$@nou~œбМЏЅƒ~{ŠЃЃ›”‹•›––ЂЕМЈ‹’ˆtatŽЏ™‘‘Шm)5?43;.<8)BHHF9:nŒ‰ho…ЁЅЂЃŒŽˆ‰„ŠЄЎŸ‘’‘ЂЄЂ”•ŸЖЖ€ФЌœ˜™Ё}p—–”™’Š>*:-77A4;CA:;480>vu›ЕСБЅЁŒ‡p…•–‚vŽ˜˜Ђ‘™—›ЉЎЏД›Ÿ›Ž…ЁЉ—•ЃУШ{;JM>:?<"0I;8>[UJW™•nžЏУКВЋЄ”ƒ„™Ѓ‰ŒŽ‹–”ЂœЂŸЇЄЃœЉžЁЁ‘‹–ЈŽгыЂJ.8@BG??*+:45?HM{nh`‘бНДŸКЄŠŒ‹Ё˜—˜ЊЄ——›ЂЂ’ЁЂЂ’Ž‹”ŒŒ€f˜‰Š‘ЈЉŽv,2MGEBC9)VFCEPW{ДxJ‘СЗВЁ……qŒ•‰‹–ЁДДБЎŸžœ˜—›Є›žŽ˜—ŠŠŒ™ЗЋa07;<<1-727700&(P˜Ÿtt…ЃЧБЏЁ–d\mˆŒ–ЌДЋЉ—‰‡‹ŒŠ—ŸЕФЋ—Œ|‹Ž~‚’ЅЗЁ‚J:@@41<<4+3E7Ec•œŒЉ–ЇЈЈžVmz’Ј•”ŸЁŸЂ•”––”˜™ЄЎВ—ˆ|}›”ž›И’”uC..4$,7,%+4@@OЈЧАЊЛЄЁЊЄ›~zƒœЅ•–žЊДЊЄЉЉЁœ—‹•ЈЊЌЎ–މ„‚Š—ŸЋ‘oL+2A?+%.1#C2\ЉЫЛЦМЏЄЅЃ™‘Š™ЉЅ‘”™‹ŽŸ•ЉЏЁ˜ЁЁЏЌ™ЋЕЉ‰‚‹ˆ˜˜žw]-%-?B:)!"82;gPH”З•œмТБЈЇЌЎЁ›’ŸЎЊŠ•™Œ‹‡Ž•–”–ЁЁЇЌИЫИ‘Žˆw‡ЊЫСЈ”tH?-;@>.)>&E7YЈФŒЏМЎЋŸœ”Œ›ЋЌ‰ƒŒ˜”œ’’™ŽЏЫШРЋЉВДМЉ…•ОлтЛj&$NE-:9,0A>12TŒrgtŽˆŒ‡Аž‘–АТ›„Š–ˆЕЛЎЌЎЅЁ‘™œЃЏЅЈ–’‡™—9$UE@<@9@9&$43:@7>QZ‚ƒ˜‰…‡|Ž—‘Ÿ˜ЏЏЂŸЎДЈЃЏАЇ•‘•™ЅЉЅЈŸ…ˆ…„‘w\BC?FC8915#%259JJ.^”wdtƒ‰‰ЅЌžАЋЊЊЎНУТЎЧЪБЈ™•‘ЁЏЉЅЃЂЅ‹co…|SGOLPP4Er‚”ЊЇЃ”›žŸ‘ЉЫМЯЪШКАЖЕАВЎМТТВЂz‡ЈˆO810%-;BA:"!GC@E8((&3EJE5&EqМЛ”pn‘ЏВЃЄŒ‹ЄЭЪФЎЊЎЉЕЖЖЕДКЪЮŸŒtzw579?CBE$44-4-155024@87:@G:*Q–ЃŽ’˜ЇЪО™„‚ШпШŸ”—ЂРТДВЛЖЗСИЄ•Ё‰EII+,BJIMIB%(!+5:7,5(+1+,"+3J>*HQHY‚Œ‹Ё›Вœ™ИйСЊžЂЅМДВЕДЎЅ‘‘™‚bBQ^[E9CE?3:)#.U<;32()-9>1,49825IEYZ|Žn~–АЗЉЈАЇ•›ЗЕБЇŽ”ŽŽ––žU+MUI4JA;?;8,%>7,*M1-$&-&&)$$)AgPCGA>Pb@@T”’q•бЇŽ•ЁЖЇž’œЁŽ‘ЃЧКЂYjSMI@9>$$)*7?>59.141,)(&$0*-)2PHGLNY[O$>LTkvŒŒ•ЄШ֘z‰”’‘œЃžŠG-^O1<538>.4H,:F@A90!(027:91>?GG€ДHLNGFJN^obcw„znƒС”‚Œ›‹–™žhI5:<3,79?>CˆT5*2A8(9.,##)40(01-C?HQQOFEHJ>HA3E]g‡tzˆ‹ЃЂ—މŒЪнАO,73.332*AJwˆ•pV9EB1$"#*)&%$2:+;?FG5:?>IB8?40+$35@z}˜Ѕ}P<;)(3-001)&".#+0.3;>9BF9EF2?JI?HBJYYdirŠ˜ЂЖŸN*UNFBC<;EAC‡žВЅЏЏo2#9*97;<89(0$4?H@8BC;<9AFBFCMG*1NrV@W|ЁЌI5mL@EFGA>@:ŠЋ——”ВАŽC9A@*-3737<>,2+2:7AMLE>3::8ACFHFHTg]p[Quˆa:1+-:3EFAHCIrБЁŸ•–—Ћ—pP43,(#3%#*84;NW)#7>>8;CMSMQUUZVM?8AJA31;AB?AGEFECGELNPP>)(.++(%*)$2}‰›‹xz‡——–~‘”›–Y>8;(%78)")$,(%$2??::BBEA:FEENNQB!.#5NA,œКЗЄˆƒŽЁŠƒ‰‡Š”—ЉЕ–xZb`H273--#"108<;7:EJGE@.,<;@G7$-@7tŒЎЊЂ‘pz‰™”ƒƒ€2‚…|rŽЛ{**1.+%95>A?A7*BIC9(0554>L&++! *B7.2h’ИЋЖ‰uŠˆ‚|z|‚}œКДЁЄ|J.5IH97.++7:-),):8533;9;@>>"!~ˆЃЏŒˆ‰~{x|}mz‚’ЅВКŠ”pH04.F@5?A>412AJc-#&7C?<20. !{rŠž˜Ž}xv{}„zruz”ЁЂЌДŸЁ‘ˆŒn\bH<05?9.%-HNIAENSZ˜ЏЌЊ˜бпшЧСЖшЯЪЦТТЪЪЫЯжжеЩЅДЯжлЭШЮааЭШЫажздд<479?9@E@95B.EGG>A[bЃЭеЕ—–ЧуаЩУИЪЯЧОУЭЮгбезейЮУнђьаФРЧЫааЭЫдлгЯЪQQE?:7??>@;>BFBEBFVОФТНДЎгзджебЫЩЧФЧбйклкжйЯЫЦЫжаЫЧЩЪЪФУЫЯбЯеаФQ@?:<@@FHH<>?@B>7AWЩЩШКСИжхЪЫЦЯЏЛЪЭЩЧазмзбкйдФТЩЯЭЩЫЭЯЫФРЦЫедаЭОQJ?BHIE>B8nЭэНЎЋбшЖ|ЌЎЅАМСТЩЮФОРФОсммйеаЮЭЪЫЮаззебЯЮелмс;([‚глЧИЖВЯбаЯЪФРИЖРЦРЮдзОпѕясыгЄ™ЕЩггЯгйедЭЩЪБьўЃGOPVWTQOH?:;EG9CgОЧЩОКСеЪгбгШССЛКЊзбглкнлкжТрТЂЩўўђмеезккЪлщтЭžUGGIGNFCE@:>;>NHEžеЦгШЧЮбгаЩЧОФЦФОЖрабкзййдгдЫЫЧдьчуккгбджухпђШ~C?AHIC9:ABA@IB4?^дкЕШШИЫЭаШТЧЧТФЧЧЦШЗгжлкгежыЪ™ЅЊЮзаЯЭддгадњїчАQH@BCC<5;FIHNTWV7}юцИЭбаЭЪЧЦУЧЧЫЫ€ЊЦЭЪЮкнрййлсћпЮхєёдЭЩЪЮбЯЧМаткaPFLLGG@88EA@ACG2;ЌпгБбгегЯЪШЭЮгЫдЭЫЯдмухунккйкйддкнмзждкдЪЩЧйјЮ8;LPLLHB?AE@99<97wТЧНЭћмсНОТадбггбЮШЫСхтпнлзЭШЩдгелмнмгджлббщбЗz-CNOP,*~ЗИОюїЪЛБРРЭкмнпйкбдкмрухцшхэшхпрбдьаЫбкуржгбTbPOTIGFGMLCIMEWS]ЭнмєўшКЛФУЧУажллмзЯЏлрупжтцышччттллддбзпуцђљШ\IITMJLGLBTYVVH9M”МЦЪчўххргаЮЭЫаыюкйлймнруспсцшчрккнзбЉОйьхлбкїƒ5LSMLQ;SLJMaj`‡пжКйяѓыщьщйеемхнлаблмрршцц€Љчшэчцтптчтспспсхўўнe9NZPHJI01;MOEU^mЌРЎЅжўьютёядзезекзксхцууччтусшшхнкмнрссжлззсшнЅAF`ZTNLJ41cSNNcdЂмђЦ‘ЯћюьтаЫЗгбджлсхшяячшнрпмлущьюужнллмлежпњхЯGIUQLHHC@EHHF9;hЯмЛЋЩщћюшцнЏЁВбеежмтцщютзеклйймхчшэуддгжзлуцђцЫt:7PQIGJI@BCHLBTгубЦучсцчясœВНсюкекмххтсмхтсскзмнккпббегмкйпьндЊQEMGC;?<9;7ELMgШгэ§щуѓчцхщцЩЪЮщтрзмхуушщшшщцрнктхшцшркжелнпмѕнНn>5NJIEA@427+NEpедмњёышчщышхнмнсттнржзлйсхцумдетчыяцмрлеЯегкрмФ—@5@QUSF9:17:mWYКюккњшщххутњуцуреддЖейрнпррптцыщыэчѓжеаеач§ў§уЊYSLIMJ>99+4L?eЩюЯьємжзплмкммрчтлаЯббнкнмнппщ§ьь“юыыѓэЫбарњўўѕАC7]QNGC>?M3C13JxЈЫЧЭдждгнтпйктчхєнеаажжабдкжОЮђђяёчтццўсждбпннсКnHMUVQNLLM)+5-G[žЪЗВЧЧМзєбзмщыыощлкссыНЭггеЭзѕюэуйклмухрпмтрукл{QOOžHNGGH)(,0NPJFmЂИЉКеаЭЭнюхурпмрўчгмнеЮэѓшчээхтртччьхутмазЩP>jSMOMMBB,,-3AFN[OG`vЄБЧТФЮЩеклмртхцыээ€'ычщюэчгйенхшьэхнЩеЪТаЇrQPZONSHGC,,(5?LJSW@JZT|ШЅЎЮЯддмсцшцыхрцшщушчыёэпмсччьыыхыдВАЭЊjPdZUEHCEH-@.5B4IYZUWE@I^^kŸжСУУкмсуплйжзпчщююєюыщчыыььыэцчжФЦС~eTPHC?A@C;AME>5LU[^bWTTe`;TЏНпкеждпнурнпшјѓьюыьыыэяьђяёљщлИЩёАqL9LQSSVH",53@@;@;:;8:@AHEJ`L;Wd`kЂАБФЫькмєўщчссщчышскпррмлнЧ‹SixiNFPNIMG0));^HEE>;<7;CHGFEIJJ?P[Mmq‘БŽ›ИняццхстцушцпмккЁйнулУj>\dYNLTSOF>?@INNUp59>9;7<0ETQPUZ]a]AS^cŒЈВФЭлў§бЌЧазйзттЭcBjYBELMICEBV:IUMGFA<887;>EIMA?GPMPNPSTWSS[r„ou‹Ђ•ŒЄмЫЯЛбгеббгкдƒV?BIGLJJILQДtI8FNOFM:3345BGG?7@F@FJPYWUTVZU[N@Ld|”‹ВЮмкагжпўўИbG@CAFECGFPИЮЭ—mNQ]?$07:<;?<89;:A?FBТТлпЯЅhWN<97AAB<<;<5F>>HNJEFLPNMMŸIEOaU:BW|iOkЅмыЌTBxYNHONPIGIЪщккйдкщюЗZFYUBGB>A?<@@3;EGJJUbYOMIELMVVZVOatpie‘Ќ~GC@F@EFJQOQOВщкзмм€WйныЮ‘gCBGA44;<9?;?EJMGTh90HG?@HQ[b^[]^^d[LTUZIEGHJJQV]^\OЕВШгзждмхЫжнОt^uxT>B;:HGFGMG0EC-+@ECBCFS[YVV`dd`^YZNH@:AGG5>H.@UЩФЧЭЮЩЭйзмлпыуЛrgQ:8BAIFFMQI?;;428+.IGA8.74;<9:?>AGIGECMNQTV[]F+1215078>QP9ЭхёнщЮЯаЮбЮЯаежпшюеwznU@LAC92255CEB>@BEA@CBHIJLL-+-)"%.20ТЪнхђдЯЭЭЩЩФРНМТЦЭжхсщФЩдЂoUIBSTIJPJA@HITh<8>CGJE><40+$"(&%+(ТМЯлпжЦЩЩЫЭФНЛМНЧгжптюммцжЪЦ•tt[INOOLHEHLS*49@CC?1@3+&""%(+-30+ЭЪгммзЯЦРФЦРЗЌЏЋНЧЦмцхкЯУЩЪжаН•`ULITaIFEFFC;79>:8*8#%(&)*351Q€йSOMVUOSQQ?\\PTOZOPpxx{i`œЕЌ‹{ŒЖЗ…‹‡‚’™Ѓ›ЃЂŸu…ЅЃЇ—˜•˜ž—ސœЋЊЊЂLCMPJJSVUOPLGTTNSBUFu™Љƒkg‘ИЊ”•Œ—Ѓˆ}’œЁ™ЁœžЌЃ›’КаЩœŒ–ЁЂЅЃžБŸ‘\dUUJQOZPNOLZTSMCGJ{‰™Œ‰ƒtЅЇŸЇЌЋŸ–”•˜ЂЊАЋЈЂЂЇ•АЋЋœ‘™•—‘›ЄЉž•ePJUTVVUT[SPLQML3@L–‘‹ЄД—”’rŽ›Ё‘——ЃЊВАКУЋ•œЈ™Ђ––Ÿ˜œ”‘›œЉЌ•ˆccSPSWSSQVNGHEIPI;jД›ŽaT`ЗЮЉЅ‘ƒƒ”••˜œЂžžžŸЋЃЅЋДВЉ–—ЄœŸ‘‘—ЋЈЅ˜p[UnOjŠoO48UVMGAC1,z‘‘b@rЏƒ`•ЌZh”–ˆŒЄЇ‘™–ЉЏЕЁЋАЎ”ŸЇЂЂЂЁœЇ™ЋЇЈTgp™–‡‚bTWU\O143T›Ж„vwД‹Y{{cx‚Œ–Ё˜ˆŒŠЌЗНЎЃ˜››’’ЁЁŸ‘ЏžОG;MkTFCHLEPTOG1CoHVŒЉ~z„ŽАviŠxtˆtU~‰…‡‰q{БДЊЃЂ‘•’Ё˜‘ЃЉЈЉ˜˜эЦЂZUSg``a^ZYOHH<@NdEЌЏ„~‚•›—–Žˆ‰~z…žЃБЕˆЌЫЮЕŸ—”Ё™œœ–ŸЏЁŸЂЊ˜ЄФўŸ\bTceic`V[VWZSABS`™ˆ~z{™›™ŸŽ…}’ЅЕЈ–ЋаТОМŸ|o‡—ЃžЇЄЎœ•‘‚бїaepjgpo`WQJLNQ?>dЁŒ‘„Ž…Ÿ‘ЇЇ…‡}zЄЁФЪЕВИЋ—В‹nЉтсбАЄЂЊИСœЇНЎЂ‚LZ]\e[\VWZHEBHME8„Ÿ–Ё‘••žЄ”€зŠ™‡‚ВЄ™ЄДЏЈЈЅЃŽ›ЉУРЈЈЄЎЎДФЦОЦЯЈn:QW\[NMHVPMHMO94L™Ѓx’”—Є–™”Œ‘–•”Ž˜‘˜АЗžŸЃН’rpžЂЊЂ›žЅ˜ЇМьуЩŒJI\]W]MNMTY[YZaU2\ТЖ}ЄЃ˜‰Š‹‘”™ž›”•ЋЕАЏЊЏКзЎ”ЕЦТЄžœŸЖЉЄ›ЄЋС`S[]Y]VMNGOJNMHG+4‡ЊЃwЁЉЄЂ•’‘›—Ђ›™™ЋЏНЗЏБЇЃАКЉ””ЈЏЇЋЋ€.ЈŽxžкД5@Uce\]SLTOLEEC9-YŠ‹”нОЕ‹‘™•ЁЅ”•’Ž‰ƒЛИЗАЌžЅ˜œЃ˜ЃДЎЏЈЉЅЇŸ”СžŒh*;O^\U\2EAMSSE@Bg‰wg‡ЗАЋ•˜’‹‰•ЁЁЂ–ЄЌКЈЃЈœž”ƒЂЁДЗЅВА™ŸŸЇЋЖМ”ƒ0>^ecioА`:INLPYjGMxŒ‰ЇдЛЗЕЈЃŸЈЂЅЃЊžЁŸЊЈЩДВБЌЅ™ŸЫњхмЫЛЇŸЉЏЗžФЩŠ]8TVUTZUITOIO[g]YQƒ‹œеЭа–Œ’’›ЅŸŸЃЈЈЂŸЉЌУУФЏЋЗЧЌ™ЦщЯЉЂЃЅЉЕЏ™œžx?@>SLa\]`VSBQS]M2gˆŽ•Щмœ‹‚‡‹–ЅЊЂЎЛЇЃЃБИБВЪРЛЭЮОЈЕИЏАШЃЃБАЎЈЃКqY]VOMeY][TZSVTQ^IOЈЉЏжэШŠ”—Œ—ЄЉЅЁ|ЌТДЈЌЎЦжмНАНЕЈЉ™—ЅЄАРНТЫЎSHMVMSWZPbNJYPS:LtkŠ”КцьЯ™ЁŸŸ™›™ЁЌЇЅЃ”|–ЦЗЎЏЊЛСШББИЕ™Ё’цщЦФДФм‘?TeWLONWIWZac\M;SˆŽИьзФЗЂœŠ–žЛРЈЎЁЄАВИЏЋЋЏФбСАŸЋЏЅ’qŽЈЫБДЄЋр};NZWTWPVLVPbaUMNžЄw~›ЛОТИЁЁœžЅИЩЖЎЈЋЗТИЋЋЎЛЦЭЫОЖИЕМ•‡ЎЛЋЎ˜ŽЅ–J>YONSTSU]^NOVVIWŒЎŽЇЗЪжЪКТŸ”ŒŸЏВЉЇ—œЃЛКЛЗЏБЈЋОУзеЖВИБ™—ВМИЌЧхьŒT`cOVQS7G`]OSmt`uВЃŒАФзаЫОСЌŸЎДЕЈЂЁЉЊЉЖЛЗРРНМСОКЅЌЖЗСВЃЎЗЋžыўФa?Q[^[Z]@?JZQGYaiŒ~qЊчеЧЛЪОЅЅŸЌЉЖЊЉЎРФЕЖКЛЗЕДТТНЇЃЂДЏЊЌЊЅЁЈТФЏŠ?Mc]Y[PSLBt\OYpkŠЏбdЏжаЪСЂЃ‘ЃЌЈЄЉЎЖЯдаЦАБЕББ€ ЊОРСТЇЋЇБНЃЇЊЖгЎЇj8NVTNZMMNPPSL>BdВКŽˆЄЦрЫЩНЎm~œЁЂЄЅЕФЧФСЊЈžЌЋЈМЪкЭЕЇ™ЃЁ™ЋЛЭНЂ^.?TLQJIOVLLQ\OZ‚ЇЖЇžБОАРОРКm~ЇЦБЂЉЗЖКЗВДИЕААЊББВДЕБЅ—ŸЌЏЊЄАНЌЇŒQHNHSAGHLAFSYVaЇЂЫпСЛбРКНСЗ–•ŸЕРЌДИЕЛШШОТРЖМЊЊЋАФЫЧРЁЏŸ™ЁЇЗЫВ•YA8IUMO\FmМлЈЩмШКЖЌЕЉЈЊЏЕЛРЈ˜–ЅАДЛЌАЌАЄФтнеЯУаЭжОž›žБсѕћа;:bYVLAHUU>M:UULCd—Ÿ‹wŠЈЂЋФМЛЖЊЌТрИЊЉАЉЅЧбСОФРЖЖАКТЭУТДЕАЄЋЌJA?N\ZYN.:YдбЖ‡ЌЫжУУЃЇМтслСУУСТЩЭЩЦдтыЖЄ„Œ‡A47-SMTW\[SOMSU>LSkFEAMELGE@@8E^zg`UaQevO[mЉВ…ЉшМŸДИРЖЌЅБКЋЊЗсгВo…ic]WQQSECMOTUIIFJLNHCBJHACA:8Sm\]`ipm]HSce„ЊЁЇЋНттЇ‡›ЋЋЁЋМНЃWBzeJUQWTOHLVFO[TOLIJGJ57LHVQQJO[Y[ZY^]VZcaw‡xm‡™ŒЁдЉЃ’ЏЅЂЇЎЏД{]GSPNOOUMUT™kGAJTNSTGJAEFETTLBFNOQZdi`ZZb^b^TFWp~‘–Š‘–ЄЛРБЇЂЋщўНeIMQNIOLQUY…žЋgLWbH-?AEHCE?;::ALMU[`VJNSW``VYYZd[p‚–vЃВЗ‘ŽЅУДaUjaUSHNJOEOŠ–АЏЗ–dZQCCOFICICE?FHFGLMTSSLTUbQT]c[J\Thwi{ƒ‹ŸИАНбБ`>ra\[QYUVWVœžЇНЮЧШШ:"3FQZJQS`di^ghpmhb]UWVFTONQ2AS@G•ЈЇМБ‹ŒЁЋЄЂЅ˜АББЌ’eSOLC57NML:F;EE;BNOQFNZYSNPV[Z[dn^;;:<@::ANmjI–БгЩС™–ЉЎ™›ŸЄЇЌВТаЏ‘ovw\LYOIFGAIEOBLTQN]^cUPGSMYVbJ;*B47571&;MSSˆЁЧЦЛЊŠŒЂДЉ™›Ё•––ŠЈЈ™ЕЩA8CG839>-AYPNM}ЋЯЩЧž‡–—ЁЃ˜’Š•˜БбЭРН’\BFUISH@AHIPTNHMGLNIBSJLPZU.*9,$+55?@5)&”ЃИИШЄŸœ––Ž‹”Š…Œ™ЅМЭޘЁЉƒVFGGY[SWV[VFLQUzAEJMOWLJM><2)$%+823303’ЇЖЏЃŽŽ–›—ˆ„—ЊИМЮйЖЗЛЋЃЄ}p|\SVY[UOVYQT35BNOPM3JB.<91))3*EB9:ЂžЈЎЌЉ•‰‡’Ž‚~|x„‘ŽЉОИЊœ•œ—ЅЅœUUQSdeTJLBFNL@EBMA;B22#3,%1389:>џ€‹˜”pVQ:++"&.28150!,"SУЇŸ‹Ђ‹}ZIB,)&.:7(2<[ŽЏŸ}q@E‚Š‹…ŽŽЂpO4[It\-?IhrrnkuVivb„‰;24,( !,,-(4-ECt–ТЌtb^q‹{„zu„‘Ђx;QiYOUWcWbwqbaž‹‘‚|h‰w-89%(%0&%(279.9GA8<4AQr‚tЎЎ„SG:Birk{oz‰’{w`SW4I8GSOhme[g\>EO‹LJ(7"+,30 (:3-.)$*0+(0YŠv‰ЕVi‚Љx„‡Š˜~O3TQv}‘}Sejm]\ZkpuАˆt1Hi4+0$#$%(-&3L2..}‚Š„ro|ou}‚”˜Œ–‚vLFxbx”}ubgYZobpœ™{w{|H&L920--#-%*)2(2CNk”ТЎИЉ‡[\oqŒŽŒ‡‡Œ‹‹t[[ŠohiJNijvˆЊ\?|–qFˆ„F><;3"!(+(&2+5:A73570;‰–~’œЁo\2Wrƒ–Žv}‰~‡cgwVBe–i‹‘–xa9Pdqac1!1)+E:8*,.3%(5@N7*>?:dz{ДЖZicTh’ˆ}‚|ƒˆ`eLNv>2hvcoAUw‚n‚tnj-32#8494872-?>;NN1:#8‰‰eu‰–|mwqcn‚™‘ˆ{…no‚\A|q~[|Ÿv.Zmœ›Ѕg0q(!*)7A@>33%)4759$Tojvuvwgegrpt~ЗЅT‡‚Š[0]*Gidh[oœЪ•m‹ˆЄˆ}5-e+ ""?50>JC7+:5>9-+5‚‰ŠŽŒŠmwccƒ˜™›Š\…‘‘o‘–qmŒ^``mƒЇuT‚‹Œ{VSt0%))():9BGG007:B9490rœ—žŠpxdhb]wž•Д{’Њ‹xjrv‡—ЃYMcmm…bB}ЊzTƒjeƒ-251+.*(;EFJJGH?"+YЩжЈ’—›‰qqujo‚•‘ƒŽŒi38^kЖ…u„‰ŠŒqrGw‡’‹t~‚VeO^gtnYgpvuxaunhrkƒ„‘}mJ778?2CE>0,"-.73uƒ–Вz{wt|‡t|„ƒz{•‘„kbt]O]SJg›}aadrkrƒ~„a[Hj‹Š91(:34CNFB@,42E>kŽœ‡Š…‘‡|zS>`ŸŒ’’t^o`]geri‹gLdw|h>Y~V5?A[‡Яœ+*&087->>FEE€Ў8)F„ЇЎ•Š|vnmr‚uZz‚Ѓ›‹„ƒ|roeN^UM]TZ[kj`|j•”hcdwMUwzE<;8>01.:>:BM>OEЏаw‰ˆ‡b3a[ZQHn‰|”œ…wtqz„phccgne^ei\mqtzw{ghhjejj;5,9CA7-0(--@2>\žЄwžЖЛИxmA`ugƒ‡…‡œ‰cbmrmPQVcox…`EZoi\grqvqmneZav830*!-1*+4?CF-3g’ŒЉЌЃЁЌ–eIuriŽ˜––Žƒu`hwjagcogvbVjngbmnhg{‚‚}vmGA7B@740)-2*IP0zЏЅЎВŸk{p…™u|‚‡Ž‹ˆkjmhpJ%OI[d]iu{‡‹pjvxahunƒgBLQGIB93<94+@HiЊ˜…’˜”vp^okvrzqƒŠ…~t}}|x\\QNIScbjv‚ur–‹|kƒЈ…w„Ÿ?FI><858?GFU:dЮЪЌ‚ƒŒ•Ѓc}pk~‚x…rttvt{Ѓ9AZvvYaigr{ŸojM>]j‘Œ™žaECC)")E:1AA*JL?34,@FF.‹ОЅ‚Š…cgo–‚}u™гЈ^`drggnrWWV`~|j`ZnˆŽk``Y^}iqxzt?@IB@@JMPEV:CККŒh~}wŽƒ”~S–К~IdbdqhMNT^ICo‚z~oYeow–re]cZA5%a„?>BA-%EPNHGC{ŽŠŽ‡’Ž~~v‰ƒƒ{ŸŸu^jaqzeaneZdQOo|~„{{pxƒ~qakxHIbq{9.5)-43::71QЂŸƒ›Ÿ—Ÿ„|xt…‘‰…‰‹q]WdUdpa]jognguxrgrŒˆ‚{pvˆrPtˆ˜ƒ]u9<@??A35?<0‡Еœ’žЁ™„Ž‰ŽŽŸŒˆŒ{}j}add`d~uzƒŽnU^cŒ‚„}‰‹БˆMV]t{cYx,(727GFH?(7‚ДЃЊЈ›’ž”‡Ž‰Ž”މ~}„‰WbdSMa[|ˆdAF\WHS‡x‚ƒ|p^tqepaUd?57:<;A;Ee‘‚Œ‰‚ˆŒ•ЁЁ›’ށˆ‰‚z~ŽЉМ”„|UJd^xЃ~rxŠˆ‚…Šan~naZA]B74,%+7%4>„В‹‰Ÿ|c}…Œ˜Ѕ™ŽŒ„{vŽuYVbБ˜xž™}^nct~‹bm‰‰h^B`u…IQn3<99&04&;Cj…ˆ–ЂkSNq„ЗЋd–˜{p|…G;OeYixjPMerm]YˆˆbG<[GHo]\kwxep}1,.1,499OYg‡Šˆvu„œВО‡r˜™h‰Щлqgi~hotZQ\rzdg‰ƒzqj~{kJ7?^xuu€*v‘Ў18:.*25,JTƒœЅ…|v…e‘ЁЏ‹nmˆŽwЂбРzh{—n`agknx|{ux}‚w[ZZ˜ŠSh‡‡m`iBk}9@@?<>?CFQЃФА™’•‡–Ёnieo@hЈУœ‚ŽvdP>[iYmqw~ƒuz‘Œkomb•Ќ‡`jn\–28;<;HI,!SБЫ™œ”މ‘˜Ѕžwvmz`Šеб‰{wrnkwVGT^u}w|zb‹ЎИ›‚zuh}‹…„‰Šƒ4-.@@E81>oЎ™Ž‡”Š›Њqdnbmd‚ЄВŒtƒ…ƒ‚„rT`p‘‘‚~„zgjНЧŸnVz‡v‡Š‘’-AGIL#0›УЛ‘ƒuj~‘РТŒgO~…u~p‡|v}rnpSEP‰œŒ}}nnœЄzjor•}otvxp‰2"(:BF@5Az…{tMN•ДА˜{‚ЁЅ˜rtwrirZdZQ[mЂŽ‚‘|gT?2#An}rioozxwž:)*8@BHSp‚‰|b7‡ДАЇŒŠ‰”•”[exm`USMV\EOk‡”…‰……Œ”—hp}v‡—œБ—‹Š‰‹‰|WL`WPbqu|jh}Œ‡~qr|}}pJ21@-e˜Ži˜ŸЁЕŸƒŒŽŠ‹Ž‘…zjacg—”r|hciž}xz…•ˆ…|™‚r|ŒtJ\rzo]40934+Ї‡{‡œ‰ЌДŽZix}}Ž‹‡”Š~aL˜”gQU`Vkƒxvmpttu|~|wdi|Š‚vovxww9101,9!%ЊЅ‡‚‚ŠœiSz‘˜Œv|qVUkžjAO~dUGhЏ‹„}|ukjb`knjkzkUZV`n?13.39)+wœ{b{}zpo\bƒ‰Œ‹Š‚‡™…qwwac]\Zcbt™ƒ‰”Ž„urdjw|ogdbe^]U|”EA;5419dk~‚‚|{…‚xqЗЁ‡}gmq|rTWqSZ\MSWpЁШ‰}||ƒ‡}h]kqo]Uajo{vЁ˜@9>:3-&jqkWmxt…„}Ž›™’{x‚qid\Zmntjikbh{~|tp{„tt}}{uphdtƒ~{ju„E4+18P@F…~{z‚˜’Œ…‰ž›‰‰‹|oaFapmq…’ŽwuqКžŽ‡‰„}{v}m[Qc‰‘ŒŒ}{rr};A8,(3Iq~n|„Š‹‰ƒ”Ÿƒt‰–—mj`giwnaur\[VvЗhechƒgN[^c\NHFHirjuvzxB&)),Pgx~‚…А”›•uŠvwqrx{QTQhxgZY[u‘|ioimcNTecbcJI$Teg~{}x2:48:,")cxxƒ|’—•’zYbbZVevjrmQN^zZ @;4%(2E^”Š}~}–ЭЛƒ„pqhQ;B;BVTJOVP`ekquvvgW\‡Œhituvqek•–Œ‡w}E[:$&--Gp–Ђˆ‡ŽŸЃЁˆvdbivjVAIOCabgck`Z\hh€—c`[`SCU}œЅЃ{rrz|r~wrzJkN))&?v}„‡‘”˜›Œwprqq~r[Ydiiab]dckdjhpŠp]jp|{~wuqkbdiu‡ˆvxBC(#+h~}|‡˜ЁЄžŒzikhgkbUUIIMEPYdtuorttzxrveaU}‚vuxxtqpgau‰ŸЂ 8GHo‘‰ˆ›Ђ›‡Š}ehhojcYIW]Prh]PIU]\Z{~weVZM4Zˆmmuvrkozu„žЏЧаB?;k~‘Ѓ–’˜~uvqv~‚xhhxzuwˆnVU^jqhvŽЉ–{‡|]2Lˆ„pjmiehx‰‚‚‹•ЋЗ$)$.H\bЎŸЈžŒ|j]hviLIj|„ˆ}~`BTkqvuvwˆ‡zgvkikqv{~‹Šƒ…’ŸЁ’)55**Arko–‡iVm`^aFFH,?Z`crjbhegjax|aiqko|urc]aikt}‡ŒŠ‰Ž{€ нлБ˜vQ7CIH?450|ёцажцйСЂ‹„ЉКаЯЮбгОЛ’™‚n|ЄœЂЃЈЂЃЋЕОЛЕКЖǘWQPLMHC<5AAF<88<:;;U:2–лякзжФВ…УЮЪЮЧЮешН™‹ЇЂЮСЌ–”›ИЪОРЇНžЎААеЧ`:G.HFEE?:8;9ABCB@BG^9^ЗујѓйАФДЅНжШКЗРУЭюЩ”ЃЎЄЁЇЎЇЄЎМУНАщЯнСМИжЈ@SdBBH@@EEVVНўпцёюйЁŸРНгЮЫЪЭЮбзЮТЂЁгЖНН”ЇБВЛШяЌ‹ШчСдЕjUPNIA@>@FF?@CQPLJI>APУшЩлцмЏЁ~˜ВатЮШУЫЭЭдЅAIСЦЁ‡БйМОФЭОЅ‹–ЋНЏАM@L>JILNSQJIJJHFFУ;LЕШдЯбЮйзСЖДЄШрнцТ‰ШзмМпхМЕе’ŸЈЗЮшЖŒЧмЪТд›ЇКPJBCCACMTVTNJLL€SPHEC”лмлмззЦЦОЗВЃКрхњШзјйЪЗСдмцї–ЋЗЗзЈ‰УёРЇУЗЗЪJHCFEBBFS^[SWYPN3;5tўўпнкдбТИВДНЮмкзбЧбзЏx{‰ЄТчр’ЗДЖНаЋkWСЦРОЦ™E@CBFGGLQ]WZ[ZZVIj`дюуЧйаЭЮЮУЈАЄЯюзгЭЮгН•ЂЛВЂИНЛЛИОНдЧ’ЁЯЂбЫЪЊ›CGGBCGH@FILLNPBILr„ялЪЫЪЩФЭайТǘОбалФЧЭЄББЎДМЕИЕКОЦЦСЈЖЖИКИЯбуФКYLLJES]]QJGHCC@JЃТюФОСУЦЩЮУНадЪТддЮДЎМЊЉЉВœТхЮБЏЛОНЗМФЩЎЋžНЮмжжPIIACHOSQQPJF?SP‚НпйЭЮЫЫЪЩСЁ‡ЌтмлегзЧЖЕЉЋЌБВУгД‹ЋЛМЏ„ŸбЯp‡ŒЌЫўлIHFCECFJQTYYUF:SЇэьеаУЦИМЛШВ–ОЯаеегбйЮИБЋЕЊЈЋЋЎЇАДБЕЛЗецТϢ˜ТНMMNSTJAHLLU\VJeYе§НдгЯЊƒЇЉЈЄ–ЛкЦзчЦУЦФШЮРБЏЎЕЖЖЏЌБЉИТЫЯЯЦМББЏЎЌМLONOYOB@BGHMNFN~лхЗжєљчЕЋˆŸМЎФжТЭгШЈЗКСКЈЇЉДНРкЇЄЁИЖЈССТТООНДЇЅСPNGAMGBAGJHIV?HпзьстуябБ”ЛРБнежаШШИЗЛННБЇЈРКЗДЂЊЊŸЈЏЕИРУЧЦУРЖЇˆSVPNMIGBAC[ЈщхжейждТДЃЕИОЧШЯЩШЯЪУРНбУИŸœŸЈЈЅЈБЗШЪЩФтЪЧЗЩэЯНзьMZWQJLLJTPUjJwљўёЧЭЫзекАИНФУЩЭаЯРЛТМКЧёЫz~˜ЗТЈЅЈЌОЧЮцДЇ——ЅИпеущБQWLEGNNPPIJ2>OЏђзЯатМЃМЫакрмйнЭЦШдСЁœЉЧњсСумЩАДЋЛЦЫЦКœЕареАŸАНРб‘ЈIGF:@FE9GW‹ТЛЭдрЕ——БЪѓцžгпШФЧгЩ’’БЅВООЂŽЄЛЗВЋеЪгЈ˜Ќ–™КЊЌВРСБЩGGCBFFEFboŒСЫЫ€эЦЗЎЦзыяРЈЫЩФЎТўўНЋБРВВБВЇЊИНЛЖааЦНЋЧЭЖu|ЊОЛМЛКкђFECCB@B;]oЌпцЫКООžбэєаЎДееККрњёОЌРрЛЏЎДЕМОНЛССРСИДЖЎчб•ЋЩбВЋБ{ЋЩILNFEIM[TmгўђйждлбЯнпЇЂЌДv–тўрйЩеКЌЁŽЃЉЂЕЗИТЧТНккЩЗЕгИЉкњдЂБВŸжтFIEEMPN:8nу§нгЯЭеклэпРТИНЅЮўўЫУУОИНЭЃЂЛгНСРОЌећ§пЩОТЕЪбгабб€ЫжШACHMTNM1H’ьсбЭбгепрчЋЌЖЕБЊЭщэЭТШЧЩажР™ЅАееЧУОКЈЅ§ўкĘРЪЭЫЩЧЭаЯжд??CIMPN4;ОћшЫЩДВЫтўљбЊ–НЖРЭНЦВЩТФСОЕИ›}ЯцдЯЦКДЖмшТБДВжцЩРЛМНСШб@?BFPSN>YЉЧЩТИ‡ŽеюрнФЛФуцйнНСРНМЫОŸЏЊЇЂБжщЮШЩЮбШЎŸ‡vw‡КЫЛЗЖЛЛОЪтGC@@IOPc‚ЗЭУСЈtОьѕсзЩЩЪЮгмЭžЋВДВВЈЁЂЄŸБЭкЭЩЯгаруЎŠЌЪАЦбФТЦЦРТЧЪHFCILNUMTЎЩМШаУзйюлЯЦШЪЫЩНЖЂ˜ЇЈЏЕКШФВЉОйкЫЧРУЪЪЗР–{ИаОФЫЮмУЖВИИЗ7;GJNJOG…йдЉШмкррйЪгЩЩЫбетЭЧЏЅЊДххОРДАЎЯпЩСЛМФЩмШЫТзчСРЩЧКœЕЛТМЃ;ABFGC*щгШЭтйыэΘБРУЩШЮбмеФЉˆЧуйЅŒЈЄ‹ЋЩФСОНМКИНУЦЧОЕЗЦЪЦЛЗМОРОHJHAGC08ЄѕђЩЩЮгпФЃŠБгбгбЪШЧК—ЇЊнЏŠ”СЌЉ‡ЋцЦИКСМЛКЕЎВНТННСУЦБДАВВДSJ@BHL8?ЂлОЉСШЪФЖДžЌЮйзгЪШЧлЫЕРМВЉЎЌЌДЎОрбЩЭддЩЕЗБВОЦТЛДАЏЎБЋЦкZN@ЁЗД—ИРЫУЗМЩезЭЧФУТЖДЌЂВКТДЏЋЃЉНКУСОМЦЩЫЩЦУЛКИЕБУЮЧОЛЛШзCHEAJdJZБСЛКЧмгаЩФбждЭЭЫЪКЈ–ЊБМСджлжТЦИБцЭЭЮЭЭШНКМУЇЃ—ЃЮеедУСОРУOGA>FCBjБОЦЛФЭаЮЫЮбЯЧТЦаЮкБАВЏЎРКЇМУЌДЛэШАЎМДФЇЋААЁ‰Ž•’ЉЛЎККНСJG9;A]™ЎЩФУНЊЮююрОЛМЖЎœЊКЛСЫА–ЃЅЄžœЃЅЕФОЛВАДЛСТТЛЕЗНМЖЏžМеаеаЪ@OOFC4GižУждРНКжјэгУОЛММЖЃt…ƒ•›ЂЃЂЂЉЇЏЗНОНЕЎЌЊЪЯЈООСРИЖЗМУжЪФУУLwO8E@IxЎЭтШСОЫежлОЛЅЎБАЇЁ‘—‰ЇЏЈЉЇЉЈЉЎВАББАЈЂƒЄШмЮЭнОДЗНФНОРОЛОY„Y5?0TŸСдхЩЦЧШЫаазФИВВЗддЪЗЃЃЋЏЉЉЇЋЌАВКЗЛМбБЎЏИРУФУЖКААЕМРФЭЪЦОPT92;:9Jc‘ЖмйссУЖЎАБОЏ”‘АШадСЪЄ‚žЊКННМзЪУРгЯРЎДИЖВДКЛЗЛУЩЫЮбтуЯ-7Qhi\qqjpoq{„tŒ‘‚qVOZT5MFE9BQLF?H;5?F[>+jЉТБЈЉ‹JOŸ˜˜žЌИgVndЄƒuVV\ƒ’…Šx…ivˆv›T9S2H@OILLAHMPIHH€єWhŒЖнЌФЯТЈmoˆƒЁЃЃ™››ŸЁœˆuqŸ}}Zizƒ›ФrWЌU”bOZSMSFA@IIFMMNUWINILPžЉ˜ЅМЋ„jHb|™ДЃ’‘žЂ–{!ˆ‹p^{Б™ŸЏ˜qSgt„unJ8EFJVUEFFGNOOZ\ZWTPWL~Ё‰ЭЯrxrgƒ˜Ѓ˜Š—˜˜wxY^„™SG}Љ„v‰WmŠ—„…xCLHJ?VWWHONPSY\c`UO?7IœЉzŠЄБŠ}މw‚™БЏЎ’”„|•g`‘™i”ДЕŠ9mwАБИrI‚@?IMEHIWW€лYWMNOQ[WLBgЈИ…‹„‰Š}|}‡~ЫСi›˜iBrJVƒ~k…ТсЊwЉМЁ™JB{A4CF;LUOMSV[ISLZSQLIN’˜ЌœЇЅŸŠ„~q”ЈЌЗ’ižœЋ…ЈЊ‰Ÿddr‡Чƒd’ЄЂ•—opˆZNEJAIPQL[][MLVVOOQH‡ЌИЕАИЅ‹‘zv{oМЖЪ‘ЋУЇ—…‡—ŸЊНm`j„‡ЄtZ‘Э—w–‚TNOQOIJGM`]cacYP4<;oшѕСЌАВžˆ‡zƒ•ИЏЋЂ–ЁЉ}EJWmˆЎЎk~ƒƒzt51]ˆ‚„ŠcFINQLTMJTbdd]gc\Ot`ШУО”Їžœ‘—•pwq™УЌŸ’œˆTbhuaw~}x„…‡™‰ep•gŸ™—phLEHIONNPLONSQSSLW||бЌœЁŸ’•œœŸŠ‹\…žЈЌ‘™jwcm‚‰|n{‰Ž–ŽouŠ‚–Ї‹…[WNWNO`eLOIEFOHW•ŸЉгŽ’˜‡—•”Š–™‰АЊЇ|u‡tkpr[}ИЄwtwˆ‘•žwt]„’Ї˜ЉOONQQM^d^WMUNO^T„ЃЕЃЃ›ЇŸž—ˆgMoЗЊЅЏЅЋ‹|oqxwƒ…Ѓ\tŒŒvIp™™hSOVn•цЉMLITUMZTYbb]TQE\–НТЊЁ–”ˆŽ…Œ‰a”ЃЌА›ž›‡‡wipkhqurvxx‹ЈА{zrŒjhŒa\OWWOOITWW^UPi`Сц‹ЅЄ™rLwnjh\‰Є‹ЉД˜Œ‰‰Ž”Žwxz|uzw‚Š”’™•u…xx‚‰]QPQY]OMFJJULM]wЛЗŠАейгzPg„vЁЄЋЂ|{ˆ‡…rjd|‚’Ѓoce|‚n|…ŠˆŠ‰‹vpnŽVIFNISJPENPUUGHxЅЇТЦМЦШЅ{c‡‰|ЏЁЇЋЁœˆ‚‹„wzp…~„k}…uvu…—•Œ…‡vU]^ZPSVFMHPH5[oS‘ЯЌЕЩЪО„Ž‡™ЎŠ‘Ђ™ЅŸЂ…ƒƒ]La]nuk‚‡—Š™ž•’Ž|‚‰›v]ahe]QSHHWSBL\‚СЋЁžЉЊЄ‰…m…‚‡‡Œ™ž’Œ…‘ˆ‰`ad`ditnz‰’•ЋЂ”~•И’‰œВVcaVVUQNQY[mGxышР’ŸЄЈВ|ˆ‰ƒ’–ž–ЈŽ‹ˆŠˆŒК›ESgˆvovxˆ’Ж|og^r{ЊЗЛzY^TSJMVTJZU@HнзеНЄЉ™„ŽŸœ‰‚ŽФЌin|vuƒЅ™ter‘ŸŽuaVkŠŸЊhox{z–‚–ЗcZYWULEUT]ZM-1žмЧŸЈЂ—}zЌ™—–ˆБщРqqw|~zˆ•jggm’’wrНŸž‡mx|x”{‡’‹JSW]OZag]amSUЃЮЯЇŽ‹Š›žАЎŠ]ЋЪ–dz}wzkcnnd`~ž‡‰vez‡ŒЉ|}{wiV@CtЁWTWZTPZib\c`‘ЇЈЈЃЄЄ™˜‰™Єœ•’ЕЕ„o}w‚~t}uzoaj‚Œ‘™˜‡ˆŒœ…rv‰TQnƒ…SQGQHLLTVHBiСВ™ЋВКЎ‹‚Œ˜Ї›žЂЂŠvv|mq~kr|m‚‚~t‡Ѓœ˜Ž|ŒžŠ…\Š™Љ˜xOSNJNQQPGPCœаТЏВБЌ›”™ЈЈЌЁЂЁ–Œ{‘™{p„w|•ˆ„•ˆЄ~moxЂ•ސЃЯŸemk„Štt‰CLGOWYYWS@H™гУФСЖЌЌЎ–˜ЅЇЈЅЃ””–Ўh{|nhqg™žuSPmoaj˜–•—™u‰‡•xznn|TOP[SNUVn[eЃЊЃЖДЅЉЌВЂЋЗВАБЇ™žЂ—z{ˆgjz’˜Zqo{uŽ”ŒŽ˜–~‘’w”Ј™‘…|Z]OMNQUISOvЋ™Ÿž•›”—ЁЌЛИВЄЈЃ•Ё™‰™ЉЦеЅ‘•nbup„БŸ”‹Ž›Ё˜˜—t…‡‰qqQqTTPMNLI9?]wŽ‹’›ЄЄŸАЎ{’–Žˆ|ŠŽ’ghmx‘‚moo…ЉŽt}|ƒrdcut{hYNow{‹‘ŠˆZPQSJJ>Brƒ˜••‘™ЈЉЌЈ„dpxvku‹Њ|hknŠm.MiŠЭ”ƒ~ƒ‡ˆžЎ{žŸ˜ŠwŠ•~‰™ЂЅ]SOTG8?Qk{˜˜Š{ЎЩаЦ‡‹ˆ|hw‰Ќ…ehikd`iq‚ŠƒŠz|„Š‹zŠ•„xhŒЋЄž›ŸOUTPC;EQq’ЋЊ•™•Љнࣘ–‚‰{gL@WNZogdeihwu‡„‚vepœЄ{‹Šƒ|‹œЉž›‰\uMAHAGj…ЅВ›”ЃЕДД•ƒptz‰rpW][Wuxqn{oju~xwrvupVr•ДЏЕЖŽ}ƒ‘Œ‘ƒŠbŒZ?E8QАЉЗ–œЊЊ€oАЉ’ƒˆ|…››”ƒppt}zqonuzz}ƒ‚…Ђ|tw…‹Šƒ„|r{Œ˜˜—”Œ^bC:@?Fw‘‘”ŸВУРЗЂЃВ‘~|njqa\dhdnr…‡x„…‰‹‰„„wn™•Š„ƒ|~‡{–ЗЛ>+7L`^Ёž—™ЃЌВЌ–Ÿ”z‚zppmnh^‡‰{dcnrtiŽ’‰{noaEo™ƒ‚‡|ŒŠ›АУсщ8>99[G3N|”ЊЗАЉЋ‰‚…‰’˜–Ž}„ŒŒ‰…hkp|„ƒ‡ЄНВŽ—‘oE`œ—…w~|q}”Ѓ•ЌРа407B4>BJ[tv”ЕЗРКœŽtu‰qa^~Ž™‘nInv‡…ŠˆЈЃ™ŠЂ—‹v‹„„ƒ‰‰ŒŠЁ”˜ЂЗИЊABHLBC<7)-3Zˆ}‡Ј™xp‚uqhSPW9Intq‚{qu{zrŽŒp{}v‚Œ…zrxŠŒ›ЂЅ›˜Ѓ”џ€gcjZ]ivƒ•!"U<3,q~cbtxn^j~z‡{gknbW`i|ƒ}wwzqqobiz—‘t‡}tg5@I7FC@ChYQZWkwi|G?w•z~aŽƒЈ–\Œ‰’nc\ZT^j]{{ez„}nqh^mƒoo~}ƒ{˜](;FHJHCA}tpj^ceV`uarxzCZ`v}{‹ƒŽjro``C9Sc\epzZYP^uoqitˆh|tƒ•ž~IF:HJNPIN}}rehbdai{‡‘t‰Œ|‡Ž‡…‘nwotpdpzre[WSj}ˆ|pvzxpqjVbЃ‘]EIM93P@@M‡wrogq[NbuhwwnhavЈЦЏ‡nw•…АЃ‹oamwuYU^hYNommw„„vvzvЁ~>&,#x‚”ubvbNQVxo{jGƒ—œ•–ŠYk]z‡‹UY[WAa^pp‚ŠŽƒi^a‹‚„‚‹oEB8%2&4(*4wEWY-o’wruav\?|’…‹˜‰”|nxvz‘eL`bEx™„[ti{ˆЃ‡kk‰–ˆomrki*"0(%^Š^U?khor~vj|x{‚‰w‰xU-Yeqngj[HWVVZSniotukn|qn‚…Ѓ`GHE9<7(2"47.(EE€ }N[Vkmp‰Š‚ekr„rdt‹nŒ]qnw‡d-?CAZSagqkh|{}ŒЛЛ?9L;0*5?C<9@A?>E^ibeaŠŠ‰~atƒ‡ƒ‹‚|„ˆ‹znhjxrj[‡‘r[\^^[evvtzŒœЄ–8(,$*71#%"*F[I;8`^nxrkjon}‚}‹rarމ}FZu~‹…r•xeih`ginkeLZq˜Љd<5$&!$+,#(UHHM`r…mkuq}~oopnnie[`Y]b[SSL‰„rmwwvz‚\^de‹qVQHH<<22%&0,C 2~mihjehd‚}|vvzi^\gkxn^ik‡‚}|}„zx‰Ÿvh{…‘‹SACa.Pai˜•pkg‰Њ„iq}m[Z\rwttƒ|vr|‚pWa|…‰ukp‡’ƒT>AGE@2#!#(+7e4i‹{w‚—wm\qOe”„^‘{rrqniepm`pЈŠxƒxdawœx|kgp‡zL*8AA?0)""1$CBNp|}v‚jraTv™‚ЁŸЕ‡aJPjwqbtm[@I}kpkputu}vx|{r‡dLNQ@IG4*#*2* -*TnŒ‰‡|nbUNMu’}ŠkoEQShz~xrVeer~}|}qw‘Š|no„Ѓg:4?AHN99;3<73+ #1:p|ŒŠƒrŠwU‡~Œ’А‘„Šmbu„zx{qv}‚}pqdj`grvqrcvƒU4?;CA)410:EA1509>c|‹~…wnbjx„ƒŠ‹Ž˜qQn[PFu‹}rwz|nmmaemadgumadenk,,95@4*$.41(-239UbŽœ‘wq}Ÿ…{…ŠŠg[^]89PhVcP^po}v\TQS\gi\ihruN##,3<3*$&2.&$%2c‡™‘Š\E‡‚|‹‘Žƒ}k|xo`egartnr„‚uadhninabw‘„Y;?3+0<;+(,,:;?;;1$0pcvxk]EFi„Š•™ˆƒœŽ{xzoacpwp{||xvvnigjb\TT?`O99;;C@><:552<7597+-@qjq~Ё‡ЅЎССЂŽЉta50:hz]WYZJ]ppvqhqz{}o{gezwdPE@JNQE.+!3?@>)$Qwvv–{’~ЇЭЮНЈ•‘}pdPnucqhSWdidprhp}‚‡q•…najTE4AEG<"%*+,.,.73W{|xrƒ–ЎЕЁž—…~pkY4Mb]\^b…™›ƒŠ‰‡Žƒ…œŽ^?&?L;414249211,)*d^+Bnqg]–А”ž›‘˜‡jtz–„…ЃЂ‚^uz‘Є…‡Ž–‡‚…‚rg‡wP:,&85875, "(& 1,IZkc^Zwƒ’‰…‡ˆ„}z{zƒ›’qx„v‡ˆup{…Œuurw~uwqr‘pC1*30?1&$$**"$4\p{^ap„‚z‡ˆ‡Š‰~rwxw{‡}nvO!F}wrekrwx‚”žtG35,,>FF<007,+,(HcNŠЈ‡aq˜—•ŠžœВkz„vjhuwvxwz‡…nmabooie{{vx”Žc>*&&2CB4+11)1,(!1IHŽЃƒr}ЈЏ›Š’žЂr}z{w}}u|ƒˆrjjbFP\iotb`dktz‹vH1;<)(+52(# ","((*"Gg›ƒ}…ˆЂТЌžž›|gjumkkie^mu…nnmkjWNWegmkuv……W5$84%)%#(,()(-!+?Pj‚~wM;’ЅЅœЊ•tcdgnnpmgz—}xwnor`brumjmqu}dG::@C:((9<:39722,,*5P7„™ŠЂЧБЂŸ›„k\HUnttpn|Š‘‹Š‰‰{LOWikcnu|u[8530(,<;-"!%&%GgUB‡‹‹Œ”тѓЭƒˆ{‚p]dh`atun‚‹‚uuƒЋƒVL`{‰wo{„™wU320355+08:-149:20;^o”ЂŠ~адЃƒvogdjmdhmzwg]gp{wƒ„Y4@k„q`ar~œ’^* (,BCBA:.8570,9>2*Qh]‰‹ec˜ЋЌ˜njtonnjik{{vrnjwxripmL\j`ehmuz@-.#.:9&,$&0+-1+OL87Œƒ›Ѕž–˜Њ™j[knnpgbetrwuxrrkmopVO\`bUhtˆe8.<735FI@91&%+*,3?8ITWŒАЈ™Žˆ’–„]Tddhjqz~trwv}noq\Zbih[VuŒcA1!%*@@BC?1(#&!2.;^ЅЧЧ™˜Џ”r]rwnkaeejhivvrkneVV^WdocSbpz|T!)4)$((27!")+(+)$!\S :kw›ЇЄЇЏ™vhaZcoghkkpw~}||p^Wb`Q\upgmu›gBJ<1+#%().,%%$09414Ce`H-S„‰›Ё‰•ž’~wgYdnrutkjoˆ‚}{d]^eopojijrnL)A:,.-3-(!&"*>UHB^T{„„uqrpv{re^[]]au{rpw}|wtiehimjkccpqO7&2HYh{ƒuqtoqtx{wtx||zQ?<7:45GIG7&.-)&"HJ*Ijw‡‘ЏЊ}mnq\C^xpb[WZ]THP]bikopx‚}qwzƒve94-(0-7>:1*""13, STT?>?Uƒƒ‹›В–}j`abpphpjYA@Tc^bkbZcjo|xu}–t@G>)*,++,.-%*"#*-%Fq‚wZOL]{~…‡ˆre^ju‰}xp[h\N[dkb^egcn}ztvuod}ŽZ &.*,001)%"%0-#)PeYQGTYz‚Ž•ˆk[SCTjЋЯЖ–‚omvir}vneqwu{pqpwЁЄm9$%230%(&" .]kZYFPY\~ˆ•ЈŠvpUEe‚–УУ‘\EZYr…‰udcnu{trt•‚[:"798$+0( %$+IHIOJBWbˆŠ’Ёuun^k|jor\B3Okqvvokckhnrtt‹›k;""!&18$*,9.*Zv`ELM^qm‡~wx}}zoc^[\hhbqTWjoƒˆ„‡ƒ{||ƒ–ЁqA-%)00,+-41-$:+"%IuxUEETgSS~ztv‚xqcehke^djikhhtwzt}~zvtwqtr—ЎuB@;210<8;7-%&.(#%CHJ>.$;^xv~{|naWijkmdknppnnrxuhcgiap{zwz|‹o3+;I93738@3:<7($9?,2eZ>gŒw|tVdgbZcoqwttobbhpdakonjkoor‹’m@.*?<3#0--GCHu…ke\ZddeД‚n~uJV[chbd^WdkgUHSYJ2^vca`n~…Ž|J$7733("25+#!*,,>VPB&^]^xЎxUoo`Y`iiadebe`\N9JkoaP`ehmqu‚‚zo> 1*-#",$$ +BOHA( 1SewcNkoghibiopijehYJU^hhdehorpot|‚m^E*529++1,*!"3P`FFS^V+LWYLQWbdYWYeprngehYVcorqtnca^eporuxk5..,40>490"#.,BcMBSWVaOHZdлЈЋЊЋЌЛФкм`VŽƒgАмККЉЛЭВДЛФЪаОМЖДААДЛУУ€GШЩНОМИЎЎЯулКРРУШ‹CHOMLQLAЏЏБЊЏКОМЪEvЩсЧФЧБджѓчаЈЭЫкОЏЉ—ЊЈЉЏМСБНЮНСМКЖВФДЦУСЦУФжv8CUQOUNBУСЛЗВЏЏœЌСВЖЪР}ЌКЦЩЧгжЯЦМЗВЎƒЄЈЈЊЋЕКДЁ–ЏЛСМЛЛРЦТУМРТеЩЊ]NAQS^ZOJЦТОМДБЋБЛгаШчрРЯеМСмзбдуСЕНЫЖАЧННКДЎЈЄЏЯСЛННСНИЕББЇчУtWWVMJdQMVЭШРЗКБЌЈЉДЏЧЧРЗЈРжяћэШЛЩлЭѓђнЛВКЛДЌЇЎЎБ™ЗВБЕОЧУММРОЮуЃM9;A<-+09ЦСрНЃЛЗВЏ•ЧСОЖ‹УлпмрузžЕАЧЯЪЅЃЏЅЋЏУКЪЦагЩЎЅЈЩЩ€ѓЧФЪЧЕ[VP:BEE>>BFФ•œЃa{ЪпНОКЛЕДЩчймйжзРЖЖОТмБ…ЅЈ™ЪызЅКФРЯцЯИБЭбЭШФЖЗ’>>A:BJ8C@FСЗЗКМННДЖЛННРУЛЦсмщЪЌЊЂАЃЋЅžИРШФЛЗАА€В•™ЊЖЮЩбеƘВЮћВ^P@AGMGAB@EEHNMHE@EŸрмЅЌЁЕКЛНУСЛМФШЭУТЮФЃx˜ЌДИИЛЊƒœЉЇ›”ЏКММƒФЦНРСЪжеƒ[QLFFLNHOJLOF7Š–’›ЎКМРТТШЛМНТШЭФСФрйРеЏКООЮЉ}ŽЄ•ЅЊЌЕИЗЖНЧУМСЮєх[GT<:BJQPONSUTMЅЉЊЏЌлыЪЧРКЕСШаЮЪЦЧЭЫШРЗЌЗУЮУЛЄднСИЗДД‘ЖСЪЧЧЯстЖM*,49:>GJGBJJM?ŽЂЁ^ЈБТРСНЛКРСЦЩЭЛЎНгЮЦ‰ЏЭЫйЮОмУОКЛНЛЛКИД™ЁОйдL@2?79;A@?<@>?A–‡ŠŒЇЋзНИЖЖЗМКЖЛЛКМДЏЋЊЊ€oЇЌЅегЭШЧЛОСУФЧЮЇЃАЌгаžqeOTMF:7?>78C<>4FFЎ~ЏнйТехЩВЉЖЄЉкжЭЇзОКИЛЖЏЖСБЇОёлЧНИЕДФмЮЩУМЖЫСnAALNF?>:4AEIOTUJIINЅРЫНЪРЖДМЦаЮШЯжнЗЁИЎ•’НеИКЛРФУОЗВЋЈЌЎДВЎЎЌЎКžC0FFMFC?54GЕАМЦДЏ„‡БЫглкЭбгтгОИОДЊЎЕИННЧЦРЕАВЕЗБЉЁœœ™БƒNFJPHEECCBEJIPQONLCVНСТЫэаЩачѓўњтЭлКЉwbuДЪАЋЅЅ•ŸЖРЛЕИНРЛОДТЌЅМРŠ^NZZVWNBAEBGNMFC4?HhРОТЪтЫмЭчћ§ћяркЪТЖ—ЖСЖЏЌ˜ЃЕЏЌОИИОУЧЧЕРлаʘЁqWQTSTF)57>CGHGE;STIvОЛЕЗСапђїхурЫЭЧНЏŸ~—ЊЌЇЊЫпнЪЯаЭЫЭгдЮЧЩркЋoHJ^OIC*B?@B?4NHhЂЊЉЊЇМРЛаЯЫЮЮЫЦСТЦУЪцхСФЭШбаЕИТЩкОММНОТОНБЪЇaE2>?@:CA>><:@@AA3;nЄСЪЌЅАУОСЧЧЯдбЮЯЯШЛМУФРСЪаЯМЎ™{•ЩРМИЗНСЦЦснЂ[GB>BFMOMHFCHGFF:5]žŸаюгЅВжзЭбблёУФЧЩШТНЛНМЛТУУдлЕЋЎДДВБЕКСНИеУ|P91:8EJIHE?FIILQNCZˆ”йшЮИНяєкк€kмщРУШЦФФТТФЩЧСНЗИЕ’ЅЁЈЏЌЏЌВИИКаЈ\EEF?;??@59@:AIHLGEcЎбЮЩЩЯрћэрмтЭЇЎНЛЗЛМДАДСЩТОЕВЕЉЂŸЈЎВЕКЛКЧСI8MBC<989748;CGNNGY{ЂАШФШФŒ~гырмжэнМБАЕЛСКДЇОлЫФТКМНЇЌВДДЗКЗМФЇhMMIFE?>>JHFGEFIHJCCn”ЫШРжТйўюмнлЩДœ–ЋЏКРОМТЮбЯЮЮЯкСŸЅЎБЕЖМТИƒB48EIGB@CJ@@BMUO;9zЖЮШдзЮОКћўсЩЕДБААДАЏЛСКЕЖКННФаЩЂ|БдРИЖЛУпУ~9+8?IPI@AIEJJO€TUBrЁЎ–еЮЪЈЏйшьйЉБЕЗИИЕБЖОТНИЗКИМНДКЕœЌЖВЌАЗСЮЊ]ACC@CFG?AEA@@AEQQ[ZŠЁ‰–бЪтщпмпщпВŸВКЖЏЏВЖЛСМННЛВЖИДЖЋЉЇЈЇžАРзЪŒL7LIGJNHIFFE@7@FNPM?x˜ЅЫшхмекйжЪЉЄВДДЕЖИКИИЗЖОНТМБАЌЌАЊЇЈКЯзЫЃeE:EEAHLOJB@>>BFGH;8bŒƒ„Ѓмё§мжйьжДЂДВЖБЌЇЏВВЗЛНОНАЉЄЇЃЄЊЎЊ‰ЃЕРСŒQBPCB9<@@;B@@AFPQPAWЄЈeG‚ЏТтшлнщнСЌЉЄЈЋВВЕИЛОРУЩТИЋЋЊЌЎБВДЎАЗзе‰]YMI@;;:>@?@>FIMOQQ{ЕВƒj–ТЦгпУЮдЫТНЕЉЄЌИРУТТМИНРЧШУАЋЏБВИЕВЏЏЖЎj;0BPOEABEG?>;<@EA.EzЉ•’˜™ДЫбЪАЋЋЕРУЗАЊЊЏАЗНФСЛОФЦНИЏЉЅЇЎЌБЊЇЉЗЉqI5FMPLLIGA?;@CGC5B[ƒ˜–•–{дждЮЏИИЕЈžЄ‘•ЏДДАИОО€ПТФТЛЕАЌЋЎЕЛРНКШС’^B3ELHBJPLA<>?@EMck|™”’ЃЂˆзлюнШКЕРЌ…˜‹СЎЊЂwƒŸЉМШКЗДЕБВИОРТРМЛКvTO@BFEBIICF@<>@?@8N}‡ZЋМЭезэшОДЖНЇ‰ЅТБАЋЈЄЁžŽЂЈЉЋДИИННЗИРЫР›U>AHFFABBFCBBA@B<%(T’Љ–…‡‹™ЦЩЮзђнУВКЕДЕЖДАЌЄЁЂЁЁ€ЂЇЊЈЌВМСРЛЗОмйN[PC@>>;:<@>8:@CEBFiБаМž˜ŠЃСФШЭЪЕЅžВИЯСФДЁЎŸ’ЈАЗЎААЊЉВИОРОЛЗЖМЧ~)),9:;>97>AB979@FJA`˜Дœ˜™˜˜ОШЮдрЯЗ›˜…ЊщўљнЧЖЕЗВННКДЖИНСЛИИОНрйF:3789::45>A>>;A7>Q—ДЏ›–™ЃФЩезчаЛЕ™~ЄНеѕ§жЄ”ЃЄЗНРЛЗЗКНСНЛБВМеД~M3.7@@A?>9>@CAA@GA]–ЃЅ›™ŸœЊЧЩЫааФКЛВœБТБДОЕ”ƒ•ЊФОМКЛИИЕККЕЛЯе—W;015?@?89>:@?EI41FŽРЇ—”ŸЇРДЦЦФУФЦШЛЏЅЇЌЈЉЎНЁЉАЕСУЦШФУТРРТФСЦжп›L;3A<:>:?<>@JGLE38eЊОœ˜›ЁЏ”—ФЧЧ€YШФМИВЋЌЌЉЋАВЏЌЎЎЕНККИНРНТРНЛЗейŠ[TNE?EIHB?ABEEGG>>J…‘’‚‡žОННФШРИБЅЊЇЇЋАБЕКИЕЕЗЗДЏЋЊЏЖИМОЛИТЫЂVFPVG@?IFAJMIE@ETZHhЎЩЂvV`b„ЏдФЪШЛЃЋЊЊЈЋЏВБИИДЎЏЎЋЉЅЉДВББДМУРдгž[ABLH@948C<4080>AMYmŠ–˜”…ЉЎЅМцС›ЖЎЅЄЋЏБЏЊЋЏЎЎЇžŸЇЇŸ‘ЇЋЋВЗНЛДИЌg09AF><7378950250(;eŽ›ŒŠzWcŠŸЊФЈВЏВЎЇЈЎДЖЕАБЉЁœЊАЎЈЇЌЎВЗЛЛŸТВ—iFJCCB?5075::51849Oœ‘—ŸЌvm‘ЊЄ”ЈЌЏЋЋЇЋБЗИЖВБЕЅЄЌДБЏЏЎЎЏББВЖЖН̘^7+BEA;ALGH1:5:>JdVa’Žn‚Wh„„jœБ’‡žЏ˜˜Œzgqxƒ™‹}’…Ž{n‚ЄЂНБŸЃ•nn|ЇaJGM@I1+2HA3‘qwˆ„‚zz‚Šˆ‡‡˜ŒŠЕБИpqkjmdke~ŽŠ‰p|zrv`]x„–——Ђc}›пЌa^GJNE;CBG<,^ŠŒ}‡„‡‰}q‰‹Œu™ВЭДˆriŽŽ„—ku’~tp|ovxqu}h’•ˆžz`qŒЗc-5AF?4>NIH40VŽЄ~uƒ‚~‡‚‘ˆŽgdЁЁ’‡„‰˜œ‰ƒ}~Ž•Ÿ—‰wƒv‡ŒƒƒˆˆЎ…rŽœ•T9AAHLNMIGFCM>9+1VjgYH5pxސƒ~ƒ‡ƒ’•™ƒwŠž—Yu’—Ї–„Ќ‚‚{|‚v`iˆЋС|QF@IL…}|}}|}vŒ‘Ž…zwzЁv~|™•˜‘ˆ”ŒŒЃБŽu”žЄiSVLYVQGPE:ACHCH;ETLSwŒŠ’•…nbŒЊ•КАЯЇt`e„Œ‚„‰„iNc•xv…„ƒŠ‰‘–‘”—waqoh]W[@GPEHJ;2@9F]~ЌЇЁ‹qjWd„ЌЇ˜Ѕ„}Sbh{~’‰Є…i~zƒ”‡•‹ŒЄŸˆ‚ЁНxNQ`Z[ZPMIOSNIGBIFS‰•Ѓ”Ž”qЂœ•ЉДЩЇ™—}h}—…ŠŽ…‹’—Œƒ~zzu}„‹‰mˆ–cFOTWO9ESUMHLFJkœ‰’ˆ~r—›œЁЁБˆqˆrjaŠЉŒŒŠ‹‘…‡vkzvoŠŠnuvƒ|>1GLLOI?>8;:JFLHUL;>d‚ЕМЈ‰‡Е˜™”ŸЂЋzxtqpU]{qkWt‹oimmo|{onvŠ‹b3*CJHLLFF4HII7ACMB4uœВЗЇg\Ё–ЅЅ›—’Š‚‹‰—‚pwvuŽŒ‰‘’—ƒp|~|wq‰Ё’mQOCLMHLIBHFEQPTMM?A‰~Š”|nWPr”ŸВЌ•œЁВЇŽ‹’}n}‰…‹’–œ”~{}xnjggh~jLMOZWTSTNIGUSQMSHJ>PƒŠ™ЖЃŠ–ДЧнйЕЇМˆqNF8>b~‡‰ŽЋ–ЂЗхшпТЏЄ–Œ…k”Š}…xgj{w„„~ƒ‘›—‡’ЋƒrzhYY€l\]S3HB34FHToxuqrˆ‰Є™Ђž’…‰Œ’›ВД‘Ž™’Ѓ›ˆ…’˜Ѕ‚ƒ‚‰‹‡‡‚ЂY@8ENQPGH<>@>1H\vЈ›’˜ЂРнТЊВЖ•nˆ}}‰zq|ˆ”„|ƒxu`jnvx~‰‰‘pGGOCIGHFA9>@VEB28U|hOЂЇŸЃњўс’Š•wp|}~|„Š„—Ё–‡„”Шœnbu”Ќ‹‹›А‘iEGJSNSSILJF4HOQPG:3QŠЇЗ’ŽшюИ—…|~v~{wt‘px~‡’ŽžhQHЄ…ƒx…›Дžh>(4BLVUUQLJMOMJSNG5IqpiЇЃœ~xЋЦУЎ{xŠ…„zƒŽ‰…„}v…ŽŒƒ}‚du}wux„Šž‰UFFMHPOSL?>52?IGAGMJ^dTU›ЕЛБЌЏСЊ}kƒƒ{|{‡ˆ…‡……ˆ~‚qntpobx‰ЊŸuF>NMPWV\VMFH;GCHFJ;1U`dk—ФФВЅЇЉЋ–rour}‚‚‡‰‚‚‡‰Ž‚…„zpz„pgЇЉ˜vQ@;HLJOV\WJ891778<22H]IFkВйпЕЇЎЩЌj‚}vqu‚}‡Ž„…{gmkbxˆ}bp‹•kFEPFHBFFNJF<@IJIIE8Bqj7M~ВФНУТЏŽvqtqtx„{‚ˆ‘Œ‘•’…uuwxwwŠ…~‚ŒЊЎtYb\OLC>?IJL9FJLJJEHZ…wWAe˜ЁИР›ЌБЃ‘Ž{tu{‰•‡‚}‚œœ•zqux‚ƒ…{ƒˆ~V9+EVQOBNMIN:>B@?G4@au^[hh‹Ÿ›„‡ƒ{…‹ƒq{~vŠŠƒŠ‘”’Šƒ~|vrwzxvwƒaJ;S[^U[QMEJABHIE5*>Vecd[LЅЇЇ›‰…|rmk]arz~vŠŒ‹Ž”ŽŒzrv…ˆŒ‹‰œ’x]A+PQUOYUOJHBFCHTW]ioc^okQЕЗЫ؎~ˆ{]c`’…~z^TShr‡”ƒˆ‰…‡~‹ŽŒˆ’•kTSMSPZYZVJPJF<:E@+2[aS7Tv…›ЇЏФР‹{~ƒvWvƒ|utpqrkZezx|~}…‹…‹˜”xGFHPLNUTSFEAA@F;4.\cZMJNe›•ЃЗЮА”}urw‚}‚ka]jwvu{rmr{~А‹ЈЏ…N`UFCHLICFEHA@CC@EEQ‚–„g^VhŒ•žЄЃŽ{o}ŠŸŽ…o|ogqv~}|u~Œˆ’‹‹„uŠžg());?AG?GLOMI4;EIQB?evn`]abŠ–ЅЋЏЂki[a}НщЮЎ~}‚vŠŽ‹‹•”ށ‰„‹МТO@>5JINFCGCH>2?:88Or~upcbgk”˜ЁЎСЁ„eNrЅйлЋqbdkƒ—˜‹~ˆ”‹‚ƒ—Ј•rP5-8AHSOLEIFJ>7878Jbc]bYadw’”˜ЈЁ–‚}~r}’x}…wWWexŒŠŒ‰„‚|x}ƒЁЌuLF7F?GJJHBB7EHHA,3Fr…n^\dt‚|––ސ•’ށvjmwxtt„cm~‘–œ—˜˜’•’Œ—‘ЇЕˆM>?ICNHOGPPMPNA7(9UŒŠcYZcz]aŽ”–ށzvzxuz}{zz~‚‹ŠˆˆŽ‹Ž‡Œ„ƒЉЦˆSQQSJNOVNPJLEH?13+4^`YUHJNeŠ„Ž˜™•…|kwqvzzz}}…vxz}|ƒ‰’Œ„œ|J?ZgUISOTTZQOBJCOUHL{oHGB$*#$&4JWdYN?*-Qbvqgƒ|z{xz‚|xti]eq}|wtv~ƒˆ„‹•~mUFHZETCGFABF27<152?bdY[ion?C]qj^gpx|pwo{~„~|{~qirƒ~uxxн~…ŠŽ{S<.IHJLUQTUTFECGLGTq^Sbhi{i[`uџ€цFIIJA+5<59BJ?‚˜ƒipkMijT8+3(8*45;?1&&)((##)>9)5B<:+9BC<+!HLMMI5;AkZYc|ž’tz™‰x~ŒnWLP;2?1,03:!*"$3(+27(.,$+<;)*POBGU-EkUAC^}‚rZ[do…ˆr…Љ˜ŠV5>HU?:. +>1;3*)9@BCB9?7&%!toI+&#?WGJwhd{zgjˆptuqvum]w‡mV^mmE5?2&!9[A8(+(Q<%0JI9)&1*$,.""$@GV‚Ђ‚kh`]einppo„nMYrba’UMVSL2I@J;GE?PjNM34*#;Y<3<:@C?.ETO8M…~jmon‡bYikx~ubhЂЎxi]qw;EGP^[Lb‚pun]S^]”›YLQEL\SB :7&,CLBGŽŸm]WecUmunru{…m^`Œ•ˆЈЛƒa]INP\hQa[SGYen]JojƒYUVVz…a[AT@AA;GQOHBЅž]cn`c]bmqiv}vbYj…k|Œ•™‡TexrhVYccGYgTc^YVJN[„™Œ”ibkmN8HE5@UF>dpO(Qa^iianwcebWVMwЅƒ{„Š—‡|ƒ‹nhccz„|qiYa^j™˜‚‰‚ˆ`QQtT>I:7:chjgmbQS!IGJC^‚\vДЋLY\bgbcVbPScSUƒb\pˆ~}rikmmjv‘tCTYL>:eed\YM;eg[^T<7:\@NMN?.eЎЌ’||}troggkvq[akchq{ЄЉ{jb^`T[gjordMQNQ`cc]YQavTUWoW]jk(JLECQƒcNjtkrpcL^{’‘•‰PLiz˜ЉЅР‘ˆ‰ZGjppnv{mzvMH^cmeknjbmphZVaaj,8>#2ƒЅž}p]d~\NNqwibhg`?iv{™ЋЊqqzLNUrŒnOaŒtv|hVOAQeenpk[>JFTO*0AASz”‹|x|hZH:Gav}u}n`ctvo‰ŸŸx‹‰‹^Ecx„c@?M^YYVZZUrm{`BP\kdn{gdxLgE\hdaiokecTFFOM!CgrgbcVF\U\c]S2@h|gOnrŠ}z…‘™–{`ZVccQBZ\NM)-o‘„x‡b\ggm‰uOTWSm?ohc\rpqi^TdnkiYg‰zŒ}\YZUYb`{’nn|rddrˆ}pWn‡dG`mJ3\Œ‡uzdELPScENTmpqmqicgjomuccjcSZUSCiŽŽŠЉƒ‹”„ntŠ‹˜Јž•xMQYYUML]qgƒcAJaTU\eYM[\kdhe[cionijhbmm[WN^SOvrœЈdWb]E9CEE€)(FTMQZJM7JajvuU,;PSWT[\xbGMnromhcjh\YO>MZcahebYgouŒДЄzjci]QWhunLp’–qG3@?*Hgojaoia^gqrn[J|vng^gu~uhŠ”tgh`gbcaOGqЅƒxmkcIS`gaYOI^cQZrtz^T]Y^`nwunpgqqu[iowrmodiqtnq}qpe^jrbYVhŽЁ„edup\I>FJH][7B4La`wurrti`aitrwn\\mpc[eihqwo`ukhdgjWVIYoop„‰ŒoHM^aU@INJMZ\QB3,,Gqumtvnka[]Wgmd^ahdjh[Vguxhmojx{{РaT`Pi~„‡Š|ok\YNCMYWSYchF^iw~dV\[Y}|b\ZYj^bkpqNO]ouokgkc^dj|„xjagg€–nqqu…ˆЄ‹x{mNTq…OE[i\Qaig^WMC3:(`omutpmprpxtteZpzuYE^xobQTdŒ‘uonph[be[\]ntxwmggcr‚ŒˆkJLZSNHMO|˜•bqrp~˜—]t~p[[hnkjjeadecaZMYmqea[S[gkmqqr„[E+Aiid`ZnxtkQMcƒ•ŠbQ^]r‘—Ždbcdhw|tdZ^hppndci^jxnb]a[Zbcmrowxb*1LLbkb]QVcnov~cjmmdaNm‡ƒŽggbgijaVMO^pe`^dchnpv}qe\igiirumnomYaia9HZQ3UЁБИВ\[dY[b^a]WAIIhicjmmq{~}wngn{{j[[^egeWUH>;Tjaagj^CBLTj`\ZamƒЃЈАФЩЯGNVTMSNHOBUUVЧчЦЕАЂŠŽpJMBWIPQLIOQIA0143;BFNGBAGOO€^MLMIIHQMEFC:E0IYN4HHJMNCBJPQYZTLCA?<qJ<%#@A5MbmЩУРДАЗКМУОНЛЧЦОЕ‘ŸЖеЁ‘ОюйЇ—Œ|kpxugdaZtŒrhb\N3@OJAFBHGHGLJLLJJMJI?B<)Yige[^L[wnutˆЌ™‹‹Д™ˆ‰Ÿ‡i]gSLCABLOO25<;4<>8CL428C8C:MHH5!VVNPB788imY`aN1Y„iQ^w›Ѓ‘zmmtŠ—ЅŒФЉ••hUY[aMSJ875A+M[H5GNEJ;AEUOTVV[QIH@<aPCF7Pog`…Ђo~”—{{›‰”Š‘ˆ‡p•™~`o‡ƒWIMH4CQpUQH@9gZIIb]S:;LIF728HH4*1>>T]oŽБ{{~ƒ‡–‹ˆ’•ˆig…Ёqm’ДЄqcte[EWLYPYUBcwg`TPC,Op^I7$@MQ[]SNQjhH]‘—ށ„{xœ~|…‡Œ•ŒzzЉТЧwjz‡PS]binatŒ{‘ƒr`itЂЇ\VbPgzeW*0FENJHTWdMYЁО|mu}rowˆ~„…‘ŠjjЊЈœОШ‘onacbu{num]gkwxk[Šuœe\ak–|nUgIOLL[\ea.JЛАq{{€ rpz|~ƒ”ug{’|ˆžЅЉ”\vˆ{ko{r`n|qtkit^]j–ЎЂЌ…wZ7T]UMVn`L|Šc2\iqxrzƒ{{}ng„Е›…Ž•ЁЊ–‘•œЃxt›–‹zqzvˆЌЉ™œˆukk‰g,\[\NOOSQdzvednu}{j]it„„|w]i–œt—ЌМЅŠt•Ѓ•jŠx|Š‚kjkgejbPVdŽŒ‡eYU%HpT;Cgpƒ‹}~rgimqgc[o‡‰wddwp‹ЇЇ{ZHgp]{„‚ˆ…meccaVbaCJrzz|}uc`2HNiwzgЂЄ‰Ѓœjzwviq‘Јž„|x{–™’”Šzh`Utwi\[”Ž‹„|zrnpmnh{|twkohO‚LVccOLT™Љ™ŒŽŠ‰‰‡”ЩВ‡ozx‡‹‘™…dŽŸhQx‡}pqd]Uah\^P\w|T&-[]gWttЪМŸ\iru|vmqxbd|ah’xw„˜ˆŒƒ}~x‚‡Ќ‰bit`QJuxnakQ5I~mqnUNSoWkeeYGtЩОЌŒŠŽˆzrx„‹wnuz|~Œ‰ŸБД„zonir|‰Š|b^]ghttxpcr‰nkhz`kx|8`bYUgЅ•xaw‚~ˆtguЅЅЇ›ii˜ЋРЛлЁŽœjZƒƒ~ƒ~ŒbViv{~~‚}}{ƒwhbmx{GLJ5G›ЛБ|~|‰hjg~‡}q{{qP‚ŒŽЁЅСР‚‰cbg‹Ђ{`iŸ‹ˆŒwkinev~‚eF\Yie@QOS^ƒ•А–‰tu~Š|j‰’ž›’rWi‚ЇЪѓчбЪЄ‹VWhox@?dœЇ”‡ˆ‚…ˆz||…‰’z^aY`enijNp˜’ˆ}tt}qJa–’aq’ЖУОЗЃwg…ИЃqa…^QjhavYxˆ˜‘ƒ•Œxchg‚vqwk`x{|xjgO[‰”‘•‹…}ƒ‡™”™˜–Є—…|ЈЛОеЎcbqn^Za]Tˆhu‰tv|ZBIhŠwnprxx}}~S`4]|‡ž™‚œД|`kuzŽŠ|co|jx‹Фа’hoƒ…ŠtЈЅ‰rkvqonmjGVSomabn{~{{uzwrFTg–ЋЂ‘”{uaOVz‹ˆ–rr…Ž„—ЛВˆžЃžeSo‰qFYrtnnmipi~zŒqOUb|}~‰Žvu‰\Q}Ё•Ž‹ˆœ—ЌgaQœ”ŠŸ{Imt”œЃЁЋгЕ‡|uwa]|znh[cen^w|‰’px|w|~‹YMGEE@nŒˆre^kŒ‹{do{c`‚ЅЇ~VdpkŽЌЎЋЋ€цž‡‚~v{ƒq`dgegc[]uZo{ut|„|{vaJ\b`?Hq„rrtmhjoptk]MZ~•}bx{ˆŠЉЃЌЋЄ‰rmozjBMrk\WJ<Є—‡•htw~™‚^^hexO}‡rz‰~ketƒƒ|iwЃŽЂˆigp`arz‰Ÿž}}Š}}{ˆЉ•~oˆ”qYz|U?Lo™Ÿ–Љq]cabv[ke‚}„ˆ„tn{‚}}qr~|mnkcYЂŸŸИЂ™ЅЈ—‰‹ЁЅОБЄbarpkc[a‚|Ž™nS]vmikzkbuktw}xttwz}|}pqrjdke;\aj‚SUSZr{‡„ˆ‚~}}Šˆ‡}k‰Œk]tŒth\^rЇБЁ‚„…‚{mpjhx…ˆŠ‡vzƒ‰‹Ÿ—{W^ec^bWC\e‚”ƒ„ޑЂtp‰‹{‚ˆ’dkŠ›…tnh~Œp|wtzwrtoiu‹…•–„‡‰‚‡ƒ‚\agtkhoru{|qdzœ‹‚Ž„’’z’œŽZrŽ‚zxˆ‚~wrpr{ƒŠzui„’’Ї‰Š{wzwzkTNYUeaYOT`{…~qum‡‰ƒ|`ONP8Yx‘abm„…ƒpwwqeorz{uwŽœЉВЄ–Ž•Ÿ‡cijnz}pjmwk[ZaqnqpjccprdOHIBOA[wŠvqw|„zru…ƒv|xz}}wƒЄЂЅ••‚qvuq{}nnv~odjtjt{qo]MYuxciŠŒmSG]z”enw~ztvƒ…‚ƒwttxxzxrz›ŸЅЄœ–Šrmp|z|`^irnmmux{˜ŸЋxutv‡–{Y`qr…‡w~„utrw{ˆ•Ђ‘}|owБдЄŽЂ›™‹zt‡‘”jBPSTu}oZJSn~‚ˆkZ`gi@(Iqq…›bu‡Œƒ‚}r]Up’‡Š„}|Š…‡ЄЂ–—œ‘}ƒ—{{‹dN[qvb}‹hmp|w…\`][a[P?Hdhp…ž]t„ˆd`daTjŠˆrr‚‚€ДЏШДНc[VU[‰Žk?SSuˆ{–ЊŽ{vwwwurn{iO8JuŒ›Аb~}Š™e`ajp~ƒ~vjj`JqЄЏЋЏˆZJap‚|zw{~trmˆ–œmw}{}utvxj]CUH>a‰ЇН’Ÿ››‹mnwtvxwvvtruqpx›И›’ˆk\Qbz‡xz{xout‘Š‚x‚{tx|vrqqm\SU[UZh„ЏФn„”ЎŽemttn€Ьrpuvrrp`˜•Œ…ˆxrii^q‡Œ‡}|vh[W`\bnr‡ŒŒbidk„‰]PV\p’Цж„˜’˜kxw{~xp`ktztu`d~ŠŠ„}}~tvƒЁЂ•Œˆ~Œ…\ITedqz~ŠŒSPg’ЎВ”zˆ‚‘ДАjŽŒ…nqp|x|zwrwvxtdZo„…z~nur{zzƒ—ЁnT>9Nuvutu„Žˆ|[^užЂ—o\qp…ЁЇЅumpov‹‘‰wjiv{{t{{|ˆ|prrw€њv~~‚Œ’q@-3Ndbjtupgnz„Œv{wvqrk}—–Ђvzwvu}oh`bp{w{qtv}~~…Œˆ}tx}{zˆŠˆ‚‚|np{rNYdhZckou~„‡ˆ‡zwqpm^–›Ќ‡Œwuz‰‘…de‚|woir{xpr|…‹Œ~tvuw‚„|nbgckkiorwx|zx{uu}ƒ‡o\nk~‰ДущЯ„u|„‹Š‰‹…vumi}‰‰„‹‡ˆ‰„~qjkq|‚~vjZW[be\Y`koz‡ƒnqnor|e]?bw‚‰•АЊŽ~zvoqjtx‚vvpjhot|‚„„‹‹Є|wrrkh]^e`]\dp|tdzwahnqwqpkjcg`cn‰{i}ŒŽ™x{~{nhirxzhhkmjmtƒ……ˆˆ‡h•М˜ukmjk\akqa}ˆ~~twx}tuu€иd`jrkhm’ВДx{{x{ommidcgmkgkv|}rruzqb’Б–Š…rmd\ivrptpjuw|uppq`dtwiciwvhYŽгУ~}{w|qxnjdgcokjt|‡…ˆ—aWevr{wwnjg~”ƒrmo}{ƒx~trkcZaoxmpƒ„…r›ЋЄ{z}z}‰ˆƒ{zxwiktwx„Š‹‰~rp|}‚ƒ~i`m|{ocik’{ppd][aurmei‡›ЄžЃ—›rvmmr}|zx‡vpmˆˆƒ‰‹‘ˆƒ}xnw}ˆŠ‰ƒƒutouqihmww‡ŽŸƒgWQ[qvuecPG\‘БЦЫТonmqnz{rmg]YTx}|x‚‡…Ž‡|w}އvvqxwtmge^Mc~|x~xiNQYn{oot~”АИЗгкџ€s$.<3%;3;**,!*&9;;3)"&40*31),"-.+3C@.41$7+"1&*99#2@C&(-!%3*5C5@0#%?A%72".78$,-9<;A>2*+15-*0<422%%#)13.0.+#1:EC90%28:3,+*8?SbmN85IF;3?FTTOE@?<74I<,11,2`M(37.5);:CIEAHBAOQW<@MJGIGJLE@FE44*4;BEOLIFFMA+*@]MIISVQ?*)%amh{`QA7MZYZ]o^B4SNL7(+1.B3&Ac`ZM3@)(4?>EB;FHB9-%7C>+?HPO8@A)JHzgj‚uto\ezwn’…o…vˆepr‘ŒF0]t{|Ї’SL|zJF>QEF0845AT7+Aec[Wgvtp{Љ„|žЅЁЇЅЇАЈЈИ˜zz…ƒƒ„~ŒŽ”‘‘’AZ~}}x|w{kžЕЎЉЂœ|mecdZE12IZimjprkk[vŒ‹—Ÿ—•ЎЭФ‚Ut”‹|~ЄЅœŽŒ”MYŠ|tv~v{™™ƒx˜d{‰ud[^m‚j\45;S`rp„Ё˜™’•Њ‘‡‚}~ŠЏ•„––Š‘‰Œ”oeZqrq}•–•ˆˆ‘ˆvx{…uhnwn[WUP>\iƒЂˆ~’„”™‡ŒŽ”˜›•kuxu{‰ЌЎЅ™—މ‚‚v‚putqt‚„ˆ‚|„‡|z|jYTetkMZYTPvpŒНЅ—›œ–‘‰‹ЂТЏƒ‹‰‰{‚—–—’މ‹Œ‡w{„‚kvƒ‡ƒz‚z~}‚w}k`om^heTHbw‚…ˆ‹‘‚Œ‘‹Œ‘™ЌИКЅrw}ˆux„ŒŠ|t…}}Š}}xvrx‹‡{zzƒ|urnnkgLAFPMIctxwzv~{ƒqŒŽŽ‘•‰mb^ioxzuor…—•…xuzId„‹‹‡”ŒŠpw~xhhuv{tjuk^OSLV`ohvzizŠŠŽ‹ЃРЅ”›Œxndh‚˜”‡}z~Œˆ~~{vŒ•ƒ‚›™›zokpkkgmrqopgZ]SNYeZ[owq|…‹•‹m––‚‡„‚ujSk‹‘‡„ˆ˜–ˆ|”ЉŒŠŠƒ~tqui`drqimgc][\tr^ijW[`|ˆ˜~ƒ’™˜‹ŒŠz„{rpЂŸ‹{{x}ˆƒWn…‹ˆ‰ˆ‰{rnhhmjrwwnqort{|‰xikvmix‚„ˆŒ‰oŸЮЎ”–’‹‹‘‘‡Ѓ˜‘~wz}‹•Œh^w…‹ˆ‚}„’hb^jkj|uokgNЅ˜oieeozpe^w„‡m•НДЅž˜˜Œ„’Œ‚{‡‹”‰Š™ž”Šacwƒƒ…˜Ё’vdgipjSZQbŽ‹{oj[MGZV`jtx{pSp’ЁŽ‚ƒ……„ƒƒz}„…—ЇЁŽ„ˆœž™{w~…„|~„…ˆuu€8xrnjZOetZdpxVH^pxxqrricg›•Œ‰‚xz~{voww~…‡ˆ•™ЉМЗ›xˆƒ{~‚xmu„‰xtroi^V[Q7IMpˆtjb~…zvtu|~zƒ”‘’Œ‰ЈР›pnqv{„‰‚ˆ›œ–‘nvp…Œ„zuqhv‰Œ}mnqnij`]]QBO[aNQrbeov}|nu”Їˆ‹””Švƒƒ……ŠŒ•‘žЎЉW`}˜–Št|‚Ž–Œ}xpbbgeZWQ>HQ[WUW\[hqv}Ёi…ЌЈ’ŽЄЎЛРЎ|xw……‡oGNtxju{‹‡…‡~xƒ”‘„vqjqje`ee^W[N-bopjpuv\r’ЄЏЗСДЇŸ’p‡Œˆ}Œ•——ŽcVƒ‰Šˆ{‘Ѓ‘ˆunnЇ~……‚i]qm\NSgmhg\G;@`wp{xzvwrmjƒ’‰—œЅ•‹ƒ’Œ—ЄЋ•ƒzx‚Љ”‰ˆ˜—Žuurw‡”•tn[QIE\`bg`^[Zrovƒƒ€?|ou}ƒ„Šƒ}ƒ‹•~~ŠЅЄ•‰‹ˆƒ~~‡v~ž•ƒmqurr|‡ui]E-JOWWTLPFFPWZ`\^Ÿ{qxz‚‡Š˜ЊЊ™‡rmp‡›‘{unmjhkbiz’Š}|zrt‹„g}ˆrdcbg[JPVZOLV[`Q>L}ˆpjx‚ƒ‡uˆДЌ›xtq}ŠŽ{qnmq‰ƒNa|ЕЮЇpjki^mxzjbge`aWNLEMSZ\YN]aY[]hju{„ˆƒ}umИЕ’|}„Œ”‹xvutržuНЌ”S`mjgiqojemwcFBNQTNIJLU]``iiad‡‹‡~ƒ…zxwk…„wv„ŠŠ~|x|‚Ž‘ƒƒ„’А•jjimnt|pYanœŠP&-)A*A\p…jYcahvv€‡~‡‡Ž™‘ƒ}~}xtxrv‚ˆŽŒ‰}t‡‚‹•މtqvz~ŠИžc[PWqqcng[OUkmkmi`Ypnz„„|qwwx‚…‚{Šƒutvƒ„‰…~‚ƒ|ov…IuЁŽzmi{‹‡u‚qUWPFF\TQN?FJS\\`cZb‡Љ‡ˆŽ‰‚‡’’‡„‚tnmmgk|…‡‡Œ•œ‰‚Z„uVJbw}zqjj]^M9NSVeiheb[hbVONZpuu}u~…}„ˆ„…~~qmimhu‚„„‰˜Ё‹‡…z~ŠА’qmnvuqa\YTTYSJTUPbirmmni[VO`gx‚umivˆŒŒ‡„~{x‰ˆzvgcƒ…‡‡zutŒ‹{pv‚„jZeigcWSZZTUUac^ZZnthgn‚{xrekv‚‚ˆ‰‰ˆ‚{w}}‰‘Žˆ‚vnwƒŽ—ˆ‚|~‚‹Šw}„xob[ZPEMOYZO?\dkpdcggtŒ’}zƒƒ|w‚ˆˆ€:|xwrƒ‰‡ŽŠ‰ˆ•—‘Šx—’™ž•ƒ}vqtqx}voiW?UNF.FemwmbZYamtruwu{xtq}wz}}xuzuˆw‚|~…‘’›•ƒvttqmgopphcVZVI5$ %c‚oukjpxzuogj{…‚z~‚zr…‹Œ{{~z~|{okrx„Š•œ™…qmcprthgke`bcNC^gTYSO\tpkc^M|~~root|}‰–’ƒwx‡„||}}z•}ajtŠŒ—ž”Š‚~}‰‘’‹zvzzwrWd^d`[ioqzvq]SQuŽ‚nijt…ŠŠ‚vt|ˆ„…ŠˆŽ–—œ›}j{|{ƒ”›Ÿ‘ˆ‚ƒƒ‹‡{mgjmpuxvnucTJZanqpmp„Œ‰Šikt~‡ˆutrxƒ‡‡’œ™•””œ•}zz|ƒЉЁ›‘‹‰~~|vptqkigeeainY\`ZT\hgen}}u^JSoŒŠˆŽztjuƒƒŒ—‘‡Š•ž˜‰~…‡ˆŒ’ˆ}…‚uhaanvt`SUWP?CGFMewvijvuopmb}ЉЄЂronirx„ˆˆ‚Š•Ÿ˜‹ˆœž”މЋ’Žƒx‡~whbebjm^^kN9,1AYrtphjinw~~vt~”™’˜{xxz~…‹Šƒ…–ЄœŒœ—”–˜œž•ŒwpddacdigjgL1AMdrhheb`k{‡~tpnt{{€Uropx|„ƒ„‚~‚ˆ’—’ŒŽ‡Š—ЂžЄ‘„„}~ppmb^YY]L+ (!COdpmjkrztpww{}}|xwquwv|ƒ‹‰ˆŽ”ЁЊЁŒ{ƒ’”‘–‘„…Šƒ„ng`hha^mpbOEJYVJLdpnnvuruƒŒˆ‚ˆ……pqjntx{„ŒŒ‡ˆ‘”•™’މ‰‹Š˜Ёœ‘‡ˆƒ}UZbhh`[WWM#0$!?FP`cqvpoiqz{Š˜™Їˆtv|~}}~ww‚|„ŠŒ‹‹‰Ё‘‘–˜›…ƒ|pehjgd`PNB(7TNdvkozntxvrnehvŽ”›‘‡zvv}„‡v|ŠŽ‘…Ž‰„ƒ„МЕЩтхьЭ|mbEAG^]`]`\C?OZo}tmw}tvx{phk~™Ž‰~wtt…Ї”ЁwŠ•‘™žŸžЄœœŸя70:EGEBAF<N1FMW@;<<>HHаIG?JINSEEGPNIE@:7@E@@CLFEA<>:<>AINPT?.BC>FCGCAGEE€‹A<89@AFHB>BJIIFIOU]\iQFHAHHBE<B:ALPNGHEGBNLJIJJQQNQ]|ˆdLOYYPIFWY[ZVQMJHN]\IGH>Er`MNOQOUQVZVTT[QMPPTQPIGNOLHININQOMJJQQHIQ][WOW]b\\YOW[`^Y@WbgjYSTFHOYVMS[cedPEOaWUSYdVMW[[UWTSV\[d^JTIJOPW^`YUZYNI898TraVYei]POHHЌБЊЇ—ƒx}‡‡x~’|W;WukaIIFGSZ4:GH`}uojVV>GFGMZJG9?9@HG:C9C>9HF?N?PYUOPA@<@@FGE8JFMHZFN:MS\:B.@JQAFAL?HUVWNI?MPPJ839BGIACLQA99FH>:QOOSWF3HNNMOQBIJSIF?B:BGLFQ?BCFIFHLSZkdcNCIJB@AAFBEJSECJUEIJT>8-8FQV\YQG>NNTVQIOMJO9EFIF5M|4BMSPHNJOUYZELHLIQOOAE::GNLLGJ:EHU^{ŒhIN[\SOQ`jk`^ZVY\PdVTMUHSn;GGPPTTQS\ZU\VZUVNMMGJLUCEC?9[e`]rnmYPNCt‰ŠvdVNZgbiq‚rI2Ud`UJ7?AGT33BAP|reaQM@?@Tc^TZ\bPOULL[UWU^jcOTQLZaz‚–„„zn}›„„Є—ˆ™‹’œ™k|›–JFv‚ˆ•КЈe]‘Œb^S[[I€ЁCPUtTFOkpc]dkZaZVaw}rot}މ„’Ћ”q™КЖj^mmvn‹z•ŠC@zŸ‹ЅЇ——…}ŸЅЃЇ‘xoЈ–~z|‘|ƒЊЂxw}dkk]ur˜›˜™ЄЉЊЉ”[‚ƒ}ˆ…cdoSdtЂŽˆŒˆˆ’ŽЛНИ™ЊЈЅЩїэЯбЧМЈЅЩдМŸŠSW[\dvi‡–›˜•—›•ЌбЗ›|wƒwtH)[‰Ђ}|Љ|‡‡„‡‚’•ЁЂЅЂЌЋrŒееККВВЋЄЌ–„ŸžwNq„q|ƒ‚|~‰Š‚‡ž˜ƒrx‹–œ~qzno„d|•„Š’Œ‡ВАЅ—ЋЕДБЊЊŽ—ЁАЋВЊ˜˜Ђ™”iƒ–Œ}~ƒ˜›ƒœŽ…‹‚‚„ˆ‘’Ї›exvun>wЎ”Œ‡Š–Ž‹•’‚ސ•ЂЗА„‡ЄЈЗЮЛЎЃЁЃž‡…ƒxpid…Ž’•ЁВЕЂЊЋ—„’ނޖ–‹qxwzƒeЃЅŒ’’•–‘˜Є›”žžЂ’u…{~–ЂВЦЦЂЂЉŸЁ’|vuoqh’ЈЇЉЁŸ™ЁЋВЈ—’–Ђ•˜Ÿoonw}”‡‘•›ˆЇВЋž˜ЉЌЕŸŒ”››~||x–—žz{…„z•ЅЃЅАРФЫ”…ƒ`ekHTvzkix…‚„…˜™’ЃАДКСРдЧОЫЎ‰’•‘Œ–œ™œž[p”•ŽŠ‹ˆ…xВШЛОЕДЂ”‚tunwb:BWnx~„‚|uŒŸœЅЌЗАЈБИСсдhˆœЌŽЄЖБŸЎWi˜›•„‚”„ƒЉЎžƒЌœv…žŒ‚xiu‰qgS>Pdo…›РЎЄЋВЋЋЌМЋŸБ‘Œ–ЉФЎ™ЇЁ™œ™Њz{pƒ|„’ЊЋЇ—ЂЁ–ŒŒ€кЂ‹}|Š~poncFoz˜О˜—ЋžЏЋЈŸЃЇЎЏБЊzˆ‰ˆ‹ЇЩЧЛВБЋЅ›”—˜…„‡‡ƒ—œŒ””’‘Švhk‚{^oe^e‰žЯЪИАДЏŸЇЉЈЄБФыУœЂ”ЖЎБЊЉžЂЄЈ‡’™œˆ‹œœ•–‘Š‹•’ŽŽvuzwt{uk[zŒ—›ЅЄЈЄ‘˜АЌЇЅЂЏФЧЫМ’‹’Ѓ–‹”ŸЃЂ™—™Ѓ’”Ѕ›’‘™›Ž…Ђ›‘’–•™ˆƒ~~vwe^a\\]o‰Žˆ–ŽŽ‰ЊЏЋЏЊАЅŠwpv”—ˆŠŒŸБЊ˜’‰‘\t™žžœЌЅ—~Ž”‰ƒ~ˆ‘އ„‡…rjk^er‚{…~‡—ЄžЁ›ОлФСДАЕЊž~w}ЛЎЄ”™žЄœ˜—˜}œЂ™—ЄЏЏАƒ„‡ƒ~}‚~„||xvhva]mtptq‚‚”—ЅЈœ”‚ЈДЇŸžЊ›ŠЅŽ{hƒЉЇžœ›˜ЃЊ™‹•ЂРЂžЂЄЂƒ‰„ƒx}‡{}uvmnhvƒ~zxhet•˜ЎЏЇ’žАЖЏЃЁЃ™‘•Ž~—НЗЄ˜–”™ožЁ˜œ››’~|x~‚„‡‘’~„‰…Šˆ’ƒ‚ƒvv‰•’™Ÿ™ВчЩЏЎЎћЉЃЉЉЃЃ€>НЏЋ™”—˜žЊЄ~qŠ‘™œœ™Ѕ•}tz‡˜’…zwh–ЛЈŽxxrzv…~u”™Ѓ|ЄегМДЋЎЄ›ЌЊ˜‘—ЇЉВЕЃ–ЂВДЇЇz}‹——œ˜ЅЊЄЊœ‹ˆ~kmdx”‚tx}edjkv}Š‹‹~aЊМЇŸ›ŸЂ˜œ”ЁЌМИЋЁЅЉЎДВ‰Š”’˜”•—œž—˜ŒŒŠ‰{xhZuŠmz„„aWuƒ‘‘Š‹……v|БВЉЄ•’•™ŽŽ‰’œ’‘ŸœЂЈБРЭШЕ‰‘›‘‹Œ‘„‡™™‘……ˆ‡whm[bg`›ƒwvŒЂ‘‰„ˆ‹•˜ЎЌЅЄ˜ЉМрВˆˆŒ’‘›œ˜ЂЉАЖЛЋЉŒˆžЂ‘ƒ„‡ž”ŠŠ„|‚wrqnQ]cpbm‚zƒƒŒˆŒ”ЈЌЄЁŸЅЉЋЁŽ’˜”––œ›ЃЂЈЋЖМЗjz•ЂЈЊŸ‘Їœ•Š}~xqnd\^gurinwxw‡…˜‘|’ФУЌЃМЫгзЦЃ‘މВЁŸ™„Zc…ŽЂЉžЂЋœˆŽ’ЅЁ—‹‡~ƒxu{zqnq\9>u„‰…„‡•—‡dƒЈССШдЯТСЈ…žŸœ˜ЃЋВАЁwh–ЃЂ’‰ЄЕЋЂˆˆ}{•›–tr‚wimuw{wt^NEqˆ‰ŒŽŽ’Š|›ЋœЈЌЖОЈ‘™™ЌЏЋБМНЎ›‹ˆ‘КЅЅ›œЊЌЈ…ƒˆ™žŸŸˆ}ric`qqxxnqriƒ…‰•˜Ÿ’‘‡–ЂЄ—–žЅЁЅ••€ ЂОТЊŸž™’”œž…‘ЗЄ–{‡„‚––‚xrT9>Qejhab`YYkptwtqЂАŽ‚‹Œ—œЉЅЈЌФЛЈ‹~ƒœЏЇ–ˆƒ‡}o|ŒЊЃ›Ž‰„~~’ž–q‹•Št}uxjdeimebipuaN\‹Ÿƒ}ˆ‹˜”›–Š–ЦМЎ™’ˆŠŸЃ—‰‚w|ŸœZjŒЪрН{u‰Œxuujhe]bb]edjhpwzqrt‚Š‹”—™’›}ЅдеЋŒ‘ЂАЋЄ—ˆŠŠˆˆЖЅœЭСЂmq{||‚‹‡{~w]U^dk^Z]V]tuxz}w}žœ”•›˜”‘‘|›™‘ŠŒ›ŸЇŸ—‘’ЂЄ’˜™ЉЖЂ}‚|‚ŽŽ‚htxЏ™a?SUNP\Qn‡˜‚{}u|‡ƒŒЌАЉ—’ŽŒŽŠ‰‰ЃЂŸœ—ŽŽ˜Ÿ’žЄЅ™‹Š…‘™ŸгДpgch~oxpdh|q|…~vk~}‰™˜”ˆŠŠŽ—œ•–—˜…‰‹’‘˜™›’–™›ˆƒ’œ^ˆБЅ’‚Š’—„—‚jheSVomje[YZcgimkbo—РЃž—ЅЃ—™ЁЂЂžœ˜‘„„|}‰‘—™ЄЈЎЊœ—›m”ЋŠobu‰Œ„xzmh\dhou~twupqqhkdk~Šˆ”˜”˜”—˜Ѓž›•Š„„‹••–ЂЏЎАЁЁ›œˆ‘œФЇ{ƒŠ‰„xikjjhe]dii€’rv{u}xpmkp{–’Œˆ‰…Ž˜žЁžŸŸ›”‡Ÿ•Ž|z—ЁЁЄЁ•Š’Ђ›‰{ƒ’•|nv}vtoginhajpnmjuu|{x•„~|Ž—ŸŸЁЁЅ——–ŸЇЈЂœ‹‹™ЅЊЁ˜––˜ЃŸ—Š”™’ˆ}wktb^Zbovb]gqoqv‚~~…‡‘’”™€”ЌЛАЁ˜ЁЉЁЇИН”}Œ’žžœœЗИ™””–’ŒŠŠ—…uquqorqh]Zaaiu|ˆˆŽ‚„‹ЄДЅЁ›•’‹‘•ЂЅž›–œ”ЏЎЄ™ЃЇž™–’ЩЕŽ‘—‡„…”ЅЖ„UWmumow‚{mdnwxnkant{~h„КИЌЂЉЃŒ’’ŸЃœ”•ВБЇŸ—•œЃЅŸ–‹дЗЁЇŽ}z‚„ƒzrjqwxwpjgdYdkv{vnjo~‹ˆ™Ї–ЂЁЂ•‹„‰•Ђœ˜’–‘ЃЎЛМЏЅАЕЗДЃ›˜БЎ˜•–‹‹ˆˆŠ‰ŠŽƒ}xkjmm`ZOov}|rzvˆ›ŸŒŠ’˜•‘‡˜˜›•’‰Š‡—ЄЂЃЂœ˜ЅАЄŸ’ЊЋЖЗЇ›Š…‡ŒŽ„kTbb]LU‰Ž|rcht}„ƒˆŠŠ‘‘‰‚‘”’‘–‰‰ŽŒ’’›’„—’’”–ЊАЏЇ™Ž…ˆ…ƒ‚‡‚…|unjgaSZF9<;JPQT@8?GPH`uqL@J4"+0015:@>?3*%#$., 0%7++;957&->FEA@A?EFMT\],. !##"@MB.3)  !$)-38+$%+;;IJ*<-CJJE30>GB@B<:8*)392GMGVuE#&!  )9<,:12,$;LHQS):?8917>FHLNLJO>N]HFBHEFAIneE-C%&.""#"$&#"%3;&08-:B0cB4FFINOOFU@12:J22@8>EHB895EQm?""!2),).((("08;B<2)04.2>^dFjz{rn[\t{gVUA3#0):A>;+(CGG?!## #",-0(00(12(982-3.am”—‡q‰ŠŽЄŒ}~pWLL+51;E73?EGSPGB! $$5*&23+1*zq}}x{|”|ƒ‘‰’˜xvp^UYW\UZEJ>E(&##   *SS4&587:p‡‚‰‰~ƒƒg}„”‹qwS^^O\vkЅДБ˜t}tG!%AZ>;I@ !&0<.;A??,0BHE>xˆˆ„z„|rmk—{{}njabozˆ‹˜ЈМЖœ‘˜m2+%3:82!#+31+#3CdNV\xžj`rkr„ˆxzwr|~wweu”Ž‹ˆ‰|ow|}w|…„œЋВА™•ЁjC<<КCG@31&&)-$)1, NŽ™–ˆW[~‰rtˆ{w~‚xmgpoq|‹”ž•ˆxq|‚{qoin’ЄЂ—Є—a.(1-48.##€V$0&Fwˆ—„w{{te`Œ}|…‰}jihtqoЁЁ™kb]Q?dr„НйЯŸЊt:;>5301!$$%#(*5?BHMxЅ‹u‰…indŒwz‚ˆ}voiƒni—ЫžŠƒ‡kT`ibz|‹ТЮОЃ{~c*;-1#&!"#+;AIk‰Љ„‚Š…v{x]hj^ur„žЁ‹|…œ„pnmrpiZqˆ—ЎЏОЎ‡z’…<(1795#"%.4,,0+72;0Ankeomi`honW[^m„‡ˆ›Ÿ›ЈЋАzotw|jb]gZvЁЏЌЛ‹„ŒvH;!..013.BA11-134oŠv}Ž‚qh\gg}|„›‰}dq‰œ˜’ˆ‚gequvt]Z|•‘Š–‰…zwxJ8;92-#25>;39>E@IG:‹}ro|xdjr……}„ˆwmrz•ЃЃŠ‡xjqwpq——›ЈЁЂЊ™Š™žt3>B8>;4<<>85:BFCI82q…hqzƒ‹‰œ„ondgiqx~}…™ƒwxuqr}{reŽƒЏВЋЋЉЇЖЂi+?:.+1309.J}‰|„‹ztmx„okt}ƒ–œЇž•zVrw‡}tqМНЎЊЂƒpQ%&&#%&482;;.,58W|ˆz~‘˜ŠzTjkmp{ˆ‹ˆ‡ˆŽ”œŸŠtˆ‚xpm{‘„’—’œ}jcEJ2$0*%*14#(-9,1YˆА‰rrx‚uw„ƒ…ƒ„…~‰‘‘›’‡‰ƒxvhxuwˆŽ”›–ЄМЊ~xgEI^84;&,3@B73-,33"?p„tquwur‹‡…v{p››Š||ŽŒ‰{z~zwz‰‘|œŸ˜ž•j];(@cL&,*12OHCC;749@8@c„‘‰wprtp”‹ƒ}uv‰ŸŸЇЁ‘…‡‡rnvqr{ˆ”—ЁЊŸЄЗЅ~Q- ! TB!*%*8&I]t~Šƒ„|rŽŠŠƒxrruˆ•ŸЋЁ‹ˆ„~ux‚Šˆ™ЇЁ—ЃЛЃ‚b<#0%$"!<+%#2M3"I~‹‚…‹‡ƒu‹‚|z…Ž•ŒŽ’’˜˜‡vgpruuЇЄ”—˜‘—•Œ—‚H!))#"%(?E>MEYHBOcƒ‡‹ˆrjœ‡‚„‹Ž‘‘‹‰Ž•‘˜ž—’ppw|xŠ•ЂЃž‹‡„wzeA;9++"&&$Q;7*%GGTmt~{Œ™Ѓ˜”Œœ•‡{~Œ™˜’–Œ‡•xupovmVmЁ‡‡ˆ{ŠdF?0,)%4*!:)0-"4Oi\ewЃЇЂziqžˆ{{x~ŒŠ‡’•А‰kipoonnot‚ˆŽ…x…m`T10B9)5$.27++1:8IG7;c~ŽЋЎœ~geˆƒw}}€й„Ž‹•ŸœœЁ‚Ymvxmbbt|ˆ™˜Š~|nii\B;2.35.,,0)+5,A03V}–ŸЄ–kcxu{‡‰‡ˆ‡ˆƒ’œЈЄЅbehevg^rwv’•Štmd`^V.*>>4*,;<:30)-4Ot—ЁЉœ—tjwnpv}xecc\^ƒЋЅ”ˆŒ‚v~ˆ``ghz™™ŒŠ’ŽˆŽ{PIQ<8#)49;7:?:>2+%>Bm‘—œАˆz{ƒ‚‰pdc|žЛЮŸ”•|zpmw{…whi`m•Ž‰‰‹‘‹rT7;5,*:<22%%9:;0.385?i–‹uxen„|u|ƒ~|}}{|…‰‹‹ˆ•ŒrHVekpr|„‘›ž’ˆkkb>#*4-%&%+,-39>B5,^•Ўƒ}„……ˆ„……}ztu{„‹Š}bcibgkkd\qЃœ•ŽŽ€Кgkˆk5,#%*.7799*,3;<92)Fmˆ‰~||}}{u}…‡}xrtrvu‡–’~„tc\ekihv‰‡||ƒˆk]ZF152-"%5EC@,&499-*HUxˆwwzuk‚|~z{~wpxtwƒ‡vv`EM\kpv~}xzzh…p?*&,!%,.&(!+.83EJA]ww}ƒŽxuzx|…~}xƒ‰Ž’ŠŸ‡qeejmgrtx~ŒaUbP>2-2,,#,.#*4-&5Aqz‡Šƒv…‰ŠŒ‰{{…‹ˆ‡‘››‘™‘oegccmtv„ƒ„ƒog`C#1.%++,,*#( :Youo{‰—o‚‚‘|x‚’‰‘˜œ’ˆƒ}`Betxvupjz…Š›РЎkZWC%++ .+&$,B\]huސ…[|}{{|wqq…Œ‹’‹‚ˆzzpkijx‚‰……‡‚ktwhI>:$$!%&,0$$%(%#$;[uƒ{t|‰oomgv„ƒ{xˆˆw~‹˜•‰‚z|‡~|ZTu‹‹‡‹€ыoz‹q71%#""#"*!"&*Eizvz„||Њ’‹|vu‡…}h]eQWF>GPHbŠ’‹…q\J[N3,".AWz’„ƒƒ{‚ˆ‡Ž•‘‹‚‚„Œ‘œ™’”–q^ogiaOSd…œŠz~zxkFCL4224)#  No…„‚‚}v…‚Š’˜˜upv{‡Ž„„…ƒ{zzti^W?`Ж‡rƒžJ;;$"#8d„™ƒ{|tˆ…„ˆŒŒ‹‹|nqv}ŒŽ…‚‚Š„‡‹rYho{wnq~‚{tmU.+$2*"48Uv„zvz|Œ„‡…Š’trwŠ™›‘‰…Š’|m}’~wrruw|{prwZ++$)(-$3Fj‹‘ˆ‡‚Ž–ˆ…‰Š‰ŒŽ‡{t{‚wx›Єˆo@9LZh}ŠŠƒtmrx{\.,(%01..#!$!O•Š…|pŠŽ…„}}‰Є˜|vpopЛШЛЅƒˆ………ˆ}z}{heY&""!#*(&%&-.&Coœ›…ƒ{qŽŒ‚|r}ƒttm~€?{u‰БЊz>2Tn||uzƒ„АЂuU*&2&(2<5Lixƒƒ}zu‹„|wƒŽŽ‹|wmt‰”’Ž›ЕЉzgBQnh]cq„‚~m^Q>1.,!(-%$+>BMd}|}tmi’‹‰‰Є’Š„vjp{zˆžЅ’|ow{|{``Sku}}|{mC&(4,#02)+0Pq‰|~{rm˜’‹ŠŒƒxuzz{}|x|~‚|zwxtr|ŒŒˆ•‘Ž–œ™‚L"&7%"%#$-33+.:J^zjgbge›ŸŸœ‹…„~…„‚{zvtnr‹”Ќ›’‘tiu‡’”ˆ…‰„i1#)($ $0:EZppwtj[Ž™˜‹‚}„‡‡„…wrr€яwˆŽŠ‰iPW<@i‚„vptutp2#!  *?;N`nogeb`™’}kvz‡}{w|{}ƒ„…}]CQP\|Žxk^^nˆ˜…N5+)"&+,*$!&4E\b`[bˆ‘•‡vw~ƒ„wŠ”‹r‚•‹mINL?b{qjcdt{„mM5* 2(+0"+.+##"*$2Qu‹…tiecAE:TgeTOTPLFIAIBEECBHMJF0&7#&1.2+)!!&#,)-))+(377:@AFEAEC>NQPZ^TQS^\LAJGLIMJHIIHLPFA?4<7>:42-+&(#$+(&(!!€$#,-895;5;><>>[^]VYWUWTOG@HGPMMOHCGFGB?>@CG@ET0$3M+*,*.,*"("089AIUPG[[ddede]YOeGINoQOG@?FJJG@@AEHIIQA"!4C?@0*#,-))08H8FGEJNOOPNSY`emecUQ\bUoŠŽiV^ABGGCEGIPOLHIE:229(9Q.&!.)(!-8?>9EMEEC:CJIGLJFCS]ab`UVY\[ikwZB7GC;?@97UTQNB9?5-.1.)0**)*%,$)14;;€ˆ@JOJJGEFOWYPOFNS`bYTSUVWWUNWW99LNJEFT[\SƒH2E<42)+-2-*($$&+,&41:?ENLNLQOEMVZTk`GYZVMMPZ`da\[Zi\cxYV[WWSPS„zSMN;254454.0,,&-,+13535>HINUPJOPQO‡^P\hgmkkanUFCTbOUPVVTUPLGILWwM<;1,03309:?>7:8;;?>;>AB@MLNEMMGES[FBST[ec`^A3!%&%"+&*-29"5574.EJJNONJF><ЛНЦЧЪШЧЩЫЩТУДКЯЮдбБЎЇ„‡rpdЇiYjbb3,E<90%,,1>1)*4$4!EjiPNQMMЪLNТСЧУУСРТУЛРРЪЪЩТРНЃЁ—ŠŸАВНЩхябЅЏЇv>7BA;@NhWL]J.,05JJZ€ŽcVMQ`i]ZЦЧТОТФОРНЗЗФзЮЩСЛЕЕЏЈЃЏЦЧУдсычЯЫе•A;I@EJHNHAFGAAN`|jt‚ЋайВЁ’ЅЂЉОДВЎЋЏЖВЏЕА™ŸШЧТЗАДДАЎЋЌЖНЏЧгаЮЧФЭWSJMNPHIC>AHGG4:xОЮзУОЕККМЌШЛВЏАЉЈžЅЊЉ›ЗЛОНТНБŸ›œ—ЈрўїЯМШУЅYSSA@B?C<9>ALNU[j…ВуСУУЦНАЉЯААЏАЕЖЌЋЛЅ™УяЩМККŸŠ™™ЅЦУОтькШžЉЖ•WLA:<98:@:?:99CGJJanЭчТНУЦОКОЊЈБЃИНСЖЭусЩКЦжСЖЕЗВЋЇ˜ЗЭкчэёхОКдНT?AJJEA>?FHECFOOQVJ]ЇМДВДВИИМУŸЈЃИбЯЯ€ЇагзккмыМЃВМЛДЇЉЅЂЖпэтєЫШеЖuS1GHJMLNIOOUNTNPWNOЊгОЛИКНИКЗМНФараЯЦЋБдснзЯЩБЖОРИИЅЂЗЯдШежЩЦЛНЈhL]QNIIJOQSSQWW\aaZБпЩОТФФУМСЭШЪЫЫЪФРОЗйлйжебСНОНКЕНцулнлммплрхžHMTZYPJJQTSQZbca]]S’ЦВТЭапеугСЗККНСЦЦЧСЮежУНРЛИСТЛЌœжЫФушхрчуђтœNLTSTPJJLPTQLSVVYQQ{ФеШЭЭагЯЦКААБЛРЧЪЯЭгезаЯЦŸВСШТЛОЮИИљтхрмЧБg553>A>>ABHJLHOYSPYYФжЭЪЧЪЩЩСЁВБВМЦЮбаЫЯдккшеМУТНЛКМСзУЯЮкнлФДЫЂbaQ4FEBCHLILCHOOP;Q}дёЩФРСЧЦОРжжЮаЮаЯЫбддзаадбЮЩОНЗККРЮгдлнњыСРŸ]ZnNOFGLHNOPP€7TJaЋздФНЖМСРджзгЫШЧЩСзнкеЫЭгжЫЩЦУУРТЮбФдйрхкИЄ}S\|aFGHFNj]ZOTNQVVS]œУбСНМСРМлзгаШТТЧгяхспзгдЮЦТУФРРШдлнууххїѕТŠP)533>B-+G{WSCBNUTIa’ЛЩаЮШФТЛкеаЫЧФОСНдлнмкздЯШЧЩШУСУезйпплкѓнЩЅg70;?7FaPEJI^m]MdЊгЫдЯЯЫЧСжЯЩЪЭажгедгдзйдгбЦТМОНСЧэпупйдепемНp48>BBGFAAG^Zbjt…h`t›ЫбжмйЭСИбгЯагежйкйлйплзкрИМНСУЭУЮеслйдЮЪШСР’WPFG@>@@˜8c^YCIbjtŽžООзллшурдлмйгЫЭдлйлкмкзжмШСЛОУФЕžВЪцеЭЮзССЯœ`WJE@?ABHAMJGH??Upƒ’БШыршЩДКежбЧУФШбзлкзкждндВНКММЉЖЛРагЭЪФгДЇœhGSPOEBEEHCJNPPUZ\IUЧльэхФЏМЮЪШСФЩЮбдгббзкльЪЁВЖДЏЇЇДЛаджаШЦЖЉЉƒa\PPNJIEJLL€йGFES]QUxМкпткБЈКТТЧШЫЭЯЯЮЭЩамппшЫБДЗБЂЅЖОНЭгЯКИЌЄЄŒLCNSMIPOSTVPQIHMEJk™ЯююптОАРВИУШУБЋœЂЇЦьлаегЩОФЦжСЁЅЌДТузеЮндаЯБo^aWLILPWTPQUZSSMNUmЃЯмпчЮУУФТШЧТИБЋТуѓўкбзРНЗИОЧаФДБЈИпггЯЯжмЧЅnIOUOQPPQIHLOVTPQLYwЗсјркбЩЦЪЦЦТСИКЎОЮаагЪЫЪШУРРОМНЗНЦОЦЯжейИЊЋeY\SONIELQOMZ]ZTST^œЯЮзйсзРЗЧТООСУТСШЫЫШРЗЛТЩеЫЇЎЏТСУУЪазлйлЫНЛ›L;7;;CAEBGCGBGPuЎЪННСФЧЪЧЪкшжбЫЩЧФУФФЧФСЈЎЕ™Ÿ’‹™•ЈЯндШЗž’—|::OC4:3;>@;;Е?@EEOZ„ИлФШЧЧСШЪгжййдЯШЩЧШЭдеднШкжЗЄЏЗЕЏ›™ЋЭрЮРТОΘ]Z`PNGFCCA;:8:8>85HtЉЮУТТщКЫбгбжзйаШТТУЫбджгЫЫФОЛЛыЋŸv”еюбЮЦатБcOVC@A>>88€С;?@AB;4O‹МнЩЦССРЮЮЯЯЭЯйгЧСНТЫЫЮЪШЮЯЯЮЩЦЛЇДЏИЗЕИФТСИИˆG.>H@954487<@FINOJTЋЫФЧУУРгббЮЩШЮЯШСРУЪбжбЭЮбпЩИМжОЛИКНММРУСУЦ‰FBIE?A8:<;CBBCFGPJg”ТзЮЮЩУМааЯЭЫЭаежбШСОТУШСгнхЮЏxm‘žЇУЪЭЪФРЛФЦˆI?BA<<;9AGIHH€$MNI:I|ВжаЫЧНЗЭЮЫШЪЪЭЭЯЯЭСЛЛКМКзєўјуЩМЪЭзЫЭШЩЦТОЎЈH4B8@>;9?FLEFIOON><@IHCGCLNLGJHSwЋЫДЕДББжжгаЪЦФУТЦУНРУТЦЦЧаЧЦЦССЎжгЩбгЭЭйтмЖo?@EJE;AF@@>FJFE?FWvИЋВБЌЋйкздбШТТЧШЪШЧТМЛИНЦЫЯчнзаЛАСЯаЮЪЧСбаЂZ@JHE@77Л;5@<@9AHPUj‘НЖЗВЉЉйнлжЭШШЪЪЫЪЦСРОЛКЛТЩаЪЊ˜–}АЮЦЗДЛАЕТЁN0?I;:9>ъMUYtœРЗЎЋЊЋадгУИОТЦЦФУУ€ГФШЩЧШЪЪЮЦЂ‡Š•СдКЕЏЏЗЮсИqNNFA?:@B?EFIH?UxЁЦОЋЊЌЊ€CHI^{pZ^Z`QN:G7EA4.IAGEL)4-30%(8!(,$+"!!"$&#"#?5:*8EJPI>>TPO\ZQTUcb^JGNMSJNJOGSTJG@IGG@:>88&$4&.!.+"-7!%"(4-8422:?IF@7>QCICCEPNJZ[gh^^dbLT`HGPnOP9@?CMLGIMS\TSOP8)857;A>AYTLUbbohna^U\jetŠ‹rYcJA5EHGJNVTZUMG75*,2)"-",081$!78>BPPEFEFJFOZQmeGY\ZQMQU^Y^h``k\ctWSN]\ZV[ˆuSIQ;@)@><485@<@<44%->:@PCMOYOOHSVW‚^LSU^]gkZZUHNVaGGMWLV\ZUUPWa}O80,5-1-9,?98A8BA;87)2?FJUNTGAC?EG–ƒˆЌЎŸ|ЂŸВЂ’˜‡jVQ:HEF7Q]JEPZYggUZE<1.&,3++)5&-<8:5NHIIHIEJCA€g–™’ŸЉ•‡’ЃЃЁЄ„ˆ}jgpjj]‘ЅkTgVZ3>CG-$S‡žž…Ž–ˆx{Џ’ŒœŽ|zƒ„žЊЉЅŸ•‚toVWmt‹ЭђпДЈД™‡IFI;FG?BB€и7:<7@BCONUY‹Уž‰œ˜{v}Ѕƒ‡‘‡„—xvЊсЏ””tdiuu›”œЫзРБ„ŒxC?B3A@CBMYWužО˜››‹…Œt{‚oˆ”‹ˆ™ЛЖЁ–ЎŒ{}„ƒ}{gz˜ВОФбО‘ŒЁ™N9>FB@E>@BFO>IEGNOFO~‚x„{v{z‡mto‚žЁœ˜БДЊНФТ‘w~ˆ‹wrpoЕЭТеž—‡SF-?IMAAHLSUTTHFEOGG~‡‘œ”„~{}Ž‘ЃЕЁ•’~‡ЁИВЌЂœ~~ˆŒŽŒnm‡ЈЌœЏЉ™˜ˆ‹Š\ITGI;ABNMFMZV[W]`T’Ѓˆ…Ž}‡Ÿ˜œ›™Ž„…ŽЊЗЖЄЂЁ‰„ŠŽt…ЊЊЋЛВЗДВЃЋЕ‚?FNPQPMMQNNMQ^ZWYIFv›А™ЅЇД˜‹}}Љ‘˜’›ЉЉ–}„‡…–„xrЁ–”КЪМФНОЦЕw4AVMQLJFNQVNUPGHOECW—ž’’”—ЅЂŠ‚Œ‘„‰Š”–ЇЉАЊЄ›Œez‚–ˆˆž„жЫОНД–{dG,19,>7A*.AMIJJMHFJL^Œ˜””Ѕ—‰o…’™ЂЁŸЄЊАЕЄ‡˜™…{Ѓ”•ЂЏЏЕ—z’zJZN2?EHCHGL@?JIC;4Ge›Сœ‘‹Ž’‘„ˆœ™›››ž™˜ЁЉЈАЇЂž‘‡ƒƒ‚’ЁЃЋЇВбН–’~IYpGGLGrWBEIGQQHTuƒ–Ё—‡ƒЃЂЁ–•Ž„‡…ЅЋДФЛЉž˜”ˆ‹ЂЅАНЖЊДбЖuH.&0?BI?7EYOMCFTdMF]‘™‘™Ё—”ŽŠЃ˜••˜ŸžЇЁЇЂЋЋАЈЋЁ”‚‚„ˆ‡—НЖББЋЉЋЕŸЈQ-4>CJ87@3?Y\Zaew`T]z˜ЃЄЇЁ›‡}Дœ˜–›ЈЂЁŸЊЉЊЈДЖВЉ…‰Ž’•ŸЅЌЕАЁ––’•rPNLBB;?AA5]SQB?]^n„ЄЗМРЕЕЄЗАЅ—‘ЇЈЋЄЊЈЈЂЊА›Ž‡„ŒŠ}k—ЛЃ˜–Ј‘‘›vOMOJ:FANL@POAOF>Je‚x{ЛОР™…‡БА—ŽŽ€Ј™ЄЅЌЎŸ”ЉЃƒ{}|…‚‰–ЂЇ–ŽЁ„zgB5OMG>CA?BIGIMIMV\NVx‘ЄОЩБ’z{œ›’•’—ŸЂЄЌБЎЋН—n~‰ƒuoo{‡›ЌЎœŽ™~z|hQQPIIJBMJII:CAGOOJ@hŠЉЏЖЋ}q„Ž’œЂ˜›™ЂžЂ•ЇЏИЗО›owz{vmˆ‘…ЄЉЃ…‚wnpgCBMGEFHTYUQOHGHF9C]…ŸКУЕЏŽ~Š|ƒŒ—’{vtgq›ЯНЋžžŽ‹’™Žnjq{КЏŸЊЂœŠ`^ZOIMGNHLOPYVSQCGHZ|ЃЅЕНœ‰Ž–”Ё•…{xЗйчВЉЎ‘ˆ~ŽŸŽzzpВВЇЃЋ–ƒ]JMOJQINLCCHQQLPACMdŒЗаДЇž””‹ŒƒxŠœŸЃŸœ’Œˆˆ‡x„„‘™ЅЁЁЄ‡w|jV[\SNTONISLST\TOQNS’ДžЅЂЏЁƒ…—ˆ‰‘Љ‘™Ђ˜’Œ|Œ™Ђ‘ompˆ’‹”žЋЋЄЄ™‘ˆuF?EBCJEA>IMWQPWYPOUzЅЏžƒ‡{|›‘Ž˜žœ–‘ŒŽŒ˜œЁžžЋЈUhr{Š—˜ЄЎВЉ™Š|„uT3.>9G>?@GEAOWVZT@GqЂР˜–•––œ”’žЃ˜‰…’˜œЊЇqv|mt|zxoŒИЇЇЅЂЇ›x}žxI@I;>ANJJME@ITWMIAZ~›œ—’–‘Ž‡”˜’‹…ƒŠ‚‡‘ЅЂž™Ё‚vqx~p’ЃЁ™›{pq[EHF<;ALTZWNCMOOE@YnŽ™‘ŽŽ‰„™˜”—Ž‘‘‡‡…Š‹˜™—•‹ˆqZmp|Ž……‘Žˆ{Ž–uJ>G;FB?GLGLHLVNJZ^`w—ˆŒ•œЅ’ŒŒ—–™˜–”•ЂЊЉЅŸЅЕЃ…z|}„‹’•›petbIFEIG@A>F@BGHPQFAGU~Ÿ‡–Ÿ—‰žЂЁЂŸœ”žЃЃ–˜žЋЄЄЁВЎƒtur{‡‰‹‘Ž—˜‚tnP23I@>EBFG@@:9IG<.@Pk…„~œЌ‡—•—Ђ•”ЁЉЈžЃЉЌЂ™–‘q[w‚ŒŽˆ‰”ЏмОqdP44?FI?8CFEE€BC7G>MgŽž‹‡˜…‹Šƒ‰™‘ˆ”™‹•ЁЎЇЁ–Žœ–œ˜ni„—ЂЄЁЂЂЉ‹”Ѕ}E>F.81&(F:A@AHEAACH[ƒ™ŒŽ‘——–™ЋРБЂ–”ŠˆŽ›””’}xtWjaQ^gatЃЊЁ…t]cW7:O>#37:>98339:5ANQg’Ј™•˜–˜Ÿ™ЁЊЋЁ˜––•™ŸЉЌЌ€ў’ЅЋƒr}|uaj|ŸБŸŽ”’ŠvNT]LNE><@052).71)*>V››•’މ™™›ЄЈЏЎЁ‹ŒŒ”ЁЂЃ˜™˜”Ž…„ƒzuaIhБЪЊЂŒ™ДYMO>1>8,0$,5HCFGCQh‰Ÿ˜•Œ‰ЈЅŸЁ›žЂЄ˜Œ‰Œ›ЎЊЇœ›ЂЈ’ˆЈ‘Š}‚…„Œ’އ‹‹kAB3;8AILEIJOHJ4B^ЃЁœ•‡ЂЃ—™˜–žЏЕЈ–Œ‡ˆ‰…‘ЏгуеЛ—‹”Ÿ—”›‹‹Ž|}h?3:2<-"1?ACEEHHLJ98MƒЊЌ‘‰…ЃŸ–•Œ’•–‰ˆ~”••’–‰‰›ШР‰S@\{Ž’ŠŠ‹’žЮЗŠeA(@BB7928453:3ALJHJ`‡ŽŽŠŠˆЁœ‘›ЃЉЇ‹‰›ЄŸžЅВСЕœŽuWZ|{qtƒŒ–’”‚q^PBG>22&979ABC@A??QUZ|‹‰‰€Џ~ЅЅЃЃДЖЊЁ—Ё}ЌИЅ•}ˆŠ‰‘Œora}Ž—’‘”Œ|V+&::5>BC>>C@IICH@G\‡ЁŽŽ‡}{ЌЈЃЁž›Ž‰ŠŽ’”‘”––ŒŠ‰ƒ‡‰œž”œЇžЎАБŒW7?NIAFPVn‹„ˆƒwnЈЏБЈ™—–™—–˜‹ŒˆƒŠ™œ—uegHJw•‚ƒƒ„|B,1B4.543+1(>(;3HNOYwƒuwrqЁЌЈ”‚‹Œ™–”ŽŒ‘‘’–˜––’jV]^hŠ˜„xzw}žЎ–ZA4>;?A>;548>0212;:5G]jtpouЂЇЄœŒŒ•˜—’–ЃЊЄ™…‘Ћž}a`\UqЁ}vwŠ”x[G134?80+-0:EA9B7HTj~•ƒwwqВЂ‹—ˆŠЊВ„ŒŽ–•˜žЅЇЅx~}{gbw‚…••Ž‰‰‹™ЁƒN@IHB9;E?715CFA98S]}‘‘~utrџ№%,%)+####€Ј(%51)*9<8>>9>3!%$248-9GPF!(2-*2<7+*2<<(EC ,7@.2:;23(2*(0&3,05?47)39B00<@7?3()#*;AHC<8;,>1185->4;9,C]™)$$49##1A;-*15<0*.,*<<5302;.2.8$"!5%,08$*%$!.,*5045;;5+,%"-4,.399>4G<;413,,+.87.3A45@>711+)C>5Ad{wh‘+.:2!"!(581>9%$;@3,-87*%.8::9;;B<7#")+7B5;@FA7?>OT@2ctaet‚‡•Е:+42+2&28;;4482.0.>0)#E2 $45((19<9-02,.05;B;;4;>9PiOWqpuxoƒ‡t;52294<>>:44)90@1,2+$!-*#"!0:8*2AFFN5".-4$3S<;C?FIJA@02?A70-,3)..8>ACIIMNH;7<7;73FUYQev–‰‘…‘‡nhh|„ƒ93(789!-5?;<70:4102737A44.ECCE;A?<9@IB549OLNUFUzМœ–„}{rurx}~w..*%+"%3;84519A?-4-.22<557FCF::>ACEP:M@:*3O[p‚t•›”{‚|„‡z||!(%.-%+,-&):@@:?B:;7550:@GBP`25Ou|ŒnNgxCMrn}zpqƒ‹x{{iЅ7*27&,<<@>9;17,)8FEB,-((9;:97-GE22QJ@QGA4%12JBF\]bb}ƒzrдШqLTicnw•Ѕ‘ˆ……‡‰‡‡‚‰„a`O^kuo]q|ad^[bamƒ„ZPYTYnvˆˆaU\cz„”…ƒvzƒ‰~rhgk{{nkr{ƒ}{pgddmnpor}xve\bhp„…‚~ƒ…rN#CHLTdieYJTUTPZv~zx‰jVv|xmYUaikptc`ckoj\brwoz~ziix’„‚{wƒƒ|kd[EPVdieƒ–~c[a``tƒŠ{‰{g^Z\jpvk^Ucrztijbinhb^ihox„ƒudinqoz{Ž’„„ƒ}i`ccwzzƒƒrhda]epxxwmje^Ycq{~ti]agrriaa[VQanpmjrtnigmp}‘Œ‹ˆpTgrvvnaY^ev…‡‡tZZgˆvix‡ihcV[]ct|{ukkomhmjhjkdkonrkiknqnkdOkЇЅœŽuYT\arpcYWMd‹ˆbEUZ`\Zr~ie^TQamnc^aaW^^cabkpxtutmmroia^]]eYu’‚xqxxnYW]dhjhpjƒ‡Ÿ‹jca\etqrjighd^dh^Y[ZWU^ijjqtnmegbdmddbjeeckpqpttnn^UYdmkg\`bo}ƒva^YY]dbe`aa\Y`jkhc]cggpvvommotnacgnhhiqtqppx•›‰‚]NVTUgjbZWj|tnmc]YTTQ^;I]dccmpj]`e`]^cVP\ha`\`YLV\Z\otqjk}œАБЊ—neb`bd`VZZV[]ihgabTSVWcWMnuuqqukVSUigpe`mrorvqjeedb[W^‚rin‘—‹‰|ijrpvoj\QT\be^[W`bZSZho~utukigqqWQZhnmpmhaippnpwmha^`epov|zx{xwwjrrpg`dmprqxxtpnkk\Y`mxnkmdhkdeikmiightpeqrmjtui`]mmi\dmpp€Фwtv‚|rxuh[^[cicuwojpieia^h`npzuncZ^cciomgnwvibhhehikjowtn\O^o`J`p……„‚ƒ‚tdZSTUWiormptwpiginrm{tjaSYchhdYOPbcZSahga]bhecg^WY^YO4?TŠЊž™‘‹q\OMQgrrjdktwwoaZZxvtmT[\V]bhij\Vbiebdac[Y`aWZZSPQOINQPPvŽŽё‰…‚eSZPJUjmkopvv€uaekmv‚~n]WTQWWZ\]chikipnic]YSPSUZ]ZTJF?NWiuthddom]EEIFSd]Zmmnrvttuimvupgc^IBNb`^gjrpkikonc\[cigeVUZONHWnjea`]`cogN:IOOVVSUuvzuvxrqkid[\addU&(N^gjh]WW]emnh`\^emnoba\Uci`ikkqwŠvh^WTU[VZ[moiaQakipic`YaWZhaZZAFUYT^j^QV]ba`baa`cb]VGNOTPU[owu{[Q^icbbkvxvrqeeorbgoje\[]—a28?LTSgqnaz‚pheg\UTST\b][VZ\]btxnekrqSVbutrxmYE>Sexzboxz{~qb^ieZ[POHQdƒ}rr„Š}ovqd^djjcZVYbVTWhrrebmuoOM\‚~t^P,7Od{vcepqimxaW]ZYWFJIQJataPgtxvwqb]][YSLW]a`\ZdmjhgjwvgTPx~vttSEOhumjcgxxpjcYJPPNI@EINPQ[\dgnnod`bUHTQOINIM\jiY^ijjimnqp|hqzt]Jap|trp`geZ]YQOVWOLOOЅQMQbha[cmjij`UV]VN?MQ[`\[\\b\W`o{|we\a`iki‡Ÿ‰vw|ie]ZQ[^^\I>JOWS\]Wik]YbnkdebTVbjkmj[ZZ^[dhhg€‘mngaYc^SGJ\{}wvx{^ddic\]YSI;Wvr^Zbmtnb`erncnrwppiuhTNT[SPUVUZY\emjcVIW\[Z\Tjjgi|^abcom\OHWbx~`YNUkupjbgnmgionbbg\F7GU\UONN`cbcmpogZQUWa]dehkx}€p:9>@BA;;?IEA@AF?@EA@@FECFMNMMYUFHIJGGILNGOYTPJHIIPSPJNUWLEBWP<2;@MNNIP[Q>CA<;:B>GJOMHCGAELOOS[WNIEB:CLNVWTPNJSJHGHMMNITQMM[~Щ?;FBHFEINSTMMIIEJHCCHPVOIFCCOHIQVPIE<<>@EEOSOHLQULGAMIPNL;@NGC\SQ^ŠКОМуHEHGGFF?HIMPLEE?GGECAJOLEA?FGGONNUQNIJIIOMMSNSVWSNPdj^NЉŸЊДббляINMHJIONJOPHFA>>?JGFCHLJE:@CIIFJHLONLJIHJOQSSWQPP€ Sg…nŽНЫЭЮМКЪЧАSSNOTUOPNLLIGCHEFFHLCAB;::>FPJFMOSY^VNOHMGMJMgLN[Tg›МЁИЏŸКСФЧШШФOQHMWVNNOMONSSPJLMTVLING@GHMSSPMU]bbWNMOSONSarxo‚›ЯЩжбаЛЛИСТЩЫЪСOHG@GINEIOSSPPGGILSOONMMBNJUYOSONSW[WYUNP^hjjhˆЗьртзаЪТТФНСФФЦЧРHIEAAGHFFIMGGQOONPJLHHICCMTV[UTPQTZb`UdPONSu‘АЦЫЛЫежЭЮУСТЧЫУЧФФ€CIGCGIHFFNMEBMUTVWTTPLMHLPY\UY\YUe`gwNSuЁЎЦШБЁИФЛСЪЦСОУФРЦЧУЌцOPOMPOWWTYWSQNNOQYZU[PNLHMQWVTN\^OY‚}ЃЮюћўцДБОКЕАЅЎОМОУЦФЦФУМ›а^?P\aW^^VZQcdOGa`Zbb]IA?GIBQcZm…‡–ЁМЪИЗеўўжНŒБКЕНЩсюЪУФЫЮШЫЭЦУШЦŸ™‹œЄБЈ–ЈБ——–Š•ŒŒЇЉ‰ne{Š…•‡˜ЧцЪЄЅЈашŒЧлЭпЕЇЌЏА}m™беЉЛФШШЫЯЮЧЩзЦЛžЁЅЉЉ€ЋЏБЅЇЉФФДЪўўаЄЉБЏРЩНАксЫЧНМЧрЕ’ЈНФЩРЕИККЁЄЏ›ЊЛОСТССЦЭЮЭЯсўЭ•|ЅЈЈЅЋЎАБЖЗИРВРМЂЕЖИЛРСРЛУФЦЩОНИдеЫЪйАЮйШЋАЕБВЖЛОЖЩЮШЪЩежждЯЛУЧЮЧАЏЏЈЊДАЊЉЖРЗЭдлАРРЛИРУСТТЦУНРК”ЖўўчуЮЪРОžЉŒМСТТСТШЩРКЏбщмзйНЖЖЏЉЅЈЌБЗРМБЋВЫШЭаЮЪФУСОТЦУСажгзЦМЖАзшмеШОЕблаОШЯЪЩЧРСОНТБЦйзррЦУННЪМЛИЊЏБЌЏДВЛДЎЈФННОТСОМОСЪбелггЮелцнФЎ™ЗЦмž‹ВеОМУФСТОСУЪнзйзУФМЗМФЮЩРМИЕЕЏАЕМСОРККРЦФУЦУЪайррлеЮЭбзбаШРРТТБЊ‰™ЊИШЮЫШФСОРТмзжЧЫЦНРШзРЂЖККИДЛРФШЭЯеЯпЫШТОМТСайкгЧУРШЮЯаЯЪЫЦИКВЊБббыЮЦУРЛТЩерпЗФЧУФСКДЏАЗЗЖЕКОКЛЛСЭнЯЮЫОЛОФЦЧЪЫЦФЦЧЪабЯЪШЭзБЕЕЅИЪаждЯЪФУЩрпсрЛРООКЖЏЉАИНКЗАЌАДБЕЛДБЯЯ€КШСЧЪЫЫЩЧШЦШФФЪШФОВлўёСАКМКбязлеЯЩЧШЭщянННОИИКЛРЗЮУБВЖААВЕКМЗЖУагЧСТЧЪЩТТСЧЧУНОМНМЗпѓуКЎЖЕЛВТйкйгЧТЛЎЩсжЗКИИНЩЧЦЧЫШЛИЗИЕБЖННСШажгЮЫШЩЪЭЧЦШЪЩЪЩФЧЩЩЭайреШКБВДЎЯбедЪРМОЯлЭРРНМНРСОУФЧРЛЗТтхФЎЎэамЦРТФФШУНЛКСФШЩШЭЯЯ€ЊаЯЭЭЪЪТНИЛСЛЪббЯЧСОЛТУНМДЌЏВНЛНРТУМБЗйЮЁ‚œКЪЪЮЭЩШЪеУВДЕЛЦЧШЩЪЩЫЫШЧШШТУМНРШЫЧЮаЪУИРОК”ЖАЋЃЌЖИКМНФЧРЖЋЊЎЎЉŸМжјўўаКРНЗЎЋЌЕРОЛКЛНУЧФШЪгзеШУЧЫЩССЪаббЭаЯЪУКВАЕЕОСЖРпспгСЛЗДАЇ~w™УжМЉБЏЋЊЏЉЏВЛЛРЛЗИРОУФТзедбЪЯбЫСМРШЭЯадаЮсБЗЗКНОЯкжйлгЯУТМЖДВВОейЭИЏРКМЛМЛЖЗЕЗЛМИЖЛИЗЏВЮЭЪЯЫЯаЯЩСЛЛНТЩаФЈœжКВЗРФЦСЕЧгЯСЊ—ЄЄЌВАВЖЗЖЖКРТЧШЦТОЖДАЎЗКНРЕЏЏБЖНФЪЪФСОСБЕКМРТШРЗДМИИКММНКЕЛНУНЦЧМВЕККИЕЕВЗЗЛНЦЦШЦЦСМЗЖИМЛРКБЊЊЕОЦЫЮЦУОМИВЕЖЛОТТОНЗКЛИЗЗЛИКЛССЦЩЪШТСЗЖЖђЏЈЊЎСгкйЮЩИЗКММЙЛОЦТЛВЌЕМОНОРСШзК‘БИРУЪЦЦРСТУННЛРКВЖИОУЩЩФРЗЈЎЋЉЃЈЄЋРсўўрМЇЏЎВСЦФУТНЛЕААБЌДОТШФЫžВНУУТУШЧУЧЦСОНЗЕЏЏЌАЖООНЗŸЏЈЂœЃЈАЇЊЛЩУАВБЏЌВТЪЮЩФМЛВЏВЎЊЎБНЧЪЩТЦИЖЖКИИРСФЦРОУУ€ МНЛЗБЗЛНКЕАЌЇЄЂЊБЖМЯЮЮЪЦСКВЖМСЩЫЧШУШЎ—ЅЈЋЌИУЮЪУИЏЎЉ…ИРРСШЪЫЫЮЫФСТТНЛМТФСƟЋЊЌДЕИОЧЩЫШТНБЋЋТЩЪЪШЩЩпЯЅœ•ЄЗОЮФЉЃЌЏМЫрЫШШРЫЭЩФССТУУОСУЩЮЪСКЗВБВЕМННОУЧРЌЎЉБОгаЭЩЩ€/ШЮН––™ЃЈЋЏЕЅ˜ЁЈЌŸЁОЧЩЧЗЪЦДЋМТСОКАЏКСТММИЖЗЕЏЌЏВЖКСЪЦКВЕОйЧЩЦШЪЫТЗВЂœЄДВЏЯхФЏВВБЈЕСЦШУШОЕЇЌВДИНКЏАЕКЛЛЖЌЎБЕЏЉЊБИЛСШЫСЗЖКЗЛНШЩЪЫУгаЕЌЖБОЧЦЫШНДАЏЏДСЦШЦУНВЋЌЌЋБНЩЧНВЖКМККЗЏЇЃЂЉВЛМИНОТОЗВДЗСжЭЫЮЗ™ИЗИОРЖДАЕФбЯдФЊЋКдФЕЦЦЎЌЊЋЉЏЗМССКВЕЗЕДВЗЕВБЕЗЗКЗДДЗКИЖЕДŸДтЮЪбСЉБЋЎВЖЏЊЎžЌжЯаЊ‘ЇЉЅЅ‘ЗОЎЊЇЊАДККИИЖЏААБЏЌАЗСТСМИИпЖЗЕББЏАЏЅИйШФКЧМЕЎЊАЕЖДДМИЫЫцаИЏЎЎјЛДИДЗИВААыВАЎЌЊЌВЗЗИЛЗЗВВЏЏББЕВВЄДЖЗМРЦРММЖБЌЏАИКАЎЌЎНФУОЅЋЋЊЊЋАВАВЕБЎЎВКЖЏЎЋЋЎАЖЗИЖЕЖДВЎЄЋБЕАБКМКЖМЦЮлпаСž›ЃЂЈЌЋЉЅЈЎЯЧТРЕЏЉЇЇЊЇ{ЉБИЕЕЛЛИДЎЏБВДЋЂžЃЉЏЌЋЇŸЄЉЊЌКМКЛСжцхсгЎЌЅЇЊЋЉЉЅЁЁЉВЕВЏЎЉЇЂЄЉЉŸ™ЕООНРРКЏЈЎАККЖЎЉЎЗКЖЗЗВЊЈЉЇЄŸРНРНЕЪаЭбШБКИИВЏЇЅЅбЉЋЋАЏББАЇЂЁЈАТСРЛНЛМРМКЎЎЕКЛКДДККИИКМИЖАВЌЉЊМСТТйЦУФТСЛЗКИЕДВЖЖЗЗЛКИЕЗЗАЊЇЋВБМИЕЗДААБЖЗЕЕцДЖЛМЛИЛИЖИКЖЎАДИЕЖЕИООЛФМШШэФЩЧСЕЌЈЎЏВЛНМЗЖЗЛЗББхЎЖЖИЛЗЋЈЃЊБЕЖЖИЛРМЕВДЕДЖЗЗИИЇМЖЎЏЎЖЈЁЕФФЭЭЯШОЕЋЇЃЂЉЌРНМОМКЗИЕЏАЏМНМКБЅЁŸЈДЖВЎЊЋЎБЎЌЌААЏЎЎБВБАЏЎЇЅЄ|…ЁЭшжждгЧЦКЈЂЃЕИИМ€zОНЕЎЌЏМНРВ”™ЁЁЉДЖЗАЈЄЊЌЏЏАВЊЅЄЈЉЋЋЊЈЁžœ™–•™žСггадбЧЎЄЇЃЄЇЕЖЗЗМОРРЖВЏВИНОЧТКЇЃЁЃЅЉЏЏБВЖЕБЕЖЖБЊЂžЁЄЉЉЅЅЂ–’˜—ЃБЛЕЌЊЊАЏЃ•–ЃЃЇЃЖЛЛКЗДДЛНЕИНОКВЏЋ…›ЏЎАИМОЛЗЕИЗЕЋЄЇЊЎЎЅЉЊЃ›–›ЁЖАБЎЌЎЌЏАЈ•™ŸЃŸЇЧООККЛОКВААДДБАО™gŽnx–ЌДЖЖАЊЉЋЏДВБЎЎЌЏВЖРАЈЇЎБВВАВЖКМЪТДЊžЃЇЈЅЅИЖАЇЊЋБЏИЕБЌБЌЋЃЌЇЇЅŸžЃЁЈЏБЏЌЉЉЋЎЋЉЇЅЅЌЎЇ›™ЃЇЋЊБЗМЛЖКЧЈЋЊЎБЏАДЗЗЖАЉЉЏЖВЕЗИЖБЎЉЎЫЮЇ„—‘’”ЇЏВЊРЧЖАЎЎЉЃЁЇЇЄЄЇЄЈЊЏБЖЛЛЗДДЗМЈЃЎНЛКРИЄ—”›ДИКЕЕКОСНЖАЏБВЊЈ––™ЅУДЗКОФСМБЌЊЊЌБЏЉЇЈЉЄЃЂЊБЖЛЛЖЕЛЕЊЁžСРЛЋ”t{ЊШЛЗЏВЗККИИЂЃЃЇЄžž˜›ЉМЊœДЛННЖБЇЄЃЉЊЅЃЄЅЈЇЈЊЎДМИААЕЕЇЂ™ООРКИ‹’–БМЕДЏЌЖМЖВАЅž˜˜—’–˜”˜ŸЈЉЏЕКЖВЈЉ›—›Ÿœ––œЂЊЉЃЇЊВБЌЌВЕБЕОДЖДСК™ˆ•ЏУЖЖДАВЎЊЇЄŸœœ˜—˜˜žЂЊЏЊЉЉЌЏЎЋЅžœЃЂ—™˜žЂЈЌЉЃЄЉЈЇЉЏЖНМДЎЎГАЎЋЎЭпЯЛЛМЎЎЊЇЈЃЅЅЁœ—”œŸЄЂЄЃЋЊЄЂЈЏЎЉЊЉЉЈЏЗВИМЋЅЅЇЇЁЄЏЏЉЈЎДВЏЉЊЋЋЃЁ’ЇУНЛЛОУЊЌААсЌЅЁ›–‡ЄУСЅЁЇДИВЊЅЎДВЏЏИИЕВЗНЉœŸŸžѓЃЈЏЏЎЌБДБЈЄЃЄЄЗЃЄЉВЖЗКНСЊЌАЖЗВЉŒœЎТЯАЂЂЌЖИААЏВДАЏИЖЏЉЅЈ”›”œŸ›”–—БКЋАДЖВЊЂŸЂЃЂЊЎЎЏБМЩЧТт;73>:3?85JG8;994AE;G85;FCEFLLQQ€ёPOGFA<;EIIMPMVQLFJ>FABMGELOGIQH8@HJUPCHNTOJPQUSTLCH;FIVFUNLONOPEI?CLPG;@HE5H—@@7?;5ACA@TPMSv–’…Ў@HHGA;NJMNBA>EE€”@?BLILCIELPQPQTVVMHFIGOPIQVUQPSQbaOBx‡wv‰ŸžЋЧLI@JGFHNLINM;@:9EHEI;INB9A@HELFFGMSZLCCHHLMMQWWNSQBau^h‡‹’—އ’|MIIGOTSTJCF@GIPAFEJJ@7BC7@EISNFCG[\g]TIIЫJ>QLkNOQQV…’||q}Š‘‘‹ˆG;@NPUJCTNEU][SNLFQVILNIGGJMLUU€“Qb``]SPPNIJMYjpcvƒЇžž›Ё‡Ž•–ŽHJCHBF:3CEMIQPPHAGHWMJGENHS]VSQQSM[`a[QOMZ\ehUcбНЗЄЉ–‹Š……ƒ‹•™•™IA@?AC?IHFJGIFMQUOTJNSPLLIGJTWW\^QWeWjqNGcˆqhƒ–b`ˆ„ŽŽ”ƒ‡‘‘Ž~ЛBJGG7MSONQWMPJPIPZZVL@@BGNGSSYTUYEJurb{žОбаЗxw‡xzov‡Šˆ––„™ŽrЉ[1ESUEPJNNI^\CG\]Ya[Q@55@?%,288:@YENiu”Ždƒx~‡ˆrpz™›МЮВД›‡Ž~vrƒ‡„ƒ„‰{z{‹‰„}t’mCGM<8;4)"2;1,!%%,<;Zrvtovnku~zpvomu”ЭНСТЅЉ’‡|•УЯŸЏ•Œƒ‡‹ˆ‰~‘”m>:F?480+:<:9<"%,GBc‹trv|rZdq…{tzvr{ŒŽ›МЉ™–ƒ‚zˆ™™›Ÿ‘‰ˆŽzzЗрЕS:PFI:0E;?3$$"277Bdvv‚|uin}k~~z~ƒ~{—Љ›žœ’ŠtpŒŒ‰‹‘•‡~ƒ‡‚‚„ЏЃ:02()-%#("&1:ETIWŠpUH@W[‚‡‡‚}phxЇЉ’˜Ž—”…px‚zˆ”˜œ‘„Œ—•—Ÿ‘НОF<11.4**€i941&$0,43.IrzbGW]Pavnv}|vb]{ƒ™ЄЇ”ˆ„‡‹„x‚……‘›ЃЛ{^v…–•iJ89G?A@,&&8522))CW[z–rn~^enxun||„qo˜œ—˜ЁЅz’ЃЂu}‹Ž”™rhА‹[B>JI??1()590%!-1;ZŽВБ—rux|~qedgm|}qЗНЂЊЎкЊ–Ÿ—pvrw}‰˜Ё•Œ‚}uWžž`;7C@745223><0&*-7Wvz‰opmY\mmcigajd{…Ў„|…Ј’‹””‡…u‚‚}‡‹Š„ƒ|aЄ‡i<$1@J5219??8%2*2^rW…Ž‚~jgmqjp]bn[”—zveg}‰ДЈЃ—‹…x~ˆz{ˆˆ„‚ˆ~Ÿ›~gW@@ZJ@IFB5,4,:?8%M]I{‡n[binjrrjit„‡‚„ƒx|‘ЖЃ”‹‘‹ˆˆ}б‚}v{ƒ‰‰ƒ}Š~U?87EEGB<>>75:,48CM”Љƒqjbd]EOvpomtvv€5ƒˆw‚ЄЃЅ’Ž’‚~‚~ˆ”’‚nq‘V8+8<:-(;>C>BEEA?>B<@v•Žƒƒ|S,Tkg`cqx‚‰‡…|}ƒˆ’˜‡Œ—Š…~ˆ…žВАЏžЗŽ„}S&->:.-41?”™•m`]hhbaca`u‚ˆƒ~‡—ЃЈ•Š—™‰x{}œЃžЃ•rwZ(0E2,;>@88)&)$%BN[m‹}rouqkeimgbv}}ŠˆŠŠŒ‹ЄЕЎŸ›žƒƒ”oœŽ–ЗŸ>&><:12.2153(14,&2355:8-+0:8?C@2,:N‚Œ{xoqqprrxƒ{~{}ƒ‰}v}ƒƒvp›ЁЎБЇxzxtmwŒ˜‡?081"+7588evzw|peddhhmqpghu|‡…‘Š|‚‡ˆ…ŸЧЛŒŽ•ЂЇxzwp[jƒ‘T.4?:EJQC:5>.29?@1*Im’ž…|vmcutqprjqu|x‚Œ…‰Š‹—ЩРЌx˜Ђ›–pqzrktŠЕЌY2>7EIE3!.(,&%)(>i‹‰vqx‚‚T^knnjnonqq‚••ŠŽŒžКДЎБАЊ™ŸЇ„{vtphvЃКw9+,(%72%#(4.15873,[‡ˆhgbtˆ’bb€гemproiqz‚‘žЅЋ˜••œЄЅ”ŽŸž{wwƒ{rqwc8B@?<>.+1747;9733*Awttwwqmacm||}vqpur›ЎВЈЂЅЈЈЏЈ‘˜œ’vqgnwognˆa120.+4;991%!Gz–zv|wohdinrimtxxuŒЄЗ|‡‘ЂЈЊ‰™}mmkkmumh‹„I+!0?B9(47;8844)$:n•ƒux}wPQ^bd^dtrpqx„‘‡{t„Š‘ŽŒŒУ‰ŒuenvcWbntŒ|?;E><3+%5949908C0"%,0,545>Hcvc`x‚‡…{w‡mVeg`]gqz}{{~——‰ˆЇРС^\Zgnu˜ЖДŒd[N7(1-0*&$$-5*")-EC;8Q`emz|zvvzz{upqognpttrkvŒ’Œ–ЌИН]bcYGONdw|}{`45:2-*!)*&,$%44Wx~}wxz{|~xwnvurnnoovxnnpntvi|Црheioc`Uaqx„`99:5),&$%!!**€!3]~{}~~}{|‚{n`kjbitx‚{xxtpvm^‚АЕ~xqopxndx…Ÿ’e*%#-!$!"1`…}„ƒŠ‘Œ‚wmq|ruv|zupheqwpr—Ш|}mbhjkeco‰—|;(5305+%2(-#*(.*Fr‡ˆvo}ƒ„„}|…wrw}ƒ}pmqr}~|…Ѓ}qdnvxvko‚‰p<"30#"-*%*$""CAJS]YMŠЌЛЊЅ’ИДпкабжкбЭЪдбШФЧЦТУУТЦЮадыЭœВЯуєцБЈУЦнg3;LOOLIJEA9:;>@3HE\ˆЋзнЖИЗ‘ЎЪШбднлзкрпмФгУСФЩЧЦЦШЪеЖЇЗзўў€КхзТИт^<`LIHLHC>514<<:>Cap‚ЊЌЉЇЇЊЦФЩажпсцсмсппНЕФШЮШУШЫарФДЁЮЭзЭЦЪЌЏўЕ\NOIGFGB;;<8BAECOPM;~зЛБЉЌЏЗНЮабзјцМИххьСФЯдеЭЦЩгесКЕЇсрдЯЭЮРЗТЏ@-78BAMHCPLIwдЧМmЂЛцаНжбШИЦшхпжЮзнлзШЧаетЂНРШбдаЮЮЫУЩНT[^MGA@CEHE@?ENSION@WФЛ~…ОекцмрИƒЌНШчычуеШЯаЭЩФУЩаКФФЦШЫЮбжзжСНY-:IMNIFJG@JGFHHNbc[tЉУкЧЌЪШЫЭЭкнЦОЧЭмтѓўѕюпЯдбЪШФЦЪЮЫЧШШагебЯОж’WSZSMGCBGGILCA>C@SV`—ИУНРУРНУЧШЭЦТОМЕИЪјщѓэхтаЪЛжћўпыйдЮЯггЮЩепЃSGWUPMLIHIOSGASSYPJMMFEIIJGGW]НщФЗБЌЊЈ•›ШНИЗСЧЪШШЦРШусррлзйлзЮЧШШШЪЯдеаЛЗжФk@C:9uЛЭВДИММИБЗКНЦЩмЩагбЫЧЫЯшўўдбмккзаЩЧЧенЧЪЭдлЇYFUTOFEE€ЛHIJGHIAE?Zn‘ЛгЦФЛЖЕЕЗЗЕВЖМЪЪЯгййждйшццусркеЩШЦШЮнКцгеюЭT+HgЇСЩУОЗЗОТУРИААДЮЮЩЭЮЯабдрпккмкЮИШСКЛЪьяшзлк^LII€[G>?850220;GLJ?ZЉФШШЫЫШФУРТСЖЕТТШШЩЫЯгбзпрзгездбЩжЩЫшЂНЭлйЦ•YFMMIFF@84;FЯзЪЩШЦООРНМСФШЧУСТЪЭабенркгжйкйаЛУЧгЕЛОТкшИrM9CA?CFE;@A?BLM—стЮЧНИИЛТШШТОРЛА‘ЄТШЮЯЯбзнммлсцёЫКЫЮНМАСЮйеЊaALUSLG@BCHHCAGHBP\ˆШжЫЧЌЇ™ЌЛНЛЛДБАРкѓцдЮЪЦЪлмлпррюЯТЪЫОИОблѓяОw@9OLGGC@??FIOZS„ЮмЦОАДЉЉБИЛНЗЋЉЉЖгяжаШСТФЭбзмппмЪВШЧОЛМЖСнюш™@7EBFGFFBJNPQSExЕМСОНЗЎЎДЛООМЕЗТМИдаТЪТСЩбжлкйтўшЮШЫМТМИБФгд•H7IGHGLJMMONUSNJMZvЎЭШЪЦОКИЗИКРЦЧЧШШУРРТТУЦШЯжкйймжгЯЯгУЧФЦЯхђћСYFSHLMIFCCEGLSMICLbВбЧЧЦСКЖБЖМОФЧТЧШЫЪЫЩЪСОУЭЮЕВкпмлнсчСТУФНОглКV2CGFGCFJLLJEGCC:7V™КЧШТЛДЋЊЎИИ€бЗККСЩЫЯЮбЮЩЧЫЯНк§ёЭелсуМРУОМЛФцЫk>CGMNWZWPMHC@FHTJGuБккЦСТМВБАИККИНРЦФЩЭггЪШЯЫеяхнЖЯеннТНЛЛКОЩєйtAMLLPIGG@G@8:9@G?GwЕЪЕЏВЛРбЈЉЏЗЕВДВЕИОЪйпрллйлтссмллкйЧШЩУТЛЖРЮ‚NWSLJBA?BEJIMMLIBEeЈЭИЗМСМДЎЋДЗЛМООННЛЫррцуйжкрцхпйаупЛКЛКИЛКИЧŽ>3LFFABA@IJLHGBA0;bЅкФСОТРЖЁЇЎЕБААИЛСШбгтёзУбжлпмзЭЧкРЖККДВЏДЕеМj9:STOGFCLNNJGBB24Z™ЫШОСЦУЗŽЃЄЎЌЊЏИНСУФФЭЪРРЭгбдедеЭжРЌЕБЉЉЎЕЛгЏ]22NOLJGFJHHLNPQOP\‚ЖРДНЩгЭБ‘ЁЇЁЉКЭЪШУТЦШУЈЩгежммКкмдсЌЏЎЅЈДЛСзДcP[LH?BEHMONLJMTUJTwЅЦФОЦФЮО’”ЅЗгмЯЫЪЦФФЩЦЛп§уплмлншаЩБАА€жЕЖЕИЪНvF8GE@>BAMJHEBFPP?\’ОЛОчзыеЫЛЕЗЛЭЪЧУТШУРНКЂИлнлжбзлмбТБЏЖКИЕБЖхсŒPBINIHEHNH@@:>HICL{ИОТФМЏНгФИКНЦУМИЛОЛКИБœЌССУЯбйнпкдЏДКЛИЖАЗлзŒE*NSOJFBA;8:;:?AEFGLE{ТЮЖНШУЗФЮМКИМКЕБАДКЖДБЗЛМЪЫжзгжпюНОИЋЊЎЄЋбхШ‚5(B>;9HFIC@FCCGL]’КЏВКОСЩЭЯгУ›ЇЄЋДБЎШЛИКНН‹Ж—ЋЭзннЎЋЎБЏВМФЪбТŽTMSUWTOMJHE?BEAB8:SŽВЈЌВЗНСФЫЯАžЅЈЎДААДКНОТЪЭОЖОЫтєчЌЈЏЕИЖМРОВВ”^CIJIHFF@;;@EILMNY^ŠЊЋЈССФФУЦгЕ›ЋЎЎ€LЋЌДИОСРЧгжеаЭпїыЈЅЈЈЏЕгтсУЉ’qF>FFB@;:9;BJH@FZ\Qh‘ЅЋБЛРСНРСНККИЗВАДЗИЛКЛЏНежежрьщАЎЋЄŽЅНЧУД…INPNGB?779;ANAT‰ИЦСУЦЦУЦФНИЖКЖВЏБЛУТРОРМНМИžАйыКЖЕББЌЏЎВИжЦŠA(>AB@@8795873:?>9H‡КЪТУШЫЮаЭЦНМСТНЕКРУФРКБЏВКНИАбљУНДЏАБЋЇЎЗдеЇU?QJC3;992+1BC?aŸУШЛММНФЫШЦУУШФУРРЩЫЧНИББЗКССЩцСНЕЏБМНБЊЊСЭЅZ<]MJkpmhjpŠŽœœЌАНДЖИЛЖЖŒ}ˆ–‘”Ž›Ѕ|v›ЂЌ›Ž‘r{с˜^WTLMJIJA:>;?FISLMI0bŸ‹pw‚ƒ‹‰™˜™ЈрФŒСЪЮ‰œЈЄŽ˜ЁЎЌ‚jЋЅœŽƒ„’20>LFEFGF@B>49HFEFNAbœŒ…e>@p~ЖЄŽЎВœ„‘ИЛСЊŸЉЋЈž™ЏЎv„˜Ђ›‘˜‘’‹˜Sb[MHMG;ECEE:ILEHOP>GnŒ}AJ‡ЂЋВЏЎ…T„Š˜МТЫЦЅ‘•™ž‹‚ŒœЅ‚•‡’––›ЃЉЅ”–G,;OANAECLALIMEGL[iUd~ˆЊœu›–Ž›žЉŸŒƒ‰”ВВжчЮЧЎ™Є•”‹Ž”‹’›”Ž”ЃЇ›’‹БU`aMJEIEJIUNB7344JUTk‡Œƒ……ƒ‰•‘”‰|‚ŠЃлажаВЕЄ™‡ЕзчИЭДЄ›œЃЂЃ–ЄЎ…UM`OPMIIJSYTM>@AF\Z{Ї‰ƒ‰–„xxˆ—‹ƒ‰‰ˆŸЁЋЩИЄ”ЎЈ”—ŒЏЗЕДЋЅ˜œЄ›ЪјРqSj][VFSTOOGG;HFNJ\|Ž”–Šˆ|„ˆ•›‘‘ŒŽЋДДЖЏЅЈЂŒˆЁ›ЅЊКЏЂ”™Ÿ›ЁУЕL0MPE@LHGPSrАаЯБ‹Š‘‡„‚‚x}ŒŒ‡ймКТЭњФББЌ}Œ”ЌЗЎЃž‚}ЇВБvPL]bTCC>ATTVIA>AEq–Ž‚…wu|„v|tzƒ}”œЇЛ‘‘œКЄЊЉЅ››’•—•‘ЂЃЇœ˜ЈЖ™L72`Z[OLOOSWLVFNHxo™ЄŒ}~„}…w{}pžЋ„nu‰ЁЦФНДЁ™Ž›’Šœž™ЁЂ‘ЗЛ–nTVud\]bVOFNNPSO>Zk]Ћ–‡u|z‚‚‡ˆ‡u‘™™–€П™ЏбНЃЃЂЁ—™›‘ˆŽ‘˜ЁЃЂ‘Ѓ•wOFPPTYOLHNNSONTMS\ЈМŽƒ‚zvu[d‹‡~‡ŠŒˆ’”™ˆ˜ЛМЛЛВЌЈЅЄ—•˜˜”ЂЄЊ•„ˆЎЉnGGPOMSPOOPS[VTNTLIpŸ‡‚pdP^avz{|‡‡Œ•ˆ‡КаДЂЃЈЕБЌœ‰–ЁЋБЕДŠ›УКa8FU]\WYSHPMTJGQNGZMm}ЁŸ•qanmzz|ˆŽœŸ’ˆw}ЄУЉŸ˜˜Ÿ——ЃЉЉЩОФДЈ”Ђ’bGITZ[\PQNTNUTYVQaSIŠЊЇž‰`Cq~‚u„Œ’žž˜‹ŒŠЁЎЁЁЉЎЇ˜–•ДШШЪБЭЈ™—k9PZ^VWLLY`OVSPPOMGQ’ЏЋЇЌЈwjvz}wu{ux‹•œ’”œЏСРА—ЂАЋ”‹˜АЛИЛЅŸ…˜k9NUYQTNGFUJQOOFHQIA^nndxwˆ{wwvtxƒ™–˜ЌЏЁ––˜АЗ”w|ЃЃ––Š’ЁВ˜—ŒВНŠVE8PIG@HEOSNJHIBA:8`’|}}Љƒxz}Ž‹•Ј’›БЇ•‘–˜МучЅЃБЗЅЏЖ™‘œЈА˜˜ЄЈ…OJ[YUNHJCNQNBB>IC@VUk›…‚„v{}}xvˆ˜”ŸЃž˜ЂЗЫРВВЕЎЃ”‘››Б‡КЇЌаЏJ-7QONELJLIIGGJHHBWkz”Ї˜‹zo~|xpz”•Œ•ЉЇЃЈЂВФМЖБИСА˜˜„‰‡™ЈНЋ™Ъзw@37BLIJIOIB91>P@8CLPF;GzŒ’˜™˜—‰„…ŠxvŽŽ‘—ž–˜™ЄЇКНЈ•ЁЈЊ™—ЂœžСn„’ЌЌmNBJPNHMBCCF>>EG;:J|—›ˆ‰Ž—ep}ƒƒ}‡Š‡ŒžВЊЄЂЋФУЪЪЧНИЕЗ–‹~Оа‰H?CINMHGEFHGNIIN?IgžŸ|xƒ™v|{{‚x„~Š•ЉБЛНАЅЋАЖОРЏЉБАސŒ”‰…~ŒЂnHZVQMTOFMNMNGJNMG@O’ЈŽ‰…‡Ž|wt{‹‡Š‹Š‰……›ЕСУЕВЎАКНТТЉЌЗЈ‡‚{…‚}…•p83GMLNALILMM€eJIA!5ZŒЉ”ŽŽˆ~x|w}u‚‹žЁИШЏ–žЎНФРВЁЌ•z…~‡|~›–];;QTYPIFNQQOJEA4>QЂ”„Ž‘”Šegpwzt~„Љ‡Š—Ёœ‹‰—ŸЄЄЂЇЂžœŒq}…umt|—ŒL-1SUUTLJLINHPOVNUTk‡Š‘™ž”|Zgker„–—‰ˆ”Œp’œЁЌДВАЕОДИutmopz‡Ÿ‹UTWIBMHGFGPTOMTUTI?]{Œ’žb]nŒЃЋœ””™—˜˜‹СчФЖБВОЗЭЊ—~xu}}{‚˜mE;GE;ACGOOMEFTZVBT„›…‰ОУжВЈ‰‡•”ŒŒ•˜‘‰Š„mЗИЏЃЌСЦЏ~~„ƒ{w‡РЪLEOQSJMMQGF4BEIGMGo’‹‹™„‰Ї™~|‡ž‹~~ƒ‰Š…|ht‡Œ‘œžЋИСЊЈnn}ƒ„xŠЏЊv<$NYYUSH?9A@ACHIEEmЇЃ~uƒЉЧБmkwtŽ›˜‘pvnqmtx‹ЇЃЄž‘НжеЪ~Œ—krxƒ”{MEe\UPTGE@:;AEGHHAASttkwŸ•|eopnƒ‘Ž{nwptz|ƒ‰БЗЕАУШЧЧv‡‹‚vŠ–ЁАže.IUa@A??HA;FCOMJCJPPUFAd‰reoЃЅЋЇ‡z{}~~{v{‚Œ…ƒ‹˜””œЊЊ€rКт—”|{}‰˜ЃžА–oSFJOHJF>C;8GJLT[\Pe‚qruŠ˜œ‰rwxzxwupjo|z{‹”‹’›ЕИЗФг}vv}Ї‡‰ž•b3;Sa[TGIFA8?BIAN78VЅЂƒxˆ‰‹”ŽŒtvx{zvhpqx‹ŠŒ…ˆ‡•ИгЩРzvuxw}‹ЄŸwC@TSSGIJMFJOGHMLINSx‚{‚ˆˆ‘•™—Ј”hdoz‚}v•ˆ…ˆ–‰gЃБДСvuxx™›ЄŒqLMUUQYWOJLBFC>F;Io‘Œ‘ŽŽ’Œƒ}q~‹’‹ˆ‡‹ˆ‚o‹КШ‰Š„‡|zt’ЌŸr5%EOIHHCC>EI;<4AGMAZ‚ž›ŒŒŠŽ‘’—’‘”’Š}Œ’–’ƒ{{ƒ…‡‹Œ˜Оސ„|ˆ‡ƒv|‘œƒP4LHJCECAFF›B@Uh[Q]ЅЇ‘Œ–’ˆ‚ˆ”•‘’•”„~|‰Š•‹‹ƒž…‰v{Œ‹~rvtˆ‡P$:AAEHOHNQQS:Oa[TtŸ””Šˆƒut~‡‡Šƒwpwwru…‹ŽŽџз}|}„‚‡•’…‡БЪЁ[;EOGFJLL@@CPTUSI@B?Щ§§љљ§§ћњ§ћњ§§Ућљњјњјћћњ§љјљћ}{kndЉ—‹{‡ЏцСM:2EY]UL>>CAFEHPQ``‘љ§ѕѓєѕѕїїѕјјњојћћљћ§§њ§§њ§§mtvruvЈœ‚{iЁгЫЋj9@HMMфLGGCA@5A<>VSmхћ§ћ§ћћјљћјїјјћћјјљљјјљ§њњЪchu}‹˜ЏЂ‡‡„‡ŽЈЏ›JMQWY\SFGCGHLFdhq\bЕљћљљћљњљјјљјћљ§јљљмјљїїњїїjtqz””’އЁ{ˆКЖЁkUZSZULB@AENNїE@MO-\ьћѕѕќїѕїјјњЫїєїїњјѓљѕѕїїqhq{~••މƒ|‚›агЂ\F@JNOPNNGBMNGE@GGHTУћ§їїўљїїѕїѓѕєїјјћљјјд„zz|}|Š‰’Š„ЅЏМВž‰^BHYg]OHFCC<7CENOEJ~ђ§ћїїљљєјћјїјњњљјљњљљћдљ~{z‡‡„‰~tr‡wœЃДЎ–ŒdT‰^+1?>BC1+!B]L2BGЈћ§јљљћэљћћ§љњ§њ§§њћљћћљћnooйxŠŽxrrВzv’ЗЅ{[>dtM<@9@@<<*3NIB85wћћ§њњјўњјјњћљњ§§ћћњ§јwvvй„ŽŽowvm]PtЗЃxoeuN>-@??C@EC;9NNUT`аћ§їїрњјјњњјјњјїљѕѕїњјљћћb8Zgm’ˆ…„}}…рИБ‹dA8HI>;53BCHIQV[<7xљћјљјїљјљљФћљјїњљћћљљћ„ebnЏŸ™…zko|xu‚—ЌЩН•]QULC1,78EIB,BaQBAVй§§їїѕїјљљЖјїћћљћљњ§љљћњi@4N”ЗЄŽƒ~xnw|rtqx‹›’mZVH7--::903;FNJCLO‘љ§љїљїјљљњ§ћїїјјљљћјј€Иљq{ojabwƒrxz}˜Žt{ƒЎУВVTQIA5A720(&4;>:IQdмљ§їїјћћњ§њћљјјћ§§ћњњљћhqw`Wa}›Ž…ŽЇŽ@UЉудƘmIEAC7;9+)(;JFJSZ:A‡ыћћјљњљњћћјњјјїїњњїјљ§jwui^aj|}}ƒ–ŠHYŒœˆ‡wHAQGEPEA9E?@GNIJPVPљћљѕїѕїјљћљљЧњћљћљљћћ‚|}xqjuˆ‹„vqvz‰‰z’‰|‰Ђ}VUICC>7-217HIMOWI>Yйћљѕљјјљљћљљћјїї€ѕєјћŠ‡ƒvchƒŒ~nnrvzx~‚ˆЗЇYE0%9IH?8>@CNSVSJVU—ћћѕєѕїњјїјњћљћљћљљ§њutv{zwxˆŒtqw~{{|}’—œСЪŒ`N^HNHB9>?>HLLHPUHhыћљїїљћћљћћљћјљљњјљј”wtzvrph}Š’ƒ‚xqjuЌЈАЪША{VNLPUOOPSOOTMIIHLOНјћїјјћљјљљћ§њњљј§§ћЈЃƒjtjqp‚’ˆ‚||jtˆЃЏЇДЧ‰^?9?A@@CHVj^{щ§§љѕѕјћљїћ§ў§њ§§њБЃeuz}~„…‡ˆwoknoЂЇЇЉЗ–]>FVJ7CJTG@B;EI^TCI›ћћѕїјњјњїљћљњњ§ћћ§ЌАq]w{ˆ‡ƒ‡„‘Ђ‡vnnr•ЂЃЉЉ›a@S[OAHHQMNGCJLTVQGeцћўјћћјњ§њ§§љљћћХЅЋ„tŠŒ‚}{ƒ˜ЇЇoiptw{…›ЄЉ}Zd^t^:85BIMMJMMLJAQIqјљјїѓїїј‚њјљћњ§ў‰—Њxou}{‚Š•›Жˆ`hv}z|tˆ‰”ЖСЏ…db[JF?BAFAFBC[aAћћ€…їљћљљїљћћœˆƒ…ŠŒ‹‘ŒŠƒ‹”•”•to{|„‡‚ƒАШкдЩЂ\Lb`WQJHHJIEANJOW;PЈј§јљјјњїїћћ…w„Š••Ž•Ž|„|wzv}||ƒ‹‹Ž‡ЊТЧаСАuLHYZPHCMJIHGJON^MN~ј§їѓїјљљћљŠ~|‚‰ˆ‚‚‹‚~ƒƒwnkwwxˆ‰Œˆ‹ЖЪпунЈ[HVYOIFAH<>ECFJCMI`л§ћѕјјћјњїјŠŒˆ~Œˆƒ„…}xojkignwvƒ™ˆ}vtЇЩцлеФNEHLE;@CCE9@BFJJBE˜ћ§њњћљјј…љwir„Ž–Œˆ‡‰‚zrppjkkpz‰–—Šud\ˆЊЛЧСФ’BJ[I@?A?HJEAA@O\FAgэ§њјјїљћљћTcv|Œ‘މ„Ž•”•—…hekivŽŠ…’„uoЄБСгЦА[BVQCA7BMQLL@,F[QUgбјћїїљ§ƒ>&G•Ѕ•ˆ‹‹Ž‡{hcgkqw~‡‚}„vqi‚ЁЕЦСОQJOG>;AFE?GGANmnWgЇј§ѕёђєѕјљz*,~‹’’‰…‰‡~rqj|Š•„vz~|vx„ЄЇЎТЯдК\PYL?ABHHEOQ[`d\Vb—љ§јљєјјтћ˜zeŠƒjv‡ˆ„}~u––’mpxzr„ЌЃНЗУЭvQkTNIAICCFMHWac^JkгћўјїјјћљƒmJduwvwruwƒriVev‰Œ|[^\oz}~˜ОеЧльК\F88AIIFBHIMWUUњOBЇљљїї‚њјЄŸˆmz„‚vjw‚„vq}„‰‰‹~wtv‡ˆƒ‡ŠЎКФпЪ‘\IE;AGGCFHFNHJM`džјћљїѕјњј’‚‚vr…ŽvvwƒœЇ’rgpv{vphkž‘‡ŽТЧИНШШЋa<)5AEFFLNNIBJZMLuаћ§їїъњЁŠunor„–•‹ˆ‘САЌЌЖ‹rv~~лqjVx”{c{ИИЛМЧСvF84ACG<>CEALONCILАћћїїРњјЊŽv}x„”‡{ŠЅž…twwx|ƒ~oPx˜”xQnЁШЕВНлрH@-@>7:AFFHLPNCGB”ј§љјїї€ОЦАŸ‰‚‚ˆ›„„Ž‹‰…~Š‰xwЌœzov‡ЉЩШЮмРwLWAAB:JGЂјљѕїїТЃ‹…‰{q‹•pz…„|rmqjqnqwzx}}|kbgVjžЪнчєчŠE<11Eb^PGLFACQTjaŽёћњїїТВЄ’|}}Љ‰Œ”‹~~{w‚~vx~‰™œŒtvqxƒ–НаЦЏm@C^WVWVNPH:;ALG^Uoхћњїї€БЦЗЌ|}‚~„ސžˆ•КВvwr‹›ЈЖЊŠ}{p^uЇЫсщЋPHMLLO]]WT47…љ§ћљњЭŸ}‰~rnv{‚‹„‡›–‹„„‚ƒ~wz‰Ž~~ŠžœŽ‡ЇЯЛРкмŽOYTLECF;LQTTUSQ\Ptг§њѓѕЅ•ˆЇ|ƒ‚‚„u…‡‰–”‹’—Ž{q~ƒ{ŒœЎЄЁЅЁЅИжгdOGBBA8HQMLMF7[Зћ§єѕАЂЊЧНЃ—ˆ|xxm]erˆ‘Ž~|~zwzz{„‰”ЉЏЁ…ˆЌМгуШTPHEBE7<‰ј§њїЁŸЃЌАЃŒ{|ˆ‰|‚’Š„}~‹”‘qotv‚‡znimt{ŠВйђдˆGI<<@CBI@MTNJHMCPjйћ§ѕŸЇАМЪЌw`ux‚„ƒ‚Œ|{‡•’qL]m„kkxƒ‹‰›ЗЪЇcZ\PHG??ГBIFNWTFS\Бћћї—™ЌТРЄv\knxƒ‡{u‚ŠŽ’‰~ЁzPdw{”•m™›’ŽЃСРqVIBB<44;G?AGJM??G‹љ§єеЭЧСОРФЭдгаШЪслЃaAUYNHLJM@?ILVYVG@C@Цўўћћ§ћ§§ўњ§§ћњЪљњћњ§ћћњћњШСКВŸЧседЭЫЫхўб‡PB8JSa[MA;@AAHMQVde•ўўјїїјњљљњљіњћњћњ§ћ§ћ§§бћИЖЗКЎАнгЮФЦЏаязЌe;BQLNLFFGLF:BFAI]^}юўўњ§њћњћњњѕћњћњ§ћћњњћ§§ўДННЮЩЮЯЯЫЩЪШЫЯЦЌŠSVVQTVNJFHJOIVgtwbgЖўўћћњћ§ћњњћ§њћћ§ћћћњјљћљљдЖЛНРгЫЯгбаЯЭЮзкЮЉr[^YYZPGEGIOZSHBLO0^ѓў§њљјљљњўљћћћњљњњјјљзМДОТЦЪЮбЭЪЪЭШрєђИmNIOOUUWPLHHSLCIHHMSЦўўљљўјљљјљњћњљгЯЧФУЧШШоЦЩЫзрьтТžeMQdraVMNNJGB@LPQIO}§ўўњћћє§ћњћњњљћ§ћљћћвњћћЫЭЫЩШШТОРУТБЮзцызЌ–k^Œe1:>HUI:5!@dO7GIЊўўњћћўњћћЩњ§ў§ћ§ћ§§ћћњњћњЦРССЦТОЛИРЭђЭМжюЩ‹\Fo{E99A?9;;09SF?9:xўў§њљњњўљњњШ§ћћ§ћ§њћњњ§§ћФНЛОФЧЦССОУСЅœОщЪ™ƒpivV<3EE@@ELJG?ITTUgжўўљљњўљњњќљјњљљюњћњњВ‡ВЎБЪЭЭЦУРОФУУсЪЛŒhF98;>FHB3AiW>F[лўўљљўњћћќ§ћњћћў§ћће§АxoœЮюугЧНМСЛЛОИВЋЏДœn[YJ<;:;>AC;:EUVBPU˜ўў№ћјљњћћ§ћћњљњњћћњњЭћОУЗЏЊЉМЩЩШОСШсзЖСРЭеЗ~TVQFB@?<738-*CB8VWmпўўљљњњћ§§ћњћН§њњљћњКОКЕЏЅРнЮЪЩЮгчЧƒхўмМ–jIAC?<>:9+,AGMLSaAC‹ѓўўњћ§ў§ћњњљњњћњљљћћїЛЗЕАЋЋЊТЦЦчЩЪпл‰H–МБ’FGVLJYAH;?HIHHіI5@Zдўўљљњњљљњћњћћ§ћћвњћТНИЖДЖЌеЧУОНУЮмН–КкЩЃЄЁ`MVTY]a?BGJHLOLMQ^U…ўўњњљњљњћћЧ§њћњћћњњЪШФОЛЖКЦЮЧМЖМЧШЮРкрРž”Љ{\TNJE8>909A]b‚’їўўљљњњ€ћ§ћњљљребЯЯЧРКЛСЧРИЈЌДЖМТФЫЫЪЧУШнЦgIeZSLHNMSVVUQMAAIIJЁўўњћњњљћћ§ћњљњњжгжжгЭСНМСТОЕЖКНТУФФЪЫЪЩШЦан–UVV;JAFJPVVWVQJQQNHѕўўћ§§ћ§§њњШћйлкзбЩНИКОТРЖДЖЗЛЛИНЩЮгббЮЯжО~khdZIJLOQOLJGEHJAZmФўўљљћћХњћњћћезжеЮРКЗАБЖМФРРОРЖЕИФЪЪШЧелэњКbN^YSJLJJCHIFCGPL^Ihўў§љљТћњ§§ћ§ћЧЪЩЮЭЮмЌŒЄЈЃОШШЩЦУННЩЫЫЧАйыщѓеƒMELMJHPQSLGEMPSB?:Vхўўјљљ§њљњњѕћФФЫЭЮайТБААшУЩЫЪШЧМА—ДЭЧШсэпчьФpJHMOOЏTPMJFJOPM`C4žўў§ћћ§ћ§ћћњћ§ЭаЮЮааЮШУИЖЛУШЧУЦСАДБШыылезйёїлˆPTVTPMPIAHNQTUQ\`@aцўўњњгћклкдаабаЩООЫгежерЫФРСЪтггЯНЖмўјЌd[bZNMMFBBLNNіLTeZ1ˆўўљњњХћњћњћљнкегежггЯЩШЫшпллжЭЛНЖЈЫеЮЫЛЖйљўрqCIN^WTICCFCHGGPcjAўўќљћњћћƒњпйдааЯббгЯЦЧЯждЮЭжРКЖВРЪЯЯШуђљёчЏ^Odb]UPIMPNJLGLP\@UЏўўњћњњљћњћњЮУЫбдйзгЮЪЧУЫЯЮЛОСТЛМУЩЮгЮСбххыхЩvMIZVPGJONMPOIJQdNJўўљњљњћћХњћзЮЦФЮддЮФТСЦТСОМИЖЖМФЭдгбЭЩбчюјўяЋ^IVPPMJFGLHEHGF?NHdсўўњњРљћњжЭЩЪЪЯаЫЧФУСКВВБАЏЖОЛЯжбЮЧОИйэєђыЭ|LIIJFC@EBA@9AEGFAEŸўў§љњћњњХћОЉЖШЮжжгЫЭЮЮЦЛЏАЋЋДЗЗЩббеНЈœСжкурлœEM\NCE@ABLIABBHdHCeѓўўњњРћњћњ’•КШгзеЩФЧЯгЭкЫВЊЌЕУЩЮЭЩгФЖЊЮзйнєщО]FOVJ>?BLSTIH7G[UZmжўўљљћћє§ћrJwмёзжгЩЫЫаФБЈАВЗМЦЫШУШШФИЉСЯдкчтк›[MQMA@FJIHHMBSqt\nЎўўјјљљСњћЌUPЕЩЩббЯЫЧЦСКЗЕЧФЧаЪЦРТФНКЩьнгзлыѓШbSdOLHHIMSTWYdn[^^œўўњјћњњУйСБЯЮЗЩЭЫФТЩШОТЧЪаддбШОЛСРНОЭЮЧЮккщх}TpZOHMEHLNOO\ee^OjеўўњћњњФћЧЕДКРФФУНМТШЧОКЉБЗЯаЧЇЗИМССТШЫуэуљўТgN:9IJGJNHJS[aYWWGЇўўљљƒњтнФЎОЦЫЪЦНЛОЩЪЧРМФЩЭЫЧНЛЛТШЪЫЪШдЮйхѓп—dJF@CFIJNNQOOIMgcŸўўћљњњљњгЦШЛЛСУЮЮШЕМСЫуьрУЏЛНМНЗДЄйЮЭЪЮщымлххИi<-AAGIJJOOHGITLO{йўўљљФпЯДИЖЛФЮгбабюзкжчгДЛНТРНББгУЏИдлжейщЯwG:4>AFC;EIGCHOFLNВўўљљСњнЫРЕОФЭбеЭЧЦапЯСЛУНРФУРЕ—ЗжгЛ—Ўнѓйззєщ˜L;2ABC@@GMMQUSGLC–ўўћњљљДѕцйЭЩЪЮгбЮЧЩЭЭЫШШУРМФШЦРАзэпРБЕЦлчучљйŒPZCFBAEGJMMNUZYPQzѕўћњљњњыћцаЭЮдждЮаее€ˆЮЫЩФОРЫЫЦМНФЯбаЮдажЯгняяЛcQMB@CSVTOPLIPYjziйўўњћћљёшезгджжсСЦЩаббЮЮЪШТРРОМОТЫхЩОЗБЦкцтынЪƒcU5;,FWNFGGHHAESIЉўўњљљњлЯЮЪУФЫбдЧТТШЧУСОКМЛОММкСРФСАЇЎ”ЃФчєѕўѓ‘I:33Ig[PUULGLSUa\”њў§љљТщпдОУЦЪЪЭЫЪадЯУФУТУРУТУЧеЮезЦЏЖДКОЭрчтЯ{BMYTZ\[WQPA>BNJgZpшўўљљ„ђылКШЧЧФЩаллзгЮЫрѓьСОНУЩдйлюсЩЩСНЌЮсѕўКSPZPP[^b^W4?CJh…U;ˆўўјјљѕчЯСЩШФУЩбзкйбааежЮАФЦШЫгйеЭЪабЯЮНекЯуњЫcHgLGHHTZWVWTIPJ;8ŠўўљјбЖЭЧРООУЮЯЮЪЧШЯаЯЪЪЭЪЧФЧЧЦФФЯегжЭтњнмёы•W`PNHCFMELUZZTO`Qvкў§јјлЦУхнОЧЦЧШЪЦНИЦЭЯбагбЮШРННТЦЧЭежнпмкжешсЎmV?’ўў§љрптунлзЩЧЧЦФУФЭеЯЮШЦЧЫЭдВЖЗТЧЪСЖЏЌКМЩпєљн‘OF?@?FNIHINSOMLFJkрўўљпмцшїпВКСЦЩЭЩЩШЯЫЩУФЦЩаБ”ЕНЧЧСНКОЧЩТУУЯйБi[[WMFC@EMJJT\YG[`ДўўљемтюђлЏЁДКСЩЪЦССШгаЭЪЫЭрК•ЕНРлнЭВОнаЭШЩЧпа|QO>GA;:BFFAHSJ>@F‹ўўћг˜’Ž—œЄЎЅЂ›™УаЄjJcc^WU``P^^dcoobPWTзўўћ§§ў§ў§§Пўћ§њћћўћ§§ў§ћ§§—|qЃНЌЅ™‘ŸЧја‹VJAS^gg`WYTOWc^eh{Ўўўљњјћњ§њ§ћћњћћЭ§ћ§§ў§ў§ў§ў‚Œ„‚ƒНЌ—•ЖсеЖqHQ^`b`g]a]U[SYSVuoŒћўў§§ћ§Шћўњћћ§ћ§ћ§§ћћ§§ў§ўz…’ЁЎИБŸž˜’ŸЖОЇ‚[^edokd\[Wa]ge…ƒwvЩўў§іўћўћ§ћ§§ў§§ћњзўњњƒ‡„ЃЅЊЇžž”žЏУШАgpnnukZ`\\bjn^Qc]>T`Sgo~ьўўњ§ћ§ћў§ўћ§ћћФў§§њћћ§}}xuz•ЖЅЊ›—žЗžUdЧєкЕžrWUPNQJPGITMV]`oqQSžћўўћћў§ўћ§ћћўўћћЮўћўƒŠ~xix}‘•œЋЅV"nžЅˆŠNPe[`aUTJL[]aaZZLSiмўўњћћєўњ§њћћ§ћў§ў§§гўŽ{||ЌЃ‹ƒœЉ‰`ŠЅЌ—›ЁePjeih{TQVZ\]ZYZdrg—ўў§њ§њњ§§ћ§ §Ч’‹…œЃœŠ‚А˜Ђ‹ЌЕ˜‹•Ў‡eia[YMLUOMTbhdeteUjыўўљ§ћћњ§ћ§ћ§ћћщўћў§§ЄŸž•ƒz}’Ÿ‰~}‚„‹‘””р—žЖЏj[C>]adVIUSZhinmcumЎўўљћњ§њћћУ§ћ§ћ§§ў§ў’ˆƒ’‹‰™Ё‘ƒŠ‰Ž’‹ЉЇЇЧа—pd{ceg^NT[\\gd^do^}њўўњћ§ћ§§ўћ§§Фћ§ћў§ўЌ’„Œ‡ˆƒ–ЄЄ˜–”Ї}ŽСЗУлгИ‡ecijoggjoggh`^hbbdеўўњњћћ§ћ§§ўў§§Яў§ўНМ}ˆ…‡—ЅЂžŒŠ‡‰ЃœЂИСЕМЪ•uU-[WZQch`ZTPciq‰}‘ўўіњћљ§ћ§§ў§ўўШ§ў§ўФД{ŒŒ‹”›˜——Ž{……”ЗАОЕЎНœhQUjb`[ceVQQOYevj][Џўўњ§њћћљ§ћ§§ў§ўў€АЩЯƒpŠ˜—•”™ЉИ™‡ƒ‡„ЂЇЌАВЌЅqPeueQ\`c]VWN^cgdaW}ѕўўћћ§ћ§ўў§ў§§ћ§ћ§ИР”ˆ—œ˜’’˜ЌЗБ•ƒ‡…ŽˆœЅДЗЄЏ‰epw”oJVZ\YaY^begcrvжўўћћўћ§њўњћљ§њ§њ§БЋœ…’˜˜•–˜Ё–ž‡}ˆ’”ЄЊКЭЫЇdZnm[@§§ћљњћљљњњ§§ўўњ§ў§§ћјјњљћћњјћћљљћњ§њѕ§§љљ§љ§§љњњњћљњљї§§юЩOB:A.#ћљљјњљљћ§њ§§іњўў§њљћћљћћйљћљљћ§ћћјњљћ§њћ§њћјћњјњїѕў§ћОa4?G?9;јљћћў§љљћћљћљјјљћЬјћљњљћјњљ§ћћ§њћћњњјјћћљјљљњњћћљћ§ш\N;;BAAEљћљћљћљљћћ§ћћљњ§ћћ§ўљћћ§§њћљљмћ§§њљљњњ§ћљљјјї§§сV,GG<0EBMgљљћ§љљїљљўј§§љї§њњ§љњ§њ§§яњ§ћјјњљњћјћњ§§љљјј№ў§ћчŒF7@&?@FJIB§§ћњћљњ§§їњўў§ї§њ§ћћ§ўћ§§јњ§§љјєљћћпљћїјњјјћїњ§§Ъ]8><@;?;9FCH§љљњїјљњњ§ћњ§§њ§§ѓњћљљїјњјїјћњ§§§љћљљшћњїѕїѕ§ћнV1?B);5598-.&љњњќ§ћљћћјћњћћљћћўљ§§љњћњњћњ§§ўќ§љњћћјўђ§ц~B38GHG:<8;..щ§њ§§љњћљјњњј§§љљћјљћ§ў§§ћѕњєјљћћљљњ§ўўњхљћљј§§Ъe82.43158;4;CFFћћљљћћљяћљћ§§ўў§§ћњљїїњћ§§ђљњњўњ§њњ§§ћћ§ћћхдn3$B]0-78:44?9љљћљћћ§§њ§§ћњїјђєєјњљћ§§њћљњєћљљќїѕїјјч§ћйW8+9L`SSe938C<@3ћћ§§љљјўљјјњњћњљљћћ§іћјјїїјїњњјјщњјљнd]G3SGCIILF7,.?5A^ћћљ§їњ§§ћћјњјћћ§Мњљљјїїјљ§§ћјњјњћћ§§њўћћОm95?AA((3+91-&$ћћљљјћћїљјљћћњћљљ§ўћў§§јљћћйљњњћћљћћљљћњјћћуgbL9?@**$0973:,$$&љљћћљњїјљћ§љљћФј§§њћћ§§њњљћљљћћњјњїјѕїї§ћљƒOFHNLM`+43:AB82*788;јїћ§ћљћ§§ћћљљјёњїљјњњјњћћ§љћћљљоћњњѕѕљћ.375MOMG7?@>FM<0$:^POћћњ§ћћљ§јњћћШњћјїјћћњћњјњјјљћ§ћћјљїѕєћћљЊYV]PSW]PINSP@?SW-4&AI@јїїљѓјјуєјљћјљћљљћћљћћѕљљћљћњјјїљћјј§§цЎZ:%,NgQPGAGJMBFIP[OFN}‰јњњїіљјћјљљћљњ§§ќљјћ§§ићјјљњ§§њњћјћ§ћЅFE<>8@>EFCAIEA-9H>ig,F–‰§§њћљјјњљљщћјљ§§јћњљљјњ§љјљљјљїјљћћк‰09@AEGAB:CBGECBE7*99O]Јхдћїњјљјјљњ§њљљћћјћћљћћюњћњјњў§ћнq;?94AQNAAь94+44GEGHEaŸгяэљњјњћћў§њњ§ўћљљСћјјїјјћјљљјјѕїїѕ§§й^3E@7:EJNHFI92073IYB@AЃѓёйЭћјљћљћњњћћ§§њљљњ§§ўљћћ§љћ§§јњс§ћћЋt\YY<5AAFB@WPБјєеб§§ўћ§§§ћ§ћћћ§њљјљљњш§ћ§њћњ§ћў§§ћћњћћ§§ўћћњњћћ§§ћўўў§ўў§ўюћўћ§ћ§ћ§§ў§ўћћњ§ћ§§ќћўў§§ћ§њ§ўўњћ§ћ§§ўў§ўр§ћћњћћ§§њ§§ўћ§ћ§ћ§ћњњћћ§ћ§ћ§ћў§ўўѓ§ћ§§ў§§ћ§§ўў§§ђњћњ§ћ§§њљћњ§ћ§§іћў§ў§ўћ§§ўўіћ§њ§ћ§њћћ§§ќћ§ћўў§ўћўўћ§њў§ўў§ћ§§њћњњљ§ћўћ§§ўў§§ћ§§іћ§ћ§ћ§§ўћ§§јў§ћ§ўў§ўўљ§ў§ўћ§ћћ§ўўћ§§юћў§ў§ў§§ћ§ћ§њћњў§ўўўћўўў§ўў§ўћўўћћњћњ§§њяљћћ§ћ§ћ§§ў§ў§ўћ§ўўјћ§ћ§њћњўў§ўћў§ўўћћў§ў§§ўў§§оў§ўў§ў§ўћњњ§ћў§ў§§ћ§ћ§њљљ§ћћњћћ§ћ§§ёў§ўћ§ћ§§ўћ§ћўћ§§јћ§њ§ћ§ћўўќ§ўћ§§ћў§§ћўўў§ўўц§ў§§њњљ§ћњњ§ћў§ў§§ћћњћ§§ћ§§јў§ћ§ћ§ћ§§ўћўўы§ўћ§ћ§ћ§ћњћћњћ§§ћ§ћ§ўў§їў§ў§§ћўћ§§ћњ§§њћћэ§ћўћ§ћў§ў§§ћ§§ўћ§§ўў§јћў§ў§ћћ§§ћцњ§§ў§ўў§ћўћ§§ћњњћў§ўћ§ћ§ў§§јў§ў§ў§§ћћіўћ§§ћњ§ћ§ўў§ўў§ўўњ§ўћў§ўўі§ўћ§§ўћў§ўў§љў§§њћћ§§ўћ§§іћ§ћўћ§ћ§ћ§§ћћў§ћ§§ўњ§§ўў§ўўјћ§ћ§ћ§ћўў№§ў§ћ§ў§ўў§ћ§ћ§ћ§§њћ§ћ§ћ§§юћ§њћњћњћљћњњћ§§ў§ўў№ћ§ћ§ћ§ћ§ћ§ћ§њћћўўє§ў§ў§§ћў§ў§ўў§ў§єћњћћ§§њћћњ§ћћўў§§ћ§ў§ўћ§§љњ§ћ§§ћ§§§ћ§ўў§ќћў§ўўќ§ў§ўўў§ўўўћўўќ§ўћ§§ёўћ§ћ§ћ§ћ§ћ§ћ§§ўўїћ§ў§ў§§ћўў§ќњћњ§§ўћ§§ћњћњњћћ§њћ§§ћў§ўћ§§єћ§ћў§ў§§ћ§§ўўќ§ў§ўўљ§ћ§ћў§ўў§єћ§ћ§њњ§ўћ§ћ§§ўћњњћў§ўўѓ§ўћ§ўўћ§ћњ§§ћћіљћњћћ§ћ§ћ§§јњ§њћњћћ§§ќћ§ћўўў§ўўў§ўўћ§ў§ў§§іћ§ћ§§ўћ§њ§§ќћ§ћ§§њћ§ћ§ћ§§їћ§ћ§ћ§њћњњћ§ў§ўћўўў§ўўєћ§ћћњћћ§ћ§ћ§§њў§ћ§ћ§§ћ§ќћў§ўўўћ§§§ћ§ћћ§§њ§§єћ§ћ§ћ§ћ§ћ§ћ§§ђњћћ§ћ§њњ§§ћ§ћ§§ћ§ѓћ§§ўћ§ўўћњћћњњћэ§ћ§ћ§њћњ§§ћњњљљњћњ§§њї§ћњљњћ§§ўўћі§ћўў§§ў§ў§§єў§ћ§§ћћ§ћўћўўмћ§њћњ§њћ§§ўўћ§ћ§ћ§ћ§њћњћњ§ћ§ћ§ћ§ћ§§ўўў§ўўћўњ§§сћ§ўћ§ћ§ћ§ћћњћўћњ§ћўћ§§ћћњњ§ўў§ћћ§њћњњћё§ћў§ў§§ћўћ§ў§ћўўёћўћ§њћњњћћњњљћ§§ўі§њћњ§ћ§§ћњњќћ§ћ§§їћ§ћ§§ћћ§ўў§њћ§њћћ§§јћ§§ўћ§њћћ§љў§ў§§ћ§§єћ§ћ§ћ§ћ§ћ§ћ§§ўћ§§ўћ§ў§ўўќћўћ§§ђћ§ћ§њћћ§ћ§§ў§ўўћ§ў§ћћў§§ћћњѓ§ћћњ§ћ§ћўћ§§ћћ§ћњћћ§ћћђўћњћћ§њћћ§ћћљћћђњ§ћ§ћ§ћ§ћ§ћ§§ўўў§ўўќћ§§ўўёћ§ћћ§§ћ§ћњњћњћ§§ўъ§ў§ўћ§ћ§ћ§ћћњ§§ћњ§ћ§ћ§§єћ§ћўћ§§ћњ§§ўўі§ў§§ћћњ§ў§§ў§ќћў§ўўж§ў§ў§ћћ§ћ§§ў§ўћ§њћћњњћћ§ћ§ћ§ћљњњћћњ§ћ§ћ§ў§§њћў§§њћћ§§ћњ§§ўў§ўў§§ў§§§ў§ўўђћ§ћўћ§ћћњ§љњњћћњёћ§§ћњњљњћњћћ§ћ§§љў§§ћ§§ўўј§ћњ§§ў§ўўё§ў§ўћ§ћўћ§ћ§ћћњњњћљњћ§њњ§ућ§њћњ§ћ§ћ§ћ§§ў§§ћћњћњ§ћ§ћ§ћ§ћћ§ќў§ў§§њћ§ћ§ћ§§фћ§ћ§њћњћ§§ў§ћћњ§ћў§њњ§њ§ћ§§ўў§ўћ§§ўћ§§ћюњ§ћћњ§ћ§ћ§ўў§ў§ў§ўўќћ§ћ§§њћ§ћ§ћ§§ќћ§ћ§§ьћ§ўњјњћћњћћў§ў§§ћў§ўўјћ§ћ§§ў§ўў§ћіњ§њ§ћ§ћћњљљфћ§ћ§ћ§њћњћљћњ§ћўў§ћћњћћ§њ§њћћ§ќћ§ћ§§ќћ§§ћћњў§ћћњћћіњћњњћћ§ћњћћ§ўћњњћ§§њ§§њњћћњљњњ§§ћ§§яћ§ћ§ћ§њћћ§њћћ§ўўћћьњћ§ћ§ћ§њћњћњњћћњћћ§ћћ§ў§№ћ§ћ§ћ§§ћњњћ§ўў§ћћўњћћњћ§јў§§ћћ§њћћюњћћ§§ћћњўћћњћ§ћ§ћ§§ўј§ў§§ћ§ћ§§ђњ§ћ§ћ§ћ§њћњ§њ§§ёћ§ћ§§ћћњњћњ§ћћўўьћ§ћ§ћ§ћћњ§ўћћ§§ў§ўў§§јћ§ћ§ћ§ћ§§§ћ§ћћўљћ§ћ§ћ§ўўїћ§§ћњћњћўўўЗўўјћљњ§ў§ћ§§ўчћ§ћ§ўў§§ћ§ў§ћ§ћ§ћ§ћ§§ўћ§ћћћњ§ћћњњњ§ў§њћўўњТra§ћўўёћ§ћ§ћ§ћ§ћ§ћ§ћ§ћћ§чћ§ћ§§ћћў§ўў§ћћњћњњљљњљљњћћў§ўўёчАv[:<§ћњћ§њћћ§§јў§§ћўћ§њњћњњљњћњћћ§іћ§ћўћўћ§ћљљшњћљјљћўўЫTC;?)&њћћњљћћњ§§ьћ§ћ§ћ§§ўћ§ћњњћњћњћњћћњѕљћњ§§ўћ§њ§њњљўјўўѓНe4?<;<@AEI§ћћљљњћ§§јћ§ћ§ћ§њћћђњљњћњћ§§ћ§ћћњћћўњљљў№цW1?@0:?@A7958ћ§§ћњћњћњњѕљњњћњћњўћ§ћћќљњњ§§ѕћў§ўћў§ћњћњњўюьA81@CG>7<8+%&§§ћћї§ћћњљљ§§ћћэ§ћњ§ў§ћ§њћљћњћњњћћ§§ў§ёћњћћўўЫc:,3;;988љGdNWa8;BCE:1ћњ§ћћњўћњњѕјљњћњћњћћ§њњљњўљњњчљўўхmdI4UGJJQPLC>A>BFaћњћћњ§ћ§ћ§њњќљњћњњщ§ћ§ћћњљљњћ§ћњњљњљњћћ§§ўўчЧi>+9EHB70*?<4-30ћћїњћљћњћњ§ћћњѓ§ћ§§ћњ§ћ§§ћњћћ§њљњњљўх„ULHTHPg)99?FH<52.>?JHCEIJL;:8CCuo8GŸ–§ћ§њћњњљћћѕњ§ћћ§§њљћћ§§ѕћњћћ§ћњњћћўўк2:FGIHLIG>CMOLJB:,48ZiДћюћћљњћ§§ћ§ћ§ћћќњ§њћћњїћњћ§ћљњљўўмчw<@>@FSTMH@>><:AHIHIGmЉсўћјљњљњњћћ§§ќћ§њћћњјћњњћ§ўћњњљўЭц\0@GAAJPNNPL>:45*O\C<@Ѕўўљёћњћњћњ§§ћњ§ћ§ћћ§§ћ§ћћњћћј§ћ§њњљљўўфЕ|WZ`;BOSIFFGC;;@HJJA\VЫўўёєў§ўўќ§ў§ўў§їћњњ§њћћў§§љў§§ћў§ўўј§ўћ§§ў§ўўј§ўћўћў§ў ўў§ўўј§ў§ў§ў§ўў§ўў§§ўћ§ў§ў§§ўќ§ў§ўўў§ў ўў§ўў§ўї§ў§ў§ў§ў§§ћў§ў§ўўќ§ў§ўўќ§ў§ўўѕ§ў§§ћ§§ў§§ћћ§ћў§ў§ўўў§ўў§ѕў§§ћў§ў§ў§ўўќ§ў§ўў§ў§јћў§ў§§ћ§§ўў§ўўє§ў§ў§ў§ў§ў§ўўј§ў§ў§ў§ў ўє§ўћ§§ў§ў§ў§ўўќ§ў§ўўї§ў§ў§§ћћўўњ§ў§ў§ўў§јў§ў§§њћ§§ћў§ў§ўўў§ўўљ§ў§§ћ§ўўў§ўўњ§ў§ў§ўў§ўь§ў§ў§§ћў§§ћ§ћ§§ў§ў§ўўќ§ў§ўўў§ўўћ§ў§ў§§§ў§ўўќ§ў§ўўў§ў ў§ћњў§ў§§ўэ§ўћ§ћў§ў§ў§ў§ў§ў§ў§§ўю§ў§ў§ў§ўў§ўў§ў§ў§ўўў§ўўў§ўўљ§ў§ў§ўћћїў§ў§ўћў§ўўў§ўўќ§ў§ўўў§ўўў§ўўћ§ў§ў§§ўў§ўўћ§ћ§§ўўј§ў§ў§ў§ўўќ§ўћўўј§ўћ§§ў§ўўў§ўўў§ўўў§ўў§љћў§ў§ў§§§ў§ўў§ћў§ў§ўў§§ў§ўўњ§ў§ў§ў ўф§ў§ў§ў§ў§ў§ў§ў§ў§ў§§ћ§ћ§§ћћ§§ ў§ѕў§ў§ў§ў§§ћўўў§ўўў§ўў§ўћ§§ќћ§§ўўќ§ў§ўўќћў§ўўћ§ў§ў§§§ў§ўўў§ўўў§ўўў§ўўљ§ўў§ўў§§ўњ§ў§ў§ўў§ўф§ў§§ћў§ў§ў§ў§§ћ§§ў§ўћ§ћ§§ў§ўўћ§ў§§ўўћ§ў§§ўўќ§ў§ўўќ§ў§ўў§ўѓ§ў§ў§ў§ўњ§ћ§ўўѓ§ў§ў§ў§ў§ўћўћћјў§ў§ў§ў§§љћ§ћў§ў§§§ў§ўўќ§ў§ўўў§ўў§іў§ў§ў§ў§ў§§єў§ў§ў§ў§ў§§ћћ§ ўў§ў ўњ§ўћ§ћ§§ёў§ў§ў§ў§ў§ў§ў§ўўў§ўўћ§ў§ў§§ўў§§њў§ў§ў§§ћў§ў§ўў§ћћў§ў§§ёў§ў§ў§ў§ўћ§§ў§ўўў§ўўќ§ўћ§§љћў§ў§ў§§ћ§яўћ§§ў§ўћў§ў§ўћ§§ўўћ§ћ§§ўўў§ўўј§ў§ў§ў§ўўў§ўў§ўћ§§ќћў§ўўћ§ў§ў§§єћ§ћ§ўў§ў§ў§ў ўњћўћ§§ўўђ§ў§ў§ўћ§ћўћ§§ўўј§ўћўћ§§ўўћћў§§ћћїўњўњћћў§ўўў§ўўќ§ў§ўў§ўћ§§њћўћў§ўў§јћ§§ў§ўћ§§єў§ў§ў§ў§ў§ў§§ў§§ў§§љў§ў§ў§ўў§јћ§ћў§ў§ўўц§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўў§ћ§ўўї§ў§ў§ў§ў§§ћў§ў§ў ўў§ўўќ§ў§ўў §§ў§ўў§§ў§§§ў§ўўўћ§§§ћў§§яћ§ўћ§§ў§ў§ў§ў§ў§ў ўў§ўўљ§ўћ§§ў§§јћ§ћў§ў§ўўя§ў§ў§ўћ§§ўћ§§ў§ў§§§ў§ўўњ§ўћ§§ў ў§§ў§§§ў§ўўў§ў ўњ§ў§ў§ўў§їћў§ў§ў§§ћћя§ћ§§ў§ў§ў§ў§ў§§ў§§њў§ў§ў§§§ў§ў ўќ§ў§ў ўї§ўў§§ћћў§§ћюўњћ§ў§ў§§ћўћ§ўў§ў§§ўќ§ў§ўў§ ўі§ў§ў§ў§ўў§§ќћ§ў§§њў§ў§ў§§љў§ў§ў§ўўю§ўћ§ћ§ўў§ў§ў§§ћ§§ўўё§ў§ў§ў§ў§ў§ў§ў§§ѓћў§ў§ўћ§§ў§ў§§§ў§ўўї§ў§ў§ў§ў§§їўћ§§ў§ў§ў ўц§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўћ§ћ§§ўћўўў§ўўќ§ў§ў ўњ§ў§ўћ§§ьў§§ћћњ§ћ§§ў§ў§§ћ§ћћ§§ў§ќў§ў§§№ћўћ§§ў§ў§ў§ў§ў§ўў§§ћў§§іћ§§ў§§ћ§ћ§§юћ§ћ§ћ§ћ§ћ§§ў§§њ§ћ§§ќў§ў§§цњћћўњ§§ў§ў§ў§ў§ў§§ћў§§ћў§ўўєћ§§ў§ў§ў§§ћ§§іћ§ћў§ўћў§ўў§§ў§§їў§ўћ§§ў§ўўњћ§§ўћ§§єў§ў§ў§ў§ўћў§§ъћ§ћ§§ўћ§ћўћ§§ў§ў§ў§ў§ўўї§ў§ў§ў§ў§§њў§ў§ў§§њў§§ў§ўўћ§ў§ў§§ћћ§ћ§§ўўі§ў§ў§ўћ§§ўўў§ўўљ§ў§ў§ў§§ћў§ўћўўј§ў§ў§ў§ўўј§ўћ§ћ§ћўўўЧўўћ§ћ§§ўўќ§ў§ўўќ§ў§ўўђ§ў§ў§ў§ў§ў§ў§ўўњ§ўћўћ§§іћўњ§§ў§ўћўўћЭq§ўўі§ў§ў§ў§ў§ўўќ§ўћ§§љў§ў§ў§ўўќ§ўћ§§ћїўњ§ћ§ћ§§ўўїєЛˆgIP§ў§§іћ§§ў§§ўў§ўў§љћўћ§ћ§ћћѕ§ћ§ћў§ў§ў§ўўѓ§ў§§ћўћ§ћћњ§ўўјйcMFI><§§ёўћ§ћ§§ў§ў§ў§ў§ўў§ќћ§ћ§§ћћўћ§ћћ§ўї§ћ§њћћ§љўўщбxBZZGPWњ§ћ§ћў§ўћ§ћ§§ўћћћ§ћ§ћ§§њў§ћћњ§§ћћў§§ћћ§љўћў§§ћўўђњЄtdIPWY[[§§ћ§§љћ§ћў§ў§§рўћ§ћў§ўћ§ћ§ћў§ўћў§§ћў§ў§§ўў§ћћ§ћћўцђe:YTLFS\b’§§ћўћ§ћў§ў§ў§ў§§ђў§ўћў§ў§ў§ў§§ћћ§§ў§§ѕў§§ћўћўћўћўўшћ›UOPGTVZ^a`§ў§ў§§ўў§ў§ўў§§ў§§ўў§§юў§ў§ў§ўћ§ћ§ћ§ћ§§ўћћюў§ўўкeFJTSOJPPZY]§§јћњў§ў§ў§§§ў§ўўї§ў§§ћ§ћўћћиўћў§ў§ўћ§ћўћ§§ћњ§њ§ўўюj?ML@NLTSVIFL§ў§ў§§јўћ§њўћў§§єћ§ўў§ў§§ћўњ§§ўї§ўћ§ћ§ћћўўяѕ’UIAZ^UYLNGONH§ўўщ§ўћўњўћ§§ў§§ћ§ћ§§ў§ў§§ћћ§ћўћў§ўўњ§ўћ§§ўўяеoG?BIMMGFLSPZ\b§§њћ§ћ§ћ§§ўя§ўћћњ§њў§ў§ў§ў§§ўўј§ў§ў§§ћўўєч}C3$VzA,JIQQѕPUQћ§ћ§ћ§§ўўљ§ўћ§ћў§§ьњјљњ§§ў§ўћ§ћў§§ћ§њ§ћћўЦэždH?[]wdgzOL[TUMNћ§§ўћ§ћ§§ўћўћўћўњ§њ§љ§ћ§ћ§ћў§§њћњ§ћўњћњћћўщѕ}uVGbWY^bk^YQ]UWYћ§ћ§§ќў§ў§§ћ§ўў§§іўњ§ћ§§ў§ўћћћ§ћў§ўўщй}O9OWYVNA2MZ\ћњњ§њўћћўў§§ћ§§ћ§§ѕћ§ћўћ§ћ§§ўћћ§ћўоРnM;CbŒjh]V]^eZ\Shzg[j˜Ÿћћњћњ§њ§ћ§§ёћ§§ў§ўћћ§ў§ў§§ћћўў§§ќўћћўўфН^aMGS^`^^[[a\ZJO\VŽƒENЊЇ§ў§§ћ§§ћ§§§ћў§§яћ§§ћў§§ћ§ћ§ћўњ§ћўўх›MbUPPSљћћљјњјњјћ§§њ§ћь§њ§§ћљћњ§§њљњјљјљњњ§§йљжЂ”‹x‚k`aYZQJECVQUWћћљћљћћњїјјљљјљћ§ўўўћўўЯњ§њњ§њјћћјћ§§ћ§пЊЇiAOTqn~iSWWSYPIFTTSN§§њ§§љњ§љњ§§њў§ћњ§§њј§ћјїњћћ§§лєЧ”eiaGVTMA;QW@FMJNTWHJMNJF§њ§§јћјћљ§§ўљњњїшѕњћ§§ћњјсЪ’{^ct\UpWa\TPCCNшHQCLTJHGWYJJ§љћ§ћћ§њ§§ћљљ…ћјјћјѓћћљњљћѕдЉ™pqW847U`g`UW\`T@3<:3CHJEB<@C%4>HJћћљљјљњњћћљћћњјјљ§ћ§§уœЉЈ”rPV;?MFPN8MZObbSSNEG447-G0!&M<@9328B*љјћјњњјјїїєљїљў§ће‹…J@@жgH@;440;"ћ§ћњњћФјњњѕљћ§њЪŠI5Lz`#+>AJLCMOL<9IUM2NhJ9PQA;?::17LxdULOљјћ§§љїЧњћћјЫj539?MjS)8]WT`C;8:LPLJMGLTPPQQSNOPQMI<>@<;2)H,.CH§ћљљХћјњ§љьЅ‡Y*0AC:5>@70oY`??>1?LHFE<9>@.95A;5$15,QAјј€Цњјїћ§ћм˜mYPCCG>?20-81,!3FT?4;EG<8@BEIA;5:2&02"ћјїѕї§љшЋq@L^IIG907898<7@?>E?2-7GIA;871?FCGPJFCLILEFHJOLNCA!2@;§§љћ§уЌbJ?WW`\A458<712:BAACC@8:7?855AF\iF:U[9§ћЉ}I>-7NN€BeVW!!$,3B4.@;5,5:NL?<9BGQLI@:>80.9LMPLFB?$.,833J@@EC:974*&.<;>9??B31,,0-8>3+FG7FH>BOOLWC9>ZNb›ЕЋЎЎмнТСаЖA&-BGJNPHHB;>;7+%(,4?C2,55,").+,+*1`JHH@*:QLQVn‚ŸЯОАушаЪжржЧТЎœ#-92IiG89;514#"$1182-8>:;1)5,?C:+?PF88+-?^ƒz‘ЫеншщкпсаЮЦОИЊЋВЖ,>8+@zƒH;C951+,498!*.-85;357?PQLUMQZŽЛЪФЌОШСШампгШЖЎЧЖ‰ˆ—FNFG.JTE4C9?:UZ4.;?7$*!$,.@7..)%2EFv–АбутЛЃЖИНКИЖНЫРЊЌЏЅ’|˜˜??EQ8AFJCJHFB@8;)"&,-2&:3CLLA>C:#LHA--€ .4F80+8Fk•›СщяјющсаОЏВЧУТТЛФМНДЂЏЎЈ›˜Ž‹‰ˆ™ЇŽƒ‡~ˆL&*20713:FBJZ?&9UqЂжыящчщшЪлййСРбЯнаЩЛЌОМЊЊ‰‹–ЈЂŽ‡z‰™Ё™•ސ—‹.!*5%,1B]uVMQMJJjЊщэтужДЌЭзгббЪЯЮФжпцмЦЋЇЌМz}„ƒ~u‡˜‘…„{*(+0<92-LJPVA]ЕэюцЯбЮдеЫледЫЫгйбЩЧгзЯЕЄ”ЇŸ”…{…„„„ŽŒ‡{‚…ƒ‡Œ‡HB2,557?BW^IPQQNPMJMVVLH§§ђћ§њ§њћћ§ћ§ћ§ћљљ§њ§ўўлћњхЮ}ehra[v^ddbJGCHHIOIPUSSGLOSQG§ўћћўњ§§ћў§њњўХ§ћўўћжЋ–tt[:7?MSI@GH??$1EFJћњћћ§ћ§§њњћњћљњњўўиц™ВЅ‘{QT357A0) !*)..#073"B7;:!ћћљРћњњљњјћўўћЭŠO3L|[(*@BMIHGBEJLLNOE@@EYC>PgO2OYHBE744;UwdUQJћ§њћ§ћћ§љ§ўўЫбp50B>PiT.$cOWaB@5AQUJLMMGJQSPSSOJOYPHC:.94V@њњќљњљўўт›kZZ>ECE?:798<3&9GOAABJHLIC;>><<:0;#)210ћњљјћўўяДtCJeJLE?:4<>9ABEMNMMэOHOMLFCIPTLH5+&7L>ўў€mщЊeME\^kd<<75>?;?B?CLMHACGFHJLS`[GGNC>;>?QUOLHHE33@A?;@FY[[V]QMacQHQITeVJ™аe-"3L7BFCEE<895151,(.>FB;+9V?J9+:AcŠŒЄпїўўћњљ§ђяяю€•ыцх1:?5@~‹A4EA39:1-+.300#(*(8;7.?CA><8),+#3MA$(8%*(B3++Ѕ,.(@2IIOA8[u–СЛэспёщэѕьэчучщчыээїШДЭпёсжШЪЫN-4:9FNJEOQLIB84,+.*,ESH5:a`{ШљўўљхщјћєыыяяююььдыщЧпцкЦмндаЩЦЮг@)047>BA)SSLC<;38JnЁЂЧ§ўў„њюьщьэѓѓяђяѓюыюшщччмкйжйннпзажкдJ"*1<31*7?LLNPdG.@cx›Ўыѕў§ћ§љюђєёѓёэїђїђяючёхячксмємйгзлпссзддад20"*3;<^{]YSQJPjРєўўњѓшсёђђєТѓјєѕєѓяяыцёЯЩеггаббггзжзжзаЯЯга!0-,.2:5!3SIYQEkОјўўєѓѓёюђяђёѓђђѓъђюёѕщнжстржегЭЩЪЮаглкддедедЫFH90-5>BAAThSoЊрўљѓѓєђѓяюытущюєђђэязЧсщьллкрнледжееджлмсмййдййнцCC510388GJIAaЖўўїьєђѓѓёёюьцсыяююьшшсснпслнжжебб€аЯЮбдЯЭцлкжжекжд1587):W-7mЩљўўњїїѕєјєѓёѓѓђѓїђђыцщпккзкбаббабдаЭЧЪЭЮЪФЪЮЯгЩЯЮбЭбLOPNNAd>[Н§ўў§єїїјјљєїєѕєђђёѕѓљяспкздегЫЧЧЪадЯЯЫЪЯдабгбаЪЫЯейзЩЫBLMLU9PZС§ўєѓѓїєѕѓюээяюёё€–юѓёуаФеззмнмхзгљўрзжжейгЯабзЯЭЭееЮпхѓ3TLIFPjзў§њђѓѕђђэыхтцчђ§љюђўѓШбдкмкжлмкнтхулззймлйжгбезебжгжлхщьHgVSL7>PUPAFLPN>§ў§ћњћћљњ§њ§њ§ўўЯх™ŸœaPHIkYIFNONYSTJNSGLN<:&+0@CA??9A?JG22UCHO5ћўћћљ§ћћњћ§ўўєк˜Y?Z‰q9>VU^^гTU]ge`b]^[Z]tcN]‡aPcdYSZHJJM`~e[eћ§§ў§ў§§ћњўўйн|CAJSk‰jA;kipwZQPOgh^`g`]Y[bdgccadgg]TTіVL@Ac@HcY§§ўћўўЪћБa(AU`OQPTJ@}m‡WNMSOZc`VZUTSYW^d`]^\YWLLMNTSQQIAHiWћћў§ўўˆыЅcgTWWUMLBHFMA;NZ\PMSV`YU]ZTOQVYZ^b^^[]OMOQQPITHJ5HQUYPSQUTPP^dbUVOa`ekc^OLILSQdecZUTZHNILM*7QdU[aўДco^9;`a\`CNG+*EOVbPHUYQM$9?JNabYc\a\Y\JP]^`otonmh`qqZYcYbu^OЂЮo81AUH]Y^^[[QQNFC@BPQWOVSFG8>LOVOPAh^]VYO[qh^t\IMn`tЋЮЫФМшїйбшгJ:>VVeb\b]YSSMHBFAAUQWJBEGFA>>NFGEIw^Zk]INn`jr˜ИхгЭј§псэѕэунЦЕ2.IPEaa#HQOUJFAE>FGNOIAIEEGHATTWQ;NiY[O;JNv–›ВтьѕњўђјѕчхмеаЫЧУа@IMIZ™Ÿ[E[SZMONCBCIGEA:;CGLMMNVTWTWhWaigbrЇгпсТлрлпюэюсйЯУкЭœЁЖБW\VbGd{W@][]^nkSEGPNM@;BNETW5FE23+7BTQŠЖЩюњњЮБФйггбжЯулЧУЩЗЉ—ЊВW\ZxMVZbb`gh\c\PGJFBA@:SGUdeQPjˆЉЏЧОђчжсггцргТОФТЭлмсч—ˆЕФБЊ˜•™e;FNSZ`d^cjhQSLNC::C.;ThYEGmv‹ЫўўЦыЪжэяхааелйджЮЫЫТКМЈ‘ЇБЏЅ‘—™H9HJPWVQ4jgd\`Q\WQSLCF\}ААЯўў€ЂјћђтЮФЭнйлбепедЭУЪаОИЎЁЄŸЃЏРАЁЄЁœЅ^:FEIGCJ?Wba^h}W@Pq‡ЈОђљўўљўѕрьяэдйцпэчтжЪШеНФРЋЇДЧЕЈЄ›ЈВЖЉЌŸЅЅЁH@83GEAQOuntgd[\{РњўўѓхбШрстллсшшчыяђькЪШФзЉ—›Ђ™™—˜”ŸЊЏЊЄЂ•—–2B@BFHMP3Ja]jh]uЧўў§щшшхсныяхлнтщцруцшсЮОЏМЗБЈœЁ•–˜——ЋЇЅŸ’ЃЃ™›œ—QTGFEOUYYPg‚auЎлўњюыслгсжажРрщнййнкВЂЧУЪЉЁЌЕНЌБЎЈЈЇЁœЉВБЋЂžžЄЉКPUGBBFII[]ZTqЗїјьнэяшцщыеЭЦдтщтеЭТИИЏБВРЛЉЏАЂЇЃЄ˜œ›œЁž™МЋЌЇЃБЇžЅILLJ>Mk3?p™ЯѓўјїшуюѓёяыюцллшшхЩРАЛЏЌЊЌЃЃ˜–žЂЂž™‘œˆ‰œЊЁЇ•ЈЊ™—addagVqBZЛєўўїхёёѓюђђюыпмпсщпччШЎЅЄ›žŸЂ•””’™˜œž™ЁЁ˜žЄЂЂ™”ЄЂЇЃ•œTbdkjOUgЛёѕэюёэђёэшртлшщлжтцмлРЋ’ЄžЃЌЎЌМЊЇЭтЕЂžЄЅЇ–—Ÿ—’™ЈЋЅЗКкHhdaV`rащёяёчшснйзЪЦЫЦхљсзмюбЅЌЗАЈБАЈЉЏИШУЛЋЄЊЊЉЉœ›ŸЇЇЁŸЇЊЄЂФШгV{iO\ЄлўщёььюђяупмзамщЫžНгЗЮКˆЃЈЉЊЎКШЕЌЏЖСАЎЏЏОЖЌЗИЏВЋЎАЏЇŸАЫемаdjd™ёўўћккшьюёуычнкзаТŠjn‡žЏАЏДМШТФбЯЯЛКЋЊЁЌРИБЊЎАМИЎЈЉЈЌЌЩуьмжжYZ…тўїщщзкцулухщтсбЫДЂЈЃœСИЖИОТЧСТТЭаКИБЈžЅЏЌЋЌЃЌЎЖИКЗНДкхнежзр‰ЌцёщёчщнпруагжзСРЌЌЈЌЉВАŸЕУУОЩЮЪТЪЪРДЖНААЅЈЈЎИЎž˜ЃЌЖРЧЩгспблшшт”ѓўјђђюспжжтгЪТЦКЖЋЈЎИЛИЏЌДЗАДМОЕЅЉЖИДЉЈЈВЌЏЈЕВЇЄЁМКОЧлтчкемстпыэщёёэьхйдекШШСФАБДИВЦЦЪСНЛМЗЏЊЏЊЎАЖЖЗЊЋЌИВИЛИЌЋЄЎЎкжШЩлусмпдзшэѕщтцйжУЦУЮЮЭТООРИВЉЋАЕШЮШЋЄЌЖВВЉЅЎАБЉЄЉВККТЦОИАЎЇЋЕТамнулпмЪбчюяухзпзкбШЖЕСЮЦТЛОСДЮЯСОСФДЋБВБЉЇЄЋЗЎВИМБАЎАЌКНСЎИМУѓѕкгЫекплШдтюєрцкмеддЩДОЩЮааТЗБАВСйЪЈВРИЛЛЊЅЕЖЦФЕММЗБВЊЎЏБТагмзпмскЧамЯЭжкльєњ8њwџџwwџџ.w џ,ўwџџ)wџ'ўwџџ&ў€џџwџўwџ!џўwўwџ"џw,џ w/џ w2џўwџ5џўwџ6џw8џўwџ9џw§џ§ѕћњўћў§њ§§ћўўјћ§§ўўћў§§шјљљ§њ§§ћўўћљњљ§§єљѕњњўў§§њћљјћ§ўўїћўўњ§§њњ§§љ§ўљњњў§ўў§§ўћўўћњўћћўўћ§єћўўћўћњ§ћћ§ўўљњўў§љћјјјћ§§њњ§ћ§§§љћўўћћўћћўўћўў§њњўћњ§ўњ§ўњ§§ў§ћў§§њў§ћўєћўўћўћњњћўў§§ѕљњўћўњ§њњ§ўў§ћ§ћћўў§§ћљњљ§ўўњљ§§ћ§ўўњњљљ§§ўў§ў§ўѓћ§§њ§ћўњ§§ўћўўћў§ћў§§єњ§ўў§њ§њћўў§§ў§§њў§§юњљ§§ў§њ§§њ§ћўўћўћўўў§ўў§єћљњ§§њњ§ў§њ§§ќћўў§§ўњћўћљ§ўўўћўўћћўўћ§§яњ§њњў§њњћў§§ћћ§њ§§єљ§њљњњў§§њћ§§ќўћћў ўћђўљњћћљћћ§њњ§§њњќ§ўћўўњњўћўћўў§ћў§§њљњ§ўљ§§щўњњ§ўўћ§§њ§ўў§ћљљћњ§§ў§§ўњ§§іћљћ§ўўљўћўўњ§њ§ўўћћ§ўћњўћў§§ћћ§ўљњњўјљљ§§њ§§ёњ§§ў§ћљњ§њ§§љ§њњ§ўѓњ§јњњћўўћўўћўўћњљњњ§§љ§§њ§§ќћјљњњўћўўћў№§јєљњњћ§§ўў§љњњўўћњ§ўћўў§§њ§§ўњўў§њў§§ў§ќњ§ћ§§юњ§§њ§ћўњўњїяцэћњњўў§§њ§§іћљњ§§ћћљњћћў§ўў§ў§њўћ§ћљјјќћ§§њњђ§њ§їыхђј§§љљ§љљўјћћє§ћљљћљњ§њњ§љљі§ћљјљњњ§њ§§ўљњњўі§љћљљћњљњ§§єѕѓщьєћљјљћљ§§ёњћњјћћљљ§њ§§њњ§§їў§њљ§§њ§њњјј§ћ§њ§њљњњ§уњў§ћђюђјљћљњњјњ§њћћљћњ§њ§њњ§ўўњюљўўћўћўћўњўљњћљљћ§§њф§љљјћ§§ђюьюѓњћјјїјљјјїјјљљњ§§єњў§њњўћўўћћ§§њўљўў§јњ§њ§љћјћћђљњљњћњњѓѓюыњћ§§ьћ§§ў§§ў§ћїљїјѕђњ§§ћјјїўћљљћљ§ћљћћћљњљљњњўќћ§ћљљ№йУЅ—zu|ЋЈЊЇЗцћћц§ћћзјјђѓёѕїїњјћјїїњћљљћћњљљјјљљїјј§њњпљјТŸƒ…pT[hrWY‚k^L)7N4JmV[tЉАТлхю§§ћ€§ћѕѕјјњјљљјљћљјјњњїјљјњїћM>a|tOFITETQCBOGGZSI;@ThkGUe]Ch`gƒ‰’’˜Ацћћ§§јћњјїљјћ§ћћњћљњ§њљћћUJ`em`\ccZV[^SMHGHIGLnk^\aeNPZWP[d\^g`\M`Адеѓ§ћњњјћїїѕњћљљћћљ§§[[VOPT]dTJHOTWVJLGEHSm\NHiaZNMONPUVZ[[Z?OhaagqЃТьћћ§§ћљјїјїјїњјћSJNLSPT\\ZNNSVO778?;GNGC2[bZVPPNAJU^\ON4Jg\N857:]‰Ѓщ§§ЙњїћјјѕїїјLA<>GI9Ihg:?HLS`<+UB>9:?EEGLMNLNOT[[\QLAHO^aUTS]hC9EiЮ§ћ§јїїљїїФC<>E@?4;5-949:>?7(B|xP+>HMHAEB>@MWTCILLGIBZ]ec\ZSGLC;PjУћћ§ѕѕНјћIGBFE7B@?8-,57Z4.$3B}„WEMJCIHJEAFINE88@H5-GFVSWTMJGE7#.YkЮљ§§љїјLLр*1-$"+&5;&3B2MC:;EJHEG@GOOJїC?BAEMSS€NLB830-2@FLPPNL<3+-#"(Aj”Цѕ2?<+>@dV!)%+)0&*.&+$)*>:94>?C?GCLIHPMIJ?4:455?GC>BCA?<5,J>YPBG21+mPB-;500)-4;3443433%38<8;AH:>3:HCIS>0098GH;]Z+@.&;"*7:9149GHF@C@UNL@AOMY-GGN;%:<5;538;>9-,+*E>;C:?IO>7FLGGNUG.;07.;:5@C()(%@@T* $1@0! !"$**,*STQo|g’ЛТЖž{|tmWOU7.*85NB94B+%-?@W>3?! #0,ЉЫШЂŽ—Зʄ‘ЛЫСЉˆŸЂœ‘ЈЈ„w•УЩ›‡Œoag2AVI032#".,&$!,1›РЪЃ–Ÿ–›ЁЁЏжЦЅ‘…‹‡™v—ЌВЫЛЂŸ•””‹•‘iNWQ7$;ZnqHVj^HphhŽ•”‹Ехўўњћє§њ§њћљћћ§ћ§ўўQгaji`bac`ZWZTLIFHCFMrxeaegTQYWQ[i]ciebUg„Ажсѓўўј§њњћљњљћћЩњћћ§ћ]WPOOTd\TOPQ\\^OFBCINmWTQqjbQNPQTUZ^`b]EPmhoeuЉЩєўўРњћњћњћњћљњњWTITTV[][QNOWWL;85;@CNTB1Ve^VTPJNPU]c`T:InaS77;A]ŠŸщўўРљћњ§њњљљњTI@ELJ>Iih;FEJQ]B2ZH@AEFGJNJLOSSVZZ\]UMIO[cb\YT^hJ;PhаўўћњљљјљљЧBCCBF<5>424:>BG@<0A‡…U2EILHEE@BFP`TNHMLOLA]ehdc]VMJ<:WjЩўўсљјљњњBACAEC8;:9:88?W:2%.G|YPMIIсLHCCIPJJEAFE>8ILW`\UQNLF;(0ZpдўўР§љњPPH)82&,%%(".4797;+9A4OF;AEGGA:GIU[UVVSHBGVQPSUVWOHFM<$%.W•ўў€мћSUG;;$18!*)%-30-04730742489?BIMP[^ZZUPI><@GFOPW[TPJ@;40.-Ew”Шј1B;7ECcT.1)&02&501*.04379;AF?FIMJOUUVWSFFAF@HOPILNMGFA>7QEgVGC<0.nIE(9A;-+2;<9;;851+3.9<;CGBMPV9@II?;43;:;89;??€…:3?FIE@GJPTJJ503.24%.3&#$14:<:;@?>I@?AHJHFACQ[H0GSLE9:52>;>;.5C7A;9ABIICBP:>BLNF@GUVQFOOFEOO417CGG€ч?55@E)9;739:.#32+2241-3249;F;@IOAQWPPWQTW\\SMGMTe49>FLQ]L,;42>7:-;:4774702-178+49?:B<81:MbabLpZCT^SNUdNEPFJHNTOUV3;9GNZrG;5*--*+%C<4.32150()-.1741*`\`„•}ЏпьрзЋЂЉ—ЖŽqjkULPQVtZAптлйжедаЯЭЩЮЭЮблкецЯЩЪЪЯббЯЦЩацрнсслзннммйдЭЯКЮгЗ„TL:CE,!-EjJA>8дмлждЯЯ€ ШФФТУЦаўткпЇШЫЯЯйеаЩЪЭЯабаЭЫЮдзйдбЫЪСУЭрсыр’^[10c:;9743гдбажСРМЫЖЮбеЭЪУЏОРСщшззжбааЯбЯЯгддаЭгЪЩЫЩЧНРОТтыєўцг•dOL043@<@гЯЭЪЧОДƒШёдлггЮШШЪезђјшЭЯаннлйкбззрйдбЮЭЭ€ЪУТЗзЪЯпйысРД‘pG543B>9ЪФОРОТСФИАЫЮгЭЮдгжзхёљђларцтснрмлмжзбаЯдййзбЪбнуєёьѕїэьЪНОi;ECAAЦОРКЛЧЪЫЪЗЭЫеггатлИйцьюнххснсмелзйжЯЩЪЫбрлмздНСкпхышщяууѓѕёНž…GFФЛМЂИглдШгсялзрђўјцыыёяьцйКАЮзедбеаШЧЩюстпмкЭгѕўємухяяѕўњѓѓњљцД„ЫЫЯЮсцђЮНкшѓчьљўїѕђяяўўьЗ‰‘алмннжбждзтцзмлрлрзчћюэююяђєѓѕюёщђљўтЩљўїїўў€§цѕјёёђєђђьсеСжязЎœЫчэндгеджпупмлмшхщэыьюђђюђюёэяэёыюяјєњжшусцыыђєѓѓѕїѕѓђючшцслкШйцячјлдаЫдлпнййдФЮхєѓђєѓєѓђѓёящщьяђёђюѓэюєщьцёююёѓєїєєѓяђэышщтпйкптсскжзЯжјшснлШыьѓјєїѕєѓїѕђюэюэьяђђёяяьњёьющчцщшђєјљїїђюющццтлнлкзежааСняљђюћэсїєѕєїѕѕњѕѕјѓїёэщыыэшящшуьэшцххичшяєѕєђытутспплкздггжжмнрщѓяђыёёяђѕѕїјљѕѕФїјїђюјятцыяьэхуьщыщчщчђћїљѕѓђёэцшстллннйкутсшщэщэђюёёяюѕёђђѓѓЉјњјўѕэрэцнлѓюёьщтђяюяёѓѕѕјјїёєяюяѓђђжезмрстктпуппщщёюёяёђєѓѕђѓѕєєѓђђыгЮзйймуыььцуюэђёѓїїбѕјєёььыэўѓШЛЪЫедбеЮмђусспхтыэьёђёїђѓёѕђђєѓьёючууљщыящььєєгѕїѕљјњєїььуцчјрШжкгеЯЭЪмщјэьццзыюёђёёјїѕєѕђєяяАђэяющэёшыэыьэєїѕјљљјїїўўэжршюїплтукгЪФЩщјыычснцэ§ѓїїѕјѕѕїѕјѓєёяђыэьщыѓюэщщцщэїєјјљЭєїљябЛршштрснунгНТЫщѕђяэыцчїўєїјѕѕїѓяђяяђђёщыхгсуєээюьшщцљјїљњњїјєјђтнпп€АзеехћўўшпщїшччыьяяѓёђѓѓѕїѓєэяьёђяяїчЫЌШЫцюыщцччхљјљјљїѓїјўјжзыткжйбсѕсуцхптуцшьђэёєёёѓєєѕѓяыьщыэьыёеРйђэяюэшьыщщїјїєёђёјсеЛeВЭггаенмзЫгнпзмрхьяьёђюђѓьёёющыцьыщюяяєзрчщђёяэяьюьщќ§ў§ўўќ§ў§ўўў§ўўў§ўўј§ў§ў§ў§ўў§§ў§§§ў§ўў§§ў§§§ў§ў ўќ§ў§ўўј§ў§ў§ў§ўўў§ўўў§ўўў§ўўў§ўўў§ўўў§ўў§§ћў§§ќў§ў§§§ў§ў#ўў§ўўј§ў§ў§ў§ў ўў§ў ўў§ўўњ§ў§ў§ўўњ§ў§ў§ўўљ§ў§ў§ў§§ўћ§ў§§ўўќћ§§ўўў§ўўў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўў§ѓў§ў§ў§ў§ў§ў§ўўќ§ў§ўўі§ў§ў§ў§ў§ўўў§ўўі§ў§ў§ў§ў§ўў№§ўћў§ў§ў§ў§ў§ў§ўўј§ўћ§ћ§ћўўќ§ў§ўўў§ўўњ§ў§ў§ўўј§ў§ў§ў§ўўў§ўў§њћ§ћў§ўўє§ў§ў§ў§ўћ§ћў ўў§ўўў§ў ўў§ўў№§ў§ў§§ћ§§ў§ў§ў§ўўў§ўўюћ§ўў§ў§ў§ў§ў§ў§ў§ўў§ ўќ§ў§ўў§ѕў§ў§ў§ўћў§ў ў§њћ§§ўћў ўў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўј§ў§ў§ў§ўўі§ў§ўљћњ§§ўўѓ§ў§ў§ў§ў§ў§ў§§јў§§ћў§ў§§ўќ§ў§ўўў§ўў§ћёўћў§ў§ў§ў§ћјѕњўў§ў§ўћ§§єћ§ћ§§ў§ў§§ћ§§ўћўўі§ў§ў§ў§ў§ўўњћ§ћ§§ўўі§ў§§њљєћћ§§ўј§ў§§ћўћ§§їў§ў§ў§ў§ўўѓ§ў§ў§ў§ў§ўћћ§§§ў§ўўї§ў§ў§ў§ў§§јўћ§§ћќў§ў§§їў§ў§ў§ў§ўўќ§ў§ў ўё§ўћ§ћ§§ў§ў§ў§ў§§љўњљєњљћћёўћ§њўћўћ§ћў§ў§ўўў§ўўњ§ў§ў§ўўч§ў§ў§§ћў§§ћ§ћ§§ў§ў§ўљјѕћўўі§њўћ§љћ§ўћћэўњ§њўћ§ћў§§ћ§ћ§§ўћ§§§ћў§§§ў§ўў№ягДЏЏ‘’•МЛНЅРћўўшпў§ћњћљ§њћћ§ћ§ћўћ§ћ§ћўћ§§йўћ§§ў§ў§§аЉœŸŠro„ŽwzЅ~g@M\Ja„ir’ОЪзё§ў ўї§њћћўћўћ§§ћћњћњћ§§ћжў^UЂ‹k]`oeneZW^^Zp^ZMGeƒ‰^`|rZ‚z|ЂЂЊœАФњўўќњћћ§§ћ§§ў§ўўвe]w…}|u|}rpkpja][YY]c…‰}|„}ihnqeu‡tvxxwgu—Сцёўўјњ§ћ§њћћ§§Ъћ§§ўmickcnurb^d^pwpaY]Y\[‡pi^‚urjdcmjqpp}rtZdˆ}{ŽМк§ўўў§ћћўўћћЪ§i^`egikpoi^ejj`NLS]OS^iZEo~qpom\ahortqgOa~|eJJMOk‘Ѕњўўлћ§ћћњ§њћ\[Ya^UMc|NTT^ixZNxgbU[VV`^`ccшbgmoppk`okkrumkjuxVJ]|лўў§њ§њњЦ§VQM`YZ@MIECFMTQSO@UЉ˜hBU`cY[^[TYipnb``e`YYxzuxqvod^VOe{еўўР§љ§ћ§UTV\UTNTPMAGEPcMM8:V‘˜ka[aUZbeWSdmm`W][YaPYajrkhpd[\M:9pрўўСњћcc\>HC7<;<794FTU\]agmnhg`^]QOZS[\bqtg`YGMB989JˆЄгўE]PQP^{oB;:ACF>?MIB7?EGMEHILIVUQYZ^d\gcec`P[NTV][\U]ZSTSNJ`UriY‘WSPGwcTHTQLHJELPPLLILNB?GLMTUSWUOZUQZa\`eNIU\ZOvoFOJGJAPHVNJTM[bVOV^ae^[VjgtTSh`UPI`POPSMUQJGHGJYYOON[\cV^JAA95F5?."qxA-B;B;+753:3,742@HNN7@;.@FFA8-<88@:A7)B@IUSZ]QPMPM[HZ]gSZ`khgjbaa][UZT[i<>GOUS`T8%A547@7?FTFF9A?EH8>?0GAQVUSMLOJ]omkYqZIVb`\ag\HSHOTSUNS[@LOIZdrP1;AFIHBFidkŽ›ЊажШʘŒ’ЎŠŠpedCBJPVdVPB<83.*5C<73B7F>HОмсОЎЌЈЛДЕБИФђмУЊ˜žЂ›ЏЅŠЈЧЩтШВДЊЇЇЄЁЏЎƒeuiMC8`\mY2*0!-)AA?;;5CAUИЖБАЌДОТЌЋВБУБ–’}tŠ˜žЗЗŸ•ЂНкФ™ŠЉБЌЇ™ВЕА˜‘hw]NON<2.)-%%5722€`8GQЯСЗВАЈЉЁ™ЃК‘xw‹—œŽ‹”–ЄœЅЂЃ˜u’›ЈБЋЃœœЊЌаЖК„}d>)%#".(&*7?EI&>@VBL‹Шјљњјјћљјїњћљљћјїїјјћїљјєјјїжјљљјљћњїјјїђєѕ§ѕœE?;+$*07*@PM*(7M–Ыљјћїјїїюјћљњјјњљћћљјїљјјњљљж§њјћћњјїєєїїєїјЯ< #)(2493-?BЁхљћ§љљїјњћљјїћљјјњ€Тїјљњ§§љљѕјјљјљѕѕђїјѕњыБ<$!"$$*B<1;ANЃћћ§їјњјїљљјјїјїїѕѕїїєїїѕїљјљћљ§§јљљїїљ§љТZ2"  85GH;0OO?#4ƒщљ§ѕїєёэёєћљјјїњјєїїѕђјѕїїєѕѕєїїјїїљѕћк^1) 4C@?EEACF<+ELЫ§ћћѓяыхэјљљњјјїњїїўјїїўѕїїљўѕјјФ§ћшzP;"9:4*GI<:@AJAC0**+3$-):,3,,(<‘ЛннЭЪрюѕјїјїјљћѕјјїѕФїјјїѕ§§лT3454.""+1:@).)$$I."";AV‘Фдчцэєѕѕјјљћљћљїїѕѕаѓѕјјљђѓљјo. <;539+--17*>))40Cm<+&aЌбєјјѓђљѕїѕјјљљјїїјјПћјљњљєћћ#   ;25--379&+"-1.&!5@5*,291vНљћћ§їѕѓјјњњљљјјљћљљШјѕє§ћч~&(4.1#.,$500)43740BG37Hc”ь§љћљјјїїљљїЧѕєѓјѕѕєљјкE# *2+"#.:2)+@<;NVAn’Дѓћ§ѕїїњљїїѕїјјўѕїїЭћ§љw%  9#*42(1!!$#1(->@INSYW`oL7rлћ§љїїѕїјЦѕєєјљ%+3$F4LPTVUPiW4[]чђћњѕѓїјјПњјњїїѕё§ћн5"4,&113xC7*%++&0199E9):49A-;FEGAASPM>kC1cБљћљѓѕєѕѕјјѕ€ŒєѕљэB+-ЭЃNA27$2..,)>m4P52&(&.3LYLS^ZSNVVS.+MŠгљљѕєѕїїѓѕљїѕѕїљљžE3B8.КОЗй˜9094&$(5>o@+5;A?>8c0:VF>1N\ZzЫ§љћјѕєєѕѕїѓѕєљ§њd5A&:2.ВКжёЋQ@B *9;(;QG5<5A4LZ-EMJOB@;5ˆЮћћњјѕїїєѕєѕћ§ћЇ2>PG44ЁЄАФВБƒ?,$N9+&EI?EF\TTjG?SN)-45812+Eb…Џљћњѕѕєѕѕяєјљђ]0E7;7ДЗЋДцЫq$78@2239,15VLQH$<83"#7759;\8LJjЋжјћјѕћ§C\]8ЦМЗЕНМЕ•ЉЯžˆТбФŽ–qH>:<#%7343.$&$030#*328AB@-7]WgNЄї§љћћжooJ:НЕЈЕЪжМЉБЕЖБЂЭєћћКŒ^JC1GE7;2+#18,00+2,+2@959CFEIM0>pр§ћ§љ‘eYNЋЎМЛЏРМЖбЮедбхљћѕхмЎmU8YH01G,!04,!+29C&&(&5.-)7A99B:+$PЕљћћ’".ЇЈЕМББЈЊРгабцюєёюьєй›ЁЗЄdTJ8.*&107BGB>".+,57@?003;ETGGžљ§пQ08ЌАЄ›Ђ—›ЛШЮгхэєђяцучЧЖЧЪФ’uP8GG-*0;B><>-+-$.12?2(.(110.)"3A?>AFB?!$*:Z}„V:уў§ў§§ћ§§ўћ§ћў§§ћ§ўћћ§ћ§ћ§ўўћ§§ўњ§ўћћ§ўў§ќў§§ћћ§ўќ§ў§ўўњћў§ў§ўўў§ўўќ§ћњћћя§ћ§§њњўћўћ§ћ§§ў§ўўѓ§ў§§ћў§ў§ўћћ§§ўіћ§ћў§ўћўў§§§ў§ўў§ўќћў§ўўћ§ћўў§§њћ§ћ§§ћћ§ў§їў§§ўў§§њћћ§ўћ§§ќћ§ћ§§ћљњљњљ§§ўў§ўў§њњќћ§ћўў§рћў§§ћ§ћ§ћ§ўў§§ћ§§ћћ§§ўў§§ћњјљ§ћўўј§ўў§ћ§ћў ў§ћњћћўњћћњ§§ћўўј§ўћ§ћ§§ўўў§ўўі§ў§ћљљњћћ§§ў§§ћ§§ћўћї§ћћњ§њћњ§§ќћ§ћ§§єћў§ўћўћў§ў§ўўћќњ§§ўўљћ§ћ§§ўћћ§ў§ћњљљќњўћ§§ћќљњћњњљ§ћ§ћ§њўўўћўўћќ§ћ§њњѓўћњћў§ў§ўћ§ћ§§ћќњћћ§§јћ§ў§ћ§§ћћќ§ўў§§њўћўўћ§ћў§ўўѕћ§ћњ§ў§§ћ§ћћ§љњљљњћј§ўў§ћ§ћўў§ёў§ўњћњћћ§ћњњћћўўћ§ћ§ћўў№§ћўў§§ўў§ћћњљћњћћњћ§ђћ§ћ§§ў§ў§ў§ўћ§§јњ§ћ§§ўў§§ћћ§§ў§§ўћ§§§ў§ўў§ўћўўњ§ў§§ћ§§їў§њћћў§ўћћљ§ћ§њћћ§§ўўћћљў§§ћ§ћ§§эћў§ў§ўћ§§ўў§њћњњћћ§§№ћ§ћћњњћћ§§ћљњћњћћњћёњћ§ўў§ўўћћњћ§§ўўќ§ћ§ћћ§ѕўћ§ћ§ћћњ§ћўў§ћўњћћщ§ћў§§ў§ћћњ§ўўћњњћћ§ћ§ћ§§ўћўўў§ћћљ§ћў§ўћ§§ўћђ§ў§§ў§ћ§ћћњћ§ўў§сћњњћ§ћ§ўў§ў§ћ§§ћўћ§§ўћ§ўўћ§ћ§њћћќњћњ§§ў§ўўћћ§ћђ§ћ§ћ§ћ§ћ§ћ§ў§ћћ§љў§ўў§ў§§ѕћ§ћўњћ§ћћ§ћћёњћ§§ўўћћ§§ўћ§ћ§§ўўњњќћњћљљњњћљћњњћћў§ћћќњћ§ћћћњ§ћ§ћћц§ћ§ћ§ћ§ћў§§ћњњћњћћў§ў§§ћћњ њћ§њљјјћїјљљњњўљњњђћљњ§§ћћ§ћ§ўћћњњћёњљњћњњћ§њљњ§ћ§ћћ§§ў§§їћ§§ћљјјїјјїђљњћњћњњљњћњћњћћј§ћ§ћњљјљљђјїїњљњљњњљјљјљљљњ§§ўўћ§§њњћњљјјњњљњўљћћјљњњљљњљјјыљњњћњћљјљћњћњ§њћћ§ћћњњўљћћ§іљњ§ћћњћћљњњѓ§ћњњјїїј§њњљћћљљњћћњћћњњљјўљњњєћўћћњљњљњћњћћїњћ§ћњ§њћљљїњћњњљјј§ћћф§ћ§ћњћњњљњ§ў§§ћљљїѕѕјјљљћ§§ћћќњћћљљ§њљћћ§њћњњјљњљћњњљњњјљјћњ§ћ§ћћ§ћћ§ћњћћўњљљњ№§ћ§ћ§ћћњћћњњћ§ћњњћєњљљћњћћњўћњћћ§њљєњ§§ў§§ўўћ§§њњ§ћ§њњў§ћћќњљњћћўњљљњѓљўўњњћњў§ћљњћћњ§ўћ§§љћ§§ћњћњњћўњћћњљўњ§§јћњњљњњљњњјљњўўцћњћћњћ§№ћ§ћ§ћљљїљњћћ§ћљњњћ§њљњњћ§ўћњњіћњјљњўўаdњњљ§њљњњљљњћњњљњњљ§ћњћћ§§ўћћњњћ§§ћћњњ§ћљњљјљљўуЩr@јљњ§љњ§ћњћњњљњћћљњњљћњ§ћ§ћћў§њњјљњћ§§ћћ§§ћјњћњћћњјїїўяє–NC:ўў§љњњћ§§њћњњћњљњў§ћћт§ћњњћњ§ћћ§ћњћљњјљњћњњћћњњћћњњўўјш‡G-)-жўўўњљљњћћ§њћњњѓљњћћ§њ§ћћљњ§ћћяљњњ§ћјјљњ§ў§ћћњњћћўѕЭW75AN%*APбўўїјїѕљћњћћњњќљћћњњљјўљњњўиэ}V?(B>;AJQG?A?IFH:nzцўўєѕїѓїѕјљљќњћ§ћћњќћњћњњгћўрq2 3<  78;CMG?27CQM@0,,ЃўўїѓёєєїљњњћљљњўћњњўљњњўћњњћўЫО: 2Z.  87:@L;OC@9<>79N?&Wгўјёюѓјјњљњћћљћњљјљљњљћћњеўљz4 #)FF @8.0).7E@;98-7><1*Cžзјўїёјјљњњћ§ћњ§њњљј’љњњљљўўрS 8  @:735:@AFCB+&*2P;2$BMbЋщўўћјљљњњ§ћњћњћћљњљњљњљњњјљїўўu!)  AE?::CF?;<9H,9:;IuH2-kФєўўњњљјњљњњћќњћљњњб§ћљјћўўƒ AFB>?::?91%0&-4::8UWF{”Нўўўњљљўјљљњљўшw+!"?<0;;L !(+-&0++,ь8?AGTQSUY[kxT8wрўўћљљўњљљњјўп‘(001)S@@AMY)1*0*2.5>9,327>BIPPюWZYVjb3g`Ѕюѕўўјњљњњ§љњљљјўац.#,%0274œ^0F80;9.2774?ZE(?A;?BHLNLHENY[S:wB8kЗўўўїјјўљњњјљЫўѓ@$!!)3ўбoSCJ7>7050JzCVA:>?F?CMSVP`bSQ[a]-,TлўўјјљХњљјљљјљўўЁ?0M?2ђѓяїЂB:99.099BzP0$%88<@aSO7HWa}гўўў§јјФњљљњјј§ўћe0M,E@7ыпћўжdIO(58WV5$CEGZ`]oNFgP().4:>?5.+Hh‹Лўў§њјјЦїљўї]2LBA9тухеьўя‘39A)@<7;;:5A\M[J>H3*9+.5?<:@<JMпхьёьяпѓятЫ™[.90:A88>HH%3;<2(+47>:4350-(1:APPC8W}ˆЩўўјїїњўнA1:LJьцшыцкРЖщїпмЛ{Z&4I0BIF?74<:877,1%&.37;5*-YFBAaBOOpБсўўћљўў{EcZ:ььДюьѕэЮтјмФхяг”žwM@7C1E>?A<72(*,+392;73,*8?@AI:>c\jNЇљўћўўйxwQ@шчьыыьэшшьэтЦюўўиО”aTP8NLBO9?&-35>9-37*1.7;?L&,5;9<95AJ$,,79<3?EFCA>;*%YЖўў€Ф™(1$ртхццуучьэѕїєїљјјћўєЧЩЪАnST05;1948?CFHC &34:;@H>:7:AFSHMЈўўцP2<цттцсхчхшэђђїјљљњјћячэючЇ‹W.MH0447AG?>@1232048.EFFE?@@AF4BnчўM>ьхшчьэыьцьёєљњћњјјљѓђяєјтльС`?<:9;5--)-0342.,+:FFEFEG@30-Be…ˆW3 ўў§ўў§§ў§§ћў§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўў§ўўў§ўўѕ§ў§ў§ў§ў§ў§§ўќ§ў§ўўў§ўўў§ў ўў§ўўў§ў ўў§ўўђ§ў§ў§ў§ў§ў§ў§ўўў§ўўў§ўў§ўў§§ћў§ў§ўўђ§ў§ў§ў§ўћ§ћў§ўўў§ўўњ§ў§ў§ўў№§ў§ў§ў§ў§ў§ў§ў§ўўў§ўўў§ўўј§ў§ћњћ§ўўќ§ў§ў ўє§ў§ў§ў§ў§ў§ўўќ§ў§ў ўћїўћў§ў§ў§ўўњ§ў§ў§ўўь§ўћ§ў§ћ§§ў§ў§ў§ў§ў§ўўќћ§§ўўќ§ў§ўўњ§ў§ў§ўўќ§ўњ§§ўћўўї§ў§ў§ўћў§§ўў§ў ўќ§ўў§§ћў§ў§ўўѕ§ў§ў§§ћ§ћў§§§ў§ўўў§ўўќћ§§ўў§§ў§§ў§јћ§ўў§ў§ўўў§ўўќ§ў§ћћї§њўњў§ў§ўўќ§ў§ўўў§ўў§јћў§ў§§ћўўў§ўўў§ўў§яўћ§§ў§ў§§ћў§ў§ў§ў ўј§ў§ў§ў§ўўњ§ў§ў§ўўў§ўўў§ўўќ§ў§ўў§ўћўў§ѓў§§ўў§ў§ў§ў§ўўј§ў§ў§ў§ўўў§ўў§§ўћўўћ§ў§ў§§ђўћў§§ћ§ћў§ў§ў§§ў§§ў§§ўќ§ў§ўў§§ў§§§ў§ўўљ§ў§ўћў§§ўј§ў§ўћ§§ўў§ѓћў§ў§ў§ў§ўў§ўўў§ўўќ§ў§ўўќ§ў§ўў§§ў§§ўє§ў§ў§ў§ўћў§ўўў§ўўў§ўўў§ўў§§ў§§їў§ў§ў§ў§ўўі§ў§ў§ў§ў§ўў§їў§ў§ў§ў§ўўќ§ў§ўўъ§ў§ў§ў§ў§§ћ§§ў§ўћ§§ў§ўўы§ў§§ўў§ў§ў§ў§ўњ§ћ§§ўћћў§ћћѕўћў§ў§ўћ§ћ§§№ћў§ў§§ћў§ў§ў§ў§ўў§ўў§§ўѕ§ўћўћўћўћўћћє§ћ§љћљћљ§њўћћпњўћўћў§ўћ§§ў§ў§ўћў§§ћўћў§ћћ§§ўњў§§ћўћў§ўўц§ў§ўћ§љћњћљћљњњ§ћ§§ўњўћў§ћћ§§ћў§§ыўњ§љ§њ§ћ§њ§њўњ§ћћњ§љ§§ќћў§ўўщ§ўў§ћўћњљћњўћўћў§§ћўћ§ћћў§ћћш§ћћљ§ћў§§ћ§љ§ћ§ћ§§ўћ§§ўћћўў§§ўћ§ўћў§§њћ§ћўћ§§ћњњјћ§§ћћ§ћ§§ћ§§ьўћўњ§љћљ§њ§§ў§ў§ў§ўћћћўћўћ§§ўў§§ёћ§њ§љ§ћ§ћўњ§љћ§§чў§ў§§ћўћ§§ў§ўћўњњљњљћљўћўўўћ§§јћњ§њ§ћћ§§јўћўћўћўћћўўћћјўњћћ§§ў§§ўў§ўўщћ§§ўћўћ§§ћћ§њ§њ§ћ§§ў§ў§§ћўћўћ§§ыћўћўћўћўњ§ћћ§ўћўћ§§ў§§њўњ§ћў§§ўћ§ў§ўћћўў§§њўћ§§ў§§ћ§щћ§њ§њўћўћўћўњ§ўўћћ§§ў§ћћ§ћўћ§§ўўѓ§ўћў§§ў§ћўћўћћ§ёћ§§ћњћћ§§ў§ўћўћћѕњ§ћўўђћўћ§ћћєўћ§ћ§§ў§ў§ў§§ыљў§ўћў§§ћўћ§§ћћ§ћўњўћћћўћ§ћўўјћўњ§ћ§љўўїр~ћ§њ§њ§ћћэўћ§ћўњўћўћ§њ§ћў§ўћўўњћ§ћўћ§§њћ§ћўћ§§їћўњ§њ§њ§ўўшк‹Wљ§њўњћ§ў§§ћўћ§ћ§ћўћћ§§чўћўћ§§ўћўћўћў§§ћў§ў§ў§§ћ§§ћњўјўўѕЃ\ZQўў§њњў§§єўћў§§ћћњ§ћў§§њў§§ћў§§ьћ§ћћњљњћћ§ћўћўћ§§ћћўўјєžV@:?хўўїћ§њ§њў§ў§§јўћ§ћўћў§§њў§§ћћ§§єўћў§ћњ§ћ§§ў§§ћќўћћўўѕмkI?W]OShяўў§яў§ўћўћћ§§ћў§§ћ§§ўўѓ§ў§ў§ўћ§§ўћўћћш§ўў§ў§ћћўўїЏkJcGS;(J>mчўў§ѕћўћўћў§ў§ўћћ§ўћ§§іў§§ћ§ћўћўћћ§ћў§ўћўўюШv…Y`h@434OWpS\нўўу§ћ§§ћўћ§ћ§ћўњ§ћўћў§ўћўћўћ§њћ§§ћуўћ§ћ§ћўўВY[HAEE);;1UedB;OcДрўўэњўћўњћ§ўћўћћ§§ћўћў§§жўћ§§ў§ўћ§ћћњћљ§њњўўцM08-;2%1;0LNOO0B[UЖўў§§ў§§іўћўћ§§ў§ўћћвўћў§ўћ§§ўћњћ§њћћ§ћ§ўўФU)5(053,22+7,GZT!LO`oЛўўћўў§§ёўћўњ§њ§њўў§њ§ћ§§іћ§§ў§ў§ўћўўцрtI:57-,+*&$?PT[gSQgbO9B”ўў§ѕљњљўћ§§ўњ§ћћ№ўћ§љћљ§њћљћљ§њўњњўуьvGA*."!)!P]S]\b^]]P8?Ubнўўѓјљїїћћ§§њћњўћћяўћўњ§љ§њ§њ§њ§ћўћўўХ”kW1$(!OVS\ac]ZT\^aZW~Œђў§їюѓѓљњњљ§њ§њћ§ў§ў§§ћўћ§ћўћўћћўЬѓ‰EQU;&%!JSLZa`THHWaaQN@;Зўўээёяђєљњўћ§њ§ћ§ћћњўћћўўћћћўћў§ўўъЯN%:C (NOOZ[SdNHVVэMPkT+`зўштмђїњћ§њўћћњ§њћњњћћї§ћўћўћўћўўгŽ<AC^b),!-OIMCE@GOUVIMFOVNC7TЅгљћысєљ§ћўћў§§Шўћўћћњ§њћљ§ћўњ§ўўђj.U+!PUFBСїўўѓљ§њ§њўћ§§ўћ§ћћњў§ўћ§ўўи’+5,01&#+VOLOGAQPGIC>@HMJCITZQFBAPM‡кўўћћ§њўћћ§Ъўњўћ§ћ§њћјўўњŽ870-41013IPCA<@>?;H@HBSITBPLLPJEaeLMd}Їўўћўў§§ћЫ§љ§ћ§љ§ўўђP4,,.,1,3LHEG3:78?:>@5A4I;LMIGISYY;HmkW‹ЈШўўћњ§њ§њњі§њўћћњ§њ§ўўг…$3B599*0J?>CLW(:@9INFCEAHGMYW]`jnrqi~xJtoЗ§ћўўљ§њўћўћўћ§њћњўўї?7FAEPILMICV@PITVYSY\^ed@FєўўэЎzk^ССЯкЫмдбхцьющјўўзљяР„kBpZLN[;9HLIOBZU[??IPOHTVcW\UVQ>8iСўў€ФЅ3@3ЗНЧаЪФЪЧеюсюїћљњљўўэЎКЮНvj\4AEHIJIOZZ[Y+@CEPHS\Z]SPTVZg\YЕўўєd?OШЦИЗИВАбрнтјјћљњјѕљтЭнррЄ…Z9V^@NJPTYUG`INFNCOO\V[[WQULY[>U‰єўЁ[LРРОажзйеЯЮтїњ§ћ§јѕѓєьпхьЯЦцЩmJJH9MPOHEGEGUQJOEOJU]\YZYSC@CVu—žnMПўw<§wџ;ќwџџ:ў€џџ:ўwџџ8wџ7ўwџџ6ўwџџ4wџўw1ўwџ џw/џўw+џўw*џўw)џўw(џўw&џўw%џўw#ўˆџџўw#ўˆџџўw"џw ўˆџџў€ў€џџўwџw#џўwўwџ&џўw)џў€*џў€+џўwўˆџ,џўw/џўw ўˆџ.џў€ ў€џ.џўw 3џўw 4џўw5џўwўˆџ5џўww§ˆџ<џќwˆџ<џ§wџ=џўwџƒџўљњћћўў§њњНљћљјїљјє§љјЛak‚hcB;,t‚P:7>G1e]Y[gq…ўћўўћњў§њњљјћћјљљўљч”L($CHJC9AAFIMLF<>?A@HNTQTGc„vŠz„vrv~rhYkzqn§њњўўћњљјїјњїјћћў§ћ™ha>;EH@?;95855C408@CFGCF8?Gi]LIVOQabop`^adcB§ћјјѕљћљљїњњїјї§§ЩœM7@7EB?E:5>BGB8:32FUPSHE[]Uw}pJ5HW\hmINY\ocUajdoeE{љљћћФјљјјљјљћ§ћљЩ‹qb„zMEFJF>19CBE>**4.:GSMFZorccaajkcd^TZkccqw{r§§њ§ў§љљЦћ§љљœwbE`\%&;AGC@CLJJBB<>:4,+-3@oŠkAONWgeedhmbzhiew}z§њљљњњЪљћїљћљЅrpGGZUSII>9;>@HF4++;:9-,@:?QP]W^b]ghicnœŠ„|u{{љњљљјљјњњФћ§љЭtZcvPPQVSWSH??9ACGG)I[c]a]T^Tdpƒwr{~xwљїїєєѕѕ€ќєјћјЛmLTAb^VVNHAL83<9EBA@:?>9-3WngkSƒœ„`Z[SGOGGawrzˆ‚urјљћњїјљјї§ћсkPG?\]a\UL?1:;-1751@GIA4?(;rkUabx~dP^gmxu{w{pqpkih§њјљѕљњї§§хb\VY^^HBLA:A<;9,!9??<99>;750J\WNEC*(Ogj^\V]`]ad`chgZiu‚w‚ˆxxwmeјјњћј§љяO3Tc^ZVQLGC44<7;.,;>GHB@OM\C\v`VCP\PWUSWetvzutv}{{rojrvїїѕѕљ§љ„IEQHMHE?JG998:828>BE@8;+9G]wbU]L\YZM[Yw’ƒ„vƒƒ„|‡Žuqp}zњљљ§ћю…;?e\FIM@F;94.9C?;?7<;+-09-anjoi]emeggёMP}uvŽŒ‡~‰…wmm€Ыzˆїћћ§РhV%%ITIFGMOG>.5@BGHEELaeYg]NN]ca\TNe~o{qz—Ї”ˆ„Žqgmugcї§јаYMYJ))8--:)5?>.7-10*>:8<37)<^YQS]UJP]dgZMP^igoz„Œ‘ƒ}žxFTpnW]§§сtA;2<,()1$".&8413.37<5AN9.GO^bd\W[^ijkmb]\bjrz…ƒ{ƒk:\cUhw§ЧUNTSNAA,8;E+)57,.(:8;>;CA>Ojw|[denhervohgmozx|}~|uvrviQVb^Pv˜љ‘EWcMBB@<>FI.FCBEG70-4GFEL[}pnchnbiuaVMax}~‚Š…tu~j`aepoux…Y79-@C-51*);3#+:?81F:4-C\Vgh^Zqgijkmu„cQFLkv{~}ƒ‚‰ˆƒ„vicci`{ŸF->SECA<173(75BA8JNaww`cvrhjgwxqI2E[t~|xwu|Їz{zpq~q„ЏЋ:INIBA><;.-30)(CI4;@C:23C[tgV^\rd`\pxwjW]gdqxurko{v|x|txxge‚ОКЇЃCUCPLI;*.<>*" 1VC;CFCOn‰”pieie^cgrkhj^SV^hmqtjvptzwuqm`‚ЂФОЄ„%&BMSUH<8*-:!-4,EIFU~•ˆ|q^jgVahtwrVP[PG]muxƒ|}{}vvipr‚ЄЂЋЏБ’8@@d`NE&1!&*+O?GjU@œ„u{zuroggkt|qb]Q^aan]`‡‰‰…wmoq}‡•Ÿ™’…~()(@2?o7""€ 3H?GET‘Љ‡|jbapphO[hroe[]Yhptqmr‘…zz{|php™Ћ’Ž…z•Є&?IH7&#" 35;:ИŸurd\bh[$*hueidiqŒppmmkz}…‰‰ƒxicV|ЈЋ•„”›2)2,3+ 2C*93,Ok{gII]d`dYYe„–‘rxvxŠƒ„{t{ŠЃŒ’’‘vhW|˜ЇЅŸŠ‡”)#+50+3]q230<*#  *HZTCƒ—zqa‡ЇЕœroddu‚x~vt|c[t‚ƒwqvqk‘СЕ›™—ЅrO?084"#!   # !av{zqtuРО}pzh`goi|‹ˆ~bPcx~onzvUЎŸЄ–Žž’xde;75:J  $+t‡‚{ƒЃžƒpp|jcpg…Œˆ}waYao‚Œ‹…vrŒЃ’–™•‘–mo{>;;<:@@95CEBEE?;?CB;9?SVZVSpqqДФИ’•ŸЃЎЎЏЗНИКЖЄЉ§ћ§њњ§ћћ§њћњњўаž\VTbhYTMTOMHPON?247GQOTVH[[‡ЏБДВœЃЁЈЈЋЉЋБЗЗВ‘Чћћњћљњ§ћ§ћћўўЭжraŠxHMJIIABFMHE?4392GOccZuЂЕЇЋБДВАЏЊЏВДББАКТЭУ§ћ§§ћъњўў§Ѓ~aCcW-.HFBFCAELEBBоA@8BCGOJ@9;>GECIWWp˜ЎЏžЄЊБВЕЗДДЦрбЯТОСЦЪ§ћћњћћњљњљўўЧдw]n}UWVUZVTIC>ACILIBEPVN:ISh`}xžЕЕЗБЎЎЇЋТдЩЧШЩЦУћњљјїјј‡љњўўРuQWEa`WWUIET855B@GNPLGFGF5MЇЂНЋЫшбАЉЇЈЇЂЇРОТЧЧСЖ§ћћљћњћњћўўуrTE;`hZWZQG@;744;<@HE443к0@OO:@Y{ЌЋЃЉЇЇЋЋЈЊЋЌЎЅТФЪЪЮЮШФООРЛћњћњњўŒ–@<9>AGLG@GJŒЖКВЏЏЎЌЌУЏЇ’ЅУСФЩдаЮЪЧЩЪФРРЦФРљњўўНoZ&,TUWUVZUMA?>BFHIJ>@LSVqZrЉВЊЏЎЌЋЋ€ŠЌЉЅЅБЦЛМТШкмлеелТЗДЕИЕљўўжZSVJ0EEA9A59EA>5:<@AEIH[OOnЌЕЋЉЎЌАБЕИЖАЏЌАЕРЦЩШШ€ЋЦЩЫИ™ЇЏЌИРўЩTSPSIGCJFHN41:?8742&8@FLSVSxЋИШАЋБВЕИЛОРКБДИКРУФЦСМОЧУЖЄЉЃЊЅНЯў•I]gLL@IPQSa127GIAACA;9BSTZv›ЦЪКДАЌЏВИЧСВАЄООТТСФЩУЦЧШУОЎБДНЛСН‡^;>8>@>BC<>B@22EE?BC@;7MemŒИЎЌКВВ€ЪЗИЭЖЃЃœЖОСФТМУЫЭЫЧТНВЏКБЌРсрJ3BYHGI@;5.7991,8A?BHJMI]b„КЦИИЗДЏЏКЛМК•ЋЄЄФаШЧНЖНШШЦФТМИЖРНЩгщй?ZHLFFC;5<94584EJGCCGM>EUЖДААБЌАЈЊАОКБЋЈЇЌЗЗККИКНЧУЦТФФОЗАТэумм>VCQSJ89:;?<4+2*>VLHFLSaТажКЏЊЉЄЄЈЕКММБЎЊЌВЗЖЖвНОСФШФСНИЉЦсћђуЯ*$AZZWE?:>CEE.2FEAQOUo›ЪОУМЛЏЏ€‹ЋВИМЗ™ЎЇЅЌЎДКОТУФРТУЧСУОСШнлсйтг8@Cc`OC0:89:3-L]EQ~iSЯбФТМЕБЎЎВИММЖЈЄЃЅЌБЌЕБШЭЫЪШТТНОРЪмхзааШЩ)00:*Em77245441GVLTWdЌлЫНРЛКРВЄЂЋИКЕЎœЊЉЎЖКК€4РйЫЭЭЫШТТЖДпхеЮЦЭее&.Co‘ДЦУОСРСЧШлЫЄЅЅОРРМЛРУЦЯбукЋЏЏЉМНЮмлШЫггдгФДУТР)-7417hЈККЦКИДЕЗЖʘŽ›ЉЋММ€0ТМКНФбеутбСЛЗЊБсэщедбаЫФТЧФУФ",39?@>NN‹ДЦгРМОТОЕЖМОМЛВЂЈШУЫФРИЕбжддйждгЗœ’ЇСгЮагаЦОКОРТС+2G23TzЁЕЦКЛЛРЦЩФИИККМОЛЛРЧЫЫЮЋВЉЯйтпрмнеМЅВЖЩбдбгЯЩУЛНССР :#EPkЌ™ЁЗШУФСННЧЦНАЎЎЗОЛЕЛОФФбВАЊЗЭлмнмйнТЊДСгюжждаЪЧУУФСЫ  5^˜ЪЧ—ЗЖОУЦУУСКВЏЉЋКНЖДКНИИЗДЅЧЯЯдммлезЏЇЎРбкЦУЩЭЪЦСФЩЭЯcЏЦОЈЋЖЧССНН…ЛРНЖЖОЦУМЕЖМУУМЛФдйкйпсуэнБŠ~ЅЗННРУЩЫУККРЩб%$*$"`ЛЗЕБКНСНКМЖЗКРРОМОНЛДААДЛОСРФШФОЯупрржжУЈШеаСНМССЛЕДЗРЩ1J50&1[ЋСФТЦЩЦЦ€,СЗЖМЦЧОЗЖЗДЖЗВБВЕЛТСТРСЦзжккпЩСРчњуРНЗМЛНИЖДКО29#4:hЪЯСЯЯЫЦЪКБДРЩШСКДББЛЛЖЖДКУЯкщкЪЦЪаждйзжх§эбОНКРЧЧУОМРС!-,+4]F3ŸТЖмїеРКВЏАЖФЧЧКЖБКТФРЛИЗИЪйейкдЪЪЩЫВЦчцјЫРМРНФШЧСЗАИФ"!$),3SŽЕЁžШУМЛЛЗИННОТОННММЗЕАЖЛСЭђпсмеЮЪЪЩИдщрЪДШШЪУНИКНУССЌ0L.4<?.+&*.:„ткУЧШТОНТОКЗЖДББВДОТФРТРСРТРИФеечпммдЖТШлжбЯбДЈАИбде?HH>&,31&JЊЫОЛРНЗИННЕВЋЋЈЊЏНЭСЧУЛМРСТУМЯуюршжУДЛТШЮЭЩНКЈЏЏЅдыг<>95,34.3$7vИЖИННЗЖЛЛЖДВЉЇЉСЭыебЯУУЦЦЯСЦЩлппйЫЭРНСФШЧТИНСРЗŸШегG9449@;9:..OŸЫбИДВОСТФЧБЌЌЊЋКхкшбВКМТЕЫѕўћсЧЮУЦТСУСООРФЧФлЈ’ОлзJF>>;72,aV)q‚}ЫЫЎ‹ЊЇШдЕ•ЄКМРсктЦНЧФТЉНыўядЮдЯШЧЦСКАБЗЧЩЮкДЋУййJC>pH:,xz4‡–rцтСЈВЦТУЕ›ЃŸЌаяћяыкОЕЩШТЇЦнжЧЪбегШЧЦЩУКŸЖЪбгЯШФСмд>9.L^n7N:>,,ЈёсЊОДЊЄЄ€ЈЊЈЃТшсдЪгЈЈСЪЫЪЮбЮЮЫЮдЮЮЪЪШФЛШрхеЫЩТОЩбшHI5@$00,.>`”АЎДЋЄЁЉЋЕОбсЯЪасУЛОЦЪЪЩЩФЦЧЩШТТРННКЗбабЯЮШУСЦЩЩB;74152-&(&!"?3UЊЫТВЉЊЌЎЈŽЌађпСЧЧСТСТСУСОРСТТШУМНИДœДгсбаЮЭШЫЫШС:B?747-$#"BEcƒ„ЦеКМЦЌЩшягКЕЊЕЛРМРУЦССЕЛОЧФЛИЗЖЉЯёялжйебпуНЄ9@4&CУэдФТЩЗАЃАВБЏЂТсТОКЛЛЖЕАФхгбЩЦеэьзгддгЧМЛМСўћ§ў§ў§§ћ§ўеЭv‡ЃwWL[UZ]ktma^YUUSYTP^T^‹”‘~S]`tnor—Œ§ўў§§ў§§ўўћћ§ўћўўдЅpzggrTWWZTViai`YZa\`\Y\NStƒx„h^ujrvtwqŒŸ§ўўў§ўўў§ўўў§ўўў§ўўдКaTvq^[Z]^gcZ`^\d[ST]bZdWITF‰—gTJ`cOurun~‹Ÿўўњ§ўћўћ§§ўаАg;8[k[QQYV^Y[\\TUPYWckiniYƒЂ’ž‘–‰ƒŒ‰…zn{’ˆŽ§ў§ўў§їћўћўћћ§§ўўШВ}rTOZaQQMIQLLTQVJO^[]a]WLJ^‡nSIdhjkx|ˆ|wv||V§§ћўћў§ў§ўћћ§ўћўўЯБgM[V^PWUQNQN[PTTLP]pwqd^rvm‹…YVT[dm}{„ƒ{jx§ў§§їў§§ћ§ћ§ћўўШДkkhrwpecge\h[[WQMGUceqg]N]Oczw}cein}trxx{‚|]ާ§ћ§§ў§ћ§§ўћўўЬщЋ…uЂœaaZabZY[Z]UHMSHJ\cqgcpŽvxƒ„{zv{uoo}t|‚‹§ў§ўў§ќў§§ўўЪЏY~pAB]WYUZ^c^ZPSZZSSNMOW`…œ„hptv{{wwuxv•||zŠ–’§ў§§ўўќћ§ћўўЭК~˜YcmeghSYOZV^]\MGJ\WTISTOTaozorrq|~|~‘БЂœ„‘•›§§јўћўњћњћўўУтx‚Žhqqjhk]]SQSS\^TWZ]d^EEMH8P?Cawzwtrtctƒœ”’”›Œ§ўњўњћљћљўўЩЯ…gp`vtnko]`dHTOJVZcb`YWSN4Lu|h~m–Б›vdnjceZdrŠ…—œŠ…§ўћћўƒѓj`Ox|vnmdYZQMLMMTUUaaY[S?3Vwvm•}ekkwˆ•ˆ’Š—‹ƒ~§ў§ў§ўћ§ўўѕ”x}qqwwWTb[YYTLGCNQTUNWUYTAEz‡‡hgkuj[Tit|„ŒŽ˜—™•‰|zŠ•§ў§ў§§ћўўФЄutmkqji}]ZaW]MLGEFTEUY\GBH`zqdjpknkpgt}tm•”›ŸЃ›~‘Žzћћ§ћћўўУЅJauthgdnb\b[aTIG>Zzj^^W<@]}|opp{{~|wv‚}„’”Š˜ž”‰Œ…ћўћ§ћўўУЕkBu}xxj[e\[MOQ\SYQPT`YVYeaoaj{hckrvvpxvƒ‹‘‹„‡––‹…„њ§ћћўўУ™[[idi`USWSTSQPQ\OLU\QZQHSToŒ|`ommijjoo~Њ˜Œ™˜–Š•Ђ’‹‰ŽŽњњ§ўўФžLV}md[T`YWSPQSUP^TUTWUUNIAr~Š„{|x‚uqwwah‘ŠŠ”ЋŸž‘™œž„ƒ‡”Žњўў€yЩ}r9:jhcZ[`a`WPOQa^]TWY\\gnU[v|nwvumqxvrpwx–‰ˆŒЏОЏЁЇŒ‚„…ztњўўтnetd>SLHFQHO\\UIJWOZP]WSSCCVovdeupinxrherv‰™ЁЉ•–З–cb{…vvўўї‹PSJUMOQFB>BENTSLBGOUV\VbQNV[q|puhko|„‚|uzuv„‹˜œ’”‘”˜‚ZtvrƒŒўжiedm`^PLOQY2CELLMGHVFOV[YYUcx‚Žr|{‡ƒ|…‹Š}~„ŒŠŒ–Ё‹’‘knpqi„ЉўЋ[r}cYgTUVZ]9?GZ\UPUZVFPc`Z\n”˜}‚zvz{u’Švkm‚Š–›–›——‡‘›—~r|z‡„Љ›tNON[TWSHMIGIGIJWOVOcUAWrp}ƒ~p‡xv}‡‡ˆ™{pgdƒ‡•™ŸЄЃ›˜˜Žvux|x”ВЕ\HTkc`ZVF87EBA;ILQNYY[STbkxŠ{|„}x–‹‚^emjŒ˜œ–‰‡Š‘œ‘‘’’ƒŠŠƒЂСЛQk][^Y[SHHFJA>IW^UW\]ZMO`o‹‚wuzwupŠxkwzuƒˆ…‚‚‰’””ŽŠ}}—жЫМЛPm]\c]ISGPHI5074Np\[U^Ui‚•ЃЏvzpdp{‚‡ˆ‚mp~~ˆŒ‚|„‰‡Œ‡„~o•ЛспНž:H[Whƒg`•Ќ›’Š‘…}zvx{„Œtkpmv|x{~‘œЄž˜”ˆ‚~•™ЌИЏЇЂ›–;ICFAPwS9CAG784Pb\[[cЄМЃŠ…}xމpgt~xijqz„…„ˆ‹ЅЇŸ”–‘{…ДЧЎЃ–‘ЊЛ77@H\TH,21@B>70.MQIV–гЕ‡ˆ{z{{€HG|Ё~tx˜‚ˆŠ…„››žœ~}m•РЛБЊ–•ЋИ48>@;;28HYJ?239SUJc„Ќ~\hpt{zqk•ЎЊ‰‰œ˜ˆ’ЃИЁЅЈЄŸ‡xc‹ЃММБœžЁЉ,+A;E075H}‘V+E;OOTnˆ‰‰zz|‚‚„wt}…—Є’Š•—›–}^a…ЁЅЄЇЃ™z˜ЈЫеЗ‰’Ѓ1%47B9<2VcB85;N]m‚’‘‘އ‡‹‘Ї•naj‡Š˜‰ˆŽ‹™ЇВЏ~~}ЁАЎ—ЅЊАЊ›Šˆ‹"*&&2A@>AIBB:#2P}ƒ}–‡w}{Œ‚aUbnv~„‰Ž‡‰ŽžЉМВЂ—‚„|„ЛбШЌЊЈž”Œ’™”&08A9?@HEHBk‰‘Ёƒ…ŽŽŒ…‚ˆŒˆ‰ƒq}‘Œ•›•Œ{ЉЉЁЊЎЋЏЇˆpgw”АЏЊЎž‘‚‚Ž‹Œ#&&AFT:&Piz~‹}ƒ‚„Š–Š…|……ƒƒ…{…—ЁžqxkЁЌКЗЛРТЋ„m{}ž™ЁЉЉЃ™‹„Љ‰%"+,S21NM\ŠnxˆœЃŽ‡˜˜|tw‡”‰‚БޔЂvvt‰ЕМКДЋИ’{‹•ЇЫДЌЇ™ŽŽ‡—$(!A]‚ž”da…ƒ–’›Ž„uww‡‰ƒ‹ƒ„…„zr’ЃЇААЖЗЕЊ‚x‹™ЈЖž•˜Ё—‘‹”˜Ј1*0&WˆŒz~‘‡Œƒ…ƒ‰”‡‡‰™‘‚w}ˆ’ˆˆ„•ЏЏЎЗЛЛЭЎ|YUxސ‘‰–ŸŒˆŒ”•œ 9@@5+)T‹ƒ‡Ž‘Žˆ‹ƒ…‹—Œ‰„ˆ~x{xŠ”•–•ŽЂЖЖ€еИЊЈ‘xŸВЃ•މˆ„{~‡Šž*0JcB70>ZˆŽ”›™•–Ž‹‚ŽŸž‡ƒ‚ƒ‡…w}…ƒ‘•‘‘–ЇЎЊЈВ™УзЕ‹ƒ‰Œ”‡„ƒ‡Š,IE<:&?2P˜›Ž›Ѓ”Ÿ…‡ˆ‘™Ÿ˜‰~w‹‡|x|žДТДž›œŸЌВЌВЉУчжЇ‹‡‰Ž•’Œˆ‰„ˆ3F:><:LjF3q™‰ДеЏŠ‹x‚Œœ’|~‡–’‡{‰–ЌЏВАЉŸ™Ј›ƒ˜ФЮкŸ‹Œ‘‘žŽv}›˜599€С4@J]GJkvvСНЂŒ…‚Š—›™–Œ‰ƒ…|rv‚‘•ЄЎНДЈЁŸ—‘iШЯБ–Ž‘–˜––‰„}ƒ|4;>89A;:4;p}jpœ‘Љ~‘Ž•”‰‰Š‡}}‚w‡ŸзУИВЌЅЉЉЁДЫ͘„–ЁЄŒ……”–’•)M`3AGEH<0`Š•ŒŠˆ‡ˆ‹‰|ƒ„ˆ‡ƒ…vptu‹ЅЁБЛОБž••ŸИОЎЄ˜‚‰˜Ѓ—Šmv…–’‘—ž?eTPCC€јE;JƒœЄŒ‡‹’œ”Œt„|tz}z~‡—™ЎЎРЌ”—ЅЭлРŸ~ЈЃ–’jƒŽ•‡~ƒ–PLBC?>93?,.ƒЁЁ‰’ŽŽ•‰}‘„…|vnz‘ŠŽŒ’’ЂТЗ•~nŽЩєцЏŒz}ЕБЗЊ˜Ž•ŽƒƒŠNLMOF80;FA;кО™žœ˜‰‹‹zz}r|vnt|‘––”˜žœ”v„{˜КлЫДŽv‰•БКЕВЗ–mqq—–›LUHLVB40%93ƒЗЃ‰žЂœ‡Š…‚‚wim‚Žƒ‹Š‹‹ˆ„Š}”ЃЉССЗАЅŠ‘ЃЋАЋАЋˆp|}ŸЄЃT]VF2<<;8#+O‰•Ž‘•‰ˆŽ‡|vttqz~ˆ–‰”‰ˆ‹Œƒˆ…ЄДЪСШЉ•„‹ŸЈЊ•Žˆ}z|rЎЯИUZQBCEBB>.$5a„Œœ„‡’ŽƒuoowŠЛЌЁ–Œˆ„œ‘’žАДАЎ˜‡›‹‰‰‘Ёn›ЊЊTVHELIAG<2.F—Њˆ|’–™Ž”„wmvwŒИКРЉˆ~„ˆzЄпјнСœ™ŽŽ‰’‹‰‡…ˆŠ˜ЌАw^’ЕЏ^VGN?>A;aY0rt^ЃЈ~YroЈЖˆgjYa„‰™ИЦЛ’‡””ŽuŒЯњмЄŸЊЂ—•Ÿ’‚‚z‡˜ŸЉЉƒ–ВР]T]ƒJO73‚‰7Ž[ЯШ”~~™——johr›ЫуЭаЊ…u•™Št˜ВЌœЃЈВЈŒ‘ˆv›ЊЏЂ›‘‹ИКTW7\mЎ|@cEI),˜йУx„~{konujŽФЧЉ›žtr‡Ž–—›ž›–ЂžœЊЄŸ˜‡™ЏМЎЉ•‰ˆ•ЊР\hJN(74%71 Bbƒ„|zqoptzƒˆ›ЖŸ—ЏВˆx„Ÿž•”œ’‘‹‰‘…ЋЈЊŸ˜Ž•ŸЅЃVUEIBencQžЌŒ‹‘tЂФЪЕ‚…{{‡’•’—”•zŽ›ŽŠ„}ЇеШЏЊЕДЉЛФŠgOOLOC>:9##5<4I0.1&MLH7>@;?GA:&@ЁЪЎœ”ˆwpx{wum’Д…‘‰„‚{{˜ФИЎЈ–ДбеВЋЁЇЁž‘„‰ўwџ&џўwџ'џў€џ(џў€џ)џў€џ*џў€џ+џўwџ,џўwџ-џўwџ.џ ўwџ/џ ў€џ0џ w2џўwџ4џ6џўwџ5џўwџ6џw8џўwџ9џўwџ:џўwџ;џ§wџ<џўwџ Оџ€лx…•››™—Œxw{ww~c`]wЄБЋЅ–‘”…}•ЎА›zqcQC8722.+)!#&1?4 {}}…Š„ur|~„ƒpZdopŽ››‹•–‘˜ЅТДЎАМОjHCE%$+3<.#*+"   &$ŽŠŠ}pqxpp{x|ŽЛЎzWTm‹œ™™–˜˜••”™ЅВЕСЦЛ‡UA,598%)$! !  –„xwtgeqtzozƒc8G•›””ŽŽŠ”ŸЄЊ™‚\QP[?%3;P   ‡Ќ™reppu‡ŠŽ’‹tL\ju‚Œ”ЄЂ™‡ƒƒ‹‹ˆ•™ŠmamaY?# (#"   ЅЃƒkep|kzˆˆŠŒ—mVZYqŒ™ЏВЄ”ŠŠŽ‘‹‰œ˜‰Ž—˜ž–wM0#0;;E%"  ЌЉŠY>*   ~…dWO]„‰‰ƒxttz‚މŽ‰|~ƒ||}ƒ’ž…{wxidbuokmZ:  ‚‡t[bu…‡‡aYmig‚‡…ŒŽ~uw}u}upo~Ž‰„}‚‚vz„‘‘rG1+    ‚ˆirt”‘АЄrU^egv~}—ˆxx{}}‚„А–Œ{hk\Yhu|…zQ?OU8|vndЌЅœ…j^t…Љˆ|rtwq{wz|ƒˆ|ŒŽ‡Ž’‰xonoehdba…i18J&  ihijrv…{kru‚‹”‘‡}{vwv~ƒ‰ŒŒр‘ˆ…‚‚‰~timpga`k„zF"-E`;# й pqk`iqzoe`Oe‰„Œ’‚„{rw|‹”ŠŽŒ…}}{wzwwйumc^m”v1%#,!#8-  qheiworztcdnow€}~|ƒ‡||ƒŽŒŽ…~„‚‡‡Ї™o\c›v!(#($  i|vptjxzmb]‚‚|{z~~‡Š„‚~‚‡—”…Ї„ƒ|bSPQFTV^{\)#.!%!..)(q|{|~‰ЃЋ„V[‰™‡‡„„‡‘ŒŠ‹…ƒƒ„„Ž…Š™„ƒ„{][[c`^r8%(30!"))-+% c^gh‰ЏЁŽpjjz–‹……‡Œ—ž™~}„ƒ~}{{~‘‘‚zrrjdmh^h„g1 %,0#*17*hnt|—Œ~x~z‹›•Ž‹‰„~‚}{‡‘imrto|Њ”hiebcgbhuoI40(!#$#%*:?9<1„dxЁž‰……|uqrŠ›–”…‚zxmwŒŒ~wzuoprvportkqm|ƒe00F>(,%-("!!mNБЏ’‰v}‹”Šƒ|tpv|‡„znquhnvzzijorja[U;!%",-(++ *g[|ДЌ•‰‰……}‚Šˆ~‡‰‰ƒ}z~‘„vqrx{tmmrtjbcogWa\F-9.&%"+$ Cxg{ЁЏœ‚wuŒ…}„‹™•’‹~|vowxrmedckrrpj\[igageG$041#()  (-ЗŸ›–np|ˆ„}‹œ›˜‘wt|Š~qjnttrkpwteZSW[az[HGF*%$0;;78," !>;‰•ƒopph{ƒzpv—•„ƒƒ}x…uecz…‘–zbntohhQPgdJ>2"())0)05I, >V@>ŠŠ‡}uqqx‰‹’‘‹‰„ƒ…~{w{}|ƒ|pcЊЂЁƒQaoxvd]mcF42!.582-%&",; )(%(%.5$+&1 !4@3N’НЩФ‡}qo…Ž…ƒvnrw|w‡‚}‚…Ž•ЈЁ–\ctrce^|…T-7AB5+,)%(EG\‚—””‹{vxz{……wvrt‚‰Šˆ‰‰Ž•˜‡ƒŒxo^\`A"!IA(++ 1:51[˜–˜……‹…vggq}|„tn{{q}„ƒ‚Š—™Žnp|wnjt}m9,!#! $BGLO…ЎЁŒˆw|‚„vaap|v|‹‡|‚‚„|pt˜•”jpq`a‡n?+:A0%"€:?,JŒЕЊ•…–•‰zvipu{ƒ‚‡‚uprxЇ™g;Wmr^SJVpQ-")7**)&" ,91`ЄЉ˜‹‚ЄЉЇ|uv{wx~ž„ˆƒzxw‰d5.Pc\UWO]vJ:]A950."+)2- (&Z”›—œ˜’ЉˆŠ}wpt}‡‚}„ŒŒ‹‚|z|vƒ’p-Ov\U^i‡…T($"+.2.&-.""-5EjœЄЊКЂƒŒ„ƒ‡‡„ˆ‹„|{}ˆ~~u}P&q~\UUgzA0. &! 5?FPxВТБЇ‘xxwt‚…‰‹„~{wx‡™–|tuvq~oWYw}i`m…ƒiA+!&$!(3$%!3B2+$! )2j–”Ž‘•ŸЂŽiZnkqœ–ˆƒŠƒvu|}‹Œ‹‡minuv}wwxŽžŠI- >ktZJ4 %,3B’ЎŠ…•Ÿ™‘‚]hx}–—ˆxu~‰Š~‚ŒŽ‡|}zxnw}‚{uqvvMWH Cot`; *^Ÿ‚Žœ˜’ЂЅrxz’‰ipz‚‚|x~…‚|wxrpx„ˆ‰‹…˜–‰U+23;<%.9A9+!! M’qvt™ЁЅ”|{jSYVЦzŠƒztwwx}znjww~ƒ|nqŠwA8@0-&+$#)#$#9;p‚}qz•Љ—’‡t}uTUe—‹ƒnj{|‡‘’ˆ‚„}ƒ‚wt|‚‡|mwuB4>+"$..*"((* ;Zuxu‡Єv{…~—~dauqvzСбЈƒq{|nhottpr‡ЇЋ˜h-$%&*$"$;>75901)CBFY|ŒŠqouwopv}ˆ~]@xjgq‚‡ЏЛЇ˜‡xqpopntvr…ЌЗžQBFB32+1A4,*(9oАoort\cuƒ•АŠ|ƒtmqku–дѓкЗgx|xwƒŽ‰Š™žk)JE8&0>:.)!!!C„Ÿ—‡„}q}—’‰‘„qncanƒz„ЁЋИЖ”ƒqhm}„Ž—–”БВŠ@#5.5?1&&$!-*.# !-?;Jh„‡wprvz‹’›•ˆ„|{toc\ƒЂЉЃЌœ~orhcxƒ‹–iv‰oHB24.91)2*$&,(%*&Per|…ˆŽ˜Œ‚Љunkjtug}КФ—ˆoCW{oz~Š”Ÿ…xbC$1*.?A3 #>2>bjhn‹ˆ……ŠŽˆ„~uiab”ЅДŸЉžhYeb+HcrˆŒАЗ|".8($!3))4$!$1G]ihztx‚…uw}Œ‚{tc^\€•ЮЭбкнйзбЫФУТТЫЎЌЈУыєтнмйггУкшэлВ™}`LIBNCA>B>:88>@T;!"#%-0аЮЭЭЮлбЩШУФЫйеЦЅЌЗТбпежежззнђпхтчнВ|WQ[CB#""$#(азЮЦФФРООНЦЫбёюЦŸ™Идмм€нлзййкклйрьјьЌv\GONUGB84473%-41)"!&#ЩсеЮЧРМНРУЧФЕЗЖ™ŒЧкЫймпллздЮЮежкмтйСŸŽpnWA8;:9:F\$%&$($#$!СщнОЕОУЦФЭдалжД‡ЁЏНШЭзмрнйбЩШЫазкжмЧЕЎЖБŒ^924;798,&!хыЮОЌИЫКФбззстЏœЂЇУйпмнпкбЮЮбжжгдзеЮзмртеЋ|LCGN[^B"(#"##ѓёа˜‚›ДЧЫгЯЭЩЪЇœЎЅШузкхабаа€œЫЭЭЮбжбЪЧУЦЭЗ—…{iTG7" $$ЩнЭЊœ˜ЏЭШШЩФРИЛТЦЩШеггаЫЩЪЮЫЧРУЩбжаЫТТСЌЅЌЛБВЕ–[5*$ЩЫЦЈДУЦЭдР™ЃЗЏЋСЭЫабЮЩТЛНЩЪЩТИМФЩЮЮЫЫЪЧМЛРСНЪбЭžY@5"  ЯЭЧНФЮдбтсЛ›ЎЋЃЗМЦШШЦФСОТФШЪЪФЩЪЮггЮОДКЕБВЛЛКОСŸeLV^F-%%*%!$УСРВЫрЫйУЎЈАЦдЯЫСОРУЩЧЦРУШШŠЮЯбЫЮЮгдЪСНИДАЎЌЈЅЛ‚A7`c@%))!ЖЖАЌЗЕФаЦЛЗЛЦЫЮЮЭФУУФУУТШагЯЭЭЮЯЭЭЯЩФМОРМВЋЊЋФЎ[2@ZuN44,(--(#"ДБЋЌБИТСМБВЁКйЯЪЧШШ ЩЦФФЫбддЯШЭЭЩУТФУРФЪЦЗЋЊАбЎL8BFH@J@5(.!"РКАБЕКНСИДЏДНШШУУТУШЪЫЫЩЧЩЫаЮЫШЦФЧЦШФЦФьзБЊЅЛг•-8>Е<83.*""ЖБАЖКМИМИЎЃЧЦШЩЧФМОЩбЯЭШФФЪбаЭЧЧШЫЪЧСЈžЁ™ЄЉЋНw->H??89;<:7:;><3;C?;9:;;59794898>ЉŽЉшюкдаЮЪЧШЪЪЫЫёбЭЩСТЩЩЪТОСМЗДИИ€щАЈЉЊЈЂЇЂuNNE?B9598;234-.18UМЉЕнђтЩУЦЭЭЪШШбдйебЩСМРЧаЮФОИВЎАДЕЗЖБЈЅЃŸ›Њm>0AAC;::47:4.0-,);AхгдегСЎСЧЮШШЩЮекйжЯЧУТФЪЭЩРКМОСНМЗЗЛИЎž›––АeZU>?CCBGIJE:54+4>MMЩЯЯШЗМКТЦШТКРабЯЫЧЧУСУФЧЦСКИТбЫжНЉЖНИЗЌЅ‰Žœ~`W@C@@ABCIIL[E71apUJЯбЫФНИКРФЩЩЪЩЩњШЦФУУЦЦ€џЩЫЦНЁРрбсЦ—ВЕКЖЋ˜Ѓ˜vNE;7@BCE@<;;AC?@+:LбЮЫШФРОЦЩЫЪЩЫааЪУРФЧЯЮЩТУЧЫЩЩЭЮОЖАНМКЊ›žЁe05I@78<:87:>7>GGE<;><:NZPtОФЦФЦОНЩгееЭдЪДКЛССРУЩЩЖТИДЏлЭШНЕВИЗКЏВ›dWV;9<>?>>7:8;>82:99?TxАЫШТУФССФЫгееШКДЖНСТЛЛНТЧЧУЦЭжСИЕДЖЖвКžŒgA237<;EˆЦеЭШЧЦШШФЪбдадРКОЧШШ€ƒТЛИЗКУСЛДЎЏБЖМКЖДŸ‰T79:9<?:BiЋггЦШТМжЯЮдгЯЪЦТОТЧЪЫЪЫЦРСЦШЦНДЏЎДЗДЈŠ}[:7>9;>;@@FMJE?;>>B[^J`ЉжмзУСЃОѓжздЭЦНЛКМНТЧФЪЯаЭЭфЯШЩЛБЎВАЈŽŽЋ•`A-9;@??<@FI@244А*.LIGuЦайШдРЉЧсеЮЦТСТТУТФТУФШЪЫЪЯджнЮЇЊАДБЉЃЂži7$?AA;345,;IZ[xДШЯаСЧТСУРТШЪЪЦТТНРЧЮбгаагдйЫЭЛЗВАЎЌЕœP>5):YJB88;@>5-9+FNHB{КгЫШЧУШШГНЕЕНУЩЭЫЩУСУЩЪЯЪЪЯбгджКЗСЗДВЎЛФЁPF>1977324-59;1152.@EGC:850105-,3PQ?\МчрбЭФаддедЦОТЛЛСЧЫЧЦЫЧТНКОЮсзЄt›ЌЛЇž˜Ёp;52;9??<0592441,0(EOJЩппгЮТбгаЯФССУТСЧЭЮЯЪЧЦОКЛЪлдЈpiЏЁ˜››`?hNLJB77,5>;9:72-!5>JqЗЮЪббЮСаЯЪНРНОФЦТЦЧЪЪЩШСКЕКТЮЕe:ƒМЁœœЉЪЗwA48?CH>71,4:;29:2*9FHTЩйккцмЦЪЫЪЫЧЧЩЭЭЧФЦФШЧЫЦРКЗНУ–T\БЧЄ›ЁЇЗЁWC<&4:A;07598375;52JT[|БдтѓсжбЯОРОСТШЮЭЭФООУЫаЭЩТМЖВУЖŸЄНРЉЊЌСЧŽ45S>:9:85593.-05:5EL8W›УУЭзлкбЪТУУТФЪЯЯЦСОНФЫЪЫЧШЪЦРЏЌЇЈЌЏДЕТЦАa,A@;;:98;9::ъŒФддЫечзЮЧУРРСШШ€dФТРНРФЪлгзьгЎЏЎЉЈЅЅ—АЦЋЋC#;BIGB?@-2@wБжямЯЭлЛЅЖЖДЕДМСУРТЦЩУОСТжЯЧДЅЇЅЉЌЋЉˆЗтжœY;(??:.9<;32*:GFA8J0F‹УйсгЭЫЩЩЪЦТОМНТЦЧУЦЩЪЦРНЧЪЫЩУЊДЗЛЛЗБЃТзд…IB0@;>>?<702-:@?7+dmFmЅМШсзжЮЪЭбебаЭЫШШЭЭЪЭЯгбЭЭЪЮЭШТРОСЖББАИМЌkHH?7528?A>8@IQ;-75ISN885-4,91kСбЏККзжегШУБ™ЎЕђдЛЛОФЦРНОРУУТССОЛЗЛРСТЎБЧ•SFLEB?:,+*7;87<<…>JLV–ЧТМСгцдаЮОФН™ЎжЩСЖИЛЛШбЪаФЧУСЛИЖДЖОССАЗЌZAL::@A9,.5PŠДЛМНкзИОЩЩйрСЉЏгЦЖЕЖКЭђћмСЌОММЛКЛКЖКТпшжŒA:8B>:7788:?JMNEEЈBGG>8M™адЖЛЛККЖНФШЭшдЫСЩМЛКВАељўўпНЏЖЗИННССЦбеЦ„*8TLFE@:?FJG@>>A::;84ZЕупФФЦНКУпмдаЮФЕЛДДТ€њЧймчсгЩЛЖИНФШЪШЩсчБP4;GIHG>8>>9>>CC?<;HPQgŸФЮТСРНЦЫадбЯЮФФСЕЕЖЄЧчьтцкЗЎКЋЋСШЮЩСŸЎО‹]ZC>AAHHE<7078;??1571<:14:4?Fb›ЖЎКЛОШЩШЦТЮЭШТЗЕЌЌ€‡‘ЁЌЖВВЌ’ŽŽ‘™{{uŠЛЭФМЌЋЊЁ‘ЏУЪА•Œ~i\TQNLFBA@E?CJF]L%0(#+)$-%(5.–”››˜ЌЂž‹—ЄЂ‹ou…ЁААЃЈЋЈБУдФОУЭЫЉ‡Z[]ECEGCME<>;A3$%$.&&,84-ЅЅ„‰„„€Ч’™ЏкУŒjhЁЌЕЕААЏЈЊЅЏННУблб›kUINZ\I?;FECA+G>90(2**.#–ВЌЂ‹Š„|x„Ž‘‹„rM[•Ї›ДИАЈЈЉЄЁЈЄЋВЛМŘqkhr`?0180&*$)%-08%+*(˜В{h^p’—Ÿœ‘ˆ‚‚•–ЊЈЈЃ•—Ÿ™˜”‘™ЉЕЎœ’”‹|p|‰Šƒ‚qW412#+)1$"™—‡quˆЂ’mp„{u”žЃЅЃ–‹ŠŽ’˜–Ž……ЁЃЃž’–—”Ž’Ž–Єž…NBI7%+3,((&$-Ђ•‡ЇЄУМ…[jwo‚›Є™Ž‹ŽŽ™œ—™–œŸЉЎЊ{~tt‚‹’Ž•aUdkO8.33;,"$1”~w–ЛЋД™}n{›Ј›Œˆ‰Œ‘‹‹€Ш›™”ЅЃŸ™ЃЈЅ—Žƒ…‚~wx{z>8]i?#0:@.%).&+|‚–’Œ‰—ŸЄЇЁ˜”‹‰Š‘œЃЃЅЂЁžЂŸžœ‡„…„x|~™•Y1EW~Q@<2418,("2.ƒ„{|‹Ž…ƒwpzЉœž›–—”’™ЉЋЃЃŸЁ›’’‰Š‡ŽŽ‡x|‚ЅŒE9FEEIYN@@(,!%*…‡|Œ‰•Œ~|x‚Ž’••‹Œ‘Ÿ›’”—ЃЂЁ™’–——€е›˜–›ЪИ‡o{–Б17HHBCHE?51,))x|„ˆ‰‘‚q——”—™”ЃЃ™˜•ЃЅЄ‘žЃ›˜Œjdib`jnw–o5@SN@CEAFEHFOQL+…‹ƒŒ‘ЃМУ‘kpžДЄ›–”œЃЅЂЁœ˜˜™‘—ЁЄ›ЃЏЈ˜–‘Šmvpvot—ŒC$7C@>FGGA?LJB9-zwzxŸЪЋ˜ƒ~vŒЌАЅЃœŸЌЎЇ’˜›–‹‘”žЈЇ‹‡„zz}}qx—~B1,B:BGL@IFQHI22"<‡„‡’ЈЈ‘‘Š‘œВЎЋЅЃœ›œ›”ЅЇƒ|„‰ЛЃxwruv|xu„|bEMFBHF>B>FQYJP>4?IŒu„КИЂЃŸŽŒЃАЋЊŸ˜––‘‚•ЃЈž•Š‹…„Ї‚‚}{}~…•oHEdNJNFGPBFGIH?::78w^ŽСНАЋЊЏЉ•ˆ•ЄЋЄ™”–•‹ˆ‹”—•ˆ‡’‰z‚‹‹ŽzvzquojM55HCIAHHJIJ5912<98G~k‡ЭЭЗЋЁЃž‘•—Ÿ—•Ÿžž—Œ›Ѓ›‹‡Žƒ„~„‚|tw|rqupWMPHGHCCH?B>40*+23`‹ŒИШКŠŽžЂ–——ЂЌЊЊЂ›•ˆ…•›™–ˆ‚~qr~Ё‡vqr{rrjz]:8LIIOIMGBA@522&3EHЧЎЋЌЈ‘~‹–œЂ—ЄЏАЏЌЃ›Šˆ‘Ѓ›…x‚‹Œ‡ˆˆƒwdjht‰q]^WN@GHSWVOOB>4#4EQUœЊЉŸ‚…}•Š}…ЅЌЊŸ™––‘”–’–Šz~›ЃЋŒzƒ‹‚x}ce|}iZIBAHGMTQLOeO))^qWPЇЅŸ˜ˆ‰‡–ŸЃЂž––—‹’Ž’˜™‡uРДЖœev‡‹rhz{\OF>>HLPHMLEECGI>-H\ZZАЄ™’‰‡‰‘’‘ŸЅЈ•Ž•ŸЁœ˜žЁžЁЁЂЅЊМЁu}ƒŠƒva}zC1GH?JEEOJG;H>GJNPLA>>A<^b\cŒ‘”’ˆ‡Ž–ЊАЅЂЁ”r…‡Ž‘ŒŽœ‹~xБЅ™‰‚}„‹‚z{qPTU:7CCHLGGEC??A119:E]z˜—‘Œ‘Œ˜ЈЉЅЅ”u{‡”‡ƒŒŒ‘™”ЂБ•…‚ƒ‡‰…oZJ10+:5BFIGLGI@@C989>B@H}ЋЉЂ•‘™Ђ””‘œЉЅž‡’‘’ŽŒ}‚‘ˆ~{wŽŠ‰ŽpdH892;>GCMMQVOHC@98?G@Jk–ВБ˜‘‹Ј›ЂЈœŽ’•Œˆ”•™–Œˆ’œ’‰‚wwˆ~oaTSG&8FEEIILOON9+<8&4JOGnЈЎЗЅЊˆx›НЈЅ—Š‚”–‘‹Š’—ŸœžЄЋЊЎžt|}„z|uurO-.FLECGTGLEOOC:5->OUIcЇЯзй”Žƒˆ˜ЃŸž‘Š‹’Ž˜Ÿž–˜˜ŸЊЗДЏ”jvƒxvqŠnG;LY[UJHGIFF?271)BLZYm•ЇЃЎž’‡’Œ–žŸ™‘‹Š…’ЂЅЄЁЁЇЂЊЋЈ–ˆ„}{{™S>02H^SIE@JBB+*97CWMMrŸЎЎЊЏ›ЁЃžŽ{{„—™›‰Ž–œ’›ЊАЋЃ~Šˆ„}z‘ŠOEE5:F;C<939BC)"9;V[[€—™ЧКЅ™’”—Ђ…ˆ‹‹–ЅŸ–’˜™™‘‹‹•БЃЇЉ}‚uz‘—[B3#@HSJG>93>24"2SV@TЁЪНЌЄœЋЋЈЁЁŒ‰„Š‹‘ЂŸœ•’—‡‚ŠЂКЏ{Lj}ˆqhan|\9:98LBGAB?>AG>@4%MUIwЂКМЋЃ•ЏЛЛЇ‘ˆŽŽЊВЄ›Ѓœ’„ŒžЌЅz@9`vi^bdnƒ]NkUMMGGCBFJEG8>0*%7CBkЉЉЈЛАŸ›ЁЂ’ˆ‹‹•–—’Ђž˜–Š‹™Ђ>Zˆmdp~œ›kBB;FOLBG1ABJGA:>2)5LMO{ЋИЗОЫЕ›ž˜˜œ™•˜™œ‘•”—ž›–•ސ’’g0@„‘oghw”ˆNAH(BC;><:JMB7A#0(5MVYc‡ЋФйЧЛЄЇŠˆ•ЃЉ™Ž‘ЃДА—ˆŒ‹—‡hk‰–~w}˜w4:]AH?AAGAHC>>8>7@OQHP}—ЌФФЖЇЁ”’—Ёœ™’‹„‹ŽЁЂ—™™€б–‡wxvww‹Єœa,HMG;@:B>BGHFE:&EQICvŸЈБЊЗЦВž™‡…•—”•‹’Žˆ”›ЃДКЮЇ{tnbmuvd„–rƒH,@FHB<<5FCEFNNF8-,4Ht‹ЊЩНЄЇЖ–p|„‡{~…–‘‘Ÿœ—„„•БЏž|qrow{}rVˆЗМŠV>*?F>::@A>?HFGFC&*F4C|ЉНЛЌЊЁž•˜”•Ž…˜—‰Ž•–ŽŠŽЁЇœ‰…Œ‘‘ˆv™МВ~HG8?4dhJaƒŒЃЛКВЅžŸЋЗžžЉЃŸЁžЂЇБЌЂ˜ЃЂ˜’–”’‰ƒ|w|Œ’dMNF>>@HJEBEIPMB2E4>C]™Š”ЖЦВЃ˜ЃЎЉЋ•‘ЁŸ–œžЇЏž•˜›•ˆ|ˆ”…~ztv`\S0#-&FFGBA5;7,&APIuВЌ•ЈРЯЄ”Žˆ‚ЅВЄ—•ЅЎЄŸ–ž•™›—–•”…„~ЈкЗƒ’ˆceq\Ui`8FCGAHCBAC.72MVNA;748,<4?CtАЉœЄЎВЗЅzo}„ДЎ—›ˆ‘”•”ŸЇЇЄ™{~‚”’‘‘ЂЏ›]@::9+P—|]N97<7?UFTŸШЁŸЉИВЊЊ•j|ˆŒЌЉ—Š””—ЃЄ›•ŽŒ‰„А•‘ˆ„‡ž‹\pZB?:#$[‹›‚JBC>>77€>vИЗ”ЌАЊЋЛО•‹ŽЋœ}‰‡——Š”˜‹‰ŠˆŒŸЊЉЅœЎЌ•gANPU[?ABMW]PHIC77342\ЇЋƒ‹ˆЏИЛЌ™zbq}йЖŒ…’œ•ŽŠŠ’–”‘‰…ˆŠŒ—~‡Є‰[TYNLG9>FAG;:@GE?>HMY„œ–‹‘ЊСБЈЂ‹—ˆejvЎŸ•~‹’ЄЇЂЇŸœ›Ž„}Žœ™–ˆ‹YGNGFJA8?AHLE@?H>E+-5Ni„–КЏŽ›˜ЌЊ–ruЄ‘‡‡ŠЄмшј~‡‹ˆ‡‚–НШЌu?<:GUZSMNVQSWYSmŒЈ”‰‚Šƒ„”—Ѕ”kT‰}w‡’Š–ТдНЌ›ŽŠ…ƒ…„—УдВcTaPSCCBEHY\PMLLSCI?7GžЅ‰‚ˆ…{}ˆœœЋФЅ–Œ™‡‡{‚БэўєЧ”|Š‡ŽŽ•’™ЋБЎw*>a\QE?>CHTPJGGC<3@B7TЕЏœ—‘’‚‘ВАЅЊЅ™‡‡|xЗФаЮЌ™|x~’™ЁЅЉЉЧЫ™MBELE8FGE`}…”••™ЃЎŸ›œŠ}}‚‰„Š|’днЗЂ‡S0k‘ƒ–™ЁЎБ—‡tVC>GIJJSTGA>);0::AASJUr„{‡œЁ›™žЂœ–‡ztu’ЉДЧЕУБ‚qqB`|‡˜œЂЅЩЮŒ9COIHHGIJBB4?A48;.5;AH[q|ŒŽŒ–Ёž–Ÿ˜’‰xorџ€C!472&9S9.0AQnŠ‹ŠŠ‰uqYOgeY[[gpjcq}zz|wc\bmx{znihptt{…˜‘‰t$+1*-)"#,328>LmougS24MW\L-Iiv‚™ž…”œЉŸЃ !+%&&.-"(.1948+)?QivwŠ‚O!+HTWWnmh}–Žh0Y{‚ˆ Е7WCB>5.))*-.370.)1+")::2GVc^VFNnt\Op‚„Ž”{|„ƒŠ~n$;%(%39!(255€/! !15591* &8(*$,04CTx‚ŒŠzuwŒƒˆ’‹}}md ><+)22*")%!-"&#!*,0#.4+8.%AJ^‚Š}vŠ‘ˆ‚‚Œ‹‡~tk +A(-,2+!! $%!$%"&&!5@7$)"2($Cino‹Ї›Ž‰wgg #d[5,.  ">>,0, ");"&,5-CU}—˜„…‚~xrpjj  ):53)$  !$(?1%&%)$# !2-&-<4AˆЌЂЏ™‰zwrxvb€ЋCP4(37!$## *@AA3%  *#(31"G^ep{nqtpknp&A3,A[iG#2+,#%1204. %*+-# %%,,(%9@:Cp”Ё’|vngbGkcA*#9?9Ikr9!-,#$!!!#-)!.<+""#"&%$#%*)2GYvƒ„pjn&:dВШŽmH,-McG-,$%#*90"%),-% *0"%.+,3,)7E7:AiqeLF!?rЂСА„tdLHQB#%2:442!!"$-+%  *.-847#"9Nni"E…БŸ‡…Š’Ÿp^[J ")!&*$  .3?@?:(0*;)HŠЗВˆ‡ˆŸЗŸpcin|tcbZJ+ -,!#.*  "( %707.""0CLBPŠЧЮmpuq`\]gwrYYz˜ˆiH*3FF?  &!CA?3!%+&;ƒБЉ™„oxujh`apquu‚ti}„U)#!$"  !.%*"&,-&5iЋаЫА‡aqxuGPZ`ec’‰Œk[cihhqqJ1)+%1%*(   #%$$$&)$!"$O‹МЯЎehzr]FWYQ^{ŒŒŒ„~ukrTTMAOivZ:#,0*#€F !((+$^ЎычЗxONbaG3[rbavЂЏ–zpkrtoeTj™›’}]P31$*&$!)&,,0*ZЇбТ™hLbckgmwzwk”ЦТ™xkqoiWSIT‚w`ntkjWI55>UO   jЄЄ˜‰„opncimY\eZ‚›‘~vx…rie^^mŽЊ‚WcbZitqM9Oj^?  ‘Џ”mnqQS]OI\ch`>o™›i>[dp]W]rxvnqqru}unkqbdkrz|nn{‹Œ•ŒxidcjQ9Qkwx}{…~{~‚…‚~uornQSNNk‰™zdgjiemrqqkdhqqotbuwtruwigr‹˜v\kvtccP@adƒ™Š„›œŒ…{{сvr{Y4EJ&?{”~wrporng\\^ojnzmibivvХ|{rjo‹’Hkvvph}~ŸЏ‡z‚‰ƒ„ƒ‰‚zgiPEV\Od~Ÿ{njmpxxo`UYjmhoem€ˆ.)18:79@BGLNOIHLLлG@3CLV`km‰ƒ‰‚ŠЃРМЎЉЁЈЎАЊЈЈЅЄЄ–ЈЩЯЯЮчгЯжЧ ++:B@EFHNHCC@GFF<<Ю5P^M>Mhc~‡}x|”Ѕ–ŸЁЂЅЅЉЉНАЎЈЈЕФФУнеедЯбадЪ  0CGGРJHGC87:9?`v‹ЋЗСЮСŽmhˆЄž—ЂБЋСжЮЂeЛТег 4B[NLJGA?:??99B>FLNIJFBB?><;>7AGIAA;AHHB@FAFJOLBCCB<5@FGF@BB;::A>>:75@EA@9CAC;?@GF:?>HBC?OINWVt„РЪОЗЪЯЮЧФЦЩЧОЖДEL::B>9.-2:9?;9:244@MPF?>A>JI5;HtЄБЎТтгЯЮЪШФМБЌЌ7toL@9894*+&,+4599>:;2,.*.-0374@758875858;AIFCBCHIG9Pnb4@JCJ?1.:77:F@EHF@>49;7970528??B?C@FFGB:T\NV‰НжбМЗЌЅЈ:[xQ>BGE@BBIECBMdЇЦЦЋЅЄ?MqТнНcH?@AcrV-?@A?:7@CC?85:>A@?AC?874:EB?<@CC;;?BGFGEU^TV‹Љ‰…1PˆШырЭМЃŠp[]W8&1?FHECB@C?<595248:BF;4+55€;83<;75>?BFCJHH5-@VpЂ-P›мтЮЦЧалеЎ‰zE..-:3+@;>ABB<535744;8;.-075470941799@9:>>7+,43+*0188;@>755<795>OMLCACGZcT`ЌэєЩЋЕЎЎž˜ЅЖА˜‘ЕаВŒgIHTYG8>??;:0212+,4235.543548:949VVQEC@;AI+PЊсхгЗЗЖКЗЊЃЄЈЏЏАЗЗЎЊЂЊЋj>1189<>;8<<334.3),1328;>EGJFA?BA@AC„гїёжВЁБЛДœœЅЎЂЗРЧЦЇ™ЈЇЁ—Ё”`FCJ?5CMB>7304.343079>;><8:545303049955:@9:;;8?uЪѓшЯЊ–ЉЏИЇЈВЕБЗЇЧьшдРЇЈЇЂ™’|ŒЖЄ‡™Ѕž”tZGHWm].(.4253.51.+13975594•агШЧЩВАЕИБЌЊЃЄœМкжТБМРЌЌЄЁŸЊФуЖ‹•”‰œЇЄŽjTi„uL7%-"+0585.4258,*89ЛпЯЏКК—ЄЅЈЄЂЄЃŸЊкзЂz}•ЃЉЋЅ•ЇКСЋ’™žЁЅЌЄŠZPocB5&--$+20.320.(),3<бЩМЎЃЇЄЇЕДЏЏВНАžЗдаؗ˜—›ЅЎЌЇЄžЃЅЈЌЉŸЉЎЄ’}YJ>:2355€…-&()%-5жйЩЌЏЏЎЛЖ–‘•›ŸАЗЎŸЃЏЎЁЇЎБЌЇЊЕЎЊЁŸ™ШмбЌŒ”ŒЌЮУОЏЁžЋЋЄxA4+$82,2-&&,цсШЏДДЌЉЅ‰ŽŒЇЇŸžžŸЇЉЉЎЈЄƒ]›ЁЌЌЉ•ЎЭУДЈœ™”ЊДЖЖААДТНИЃmYG;@E432++дЪИЌ™ЂЌАЊЇЊДВеыеЎЇЂЈЋЌЏИйЮЌЃЋЋЎЌАЏЦрРЉАЇŸЄЕЕЎЎ€@БЕЖЖЦУАЏЃuF2))(**1дЦЕœЁЃЊБЎББЌМСФВЉЎБЏЋ•ЗѓяУЉЁЈЋЈЋЕЛСТЎАЌЎВВЋЈЌЗМЖАБЌ‡|‘Їœ‰|\M>,%8СВЉœЂЂЋБЕЖЛРТОЗБЏЖООЗ–БзЮž’~žЈЋЋЌЩжСЂЏЦНОМДЃˆ—ИЗНА|Ž•—ЃЇ—”nJ>CСЦОЃœЎЎЏБЖНЛДБВЋЏДНМИЇЕЪФАЄ››ž‚ЅЌЛЎЄСУУМФЏЉЅЌЕРБž…‰oz›œЊƒ…wT9"НРУССЛЕЏБДБЋЊЋАЗИИЖВЏЊЈЄЎЈЁžЇМОбнЫВžЂУЦРСЛЕВЎЊЎВЕКŸˆœЋЕМЎЂЃŸ™ЅkНОСФУОЗЛНКЖЈЈЋДЗКИЗЖЕИЏЉЈЂЁ–ЃДЛИЕЄЋБАЗЛКДБЌЌ§ЎЈЁЁ€GБТгЫЕž’‚‰žЪШЩШСИАВНОНЖАВИНКЕВДЏАВЎЄ™œ‘ЌСОМЩЇЄЃЉЎЏБЗЗИЛЛНЛЖЖЂˆœ”ЄФКЩЦЖЋˆ~„—УТФУАЎЌБЗМРТРНОНИБАЋЇЅЋЌЃЅЄИМВАВ˘Ÿœ~•ЌАЌЌЎБМССЪМЁ‰{Вд̘—žŽzŠ”™ОЗМУФЛЛМРОТРТКЕБЎЌАЋЃžžЃЅЄЇЊЋВЖБЈ–ŸЅЖЩНЌ–ЂЃЏМУТЛМЄ˜—œВЗЛЏ•ŽŒ’™ОННИДБВИСЃ™ЖЕЏЕВЌЉЎЏЅž˜›œžАВАБДЕАЊКСбеЮНАЄЂЅКМЏЕЕЉŸžЎМЩЕŽŠ˜œœЕЖЕЎАЎИЮЖˆwŸЌББЕЕЖЛЕЊЅЋЂžЎЩНМВЋЌЋКехЯЪаЧООУЈ|—ЃЇЉЋЋЎАЩБ”ƒ’–œЁЄРКШКЫдаЮбЦКБКББАКТнсОЌОСžž‘ŸРРטЇЊЮЭШЦЧРКЗЛКЉ‘–ŸЇЌВЖИЖБЂ™Œ’™ЂЇеЮШУШбЯачсНЂВБЎФлнгМКИдЧ•…ŸВЦЩФЖžЉСЧЧЦСКЗКУпВ‘››ŸЂЃЃЎВДААœ›ЂЄŸ˜œгЫЧЪЯбаЫЭаТЉЎБЖгЫЪ•АДТЫЧЌЇТнщуйОЉИЦШЫЪЧУКЛМЗЉžЅЄЉЉЄ››ЂЈЄœ™ЂЊЂŒСдЯЭЮЪЧУФФЫНМЗЂДЮУЉЏЗМРИУСЮаЭЭббЛЛОУСФЩЦРООКБЇЄЉАЌЇ˜›žЂŸ›–›ЃЎЎѕ›БЩЧЦУМКИТЩЩЧЫШШЧШнК’„ŸЎЗлаФФВЉЗДЕЖИСЦСЧЦЦЫЕЅЄЏВИЌŸ––ЁЃžœЃЋЎДЇЖКМЛММ€кНТЪЯЮШУСОРВ›‰ЅАЛМФШИЋŸ›МСЗВЖФгЪШУССТЛ—ЉЏзЛДИВŽЃЉЄЂЃ›™ЁЄЇИЛНСУУЛЕЄЦаЮШРЛЗДЖЅЎЎНЖА™œВЁmbЇФИБЅНпЮЮУРСОБЌЊЅЁОЯаШАБЏЉЊЈЉЁœЂАЈВААДМКБАКЦЪЩШЧОКЖЗИНаЧŸŸЈЖœ‰ЊЖАЉ‘žОбгЯЭЪМДЌЃЉБЮШзШЗААЊЊЉЉЋЉŸЄЈЖЏЊБЖЕЖЛНЦЫЯЫУТСМНТУдЖžЃЈЋААЏДЖЖДДЃРЫптЯУДВААВезТУЖЕЎЈЈЉЇЋБЏЅ›™ВЌЈЋИНСФЪЭаЫЯЩФООЧЫлЩЈœВСЗЛКМККЛОШЫЫСЗЏДЕЈЃЈЋЌЌЅЉВЧЖЕВ‰’‚h–ЊЂž‘АА€ЖНЗУЧШЩЧЦШФОЕ—ЉжхТŸzВЗННКЕЗМЦЩЫЭЪУМЕАЎЈž››ЄЌЋЌЋЊ’•”r”žЄЋЊЂЃИЉЅЅ’ЕРЪЫШЩЗЕИРРЕАЃдйТЕ—œТЛННЛЕЖСШЯЭШФФЫРЏЎЊЊЈЈЋЋЊЈЈЉЈЕ›|—ЄЄЇЃŸ—’ˆŽЁЧЩЭЮЭТЖЏЖЛОМЕКЗЂЅИЊЅЉЏААВДЕЗИкЮЫЗЛИБЌЅЉЕЖВЌЇЂЄЈЊЅИИЊЄ–—ЕЯОЕЉБОЗЅЗЦЪмЩЁЛРЦЦРЃЌБЗЖБЋЇЊЌВАЎЋЌАЌЗжЮЭбОЛЋЃЇАВКТдШД‰ЋЭдЭžg›ККИКИЗИЗИМОУгрЧБЂЄШыЭЩЌЏАЎЉЄ’СКДАЏЏЎЏВЗЪЧТЖНЏЈЃЅЉЈЁЭпЫЄ„’ЉЗВœАЦКИДАБВКЕЖКНЛЏœЂ—ЂжЮШКВЕЖШЉ–БбИААЕЛМЗЕЛРТНКЗДЏЎЊŸ|‰ЂБДЄЊБЖЕЎВЖМЗЕБАББЕИЗЛНКБЎВФЧЮУНБЕЏЏЦŒvЌМКИМОУУФФЦФТМЗИВЁ™ЇЮйИДБЏАДВБАБВВБнВЏВЗИННИЕЕЖаЫзЖœЖЗВБЉ•ˆЁЌШкУЦЪЪЫЫУССЄНИУЄ—‘r‚ДЧЗВВЕЖЗЖЏЌЌЏЉЋАВВЎВООКНССЗВМУЪжЕ‹ЋЛМЗЎСФЫктзТРРСУННСУФНЎБ–ŽžЇœЈТйКВАВИОЛЏЃЃЉЉЌДЏВЌ€М*;B9BAA:ENFPhOHNVj|››ЁЂžŠ…ih}tpheov|‰‹ŽŒ‘‡qqwˆŠ‡~|x~‚ˆŽ›ЇБЇ—‰*+(54;@AEHLTTVdW\VJ^^`r‰ŸЃ~v}uow‚~ƒ”Ž~vz„ƒ}~qkmpwv{…ˆ’™ЄЋЇЇБ”-#(&SAIIOOTNSJPW^aH;.<52Sbv‹ˆŽŸZ;?[oojv}{ЇЃ{@m‹—ЅЂ7S^QTQOECBBA>3@@JLOLMCA@7:;;>31GVQGPextaTZz„j\}—žЂЃЄŽ™—Ѕ–‹1-% ESFBLLSIBFMLIH1:EIQNOGE7,:9BII@@EF<4PUdŽ™Ÿ™Š‡™‘ŸЄЌŸ˜——•’‚7,5)0NS@;IPH>;:>5787;?B5-02@B9>CGE<;BCGB>JMQPHO]w”‹‚Ѓœž™˜Ÿ—‘Œ&!1P`JCFM@G0,AE@7:2*8::;>?FMM>AB>ACLMJF@G:SB)%32?148-2-8A18G[QF8::AA2A;+:%2.-1EFG88BCNH+FЃЪЛТЋœ‘Œ…ˆŠw! 9^aLHMQ<0AE55.#,1,4;IQWPGA:835.2><41089EG?GCOWSZЅИЉ„{qt$>`ƒvN9?ESTUƒŒV!$84AHF;A><8>@8GI;E>0.;5GMPC,8B;(:@FE8;A;BB:;30>5?>BM?7:88>;-51989;AGNSPPG:1@J[‚w<]›ЫЗž˜ЄЈНД„jr`7&&!3-%@@GFH:-18;8:7977€ж<5.,-:20:4?CGHMJQMG?>8$).2998<1@;.47@EAGCZYVMB?>GE4N‘ЧИЅ’‚ŠŽ…ƒut{…|„””ˆ„zˆ‰^;)05??)*35872.<55<2!!3@@A?EJILFIG7CC€НQ|ЛхмԘt‚„TbqvvpЂž{j|}xz‡~]CJG1-EHIB;823$,#+8?CHGBBJBE<9AdЁдцНwrˆ{]cnpoŠŸЅ™–‰‡~e^[M`~…jC<73.,3<12?8GHB@E:@7BpЩўўж‰eYmtbZc‹‚~v‹КРЂ~}~z…{hxЂЊŸŒrgC>JB9F?7",3:B:;51;@:@GFFC5nМшйБequ‡z|Œ‰‹ˆxЁкдЋ’xzupeVbŒ„bv{xneYQLZkg2%51:?2*0.3*<9@<01‚ЗМЌ•„z}||‚nhpq•БЊ”ƒŽ—„~~z~~ЇЦ›bmkkv‚Œ}aMh…xU<2*297;:8+3,;0299<ЅУЃ„ƒ‡henjbnnwrV~ЌВuNPev|tjdw‘Ÿƒetqxw~{rd@9^aB8-7392470().:(1;ДЏЈ”|~”СЈtQINdhq—ЂИЂ}||~ƒz~{‰‡}unŽЉdnmŽž”‹Œ‰z\8(.&(+,;1.:40ЛЛƒzx|Œ`^^ap|‡xkp‡„rt~‹‹w‚ƒ|zuooŸКЋcno„ЅЊžŠx~‰ˆ‡g4(%1+7711€’$ЭРŸƒ}zxp[acwzptrmu{qw{wz^:hrx}we~Ёž‰xko`}Š‘‘‹‡ŽЁЃ‘‡UB74?C@A540(Ћ‚ot~wqqxz}ЏдД…{rozz{„АЂo{~{|‡Р›wˆ|ttƒ‚ŠŒŠŸœŽˆ^;-(*2+1Бr^kvz}|}ˆ”˜‚x~}{h‡даœvhqw{{…•ž~„}…‡~u{œЄЁˆ|^Lbuvge\A>0+-’Œ|maju~|ƒ‹›—–‹z|Š‘”‡nЖЃn^Ohpw~~œЎ—r{Š‚r[j•—ŒpLB^hm{ƒxvhH>>–—‡xdvttz…Š„|~{~‡—Ј˜}ƒЁ•qkipMk„™…aOv’žœ˜œ„uz„˜ƒqUS@FauŠgi]L3ŒŠ–›‘Ž}vx‚‚rqv…Љ‰‡}xw||ogorŒ›БУЉvm•™”•ƒ‚wr~ŽŠnYr{Š’…t}xpˆ„V•’•™”…‡‰‹~znx‚ŒŒˆ’ƒxzpoigr‚‹‘‘qUnu{ƒ‹–‹|wz~z~wnuxœЈЂticd„—Ѕœ”Œ„ƒ…——Љ–‘…~{}ˆ{pc[]t‘ŠŽ{ru{…ƒ‡ƒ‰ˆ‹Ž‹‹ˆxPbezЂЄЃŒˆ^Wdx’–œw}…„˜–••’•‰„xvzumbc‡ˆ|‚d]\QjŽŠ~|ƒ‘”Žq^]OŽИ™k]cbQbnr”‰Œ––އˆŽ•Ž˜”‘ˆzz|zvohjurrdv}‚‡{gouŒЈ‘‡kmr~•›”‘•uknt„Ž•„oe]^hpqŽ„‡‚|ˆ‹‰qc……}zz€аwmedeowƒz‚ˆŠ…z‹˜ЈОЉ˜‚tr{•ˆŒ‡~kij•Ї˜ganunqrŒ‡p}‰ž…ZJpu„Š„ˆˆ{z}oddx—ˆˆŠ…„‘АШЉžЈ™–—wQOhr{}}…’Ÿˆ^H^hqw|”Ž—‘—ЃЃž™‘ƒ{Šƒ‚ŽЌФ•}’‹gbZoŽ——hmzЈЅЊЎž˜‘ˆpY^cu}w„‹‚rj]djpw|ЌЈ—•žЄЂЛЛ—t|ƒ™ВЛЎ‘…‘Ћ—[Mj‚—Ђ™ƒpz——€L˜‰ƒ‰›Д„eqkouohn~‰„mjqv{w|ЈЁ””ЉЗЋЃЃЂŽz‚xˆЊЈЃg|Œ•™’ww–НШЦБŽx”Ÿ—”Š„Œtkvpuƒvpkxz|umt|x|rg’ЄžЊЈЂ’›˜Œ…v‰ЃЁzƒ’Ѕ—Ž”‘ЂЇЄЄЈВ—Ž‘‘•˜™–Œ’ƒ}uxŠ~mmir|pabcz|‚k}˜™‘ƒ˜Ÿž—œ˜ЋМŽbSepvqДŸ™—………~„‰–œЃ’––ŸƒvpzАtc`amxnep‰ˆˆ|{ˆŠŒ‡”‹‘žЁЈЂЁŸ›Ši^u™‡}wp—‡~‚–ŸЄЂ›™˜Ž‹iw‚Ј‹…\`wzqnrvetz~…•›˜Œu›•‹ƒ‚ƒ{xƒŽƒx]m|nC@xŸ…vЗАЅ™ˆ‘Š‚qm’Їž—‡~vxwtg|~‚‡~‡ˆƒw‚ŽŸЁ˜˜•Œ„Š”Ѕ•iearx‡k^~ŠzgmЇЌЊŸƒ||}„ЉЅАœ„ƒ~‚|x{u{zw}Š|zƒ‚‡ƒ‡˜ЁŸ—–’‘–žЈ‹mnox~u……Š…‚Ž”ЅЧзЗ–{{ƒˆМЖ›•‹z{x|}{|‰‡qdi‚~nv~‰‹––ŸЁЂ™—ދАžА‘jMo~‘ŒŒŒ‡„‹–Ё™Œˆpivuvzxx‡œ}}ƒ]gU9j|vha}ww‡ƒƒ—‘•’•˜Ѓ›ŠrƒЋЕ•qIe~‡Š’ˆˆŽ‘–ЂЂ•‡pig\dpv}{p``aC]jx}{~q‹wmhcАЇžŒ……ˆƒ„rqДМœŠcr‘•‹…‡œЃЄž™›˜Ž‡{r||wvxnqwvŒdIbquoodgbYcUqžЃЈ˜—‰Š‡’Š…ƒŽzw‰rr}‰ˆƒƒ‡~ŠЎЁ™„‹‡{jvz}„‚trrnqzq‰Œ‚{njŒŸ•j~‘‰u‡–ЃЗ”n‚—–po‡’‹„…wxx~|z~~{}ˆЕДЌЇ”’zrww„ˆЅž]x™Ёk?p‰„‹ˆ‰ˆЁˆˆ‘—ŒВ{okЅУЄЁxw{{zkQcœ‡ˆ‚~‚‹ž—‹’{jcwunjžКЈnV\qŠƒhg~’Œƒvx~ƒŠ‡Ž‚wd[eezКЉ—…ƒ…‡˜tdœ‰}vˆŽ„ˆ›’Ё‰|wkHSu}…pim{„‡}x}ˆ„Š|‚}{…‘w—žЃЅ‘~{ux™^J\v…‡Š‰”˜Ž’™›™”ƒ„„~oeaZ{™Ї‰‚~ƒxz‚‚zx‚‡„‡Š}‡Š„{ˆƒ~w…ЅЁЏ‡mƒ„ƒwuaUtz‘Ќ––›ЏЎЅ—‘‰nJ\ZAQ‡•Їƒ~‡ƒƒzwrwxv‡Š~zx„‰‰‚Œ}ŠЄЕ’[|‡Œ~›ЕНВ–‹”’•—›™ŒvzgTithz”К”~~ѓƒ‘rhqz}}„‚џ€вmkmnj]^ZWijo{~|eaippoogneqƒwz~‹„pP?3E@:;AC:0*%!",dbIC<1TYUqkha^[]ejojhpxujcbekiePiŒЂ›‡uo|‹…a0#?>723.:1*   Ge[> HŒ‡`bVbg[[\\gokoro\W`airzwte…ЁБЊŽƒ{~–˜k(2-1*)+417,(-$0&Pm\O[U2MkJMwd^gohV`diprrn`dmnqq€$xpnv‰—Župu‰Š{J &.:5+-4.%0-)C7MW? 1!Oh??^tYqk[Uhnookd`hprnhu……xprxwe^bjreG)$&)5329338*))+$"2WP3W>HWg{tjggkquvpeSUcjnt{‚zv~„pggpaM. (+028.5;7 $Z\WH>(VqS…zpkYPNZbiopkouprrou{qprwunjd‰qO.&04&$$)7NJL;!LSN[VbtVjoqjYB@JM[iqmep{xtqvwuv{upnhudUA4++,$-,+(**+,LrVH843Jexqkhqn\TOVejjmuicq…™™’}vqu|U]krooYB+*(&9.0*%$&%$)&+3BGGS[ZakMNeo[d^Zag]Yaii^che[ep~ƒwrtuvvZQamxT%),%$@>1! C\UMPQJYZ[giphiidhg]dqqjbd`^rz}……„{x|odVZh|G75. ! 5.%!%,$I^`V^]Scmd]Y^^emgcU]`]gmimwxuzvwvƒ~xqnkacr|d9BJH2!#(%$$3+QWLFEMPg{irm``[bedbeemieY[cijntz……„~|ptm^^tzZ3:$++HC3)#$%&2VcVYC Srbk][jnc^^]VLJU^rvƒ‚ˆ‹‹‚vqkdhhO.! $&13+1LjiH-1-"$g‡wnekpr|ztdZeurt|‰…‚}{w{xqkrqn{k4*,$!%+&!#>qoM7#?Q[gjimojnqpja]^hmbn|‡‡{trmprquqqp~‡u<++&)19:-+(-+958Ww‚‰gO7NLUghhnq?TUca``aeiit}–œœ‰‡}|~}{wz‚ŽŠ}Y%%-%#!+0.+"+7W^iq‡b?NT^^abdSLV\bb]WP\]amoˆ‰…ƒ{wxx}…Б›g:  %2,CWVUEVbLNMMBS^]]TadhbZZWVZbediz”‰|{uz|{z|„oW>$!$*$$HCQVYW"A1ITigPPWB5*]u~okdcckmqtru|{~Š„‚…‚„˜—d3!$,%-+" .9YU-&,€ћ$.*Ga(#1BTaxqghrwzx~‚‰‡ƒ……‚xxŒ™‹W2 !+;?:3+$ HMW`N !(;A[G&8HIc„‚{~{zzxwƒ‚zwmdk{W7!&#&$0+2:8%)7^[\m]J* NkW-?j‚j%-*0JUuŠ’œˆ‚|{ƒŒ…{tqhhtx\@8>%#4;<0!11#(58."EHJL?77&!CVQJC^mm%%15IYožЁ„{v{…Ї}tjkiG&!#0:>5@8+&-2& Qor[%€J,!"Fernb")Fˆ›ƒughnw‰…uqŽ—a4-(%1EIBA3;<*50+,agO\G 8[m^czoi  ($ (+9QZVacvˆwpxЇœF(($40++101% QtWNToUP>&ThS^`d["2G ю .F2%( ўаCP[TH.7,;A>mwT*N!#  (B5""§ќв$C[bhZ%0bjwqWE,9    §а 5L;83B\aeb[OI2:*"Z[# ћ ўе @:1BWbkcB5GQ~`E1$Ji\5-& ћњ к!FUe]QE8>I~|{^3.TQ   ќўќмE9N`ZY^ZG)NaUq~j^C08   ќ  ќ о"HOVphTQ^acp}‹k[P?!!. $ў ў й FF9NIen}‡ЋneocLA9-+ )&  ўўўм $EduZcpƒ‚‡ˆˆpn‚e> )-*" § ўљ&#у*Moxx‹{ƒ„ttZC+*.§§о t…‚ƒ„w}|~~Zh}„u]O;7"")їћЭ `ewŽЃŒvuzooxvp}ƒZ8@1  ,-ќа "NMTQNPjkbmqtvЂаt "!23$ #?@O:JI#CECHbJ>I, cpd[YSUPY\dvog[cimžЛ,3н %4PgƒE<;9??>ACHJJчzЊЃ•”ƒ”АŒŒНЈЋЌЏЈЁŸЈЏАВЖВВ€ХДВБИЛДЕЊЖЩеЫДДМЭгЎg,$29<9<;?<ACB>B@GM9<^˜ЂЁŒ|kIFq˜ЌŽЧКИЏœ‘’ЂЊЎВЖДЎЏЕДВЗИИ€ўЖИЛМИЏЏЛЦЉtJ2,BA@?:59>454;:?;38?>:?<<>AE@M‚Ж–Ž‡…˜‹ЊНВЊВАЏЉžœžЉЗЕБЏЏЋАШкЩШТЖИНРН›БВЖЎ‚]L8?>@EWFZxŒ’—œžœЋˆ™ЎЎЉЏЊЅžœЄЏДЏЌЊЇЅžЎЕЦОМЛЛМННŸЇЇАЧО?159>;8:>LG:9?@@8?o•–™™›™ЁЁЃЉЋЌЏЎЊЃœЂЊБЖВАЎЋЏБКННРТТРКДЉЈЊЏЩЖkIGC8:-&(.JA>8@HGCBtЃЄžЁЄЋЋЅЅЃЅЋЌВЉЅЃЈЋЋЌЊЈЋВКИММСТЧЧСИДЉЇЉКТ•[V]UP<,*-*3:??CHJMM5:<8EM]WGA>?GG84748<9;:?:@?8;pЎАŒ~kgz‹ЈЏЎАЋЇЊЎБДБЋЅЃЇЏЇДМЧЦРЗДДЖЖЕАБЕКУЧЅS.C@?9>:<@@AAFGNYS[”ИЩШЕŽˆВЉЌЏЏœЋЋЈЃЁŸЅЏМгШШЩОИИКННЛЗЛЫЫЖ~F0C@:23,*+.59?AGHGa•ЊВИЦЫЃ…•žЃЇЋЋ’ŽžЃЈЄЁŸЄœЁВЎОУТНКИЗЗКИКОтЧ”];)>:41,$)*$.179MF@d•Ÿ”‘ЁДЁŸžœ™ŸЄЂ„ЁЋЌЅЁ›œЂЇЋАДЗМРТТЛЗИЛМИККТŸrW5@<889558433:,E`[{‘•tm‰‰’™ИЎžœЁ‰NY‘ДУЖЊЇЉЊАЕДЖИИКОССТФЦТООжЭƒH<0>??BC:?<7:8919JTj…Ё˜~vmT`ƒ‚e„…Ї?Wej‹ЕЫТМЛНЛЗЗЖЛСЦТНИАЏЋК‹S@1%9897<>8@FLJE;5B`ŸЂŸЋЅ˜zp™ЗЉ|…АУЌAEI>B7Te…ЉСбеТМЛИИРУТКВЎЈЌЛ„[OWB@AHG??<<>@MNF4N{••ƒ‚x~ŒЄ•‘ЅЋЇ@?98:FOMPo‚ЃдкТКЕЗОТСНЗЏЊЈЃh@@;8<@HMNEEAAFNIEEŠМЛЂ~UHT|rqŽЌИБЌ:>88:4?3>4<]ЅТНЌ˜ЁЎКУТЛЖЕЦЦvHB>7:BLSOFE>@IJLN;Y”Ћ™œ’|ounЉДЋЗТДЌ4?>;57>;:#2:BUp…ˆ˜ЃДЯЕАБЏбН[5AA782GEEC?AFCE@0?‚ЎЁ—˜Д™—‡xu’Ў™ЄЈЄЃ;@?ILJLB@>CIF@GJY„ЁЃЎЏЇЊТЩ#!HT.1;@CA>:>>EHM2QЈаМ’ƒŽ‡„…u‚–ŸЈЉЃЅ?AFBGEF><;@@B;3??;@ež˜ЃРК„A>?0&,-48:<;@@?E..[–›•{‰‚…~ˆŠ™œЁŸ‘‰A@B?:?A>:4;>?<27<7707T‡ОаЅa:1<4242.,184:@@A>9>E>(3aމZ;5:41881-2.7>>€+@5@ˆЋЊЂЃƒu]Lmx`mžЋЃЉ—<22)77875198>FGC>@:>7+2JTA"5A.,3-70+14;?A:Q…‘—œЌˆikgie`e}›ДЂЊŸ4148:922*1318ZJF?87<87AH31- &0-#&3%+";??:Tz‘—‡‹ДЋ„ЌМНЅŒpz–120)&,!%$*@Z@<934477шL. 1039G]\}–Š’—‰rYIvЉКЃ…mh•953.+%*%&&((NcFB>9-,.2798   -Gxˆ›’Žxi{‚{‰h„ЎУЁpj…™<;593.*"(!):WII>55058;8;&  €И   2Qx—ЁЎžubvwJoЁЏЦВ‘x~";?23-"!(*23,3-0,4?@2%  47?d~‚}n]on—ЂЉЌЊЉ”ŽTUL::9*>q`1)+-*$,+-2&&)"   #*09C\`j‹ƒ‰ŸЎАžƒvŽЈƒYF97:\zcCA5991,*($!)0% €  ,@B<189Wmo‹žЎЂœ}„ŽЇ›™wG*2Jha0",1+,.-($%&&,   ,*%)TtxˆžЇЄ‹mŒ˜…Њ™|UWG87).732))!дТЖЕББЌЇЂŸ™œ›ЃЅЇЇЊКЫ–N,+8410-,,€25>>03AАЇŠnpY03200+"%(.2*)АЅЇЏИЗВЏЇЅЅЂ™™ЁЂЌЦеЁP,+1,11&$(&*13+QžЖЄž”^0F\;-??"+($$&ВЉЊВМФЅЅЂЅЄЁЅЊЋЋЇЉЏОЋr8*,,-0,+1+(0+-3‚Џ—…}uYa{dWcJC#(>20 #$ЖЕБЕдИ•ˆЃЏБАБЖЗДБВЌЃŸqG:?:<<9.,*..-)-*Z…›Ÿ”–žŸtIwƒrrobJ&FE&$00ЏВДЎЎЁƒ•”›–›ЏЏЎЅЋВЏЧх,<12;?<2,-55Є230Qvw{~ƒ|he‹‰}heƒqT\B)2*ЕАЏЎЅŸœ™Ÿ”žДЌЈЇЇЊДЭрЇ94<-$1210.8E?j‹Ћ}vvnœŠ„…‚~‰ЈžœŠaC;2в}~}v{nkmtz‚‘‘xz~~‚„~xw––‹Ђ—ƒ^SJTPSU[WYSBBыC:>3GuwaPN7#Aggc{}{vmm€Kvx}ƒŽˆxpv‚~|gxЅРЕ‰ˆЅ›oEESUOQOMFHF.+920&*W}pO#%[——twhwruqnkv„x~‰‡~nuuxˆŠˆ{˜СаСЄ‘ЏЎB>LSJNCJHMFHB>IGM?d~jagYGdxb]‰wu{‚}ndwƒƒ…|zw„‡„…‰v‡žЌЃ‹…Œž‰[+&@GHNJIIM<5IQJHO]iV8;I?hxPOqi|„pnr}‚‚~|v~‹~…Ÿ™‰„ŽŠwvw‹x\AGBJISPQJOLHAMJL;Hea> *NnZ9Tb’q‰}w||‚‹‰„{rkvx‹’”’‡Œ”œ’|uw~}bF(&BLIPUOQN@E;CB.)MindYJ:Ao~`‘Œƒ~k^^orz‚‚||{}ƒ‚ˆŒ‚‡ŒŠƒ|Š‘…]F42@FNECLEIC@7847L\\`YHY^]eeun…‚~nc^abv|„‚z{АŽŽŠŠ‡”’ˆˆ~…ziYL7<:;EMCHJMG:8>F>B\…gYMNMYYr…{~|rkjixƒ‡‡Š{tЌЋЅŽ‡‰ˆ‘‘kn}|~|oYH@@BFGMQQGHGF@BNAAQY\aihnpZc{zn|tmvwvnuƒqrw{p{‰™„…ŽŒŽŽnmw’Œg>-5G@A<>IZJF<52E24VheZ`gageooz{v}zvw|nx„‚}utqu——€S–•qkr‚”ŽaMOC:??078TBFECCL@?Wwxdqrgozrchkjw}xunorqw}uw}‚…’ˆ—–”މ„}uwАtTTb[T::;@.I>AFLHN5<]bbaVb^wŒ|{dgdorrw{}zxnhiz|„‰Ž•™™–‡ƒ‰ƒw|‹c>BLL§JEII€ЉSJMq‚‘–{\UY\h|txzƒJ\mvxurqmop~ŠАБЎž‘ˆ„‹’”ŠŽ’ЂЈ•oB4ECC@9A59:BECE7@BNmpt”pJ\aokuqtcdkvxzrmnorvƒ~Œ—™™”Œˆˆ‡ŒЃЪЎvO04EA>729<+&;3ABOG8WmcbTpwgcieabmmncv~uqdepmrzvƒ‹œЇ™ŒŒŒу™…jY@CFJIBB>B:B;,C^WcpgkCGQSLcUG?5AO\gm‘Ÿ’‰–•Ž‹ŽŒŒ”ž•…‚|‘pNF.2@@0*3ACNVQTTNGCLNEB+b|ˆrF)>ECC[t„|@?:+.:3319:Z™Љ–nx~œŒ‡ЄЏtFE@C?S^kiwvˆВ’ƒ~ˆОА[9MCGB@LNCIHLFC9B)7^}d[d|b^J?Cc~bppnnA?IONVUOJ;ATTNLISu~{ˆ‰~‡ЈБ‰&EYJC@NTNLSMB@CI.C‚Ђˆ\ISSLMSAHSiv|rq5>AJFLGG;35FOGAH<08Yz…wzŸЃpE;?:&49IICBHMGH534Cgb`JQN<>@NPUcmid]]:?29?BFE>:?CG4:<97,(1MxЏД•\<.G@E5C?47@L;dxa\e[@<;BCBA@?>:G8-1j…ŠY>5G9@@>7;-A>EEFA92hvwnkN@"400)?:878.<:FB9E97>7.7NVB+>N<:4<<:B9C<:57E^bgquM;;822"9Favtor,4?;@7)*;1&.3ZQJA@393:BQA2% !72*-3232409MH,:ghakvZHLqrWEHYxwugP%+1>?3(,>440gVS;25%+.)?5"!.$0:1:90*-7@@:WkonmcUSVjxx}mh‚‚bF7"$#40(&$.979hPN?>572;?H+"$,5NE.+5AH;4OU\bc]WL[zxNOvˆƒwU?B]7,1,02!(.!&BeJ99838;@>M8 *?! 8:9IUT`i`baZYaF@$>o…oPG8Z)!   "IY`o~r>29;Emx‹^QGO 9;E<"%)"+>:27:71247>4( (  )3#IZUM?(8:GN[pv}ro]WCNB;?9>pq<75:;1&-*9)%# )  $,19-0]OJQhw|nNCUcgSF;5:g‰qMF1CC;--($%,,.  "# #&54A+ )9>P`xnnIHLZ…‡ŠjE,1Hme7(5::<,-+(1+8# &%(BZNWmoiqqaBYubz„~rM;QG853$&1$&!  & €Ÿ#  7Y[kxgbpov{ŒЄ›wg\J4?E+3)&+7B>3"&%)   )$!)*8ATTMS]}{ƒ”ЕЎ~q|o[ZPNBE485BAG9-)("& ! !%9?:I]w}ox”Œ—•zw|V,1?<LW7""&1.$$%.A23.5-0*+UEoЄСЃzzћtvv~€ёˆ}Š˜Їžk@9#;bH2&*% 1+!*.,)&uŒ‹‰‹™‹‹ƒ„‚}zxxqoz}‚ƒ{v]SZC "I0 .43"  #17!.0+"#(pj…ЈЂЁ–ƒrUjqt{pgnz‚‹}A15@<) (% #$(( &$.$-#(0(ur‡’”™’}WTbhiropt‚‡‰ŽŸ‘Q5NSO3FN3    #7.#Œˆ‹Œ–ЉЅ‡ngekknnkiw{|‡ƒN28>C48. (")%"#  #$$,!$nY’›ˆŒ’Šwzohguwr\\Zƒ‹‡V53+&12"0$4!*.)+J^ggx”ЎЁ˜ƒmuvouxkgo„ЄнЭi0525>H?3#*!CF  %$  !&;&2œБЌuu˜БŠgkmkgrogig^‚‘–v;--:@852.8,81CP@1-,(8(4# ((#$i‰‰€ћœЋ”nd`cr|wxtknЋЋo-0C;>;:9:;3,..CMNT\i`I)NH(&%5!))#c‹™Ё–Žxapmnnw|ƒ}znxŸžY:HA@3.>:E>;<@1<5*Aaiq- &HJ74%734&3+5Д–ƒŒ‰xu{wtqpizvxz{|—Ї‡N<4B?A*%- %*1&,‡xq…–—vtu|pet‚~zu~‡Єb:30:9:;554*-:, !dƒg^WI$0O2#;-, J7> ‡ƒ…Љ‡ZSq‡„{…ŒŠŠ‰jMEPHGC?;4,,05.+Lamwrkig@VNAQGB>)OM*)x‡}x~qO`d\ah{wxwŠ„Втˆ3HFH@OI;308;37,*BPTYUPP>95VSI<8SoVJNF)7‚…~uoid]hgjŠ„upxw‡Жд—4"9J5(>MIVtnd][[eedjnNLQU[bgddabc]ccS[YJNNSUWA??amikeehcbMBr”‰iG8.G?:BOZ[S^eeVhrmbbee^VMVacaokikiae[\WVcee`ЩY\oxpidb`STd\bЧЋ~cWF:25FS‚{tjopobkpejmd\LBAY[^nqojhc^MM€nL]bbc[abghvqjdYUW]idh{}ƒu`bowpwqYbno`V`ecc^OH>@ZdbWSW^dhdc^\`$%#TbPPUTY\]g|~||kaU[[i‚|tnYP^ckjmb\cg`US]aa]T]QOJZ`^YQNdkjd]\[bI.EWVbhh`V^p‚wpkmja]W\|ƒwU+JooL!>ELL`prne]]^c[VVae[[ZFWr{]\TZ,329:Wmoed][mztne^]W]`]z••‚\Y@9"EJEO`mke[YQY]ba`ahc]gk|‹–}bJSTB:FL,OxudJ:Tn‰ƒ|vi^UONPgvhY?4+B;5IHCWnrj\PZ^^VU^ecZ\m‡Ѓ‚uh[NNG HJCWZhnaTQUqƒ”jEQUQLHYnjer`kumc\hbJ?Bknia[WQZb\Zge[TcdYCIFFU]zmPBcnaN]cbjdUJOULH[^bUWgnb]VcZV`c[QWbaadb]dbbhd[VEHQcbegge^HO;;Obiu‚Šw^]YYdhbb€8a`Z`tvghiZ`iiQVQV[bhhi^\eophWWbe\L0I[]`aZ]\`I92L?#F}’ƒqa[P[arue^TVT\end``]]a\FIu”z{xqjb[hphV[cdikibcc`^}zG"$LjpgQ>VmnvreYPPVbc][WPYeqvpnepqg^PJL\qvq`NAd{uohVQINOW]egbi}b?IV`g[][YSTNOCV[YJTbh\WVWZ[]`nkcemomSPLA^ik`ALWJ>@CLJA:PPT^]b]dhaE29JW[hopgok`S-BWk~c`Zdnj`ejdWWYSF>;8\ZIJ-2%+UVG^U+7atpeccb\bniZu}nhekeegaP, $HYopVPV\[gtpepg\ab]OMIW`g@HdmvYMiv]c}t^dk`YZLZ^a]cttpni]\ah]j 3@L`WQVjnnWQ\c[ZVPHYcW[UEQ]]`JAcneZOQOQQLbhjmd[U\nƒ…ˆ{gcbncN (2Oz‹e9FkqgVLPUT[YZMIOT;3W…tjmZVIQQ€д^pthL[SEirwqhjiVZTV &\B::Y’Z1\um]eSZT^^VJQTF0)Yh^\B?E-Sa^cmincd^Z^gc]aec]STW  AO0GF:AYtwœ™qoZ01(CCI[juNOSVOII`nc`icNScinbiovi]QSSQQ"8*"$1C80cQHw„pip^\J,.[`Y\UHMhp[otnnmg\[cu}mdbje@:F@NУ &FVnP#\}mnV<1%8UQQ]ZE:OgetontgWanqu9>g‰tGFWWcФ 57,V\$@)2>ELYTVv‡ha]U@#:8V\8Fr|’ВКебЋЕŸ~dZ„‰Š–ЊД’•’’”™žЂЃЄЄœЈЌЉЉ€ЌЉЄ˜–›ž-2,)-:INUABGcT&(11Z‘ˆ”ЕМЕЊЗЅ—‰{mЃŸ—•”™ЁЕœВЎЏЎЇЂЄЈЌЌЊЈЃЈЈžŒŒ’$+1(2;8CL\e{d&".ALG:ANP’ЖЎЊ—‚‚m|–˜œ˜•’z—ЎЋУЏВДЌЈЄЄЈЉЈx‚ЎШВ‘…”˜›0++,317QJBGjt?0;1@B>ALTM339A[pwŸЈ•ЃЁ’‘„{žЗŸЄЉЏЦœŽŒŽmžЊЇАЏЊЊЇЅŸ()*,,3:<8.1)054887:8;9:@A>>7-2,,2pP`„”ˆ‚•ЇœŸЄœ›•Ђ”ЖЖКУЭДБДЎЋЉЉ)**--3<4:1*,,++*32.557:059;8757->NC,C[„ЈЋЈ™˜”••ŠžОžЊЉЎЊЈЋЊЅЁŸ(+))+980-175587.&-+770173<;;74:;HGB9B):>n”УЊƒ›Е˜›žЇЌЌЋЋЊЈЉЇЃЃ›!%#%(-,(3849:51.(&+22.0--513424::5>;:57>,+>%0g|o•Џ‘œЂЂЊ),)#*+.--.--)#-)+"*1(-)IU>;:<510.1-.7-+4959:995@8-HVL[‰Ё‰ЎЊЄЎ&"$%*++0*)*#&"&#&!8O9EB?827-.,+3418@;?70*3.-&%?8:3FTЎЪСЋдhxƒ‰{wtrb^Ydzww…ŒŒ„pu|…xrmqUdqndjgkek}•‘Ž…}opijw”„ˆh]qvvr~rqt{uicmqokjcg`bjotkZcr~{rjjpqYB;Whjjtpnkt}Œ‚z|{vqhdj’—…b8V||ZNSUbio‡~vmonoichovjij]m‚‰”jmmqACHJMh}w|{rmŠƒvtjtpnp‰ЁЋЋ•kWIF7@W^Veq}|wrihjovtmqrtmt‚ЁЈ’rU`aNIL\Ib…xdcdƒŒ‰}qtj^^|‹m\G15PC.GbVVg„{woegomqhqonjhw™ЛŠngkj"OdYhm|{xkdj„Ѕw^gpaTZhƒz|e}„tqvtVTQz}zqngeorjoqreMcŒ˜…„}epqtWr].Ozg]PWbxwmghnpgodepqw}vrqnwmkjcehmaz‚xuwƒŽzeb``[\owtdFUYP]h„„VPt~kbokm}wraZ]a^prprpw|xnmminvkcjupqrzxqwvrvhb[^gpqtqproU`NN]xzŠ‘žŸ‡jpkox{vwqtoqu}‚vtvrrzz`icjhpv~zoktz‚rmmutgZ[brrnkmtjkTLPVQ@VˆЈ‡vgder‚…vqdikt||uunqroVV{œ„ŒŠwwq}‚xmkrwwxvmvtr{•‰T17\}}rdYbzƒ„‚tohcdqnvka^kvƒ~~{~|um\V^n}‚u^Qr’…‚ve`dgcoontz˜xJWboomkhgeaohbhieccotmhcdhjp}|vwwz|ccbZmuuoO\‚Ё™МЈ|ca``^mw{zƒŽuIZU`hjdi`Yhmtpkk^doq{~vxw{ou}‰‰€{prmmaiv|rgSjЈЏ™‡qhŒŠrjmv~…‚‚qe\Tc]VikuaVhprndanprt„}{xz}ƒˆ‹‹kgjjegr|qi‡ЋБzZgvuCJbcrwvpnW7GMu}‚АЗŒxV[S\rƒw‰Š…ƒˆt}~ˆ~zŠ|ue`\gajtˆ‡wuk‚~][gieV`jwmqjk`]mVYdq{‡‘ugcac^[kr‰–~ˆ‹Ž…~u~xwt{xznH`bcip|uoa]jpj]`YTa]aittwqvqbZr{ztbWQmtpdT`{‡Š”ŒŽ‘Ёzvwz|}}z‡o^Yc[hqtrbcbk``kmY[OSOi{’}ŽnJIS^eQEMSTb\Ncggopwu||tOCJ\it„…||zm]C]j‚’wrhnvrorrqed]cYPSOhcVZEJCFM`Tg^@;Wq‚z{uumnuˆg~‘Š{wxw|wo\M("<]j…}gbcinpƒ{tthimh]c\bj{OSoz}gZkrˆ~txxmdiedtxr}‚„znoqrn}$)FQQ^nc^dw}‚]iiriji^`tztc`dmtwpgOu}ukniabicmmuw{ojn˜Ё˜ˆomr|pc+)9.$:>Jn’—œnGWwwegcdqriaV^dvNHoЄ‰zkb\``at‰‘zikhVw|ƒ~rrvijdh$.+CrY-9NOnЎgIm…‘}mwnjpnheZ`d[M:cxnvZQQThkmz|„x|wojixxovwpibbd)!31[cH02-8\`04QPnŒДЄxwpP95OWWj{‹jecdba`jxmnti^mt|{qz„vdiecdh%,!BFQPEFJ[Q$)(I}a]‹~t~j[WMJYvcrzdWniU^Ne{‹vqj]!)$$707.#-@)213+44::ICE,3$&GSCkve}b[MIg~ktˆ‘kZWP:q|vx{~tkjr&,!2B:C>2%%0$$5.014:*-<;91))T`LQmdWYjqrijug`rce‰•Є‰|}}}z#*.4873+*)()(5))2),,+*;?.(+05M@ $7Jh}{tjjmgkw^pkh„‡|vxwihm1%98:15121)#&2-&*!(*,23EIN??.?:B0 0>;Sƒrj{zzˆ‚qtzioma1*(+-114&-#,+95#$,4(!,72@>@<*,.?+!9PC.>xЖŽqˆpwwzo^antnpi#-*.(!4*!),2,55-#+"0%498!CTFmwbvrpgjnqmrx$.0+,#!20++1&!&"*.)-*-8-7,*0+$05#-4>9;B-#1&0##2&PdMt|ZWekiwx"%$)%!1A@9%&)%$,,&EO;8A<9+*3+02483871*)&.2WC]dubdvt‚#")!&.<-0#!!"(, ,S>3FC<$+*%.30038?;048"(1)1:811@]Ÿxџ€ ‚˜ЖРТДˆzechF>E\^eabhWCMVZV]wƒpjekuh^c|‘‰……}zw}}˜ЇЇ˜ЂНЕЄ›•‹ˆŽ•œЅЂ™ŽЂŸžŸ…vjab]BNOUYZ[bga\bQJ@Qbdgjmpndbekq|‡‰„~qpz‚t‡žЂЃœ˜‘”’–•”œ˜—‰qW[a^bYSZV``W^^ZjmbQUeokk€^agb`„ŠŠuorr‰ŠŽ’–—•”•”—‘|p{„…„~nkot{qdW\jhec]\\dZTP\ahroigmonoƒ‰ˆ~}zu{‚‡‹’•—–Œ––‡‰ŽŠ„x{‚…reot{q]Wgg]VNQ\ZOFOHkzqrv{uoku|„…ˆ…}|‡—™”‘Š…ˆŠ’Љ™‘ƒvx}„{iabJ#&L[\jH.BV`^VE>-Ci~ƒx~Š”ˆqihjtƒ~h[x„ƒ‰„‡‰ˆ‚ƒ}‚Œˆ{‹‹‰ƒxrz{pj}dENZ[?4$15Md‡„vjgd`]YZaenddqpx‹‰ƒŠ‘”ދބ|thНЮР•ujjwwoedci\OCISYZYPFJO\jpxj]oqzuh]ahkebahghq}…‘˜’‚|z}}rd”Ўžx…~|}|zv^YNQJ>()#"++7.9A[TPT^kkmikd\gpqvdWaeq„Œ‹ƒ’—Œ„{uwpj–’q\cmjhocTNQQWJ:-AGCHHCFF˜CLY[Y[Z\UUWYVS[jkddt}„‰•zbq—”Œ‰ƒumnihrzxbY^cimpehkkrqS;OPMIQSNQcjgg`^d]\W^]]mkb^epwvoi[Tz‘‹…‚uimmpmpoo€“eiikjbZTW\dJ.1!O]MFHHNMWabhibgULLMJQ]pvojppmpnkgrŠ”•‹v][dp|qponket|uqo]VOMVW:9>[ucVTTPWceg^^m~jWVUQSYcbbcpuv{x{roœРЎЄ„xuvttnkieYSc^]\Y[ZUTGGMWYLIAEEPSTZ[`dmx‚{^a^bYYa`[\hpz}}ƒ~}Ÿœ…{ƒŠ…ƒhYJTSFJYZZW]ek^YO@*?8--@3FGV^nzwƒxj`cdWNUabcjwƒ‰‹‡‚”ЃŸŒz‚‰ŽŠ]VUYbajpebWeidSAVI7BS`dbhhehk`ZMAJH1ATT`€[`nuxxqiidbTISZ\i|~rkmh{‚ˆ„{‡‹xŽ\daWVZVQYgmc^YWZJ<"$$%:;Tiherxphha\`d]W^mjg^[Uaiju‚~‚||ƒˆ]^`[UZSSZcd`WTSI@CI:CE@2CI?Tijkbhpvjga\ZV@Uutnc^[bpuottwvzuur‹`]WQNF:FVee`WT[MAHJ93E709?FANph\biooehmiecj}Š‚zdaWbhux‰‰{}xpux}jjiF(@VqdTer‡j00YTPI!Shd\T[c^ZbbY``n‰{QV\p{xvw|‡‡…€‚VAGNE%;m{q~uY(-N+E>7%%8n„nigjrmcZdiodT?VvpULZipmomo{Ž–‘ˆ”œUMIM-@]TkƒrcdzgG;:CcGHGBA4I\hpƒ‡|qia^`ghWh…‹xwqeakihgrwz‚vt’W4<3H[aIHbV@QaiwhS@% 802BZnr}mkoonoiƒ•‡~gЎ•wW`kpuwi`Zdwzwpv}UA3-0P\`Y9BOOMNZ]UIH-% +Cn‹™ЏŠ}o^akv|~‚‡Š…„ƒj^`cjuph^bizƒqqrWcdB@[[YPLOW[OHHPbP5<€о1aP?Mr‚{pmmu‚…}z…ЋР‘[Tahvwrv{~{tumeQe‚rCETOTYZWQVZWgbUFYWT)F[F?k|{r{xnqw{}wvzohv””rgqupomqnkivwxz5M\ZJMTWOLTSSUMIBM>-NMH8!+U`n~ƒ}|w}ztqmbhmm^Ymz~reooccgihpqrt‚Š[ZW][HCHLb{wirWIQVB#50OWp‚…}ƒi\Z`Z^djocgv|‹–’pebb€Tprgek|‚@985,8:YnMhbOP@98BHC33GZYp‹~vo‚Œoke]bkia{…‚wprtkagamvjcchkkmqz$,424@IBAGHOT\YLHNOFA,>LB3,$Yujboopu{vv‘•ƒ‚ƒ‹™Œx{‚|un[hhquuokh^oƒƒMN)GTB+1;FJSUWGLP.2".?5"CQYbikehbmvtpqvqu|‰iVŽ˜Ћwgdhknj]ab`nwQMHPTE<)BQT^Y9 9\NB0251(7;bbVS`jiihui`irzŽ‹‚pe‚‹Šk\cpvqgZ`hk‚މWHNO: "%CQY\TSJdW ".4*;HUF?]T\e`dokaZec‚‡d^`t}ƒznpoicW0Wix‡T`dHN2GkG@GZgdTFEN;&,?;7B10IZOUb`ac^amk‡„zn`WT„Œ…vcdagbZTW[W`imkmgBQO[\U0?8VQTE*%!?SJIE3C4&ikakgiucW]kuxuedTq‡v}{tTc^SHSY`[hpEMbiFAITNLTQUU€БWSgM?.8@S."M:AZzhgccd]YTpq|ƒŒ„‰Ѓ‹{‚‡i[YZWdVe{–‰ZOiWCOP^bZ?89QUGHMZ#)VPTToraYZg^PPOHdxvz‚Ž”–{ˆ…tOYVZW]`iЋŠi[TTM?AME>)YUOUPGLiBHJ@Nqe^nnvweccbdnnwwp||xizz|r^\[[WY[g|xa\\ZLL`^SUOZYOVVPYzY4^mISCM^hckrzodhcgajz„ˆˆzv}„ˆ|rjg^YMH^mh‹de^ZGGPL1?EUYYONQWa[^iiW]ZiZZFevwvjgaa^Vbdq}„ƒtz~{zzvdab]ZVWP@rƒUdZLTPMOJEQVJPVado{gJSdnmZdPOQv–ˆMNWce[ZNp‰™•…v|ˆ„vwrc^b`^\S;p…SOP<+*HHTWLVZ]^`mmN1SS^bTOi‘žhBVekhb]m‹…„‰x}xqorg^VUicTNo…`cHMUJ9FCML8Gd`PG.+1&+BWN3LUN.\|jQEPSbotzz„„|‚noopg[ejegbgmW:Ne]PVNZWPI?97EPLJOQ<[TGFILCSSOr^Yepjeounqwƒ‚{‡‡o^egceinhVVvkNIht\O`m‡cMTbNI\?HWLWQITE%CPZJ!?[ujcametonq~‹…Šu[b\ejnionbh[VTUd{Z)HvdNPtN?NPpoWYTT@HL7&CE@<5&?+BEPSZptt{~ЊЇЁЇvx~ug`]pm]YYZeW`‰вдИЪсчхсЫРЌАЋŠŠ•ЎЌАДЏЃ››ЁŸЎСЯМЖЖИДЎЌЋРзЭЫЩШФТТ€ОнзеемђмнйгЫЧЪбджмдШйммнЫОЖЎЇœ”œЅЊЊЌЊЇЅЄž›—„™ЏЗЕВДЖЎЌЊБАИЩЮЮЭФКАОФОВЫлпммеаЭбдгаЧЦШЫЭЯЯЩЗЃЄЋЏЅЅЊЇЈЇЃЄЄЅЇЉЊЇЂЉБЖЗДВАЋЈЈЎЈШЪЮЮЭУИЖЖРУЯеедггдгбгббЯТАСНМУЭдЩДАДИЖВЌЊЉЋАЋЉЉЇЎЊЄž”ЇЎЗЖЖЕБВЕЖЗЪЧШШФССђЦЩЩЭггбаЭЯЭЫЭЮЮ€ЅЯЩЦССЧЪУНЎИЛРЗЁЄЌЌЉЄЃЄЄЇЉЄ˜ДззРРЛНОНЗЗИОФЧЪШУСТЪЯбааддбЭЮЪЭЯЭЭЩЩЧЧУСУУТДЈЏ•eaŒЂЉЏ”–œЇЅž™—…‘ЎООСНФУСКЖИЛОФЦОЗœЖЪЮЩЧЪЮЭЯЫЧЦШЪЫЦТЫЩЧУНЛКИЖАИЋ‰‡™ЃЂ—{ji~Œ™Ÿ˜БЛФОСЕЄ–|ŽЇЖИИНУбкК•ЈНУЦУЦФТРСТУУФЪЪСЮЪЛИДЖИДДВСМЕЌЁЃЅЄЂЌЃ‰‡Ž˜ŸЂЇЄЗЛЗЖЊЋЅЇЉВЗРУЩкпаДВНУЧЪЮЮУЊЕИНОУЯбЪггШЦТТКВЏЋЎЈЅЅŸŸЄЅЈЄŸ–•˜žЄ—ЏТОКБЌЈЉЊАЗМДЦчгЯЧННРЧЪграЗЏОМКОЩаЪждЯЧФТНОЗЅ›™ЁЄЇЋЌЇž™›ЃЃ›˜™œ”—ЗЮТМДЋЈЇЉЉЎЈЄЇБМЦУЏЕЏДЭежкаШТНЛКНШЧлзеЦОЛТУЌЂœœžЂЈЇŸ™–ЂЈЈœ™œž”ЎЧЮСКЕАЊЅЅмЋАВКЛМНМЕВЕбсжжбЫЩЦУСЧЩЫЪежжЪЦРЩДžŸŸ€‹ŸЂЂ›žЅЊЋЇЁ—•œЁЃЄВОЗВЎЊЈЊЈЊЌВЗЛРОИДИДкздбаЫЩСКЛТЮеаЩЮаЭЧдСЖСЌЇЃЁœ››ŸЁЉЊЇЂŸžœ›™˜‰ЃБВЎЈЂЃЋЋЏЏДКРРТСРРНбездаЫШТССУШаЫЩЮЪУЌЌ›ЉЊЋЈЃ››œЃЋЎЌЊЄЄЁЁ€йЂЅЋММКМБ–˜ЎЖОЛНСТСНЛНБШммйджЪУУРНОУОЯЮЭЇЕЗКИЮКЁЇЂЃЁŸЖ›”ЅЁ—‘”•›ЉЖКРРКž‹r›}ЌЕНМЗИИбалэллЮТСОНМРТТУбгЛŸДЖНФаРДЌЋЊЈЃЃ•’•—’‹…Œ’ЃЇЉНСТЦИЊЎАЂŒ•ДЕЕВЎЌДЗЖОЭагзкЪЦФУУТТКуцбЛЛИНОЛЋЊЈЉЌЎЌЅ›—œ•Ž‡•ЌЧТРКЖЕАЋЃЁЈБЖАБАВМРУйЩЩ€ЊЦЩЩШЧФФМВЈьѓчЫРЛЕЗЛМЗЏЌЊЋЗЌ›„Ž›Ѕž˜‘›ЉЛОМБЂАДЕЖЏЅЅЎБАЏЌЏВДИСФЦСЦЭЪЩФСОИВЋЫйЯЛУМКЛОЛОЇЁЁž–‚‡}‘‘”ŽŠŽ’ЉЉ•ЁЅЉБВДАЋЉЋДНЕАЏЏЌБОЫЪТСЧЪЭЪФЛИЕЖАаЩЖЄЈЎЊЇЂЈœ”Ÿžœ’‚zŒ‘˜”•’ŽŒ‘˜˜œŸŸРЁЂЂЃЄЂЁЇАДАБЕСЩЧйРЂЊгЯаЮШРИДБЎЗИВЇЋЄЄЃЉЋЎЈЋЏНО—p‰Ž‘’—‘‘—œ’ЃЇЌЈЄЄ€ƒЅЂЄžœЄЌБАЏЕЛРОЛБЎ˜КбЯЭЪНЕДИИБЗДАЉЄЄЊЌЊЈЄЅЄЄЌ›‹ˆz‘œ››™˜œЅЄЇЏЏЊЈЂЂž–•”˜ЅЏДЖЖКЛОИЖБЈЎЩжЯЫЕЂЌЌЕКИЖЖБЊЌЌВИЖЏЋЂ™–Ѓ‹‚ЄНЂЃž›œЃЈЋЎББВШВ•œ€EЄЉЎЏБЕЗИИМКИЌбхблТИЛКЛОБДБЋЅЂЅЏАЎЋЉЅЃ›™››•”—”›˜™˜›ŸЃЇЈЌДНЭРЌЉЇЃŸЁЁЅЉЊБМСУЦОНЛЮкдЫРФФЦФУЌЉЅЁЂЂЁŸЂЁЁЅЊЇЅЄ–Ž‰ˆŒ‘‘Ž’™ЄВСМОТОИАЋЈЂœ›ЁЇЈЊБКРЧЦТШЫгбЧТНРФЦСœ—•™ЁЉЏЏЌЃЃЅЊЄž‰‰ˆ‰ŠŠ‹’’™œœŽДБЖЗЖžЊЉЉЅ™•›ЁЉЌЎЎЌбШШТФЦУСМНТФТРЂ˜™›ЇЌБАБАБАЋЄ›——–ŽŽˆƒ‹{˜——w•ЗЕЗДАЉЅЉЋЈЁ™žЂЄЉЊЌ—ЕКРТРНРУЧТТФШТЄЃžœŸЄЄžЃЉАЗЂ–‘‘„k‰ƒ|~uˆ‰‰{ЖИКЗЕЏЈЋЊЋЊЇЃЈЊЊШЌВЗЗИИМНСФУТОСЧЧЂŸžŸЄЉЇЇЖУКСЇ›‰…‰–ž•}`z„Š’–‹‡ЅИСОРЛЗДЊЋЋЇќЎВБААХЕЗЗЕМТШЪШУСФШЪ™—–›œЁЂЃЄЏЗКИЄqbh‘ОЮЛ„qz‘ЇЁœ–ЂДЗЖДВАВАЈЂЇЋЎЎЗВЕИЕИСЩЭЯЪФЧЩЯг–™›—™™ŸЂЌЌДДКЃpw—‹™ЂЊЈЈ‰d—ЂЉЌАРБЏАЎЋЉЅŸ˜‘žЉАДЏАЏБЕЗКЗНТЧФФРТЧЫЄЂ›‘Ž”›ЁЃЈЎЏЋЌАЋЁŒŽ‹™˜›™›žЅЄЁЊВДДБЏЉЉЂ™–”›ЃБЖЖЏЉЈЌЛНТОТССНОНН€ќСЃЃЂž››ЃЅЈЈЂЁŸ•‹|‰‡ˆwmgi~‡—ЎЉЊЏДЖБЉЇЂŸŸžЂЈЌЊЅžЁЅЏЕЛРФУСМЗЕЗНСЊЇЄŸž˜—˜ЁЄЄž˜’”•ސЋ‰‰ƒ}mƒŠ}˜ЕЉЂЅЌБЏАЊЄЂŸ›~˜МЖБЊЄЁЈАЕКМСРМИИЕИМНЄЄЁ—•—œЁЄЅž˜–ŠŽ””’‰Ž‰‡„ƒ„—ИЉЃŸЈЎЏЋЈЊЏЋЋЏМЮНЛЌЉЊЊЏАЖЛУУОНМЛЛММЊЃЏŽ’œЏЄ—ЇЋФЈnVntdЂŒ‹ƒ…^p—ЎЊЄЄЈЋЉЅЂЈЊЅЋЖЧЫЛР™ŸЂЋЕЖДВЕКСЦЦЅУЦТЂ››ŒqˆЗРАБДКžo|™}F:v—’‹„Žu„ЎЩВАЏБДБЋЊЉЉЈЄŸ}‘ЌЕЋЂЂЈБЕЕЏЋЏКОССЦЪЭ™’Œrk‡œ™ЇИЅžŸЗОИ›ƒŠЃЊ‹ˆˆ{ЊДЖЖИКИЏЇЃЈЎДŸЈСЩМИИЌЌЋЌЉЌЎВЕИЗЖЖОШ—„}d‰ЂЇ•ŒŸ•‹™ЄЌНЋ”{nw~{~xƒ›ЌВНКДЎЏБАЌЩгОРВгцЭЕЅЌАЗЕВЏЋЌБЖЗЖЕЗН‡ur•Ѕž•’—Ž•ŸЄЂ—Œ}pt|zezŽЋУаыУМАЌЎАЖМРОНРУФФЦЎœЈЋБЕДЏЏЖКЗЖКЗЛ”ЄЉ{zœ™™•‘•—–••™œЌ—||jPBE}Ѕ˜Š˜БШСОДАВЗЛНРРМООУмѓЮ›—ЇЎББ€ЖКЗВЗЖЕВ—ŸЧИƒ•”—•—›žžœЃЁЁœˆЄžŸbŒЁ‹…ЈИЕЖЕДДВЗЛННРЛБЏЌЎОЧАžЏДВАБВДДЖЕЛМЗ”™ЃŸ˜•™œ•žŸŸЁŸЁžŸ‹|Ž’‹ƒƒЁЄБФСЖЗКИВВБЌЌЎЌЇЂЄЌФРОИДАЏЏЊЋЏАЎЏБКССŸžž—•Š‘™ЋЌЈЈЖœ–‹j~ŒŠd@Jt•АОСНТЏЉЇЅЅЃЄЊЉЋЏЕКСРМКЖБЊЇЋЏДЏЌДЗМ…ˆ‰Œ•Џž–’‹ŒŽ‰„‡ŽЄ˜ВОРЕЉРОМКЊЌЄЇЋЊœКРРЗДВЗЎЃЇЁЊАЏЈЈЋВБДДЗЛi„ƒ‡‰‘•œ…‘–•’–’ŒŒФމЊД˜žЁАЮЫНЫЕЈЗОАВДЖЗАВЕКЪЂЂŸЋДЗДДИКМОКЗЕК›wƒ|…Š‹Œ‹’›Ÿ•j‡‡Вˆ‚‡~Ž‚•t‡›ЌЖЗКЖЗСЧСРМЛРОКДДЏ™žЇВИККЗДДЕЖЗЛ–}]ˆ‡ƒ…”›œœ˜—˜——‚…‰‘‡ˆz”ДЎЌДВБЕКК€WЗОРМНТНИЕЛСРДЏŸЈЎАЕЖДЋЃЈЎТС’‹Œ‰ˆ‚‚Œ‘–—œ–••z~‹ˆ……‹ˆЂ˜ЃЃЄЋЎАВЖЖДААЕКРСЗВ•ФЩтЫЗЏЌЏАЎЋЋЈЃЅЉЊК–’’‰{„•—•—–Œ™‘”Їƒ…‡‡„‡АŸ™ЁЊЌЏДЏЏЌЎБМРТИАЋНаШЪЏЌЅЋЏАЈЃЁŸЌМЯТ—˜•x‚…‡‚‰™ЁЊЂ›™ЌЄq‚}ˆ‚’Šž˜ŸЅЊЊЋЋЈЇЇЁЛРЗŸžЃДМУЯКВАВЏЉœЁœАНДЛКŸЃЅ—~›Д•‹ŽЄЄЈЈŸ—•Ž„‚ƒ„tЂ•ЂЃЅЈЈЄЂЅЋЧОЗЄЅЅККИЕЕАЏЊЈЁœЁŸЄЏЌЅЈЇ„ŽŽ•œ•’‰‰—ž™—Š…‡‡‰„…}rrЏТЋЇЇЊЇЈЁЃЈЕЗЕЊЇ™ЎЗМЗМЛБ˜ЈЄ››œžžЊ€˜–›ŸŽŒŽ•”•˜˜–™А—Œ~|{rŒ‚u{ЄСЌЉЉЊЄЂ•ЏЗЛНЦТУйЦТРТСЦАЇЅЁŸŸœЂСйЧžœЂ‘’Œ–˜•—™œœ–”Ї{btg}˜—АЛЁЉЊЇЂ˜—‡ЉСИККОУСМЛИИКД’ŸЁЂЄЃ›ЎЭхЪЈЂ•›•˜™›™”œ•››€”–ВŠPdmj’‡•ЌЅЌЌЖМРЋЉЈЅЉЎИЗДИДЕЋВАИЛРЖЉЁЁžŸžЁААЄЄœ•’”›™˜žžЁЁ—™С˜ŠЊЖ•ƒŠ›ЏЋАИКИДЏЌЌЅЇЉБЕЛМЛКЖКРУОЖЏЈЅŸ˜›žЈЇКЩžЁ’””—”•Š—ŸŸžŸžžŸЄЇЅЈЉЂЂЉ•ž…ЊКНБЋЅЇЇЄЃЃЄЏРФОНЕЗМРНЖБЇЅЅœŸž‡БЧ˜–”’•––’‘’—œЁЇЉЉЖТЏ˜–ЋЕМЉœ˜˜–Ожۘ‰ŸЂЅЇЂŸЖЭЧТКЗЕИКЛМЗАЊЄЄЅЃ’{АЩœ–‹ˆ‰ŽŽ™˜’•‘˜ЂЈЇЎБ™kaqc‚ŸŸЄ›ŒЏЮЩЁ‡ŸЃЉЈЋœЋЩУРННКИЗКЖБЌЊЂЂЉЊЃ˜ŽЎЦ™‹ˆŠ‰Žˆ~’ЊŸЂ›|u~„{„–ˆ‘’œ™vРЇ–˜žЅЎБЕОРЛЗЖЗЕЎЏАЏЋЉЋЋЈЊЌЁ–u‹ЊЂ˜•™™—‹‡xi‰‘’’‘œ–•ŽŒ‹—›ЏЂЊЋЋЎЎЏЏДБИОССОНКБЎЊЎЊЊЌЎЌЈЋЈЇžŽЃДЄŒ›ЋЩЂ”™Ќ’daŠŸ”‘›žž‘…‡‡‹ŠqЉЕЅЈЌЊБЎВЕККТРЦТКЉЌЎЋЉЌЏЌЉЃЇЄŸ‘ЄЖ™gawЕЊ˜œД’ŠŽ”Ћœžž—д–‘‹‹‡‰ˆƒ‚u‡}Š‘ЁŸЋВЖИОсЪШаТИДЌЋЌЋЎЏЌЊЈЅЅЂ’ЁМ€тЌ’ЋаЯбУ‹uz{VV[{r}xxrj`]eiet‡˜ƒ}‚|oxЈœЃ›•‘Ž–БРОВЕжУМАЊžЁЅЌАОЕЌЃОКВБœ‰z{hY`epnpkwwomiaZPbxrz„‚~nuw|’–Ђ—•„’›•ŒŸИКДБАЁЃЄЇЅЃЂžЂЈЉЈЉœ…jjxzwqrpuwrnrmpz~ojgw~ƒ|wouwu’›ŸЅЂ™ˆ~…‰’ŸЂЉЉЈЎЏЉЈЊЉЌЇ’ƒ‘‘–—™Љ–z|‚ˆzqwx}|wrtqxqketw…ˆ‡~~ƒƒ„’›œ˜”ˆ‘‘™ŸЉЈЊЊЋЃЅЇЉЃЁЃЃ›•‘ŽŒ›Ÿ™Œ{~‹‹…rnx{pjihorda`^|ЄЂ‹…ƒ„Š„}Š•™ŸЂ™’œЋЎЃЃЈЄЇЂ˜ЁЃЂЄЃœЋЇ˜‘Ž‘›•ƒp{b53Zrr{ZFTjomg]ZHTvˆ’‹•ŸЅ–‡ƒƒ‹›ˆgŠ˜žœœЃЁ˜’’˜žŸ™’œ›–‰ˆŒŒ‚|ˆtSQO]jm^J?BCVa`dz‡’Žvh\btƒ‰‚ƒ‹ЉЎŽetˆ—˜›ŸˆŒ’•œ››œЋЎ•‰ƒ‡Œ‰„„ƒ{ximrnmwiQSYdprpj‚ˆ‰{pp€ўx}}…‰‘–ДЖЄŠxƒŒ—ŸЂЅ˜{|‹’ЉАЂБЎ–—‹{xxnooqnhkoitqbZ\YWada|ŠŠ‡nikpuƒ…„›ЧЏЅ›‘…Ž”ŸЄЖЄ‡~‹‰Š”ЁЈЃЈЋЃЂ˜‹‰‰nc`grwxxp`[hnpm`edY^‡›’‰rogioukjn‚ˆ–‹|…|ЃАДЌЋЁ™Žˆ‰˜žЏЕА•ˆƒŽ’uhenjkjpne[ZdvmaZeh\q”˜ˆ}wpjmmr~‡|Š‹‡„|‡ЉМАЎЈЃœ–”˜™žœ™ЖЛЊœ’”Єˆhiddnnpphehtztuncadgoqz‰|xqnpnqrv~Ž‘—–‰~‰ВЏЎЇЁ—ˆ‹—ЅЊБЅАЏВЏЗ˜Œwojg`Tcnkmuvm^bW\cbgan|{zpikrwz|‡ˆŒ‹•–ŠŽЉАЊЉЇЇ–•Ž”ЂЄЈЁЉЈЂˆ‰truxpjgh^ejqtvnqpunjkoku„‚‰|c`owzˆŠ…ŽŒˆ‡Šˆ˜ВЖНКЎ–›•‹Š‘•ЇЋЂ{„ŒŽЃ‹huoi`cgjxa]nc^SQS]m‡ƒ‰Œ„`QFgP\gp…‡ƒ…‘ЉЊРжУЛЇ˜Ž‰‹‹’—œЈБt‡•™˜Š~w|ui`j^PVWZZYTYqvrƒ’Œ„|ruhUav‡xuƒˆŒЂЈЊЗИ›—’˜–˜–”ЛСЇŒˆ‰ˆ‘‰{unozztdaVU[oc]NQOQ]w’”‹}zvronmz|…}z}…’˜Ѕœ™—ЃЉŸ›ŽŒ~}зпЯЅ’Œ………ˆ‚tvt}rbOZeomma]Yduƒ„Žzk{‰‰ƒwpnz}}qtt|{Š–•œЃЄ™‘‘‹Š…ЅОЎ—Ž•—‹tkd\`WPJSL[O`YQH]ko^om}}ƒƒxtru…‡ƒwutu‚–œ›’”ЄЂ›‹ŠŒ‡ЋЋ‚mqxquqtiddjd[OHS^^eadYUUWVbehkkmpkmkicn|z{’•›Јu}ЄЃЂЃœ‘‚~|Špruqpt}{x~ŒˆcALGPd^ZT[`a\tqxunrurpgqtw}}uwtˆˆ‹‚|qdŠЄЁŸ•Š|{…}vutww{vvidmzaWNAWh`][a^hpw{wtvqpcc`jipˆ~ˆ‚ƒ~}r}™ЌЊž…v|zŽ‚~xu‚‹ŠŠqkcegjOIJh…rok`bitzvvu~Ž}kjhdjnuwqv~ŽŠ}ЏаСН™Ž‡‰‹Ž|wtpkuumpnkib][aic]a`b\cceipuw„‘™‹rvonpkqtnpwƒ‰‘Ž‰ЄЕЎœ”ЁŸ˜””voejpnrpjigptvnk[PIHISS^T]]^ep{‘ˆ’’Œ~xvzobgtpq{‰’›žЁ––ЅИВžŒ‘˜™”hd\dmt{upjvtwhVb^USV[Q[^`]\\Zhˆ|‚~‚knruma[go}{vzЇЃŸ›ŒŠŽ‹‘•njdg{‡‡ˆ…‚}widhdWV]^POFkoo[H^ƒ~ƒ}trutojgintvwrj‰–”’’›˜™’•žpncdhkcgeq‚„nc[[QI8A8BN[Q8SZQGiƒ‚ƒ…}uxt~}|tutxmpx~‡ˆ„‡„Љ’•”Œ˜ЅЇneimw~zz‡—”—wcULO[\[A3JY[T]SUQn‰Ž‹ŽŒw|~wwrvƒƒ~vz‚‚‹’œŸŸœ—Ѕda`Uemjpm‹‹ŠŽqA--\ˆ–M8A\rkgce`d‚Š‚…ƒxjkrxxvpzƒŠ’‹…‡—ЄЄŸЁ™‘ŸЊЊjhjhbcbmxv~‰•r3Ga`T\hvnxW.atux•zuru{ti\ehx|zx„„…Œ‡Ž›’’Œ˜ŸЃЄjn^^VWcnot|‚wvzri]WUYeakecovhkv‡ƒƒ‚zurq`]dvz‘’Š}|x‘’•˜”‘—œ‘‰‘œktmededgp}|}tkjgYMJAGBA-4FLPgztv{ˆ{utwnpqneqz‚zxpjq}‚‰””‘”‘ˆ‡Š–homhddaiioije^U\SZTYUSUO<8IMMIPe{ƒŽ…|~„}|™Ї˜ŒxЄФЇ‰jmzˆ„rq}‡„„[WNBBakjaWV][WepmkZYC05E?4H]‚ЂВЯЄ–{q|„‡Œ’˜œ—›}rutz…ƒwu‚„‹”‡……^nuPSied^VajhcW]bz^EO;LnaQb‚Є˜–‹…‡‹‘ŠŠ™ТтЎngrz…}‡ˆŠŒ‡ƒeo}T[ddbehehhmmnodLjggL*UoWNr„Œ…Žˆ„ˆŠ’Šƒ„xx~ЂЄ„mƒ‚ˆ}{}‚~…Œ‹\ekdTVehZeiigmjaaeQJadbUJQtm•—އŒ…‡}|z}rtn–‰x}x~}{„……‘™hjgob`]U`‚ƒtˆed^pQ7JCBH4%>ai™’’{uuvokw{x|ƒŽžЈЄ‘‚xrrowt|‹•JP\STPSa|buoigVPOWW€УOPUqnxމƒ„”Ÿ™‡vukp|wk”›—ˆƒƒ‡ƒz|t~‰{qq}z}|‰Ž’5GMPLOT[aMZ^bgYg]bUZZVWWNtmmjz›ž—ƒ{Žƒ|ˆ’Ž}{„”™qkou‹ˆ„…„ˆŒŽ‹‘ŠgHHS[`^V\^e\ZYe[<9IQVPLJ^NZCUc~…ˆ‡‡Š–˜™’™›‘‘‚qkikx{~‚ˆŒˆ~‰‡^J8PV[\]VhbqkbVhYbOHO`USOIh|}‚~…ˆ‹‰™˜—–œЁ•’‹˜|kx~|…ƒ}~rn|’•^`N^cVHQZ[`kcdZ[ZAJPONLSTjim{z||v‰Œƒˆ„…‘‘xmžЅИŸŒ|zv|~vnonqx„‘bc``VLLN\c^j[VH^o`WMGNVQJNutbak}~}z‡{{z‚‘Ёœ’ƒŒЅЅŸ~w{‚~rgnrz•ЏЄmoe]IPIMFN[nohcjwn;ELMPUTgUPibqxwxw~xutw’—‘tor‡”˜ЄŒ|…„{zdcdx”…‘›irpb]H[|[QSt{zhd^iIGFPMMрQ9@Wmenmvpproxœ™‹~tj\—™’ƒ‚zuztii€oan}r|nJYZbmhZYTdhh[OJNAMQWZUMJC3{{xwt~tutr…ˆ|jz’ŒŽŠ…dqreVbjonƒVZnxVSW[]\c^^hhdWvdSEPOgH@OGHt”rukib}ƒ’––œИŠ—‘””wnqhhojm‘Џhhi^QcgpogOQ[ba^Ydi>">5Adcbg}ˆqquwtgadUrŽŽŒ”›ЅЂ™Ž‹—‡bgrjnqmw˜КŸxu`bb`da`SQaimieVTxS0;><`WL]|vo{ƒŠŠzutuu~…ˆˆ‰x‡‡‹ˆxvmnhenn‚ŠcmagZ\ona`^jmdpp^c‰nYt|\UHOgwx|„‰„|vrqru„›’–Œ‡„‘—”ˆƒrmhbbqzwŒŸwrihV`^\TQ^qrohdajvpnxzonozdjVr‹‹ƒvqrwuopwƒ–—’„Š‰Ž‡wupmjmdO–[mb^^]Z^]Q\d[kqvr‰‰z^etz{hoa\`‰Ћb[jnvpoj‚žЉŸ‹„ŒŽ‘‘ŒŠ‡rpjjmjZLƒ›b^[]QO\YbgYaivnn{‰c734(Oibiona}ЋЏvPewxqh|›’’”‘‰’‡‹ˆ„ztkrwvb^~–qpWZZQY[ZYPG\vreYAEAH3HbWN[ccCh‘rbMadwzˆ„Š‘‘‹ˆŠ}|ƒ|v{vzuuxrbEbvvcecjhZQOL?;Q\^`ddYj`PV\U^hkb{quw}}{xŠ„„‚’‘•Ÿ—‡|~r}r|xkn‰{dZu‡maj|n[ez\+1UoW]j^jhahOSVWc]ATkˆztv~w‡‚…‡‹Œ–˜œŽrqwxx{|}qwzjg]u…j<9Jƒvjb„^Q^c}|rmkg]Y`NOVSPLLFTBQV\cn{ƒŒŒ‘ФКЌИŽˆˆ‚{ux}vxomngn™џГЇ•‚˜ЎЅЁ›ƒovxovx‹Š}qnbbddrrchmz{|xptP$*"%-Wccjvxtˆ‹ŽЄДИбК‡vrpuu}€]~}}{hdbcgjjou}„Š”˜ƒ@%  "#!7]ut}~x„~Ž—™ˆ‚x{qniojpv|~}vtpknrrqzˆŠŒ›‰b9 1+.AWkoutxx”‰ŠŒ”—˜–‰rmqqx{|~ƒ{ne`bgdkj[bpw„…‡’~U<+3% &%!"%Eqw\grx{‡ƒ„ˆƒ}„~xuuvƒ‡ƒz{rWOT]][\bab`~‰g,12  ().-Qjioqwxtt‡‚vpv~|ƒ„}rv…}tmdc]`heb\\nwx}o`WJ3+ # NˆŒwrkvztwx‚ƒ}wtxw‡’•ˆ„~{ungdgdhnmw}}wzg[hW+Ъ.cƒ~thjwzƒ‰ˆˆz{ƒƒ‰‡qw}xoggb]^diporu‰—›utx^7€˜ 870Ii~{kjntx}ƒ‚~xvomz‚{rv…|vkie`heUUT]hzq]b{rP0 !(04?H^]eoow‡|vppooiint{}z{~„ƒvojjebdghdg~Š‹vcvtT2  >BShv~pkj|wtt€Јqrxurwwnban}~ƒƒ|wgddcWP[nv|ˆ…uzzjOB# $:+9q’”{pmŽhjpognt|{~|qpop}~|uhgedcbdgpqYPbkq|uM*   ."+c{{vw„‘{ppruzƒ}{|zzˆŒ…~mhbbUQ\dqi[]kz|‚„\+ € 0*3bnbmw|upnepv}v}„}{|z|‚ˆibeghW5PSZ]\[]jq‚ŽqN)  %cznnqnŒ…{wtw||poqwƒ„uhovkhbhbWNBQeca^nvz…}Z2 "$ %;`eUbx}‡‡utqx„Ž…ztuvzxpghrxqkMBHHNT\eihk|‰œˆkL:.   0@k˜tUbpuW^iutop|Šˆƒ‚xnehgt|…{`QZULFWghpq‚–„d<  Ъ$;kˆugcc}Yacgoou}‡…~~}vqpqzui`mqnd[‚•}uz‹—ЎЄ{<&  #8&1T{qdaj‚he`bgqpvzvuwxx}}zrinmpkiga`W+[wqikr|‡Œa*   !>@ETYmqnmikihemupimqzxuu€CqkbmkeVNT]]WQav|„„‰rJ% #dzБ•ndaehmppqqomp|}mpngjjd`^cmj]WjzxzkgdrœƒC1G-#  #YgPN``‡{h`jomkx|{w}}qdaeijnw|tgbdc[UZbeccjtza@- " !L]JTkm|umiu}}„ƒwqpnon`YZV]mvpjebYGOZ[cdm|‘Ќ–jA:*$AOOVku…zmo{~xƒ}{rxxqhjhgiqpkiicZ[]ddZ\bЕ‘`?)  .)&;0;PpˆŽˆ‚xwpurqx‚{v…˜Œƒ„Ёzwnid]SZ\LSOW`^b``tx‰N$ )IM;"Ar|~}mx|wu{‚ƒxrqЂ—Œ‰~pkwzuiY\aadLP[TN>9YbkŒŽS<(2jwmogzwzneku{}cZv‘‹‚|tnvvrpkpu…`92BVUV[iwz–ƒCA? €=)%2Hƒvckonˆ~zƒtbuƒm]htqp{xghophgtwcJIIHabadqhu’„NFG  jАЁujn^Љzoeq{tppngjhhnrr|utqgG2TbW`^VTT^`e‰ƒE&!+* %&,FkqqwzuƒvpoghkgiwvnknuojdajtxxndYb^PQY[\[`em…kAFBAC-!$&9,0P~™Љ~`k‰—gcjiVPn‚‹mqxwodioutja\[UJW\V^jmbj\E,*4+,( %&5.@u‰Ё…\a‡}cjVOVFTnrwxumnx|{qqvƒˆtkUW^YUCGSnkmo^?":?BG  $34P‚|ЂВ›~„‡zvjhrg^rwxnoumqggc`ikrZFN[WWZ^peaƒm4.NM$Ц "%%2o’—•Šqzˆ…mY\h\^gejhhnjgjiukhacehaVLY`jm]UŽ„B С .$B\bi~Œ›p|}{}mdhiea`dquwtrnhhggVbr{zrjeW\^deddL"1<2% У(!,$Lb…|‚‹…‰…ttxtohc]q{ttuumjnjgjrrd`gjIEP^Zk‚c3IE" €<  [odnВž‹zwmxun^WTZetux~ˆ…q^jgc\YLMSZI>Lcho‰k8!(  %`pnp‰ƒŽŒtrnchmqd]^aeotqr|‚uxhZ`mkcWQaC2FGU`hc74    3Š„ejpuqrceh`egkqvvnwwxztmk^dqqdom?HL\cae>3. riao{’–„‹xd`anbWbntvrn{‹…Y`mhxgSo—\%BTgqƒr@   !bha…ˆŠ|z‚‰wo`becbnw‚wqhqwrkgejc][]dU@YZ^\C2 эh}biuˆ„ƒ‚ƒ‰‰r`[[€х`ipw{pmnpqiegkemoVP[QUZSTPbQ" *& 2(#r`\ƒ}‡|Š•›”˜‰Y>T^``och[dijhadgUikm]Ld`UUH>QvzV)#"! 4"~jgx}Ž…‘ŽЇ‘mLIbhjjShwokvoeeggqn[SWgi]59&F]dG#0 \|imwm”‡uƒ‘žˆqt^djnooj]hinjgqvmg`U^gSYVUP\zW0 ўТLxmir}”˜ˆ•ДŒNheotjeYihuid`NYehgVFQjdTLQQSdW+"" ї B^imco€ижбТзьухкМЏКЗМОЧЫЯЭЩЕЕАЎЊЌБЗБЛЦЧЩШШСМЌo;5@EJC@b•ЛЛИКМОЪЦСЭЭЫМЛИЛЛБЖЗЛМОТЧЦТМЗЕЕДЗЛКИСЧЫЭлтФ…QB9%.,47458AAGNLEe”ЖЏВЛНОЫШШЩЫЪЩЩЭЧМЕВЕИОТФЧСКДБЏЏА€ДВБНУЦдрТ„TNOC735:578;?@GLNNa˜ВЂБИОНЦУФЧЩЧЦФЫЫЩТСМНУУЪЫЦФЛЎЈЇЅЃЇЈЈЊЎЅМйбЁ[@NH+.-:9>;:>@>B@?C@BJHO[ex›ЃЈДИЧУТССНКК€ДЗМРМЛМТШЩСЛЖЎЊЌЊЊЌЋЏБУТНЖЉЖЃhI58834;<;9:?:C1>Wd|ЇЖТДЊЄФЛКОТОРОЛЛММЗВБКСЩЩФМВВЏЋЂŸЅЎЖМТРЛКЛОЁiUOA9498;??:?@@EL[ObЊггМИВаЋЖИНЛКРТТОМКЖЗНУЧФНЖЌЏАЏЉЄЅЋЌŸ•ЂВКНЩЅnC;<:488:7;5189:BJIZМЖЕИМЯКИЖЗНТЧЩЧЧТОНМРЧЫЦКЕЎЎЊЅЂЃЊЉЊЅЃЋЕЗЛУ‹P53;95420454372*@LN\›ЎЄЎАКНИЖЖЛЛУФУОЛЛНОСРР€žЧЌАЌАЉžŸ–ЃЅЅЃЃЈАЗЩЯЉmB99234:34922.04<@479:@:??ю9541?SY„УЏ–ЈЏВЊАКММцСШШЫЪФФРИЏЊЉБИНЯРЄЂЂЃžŸЄЋДДЖЦедЖ‚O018141579;220"9F]ЦЕЋЉЄЗЎЌБЗЛМОСФЦСРФССННЗИМОМЗЇЏАЌЅŸТкИЖКТЧрЯP<@0,,Ї14017955:;CGEn’–ŸЊЏСЗВВКНЛРУСОЗИИНУИЏЏЌЎВЖЗЕЎЊЉЅЁЅЋЅЁЁ™ИпБtNF?&32;@@95?8CJAMTw—ЂЃЉЋЛЗЛМСУЦЦФЧСЗЕМТТУСМЖВБЎЏЉЅЂЃЇЈЋЈЄЄДКЩкŸW,:?718;@;7;7CE;<;:><;:?EB;.@W’ЈЁЋВВКБЏЎЏКРФУУШЦОКЕЕЖВДД€АЋЄŸЈœŽЂЋЇЃœ”ЈбяЗc<:531-*2:?BBA??B;C|ЃЁЋЏЏУЛЕАЎБИНТТЦУОЗЕДЕВЖЕЗДЎЈЖЊƒ\g‡žЇЅЃ™ЈЪмЎoOJE<:3.49@FEB<@:IWŽАДЉЈЅЯжЩУЦНУУСТФСОИЖЖЕЖЗАЏЊЈЃ—›…xŠŠ•žЉЌЄ‡АЫ›]<:N>?8328C[ЄКВЏЌЈЦЧЦТНММКУЭдгЯШСМЛЏНБЌЅЉЊЇž™’˜™ŸЇЂžЃЊЎБ›e34954342>;>59;E:EmДСБЏЌЇСМННИДЗИРЧЫЪЧЕЖББДБАЋЇЁŸЄЅЅНТЇ›ЄЄЈЎАЊЋ•W.:758:?@?98549<<1>РИЌЊЈЛЖДДЕЕНТЦШЧЧЦТТСЦЈ‘ЁŸЁЇЈЌЊЋДЕАЇžЃЃЅЇЅТЇ\54<;:?>@::9248:@>\МкБЊЈЈЛЖЕАЉЋББОРУСУЦЫШЩЊЄЁЈЊЇЉЊЈЁžЇЃ›ЂЇЈЋЊ››…aH:;5544€<>897:;M5SЕеТЈЁ™РМНМДВЖКСТТССУЪЪФВажЭВЏЊЉЃ–|g}ŸЉЂЂЃВŽS.%+)+.,0,(278G(488<<;8;9>9?\ДЏ—™ЁЊММИБЋЋЎДЖИЗЏБЎЌЏЏЉЎЏДЗЗКйДЏЂœ——œЂЈЎДШЂ[OO]F590107?IPI]‘БВЈЇЏУЩеЫЖАЎАЌЌВИЛВВАЏЈЁЂЉЏЕАЎЉЋЎЌЂŸžЁЅЅЉЊЛdJQLHNF@?:;:;@EPJFkЏгнЗ•ЋУЧгЪЋЄЉЂЂœЎИНИЖЗЗДЊЈЊБЖДЎЈЁŸЁЃžžЁЊЋЂЅˆS8LFHEP<974<:-13.07;FEJC@TЈСФРСЧАИРОМАЈЈЋЌЅЁЊЏЏЎЋАЕББЎАЌЎЊЋЉЈЂЂЁЈЊАЎžЯБ]+-+!3:0),0NGC&Bg˜ЃЖЧбЎЕОРЛБЈЇЏАЎЈЋБЕББВБЎЅЈЂЂ€ЕЋДВЏЋЄŸЁЈЎАЊ}<4F;74439.(8GC<4EEN]‚ЄМЕЛОФУМДЏВДЏЌЈЊЎЕЕВДЖВЋЇЇЄЋАБЉЅЇЗ‹’”žЋДЧ™TPT).30#5;?B?57‚ЃЄЌгнЪТРЛАЏБИДЉЄžžЇЌАДКСОДžЊЊЋЌЇЃŸž›™–™ЅЊЩЂQ:<5"#)&*!)48;?B;9˜ИЎАНСОИИВЌЉЋВБАЉЂЇЌЌЖОСНМБЏЊЇЋВЏЈЇЈ‘–Ž…ЁЄЋ™`C98))2+-+)-)77;<[ТТЅЋБВФСЛБЏЋЅЅЌЎЋЄЉАЖИЗЛОРРВДЇЇЉАЌЌЉЌ‹vЄЃЂ˜[FC9--1+0.2((2<<0)FЄЅžЋДЗЦЦЧФКБЋЉЌЌЉЈЌБЕЕ€ўЗСУИœЊЇЋЉЌАЌжЈv”ЂЈЖУЎ`11,)*%(,*234591$EЈ™БЖОРРЛМРИЎЌЌЋЇЈЏЗИМЛЖДЖИВЋЇЊЋЏЉЂžЌž—ЂЄЁŒt;%7,0.1(),4902.*;žКЂЄЈЕЦКРУФЧЖЄЇЇЅЇЅЉБДЕАЎЏВБЋЇЇЋЎЈЂ™–™˜ž›™Ђ’T92<532$)*GS9178EBIŸœЃМЖМСУЩЪЭгҘ}œžЄЋЇАЋЎЎВБАБЋЅЊЄЊЅЁЃЈЃ›••—КМ{48815<@ŽЖ›ЁЅЈЦНОРТЫмРЋДЋЈЉЉЎААЌЎЊЉЌЋЏЏЎЃœŸЂЃ˜˜•–˜ИСˆI,,.*(&$&&)1((*8G‚АЌЄЉЅбЩЦЛНМлОœЋБВБЉŸЅЇБЏЋЈЈЋЈЊЌЊЁ˜›ЃЈЁ™˜•—ŸН„EB$,24,-@10.23?<8kЄЏЋАЎ€DМЌ•ДЫУРД‚‰ˆ~‡Œ˜žЂ’„}vtvwwˆ‰‚‚[,.>?,-7757.ABE@;)5$)*%##&9++9ALB@Oqƒ‡‹‰ŒЅЇЂЃЅЄЁЈЇ‚}„‰ŽŽ•˜zu{||x|vx~‰››ŸЉ‘jPMOG@$*720$27BLGJGS‡pƒ‰Š”––•ž™—Ž”œ–”‹Œ…–œ–ŒŠƒmgnnqpntpuq”ЅœnA9F?(10$74"3<:HGUNawoz}}…œ˜’’‹‹‰‡{„‹Œ…‰‘™™‘‡~}{uuv{{|ƒ—œž‡n‡ˆb<3783$.45$,82:-9V[i~‹‘…x|Š…ŽˆŠ‹Š‰ˆ…ˆ{}zƒ˜—‘Œ„z|tnjirƒˆ’œŽˆˆ{hYE3(++3)+0))?7(.,45+-2,.<95GAVOTep{zx{}|~|‡ˆ~ƒ‡‰‡‚ˆƒ}wz}{eddondeoƒ‰ˆŒ‹•œZ9557,+(&.38419GI5Aq‡„”ОЂ}zzu‡ˆˆ‚ƒ„ŽŽŒƒ|wurqnir„|vt‘Œ…z|}‡ЉWGV@;3-)50.8-):G(7ht\aoj”Œ}}|~~€М‹˜Ž‡{~}x||„މz{uutrox{~x}~jQ<0093)*$17<10;::28\paiqt‘ˆ{…ˆ’Ž–˜‡…ƒ}‚vvmkt~‚ƒzzxtpeovqr{‡™ЛЂxYNF9*)2>..0:937@;?Nd]cv|•Ž~‚…ŽŠ••‰ƒ‡‹…’vwvux~{zuukertrejm™ЧЋ{SP<"*%3<-.29@JB@IT\knmnwމŒ’‘”’›—”‰ŠˆŒ‘ЈЁŒ‚~uwrqmomotu|pw‡„œКQ,9>3+7>>74,@GJE1Bp–ЉŒr{„…‚ŠŒЂЄЃЃ”ŒˆŽˆ”Š‡zxunmihcbjopqgcGZ’С›^FE48:?4:4.7?FEC1@Svzgu~ƒŒ}{x~…Ž•˜ž–‘Š‚„‚~{|}xoiiteZZkvvnndrЇрБaA8*:-4)(3@?AF@?:9@h{tw‚”އ‚wƒ‰Ž‰Ž–”ˆˆ}~}…~}|rtzM)3Pejnukx›СЉtNTC?70!3+9AIB944@Jh„}pqЃЌŸ‘–ސ™––”•ŽŒ||zzuxthi`eM?QOWixvnTxЇb?@B@?:0(13Q>)1FPMezuvvpАДЃ•Ž‹‹’—™™ŠŸž}v}}|Œ‡pYSu…u„~rkn}ЇŒ\@033<7%0*53$ :8E^vwxЂЂ˜‘‰‹‰’˜ЇЊЃ–™œЄЂ—‰|qv}‰‹xh`\gtmhgkwЋ›eF9J;25*2)9-!"*ACYŒ”‚{zwЄЇ”‰Œ„„ŠЂЏЌž›‰~„{w|v{wpe]g`otkht|{‘h99@8-.)117-8,4><B>?77858;3%-C5QЅЗtu|‡||uq}…Š”’˜–œ›•wtwt~ur{vjepjjrpz}pgi\C9?C<++47B@7018@-GˆЇ”qmg•Ž‰ƒƒ‰•Œ•™˜•žЂЁ‘ЄДЁ‡x~uh``ZS2Ikuuwo…}Z;!8!#)#&)1+L3,,-3)%!!%CAN|‰‚|~|‹‹…ƒ~xŒŠviƒЁЂŽƒƒ€Ьx„‡–mPPUchcpw‚‡Ј‘USY5"+507GLF\‰„npz’ŽˆŒx‰•Žqv‹„…Љxƒ~}w‡‰n[QUSiuur‚tЂ’e^g:+0!3;$)2.(3ФБ‚{rp–•‘„{r‚ƒ~x{}„‚Œƒ‚vQFdjmpqkhopqt”•^7>?AC7V~‹…‡‘‹ƒ‚zw|{x‰…~}ƒˆ‡z|u|‰‡tqurkmjjoo€zv˜WGbcB1(047)&3>458Lއij{{–‘‹wx‚‚Š‚‡x{xzzuz}‚‡…ƒxrb[Y]jtt{–aZ\h[2))(8:I8>%FGmЇŒorx„’…|~ƒˆŽ˜œ‡|rvztw~ƒ‡„‚ƒzvmcekmtw{{rJ4FJ&+:+,")%.,3@SMTd‡„zrƒžЄЇœƒzxr{„Œ‹ƒu‚~obux{}trw|~ugkprvur‚kP^YTTL0104:4@FJJHcŠЊБcužŸЄЂwowuhe~›Ё‹wwƒpwuw}}oiihbejgv{wkzn\EPNOJG0.!!38;95H>P„ЁИœqv—Œ{{h\min{{‰ˆ‚w‡‹‰…ƒ‚А„nenkbV]c{}zvhS9TSPUC-$2!491;N>^’ЗЧЃ’‘–Œ‚}‚xp„ˆ„‡vqt|kdkmiidu{u˜~M@gkM2*.#39BGC&J—ЂЁ—Ѓ‰’˜–gq{wmxv{v|‚~zz|ƒzxw{prpiakr}t`œ‘V-9*+!!,+"-JE@*<[vqpŸЕ„Œ‹”‘…zw}}put„…‰…ƒzzqqhrƒ‰ˆ{xrhhvzvvoU5@œ’tt…‹Ÿ—ЁЁ“ТЇ}Z`nvvujz„zzƒ|vvzx{xnejpvdI[WSktY+.;:MTPNPPNVt‡„a]^db`ZWZYWTTYW\PBUmti]^\\`juv{vcQNJSjoauz|{rnkZV^YWU\UMUUQ:`ˆ’tkkea]^TTUQQYemiTPOqqmO%MZkdjijxvztFN[quxw|vkhjeYMCPOJLQUUSNVotjnmeceh`WTJ;EL`^caZCwˆЂ~j]mqd]]drwu[:Sp|nxw{‚d]dee[UTN>FMI;M[\aeehhbaii^ZPQJJUYUSOTVbh]^`kvnhcdemr`PY\k{‚{ƒŒ‘oPO\ieWW`^WNMOY^bc`]b^]^cddП[F8*>O`^OGJQY\dhkhnnroecbWSMp}ƒqw|xbVccjh^Wah^PJHGSW`aYTNOQ`ebZWW€NOO]\NHEILW^\PYev}te]`\WG[xŠ~w|va]YaeaPMV[YTMOJIIGFPUZ`con`VWTJHGBOZ[TLNPU``\agpw{iNBGTW`p{gVr‚}dhimh]PVamz~wpP?>[ULOOPUNFAS[b]Wx{‘—’”‰pae``TF@FLI<15Ywrebcgn‡xqib^bd^dopnƒt^E FLNLSMCISVZ`mdYpqnzvp›…mpeWVU[UUJBOd``VSPVchmtqnhjnigdZUhuihZBYPIQ[ei]VUa\YOHco}}xk`dngaa[QPSYWE3-;^p`\Y\`iqokgcig`SOT]dmtdWULV[Z`aQQYYTOJp‰–‹ž…]U‚‰{cZZMBLNSNH5Or}okdhhjpiehhjqvng`agt{ƒ[2FGEQdb^aZHIMQSYgiv—ЇŠ[^”’Ѓ{[q‚tLNLMTO[vjiikowvnd^gpomvru„~hnto\LSN5JY]SgrhSTkrkci`n‚iTIZ}vnormLOSSUM$Ypo}ˆŽˆmhd]`cemmq…|{rePHJGN^^AWƒ„]TWbeheq}„’Šimvuw‚…ŒmONF7;?O[gbr‚xqbb\WVWY[kpwc`jgVI4GC;(AE44&4M]`de\d|ƒ„|xpgb]wtuq}|Y!?Qjo[q~~pjkm^YQSSTaommigTGHLSMB30BSVOBHSTSimp…‰Ž~i\VTZ\\j~ŠW1A>EVkxootwrmmia]huqhoxnnhedOIQPLC)@MjjaP:CMV]L\iv…ЇzhVIU[Z]eteTB:ATbmqkmkjpniagrqed\bdU?WjYA9MG,$PWUUVTZikcabhpxhbW[aTiwrjv˜ЎM@G<20E`c`MMG"”‰Š’’upjitx{odd<7OPQcbQSLHckh`agjnopYHT\\^qxni…—‚cLUWYLZ^[\W\]\…‰…Œ…‚ƒ’‡ƒ„k]IMMF0?HNUQAGLdejdcjhhdgciiYWdr~wiLBITbZN4CUY[acc€Ў[ur}‡…‰{}‡–^Vvˆ‰`GQSAFGUieeceheheebppqiiha`mn\QOQOPSB%AL\dk`Qdt|…ŠŠˆ…}|xpre`[ZVV`^cbZOWuudgomj`egopqr]Y^a\VYPGAOSM9@Sng^^]Orqu{ˆˆŠŒŽŽ…‡ke^]J;4M\`V]dr{~m[diieaZVWb`OWcc€gjZPNCFBFQTgJ*2IdTYoz‚…zƒ‡‹ˆƒpcbjiO9;LeiVOUaj^aogmndbcYbggqm^ZY]egmeL4LH5MQNIB;EQpddmi\]…”’Ž”|qd^]> )<‘etpdwhdx‚‡˜”„q`^UQitd][LIz‡}}wmgbkr‡cIVcqqmmpvke^WivzS`}~P *ƒ‚ƒ|Šo^Ez}nw‚Ž’ƒ~uj‹vehh^OVdgŒ•„qtocW^d\[U^g‚ˆ}hinu~rwŒ|]12|…‰…’N5`‰‚„‡}beereSWPN@Az‹|wup„„zp{ogea`\mj„‘wtxkarucjS<3"$…}ƒ•™r|™Œ{pz‡Šqmeimb`dgYPPchggdnt}xxЂ•bHOQQ<:[dnggng‚wkL3 ’‹ƒ|Š…qgt{v{‚geLZY[]dx],!.V^`kqnttrqw}g-L\aecb]mvmju‡ˆeE3F#•ug|›Ž|minprwƒЃЇŽJ^dSQLQ@Hz|c`[]ijv{vƒuPTahg`^^d`nokhG%9>  …taitmiumjw~{…dVBFUWYTY`c`\`kmpoc`gnw}vw`^SZ]\V[LY[`d*Cށ{uqx™—…}trw„‰jL;W]bZLPTT+7?РОЛКРСЖАЋЌАЎБКИЌЇ…Ÿ›ЃНЇxb~ŸŸЃ€ŸЅЌВБЎБВЇt‘œ›™—•œЃЇВРЛ‹jJTA22ЮЏЄЏгДЈЃЄЌВБЕМжеС‹˜˜™Ž`[ˆИЗЂžЃЊЌЏЏЎА™˜››™——’—ЈЉЂ—bA[`H4+98ЛЋЈЋББЇžЇВЗИОСЈ‘‡Ѓœ’•˜Њœ—ЈЌЈЉЅЂЁЅЎААЏВЃ”’’—˜–‘’~IA2&;V,.20ДЎЎЏВбШРНЕЖЖИУКЅ‰~ЅЁ˜—•–•™™žЂЊЎЋЋДВЗБЌЎЄ…‘’œžЊ˜Џ—dQE+:;3™ŽŽ™‘u„‰Š{qS]hkgq‡mB8Eejg{x„Œ‰‰Œ|Gbmrwvmcrzr‡’˜nYETB)4Ё{xŠЌ˜‚|v{ˆ‹Œ”ДЎžYnrg^[bS-,]‰‰nocnr}ƒ„‚`\gjmimokhvx}Z?TM;..42›zpˆ‡}vr}Š‘•wePLevncakrhgrww~|njqƒŠ‚‡ub\ecc]]^iemnA0$3W,%**ˆƒƒЋЄ›‚ˆ‡Ё•z`N]rqia]\bggmvv{z|‡‡‹|‹VVagx{q‚nJB9.289EG@.!{ˆŽ˜™Ѓœ”|z‰—КИЇ”q{xoeaY[guicu~~}wwˆˆwwƒY\mt…r>!,33(&#)p’—•–•—–‰‡•ЁЌЎЋŒxtwt‹zhmopedht…‰‡{ƒŠ‰ibg‡žŽw% $"$$.5..5‰ƒ‹™™˜›Ÿ›’™ЁЈЃˆag`‰„xo{|uЌ——ˆ…ˆ„‹ŒˆЁƒeMU`E$&&,591,!"џ€ІwoaWdtrngchvƒW4<)$$&7?-"%-234@G8Ic‚’„…vztrtzuqw{tt|nT^tthow…Š„njjg]ahrqpmn…^79?0)#49(%7.,0@>3+AYqbotz{wuxtugmotpojiioqoopt{}}zokcdbijdZ\W]‰x?*2933(*%0399A@3A`|•xnnЭx…~vjjz‚qmnu‚xttqv}}vjnruuwobvq\b`1$(,$.-,55€R)Cv–xj[‡–—…~tz„Š‚uorƒ…zxvjdr~}vomvz„„‚}{qxx[ *.)--1"0-*+%+H\tukn••‹~ˆ‘}|wxz~„}~vmuƒ…mjmnu|{naWbmbE")31"#%&$0)750!%@kocc`[r„…{uruz}~wwqpqtpehqw‚tagbeo}}~\QO]a@177.)"(54]J;$1AhŸ…|xqzunpxttxwuzqktpxwxrd^gvqug[bpmbU\cL?SNB434&-2+!!7EeЄ—~|qgemv‚„vmorv~}wr{„ƒ‚„žuvxiig\\deiM)LI!+*%$&.50*G`|‚ƒwogcjotkhekqw~…{wvƒ„toadjhjiaVbheMLeW735.3%$#45,%"8P`ou‡’‰z{}‚}rp{ƒ„‚}voiigihdix{mdaWVVSTU`O,-.#&#&5>@BG@Hr„eVdƒ‡vhtutmu}Љ‚‡‹…|ukjhjw‚{rvtmhZT`r{vwiW2 ! !%ETFHE)CZtruˆŒ…~tvtpruvwuu{xpx…|xvwj[euzzvuvz|zwzz|]!%+"%%08811Zurrpˆ‹™‘{wtr}|xpjot}|‚vbmnaxzƒ||{wzzqb~w8""0&)!$7;AC;OhjdtˆŠŠŒkdk‹‡‰jit„‚…‹‹‡wvawvx~|i`e~…ziYS?,))1#5>:(9`dhnmzƒŠ|qkvŽ‘‹|upz{z~}…އ|t^nw~‚pc``m„wcemO*7) (3<1;<@Vwvz}{ƒƒ|{ƒ…Š|eYiopr{Љƒ„}watv„|\b^agdkd`rZ#0:4&.;@737)Oƒ’Ž}zz}}‰™’‹nQZkhdk}‚xqx||[aa„‘e\TQVZV^n}^(%87*!!%&:E;,Ir|x{Œ}rkr–Ž‰rottnqtomvz|\`akoqcrhb`b`UZkZ0"!*!*3-*("3;3*:n}v}}xpd˜ž›•›„tvvtrqojdcrxo‰‹x{ƒr\]]BJnt:*%&",&$)++-9v‹|{vx‰’›ˆu{zttv}~wc]Tq‹…„ƒwieu|rkoWMON,#+0>92$%.:1,+*?^{‰‰ˆ|rt‰’gZw…~t~Œ‚xpomvagjoxwx}„ŽŽ’~w~xnL"("$%(!",)9p‘‘‰vx‚}|iYc…ƒ„|nnq{~{tuz\cbkqv~|vu}|}…z[-"&)$,%)+$dЇЧАz}‚Šˆtehd‡œ|puvu‚‰|voU[]Tguz{unnpvnhquC$%#-7(05+)%#Sp}tkYA`”ž}rnhjuw{‚‚{{‡…ƒ{3Nvb^gvvuojdhhmiuh7)31%#$,478,4Lnvv\}ЕЎzioiimv}~~|~~…œЏ™T]g}z{wx{‚rdcc`…o#"BOc‚…‹ИЮЇ‡‚xv}……voqzoUo‰Œ…d]]‡{xz||{|wohpZ1 ")41,$-G@Jq{x~~uv›’nVdbimmwqtpgiu‚…jhhzt‚ŒŒtqpuu}dF!*3;>?8,01ƒ–{qx‹•—‰ƒ‡ƒ~ueo~rmpv|zja]^qoˆ‡Š|wtkru‡‹YF$,793!2 Pƒogx‡‡Œ‹q|ucbcx‚wonjnrvZM?h‹‘wwzqihiqx‰kL "*&*.okmq{ˆ‰{onqptnhe~|xvupnuvn`U]}}|zw|wc[ep|‚qE "!"ZrZZgnoƒˆ‚~ov~|woz{z‚~nktUZ?bˆ„tnt‚~pdjpmci\! &! <3a”`dmŠ™–„reqvgdi‚Œ…ƒƒ}Y`^eƒ|{z|zqmjggop‹‘h: &%,5("5)?m~jehq}‚~pmx}ngemz‰ˆŠ‰‡~GMZ[emxzr`YV`dhkjx‚`,!(228 +?<0511&%,(3Y~‡ˆ|tnornYU[Yew„–Љ‘Љnc]QJPMM€VdouztpnmicivU-,(2(%%*%>[”Ї„uvxuj[WZh}qmˆž–ŠqQ]][WVQM1[”|umqxxrjkxQ $4NJH2&!#0@ƒЂzoUQmzqtcMr•tMwЉЛЂ‚~jq`Z][ZPUŠ—‚{vmiqjmv`@4#0-0&9JPiŽ~uZ]xЁЏЄ„cL|Е|)TŒžВ–anhZOOIL:Zgnornuzp{•pM%!&&"4"#%17Ggn`YJHbmgu{n‰Ÿ{TgƒuN( `ec^]VLGHn‹zxvu~…‡~YJ; ("-#  )2,%,CV-(GYC1&N\SL^]^^Pjrx}zrm‘”ƒŒm)   1&"&"5*LQ%"(VVIISa`^YkwrqwŒ‹vaZ[m\+У   ;22&!#,0"("*!bcW;E\[JLnvmoh[^`OA0ћ  +F$)&*  FYOHLUH>CLWTFdxtpAJV5-"* &$7Yr\JPQO9Zb[L!$7"  Э     a‰p\VTPLJ@-)#202-ћЮ  SpvoY94G0@<$, ўўж    4P\<*) 00.)њ х      А       * #  +"§  г%! "I" ш !&#ь  #ц     ѕ   ј#є ю &  ъ  ї ы%$!  ќ ђ(у  ;  *%++ы  -#э   *2%њё .-*  щ2& E2SL>ъ  0$84*!с #%AW:$ PI4 %0ЯНЛВЌЌВКДДЏЌЖИrCBHB?EAHOOAGdŽЌЅВИЛЛіКЗКЕДАЗИИЕЕіКЛЗЖКСУМЕДД€МЌАБАЏЊŸЃШQ7MFCC?A>?AE@GNMBWxЊгЪИИЖКОУФСМЗЛНРЛЗБВЛСРМДЏАЕЛТОВБЗЛОМЗЎНЏ–ЅМŒI89,?AA44;C?ABBJMNLAEdŸЕЉЏА™НСУСКИКНРТРНМЗКИИЛМЖААЖСЛЇЋЈЎИИЖРЇ‘ŽЁ—c>@MIL;7447;>BuWO@?`ЅжуЦТМНКЛИЕДИКЗЕЖДЖИЕЖЗРРЗБЃЏШБАЌЇЉЌЋЈЊЅЅŠxpWJGCFAA>918&*470:Ld™ЪлгТМЛДАВЗМОМАЎБЖЛСФТОЛРУТФТйЕМДБАЌЃžЅЉЏŠn‡o<2CBC::85,?@C<77.9MzЄКРОРМЏЌАЖКИБЈЉЏЗНТЧЦРКЛТСМЌЌКЊЋЎЎЏЉЇЉЌЎ’Ћ‰O9FCHEC:59AGI?3<4ASƒЃЎДОТТОИНОРРЛИИЖДКТЧЦУМЖААЏЏЖЊЎЏВБЌЈЈЂрŸЃЎŒ[;C>E;374;ABGLUVN]ŠДЅ”ЄТЧОЎЕЕ•ИНУЦУТРФЪЩЦТЛЗАЏВИСЖЗЕЕДЋЉЄЇЇЉЏОЋŽW41<95139:>:9:539<5AGLJO}ЌЕЎЌЦЩЩйЯКААЗИККАЏАКОСОНИДЉЕВЇККЗЕДЖКМКИЕЎОЪЂT0AA<;94198:NLJIS[АМИИ‘КЛЗИСЩФСЌЎВВИОФЩШТФУФЄЏЊЖНЛ™ЂЇЅЅЈЋЋЊБ‚92LMJA8554,BMOMOLCdБгЩМЛКЛИИЛЦЪЧСЉŠ•ЇЉЎАЖИЖЗМРТЈЊЅЕЛЩЄЄЁЂЂЄЄДН?2HFF@7;;€€:B@GMTVB\—КМНТМЛВБЋЩЭЮклФЏЏБВВБВЏЌБЛТЅЅЂБЖАЈЎАЊЋЋЄЂЃВG2E:??8A@?FGJEP–СМОСЛДЖИЛЩжЯЧРИМОРММЛЗАЌЅ”ИУЛМЛНЗЕЗММБЇЋœ””Ž`:799>FE@?;>?9>9FnžЛИЕ„ŸЭлНЉЉхЅЏЕККЕЖИКОФУСʘ•ЕЈЋВЕККЗДБЎЎзКОž[-.25;?A>><<@BCA;9OnЇТЛБЋсхКЈЎАЋБЛМКЗЗэКУечЩ’ЂЈНИЖЗИОРМДЌЋЋ€ О™V*5:3-5107;9;;>?4Zj~ВЮРРИОнђнЧСЗЖИОКБЎБЌЋ™ЎЧЦШЁЃžЭУСЛЛТЦФНЗЖЏЇВ•[-0<997755<@GGFEB\VgЊЛЗМОЎАеЯЋ–ЌЉЊВЗВЏЈЄАУТНЎЋЎДИУЦЪЦКЕВЖЕЖЖМr<+7?<:42:BCLNMIJJ8HЌЯЖВДЧЧШЧНФКЖЕАЌАИЗЎЃЄЏЖИЛŸЂБЛФЦТИЗВВЗЗЖММ—wO0:4912.7<>ECB?FF;(wЛЅЈЏНТЧСИИЖЕАЊЃЉДКЛЕЎЈЎВЗ››…ЃУШМИЖЕБЎЌЏААТЅ„G%73,00 43:@<::?@BHM77;>JBVœНЋЋЈАРР€мКДЕЖЗЗААЗОСЦТОНЗŒ”ЅЈБИОРЛЅ˜•ЂЅЈЇЉВСŸV.1:?FMLAFV”ерНЛДВЕЖВЎЊЌЌЃЇФИЗВЋ•u}ŸŸЂЄЄЁ™›ŸЃЁЁ€„ЃЇЋЖУ™O9LIHCIFA>;?>9245899>YƒЄЋЌЊЎДЖЖВБЌЉЄЄФФВЛЧЃž’Ї”˜—–˜›žЁЄЉЅЁЅЈЎЋЊЋЦБg9!FLI@(899;?>H{ОкНКЕВЏАЌЈЂŸЇЛЋЃОжЩЪЈ„ЃЄž›ž™„ЁЪбЗАЊЋЏВЎЇЊАE%;8::BUQOF98;ЄЉЉЂЁ˜˜‘БЪЕЕЏАДМНЗŽxJ*+?;3#$>—›–‘™ŸЄœŸЉВДВЕЪЧБ—‹ŽŸS #%%#&""%PAEE<44.;GC>::,5I1199?ЂЃ—’™ž›œЁЉЋЂž•—•vcLQC-."($!%&3V ,%?8--&9>EC;::743(boc\™›–ˆˆ’˜™‰ЄЖЏwz~]B52-(31-# -! *01.+.9;@;899:9:EM>0.™Б—a…‹Œ~…”}d:?@7(4BP855" +)%&$))+*,+4**02%03*%!+"+ЦБ—‘‹‚ureQEB@:?BBFOGE9>*!%%  ,+.2.-)%""2)&$%"$&.›АЕŸˆhN\bNHYT8EI-)"$&+%# #()!&(17.&(2)&(&&%3SC;4()4+.54.)"+&!$+(*.7* !!&.2.30087#)320-&*2909,03-*(072.+2)1,.425@&  ! !*3442187-.18820,288@,(117*,-.4-)$%2055;WE3  (.*!#.-*0727890..+(#%).#+(2-&)-*%.,.2)5:3)    (+0)##1,&%28424,421$$!%%€П-34.20-1.38*-7580.     %!#+,0-&*.0029730.("()$(+4214*-1(2.+345>2,7,3! #43514+),,33+7;;>:$#&("%13411&!*3,1-)807?:;337   8B2+)#&&4;>9:<+,$   )#((1217;)$JFF*&!#)*!(-.)&"%5-,+2>?EC;24    #);+5@5,?WJ(CH>?:FCOSVL@?Nvƒuv{qŠœ—‚„…—›•Ž…Œ‚…ƒƒ|{„‘‚ruxv~ŒŽŒxb^r{S?FPJIA7<7@EELqaV>HMC8.-9AC<>AHLQYZ[P]‡–{ju™œ‡zˆ‚…—›•—œ™˜”’‰~|w{…‘ˆƒƒ‚|{hmo{‚‚…gF1-<>@49>@CFLYmY]Oa„‘„’КВВˆ}‚ƒŽŒˆ‚ЄœŽŠˆ„‚Œ˜woi}z{pwx{ztŒ”ŽqGCG?E?;492:9AJINIUUCQo„ˆ™Ё˜Š‹„ˆ{ƒƒˆ‹…ƒŠ…ƒ‹•‰}‡ƒqv‰‡„„‰‹‹ˆ‡‘’t:%0?IG;>@A:EGPOW\Z^{xp|™›Ÿ›xv{‰•™x|‰”–’•Ё˜‰Žvˆ~ސwr‹”ŠqkaS45AGICB7570314IZTGUqxz~|‰’—ˆƒ‚ƒŸ™˜ƒˆŽŒ‘˜–‘Œn{„‹‰qquŽv{~c85JNJ-8:;B@@UNVLUVj…Š‰ŽŠŒŽ‰Œ•›œŒuiw„ˆ‰Žœ™”œ—‘Žt~~Œ‹nreqqzutwc14LQPCB<>:7IUUPJI?VŒЅŒˆ’’ŒœЃЄ˜–x]i{roz‹‘Š…‹’jpq”ЁЃroo€OijjrŽn>1FTJCM8>?E7ECNY]E`Ž’—ž…}ЄЁЁЕБ–z…ƒ~‚‚}……Žiqm‚~q}xuqqmkdwiC,CBBEFACGFHHALQS>Hz‹Ž‘Ž‹‹‚|zЉЎЇЄЈ‘„‡Ž„…~w}}…{œ•ˆ‹ŽŠ–—‡jngb\‚~P0+C;@GFJHPCHEJGLCMЁŒ’‘ŽŠŽ•”™ЈЅž‹ˆ‡ˆ‡‡ˆ’ŒƒrngŒ–˜••˜Œ~„Œ‚xweY]WG89BGGPVQHAGLLMEMBTj‰ЂЁ™ŽŠ•›ЈЃr^~‰–„}‡™—Ž}v”uz|‚…Œƒ…ŒžЈ‰ŠŽ…vZ8.@;FLLF9<4@9B@J>+CЅЃ–‘ƒ…Œƒ~eu’””Ё~‰‘—‹‰‡Œjux|‡Œ‹‰„ƒ‹Š‡‰Š…iI.8:?@?CB?@?E8;C:>oЗЭРž‰…’•roz›Ї–‘…ƒ„…Œ˜‰‚bkpiv‡‡Šƒ~|„ƒu‚P78@A487+3;>:?>;>FG9Ycv™ŽœЧуР—ˆ‰Š”ƒ|{ˆwe~›moh˜ŽŽ…ŒŽ‹ŠŠ‘rvdA(18:<-07JAMILHL@\PV‚‹…’…ˆЎЊ‚guqwƒ‰‡…~}tt•——{|„œЂ‘}{ˆƒŒrP+*@3@;<:EJQH\VTNC0E•Ї…}ƒ˜ЊА•›‘‹‚u}Ž‚z{‚މƒpnk‚„™œ”‰„ƒ~ƒ™—eO:+,0)495CBQPWHNEM7#\™|r…––ŸžŽ’‚qnuˆ”Œ|ƒ…„e]Vw–ž‹…‡‰‚zx}|ŠЁZ).-.-1:33ACIGC?J@H}Ё‰tx‰––ˆ~…~{~‹ƒƒ}~{‡ƒ~neqŠˆ‰„‚{vnz|P"5:233€еA7<.E>HMNB;A?JCP~Žxw}ˆ––•Ž…‚ŠŽ„‚„’›žž–ŒYdkqx‚ŠŽˆ}iahp{xuŠ‘r<)#3FFPLS3ICC€ІLrЎЕ‡‡ƒ‡~unpwxz—ВЃŸ^hmnjkdWPe™Ѕ‰‚~{‰Šoxe2(;<97EEGHQ?:;@;>Obb~ž‡kmŒБЪʘtU‡Ф‡:cœžДТЇp}nmc``cNjvzz€Иƒ‚ˆŸ}\@.?BE::E@)>AH:?7A79(*!0IEEC5:G<4QeIAa`ZF72@?E^ghdnqoi]z…ŠŽ…„qœЈ””wA%&,4&+*2,0--2+(&24GC05:H4?M2%:erI2A@BagdZanpp€}„‹ž›nai}jC(,"+$$-90&-!*NGIH:10,ANH>::)-@)*8??rvhYUppcb{ƒzqxmvu^P7A< .83"".,88d)#)3:37112;EE?;152$*]uje^g[UP[bh[zŒƒ}[^oP43)"F38$% &0.,$$%3;,1.;9>>8@;>,8F2%c‚k5U]\bMmwh\;3>2"!BQ:5$%A8%%! !&)21.$((,04)855",2*!"#i{gejc`PQ>ACA;?:@ALGC@>+"*&+!#0*!!%1.#*"%!($$!-cz{mN?OZ?7PN:.(),78:$*045&(!(2(95515*(&*+&<9M&  %248771-2912+5,+5*:5@.:)224!$.,4$")"-:4@?LcC0 !"$:131-+32,7?4;4024,,)" $$9!%!1-,-.;.&1& #B?<15.125!28412-.0(%$+1(01$&-00!!.8795.,#    2A70&24:#-2372.,-1.!(+%!(1&)*!9132)95145502!(!*%3:4:0! $ $:SE9,!*93;@>C41   )*.01581,3?9#JJF!)(#",%.+0"0.2+54CB;.2 #  %.33F47A94BdP%2mh\$&&"!+(%++а%+5NHCHA1&*#0 &**&%$F.#;]nL@-3ceI"44Gџ€p‡ЅДЋЄzwr}”‰}„„‘ˆŠŒvundYvЌЈ—–ЉЂ”…~ŒМе‘G5&CJNC7BB@(.)?Чљљn„ЄЇЅ–Šz~…Š…~{|}‚~vt–ƒ}wqemއ…Ђ–…ˆЛюїЉWS[`VSI?8A@BBCIT;@‹ћ§cxŸРСЈˆ”‰„‡…}zvmibmz|}‰ŽЋДЅ|ip‚މ‡‘ЈМТДweB*CFCC:>??>>LWN;u‚‡ЈЊЃžЂŸ›•ŽŽ‹‰–Žˆƒƒ‚}‚|Œ‡Š…~•ˆ‹•ŸœЇЩР”m`iqc\OVI*,%UZAƒx”œЁŸœ”—™‘‰Š‰…ˆ‰ˆ‰ƒŒ’Š„‡’|‚wkwŽ—ЁЋРВvMMP1%+7%+N\?ƒtˆ™ЌЎЄЃЂ—Ž~}„…Œ˜œ—’‹Ž‹…~‹–™\hkgn}ЌЎКБ{YH<#%7&#!+4.1:3i{˜’‰ЎЖЗЉ™…riO„‰‹Š~„|Yd‘Љž`horrtv‚ƒЄЏТМ‹iJ<(& )VTbhj~‰ЅЩИЉŸ››–Œnx|„‘Œ{qw}‚Šz\^„‘”ƒ{x…dTo{ЂААДˆTBM9 $$0Etqho‰ЁФМЏ›žЄБЁ}~„„ˆuw~„}odwŽ”ŠŽžУ‘WZqzЃЈЏ˜…^LZJ)$!&L>5~}t{•ЃЏААЌŸЁЏЄxz„ƒ‚‰Œ‘–‘Љ‚p…‰”œ”‹‘—™‰{x…”ЊЊД›]VB"#&$"0`{zu|„„˜ЇЉЌЗТсУ‰n}ƒ‚ƒ‚ˆŒ–’ŽŒŠ”…ƒ‡•ЂЄ–|…}‘žЃ‹H&F,%(!&(F^~‚„~–ЇЁБМТЫЫǘ‰‡uckw}zzx{•™‘Š‹…‡‘”zkp‹™БŸ„I,,  %G|}ugpcdˆЉЋЊЛШаЧ™opzvptvv|„„ƒˆŒ—Œ…‹Ž–ˆ|}‰›ЅЄ—Q,!.014,!<\‡xwvdv…——ЖЫЫФ›‹ƒ}p’Єˆ|x„…ŒŽ‰z~ƒ‹Ž‰ˆ”Ž„…ЅЋh%,55:&&#$?;!+O}}ztxv˜ЃЖЛЖМНМЄœ’•‰˜~…‹—˜‹‚zrzx{tw’ž—ŠrˆЇ^,>N*%*35&+",)-?]HŽˆxwqt‚„”ЉАКЕЌЂ˜”„…ƒ‡Ž‡|wv‚…„Š…~uzuu~ŽœŽЈŠ4-99"+720(("23+#*0–Š…|zv{‘—ЉгЦРТИИН–Œqw|ˆŠ‚‡ƒzx‚Š|vƒŽƒ‚‘jxWCeg^9+)2&(4+,%0.Pwqnqx{ttx‘НЯЗБВСзИЈŽtz}ƒŠŒ‘Ž}mzŽ˜ˆ{w‰ЈАЊvE,;;$A2($!-0,.2,4LIokr‚}~‡‰—ŸЈЊЎРСТЛЉ—ƒxŽ•œœ~rr‰’‹qr~……r\@ "9822,*#"5457+:91cio{}}„}ˆŽ„›ЏЇЏЮЪУМТКЂ‡‹™–cq‹‘‹ˆzƒ„kakZ7%"".3@B2782320+)3<:>Waekr|~x‹‘›Ž›РЯдЩЩМВ‘ˆŠŠmx|~„‹Ž‰•‚je[UM.9>1(9<54)8JLEB?7>@;x{undhu|~xtt~•ЌИНЃeOov}‰vk\A3(0-$"2.!!&,(29dSMOg…O13[ЅКjMC:F;?oee\Ip…„wq„„ˆЇЂ›˜ЎОУ›ndv‡…Z!#%%%.%(<<7@CBBWЇЮз—M;8L@@„zmhr‹Š‘xqqwn…ЖЈ›‚Ќмѓеœx{{rU% 7-("&" ,H052*5SJYpАНФАjBLTI?‰Žn]bxˆ‘jF`oeoЁ™~•ЕЛŸƒ•vV$  &;-#")3Oht„МД‰N->IGx„uhmv}‰uZSZc}›™ЃЂЇЊЂ’ŠzJ! "71*%&!A‡™z{’•‰•hGQ[EgЉ…{z|xwvjgnŠŸЂv{”hM:@:#27;5<2aŸœxvz‚ЎбЃF>LBi~‰ƒxqrorurbSOOZP<+*)78& #%443,8A9.?>`™˜wuv”ЌВd@Q@q||nr•‚oitS,%$5L[F.(00&) ">;HeV5-"!"-JZŠЄ‹…ˆ~hŽУмШb<.pw~Ž‚xN94?<.24*(1+C0$79%#4#&Pƒ}L$%#$3IJwЈЎЈ‡‘—ŽЎпЭЦŠPHpotQ?4#(52*($%   97!"&1GjŒ‹ˆx{‚Ž•‘ЂИУхмŽ>Z5.#,4)!!&(+&"!!€X*(*1!)"^КЏpr|{{}‰ŒŒ—ЇЊЊзЧ`%@4)! *1*4029545*( -!$&75#"$vКqkt~™™Ÿ™Уелк–&4AI"(! #.,9F@?# -H0#*.)?i|poYajt~q’–Ž–ЉЭжшФ$!( ,1" &9-9!%!*"*1GWu|t‚ug]c’ЗаЕž—Ÿ—Еюш#! !#%"&(7&2,&5E;|‘}tv||pm}žИЏ”ˆ•Мюј$*-& "#)(*%!%.;;$"($,+7Qk‡„zu{{€‹ЂФЇž”„’™˜Щю &2.%+12-,4--,+74+GVrˆ„}rkw|vžКЏАЁ•Œ”ЋЋЂЇМш$%$")&&)8;@-5:&&%!^m‹zk`[q}vx{vhei^he|–wbd’™˜ЄН! %+3;@SVnŒrv—œ‹qjh`jpoqz}ˆЌНxOM^Pjwvrr…ˆ”ЏЉЊ&",%# $FSh|{}w]:L‰›ŒnQaW]Va}|‰›g?Aad^rƒ|xzˆƒ’БЇЊ )%-,,847175Acx…{‰ЃЃ‰‚‹}x}rho`Zh|™˜ŒŠ—œ’tzmit…ƒƒx^c‰ЈЈ  &"AUdgqpg`‚—ДДЄЊŸ‡‡ˆ–‹ˆt^`e}{ƒ‡ƒba„’upvtx{wtqq~•ЄŽG+ 8FOeecbe[@Pm–„nt‚Ё™Ÿ”‰ˆ‹„ˆtnwwrmzkkŠ„‚~up‚‡|xxwwŒ™’Œ)!7%(1+Zrnd[~qjbUWeVazp\mkkŒ{vtmpkitumq`[Oez‡|uotˆvqr~‘ˆ‰,07>*@gpuiUdmxuzmTZ`Z]ikmw}‡„„{qmnkettvzqaUPuŒЃ–‰w…’‡toow‚Ё’@3174h{oŠvmZWcrqmoWh‰{}xr{ˆ‘™‰‰‚kezv~}rƒƒa]m›Б—‰z˜—}nwpqjƒ•GoeekƒŒ]ehnca`iivz™И\aho}|{~‡œРؘ|xt‹Œ|ˆ‡‰zvˆŒ‚{‹˜ŸmhajqqŠБИЮцыхмЪНЖЛЦЩЧТТФЩЯаЪФШЪФКНИЕŸМчЮЯЮадЩУЗРсюŸH8,FJOE99@ACHE34*AЮўћЉНпснеУЕУЦЮЮЭФУУ€РТСТНТРТСОЗЄБШЦФЧЭЯЩЦЦчўўЗZSWdUWNEBBFGGHMZ@G‹§ўЃИнїёпСбЫЫЭЭФННЛЖЏБЖРСТТЫцщшТЛЛРФФЦШЭЭЮзтцЪhE.GMHBABFA>IQPNAOжўЛЯщўћыбзЭЦУЧЧУТЦОБЏВЛЛККТЪЮШСНМСЦЦ€ЬЩгббжжмсЁaJ7A@EMHC;5@INOH4LЄўФЧйцшреаЯЧСТСФУФТКЎЎАЦЯЩЮЫЭУЦОЕКРЧЩЦррлкгЧнЖkQ9EFHQME@8:4@@GHCGaa’ЩЦЎЦтыпмйШŸИРНООКЖВЏЎЊЄМЩТСРЏЎНМССдежлрппЧгз‡TPP€ИC@:47(-.<:7$E@CЫЫУШклпсстТИРРЗАЎЏДЗИДЖЛУТМЪЭбЯСЊ™žРажслзУРФ›ga]aLENH@:8:54--F@8ВЕЛФейкллйбЩЦССœ”œЕОСЛИМРЛОЧЯдеСЕБЎЩЭдезаадщз}TMUSC8AEC@MM%F><ЛЧЪрлмйзздЭЪШУййЫЫкаЦТУЦЦРТЧШЭЧУЧУЧЯЦЩЯЫЮбзясЈqauxb[QZP"$""UUFЧЧОЫгдгежгЮЭЭЩЪЮбаЯЯЮШЫЭЫЩЩЫЪЮбеСФОЗЇЛЮЩЪажмшЧxMSN119:%%,L^BЧЦЕЧЭбйннзгЭЧТРТУЦЪаееаЯЪЧФРУЫднРЁЌЊАБЖИЖТзгрЯ‰^I<2+<-%##727<4ЕОгЭДМйрплкгЭУРКЕ”РЭЩЦШЦШЫН”ŸацйОЄАЗИДЏДРМЯгырЅpO>1*#$ )V[ЋВВУЯнѕтпйзеаЪЏЕЗНУТЛЗЛСЦРДАЄЫзбУЛЗЫСЃЏЛМкгмтЋ]II7*%*@FЏВЌВФзщскебечлИОРЦТНЛМООРЩЛЗЌЛЮгЯЭЮЮшЧ–™ЌКаЯйеЗqY^G00MC:ОНРЛйнпррмнпуеДБРУЦУШЪЭЪЪЧСЖЦЭбЯЭЩШЫбаСЕЖЩаЮмруЎ`Y>#"%&>\ТЦУУЭЪгкмтчщўяРЎИОРСУШЪбгеЭЪЭЭЮЪЭЩЧЪЮЯЯйМНРЛЫлжБQ"#.A-&!-(FYФЦТНРКЩкйсуцшюхЭЩЧЖДАЕЖОССОСУЩЫЭЩУСЧЪЫЮаДД€-ОЪшеЋQ(!%$!+OРМЛЗБЃЄТмснцщїђЩЎДИДВИММКЛМЛРФЧФШФЦЮаЫЪЧСЕЖУгеЪЏe:,.01-1,"&CaШФФСМДЄЖОЩЪсхшюбЩаТЗЕШмФРНЛОФЧЦСРНУЩЩТФЧЧФМТле…4&$&775210**EC4OУУРМИКНгзуцсутчлкжЮЩЧЪЭЧФНРУЪЫЩРНРООЛИМРФШУЃЗТg4IT7+.1(-&(#*29]LдЦРКЕИМНОЫжсстрмйЭМФРНСФФМЗОФШЦРЦФУНЛДЖКНЩдОЯЁ<@CIJLIM\J;eНлwVE?B@3ЌЅЁЄŠВОНЖЗЛНИРсзегдсцЪЂЂЖКМНG):E?;;89749?AEBGQUQNVYSmЩїњЇZBAJJ<ЗВЈЂЌЩТШЉЅЈАЇИрЯЫЗгёўјЭБЖБЃr5#<@@9:;:4.*%*MbNMHG?8OvБТкђтЅ]9EOHЗТДАЋЎЖУЎ–ЁЂЄЛаЦдЮаЧОИЊЄ‘^C("--5-(.48879AJQJJBWL…бзИЖКЦпѕОSEJAЉУККДЏЋЌБИБœmhupM@<8A@?2*$*3:9;:;C+0MI5EG^ТтаЦаЪЖЇЫёњдg>-ЃЏЕЦКЂx]ITTVVUFBJBPAFBB>8139<>:78;b—ŽT7EA:B?Qcb—йхпЦЧШЫШРнўћюЁZHДЎЁЁ’n\L>G?8HG?989<:8:99;4872*3CJG;1;>?CLZКФССъЦЫЭЮЪзрэўї•BwSUFCV<))<<?€Й@>973?:548A@@:2*$("ET@?AEB99zнхМЛЗОУЦЩЯгейппѕаg7FYB9IF<88>:4>7:?BB?BIHIG>5379?PF>?ACHHB>9:1),384::>B;?JSQ[>73-9P]MLGABEH8JI\žУЖŘЌВКОИаегдльяўЦA1;>3055€О144%()4408A@:;OFNF98.2&:@FA9@8@H`|ЋОМЦИЌЋЉУкэўмжЮбЩхўђ<98-..31+195!%+1583??4877::>EF:3HU@><94OMN’ФЦОННИЖБЕЦйрйЮЕЩТЪпўў:75..4::>A9<<:;;>ACOPOIC873GHFe•ЦЧИЛКЛРбдньнйЪЩЭржашў12-(4@@€Л>?<;403378;CLGBEFG@BLHGH@<)3S]t˜РУСЛИЗМЦещхрпЯЫЭдзкгчў*+10371159>FIC?>><;?GENHMNQNEBBAHCBA.CTŒЛСОЩФТНИЛЉОаЩЩЦУЕЫынллжь*282253248:>;>799@B?F0&>:553;99>C:;8>BHNG@@EnT>MTYr~ŠœФычЧОММЗЕАВДмэЯЫЯЦбјтййЫм2<8723.8;?29:??B?A;9>;EFJHFA0BYeŠ—ЅВНЏЂДЪНЦУОЛЖЌЌ–ЂМЫЩЦКРмєэзейя-24950348723559>9>B>B#>GL[C2E`‹ЊИРОСЇЁ–ВНИЛНКЖЈЊЏЊЌЊМаОЉŸЗЮгзалш4272234858740757;EEN<5IUbntœОЏДЯнЪЏЅЈАЖЛКЛЦущБ—ЈЃАЖМЖЗСЫШзцск&,0;<<€љA@@B>527791?:B]|˜ЂЋНОЅwŠЧнЪЈ„›ŸЂ›ЃРТРЧЫдЅ|zЈЎЕИОРООЭЦЩмдб*3848>Pq…‘ЄЊЋЇТйцщдтйЧССЫЮааШКžЉЊЗЛНСЦЈŸРаОМЖВМОМЛККНЧзмЧ538144><)CZHJMPŒЌЇЂЁКАЎЈЂŸЌЁЈСЕЁАЊЎУЧЦТНЗИЕДДБЕЕЋЌЇ—ЇКСЧРМТЪЪЦМКОУЧЯЮJ:LOV]OkЄАЌЉ˜ЄЌБИДЌЈЇЊЊЌЏБЕКИОУСРКЗЕБВДБЗЖВЏЌЇ–ЕдсЯЦУУШЭСЗЕМРФлаPFQT`‘ВЗШЛЌЈЃЂЋЏВЏ›ЈЭЛКБДЖЛСЧЧЩЩРЧШЏЈВКНТРКНФœ•БдмФМКЦЪЭУЎЖЖВЅУбvЂЁ›БЩ٘ЊЌЉЄЁЅЎДБВКРшœЌАВЖЛМОФЧШЮюђзУНСУЩЧУЛТСТНЛФФРСЦЮазАЕДЖЕЖЧЫƒЁЛЭУЖЂ„…’ЄЄ•ސ•œЁЋŸžž–‰Š…{hŒРОЋЈЕЗЇ™ЪуЂSE8SgbWY[WW€Ф[VB>4Pкўў{’ЖМКЏ˜‡˜ŸЅŸ•Ž–‘””’ˆ›ž›’‡ƒu…Ÿ–’—ЄБЄ–œаўўКdaitjjaWVV]ZVZcoQWœўўv‰ЕкжИ–ЉЁ—›’ŽŒ‡|}‚А•Ž™ŸОЫО’…ˆ”›––ЄЁЃžМазУˆuQ@]YWWYTVPWZdj^P^рўŠЃЪьсЫЋЎ™‘”œ—•”˜”‚xƒ‰ˆ‰—›ЈЈ—…Œ—™‘–ЃЋЈЏЗЗаЅpVGQTWacSUWS`ba[ObЖў•ЕбаЦЎЊЅ‰”•‘Ž’”Žxp|—žЅЋЄ•––‡Ž™–˜МНЖРЛЁЩН{[HWZ^]^YNU[ck[TCBbЩ›’–ДжЩРЋЋ˜‰–˜”Œ‡rnvr…˜ž›‘px|„Œ‘‡ЕеЮдЩŸЇВvVhd[VLPNJLSUSWZd|pЂ—–~›МЪЦЛЌ˜w‹‘…ˆ……{wwp‹””–—~{‰‡~”ЉАВНбдШЌЏЩ\cbh[SQOG?AGLHG7UVUЇŸ—˜ИФФООҘ‹•–‡{rv‚‹‹„Š‹‘Š–ЃЊЅ‘xjnŒЁИТНБ‘Њ˜unqraYmZSTOLSLL>YTL……‹ЋБКЗЕКЕЂœ”rdtБЇ„”‘ŒŽœЈЎА‚‚~ŸЎБЕВЏЋЯЭ‹c^iiZLUVTWch?,7\LO‰›™ОСЛАЗДВЇžŸЃЌЌœЁЋЇœ™–—’””œ•˜”’ЈЁЈБЊЏДндЌu„‰z|aua39:1*ekU˜—ŠЅЌЏЌБЎЊЇЊžœŸžœŸœ˜”ŸЁЁ™”™ЊЎЊŒ–ŠˆxŠžЂЂЈИФйСƒ[\YA@GPA1*)(&@gnY˜‘‚—ЈНООЖЕАЊ™‘•˜››žЊДЖЄžžœ——ЁЈЏjvxv‹’ŒЛОЮЧ‡gTJ74E2;.09VHLLG~ЊЅŠ–ОЭЦМЏЉ•—Ž~hЄЁЅЃ—‹”ˆcqЈУБpx„Š”‘АЧлбЄ~^G90500$*-38(Brro}—ŸКмЪМЗВЎЋžz‰•›Ÿ…А•Ÿ‹|rœЅЈ–Ž…œ–q[„ИРУЮhUY?3%2):)23AQ\~|v‚–БгЭНЌЋДФВŒ””’›”‡ˆ‘–‘Ё‘‚wŠžЌЇЂЁВаЇdoŠВДСА›vbnV@+(+1*+ATz””‘‘‰›ЕЕЦЫезйЧЃ™™ƒ|„‰›•”Š‘žЎЄЂŸ™”™ЃЇЅЋ‹…™ЉЪЕ”Y)14.**7&%!$4>c‘ˆ~xw›КУЛгмчсЏ……‰ˆˆŽŒŒŽ”ŒŽЁЂ™––ЇЅЃЂЃ˜ˆ‹›БЗИЉcF;?>?;@2.50-;Op˜ŽŽˆˆz‡–ЊЅЧзкжЋŸЃ’‰ЈИŸ‰Š—•ŸŸ›ŽŽ–Ÿ—ЄЅœ˜ŸНН}7)32:AF7I<:?ZT,Ai‘„‡‰‰‘ЊЎУЩФЪЪЪДЎЅЁЁ›žЃŸ’—–ЄЉ–Œ‹Š‹‚„ЇЄ–œКn@>9C9?:1@ANwdЄœ‡‰‰€‘—ЅДНЦФНЕЋЂŽ•ŒŒ˜Ї›‘Œ‹›‘Ž—އ‹…ŽАЖ™ABSS8FB>><;:>GC5CEЏœ’‹Š‹ŸЉОхйЯбЪЧЭЊЇЂ~Š•˜‘’˜’‰Š™ЁЁ”Ž‹’™•Є‘„Šn]„ƒrJFH<9?388A;JFh‰‡‡ŠŽ‚ƒ‹ЃЪсЧФЦЯэаЕЂ‚Œ——žЃЁŒ‚žЃœŽŠ›КФТВŽU>%:`YBZPJ><;@::1GIba‚{}Œ‘–žЉЖРЗМбебЯИЈ”Ž”ЂЅЏЏЇ‰ƒœЂ‘ˆˆ•›˜‡wS!BOQPIP@;9C?BAEAMLWmv}ˆŽ–—’•ž–ВУЗТукбЮдЮМœЂЈЈŽm{ЂЊЃŸ”Ÿ–}t~nHBFCLQUYONCH?CI?A;FNLj|x}ƒŒ•‹•œЉЌАбзнелЮШЇ˜™z…‰”ЁЄžŸЊ—}tjoiI8MUUVOSVSY[U[QC?E;Q]VYx~„ŠŒ‘•œЊЇx–ШтпйЖЏЇ˜ЁЇАЁ‡Š…Š˜ЄЈƒ{bLVL+HLSVNNPN[\[S5<<;WZYYb‡‡‰‹˜›žžЂžƒЃаэрШДКЁ””ŒŽ…ŒŒ˜ЌЊИ˜…k82FLFISUWUYZU`Z`]M:E5HPTbhƒ‚‹ŒŠ”ЁЃœ™’ЦтеаНŽxƒ•ЁЅ›…Š•›˜Ѓ˜hodAHMSNZ[h\V[QSTTUY?.FFWQ\^a„}xˆŽŽƒЂœЂž—ЅКЫеаВu•ЉБЂœ‘’››‘bJC7LG>4;;AAIFAFEIJ[hhg~˜cBMYYSL…‚‰Š…ˆˆŠ‰•—•’”ЪФЋАТрШ‡q’ŒƒwraE:EHHECH(0::CC@>GYNGQhQLkМа^[PTOP„{rqWˆ–’‚…Š’™ИЗЌЊИЫаЌxx‹’™—o?(7?BFAE@:8??EHIOT[VP[\QmИыщЋcSN^NP’ˆ|z|ŸœЁ…|…|–ШДЊ•ЗыўюЋ‡ˆ‹g2"AA€ЄCEGE872(3McOLL?;Nbag~СЯнЭ~ZigUNЂ~uoŠЉzZk|w}АБЁ‰žУЦБ–ЇАŒg:%5:95<;80.*%+"ETQGC>;:Mn‰™ЗдЫ™cIUYQˆ–„}zŽœƒbcjoВЋВЕНЛБВ›‘‚\8!#1%0884<1<0F>OQHJIE+ZЃЕЄЋЃЈwYjjYzœ™”ŒŒ€mˆŠ‡xqx›БДŸŒ‘ЋЃ|cZVT2#&4484BAG:B<@<GHE1("43A<%.?F10UM3#EFZkžИЏ›œuЂЮюбxPE}‚Ђ”Œ^IITNJNTFELOWIHOMC0#4?MI><5C?F@EFB:;44.$"3ESV@AF@79N]w™œ˜‰‘•ЃЉЋЃЕШз§љЁQkGMA@M:**<1B@EHB:-I@H?>4)-,!IQ9;:4ELAG45rЭЧ……‰ŽŽ€ ™ЅЁЌКЦШэбu3BNE@C;89>$")1279AAEMS\ZY531%%N`EC@A>NL:HHS~–‚ƒktˆ‘‹ЈЌЊЊМмчўЯ;1$<:>A?71@.,+05-47AEE%GULPE;<5$;BE@C9:FGWh…”„•ˆ{qu˜ЎЪцФАЇЕЌЪўњ>5%%18<,0<1:-**4&+;BB?5AB??CPB51AT:.5<8QUQ‹ž’ޅЇ…~‚АЧСЇ•Ё™ЈЫўў:57;.04:H@?J;1101*.5EGI@C>>A>OTSHGA?8:IOJc}œ‹ˆŽ”ЂЅЏгРБЃ•ЅЕБЌдћ#,4)12AIHG3.9.>.4++4:HG:9>>BHNQMGTNJELG@2<;;#;G’’”Є™—•–Šu‹Ё™••‹ЇЭУЕДМп1(%-18A?508B?:?CC<0>B8"HFQPF@JA?8IIB-(HТРЂŸœ”ƒ„‚˜ž‘’žŸРдЩТДДЧ20(%--3>A9,35-53CC2&,?NUNQHENnYABAH\ahe’НЩ–’Œ…}~ˆМйЉЇЉ’ЏткУЎЅЛ978<>3:79;.00&:;?>@3,3CPONJG0L[^jv{…‹„uŽЅ”›Ё’ŽwrgoЃЂ˜•ЮузОБВб12-02827:,;739;82022*0$7:.AL%8OWYekŠŸŠ‹ЋЊЂ…zkq|‰Œ‘œЩг‰bhoiŠˆƒ•›•ВЫРО@-(B?GCB@E:;88208.3>BPd~‚‡’pLVžЖžw`rmjox–БЗ}SOxtt„’‘Š’˜œЃТЖИ27:CC9GGOOEF$37FHNGOo‡žŒœБЕ—•›‰Œƒz‡vqƒ’ЎЎЁЎЎЄŸˆ”}vˆ’‘’”ƒv}ЃЕИ.))035Le{‚wwk—ЅЧЧЖОЗ™””ŸœЈœˆoov‡•œ›xk‘Є•ƒx{‡Š‡Œˆ‡‡‘ЎЖž75.1?5:[G(GZ^‚”{wzvkVe}ЃЏ—ƒ‹’МЕВЂž•Ÿ›ЁˆˆŒ…„–‚v›œ‘Šˆ–œ˜Œ‘ŽŸЈЄЇGA94?NCFH.;Ÿ§§ѓѕѕјїјјїїѕѓєїјїјљљјїњћ§ћјљїїјјћ§њ§§ўўщћўўљњ§?;@AIHIN?Gю§ўєѕїїѓљїїѕјїјћљїјљћћљљћљљћћљљјєљћћјљјљўўћў§§тњ§§ўўSOGMONOP8GOŸљћљїєєѕјјїїјћћїїјћћљїљљћћјњќјљљјјљћљјљћљ§§ыјѕ§WPHITOMM748.+5;;E:9+^ш§јѕїїѕљєѕїѕїјњњјјюїјљїјљљєїѕїјћћњљњ§§ўў§§цњўў§§::85:7<75*7>IBAŽј§њѕїїэјћљ§љњљћљјјїљјљћњ§љљўћљљвјѓјљћ§љљєјћјјњ§>95,)42?A39:BH3FЕћ§љѕєїјјљћљљјљљћюњјјњїјјїљљјћћљћљћ§§гњў?IBBA@<<>3>>GTP@mу§§єѕїљњјјїјњњїѕїјњјјїјњњјјќљ§њљљћјћр§ћ§љї9ABFHAACB9?<@GAJGF;872HAIC<"@GHdЫљљѕѕјшњјјљљћћљљћ§§њљјљјљљћ§§њ§§љ§рњ§љўEA@VcIuэ§ћїњљћћќњїјћћјћљўњ§§љњћў§њњ§§ўњ§§уњ§5EC;48HMJ7IB;;4AHEM7F‹љ§њїјј§єњћћј§њњ§љћћљљ§Чњљњ§ћњ§њ§њљњў§њњ7*!*5:?EA<@>A7;55FE@9ATnЉћћњїјљјїјїћљ§љњ§ўўњћћ§ўўњњўў§§ўўў§ўўз[759:>@4>CJAA?E@AC@88BEMЗљћљњљћљњњљљњњ§њ§§їјћњ§љћљјћћ§јћ§§‹њ§њ§‘bUF><4FIJMHH47A7312!4IHoа§ўјјћћјј§ўћўўњњ§§јљћљљћћєјјњјљљ§ўўњљњ§ДmeH>??FLNPPO;C?ECBCB5Qb\ёћ§њѕїјљ§ћљћћљјћљљћћљ§ўўњ§ўЯћўўт‰G:JNCLSOUJHJHG@?Cuбћљњјјњњјњјјњћљћћњњ§§іљћ§§љњњ§њ§§нє§СdC@WLAAIGMNMG;5@FH<2.We];HУћ§єѕїїјћљњўћўў§ў§љўЯњљ§щљљЇSCMCA@H??CG>B?7?:72(3FH2.xщћїѓїњїљћњјљћњ§ўўљ§ћ§њўњ§§ўзљњўФыјпPM?EBJFIHBCHIB>:7;<>BFQL;‡ѓћўўћљћћ§јљ§§ёљјљћ§њ§ћў§§њњћ§§зжђєАiTO;2F;G;7B?FI>878;58?B>>9:8<>>B72?a\bPSˆјћ§їјјћљјћћ§§њ§Хњ§њ§§ћЫЪЭлююе~LVV`C2,1<883;@;5#.GA5.A>J‘э§§їѓјћљљњњјљљћћљњ§§љћћ§§ћўўЫДТЩЫьыщРmUG,;?C8--#*&$1<8B@AEIBS‰ш§ћїѕїѕїјњћћ§њћњњ§§ћ§§ћўў‘њКЭЦСеюёьНo>@OB8.&+-9;829*8.7;5.JeuК§§њѕїїљїѕѕїїњћ§љћљљћћ§њ§њљћxЋЭУЛТпѓж|EU]M)120?BB;3 #1>;+!Bc;;О§§ћїїѕїјјњћ§Цљјћ§œЏЕЗЋФызYYGB:<9217

& ?d@2LЖћ§њјљљњњљїїјњјћћЬјїјљЃЉЎИМУеёђжЇYEZVF;>8:;,$> &;H:^д§ћ§їјјѕёёіѓєїјљћћљћ§§Чњ§РКЖЛЫЭЮлэљяЃU?<--47FP1   ##9MŒўўќјњњљљўњћћћњ§ћ§њњгћњћњћњ§ћ§§ўћ§ћ§њњљњљњњћњћњћњљњњћћњћњ§ўOPMFbРўўћљњљњљљ§њљњњўљњњћ§ў§ћћ§ѕў§ћ§ћ§ћћњћњњћњићњћњ§ћ§§ћљњњLJ?>Iƒчўњјљњљњњјљљјљљјјњћћ§ћћњњљњњ§ћ§§ўћ§§љћ§ћ§ћ§ћћ§§ћ§§лћTWS>GV–ўў§њњљјњљљјњњћњћњћћ§њћћњњћњљњњћў§ћћ§ћЧљћњћћ§§ўћMONAbchРўўљљњћљњћљљњњљћћњњљњћњћћљљњњ§ћ§ў§ћ§ћ§ћ§ўўх§ћ§ћ§ћ§ћўћћў§§HFMUb\h”ўўћјњњіљњћњљљњњљњњљбћњљњћћў§ўћ§ћ§ћ§ћ§ћ§ћ§ћ§ћ§§ћћ§ћўћћњAEJPabPqЮўўљњњћў§ћћўњћћњїљњњћ§ћњљњњћф§ў§ћ§њћћњ§ћњћњњћњњIOTUWUUqЅўўхњћњљљјјїјљњћћњћ§њњћ§ћљћљњљњњ№ћњћњўћћњљљњњћњ§ћћц§ћ§ћGILU]ka[cОўўљјјїїѕѕјљњњљћњ§њћћњњёљћћњњћћ§ћ§§ћњћњњжћњћћ§ћњћў§5BCGMTd—чўјј§љњљљњћ§њћњњњћњћћњћћўс§ћў§ћњћњћњћњ§ћњљ@7747881?8-SРўўљїјњљњљљњњћћњ§ћњћћіњћћўў§ћ§ћ§§їњћћ§ћ§ћњљљл8.:;22+*1*4*3eдўўјљћњњћњњћћњћћњњћћ§ћ§§ќњћћ§§ќњћћ§§ѕћ§ћ§ћ§њ§ћњћћщ8;IHC@<7;GZVCUЗўўјїјњњћћљњћњћљљњњ§єћњћ§ћ§њљњњћ§§сћ§ў§њ§ћћў§§7?FE<:707@?9;,aђўўјљљјўњљљќњљљњњњћњћњњћћљњл§ћ§ћ§ћ§ў§ћ§§ўў§ћ:83.*8>B?9CEC5HМўўћјјљњњћњћћ§ћћљњћљњњљњњћмњћњћњћњ§ћ§ћ§ћ§§E?BAF?>;9<7?HPUFNA;T—ўў§љјјњњљљћћ§њњћћњљњћћўњ§§ѓћњћ§ћ§ћ§ћ§ў§ћћь<3<@BFLEC@>99>OCG^Жўўјјљњњљћњ§ћћќњћћ§§ўћ§§њћ§ћ§ћ§§ўћ§§лћўћ§ћ§ћ-22AGIPM>::598B475TЖўў§љљњњљјњњћњћ§іў§§ў§§ћ§њ§§ћєљћћ,7<979;@@шHI?2AIJjЮўўјјљњњљњњћћњћћяњ§ћ§ћ§ћ§ћћњћћ§ћ§ћћм§ћ§ћ§ћў§AAB@7;:>;CBGEC>>BUgNzєўўљљћњњ§љћњњћ§ћћ§§ў§§кћ§ћ§ћ§ћ§ћ§ћ;@?::"(537;@??AB;CBBњG?5UЏўўћћљњњћћіњћњћ§§ћ§ћўўђ§ћћ§ћ§ћ§ўўћ§§ўўцћTAG92257AFECG@HYmЈўўќљњћњњћѓ§ћ§ћў§§њћћў§ўўі§ў§§ћў§ўћўўс§a5;5:9;<;BAC<>9::BHFHB@82<:78,:NLpжўўњњ§ўі§ў§§ћ§§ћњћћљњћњњљ§ћћЦў§§ў§ћДihO>:AFE>>AHG?<7SH>uзўўњќљњљњњЧћњњ§§ћ§ћћњ§ћў§§ћ§ћ§ћ§ћўўЩkEEVNC>?BCJJ>:9ANJ>8.SjY7JЪўўљјљљњћ§ўјћ§§ўћ§ћўўњ§ў§ўћўўоЌUIL>ABC@89?A831)AC8.{яўњїљљћћ§ћ§ў§іњ§§ў§§ћ§§ўў§пюљўх„YN:ACFC@EC@FCB>>:;??AJSM>‚ѕўўѓњћњћњњћ§ћ§ћ§ћћЫ§ћў§§ћ§§ћћ§ћ§ћїѓўўЕu]P>8A?05<559??8UJ4@rУўўњљљћћњ§іў§ўћ§ћњ§§ћћнљїяћўўФzY[\M??<799;:959@8119b\\QWўўўћњњјћ§њћћ§ћ§§§ћ§ћћ§§ћ§§дћ§њяшэђ§ѕлNUUe@93+-1..3F?I—ѕўўљњњћћљўњћћєњћ§§ћ§ћћњ§ћўўи§цшыяјєшНo]M>B?873)+$#.,)1A>AACEHYэўўљљўћњњћ§§њ§§Тћ§ћћњ§ўў§ў§чѓяящєєяРp@GVF-..*!$9>722-7035:.-NiuМўў§њљљјљјјљћљћћўњћћвњ§§ћ§ћњЛмячццыѕкw@Q\M-0.7?IJF?%<4$*#CiA;ЛўўљњЕљњњћњћњ§ћ§ћћњњћзншыцщшѕлŽU[IE@>527>]W‚ўўњѕѕѓђѓєїїљљњћњћћўћ§ћкдЯкєјёяююўўщЊraH8?<4* у  423]h@Жўўљєєѕїјљњњћњћћ§њчїњћ§њўњ§ћ§§ў§ў§ў§ў§ў§ўў§ћћяўњ§§ў§ў§§ћ§ћ§ћў§ўў§§ў§ўўэ§ў§§ћў§ў§ўў§њћћ§ћўћћ§ыњ§ћ§ћ§§ўћ§њћћ§ћ§ћ§§ў§§§ў§ўўј§ў§ўћ§§ўўсњћћњћњўћў§ўћ§ћ§ћўћ§ћ§ћћјћћ§ћ§ћ§§јћ§§ў§ў§ўўќ§ў§ўўє§ў§§ўў§ў§ў§ўўєљћљ§њ§ћ§ћ§ћ§§ъћ§њћћўњљљћћўћ§§ўћ§ћ§§ў ўў§ўўј§ў§§ћў§ўўњќўњ§њњћњў§§ћўћћ§ыўћ§ћ§ћўћћњ§§ўћў§ў§ў§ўўќ§ћў§§їў§ўћ§ћ§§ўўѕ§њњћњ§њ§њ§ћћћ§ћ§ћ§§ћэ§ћћ§ћўћ§ў§ў§ў§ў§ў§ўў§ћ§ўў§§љЫўў§њ§њњћћўћ§њћћ§ћ§пўћ§ћћњ§§ў§ў§ўў§ћ§ћ§ћ§§ў§ў§ў§ў§ў§ўўўўўћьњћњћњ§ћ§ћћњћћ§ћ§ћ§ћ§§їўћ§ћ§ў§ћ§§ѕћ§ћ§ћ§ћўћћ§§ќћўћўўўћ§§ѓvжўўњ§њ§њ§ћў§§цћ§§ў§ў§ў§ў§ў§ў§§ћў§ў§ў§ўћ§§єћ§§ўћћ§§ћ§ћ§§їћ§§ћ§§[Ёўўњћњ§ћўћ§ћћр§ћ§ћ§§ў§ў§ў§§ћ§ћў§ўћ§ћ§ћ§§ў§ў§ўћћ§ў§ўў№§ў§§b…уўўњљћњ§њћћўўћћј§њ§§ўћ§ћћ§хў§ћћў§ў§§ћ§ћ§§њњ§ћў§ўћ§ћ§ћ§§ќSrЉўўёњћљ§њњћћ§ў§ў§§ћћўўћћњљњћ§ћ§§ћ§њћ§ћ§ћ§§ћћўћћ§§ћ§с[m‡аўўљћљћњћњћњњљћљ§њћ§§ћў§§ћ§ћћњ§њћ§§ћћ№ўћ§ћ§ћ§ћў§ўћ§ћћ§§§ў§ўўяedZtчўўњљ§њњћўћћњњћт§њ§њ§ћћњћћ§њћћ§ћ§ћ§ћ§§ў§ў§ў§§ўўћ§ўћ§ўўєYghgМўў§ћћњћћїњ§ћ§ћўћ§њњѓћњў§§ћў§ўћ§ћ§§ў§њћ§ћ§§ўўњbjGJœўўўњћћј§ћ§ћ§§ў§§фўњћћ§ћ§§ў§ў§ў§ў§§ћўњў§§ћ§ћ§ћћќњўћ§§јўde`WuЯўўњќћњўњњѕћњћњћћўћ§§ўўяћ§§ў§ў§ў§ў§ўћ§ћўћћ§мћ§§ў§ў§ўћў^aQN\›юўўћњўћўњњљ§њњћ§њўћ§§ѕћ§ћўћўћўћў§§ћў§ў§ўўш§ў§ў§ў§§ћў§ў§ў§§gkeOVmЅўўћљњљћњњѕ§ћ§ћ§ћў§§ћ§§щћ§ћўњћ§§ћ§ћ§ћў§ў§ў§§ћўћћ§§ў§ўўѓheaSrurаўўњњћћ§јћњ§њћћ§ћћы§ћ§ћ§ћћњ§§ў§ў§ў§ў§ў§ўўј§ў§ў§ў§ўўу§ў``\gur}Їўўћњњ§ћ§ћ§њћћўћћњўћћћ§ћ§ћўўь§ў§ў§ў§ў§ў§ў§ў§ўћ§§ўў№§ћV`\hwxbкўўњњћћєўћ§ћ§ћ§ћ§ћ§ћћќ§ћ§ћћёўћўћўћў§ў§ў§§ћ§§ўћ§§ѓў§§cdh`cieИўўћєљћњњљ§ћ§ћ§ћ§§§ћўћћї§њњћўњ§ћ§§ўњћўћћњ§§§ћў§§Vщbgk|vnrЪўўњћјњјљїћњўњћ§§ћћўћћњћћ§ћ§љў§§ћ§ћ§§јћ§ћў§ў§ўў№OPU\a^nT;ёўўњљњњјћњ§њњћ§ћћў§ћћ§ёћ§ћўћ§ћ§ћ§ћ§ћў§§ўы§ў§ўUZJSY`cO7MЗўў§љ§ћћѓњ§љњљњњћћ§ћ§ћћћўњћњ§§ђћ§њ§ћўћћ§ў§ў§ўўђ§ўSQVU]`ecJY”ўўъљ§њ§њ§њњљљњћћ§ћћ§§ћ§ћ§§ђћ§ћў§ћњ§ћ§ћ§ћўўњ§ў§ў§ўўѓZ^[]hdihM[gИўўщ§љћњћњ§њћћ§ћўћ§ћ§ћ§ћ§ћ§§їћ§ћћњћћ§ћћ§ўћ§§ќћўў§§шўbaZU[agiEEJbюўў§њ§њ§њ§ћћўўћћ§ћћ§ћ§ћћї§ћ§§ћњ§ћ§§§ћўћћл§ћў§ў§ў^kQQLNWYWagrЈяўўљћљћљ§ћћњ§љ§њћћќ§ћўћћљ§ћ§ћ§ћўўі§ў§ў§§ћ§ћ§§њёTQ@GCHGUYH8?jбўўњўћњњ§ўњ§§ћћ§ћ§ћ§§їћў§ў§ў§ў§§ў§цћ§њњJNCOHBH?E?C;Bvмўўћњћњћћўњ§§яћ§њўћ§§ў§ў§§ћў§ў§§ќў§ў§§ќў§ў§§уPWW`ZVOMNVijOjШўўћљњњћћ§ћ§ћ§ћћ§ўў§§іў§§ћўњ§§ў§§ќў§ў§§ўс§ўISZ^OSFFMQTNH?pњўўљ§њ§њћњњ§§ћћўњћћѕ§ўћ§ћўћ§њћ§§їў§ў§ў§ў§ўўк§ўJLOPHMOSHNJW^YWЊўўћћњ§њћћў§§њ§§ўћћњ§§јћў§§ћ§ћ§§ќў§ћ§§чўћ§ћћ§ўIOBJONJSVNIPT\BUШўўњљћњўњ§§ўћ§§ѕћ§ћ§ћћњўћўћћ§ћ§§ћ§§тў§ў§ў§ўNUSUUSPOOGISQdgN~їўўљ§њњёўћ§ћћњўњ§ћћњўњћћєўћ§§ў§ўћ§ћ§ћћл§ћўў§§ћPJJTVZ[TZPOQQ\OPgЇўў§љљњћўњњћ§§ўўћћб§ћў§§ћ§§ў§ў§ў§ў§ў§ўћ§§ў§ў§§HFANT^[ZLQLUMT]TWwЭўўѕљћњўњћћ§§ў§§№ћў§ў§ў§ў§ў§ў§ў§ўў№§ў§ў§ўў§§ўC;EIP;;?H^]\SYQ]Ќўўю§њћћ§§ћћў§§ћ§§ў§ў§§ўЯЩжнсѕѕэШ|nVHSOIJFA<-1C,@JILTUQY[Tdž§ўўњ§њ§ћўњ§ћў§§їў§ў§ўћ§§ўўкЧпзйу§њѓУzJUg^?H?>05IMCG@?>GPMNHAdƒЩўў§њ§њњќћљ§ћћїўћ§ћ§ћ§§ўў§й‘Тплгечљр„Lcq[@C@GMW\\O#*.@PG@>2(W|MLЪўўћ§њ§њћћШњћњ§ћ§ћ§§ў§ўћћ§ўЄМЪжЯЭзїп–]hTQIPI@BQUiT9"!&-#OzWFgШўўїњ§§ў§§њњћћЬ§ћ§ћ§ћ§ћўћ§ЛТТЮЪгуўўцЏjSc[UQ@CHLF:S8-*2@)08MbPuщўўюњћљїїјїњњћћ§ћ§ћў§ўўЪбЯЫгнусчљўћЎYABAOIEJ^F"20+*01#NaNWMkбўўљњєєёѕѕљљћћ§Фў§ў§ўЗйЭЮлтыьь§ў§ЏtQJFCLJM0$&(&10.2.!B`NNqk˜ўў§њїљѕїїњљњћћ§ўћўўП§ўЖБЌУчђььцёўўђК~vWBHG4- .+$$"$";FJNz|TЛўў§ѕјљњљ§њ§ћ§ћ§ћў§ў§§Рўw=ўџ=§џw<џўw;џ<џ<џўw:џўw9џўw8џ9џ9џўw7џ8џўw6џў€5 џw2 џўw0 џ1 џўw/џ0џўw.џ/џўw-џўw,џ-џўw+џўw*џўw)џўw(џ)џўw'џўw&џў€%џўw$џўw#џўw"џўw!џў€ џў€џўwџўw џ џџўˆџ џўwџўw џўw!џ!џўw"џўw#џў€$џўw§њћљєћћ§§ћњљћњ§§ўњўўћ§ћњ§ћћў§уљњ§§ўўћћљљ§ћўўћўњ§§ў§њњ§њћљ§ўўќћўў§§ўј§ўўћў§§ўў§ћ§ўўћюўљљ§§ћћњ§њњљ§ўў§ћљљ§ћњћњ§ўўєћ§§љљѕњўў§њ§§њ§ўјћ§њњ§њ§ћћљћ§њ§§јјўћ§§њёћ§љљњ§§њљљћљњћўўїћўўњў§§њћћљљћ§ћ§§ўўш§љћћ§ўў§њљћ§§љћ§ў§њ§§ўћўўњўњћўўћњ§§ўњ§§ўњ§§§ўњ§§ў§љ§ћљї§њ§§ўљњ§њ§ўў§§њў§јљ§ў ў№њћљ§ўћ§њ§љ§§ўўћўўќћ§§љљ§ў§§њћўўќ§њћўў§ўњўў§юў§§ћ§љ§ў§њћљјљћ§њўўўћўўњњјїѕј§§љњљ§ћљ§ўўсћў§ћћ§§љњ§ўћњњўўњћўў§љљћ§§ћњњљњњ§ћњњ§њњ§ўўњ§њ§§њ§§ўќћўў§§їљћћ§њўўћўўј§њњљћљњ§§њћљљћ§ўўњ§њњ§§ћћ§ўћўўњњ§њўўњ§§ўњќљјїљљў§ўўќћўў§§юў§§ћљўњ§§њљўўћћўўћћўњћўћўў§§сљћљћњўў§љљ§§ўўњ§њ§§јљћљћњ§њћљњ§§ ўњћў§њ§ўўь§ћљљћ§ў§ћћљњ§§ў§њ§§ўў§єћљ§ћў§§ўўћћўўю§њћїјљњ§§ћљћљћљњ§њњїїљњ§§љ§љ§§јњў§њ§§њ§§ўшћўћ§љљ§њў§ћћљ§њ§ўћњљћ§§ћћњ§њ§њ§ўўћ§њ§њ§§њљћ§њ§ўўўћ§§ўѕ§њњ§љ§§њћћ§§ўљ§§њ§ћјљ§§њ§њћўў§љћљ§ўћўў§њђ§ћћ§ўўњ§§ўћћўњњћўћћўњ§љљ№ћњљљњ§§њўўћўўћњўўўћўўўћўўќћўћўўљ§ўўћўњ§§§њ§ўў§ћјћјћ§§њ§ў§ў§§њўўјћўћўўћћўўљїњ§ћљњњ§њ§§ћљ§њ§ћљ§ўў§єљћљњ§§њ§§њ§ўўќ§њ§ўў§љћїљњ§љјјњћљљћћњјљ§§љ§§ћљ§§ўќњўў§§§јћ§§ђў§ћћ§њћљњ§њ§§ћћљљ§§љ§§ўўљ§њўћћў§§ђњ§ћњјћљ§љўўњњ§§њњ§ћћ§њњ§ћ§ћјљїјљљјњ§§ћљљ§ўўђњ§§њ§ћљћљљ§ўћўўюњўћћўћўў§§њњћћњљљћћљќћ§§ўў§№њљњњћјњњљ§ўўћ§§ўўї§ћўћ§§ў§њњ§ўёћўћњїњћјјћ§њљ§њњљіћј§§ћљљјљ§§ћћ§њ§ўўќњ§ћў ўљућњ§ўўњ§ўўњ§ћњјјњњљћљћљљћћљ§§њњўћўўў§ћћ§іњћ§њћћ§§њ§§ѕњљћћњљћћ§њћћћ§њ§њ§§чћўўћў§ћћљћњ§§љїћ§ћљћљћљљћћюљ§љћћ§ћћљћћљћљ§ўў§§њќљњљ§§эћљњ§њњ§ћћљћ§њ§§њ§њ§§ћњћ§љ§§ўћўњўў§§ёњ§њљћћљћљјњњ§њ§§ќў§§ўўіћ§њњ§§ў§њ§§њц§љ§њњ§љїљјљћ§§њ§њ§§њ§§њњ§ћћњтјћњњ§§ўўњ§љњјћљ§§њ§ћ§ћ§§ј§§њ§ўўићўљњћњњћњ§§њњ§њ§ў§љњћљ§њљјљњ§љ§љћњћњњ§љњњр§ћўћўў§§ўўћ§ћњ§њ§ўћћўћўў§њ§њњ§§ћћ§ѕўћ§§ћљњ§њ§њњўў§§јї§њ§ўў§њњэ§њњўњ§њљљјљћћїјљљћ§§њњ§§ћћўўяњ§§њ§§њў§§њњ§§ћњ§§ўњўўёћњ§ћљћћљў§§јј§ўўћ§њ§ў§§ћњўўћўўўћ§§ћ§љћ§§ў§ќўњў§§њљ§њ§§њ§ўў§ќћ§њ§§ўў§ћћ§щљћ§љћћљ§§љјњ§§њњ§§њљљњљљўћўўњхјћћљ§ўњїїјћљњў§§ћњљћљњ§§љћўўћћў§§ўў§ћўћўћўў§ќњ§ў§§ѕњћљћћ§§њљњ§§ќљњ§ўўљ§љћљћљћћ§љњ§§эћљћћљњњ§§њ§љ§§љљњњ§§њњ§§њћўўўњ§§їљћћ§§ћљљ§§љ§ўњ§§ўћў§ѓўћћўћўўћ§§ўћўўћ§љўњ§§ўі§њўўћўўћћўўїћ§њ§њ§ћѕ§§ўњ§§ўњўўўњ§§ў§§ўњўўўњ§§ўњ§§ќњ§§ўў§ћ§пћ§ћљћ§њњћћљљјљ§њћѕњћљћњљњњ§§њњўњ§§њљ§њњ§ћћњљ§њ§ў§§ћїљ§ўњ§љћћ§§љњ§љњ§§ўўћўўўћўўљ§љјїњљћћјњ§§ћћўў§§љљ§љў§ћўўхњљўў§§њўў§§љњљ§њ§§њ§§љ§§ўћўўќњ§§ўўћћўў§њњ§ўћўўўћўў§ќњ§ћ§§ќњўўћћјўњњћљљњўўє§ўћўћ§§ўћњњ§§њњ§§њљћћњљ§§љћ§§ўяњћљћњ§§љљјћљ§§њјљљѕњўўћћў§љљћ§§§ћљ§§ўэ§њљјјњћљј§§њўў§ў§їћћ§ўњўўоћўў§§ў§§њ§њў§§ј§њћљїљћ§љ§§њ§њљ§љљ§§ќњўћўўѕћўћћўћўў§ћ§§ў§ћњ§ўћўў§ћ§ўњ§§њ§љіћњ§§њ§њћћўўћўўњ§§њћљ§§ћўў§ўћ§ћљўњ§§љњ§ћњћћ§§ўљ§§њњ§њ§њ§§ѓћњ§љјјљїјћљњ§§њљћїљћјјљћ§њћћўњ§§љћљ§њ§ћљљќћњњћћ§ў§ћњ§§ћ§§§ћљћћїїјљјїњљћљљњўћ§§њ§ўіњ§јћљ§љњњ§§ћ§ўњ§§їћљћњјљњћ§§шљћ§ј§§њ§§љїљљјїћћљїјћњ§ўў§ўњ§§ћщ§ћљљњњћўўћ§§њ§љ§§њ§§њљ§§љ§љѕњ§§љјјљјљљћћї§њћ§ўўћћўўіћљћ§§њ§§ў§§њ§ьљ§љћљ§ћљљћљћњїїњћљњ§§ўњўў§§§ћ§§ћьњ§ћ§ћ§ћ§ћ§§ћњ§ћ§ћ§§ўўћћњ§§ўўѕ§ўћ§ћ§ћ§ў§ўўы§ўў§ў§§ћ§§ћ§§ћ§њћћў§ўў§ћћ§ћў§§ўїћ§ўў§ў§§ўўљ§ћћ§ўў§§љћ§§ўћњћћћ§њ§§ўўј§ўў§§ћћ§§љўћ§ћ§ћ§§њћ§§ўў§§ќћ§ћњњћ§§ћ§њњц§ћ§ћ§§ћ§ћў§§ћ§ћћњћ§ў§ў§ў§ўўњћ§§ћњћћ§шў§§ћћњ§ўўћ§ћћ§ћћњ§ў§§ћћўў§§ў§§ѓў§ў§ўў§ћ§ћ§ћ§§юћ§ћ§ћў§§ћ§§ў§ўў§§ћћљ§ћ§ћћў§§љћ§ћ§ўў§§іўћ§ћўћ§ћ§ўўў§ўў№§ўў§њћ§§ўћ§ћўћ§ўўљ§ў§ўћ§ћћі§ўўћћ§ў§ў§§ўў§ўўљ§ћ§§ў§ўў§ћљўћћњ§ћ§§ћњњћњћ§ўў§§ў§§ъњў§§ћ§ћ§ћ§ћ§ћ§ў§њћћў§ўўщ§ў§§њћћ§ћ§ћўў§§ў§§ўў§§ћћњ§ў§§ћ§§љћ§ћ§њћ§§єћў§ў§ў§ўћ§ћ§§§ћ§ўў§јћ§ћњћћ§ўў§§ў§§љћњћ§ћ§ћћћњ§ўў§§ћћ§њћњњћњ§ћ§ћњўў§ѕў§§ћ§ћ§ћ§§ўў§§ћњћћ§ў§ўўяћ§ћўћ§њћў§§ћ§ўў§ўўў§ўўњ§ў§ў§ўўѕћ§ћћњћњ§§ўћћё§ћў§§ћ§ћ§§ћњћњ§§ѕћў§ћ§ћ§§ў§ўўў§ўў§ўћўўћьњ§ў§њћћ§§ћў§§ћ§ўў§§ћћљ§ўўћ§§ўўў§ўўїћ§њљњћ§§ћћэњћњћ§ћ§љљћћ§ћ§ћ§ў§ћћ§ћє§ћ§ћ§ћў§ў§ўћћ§ьўћћњћћ§ћўў§ћњ§ћћњћњ§§ќў§ў§§јћ§ћњћ§ћўўі§ў§ўў§ћ§§ўў§§ў§§ћ§ѓћњ§ћ§ћ§ў§ћ§ћ§§єћ§њћњћћ§§ћ§ўўќ§ў§ўў§§ћ§ћћўњћћ§§ћўўќ§ўћ§§іћўў§§ў§§ћўў§ўў§ўў§ћі§ўў§ћ§§ў§ўў§ћў§ў§ўўў§ўўщ§ўћў§ў§ўћ§§ћ§ћ§ћў§ўћ§§њњњћ§ћ§ћ§§їћў§ўћ§ћў§§§ў§ў ўћы§ћњћ§§ћ§§ћ§њћћ§ћњћ§§ўўђћ§ћ§ћћњћ§§ћ§ћ§§ўў§§ўћћ§ћ§ћћіњћ§§ћњњљњћћљњљњћћ§ћћі§ћњћ§ћ§ћў§§§ўћ§§ћђ§ћ§ћ§ў§њћћ§њў§§ћћњћњўћћ§§ћўў§ў§§ћ§§љћљњњћћўў§јћ§ћ§ћћњ§§ћњћћ§ћ§ћћќў§§ћћў§§ћ§ћћўў§ўўћ§ў§ў§§ўў§ћћўњћћќњ§ћўўућ§§ћ§§ћ§љљћћў§ўћ§§ў§ў§ўћў§ўћ§§јћ§ћ§§ў§ўўѕ§ў§ўњњћћ§ў§§ћч§ћњћћњћћ§ћўћ§ћў§ў§§ўў§ў§ўўў§ўўјўњ§§ўў§§ыў§§њљњњљњћњћњћћњњћ§ћ§§§ў§ўў§пњћњ§ћћљњ§§ћњ§ћ§ћ§ћ§ћћњљћћњ§§ћњћњ§§њћ§ћў§ўўћїњћњ§ћ§ћњћћќњћњћћјњћћњњћњћћє§ўўћ§ћћ§§ў§ћћї§ћ§ћ§§њћ§§ћќњћњ§§ьћ§ћ§ћ§ћ§ћ§њ§ў§ћ§ћў§ўўў§ўў§њўћ§§ћ§§љћњћћњћ§§ђћ§ћ§ћўћ§§ў§ў§ўўўћ§§јћўћ§ћ§ћ§§ўћ§§ћћљјњћћ§ќћ§ћ§§ўћњњ§ўњ§§іћў§§ћћљњњћћ§ќўћў§§њћ§ћў§ўўі§ў§ў§§њ§ћ§§щћ§ћўћў§ўў§§ћћў§§ў§ћћњњ§§ўћўўђ§ўћ§§ўў§њ§ћ§ћўўў§ўўќћ§ћ§§ўћњњіћ§ћўћћ§њћ§§ўўћћћ§ћ§ў§§§ўћ§§ћћ§§ў§§ћљ§ћћњћњћћ§§ћ§§ўћўў§јћ§ћ§§ўћ§§ћјњ§ћ§ћ§§ўўў§ћћїњћўћ§ћ§ћўў§њћ§§ў§ўўєћ§ћњњћњ§ћ§§ўўїћ§ў§ўћ§ћ§§ќћ§ћўўпћ§ћўћ§ћ§ћў§§њћњњћ§ћћњ§ћћњћћ§ћњ§ћ§§љћ§§ћћ§ўўћ§ў§ў§§ўњћћ§њњћ§њћ§§ѓћў§ћњћ§§ћћў§ўўјћ§ўў§§ћўўў§ўўўћ§§њў§ћ§§ћћѓњ§ћ§ћ§ћ§§ћ§ћўўћёњћњћњћњћњћ§§ћ§ћћњіћљљћћ§§ў§ћћ§јћ§ћ§§ћ§ўў§яћ§ћ§ћћњћћ§њћћ§ћ§ћћї§ћ§ћ§ћў§ўўў§ўўћ§ћ§§ўўњ§ўћ§§ўў§ў§їћ§ћў§ў§ў§§ўў§ўўў§ўўўћ§§єњ§ћ§ћ§ћ§ћ§§ўўї§ћ§ћў§ў§ўўљ§ўћ§ћ§ўў§ўћ§§ўћ§§шћў§ў§§ћ§ћћњћћ§њ§њћњћ§§њћћѓ§ћћ§њ§љњћћ§ў§§єћ§§ў§ћћ§ћўћ§§їњћњћћ§ћўћћѕ§ћ§ћћњћњћћ§§ћњїћ§§ћ§ћћў§§њћ§ћ§§ўў№§ў§§ћњљљћћњћ§§ћўўр§ћ§ћў§ўўћў§ў§ў§ў§ўћ§§ў§§ћў§ўћ§ћ§§јћўћ§ўў§ўў§ћћ§ў§ўў§ўў§ўўљ§ўћ§ћ§ћћў§ўў§їњћћ§ўў§§ўўћ§ћўў§§ўћ§§ѕћ§ћњњћњћћ§ћћє§ћ§ўў§њћћ§§ћћњћќ§љњћћ§ўв§ћћњ§ћ§ћ§њћћ§ћ§ўўћ§ћ§њљњћћ§ћ§ўўћўћўћњћћ§§ў§ў§ўўњ§ћћўћ§§јўћ§ћ§§њћћ§єћ§ўћўў§§ћ§§ўўў§ўўћѕ§ћ§ћў§ў§§ћ§§уў§ў§ў§ўў§ћ§ћ§§ћ§ўў§§ћ§ћ§§ћћ§ћћ§јћ§ћ§ўў§ўўэ§ў§ў§§ћ§њћ§ћў§ў§§ћўўћ§ћћњћћ§щћ§ћ§ћ§ћњ§ўў§ћ§ћ§ў§ћ§§ћ§§юћ§ћћ§§ў§њјљњњћ§§ћ§§ћњўћњњєћњ§§ћњћ§§ћ§ћћ§ћ§іњћњ§ћ§§ўћ§§ћў§ћћ§њћњњљјїљљћњћћ§ќў§ћ§§љћ§ћ§ўў§§ћћў§ћ§§ћћ§њњћ§§ёћ§њћњњїјљњћ§ћ§ћћњ§ћ§ћ§ћћќњћњћћњ§ўю§ћ§ћ§ћ§ћњњ§њћћњљћўўё§ћ§§ў§ћ§ћ§§ўћ§ћћћў§ћ§ћћї§ћ§ћ§§ћњћћјњћћ§њ§§ўўї§ўћњ§ћ§ћ§§ќћ§ћ§§яћ§ћ§ў§ћњћ§њћћњћћљљѕњћ§§ћ§ћ§§ў§§ќ§ў§ўўё§ўћ§§ў§ў§ў§ў§ў§§ћў§ў§ўўќ§ў§ўў§ўў§ўўў§ўўќ§ў§ўўњ§ў§§ћўўќ§ў§ўўў§ўўў§ўўў§ў ўќћў§ўўњ§ўў§§ўў§§ў§§ўќ§ў§ўў§§ў§ўўі§ў§ў§ў§ў§ўўљ§ў§ў§ў§§ўђ§ў§ўћ§§ў§ў§ўћ§§ќў§ў§§ ўє§ўћ§ћ§ћўћў§ўў§ќћ§§ўў§їћ§ўћ§§ў§ўўў§ўўљ§ў§ў§ў§§ћў§ў§ўўќ§ў§ўў§ёў§ў§ўћў§ў§ў§ў§ўўќ§ў§ўўў§ўў§ ў§§ў§ўўњ§ў§ў§ўўі§ўћ§§ўћў§ўўў§ўўќ§ў§ўўў§ўў§ѕў§ўћўњ§§ў§ў ў§ѓўћ§§ў§ў§ў§ў§ўў§ўћўў§§ћў§§ўў§ўўў§ўў§ъћў§ў§ў§ў§ў§ў§ў§§ћў§ў§ў ўњ§ў§ў§ўўї§ў§ћўћў§ўў№§ў§ў§§ўў§ўћ§ћ§§ўўў§ўў§єћ§§ўћў§ў§ў§ўўќ§ў§ўўј§ў§ў§ў§ўўі§ўћўћўћ§§ўўў§ўў§ўќ§ў§ўў§§ў§§ўќћ§§ўўњ§ў§§ў§§ѕў§ўћў§ў§ў§ў ў§ўэћ§ћ§§ў§§ћ§ў§ўў§ўў§ўўњ§ўћ§§ўўў§ў ў§јњћћў§ўћ§§їў§ћўћ§§ў§§§ў§ўўќ§ў§ўўќ§ў§ўўќћ§§ўўњћ§ћў§ўўё§ћ§§ўћ§ћ§§ў§ў§ўўљ§ў§ў§ў§§§ў§ўўќ§ў§ўўъ§ў§ў§ў§ўћ§§ў§ў§ў§ў§ў§ўў§њћ§§ў§ў ў§§ў§§јћ§ћ§§ў§ўўў§ўўў§ўўў§ўўњ§ў§ў§ўўѓ§ўћ§§ћў§ў§ў§ўўў§ўў§ћў§ў§ўў§ѕћ§ў§ў§ў§ў§ўўў§ўўў§ў ўћ§ў§ў§§ўї§ў§§ћў§ў§§ў№§ў§ўћ§ћў§ў§ў§ў§ўўќ§ў§ўў§§ў§§љћ§ћў§§ћћ№ў§ў§§ћў§ў§ўћ§§ў§§§ў§ўўў§ўў§ѓћў§ў§ў§ў§§ћў§§іў§ў§ўћ§ћ§ўўў§ўўў§ўўњ§ў§ў§ћћ§ўє§ў§ў§ўћ§§ў§ўў§яў§ў§ўћўћ§§ў§ўћ§§ўўі§ў§ўћ§ћў§ў ў§§ў§ўў§ќћ§ћ§§ў§љўћ§ћўћўўў§ў ўќ§ў§ўўњ§ў§ў§ўўэћўћў§ў§ў§ў§§ћ§ћў§ў§§ћў§ў§ўўў§ўўў§ў ўњњ§§ў§ўўў§ўў§ћќўњў§§ћў§ў§ўў§йћ§§ўўћ§§ўћ§§ў§ў§ўў§ћ§ћ§ћ§§ўћ§ћ§§ў§ў§ў§ўўўћ§§єў§§ўћўћ§ћўћ§§їћ§§ў§§ћў§§њћ§ћ§§ўўў§ўўј§ўў§ў§ў§§ъў§ў§ўћ§ћ§§ў§ў§ў§ў§ў§ў§§ћў§ў§ў ўў§ўў§їў§ў§ўћ§ћ§§§ў§ўўў§ўўў§ў ўў§ўўљ§ў§ў§ў§§ъў§§њ§њ§ћў§ў§ў§ў§ў§ў§ў§§љў§§ўў§ўў§§ўћћ§ўў§ўў§§ў§ў ўї§ўў§ў§ў§ўўў§ўўы§ў§ў§ў§ў§§ћњ§§ў§ў§ў§ўўў§ўў§ўў§ўўљ§ў§ў§ў§§№ў§ўўћў§§ћў§ў§ў§ўўј§ў§ў§ў§ўўњ§ў§ў§ўўэ§ўћў§§ћ§ћўћ§ћ§ў§ў§ўўў§ўўў§ўўє§ў§ўў§§ў§ў§ўўѓ§ўћ§ћ§ћўў§ў§ўўј§ў§ў§ў§ў ў§§ў§§§ў§ўўў§ўўі§ў§ў§ў§ў§ўўў§ўўќ§ў§ўў§јћ§§ў§ўћ§§ыћ§§ў§§ћ§ў§ў§ў§ўћў§ў§ўўю§ў§§ћ§ўў§ўћ§§ў§ў§ўўјћ§§ў§ўћўўў§ўўў§ў ўђ§ў§ў§ў§ўћўћ§§ўўћ§ў§§ўўш§ў§ўћ§ћ§ћ§ћў§ў§ўћ§§ў§ћћўўя§ў§ўћ§§ў§ў§ў§§ў§ўўѕ§ў§ў§ў§§ћў§§њў§ў§ў§§ћў§ў§ў ўќ§ў§ўўў§ўўў§ўўќ§ў§ўў§ ў§ўў§§їў§ў§ў§ў§ў ўќ§ў§ў ўќ§ў§ўў§їў§ў§ў§ў§ўўї§ў§ўћ§ћў§§ўј§ћ§ћ§ћў§§єћ§ўћў§§ў§ў§ўўў§ўўі§ў§§ћ§§ў§ўўё§ў§ўћ§ћ§ћ§§ў§ў§§№ў§§ў§ў§ў§ў§ў§ў§ў ўє§ўћ§ћ§ћ§ћў§ўўљ§ў§ў§§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ў ўќ§ў§ўўќ§ў§ў ўњ§ў§ўћўўў§ўў§ўў§ўўў§ўўї§ў§ў§ў§ў§§єћўћў§§ћў§ў§ўў§ёћў§ўћ§ћўћў§ћўћ§§ў§ѕў§ў§§ћў§ў§ўў§ћљ§ћў§ў§ўўњћ§ћў§ў ўќ§ў§ўўђ§ў§ў§§ћўћўћў§ўў§§ў§ў ўњћў§ў§ўўњ§ў§ў§ўўї§ў§ў§§ў§ўўњ§ў§ў§ўў§јћў§ў§ў§ўў§§ў§§ўў§ўўю§ўћ§§ўћў§ў§ў§ў§ў§ўўі§ў§ў§ў§ў§ўў§эў§ўћў§ў§ўњ§ћўћў§ў§ўў§ћ§№ўћ§ћў§ў§ўћў§ў§ћ§§іћў§§ћ§§ў§ўўъ§ў§ўћў§ўћ§ћ§ћ§§ўћ§љ§ћ§§ўі§ў§ў§ў§ў§ўў§§ћў§§§ў§ўў§њў§ў§ў§§пњћњћ§ў§ў§§ћўў§ў§ў§ўћ§ћўћ§ћ§ћў§ў§ўўї§ў§ў§ў§ў§§ќњћћўўъ§ўў§ў§ў§ў§ў§ў§ўћўћў§ў§§ўў§§јў§§ћ§ћў§§ўќћ§§ўўј§ў§ў§ў§ўўћ§ў§ў§§юћў§§ћћњњћ§ћў§ў§ў§ўў§ Рћ§љћљћћњљјјњјњњћјњћћљљећљљћљћћїјїћ§љ–B[S:$ >V<830>8:EEHNvУэпючсхћћћїјјїћћ§їћїјјњїїјњњцїѕљњјњў§љДVN2:.!$14+-4;5*--ё>?EE@4?FBoеїчхтЭЛЖћћљ§§ћіљ§њ§ћ§§њћјјаћњ§њ§§ў§ћd!742,5;12-,34?EIOCLЦЯФОЮдЪУЧњњћћјїїћћќњ§§љљСј§љјїјљћњњјњјѕљћчO323%)*,1NGJ>БдЊМРЭгдЧШїјњјњїљїїѓњјњїјјљївѕєєћ§љ–?JJ@1.8<>?G<@GG2>`jЭБЗТЦгЭШЦОћѕїїѕѕєѕѕ‰єѕїљѕјјћљћћљјѓїїѕёѓљёŸG229+$7A7738:FW8>EuУэнШЦШЮдзЮЪЪћјљћћїјїїњјјњјјїїјћљљњ§њ§§јј§§яZ5CM797:5*7;;8-453]tЮчЧхкЧЮлггбЮЭ§§щћљњљњ§љћ§§њћјћћњїѕїљїїјј§иЋ82JO42$,:;:&"+)*C8(wдЯЛФННдзкпаЭЫћљћћљћћћњ§§њ§§Ьњћљњјњїѕѕїћ§˜@POC9*.4+*(+!$(%GOZмюёеагпышхрйЫЯњјљћ§ћћўјљљќњ§њ§§вћїњњјїњїћљм[3F4@2)&*5(.+&-3:c~лзмкжЮйтчткЫЪЖјјћњћљњ§§ўћјјїўћљљаў§јr9BkSF.)1840(22G1дмбШЪЫЯйлмйеЩФЏћљљћљјїїјїїЫѕїјѕјѕјїїјћћјѕ§§ЪZ;B54213978>1)+OpOB‚ШбЧЩСШгжжпйЪИКБљљТћљћљљјјїњјјњјњїѕїїљѕђѕјћљz.9F@3??;<::GG:5QeunЉИКЧгЯеЮЮеЫММЕЇЋћћќљћћјјїїћљ§љ§љњјјШїј§ћВU9EG;059GE9A3.$-5H(WVE‡гыьтсжЦРНЛЛТЗУЊЎБ§§њ§љ§§њњћјљљћљљћжўћјx51<>9;2>5B;7;@IbVFrЧСЋКЩЦЯкФНДЎЈЎИБДР§§њўљ§ћјїјєјјїѕѕљѕ§§ЪOG;F@@›48873442@OEjсгжжЫШЫШУЗАЎЎКИУЦЦ§ўўњјњјјћћљћћљћљјјїљјїў§њ•bO;FC78)2413.4-5PE\ЄьюШЫЩддЭСЗВЛШФЋЊВРњљљјјїїћ§Ьњ§њ§љїњљ§љ‹BEMC?B97B9?E<99>39>‡ОЪЮШМШзмнпмаЛЏЊЎВЩс§ћћіљјјњјњјћћјјУњїї§§еYE[WJEEGIAJBGB5CMI.VЏЯСЧЪОКИОЋЉЇЉЏЃЇАСЫпњљћњ§ћјљљјљљћћјјЭїјј§§ђ‡UBHJ?AFJGJN>HJEЏььЪШШЗЗМКЋЃЋМКДЛгртнњјљјјРљћљњљњљїјїљїїћ§ђˆLB@B<>@?9AC;GJF?-ELxпрТЩУИЗУЪФЗАЋАМНЛЯухжћљљћљћћњљћћјљјјїбљ§љ„;>A?;2,+.-@E>FHI:;3SБулЧИЖЖЗНОЛЗЎЉФЪЦбртрм§§њљњјѕјїїќѕјљјјЭћ§ћžC:@GA742#+*GGHLOU\P<ˆФЭЧСОЦдЪЧИЕВЛОййпцьпЯЩљћљјјљћњјјњљїїФјћ§ЩmQCEC?:0+4&:uQPF>E]uƒгхЫУООЩЫФЗЛМСРИФкхщхаЗИїјњјћ§њ§ћљјљљЪў§ї‡L.0038397A@JLCBJeq^vЃЭСТМУмрйдЕЏАЕЗДШезйгШКЎјјћћњўўќ§љћљљФ§ћШd;7+4:?:A>9<>CICL24?>ŽОЖЉЛТЩййлаЗБЕШЭайжкгаШЕЃ§љћћљјјћјљћћ€Жљѕћј”7A:;@@79:>99A>ACMIFmЋѓѓёйекжаЫИКТКФЯЭаЮЫжлеЧОМљљћћњїљњјїјјњњў§єg?\?B;7^>A|аѓѕысжжедЪМОКДОаЯбаЪРБЊЄЁЇћљ§ћњјїћњљћљћљ§љУk‡ˆbNFB49:413?8.>7W‡ЭгЕАЇКЩЫСДЏЕЗОЫбезЩНЖКММЊЃћћљљРєјћ§љјљјўћ§wBQJ1.&+34>78@C<&?ŠлжЩННМИРЕТЪОФЧЭЦЧЩЫРЗЏŸžЂБЈ§њ§§ћћ€Т§њ§ћњњ§јАTCPJFS@842>:>430BB\hЏынсмЮРИОМКСЦЭЮеЩЦйаЧЮМЁЇЗЉ§ћљј§§њ§§ћјњ§§цrZA50BH?9;;874<>;"VТаЮехлаЫСЪЫУЭаедТМкЯЎЗ—ЁЂPLћљћјј§њћљњјњћћЉd`MSNU;;08+2;<:2IJQЎршбЭЮпздЩОРЮлрхузОЖИРЯНЇ•m>9(ћљјљћљјњјјћ‰pVb89HL,5"+4?<@%#@U|ЭчмжЪЫЫЭЮмдезхтнлаЛЖЕОаЩ–b<$!ћјњњљјјњњїњў§Т;YYBI;>0*(2110@>YjVУабЧЮеЫОЩЪЮазхщуййЫРЕМЫЩ<.ћјљћљљњХўћћ‡@;NNIVVЁцллпселгаЭЫШеыткгРКТНФЊ~M87$љћњћјј‰љїљљћИaWUSPL82748@;4GPiYQЖпржйлушежЯаакпмпкФРКШЃb4.#јћљ§љћћјў§§ЎcBM]NB;31AEEGF:88TT™ярмЯЫмухссзжкмнзйдФЯйеr&"њћ€шљјћћуnOEMcM?;FLIGIC?CNPL|ёюбкебййлжШЩЩФджкОМКЩьУP2 јїѕѕїїњї§јЅME@JOC@3FHA2;<@GGLGЁьзСТЧЮйзТМТЗЛЫддЩУИТмл‚ & љћјїѕїњћћьvMJBJC??F>0:42?>IF@•ѓёеЪЦЭаУООТМНЦЪайзЭЩеуЉB! $§љјћћјј§§Ю]\`AFOJCB;8::3>*38ЕѓкЫЫШЭЫУЧЯЯЫЫпрккШзаЗЌe.*  §§њљјїњљјЃZMWEOIJ:>C:58*<G>9B@>FBSUQkдуЫбЩККЪзцэђѕѓьсаЛИЁœžБЏЇЉn)!8-  ћ§§љњј§є{EW.,@FB98FLF:5:C57bКёубЯСКИЕЦТТУСИЕЃž…‘ЗТТЗНТШЪШЮЯкуцысЩКљїў§ыv?YMOCFNL<8<:<:;ZO.eїїяйжЯУОЏВЛЖМВДЏКЄ˜ЅЖМФШШНТЧЭбпхтркдзЫЫїєљћдc@@L>7GF:;98C9;95HЋщусйплеЫРЗИКАЏЕИЛЋЗТМУбйжЩЪЭеесьыржЫФЩЭњњћ§ћ…MPTZE:8@9ABGCB:A:oьянйнпхйгекжЩЛЏЌЏЗИТЫФТЭдзркгспучужЯФШЮЪљј§§љi9OuUFJJB9CHTLB.)7ŽынЛЉЩнхпдЯмзеаЗЋŸЈИбгМАВЩзжж€ЪелппзаеаЪЦФѕђљэo.&;JNEA:2:3+8C>87.4<‚цямлпхюящцркОУМЗРЯааЪЮЗНЫлмнмдежмупйгййллїћљŸLbdPF>CB8+-:74#7,`МюнЭамщытпцсеРБАЎОЫЯаЮЫЮЮЭушчрйекрчтжбШЛММў§ћћњњћ§њљњљљќњљњћћнњћњћњњљњўў˜E`UACUE??:8>ELMIH~Эїўўјјѕњњћњћњњіћњћћ§њћњњљљўњљљњњјњњљўўпЕ[P89;.2.23287335;FCWУўўљњєёёњњћћљњљљњћћ§§ќћљљћћњЮљњњљўўЛAFMH5>IGmцўћѓѓђяяћњћћ§ћ§ћ§њћћ§§ћњ§ћ§њњ§ўћўўгd">;&2:<;4>;9?EJQVOWАщљѓыєєѕђяњљћњњљћњћњ§ћ§ћћЮ§ћћњљњћњљљњљњљўўяT09"&,.,5@AB9:?>>?<11\uVJ‘юјёяёђёєїєђёяяшћћіњћњћћњњљљњњљэњљљјјљјћўў|8@FB<;C>>цAEL?AZmz}Шшяяђєђєђэяёэюёэњњњћњњ§§њњїћњћћўћћљњњбљњўўЛ\8BM:7;HJMIFNO?*.5eсўўјјїєјїїёяьёяяѓњћ§ћћњњћљњћњћћЯўћ§њњљњљћў§}:(LB77@@?:*2HA7#(xїўђѕѕјїєєђюђщшщцщ§§ўћ§§ћ§ќћў§ћћЬњћњњљўўЖE+8>9<:9-.0:N40`]Wўўњёёѓєёьыышюхщчш§ћ§ћўћ§§ћўњћћзњћњћњћ§ўї{73:>?>5997>??;<0UChМўўђёѓђѓђѓёёьщшышшь§ћћњњљљЦћњћћ§ћ§ћ§ћћњљ§ўў’GFP@E>3HQ‚њўюяюэяюяюющшээюѓѕєѕїњћћњћњћњћњћ§ћњњљећўў~9BAE<53404:?EFMNA8;[Эўњэяяюьэюяэыььёѕѕїїњє§ћ§ћњњіћњљљњћ§њњўўаЁ@??G<4258-4FNPSVb\W>яћёьюяэюэюяяэяюѕѕїѕѕєђћњћњњњљњњљјљљФ§ўўЮvVJEBC<220+@xZPM@Gm‹ыўјююђюёюячшшчыюёѓѕїѓэюљњљњћћ§ћњћ§ћћў§ўўвˆN&81;::9;:ELHLHOjti}Оюьюёѓёєїэыцщшшюяёѕєєђюхњњ§ўћўњћћўлаk<.13;;><@:9CH@IJ<9ELЄяюхюяяюђяэющэююђэѓђѕїђюю§ћћњћњњр§ћњњћћњўў9A57AA>9?74;CJGJQJBnКўўщљѕѓђєяђюыюэюёёѓєђяюьццћћњњљљјљњњўљўўЧn@`HA@8488328@C>GhCF„рўўњяѓєёэщцхчыэюѓђѓёюяэчуцћћ§њљњћњ§ћћўЭЫk‹ŒmMB;:5:<97;@8*:4Zёђкхшшюээщчцьюяђѓяяьцуцсткњњћћњњ§ћ§ћњўўл~BVF5%&5-5;9>>BE>$2E—ѓўѓэщщэьђэьђюёяђђіёяэхпмлтг§§ћ€Пњћћ§ћћљњўўАTBJN@VA89>]]?CFC*12279BLEarSбўєэєђђѓэяяѓєєѕѕэђяящьђэžH:&$3њћћњћћљўЩ‹A:>NOGF9325:8NMOZ]ЈўўјѓђјѓѓёѓяєѓђљјєєюёэёЮSBF8.-ћњ§њњСјљћў§ЛdSUTNJ;:113:>?LZqZ[ЫўћђђѓєєљєєђєђєєѕђёыыїЯvA72(+&*§њўћћњњк§ўўЏi?M]SC8>B;@EGBA93[ZЇўўњѕєђєѕѕђѓђђєєіёэяѓўћ‡."##з-)&њљћњћњћњўўэqPFPhH?@JSLMGBACSOP‚ћўєёѓєєяшђяюєђєюєэюїўбT$$:&#њњљў€пЊNI9IGIACMNB?5?AFCOGЊўћэѓђєёяёђьэяяђђѓэюёўђŒ)%#"&#%ћњњљњљљўўљ~QPBFLIFGHB5779BTLB•ўўїёђёюђѓёэышьєѕєѓђюћўТG.!0#(#ћћњњћњњўўдd[eGHOQICAA??>:59!8Оў§ђёђёёѓѓёѓёёяєѕѓђяюпЯ{7-!#,&§ћ§ћњљљўўЉ^LVLINC@?;;?92>>N§ЛЦэщюђђѕєєїїьѓєяњююд}8,(("!"њњљў гueA8CJG@8<:?CHBH~iVЄяБшљёяѓєєѕѓѕѕїјјѓѓхрпщЭt?)31$(%ћњњљњљўўзN5OZMF@A?>:<7@LHƒxiмўљћюэѓєѕјљїїЮєѕјяшхемЦg3+29,(,.(!%ћњћњњљўўЩGB]TN@AC>??98++7G^œўўюЛьяєєїљљњљјєђєюхмлсУŽ2#35,)!!&#§ћ§њ§њўўЋ5HJJF;2<><@EGHLYTpнўэююяёёєјљљј€—ѕєьюцсншцзЯw,+<:427A|яўюёьёяѕѕјљњљњјѕјѓщснппэкьцb-3B*)(7ћ§ўћћўўт^;YCIGBFOOQA>7929nЏўўяюьшяѕїљњћљљєєёппнпрххыюјК|V@A87.$;ћћиљўўдaJVdC90,GYh4?FY.5]ОўўёэчыюўљњљћјїјяццяусхььятЦk.#01:.;љљ€€њўў?3?IGAFB>955<@25?A;7&MЩў§яяюыяяєїєѓђёѓђчнмйхщьээсяэышёђтчђз™xћњњўўŸE^q[QE@89<<8??с>18nеўћєёёэчщьёђђяяюпзздлёэюёюёёмђюѓяђюєшеФћћўўю}@ZHHQVUJB?>@B@@\P3oўўЈїѓђёььэыэыяььымлуэюяђюяэюёђєїїєяшщркљјћўк•jJGM@@FJ;4@C?@>28MДўўђјєєђяюђэчцхчщцщщьёяяђђѓёёѕѕјѕѕѓюычхљљўўТŽN[Z[B@>ACAHHB?@C@{ўўњяѓїѕѕєђѓђяьчхчуыёяяююёѓђђїђѕѓѓђєёђьыьћњўўцpAV{[QEBCBCPOLB3)9Ёўўхыэєѕѕэјєѕєьэцххыэюэыэюёѓђђєѕлїѓєѓёяјѕўѓp,&BMFG@;?@EILE@35jбўўёѓѓњїїХѓєюёэяьэёђэшцщюєђєѕѓѕїїєѕїјєѓђљўўх^VJLMFCA9;;<@9514<‹єўљђѕљљшњјѕюѓээюяёђёѓэёэяђѕїєїѓєєнѕєєђђяяљўўЇNdk[NJIH?49AC:)?8bЫў§яјѕѕїїјѕѕђюьшяяќёђѓёёяѕєїљјїїѕјјїїєђђюэ§ћћ§§ў§§ћўўћћїўћ§ћ§ћ§ћ§§ећ§ћўћњ§ўўЈOrdY9-VmVYOSNU[\^][Їзѕљўўђђ§§ћ§ћћјўћ§ћў§§ћћќўњ§ћћў§њњћўоШn]CMP7GFOLFQLJOFYIWQkЮўћѕѕєрнћ§ћ§§їћўњўћў§ўћћэўћ§ћўћ§ћћњўўЩNS~{dMMлSPQUOS\a\IQbYxхўѕѓящдЮћ§ћў§ў§ў§§ћ§§ў§§ўѕ§њўћў§ў§ў§ўўШr%5ILAULOO`OPPUZ]cn^hНхумбтючнрњўћ§ћ§ћ§ћ§§ў§§ћ§§ўћўњћћ§ћћи§ўўјe?G8;:CUUYYGPJVZIo^aYНшТбетэюумњћњћњњў§ћћќ§ћў§§ўўњњљ§њњљњјўўгЉV\ePA8GPZVVQOZeYHVzЁцЮазйцпсркћ§њ§љћјћљћјћњњћўњ§ћ§§ећ§њ§љњјўўА]CGQ:IOMUQMILO^}PVY‘йўѓктмпщцупућћ§ќћњўћћяњћћ§њћћ§ћў§ў§ў§ћўўкmF[bUBJLIIMLYLJWIIx‹тљрїюмчышышср§ў§§ћћўў§§ёў§ўћ§ћ§њ§љњњ§њћћўлКHF`eNFEHNVNFJCIAWC8‹щьжкндцьюыцрр§ў§§Ьћ§ћў§ў§ў§ў§ў§§ћћњўњњљ§ўўЏWdaWLBGICGIFLALC]amэўўёэщыєєљяьучћћ§§ёћ§§ўћў§ў§ў§ў§§ћћЬўћўћўўюqBVMTJIJNWMM?GLY3QxЃьрђщрпщяђђырпЯћўњўћ§ћў§ў§§іћўћћњ§њ§ћ§§ў‹‰L]‰qYW”nadMTr”ŸщєнЯаЭзмжЮЭЮЭЫЮлщёѓёщЭањћћќў§ў§§ќћ§ћўўаž]@@GOIQSJMW`j][a|’—КубезйыюэхШРСеЮЦжшщэчпгЧћћ§§ў§ФћўўзzOFFGNMTSMMJV[]\^PLWUЇеЭЧнЯлххщмШЦЧмсцччьюхпУН§§ћ§ћћњ§ћ§§фћ§њўўЅH]PFWWNSQICHS[\gd^V‚УўўмѓђыышуагнерпхычшээцзЭЮћўћ§ћ§њћћўњћњўўЯ~SxdYVSH?GFCHQV\YubW–тўў§яѓьщркЮЩЩЮйхчьтсзЯЦНИТћ§§ћ§дћ§ћ§ўўн|žЊbVWMEJNMOMPT;L@iЁхтЦЫЧбкрдЧУЫгдсщщїлеЪЮЮЩОН§§ћў§ўћ§§ўњўўŠPe^GB@MMBGHNSQYP4?MђынгЯЩбгбкпЯжйплстхеЯТИДКОД§ў§ўћ§ћў§ўћћњўўСdZad^qUQLMQQVLPOL[pЧўѕђьудбЮгбжденчлзщьстЮЖЕТЖЂ§§Мў§ў§ў§§ћћўўѕ‹qWG^Z\SYLOHGLMU[::(gдхрчэшхргзржпчыткнцхШЩЈНРa[§ћ§ћ§ў§§ћўЬЛx{egjjPCQLLIQSSJ^bmОў§цмсьётдЫжуяюђёьпаЯйпжЛЊUG>ћ§§јћ§ћўњўћўўоp{F@`d9813?7-ћ§ўў§§ўћўў€ЙТuS[zqW\VM]YaWTYMNkcЌўўђцхяёђёюыщьёыяырахѓщ7.*%.4:&)њћћ§ћ§§ћўўјˆgYkƒaYShjkbbZPTbgcŽўўэчщыьэщхмрткщьщжееь§б\(3B3(,"-+ћўњ§њњћњўўКaYUi^^W]gcYHTLT[WhWЗўэцнстэщпдйЯжсщцрзамѓь*(00-%&,1ћ§ћњњўћўўХdc\a``][a\PCQOUj^MЅўўщслхтнмдкдЫзсыяылзщїКG1!$++2)%4<ў§њ§ћћўˆрpp}^hibaWTNNPTLEL2FЧўѕнцкрцскухцмьююыььхЧОm?5$+(7#*$&§ў§§ћњћўўМqajZ^a]WSSNLL+9PP^ЎўББйпйрщщшђёѓѓђђёхцѕчйРz<2-9#&)#+ћћСњ§ўўт„rSCbi]TWN\VV\UU’dВц–ршцчрхэьяѓїѕїѓѓнЪЯФЮЎnF--;:87.31-ћ§ћћ€§ўўч\@oubdZQVQWUTQ][ŸŒ}сњэїжсуцэѕєјѕљєјѓємЭЭВЖЎa?.4<<8;79,2ћ§ћћњњўўмVYwob]UWaUY[LP?AWmАўўјмЭбйхюїјљјїєђььеШБКРž…?2CF<2.*05§ў§§ћўўТЗH[a]VVZQYQPUZThoaыњртуЯЪпяђїљ§їєёцбаНИЗЫШДН‚01LJ*(+-%9§ў§§ћўў€<[iPW`[VLTQQTJJHQPˆє§тдгдмцђј§љљєёяьнФРОВСЭРйцm;>E:,2<>:ћў§§ћўўыrUmZ[^Va\ch^LHHBG~КўјнЮЫдмщѕљ§њјєюшдНЕВЛЗТЫапѓК‹^CH>@;5Lћўћћњўўхq`e|]T`9Zr{J[YdBBnШўјпдЩЭтњјљћїєяяеФКЗОТСЧЩЪклжУr8-9>A?Fљ§њ§ћўў‘QCV`YSOZdZ[T]PTB`ЎаёыпеанњўњљѕђјьдЧНМЦЩйЮггттйбЯАh:9Np‡Oћћњњўўсur\[UQMOZZOCTJC%5ZИўўчдеауѕљјящьхаАНЛИМТбЮЯгмпаИМмгЎЗ‘}qBћћњўўа”[PVW]WOLUU[JQINA;^бўєтйгЭЮёѕєюыылееСЋЊЏОЯжбгжжззˆтшсщђмЄ‚§ўћўўЏVu}nd`[S\LNQNSPP>L{аўјуцжШеккпзрлгаУЖЂЉВбмдгйпуспцхяяѓѕэгЦћћўўї‹Tpag`eejUYQSZSS]dEwўў§ююшгЮЩЦаЯжЭШЧЩЛАЛЯЯммАагерьђёђяятукмњћ§ўуЄ{^W`^`]ZOSPSNPM@B`ЛўїюшыщэузЭбЩШТЪЯЫСЭдежучылсхьяѓѕїѓчлйнпћўўйЂbomq]S\TZ[`[ZPSPI‹ўўѕшщѓђёщэшэндЦУЦЩЮппьеутыььыёяѕёђыцднпсћўў€ЗˆSn’naWYZ^]Y^ZSB7FЏўёЯЩсюђюыьюэтуЯОИФЫхцгЦЦкцхыыэьђяьхщшчрсљљўћ{84\mhTUNOV^^[V[?E{зўїрмщћєѓюьышцржбгжблкЭТЯмцыщцыьђёєяѓёђэщњўўѓji]`ZVOOLMQYOMJ>BJ–єўэыяєњїљђьщкззаецхшунЯЯсьэююцчыёёяьщщэРњўўЕ[qztb`^`OPT[TO@PGmбўэцрэѓљђяёёэзЧЮЯзуухыхрршёєѓђэщэєїєюымебе"ўwџџ!ў€џџ ўwџџў€џџўwџџў€џџ!џ!џўwџ џўwџ!џ#џўwџ"џ$џўwџ#џ%џўwџ$џ&џ&џўwџ%џў€џ&џўwџ'џў€џ(џўwџ)џ+џўwџ*џўwџ+џў€џ,џ.џ.џўwџ-џў€џ.џ0џ ўwџ/џ 1џ ўwџ0џ 2џ 2џ ўwџ1џ 3џ 3џ w3џўwџ4џ6џ6џ6џ6џ6џўwџ5џ7џ7џ7џ7џўwџ6џў€џ7џ9џ9џ9џ9џ9џўwџ8џў€џ9џ;џ;џўwџ:џ€шмЮУЭЩаЩРЛОЎЋЏВАЌЅАУЖ–ЄБДœ‰ŒЂ–™ЏРДЇЋЏЎЃЇЅЃžЇЖаЭТНбЧЗИЖЕЌМФЭмцюшЮаЮМИЦдгЩЎ”™Ѓ›ЋЯйЯИЖЊЄЎАЕВАЈЁЇБУДЃЋЖЄЋЕЌЂ›ЎШФИЏЛРбЦАДЖБАФЯйшюьЦдЭгжсуаЗŒŽ™›–•›–˜‘žЖЌž™ЊАЈЁЋœ•ЁЌЄЅЃЃЊЈЅ˜БзЦШЭУЖШЫегКЏБЦЭчюьюьЪдкнмгФЦкИЃ”•ŸЇЁ™ЇСЎ”’ЁЉЎА™Š‡–ЃЉЅž˜ЃЃœЩэшбЦСБКДЕНЩВФЮмчцчрпмРЭЮбЩМЉЁž”œЇЊŸ—‘œЈСЯЪЌЌŸЋЕЖРМœ™ЋЛЉ—”‘ŸЦНуыысЭОЌБИДБЖШСЪуцШбдлпДМШЦШОДЉœЁЄЁœžЌИЎЊБКНФМЎЕКЖЏЃŽ’ЊИЎ‘–™ЯхшыуаЖМДДЌФТжзнпсжЩНЖЛЪНКЛУОДЌЂЄЅЋБЊЊЎОЖЅАРЛЗВЈЕШЛЋž™ЈДДЃЋЃЈЕаыёэшрЮУФЖФИРЯйчђёюхЎЅЈОРЦЦФЦКВЈЈЛЖЕШЩШЦТЦШЦДЗРДЋБТНВЅžЅВОЄЂŸДРжёьшлЪОУСВЉЌЌЫлэяђящдЭЌЋЕЩСЕЖВЕИЈЊЦНЎИУФТЧШОЧШИЋЅ›ЇСТШЈЈ‘ЗЖw‘пђьуйЩЭТЩМЂЃ”ТШцёїђьшВ…ЉФагДЉЋЄЅŸ˜žБТКЎДИОУЛТДМИЎЊЊКОЛžŠ~•’iq•ЕСрхтеЯЌКЄ™œЏМтяэёёыйЧЎЌАКМИЈŸВВАЊЊЌЧЪЩФЛКЖРЪШОЇЄЃЁЇАМФЛЇ‡ƒw„КбчѕїююхщдЎŸЂž’ЫзэяђяюсСВВЄЋЖСС››ЎЗЪРЌДМИОЦСОглкЧЂ—œЃЄЅЇ‘{‚|ЇДйђщушмЮФСЄЁЏАЗЪцхяєєђѓнДРДДКОЦНЂЂКФТЖВЛФОЭдУФЭЭдкЎЊВЌЊŸœ—–—ЇЌМДеуслаРКОРЖАЁ’АхшяююыушКЉАОШпе•ДВТШКОзмЪФзрмзФВЎЁЈЎЎЋЂŒŽЈЗВФЉЌЭнуркТОШФЛЃžˆ”ЏрюђєэжРМЗЖЖЗЅЎА~tЦЦККНМЧднсузгРБЊЉ›”žžŸЅ™—žžЩФдкдптыцзФЫЪНМСЕДсљїђяючЫКЦКМЛŸ—ˆŒžДУЛФШбнуцсйгЖБЅŸžЊЖДЃЊž•˜ЂЇнгмцчшртхǘ—ЋЗЛШЪЫхюяђѓэьчючФЉЏ‘}Š‰ƒБЌИЭтчьяулЮЛИЌЂ˜™ЂЊЃ’’–˜ЃЉŸНетсйЭйнЛ—Ž”˜Ѓ˜ЏЕмыѓёэхнЯЫЗБސ‹Š|‹„ТЦЫпэёэшсдЧбС’œЈЏЛРБ–ŠЌЎЗДУснеЯЫдЫЕ‹ЃЃ„ЖрмёяяцчнННАЈЌБŸ˜ž–‹Š„„ЮШЫпэчуеЪЛМ͘˜•ЊМКДŸ—}ŸЪхрщььнеЫНЌЌЋЃŸ™НдшѓёёэщшзКОКЈЃЄЉВБ˜””БЯрхчщзЮЫНЭЛЇ˜ЈЄАЖЎЈ—•œИляюшхлШЖДДКЗРКЇИстэђяштпсбдЛž‚…‰}ЋЗŸƒ—‰мсшцчлЮЭЌ‰˜”ЄЎВЏБœ‘•ŸЧуцщзНАЋЊБДЖЏЗКШлыѓєѓёсжСЯЯИЌ™r‹–АЩЁˆ‹pwьяцстЭЮЪж‡ЏАЋЌБАЉИУмѓхгФРЗЏЎЗЛСРазуююяєёьсзЭФЎЕЁ‰„–СЩУОЛŸРрулбЮкзУ—‘œЏБВБЋВМНЫрццхмаИЋИЦЭаРЗЄЉЯыяѓёэщнбЪЩКИАЉjQАŽЅЗЉ›БОЋЮгежжгРЎ˜ŸžЄЈЌЏАНЪзлшэупЦЗЏЊЈЕТТЦИСхєёђюяцЮЦШЦРОЃœ™]YS˜ЇаФЛЌЂЕИМжЯЯ€ХЧЖЊЂЋЃЌВЂ˜ŒУЩгебШЪЮЦЇЃЁЂЏБЎЋЋтэђїѕёыдФНСИДЋŠŒЂg‹ŠВБ™žЅМЛОУИНЕВЊЃНЦлС’…ЈЮмгркУЖЕУСВВСУДЛКМзїђѕѕєьтЭКОЧЖЌЈœ™’’ƒƒЃЇЅ™•АЛМВКБЃ”œЄЏОТЯˆz™ЏмѓщхжЩЖДЌЏДТЪТжклпьђюяэхЯЛАИФДЁЁДКЈЎЋЁ›•ЂžЕЏБФЭбеœЉЉЅЃЅЎЎДНТЂЇОждупбЪСКММКРУЩЪббнэєяьцеЪЛЋЌАЏЇŸžˆ‰w™ЃЁЅЈp„ЛШЕЧШЫмБЏАЗЏЌДЊЊЈЉ›ВЪэђыргЮЦОЧЩИЕТУФЭчэђѕђьллЭЭШЄЂ–ЂА’‚‰‚ЈБЫжВшуУСбаШНОЛРУИАЌЎЖЗОУйёшшткЩОЗИНОДЗТУацёѕїђэттгЦУЗ‰Š‹ƒ{…•ˆЄжлЩКЧШЧТРаЭЩОАУЪСЋЊЕЦАЖШмугЮйеЦНЕВЏЋЗЦКСкщяюэщрлрЮЃЃЇЂœ’Œ‡…‘’‘•ЄЪжЩКБЕВЇЄАВДМŸУгТ‡tzmuЃхясЧЏЁЎКЋЇŸŸДЗЧгцђєђёсЯЩНЕЅЇŒ˜œ•…™•ŽДемгтплягЋРЁЄОНЉТЎ‹p^JMVgn^{НЫЎœАЖЏЂЌКеэрщѓђєюыЮЛБЖЊЁЁ‘”™Ž…‘—Ё—ЁЇЭдмчмФцУ’–‘ЂЖТhO>4BB;BUmSM5VˆЁЇРДЉАЏЋТмьђѓющЯК’ЌААЈ—ЉА˜Œ—ЈКНЎЃЏЛЮбгЫжЃžЉЌЦг"(,<^[N205:^œдЦБЄЅЛЯхьшццпщВЂЌЎŸЁЊЏНЌŽžœ’”ЧцгЩЕКММЛВЖžЂСДЇЕн..& &UHUMO>842SЗУаЯапытаЯЩЫСЄœŸ›ЄЛЄŠ„ƒ‰ƒzДдбеТЧЪОЏЅЈ”ŽЖОНИЭ&,).$257-5C<:;qЮѓщптШЅ—ЂЎЈƒЂЇ–oz‚žЮлСВБСФУЯэ昘ŽЅЄАФЛЋЋД $#32$#.8ALOIbНуюхлЁjz—Ž‡ƒ‡ŒЊЌРДеьдЧНКООЦб›{”œЃСТРЄАЕЊ!<TЂЌЎЩУv’ЅЄЊЗЉЈœŒ•ЛКЉЊЋЏЌЪЧЧУЕŠ|‘ЌЦТЖНжЯРЫнпр!&(9C<:EaPM}ЄНАУ—’ЃСМЈŽoqКРСдМЕЛНУжнзЮЃ˜‰ЇŸТОЫФМРАœЗЦР+))!2AIC2GF?>@\i™ЗЌžЅxZvЊЄ›‘ЅЄОэаШазжТУЛЌЧТЛИМНТЧФНСЛЖЉ™СпйФд $,OI>LMTj|Ї›”Ё|ˆЕд؋™ЌЏТЯЪОНФЮЭгНЌЊЄЗЈЂЖТШЧЮИЊЁДЏгнб˘!$!!9>CNIM@Pk…‹‰…ƒ—ЛВ’‰БЗžДНЗЗЏАЖНУШЖЋŸЊЈЉИЮстаСЗЈЈЏКЭЫУЌБ$*$5[SJVMT;P›Ї‹–ŽŽŒŒ”ЂБАОЪОНЖЕЅЉОТЛФРКЌЅЕУКЉЖОЩЪЧЗЄЉДВЕКИАНЖ>%$!+-+CjLIJFETНЋ™›БЏЂ–ЅŸЖаЮзбЫЧЗЛЧЪЧБ—‰”ЌЉЌОКМазбКŸЄЖТНЕДЗИЊЏ??:?HBBOQF>]QFqЂЃ‡ˆ˜™ŸЁЃЕВЎЧНЛНТСШНЮЩЏž’˜ЋББЌЖЕОУЮжРЄЏЛУЌ”œКЖДЩ8;TGFnQ@TS^tˆ–Ї–‡Œ˜”ЉЋЏБЋТЧШЫбдЫОЩФОŽŽ€˜ЈЌДМЛЏЏМШЧБЇЊЋМЫЭд’ТЪЧЯЮ&?\Z\j‡iUeqŠЕЈ„—Œ„–ЃЈЅŸЄББЎКТИЧУЦНОЭлЈЃСВЫЫЛКДШжпкФЎДРЮЯаМЕЭбзкз™ЊТИŒwwЃЅЋАЂŠ…‚|ВЕАЉ™ЃЊБСЪЪМбаЩСНКСЌ—ЉЩаЦИОЮЩТЖЎЅŸДЪйЫКИЉИжскЩдснйзШЧеДЅŸЂœ‘‚…‡žЌЏ•ЈЧЫЭЯемаЮЇЃИБЋžЊкШЩЭгЯбТЛЖВИФЧжШЦЕЌЦбжШОдййчхМЎЉž–”ЂЁ”ƒŠŒЕБЕЎЅАЫдаЮЭдЦдТž˜žŸЈЎЕЗбмжИЖСТСТЦИИЧптзЪФепмпЧйдбЯФŸ‘žŠŽ”ŽŒ’”‡НФСЯгдЮЫлткгТЊЈМЕЗКЛМЦЪЮЖЋИЩШЛЕНИККДЅБЖапкШЌаЭЧЧЖЇЂЃŽ‰„‘–~v˜СКАМТШЭжгЧШЯЭЦВЊЌЖЎЃЄЊИЖОЩТЦЛЛРФЦЖУЫЩИЇЇЌИййЩРВблЦСЇ™™›nЄДЎЌЄ–ЕзбЫебШЮйбЧЗДДБЖБЖБЎЉБОЧЕЮТЖЈЌЕОТЛЏЕИЛДЌЊЗЫбкебРбЛОЗw”ЇАНМДЏЄМТЫЯнпаЫаебЦААШЫЩзЮТТЛЫагбТЌЏЌБРФЕНЧСЗВЖКЩФгрсаУЪЕЇЃЅ˜}g‘ЗТИЋЅЇЋИгзнмсчзЮЫНОДОНШжЯЛЈЎЖНФЩЦОЏЃИФМЗЛКОЗВЏЉНЪкжбггЭЕЅ™…‹|t~ЋУДЎЊœ˜ЃСжутлпбСНЖЃЄЖДРжпЩЖЏЈБЕЗЎЊЏДЂДШКБРЮРРЖЏЉИбйжакйпђ€їыяюяььутчцщчщьёюѓтзжтуснмксхщщэщххчшхттсхэьяёѓэѓѓээьяьяѓѓјјљѓёяэхщяёљчупсннтышышюырлрххуутхчычщщуущшцшхтучюяяэђюёѓышшююѓјїјјяяїѓѓђђєяеумссппйаЯанчшрссхусрлпсутхртщчхцкюњђяьэђэёёяёььюїѕѕїїјёяђѕєѓѓђљюуцтртмлзнсщцхнлмуцсплзктцтллнтнлђўўѓёыыцюьщцђыяєѕѕїЭєёяёяёэслмсуцтрнмлпцшыьюруцщэыутжрцутмлттёюћєїђёыьщщ€ТюыёєђђјяђѓєёьыююэыцхухуспсчцшшщщюычыьюэшмкктччуунЮеђ§їѕєяючщьђьёюєєѕѕєяьэяяѓёђююэщхуыыщычыыэяющэяыхыюыьцнмрцхцущрчяћћєѓђёюшючёёѓїјїјѕћчьщщяёюёюёююьщюящююяёяььђяььыщшщшхсхшшьрхьюѕ§ѕєђяюэьчуухђїїћћіўјѓщюѓюэышш€ŠцччшюэшщэёяюёэююыхшьщьєспмачшЮМЧѓ§ѓђяяёэчшщужэђјњћљўљчШшэёююшхчупрршщюэююээђэёьышуушэчпаУЯЦЉЖгчюїћїїѓююурржыюћўљјјїїђыцщюђѕпчшыышшьшьэщыэёёэюёчтррущцѕятбЪЛНујўўѓјѕѓњїчммпкѓєљљяјђђщььыэьєррцэщыююёэяѓъєктмсуухнтаЖШТнрѕўњѕђёёЈынрхыэѕ§ћїјљљўѕлыђяёяѓњчхцщээяяюѓёяєєђѕђћёщучстпклкаЧсчсѓєѕёэяяээщсреь§їїњјѕђљшщщьь§єбЦььюэюяюёѕѕѓєѕёёяшчспннакдксюьѓчнѓѕјїёђёюющчнЦбчјјљљїђьщээьячунЩОыьяюэёѕѕ€<єѕююэщттцтутнмнмйђёяђјѕїѕїѓђююђђээујўўњљњѕєѓэёюёыкгЭккђччыєѓїјїѕїяэьхпнтцхцппллпсљёѓѕѕєєљњубжушьюэђёѕљњїљјѕўўѕццмШагбаыьшяѓјњљљїєяђхрпрцщшткжедЯйщѓїјєѕёїчедпнмгущёѕјјїѓђёыттЮШШЮЪЩУЫдёёђѓѕјљїѕђёїђкнрцььштрЮтцушшђєєёђэшчдрсЪцѕјћїљњјђђэюьщёчредбЭЮееэђєѕєѕђѓёыяэжлмршюыцкЖкљўћўјѕђяышшыышткьє§§јњјљѓёсюючххптсзЯжйкчююѓѕѕєєрюѓхспйущшхрплгыјњѕїѕђюьыыщяыьшшїїњљљјѕђѕјђцЩЭеФсупЦбждОјљїїѓђѓїшСзптцшычсжжкзэњѕђѓёюшщщьэёђєёїўјљњјњєѕюэяянУЮбйшњчЧдЮЏБјљњљєјєѕћЮмршщыщьхЩсьюјўїѕѓььюёюььюьёєїњљљїьѓёяёщсгЪШЪеѕцћѕяцляєєЏїјђяёеЯтуыыщыщэшђјњїѕѓюэышэяюящьлёєїїјјѕєѕєюяяюцШЖ‘дыжьщыюшхыїєѓєєёёялнуццхцшыюёєєшјѕєючхцыыьшэьћўјљљїєїєђёёЊхкдЈž’ащњшхрхыюэєѓѓђяючщушчурлЦзюяђёяђёёђюццчхччщтљїљљњњїїѓђяяьхгЯтЧДЭаЮшсрмутьэђяђэыууЏшўѕЫНлѕњїєђёюющшшыщыёььяѓўљњљљјѓђїђээщхрЮнббШЫуцтсзэыюђышсспсучшэњЧЊТчјўєѓђэьщыщььАѓюёђѕѕїјљјѕѓяяюыщшьщххуцупрпнхюяюђђѓшттрнрсутршЮЮцѕїѕѕјѓђюэыьэююђяѕѕјјљјѕїєѓшьыччнмедШмтххтЖЩђьѓэёєёчшштсплрзгаТеыљ§їїВђёђёщэыььюѓѓљњљљјљђѓэєчсущэжабЧШшюћљьўўєєђђѕїыыцтркмпннпрэљяђѓђђяьшшщьщыёѓєјњљљ€јїяяэёнбебЯЮаебуўўэышююьющьэющчюшЯехьлехєђхшшьяюэщчщшшьэюѓїјїєєѓєђнрхчурйжздгзЯлєљђёюяэщщцщючЮхщкКЂ’‚~ЉыњјыЫОЯцтсхчххёѓєїјљјјѕяёђшпнкрркйжйеЭцјјѓжђўјшнччшэдсЫŸo`[krua~ЩѕрЮеллттшєўїљјљїњљёёаэьшпмпнллйпмзкпјєјђђёњђйнтрёёt[HGMJPM\wZVCežЯмчллКцщыђѕїјјєѓуЫцэщтххччхрмтѕєьшхсьяёёєкРЧсцьёђ2+0,8Ced\HAB@eЗёёнжмьђѓѕєєШїўычушщщухсннжйплїўђэюэёђэяёучхэуёь%%;;4;PP]TTSM>8Z˜гыѓѓєСѓѕђѕёяпхччшыстмжеддРЛнїєэѓёюьщшнмгёяђѕё).5:-1,75>ABJNZABSйьѓљїїТєђяяьычщхчсснжздзМЮѓјљёѓєюёыяўѕнхђёюђя102592989B@FB>:500WЅмюўјј€ўѓёѓьюэхпсрпЦУЮЦцякьњїюяђёюђюящчшччюёђя+$&.4:378>FGA5@C-NpЃпў§ѓђђёюэщцутмннздЯЈНяїюьшшщѓђэьшчыычушьђяё$"$!,3;5.5[NOOIUpŒЦанлсЯзєўюмлнсцщьяээяёёыэычьушяюѓєѕюяшусщёєђшж"$!-,,"9EELUVQGV{ЈФйдд€ЯтраЩчёжмтустсчюђээшэщчшэяёёєђьхушѓэяючы79+)01"1k[QS[VB^ЖгЯлезйггмьцььящшхнмхэёѓьюцшщшьяяѓєѓючщьыяёёюђьы@B3004AOmSLQNM]ЎьсйзнмнмстжцыёюяёюющюёэянксхьюыюѓђѕєёьщьющчщьщююFG?CBJCYZLC`g`”емЮежйнпушцыёщяёѓёђяђјѓшуппуыщшчюёђђьэяэяэщппщьёю:;aLEr‡TISemŠАгшйдджспцщшычыяя€žёєюяёЧйллцээььэюёяёэщюёђјјЯюїѕєђ)E][bkŠk`r…›гйЧеажмухутутхчшщээѓёђѓэўпнэяјэђюѓяђєюьюьяђѓюьышєѓѓяЎНбУ’~˜ЎСбммЭЩЧЭзумррхуыьэюьѓяђяэюђыусшюёєєѓёѓёяыыяёёяёђчьююђђжыёххсзнчжжкзздаШЪШУнурххщяђёђяєђпТрсцсхшјѓѓяёяёяяёёяѕєјђюяяѕѓєётщщѕѕскйкзжжлпкаЫзюьычхшюђєђєђїјђсмпхцыэєяёээыьюяюэяюяяёёяёёѓѕёющёюэшзЯнжаджмйдбзпЯечьяюёђѓїѓѓЊїєщцтшшыьэьёыяюььяђђэяяюьышяђѓђюьюёёэшскждЩЯжлкзЕеїёэьюяѓђёѓђёђюэшьчщыьяыьэяђьыэюёэёьээцяђЦюьяьђёмжйдЯЛпэцснЯшїїђююяяђѕђёььюьюяяэююяьёьђэяьээюьэыэьэщщЦьђѓђёёяёщшжМЫУйсёїчцтуьёёєєѓєєѓђюьяяьёѕяёёюђёѕєяюющэьыьђюээКьяяѕєєѕѕєѓьрнудЪБйѕцчцрсцяїѕѕјїѓѓђяёьёыёѓђђяяшчээяяюэёьэюёяѓяёььёюєѓєѕѕиюхлЫЯбЦЯёјяэхстшэђєїљїїѕђюющыяёюёѓѓюэыюяяъюэѓђююђёяєёѓђѕѕђєєїђєњ€БёяслплтлбЪЫЧЛНТЫШУТЮйЫЖЗШШЖЉЊДВЖФжЮРМФЦНМНМКМЯхшкмцмежаЮФЮепэђїѕпшхзЫйчхпШЕЖВИЎВЛнхнЫбННСЩЧЮННЖМЩйЩКНЦОШЮЪНЕСгйбФагртЫЭЩЪЮлчшљѕѕкшуычюђшЩŸЇВЌАВКЏЏЅЃЗЯЯМЕЧЩШММСДДМТЗИККТФЛЇЫчйдзедсхщужЩЧтыѕѕјєѕпчьђёэсзхаЖВАЕЗКДАЉЕРбШДЅАЛТРЖЅЂЋОСРЖАЕКВЕтћљштеЫЭЧЮЯкЫжтёѓјѓёщюжмлцйеНДАЊДТСЕЉЎЈЕМаусЪКЕНЮааЫВЕАОдФБЏЌЗнйѕѓєёхдЦбЯЩУЪземяящушяђаазсмжЮЦЗЖЖНЖДКТЦУОШЫдлЭЦкзаЩНЋЋВФгЦААЈЉпљїїѓрЪШЩЪЦдкышюьёырзЯдйггзндЫФКНРТШРТЦдЯЦФдЮЮгРИЭсбСЗЕКЧУМНСКЪрјўєєьчлзЭнййтюєѕјѕєЩМЦженпжтжаЦЧгЭШмжмзмзлзбкгбЧЯйгШСКСбаОРКЪзцњїђшзаелЫМНОряѕјњљ§ьуЧадкдЪЫШЦШСФзйФЮенкрпбйкЮТМЖСмйнРСЖЈЫЫЅЄюўѓяцрхмнбНИЌапђљњћјѕЮЁРршцЩФЦМКЖАМСаФЧЩажздгабЮУИТдлЭДž—ЇЃzŠЉЪаёѕђьчЭеРЗЖЎОЯѓћїјјєыпШФЫгнмСЛЪЩЦРРШлпмгаЪЩйппбККНЗУЫмлдЖž‘Œ’ЫцјўўїјёљцЩКЗДЊлшѕњљњїёзЭЮРЧЯббДЕТЯкзЪЩЯЯдбдесэшжЖБДЖИРИКЖЁˆ˜ЗЦчћљэѓьркеВМФТЯчїѕїћљљўяРаЩдгкгуЛКЯнгЧЭдймхшккцшцјеЦЩОФИЕАЄАЁ™ЦдУщёёхмдйжЯЧРКЎЮљєљїљїђѕбОСЫрѓхЊЋЪЪдйгЫшьхныђэшкЯУОТФЫСБЃЂЋИШСпШКуђѓячжбпйгФЗЉЦђїћјѕэгЩЯЯЮеЦУР›ŽпкбгЯзсђяяёэцкбЦУВВНЛИКЕЎВАтзчььюёїѕыунрйбдеШђўўјјвѓхедгбЮКЏЂžЈЎелЭлнцьѕѓѓюыЯЧМЛКМЫЭЛУБВАМКђхэёѓђђ€њЭАВРЧЪгцрюѕњјњїѕѓўњрЦРЋ—žЄžžЫШЮмяїњјїђрждСЖЏЎЗУНВЊЋВЏДЗгщєёьцэьЮЌЋЋБДЋШаыїјњѕѓяцлШСЃЂЄ—’žЂкнрюѓњїїёцлызЉЌБНЫдйШДŸРРЪЯмёютунхзШЁЛŘЪья§їњѕїьлгЯЧЩЭЗВЗЈЎБЂŸЌлмхяїѕђчмЯЭгЌДАНЮеЭНЏ‹ЕчјїјѕѓэпйЩЪТТМЛЏеьњћњљљєєшЩагОФЗОФЧЄБЌЌЗЧкюёѕѓяхшжсЭКЏЕЛЫЩЧМБЉЌЫѕћјїєьмЮЮЭЮЫкЯШЪэёјјѕю€VщьзКœ›•ОЪЖ––ЉЏžёјєѓёьчэЯЅЎКФШЭЩЖЊЕБВлєёїючЯУСЦШаЭЭЯся§јљњњђьппубЦИŽ™ŸЎФрЗ—Ѓ‡ŒѕњјѓюххчёЏЂИЩЪФЧФЫžНйдёўёьсегЪЩдбйкчшёєјњљїјєюреЩЮД™—˜–ЅмзулдТВдяѓчттьщгЋЇВЭЭЩШЧЫгЮрђјѕєэцдЧЭепцдЭООцѕїњјљѓющстйгЮСbЌУЃУЭЧЕЮаТчщчьычйЯАЕИТЦСРФШншьђєѓярбСРЧЪлжгдЯєўњљњїєщрптждУБŸujeЌТчкЯЛЛЭзеьччырЭФМРРОЫЗАВдртщупмрзСМНМФЧЩРЦѓјљњњљѓэмлйбЪУЄЕ•}˜œŸЪЧАМУЮЪллгжгЩТБДЦеэмЁ—ИкёђяьаШЭеЭЦЧмгЮЪЯЩыўљљ§јѕяцжпйгФРЏЂЎŸЋŸ˜ИРРБАЪйЯЫгЫЕАЗЖНЦамщЃ…ЃУёћѕёысЮЩОТЪжсйшыьюєїљјљєчжЩЮйЫМНгдРЦСКАЏМЗЩЪайлщыКСКЗЕЛМЦЫЯдЕВЮцэяьшцмпедЯЯруйцлђљћјєёьсбУШУУМКВЁЁБМДСНŽЁдндЭбчюЩЩФЦТРТТЕИЗЊФтїўєёыурплсжждмйпяїј§љѕяьпхнНИБНШЅЅ™—–НЩщяЮњћпсьюшыаабаШЧТФЦЩШЯшўяѓяьтегЪЮЯЦЭЩЮрїјњљћїѕђсззбВžЇЂ–‘ЊЅРђэпалкежзскедШжраВТЪзШСйюђпзуцздгЫЭСазЭдьђїїјѕђуяуИЛЛМЗЋЂЇЄЉЃЈЈОшятгЩШЦРСШЫЧдЗзрЪЉ™ˆ…v}БєћђкРЊФЯФИИКСЧныђѕћљјђунЮбСЛЈЋВЛЎЂЉЈ˜ЧтяуяэыћуЦбЗНегКбР›xn]dkk‚ЧтУБСЧСЗТСтљёєјљњјљнаЪгЪИЖЋЎИЉЉЏАЈЏЛхьёѓшзѕрЇБЌЖЩпpYNJPSS€†h‹eaFj˜ИОЮУОСОРЫуїѕјљјхЮžФЭШЛЇЎЧЭЗЃДНкжУМЧЦзухйшД—КУЦдн1(3A0:HTvqhNIHHqАхнФКРЪпёїђєђѕњЧМЦСНЖИФаЦЋАДЈЋлћтмЭкедЮЪЫЛЛжЫСещ,1AL@1GgaqbeUJJћeЫгттДђѓясспкйЗЕИКДЖЭИЋ—ŸЅžŽ”ЦцсчлчдЫСОРЇЊЫзлгх-5@EAI?HJHM?MSFFH@@<`ЊрюўїїђытЯкгЮРБЇКЖ‹Ѓ‰ЦЧЗЮхулмуьшрлЮгЫОКУкцеЫ-5>89JPNGJOWTHGLI5U~ЎщўјёшлзЮЫаУВАДЛЊЇœ›zŽЭхнзЭУбннмТТФааРВецужд**9-388\V13+-4AAE1357%"4A98(-+L:015&МДБЎЏЛТакюђѓєюшсмЮЪЦЧШЧДЁЊЭнкУˆOEBIML2F4IOHH?8:?3-++05%+>>B%!НЦРИКОЩлыђѓїёымзФВВЌСЛРИЗерйззёКdMZbt];B7?03+99>CB1:;98><7E>73&#ЯжЧРРФмэђяёђєёццЮКЃЃДЄЊЉМатыѓїљљЦQYATQG::40?HCHE5>E.4.%$%+#жРЋВЫуэёєєёэщцЮМД–žŸЈЉЊЧЪбйтёѓѕёєђЪŠPO9UZE7,;;0"170.&+*)!! КЁЅЅпяюёёячмцхдЪМИМЛЂЌЧйзеныюяёѓљћћјзYPTP754).%&-9<1)+25(+!##Ѓ’™ЪёєяюэынуэмЦНЩФЖЊБЕпжжхуяѕїѕѓѓђѓюэйЮЅ~A@`I)127?918*3,.()&&ŸБВюїюэюцуштрдЪЩЕЖАУРСЭЯуыяђєїђђёяюёђчјјуЅƒ`@&;F?8$&1!+%-&$#ЄжюѕёёэцпеЗЇЕВЊМЛаКЧЯдЩЩхёїѕѕїѓяэєєэснмгЭжбЉ‹V*4I>>95*%"("%""#ШмєђёѓурйЮЛЈЇЄЕИСЎВйньчхяїјјїѓѓѕяђьчмгЦЛРУййїŸZ>4-*1.+$&&$*)&3#"уюђющудгЯДЊЅБЛСЕЗЅ˜ВсюђїјјѕєѓштснлбалЮЫШОТФнзŸg:)(:33J #*%яђэыраРЩЩ€ЃЗЊЄЊЖБДЗЏЭлюёѕёѕёюцтумчткЭжЫЪЦЦЧждлбСВz*8;8b$8"!!%ѓёяшгРЧФЩМКЏЊЌЖАЋСЭлїїјїёыхптыёюёэтлйаЦИЖНФайэйЯйШe;Bga$&1&$%.3ьшхпдШЩБЏИЛеФАРЗИЩрэѕѕяяђээщычыээчппмЪЭЭЮайрнн€ЇцёїяЖ‰>?(,8**$$!"унжлжЭКЌЋИТддЗОЗЭтюѕѓёыххтуцмпхлйккзгкедднтхлплрюђјјюu:,$+7%4&&агкзйЧМИБКЪШДОбйрьэяђђяэусрплрнЮЮЭЪУФекупнздеаЯжсуыёёђЯЁHFH4?9.ЫЮжцпмЦДЉТЭОСЭмыёђёюящщ€шзжптлЪЫЭеЯОЛЪблцрмЮЦЪайлнппгуёщ{‚d297B:чтпнндИЋУбеЧФЫныьэюшээьхччщймШЩТбжбЫкжйппйкебзушуентсмгЖЅшсЛ‚PB7нуьчпУЈЏЦЩСФЩЮмчущчуыьсщыцргйбкстммнпп€ŒейЯлнуржЫжнпеЯйспзЊЛдмЯЊhсцпюкВЌЖТЧЭЯгйсщюшннлрпсхмгЯТМТбзЭЮлзджййлдйжзаЩЪаЯНКЭУРЛЖЛУАднйЩЭЮНŸЌжгзЩжщяючьрумрпкдлжжкйелаЩЩжммкадгзуэтдгЯнжНН€ЩЩЧРЛЗИТМНшђЛЕЇžЅЌжпндуьщхчээхмпуштбЭТУепскбЧсчсмУОкпкнщтЪЫТЖИУФЭаЮШШЪВныёѕНЛИКАЏмяуллцчмлннпхспднбННЪЮйЭШЭЭЪФдлЦИТззййксмаЯЦШЧЮлжЦК‹АхѓыэшеаЖЕВБОдкйпрппзжбЭбйтнккмЩЭМпУЭжжркснгЦЛНаЩЪаЯЩКРУЧЧбгЧ…mВЫзее€ЗЎЗЋЗНРбстпзШаегеЪЭйзОИОубwMЏННмслЯЭЦЫЪКЪекЯЪОМЗРЧЪЦВЋЏхп›ŸЧжддйЭЛНЪУЦШжтндаЯЦФУЧЫТЛУЫЩЗзжмеТМЪкзЦНМШСТНСЪЭТТККНЭЪРРЇЉЇЈŸ–›МЛСЭСТЧЪСТЩйЪбмйеЮЪЗЕНИАЗКНКЉ•ŸЄИСМВВИЕЖТМРЛЗЦЩОВАЕСУНЛЦСЕЏСУДФаЭРИгЮЖЕЦЦМРЫУШаЫФРНРМЫОИШжЭМИИНЯтТКМВЉЊЏФУЮОЪУООЏАЖИЦЯкраШИНСаззЯЭЛРЪУЫЮЪФЭЩЮЩЦНКЪгЫЭЫЗКлбЛЗШТРЖгдЪМЕЗНФжеЧЎЉЉЌЈЈЛФЗФЩШЩТЛЛИФЯаеаЭжгеФЫбраЪабгУЕЖУОФИНЮЧЮжЭСЩМКМЦОАБЩРОНЫЧНДЏЌЅЋБОЯФКМЛЗСггЮУФЭНМбгЧЛФУЮЩЪШЦУТФЗЏКЩЗААОЛЪакЮРУФЖАДЮмЩЗМЕМБЄЈ˜ЇОТЛШЪДЖБОЫйаЦУУМВДЦРЗИЦЩСЗЭЮЧЩЦЭЧРКННИЋЕУУЪЭкТДЊДОЕСТТВЛКНЕЗМУЗММаМЖНСЪЩзугЦЧЩШФТНСУБЃЯЯЎгйннугТЦддЦФОЮЩллгажШЛТФеЪТСНКАДИУМЩНЕЗНЪккшхцпстбжйСТЪТСОАМОррзймкчлгмсхмЮЦЫЫЧОЛЯЯ”ЮЯМЛРСЧЦЦНЋЏКРРЪНЛБЗЗаммрклйЭЪШУЮУЫжЮТШЫЧюьржерсббЭЮбРНСЫЧЫОЊЗАЎДОЛМДОййЕФЕДЕМЭЯРЦОАФттнкмдаФСЧЭЩСКУЮЦаЪзьюшш€ПщчкЮаЮЯкжзЪЩЦЭЭжЮСИЗЗШСЩФЮЮЫФЦЦЩЭШЦООжЯенмкзЯЫЦЧЭеЯЭйспЭдЪЯэшччмйнйгЮОМгддЯТНзкйЭУОННИДЌЛЩадУВЎЖСЩагннзЯЫЮШФУЭрнгЭжзЭЦЦНББВпдезЭжаЭмдЯкждеЦЗЎЏМЭУЧЧШааШФШЦЕМДЈœЋеЮлушпкЭТЧбдЯебакрйлеЧЦНЕИТЯСЫйгззйццлемжТЪФЌЎЦЮМТММИЛЏВЌВФЭЮгЕЛзмспкйЫСНажгезнбЮЮзпЦЛЛЭЮРАрЪЧЧНЪдпегЮРШЫЧЭОМЖЦЭОИЏЧЫкреТМТЦЮанцтспбЮЪРВУмхмбЩгщШЗУдхдОТБЉЂзЯЭСЧЯЫЦЩбЦНВЏЊОЯаФЯЦЛНИРЪбЮИББДШйччзЮЭжбаЭОЖЁСаШЫЊЏži4–ЇЈЂЃЕДœ˜рдИРЖЩФдкЦОЌЇДИЕЕОКЕКДАŸОймеЧЕСНмшцйЯезбЧНЕВЛВЌЌИЫЊ›Ёo}Œ‡ˆ—ЇЎВ˜‘умУИИ€фКЗЅЈАБРзЫФМЏБКОУЭЯедккнсььчтШЎЦзЪбВЊЎЊРЋ—™™‘vЃŸЗЄ˜ЈЋВЎЏрйЯЛФЈЇЗАКЋЏБУкбФБЁДаЫйлежклмщэыхскаТЮЮШФРРЗЌЌЃœ–Œ™•’ЁЋЛЋЅ’—ВЧеэаЛТКА•АшНБКЛОЯЯеФЎЃЅЩааЫНЫхщщрсргШТДЎЖЖЛВБДЊŒ›Ђ›™ЋЂЎБАžЄЋВЦШЫбЦЩЯепусЯШЕРФЧШЗЕелЫЗЩзмлсьяцтедйЮТЪбОУТЛСРАА€Љ’™ЅЉЅЃЃИЫЧЪЫСЗЏНкмкЮШЩЦРЛМЗЛКУВУЧШТЩСВœЌзучёчннпйЦШСМОУЦЧЫФМЗЎЋБЋЃЉЕЛДЏЈВАЖИЦЦебрццЛКЋБЏЖТЭИОЦМЭкЮЛАЦЦЁЩљјїєшцптгРССЫгбгнсУЋЋАЖСаФМЛМДДЈЏАВКФЮЮРЪШЪЎНУУЛЏЏЋЃЎЗСжпжОЦбмщёяя€шысжкдаШТЫЯлнмегСЖЋŸТжзабегдФСЛТНМООКИМККЌЕКЗДВЅЌЈВЫЩЮИЭЧЦтэђјѓяэпШРФСФРУУИТНРЮзЮМЄБАЏОЫждШЮЭагЩЦЊЗЦСТСЛУЌИЦЗЅДУУШВСШЪЭбкшёѕђєыумнжзлемджЮТОЗФЩдЭССУЕЕУаемекйаеЮззЮЭСЌНаШЖЌЗВЄЈТЏЕШжмртшяђїђыынЮФЭСКОалжкгРИФЪШУЭРРЫйУНЛИЧбжпужсрдЮЫКЂВТгБЇБЪУРСЭмхтЯчяђёяющтпжРШЦОФЮажЪФСЛЧЧШдЫЩЭЩйекЮЪРЮннжайдаЯЩШУЭеЪЩОЏЇТЭЩУкхщыэёђяшйдужЮЮзсрЫФжазеЫТССРЫЭНЧШгЪЮШЦЦФЩЫЫФШеЯИСЪОЦРМОЛЦСОЗРЮжзуьюђѕясЮЮЧкцчсрмржЪЮЛДЌДУТЕКНССЫШЩЦЪРЭУЧММТСШШЫЯЪЮМИЗТНОЯгЭбжзцшяѕѕєэцдетакпжЫЫЪЖУЪКАЂЅЉКЪЩШЧОУЧШРззжлбШЩЦаеЫбЧШУИИЦЩШЕАУЗКЮнсыѓїѓьчзОТЮлцсннйОИАЉЋВВНСДОЭгадЪЦСЛРЭгмдклмзЭЛШТЛКБЏБИЖАŸЉШШЮсхюѕѓёяшдЧТРШнпалЮаЛНИЗКЭйСРЛЭЭбЪЧЕЌБЗЦЭЮкрсснйеЧФКЛЖКУБЌУЛЖНбгеэєѕєѓѓымкекнхшпеЪЖЖАЎЕЭйейЪЧЫЯЧгабЩФОНгЯЭалеЪгеаЮЩЏДУЩНТЮлкЪЭзчяђїєюыьчмххкрцшэчлаРЭУУСЦЩЭУШЭЭЫггбаЫкжйдЮУШРЦЪЩФВАЎЏЮйггзЯЭжЯёєэухчхркааЫЮЩгстраатчщнтхргЯжуйЯкпккнджсшмеЮОЩЦЩЧЮЮЕЖФпчнЫЯЯРЭМѕэржсмесмйаЛЗДУацмЖНЭддекзцхьшйузрчштщсунлсйдОФгдТВСШМФЯеаЮдбЪЯТђышыэьррнсжРУЧЭЮйжЮЩЪЛЪйрзйллмзепсрцрсспйгйеШЧЫЮлдбдЮаТШдЯЧЦШРБЛнйзтпьхйКЛдЫНЛНЧЕОРЖНаекЮТЭйдкдлнмрйемнзШажЫЭмзгелкпсужЯзгЮлеЧТЪѓшчщтщююэђяјјљљїѕєєѓюѓюєлгчьШvC7<[W;78980?CH;>8;>:3><@B54,ѓэююёєѓїљљјљљјїњєччшцщхьэёєє§ўўщЫ…Y[?SPJF?<A7422*н+&$щеЪюўўїјїѕњљєєїѓюытмсыїєїѕјїјљњњдљњ§ћшпЏ~B@iC48:>:484744-0,-+%пху§ўјїѕїїєђяяѕьђэячюђюѓђљљУјљњўћїўўцЕ‘a>(&PLC782.4*&)(*#"йѓўўњјјїѕђьхщчюьђшєёѓяєєѓњћљњњТћјїјљђючщюцЖ•\,:N?99782-"#*(,-)єєўљњїњјїёяьушцшчытёћўјњљљњњљњњ€ˆљѕїѕєђяьыщёњўЌ`<5023252&"+4:20%ѓјљњљѕєѓёђяьтуцщцумРпѓѕљћ§§љљїїѕїѕєєїяѓяюяьчѓыИt@-*,58J&#%-()їљ§љїєїђђэюшсхчэщышёљ§јљ§љњљњњјљѕїјїђѕђяядюяїљыж‰29:Ea4&C%"&-.(њњљїїјёђюёюющыэьяэѓјўњњљ€‡њћљјњјљњјєѓёёяьяђє§єѓњбm>Gnb031$+,.8њїѕѕєїяёюэђьёђьюёѓћјњњљїѕѕїјїјѕѕїѕїїѓєђюяёёяѓѓѕћўўјК’EC51@321+-2њјјєєђёяююђящюшяюѓѕјњњљњљјјєїїѕѕєђђбѓђѕєєђёяѓюяёїѕћўї<:(1>0020ѕєѕјєѕђыыёёюяьюђєєїїћѕїїјєєЦїѕѕїђёюыщэѓђѕѓѓяыщьяђѓѕљўњеВQMJ5*C9<їїјѕњѓђяєяёяьюѓѓѕєєїїјјвєјјїєёєёєёёяёёѕѕєѕђяяюђїїѕєєёљўљ’™o?<8љјѕѕѓэышщьђюьёђђєєѕїѕѕљєїѕєѕёђёяѓєѓђѓѓяђђєђєєѓєѕѓѓфёѓёљїѓйчэјрЖoјєјўѕшщэяђѓђєѕјј€‹їљѕїєѕѕѓєєёђёѓђѓѕїѓѕєѓєѕѓљїјѕєѕєѓяђђюёюыццщкёєяѓюђшпдхљѓѓљјјљљњјћјјїїјїѓѓђяёєђѓѓђєїјѕєѓѕјјїїјђѓяюђэяэёююьэшчтїћьчццнхйїѕѕјѓєјљјїјљїѕєєѓѕёєђђ€ЊѓђїђѕјяяѓѓѕїѕѓѓїѓѓђюэяђёяюээчђѕјјєёящщцљўєїјїѕјїѕѕєѕїєїєєїяюёэѓѓёђёєѓяёяюяѓяяђёђёэяьюђяєюцУйњўѕєїэшьцщьюёѕїїѕѕєјјѕѕїљїєѓяћћям§єѓѓїєѕђђёяяђяѓёюяюёяёёђююёдЖмєѕяяѓюычёяюёєїї§єјѓѓЫђѕѓёёєяюњєЇƒзьэђѕѓѓюђюэющюёѓяяэђђёяьычкўњЧмѕьёђюыђђюѓѓпђѓїїѕђёыэяюэяющјёѕ§§љјьђэяяюёэяэььшыюёђююёщщрсрЪезђюяэьюяяђђцюѓђђѕђђюяюээюьяюятлетшьыьщщпэьёюёђёэьшцыэяѓєѓёээщѓэѓљїээщяёёяяцёяѓёяююёѓёѓээяђёђѓяьђћўѓяььёёяѕюєьюьччцыёюђђЧёэяэђђєѕєюђђѓђёѓєѓёєђѓяяёђѓєёюѓїяїїєюяюєяђёёђяэёюэыьшчухччљђюёђююяянєѓёђюђэюђѓёєєёђёђѓёюѓяюэщёюэѓѕяёёѓююУєяѓяђэяьшхттцуьяэёёэыэяюяяђёщыяэюёьяѓяѓђђёђђяяёёыьшэщяяѓђђяэыыцяюьюђьёэяяцчучьящщюьююђяюяяььэыюяюёяђѕёєѕєѓёёяёяююзяѓёѓюёэяэщяыюыящёюђёюыьыђьѓяюђёѓєђєєђяююээ€„шчщѕєѓєїѕљєєѕєёђђюѓыђюёѓѕєѕѕёѓђѓђђѓяэыяяєюђђюэяёѕѓѕєїѕѓїѓяѓѓђєёыяыщјєѕєѓѕђѕјєјѕђюёюђђяёэђяёэёяюёёяьщщшщюђёђюычяѕјјєїѓђђёюяыяэьюёяяђјјёљјїѕјѓїѕђєюёюѓяяоэёьыыяяђѓёяѕыээюѓђѓїёяєюёѕїѕєїѓѓёяяэЭёєяєѓћјњїњјѕїїђёѓёѓѓєяђђѕђѓёюэюьюэѓѓѕѕѓёяююђёђїяєѓёёьяђѓёюяѓюёяѓэяяїїѕѓѕєє€•їѓєѓёєѕђђѓяђёѓєђѓђђяєёђѓёѓящчэѓѓєѓєѓѓђёѓђёђёђєїѓѓєѓђяэьэѕїѕѓїђєїєїїђїїђѓяььёяѓёѓђэььээьђэьупмјѕѕјїњїєѓѓђѓѓёѓєёёєєёђэѓёюцѓѕѓяѓѓѕѕєєїѕѓѓњђяёёюяђяяђђёѕђђюэјєхьћјѕєѓђђяђђєѕѓєђђѓќёђюыыЬьэєєѓёєѓєђѕєѓїёюђёєёѓёђѓёѕьёђюээьюєѓѕѕєїѕѓѕѓёюёэёѓєђђЃўьлцљўыэшщттєєёѓѓёѓєѓюђьээѓяяёєьёѓюьёђєђђьчэяѕїѕјїљєїѓэяыёьэєђчхсЃxзпсржцхсжєђѕьђюїєюящщьыюьыыю№щяэяѓђђѕяђюѓїєєѓѓЭяьющььщяѕщруТУдШлппхпрнњєєёёяюящююшыяяѓюыьэяёѓђєѓїѕѕївњћїѓєяюѕыьшшьчшуплкОсняурттрнеащјєёєтсхчяыёыёђђїюшцшщѓёёђђєФјљњїѕэюыььыьычхуцсйзжрнлуушухсуюљўѓїёяюйьўђяыюѓђєяяющяюёєёјєєМѕјѕєїѓёяюьэщэюэшрмнснкншчыэщшутчшюѓяєюёѓѕєђђэђюяђђѕїюыыюьїѓїјјљњїљїєєПёюѓююђэщэщррпуцшшышчщшщщшщьюђїэышьяѓёђёѓюєюђёяэящщйєњћњћњљїєїђёёяяђщяььыхрптцььэшчтчшэыёыђєєђђьящэююыёььѓѓђђ€Аѓэђлэўўњћ§њљѕѕєёѓєѓїѕѕѓёёщччэыяяёяђыычщшщююыђюђђыщыьяёющцчюяюяяѓяёѕјћјљїїѕїєїђяёяђёђёѓђђьтчцыяєєђяяѓёђэшущёююэююэьюяёьёьяяэѓьїяёїѓїљњњћїєїїѓѕєєђяђюђѓђяяьщтшюэѕїїѕєѓђёђьяэюяююђяяѓюяђюэющєёђѕєїїњљјєжѓєѕєїєѓѓяѓёѓяяёюэёяьяёёѓёђєёїѓяђячцщьѓяёюяяјчяђѓєѓѕїїћрњћљјѕєяяђѓђѓєђёёђюёѓїёђёђэђюьёёєєыђјѕѕєєющшыђяяёёыђяёёѓѓВљђїљњљјјїѕёјѓєѓђѓѕђїѕђѓяёѓяђђёђяѓёђюёђєѕєїєїѕєєђѓяэђяюьяыюђјђѓєѕїјљљїїјєїњјјљїїжђѓяэёђёяёяяєяєюђюђёяёяёяѓѓёђєѓяѓэюёээёёяѓєєњїѕїљљјј€ЉїєѕѕїѕѕєѕёєѕяђьыэюяѓяђяђяђюђюѕёєяѓёёѓѓђђяѓюђёёююыђяяёєѕєљљњњјјєјїѓљїїјѕёьѓэьяюющьюёѓѓђєђёюѕяѓѕѓїѕѓєђёєяѓёяяђюяьюшэёѓђєјљњћњњѕѓїѓђѓєѕѕєёѕяьчщьёюыђѓђѓѕђёююёёђєѓљјїѕѓёђьээщщѕчщьшщыєёѓѕњњЋљїљѕѓѕјїїљяєюђэяюяёёѕяѓђѕѓєёёяьёяђєѓѕљїїєёёэёььщчэђэюэюєїњјћ§ў§њћ§љњјћњљњљѓєяюёёэяѓёђђѕїёѓѓђёяђёєђђъѓѕђёђюыэыьяѓѓєѓђѕюљїљћћј§ћїї§јѕїїЯљјјїєјђєєѕѕђёєєёѓѕєѕєѓѕђєєѓёђюёяёђёёычьэђѕѕѓѕѓяэљљ‹јїѕѕїѕѕѓєђђѓѕљѕєєѓѕѕљїѕєїљљєѕјѕїїѕѕїјѕѓєђёђяђёёьыюьяяђђјєђѕщщњљљњїјњїјѕѓѓёєђѕёяєёѓёђѓѕњїљјїљєјѕѕїјєїѓєѓђєёєєёяэюьэђяђђсѓяяёчэљљјїїјљѕѓђђѓюяюёюэььэїѕѓёёўѓєєњїѕєѕєїїЈѕєїєѓєѓѓєђђюяїђѕђђѓїѕѓяёёљљћљ§їљєїїяёёяящѓђђєєюѓђєєђђѕѕљѕљљјљљїѕєјѓђѓђёѓѓѕѕїїјєѓѓёѕјѓѓђёёѓРОКЪнхцгбщѕњљљ€ЯћїѓьяюццмИИйэЩƒMJO{kOMHINFUVVOLNQMJHO`UM@C<`P7HO@ШЭФФТдззыјљ§љљєѕючрмнпрЩЖСсјчк™aW^^c^HWVZbbWSLQYILFLPTPNEaVPH92AенлйейзюїћњњљљєђпаЫТагЮблёїёцђўаv]tu…kSQU\TPVPT[WaSSU[\WH[YQJJ?8ччжзйхьјљњјћљњѕјрЧИМЩОНТешюѕњўўзп˜ghJgdeVPPQZn`]V[TPSIG9EGF?A7?:цЯРечяїћљљЊћјјчзЧАИКОРСпчшяїѕљљ§ўўмŸcdIqeVIJPYOQNIPQOEG;A?C<@9.0дТДДшћљ§љњєєѕїющзадбЛШсэьяѓѕљ§њњўў€Му—meegBMPGBHBJSPSSPNCJA>?9:3КЋЇр§ўїљјїѕїїѓпмзлЫРЧЭѓьюєђљљ§њ§њћ§ўўынМINvYCHJNIMOFIJFBAEE;EC:4ЏхљўљњљѕяэаШЮЫРазтЯйхшкцёћћ§њўњћћˆјљѕяцтнысРh9M`UQSJFGF@9:G@F4EнюўљљњєђючдЧУУЮЪзбЧыѓўєњњ§ћћњ§њњјљјѕёткдзкэяўВkP@;PFELLA747>9GњљјїштхукззЪЦЮЯгСжпѓўўњўћљєѕѓћјјЬїєѓяьнжаесхяўьхяк{MZzk?:??>9CHIјєєяьхрЪШжецжЮгдЭнєљњњљшњјјєїїњѕѓѕѕьылстыыђёёђћўў€аŸSUA@POBCEBCєїэьшцгЦФЮтычбаЮсђјћњћїњїјѓєѕѕєєэьюёэёђёюэёѓэѓщэћћўўћIF0FI9H)>-(!#7GSL"E‡ЏЖЅЃ˜œЇБЖЌЈЅ—~O3$жЭЮззурдУЩжБЖЇВЛЉАž˜o90013$& )" %+8)QЉЎАЄЃЃЄЁЉЌЎЖЂ](ЕДДИКСТВАДЌЂŸЁЏИД—ЏпЦx?8,!. !$ !k—œŸЇБЦсЩО›]);ЭЭЪУДЉЇЋКНДКМЗЕБЃАТЇ™‚^F;+.4)   +#G‰ЎАЅЛгНТЈŒi4!ругРИМФЫЦОТБВЖАБЗД—‡Œ…ЎxG?4GII*("$-!+-,>pƒ‘ЅБž‰O$%%!ЪЗББУФОСДЛААЎДЪдбхЇ–ЌЋИД”c:.1#!  0,+F}ЁЂ|[2[@2(ОВДДОЗВЃœ—Ÿ˜ЉŸ›ЌЏЏЪгВЛаx:4&# , )S”Јb!ЦЌЂЈЗФВЁЃЇЅЁБЏЅЉ›ЃЊЋЖИЉБДžiA;@\\5(!    -T\ƒV!ЕЗЄЇЏАДЌЏСНЦЧЕЊЊЈДЕЕККЖЁЉЛЈa?:F5)34%  ), %+*МСКЛФУЯЮЧбШШЯЫЫКАСТЦЛЗМОРВЭЖwde[.#  €‰ $), ОТЖЛФблсмзгУЭЧУЖЏЩаНМАЕОЛЋЎМЃˆIJ0)-+ .( +#  йбНОЛЗЩнуеЛМЩЫШФКУШЦЦУДИЛМКДБЛ‹F:F@)"(#   У мкЮЧЩСЯнхБЎБИИЅЖМЭдемзУФЧШЭНРйй–?:?-:)! Р МЗДЏИИВОЦБЃДЋИФЦУФШЫЫабееЮЧТсмеаЂi9%HTH-+  $4 УВЏЉЏДЋЉЎДЛЕШЮДУдбгЪЧзЯЭабУЦжпзКепЌG$1L4!&)1*(ш  ВИВЦСЖЈЃžЖСЪЪРЩЩккййнЮЯжгемуузНЩнсБV2GQN<9&$$2(<)ЧЊЌЖЧЫИЄЋЅААЏЖЫЯкйггзмгЫдеджзнмжШУФбОoFLAA@A5"$$ ч‘ЃЇЉЅЄЏЛДЪЮФЫЮЪРЪЫаШУШЭйддфЪзкзТЛЃЖжа„P97?HN9894E+ Х0ЊНЩЗСЪЮЫТШкгЭСКЩеЭФНСЭднпзЯЯЭНЖЊЕНУлмЦ„A:PB7<0ћœЖЦЧЧвШЯакгрмгЧШбгЩЭШЭбЪгееглЪЯУЪдйуђюлЈaP8++(  ЦьзрцкгблсзабжмнммпшсрппмпшыэюьыхпклкршущЖdE.:G>0)#( т4B*ЪЮгснхччшьэыюэьчсцчшыящыьщщцхщрттседгкЧ‹Y<7E?3.71;ѓVP.ццээыюяђёёюЫячжЮдпущхтшьчуйеежрцсрУМЛЩлрмЏtI:G@<>:*# ,3)ыьь€шчппммнтсхкйлрккммекмккггззйедаЗКШЩЭахяьЕZ72,)!2,>0ЯазрнезмзнхрнмЯгагбегЯЮЧШемрлнутйШТТЧУРЧзнэљјТxC<:L.#$ -СЦжмсмпсцшмЪЪдбезмслйЭаЫЭЯзкбдженднчшхнрккрјїщЫg.4ME!-*9--,%ЪФФЮажЮекзЧЯбнпйжалнсдЮЩЯбажрччыщуучычцшхнйзеШЫЭ?21>H039&((&ЧМКЦЪЩбзжЯЫЭгпймжккн€жмкжзжккйббелйбжзлйгЭЧСИШбИ…L.2<,"*-$#*)#ЯЦСООЛЪЫЪММФгдЭезгбездеааЫЫЧЪФСРЧЭЩЭдздЮЮЦУТУЪурсйТzE;7;+?B-(*7.РЧЩСЦЧЩТДВЗгЩгЪЪЭШЦССНЕЏКБИСЦЧЫЮЯзйеЦЫЫ€ZЮКЖКШзлмшэеВH4;[UI5.1<ЦШМООУОИЉЈйЩЮзеРЭчуЖНймШЦЭЮдгдксураЧЪЮебЮКОНЛТШЮеёћѓЭ…A4A:4)*")ВВМЭЭУЖЌЈЎИЩУДКАxЖ‡EiЂМИУШЫЭЩСазекннмсшьснртппндЭгрЩФСИM;&*%"ЂЌЗНБННИУЦШТЏ…гЮЈ”^|кУФУЦНШШЦЩклзрщээьэюьчычттлгЫЭЩУРЛОЛ‡SC?OYFИКАКДЕЛЛОФФМУДЕЯуштТОнОЄЏЃЇЊДШзммзеккнллмжгзмзжгаЧСРШФЧЧЛЧИz05I>ЭгЛВЖБЏЏЩРУЛШФТОгЧЦЭййеЦЦЕЕЖВКИСЧКРадЯЮЩНКУЯЮТЖИКВŸЈМРОИОжаеЂeQEМЛЏЗдЯЮТСФРНШЮЫЭдзедлаЧЧРРФКАЊБВЖЖОВЏМЖКСНДЈЏВЎ‰‹—ЇДЗЕВАБЖЗŽ[AТИБМбЩФбЯжЭОФУОРКУООЪЪОРНРУЦЗЌЊЈДТНВЗВЗЕМЮИЇЎЕДЇЉžЇЌЅЇЉЇЉЂ•ŸЇУЏСОРУбЮЪКЦЩОЖМЪжЦТКДОЧЩЧЯбОЊБЗАИИАЗЕЋЋАЕФДЌЏВДЌАЃЊВВЗДЇЈЏЌЋЄžКбЧЋекЭРЧЭЪКНЧЯЩЦФЦеаМЕЊМКМКЗЊ”ЄЃЎДЖУТДДЕРМЌБЕФМЌЛЧУУРМЕЕЗНИЈЏЛНИЕЊаджж…заЭлеРЦУЛЉВДКМААЛОРДИЦОЁœЌЎТЪТЛРзлУСРТЦООНЛНМОЦЪебЩЩЪЪЩШЪтЦгЪгммзмзкдЯФЦЩФТдммЫСУЩдТНКЩЦЯФБЏИИРЩзйЭДЎСТЗЌЖИЊВЖФЭЩЦФТЪОКЖЏЏЂ€хA3I‡jQ:278779>BCC2)#nЊЅЋЖДБЏЎБККЛНЫЭЪЮМЗДВЕДЕаекллнущгЦЦЩЦНЛСпк((9(*TH39++,&.8@C<1,L‡СуМИБЎВЖБМЦЩЭЫЧСЛЈЈŸМгСРЪжкннршбЖМНУОЛРШЫ%.+*0@:9*3>:,,2855,-CtБЮаСЛМЩздЯгЮШРККЋЅЉФгЧЩЪбзкзйтЦЖРОНЗКФЧЧ.)!*;94$+0+$#17572"(PЯйНЈЄФйбаШТФНЭН—ЄДЗВЧтабабггЯжЩУИЕДЛЦЪШ *$+*)138:9:1#-4:„Ё”ŸОУЩЯЭЭЮВЏБ˜ˆˆЈМУШзйздгЯЭЦТКИЗУЫЩФ  (*%%-2.+)%23&)cžŸЋКЕЛОТРФЇЉ››˜™•œЈБСнелйкеЩФИЖАМЭзН  # 11&$++,#*.75CZFjœЗЦФРКИОЋЋЊЊБЊЎЖЧкгМЫбежеУНЖŸУлшпЩЎ#$ Ega"#&-QcEIЁЯммЧНЊЎЎ€†ЉЋЈœШТУФТСЦЮгкгТВЏЅЮязмшЮ$)&%"&>NA@)""" ",P`ŸхчпʘЇЋЊЌЋЏЗСТУФЧСЩчежИЋ›ЖЖТРДМхй*."  >#"&.0*)#!+*$IЉёўЯЉЋЏЎЕЛСТФФ•МдйщУВЦаЮлЮКШРьз,!  7-,.2())20$).02!;cЄеЮЋИЛДЖБМЯЦЦЪШШОеѓтРЛСТЦЪббдлЯР$( !,$,@9(!"((&(00€&9^ЇеаЧИМИЏЩЮЭЮЯгжджРЉЋЏОРФЦЩЧЮдеЮI.)*+)5%$!#$01"!)"$$!+08PIH‰КИЦРСОТЩЩЫЯйпњсЌ˜КЧШнјаЫРФШЯа&)"(+*)-3)##""&$&)),*+#*&4hŸЗжкЧРРЦЧШШеймгНЎКВВШЮЮЪФТУай(%(*+)(#,,+$"$)2,"-420-2BMC`”ЫеЮФТСРШЮдеЦСТОУУФЦФЧЩФНОЩм0&),-++)")%"#(%.7-&"*4952$4-09EBY[^ЌтшЫЦШЩЭЮЯбЮЦТТЧЪФФУУЩЧЦСНИ<20,-%100)$(5`>+12&&%19831*-5??)(CGYВкзЪгЯЯЩРУШШЦЧЮЯЫУРЩаббЪОЗ8~ЪуЯЗРРЊЪзЫКзюцкдййћкнчгўўЛщшћўўєђюѕћўўђСM4I5!$&*001++%!))0,$3:AaЧЦТЧЫацкнзджбЭгйжккрЯјѕїєєѕѕѓѓіђяђюэчх’>@@д572-3*,$(!(!")"-;NPnЌСНЫЭЭеджебейлмкЪЫЫИѕєєїєѓёШюѕ§ўуЁQ;:18.%)-0+&#"!#(&3593Hv…ЄЩгбеджкнрппмзЭЫФ?ѓєєѓѕѕђѓя€ПюшсЮмкˆL:FB8,)*,*%%)*(..25CMh\?pОччжежкпмлмруеЗrM<яёђяѓђєёђѓєцчдтслгУЗz>9<@492.%!#"-.3)-* :NW?xгнжгейлппмушбz,4FщыьыышхччхупзлпснЯу§ш…EA85E:41+%&,87.0,*+::17аееасшчўїѓа|>(2Oёђѓюычцчшщюшш€чртмшзТЋwOC9;HB4%-.0+(&%",4;,"*UЇрцлчїчргС…:+7@<ёююэяьээяэцьщшыщщтЭСНКгˆTLGTSQ@4.2311)*")14;@@B@TˆСгтмЭЯОx>(7:9>ыцхшщщыцчнсрхшчч†ўйЮкзуаЁh@19B:3($")++$!&2312JG9:dЉпрМ~F&0^FC;юыухщючпйжгбллзЦЗйсхрёкдм‚@>5&7.),)%$*<#(?gЗк~&"-8--0чщрпццштппнн€hпнезмсстнггаЊjCMGbiA:**,%%!-1724+0Ngv—Z.0(0+(*-,хучххщщцччьчхцумнпццхтмШейКoEGJC4?913"&$#&,&092%!+330,(ющыыьђяяѓяђэыэщщшчэыщцунтжпЧ‡im]8%<,$""%++$")-18:4,").-єэяьэьђђєђюђяђяьюьэючшчтрзггИ—YY<27>,%#+1.1*#$+%.44,%!$!їђєэыьяђђюььюёяюёэяюяышхчххгФЪ”N;O?&+,)+.+21+%+4 ёюээщэыьћейуутщцьыэёёэяьэьёсжхтœEBC9?0-*..-&.-+с шчтшчшчцуспйурушэюээяээ€ПьщыэтрпЊk@1MQL:,-,0"*2I& %ыцччцштпхсуцхшщьђёёђюяђююяьычйМйшДM&5WH,-*4450..358   ычьыюьцнуцщыьяюѓёяяёяђёюђђёюыпТбэяР\2IVVE??701337CA  рцчцхтунтшььэьёюђѓѓєѓѓєђђуѓєђьтжесыЯxFJ@JJI@5.24%, ћртчттЯьыђѓђёюёюёэщышђяђяяѓяэяйаРкѓр‘];@CMT@@?;J7  ј GсшшэыююЬёѓёєѓђѓююђяюэюђэяяёёюьшбздмђёй’LAULLE?"#&  №жтэёђёєѓєђѕёёђђЮюяѕёѓђяёяђѓєяєђщчптѓўўїЗpW>@:<10(   38§ёёњѕєѕђђѕѕєўѕєєћђѕѕїєєдѓѕїѕїѕѕѓяуншїўўЦtM7EE7?AB?59:>8ђёяяђѓѓэђёёѓѓѕєїєѕєѕѓєёђђяђђлёђѕѓђђѓѓєђючлбЯжыїп›T89J?;::858;<8ѓђяясѓёяюёэяяђѕђђєђёяяэюьшцэюёяяёёѓёёЄяэщсзбкљћњєЯ„M;@;;JJB8?HFGEH<+!7aЩЂŽƒˆuw„—›™˜—‰‡xw`‰Ѓ›ЌИИТЩЩЈŠŒ”‡ˆ›Ў7::;>)8>>ABFML@@BEB9%*1[ЉЇ‘•˜™АЋЅŸŸ‘‹…Šuou—Њ”ЉВМРН֘‡‹ŒŒ”ЊЌЊ-,:#2"#ON;:F;7B5@;-$0)LНЋŒ‚uЕЅЋŸ’‘™ЄŽcg„‡z›ЪЎЂЊЌЈЎЕЎœŒ~x‹›ž˜,!)$9,*<>I;ACF?+08,9enc”–ŸЇžž~z…g`YVu”Œ•ЏЕЏЊЊЇœ’އƒ‘ЂЏŸ18.)-#$#(88)3A:@?<:73-@(&Tƒm}ƒ„™™Ё›wzge^\[inx‰ИРИДДЌ™•ƒ|„•ЂА‹i1%# *#+,1E#&%-71<,>8B[FId˜”……‘uu||}qv‰”БД–ЂЉАИЗ‘•|t‹ЉОК…<7%Wo:()&2,,&:ZpJ!9œЕВ›Ž}…vrokoi”’ЋЏЏЉƒ{ržеРЖНЃG5))%&$Tc^U9!,*"#$(O\„ЫОЖ‰qwvprqu‘™•”—’ŸЧЛЎŠvkz|–ˆ‘УЖ?:C&(")#!(T-)*12512$$#)$IЁсѓЊ^}||€Ї‰—Œ–˜ЎЦШ—‡’ЃДЁ‰”•бФ<>77)8#)!M3*97A)9Z‹ЗЇ~z|~{ƒЃ™Ё˜”ЈсЪ–”Ё™•ЁЃИМЛЋ–5,5774:3$9C?789?+(47.99A2&.J‹АЋ—ƒ‰xžЋЖЃ™ЈЌЉЇŠ}}…‡ŒŒ”–ЉААЏКcF?;A<,2IC!144844Ь:.#.-7)-2<$@4NIEoŒ‰”’Œ’œЁЁЃКЧюЭ~d~——Кл˜–›ЄЌБFAA8?>>С<;9#(),&5;12153+*-113$14`‡ŽЌА—‘Œ‹–œЃБИДЊ•}„}‡ЊЉЊœ—’˜›ЋC?8:?A<<€Ž7.(#1:PFUtЄЌŸ—ˆ”—ЁЏБŽ’˜––••žœ•ЁЕF:A:B;F9C<3>(2;85I;A5-%$188@90:?CBT]WЛУЅЁ–ЁЄЈЇЉЈ•ސЃЇ˜…”–›—މ‰VI??AFFB?97:+J{T@J@:;099ф:;0.13A7#+FIV™НЏЇЄБЊ”›Ÿ››œžž€Ъ•ЂЉЉЅЂ‹ƒMGTVPNE><8<4Q’v97EB?:?2.+1ZE)HP82@>--hЕЦЊЅЈЉ{„~‰ЭтебЦЁ’ИБМЧОЧ\Sah|9AACUCTстd5;:9;3.5*%)*$3<4:BzОЭЕ›ˆx›ЎЁ–ЛмЫЎЖЖДЖЛЦдМўў§ѕёўўњ§јљўўЬћЦYEV>,%0,88:5972)&5-2ACGi–ЏЄЁ™žаЫИЗНДВЌАЋЌВОСЕљљјј€€њјїѕјєїєѓэшр’BHIJGA9;:?*<0*$(-$*8OZ[rЃЃ’œЄЁЊЖБЌААКДЕЏЂŸЁ™pїљїњјњјјѕѓєєьыєўўл›WCM@M@@+%,<,%&�+B5AA@Wrx{žЈЋЊЏЌДККЮбТЋЃЇvHёїїјєє€рѓюьюьсдмзФун…NBNOF<92+..,.25C405;V`j[7W˜ЦЭМИЎАНТЧСОЗЌ˜gOEчхцююєђьнрыЯЭЖЧЯОТЏЅ{OAME?F?:01-&)>A>953CMQAaНТФСИИНЕМСУЫЖn28IЮЮЪЮааЯЫЩЪЦКБДСбШЋШєпŒNNEAH99?7)%3GFLEEW‚˜ЏТТБЕœc@5?GIHтЯРЪзеблдЭРФНбтыхњКЈМОгЫЇ{I;CLEB5+5-550+):9@??OL;?PЕЖ‘pC.$@zYNEдаШЪждаУДЎВЕБМЖЇРТЧнчТЩкŠHJ;1>43%59A5,+#)147J+1AbЇНr1&;E4";:?мЧРСблЦОСФУНУФЗМВНЗСЫбНШФЈuSUWwzPHFJ<1(),&+474@07Jhxž`:-;<<:595ЪЭМФФЫЫЧУззкйТФННЫЫабгШЏБЭДoMP\QANL@<*)($,#"+,"3,:JG4-%4$.8?EB>4бкеаднщхкчпстрсЯЧзгжебЫЮЯШйЦ‚xxjB5GL.21&40&".0$:ABH2(0,&,-->;5жкбдныыёюёцрцуйЫЪйсйШФЪбЫСОЩЏ™]bF5BO@B5;@H<11-1:@??9,,-%*(1-&%&&юьЮжйгрьяцбкуцщхжззпмгЯЪаедУЖ֘UFZSA@@?CFF7;5,)09?#!!,%12"&&ь€xнйсдтьєНМЧЩЭФЫкстььыедйнхеЭтуЅMJVHPIA?4 &(&-)-.3ЮЫЮЪгЭаЮкЦАЭНШдезлжтссцщщуйныыссЏxNA\obO?;;75>%.<>U,*(!&-)*2+ЩШОУЩШСФЭЯОннЭзыщчмушьнхтезцюрНсчРV5Eh[;9:F@FC@;8CG!!3агЪдрзЧИЗЫмхсдзнщяшущццытцюђэуТжшђРeBVhjVQSEAA>LETL $  !НФЭжкЭРОНагЩгццьщээяэяхшццёђэюрдЭерЫƒ``WS^PCHE@@:@%  ЅОМФНУНЪЪтцсрщнйрцммгрншцччуьётгЧБТчт›nJMU``WQJL]C%$  €˜ dУкжЯгрцхмтщчукеуущпждущяющуцсзЫКФЪбыюк•OOgTUYY@-&+) "  ЎЫдлпхнхшььэытспрумррчцпуцщчщссзйрсѕўўюМueILOI7@A.(# CBћшяђёщщьюэщщьюяёѓєёѓѓ‘єѓђєїјѕњїєюђыуэїњћШvT?LaYQNCE-)   PmV7схрюяєѓїѓѕѕїїљѕјїїђєљљјєїѕѕјїїђєђєѓэммуюйœiPJYMQNM@F\@ AwkOђјљћљљјЛљїљєёщююѕѕѓуёєѕёьчшхэђѓьжФЩбэёыН‰\L\WYPLHG?#(&<COLїјѕњєѕѓђэьюяяёюээ€ЬыюяёюяьыычщыыщчшрЫЫдклрћѕ§ЩoMIG3>?5L;71>U<0HQHуцшђёэяящяёѓђячштлуучщчхсшёѕяђяёэуггдаЮзчяњўўеUUZaL&I@?@HA@88<@жнчэюёяѓѓїэчсьшыььюђыурптуцёщышэяђюѓёѓщьшсьўўћп{GLg\EA@HLNNHH?H>нпжчшээђёёпсшюёящэяёюцлтпцшщяѕѕѓыѕѓѕєїющпсреншЅUCCSVBJJьGMHGC@скЭккнцыюшмтыёёњѕюѓяѓььЧэщэььыьщыьчцхшььхйеЯЭзыߘY@GTCIGHLLEFCEчлйекйпптегесшцяёщщ€ЯшчтузелрклрлхрххштхнлйебмэѓђэеˆUIMLMZSOGMJSнтрстрнмЭЪЯьхчууьхйлгзееаЫЪжзпрхуээщдйптусбШЦгрцхјўщۘ\NStxeTJSVгпзддйддРЌВяшэѓыбцўўШжюњжппчшччэюђэтерпщсхдЯЫЯдкнуњўўуœWMb]SOFJIЮЪЩхцсЯЩРФЩсеЮЭߘ˜Ъ•GxЕжЩежкстптчуыььТюђѓѓєяяёючкбкщппжЪ’`J<1FI<ДМУбеЪжйлррпдФ•щчУЎiямждлЩЯкмлщыєђѕѕЙјѕїѕѕѓєђшнздбЯЪЧЫЪ–j^W^p^баЧЮЯбабзсмлпаЭь§§ѓжзјбСОЛОТЩмцьэяэёююььэюьээшш€œхсббдедлЭнгŽAG`YххЮЭаЪЮЭжжмкпккмцчруэыцзжеЯбЪгбгзЯехшэутгЯкттлЩаЯЦАКЪбЫЩбэёяЖziWздЭЭхузджкенхцспчщщшэшнжззргаШЪЫЮЯгЧФдаЯзбЫРТЪРЗЋЇœЄЖЧУЫУУФЫЩЂnZеЯСанзйшцэуппнмндздепхзепнйеЭЪЦСЫпзаЫЪЪЦдтЮФЦЪЩИЛВЖРОККРЛЖДЊЗРйУЦлзршчщкйхдабрыркзЩаймнухлФЭЭЪЯЯШгаЯСЩЭрЫТЦЪЩЦЫНРЩЮЯЩОСЧОНЛКбчмЦшэнрсрнггйнрпмнщцрЭЦЪЭааЭУЕЖМРЩгЩбаЮШЩгдЦЫЮндЪЩгазкбагжгЧСЪжйаЫТыёыёѓяцщььзмлЭТЧЫабСТагеЪйпзОСТЪжрнЯкыынлзжкжегабддксуррллкррхўкшшыѓёэёяцхмккЯжчяяркууцдлдмтчнШадбйцььсбЩжмаЭбдЫЭЯзмсллблдбЪЦФТџ€Є•’›ЅАh\YHFb‹ŸЁœŽ—œZ2*#( &;k‡‡nt~Š‹Œ‘…‚Ž›‰cigcdž˜™Ї˜‰’}|{eW{ЁДЁЅБЁhH- 2.)$#$&&$#+(#,(?>PŒ›—Œ‰…Šˆƒ{me‚‡ƒzou{vˆƒˆŠ‹vPT]a`q–ЋЄЖК™H4+!--+&,(9?8)$$€б2"g•‘„‡ŠŒŒ‹”n`jrqahmkr‡‚‡—wJJ[h^ŠЄЁ›ОЦ‚21@,8>12(&"(27%$%%" )EnЇ`mŽ–‡h\enxvjc`dpo}ƒ‚zhOT^d‚œКНМКЅ‰N2"#-.,#)(),)$+&*:WŒА…ƒŽ‡ˆƒ{^[jrtpikgku|dtwode[N\JtАдЕЉЕœW+%%!!$&"(&*4(0++&$" EgŒˆƒ”›Œƒ”•{hoo€ ei`houZeptrzzhe^{™МНЋ–tH)$+1$,#*#%$Lx‰ƒtMvЉ‘ˆŽegdrttvqnpd\iuqjnjpuvo}ЋЉЃЖv;&9517%!$$&# ;k}Œzn^c~ur{xq{qt{qiG:wqhabrww~…ЌНК›G?MN423&%$#"$$)LЅŠzqqkw‚…z~ˆƒzoig}{ЁЇqЊ›‘whmzgЈацс•<>NIJ4GN*$!  M…Š}~ztpd•Жgqqvzromt‚Š‹r~orohu……ЇŽЄЧЯЋ^,(%;C@PuS()  M}‚wqgJq•nqiagdjm\w}i`ЅuZZ\mw~”ИНМЊr;373-(-93C:@*" €ž,PZ`x|rbVZ]Yt~rqutkbW\dik^`Ё‹vv}{‹ЁЁЅКЈ`7)&2;C0" *OJB[bI?GTgU\ukjouwr^\bpvvh™’twˆŠ’™ДДe0")9I&.1 @m\5-("!m…Ž„e`]`SB8Ahqm\VYVjxucY`aiw|ЊФБ‡Z8%&!0+-"$"# &(*()+, (]pˆЋ”ˆ}^b\Sj‚wuvh]ba]mvvg\hjcrw”w90+,0%*,$ !! 0w‘ЄЋ…~xreghaiunpgjmrvv~|{jgbguvk5.;5-BN;?ZЁЌŒ–‡‰ŠgbbYA`|‚‹ŽŒ…Žœ–‘’‘”ЅИКЌŽ~m{‚‡‡ƒ|wrxjiidhmp.)(10%GBGQ]GV‘‘ˆ}ncciwxtƒ‡‡”ЦтЫНЉŒ™ЫОНУЊЅœ~‚‡‚ƒ‰zw|wbS[cihm)-81*+AA-%9m…~iPYJwЊ‘~„Œ‡}ŒАКИЗ–grЊЏИКАЄ••‘‹‰’”‰}{|{aWc\^dt%("+,*><*7@802bwmddˆqhˆ„}v…„”Њ›‚Š’—”ЃЂŸ——Ÿ–Œ‹‰ˆ}popbZWW[]j"&*#29()ALQF\jn”•…ˆˆŒŒ~w…”•ŒŽ–™’’ЌЗЖ”}htwxrumnjovwnn&,3,#*(2() )&;`z„„‰‡‰‚|„Šˆ‡…w…Ѕ™™›ŠЁМаЪЋ„mbt„‡ˆ{uqpxti]-!#*-&-!&$+ $a|’ЂŽx‹—Šƒ„ŠœŸЊЌЈ‘ŠЅИИЦзЫЉx|}zp{xijo?+%"11)"!   Bjƒ™ˆzonwz|zu‡™—”—œ•‹ЄАЗУЮЛ}‡Švtvcanhio#)%%*%! 13Je{{ƒprtv‡ŽŠ”•‘•ŸЊКЉАЗЖЉ•‡}xx{obZcov,-5:01$.$€n%<.CNTemƒ›Šx}~ŽžžŸ˜‰ˆ’›žœŸЉЏЋ™ž’‚}wwv‚wdgbZi.5)(%20)&(1# (-:.A4*#J…™‰‚‘ŸЂž‡ŒœЊЉЃЎЏ›œ––Œ~…zuw|qiiq,8-%$12*, %0&!, 547Gbwixi~••œЄž•”œ‘Ž‚|uv‡……thcn-30+4:#! #(*.@ZYbo~‘ВЊЃЁЉЈ˜—œЂ˜Ž‰ˆˆx|}xehottp&C@4,&.#  0&%%&$,PG+CWdnz‚}‡’ЇЎ™‘˜Ÿ—zvxtz{onutb[\L.40<*#*  *)*,+)&)9Nk‘ЁЅ™™˜ŒŠ‘ЃŸŠqvrnoxwnx|rggdpQ9-PPGYH$")),378,#"4<>)#:h‘ЃНОЅ•~xwЏЉ•…r\mwx|wjpopoo‰œ}IIYB7. !%*+*?GF>929)0#!&9Y‡ЌЌ’Ї…ЖбЭА…ao{ˆ…a^\Z`]]ЋДЃŽxkO:HA7$&!9AEM>:!"89;209iАЛ›Š‰‹„•ЏБ„bdo~qYhkjquu•—ЌдЦ”L-*% &!33,7;993,185"&,.HF;Ebƒ‘™›ЄЄœŒkec]ebamrnuzЁЯбеебкЦЈЃž‹ƒЂЪтржЫЯЭЇc,3F284299;3173<@7:-?ES–ШЫВЛСРЧЪЩУРЧЧУЇБЏЏАбгеааСЭТССЇžЖрькрчд—`:+4@@9;98<<:58AEFACUNtЩткЪЩШЩЪЧОКЌУССКЗИКМЧЪЭЫТЦИ›™ЅЁЌЭзжцьЧdN93?@G@B82BGLF?:>@EIM>?‘жЯФЩЮЪЪШЭЌАВИИЈЉЎДЛЦСЧЩЧагЛ–ЅžЌžРкждщч”A?;GY„ЪЭЅМСЩЮЩЭЎœЌДККЖЋЅЌИВСТШТРВ™œЂЄНйььыхжЋcG93;CBGGC;:BB<;<>A;;8UjЊлаТУЩЪШШУЄЌЏЛОНЛБЏЕЛЪЄИОЛЕВЎЊЂ‰ЏхњплсТpB>?:9>A@<FBEE€C9:Z‡ТЯШШЩЧШШгдКЏКОРМЗАВВЛЗœИЛЛНМЕАЎžДЯчюцЫ•W>?C?B;:<<9439;;BCB@33;cЉЮЫбБ‡ЏлЮЯШ‘ЎККМКЗЗЖЎЊЉЎНМЛЖЛЛКИЏТнккр”P;LFE@<:88<83)7>>EA9?$.O‰КЭЯРВ™ЉШЪЦВЎЛММКЛИВЏД’}ТУКЏЎБЛМЖЗЦнсуНVF^aMB@C><>:<508:;?::5;9gСнеРРИВЋЗФУРОФШЧУКЗЖОхыЕшреМДЗЛОЉЗкєўўЌJG[WTOP^:8:>2541,+0213>;7.2-%*1085H„ИЭРСНЕЊ‰ЗждНЖББЏАЎЎЄНЦБЈмНЄДЗИУЦбпэьЧOBJEG:GEMMGI<8.-.2)*.1LƒžЇИЩИЂЈЅЃУООКЕВЖЏЈЈЋАБДЌжЫМЛМЦЮйЮауОiE40<<@GOQO9"03,85-.4<:CHa)758:9:9:,503d˜™‡™ЖЗžЊМРНЄЇЂЈЏЗКЖЖДД€ ЗЕБЌжЛОРООУжеЉk<9>BB?<<8(*|ЮЗœЌДЏЋЉ•œЁЈАБЌЏЎЋЌАВБДЏЊЎВИмркФ—a?31;<@75743-0,))49;B@FFA;0$E˜ТУФФЎЎЈЂžžЂ‘ЕЖЕЌЈЄЉЏЗЖАЎЈЉАЛМесЪЄnP>7?8;>>75.,.3+!(.83>?>9?T8<ˆЇСуЫЯУЃЂЃЊЊТЖЖЕЕЏЉЉЌДОМДБЎАЖЛНТ’S7?@FB>9873-0*,),)+),(%.,443,MЅШкнШЦОВЈЊЈЌВВИИЗБДИИНСРОАЌВЗНЛ…LPVYIIC;33,0-+)*#+)&"0,!033Ј1HЂлмЫКИМЗЃ”Ž›ŸЏАБДЖИКССООИЉЄЄЎЗИВ4$AEHIJC93-*1+11714**&,+(9;0,3>ƒЫдИИКИКРЏŒvЁИЕЕЖВДДЕБВВ€СЖЄЁЎДЗЖ00BLJE>>98931533242*,4204??9E…ЖЫЯФУСОЛЌТЗЕТМРСКЛЗВЕКЗЕККДБЏБДЕИ2>INHA::7573394-4.+-(407;><:8;8473,,010,*%OH$"G}БадСМЗВЎБДАЏЎЌЕБДЗНОИМЛМЖЇžžзŸЁЈЋЕ@::7;808915487235:725:57FGW‡ЏЊДУОМЛЕЕ€zЗИЛРРЗЖАЖЛОЛККНКЕЉЄЄЉЉЂŸТЮ2211;9::4+,20458;>9109UUILxВВЈШЮРОНЗСаледЦУТТСФССТОРМДЎИООЖЗЏЃФщ87274841,49:901<<>;52)7Ch…’–žЩФЦООТЩбагдЦУТЦЪТОКЖЗМККЖИРТНКДЎŒЌ1*+%12372358;8;ANMO02>gЌФМЁ˜КРРНОККЮгезЅИЖИКЗБЎБИЛИКДИИМННДДАВМ259711.0-!(47<8@A>)-?E}ЖйШОЗЗМРСФЩШШЦТШЭЫжКžЏЄЗЧЫЯЭЪЧУНМОТОККНУЦОТЦ,-0.01-34+5>GLZAEV‰ФЪЮТРЛИЕКТЧЫЪЪьЦЩдаЮЎЄЏУпЯЫЧШЩЧСОНККЛ€ЈРЦФРСЦ.)+.2,,1-,4<-.8>wЈКМОРНИЕЖЗКРШЭЪЫЩЪаЯЧУСЦЩЯЯЪЦРСЦЧУНЛЕЗМЦФЧЩЧСОС!)*"(&**025OBEa‰НсЯЉНОШИЋЋЏЈЛОШЪгзздаЦРОШЪЩШФМИОЦЧНИЗМОРОКœОдФСС(+)0..1--+IxЁЁЎДРТСИЏŸЅŒЗТУЩЪгадд€ЫаФУЩбЮЭЪЧРМРЦЧЦТТРНОНВЋЋИРУУ"4998EIS^gezЃШхрЮЪФФьЈИЛЕЈЗЩФЩЪЯаЯааббгзгг€ˆяљњмЈ˜РЭгбЭЪЮЮЪЩФБЕЌБВЗМ@CCBB3I`MPuЧуЮаСШЩЁЏЎЊ‰ЋЦТЩЪЭЮЦджйдааЫдлухуЦНЏРЧЫЫЦТФСРСЫВЏАБДЖЕ74359#:UJPewk…ШЯЭЗЎЋЎЌНЫОЗИУШЫгѓў§ѓшггмђшьѓхтеЪЭЭ€ДЩЪЧЦТТНВЌЊЏЎДЖ0:88058[UB::>BFAB>;;7787($,10SОЭсШФОУЪЮЩЦФЫкнрпздбехчь§њуСНСЧЧУЦФФРОЖБДNH@@GC>9>;74354,#,<:+0d•КгШМЛНТЧФСЧЮаейкжбажучэьљьаСЩЩЦНОНИВЏБАЖ22747>;:45.0452-#,97;CH[…ЋЕЦбРИМУЧЩЮгбб‚абжлятцшырЯТЫЩСМОСКЏЋЈЊБ*,&29C?C@:8?@?7%$3@4LUQio‡œСнЩСУФгзмкгЫЦЪезлнууслнеЭЦТНОММКЏЋВДC955>??@F5,-;@JC*+0@2IPNYJ??mЏЩРИСЩйбЮЮ€œазптрпсскежаЫЮШЩЦФУЫНБДК9CC<>BJFG-).?FETH35E>3.@VP51GeŠКОЕМРКЇМдкйнрллкйжбЮЭЧФЧЩЪЪТНИБДКAB>@Eh]:CeŽЈБКРРЮбжебаемзжОФТНЛНСРМКИДАЌYCH3FHC0:;!#+5<::€.40:8:97:7>>EFC?HYk—ЫймнйжЯЩЧЮЯЭСЊЖЛИКМНКЖКЛДАА‡[A;^gYn[A0152>B?@5.0:<88?FEB?AFLQ?5OŒНгшыаЦНОДлцбУВЇКОФУСЕАДБЕЖВР›WSeQH;($?@4;42+)%-.28@GOMCA4&,9?@:A?;;?AF@?>BCZ[O[ˆЎЮйзкеЮНЎЌЏЏЋЏАИКНФЧТ‚ЇЉЌАЗФ–{kj]ZrЂЛКБЃЎВЃk09O?;;@CGE@;4BFE@.*BEOƒЇŸ‡Ž™›ЁЅ›–žЎœv~wuwЏЎЗНЌ›Є—–toˆЗЪИИЧБ}^@.:LJG5??G?@>HCCLC3CYJhЉЕАЂ™ЁŸ–Ž|t˜˜Œˆˆž€фЂЉœŽhjpqtЏНКЫЯЄ`PB3@MFI@@EESSTE@@;?CHA7wВЃ•ŸŸЂЁЅЋ„{}xvw|…”˜•™™ЃЈŠ`cnxqМИЕжк‹BHQPPUWQI?@FJJFF@C>>7H]}ВЃt{‹›ЅЃЄ~mu‡‹xqw…‚—”—‹ggqwДЯедбМ›aI>;CLOMLM?JAEFIEJHC87PoЁШЂ™ЁЄ™›”Žpwƒƒ‹‹~}zx‰u„‡Ž}utpaƒЫыЩОШЎhAHMF?HHOH?;IHFGOGH:..€Ž\ƒЄЃœœЋЌ—ЊЋˆ‚‡ŒŠ…{xz‚„Œrˆ‹Š‘‡{{t‹ЏдйСЎˆ\@CNALHF@9B@@8AFHNF94.;`”Ѕ˜Ј‰VŽМЋŸŸo~„ˆ„ƒƒ‚xrwЉƒƒˆ…~–СРНЭŠPEYWUMIABA773879IEB<2.M}—ЂЂŽ‡iu›™–‡‹‹оŠ„ŒƒƒeO—•„|……„Š˜ЦаЮЊYQieUPPMHG@@€\H?@?EB4;;7`АКБ~ˆ™—‘ŸœŒ‚}‹ТЦ‡РДЄ}‡–’~ŽНцћїЉMOdc^V[mL019A>:80.9)48+7`–Ђ˜—„„wЊаЈ}„„ŠŒˆ‡ƒ™ЂžˆŽ‰„…‚‹˜›˜ЉЗньЦu@@FP[]ie:HC@,57::*(.7-:^ŠЏ›˜‹„zcˆВЉ‹Šzwzz}{q‰’zuОŠt{uŠ–ЈЭЯбЛVGQMIGQTYWPTI;-80.3(&5HaroŽ—‰unnrr”‘ˆ‡ˆ~tqnqrwzxЖœŒŒ•ЄВАЖЫЗtP77>ABGVQS@((57A?<7(.9>.?c^^tw`Q`b~jn…~u‡Œ}x}ƒ‰„wЌЈ‹‘žЋВЩТzB?5:IJ`13;>;:GA;05*2Z‚qTmŽŒuŒ’gah|‚‡}|zz|„…}|Ћ‘’ŒŠ—АКЄnJBHHNHI>@GA:?9?5*;>;;*;o‹„˜‘iq‡Œƒ„umhnu{…{‚zx{zon…ŠœЗ…‹›ŠhUaZSNEA?59?GEGC9*7BEA><9#9`‚‘Ѕ˜—Ѓ‡rr~…qemt‡{{vzz€>{ztv–ЌЂ„xbLAOLYPH@@;77A@?F?:BEBB?><oЛ’kƒ~}uaeegju{}‚{|ur}‡rovz|ОРЏ™g;?>OTOJB;>9803:;4<4&9ЂКСž˜–…}z{tx‡…z|„Ž—‘|x{ˆ‡uNU]^\ME:?98,+(1.9544<.,3,,&:):}ЗОЊ…‚i[Sdirv|z‚Š‹‰‡Œ…znixˆ‡{81MUMLJ@9:31.2-55A74>%+2<98(*53eŸЌ”ŠŒŒ|V?vˆ|ˆ}{|‚‡…|xhgu~‹.0LQMGCA9>;;::,*3>78:78:>EC:7j”ЁЋ—•”–‡vŠŽ”˜Š………„ˆŠ‚ƒ|‡‚‰„5FNWOHFFA@FBC<:2134::+,2EBE0Pˆ•Ÿ–ސŽƒ}o]ˆЭБƒ‰„t…Š‚w‚ˆƒkoz~o{IHQOEG@C@BA?FC<5.<:0:0.)YL"2V~ЇЈ‹ˆ‰z|{{‚„ЁŒ”ˆ‹…„khh€-dbw|LB?J;;?F?E:3?97>:><8><9:JTTuŒz|–ŽŽ…ˆ~‚ˆ‹‘Žˆwvƒ‘Žƒ‚ƒ‰}nhqunr˜ž?59>;CC9;?>1;7BTYHCaŽƒu™Ђ•‹Šˆ’ЇЇЎЈ™ŒŽ„Ž‘”ˆw…‘ƒ|zrŸОI98:74;98:;?8A97GF+-208FSjggrЃž™Ž•—žЊДДЊ•™–”‹ƒ‰‹Šx‡‘•‹…ˆƒc\zA;75,4312,7<:EA;CE8@EZN>Tz‹‚…„‹˜››˜„Ž›ЏЈ‡’‹‰’”’’—}ŠŠ‡ŠŒŒ‘”ˆ9?FI5?>?G>;FJ@?(74Fh˜ДœˆŒ‰‹˜œœ”ŸŸ–—ŸЋЌЉˆq|t„™ЁЂЁ”–‰ƒƒŠŠ…„ƒˆ›Ё˜”›>9@H<4.791>278")HiwjvŠ—•{jdZˆ›ЇЈЗЌЊЋž™”™ЂЅœž’•‹Œ–ž–—„‡‹‡|u|‚”—•1,+%@BEB:J.!SЁqz…‡ž—q‚„j„œЅЌЈЄž”™žЂЁ—ЌКВЅ—‘–žŸ•‰‚Œm{’‘‰0!"#:24N?Hk’’…ŸНСœ~u„ƒkРЏЌЇž–‘‹‹”ЁЇЇВККЃ…j‚Ž—‚…Š‹ˆ’ˆ‚}„ˆ”‹‰%"1%5N:9TŽœƒŽ’‚’ЎпяР}`prЅЊ’žЅЃ–›žЋЃЈАОшШ™‚‹„‚—ЄœjEY{‰„•Š„+%4"1++-hЇЅ|Š™ŸžИаЗ~pjhp‚ŒˆˆŒ—Ѓ™ŽЂЏЏАЖЎЌЌДЈŸ”œŠqopw”u1>pƒŠŽ~:>0*7@2*5+@Iv‡›œЂЃЃ™—›ŸЂœŒЏДЏЖЎЇŸ˜ЕеэщУœ{‹—…ˆ‰ˆˆ‚~MABSNNHOGGJCC­50%")9x•ЈЛЃ–ŒŸЅЈЃœ•ЈБЕРТМЉ™ЗЫамёуО”‡‘–••’”Ž”Œ‚zSOGOJPIFCB>9B;9!+).:,,]„œД‘‚Ž’‘‘€нžЉЋЌВББЄЇРЩЯмцбЅ’žЃ™Ž‹Ž|tzuw~I.25JVP82Ce}œ’‡Ž’’{’ЎЏЖООЕЏЗЖЋЇЁž˜’–™ž•„u|0HHQHSPQ;493BA3(153CG@>:CBCCE>L[kv{‡ЊЫОИКОСААДЛЕДЈЃЁЃ’˜}{‚‡„…:@]SLLGBB?0*<310)(7CG;UpzƒŠ”•ЁЎЛНЎЌАЖДА––—•‹Œ‘Ёƒ„uiu`FOCLWF7IF12;:397*,;@CBCAAEA<294@98B;FHW[`[LSPTZP933;MmžЧЧЌЃ™дьёЭz„•Ѓ˜vqpquknЅУбСŸ‘}eSaNLHC09@F813:?QSZ[QNO>CEOUNG;@Q{ШйВЃЅŸ™АФЭž{}‚‘…n~‚‚‰Š…ЏЕЌТщмЌj8HTVIG@E?JE?9GNOUUMTFOLOTTQOHMbgVax›ЋВЕКНЏ™„„~|{~‚Š–›џфtndakxtu„–’jP^v„™q4Giœ‘…zrr€йow~‹•‘…umainie˜ž‚zqkjntcUbdkp}Ž…‡}}wnYeikw…{ŒŸŒkVo„uZdmaQp‚‰‚tt~‡…‹ˆrccp}opopzuombPAZnquomiU|Žƒxi\]„ƒ‡™›ЇаЌkUWa`PVn~vzwhmo‰‹eT>ajnjv{|}uqpc^`adp}vumE[qkrW@\i{‚nppvrOEnew{iaiqƒ}rmjjrx‰”gYdZaoiu‚pedjmkphZbhdan|ˆŒYZccZSoz|pt‚ŠcQZ[ecejZAVw}uuvnipv~Šxk|e^gxw„|kZ\Z[caH\imjtxron\mhebctpnv‡‡…tkgV]]\^g}—…‚~qhnk|•—‰‡iLYckpw~™œƒrqkjdn\cd]akpvokjNGIhzvkiku{tbqb^`^[YUe{|ƒxqrtЎ•rz‚wb]hr‚ˆ‰‡„„}niji`\coeqq``P[\mrqrkiozww`VddS[ceqx|„…Š„‚’Ÿ›xcdktikrƒw„‡‡…~tvzwuncZUac\ejHj‰–•‰„|}ztrwo^jiW]capwu{um|}ЋЁ‘Œ}[jromnv|ƒƒ’ˆ|}qouoidhk[\cekt[Se{‚ƒ{ttrppwi[ekbj”‚‚ƒƒrz‰Œ’œ‹iGZdtqqgmŽˆ~~|qwponncLWgntxz‡„c[\~‡‹ƒtmmjt}|SermiŠ„Žˆ{jqiYvŠ’…mU``M\unq˜•‰…vxwrii`bYahjkuxƒŠc`^~Š…vropkzŽ˜ihee\^u~‡qpxomMm…ˆjddek|tƒ‘ƒ‹…zwxompopvm^ejdmrz~ZUpƒ‡ˆ…nnp”~V^kjJIjƒwkt~uqrŽЏŸtdZeknv|zuttvtnrqjnwttqja^`~ž‹„]WZkrvˆŽzromq]Juvm[mЄ•{vupnmdFv‘˜xTckim„Š„|~…}w‚|tnrqiYM[U;rœ~}aUVbZnzcgmkie\jooqˆ‡~qtnjmi\GjˆŽiehujx}ƒŠŠˆ˜ˆ~tme`jje`VNb|zvthiortoqrttqwxtkenmvuogku}q\gЁž~„vr~‘~dВЭž”xgWM]jubZ\x~zvuh^q~{v~re`wxwoumutpnmnoqoi\vУжŠPcnciiEoЛ•Œˆ|rvbUWNL\`ajq{zpgqmurmt„rkdm}~}{tnhjqrvvkadmЁВЄ|I@bpkov|{k’–…pu}{~eLWTamqwvzxkuomkv„‚}mv‚‡vq{‚zw{x|~…•icpŽ˜œ˜‹v?;@bu‡‘}‘ЎŠ}tozv|‡mcO`qtƒxvzpmqwiv‰„rn‘xv‰Ё–zt„‡Ž‚rgkk„…~z}P5e˜…wmzФдozrqkcijp^^€ mikvrv|gbkq|‡‰u|~gaˆЁ}GN~uˆ‡mackmebdjZa—Ѕ‘Œ„‰Ÿ•rmux{VW]iierttw|~web{rxzƒ|tmt„r?CvˆU-Sz”‚ƒ}}qmpqpgchxŒ‰‚‘‘~…ˆz^CUOererod^z„Yd|x}„zotv}|hcpvoNBcc{Š‹”‹vt||wojigook[v•ЌЃnzvzžx\]Tabbdoxhk|‹hOtx|„‹xz…„{tbouoaS>`w|r|~uk\]gj^`hqbawzžЗ›}{|Ѓ}\YTUYgœЌŽv~~\Ejwupuvv€qadod[[T?Zae‡„z‹ЕО‡zqpƒ„eABk‡…uŠœ…k{w„iTACW^YzŠ‘ƒbrJ)){‡ŒŽ…wzސ„v\k‡uBZg}~vŒЌž‘…][wž~oh„ŽŒŠŒ—™…v„ˆ„gCZgraGkgt~|dbcma•–›Ž‚ˆŠ–Ї…`e~iHi‰}ojrr€вtq‚МК`v‚v…‰•ž‘Š…‹|]Zht…Y^e~|{~iN[Z]|–ЃЊ—•˜˜•‰ƒkkb^;>n‚oen‹ƒ}jdpœugnnu}rt›Ђ›”ЄŒrcBLv{MSTnpx…vn^S4ˆ˜™Ё˜Ž‡‰‹{tr~{(*jodkhjkjovxnbhdir„‚{~v’‹]H8AcƒuTc‹”‡ƒ|}‹p`V~‚žЉ›‘‡ŠŽ‡v~Œ|E@{}qzqq{vnwz|wmjcdkrvˆˆŽ…xw{ziZdw„tw]pˆˆ‚vu„pbjˆЖМИœ’–Ÿ–}™\Ixxw}ƒˆ‰‰ˆŽˆ}rmebm{dnu‚‘‡utkhb\M‰ƒ…xvkjqzx]q[Qb”|ЂŸЄЇЅ˜”—™‹}\*qƒ{}z|‚‚‡‹„to^Zdu}‚zunrujtmkjihkmomkirtoZQTe„ˆŒŒ‹œ•Ž‹™‘‹‡t9Pqg„u||ƒ‚‡ˆzz•Z1Wbdjopwqgq]SNxqpaac…‰gotornpnƒ‚zƒ}|{z‘…n^hxi{~{}‚‰‚ƒ…rqЇ}]pzxupnounmmoTA^i|vt‚„˜Ѓn”|d‡j|z~|…‹‰up}ƒ~rnwƒ‹Š‚‚‡„…}}‘’gYhovuptiPTajwr\^‡xji–ЌŽuOSO$?uru{~{z{~ztw}~ikth…}‡‘Ё}Mahoiejrzzrrnj^dq|qpkt‡ЊЅУеИƒ}ea[CkŒb[rzw|}ƒ~qgnovdbttw|}}‰—Єxe~•rV\jmpmmoa`hqx~xwp‚…rdzЊЛ™md|tw|ekj^ek[q~zv[]dkd\bovzˆ‘ˆˆ~‡„…rpimhup~zhkpoxx€іw‡”iTMqeJ|mGF`ub^ZV\dxƒƒ”˜zƒ~vhYQ^oq{ƒ|…•Œ‰Œ’rda(4He{im}’Žvv|wqŒŽo„qq‚„}qat^nv…}b@""4jЁœ”œ’reuzrrx}‚u„‹…‹}PhdVWMTUJZuumhr‚‚…ˆ}ou…‹…ƒ”ŒLc^Mnhm]^TFV…Ў˜›˜uQcokev{z‡Ž‰‡‚njT1@HYW^gr~zokzpmjt|x’œ‰~oriptko’‚ttghepœ•ˆx{z|ƒ…|‚‚‡Œ”Ÿne|uPhc[CF&E‚‘ˆ‚z}xNphxУЏ›—‹t{}zma\mr[:NLM^q‡Ѓ‰meUbŠ–‘xitz~‡˜v^ag]ikbTZba…ˆ}ˆЕ”‚x}xŽŽœ‚w{‚wwmYbkq[UYTPZ]iwxtqbLo”В…eg|{}||npaY#QgbeUb„„ƒx}ˆŒ–——‹ƒ„‚‚q`t~~qzjmkcjm\bpmq}~xvw‘ЅТЕЇŒwttxzzohcUAZ\ehikjž•ˆvp{Ž˜”Š]b|……na\Y`[OZ‡nidhmhhmrx{w[Ov˜—˜Ÿ’„r{}uz|vchdurrНhv‘Š‚qhmŒЁ˜‚bxƒ}eccZahU^[|wun`jehknz}{p`C]ƒ„žЊŠmow|~|ouwrecmomktбcmd•˜˜me„„j[e[^kxtaQuwnjihbhoinuthbPE\ˆž”u]c‰ˆˆ€$„}zvbW^jrjm}}tv”˜‹‹kOT`UZ[YQYhnuituxpnkcjmpu{Ÿ‹bGOwƒuЌД•‡‚vnxwtj›Ћx~wwx}‡‰•‹zzjmtqdbh\OY]enpxtrijokgjv{}|ŽpGG|‹ŠƒzkhŠЁž…{qgp}zޔބ‚xƒ‚…Ž—”|t~zwujmkd\d`b^ivgmkmqmhoxvkgzbH[zw‚ƒ{{r‚w}‹qUu…’އ…‚ˆŠ…ƒ‚„{’‰Z}ŒŠ‡‹|tgSkvhiuxnkmh\egj{rhmp{}ˆ}~„„‰…~wtu|N5a‹АЅ{|xzƒ‰}gmЫшЃ›ЅЄ–ŽˆodY\tuz}~uoiahqzuje\^hntv{rp}u|zuqwoM3VЄУ•bmntn„Ў˜bT•ЇŠЈ—Ё‘xr^Yjnkkpuvcbingcc`ZSP^`dhtuchpmgmpwukc`bЪрРЌ‘|gZƒЃ}Šz}ˆ›™ˆ~j‹pHQmgmo`gudY\mnmhokig\bppbbikvzwnpc^^cTe›ЫЪЎž{ch[}Љx~z{‡z~qu{iY[]t}zŠpЎvqoqpoqokjdWPbbW^t…ƒ~~vimrrvuw‹—ЊЅ•„gepguˆwtŒ‹vbddbcižŸ…‚z~z‰o`ao{{qd^\\bjqba„›‚~mZ`deiotwƒ‚…‹ƒoY?c~‰™‹‡‡}zwzpvzv~…}tnrz~jqnp‹ˆ„{iickpe?;`up…ŒƒbS^jim[uŸЊˆ‚—–dSYxЈ–‘’ŒŠ|wtgtŠ…ƒnnpr{’˜‹™S`gj’|ki^TV^d]\Yu}ˆŠˆpYO]uro‚Рц™„‘„umjwŽ~‚Œ…~|xxv{Š”–npjqj…`W[Ugzz{jd]TOWWVYdcn…„vdWW}’—}ˆЌМ–ЄЄzQ[abwuz|vrxjetu‚„ƒp^rmPrއhZ\gikxxkYUUMYYZ^UZ^npcgh’ƒ‡ещС™ЉЖЌeVdnx~voo}v|„Š„wnrwƒ‚‘Єcma[JW\itdW8?MOOQW`Y``V[mqŠ‚jƒŽnkmx}\:AYj……|~ˆƒz~ƒxrpn|ƒr•ЈДФkmqichjmnjnSLOUSU^QP][bb[gn…‡tx‚ur„Œoh[[q{‰ƒ‹Žˆ|t|xtjVeeijƒŽƒ—›i`cdadceqpaYNGMAP`bZad]aix—œ~wŽ•‹Œ™‘k`bkm{x~‹˜…Š•w[9IFL`‡|ЁЗДЉ‹њБИЗЕИССдРЫййЕ›ŸКФтЖ’ЕЧжзШФОМЖЖЗНФЭЫШКВЌЎВЕАЩаСКЗВЏЎЎЇЉЋЌЕСбШЩФЛЛДЕЖМОЦЫЦатзЌЁЕШК›ЁБЈ™ЗФСМЛЛЗКНУШкбНЇБЖВЕЗЛНЖЗКИЋЄЈЇББДЕЏЌУнТЛЖЏЇЈЭУШШЪецўцБЈЈЅ€ОЖФОРФТЖДВЖКТЫЭОЉ›ЈАЎЏЖРФМЛИЖВЌЇЋЕКЛМЕЎ~ЁЗДВЄЄЇАЧЧФРЉЋКЛ–ŠЕБЕЕАЌДМЮУЦТЗБЏЏЖНЧЧЮЎЇЅЇЊЉКФРЖЌВЕЕДБЌЅЇЌАДЕЗЛеЉЅЇЃЇŸММКЗМСЩЈ–ЈЌЋАЎЄЂ…œРФШЦМДВБДМФУЭРЖОЊЉЏИМНЫСЌŸЌЊЌЌЉЈЃЌАЕКОСКБЉВЌЎАЗЗЖДОЧЩаТДЊЈЂЃЃХЊШмЩЪФРЛЗЏМзмЮаЪА™ЊЊВЊМЦмуЧЖЕЖВВЈЇЇЋЎЌБМЛЗВБЈЅ˜ВККВЋВИСОЎИЊЊ™ЄЁЄ›ЗОФЩЪЧРМКЖбшЭАОФМЎЎАКТШШЧФСМОЛМЛЕЎЈЈЎЏЗКВЈЄ–ЈЉННМЗЕДЗРТТЇžЂЊЄЁЃЉБМСТТЦУЧУЩгжнНЈВДБЕДЖЛЛМЛЧЩЩТЛАВЖАЋЋЌБ€ЌЏ‹АЯлтЯШУНОСРТЕЅЄЈЅЃЄЄЗМТРЛКЗСЦЩнкЫЭЛЎЋВЕБВЛОРФЦЦУМКЕЖЗБЋЏЎЋЇЋЌДЗЁ’ЄИЪЩСМНЛММЖБЊЈЉЈЋЯЩТЦШФОКМФШЪзШЌЌЏЉВЗЌЎЮШШФФОНИЖДЖЖЋЅЈЏБЗИКНРЋЈЃЧмШМЖИЕЖКФСЂЌЋЋЎСЩУФЦРЛЗД–ЏЩЯШĘЇЃЇЄЕЗБдЮЭШУФОНКДБВЎЌЌЏДИЛОУРЅЂЛЩТТКЖАДМЦгЎЈЌЉ—ЄЛШЧФНЗЖЕЇŒЎМОЏЉЉЌАКЗТаЫФТОСЛНЛЗЗЖЗЕБАЏЎБЕКРФЄЄЎСЫЫЪОМКМОл֘ЋБА’ŠЊЦОЛМККМКИЫлкМЂЉЋЎДЛЦЧРЛЖЖЛЛИЗЗЕЖММАЅЅЇЄТдЧЪЋЈœДООЪФНИИЗОЁ~ЌКНЂВскУОЛМЛВЈБзйМ’ЁЊЌЏФЯЪФТОСУЛЕДДБЌЎАЋ—œ™zЎдЦФЄЈЇЊЊЖРМЗЏЎББЈЉЎЗЖНТЪФРЗЖЗИБЈ‚ЇЮЯЏЊЎЛВМРЖФЫЭгрЮЩРЛДБАЎБАЉЂ”žННКЛААВИКЖММДЈЋЖОЛЕЗЖНУЩШРЗВДММЗЄЌЯпрЯЪМИЛНМЅЦёўзЮЩФОШИЏЋЉБАЈЃЊДРСОВЕЗЗНССТМБЅЎЛШШРИДИЗММ€sЗЖЗЕДЏžЗеѓўИ‹ЃДВВА‰ЎдцеЭТМЛЕАЊЅЈЈЉЋЉЉЕМИБЌКЗКЗЕКМНКБЖНСТМИДДИЛЗИЗЗДЎЌВМлызЛ…~ЉЗБЗММИБЭлЩСЗМгЦЮЎŸЄЉЋАЖЛТОЖЏМКВЌЎЗТРЗЛФЭЛКРОНМРУУЧЩеОЏАЏЧеездЗƒ‹ЌИРЯЗЫщЯЛИКНУСРЧБЅЊЌЕРОУРСНКЗВЖМУФОМРЧФОМУржНКЩЪЪЭЧЗЌЊЌЩЦОНК•zЈзпУЕЅДюўбЋЕКЛЖДЖИЖЏБКИМОМКМРЎВЗМТЧЩУРРйЪЌЇгхЛ‡ЧРЦЧШЭАЊЊБЖИДЉЊŸЎнхЯЩЧЫхпИЋННТЁЊЊЈЎЗИМКЕКТОЗЖДЗИОТЦСКЛНЩЕŠŒЖЦpžШеШЭЫТНЖЕЗИЕАЇЅЏЛШУЦдбгЮЪЧСЦФФЇ‹œЇАИРКДЊАКЯЅЋКСФЩЫСКЛТТєДБАЎЈˆ}ЃЏОНРРўНСС€ЪМЕЌЌЏАДБЁЖгщзЮВРОТйОЈЅЃЇЏВККИДВКЯЏ‡КСФЦУРРУШСЗЖВВЏЄ”uЁНЛМЛМЦЦЛБЗБЌЊЌЉДЗДЈЖЗеякЛЛИОйТЌŸŸЄЅДЧкцЧЛЪНЂ‰ИЗЛЛННСТНКЋЎЈЊЅž‚˜ЇВЮЧРбяёбКДИЮЩЌ|ŽЖдеЧНгЮСЇСЩЫЗžŽЄЂЂŸИКСОКŸБ”pkЛЦЦЧШУФЧдзбЛБВгРŠДФЫЧУтдбЪŸ’МщрЧЉЉФгЫагебЭЪФСЪЎ‰ЇААЋ”АЌБМФБЊЋБЂеЦнзйЩабещЭЋЊДЖЋ‹ЏмШЦРЖКДВКЎЦѓюОЄММУРЦЯеежгЭЩФТЃЌДМЫЁЄЌТЛСКДЁЌЉЅРЯжеаЫЯггЮШЖДЉЋ}uАТЕББЗЖЖАЗЌЎЯЖЊИДЖЕИЗРЦЮабсЯА‰МОе‹ЂžАЗНРНЖЌЄЯнлмзЮЭЯбЪМЗЛУНtmЊЎЋЋАЎАВЎЗМООДЉЈЊБНРРСФФСРаЫЁŽ‡ˆДЮИŽЂЮЭЫФУНЦДЌœОТзмпдЫЫЮбЯНЯзФ‰ОСЗКМИКМННТСРНАЈЄАЛТУФЧШУНКТКЉЁŸФЪКЎЁБЫЧСМЛЫДЊЃЮЦьсрпкзжйлгЮтрž‹НСОТТЧЫЭЫЮЮЫЦРВЋЊЌЦЊКУЧФФУИАЈЂЁ”ТТССКЖЗМКЕЊЌЇŸЃдЩчррнмегжлдЮР—2\ЕЫФЦФЩШЧЦЫЮЩУФЖЉЇЅЋЕЛНРММОНЛВЕДДЏДЕИЛЕАЏАВЌЋЄЃЃЪЫбЯаЭбабггбЯаЏm‘КБОРРТФТФЦУСОлž~ЃЇЏДЖМИЗКЗОЂ”•КЕЖЕАЊЦаЯДЕИНИВББФЧЪЩЦТШШЦТУЩдаКЄЏМЎУУТЦШЩЫЪРИНнКŸЋЕМЛЖВВІДБВЖ•|ЃОМККФШншЪИУгУЋУМОСФЦШШЫЫЪТОНФОЗДМНЧЩЭЫЪЩЮЪФЛКЭЧž˜БМОННИБЊЅЌБИБ—ЂРЯЩИЊВльлНЂ›i‹МКЛУУ€.ФШЪЧОИИМККЖКЇЛУШЩЯбрМ’ВВЎЊЊДЛНСРЛМЛБЏЖИИЕЎЋОЪЩзтњўюФЛЅЄ›АйВДИМЛЛЦШЦНЗЌЏЊЉЊЎЕНФФЪЫЯуЛЅОмЯЗЏЎЏДИРНЗВБАВЖМОЛТРФЖЄДмяЭАЋЛВЗЖИЈЋЈЌЏЁДУЫЧ̘ЊЋЊЉЉЏЕННЛЦЪЭЭЮЩЯЫОИДЎАДССТОЛИЖЗИМКНФФШЏ–ЗЧЁ›РЋЈЈЌЏЌЌЈЂЇЊИУЪгаМЦЦМИААЏЛТФЦЩШЪЫЮЯеЌЅЈz|ЕШКЕЗНЛЗЕЗЛФФУЏРББИТСЗЋЏžЇЎМЗЃŽt‹БЦСпежпкРЗИКЛНУЪФЦШЫФУТЛ’ЏФЊŸ˜˜ŸЌЉЏВЎЌДМТРКЛМДАТЮЦТзе‘ЇЄЋАЛДЅЉŸ˜ЇТчзедаЖ—АЕЗЛНРФЧЫЮЭЪФЖВмкœˆžЂЃЈЌЎЛУКВИММДДБКМЮЭЫТРИМЗДАЏУйЭСФДИБЛйргЯдФТКМЦУЧФФТЩЫЭЮнЎЃЏЏ–ЖЋЄЃ—r…ОзЦСРЪМŒАЈМшЮгЮЦРРСТРЕЌВНЛЂ…ЁŸžЇНЦЦФкЯНЖЃЌЯЭЧНЛКСФШбКžЌЈ˜БЖЏЅžЇЈааФШЯьжЧРЕВЪЧЩжСУООТЛБЊЈМНЋЁЂЇЄЅАНУФМǘДжытШЋЅЗОФУЛИЌЅœv™УЏАЉ•ЂЪФОРНУЦЭЯгЮЮЩВШИЈЕМТЛКИЛЗВЏААБАБИСЦФОЛНЭрюьцдНОУЦЧСМАЎ›ŒžБЖЛЛЊЏлШТМЛНЩЮзШž›ШЪУЗЏЇЊЄŸŽ™ФЕЖЖДЕЕ€№ИОСЦУРЃ•КзЪЯгЪУЏМСРСИИТРЎЏВКИЛЖЛСЩЯФБИАЭцмТРШЦОЋЋЌЎЈЅœ–ЗИМКЗЖЛНМРСЦСЗЅŠОФмщЮЈЕНЧЧУНОННИБЊЎБВДЗУЩЩШЊБЉЮЯнБЎМеЖЅЋЏЎБДЌЉЗЗЛЗБЕЗЛЛОННМЎЇ–„ЁЮхЭЗЂЋЯЯЪШЦРНСОИЌЌВЗКНСОССИЕдтЯаЖ”ВЋЉЈЊЊЉЈЎЖЏЉНЖКИЖДЕЖЗЗНЦЭщ㎘ТаЪОЛСуьгЧЩНКСФФЖбтЮФУССФЩЫдаЪЦФЕНМЖЌЉЉїЅЋААДИЗКЛЛ€ѕИКЛЛСУЩЮЕˆ”ЧлЩЧОКЊЧЭЮЩЦНИННРСШЮЭЭШЦОФШЮбЭФМОСТТЛЕДДБВБАЋЊЖНДЗНРКЗИКРТРРЧЈ’ЂСФЦЩУУСВРРУУжИЅЛЦаЯЯЮЮЪЪЮЪЦФРбШЁНбЪбЮСЕЌЏЎББЎАМОИМННИЕКМЛНЛИОЫЭджШЩЮЯЯЭЩФРРЧЪ›|ЈЪчсФЧУФЧЮЮЩЊЗ§ўйкыйзйЫЗЌЋЏВЗКННЛМРМИИНОРМБЎАЕТЦЩЪФУЦФСТТЦТУОН›w˜мїЮ˜ВЕИЌЩщЧЂ”ФЭИадеЮЮйТЛЏВВяЕЖЛЕЗДЗКИЗЖВЏЋЌДИИРўНКК‘НСОРЛЕЋЅЧљўюуЯМБ™ЩсЪОФКИЦабЮУБгǘЊЈЗДЊЏЎИЖЕЖЗЛЗИЗКЕЏБЖИЖВВКССЦЧТСМЛКИД—ЅЮюѕйзРЈЌŸЛцОННРТЧЩСШИЛИЖžЇЅРНТЪАкЛНРРОММУИВАЉЏВЗДЖУЪЪЫЩСЛЗЖЗЗЛФббзкбТЌЊЋЅЛЦУММССФУРМБАЎВАхцШЗКЛЖСМОККУУчНЗДБЎЕЛИЖВбнШЩЪТЈВБДЕЕЗЗТТ€гЩгЫКœzЉЫЯЮЪШЩЫЩСЛИОНКМЦШТКИНРТОКМУЯбЯаЧЛИЕЗЗБƒЊЦЗЮбгДЅЌЎДДžДмсТТгаЌ›НржЮЯЫЩЧТМЗКОЩФРЛНКЖбждаВВКНЮрЯРЛЖДАЏЌЊЃ—ИЯЯЭЮдУЅЊЅКОЏВьўжФзЧЛВВКШФЦШШФССНТЧЮблОИЖБЉАгЧШБААЇЕТЦЩНЖЏЎАЌЈЈЄЌЉЛЮЯТЕЃЉФзкССпшрмрК•ЁЌДЗЛОКЛИББЖРТЩЩ€ ВЖЎА–ИбЭЧДДВЏБЗОРКЉЊЂЁŸЉЏЊЈЄАКМЛЕДЦекЧФјўёЯнырЄœЄЕОМСЛКЛМЕКФЩЪШУОРСЦЦззелЕДДЌЏЋАЖВВЈŸ—˜ЁЉЏЌЅЉЎЌЉЌЖИЧСТБШЮЗЅЏЛНx…ЁОЦЩЧЧЦЩЦТЦЩЧЦНОУТТИкхрлЗЗИЖИЕЖЗКЗЖžœ™ЃЇЅЉЈЈЎЈЈЄЈЋРРОФТТСФеЛЎЁЁНЧФЧЮагЪУТФОЖЖЉЋАБАЦгЦжаМКЗЖИЗДЖЕЖДЋЇЇžŸЅЉЇЅЇЎЎЕШдпШУУЫЯЯЪЯЏЌЗЗРУРСЫбЫЧЭаОЂ‰œЂ”ЌЦТжчкзЮ…~€ї„Ž‘ŒœЎВ‡mj‹—ЏOY~—ЎЈž–ˆ{Œ‹œЇЄžŽ~rzˆ‡ЈЈ‘Œƒzw}{xqtw’Ѓžž—Š|ƒ‚‹—•ŸЗЄvn…™Žemzmb~–‘А‹‰Ž–™ЃЕЅŒxw„’Œ‹‘‹oddrƒ‚‹ƒ„|jŠА”‹Š}xz•”•ЄЇАРьИhnmuit~‰‡}~}‘™ЁЄ’{kY{~w‰•‘”‡‚qz{}}‘Œˆ{Lc…~ƒgbv„Ž›˜Š‹ˆ][…‡‹Œuv‹’Ž}xx…•ЂЄ~gjkwz|‚–‚qx‚~{vmovv„…‹–Ÿqmvtgi…•ˆ‰˜™|^mzz|{qoNhˆ”•ŽŒŠ~~…Œ’›Ѓ’ƒ”~{z‰…•›Šznwr|tgt~„…Œ…‡u{vƒ‰‡‡™žЂˆzwkqtoz™Ј˜•’„}‘ЎА™Ё™w^i}{ƒ‘˜ВЖ–ˆ‡ƒxtgttv}…„{‚migŠ‹ƒwˆw‹utzpqnk„Ž”•‹Š‹ЈСЇ„’™ˆwt{Ž•›˜œ™”–•‚~‚ziq}„‡rngqrˆŒŽƒ{qŽ‘oiz{ootx„ŽŒ–œ˜Є™‘ЃАВ‰|w…|~…Ž„‘™ž›”ƒˆŠ„vvrrwwqx[u›АЋŸ™‹‡ŠŠ‹”nxjoqtˆ”‹|‹’™ЁОБЃŸ’ivƒ}~‡”›ЁЃœ”Œ‡…ƒ‚z|‚ƒqtv‰merŒ’—‡ƒ‚…‡~x~}txЃ”——œ…Œ—ЃЄЄКЃ~\q~‰ˆx{Ѓ•’”ƒƒ‡ƒvhp|‡‰Œ””tej”ŸЅž‹‚‚|Š•Œru~zv‹•›œ‹ˆ…m„ЁЌ‡jwrboŠ}„ЅЉЇŸ›‰Š‰‚|vtxtww‚‡Œ”{wi‡™Ÿ—Š{|‘ŸЋz{uxgr‡Ž™˜‡ˆŠƒ~`x–•ƒquuzމ™Ј˜™Œˆ‡’‡‡~~{qu}}€_Ž‹•tv‚˜Ёžƒ–Ћ™nw‚~]Ut‘Œ‚…‰Œ„‡ЃСВ‡vz|ƒ‡‹’ŒŽŒ‹ƒ‰„……‡‰„untm”ЖЉ›qnb~ˆ‰ЁЈŒ‡~‡ˆpU‹ƒj~МЎ‹‹‡…„w[ЃЎŽce{~„—›˜‘”–’ŠŒŽ‡ƒzxwrgibJА˜•tcqruƒ’‘wz{}z~w}„‡„™œ•…‡~~zoTrœœ{v|‰Ž•ˆ”ŸЃЄАž–Šƒ„{v}‚}oh`jˆ‰‹}„„Љ‰‡|{„–‹‹‚ƒˆŒ”’„z|„Œ…m{ЂВЊ™›Œ‡›Ѓ”r”ШцЌЅ”ŽŒ|wqpz‚vipˆŒ”‹‰~zƒ—‘’”Ž‚{tŠ’–ŠŒ‚~Œ‰ƒ‚„ƒ‚‡}}u”Ќсэ”Qt„‡U~ЎЫЊЂ›‘…vmhmoruvw„‰‰|x‚„Ž‹‚…–Šwˆ’””‰ƒ…‡””zu‹ДЩВ‰QJ|ˆ‚‚ŒŒ‚ЅВ›‰ŠЄ—œvigkx‚‚Šˆ’ށŒ‡w’—–‰™Є‡‚”™Œ…ˆ‹‘˜Њ’{n‡ЅВЖБœ„OOQ|ˆ—ЃЇЮЇ‘„‰‘•——}kj{„‰’’””‡ƒˆ„„Œ›™ˆw•ЄЋŠœМЋŒˆ‘˜œЄ›ƒ}xz•˜Œ…iO~ЈЖ›‰{ŒлюЊ‡‰Œ…|x{„uxz…ˆŠŒvx~Ž’œž’›Џœ{wЄЖZZ™Ѓ˜‚prv|}ƒup|ЎМЅЄœЂКЕ„|…‘Špqvt‚{‡‰ˆ‰Ž”‚v’ŒŽŠ˜ž•ˆ”‹\a‹hLpБŸ––’އ„‡ƒz|w™›—ЖЄЋЊŸ‘”˜Ÿ”qTpm}‡„Œ‰{{œhtŽ•ž”‡ƒˆ‹Ž}w{`QvvŽ—”œ–‘•Œ‘ƒƒ|zz|q‡ЊЧМЅ~Ž‹ŒДŠorqu}{}‡‹}zžvWˆŽЄŸ’‹—™‘‰‚‡‚t]Ck‹–‘…ŒŽ”‹}u{x{qo{…{ŽЏеЖŽ–’Ж–urgco•АН™„•p^~Š‹ŠˆŽŽ‹„|p|wxukTiu|ž‹ШдЃzƒŸ}PUˆЂЅ—ˆЏ•xŒ–žŒk\goqg‡’›œv}Z>>Ž–˜ЁЁ—Ž’ЂЊtƒœWo‚•—‘ФБЇŸveˆЖЕ”vv—ЇЃžЃЉЎ”•”›Wiv„x]|xˆ}rv{oЈ‘ЎВЊ™›ЂЏТЁ}v‰‚]Ѕ˜ˆŒ~ƒŠ‰—ег–pˆ”‘—›ЊЏЊЁœ’tqz‡Ѓkpu”’‘Ž…hzznЇБИЏЄЉЋЊЂˆ|puSO…—ƒ{ƒ”œ‘‹ƒz‚Њz…‚ˆ{‰•ВДАБСЅ„jZ^ŒЅ\ak‡Š‘›‘roSЂЕЗОДЃŸž›‰‰…—’@?}~tux„}ˆ„’„nox~‘”–Ž’ЈЁp^UOzŠ[rЃЄŸ”ŽЁƒxh•ЏКАЉЁ˜ЃœŽ™ЉŒ^NƒŒŽˆˆŽ‰ŒŒ€ž…~pwzˆ‹˜ЂžŸ™‘•Œzeo–ˆˆr~—Œ‡”…uvЅœЮЭЧЗЌЖИБЈЈ–ЏЕua’Ž‘––œЂžЃŽ|w—xƒ‰›Ÿ›‰„zximd™™ЅŽ‹ƒ…‹tnbpЉ—МИВОМКЎЋЌЋЃ–i7‡˜˜‘’˜——˜ЁЁ”–‹‚tk|ˆŒŒ‚„Šƒ‚~w}‡‹‹„z}„~xitƒ›ЅЄœВБЉЂЋЈЄž–~A\‡ƒ–‘Œ›–••’ЋtTio~w~……|…Šn]\ƒ‡„~r–Ђ‚„ƒ}|~ƒ–’›™›™™›”’›ЉŸrvŽ‚‹—’˜žЂ›„Р…e{‰Ž„{‚‡„‰ƒ‡bLw„‘‹ˆ™™ЕР—ˆ’ž‹ž‡”‘˜˜‘ЁЂ™„Ž‘‘ƒ‚ˆ••ŸЃŸ•žЂЂŸ›•Ёon……‹ˆ‰„|mdv‚…gqœŽ}‡ЏЦЉŠih[8WŒ‚‡Ž—”•˜”Š‚…Š‹‚ˆŠwŠ›•–œЇЗ”cq~wtzˆ–Žƒ‚„xzz„‡„|™žЗТрыЫ‘otkY…Ђ{‡’Š’œ˜‚‰ruz‚‹‘•˜ЁЋН”vЏŸn{ƒx…„…‚}ux}ŒŒŒ”•…wŒРдЊ‚t‹ˆ}…vkum‰˜™’Œmt{ur{…Œ–ЃŸЄЁŸŸЁ™’„…‚‚}ˆ‡‘Š‚‚„‹‹„‚›Њ›{m`ˆ™ucwmevˆ|qnkvv‹–žЌЊ‘žŽˆxmw‚Œ˜œ—ЈЅЃЈЊ…rpAGb…–„Ё˜„Œ‰Š‰ЃЌ„‘„‚–…xƒh|ž’nT\CQz‘‘ЖДЋЗЌ‰{ŠŒ…•˜™Ž™Ёœ˜›‘hw”{vebqr\z{‰{x}”•˜‘ŒŒˆЃ˜™ВБ`vro‡~„nvihqŸШДБВЊƒhzƒ~}„‰‘—žž™›ƒЈЉiPbdprrvƒ›Œ‚v‘ƒ|z…ŽЂЗЂ‘Љƒ‡ˆ„™ЇœŠvƒƒŠДИЂЈ›Ž’––”˜‘’œŸЂЇНƒzŒ‡g|vhbbAO‰Јœ‘‹”‹iƒ}‹дОБЈ‘‘™‹‚tˆˆjOdiit‡™ЇДŸˆi~ЄАЉ•~…‰’Ї‹qtqa~ˆ{urpp›Ž•ŸЮЋœˆ…ŠЊœЂБŠŽœŠ{im„ƒqghngqnx‰•‹}dˆЏЧКwq‡Ž•—’…wznBb’zv{ew›—Žˆ’˜™ЂАЕАЇž‘”‰r‚””€應„wv|uv{’’Œ‡‹ЁЛебРЇ‹Ž‘”’‘|{}kVju~~xxЅЅ›Šˆ”АЇœkn™Ÿ—}txwnwej˜|xw{}~~‚„Ž’˜Šna‹ЏЄЅЎ‘{‰––ˆŽ‡’ƒ}vxƒ„ƒˆ’ЅЃ™‚ƒЛЎ—qœttqw{naj‹…Œƒ}|„ƒ‘‘q]r—ВУ|z‰–•‡{ˆ‹‡{r{Šƒ‡’ЄЄ›r{uЃЈБ…x–ˆrz{|…„t^ŽŠ‰z|w{‚„|…‰~{gUmžАЄŒnxЄŸ˜”’”‰wpq}ƒˆ…’’ސŒŒЉЖžЄ…i{urnxuox|w‡~‘‡ƒƒ~v„Š’žРЅhu‘™œ’‡ŽНЦЇ™™Ž‹Š}ЈФ™–•‡Ž•ЅВЂ”„ˆ‡‚zztunhq……‹‡Š…ƒ‚~ƒ‘‘•žU]–ЉЃ˜‡|ЂВА›—„ƒ‡Ž‹‹ЁЇЄ™–”›ЃЊЋ‘‰‘‘‹‚|~}{qq‚Ž}„‡‚„‡”‰v`r‘Ž”™”Œ…—‰”ЃŒn‰–Јœ™˜—Ÿ˜›—•—Ћ˜iŽЉŸЁЄ–‚{vƒŒƒn„ŒŒŠ„……‡‹Œ‚ƒ–›ЅЇ—˜œœ€їž˜’Œ…ŠiM{›ЪӘ”‘’Ѕ›z‡хўИБТНЖЈ›wrv~ŒŠ•”ƒˆ~~‡”‘‡„xt~Ž’˜›˜Ž‹—–‘ƒaLnЖуЌqƒ…އЫАrdЇЏ”ЃКЋЅЎЋˆ…uz}ˆzx‡‹ƒww}ƒ…ƒ}wrjtv…„ƒ‰„}}…}ˆ‡Œ‰‚ruЃтїзЦЅ~o™Тœ‹œŒŠ™КМЊ›‚Ѕˆjiz„~Š…~x„‡‡ƒ‚~wuv…‡{x‚„—›‘……z~ivЉлтМЖ”|ui‘ЦЁ’‰‹Š•Ђ‘œ‰‡‚jnp‰’Œ›Ж‡‡…„ƒˆ‹…{}vvkx}{|”ž—›Ž…‡ˆ‡ЂЌКСЏ™xv{t‰œŒ‹‹ƒŽžŸ–ƒ}wqxВД•Œ–‘ˆ{{‡’އ~zt{z‚ŸД––œ…nwx{‡ˆœ•—˜Ї˜‡kNw™ЅЉЅžŸ›‘Œ„ŽŠŠŽ–Š…Ž”ˆ„~Š•ЂŸ—Ž~w}wWLw‹›ЅЃwjr}{pŽМЛ™•ЇŸucg‡МЋЋЊЈ™”‘‰~•˜‘ƒ„‰ŒŠЋЎЁДqv}‚’Ћ–‰~tuwzxtcˆ•žЁŸ›Šohr…„‚гјД—Џœ‹ƒ}Ÿ••—ž•ŒŽ‘‹˜ЉЏ•…‡…ƒЉЅ|{vqwŠzpprr€1ujww‰˜ž‹{mt—ЏВ’–ТбЖЛТgovwŠ‡ŠŽ„‡‡z|‰‹—‰|‚‚r‡Ќ›Ÿ{xowz}tpnjporpmtƒƒ{}”ЁЊ–˜х§жЛФдНrhuzŒ’Ž„‰Š–™™˜’‡ˆŠ˜–•ЈЋЉНx|x|pkz„xnhZbkpprvorvmp|ŒЂЄ—…ЇДށ„‘jENiˆ››–‘™™‘›––Šƒ‰™„ЏФЩе‡|„ƒ~ebkenqvqpwutvjr˜’Ž’Ž–—Ђ‚~mm‡Žž›ЈЈЁŠˆŒ‹ˆp|}~~œЇœВЎ|ƒ~~z~„„{{qqicgtzuq|‚w|™ЏЗœŒЁЅЁЄЇЃ~{}‡‡–—ЉЉ‘ЅВ’v]ck^v’ЖЭЪСЎџz€x}z~rhT\Šwmr‘z‚…#>4! %]WBP& .%2Mˆƒ`P&2gjtmok\bVcwxc`w‹‘™Л’EBE." !*A>La^E#"&3-4@dgTo‚jIMQ@HwiaWcb`dhgjh^YOEcƒ—Л•I;, !NohV> -7:!"!AY[HaeSPMPPA\dgmzvd^a]nxdcdrvЛЂS()I*" ! Vw]bcPY3(4UI0>\eZO9GQZY[\d`uzjngqumeQ[k‰žM.($-&"% $7\‡o\{ЃАrUP.WneohSLVJV[QMCrrtx{mejuqgrkdn…‰”}WC>B10;4.   Ib1FYxkG#(  N^nwc:5J (GEV\Qa~•oMNGL`jhc\ecd`u`1Sp~uptv”‰<*MI+  e‹‡pN$PV)Veppahttbr\chUtkdcgeoinƒdWTkx‚…}—|3&$!Џ%$# #+wvQ[- P;8.GIjdnknoV^aZb^quwi^tŽŠ~]JEYƒ‚u{~•E,F&# :`qii.€Б #3xcjqok]hjamk~webq‡kJ>PQ]‚…}•‡B3;(!&8WWzd.,iTL([‰rŠЁŽ`F\gdcZxx~q[\FSOZp]k‡…}A#!# %Ppo8-IWe?,CSwƒdhEZNSTN+Š}`Ijq~|CNVqpv…‰c( € !#9[tnF5]M8evƒˆˆzS[Y[LHG„iFTi~™‚BBu—ƒЈЇzm‰{U>!  %W‚PF9Q4(TOmpw‡ЉHF,V\GOvmZS3V•]9)# .LipMF5$-C J9LoЗЖŠ^e[Z\EacjmonnjdtxWtu‹‰Š}x‰ЊФ–B5& ,!))" 2Q^b`[Z9T‚[COd|acTWHHOTVOZrZeijkpeŒxz……ЄУЩo% !("0Zca]€1<%cQr›ƒƒg]\^hc]UPQdZ‘wjoqkotŽ’’ЊЗеСБ\!  &;`]AiN>^N$Z+UŽpg^^[V[Z`WWYPYm{gZnzqtŽ•‡•РмЧi0" "@e]\U+ Igk›ƒ„zvjSO[peaIW|•Њ~JUemj˜’—–˜КР) 0" ,)%-WuYU8ZdI70JUJB9JPŸ–Ў‹nHTmz‚{x|M;FQNutmw‚„Ѕ••—zW>(,0"?H9QJQQ478amjŠБЏЎЄOekjrmtz[+8n‹r[tˆwuq|…Šƒ’|)  ‡VnZ\LW0M{|‡‡Žˆ–’h:cjj^cot\T[;1% ?HVeŽ”М–ŠbLQOdv‚Њ~evAHj—ИŸ›”q”ИИЗ‘?7;$+Ф.QPiZWOHqH<$>UdhtŒ…|jg|n…Цр›—ƒƒ‰‘ЫыЁ-,;#"#€4;P59c[,?2Wgquz‚{tŠbTYQbxkjYpzžСН–ЅoŠœ—›V.!,!.$ )-YYN)FW8!>4xŽ’g—hnW^omit`Oea{mn{‹—bT„•ŠЅ”.10 %%BMLL^b‚™jS@\h`idjgmn]]„„Ž•”Œd‘Ѕ] -H&% (7d‹o?8gcPNLF;8OPOc[}p-CIJYggcdicaed^r}~‡”ЂЄ‘˜ƒ3 o?) GrVmvW;H2@UE<:,LmtŽw‡‹ZMx}v|rve\djvxq|ƒŒz{Ќ}5 -&#& LvpgicOG@F<0&EGvЇУТЄЏxPa`\wˆnG\`bggp}‰…‡„„ŸˆC+ ""*GœbQQeZ*;8,O;)Jdkc„‰r[daSzYO]^bgƒ}‡{ttŒЄМn. .1 &,pnho”nt|ˆŠ…ˆ‚М}C9- !*+" cŒ„gatj>Q]j59]]n}{Ž™Œoowoo]WYuTQdt~{xУ•‡}…u‹jC7->( 4‡xNmUY^b1F>AQ@Y‡Бž‚e‡iUib]oNQbPnpމ}‡…W$CN+"  BBCz{[JL9JcLHAIZrЈбРp[‰cMF~œz{eaZN\ƒ}…tru<(#" (;*&W‹xdPVTO?%LWI7wœжЦa@ekpu•ЕРŒO7rovpƒŒЃ…’F#$) $-WSbxQbVOB3;JOOLLCT{ЃбШЖj^cthiw’og8Bv„qz”‚|?! (+-Sam\cg^3B<4#<1LuЎьяЩnn€ rmz|~•ЅibV! ;A@EŒ™”•g5OJL^wjGdotƒАƘvYPVMЈЖИКЖББЈЏЎБЕЕЄВТЫЭЯнЃQLNC8!+-),057;>5O~ˆ…”‘ƒmhkntka~Ё—‚ЊЌ˜~ƒvrЛЏЋБАЎЉЈЈЄЄЈЅЁ”ЃНахЃPC@1+*.52.5834#7pЂЄˆoFoqztoiY{Žƒ•‘…Љ‹ЄЈЌДЗДЋЃЃЈЉЋЌЃЄБАТпЩn:4Q>78??<73574-8)rАœ‰”xgq{’cSJx”’‘‹Š‡ŠŒˆЇЏАЗИЗВЉЏЌАВЊЄЂЋЧТаМb,+?A?AC@988€X>?88())::B(OЃБŸq&g’{iot…‡ЈЄЁЁЄž™ЂЂМЕЏЊАЖдЪИЂ›~—ЧИКВЕбДM9C1+1008<*%25917U”ЗБВ„8:EIrtbhvБ˜ЃЄЈžž€ПŸЁМИДЏЕЖРЇ‡x‘ЈМФКЗЗЮБN7@A3),297.)-3;,&V•ЈЖЊŠa}Їœ”vY[˜РАЕйЪ™…–›™›ЧСМЛЛЕЄŸ‘•›ЂЊЖИИОЩЇO#3-&,7??0$)78I4H–ЌЗЊ‚P”З‚Z}…‘ЃДЃ›‡Ž’‘ŠjаМŠАВЗМˆЅИЋАКЛИРС‹@()0)(.53,*%),#31(9˜СЩЏmqЂ›КЉzpЄУтнОЩСВЇЄЈЂŸŸЌ—ˆ—ЛСЖЎЎБИИКССРСЧн7)>CB94.-*&0::))@ŽВЧ2A]SWVP:T›ЉАБЏžЉЃЅЇЁ™›ЁЈЇЊЅЊАБДВЌЋЌЗРЦФШкЩpTLC8:403+1-49781QžВМ–oœ}ptƒx’•ЈЎЌЊЌЇЋЄЊЎЊЄЅЇЕЋЋЈЉЌЌЂЋЛЛБЗМУТНСž[M852#!+02FYQHMSMa›ЁЃ‚m•~muPhЂЇЋТИДБЈЈЇЊ˜~‡ЁЃМБ–Ž”‰ЄНОРКЖНТФРУЈA883.$%8352V`A:>Jg˜ЂЏuYi‘gI™ЊУбЮАЈЄЅŸ—•’ЕЅЖИЈ—‚hxЖЯгТЛЗЖОШахМJLG*.,287710)5);IdЃБ”Šˆ}•i‹‹—ЕуыТ™ЅœЁ›Ÿ—ЁЏБЎЉЎВЖСК–ДЛШЫУНЛЎНашЉPA:299@?>?>:>:@EP{ЄЅЎЊЃ™ŸШŸcxŠЂВЇЂ›˜™ЁЄЂЁЂЉЌŸЊЌЌБАЖЧЖСШЦНСЮжщщƒ7!&44895>>у2)A3JQYДЏžБ”}x\}Џ™–ЊНЦЫюм•ДЌЏЋАБЄЁКЧЇ–ЁФбФЦЦЩЮёп}ZaM5152**,::7CMeGrАЇ›•’‰‡–’žœДхўюгнѓйЗœŒЈЎБЈЃЌсЖŽЃБЯгШЖРРНОФЗaH:8-4:2,+1899$3Hc›Ћ—•wn˜’‚CNMB<\˜—”‘Œ^o‡{ЉЇВЩУТРЉŠŸЉЊЋЎБЌЋЇЂЉЄАНЕЗУЭЮгШЩмйФ]2):<<;:5>;:?B&[i?PЄœ–ЋЛЊˆ…Ž}Š›ИЗМОФАЊЈБВВБЎЋЉЇЊЇЅЉЏЌЕУаЯаЪЧШгЄA4;<;:;:><;F;<5POrЖАБ›‚gk\‹Ќ›ДРЊМхСЏЉБЖЗКЏЏЊЋЋ’q‘ЖЩЖОЪЯаЯблЫЧŒI.3:5;3;97-38?59TFƒЕ‘ˆhh™Ї–Ž––ЂпЯмЦЈ‡ЏДКМОСУ—zŒ˜`‹АБВЛСЧЪЫббУЃnQ;.+,598+20::FIMZ@dŸ‘ŸЇ{{ƒŒŠЇДБФчыём•ЌБЖДЖЖФЋtuЌбВžЎСКЛЛ€‘РТТЗУ™H03%3279:7:5538p’ž–x}]ЄШЧЮЮаЧЩФ—~ЋААЏЏДМЎ…ŽЊ…ŽгжВВЎТТЫЩ‡]@"57;815:8?0+*(:HrЇ™Ÿ•Ђƒq{c‹ЂЋЈЩгёйаЇЉЇЌЊТЯхТЎБ|‹ЈжєйбЫЋЪуцрВNPS:<>>321500€':"8`e•ЃœЄЂЕ•„ˆŠŽŒБЎСарй›‚‡ЇЄЅЊФСРИЕРМЗШёўЭЯРСМТюўЖC@JA>A82,0%$(!)EShЊŽ‡ЏЁ…Šc~g›БКРКСЖЋЪЌЋЋœВДКАЅДЦМжьчжзЈЩедЯШmB:@>C@>5"03+,-7:BFu”‰m^Ž•h‰v…xuКзееЌЫОЏДЏЋЎБЗБЎЉЌЌТЎВИЪЯ‘ОЯЩнТG(2C<:B>7,:<:;2,9FO|Ћj‹•‡du}t›ЃйчлЫЪУМЛННЛВАЉЉЃЂЊИрТˆРТЕДИМШФ”I;FE>7;?78;7395@9E^”™ЅЄБЁ‘|v{q”žŽСяцкдЛЕДМНЛВЉЊЊЅЊВЭ|rбрФТФЩлЭ|BA[?:54:1?;>52";B>83:?CB3.)(.*-?QЂтН‚xŸ~Žˆˆo{ЏаШаУемטЄœŸЂДВКМ–‚›ИЩУЦЦЫОНСЧЧ„1?M.558:;7.104*0>BA<75891)5hЋИДЏЊ—‹‰’ƒ~ŒСшѓьЯрМ—ЎИАОНМЄЈЇЎЇЄСТСШЩЦФмИW:(?4347<<>:EA>@P.5pгШЈЇЄЊЈ‰•ˆ‹‹‚ЃАДагЉМЮЗЂЄЉЊСЉЃЋЏЎАЮРУЦОУЦлр„C:#:89-35:ABHFMGE@SžРЏАЪЇЎЖ–™^h–ЇЇЖМЯщў§цуњаИбЖЌАебеЭРТРРСШЩБP?:,.-749??FBOIBBH<^АТЉЌЗЋuMg‚WAЄœЄЇЮйаИŒЄЊZmУЕЕКгИТОЫШЦСФбч•SNG-448A??B?A>BF7*—гбКЕЦЗ’ЏЛŠŠЉАЕШУгрЦЛКОБЕЅЃСДЏАИЖИЗєЮУНСИНzSIN,87548?<83BUGQ4WЗИЯ̘āБЌЏm”—Ž‘˜ЃЭятСЎгБœЌФЄЄЎБЊЇАЌИЧЧНЯЩОƒ92S\?;505;>>@7?S;jYnЧжОž^˜œЁžž“–™’rpžОтўѓЈЅжБЄŒЭеЪЮЖœŸ—˜ЩЪЫзККЅVFE<934.*1<>>8.A[HSE‚еФЄžЂЉŸ”™˜•”‘‹–ОхњщЩЈЖД›ЂЫЧхл›aЇЏТЫШЦРО—9GY;>:88;:;:99ЩEJEM0PЅИЁЈЅЅЄ˜”™ž——•–ŠuЅк§§ЌŽВИДЌкэяб•ŠИЭЛНЧЦсЫШo5C@7;55€”@B<7558>{ђнБЛЭЎ˜—˜Ё›œЂЄЁЅЄЉЎЂКуўју˘ЌЄЂСЭОБЅКЫЪЩЯжЩ‘TJ@TE78479A;8@,PG5OŽЩРСС—ЎЃhb—ŸЂЁŸŸžЂœИЖЩллЖŸВДЗАЦрпШУЖЛФШУЧнп‰YZY5;7<@A4;92:`xZ‘йШЅЖБЁ›–…ŒЊЛЈ›—’‘{tЌдрйщЩ’ЌЗКНШгбЩŸЖОЪЪТ€мŠ„ŒŒ‘‘”zdpЂ‰‰ЌЅŽ–А;2]Q@"-04883,+28G4o`aiC *#)1N24;TeiWikdcO^[Noz}‡—‹twiex‡wtu‰‰ЊЧАg>AZG?GCC€ž5:>:71:,d…rqo^\G2?NiG:+!JnrdWZN`\[pvz‚”}{w~„rhr|ЁЁДЂb33NOUQJC@81;7-4J1g‘~qˆАМ|a[FcrnzmYV\Vaed[Y;‚‚ƒ™˜‡ƒ‚~ƒw–žЄ’iVQUU^UM@?7-8$&UtLUq•ˆ,UTZ``Whv‰БШZ9NB.t‚ƒˆŠƒ‰Њrnzƒƒ‰•–ŽeY^a\JO(!0(4$+432`nx„qMJ[7?45PJVdcx„Ё}]d`Vpxvxwwxtr…k@e‚Žˆ…„‚ЁœM02>g]GO@0!%%(#$&r›’‹[B]^7E-ap|mt}}h‡qruk‰ƒzuw~{|˜wiZ{ˆ•‹ЊGBHC;FCA?.$+,-<EŠƒatI4hBA@LT[w{~{vgnioqt‰…‰uq‹ŸˆneLe–’‘‹ЏЃUIOIE8@84F-1.5:."Nx…r‡T  ):77H‰vv~{xkww€›x~’…v}‡”•vSJ\\u•œ•‘‘Ёž[MSO@EA,*77)BirvQ.H}gaH*mЂˆ˜ОЅq[corph›”‹˜‡joYYbmznˆ—™ž››[-*B>4*<:92"&>I#CgŒŽzOPQ`{T4HLi’}x`bj`WU@žŒqW|}ŒŒQVd}ˆ”˜~F0*.00€j(+&-".?QzŽˆa&%G:5nVFr…‘—•ž„ehghe^Y˜…Ubw‰Љ™TL…А–МКˆuž•hQEE85,*5*253*@Ab‘™eWF9dL:qQZoG20-0)343qˆ™`(" -h…ƒ‚v{po~ojqvrpjr}‚‚{ƒˆ„Œž›œЂТТ|\\J5A94$(""58+@z„kA*4&)GSr|xp $>Y%8tm‹Њˆvhto|xrhigwtЃ‚}„‰ƒ‚…’ЁЌЎОЧчеЦp90(2%5.;937*&4J]nr[|YTm\E$Bp\nЁŠ~unuegorojigcƒ‹xƒ‰‚ŒЁЃЎЇЁЇашр}@;55,998??021#>W{xgd*;?%,CbrzЈ”–‰~zebrvao–АЛŒcpxˆ{АЃВЇЁЎЮбЉ7#)L445+5,0:93EIMrnbSV-QWuŠ’{ЁŽ‚kkmqz„di•ЂЉjwtm‚…˜”ŽœЭа™SC<>2-*&.:+B0GTW‹„g‚WH8(Mq\\r‰—ЇЫИom|tuxˆ|heŽ˜nd|hužБЅЃЁЄЋзЮ\cI:4.0$##+438M`Sa~njb[QN\SoexНњжЕРнМ‡bdq~ˆ|qmЦmau…ЅЌЇ‘•‰ЂžЌЏbMH8)<4;"-$9$.A[‹xc^;)WNH<”ОŠm‹ЇФƒ™Ђadrpbax‡e•АКЪаОЉЊ™œЕ̘MSN;::?A-70801+Sdn`YYPBb3!)?Jk~…›„`TQetwt{ovzvqVxŽВбТЖЎЂ”žЄЈuSM;7:793).50CPLCL^oe[YVUJ(4MInx|Š™’zJtjptoxwm|p~’ŠЇЊЈЌИЏДЗЌc2%?GFH84zdmvtSPEH?Sb~‘…•xup‚‡~{zxvr‚{vw‚ŒЄЅБЊЈЁАЊ‘979A@C?;B>4.$-7\SgƒxdL3%5(Oke‰w–Я‘x}ƒ‹•„{trn|kG^‡Ѓ‰‘ЁЉЋЊЏЛЎЊŒI2;@1189;2*(54"@ZTn\NI4*Ye]TW`mЏЄЗ‘tUj{Š•‹‹dH`k:b’…ŠŒ˜œЅЗЏЌЌŽdVE$2;>A5<(.)"*@MPIi{xŸгЭЧЛct‰~||‘vMM}Ÿ…n‡Ÿ‹’—œ‹Ђ…E0-441),35*#Cr„htceG>?+jˆƒ–žЇЁЄЅ|Vx~|u‚‰‡qI[mk[eoАЎ|k}™—ЎЗ‰\;"89>;42:53%BP^vc]`]OH;H7U]o~ЊзЏœojmpv‹М”m…L]ЎлЗДЊ{ЌаШСЈPOQ5BL;:*("$"Eko~gdjduUQSOTPvjЌВАdJMqzzƒž•~{Œ‹жѕАЋ›—–нўДFGPLPGA97) (TdgŽPLuoFS2[JH4[k„ŒŸ˜ˆ~‘ztri}ˆ~h…–’ВлбЉЛ{ЁДЖЗКg@.HFBJ@5599€•,0?PPihYB[i23GIMB„ЃЊ{Ђ–v„un|}}ˆpkqr’x‡ЇЎoe™ЈЃШЎM%4BAPJG@%)$&,&5FQbmW5T]P+BC0\[vЕТЏЁ˜”‚„‰ƒ„{k‚naepŒЕ—\—~ŠœЃЉˆOBQIGFGBA0))).<:I[rmjjvmZH;EJ3TcY˜ЪаИ~Œ–~trzripƒžOCЌР›ЂЌСЕzAB^IB53?C#7,$9BBb…Zmd]`G@NANB~ž’—Ђ‚tpwzƒŠЁˆaixv’Ž|t•Ё˜•ŸЅА›bC?AB@;@54,*8902VA:‹ˆg›ЂY<E)Wdr}{ˆŒw‰nkzv}…Ѕ{T9jmКШБ™ИЎ››˜ВЮžLA2HF>3$!!$3IW–М~TEWcBVM<;>zЌЊЌЌ€emm`tv˜xŽ^L^‹Ѓ—‘œžž˜ЃЅЇz2?O.*5@;4#+,>`‡}~‹Њ…„”Ј–˜™Ўж”UEH):53E@CI21+85<-*~žŸu‰wVgnNZok|—ŽЈК›‰ƒwzpjiˆpov„Œ‘кЏž•ˆž|YNM21>?B?.--1?H^eu{riujSUVOYNSF?a‰Кўўх}……tŠАРOe‚Њ›ЉВВƒjY@)+101*1?21BHCA++LŒЇ›‰–kS0NSabb[\WQVZqОЧЭ‚~r|‚m™}VQhЄ’”Ъ›ƒ›eJ41-1%+0271,#JF(5dЯД~Œ–Thihcbgnkk€—pkq…УсйО„bwtUh‹•|t‡—’•ЈЌЄwNN8]H:879.,<90(A?+Br™—’”Zuc11Ne\`o^ZW^`‚„ЅБИˆnw|w|ДА’ˆw‡›™”žДК]a[9@AEJ>;4402\‰\‰К˜{…nj\QSh}o`[ZVSF;ƒ—ИБЗ”WuxАЂЃ›kt‹›’•џы- #!#)!1ћ г  !# +CC$B##7 )*ђ B# д     8OtHckd;0, ќ ќб    &"NxaJLW, #7  ё э    •5Nc^TUtŽnJ$!  &      @a~‡xx›‹kmFTxm(3-)   ќе   Ybkak‚|edQhoW.J+  ђ ї( Ю Wg^Y^hwvgmb<1:OSn{vOCA  Т;" kpmnvˆ„‡]ќ Ю…qikq|pdiQPqocwokb^PBEWЉ‡vhmtvLL>ObMO40\B§§Юkimhv„„qnbOU[^hoj]dvdTMeS{{gmj[^MNIIJJOg]G0!; ]<ўк bhquƒ‡{mehbaW[quhgheVMTWt˜‹~bcYYщ@MW9SWbUec1*]H82‚ "ap{pqqo`[[\TVgajgSHTITTJUdz{zqvPVdYSPNYSZ`ƒadb8  VW]npmkmeeVMVb`jrgadUbUTbkmx}}PPPS\WYQUWboq`^t|vu4*%€ƒi.hcgtutpjcW\ehZ`e]IV[\hb\Qhtxi4MTWZN\W[TVTdn[BWqg]H"8-;W(  icgdhjtnbMNij^`V?eY^miephkq‹‹amjVz|rTOJWZdpTtЈ{Uw\a^ZepS;%&€ЎVUdqjqkvgT^UYVUOA7:5@`ajeqoo’cF?^pHMSGc”Зtiqc0Ipnqp‡~`qH7&ugd~}~”YSN2A^UC88NZzWL9:wƒe‚cI7vВаЈohaiЁŒoO$LG[Scgihngju}`?4p\`mthZBJV1P\ZZUWZ[YNY]cn‘vp%T\jb|zm[[”’{v^oœ~i]c]a[oxowj^HAkd\„И•d5AbS[k\JG]g`\^kkŠ”{x„vdbk‡g9Ab‚`kvt•‡{}qT`eogerd{Y^YJ@ZJGrŠ™n125^gkk]IVTS`c`agzzxJhgOP[`zjLSVn^^jcvtn|^NUSbY>|jeI?^U~k[މYOScŠ{z{v‡aZ^ho~Љ~ztzw–›cV^ne~œJ@OPnb\]ajqwrbiohvŠnWL@‰w…Љ’›OIS^tˆn{]]S@‡eqr|Œ—’ŠwxU[™vz…porb\\h€ŸbupjhjgezW,EE8—ЈЇœŽœЏm?zŒ\^V[S\FPjƒ{~woqmL\^I[nn}ƒzhuve`ae^eZ\hhcp]bji[^V`Qcetkk‘Ў›\Vbkmkg`krk81J‰ВЁ‡‹~xmgkmrpjwxnt…j`waUWa^oegkrnoiTYƒ—Š‚‚kTqpnqwujpizz|[V\WPOuƒŠ{qdiZbmmo`epbpˆqjhxvukp~TGPZg`HbUah‡ЛЪ›ˆejwxzramernnvzu]U^ZIjitueeaaddvnbZbopacpputuŠcWT#otz~UIx{Œ—~gdZi|{zqckvvrqa[IUWgnjtpnt[hh`T^STTctunjbx|qzˆuiV[9Bqza\bŠ‚‰Œrd[VkppmZ`tuthoWW^]T\t|k^b[oaWYEO[becjgmoqxrqmbmzuwHm}–…qzPg{›”ŒoTWevruxear}qo\1JW^Tcun^hcYqn\VWjirMz~‡||wmj`Z`mtn}qqi~ƒ„dJ^iz|ˆihoaqiucjikkm^UOVSxYgnbhbjb`i]T[c`kLЊŠz~thjb^kpucx~xtzZza7Y^dn]\O4Q,4>Ybhh{rzwt}ehe^znPn{~J*b]mwknr}z~ujdr{vurwhqt|u[]UW`omnYMMBJ^a\ctrkZup|{pr`YgrehnqoEGG}rq|pdw|w{|iu}z„|wutSbaUWn[m~kM`Oj\`]iorh`tk||‡ž‹ecdkrpw‹vTUb|™x|{reevvt{i…|{op‹ЁuUoj?^dVx}‚v|„pwkVjibhpqvr‘Ы~\*or|{„ˆ‹n‡~Zq{kjqinu}ztuwqookmZ&C\-n[F[k[wƒˆŽ…[iijhbbmmrhekmtL9kagxwz}g[:(Aƒ‘pjah[^xzwrandntЉT*G\ZcZHu}ww|}p„mZ:]VB9,!$IWP:"+$84*:G "492&147@?;0*ZxžŽЄЎc>TA(4-"(&%"3+3-0#%(#($&0-.,,&-792,1.130.(.87<;98..%<<>’Дǘ…Z7!2HQ4*<**)++(.$$7;9++%14?9:E4;"$4SUY2(.+*-.@%#0,&388<:;91::0>3".-&*@,&7QQCT:BI+(J373F- ;TG<5$34*"2"+&1&<91##491\ƒ…uZciQ,#$SV#9( -4;:;??)0**.0137-*,0-$&$"$*%%+?:E\uj^g{{`19@-),,€3("*@;A41*2584-.,&(!$"$&!!*%3--4%!$.$2MwЃŽ‰Њ{~^g„BGG?1!$2*88:<..&4.5-"%.." (!!+&0!%#!)*%0"cnut‰—‘}waz‚h:HbO$-5,5+#--5&!&)*()).% C2!((!91.*h~wkj}‡}owj[MJbh„[PO7*;3:"+31+11+077.7!+" L@20."$$.:,t}zƒˆ’ŸhGcmecgƒ”qQELS9;,Ad\BTF724$-+0)1--%"1+*7""-%‚zqpŠ˜‘zhptvtoaВЋ^rŠ„p^‰Ј˜iQ>! 0;5#1(%)#-%!&,40)&0+!,5imcI’rZq˜‰‹vjp}˜dY|~}xœЁ’i^bdQ5BIIO;-*#2&$%*##4$5+%`ˆzzqx„xz–’Šƒvot‚‘™WmmcjpŒˆ}bpk„CGe`c]uaHZ0!+"&I"1!"+5,.”’ƒˆ~‡‰}wwin…p„xwxphdajŽМ™}wz„~^\YdrZcPQ83<"wV "*",%"("zvv{‘‘€Є{k`jidm}ukkƒu\\tiŒ‹v|ord\`egVbqb[C>P1w^"C(0(u|‚А—Š‚pwmhbd|‚wteg`ZiƒЗ™ŒzojtiW^h\]ntnwŒrA9h`$MS2#$,331pƒŒ‚‚oq{gjewr}{gckdgn[e‚œžŽ‡Šjnurh]cakdt—Ÿƒ}Šp>HI0-!$$98#1onvzƒ‚~‚wvgdotr…wpzou]krˆ}Œ’•e8bmeijggbox}‚tx”ŠQ"!>?! !pE(0|rw‰w‚vuwzuwuxiiecdwwmi~~ƒu?[dmjcmib]giw}iN`xvoUCTT45Jh.&"!tr|{~rgdpqqrpN~gn{ztƒw{}Ÿ›t…}g„‰„gjbmgkm‡Ќ`Švmkix~nMwnƒ‹ƒx…”ޑބ‚ˆ‹ƒˆŒ‘z‡„‹Œ{pabt‚{{knepwvrv‚…‚w‘‡‹™Štu„…~z}Š„SVQ—ˆˆ›‰ƒ’›”ˆЂ•‘”—ŽŠ‹‰huvjmn‹ˆg}mu{x}‹|v‡ˆ’‘œДЃ{t…Œ…œ{eZr–З”–•ˆ„‰‰ŒŒ„‘•˜’„ƒЂО”p‚x`q‚j’•›’•–ƒ‚‚i{|x{~ˆ„‰ЏьŸdP‰’–™ЄŠ‘‘u‰„…‚x|ˆŽŠ‡‡‹ƒ}‚aC\qIh]nˆmŠ˜˜›Ѕžu~v}n{‡‘ƒx……ŽbNt|~Ž•—”q\:[™ŸŽˆƒ}toxƒ‘‹‡~„ЧgE\uorug‡™‰Ž‘”‰Ѓ‡r^jhoq{zu‹Š‡||n[”Оˆ‚…ЄŒdd€юQe’ƒmu‚‰|Ђ—œœ–‹t‡^~zpz~k”—™‰‰zr~qƒЏžm„‰Š…Šˆ…zmz~ŠŠ‚‹ЄИnn…œ™Р”‡Š„‡•Ї‹‘АЉžmbhqˆ‰|u|{„’žŸž›mrŠ‹……‡ƒ‹‹‡–‰ƒ‰ˆ„ŽovŽ˜‡ˆˆ›Š‡Šˆ””™žЋЁЇЏЎ•‹gjou‚{|„Ž•žЁЅЁwTivq|u|ЄЈ‚…z‚‡wz…Š‹Œ‰…~‚Š…r‰ŒŠ…ˆˆ–”•”™œ••…‚„}ovw{…‘—‘ސ}]nbThp‰j„”Ÿ‡џ€DeI >YI E@TNP^ehVVQPJNFU[1(,BBbn[\VQ]bu}z{hБn~‰}neaVemjgpb]heh‚nY+>9CTaaVTSek`NQA\gY^eY>O>!M[Vg`MVUa‰|tzƒƒ‰xh\aee^^\`bprˆ‘4QW8-?[ZP?ENEYQMSMIPJQNS[Z"CTbUV^adv‘Š{~‹…|‡…}|™uY[bh]]^[U]``p|.:-BHM9PEEIS[P\e-4EZVHgN@9VhmdYhht}ƒ‚Žƒ„Œ{wrka^akxtnpcWekchr MiWA^hjg`gV\IPWI dgj]]VZud]GJaZIЂ‡Ž…ƒ‚z}~xmeikp|ukadii\m{&€= 7 LZTVSJW\O3MWdZUQIWpmu||}‡ƒ‹‚xpechpnnmZ\Z`Z^n:nnMQHJNHSISigZFE7NQCEUaNJCzВФ””‘}Œ—…xtdeabibcd[P\ak]]  MIFCIU^SI@ATV[\[C!CBQNMWetzp|…Ё|‡~„‚„nZaekppouaT[ddVZ !P`gWT>NUS\T[Obn‚NUcbabuvpp||xxtx|Š˜Š{`acbek{xgbi`T[ [JA#;.:IYoj#<^cpo[`pqepihiv||w…–…aS[gnjw}{hZdSWХ44Z|}TVY^dHMUcOYeLpž…ƒ{ukuwt„Šˆ|\[hr}todgaebYj §ЧPOVbƒw}^`dekprjm]LjtdYJAI8)ћ  Ы  !& "?A^ephaYWj‡~V@Wak]]WZ7;8   њ –   ME9GUvnhZ`ddN7@<+ZNM;   $ 1>#40#$  H& VONiCF&TN ўЫ   * %(E 4. FSZhUL*$&N<Х ( +- "  (3#d`ZI@YGS`JZ$8ўЫ >(2$#-+! 5;$4SN;@Q[PQ:F$$Т  "&0910%",$ )(A2UTOLM\QYWZ+bbўў У   074#$%cSZYcdt`?3NZ@404(Л   $ $ ][VJMQ27712++8+ 32 €Р     im[HLJU5Tw9ViTbL9~„i4       \STTFM(UFSg`ac23O\`SY<  "#  %#$4%)LM`cWJU1FJn‡r{pM74YE5€ (*  ##()hUWTbhN&Znwtkoi]PuW\quc5(   .#$  +TbUYTUjw1ThOLZ[^|bSiSB*n:.@<4E%1,-$%.& #Bba]TF]ddQrhLTjUAHHOF,<#M5VWA;2% "$"+ "$!VSQ9OSIJYVgjxHFMMJJF2@NcCYTW`„~bB !"BQ 4+%)17%%YUQhZ[[€7W^baQAJJIFGL``S?3;?.!B8JBPSnLM„ЃongcUHTECQ-4PhuE$4\zmhenr|o`\YPu„”w–ronz‡Œcgr{caIadh[cLIWA<:Ot`n]\d^jhmNIYhVJ)C\w]idowwpwxkuu‰•‰vqquqkn}{ZŒZUkƒ{dONWaIUB\™qdnaVphgatT%P]B@)PjorriS‡„}‚xd]n…Œ{}topuc]ƒ›АИ~]mox~uY^[H&FMenrvnpceeqmve:VaZu[84Svvgg\Q{z‹ƒtkw’”ow}ƒ{vŸЉ{wzx{‰‹w]ZZUEJMQcTYdnmgdjeCCF8UMTMEI[vuu~•ztv|‚‹‰t}…‰xtt~ˆ‹…zƒ‘Œ|~zw}{~zNHGH]YbTY[Ubdh]e[ag^eiUFNTPh„ou|‚ƒuuƒˆqxv}}qu„„}‡’•}‡xvw|{7J\^VI]bdg\gwrnndZbeb`eJILCcjˆrq|ƒ|ƒwqzoej~ƒ{~x{‹’’|vvxrbcZiYJWcTa`kdjeqqnpbZ]E2V8T\O[EM^cvuuov{qqmddjut{qnpi—‹‘xnw}}n`^cNSNO`am]ejaktmjhZrY4G8>xe\eAYjoƒˆ}ƒ|}‚kn`maeqv„‡Š„‰‚w~z}‡}ztnmSbhSVPWWVjYcbddWc`dM:EG>^Znnoir|u|uqztjtxwhoeZv}zwˆƒuzЉvvzwzmekung^\Z^gcVmmheqxˆjx}njchitndnw~ˆ‚rccjt{|koumu~}zƒ~}tt…‰|ƒ‡‡˜vEx„uabbZjmgnvuv~„jg]nxkhTcjwictv‚‹o|tdo‚ˆ}mimnuŒˆƒƒŽ‡|ˆk]„‰ž„abr…xgitqqre^eu}…ƒ}rcji]CVk…vhkm‹~mw…‚uj|‚Š‚ujqu{ˆ…˜œ™Š‡v\Hx’‚Zg`kidtqnibip{zxqhprjm]9U+5Gg~k’’Ž„—˜žЂœЇuŽŒЁžЈЋ‡‹ЂЇЈЃЅЇЊДСТТЦФУОЛКВЌЊЈЄЇЏБВАЌЇЄЅЉЅЌБ+*:-8ЈЃ‹žЉœŸЄЁЂœ™Ž’”hЅЂЄЈЂŸРЋž—–Ј››УЦИМСОМЛКЖЖБЊЊЈЋДД€/АЉЉЊЈЈЊД82;4*:q}n‚ŒŽ•›™›’’–™žЁŸœ›˜Ё™—‡‘ЎЇЖМОНОТКМНКЎЉЉЏАЕЕЌЅЃЅЁЁЃЇ.&-2)2LP~ЏЉ’Š’˜–’Ž’›ЁЂ˜˜’›•’‘’˜œ˜ƒВсэаЩТСТЧЦСОДЌЇЉЏЏЎЋЇŸž™ЂŸž92.5%2872Et~Ž‘‹œž›’’™™ŸžЁ›”™—’—›ЅДЗЊИРСОЛЗТТСИЕ™ЉЌВЕЏЏЌЉЂŸЃЂЂЁ?0:*".->2;L>[˜ЌЌ””‘’”™›™›ЏЛ˜ЃЈЇЎДЕДДЖИЖДДЗОФзЮЛ›ЇЉЎЎЏДЖАЊЇЃœ›9<0-)+73.5<9N‡›ˆh‰Ž–ЎЊe]|‘ЃЇАЌЉЌЖЖЕЏЏ€џАБДЖНФЧЪ͘ЂЇЊЌВВЖБЎЌŸЂŸ934++3-.1(2)9>YnВО”‘›Е›GY‘–ЁЁЃŸŠБйРССККЗИЕЗИНТСС–ЉЏЛИКЕВЎЎЌЈЇЄ3;83,--.+)*1&*,0Qq‚‡‚v‘˜›apЂž›ž‘ЄЏЛНЩШЫСОМРМСИЖЖЋЈЉЗЗИВБЊЅЇЃЈЉ!.55+,%-+3V`B20-UEQm•ЈЎ–‹ŠЋ˜ЂЅЇЋЦККШЫЭЫЩЩУСЧФРНЕАЌЎАЏЏАЏЌЈЃЁЊЉ#&"$")#%.@GB:2EC2Q‡jxŽ›•ˆЌЇЉ™ЃФжЦЪЪЯТОСУСМАВЎАЏЌЅЉЊАБЇЂŸ˜—&!-(%#)(F1-F97;-.#51>LrЈ˜˜­ŒœЊР˜ЇмзЗННЕЗИЛСЗЗНВЌЋЊЈЂЈЈŸ•‘’——)!"..+((23*-).5203221FYr–А™ЅЃЋЊ•ЭўяМРЕБКЛИЕЗАЎЎЃхЄЁЂЄЅЁœ˜››—"%Ȋ.10)).77Ÿ<;>NG3Lw›Ѓ–}|ŽЋббМЗЗКБЏЌЕАЅЄЇЉЈЉЉЎЏЌЈЂЃЂЄЂ!$22+A@E)24&+).1#)39%9drƒL#-g{ƒˆ‹zŽЇЭЮКЖИЖВЋЋЏЏЉЃЅЅЊЊ€њЎБЏЎЌЏЌЊЅ#&(&."-]F!+"!()304.0:AG>!(C\ƒ{‘Ђ—ЊУМБДЉЋЊЎЕДАЋЈЉЋАЉЇЊЋЏЏААЊЅЊ4%)&*4$#,14:;@842(1&+;?I;‹Ю•ЉОЌЈЌВИКДЏЇЄЂЁ—™ŸЈАЌЈЃЁЄ$*%.#")%#$#(+!(%:$,828#0GE)CdNЂЊЃЈЎЌЊЊЈЈŸЁЂЂ›™ЋЈЄŽ˜’œ%%12#$#!)#(!-+0)#"&#.93>71.1,0LYCg•ЗЏМЄ™ЃЃ€ќЉЌЎЈЂЅЅЈЂ˜ŒŽbLNC++.3%&%)!#+-%%#*055:78*.F?0T4EJ5Zo‹ЃЏЈ›”•ЊСН›™˜ЌАž‘‘™‚g757+*0,-#*,!&)%#()%,,1.493.$))+.5;29..*?CQpgp}‘БŸ•Œ—ЄЁƒdv||ž”•p812+94#(*&%%+)%,#)&"(*.,358*,.8;<>@77.1N]GTCHE<:<-9?gI:;@7‘˜Вœ‹uH@ch#-+)++(-#)*.-(-3::?:7718::34?9@;-EJFЃЂ•‘•‘–Ї‰QUT,((!#*(.8P:527A;5EJEF9:9;8CA?5-318@G?372CNPž’‘Ž–—•—АqPQ7(+#!&)#$&%#%*..*3;;7:@JLLE@>?BB?5399;<:3;8MEEN˜›™’˜œЂ™œ•vzЉ—M(3,)2-(&+0##,4.*28>8:878AJ3370@B;;A<7>:A:94491-›ŸЄЂЄŸŸТБ…q™ЏŠ‚]&NI-)2,(&++*,741078>:<(*-5921:8?5-.-421Ÿœžœ››ž—ЂТ”|Šz…|tab\U*8OL#%0-%,.+*10-+72541,&*02120*#+-(%$*,,1ЊЊЄ›—œ–Ÿ›Р’˜ЎЇЇ”„КОЁh:9JG#027.4<23:31(-(..1&-31100375230!)-2ЄЁœžž’Ÿ‘‘˜АЏЌЇ„{˜ŸЊŸЉ‰Y9;943558:<9<97!,24#*,),,€і+,.238:>><87(8<8;?>?;?C‚ЕЃŸЇЅАЅz([œВЎКНРЏ™œЕЌИН•gL7BGC>FA:#&.A?:723;9>>;924-%&-.70>:53ŸЊŸŸœАН‚V™Н—ЉЋЋВЯЈ—А˜—•К„vh\\hC:LIGM49AGAB?<>.),3<9*-155‡ЉЅЃžЃМʘʌЄЂЇž˜—Ё––‘vUqŠŽŽŒt1STQG5AA€?EA@@:;CEF@728-Њ˜ЃЋЉЈЁЂŸЄЈЈЌ—˜œ–’”›ЅБ’‘ž˜ЅЭЦИБžŽup|LkrrU;9@:@<411Ђ›ЕЊЪЌ—™ДгВ‰˜ЂЃЃЂžЁЂœЁ—‹Žq–ОВВЉТРТМАŽ\U{PIpN;>EGCA>@<;;@?#MNASd]]`rnaYWWaeigckodVbdrmne[j…•’˜’•ˆ‰‡‚xu}…}mkmnhk~) !+1V|}^i`^ab]Vc}vgSYYi]VUhn\]YˆЪнЋЋЁЂЋŸ’Œ‡uqj{{uxmkdqotir331#*+[^YWaptcYV[jcnmpZMS[`]aiv„…”——–‰’‘™Œ}mtƒ}xqgkqvkh1)1$1(8G33e{xkdcemhdebgn|Žeextu‹‘…ƒŽ˜Œƒ‡…•ДŸŽjwuwv~‰Œvu{uin2,!("$:11doP9NZUaj~}B1SWxx…ƒnx‡…}wƒ…‡…Ž’ЃЃ—kppzx‡‹ˆ~tqaj50#(,$9;NYr–‹gTdg`(Z`w`pm[|Б˜˜‘‘€"Ž{ˆ~ž–•nnvƒŒŠxv|uvi|*E5$"!(+#+8Cd\VMIZad,@C,S[nwxrek™Žgacv„he^cW^U2.$*$5*)7#"$.+833)+17:F*+--;);VTMWm”wugqw|aPY`Irb`Z$$#0)!13-..#(4% %).15;7001+:BA88,7UW?PAGA184,.;WH%+31cdex]\O<2^g%*)("#!(!.*032A>38;1FGA39)7@C4.A7:8[B951M<4*3@9[phƒjbL;B\W)2B "&&,<,CE92.33JHOA<72;<5>97(-18>@-@>7*AGAtwi^[g^hock;MB)  #$<^?@99>E@FPAL;9?B9CH:(0.99<0-3*5MQMWccTSbb^cP]L3;0#.%!(!#%#5,3&?@B@NBMEGG>3;C?3%3<88;75B\IFUhkgW`mhghg>Jzw)&"#%,##75508:A@:E59@131deihjkhoˆ|M>`u\\LM@1&,(1&0+7+0.@@14$%&*&->9->?;901&+2cigg`^\giYY€‘LWQJ;AQG"]M"(94)8#+"15>48)!+.19.8->!.&0)4%#,*uh^^[c[kŒZ^‚zpaJŽ–Q.0::.#<321;74.*-)-5*!()00;>7973>4(&!%>3cgdk]^J][dt}vvHC\q|iqW5+((3)-;;Ж893;5&05;2;.909897:?>EhjkwxkC0`~‡ˆˆ…{deŠkw‰…mH43A374:,".?@.,1@@?LE:9852+2;,->:?A@;7-53.+87:15Sqzo^]o‚|iŒ^j|hbaVd\VIUC@aYmoa1OMP140>;+8JCHEFB5>?@>438E?,457cc[\Tacii€ъr„‰W\`\ZWVMS]v?Ubat}˜vZ,:-+A(49Ve$ELI;GC>CAEBILJB15.!eiidtjqihg]tt^V^`baZ\ovuG\hodj–‹~n{tdr>bntY5BG:GEBHAHF;?GA<7,^kˆ{‘}^hY„—|Ldgim`beajieYSN5]‹~|qžŒŒ„k>CmHLoP>>GCA>E<;?FC@EBA-\eVPN:YcWЃЂžokjokd[[gm`Z`bhav|‡Š„‚}’Ѓbc”œŠŽg-;itc`VO<<[kŠ’ƒ‚jhjjtjndmrbF]c~~‰‘‡‹„‡‘‚ho…™ЄŽe„|^c[Z[JUHWVP5QŒrh>%,# &Q^UWLd}uv~މ{vogjw‚rkde\gopm`WOFVMSP[VLIL^™•{.$%( У @GeY #  Sh‘\P`]WZkp{n‡•qGMCmnmrqkmiqt~…~t`ed^TTёOEN\ У*(#WLOjNS^SFa|}t{ŽДxTagimqvvtzukgvmwauePMS^aaCHd. Ч(1("dWc`p’‡x~™ЅŠgwzwg\nnw‚vxiovnFIOFG^ngY8  Ч "]\^d`„wz‡Ќz~mbt}}[mk\uurvzxpŠSNbZ>$TE5  а hdNLwŽ‹ƒŽzN]`TZZMWdcz|~pkjq~—tSUeP( ўЯ in^VaNd{x{pd][3NknjcˆЗjnxz`H9  ќв*]jk]`Vm|‡ŠƒpˆxUPCph@3JG&$7:" !  §л g{mkqodtxqj[UH%9)&S8%?H1VH3 ы  оPN&AFG!043 18E@-F)""!7є    Ю  %<1!> %*"%"   ѕ ""л! *1:3!*# !ўўўг! )+#$+(+,.-3)   § ўЧ $%83 "*$,,*)(%&(3**  )+г" %&& # ј$EUўа #  #"#!,1(!8J ў!ќв#2$   " #!4& Э "     )$ "  ўќ Э %)  !  &4ўі $S й""(JY,.$(->2Ю  !  (%1.%-"IBE?380 !$9(б ,AE %  ,%!&!7:qq?B !0 ў в.bm !  #"$*AZUB1-#)&.! Э;Pm„ "" $!(!$2.ALJ:#%!"#$?F:€Ж *0*i}‹4" + #(&-ABB #+!9F77L\NW‚pYwЁЂB1 $$"B5Tu}u!GE# %  #P?459!,k…[S„Њ‚vr…Œbqa‹•e@:>#,4%(2[jj !49)+ 48AIB(08.HI}’’‡–™‡z}„ˆxrqЂTHc$,5%2<; 3T”ŠpE%-PL;! Edo]m…‡iim}mh‘ЃЊ™‡iTojnmih‘Ж{C % ,0.,&0V‹•ebZJVNUOztnn^z{•’Ј—omup„jЛеЋЄР‚„twpqz‘Ѕr"  ,%Uo^d`‡ƒownPe‡cuh{”’…ˆ{…~‘–ˆzzŠŸŠ~Š‹qhu{‚{v}‰Ќ@&  %]pd^Z’Д‡mOjwz{qkpАˆ‚…zZip\mЊЖor|won|}ƒ‚rh1%5! BgpxrvŒŒZtjwv]Zdvi~~x~„‚wbSMceoz„…‘„qq~‰—w?,()&+) &(QrcTqr}{rputg\P^hz‚t}zx{xgidk…|z‰ЄЄ‰‚z‰‘‘„”ŒJ&-,-##& -,2.$9Zgdv|{|pjaap`h[\djuz‡|Žwknuotuw]nwq[m……Ш‰ЌЌP2@1 #70 ?PZhju~|niv}{qunjrj|‹˜v^V^ghiuquu€Ÿxvƒ~}”z"O83A*!1 ":ggOzvoopowt{}upzkg‰™‘SL^}ƒTb~|qw~}–‹‰ŠœЛ›N8VWM # +-3ha‡…wrknv‚‚oeom|zm}‡™Ђ–uxx’œEZ‰xr……Œˆ‡—’@GA3!!"" ,[Œrq’‡~ŠImhnmrpv‚|{„’ƒ}ŠmqrmoCc˜|‚Ž‚„•’—ˆ\~‰UxQA8L  -(OC^q`w‘Ђgdejguv{{vdmn}{}Їj`zE&aŒq–Œz‰‘˜ŒЂЇ–AZ];3*1*!&(7(:>WaU„„Љrg\jZhruzuu}xv}„Œ„kcuGe’‰Ž„x|ˆ›–‰‹–™zV`A,@(5ƒrS„Ž‘Н•MOckhju~omo{rƒƒŠ™jiQoJ(Ё—‰ˆzŒЃœ•‹–’„B03(&,-#% +VdVm‰Œ™”pTbengrqvzt…‘‡”–z‰SPGM˜”…‡|’”„ŒŠŠ4;;-#%:<4,!%+3AQge{ˆЄ’‹ƒ]beov‚oup`vv‘‹Œ‰Œ‹”‚aYS‚ˆ}~„ŒЃЁˆ‚Їm%278*(-21+0!57F7Atwq‚‹—[Wohitzxrwdr…‘˜ŠuhtuigGjŒŒhhЎŽŒМЋŽ9 157&.4!#&(A7EYSdr~ŠŸ|Hkxƒx~viUW~i‰~zrj{nIT‹‹‡xOL„Ј”xh‚•I.2:<@@+09$#143gzrge˜’wNk}xcmkn…zoƒ„‰}wktxr]gЁ‡x|vŠœ|–I*0(+4509&1.%$1<23cdE8I‹Ž}ƒ‚n\ocjƒŠ…{v–Ёx{}|‚tŒ‹‚np|’•Œ‘ВЊБ.?G08>5- %0-)0Mj’—ˆv‡p„–ŠOqbW`‹˜œ›ˆU•u‹}hjk‚AiƒrpWˆЁ–ЇАЪЗˆ-24(0%"2),.)*,9Iiˆ‡‹}{{ސ7|hLn™–‰ˆ~}kwŠ|xpjTSŽЁ‡p}ЊВЛЕВЈЋЂ2+S1,@>)9:8)$:€аЧССИДЗЛМЂЎЕКбМƒЁУИЛМБЈЅŸŸЄЇЃŸЂЋЎЏЊЈŸЃРЋu(-4:;>@>U4&,$$-4AFb~›ЎЖЋМЛОРСОТЛДАБКбСЊЋЇБДАЋЉŸ›ЄЃЉЋЊЉЇЁЃЂЉЅŸŽg(29821(*;;%##$A\{œЋЗЕВЌŸНСРТРЗЌЈЎЖЖЗАЎВДАЌЈЊЇЂž››œЃЃžŸžžЁ››Ј„49%2015-.()$%477+!+>SW^YЈЌУБЖЗКИЩТФССЗЏДЖСТНДЉЇЏЊЏЎЌЌЋЎЌЊЊ€ ЂЄЁŸЃЉЦУ—<"H@<5709+&0.3%&:~Њœ‰‡ЗЉННООЦЩТЗБЎДЛССМВЋЉЊЎЎЌЎЏЉЂЄЈЈЊЈЃœ˜}–дМ›L.(<@;A771.-2.3G81J”Ћœ˜žЗЕДКРУНЕЏЌАЖЖЗДАЇЉЎАБЎЋЇЁЂžœœ˜œ˜–‡›лЮЂ7;459<>535)33.:01nЌНБ›‚ŸЊЊЎЖЛФФЦЈЉЏЖЕАБАЎЏЌДЕБЈЄŸ––›™‹ЈЛБАQ20+-0>?;4.+*0,0%-СЩЈЁЃЄЇЌЏЖНаЦгДВЊЌЎЕЛЗЕАЊЇЉЊЋЌЇЅ•’””žЁЂЂЄЈК›},"@424,2720,**31#$oРЖЇЇеЄЇЌЉЋдЛАЖВЋЌВИИМЖБЋЌЄЊАЋЂŸŸЄЁ›žžЅЄ›œаД877€r52>>0,+*51-,&nРВœ˜ЎБЎЅЇЅКВЕЭУЌБФЗЛЗЕБЌЌЊБАЕ™ŸЇЊЂŸЂЃЅЁЃНа›9)8323--259521.;59>N;O|ЄЎЂЈЊ›ŸЄЁЇАИМТЉЏ›‰ЃКУДЖОМОИЗАЎЗаУБ˜——•”‘’”‘”>#1;88977521348$-B…ЃКЯ™ž™ЃЌЗЖЎСЯБ’—ŒЅЋЕККЖДЖБВЕКМЗ—žž˜б™•‰‡ŽB#,+23.0+")##524QHSƒ‚{ŸŠЃœŠЇТЗИЛас˘ЇЉБДЕЕ€ ЗКИЖДАИЏЁДž˜–—Їž‰™M8*("&+&)"##%.8@?LMJNŸЃЃЄВгМЗНЧрФЛИКОИЏЋЉЎЕИЖЎВДЏЌЕ’ЂЖЅh58*&#-2."#(,88+8BЅЂЄЁŸОМСФйЗМДЂИНА›ЇЊВДМИЎЊВБЏН’‹Ѕž„wq‘rB7B*(%+%$,<558-ЅЂžЎКМКЛН‘ЁЅŽŸ™œЅЎЌВДДЏАБНаЗ‹‹ŸŠVYIEHB*5 &4-9-Ёœ™™’ЖœДЖАЄЃŸ™›ЂВЌŸЛтЏЃŸЁ}oU?E8.;77:G&   G7,)›ЅЃЁœЂЋДЖСУДЦС”Š‚Ÿ™oVoc>B[[E>>98LL7?<:.C0 !  #.C.)%ЋЛВЅЎЅœЉЄЄž‚tpVUFMqM;-3%"$#  *)-.2|‚]MmxbJPPN:I1QYJ9\\AY>@AA7I91-4+*!48532)  %(*-*+-IABLC*F`bBHTAC@:A589;?:@F>5++€N2+(-.537-"  !&!(*49FJVWLC>FMLJ?<29<:?317?HH?BB8+(+1)1-497.+$   ,7:AIFMIA@(#7IF>@CFB8338?HCA@NMGA-8:58BFA>@BE<4,3H<:5BF?7@824-,%(.-(& B; $+1*58.9)$78.7?@;.21-44.57<44981:7? 1H0,(+()!AY\)   "83@5.3.1441:95*-15>21;303:<49??F>YiF48*$,* €Ъ * #+<9E0,100*0.41.(.3<47.?<91982188;?83T:9735,$   *)-3)&#*)-.0.3)*17.3:B??9A7532578370+.0>?5%  !*A9+%+&,27927,37205:83++773.21-1,-3.803>;75?$   !%%ъ.:AYA"184:<89C@90-52;99€Л>A?:5^dMB244<97:A?L;""  "@$-(9*4.792;4A7240.9;@HFIHA<&:Z\Q,PGA:7:CQLH-  %&?VW42>3-.+4<8?3484579>:A>?>0?UŠ„MOHA<>:HI3F&  #**?Oƒˆ10;<055;5@@;;177њ075:CAGHOVQN.A>3AMVi]j‹„Q:$-:@*0GJ 47::I^ЕТдРNrZ98CB@7507:514Q>BCE?C9gWUSQpiƒБТАžЕзе[3F>-A<;;@c7BB48,#G˜ЛЭЖJcc<8HFBC9<883FAGgV7JPYCNœЕ™НлУЖКеаЕЕЉУЯxHIP(4::7BBGMB;?1:vЌЖЖLLPNM(9;ACC@>9AF‰ЩзДЅЁ•‹™–ИТАКАЫСкуссмЕНЛСЗСЏтћппыЦЦИИССМОЧйЪ…-,>5+20878GNŒТЕЌВбЪЖУ˜ЖТЗНЈМмлаагЫЫШЧЦРНЦЮрЪЦажЖКЛЦЦУТСжЯU590:37(2:7<:5<@8@‡МЗЊЇкњзДЄВЗРСТКОУЪЭЪЧШТЏЎЖЉВгчяЧФЧЧФСУТШШУИЏЗH7H?@<51277;88@A9ApЈННОЦЧЭЊЗРОМИВЗФКЧЪЪШЩЪЧЕЏЂЄЊДСЦЦбйебЧУТЧЫЯзЛV9;ABA?:@9:;:??їG:oЕЋ•ОУТТ€РНЛЖЎЎЏЕСШЩЫЪЭЫЮУКБВЕЗМТЧЮаЯЫЦЦЧЫЫЩмЧj7AGGCF@I>@L9>;BF&UŸВЊССЫЧСИЖЛЗКЖЛЏКНОФЮЯЭбФОЗДЕЕНМЊЖШЖЇЕШЭЪЦЭђсnHQH@EC??8,5BB@>;EB*P„ЫФУпбдзЁИРРОСТЩШЧУФЭшдакШНОТгŠIЎтдгазеелзгŸЧЮkŒgJ\a07;@<>>BCINqhœТЌШкйђЎМЛЖЗМФШШФУЛСФЦЫбЪТРЮж’qБйбгжЮЮенпрыюй^t{N@E;;CFG<@CONC]kЁЉЁнЩжюЪКСЗИЕНШФТТЦЪШТЭгаФАМбŠCЉпгбждЯдйнжбмн–iwQAM@??<:7>;9;P4ZУǘЪнеўпЄЁЖБЖСФУРРШЩЭЫдзьРЖЊН‹(hшнбЯЭдзлпйбйсЎUFG3:>;<:?;@:>AF3FВ—ЕккюнЩŸЏЖЛРСТФТУЪгзйдбФбЯБЂ„•цраЫЭЭЯклбЫжрРHJSA:9;ELPIFLGGMZHFG?9?GLM><@CBH\Yb•žСУЭжье™ТЫЫШШлФКЛЊТМбдгЩТФЦЩМ•›йаЮС—ЮьаЩЏЪжg1@>?FJJпFCEIGGHGCJЁШСЕНутЫЁЦЫбЦЦРСУгЩФЯдбб€шФЧЪЦФЏВчЯЯЭЦЦЛбщмЪсЫu?IHEILMFE>EFAACWGJЄ‹„ЮгекзббТТРУУйнзЮЯжнмзЮЩУТУЧнаЪСТШнсййщя§Њ@LLHCAB:EFFEMC?2)4rРтыкШЧЯаьбŸББЅЛррклеЎеЯагЪЦТЦа”ЛеТКЌЮмщухшўњЦ;AHA@ACB>AHMNJF@,.^œЕЪЮЪЪЩбьп|ЩНЃЕьюйегЦОРШЪЭЩЩЌЖЃйёаЫОбяњыэшяћпLGhOIGJLLGLTWSHA7Ce€ОЂЄ–ˆŒ–”kw~‘ЇPj˜‘˜Š…}jpkqppgutzx}nwzxU+-EIMIGP4.*!ABJgu‡–—•—–›v‡’Ќ–{}|ƒ}~„wttjozwrvnpknrpkj]G.8<13)-2,#5Y`Ie}—”–wœœЁ–›ˆzuƒŽŽ}w„ˆˆ‚wtvtqd]aeiornrrmgiuh28%0,54)#&4&9CI8Ph{Œvm›˜—‹‡xt’‘‰~x|‰{|wpihikh`JZgni\gV—,%.<7;3$0AMVQPewx™‹Œ‰…ŽЈЁ˜ŒŒƒ}Šœ”‡„|tz}qu}|txtv|xrhivƒ––~8#HE?585($$+;# %nvj[Z‹t‘––‘™›ƒr‡’Š…pwx|uzwruoqpouohjEbœ‚xN.(CEAC@7-$)0,0G-(9jwdcen’ˆˆ‹Ѓ›’ƒ„or‚Š~wpruz|wuebYicbemmbYVgЈЁŠ;89BA?9>GGB2++e•‘vqpix‰‚‹ЉЉЋ‹x{rw{}Œ|wov~ƒwncZT]antqr{ŒkU,%<5F9I9<"",.a–‡xwvmv|~[wЋˆ~Œ|{ww„’ŽŒ‚xtwx~zkbkrnpdrq^ZdgЃ’-99A?B<@<"-18)T–ˆwmh‚…}qniƒ|•‘|w–ŠŽ‹‡{{z~‹^gmrrzomuqxpŒЇ‚.0;;:14,759-*+1*7.neneYzrttnƒ…~…`Hk|Œœ„zgqvn}„‹ogWinoi`hnxphqpB$0ada‚jkpj^u’„ŽЅС”ar~|„„…‡Œˆ…qˆ‚}q‹qaZakrrWP|N@1(*"$)+$#(4?8CJ?@qummxЃ™‹ЇЛŠƒ–…wz{~Œ‘‰|vˆ‡}‹cYZ]Zt~t^S840&&,.4,) $&$1:?primpŽ„‰˜ТŽ”„wŒ‹ntxo‚Š|ˆ‡‡˜h`wrMAGhaTBCE7)22."%)@(545zzke‡—›’˜apqenjmkr{~‹”ƒ~‡‹Ј‡abwe?.-;A:2*$(  &0927q{pim^v‡Œ}xtxjed{‘‚h•Я˜‚‘uWG0A>%3#?2G$#!-#1?>+2ow}phk|›ЃЇ…ŽnZ^…}T<[c7*%uƒ}v|v‡Š‚ƒg`dJE>G`C7ZS9Jr[H;44"*,8;:,)()*!2-." !$44аbiF;Sh]:PP?,C8ZU<;VZ?\@CIMBM?)*(",-8@77-2(!€ %!!#&)$58)(>2B;:(?O`8HZ<>>1@0%29ALABC:-4-&%,7,95+.0&&#(+1>;)3!"" $%2:AE@POFB?9*91!:*7>,$04.40%"  1:21BHGOL7B;.0@LFLHGFIC7,,E@:OGGHIJ(*2+)-(%)$%EM.  774(*@!$89-$3C1>3<2A47;1.;BG@;C@F -L:$+!&!" %8iv3"%)A?45+41A33&;4<+50:79-&(+9A?AMHSG!Wj?.)-€У7&%>>N,:,.#79-&5+3%4)<9<@8;13?2;:CA17;\A3.(4+(,  !  $!"&%8G,#%4043-!*%-1;<3)997B<8<(@891&:5?94:92"# )! "$!2?>9@&3*377.7@0,5)! %&!((0Hp<2#49A@<3:1;)80$,89C<9975\tV@(?352(9CIWF# %8#*):()!*71<3+9?524*48GFA8<Od+.<7--<23G090<>&-375:>:IBVihUIJH5@GBB822<  ђ! %Lc{›-5--й940-9@;79.(;1:@H@NM[aV5:FG@J93HS#YO5€ї2&+)>1HAHSM <80F:J„„Ѓ‹[{Y579BC7"#3.50-V>8?C@B5nZQGI\qbj’’m‹ЎВc2C7,8;5>IbA8?GNPQ.8>FaЄЁ‚YG7H9Ac^SB,7Z|}zЋ”rz„‰||ЃЛУЖ›v`…‡ƒ|ƒЏЦ™”[4;J?05C?JOI.,:3<,8oƒ|qrЎбŸ|h}ŒŽ‘Œƒ›Ђ˜—”’Šiz‚kЄВаЁ‡„–Ž‹‰Ž™‡ŸBAM@4@.08;749;4?(4\u‡‡…”ЂŸr‡…Œtt~‰”ŽŽ••…zgenv|•’Ÿ™ŸЇŸ•‡Š”›ЇЊ–PB;LACFEC<;?>4.EA5c‹mbˆ‰—•Žˆ‹„xnwuˆ˜‘”˜’’~€w{ˆ••ЂЎАЄ•Œ›Ѓ›ЉЂdEHNHLE?9LEF;24>5#En|v’•––‰~xv|{r•‘œ™•ЃŽz}ˆˆvƒŽm}•ž–žЩШdLeU<9-BBULA;:;C1A;CC<@:A@)Hq—ˆ„Бž™Ёkˆƒ‚‡ŒŽŸ”–—Њœ”Јƒƒ„ˆˆ^*{ЈœЅ™ŸЈЃЊŸ{”Ѓo‘iWda:0(5C;8;PIFa\pˆvŽЉЌТr„}|‚„Š”‘Ё|‹‘Ђ™Š|™•WCwЂАЌ™‹žЏЏЄЕСЏVu‚[IL;4CC?MBABH?QZuqgЉЅТ’}~…|uŠ”‹Ž•‹Ž™ž—‡r„—\{ЅЇЁ™””ЏЅЄЌЛ‘nvaMS?:27?9798.I0O˜‹d›ЎАчВob{}|’…„‰Ž”–™ЅЛƒkV 3ИЋœЄЁ›ЄЗДЊЏИЂVHNFLH`)AN…’ˆ–ЅЎrq…‡„‡‘‹ƒŒЂЈЄ—•…Šˆ`ЈЌЌ‘{uЇЩЄЃеРЇL*MLJMLHAOџЬxumu{‡ˆ›”‹„—’”cHH3M~pkeqoZM?&љ  Ф ……nVgic^vvˆƒ‚ƒ|bkndj|iWSTJT[Z[dnˆd*9# С  ™БЊ‰kc`WSmt„Ž‹xe|xhghY9;&Qz}qUS?0*)*&!! €ŸЋ˜a]—…wŒ™Š‘˜‡vk]`UWVTQdu–~[# $!$+ #  -!($%7j|LGcQv‚ƒ~ƒ~ŠŒ‰…vm}tZLP\^\›t$$     hitqmrwŠ‰‘‘‹{ƒ„~ok|hW,!QLJ "$ !"    cjtipr}„‰—˜˜”Ž‘Š~Zœƒ0,G    %" #   a‡udOo…‹‚‘—Ž„‚‰‡mancM        9^vqeTrЄ›‰‘ŒxmxWH 0  &!  !.&! oo„wxUZzpe„•|N+7Є   ) (1!-an\™ЃmSovb\SI5     #    €Є "cdT:G||aEBL.$<<,$  Q>  ,$+$ !BG?]{n>MoЌНœC+8 "&#)!5 +# );Ž‹gtY>5 8 T8     €ф%"$$]ЖАh[ioB?     "$5)GW?`na`h8#   #  ""kS^^ztnn]ga    $4)  *-8&&U`CS\^bgrwjjУ""# -:3:8A3AaVTY^Za|}xcё $#3(!#ќн#  HQECpd[aLGMaNNYTSgut€ 24!(2&#$#$&&-*)$ !*& >b„›ˆcaZOPOWPoc\P^higo  :.% 4+"   ($P\qŒЎЃnZdWO[VOT[`Tm‚|{„ "%$ (".# ,  ,* 1J>Ogg~„–wn^rWA?G:LQUozg  $.!&# 5*)45  ([ro›~|\d~”‘’vj……^11FeWUdp{‚+>&)%Fb.%041(2.(5& Ihƒ–ЛЁgmr‚’•‡xv~Šn0P] GI;W\]dz1.:C-4!8BZ"&$!+2#2A%Fzn|o`•Џpe`w…ЃŽˆ}ktWPQJGbahcW^k +#(8.*>@>>1,Q[3("):#3Z…kzbUMW]PQTUn–Ž|e|gJi›—’„^ud1-JbMFY{Š&+04""+3kF)>H5hh8>v‹rzqd]]QZYa[[„ШЉ—~rgp——•n`ur(?h[jYCP\$ 7$*2JH>Bo–‚TtwW]dquYTg`]aZvgxЃƒ‡o~j•–mmipTVZ LT33.V2$.*G54MgŽДuu˜ЁŒv\PŒzrZS\ZgkgSY^q„Œƒ„}v‹”ƒuƒjUY;%‚aIei<&5 -JMZc‰–~u|ƒt{F?Œuqq[H\nuuiMu™ƒŽ‘ЁhIzЊ—ˆ‡x‡pmxT$q^ShY G9,JS4™ЋЗ—Ÿ‡[x{~…‡‰z\ohgu~bHYiiќn~Ї‡€0‘}da{g‹‘’ˆuzonc~kcecUh5CT!JmGWžНРЄŠ”Ž˜Œ}vxob`[v~nV@iqh^atxx‹—rj™˜Œ…›}^^[jhN[dZ]ZOGpjvoЁЄN`ok›Њ™”‡ƒ••ˆƒ‰‚„ugm•‘‰h@w{om^›ŽЏ{~qŠЁ‘›ЂЗŽqbbpgz„I)L]?$ЗМ›Œ™bJPw‰ƒ”•„‹—Є›Ÿ–|˜aSF[’[;\kn^hVQb@n[w‘„ސ—‹‚Œcjpu…bS39UTU|ИŸŸЂ…|Nbqƒ}ˆ‰•АЋ˜oppPaUS„Š{j[eLi|wo}vnw~rxƒ”œ–—wo|z{pkFa^xhIˆКЁЄž˜ž„YduŒƒ‹‰‘ž”Š}v`qcrrh‡ƒ•{]`OSIgjggu„}œŠ‡‹‹ƒ}ivdUOV-Hek){ВЃŒ”}tr‚mT‚А˜‹ƒƒ|–ЄˆjAew~„n%Ada[``^Cm›Є•ŒŠ„‰–ž”qŽ„‚oY‡JW\`[en}ŠКžЇxhdV‚ЌЄŒ•Ћ‘Œ›Ё•\^gmƒЌŠonYWYebdAeЎЋ‰”–Š‹Œ–ЕЉ}nunZuh\L[ZAFpam‰œБŒgbbHbku•ОЕŽŽƒghNorcoqegjhjmm|rYr”Љ–ЂЋ˜ŽБИВ|jwhh]9O[P) bauid…mbxu^[VY{ŸЇВЅibqnu~zqo`ckuThjpq}]cw—ЩМЂЁЃ›Ѕ~…”xrU:B^\S-!"+01-&"!МЗИЕЏАВЖЛЖДЎЕИИЖКЏ•„‚žЃЁ›ƒЖŸ{…ЋЎЏЕШЛНЈˆxQ4,:E@9@1$#)+%(%""$БВЗЏЋЊЏЎАЕВЎВДИКУЋ—Œ‘ВбИ’–‘’Œ‘‘ŒœТН›iTdWB3551H?I27;Z, 7ЉА…ЃБКОНОККИИЛРНЊЇИЈ”Œ‹Ÿ’›С’;%)I2.232-439,-92110322+-0;988?8-"ŸЃŸŸЇАЖЛМТФТММЛРИВЌЗА™ee‹‘{@:$GE5.&"+74732.,2713"(241$04<73213(ЂЃЄЇЃЌИЛМФШЩФТТЩТ˜ێY9^]9%%0$$,-2+$(4758-%*+&2.22€№78,+-4:A:5373ЂФБЊ‰ДОСШЪЦТРРМЅ˜•k98>"3%"244+%032*1-0*0&$1*-.*182(&))399:>0}ЇЏЈœ—ВЛеРУЫЪДŸ~qF45;L" *7+*(,)40+#11073-&*73-),28**"$E;B>9.!ЎЏИКЎЉŽЎЎЃЋБЂqN-;42$:L(%,(#%++"(1-78;3-1<>5715>0($%1;;43<@ЁŽШзЗžŠœЅ‘ƒu^L543).,3>+!%)+:W%$((*%(55722520,,471*%*#(2)GŽŒ•p…МЪБ‘ngeH59PSG?;247,3)%-015.>rc-)04317?::-*0.&.1<72*!)?Q\c•ЛЇ~}ЁежЃWHNA@- "4:?;<1,.3;4;.+4#;5+&.,118-1.>:L^ЏНŸЄ{m>*@N<&&EaU<1:44.(&+0-030,!-7-,.83(,)14:<9:.(1.1.39(.:844€†+0-+-2,497733,*!,12-359BM428FYaa‹‘˜ЂЈЋЇЉЉ02,3*.&+49973)-,(,228+)*)00187790--.011!",BH8IevvxŠЌЌž™–›ЈАЕБЕ-,*&+.05395850*-0124>9-04;;B@5ˆ48>37@Z`OZЄЂЇŽ„Šd‘™Ÿœ™œ’ЌЎЏ(+-)..3ST<4:9214;?<9;<53889;??<:821?>?2$@4Z‡ЂСУЁЅŸ–•–ЏЂ˜œЈЂЌД03778,",H@4-17*39<74:>AA57:44€†38:>77><4G{‹ЉгпгЩЉžЄžŸЂœ™ž›˜ЈЩМДЖ.5401+.7BA422741879??E@B79350359CH49Lnc~ЇЂНСЩУЗЏžОЗ›‰„…˜ž’kАЦЕЕ22.,..5,9>;<:>>25;?GGA?F43+42089J‘žЂбНМЁЈОЫЩФЖЎЖШУЉzY{БŸ—œВРМИ9;39S<133;?0`pB>0:@@BABE8AMN>,5L;ЎТСеѓзЅАКРЦЩОЗЛОЩЎ{•Z˜—›˜ЈЅЗЛ>8>FMh*4:>4ETo)+29:?GGQpЊЂ…œЂЈОЌЉАŽЕЫЖ”ЈЋЃœДзЫЦЛЋЌЃЁ{d„ЏЫЕЏЉЊЄ><@AL@AABAI9`wEBFB:0I>2’ФБВЉŒ”œœЂ’АжЭРЊФЏ„ЉйШУШЦЏРЉx~”}Њ›˜ЎФЯFACCA9:;77,9…b?-9Ua]…Ёj{АСЗКДœ˜žŸЄЄЅЁРїцеЫОЋКеЫкКЉЕВЌЊИo–Љ94.9:;799J:7FY`UbЂЧЗ’ВМžЁЌВКНЅЅЄЌЎЈЋЗЊДеЪЛРТКЕФЪЧЇЌЋК›Ÿkc‹œ’‡ƒ—;::9;7<LbMHm—УчРКпчШМЃ–ШЯМЗВЉЄАЕЖЌЋЌЃВОРСЩОЕШмЪУИАТШАœЈ{NƒЩЁŒЇЖEMEABN5+Mdno’ММЩИКССМО„ЮКЖКЇЇЅЉБКК™РдФаЭЫйЋ„ИрббЩРОШКИН–mvРБЏЉЈ!S`@]h:QМйуайНŸЖРЦСМЯРЁЊЏАБЧЉЁЈЏБЗЛУЦТЧЫЭЦЂ›МžРШЩТЛНЖМРЈЦДАЎЈЊЃCZp7mŠqŠМеьяхЯФШЭЭЧСТКЗЎЅБДРЕ{БКЎЎЏДНКЮаажНБммЪЭжФЊЕВВЈЉЉЃЁЃЈЄ””‹Ћ˜лт™ИМгжгЮЫадгЭЫЧТЭЏЊДЮндЎ…РЯИЖЋДкйбшННЖЪЭкеешЭКДЕКОРЪ—qŸЄЄ{уэлЯгЪЃŠ”МТКЪЦФЧЮбжгаНнЈ—ƒ’кхЇ‰ЊЌЉДЎЋ–Ј~Џ›ВФбЪШЮЯЭЧЯЊЗМУЫДЁz˜—ЁМцнййЫлШ‰ЎКОУОЦЯйгааЗЕСžЇЃ›ЩжУЏЃЅЌКнКИМИКЖБЗОСЩЭЯбеОКВЛИТСž›œОЎœЧѕрждймЭЁАНЪДЦЫЩЫЮЩСЖЈВЏДБЎТЪйКЃЄЄŸЃВДВЛМЦУеФФЩЮЯЭШРННЌЎ›Ј›ЅЇЎЊ„ОынзгЯРЖУД™ТшЮЫФШШЦЯатдД‘БКТЭАhЅЉЌЋЅЃБкхаЭбЯЫЭЯЯЧВЮШТЗЉЦ—ЅЈЅЈБВНФянцаОЏБ›ЩрЯбФдьдЪЯчжЄЅЏАТьЪИЋЌЈЌЌЊЈ‡ЅѕђкбееббеьщОВРСЉСДЎŸЇЊ’КЄБУрщйЎЏЈ’ЎЖАЭШюмбЪЛЄЎ™ЕЖМЛИЗВЖВЎДКЗИžАгшклпмзмкнтТЎМНДЊ‹™ЁœenЊЃИЊЊЪВЅНВЏЉžЗВйпщчЎЅКНОМОСЛДЏИЕИАВЕМШЎЏЫФнўурйелмОЦаФСЗЈŒ•ЉЈŸЌЏЋЯТУТФЦаЛВВдЫТэзйлЭЪТМЛМНОЫҘŒФББЖЕВЏ™„РЦыђчйаИЦУЦЭЯѓјгеЇЂЄЃ’ДЊЮШЮШЫЪЧМСИЕМБУЪЮЭгабЧЦБльФЦеЈSБЅВММѕДЊ—ЇУЮеєЮЄУУ€ЬШЫЭФАЦР•‘—–”ЪжзШЪШЧРОЛЗЎ›ЕРЧШЮЧШФСМБЭжпОЭФžЫЌ…ВОЗБЏЌБФёўўѕюуЧФУСЪЮЭИбМžЈВЅ™ЦнзбЯЯЫЧЦЯОЖЕОпСНОСЧЪТРЛАОтЩžЋУхярАНВЎЃЂЉЇЎЯшїѓщНЏМЛНМРТЌЎАЏКжаЅМцњезлзкбЉЗЕЗЖОЕАБАФЫЭЦРОЦЯдЩРТЦЭЩЕЌЕДЖЋЉœ›ЏФьўѕзШМЩРСООЗВАВККЯРЗадЪЭЫЮйбŸ’ЎДЗККЎКаЫЮаЮкЖЛлкеЯЦСУЩЧЗИЛДЎЋВКЩИжњєђљцЪЦЗЗРРЛЖДКЗЅКТгЮдЯЭЫЗФШЖŸЏДЗЛСащЭЭЧЪЦЅ–ЋОхсЎФЦШЦЩУдЋЋАИЫЫИкюушѕюШЖЇСЦЧФЛЛОУСЌйЧжйжФчўѕнУЋБКСТЪЪЮЪЦЦШШТЛЦРДЖ’ЋРОСФжОЅБВДЛЩррьпцчёмЪОСЧШТКММЛБЂЭздгЮШщњўуЧИСЫЭеЮЪаЪШЫбгЌСЩШЂ•ЖЕЗЛМСУ˜ЇЌЋУмбзкбцуюћђДЏТЧСЗИЛНИЋмрЩФБЋАФпсЭЗТСЭалдеЮЦЪШЯЭЪЮтЩУТИЋЏЖРОС›’…ŽЪрЭЭзуьщыјћКЂОУЧУРРСНВКРУФЧЩабддЧЩЎ™’НЪЭЫЮФОСЫЯЭЮЫЭЩйР•БНОРЮляШАрсШИаїўэыщћдВЖагЭЭШТНБ’УРЊЭЦЭдмхЫ™›ЄЎУЦНЎЪЮЦФОФФШЯЩхўнЃЕСРОТЦШФЩЯЫЦИКпѕыыёўёЈЄЦарНмОДЋБЩгЧюњмНЛЦЮВЌ•ЌЪНМКзэїйБШЦШЭЭЖМ’ŽЎЖЕЗЄКФЩЮЭЦРНЩчтЮжшўѕАЄЩеьМ›ЖЏЫОЩащѓьїжздсДЊМЪЪЧСУМЮѓѕФЫЪЩУУЗЪИАЏЖКЖМкюйгЧСНИБдЭййрєцкЩРепМЄИССБУклыщштцђпШЦИСЯМССУШаабгЮЦСКНШЧМНОУШФЩабеЫФСФабЯдехїєяЭЛУШаТЗЗММдѕнгзФСЩ§ѓсЗ‡АМНЧЫЭЮЯддЮЭШЄКОЧЫТКИКОЈЯзббЮЧЧгжггаЛдєўўєжЮЪШШЗДЖЭаШШКЩФžШяўсД…ДСЧЭЮЪЧазйгФгИВДЗТЧФЦЮЖrЏмжЮЧФЧЩггЯдЯдчўўЫ˜ЖЦЩЧЛДИзЩЛЦЪбЧЕщўљсЧЌМЛСЧЯЩЭЫакжЫЮУИАКНСЩЭэпЅаўммеЗЋбцгЯЪДЋНяўзЖАžСФТТОЛСЖŸдЮУ‰НњѓйБКНУЭаЪЧЩЧбдЪУкРЦНУмажЯЮРЧФУЫМŽкхггЮЩАВэў§леСООЧФУМТДЇеѕсЗЕмёхЦЏНЛСЧгдбЩЦЭжЫЩШШФННФЯЯЮЧТФФШЫЛЁЄОАЦЫаЪРФлўћсжМЩФУСНЋЖЛСЪюшЯзюхыгЪШФЧЫЯЮЪЧЧаЫЧЧЮЯлАЈЮеЊОУСЧбьызРТУСФЦЩЯдыЂнљЭЭЯЮУУМЛ€<‚…ƒ‡‰‘—›ЃŸž—”ЂЅЃƒ]QJh™…uv~{`Mkwo~‰ƒmnœ‡d0 &5+,,-7&. •Є”Œ}|„ŠŸˆ‰‹‘‘••eFGhmjpg]iMZ…’”Ѓ•Ѓc[O*"5<:5A5!%)(&#)—ˆŠ|‚wƒƒ„‚ƒŠŒ˜–—gZ]Ђ‰WV\\^SVecjŽ‘zUVcOA,:14;:2+,1.%$-9(81:18@8%rr|xt„‡’‘•žЁ›‰‹”„z‰{oA@[]W9&%HA:+&,92@9;8.!$)%$!)3*)?5-?7zx~}xŒ”˜ЃЅЋ–œœ‡iЎŠF+NT()(!!,2**,+)>A:,400%"$"4;#"+>:99€3*.m˜}{Vtƒ˜‘ЂЅŸ™–™ž}uzr\.87.0,7*)$,32,5>4;:&3!(,(&%*%*&#*858B0+Qo„riˆ”ЛЉœЇЁˆxˆeZ(*28L -+.($41)(+)::1;.(20",.*,&1:B>8A(zx‰—‡„em„‚{’ЁŽZB.;22I!" 0*(((58:>99<+0;2#+(4$"& 3EA4;309EEA8)1"487185%%81)14,*.#%)194)-+.C?;;0-0&*&))!29\Z4)!:34*7474.$"+)0$20#+1)%2&&5>4<<-$2>HBQdT]Єzw}u:#,"B;;5.&74";833)-*##,0,B4<57)(4$$,-752-40517#&;qVgeЁz{mtq,!+)*,7(0(.4(.BJO934<).(<.0%7?.4%%*+".23&4@MI33+.LC5YuV`dnkuƒ‹zz4,&&%(3288A97:1,031A5#(+.29C5:375++10@3ET5CLSPPGNringp[o‡ˆ‡?5&$#$.9C@C@7#(2:55?0%*3<;+4@?B<7538,"8-BObST{wiwTGH8[mabdge{ƒ07()+-0SP5GGEB<,AA?B<91998<;ABB?;9?IB7;%45U|–Ё•unp[bUidvnje^xuo:*80().HJH29:)<>CE?C?G>3-01,%-,.7>,AB3@hq|žНЕЁ}hngbkkhenoa|‰—98>4$235?C<>2<72AAHMG?N<10-*+52@H)-GkTd|t‹œЄŠ|o•ƒjQPWLdjg8zŽ„{B:@*(#-4@B:F:78A;GNGJG8508-&4"55?wˆ}Е•ŒjzžЅЅ|ž—v@+MWwh[j‰”‹ŽEG?@S?#,AEA3a|L01>5MJOPH;L;Y1-+8!Zr—˜ЌйНt‚Œ–—Ÿ˜…„”•~M`h2c]Zcqp{ˆEBCBP]0BAJ;L\o4%<88B>B4C7Nh•akkmˆ}}…Z‰Žj{wkkЕŸpicnI9L{|upgr@E;A@>BGG€жT@kuO>NEH9C:&q•‚ˆq]YemggdjvЇЄ‘v‘w]zАЄžЃ”zŒqANZCr`]tŠЄIEBHGF7ABG3Eˆ`A.4TVQpvESž‹ŒŒrmhhnnvrq”рЦЖ•ˆwЋВБ’{t…ƒB[xi{i4ZbwB3*95;7>;H<>CV^OLЃ•jƒqpzއŠti{vx{oz…ЖžŸ—…Ž‚˜ЈЅ‚v}ndk33ag^PGaF>7B?>3;[IFTЅд…ЖУЊŒkdœЈ‘uhmoz…xxmm|–‘••‹ƒ”ЈЁ˜‹‘|dgN%I™j\p‚UG8C>V0(ITaeu—ЇŽŠ˜‰PPЌ…‚„mji{}…eŒЌ‘ЃЄЃЕ}T•НЊЈЅ’‘‡ZCI…ugtg*PZ>^h2HЇЖЪЈЗ—kŒ•Ž’œŸm~tv}qcex{z}›˜–‘œЃЄxg‰m–ЂЂ|‚zƒqŒ|poqmuO\k9cW\‹ЎЧбЗ›ЁŸЃЂŽ’‹‡„wtpˆŒ}gJ|‚zj„‡‘„œЁœЄzБЗЊЊŒqq{txdooieng]…~Ž…ДИaq|„ЅВžЉŸœЄЉЁ˜——~||ЅЏЁ~]Š•‰zmБЊЇЛ”•ŽВЄЌВЧ›‡w|ބޛ]8ii\AЪЫЎЅЊžp`c„—”ЃЁŽ›ЈЏЊЌЈˆЇocWcЇЈnOoz{v~nkxV|p„ŽЇ›ŸЂЎЉ’Ѕqw‚‰—ugBWmahШЕАЏœЄ‘Qw„’‘•ЁЂЊНМЊ}‡dkhh’xn{eЇŽ…zЉ‰ƒˆŽ™ЄЊЅЋ’‡‰„Œ…‡`hpŠ|a—зЗКДЎА™nz…ЁžЁЅЉЅ—’‡r}x~‚z–‘ЈŠqpgijzu|{ƒЄД”˜ЇЄЃ”’’‰…tgrdiavxNŽЩЕЇЏ™…ˆŒxe—ЮА•œ”–ЉИzW{‘‹…:TrqwuqoZ…ЈЕŸ˜œœЇЎЁЃ——‚t–Ukqjjx~Ž”ЭЎНŒwtg™КЂДЃŸСЊžЅЕЕmvw‚’ШŸ|mpvurzS{ЩНŸЈЅЂЌФМ‰|ŒˆwˆzqkprU\}t}БЦЂuxx`tˆ„ЁЕгУЃЅŽx~c……‡„‰„zp„|‰}j‡ЁТЋЄКИДЂЛЩЧ’}…}vSgmeN4;rzˆuxŸ~w‡‰uneo‘ЛИТУ…w‚|‚ˆ„tv„Švx}~‹•xv›‡ЋпЫЖЕЖСР‘˜œ”ŽmPZxoi^}x{Ј—Š…Ž–Š|xЈЁбНЌА˜Ђ–މ…~‡ž–eZ‹}|rzhM‹жсЩЊЅ‰›‘ДпкБЈiagb^WvzЋЂ˜›–›‰~|~žžЅžЃЅŸЌ•}АФ–•›{*~kˆ—ŠŒo`o”ŸЕкЃv–Ž•œžœ–x‹‚W\`aT–ЇЄ–Ÿ‘”„ƒ~Tm…Š›”—‘Ž’ˆ}›ЇБ„–‹e”}Oƒƒrq~x‹ЧћылЯСœ™Œ”Ÿ››zŸbgui[‘ЉЂ›–˜ЁœЃŽz˜Ўœ…‘Œ–›™„‰zƒБŒ]~ЕЧМqŠxokhoq{ŸЯцЯЭ’–‡—’toj|„‘iƒКеЗЉЌЏЈЋ}‚zƒ‡‰qƒ|ˆЃŸ‘‹„‰—˜”ˆŒ––€ vu‰zvrhovœЮцЯЌ™ˆ”…Ž‘„|pmxƒ’‚~›ЅЂž™ЁАЂiexƒŠŠ‚ˆŸ•ЅЅЉЏ|tЏБЌЂ‘Š…ŽŽ‚||{poxxЈŠЋмЧЫзРŸ–‡‰Šƒ{{~k„›ЁЏœ”ˆ–n{v‰ŽЄЕЋЄЂœ’m[r–ЖОwŽ’’–Ђtuuz”Ÿ‚ЈМЛУдЧŸ~‘œ•„}„‘˜…{Ї–”ЉЃ–ИдЩr„‡ƒ™‹—œЂ—Ž—‹ƒ~bx‘ž‘œ‡pv~x‡ЏАШЕТгЪЖЂ’–Ё™ˆƒ{}}d•žЊЇŸТхыКŒ‰ŒЄЊЇЏ™ЁЌЅ|Š™œidw|z…Š‹‹ujrzp‰ЉЎЉЏЂНжЫтЯ‹{”‡ˆ„…rwЄД‘œ~}…™ЋЎ’…ЇЈЁЋЖЉŽŸ˜•–˜Б‘‹‡|wpŒŠ…[eJ]—Љ’ЂЈКФЯФцтk‘™…„Œ|xƒŽˆ‘ЁЅЏЉЗЅ•—zocˆ›ЁЂ›Ž‹Š—Јœ•—›aw‚ˆ…•ЃУ‹{ЛА™ƒЄлягЮзсЌ‡ž˜Œ‡…‰„bˆqЁ›ЂЃЎМipvvŒ’Ž~œ—’ˆˆŒ‡ˆЃЎУсВk|…‹„‡ŒŒ‡––™‡~ˆМккЫмўм{mЄЖВ‡Ѓ”{w‰›—ЮнБ˜™ŸЂ„\u•‰ƒ‡ЉРЩЂ|•‹‘——ˆ„^Uzjm}Œ˜Ѓ–Ž~…–ЦКЈАЮћнˆr–ЌОƒi}vЁ‡Ž›НШЯтЎЏЎЗr…’˜ŽŒ‘‹еЪˆ—Œ‡}{n{~‚ƒŸКЄœ‘‰}~|—–ЈВЗкгМžŒЃЌmƒ‰Ћ{ЌБТШгаФЪБ‰ŸŽ…‰’ЅЈœ‘ЂŒ}‹‡‹…z”‰™ДЄ’Œ‰—ЏЋЊЗдщжЅ˜›Ÿ‚v‡„ЅкСЃЕ›—ЃсРЎ}IvŽ•™–œЄЄ˜ž™Œg{‚Œ—}ŒkЇЎЁЄ˜„•ŸЃ›Ÿ‰ЉрёўнЏ–›ˆˆp{’›Ž™‚›Šw™ЩшЇ‡Qz‹Šœ—ŒŽЏЉ•ŒЄwx‘”Š‹˜{CxЈЇ‘‰‡}ЂЃŸ˜™ЉУћўЄn|‹‘‘„{tŸŒƒ––’zСсгЛ’x…Љž˜›ЈЋЃ˜–„uxm‚’…БЎkЅыЕЉu–Џ•‰”~x‘зяМ‰‚b‚‹„…}…vpžЃ–a•жаВud„ˆŒ‘›˜’ŸЂЂ—˜Ѓ}‡‰Ё•Ї›…‹‘—|bUЊИžЊЊ”ˆ‡ЦљщЎ›‰ŽŠ‹‡~…zm›ТЖƒ}ВУКœwƒ‰„œŸž›œ–ЂЇЎžЌ”‹z”™ЃЅ›ˆ‡”‘‚eivŠœ˜…ŠЖѓсЗЎŠ‰‰‰‡~x}…ŒЯО—ЋСЛ֘—’‡Ž••—–””žЋЉœ–’Љtp’i’ƒˆ–žИНЅŽŽюƒ}…”’ЅШ|Шп™žЊЃ‹„„{џР "$3(%+    9”ФŽjUPMQIGNW?<Ф $ &:&&)E7#-,&!"$$dЅТИЊЌxhv‰‹nP$€‰ %@3.&"H^`]UT3#-*!#&,;I+L„}vv}ˆ{n~„vei $ *&?3+Z‹Šxiow~tm7     !;!3?iw‚‡‡‰~ehngo "GQMJi]WŠ‚xqq|‡rqP-##+)5!29<]qb][SSajrqowp{x’q@! " 3AF9;-mƒ{kr‡’wPvv  Jakudqza]Yakabghpv{wx‘v< !$!7-`•™‘›ЁЈЅe~‡ ("(>b{‡nboiid\Z`dkqrwrmkknk[2"#22??+9@}–—™Єˆ}px !$TW2Gk‚ronxnYVNSVz}wpknju~e|Z#1&8$&8qžЂЭИž‘„nxp$,-4N{x||iaZ[YW3Ig^Z`kopruqz| *?)$*20+C;Y˜ЌЋu‚„‡–ŒFVUEC.FHWad``uhnhJHw]O[Spoxnu‰Ћž-?*0u‘vrigrpjeca^h|rjeZMY`aaє[`kc\jbpxv{}}€­x~w`7-*$3@CGA<>dЈЂ˜„rmh\kNI<v[oZQV[WbudQLQUm\`dpjo|„„}t|wx2!!5(%8.)!<:;5#?Hx‹{z^`jU?*V!MJjhakom]ZU`jk`i^hc[uvmecn}waJC-+"$2.-1,84:‰–|dPW\`I#L[Nvk\c[niu|pW^qbVjeVd^u{p`\edtL@%,3-)4(%$45-3C84,0M–g\w…uWV;gohjtqiq}pmrqi`ow‰aPae”Žxug`gnrq+3-")"<3,)#(),i’wu~‰…^WQq•\Q]bnup]ookga\ri .Z{‰^M[Vˆ„}N<2!"+*()9*8Bb‚rmuv‹knjmwaPhjhSodvdWb]ku‚r^7BNuzUco‡ˆ‘žP"(4!3)%-$-ehmr{}zwrwŠS\\v@ bpuzqinŸЋ”r9Fz]QYk—ˆ}‡oc70 #! %--2*.,O{vjzw{x{ƒ„mtecqHNZrx^`{Œ‡ЅЂ{k|‹oNVe{‰‚ˆ„E10(!+*1.+,9)+iŽov~ubo‡ƒg\bV;1[I5hvqtgd‚x‹‘ŽxqikoCG~xЃ~;$!.+G55>?(+CkZdw}{d`jjYS^``VUWcdnvxj],`ˆ|pv„~^rwaog…А™˜w)#.0 B324AELQ^cx}onmnoiVUbm]]€ue[\kZ\^Qz}}iq~{tegico{xv‚œL   &0B<7BQTq‚{kjtzw|knT^ehimiWS?AB^Je”}‚{wkvuqox~tu‘z-!ZWP)49.@<>h‚x}mwƒdmkc^\ihakqQWScungdvwr}vpoptmp‡‰…q~‡tk#" . 28+0?48AC@G~’b^c…В˜}Fggcupiwb4SYonhr…Š‹„„|gckxphizz‹}vp92C&+"+45-.90\‹bnd~kxpW1Hcjgea`YmjG^bMSqБ…}zh\^ripeeŽŒr‰QPG.!#(70--3A7djЄrrkZ^cxƒ‚drvrq^V„}>Wmc]Zimv„‚vUbpoaiigz~xž’|J.+0&"5-.89JS|vge`‚Œ„‰i3&U\dhZ8E[U`hgazЅ›’jVdpwhoi`jž‰Ÿ„Ÿ‘WB2-4&+**0#Cokgpmm‡–qxaFe9Pi`HZtthckgo…Љ˜pozŠ~pbk~|‚odqZ<Y?,@T71<7:0##"-+Frjhcqtm~‹ˆ„tq‚YU>L|А›aZ[JTShudu‘‚vhY]imoƒƒjj—ƒ”ЌЉЎn(B& +),@5ej^dormb}{wdjwvr:E‚›{@zЂnhnˆИЊŸtHbdjhqxg”rŒztj39!(&>@YUgjW`hdTjoabZgjopxxdingbgiagccuˆЋŸЅ™`M]hqrx‚{w„‡Ђ˜ЋА~W>44*1+22TQ[SIWFNwzuoaVEPgchhgh`QZjjiihe‚ВОДЎ’kguYPxw}~ux„Œ”АО‘Z1-8?0+;YU>F5)bvOux„i[[cebjcjdTPZdaUF9LЉжСЉ’Єž‘|pjnqz{z‘œŒˆ|‰W7(;)!;)dIrNJnFvžiZ]SZNVOoL@JTg\mLNnm–žЌ™ЅЇЃutpnƒ‡ƒ‡Ž”ˆ‹‰œ|J7%05+&\E?SVZmU[qqbV}\V[`TB2ViwmdYSjhw…ŽОДИŒcnwwrvŸСЌЃ™‘žŽˆN%:<>,go]tYiohvk‡‚Ёœƒcvi\cWjZbhd[9L\Œ}[zЄМаКЁqdmhpo\d~cv‚Ѕ’‹w@>2Y\Ža:]„oka^qŠƒˆ……\di`^euogmeU-7eN\}™ЏЩдФЃ|g`eexzonx{Œ~zž˜m&4EN\US„Že`P^xxq„Žne‰@VeEUogk^ Pgi~‡Œ™тьШ™||ˆtpx‚poerƒœxt>:*e`Zh? BuTaYxoeiw{w~Ў‡M"9\]njpuM]rOr}‡’ЯтмДŠoc`dp—’Œnttq~‘™goE-cYgS3`hY[OZovkigv‚{kSM[WZhrnbWVVTq›‘’емьыЛˆUcrd\mopxzt|x}—’c*[dP"TzQPmŠ‘‚d\]p…‚‚…jtui`YbmhihU?™‚ЄЇдђФДqgV]UgqxrtuАŒ‹…žIpjW@"NmrcMdjwnbnrƒ„zk]dbWZZWap]cT9[onœx‰ЭєхзЅx}jc|z~~}’™Є”aq—ЉЇЄG:>FG:]|eebdpwibgjUakhZ\{tQbumdcHwu˜ˆ‚ЎѓчрЖŸ‘xkqzj5[m—НАЄ„r^thkaehM<>J{mmpujhnemaWihcdckobgqqb^]pn~twВѓёмЛ’ЏСe]rxnjbˆЋ•‘z‰‰gpqom^PS[vopce^QTa`aS^Zgnbo^^WeihYVQYw•˜zŒзѓпžŸ—•ŠrqnpnŒЏ—ЂŒ…|qtneh}`LN";Yq][Q[grvxok^gjwzcG?Tb|kh:Wxvn~ЩьсЊА„›‘jSqZh^™ДЇžœЃ{g`q…ŒbJCYFT][agogxz‰^TiahuhEdbg}u–Ђ‹Qwtc’АгыщШЃ‹БЮАr…zŠžz”ЇЉЊЅœjpr{~{{[mIJ]orbaMb|‘•U]Pdx{vt\kpq}d]Bini|ŒЄСлЫЈœ›™…TjtqŒ•…‰…Ž›ju„|vxpmWN@AJV[`T„žŸЇƒgZ^YoqvngZbOVTajzˆO\™ВтщКƒ~В›iOkoƒŠƒ–•ЄЇ€т!#)!(.,%,235GCE7@F+#".!$(-"& FЈмЕxorrnku‡{~!!,:*2.144378:>EY@B>>eYA"+-4+$%0AOA80&-4%2zИацмбйВŸБТЧЅˆ(7FA52.104404:*AVO7GIAmŽˆ”Œ‰g8(241003<8.,(>EJS4`ЁЖЎБДИАЇЖИБЊЄ))*&@9387E>H+@M.9[T[ŠИЗЋЇЁВВЋЅW!292+&$.%#*+0AM1j}w‚Ÿ’ЕШКЌЉЉЋНЇЃvI-$0-11(!!(%7?5AV]ЗШБДИОЛАЊАДЗ[g`8-0#9PG@OTdЎЈ”—˜‰›ЅЅЉЌЉЎЋЉЛ—WG90.5300"#*-15HH?B3‹ОВЏЌРЦЎŽЉЏИ9755+5%3La‹‘œЌДЂ—’˜™žЁЄЎЎАЋЎЏЩЈV2!(45;48("-0(,@;?()vЮгЪгбзйИЃИМ-4:14LHNwžКИЄŸЃЇЃ–”’—ЃЋВЎЎЇЄЇЁŸ‹O,3;850#)170;OœЦШаЮЭбУИЈЋ08>@M]А‚ŽЇИЎЊЇŸ›œ•’‡–ЗЉЋЊЊЇЎЋИЌЏƒC#&,047(#(*18F<;:L‹дпїжЮШРДЏЎ.7$7ZqgkwŒЄЄЌЌЇЂž–’‹‘‡ЁЂЅЄЈЏЎЉЎДОЅ98& Hg82F54;:;:YCnЦжбЛЋРФРЭЭ^umzt‡‹™œ—ŸЊЏЉЃŠˆИ‘„œЇАБИЗВДМдТL,,SoJFvU8<7H}йтСМКИЛЕЛЩЏ™Ѓ’˜Ј–‹›ƒ~”БЌЏЏЊЊЉЈЉЇЌЎВЗНТТЦЯНЛ}7)001))+.038894@N@*35502370.?WLN1$7zЯсЗДЁЂЁŸЈОМ…ƒ‘ŒŠЎ›ŸЈЇ˜ЖйЧВАЕЕЗВДКРУЧЪЭЌЩЯЖbPU.9>910+11€c*@E@35N\ЌнСФМЛЉЇЊДРЎ•Œ‘‹–™ŸЁžƒ‹‘ОУИЕЖЗЕЉЋБЏВЁЭЭЩУЖУŠZ"1..,4.2+47;BCEML5oузЧЖЖВВДЎААʄЈЗЅ˜Ёž™œžЇЋЏДИБЌЉАДВЇИСФРЌЕВnF874355:4,.1NJIJ7#?žЮЕАДВБАЇЄЄЂ™ЉЎВЏЈžЁЁЄЊЎЌЌЉЊЎДЌЏДЛМКЛОУФРУЖ„NCO88:CBG@;;CPVTQL$E|бржСЗИЏЏЇЁ—…ФОЉЖ™žžЅЌЏАЃЁŸžЁЊЄЉЋЋЎЖЖББЕСНЏQ9:77;CFLGGA$)ICHH0HPŠЭЪНЛВЌЉЉЂ˜Є`j•’ЇЉЈЌЕЕДЄЃЄЃЃЈЉЎЋЇЉЎДАЊЈЇЛР‰eW9-C>A?14989;@C<3@:OЕЯСЌЎЊЇЅ‰v”’ЗДЁЉЎЋЌККЖААЏ€ЫЎЋЌЏЄЉЎВБЎЈЇЊЖ‹h??PPE;<;8;FIELJC;70>mТмЕЖЖЮЪКŸ›ˆЅАЌЋЊЌАДДИЗИББЖЏВдБ—ЄЅгеЗЏЇЄЈИЏ˜A?PG?B<<70*,!NL>3487;ЭМККМЫШЈ—ЃЈзbœЅЉЎБЋВЎААЌЌЏЗВjUqЅСЧАЇŸžЧШТpMM917>A>7+--378>;B>LiКМКВЖРбЕЏЌДМЄ–ЁДЁЁЇЈЛЎАЎААСЭТ™e\}„ЗДЂЂЎЭШЭЩcB28??>4:449;?:;0&8…ДДЖМОРОСРЩbЋР‰]aЁЗИЛКЖКСлцбАwcƒКЊЇ™ВЮТСС™wPJ$458577305::8?;+8^ОМБЋЕКННСаДЏЋЌЛ‘\ŒЋРЮМНКОжЫЪнеКЋЖУЎЎЂЌССЪЛЇ[?1L?9:98834>909НбДДМУОЕКЯЫЈЄЇЃ‚ƒЂˆˆЉБЖВЃЏЮСФдаНСКЏЎЋŠ‹НЫЯтЎN>A>:89:92,]FBGFJ:PВЂАЕФОЖАДДЋЅЅЋЈЁЁЃЌЏЏЕЗЅ„ЋЯТРООУЕЗБЏЎЈЇСркЮPBN83<<7+.I;?EHJQSБЏИТОМЖЖКЗАЉЊЉЅЃЃЊЊЌЁЖБЅЅ˜КЮОСКФОКЕЖЎЇАЗЛОЖЦжo+H7:302,-.,0AA?A@4:haWEB?A@ICЉЮСРЕКСМУЖЕЂЄЉЌЕВЛœ™•ЈДЏЌЊЧННМНЕЕМНККЗСШСРРШЖ‹<.:5J3 ML@ECA>GLGŽРзВАЊгЯысФ’ЂЌБЏЖЕМЉЌžЇЏЕЖДгЯЫЪТМЗЕЖЖ€ДМРТРЦНМЎ\NVE><7455;@;;?EJ‹›ЫЖЋЏСИСМ—qœЄЎББЎЋЋБАЏЉВЇžНщЭЩШФКБЎЗЕЖББЕОУЪОУƒe\G8EB75AE<2:BHIБЗхРИЏЋЌЕСЫШЦЋЋЏДЖДБЫНœЅЌЅЊБДШЪЪЗБЎЕЕЏЌЎВКФЩмкМ`4F8A<<;<;:44>CE’›ŸРУВЏЗИНЦйЌxuaЋЋЈЄ}›ЅЈЉЅЋЉБйЭйЉ›ЖИЗЗААЎАЧУзЧеУtVEHJBAEH3BA>?Fˆt‚ОзЛИБИРМдНСЄ‘Ћ‡ЅЇЅ‘ЅЮТКЌДДЖЗЭтЭнНЗММКБЌАЗЛНЗЋБU3iQQSpL!@CBBЙЖЏЁЃАЫММЛМКЕЇОЋž›—œЅЊМШгС”Ÿ’ЪЭЭЫЩЭЦЄЌАЕБЏЏВККОТЦЭЪw\[5IP[1-4,1;ЕЋЈ|ЃЪЖЖ€фДАЏДОŽЁЁЂЃЉВдЫœЉЅЎЊЎОббжЎЈЎЌЖЖЎЂЈАЛОУОЪзЋO>0FBA:;778.7—ЉЈЇЎЋЏАЌЊЉЋЏКйЭШЊЂЃ›ЄББœ™œœЌЗЖЧбмЉЉ˜ДЖЛЛББЎЖНЧЪмФэРW31FEHC@9;CJŸААКЕЛЗДЖБВКРФШЮОЄŸ‚ЉЖРШЕ~‘~ŠБСЦЯчЮЮбВЎЏНЛДЖКЗИЛзсьр<\JCA?>;;?EŽИИДЖКНОЛУУЧУОЗЛЇŒСщлЏЋЄ›ЈАУЌЛЮбШИЌЅЎВЕЖИРИЗбЩгчше…<-OA9CB@GC}БДДЋЏИКЇЛТКДБДАТЛ‚‰СгжЩШЇНЧыйМИИЮёчреО™ЈЋЊЕМДМжОШЪЦДЁN>PCBA@@FEžЈЏЏЌЈЌЊЌЏДЖЏЇЌЏИЛЗКЧАЖУВЕЕБДЎАЈДЦыцудЇ‘ЃЂАРРТФУЫЪрущыЖt\QMMHCAEm•ЄЇЁœžЋБСНЖЉЃЅЋАДДЖДЏЌЎВДДЖЕАЎЦыѕстжДЌК–”ИУФУУЦЭекюєа…MMSTGEJMЃЃ™›ˆЁЫ›ТйЧЫАЅЂЃЌАЌБАЌЄЃЇЈЌЎЄ}”тўѕтЭсслтУАЗРТТ€†ЭеййгЫЫЈe;FSFHFOЕx\…ЏЃЅЅ™ОуФЮЈžЂЃ™ЂžœЛ‰–ЉВКЊЈœЖЛЩучрпртНКИОЦЫЩШЦбжкдЮжмОiLCHCEB›„zЈВ–ЃКАА™ЫЩœ–ЈЅ˜Ÿ•ЕбИДЌЇ›ЛАТЮЩжэёёебЋКРЧЦФЗуїггЯзцпТk@QQICВИДЛžЏЧДВЎЕТЪтхШБДžЉЅМЊЎЏАЋЏЄЉбНЛžНщѓјюлгЖЉВИИЖЁЋЦЈФЪдщЭдЗH4[QLЉЎеВ”ЉлРВЏЎОгЪЧЧЮг›ЊЏЌВЛНМКДЗЃ{pЇ›ЭкюїњљтФЎЅБЗМОЛУФУФЧЯРууLCPTЌЉдЈkЃелЏЃ™ЋСРТЦЫЦЗЊд’oЁЕЅЈЏЕКЄTžВЕбгЮдћўїмТКЦДЖМТЧЦЦМОНШцлЪœ^OOЌЉЇЊ}N•СœЁЄЗЕЖЖЕОФФняߘ‰ЅЇЎДМСОЉВЂОЦФгѓўњчЪВЋБАМбЩФТРР€зШЫнЗЭЄ`BЈЊВž^hЂЗЁœŽžЛЖЗЕЗСЩШСЗœЁЌАДРОЕЏЌЊžРтпйјњўўѓФœАЖЖЉКЛММСУЧЫЭбрк˜TžАг–rrЈШЏЎТжмФМБЗТЫЯЪЩЛДЖЕЌЊВКЛЖВЊp‹ШжЦннїўљхИЊЂЋЌБНСУЧЮажкдатЦ{ЭЛВЃ”u›РЦЛЃЕУОЛЕДТШЧРЖЖВВЗВЎЌДЕИДЋЁНИкУЭѕўўћлДИЏЁЕТЧФЩжйпмзАТзшьп•‹›™”‹ЊЪССЛЖЗЗХМЕЗЖИДБЖЕВБЏККЏЊœЩЫИегЧшўў§эежСЅККЗœЗпёйуУНЊРУУЖДОЅЂ•ЁЧТНММ€ИДДАДИКНЕЗИЗЖВВЖИЛЎВЖЗУФдТьўўјьбючЅЃНМИБЕзюлеЧбЩЩКНОЗТЊЇЅЌЧСМИВББВЏВВЕДМДЕНЗМЕБЎДАЋЈЋЅШкзЦЭѓўјмедеФШНТУРЕзєчсдЪТСНЛОНЧЈ•—zБЧЋЃЉЋЏИСТНЗЗЕИЖВЏЊЊЁЕТКДŠЄЦЩЗВУєў§птЯгаЎ—ККДЏЫзсруупщООРРлнВ‰ЄЁЉЇЎВЕЖЛЧЪбЌ•ЅЎДСНžЖЕЕСЮрэзЎЗЛКжыњўўѓЮЪяјчЛЦСЮтФджппнкНМСШЪЧТЉЎЃŸЇДЛОБŒЌФймЩŸЇЎБСШШНН ЧФШЌЄžКИАУйцѓьѕцзааШœММФЪгЪЭбеезНФЩЯЯЦСТŸœЅЎДЖКВЎЭщјјдВЇЌЃМЪЫФЛЛЗЛЖВВЛТИЂЉЦпяўўђЩЦѕцАŸЖКОФУЯЯзлмъ1&::78?75:;-CC€“F5&>3"(&(332540*7(&,&0OЂжj]WeZU]mVT-!"83$!(*+57B8<;@05I?A:;YQ5->5938;drgm`iL,"<48@AU@IT—ž›ЃЃŽ~|~%7($+*1-#42ZcYavnd‰Œ˜…|‘”}{bG-*$?<:-1),+#9FF^cgЋЇˆŽŽ”’zƒˆ™bib7*+9I?7FMUdxvmcgcrzƒƒ‚‡„˜…TA+4,:E.)+$.8?EVWTP?|ƒ|—•„b‡‚‹2>7)",5Wq}~mƒoobkuro{~‚‡„‰™‹F207@72?44€N>FNG0.pЅЈЋБКМЖŽz”™(50+)C-HSiА}vz{{rekbgtw|„}~z{rvjG*:B::5414G@NSSAJUŒЊЇБВЊД•Œx‡".A1?JcoTVv}|r{xne^Yi‡‚ƒ{~„ˆ}‰p@,8759+5.?FNLH.CSŽРМпЮАЁ”……7!3@%FG[z‚ˆˆ{khj`]W]ntoxr‚‚‰–Ž#4,Sg;8M;"FOLVTbLzИУЖЁ„”™žЅŸQe[WLETS`qjquˆ}r[Y…hQgj}}‰ˆŠ‚—ВЅ:&-VwTHxaBNMIQTI-J}АЕ—„…ŒŠƒMPiv3LOGJVnvЌ‡wpe}{zwz~ŽŒ”‡ŽŽŸz)1+349@QFIIHANJF+2?‡ЛК‘Š‰”•Šœ—PmnTOFABLAV‹{xmkr|wu…„ŠŒ–‘’‡>+B>*;417@?@F7JWUBGQЗТž›€йЂ|]oec{ZQbPJ^}…ut|}zwvƒ‚”Œ•˜ЅŽŽi3,%&%2$5+A;@@JTT[H?kЅА›—ƒ~‡‡rd][[ULed|ub[c’Œz„Šonvpq„ƒŒ‹ŽˆŒ~ŠŒm>880,$!49FBFEOQbekЃаЅŠwgu—ruqUN7(Snohabnexx‚‰•ouvxƒ‡ƒ‡…ˆ‰tthA.;?**,&))79:+A—ЉŒˆƒz‚zopnmktƒzwng^npnprpm{}|‚}…ŒŠ‘‹Œˆ˜„mJ>@37BBECCNHUbddaQ4P{ОЗЌœvtxh]ZŽ‹n}cgipjz~znceuwpn}u…Ž‹ƒ‚Œ‹‰I%::.4FPFLOI49PPQIEPb‚Љž”Œˆrozn]Li39`]rrow…}rqinvtu||{xnƒˆvtz‘ˆja\;%5LC;IAE>;FHIICGMQžЇ–woott^Bac[‚u–{q{‚…o}‡oxxuquxƒƒ|tqpxŒa[@@H@JIMLFJNNQTYPSJ>LiЈД{}ŽžЂ…mgQqzxvŒ~x‰Žƒ„‰‚zrt„ЃwhvmžЅ…{znu…{tC;HH€ТBEAGC:&1V]HGH7@>}Єˆ…Ž–—•njgЌj(inn}{i…{x{trƒ‡3.MxŒžq^ik•™‹]ITC47;;E974)9AGIJMPTn›”~~Ÿ{|r{…vdxzvgzw’‚qthz’ž”b9-O[Œƒbn~›žИdA,8>EFA:;GBIMJM.,;}}„ˆ˜›‡‡•P2hj…]*$mŠˆ„„‹ЏНЈˆH;ZxmdƒЇ™œ‡qOM#>>€PHG:;EEJOOJL8GdŒ‚ƒ‹Š‡’•—|ƒwr~U3[j‰—Žw|ŽЇœœМЏˆ|Žzjk}‘’˜–U<0IBCEE>A@C?>FGC:!BaTWOQHFC&))<7GMSN^ZUSgœ|‡„‹‚h?\q}wzrr}|cv{keƒШЁ•Œw{z{~xƒ’Ёžˆ›gheO:LHA;BGBOJZTZtК‰„xrv‹˜”t„Švo”’Pd}rnu~|‡˜‹‚xƒ„|z|’‘МЊŒQ5E@EF@;@G;JHOOZUciŒzr}œЇ|SF2ejrxbIWrkozƒt‚ЊЎЇoƒƒŒt}xp~Ѕ›БœЕЇo]HJCB8FL1MUTPVWMPŒЂ‹||~‡™Њ„‹d[wMk}jUmœˆˆu~|„•КЁЉ}‘‘‰~zxŒ‹‚~„oM4hSPWkW%ET]TWtmhe{‘„Šˆ|ƒu‡oh`]`nzŒŠœ‡]gd”’–Їœ–muw}xkt|‹„Š’™™ЂmT^7GW]474JLP~miIn~|‚|xq}„Stgpwpz˜‹[pmvow…ЂЉЊx|q„‚…tit|‚‹‰ЂИŒ?:2NLLJ?<;GILOaedp{x|kmqpŠЈœ”xnidhzzcda^qƒ‚’ЇЎt|ho|‹ˆq‚Ž•ЂК”гЏB.0GCIE?LOU[jv~wƒ„}~u~{‘ŽžŒphGt~„ŽzAMHU~˜ЏНЈЂЂ|ptŽx‰‘‹„ИЧзЧn9\M;BBFCGGSY‡}zz‚‰ŒŸ•ˆ’mbPWŠШЎqmx[cj}…nЂЂ–‘ovv}{››~wЉ—ЃОФН„<(UH:EAQNZHwwњp‚„|oŠІ{zˆ‰ƒJUŒЂЈ–ŠgŒ‹ЕЁ~ƒ…žЯТЕЉŽimt{‰ˆrЋ…Ё‡ƒItgj›ЌЦйшнК‘~vw{‹Š‚‰–‹”Ÿ™ŽИАz<5PZgu‘m7k›Љur]n‰’”ЅŸ–{tЃM1nqhoz~p-cx|•™›ЌёўтВŽ™„‚‹›•—ˆ…ŒœКЄ•{QMStounN)YŠdtnƒ|t‰ŽŽЂК—jQgvv‚{‰„hrˆe…˜ЈйєђФŸ„xr‚…ЌЋЁ‰‡„ŽЃЏ}Ѓ‚YEqwze17evbeZg‰|‚Ž–˜}`^nomzŽ„ougjk‚ЊЊЉчцћћлЄopˆuuˆŒ…‹‰””›ЇЊЊxCnzŸdBLhŠpnˆЈЉ›‚wz‘—›—˜ƒ‡‡mk{ƒ‚pCW•Б•РЗцўтЪŒ|iqrƒ„‹‰ŽžЄЅžН™\–Š}u]?YƒŒƒb{„}z’Ÿƒuxxwuwrxx|tSm…БžшўѕыЛ…Š{wˆŒ”’ЄЉЖЏЇ~ŒЊРРЗWV^cTOjŒ~zw~ˆ}zu‚rx‚zwxŒn}ƒƒ|o\Œ‘ˆАŸ’УўўјгЕЋ‹}‚ƒzMi„ЏЮЗЛ”Šq‡ƒ‰xv{gZ]`Œ|…ƒ}~vw{‚ƒtr~‰Šx|Œ||v‚{Œ–Ѕ‘ЪўўябЉШгvoŠ‹ˆvz–УЗЄž™”}Š‚…pauwŒ|uvpmtwvpwz}z{tm{ƒ{okgo’ЏЅ‹ŸлўэДЕЏЈŽžŠˆ‡~|ЄЩЗНœŸŽ~}ƒŒr[]hkjcW]`norppv‚Š‹‰›žˆ}vƒŒ„ЊЌЃ˜ДСœzhnw’ŽŒqEЎtZ`U]oqje^gimba\aeddZanuxmq{‡„‡˜œ––Ž„~~‚„ЃЂ’Ž‰–ЋДg{ˆƒ}{{jzipinzz…~{qoomvqaabgedjp{rkˆ˜ЎžЄЅЂ„Š˜”‰Œ˜ЁЉЃ˜–ЅБМŽtOjŽ|~{ubcH\x{„’‡dbivvwtedei]V[hxobr…‰z’ЂЄЉ˜„–АЌЃ‘ˆ›ЅЈ™‰ŒЃЅ˜™—uCJkxqwxg@Ogqw‚ŒŒkqmeiwrqeprhbkrmekhULg…™v{ƒxŠ——ŽЉДЕЎ‘‚ЃЁЧ˜wUddmmpvt3@JSbzƒƒza]YagnhbdpnutvqgimYVOikhq…•‘™ЄЄ—˜ЄЎЂoˆ’–••Š{dnkojmridnkjmtzwjngacptnknovm`c\S]onjhodu{{ˆŽ•—›Œˆ‘ЎМпЯ’’œž›‚xqjbmkrp}mnb\ntackzzipxoinkkrjYObhQbgZemt}x‰‡‰ƒ‚’ЅЉЋТЇ”™—ЄЁЁž•ˆ™‹qkceOvU8P]ap}qdpqjgvxwnpt}‚u[3AUue`]hrjVt„‹”Œ–”žЅКЃˆŽ˜ЂЊžЃ™›–Œn|t]^ibidporhamzg]Wh~~НЂrWzbQ;GEj{maacbbgЈЉ‘’œœ‘ЉЄБФЌЇŸ›™Ž‹•—Žwq‚puoq|tjxwk`\QVjkŸзТ…„rPduaw‚teZb]Yt~~‰ЎаЇ™”‘Ž„…ŠЉРНœ›”•—‰‰Œ„}tjkxrwddnmjomcabn˜ЇЃŽw`jwg[[bktqam–k^n—З›~‰|ЈБЗЗЇŠŒ‚‚‰„ƒNbbqz}ubhuxo{|jdgx|„ŽЁ‚{g`]Yar|uimiortv…ЇЌœŒˆ‘™ЏЛИЛЗЮЊˆ…„…‚qtt…~{zuop{nxp`k~x|ƒkcVT\U\Femtjptzux•ОФЉ~ˆ••БАЖЊМЛ”•‹Ž‚jqpuxzzhopox~]p|gm‚p~}rohVOW\VOOLuƒ‰gnox~]ˆ‘—ˆ‚Œ—ŸЇЄЌЌЈАЭЌ•„t‚…|{|{i]^w{wdd]cmkm^mjo^^€šLS[UV`hg|wkmp{qjccž˜‚Š‹—œЉЄ›™›ЂБВŽx}zŠ|c[Gjmowrhkh]eatngrw{ndgg^Ygk- M‰{heuhw‰Š˜Њ–‹n„’ЃЅ•—ЂЂЛЩНЕЕ•|‰zvrq„wpuxvoZajtx~quw{qujnpP]hHV~}kb^jh‰–‹™–‰„ˆ”•’ЁЊЏзЪФЫгНœ…xˆt‰‘ILc|{t^dprvvz…ˆ{tgxЈЃxcevidd}k[itu{x‰›Ё‰‹ˆ•–˜ŸЅŒ˜АЗРЩœx…uƒИС…O`rxojcegeu{‚w~‰ŒŽЄp‚x}ƒkekqrppmi„’‹™ЃЁЅЅ”‘™ŸЈЕЛаЈ‹™‚uœИhevzjmmgbbqmnrivz…pUVGzuwdpgV`q}ejЎЏБЁАМЌДЁЁ—Ѕ›’žЊЕЖЗЕЩФН{•—ŽŽ|ŠЎЇ{k[nu{}ƒux^\qtuhZk}gwŽƒ}VSjm‘Œz„ЅЛеСŸžЈ™ЂЂЃЏСМАМЛЫЩЈ~‡ˆ”ŒЃЁЖ”rqmko{{vTYYntthgd\ZYUVb\a]g]hh{wvuƒ…}c‰™”˜œ‚x…ДРАОН|Д}nn™ЂЪИЏ’}tumwtpgVP\mpn\YU^\bda[NZuxianrx{rƒŠ…‡•ЅЇ–‘‹”‘БйчШЦЧF^{ŒЃ˜ЏТЯЩ‡pu~qntc`\eh~vtwh]k[cWZ\a[mnmnx~hkht…‡’‰–—˜›|‚—ЌСУСBu™Ђˆ|qŒŽ˜Žx}tgpgncrqPcqwo{wvmg\ddagY\]mumpv|~jac|Œ–ŠŽ™˜Œ˜глСЖЖe‹ptŠzppz‰}‘‘–ЅЖУИВЕЁЎž>GPFc‚aŠqrzŠu|guˆmh\cn]beƒphAkƒ…nUQ>@?euutckw‚{}‰‰€ŒŠ™Ќ˜ЄЈЇЏЈЛМТ>3>Sdn|n^pupjhkz…]Qkmb\`Wr|uiŒЄxvgrr\n…rigkw„„ƒŒŠ™Ћ–™ЅЅЃИЧШОA?OJ\Lvt{~Ѕ…J^nwqu{rhj`]jhtxއ‚xmoq{p{uv{vn{„ˆ‘›ŸЁЂ–‘‹••œЋОЭЯB8?5FLGŠ”uЉrQoЁ…|uuzrmo]Yx‚~v~|~~vikruhhr{xpz…„ŠžЅž’ЉЁЁЊ›œЇЦас>284-U}ˆБƒ8}™Е™xmooppj`WJd‰‹„‹upinuwtipnnƒ~‚mЂЂ’’›Œƒ–›˜–’ЂЇ49F?*$2OŸuu”ЋЕЩЁixnpw{|c`k~‰Œ‰‰‡~ƒujhVekr|qpƒuˆЃœ™—ŠŸ•˜ŠЉЃ<2%+!LM:m˜ƒ•Œ„—ЁЊk{qp‹…~{nm‰Ё›‹•}jnx‡‡gVjakonrz}r›ЌŸ”‹Ž™‡{‹Ў„2109-580#)hŽƒ‘ЈНžt{ˆˆ{}qr‰Š›˜‹wm}w•Ѓˆronnuzvv|‘›™ž˜uU”Уo@>80<@;4989Z‡’ЅЉБСЖ‚Žtpˆƒ{w{‘iЈ–wŽxkzЖзNWW|„›|mpŠŒŸž›ЈЫž–ƒИ}CE<@AE;7;;8HACW›КЗЇŸ•vˆ{nxww‡•cx˜Ћ‘‹ˆtq’vm{kJbЖеnzu”‘‹zˆЦгДŠЅgN:55EG??N@8?0.4”У–…‡˜}|‚‡„i]–›wUzЗЂ‡jot~zt}}eBb…ur‹ˆ„ˆƒ‚žУ’„i:19>GJEFFA:+(0![‘МЄŒŽ|kx}zke‡}guИЧН‡xkrtzz‚‚obˆ‘~‡…~}…ЂЕЈ›F*9:HTPE@C:34&,LScm‰Ї{|‚~zxu}wv\{ЕЭШАk`}w„‰‚nktu„‰‡}Ž˜Ѓ™‡L41Q7C?JOL?B<3>@*35>A„ОаЃŽЁŸ–~w|{w`gЗбЦŸ‡z‚Œw{|rg[nw|}w}ˆЎФгc2%<79@?978A:(5-8>CTŽ‘”ˆ…}uwcm„ŸŸИОЈЁ„|{wv‹ЌoFj‚wt{œЕжЗ?,(,B.0(;;FGFJc\><|Š›•ŒŠ‹–™„Œ—”ЊСжЊvn~‡‘Œ‰‰{~}v’Ѓw?<1<( #55,028>703AA@>GCQ]m@[‡Ž„…Œ˜ЃЂŸ•žЁЄЊЫмЋЊŠ˜‰‚‡z`WurU;#@S -9..-A;18>C<@;CEJTQ\[tŸœ”ЁЅ‘žЄЁ™žЋœ‹ЎЇЌ›œ’”—œvm{Š~1080La#LG<9ECIA>HLAB:?FOP^STH—ОИЌ›œœ•‹‰™…t’ЇЅЄžŸЂЅwz›ЅhZY1E7I?.$284.LJ?943:CMNGAGBAFGIFgАЧЈДдчКЄ‡•ЅЈ‘ЉЧЎЊЁ˜–›v…”Љ‚o^jG !2uB7V@HHF;0FPLCGF>9EN:CTmВЦеФђжŽr”ЄЅЉЂЈЇЃЅŸАВО™‡rrH5331 ++){mFIW8Fo2CJIIBJNNHGH7FaJpЈЦетюЊuŽЖЖААЈКВЂœ˜ЕЫЎЎ^EFG4*--)9B1**3<‘Ugqdd](?AIOJLIJ-5?9(Ž„\Fdk`o3A@HLE8B>8C8FQFpd„ОшёкЩЇЅЊДЕЛЫЉŽ”ЖД‚L8A1@% $-592580™zvwP;?ZLB<;BGFE>?>04+-#)()0:.F7<™‘Ї—|`WLHNE?EBGOJLLFHJIMMJ<8U”БЛБЌАЄРсЋE*$$,278#.,0*#:899->HtаУДАЩсѓћжВЗЖВЖЛМЉЊЗЧШШЧЩЦТНСИЕАЈЊЇБРМЗЏОВТйжгЪУРШЧЫФЧлШ:<>.-0YYLˆФУЫЧНЯргАЖЕЛСШЧЛЖВбнЮбЪеОЗКМЩРЊЁЉЎВБДЖИМЖдейгЮЪЭЪЮОЪט?A>58@JB3>ƒНЮЩЯжїдЈЛЖОФШШТНЛЭгг€эЫНКЗЖЖЭрУИАЎДЖМОЛОУдеккеаНВ”гуuPGA<>A9?EG>1ƒРбнпшѕыФЮСТРУСНТйКЭЯЯНЧМЏЖућШ‘АЅМЭтРИКШггекнњчеЗмŸLMAFICA>AGI[Ud}ЫшужзШЖЧКЛНМЗОЭЫЊКгтаЫОКБЭМЌСВ•ЈяћСМКНаЯЭНУьјнЧдvUMFFLHILIGEG?ABВызЪЦЯККРЧСИВœдШТ•НумЧЖЋКНРСОИЉ‰ŸЛЋОСШЩШЩМШжчЩУ•1GBFHLLPMNHEG;F4nНчзЫЦОНЛРСЗДЊЩЧЛЈМшѓюЫЗАНУСЦШТЗЕВМФЦЫЦЦФЮгщмзЕY4?3CEOWVIE?@EJ;;[b–АЫкпРУССНЖЕЖМЏˆЗшјїкЎžКТФФЧЦФЖДЗНЧЫФРФЫетдВiA?[CFGPSMA9>CFFG@AUUЊѓњбаШЭЦСКНЛИЏŸЌтїщзФОЩФЦФУРЗЊЅЉРРУФСЦЯтїёuG1&V0CA?@>4>EA?:FE9ELjФЧЛЭЪЧНКЕлабЃАШгЭхэрлШУОМОМмБŠЋЯОСНФЩжхўЫP@5:A@798@BCC::?IJE;UF”ИЧьлЩФНЏЯтяФ”ЯЭУЫнкеЩДНМНСЯнЕИМОРТФЪнтжQ$0TCO0A?8:@HJ887;LUQ@#.GpЋШшбЭЫбкўўьНлбВЩрёѕмЧЁОЪШЪЧМДЕЛОУУРллnB;;?;INSQ(?IJФђсЫЦНШЧШгЮбЭЯШуўѕхСМЩЮЯУЪКЖЗНСОЦСЁC(%d-*NNOONNE745>CGOLLkmMWДЩкЭЧЦЫЭадебжелсшўтЖЉУЯадажШУРННЪнЅYI>FNVd\k]ЃжюхйлждеЯааЯЩИжпрмлжйзнНЩсмЇ”wTZH\E7!"$YNIZYTGBAAIVOGHGGТJMUYƒжѓпхѕўхдУЭбггШцнцснмлйаНЪейАŽq„]$*#,žbQdZOOE;;BQPIHCC€АMOFShмюющўћШЈЪгзлмрппммпмнцЪФЅ…U>MOG+<!&#С™dccFZv:HMTQLNTOILJGWoTˆзтьїўнЋШцьчцчуумемпѕыч•bZQBCJG)0412зЩx…Šmkc*AFNUPMNEA;BG8T8]˜ЦеејљєщжтччьэцмзлюхуКGIbU4AE<<;A<5.44)кУœcvth?BCMOMGB;<@>47345пТИЌoJMjUBEFJLE@BCFHIMOZmqbŸёјўћэшшчэяэщхдЭдЋ[[A+LNI@9;;C0BJb:A,дЧРЪЃWbaYOMOPG?4:?E<$;C>йдд№кЖ|jVVPLHOVSUWQPPжMOQSUC,AhЗуэсстняўЯaMPL;qЇЪВЃŸ•ˆ‘ސށ~Ÿ™‘„ŒЮмжЁˆ„Š”‰‹–•|”Ђ•Ђœ–œЈИаСВ—Z>?2ZY[pk[WUUMNH@`hqЂЕН‹”‘–ŒŽˆ‰„‚e•ТхрФ„o‘‹’•—ƒ~‰…œЄœ˜ЃВКЏ™aHHeMUW\nc`YQSWOPGPQO˜кчНЅЏЏЋ–‘‹•‹r}ШтлБ›Š™Ё–Ž‘ƒ|u{Œ‘‘’œЇЫкхjG>0YATQTVP[S[YNLPNEPTdЇЉ”ЋЃ”Ž…‰ВЌЊt™ЌЏЫжКД—–ˆ‡˜ОˆVx›‘Œ‘›ЈБЧђаYECCU)HNAPUYZWMNQ`ZUCcL”™дЖЄœ–{ЅКг—aŸЃ’ЅЛЏЉŠŠŽˆ‘œЏ{‚‹‹‘•ЃЛТУW)7]][LCAFJZYYTQJSVedV7AIY‡ЂШЈЇЃЈВєўа‰АЁ‡™НапИЃr–’œ”—Œ„{„Ž—ДНgGT`USAHLG5C?72Ё›o[…z‘5NVe`h^^S[NV[^hb‰ƒ—ећўщйИМИТжаЭйФžЉЮЭ‘[CQQU:A?9@@EBA7>IH2NPgIF3Ћ™”ž”\kegeab^^ZOJU[haY[IPjrb|РљсахдЪУсзтдБЃ’YQjGNOUJAC?LSUaVQ7+4Їž”ДЧ’Zenkmebcdebaik]`V`q{z]TЃчтРшржСФЭђЧF>>Qam\TCGIJN5M?ABL8MJPЕЉЈЂВ‘zwmb[cdcgkhjdcdb\gcekQ5IiЋЧаЯЦЦМеўУUJM@09SSHAQHSFE@GBMV^\NџвЉ•…žЫзпаСЫщјћт‰N4#47C8* *%*%jнњёёИюѕїјїњљћћјћћњѕѕї‡ЂЗЧСФШкёљљНM151#.*%)!" 8NA;mлћюэђѓєљјїјљїї†јњїѕѕњ˜‘˜—˜ЌИЛЫдлхђљь‚@8)$*"8<+)3–шплюѓѕѕїїјїѕѕїјљљ§њ§~Œ”ƒŠВЫежЪетљѓ—T> !")$$ % 5312H1EkЋћ§єђѕїјїїјОљћ§§ћјљ`q~‰‡ˆЁбэжгажѓјтюВC-4-$"-!"$27370JHAЮ§љѓѕѕѓјїјњјјњјјЩњјњ^e‡Š‡~ŠВдЯЩРРШы§љФS %1+*(5!$  ("3B*;2‡ј§єєѓѕїї§јњћћјљлgv‰ŸОРЄКкжгСОЫ󚚘O %*--(&&77і9C]M5Ј§§єѕѕњєѕѕљїјјѓљјzЅЉЎАСЕЁЗЮЮняјљŒ+ &*-->;48У§§ѕѕјїѕѕјјѕїјјњљљњїu}z…ЖЅЃˆ‚ŠЖЧЮагєЮL($9M1  #(.2>@EM}Ќћ§§їљѕїњљљѕѕїїјњїїХ~~xЈ•ŽŠvЈйдЪтѓ™97*>LA" &*&58CA2&(E8)&71[з§јєѕѕїљњњїї‹љїїјћњљїљNaz–ЎЄЇЁЊЅЊЕеаЂm:2.8>A.#04&#:?EB<@IOrC!)3%*&#!"+IH;:*gЭ§§јјРњјљјѕјјљљјћљјјњњјћgg}ŽЋВДЏЈœЅйхуЄN<499Lc$7:?1-79>1%-0EE.;Ў§ћѓђђѓѓїѕїѕљњјїјїїŒѕјzz‚ЁЉЖРИЃ‰ЋеЮz77+78HLHCFC?097??;Yˆкжкћћђьюьэяђєѓѕјїѕїѕєєїњјїјї‰ƒ‚’ЌЎЄНВ„›Џ{>:N2?B>FCGBIF480#5;ECGIBB>GJ@9–јћѕјїєєѓёёђєћѓђѕїѕѕ§їљїїйrxtq~‡”ЁЁАЃŠpT;;94)0FLICEEAAB?*LБюЦЪьяђђјѓђёёєѕєѕѕјїјјїљєѓєєЯѓѕѕ|vr…‡Œ—ЈСЖrHMIE>4*15GLLFIAAC?AWЅЯЖаћњєєѕєѕєяєєѕѕђѕѕєѕѕѓєѓєє‰ѕїњz}w~~ЈНŒY?219GF14?HF<>B@2HTC^КБ™Оьєђђѕїїљїјѕљѕїљљїјѕѕїњјїїњћљ‚~„‰||‰ЈКЗeN‚]$>53:AEGIJA<<&@Y`МюкЧаьяяёєѕєѕјѕєєѕјјѕѕјЭїљњљњћјјu~‚ŽŠžЌŽU.Ac[CI1044@BCLJM:!2<‘ыёеЫхђэяђѓѕѓѓє€„ѓѕѓєєѓѕђђєјїјјїњњƒŒ‚„„ТЖЄZ73$#01,0-3>49@;+82HРћїюэёёюяюяэяэѓєєѕїѕѕєѓёяёђєѕѕїљљњ˜‰‚Š…ЁŸŸŒ<!%&(#(%43>:7*1>)&?эљєёєјѕєѓэёэюяђђєѓђѓђђёђўѓєєжМСНž‹’Єh1+#),20)#(+,7<50;>NgмћћѕєјјїѕљјєђђѓђєюяђѓѓєєјїњћћјјмСКРЈ——Ђ^;%0*-;+&4>?<3;PH–ђтьёѕљѕѕјљїјјљѕєѓѓђѓњєїїћћ§§нЖЩьзЏ—hE+$,#)%",+2HA-#*cЯуђјѓѕїїіљјєљѕѕјєєѕѕїњѕјѕїњїїгѕєѕјФЦжШ™O)%*:*$(1-,@G>1(oсаИуїѓјѕѕєєїєѕѕўљїїўљѕѕќїњљїїŽљїћљћФЧѕѓЭ?:I@1,&)$*3@<>:.-2‚жЯеїћѕѕљљїїјїњјљїјјњјѕїєјѕїїњљћљљћњ§§Эхяё‘<89@;2,* -5:3.(04oдѓшѓљєєѕєѓѕїїљїѕѕљјјїѕїйљјњјїїђѕ˜ТцЅM)!-;-5*2*87,851APŸыњѕёєєўѓѕѕћјѕѕїјјўљїїјњўјњњпїјњˆЗз~HL855+433-"!$B>1813L‰гљљѕїїќѕљљѕѕїўєѓѓўєїїњыћ§љјњњјїљћЅОЂQEO@&?711т(%+,+*4@8UЪзэѕѓєєяєѕѕѓѓђєѓєјѕѕїЫѕїѕїњњјњјћљњ§љїљћДЉmI?N<0;>:2.74.2)497#Iмцёѕєѕѕјјїѕѓѓєќѕїљѕѕїњѕїљїљїїмњљ§§ћћРЈG@?.(3CPJnНЧчјєѕїїќѕїїѓѓўєѕѕјѕїћўњјјањјњЉA0AS&$42-7BF@E94%8#FЌцшыђєѕїљїѕєѓјѕєїѕєєѕјѕѕ§їјћћћљњ§љїїсјњЕY^L@0+2,.4?B2<;2$!9B‚змыёэђєєўѕєєюѕјїјњњјјїїјњњјјћћјјћ§№M8>+42,5>9<:BE>93052,(EL—МУСьэѓїѓѓђѓњђёђѓѓєєўѕїїљЭїљјњјљљћљљћ§§PG579:23WДЧИгтьђєєѕѕєѕјѓђђєєќѓєѕїїњјбњљїљїљјњњјјљљј2"38?;,3FNE>5483??<–пгжёѓєєјѕѕєїѕѕєёѓєѕѓјјњјћјњјњїњњЦјњјјћњћ,>94-( $A>++2+B3G|йыёљєѕѕїѕєѕїєїєѓѓђєѓђїњћћњјњњїїњњњјњњјљћћујї!##+*(,%!3!4LQ8:VАхдешёѓѓєєъѓєёђёѓђѓђѕљјјљїјњїїѕїњњјоњјћћљљјј*%$!.J87;+))8+AEBюэЧзчђюєєѓєѓєяїєєїјјњїїљјј§њљ§§йљјљњ G45(5389B4WЮ§§јёєјђїїјѕѓђђяёєєўѕїїњіїљњјњњћ§ћјјћјд(*%.+>G@LSTЎћћєѓяђѓѕєѕѕјєђяђѓєєѕјѕјїїєѕѕїњјњћљћљљјјўљћћы!#++,+?@8ZZ{лћјѓєєўїєє§ђѓђђѓєєѕїїљјјљљњљјјзљњјњћћљћћљћљ§%(*+%%*)BBE;CВћ§љѕєёѕјєѓђєєўѓђђѓѓєїњњјјљљњњћћљљпјњњјјљ§љ§љљћ3-($13FJxэљїђѓєєјѓђѓёёђѓђђѓєєјїјњљјњљћћљљћљљћ§§њ§ћћэ%(78--(#1-09Pažћѕюђђєэѓђёёђѓѓђѓєєѕїїњћљљћћіјњјњјјћ§§њњћљћб*)" .++0&Iwсћћѓѓєѕјєєѓѓђѓђяѓєѕѕїїјјњњљјјњјљћћљјћљљћјјљ§§ьљњ *84 2*B545-bр§јђђѓћђєїєѓѓўїѕѕїьјњљїѕѕњјњјјћћљјњњљћјјњу04&%""%*,AG8CЌљ§ёёѓѓђёѓєѕѓђѓѓєћїјјћњњїѕљњїѕїїљїїљїїљњїјњћљ§§ъ,)#%$-#4HA1@Ж§ћѓєєѓѓхђѓѓёѓєїѕїїјћ§ћјћћљјљїјјћљљћћљућјїњћњјїј()"&#+12?<;+8MNћ§њєєњѓєєѕѕєє§їњљљєїјјњјѕєѕїњћ§§нћјљћљћїїѕјјљѕїљ &-,453M:Vю§јѓѓўєѕѕўљјјїКљїїјњјјљћјњћљљњјњњјјїјјїјњјј#22%%(#;4(§§ѕѓёѓєѓѓєєјљјјїљјњљћћјјћћѕњјїјњљћћњјњњојћ:%"(#224.1,8N;1{ї§ћєѓђѓђєјљїїњјјјњљћћњњјљљћФїјњїљјњњљћљћ%+#+#+:+."-*LQV;3!4QЩћїяёђѓёѕѕїїѕєјїїўњїїљѕєїїјјїїјїўњљљ§ћљјШсбЦЩыѕјщшшєўўщ’N-#-.@4#% 1(.%mлћјѓѓѕјљњћљћњњТћњљјјљЭЯаФгчэцуыюјўўРS370!$""$ )%3JB8oйњяђєѕїјњћњјљљОњљљјјљЭагдЮпшхыэяяљўѓƒ?:(! "$(*1?3%7—ымйёѕјјљљњљјјљњћћЪ§ћМЫзЭКШуђюэююёўћV>)%!987@B2!  ,8<90+3.YкўњїјљљјњљљЦјљљњњљјљј”—ИгунзйжжкрѓцЗ}<28HBB8,*-<* &?CCG>BPk59B9+4287,5;G@+9БўўїєєѕѕњєѕјјљњњљњЩДКСТЮгртпдТгѓт‚;87>9+;ЃЫщјћњјєђёээёєѕѕєє§ѕїјјањћћњћјИИОРРСОЪЫЮЩЧЂJ9IJ@?>CLNGEA>ACI<3—ў§љњњїїѕѓѓєїіѕїєѕјјљљјљљбКМККМФЩЭемлО„[CCE:9?FPQJIFACH:,HЕяФЭэѓєѓѕѕїєєїјјјљњњљјљѕїїјзЗКИНРЧЧЭбэтNNJLE:5;FJOEGBA;<9BWЇбБЪў§їїјјїѕјљјјљјјїїѕїїСјљљИИЛЛКЛУЦкщЛgE;8@CF?AEBCEJC:!)5‘ёђйЯчѕёђєѕєѕѕїўјїїјѕєєѕїїљњњљкСКРТЩЭпыаq@F212@C<8@@7<:84!04FТўњьёѓѓђђЙёђєѕїїјљјјїѕѓђѓєїјјљјјљбЧМТШбдЩ–L#238:5,2>FFA93.2$,>’ѕўјєїїјїѕєяюёђєѕїѕѕєњѓђєѕјїїоснудШдк‹C?;<8?F;.(.5AA8148>IiнўўјїїљјјїїѕєѓєѕѕњѓѕѓѓѕїїљњочтынЭгЫxE8F5>C?3)%%>GE937PH–јцѓєјјљљњњјјїѕѕѕєѕѕїљњћњ§ћ§§мћрхўўыЪ„W;551<90((4:GG>$*`‘жсёњѕјљљ§јїјјїјљќјїјљљбћљјјњњемэшУp87;M7558142,3*4H@;,#rзЯЛрљѕїјјїїѕїјјљјќљњјљљкјћњћњчыўўшNCJGC:;;40*((5:>?>$&-гбгљўјјљњ§јљњњњјѕїїјљљ§ћњћћ§ыћяћўў—I>BIE@:1+0#)-955ь-89pбѕчѕўїїјљїјљљјљјјњљјљћјњљњљљрјЮхўМZ8059A>A?91)**8:91-?TЅщјјєїїјћїјјљњњљњ§љњљљњнљОыяŠNU>80%)10.1:9;[глёјѕїїјїјјѕѕїїјўњљљњљљњњћ§§ћћлњхЯ|P@NCBCIA:;<:5.1,;A%Fпэјљїјјїїљјѕѕњїјјљљјјљњјљјљјљљмњћ§ћћњьС\OZWJCB>5;;>:82.7EUPoРЮшњїјљљўјѕѕїўљјјїјњљћњњљњњаљњљЫP>P\%98:C:?@;>??7*4-NАщяђћїјљјљјїјїјїѕјїїјїјјўљњњћќ§ћћљљєњљЭ^hWM;;<<;;ъ34.491(:E„жйшјєѕїјљјљїїђјїљњњљњњљљњљљњњў§њњѓ§ћ§ћV?M@<:?BAAэC;5+173#;>PŸЫЮгѕєјѕѕєѕѓўѕїїўјљљјљњћтњ§ћZJ@CE@>:>AA@50100F\Щлачёѓїїјљїјїѕѓєїїќјїјљљњјјљјљјњљњњћнњ>,ABF@88@FF;1.1-:9CЁєыщњњїљїјјљљњјјїќѕїјњњќљњћњњ§љћљљ§њљњњл§њ8B?<92A84--49:Lцѕљўїјљљјљјљјѕїѕѕ§ђѕљљўћњњљіњљњљњљњњћњњц7834335)&(21NJ:?\Рњьуёѓѕїїыјїєєѕѕїѕїјјњњјљњњљљјљљњољњћњћћњњ>*1,+?8:70#(-8M:GUUЌўўїѕїїјїѕєѓєѕїїјїјїљљјљјњљњћњћћњњчћњћњ%(&5;F2VZwнўњѕїїўѕїїѕєѕЩїјљћћњњјјљћ§§њњћљњљњњћћњћњћћ342("!$@C<)->EQC3+3$%??527@5zчў§єїјћњўћћ§§ћЧ§ћћљ§ЁЉЅ˜БЭйбдешњўўЭe>AC*)4+*.#".20.,28@IZUL|сўїђјїњњћћ§њ§њњ‰ћњћљћДЊЎДЎТЮблтщёћўј—SE,,+12-(2*5*-B>E:dчўћњљ§њњўћњњљ§њ§ћ§ћњњеbqАЭМЖВДМРЭчмЋ|LBBW]VEBHMEE.FHQM3EКўўњјјљїљїљїљјљњћћўћњњ§њћ‹Œ˜˜ЋЛЭйЯК—Лщм‰OMGVZ^b^\WQOHGBFGPnЁсруўўљѓєєѕїљјњљћјћњ§љћњћњўњ§œ–—ЋОРЖеУ—ЉЎОŽPLaINPOU`[UMQPLPMTPSQUWVWYMPG7GpxЪ§шЯдєјѕјјћљћљћјћљљВћљћљћњ§ћ§ћ§ћћ‘•ЈЄЂЋЦЃiAQqiOaHOFVTSQSYQH.7HЂњљсеђљїѕјїљїљљњјњљњјњїљѕљјћњћћўћў——м™ЈЮбКp?T;<8NGLHPPSEC?N2G?PбўўєєїїјѕѕьїѕљїњјћњћљњїїѕїјњљћњњЯћЇ”žЗЛЖ•P%:?BGFGGFSNF<>7O18Q§ўћјјћљњљљєѕєѕјљјљљјіѕјїљјљјњјњњƒЩббДЃВКGCCACOMJAE?LJGCGFINYtшўўљњљљњ§њћјљѕњјљїљѕњїњїњјњљњћ§§ћћўзгзРЊЗРwM;LB#MJOE><1JQPHCBaVЄўьјјћњћљћњњћўњљјљїљїљѕљїњњўћ§§ў§§мўЕмўњЯЗ„\J@B?MI?<>AF]AE@?9JCJB;EMSC80{хбОш§їћљћјњјњљћљћљњњ§њњљћљњњ§њњљњћ§ћ§жмўўуSL]WHHG@F8@;GBAGIF87<‹тен§ўљћњњњ§ћўњћњњЦћњћљњјћљ§њћ§§ћ§ћў§ўпѕўўЁSIOTOLFA;.@4>AABF7@Lƒнљщљўњјљљњљ§њњњћљњћћњњќћљћњњШ§њўћћњ§ћћЋдљОc>2GTTNSF?)4>F?H@@1J\Џьўћјјњјњљћљћљљњўћўљ§њњ§ћњћћоњўћћ˜кщ—WbSVLMLOUF@C:NCGCLB`Ёр§ўљњњэ§њћљћљњљћјњјћњ§њ§њћћљ§ўћўћўћћЩ§ЛйВjUdYSMSONC@5:93JG2Nщђј§јћљћљ§љљїљјћљ§љћљљњвћњ§њ§њ§њ§њ§§ўћ§гИ\TiiYOONMJGHG@?::Yh\vУаяћњљ§њњчљњјљњњљћљљјћљћљњћ§§ћћўћўћћпўћўИS@SiAEF9+G{Шсчєѕњїњјњјњјћјћљћњ§љћљћњћћ§ћ§ћўњ§њ§ћўћћжY<`]T\W[YWEJNFEOI>2BkУтюњјјљјњїљѕљјњјњїњјљљњјћњўњћћ§ўўћћС§ћ§E+7OO\YJPTJGCAFGHEN`ЇЧШЪєїјњїљїјјљїњїњїњјњјњљ§њ§њ§њ§љћњћ§§ћ§§аўgaTJUWMJHOOGCC??0:MkНеЪхёѕїњјћљњљљїњѕњјњјњљ§њњћћЯњ§љ§њњћћњћћ§§ўJBJ[VOEILMMG>AABILHЄђщлћњњљћљћљ§њћљљїњјњїњљ§њћћўњћћўњ§§вGQHMHJ$.O?A:CAGF[ьїўўњљ§њћљћњћјњїљљњїћњћћ§њћћњњ§њћњћћќњћћ§§сћў1:<<;H^jЋўћјјљљњјњјљјїїјїљљјјњљњњўћ§§§ћўћћѓўћўћў§ў§ўћўћ§§ы,;;-($,MFB>+Jюўўљјћљљњљѕјљїњљћњ§ћўћћїўћ§ћ§ћўћ§§ћ§уў§§ћў!27@-(+9IP@TЉўў§њјњјњјљљђјњїљјњјњљњћ§ћ§§їћ§њћћў§ўћћўўћћаўћћњ§њў:>>@%.2@LG87;nьўўњѕјѕљїљїњјњїљїљљњљћљ§њўњњ§ћњћћ§ћ§ћўњћћф*8+).2?CAMYJ\Кўўљјљїјјљјћјљљћїњј§ћћўўњњў§њњќ§њ§њњйћњўћ§§ў§ў8005.>;EAFC[NAJЩўўїњјљїљїљїњїњњўћ§§№ћ§ћ§ћ§њћћ§ћ§ћ§ћ§§зњўћ§њўњў.4*29@A?BFHILdbЁўўћњјњјњјћљњјћњћњњћЊњўњћљ§њ§§ў§§њ§ћ§ћўњ§ћћњ§њ§#("#3297>*ANP`Lpўўћљїљїјљћјљљћњўћћњ§њ§њўњўћ§ћўћ§ћ§њћћўћўњћњћћх)-%%3>8F147@9OE;ўў§їјїњљљјјњќћњњћћў§ћћњ§ћ§ћ§ћћўўћћљ§ћћњћњћћ§юA1&-.E:>EF?OOmO<ˆўўјјљѕљїњјњњћћњћћ§ћћб§ћ§ћ§ћ§ћўћ§њўћћ§§ћ§343,0,.,9-HWSUT1Vеўўљљїјљњљћћ§њ§ћћњ§ўњћћі§ћў§ў§ў§§ћћ§ћф.,:>>9&2VcoiPVN@^Оўўљљїљјњљњњќ§њ§њњљ§њћћўћ§§ћћ§ћ§њћћшQ+9CMOFZn’un`^H19‚ўўћљјљљњћјњ§ћ§њћћ§§ћї§ћћљћњћњ§§ўа§OGAQNHN4IHbguYL5Gjпўўљјјї§љњњ§њћљ§њ§њ§њњљ§њћњ§ћћќ§њ§ћћќ§њў§§ў'џўw(џў€*џўw+џў€+џўˆ*џў€)џўˆ'џўˆ'џ&џўˆ%џўˆ$џўˆ$џ$џ#џўˆ"џўˆ"џўw#џ#џ#џ"џўˆ!џў€џўˆџўˆџўˆ џ"џ"џ"џўˆ!џўˆ"џў€#џ%џўˆ$џ&џўˆ%џўˆ&џ(џ(џ(џ(џўˆ'џўˆ)џўˆ*џ,џўˆ+џ-џўˆ,џўˆ-џ/џўˆ.џ0 џўˆ/ џўw/џў€.џ/џўw-џ.џўw,џ-џ-џ-џўˆ,џ.џ.ј§љћјјќњљћљљѓјњћљјљћћјљ§љјјєљћћљњћћљћљјљљћ§ўљ§ћњїјњїїѕјњњїљћјљљєјјїњјћјѕљїљњњјљћљњњћ§ўўњњ§§љћљљўћњњјтћјњљћљњјњїјїїѕјїћ§њ§§њћїљћћјїјјпњїјєћ§њљњјїїјњѕїјњљћћљћћљљјјћћ§њ§§ќћјњјјђњћћњњ§ћћљљћ§њћћьјћљјїјњјњј§ўћљљјјљњ§§чћљјљћјћјїњљљ§ћ§ћњњјїјїјїјјэћјњњћ§њћљј§њћљњћћњљљњќєњјњњћѓљњћћ§ћћњњјјњћћёјњњјјњјљњњїњјљћћќљћћїїљњїљљїљјјћљћћљћћшњјњјњїљїїјћљљњјјњњјјљћљ§§їјћћљљћ§§єњћћјњјљљјјћљљњўјїї§њјњњћљш§њ§ѕїїљљћћљљћћњјњњјњњјљћћљў§ћћћјњљјћћљћљљ§њ§їїјјѕњјљљњјїњјњїїіљїїњјћ§§љ§§ўњ§§њћљљјњћћёјѕљњћљљћћљћћ§ћљљњћљћћјљљћўјћћѓљћћљћљ§§ћћјћњњљўњљљјўљћћ§ќћљјћћљїћљћћјјїѕїїэњїїљњњћјћћјћљћјћћјїїњљѕѓјњјјыћјјћљјјњљћљњњїњїњњїїјјїњљїљїјјїјјљћўљћћўњјјћќљњјћћёљ§њњ§њљјљѓїїјњљљћўјћћїљљїїјјњјјњљїїљњћћ№§њўњ§§њљїїјћћ§§љљѓћљљћљљћјћљјјћћщ§ћћљјјњјћћљњљњљљћњљїјѕїїњѕїїјњћћј§њћћјњјћћњјўљћћљљћћљћљ§§ўхњїїјљћћњљїїјљљћћљјћћ§њ§љћћњњєљћљћ§њ§љљјљ§§яљћњћћљ§§ћљћћљљћјћћ§§ћљљїћ§љћћ§љљјј§њљћћўљћћљєћљјћћљљј§§ў§§ћќљњјћћ§љћљљќћљћјјѓњјњїљѕїљљњјѕїїјћњј§њ§љћјјљљћѓјћљћћ§§њћњ§њ§§љћњѕєєѕћћ§љјїїјїјћћљћ§њћћјљћїјјїјљљћєљњћњљћћёєјљ§§љјћљ§њ§ўўњ§љљ§њ§§љћљѕћљћљњїњјљїљљєїјјћ§ћњњ§њћљљћјљ§ыњћћљљњћћљљ§ћћ§§ћћљјљћћђ§љћјїљњћљњњјјљљќћљљћћыјњ§њћљљњ§љўћ§њ§њ§љњњ§§ћмјѕѓѕїїћ§ћћ§ћљњјћњ§§љљњћўњ§њњ§§јћ§њ§ўўѓњ§љјћњјњљїљјњњцћљћљ§њћњїїњјљљњўў§њћћљњ§§ўў§дћљ§њ§њњљћњљ§§ћљјїѓљїѕїјњњћљћљїјњљљћљљњњў§њњћћ§љћ§§ўоѕїїјјљћњњјћљњїљјњјљљћјћ§§њ§ўњњљ§њ§§њ§јўњћћћљјњћљљќјћћ§§ћј§њћњњљљћћјќљњњўўњ§ћћљћњњ§ћ§јћ§§ћ§ћќ§њњљљёћљњћћ§ўћћў§§ћљћћўјћћ§єћљљћћљјљћљћ§§іљћћљљћћљљћћњуљћћјїћћљњјљћљјњљ§њ§њњ§љљћљћњ§§жћљ§ўў§њћјїїјѕїњјњњћљїћњјћњ§§њљћћ§њњ§њ§§њ§њњћ§ћљћ§§ћњљћ§њјљљѓ§њ§§љ§њ§§љћјћћјљўјћћяј§њ§§њњ§§њњ§ћћ§њћћњљјћ§§ћћ§ќћјћљљћ§§ћљљћјњўћ§§ўњћћюљћљћљљћљљ§ћљћљћљјћћёљћћљћј§§њ§§љњњ§§ћћјћћ§§јўћўўњ§§љљћўјњњијљћњ§ћљћћјљњћћљњњ§њ§љљћћ§§њ§§ў§њ§ћћ§љ§њ§§ћљю§њ§§ћїјћ§љћћљњ§њњ§§ћњ§ўњ§§юљћїјћћљћћњњљљћћљљћћћљћ§љ§§јњљ§§њ§§ўўўћўўљћјљјћјњњюјњћјњјјњњћњњћ§§њљњњ§іњљљћљ§ћћ§ўўљїјљљјњјјћњјїїјјўњћћљ§ћњїјћљћ§§њћљљ§їњјјћљјїњљљј§§єћљњњјјљљ§ћњјјњћљћјљ§§ўњћћњљјњљћ§§љ§ў§№љњњћјњњљљћ§§њ§§њњўўћ§§љўћњў§§јјѓњћјћћљњјїїѕјњњљњѕљ§њћ§§њњ§ћўўќћўў§§љњ§ћјћћљљљћљћћљћјјјњјјљћљљћћљ§њ§§љј§§їњљ§ў§§љњ§§ўјћћ§цљњљљћћљљњњ§§љјљћћљћћљћ§ћћўў§ўц§ћјњїїњјјћљ§§ћћ§§њћћ§љћўў§§іњ§§њ§§ћўўћћўј§њћјјћљћћяљћљћљћћїњњћљ§љљјћћђњ§љњћњ§љљћћљљћћјцћјњћћњњљ§ћљљћ§њљћњјљћњљћћјјњјчїћћљјљљћљјћћ§§њјљљћљ§ѕљїјјћь§ћћ§њ§ћњњ§љїљћљљњљњ§§ўњ§§њњ§њ§§ћћљћњљјћ§§ѓћљћљћћљљњїјјњњўћ§§ўњњћћ§љјјњїщѕїѕѕїњјјћїњјњјћњћ§љјјћљљ§њјњњћјњћљ§§њњ§њ§§јћћіљћјїїњћљљћћ§јњћћъљћљћњћћљјћјјљјњњѓєѕјљћћљщјљїїјљљњњјјћћјїљјћљљћљ§§ћћљњ§ћ§§јћќ§љљћћјјїљјїљј§§љљјїїњјїїћјїљјїїјієїїљљњњљљћћыјїљїњїїјјїљћљњїљїјњјњњђћјјљїјјљћћјјїјјњћ§§њ§љљћљяњћјїїјњњјјњћљљћ§ћћ§§њ§§њ§§љ§§ўљћћ№љјћћљћ§њњљјїјљљњњяљ§§ћљћћљљњ§ћњјљћјјўљ§§§њ§ћћђњ§ў§њњ§јјљћћїћћјћњїљљњњјћњљљ§ћћјљјњјїљљ§§ёњћљњ§њїјїїј§§ћњњњјћћљћ§§оћљћ§§ћљјїњњїњћљћљњњјїњјњљњ§ћљћћњљћћјњ§њњ§§љћћ§яћљћћљћљљњњ§§љњљїјјћёјїїјїїјјћјјїїјљљњјњјљїљљќјћљћћњѓћљњљљјїјјњћњ§њћў§њњћѓњљћћњћћњ§ћ§ћњњћјњћ§њњћњћћєњ§ћ§ўўћћљћњљљјњљљћћњњћћњцљ§њњљјљјљњљћњћљљњ§ў§ў§§ћ§ћћўњљљњэ§њњљћњћљњљћњљљњњћњ§§ќћ§њћћ§њћњњќљњњћћё§ћљњљљњљњљњљћњћћќњћћњњ§ќћ§ћњњљћ§§ћћњћћќ§њћњњњћњћњљњњ§ўђћњ§ў§ћ§ћ§њћ§ћњњёћљћћ§ў§њњљњљњћњњљёњ§§ћћ§ћ§њћљћњ§ћћсњљњћљњљљњљњњћљњњ§њћљљњњљћњћњљљњњћљљњњљњћњњѓћњћљљћљљјјљјњњчћњњћћњћљњљњљћјљљњњћћљњњљњњћќ§ћ§љљњћѓњ§ћ§§ћњњљњћћњњћљљњљљћљњљљњћ§§јљћћўњћћњњћљњљњњіљњћћњћњћњћћљњћњњљћњњћњўћ§§љњњљњћћљњњљўјљљњќ§ћўћћ§§ћ§ћћы§љњћњћњњћљњћћњћћњњ§њћћњњћњћњћћўњћћўњћћѕњћњћћ§њћ§њ§§ћўљћћњћщњћњ§ћ§њћ§ћњњћћњћњћњњљњљљюњљјњљћ§ћњ§њћћњћњњљљњјљњњљњњўћњњѕћњњљћњћљљћњњљњќ§њњљљњјљњњљњњћјњћњћњћљњњћѕљњћњћњћњћћ§§ѕћ§ћ§јњљљњљћћњѕћњћљјљћњњљњњщјљљјљњћњ§§ў§§ћ§јљљњћњ§ћћўњћћњўћњњћћњћњћћьњћњњљњњћћљћ§ћћњ§јљњљљіњљћњћћ§њћ§§њяћњњљњњћњћњћћњњћњћћўљёњћњћљјљљњћћњњћњњ§ћўњљљћћњћњ§§ћъњћћ§ћћњљћњћћ§њћњњћћњ§њњћћњ§њћћїњ§ћћњ§ћћњњњљћњћњћћќњћњћћњћ§ёћўћ§ћ§њћћњњћњњћћ§њћњњєљњљљјњљјјњњљљљћњ§њћњ§§ћњћ§њћњњјћњњћ§§ћ§§ђћ§њљјїїјћњћћњљљњўћњњћќ§њћњњћњ§ћњћћњъћ§ћљћњћјјњћ§ћ§ћ§ћћњњћ§§ўў§ћћ№§ћ§ћ§ћћњњћћњћњћљљќњјљјјєљњ§ћћўў§ћ§њћћ§њћњњћћ§ћ§њћћр§њњћћ§њћћ§њњћњћћњћ§ћћњљјљњћљљњњћћўњћћњ§цћ§њћћ§ћў§ўћ§ћ§ћў§§ћ§ћ§ћњњјј§љњћћюњ§њћљњњ§ћ§ћћ§ў§§ћ§§ќћ§њ§§ќў§§ћћјљњљјљјњљљћ§ўћљљяњ§ћћ§ўўћ§њћћ§ћ§§ўўћкњўћ§ћ§§ћћљћћ§њћњљњјљњљњљњњћњћњњљћћњћћ§§њоћњ§ћ§§ў§ўјљљњњћћљњњћћљљјњљњћћњњћћ§§љўћ§ћ§ћ§§яћ§ћ§ћ§њњљњћњћћњљћћњы§ћ§њћћ§њ§§ћћњњћћ§ћ§§ўў§§ўћћ§№ћ§њћњ§њ§ћ§ћ§ћњњ§§јћ§њњћ§§ћћјњћљњњ§§ўў§ћ§ћћрњћњњћћњћњњћ§ћ§њћћњњћћўњћњ§ћ§ћћњћћњћщњћњћљњћњћњћњћћљњћњћћљћ§§ћ§§ћ§ћћр§ўўћ§њњљљїјљљњљњњћњњљњњ§ћћ§ћњњћ§§ќћ§ћ§§їњћњ§ћ§ћ§ћћљњћњ§љњћћ§ѓћўћ§ћ§ћњњћњћњњћї§њћњ§ћ§ћ§§ћ§ћщњ§§ћњњћћ§њ§ћћњћћ§ћ§њ§њћћќњ§њћћ§иўћ§ћ§ћ§ћ§њћњћњћњћћњћћ§њћњћњћњћњњћћњћњ§ћ§§љћў§§ћ§ћћїњ§ћ§§ў§ў§§ћњљъњљњћћ§§њћњћ§ћ§њњћ§§ћ§ћћњњћћ§ћ§§њ§§ћ§§њћ§ћњњћћ§ћњњ§ћњњћ§§ќћ§ћ§§іћ§ћ§ћ§ћћљњњїћњћљњћћњћћњћўўћћѓ§ћ§ћ§ћ§ћ§§ў§ўўѕ§ў§ўћњћ§њњљљњњљњњљњњіљњ§§њ§ћ§ћ§§ќћ§§ћћћ§њћћўўѕ§ў§ўљњћћњљњњћљњњћњњњљњћњњћћ§њљњћњњ§ћ§§ћћќјљљњњўћњњћ§§ћ§ћћљњћќ§њљњњыћњ§ћ§ћ§ћ§њћњћњљћњ§ћ§ћћё§ћ§ўўћ§ћ§§ћњљљћћ§ўћ§§ўі§ћ§ўў§ўћ§њњїљњ§њњћљњљљўњљљћїњљћћ§њ§ћ§§ўў§ўў§њћ§ћ§ћ§§њ§ћњћћќњћњћћњњљњњћњћћењћћ§ћ§ћ§ћ§ћ§ћ§ћ§§ўћўћ§ў§§ћ§ћћњћћ§ћћљћћњњћћ§§ћлњћњњћћњћњ§ўў§ў§§ћ§ћў§§ћњљњћљњњћћ§ћњњ§§ќњћћўў§њћ§ћ§ћ§§ћћ§ћ§ўўћ§ўћ§њњжћњћњћњћњћњњћњљћћ§ћћ§ћњћњ§ћћљћ§§ћћњњћћњћњ§њњ§јњћљњћ§њћћє§ћћљњћњљћњћњњљњ§ћњћћњћќ§љњћћњјэєјљњњћўњ§§ўњ§§ћкњћћ§ћ§§ћ§ћ§ћ§ћ§ћ§ћ§ћњћњћћњјњњ§ћ§њћњћњћћћљћњњљљћ№§ћ§ћ§§ў§ћњ§ћ§њњљљяњљјјљљњњћњљњљњћљћћњћ§љњљљљњљћћ§ћ§§єћ§ћ§§њћњћњњљљћрњћњ§љћњћћњћћ§њњћњћњњћњљњњјљњћћњћћљњњћћљљњњљћњћјњњћћй§ћ§ћћњћћ§ћўћ§ћ§ћ§§ћњ§ћћњћњњљјњљјњ§ћ§ћњљљўњљљњ§ћњљљњћёњћћ§§ћћњњћњњљјљљњўљћћьњљјљњљњљњљћњњјљњњћћњњўћњњћ§ћёњћћ§ћњљљњљљњњљћћ§њ§њњљћ§§ћ§ћ§§ѕў§ћ§ћћњћњћњњ§ћњ§§чћњћњћћњљљћ§ћњћћњћћ§ћњљ§ћњњћј§ћ§ћ§ћћњњћ§ћўћ§§њћћњћћњњћљћјјљљњўљћћыњћњћћњљњњћћ§ћ§ћ§њў§§њњљћћ§ћћљљњћў§ћћм§њћњљљњћљњћњћљњњћљњљћ§§ћћњњљћњњћњ§ћ§§ћчњћњћњћћ§њћњћћњћћ§§ћ§ћљјљњњћљћњћњњћћ§њћ§ћћњњљњћњћћќ§њћњњ§ўі§ћћњљњњљћ§§яћўћўћ§ћ§ћўњ§ћ§ћўћћћўћ§ћ§§ѕћўћўћ§ћ§ћў§§іў§ўћћ§§ў§ўўћњ§њ§ћўћћњ§ћ§ћўћћ§ѕћ§њ§њћњћ§§ћћ§ўі§ў§§ћ§ћ§§ћћѕњћњћ§§њћћ§ћћйўњ§њћћ§§ў§ўў§ћ§ћћўњћћўћўћўћў§§ћўњ§ћћњ§ћћћ§ћ§ћ§§ћ§їў§ў§ў§ўњћћэњ§ћў§ўћ§ћ§ћў§§ћ§ћ§ћћќњў§ўўќћў§ўў§§ў§§њћ§ћ§ўћћ§јў§§њћћ§ћћўўћћђ§ћўћ§§ўћўћў§§ћћ§§ў§§јћ§§њћњўћћјўњћ§§ћћ§§ћљњћћ§ћўћћїњў§ћњўћў§§јћ§ћњ§ћћњњњћњўћћ§§ћћ§ћўћћћ§њњћ§§ђћўћћњћћ§ћ§§ў§њњќўћћ§§њў§ўћ§ћћ§єўћ§§ўћўћўњ§ћћ§нў§љ§ћў§§ћ§ћ§ћўћћњћњћћ§ћ§ћ§ћў§§ў§ћ§ћћ§§ћў§§тў§њ§ћћњћћ§§ћћўњћћ§њ§њ§њћњ§§ў§ўўь§ў§ў§ўћ§ћ§ћ§ћ§ћўњћћ§§ўћ§§ћћ§ћћ§§јћўћ§ћ§ћ§§сћў§§ћ§§ў§ў§§ћћ§ћўћ§ћ§ћ§§ў§§ћ§ћ§§ћћ§ћ§ћћњр§ћўњ§њћћ§ћ§ћ§§ћўћ§ћ§њ§њ§њ§њћћўњћћ§ўўћћў§ћћљњўњћњ§ћћїў§ўћњ§ћћњњћћњћўћ§§ўћ§§§ћ§ћћћњ§ћ§ћћї§ћ§ћ§ћ§§ўў§чњ§њ§ћўћ§ћ§ћ§ћ§§ћ§§ћ§ћ§њњћћўўћћіњ§њњћ§ћ§§ўўУ§ў§њ§њўћ§§ў§ў§ўћ§ћ§ћ§ћ§§ћћ§ћ§ћ§ћўћ§ћўћћњ§ћ§ћў§ў§§ўњњћ§њ§њ§љ§ћћљ§ћўў§ћ§§єћ§њћњћ§§ћ§ћ§§ўћўўѓћњњћ§§ћћњ§њћ§§ўћ§§№ў§§ћўћўћўћ§ћ§§ў§§ћѕў§ў§§ћћўћў§§§ўћ§§ўћ§§ўћ§§ўћ§§фўћўћў§§ћ§ћ§ћўћ§ћћ§ћ§ћ§ћ§ћ§§ўўі§ў§§ћ§њўћ§§ўћ§§ўћ§§ѕћўћўћћњ§њ§њњќ§њ§ћћЫ§ћ§§ў§ў§§ћўћ§ћ§ћ§ћўњ§ћ§§ў§ўћў§ў§ў§§ћћјњљћ§ћ§ћ§њ§ћўћўћћ§ёћў§§ћў§§ћў§ўћўћћ§§ћўћћѓ§ћјћћ§§ў§ў§ўћћ§§ў§ўў§њў§ў§ў§§їћ§§ћњћћ§њњћ§њ§ћўўї§ў§§ћ§ћ§ћћ§јў§§ћ§§ў§§§ћў§§№ћ§ћ§ћ§§ћћњ§ћ§ћўћћћ§ћ§ћ§§ўћ§§ўў§§§ў§ўўќ§ў§ўўя§ў§ў§ћ§њћјћњўћўћ§§ћ§ћў§§ћўўљ§ў§ў§ў§§§ў§ўў§§ўћћњ§њ§ћўћћѕ§ћ§§ўћћњ§њ§§ў§њћ§§ў§ўўј§ўў§ў§ўћћјў§§ћћњ§њњћ§ћћњ§§ёўћў§ў§ў§ў§ў§ўў§§§ў§ўўэљ§њћћ§ћћњћћ§ћњњўћў§§ћњў§ў§ў§§ўў§ўўы§ў§ў§ў§ў§њћћ§ћ§ћ§њўћ§§ўћ§§њў§§ћў§§јўћў§§ћў§§ўћѕўћў§ў§ў§§ћ§§њў§ў§ў§§ўў§§ќў§ў§§§ћў§§ўъ§ћ§ћ§ћ§§ўћ§ћ§§ў§ў§§ћў§§ўў§§їў§ўћ§ћ§ћ§§іћ§ћ§ћћњ§§ћћс§ћ§ћўћ§ћўћ§§ў§ў§ўћ§ћ§ћў§ў§ўћў§ўўь§ћњњћљ§ћћўњ§§ў§ўћ§§ўў§ўѕ§ў§ў§ў§ў§ў§§ћў§ў§ўўњћ§ћў§ћћ§љў§ў§ў§ўў§ыўћ§ћўћў§§ћ§ћ§§ў§ў§ў§ўўє§ўћ§§ўћ§§ћў§§јўћўћў§ў§§њћ§ћ§ћ§§ўћ§§ўі§ў§ў§ў§§ћ§§ћўћ§ћ§§јћ§ћ§§ћћ§§шћ§ћ§§ў§ў§ў§ў§ў§ўћўћ§§ў§ўў§ќћ§§ћћљњћњ§ћў§§ћћ§ћў§§юў§ў§ў§§ћ§ўў§ў§ў§ў§§эў§ў§ў§§ћ§ћ§§ў§ўћўћ§§ќћў§ўўс§ў§ў§ў§ў§ў§ў§ўћњў§ўћ§ћћњ§ћ§ћ§ћ§§ўћўўі§ўў§§ў§ў§ў ўњћўћ§§ћћў§ћћїњў§ўў§§ў§§їў§ў§ўћ§ћ§§ўћўўјњўћ§њўњћћќўћўћћ§§ћ§§ўў§§ъћўњ§ћў§ў§§ћ§§ў§ўћ§§њ§ћћћ§ћўњ§§ѕў§ўћ§ћћњћћ§§ћ§§ћ§§јў§ў§§ћ§ћћ§ўў§§§ў§ўў§ўўћћѕ§ћў§ў§ў§ў§ўўќ§ў§ўўњ§ћўћћ§§їћўћ§њ§ћўћћњ§њћћў§§ћў§ў§ўўѓ§ў§ў§ў§ў§§ћћ§§ћћ§ћ§ћћцњћћў§§ћ§ћ§ћў§ў§§ћў§ў§ў§ў§ўў§ђў§ў§ўћ§ћў§ўћћ§§њў§ўћћ§§ўћ§§ўќ§ў§ўўњ§ћўћўћћњўћ§§ў§§њў§ћў§ўўђ§ў§ў§ў§ў§ў§ў§ўў§§ўњ§§ўћ§§јћ§§ћњћћ§§љћ§ћ§§ўћћўў§§ўў§§њћ§§ћћ§§ћўњ§§љћ§ћў§§ћћ§ќў§§ћћўўћћќў§§ћћэ§ћ§ћўћў§ћў§§ћњєљњ§ћћј§ћўћ§§ў§§ћў§§ћ§§зўћў§ў§ў§ў§ў§ў§ў§ћ§ћ§ћ§њњћ§§ў§§ћ§ћ§ћ§§ћћўћћїўћў§ў§ў§ўўўћ§§ўўћћѓњ§њ§љћњўњћћўћћєўћўћ§ћ§§ћћўћћ§јў§ў§ў§ў§§ўћ§§њћњњўћ§§§ћ§ћћ§§ћ§§ћћў§ўћћшўћ§ћћњ§ћ§ћ§ћ§ћ§§ў§њ§њ§§ћћў§ћћяњћ§ћ§ћ§§ў§ўћ§ћ§§ўўј§ў§ў§§ћ§§цћ§њњ§ћњњћ§ў§§ћ§њћћ§њ§ћў§ўњњј§њћћўћў§§ўў§§ьћ§ћ§њ§ћњ§њћњ§ћ§њ§њ§ћћўњћћј§њўћ§ћ§ћћјўћўћў§ў§§ѕћ§ћ§§ћћњ§њћћ§ўы§ў§ў§ў§ў§ў§ў§ў§§ћ§§ћ§§юў§§ўћў§§њўћ§§ў§§ћ§§эў§ћћ§§ўћўћў§ў§ў§ўћ§§ўі§ў§ћўћ§ћћ§§ўўћћ§§њћћўўћћђў§ўћ§ћ§ћ§ћўћў§§яў§ў§§ўў§њўћ§њў§ўћћ§ўћ§§їћў§ўћўћў§§ѓўњћњћћ§ћ§§ћњћћњўћў§ћ§§цћў§§ћ§§ў§ў§ў§§ћ§ћ§ћў§§ћ§ћ§§иў§ў§§ћ§њўћўћў§ћ§ћўћўћўћў§ўћ§§ў§ўћћ§ў§§ћ§§ў§јўњўћўћў§ Р€j§љјŠuiF7ABEAB8@EC[dI`ЩюхцхььсмкнпнЯЎВЩЮЯаЪШйпмлрхчсмдаджннеОЉЂЏ§§ЏLGU72?7;<@B579;E2;‚юєуушюэчтмсцпЯРУУЩСТЮерпстрпрчккжЯгЯШЩЛЈЇЄћяi57@NLbB4599+4;>L@`ЮїяжксьэцжЭлзгЪШдЭгНазккйзмгЮдмзераТОНОРЌЃљЃkI8YUPGI?;12*.,?P\ŠєїьцхппнйЮТШЫФЛОНЩзжгнтлкцуйЪЩаЮйЧРЖЊЇЊМА›•љŒeNJNHA@4.79>07!3tмјычшурпеЩЫРЛЩФЭЧОглцтуттншцжжкжпзЖДБЖИЖЉЃž—јƒ]?AG<#1$--.4..077uєјюхцзЮЭаЪШФЗМЯезЯсьщыы€0щэшэычхпнйОАЏЗЦРВЋЊЏћƒY?7N„цћљьсзЮУнчцуйпюєёюшщчткмдТЏАЗИБЁЈВЕЉЃЅЏИŸ–’љ•]MB?<541;4;?<@3-@TСљ§юсррзмлсксьёѕёьуцуурргФДЉЏЗББЇЈžˆ‰‘ЋЗЇЂ§Л`]jP43@8<94,,FW3:OЦћћэунуй鈄хчяїћїђьхлзпхмдЫРЗЏЎЃЅЄЂЇ•’ЇЇАВЎЂћА]8^PE<87@AA@5#2UJWЋљљыёящупухяёїјїяэнййчрУРЫЦВЋМЗДЅЂ˜Ž–‚ВТУЛБ§їŸL:ECBACB??F;;2qC4Ђїїыђђытшяђёѕѓѓ€њђяхззаЫСМеЧЅЇЉЇ—ŸžžЈЁ’‡ЕЗКЌРљјЃB@FHFFAG?GHHQHF23ЋљјщхркзещюѕѕђєючьтнЧОУТШǘŽ—ˆ‡‡–ЇЈЉЇ‰ŸААЏУ§ћЁMEEG<>BF<03+,95@ЁїјстцуееыєјєѕящрпйкШРУОЕЁŽ‹„ƒƒœЌДЌŸЉЖЏЎВУк§§БS5OB<51;.7:.&+::JЌјїурнлныєїѕєѓхдЩжмжЦЖДИЈ—Зˆ‰Љ›БДЕИИКНОИЌСг§јВE>>A5(*!*-+-72?SCєрзмЯЫльєє€чячнгмкйМЄЃЇБЈЄž}ЏЖЉЏЉКЪаРЖКЪЩЫ§§ШE4FA@8;:12,7>57HJžяпдЭКцїѓјћјїяхлЭгдегЃ›ЅЌŸЅБЅЅЛлзлЭЗНССОМЩЭб§љ•CPcMBC@:1,4?EA73IЉыргЩЁыѕѓјљїюцынЭМССЦŸ–™™ЇЛМЈЂЏСЪСЛЕЕИМОЫкнпћпT.;B9@?C<79A79;5E]гїёжФрююєѕѕѓхрдТИЈВЌКЖЁЃЊМШЛЎЉМЪгЦБЌЏЊШйцпаФ§љzWZB9-4;ACA>80;@@MЏєшЦЫкцьѓєєыьдЛЖЖКЂ—ЅЋЌЌЏЎЇЊЊЗЪплЭЦЩЫгдрцщке§јJL[>3@<(0:5,;1>5?эьеепщяяэчурДЎЃЌЎ˜’•ЃЕФФЋžЂЅДЧжЯТЧТЭгхьэшхпћ§‰MOIA583831(#(&3*)ЂшїрекуьчнзУМЗЎЃЇЄ›”™ŸВНШНЊЈЏЖСФАЉЈЕацэщркЯЫћї}ECI?BB7$*0)#%1#-•ыђпмапсрмжФЗВЌКСИЉЉЄДМУКМЄЌЖУРРВБИЦнснйжйЭЧ§ћ‘O~vJCC€—?3.3).03эљышсьэрлЩИЕДДЧСВЇЎЛНЛММЕАЗЖНЦТУЪЫсыштйжжЯИ§љo;JBHWLF<:28)*3L!tєјнждпкЫКДВЎДНЫЧЛЉЗНЧНЧШЕБЖКССНМасхпйаЧЦЭБЋ§єoBGMPN`%+.2.##.5ˆїёэнмнзМЊАБЏЏКЧЯОЎЎИЭЮШТОУЯШШЪЩЮпытккШТЗРВœ§ћmMB:HA5)((4*1"#gйёэлеЫЩИНУОЕЎЧмжТЕЎМЭдЮЩФНЩбдеЧЯучлзЮЩМЏНРБ§ћ‹FHQL>48BGGc+78"*]ЫрдТУШУОЛНЖЎВОЪйЯМЖФШЛВЇДЕЖУШЭпхщттжУДЌЄЅЄŠ§§ЈL:CEGGF;;-$*-,LжјмНВЈАМУФДЏИОажЫЭсхнЫМЛСВКЛОзцщлсйЮОИЇЈЊНк§ћ71FPGBFFAG+ (07+!3~ееРОКАЏКСЭМКТЩЧгшьшйкРЎБВБСаущшмеЫСЌЖШРАСŸўћРTM\}Z18?0:.#09(23ZЫябШЭУТЗОЩФЪЦФбмщшмЪШддОСЖЩмхцнлЪРВ–žЈУЖk,ћ§ѓzZomJ-729470849@U@AЋїїкРЛМТЯаЦШЫзщшщнйЫЪгЭЭЩзтхрлззЛ’}„ЃМŒE,"ѕћљ‡I[dA,-42,8*3*2,2IФїшнсегцыырыюьшшчпбгдЭСТддЮЮБ›МЩА„‡Б‰;;>*њ§§лM@SHUE>;954>9829NHB•їїэцзЩЮегтьэщцьчпдРЫбкгададНЅЄбЯtE.<+љ§§љW*1YhN1CLG11:8,&$Pjcc`VGA>::980;NA&NаљюмлныёяђяшшыынЮФФЮрлЫУСМКАŸРЂS$: #їѕ§ћN2AI524(51.0*0%>N45?nљћљєѕђѓьєьспрршшкзееЦУКОЏВЅrod-#%# ћћ§§ѕpBCVJF><4>CB7),*(4:dШљ§ђѕѕяя€_црчыййщьхжЯЂЏЉЃ™žˆM<4$;7 њјї§§ИZ?:FG<@A1+:?>?;B2#7’ш§§ѕѕяђьцющйШТЫешйОЏЊžЃˆmW@)!*-ћћљєљћ•9JQI93T…Ђз§љѕюьытэщнаШЩУЫР”ЕL<<#!((ћљјѕ§§жE?GGJGF5".41240.!@kх§єэьщьэцндЮбЪШЌБЗЈˆI;9 љљћћў§§˜cBCTOWMF@>@1,<;4,0BB8jМљљёэчщнеЩЦНЫА‘‡‹b14#*$&! $ћјјњї§ћшŒiZSFH>0+:;5-E3*$,(8-BiЦјюсмбЭЮЭЮЛЫЛqA1!"   $љћћ€Нјѕ§§йc3C7<.@7:1>FF132+*198…ыєщдЪУЭУТЗДv-+G? #ћћ§ћјїѕ§љЉF@8?;@99>;B>;,1+,->0,MУюхбВЃЋЌ–kc* $ ! љљњјјљђѕћљnFF9HSOCCA9.#&(*279:&-—щсЭОЪЖF++)!#. &њњѓјїѕљјћ§чL)13GG€Б:><99&%$+2.")+FŸШКЌeMN?G%%!"",  јћћљљѕљњў§§С`S9EB-0-,42+10&&)$9.+oЭT03d…]0  %)?3њ§ћљћњњїїљ§§ЅA)IBL,+)&-0.%#"B,  !  )$ћњљјјєљћјњљ§§нI3$501(+.+$*&  (   %)-ћћ§њљњњјјњњћ§§™:79+]\Z3%5$!$,1(%3 8*!* "++њћњњљњљћћФїњ§јЎQAJIEHG]?"<8A$&.#"*2&&  && њљјјєѕљљћїѕїћ§§ЬЈ*3@8;O`-!-(0!  "   )%39$SњљљњњїЩѕєѕѕћљЩ2-;OVdY()E 3&   19PƒТўўм§њљљјїѕјјљћћ‚@LY\NYP8J53, ч"  5(9NB>OЂпућћ§љљћХњѕњњјѕ§ће.)H`~a?$20.$$&$&    !Li™шѓјш§ћ§ћћљњјњјјїѕѕЪ§јBNZCIG! #!! 5#%!*0!NМђљєсшрњ§њ§њ§§њњ§§ћћїїЯў§чa3FC874 !"OC+%?HQoƒкщулЫадмћћњћќ§ћљјјљЮњћ§§ЋaIVG34 @  .* !9E‹‰@YЈМђјцмлйнс§§њљњјњљћћљћа§ўљ›@A>;O9 "&   415"(zтУP1mЖзѕэзЩЧкнрљљњћјњњљћћЭљћћњѕјјў§єj.IOQQ4-$   ":LUƒEGОцюєкгакссћ§ўћјјљЪјњјјљїјјљ§§еT58CY9JI, )JL<4CEN]B@ЎЪЩжжЮмёшшуўЄ|mJ#B@GJG;<>EIP^B`мўћїљјјљјїѕїєьыыэёёюёѓђѓѕїїѕѕјјѕѕђђѓђђяыччўўДQLP81EB>@A>@>APOdI<338<9;7FA`бўўєђѕѕМєѓѕѓєёяюьёшюьѓѕѕїјѕѕѓёёѓѕђђёюэюььтмњЊrJ:W[NOPH78345;?S\ўўњїєѕєѕєёђёёјяыэёёєјїїУјѕєђђѓѓїђѓюьщщэшчтмўoSCUPFC3;5:57.#:uуўўѕѕѓєєѕїёёђэєюэёёїјњњљїјѓђєѓёєщчьюяьтннў‡eIBF@1<3,52.54751zўўњѓђєѓѓђєђюђђёѓёѕѕјњљњњћїљїїѕїєѕёяээюььэщшхў„aF79AI\5>>5.545#Gмўљєїђѕєєѕѕђёѓѓєјљљћћњљњћљѕѕѓѓёђёёршшццррссчў›zcHNVYL?>BBAA9F81pщўўѕєєіѓєїјєѓѓїїјјФїљјїѕѓњюыцхыщьшчтсрпптпкзў‹SJ@?IJG>5B>?@?I?I…цўўїѕѕєјђѕјєїїјјТѕїѓђђѕђёюытучщьщщхрплрцутнзў”^LB4:AB;8::8>A4->OУўўјљїєєђєђѕѕїјјєШїєђэььюьыухтунежмсуцрйўТ^YiQ;:1;:9428AT<AIIFMB55ЎўўєѕѓѕѓїѓјјњћљјјѕљѓѕѕђђїђжЫеддЭнпццссдцчшьяўўЇNIBEBB@>?<2204;:ЈўўёёєєѕїїљњћњљєєѓјёђёяяылзЫЮЩЮЪсщьщычцэьщэёўўАY4PH?><><<53,09AMБўўєєђђєїїљљТїѕёѓђѕѓэццхчтэкжачтяьюэююэыщюэёўўИG?BH9404110-.98PC•ў§ѓэшыєѕїљљ€гјѕєѓѕяэццьчхумкЭщэцэющэьёэьыээўўЭF:EB:735AFEB?<8??@4J[лўўчььѓїљљњјљєђёшршьцушчщшччущыёююйщцэыяђѓѓѕўў}ZVG57EC@;?L@PКўўцыђїјјљљШћђяэьёхпнтхчшшцрхшюэђѓёээєѕєјѓѕѓўў„OQ`A9:8783,2.791;ЃєўѕѕїѕЅєћщчхтнрккмтшыщхсучюээьщэяѕѕїљїѓяўў‘SUEB<9:<>7-%$.0$+ЅяўѕѕѓєїјљѓђшщццчтрмкпхээщхсчэьцыцшьёєєнѕѓєёўўƒGIPAB?>A5&##$*#0œѓўєѓѕєѕїєююьНщьэыстхььючшхцщющыщьяђєїєєђѓюўў’UpLILGE91,-3,-™юўїђјѕєїђяюэьэыэыыящээяэьышюээьэюєђєєуђэюўўvBS?H^NHF832311F&zјўђђѕѕхђёющццщэёщыщюэюээёюяяэюэёѓѕѕнєђёђыэшўѕrGMNLMb-0283,!)*2јј§єѓђюючьшхуьёюыхущьёђђяюэђђёяђєѕѕЯёѓюёыцчўўtSF9IH@2.2-$4.*#$aмє§ђѓѕюёюээыььэяючцшьь€§эыэьюяььэђѕљѕђэыьхнмўўNGPGC?>AINa$&&-&,`ЭщэюэьэяёюэьыэѓяэыююьшхщщэющьяяѓђїѓђяэцутнШўўЄP@CLGGAA:.5+*%#"(Fнўўэыхучыыщххэюэяєѓѓђяььчэщэёяєѕјђђёюшчрсяјўў˜8+GQLFGHGA*+*113{йѕчыщццхщцььюэюёђїєєюёёшцщюђѕјљјѓєьючђчцчЎўўЭYP[|Y:BAC?4,-4382TЭўѕюшшцчшьёюяёёѓѓєёёїяьёыђђєѕєєЬщмхддряЪz<ўўћ…aqzU08>983.3;89Y?>Бўўїёэьэяёєёѕєєїѕѕђёё§ѓяѓѓХєёэѕуЦИУццЈS.+јўў‹JcjA+:.4>988<0-!:JЮўћєяёяяђѓјїјјљїѕѕєёяёё­яђђёлЪэљщТСсGFJBљўўрQEYSPA8:A<8:;124FB<ўўћєѓђяьюёѕјјњјѕѕяєѓєёёђѓєысруўћпЕŠN4AA.ћўўъ\%4\mU+AH>8331-&]>GУўўїѓєєяєѓњњјјТѕђяяђёјёяэчргЮьуЉT<<7@3)њћўўeE23CM@#PкўљєѓѕєєљњїјїїУєёёєёђёюшсушдцРa(<7($)љљўў•M2BO8108-04-,*38P1.AuўўћїјљјњїѕѕїїєЧјєѓююэюшбхмЇ‡r57;1(.ћњўўјuAHZHGE@;9B?79+.<(45eЮўўљњјљљїїњѕєѕєѓѕѕˆёжлпбРаНiJF8PI)(&$љњћўўНYBBLGGCC<57;?:?>9$"7—яўўјјљїѕєѓѓєѓёяђїѓупхезБrN-88CC&+&$$њњјјўў–:JOHHE;:04-$5;<0@-+-31$+*02ћћўњўўт—cGLZWTQE?<42.09435<<13<43(+!!(*()(ћ§њљљўўщ—hZULHA::€3@;;98++-$0:>oЯўўѕѓёђююєёєлœ\E4.2*!,%!##0.ћњћњњљўўхi4>?EC?<348H?90.*%$3::‹њўћђьцѓяэшр‰;:QE1&&&)),%њњ§њњљњўўЎJF;CFFC>9@H<74,032?:-TбўўёуйлмМ‡n@0+,-&-2"%(%&ћћљњњјљљўћv@B9MNJIC<<;&-+11353)5ЁјўѕѕєрY:A<4%)433H? #,%њљљњљјљњўўэP**4EF?BAEB4-**)45&22IД§ьаž}Y\CW1$"",3.0E!њњћћјјўљўўєШ^O:EC915>8,,з),&+1;<%~хЌi;:k–e;&)5"7,7>@7§ћћљШћўўЇB(>dH.0?I#$$%,-23)("$  $&.1#љјїїјћљњљњўўЬЈ#5ABENe0#44(!$&*#,,);9&\љјјљљўњљљј‰љўўг1*TJ?YЖяљњњ§ћћњњћљњљњњў‹б*#Oe~[J.843&+&"!!(UpŸюўўї§њ§њћњћљњљњњћљјљўўEP^>NJ.  81"%-+$)UФјўўїїё§ћ§ћ§ћћќ§ћ§њњљўбхc5AE<<1 ##PJ&+:JVw„тўљѓэђяэњњљњћњћўљўўЦВhJ\F;0 ; -;1BB‡‹EZ~ЊУ§ўѕѓёђюы§ћ§ћљњљћњњћњћћ§њћўўђЃBH7:T<+)#у?77&,(+{ыЯT7rИцўћёяѓюьшћћњљўћњњћЯњљљњњўўїm1NNVM(1&)  %$;JV…HLФюѕўёююёяяјћњ§ћћњњћћЬњљњњјљњњћўўж[4:EEJd?BИлсѓєяї§ђђўВЊŒƒZ;OWZ`^W[[U^btPnсўѕѕѓѕѕѓёђђёючЪЩпчухпрщюэяёєѓђѓђышщщэцзЧЛЦўўЦd]iNFPSJVUTVUSSїBG˜ўўяѓѓїї€›ђєѓѓяшеежпнклщюёёєђёэяцшчтпцтраСОЛўўGNT`eoZPNQLPHLPYTnкўўььяєѓєющяђхйпцхцйхьёэюяэхмтюыэщчпгбдгШМЖўИŠ^IopkaaUQHIHOSO]mœўўњѓяюђяящрххкдагйшыяюђяюёёхкнщчщмзЮЦОЦбЪВЏўžzb]ebaZJNUEMNH$-HˆєўњѕьѕюђэщшждпкслдчяђєѓїђёєѕэтхшюшЫЧЧЮкбТКЗЕўw]V[VOLMOFJMQIEICŒўўјёяшчучпмйЭдущшуѓѕїїѕѓѓѕѕјѓѓёђяэеЪаакбФЩЩ࢘q]EH]hpHQ[PHLFG1#WчўїђющйльёщхрпьёђєїњљњјјѓэяэёющцтпЛУЪЪУЫТИБВўЕ‘‚cdgh\VTV^YT[\G?{ђўўїѓытчюяэшчђёјїјјњїїѕїёјхгЩдаЯеЮОКЛЛ€ЇОЏЖДАў›h^TU^e[SQW\PU][UUєўўјяьхпьѓђёыѓїћјјїєѕєюяхзМУЩаШНЩЯЪЦНЗЛШаЛЎЋўЋq`SHUQLOL[NTQWG>H\аўўљѓёюшшщююяјјљјѕѓђёѓяянЫЦТШгЫФЛЛЏЉЁЂЋУЪНЕВўгro~hGQUTUUPGSWeGIVеўўћёёэющяяѓјћћ€eљјєёюѓєэхлкеЩШСКМИОЎЁДСЛШЫСЗўЯrN|dTTBOQ`YVTBЛўўѕєєёыщђѕћњ§љљєїѓёсллтрЭЎЃЉЅЂБФНСКЉЁНЩФЧЭўўКbY``cQ[WNQUNF3AGMДўўщюђёэьѓљћћњјјђюшыкжйзЭЖЁ””›’ИЩЪЩМЛЫЭТЫкыўўЦkId]]QUJYOLEJBPQ\Уўўѓюэыэєјљ§љњєрлщэчбЪЧЪОБЭЋœЄОЖЯжЯбЮгЯбЯЮжшўўФVQ`TTGGьJGBIPPJ\QЄўёььлльєњљљ€§њєђщьэщгТЛСЩТЛИЎ›ФгСЭУЮмхлЯЭдгрўўпZFZYYWTLPBMQYOFZaЕўѕьуЫѕўњ§ћћљћѕяуттшчОЖУЦДУбЛСмѕшыуаегЩУУйпыўўЇSi…d\[cTIMHZ[U@;[КўєцгЏїўњћ§ћјѕєёхзЮжзЕЌИБМгдННУзкзЫШТФагйэюѓўяb;IZPTVYUPUUSTQITgуў§цгщђћљ§њјєђщмЭОЪЦЯЦЛТЦбеЭУОжмщпЫФМУешяёщнўў–ijZGSMUWS`YTWW[PVНў§нйюѓѕјљљ€МїцдаЮжНБКФСТЧСНРДЧрыьптптщыяяєэщўў–adqWZOPPIOIIOIH,1tтјўшщнтЯдсжЭЫеьчеШФЯкптелгжнчтесђѓёэспдЩЩШРўўЃ^\eVMWUVh\~:?BC9;oжчрзкЯккгжаТгжчшудЭйнШЦЩЫЫЭебкюёїђящжЯЧНРМŸўўЖcS]\aWWTZAI9B;G43YюўѓЯЧРСЭбйЩЧЪйхупмэёэсаЪгМЮадщђѓѓющраЪМККаьўўЏJ@ZdiaZg^W?FBJQF,CŠпэЯдзЯЫбкйЮЭдмечяјђэшйЧЪСШахяјјѓччлЪЯмЯЯеЗўўдkgr‘zGVLTQLCCGI4AF[дўчпсмкЫалзрзжмэђђьсучцбздхѓђђэькаШЋДОйШ|Jўў€П•q~Šk?JMSPGOILOSoVFЛўўђжабпщшрстяѕєѓячмпчспщюяёђёыэФЃŒ›ОаЁ\98љўў]w‚]?COTQMTJIMC5B*Qйў§юяшыюєёєѓїѕѕєѕяушчйемышурШИгщژœЯ›ELPMћўўяdVnkkSMZUYNNJ?BJ\NFЅўўћєыттхчѓїљѕјєѓячллэышчуцугИРхтЛ™Œ[>PC>§ўўъk4Juˆe7\\[TQQJ@P5cG[ЫўўкєшпьюїѕєїјїѓэултэюуцтрпгЊЊЮЮœ\HMEGC@ћўўœu[P‰~zq[UTTQPGLLbT2`чў§юэяѕјњјљѓїєєьтжжхэьцлаЪЮФИжЗm2GH2+8њ§ўўЄa@UdVHFUGOLVJ@OJ[@AL…ўў§њљљј§јєяёяёёчяђыупсзаСЦЖ‹~>;?:3!:ћ§ўўФ‡Y[reZ^VSQZPSEIPA8EBzкўўћњћњњїѓэѓѓёэєєђцуЛТСЛЎД›dMP5SW;$7*2ћћў€œЭmYScc[\SMZJOSUUTG..EЉћўўљћјїѓђѓђяхпуцєтЯФНЎМž{jN;:EFG?2,"8§§њћўўЌNdj``VQOYLCMPP@?OGkЁНщўў§љѕѓѓєѕэчмрехзЂЋгБ˜`MF7(*AG8?19+$ћ§ћ§ўўцYU^Zb[]YCHPBFNLB8.S„єўўѕѕпѓђёууцмпНЧдУ™Z:MM7.9<175%57,ћ§ћ§ўўŽЋtY`ohedZVPMFNSEEAJQON{Юўў§ѕїєёчткзтЩЉž™vCC:>BB754,.53020ћ§ћћњўў§АvtcYWSOTQPZVG>E88GJT{кўўѓэпншсхмхеŽUI94@8&4<-#++К8*.-8§§ћ§ћ§ўўђJ\SY`VTOMVS[M?>>@4BEIž§ўѓщпгуйкаЩŒ>ЋўєцйсШ•]@GF.#,$+1234G,-(,(%7EњћћќљћљўўСљb>:<)9*>d`bjUT^QA(&&%%)&$%2<>?:2aSћ§ћ§ћћќ§њћўўŒŒENZZVgIA9OIGCF@.52.?;bT>%! 3)(-)::7($%+0!-!EAћў§§ћў§§њў§ўўя^S\LOQPG?NGQC78**2,-0,+$4>8@:4J#+2?2IB9,+22%#<3778?@1ћ§§ўћћњ§ћ§ћ§ўўСЛdSZbchczU?PO[0-787:3&>BCBC5>$;$+!7.@9$93*ћ§љћјћњ§њ§њ§§ўўЬИ5@U[dcx?0E>>($3*,#((209<7%$*%()*1#,""3BCELG3dћ§њћћХњўњ§љћљ§ўўнE9Sim~j@CY"F7*!8+3.25?8?&(+-*1.2&1<9(aЭўўїєїя§ў§ў§ўў§§ў§§ЬўњњўўэrBW[LOE9*-$$)&%#-*(")$:9)8gYA4SWi‰˜щћїярччщ§§ћєў§ўћ§ћўћ§ћћўўЮУxaq]LF$J%$-##MQ132(@O]Ÿ˜Tn”Кдўўјэёщыь§ў§§ћћ§§ўћ§§ќћ§ћўўЬЋQYPNqU$0B5.3*" $UB@!0@.FŽћмjB…Уђўўшлмщьэ§§ћ§ћўћ§§љћўћ§ћћўўа|>aeih4$E710*+,*55-#1;7O`m™•^[кїўўыцтщђяяћ§§ўћћќўћўћћЭўњ§ћћ§ўўщiLLWjZakC0.5)!$"(3928ZZTOYU\rPQЭэнюытѕњѓѓђў€џ;џ§wџ<џўwџ~џўˆџ=џ§ˆџ<џў€џ;џ<џ<џ<џ<џ<џ<џўwџ;џ§wџ<џўџ=џўџ=џўџ=џўџ=џўџ=џўџ=џўџ=џўџ=џўџ=џўџ=џўџ=џўџ=џўџ=џ§ˆџ<џ=џўˆџ;џ<џ<џ<џ<џўˆџ:џў€џ9џ:џўˆџ8џў€џ7џ8џўˆџ6џўˆџ5џўˆџ4џ ўˆџ3џ ўˆџ2џ 3џ 3џ ўˆџ1џ ўˆџ0џ ўˆџ/џ0џўˆџ.џ/џўˆџ-џ.џўˆџ,џўˆџ+џ,џўˆџ*џ†ФЗ—‰zЃЏгчФВЇŸЋМЫЩазмпйЫНДЋЏЗЧЮдмаЮЧШШЕРЕЄЎШЩлдШТгйегмршычэыццртЄ™‡…ŒФТРСАЄЈžЖртЦеркЮЭаУЕЕВМЛУЮТРИЦжФАЉЗОНИФжгТСЦУЦЦалйнсс€!ьшшЩ•”‘›—ИТРЗЂŸЖЭєщмаЧКБМЭУМИДУЩЗДДЋАКУЌЂ—ЫдФИагЩЗЛТМОКЋКУЩедЯдДŽ–—››”™˜žЖФейЯбчшюхкаЭЦЭгФЮазгУЮМЖТЫеШРЃ•ЉрйзЭКДТРУСЛОЖЗФШЦануИ‹’ŸЄ™ЊЗЄЄЗШбЩЧрэяэсЭУШееЭЭЩРНЏРЦВЖжпЯСНЃŸЋМОМЕЌЌЖФЕЖКНШЮмгняђАˆБМЅ”‘ЅЗЖРОЗЭйрьяшсйжШМЦЩДЛЧОЇЊЎЇЋЕФСМАЅЖБТЧЯМЊАЏУгЧЧШЯзррнлеԘq’›Ѓ˜žžЦЪЪРШййуээырнсжТДЉЂАДДЄЌЖЏЏпМЪбОБЋННЫОЏŸ›ООНЪзЯааФФдЯржИЄВЗ™™€ЊЛЧЧауцчэьчпгЪЯЩРЖЋЅСШЕЉЏКТЖАЌДКББМемкЫžЅЎЏРЩУОЛТУОКЗОЦžЃž™Об”—АЦКВТхёђюсмЫЦгаЭНОМСЧОЛЈЃБСУЕВЗЖЊЋНйкзЪЎЖЦбелЩЮанукзСЊŸ’–ž–›МбžНЯжЫЪгщьэчйЩЦСЮЮЭЗЏЎЛСЧЧЛЎЖШИЉВФУЕАОеулТКВМРЯеЯжЭрщѓшЛ‘ŸŸ›ŸЃ‡ВЖЇНЭЦзкрцргЯбРИИНЦИДННЯаЪЭЮЦНРДЊЄВИЎНЪдйЪОШСЏРУМУгтхтбСž…”–ŸЏВБЌЗЊМгртшэьчпжЭТКИТЧМУСМСЛРапкЫОКЗЖИЗЉМЪжЪЕЏИЗЛЯЫЯСЫжаУЩЮЊ–ƒŒгМОСРкнсэѓёэхсжйлдРИЩмбзЪТВЌЛаеЫУЫФЩШЮТМНЪЯЩИЊДМУЪМНМЫЫУЛАЕЇЄЅ™ЉлЮЧНСзсяяюцчщпаНСУЗАЉДРНЖЗКВНЫгЫЩУТЖЗРИАЋЦаУИЕКЩШЪЫЦЩЭжзЖœ–‰›ЂЅТШЯЧТшщђѕшцэщкРЖККЗЛННЪдЮШЗЗЖШбЮФЛИМТННКСЧжзгЭдзлТИРМОЛЕЃƒ…‡’”ŽЎРЕЛЭЭтьюэщунжЮКБЎИКФЩУбхсбЦАБУбЭаШЖБЏКжлШЩжгаЦЩаЧЖЋАЊЌЉЃ•Ž‘‘™КОЎЯзкзгйучцзЮЭТКАЎСЮаЭкпуьшсжЮОМШЧТЌ™ВУгкаУТЦЮШТЛМЛРКЖЏЃž—žЁžœЖаЛЕЗЏОЫтчщытЫОНЋžЁЏЩйеддагЮМККЏДЖЎЊЎВЛЦЮдЮФЫажеЧЈЈЖИЛЕ•˜ŸЖУЗНМЏДЗЌЇŸАИнгФКНЛЕОЏЖВЖНУОНТЮгШМЕИЛНДЊЎНФЩжчебдуЮЫйлЫЫаУЋЏžЄМРМВЇЅЄЂЁЅЉЁŸЂЇдбФСЛЛФТЩЫЦШбййгбЮЭЫИЎЛТРТИОТЪЖТФЅ{ЖнслЮгабЫОЉЏВЕРНЎ—œŸЂЅЃЉœЏНаЭЩУСШФЫкЧНОЩгЩЧУОНЖИДТТУКЏМЪлпжЛ~œРрежаабЯ…zwВАЉБМЧДЅ˜ЁЁЄЂМаЦИЎООФайлЯЮРФЫЮСЫЫаЭОКЄЏааЦЦккцнЊЊБНЩзбрлнДЂˆ„‹ЌЛШЯЯЧВМТФВЋКЗБ˜РАЗЗЏРЮщцхщчгддЮЮЦЦЭЦДЋЌЖКОбйдпЗЅЌЕЯМКЩЫаЮЏ˜‰ˆ‚Ф˜ЕЕНймцУЊ™ЇЕЅЗŸЉЕЛЭЧЎЛ„ЧйсїдЦРИЗЌАЛСЭЭ€пйтхУЌЩТШаЪССЯжгАˆ‹’˜Ђ›ВеншчдЇœ„ŽŠ˜žЕНЛАИКЉ}C"(]ЊнЫВЗКСЏБЖБЗЦгззРДОВЪЮбФЛИгззЗ~™›ЋЈž—ЄШЅНЮбР„ЌЯйкБЕТкШ|YJY`O09„ФУаеаЩЧСЋАЛУЮгЪУЪОИЭбаНЖЗЧШЛЎžЏКА•‹™АЄЎМЦЖœ‚m‘›ШЖэєяЉU@@BBZЅЪЮСДЗКИЗЛЛШНМЄЃЌЎЕЗРСОУДАРЩУЫБЅЈЃ›ЖЪйёшшюьхг !#.,7!*>AцFHA[q^QŠЯтпеаЧЋкўђђёёяэчухх€Ђцхчцшьыяѓэчжрсучущсмнктх-*%2$138::<>HMLM[UJ‚ЩтулжЮецушхцчщусхшюючщшыёяюэїуЪЊОмрсуссууцыя71.1(*$++&8EGLMLHG^ƒејтмршшыухцуслмчьђєяыщщыюяьюцнВФчѓхцуучэьыщ838<7+,*148>AEBLOOJ;MСђжнцюэёщунтмлрхщэяюшщЪдхуьщхѓэсєсхшэыяёёэы02.1,&*):>G?<>FSOE40SЧьцщэюэёшссрнлмрушэюяэзкнсуэыщющщьцччьёююяя%++)%*0355:8958<:&5S…лучээыщшутсуусусчтьыяєупмсуэщэышщуттхрюѕђѓђ%"(&&(28;21:A<8:<78JНяьэыючщцщухутухццхуьэщчхцщьююшщшхшцШшљўљѕјї)((7:?55ё;:BQ>@bЈжэёыщшччќьыэуућчыыьшш§эыєєИюяытсщьэїўўїѕѕѓє&%""180148344G\ALЊтэѕьыыхуррччцтцхшхлпухучщэяѓяяыцххчыѓѓє›юэью+%,((042,-13AF:PZ‹йьјяђэчцтммсцчшччцхснрхцхдкпзэщщьщчыьяђёяяэччы**21"**%&";ZL9Wœнѓьёюєусррсчшьыщщц№хцутццсхшщюяђяяююНёђёяяшцшч-%13)%&$$5>QkM?Šлмѓєёэђсзжтщюыёыэщцхуьыьшчцуччээђёѕѓєѓђяюёёоьхчч*%&3!$"2ne‚БатѕюяюящнмршыюющшчххушшщцспхцыээђёђєяящышшЪчычы"1-G4*gРжёжпєэяююыунмпрцьяёьщчцхцшшчщщснмуьяёёšюяёьщыщщьяяё"5AA84,gЫсейхьюёьшрнрсццщэюђючуччшэчьычшццшююэђяяђьёяэыэђєјј"! (?GNtЧѓмнхщыэяыххсчььяљёэьчхьыы˜шццхушыэяяёёюёяюёюёђѓєїѕѕ-&&452>@F‰бьюђщыэюяющтсчььэююђєђькптчээщхнптрѓяёђѓяюяыыьяѓёђђѕђѓ,7;:*;U?‘ьѕзнщээ€Œшхчхухуццщяёяээяпжлцьэщчтуыэёђђѓёђэяьэьђёїѓёїєю85>YJ8MњўёшюёёяыухцшэьыэыэюђѓёяђщшчэьэьыяёяђѓѕяёёєяѓђєёєѓђђьщУœ?HJrpWqаўыцэђђёяьшцьэююяѓэююээяћёђюыяяёђЂѕјєєяёєёєєјєђђщееЧА1IBF{ЌејюххшююђэщцыьююєђђющчшшэюёяёяьэыэяёђяђёѓёѕђёђђєђєђююёкУкм009^Епњћѓэьь№щчутыэяёѓёђыцтхыыжяёяюђщђяѓёяюђяяђёяђѓёѓєёяьряххюю+GНуєїѓэюютэыьшчщяюѓяяююьшхчшччыщщыьююёэююЫѓєѕєѓђёѓяђѕѓѓёэьяэюё]Оћўўћјэђёяьшчшыђяёюёёяюёьђяыщычщщяьэьђэшцшыяђёѓєђюёё’ђёѓђєэяяѓёЧўўїјьцыэьэусчыюђюѓюыььяяэђююђяыььэюяяюэьшююђѓєѓђяюёэююєєёѓѓѕяюёёўћёьшчюяђэхрпеяђєѓюэщыёюяђёьыцшшюяююэя§ђѓѕѕ€›ёюєьЩНћ§їєєѓђюььыхюьцшьяюяюяцгэўєѕєёяэяёёђѓющхтцэёёђяюѓяяёђђѓєђёђяѓЫ›ЕњўђђєёѓёяёяяёэюѓяюёэяьэюїўєђєђюэђёѓююччхщьяёєѓђяђђєђђёђѓђѕљхыеДыјљюѓђяяюяэюьыыюяюэщхууЎзшхёяяээщыюьщттсцшюяёёђђѕєђёёѓёѓяяђпœМыљњѕяяёёюэюяяэюяёюёюяьщччхнншьяьыухщэьэхртхююѓЂєїїєяёѓяююёёюсыђюяяьчхщыыюђѓьюѓѓяююшцчююьччщяюыутсщяяэщчхшюяёђєєїїєёёьяђёђяёђёёяёюэьшчшчэяђћэюющЮшхтсшщэьююыхрзкмщычуухщяюђѓѓђѓђѓяёяьёээюёяѓяёээщхччќьы§ўўЯёяяючртснлпуыяёђђыкзхчыыщсцчяьяёђђїјєєёяюяюыььюђёёээуэѓцныэсбuVёёїѓтммШрсхцыёѓёўѕщщюэящшшщшыђюёѓђѕѕєђёёђяёэьэюјўўяцлсаБ‰}SSCPCьтдВЄ–ИСхїаТЗЖДЫрмхээ€vщысдФЪеццюышцкмкЭегТЫнныьстхщцтэёёђѓѕїѓѕёїЗАžžЂЕтпзлФМЛБЦѓѓЯцэьыщыйгШЯзжйрдббучсЪЧдйгдмщткйзждгуыяђѓёѓјљѕрЌЇЁЉАВАЫжзЩИЕЫуўђьрмгЯлпрегЭжмгЯдФЦжпЩЕАушцжцьмгдйЫЦШЧажнуупцЫžЇЏДИДВАДгзьшпцёѓїѓыцрйтшхцычунуЯЮующтгСЋРюььудЯезкггЮЩЮкстрхєЫ™ЄЦЕБВНЦЛМдкукцяјїњяцйпшщчхзжгЩдеШЭчэпжбРНЩезеЪФФЯйЪЪЯйхщьяю§§УŽ—ТлЪЖЌИЭЯзгЭцэєѕљїёыыпззкЩЭкжОНЛРЦЩжжбЪРбЫепхгЧРФлэуухшюђюёшхгЊЊЏЛВДАрнсйлэёѕїї€)яюющжШОЛЪаУЛРЫЧТЮйзшкЫЫегйгСВЕЪбайхщчхзмрсэчЧЃЖРШЌЉВОбмжпђѕљѕјѓяхсхтеЪТРепЪЛРШгЯЪЩЭаЧЩкщьэчБЛЧШзмлбкдкдЭЭажД—ВЏЏЭыЉЊУмЫШмѓј§њѓюхтчшчжаЯакбгУОЫебЧШбаРСащюяуЦШтьыьссшюяысбШААЋАЅЕЯуДгцылпчђєљѓёукдхтубЮФЯйнйжЦЯдЯТЪезбЦзщюьзбЭмрыэющхюѕ§њаЇЕДЖОЛЁЦЧМйшцьюёїђхцчеаЮжмЫЮдлсппсплжаЩРОЧбУЪлццненжЭержпыяяэцйЎ›ЉДКЩФЫЦЮЗбчяёїєјѓяьсзжгжреейжрабчёьккжЭабЭУгсчнбЪШЮйстужнчнйлюСЉЇ›ЊшемнкщюёѕїјїѓђєёяхлбкщяьпдЯШдчынйсмрстеадмытгРЧбжкЯаднмзЮЪЪОЦОВЛѕцпегсяѕњїјїєяхжмзЭШЛТЯааЮЭЦарчккбЮЯбеЩЦЧктнжггрхпукпцшшФЎЋЅЄБЕЛмцьређѕљњњјѕѕьжЭЪШЮйдамцскбЫЩйцнмзгЭмдедпчэьчпныэмгбаЪЪФЕ–ŸЃЃ€`žЦметмуђїјјѕѓёюнбЧРУЯжнйчёєюрЦдрхзпеЫЧЩзээхрхрсжртжЫСТЛКМНВЋЊЈЕЧдЪуцюьхчёђєшмсбЭОРнчщцыэёђєэчеЯзмйеМЗШмшюшнмнздеЮежбаЪУЗБЏКЗДЖЗТхгаЭЮмрьѕѓѕюсдбМЛИЧжхцхчшчхдгаШЦЮЦССЧдкцщуйлэыщзСЦжЮЮФВЌЎАШеЭккУЩЭФОКЩбьчйгЯбЯеУЧШЭгкЯгкнпкЮЮЫааЧСЦЪнрэїэууѓэшьысухйРЛДБЮддУММНЕТНСЗИНОчуагЮйлзнркушчщыэшхцжЪЯебпгртуЯкжЌ|–ШєюьнрчцндКЎЧЭЦаЭСЕДЛЗИНМЛФжхчпзЮймнщлаазурйеаджагждедЩзсюѕтТ‰ЄЯющщнрчцБŠЦУНЭнсЭЖЖКНОСУЭспаЦебсщэьстнкухмрплпгбЛЪсшмлшьѕхЉЏКйеццяыюТВœœЅ–ШЯпуулФажгФФйЮЯЏзЪЭгЧбтў§љўўцыьмттнсмСКСЧЯбххтуНЇМТпЮЯжтнпОЋЊЄ•АлЋЫдзщюїнКМТФЗЕЧРШЮачуЧЭ–”нэєўчддаЫТЩагмпхщыюЪЗгплукдйцшуОžЈЊЊЉАВВеюяэљыЗЌ–ЂЊБЗШЯЭЧЪгРЇŠZ5CrТяуШздеЩЩЧЦЪзуххУИЪЩсхюсйгчщуШ•ДИСРЏЈДцТгмц厘ЁНщєљШЩзём”hbgwgLMрксхтртеРСажкжаЪгаЫксрбЧЪжйЮУААШЯШЌЇЏЪОЦблЫБŸƒ—ЋАмЫ§ўўМoPOU[P^MZemЈїјьчеТдбйлгЧЮббЯмййРСнхзЮаТЭбШШЖБАМЦСРЮФЏМЗбђмтгѓр‹B087MN`m`dhM}жрУзкейуцспгдЫФЭлспЭЧОЭМВАЕФРССЕДЎМОКДЈЊЉАВЖЗОШЩе‹J1YeIHMU\ZUGPaЊррьрлсрЭЫЦЪзеЩЮЫйнЩНКУРЏЃБСЫЦаСООННРМВЂЃЗОИСНЩтM@ItUIIEJYNPVap~ЃмтёнаМЄСхяпббпцхЫКБККМБЌЏВШсхмШНЖЛИИБВИЭТИКШU.+@HBHGJLUTM@izoY‹РкмкдЪЏйўђыщухлЪКНЧЧЗТМНФЯгайеРЌЖУМСЮЦИРЗЌЎЪ239G<>AECA?JLUPPiaP„ШтусйедеЩЭЪШЯЯШБНбЭЩбТНЦкцклсЗ›x‰ЗНАЛРИЕММНбF?@;234E@@SGFOVWWYVmˆйљчммзЦЦЛЛЦУВВСуцмкЫЪкнкШШЭУЕˆЧаЧУаЩекчкгAJOH>8+8AA43ALCJLaNMrЕднеЭЪжаЭЮбкгЪНЖТЦЭалаемЯЦйсмнЯТНСОЮцэўљєѕїёщ$(1::04:>EBEMMhQYЏсшщЯЭЩУОИМЮмЯУОШЩШККОНЗКЫшэчщчкСМУЩаетщушцпгЮ#0(:,97AACA>HTC[e”ауххзжбЭКБАЪгЪНЩЫУКЉИЧОТКАЧТДбйгЫЦОТертшщцкЯРа)55.85987$4OkYBgЅлыжйррЪЛЗЛЧШлгЮамзбЪЧНОКОННИУескепздйхцнмкйбШНО,7?A<83;?JQpr\N–рпяцрнзЗЌЕСжесжлШЩУЪЪЫзбЦТТОКЫлпсщыяэьрйдйлнЮЦЛС0,2H& 43F-"Fto‹ВЦкшткмбФВЌМгаЭарсбеЧЕСЮаШНИРОУбршуьячшзбУзмЯЦРаа&,+&ALUC7wЮрѓкйщйзпзЯЩРНРШШбнлдЯЪИМФСУОСРУЕЗФйлзущшуажЮОФЫЦерл$-OQNEE,4rЪпШЮЯзмпсЮКИЖРТЦОбсужЫЦСЦЪЯЮУалЪЕТеЯЫгйнзакйЩШалцэђє048."5P`[vЫяжЮЯШзсуЯРЗТЦЧЫгйуьэеУЦРезЭЭЩЮааЫзеййкнхкйЫЮлтццшюёї759CNINWS‘аьшьужЮзттЪКДЩЮаеппсхлШМЏСЭзегРЕЄЌТршыцлпзггЫзнуыцц€ЅьяBLLJ2CWI•эђзлухдЭЭдЯЩММЧНЦлкзцшрдМАИРабЯШФТЩЯумсмпнхйЭСбцьчыхяыл9BcSOSA&CB-ылЭббдбЯЪУНКЕЈ˜ЉЇАБРКЈЇЂЏВЗИЗЛРЖАЊКФЖЗЈМЖ››~\A&-7??@395>H.)44@:пЮНСЮЦЦЩОЎЊЖбгОЎВЗЋБДЏЈžžœЄКБЄЃЏЛЉ„ŸЋЮЏœpA:%EL8)",-;.),*+.#&12йыЫОТВКФЛВКТРЌ›”žžЅАСЦЖ•ЂАБŸЄИœƒЄНОŸ]N\HIdILJSH<5;?704;+)-.;@9ЩюЮОКЏЛМНЖДЧРŸŠŒЊЏИФЧРЉЉ€ТЖЛЦнБРЊq[ISSM:.7&CdPMY1.<1%.:),BEC;7ЇДЛДАДажЦЊДЖА›”’ИРСЧОдКЃЋгэМЛЂ~iH>P@35hdN@>up#A>59:2$%1$ 0;8ЧсШРЛАЌАЉ˜ЄЊЎВЌЉЖНМФКФуШ’‹ЅvL>Q?3?332-,@>FH"\Q5)*!%#+89,+,+0ЪЭУЩВЅБЈЄ–œЇžЂЇЋАЏАЅЅЗЧ’FWS02C&"104155;875`;1-<1$&)4..1.)")1;ЎЗДЈЎИШжьЫЄЏЗ”‰|pF48+9;3%&-8;20%!!8.4<<71+#!*1,&&!.78C;АТЛДЊЦййЯŸЏЇ‘\.:EHIA<80"(5.##*,8%590"591:7,&$7.9*%$%(-SAMЫгдЫИЉахмС—Z<:SW5(1."#&.15%522:% ;NI<83:@9:4BGPMBQЩЫЫММЋРЗzPU?B,)@9;&41&).&&%#,5!+&#))4840212.3;9,5FEF?@851-*.&,48518:.,381&7."-"+!,#+?WE@GETu’Ъў§§їј@2+*AFF58EF:0(($#2,%!#.;E7#>bnnuєѕѓѓёђѓђєєїїєњычшыюяђэчьыяюэяухцьђѓьяыьэчтлмтнјяуеЊd55A:Q]S9BSYјјїєѓђѕђѕјѓёёшщшэшыээт˜шьээщсцчщчшцршпхчгѕўрЇjC0>3@Ag]PNF,FH"8їїјђєђѓѓђюяююыьшюыюыьэцтруьююыщшюььчхыьцјхЮАŒmJ9:?FH8>AB?G5);;5@ѓѓ€УюэёђюьчшэщщшыщцыщээцнмрчшышшщёлЭпэўрРœ}UF3LH;9;80*4,$BmWU]CB@9455878?FGC:муьщыюю€‰ьёыщщцрлтэыяэёїысс§ўпЯЋ•wPGVLCAgkOE8wt(BB>?524794 78;ї§юыччэыцшухуухшшщющьѓў§ЫУЦQAQ>4H:0773;AJJI,cY!:42#%).08>2)-1+"єёєыыштшстпмуучшцц€ЏшнюяЊae[5+JM-"97795571.$,7>2(B12,8;>9,,-*+59;849AѓѕюьыюыщььццьшшырлСОQ4<;9G?:72723.$-,.*"$-1.-553:82).%131153;Eяююсэяьяьщуђїўљц˜ULMBPY?<:7;41.-3)%%€›0.4-<4*&-10)24+23.9BыщщььяёђўёсшызА™‡S;9@HHF@>:9119A;0&(-,13.;@AEB<71&$13*)2:39EEAяюяыяьюяѓухнЗrA50*29+8#%-+5>@92#*4;3022;<412588GUFFяяьэрїўўщЌjJ4@\]F?@<207;;9517971&):]E>-04;9885;<:@BFMLBFHBBALrёѕєэьК{H-JS^YFFEA80+,&05)()!*+*)+1.+(*4752+428AI?3@LYзўўѕл‡F>AP[JEBA?GC>305498,,),()(12""!#$"$&->G<3ISB0Q73\ŸСюўўДch[2:MC@ABCCHF<><:89;; <;4--002,*&!-%!&*7,3)0%#@[H@I?[o—Э§ўўћњTF-4FLJF?BIFA>>A>:7858<;>AC1&(&+57($""-2@?@-;EL3JQŠЈзјўўњЫ@``H-97849440*1:?;2832787;?9.)%)$40%",?3LGPMJхўчпдЩалжбЫпжН›ЃЈЫЭклйжЧФЪЪЮлюЫгТƒnngkgWHI??ZqimQICMLGQUSHNY`TPКШжЫЦлцыкШЮжЫОЖЋАдзййдугИУчўЮЪЊŽzaTk[QN{wcW5M™Œ:V`OGE@CJIN%PITйєпзаЩРЦУКРРСЫЪТЩаЯеЭпљцЌЉНŒiZbQGdFVE)5F1EHPTMI@:9@MZOIMQMF@A>@;>HGIC>MI\ШЪЫЩЭгхэњмМЩШؑ\LMLUYWNJJ@GILMHLNC>GA<;NPSUSLC<7.1?>58BFFHN[M5ЧзйЮФкьђхОЧСЈmHOam`SUQNPPNFFJFMH9IFSIdY`пучцбТчњѓмЏxV?LirUWUHCEFAQAG>HPFA:*2..+Or]E??GJJLOGGJWTSHMS[aaSkррмдЯНмЯ‰jdZ]ECWVSGLL@GC@C>;25?WC.#40;>3,AAI>GEHGBBGGIHNQYUYNV]ыщмйлЖPATcmnWONUC?CAC8C8HC[YT>UYm‹уїѕэмˆVFUjp\W\ZS^TEEG5EICJHE7?E:7@7,2+098;3<:3H;?SWLHahQFaE?kАаћўўБouh@F^^ЮUOJYUSTPJMGLQCONF>ACGE?>955*1A9?;CF>;(<>5CJO`JFVV^M]ežНтўўЪћ§Uqv^8PLLOPNJEEJLQIA;IMHIBHJF;;94:E842:+CSMTYQV]bZЅЦўў§§ў§ў>џ§ˆџ;џќˆџ:џўˆ8џўˆ5џўˆ2џўˆ 2џ 1џўˆ €нмпчёщнЮМФдаЦЮФОЮтчуеСдйрсмрпмйцукхцддЯЫМЗШШОЩСФЫегппдСФзаллгЧбЮсжрщхлЭУЌДТЭжкеЯЮЭгЮдеЯЩртйтыычцтембТФЪЭЧЧЫЫЩМЎЖТбЩШддаЩдзаЮЪЧдцсзФСпггЪМЫдкШТУКМбйЯззчулшшхцнзйкйШЪООФЭжбЯаТНБАЯазбмпуышсздбзгмнузШжбжннззйЯЫФЧкмлнчэыющхсптлЯЧдееЧМНеурЩбжЩФСЦЫзхттчцсЯТЧООТЦзЩелжЫУТбпснгбдтйтушщэхншэштккллШЦЯЩЩЧЫЮйдйпЫНУРШмтсчхпЮбФОЫййЯзЮЌТЮЭНРазкЯЯбФадгнчшчучхыщхмеаЭдбкнтртрппкмлШТУУЩжнгЩШЮЮамадмзгкбДНЭлйлкглйкуытщээртхэшптуссмгтцщтпгФмшплаТЦЪТбЧФФджЮТФФЛЧЮгЫУУЗИЧклзжЭЯЫЮкгучуэёссхслзжлштжбШКЦЮЮЧбрыюыржЫаглкШРНЫЫЩаЩОРЧдКСКДРЫглпкдЫМНУбзептсс€‚пхпрхчпдмЮЦЭаЛКЪЯЯзхЯЗЭлаФФдЮЪгежЦФЖЏАИФЧРЏЏЕЛКекнйЫЪйнсмпрттмйкдзнлгФЩЩЗЪФНРОИЧШЪОУДЇЫШЩжжбеЯШФТОКЌЕМЪУЛИИЗИШбЭелпмгзхђящчтаЭРЮЫЯЭРЫЧЎЏЫаЧЧЖТМЦктуЫДЛЫЮежабнндЮЯЗКНТЯнмЧСМУРЛТгймсцлуунйкзШСФЦдзЭЮУФРЮОММЛЧЦЩЩТалкбОЫЯерйЪЮЩадйлеОЦабаШЯТЫТЦЛИкйтхээщхнспгЪЧЫЯааШЦЩЫШемрззбЮЯмпреШпйЮжслЩЌЃЌЖИЖНТУЭрсйеЯдбйусйтщущэмзпунжнЭМНЧйлдЭгйШЯЦЪжрххкгЦЩОЮгЦЖДУТСЛДЕТЩЯйпжЭнэйЄЖИСЩЩЯУђёяюхрездчмнжСФбгеггн€HлеРФбеЭЭксуслтгЪЪЮЩзмЭЪЯЩУИЕАОЪСЋЁЂКЦФКЗИчцлцпкЭЩбудйтнптсххрсшмЩаЫбдеЫКДЦгдЫФТЮжллзШЏЉЉЈЗЛЛДАЫЮЧЉДЭреИАЅыцлйлмбСЭдШРЧлккртщхЩеуыцчцреШЪЯддаЕ‘ЁемкЪЗАНЖЌМжаТЖЌКаеЛЗФбаСЏЎцркгаТЫШЗДЎЅЗЮчшщхмФЖЦЪззййбдЩФСФЧНЉž–ВЦегЦВБЩЭЪмлзаЪаШННЫбУЖЋБФллкзЫФМСЛБЊЏЮццхлаНУжтзШТРШаЭбмгкЮЛЛТБФТЩЩУФКЛЧЭЯдЪТОЧЮЪЭНЈЌЊВУКЧЛЕЖЏКОЧУСДКЛЧаУдпжежейЭйпчцнтггсЪзЫЭРМВЛЁЋНЪРЛЕЧЦСЮнЪЪФЦЕЉЃЋБЛФФўЖТТОЎЪРРННЗЮулЮЭбгФОТЩемгпзЫЦУМШбнегЯЫМЦадТОЇЗМЕЗЯдЯУЛЗЕБЏЏЛСгЭЮбпжжеЯггмеЫктрмжлаЫММНИИ€вУЫШШЏМЅЛнычцмжлреФИНОТСКИНФЧИКСКТЕФОтзЮаркажеШгпрзжСЦТЪЫШаФЏЏКЕЏАФЛМДЛСРЧлсуппщцзбаЪФРЩБЌЊЌЖИУЧТЩЫШЮРДОгжмрслдйдбеаШЩЪЫСФНЫШРЛЕЄ”ЉркЯУбзрухчушшхсйзжаЫЩЗЌЎЅЉЎЗУгеУДНРЧЭжйЮЯцнгдЧЯаЧЭРЌАЅКУЮбЦМЖАЌЕелкЦКЩскхрнузгбЕЕЪРЗЛСЕЩЕЏЇЄЃЉЏВДКНЮжаплйкЩгЪЯмрммСЕЕЎВВИМЭЯдДНпщчшпхщэыы€ЂђѓюшйгМРЪИЕТЩЎКцЦААЌЃЗЛРОТЛТЮЩТЩЮгЧУенпрежйТАЂЂЖЪШетцщшттйыёјїїћёжУЖМЗАЉŸЌœЁИИаЩзСЗМмШКЎЗЭбгЩЧШЛБТЫддЫФРЖЗЪЮРджрчюьђЩжђылСФЖaNP;-COIS:;#+Cj˜ФШžЛЉžЯЧЧФИАДУЧгаОБЦйрмаФСРЩжЯЪЗдлѕјђїн˜Z@;@&,TM"."WFHB$&3G"U5LJ8LCSЕЈЎЏЎНнтпнЮЛЗЕЌЊЕНЦЮцРзпхКЌБЄ}^F0;S:EJ3:B94.,?F5>(?B9IT4:3(?@*ЧЏ›ВМЦаЦЩИНРУЛДЌЗСЮЦжЛЏqHSG.-..AULZMAB<74311)&4<9A?43.;45VSЮЮУжбжбЩЧЖМТкткЩВйшєј™\@AI:9><@@7HOI+@5-0..%3A;<>;B?-,0AFA75.НЗЫЧСЮНЛЩелплђјїцз’ŠS8:BOGH:A>517ETOL>(#<:0$0<<;5"+>.*1?BA+$ЛОЛЌЅКЗЏЈЏЂНМеЦМ]EYQI>27GHCHH9$&03#HF+.)(&,+&7151")O?*,>мгСЖЖИЧЗЌЏЮбЗxnC417<427,&%-%#*,2<%(""$*-,.,!!&(урУЏЎЛЖеялЂ…[VYBWVW`#217410033*+1#&,(387:%*,4)%,9:8)0%#!$ЯЩНБОгпЮВcH@H8,8@TSJYS1*-)$(005>? "(,2;47*,-&!)"!"2>1.гЩЭзэаЊƒbZW}uA%.?@IHI>%$"%$20%25>-,+("&. %"$*725- $U5!$-йзЗŠoZA@>>PadS09::>9P1+01&"9:-BB! #%"0*($#*1+77!*(#!%.%)28ЯˆJLESqeECVJ5UJ;9281(-,14#)*8+21. %*)!$% &&")?a<,7?FIC<Cd!.-*##!$*a^8"HL%UTa>23.*#!&451!C<0@HEFF.4.35)FM[-*(!%&5n$@IBBJI:*5.$"!92,"-3&)--!;;EC<27.17CBCFCE@12123,1?9$&3&":,H-(#F5;>CEE7&%,)2?274,78:<7HA9>+8;78751BEEF829791-.%#-2481%#-$*+@kC++%$4- <@";5.3.9<83*@::*.479BEE€ЊP[7( .@,50,)$)53*&*!)#I?9>NVH:+4,-1,*CFALQPA,9"49.;9?4-1$0-"I5::,1@J>:|ЎИЄjJ^ЂЉЛ|˜ЈY.F772-75J>A952I>kE89:8*#2"*,:ECF$*@-*HESCBbxИљјўћ§§ћћ§н§ћљћ§§вчшмЭЗmb04>).-)15!>)>@&%+.>GNMPFJYNJ+-Iq–рўћљљіћњїљјљ§§љїїЮјїћњљћ§§ћ§-03#0.0%"3>::1+?^YQJGMQM@ABSrЉл§§љїїєїїјќљјјїїењѕєѕїјїѕѓєєђ42,,5--"%1>AB8.5;JNNOE;FB-8”к§§Хјѕљјїїљїїљњјњњ§љјјљјћћњњїјѕјјѕ5@;79!*!FM;8:87&9BSbSo>S}Ѕє§§§њўјјіїњњћ§§љјїћћкїј§§љњјјњјњњNPQ1$+JE2T`L<LOJTO]USaOHЖ§§їўњјј§ўћў§§љњ§§ћћњ§§Юљјњњјћћњњ§§њљјјљћљћљјљњ§7EBCOI^FIZVhЊЮ§§ўњћјјљњ§љ§§ў§ыњ§ћў§§ћљљћ§њћљћ§љљ§њўўяћ§§љљVcQ\i|T]ƒЌю§§ќњ§§ўў§ўњ§§ћћљњљўў§ћљјћћ§§ќљјћ§§хњћ§њњ§ћљ§љјї\;@E]˜Фь§ўў§§ў§§њњ§њў§њњъ§љћ§њљ§њљњљљјјљћ§њљјћ§§№ћјљ§§љљјїјјњŒБж§§цјѓёљѕєђюєѕєїѓѕїїјњљћњњ§њ§ўўћћњ§љ§§њћўў§§љљўћ§§ўњ§§ыњљћ§§юђњїѓяюяёєєђяђёѓѓ№ѕєѓяѓєѕїљѕѕїїњњћћў§њњћ§њ§њ§§њ§ћў§њњ§§њљ§їєёэђѓѓђѕїєѓѓєєѕїѕєѓєѕѕўїѓѓєїўњљљфјњћћљљ§ўћўўћњ§њўњјљљћљњїљєђѕѕєћїјїїѕѕєѕїљѕјѕјјѕєјѕѕяїњјїѕїјјїјїјћњ§ћ§§юњ§ўћ§§њљћћїѕїїљјљїїјјїѕѕђѕїїјјћњјјїјјњњїјњјњїїюјїњњїѕѕњјѕїјћљљ§њ§§іћїљћ§њњ§њљљћњњјњњћљљ№њљћћљљћћљјјћћњњїїћљјјљїїўљїїіњћћљѓэюѕїђљцњћјјѕѓѓяяёєюѓђђѓѕєѓњђєїїљјј„љїњћљєѕёѓёѓѕёёєюёёєѕјєєђђёюєёяяђёєјљїєљљѕэььёєђђёяюѓђєђѓѕљєїњјїѕѕїїјєѓѓяяёђёђёюьюэђяѕѓёђѓјѕєѓёёєѕёњєїјяјєђѕёєђєђюђђяяєєјѕјћљљѓїљјѕѕєїяяёѓѕєєцёѓюяђэєєїєїјѕїѕєёѓѓѕѕљєѕјђђъѓѕјјєѓђєѕѓєїљјѕљјјљљњїїћђѓёђѓѓєтљєђђяяёєєїљљѕєђѓѓђѓѓђђюѕђѓѓђђѕѕёєјєїѓљљњљљјљњљїї€ГѓѕѕђєєѕєїєѕїѕєѓюёѓѓїљѕѕѓјђєѓєєїјѕїђёѓђѕєёѓѓѕѕѓћїїћљѕїјњјљљњљјјѕјїљїљїєѓїјѕѕєђѓђёђђѓђєєѓђђєёєђђєєююђђѓёєѓѕїѓїїјїњјљљћћњїїњјјљѕєјѓєєјєѕљєєѕєѓђёюѕяђяѓёђюђююђђёяёђьююєђєєђєюёѓёљєїљљѕљљќјљјѓѓщђєѕёђѓѕђєїѕєєђђюёѓђѓђєђђЪэюяюђьѓыщыьэљїїјїѓєђєђѓѕїјњїїљљћћљѕєѕэєѓѓэђёяяѓѓљэкяёєєиёєєяѓёєээшэяюьыющыэёяѓєѕљјїјњњјѕїїјїїјѕѓѓъѕюьђьёђёюёёѓђїюыьчђєђѓѓзђющыцэяђюыщьюэьѓѓєѕѕјјљїїјѕѓѓёїђѕєђєььђђььіщяпсьђїђђяяИѓђѓѕїєђђєёѕэюёѕѓѓђёёюэђэїєѕїјћјјѕїѕєїѕѓѓђѓїѓѓёєюєєёяэююэѓђђяёѓяѓѕѓёющэюяя№эѓђёєєѕёєэѓёѓяѕљљщјљљјїјѕєєѕїѓєђѓђѓёђёѓёєєХёяюэєэёѓёђёэышцщэѓђѓђѓёѕѕђђяєєђђюњјћњїљјїјљћѕєѕєѕєїѕѕєёїёєѓѓ№ѕѓјїѕяѕяёёђѓяёяььдюёєёэюёюўєжцьяэяьэњњљљћјјѕљђјѕѓѕєђїѕїѕїѕѕѓёєєїѓёюяђєїјёёїђёѕѓёяыыээфюёюхтыёяюэщљѕљєјѕѕєїєљєёѕѕїљљјјѕѓєљђїєєяЯёяёёяэёђђѓђяэштцюёђюьэщюьюыюёђђшщњјїѕїєєѕяяђёёяѕјјйѕёєёђєїјїєѓѓяёђяїхЯжїђђюяюшыяяэёяюыььыёёующццьѕјјљєїяэющчщщљѕљјѕёюёяєёёЪѓђєѕѓѕђьчулыяююяэщчыюэёяюяьяёђэыщцхщшѓѓђяђяёэьыхсђћєєѕѕљёђѓѕѓѓѕѕ‡јєѓѕђёєяшёшюыщьшщщьэђёяюёяёђэьыхчьыюёяэыёяёэёыюшьёёњѕѓєёђђюѓёєѕєѕѓїђяѓяѕђђюяцщыэюяьюшщэюьђэюыьшчхшыьёюєюђёѓєюёяююѓђэѓїјѕѓѓЦяђѓѓєѓєєёюёюёђѕѕѓёђяђяяшющчьёыыьээьэщчшщыєѕєѕѓїєёѓяѓђѓѓђѓєєЩђєёђэьээююяёэѓхьыэєѕєѓђѓёёяяьэюэыщшьюђюэёэѕюяёёђїєјљєѓїїјъѓѕёђяёђьюђэщыччшђёђюяююћѕєѕїєє§ѓђёёШшщсрушяяёєђюющёёяђєєѕїїѕїїѕђђёююьяэєёёюшхптрўђђєээёѓѓђєѓѓжђюэююяььцутсуцыщыыэчђяѓђѓїјёѕїєїѓєѕёююцщшяяЭѓђэштщђѓёёѓєђјѓѕѕђѕѓщщцьшшыыёчэчхрсрхшщщяяюѓёѓєђїёєєчјњєѕёээььщьюяьыьљўѕєїѕјїѕѕУљћ§јљюэяєчцьыктўчшхртрщьээяёёѓєђѓяёђђєѕяђђээыччьюѓђѓїєѓђёяѕћўўЭѕхнЭнЯйФЖЪЗЖЧЩухєјўцрчњюяёьыяяѓђёёѓяєїїєѓююёюыюьђєѕѕ€іљђђўўыУЪНiPVC@Ia^aEA+4Jr™žгмОЩРСхюђыэяээѕѓєђѕёђяёёяяёѓђяюыёђўўњўэž‘›^H@A)-\N094eMVL7%-BO3+\C\TA`W`эщчхуыюђєђёђэцтуушююљцљўјлСРЅƒdJ2:TALS?ABE<:CNL9<7!EOHS]@NA9FH3эчцуьёёєэюэяюяэшчшьєћщд‚PWL7327E9;@`YђьяыєђђѓђђяђёѓѕђшљўўЧЅjGNJB;C@>ACBPP8A<7:8-2924?AACFH@FC@?GNIC:9юёщьёыэььщьюѓўў€šчЊ™\9@JWMOFAB>;?FLOLA<9>?5>431;BE?;<9:?<8PNIB78ёюьщьыьшхржхчэшЩ‡bG]]LF8BHN@IM<:**:.JF.23,++0519>>4-1330)QG?(8>ѓёяэьюьятуёїгŠ{J@[uUEC859?:<>85.,.!&%&1&"*.?@44-+,0:>:7*--.*()*ђююышцчїўћН‹‘e``H\ZYa*78195787940821.++203>A@:<<3437C9;953.(,.,ѓэшьюћўяШoOGI33>GZPQ\Y57,&)%%079;N #!%10#"9<-8<72+135348?HBC""ёёѕљўшД–nd]|uG:@@ENH0,,-110.&$).-235>72,%&+-108:у’WNEYxk@EUL9^QB@?50)*9A9::83?<9:"%&,&,3)!&&,%)&&*04:k@.B?POE>EGJGIHE<4-3,2>@CIn%4.310,"$#0m[49IE0]^dC3031,*(%*371*)I770*%7p# FI@AFE@B>4#$351+414945(%8BFHB<<41>LMCGPHE;74:81;C?(.23(+,02B:( .EA;;>EF<2-*47473079;9>7A@G>BBC;??:AHQOF@:87980)08953471&**++,LdI;-17::%;@-895.23>;,1CB<:;?ACIIFCI[<.;B;::85384+(**&)..*))4"1350%;ESZIC#%934.*%GEGA;ABHLPWM7<.,-5<>>?>::8:)%*)FBG;(5?E:8}ЌРЌЇvMaЃЈОŸА\1H47.2>;8IEpI49BC32)521?FGF0.E94L@SBBc~Оњї§ўўўнўўгуытйНnc9:98433;30C*;AA:2.7BEPSTPH[SO.3Nwм§ўўћњњљљјњћћќњљљњњ§§ћўўл:7441575,%*9BB?>:I^\SINLNLI@F[tАтўўњљљњёћњњљљњњљљјљњљјїїіѓ:4::792522ь:@><848HOTGFAMC*9”рўўѓњјјњљљјљљјљћ§§јћњњћ§њњљљоїјїїј@GFBHIOW]WQOZi;A™бѓўўљѕћ§ћњћњћћњњћћў§ћћў§ћћњћњќћљћњњя?@CGLSWQZcU[bJFИўў§ћў§§ћ§§їћњњ§ћ§ћћ§§њ§тћ§§ћњ§ћњћњћ§ћ§ћ9:a[JQ^YM807хэцьўчОЄ}xrœ\3SZcacZZ;4EB@GEHPSSOF4GACMG3:75:5>;CBICGQA7%@aSLPWUVi`I*49AAFI@>F7@FHEEJLOB>G>1@AALJEш˜]]Up’YWubQkiZPQPG?>LOLGEFNQPIU,8;18:LAF:OOddYTU[W]Z\UOTJCBHPTY\{BAHFMEA<;:7E…YH`aFnr}VFCQJH@8ABGJAIISWM\VT^aZbjgae\\SWGMLQTI\j|5EPPG;F0JC![e[a\`WVNLFCLEFJEIGIMIICI\Y[WSHUMN]e][ZcW[IONS@&AVQBTIH<7ACGYJ5GZZUY^a\TJAIMQFHEHJCTYPG[TUZQVWZOPW^[gc`QLMPGT1WU\O>HSZLCТаНБ…\pЗМе–АФd->W@G@EOOл\OPSMc^ŽdHSVPPGUHCYPZ``@MWFJn[mVSz”бўўўьўўјжюща‚vCOQMLJIOSGV>-TWWOBIG]b`emgcznbEFaŒЎюўўј§ў§ћњ§ћўўі§ўњ§ћў§ў§ўўоMSHJGQEEA::L]TNSO]{ue^^k]cVU\oˆШѓўў§щљ§њ§њњћў§ўћ§§ўњ§љћњўњћњњсOSHHJICC@BHLTVOTI^ecii\J[V>LЎѓўўћшњћњ§њ§њњћў§ў§ўћўћ§§ўћћњћћтљћTSLOUSF@#UhOOLLM;\Ugtj‰Ui›НўўЩћўћўћ§ћў§ў§§ћў§ўћ§ћў§ў§ћћўћўћўjdhYAItdIk|bQ[[`Tdvq‡Иеўўќћљ§њњ§ћгўћўњ§њў§ўћў§§ћ§њ§њ§њўћўT^YY\`Wuwkea[AYwuqВўўћћ§њ§ћћєў§ўћў§ўћўћўћћўўћћўўћћцўњ§њћћўUTLS[gjqvnmci‚OUЏуўў§§ћ§§єћўћ§§ў§ў§ўў§§ѕћ§§ўћў§ў§ў§§ъўћ§§ўUWTT\kjmrxoovaQШўў§ўя§ў§ў§ў§§ўў§ў§§ўў§§јў§ў§ў§ў§§ъў§ў§ў§ўQYSOhbx]ZmmТшўўњ§ўћ§§ўўў§ўўў§ўўђ§ўћў§ў§ў§ў§ў§ўўё§ў§§jiq…œhm–аў ўљ§ў§ў§ў§§§ћ§ўўђ§ў§§ћў§ўћў§ў§ўўэ§ў§ўћ§§ўћўnTMTpАкњўўњ§ў§ў§ўўў§ўў§§ў§ўўљ§ў§§ћў§§чў§ў§ў§ў§ў§ў§ўў§§ўћўћћœЩцўўђњјўљњјњњћњњїћњњўћ§§ћў§ў§ўўњ§ў§ў§ўў§ћў§ў§ўўњ§ў§ў§ўўўїўўўљјјоїњјњѕњїљљћљљњљљћјћњ§ћўњњћўћ§ћў§ў§ўўў§ўўў§ўўў§ўўќ§ў§ўўт§јљїјїљїљїљљћјњљљјњљ§љњљњћћљњљљјњљ§њў§§ћћ§§ў§ў ў§§ў§§Ьћњ§јњїћљћљњјњљ§њћљћљњњћњ§љћљћљћњћљћљћљ§ћўњћњўћўћ§ћ§ўўќ§ў§ўўъ§ў§§ћ§ћ§њ§њўњ§њ§ћўћ§љћћћњ§ћўћћњўњўћўћћў§ћћпў§§њ§ћўњўњћћўћ§њў§ўћў§ў§ў§§ћ§ћў§ўўѕ§ў§§ћ§њўћў§§ћўћ§ћ§§рћўћ§§ўћ§њ§њўћ§њ§њ§њ§њ§ћ§§њљљєљ§ј $џўˆˆўˆџ0џўˆ ўˆџ џўˆџўˆ ˆˆџўˆ"џўˆ#џўˆ&џўˆ*џўˆ. џўˆ/ џўˆ0џˆџˆ2ўˆ>€ќШЯгРЮдкдтсЮУНажбепхсмйлмЧТЦЦЮйкмйЯгжЭЧЩЦТИЦРФЦЩЩРКВЋЎДЕЎЅЅЇКТРЛЋмЩеЫЪЧЪйлслЯМЪгупбмйаЧЫлпссгабжппеЮаЯЪЦЧЫРМЕЖРЫШМЗЏЎЅЊЇžЅЊЎМРИЖупнЪЧЧЦНаазмлмежпблплеШбпрсммстьшегЮЭЩЮЩЦЮЭЦВУЧТНЛЋЄЁЃЈЋДЕЖТЦЭУйЮЪРНЛЛЩддбЭЮзнпнмсхрЯФЮадЫШамлаЭФВИСТУЭОИШЩУЭддМЗЎЅЅККАДЛФООТ€~ЭбгТЦРЦШРЩеФЗФШзебйжлаШЪЪУТЦЫЭЭЦУЫейЩЮбИ™Ÿ›ЅЈЗКАЇЉЦКДДЖЏОТФНЯаЪЯаРМСРЩЪМСЛЪИЛЩЯЪЫЦЪЫйЯЫФЇАЕКЖНУИКЦЭФЦЯЪЛВЄЁЅЄЋž•œЃВИЗФОРЛЗУЭЛЖНаСМКдпрдММКОРТЭЮЭЫСУЧЪбЯИЉЏТЫНЗЕЉЎМЫУКЗЛИСЕДОЖМЖЖЕДЧбгуцхкШЭЮЮерчеЫЮгкзТООагбЩйЯУШОРФКЛЧЪМБКРБЛЩСДЛДЗЌЇООФМТИМНЦЯййЯетщхршщэьёюээЧСШаЫМБДБОФЦМЪЫЯдЩШезОИЫбЭееЯаШУЖЏЊЎЄЄВКДЗОЩФРНЪжййгбрмещюђѕђюшчУУИФСЉЊЁЏВЖЌСЫЮдбЧймбдаЛНИЎЊДВНФЧТЧСЫзллуцммжджзажьюышпущшыщххТМДЏЇРмжЗЋКЗЇБФйЯЯЮСЈЄЌЪОЋИНЎВЎЏЗЩНЖШЫКЗКЧФЪИОНерргбнуюыынжмлпнн€уЗЧМЯанузТЫШРСеаЧИДЖЕЖЗТВЎТЭдммзФВЎОкйУИЗЪЦОУЫзбаЫКТУЭнспннлжкжгждаЭЮЦЦТЏВЕЖВУНЕИТИЖЖКИУУНЛйЮФФаШЗаджжеЯЪЪРКМУЪглмЭЫЧгежгеЪдймнлЯЛЗШОФЧТРЗРРВНТШЦЫСБЖЫЩКДИИРУЩЭШИБЋЏЕАЇБОУУНРЛЛЦЪггЦШемждпддезЮаЭЕТбдЯЩеТРООШЧКОЛКЏŸЅКЗБЌДДНИНИВНДАЅСЯФСгЫаЩТЖРЫУКНЕДИНСЗМКЏЦЭРЎЈЌЖФЮбЭОАЗЗЉ”ЉЊВЎЊЅЅЈДЗЗЖИЕМаЩЩдаШМДМИЖЛКгбЩНЦЭФБЛОЉЌВКНКЕНИВЛЖЈЋЖУЩЮЮаЭУДКЌŸБЕРОЏЏВЖОТЧРЧОВККЗИТЛНРейлдМЧззЭЭдЧЗШЭУАЄЅЏЖРУФЦЫФЩТТШдШгЮЗЄЃЎЉЋАКЌНЛЛЪФКЈЉВТдаЩШЪШЩЧЫЦЪжжФОКЛОЧШЭФСЩОИВБЌЉДСггЫЪЮЧШДАЅЕЖНЏЃЈВЮЕЃЖеЫУФЫЪгЮЭШУЫдЧЛОСРНЫЫТНРЧЗДЧгйеЦЛРШЮЭЮСЖБЁЎШбдзйлрРСЮзШЦзЎАЈ|]<-žаЭЛСЭдзЪЕРдФЕЎЖФЮШаШКЈБФНАЈЃЌСТСгдЭЩЯЯЮЪСОЪЫгзнтуООМухИВ–Q0CWFЕДСнеЫЩУЧаТМИМДЈЛЧЪЩНДАЊЎДШЪЮЪклнсщупсаззгЯЪФЩгжмжеЖАЎЕŸƒ‰k9\‰ЇЭЄ‹АЭлЩбйзЩЫРНЕЗФЭдгйеЮбгшпруснсцмдектунспййЪОТРаЪЛЧНЦȘЅБpAŸОаЖЇДЮЮбеЯмгждЪЧФШЭгЧЫЩЩ€ЊЮлуссхмйкйеЫЪЯбаЮежйЦРОРРУЯЛЗУЖЋЈЎЖЊЎЮббаЯЪОЦйнледЭрпЭЫЧЛЦежЧЮйЭеучскбЯЧШЪФОРОЪжЯеЪЦРРЫзаЯйЖНКЪкмаРСШжклЭЫЫЪСШЧШдзЮЧЕЏМНЧУССТЭЭЫШдзйбгЮаЯЪВЛЧЗЎВЖЖКОТЭгаЯккУежггнмжЫЮежклаа€ФЎЌЗЦаОНСЪблпЦЛКЦЧгдЮУЮЮкхсеФЦЧЯЧВЊЇЅЏЖЭйЮОНЩЮаЩЧзлйеЭпйжйЯапкенм˜ЕзЫУЛУЭккЭЮЪЦШЩаЫИАЗОЧЪкжРОУКЛВЂЅЖОФЭЭЩЛСбЯгпзйуСзЮаЫЮкмпмпххюЯбцкШМЖОЩаЮМЪОЩаЧеШЧЗКЕКЫдЮЛЦФЪУМЕДНЛНЪЪВАЛЫТНЃШЈВБЧЫУЭбзТЭЩжпмнрЯбЮЭЧОЪЦШТЖЖЛЧЭШТТШИАЄЄЏЕЏЎНОШУЗЊЌЊАТЪЫЏЎЌДЖЛ,YN}|wЈбмёхещунсФЩЪШФТШгеЦЛЖЕЎЉАВРСДИНУЇЉАЕЎАЏЖККОФМСЪЮЧУОЛЕЖЭеа;!$24!BPdgghz™ИЯЧЛЭєуРАЉЄœ˜АФСЧЛАЏЅЁЋЌЎЋКУДБЖЛНЧЭЪзШЮЯШФТЪРДЌЎЕМ-3@+5*-.4$*?Y]gouЂФрЭЏЕ–‹ЌЗУЫМНМЇœЕСКЗЛЦДЅЇДНЭпусЮЪбЮМЕЛМБВЦЩЗ2>>8"!-<:02) "A-[•}ŠЗАЫкЦКИШБЇЉИНСЩНЛБЕЕЛСОЦФННКЦУЇžЌАЌЌВКС1.50*1:98,07?15B))0%(ZМдзЉЎБЇ”•ОФЛКЮдЪЧЩШУЭЮТДАВАЎЖУРЈЋЉЃЋДК)#*&*0+#4.!&<+$@!$n•АИ›Ž•ЈНИЗСАИЦгмтсеЛКЗЏžЄЇЎКЌЗДЉАВ"!%-93.;0&#&!)(.+(%1Q?5E\rnŠЖКФДЏРЏЈИКНЦЩА—ЅЊЈЏИЄЗЦеЭКБЏБО($%2+$$&-%!0.$&(TCB:8@2N*)#$H‡ЎЁžЃЉЉЃЎЄЉЇЉЄЁЎРЉЃЊЕТУаздЭЩОФ+)#*",(Uv>88<40"$&3<)1<>9:*$%A[j˜ЦРСБКДЌЕЕЏЈЛТМЦЫжпрткеЯЧФз4&.%)73-! .0*0#!&"%.  &3`]‰ЧнгЧЯймаЪантзЦЩажезЫИЧ:+$ #&$ 0U.I+ .97(  22I‚ЧчЧЭсгеуцчшутрждгаЪУЪ,&"02.$%,,+.?rˆb# ;C1 ]•ЈЉИТТОШбЪМЛУСАБИО##+(+(%,!$+$($"+11?4(%(   IW^ŸМгСМДЌРаТННУЦЛНРО9393"&)%!#!&+"$*(::-%;! 4%U…СыеАРЩМОЦЛОЗМНДЏ+1-:,+UVG #+!#-%$7>5+11)!!"(7:B?O>  9F(4[3G…ЉшѓязСДЛУШйбЖ.7>iI3&(->-+1, *%&Lq   Ф#+B>7$8>7HA8;A!2*U*  €›0!)+k{YC8nРпкСЭеЩММўеОŽSG?B$4GOC5#7837),*&,L@7  !   $+OFE1I’ЩЧКЮаРЖїєћ§ўћ§Ю›—iI(37.4@(.102 1;  ,2,>EH84>7:„ЫжрпИЁђѕѕќєјћ§§њЪяЯЇЄb+,49: $8   "*J59<0hЕтгУДјїїѕэєѓёї§њѕѓ§§љРgG?9@0--б *     52%0C@vФЭЩљљјїѓїљѕєїїѕ‹єњ§§ћ§ѕАSB*"%+#    *$:&"0+%!0C8I~ИдњјљћћјїєђєјѕѕјїѕјљѕьђїїђгŒE##!&&!% !##!351(+?nИјјїїјњЩљїѕѕїљѕѕїѕєђюєѓїУ9>?%%$,#    (&%?Ge§§ТјњњјїєѕѕїѕњћљљєћїюьуэуыђЛQ% ).&"%&0,;VY1!,>33+N91јјќљћњїїУјїєјњѕєѕїѕяёьсччцыћїжb9!!#.&!!(%,3##&3CBF25їјњњљ§§ЧњљјјїѕѕєѓьццшщящццшДЮЭ}\eS+-S?0B8(&#" %7875њјїїСјљїјљјњћћјњїњѕяэщьчщюэюѓтшїДЏНЮбюЩcCPHJGA4-:&#&$)1991>BљњњћћјёњјљјљјњјљћјѕюшяяйюэяяуюуЮМётїёЫœqd9*5IQO"",(#)*,%ToF§§ўћљљНћњљћњјјљћљїјјѕэєђѕђєёшююёѓђшэђѓцщЮцрc(@\`2"%8-,,"1..)-4ZQњјћљљћљљјљљўћљљЯњјѕѕєѕїїђѓюђюѓѓђюуыˆЋюЯuASogV?њњљљ§ўўўњ§§њ§§ћјњњїўѕїїоѕђђяэщхэёчСїљт–M+:CNO@1#.$91.,49§§єћ§§њ§§њўўћњ§§ћјљЫћљјњћњљјєїѓэђєєђцюэшчЊ@7>EEB?3028AC;-*8їјяѓѕїѕѓѕљћћњ§§§њ§ћћі§љљїљ§њљјїїјѕчёїјјћјэлq0G?<8:-%113хѕєюёэёђјѓђєђѓђѓѕѕєѕѕѓђёяђяёёўяёёШѓёююээюэюшьыьэыыцухцусмлежжпххсѕљђёюђѓёѓђђяїђєђѕїѓѕѓѓђёѓѓћєѓђєѓѓнєђёяђёэяьыыёюэыццутмпнкзкпртхрѓѕђєяяєѕёєѓёђєїїѓјѓѓкяѓяэяяђѕѕїѓђѓяяёёяяђяюьяэёёэшцпннрпсуххУщшщёѓяђяёёяяђѓђѓяёѓђѓѕѕєѕѓяђяђѓєѓёђёюєђёђђышшххыыяьэшышшхччцььЎыщшшїђяђэяяюёяэяѓёѓюёђђєѓѓєёююыыьђђяёяёяєяышукнпхцхсухтцуттццщщэшщэьэяђяєѓёяьяшяђѓѓђ€ЊюђяѓяшьцэщшшщыыьяяььэытсстчтстртхшьыэьыэьшщхщэююђяѕєђѓюяёюёђєђёёюэююьэшчщхцщыышщщььэяёьыычыхучыююєїѓєѓёђюьэююђьяэёяюёэяьяюѓёѓѓёѓђюёььщьяёьёяюььуцуххцэььыэьэюяёёѓёёђєѓѓєєѕѕЯїєэююэяьщцшщэюёяєєёѓђёёѓєюэяыыьыёэьшшуучыэюяђэюэююядѓїёђєєљћљљїїѕёьюччснлхчьчььяєђяѓьыьэчышщчшщээјьэьяьэяђђєѓёђєѕєѕѓѓѕїєєгђѓђєѕѕѓьщчыю§њьныьюыяяєёьщцсхтцыщчююёяюцчььэююЦђэюыяюяяёяюђђѕђђєёђѓѓєѓёыёэєѓђэящщыяыэюёэщччыыюёэђђёёяэьэёёюђёёэяяэёяѕєёяыэяюђђѓЦђєѓюэьюьяяьэыььэшэяэьяэыьюэьэђэђєђэщяшэьяьыщчшщьэьяяёѓяёёѓѓЬђєђєєѓђѓюёюѓёяђэёэяђээяёэьыыщэюэыыщьюэьшчцсхщычшщыэыыѓьяююёююэяяэђёёчђююььюяђѕэёюээыыэыщшусушююдэьщяюяёьэтцхцыэыђээщььщыщччхыьыьщшющыщурщэюяяэльцхршщэчурцьююяююьшяяьюычщщюэьёюєѓђяююнышьчьээьэщщььычуююђѓєѓёщышцтсьыыяыээяьюэяяььэяьяэёэёяыытюёѓяэюээьцутцьэяёђёђюьээщюыщчууЏшхцшёщэяьюыэыьэьюэюэюьээяёэьёщщьёяђээяюђящпксхыэёђёяёђьчюыьщылтђўюлпћљѓяёѓёѓяыююээђщюьэьяюэюыьэшщщЪьыэющхтсуцщяёюёѓєьэьэёёљьщеЌ‡rbЮњѓёюёёюэьэщэцучыэёэьуссђхччшььюђэяёёыььэюмѓђѓѓюьёў§шыЯ‡hŽ~пёьљьяэёёьычштнчьюяяЗщссхьяёэёюєѕѕђѓєђїѓєѓђђяяюђђѓёэщьцгЖРЧЂu–ШбѕкЦцщьђююёђщыххщшьэяээьэїљѓєєѓѓ§ёѓђђ§ёђѕѕўѓёёиюёэюѓшщчѓЮЯхшЏzУляљюыщёяђёєёѓѓђёэщтчьѓюяяјђѓєѕѕєђёё ђёђђєѕѓёяёюяюяяюцчцэчтыысмјѕѓєьэяђюёђёяѕёюёщстшэюѓёэђђєѕјѕєёѓђююяюёяэяэёююёяяёѓюэьёююэюяээюђяѓђюющьїэытсцшьэяяЈёяђђѓѓєєїѓєђёюєђьэшцшююяђёяяђёяюыюёѓёёюёђёђђѓѕѓёѓптцюьющьяђѓяђёђюѓяяюёюєѓѓѕѓѓёёэьщррхшэююАэьэђђьђяяёёѕюєёёєѕђѕѕђєШнучящчщюяёѓяяђёѓёђюэьюэђёюёюьючучыыэяяёюяёяѓяўњєєьэѓэђѓяя€†ђєѕѕўёэћњёььэяюьяьѓяюѓэёэюыььыыэяьяэяэщычэђяюящщчэьНуШзЩмђьёящёюєєђђёюѓююёёѓьяээьыыьыэюёэёщучьыььыэююэщыьэыэщьтцшэь9a[~ŠМя§ўўѓўљљјыяёёрюэщщьыэющщцэьыэщьцшцщыщщшыюяяюёяяюяьыэшыэE22@:)Fcwzrv‘Нтђяяёўўяыттпхцщяьщэышуухцщыщьыыщэёђѕёѓђюђяёэяыыэюы?JIE,1C>7;<,1Gopt‡˜Ощћ§эцеЮцьэщьэчхуцыяюяшщчщшщьяђяђёюьь€Bюьыьыья0@G:937M;$:8;>;r–дщѓсцумзлщуыёюяюяьюђђяэьщччыьшчэхттущш(($-77:74-52;998+2E51-4L3;ЖжюкЪЮкушычэьяяёёяььхчхцрпцыщяцучшч%%&1:@89<8134751&(-B>ACJTF8J]vŠОсшёхчрухтхшчярбрсспйууыыэяыьющ#+*-$0)$$7755978543:`HCHIFFLZC<1-QœгШдйрртртсухтуцтцхчыэщђѓђющыш1++.(!..,$V‡F>;>;.+788.0FB?M>020:JgtДрєёщёщщцщыэщэёяёяяёёѓђёюяь552515;+$>>590++-()!*1)) ).qpЃыўљёяёёђїєђёёєѓєѓёюээщ?51%1#$$2V?O0-:5-$!&1) ?>Qцўїюјїёяёђѓєёюяёюэыюы#-#34!-,+.4-!+B|˜b0>G3($$# 1)(rЄœЫсттщтшььшшьээШщшщ#&-0)%.4&#&&,.1"*. 5(5?:2.7-!. 7%VgqЮёїёшхщщ–эьюэшььыщ32;5%++1-)(1..+2.??8<17((!- 4 %<-`™цўўчёчыщщюэьшшых2)97*1@[NM*011%"(,1EHBJ+*С  Z<-LPqУкёюччшьюььэщы$*-7.-)(<@9.89%(-"%2FEGT3" я 8N7BdBnJ22)7BA1.-#".19!Oo # .*$@.AFde[Z–ЧнртьяёѓёюU[eQ-:A2"8;O’юўўљщуљјј§їњўўрћњьдЏœЉi,+,8E7922( $  &*%B?A4;LM…щўѓћћ§љњљјјљљј§љ§ўў‘љНŒ^C.*92,##5;G,(04857;CAU’йјљњћњћњљїѕѕїљњњљјїјјњ§ўўєй‘L($&*,*--!&$!",&!#+-?9C88G}дњњљљњљщјљјљљјњљћљјѕї§ўўЦ5"@C,,т& "$,$ &.8?23FOo§§љ§њљјјќљњљћћ€ВўћљјєїєљўўЛ[.(!1"$*%"&*,22;V]9)38H@@;UB5§ћњћћљћљљњћћњљњјњљјїєѕљїјїљўўуЅp7-+$02*"#&(!$&+44*!"(.2FCNI?<ћњњљћћ§ћ§ћ§ћњњљјјїѕєїѕїјїјїћїТпэœ•™…ao^93^B4H92,$,)&""-1>AEA@љњљљјњјљњћ§§њњЫљћљњљјјїїјїјјўѕћўЧИШрняаhEYBVJF@5I-$$,,%#049@@CHHў§§њњіљњћ§ћњљњћњњаљћљљїјјљїђљѓсЪјш§ўеЅwjA)BEOQLU;2*+AB§§ўў§§ўў§ўћ§§ћћ§њњљљќњљњљљ§њћљљоїѕєѕїћюнўўљЂU*#8OTJE;>90>@><@A§ћ§ћћ§ћ§ўњ§ћ§љћњњћХњћњљњ§ћ§ћћњћљљїєѕљњ§єЗEAHIIC?<7>@AGA28>љљђѕјљјїњћћњ§ћ§ћ§ћћњњі§ћћњћћ§ћњљљњјшљњњўњўюt2BFBB::757(;9€ХчщчлйюььђютрмчюѓяєђёьщюёпстнршчюыххшснмсгаегйммнаЫРЦФШШЦИЗЛЪгабУэчццтпцэяёычбкщђяюьщтмрююээщщьыёючтчцуйнтеаШЯлчтйЯЫЦННИВЎЛОФбЯЫЪюяясруулшцюьыёѓѓёшэюяютуыђяяэёђѕёыутхштрлхузЭзнмЯЪОКВЛНСОШЩалйукэшчегг§ршцц€zпьђёяэёєяцмхчшнйуэюхртдгезлсеЭймбсышгЮЪСНбйЭЧждЮбжждущызеркпжрчмкктшшщщшэьнснрлдучцмЮсшщцтнЮЗЕДРРббЩСЫжЯЦЫШЩЭбеблпкрпрдйнчсмйжмбзнччтлнтщхпмСЯЫЮЩееЮазммзруаЧМЖРНФЗАБКЦЭайлеЯЪпсгЮгпаЯашяђшжбЯдммцхццпллртчдРУазФЪдЩУЫрмЯЭжжбШЭзЯеЦбдЩжыыѕђѕыксрнцюѕхснчэшклеуыщряхсскежгжзкбажхШжулЦТЩЩСФЭйдмнжЮлтщыэтьёїїєєѕєїѕјјљлрмыукШЧЪйнтзйшщьлмшшкжчцпшшрщукЫЩШСННФЧЩЫЯмжпйтшцшэтяђѕѕњњ§љћїѕцмЮдеНВСРЦЮЯЦбптшцкэыыхнЯЮЦЩЩеклнркрнцыэьђяэьэёѕяэюѕѕєёђѓїєїѕєђѕбЩСЦкљюгОааТЭпщшэтЪЦМЯмЭФбдОггФдсбЩлргазшхцмагцђђшуэєѕїєььюьёёюёЯмехшѓяэтнпкйшмжЭЫЧЪбзлгЩмщщьюьнЪФдыылЯбццесцьщшцйлзпыюѓэяяюььэшхусрккжЭЩбЮШбгЪддггЯЭЮкмгдыэтхшмЮчхщтцткййЯбкпуыьуулхщчыцпцэюѓьхЫбмкктт€ŽгпднлкжртлЩЯссгЯЮЫбмучржЧСТЩШМЩееггзаЭкхцчрмущхшэщтшшуцуЮдтчспчпкжжсмкбгдШЎУбаЮЪЫбгбжгаеЯУЖжпйжщтыпаЩбсбЮЯЪЪЮзгаЫбЪйсбЦМФЯйтчшзЪЯаУЖУЫЫЧЧЛЛНШааЮЭатнрццкШЧлЫаддщынйкслЮЯаСРЭклЯЫгШЮжЯУТЪнтшрьхзЭбЧЧ€ бкбФЭЦалмскйзЯЯЭЯгжжнйчыэхдкьшхушлатхпдРТШЮЯйклцхкдмсчмчхЩРЖСТЧЦбЮЯажплаСЧЭмштпкуплйтупцьжйЯбдрмхннцсгЫСКРЯзьшрмхймЪЪЫЭЫабКНЫчаЗбчьхмцчшыцсдхрйЮжаггусегккаЫнуцуйггкнссжЫЧКФпчхчыэђбгрэсбьЭЫЧˆaLBДёпгрттшзбЭчнЫЦЭйнсынЮРЧаЫСОРУбезьшхзтнтпйймнчюяђѕгск§љЭгАdI`hTЫЮлєцссгнчлЪЮЮЦУжцунгЫМКОЪзпнмщьђѓїѕєючьяышймрцыђюьЦШУЮЎ”ŠžxUqЄВцКЁШлштрьцхраЫЩЪзмхушртцыѕэюѓэщэђьшцюёђђѓяђысдзйсрллаккЋЉОЮ‡\ЈНЮьдШЧщхщшщьэчшслеЯдпкллнруэѓёѓяяыыєьтспьцнщящнзз€~джкгЭмгЩНЦбФЦхщцшчмкзьђььчщяёррЭЧещымршцэёјђёуукпрлкмдйцчщсткЯсщшчьЯкднььхедсыёэурчнрпйнцупкШЫбелййлкмцнтуєэыырчцргеуЪСУЫЪеезхурсщэлышчэђьыхцщэюђэщшсФФЯсупгнхщяюйгЮпмычштшхыѓѓымрхусУРООЧасьцжепуютсьщыьшёяяэщыѓюээёЋВЯщузЮзсэыухуйснэтзЪадйкщылгмеЮТЛТдлсцхкжжчхыѕёьѓнячыршэёьяђєђўцхљїхкЫлнхумсзнцмчснбаЯЯлхнжзсуйеЮЭбажурЯЪерпеОцФЭУмнмтцукссыѓђєёчщцхнзпзтмЮЯаепжзксЯЫЛНЫЪЩЫЪйпдЯЦЫШЭнмнЧЧ€јЭЯдBqk‘Œ‹Зљљўљщ§љђњйнпукзхьчкагаЮОШШггЯЯеаФСШЭЫЫЧбгбзлзйххункбЭЧршшQF>NB9\q|}mxŽИЯшржтўћеЦСЖЗЎбнйргШЭСИТЪФЪгеЪЫдеглнтшрцюпспуеЮТЩЯжS\VO8:OG?BEL8>ILCNVrV4Jhx‰zЃЮбзЭЦкЭФЭЦЮкнЮЌЛЛИФаНЭжыхбЩЩкл:<>L@CJIECEMI@NHMC?M?-i–NGVQLF2BHJPCCcUJZP1@<:WvЏпхпУгЫФЮаЭФгпззмхюэёыууцпщHMHCEILU:SLFF5#&EJE<.@?>;0+*#*#)8>z}ЄкѓчйчяююруьёшнрцчщшржйQUC:;C1<909@<27;,.QjYdM+EPM55)+)!$-,!!HJbœчўхсђышэђѓєёёюххцптнт@I,C7YGUEEAFGIGG9AY˜В~B3Mb@$775+3.0E5.rЇ—ЅТСЭбканлмЯбздШЦЭй5<EP7EOM;2%!-*57H%%)E+3`krЗзцжЯЭЩжммедзгдекжISHBGE:I@F>CEICECJ2-QZPPMO:&2-)"()G.+E4cžлўђЪйндйлнйеЮеЮЧ@LHJPILreV(?BHG@A:B;FFS^UY@<%#"#%#5hC+O]oЉКакТРТЫбЯЩЯжЫC>MFO?HTN\EJMJB;L4TTod^ŽЊСТЫтчыыяыadzdELZM?TVQa[CWa;@L7A>MBo@(.+$$!!Ј):CI@&Hˆ—x`H…кѓялтчуеЯўчаЈZSJV8JbgQC;HLNIG?CBGa]P)77-%)))&1I@@?15,9(+,1%&))3?EM\C7A@CHG:J]Nd—ащћћ§§ћўњњљ§љ§њўњћљ§љ§ўўЩхЄW:*4:B5>>?9;?4#%(-:%7?>>99E;GLOQG?Y‚Яњў§§њўћўћћњ§љ§њњќ§ћ§ћћўйаG2MUH<>;3+75%"-1(IPB;TW|§§ћ€ю§ћћљ§њўћ§§ўћ§љљјїїўўЩc9#2%&A-42E:8493AA?IUdmM89CEaIPMcJE§ўћ§ћўћ§њћћўћћњћњњћљјїѕљїѕћўўыœzA71)&7EH@2-EA<7<>EGC<7>>JT][`HHћўњў§ў§ў§ў§ўћўњћљњљљѓјєњїњѕћїТлчЂЁЄ–twnE?n[F[MF-E8:8>2;@@J2OUZZYћўњ§њўњ§ћў§ў§ўћўћћњњљјјљјћљљўї§ўЫЦЮшэўсwWjagaWOYa>4;99єB923;;@3;13EДВДВЗЌЕЏqmdv{vqrvwБЕДМЧМЖИЃx;%!(3+-G$ :)&,;[INHCCB77>?GF2.98)A[|ИрЭА„nrnz‚‡zinwОЛЕЛЩЭЮнтыЪ|2HGCSP9>4139MEJLIGC;,((B>5:;A*.8HМЫКŸŒuQ[ccq}vdjƒТРЩЮЪдзчђьМ—aA>MO7EMNG@5-.2-42EFGA92#,%317>@A-,+GQUoqwib]iŠ‘Š~tnййзлсщььяхЭЗЖЪУ™^74+:GC:4)-).2;@?<>;<>:74-..7WI>2;Ghtagz”‹ƒzu|счшюёё€ЌюьшйФбђјёЛqZ;9NEA8@0&,(4%NVTB92+3457,3:@;.(1Jn‡›‰wƒяѓђёыэыэьююээюёєјёЫa@I>8EO<,4+49:<82*&!$3,:949E@87251,C;S|ЄЊŠ„‰эёээхушыьшэчыьэячщђИŠZ8Q`NP;@>44<3>IB-()(():B7$(*7447)%1:YКФпшюяюэшш€”цттрпйпхчпсёрЋoVIWB>@FCIOJF#"-&*44(#*,7519-03bЅСйнцурйгбЯЯЪФШЫмйЪЭЫжхьутм’L14@>?873AP1,08+$214"*+((-2#3?ЩЮзстжЪЪУШггЫЕЁŸИТЦМЛЎЎгЪŸrM332A883FE7&(9230&$)#4--%&2;@CCP;?2гжммкдЯЯУамплкДЕНКДББВЂЄИЦЕЊœS>C]WLIHC:.,)3;212+$!!#101-,15#ЮгаЪЭЯЭЧУЧЮШСМТНАБДИА™”ЄЎТМЂАЌ{P@;:B59F;-"%!$%-*%-#5:,.!ЎЌКФСУРУТМНТОАЕУКИОДЌ˜œИИЗБЇОСНЇg*8$3;($"$(&%0ЮЫВЌЕМКЗЗМЖЫкнйдкпрркрпЯЩЪЫдппзеЯСЩхнЕoP?(13;CO]E*$&&*"!мЧОРзлгбкзЮЯмнпзйзбЮагЫТРСЦЯекбЪаксяљєйЄ]HPE(:3:>4A;")%нмжгспбЩбдаЯЮбспаЩФалкЮЩШШЭакк€пнчтрсщхнЮЎ|J.-$03>8(!!- гзнймсмЯбЫлеЦИФУЗЕЖОФЭЮджЯбжлзйнрпмнмжЮжЩФЕˆhggCANP"!-12#$УШзлпрсплезЪККТКТЧНФЧЯЭбаЪЩЫЯзнпхмЯаФЋ–—œžЋУЖ…vM:$(,22"#%+.$#гдаЮЩЩФУЫЮФФЮемнеЭЩЩЯгЫОБМЩезФДМЧЯУИЌЈЃДЕЋœЉТМШЗz40>41%#$,.+бШЪШЦЫбейЭЧакнтцрлйздЭОИББЕКРМЋЂЂБВЋЋЇЄЈДЖЗЕБВНŸ‰S(3?E-#%СРУУЩЫУФЧзртмрстрцмгаЖЊКЫбЦТФдеШРИЏЊЏМКАЈЄЉЛЛНЮНЏž|H;;+$)&кЭЧЎЉЎЊЌЦеЪСТРНЂЃЗЕРОЎАТнсмзШИЕЛЮЯТИЖЛНЏ’’œЅЂŸŽx|‡•z`L5<.)!#,ЯИИБЌАЌВМФТЫЫИЋ™’—ЂКРЧЭШЧРЧНЎЉЊАЏЋБВЗДБЈžŸЏЉЎИЋ’u‚ЂŸ˜”tUH2;A,++€ƒНДЋЋЌЖДККЧЧОЕАЈЂЂЗОЪдЭУТЛУжккнлмЭИАБЏЎЊБЛИМЖНЧкЭЂŽ•ЂЁ—?35%:IGНРИЗРКОНИББТТЗЕБВВЗСЧРЗНВЊЊЛЭШЩЫУБДРДЗОЛЛЗДТЮЯЦД›ŸЂЂŸŸ›ŸœŠ~V@%-ЩЦИЏЗРЦРЖАЋЏТЩааЫФаййЫИЏЅВЖММТжбЦЎЊЈЌБЗМШФЪеЯЦТОНЕЌЅЎЌЁРЯЌЇШШH?ОЧЩФЯдгЦОВЇЛУНЕДЊЋВЗАЋЇЈЊКСРИНУдЗŸЃЏЛЖЗОТенСАЕБДОЮЩЧЩЦФЩЪЛУшюА–ˆЕРРЗФЪЯЫЕЎБДМУМКУбЧЕБЗЧФЩЮУВЌЂŸЂЄЃИУЩЩЮЪесуеНКЛЎЌЕЩЩЫЯежздЩгТЁЋЖЛСРЗЏЅЉžŸЂЅЅЕКЗЗЛВЇЋЈЄАФЧКДЋЈЊЉЁžЛЧЮгекпнаРЕЗБЁЃЉДВЖЊ™‚ŽЂЊЄЎг˜МОЛКЏЈЁžЄЅЌЛдзНŸЂŸЃ—ЄБИКЎЉЏЕМКЕЈЂЏКРЂ™ЇНйЦЖККНКБЌЉБОНЗДРТВЇЁ–—”ЅЅЇЊЅЈЊЅЁЏБЉ›Ѕ›‚’’ЁЈЏСЮбЯЗДВВАБЛЩущцеЛЊЈДЕАЎОШИЁžЉЏЗТЫгЯЯЫЛЕЊЁ•ЎЁ›—ЎЗБЏЎЉ•‘™ˆЋУЮшжСЪСКСФЩЧЪЯЫЯежжлКЛШТФЭйцНЁЄЋШЪЛЖФУЦЩНЖДЏЎЗНБАНЦНРЧЧЩЯВЉЌЏЕОЦтутуждгмрнжОВИБСТЛЗЋЌЋАЗЛФкншзШЛОЦЯгжзйпШУКДИЛдЕИОЧУЩжзбФОЛФОКФббТЧЩУФФЪбааЧЖБЉАЖЏЋЖРЕБЋЌВОЦЫЫЮЩдмзаШОЊ—Ё—–œЉЅЦСЩаЪбзссйжлйбТИЗЛИВВЗВЕТЦМЕИЗСТЕВКЧШджеЦДБЉЎИРЫейЩСОУСЕЖЗЌЊЉЕДЊааЫИЗФееЦФЫЪФСУСЧЧЮЭгбааЯЦРЧЦКФадЧЧЭдбаШЛДАЋВЫйкеЭШСМНКРЦЯкЮЫмЛЗРИРИЌКТДВЗЫЮФЛЎЊЈАЛМОЩЯдЮСНМИЛМОТОННОЛИББЗКЕСУУЧОБЕСНЛТФОУЧендТЖОИЗНФДЏИДБЇАЗЎЊЋЎДСЮЧИНУОУЪаЮРИИНШУВВНОРООЛОФЖЋЊЕРФРЛЕЎЈЕФЮлгЯЭРЋВАВВЏЖАВЕДЌЊЅЇЋАДМЪЫУНЗКУЮаеебЮУЕЋЋВЛОКЩаЮТЧЧСВЏЖИЛИЇЂЌДМгпезрлЏЕДЕЏЋЉЈЇЏАЉЉАЏАТЧЫЪЛЕЊЖФкушткеЪЛЕОЪажжбТЕАБАЊЕИЦжнгЉБСТНЫбТЦЯЮЎЕЛИЗЖДДИВАЏССЩЧФТЦМАЏЏЊЎООИЛЛУФСМЌЅАНФМЧЭЮЮСТЭсрнлЩФТЛЏЈЃНЪЪЯЫМШИССЩОНДВЎЉЊЏЭбЫОЗМДИЋЊЎАЊЉЊЈКажгЩМОТОЛЕОШЧТУЩбтудЩЫййЯЌ—™ЊДД€-ЊŸБЊЊМРРЖЈЈЋВДКЩЩЦЦЛНЎЌЇЅМЪИЖИЕНЭОДКОЪаЮЫОНШЩУТейЮллнЭЦЏЏЉЈЅЇЏБКУШЖЦЫЫЧЦНТСНИФЪЫЦЧУЗЖЋЌИИКМЕЈЋБТЛБЈЊЌЋЏАВАЖЗЁ›ЃВБŸЈЃДРКЋЅЇАВЖОЛСФЖЈОШНЕЗУЮЦООУЪЩФдЧКИНСФУТОИИЏЏБДЊЉИЕЎЉВСЛИАЉЌКВЈЇЉЊВВЕСТЧЛМЧйлдШЛУЧНТбЫЪбдкжбЪКТМИНанкйЧЛЇЌЕФЭЦЖЌИНВАОЫбжЦРЭЩЕАОЭЫМВЕИЦаЪЩемхрЯгНФЦУЦЫеЪЭбккЯЦОНЖЦШЦЦЮЮРЏЎЎБСФШЫРМОФЮЫЭШЪбШЗВЗКИРУНТелкпрйлшырЯЮМЗЧЪШЦежЪгзлжТАЂЌЗРЦУАЏЎЗЫЯУЧМККДЎЎВИТгзгЫЦЛЕВЌВЗЖИЦЩазнжзьаКпеФсгЮЫЩЦФЏДННУЧНЖЗЗРЕЌЌЅŸЉФжеЭйЧЛНМРСВ›ЁЂЗУКВРТИСЦУФРНРЕОУЌЪб‰ЉЮлбцкжЯШЦЪШСЖАЌЈЇБЗМТЇЄЉДНОКРДЎЕШУЅ–”•ЂЋБДВЊŸ•ЎОЪеЮЦНЗВœ™–Œ‡•Ђ~ЧушдЯеаСЗКОМЗЏЎЌБКЏЄЁЁЊСЯзйбНЗЖТДЇЋЌЏЈЃŸЇЊЁ”œЇ‘ЈЫЯЁВКЛЏЄЌАЈЌВЕБAЭгЯсррхмгЩаждФТУУЩЩЏБЛЖРЛРУКЊЌДЦКЕЊЂЂЈЋЏЁ˜—ЄЂŒŠЁЅЎЖЛЎЃЇЁœЋЋЄИ>SЌрщчтжЯЯТЯзаЧЩдуждмппгЦУЩЕЎЄžЗФЦЧИЊЏАЋЊЊЅ—•›ВЎЂЂВЕЎЅ—••—$\ЩцшткЯШЩУНШЦММКМОЛОРИЕЕМЖЎЕБЕИЗЖЎНИЕЎЊЌДРбаЯнраЦМЕДДИОЕœЅЊ—’”,:ŠМдЮнььхуупзЭСЧШШЦдкмжЮЯрхуутушыэцмжлзжеЯЧНКЛМЏИОТКДООКНЩЭУ@7(.@YЏышктщььщычхсдаСОНЛТбггппрезкутрдзмсхх­пмдЯИВМУгйШСЫЦАЎАЏЖ384*1)iеэымнуччщхчумззаЭЯТФТТШОДВЎКЩдезйтшьццхтегЧЧЦШЯбжмедзгЩОМс€чрсѓчЯ–I*N585,)?\QOLJJGCBIQUUIBALATtœШэўїтжНАЗВНУФТМОМшццхцёёњўўц‘I08POHYTA<@94:LJMNLLHAA>CAJFCGI?BAMˆЪпгЫЦЖЁЊЉЇМТНЖЖЭшшчыђђєј§ћтМ}SHUP;OUOMF>9:>?:?FQOIE>C79;901B9>HICCEC@<:>?-JY[F<>BEAC@??FHGH7>@E?:B<57:CABABFFэECNBE][uЋнуРТЪШєєїєєљѕїљїїѕїїяјўўЫ‘\>EABBAѓ<@UOCY’УЦЪзаєєѕїјєѕїїѕєєѓѓŽђўўњЕS4CJZL?FEFFNSM53011.18<@?>C@N~ОнєѓђђКяюэыэяяюыєючыэюљўўњѓЅV@A?ICFCJMZC?A@?:298?548GSMVPHBB914.)%+434;::?;HьшрпуччххыщщэяяььюёяяююяюьэюьшцњћяысЋd;?B8<2"4PM?9*1?CC;59?:71+>ючутщььццчыыюђёђёяёяђёяяўыяятёээчтїёТuSF4?A?MUnJ53703.29:977ј4-ђяююэяяКюяёэьёѓѕђяяђђёяэьэяёђёђѓёёяњўўцВdOWL4B<2535ююцхсмрцшшьэьцуаЯлнууцчыьяёыцрмнтчутччумйджекзШЛЖЩЮКpWOI78>959:эютртсхчшыющчшсмлпххььээщыщщшсрмлмрутусннррхпыхбМФсмлаœq]CPUG@>;эыцсухыыўчыыњхцрсуыыюьыцчщыяђюяьшучцутчч€Хщшээя§їсЭзеглгШЁZH>7?WOэщчшшююьшуухыяэьщыюяёюэчщшччцщээщцуущцшьышыььэьтдкзймнгеЯМЕ”dGCCэыщыюяюышцущьэщшчшшьэщшххтццшээящхпхтсушщюёьыьшччцтххцльѕумёу—]Tыыэююяёюьщщцщщцучшщцчцчцыщьшшцщјуммххчшчяяььшсс§учььўюяяјщэўўеЛЇыыоьщщэщппрхшшьэьшшщшцчыьщщтккнкбехщээёсющчцрййртщьыщыьщьюькмхыыьщхтпрннцхщюэчснплпуццхустхччхкзушыыэћьщхтннжлпнстжУБУарснѕсбшшщыштнлкпхшщчюммлрмсушщчуузхруунЮпхтЧЦЩуїурпуурпмсцчшчхчцтрппкгштспссЇпнммйаегРгблрщыыэыьщьщщыьђљњњїщрйкмкруцтлжкпцшчщыьщыхтнккчрммпрхчшчцпкждЦжцюѕўђѕьяђяяээьээЛюыїшччыыьэњтЯмрсцщыыяяэююычцрчутххчыьышєтцуруяяњњѕѓѓёѓђєѓюэщтцчыщсууссфхыыэїѓцхцыэююэшѕэхмртныющюэяяњёяющьшшщіьццщыюьщчццрќптчыыГющтптцшщэьяээяэыхеСФЧейккыыэьёяѓёяёёюяьяёяьыщычшщььшххцчшщчыэђяђэьштцчщюёёэьччёурмллрсрйььщшшээщяёђѓёяээщыщыьюђёяююыщюээ§ыьээШшцхсушщяёёяьщхсухччѕѓєљхтщщхцщшшьыьыьюычцчцчэяээююяюэюьээюаьщчхустуцчщщуцыьчшщцтссыыьщумщщччтхшчышыщшцхтцшээОюээюэююьэяюэщшщщцшшэюяьщчттсцшыыунрптыьюэщццухууцтхшщьычшцхцшэюэяььєюёєєђђюэщшыююЫђяьщышчхтхчыщчтптщяяюёэыщшцьыэщцсшхцчшшщщэьяяюђээыяяђђ†ѓёюьщучььыыьэштхщыяђююїтчхчыщшьщыцэыьэюьыьчыщыхыэяэьшцчууцчуушщьэышчщщшщыычыьщьэёђѕѓяђёюэшстушьчтпьэщьюэщхттхущшэюяьшыухуччуьюђьышэюььщыэььяђђ€–ёюячтнпсхыцрсышьэяющхтхчыюэяёьщцщххшщыыцушьыщщуццшышчышчхшїєьѓѓєющшпнптхшээьышщьяяыюээьяэюэяяююшшщщэюэыщцшцыххутсхшщхрнпнтспмйптуутрхщыыщёђяэсшьэщщыьяяэѓюшььщьяёяэььчч–устпхццчщьщхуццснрсттсшььээююяюяэящэяёюыёёяёђђяэяшчщяьэђёячшхчщыьыьчшщыщьюьююшццшчщщчтхэёёђђёєѓёђёчцшщыэюѓѓђНёьштччююёьцххуцчшыьщщцхыьяђѓєююшууцчцхщээяѓѓєѕїѓєєѓяшцэююђэьёюёююыххˆшьщчцртчщэяььышшххыюьщььщщэьшщщшцхчььэьюёњчжѕѓёў§юёюьщээьюьышццшхчспмпхщьюёщяяььцпнеагкшцшцтуцыяээшчьщчжьябМзђїьўїёяюэщыы€€шурссучццнкрхьёяэюьюыщцлжйзклнрплкклмцэьыыььспмйгдФЭсхўўђёюьэьщцуухуцшчхспучшыююээщщццуттлклммлккйзЯзюѓкцччуусрсууцшF‰юѕѕљєєёёюяэььээюђђяьщчшцьышхутышюэшсрсуппкйжаЯЛШззкрххсййллннхB\БнїјёёѓђюѓёяюэяёюёяьяююэюччрптсчышшщшцурстужЯЯкхупнптцчслйкдгг$1iрўўљђёёюььчцхтуцщышщхрпсрнмсттутхрппртушщїћљћћљѕыышыщшсукжзбд3?PŠщїёэюяээычхццучцшэшэхстсллмсуусплзпрсцыьяэщщчшчцчщыэыщцхгЮат^Q:>ЗўўёёюээєышщьэёяёёяэччЧтшряяѕѕюцєлбчшэяэцнлхшэьюёёэяььэьњњ99:(oэњљёѓђёёяђююьэьёяяћёђяэёёѓШѕєѓђњїэюёяюэыурчщщяёээьыюяяюэяEE@8AžщљђѓѓѕѕєєђѓђђюьыяьяююяѓњєѓєѓєёёНѓёѓђёѓёюыцсщыюющшшыыьыыэ?<4>FbЭўўѕїєѕѕєєѕѓяяээышььэяяэяыюьююёяёяёёѓѓУєѓёьщшщэюяёђющщшщюэ;8>781rьћљёюьюёёѓђђяэьююыюччььышхтухыээяёѓѓјєђёђюяэььяјэёяяюяэымКФШЭтгК‡G0>QSOLGGJ]EHAFPFPLOOPLT\YSUU€єZSTIFVŸаЧЦФЫФаЩЉ‡‚}Š’–ŽŒ’ЧбЮгйЫФдЕŒP<>GJOPH\I,SFCJZpeedYYVTQY^c[YSUSIUz”ЊбљуЦИž…{ŒЂЄ‹‡ггФЭзхнѕњўн‘H2@daekjS\PMHNc`\QV[ZVNSTUTULWQJGL\”ЭтЦВЄ’q{wv‰–z}ЁжлнпкшяїўўгЈoMNecMcibb[QQUNUOQYaa]TMBJQOJSQWYLGL[kc‚„ŒƒxrЂЊЃ‘‡‚рчтчюєѕѕљєнбЪпмЏpOFPa[ZVCGGЮCHNSQWZUOPNMEMBSHSjiUNO^}›’zr”АЄ›‘Œ‘яѓєѕѕјѕњѕљцдцўўЪа‰iQOea`]NIACJIJAZcr\WNQOQMJMOVZVJ<9::CB7IFMQTBC@BILOPUTGGPzБЯяѓяєщщчштххпплюютсршєўњїэЇ\EGSYSTTW]bGMIHO;GEJJIAB@AGCHTQQA799LZрсыюёэухкнуыуЮЛНгдлззЦУспЕ‡gIEOVQNQ]]UMGTLELGGQ?JMQCIGOYV`\i\ZIтыььыюшчжхэєьэСЩдаЪЫШШРОЮлЮУЏeO[tp^`^cQIGPFCHJHICHE1@9:GMNMLPJI?цщтпмм€ЇтмнпнкджжЪЫЭаЭЗЌКСмеМЧФŒcTOV^S\UUF@:5@EAECGE@::;@ABEEBJVQMGECFЫбйаУжйдЭЫерммдйетчтЯЮлђщпбаЫШзууЫЏ‚WOZaY`VTLII€ДFCJE@2LцпЩЫЮмЯЯдйбльяыщыюэђьяющртучьюшьузеёђЫ~bVEMOUWhVFMGяргзыэычшьрсюђёэщьусхчсмгжмццыщцыѓэўў€эСr`eZEISVTUUQGA;;9C?EICBEюяюыёёухушчыщщёѓчскхэяцуммпчщьыяђѓэюјїютН”^C?AN<,GTNBE?:-AEC>;;?чцэёѓѕюцщцььбЯжйЩЪШеенхьэыщэюэщэяёяяьшхэпнЦЃƒ~cNbaC7B:>9QPE:8>;жмхььяяьщшхтЯажнппджлткцпккмпшыюэыцхжНЇЋБДУмЭЈ•aP9BLSJHEHMJB;AAтшшцтумстхззтыюїђщуцыычлЧбрхуйФЪзугЫУЛИШЪЩЗФлмпбLHWVQJGHNGG€lE?>туумршшьчрйрщюђјїєёђюькЮФЩШЯаЯЦЗЗЧЩЧОНКОЧЩЩЭЪЫдИ›e;J]^ICGNC?J<57млнпнрейтюђѓяяђёђѓяяыжФйчцйкзучмдбЧНТбЫЩРЛТЭЯатбСД‹^QWH9HHCF?4:9ьудЧНЦНШзщсдйжбКЖЯЮгЭТСлщяюькШСЭмужЯЭабОААЏЗЖДЁ”žЅvdPSLABI?E‡ŒGTЊЧтаФИЉЌИЦЇ’…vqmhgpƒtЅЭЩ„}~…vqnmnuimpdPgL)$*+#*-#1;J;*9FvИЪОЎАскТЅ„ttq{zwrkЋЭТ‡u…}edc]^{}whJ.55!#-.5*(0<7,9^wuvЏмтОŽ|qr}|Œ‡[ŠžŒ–…|wrhbh]^r{„ƒžƒ8$ "%"+0575::A@@aŒДНЉ‚t{wkerew’Œ…xq{xqoqom\p‡‰Žœv@"!  *-*.-2:CLJ\M10T{”’Š’m[o}{}wpƒƒ~vntwx‚}ƒ…„xƒ‰M!+!&"!#-53:0-)"!?C18# 1BTkxˆŠ‡‰uj^ŠЄŒ…‚‰•›Ѓ<;Q‡{#04.%)*%!##"%&-**27&(..#.<+!"%& )P”Œ‡uqoƒ˜‘‹„–””ŸŽ< ?zMI@20%%&*)$(,-3),,024))!%922388%,2!BcŽЕЗЏŽ”…ƒ„•—ЅЋЋ‡wˆd;<<7##*4:2)$,-203215-1:<:5570+54&5%()&FQzƒ‰—‘™‘‘ЁЁЄМЁžЄ—w+#.%%471("&43.(2.1*0+2:0,--))#)*,720B>,C\wЉЋЎБЎЉСЪНОБ–wP ,*,1+925.1-,-+.##%!&0.+&)WqmheOM7;kŠžАКНИЕžЈЁo4iŸvYL;(*(&<>5400-(&##+#$#,)& .<+ ()9<@Ad’НрЧИЎvepБЭЃkG:B71-3.!(-$%*"+$!&4.3 1#%09?;ANGO{wŒ‘}cg|•œ‹‚ƒnT:,G(,-,$4&,!$&*+%0283,9FU4 (*%9>HFFIE@B5-5>@V^[g—ž•q‘˜S>@2<;,#%).)"54-705+-WzO$+$!$%34+@B9C>C?@,+0PmMVДˆtŠ˜„Št\]^Q0:C8332CNPJHA52?Wp>5-  $(8.)*7CC@?@0,7^g<Њ˜ŠŽ‰|‚žЊВЄƒW8<<&+(%:B>B?8BI?IJNA8$**!(:F>48-*2754$VnA(›žЂ•—”—˜ŸЃЎММЌxTQhV<9AA5?EHBMLLC9,$+& !.-1.*$" ЕШМ—œЄ””•–ЅЏКлщрЯФН~>:A:-C<@A-)!  #,*+.)0<57*&#ЫйёеЌЅœ™œŒ›ЂЊБАЕСаД™zPQJPN:B<23CH5$)%%("#(#!,$,7++#!%ВЛЛАЋЌЄ’ŽЃЎЉ›—‘žЛЋ˜‘Žpd^MJWQ><<€я@-( #*$"$-359<>?0.3+(#!МРДВЗЗОгзеФЖАŸœ—ЂЉЌЌБЛФЛЋvprYBIeG3"#)%1(&08FA39:93,.%)$#4зЧТОСУЩШЩТДЄŸ›˜ЃБЗИДАМЪЩФЎВБЕЁiE5;5**544*3;@A>98120-7581+.((СЧЮССТССЪЯЮаЦОРгЭМЗМККЫйпССМКУЧБmING0:E5>74797@4ALI7EAB?A2(!+ЖЛЦЫЪЭЧЧТЫЯдбдбЭЮЮЫдпхнзжЭдбЩВекРЉСLW^^N-.8*.iTGM5442>BBF<(ЇЄЉЏДУЫаа€єФЛМУРЦЭджмплнжбЫУУЫаееЗдлдЕЈ”d?EVJGEYYN?E@1B@IE;>(##ЪУДЖИШгжзйРИДЗИОТЦЩМДМЪкнжезжЭаадлтбРЧФ‹i`p]B9EHrbFIF@GA:7$$"&2FЕКЕИЖИЖЖЛФЎЃЉБЗЗКШбДЋЖУжюлЮЦУЛДНгдСКУКСБ—|›Л‹`^UOOME>2-&$)33,,03ТРКЕЉЃЏОЫК‡ЁЄЄ„ЅОЉ˜ЂЉТЫЖВУЩРЛЫЫТЋ•БЅ~ŒВчыЗ]?3374збгСЇЊТЧЪЫЕ‹‹–’˜ЃЌžœЂЏСАž›˜’‡Ž’œ˜ЁЂŸЊЊЇЄЊЄВЈ™‡VWLA989@FFHFE4!дЫЕЉœ™ЁРТЁœАТТБЇЎЗАЄ™Ÿ—›ЁЃЄЂ”‘˜Ђ›ЁЇЂž—”•œЏТЈ˜‡žЄuO+;H(<:9-*!ЧНООСРРЛИ’”˜ЉДЋЃЃЖЏ–—Ё‘•‘œЃЋВЌЇЏАЊАЋЛž™–БИ•ˆ…™ЊЗЧБŽqYE;&19)ЦЕЋКМЫемцщшмэїтжШЩЯРНЭЩШФЌЋАЉЊАЋЌ›”ŸЃŸ”‘”œЇЃ˜œАВНЛТхкЕЂ˜G*-ЇЃЋЗЦгршышкЦТЩжуурлзлрммпаЩЪЯпшнУЊЄ˜™МЅ‹…}Ђ›’~Žt‚˜’–ЈгЪБЖОЃ•…vnБВЊЕЖЖЗДРбЩОТЫЫагзкЭНШезммЯТМСЫЯОЌЋЌЖОЛЖЏЇЇДЌЄЉЂ}jrtКДЎЌЏСЄ˜ИЈœЏЈЌОЩФНЖКЛБЋЖЪЭШЖЎБЕСЮмскгЗДРРЦЪЮЛЖЖКБКНЛЎЄ˜ЋРЕКВАЊ™’›•ŸЂЊЉЏДИЦК”‡ƒ‚xЁЉЄЋЗЛЋЃЂЄЉАВЋЊЊМаеШЛОЦСУМУОЛВЇЉЌЃЃЋЈЇŸ”Ž—”НтщЪЕЋ™–ЃЂЃžЅЊЊ€3–œЂ–’ŸžВдСИЌЂЈЊЋЊЃ™ЁАМРШТЗРЦФЛСТОИСЦРНИИКАДЖЋЌБТЧРФКœ•—–™Ї–‰ЌЎЃ—ЪБž—АЈœЂцтеЧЏЈŸЋЌЇŸœЂВРКИЕВБДЋЈВЌЊЃЌАИСЦНЗЗЕЗЕКОЗЗЦУЋЉ˜ŒЂЏЅ”Ёž’ŽркбЯФЖЌЅМННЖЉБЏЋРДœ•–˜ЈЖНОИАœЂЇŸŸЋЌЏЛЗЊЗЊКТЦШРЕБДЄ’Ž–œЃЂ•‰‹ŒŽЦШОСОЖЊЎЎВЊЂЎИЏДККБЂ™™ЅЋЋЈЇ›™žŒ•ЃЎЎŸ–œЈДДЉžŸЃЅЌДЉ–ЄЏЈЈ’‡‰”‰МБВЕВБСЧЖ™–АЗСНООКЛДЋЅАФМЌ›•”œЂЊВАЗМЗЌ˜œЅЊЊЏЃЁ”’”——€‹•™™ЃЋЌœ”ŸЇТМВЎЋЇЌОРЈВдшгШСУОДЋЈЌИМЕЈЉБКМДССВЗБЕВ‰Šˆ‘˜ЁЃ›”Ž•Œ…‡„ƒŽ–ЃЈЌДКЎВЕЌЋЅБЛТТСЖЎЎРажбЧЗАЋБШзддаТЧЧЭааЩЭейхȘ•ЉЛУЏž™ЄЅЇЊˆ‡Ž›ЌЎЎАЏЏЗ€ЕМЕДБЈЂЅЌЖŒЃЖЇЅŸЁЈЈЇЇВЛЦаЪаееЮЩШЪаь偘АВЖМЛНСФШРВ™БžЅСКЎЕЛзѕуЩТРМЖ‚‡ŸЉдЈqƒ‘–ЁЈЋЊЄ’ЂТСФЧЪЯдееЧМСЧдЪЇЈЊЇЎЗОНМНРСОБЧЕБЗИКУЭЯшёуЖ‰лззгНЖЇЁВЕ‘m—žЃЄВЁUŽТЭЧЩЩЦыплЭЗШачЧДСНМВЩЫРЛКМЛСНЕВЊБДВЗМЭдаТРБгдмхсУУТЖЂˆ„•››–u‹vGŠйьцзжйтпёщСЩЩЯаШФТТЦЪЪЧЦРККСРЯЧЇЊбСЦНЩзчхЭЗШЯаагКЅ›‘˜œ›˜—˜Ё˜ЄmCбаИМлщлеаЯЮЭЫЪЧФОМРЪЮЮЫШТЖЗНРаЯрмбФУСЪшљнзеТФШЭхйОД‰”ЉЌЄ™˜›Š˜„oŸНЛŸЇдюзгЮЪЪаЯЩЩУРЖпёюрШЗНЖЗРТЩШУРКЗБСмзуТАЈЩЩЭгзрцЪ––ЏЋЈЄЅЋЛТНЎАгщРЉМЧЫатЦЦЮаЩЩСЕЧкшксЦФРКЛТУУМЗЗ€МФШпхмЦЦŸЮаеджгйЯРŸАЌЊЈЎЊЏЏАДЌТсеЕФШЪЮЭЧСФЧЪЩНЩщцзаТЛММУШШЧЗЗДКЛЎ—НбкШЗ|нйлззежйУЄЕВВДЏЎЊЎЗФЗБžеыюђукЪСМКНШЭУООСОбЪЭНЖИРЪЪЦРКЏЏБЕДНЧЯФ›[рцёзжгйтНЉЗНУСИАЎДЭЎwNNжўўюУЎЖМЗКМЦЧУОНОЪЮЩФТКНРТШРОКННРЦСИТэп3…ЪѓчЩабнОЄЖЛТТНИЖЕНЗБ5ЋйЮбмчЭЈЖТУЦФРФФЭЮаЫТЧЦТЪШЩУОНКНУУСФуўКF:BrЄЩклЯЦММРММОКЖБЋЏИСЁmЌЪгшїњйЫТФРОЛМЛМТСООУЪЪЩЮЧУУФФТРТЧКВжйx#>,@H\”НжмЮЩЫЪФОМИИ€›БЇЂЄ„ЌШШп§љОЄСЦУМИКЗЛОФРТЪддгЯбЫФТЦЩЩФТРЋЌn5%I->79AOЗЮЩжЪЧСЛЖЗЛеРЇЌ›Мйжђў§РДРФУОИНСТТООРУЧШЭЫЫЩЦЦЧШТСФгТ8!CC<79MT`ŠБШЮЖУШЧРРЩбЏНŠqЁКлсЧВОЭЯзВИИНУНИВИСШШўЪЩЩ€ УЦЧРКЛС…7+(PMF?G:9;AOq‰ЃЮбгзЧдщИЄБЋФчєћЭЁВмечЖКОТФОЖБЛРУШЮШТЛНКЖКНЗЧЃ[2:%$]Q8:?>77AU`BTŠЋЭђркўњычдрђхзШЎЃНдЯКРРгбШМФЫФШЫЪФЗБАБЖЗЛФЧ”?PH-9:4.7>BFIHQJˆ•\tЗгхўєыпртчютбЦМКЕББВНЖрўљЪТЪЫЦСКЖВАВМКЗБ”’q>159885520>€Ћ:;452-44:CSFJEABTF?So’ЅЎл§ўыЭРКНРФЪУРŸШмжанШЧУЛДДВЌБРТаШуКQ>29<975&$7798<>>9;;CIJCFLHBTxЊмюлТНСРКЏЇОЋВОЦЦФФУСОИЖКРНБМЮЫднДW8,9@8.)%.7?;97;998@>>1.)2:;93599€ъ;@CCBMLMJC;;AL^iz”ЏЭ㎘аЩЪТЛМУдаЭШУУЪЫЪШЫЭШУИНnCI?xЄ›ИздЪЗ•ŒМзЮуОЂОФЧЦЫбдЯУТЌwQ;,FL83345.*",52<9@CFEBBHC?;<:?A?A@@?>:><>HI>;BB;?EIJOC:<4InЖЩФЦЮФФКЫчжааэежжцЩP#aЉeQNJB@>43>>€с413;;988?5:8:A@?79?<:;BBCBB?>?>@E<@FC@,2:;<><;<>A?749?833;@?;4379;9;>E?::?<513::99*0,0278:@>??:4?v…ƒwujhPOƒБОляьщсжсмžhЇЯ˜gZQ2;HGBEEJF<>;53+)-,,203.)*-3<923179ECc@%5)B72CT>,-((&038795?GLLQQSQEA;FECSo—ЈзнЭУМРбШ{]THTQI80;;<;+;AF<>:4">V„Q27<.+144388BЋEHMILHIE5<;-h‰guмкЯЮЪИЯеМК”|zd`BMJCE@EIUZQO<;9MYoIFB?21.3150,8;:9;?:@EEFBE?MjuL9йаЮЪЩЩ€‚ЦТмууЯdNJH9?C9HILEBHGF8HIOHJ87594::248;FME::<<74>>59i{M?здббзЮаббейчышнТŽbe}eF:FABBHMOMPJC837:9303;014$59524:424<>9*25!#уђьбйлждггазтх§ўўчсдŠICWQBOH@ICHE@@9;>434942.43799::83771;<;853##2мрсмазжзйзнрсрйейнщтаЪР‡wq\aeYBBHLIHAA12>A;527@?EFCAB?<9:;?;9-.9хттмйнсєўљэркзгажлуттщїѕщЯ›ˆ‰kTOgYGB?<@8:A??B@7EHFE?@<55>>:>77<<чьштрсруччтлжежзнутптуюђюмймйА}WGHA;@E>@AB?OQMI?8<1><@;@?95399€@ттххплйжмцщьухцєытстшюяюєчщёюѓюЩƒ]c[CJMF8#%!0мкдбкпххчхсмлзз€ЙлпцчыяюђѓёђёяяјѕцђўјЯОЉtLT^TUPhZTCA?EBJIBHFH;&3цхщцчхчхтщЮШЭЫЭЮжйтгЫгсюяђђяяюьюёяњѕыьтЎ‚t‡gJLTV{kJNGHFHB8>ZчтчшчтппмдРЕЛНСТЪжцаТЭдхїххтррхшщыьшшчяцЧАШрЃmeb[[UVPE@?BBEFGECIюььчууцчцђуВЅЖЛВ‹ЕжСЎЖАЦзШЮрцнбсчузгЭкслОУпўўлЋxLIFQUGFHPUSMGJI>яяшхттсцщњчЦЦЩЪУСЦУКЎЏРЯРАЎАБЊ–ЃЊЗЛЧЫЫЩЫЮййбнлбЩЂmn^Z[MSZZ]UPSQCьщщтслмутцжлшђїчпнчхзЦЫЧЛБВЗЛИЌЄЋКСРСРЖАДЌБТШнЭРАКЦjA9JVEPVPOI?эюышчщыщыЭнЦзтщуннцпЫЯдЭЯРМКЖНФЋИРФОКРЯЏЂžКНБЌЊЌБМЫнШАЇ…hZPEHJFAхушшяёѓњўўќљўўђђ€ЙюєьэѓѓђюсймеадЭСЌЁЈЅЄ˜‚”–ЁЋЌЇЃŸЈИОеЩФцмМЕЇ[@A>3ушчыяѓєѓєѓђёяьюђєєѓєѓёѓђїєяѓѕљўўэдШНМЪЛЃ‘„”Ђž–‘o}œ–—АеЫЕЛЭИДЏЁ‰ыьэшщчцыьыьэяёєѓёюэёєёѓѕєёэьыьюєютущчупырбЫЮЩКРА|grp”СЗЊЌАЦИАЮЮЪржрыюєьхшщщФышыщыышщыюѓђёщюьщыьюыычцуцхсьхпзуёэспзШЏЇЂŸЃЊЋААЖРбгаЮЫЩВкпттсЏхшщчутсэюяёяэюёэяююыщьшхцхухурпнмгђўўєщеШЛИАЄЅЌВЖВйкгабажсјыштпнтуусутчыяээьщщыэыы˜юыщььэющьщцшчщшщэщцдййеЯмТЃЗБЅЃїщмдшндй§эёычрттхутссщящыыьшттцсхсттшщыьэщчьэёђююэшчшплмйлжбЭЩУСћњїѓшуркшшхыпсчууслжлтхщшыхчсррпттцвхчючэцчьшыэяыурннсркЯааггюьэышхшччтрснпццщшчурру№пмййждзнтццутррхххцурпмтуцсрсмлнкнжджзльюьцхыыљчспсэщээ€ЏюыупнтучуспрпстцшхухпнкнпсртнлйлйджклзйкммпснптыыщхсцыщххтѕўяѓёэыьыыьээьршцщчхыыюшшщхЯззжзмпспнздабдегелрхшышчхщшхчщьээыьыээюёђяьыщьэюђёэёяђђёёѓђёюњщздчьѓхцхттхымлзжабйнучщчцш€oˆ„‰…qmrw|m[jonovx{wrz‹œЇЂЂЏДЉЃЂ›ЅЪЏqk|ƒ~ˆ‰„‹™Ђƒj^rx…v}‹КуЯВЄŠ‰‰uTUgv™xGJZ^gvnppbv’Ž–žŸЈЕЛОЂ’Ž™ЏЂ|wzrp…‹‰ˆ’{”v|…‡‡”ЄЇЮпг^ЖЉЋЅˆqnu|]7Ymnwpzo2d‘ЁЅ›˜ЃеЩЕЂˆ˜ЋОЁ‚”ƒœ‰‰…‚|wp}~{‚”ВЈ—•‘ЈДЕЦј”ŠxiTUVcgiFPB(\ЌЩУВАДбЫнЪ›ЁЉЇЁ—Ž‹Œ—Љœœ–‰}…Ž‹—ŠruЂ—Œ”™ВЦЦŸˆЂБАЇž”{j^ga`^cigaiE)iЂЅ”ИЫЕЊЋЈЅ›”—‚‚‰Ѕžž˜„~‚…™ŸЈЏœŠ‰‘ŸШжКБЅ–™•ЁКЌ–ˆ[awzpj[h\dYGk’”{~БзОБЅŸЃЄЇЁ——‹ˆРаУЗ’‚‡ƒ‡‰‘–œ˜{ŒКРТ–ƒ~žЁЃЈАЗТЌeg|zxwŒ‡}„ЋЭЂ}‘–ЂЌШ—”ЄЇ˜‰ˆ”ЖЩДМ‹˜Ž‰ˆŠ–Ž~|‡ˆ‚Œ”ИФО••‚ЌАЋБЌЏАЇŠpv|txwuq{}~}—ЧЗ’Ÿ˜—ž–œ›‰m™ЧЪЊЄŽ„‰…žŽ‡„‡‹~e’ЇСЂ‹qФСНРДБЌВ™q{|z}pn„”’vФЩазСЗЏ‰Šˆ‹›Ї˜‹ˆ‹ŠЅœžŠ~ŽЂŽ‡ˆƒ}~„‘ЅžŸ…ZбЫЯЕЇОСШ”x„ŒŠ…|x{•zI.4Шљ§рЄ…ŽŒƒ”–›ŽŠžЉŽ‘ƒ‰–™˜‹ŠŒ—’–Ž—ТКt5uКугЄВКЪ—t~”—Š~‹~…[’ЖЕЗОЪЄ{Š’–’””—ЂАЅ›–‘’–œЃ˜‘‰•˜НыE>Hi–ЌИМЅ˜Œ‘Žˆ…ŠŒ~}{„rI„ЅЕбхыСЄ›–—‡‹ˆ…”‘„‹’˜œ™ž”‘’–—’˜”ˆ„ЋЖr*B+;E[~›БЗЂЅЃŸœŒ‘Œ‡okvVƒŸЇСцч—u›œƒƒ‰ˆ‰‘ŠŠ˜›ЈЌЅœ”‘ЂŸœ’•}‘n>!53E;G>LmЌЃЏАЃœ™˜‘’В•t{hžРИзўщ–…•”ˆŽ’ŽŽ™‡„•™žЁЁ€є˜˜–™˜ŒЅŽu>*)MNG;@CFMPSQY[’\kŸУйїцлЭУТгпЧЉ›ˆ„ˆ~ˆ–‹Лцп›–œ–Ž„~ƒ‡‡ˆˆ{qŽbG90;H4B?FMHEEGJViSFT]‹ечгФКЦњяпН™‡Œ˜•Œ…ˆОхж›Š›ЄЋ…}z}vА—Š|\BNP:>:G<@><>:95CVWMILOSJCUnސˆТїєбЄ‘‡˜œŸЉžwŸРЊЏБ”Œƒ}{x‰’ЃЛŸSE2EH>>3*4+@F<20IM@>;B.3B?.49>CPSVPPQUWTFEZceEGGOBEH>?;38HHNTIOTMPLOI?SSQEIMNNJHFCGMPOQJQQB5&$CFII@@99;4BEE@HJEG?:>zŠ…}{bcSVЉЖЪбкЯШЕУОƒO}НˆicT;BH>IOUQTMLHG@>@F?99:9@BACOOIC;82IIEG9AAGGGG<195:4;07(B?EEYL57>>:EU[SMIQUHQNF17nZLЕЖЗЌЊЉЃЇЌАЗФЦбаФŽkm‡kPMYQSY^\bgcb]MJCAEH;5+(2<4?EECAEGOJJG;8:*8<3B?@IINOGOONNMLHI<7++мэўщЛЛДДЗЇЄБИТУШЭгцЭЕЛŽpicdhSWYQJUTO??EENL@.2<@GLPHJOOSJSOIG@F78ЩдЭУИНЗЌЈВЕСРЗЛИЌКеЦЌЋЁ}xu^dti]NWQQMBAFGEHF@?@NUYU\STYOOQIOB@.>CзйаФЫЫЮчюэнЪТЖЕЕАКОТТШлнеУ‡‡ƒp^gzcLLMAFJGANMGNEUUъ[TWUTQNQGHBE?Pщзждазйлл€SЮСААЎМФЭЯЫУЫнтйЦФЩШЖ„\QQPFEINMQHNT\]VTbMPQQNZVYJHEEOMFеллжгЮЫддрсхлабчжЮЫЮбгуюђгкззуцШ|Yc`BPTMSVLUVNLGWab]aZQWUOIC?A?;ЦЩгжгйдгглпснртспххцюёѓюхухцрЩьђаИгЅbqrv]O?LIAwbhkQQPJNW^]NI.:9.МКЗМЦзмпрреЯЫедбйршэшэыэшцлтсрюяЯцёщЮТЋzSVo^^]jm`SUTU^aW`NNQC<*EнзЩдайхтуцЫУТЦЧЧбкзЩОЫзшчыцщчуухтэїчзркЄu{ŠqQOVbx]][ZZVTJLPHFJcШУЪЮЯЯбгЯЯЗЏВЗТУЩдрФАЦахћцлдЯЫЭктэлжнйлЯЋ—ЛзŸtqkjj\^QSNUMMOSIJHLзеЯЪОЛОЦЪта™ˆЊДАŽАЩДЄААЫдТЧлсдЫпрйОВЉЗУИœФњћЪqNPISSPMLUTZ[NQU@ючцжФШЯбзшШžžЄЇЄЇЕНВЃЅЕЯЛЊŸЃЂ’Œ™АЅЕДЕКСЕТЧФУИЎВ™gq`OTJQ[c\\VUYBцсЮФЖВВМбзДЗЧрлЩЛТЫЩЕЋБЏЃЊЊВБЏŸ–›ЊЉЈЊЕАЊЅЂЅЎРеИЈ˜БЛŽc;:M`LLTMTMBлйбагжагЮЅАЇЏСЫЩЖИЪФЉЋЏЏЊЉЃАЗЗŒŸЎМРИЗКЪЎŸ™ВНЃ•”ЃЂБЦдТЃžjWNEBEMIеЭШдмшыђјњљї§ўээпкребурмйЦИЦМСУРОЄ—ЃЉЁ˜ƒ”–ŸЋЎЈЄЅЉЖМЯЧЦярОИЉY9?>8СРЫзуяђїѓєьнЯжшєѓђяяэЭђѓцлуујљћсСЗЅЉЪЏ–‹„Ÿ˜’‚—rЄ™žЕреИЛЭЖЄœŽ„ЭЮТУЧЦЯабтт€сшшьхшюхзущэюьсддйнщдРРЧЭЭФбМЕДНИАКАjpt—УЛАЌЗЦДЁЫМЖМБНдккеажеЯЪдрспдЪЮгецэёырабжазтпаЦЪЫЪЪабЪКЏРлзЦФРДЁЂЄ™ЉБВАКЖТЫШЎž”™ŠИОКМШЧУИЛКТЪаЩЪУецюужжссумнплЫСРУОСРТОЕАЏДЌй§ўшгНБЄЏАЋЈЌЗДЗЎАЎЉЂЏАЯьзЪРМРСТФСКТЭйдхмгжйжазлбазлгкдакаЩЪЦТШййЯбЫАДИБИОЈЏЕЅŸрШДБТЛВЛїёщцЭМИЦССИИНЫдЫЮЪЮЮЫЦНЯУУМТЮдгмбЭЩЮжззмбжплУОДЎЛСВЅВЏžžїђьчзУНСЯзеЮЧаТЩгШЖВЋАНаа€&ЮЩИИОЖЖЛКЗФШШбеЫЫЦЯмзркгаЭНЎЋБЖЛИЇЁЅЃЈпржегЮШЩШШРНУЪШЧЯбЧРЗКИНРСКИЏДБЄЊЖОФСЛИЛТЪЪУЗЖИЛЖЛФгЦВЖСЛНЌЄЁЇЉЅаЫЪЮШЭзпЭЕЉЧЯкгййеаЦКМУЯЭЧИВБЗНЪеЮЧЫЧРВЛЦУЧШОЛБЌЈЎДВКЗЏЕРЧСЕЏНЛКлжЭШСТЮлЮРШыћыхпзаШЧРШдгЦМРЯЯЭУзгеЮЪЮЦŸЃЈЋДОСНАЏЎЄЃЅŸЈЌАНФЪйжШШЮЭУЦШдмпеЫЦЧЭтяюуеЦСЧйхштшптсцшырчььјЯЏАЧбйЧИДИНЛРДЊЅЇЌЌЏУЦЩЫЭШаџ€ 9˜qU8"+#)! -QOJNbkZVTqTZrLF3?;(:[ЊŠžtM^rtvx‰‹mnoz{qtxO#,#*#$4FE*t•qnvV>&CNFU:[V].-ZczА‹›|kwxnttv|ror~pbZ‘o #--1%# (t‰oŠpƒ…PWOTb^^TPPJ;|`d~А…„jmwvZhŒ’Š[kxi`haP!($",70(%*U”Ѓ}~ƒ‹NHIEJ`eTJLJPJJ1V‚™vncgve‰ЎЏ•bhpir{OH!"& I? #"%Skd\anpЈ˜q? AQLaHILdNWNFcŠkquktŠŽvwoehq~pB4:  -1-# [uЅ]Zcnu‡…^WL90B3imU,Eowœ{opn‹‡—–ЅŠƒrnmh…Љ—< (2F`‚ih^begvˆc?HNP4qk<4W~~rbj^k…ЇŠ•ЋЌxUAuŸУЮ!)"#+!1nconb`codgpcNj^cC$M>a^Mi‡Šƒn\kx˜œ„ƒ„wqVj‘Ўr0(& 0@•’ЊhrhUMTVa]?zƒo>2QNMQFzmЏ™}Šq`r˜cwuqdNu‰Œ}8)! %%"8jw‡kumhNZ[UO8gŒ‰dqOUS^]‡ЊС‡takiqxzƒweP|™„"4+*,*^‡ЃЎ—tqgc`MSWWF`Џ˜CJHGIG:cƒНб•vtjaotmuqƒ|ndv„…•3.+-%155>-%#"W~Ђ‡me[NTZYHH)M~dBCJ:2Fahm’Š‚edSUpzdwonoiho}{ 1((2,71&29)3a’ЋР”bST^;La^J?WZ8:AGI1Gc‡~g{thaVz•Ždbwrhakx{}E358!2.$.WcxЇЕŠYCB^Ÿ–|FZb[J!CBEN[[Љ…Ž}xqY•МВ”`^]iˆ„|~1?!*#"%(!&!;gŒŸЌЦЄ}P@;Ž›xkNd`W4PUJNAIk™ŠŸ’—wp^Ё—Ц–`z{|„ƒƒ +(%0.40<7"TZ}”ЉЖ‚a!)>‰РЗbA;BGdcx^1[qxB7NWz…‘˜zcinu}w~~}ˆ„‚„r}%%#940$2~”wj–Ѕ–’YIAAP8?C|—j\{™ЛЛŠQOwp˜ЌœPHLBY^tvqpW{Ј’‡{„‡‹ztwrV„Аœ‹|~…  *(&*24>\bbapndcp{u~xhtqnjw„zjinwƒ‚—ZJ^w…dUupx™ЩьюєщА‹wnijcŠ‘œ›ŽŽx[G<]Œ|oqztqkrx|xrrƒ‚tquZTgvwЅ”›"+0AN[}ŒˆˆœпщђїѕЦœЏ–Šq^ŒКМ{bp‡ŒeHTZcht|}{kht{‰„tqqojdg]U][Lu‰tP>1+,.J[NQƒщѓјљћьУ’{tOh•ƒ‚wjtH\^[Zetjn^[Zg}‰„{tmtjcrqnide–Š…{ ">,-4CE7Qzq‰žНэюЮЈЂИН™ЦВxzugq{aŠvetu\cgv–’~’—vrƒЉx^pgcad]‰‹~ !$598+??@@ACc’ЅЮьЅ’‹„{|{jruz}rjin^M[Wv‘‚„wƒЊ•gˆobpoddx‹|%%#&3533HO]hz`L]WA:UŸЄ›˜””…pmmtziekdT]cG`ndr}|ˆДУx‘wkvtorqu(+#!$#+-)35FZSJVS:?F4;>TdY?IkqzppgŸŠknogeccQimm{zq–zpˆvhh€Б…}zz522,(.CC9>JFA@-EQC?CAFTJjN35><:?U]Љ{w•vxqgkhnkk‡ƒxvzvwbNTYmqxxw4*+4BB89?A>29<<4*704828M.9?WguxtvN`cY{{qtxx‚‚t^J\u~Ž‚%!(#!%>I<9:@HG@2)!1>;EB?.:ABAJ<3$)1AboЃ|‡„z‚˜ƒT^[dt{˜|%$)#)%75<;@BAF7AE234)$%0-@>;;(-;81@IC)%*5WЁxЁЗžАМƒurg‡ЎЌВi]3*5+*75>1787249>B>4-),-EA858039A97-# 3EHgk‰’Ї—’„gjœ—•‚51?*$-P102:537+-5;-&0.4A7F?H9.,7C>.7.%*)5!COVAC48TdgqŒu\žДžŽ#$2YgGAF7277<;97*1>@:70*3?@?@.&-4,%@JE<7?15&1PjYd—œ—ƒ"%$4.34:F@<9AFM2,"*7a|‘Œ!359%:A:B@GO[oT9-800! #$.0;9($"%3,+#0:>@GOE5?@>S%;GLPHLOVAg‹V7CAGBGFC;>A2.# #0;283.)04)3#,+,H<:.20$#87;@A;1B5:;>;-"1JLHGJJ?B:540$-0(.(5,3<(!"-2:СЮнШЏ™ЅЉpgjVBpY:OQIFGIOIC)-,952;EMNQVPHH?:77€˜@C,%#+"!%)($+14::ЎЇКВВДЖИЛдЫ•o‰ŒgGOZPGIEBHF9>A;37,4M\W^G8AIHCEG@B7+,&#)1-.0„’ЂЃЁœЉРмЯаФЃ‘Œ„cH>JMJgH87EMC?93d]rOGHIQSTSN80(.)+:"+!""&4Š—›ŸЄЉЉ€xЌВЊЂЌœ•ЅЗЎŸœД–tdUO@SYUZVLLPZIH7<>:E>>G?731+743% 401))-&‘’Ž–•ŸЊБЌЂЃ˜’‹‰ˆЋРРТЛЂŸ{[N@17YQ@HLCHQOJB4534*+$!&!!žЅ’…‡ƒƒ‚„ƒЂ‰…ŠŽ”ˆ…„ƒ‰}ŽŠ„•ЄЌ…kaB5CakTMUHLQMG;2*&,.((#*-СУбМИ„…НЮББЃ‘ЏЖЌЄƒ‡™•™ЄЎŠmuq—”‹Ÿ”ˆƒ}q`IHANSVPJ`3&&))- #%ОКЕЉЃЄЎЅЌЈЊЊЈЋЅЃЄŸŠtx—БНЊЎЛЕЋ–•›ЊБЛждтхСЛЈ[F\b]L@N?1)&+13\;€EЫЌ…G,?7:;?B?C<>9+7TU@|”’•ЌДЗЃЂДЈЈСЉ››˜•ˆhnЏхЯеШ”ДЖНРЪЫЧВЖИОУУММАkJ935889?>[k‡wЗбФИКЅ|—’œЅЇ›ЂБƒ|ЈЌСэгсЧМФЦОКФЮЧННОНЛЗЗЯЁ(HIEBAH;28ZЗбВЦТЪЮБЇ˜›ЂЊЈЈЃŸžЄЩДЉЪьгФУСТОЁДйпЯЁЖЗМИДИФt?G8E?715EJMFGJˆйрРУЩзЉЇ–”ЇЊЃŸ›‡ЃЦжЪСЖИКИБжѓюкЉЛЗИКНШИpa>:>>750aLHACEF]GGqЉЏЄЏВТунЧŠh”™ЅŸЁ›ЅЃЊЃЇ–ДхбЫФМРЗТгйжУУФОНТЦНpCP;49772?UGEGBLG4>~ЎтЦЕДДИСззИŸž—›•ЄЁСЇxЃНЪуЧСНСЭгусезаЪЦФДзєт]:<%*2*15;?>EGLV1<}ЅНВЎБЎБЗОгЕƒ”›‡~ЛКŒ\\‹ЏТОЛЕАИБЮщмлеяШЈ—Тыўў-%855.78>A@?@?BEEH]ЈЕКЎЏЊЇЊДМНБ–ЖЕДŒm˜˜ЄЇ›НдкЪЏЌКСмябЯЭаЛНЂБнчН>N@?7.-5;4?@C9WxЫкчНОЌЅЂЅЊŸ˜ЧЯИ‘~ЃЇЉЅŸЖСнюхЧЯКЅЏкНФЩЦФН›ЖйкС9M<@44Њ1;9:ECFHLEŽЩыцнСЖЏЉЅЇЄЄвŽДїпЁЅžЂЁ˜‰ЄЪћўхЩТВДЗМРШаЫШСРСЩдбHJJC@>B?@CSVMM€iIUЁЪдчЮЕЈЋЊЄžЁЄŸ‚ŸЭЅŠ˜•‘˜žЏЉИукЧКБАЖМНФОЧЧРМРЧЪаЪA8FEJLSLEEILOP?>gЕкхјгЉ™Ѓ˜œВЊ~ЉЉ‚œœ”ЊЪЩМЧРЖЖЉШулБЕТФОРУЩЭЪЧ 1]HLFLCB?BJOF.C–ЛУзуФƒ{ЃгшлТЈЊŸ˜’–ЂЌжжгЭЪСНЃеўђсбЈЗЗНУабЭЪ?LUFBACECBGGSE;uЅдкшњуФ’ƒ‡гуТМ–ЌЅœž–™œ”ŒŸБкжзмпФУЎкђтєаЉСУЦЭбдбШA;>BCBAAPWZHLŒЉУдтыЭВvdˆд§љЮЊ’’‹ЕЛТЇˆ›ОѕэлмшаОЅЩуаНРЫЮЪШЫЯбШФ27?\H(]kŒžКНЄОшхеЯЅНеЯВ™‹ЏнхйЮЕ–Ž—ЛЋЈЇžŠЁОИНСЧФШЩУККЃЩегдЪРТУТУ]jmM[›Є˜‹ˆЎЏСлўљљђФКОСРАЂРйлждЋ„™”ЧЕТ–xƒЉШВОНКНРРЗДВАгбзеЯЩЧШФЦqЌ—ЖЯОЅЃžЃƒ•пўѕтжЛЂААКМНКДмўцЃŒЅЋЏЭЮВ‰i}бЫЪНМКНТЗДММРЩЮЮггЭббЫЩ‚™›ЂЫгВЊЈЅЋ˜˜жјўўшЛˆЈЏЋТЧИЁТзЩЌœЊЉВЛЭМ”‘НМййдЦчЛžŸТЯШЪЫЩЩЫЯбгЫУžЉЃЊЦКАЇЉЋЕЌИтў§щебАЕИОЧШФЎыєйЛРЎЃЊЏАЈЂЂЈЎЖецкжэШЗЯщхбаЫЄБЏЕкбЭТЈДЗДгйЕ–ЌАЂЁдщћђпЪФЉРФУТУРТЯпгЄЁЉЅЊБЕЎЃЂЇЎУИФЦУЏЖЖАЉТчаЭБАЋЇыЭШОЗЖЗНУШФНОНББЪюўјѕчЦЅКМОШЂДТтьмНАЁЁžЈЕЖЌЌЋЧВЌЫыдлЕБД™ЄбадЩЭООбЧЦСЏАЖОЦФТСЧТ–АЯљўћщаДЏМЗЖБКчўюнНЈБЂ›˜ЄББЏЌЖОМЦрўїђТВЗДТаЮЯЫСТЦЫабЪЛЕИНУРОЖМРТФмћўўУцОНСЖВИНељ§ыкИАЁ—„ЌЗЗЖВЖИУрЪНТпИЗЕБНЧЭЪРЖЛНЩЮЯЮРНЏБЩСЗАЉУсшьўў€МгЌЭОККЕШгснлсР•~ƒŠЌДЗЛИЗЖМССТЦУУРЦФФЧгбАЖКНЦЮЮЧ…–АЩЩЏ™ДЎЛзьћѕ§§ЮММБЕВЏгрйгдзУЇˆ…ЉбЮТУФЦФФУУРСЩЪЫЩЧЦУЭЖžДЪУчедЮ<*GLaxŠЌЪЯЪањ§ћўўшдмЫУБЉЦяўРЅЛЭЩБЈЇЗМССУЧУСРФЫЪЫЭСЛММНКЖЌЊЌЅЮдЮШjUOQH3<]jouЄўў€‚ёжЪЯУИŒЅЫИТКЛКœЅЌДЛКЛВЕДИЗШгбЧМРРИЖЕИВАЕБрмЯЪ2&9ETG:FWUSh…”ЁУњўѓппяыЪёыЖННМДНЇгШРКЕЕЊЏФруЧбЫЦРЦщСАНЛЖДЗЈдгйЮ22:8AB@CE:AJMHGBJq’ЁНщњмбЭЮЪЧТКБДВИСРМЖВЎЃЈНазЦШЫЫаспВдМКЛУЗЗЫШТ5:9:;>;>EEIG^dpdTdbOMjЖЮЦЭкзгРЖЕЕИКИЛИВДБЕ™žЏБНСНЫдђИЯТРЛСЦУЩЧЦAABA?EAAB>HT\[P]Y7CN5;?@FJOMLJMZMS@-V{ЁБЖΘЄЉЅСОСТФЧЫЩШдУЃˆЌТЫШШЧ8@<821:59>HGABILFCALOQNMJLHBGCEJAEEEC4;@??@B@IACHMNQPLNFFJP^[NCQ`rœŸЩхУШЧЦФгФžЏŸДШЭуЧC??A55<71.>@CEFIAACCE?:?AC>FFLIEHNMPV[^]P8ICEFYtРАйясьэШЛЗЌШяырœtGFC>517-3>?C?A??;OQ]ˆ›ЕУжееСЇЏрЭШЕHGS<0)22M>:A@B@A>5897%4?:5>?E>?>?FFзBCFGJILIIUZLUW]?EbC:PNIENVN;bU?:5447CGEGG€KJB5-4,.3984;:><5;9@@>>5>5.0109EC<:8587?>>9A>VOPQTTLGEEeTNU[[UVZ]kjTECI8JTOCA>?C@;7.159G@:AA@CB@B>>>@AGG@AGOTZ[VH@FECAGI?9-8?<48?;881?@P``€Њ@AIONHC@GC:88784087133785@–ЄЖИКОТШШаэђјьШЖЅЃЄWNYVVpWGVVUPGCAmgpNFJTZ[YTMB47;:544&+,717>?>СОСМЗМУШЩТЖДФВЛбдзеЪеК’~[]Tabag]YVU`P?5EAEFBAHL?9<>8987529IEB;74гзеЭРООУЧТМЖККРРНМИзшыыщгЩЁvbWSV][b[TVOJHC@@>CG<8:8:;5;4@?A@.)!йпйдЩУСРОИЕЗНОМЖВЏЌИМБЌСУгЭжраЯЇŒ|PENe[SPOLNQYSHEBHB@874:9<8*2(*рпзЭФЪЩЦШУНЮкЖЋБДЖЖДЊЉЉКММКЗЌЂЌМЫЯЇxMBQmx^YZVYZZMA;89;@<398;@@;шщјёёнЮеззеѓ§цяуШмрЯЦЈЎМЧЗИЛЧЌ—Ÿ—МНВНЂœ˜‹}kONMZ`bWQgE99;B??7;-02ыыхтмтмзмкнллкйллвмЧЎЖФмпЧФЩааКБЌРНЫьуїяШУЖ…YGcc^HGHHEB@?<4AbI3.€NЅkI.I90?;CFE@8B9(,H:`h`h|~{og‰tnƒmUc]\J:>T{͘Ћ…dv…ƒ•Ћ˜~~А‡‰—Š[J4>>88?>CEGLHB401U\`O‰‹ˆ‰wJPQWbhakkq:Mn…‰ЭЃИ”‚’”‡ˆ””Œƒ…ŽŠ{wЃ‚"*TB@*:@BNFJ5??04&G‡œ‚—‘›te\crpiehnhd’}uЮœ™‚Š‹h}ЂДЃqƒ”{z~”c@JFGA?541`QME2+8L8>b|qu|…ЕЉŒP8Wbjkc^aobmi\zИЂ›‰Œ}ˆЊ˜‰ˆ‰”Œ‰^IT;8H1.;IMI>F4524nН™}x|vŠŸ›{me[ZY]{vEM]ƒ‘З‡ˆ–œЌАЛЅž‹Š{ЄУЏP8;)#2,.;?B83>>3L.ht‘x~vu{}‡ŸxLZ]gJ<~S&,Qu‘ƒ||{‚–РЉЉНЦ–wQ„Зрь)>EF;47>>GCE#0ACHO‚‰xwv~‚‹w^|qzP9Q`Yto]‡ЂЋ›xuŽЎДЊœЃ™Š‡ixАЩ>QB<7>%<9F:?2.(,LWЂЌТ”ndrtphZ’•|O?giped‚ŒВЪБЄ‡q{Ї„Ž’‘‰|iЇЃ0MF>G@4E878A2<@A7T‰—’Є‚ˆ…kqxpjG|rƒdjtkq•ЃЦ뙉{‚}‡’ž—˜}k‘ЏЅŸCMB<;H3@;;>ICF?09tžНФЎŠŠ|uviqrrYtЧЏda[bieZoлёЕއ}{„‡‚–”‘…Ž˜ЏQHGFJEFA?GJUOIA1>Oi‹|ТыьЮtAGAEENH38BS—Љ‘ƒЃНЏЎkLhuˆФдœ`QgZr‚‰ƒ{tq—ЄЃЊЏЄ–Žˆ”‡’—‘ЇИА–ŒŠ2>;?FSQV[YdQQY‹В‚p‘КЪйЃk]ސУЫЗd`bbh}‹‡~mˆЕЦЌЄ‘œŸЇЈ—Š”•m™ЮКЂ’”Ѕ:3>;:LHLQJQTUd•лЉŒ”АВ’JHo|˜˜•TW]U{œo`Q‚ЦхК‘œЅЎР‹–ŒŠŒ’’ˆ‡НЛ‚Ž(;49BMGAC;-3U^ŸИœЊЛзРqQ^БжтЃ‰u~cV@j}uVCIxЋЄŸ‡ƒxЌд’qvu|ƒˆ~ЗВ›•‹<0:>GL?3HL+UTaœЏЂ’Љ™ukh—ЮИrcrgc]ipnE&?ЅЎœ”ŒpV‹Ђz}w~Š}ƒ‚™œžAHA;AJ::Yhm|bcЃЗЋž˜–ŸŸ}[i|ЂУЋ”WW^\pwaVW‹мБ~„zz’„‡–—ˆŠС•ЂЃ›NI>@:H@@Lu|oVv‚–’ƒŠЇ’V>MuЁшШЈŸgGWeaktkaUqˆ`…‘‘’‹‚„ЁЄ”Ї™˜B@UI*UVijpaРЧЇЃxˆЃeV}БНЎ—u^WZ[num^PdŽ~ЃœŒ’vi‘Ÿž™—‰…‹Š‰T]WHS~nTQtv‡Кчнрй•‡„…pjŽЎВЈЃtVbaa‘}…^HTt˜…ŒŠƒ‹‰‚x{}z•žžЃЂ–”‹]’zo‹ЅŽxp{iP^ОђчТЊ‡rr~}„–ŠСэУn\nnrŒ{WCMЅЈЅŒŠŒ„‚{{‚”œЂŸЄ”—–‹hrhwЄВ{r{ujiВуїщРƒVpx|›œŠzЁЏ”wnqtuƒZVb„ŒЉЈЈ‘Аƒce„˜‘‡”œ””žЂˆnv{ˆ™•kp„„‹СјюгЏЅˆŠ‘Ÿ’~йаЉoip~zq[\krЉЛЊЎЩ}œСАЃ”Žpwu‡ЁЁžŠ|„ƒ‚ЇА‰du‚vxЋбђзМЄ•w’Œ‰ŒŒ…ЁВЅnu{xz{{wpkeq…‡˜—Œ}ˆwqŒРŸ~xuuД›‹Œ…‡˜ЃŽ”{}›зўьчЧ‹o‡ˆ‡Ÿo…ˆФУЛwcbdu|~ojq‡up™ЫЎЗ|~zgrЎžЅ‘ŒŒ——Ž~‚„‘›•ˆЄn…œюўљЧЇ‚|ƒ|v’ЮјЮЅ’{~nnrv|rpv„ƒŒЌюреŒ~zzƒЄ–™‹„ЂЉЉ‰—ЁŸ„……”’’ЛђўўћдŽˆˆ‚‚‡’ДпюЩБ‚tiaZ}{„||w|’А’‹К~}{{ŠЂЉ›‘’ŠŠ—ЈЊЃ›ƒ›˜ƒx}•Ебдўў€МДЄ”||„™ВРБЖЕcJQVww}‚{}‹Žƒ‡…ƒ‰—Јœ|ƒ‰›ЁЅЉ{muЄŸn„…ЛлўјўўК›~{ŸЅДБЄЋ’pQLr›Œ‡Ž”‹…‰•””•–•’„Ž—‚n‚ŠŒЧЊЉЈ80EGYep‘ЁŸŸЗѕў§ўўпМЮЕЂ‚xнц”wŒ›Є{gj{~ƒŠ”А‡ˆ”—œŽ‘‘…|}xuvzhЃœ‘kQONF9?bob]—ўў€YтЕЄЇŽd}Є˜—ƒ…bajpvˆ…{qv|}—˜ŸŽ‡„‰~zЉ‡{„ДЋЈ›+%CCZNANUTNn–Ž™ЋЭўўчТКгЭЉнЧŠˆ~‰”uŸ‹{ˆ…vqzŠЖЎЃЉА—‰›М‹t‹‡zx{uЁАЄœ2<8<@CFIN?:WYYWUV}›ЁМх§ТЎЉВ˜–•Š~ˆ‡…ƒ~rrpnŽЃЈ—Ѓ—˜ЌФЗ|Ѕ…‚ˆŒ|~œЈ’EC@CFJGAJMO[d|‚˜verxYNvМТЕЃЖВЊ—„}}‚‡„xg{xjxŽŠŠЫн‹Ѕ‘‰Œ„‰—LGF@CGCHA?L]kmhwbHS^@GJbuiQ\}‹Œˆ…|БЎŠŒƒƒ|vx~‡ƒˆБЏ’~‘u{‚˜’”ŠMILGFJTVUTVWOTF^e]STL^h`ƒ^EFVVFSgjЅК’”ЌŒƒ…ˆˆ…ƒ…•ދД‘znpp‡‰Œ•HHA@%3H9IOZYJSTZQTP[NOYQWSS\VcMQ<&SjnАŒ‹jxtŒ–‘ŒŒ’””Ё”w`r™•Ÿœ9<>9?>4?>TS]aZ^\PTU\cbVSNNMLSQLI5GI?HPTt{ЄС–’œŒ™ЎЁkuu‚‘™Е–EBAJHG>ELQO[UT\ZWZSWUNO9HCGLNZSQHESZW[^gV:HG-.5JW`{‹›ЋМЖЊЁz„ЛЊЅUMZI@A;.EaGNPSVNPLFIWMEGHNUSQYVSMHW\WQSHMCMMOMQkveS@Ljx|Ђ…xИдЏЇ(GEAFA>LMJQFLHI?GBHF@BGFSMZW^ZVUSYHEU?GWYV^]id.HzpWOHBJSTY`[QTM?C2;??:?HGLQOH@AFBIF:5?EHLNSZc`^QPOHGg?Paigd^jv\‡ЊrOZUWV[Z\U][NL@8>:E;?QWUISQONMOCB7GJZ\S`[PTbSTNMLGGLB<@L`TMYaaQMIIА™vgd^^UNWi}gv‡~Sbid\YUW[L2HGEBUUggdbicaV^^TJMGJLPAFIMMVH>GB>YCTзтђрФВКУ‰~…mTŒžuWmi^bbрcbWHPMOPVMV^ijnnbVT[YUVTWLSAC?GEEA€HINNSДМЦЧФЦШЭЫччВˆЄЊ[jwj]ee^`^YZQ[WZLPkvhrS^[bccY\WVSJHF<:BA?CAIILMNžЎДДЖЕБЖЭьшяуМЎŸЉЈ{\\gcg}]M^aeaYZO~oŽe[WmnokhbVOLEENGB@AB-1HSJ`dh}Šrdbhapx{ƒuerqom`a`W^a]YU\ZZPLGLGMSQghaPTQHM@NJOJ2%,);+04+OvSVi{po{jhgt…Œ„{r|zqqVYYQWQVUUTQWNMGNIHM\[\UYPMJNAPWNE3-&:@$#@dbj|nnvz‰‘ˆ…‰‚„cJMMNWWQSM[h]YSSNU]ibUVFFOOUW]]US248% .,.*+8JQGHC$"AJH^~‚mjQZddn{kdU^hbSGMIEOWZY $$&" (,,-:<$!(*"$$  78(0UMEG?IE3$$!" %8+4  +1%*7;>7*, ! ")" )$9OF.1@(,%1!#0-# )*#(1.3#27$%" -4,$,&-+228;E<.,&0..4% "  +!%%""$32004,%%#52$+,)8<3-8?2>74#&""$&3,  #)7" &-80!"(*2.%((-,"&10!$#. )"($(.&$%#!!<5-,!* #,!%!-%&+" !шЛЕЖМИИКДЗКНУТРЗЗЛКЗЕНУУРРТ€žМНСТШЪТЦЧЫКДАЌЏЗТЯЫЩЪЫСЦэдАЕДЏЛЦЩФНЖЖМНУОСМИЖЛРОНРЦЩФКБЛТННРОРОКИЖМФЦЪЦОММАЏЊЌЏЕНЩЪШЩУЛРСМИББЏНТСТУЛещЯКМРМНКМЛЛМЖОСФРНТТУСММСЦФУОТССМКЏЖБЕЌЖЋАДНУЧФНКВБДЖБАЖММЛ—ЫїўеЏРСРЦФМЛЕИЎКЛМЖЖСФУСЧШЦЦЮббЧЫФСНЛСФММЛЛЖТОЩЮЩЧШУЦФУОЕВЛОРЗЖКЪФкЪп§южаббЫӘЊЌЏДВЕЧЭЩЧЫССУШЯдзбЭЩФЦЪЧШФФйЖŸдгааЪШУРФФТУТШУСИЕЎЦЌВЫсэлШгняЯБŸБЕВЖЖтмааУМНУУСЦТадбЭВИФНжгЛЗЎпяеЪРР€єУООИОФФТЩЪйЫдŸБаЭВКаюсєгЗЏЪЮЩеРžФаЯЦФСУЦШУУЮзЯЩСЂŸu–ФЕДВБЩкЫФОТРСМИЛИЗМОТЪЧ͘ЉТЫЧФЖгажкЩЏМШЯббЪМУЪЮЩЧФЧЩЮбдгбЮЮбйбВЉОИИВЅЕСННОНЭШЦНЛМФЦСЛЛКИНФЦЩЦРУЧбзчйЊМУЭЯЪФСУУФРСМЛУЧбдзйЯТЦЩЦЭФУРРЛЖДИИЖЛРФФНЛМРЧУТИЛНМбаббЫММРчекнЭФЩФУТТСФЪЦТЛЗМЛФгдзкзаЫЧРНРРЪЖЗОИЗЌЌЏЛНРКИОНТЭЧЛОММждкгеЦТЕИагЫЩЩЪЭУНРЧЫЯЮЩШОСОЛЋФзз€ьаЭЦРМЗДБЈЎБДИЗЌЎАЖМОФШУМУЧУИМНЪЪабЮУЫЦЯгйжгзЫОЕИКТЧЧбЩЫФСУУЦапмсёмВТЗЕЖВЎБЕВЗДЎБЖЗКННЭЖТЫжЉДКРЧЪдгЯЧЧЪдгджззЕЇАзшйФУЩШШОССФЦЪсрсєцЕИНЛКИБММОКЗЖЏДДЉЊДФФЭЮШЈММУЫЫЭбЪЩЩЧбкйлп§Шƒ„ЮѓЭЧЧЪЧЧРОЗМРЫкедЩМСаТШЦОДДНЦЦРММБЇЈДЛЏУЭЫСЎБКОЩЫааЮЭбдкекдлёЫЁЅРрбЮТФЦЫСРНЖЦЫгзеЯЦТРЩЫФДЏЎЗРРОНИЏЌЎЛСНФЩЦМЗМТЦЦШЭаЯЮжззйлзЛТАЉРТаЫЪФЦШЫЮУУЦЩЯбджЮЩЦЧСФгЪЋЏЕОИЖЕЖЎЕММССФЧФМЖЛОУОРЧЭгЯЭЯгкыбСЧЫЮЮЯдЮЪЮЩООЗЗМЩЮбЭЭЮЭЪНКМЛСМБЋЗИКЖЗВКРОНЛРТУСКЕЗОФССМзжздекныШЦФЦЪЦЩЫгтЦЁКДВВЕСШаЩЦЦШУРЗЖДЛИДБЎЗЛЖЛМУЧЦСННОНРОРЛУРЪЩЦжмпкмкрђСНЧЧяФШаюлВ—ЗМСРММОУШЦЦ€^ЪУЧУСКНЛЕАВЎЎВЛбэЭШЦЧТЛЛСРОУЦТЩЮжмрнмрчћсЪЭШСОШмнмКДЎЛРУОУШабЩСЪаЯЪЭЩТЛДИННЖ‹k–ањбСОУТООКЕЖУЫСЩЫгбжкйллпзйЯШЛШхжбЛЩНБВЗИСЦЯдЮЦТЩаЭЩЈЕКЎЕИНТцС|ЎЭЦЛЉШюЮЩШУРСЭФЮгжлкеебЪжзджебЫЮдзлклгЫМАССЦШШЩШЮЫЫШУРИВБИООЛЯаЅЇВЎЎŸРЯРУСШЩЩКбеллзйпжЫадммйаЯаептчюђёТКЧЪЫЭЫЧЧШЫЦЪлЪЇЎАЕЖЕКОЦНОМРЕВЕБВИООФЛИЧЯЪЭггкбЯЮймллсмлежмрнякЉЃЗЛЧЫЮагЮЫФУКдН•›АЈАДЖЛРЛВЖКСТОИРТРМКЛЛТТ€ъШЮгжЯЫЭгбенхўтБЭгдерлЌ‰ВИВ‹аЮЯЮЩОРЛТžo‚ЉЌЖЖМСРКЗМФЩЫШЦЪЭУОММОУЧЧЫагббЯЯгбЮНтўуДЪЭЮЪдїМˆЖИЇЕЩЫЭЩЧФОЭЪВžЋЊВБЏЕИМКЛСЯЫФККСРТЗЕДАЦУЧЪЧбйждаеЮЪКФпшмббггхрЕ›ЕЖЈДщщжакНЄМЌЎЋЎБЗБЏДВЗЛМЦЮбЦНЕОМИИКЕЖНМЕЕРйнлммшВДЦФРААйЯЯТМ™›КМВЏпэпУдтОЊЖЗКЗЕКЕЕ„еЮаЫШЧЩШРКИИЖДААИМЛайыьсрсэўшЯЏРСОЇУсйзѓжБЕСЛБЗкїјяїкД—ЇЗЗЏЊЏБАСбЩТРИММБŸБВЗВЋЎЕММБбыптрлрпхлЯРСбнЮСЮабЮЮБЗБамсыђьћў§жЄ™ЎЏЌЎЎЕЄЛОМРРМСКБВЗМЖБВББОЗйэмлкппуммЦУляўсНЧЦЦЧУМИБИнёсзйбцшЯЏЎББВЕЏБЖОлЪЫСФУУОРКМННМЕВЖОЇСлЮЫллтрлзелмётЂЅМЦОТССОИЗйэжбЯакзЖœžЈЉЌЕББњЋУЦТСЦЦоСОМРФМЗЋЇЏШОРЦТашцуухйбазьуВЎЦЧФЦТТ€€ФРШйлегамШКНБЌЋДИКРКЛЗКРУЦЦСРОФФНИЕАЎЋЦРРФЩЭЫршмубЭЪЫЫФШЩЮЮФСРНУШазккжгдЪЎœЎЏЌДЗЛЕККМКИМТЩШСКЕЛТЌŸЎАДЭСМФЯееушљєСНЫаЯЭаЪЭЯФРРНУЯялкгЯШНУЛДББВВККАДЕАБАЎФЭЩООЛЖАЌžЂЉДНЦСФЭджеущчызИМЧЩЮЭжпўдНФШЧЪЮдЯЮпнШИЈКЗЗЕЗСУОИЕЏЋЎЇЕТТЏЌЕКЕЌЌЖЎЊОШЦЪЮЯНдњччўщТДТНЛЋендЫЧЫаЮЧЪЮШРюўчУЛКИБАЕРОЛКЕЕВВДЗЗБЏЌЏЎЌЎДМТУУЩРТШглкђутузВФРИВЏгЧОНШббЩЦТЩЭкюђжДЋНКЕЕИРННЛЛРКЛНМНМЖВЌЎВЕКОУЦЦРКЛЛйщдпмкмЧНЮЧНКИРТОТЩЩФННяФЫклсЫСККЛИИРШЧЧОО€ѕНТФРУФОЖЎБЗРТРОЛЛТЛОЛЛОНйегЯбЯЦРРТТУЧЩЯЭЩСТОРНРФйУЁВДЕДЖСЩЩЪЧЦФЦЫЪШЪШРЎЎЊЌБИЗКВБТСЧЩШСИМмркжкЪРЛСУФРТдйдЩЩФФжкпедФЄЌЏБАЕЖЛОЦЭЫЦРСННРМКОЏЌЎБЕЕИЛЖФТЦЧЪИСгрјѕкЛЛЦОИЛЛŸКхжжгЫЩглтхмЛКЉКМКЖКЖЕЖОШФУТИЗДАВБЏЉЄЊЊЏЎЉЎЎФООРРБЩыћшѕуОЧЧСЖЌАВСѕаЫЧУТУуэћњцдФССК€ЗБВИММКЕДДВВБЊЇЄЄЃЁЃЃЂЁЈНУЩЦЧЫеншпмжЧТЦКЏЋАШЕФЦУОНЧзщїљзЎЉННМНМКИЖВЕВЎЋЉЈЏВБЈЁЂЁЇЄЂžœЂЈЎДНЦЦШКЭщмхжгЧФФТЖДЖЩЪДЦИЕЕБВНдзМ™–ЖВААВЗЖДЏЈЈЇЅЄЅЏЕБЊЄЈЈЪЄЅЂžЅЎВЎЎЗРШйггаЛТЧЩЮЪкдЫУРИЕЊЉАЛДАТЫЩЏЎЏЏЎЎЏДБЌЉЄЄЅЌЌœВЛРРИДЊЉЈЅЃЅЅЊЊАНЛОСЦЪЫЭЫЧФШЯЯгззбЫФКТЛЛНШрўўљУЋКИКЗБЏБАЉЇЈЄЄЂЃЇЎИИДАЕДБВЌЊЅЈЉЊШСУЦЮЮЯйккеЭЧЩЯагжгаЫЫЕЩОВ”ЄАТНЗИДЖЛИЕЕАЎЋЉЉЇЄЃЂЇЎБЕБЏЌЈЌББАЎЋЌЈЦТШЮдЯЯдйедЦФЩЫЯбаЩТФЩЧЧТНДЗјўнСМВВѕЖИАЄ›œ›ŸЁЃЃЗЅЋЎБ˜œЄЏБЏЈЉЉЋОЧзеЭЫаббЮЯЦЩЧТФЦЫЭУРРТШЧЧУМбМ™œЌЎЎДЕДЏœЂž™™˜ŸЄЈЊЈЊАЊŸŸ—ЊЊ€€ЅЌЏА}‹ЄЇЛЮысЦФУСНОЦСОСТРЛЌДКТРККЪƘЉЊЉЊЏАДБЊЇЋЉЊЈЃЄЄЃЂЇЉЊЉЈЃžЅЈЊЎВЎЏabTQwЂУЗЎФЭЛИСЫШСНЛОЛЕЕЏИЕВБДВАЋЋЌЅЄЅЈЌЅЄЊЊЃЂ›™œЂЇЋЎЌЋЊЉЉЅЈЉЉхЇЃHT]TG`xk‡ВЭЊЊРЭРЛЖЖВИЛССННКіЖБАЏЊЊЄЄЅЃЃЈ€ШЂ›˜•ЁЈБЏЎЇЉЁŸЁ›ŸЁЉЄЁFEE>NFJEArЂƒ…ЉРКЕЛВДЗОЦЩЯЫЫЪШФЧЎЇЄЂŸЉЊЉЁЂЊЉЈžž™˜ЁЅЊЋЇЇžœ›—˜ЄЅЇЇЃHB@>>:44A]WF9\ƒ…–ИЎЕЏИШЮмЯЮШЩШЫД›—ŸžЁЅЈЃЉЎЎЋЂŸžŸЁЊЏЌЈЄЅЃЄЈЊЊЅЄЇЅNIGC<478(&AILJJSQni`^G3Qtr~”žЏШлЧžŸАœ˜›œЂЅЃЃЂЄЂЅЅЃœЂЁŸЂ›ЁŸ›–™ЄЈACFMPJLG>;;CL8<;?B4>?GF4!1:9?:?Y^SQwttmmtrcVPOL>I[SZ*0,4138<:58:<<@FNOLMC<:9A>?ACCо@HJI?8<@A<>H8QH17NH;7>QZ22€ч718@B?94:;??>;8:>C@BBGIG?><5AGGC?-.10-1;<@:.*279><987;9CBFJJB;CFB<:47.37@BCJI?8;><;CGGE?;9BB?8:AA1523&).)-(.2,4.:9>9>ь;9:>A>@AG?:31:9:005:€Ж}x}Љ…‚|}~‹‰Žƒ}…Š|xŒ•Ё‚‰…’„…‡–Ž‘–”|qtotvŠ‹”„ˆМ˜‚~uo”’‡|„‡„‡…‚ƒ‚…ƒ‡ƒ…Š—™ŽˆŒ•Ё„„‹z|‰‘–‹‰‚‚{{krwpwƒ”‹ˆ‚~z{vwtr”ƒ‰Ћ’‚„{‘ƒ|Œ‹||‡’‘Ї’—‡z‘Œ”‡Œ’Žz~xu|{kkr‚ƒŠŒŠ|uxp{{€˜w|‡ŒŠ‚|}ЯнЏ{‡ƒ’Š‘}|xwАxr„ž‹‡Œ–—Œ•ˆŽˆw‡‰ƒw…~ztŽ‘–‘’‰–”‘‘urt„{rx’‰А—ЋкУЄ•ЁŸ˜[nwƒ~x}Œ™‘ŒžŽˆ‘˜—ЂЂž‰‰ŒŒ””•„zd—‘ž–‘ˆ‘Œ’ƒ’ސ}xot”zw›ЗЩЃ˜™ВМ•}jr||~€дЂЁ›Šˆˆ‰‹…ŒЇ›™~w’Z…˜ŸurЅЖ™‹|„~w‡‰‹Š—‹Аnuœ’rЌгЯбЄƒz˜‘’˜‰dŠЋЇŠŽ‹‘Ї‚”ЅЇŠ…e`?aˆ~rntžЈ”ƒ~„ƒ}x{p‰‹Œ„‹‡odo‰–Ž{ЄЈЗЃ›wƒŽЊЃŒ„‡ŸЂЃ‰‹‘•›™™Ѓ™˜ŒœЊЃ~w‡zx{n‡…ƒ}{‰ŒŠˆ„~Š”Œˆ‚|•‹ƒ‰˜™ЌКЊxŽ’‘Ÿ•ƒ‰‹„…ˆƒ‹™ЁЋЌЁ˜‹”‘€v|~„…ƒx}ˆŠˆƒ„„‰ˆ…}ƒ—˜’Ї›„ЩСБЕœ›Ѓ—‡Š‹‘™~ƒƒ‚ˆ‰œ›ВДЃ˜Œ‹ˆŽŒxu‚Ё}j~Šˆx~‚…‹Ž„~ЋЅЁАžЂ”…˜ЅЃЄ’”—›‹”ž”–›‘‹ˆ‚j‡Єœ•—–‡{‰…ggno{vr‚z}ˆ„…ŒŒ€˜ˆ•‘ˆ{|ƒŽ›™–—‡ЁЇЅЅЏЋˆ|}w…‘œ—Ћ‘‹ƒˆ…‰ЌЄЋСЎ~ˆ{uwxt{tqu‚x~}‡ƒŒ|Ž›ЁmzuŒ—ЃЃ‹ЉЅЁЋЎА‚t|ЂЎЎ‰Ž—ƒz‡„ŒЎЊЏРУtz|{~ށz{z~|vour‰™—˜op}‡’”œ˜—ЄЌЎžЇЎа‹TWŸН’…Œ‰–ˆ…„ƒ„‡ŒЃЉЅž‹‹ЅŠŽ‘„}{}ˆ‹Š}vrg|o‰”‹wz‡Ž’˜ЁЂ—žЌЕКИЂЁЌФŠrk‰œЅ‘‹Ž›™~}{…œЃœŸ–‹…˜–”zhk{„„…~„‘‹Ž”Šƒƒ‰Š…”œЂЂЃžЏЗВВ›}„t{ސ–œŠ„‘”Ž{ˆ—›ЂЉЉž”’’„Ž—Š|n„…}xwm{‘Ž|„‘‘…ƒ~}„ˆ‰‘ЃЇŸž›ЁЏД—Ž”–”ž’›–”ŠŠ{ƒ}‹—˜˜‹‘˜„ƒ…‡…pv‡z|v|ˆŒ…‡‰‰|zx~‡ŽŒЈАЌЁ›ЎЧО•‘›™‘Œ‹œДizz~‡–˜™—‘ŠŒ‚~{wgv}|‚}}…ˆ”Ž…„‚{‹‡ƒ”‘ŒЈАЖЏЅЕЮМ‹Š•˜•”•œОЉƒaz‹Šˆƒ‡‡‘–Ž—””„‡ƒ}xz{uuq{˜З•Œ˜„zu…ŠŽ’‘”œЌБЏВАВУжЈ…‹Š‰‘ЄБЇ|v{„„Š…ŒЅ—Ž”Ђ–—Œ—•{itqZ5n‘КŸŠˆ’’|x…{›‡œЃЇЊЈЎДЈЛАЄ™”Ž‹’ЏЄЄˆ”zxƒƒ‡‚’œ™›ˆ””œ™nxxvu|‡ЂˆFw‡}pС™‰Š‹‰”ЄЋЎЏЋЇЈЈЉЈœ•˜žœŸŸ€ŒЎЂžЁ’…z‡‘”›•‘™ž‘„wxx}‘„…Ž’\mn~wriŒˆŠ…—ЇžДЏЋЌЈЊЗЁЁЋЁŸЌЇ•ЁЅЋМЖМРФˆjŠ‘ž–•‘‡––ŽЋ™imm{|z}‰ˆŽv„|uwr„~vˆ}}t—’’ЁЃЅŸА•ЉБЁŸЏАБЉЃЃЇБЖРЄvu„‹Œ˜›—–’•Ё—]erpwpr„ƒ{tˆŒ‚‡…‰‹ƒˆ…Š„—™ЇЋЇ”žЁЃžЋНнВ‡–ЅЁЁЊЌ‚Y|Š|[ЂЂŸ˜‘Œwƒ…eBFjuq|{„Ї}~‹‘Œ…‰Šˆ~ƒ‹Š‹”Ÿ™ЅЇ˜™ŸЄ˜‰МыЖ–—‘ŸЊЪ…Ow|r‡–˜‹Ž‹—Ž}e^gpp~}~}ƒ’‘–’ƒ|‹‹…‚}ƒ‰’Œ—ЈЌЊ›ŸЈЁ‹”ИФЛЂЃЁœЖЖ{e„o„ТМžŸЌ‘u‡{bkt~}tutu{z‰˜Ÿ—„~‚„ƒ‡‚~‚ƒƒŠ—АЗЎžЊК}z‰˜ˆ}a~ЊЁ™‹Ždb„…x~ЖЦЌŽЄЗ”v…ƒ{ƒ‚wwž——‘•‹„|}wzwwЁ‹žЅКФИВВСьЩqŠŽ‘u‹ДЅЌШЇw{ŠˆxƒЕршйпД„jrvxup„—މwƒ‚…{qtwqqutw{…‚ЇТЩЕЊЋБФРВЅŠ‡˜Ё˜‰ЄŸŸœЅ{zЃДИатпёђэЕqjtnqu|xpj…ˆ‰ŽŠ„~|ƒ}~ˆ‚{}„ˆЅФИАЊЏНЦЩЕ’ЎТцЏ‡‘’Š|ˆЊЪЧКМЖЪЪ›utw{}vv|„Ѕžƒ…‰‰ˆ…‡„‡Š‹‡tqwžƒЗЅЁАЖЕОЕžЈЏМУДun‰ƒ‹…ŽˆƒˆЈУЇЇ€WЁАВxchoo~w‡wŠ™˜‚‰‘”ƒ{‚‰~|umo‰›˜ЄКШЩОЖАžСБƒw’”•‹ŽŒŽŒˆ—ЏБЇЁЈБ‘ˆ…{|{~„ˆ‹™‹ŒŽ”—–ŽŒ‘‹ƒƒwr™‹”‘—Є˜ТРЎКЇ”˜–”ž—’•ЄޙЅЛРЗЃž—zjxq|tŒŠ‹ˆˆz‚ŽœЁ„ƒˆuhqaz‰‰ŒœžЃЩЮкг‹ƒŸžЈЎЉЇЈ–•„‡ŠŠœФЌЌЁŸŸ‘•‡|}|tu‚‡ˆ‚ƒ…„~Š™ž—…„‡zhdhj…‡‡ŠžЅЊЕСНСЎ‰‰•ЂœžЁЋкЈ‰–˜”‘œœ—ЁЖЈ‘‡r…ˆ~}„Œ‡xnq{w~’˜{„|uoz|pp‹ŒЂ›Є˜‡ЁчмсљЯ•‰„…ƒnЅБЈœ–ЃЉЃ—›””–дчТ•…‡~|~~”’ƒz{}}‚wxvww€Фt‚…‹’•’Ž›ЌБЌйеЩУН™‚|zŸ•‘’ЂЉž„Ž‘˜ЇФШЇ}o‚zƒ‹‡ˆ~…{‚‚„ƒvrvux…ˆ”–™‰ŽƒЎЩДСЕЕБ•‹˜–‘„‹Œ‰Œ”™—‡Š‡„‡ЕД˜Š~ƒ~‰•—Љ‰}ƒƒ‡‹””}}‹’ŠŠ‡…ˆˆ…„‰’q•ВЌЄЈЊЃ‘”ˆŒˆ‰•žЅЉ’‹ˆ~|™Ќ›mx~wxz„••˜™ˆ‹”•˜‹vniu„w|{t…Ž’•™”Œ”БЗЅЋЋ•ƒ„‡Ž……‘ЈЁЇŒ’ЂАЖДЉ˜xtxwtr„‰…–˜˜‡ƒ‡•…„|ruzƒ„‚~™žŸœ‹ЇСсЮЂ‚‹”–ˆ{МИЎЄ—•ЃЏДУИŒ‡u‚ƒwwŒ•™‹{vqpwoojktxtonpŠŽ‡”’Œ˜ЫцзгЦ•Œ‡„}‰„дВ•ŒŽ›СгххЭД•‹ˆŠƒ‡}{{‚‚}~zv|…}timjicnjgnhˆ›™‘ЊЈДУНДЎ’’…‚‚xw™ŠЇЗЉ˜”žВЦпуЛ}Š‘‘„‚}tnnrnmitutmkbkcgaa`anu{‘–Ё™‹ŸЩТСœЈŒ’„wx—‹Ђ–Š‚ŒДЌŒrjƒ}z~„~vjeorqhoxoiqkgkokemoo{bŠ‘Œ˜ЏЊЈЋ…”™”ЇЈž—Œˆx{~ƒ~}Œ™wzwtxwz{rojmonpq|‹}|pkhinttkp|Š‹‰„Ž‘˜›˜–Š•ЊЃ›ЃЌЌЈ‹‰ƒ•Дпўе‘wz~…|{xwxnmb`mgdk}~„~ƒzzuzrtoqœ–”–—ЎДЊВЃ’›™ЇЃЇЃ—Ёœ™‚h}‡–Œ‰„ˆ‚}{{urpmnkehow{zvwurrutmqq€Ѓ‘‹ŸЃЁЈИРЄ’•ЁЄЈЁ‘‹ˆ”ЂЄ„~’уђТ—‡vpz|}|n`^\adghgirkv}c[^iwxwnmqu•ЁЈЄЂЅЉЂžЇœ›‘•’Œ‘œ‚‰‘›‘‹ˆЄ—pkpz~}{~u[\W^\^b]nihpqpi[adkjioprtm‚Š‚…ЂРУ›˜Ž…’‹—˜’„‚z~•”‰ˆ˜‚itrtrq{vpmjqvtnnjquvkuvmddghmptrrigdHFe|›ƒœ•…‰”™™’ŒŠ}z‚}„wvtqricckgkhmmheddghu{xxtqkimqoohbI[UNAZgak–›{•Ѓƒƒ‚~Š‹–Šƒ~‚‡}xuwqrtnahkmneZ\Z[akqwrrjjeb]\eog]@H1GQJMCCp‹kj~”’ƒ{{}Ž›ЄЁ–ŽŽ‹‰vmjhjqtigdmtabdagbppvtvjbaeekhehgJE?H@A*>@[V53Pow|”~}„›ЃЉЂ˜™–œ~eidd€[hgkpu|penpjrt|mjddgjpqpmhiNIINEB2;*&;HBHGJTcc^TUwЊбЦ™ˆ”ЋЏЈ‡hb`ima`gnkhc`cdiw~wnodgnnedjbgeQIHF>G?C@HHLOOMOnjWS?3G\Ydot‡ŸЉœp\kt^^]jntqihdjwnnhiamhh^aegbcmqBH@LJH@@HICCFIHQSUNG;HGNLMC?>J`^G2?`khr™•‡jt{x„Œ{ro~tp^^\Whjtm99?AB>E<8@BHGTTLG>@@MB;-878.8>2AOOH0:.@38?MF>9:AF?CHVUSFGB>CF>:;AB8BCG?:B@>5;EBLkaMP?8LE-9FH?5@SP:3?3?@GPG?9>?EGEFF?>0C<9HH>>AA99EJABC>;;BSSUOT\TIIBLPOIEC9F?77;3>>GIG@:)9>GI?@7>?G@OJLLJIHCAHHA91;8EBE<;9QMMONTZQSMSHE?;<8F7E3:<;:2EGB3900;BCC;M?GGLOQOABNMI7?. FIBGICB?CJGHAGNE>BA?;47?E49302?+94<53,2?FMFFBHFAF4,89CI@BH@CCH@GQUQIMWghmr{„e^kricbiqtuvwtx}}xuvqknrqPjAJNLIJTQ^c^a`cibWHJEBAF>OZTOQW\agZrŠxdTZdmprpjvtqommkuwjdg`ike^hVSQMGJ]bcbcbie\^`aVIC9GJMVYPMLY^]UW]WPT`nkdg`]ep{rZZ^nUU^agzmcejOU[ab`ZUOPWZOUZYTFNIILQ\]\\ZU^[QZTQPMPQdha[qbSgvzk[SZniSV`^GIEH^VSOZeeaa``€Њdg]OOa\E7N\cWdht•k`WWPIAQW^U[SJ5-::4#.%>+$%!(%SPYWUn‚v[OYWJT]S:WJ ! ! ##"!!(*..4.)€H%$(%-(+,!"(:A88-+  &".%4>@2I>0%#!$**2)3:?2$%*2)&1*@@7$5;487) $F02249<;-8;:@A977521$&5,*2;8;?;7:;7$Lek`F@; "%+(&0,+%0#* %.+9B;;?EAIGFIBC<;:89><9@GA>9937B?BAHILG<4($!+$$05138+4@8)( &21<@?@B5.49?9:MM?0,,-.3;B:2215<5 "%137@<7?G:5M7#-2+%84A?>5,<>@BCII@F0@F@0$8+?<)),;7AIE9BI432577958;>?>BGBAB>8;:EFE@ILJCEE@:GOPVQ>>A7(@<<> 9;>@BAAEMOTLQj[A>>A?9<;>7;:BHG@?:>;?E?>JILO;@?ACFISYQIC;>;@A>11@\E@EEC@>?@CGNONGCA@><:;A9:;AAFCBB?;Srp`IA;?7;:;BACI:+%+>:A;>CCGIOLMNIMICAA?BFIHGBCBHE?<<@@JINQJBAA9?@>@EGE@85@LNGC@))A>><@CLJEGIJECFJF;;Љ>934534IZNNOIEA>?€…‰’ށˆ‘•‘‡Š‘™Мйžžqztouk‰{Ў›ЂЅЂЇЁ•‰‘—˜’ƒpŸ”ОЩнаЗЂ™—”™ŸЃ•|ŒŠŽŒ••—••œŸ•ЖЕО‹cƒr`kuq‚—’–Їž˜›žЁЄЃ–˜Œ‰™ЌугтчЉw˜ŸЅœŒАЂz‰ŽŠŒ’„Œ‰‚—ЂŒwwh–‡Q0g‘pi•Ђ•ЅЃЂ”‘ЏЖЈ”‹‘zŒДЕАЇЃŒ”ЂЋЏЊ’’ЉЏЋ„‰”›‘‹}‡Œ‚•˜›ˆ‡‹™‡m{ЇŸxt„АЅЅЃЉДЅ‘”ЃИИЯОЃ—”ŽŽЄЗДЌЎЊАЏЄŽ™”ЁЄЌFnЇ–…Š„‹Š…ŽŒ”–’}cI{™Ž”ЃŸœžžЌЉ•ސМгЈВДЌЋ”ƒ‹ДВАЌЏЋКЊŸ›…„”ЛВoŒœ‘”•’Ž‰‡‹Ÿ–™ŽŠ‰o}bv{…‹……ŠŸЊŸ›–‡‡–Є™˜ЂЁЁ‘‘ЄВИКИОЎВАЇЁ™Ž‡ЅЕo{ˆ””Ž’Š‹—”Ž’—Ѕ—‰‚pznnrž~z™–ЏКЅ˜–˜Ї|ЎЂžŸŸ•”ž’”ЅМАКЛИФБЅЇœ‹œЎŽœ‹ˆ~ˆ‘˜—ŒŠœ‹…~}}wqhvŒrn’‘АБЃ’‚АщЛК‘”˜ЌЈЈœ›’vЇСОРСКЗКЏЌŸžŒŠ‹„—‹”’™‘„Š…ƒ~…vhqm|w~‘•›ЌЉ•ŒƒŸТКЖ™œŸЌЇЋЇЄ”ЁЋНСОРИЖУЂ}‘˜}‰iEpv‡••˜Є•‰ŒŒ—ˆ‡‚ond{Œ…~„r’ЉЂ—˜БИЧИЛЖЛИДОЛЌŸЇЂЫдФЦЛЎЖжК‹ˆ‘‡ŠЁŽ}u„•Н—””’‘—•‘‹Š}wz„‡}ˆ”œ™•˜ЂАКУЯООИБДРИЗИЋАФУФЕАБЏКЎ|t‰’œ•œŽ—ЊТЁ—••‰„ˆ–—›‰‡|ƒ„ƒ‚|‡…ˆ—ŸœЄЌЇЕРНБЈЉЅДДНКЖОЪНИЖЈЅŸ™’Œ‡Ђ’›žЂЅŸ›Š—К‡o|ŒŠ•‚pk{qŒ—Œvx‚Š–ЉŸЊВЃ›ЉЂЁЄЕЏОЧздгММТОЗВЊЎЖЄt…ЈŠŠ””Ÿ˜ŸЄЅœЉ—wez~{iNh‚„‚v|ƒ‡v~•–ŸЏЉОЕЅЄŸЃЃЕКЕЕЎЎШЫАБСТРВЃЈЗйЕœ”˜‹ˆ„‹Ž”‹›Ÿ˜ВЫЌŸzœvpu…‡‚ˆ…„ŽЂ‹ЁЋЋБЉœЎВТНЕЌЖОЅЏДБУЭбИЂЁ™ЁЂЁž•—ŠƒzŠ‘‘œœžœ’ŸЇЅž••‡Lhv„„‚…Œˆ~zˆЅЈЇКЏЇЂЉЏЎЗБЉБЕАЛШОбЯЯЪ›——–•™ЅЄЃˆ‹‚’˜•ŒœŸ—ЉЃŽЅЎ‚{|‰Šƒ„‚}w‹–ž›ЄАЊЋЏЋЎЏЂЈДЗИМТМРЦазИЂ™ЁЄ™ЂЅЅ}}‚Ž„œ›œœЁ˜›˜’”ƒއ…‹ƒ}vxzzw}|ŒŒ˜ŽЁБВЌВЈЃЂЃЗМЖФТТЗЗОИБЄЁžЈ—‘ЊЇ’‚]ЇЃžœ––˜”…‘Šˆ™Œˆuw„Œˆ„…ЃЏВВЋВЋЄЊЊЎЏЗНСТУЯЫТРМЖЏЋЂЈ™œžЈ–•”}—ЛЕКЭЇž••—‡„„ˆŠ……|}„~ƒŽ’‰nЕУОКЋЅЋЎБЊЖЦЫжеадФРДБЊЇЈ˜™ŽЏ}~‹ŒЦчТЕУЮТЖЌДМ›z}{vmn{‰‚uw{„Œ’–˜žРИРРБЏВЎЗЕВКЪнжбСМЖЋЇЂ›ЋЏŸ›ЂЉwx‡™œЉЖТМЎžЁ›Ÿœ•ƒ~{tou}}ˆ‚Œ‹‹‡ЏŸЏЏСОКНИЋЕЗКОгпЮОСФНДЈЁЂЉЇ—”—Єt‡{˜”ЋЖДЊЅЂŸ›Š‚ztxuuqƒz{‚‚‡…„ЋББЕЛИНЖЖСЧРОЖТЫЦТгаЪКЏœЃЁЄ™ЂЂЌŠ–—•ЖИлР”ЂЄЁ••–›™Š‡wrv…ƒ‡‡‰ˆ„ƒ…ДруНЋЈЉНОЗЕВЕЖБЦджЯмеЫБЈЄЈЈЇ—С‹ЄЂ›˜АР‘‘ѕЂЃЋЅЄ•އx|ƒƒ€2|}ƒ‚’~ŒЕЭЪНЊЏКМВБ™ЅДВЕЭлеТЫеЭБЈЈЋЊЈЊЌАТˆ™ЇЗМžŒœЊЄЁЁ˜’Œ‹‡„‚xgox}|}w•ЗгдЪЛЎЕМРЌЎЄЕТВЕЯлнжЧжкЩЕЇЂЄЌЁЃЈНސŒ‡ЃЯЕЄ–˜ЂЇ›’™›”||u}z}‚…‰ЇШчгТЖООЦНВЎАКОЩагжЧЫанаКВЉЈЋЇЂЋЌЅЅ…z”ЂЊЉЃЃЂАЗМЏЊЊœ‹•‰~zvtqr~zro–СШМЏŸВРЫЛЏЇЌЕЫжккжЭЪФЪКЌЎЃЁЈЇЃЂЈ‹Š…z•ЌБЈЁЄЁЋЉЈЉœ—ˆŠ‚rr{}o‹˜„|m‰Щпа͘АМРЏЄЂЏЎСзпдйаТЫбУЏЂŸЉЕЎž—Џ……ƒƒЏхЩЗ™™€ё›ЇЎЇАŠ‚~|{Œ…Žœ‹z•тётаƒДТНИДААЗгдсржгЮаФЋЂЊЌЏЄЃИŽŠt~ЎжццѕумЩКДЊЊЁŠ…‚„‚„…ˆ‰‡}ЊЉ–Ыхспe™ОУРЏЊЄЈЪйкйкжаЭТДЁ™ЁЁžЇБ{„xn•ЮнкуьтхсуЭЇŠ‚~w|vtv~{vo{Ќгкб›ЈФЛСЕЉЇВцнтяэчгЪгНЉЋЊЉВЉЊЦw~ˆЗпеллщчхдбЏ‘•‡‚‰{u”З„xw{‘ИчЮЏЂВНФОА›ЁЈРйбшёьхзйЭВЈЌАББЏ€={‰Ё‘žСбксьюющаА‹‰–‹‘’‹„ˆ’—„}v{ŒŸОшдШОААФОЋ—ž”ЊуїшэщулЭНКЕЕЌЉЄЏЕ‡ŠŠ™ЂЩкпщђёёяшЩЏНЅ‚Š}‚oidu{zvЃЎБпцаФНОЧКЈЁ’ЄђўьюцускФНОБЏБЌЏЪШ›žЅУў§ьцрнжЫЭеМЉ–Ž‚wˆ”‘„‚‹˜{ŸйгРИОФОЖЏЎЧЯцђчкйебеЭУЛИКРИЎЕН’œƒƒЎшщптусцсбдЈ„x……„‚‚‡‰‡ƒ~œЂЪёгФЛСЮНЏЉЖЦФелхтднеЩТНТШШСЖЉДЦ••—›’ЎчётйкмдЫЎЌ›–˜–zp{‚‡ƒ{zƒЋžАЪтННУСЉŸЁЌЉЃОЫдеЫЮбФРОжтСЃЈЈїКˆ›ЇЌКднзз€єбШЩзМЛŸ™‘Œ‡~vr}~[d•™–ŠˆИУЊЅЄЂŸЂЇАЊžЏУЯмЫШЧОЛФЫФЏЁ™œЄЇgЄФЫцрсмтпкЮЗЂ”Аˆˆ~‰…ƒƒoY{Ѓžœ•ЁБЎЁЂ™ЁЁЃ™‘ŒВТсаДЎВЖРглЄŽ›—’™•ЉТмѓххЧЮтяянЋ•‹ŽŠ‰pt~‹‰ow••™˜›ЯЛЅœ‘•””™‘‹ЂУТЏЉЄŸИазРЁ–‘Љ…—’‘ЊФМŸ›™КЯФЫД—‘”Ž‡e`mmihmeސwvЅДЛЈ”އ„„ŠŒŽ›АЉ—Š—žЏМʙ•Œ’’i€Џm‡ЄЈ•žŸЎКЕЎ™•‘…‡‚korxv~xw}‚„xp„›…~‡”‹„„|ƒ‹œ”މ•ИЉЃЁЏАЎЅЂ˜™xuvnЂ”––ŸЉЏЏЌЁЄВЄ‰‰zorr{~|Œ‰‚‡‚xm}ˆŽ‹‰„‘Œ›ЂŒ…žВ™‘žЌЕЏЃЈЁЂ|{n[nŒ—˜ž˜ЈЊЅ‹ƒtjb^jjtokjr~z~‚‚„kiŠ…‘–™z™Џ‰{›ЛКЁЕЦД™›ЎКiihpˆˆŒ‰ƒrwŒˆ…‡ƒ|zk`c\bvxzx…|}v{x„„~ЌŸ’œЈŸž’ЕчёеЭШпаЭущнКЌДЛМoommt~„Šƒ{…|wqtvptoigp|ript{ƒŠƒ~wƒ˜—’ЁЈАЏНСнєнккемйжллЪЉЇЌВДmopt‘Є‘‘‹~„ˆwxtocmaZcedahkdipwuwjoŠ‘”•Ž‘Ž˜••ЇНнгЩмкЩНЕЛУЗЅŸЇЌВw}‚’–Œ’–…t{~uzjmnrrqj[aiqpcaagainh|ŠŽŽ‡„|~u„…ЊДААЕЋ‰Š˜‰™ž‰ŠŸЁžuuLJngk‚‰Š~}wtqvomkjdgdjgqzvotohimq{‚vzo}|tz‹’Ÿ”…‡ˆˆ‡‡ŠŽ™ЃЃЋozkip|„ŠŒŠŒŽprmvpwwrpqnrwvutruvuzxttrujx||~u~ˆŠˆ‡””‹Ž——–˜Єcimqp{z‡ŒŽ‹™œЂw{tgeq{}iiniowqnuuz~z‚Œ…||wppx{…’‹|‚„‰Œ™‘ˆ›•Zdnoonxwuup‡Šu„zoaghYZ^epmjdjoz~‡ŽЇvxwz|‰ŠŽ‰‰ƒŠ”ސ‰‚}‡ˆƒgz^cdb]aamorrvzƒ~}ncabYTY^conbaoqx|u‡ЄŽzmuƒŒ‡‡‚……‡ƒ{„…ŽŠ~wvvzxtvxeembV^hrrvx|{|wrvpha[WSY`khecdhunjmxmcgv|‚{‚zvw‚‡‚jqn‡pcot|Œzq}‚gmpvjpjhgehomouznkig[[`hjknqoojogmibcgc}wt‡zm{‹rk`r‚x`epi^]Uaqokjmx|ztroruwpoixgWTau|m|}‰Њœtjhc[aidvooc[FEHWJ<;:+EA,+4;44:5I;G>BGOLQC>B0GNGHMNTN?EBH:JOUZS:AC3<:;070*0:?FFSGJQW[ZibICEFBB4FEIIHSSPSCFEHE@GPTT\Z?4;9>ELTNIH?;C31->`BLITWVMUPTZ\[[UTQLGGJSJPLLNTTЫQSSOJcƒ‹|`WUBA;B?EHQEFABBLIMO<2!1CUGZVUUWY[[b`ca\[TOO€•Z\bW[Sa`]NQST[W`kdaZV@EB@@;NQLFFIM[PQC4)$HJNMU[`\[Z\UUQ[W]USNMMVZ]ZYWVNOMJUYYSQPQVSW?4>7FBEISVVWUbYUgS;EGOLTOVW]TWO[SYV^cg^]UYQVVTTULQGIJQYncemgWUSVџ€>txv‚|uvЅАOiZod~Ј™‡pmt{zz‰‘~]Cqwu–ioŒЁБЂЊЖЅ:2*B72;)$*9-5.-!5‡ƒqw{kpzЅЗnLqSC~Є’ЅŒx}Š…‚ˆ{eIUHO˜‘j~••КДМ:,N@A<3743&$-ˆŒ}rprqmm„i#Cdbp|‚z{rnv‹ŠŒ’…ˆh3+!7!)255&3ƒ}wkcMek{ЋrˆvZh‚vov‚ƒgjŠ‘ˆvzU>@ddueuИЌБЏ”ЪЦcE?LhI8&&%*48878Q&Œ~ƒqZSI~–Ÿ››xYZ`Ymu”˜…w–А‘…t‰jG2Zv‰‹”™ЁЌЎЂЂЖwJZ@:9131<><7*3)Ё›–~ukt‹ЁmSozjpzސ„„ЇЂ‹ƒ‹}~F)Enˆ„ЂЅЉЉЇВАВФЉNJMF,2-""+858+4…h`bYh{ˆjt||u‹ŽŠ„œЊЎЃŒhqj\.Nhu‹Ћ—’”ЂЋЋЎЅI)-."1815(P‰Ž™ŠvO`vqr{‡Ž…‡}‹Š‰‘’Ÿ˜~tt|Smirm›˜™ЂЃМеЭШaF8FMdG*.*?H?8$!3—В‘t[bVW’„‡vhep„’•…„ˆ‡‚kopxom}n‰ŠŽŒ›ЊЌЕДŸЅhPWIINH-8:?FFI!!€Еn›Р˜z`oxtœЅЌ–„xЅŸЃ”…‚Œ–ЄЊЈ’–nc`no…ŠŽŠœЄАЩЭдзФ>;?A7E\:#$0;7(˜ЂШЈ}‚up{˜Ё|ij‰‹||ˆ—žЈЌž‚„nhd~POqЂЄ}—ЖШЖАНЫлЃ.5>5AB?-(*33+*ЌŸ‰q{joopŒ’‰‰‚i|Ž’‹‰z’ЋЕЖВ›‡etheGU^dj‡’ЕМЭНЗЖВB9NIFAGCQ<8:5+1.Œ„‡}x{{tŒ™”ŽŠ„”•ŒƒЂЦДЖРИРgZiV9Qz{ƒ–—ŸЊАДЗЧЯk-@SVLLVQAA9B:ƒžЊuW…’›–‡Ÿ‚‚wx‡z…™ЂДВЇЋ–piv|hmok„ЁЋЇ™ЄТтЛU;ZSS€‡MHCI>8>?<Ž”žЈ„Mi}ƒ„‰Ž‡Œ…{nZ]}|{™—žДБЌЁnz||‚{|‚‡‰ŠЇЅЋЃЇЕЯzMOMLTWHBFC7230ЁЎž—zaqp{‚ƒ–…{w‚mttˆŒ{utv‡ЃЏНœ„|~…‡}‰‰…˜Ћ–™œŸЋЌА–AQLNLLG5B@5.80œ™ŸЉ—…wq}}ˆ‡‚}ƒŒƒwv~Š…~ˆАЗДБЁŽv{„‰‚‹‹‰ŠwДСЗЖИФЃ>[INOA0+",9@98˜”˜˜~{qiuƒ‡…x‡‹wzz„ˆ’Ž•ЋСДБЅŠˆ}tŒ…ˆ‡ˆ‡nСЏЋЎЫеL5LE<+,8;?<;,‰œЋАkamr}~{x•œ›iq‡……”™ЈЊЁ™–…‚~‚‚Š——’—ŒžЌАШлЂ9:HIJGH>11*(!Š•›ДЌ~vjomm‡Œ”ЋКhxxjŸЇž™–”’‰’‡„{‡ƒ™ЃЁœœ›ЁœЉЗРд‘1:FHJF8>@F?,-—Ѓ’Žo|wunxohƒЄ”…}vv|›ЅЅ•”žŽŠ‹””Ž~wx‚z—ЃЄЁЇŸЖЭншНI7@B?:980025)ЁŸ’{rtx|{q[u}Œ‘‰Š’‰ƒ˜ЃЅž‰ЂЎœˆ’™ŸŠ|xu{}‡ЄŸЁЃЁЉЪйкгЩŽ55AFF:GFB913ЏЋЄ‹uowikq‚Ÿ”‰{…ˆŒœ‹Ž•ŽŽ‘‹Ž„u…Š‹ЃЊЁž”‘НЫЪнчЁ?COGFCEF:,43ЌЖЌ–Š‡|tx‰‹ŒŽŠ–”›’Є–‘™ŒŠ›ЋЈЄ‘x‰’˜Œ‹……ЏШССОО`;C5857ЏЎŠ}wurqwt~Ž›ЃЁЏ’Š‚„‹’’—ž˜ЊЃœ•…‰”Œ—˜ЁЅЅЏЃ——Ћацч—9>:?LF@HPU™ž˜‰x||}‡xŒˆƒ„—’ЈАЈž„‰ƒ’ž™›ЁЊЉ—‘‰Œ‹”›ВКЊŸœ‘ŸЇВЯцЏ<575@<@HCC<œЃЎД„w|ouoxv~tkp‡›—‰Š‡‹‹ˆ‹’›˜—’”—•}}„{}‰”™œЂЅЈЋИЪЖc\SLLI@;9ЕДЉЎž‹…‚ww|wvmtxƒ’–˜‹‹Œ””–’˜Œ„…ƒ~‰‘„{…ŠŽ’˜ЃЂЈЉВРчюvIJOME;B>ЏЗДЉЅƒ„ƒ}{zx‡Žƒ}w{xŒ‘ˆ}—Њ•œž‡‹„‡…„ˆ‰Š–ŠƒŽŽ˜™‘‘ЈŸЁЃЇУьЈ>;WQNEOUДМЕЏŽƒ‚zkrzŽŽ‘ƒ„~ƒ~}~ˆŒ’Š‰ŽŠxvƒŒЄВœƒƒ‡„ƒ‡‘žЈЌЏЯуС[-HEJEHBУЗЭЛˆ`jmtt€§„œ‚rkmqmq{‚}|ƒ•‹„‘›•‹pŒЃ˜‘Œ‡‡‚‹Œœ™ЁБРую~:FS>0IQŒŠ™™p„””g^[{‘–…tmoqu‚ˆ„}|‹ŠˆŠŠƒ}…‰ƒ—ЅŸАЊœƒˆ˜™™ЂЊБВОйц’APUE@:z|‡…ˆ‚qhnhr„ЎЖЂˆ‚uw{Š›œ‘•˜žŸ”ŸЂ˜‰Š‰ЉМЌ™ЂЁ’…‡Ž‘‹‰…ЅДЛРШВb:82)+ŠŠŽ•}hgigiŠ‘‡–ЧЇzw‚‹˜”ŒŠ‘™œžž—–‹‡—ЂЇЎЈ‰‰ŽŠ„‡‰‚ˆ‰‡{ƒ˜ЇЁi;8)7-œŒ‡Š{xwkpjgr}ˆŒ…|„Š’•ŽŒ‚…‡‰ˆ‡‹Œƒ{ƒ…‰ƒŠ‰{{}}woovz‡Œ‡{M84?@Ђ•”‰|rvvtv‰ˆ…|z{„’›–ƒzx|‚‚{|wu|x…”—Š}vv~„ˆ„{pikz–Š‘Ѕ|4!::ƒzuqrjkq|…xƒ‰ˆˆ„xqz|ƒ}„ƒ}Œ…|vzupou–’ŒŠzu{„‡‚‚‡‚~žЌЕНF%™‘mpprjg`a]aaUP\hz–Ž‹ŒŠƒ}xu|……‚xt|‚ztv‚ЊЕЖЈЇ–’”•—Šƒ~ŒœЉЌ‹g@"..zgВ}QhnhgkpvzwСЉ”‚‹‰rdt|Š‘„xƒŠŒ…nŒЄЁЛТИВБ’‘˜‘Ž~‰Ž•Ž~rYJ<˜ŒŽg\kqq€grw~o}––ŽŒ‘”‰ŒŒ‡wu”›–‹”œЇАВВУЪЉ‘ŒˆŽ‹~„‚•ЁА™^<œЏДxN\mxtjimvx™Ђ‘Ž—’‹…‰ˆ‰„}{{~•ЁЂŽ›ЉЄЅŸЄŠxwz‚…{vq}”ДЭНe2|™ЂgU[\ehigkhZ‹™–‹„ƒ||‚‚‰ˆ‚ƒ‡zuŠ”Ёˆ‚„ŽŠ‰ŽŸ–ˆrrwtx{’œЎНОВЩк›Mx^^dN?SSc`\eijpw‰Š…Š|ru{z„Šƒkrttdgo‹‘Ђ‚}Œ‰vm]bquz||‡ЁЋЉžЄКЧЋa`\`^[PSJEVejiˆ”|uq„iT\j}ƒeWeiiZagehkjY[[gd`[LSWJPL9FMA?A>GHJ+[cuvr[U@LYZ[Ujoi[MNIIHGME493>34%-&01:?31,25+1)++5:E?)(25YV;3GQJC288($541!3-)(%$$)+8%4CIGEA>718;@FIGG@@?&#&+!  %0*$#2:@;->?@2#)!*#12$#13<:7A?70&>HGIBEAEB;+#%454, "$)1*".:.389-:@BA?:?>;9*)#,! !)*)*)&,)-+&3;34:4@BECI?.--98BA>9522€ƒ4075?@BEA5;A80%* "(*3--+.)2@FJIGE@73*7<2(,89@INMNGGEAF;979CFFHFI?.-8@A:497.318:>CHFEE@>5::€О2.713.5<( #35*&,58?A>B3(7-;79AB9.1474)"!0-8:2354>9:B18BEA8402&"07@-+?@:-.498215?@977549?BFJLMIA-$.,&9u‰M$8052:@BIFA?BC:449759>ELL8*7:0&-)3?8:758>9223:@GHELJ:4(CNH??rTCC?3))07CB8??љ8.15002€ќМСШЧЮШЧдјї’ЈБОИаьрйгМРЧЯЮббкгЎШЩЛрМЛЯлчтпцјсQ<>OMLIIEHBLMJBG>CSгдЭРНООЭѓўД3—ЯЊœЩюсёнЮаеждеЭЫЖЃ›ЂцсЛблмруёїўЃACaPNI@@JGHF>>A1>EбЫЪФТОФОНпКO‰ЛЕТЮкзШУФЫгзжехулЛˆ–ачЧСРМбрсшцўхg:8LSMEGEHBEHOLH.EеЮЪЕЖИЛЩРцЫаСЗНеЩЩЭЯЧТЏхклежжЯК‘ЃНЖЧЊНмїјышлўєuT[Z{VE@>@FHONNШeLпЩжКЏЃ—бшяяюЪБИЛВТеяэЪФпїпжжйпؘŠЏШкзртпчьыыцяQiFSNIFF€hPUQLGM@CхшсйЩНЦцєуьФЋЗОСЦгмйекнкѓхпдйЯݘn’ЯезчцчщэщщђўЖY^\QLFGC@FLNTMH2VуркНЋМБНгшкБЦЧЯддзлжагкмцхянЎРРЏxЅМЯкђухухцшчьЫVJnYJNF<@HNTJLIGpпньнЭаРЄНкЭЩЩЧЭдуйрлйбазкйрсаМКЧЄЛЖЛЯрмнссыыўўэjUH[ZqT9?MSWTWH8Jбн§щСЇЗЈЗцмжЩМШСзхытзббаЯбеШЩШУЦЦРШЎмлйсыщяяюум}Yc[\`Z9FGMZT`F?BРрўэРЁСЯЧюђјщдФЮѓыллйдайлпюрщТБЕВmЗгсунпщёьыњўћЇMILFVZ]G@>IJI??0цэўшЩЮЦЧРЮщсхдЪЖкзжезжрхшхсбкЭКНе™ЪмшЮмяѓэяыјўШCEQGIQTPJEEHFF?8јчскЦШШФЦНнрмкЩШЭдлмзШхђюяєркЦЧСФЁd™ЋЖАгуєюшэю§пQTcWZVTVUQNMIMNHкклйдЫЩЯЮЛеруржЯелрсййюўёёхбюљЕЏТБЈЩЭЩтуцшыяюўў‡@OZ`Z[a^VTSPOIHдеймжШФЫЯглттЧОСТлзжйЖныщчцтљыНЦмаЪЪСОзмнцшуущї§™<@QZYSNTYPMSQOOзклшкУТУпстмШУЯОМШЭаЮЄзшушшцшзРЩЩ€ЩФЧШбшѕэшыунхљўНV>?`d\VQOLVVYQQмрхэЦœЦмплпмаьзЩЪЪЯбЮЮжщнцььютНЫЮЭЮЧЪЮнщхучцтыћўы`FbY`ecYTPQPPJFрххђкЊЮдЯЯжйлййЮУФЪЪЫЦЮжесыээцСЯгбЭаалкзруххуььєўŽT]VW`c^VUNJGIJучьчЩДЫЯЮЯжжкгаЪЮЧЮгбЫЮФЩЯьэїмбЪЪааЯЯзлжйлццрьщшєНP[T[WUPUPMFJFFуьыљхжШЭЮзддееŽбЮЭбззйждкѓєющщжЭЫЯЯЮЮЯдгдбУщўяяёўЮO]OVVQHCJIINJFхччцзЦУСШЮдЮгжкрзегжжкмлпччющшйлдбдгЮЩааЯЭЕеѓщыуў§UTQPSPVQNNшЫюцйдЯШЩФЫдьэусплзккпумййзлрркзйкаЫЫггмнсхсрмєјєўўЧEOYYСOSULJLQьыщчрмзгЭЮЫЮжмсрумсплрпутпкенцштмхгЮглрпмзкйлаьљёёћшnHHUUбQPLGFGцщчхпййЯбааЮЯжсцуурлмпуыьщтсуцытебаактутпп€Mхщьэяьўў—^Y\TZWVTOJHуцышткзЯЯбЮШЦСкяыяпЕаЩыўэчнжпнхндЮгдлруыучыыяэёяюяўўЪQBaUPTMQHHFцутгзегдггЯЭЪЦжрьўщЦаЩжщмкждекжкгЮЫЫетцусцущэяяыыюїўщrIVVQPFB?LQччрббЭЮааЭбжлмщЮсхзллйкжзкпнйруцрйаазмсррущыющчутхћўўЇBE:UPLGL]cцхрлЭЭаедгбЫЫЭЮЭжкэцщспзмнтццруумжззмрслрхшыэьхтнцэћўЧJEEYVQMONUшщљыЪдгдаейжгЪЩЩЭФхыцппйптчщьэьёЯЪдллкчтУФпэѕштнхщюїўї~LTT€/PMJIHшчьцЮЩааггбЯЮЩЫайльцслйжзлтухшспбЮжзжпссжФЗШйзлпушююѓњ”C@IONQVSNчышђЪУЪШУЪЩЪЧЧЦЫйыщлегмлйзмстурпкйзЯУШжкгЯЮЯдлпхччыэђўбuiaYTVTNNыэёјщйаЧШЧШЩЮЩЧЦУЮйнжзйпсммпстплжгЮЦЩбееЯЪЮенуутшшщыєўўƒOL\YYUOPюьэььйздгЭЫЭбезжгЮгдздйкмуустрйкггЯЪЩазегЯемрммнхчьщщћўЛMIiZTSV\ёяёѓнздаЫЩЦЫжссзгЫЮЪЪЫЮбдднрпллйдЫЩЧЭднйеддб€Uдзтцчщюњўрc9^ZMJU[єэћјеКЩЪЧФФМЮчслЮЦЧФЩЩаЯЪЭйлнпйжгЮШДЪхттлжззедкйнрхцщєўў‘GUbOSW[нксцгСбгчИСЎЯчнйЯФТТЩЮжжабдллжежгЯбЮмыуцшчтмеемсхчшыюяўўЇP]^TQQJйкЮЫбЪЩЫзОФУбщснгЮЪЭЫЮгаЭЧаеаадгЩЩЭкщєыыэьњчждззнсщыѓђўўтiQQPOOIУЩШУРОЛННСЦЦТеккеЩЦЛЛФЭагзжгЮЯгдаЧЇЇМухцщчмЮггезнсшђэяђїл„MILIMLЦФФТРТРНЛОСИЮснЮаЪУМИОЩЮбезЮЦЫдлтТЧУЫрммуцсЮдгзжклбсђьяљћУmJFQOLЪШЫЫЭШТНКСРЯцлмаЩТРСЩгбаднзгжзкйдаЩцјхрнрскдЮЮаддЫбпщђћўч~EFMLCЪЪддЯЭУРЗЗЛДЪЮЫл§уЭФЧазжезмрснмнмждзрунеддйзгЮЮЫЮгжддШжпшр•TO:@IP[NE7>AAd]HANZqg`WYMI<12,.5*,-?E?<8ABI?453@@;JIICA@?>EGJFEGGTSQTUJAFLMLNPNIHIHJC;>;@CC€ДGCBCHMUTQUQTOIE?@?BCA?FNNLJF?;BFNNIJCFGC@A>EHMJGCB;8;77@;FHHCIHE@?ABCIFPVULFGFJA@CEFACFA:@?<@?HFLPMLECC??GEFFIE8:?<5348@<@C?>?>A?<>CNPIFGCELIJFC@>22€З92:CIJOQSNICGJJG??EJOOTYVQNMMFC@A?AFEEB@C?AILGNJGFB@ACCB>8::?:BHPOLMHGFC??@><8928>:27AGE>::<@CGE;;80::BEFJLCCEB<52:>>CA@8<@HLFB?CGIA<>@@>3-599AGMSSQOI44:A4@o‹S%9<<@AFNOOJJNOM@98;;:BIPMHHJGHH@EHGHB?<@>9349AHJOISP9725BJOFIt„YIBC?898@IH@?HF@<8;:??‰€4’ž•Š—ЧгdwŒx›НЎЅœ‚„‹˜—œžЄtP‡Œ‹ДŒЄЊФЗЛЗдЕE>GVOMWSNLOOIFE7>AI™™ŠŠƒ‚‘Мг„^p^˜ТЅНЃ‘—ЂœžЁ—~We^iДЏ…˜ЋЈЌЛЪЫд—CBd`WSSMANJB81:3??•œ–‘……‹‚ƒЃ-LŠzƒ˜Ђ—‘‹~ŽЅЁЌБЏЇЂ‚Od–Д›ŽœДИНМяМo;MAZZTT>4IœЉгБŠpzwvЖЂЇŒ…ƒ‡žЊЕЎЇ›™ЂЃЁœ’Љˆ„ƒЁЃЃЊЌИЦШЪЧСТ}ircmhnFTNV^]cE@EƒДлЖ‹k‚Ž‚НЛгАЄŠ™ОЗЕЋŸ—ŸЎСУОЋЌw{|<‚žЉЄЕОЦжсынбЃSS€ѓW\chWGILPM972ЏМцЛ•‘~‘ЛЖЊ™ƒЄЉ˜——›ЈВИСЖŸŸ‰}ˆ”giŒДК–БЧйЯЧЭеэДAIYQNVQOHJGJJHJ<ЩКЗЄ‘–ˆŠ‚‰ЅЎЁЂŽ•ЄЅЇŽЏТЭагЗž„‹h?nnzuœЋЫбсбШдШVOee^`]ZYTPNNQEJЅŸЈ…Ž˜‚ŸКДЌ˜›ЃЌЇŸœУнЫЩЮЈЫкzuƒoVbˆ—ЋЊДМеСШех‚AUvme]debYVVSLFЁ—ЁАЇ‘‹Œ•ŸЏМЕ‚Š…Їž˜˜}ЌИЗУКОмЕ‚‰Ђ˜žЄЌЌАНУКаЯ”@I`ihW\WZYQUPULЂЄЉЕЂŠЏИКВ‘‰˜‰…‹—Є‘mЂКЌИВДЏ–„‹–Š‡Ž—ЇМЏЛВВБЕатЃ[GLeoc`WPUQ^aWLžБЕТŽp‘›ЈЋЋŸ–Н™ŽŽ‘ž”ŽžКЏЩЮРУЋ‡‰–—ˆ‚ˆ‰ŸЖЕЩЗЏЖТнўаaIrdiigge\YVUWPЌЏСЪŸkŒЃ˜œЂЅЄЊŸ•…}„–ˆƒ”ЂЉЖЭЯТКˆ’‘•™”ŽžЂСОЗТШЪач•biahmrY]WTTPOMУЩЗЗ™ƒ„‰•›ЇЅ‘•‡‹ŸЅ–›œИЭйЃ›Œ”ЁŽœœ€МЉРЖЏКССЪЯЗShedd`YYZVTHHLЖЛЗЪАœ’Œ–’Ђœ›ŸЉ›’‘™ЃŸž—ЄЫбЩШДž˜Ž˜œ™—žЅЃЂ•ЫтЫаЯхНWhbhd`PNQTWPSOЗЗЋБЂ’„‰Ÿ›™ЈЎЉЄ–‘Ž™ЄЂЇЗЮгЧЦНžЂ’˜Ё›”–›™’ˆЁжТФСжуbJc\TBTOPSTOUЏКОЮЉ~v„Ÿœœ’”ЇЖК‰Š›ЉЃЃЉЉМЦНДАИЋž–—––Ћ™ŸЊЌЉЗЂОТЦлїВIPjcaWUQPUVFMЃАВгЮœ•ˆƒ‹ˆ‚ŸЊЉМе‹ŽŽ‰АКРЕБАЋЌАŸЁЂŸ—’—™ЋИВЛКМЗЗКбзыЅESeYcbdZZ€ITFQДЖЎЗЊŠ—”’‰ƒ‰~ЗЏЅ–™•—ЗРЧЌЖОЕЌЄ—ЈЎЉ‘‡”‹ВМНМФЗНЩрђ§к]JUYYLSWTJQJUОЕЎЂ˜Ž…”ˆ}ˆ˜ЂЉЉЃЋЇ›ВНМАŸВДВЅЁЉДŸŠ‹”ЂИЛЖОЖТхщчђэЉJFWaQ]YUTZUUЧУТЊž—Ž’ˆƒŽЁЋИЇЌЂ›˜ЅЏЖДЇЅЌЉЏАЂЁЃЃ—ˆ’žЄЖУТКБЎзппяўЗP\acZ^U[VLJSЦбЧЛДЅЃœ•’™ЂЎЌЊЄЌЉЎЎЉЖБЊЊЈЄДОНЖЊЉ––ЈЋЏЅЇЋЂŸЧужгйеpQUebc^\PMFMЖУОЏЉДЄ”•‘’˜–ŸЈААЎЊЌЇЅЋМИЖВЌАЛЗЖБ’ЎДЖЌЃЇББЕЕШЪЪсљ”g\`gjhd\YMHЎЪРЕМЖ™•‘‘‹ŠЁРОМЃ‘•ЛчЪЫФКЈЗАЌ–—˜ЂЊАЖЗИЛЭейЪЯЦЭцјТ\He]]V\]YJNЕУЗЋЇЅž˜Ÿ›”•ЁЕгљС•Ё’ЂШКБЋЃЂЊАЄ—•ŸЏЊЋЉЈЛФЮгШЧЛЛй§р|O`YVUPIJOTУШЖЅ‘‘Œ‘œЄЉЕ™ДЧЋЌЃ—œЂЊДЕААЛЛЏЊЃЇЌАЊАЖОЛТИЌБКыўњЉJSJ[`^UQgmЗЕВЊŒ’œ›”˜™Ё›—ЇЊТЯШКЁžЊДЗЕЗЛОЅЇЈЈЁЄЃЎЎЛжеЦОБЊДНЦх§УVJU^^bWSYZТСзИ”žœ˜Ёžž’”›™ŒИЫбКЄБЎЖДННФНШ—™ЈЁЅЛДЖ‘—ЗФФЗЊЏМШймьчZZh]\S[SPИФСʖžž˜œЁŸ‘”Ž–ЄЉККЖЈЄЄЅЈДНМККЂЇЈЅЗЪНЂ’ƒ›ЇЅЌЌЗУЦЦЧу™OFV\\^[YVЖНС٘•Š‰Š””ŽŠ‹ЅЛДЂœŸŸЋЇЅЂЇВАЌЏЊЌЌЇ•ЇЉЉЁ’’ЃЎВБЛУРЩацЩpm^d`[[ZдЫФЮЛЇ›’˜Ž‹ŒŽ‰ŸЉЎЌЉЄЂЄЅЇЋАДЛАЃЁ˜–žЅЇž˜›ЄЋЋВОИНОЩлўўŒ[`ei`TUTЪеЮСКžž€&–—–ЁЉЁ•‘ŽЄЈ”АРИЗКЏЂЇŸ™žœ™”˜ЃЅŸЁЈБВБЉЄЋЗЛЗРсўРQStj]\dmамзаЎЁžЂŠ‰–ЇАЅЅЁžŒ’”‘’•—ЅЎЈЅЇž”˜”’ЄЕФЌžœ›—ЏЌИОЧЪщ§рjFdcZ]ecкжхгЁ~ƒŠ‹Š‡”ЖЉœŽŠ‹‰”˜”•œЉЈЅЉЊЇЃƒЁСЖЖДЉЄЂ›—˜ЇЏЛННЦнњў•P[gWQahЅЋДЗ™‰ŸЊЊ||rЌЅœŒŠ‰ˆ‡•œЁ”•žЁžЂ••œ›АОЕШРЖЖЈ˜žЎБДМРЫаеэ§ЄSgiVTOYЋЏœ˜œžƒ}‰—НЇЃ™‘’˜Œ›ž•ˆ’œž˜Ÿœ‘”ŸВСйФЮжезЖ™ЁЅЊБЕЭглѓўуwb]`WNUŽŒ‘‹‡„„‚„‹ˆЇЋЇ™ƒƒŠœЁЅЊЎЊž•œЇЂ—{zŽКООУЫВœЁЅЇЋЌЖИзхтхтгŽSWTWSQ’–‘ˆŽŽˆ‡„|˜ЖБ—–ŒŒ•ЁЋЌЗЛЋЈЅЕЛИ——ЅТССНЪМŸŸ™ЄВВЊЅНзжЮссМqQJMQT˜œЃ™Ё–ˆƒƒ‹žФФД›œŽŒ‘™ЏДЊЎВЖАЌЖЖЋЃœ™СмУЕЏЖЖЌ˜žЁЁœЃœžДЫЫрцЮrHCQINŸ›ЄЋЂ›…}z{ЉŸАпС‘Ž’ЅЈЋŸЃЉАЕЕВЎЌЈЌДОРЗЁЁЈЃ˜——в›œЁŸ”›ЌВА{LLABNЎЄž—›”Œ…ƒ~~‰–˜ЄЁ’•ЅЏЎЉЃœЂŸŸа–”ЂЃŽ™ЁЄЃŸ•–ŽŽˆŠˆ…Š‘Ÿ–’ŽjJIHNЗЋЉЃ˜‘™’’”–ЃЂЅž——ѓ›ЉВДЇ–’””™ž™ŽŽ€‹‰–ЇДЃŠˆŒ˜žž”‰‚‡ЋŸБУŒMCFQquQM\jibUOL;:1#&(79;7087I?.889:3OBIH@BFHHJSFHILP[SYOTUOPW[`\\Y\QUB@@BB;>B254A+01@CCHFF@@BIONYTQMTQHA.FIGIHA@BHTVWUUQSHPVZ^c[WYVVQEBFFEHJ>4;%7-33B;AEGFG@CBALNLVZdaQSHJJTIGG€•MJNGNJOQTQOS[\]U[SYWTP@EH@?7&$-.35FCMCHH>EFLIEQOJUPTSP\`\ZOJF>UU[\]VILHLPMLLOSZZYYQT]STICA@82*9.;3@FFHF;N™”Ѕ„‡ˆ{{”oj}ox|ieŽ„‚vx}x‡‡xkq…‚ž~—ВЂЩФН•b|Š@5 @advrˆЯž}xŒЅЃ„–…‘‰‰€h‡…zrvu{ƒŠ‹‘”‘xr|‚‚ƒ~vqƒœ‹ЈœЈЪОФСЅq|‹B;"Tg„Œ‰ƒ—x:n„‚އžЄžŸŒ~Š’Š~ttw{‹œ›Š‘‰|p~ƒ‡wxkMŠДŸ›Ÿ‘›tАгЗЃ‰…‹Ž.18dq™А—›˜Ptm……‘’ЃЊ…{z•—‹krirbtYN•Ѓ„bu{ƒ}…xQkˆЇБЉ™‡r‡™–Œ‚–Ј.")!Lw}Ј’ЊЉЁŸ‰ЇЧ”œ”ˆƒ—Ђˆ‰Š‘Ўzz…vqvqN‰›‡zhvƒƒ}|km{xœЄŽƒ‚ŸЅ™ЃЋЧ))$5rƒpŒƒ•—…`ЅДЕНЎ›Ž‡ˆ‚‡•™Žƒ|…~{rpcppq‚{‚‰Œ…Šth‚‡’Šˆˆ‡›’›Т,)$U‹w‘ˆ~‡Ž™qT›‰–”›КŒƒƒ›‚vdYeehcc’Ÿ”މ‹Ž’v~Œ‡ЃЄЂ—ސޔ‰ŒŽ8--€р2^™‡‡”˜‰tz~”ЂŸ—–Ё}at‰’ŠŒŠ‡}‚k\e}„{„ˆˆ‡‰mov|•–ДНКЁ™Ё‘~…‡Œ)>80FYx‹Š…hЃЉЎ‹‚”•ЛЈ–‹–zotvtuwu~‹–™whp}„|‰‹Š‚tahzztpo™œ‡ˆ{:;83-Z‰’…|dЧʘ–˜ЃНУЗ™~t{rˆ‹ŠŽ’ˆc^aeƒ„|…—–ЏЄ‘—œt…УВЈŠŒ‚zt50-7)I~vod~ЏЃЅЁŸŸЃЈБ™›„’x|{‡‹Ž‡ˆev‰kjr‰‰„”Ё˜žБЁŠi„’™ФЄ—”’Ž…v995CC.N‘‚}o•ЃЌЏЉЋЄЎУНАЄ•~wzuww…Ž}vg]V`Œ‹‘—˜˜ЋЫЊ{‡z‘‹‰Ž”˜…‚uŠ>:+*%AUiЉ|œЉЈЌЅ—”žЎЗИСŠjiwvtwˆˆ‚zkdbhvˆƒ|}ЇЏ–xƒŠ•˜‰‹Ѓžˆ~ƒ24,(AFWk‡Ÿ‹ƒ˜ЊЎВЌ˜ВБФсФЕ{hxxuv”•xqjdi‰„ruˆxˆЄЉ™‰wˆ‘›”ˆ›Ÿ–„}{19:-3>i•Ж‰‰”•’—ЂЄЋНгЮЃ}wheo~r…oqki|…Ž„ЋЌБхН‘wˆˆ”™ŽЄАŸ’ƒƒ@B9+^œ~~‡–—ЂЄЂЄЫдгЮЏ‘‡{wv|ˆ…ƒnnr^iž…Œ•ДИРТФЯбЭЯЋМЏ›‡Ž˜:;AB?CEPcЄ™}{‚œ—‹žЊЄЃЊБМРУЈŠ…˜Šqrˆ‡…‰xt{—˜™™ЏОУззЫНЛЎЊАЅŸŒ‚~‡Ž7?BLFC?GN…•ŠŠ‹‰›ЃЂ˜ŸАЋЕœ„……~rnxƒ|ut~›–””ЇЊДИОЧжЪЦШЗ››ŒŽ–—>F?>G<>5EjœМœ–‡~ƒŠ˜—žЂЌАЏŽƒˆ—vikvwjwzxˆЉЅ™ˆžМЧЋЎЛЩСЕЊ‡‰‡Š•’ž>BA@??2%8hЇКЃ’ސ›žœ”Ž—ЇТО™Єœtgnrr€EpzŒЇЋ‰‡ЇЗРУЛНЇБВДЇЇЋЎЅQQIH@::<-Iƒ›x‡•—•АЕДЕЪэаЕЕРсЪŒq|uzxvxwƒ—Ї˜–žЇЋРЭЫСИДЎ›”Ђœœ——›A3A:,+(5G|™{‡ŽЄЄ——ЕИНЪежЄЊБаЖˆw}|}xvth…••ЂЏМВЈЃЊЎО˘‹‡”ž›E2<@98#:QY[tŒn{vgЋМЇЈЏЎЁЦФжЉŒ‘—„~|ˆ~uoptŠˆ‚‘›ЇЋРШУЋœ—––‡…™Ў12+8>?>):M0O–ЇЂb‰ЛКЎž”žСЫЮЖŠ…•ˆ„ƒ}~}mipu{‚~‡ЁБЉЏСЦНЎЁžЁ——’‰ŽŸ0.(-1173@G54%Er’Ÿ‰…„Ѓ›˜•›ЖЭАЋ›ЈЊЁ™žЇЁ’‡…ˆ„„„~˜ЋИОКСФЕЃЂЊЋРŸ5("*45;:?HC;))>B@BA@INn•ЌЁžЁ™ЈАДЎЊЛрчэьтчзОЎЎАЛ‰hYg]MMG5@POHW\TGPQUOHE9:8A..$,BB:>FI@HjžЌ—›™ЂКШЯбпэышыкД‹~dWOI94751)$<9<<872;FJJEAC1>:EJCB;FC>7;@8Yo‚Ÿ™žЇЌЅЕпуЩЎ—}dSC>.*;JV@%98A;78;@9>9@CHHMNQNH9@ChŸЄЋЃЂЈ–~oOGIC;:L`P;@GECHC<><>3&7?:A<9:HICFAEHF9,",47*(4>71&7?>4>HF@A9GOTQJ\^UMQTPJJ€мA<:39@@>AHEGC5958EMMICGJHI#*+04-$1%$-07CM@9B;3:JMLPJV\[TPMHE@?4<:@B?<3IOHEFOHEBBNM?M4"%").2FZ]WOFGI>4A@F>:9;??94>38>;A>B@1"!%&33811?BF?AW`Z5<@@GCIJB>29@>:873;><44:73AC120874775$$*,3.8L?;9:;BHHGC>@<:9C81.8>ABE;A95<:,*$5@:-104:;@911GC?3.-@CJ@9CGCIGHE:CFHE>1>B@ABA<;A?0-.98BA@?::C?.%.41:983?;:8))**1*)-1;GMOLIHH8<<€ќ50422.48998<7<>2+,+-,)3:753.79?@<@>>AC@A>.(&)-+1<@>4B?EA9CEJ@<7<825414*+.13((.8),*32**0&.&&*09A55<5.20.3>881+58AGJEBBEGBEB@<31;@BLPH331.ACG<>AIJGHHIGQOG><404:?@B€њЗТДЪЯђ§щщыукФЮкЫЭШТЎОЗЁФТРШбцЫЃЃФТРМНФЫейзЩЪФЦФЦЧЮееЪЩѕуцрСМЗЖД‹УИЧгј§шэчудмнгЭЯааШНИЗТЫЭажрЗЗЖЗжьЪСМНЖрйжЮЭЮЪШШЮЭгежлшхяхФНМНМ‹ЯдбНжссмБДщпўаЕаегмжРОШЪЫЯЮЩЦЧКБызРМЗУыррегЧШЫЭЭагЮэтуыўўлТЧЩОoдлмцуянлджжлтСЌамйдаУЦЯЮаШЧФУУТЅЛпсЕЕЎЎЫЯеЫЦУТЦЫФЩЭЦжгцьёѓсЖТбЫT™•РКСйлнрёђпёмЩЮзсѓЌТЧЯгЭЩЭТУФЦШЮЮЯЧСУНУЮЯЪУШЫУРСИКМзышыюљєбЯаЮižЧбМОФейжнЄEИшбаахцКОЭЯгЭЪЭШЪШЪЧФРЛФЩЪЯдагЫЩЫй›ŠБМЩртѓшєяїщЭЊКЦTuУЫРТШЪбэљНЇгрдЮЭТУКОЧЭЯЭШТКИЦЧЩТНРШЪЯбЯдкеЭЩСТЈЎЮОНЦТбјўљюэпТМHPЛтЧЩШЯЛєўчСКЦУФМСНУЯШШЯЩЪМОУШУИžЯЧЦШЦФЭгбЪЪушЪЛМЧЭгШдѓўўјђлЦЖFUЦЯРНОЪСчўЩ‰ЅЩгбЧФЦССОлЭасЊВыщФЃ”ЉШеаехрпкЮЮекєкаУНРЗШбсѕњєуЧ•Е;VДгЩМЛЖнээ˜ЯаджлзбЧМЖЪѓьЮАЛўўтЗžВчтЧкЯн§ьаЮжЮЯОЂКИЗŸКгЧыћѕѓлЋОAG‘йзШЦФзлёткЮЫЖгёбЩОРЖйѓюжНЖтјлДЄЕКДКЕмЮбнЉЛЧСУЫЩЧУЛ™ЫяртхеЯОЮЪE`uзтЮЧЦаюрЛt~ЌЊЃРЮЮЯШДОјяЮКДЧФЧНКЕКРФЩЧЩЪЭСЛЗЗОЭбдЮЪЎЧєёшушйФзд;NOнлШВЪсАrk”шщрсбймдЮЯжжТКУОРРОТЛЖйзЩФФЫбЯЪФСТЫдгеЯЕаёнч§їмЉЫЪZ^+qВЖНЛеўхТЩдђыЮлсремзгаЮЯЭЧФФЦШЯдлнмбЩФШЮаЪЧТЗдьгЮЮенєыьїуЦИЭЫVW?~ФанлехКxЛЭгЯгйхцхцнаЪЮзеЫЩЦЦЭдеЫбзйЪЦЦаЮЭФР’гѓтлзбЮРрљэкЭгдлNQG[ЄЗрїршсЗДЧеЮбгзрсмзЮгзнЪАОЧЦЛЧЃ–лыЩТСЮЫЮЭФ™ОЯклпдЩЖФЫзжЯгейJJIHСЯьрїїхнЯѓ§клкйлкййбгмйнТЮЭЮЫЧНЁдшЩСУЦЧЭаЪСАФСедгЪЮдемтпнх§GIHM•ЩИзЯймкгžмьшсцндбжзддейкзенЫСЦОЊЛИОЩФУЮазЪЛЛЪЦЪЭЯгжЯЫгзнмрїMOGM{ЩЩпадйпаВ™гЫФзйлмуєдЮдмнлегЎКЛЛЌЖАраЯаджйаШФЧФЪЩжммеЭЪабззлFMIGTžащлйлмьбСЫдСксхуцьФЈЦлжлзтлЮлеОЏЋЮЯбжмкжЭЧЛМФдйьњрнд䈕кжкнPPUI]ЩмжаЇхяљзЭебтєьырщЫРТТЩЯбЯбкльЯЛТбдейнзФМЅАСРДДБЦрмгежзеЪЫOOQLSЫдгРЃЫўтулкрчшшучрмЧФЧаЮджезгИЏЛТЪбЯбжтѕудусРЖЛНФњргбжйгЧТMLMQMuУЫЯФЌЧчшхцччхычщрЫрдЪЫгбзккдЩЩзНООказемллкёхЯАУЭм§скддеаЦСNON]dTрлЮФРрсхцшухчщююЩйнаЪЦЪажжгЪЧИДЇЋбжлйезруўьШЦРБемлйкбЭШгЭUOOSEZŠНЫѕйСчёььзчуушюёєзЗКНОТЧЭЯЪЭМЏЏЗШгЧЭЮбдЪсѕжЛОНШджеббФдЯбгHIOUYcЋаєммсчьшчхцуяюўћюМЕЫТНЧЪЫЩТЗДЕЗмЯЩШЮбЪгхэнеЭШЧбзз•йпмеЮаGENQITaЁшѕждкхтрпррхьђђўўьмЭРЛНСЮНЮЛННТШдкбЯчэзьўїЩБЪглмплмтчпеЮOWTOWcd•лцЯЯернцщхтннрщяђцыЭОНЛТэкуЧММ“Епйзѓў§јяўћцнезмеЯайнцснеUZ]\[TQhбядШЩпрђчццстЮпєёутРЫТОЌЦмужУЛМКЮкљўњђђѓђщйМаййаЮЯбзрцст\\c]Y]JJДрЧТУОЦчтцчууўˆћыажЭЛЛЕШаЯФСЗЏЋНхыьпёёяћютѓэцсФдглррспUOVQUWTH‰тмЩЪблтхчшурпѕяјѕчбЭаЩФШабгЪЧЛДŸЏпЫЧнёяяюьчыыѕуђсмкйеййGHOYZV\eˆххаабчмуу№тсхрчыђчеаЯЪЪЧЧЭЭ€ЫЪФРРкдйнющюьюьэцшщшшплежзкMIWZYPTZbЛнзжддбгдпрмлрсщюђуеЮЮЩССУШЧСФФЛКрлкзухщэюёьюэ§ёсннрннпQQUYUVNI\—тўснжЮЪанрурпсхыхбдеекМИЛОИЗЛТОЮщркжйыѓяёяяІыЪкйлмтухQYVOTUS7H‰сѓтйжзклмпхуххцяђжЦмхжДЋМЛЗЖСЩзечснгжЯщюёяѓьђяцррццххш`^^Z\TMLHeЌпхРгкррцтршьююўїцыцўљзМТФТСФЩЪбтьпп€…чьюяюяэьхспкпуухщPOMLLEF2GLqОчСФЭжуккнсщщюэядртћэЫРЪЭЪЦЦЧЦЕабдЭйшјччшыэшхукжззммцQPTVUMMBdvwЉЫЋЛТЎуђрннрашэњхЪЫбнФЮаЫЩЪЧРНРЫгЯЯНгрыцьь§щшпп€ЊгбемпHHQSTUSANePtЯркШЌЮєснйЩйѓњњчЩагзлбЯЮЫФНМСЪдгбгхяяьэюђяьхртржееппIHFGLMLO\jZaЈглЭСЧнлкгдлѕўхДФджнѕжФЭЮеНЛРШЫаЭжкттрхэѓђщшыщшччххнJE?mИбФЯезйжеммтщмЮФЮйпнсыунлОИРРОСОЩОгїўяююышщрдЛыюшчыCFA?@:0-2387E‘рырнппслпсшыњямбзЛ|ЂйакчшЮЗНФУКСЗпюјяёшчхцузЕщўяэщA@?>>005BHNW`ЪебтямзгеапуцшшєуТТчљнстщЫЛЪагЧСЮлдхющээььяжОнњ§єчIA?:<3:?TNSI?85aЕйтгЮбмнуппчшїшмдптрммМжгбгбЧТЩЪбЭпушыяэшькйтщёйFE?:7<8?CEGOanZ‹йшкЮЮблсхттчьэьшцчђйЯаггдЪЧЧьЭггмухшяьяыэьтжКŒ|u88х7;:7>8@C@:;?@>8EUUTT[YONOP\bZQ]gbTYZWSOONIHJMNLOVUSPQTNHINTSOPSY\W13;;:;8,478.0AHUbONPNIJPQTP[bhaUSQOIIHHAFIJJHHLNNLQQWOLTWTIJSVTMT?%%.-,,#00;LmjZ\ZZVPIJNQOSWZY]UPOMIJMJJMNHEGIOMQPGGLHHJE@>?GGILA9!*.1.-5<@EFOPSONQUMFIFBCE@L^gb7NJHCHMONGC>BINOIIHPOIBEIGBFPOIL<@849I?>JCAAFGAEFNTQNMILB@?NarqOC@<8:BJJFE??АCE@EGMOLC>@GLLMLLHFC<<;FIIPSOLFFJGBGO]\ULLF;58A;1:EB<98>GLHCBB?@:>;BBТ?A@AJMJC>TOL@BHHOMNOLGLJPJFLJMMIGJJIIJJMNIFEBAC;@CGCEEB@HIB>;:>CAB?EF@2*-939;@CFFB>AAEGHMLBEABE<@BHFFCEGCB?@CF>BCFIE;:><:;<;::39@A?:9459@@?@CBIQIB>>@BHHFAFIEHHCCBCHGJHFA?<;@FJF?AEGGCAB@BHQPC?@EGAGBC@BBHJIIFHNJHF?‰еЧŸžЉЎЊ›œЇКУдЊˆЂЈЃЛЫШЗКНШŸƒ‡ŠŠ’ЗЛЏЗТРЭггЩЃУНШаЩИЗЛLCF@EE3;4*3:YŸ”—ЅВЉЄЌЌВНЧЛЃžЉИЛЧРНМЈŽ‹‰—˜ЃЈмєеЯбзЮЫСЛ’дЮЮзЯGFIC;230:7:@:C>GLECIQNPULaŽЈ”ŸœЂЉЗИЖМЧзнмпжшёФ™„˜œž’‹‹Š™ЊЏййТЩФМНЅ”‚honHAHPFIEAABILMGAMBBH4?IS`bTLZ[MY\adjiqutibd[YVUYTSV[ZWUSUYZSZ^]\]^c[\dh`V`S3@82299€фFCTpqica[]UVV]]bchozqma`Y^a[Wa\[QTQZT[VVPTQSJPESGUWZYYUI.>9@7C;IPUHPWZYTLUSUOW[Z\SQmwtJY^YSZcj^TLPMYULVLQU\SPJJLLMZaVZTMCFH[IM\STPGAFIOSU]WUSTVS]cp‰}bVTOPMV`aVMNHLILLMOJSJSMMLJOQVUQQWVOOS[V\[UZWYNPQQV`d]YNSQPWYQGNOQQLNOQ`[QPOOMPP€TW[d^MCAFLJJPZVN[^TZZ[ZZVW]V\LOMQ[TZUQMLNV[[TQPSNPIHINQVNJIOOPTSPE[^SFGJO\WPQTU\]]ZY`[[`[TVQWVLS]VSWPGHOHHW\ZZYSQUPIBMOOHQMPTJPEEJNOGQIOQ[aaYVWYYUPTQZPSNPHMLMLLSUPNLJHGGCHOMJHMMUSQPUUVQUYZTIFB?JCIMOOHGWUUNMMPQTLOJPJGLLJE@CBGCMLMCLG@CFHIFGHFM[YSOPNJGSNVTJNJFHHMOSOMOQINIJNSQQTQSNGOJLHIJIC9LIEOGGIHFLPHJQJMUTQJMMHILTPVOOTTWVJNOQQWUPLEEGLWQVO[UTTPMMHPMNJGJMQYPLIMLTOMJQMQZ^SLINMQMQQOMSTSSTLSTWOMLMCJMMO\џq€Кwkhdbp‡^\aTdnbTHN…Њ*AS?\mpcaanpo`kUdvz’ецьѓэЄ‘кЦitvvuwx|…•™kgr{xdie[`dUdPHYoWdd‡œŽa\p}‚|—r]M^{rounmvn›žЊйтЈ›ЌЃrgq|xŸ›™epjvxZZjmho[@S<^hhnLpЋЛЁh]q‡АŽˆ]U]mxqqtZu‰ЁАуне˜ž•tummo‰€­njjp}znYŠ›ЭWHU^nW7,nŒ˜ОЃ›ƒkЄŽЉd;Seg‡{jkjZ‹’˜ШтѓМtƒz|rwr‚Œ„››rnnr‚~rmgoœYWNgdC;-SiV‘„d{zЇЋЕРzWMebnˆwbVozm}ЌбюлЗЇŽ‰‚…z|}z‰„~rhoY`YtugiАzvdrxkNUNixpce|žЅ˜›dcxjbiboqkk€В‰БетБ…Š”‚wvq‰ЁŒnhkicd`i|uzujtjaqk]Tiox|vm{}teVbnaY`dbhncaЎЂ’ауЩЖ›uƒ~z|…‘”‡odxnhvwe}’qQSb\ihd]Z][Qt~~zin‚™–…}Š•‘YZnohwioЕЄ™НджУОƒ‡ˆƒ~‚‡Œ™”t|gdo{b‡А™urbZtt^xmWYcwvep{xЏЃœ‘~‚qtwu|rp`{ЄЄШкмзБ”›Žrzz‡Ж•rw‚rgjd’ЂА„Pcepnngejabrr|urgwАЁ›—unYc`ieemeahr–РЪьйЅŠ’ttw{nЁРЊqrwn^o‘˜–œƒi-H^gT\SYaupm^cnpTŸЂž›‡hhvpgpqhggdž›КкєТЌ—ƒƒp]oЇИ}{x}ibЂцТЃo]eviiegno^„‡~tpti`i‰ЃЁ‡ˆp]—x]nƒˆgch|ŒЊЅЛЮрЮ”‰Ђ‰‚x~Њzu{~„kPzœ‡vuoj‚zuqwniw…pZkko‚~˜АЎБ’ЅЩŒb[ThŒkz…‹ВСЊШгдМАДЛ‹uo„Ÿˆ~„vwwUn›uwtuzvwtbebe‡juikxkaНлЃЁŒ‚…me^UjnjtŠДОЛТРУТЗЁ}p]^]‡ƒ{ˆŽ‰ŠŽ‘~qurgYITLI]appqkk‚—‹ЁŽ}|nqjkjhrhжУБЊеѓшЋž}vvuЁ‰‚ˆ„~zŽ—Ž˜”~rw{rr^g^YggUkrgpoz‚•ЏАО‹zr‚o^`WL{ƒ‘МЮЩупбЕ›–•z|xnqƒ”aF]ƒŸЅЛ‹raƒˆzmaadb]kq}pdotoutŠКЋŸƒi…]`^Gi||‡Л…›ЩзшхЏ˜›Ђ‘‹h~ЅД‘pjn„Š‹kimxƒuqtodd^cpvqootqthb•–‹Ž‰‘o{‚{z‰„™„’ВдЪЧАЅžŽ‡…‡–™›З•v–”„~|x}}‡}mihurejvqqgt…‰ƒŽЃ™ЃЁŸУŸxmrmqu||„„˜…”ДОЛЪЫНЖЏ—™•~wКш”oƒvuŠ}rzp{{vvhabccnqewˆ•‚‹•™ЎЈЉ–ŠЄ„jkpor{}}ЊЕЩаНКВЋЅ›zƒqzИНЄ‡‰„‹‹ŠŒŒ‡„އ‡^V]a5N\k„‹‹€€’™ŸИМЌŸЂЋ‡…pojhn”—œЕЏДЛеа̘ЅЋvŽžŠ—›Єtwv}…Œ‹™wIo~pGwq‡bLwv}……„”–ˆФЗЏЇž˜ŒTeu{vz‚‹—Ї‡”ЌюдКЏУЛ{z‚–ЉДŽto{x}ƒ‰ž—Gt›Š`}quppx‹„•ƒ‚ƒƒ€ГЂРЖЊИЏЉˆgu‚‡‚~”Œv„•ШЯЭбЗЎ{uk{ЕЎ~uzˆ•~xž˜™’”–opok`nhxrxvv‡zˆЄЊЏ”Ž‘‡Š‚ƒ‚uz‚™ЂЂбёѓ’Q|~h„––~~‘›‹‡’Œ”—ƒkigjxhmh\z‡‚q}ˆŽŒЃž–•ˆŠŽ‹zƒ‰Šp’Ј˜ЈQGƒ„ŸЃ˜}ƒЁЏЁ–”™Їœpqjwodmi`ednr|ƒ„‡Ž›”‚•ЇЋЁ‹‹”™˜ƒ~‚ЋЏ’cL\:3%‰Œt…„‡‡’ЁМТСОЗЈ‹•„{krupwpmhj^uvr„‰‹ƒˆtЉСЅЃЁ…|‰„Ї”zoŽЃGCEQedN•”ˆƒ}{ƒr…–•’›„jv”ƒutpopkome\YJgex„ˆ…ŒŠz…ŽЈЎƒvzŠŠ™ЂwWGO\]dSOQLPЁЉ‘m}|‹’„ŠАžЉ—Ž‚ˆ–›uwjaaw}…L\Uc\k|~|}‰‚‰‘—›Џ’ƒ…„…nH84@-FBQUYPЃЁŒ’wrqVm˜ЃЁœ›Š„Š„‚g^ptuxxihgjhxtm}ƒŠ~w‰–™ЈЖœ~dU@8508?QI8.0(5B79EI‹’Ђ”„orzxwЋЋž’Ї›Œ˜›‘„Šemdqxqkvvxpk‹ˆt‚”Q>MQ?QJ;.-?>7?E;><:BH@‘•|rtqno™ЁЇ•–ЄЇЄ˜‡Š‰z\bij|nkqgW\hxt[HFI;BNNOF?@AA81.22(*;9;HFŽ‘ˆ}xƒ„|Ž•ЧБ•–™˜Š…›ukk€owqp`gVbiQJLCC::EFMM@;A@>12424:-:?ME:>>œ›ƒ{x‚vj~™ŒƒЁЄЅ–œЃo^tmiu{rbYIJ<>MA#"CHHGMMC;><3::B?:?:7;:?GAEЋœŒ—ƒ|uz~x”ЈЩРЊЂЄУЛ~|mq~prd081):2.5?@;:ITP,41$.21??ŒE?CA::@71:FELOL›—‘”ž”Š‡…‹”…{›Змют˜M>,>;%4GC?F@>2-+%0199C;8EGA5@3<<@BJB>2CFGIGB™Ѓœ›ЇЃ‘‰‡Ÿ——œЯьл—[8@;+:BHGG8,8@:044&%*NQL?BA>A?4EB@@GE99EHЅЃ”—Ёœ’Žzv\UEHC;BC9@B@@0-7.*7>83!"&*#&4EcTGFGECC@9CCЩ<4;BFMQЛЂ‡ƒ‡ŸЄЎeIGE:GPbPHB>977;7@304878*%&%1&!1FCFF€^NHAJSLF@ECIEMP•”t‚‚c[QOFBSF@GECHCC9<88)23248<4,*0($*349?:985:7>AHFJ@?JILGAGF??„uWC<1A?BLLHIE@>FFC??;??N8@VI.71>>?>BHMPSYZWTJICI:AOQGC7MH7MNSSHB8;;5AGQSCA:9?;54"auG#(+&%>8AEMUUWQMPI:)$>JY3NL5AGPOLCNGB@:@?CIGUPNC907,08A545?:C@[d<)01+7-2AJPVVWPPM@U@@[|›EA09B?FAGJNH<>;7HIME>;,-&>@(39BGJLU|N593:>GJOQMNTTVSdUWQi”ВЂA?2C?MGEIIMIII<0+*%%73CA>M80.(00GIME9IhhdWUi~œдйША?EBEE:3824--+7::.#31-+;<43@ECHWЇФаендеАЕБB?7ECEC>209IMC8>3+-5@A>1,4:9830947428;89?9453",255PqžТУИœЉбЩРЉЇЉ?5+351-4218AJE<77Ь4-3A<5?:9@A4-.731AC@>>A<8511.-NboˆЃВЌЁžŸЌОНВЄАA?05211і73:??EC;5AA€ІHEHIG>IICE@E28?90+@UT\‡{”˜žЂЉЌЌДФЩБ<@4$(*8%+?ACA;<>>FECIMLTIFMMLE:?B:07CZH?-FE9d–’Š~zТТЧхЯДЊЊЅЂЏОЛCGG1*((*8@AAB<3>AAHIMJEE*#3I^<4Uhp„‘~ž™•НЛЄЕОМББ€DЊЏБЏ8?G@:9419><:89<;>@BBG@CEBCJMLJ@BJO;NVdrn{”ƒ‹œŠ…|ˆŠ–˜ЌЦТЕЖВЌАИТ3:@@??BC;9<C?>82@HHP]o||~„‡|vœŒŠŠˆ‚Œ–™ЊЎФглУСЛСЪОММЉCE>;1;:1;AB<3:;2,5FJB?EUc[j~ЁЋЁЉЂ}x„„…‘œ’”’Ž‹КФБЕКДЉžДЪФВИРОМЗВLIGBF;,+-<9?451>H^ZC8BNZ{ŸЦШКТЮУЂ‚Ž–Œ|ƒŒ‘‘™ŸžЌИНЧЭЦОЕМЗНТСШТЫжеNME>-$)2;AB7JVJYqtcMn™ОееЯЯЩРИЉЄЈЃЁ”‡„Ž‘‹Š…žЄЈИЦТДЇЎНТУМТСРУСЕA<;!",**09C>?IOWiŠЊЗЛЮчуцнЧБЎЕЛЕБЏЈ‘‹Ž‹ˆ‹‹›ЇЗД›–ЋНРЖЕЗАЅЉЈЂBC800(,.5?9+9HJ`~ЁЫуЧЏЋРаФМБАЊœЂž˜–žЁŸ™•’–ŠŽЅЎАЕЉŸœЋФЩТСФСНЗАЈЄM^QCMP@9ELFOciwƒ›Є•ЂАМЪШНЕЇЊБСнЭЈЇЁœœЇЈЃЈИДВДЛСТЎЉЕЧЧЪЪУСТООИЏЊѓРЪШСОМЗУНЈЏЌВВуБŘЉлєЭq…Њ˜МЦЦФКАЖКУМЛВЛЖОРгўўЂгЮў§МКЗКФЦЪЫЯаежОСРУСНЖАЏАЕЖЋЈЃЉСžБРзюйВЌТНЧЩкКЏНСУННКДЗКЧйзрјћккнйЕЊКНЦТажлйкйРМТШЦСЛРОДУЕžЇЇ€КДЛЛЁИыђшкОЁЗдяалаЄЏИРУФОМЎРдсыўђјлкзКРНКФЭймлннмУТСОФФУЗдюўщБЁВЕЌ„}РкуўєндКшшрђЕ~˜ЖЗЛСТНЗВЮжжђўўьСКУЭТЦУФЯЭЮбжмШЦСОРФЦРДЗпЮЏЈЕЌК™ЉЕЖнЩАУЫьсѓїЫœœБЋРФФЛМЛТЕУчћў§шплжгШЦТЩЫЩЭгзФТЛНИРИНЧТШђебЫРФбМ™ЇЂМФЖЕЏСспсрхЦКЛЗЛКЖОЛИЖББЮтїўчТаззЭФСЩЫбЮадМННКЕДЛАЦШЦТТФМЛСРЖЉЌЏРЫУУЕЦаЮЛЌЅЌФШзБЕБДЕЖЕ›ЎєчйљўѕѓнЖФУРФЦЭаггЛТРРНЗМБЦУОœ˜АЖЕБЎЕДЊЉžРЪЫЧСФЮестЯШмппЉЖЖЕКЖЏЛьсбюяїјёЯаЪШЪЪЫеклУТЧТОТРЎЯэхСЛДКЛКЛКЛАЋАЫШФМЖЖЦУмкмстбзТМУТННАРлмєўђњхлтЮЪЧФЫзєпФШЩЦРТВЏлщьЩЇЉЕМУМЛЗББМОЦФОЛУЪжщрспУИСЖЛЛКЖДЖЌАВгюђў§тЪйРЦЦРДуњцФЧЪЧУЇМпьучЯЊjЊБВБЈЉЋЌНСНРНЛИžйзррсшЭЏНММККМКИБЄжкцјўїьлТЩЪРžКзшЩЦЩЪЩОЏхўћчЛЅИЪЗЗЖИЖЗЎаЭШУТСМЋТбмпЫЧЏЉлЧЖКМЛИАЎУЪужхэљёЩЫмхЭЪРЫюЫШЧЫЧС–РзбФНАФФЧТСРОКОШШСНКРЧгЪЭсѓёэнцњЫИБŸЏгБТеаяѓээюјэчэыйУМжягдЩЩЦМ–НцдЮШУЧЪФФЦСЗЊЋЈТЯЦИИРЧОБюўсйзабЭЗЊЅЊЏКДСЭщїщщьюэмЧЖЛЉЄЎЫззггЫШМдылзййЯЪФСЛЕЊЈЇЌЊЋДЗЛУФКЖЦЦзцлкШЫУКЕЌЉЎДЖФањычюьўўчнЛОМИФкжЯаЯЦКЦкрслдЭЦТТСОЈЏЎЌЈЕЎНОСОУЧЮЫлїшћдЧаТЛžЃЃŠШЯжђљкэўѓїэсЩайТЧЩОаЯцВ–ЈжцкєлИЏТШЩСВЏАЎЎЗТФСНЗНУШФеєьпЧЕЪЫžŸЊŒЈЯЯаЯёЫдѕћўћслзжЯбаЕдэђлНЗЫзз€:ЗИНТУЦНВЌББАЖСЧТНРСОСВВрмнйкудЗЧЮОЦЯЭжЯпбеэњђэчцеезбкзкклњкСЯЮгЫЭФСОЫЪФРДКЛЖЗЛТУМОЦЩбдмьщшшцњщУИОРРУСРРШгЪпёяѓэчыцтмнййМѕўгЗаЪЧЩЮЪЦТЮЫЩЦТИЗЎЋАКРДНаджблщчючулшькЯТЛЗЛРУШУЩтяююєящхчзбаЗДщїцгеаЫЮдееЯЭЪЯемЗЗЏЇАЋКИЪзйжжнсчшыьышцЩгТЛКМУШжппѓююьёёэжцшШЩЫЭлхтСЪЦЧЫажхУ‡ЗтгМ’ЗЧЯВœШУЦггеежзЮяээцпнлЫЁЛССЧШЮбкхЪЮцўяёцєёРЧЫртїдМЩШббеецб„ЕьубБСФММСФгЪЪЮШЫадсйѕыёуєяЫЌТШЮЪЫЭбЮаМТШѓѕїјмдбЪЖЦѓьФНШЫЭЮЮбЫзбЮлнцЛТЛЗТРСИНФЧЧУТСТУФмумЯмжаЭбзЯЪШЫЪЭЩйлт§ўўЎdгЫКЪпзжШЪбймждейппмшЯЗТМНРРЛЕЕСЧЮШФУЫедеккжлгаагееббЮбеЯЇзлНУž^ZЭЮЩбедЯЮЫдзшѓпцлтйтТТКФНЛЛЖЎЎЕКУЫаагйеЫбйстрлгЯЯадбдбгёюгЖ‡`kCA?бдЫЩЩЭЭгпцёцшљянлтдРРУУНИНКВЌЉСТЭЯжзеЫЗхєууўгЫЫ€ дсмЭБНЯŸ\SY^trWейгЦЧШЭЫбдзкйгРЕТлбШРЛНЛООСБЂЃМЖЦбеддаЪЮклпхЧЩЦезхйЖ‡dckmrcb^a`цпмБЦЪдааеѕшркееджецЦНИЖМФЪЭ™ЂЇЏЏМЮгбЯЮЯбзкрюбЩЮЪР’eU<5GNM[]\dggсунйеЩТТЇЕутутлзйежЯЏЄИМТЦЦУЎЎЌИСРЧЪаЯаЯЯжйчюсЭЎŽjONMEGSYTSTSVVTптнзЮЩСРОЭѕуспрпздаугЗФУРРНММЖКФЦКНФЭгЭЩбзЛРОЄ~JLiYSSLOPVYSQPSS€ЋпрмлаТЧЦЪЦїцттрмлкклдЮйЋБИЖМНЛМТТМНРбдЭКЧЩvS[kTjMEILMMNPPTUPNLJNклмеЭФУЦИЖнщрстпммзкзЫЧЁЇЃАЖМВБЗЊЈИФРr]^ZOQ\[WYSNOJFEIJHMPNTWWYтмлаЧУЩЭдпўттммснлзезФЊЎВЕЖОЗЊЎЋЈžƒ‚mY[MVT[[ћYWVTLL€АNCHOY\ZTPSчтсгЫЦТЧНФйбЦухтцпннЩА˜ЗККИТКЈ–tpe^jYHBP[`]`^\\ZSIALOQTTUQWYPOYZускпдЩШЦФУТРкщ§ыэхлњёШЮЩКЛФЎЄ’SNL9HbVMLQUST`g[FIBA?@;MLHGBMWTUYcŠT?BFEFNTT€аSPSUY[i\a`~НтнNHHBPOOQSVZ\OOPLIEGINNMHJSPPNNL@GLNSWHJZJLACHLPQPQBOpkd`|—НѓўяхHJHFJNUPNMNPOLPNMLHNJEGFFLPQNLHGELLGB?E@C;?@CFHHCMQWoАрцѕў§јрсуPLNIJJPOHBFTVOMFJJIJGJLIGBBJMINNOJJFHIEFIFBCAFBEB@d‹ЛчюхбгєэыцртQEEGGHMJIEGPSPOMNIILHCEFIIGMTSLGFIPQTPFEJIGC:JAGgˆЁЗйунйжзрхшхчцNAAEHFFGGFINSPPMNNVZPNPPMJFNVOGCHIHQNGJGGMBAOmp‚ЎОРЧНглтррхцчшыэFEFAAE@GEFUTOMQQUUZWPOWUSQQTSJJGFBEFGg[HA[WP„СЩСНСдэыёўчычуххшыыLVTJFCCFFJPHBELINVVSIFIJOTPILLMJIC97>`o\PvЈУдФЦйндэыхыяюышщычщэHMMШIFILLJFBEEAAEJLHCBEHMSOONMJMWYWen{•žДбЫблЭУЩЮЯЮдзЭцщьэчуу€ЇщшBGOSPQQJHEBB@CILNJNLGEGIFGNU\Wqoq‹™ЅУЦОНСЛЛШЭЧЩЫзкжжЭмьяёьэщчыыщJEFA>?FBFE?:>BHILIQUJFJJ4:IQNYmŠŸЌОЩФРОЮпЯЮЮЭЧдбдйруьѕ§ђђёюьяэцуQNJBC??>;3<;EJQNJ`iTi…|[‚ЗнњћљјєюэытсслгЫЪЫЯЯенЩцшьэшххшшщээьщччцEA<><;@?ALNQW^jgЅШтсњў§ўїыыэыххтпллеббУЮЭЭбгемрхункксыьэюэыхтхуJJICBFGGLMPJLUatžбїўшлтяэяьшцтсрпжжеззМеддедйлхычтнпцшюђђяяюьщчч[ihVccOJSYZh{ŒЇЧЦгжбщыюьюьыщшьыўїрспмпсрсчххѕцшхццщэёююээќыххщг„‹‡{„z‡”nvrmw~ucgЁЪž?Nu`xˆ–Žxx‡…xzrz‹Јђўў€sћЎЉѕтƒˆ‚‰ƒˆŽ˜”ЂЊДƒz‹ŽŽ|v}xv}{|nat„o}}ЂНЅ}u…„›—В‚pcwŒŽ‚ˆx•ЏЏРшѓЛЖКЖŽz„Š‘ˆЁЇЄАЈА‚…Š‹‘~p‚{ƒpbgbt{{gƒЛЫИŸ}r…ŸЩ–Є›uqv„ˆˆ‡w‘ЁЖЦѕэчДЎЎŠˆ…ˆ–ЉЌЏААБ‡Š}ƒ‹–…{—ВюЗj`jr}pJH™АЭМВœЗУЌЮ}Pd}‘ˆ|tЃЅЌкѓўЮ”ˆ–”’Œˆ˜Ђ™ЊЛŠ‹ˆˆ–•}}‚Зkrix|YTAe|vАw‹˜РЪЪкejwmŠЄ’zv‚Š‘РцўђЮЛЇЄ›ž’’–œ—œЈˆ„‚~{|ŒŠƒƒ’Ю•—ƒ‚ce`‹{xr•ЖЏЕАЛ–}…„v‚‰ƒ}‚ЂЪщјЩЁЉЄœŽ’œЋŸ‚ƒ„tpvu‹ŽŒ‹‰‡}„ƒpktˆ’”‘––d|ƒœzk|„z{}iwТОЇщђпЮВƒŽ‰Œ‚™•ЌЊЄ„…’‚„{ƒЂiivn~ro{vjnh‡‘•‰‡ƒЁЁЕДЃ•ЇŸЈqjƒ„‡tЦМЎжшюмдЂЄŸœ”’—ЂЏЋ‘Ÿ”‡‹u™ЪДŠˆwzƒˆ„‡}oo|‘’Œˆ~„’’ЈРЏЕЊ•›Š‡Š‹ˆŠwu•НЛнѓящРЋВž’”ЫЗˆ’™–Ž‚}|ЈМР‘eu…ƒ‡{{„|w„Œ‘„ƒŠ‘ЂШЗБЏ‰uwzv|z~‡~v}ˆАз颸Л‰‹‹„ИбК”Œ˜…oŠЊВБИ–t?Zxzrnhp~ˆ‰…‚‚‰znЕЊАЖЖЗˆ…•xƒ~zАЖЫуўрЦЌŽ—™Ži‰ДЮ’’‘––„oКјкФ„nˆ|z||„m–›œ‘ƒŒ‹uƒžДЖ—ЁrЊŒx”–zz€ю”ЂЦБЭнюлЇЁЗЕœ•ˆ—Щ–——œ‡dŽЋЁ‰…z‡™„ˆ‡‚…›ž’„u}Œ›–ЋЩЧЯКЫрœupevЁvŠЃœЭжЦещщгЩЮЭЄˆ…ЁРЂ—Šˆc‹ВЅ—ŒŒŠŒ‘Šˆ‹‡rwx‰—ƒˆw}‹‚zЭђЗЗЇЅЇŸ„rmm{ƒwЂЩггаелгФЇ‰Š{ptАЂŸ™Ÿœ‡›ДЇœžЈЃ‘ˆˆƒzkbjejqw|ˆ‡™~ƒ•ЈЌВЋ—œ‡„‚zu~}|”ЌщгФНхўљЩЗ’ŒˆŽ–БЂ˜›žŒŠ”ŸЌЅАЄ‘‰‰…„k||mqwx~ˆƒƒ€”’—ЉЧФлž—tumV”–ЋбцЕмїюрЫЏЋЋЊŠ”‰ŒЁА}^w›ЖСгЌ‰q››~quztx~Љ‡‚ƒƒŒŠЇЭМИ–|œœirq]t––˜™гЃЋмыїѕИБЕНЃœЄ~–СЩЏ‰…žЃЉ‡ƒ…˜‹‡ƒqt}{‹ŒˆƒˆŒŒ{БЊЈЈЋАЈ‚Ž—Œ•ЄžЖŸЎШцклСЖЎЅЂ›ЁЂЉЊАгЎŽЂЇ•Ї‹‹‘™•ƒ{‰…{‹’‰„„›œžЂИЗНЛДдН‚…„„‰Œ‘™ЊžЋЮЮймпШЪНАЛД›зўž‚œ”ˆЁ–‰Š‘–Ž—ˆƒvwvz„z‚˜ЎЂЋЗООНЏЁКРЇžˆ‰ˆ‚‰›”’МШтцзбТУЧВœ™|‹ШйФЅЇЇЃœЄЂЅ›˜œ›Ђzmrucm{{™›ЄЅЈЊДКЮдШМЖОŸž‚ˆ…‡’ЋЏДЩМЩбшызЌЛЦ‰ЋЂЌЛКŠŽ”Œ™ŸЅД–[‚Ѕœ…\Œ‰™xdŒœžŸЌИДžмЯЮРДЉВ•m~ŠŒŒŽ—ŸЏИ™ЅЧўшдОгаˆ’ЂЖСЭŸ‰‚‘’›–ЇЖЊ\”ЖЌЂ‰ƒ…‡Ž™›Ј–˜™žНЌпдШгеЫx‚–—™˜™˜ЅЂŠ˜ЃрусшФФŽ…•ЪТ•ŠŒ‘–œЃ˜’ЌЉЄЃЖЖ„ƒ‚‰}ƒ‚Š‹Œ’—™•ЄИЛОЃЖЃЈЄ–››˜Š™ЎЏБЕщўўЇh‘—„˜ЉЄЊЁ‘ЇЌЊЅЂЅЇЋЋЈЗ•}ƒ„™ˆ‚ƒ~’•˜‹”›ЈЇИЎЉЃЂЂЁ˜ЅЁЂ™”—œЄŠЋЕЉМЊh]’’—ЕМЈ˜’žЈИаЕЗЎЌКЎƒˆˆ‡ƒwtv‰œœ—œЅЌЅŸЊКИЗЋ–ЁАЏЉž˜›ЦЦЈ˜xdqLC@žЈЇŸЁ—˜˜ЅКезадЩНЋА’‰}‰ˆ‡ƒ‰z‚vЉ‘žŸЁЄ›‰ЖбЗЖИЉ™™ЂЅКЉ‡ЂИŽZU`et~`ЊЌЂ›™—–Ž™ЄБАЌ”‚‹Ћ—‹‡ˆ‚ˆƒŒŠ{prY‚~‘ž™ЇЁ’–ЃБИ˘ƒЄЅБЛu\hpqpbchaeКМЋ…ŸžЄ™ЄЪМКВЈЈ›ЊЏС‹~z|Ž–`rhvr‚‘ž—™—žЅЏДЪЉ—˜›—{ZM72H\PYY`iijЕМЅВЅ–Šm‚ВММКЎЃ˜ЄЃzrƒ„‘ˆ…z~‚ƒ‰‰‹–™Є›™›ЋАОШЖЃ’v^QGIELUSYTNPW\^ЏЖЏЄ”‡‰ЂСДЊИИЎЃ”•МЃ‡‰ˆŠ‡|ˆxw~ƒŒŽu‘–˜™›’Њ™ЂБœnFIh]WGICSPVWMOUS[ЅЎДЏ—‰‡ŒŽŠУНДАЖОЎЃЇЎЊЇЎz{x‚‹‡‰‰…‚~›Ё˜”œВ`U]mTpZONLMOMHN\QZUYLWЇЏДЊ•”…‡ЌЖВДЋКМИЏЉЅЄ’mo{|‚ƒ‚‚qzƒ–—…q`VYJV^ahZNW[UOINSLLMSVWP\ЎЎЂ•Œ–••ЂЕхЭЋЊЌЕБЌЅЃВ–v„ƒ…‡ˆˆ|vqv~da`YUQHY[ddcUT]WNJFJPLOMWa\VQ^ЖБИЁ–”•‘’АЅœМЕНЗЗЌА‘}q‰ˆ„Š’Š„nW\ZTbWGBV^\cdibOWVOQTYVUVNTSZYWSZТРЈБœ•Œ’•ŒˆЊЩщзТЛЕнкœ——|’„…~BGG1@^LPOUSQUbk^ESMJHQPVV\[[UY[QQ[ЕЛБЂ–••Ž‰…‘ЄЧеаФЖЛ‹œ‹bThdWF;FCNLPPOQUIILQaV:JGLJMOUYZTQQZQTVcОЖВЅЂЂЉ™Š™Ї‘ЁИЭЩСгеЎ‡vbP?I\V?@BFTPSFNSOJVWOQTUTLQUU€šOSQOPQYZbe^ДБЊБМЏœ—žЊЄ–ЎзјўњЋ^LFLJGJ\O[WJNLECCHLNQUITLSQQLTMMNY`WJVT\Y[[]ЏИЏЕКЕЅЅŸЋМНБЗшўєЋjJNNCOQZ[WLNPWQONICFB>;A>>Zk]VQ[PU[V]^T\T]NQ[^ЗЗЉКРКЈЋЈŸŽŽuhZ\VQQWUPPWUPQLIHHZOG7F;BGBAB?*1GZYZZ`b`V[ge\VNZSYY\ЉЃЄ‘—˜|re^W^^VTZ^c\UTVVYQQOWCHNVSOFIH@8EJMHENY\]]abdcekk^WTPPUVZИЕЃbVbmjamh^S[V\`bb[SPUSNJILJUNHIIAJCECMSQLJLLQST][`V\bbZWPPJQNW™‰jSOLQSSWTZUYPP€З]ed^TISLPSZYaPNTUMUZNWnYJPIGMQVV\W``^bc[\UTSJJnk\YPbaabbeb^VVMOLTemgVSOT\[TWVOVSUOOP;CZnVNk„Ќ˜™ДИЎбЯШдзЯЭЪШНУУФV[YTOMLPP€оJNQPTPNJQUMNPSWaZ[\LN]aWdm}‚{‡Ј–ЉВЂ™•žЇЂЋЏЈШлжЩЦЩКНЦдGNUWYVV[NQNLOQLUYSJISW]ZTY``dct|xŒŽŒЁŒŒŽŠƒ™œ˜ŸЋАЇЋ–ДЩзйсгЮЩШЭШIOTMGHIQIEBC@GGNILIM[UZTCAT\Vao…”’‘ž˜‹œЕЈŸЉЄžЄЈЈВРЦгтђнкгапегЮМ[YQGHG?GGFH8BNLPMQZ\WN^iut~–ДНАКЌ‘‰™–žžЇЊЊ€ПЈбрТШЮЩКДЪргЧаеЮЫШЮ\]YMNJAJMNNJHQIJawnWFS\qИнсбнсйЕ›ЄЈ˜’œŸЄЊЏЌДСабнхтжЯжздзйкзмхчTVPL>MGLIPP[Q`j\hŠŽtY}ЎЮцщсысмбЧЖИЗВЊŸ–ЂЅЌЄЅЉКОНЭккЯМНЫдЮЫалдЯЫЮMPCGC@BAIPO[]hekƒЁОЯЭуњєјьаЭЧЭЭЧОУИЁ›Ѓ•”ЂЉЉЌ€†ЖМЭЦБЋОЭгЯаЯЦМСТРQYQJGSIMNVJNM[Zn–КцњлТМдпмЮЪУОЕЗДЌЋЋЎБЋЊЁЋЉЈЊИОЦШСДДСккзкпйжаШОНi}ndihJSU^W]u|‹ЃœЌКЏМТбспеШРРЧгѓуМКВБЕММЗУЮЭШЪЧЯЯФСгннїтзгайдЪТСџ–ѕ™‡Ѓ‰’EQ0U]WW€[UML?CGMQOLPTMQ^PWЄэЧŽЕлН‡HAU,) +1.2$1,+@::;5+8#&˜~‰ž›‹‘g\Z\\YTLB?8>NOWSL;4ABL53‘аДЌМ|3CMUTE3*##$$)>;A520%-FHMH>GGPUVNH@C?+;PVVM@pn?;GH8.*.1CL‘‹ƒ{•ФЭ~doOFBEBC?EPBH@HII?FCAC5?#74U\PHEB9925%&#%*-BF@8,+HMj…‘—˜’Œ‡ŒœЗТk^LL3I]F534+"19E)4:TTAG>8#-;?9,&()5>++1)-:7[‡Š…‘’„‡‡ˆЇЌЂ}TMj…YGLHJO\]ZUPB<9BF:?U*,5.?FA<<51+0>9*+8,1>+21<‘‘•’”ˆ…Ž‘ЃЅКЎnWGM?EQAB>JFHBB):7+84,B;;*AA:9>:5>EE5+)7AQJ8AWv•‹ЁЈ”Œ„ˆœ™œЧО—L\|pL>7:3HFHN2  )BGcQJA-54AHF7$ .8GE.Q˜ЯЌ™ЅДЕЋ‹ŒŽƒ‘ЋТЭВ‘i::1@?88;1ELAE!#Y30TB1-7@HFAF<5&-;ŒУВЕЋЉЄœ‡‚‚V}•”МЯрmV>CB<1)75+#&8BQ4$$:<,3>B@8:5301,%QEnСЯŠˆ˜ŸЈББŠkQj‰‡ЗшььТjBVWL7)1.%+#2,#!",&-7EA5(487@JBœШLJЌЛ”›ŸЉžЌЗ–‰toŒŠЂЭччюЅIG0"1($- %$).)51CEC>::GB4ImЗЪ^Fj™ЕЄŽ‘–ЦТЅ„…–ЉЈуЌb9:A;@HH\‘буЊTO@ˆ‰ƒ…’НЌБ‹w˜‘•wW]M(<80.&*)!")(&#E<32FMYPHQJ?88B:$@m”ВШЉkSˆu|pˆВ„’ozwI>+:ESEBC>E,*&*;A3+-TOPPOJA@JLJEH…ЄТМЃ‰uV‰‹u„œŸž–[\N<;>199F;223*+2$%%""# IbcQ\bce\PMI?OˆФЧМЄ˜˜™’}‹‡ТЭЎЋЇЁvLT701%127:89;2*%+$*"!#"4(*E^~r^[PPT@:Qd›быѓаЎ•—’‰ŽBw—ЁЛЭНР}B0;UJ",%2.*&717<<3!.1*"<3+7>Oc[\WTM@VJHАхтйуТЋ•œЅ–—ˆ‹АТаы٘g>>3:.,(%.92,-19;7:>?+%;J(,OTEJLMOSWV^QATЕйлеТМСЅЂЈМШЈДЏВЦЅ”gCC3&!!+,#-88?<;@IEAFJQOL@IHNSU]^\\ђZ”ЉдаЛЭЖЈЉЁЊЕЏЏ€§ЋАЛœp[•aH;A>:8,%".-%02+,17AG>5-&3@9@>8EIF>9CGNGCFNqnmd`cqœВРУСЧЩЭпЫЖЌЇЃЇЃŽ’АКIT:"#&.4*3)#1833*3^GAJOMIGE:CFEGNZivuq}ƒŽ„ЄзпмембЯФЧЮСĘЈЂ”˜žВВЄ:EJ8985-LLFONSOMHMO?LN^`eЉЋБЩЇ’РщјчбЧЦМКИЃ‡•‘œЇЇЅЎВЉЅOSQPG?13%3EB;5:31*+?BJHINSMFAGOTU[[ƒЄ•ŸЦДЄМТЧЕЃЖМЖЖЉ”˜АИЏКНККЛАPMI58+8<@4<>:5;<92..4??INOGILUbEQ„ЋЃŽŸдцСВДАЎЁžЇЊОЕЉЃЩуьТСЫЦФЛТДI?>A8582-.:,+*-,*<72<9@CJPVadTU–ЏЅЃВЪждЉЖШЩЛВАЊЉ›ЁЉЛЏАЦУжраДБЎЈH2@IG?<<72),,711(%$+@@9,)%"2MHJTUWQ…ДЄМžЇЎЌВЏБМШУОФМЧЁ•‘ДЈžЕЩрчгддажлгСB>AEIYw8&+,8:?8-,3*JtZQ3F]\pЃЁДСМЖЛЕДЗЗКМОФЩМЇанФИЌФйЫзлЫНМТЯЦМMPIGCG<$-+7>A57;CG?B?G4->ˆ‘ЅЫЯЪдЪЏЎЖЗЋЋЈЈЇЌЛЦКШздФбержакрбЫРМТММMTTVA.8.%&3A@AHV]NC7)@3J{‡•ЏШЦбсзРУФЖЛКЏЅЇЖРТЧЦЩдлкгбнтьэяуггЦЛТJLSVWM?>7?CFHNTZWF4);BHuˆРнэцррмЯЦЧФЩЭМЖЎВЖЛРЪбаЦадмстцсенкбШЩЧJJ€„L>?FI?ACJMWONIFLMNMHJGC?1E`[j}qb`ƒЅОЪРМЭбЧФТМКСМЛЦШУЮдлмлЫМНЦЫЮалхчнЫОЗАВИJJINZW[[€ЊZUH5LHTi}‡‹‰Œ|zЇТИКгкУЊЧмНМКДАИУЫмнзбФЧУОБИСШЯЩЧзйпг›ЇЏJOLSWVWTUUP<31\•ДЛЈ‘{œАЃЅЈ™ˆ‹ОКИАЋЋЏОзхщулгЗЕКЏЌЗЧЭЩУЮйЛ™–ŸQO@APVYTIgaHVxЛхслЭ˜zv|Љ—„ДЉ›ЊРЫМЛЪекШНЧаежгЮОАНЛЕФШЪЧЦЦВЂŽ‘MIGCHIFemz—ЅМЋНЮйЭбЛЎrcjƒ[TqžЌДЗЗСЭймьрЫШСанЮСЕАРОУЩОИНИЏКЩаЁtwHA58:BIPhЊЧИ›…˜ФШСЏЃЏŽ^N3^Ё‰‹ЁЈЗТТЯЫУРЫЃ‡••ЌЗЛДЅЃЋЏБЕЇ›žЏЏ’”ƒ…IGLajpwЕркЦЦЕœŒŒЅЏЄЅ—–}\pЅЂЛОЌОдЯЧРМБВЉŸЄЋЅЄОТИЅ›•‘’‰ˆ‰Š„mT>?YˆЃАЭудУЖ™„‚˜ЂЃЄЉЂ„‚ЂБЋЏРКМЦУКаЗВАЉАЅЂЃ™‘‹ƒ‘ЃЂ›ЁŸ˜—™œЇ—‰~~Zbaz”ЂЧрЛЏ˜–Ќ™•–ЉЋЌœ–™–•ЕЮНЊЅ™Ёœˆ‰—ЈŸŠ’Ž‚„’‘–ЁЃЅЃЋЈЈЊЃЁž–ˆ‰ЂЂ”–Œ‰”ЅЎЈВЖАРБœЗСЎŸЅœ‘”pt—ЇŸž}}|zƒ„‘ށŸ—˜ЄЋЌЌЇ–Ž”–Š•›”Є”’Žˆˆ‚‚ŸЄЛЯнЗЁˆ›™˜˜ž‘Œ˜™‹z{™С–t}z|‹Ž‘’™’Œ‡ˆ„”ŸЂžЁœ’›ЂЊВЖЧЭЩЂЃŸЋžŒ‚||ЌгЯгДŠgo|…Ž’‰~qw|{x}ˆ•‰—’ЅŸ˜›Ђ‘‹‚–œЈЉЋЊЋДМБЈЈЏЛКБЎЎЌЖАŒŒ‘žЊЕЄ•Ž‚Œ‡„xx~|w„ŠŠ‡‡ŽЇЁЊВЃ›˜•–™™„ШытУМНЕЌЏЖЗЎЄЂЌЊБЋЋЄ›œŽ”ЃЄЅЇЂЃЊЏœ}„…ˆ™~‡ŒŠŽ‹”ЈБЉЋЇ˜ЁЎЄ’’–‡™ТЧЫЫФЕЇЉЎБЊžžБЛЕКМЌ™—•ЂЎЗЕБЋžЄДМŽ|‡‡Ž”—ˆvrzŠ—ž—›•˜–Ÿ™—œЄ™›žŸМЯОАЅЇББЇЃž‘ŸБЛЉЏЎ—Œ‰ˆ–АЊЖМР›•ЃЂ‘ž˜ƒ~‡Ё•rk…‰Ž”Œ…’ДУЗЋАЛИСЕИЯЭИЊЊ€сЗТСВЋЃŸЌž’ЏЂ”‹‡…„„‡ŽЋБНŒ‹ŒžЋЌЈ—tЎОЈ˜Ž–‘КЏ˜–ЇЃž•˜ŸЅЎЏЕИЏБВДНУЯИЄ—‘ŽˆВА•ЋЊœ’ŽŽ‚Š›ЅЂŸ—žЅБЏЈЅЁЎТЇ‹ˆ–ЉЪыМБЋЂЂœ—œœ›ЁЈЎВЗОДЗДДЏАЅ•ƒ‰•–‘ИЊЃœЁžžЄЊЋЇЈЌЕЖЊЂЋНДЃАУВАДЃЁЄ˜ŸНФРЖЃ˜ЇЕЈЈЎЖЋЂ›––Ї~‘žЂЂœ’‘‘Ž‘˜Ѓ™ЂЉЌАЋЏŸžЄЎЋЇЈЕНЖЗЕДННСАЊЗТЛЕЉ‘‘’”œЃЌАЕЈЃŸŸЄЄ›ЈБЅ™›ЅЎЃЃЅ•™ЅЅžЊКНУЩЎЁЊНЮбФОММТЩОКЗАЅЁŸЂЃ˜™œЄЉŸœЈЁЄЌЏЈЂЏЏЅЂž˜ЁŸЂЊЊЄЉЎВЎЋЏЃЁЎЖНЭеУЕЊЖНМНМБЃЁЇЊЈЏЗМФДžЇВЋЄЅЉЇЋБЏАБЊЌАБЌАЖИЖЏВБННБŸЎИЋЇАЈМЋž—ЉЏАКИБЈŸЅЗШУМЗЋЂЅЗЌЖЧЮЦИДЎААЅЁЁЅЃžЁЌЕВИДЅЄЉВОКЏЃ™ЁЋЊЈž–˜ЇЎВЊЄœЊАИМОТТВЎЌАЎБМАЅЉДДќЕДВАА€—ДЗИДЇЎДЊЁ˜ЅОЪЫЦЊЁЅЈЌЊЅЃ’‘ЄЎЅЇŸ—ЄŸЊ–ЉМЕЌЕЛННФТДЖЗЏББВИМЩСЏЎЏЏЋЌНФСЎЎЉЋВЎЎНЛИРЕВЇЈЇŸЕДЅ™‘‘ސ›œЂЈЌЋЋББВВЎВТТООЖИООИЛДЖЛЧЦКДЎЌЊЎКСЖБЋЉЈЉКЩЩЛИТЯЦЖŸ›ЁЄЃЅœœъЁžЃЊЏЕИНАБМЦШФТТУЩЯаЩФФаЦФУОКСОТЕАЖМТЛАЖМЛЗЖУЭЮШТУЛАЊЅЉЌЉЇŸ˜ЃЄЇЎЕЏНЪРЎЊЇ€]ебажуЯЖWa<`eS]]TULE9BE;;5989:0,гддейтрЕЇrd\W\\TOH:8AMTQVIBFHIN<;Ÿёссм—GLV\bLHHE@?>@@:@B?859:>?HйееадшюШW>]POPLOTB3:F\VWOELJNJQW{БнМhSZWAGHFBAFGJFCA@:CB:844FbOпмлдззыщн™+1ZOFCHPNIIFMV[TUNNIE3HU\dYMzCFIJIA>GQMPHGBGIGA?A@4IMкнмаЭЮЧкўѕ™uxUMACFBFLOCIHTNIOLJHI<:.?LhdQMNHG;;?TVOF<;?EYTh…ЯбзеЫЭзмэєФveTP;PeHA?78,GLUWLL€pIC>?Q19BYVOLF9<;BHFHA?<<>;99?:C8iггжзжебгйцще`Sn‡ZNPPJTdm]ZZ>>@AG>E] 78:AGJFFACCFFEGC@88,??CGGJHA?OISQTBgКцущшщцыЭгдНЯсђѓЦ˜i?<2CEFC:>PT:M3"0\3!"5\QC@ENHFIHF??@?B:5701++,#*:$#(!1:?A9CNLB@;ACESOВхtvбспттпхрёжЧДДЩШкєўўћЋJN3)80-,3,*!!%,,)*24??EEMF@BIPJAZUSNH@AIU[YZ`БекчхбКЌŽаЪЩШЫезЯмл›”cTJINFGG€)FE20,,*-41)!&+) 0-JW^]WQEEFQ``e„ВжкзггОСШЌЭУуггукмзШnUFTIGFOLIG@:?9*,),.,(!&*.QcjQ]`a\UPSVM\ЃхђыдШЩЩаЭИЭдЧђљщэьЫbkVLWN?EC@<<1(,)(!)2+0)FHEBFC95,72-A253@QhZSMJNETU`РєѓщєслТЮбЫаЪТсљўўђО‚MSCE@:?B??1GP.ABJFAFNTPTUQJGISWWYUW^a™ЗшсдцкздклзклйжлщЯО…mЃ|ZFOPUOI><>@@>?@<:@FHB@EJYWVPNOTTVVNGTUd‘ксуйрпйжждбЮЭабЫблуd]JGJHTJHIA@AJLF?AGLIFLMPJGGJSONQQWwtojgpЊТеежншьњїчмпкжЯббдкмс^cN>GC?C?BCE@@CCECGBFEHLUUVNT[iHPˆЏЅŽЂнѕрнсцрйймурхулђўўщэююшщуц\SMPQJEG>A?;@??;>IIЪHBFHMOSQ\bPT˜ЎЁЅБЮхэптщьыхрпйккмтлкчыёёюэусхJIJTWTPJB;;€@?CB?BBGCIPYWYVS<@YmЮдШМЧЦЧмуцшчщњьзеЮбггНнєћёѓёяэщцQPMHIHEB@<47:HEBCEB@C\WWZY\Sc‹РЯЯйнккейрцшщхцзлФЭгезЩЧьєёєђѕєѓяюOMLMLM;.@A?CFEB@;9:.FPPSQOTOŒТЛеЩжйптцчэюяёьэђкЮбцрдмэјћѕђђѓёёяяPJICMa‡L?9:ELHFAA;1TvVN:O^hˆЪШЗпрхцхщшчшычххщсдђћящцюєђёёяяэышщхVWVOJSF8@@AACCпLSTQE?EFGEBCEGI@AЋ—˜œАЖЖЂАƒvkpxwnh[PQWbgdmd^\VW]J@ŸыСЦжES^mnZH707F?4?NOMLC?BCHL^ЌЌЂЄЃРЭЏpVIgge]^ddYOTZtmje^^d`[hd‹ЖеДpZj`V[TOOE@:1:@7EIPu^ЏБЄЈЅЊТМЗ‘-9haZ[Udb]Z]bnnoea\\WGQhoreV‡V^PWUL?@78EJC@HTIB>;HAFTFC@Gg`t–ЇЉЏЊœ˜ЄБЭзЌ|thcM^wWPOUMB`^gneb\^MSV[EHIte[^VLHISSM@OT1ЂжЦУНЖМЗА›’ŽnˆЋЉЩщєЖ„jQa\IIBBGCG;1GQWeN *<;@>UNGHW[QNAINNJE9a])xацЋЅЉЖУЩЮ—g~ЁаўўСуZknWLEHHF7;?15*A<.1(94@48E@FIYQIJIIJWZVИйSTКбЋЕЗОВНЯЋž„ЄŸЖмўў€“З]\I4C8;?><9.>A8@ALPLOPTLAIB:7>SGLBOawo]^YWT\[^ТяяпѓЯСЂБЗЎБŸœЧпшњцЏ„SPG;LJGGFIPJGMQUOSPUOTAV\HMJGJW[TTV\bh`WTWY^^€пVU\[m–жжпФТЧРЏЗВЉЅЇЏЉЅАМЮaaFGMN]ITSNGETULGMSZVZU^^ZOS[ce^T^`}zrwwЊНЩЭЪдймѓшЯСНММЕЃЊАКТЩ^hL>OJMMGOJCIUSM9Sxg[hbeW]]W]`[`^iwztt‚™ЃБлцыщїучкнтмУЏЗБЃЕЗЯЭСPbV\WNOIU[YSNSOJJVYh`achh`gha]adajdŽЏЏЕаАžЮѕўёцлжаШеЖ—ЂЄЋЕИЗОЫФИdheaWOO€ФLTZSTQQJFGS[b\]mjcaZZcd]bb‹АŸЅгТЖЫагУŸЗЯбФаОЇЁЦЮЧЯдЮЯЪЦhgUFILPOSNTUSTTOQL?SPPS[Z^\`\gnPUВЅ‹ЅпјаУУЦУВБКТгЧМКтєњажлпззйЧj\QVTTUIONNPIFJEHCPMJNLYW^`a^jVYœАЃЅЖбтхСЩптЭЦТУНЖБКЩФТкгрцтЮФЛРZVNZVVWTOHHAMM€GLEIOa`jd^aIIgv—ШеЦКСЗАТСФЧакуЭАЈЏАДЊœОчѕђёьтнбЮidNYQOQPOHIGPQUO?B;NQg`j`hd\k‹ОЭЭаагЭМЏЩЮеШЪШЌЊЈЋЏБЃŸкщщђящуцсп\]ZZ]]C?GNILNTM>@><4JYWWZVWZŒТБЭЌИМРШОЧекжддгпЏЅЇЩОБСпєїхцшщячсй\`ZWcuœSGEFNVUOFAL>8‡ћћёѓєєѕјјњїїѕїјѕљїљљїїњњ§їјћћдљћ§§њ§ћљљј-)48<8GEF?FC?G<3Tаћ§јѕљїѕїљїљїњљљљћљћљћљјјќїјїјјњј§њјљљЭ<4:07kчћѕѕјїљћљјљљјљћћљљњњў§§љјњњљљњјјњјћўљћће2.70?84;A?E758<:7,C]Нћћјїїјњњјїїљїїњћћљљћњјјћљј§їјњњвјњћљњјјљa>bZUB@EF3((B„ч§§љѕѕїјњљћњјјОїљ§ћљћ§ћћјњјїћћ§њљљћћљљњŸж‹~EFJIGBB9.973?B?:3$799A,>7rљ§ѕѕќїѕјњњ§ћїјјњњјњјњјјнљћњћћјњ’›ЇЩm9GCC3BFENJ;*-B>HmGEМљ§ѕѕўїјјћљ§јїћћЯљїљјјњњјњјћ§§ћљћјїј‡ˆЃЯ›SZNJFH<9A<03?<;B:5"Wј§§їѕѕшїјїїєѕљјїјњїљњћљјјїѕљњњїїаћјњњјњnŒjaŽiEIEFHF:<573;:9BCA)>Н§ћјјѕѕїїјјїјјїјѕѕћєїїљїїњљћјїњњїјјс0}ŸРТW.GJUVZ55;;>;<@?;?.n§ћюєїїјњїїѕѓѓєњјљјњњїўњћћкјњ[[~ЊФр‚+MIPMI78.013504(CИєяњњљїјњљљћѕњєндёњћћљћњњј§њљѕѕлїјњ!BzК‡@NH42BJ8,).508)$"4I–ы§љїїјјїЩјњљјѕщНцєѕїјћѕњњћјјћ§§ћљћњ\.B9|ЈЊL)4((:?73*9.3$4:HS[Jv§§ўљјјїўѕјјіњћћљћ§§њ§ћћља§љћћњ|I[;ŸУЈI7F0.7;8??@BBE<>G+-\Жћ§њєѕѕїѕїјњјјљљћћљљїјјњљТћ§љњјњћn ;h•Z.E478?CEHLHG@83G]F?IЄыћљєѓїњїљљїїјћћљћјјњїјњњћћљјлњјД‡є§љѕѕљѓѕїјјњјјњїјзћљљУЧ”^…ЂЉНЩЉH,:-)9BMMBNU<21;<@92?Ѓљ§ћѕєїїѕјїљјєјјљјј§њљћћљСѕљЛЭЌzƒЎБЖдь‹GUM8&3;E->>C829;25;IЅј§ћљѕѕљњїїѕјјњїїјѕјњљћјњљ§љћћг§ИИ•œЧСОЩыьФPECA7%*;;75288EGC2A7:;8?EGAA37тїљѕѕїїѕѕїјљљѕљљћњњїћњћћŒЕКЇ˜ЁЉОЪбмуэѓмzAMF?(>382*+1:AIJHH>M‹”тєљєїњњїїњћљљћјїјјљљћјљњВКЩТЎЋкгбмнххшОtBEVcO&@E>0-57)45:7CVdzAvђїщѓїјїњњјћћТљњ§ћјїѕїњЧФбШШаЫЯзеЯетрсЃI7BOG1%NJ;09:130+1]F7QZbаѓљљїјњїњјњњ§јљћћ…њћ§§РТЧжучщнлгжннсїєЏbVgcJ-ATVM<97&+9H:8BEпјљєѓѕїїЦјњљ§§ћљ§ЦдппдРЧТЪКДОЯбЫЧЦадщРh55MB2(Pzi;&-,$%4>IB25J’ьђђ§їјїїСјљљјћјЗЦЯбжЩДЋЌЏРРКЖНФЩТдючз‡13L%#*G<)$7uЫљ§ћєљјїїѕїјx„Œ‰ŽŽЂЇДМОЛИ›‰‡‹|ЕЖОжЉ[>5(>,:ZgO!*E3)BICCA9EUbŸцјњїѕњњїїњ‡‹ŠŸЇЁ›˜˜ЂЎДЌИЏ›ЊЌАВДВйдИО~51:*PiiQJG&&0@NCMMGB`CO›јћћјјљћћ€"‚…‰ŸœЁЇЎЅŸЅЈŸЂЉЅМЫеЁ–ЃЇЛЖ[1JH)?Gc[43)-4G9;@BAH?%4Ћѕљљєѕљѕњ~|ƒ~‚‰ЄЄ”‘˜žЊЁЊВБШдьЋ—ЅБЈŒЇЛЄeG2!(GhPC*7-%)-4>;A@58S›шљ§єѕѕї•МШЈ„}ЈААЎСКДИТЭеШ™œ˜ЄБТЎЂЖМФТЇ]1@?2BgOI:!+5284:>WYYiлћ§ѕѕњ›ЉН˜ŠЂŸЅЈАБЌБЖФЯзмгКЌЊАЗЖЋЅНсышуОJ;AA5@:J\tpI*&->CJB?]VZ^Nzєћћїњ——ЉДЏЮщѕєпйЫЖДУбВЕЭаТДЎЛУЕЋЄЕИЄБЮ–NI,&.5^uP0..*37@9#9WN9?5::588+CnБОРДБЇ”ЋžˆƒœЁЋЛМдпзнскДЃБЌРШЋЄ•‘—•x•ЌЛ™`THY? C]`F:3?MVoN?WЌМКАЌЉА˜›Ѕ™ЂЉЏФущхщчрЊЃžЕЪЧУРŒЊКРЌВЮсЧhcQSUI<[F0:930.AGL1-5ДСВЄ˜–Œ‘ЧШНЖЛЪдзЭСЯЫШЅЏЇДРШТР”‡ЏРОЎЅЅФТОœh48O;I!EGA*((973379{JЂЋЇЂ”‰„™ЋЅЊЏТШЦгмгЯеезхыпЗЮЮЖЄŽ‹›ИЮСЏЁЃœЖНШuMC&74147FE:513?8EM><:40278ABБИУРЊ™ЖбКЖБИЩбЯбдЩЮддбмкдаЮТИЉУЦбнЪаЦОЦдЩЫМЮНh75T5$07IMBA9BE@?A<ТЛМВЊЎЏЗОЛСЦймЮЯЭФОШЦШймлгЫФТЪлммбккгККОЛЊЌЛМ`HJ,(7"9OHC@?-)&50ЖМЧООЦФЛЏЎТгЯгбааЫТРСкпззмрнчлЧдпгжЯШНИНЦЛЈ‘ИЋЂ‚[OBL1.U[O??92(0,ЎЗЕЎЕРСВЇЋОЮЯЦТЩЯгзтнуурзЮЩЮмкЮЯлсЯНЎ›ЊБЌЅЊВЕЭЧНu@F[Z9-Qj725+#!"ЊЕРОбдбРЛФгебЯеанрнмгУабЫмнаЩЪЩУжмйЫФЌЎЖУгУТжспжМo?:cU29LO?<)*!$ЃЅЈЈКТНОЦжмйнкЮЛЧЭЮбЦНЛУЮпшхпйкжУОЧЧОМКФгбФСбтѕјјш‘I<7"49G@150-ЉЉЎЕМадазтмзЩТРНШЩЯжжртеЯакжзмжаЧЛЛЅВЌУШФЪбЭШдхѕїт^21O>!&EA4+7:ЃЅДФЯаЮЮЪЭФОЧзжагмнцшэщшйагаФКИЗНМНИЌВСЧЩЯбжджстШАБbPZAAQO0(5х.&2738>EGCCE@;<<>G@2SЭўўњјјљњљјљјљљћћњќљїљњњўљњњ§љњћћЭCEBA;@E@FL@<7:;>;37pюўјјњњћњћњћћњћћњћћ§§ў§§ћњљњћћљњњўљњњкћњћњ:#BB:<;7>%G`Чўўњљљњљњњћљјљљ§ћњћћўљњњћњбљњљњљћћљњњћ[LCBB;BA??ABbHTсўћљјјїјљњћњљњћћќ§ћћњњћћњћњћћкњћњљљњњљњћћњљi`UŽƒBLHCGFF?;:7;#&H‹эўўјјљљњљћњљњњћњ§њћњ§њњѕљњћњћћ§ћћњћћїљЖх•‡FJLFFюCA@;229F8.OЄўўћјљјјљњќћњњћћв§ћ§њњћћњћљњћћњљњћљўўЯŽA7GEG?<>:529:1;OWxпўўјјљљўћљљћќ§њ§ћћўњ§§ћњћљћњњиљјљњћњњљњљ§ўёt*,>FFC;:218?LJUZQM˜ўўїљљћњњљўњћћњќ§ћњљљѓњћњњћњљњњћћњљљчњнюўМZMNIEC;;85:GLC855Muўўњћћљњљњњћљњњћњњњљњљћњћћљњћњњљћњњуљыйїя]HLGC>;AJ@?,<><4-G>rўўљјјїљњњљљњњћњњўљњњћп§ћњњљОЭзцu?S<>BABJVQ@CPtL?Оўўјјћњљњљњњћћ§њћњћћњљњњљњњ§ћћњфћњСИЮѓИZ^TFJIC<;3.:>9;-EЛёц§§јљњњћћѓњћљїђэяњњћћњљљњэљјњљњљњљUtБОЭы–BSN@@ыB:432487:5(.Iмћћљљњњшћњњљћњјэѕюїљљњњ§љљћ§§њ§ћћсњљžnqДшкS,;18;@92<9;3>>?BM[Ewўўўјњњљњєљћњћњ§ћ§ћћњћћыњћљТ…‹FgнўУSGN43775:@@щGCBEF1-]Нўў§љјјљњљњљњњћћњїљњћћњ§ћљњњмЃ24;uЏгРn8I:-2;A@EGLLF>BO[I@JЁёўћїћљљјљњћіњ§§љљњњљћњњћй§њљњйo~ЉЛЎНЯdM:)28>FNHHB79?@4!;ŠўўћјјљїјљњњљњњљњћпяђЭŒОсйрѓРN2FA-3@CBIPP@945;:88@ЌўўўјљљіњљљјњћњњћњњељћњћњћћўћђђдЇРуурўў•N\TA:58:0AAIB;:739@AMЇўўќљјјљљњўћњњЪљћћ§§ћ§ћћњћћтуЪЮщящюўўгWMLI<719A>.#рўўћљљњљљћњћњљњњЮћљњњћњћњћњрнпњўяэьзљўžZ>759;>CHCFHGLEBBCE?@P•щўўћјјљњўћњњћЯ§ўўћ§њзжЯгЩШуыѓ§ўю{E7>?BFABFGC4<>:7@@ACT`|гўўњїљћћѕ§ўћњћњћњћњ§§дћ§ћ§ћмегЯЕКЯюѓїўўУZ9:MOH;CIPG;;727@>?;AQjwНўўјћљјљљћћњћћњњћњњў§ћћдркеаЯйсђђєћўўКF2FPH?@kSL<<>5242-22dL?N[gŒнўў§љњњћњњљљњњћњћњљњ§ћэщщэѓѕѕ§ѓѕєєѕўўЗn`mkL3<9-((5;??:15G?bбўўљљўјњњєљњњћњчююђѓєѕѕђкюўўаv`SdJ<#1FUJ5-!899<949>7BPoёўўћјљљњњ§ћњ§§ЭћюёђђѕѓѓєђяёяѓяёяёњљДnH`w@,00\…W-,9<93.28:#NMBтўўјјљњюљћћ§њћћяђѓѓђєюющыээлюђѕўћбq;>T79%Mua2798,))109JE:9L™ћўћљљњљТњћћ§ћњэяяђяьцтпрущьэщщшьё§ўэ•39AC85;jr?441+*.01-5%14@MŒтўў§њћ§§Пћ§њћњяьюыььцпйклцшччхёђтмђўхML`P;,BJ>>5;@>?7,$("Zb3VьўўѕѕїјљљњњРљњээщщххрпйдхьыюьчмбЩЪедкбЂ]PPA704GJB(,AOHIC:MYkЄьў§љњљљШЮЯЯбдрппнрппхрупцдрстутщўљхж‰<>C$Gc`NML813APLTQLIdITžўўњРћњћњббЮабемлпмннрпнпсхшьљеЫкйЯцчЭp?YN2#:ATS4:98@L48EG@GC,5ЎћўћјјБњљЪЭЪЧФЧЮткйкнсрчуцщчшўкжзнмЯлчЩ}T@%1(#I[J>*83+.09BCBH:9WЇєўўљјјљмѕўхСШИнпрцхщщБюяэщжеШлхттстщёщКg7GJ1#2VPF7,"302::8@HYYdjшўўљњљлуюеУгзнрыыььэяяёэюытклнпмнмѕўўйЩT?JH;:4@YigJ2+9@JGCJab]gV|§ўўћљмнтпйѓўўјюэђццшѕщщ€ŠьщтцщьыспруальЊ\S5.341ZkF1+09;?@<)@bU>nјўўјшчшыцщышцчшыеймлсхрхшьыюыыйкэљїјљцЗv]2;B$ %UwU!(;?@@;>F[[@Jшў§юяяэьщцмзтыттппссурсчцччыыюяђђоєїўўлЂ[THC70#9`uP4;43;9;99$7@vК§ўыы€ њђїэЭЏНЮккееньчуцчшьююэёюььшшщнўўѓ˜bGO91($0PeY<5-35<@@BIZcLEA:;9AE:93IzИыщщтмгуЯЫЯмшщэюєяѓєѕёчмнхщщыпзебежеЗецщЗnbZaE:TQAEC@:E@:HtJртрйдЮЯдсмушщыёђѓѓ€КђѕјћўњььыьпЭЪечьыррнзшсу„YO9@;217AACAACGICGOOтурзагЩлхуцшчюёёѓѓїјїїѕѕєєяюшцшшььёыцррцчђћэœH4YH50-CIG75><<><><щщцюпжщєщчыэюяёяэяяёђѓђђёюэыщьщяюьѓьэшщшщёыєр<шышчшхуцыыэђёёюњэёюяђёёТяёяэюьяёєђђьщуцшчущтЖuQQ:81+CIEHG90951цшцшышщщьээюѓёююяяёёїђєєЬёђѓёђѓёяѕяюэчцшхрпЩтужœ`YUI-JSOCA@>?80ышхртцчццыююёёљяѓєѕѓѕђђёѓѓёяёяђђящуцрсттцчёѕе}FH`a8%Aa;,:4201чцпкрыыœщююёђѕђѓђєєђяюшыѓёђєѓёяђяёђёщщшьюыюэєћћўс}GAm\7.CE?<940(тнззмчюяђђєєђяяѓёяёюяэюэђѕєѓѓєђяяюээюшхыьэяёёўѕ›LB>*($:C@77ь9ткнчюяђѕєђѓяѓёюэюђѓѓЗяюђђѓѓєѓёяьэььщцущщэяёяяђђѕўўѕi48P:$;:4::;рмрхыэђѓѕѓёяёэяђєєѕєјїљєєѓёэяююь§эьыычэяэяюяђђёьйжЌq]b@;T™љўўњћљ§њћћ§ћћћўћўћ§§ўћ§§ћќ§ћў§§ећ§§ћЏѓ—Y]`UZ^ZSTHJQMZP@bАўў§ћњћљћљћљ§њћћўћћ§їћ§§ў§§ћ§ћћй§ћ§ћ§ћўћћўўкœMLY\WWPMQIMNUAH`j„ыўўћљ§њћћёњ§ћў§§ћ§ћ§ћ§§ў§§ўў§§ћћњўћ§ћћу§њўѕƒ88O[\WLJMGAZaaktidЅўўњњћћјњћ§ўћўћ§§ћћ§њ§њ§§§ћўћћуўњ§ћћЮсўЦjcg^TQGQJHIY`]LNH`‡ўў§ћўћћў§ћћ№ўњўћћњ§њўћ§ћўћ§ћћењўњћпЫюэjU\\TNMV[UO@T[UWATIƒўў§ћљћљ§њўћћњўћћјњўћћњћњћћж§ћўћ§ћћЅАЖз|JcVSZVT`j`SMSV[aŽ[QЫўўћљћњ§њ§ћћє§ў§ўћ§ћ§ћ§њћћіњћћ§§ўћ§§ћћцœ”ДхЏeng\]\QSUNOLOPSWVE2nўўєњћљ§њћњ§љћњћћэњљћћ§ћћњ§њћћўњўћ§њћћеzŸt”TZZ^][YVMJQLLZ\`\ZcimxJNUOUSVTSVV:…ўўюњњћДњ§љњјћњћћўћћњћњ§њћћ§ћ§њћcmŒМкѕ’9^c[\][INNLHNVI@2)YШљчўў§њћњ§ћ§ћ§ћћјэрђњ§ћ§§ћћЯўћ§њ§њ§ћћ8L‹–Єг›MbaPBLZGFGMIIJP@-1AZœцў§§њўћћњўњћћѕљёнѓј§њћ§§ћћ§оўћ§§ћtCMIŽЛОW4G>IEIFGMULOLJNWbwZŽўўў§ћћўўњњљ§ћўњћћ§§еў§ўћ§ћ§ћўћ§ћћ’aj$AНсО]UVOFGFPPSP[YWLS]HGpЫўўљљћљњњ§ћћїўћ§§ўћ§§ћћћўњ§ћ§§ћињ§ƒ#BƒЕЁi@[OMGMLVVbb^YIZavbSTАљў§јљњћњњќћ§ћ§§љћњћњћћ§§ќћ§§ћћрФMZz‹‚džЯmWF9I;ELU^^PQEAMUF.+C’ўўяљћљћљћљњљњњўћћњўћћењ§њ§њћњ§ћ§йсЎh‘ИЛЭрТZ>SH1‰яўўїњ§ћўљ§љ§ћћОњ§ћўћћ§§ћ§ћ§ОРЩяўэьуШљўЃbJAJIMIJLTV^a^YYPUZWQ`Ђїўў§ћљћљ§њћћўћўњ§њћћ§ўй§АДВАЎЏЭмэўўяˆSHPNYUOJPVSUPQJQNTPSao‰жўў§љ§ћћ§ўўћћ§аў§ў§ў§ў§ўЕБЕЋ‹”ЎсыїїўШhFG^`Z[FZTVOHOMLMVQJPi}‹Щўў§ћљњњћ§ћмњ§ћўћ§ўў§ўНЖЊЇЈЏУлчщљўўРWBQdWJFmU\NQQшPNJSVb[YCHЈѓўўљ§њњљћњћћ§§Цћ§њћћ§ў§ћ§ЭеИБИТЮйсяё§ўэ‹QdWS@8*A?JIJGLTS]ca`PdЄЈїўўћњћњћћ—§ћўћ§ћўћ§ћћњћЫЯаЮФФучщээљїћбŽUVua<+;JIHAFHPITTGWox”P‹ўўњјњћћњўћ§ћ§ћ§§ў§ўњћљћежнййчучцщмхє§ѕЗ[HWh]G*3OUNIIђJIH@F~aPbqv™уўўњњћњћњћћПњћћ§ћ§ћ§§ўЭЮжцюѕђяэхыэюяўўШ{m„}`<.?OUSPUNJ?-9TSHGSVNeеўўїњњ§њ§њ§њњќ§њњћћ‚ўЭЯЮтёѕєѓцтчщхщїўўЩuppwaP81?NUSM99C@LQPLCFWOrбўўњћћњњћўћўћћњћ§§ћ§ажнрчёђѕёющььщхщјўк‰pnz^Z47IYSH?0EFIPQLJLBLa}ћўўћћњўњўћўћўћ§ўўЪ§кшчщхюэяёсйшьхмурюїБvZq‡Y8C?k‰`<:JPOJ@HEA>W`QыўўћјћњњўўћћПў§§ћўмшюющлжезгЮжхцтелыыѓЫzCEYQI0Pue<.EIG>><>HQ^QAAVЅўў§ћљњћўњњћ§§ћЧжмчючтЧФРЦедЭгЯгжйрњѕыž>EPVIA@x}JCC?;EQ]™ьўў§ћћў§§Оў§§ћ§мудббЩРМОЎДКЪеЦЧжхжЦшјЯ„OOgWH*.BUIBIFPZHACH?+;uv@`єўўљїњљњњўћћЦ§ЯмкЫднйРБАРЫазгЪЗЏЁЃЖДБЗ^WSME2HMMLOJUYTOM>B?2:>>LMOEJ]:<<@2CbY83BŠнўў€€љ§ћ§њ§њћ™˜™žЂЅЂЉБЖЛЯдбадЋ›ЁŸ”жЩйэТoQFHQE5WoZ9SSQ+2EUYW^SM]oxЗєўў§њћћ§њћЁЄЁЂЌЕНЖВДЌМОЦНЭЩВТЦУЩЫЯѓэЫаŠHEL-#0Qmj]\]LINT`Tbd]Z\oЗўўћ§„ћ§ЂЇЅЁЊЕЏВЛЦМДИФЕМНСЯцшМЎНМАгЯВnAdV;),FMdWNHGLP]JLTbUhSF\otQC3CI3\vWC?F?CSPU;ZveQ‚ўў€žћкЦТбутдЭЫЪадБЎЊЪЧМЦЭмчхсузНИлёѓѓхЭД~e:FL3"(Wƒ`4:LMTPWSVnoL]ЂђўўдбжебЮШРВШЯСТУТСЪЩТСФЩШШЮЭпьяђёёѓўњмАgbOQI5-Bj|]@QAJGLLNM5,2UtcLEMFIMU[Y]PW‰НўЧФЧЮОœœŸz”—ЅЋЈРьыцйзжЦШадткЮЕЏНШЦЗООЧЊ‘YHFbP<FemTUUP€ЎQ^ILG\ŠФажЫЭОЌРЊЂЌИРабьюыэѓщФДЧУдпФЗАЊЇЅЇЈ‘ЊЧгЏwkbrP!>^[WVVOVZSdr‹kSeШдЪШСКНАЉЏЖВЗНФсэѓяђюїНЕЗЪйзедЃŸЖУЯУУрёмДŠ{jut[$0[MNOMQHJ[\[LJI<-EEPPNPSOTTbcaЧШЗЉЃЄ•НЩЭШЩЭдмюёїѓїєјєѓчпуйдЯернхжбЦТУРЫсьщЄTHo[J4IFMTWPJMSNZOSббгзУБЧуЫЯЩжзуццрртёщцяьртйлдЫзмнюцчеалцсхдхЭzHTkP5?7HPUUY\[YYUPдЯЮЫОЧШббйжлыюлпсндммпыючпкекншёыыюёсЮЮ“ЪФЧеЮrZQFFG(4QTYYNTLSQGШЯбааеггЧЩкцхштхрпмййьђяшььёяьйхьтхюхЯЦЫеЩСЏЭЩНžocYd<)PZ]SNZNNIHШгЧУФЪЩУТТгшцнмнтчщђяя€˜ьшнрыюэччьёчгЦЗТЧРТСеЮтсЯ…OSqqM)NkJAUQIGFФЫЭбрхнзглцщщцэщяђэяпблрлюэшлмрнчьщшпФУЫрчлкыњїђйOOzmF7HVMMSHI>ККММЧгжзлщюяяэтйнцнркЯЩзцяђёэьючедййгЯбйухмжсюўўпЅ[NU:C1CLNUIPHФРРЪбршыяєэщнмзбкцччы—смтшьыютубджезЫЩкймпчкпщєўўїmAHdN&04.oч§§ѕїњјљљњњ§љ§ћћњћ§§њ§ћњўў§ћћљяїј+,+1,.%1Hzђћ§їњњ§јњљљжјћћјїћљ§јљњў§њ§ўў§ћ§њ§§ћћ(+<>99%@:Lœјћ§њњјјљѓћњ§њ§§њњћјћљћћљ§ћњ§§кјљљњ><>3.@JP[aJtщ§ўљ§ћљљ§љљњ§њћћљњјњјљљњсљўўњ§§ћ§521+-1HGIBOIћ§ў§њјїјњљљќјѕїјјјљћњљљњ§ўўћчњ§љљ@7.2,LPJNNIB:gФ§§їјј§§ћ§љћ§§ђјљљћћњћїљћњ§§њњћњњћњћћњњќ§њћњњћљњљњќћњњћћщњћћ§њћћўћљњњћњћњћњћњћћњњћњ§њћћњћћм§њћњћњћћњћљњћћ§ћћњћћљћњћћўў§ћўћ§њћњћћњёљћћ§ћћњ§ћ§њћћ§њњўћўўюћўћњћњћњћљњњћћ§ћњћћєњћ§§ћљњћњћљњњїљћњћњћћ§њњћќ§њљњњљћњљњ§ћћўљћћтљћњћњћњћ§§ћћњ§ў§§ў§§ћ§ћ§§ўјљћњњћћ§ћ§њћћњ§јљњњљњўљћћ№§ћ§ћ§њћњћњњћћњњћћћ§ћњњ§§њћ§ћ§ћ§§њљњќљњњћћњ§ћ§ћћњњћјњњљњњюћљћћњћ§ў§ћћњњћњћћњњќћњњћћњњћњ§ћ§њњљћњ§ћ§њћћі§ћћњ§ћњљљњњ§ћњћћўљћћќњћљњњ№љћћ§ўўћў§§ћ§ћ§ћ§§їњћњ§ћ§ћ§њњѕ§ћ§ћ§ћ§ћ§§ћћњњћљњњљљўјљљўњћћќ§њњљљјљњћёњћћњњћњћњ§ћћњ§њњћљћњћњњ§ћњ§§§њћљљњљјљљњњћњњљјљњљ§ћћ§ћћ§§ќњљћњњў§њњљљјњљћњ§§ќћ§њћћњјљњњљљњњћћяњ§ћ§ћ§ћ§ћњ§њћњћњћћэњћњћњћњљњћљњћ§ћ§ћ§ћћњєћњћ§§њћљљњћњњќјњњљљњјћњћњљњљћћ§њљњњћњўћ§§ћњњљњњћљљњќљњњћћњѕљњљћњћћ§ћ§њњљњћўњћћњљћ§ћњњћњњћя§њћњћњћњњљњљћњћњћћњћћњћљћћљњћћ§њ§ћћњіљњњћњћњћ§ћћњњћњћњћћњљњљљњћћ§њ§њњћ§чћ§њњћ§ћњћњ§ћ§ћћњ§ћ§ћњћљљњњў§ћћќ§ћ§ћћњѕћ§ћћњћћ§љљћћнњљљњњћћњћњњћњњћћњћњ§ћ§њћњћ§ћњћњћћ§ћћњ§ћњћ§§ћњњћўњћћ§љњћћњ ћы§ћ§§ћњњћћњњћњ§ћ§њћ§§ћћѕњљћњ§ћњњћњћћ§ћ§ўћ§§ћѓ§њ§ћћњ§ћћљњјљљљњјјљњњћћўњћћњтћў§ў§§ћ§ћ§ћ§ћўњњћћ§ћћљњљљјјљјљљќњћћњњќћњћњњћ§§ћ§§іћ§њћћ§§ћњћћњ§ћ§ћћњњћђ§ћћ§§ћ§њћћ§њ§њњ§ћ§ћћљ§њћњћњћћњњћњћњћћњљћћ§ћ§§іћ§ћћњћ§§њћћѕњ§ћњћћ§ћ§ћўўћћ§ћ§њњјљјљњњћ§ћћўљњњћљћ§§ћћ§ћїњ§ћ§ћ§ћ§ћћќњљћњњэјљљњњљњњћњћњћћ§ћ§§ўўўћ§§їћ§ћ§ћ§ўўњњ§ћњћћњћшљњљћћљњћњ§§ћњњљћћ§ћ§ћў§ўўўћ§§§ћњћћьњћњ§ћ§ћ§ћ§њћ§ћњћћ§ћ§§њћ§ћ§ћ§§ћј§њћ§ћ§ћўўњ§ў§ў§ўўу§ў§ў§ў§ў§ў§ў§ўћ§ћћњ§ћ§њ§§њњ§ћћќ§ћћњњћ§§ћ§§єћ§ў§ћ§њћћ§§ўў§ќћў§ўўюћ§ћћњ§њљѕђѓїљћћ§§ўў§єћ§њћњ§њћљњћ§§ў§ўє§ў§ўћњјєјљњћћ§§њћњњњћ§ћ§њ§§№ћўћ§ћћњ§ћ§ћў§ўў§§ћњ§ћћњњљљњљњњ§ћћо§ћ§ћ§ћ§ћ§ћ§њћњ§ћ§ћ§ћ§§ћњ§ћ§њљћћ§њћћўњћћ§ћў§ћћњ§ћћњљњњћћ§ћ§§ћћњѕћњ§ћ§ћ§ћ§ћ§§Эћ§§ў§§ћ§ћ§ћ§ћўћ§ћ§њ§§ў§ўћ§ћљњћњњ§ћњћ§§ў§§ћњњ§ћ§ћ§ћўўјћў§ў§ў§ўўўћ§§ўљ§ћњћћњћћќ§њћњњћњћћњћњћћўњ§§ќћ§§ўўўћўўњћћњћћ§§§ћ§ћћьњћћ§§ћљњњ§ћ§§ўў§њћњ§§ћћў§ў§§љћўћњћњ§§ћєњћћњљћћ§ћ§ћ§§ёћњћ§§ў§ћ§ўў§ў§ўўєћўћ§њљњњћњњћћўњћћ§њ§ћћў§ћћ§§ћњњћ§ў§ў§ўћњњў§ћћј§ћњћњћњљљњћ§ўћ§§ћћ§ћў§§іћњћ§§ћ§љљњњућњ§ћњћњћ§њ§§ћ§§ћ§ћўњћћ§њћњ§ћ§§§ћ§ћћў§љћњљњћљћћќ§ћў§§ћщ§ћ§§ћћ§§ў§§њћћ§ў§§ћћў§ўўєћ§ћ§њњћњћћњћћх§ћћ§§ћ§њ§ћћњњћ§ћ§ћћњ§§ўћўў§§ѕћўћ§ћ§§ўљљћћюњљјљњњћћ§§њћћњћјјљљшњћћ§§ў§§ћ§ћ§§ћћњ§ћћ§ћћјљљњњљјљњћћќњљњћћ§њћњњњљњљћћњњћћ§§ћ§§љњћњћўљњњћўљћћ§ў§§ћ§§ђњћњћњћњњљћћ§ў§§ўћ§§їћ§§ћћњўўњњђљњћ§ћ§ћ§ћћњћћ§§њћњћ§ў§§њљњмћњћњћ§§ћњћљ§ў§њљњ§ћ§ћћњњљњњљњљњњћћњћћ§њћњњ§љњћћ§њћў§§Ёўўљ§њљћћњўљњњјћњљњњћњћћў§ћћэ§ћ§ћ§ћ§ћ§ћ§ћ§FŠюўўљљ§њљњњўљњњћіљњ§ћ§ўў§§ћћ§ўћ§§ѕњћњћњ§5Aoкўўўљњњѕћњњћњћњћўњћћѕњћћњћћ§ћћ§ћћн§ћ§§ў,;^iЏўўњјљњћњњљћ§ћ§§ћћ§ћњњћљњћћы§ћњњћћњ§ћ§ћ§ўў:g[5AЖўўћјћљњљљјњ§ћњћњњћћх§ћ§ћ§њњљњћ§ћ§ћ§ћћљћL9,)-AЅўўўљјјљђњљћћ§§ћњћњ§ћ§ћћњўћ§§ўђ§ћћњњ+.3-SaGЄўўњљњћћњњ§ћћў§ћћўє§ўў§ћ§ў§ћњњ§§э0+2#1?55oэўўњњљњћћ§§іў§њћљћ§§ћ§§іћ§§ўў§њћњћћ№њ30248*1-Ezјўўћљљ§њљћћю§њћњћњћћ§ћ§§ћ§ћ§ўћћя§ћ§њњ-5>A?:,:9OЁўўљњї§ћћњ§ћ§ћ§§јњ§њћњћњћћ§тћ§§ћћ§7>8:>AQW\hNpяўўћ§њћћ§ћћ§§јћњћљњљњћћљъћўў§ћ§њ§92.22;CEC@OE„ўўўљњњўљћћњєљњњ§ћћ§ћћ§ћўў§ћњ>8870LLэPOOGMYH  0@9;A>B@H5 .GkŽ˜ОаЫпьу§§љћ§ќњћћјјћаљјћ§§ђ|?MJ,130.:417<:,0.(89+"Qt?:W[љћћћљњњў§§ћ§јљѕѕєЭћљЩ^()-,>?L*%*)%%OP;:0453,*%01A07@IW]9[Mћљ§љћљ§њљљЩњ§њћјћјњљњњў§§ы™OIWBA934$!*)7?B%,!%$&:cJ.9;9:EJYG#AGў§§ќћјљ§§Пјћћјїјњњљљїљјљ§ў§а[<@@BE>8)%&%+%*)&,%1AOA721-)2) 23ћћјїљїњљјјїїЬњјјњїјљїјїїѕњћљгp48EC@@514)!@LP5,+7zS<12--5.$().§§ўћњњЧјњњјћ§љјїљњљїѕљњћчŸin?GA5>GLP^P387$?8,083.3&-0ћћ§љћћћјїјњљљіћјљћћњњћћјјЯњўњ§їИ`9HdO4ISFCAјћ§§љћљћљљ§§јћљљњ§љјњњжїљїїјѕ§ўюЕm\CMhOCACA;>PoE,,5<> %$ -P§ўўќ§јћ§§ћњ§§њ§§Эљћјњњћћјњїњњїњ§јк„]V[L@8?A997279799L".+% ћ§§њћћУљєљћљљћњћјљћјљљ§§ћјјїїљїћў§ћЂNO<.1TI?4<:C>18<:4.*1?2@-§ћ§њ§§љњљљјљљњњј§њљћћгњїїѕєєѕѕѓђєї§§цЗoYNT`MF@C<њ§§љњ§§љљћ§§љкћњјѓїїєњњјѕѕјњўѓсщћ§§єЖ‚QCHM[k]B*379ћљљыћљћњ§§љћћ§њњ§љ§љњћ§§ўў§ћнљћћљљјћљјїјѓђѓѕљ§§ћїрхИ–•‘ˆ~Z]`њњљњњљћ§§ћћњўўњћ§§ћћ§§ћљўјљљїѓјњљћљњњїєѕєєѕѕѓїљћ§§ћљјїычФ§§ћњћљњ§§ѓњћјљјјљљњ§њ§ћћїњ§§ћћњљљјјўљћћ§јїјјћњљїїѕѕщїљѕѕњўћ§§љљћњћ§њўў§њјћ§§ўњ§§іљћћљћљћљћ§§ёћў§ѕїљїљїјїњљљїїўљњњљїћѓїњљ§§эћјњћ§ћћњљћћљњ§ўў§ћњњћтљћћљћљ§§љћћњїљјєћћїњїљѕѕєїњјњїїтљїєљћћњњўў§ћљљњјњћћњјјљћјїїљљїїјўїѕѕёљїїљїњјљїїјјљљњњхјњјјћћњљѕћћ§њ§ћљћљљћћљљњјњјјњјіњљјјњћљћћњњћјњїљѕѕїљљјўѕїїјњљ§јљјјћ§§њ§§цњўў§§љћљљћљњ§§љћљ§ћћљљћћљ§§ъљњљјјєєјљљјјљїљїїњјљјћћђњ§§ћћљћ§§љљ§њ§§ћљљћљћ§њњћћќњїїњњєјњјјїїјњїїњћћњњјљћћј§§љяњљћљћњїњјћњњћљ§§ўў§њ§ћњїї№њјњћћњїљљѕїјћћјћћњїјјњїїѕ§јњњўљўўўњ§§ањ§љћћ§§љћћљљњ§ћћњ§§љїїјљјњљћћјњјњљћњїїљњјњћ§§љћўў§§њ§§ўљ§њ§§љјљљўњћћ§ђљћћњћћљљњјјњњ§§юњїљњјѕїјњјњљћћљћј§§ў§ў§ѕњ§§јњљѕљљћ§§§ћ§ћћљћљњўјњњїўњћћњњљњњљљ§§ћъњ§ўўћ§§њ§§ћћњњћљћ§љћћ§§ћцїјјњњјњјљћ§ћћљњњјћјњћћљљњїї№ћљњјњљљњ§љ§њ§§њ§§ђљјћ§љћћљћћљћњћћ§ћћјћљљћћњјшњљћљјњњћњћљљњїљћ§§ћњњћћљљћўњљљїљќїњјїїљљћњїїјњњќїјјћћт§љљњїїјјљћњјјљљћћљљћљљјјћћњћљ§§ћјїїјћћїјїљїљјњјљљјћјјњјїћљљћ№њ§§љњњћ§§љћјћ§§ўўі§љћћљћ§§њ§§ўў§ћћўј§§љњћћ§§њ§§§јљњњљ№ћљ§ћћјљїїњїјјћљћћ§њ§ўўћўўпћў§љћљљћ§§њњљ§њњ§§љњћў§љћљљњћћјћњњћїєѕїњњј§ћљ§§єњ§§њњўћњњћћ§§ћяљњјњћљјїјњљњњјњјїїјјїћћњњїћћјїѕјћљћћљј§§њ§ў§ћї§љћћљћ§њ§§љљћњљњјљљќћљћ§§§љјњњўћ§§ьњћњњ§ћћ§§ўћ§§ћћјљј§ўўќћ§§ўўўћ§§ѓљњњјћ§§њ§§њљ§§ћєљћјјћћњ§ћћљ§§ћњћћњ§§јћњ§§ћњћ§§ќљ§њ§§іћљћћјњњјјћћњћєљњїњћ§ћљћћљћћ§љњ§§ќњљјћћжљїћњљљњў§ћњјњћњ§ћћњ§§ћјјїїљљњћњјјљћјїїѕјљ§§§њћ§§эћ§њ§њ§љћњњјњјћ§ћћљ§§ћњћљћ§§ћїјњїїњїњјњњјўњјјїёјїїњљјћ§ўўњљћјљљќћљћјјфћ§§ћњњјјћћљћћјљњјћћњјњїјјїјћћќњљљћћ§љћјјњїјћљњ§§Рљњїїјљ§§љћј§ћћјїѕљћћљњћћјњјљњљљњјјљћњ§љљњјћјјљљ§њњ§њљљћћ§§ћњљ§ў§§рњўў§њ§љћћ§ћћњћїјњљћјћ§ћљљћћјљћћ§§ћјќљћљћћћљњњљћћѕњїјў§§њњћћ§§ћјћљћ§љћћј§љњ§ўћњљћћіјњ§§ћјјћћљљїѕћјњћ§ћћў§ўў§њіўћў§њ§њўў§§ћіљ§њ§§њћћљћћћјћћњ§§њћјљјћљљћјњђћўў§§ћљїљћћљњ§§љћў§љћћ§§ћ№њјјћљћљљћ§љљћћљћћўљћћљјћ§§ћћњњ§шљјњљњ§љјѕїїљјћњ§ћљ§њ§њњ§§ќўњљ§§ў§ћќ§њ§љљћшљћљњљљјћ§§њјћћљјјњјћћљј§§ќљћћљљїћљћ§ћ§њ§ўўќњўў§§ћє§њўў§§њ§§њ§ўў§§љјњњ§љњћћљљћ§§ўў§§ћњћћљћћѕњ§ўўњћ§§ўўћћєјљ§љћћјћћљ§ћћљъћљљћћњњїљї§§њћљ§ўў§њ§љљї§ўўњњљ§њ§§ћ§ћћљ§њ§§ўт§ћјћљњ§ћћњїјћ§ўў§љњ§љћ§њњў§њ§ўў§ћў§§ўюћўў§ћљњ§§љјћћ§§ћ§ўўўћ§§јњљјњјјњ§§ћўњћћ§ћў§ўўјњљњ§ћ§њўўўћ§§ѕўњћљјњ§§ћћ§§№ўћ§§њ§љјјћ§њ§ћљћћўњјј§њїњњљў§ўўњ§єњїњћњ§§њ§ћљћћњљ§ћљћњ§ћћќљћњ§§ўќћњјћћљўњјјшїљњ§њ§њњћљћњљ§§ћљљј§ў§ћ§§ѕћљћ§љ§њљћљћћ§эћјјљ§§љїњњћљњњћљћљ§§іћўўћњњ§§њ§§ўљ§§њњљјћ§ўўўљўў§ћїњњћ§§ьў§§њљњњ§§ћљњ§ћњјљјњјјљљўћ§§ћўўўћўўтњћћ§§ћјљћ§§ћњ§љ§§ћљ§§љјћћ§љњњўўшњ§њћљљ§љћћњњљўў§ў§њљћ§§ўў§ќњ§§ўў§љ§їћљ§ўў§ћћљљї§ћўў§њћћ§§юњ§љљјїїѕўўћўњљњјњјјћњљњљ§§§ў§љљї§ћ§ўў§§ћљљяћљљ§§ћљљћјјњљјљљ§§хў§§ћїљћў§§ћ§§љњњ§ћ§§њ§§ў§§ћћ§ыћњјћ§§ў§§ўўњ§§њ§љћћљјјїўјћћяјњјљ§ћћљњћћњћњњљўўщћ§њ§§њ§ў§ћћљѕњљњ§ў§§њћўўў§љљќјћћ§§іњ§§ћљњјјњћћљћ§ўўћўўў§ўў§ў§ўї§њ§њ§ћјљ§§ћћ§љћ§§ћвљ§ћјћћњћћ§§ћљћўўћўњ§ўўћњјјљљј§ћўћњћјїљћњ§ўў§њ§§ќљћ§ўў§ў§љ§ћћљњљћљњљњћњћњњў§њњПљћњћњћћўўбnB5.CI\<- 98;809?AP80Lh—ЅЮпдшєѓ§ћ§ћћњћћ§ћ§њћњњћћњћњўўЭђ~AGOG9?JI915)!%";7527>?9.1)8A933^}IH^bћњћњњћ§§ўћћў§њњЧјљјјїїўўЩ^*-5-@GJ.-1,+) &OQ:314<:5017;;?;FNdgFbVћћ§ћњћћ§ћћ§ћк§љјљљ§ўўы›ƒTMYAAC>5300.7B@;,,(-!;^E5:;;рEMZI1GAўћ§ћћњћћ§ћ§њћњћњљљјјљјњћўўаб\7;E?<<75#%$022)02-1,AL@%10,2.:4"4<ћњњљјљњћ§њљљњЮјљїљљјљўўкr;>CA@M:510#):MH7539}U>*9833.&.,(.3§ћ§њљљќњљњћћањљјљјљљћўўхЁenC"B>08LLW\TF8750--*73(,7ћњћћњќћњљћћњћћњњљњњЦ§ўўјКd5HkH9FQFAB<;@@>"))+98+$,),02-8Eњњ§ћўњћњћћ§ћ§њћћ§ћћњљљЮјљљњјўўьКq^FLoTHBE@CA?<<>EN1.&-12.",њћћ§њњћўњћћљ§њњћњ§ћћў§њњљ§јљўўыљЃHTC45ZPE@?>?AA827<3*)O‹N&§ћћњћњћћ§љњљљњњ№ћљјњњћћљјљљјњљћљљјуї§ўчbG7G@EJ[I-()095FMPQLBA@7§ћ§ћ§ћ§ћ§ћ§ћ§ћ§ћ§§ћў§ћћїњљњњљљћљњњјљњљ§ѕучўўяяР…TFIOapaA182Eњћћуњћћ§§ћћњњћ§§ћў§ћљњ§ћў§ў§§ћћњћћёњћћ§њћњљїѕєѕјћўў№єцчНœœŒ~^bc§§ћљљћы§њћ§ў§ў§ўў§ћћњ§ћ§ћњњћћўњјјљњћљјљљјњјћ§ўў§хљєэщЪ§ћ§§ћћ§ћ§ћ§ћ§§њћћњњћћ§§њї§ћ§њњљћћњњћњўћњњјјљљњљњљјјў§ўўћіњ§њћ§§ўћ§ћћѕ§ћ§ћ§ћ§ћћњћћўњћћ§ўў§§№љјљјљњћљјјљљћљјљљјљтњљ§ўћ§ћњњљњ§њњ§ћњћћ§ћўў§њњљљњћћјњћњћћ§ћњњћљјњћњњљјљўњљљљјљћћњњ§§ўўћћќљњљњњјћњњљљјјљљњљјљяјљљњјљљїїјјњљљњљњњљћљјјњњ§§ќњћњћћћњћћљњњёљњљњњљћњњљњћњћљљўћњњўљјјўљјјїўјљљњјљјј§ћ§ћњњћ§іћ§§ў§§ћћњћћќ§ћ§ћћ§§њћћўњћћї§ћ§ћ§ћњјїїјњќјљјљљёњћњћњћ§§ћњњћњ§ћћ§§ћ§њњћёњћњћ§§ћњћњћљћњљљњљўњљљ№ћњћљњњћњћњ§ћ§ћ§ћћы§ћњћњљћљњњ§§њћ§ћў§ўћ§§ўњљљњ№ћљљјјњљњћњ§њћњњљљњљќјћћ§§ўў§ўў№§ў§§ћ§§ћћњњ§ћћњћћ§њ§ћљцїјњљћћњњљњљћњњљљјљњљњ§ћћњўўљћ§ћ§ћў§§ћћљћњћњњЦ§ћ§ћћњћ§њњћћљњњљљћ§ћ§љљјљњјљњљњљћњћћњњ§ћ§§ўў§ћў§ў§ћћ§ћ§§љјјіћњ§ћ§ћ§њ§њњћћњћњћћўњћћљњ§љњљљњэћњњљљјљљћћ§ћ§ћњњ§ћўўѕћ§§ћћњњљљњћћцњћћ§ћћњћњћњњљљњљњћњ§њњћњљњњњљћњћћљљѕњћљњљћћ§§ћ§§ућ§ћ§ћ§ћ§њ§ћћњћњњћњљњњћњћћ§њћњњћњўљњњіљћњћњљљћљћћўљћћљ§њљљћњћћњўљјјљјљќњљљћћљўњљљњ§ћњћћѕњљљњњћћљњњћћўњћћцњ§њњљњћ§ћ§њљљњњћњњљјљјњљњћћњћљњћњћћѓњћ§§ћћљљњ§ћћњњѓ§ћў§ўћћњћћњћ§§ѕћ§ўўћћњћњ§ћћћ§њћћ§§ђћ§ћ§ћњљљћћњўћњњўјљљњћњћћњ§ћ§§јћ§ћ§ћў§ўўю§ў§ў§§ћњћћњ§ћ§§ћћ§§ъћў§ўў§ћњћћљњњ§њњљњљљјљљњфћ§ћћ§§ћ§§ўў§§њњ§ћ§њћњћљњљћћњњјљјљљњљњљљѓњћњћљљњћњћњћњњћњљћњ§ћ§ћ§§№ћ§ћ§ћўў§ћ§ћ§ћћњћћюњћћњћ§ћ§ћ§ћћњњјљњћћїњћњ§ћ§ћњљљћч§ћ§ћ§њў§§њњћ§ўўћ§њћњћћ§§ўўќћ§§ўўш§ўћ§ћ§ћљљ§њ§ћ§ћ§§ўћ§ћћњћћњнћ§§њњћ§ћ§§ћњ§ћ§ћ§ћ§ћћ§§ћњљњћ§ћ§ћ§ћ§§їћ§ћ§ћ§њћњњљњїћњњљћњћћљљыњ§њћњћћњњћњћ§§ћ§ћ§§ћњњћнњ§ћћ§ўћћљњљћ§§њћ§§ћћњњљљјјљћљњњћњњљљіњћ§ћ§§ћћ§ћћя§ћ§ћћњљљњљњњ§њћћ§§їњћњћ§ћ§ћњњјљћљљњљњљљњюћљћњћњљћ§њ§§ў§ћњ§ћћ§њћњњћћ§њњљњњ§ћњћћѓљ§њћљњљљњњћ§њњўљћћћњћњћњњѓљњњћ§§ћ§ћ§ћћљљїњћ§ћћњ§ћњњщљјјћњћљћњњљњћњјјљњњћњ§ћћўљњњћ§ћњы§ћњљћћўћ§ћ§ћ§§ўћ§ћћњћћіњљњћњљћњњћћњћњњћћ§ћњњэћњћњћњћ§§ћњњћљљњўћ§§їњћћ§ћ§ћ§ћћњцћњ§ћћњћњ§ћ§ћ§ћўў§ћњњћћ§ћ§њњћїњљљњњљњ§њњ§ћў§§ћ§§ўђћ§ћ§ўўћ§ћ§њћћ§§љћ§њњћћњњѕ§ћ§ћ§ћћ§ћњћћёњћњћњњљњњў§§ћњћћыњћ§§ћ§ћ§ўўћћњћћ§ћ§ћ§њњўљњњ§ћњћћїњћњћњћњћњњ§§ћњњљь§ћ§ћћњљћ§ћћњњљљјњњ§ћћ§юћ§ћў§ћћ§ћ§§ўћ§њћњ§§ћтњћњћљјјњњ§ћњњћњћњњљњњћћ§ћ§ћћњћћўњћћњ§ћў§ў§§ѓўћ§ћћњњћ§ўўћ§§фћ§ћў§ўћ§ћњљњљњљ§ћ§њњћћњ§ћ§ћ§§љћ§§ћњћњњ§ўћћ§§ўњњъ§ћ§ћћњ§њћћ§њћњћћњћћњћљљђјљ§ћ§њћћў§ћ§§ћћў§§ўћ§§іћ§њњћ§њћћ§§љћ§ћўўћњњэћ§§њћљљњћ§ўў§ў§ћћњ§§§ћ§ўў§ќћ§§ўў§мњћ§§ћћњћњћћњћў§ўў§ћ§ћ§ћњљњћ§ћ§ћ§њћљњњ§ћ§њњ§нў§§ћ§ћњћ§§ў§ўў§ћћў§њћћ§ћ§њњћ§ћ§ўўћ§§ўћњњњћ§ћњћњњљљ§ћњљћљљјў§ўў§ѕћ§љњљћ§§ћ§ћћњ§іњћњ§ћњњћњћћ§§ћ§ўўјњљњњћњњћћњћљјљћ§§љњћњ§ћ§ћћ§шњ§ћ§ћ§њћњ§ў§§ћњћњћњ§ћ§ћњњ§ћ§ћћљћљћѕ§ћ§њў§ў§§ћ§§ћу§ћ§ћ§ћ§ћ§ћ§њ§§ў§ў§ў§§ћћљљњ§ћ§§ќћ§ћ§§єћњћ§ћњљњћњљњњњћўў§ћў ў§њћћ§њ§ћћю§њ§ћўћ§њћћ§ћ§њћћў§§ўћ§ћ§њћћ№њћљњћў§§ў§§ћњ§ћўўќ§ўћ§§ўћўўё§ћўў§ћ§њћћў§§њћћђў§ўћ§њћћ§ћ§ћ§ћћўњљљіў§ўў§ћљњљњњіљћ§ў§ћ§ћўћћќў§§ћћћњћћ§ћћњќљјњћћ§юћњњћњўћ§њ§ћћ§§ћњћ§§тћўћћњћњ§ћћљњњ§ћўћ§§ў§§ћ§ћћњњћњњљ§њћњњщћњњљњћ§њћћ§њњљњ§§ўў§ўў§§юћ§ћўћњњјљљћ§ћўћ§§ўў§ћњњћњ§ћ§§ћљљњњљћњћћњњћњ§ћўўљ§ў§ў§ў§§ўіћ§§ўћ§ћ§§ўў§њяћ§ћ§њ§ћњћ§ћ§њњћ§њњїћљњњ§ћњћўў§ўќ§ћ§ћћў§ўўі§њњљћњ§ћў§§сћ§ћћњ§§ў§§ћў§§ћ§ћ§ћћў§ћ§њњћ§ћњћѓћў§§ћ§§ћ§ў§ўћћћ§ћ§ћўўЩк‚NMHgnwN+&F&-$27(>#A[JIQOSUbG"B]|ŸЌдсйёљљ§ў§§ћ§ћў§ў§§ћћћўћ§§ўўдŽSbe\OOhiNMUB441.5LHeŠOTjn§§ћ§§ў§Эћњ§љћјњўўзo9?>AOYbM?JG@?,9]eQMEBJVBBIGOGTJYazqOraћ§§ўёћў§ў§ўћўћ§ћ§ћћўўЪљЅœeeoV[WQLHI9FG]]P<9GJ7NuZCNLJOSWmV;Q`U5<;BAAіE&&?Iћ§ћ§њњ§ўўњњѓўћћњўћ§њћњ§љўўзц‚IS[aZSLHEI<A1+;CGћ§ў§ћў§ћћўў§§ўў§§їўњ§§ўћћњўўйФtEVwYJWe`\YVMS[Q@ALLG?3>9;05>8Ai§ўў§ќў§ў§§іў§ўћ§§ћњ§ћћќњћћўўшь˜netjY]YTHYV[SSQOTmG7@JQN@228GJNM@FIBNG;,(&AQPH^WHCPCPF?WM92)*$7;-4+,7OIE7;:87-(-8>L>E5Cqg`N0>po288IG3:B>LPY>LO%*N\W^P!5-301?C($).123*$:2&&#*F9)P4&028<04*&820BG8??5;NLdowS7:HP;07*?.1-03-,&$#)73,&%+%"(0,#,)2<.29704275?GE<>39?;1917921,$)-$#02&!+;033&-!#-+1934*37<\ggM0*#-)%"1*354>:28203+%,*5<&N8)*+,#%%!($$+&%":2!&-+%")0*+0,,.)1,*8:+7&-! *5-*+.30,*(#!+%!$$$Я0:G"$(2,30!""2++&,(+381.",+*7)*SA.),)9SSO?@50++€g-(&21($"03#!!(!0*"+*"#3.$!$"(!*L8IPmH081184(-.*$((3154!+WG #%*#(0)()4*%+$15HCW]‚„i.?B5+&**&23@15U<+*"$,&"*GmY>41 #(@GE:5J>B(,BMPMOSNI2(..-7,!15B7887>A2;??>:;0""0JZhT;3O@EJ(-@EJC4*2JLWgHCWA7;<>9,.803..!-(7::HA8(LWHBAJEC+@LLSpriq‹ŒЉЦѕС~„”‡‹omoZLIOZ{vFL:.7AL3!%8470915*9?CIBJI]`YULTF?Jbq~™ЇЪь§§љїœСћ§ў§§ЙєЭЩВЉЏ–Ѓ›}‰„]AH87;F<9k„ŽŽ|omr‘z}ЉЄpuЕЭдљћћ§ћїєѕїїјњ§эёћѕѓђђёєљћљ§§ћ§§єћљћпхлцхтхѓ§§ћ§ўљ§§ьћў§ћ§ўјјљљјјљћћ§ћјїљљѕ§єѕїїѕѕљјєђяѓѓєјљљујљњњїїљњјјїїљїїљјђѕїїњњїїѕљњјјѓњїѕњљєѕєѕѕљљњњ§јїѕѕќјљјѕѕїіјєѕјїљљѕєѕѕ§јљњњчћњњјљјћњљєѕњјњљѕѕїњѕєѕѕјѕѕїћјѕѓєѕѕўјѕѕіїњћјїїѕїѕїїєїјљњњјњњїјјўљїїњѕјѕѕљњњђјњњјњњїљїјјѕїљљњєјњњїјјїїјњљѕѕњјљљїјњњтјљљјєєѕјѕѕїїљїњјћљљћљјњњљїѕїјњњвјњљњјљњћћљћњјњјљѕєєѕљљњљѕєѕѕљїјїљѕїѕѕїѕљљїњјјћћїсљћћљѕјѕѓєєјїїљјћ§јјїљїѕјњњјїљљјјњўјїїіљїљљјњњїѕїїўјњњєљћћ§ћўў§њњјљљћїњњјњњћљѕєєѕѕљїјњљљ§ћћў§ћћљљњљљјњћјјњўјњњрјњјћћ§ћћљћћїјїѕѕїјјњјњїѕјљјїљљїћћєњїїјњћћљљћљњњќјњћјј§ћљћћѓјњћ§љћњљљїјћњњѕљїљњјјњјњјњњяјљїјјљїљјѕљњјјњїњњѓљћјјњјјѕѓјјњћћ§ћўљћћљщ§ўћњїњњљѕјјљјњјњљљњјњјњњяїѕѕєѓѕњњћ§§ћћњ§љћћ§§њ§§єљћћњ§§ћћњјјљљі§јїїљїїјњїїѕљњјћљћјњљїљљњ§јїјјќњћљњњїїљїљјњњћ§§§њћљљђћ§§ћљјјњњћћ§§ћћљўћњњќјњњћћќљњјњњјўљћћ§ўљћћ§ўћњїїњћљћјљјњњјўљїїјњ§јљ§§ўњ§§ќњ§ў§§ћњ§ўў§§ўњўўј§њ§јљ§ћњњљјћћјљћњњњѕјњћћјјљыїљњїєѕїїњћњљ§њњ§§њћј§§ў§ћјјїїѕњјјћ ћњућњњїїњњћљћњїѕїњћ§њћњљјњћјњјљ§§ќњјљћћїњћ§їїѕїљјјєљѕјљћљћјїїњјјєљјїѕѓѓїјјћљћћіњћљјњћљћљћћўљћћ№њєјїїјћћљћјјћњњїїјјњљљћјјћћњјћћјјїїѕјњњћљњ§§ћљјјѓњјјћјћњњљљћћљљњ§ёљћљљћћјїћћљћћљ§§юћјјћћјљјїјјћћљљєћљљўћњњ§ѓњ§њњ§§ўћ§§њћ§§сњ§§ўљјїњњјљћњћјїњїљїјјїњњјјњњїјјћљћљћљљ§јљћћ§њћљћ§њ§§ўўћўўћћўўћ§§ћљьћљћњјюѕїјјљћљћјћ§§јћћћњљљћ§§їљћњїїњїјљљ§јњћћћјїћ§ўў§ўѕћљћћљљћјљћ§§ћўљћћїљћћљљјћћњњјяѕјјњњћњћњ§§ћ§њћћјјљњјљћ§§њњўў§§чћљњњјћљљјћћјћљљћћљњљћћњљѕѕўљјјќїњјњњєјљјјћћјћљњњћћќљњњљљѕ§њљљњћћјјљћћјћљћљ§њњюїѕѕјћљћјјїњљљћћ§ћјјгњљјћљљћћљћћљћљјјњњјњјљћћљћљњјљћњјјћћњњ§љљјљїћћюњїњјњћ§ћћјјїњљљћ§ћћјѓњћњћћњјјњљћљћћњћўљћћ§љјњўјњњѕћ§ћ§ћљ§§љљћћњљћљљћ§§ћљфћљ§§ћўљјћћљљћћљљћљћјњјћћљјјњњќћїњћћ§ћњ§§њ§§ќњ§§њњї§њљћљњ§ћўўњћњ§ћћ§§ћыњјњњїћћљћћљћљљћљњљћћјјќїјјћћћњјћљћћљљћљћ§љћћћљћћњ§§ћ§ѕјњњєїёѕјјљѕѕїѕїљљћћњњјњњћ§ћїљћћљњјњњћћђљћљїљїјњњћћљњјјѕњћљїыїћљљјћћјќћљћљљќћљљћћљћ§ћјљћљћљљћњњ№ћјјћ§§ћћњњљјњћћљљћћјњјљљљњјїїјїјјћћљћњћљљљјїњјњљ§§ђћ§§ўў§§ћјћћњљ§§ђћјњњјёїїѕїјљћ§§ђњ§§љјћћјњїњјћ§§љћўљћћђљњ§њ§њ§ў§ћ§њћ§§њћљћ§ћ§§ћ№њјњјјїѕѓєјљјљјјћћќ§ћљћћ§ўњљљћ§љњ§§ћјљћћ§чїјћјћјїњњјњњїїјѕљњњљјѕњјњњўјљљјњћїћћљћ§§ўњ§§їў§ћљљћћљћћШљћ§њњ§ћљјљ§ў§њљјћљїѕѕњњјїїѕїјњњјјњјњјљ§§љљћћњњ§њ§ћљјћњ§ўўоњ§њўўћ§њўљћћјљїњћљљћљћ§§ћїћ§љ§ћјјћћљћќїћљ§§ўњўў§ѕљў§њћљљ§ўў§§щњћћљњїїєєѓѕјћ§њћјњљљћњ§§єћљћћњјјћ§ўўњњќљћљјјћќ§њ§ћћ§ёљ§ћўў§јјїѕєєњњћћљ§§њ§§ћ§јњ§ћњјњїћћћљњњљћћяљћћ§§њўўњћљћљњ§њћћђњїјјїїјїјћљћњ§§ћ§ќњ§§ћћѕ§јњјїѕїјћћљљќћњњћћдњ§ћўў§§љћ§њ§ћћљ§њћњѕјћћљћ§§љљћјјљљњњћњ§ћљњљ§§ћ§§љћ§§ўњ§§ќњ§њўў§ѕњљњ§ћћљњїј§§ћјјћљљћїњћћњћјїњњћћљ§ћћўўћўў§ќљћћ§§љ§љћ§§ўўњјјќњјјїїўјћћєљћїїјљћћјљїјјќїѕїјјвњјњћљ§њ§њњљ§§ўў§ћћљљ§§њўўћјєюѓєјјњјњјјљњјїјљћ§§ћўјњњјќњћјњњћ§ўњ§§ўњ§§њћњ§§ћўўє§љїєѕљњњјљјњњ§љћљљў§ўў§§њћћ§љћ§§ќњ§њ§§ѕњ§ћњћћљ§ўћўўўћўў§€FўёчтзРЏзыюцшщђђюьшчщыыђщщттхэьыяэђєёѓяѓћэцѕєѕїљюпЧВu^eTMQdbBLWPIœЉА™mŒЮшяёѓїўўѓухтцюѓєїшзпяўўутўўћчтѓўѕушѕнЗ™‚jb`hH29E>JMMJIONMCZ[YO+4agZSp|—ВСД—ˆДУаЕŸpŠŽonŒ•‘™•}xƒhh^\LCOO?GqTNLSPC?785.9@BJJ14…‘…m9#C+:?A4:@HFIJB>CHBG53!-(4?b[478;@CFEEGLEEQSJLFC?M[dMMW,1TgWeM$3808@EC5003--14#:94923(+2U@#7Q9-9@>;@:7838CJFBA>??GQnxwV49MP@8C*;>38:9451B2,1&2;39:.-;:289>A9-0%##&-34.99:;?:254-,#,8:@FEMH>;4>GE;>>870,+$*)*-57?>),+445<:2:<3.,**,+2.8?BBA;117.23-2779;B9>?@AG<05252&1710217>>775+39433,**(*24142+148><<8+2,+%,334-2038[teL4+--44++0+302;;441344Œ-+224%$0P?3+$11-,73*(&%(""%##%,1 &E: 01,&%*(*0023-)-*,,+15$(0&  )A5+0.-:988.0(,.(%!"!))*&0.-NQ;0*3E`UUJ@5((+472.*-&*.2+#"%&$+%##)&)()0,2,()*#+)#.70N@JQtC.278?9:812,,04;2755)%%%:\F%!)+-1700..(%&+5:CA]WƒŒr2%:A<5750.&7H-.Q@,1(&")&&(4Op\:F?AA-:524;7.,1?.0G>?9?<<9,@FBAHSN<-)GLOUQ[IA+2255*($&;9?B9:;;AA.%)8L^h\?2T>IP"%3:LF>5+8FN\jEB[NHA@B;3525.24,&2;><<>2NVL?EFC>+HSOYx~q}–‡ЊЪјУŠŸ‰‡ijq`JJWavMHA*>@L9$9950?3-&7CAFCLU\c]VQSEEOgzžДаьўўќјУўўдїбЯБЌД›ЂЁ~\;J27<@<5n‰’’vkqx˜~‡~‹АЎwzЛЯкњўўыљїјљљњљўяѓўјѕєєѓјћў§ўўіјпчпшхтцѕўўњјњћ§њ§њњј§љјљљѕњјїѕєѓѕєјњћћ§эњљјљњњљљјљљјїљјљљњљљјўљњњљћјљјљјјєљњљњљњјјїјїјјљњїјјїљјјьїјњљњњљљњјњњљјљјњњљјјљјќїјјљљќїјїјјўїјјўљњњљўјљљђјїјњљњљљњ§§њјљљ§јїјј§њљњњ§љњљљ§јљњњўљјјўљњњљїљњјєїјјљњљњљњјјїїѕјїјјљљјљљњћћѕњћњљљјљњљњљљьњљћљњјљњћћњљњљњјјїїјјўњјјіљњљјљљјјѕјјљњђћњћњћњћњћћјїјїїљюјњњ§§њљјљњњљљњљјјњњљўњљљљјљјјњњљљњёљњљћњћ§ў§ўћњљњјјљњљјїјќљњљћћўњћћњћќљјјњњљўњљљјњљњћњ§њћћюњћњљјјљњњљњљљјїјњћћњўћљљћњљћњћћљ§њљњњўћњњћћњњљћћјњљјјљњњљљѕјљјљњњљњљњљљѓњћћњњјљјїјјљњњљћњўљњњољњћњ§ћћњћњћњћћ§ўў§љљњјјїїјњљњљјјљњњљјїэјљљњ§ћћњ§§ўњћњћћ§ћ§§ђћ§ћњњ§ћ§њћљњњћћјњљљјљљњљљѕјљ§њћњњљјљјјљ§њљњњќљњћљљёјљјњљљћћ§ћ§ћ§њћћ§њ§ћћњљњљ§ћћњћњћћўњљљёњљњљњљњњћњћћљњљљў§њњє§ћћњћњ§ћ§ћћњњќ§ћ§ўўњћњњљљњњњћњњћњљљњўјљљњљ№њћ§§ћ§ћ§ћ§ћўћ§ћ§§њўћ§ћ§ўў§ћљњіћњњљњљњљћњњјљљјљљјјљљћћ§ћћ§§ѕћ§њ§ћ§ћ§ћ§ћћєў§ўћћњћњћњњљљњђћњћњћњћњћњљљњљљњўћњњљпњ§§ћљјњљњњљњћ§ћ§ћ§ћћњћњњљћћљљњљјњњѕјљњћњћћњљљњњєћњљјїїљњ§њћњњљљњћњљњћћўњћћіњћљћњћљњњћћњљ§њљћћ§љњћњњ§ћњњўћљљјњљљњћ§§ћћњўљњњћ§њњљћћўњћћ§ћўњћћњіћњћћ§ћ§ћћњњќћњћњњћўњћћўњ§§ўћ§§фћ§ўўћ§§ћћ§ћ§ћ§§ћњћљњњћњ§њ§њљљњњћљљњњљљњћћњћњћћљњћњћњ§ћћћ§ћ§ћўўў§ўўы§ўћ§ћ§њњћћњћњ§њљјљњњћћѕњ§ћћ§§њњћљћћћ§ћћњљљ§ћњћћћњљњћњњћщў§ўћ§§ўўћњњћћњ§ўћћ§ћћњћћўњћћљњћћ§њћљљњѕљњњљљћљћ§§ћћў§њњњљњћњћ§§ќўћ§ћћљњћў§њњћїњћћљћћњљјјњьљњњћ§§њћ§ћћљљћњњћ§§ћћњ§ћћ§ћњњќћњћњњё§ћњћћ§§љљњљњњћњњљћ§њ§њњќљјњћћњћёњћњћњњљљњљњћњњћћњљњћњљњњќћ§§ћћђњјљњћњљћљњљњ§њњћћњ§њћњњѓљћљњњљњњљћњћњњ§њўћњњєћњњћ§ћ§ћ§ћћњњљўњљљћњўћњћ§ћћњћїњћћњ§ћ§њћћўњћћљў§ћњћњћћцњћћњћћњљћћњћњњљњљћњљњћњћћ§§њћ§ћ§ћ§§ўћ§§јћ§ћњћ§ћўўћ§ћћњ§§ыњћљњљљњћњћњћћњћћњћљћњњўљњњцћњљњњћњњћњћњћњ§ћћњћњћњћ§§ћћќ§ћћњњљјњљјљњљњњћћљўњљљњяћ§ћ§њћњњћћњћљњљљњњѓћњћњјљњљњњћћњњћћљћљћћѕњћњћњћњњ§њћћќњћњћћљњ§ћ§ћ§њњћћњћњћћљёњћњњ§ћћњљљјњљњћћњ§љњћћћљњљљњњљћњћњљњћћљљњљћћ§ћћ§ќў§§њњић§ћћ§ћ§ћћњљљњћљљјљњћћ§§ћ§ћ§ћњњћњљњљњњћ§ћћїњћњћњћњћ§§љњ§§ћћ§ћћёњљњљњњљјїљїјњћњњ§ћњћћњќ§ћ§ћћњї§ћ§ћ§њ§ћњњьћ§ћ§ћ§ћ§ћљњњ§њњћљљњљљѕїјјљњјїљљњљљўњјј§љћњњѕћњ§ћ§ћ§ћ§ћ§§ёњћћњњћњћњћњћ§§ћћэ§ћ§ў§§ћњћћљїњљљњљљњњљњљљњљњћ§ћћўњ§§ћњћ§њ§§њў§§ћ§ўў§ўшћњњјљљњћћњћњ§ћћљћћўћћњ§њњћлњћњћћ§ћ§ћ§ўў§§ћ§ћ§ўўћ§њћћ§§ўћ§ћ§§ћњћљљрјњљњњ§§њњљћћњ§ћ§ћ§ћ§њћњћљњњћ§ўў§§ћњќћ§ћњњћщ§ћўћў§ўћњњљјљјљљћњћњћћ§§јћ§ћћњћћ§§сњљњљњћњћњћ§§ћњњћњћњћћ§§ўў§њћњћ§§ѓћњћ§љњњљљњћњћћћ§ћћ§њњ§§ћ§§іћњњћњ§§њњљљќњћњћћїњ§§ћњћ§§ўўћ§ћћњ§§њѓћ§§ћљњњћњћњ§ћћњћЬљњњ§ћњћљћ§ћ§ћ§њћћ§ћћњ§ћ§ћ§ћ§ћ§ћ§§ћ§ў§ўў§ћ§ћ§ћћњћљљњ§§ђњћћњћћњћљћњћњљљќњљљњњљћњ§ўў§ўўѓ§ўћ§ћ§ћњњ§ћ§ћћї§ћћњ§ћў§њњќљњњљљ§њћњњђћњћњћњњћћњњјљњњќљјљњњњљњљћћ§§јћ§ћў§§њћћх§ў§ћњїјѕїїњљњљњњјњњћњћњ§ћ§њњљјњљњњљњњљљњћљ§ћћ§§ћ§§ёћ§ў§ћ§ўў§ў§§ћљјјіњљњјњљњљљћћ§ўў§§ућњњћњћ§ћ§ћ§ћ§ћ§ћ§ћ§ћ§ћћљћњћћўў§§ўћ€ƒјлбЫРЄ•РалебсяёчзеЫгхыпцгШШЭамклщющшхёёјудхээцэщЫМЇreo]Sevp[\mhc‡”ЁЅa„Ърцхьэў§чЩгШбтэхыпЛТсёђЧШяўђкЯчѕђШбтзЎŽ‡whcnS>IWSUeaaW]bgG^bg\-4gn`[}ЏФЈ‡|ЎМеĘmˆ‹uv—˜’•ЃžƒtЉtgad\LW`OUhdgWUNbZab`\`eZh\OEA8Uedb~r]Yb\e\WmgQGB;5FG@@?CJi]TJWQMNI9CFMaWTGW’ˆ^CT‡QPQQTJPTOPSQLOachaVN:5LOYo|iP9MUYLPOYj^\m]SHJEEPNPYbT@C”ЉŸ|E5U@$5OT]F?HOV]UUMMI\WL@!+;8CMvkBJ@LSS`VN`Z[abaZZSMQcodckC?g}qa?NNVLWWQC@GFAHNH:JESGG<4CBZN0BdH9FLUPZM>BIOT^ZVPSLUeg‹–”mON`mSHVFOUQNOS[POGE?:4.LFLFGI>HCM>@:?8:GIMPJSQPHIPJUNGSQGE\I99G@3&IOOLMLNLQLMJQQIH8;?::@FCH7QGNJOQBHB9@?GJOV`aYLOJHQPSFOIIOLCGNLLJQMJL9;B934@9FCCAQBCJEEIHPTOILMCEL@<@GBF<<ћ5?EC??šPGIEGLF>EF>A;?FGFIACFGGAA?BALA7;#.AoOG@GA9<9?38;*5>8;A@A[L)3A@?@;441?@;??€ЦC??HHJB>9?:?I++I\FA:ALILLGM:>G@:?:9ABE>94B;??IG;FF<+:F&:;3<5:0F@E<7@>B8FO:4C3;A0EGnP^h‹^1NPNOOTHNSF><>GEIBOL<2+,12544,>QwZ"(4A8B>C?@G@C@AALA7J`‰wUVP\\LJFFNOH@IOS@G]\bMQQNA#23GZ]]YMc`S99.>LSEP80(,.#YiG#91Tn•›Л§§іўїѓїєјљћљњњїгњћ*15?828>8<120,+.$S…m:>*.95SJJe™Щь§ўћљїїёјњїєєїїњјњћљ§§њњєљўў§§њ§њњ§ћўўп5>1.*2&51+?MO0?OOVQSQ|Ас§ўўјњјјњћћѓљњјїїјјљњјћњўўц§њњўBE?*.,7<1.25>I3S@::U„Эє§ў§ўћћ§§њњљњјјћ§§јњ§ћљљ§њ§§љў§њў§§ў ўц§њў>$5GPELSpУћ§§ћѕјњћњњљћљљєћњћћљјњ§§ўўњњ§њњ§ћ§њў ў§і;FY]Zp‘Їу§§ћљјјњћћњўљ§§§ћљ§§ўљћўўћўћњњў§ўўўћў ўљћvЕзє§§љњљѕњљљћћіњјљїњљњ§ў§§њћњјјњјј§ўўћўўўћўў§ўўћ§§єћјљњјњњјјїњћћ§ћљћљњ§§ћћ§љћљ§§ўњў ўўћў ўљ§љљјјћњњљћћљћљћћ§йњћљћ§њ§ўў§§ћ§њњў§ћћњњўњљўў§љћ§ћћўўњ§ўћўўўњїїјѓћ§ћћљ§ўћ§ћњњљљ§ћљћћ§љјћћйїјћ§њ§§ћ§§њ§§њћ§§њњћћњњ§њњўћўўћјњјјњњљћћљћјћ§§ўўѕ§ћћ§њћћњјћ§§ў§ћњўўњўўљћў§§ў§ўўўњћћ§љћљјјњїћћї§ћћјњњ§њўўћ§ўћўўћўћ§њљћћ§тљћћ§њљљњ§ўўљ§јћћњјњјљјћљћћјјљ§§ћћљјњљљ§ѕњћћ§§њ§ўўњўўњјљ§§њњ§њ§§ў§њћўўэјњљѕѕїјћћ§љћњћ§ћјљ§§§њљћћўљ§§їћњїїјћљ§ўўњњў§њњўўќћўўњњљјњћћљћ§§ўњћћ§ў§ќњ§§ўў§ўў§§ўўћўўч§ўўјїїјњљћњћћ§љљћњћїїјћћ§§ёњ§§ўўњ§њњ§§ћћ§ўўќ§њ§ўўўћўўѕћўўњљћљћћњјјћі§њ§љљћјјњћћќљћћљљќ§њ§ўўјњљњ§њ§њ§§ўўћўўўћўў§љћ§§њњћ§§ћѓ§њ§њ§§ћћљћљћ§§ўє§љљѕљљ§§ў§њћћљ§јњўўђ§ў§§ћљљњїјћ§§ћћ§ўљ§§љњ§§њ§§ўў§њўљћўў§§љћћљјћљў§љ§ћ§§ѕњћћљћ§§ћјјљљў§ћћљњљћћ§њўўўћ§§ў§ьў§§ўўћўў§§њ§љ§§ћћ§њ§§ђїњ§ћћљњњљћћ§§ўўќћўў§§ўў§§њћўњ§§ћўћўћўўў§ўўўћўўјњ§њўћўў§§ќћљљћћўјљљ§§ўћўў§єљ§ћњ§ўњ§њ§ћўўњ§њ§§ћў ўя§ћ§љњ§ўўњћћ§§њљћљљјљћ§ўњ§ўўў§ўўєћўўћ§љјљћ§ћўў§ўў§§эћљњћљњ§§ћћљљћћјљљј§§њў§ўў§ћўћњљћћ§§ёў§§њўњњ§ћњїїњћ§§њњћўўћ§§ўњ§§њћљ§ўћў ўўћўўћљ§њњ§§љј§ћљљњ§ћўўєћў§§њўћ§ћў§ўўїњ§§ўў§њљўўјћ§ћћўўћўўћћўўљћћў§ўўєћўћњњ§§њљћћ§§ў§ўњ§§§љћљљђћ§њ§њњљјѕњћ§ў§§ўїћњњў§ўћ§ћћ§ў§ћў§§њўљ§§њ§њњ§љњ§§ўўљћњ§§ћ§ўў§ќљј§ўўўњ§§ћўњ§§§ўћўўјћў§§ў§§ўў§ўњњљћћњўћћўєћў§њ§§ћљ§ўў§§ќў§њ§§ўћўўўћўўўћўўљћў§§њћўў§ўќћўњљљўћ§§ћњ§ўў§§ќўћў§§ўћ§§ћљћњ§ў ўўћўўћў§ўўњ§§љћњјјћљћћќљњћўў§ўј§њ§§ћ§§ўў§њћўўћў§§ўўћ§§ў§ѕћјјњћљњњјљ§§ўњѕ§ћљљ§§ћљ§§ўў§ћў§§ћњ§њњ§§ў§§њўў§ќћљћ§§јћљљћљћї§§јћљљћљћњ§§їљћљ§њљ§њ§§ћыњ§§ћљћ§њ§ћјћћљ§ћјњїњћћњљ§§ўў§§ћўљ§§ќњ§њ§ §ћњўўћўў§§ўњ§§ўєћ§§ћ§§ћјљњ§њњ§§њўўќ§њњўўњўѓ§њњ§љљ§ўњћћњ§§ўўћўў§§ћўњњ§§њўўњњћјћ§ўў§ћњ§§њ ўѕћў§јјћ§§њћў ў§ћ§ўўњў§ўў§§њћћњљ§њћћ§§ўњ§§ўўћ§§§љ§ўў§ўьњљљћљњ§§ўў§§њњ§§љљћ§§ћ§ћў§§ћўўў§ўўљ§ў§ў§ёњљљјїѕїјћ§§љљјћћў§ўўяњћћ§§њћљћћљћљљћ§ўў§ўўњ§§єћўћњ§§љћћњљ§§§ћјљљќ§њћјјћњјљћ§§ьњ§њњ§њўўњ§§љћћљћћ§§ўўњ§№љњ§ў§њљљћљ§ўћ§њ§§љ§ћљћћї§ћћљћљњ§ўўќ§њћјјћљњљћ§§іњ§§ўљћћљћ§§ўў§ћћўљ§§ўњћў§§ў§§ћљћ§§ћћ§ў §їћ§њ§ћїјћ§§ўњ§§ћњ§њњўўњњ§њњ§ўў§ќћўў§§ўў§ўўї§њ§њў§§ћ§§ћѓ§ћњјїјљљ§§ўћўў§љњ§§ћ§§ћћїњ§§љ§§ћ§ўўћїўћ§§њ§§њ§§ўў§§љяј§§ћћљћљћљ§љјїјљћћјњ§љћћјћ§ §ќњ§ў§§њў§ўў§ўќћўў§§§љћ§§ўљ§§ў§ўћўў§ўњ§§њњћњ§§ўўўћ§§ўљ§ћљљ§ћўўњє§њњ§§њ§ћљљ§ўў§ћј§њњ§ўў§њњћ§љ§њ§§їў§§њ§ћ§§ўў§ћњ§§ўћўўјћњўў§§ћўўњѕ§ћћњњјљћњљ§§ўњ§§ўўћўў§ћ§љљћ§јњ§§њњ§§ўў§ћљћљћ§§јћў§ћљњљћћњњ§§ў§ўўќ§ћљ§§їњў§§њ§њ§ћћ§љјћћ§ъњ§§ўўћћўў§њћљћјњњћўњ§љљћњ§§њ§§ћљ§ўў§§љњћљїњњћћљ§ћљњ§§ћјјљљњћћњ§§ўўћ§љ§§ўў§§ўћ§§ў§§њ§§ўћ§ћћљћћќ§љњ§§ьњ§§ўў§њ§§ћћ§§ў§§ћљљ§§љ§ћњ§ћў§§ћў§ўў§љў§ћћўў§§§њљћћї§ўўћўў§њ§§ћєњјјћљћћ§§њњ§§їљћћ§љћћ§ў ўї§њ§§њњ§§љљшњ§љћћљљјїљћћњњћ§§љћњ§§љўўЮU}…:*1;;<5,)&7?::1@HBP;.-,,"&1PM&&CB33MhZTЄатўўў§њњўљћћ§бћ[„x*33025<9738>@455HNIL9%%,--&]wJ!0E2T{ЁЅТўўѕљјљћњћњћљњљљње.45>:+*.;@:9<37-&.:@@5220387GJUU№4LОњўў§ћњњ§њњјњњќћ§§ћћ§ў§ћ§ўф<:0.473)#*Sc& ).?B;EQ;A4,.258<@EBAIEVzЊмўў§ћњљњњљњњњљњњ§ћ§§ўњ§§ўћћ§ћ§њ§§њћ§ћ§§ўўя%"&4<>80*%5IGLPQwШ§ўўњљљњљљћњћћњўћ§§іћў§ў§§ћ§ћ§§іў§§ў§ў§ў§ўўд§ўћ§ћ§ћ:I^dax˜Џрўўћ§ћњњљњћњњљћћ§ћ§њћћ§ћ§§ў§ўўћ§ў§ў§§§ў§ўўќ§ў§ўўѕ§ў§ўўxМсїўўќћњљћћњщљњјљљћ§ћўћ§ћћљњњљњњ§§ћўўў§ўўі§ў§ў§ў§§ћўўњојљњљљњњћљњњћњ§ћћњћ§ћћ§ћњњ§ћњћ§ћ§§ўўў§ўўў§ўўќ§ў§ў ўћњљћіњћћ§ћ§њћњ§§ў§ўњ§§§њћ§§њў§ў§§ћћў§ўћўўљњћіњћћўў§њљљћћњњћњћњћћьњћњћњћћ§ћ§њ§ћ§ћ§§ћћ§§ў§ќћ§§ўўњљјћњњћњћњћћћ§њћ§ўўх§њћћ§њњљњњ§ћ§ўў§ўћ§ћ§ўў§ў§ўўф§ў§§ћўћў§ў§њњћњ§ћ§њћњњљћњћњћћњљњћ§ўў§ў ўў§ўўд§ћњњћћ§ћњњ§§ћћ§ћў§ўћњњћљњљњјњњћњћњњћ§ћ§њћњљћћљ§ћ§њћћ§§§ў§ўў§ћ§њћ§ћ§ћўўў§ўўњ§ў§њљјјќљњњћћюњ§њ§њ§ћ§ћ§ћ§ћ§ћ§ћњњїћў§ћ§ћћњљљњ§ћ§ўў§ћў§ў§ўўљюњљњљћњћњ§ћ§ћ§њћњћњњї§ћ§§ўћ§ћ§§ўћўўђ§ў§ў§§ћўћ§ћ§ћўўњ§ў§ў§ўўыћўўњћљњљћћљћњ§ћћњ§њћњњщћ§ћ§ћ§ћ§§ў§ћ§§ћћњњћў§ў§§ўў§ўўј§ў§ў§ў§ўў§ћ§њљњњћў§ћћњјљћњћћњњћћ§§ћўў§іў§ћ§ћ§ћ§ћўўў§ўў§ћ§ћњ§ћ§њњћј§ћ§ћ§њњћћє§ћ§ћ§ћў§ў§ўћћў§ћћ§іћњћњњћћ§§ўў§цў§ћњћћљћ§ћћ§њћњ§ћ§ў§ћ§ћ§ћ§§№ћ§ћ§§ў§§ћ§§ў§ў§ўўњћ§ћћњћћшњў§§ў§њћћ§ћ§ћ§ћ§§ћњћњ§ћњњћў§њњљ§ћћњ§§ўўќ§ў§ўўѓ§ћ§ћў§§ћўћ§§ўўќ§ћ§ћћњ§ўўћ§ћћёў§§њњћ§§ўњћћ§§ўў§§ћ§§ќћ§ћ§§њ§рћ§§ў§ў§ў§§ўў§ў§ў§§ћ§§ў§ўћ§ћ§њћћњњў§ћћћ§ћ§§ўў§ўћ§§ћћўћњ§§љћ§ћў§ў§§ћ ўь§ўў§њћћ§ћўў§њћћ§§ћњћћ§њ§ћћўў§§ў§§ў§§ўю§ў§ў§ў§ўўћћ§ћњћў§ўў§§ћ§§єћ§њћ§ћћ§ћћњћћњћћ§ћ§ћ§§ўћўў§ћ§ўўђ§ў§ў§ў§§ћњњћћ§§ўћ§§ўњљљћ§їў§ўў§ћ§ћ§§ћљ§ћњћ§§ўўў§ў ўњ§ў§ўћ§§§ћ§ћћѓ§њћћ§ћў§ў§ў§ўўў§ўўіћ§§ўў§ўўћўў§§ћў§§љў§ў§ўћўўќ§ў§ўўў§ўўўћњњў§ўўў§ўў§эћ§ћњњ§ћ§§ўћ§§ћ§§ћњћћяњћ§ћ§§ћњњљћћўћ§ћўў§§ў§§ўўћњњћ§ћў§ўўќћ§ћ§§ќў§ћ§§ќћ§ћ§§ћ§їћў§ў§ў§§ћћўћў§ўў§ћћ§ћћњњљћ§§ћ§ћўўќ§ў§ўў§ёћўћ§§ў§ў§§ћ§§ў§§ћћњћ§ўўї§ў§ў§ў§ў§§цћњћ§§ўћ§ћўћ§ћ§ћ§ћ§ћ§ћў§ў§ўўќ§ў§ўўќћ§§ўўљ§ўћ§ћ§ўўј§ўћћњ§ћ§§ћўћ§ћўўѕћ§ћ§њћћ§ћњ§§їў§ў§ў§ў§ўўќ§ў§ўўэ§ў§ў§§ћў§ў§§ћ§ћ§њљњњщћњћњћў§ўў§ўћћ§ўћ§ћћњ§ћўўњ§ў§§ћўўњћ§ћ§§ўў§ћ§ћћўэ§ћ§ћћњњљћћњљ§ћ§ћ§§ўў§ћѓ§њћћ§§ў§ў§§ћ§§Жћ§ћ§ћў§ў§ў§ўћ§§ў§§ћ§њћњ§ћ§ћ§њћћњћњў§ћ§ћ§ћ§ћ§њћћњћћ§§ћ§ћњћ§§ўћ§ћ§ћњњ§ћ§њћњ§§їњ§њћћ§њњљљњћё§ћў§§ћ§ћћњћћ§ћ§§ѓћ§ћ§ћ§ћ§ћ§ћ§ўўр§ў§ўћ§ћ§ћ§ћ§ћў§§ћ§§ўў§ћњћ§њњћ§ћ§§їў§ў§ўћ§§ўў§ўў§§ћєў§њћ§§ћ§ћў§ўўќ§ў§ўўї§ћ§§ћ§ўў§§ўъ§њњћ§ў§ў§ў§§ћ§ћ§§ў§ў§ўўў§њњ§§ћўўў§ўўў§ўўњ§ўў§ў§§юў§ўў§§ћњћћ§§ўў§ћ§ћћ§ќћ§§ўўў§ўў§ћ§ћћў§ьћ§§ў§§ћћњћ§§ћў§§ћ§§ћћі§ћћњ§ћўћ§ўўўћўўў§ўўћъ§ћў§§ћў§§ћ§ћћњљјљњћ§§ћћќњћћўўс§ћњ§ћ§њћњћћњћћњ§ўў§ўћ§ћў§ў§§ћ§ўўя§ћ§§њњ§ў§ћ§ћ§ћћњћћ§њёљњћњ§ћ§ћ§ћ§ћ§ћ§§ўн§ћ§ћњњћњћћ§ўў§ў§§ћ§ћ§ў§ћўћ§ћћњћћўў§§ћћ§ћ§ћћўњћћћњћњћ§§њў§ўћ§њњфћљћњћ§ћћ§§ћўўћњћњ§ћ§ћў§§њћњћћюў§ў§§ћўћ§ћћњ§ћћњњћћ§ёў§§ћ§ћ§ћ§ћ§ћћњ§§ыњћњњћ§ћ§ћ§ћ§ћ§ћ§§ў§ў§§ўћўўь§ћ§ћ§ўў§§ћ§ћў§ўћў§ў§§єўћ§њћћ§њћњ§њњљћњћћ§ћўўќ§ў§ўўэћ§ћ§ћ§ћ§њ§ћњњћњ§ћ§ћћ§ў§ўўў§ўўўћ§§ѓћ§ћ§ћ§ћўћ§ћ§ћћњ§ћћњњћћћњћ§ћњњћљњћњ§ћћњњћї§ћ§ћ§ћ§ћ§§ќћ§ћ§§ѓў§§ћ§ћў§ў§ў§ўў§§ћ§ћћё§ћ§ћўћ§ћ§§ўћ§ћ§§ќћ§ћўўќ§ўћ§§іћ§ћ§њ§ћ§§ўўќћ§ћўў§ђњћћ§ўў§ў§ў§§ћ§§ћћ§ћњћћѕў§ўў§ћ§њћћ§§ўўћ§§єћўћ§ћ§ћ§ћўћ§§Ъў§ћў§ў§ў§ў§ўў§ћ§ћў§ў§ў§ў§ўў§ћў§ў§ў§§ћћњњљњћћ§ћћ§ћ§ћ§ћ§§§ћ§ўўћњњћњ§ћ§§ўћ§§ўћўў§§ўћћўњћћы§ћў§§њћљћњћњћ§§ћўћў§ўўіћњћ§ћ§§ўћ§§їњћњћ§ћњћњњљ§ћ§ћ§§ўўђ§ўћ§њћњњљљњў§ћћ§§ћ§§ћ§ѕўћ§ћ§њћњљљњњћі§њњ§§ћћњњћћљљћ§§ћў§ўў§шћ§ћў§ўћ§§ўћ§ћ§§ў§ўћ§ћ§ћўўћ§њћњњї§ћ§ћ§ћ§ћ§§§ћў§§ёћњњ§ћўћ§њћћ§ћ§ћћ§§ћ§§ў№ћ§ћњњ§ўў§ў§ўў§ћ§§ў§§ўћћ§љћњћњњћўўіћ§ћ§ћ§њћљњњћќњ§ћ§§юћ§ћ§ћћњњћћњњћў§ў§ўўћ§ў§ў§§ўћ§§ћ§ыўћњћћњњћњћљњњ§ћћњ§ћ§ўўЮbŒœ[+OJHPTJAF@GPPGOGOMZOB@;C77F&F>@QTMHGMUTMELYE5;?4F@>9?Pewr[cQmjzШўў§ћљњћћ§ћў§§щў§ўћ§QE>>@MFIPPEGJ@IGFCCьGE-4bž‚SMGONgbGCЛжўўћў§ћћќ§ћў§§ћў§ў§ўўлVrJHIJNJNF?FPOHG?ECFJ40:k…o}dg~kЌгћўў§юћ§ўў§ў§ў§ўў§§ў§ў§ўўрMPVQNL4H@@EEPWIFI?>9^Yj‰{e\VZgАўўћ§§ўћ§§§ў§ўўо§ў§ўUOMHCPGABIIONLFEICQN[aaoiG^—Яўў§ђћ§ћўњ§ћў§ўћў§ўўў§ўўфMAEIBJ;9:9g{@#@QUWZ\eFLjr{дўўтљјјћљ§њ§њ§љњћў§ў§ў§ў§ў§§ћў§ў§ўўхFGGAB@:>AHeˆ`2LSZULq^a|Алњўўэ§њ§њћћ§љћљ§њћћ§ћў§ўўў§ўўќ§ў§ўўчAH;@;LBCGIVpeFYtihkmj•Юљўўћ§§ћ§§ѕўњўћћ§§ћў§ў ўц§ў§ўIEёBFLPJH9LSnodxхўўя§њўћ§ћў§ў§ў§ў§ў§ўўо§ў§ў§ўћ§§ў§ў§ў§ўћ§§ўO:5HH\mPCB]–цўўљћ§§ў§ўћћэўћ§§ў§ў§§ћў§ў§ў§ў§ўўў§ў ўѓ§ўW9Chdebgˆкўўћњћћ§ћћўў§§ўњ§§§ў§ўўєњў§ў§ў§ў§ў§ў ўђ§ў§ўNdv|oŒЉУяўўё§ўћўћўћ§њћћў§ў§§ћў§ў§ў ўќ§ў§ўўћˆЃЭюўўљ§њћћ§ћ§§јћўњ§ћ§§ўў§§ўћћўўћћ§ўў§ўўќ§ћњћћёўћўћћ§§ћ§§ўћ§§ўў§§ў§§§ў§ўў§ќўњ§ћћ§єћ§ћўћ§ћў§ўў§§ћў§ўў§§їў§ў§§ћў§ўў§ўћўўў§ўўљћ§њ§њ§ћћћўћ§ћўў§ћ§ўћ§§ёћ§§ўћ§ћ§ћўћў§ў§§ѕў§ў§ўћў§ў§ўўќ§ў§ўўћ§ћњўћћ§њћ§ћ§ћ§§§ў§ўў§єћўў§§ўћ§§ў§ўўќ§ў§ў ўў§ўўїњ§ћ§§ў§§ћћіўћ§ћўћўћўћћ§ў§ўў§ћћў§ў§§ћўћ§§ўўћ§ўћ§ћћњ§ћ§ћ§ћћ§ќў§§ћћ§їў§§ћў§ў§ўўњ§ўћў§ўўќ§ў§ў ўћіњћљ§ћ§ћўћ§§ѓћ§§ў§ў§ў§ў§ў§§њћў§ў§ўўћћ§њў§§ўќ§ў§ўўћўњћћ§іў§ў§§ћ§ћў§§§ў§ўўњ§ў§ў§ўў§ўќ§ў§ў ўљњћњўћ§ћћ§ђћўњ§§ў§ў§ў§ў§ўўњ§ўў§§ўўќ§ў§ўў§љћ§ћ§ћўћћј§ћў§ўћ§ћћ§§ћ§§њћ§§ў§ўўі§ў§ў§ў§ў§ў ўљ§ўћў§ў§§ўў§§љћў§ў§ў§§іћўћў§ў§ў§ўў§§ў§§їў§ў§ўћ§ћ§§ўо§ў§ў§ў§ћћ§ћў§§ћ§§ў§ў§ў§ў§ў§ў§ў§ў§ўўќ§ў§ўўц§ўћ§ћ§ћ§§ў§ў§§ўў§ў§ў§ў§ўћ§§љў§ћњ§ћ§§ќћ§§ў ўќ§ў§ўўў§ўўў§ўўј§ў§ўћў§ўўў§ўў§љў§§ћў§ўўю§ў§ў§ў§ў§ўў§§ў§ў§ўўў§ўўќ§ў§ўўњ§ў§§ћ§§њћ§§ў§ўў§§ў§§ўј§ў§ў§ў§ўўў§ўў§ќў§§ўў§ћћў§ў§§їў§ў§ћћў§ўўў§ўўў§ў ў§§ў§ўўю§ў§ў§ў§§ћўћ§§ўў§ћ§§ўў§§љў§ў§ў§ўўў§ў ўъ§ў§§ўў§ў§ў§ў§ў§§ћ§њћћўўў§ўўј§ў§ў§ў§ўў§§ў§§ўі§ў§ў§ў§ўћ§§ўў§ўўў§ўўў§ўўў§ўўўћў ўўћ§§ ўќ§ў§ўў§§ў§ўўќ§ўў§§ѓў§ў§ў§ў§ўњћћўўў§ўўќ§ў§ўў§§ў§§ўі§ў§ў§ў§ў§ўўќ§ў§ўўќ§ў§ўўќ§ўћўўў§ўўњ§ў§ўћ§§њћў§ў§ў ўў§ўўў§ўўќ§ў§ўўњ§ўћ§ћў ўћ§ў§ў§§ўў§ўўі§ў§ў§ў§ў§ўўў§ўўќ§ў§ўўї§ћ§§ў§ў§ўўў§ўўє§ў§§ўў§ў§ў§ўўў§ўўю§ў§ў§§ћўћ§ћ§ћ§ћў§ўўў§ўўў§ўўў§ўўќ§ў§ў ўў§ўўћ§ў§ўћћќ§њћ§§§ў§ўўђ§ў§ўћ§§ў§§ћў§ўўє§ў§ў§ў§ў§ў§ўўў§ўўђ§ў§§ћ§§ў§ў§ўћ§§ѓў§ў§ў§ў§ў§§ћ§§љћў§ў§ў§§јў§ў§ў§ў§§ўў§§ўў§§ўћ§§ћјњў§§ћ§§ўўф§ў§ўћ§§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўўј§ў§ў§ў§ўўќ§ў§ўў№§ў§ў§§ћ§§ў§ў§ў§ў ўў§ўўњ§ў§ў§ўў§њћў§ў§ў ў§§ў§ўўќ§ў§ўўћ§ўћ§ўўњ§ў§ў§ў ўњ§ўћ§§ў ўў§ўўќ§ў§ўўј§ўћ§ћ§§ўўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўј§ў§ў§ў§ўўў§ўўі§ўћў§ўћ§§ўўў§ўў§ўў§ўўє§ў§§ћћњћњўћ§§њћўћ§ћўўѕћ§§ў§§ћ§ћў§§§ў§ўўў§ўўќ§ў§ўўћ§ў§ў§§јў§ў§ў§ўћћє§ћў§ў§ћћўћў§§ѓў§ў§ў§ў§ў§ў§ўў§§ў§§њћ§ћў§ўўј§ў§ў§ў§ўў§ќћ§§ўўљ§ў§ў§ў§§ђћ§ћ§ћўћў§§ћў§ўў§ћљ§ћ§§ў§ўўў§ўўўћ§§§ў§ўў§ќћ§§ўўў§ўў§§ў§§ћўћ§§ўўў§ўўъ§ў§ў§ў§ў§ўў§§ў§§ћў§ў§ўўј§ў§ў§ў§ўўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўў§ўў§ўћ§§ћњћћў§§ ўљ§ў§ў§ў§§ѓў§§ћ§§ў§§ўўћў ўќ§ў§ўўќ§ў§ўўј§ў§§ћ§§ўў§ўћ§§ѕћўћўћ§ћў§ў§§ћў№§ў§ў§ў§ў§ў§ў§ў§ўўў§ўўќ§ў§ў ўі§ў§§ћў§ў§ўўќ§ў§ўў§§ў§§§ў§ўўє§ў§ў§ў§§ўў§ўўў§ўў§ўі§ў§ў§ў§ў§ўўі§ў§§ћў§ў§ўўў§ўўј§ў§ў§ў§ўўњ§ў§ў§ў ўќ§ў§ў ўў§ўўш§ўћ§њћњ§ћў§ў§ў§ў§ў§ў§ў§ўў§ђћ§ћ§§ў§ў§ў§ў§ўў§ћўћў§ўўє§ў§ў§§ћ§ћў§ўўњ§ў§ў§ўўђ§ў§ў§§ћ§ћ§ћ§ћ§§ћў§ў§ўў§§ћ§ћћў§ўў§їў§ў§ўў§§ўў§§ў§§ќўћћ§§ўў§§љў§ўћўћ§§§ћўћћ§ў§ўў§ўў§ўўќ§ў§ўўќ§ў§ўўўћ§§їў§ў§ў§ў§ўўћ§ў§ў§§ў§ўў§§ћў§ў§ўў§§ў§§ўњ§ў§ў§ўўј§ўћ§ћ§§ўўљ§ў§ў§§ћћ§ѓћ§§ў§ў§ў§ў§ў§§ћўћ§§ў ўќ§ў§ўўщ§ўћ§§ў§ўћ§ћ§ћў§§ћўњ§§ў§§§ў§ўў0џўˆ ,џўˆџќˆˆџ џўˆџўˆўˆџџўˆџўˆўˆџџўˆџўˆ)џўˆ*џўˆ+џўˆ,џўˆ- џўˆ0 џўˆ1џˆ4џўˆ8§џˆ }њ§ћљјћљљўћљљПћљјјљљћљ§њўљћљњљњ§§њњљ§§ўњњћљјїјјњјњњѕђѕїѕєѕјёцсллйб§§њ§§њ§ћљћјћ§§ў§ўэћ§ћљћћ§§њ§љїјїїєєїјјќїђѓєєщёьччхсхћћњљ§ўћўњњ§љљћ§ўўэћ§§њўћ§њћљљћњ§њ§њљ§§ћјї§јїјјљљѕѓёёђўўўљњњ§§ўћўўќ§ћјљљњўўљ§§љћљ§љљћљћљљћ§њїѕѕўјўўљћўћўћћўўїњ§њ§њ§§њўўїњ§§ўћўћњўў§ўў§§ѓњ§ўў§њљјјљћјћћњјїјњћўўќ§љљ§§љњўўћўў§§ѕљњ§§љјїїљ§ўўћ§њћ§ўў§№њўўћў§љћ§њћјњјћ§§ўќћўћўў§ўњўўўћ§§ћђљ§§ў§њўўњњ§њњћћљ§њ§юњ§љљћљљћљў§§ўўћўњ§§ёљ§§ћњјњћћ§§њ§§ћћњќјћјљљ§јљ§§ўћљљћјљњўў§њљћћыљўўћћўўћњ§§ўўћў§ћћ§§ћћњђ§њњ§§њћјћћљњ§љљјњ§њјјљ§ћћіјћ§љљњ§§ћ§§ўћўўўћўўўћўўњ§ђјћ§§њјћћ§§љј§ўўї§ћјїљљњ§њњ§ѕњљ§§ўўњњ§§ўў§њў§ўў§§ћ§§ќњ§§ўўљћў§§ћўћћўўћўўљњјљњћњўўўћўў§єћљњјїљњ§њў§ўўћћ§§њ§§њ§ўћ§ћљњўўњњўћўћўўўћўўў§њњћћў§ћљљ§њѕ§њ§њўўћўљљњњљјњјљљњ§ћўўњ§њњ§§ўўўћў ўѕћљћћљћљњћњўўћњўњљљ§ўўё§њњ§њѕюѕћ§ўћўћўў№њ§ћћ§§њћўўњњ§љљўўќ§ћјўўўћўўћє§ћћљѕюњ§ўўћўўўћўўў§ћћјў§ўўњљў§§ўўћўўњћўћўјўўј§љєђљ§ћўўўћў ўўћўўљњ§ўћўћўўќ§њћўўўћўўћћљѓљ§§ўўћўўњњ§ћўћўўўћўўэћњњ§њљњћў§њљўў§§њ§ўў§ћњўўѓ§љєїљњ§љћћ§§ў ў§ ўўћўўѕћ§ўўњ§њ§њћўў§њ§ўўё§јѓэѕљљњ§њўћўћўўўћўўјћўћўўћћўўўњў ўћ§ўљўўѕћўњ§ў§њѕњ§ўўћўќњћњўўћўћћњ§§ўўћ§њї§ўў§њћў§ўўњ§§ўњўўћћў§§ўўњњўўњћўў§ћљўўўћўўў§ћћ§љћў ўњ§§њўўўћўўўћўўњєћљњ§§њ§ўў§§ўўѕћў§§ћћ§љјєўўўћўўћ ўћ§њўћўўћўњњўўњ§ўў§ќљ§ћў ўўњ§§ќњћ§ўўћћњўћўўўћўўўћў ўўћўў§ўўћўў§њ§ў ўћўўћўўќћўћўў§њ§ўљўўўћўўў§њњўўћўў§ћћ§ўњў ўќћ§ћўўўћўўўћ§§ўћўў§њ ў§ћў§§їљўћўў§§ћўўўћў ўћўєћўћўћ§§ўўњњўўћўўњњ§јў§§ўўњћўўћњўћћўћў ўљћўћўћњ§§њљ§ўў§ћў§§ўјћўћўўњњўўўћўўј§ўўњўћћўў§њў§§ћћўўќћўўњњћљ§§њ§§њљ§њјњ§§ќў§ћўўћўћњљњ§ўўњ§њі§њўћўўћўњ§§ћэ§њњљ§ћўњ§њ§ў§љ§ћ§§ўўё§њў§ћћўњљљ§љћњўўўћўўњўўћўў§ўћўў§ќўћћўўў§ўўњћўљјў§§ ўў§ўўћўўњўўўћўўќњ§њ§§јњ§њ§њ§ћўўњњ§ћљїў ў§ўћўўўћўўћњў§§ўћўўљ§њљњњ§ўўљ§јњјћћўў§њћўў§њњўўљњўўќњљћўўќћ§§ўўљћўњњ§љўўњћ§ўўћўўњ§ћњ§§ўў§ўњўўќћњћўўўћўўњћўћўћўўњўўћўўоћ§ћћњњўўћћјїјјћўћћўўњ§њ§§њ§ћўў§§ћўўўћўўї§љњјљ§§њўўўћўўўњ§§ ўњћўўћ§ўўћў§ћўћћўь§ћљћћљћћ§ўњ§ў§љњњўў§§ўўћ§§їњўўњўўћћўў§ўћўўє§ћљљ§§ў§§њ§ўў§ўњћўўћњўўћћўўњўў§јњљњ§ўћћўў§њ ў§їўњ§њћўћћў ўћў§іљћ§љ§њћљљ§§ёћ§§њ§њ§ўћў§ўћњ§§љњўўћњћўўћўўћўўўћўў§јљ§§ўћўњўўўњўўљ§ћљћ§љјјљљњ§§ўћўўћ ў§ќљњћўўѕћ§љћљћњћўўћћў§јў§§њ§§њ§§ў§ўњїћ§њћ§ўћћўўўћўўўњўўќњљјћћјћљ§њ§ўўїћњћћ§ћљћўўўњўўћўўњ§§ўјњ§§ўўћћўўљ§ћћњўўћћљљћљ§§њўўћ§њ§ћўў§§њ§§ўўћўўѕ§њњ§њ§љљњ§ў ўыћўћўћјљјїјљ§§њњ§ћўў§ўўј§ћјљљ§ћўўћћўўњ§§ћўћўў§§ ў§ћ§јљ§§§њ§ўўўћўў§ћў§§ўљћўћўћў§§љќћ§њўў§ќњљљўўѓ§ћћјјћ§ўћў§§ўўўћљљњ§њ§ћњ§§њљћ§ўњўўўћўўўћњњ§ќњўў§§єўћ§ћїѕѕјљј§ўўћњћўћўўљў§ўў§њўќ§њ§ўў§ћў§§яћўћ§ћўў§љѕєљјјћњўў§ьўњ§§ўїјњјћћљћљњ§њњљўўќ§ћћўўўћў ўїњћјћћљљ§ўўіћўљњћўњ§§ўўѓћљћ§§ў§§њ§ћћўўћњ§ўў§§ћўњўўіњўўћўўћњљїїљћ§§њ§њўўѓљњ§§љ§§њ§§љњўўўћўўўћўў§ђњ§§њћћјњјћ§§ћўўўњ§§њ§љќћњјўўћіўћћў§§ўўћў ў§ўњўўљ§јљњћљўў§ўћ§§ўћўўѕњћћўћњћјўўћћўўћўў§ѕљ§љћўћ§ўўћўўіћњњљљ§§ўћњњ§§њ§ўўѕћўњњў§љўћ§ћћћ§ћњћњњєјљћћ§§ћјњ§§ўўњўћњћљљњњўё§љљћљљњ§ўў§§њњ§§ўњ§§ќћљћ§§њћјљњљўўќ§ўўћћў§ћўњ§§ўўѕњћўў§љјћ§њўўћѕў§јћћ§љїјњћћ§ћўўћўўњћў§њљћћљќј§§ўўќћўћўўћўё§њњ§§њћљјћ§љћњўўћў§љљўћњћљћћќ§ўћўўі§ўњ§ў§§њ§ўў§њшў§§ўўћўњ§ћћ§ўўњљћ§§ћ§§љўўїњљћјјњћ§њњ§њњљјњ§ўўїћў§њ§§ўўћћ§§ўћўў§§њ§§ќћљ§ўўіћ§њњў§§њњўў§ўћўўќћўњўўў§ўўў§ўў§јњћўћњў§ў ўљ§ћјњљ§љљъћљ§ћљљ§њ§њћўўћ§њћљћљ§ўўпћ§љ§ћћ§њ§§ћћљћћјњјљ§љљјљњћўњљћљјћћњ§ў§њњ§§њњ§ћљћ§§ћњјїјљљњњ§љњ§§ћјћ§§ќњљљ§§ћшљ§§ћ§ћљїїјјћ§§љћ§§њ§њњљњњѕљњјћљћ§ў§љћћ§љјўўњў§ўўћњћ§њ§§ѓњ§§њјїљєѕїїљ§§ќњ§љўў§љњўўўћўўћ§љљћјњ§њћњњћћћњћњњћћі§ўўћћљћ§ћ§§ћєў§§њћњћњњљњљљщјљјїјїѓщппмзе§ћ§ћ§§ћњћњњћќ§ћ§ћћћў§§ћўўі§ўў§њћњњћ§§ћљњљљјјљњњљ§їѕїїћєяшхттјћњљћ§ўў§§ћќњ§§ўўё§ўў§ћ§ўўћ§њћћњ§§іћ§ўћ§ћ§§ћњњљ§њћњњјїѕђѓєў§ў§ўў§ћ§јў§ўў§њ§ћћ§ќў§ўћћњљ§ћћњћњћћњљјјїў§ў§ў§ўўћ§ў§ћ§§ђћ§§ўў§ћ§§ў§ў§ўўўћ§§ўћ§§єўћ§ћњњћњ§њћњњўљўўћћ§ћ§§ўў§ћхў§§ћћњљљћ§ў§ў§ўћ§њћўў§§ћ§§ўўћ№њ§§ћњљњћћ§ћў§ў§ўўњћ§§ў§ўўљ§ўў§ћ§ўўя§ћўћ§§ў§§ћ§§ћњћњћћћ§ћ§ћ§§ўћ§§ћ§њўћћћўћћ§ўўќ§ћћ§§ыћњљњљњњ§ћ§ћ§њћњ§§љњњћћї§ћћ§ћ§ћ§ћћіњћћ§§ўћ§ћњњќћў§ўўэ§ў§ћћў§ў§§њћћ§њћњћ§§іћ§§ћњћњћ§ћћћ§ћ§ћ§§ѕњћњ§њ§ћћ§§ћћ§§ћўўў§ўўў§ўў§ѓћ§ћ§њћћ§ћћњ§ћћ§ў§§ћњњћћ§§ћ§§љћ§ћ§ћў§§ўћўў§ўћ§§шћў§ўћњћ§ћ§ћ§ћ§§ў§ў§ћћў§ўўў§ўўљ§ћћљњ§ўўт§ў§ўћ§њћљњњћ§ћ§ўћў§ў§ўў§ћ§ћ§ћ§§ѕћў§ў§ўћњћ§ўў§љў§ў§ў§ўўќ§ўћ§§ћў§§њћћ§њћ§ћ§§ўўћ§ћљљњћћ§ћўў§њћ§ўў§ўў№§ў§ўўњћњњћњћ§ў§ўўі§ћћ§§ў§ўћ§§єљјљљњ§§ў§ў§ўў№§ў§§њћћ§§ў§ў§§ћўўў§ўўћќў§ў§§ ўіћњњљєїљ§§ўўў§ўўј§њћњћњњ§§ўў§ўў§ўћўўў§ўўў§ўў§њјёєљћўўќ§ў§ў ўі§ў§ў§ў§§ћўў§§ў§§ ўў§ўўљјѕј§ћ§ўўі§ў§ў§§ћў§ўўћ§ўў§ўў§ўћ§§ўіћ§ћўў§ћ§ћўўў§ўў§ђјїљћ§§ћњњћћў§ўўў§ўўњ§ћћў§ўўє§ў§ў§ў§ў§ў§ўўїћў§§ћ§ћ§ўўё§ћ§ў§ўў§їюѓјћў§§ўў§ўўќ§ў§ў ўў§ўўў§ўўў§ўў№§ў§ў§ў§§ћўћњљњћўўў§ўўў§ўўё§ўў§ћ§§ў§ўћ§ў§ўў§§ћ§§ўў§ўўћј§ў§§ћ§§ўўє§ў§ў§ћћў§ў§ўўў§ўўў§ўўћ§ў§§њњўћўўў§ўўў§ўў§њћ§§ў§ўўќ§ў§ўў§ћњћ§ћ§§ћўћ§§ўў§іћўў§ћњћў§ўўћ§ўў§ўўў§ўўї§ћ§§ў§ў§ўўў§ўў§§ў§§яў§ў§ў§ў§§ћўћў§ў§ўўћ§ў§§ћћј§њћў§ў§ў ўќ§ў§ўўў§ўўќ§ў§ўўћћ§ћ§ўў§ўћўўј§ў§ў§ў§ўўў§ўўў§ўўћњ§ћћ§§ћћљ§ћў§ў§ўўў§ўўќ§ўћ§§ўў§ўўњћ§ћњћўўќ§ў§ўўћ§ўў§ўўў§ўў№§ўў§ћ§ћў§ўў§ћ§§ўўј§ў§ў§ў§ўў§ѕћ§ћў§ў§ўћ§ў ўў§ўўў§ўўў§ўўќ§ћў§§ў§§ћ§ћћћўћћ§ўўњ§ў§ў§ўўў§ўўў§ўўў§ўўі§ў§ў§ў§§ћ§§љћў§§ўўћћ§ў§ўў§§ў§§ўќ§ў§ўўўћўўў§ўўћќўћћўў§ћ§ћ§ћ§ўў§ўўћ§ў§ў§§іў§ў§ў§ў§§ћћ§§ћ§ўўћ§ў§§ћћўјћ§§ў§ўў§§№ў§ћ§њ§ћў§ўў§§ўћўўј§ћћ§ћњ§ўў§ўњ§ў§§ћўў§ўћўўў§ўўњћў§ў§ўўќћњўћћўў§ўўћ§ў§ў§§§ў§ўўў§ўўў§ўўњ§ћ§ћћ§§ў§ќњћњўўў§ўўє§ў§§ћў§ў§ў§ў ў§ўћўўќ§ў§ўўћћ§ћљ§§њў§ў§ў§§ўљњњїў§ў§ў§ў§ўўјћ§§ў§ў§ўў§§ў§ўў§§ћўў§ќћў§ўў§ўћ§ўћўў§ђћ§ћ§§ў§ўў§ўў§ўўі§ў§ў§ў§ў§ўў§іў§ў§ў§ўў§ўўњўљњњў§§ў§§ћѓ§ћў§ўћ§ўў§ў§ўўў§ўўў§ўўў§ўўў§ўўњ§ћљњћ§§ћў§ў§ўў§јћ§ћў§ў§ўўќ§ў§ўў§їў§ў§ў§ў§ўўў§ўўќ§ў§ўўђћњћњњћњћћў§§ў§§§ў§ћћ ўћ§ўў§ўў§ћў§ћњћћ§ѕћ§ћў§ў§ўћ§ўўў§ўўў§ўўў§ўўў§ўўљ§ћ§ў§ћўўљ§ў§§ћћ§§ўќ§ў§ўў§ўћ§§§ћ§ўўў§ўўњ§ў§ў§ўўў§ўўѓ§ўў§ћћњ§ў§§њћћі§ћ§ћњћ§§ћ§§іў§ћўў§§ћ§ћћ§ ў§ў§ћќў§ћўўў§ўўќ§ў§ўў§њњћњ§ћњњјћ§ћ§§ў§ўўќ§ў§ўўќ§ў§ўўњћ§ћў§ўўћјњћњ§ўў§ўў§№ћўћћ§§ћ§ћ§ћў§ћћўў§љўћ§њ§§ўўќ§ў§ўўў§ўўћњўћ§§ўј§ћњ§њћњўўќ§ў§ўў§ќћ§ћўўќћ§§ўўј§ў§ў§ўћўў§§ўњњљћњћћ§§ўў§§ў§§ђњў§ўћ§ћ§ћ§ћў§ўўїћ§§ћ§§ўў§§§ў§ўўў§ўўі§ћњјњћњћћ§§ўћўўўћўўї§ў§ў§§њњћћ§ў§ўў§іћ§§ў§ўћ§ћўўѓ§ў§ў§§ћћњ§ћ§ћћ§§ћў ўћўї§ў§ў§§ћ§ћћњњ§§ў§ўўњћ§§ћћўўќ§њћњњ§ћў§§ћўўћы§ћњ§§ћ§ћ§ћ§§ў§њњћћ§§ўўќ§ўў§§ћ§ўўћћўљ§њљјјњћћў§ўўј§ў§ўўћћўўўћ§§љў§ўћ§ћўўў§ўўћћ§ћ§ўўі§ўў§§ћљјјњњў§ўўрћ§ћ§ћў§§ћўўњљњњћћњћ§ћ§§ў§ў§§ўў§ўўў§ўўў§ўўћ§ў§§њњћ§ў§ўўю§ў§ў§ўў§ћ§§ўўћћњћ§§ќћ§ћўў§ќћў§ћћњќ§ў§ўўќ§ў§ўў§§ћљљ№њ§ћ§ћў§ў§ў§§ћўћ§§ћќ§ў§ў ўў§ўўњ§ў§ў§ўўў§ўўќћ§ћ§§§ћ§њњњљњњћ§ўўњ§ў§§ћ§§ћјњљњў§ў§ўўў§ўўћў§ўўў§ўўћ§эў§ўћњјљњћњў§§ћў§§ћўўў§ўўј§ў§њњў§ўўў§ўўў§ўўєћ§ў§ўў§ўћў§ўўіњљљћў§ћўў§§іћ§ћ§ћ§ћў§ўўя§ў§§ћўў§њћњњћў§ћљљчњћћњћћњћ§ћ§§ў§ўў§§ў§§њћћ§§эў§ў§ў§§ћћњћћ§ћўў§ћ§§ўћ§§ѕћ§§њћњћ§ћ§ћћљ§ў§ў§ў§§ў§§ўћћћў§§ћўўј§ћћ§њћ§ўўў§ўў§њћѕњљњћњћњ§ћ§ўўў§ўўў§ўўњћ§ћњњћћ§ў§ўўў§ўў§єћ§§ћћ§њ§ћњ§ўўь§ў§§ћ§§ўў§њћњћњ§§ў§ўў§ћў§§їћ§ћў§ў§ў§§ќўћ§ўў№§ћњњћўў§ћњћ§њћћўўј§ў§ў§§ћњњќљњћ§§јћ§ћ§ћ§ћ§§ўюћ§ћ§§ўўћњњћ§ћ§ћ§ћўўю§ўћ§ћ§ћ§њћћў§ў§ўў§§њў§ћ§§ўўћўј§ў§ў§ўћўў§ўѕ§ћ§ћ§ћ§§ў§ўўўћўўў§ўўћ§њљћћћњћ§њћћ§ѓў§ўў§§ћћњћћ§ўўћѕ§њњћ§ћ§њњћњњ§љ§ћћіњћ§ў§§ћњћњњ§§ў§§ћќ§ћ§ћћњњћ§ћћњњ§ћў§§ѓћ§ћ§њ§њ§ћ§ћ§ћћс§ћ§ћћњњћ§ћўћњјљљњњћћ§ћњћ§§ћ§§ћ§§љћљњњћњ§§ћњњћњў§ў§§§ћ§ўўћ§њћ§ћћ§ћћљњћјјяљњћћ§ћ§ћ§ћў§ў§ў§ўўў§ўў§§ўћћњ§ўў§§§ўћ§§љўћў§§ћўўќћ§ћўўќ§ў§ўў§жћўћўћўћўћ§ћћњћњћљїящччмл§ў§ў§ўў§§ўћ§ўў§ў§ўўў§ўў§§ў§§ыў§ў§ўћўњ§ћћњћћўњўњ§јњњєѓђээьюћ§ћ§§ўў§§ў§§ўќ§ў§ўў§§ў§ўўѓ§ў§§ћ§ћўћ§§ўћћіўћўњћљљїјўўќ§ў§ўўў§ўў§§ў§§љў§ў§ў§ўў§§ў§§љўћў§§ћ§§јўћ§§ћљћўўњ§ў§ў§ўўќ§ў§ўўј§ў§ў§ў§ўў§§ћў§§њћўћўћўў§ўў§ўўў§ўўљ§ў§ў§ў§§ўў§ўўќ§ў§ўў§їўћўћўћў§ў ўў§ўўќ§ў§ўўў§ўўў§ўўў§ўўєћ§ћ§ћ§§ў§ў§ўўћ§ў§ў§§ўћў ўњ§ў§ў§ћћ§нў§ў§§ћў§ўћў§ў§ў§§ћў§ў§ў§ўћў§ўћ§ћ§§ўў§ ўђ§ўћў§§ћўћў§ў§ўўј§ўћўћў§ўўќ§ў§ўўњ§ў§§ћ§§їў§ў§ўћў§ўўь§ў§ў§ўћ§ўў§ўћ§§ў§ў§ўўљ§ћў§ў§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўі§ў§ў§ў§ў§ўўњ§ў§ў§ў ў§ћ§ў§ў ўі§ў§ў§ў§ў§ўў§ўў§ўў§§ў§ўўќ§ў§ўўї§ў§ў§§ћў§§ўњ§ў§ў§ўў§§ў§§ ў§ўњ§ў§ћљ§§ў§ќћў§ўўў§ўўўћўў§љћў§ў ў§јћ§ћўћ§§ў ўў§ўў§ќєјљўўў§ў ўў§ўўљњљ§§ў§ў ўў§ўўў§ўўў§ў ў§ћјњ§ў§§&ўќ§ў§ў ўі§љњћљ§ўў§ў-ўў§ўўќњўњўўў§ўўў§ўўњ§ў§ў§ў ўќ§ў§ў#ў§ўћўўќ§ў§ў ўі§ў§ў§ў§ў§ўўў§ўўў§ўўќ§ўћўўў§ўўў§ўўў§ўўў§ўўў§ў'ўў§ў-ўў§ўўќ§ў§ўўў§ў ўќ§ў§ўўў§ў ўќ§ў§ўўќ§ў§ў ўњ§ў§ў§ўўў§ўўў§ў ўќ§ў§ў+ўќ§ў§ўўў§ў3ўњ§ў§ў§ўў§ћў§ў§ўўў§ў ўў§ўўў§ў ўў§ўўў§ўўћ§ў§ў§§ўў§ўў§§ў§§ўў§ўўў§ўўў§ўўў§ўўў§ўўј§ў§ў§ў§ўў§ўћў ўў§ўўў§ў ўњ§ўћў§ўў§ћћў§§ў ўў§ўўў§ў ўў§ўўќћў§ўўњ§ў§ў§ў%ўў§ўўњ§ўњўћўўў§ўўў§ў%ў§њћўћ§§ўўќ§ў§ў ўў§ўў§§ў§§§ўћўўќ§ў§ўўў§ўўў§ўў§њћў§ў§ўўў§ў+ўњ§ў§ў§ўўў§ўўў§ў ўњ§ў§ў§ўўь§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўўў§ўўќ§ў§ўўў§ўўў§ўўў§ў ў§љў§§ћўћўўў§ўўў§ўў§ ўў§ўўў§ўўў§ўўў§ўў§ўє§ўћ§§ўћў§ў§ўўўћ§§ўќ§ў§ўўў§ўў§љўћў§ў§ўўќ§ў§ўўњ§ў§ў§ў ўў§ўўў§ўўєћўњўћў§ў§ў§ў ў§ќћў§ўўќ§ў§ўўў§ў ўћ§ўћў§§ў§§ў§§ўў§§ўќ§ў§ўў§њћўћ§§ўўў§ўўъ§ў§ў§ў§ў§ў§ў§ў§ў§§ћў§ўўќ§ў§ўўў§ўў§њњћћў§ў ўў§ўў§§ў§ўўќ§ў§ўўў§ўўі§ў§ћњўћ§§ўўќ§ў§ўўў§ўўћќњ§ћ§§ўў§ўўў§ўў§њћ§ћ§§ў ўў§ўўіћ§§ў§ў§ў§ўўў§ўў§ ў§њњ§њ§§ўўє§ў§ў§ў§ў§ў§ўўљ§ў§ў§ў§§љўћў§ў§ўўњ§ў§ў§ўў§ўћўўў§ўўњћ§ћў§ўўњ§ўў§§ў ўў§ўўќ§ў§ўўљ§ћўћў§ўўі§ў§ў§ў§ў§ўўў§ўў§ќћ§§ўўћѓўћўћ§ўў§ў§ў§ўў§ўў§ўў§ўў§ўўљ§ў§ў§ў§§ѕў§ў§ўћў§ў§ўўў§ў ўў§ўў§ ў§ђў§ћўћ§ћ§ћў§ў§ўў§ќћ§§ўўј§ў§ў§ўћ§§ ўќ§ў§ўў§ќћ§§ўўќ§ў§ўў§ўў§ўў§ўљ§ў§ў§§ўў§љўћў§ў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўіћ§§ў§ў§ў§ўўњ§ў§ў§ўўј§ў§ў§ў§ўўў§ўўј§ў§ў§ў§ўўљћўћ§ўў§§ћў§ў§ўўў§ўўњ§ўћ§§ўў§ќў§ў§§ѕўћў§ўў§§ў§ўў§ќўћў§§§ў§ўўч§ў§ўћў§ў§ўћ§ћўћ§§ў§ў§ў§ў§§§ў§ўўњ§ў§ў§ўў§ў§ћљў§ў§ў§ўўў§ўўѓ§ўћ§ћ§§ў§ўћў§§ўў§ўўќ§ў§ўўю§ў§ўћўћ§ћћњў§ў§ў§ўўў§ўўў§ў ў§ћхдйгсхщьшяѓїєјїїѕљ§§љњ§§ћў§љљњћљљјњѕѕћїјїїѕѕЩњёясiV?(..(?]G))74ххтцхтсрпцшьчыэяєњњїїњ§ћў§љњњљљјјљћћЧљњїѓюыыьѓћёпwVC+0.CIQ+ +478ѕѕєѓѓєєђёяюьыцшщщчтЪД–ž‡ˆ…œЏОзсѕў§ўѕїїљљѕєѓьшђљћ›^B7H@38.0+*&)јїїљјјѕѕѓѓђёсяђѓэулЮИЊЄЉЛРЊ’Ј•ŠЁТуљўўјћћљћљєєэѓаoSG>C<740$,%(ћљјњњ€„ћљјїїљїїѕїјѕєѕєѓэмейчюыжЮЫккЫБžЇешщєў§јљїѕў§є‡PJEUBNHF(+"ћ§§њїѕїїљїљњњјњјћћјїїјљљѕѓђѓѕѓяђѕѓяшмЮе˜Блєєѕј§ћ§ўњI91-)""§њљћљњњїјїїѕњїћљїѕјѕѕєоюёђяєѕёпЭНМЩЭЫРДЖДжьРF8211*&&*ћјјћїѕјјћћњўїѕѕї§ѕјѕѕїиљѕѕєђёѓђѕэхшцдзтмЗ™ЋЏUVUF57271,ћћњњ§љ§љљ§јїјјѓѕїѕїјћљјњјїњљљїајїєєѓђѓђђёёюђьтпЮТйРe,+3?90154ў§њњљ§њљљ§§њљљїјїјјї§ѕїѕѕўїѕѕњєѕєђёђђѓчёюђцпмлрЈA %Bњјћ§њњљљђћ§§њљљјњїјјїљїїрѕѓђёђѓѓђёђђѓђђёяяђёёяышсуђђтuю§§ўўњ§ћњјјљ§ўў§ћћ§јѕїїјМљїѕїѕђѓѓєѓёёѓѕѕѓђёяёђѓєєѕєёї§љШ` љћљћ§њ§ћљљјћљћћљјњјјљјјїїєѕѕєєѓќђѓїѕѕзїѓђёѓѓєѓјїѕѓѓљ§§Є3-13$)§§ћјїј§ўў§љћјјћћ§§ЪћїїѕѕєєѓєєѓђђѓєѕїїљїїјѓђѓєѓєєђѓђёёыєЧQ.7#љћњ§њўўњњ§§ўњ§§§љѕїїшѕїєѓєѕѕєєѕїїѕѕїїљѕєѓѓїєѓѓєёјїјј§Џb@2 љ§ўўў§ћћїљјљљњјїјїїіљїљјѕѕјћїјјјљїїјѕїѕєєѕўєѓѓіњћмA>)(3§§њіў§ћўћ§ћћјїїѕљїљїїѕїљјњћћўјїїїєћћјљѕєђѓѓђщѕњ§§Š;O1&?ў§ћљћљ§љћљњ§јјіљѕѕљїјњїјїїј№їѕєєѓђѓєѕѕїѕёѓѓєєЫяєяёђїљч~Z3FIћў§§љљјјєљћљћїѕїїњћљјїљїњјјїљљїљѕєѕєєѕѕїї§љєѓѓєѓюєѓѕђїјљЅ>HG5ћљњ§њўўї§њћїљїїјљљѓјњјјњјјњјјїљѕѕїєѕєѓђёђѓєѕѕїяѓєєѕ§ћЗ.3<8ћљ§ўўфћљћјњљљїїљњјїѕїјљћ§§ћњњїњїљїїињћїјїїѓёяяёѓѕјѕєѓђѓёђјћћ”b^Fўћўћњћўњљњњјјћћњћћљљѓјїїѕїѕѕїљјњњјјљњјєѓёёђђ№яєѓѓђёёяьїя™IOLўўљћўў§љњїїљјљњ§ўћўў§юћїјњљћљћћњјљїїєѓѓђђњёѓѕѕєѓѓќёїђѓѓћћљxT[ўў§љћ§њ§љ§§їћљњјљїњљћћїћјїѕєѓѓђюёђёёђѓєєѓєєѓ§§ЛJ-ўўљљњњљњ§ўўћћўўћ§§љљћљјњљћћє§ћјјњјјєѕїљїїєљѓђѓѓєєѕѕѓїєєѓєєѓ§јe9њ§§ьћјњјћ§§ўўњњљљћјјљјљјј§њјљљкїјјњјјљљјїѕѕїѓєєѕѕѓѕєђяююѓѓѕј§јДGўў§љјјћњјњњјјћћ§њњ§§јљћћљћљјљљ§јїѕѕўєѕѕњєђєїєїїюєѕєєѕєєѕѓљ§ћОћјјњљљ§ѕћљћњ§ўў§љњљљюјљљ§§ў§љљїѓѓђёђєєѓѓєќѕїѕєєяѕєѓєјћлљѕїїљћњ§§ўўїњљћљљњ§§љљўњ§§љќјњњѕѕїяљїѕєєѓђєѕѕљјљћїѓїїјјўћ§їјћ§§тњћљњ§њћћјѕїѓѓїјјљћћјїђєѕѕїњјјњњўїѕѕіѓѕїљћћјїїјјљїјјћћјљљїћљљјћљњљњњћјћљљћћќњ§њ§§ўљїїѕљфјљјїјѕѕѓѓєѕљљјјїјњїѕєѕѓєєјљ§§љ§ќў§§ћћћњў§њ§§ђљћћљјїѕїѕѕєѓѕїїѕљєјїњїѕєєѓїѕїїѕјєѕљ§§ўћ§њ§§њњы§њљ§ўўћў§њњ§§њњ§ћћїѕїїќљјјїїѕєщїѕѕњњћјјљјјљљјјїєљ§ўўћўўїњјљјљњ§њ§§њљћїѕјѓїјјїјѕєєѕѕїјїїєјљњњљљћјђѕ§њњч§љњўўћ§§љ§њ§§љјїјћљњљћјјљљїыњјїѕїїјѕјѕѕѓѓјљјћљњљїїќљѓєѕѕ§ёћњјјћћњ§њњљћњњ§§њ§§ћњїїљљ§љћњњјј§їѕїїёєїїѕёєѕјњћљјјѕїї§љ§ўўќћўў§§ў§јњў§§њљћљљ§љхћљљјњїѕѕїјњњјјљњї§§ћљјјњѕѓўўћњћўћ§§їўћўў§њњћўў§ѕљћћ§ћћјњјњљљ§ѕћјјћљјјњњјћћіљњњљљћћјњ§§ьњўњњћ§њўћўћ§њ§љ§ў§ћњњћѓњљћњјљ§ўњ§њњљљћ§јњљњїђєєјјјњјїїљњњўўўњ§§њ§љўћњљћћјј§њћ§§љјіћљњ§ћ§§јїѕѕћћўћњљљњјњљћѕљљўјўўўћўўўњўў§ћљэћ§њ§§њњ§њћјјњјњњјїѕѕї№ћњјљћљѕљћ§љљјјњ§§ћљјјћ§§њ§ўѕљљњїћћљњ§§њїј№їњјњћјњћљјјћњњ§ћћ§љјѕћњ§ўўњљљњњ§§ћјїјњўїјјїћјјїљћљїјј§љћљћњњ§ўў§ћў§§ќњ§§ўў§њћ§§ўљ§§ћћјїјњћћјњ§њ§њ§њ§§їћљљјљїїљјјцљјў§§љњњљ§§љ§њ§ўў§њ§њљљћ§њњі§ћў§§њ§§њўўўћњњ§§љћћјјїћњћћјљћћіјѕѕњњћћњўћћћўћљ§њњьћ§љљјњјїїњљјњ§љ§њњћўўїњ§њ§§ћјњљљћ§њљљ§§іљјњ§њ§њњў§§ўњќ§ћљ§§ѓћњїїљїїњјљјћ§§мњљњјњњ§љїїјљ§§ћћ§ўњљљ§ћјљљјј§љ§њ§§ў§§ўњ§њњ§§њ§љљћљњјљњњћўўѓњћњњјћјїљњћћ§§ўљћўћњ§ћўўњў§њў§§ўњўўћўўўљ§§ћљјљћњњќљ§љћћњіћњњѕїєљјћ§§њўљўўћёўћ§§љљњјљљњњўћўўйћ§§јїљћњўў§ћњјїєљ§ўњ§јљљњїјјїїљѕїїћћ§ћўў§ьћљљћјћћ§ћљ§§ўўћў§њј§§яўћ§§ўўњњљїњјљ§§њ§§ўў§§њѕљћћ§ћњћ§§ћўўя§њњљњўў§§љћљјјњћўўљћўўћњ§ўўіћ§њљјјїћ§њњэљћћљћљїєјєїљљ§§њњ§ћћћљњњ§љљњ§њњ§њ§§ў§њ§ўўљњћљљјјљљќћљћ§§ј§юўћњўў§њїїєљ§§њўўћ§§ќњљћ§§љћјњјљљћћ§љћюљ§љљњњўў§њ§ѕјљљћљўўюћўћћ§њ§ћјћњўћўў§њ§§ўњ§§ўњ§§њ§хћљћљљћљ§§њ§њњ§§њ§њ§ўўњ§§ћљўў§§њљћћюјљњ§њўўћћ§њљћћ§ўћўўѓћ§љћјњњјјљљњўўј§њјљїњљјјїњјљњ§§ћњјјЬљ§њћћљњўћўў§љћљћљљћ§ўњ§ћљљј§§љј§јјїљњ§§њњ§ўўњљћјљљћњњў§њљћћљёњўў§§љљњњ§ћјљћ§§іўћ§љћљ§њњўўо§љћћљћљљјњћњњ§њљњ§љ§њњјћў§§ћјњјћљћћіљјћћљћћњњљљћњ§ћ§њњњўћўњљўўљ§ўњўў§јњ§љћћ§њ§§ђњљљћјјїїјјљњњ§§яћљњјљћћљјћћљњћћљ§§яњћјљњњ§§љјћ§ћћўўњњ§љћ№њјјїјљ§§њћћљљњ§ўўћ§ћјјљљњљћў§љљ§ўўсћ§ћљћћљљњ§њњў§њљѕ§њў§§њљљјјњћћ§§ўњ§§ўљ§§ўіћўўћўўћўћўўўњћћ§ўјљљјљчћљњ§њњ§њњ§ћјњјљ§њ§§ћљњњ§ўўљ§њњћњ§ћћњјљїјњўўњ§њњљћљљ§§ўћљеєкрцыюяђѕѕїїљљћњ§ћ§ўўћћјњћћњљњљњњљјўлєrUE3$4;.Mb^2(4>;чтуутутнруычшьёђїљњљљО§ўўћћ§§ћћњ§ћћњћћљљѕяьэѓїўўьt[E,.:HLbuJ-9?>єѓђёёђёэьшсмзмнрщђхЮЏЌђўўћњТљјїєѓѓђєѕяўўdY?*NTS4!(7;B@јјїѕѕїїѓѓёёээшцчышсЮЏ’œŽ…ƒœЌТетѓўўќјљљјјїъњўўЄgB9GFH?5*-5:4њљљјњњўјѕѕєцѓђѓѕёхзЫБЄЃЄИМЁЂ‘‰œРнњўўњњчћњјљїўўуu^UBIMJ@3.082њћњљљћзњљљјљљњљїјїјїєюкзжэёюгЫЯезЦЌЁЂгхцїўћњјљљўўяVOFZNHII3-.4њћ§љљјјљјљљњљњњљћїћћјєєьјїёѓјєэхзЩбА’Впїђїњўўщ§„J:592(!(-2§§ћњћљљњњљљєњјљљњљљјљјїјјїпѕђєѓїїђмЮЗИЪЮЩТЎКЕйшСM9989.*,%45њњўљњњ§ћњљљјљ§јїјјљјрїѕєѕѕјюцщуелпйЛ—ЇЋ{PVNH;31344њњ§§ўўћћў§њњєљњљњњћњљњћљћћљќїѕїѕѕсѓєѓѓяѕэцрдФеРa.15:8,175ўћ§§ўћ§ћћ§ћ§њћњњљўњјјљјћїјїѕєєўѓѕѕшяєьтзннЊ<  (3§ћњћ§§ћћђњћћ§ћћњљњ§њљјљљ§јѕѓѓѕєыѕѓєђѓѓєєѓёюцхчѓђхq щ §ћў§§ћњљњњћћў§§њћњњљљњяјљјѕѓєѕѕїѕєѓѕјјѕѓѓдѕїїєѓєљўўЭd ћњћњћ§§њћћ§њћњћћњљ§њћњњљљјјїѕќєѕѕјјѕєѕїхљјѕѕ§ўўЋ1359(,*§ћћњћњћ§ўћћњњх§ћ§ћћњљјјїїєїїѕѓѕєїјљљјљљїѕѕїѕрєђюѕаP1< .*ћњ§ћ§ўў§§ћ§ћ§ћ§ћ§ћћљљьјљјїїјјїїјљљјјљљјјїѕѕї§єѕїїэѕћўўД[B,+0ћћў§ўў§њњїћ§ћћљњћњљљљјљјїјјњњјјљљњљљјїїјўїѕѕю§ўмB<-49§ћ§ћ§§ўћўўўћњњљќјљјљљїјњљћњћњњљљѕћњћњјјїѕѕєѕѕєёѓєѓє§ў§§ћ§ћњњљ§њћ§§ў§§ћћњ§§ћћњ§љњћћњћтњљјјѕѕїїјјњјїѕїѕєѕїјћўўДHўў§ћњњћљњљљњњўћ§§ѕћ§ћћњњћњћњћћ§њљјјўїѕѕўјљљјњїћўўРњњўљћћ№§ћ§ћ§њћњ§ћў§§ў§ћћў§ћћ§ћ§љјєєёѕїїѕѕєѕѕїїљјљљјјяљїїћўујљљњћњ§ћ§§ўўї§ћњћћ§ћ§ћћњ§ћ§ћ§ћћўњљљјљїјљјїїѕѕїјјњњћћљњљљўњўўуљњњ§§ћ§ћ§ћ§§њћ§ћ§њћњљљњњљњњћњњљјїјјљљњњљљјћїјљћњњљњўўњћћїњћћ§њћ§ў§§яњћћњњћ§ћ§§ћ§ћћљљјјјњћњљїјјїїіљћћњњћњњљјјїќњў§ћћќ§ћ§ћћќўћ§њњ§яћ§ћћњћћњљњљљјїїјљљјїѕњљљјїїѕїїјљљїјјў§ћћ§ў§§ћ§ћћ§ў§ўўўћ§§ўћ§§њ§љњљљќјњњљљјъїѕѕјњљњњ§њјњњћћ§њљљўћўўь§ў§ў§ў§§ћ§ћ§ћ§ћ§ћ§§ћћјњћњљљјјњњхљњњљїјїїјљљњћњћњћљљћћњњљјў§§ћў§ўўќћ§ў§§ћѕ§ћњњћ§ћњћњјјљѓћљњљјљљїјїјјїїљјњњћљјљљ§јњјјњў§ћњљњњљ§ћ§§ћњ§§§ћ§ћћ§ћљљћ§ўћљљњњ§љјљљєјљљјјљљњљњћњњљ§іў§ў§ўћ§ћ§ћћ§ўўћћ§љўћ§§ћњћћў§ћћрњћћњљљјљљњљљњњћ§ўћ§њћњњљњїў§ў§§ўўћ§ћћ§ўўњћ§§ў§ўўљћ§ћћњћњњќљњљћћў§њњћњљњёћњћ§§ћћњћњ§ћ§ћ§§ћњћ§§ўўїћ§ћўћўћњљљњљ§ћњљњћ§§ќћ§§ћћњћ§ћ§ћљљ§ѕљњњљљњљљў§ўў§ёћ§ћћ§§ћ§ўў§ћњћњњњљњ§ћ§ћћѕ§њћ§§њ§ћњљјјњљћ§ў§ћћњњљћћ§ћћўњўўј§ў§ў§ў§ўўќћ§њћћўњ§§ўћ§§њљљњљљњљјјљъћњљњћњћ§ћњ§ћћњњљ§ћ§ћћњњќ§ћ§ћћ§ќћ§§ћћіњћњћ§§ћ§§љљњіћљњљћ§§њћњњ§§њћњњћў§ћћњ§ўќ§ћћ§§ќћ§ћњњљњљўћњњэћњћњњћ§ћ§ћњћћ§§ћў§ўў§юћ§ћ§ћ§ўў§ўў§њ§ћћўћћњћ§њњљњњ§ћћ§ћ§ћћќњћћњњќћњўћћ§њўћћўћ§§їўћ§ћ§ћћњ§§ѕћўўћћ§§ћ§§ўў§ћ§њћњњјћњ§њњћћњњјј§§ћњ§§ўў§ћќњљњљљћї§ћўћ§§ў§ўў§ћћњњљћћјћў§ћћэ§ћ§ћћњ§ћ§ћ§§ўћ§ћўў§§ўњћћ§§њљљўјљљєњћ§ћћ§ћ§ў§ћ§§іћљљњћ§ћћњ§§ћўњћћњ§§ў§§їћўћ§ћћ§ў§§њћ§ћ§ћ§§ћњћћ§ћ§§ўўю§ў§њљљњњћћјљњћћ§ћўўї§ў§ћњў§ў§§њў§ў§ўћћњ§ћ§§ў§§ўљ§ўў§ћ§ћћўњ§§ьў§ћњњћ§§њњљњљјјњњ§ћ§§ўћўўќ§ў§ўўїћ§ћћљњћћ§§љў§ў§ў§ўў§ћ§ћћїњ§ўў§њљњћћ§ў§ћћљњіћљјјљљњњ§ўўў§ћћћњ§њњћћю§ћў§ў§ћ§§ћ§ћўў§ћў§§ѕћњљњћћ§§ћћ§§ўћ§§ћ§њ§њњ§§ћўў§§ў§§№ў§§ў§ћћњћ§ћ§ўў§ўў§§ў§§єў§ўћ§ћњњћњћ§§№ћњњћњћњћњћљћћ§ћ§§љњћњћ§§ћћ§њћ§ћ§ћўўћ§ў§ў§§ќў§ўћћњћљњћњ§ћ§њњ§§ћўўќ§ўћљљћ§ьў§ўћ§ћ§§ћњ§ћћњњљњћћњњћў§ћћњћќ§ћћ§§њўћ§ћўћћћњћў§ўўјћ§ћњњћ§ўў§ћ§ўћ§§њћ§ћ§ћ§§§ћњћћќњћћ§§ўћ§§ў§ћєў§ў§§ћ§ћ§§ћњњ§§ћ§ўўљћ§ћњњ§ўўђ§ўћўњњљљњњћћ§ўў§§ў§§њњјљљћњњяў§§ћњљњњ§ћћ§ћњћ§ўў§ћіњћћњћў§ћњћћѓ§ћћ§ћ§њњћ§§ћ§§їў§ћњ§ћћњ§§мў§ў§ћњћњћћ§ўўћ§ћћ§§ћњњћњ§ћ§§ўћћњћћ§ўўћњјћњћћњљњ§§ћћ§§ў§§єћў§§ћњњљњњћњњќћ§њћћќњљљћћ§ўў§§ўј§ў§ў§ў§ћћ§юў§§ћ§ћћњњћ§ћ§ћ§ћћњњўћњњёћ§§ћ§ћ§њћ§§ћњњћћ№њћљњњћћ§ћ§њ§ћ§§ћћќњћћўў§љћ§ћ§ћ§ћћюњћљњњћњћћ§§ћњћћ§ћўўўћњњћ§ќў§§ћћўј§њћњњћћ§§ўў§§уўћ§§ћћњњљњћћ§ћ§ћ§ћ§ћ§ћ§ћ§ћ§ћўўў§ўўў§ўў§њў§ћћўўћћћњћ§ћњњьћ§ћћњћ§ћ§§ћ§§ћњ§љњћ§§цћњћ§§ћ§ў§ўћ§§ў§§њћњњјљњ§§ўў§§ћ§ћћќ§ћњћюмлпхяђђєѕљњњљ§љ§§ўўќ§ў§ўў§№ў§§ћўњ§њўћ§њћљћўўэѕ}iNB4IAH[}pNHAP§ўћўћ§њўћўћ§ћћў§ћћє§њ§љћљћљћ§§њњрћљњљјљћћљёєюруюсОЂДБ‡`g^UGBFEJH§§ћў§ўў§§№ўћўћўњ§њ§ћ§ћўћўћћ§љњ§љњњ§љљ§њѕїїчљјьщмЯйаp;:@IM@?AHўў§ў§ў§§ѓў§ўћ§ћўћўћўњ§§яњћљћљ§њћљћљњљњљњјјфњїљѕїјєшусщЗL 4F§ў§ў§ў§§ўЪ§ў§ўћў§ўњ§њ§њ§њћљњїњљљјњјјљњјљїљјњїјєёэяњўяƒ.  §ўўј§ў§ћћў§ўў§Щћ§ћ§њ§њўћ§њћњћјљљњљњїљљћїњїљїњїњјљѕј§ўўпv1%$%§ў§§ўў§§шћ§ћћ§ў§ћћ§њћљћјњјљїљјљјћћѕјљјјљљјњљ§љљўђМNFPPBPB§ўћўћўў§§ћў§§ьў§ўћўњћљњјћњњљњљћјћњњљ§њћїћљњњюјћљљјљїўнh@Q;&GA§ўўў§ўўќ§ў§ўўз§ў§ў§§њ§њћњћњњљћњњљ§њћљ§њ§љњљљјњњћїњјњљњўўїЦwQ?*@A§ўў§ўў§§ьўћўћўњ§њ§њ§љћљў§ўћўћћн§њ§ћ§њљјњјњјњњћљњїљїўўыM)Q@EE§ў§ў§ўў§ѓћ§њ§њ§њ§њ§њ§ћћх§ћ§ћ§њ§ћ§ћўњћњљљћїљїћјњјњљўўєЂOh:?Zўўћ§ћ§§щў§ўћњћћњўћўћўћ§њ§ћўћ§љњњЫљћњћљ§љњїћњњјњњ§јљјјўўњ—tMdgўў§ў§ўћўћ§ћ§ћўњ§њў§ўћ§њ§ћћ§ѕњ§ћњљњјћљ§њњљњьљћњљљћ§ўўРSadV§§ўў§ўўя§ўћ§њ§ћў§ўћўћўћўћћцўњ§љћљћљ§њўљћљљјљјћјћљњљљњњўњЮBBHN§§ўќ§ўћ§§љћўњ§њў§§ўўћћуўћ§њ§њ§ћ§ћўњњїљѕљјљљћљњїњљњјўўћЂvr\ўўѕ§ћћўћўћў§ў§§жўћ§њ§њ§њ§њўћўћўћћљњљљїјјњјћјљљјјљїј§§ЊWhhўўі§ўћ§њ§ћў§ўўљ§ў§ўћў§§ћё§њ§љњїјѕњјљљћјљљњљ§їљўўќ‘rqўў§§ў§§§ў§ўўѓ§ў§ўћћњ§ћ§§ў§§њњўњћњљљ§їћљљьњјњјњјњљњљ§јњњўўд`<ўўњ§ў§ў§ўў§§ў§§ћ§ћѓўћўњ§њ§њ§љњїљљфјћљћљ§љњјњјћўў}Oўў§ў§ўћ§§ў§ўў§јў§ўћўћў§§уўћўњўћ§§ўњћљњљњјћљ§љњљћј§љњљўўѓФ\ўў§ўћўћўћўћћѓўћў§ў§ў§ў§ўћ§§ўћ§§ьћ§љћљћљћљњљ§јћњњ§ћљћћѕљњ§ўўд§ўћў§§іў§ў§ў§§ћ§ўўЯ§ў§§ћў§ў§ў§ў§ў§§јћјњљњјљљћљљјњљћњ§ћўћћљњњўўьњ§њў§§§ў§ўў§ў§оћ§§ў§ў§ў§ўћўћ§ћћњ§њ§њћјњљљњћљ§ћ§ћ§§ќњ§ћўў§њў§§јў§ў§ў§ў§§ўќ§ћў§§цњўћў§§ћ§љњљћњўћўћўћ§љћљњљ§§ђўњ§ћћњўњћўўћў§§§ћў§§ѓў§ў§ўћ§§ў§§ћўўъ§ў§ўћ§њћљ§њў§ўњћљћњ§ј§§№ћўћћњ§љћљњјњўў§ўўњ§ў§ў§ўў§ѓў§ў§ў§ўћ§ћўћњњр§ћњ§љ§њ§њћљњљўћ§љњњ§њњћ§њ§љњћў§ўўў§ўўј§ў§ў§ў§ўўћ§ў§ў§§цњ§њ§њћћ§њ§љћј§њћњћњ§ћўњўћ§§ќћ§љў ўќ§ў§ўўЬ§ў§ў§ў§§ћ§ћўњ§љћњћћўњћћ§љћјњљ§њўћўћў§ўћў§§ћћљў§ў§ўћўўь§ў§ў§ў§§ћў§§ўў§ўћњњ§§іћўћ§љ§њћљћћхњ§ћ§ћ§ћўњ§њ§њ§§ћљћљў§ў§ўћў§§ў§ўќ§ў§ўўё§ў§ўћўњ§њ§§ўћўћћхўњћњ§њћњ§љ§љ§њў§ўћўњ§њ§њў§ўўќ§ў§ўўў§ўўў§ўў§§ў§§шћў§ў§ўћў§ў§ћћ§љ§љўћўћћ§ўўї§ўћўћћњњўўў§ўўў§ў ў§љћўў§§ўћћ§ъў§ў§ў§§ћўћ§ћўћћњ§ћ§§ў§§љўћћ§ў§ўўњ§ў§ў§ў ўљ§ўћўћў§§ѓўћў§ў§ў§ў§ўћ§§№ў§§ћњћ§љўћўћўњ§ўўќ§ў§ўўў§ўў§ѓћўћўћ§§ў§ўћў§§ўў§§їўћ§љћћ§ћўў§їўћ§ћў§§ћўўл§ўћў§ў§ў§ў§ў§ў§ўћўћўћўњћљћњњћўћў§ў§ў§§ћє§ў§ў§ўћў§ў§ўўў§ўў§§ў§§уў§ў§ўћ§§ў§ў§ўћўћўњ§њћћўћўћўћ§§ѕўћ§§ў§§ћ§§ўўє§ў§ў§ўћў§ў§ўўѕ§ў§ў§ў§ў§§ћћюўњ§њ§ћўћўћўћў§ўћў§§ѓўћў§ў§ў§§ћў§ўўј§ў§ў§ў§ўў§ўм§ў§ўћў§ў§ў§ў§ў§ў§ў§ў§ўћў§ў§ўћ§њўћўћўў§ўў§ўўћ§ў§ў§§§ў§ўўў§ўўє§ў§ў§ўћ§ћўћ§§ўў§§їўњћ§ўћ§§ўў№§ў§ўћўћ§ћўћ§њћћўўў§ўўт§ў§ў§ўћўћ§њ§ћўў§ћў§ў§ў§ў§ў§ў§ўўў§ўў§§ў§§ў№§ўћ§њ§њ§ћў§§ћў§ўўф§ўњ§ћ§§ўћ§§ў§ўћў§ў§ўћў§ў§ў§ўўў§ўўњ§ў§ў§ўў§§ў§§ћў§ў§ўўђ§ћћў§ўћ§ћ§ћў§ўўў§ў ўќ§ў§ўўў§ўўѓ§ў§ўћў§§ўў§ў§§ьўћў§§њћњ§ћ§ћў§ў§ў§§ў ўі§ў§ўћ§§ў§ў ўњ§ўћў§ўў§њћўћў§ўўє§ўћ§ћўћ§њћњ§§ўљ§ўћўћў§§ћўћ§§ўўќ§ў§ўўў§ўўі§ў§ўћўћў§ўўі§ў§ў§ў§§ћ§§ќњ§§ўў№§ў§ў§ўў§ў§§ў§ў§ўўў§ўўћ§ћўћўўћ§ў§ў§§ўў§§чўћўћ§§ў§ў§ў§ўћўћў§ўћў§ў§ўўќ§ў§ўўў§ўўђ§ћ§ћ§§ўћў§ў§ў§§їў§ў§ўћћ§ўўјћ§њў§ў§ўўћ§ў§ў§§ўњ§ћўћў§§ўј§ў§ў§§ћ§§ќћў§ўўў§ўў§ўњ§ў§ўћўўў§ўўь§ў§ў§ў§ў§ў§ў§ў§ў§ўћ§§њћў§ў§ўўњ§ў§ў§ўўћ§ўћ§ўўљ§ў§ў§ў§§ўў§ўў§§ў§§ўќ§ћўћћ§ўю§ўћ§§ў§ўћўњћўў§ў§ћћў§ўўќћ§§ўў§тћў§ў§§ўў§ў§ў§ў§ў§§ў§ћўћў§ў§ў§ўў§њћ§§ў§ўў§ўћ§§ў§њў§ў§ў§§§ў§ўўќ§ў§ўў§яў§ўћ§§ў§ў§ў§ў§ў§ўўљ§ў§ўћў§§ђћўћ§ћў§ўћў§ў§ў ўў§ўўў§ўўу§ў§ў§ў§ў§ў§ў§§ћ§ћўћўћў§ў§ў§ў§§щў§ў§§ћўћ§§ў§ў§ў§ў§ў§ў§ўўќ§ўћўўц§ў§ў§ў§ў§ў§ўћўћўћў§ў§ўћ§§ўўќ§ўћ§§ў§ў§єћ§§ў§ў§ў§ў§ўўў§ўўє§ў§ўћўћ§ћў§ўўє§ў§ў§ў§ў§ў§ўў§§ў§ўў§ёўћў§ўћўћў§ў§ў§ўўљ§ў§ўў§ћћ§ћў§ў§ў ў§јћ§ћ§њћ§ўўђ§ў§ў§ўћ§§ў§ў§ў2ўˆџ џ3 џ3ўˆџ џ3ўwџ џ3ўˆџ џ4 џ4ўˆџџ4 џ5ўˆџџ6ўˆџџ7ўˆџџ8ўˆџџ9џ9ўˆџџ:џ:џ:ўˆџџ;џ;џ;ўˆџџ<ќˆџџ<џ=џ=§ˆџ=ўˆ ПЯ4?3*:\aЏючгЩЯейхцтхмЮЧРНФЩШФЯЮСФНЛЏЇЎБЖКФгжебЯУНТТЙЛИИМЩбзлптмйд--1$2"0dНзЧЭЭЩЫйкдкмйаЫЯегзЮЫОКЌЂЏВВРЭСЕБЎБЖЕМНЖФЦШЖЊЏУбктт€пхс--*1AB4+WТтлУЫЯгЯЭЮззЭдуррхпмнйЩЦФЫЦКУТАЖЌЊЎВЌЋЗЦЫаЫДЃБКРОИЏЁ›ЏБ!&+0@P-%7}ЛКУРФЦРШдгЯааЪУЪЯЭЦЦЯЦжпзбТВЗЕЎЂ›™ЈЦдЫИЦФИЗЖЖЎЃ˜™—ЇЊЏ)0!28#)4<›бЛВОМРгзгЮаШбкгййнпзбЮРЛЗЕКЗЮаеРЫзЌЗЦЛДЕФабЧДЎБЈЖЩЧЛЛ#0:91.2,;F}ЪЧЎТЮЧОЧЩбппдаШЦададдбаЫЭЫЫепшштЭФИБЗСОЖЫййЪЗВАЕМТУЛЖ!&(*%%€—"8ЈчпЧЧЦУТТЛЪгеЧСУажгббУМШЮннрзллсйНЕЋЅЊБЧгаМЗСЪЪЫЛЉЈЌК!##*:47>GwзшмжЮЩЩКМТЦЯзЯаЫЧНММЧЯмрпргЧЭжЯзеШУИДАИЫЯИВЗРЦЭРУФбЯ&&!!".01-@NžчхнгЭЧРТОДЫЪгзЯЦЧЧЫ€ЯгЯджкдЭЭЫЫЧЭЛИМажЪУСШйЮРИЛЫжй,(#-"".(CT9kмєѓхраШУЪексххцкЯЧйдЩЫдкзллгШЮЪеезхшнЯЯЧЫжнутжЩТОУТBB7.+1&1)0OYSЅѓхйкррлтцщыцмйжлмтунгЯФФЧНЩЫЮЩЩкйттлзгЭЮзбеЭЩЪЮздЭ"?;44"094:hЧкщтрцшцуупзжлкучэыпбЩУОИЛШймкзЫдаЫазШЦУЦФФШФЛСФУа *%+)0%WИщюсцшшннкЭЧЯЪЫЮбнщткззЭЪгймпсзЪЧРЧФФТЦФРСС€ЇТОРШО$0MG.<43@[ЌїмУнсжйааЦУФЩФНбмкпмйдЧЭзлмпрсгЪЭЪКЕЕЖЛКННЪмпклге  (&5C3ANУхппкеадЩЕРЮйеЩКОТгрчнаЭЩЦайлйЯдЩЩТЗЅЇЊАИЋЄЦВЕзгЫ)!!$%"@GULЃюїнзннеЭЫЮрышкжЮлсс€ћбЩРЖКШжЯЩФСФЦНАЉœЁЕУИБЏЄЋЫЭТ(13!)")+$.•їїѕмкезбТЯжззжзЩЯлпскдЭЯйзждЮЪЯйжлаЉЋАЎЊЄЇЋЖМУЦЮ%&%(0!5GN0AЈгЯаелдЩЛМСУЪаЯЯаЭЧЖДЕЦЩбУМЛИКЦеруцжЯЦЛИЉЅЈБАЗЩЫU0(#((#%PA;F4oЩтпкмЦЪЩЦЩзнбСТШЦД›œЛзнкЫУРЪРМШжррсхмсзСТамжеке*!,((*! !O4%‹щїѓкаакушуннйй€QпяЭЭжжхйбОМИТТЮЭЩЩжущыщусжЪЪЫЯЭ;"%(%-A9MРщцзббЫЮеЪдссйллреФЪбееЮУЌЊЪптхсгбктшчлдкблнрй1,%)3..%!$%7(F\UЕттутЯШЧФЦЛажлйЮггеЮЪабжжШОМЦбзклйЩзйнйЫбдегаЪY.+.),&$-2+##,JH˜шпгеезЯЮЯбаЭЧЫЪТЛЛНЕАФЪЭЮФКНСИИЦСОУУНБКСЦРОИ0)4@?92-(;--3-C9MѓјэйЭЪУЭЪОЩЯдЯаЮРШЫЛМТФСЪжЭСТТНАДЛЧТЏЇЄББЕИК@44@112*)>8(+>M3*gЮящзйуцшужнххсйЯжлрййдеЧааЭРБЌЌЄЏБЏЄžЎНЗИУЮЮ5%478?7:3.01-$!1MA$MЦјђтущцсйдкскбЪЩжйкнрунзкезЧИДД€„ЖЎЉЃЄЋДЗЏЩзн‚38?B88310&#*;EN*\™трзгемчьцйбЭШдндЩдсхзкмЯЮЭЮайаЩЦЛУЫаЪЛДЊЗЪЮЩAWnL<90%$)%%9GABvьчйбЪСЪрраЪежмнгЭЩехцмзпсмйлглскЮЦИМОЦОЊŸЇАуBF@C80%#(+)+!;J&@gчярсххсймдйрыскабЭЩззЦФаШЦбйзеЦКОЪЯбаЦУСЅ—ЇјrL,(,>.?.?J(@F>"-ТїэмлбагплрсйлбгпсЭКОЩаЫФЫЫегЫеССФгЩСАžŽ—ž§ЄG9%)?<7(#$LYvSH-FŽшуггЧаслпзждзкусеЩРЫаФЖЕЗБДЖЛЛКЕДМЪУДЋЄЦЕ§Я]G?25+030+<0&0YLH;*^ымггбеебдлйнхщцбЮабгШРРМТЗИНЫЭЭЫРЗЗ€ЖВЖОЪЮЮ§п>T]G;553#%")9*.+aБнйлптайпмгдммбЭЪазммздЭЧЫЭЫОЖАЎЕЎЖКЖОФНЏЌ§ћz\[J8<<;AA-1<29ECEi{зљђлщцрпндммкежедбзекмкжжЮЮ€пРЫСБЌЊЌСбСРЦРЦ§§ЃSGF::HI>093-.2JU1>`ЊїјсяэтнедлйкпбЯаеддйтхрзтцкйЮУИЎЊДНТЦЦЪЮЧ§ћЩ9*A+#&43,*(+28Q.1‡юїѓюьыргушлкллннсрхтцщээььцтлЯЫЪЫЩООКРНИУћ§ћq7)3EGC>(040::%#-9ŸещштщьщкнбЯемрсхкрцпьыэщцмжмгЮлтцпйббЯЦз§ћћV~[GALH73(1288€Д7`]`ЎщлмщшэхннкпхаЦЮммсщьюёююьшуслмзпрстхлззј§ћ’[e^GAF?487,"*,@.G?oйшгмтжйнррщчсдТЮжущхчцтщччхлррмйгктчснзбћ§ћчrGO>EMI877.:325SJENH^єјчьяяюшьщлюючпжрыыьщзЩббЦЮЭеежклздРВЕКњѕєћчTI5;(9Bt4(+1.EQoYF?LхїђрчэющрчзйррпсрмкхщстаЯлплЯНЧЭФШШЭЭ€бљѕїћћŽgZCFC]POG1<ѓђтеейгжбкжпкбгмгФШШКЎЗВШЫЮбмсйУйххмехљјћў§œE;,-$(&$BATM:OЖљјэшпазлмбдухмршсжснлШЧлмЯУФгбаМЛЭжеЯлљћћ§§žPOZueJWU--YnPLNB!:єёнсмнсрзмнлксщчлЮЭбцкКЖЮзЭЮжжЮЗНжшЦВУљљ€`ў§œZ5+U\Y[G)52@@BHILPO•ѓєухцсщыррысапщнаЯйсшндЫблкЭккЫНгкєкВРјѓѕ§ћŸ;CAQGL:?>0285BHNLBBAjэѓпчщььшпзсхмдпсысннпзЮжрздЭжгЯннлмсжЧ§љљћћЖ(xY4A8BF;A8‹ѓїшхцщхщпсэшугрцссйгсщьрдЯТКВТЭкЯджУИЖћљћ§ћёaJžu034.301232<*4QŠјћёяюэщчцшшсшшуяяустЭптлйнеЫЫдЭШОЧЦЧРЦћјїјљћg,NIP)1+((-54.":(ЖєєрнзучуьшэышлйппкеЪзйпхбЭкнЧЦИЧРЕЗЗУїјњјњљёbL?,84-(%&--#B>HBКшлцтншыьшэёэьусуцчсбмбЧкрмемпнбЭЪЪаЩЧјїїФљјћe88+58.:A8*52>8FMWЊуєрЯееЭШблцыыээяющцсчхйЭйжбЫжмжЭзбФбан;Sаўїєѕюяяьюяёѓѓєѓђёєяяёёѓяёђяяђѕѕјѓяёђяђђюѓѓѕєё*&.,239;))-02H3JcWНўўђђѓяээьяьђђяђюёёююьяяэьэяђюёяяэђээшшяюяёяэю^)2-2&&730125779YBc§љцяяђђєёђѓђёёяяюяьяяёяёёяяэьђэѓяябшщщчцучшьCC>9:987+-027:A;U^jїўѓєђђѓёђёээюэююёюээЛёѓёёяђяюѓёѓѓєђёэщшчцшщь#"5;:0:7**199:<3NU`ЧћїѓѓяѕђђяђюээьээщыыэююяёђяяђЯѓёяяэшшыёьщы>5CHC>9725>?:?IOOZИўўїѓђяёђяёяяђюяюььˆэђэяёяяюьэяђьэююэчтрхчшщь211HJ>>95,,5?9;8NC[œўўћђѓяѓёёѓяёђєђюєёяёёюёђёьяяээщцущщшцттмртщыE;"97;858,39<9;IY;2oщўњєєѓєѓєїѕѕє€“ѕєѕєєяєѓђѓэыхтуцщшууххччщэю1&39@88<9215,);ELB2QЭў§ђѓєѕїїјѕђѓяёѓђёѓѓєђѓѓёёэяёьыщчщцутщьшшчээƒ!..@:>@:2*+15>ALQ5cЎў§ђѓђєђѓђђяёђяюяђёђѓјїђєѓѓёђяёђяђьщщжящцчшьаBYoNE<70(#(),8CFNJIўўёѓёђѓяёђѓёєєѓѓєѓђѓОєѓђяюёяээыщчцтрхEE@I>::2*",4@8LT8GnїўњѕѓяёѕђѕѕїєѕђєѓѓєяяєѓяђѕѓїѕђђеяюяяээшюмждўrM1+55A940(IV,NQH+:Ыў§ђёђђѓѓїѕѕђёєѕѓѓяяююэюяэюю€МёыяэяыюхтлЦзздўЅH:+,8CB.933QW{^O5QžўјььёђђїѕєєѕѕїєђёяёяьэяюьюыяяђяюэьшщчттђцжўЮ\LE:-><;25A5-<`SJ@,jўњюяёююяђђєѓѓєєѕєёђёѓюьэьэюёёяэьююяяющэюёяўс@UhOAF@92)*,7A9?9CQ~їўђђёюьэѓєѕѓѕѓєєѓєѕєђыэыыхђюььэцэьыыющяюььўсISb;AAC977Т05>PILMpЯўєђѓёѓђѓєјїѓёєђєєѓєѓѓђюёяяюэышхсхчшышщььшўў‚]cQEEI@;99х75:JLI|…шўўїѕѕєѓђѕѓђѓѓђёђѓђђ€ƒѓѕѓёѓєяєььшуущыщёёюѓэўўЄSCG@GIE>5,194>P`;EhВўўїѓєїђёєѓѓђюѓёђѓєѕєђѕїњїєєђђюэьшыщэьэюэёўўб>%@;8;;:<45148CY:3”ўўћѕїѕѕјѓєѕѕѓєєѕєєђѕєѕєєљѕѓѓёђюёёјђяюыэяёўўсm4%*8ILIE:739<;@-(0EЊщўјђѓєѕїёѓѓєхѕѓјѕєљїљјјїјјєѓєђђєїєєђёєяўўћ•V|ZGGнFE>;8:;><1*+1?@4BAwэўёєёєєэїєѕђщььђєѕјѕєїєїѕѕјјєнђѓђѕѓѓёћўўчtLSHJNHA9??778>QF>gœєўјєєшѕєїђѓђёющэђёєєѓѓђёёяёѓѕѓѓкєѓѓїђѓєѓњјўўx<4Bme^eЮўўѕѕїїшѕєїєђёђёђђєђѓђёѓюєяёђљїѕѕйєђїєѓѓјїўў”YbG>7249>B<73:G\ei[СўўђјєђђєєїˆєђяєѓѓєїѕїѕєѓѕїѕєѕѓєєїјѕђѓёњљўўЏ35,AYLZA>E<5731GMBћљєђѓєѓђѕѕјљїјѕѕєѕѓѕѕѓѓєѓёђюђёёѓёюэђээюњњўўЩP7QJJV|Q;GMSgZSA7OQўўїѕѕњєїјѕїјјЙѕєєїјѕєёяђяюѓєёѓђђэяьщщыь§њўўцBMOFWWra*4:7A?Z[LTMdўўѕѕїїјљїѕїђѕѕїјѕєѕѕѓѓяШєяѓёёђёяящыыьѓљјјўёWN<9->F<.&*7MazOM;PђўљїѕїѕєїѓјѕѓєєѕєєѓЩїѓѕђяѓђяєђёѓёѓяяђђјјћўў”kVN?BLh8"++1VLFM5OзўўїѓєєѕђєѓєєљђёђёэюшшКьэђёѓђѓѓђѓѕѕєєѕѕћњљўўJL3)>2.E4"**AjVOL7?Ћўўѕѕѓёѓђєёєђѕїїѓєєёэышшяьяяђђ€‰яђэяѓѓїѓјњћўўЁLBFLIC>@A:79ACLHLZAtјўѕїѕѕФјѕєєѕѓѕђєѓєѕђєђђѕђђѓђѓѓєюђёєћњљўўЗVSQJGCEFE7:;GJSJNHBtўўїѕјїїщјєѓђєѓѕђєєѓѕѕїєёђяёьюѓђђсєяюь§ћћўўН,~\@BCIA;:?CEJHBA:˜ўў€‡§њјљєјїєїєјєїљѕѕєђѕїјјёюэяюёяєяььшцњћћўўљeJ›t839;8<79:?<74V–ўўјїјјњјјїїљїїњїїјѕѓћєїїѕђёђяьяюёэыыэыћњљњўўk+PHQ3128+289;A?9@FNеўћѓєђѓѕѕєєѕМїєѕїѕѓєѕѓїѓѕяђюяёэёююяэшњњљљўў”8NMFMA<408EHCHBWbLIЫўўюэёяђђѕѓѓїѓѕєѕёёэѓђђїђѓяђёёщыёюыыщщћћињўўеJ]FCH<171+3SC;!+?)+ЧўўєђѕєѕјѕљјњїїєѓѓЭёєяєєѓјѕђђєяђыыююёьћњљњ§ўѕcM9-;<:3((*2554IGMNЮўїёёѓѓ§ѕїјјўїјјщїѕѕљєїїёёѓѕєєѓѓяяёюђяњљљФћўўm3<,9?9MG?719>??JT]Зўўяєѓѓяђяђёђєїјїјјѕїєѓёѓюђђѕёёђѕяяѓяё€˜IHJFOwwФўњчптщщѓђѓѓюхмжгзнйттргйаЭШУЦЯФаЯсщщххнйзмйегагрчюђѓђђыхPLG>C>A}ЪђухспмщчшыяыцхюьчрнлзЮШМЩЪЭблбШЧЧЪебпаЯйстлШЧзшыѓђѓёэюяLLGJ]^LEjкєэммлупсрчтцьђђюТэящпзпрзЫезШЦТКМННЦЪнушлЧУЭмкмаУОАУШF9@N[rF>MQOIAVgДћїящтнкдйжспчтцнжнуухсштчыюшхумурсжакцшнййшэулжжншэGOEIA?JSIWkP‚ьўўюютскуьёюѓєђшунчххрчэщыюэпнлцыэѓёэущстэёѓѓэхсжккQ\ILEIGLEWjuiЕўјщыёьёѓђјђєюхыщяђђ€ˆчужджнпслртяэєєэьыртьщьчхптэыш)HEFE?4FULL‚пѓјєѓєєљѕєэьчшыяяєђѓцткзЯжуяяюьттцншщррткскпнждлнх"0EAFH?B4<@gЩўўјєєѕѓяёрймлкрпяѓђььшхчыяѓѓіэшнйллнкплл€ийкрсййм:-225CccLJPMTrЛўѓкщяѓятцпрптйлрюыыцччхсчыьюђѓђчючлЯаЫдЯгжхэєёэюэL-)817GCTWNZmењёьёышштбмкщурзммхђёѓшслдшыёьцхткнЮУСЪЫЯЧНЫТЦчцтC8<539.>749[`kbСўўёыээыхныяѓђѓэхыёёѕщрадлухунпзспгТКЕЖСггЪФОУуцуIG@GBBJB7A?<@5AЇўў€ЁёщшюхзуяюцщцруыюђээьччшчцрнуэыѕцЩЩЫТСМОФайппц<7@E.9GAC>AP]eCWОшсшщюютгЯгйпрмйсуржЯгзттлдаЮдлщяѕђэцсбЪУРСЫЮзтхqLFE@AAB?;:a^\\H‰тѓѕёёртззньяужзпмбСМгчяыхмглмЯсчыьѓѓŽѕюнмэљэяэчG?EJBFLE5$,55GkQ7Ёћўўѓчшюяђѕяєёяьё§усцщёящйгбпнцпххыєјјїђѓщпсышцO>C?BBCC3..,-@;SC]hbФ§§єєюзннмдущьшуцчьшнуцчцнлмлщцээытышьыпщшшыснqJNP?HUJMNQLEG@LgLmёсмучнрпыщэыячрппйдзмлхукйрсхумнсчычшпклезаШдWWQZZMMGCJGFHNPIccwїўчьёьыштссмзтллнслжпчьтьыулрпушёящцыцчтзЫЪЫЮ;5MQS[SHSCTMIJMC]bkЩђђѓђёёщцтнн€ПажмкзЦЫЯгпзстмйнршщёыщэчсущюшьчкQ+MV[TPUHPTPNBLJNZbЕўўыщэщцучслппхлзббегасуттмезжбамжддзЯЪажмйлй9GWPQNLNMVEAO>L`U>cлўўєѕјјєыщёёычпрыыНѓяђёьщщырЯдЭЫЯаУИКЩдгЩныђ–*EPVQSPQEHH?LGTWjFqВѓёёыђёѕѓющчхпшычтьёёђђ€ щчущчшшхмзмссщйЫШзмтмVm…YUSNC9-1:GEGYZUUŠўћяшсзуђяхушыёёяурщѓєёьёёђђяёяёяшжгзжпйФРЧајTY\aSSFI:FC@CMEZ\@U…§ўћѓѕёѓщяыёёѕѓюушсуьютпнккшюьяыккрщчыхрсТАДўcLAQOQLIGG9]c?ZaL3AдўўшѓщхыёђѕѓѓюстёэшЯдкснсрхцчхыйгехкжУЖŸВЌЖўИQN4-HOSUTCMJ]k–o]FaЌўђсснхюђяяыыьђёёшрлуунбЭгЮЭбйзЯЯлбпкдФКлФЗўтp]WLELQMPLSH>M|jjO;wўёчысцц шыяёѓѕєёхшьчйзгеджЮнхшхшмдекгйлщчтўёOk~cMTYLGCB@BUPNGQaѕєчсчхмсщѓђяшђяюђёёђььнгдзйшснЪжжЮпхЭЧЧрр€šўєUe}LWSNLGICAGMVa``QuЦѕььюёщхёёяяьысцпшыѓььщылуцхйЯФШШЧЯбЯабегЪўў”qubWYZ]ZOQJLLPb]gŠ™їўўюѓјяёяшьяшыышщяёђюѕёюячххлуйЮНЦЩеупйтрхўўЗmU[^Z\`WJ.LHIMhvTUzУўўїїФђящёэђьщшухщюєяєєљѓєђѕщундУШЮтккежлнўўкO1UMTZUTJHG>9@HO\L[Pˆыўхѓюшяэђёѕѕёчжтщѓѓљѓїєѕљѕђѕєїѓящьяѕѓѓьёћўўѕ‡^kakb`]WPPFOVPm[QtБљўѕѓьєїєёѓяьштйнуђђ€ёэђэђђѓёєѕєяьюђєёяяћћўў„Ieb^ac]ee\STUMT…‚m}зўўѕђјїљђђёяяынхуюяыыюшййпчюђцчёэщьѓшрцчљћўўЈw‚YZUY[U[QUGIAcw|‚nбўўїѓђєёђѕєюыяёђьѕєхыђєёюяьђђѓюѓђђяєёёчяћ§ўўТFEE\pdu],UZUWGGJV^Y’ћѓђѕєяэяѓѕѕїѕёчлёшщщёѓђшьђєящшхчэьчееЯбћћўўйcOcWag”pLP`]~pcUJcdЂўўјљјёђѓєѓјјћјєёїїљїёрхрчукрщэщччзйеждм§ўўУїQ`iVjk„w;FIMILvueg^zўўјїљїљјњѓђѕјѕѕыѕѕљїєьчцчнтпьщщыэььаЩбдћћўчpaTTL\h›P?ˆuYZd^[LOUPi^SSQIЎўўћћѕѕїјэїєљёьяѓѕѓщщёѓјїщцеЪЭдьярчщрЭШ§ўћўўТu[Ќ‰L.OVNIFNEVTMGNeЅўўњћљћљїђїїѕїљєљљѕяђщєєђёяштсцмкблпмпрћўњўў‚}?`]eLJNBFHLOSTWIWUZмўўјєїѕѕїѕѕїђѕїљёѓёєїјєюёыьскммсзйзЩЯбћўњ§ўўЊFdcVaQLGCPZW[Ybjx]UУўјђруёєюьѓѓыёєїєѓэщчяяђёычлбжрпзучпЮг§ў§ўўТрVp`e[SUGM8BeYL4@P;8ЦўўђяэёѕѓїѕћѕїяээюыщсщэєёшшёяццдгаЭбгпћўћўўмv`NAQNJOGE@CGMJWT`^Щўюєёѓєјїљљњљјђђѓѓьёѓьхыэьђюђёшцхпцттћ§§ўнxLLBOYQ[ZOG:œ’›™˜žЌЏРУœ{v„‡ŠЈБЎЋЌЎИА™œœ’™ЌЇˆ‹‘ŸЇЁžБОФ|eV™gZNтгСНУЭШВЎЛЕЏШЄ–—”ЂЊЄЖЖДЕРЦИАЄЁЈЎž‘ЇЈ’ЂББЏТЗЄƒ‰ЁŸŸЈЗРЕxUL+,ебЫЦЮЯТЕБААЋЏЗСЧ’–ЅВЌДРЧФФТЭЯЧЕБЊ˜žААЊЗФЯЛЃЋЩЧЩНЃЎЪэмЏДймЫЧЩМ”SУамнслаФРТЦУЫЩЧМŸ‘••ЅЏЅЉАЋЋЌЎЖЩЮША—›ЁЇ’˜‡Œ‘ЖИШгЭЛИТМЊžДЕ—‘ЃКШРРУСТШСФЦТЩЩЦСНТШЕЏЎБЗЧжжШМЁ—Ž•ЇœmgŠŸЇЊ•‚–ЊЧЏЊЋЂТбРœМИЌКЧКЌИДЊВБДРФЮкмнйЮЪЩЦбзаЩЦЧЧдЧКЛНВ‘ŒИВЌКСжЯгнЕЏЂ˜žКВЃ—”ˆ‚„{ƒ›Ž–ЩЖ–˜ЕВДДЏУдлбССЦЛАЌЌАВЛШЫЩЌЄБВЗЦЮНИИСаЯЩЧЛЎŸЊЁ‡‹–ž•‰‡‡‚xƒŒœЈ”t}…ƒ”ЁМОУЫЯЩТУУЕАЅЋМРЩШЮйбЧКВЖЭЫСВЌБОФИЈ’”•އ‰‰|{•Œ‰–—‹›”Œ”œ~ww{…–РЩУЛМЖЊЖКООЏЋЃ›ŸЛРСКЁЂЈЇЇЊЗЩЮааТЃ”ŸДИЎЄœ’Ј’ˆЂžŸЅЇЃЁ›ŽŽ’™™ЄŽ‹ЛЧбдЦИЕЗФШЦНЫаЩДЎЅЄЖТВЇАДЊЈЊЎЖЌЈЄЈ›–ЄЁЄŸž›’‘ЁДНŸ”œ˜”—‰i|ЂЗЏŸ‹{ЅЎЕЖннжЦФШЫЭШЛСЏЋЈЅЃЂЃЂЌЏИСНЕЋЋЅЄЉЅœœ”•œЄЏЏЊЋЃЊЊАЊЃЏИИАЏЅВжхмђцРЧйЯйгсэьычпебЭШТЪТЗЕЇ‘›–‘”™žЃ™‰’‘Ž‹ˆ„ˆŠ‘”–—’ށzj”ЯОНОСЦЧЗЕМКАЋЌЫЯншыыьышслмгжггпИЄЈЇЁŸЈЎЌЄ—‘‡‹w~}‚‰’…‹˜ЉБЌž—Œ‘ИЦУФТРЛОЦМЉЉЕТелртхцхччццппррутеОБМДЎЛРЗЋЋТУВ–œŽ~uv{‹—Ž”ЊЂ›ЊБВЈЈЃЅЊМагЧКЏЃДмнждезмнсжЮЯдЭебУКАЌЊЌБРЕЉЇЊЅ˜–ЇЏŸwˆ|g…‡…ŽŠƒˆ’ЇЋСДЏЊ˜—œЁЖРВЈЂ‹ŠЮУЦЯаЮЭазждзлтрнаШШТАНЦТЛЁŠ™ЈЏУеЦМлбНурбОЂЗИœƒ|•МЉŸЈЈЅАУЧЭбЪУЂаЫЩТЖЗМЦамчюэумкмтпббгкзеНЂ™ЄЂЇЌИНЦЫгбйЮФРНМФ›Œ•™ЃЌЛЩШКЈЛРЎВВЇДЪЛЖЎЌМЮЯЪШЮжйЭНЏМЦдлмлдШбкнджЦМЎЖЪЭЧЮЭШКДУаасИ‚n‰ЌТТ€$ЗŸЌВЏЗЩРЕЎЦЪРОЗРШаЩЛЖИВЊЖИДЕЦгЫУОТОЖЗЖУТТЦУенплжЧАЅœœ”~ŽœТусШЛДЉœЅЕКТЩгЮУСФЪЫФЯбЦМОМЗБЎЛУНЗСгдЫЮРДБЗКИКЦЦТЭаздРДВИЉЄАЊŸЋВОаЯЮФАВНСЦЫКЅЋВЖМТЪзбМЖЗЋВМШЮФРШШЗБИНОИЗДЛЫрмдШУЉŽœžЊЕРИЕМЪЯЭУгегмбКТаЧЛММИЇŸЋИДЧбеаЭШагЪЯЮЫЪРЦЩШДЗОСМДЕЗМЫгйЮЦЖЋЇЂЄЎВИНШжЫОМУЭЫЪЫЦУЧезнпйШабЭТшумбЫмхчткегЮТЛАЅЇКдкеЩББЉžЈБЧЧмгЦЗЕВВКЫЯЭЮЧЋЇЅžЄЌ•ЈФЪЩЦМЕЕТатнржеезЯаЭСЭкЮЧЛАБТУЗРЛЦœ™ЊСЭбуьющчбЎ—„™ФРЕ–ŒЈрЫКЈœЂЉАМЗКУЮШРООшхпптсбдкаККНЖШШКДМИЕТОЗЖЕЕОЫдВ…‚‹›Є‘—Ž˜’{~|ez’’”’•ЄИЗКЫЮктмлмсЫжлЮйрЮНМСУФКЕЗМЕМЪЮОЊЇЖЭЮМАЛТД‘‰‰‡—ŠŽ”˜›‹ƒ’’А™™ЌЮНЕМЖЈЄМШЮадЛТœwЅТФЖЗТЭЮдЯТЪаЮЦРКБЖСЫЫ•бЩЗРЏЃЄВЭкЇВКРб™|‰КЛЊЉЊЄБСРааИЉЋМЯЪЯмЪчТ{~žВЋДСЩЮУТУСОЦУНКИИКУЧЧТЩОЗЏЉЃ˜ЅЖОКТЪнТСТСДЇ˜•‘™ЋЖЉ™‘ЌЦЪгаТУНмсЮЩЩ€ЖСЪЧИЖИФШНЕУЮТКОКНФЩРРЩФЌЃ™ž”—ВЖНШбдсЪ›‰••˜™‰x}r|˜ЋИсдбТМЦТФЯЫЛМШлгзеТЗСФОЧЦРабШЛЖМУЎЋЉЖВЏЕЏБреВЈЂЌЕЉ‘‡Ž|ОкЗ…vq{ЊЏЖИЊЁцслжЯаЧакййгЩФЯЩТФМЕЛФШИЛММНРИКЩлаЩгзпЯБЋЏЖЈ–ЁЉИШУСЦВЈАЃ‡bƒВЏЏ€”ёээышждаЦЮбклмрйЭРТЧСдзШЛРФОЪШШЮЮдхщраЧЧЫЫаСЖИЖТЦЫШВЊЌЌЏЛœ‰ИЎŽВМэщыцрмелртраНМОКОНЦФНЦЯеЧЦЯддЯЭЩбмтцзЭзбйдбЮЭЭЫШФНЗЈЉЂœЂ’ЂЪтбСЦКпттхыцрклждЫРЩгЫЯммллг€rЩШЮймнслзлЮСВБЇВРжлбЭИРСВЈЇЃЇЄЌЎЄЌЧдСБЗРОШЮертплйФТЭбждапчыцлйдеЭбаадЭТЫЩЩМРОВБДКЩззЮЦЩОЁŸЈЋКЦЪЭЧЪЧгЯМЄ›АЖНЦгжгейаЪбжбЩЧОЪжсхсмйнкШУЦСЕФРННШТИРбгйпнтццнЭМЧЮзлйЫЧЦШЧЛЉЊЁШЭЩШЦТЩжеЮОЛММЏБЛРЦЯжрнгхчуеЧЪЫжкмнжЫРБНФЗВ™ЈЗУТОЅВЦдзмкЭЫЦЭаЧЋœмлеаЫОУйтмемснкдЯЪЛЖЕФаблутйгдйгЭазЪТЫдеЭЛВАБЎЄ˜ЁЏАЊЇДТЕАМЪЩСВЎЉкппйеЪЦЩблнурсмЯЯЩШЪЫЮблбЫЫЛЛЯЮайзккджйсркЩОЗДЉЅДЮЪКЕНЗЃЌЃ—ЇЉ•™ВйпумеЮЧУЯймщтсредЩШЦежкзйсзЧУШЫЯаЪМТШдкййбШТБЃЄЖЭЮЖЏСЧНЌ™—‘Œ‹Ž™РТенснсмкхччшяымЮЦШШУРЛИОкрнмсйЪНФШЩЫНЕЗЛНФРРЏЊЖЕЋ™ЂЊЂŸЉЌМЗЂ’˜ЌМЪжбЪгйппнлмтштпйаФУЛМОУРФксухнЩЛИШЯгЧИЎЇВдлжЧКЕАЖКЗБЩБЃЉЏЌЌЇ›˜œаШИРКЭнмбММФЩЪдкнйбЮТАЎЦезбЧУЧЯЪТМОанжЮЩНБЕНЩЭбЮлнмлзтказнебкЭУжКЗЛББЕКББАА€,ЕНШЧЩЪЧЦЛЛДДНЭжЫКЎЏВНЮезлжкбЫУВИШклрцшыьщшщтчщэыышруЗЇЇЌЈЅМЧЪММДЉЕИЖМЦФЧдзбгййлеШЛТЭдкмлкзгекупжзкеббазмскпрщшэюьэьщЧЋЃŸЇАИЗЗЕЏЌЌЗСЮйрхццутпрммзбЫЪЧШЭаеййззжгЯжмррйдзггЭсчтнмпсууЏŸЂЄž—ЄЄЊЋЅЉЏДРЮззлежжгадкзаЮЫУУЧЩЮбЯЯЮЭЦОЕКНгптлгЧИЗЏМШЭФИКЦЛМУТЛЩжФЊЄБž—žЊЕЦгжмнеОЗФЧНУЦУФЩТУРМКНЩЩТРВЇЎЊОНРМЛСФСОССДД€№ЌЁ”’˜’ЕЦЭадкжгЅŸЂЏЕМЧеУЌœ‡žЈРбОБЏЌЏЗЪддеОЧЧЗТЦОДЏАЋœЌЗЗФЧУДЏДДИОжаКЧщтЫОШШФМУЭНЖКИНОБ”’}\HЉпнЮЪЕЈНЪджЩзмлЦАЖСФСИФЮЫЖДЗОЩЩНАООФЮлумзжртШЧЧУНЦФШЮбдЮТИВАЋž˜Ђ‘„‘ЕЋЄ‡‘ŸЈЫббЭЛДЗАЄЉИОРКРБЉЈЋ˜ДУЮеЮдлзаЮгкмййЫЫЯЭЮгдкдУСШИ™ƒŽЋЂ‰”™ЉЕМŽ‹СжН—›ЄЈЈЊЉВМНЗКАЋЅЏШхтспйжжаФСЩЩДыьйШЫЯШЭЪСККНЪШЛЏЄЖЗ‘Œ›ЂЕФЭШЏВЗ‹ƒ{ЏЅžЇЏТЩЩТИДЗБЛблюхнгЮбЧЦдЫФЩУЕСФЖСФеФЪЫЧНЖЖИФгжжсЮЖБНЯЭОЗЊˆ˜Œ‹•––‘Š”ЃЈЅЃЁЈАМУЩЭлжОЂЁЎЖамЮЪЗДНЕШЧЭлшчнпнрнЮЩЫТЯзаУОСТЗКССЪЩОТИИМАЃЉž›ЅАИЕЛУЩЫЮбЮЫЏ›‡’ƒЌБЏЕДЗЊœТЦееЮзкнкусклручулекймнкзлдШаеЪРаяужЩКУРбййЁкжбЛЄœ›–™››œЋЖВИМСВЃДОЧЭЮйпхубФЩЦЦаднснмущьуннхйаЮджейдЯЮзпйжгдЫФЦМЌЉœœЅИФМЗЖИЧекзпЧЫдймушрчтммр€ЪшсхупцчнгдзЮСОЮкскгШЫЭбкеЩНЛЛМАЊЋДДНРББЈЃЂЉВМЩЪЁ{ЧФЯЯдгкмгжнплмсстсзжгЯеЯУВКНЦЩЯпрйгЪЪкдФМЖЗТдШЕЎНЛОЭаЪТИВЊЂЃБЪʘСжЩРРКЖННКРЦШЮлркмстЯЭЭФРРЮзкаЪЯЫЩШФТЯЯНЗЗФЩЩЪУИКЦФОТРЧЦИЋŸ•™ЈАЊ‘ЉпндШЦООФЧЭШаЮбжзбЪЭФЮЯЩЩлбззггдкЭУКНЦОБЉНЭгЭЧНЛЖЛШззйЪЏЃЅ›ЄЏЄ” шцунззмйзбгаддартсщь§ёмчррйдФЩЭЪДАВМФЪЦŸ™ЫбНОЌzVQ[SPIE@B>FLOF;1ххпззйкйдЯШШЮалєчщчхццьщццчрнкзддњгбЦНКЛЛѓБРМЎЄŒ|nGPNFEEцIHF0?:кдгйнрхцїљйЪЭЯЮбсууттрѓсцчнззнумзегаахЭЩЪЩаž~hV~•ŒoWL>9#1#(+$*%&#1@FF`L,  &#**$%(#" -(5;4! *($*##0G104 #+>>J%+&%)+.%&;T20%!#(1500.$"!!#,9MF( (400€š%308+#+*"$#%+" 09!"%)!!01.*)082.&)+&2&,81.85#!&%!%+%-)##0)-5)3-#$,!-%$?O:1$$2(!!€%#".$)3$"*(,+.$" —p@A:3@$  #$-"##$&*$;-%$&%##.)($ШЁŒ}S7.&)?& &# ""%%$""4;7571 Ж—’ЕЕ•x[2.>;(!4PFBF$"I7&,*!)7>:3.-"  —Ž’ЃЛЕŽmTB (.*&0>39<@#") %)"",2-% ‘ЈВЎˆmexzmL34)!+011&$%$$   .*(1!#БЏФжйИ”u}‰cchY81E;!,0%M-*(*" $!,+$?HZF9+*ОСЦЭеКЈ‰x{n{`OSnhUIN50UE3)#(!!!+024%%17>;5-34:2*,!0стЏ~}ЖкеУžtP![‚}‰„ސЂЃ˜’ˆ„„rgUOB7&,3+-5":FBI}„H4GZOE4<%чтСˆˆМжпгЪœr|mct•˜—wžФУБЁЂž„khchjaP\bEPm„ˆЇ‹`ou…ŒŒ”|igYv‹~k]NJАŒtqz‚Ž…wugddTZni‚ЪырЧИЇЄ™‚{naVMSSWPIOYPoœur„…•ЕЊ—}[m’‡z{zpŒ‰‰ŒŒžž‚…~ncd^dƒƒЭЭЕАЉЋКЂ•ƒwjNL[Z^YTSW]`u„v{‰|ƒ‚ЅЮУЃŒ‰Š~‰–™ЏИСОВ”‡‰‹…„pcZUr„ˆЭбАЂ–ЋЌЉЃ„‡Œ}ˆ‹gm[TUM4dމmrxЂЁЏНБЩгНагСБЈŸ‹ЗЗНЫанЗŽ’ŽЁТСБœ”ŽŒМхФБЃЃАЉЅŸ‚ˆ‹‚qnggUdS%kž”Ѓ‚ƒЏЌŸВЛРЛБЉœ„cnЉДЗМЛЏЅДВЈ•–Ђ”ˆz…ЁБЛзЮЏŸЂ–Ž™Ѓ…^d``ckiuЁ~U‚›˜™—˜‘‰žЂЄНдМœЃО˜rqtЖЗТКАЕœ…ЌЎœœ™›БЌЯгщйеУЎЈЄ—Ѕƒ[h`]dg]gdc^‚˜˜œ›ЁЇЌМШЦКЅ‘”››’‰•‹{АЎЗЖАЇ”ЊНŸ•›˜ЅЗЪяёяЯЄЌАЉЈЅŸ‘xwjghdkeemkƒ”Ÿ—‰–ЖСВЄЂЁŸ˜‘‹‰‰ЅЅЈ›ЂЕДЊЄ›œЁВЌЎЇЏЋМЪЄ™œЅЃž—ЄЕД’ˆЂЈ‹hgqrjcejŽМœ‹ƒЂЂЁœЂЅЌЏЁ~ИЈЌНСВЉЏЌЃЏЗРФРВАЊЄЋЏИВЈ›ŸВЕЋЄЊЖЎЁ‘Ѕ~d]jtpkkivˆ‰ˆˆ‘™Ђ—Ž’ЋЛАБЗЕЕЊ—лкбЪТРМКЛЪеыыеЫБЅЕККЋЉЇžœЂЇТеЎ”žбЊ~u„qttr‡‹‘ž™—’”›ЄœŸЉВЋ”ŒЩЧагЭампущыхмгШНИВБЖИЦОЗККЗАЂŸ’ŒЂŠ~}zoo}…Œ••œЈЖМЗУН™‡zŒ˜™ЂœŸДтлЯбршчсхйеЭУТТФЩЧМДВЕЖСЭЪжзмУШЦЕЋœŽ‡xtu|~‡—ЃЂЇВЭсзёмИЎВЊ™—›žЧаЭдхцхсрлдТТЪТВЖСОУУТЕБДФЪЮЫФЪЦŸЁŽ~x}}v{…Љ™–™Ž™ОФЛИЕИРОЎŸЈЊЋнлмлйжбжсмбЯЫРОЦШФЩЩЫЫбаЧЛРНЛЕИЂx…‹„„€•u{{ƒЇбЧЛВЇБУЦЛРЯЫЩЫОНЖЕЖИКМНАЕУУШРББЫлжЧдмйУЗТЪЩОКЮжжФУЗ”k{ˆ™ЄЅ…zr–лщСНРРЦФЩЫЭдаЯбЩЛБНЧЈЌЊДТЧЛТКААБЧдВ—ЃЁЂЖЕЛКБАЗБЎВАБЗ™{ˆ‹Š‰tdt[eЇОЦЧЦНИЊЊДБЕЛСЧНЈ˜ЌТИœœЊИКРОЪЪСРУВŒ›БОДЂ›ЌВЈЃЄЃЕЛЉ•–ЊЋЖОЕ‹qi|ОлФЗБЎЌЃ˜™™ЇЗЕЌЈЁЎНЭФЈ™ЂЊЏЛТСВЂАТОЗЄŸЂŸ——…ЅКИЊЇЅЃЇЊЁЇžЅЕЪН„–КЫОЊВМИžЂЎАЈ—•ЃЋЄЊЖТРОСБ™‘––”•—ЄДМОЌœЅ›™’‘ЄБЩЦЉ—•’™ЅЏЖРЗБТВЊЕЉЃ}r|Š‹Œ–ŸКЯЅ‡”›˜‘ЊНОЏИБЉЌЎœ—–˜—•ВТСЋЃЂЈŸœ˜ЇАА”tn‹‘›ЎЕЕЖМФСЕ–ŸžŸ›œ’˜—”ƒ™ЉМжЖЖЏ’žБОЎЛРШЧЛЄЃЁŸЁŸЄЗЧОИБИБЉ—Š‘Š‹ŠŽ•žЎСЛЛФмрйВЋЏДАЉ…”’•КЮЪНЌЏКВЈЁЁ•˜Ј˜˜ЈЛСМТЦЭЪИБМЯЮСЛЛНЛЄ‰œЈЉАЌЎКМЩЏЄЊФйнзЮЮзЭЛАКЭТацзбЪОЏАЗНЏВА––ЋНЃ›žЉЕЭйлгУУЛСЧФНМакЗЕЇ”БЕЊЃЉРЭЪСЖЕЖОРКДАЇЋЉЅАКЧЫЭбЮЪРЪкннэьужрчЁЇЏАЕЋЇЋЎВЖАЃЄАОЫжнлежкеСШРИТЩСЧбжгУДЊЃЂЃœЁЉЊЂ›ŸЇЖЧжтхтрмпхчч§цшЌЌ€ŽЉЊЉЌИДЎЋДКЧЮЭазйзаЭбзЯШЦМССРТЩЩдзЫЛЌНШОСЛСЧНККСЦбтшчттунтчшхтУЕДНАЎЎЌЗДБРепнеЩУЕЖРКФбзЫНЗЏЄЋЛШУЪШЕЎДКИЕБНТРШЯЭШНТпртрмйжкнлгОЉАЁ™Œ›ЋЏБМЫбЭегРР€ИЕАЛООЛАЁЂЄЋЎРЦЛЕЎЌЏЌСЮаЪЭЧУЪЗЁЃЋКББАЌ˜ЌЋАЛДААЇŸЂŸžЈЋЏВОаббМДЛажЫОЗДВЗЕЋЂЅЊЏОЫСВЏЗММРЫдтщФЏМК•ŽŽžЁ™ЈКВВЃЈЇЖБЗРТМЗКУЪСЪгЫЯТБАЏМОДИЩЯббЫЕЏДООТФМКНРФШФбркЪЎ™——ЭЅАЏЊАИТНЏ–ЂЇ›”маЮЪВЋБЏ›’‡ЇС‘›œЌЧЦЧжйзЧСНТЭЮЯШНИЕСРР€ЂТФЦОЊЄЎДБЏЄЂЅЊЅ›˜ЦдЗРЯЧЏпкзЪВЈЎЋЅЊАЄ•—ЋАЈДЗЧйтхнркнкпжЯШШЩИДЕДОЭРЖОБЌЇЊЕЊЇБЎЅŠzŒЉФЩЉ—БцтйаЭТТРФЭаУАЅИЫЕЄЎРЪймсрссйЮШЪЩЭбЯШгдШЧСŠhНЭЖЄЏЏЌœЄЉŸЂ…‚iqЃxŒпзлпкллмппўдЭЭ€•ШФОРТЪезййжкмйдгдзннЯОЛНЕЋŽžЮаФМЗШУЋЌЎЎЊ˜‘—…‘ˆˆ”жйзгЮЮбеежедпчцпйзбднкзежсрчццсццччхскйкзжппрмпхуреЫСЫЩЪпп͘ŸЋЇЏВНУЯббЯЯЧТУЦбекнтнкйрчхллтшшщыщушщьщщўцыыќэычщщ‡хнбЯЮЪЪЫгШЕЎЌЏЉБЩЧЩбкжаРЖЖЛШЪгмкнлйзйпсжЯлтцччцнптцччьщшщюьыыщшцстрпртууспнлзЪнахулрцнаДВИСЛРЦЩФФТЫдггСКЊЊЩжрпнддлсчцухчттЧрпшрззржйзснйлслезжаВебЪнсуйЧЧЩФУОМНЗЊЁЇЏЎКЖЛАКНЗФЭТЕЛЩгзз€šнухшцхытнкдбЮедждЪШФЭЮУЛНШЊЌЎЖНООЧййдЭМЉБКЗВЖЌЅЊВЕММКЖУаЦРМЗКЗИЗМбсучсхцплдгзцщплгааЫМНгмйЕЛТОЖВСетрйЯСУЮгзгмэякпмчьылЮЭбдегЦЛКБЖЩЯдбжкнрпгббнчыычыщшмкпйнЇЋИТЦЗЗЭкрхскбйжджбхэьычхупзКДББЛЧЧЪШЫФФЭмттнстххпжЯейтуыыьыьээч–œЋЗЖЖАБЕЏЛЯнгЮбррхьэуммлйеЯЧЗЛЖСднхеЪЫЦЩЭбкнлклпяшгЕЩдзлпшснпрзЂЊЦЦФМЕЕНКЛУЮлушцлмтпеЯбУИЦкцтраСФддзпбФФЯгерлЭЛЌК‰‰ЌЦбЫЭЪмухцчнТЏЛЖЩЭЛСТНЛФЭнрмЭЎИУЪУСЧРСЯзкзддабллмлгЮгбЫнхщусшдЋЕпрЮРИЫейезйжƒ‰nu”™˜ЋЧЧТШЭзпуйбКЄЌЎЗЧМСЭЪЛБНЪзжгЪбсусйСЖЯнлелтлЯглдЪТМЕЖНШЩРУoM:wЇЉ‰ЂЈЌЈЌАВМШРМЛОЦЩекрлжждджбЦКВЧкбФагЩИИОЛЪаезЪЧШЦБЄЈЋЖИТаЭжЄЃŽqŽарагЛЎЊЅЄЎЗТзйгЭгЯжунжленкЮŸЁЈЋЌЎЌЖЦЦСВЛЫЯгдЪФЪзгНСФЧЩЪздЯЯЖИŸ›ВРЦДŸЇЈЏВКЮбЫЧЩезсрусрлнйЖЊЎДВЖВНЖБЎЄЄЈЛТТОЛСЫлеЪИЕЕЭезкЯ€ 530((\G-240078?HB:;BAG?@73,3759<9:>>A;5:B<@BCZC@@F>,)-,(24?>EGEJPZE928?940?AC8-..7:+)39@@€Х?3+024:CYITN@C3+7B<9:7232..:<7<83+33912451021.*+&0A@:-&*13,:997480.-++.8;FG,(5035@A>5314<:59835>7.2573*+,!%)-44..9@<9)147789?<58150(127><><.$#25:9C>507>7*)1584941599772-,)Ц’\PMISA$)+)-,.-# 2+-##"$1)*2*+3530-&)128740&.38.0,20390343-%ђжРœjQI?5H\C.5;+$024$$%+%$"%17103,,#!#$%-("+*4537457:40-)+!!чаЫруК’qLI]MCGTg\V\B<<-9aQ+0::9)(#!#$+(+&(+.8@;451,)(,!#зггкэцФ—zZ3%8AINNMQNOJFBN`E9>AA<<731..%$(*(+-30)&-23+(-&+0+абщёцЯЈžОУЄt]F;FNQSNLJB?CGA:@CFC<>?>1250,*)(&)1*28E94<-0.+3(5<8шьыљўєзЛСЫДЉЋЃ}uncNGL;>ZLE>CGHE@:@>?9;<99;4107>50+BPUbWEC79835:>яэьыјьшЮРОЖТЪЕЃЅИЏŽ‚xUZpaMC7;EA343>;2?@?ёялхуьщеШОЖЗЏЉВИЃЋЄЂЧЦКВ‹w‰œЌŸ…cCA;G;FOJAELt]L83NSS€]PAJSV[J?BA3>93?MGTHJOPLI9?CMW[c‚gH13.?5EHJCA5.93@,42C:>2%VQPG<8+&78I9FEB@C@HJhQ?NPC:)?.55?:FEBOQa\M595BAFE?;,11@@Й9H?98OcFB9A.70;1JAEALFAB:BHA95E@@HCB*,4*74@NWYVJL<,;OHL9*3282<9@?E@9:3AA€!@?7?;58911*A5@34?>?9B9@9,F78400&&88LU>*B57BB>:94>E?>:?;<@>27080799:?HJ9B+747;5:;<:529:C>.814>>AG:88?702AC@7..Д‰WUPaTH(74%))44)&$-7.2.%%8441-:<8099-&&-.ABB4<0<:A885BB;77;52$мД›ŒiVLE4NcJ1,?%,)#..>,"!(;;8710-&,8.##€ж(*-15<:>>9B?E:<443%1ЭЏЊЦЭБ”tMLaUCAPj^[^C9A3B]V9*?AF>&"),#%%22?)*&+58JMEH54">%$30ЌЈЃМаЫž}eY1(7@CLMMFLSTIOVeI801-(&,ЈЊЦбРЃztœdJ4392-1%2?-?3BLC:M05.2-5+>@ЮЧляђжВ‰’Ђ|w{uUM[VM>EI?8:>B19-1>>@99CE>?9F[\r``IH;9;+:F>:;99ONGMGLFJPYYZ^aTHGNF592ьтНккбЫВ›”ƒp‚‡mvqz›‘–m]n~—‹uQ24-33BCB>FLobU>>S\PQLJISTO@5EC:UяњЩ—–нїђхШВ‘e8n˜—ЉŸ—ЁЈЛНБЅž™ЇЂ—™ˆznc^PGABJAOM<->>9,)41-8>?8?>AB929?CJBGCA#+-+-7)*-#*24AA?CCFHIJGBEIJF?2,)*51*<<й3258;:7,8@ALGH@  &1,8C>.""%(2<<€;@HLIMIB?<<42-*)-1320.**82.1@<40BFMPSY""2>FB95-*&(%("%%#082;FM^@,754,#%*0,1($+&137?9@BC8?CGIMG;+$(.9GHB99,"&(+-.013*,8FVLC,159;.+03.-")1?;915:?IEEщHNIJJLJ #C-4>@C>B>50**€W.-0745:;>?EIFCACLLGF<534;9<@83??@?4EJHNEEFBAC+972>43(&%!$3*1225>JB7EIG@<5,435<72;>CHHGFHJMIONGHBB 1%03892-,,(%+,15021>@GCE955;@EFB:<8>99<97E4>AG>F?GFFHIHE>?>  &3;:@7;::A@;2)-977;CG@5$%((2:;1.2.*3@E;; 9303JHC>>@EBE.7>?95C97FHOT`g :3(5-5?>8:>@H<35YGAV[YLB7G]WPC8HL:?FFNJG%,35A>8C>9+9EJPLBF48BWUG;5%-BE7E@GC?OHA:<>@W^aeg[[na[Yz~–—4&.MIETB.39HQYG.(9FMqq^UT]huv|•œ’…‘БЎЃДОСЊЊЂœЉАМняєрЧЫФЌЈЛЛМ:C**PZ@HOGinU|ЄЇЅЄЅЃ—ЁЮзпцчуеТСЦкйзнЯУЩЪШЗРхшмЭМТЯФЪехуЪСМКЗЕУЛЉWmjTmvkzЈЧбЧЛСЄЁЏЛТнпкуцеМЏЕЗТЩЩФЩШММНИКИКТФЦЦаЮШТНТЩЭУЗЏЇЉДНЖЈe]Vbz‰t[]РУАЇЇЈ’‘—ЊЛЈЌЏЇŸЁЌЗИАЏВВЧЫЩФЧЦТШЭзжЭФРЪЮжлеЫРИРУБŸ˜‘›”wkipdzЋНВ‘•’‘ˆ•”—Ђ™”ЋЄЁЄАЖКУбЯамтчхчтпдРИРФЛКФЫФНВЉЈЌАДЌz}}pmoˆœ‘‰ЁДБœ•‘‹‡Œ˜žЇЃ™™˜•žЁЄž–œ’””’ŽЃЗЖЅЛбНИИЈžЄАБЏЅžЋЏЎЌЎЇЄ|ƒvhjq~АИЈЏЈŸЇž›ЊЏАДЄЁЅИДЄžžž™—›ЈЕЛДЈЁЁ€kЈЏЌА–’•žЊИЄ˜‹‹™Ё‹Ž—oprnor‡РЫОЗБЉВКДАВЈЂЅŸЄЛЩУЉ˜—˜”—ŸŸžЃЁ‹œ›‘——‡~Œ’˜›Ž|tr\]`‘rmiovet”ЈЗЗœ™ЈЎЅŸ––‘œЎВЏŸ›ЂЇЉЊЉЇЄЂЇ˜—›—„x}”Š”ŠЏЛЏ‹ƒojwŠКЧŸ…ˆЃЂЛО—w˜ŸБИМЏЏЉБДБЌЈЊБгЪžЈЁ››˜™ŸЄЅЈ—”Š—–‹rZhŒ–g]ndc^az–ŒЉЌЊЊŸœ˜Œ…ƒ’žžЊЕЖЊЏЏББЉЌЦЪНЈ‘pЅЏАЋЁ›—˜œЂ”’”ЇžЁ}w{‚‚}xv{~w|‰~z‹…—ЁŸ˜—˜ЃЇЖЉЁЅЉЈЉЗЖАЈŸЈЋАЩШœ‰˜ККАЂ–‘Œ‹”——™ЅЊŸ•ˆŠƒvu‘ˆ}ˆŽЇЗВЊ’x•˜ЁЊЌž”˜œЇЏЕЦгФКЏЊЉЋЈœŸŸ€д‡ƒˆ™˜•Ž‹›ЈЎЊЅЊАЋЊ—ЄЋЃœЂ›ЁЉЏЎАФА™юшыђугЮЌАЕЇЂЎЫЛЊЉЊЋЎЋЅАЅ—žž”Ђ›žЋМОЌБРЌЈ••ЂЄЋЕБЈЇАЏЉ›ŽŠ”ЇЉЏСОВЋШИКЛИАДЖЋ™”ЄЕЏЇ›œЉННЕЌЉЏЛШФТггзддШКААЏЉЇЋЏНДЇЂž˜—–‘‰‰’™”‚ŽrzБЏЏЉЅЈЊБЏВЕКМНИДЏБЛТУСШЦКББЋЇКТУСООИЗЛЗЌЎОЕЎКАЅЅ€⨘–’ЃŸ˜Š|Ѓ™Ќ—•œЃЅЂЁЂЁЂВРШЦЪЧЗЕРЧЪФЖЌЊЎЏДБЌАИЗСЦУЗЋЋЂ›”‘—ЁМРЛЗгеФЛБЏЃ‰—ЄЃЈЂ’–’ЗНАЅЅЁЂЌЊЊЅ™œЈЫаЎ•ЁЂ––—œЋЖФКБЕБАЏБДЎЇЂœ›””›ЅИЧЧЛЗЕФзнѓцНЕИБЄœЎНЮцдУТЯНДЏДЛАƒŽŽ™’Œ›Ђ›’œЂЁЂЇЅЇЈЅЂЏЏЊБТСЕЇЌЌЈЅЄАЏŸžЇЗЧНЎЌДРЗЊ™ДЉЏЭЫлОœ•ЄЂЃЅЄ‰„‹’’‹ŠŽ’ЅЇŸЄЅœЃŸЁЅЊВЏЎЌЅЂ‡ЁЗКЄЂž’ЁЄŸЇЅЂЇЄ”ЇЎЉ––ЊЅ–™”‘ЁЌž”ЇЇАЗ~bwŒ–™œ–žЄžœ˜Š‘žЏБЈСУВŠ‹Š‹ЇЉ™Š‰ŽЈЉ›ŽŒ‚ƒŠ›™›ŸЏЖАВЊВСОРСВЎЏЏЕ›o|„’‰Žˆƒ‹Œ–›‹t}ЁЊ‘Œ‹‰ЂЈ›–˜ЉЌŸ{zx}‡–ЃЊЎЏЕЕЌЏЕВЇЁ›ЁЉДА•ƒ‘Љ˜‹Œ‘Ÿ›ž•…‰…‚‹•œ—˜—ЂЈЂ”Šˆ˜Єž‘Љ…ˆƒА™’ЉВСС€&ЕЂ˜ЉДДЈž˜’ЁŸАЯВ—ЋЋ‡z”’‹Ž‰™˜ƒ}{ˆ}|…‹Œ‘›™’™ЎЋ‘АМНДŒŒ’”‰‰™ЅŸндбаЪРНЗЦСТНДСТШЫБНЫгнЩ–v……‚opvux}ŠЗЦ›ntŠ‘•’™ЉЂŸЊРЩбАŠˆ‘‹ŒˆŠ›ЁЇуххнаФРУЪгкжЯгзгШИУЯЫЗЎ™’ЉЎˆzu|›бкЂzvŒ‡ŒЅЗЖБЌЏКЅ›ˆ‘ДЋ˜‡—ЊЈЃчшццрЮРЯмчщсзжаЧЭЧНОЛОдЩТЉЈЋЁ™ВСВЃЅЎБАИЏИЩсюйФТСТСТЫжШВМмсЦЏЉЈЄсрппнмппутлзбйннкйаУУЪеклЩФСМДЎЉЏАДЖТЯзлпрхцхнпжйжздЫЫЩУНЦЮЫШУСУЛРЧЫЫЩЯааЯЯЭЧШЩУФЮЭЪЮгрШАИООЕЎАММСЫШаейххцхпнйаагдегЮФЗЕКТРМКДРТЊžЏЖАЛЩЫМЕДАЌЌДИНКИДЎЉЃž—ŸŸЁЏЛТИЖУЦблмпкжбЯЭЦФЫЭУФЦЖЃЁ›ЂВЖЋž››Њœ—ЇБЗИЫУЗ‹ˆ–›ŸЈНШРИВЏЉЉЄŸЅЕА’œРЮагазеЫЦНРОЗМТРУШЦМЖОМЖЖЕЏЅАЖЎЊЄЎ’ЈКžЅ›–‹Uw•›ЂЊ•’Ї‹~”ЄЂ›–Š”ЂЈ’ЉКНЪЭЫааЦМЏЊККУтнЏЗЭЧЕЧедЫЯЪНБЄ™ЌСшЭ”~‰wb\…—’˜ŒˆŒ——‹„’›ЉБИМЕŸ˜‹”ЈЭСКСЭгбИЏВЛЋ™qG{ЌААНРКСШЧЎЃŸЂЉЇ˜ˆrm…Š•—’•ž—‹Œ•Œ~xz’ЛЌЎА›—ИЇ›ЁОСОЦШБйМˆЈДЉ”ЎОДБАЇЇЕЛРШЪЮУЖЏЊœž—ž˜”ЭбЂЄЄ•‹”‘…’œŽˆ—ЉŸŸЖЕ’rkzžЎЊ•АООЗР™‹ЁЉЎЋЗРЎЂЁЇНШФОРСЫФБЌ‹›—‘ЌЌЊ™ŠŠ‚Ž”˜ƒ„Œ–ЂВЌ~}ЊЕЌž–”Ž‹„‚c`w…ЃСЄœЉЊЁŸЋЂЅЉТФЖЧЫАЂЃ•œ–‘‡xuz‚}}u~ЌœžВЕŽpx‡ЄбЗ}Ќ‘trpx{„xw}„Žž–ЄВЛЅЃ‘ƒ}‡‹—ЄЃЉžЂžœ™Ž{|}–‹‰}ŠЉБИЖСВЅЃЕЛЛЖЌŒ‡‚}}‰‡~}„‹œ—”Œ”’ŠˆŠvxzwu{}~ˆ‰ЈЗВЈžŸЃЄ’•›”Š•ЁЄЦлБ˜’žž˜ЈДЊœ™—–Ё•ЋМБЈžž”ŸБЂ™ЄЌДž–’Œ~z‹‡„ržМДЎВДЊЄЁЄЖЇЁАЉЧЧВ™ŽЅ–ЄЗkŠЅ’ŸЇЈЈЎЏИКЗЊЏЊœЄАТСС€ЕАЊŸ˜—‹’™Ё„z…ЖЏ›ЩСЗЖДДŸФЧФРНРСРУжумйнЫЮхшРТкЕЄЌИШЪЭШгаФОИОЛВЏЅ˜’”—ЃЂ–—ŸЂ˜™•‚gwvqЯУФШЯййгзмЯбаЯйЭдлнстсхсцйззЦСШгпрнйздЪШНИАЂž•’—ЇЎЊЌЎЌНта–›’‡пммлтрмртсскнуукйжкпхьэшштпмеаакцщцумеЯЫЫЧЕЄБЧОАЅЄДЕОМАВЇЁœžЋЋЎтрпшцрлдЩЧЫбкспйбаЮбегейзмкемнзЮаЯагаЯеЭШОДМрэђэйЎЕЗСЭйрхёшуаДКЩлжбсххцщужЩЪШапхлдШНФЮжжерцтщыцпжбзкжжкмнсхээяѓюпЭЯШИСдадпнппйссзгзкдекйкмзТУабдегпунхьчццтйземчыщсдбзйамушыыгщхннртстзТЛЪЯеккеЯЮЭзеджлжннлЮРЭЮЦТЫШЯзжджкнппшдзктцлЩжплЮЯЮзлсрййлЯЮЭаа€”ЭЪФРЧйсеШФЦЪУЫЫекрщслгЦМЧТРООНСЧЩЯакрщыухрмеЯйлпдеЭУЯпухцлгЩЪблйгеаЮЧзхлЮдЪЩЧЦЗЖРЪглЩУЪЩЮЫЦИЕМЧжллнусцутснйжЭЪбжгЦОКЛЦЯЯМЖООЭнукежлпнмЮУЦжллдМЗББЖУЫЫ•ЮЭЫЫШСКЗМСЭЮемсучсЮЯЯжнмжмйдздЦКДАВРЦИСЫййагкжЯЭЄЎЖЦЫФЕБЎЃАТЧЭйждкммлждЫЯЭУШЫЯЭЭЦТЧФЦамусххрнаШКЗЗСЛЖВЕМУЫззњбггАЅЈ12974?^NICC?*B+-;;??>;;8;?9:;5@FIBJLIFACIIGMHC@?BAEBAECEIS[WLIF@.3559O]MFB:9:52.-,09;ABAABCHLFHPNFCH?A@C@8;998BHCCEF€2BAITPN@BG,378:4?;;@<;<:72.-157:BFMLHJOMOQNNPOIGEB:4802:;A;98@B?F?:@B>ISTYa2,271.7:BHH@448::488:23.9><>@GSdH4>@<983.,1.3.3>??CHJLIBCFHLNHIJ*&49:25;BH>8741.03:<:-331212EF@<989,479@FEGGJNPOJLML#,5L@<;AB>587011342758:><99AGGB>;@HH@;>;;CЃBA?;AA>?>HMMOHBCIG($379:3500.*.101,87::BC95?@FCA>EC><:@>79??>?>ECEHIHJLJJIHE?BC#$)-;3.07422‚4..204427:<;AA@;<;><>AA><8:8;:>@@9ABA;EBE@CGGFE@?:7+##**2!0CBCBB@AA>;@>>7;??BEBEGEEGC?CEEBFCAA50%4MQE:]MJJИLOFJGGIGHBGJFHHFA>?@EIGA;8APMOBB>@BCGLLCJLJOSS€ЭJGC;@EGJFMZWOG0Hd[NdggZLCTd`YVJWYMLSN[W[@<@@CGLJJNHEA@GQSUWOQWMWjbUN;8EOJCQYVJF^WNIFJTdkjj|oh‚wq}–КЋŸЌРТTI<;@FC^cWeVAFNbhi^CJSZb~mb`gu‰ŠЃААЃЉабУбсхгеЫЦглчњўўјщїѓсмчяыii]JxŠbexr’‡ЈЭЩУЪЫЧТЩцяїљ§ѓэццыющщєээвьчтэњўњђчьєђэёјљьшцчцщшчц›ЉˆБСЏМгуўўєюясйцяяћћш§ѓшрлсчшчшцуцчцчшччцшьяььгюэяыщчуутусрнЋЁЃЂДЩЗЈИшцнмйгЯбФЭппбзлбамнммррюпчыюяёёђёяѓюэьщьэююёрюэыццспмЪЭаВЏВЖЊВбьтзбЯбЮЭЩЯгежйй‹лммлйклпхшщьюьёђѓёёяыщчцчщщшчщчуусушчтНРНЗАБФждЪппнкжгабдазжзйкммплкжзййбЪЫЫШЦЭнмЯчєээяпннрухпзмккмнрнКИДЏББМхямтццхннмпстхрпусрмйззеейптххутсррнрсцтсЯзкнлхнжЪУажгЮдЗЗБЕКРЫєѕхтнппсусзббемкххсплкзжззлнммлзТСЩЯгбжеббдемундЧФВŸŸКЮаКК€“СЌДЩрслжгжнпкедажкрмйкзнрсрмклнпзлкйдбЮЭбжгеадпуяцШЦЩКЗНЭыўйУЫЮТжйкшщЭЗЦЫЭнчццрпнуцтцшыўюжзнрмлйкммкжЯЫЯЯедЯЫЌŸЈЯгЎЈЖЖВЂЁМгЫйейжеггаЯЫЮбжзтццчццтруу€ЈцшсФЈОтчцсйааггдкйклежйЯУНРЧЩЦСТЭЩЧШШЩЧЪШЩажзеджейужжцуруухтнммрхљљжТЯьссмдЫЫабзкмнрмеФЪЫОРдгЦШйьюычдИОЪЪакххлжжкклхщчшспххтппккйзТУЯТлпрмззйнпстссшсмктхцпхмннтуццьхйкўўњљјїхнззљтєшьцсттмХкймллпсцьыхшьсрпрлптутррнррнкеегежлпрстнччуххчшчсмклнсуснсшшудцххцшшїыюяььшцчшхцхчуцусннллдаЮгззжЦШТЋМбцтпплнрсспхшыыэщцучшыььыщцтхцхчыьыщщььшщщуу€ёмрхуррннгбзмнжЯЫЩЭЯбмкзйкейзкймпуцьыьэщцыышхуухчусхцчьыщышчсмйзжлнчьээїљєѓэшсЯепнппзнЪцюхсннснрклЯЭкяљчЮгзанмлнчцшщчыщштстухчслжнсшчшщчщэяђўўююхунлгххэћяёёѕрнсурлпШШЮжбйзлкззмпнрпнммпсруччххсррхчхуррндзмшцчцхтспйрнухьїтЫадзлмлзжеждЯЫЯабймспллšпммнсцхцчцхеЦжйнпупмлзжмсррмрмЭнкпкШЦкнЭЭжмспнлежмкхЕЇУЪдлнлмлкзгагжмплзэцчкзгбезпссмнтхсмзебЫЧШайжкпссКптуцшунсухрюгЖФЫгеззегЮЮЭЯадждеМЛйкЭедабелпрйлйкйбТЪЦЩШЮЮмйухычхццххсккЦпусзУЯрлЮбйзкддеаЮЭЮгедбезйкйбЯЯбжйежжЯгЫЪЭЮЪЪдкеуучььышчцц€ЖснмррхрѓткуыЦВЮбаЭгаЪЧЦЫгЯШУЦЫбждежелулщѓїэбЭгегЮЮбйзљїєюэычшщяѓэщюѓїђчшюяўєгЛЫЪРРЛОСФШЮєўмИКШЮЮазлпнмтцярШЭЫЮЮЪЭдзрнђѓєёэхтщюёђёѓёэьчххцхснгЪлнЪРМЧЪЭМе§ўзКИЭбСУпццуххсзгФЫусжЪФекнлђђ€нэчнкпыёёяюцхщшшцрнрђячлмтйггтѕтглшчщщсуэїўѕяэьчхцёјьсцњљщлззешшщхчхшэыцхснмцэющчхцщыыцщшхсппссрптчьююёяяюяёэюээььэщцсттцупмррхстуххцшхнйжлртхцтуухчєрЯмррпнрнстхыэюёяѓёяюяэьэюььычрнлмнснйлйнссхучщшчѕцтссруухуцтрпрнймрнйлхшш№щяяюёьюьшшщышщышш€‚чтлкмпсрлггжймуцччђѓцЛЛддкнсхшчуппсспрмеейхтщщюяёяьщцтусцщыььхчщшхцччшцхчрнпдпужагддУ’БйлйрбЩжпаФЭезкззкйпйШнууьэююэючутсхяўљзуїђыыŒьюышуннрнпўяЫТЭРЂЂЦкжжйедезЯЦЩЭкссххснждгдьчььююээхссмЪЧЂzЗшьшшщююёычтпмкйдШБЖаЭЪЯмдзеегегЭЧЧЩРбчмкрббхелрсчыьщмїьШккСЮуѕэющххщюяюяэьцусбдкжбЧј§умздгЯагббЭЧЮднзйхЮЋЋКеннлкЭрэюуцбОЮррђучхурсцчщыыьэщщ€луагйдедгйппйЩФЩЪЫЮгЫЧФШЪклчсТТдуйкжагдЮЫЧТЅЅТЪтѕмстснмнкнмьѓтюђссззгееЮМЕУЩЪФТЧмймкхЮННЧРмѕэЧбЭмЮДАЖЦШЧЧФЩЩЪбФбЮабжянйЭЪСНУЧЩессрмЮбйжЭЩУЪЩЭЩЧИЩртптнмйзмрршьеегЪЦРСТУЧЩЪЭбЯЯЮЮЫШЪЪЩНОФРСЧЫЯЯЩпэшзйзймббдагЧбкмьїжЯЯгжаадзжж›кнскшёщсклйзншййкнмсдЯЯЭЭЪШЪабЧСЅЫшпучцтмлклдкхпэђтЩШзЯмчРЇТкЩнсрпннпучтртдмчццхцчхсмзжебЯгжзпЪУТыубюю€ŠшцткюшыщщыщыщєўјєљєђўўцэљхццщьяюђюьышышхтпнййзклкмйжзаггКЁРУСђяьэююёѓѕђєяюяэѓђѓєѕѕїѕїёєѓяяьяёѓєѕїѓёёэющркжйеежмсучхтстўјмйггУїєѓѓёёѓяёёяђєєіђёђђѓѕєїїѓѓёђкёђєѓѓёђёющхдсђѓчужкшюычщщпмдттцшїѓѓёєѓѓўёяя№ёѓєђёђяююёёѓєѕѕѓѓњєѓђѓѓђђєћэуьћўўяљтщьщщэюяўўћєхщёѓѓћёѓѕїєєьяђђєєѕєєѓёёђєѕѕєїѕѓєє§ѕѓђђёѓђєєјљјѕєѕяэяяёёяяѓєѓєђёѓєєёђђёђѓёёяяюѓяююэюєѓѓѕѕєѓєѓѓбђєєѕєђѓђђёђєѓѕѕєѓѕѕѓђђёяэышэёђђёёяђяёђѓѓєђѓёюёыылщэыььэыюђѓєѓєѓѕїєѓїѓєѓєђѓёёѓєїѕѓєяююёёнюэяёёђёяююььшщьяєђѕѓююёэььщщыыэяђєѕѕЗѓјєѕєѓѓёѓѓєђяяэяѓѕёяьэюяяёѓђѓђѕєѓѓёђѓђющшшщэёюђђёђёяэыцшэяяђѓєљїјїѕєєѓєєђђчёяяююьшшьыэяђђѓёђѓѓђэщэяёёьіутчыюёђђяёёїяыээђяѓђєєђёѓёђѓђѓѓђєєѓђюьшшЪщыэьэюёєєђђяёейнђёёюшуцчьёђэюёђђѓѓђёѓюьэююёђяяээюээёђѕѕљєѓэцшшььёшщщьюёяяыэыярнт€З1B9:>Jmb\\TUGU;8AFHIONFTOOSMGLNU\]]^aZS\U\W`Z`]^Q\VVQQ\``bnnjaY]99198Qm]VFHJFI4277CFIELVOPT\[`V^^aYSQVMVLSHLJZY\UPS\[^[TU]cq^\ZZE;:?2HHIJPOTMMG?2?:@GJLWZ\Zb\^bb^^ad^[WQHMCNHIPPOLMVWWSS€“WY\caa\49>5>:EGPYV[HJFJB3@>?GHYYOWW\\bneaVWVNEEAFGANLHIGNPTZQSUOOT`jjkr57<328BLQUTNHBFAA>HGEG3GGILNQZ^wYFUVMIE?A@CL@NEOJNVU^[UVSVW]`^T`".:;3JFH[YJMBFA4CA<@5:8>AMF@EHNVSTIGOZWNOHNMGLITOLLJNTSSPT\QINJNQM##-1;?CA>??@7;7->7::IALIMMJCLNWLPMTOMBCFFBIINHMIQTYYWLSVQUTOMPM#+(&?<;>?C@BE;;<9B<:AEJLGHVTIEEFGIINJICGA?AGLMQQUOTPQMPLPIIJMHII#(02*+:QNPQQжOQTQM@SHQOPTYIG:5>?EHJMICGNCTPSMMPJQULMQJLL€eTOHJI.20:T^PFb\VTTaZYY[YQPWV]VWQLGOFICHOQMHEOJLBNQOTWSUSVNOJNVYT\ciwˆ5@AFSNMHNQVTPNW[\VTW\a]]MNFEHQVWIQYa[P>au`UpvucVM]rqm[O]bNQZVdad*C>G@EOWTQW\QMS[cpgY^VJWkk^QEE?YVJY^\[Ta\UONPQjurz|to‡qkq”ЕЋ’ЅЏЏLF;83@Mge\n`FGEdnw]AFQUd„‰vk\o|’Š”ЌЕЈ›ЃаЦЛШкйЧТИАНЪйѕўўђжшпЦСаддLWGGkuO]cZ}ˆjРРЗЛЗИБМтюё§§ѕьунпшцсыскппзбрјњђцджщхущљљпЯмкдЮдЮЦm‰xm‰~’ЉЦчђцнлСЕЫйсѓїёјѕыбЪЧЫгжлмслгжжадаЧккзкутрйймрсеЭЪОУШаШЛ|rqr‹ž‡qpžйпЯШМЖВЎŸЌУаКНТЗЏИЛТФШТОФЮпчлкллмчушцмгекцшяьцкдммЭСИЎЌЌА—‹‡vˆРеФВЄЊЋЉЋЊЇАДЌИМЕЋЖФНЗКШбдручцюёѓёђююужажжгЮзпндЫОУЩгжЫ•’ŠŠЂБЉЇРаФЛЕЏЄЁœЊЏММЕЗВЎЕЖЛЗЖЏЖЎЎЈЊЂŸЕЮЪЗаылдеСЕРЦЧФНЖТЧУСУОРŽ–ˆ‚„„ЫеЖНЫЧЦРЕДНУЧаЭМНУбЩИАВАЗЎВБЖФгдаРММИМТЩТНЇЋЏЕСЪОЎЂŸЖИЅЃЏˆ‰ˆ‡ŽЃнтабЧОЦЩЩЧЫКДККМбмзОБАБЌЊЏНСНДЖВŸžЄЊЏЇАЉЈЁ—ЂАЕВЄ˜ˆqpr‘ЂЈ‚…‰Ž}‰ЉОЮЭБЈБРФОВЋЉЋКСФСЗБДДМУРИТММНДВИБ”›ЇЏЈЇЎЈЛШжШŸЁ™‹…‹ЅехЗ—Ѕ˜ЕИЖЪжЏŠœЅЌФегЫЦСУЩЯЮЧШЭятВННЕИДВЕИРНЎЉЊЄЉЌЈЁ˜„k}ЅА~wƒqv‘ЎЃОЦТМЕЕВИЄ™›ЉЕИСаЫФЩЩЭЩОЩзпеУЂ‚•НЦЦУЕАВЎЕЗДЄЊВУЕЕŸ‘Ž•›œ’‰‹—˜˜™Ÿ˜’ЂЁЁБЖБАБЖИКЦЖЖЛМКОЭаЦНКСЧЫчсБ™ЉЯЩЧЕЈЃЅЄЈЈАВКНКЊЂ›˜‰ЉŸ’ЈУбаФВŽ•ЅЊЌМНОИЋЎАДТЪйскШСРЧЦФЕВЕКЖ––Ÿ˜КЖБЎЎЉЏЛЩУНУЩЦУДАКМЛЕЛДЖЛСЪФЦдЮЕЕўў§ўїячУРФЖЕЫчкЫЦФЦЩФРУОВАВЋККЖНааУЪгШКВБККФЭШОИРЦЦТЖЈЂЊДМОУЮкгЯзаЫбЮЪЯбУДЌЏМЪШКВИФекЭЦУЧлккжшхшш€CндбЭЩЩТЧЦдЩОЛКВЖВЉЃЃЄЌЎЋ—Ѓ~‘ЁЭЯФССННЧФЦЪждмдгШФЮдблрпЯЯШЧРЪагббЭЯедгЧЫзЭЦЩЦМЛИЗВАЈЊАЛЕЎЃœ‘ЄЕЎТВЎЖДКВЛИЕЗШгнмтржЮбпчмЮЦЦЧЦЩЧУЦагейгаЫОЗАЇЊЊНЪгЮЪшэтнЯЧИЌЗЖСКЋБЉбйЮЦМИИУТРНЏЋНпьЦЏЖЗЉБДЗОбйжШШЩЫЩССЧСКЖНЏЋЖЦЮплгЭЮсьяўјжЯЮЧРВЕНЫйљытмуЯЦТЩЫШЏŸЃБЉŸЗМБЏЋБМИЗИММСННЪЪТФбдЧСНУООЛФЦНБРЦлжШФЪЯЩУЕЧФШууђбЎЋЎЕКНЧВЂŸЅЃЊЌЁœЃЉИЦЧНОИЗОМЛУШШ€tЩФСА–ЇВЩгНМДЌЌЖЛНОЛЗТЖЋСУОЗЋЈРУЅЊЋЎЖТЕЋЏЛКТЧŽpŒ—ЇАИЕДЖКЖЖЌАЊМУУМжмаЋЅЃЄЉВЛРЕЉЇЎЕРКЕЌЌЅœЌЏББЛТЧМЦСЩбееЯЪЯФШЭБ‡žЈЏВЌЇЊЈžžЁЄЈЋВЋ‡’ЕМЁЅЇЅžЃКФЗЏАЛКЛЈ’•–‘—ЁЈЊЖЛЧОШЪШШЪЦМИЖИШЩЧЌ˜ЇТБЇЇЌЖЖБАЅЃ›œЄДДЏАЌЗОИАЂŸŸАЗДЄŸЂЇžžЁœ›ЃЌЋМЫгЯЯЭРОЦЧЧРЕЎЋКМТчЧВРТˆЅЉЅЇЉЊЋ–”Ÿ•”›œŸЋЇЅЄИТБШжзЯЇЂЈДЊЂЂЋЖЖђээцмзЯайнйнгрнтнЩехыђкЎœ––…ˆ‰’Ž™дцМˆ‘ЈЋЅЈЏООННбкуФž–ЉЉЄЁЂЈВМСђёяђсЮЯкнчьђхшыугЪзркЫУБЄОРŸ—™–ЌьэКŽŸЈ˜œЖЯШЧОФШИЌŸЃЩСЎЃ›ЋОРЗѓѓяђщйЧкшђёђшсптснйеЭгцнаОУЦЕБАШцаИИСЩЪбФамєўёпмйгдемэнЪгёѓлТСННыэыэшщщяэщутлтэђьшскгксщчскжЭФЛНФаЫШЯрчяшђёѓёєыэыччштнкеЮжтребалЯдлркммхплкзжкззйрнлнтђкРЮегЧТФаЭзмсмуыѓѓђѓёщыуычшхчпзЮЩЫйжгЩУЫжУЖИШЭЪЪлткзгЧЭЩЩЪбЯЭЧФКИДБЕЕ€ФЭйЪЫкучяюђььпнлжкнсмксбОЖДЗШаФИЌЏНДДУЭЭенуᨘЊЉВНейлгЮФОРМЖЛФСЊЖЮнсутюшумаббЭеежгнмеЯлбаШШУОШЮШНМЧВФаЕДАЉЋg‰ЈАБТЏЂЕНЄ’ЃДФРВЄЋАООЊТЮЦпчхцыпдШСШбжїђШЭупдкшычупЯФМЗМгћпЅ”œŒwr–ЏЈЌЂЁЈЌЊЁ–žЅДНЦЮйЪНЎЁЊКмгЯнсццжФЭЭТЉЅU’ЪЮЮзнзрхмЦМЛЕЕКЈ›‰ŠЅ›ЈБВАИЋЃŸЇŸ”‹‘ЋЭССЦЊЊЪОЎЗаздммТымЛЦРЇЦлЫЫ€­МШглнкйнЭЪШФЏДАЕЉЂхюТЛЕЋЇБЌЁЉБЄžДСЕЖШЪЂ~|ЉЗУСЕЉТйдЩбА’ЄКУУТЭйУЖЖНбпжагжнеЦЩЊЈЄВЋЊЕОТУВЁœ—•žЊЅ–—ЉЂЗКаЦ”‹ЉФЭМЕЉЂЇЃœœ•|t”ЂОпТИУФЛЗСДЗЗжпЩжнЧЛМЎЌЌЇЁ‹Š—œ”Œ‹”СИДСЧЃ‹‘—žЖхЯЁЌОЉ‡‡‘€Щ•’—Œ–Ј•ЃАЉДШжМЖЁœ•˜œЌССУВДЌДБЄŽ—–ЄЁŒ—КЪЯЩбФДЏНУШЦЮЦЛЊœ‘”’–›œ›˜—ЂЉЎЉЌЅЅŸЁЅ‘Œ”ŠŠŽ™Ђ™СЯЪКДДЖИЋЏЖЋЕЂЌМЛзяРЈЊВВБЊНЩМБЖАБЖЏУкЯТМЛДЉБТВАЕРТУДАЏЂ–”Ž™™žœ”ЋЮЫУЮЧШИЖМУДМЩМйуаЏЁЛЎТеœ{žОЃДКОФТЧЪЫЭООСАИЪзбдЯЪЩУКДАЏЉЏЈЕНЛ›—ЂдЪДтудЫЩЫЕлнлдЯамккыњёьђшцћљдачЩТФбрлупчужеЫеЯШФМЋЇЉЏЗРИЕАЕЊЊЉ˜zŒŒ‘шйдйкьыээђщчтчшсшђэѓїїђєђэьькйзхэяяюыхптйдЦИАДЋЉЎЖКЦФЭЩШЮєпЖЏЌЃžѕёэяюэщєёѕэьюѓёёыыьёєљјљєђююшххюђїєѕэщшшхрЪИЧпкЩФЗКЭЯдЪСУНАЎДФСУєєёѕєєэуллууэѓюящэцчучшыюѓюэьёытршщяюшцюэтЩмєўў€‚ѓЫагмчшюё§љњцЪЫйяюяѓѓєѕјёьсхпюђљїёнезчыьђѕєєѓјєђшчюёэщьяёюяїљњјјђщщселхыхьѓєёяюѓюёяѓшущщшьшмжтцчццэяюѓѓјјїяьющщѓѕѕёюьющчьђђјїїѕѕђєє€§юёькамсщююшцхчььщёэыьёюцлсмрннжтчютшьэёєюььёђєящюєэхшшцюэђюёэьтстыштрреныёщзйссмкнхэђїёђцпзнйбжйЭелрсцэѕѓјѓїѓѓччыяёьцпехюѕђєэпснуыыээщцуяѓячшчцшнаЫбкшяхнсхчпеЮЫЮнчэьёёјѕѕђѓээчлпюытнеблпчлЯЮдйшэєыьэяёящтекяёюыаЭШЩбнцтнхркмулаЭгзшшђѓјёѓёшцсчяэюяяёьщпЯЭФЦддГйрьяшщюыщхЛМЦлмкаЪЦОЪжхщышььяьящхкпкзпхцнммкнтхшюяѓєђђёпмдггйдЫУЮблцщььцчсФЗЛџ€б>G?;*)!0*+180:4;BA@G740$,4>;EitiY<::EC;E?:($059,0&-407AB94)+9;:5E;890+-"" 29CJHEA?85<>@50HViG3(%3:;:42755<52-"AG9?>BCA>?9C>JNH>>*%% FZHJI>5>8AA;>@B@FNkZB;7;<55.><;4-*2);iYMFE>:;7A>.^^nY9-++(:7,">::<919??;9:>71.00!(-0-4752FSLFB92?PHMJ?EFE@J<<72!&01,7;348@@BCEIGHB915--+"0@>5.,&):74404<:>;ABHJA?;9B;BHNJJNMOJNNPOI7A7?@8>BJICFIGFBAFIIMLJNNJNMFA?7EAAGMMQNPNOMIFHC53>CLFPSSNGEGHHAEJIMLCNHSMMIPOOPMMO€БTSOTWQNOC;5;EGJJLHMQNQOLFJHCCFGIJPYSPC?B;FB8?B?8>?>0107?<8A?FHIGPIJOOIGB9<-4931:HHC74517>3>8A@@?;8+,+292<7@:7>ACGJHIJG:8Lbq[FJQIFJF:NTVI77>139LYO-7?GI3***15OWkwp\\YVjŒЇЗЄzvƒz’ЦкЯƘŒ•’Œ‰’›—FOUV\QSjpnbS`v‡„rhrwoYPagq|…œДЖЗЖЊŠ…ŽЖКœ—ŽƒŠ’”…”жѓтжЗuƒŠ‰‡ˆЃžœŸЃ™—ЈСЧРЄЏТВžžœЁДА”~Š~…œЌЂЁ‘‰‰|n…ŸБЅЂЁЌЏЎНЅŒ’Счжхзžz™—•ЉЏЛЊœ–”™œ™ЅЈЇŸ˜›ЌДЁ™•‡‘”™ž‰™ž„……Œ”ЅЕМЏЂ—–›ЅЊЉ›”˜КЦБЃ™‘Є˜”’ŸЄЃ›˜™Ёœœњ›˜”–—ŽŽуŽœЇЅЄЇЌЗЎŸЁŸ™–—›ЂŸœ›žЂЄЄЁœЉЉ€œ’•ЁЊЌЇЉИКИАŸ˜ЅДЊЂЉЈЂ•–‘—›ЁЅЂ–ŒŒ‰‰ˆ’”‘•œЈЛВБЕЅ˜ЂЊВБЗКАЇЄЈЎЏЁ’‹‹’‘œЃЇЊЂ—„‡Ž›ЁЂŸЊЌœБЗЗЊ™ЋИЋ—™Ѕœ•’„ˆ™””œЊБЖЖАžЂВУЭУИЋВОА—ЁЋВЃ•—›ЄАФАЇ›•—˜™ЃЃЄБМФЅ›”˜ЂЕКЋЈЄ”–‘—œ•—‘——œЖгуцклЫЗаЯСЄ˜ЄЈЅ™™ЌФМЈЈЏОРФОЎ˜ŸЄЃЁЁžЁЄАВДЈЉЈЄЄЉЅЁ™››ƒ‰ŒŽ‘”–ЅЏЖДЖРйумЮМАЅŸЁЏКЗЕБЋБДАЄЄЂЗТЧФЕВЋЉЉ€KВМШЫФОЧžЄЄЂЂЋЈ›ŒŒ›ˆŒ‘‘–ЂЃЉЖРНЎМбтЅЅЋЎŸЃЅЌЇЋЛТРИЉЊЕМЖБЎЎБЕЗЕЋЅЇЅЌАЅЊЕ’Œ‹‹‰”œ™‹’•‘””–•žЃž˜ЁЉАКЖЎЗОВЋЏЈЎЏЋЎЈžžЉДАЇЅœ™ЁЅЈЉЎДЛЖЌЎЇЋЌЏЏЋЇ‹ˆ’‘‘™›ŽŸЊЉ–‰’žЊЌЋЏЕОУУССКЎЇЎЕКЖЉž››ЄЌЕДЖЏ˜˜ЂЌЕЗЗДЗФзннеЧНКСРОrvquxzvmЈЇ’ƒ›ЈЄАЗМЛЎЅЌЉЊЄ˜–ЂАСЫНЊœ—ЁЊЈЇЇžЁЇБКАЄЃЏКШззЮШОЖВБВx~z}…„™ЋЎ’ˆ‰ЋЏЈДЩжжнРЄЁЋЌБЏЁ–œЅВЗЛАžЅЋЈЈЂž›ЇДБАЕСЦТЏ—ŸЏШайЯТР—”‹‰‡••”Œ~›СгМОБЈЏЏ••™‘ŸЊКА—”ЇИМЕЇЃЊЌЂ›ЂЈИбЧКОШЫШНДЈЎРЫЭЭануЋЂ—ŽŒ•Ђ•—ЅЊ›ЃЕджаНЕНФЎЁЈЉž˜Œp‹ЛЧЊЄœ–ŸВУЪЧРНШакйкннйзнслЩШгЭЮжеЯЅ›œ›œЃ”˜ЉЎЉЋЗБЈБЛзйЫЎ…qދސ‘ЎЫФИЖНЕЉЅФлмнрткеЮЧЪлухчщхлЯЯЭЦайкгŽ›Š‚ˆ’АОШФАŸ•„„”{w„u‹›‘|ЕшѕёлжЮЪНУЦЫЮблпннмгееЭЮдбЪЛДТЫККФЪЧŠ•Šƒ‚ˆ’ЊЖБЇ‰v‡„ЌЩЧД–’ЇЇЃŸЈЖНОЭЮЦФЧЧбгЮЯзнммкеегЯЮЭЩИАЕЦТИОТЩбнг‰ƒ‰‰…‡ˆŸНеЯМЋЎДШчщпйКЅЌЦдЯФЛФбйзмпццрхпгЯблрзЮЫзкгЩДЖРИДАЕЧжже‘Ž‹”Ё•‚|˜ДЩйжМЊЂЏЩТИЖЕОЦажззжйжкчьыччцпгШЦТЧгзкнреФЛМТЦФФСФЪгЭСƒˆ‰”ЎМЖЉ”„ruŒŽŽœ™’ЁЄЈЋАМблмббзпнсцчцнбЯЫаФССЪймсркЫИЗЦЫЦКВЛЦФОМСЇžЎТТ€ŽРЂ‹‰ˆ„ŠŒ„‹•žЈВБНШгмпжбджзлкнрэхдИЅЈž—ЗазмрпеЧЖБКСЩЯЯагЧЖБО—ŸЂЃЃŸŸЋЧЎ˜Š’’––ЃЊŸЇСббдеййжряаСФОНРЄ—’™˜›НелжЪЪТОЛЦЯееЯЪелжЮВЏ‡‚‰‰ƒБЩСДЎЉЉБРжрмбб€йзеейжпмЏ–žЁЈЗИЖБДННЗепзЫФЫЦФУЫЫЪРЯйзеЫТАЅƒ„…Š‘‹‰ЃЊЕЖБДЖИРЯкхцххпнмгЧСВ™•›™ЌРНЕИНОЧССЧЯЫУЫгЯЩаклеЮгдЯаЯТЎЌŽ…Ž–—–œ—™ЄЇБИВЎОлмртххчунпркЮЗВЭШСБЈЄАЖОЫЩУШЩТКЖРЮжеаЭдгЮадЯЮУЕЗЃœŸ›•Ђ•’›ЊЄ’ЊЪжклйкмтчььшцрлдЮМНЧЪйлмйШЛЖЏЏДИШбдйЫРОЛДЈЎИЛМЛДžЄЌ~™œ™—ЎФЯймжлрйдпуухусуух€ЬнйлртунбОЌЈЎВЖДЗДЉЌЊЇЅЊЋЋЗКДБВЃЎАЊ–—ŸЋАЋЈЄЈНгбдйкллзймступпддбйуутнлнтйЧЏЊЖРЦФЭзбРЛКЏЉДУУЛИОЩЫРЧньюмжЪОВЄЁЇКаебмпсрпкегЯжжбШШЦжнпмнжаЮЧНОФЪЯймртрдгаЯжнрптхчтйШЯжзЭШННОРКИЛТОИЖЛЦСЗЖЎЋИНУСЛКЇœŠˆŸИадаЧИНЫйрхх€ЫпнзЭгззерхсррмзЭБЛМЕДККМЊЃЋБЎЎЕБЖМЪЗЄЂœЊРЩЗЄŸЁЁ”–’ЇЩгаТЗЋЊИШжппкйаЭРУЩгбнцжИИОЭФНКЗУРМШЭЯЮЮаНАЊЂЂЅЃЈŸЁЌМИЇ˜‘˜ЊУШреОТЦФФКДДЊЂЌИНРСРРЦФСТИЅ‘‰‰ЁЌЊЁЃЂЇЗСТСДЅЎНФФКЉЃЈЋЂ–™ЉЏЕОСЊЈЋВЏМСЧажЮЛЌАБЏЎАВИЗЕЋДКТЭаЭТЖЊЂЉЋБЗКœЂЎЦдаЫДŸЄЈЏВАЋЄЃЃŸЊЛШбЯНВЌЃДЩЮЧОНИЋЃЂЌЗМОТМДЖИМЩЪМВВДЖВВИЦФАЌЏЃ˜~|‹ЉЁ‰”–›ЉЕЕЉЄЅЅЌЗНРЖЕКЦНЏКРЦШФУОБЊЗМИЦЮЧОАВШЭУФОЎЈЃДЪЧШЫТДЕЕЃЃœ•‘Œ‡|{nˆЉЕЏЇŸЈЉЂžЁЊБЌЄœ—œЋЉЮлдгзЪАВОЩШЮллдФУЦРЦЩСБЈЗзнуйЫКИ̘™ЇЊЇЂ—”ДУБ—{Š„‰Ž•›žЂЄЇœ™ЁДЪЯзмшщпеУНЦаЧУШЩШФОТЧгйЯШОЕЛФЮййлтЭЅЂЄЋЋœ—™ЄБОРАŽŽ”››”Ž’ЏЗАЊЉБФФ€NШЫжгЭЫФТШЮдеЮФФЧУУгнзаЩРЏЇЗапрпсмВАДШ…‰’ŒЁЄŸœŽ‹’ЊОЪЌžЎФКБЎБЛМЛЧдллзмкСЩЩЪЪЯгзгдзЫНЗБНемдзтЎŸЈБ‹uЇ„ЄЌЅœ’ŽŠ‹‰„z•ЉЋЌЗСЦЧЯезйгаЮМНОРЮжжкнрммбЫЮФЩгззк…w|oc~ˆˆ‰ŽœВЕАŸ””ˆ‚‡‰Š…ˆˆ‹—ЁŸŸЁЄŸЄЈ™ЋИЗРЯдЫСЮЯбзжЯЩймззгЫЪЫЫУОЯмx‚„‰ŠŽ’ŠŠŽ‰Šztt}„‡ŒŽ•ЃЏЋ‘—СЮНгекйпдадпмЮЭЯгезЩЫЮЭЦУСЧм‚‚’ЃЇ›‹•žЁ•’ЂЉЉЄ›œ}t‡‰ƒ}ƒ‰Žž—–”‰‡}‚ЋРЪЮджлл€QкмккпмдЯЧЫЮШбЯЫалЋœЂАМЎВБЊЎДБЈЂЄЎЕМУЎЈЃ›ˆˆ~‰ŒŒ‰‹›˜Œ~j”лэзжйзТВДМФЭЫЦОНРЧЧЭагЭЯкйШНБЕОШЩЦУЛЕДВЂœЁЈЋЈЌИФœŽžЅž‘…ŠŒ—Їzr‘СрлсщеООУМТЫбУЦФНОНФаезШЩЧлЮЪЯЪНБЈЉВВЗКЕКЛЊАСУСАЅЋАИКДЎ‘ŽœЊЦНŽ}œЌЃƒ|›ЉОФЮЯдйШЖЗОТЕЎДИОСМЖДгЧТШЩОБЏЖЗМЫдЮаЧРИЕАЖРЩУНИДЊŸЃЃЂЁЄœˆ–АЎЄ•…›ŸЈЊЛЦСНДЊЉЊАЎЌВЋЅ›ЈЊЧЧФЩШЧФОНМДЎЗКЕЛОСЖЛААРЫааЪУИЊЇЄ›„ЇбНДДВžЃЗЛЕЕДАЖЗАЎЊЋЌЉЎОМБЉЋЎЩТОЭееЯЮЮУЕЊЏАЛКЛКЗЖЛЭгЦШгЭЧЯебазбКАЫжеЭВБРЖНамгКВЏЅ˜ŸЎЎАЕТЩЧШЯЪЧФРЧЩЮейЮбедТУтѕтйегбаФЕКНД‚tŸФблеЮЮбЯгйжкрйднпзЭзкШЦЫчмЮФФЗЖНЧСРЦИЋДОЦжккЯСЗЫнпйедджаКЖЖАЊЉЏЎАТЯгаЮбЪТШждФРТапцчшсннлЪУСОЎЋЕАБЕОЭЖЕУЪЭЯдЪЏЋИТЩОУджЩВЈЄЁЁ™ЃМУМЖЕСНЖЕДДЛЩЮНДЕЛЮзккнлмлкЩЗМШЯЦЕЌБКъB?GGIBB3?CE@HHIBEJMFA88ыAFIQqxaBAFCB8GJH1,<;;€Љ78:>;;BAA><8;<;>C@?@CE@><38.23EGHLNMHE@?BLGH:NdtS;:5;;@BA><9:4AIB?FHEABCE><:80&7QYPQNJIEFCCMTOGHEZq]FC<;8;1))79:5:;?BJVSPGALMPNWOLE:A@:BGLNMJJ€NPUSPSQIBEA?<9;;>>:>85>?B@BCFCCHG?EHIFJMMLIELEGFA>BCIEB>CCHHB@AEIHHCCGHEHJHCC?><>@;>@FIFGFEB?CBIGHHLNJNLHGJGF:@>@CFOUQMGGHJHGHLLGIOLJLLHGIAA;ACEINMNNLMMIGA??BEHCMSZZPLGB>?BAAECENJSPOHGEIJINMPPSOPPQNNMGB58>@BAEHIJMLHHFIHGFGIJJNOOSGFB;BAG<@><@@BBE?<<>;A>EGC?BCJJIFFE@>3;<;@@ј;9<<@ACFF€‡@GF?8HPF@IBAEG>HF>EHEF@?:A>::5>?EEGJC<:<3.7IGQNHPGBCHJJLUQJCMHPOO[^VPMPNLEG8@<+CSU[^e^YPPLZUSU>arˆbLSPCNOJJ€aFOVNTNM9OVOMWQ[OUV]SPjhd[OINFLG;@)E^pb`]TPSQSNWVUYYZj„t^LQLPNJUVPVSQUFJ1Q‰rcdZYSOPVTM}viYNIMONNG8EYT[VPQJMVUSZPSOLOGB9:LF@GFJLP\\aVZIPPddg^[U]NNOONQc`a\aTQPLA?N44>8>AB:A?@HQTQFMEGG>B;>LLB>11+2990F:;9;057;*0-893)-.-02.,4;<>BA42>AGMMONHEIG?97<431#$).0037?C--59..€R2*)&9>;7?>?A:>::@EIMI@@HQUTVMIC@?:8.,.-+&#$%%1GIE;2Qagk‹74>GFE9591248CENNLO@;AFHJBA93%$$3AJTh‡–Вђїѓн3C@FJHECC@@HMIJOIGIB8AEA:4+2A;>B88>-0$*:B4::@FB8;OgxЂЗƘ’АММОЪЦЋFLGIBCNAHC@?CEJLEHC8,;A@A55>?>C@A5B>2;@-%8NLGSakŸЂАИ—ЋКЗЧмгбЪОFB3(0::>7071@<::AB>:1,--0+.4C:-;EJMTcgcv„’›ЊЩджОВЊВДЦШЗЗЩазЮФФОКC>33,32987)1.$"*!!-F@;51));NEH`h„ЛРЊЕщюнИЉЖМЎЉЄДСШТЖБЏЉЋААЇžЌУЦ?7&*IL02<:?@C@@AABEILIH?BECE@BCLGECFCFFLMAQ?A@?>;<;9<<>@BCA>;59558;>AJOQFFIJNW8:>?<487;;?;<8;99::@?;99<:4><:>@@BFB@@;>9?AAOIIPGLPGF`{”ИЩгШЩцёьыюьщGHMIMICG@EC@AHFCBEF@?;BC;AFNQNGTOFOOIAM\b]p‡›ДФЮзпФРйцюѓѕяэьшAC@899CGJI@@>A@;>EG@>>AABFENLPLPW]ckt}„ŽЅБЪпє§ўяцухщѓїччѕьээююяяFFм@FGFBAAGC<>73,48BSOOILE@Qc\\t~ŸйнЯпўў€ТытуурпцшыььцспуутрпцщщяFG?>Y]JCP\TGA>@F]ZUY^Ua|…ŽЎтѓсйшхщњїщдЭсшцшчтстцщэышчтпухшшттцяьhp|~‡ƒ|…˜™›ЁЊВОШИКсюпшцкдуяячьнеклмлнптчшцчцчшщшыэычщщььщшхччшшзпйекЪРЮнюћњчЯЫЭдаУзнжьмккййжезжжйннсушьюьээёюяѓѓёєђёюяыыьэыыягйлреКЊИжрснйбЭЭЯЯлбджббеЮмнлйнртутхщььяёяяэыщщшэёяююяёюю­ьюээюяыћўѕчхжачщржжзезкмррсмгТЦнѓњђмкуяээьёђяьээёэшхттшэяююэыыэышшчхцуруххтучшчхжкззјнстммруххёљѕђяяющщэёђёяяёёФэшчшчьэюёэььшчхсучцчыслкнручщщшйппнншшцуммннттучыьшйЮнђьэюэяяЭэььчхчцчьышцшчцхчщыьысннуљэюэюьцпнсшьэяртркмушшуснллЛжньюѓэчххшщыцшычцшыщэыыэёяэыщхтсуррмїыэьэёёчэїўѓєўяьшхцёьюыущчђњћїяюээыљьяюээьююљђёююёэььыщцспьышццчшшыыэюёєєђюзсйШйпёёђѓѓђяюэыщщыщьыщччьэююяьыыьяђђяяюыыэяэщхђѓєяэыштхчщюёѓющцчцпмптшэьэьээюэыщышшцчуухччшььыюьэёяяђюющщњьююэщыыфьшыюёяюьщтуцчщшщыщышцшщэяююыысщшььщцтушяёёяэщьщщыююьэююяяцххццЬурчьюёёэыцтрхьэяяёїшерїящыышыщщююяээььщыьщцхкктнтцьээеђёђяыюяэычутцьюэяяюытнртхщыјтФдезйпццттсухыырэяяёюьшцттуухчьяэёяђђяюьюьюээююээ§юяээћѓяэпццшжйежтятхѕьышщыщыщчыюяёюяяєэьэёэюяђяёяђђўэяяыёююёѓђѓэчркЧяђѓѓяэшыььсєљўяђёюяьэяюэьэёяђѓєђюђѓђяёёђђёёияёяёюёюђююёђяђьшхтртѓьяяэычшыюэщшыыяьыщююѕяѓѓђёёѓѓђюяяъёѓѕѓѓђђэюяяёяёђяёђяэёыычшэёюяёюяыщщцщыьшцчщяююяэююёцђєѓєёээьэёёѓђєѕїѕђёєђѓђѓёђђЁёюыычшыёђєїїєѓђэчссчьяьшыььђёяьщцшьюяѓѓђёѓююяђєѓєѕїѕєєѓєѓѓєяяёэёђёёђюяэяёѓєѕєђюьыццьэёёђєѕєёююььќэюяёёшяюшхщээђєєђёђєєѓєђѓёђяёююёчђёєєђяюяёяыщэьэыьыьюяєђюььДэёђѓђђяьщэяёэьэяђёюёюьэьэюђєѕїѕююёђђѓэюяяѓѓяююээччшщчцучхщюёюяэюяђєѕѓђюышэяёёаяььюѓёэьшуучьяяђёыыяяэююьюэюяюьццщчщщььышщшщьююыыцьяђёїюрзбсяяёяюьээщщэюэюэююѕёђёэёђђюээяяцђёэьщцщщьюяююышшыыюэьчщьѓђђњшЮнпњююЬэыычцхууыюёюѓѓђђѓђюѓѓяьшщюђєѓяэщюэёююэёяююэьщщьюёѓєђђ‘ѓљјссжцэьыыщхссхцшщюёѓѓяёёююшыёяьшщыюёяььщьэююяьэьёэьхтццыяюёђёьчцчьюээюэыщхсртцююёђёюээышччхщюёээююьщыщхтутцыььњыэщутппЫушыыьщчцрушьыщусхшыыччьяёёююыщусрртыьяяђяьщыыхстушшщььвёэьштммннруспсшэьыщцчцчххщюђюычщьюэщщусущшшыщььщќычцххтщышыэюььяэьрййнтннппруцшьюёёђўўяјюээюьщыэшппнммхщщкчшцтрчштсццчшцшьэьшхчцутсртшыышцхшщщэююэіюяюэьяђєђяяїщхухркмщььєчцтцыьщцуцщыыоюэьшчхуухчыыщьыцшшщяђђёящцшюёяюяђєєуђёђяяььыштьяѓяээююяђяюээьыыяююпэыщщшщщьщщыяюяюяюёѓђёяюяяёёѓєѕѕєѕѕўђяяьёюяюђююыьяюяёыышцшьээюљьшшыьэююёЦяэыхуыьэяёёяёёђѓѕѕїїєєѓѓђёђѓђёяёяяьмсмйсхцттушччхпнпсттцчшшчущыщчуппхцччшщщыыьяёђђёьхтучыююжёђёюэзлмсустчшэьшхнкжкмнррсчэюььыяюяэыщччууэцччццщььцххуххчшчцуунщшшуссхцчыыщыэюьснлнмнухтртьююьчшыээмьшцучщьэыэщщцттхщэюяэьщшхпнпмлжцчщьээхыщхумппхчццчщыыэяёюэььэюьшццїчщьюёюяьщщчцщяђѓєюэшуммкнптцчьэюяэщччСхуцшыыюэяяююяѓђящцыьыюэщэьыююяяюёюээюэышшэююьшцхцхццччюяђєѓёёэььэьэюЭђѓђэяююђђёёяђёђяђєяэюььюьюђяящххцтхчщььщэышщёђїђяюёёцђёяёэьычуцшьэююёђєєѓёюээьёёЌюяьщухчюђђяюьщчшуцыяѓђёяёёюѓђѕєєюђёёѓђяёяьщщчхчщыщьээяёюэшчщьёѓяюыыьюьыээюющьыьяюђєѕѕўяээыѕѕѓѓђёёяђюёђёьшсмсчэяэяэяяюђяюээёёяёюыццщюѓёяюяышхшщшыщюєїѕёхрлЭєѓёцхчщыыющэьыыххчыёѓђюыхуцшыэьыэьэяёюэьэюёюёяэшшЬыьщщсныїјэтййеѓђющххщюяэщыуушшщщьщчуутчцчыщщььцучьэююаэыщщцучттшьђэыцснлннмрнкђђюьэыыььщчтрхшщэшчуусхшшѓщьээьшшхшьщцччЇцччшшчхцчшэёюящьщшщыэьчђѓяяэьыыщщцшчьюэюээьёэяяёэьщцхсрстьэыьщььыюэьщцууцююђёђящччыьыььёююЗэышыььяљњєєёяэёђюяэщшхрпсшыщыїюцшѓљчшчщьюэыээђєѕєюэюэьюэыыьщчхчыюђяяєѕїљјјѕЕѓђёёющуттррушээщлбНВЪркхщэѓєђёяюьюяыэюььяющшыыщхцшыыёєѕїѕў§ѕшуыяѕюэщчутущщттєчщчёчкбШмѓяѓѓЉєђэштцшыэщццчуцхцшухчщщэёяєђњїцкаЦШесььщчцухыыьчцчыхтЭтхєцьїюьыюяяьыхтшцщшэьщщыччттхыыяяпюйЮмлдЯбЪшшэюэшхццыыщшыэюяьццхушььёщтцэёьшыхшщшчцшшФьщььчщшьыььээшхрммйежптцшчцхщяюђяэююяэюьыььээяяюэьэщыышччщыээрюяёђёэчщщыщышцхтрспннзчцчышшьыяђђфѓёюёээыяёђёяээщхннймттушыюђѓѓёуђёхцучьщщтнлзлсццуёјђюыьээёєђђїѓёюяюыэђээЬыщчппЮкмухчыээюяяёяююяётйЦЫрчщцттмрэяэюђёђёэыышцшшщююŸёюыщшыьщчщыььўшйкршэььэяёѓђёђѓђяяумпЯучщцхщэюёєѓёђяюэюччцухтхчщээююыьэыыщщьёёђёѓёѓѕђёљєшшђтгмцйлк€аQOPMLUSNPETWQOJGMIJLNNJPHSMCHNIOJNJLALMTPSPLJMMLGJGMLVQOQPJJOVI^QJLOILQPLHMOMLJ;HGA@FHOPHIOIHPLPNZY]ULJSNHIGEFCH;><95;MTT]OLNTPULJNHJI@FFIIJPNPMJMEMICISOSTOJHSWTWWOMIEJB@?CGEHG?B7:7L\eTLA`u{‚ЁPTT^ZSPLAIBPMOUTTљJOGMLMLLоJEFINLOLFA;BGC;F@EIMSL:54FT[hzЃЏЪўў€ЬєWLNSW]PMJLOSHJNPMJLJHHLMLCBIBPJSQEFLFFNMUINTIWZMG\x–ВУЧЎЋЯкбанкЪQ\UWPQNPVOIIMPUJJMFECILLGJILENTZUO\ZJTQE)&здаксунзптЭНОЫЧСЦУРЩЪЪЮЯЪШЫакчщыэђяђыхмдЯЯдкйбЫЮгзддЖS%FV322B;1)бЯРЮкдЫШЧОКЉЋЗССМФЫаЯЮдсххэѓѓяяььээьраЩРТТЧЭебебЯгаС—?&,3:;1#"СМНЏЄ˜˜œЂЊЈЋЊЏААБИечщюэяёѕєђђєёэщырзбЮббЯЫНЕРУЮснМr149A92*"!ФЪЧМАЁЇЄЃДУИДЩРБйѕышэьщюёёѕьцхццхцртнллмдЭСЗИТЩкуЂV+*9?>:*)"!+ЊЎЖЧЭЦРКББЧхнуусцыэюёђяююёэшцнжЫЫаебЮзкжжмпгТЮпп€7ща„;!+%.0)+&*ЎИДЎКЛЗИЖЎВЭйпцэяёѓёєёьчхщхмждЯЯЦЭдЫЩебейпнзмчыыђюШzJ-*,"))$ЇЗМЖБЗВБДЎШухыэюяѕєєяырздейсйбЧФЫзйЯЭзйадЪФЫЮЯйкттЋV>NL!%&!СШУОМЗКЩзпрэюёяяюэющрйЯТЦЧЩШШЪЭдннррлжгдЮаЯЭШШУЧЧЎi0&  мндРИКЧкхцьюэюыцркссмцскбЪТОШЯмутрлжжЫблзклаЩМБЎНДi80!(!"%нкбУУЩежкрсррлжлеЫЧЫЫншытйдЯлттхтнйжйжЪЩЩ€ыЪЧЗЏЌЇСЕU&"!ддЯЩзрччэыьхжЭЭЯгЪЭаЭккздЪФЩжмрсмкаТФРСТЫЪМДВАДЫеЗT-3$""#&ЭЫЩетхььюььудЭазлбглйаежйпртркдбЧСЩеЫЪЪТШУУИЏЖНШбА@#?<($(+*)(.14жеммпстсмежбЫЫккееклйхыяэцмЯУЖИВВФаббаЪЮжЩЛАЊЎЛЗИ•?4A83-,$*$#снсркдкннлмнаабЯелпухх‰нплйШЗВЌЃБЕБЖРФФЮгТНЪдмймцБ]BI:-#))-нмкмдЫЦТЪазссллпхрсуунлбЮаЯЦКБЋЅЊВЋАРЭЭЦРЖААРЮзђюЌB8F:4,,284.1*$зеЫТСМОРУЫжейххпжеззеаЯЦСРЪЭУЖДИМИНССРРЖФТЌБМЭйэЎG4>&137<5705>AСУЯедгаЪбкупдймпгУФЯдУЏЅЎЖЛОФЭебЪСМСЪЮЧТЗИНЧзмтяјнoFG.38<7;.+)$гнхх€рнздйаЫЪЧЯШКЏДЛКЋЉЌЌЊЖФднрлкебжкущулзмхыыхлсШo?7.3)+3139,цчцшсусЯШЮрччзРВВКОСНАЂЃДТЯейкЮФЭксчшьюёыьытхшцѕјьF8(**090!(243хцулЮЫЪЧШУТЩЯЦКУШОИМФКЏЌДЗФЫеегатьяєђѓѓђьсрсуршщѕј™5$#1#*(1&(02+ЯЭЫНКННСМЖЗИРУТЮЩРЛЖОРТЦННФапуьёэшыэёэчшпршьёёщсьщЄZ?4*")%%$1A@;МИЖЖЏЏИЪЫИДЌЋЎВНФУЩЭйзднпучыььччщчыьшщхухрсшхмйбггМ”`4#-)%(5;;:ЋЎЊЈЈЅАКЛКЏЂЂЈАЕДШйрыэёяђяьэцсхсрпухтццслпккЭЖЌЏЌ›qPB:.+5.2>;;<ЋЊЈЅЎБЕЛШЩНДБКЭзуышюѓѓ€ЉяђѓэыхччтсллчшуунтпдШЮЮЫККЧC:??*1)0097:;ФМДДРУСТОЪбнрряюяёѓёёээышщщыцтннхцщчйУЗЧлзОРЩЫЭИЏИ–O:8;7;:7-1895ЭЛДСЪбзнсцёёѓѓєѓѓёэььшчшщуттпгажйкмдУУЩШакгббЪРНЏА}9BLA3025%*25+ўёяяђюёђёђђѓђѓьчыщээ’яюёээыьыьяюёяяюэюэьычцычыыштцчшњњѓѕѕѓђёёяьэяюэыььыьэььэрЫлсуцушыяышццщыьяёяђяэььыьэщусхуутчцуцьяёѓѕѕђђёэюэяюяыыэяЯшлпнтчшыэьээыччшьюяєёёѓэьюьющщшрцчшыщыэюяёєєђђьыююњшђяюьшшэщшщыюэщхчщчшшэяььхууѓчыьщышцхццщчщщМьюёёђяяђђюёяэюяёђюяьёђюшчхцхцщщышшьээчцуэььрмлпуццшычщщччььщюьюэяђёяяљѓёяяёёѕѕ№ђѓђђёюьчццхччщщььыІэщччшѕщжТймхчыщхщьээюыююэёяёђђєѕђђєєѓєєїљљјїјїѕѕєычтхшшцщщычучцыщыыщцрегбзсцшэшщыыьэыыэяяђђљёѓєѕѕїѕѕиєїїњљјїїѕѓыщыэюьшыьщщшхухрсннпсплакцђююььјюэяяёѓєђђсѓђђєєљїѕєѕѓёєђѓєѓёђюяяѓяђяёюыыщщэштртрсутупсюўђѓѓёюёё§ѓђѓѓюђѓяяёяёђѕєїѕѓѓёёђёёќэюяёёеђёђђюѓхнмрттччшэышшухшюяѕєѓђэяђђѕѓѓєѓђѓѓюэђђѓіђѓяђђяѓяёээсыюѕѕђяяэщэтпртцххшьыыьђёёђєѓѓђѓѓіїєѕєѕѕђѕєѓѓиѕђёђђѓђђєѓёђѓёяђэячцыѓёёщчссцщщыээчтуыэђђяіьяђёђєјѕѕїїјѕђєєѕєєђђЪєѓѕєєяьыяююёюёяююёюыыхухчыяььщчухшэёяѓёюыэыэяёєѓѕѕїїѕѓѓэєѓяяэююёђёѓѓёђэяђяѓѓэёѓщщыээяюэяююэыьююђђёјяђђєѕѕєѕѕпєѕѕѓяђђёэюэюяюэяђяёѓѓєїєѕїѕѓєѓяьююЗёяёюэяюёяюяђђёђяьэђёєѓїєјѕїјїѓѓёюэюьэяэщыыяччшыэюяђђѓїєђђююэёѓђѓєђёђёяѓёяянѓёяэююђѓїєїѕѕјјѕїѓёююььэьыюэююьшюёђђўюээтыэяёѓёэђђѓѕїєђѓђёђѓѓєєђєёэьэюёёћѓєђяўўіђчышшыыээююцэьёэяююяэщчшщыьяёяяђѓђђёђяя§ђїѕѕзѓђёэщщшщюяюьэёреЧИЛЧлрртшыььюёюьщьщщьшцуттЪпдкстцѓђёюэььыэяёђёюээєщыщычццщххутрхрпнтцщчшщыыщюёёюььэ№ьусмкжкмннпуєѕѓёёђюьэяёюычыыптчььщщштмнрхчхушььыььыьэяэьююМёэычхтхтухпкзкѓёѓђёяюэюђяюэьшупмттчцщчсслктцшшыюђёђяээыыээыюэюэщыыэююышётшеНєѓђђёыцщыыээцыщыышшхухтснлстчьыщьыьыыэыыяэьюэюэюьшчщьээчтпплрынжюёёђёэыышчтспнптчшщщхцщшщщыьшцхщххђцхшщщыыьыэююэююаэщхсцззбейзкыюђѓяэхстпнйжжлннутртхщьыщшччуутццщыы§эюяяњьэычщээыфщтпкеЯЭднжбэђяяюсемпнздезмсрррптяээщчщшюэычхшчыэяёэььюьыцшььычч’цхпйббжэўўыјытруыђнзжаббкртрнклстэюёђђєѓёђюшхтчыщьюяэьэьщыэўчнмппрпкжждТгйзулТджйлнмнтлмррпнмнтшїяёёя§ѕэёєххтццќчыщыыэпусЫеЛЕЮджмрцтнййЮймыхлжбаемтчщххсс€ЮртхщюыььшзЯгнпмпцьящэыхтппрмкждбЫЭгйтухррнайрЩссрнлклсхсккжклмнпххцыщцрптурсутччшщээяьхнклмкжзнкееклуцттшюхщЯvжзкнсчьщчрлмйжйнппнтцшшхрпнсччщццхшшыюьщщцпптхблїјлцтхцуснчКx^V9здЮлцшцчыюўјлЭујщрлмрнмлйкймтыыххьутхшыщьыээюэюэяюьэыщщррэє‘;NhYусьўўьышщыьчптччхрмртрнппякпсчххцыьщэььэяяёёПѓёяђяюэюяјљшН‚C$4A@ьщщььюыщшыэшснсурУбекйзймнупрцхшчыюэёёђёђёђєѓђђёХяђ§ўўЎNHE81?<хщьыыэчслптцхыэєтбзртухууххшьчщыщэяђѓђђєѕѓєѓѕєєѓмєўўмwAA7905:шыюьшцссеущцюяюяяђёэяшшыыєюэюээщьёяђѓєєјѕљјїјїѕїїхљѕзM?C81432хщющхстцшьїяђѓђђёхэщцучышэюёяюыюэѓѕєєїѕѕїјјљјјвљјјћўўлЄ—‘gA243-шыьєѓяєєѕђђёђђёёюьышчттхццэююээїыёѕѕїѕјљјјївѕљїћўўл~hgZQZUE0$яяђѓєїѕѕјѕѓёяяэяэыыьээюьюыьэяякёѓєїјїјїѕїѓѕєѓђёяѓђљўщŒ79E##)%#юяѓёѓѓёєяїщщыщяђююёюђёёќђяёѓѓѕкљѕїѕїѓѓђђёђђєѓѓђёьїњд]-S\98:353,юэщяёыыпэшпсучщэщшщюёѓѓєѕїјјїїјјїїѕѕђэюьююэгђёѕьЏI291;?0++ьэщумйежйлмнттчццщыэюёєѕїїјјљљЫјљјїїѕѓєђѓђэычхчыњћд8(8@;@9,&&%шшщштнйккдщёщцђющёўєїїјїўѕєєУђєѓєѓѓёђющшшщэўўЕ^03@;931$&--хуцчщьщщшщёўєђєєѕєєјјљљјњјїїєѓѓђђћяђёѓєємѓёёяяѓїњш”<*15*%*(,-,.ппуцуччхуушыђєєўїјјЇљјјѕїєїѕѓёёэђѓяђѓёѓђђяьююяђєўўтˆP4;#*&")%).,тучцчухчцныјѓѓїјљјљїїѓєѓђёђяёяёёяёђђѓяђђээышыылёїѓЖ[CZQ-*$%&%&эюющччыэяѓїљјјљїјїїєєїѓђяёюяёѓєє…ѓђєђєђёђђьшьѓжz:(>+#ѕєђящщэюёєѕјјѕїїѕѕђђєєјјєѓёёяёѓєїєєѓђєѓёѓђёёяэшмят~A2%*-*$+*&#"ђёюээяяѓѕѕјѕєѓєђёђђяєѓѓђѓёяёяёѓѓсєѓёюяээюэыщутлђпk++3+*!$&!!яяжєѕјѕїљљјѕѕђђёёѓђђѕяёёэёѓєђєѕѕєёюющыьэыщьшччъяўнa@<81+**"*)яяѓђѓѓѕќїѕђѓѓЧєѓѕєђђѕѓѓїєєѓёёяэьэяюяюэёяэышычхѓљФG,AA,*+,-$"+28ѓѓђѓѓђѓђђя§ёђёёќєѓѕїїгєёэышшщыьэёюёђююычшштууЄG7C@,&%-&)$*)(јљјѕѕєђђѓьђѓяяђѓѓѕєѕѕєђёђяьшуттТхчцшчьыьээщыэяўўЦhLL;1-*&%+!)єєѕёёюяёяёєяѓђєєѓѕѕєєѕѓѓёююэщчттлрущььыььышхчыэўўМJ9C;1.2-,07100ѓёђёэюю№яёёѓђяѓѕѕєѓєјѕёээзяюэьюьыцхцшыьщьщхттцщєўЖM;8879<52017<<ёѓђђьёяюяёяяђёєѓёяяюээьшццЫыёђёяяююэюэющчцчыьёё§ўхvLC78<<@црсстхтцыщчтнррухюэђїѕљјљїјјїїѕєѕђєїєєѕїѓђёэхжкзЊuJI@0,*5@BB>4цустхшщыььэчсцђѕњћєѕјјѕїїѕїѕљѕѕїјїїѓєђяђѓєёёяёырцьžE7NC4078;:??Bюьщщьююьёёѓѓєѕћјљјјїј§їєђђйѓєѕђэщышээѓёяяшчлпЅP8A?977239<>9юэюьђѓѕѕ§їѕјјўїјјѕїѕѕїјїєѓѓёяяёфѓяэёђюёёяяэскЮ‚5CS@82.3?><><€ажмддйзгзесцёьчЮЭгннссхсппчсзЮйпмккжзлкдтлгОСапедЫШТТбяђёёѓэцкжклмкдгббгззгглйОЈЖКУУЦЫзййгжЧЧЭккдмеекйЭЦЮЫФМИКИНЭЫУЪгалчёёѓяшуччнлйЭЫЩЭЦЪЪгдЯЫКЕВЎМРЪЯмржУЧЪадймнтуезгрсзгЩОЛРЧФдбЭкшщьюђюнездйЫШырЯЧНРЦЦЧЯжнжЯОСС€УЫЯЮемйЫЩЫЫЮгбЯЮЦЦЪбЩШФЯЯЮйпркечыцзлйущцрлкыыумдЪЪУРНУФСФаЦУСФШЦЛЦайЪФВЗКЛНЧЪаеЮЧФРСЫмелкйннчэщщсннусцхёяюющчтдШОНССЛМНЫЪЫЫгздгЭЛСзЪД™ЉМНЧЪШОРТЫажжазцутсуьёюэцснщыюёїѓєѓїяђэяЫНЖОСФЫЫЮЮФФТШЫаЪТСУКАЈЅЌКРЧЦгЪЭгдбдЯблнртщющьюѓёёѓѓёђђєїјїѕђэычЫЯЩдейЯЮЭЫТРФТЖИЖДЕРЛСЖЎЖЧзммеЩЫзждЯгплпцщщшссѓщѓјѓѕящчычыюшшЁутщпгчщчкаЮджбЯЪЦТОМКМЩЪННдєщыпмзжжнкзцёьытмзйгмшэюѓѕѓёытпгнтмнгЭгхусшхунуСДДЛМЩШЫЭЫЭЧФаЭбеццумм€PпущхычтьяырхуеежлуыьычрктлржаТСачыюьсгбЪЯКЖЕНООЧЧЪегбаншььэыцчэьцьєѓђыычьщчссчщщчунмгазрьщчлкЭЭегышкЮОККЦЩЫЯдЫЦССУйнчэяыуннлсцєєѓяѕјѕѓѓяёэюшшсмкцьэшчхтааджтщстжааЭЦЧННРаелбЯЭЦШЮйшээшеЮзнунухюѕѓђѕѓђыупыюыжбмтхыьчзбЫайптчшхччтхСЩЫЯкуткгглкаЯмшччцющутээчрхцэђѓѓђюумйзцшузЯаЫЭЮаечюёђьыэђыушусуеркслеЭЭглшчпждпсыхсжЮзьэяђѕђђёѓяэчскздйгдЯЮжйШШ€кгемншэюѓђђяунйдррхцхщысрукмекрцтьщсжлцьцыяяшччьытпйЧЪагЮЮЩЫЮаЪжепучктмддмемйдзуйшђєёющтщяэюшхщюччлЪдхшэьђѓёяё§ўїсЧУЮжгЯЦблштдСШжсщьндббжжЯдсэщщпюэюссптмкйчђїѓѓьтаЫгзбажсземЦЏŸ›АБЛМЦЧбуцжгжжЮУЧЪЭаЧСФРКВДЯШУцысжЭйжаЩечяёчпсьнбЫЦЪЪЯЮгФЛКСТМНСЦЫФЫабЧФЯзмеЯзЫЯллЯЮМЛЕЎДЦЦКВФшыыхррммбйуюраЧЮЩОРдтсЯЮЧСОКИЪТМТжймаЩЪгждбмтнптслйжЭФСФЛИЗРОЖЕЭпыэютнлшрезрйгЧСЕЌЏУТЪОЪмаКЋВЭкжЮмшьсрмкЯбжбЭЯедЪЩайкгазуснздгЋ—мтцудЭШУажгжгежзббЭдЭРМИЕКЕЪзкзлбжйпдзнгЯбммжеезаЦУЫбаФУСОАБИЭНАтшущучзабЫСС€ЫИНШЧЪжжФТЩЫШЭЯгдЮЦТЪСНСЩаеЯЭаемгбблмгдаЫбЩУФЗЋБЕЗАЋЭуыэчдНЛРКЏЌЉЇЋКТОЩШМЦдйекдаФФМТРШЫджжзпсупкжежбЭЮЭЯЮЧКЎЋЊŸЂЊЗЌЌЯйшюлОЏДАВЎЉЇЇЎМЦЮУРЧзежЧЦЦезеаЭЭЫЯаглнллсмеЭУРЪбаШРРШЦНЗЌЅВгэєпчгШФЦгЮИЎЋЈЃВРЧЦЫЪЛЏЗЪйщщђьэылаЧММОЪхсжгг€ЫджнхшўдРСМСОМЖАЁЄЗДМЛИ•ЈЋЎАЎБОФЛМННМИЖЖШдцуюёёјэззкаРЛНЩЩЦЯслЯглйдСЊЕ•‘ЋЊАДТОШЯНЊžЎОЩУЗЉЂЅЋЕЪмееЭЧФШТШЪЫЭаепмйЮЕЂЎКДДИЩегспбТКТШРМДИЗЏЃЂЃДНайдСЖЋЗНЇЧРЛБЊЏКНТФЛДЖДИДДЖЖМУайбНЛОМВБЕЖСЭзмкнзЭМБВДКОВКЗЖВМНМУШЫЮЮдЧнЩxЄЏЕНУЭмеФИЕЎЉЂВСМИТЯезеЭРИЎИЩнЯЭШШРСЭпупФНЖНЦФАЖлюЩкЪШШЯЫЦаЅpcUAЋЎЅВЧдзнжлђцКЇФнЫТВВЛРЛЕВБЋВШзаЧТЦСЩЫЭЦШЫдгкнзжшюшлЯЩЯаЯФйю–AbxmИКбўўчЮТЭплаСФЯкЭМЛТМЛИЗЕВБДЧаЮШФаЮЦЫбенмущыыэщцслйзгнчщйКŠO:PUQдЫСЮгкрнйрпЫЕЕФЭОЅЉЊЎЊБНЩРОФФЧУЩгзйзрхрлыэшхщцхцщччэўўНД]YWJCGNаЮЧбзккЧККШждгжпЧЉБНФШУЦЦШЧЪЧЫФЮбгжнтыяюхщьюыэюђђѕѓїїўўшˆVNNбH?CЧзнсзЫУЛЉЛЩЦайусепегйЩТЪерлсхтсчрлхшшчшыђєѕїїЛљїљљњћўр‘WYVCB>:?ЧЯдйЧККРасёьэёяыхяыцгЭгеЫалнйреаЭршёђѓёѓѕљјћљћљћљњјўўЩуЕŸЅtQ;A?@ЯжмђчптшщытуччуьштеЫФСОТУбзмнркеншяєїљјњјњјњјјшљѕѕљўўсŒxuhdjdN2рудтчслккйдССЪзмескпмлуэяђѕјїїљѕѕјѕєьхмкйзжуухрхпчсйЉO)BILFEE;&(бгЯЪИЎЏЎЋВЕЛНФЧЫШЪЫдцђѕјјљјћљљНјїѕєящцхщшсрЭЪЭжкяђаC3SNNPI9824зпжЮУИККВЌЫтЯЩткЯяўѕєјјњѕњјњјјѕєђєяя€ѕђюђэюцскЮЪбсєљКgA@PMHC<:848РУЪанмжзЫЦлћюяёѓёѕїљјћїљјјѕїђёчрнхццсшыьшёюшпююёёїх–F40J;).%2-&4ыюшеЯЫйьюєєљљјєѕѓёююёєђяычкджуьѓђяьющхшёьхчшрзЮШгЫ~N<57?97)+&1(&ьщнеерпчюѓђѓюэшышрзсчёєєђычцыюяѕђёэюышлпмкмкЭЪФРкЫe-8?8BA7#-$)->ыычцэїѓљїїєєцннухуцхцэщшхссцэёѓѓёыцебзймйзаЯЫЩФсёЮgCEA9318,#$<5Hпсрэђёѓїѕјѓђууьяэщчьщсчююђђ›эычхеглцснкпзебЮЭЯЭрёРG4PP;21@13C?FPхчцэюёяёшутцкрщщшшчюьёїљѕѕѓэкбЮШЫйухптмуыцаРРСЧЭЧNFSE?75:5)+?>?ђђВѓюььяээьэтнцшыэяѓђєяэцьшлЮЮФКОЩЩЪЩбгмскбкущщэјРkY[F40:C41E<#эюэютлккушшяэыьђѓѓ€ёђяшртпдЫЩФТОТРШгмпкгбФЫЯмуўўСSLLE9;;F;44@JQQWадЮЫСУШййЮУТФЧРбнкйхщюыёяђёѕєјєѕѓѕєњїѕєѓяђёїяьцххчаЃcB8BA<;EOSPUСУЛУНМУЫЭЫСЕЏЖОСЧЩечёїїњњїѕѕћєђёђяяђЋѓђююыхаОРНЃ}QWUCB9:LUPMaНФТНОТРЯнлЯФУЭньєјђјїјїљїљѕїїѕѕєђђюёђђээяђьутрйЫЫрЁLNaUG,NTL>QZS‹ЏдбкндЩЦЛайЮТШТЧЧУЭЮФЛИОЗЪаИЅЂЊЌЃБОСИВЊОЧЦУОЎЖЛНФ<,*#2FPYYUQ@32PThФЪдьёчдгЫЮЯЩ”˜›ЅЗФКМЕМОИЌЅЈЕЋЋЖОРЪОЕЕЎЖФЩЕЖШТС2AF?HOU^aWPQNF-<<8GcwЄЗбђуллгЯНСВЂЗЪЪЖЕМеСЗЕКСТЧЮРЪнЮЫЪЦЧТУажзжб?:>:AF??<;5:FOM75$15872B-31.3cЅЛЅЄБЈЏЌЅЈДЖУЦЌРйцсмхщьэыьшщрллбЫЪуткж114*&!12);CEG8-+A33:\o{™ИЩЌ—›ДИУКЏЋБРЩЛЋ–ЋЭзбУФепЯТЖЄВУЭлд-.5B4"$5AGLNF549VP8,8[ЄНЦФЕЕННТЖДТРОЫМБВЪЫеЯЗВЗОЛИЕЖНЗВФ9BE20 .98FGPQ;2.97:91WЁпΘ™ЕржЭбчыхжЪШЮбдаЮМИУЮзгРЖИЕБВ0"*##!$"&+HGG>@VC?QЈцєїюртщщупжмнцэысткрндРВЎЛЧзну " !,CBCA98<8@!)YŸЮяцзпшжРанрццрмелпурйУРУЮлбж!(+$&&"#)%9@?A4,00*>Cmаћљёюёутцѓящсйггжсчткгзтсзм &#(! 3G&!!48;;?><,#,90TВяэмуцычььрцтлйкссрмтрпкаа!)%,#*%#%B<:%538@:,("?2(cКлеккмбаЫЫалмсхррпгЪЧЭйлз!$&)$*+#O8%!"#+;9;-+#2I9#3H[ЈпсшнрЫЩЫЫ€˜дзжтлтмЧЛЎТТ).2-*(++&"!(..1!!Fr?#)!AG;-+4GPOF:@qЇУєубКЩРТФЧЩкнпспЪФЦаФ!"!.!# 0A&<:%;:3.1.!#&$2&($!4410558@40N`n–ЪмэщруцтаЧЛЗЖШУКб#12")MСћ§щЊp9&+711+*  -C?A51%"-HH>a…ЦзЪЧлпйЯбзлммаТЩ #%*-"$4ЄяћћњћћщŸO5>F)*$%&+" +57>>95?2A9;YFqБВЛхцмЩЯЫбмрбСО($,%.<Бљ§єєљ§ћћєЮŒ:)>+)(*,0#$,75<>BG8-7?IjŒЈппкЮзйкхьькжй3%>@:AМ§љљєєПѓюѓјћ§бwB9*#)!!#&)#$U[OM>?@@1FC*?ЕпысщрЮйщююяэWC7&-jю§§ёѓѕѕєєРѓѕњ§ћЌI.%&$-32 49.#*-8;>9+7($02853!&"@>9PFOwнћ§ѓѓєєѕђѕїїЦѕјћљљ„7>HHGc<:Pa`rЫјњѓѓєђѓєє§ёєѓѓєЫњ§уЎ{]BCB($;))#188+17>JF7TЖЪФЭпёёѓѕїѕљѕѕПїјњјїѕѓї§§јЌYH938,7* $%;@80%#-*,?BC88)8SЉедЯлщђѓєѕєєѕїљѕѕєѓЯєј§јЅN7""-)4MG7<19B3*%"%84;1MMC@14NИыщдмчёѕѕє§ѕїєєѕјЮѕєѓћћщ—OOUB1#09S"!4A7$#)";NQE(1GŸуедлюѓєѕѕљўїѕѕєѕЯєѕ§ћљ&"-257L(4323,+.+5.&-BBA9*9SŸбЮгньѓѕѕїїјїѕјєаѓј§хЂd@N:UV40*,9;>8:378()!5993HJWЖщнйрьєєїїљљїћѕјњњїїЫљѕєїєєњћ§є”nF9O:&21#()28>@),)+3).37CENVYЏтзцюѕљјїњјїїјњїјїѕљїїўљѕѕујєє§§ѓа~J))&%-(->ABA@@40-ёьцссчщщюэюяяђяѓѓяђѕєѕїѕїїђящццшьыёёэяэёёмкзтёєєѓїюѕўё•YYѕ70MmPACB?;A\]::EoМтѓэрсхщццэыёящыщюэђёэьщьяђэыыщщьы459:()"&-*23->FGGA:@?@B;8dВњябЭпјюђѓѓєѓєѓёѓєѕєяёээяёюёяэьья-3,-"!*(!$%+%,*)(&?>;>259?A.5GbИћўћўўєѕєєїѕєєљѕјїєѕђђќёящээеёѓђ)**,)!()$0)+**#!"&2A:@EB)0bЏцўћяїђєјђђєїїєёѓѓєєїёђёђєёѕѓ"+!"&-*%#(1-$"+1**05:4;?A43>Lvйўўњѕѕјљљјїєѕєєѓєѕѕїїјјїєєѓ$.&)(#"%* @M3$,03+3?F907?G7]Тўўюђєєѓќјєїѕѕьѓєєѕїђ%",0(#%%З+&3A*€›&7;5,#0CZL39PhЛѓўўєюёяюяђёёєѓїѓѓђэяэю23431,&()&&,*&+,MpE%!!"7>5*+9CTWJ;FzОсўћѓшыэюяёєђѓѕѕяёюяюя1102)00 &):3<5*)H;.112.%+))$,7920%4:)(35443%$"*>9;?89:#?TQEg”щћюшђєєѓяюяђёяюэ$15((*,Ѓѕўў§ўўыŸI9?F5:-,++--$""*1899?::F@G^N…жхчљђёѕёѕїјїѓђя#+3;3@ЗўўћїћўўХєб”>.?2(,)-0)&&(,37@BHCCF;?Uq˜Ф§ўѕѓюёђѓјјњїє?*2F?&BИўўћїїѕжјњўўг~F7,!$&%-2,"!OPJHE?BI8IG0GОўў§јїђђѕїё]FC((-pяўўјїјјїї§ѕјўўШЎJ."(),..,%##.<(77@CAA93ESxŸСпўўїљѓѓёёNVG90ZЇўўјїјјїїўњўўмФqJB+3.)**,( 4.78CC:1*JPNV\^–Тўўюљєѕ ,JAGНўўїїјљљјјўљїїўЮїЁB.,B<5585+,($$&.12+$!E?@OEBJFJ^ŽИЦгё70?:YvрўўїїќјљјљљЦј§ўўћ‡7>G1!*")*+*%&!204214?>5GFNeSP\CBPPOq@9Ygewбўўїјїїѕїї§јїѕѕїўŒщЖZG>C.#8:8**$%09<:<52278FGEMTLIgg]U#0IFSОўўјјљјјњјљјјѕїѕєѕјћўў§Њ@>aH>Q>832.(*2:@B:+15;HLEBFJMOMFHL8>EJAM‘§ўїѕѕјїїјќїјјљљЭћўўРpUI;:399<;1)$-B>4-305;>ELNMMGHTUP8>BAIBpцљэђєїјјћљїїјљљЩ§ўўђPGLGM92 &%+251,&%-+?QeGGIBJ87?VM<[ЧїюёѓѕјїјљљјјўљњњЫљјјљўўћБ`MA;;2?)*#%,75(&#)97(@HEFIHHB4<[Цўјђєєѕјјї§јљјјїѕаїњўўЈU5$&(1:LOAG%*897-&$%&..5>@B7ENOE3?`МѕєёєѓѕјјљљњљјїгјћўцЁeBI;U`:<,").2.45;;9?84>C<8:>щЮТМТФлстшючыхыыэящпэѓѕєє€ЉыдЧСФФЯрнпучуйнЗТЕЦньѓѕђрщўїŸjokH9Pk\WQеЪИМСУНИИУЛЮруйлмззсцытнуьЯЩФзеймптчщчучдЗАКбёьёэыщєћхˆdI<+-TTPТЯЯЭУСМСЫбагЧННбнбУФашргжлЧМЧпнмлсутпйФЕйЯМНТжнцщєѕћўўй‰;GJ4:FNзммдШУЩжщыжЪШЪЦКЖСЯхыьющееЯрнбШжыяыхЪРНУШдртсыыёѓєї§ўљœg^I.*CIсмхщпсаШрщучллннрбУЭЩЫгсххЯгжакрйныяшзжмЭгЮЮЭЫйтсычюё§ўў€šТxC7BUPьыйЭЯЭетсэючрлдбтзЩЩдеджпчткагпцжЧЪгзмжЪзтмсмжгьёёыьљёєў§ѕJhpH+сйЪШЩНРаЯецяьчржтштущхезуыцннззццнуыэяяёюыкаНЛЋЫмРДЗйЃŸЫЖЛжВWHA&урйауэшрждабеаЫзжтбб€ЕЯСЫйЯЭжхыщсджгцншщэшпзнШООШкЪДЕЕИДЗЌЅОШЁP@2тущьэюѓёшкбкмбетсщцхчуЩЪЮдеаЫемкгкдйамдЭггдтнсЯмлаШЛЏЎБВЎЎЮдЪžb?щщскзмлаЭжмцкурлнбУЪШЛДМТЩбмньшзжйгЯЦздсрйдцуйЫтчтйСБИЦаСЄ™УЭБEдззнуумчшээыšзсгШЪаЫЪаЦБЕцьщшнндЫСОСбпхжЧЌАЯргбЯЪРНАДОбўјд‹ŠЋЪМйшыукаЯжйЭЫпшуургЩЩкгНВЏЎМймнбЧЯЪЫжнзЯШЫЯбНЖИЧЩЦУФНЛЛ€СжбЕ‡ЭнщхэюэщскбаетпеЭЦУЦФКИКЛНСУЫЫЪйрллЦИСзтдЫЪКИОФЩЯддЯЧВВАЊЇТЭЊ‡›„ЈЌБзйжзгнжЮдушхзкЮООФЖФСИЛТЫдЮЯЪгЭСРОКФгаЦФФШЧакклмсзРазчœŽ•–’„ŽŒ•ЩЩЦжрчкйгббйзлдекпзШУМОЫамппгЧЪЮЯЩЗЛИрњпЯЦЎЎ™‘Є˜ЂЋ˜—˜ЕЊ‰’ž›•—…~дУМТЦЮбаЩЩЫмсцйЯЮЭЯЭбйннгаддбЭЯгЧТЕЌ‚’ШѓхртЛБЇ”Œ–œЄЂЊЛНЄЖЇЈЗ‹Š•ткЯЫЩдзЭЧШЯбезЮЮЦЧИННУФЭдзтрзЫрсЭЯНЖАЊБЛРОФ•ЂЄЗ—–ЅЇБСРУРЛЁЛЕСыћЩЫсхЫТЪЫФЧСС€ЮОРЭбеЭСМФбЯдзЭгФауйФЭШМЛгжЭШУМАДКЧЦРШФФЮЦКНШаккФЎзљдкшыткааШЧЧИФЫглнйгЭЪЫУЛКОТСТМИЖИЕЎЈБадЪФДЏНУЩЧкбНМФЕЌЊЖФбгйМДЁЏыЦЭтШЃŽ—ДЎЅТФШЪуыьпжгЫЮабШЕЏДЗЛЩЫСФРУЯцпИЈАтЯДМУКЎКБЋА›ЁУсљрЕЫЩШžЈОА•ЃЅЌЏИФЭШЩйхчсзпушдЫЕЕ€вНМСКЕИКЗАЄz‘}ЕдЯмЮЭцчпэйТцўэйУМЫкЌБУзЪУчѕСЅБЗЖИЛОЭйаЪЫШЮЭШСЗВЗЦЧОЗИИУСМКЌНЋЂСРєјэюєѓѕёщЩЩйцнЦМТЮЪАРСОВЎКШШОРУСЪЫмхтаЭШезаЫЮйЩЛЫукцєраОбрщчкРКажЮЮуыьхпсзЭШЪЯЫФЯлмИЦадИЊЛРФЭЭЧТжсрггЧТФйнлйргЫЯймьєњѓюткзЯалагещээ€БьтчшьулккчххьўхчыыђлзЧЭОляйшўђужЯЧЫЭрпймЯТФЩйчээѓєѕђушыэьпйрюѓєююхщцутшсэѕєячыгЮИЇФйО›‡ˆ”ЅЗхжйЫалжзбЧНЛЛУЪжпыёышцрбжтмьэцчууштмФджжксчщцршѓбБСРЕДЎ„a\QWjkjˆЅФЧЩеЫЪдпкЪТУСЫбжуцмаа€ЁжнпррпЫЫШЮЫШИААЩжтелдгйемЩТЫcWbhTB`gaOnqd›ЫёцёёылзлхшрдеймсмстсжадасуЧНКЦУОЧекжЫЮйрзздФФЭгрMC>AIVYW]VTTBAZbrŸжтщўўїхунчхлЇЌБМЩлзбЯкмЯТККЪЦЧЯпрхзЯЭЧжнрЭЦебдAWTJSS§\ZQQŠNFGAFJMGAFHAIPM^tЂйчгзЪЯЯгмйабЭЩУЦЧдцячлцщцьшчептчэхтьёјјєGHH€ьCA?CGUHB9.->ABBGA@;FT71398-*;,2)EGJLNJLIQonICJtЛзхнЯЪЫЯедЫпЯердШгктьуаЭакзбЭЯгЪЭйCJHB?9@1<191>85:??BJUMIJJVMSF>C>;73<.:&389@MJHOTVj\U^Кўў§њяђђшяюэђюѕѕѓёђђяэьжаЦанцэѓ552€Џ:<1>8E:).:<<0&853JJHFMSVWQ1;jЕхўђщщѓшрхэяѓѕђычяђѓёырлрхючю*024:7:>7?8@9:2@??905?:;>LFI>MLC)>NT~сўўћјѕѕѓњјљѕёьчыыѓѕєєяђђѕяэ%43;@4812815)5?98?0SdF?9;?E8MVJJ@LSBhШўњцђїѕњѕѕђєђєёёѓ€сэяђђёхч0@9;GF:3.7-7@9C@@VJ>{Юящыьыьтнмхыёёѓюђёыммтьюь?B@FC;$%+49>;7>$[ŽZ$:8@?:-AJA9;JSmk]NN~Ийўјцжррзелцьѓяѓьплкцп@;>FGE@1,!$58EMHVN;A]N>@JJцC-5824;E@T8ECVcvŸНежСЩШрюђђіюуддсхьщ@EE€†ACP;GqЂ’o`GdQNEE?JLEBALFF<5BЈўўХѕЎ\?SVHHC@>>:>B130.8CCHILPBaPTj^ŠЪШЭєяымцтыёёшзе;ECPN2#FРўўўјўўРкЂF7QB0H>@CL;1>:40:;AHQ]USNJOd‚–ЖѓјёпчуюёѕѕєёьZEJ[Q5VЪўў§њјњљјјўўРнŒLB;7B;4>+HCB7>5)Y[NUU[QTH``;NЧўўѕњяущїјјљјpdYE:;|њўўјњљћјњјљљўўТИ]<374@A?>@>.01%)8EAGIPSTZG;L^ЇЧнўўьїёёђюjvVMFiИўўћјћљњјњјњјўўмЮ‡dS?9NFG<::8B4!>BYYTLLCE5@;04>CFAJEH4WQPcZN][ZhœСЩЫьLGNNcŠэўўњњљјћљћњ§њњ§љ§ўў‹”GQWC&,@A>>PB@.45@8?ELUOL[UdjnqVUabW}FPm~{ŠлўўњјњїљјњјњјљїљјњўўђО”nYSNF5MNQO@794FB>-89+5IL;YUOTZWVVCLkСэьсьѕљјћљњјљњ§љћљњјњїљјўўгЗe:38+8YЖєщтђѕњљћњћљљњ§њћљћљњњћљљјћўўЮ’1-Gn+),*-49:98>EOIMUIFY^\SEGgЗхтчюѕљљћњњљњњ§ћћО§њћљћљћјњјўўяЕpObN+o}OQ921.@EFCLNPSO џўˆўˆџ6џўˆˆ3џ ўˆџ1џ ўˆџ.џўˆ ўˆџ,џўˆўˆџ*џўˆџ(џўˆўˆџ'џўˆџ%џўwўˆџ$џўwўˆџ$џўˆџ#џў€џ"џў€џ!џўˆџ џўˆџџўˆўˆџџў€ ў€џџ#џ#ўˆџџЛ7A71OPEE?>`OM•ѓљћјјєїљјјїљћјїѕѓїљ§§љјїњћљљћњ§љC77..iNIC:C4iы§ћѕїїаєѕїјјњ§§њћћљћњ§§ўўћ§љљ@7094F#1B;>75B7-$4:B7FCCїчбпыјјљјјњјєњ§ћ§њњљњ§љјљћћ-A?$!0288B7>FA$25mэыгчюѕјњћјљљїњ§њњ§§љљ§§њл -@?$1,#,7>1;FC8C%WИнћћёїјјљљњ§јљњўўњмў§њ§њ§:C2*1C8;ACISEEHB2&IЛјћѕѕњћљљбјљљјљ§§јљњїњњ§§1??1"T2<.49?;)BJmёљ§їїјјљљјљћўѕљљт])!52Z|93012NGTNPhI8\гљћўљњњєљјјљљ§њ§њњјљљмј›@0>A&00(*#%9C?9ITWdGj‘лћ§јљњ§§љ§§аћљ§њњ§њљћ}U(5L8*t\CСћ§їїњјјљћћљћћрљћњњuudJ 4IH?2.388?0.-4@I;?%Sћћёѕїѕїљјћљћ§ўў§§ћћ­mŽ{,+B;40@G8)-1487?+2<*Q‘љ§ћћїїљјћћљљћ§њ§љћљ|}ŽŒvU9:A7:@89110:3)-".:AvМљїуєїљљќ§љљјјжїЮТЁ”^),;BEA<>FB3+87AGSO\|cаљњљјљјљ§§љљІћ§њћѓсВАЉ‡N# 9?2+3:254,*378][Fcећћ§јљњњљћјћћ§њљЏ•—ЁЅ™œ|C!4AAB9-3;*,#-?92(-bEiМљ§љїљјјљјљдЖЕйТЇЅ›Šj AOJ:,577*,+)-25O?C2Fxљ§§љјјљјњљћћНюЫрСНЫуы˜B).>@4)$+11ъ,120359I@>uР§ћљјћћ§§њћћчљЎЎЖНЮуѓјјР\29^\;5)!&,"..ЦBEEFAAVhрћ§їћњјјљћћљњЖЕЦРЛЧдзЩЭИ]LSQ4,-+35.--5FJG@UQ9iѓ§§ћїХћљ§њЋЄЈœЂКТЩнмшЈ5AEJ+004273A7?BF><87HЅ§§љјјљћ§љњ§Љ•›ЇЊЅЉЉтОЗ}I(:B>9>E;;?:2(5;7APV`gюћўјјљ€ЙћљљЋЁЊАЉЋЉЂ›”ЋдкžA9I@CA5+,;:HBGC@%31q§ћљѕјјљљћљИЫрНШЫдЮТУЮЩРЩЪ…53^MJA-7AA:FGC?G?F<><Вћћўјјћ§њњЩлсрпжЫЧЮЛИЖАЇМŸM8\VM;5:FFEA;>F?A;YPVЦ§ћјљљћљљОЮйаЮУРбЪСЩЪЧЛдаЉ\MI54+524<;CF5H<ћ§§њ€nљЩЫЛИНОйхьуцуЪЅРШтт}GF?1,5:;:55>EF@PEb‘ИљњјјљљчйОБАЭрыысдЦЧШаМляьmN:94827EA88B<7@71bћ§ћјљћљаНЌЏБАФжеОЏБМЭадьюн›A,LHA7+)24?:75>7@5Uаћћљ§јјЯОВЉЌЊЋРЛЕžЇИггЯзѕзЌp,%>GA!(!,.99@A21(nћћ§љћћЭаЩСЧЦРЧаШАЖФРЕЏЛАВРЦL)5IJ;9("((+*I8JчћјїјћСТйхшсрпеСЛУНВЈЉЖСсхюЦU?14C,,&Eˆћ§§јрлсйЧЦапмЪЦЖЖЪЧЮУУСМУЮЖed?$+28+)&))54#2Q^Ућ§ѕЦНЦЛРайпзУЖЋЛезЫЧЯЮНЭктvPJO1(2*9><:<:>AF%35{їћѕШСВЊЄЈЉЎЭзаейнтчддШОМєјКUC-)3#2BE?28BIGLGEiј§ћЕЃЅЉЕРСКФуёёящцнкмдОНЫючnE:-8%!"9ABEJONUtprм§§ЛУаймсчкдтщщтдЭЯкшрФНШуц™gbIEH,&)8HI;2@.,4:VžћћШЧНУСУЏЇЕУЪЫЪРЫтштмЯОФмыЌeF;)9,&98Њ§ЪгмбЮбЭжЦЪЪайжгФЯдаЮлхюуг—E-.@9;:9-17197%T`O9ћдеаЦагмжбЭФЧземтунзУЯзрїїЯa1#+(1()5$5<41,BN>CЅћшццхслнрзмлдйкмнсмкЮЮзЭТУЛd5)#,CA9?75578,VQ;8ЩмныэыьщцтйажпмзхщхнпцйлйФИ^C29JGAA89:@H:HJ?(GьЮааЭЮШСЧгРЕЕБОЩлкегзмзЮдЯЕV?A#.9:8?<72&27;;2.))(*0,44”C-Nie~™™ЖгзШшйцѓюєїуяѓзжїхk:B&3+,++0)!0BPLLJ7#dA87>3>PYbmbFdcZuЉ‹jВЫДƒvqIJjT?71$,4$-.>F4??72™IGGHINJ33&AVG5--%3&"("-3;;?EEFŒLLJFI-+I"-3CIQ&*+.+4,$3*!# &$(&1<30$;9n3MBG12:889))8?Q+.!(8-)$$+!#&($(&2<;7?CB‹:04%5:.&)03))4.()>72"$-1!"&,*7@(7*)’,(+,8@7(,1.1-+&$)(%0I+#4!&&  %".0-CkcMŽ$$)%,0E@%$%&4h~8$&!**%+A&CBC‰,**+&&();MY:""!+AmpB#"($)+1(&)4@No917?4429V^nUC"2+44G++3:5-&##(#&(4:8-"%ZИфC<:0IOIBA>^JQ™јўўњњћњћћњњћњњйљњћћ§ћћњћљњћћњ§ћћ>B830gOGJJLubP9CB9>9;FwАўўљ§њљјјўљ§§ўњ§§Яў§ў§§ћ§ћњMB?2;:948HF:474?CA~ўў§їјњћћ§§ћ§ћ§ћў§ў§§ўў§ўк§?E?45..13399:8F@IBC›ў§яїљњ§ћњњљњў§§ў§§йћ§ћћ§ћњћ.5;74,1-37<<>AGG012qћўјјњљњљћ§ћћ§§ћ§ћћф§ћћ§§*9:B45#17>?CFOMJO10ZСўўљњљњњћћ§§§ћ§ўў§ўў§§сћ&148.:;J5EIMOUWQOJ7&PФўўљјљњћћб§ћћ§ћћ§§ћљћљ§ћ§C+1<@?1[’9,;GC>BHNI4LLq—їўўњљњњћћњћ§њ§ћћцu;3#9:#a~>1>;3TZ[ZUiQ<\зўўўћ§§ћў§ћћ§§ћ§§ћй§Ц\-7:;-49(288:EOSTSZdjMu™уўўњћ§ћ§ћ§ћ§ћћ§оћ§ћњНƒ;*%;A?<9795.9BHEFCL>0raEЪўўљљњзћњњћћњћњњћћ§§ЕД‰W+:EJC?99@E@@AABFB>B*Uўўљјљјљјњћћўо§ћћњћЕТט;*-993GLGA>285141+(0?F|Фўўђјћћќ§ўћњњзћ§эркУŠ?8)2>@BHIJJ>5202>>A[Ob{gкўў§§ћњћ§ћћлњ§§њўјтцрОr8 09@BCFC<510-8?88N:B*Aўўјјњњћ§§ћњњЪшщыћёюљўўŸG..<<4,023003.7:99@GE8qЦўўћњћњ§ћ§њћњћуцэёяяўўйЯd9"0VZ@>0.(%1-35?JMF@<[nчўўњћљњњћњњћ§щщЊыьээёяёЪb#FGM03028?:12>EIBAVW>kѕўў§њћњћњўћ§мсршхщюьњўўР>$9@@1,5>>5;;GFFEA78.JЊўўћњњћћ§итнсрпучццхѕш’S* 5<9?BC@;??873:>>UZejюўўњњћдњћћуххтрццххжтўњБL->@C??;79@FABAEH4+80tўўћњњћхњћяюўђѓѕєђђэццэїрŽ3+YGA;::FFєLGGIGJE8<<Вўўњ§еђѓѕѓёэыычьшхзауЦU%3WNH@:@FJEBBFACB?WOWЮўўњћћиёяюђяюёэёёяюѓыѓѓЛgG>@2;BG@;:98@CE4J?ŸўўЦћ§§ћєюѓяэёђїѕјїђёмьєўї~>@98::58<:9?FM?O>^–Рћ§њњћћѕѓђэяюєєяээьюьэњўўwC>:>>58CB;<9>B>83j§ўўњћњћяэьшссяјьщцшююёђћўўНL0ACA<.(3:8A<<9>:4[зўўћ§§њюыччууыщяыщхээёёяўљм‹3&AE;8#&-075:;F--(pўўЃћњћююђѕёяёђюьюьщышццсхятžU17CF>54.,,0*+0J9Mэўњљњћяїєѓєѕєѓёђёьятннсцјўўс`F7$0EeA2..45481L4`Дўўкјљєѕѕњєєѕїѓѓђўѓбмптстяљк‘cO+(TˆY-2?JCAAЌH4!5ЭўўљјѕјјѕїёїёѓѓѕїяЭбцььэщўўщbF48HB5;9;MLOMJ-EЉўўњњјїјїєѓїѓєюёюљшьююээь§ўБ?4G@44ђ;9:89:H-.2IŒўўїњёёяёѕєїѓѓюЃђяђэяээюяђШhkE40)&-,-+-,.,34]cУўўјёшнхыьяэюяэяђёєєђэыюђўљ„YVY:,(3788<857@A,84ўўјючусуушьыюєєрѕїђѕяэшцўўТ^O>35.+:>8:?@FBQCGpўўћцшыюяяѓ§єѕјјнїѕѕєяюэѓўёuJ?&45,&587IFYVvu‰ўўёѓёёюычщыыььцчяѓєђюььэљўѓu<*-BVЦўюђјєђёѕюяёяђяђёьёёээюёљўэ‘[4AHM())З+0*158:A!8ДўюёёђѓяѓюєёёѓёѓёѕёяёяђѓљћўДN33EEA@72&)3425NcN;Ÿўєѓєѕђѓѓєђёђђяѓѓтяѓюяюўўмn<*77<@<4.(02*8GL;IЊўїїѓѕјљљјјєѓїїѕѕѓѓзёђёьюшюнo:-<@?C?;2*.21CMS:?гђѓєєѕєѕєѓєєѓѓўѕѓѓ єѕђєђћљсtH:-AGHE@>53;;BBM9,Mэььюяьэёяьюэщюяѓёѓђѓѓёяѓѓ§пbMF,77>9:>58A;#WjIAGлђыышучшщьшьхцшюђэюэяягђэўћ—9&270778944>GC…‡[F2ЃœЏдьёњюђєцспщщьюђђяђђзяѓўў‡VFA:57;@?3*(037(+87H3Tww‘ЎМЭѓѕх§ѕѕўў€rьјўєt@J3500157%#>PBGF;"gF@>F:?[^jpOqkczМ™pМбЖ‚Š|vNQnS@10.,.1%)3:@CF<2ŸJPNSVVYE90($!$%")-882%@>u>UHGE;9@945217-!"$"+.359@IG’,(1&149:9514:2.,4+993.1*$*.""*%&!#$28>1>2+’(%&2<<>;847982,*&++@C1(1$#+$($#,:BmgQ)$(*.,78CF9+,..!!і5e~<,+""о(!%%""&(.$%#%+"-ESw5799<572T^hUE2-.753G1*C>42(%""-)"&*(08.*&&`Н№VSPO*^g\]aLrZdЉўўћяў§ўћў§§ћў§§ћ§§ў§ћћ§эўћTSNPC„e`YccŠvO]Ёўўћѓ§ћ§§ў§ў§ў§ўћ§§ћ§йў§§њOONNZg]OScOYOQZI~§ўўљ§њ§њћљ§њ§§ў§ў§§ўў§ўў§ьћHSHMV`E.LYNQNQP^’Фўўє§њћњ§њ§ћ§§ў§§§ў§ўў§§ў§§ѓPWPJHMQLI^^SEEћPVTўўєјњњћћў§ў§ў§ўўў§ўўў§ўўи§IHEI?8:CGSMOHOZ]bVTЊўњчёїћћўћўћў§ў§ў§ў§§§ўћ§§фћAECG9<@JILOOU\[\JECўўяїј§ћћ§ѕў§ў§ў§§ћў§ўўо§99FFJEB?JNUQZWZY\A4dЩїўўћљћћ§ћў§§ўс§ў§ў§ўў+4;@1LQVPOQZdbhY][F4\Цўўњљћ§§ћ§§ўў§§ћуў§ў§E5+HJHFk›G7PTTUN]TUAVVЈўўгњћћ§ћ§њўћў§§ћ§§ўћ§§o@4"??.m‹P0LLQ>kjkid}bNvчўўљћў§ўћў§§еў§ў§ў§§ћ§§Ї\+;@E>CC;FFEGTh\Y`xz‚b‹Ўєўўћ§ўў§§њў§ўћў§§ўў§§р^5((@JGBHFGASL[UJVQhSB’pWеўў§њћћ§лћ§ћ§§ўћў§ˆŽqN*BPLUOONHNVOEHN[\M]9#`ўўіљ§љ§њћћ§ћўўо§ўћ§ћ‚˜ž@(-:EGMYbOQHEJOWZTQSBgЇўў§њў§§гћ§§ў§ўћ§§Š•ЃЂ‘n:*1@BIW\\SGH@HPJ8H?BNWˆжўўяћћ§§зћ§§ў§ћћўћымМБ™qA91@ALUYZ\[QJGBHLQTm`z}чўў§дћ§§ў§§ћ§§ў§ўёШЦК›\.MLZZSSLSS`\WW\I;GEўў§њћћ§ћ§ћбчѕлрььэусйзрьр–;0bNNяOPWYV^c]`aZYGTMСўўЄћ§§ў§тђѓєыцйкмЪЮЮОИЫД\(7WUTOWUb]aU^Z\VVUogjжўўћ§§ћ§ћдхьххлжшселркЯутАjNMFYMU[^SJHPOTYHZNЌўўє§ўћсчлггбщюѓѓ№єсОблїє‰%!JIOFHLLХILQQ\[VgZpЉЮўўћћ§§ѓђпЯЫуяѓѓяхезмхеы§§}!IACHGLNWYQNYQQYL@|ўўбћ§§рбШРЧЩпэтжЩЮбэшшїўяЊO8IPOHIJGQTOOJHUMHpшўў§§ећмбЫЧЦФЧнйЪТФжьшяьўюЪƒA.-GMPGM;GJGENTYH<8}ўў§ећуххмлмжпцнбЩеаЦШЧЩЦнрЄ]B>JIHI>>B;>4EP<^OZўўвњћћйрэѕёѓяёшкамгФРТФЯёўўуeT@)4Q|M?@HBFJPJ\JwЧўў€ŒћњяѓёђяьхыыёьўсАЃДИРШрцР‹o[9.[•\9MG^ZWW\QL.Eжўў§љѓѕѓѓюэрыыщсцдЌЇУгегжёўщqUE(BHIHHPUab^]jATОўўћћѓєјђьчпцрчршђдбедаЯрђ§ЌG9ZTG<:EIFJOO[A>2A[Ÿўў€ŒћяюяэуттэщцсждчпнйздЯжсНu|PCBFIH4?mvдўўљжЮТЭзхщышеЧЭдьшшпсмднюяŽ`ec8;0>?CGGNLUTZ8JI’ўўљпеЩЧРЦРЯсчухьяёѓшшжгЮўўЩk^L.GEIE?LFLO[Z[ieVўў€DЫРРУЪдлбшѓѕјѕјѕєююшдгыўћƒ]N5@AFE0:JVUcii‡œўўыщыыкЩЧЯдЯЭгбЫзююёуЮЫсїўїƒS>ESxg3728EIM\Y@T[bйўьђёђясетмчуурсхщпумейчэўр‹c@T\VB>?2+8A@PQNW3HОўтшющпуушрсптычхрцшктьѕњѕшЈYOGZg[^НўєѕѓєђёђєяёэяююыёыьщцлцсдржuIHGIZSTMH;?>JPjgO+Mншёѓїїљѓђяяђѓёээѓёёююяэьєнбt[J;QY\[WUEAHSTaZO;VїрчтшрйптскгЮЫкчёшуэыюьчѓяЫ`Ya7JQV^SPIGEL4v‡dPZщпзйдЧЯЮЧЯкЫЧИбнтхнмнтрнсђђ™@4FHPJNGLC9E\SžЁvYFЕЃЕШьэяйсхеЧЯЧЫйтктущцхщыўў™j]ZNOFNQWI5,>@G?@NFЄ[;]ƒ‚–ЋВЦээхњщюўўДцэўљ|I\FEMFHIGI08Ia`]\M7qYPNZJHot|Ž|\‚}nŒНЈ|ЩкУ‹–”…]b„hTFCGHOF<2;IMV`QBВa]\gg‰bMGQmirrau„rLAAU@IZ]UE2 ,8:C?@74@BO[WVЊb[WdgnnzPQFULVET‚jT?ThaQJH5G@387>2;;>?79LQ`^ZЂbj`]dLQ`;@FLWbi<:IMJ+H?E@EB;?;00ш:4C9B8<8IT8QM…Vi`cNWPNJHH€NWnGHGSPIE@?ACB1930978;85A:>@JFT\YЁCNCNIHNSIFCHENCG:.053;9AF>L9:Ѓ@BAEOLNLHOGMNLAACFBZYC:E>E:?88:7855:>;5A2CVƒ}cŸ><8:2;2#5<;@1?@(,OYY™B>CCFANAWdmI(I8H755"ZŽŽY9A2--?>?<5B3<*"@Ve‰GIHNPLQWqx{qYB<>GHHWH?UTHE>58!49>B9;:I5;7<;89rЭ џ! џўw џўwџџўwџўwџџўwџўwџўwџўwџўwџџўwџўwџўwџўwџўwџўwџўwџџўw џў€ џ џўw !џў€ "џўw $џw'џўw(џ(џ(џўw)џ)џўw*џ*џ*џўw+џ+џ+џ+џќwџ+џ,џ§wџ,џўџ,џўџ,џўџ,џўwџGџўˆџ,џўџ,џўџ,џўџ,џўџ,џўџ,џўџ,џўџ,џўџ,џўџ,џўљ§љњ§§ћўўѓњћўњ§§љћњћ§њ§§ћ§§ў§§ўњўў§ќљћјћћ§§њ§ўў§§њ§ўўђћњљљћљ§§њ§ўў§јјјљћљљ§њ§ћћъјњљ§§јљћћњјј§§љћљњ§§ћљљїјєїјћњ§§њњіћўћћ§љ§љњўў§ѕћљјѕїћ§њљ§ћћ§њїљћћњњјљ§ўўю§ћљћћјјњјћ§њјјћћњ§§јњ§љћћ§§ћћѓ§ўњњљљћљ§ћўћ§§њњ§§ћњћћўњ§§ъћјњљјљ§њљљњ§ћјјљћ§ћљћљљєћ§њњ§§њћћљ§ўўў§ўўэћ§§ћ§ўћў§§јљљћњјњјћћќљ§§ћћіљјјњњћћ§њ§§ќў§§ћћњў§њ§љ§§њє§њљ§ўў§љјљљ§§љњ§њљњњћћљў§ўўњ§њ§љћ§§ўњ§§ўјњ§§њўћў§§ўў§ћћ§§њ§ћћў§њњјљћћљ§ў§ћћёњїїј§§ў§§ћўћўў§§ўћјљћ§ћњ§ўњ§§њћњ§љ§ўў§ћњ§§њ§§ћ§§њљўўўћўў§ћљњ§њ§§§љјћћљњљњћјћ§§ёў§љљћ§ћљћјїљјћ§§јњћњњјћћўўћћњ§§ў ўќћ§ћ§§њўћ§§єњћљ§§њћ§§ўў§§§њћ§§љ§ћ§ўўњ§ ўў§ў ў§ћњ§§њ§§ўњћћ§іћљ§љћћљћњ§§ѕњ§§њ§њ§ўћћ§§њњљњ§§ўўіњ§§љњњ§§љћћўњ§§ўј§§њќ§ћљ§§љўћўўўћ§§ўњўў§ќњ§ў§§ѓўћўў§њњљћњћћ§§ўўњ§§§њ§ўў§§ў§§њ§ўўћўў§ў№ћўў§§њљљћ§ћў§§њ§§ў§ћњ§§љћћ§§њў§§ўўћ§§§њћўўўњўў§ћў§§ўќ§њњљљњ§ўў§њ§§ўї§њ§§њњўў§§єўћљњњ§љ§ћўњўўњ§њћ§§ўўєњ§§ћћљћњћћ§ўў§ќћўњўў§њљћљћ§ўўѕ§ўўћњћўћўљњњ§ћє§ўћћ§љћћ§ўў§§ўћўўћўњ§§ѕљћћљњ§§јјћўўћћўўћў ўї§ћ§ўўњ§њ§§јћ§§њ§ћ§ўўњ§њ§ўћўўўћўў§ўњўўќћўћўўќћ§§ўў§§њў ўў§ўў§ћћљњњ§§ћљћ§њ§§ўїћў§њћјљњ§§§ўћўўќћўћўўіћўў§љљћ§њ§§ђњ§§њўўњљљњ§њў§§ўћњ§њњ§§ўў§ћљ§§њћјјљњ§§ў§ќњ§§ўўыћў§ўњ§§ўњ§њјјћћ§ћў§§ўўњ§њќљјљ§§іњ§њ§њћ§§ћўўў§ўўц§њњ§§њћў§§ўњ§ћљћљљћјјћўњ§ўўћў§љљў§ўўчћўўћўњћљњњљљћћљ§њ§њ§ћ§њњ§§їњ§§ўў§§јћћѕ§ћўўњј§ўћў§§ёўћњ§§ўћўўњњ§ўћ§§јўћ§§њљљ§§ў§ўўњ§§ѓћљ§ўў§§њљљњњўўњњ§љћњ§§ўўћўўћўў§§ўў§ўўўћ§§їњ§њ§њўў§ўў§§њ§ўўўњўўўћўўњћ§љњћ§§њў§ўћ§њљњўўќ§њљ§§ћљќћўћўўћѕўћћўћ§ўўћў§§ў§јњўў§§њ§ўўўћўў§њ§љљўњ§§ўњ§§ўћўўћўў§ўћ§ўћўўјћўў§§ў§ћћћљћ§ћўўћўўћўўўћўўє§ћћ§§ўўћ§љ§ўў§їћјћљјћћљ§§љјљј§ўўћўўћўў§ўы§ћљ§њћћљ§љ§§њ§њ§ўў§њћћ§їћљ§§ўў§њ§§њўљўўўћўўўћўўљ§ћћњћ§ўў§ћњ§§ћљ§ў§њ§ў§§їў§њњ§§љћ§§§љћўўњ§ўћў ўї§ћњљўў§ћ§§уњўћў§љћњ§љўў§§њ§ћћўў§њљћћљ§њ§§ћћњјј§§ўњ§§ўѕ§ўўјњћљњњ§ў ўёћўў§§њњ§§њ§ў§§ўў§ўјћ§ћјњљ§ўўљћњ§њ§њўўєћў§ћїљњћћњћў ўўћўўќњћћљљьћљ§ўў§§ўћњ§§њ§њ§ўўћўў§ўўњћћ§љћ§§ў§ўўћўўњћёјљљћћљћјћћ§§ћћўў§ўљћўў§љћ§§јњћљћћњ§ўўў§ўўў§ўў§єљћњјљўњўў§њ§§ќљћљ§§ўќ§ћ§ўў§ўњ§§љћ§§њўў§§њўљ§§њњћўњњ§§ўћўўћћўћўћўўўћ§§ў§њћћљјјљљї§јљћћ§ўњўўўћўўћўўњњў§љў§њ§ў§ћћ§ўў§§љўћњўњ§ћћўњћћљ§ўћћўћўўњўў§§їњ§§њњ§§њ§§ўћ§§љћњ§њјњ§§ ў§ў§§њ§§іљ§§ћљћљњњћћўљўўўћўўћћўўћўўќ§љ§ў ўќњўћўўўћўў§ўљјјљњћ ўљћўўћ§њўў§ќњћўћћњў§§ћћўўќћўў§§њўђњ§§њ§њ§јћњ§ўћўў§ўјћўў§љњ§ўў§ўљ§ћњјћљ§§№њ§њћћњ§ўћўњ§љљ§ўўўћўўўћўўћ§ћјћўўѓњ§§ћћљћ§ўў§§ўў§§њ§§ў§ќњ§ћўўћ§ћњєјћўўњ§ћњўўњ§§ў§§ўћўўђњљ§ўў§§ћўћўўћўўў§ўўќћњњ§§њќѕј§ўўў§ўўњ§ў§љћњјњјћ§§ўљўў§ўћ§§ўћўўўћўў§ыћњѕѕљњљљћјљ§њ§ўўњ§ўћўў§§љћћ§јљћћљљћљјљїјўў§ўћћ§њ§ћўўіњ§њњїјїњћ§§љњўўћўћўўёњ§§ћїїљјљћ§њ§љћћўў§§ўћўћўћўћ§ћћ§ўўќћ§њ§§єњ§љ§ћћњ§њ§љ§§ўўћўў§ўё§ћ§ўўћњљњљ§ўўћўў§ўњўўњћњ§§њ§§ћ§ћњўўћў ўы§њ§§ў§јїћў§ћјёј§ўў§§ўў§ћњ§§ўњ§§њ§ћўўћўўў§љљ§§љћћіјѕѕї§ў§ћњўўўћўўћњ§іљ§ўњ§њ§§ћўўї§љ§ћў§љ§ўў§іњљњ§§њј§ў§§њљћњћћ§§ќљјћ§§№љ§њ§§њ§њ§ћјљњўў§ §їћў§љјњћљњњњћњћњљїї§ѕїјјћљљћ§ћ§њ§§ыћљњњћљћўў§§ўћўћў§њњ§ўў§ћіѕєјїјјѕљјћћ§ўўћ§§ќњ§ў§§ћ§ћў§§њўўљћўўћњћўўћ§њ§§ўў§ѕћѕѕїћ§њ§§њў ўэ§њ§ћў§њ§§љ§њљћћљћћўўўћўўўћўў§њјїѕјћ§§ў§њљ§§љє§ў§§њ§§ћ§ўћўўї§њ§§ћјўў§§ёћ§њ§њћњћўўћўњћўўї§њљљј§§ћ§§љѓњ§ўў§њњ§љћћњўўѕ§њљњ§§ћљћ§ўў§ћў§§ћњљћћўўъњўў§§њљљѕїњћ§§ўў§љћ§§ўўя§њ§§ўўћњ§§њћ§§њ§њњ§љєћ§§њ§њњў§§њћћ§ўњ§њјїљ§§ўќ§љ§ўўўћ§§њћњњ§ћ§§ў№ћљљ§§љ§§ўћўў§ўњўў§ђњ§ў§§ћњљћ§§ћ§ўўє§ћљљћ§њ§ўў§ўў§ќњў§ћћўњў ўњћў§њ§ўўђ§ў§љїєѕљ§§ћљћ§§ћћўў§ўў§§њ§§ўњ§§љўћ§§ѕўћўўћўўћўў§§ћњ§§ћўў§яћўћћњњљћљњ§§ћ§§њў ўўњ§§ќћ§§ћћё§ўўћњўћћ§§ћ§њљўўўћўўѓњ§§ћїїћљљћљћўўј§њљ§ћћњ§§ўњћћ§ў§ўўћќ§ћћўў§ў§ћѕњљњ§§ћћ§ћ§њњ§ќћ§§ўў§ћњћћњ§ћ§§ўљ§ћ§ћў§ўўў§ћћј§ћ§ћў§§њњћћњћћ§§јњћњћњњћ§§ћћњ§ћ§ћћљњћ§ћ§њћћїњћћњћ§§ћ§§ўњћўћћ§ўўљ§ўћ§њћњњћы§ў§њћњ§ћ§§ћњћљњњћћў§ўў§іњћњћњњљњњ§§щњћњ§ћ§ћ§ћўњћћ§њћњ§ў§§ўћћўє§ћ§ћ§ћ§њљњћњњцћ§§ћ§ћ§ћ§ћћњљћњћ§§ћћ§ћћњњћћўњћћ§їћ§њњћ§§ў§§ўэ§ўћ§њ§§ў§§ћ§ћћњљњљњњћњћњ§њ§іћ§ћ§ћ§ў§ћўў§ќў§ћ§§ђћ§ћ§§ўћћњћћ§ћ§§љљјљљњћњњћќ§ўў§§єћњћ§ћ§ћ§ћ§§ўў§ќћ§§ўўћўћєњћњ§ћ§ћћњћњ§§јћњћћ§ў§њњѕљњћ§ћћўћ§њўўі§ћ§§ў§ўў§њњ§ћфњ§ћ§ћ§ћ§ћў§§ћ§ћћ§§ў§§ўў§ћ§ћ§§юћ§ћ§ћ§њћњ§ћ§ўў§ў§ўўў§ўўѕћ§ў§ћ§ћ§ћћњњњћњљћ§њњў§ћћўўћћўњћћњыљјњњ§ћ§ћћ§њљњњћњў§ў§ўўќћ§§ўўў§ўўр§њ§ћ§љњњ§ћ§§њћ§ћ§њ§ћўў§ћ§ћ§ћ§§њћћў§ћћј§ћћњ§§ў§§ќћ§ћўўў§ўўў§ўўњћў§ў§ўўі§ўћ§ћ§ћ§ћ§§єћ§ћ§§ћњњћ§њћћњћєљ§ћ§§ћћ§ћ§ћўўєћ§ћ§ћћ§ў§§ћўўў§ўў§ћ§ђћ§ћњњћ§§ћћ§§ћ§§ѕћњћћ§ћћўў§ўўёћ§ћ§ўў§§ћ§ћ§ћўћћ§ўтћ§§ћњ§ўўћ§ћў§§ћ§ћ§ћў§ўћўћ§ћ§ћ§§њћ§ћ§ћўўј§ў§ў§ўћ§§щћў§ў§ўћћ§ћћњћўў§ћ§ћ§ћ§ўўћћ§ћ§ћћњћл§ўћ§ћў§ўћ§ћ§§ў§ў§ў§ў§ў§ў§ў§ўў§ћ§ћў§ў§§ћ§ќўћ§ћћї§ћ§§ўћ§ћ§§єўћ§ћ§ћўњћ§§ћћўў§§ўі§ў§ўћ§ў§ћўўњ§ў§ў§ћћјњћњ§њћћўўћќ§ћў§§ќў§§ћћўќћў§ўўћ§ў§ў§§ыћ§ћњњ§§ўў§ћњњ§ўўћ§ћ§ўўў§ћћў§ћћњќћ§ћ§§ќњў§ўўі§ў§ў§ў§ў§ўўё§њ§§ў§ћ§§ћ§ћњћ§§§њ§ўўќћ§ћў ўњ§ўћ§§ў ўћў§ўў§ўўўћўўё§ўћ§њћ§§ћ§ћ§ћ§ћћі§ћ§ћ§§ў§ў§§ѕњћћ§§ћ§§ў§ўўў§ўўќ§ў§ўў§§ўћћћ§ћ§ћ§§юћ§§ў§ћћ§ћ§ў§ћ§ћ§ћўўўћ§§ўћўўќ§ћ§њњљћ§§ћ§§ўўѓ§ўћ§ћ§ћ§§ў§ў§§ўћ§§§ћ§њњѕћўў§ћў§ў§ў§§ўћ§§шћ§ћ§ћ§ћ§ћ§ћ§ћ§њћћў§ў§ўћўў§№ћ§§ўў§ћў§§њћњћћњњќў§§ўўћі§ў§ў§ў§ў§ўўњ§њћ§§ћћіњћћ§ћ§ћўћ§§§ћ§ћћэ§ћ§§ўћ§§ћњћћў§ў§§ћўўіћ§ћ§§ўўћћўў§§ў§§іўћ§ћўў§ћ§ћћљ§ћў§§ћўў§№ћ§ћћў§§ўћ§§ћћљљўў§јћњ§§ћ§§ўўў§ўўњћ§ћ§§ўўў§ўўўћўў№§ўў§ћ§ћ§ћ§ћ§§ўћўўќ§ўћ§§ў§ўў§ўўє§ўћў§ћћ§ћ§§ўў§ўћўў§њў§ў§ў§§ћљ§ћ§ћћњћћћў§ў§ў ўќ§ўћўў§ьћ§ћ§§ўћ§ћћ§ў§§ћ§ћў§ўўћ§ў§§ћћ§ўћ§§іћ§ћ§ћў§ў§ў ўў§ўўћ§ўћ§ўўў§ўўў§ўўў§ўўќ§ўћ§§іњћњћћњћў§ўўј§ў§ў§ў§ўўћќњ§ћўўчћўћўў§§ўћ§њ§њћ§ћњћћ§ћ§ћ§ћћњў§ћћўќћ§§ўў§єњћћ§њњћ§ћ§ћ§§ѓћўў§§њњћњћћ§ћћќ§ћў§§ћћ§ћ§ћ§§ўћў ўќ§ў§ўў§њќљњћўў§ћњљћўћ§ћўћћћ§ћўћ§§ћјњ§ћ§ћћњўў§ўћўўи§ў§ў§ў§ў§§њљћўў§њ§ћ§ћ§ћ§ўў§§ћњ§§ўў§§ћ§ћўў§ыћњњћ§§ћћ§њљњ§ћ§ћ§ћ§ћўў§ѕў§њњћ§§ћў§ўўє§ў§ў§ў§ў§ўћ§§ўћ§§ќў§ћўўњћ§§ў§ћћїњљћ§ўў§ў§§ў§єњљјњњћ§ў§ў§ўўў§ўўњ§ў§ћњћћюў§ўўћ§§ћ§§ћ§ћ§ћў§ўўћ§ћў§ўўю§ћњћњћњ§ћ§ћў§§ћў§ўў§њћ§ћћњћћі§њњ§ћћњў§ўўє§ў§ўћ§ћ§ћ§§ўўє§ўћћњ§ћ§ћ§§ћћєњ§ћў§ў§§ўў§ўўќћў§ўўўћ§§іћњљњјў§ўў§§яћ§ћћњћћ§ћ§ћ§ћў§ўћћйў§ў§§ћ§ћ§ћ§ћ§њ§ћ§ўўћ§ћ§§ћћ§ћ§ўў§§ћ§ћ§ћўўў§ўўћ§ћ§§ўўўћ§§ћњћњњћћїњћњћњ§ћ§ўўќ§ў§ўў§еў§ўћ§ћўћ§ћўћћњћћ§ћўћ§ћ§ћ§§ў§ў§§њћњћњљњћњ§§ўў§љўћ§ћ§ћ§§ўћ§§ќћ§њ§§ћ§ѕњљ§ћ§ўў§ў§ўўёћ§ћ§§ўћ§ћ§ћ§ћ§ћћїњћљљћњћћўўќ§ў§ўўў§ўў§§ћ§ўўў§ўўњ§ў§ў§ўўј§ў§ўћ§ћњњћјљњљњњў§ўўў§ўўњћў§ў§ўўќ§ћ§ўў§ћ§ўўў§ўўњћ§ћ§§ўў§ўћ§§ќћ§§ўўі§ў§ў§ўћ§ћўўћ§ћ§ћўўќ§ћ§ћћўї§њљњћћ§ћ§§ћћњ§ћўў§ћ§ў§ўўў§ў ўќ§ўћњњўэ§ў§§ћњњћњ§ўўћ§ўў§ў§§ћљ§ћўў§ћ§§ўњўўф§ўў§ћ§ћњїїњў§ў§§ћ§ћ§§ў§§ћ§ћўў§ўћўўі§ћћў§§ћў§ўўќћў§ўў§ђћ§§љјњ§ў§ўўћ§ўў§њћ§ћ§ћўў№ћ§ћ§ћћљњљњњ§ћ§ћўўў§ћћ§§ћўўљ§ўћ§њљјјљљћћњњћ§§ўў§§їў§ў§§ћћњћћњїћўћћњјљњўў§њћ§ўў§ўўїћ§ћў§ў§ў§§љїїљљњ§ћ§§ўўќ§ў§ўў§іћ§њћњћ§ћњ§§ћ§њћњњљўћ§ћў§ўў§њњћћў§ўўў§ў ўќ§ўў§§ћћ§њњ§§јћ§ћ§ћў§ўўј§ў§ў§ў§ўўїћ§§ў§§њ§ўўљ§ћњћ§§ўў§іћ§ўў§ўў§ћ§§§ћ§њњ§§ћўўќ§ў§ўўєћ§ћ§ў§њљњўћњњ§їўћ§§ў§ў§ўўі§ћћ§ћ§ћ§ћ§§јћ§њћњў§ўўќ§ў§ўў§ўћўўћњќјєљ§§љњ§§ўў§ўўў§ўў§ѕћ§ћ§ћ§ћўћў§§ўў§ўўћўэ§ћ§§ў§ў§§ћ§љјљ§ћ§ћ§§ћћ§ћћњњћў§ћћќњћ§ћћ§§ћ§§фњ§ћ§§ўћ§ћ§ћ§ћ§ћ§ћ§ћўў§ћ§§њћљљњњ§њљјљљњўћњњћћњ§њ§§ёћ§ћњћљљњўў§ўћ§ўў§ўћўўр§ўћ§ћ§ћњњћљїїљњњљјњћњћћ§ћў§ўћ§ћ§§ћћ§ћ§њњљ§ћўћћ§ўўў§ўўш§ўћ§ћ§§ў§§ћ§ћћљјљњћ§ћ§§ўўў§ўўъ§ћ§§ўўћ§ћ§ћ§§ћњњћћњў§ўўњ§ў§ў§ўўэ§ў§ў§ўћ§ћ§љјњћћ§ћ§ўўћ§ўћ§ћћ§єћ§ћ§њ§§ў§ўў§§№ћњњў§§ћ§ћ§њ§§ћ§ўўў§ўўў§ўў§ѕљјј§ћ§њ§ћ§ћћ§ўў§§ћњѓ§ў§ўў§§ћ§§ћњћћўј§ў§§ћ§§ўўў§ўўў§ўўёћ§§ћјјљљњ§ћў§§ћћ§ў§ђћў§ў§§ћ§њ§ћ§ћ§§ћћ§ћ§ћћ§ћў§њњї§ћўў§љїљћћ§ўўћћ ўі§ћ§ћћ§§ћўћћўћў§ћћ§хў§ўћў§ў§ўћ§ћ§ћўћ§њљјћћ§њћ§ўў§їњћћњћ§ћў§§эў§ў§§ћ§ўўћћњћњ§§ў§ўўј§ў§ў§ўў§§чў§ўћўћћљїјћ§§њћњ§ћ§ћў§ўћўў§№ћ§ћ§ћ§ћ§ћћњ§ћ§ћўўў§ўў§ћ§кћў§ў§§ћў§ўњљљћњћ§§ћњћћ§ў§ў§ў§ў§ў§ў§§ћ§§§ћ§ћћљ§њћњўћўўіћ§ў§§ў§ў§ўўѕ§ћ§њљљњћћњўўќ§ў§ўўў§ўўћ§ў§ў§§ћїњ§ћ§ћ§§ћњўў§ў ўј§ў§§ћ§§ўў§§ў§§ћў§ў§ўўђ§ў§§ћ§ћ§§ў§ў§ўўў§ўў§ќћ§§ўўњ§ћћўћ§§їў§§ћ§ћћњ§§јћ§§ў§ўў§§ўў§§ћћ§ћўћћљў§ў§ў§ўўќ§ў§ўў§щўњўћў§ў§§ћ§§ў§ўћ§ћћњў§ўў§№ћўћўћ§§ў§ўћ§ўў§ўўё§ћў§§ћ§§ў§ўў§ћўўх§ў§ў§ў§§ћ§ћ§§ў§§ћў§ў§ў§ў§ўћћіўћ§§ўћў§ўћћљ§ћў§§ћ§§љћў§ў§ў§§ўў§ўў§ў§§ў§§њўћўћў§§ў§љћ§ћў§ў§§ѕў§ў§ў§ў§ў§ўўђ§ў§ў§ў§ў§ўў§§ўўћ§ѕў§ў§ћњўћ§ћ§§ў§§ў§§їў§ў§ў§ў§ўўќ§ў§ў ўщћ§ћ§§ў§ўћ§ћ§§ў§ўћ§ћ§§ў§§ћћўћ§ўў§ўќ§ў§ўў§єћ§ћ§§ў§ў§ў§ўўі§ў§ўћў§ў§ўўь§ў§ў§ў§ў§ў§ў§§ћ§§ў§ў ў№§ў§ў§ў§ўћў§§ћ§ћ§§ќћ§§ўў№ћ§§ўћ§§ўњ§њ§§ў§ўўљ§ўњўћ§ўўў§ў ў§іў§ўњ§§ў§ў§§ўў§§ўі§ў§ў§ў§ў§ўўў§ўў§ўњ§ў§ў§ўўќ§ў§ўўя§ў§ў§ў§ўћ§§ў§§ћў§§ћќ§ў§ўўў§ўўќ§ў§ўўќ§ў§ў ўт§ўћў§ў§ў§§ћў§ўў§§ў§ў§ўў§§ў§ў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўў§§ў§§ўў§ўўњ§ў§ў§ўўє§ў§ў§ў§ў§ў§ў ў§ў§ўј§ў§ў§ў§ўўј§ў§ўў§ћ§§ўў§ўўќ§ў§ўўќ§ў§ўўќ§ўў§§ўќ§ў§ўўњ§ў§ў§ўўј§ў§ўў§§ўўў§ўўў§ў ўў§ўўљ§ўўћўћ§§ўћўўў§ўўў§ўўј§ўў§ћ§ћў ўў§ўўј§ў§ў§ў§ўў§ўќ§ў§ўўў§ўўў§ўў§ўў§§ў§ўї§ў§ў§ў§ў§§ўў§ў ўў§ўўў§ўў§ѕў§ў§ў§ў§§ћўўќ§ў§ўўі§ў§ўћў§ў§ўў§єћў§ў§ў§ў§ў§ўў§їў§ў§ў§ў§ўўў§ўўє§ў§§ћў§ў§ў§ўўњ§ў§ў§ўўђ§ў§ў§ў§ў§ўћ§§ўўў§ўўћ§ў§ў§§їў§ў§ў§ў§ўў§ ўњ§ў§ў§ўўў§ўў§іћ§§ўћ§ўў§ўўћћўћ§ў ў§ў§њћ§§ў§ўўњ§ў§ў§ўўќ§ў§ўў§ќћ§ћўўў§ўўќ§ў§ў ўў§ўўў§ўў§§ў§§§ў§ўўў§ўўј§ў§ўћў§ўўњ§ўћ§ћўўј§ў§ў§ў§ў ўќ§ў§ўўі§ў§ў§ў§ў§ўўќ§ў§ўўў§ўўњћў§ў§ўўў§ўўў§ўўѕ§ў§ў§ў§ўћў§§ўњ§ў§ў§ўўў§ўўќ§ў§ў ў§ђћў§ў§ў§ў§ў§ў§ўўў§ўўі§ў§§ћ§ћ§§ўўќћ§§ў ў§юћ§§ў§ў§ў§§ћ§ћћ§§ћў ўў§ўў§ўў§§ў§ўђ§ў§§ћ§ћў§ўћ§§ўўў§ўўї§ў§ў§ў§§ўў§§ў§ўўњ§ўў§§ўўў§ўўў§ўў§§ў§§њў§ўћ§ўўќ§ў§ў ў§ћћ§ўў§§љў§ў§ў§ўў§§ў§ўўќ§ў§ўў§§ў§§ў§іћўћў§ў§ў§ўўі§ўў§њ§§ў§ўўі§ў§ў§ў§ў§ўўў§ўў§ћўћћ§ўќ§ў§ўў§њњ§њ§ћўўіћ§ћ§§ўћў§ўўј§ўћў§ў§ўўў§ўўіћ§ћ§ћ§§ў§ўўў§ў ў§ќћ§ћ§§ќўћ§ўўњ§ў§ў§ўўђћ§§ў§ў§ўћ§ћ§§ўўў§ў ў§ћў§ўў№§ў§ў§ў§§ћў§ў§ў§ўўўћўўї§ў§ў§ў§ў§§§ў§ўўў§ўўњ§ў§ў§ўўќ§ў§ў ўўћў ўќ§ў§ўўш§ў§ў§ў§ћњў§§ћћњћ§§ћ§§ў§ўўў§ўўў§ўўў§ўўњћ§ћў§ўўњ§ў§ў§ўў§іћ§ћ§ћ§ћ§§ўўў§ўўѓ§ў§ў§ў§ў§ў§ў§§ѕўћў§ўћћ§ў§ў ўќ§ў§ўўћ§ў§ў§§§ўћ§§љћўћ§ћ§ўў§ў§§ўћћ§њўњћ§§ў ўќћўњўўќ§ў§ўўў§ўўў§ўўі§ў§ў§§ћў§ў ўў§ў ўќ§ў§ўўќ§ў§ўў№§ўћўћ§§ў§ў§ўћ§§ўў§ўћўўќ§ў§ўўћ§ў§ў§§ўў§ўўќ§ў§ўўў§ўўљ§ў§ў§§ўўї§ў§ўњњљ§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўўћ§ў§ўћћў§ўўј§ў§ў§ў§ўўћ§ў§ўћћјўњ§§ў§§ўўњ§ўћў§ў ў§ћєљњћў§§ћ§§ў§ўўў§ўў§№ћ§ћў§ў§§ћўћ§ћ§њўўќ§ў§ўўў§ўўє§ўћ§љњћ§§ў§ў ў§№ћў§§ћ§§ў§§ћ§ћ§§ўўў§ў ўўћўў§ўћўў§ўў§§ўў§§§ў§ўўў§ўў§ў§ќњ§§ў ўќ§ў§ўўљ§ў§ў§ў§§ў№§ў§ў§ћњ§ўў§ўћћ§ўўў§ў ўё§ў§ў§ў§ў§ў§§ћ§ў ўў§ўўќ§ўћ§§љњћљ§§ў§§ўј§ў§ў§ў§ўў§ќў§§ўўў§ўў§ўй§ў§ћњћ§ў§ў§ў§ў§ўћ§њ§ћў§ўћў§ў§ў§ў§ў§ў§ў§§ўє§ў§ў§ў§ў§ў§ўў§љў§ўћўћ§§їћњљ§њ§њўћћ§ўў§§ѕў§ў§ў§ўћћ§ўўў§ўўќ§ў§ўўъ§ў§ў§§ћ§њћњћћ§њћћ§ћў§ўўѕ§ў§ў§ў§ў§ў§§ўў§ўўђ§ў§ўћ§љ§§ў§ў§ў ўў§ўў§§ў§§ўў§§§ћ§ўўє§ў§§љћћў§ў§ўўѕ§ў§ў§ў§ў§ў§§ўњ§ў§ў§ўўј§ў§ў§ў§ў ўљ§ћ§њ§ў§§ќў§ў§§ўј§ў§ўћ§§ўўі§ў§ў§ў§ўћўўќ§ў§ў ўі§ўћњљњћ§§ўў§ќћў§ўўќ§ў§ўўц§ўў§§ў§ў§ў§ў§ў§ў§§ћў§ў§ў§ўў§ўњ§ћљ§ћўўў§ўўў§ў ўј§ў§ўћў§ўў§ћўћў§ў ўќ§ў§ўў§љћњћў§§ўў§§ў§ўўў§ўўќ§ў§ўўњћ§ћ§§ў ўќ§ў§ўўњћњњћћ§§§ў§ўўњ§ў§ў§ўў§§ў§§§ў§ў ўў§ўўў§ўўў§ўўѕ§ћћ§§ћў§ў§ў ў§§ў§§іў§ўћў§§ћ§ўўќ§ў§ўўњ§ў§§њ§§ќћ§§ўўђ§ўћўћ§ўў§ў§ўћ§§§ћјїїќјњћњњяїњћњњјњњїїћћљћћљћћјљћћљ§§њ§§љ§эљћљ§њ§§њћ§§љљћњїјћ§§ўљћћјцїјјњїјїїњњћјїљѕїѕїљ§§њњ§њ§§іўњњљћљљ§њўўцјѕїїѕѕїјјћњ§јјћјљћљјњњјљњ§§ѕљњјњїѕїњћћљљўјљљћ§§ўћўўђњўћ§љјїјњјїљљћћѕљњњћћ§ћћљљћћћѓљћћ§§Пћљ§ў§§љљћ§§њњћћ§њљ§њ§§ћћњћћўўљљ§њ§ћљљјњњљ§§ћћљјљћћљљћљћ§љћљћ§§њњљљ§ѕњў§§њ§ўў§ћ§§§љћљљћ§њўўћћЫј§љљњњљјћћ§љћћњњјїїјљћњћњ§ўњ§ћјћљћ§њњћј§љћљљ§§њ§§њњ§ўўќћў§њњќћњњћћћ§ћњњћћ§§њ§ћћ§§њ§§ў§љљћ§§ћњјћћјјњњјћ§ў§§ўљ§§ўьћљјћљћљљњћљћ§ћћљћћјћћћ§њ§њћћ§ыњ§љћјїѕїћњ§ћљљћјћ§ћћ§§ђў§§ћћњјљљћљћљћћ№њјњїїѕјћљљјњ§ћљћћОљћћјњљљ§њћћїѕїјњјљљ§§њ§§њ§њљћћњјњїњјљ§њљ§љћјћ§§љћљћћ§њўўњњ§ћћљћљ§ћћѓњјјїїјјљњљћћ§§їћјљїјјћ§ћћљўѕјњјњјјљ§љћ§§ўљўўў§ћћћ§ћћ§ћћђљјљїјњїњћ§њ§њ§§ќў§њїїќњєћ§§њ§јњћљћљ§њ§§њ§њўњљњњћћэњћњјћљ§§њ§§љњјћљў§њњ§§ћ§§ћ§ћњ§ўћ§§ќћљјљљјљњњў§§њ§§ћ§ќњ§ћўўњ§ћјљњ§§љыћњўў§њ§ў§§ћўўћўўћљјћ§§ќћў§ћћњњјјњћњњўљ§§јљћћљ§њћљљњћјјћћ§§ўўћ§§їў§њћњљјјњњљїјњљљћјјљєјљ§§њћљљћњњћћёљћћњїїћљћљћћњћљљќ§ўў§§§љ§ћћљљћћјћљњњјњ§јћ§§љћњ§ћћљњћћїљћћњїћўћ§§ћњљ§ўњўўќњљљ§§ўљ§§јљњјјїїљјј§њћ§§ўђњћљљћћњњћ§ўўћ§§§ћў§§њћі§ўћўћў§њњљљћўљјјњћ§љјљљѕњљћ§§ўўњ§§ўў§§љјјћ§ћњћ§§ўў§§ўћўўїћњ§јњјњћ§§ћќњјњћћјњњћ§ћћў§§љъ§љћјњћљ§§њњ§ћћљћ§§њ§ћўўљћ§ћ§њњ§§љ§ўњћћ§юњљњ§ћњјњћњ§§ћў§§њ§§ћћљћљ§§њњћћњњ§§ў№§њ§§њ§§ўўњњћљћћљљўћ§§ќњћљїїёњјљїњјћњћўўњљјљљћњљљћ§§ыў§§ўћў§§ћљ§§ћњњ§њ§њњ§§§ћљ§§ћљљ§њ§ћљћћѕњјїњјїїњљ§ўўѕћў§§љњњћ§§ћћ§ћћњјјљњњ§іњ§њ§ћљћљљ§§їњљљњ§§ћћ§§ќћњїљљъњ§§њ§њћљљњїїљњњћћљљ§њ§§љрјїњљћјњљћљћљњўўњјљљ§§њљїїјњјњјјњњјёљјљљјјњјњћ§ўў§ўўљћўњ§§ћ§§ћ§љњћћљћњјїњјјњњћљљћјњјјњњћњўћ§§ћњљ§§ўћўўщљїјњљњњ§њ§§ћћњјљњјјњјјљљ№њјћћјјїїјјњњћ§њћћєјїљћ§§ћјњћћ§§ўњ§§њђљ§ўў§њ§њ§љћљћ§§пњ§ћћљћ§љћљјїїњјјћїјњњљ§њњћјјїѕј§ўўњћ§ў§§ўў§њљњ§њњўўўњ§§ђћ§§љћњљњ§њјљљћћњљћћјњјјѓњ§ўў§ћјѕїєњ§ўўьћўўћ§ћјњљљћјњњћ§љњ§ћћўљћћљќћњњ§§њћјўћ§§іћњљјїћўўњ§§љћьљћћљљўў§њљїљ§§ў§ћћљћћўњ§§јљјјњћњў§§ћћјћљћњњћњјёљћћ§њ§ћјћћ§ћ§§ўў§юї§§ўў§јљћћљњ§§ћљљћћ§ѕљјїѕѕјїјїїљљљњјјњ§§ўўћ§њ§§ћћўљ§§ћљ§§њ§§љ§љћљјјљљћћњјњњїіљїїљїљ§§њ§§кљњљљ§ћљјјњјљћ§њ§јјњјјћ§§ћћљћћљљћ§§љћћњњћїњїљњњїїјњњьћњћјљ§ў§§њћљћњњћћ§њћћёјњњљїјїњњљ§ћћљћћњўјљљјюїљљћљљјїљїѕєјљњћ§ўўћћ§ў§ћњњјњњјњћћљћћњљјњїјћћ§§чљњїїјњћљћљњћ§љњљѕѕєїїјљњўўјјћњћў§§ћћіљ§њўњ§љћљћћјњїљ§§њ§њњ§ћћрљћћјњћ§§ћ§ћњјњїљљїј§ўў§§њљ§њ§§љ§§ўњњћћљјњњіјїїјљњњ§§ћћљ§њ§§љјћћ§љу§њ§љљњљѕјѕњјљўљљјїјљњ§љ§ўњўћўўе§љјћћњ§§њ§њ§§љћјїјћјћ§њљїјј§њњ§љјљјїѕєїљїњ§§ѓћљћћљњ§ћњљїїјјњћ§§ћћ§§шћљњћњјљїљјњјљћћ§§љ§§ћљћњњїћ§њћњљњљѕѕљїћ§§њ§ўў§ћћўјњњїјљјњїљњћљљћяљћћљњ§њћјїљљћћ§§љљћыљћћњїїјјњїњњјњћљјћћљћћў§ћћ§љћњјљљћћжљћћљћћњїљїњћ§§њњљћћјљїњјїїѕїњћўў§њљљјјљ§њ§§ўњ§§ћўњ§§§љњћћ§§ћљљ§§њљјјћјсїљљјњјјѕє§њ§њ§њ§њњ§§љћњњўўћў§њ§§ёљјљћћ§§ћљћњћњ§ўўп§њћћњїїњњјјїљїѕѕєѕѕјњ§љћљљњћјћљљћћіљјњјјњјћљўўѕ§ўў§њ§§њњјљљшјћљљјјїњћ§§ћћјїѕѕјѕљї§њ§§јћњћ§§ћћњњјљћљћѓљћ§§њћћјјљћљћћћјњјјїїўјћћ§љїњњєјћљ§њљћ§§ћћљљјўњћћњ§њ§ћњјјљљ§§ћћљћћљћњћє§јјњјћљћћљљћћўљњњѓћљљњ§њљјћћљњјјћњћљјћћь§њњ§њ§§јїњћљћњљћћ§њ§§ћўљћћ§љіћљћ§§њўўћўў§щљћ§§ўў§љ§§њћўўћљљњјњјјћћћљњњљћћіљ§ўњњћў§§ўў§ўњ§љјјћ§§ћњ§њњ§§ўњћћљъћ§§ћњњјћљћ§§ћњјјњјњњћ§§њљ§њ§ћљљћфјћћњњ§њ§ћљћјљћ§§љћїјјњћћљћњ§§ѓћљ§њ§њ§ћњ§ћћљљэњћћј§њ§њћљћљ§§ўўњљ§§ѓњў§њ§њљ§§њ§§ћћ§љњћјјћњ§§§њј§§ћщ§љћћљћћљљ§њ§§њњ§ћўў§њњ§§ђљћљћ§§ћћљїњјћ§§ћ§ўњ§§їћљ§љјњњјћћјљїћћљћћ§§чљњ§§ћћ§§ћћљљњљћњњћњ§§ћўў§§ќћљљћћќљјљћћѕљћ§§ћјѕїљ§ћћњ§ћљћњўў§ќњ§ћўўўњ§§ћњ§§њ§§№љћљћ§ћћ§ћћљћћљ§ўўўњ§§ђћњ§§љћјћїїћјњ§§ў§ћњўўю§њўћ§њўў§љљћњ§ўўћўў§ўћњ§јћњ§њ§ўў§§ћћљћљћ§§њ§ўћўўў§љљ§ўњўўјћњ§њљ§§ћћчљћјїћћїљћїјљњљ§ћћњ§§њјћљћћњ§ћљћњ§§ў§ўљћћјљћћїћљћљљњњјјїљћћўљћћњћјљћћљїјјљљўћўў§љшјљћјїїњјћ§ћћўњљћљћѕћњїљјјћўњ§§ј§ћљћћјљ§ћ§љ§њ§§ћњ§њњ§§ўё§ћћ§љњ§ў§§ћљћ§ўўўћўўў§љљ§ўћњ§љ§ћћќјљћ§§њћљћћњ§§љљћћ§ћ§љљњћљ§§њўўў§ћћљћ§њћњ§љ№ћњћћўњ§њњљљћћ§њ§§љњ§§љљїћћўљћћќњ§ў§§§ћјїїњљїјњњјјљћєјљ§њњ§§ў§§ћљљ§ћњ§§іўњњ§ћћљ§§ћћњљћљѕћ§§тњ§њ§њ§ћћјњјњїљјћ§§љћјљљћјњ§§њўў§ў§ў§ў§ќњјћ§§ўў§ўў§ўњћўњўў§ћў§§њњ§ўўњ§§ўћ§§ќћњњћћ§ўћћ§љљњўўќћўћ§§§љ§ћћ§ќњ§љўўўћўў§ќњ§ў§§ѓљћљљњњљ§ћњњћњњ§ћ§њњљљќњљњљљљћљњљљњљљіњћњћњњћћњћћѓњћћ§§ћћ§ћ§ћ§ћћї§ћ§ћ§ћњћ§§ћћ§ў§ћћљѕњћћ§ћћњћњћњњљўњљљњ§љјљљћ§§ћ§§ќћ§ћ§§љћњћћ§§ўўћ§ў§њљљјўљњњс§ћ§њћ§ћњћњљљњћ§ћ§ћ§ћљњљњњљљњњўћћў§ћћњњћћ§ћўўў§ўўї§ў§ўћћњћњњћёњћњћћљљћњ§њњћћњњн§ћћњ§ћ§ћ§њћћўћ§ћћњ§ћ§§ћњ§§ћћ§ћ§њњ§ўўќ§ћћ§§єњћћњљљћ§ћћњћћўњћћћњћњ§ћћ§ћю§ћћ§ўћ§§ћ§ўћўћ§ћ§ћћ№§ў§ћњњ§§ћћљљјњњћћњљѓњћљњћњљњ§§ў§ћћўњћћ§њћ§§ўњћћ§ўћ§§ў§ќћљљњњї§њњљњњћћ§§њњћњћњ§§ќћ§§ўўщћ§ћ§ћћњ§ћћљњњћњњљљњћћўћћс§ћ§ћ§ћўўћћњњћњћћљњћњ§њћћњњ§њћњ§§њћ§ћљњљјљњ§ћћуњ§њ§њњћ§ћўћ§њћљњћћњћњћњћњњљњљљњћ§ћўњћћњьљћћ§§ћњљјљњљњћћ§ћ§ћ§§њћњњљњљљћњћ§§ћћњэ§ћћњћњћћ§ўў§§ћћњћњћћњьљњњљљњњјљћњњ§ћ§њ§ћћњњљ§њћњћњћћі§ўўњљњљњњћћјњ§ћ§ћў§ўўћ№њћњ§њњћћњћћњјљњљљ§њћ§§ўћ§§љћљ§ћ§ћ§ћ§§єћ§њћњћћ§ћ§ћ§§љћў§ћљљњњѓљњљњњћ§ћ§ћ§ћњњўўћ§§ћі§ћ§ћ§њћћ§ћћі§ћўўћћ§ћ§ћћўњћћћ§њћћ§§іћ§ћ§ћ§њњћ§§ўћљњћ§§ћ§ћћ§§ў§§љћ§§ћў§ўўћї§њ§ћ§ўўћњњљћљњњљњ§§ѕўћ§ћћњњћ§§ћћњћш§ћ§ћ§ћў§ў§ўў§ћћў§§ў§ћњњљљњќљћћњњјёњћ§ћ§њћћњљњњћњћћњљјњћњћњћ§ћћ§єўћ§ћ§ћ§ћ§ў§њњўћњњќћљљњњљљњњћћ§ћћыњ§њњћ§њћњћњћљљњўў§ћ§њњпћњљљћћ§ћ§§ў§ў§§ћўћ§ћўћ§ћ§ћљњњљљјњњољћћ§ћ§ћ§ћ§§ў§њћћњњљњњ§§ўў§ћ§ћў§§ћ§§ўўћўўќћ§§ћћќњћћњњљћњћћњјјўњћћ§іў§§ћў§ўћћњњђ§ћ§њ§ћў§ў§ўћ§ўўє§ћ§љњљћћ§ћ§њњќљњљњњљїњ§ўў§§ћ§ћћѓўњњљћћ§ћ§§љњћћ§ћћўў§ўўќћўћ§§ћт§ћ§њћњћћ§ћ§ћ§ћћљњљћ§§ћў§§ћ§ћ§ћћђ§ћ§ћ§њћ§§ћ§ћў§§ѓћ§ћ§§ў§§њћњњћћїњћ§ћ§њћњљљјњјљљњћ§ўў§§ўћћќљјјћћјўћ§§ў§§ћћї§ћћ§§ћ§ћ§§ѓћ§њћћ§ћњњћћ§ћћњёћљњњљњљљњћ§ўў§ўўыћ§ћњљњћ§њћњ§ћњњћљњњћ§§щњћњћћ§ћ§§ћћ§ћ§њњћ§ћћљљјјіљ§ћ§ћ§њћћљљјћ§§ћњћћ§§ћћ§ћ§ћћё§ћљћњњљћњћњћ§ў§§ћп§ћ§ћљљњљњљњњљљњљњњћњћћњњљњљњ§ўўћўўі§ў§§ћ§њ§ћ§§ћњњћљњњћћњѓљњљљњњћћњљњњљљњљіњ§ћ§ћ§ћћњћћўш§ћњњљћ§§ћ§ћ§њњљњјљњњљњњћћрљњњћњњљљњњљљњ§§ћњћњљјњћ§њњљћњ§ћ§§ќћ§ћ§§№ћ§§ўћ§ћ§ћћњћњ§ћ§§іњћћњћћњћњљљњїћњљљћћ§§њњёљјњ§ўў§ў§§ћћ§§ўўќ§ћў§§ў§ђћ§њ§ћћњљћ§ћ§§ћћўњћћњўљњњёљћўў§њњјѕїљ§ў§ўўў§ўўэ§ўў§њњљћћњњљљћћў§§њњќћњћњњћ§ќћ§ћ§§§њћњњ№§ћ§ћћљјїљњў§§ћ§ћћњћћњћњћћўоћљјљћ§ћўћћњћњћњ§ћ§ћћњњљћ§ўћ§ћ§њћњћћљњсљњњћњњћ§ћњ§њњ§њ§ћў§ўћ§ћ§ћћў§ћў§§їћњњћ§ћ§њћћэњћћ§ћ§ћ§ћњљјјїљњљљјјњ§ўћўўљ§ўћ§ћ§њњћє§ћ§ў§ћ§ћ§ћ§ћћў§ћћёњћњћњћћњћћњћљњљљўњљљрјљљјћћ§ћ§ћ§ћћљћћ§њћњњљњћњћ§ћњњљњњљ§ћћњћњћћїњ§ћћњћљњљљњљўјљљйњљњљњљњњ§њњћ§ў§ћ§њћњњљћњ§§ћњћњњљјљњћљљћћ§њћњњњћњљљњћћ§§њћћћњћћњљљїјїїјљњ§§ўўќ§ћњ§§ўњљљњњљњњљњћћќњћњљљќњљљњњњ§ћ§ћћљљ§њљћћњљњ§ћљјјљёњћ§ў§ўўњњ§ўўћ§њњћі§ў§ћћњћњћњњѕћњњљљћ§ћ§ћ§§њћњиљњћћњ§њљњњљјјљњ§ўўћ§§ћћ§ћ§ў§ћ§ћў§ў§њњћњљљјњљљњћ§§ћћќњћњ§§ћњћў§ћћ§ћъљјјїљљњћўўћњљњћ§§ўћў§ўўћќњ§ћ§§ћњіћњњ§њ§§ћњ§§фћў§ћњљјљљјљњћ§ћњћњњћ§§ў§ћљљњњє§ћћњ§ћ§ћњћљњњќјљјњњјћњњћ§ў§ћћѕљњљњћ§ў§ћљјјчћњ§ћ§ћўўћњћњњљњљњјњљљјљњћћѕњћњћњњћњњў§§§ћњћћњ§ћ§ћћћњћњћљљїѕљњљљњљћћ§њћћљњћњљњћњњє§ћ§ћ§ћћљњћћњњюћњћћњњљљјљљњ§ћ§§ћњњїјљљњљљјѕўўя§љјјњњћћ§ћ§ћ§ћ§ћ§§јћ§њћ§§ћ§§њњћњ§њћћњ§ћ§§ћњњўћњњіљјјњљњњјї§§љћ§ћћ§§ўўчћ§ћ§ћ§ћћњћњћћ§њћњ§њ§ћў§ў§§ќћњњљљњљјёїјјї§ћћњћћ§њ§њћћѕњћћњљњњљњњўў§ўјћ§ћ§љљњћћњћњњљњњ§ћњњјљњјїјјљ§§ъћ§ћ§њљњ§ћћњњљљњњћћњћњћћўњћћ§яћњњ§ћњћњћњћњњљњњљљњњћњћјљљўњћћј§ћњ§ћњњћћњєљћњћњћћ§ћћљњњћї§њњћњњћњћћњљњ§іњљ§њћњњћћњњћљѓњћћ§ћ§ћ§њћћљњњ§љњћћњўћ§§єћ§њљњћњ§ћћњ§§јћ§ћ§њћћњњ§ћ§ћћ§Сў§ў§ў§§ћ§ћ§ћ§ћћњ§ћў§ћћ§ћ§ўў§ўћћљњљњњћњћњћњћљљћћњћњћћў§§ўўћ§ўў§ўў§№ћў§ўћћњ§њ§ћ§ћ§ћ§§јћ§ћ§§ћњћћљњ§ћњљљћћяњћ§њљњњљњљњњ§ћ§ћ§§ўњћћњњћ§њњ§§ћњћњ§ћћ№§ћњћњњљњњћњ§§ћ§ћћ§њў§ћњњћћќљњњ§§§ћ§ћћўн§ћ§ћ§§ўћ§ћ§ћ§ћ§ћ§њћњћњћћ§§ћ§њњ§ћ§ћ§§њћ§ћ§њћћњћќњћћ§§ўћ§§ў§ћтњћњ§ћћњћћљњћћ§ћ§њћњ§ћ§ћ§ћ§ћ§§ћћўњћћљњљљњњћњњгћњњћћњ§ћ§ћћ§§ћњњ§ћћњћћљћћљљњ§ћ§ўў§§ћ§ћ§ћ§ћ§њћћњћњњћћњћњњћѕ§њњљљј§њћњћћ§њ§ўўыћ§ћ§ћў§ў§ў§ћћ§§ћћ§ћ§ћћўњћћъњ§њћћњњћћў§ў§§ћ§њ§ћ§ћњњ§ћњ§§їћ§§ўў§§ў§§ў§ўя§ћћњ§ћў§ў§ўў§ћ§§ўў§ћ§іўћ§ћ§њњћњћћћ§ћ§ћ§§ѕћ§ўў§ў§ў§ўћћі§ћ§§ў§ў§ў§§ќўћ§њњћњ§ћњћћяњћњћ§ўћћњ§ћ§§њњћњњэ§њћњ§ћ§ћў§§ћ§ћћњћњћћњњћњћњћћќљњњћћўњћћњњћњњљњњћћњњћњњћљњў§ў§§ћћћњћћњљљќњћћўўѕ§ћњћњ§њљњћњњя§ћ§ћ§ћњћћњњћ§њ§ў§§ўћ§§ъћ§ћў§ўћћњ§ў§ћў§§њћњ§§ўўљ§ў§ў§§ћћј§ћ§ўў§§ћћњьћњ§ћ§њћњћ§§ћ§ћћњ§њ§ћћѕ§ћ§§ў§§њћњћћњњћњ§ћ§§љњћ§§ћ§ћћ§њ§ўў§ћхњћћ§ћ§ћ§ћ§ћ§ћ§ћћњћњњћњњћњњ§§њћ§ћћњљљњјљњљљњњћњќ§ћћ§§њћўћ§њћћћњ§ћ§ћћє§ћў§§ћћњћћ§њњјћњћ§њћћ§§њљїјњњћ§ћњњћћѓ§ћ§§ў§ўћ§§ў§ўў§єћў§ў§§ћўў§ћ§§яњћћ§§ўћў§ўћ§ћћ§ў§§љћњћ§ў§ўўћл§ћўў§ћ§ћ§њ§ћ§њњљћњћћ§ћў§њњ§ћћ§ў§ў§ў§ўўў§ўўіћ§ћўћћњћћ§§ўў§ўў§ќћ§ћ§§§ў§ћћєњћћљљћ§њљљћљє§ў§§ћ§њњћў§ћћ§ў§ћћњњўћ§ћ§§іћ§ћ§ћ§ћў§ўўѓ§ў§ў§ў§ў§ў§ў§§ъў§ў§ў§ўћ§ћўњћћў§ў§§ћ§ћћмўњћћ§ћ§њўњ§ћ§њ§њ§ћ§§ў§ў§ў§ў§ў§ў§ўћў§§ўыћ§њ§љћњћћ§§ў§ўћ§ћ§§ўћћ§њў§ў§§ћћїўњ§ћў§ўћ§§ўћ§§ќћў§ў ўјћўћћњћћ§§ћћ§ћ§ћћ§єў§§ў§ћ§§ў§ў§§ў§єў§ўћ§§ўћў§ў§§ў§ўў§§юњћћ§§ўћ§§ўћ§ћ§ћ§ћ§§њћ§ћў§ўў§ўў§ўўї§ў§ўћ§ћ§ўўўћ§§ћњ§ћ§ћў§§ћцўћ§ћ§§ў§ў§ў§ўћў§§ћў§ўћ§§ў§§ћў§ў§ўўў§ўўў§ўўћ§ьњћ§§ћў§ў§§ћ§ћ§§ў§ў§ўўї§ў§§ћ§§ўћћї§ћ§ћўћўћўў§§ў§ўўќћ§ћ§§ўћ§§ўћ§§ућ§ћ§§ў§ў§§ћў§ўў§ћћњћњ§§ўћ§§ў§§§ў§ўў§ћўў§§ѕћ§§ћћўњ§њў§§іўћ§ћ§ћ§ћ§ћћ§ьўћ§њћњўћўћ§§ў§ў§ў§ў§§чўћћњћћ§§ўћўћ§ћ§§ў§§ћ§ћў§ўўќ§ўћ§§ќћўћ§§ћє§њўћ§ћ§§ў§ў§§ќћўћ§§јћ§ћ§ћ§§ўўћњўћўћў§§ћў§ў§ўўќћ§ћ§§жўћ§ћўћ§њћћњћ§ўў§ў§ў§ў§ў§њњ§ћўћў§ў§ў§ў§ў§ў§§іћў§ў§ў§ў§ўўќ§ћћ§§ћћ§ћў§§їў§ў§§њў§ўўђ§ўћў§ў§ў§§ћў§ўўў§ўўј§ў§ўћ§ћ§§ўў§§јў§ў§ў§ў§§ћў§ў§ўўєћў§ў§ў§ў§§ћўўў§ўўў§ўў§ћў§§§ў§ўў§§ћўћћ§ўў§§ќў§ў§§яўћ§ћ§ћўњ§ћў§ў§ў§ўўў§ўў§ўў§ћћќўћћ§§ћшўћўњ§ћ§§ў§§ћў§ћњ§ћ§ћўћўњњ§§ћ§§јћўћўћ§§ўўї§ў§ў§ў§ў§§эў§§ћћњћњћњћћў§ўћ§ћ§§ўћ§§ћљњ§ўў§ў§§іћ§ћўћ§§ў§ўўє§ўў§ў§ў§ў§§ћћќ§њњћћѕўћў§ў§ў§ў§ўў§ћћњ§§ўўќ§ў§ўўњ§ў§ў§ўўќ§ўћ§§љћ§ћћњўћћњ§ћ§ћ§њњћ§ћў§ўўў§ўўћ§ўў§§ўў§ўўќ§ў§ћћќў§ў§§ћ§јћўњўћ§§ўў§§ў§§ўў§ћћ§ѕў§ў§§ћ§ћў§ў ў§чўћ§§ўў§ћ§ўў§ў§ћ§ўћћњћћў§ўўъ§ў§ў§ўћ§ћ§§ў§ў§ўћў§ў§ўўј§ў§ў§ў§ўў§ўў§§ќў§ў§§іўњ§њ§ћћњњћћў§ћўњ§ћўўў§ўўя§ўћ§§ўћў§ў§ў§ў§ў§§ќў§ў§§ћў§ўћ§§єћўћўћћњ§њ§§ўў§ѓњў§ў§§ћ§§ў§§ћћњў§ў§ў§§ќў§ў§§јў§ўћ§§ў§§іў§ўћћњ§њ§њњњћ§ў§ў§§јћњњ§§ўћ§§јў§ў§ў§ў§§љћў§§ћў§§ў§їћ§§ў§§њ§ћћђўћўћћњўћў§ў§§ћћћўћ§§ў ў§§ў§§ўў§§їўћ§§ў§§ћ§§њћ§ћўњћћќњћћ§§ћ§ћ§іў§ў§ўћ§ћ§ўўј§ўћћ§ў§ўў§ћў§ћћўўћћ§їўћ§ћўћ§њћћ§цўћ§ћћњ§§ў§§ћўћ§§ў§ў§ў§ў§ў§§ўч§ў§ў§§ћ§§ў§ў§§ћў§ў§§ћћњ§ћћў§ћћѕў§ў§ћћњљћ§ўў§§ў§§ўњ§ў§ў§ўў§§ў§§јў§§ћ§§ў§§љћ§ћ§ћ§ћћ§ўћўў§ћћјњћ§ў ў§љњћ§ў§ўћћќў§ў§§§ћў§§ѓћў§ў§ў§ў§§ћўћћ§№ў§ўћўњћњ§ўў§ў§ў§§ўћ§§ќћ§ћўўњћ§њ§§ўўѓћў§§ћ§§ў§ў§ўћћўї§ў§§ћўћ§ћћ§ћњўњћ§§ќў§ў§§ўќ§ў§ўўў§ўў§пў§§ћ§ћ§ћў§ў§ў§§ћ§љћљ§ћ§њ§њ§њўћў§ўў§§ў§§ёћ§§ў§ў§ў§ў§ў§ў§§ѓў§§ћ§ћ§ћ§ћ§ћ§§ћыњ§њ§њ§њњћў§ў§ў§ўћћ§ў§§ћ§юў§ўћўћўњ§§ўћ§ћўћў§§іўћ§ћћњћћў§§жўњњћћњ§њћњћњўњ§§ўћ§§ў§ў§§ћ§њўћ§§ўћ§ћћњћњ§ћћ§ўћ§§њћ§ћћњ§§эўћў§§ћ§ћњљ§љњљ§ћ§§ўўљћ§§ў§§ћћ№ўћћњћћ§ћ§ћ§ћ§ћўћћ§њћ§§јў§ў§ћњ§ћћћ§ћ§ћ§§іћ§љћљњњў§ўў§ћ§ўў§њў§ў§ў§§ўћ§§ѓћўћўћ§§ў§ў§ў§§іћ§ћ§ћў§ўў§§ћћўњ§њњ§ў§ўўє§ўћў§ў§ў§ў§ўў§ћљўњ§ћ§§ўўкћ§ћ§§ў§ў§ћ§ўћў§ўћ§§ў§§ћўњћљ§ћћ§ўў§њ§ћ§§ ўёћўћ§§ў§ў§ў§ў§§ћћ§ќў§ў§§ќў§ў§§ћўњћљњњќў§ў§§Цћў§ў§§њ§ћўћ§§ўћ§§ў§ў§§ћ§њўњ§њўњўћ§§ў§ў§ўћўћўњў§ў§ў§§ћ§љћљ§§ў№ћ§њћњћћ§њўњњћ§ћ§§љћ§ћ§§ў§§єў§ўћўћ§ћ§§ў§§ёћ§ћ§ћ§ћћњњљћћўћћ§њћ§ћ§ћ§§ўћ§§ќў§ў§§ћ§ќћ§ћ§§јћ§њ§ћ§§ўў§іўњ§ћћњ§љњўўћ§ћњ§ћћчў§ў§ў§ў§ў§ў§ў§§ћў§ў§ў§§ћ§§їћ§§ў§ў§ўћћѕўћ§§ўћњњ§њћћюљњ§ў§ў§ў§ў§ў§§ћў§ўў№§ў§ў§ў§ў§§ћў§§ћ§§ўщ§ўћ§њ§њўћћњ§љњљћјћљћ§ў§§ўў§§ѓўћ§ћ§ћћњўћў§ўўў§ўўї§ў§ўћћ§ў§§ќў§ўћћс§њ§§ў§§ћ§њћљћњњ§ў§ў§ў§§ћ§§ўћ§њћћ§чћ§§ўћ§ћ§ћў§ўћ§њ§ћ§ћ§ћ§ћ§ћћіњ§њўћ§ћ§њћћј§ўўћ§§ў§§§ћўћћ№§ћ§ћў§ўћўћўћћ§ў§§јћ§ћ§ћ§ћ§§ћ§§њћ§§ўў§§јћ§ћўћў§ўў§ћћ§ћўћћљў§ўћ§§ўўі§ў§ў§ўћ§ћ§§єћ§§ў§ў§ў§§ћ§§ѕў§ў§§ћ§ћў§ўўї§ў§ў§ў§ў§§ў§§ў§ўў§ўўћћяўћ§ћ§ћ§§ћћўћ§ћ§ћўўў§ўўў§ўўў§ўў§§ћ§§оў§ў§ў§ў§ў§ў§ўћ§ћ§§ў§ў§ћћўћ§§ў§§ћўћћћњ§§ў§§їў§ў§§ћ§ћ§§єў§ў§ў§§ћўћў§§ћ§ўћ§§чў§ў§ўћ§§ў§ў§ў§ў§§ћ§§ў§§ћ§§ўћћ§ћ§ўў§§ў§ўўх§ўў§§ў§ў§§ћ§ћ§ћў§ўћ§ћў§ў§ў§§їў§ў§§ћўћ§§єћ§ћ§§ў§ў§ў§ўўќ§ў§ўўіћ§ћ§§ўћ§§ћћяў§ў§§ћ§§ў§ў§ў§ў§ўўњ§ћў§ўћћќ§ћ§ћћ§ѕћ§§ў§ўћў§ў§§§ўћ§§§ћ§ћћ§§ў§ўўђ§ў§ў§ў§ў§§ћ§ћ§§їћўћ§ћ§ћў§§јћў§§ћ§њ§§јћ§ћўћ§§ўўќ§ў§ўўў§ўўє§ў§ўў§§ўћўћ§§ўћ§§ўћўўљ§ў§§ўў§§ѕў§ўћ§§ў§ў§ўўў§ўўў§ўў§ўќ§ў§ўўі§ў§ўћў§ў§ўў§§ў§§ёў§§ћў§ў§ў§ў§ў§ўў§њћў§ў§ўўћ§ў§ў§§шћ§§ўћўћћ§§ћў§ў§ўћ§§ў§ўћ§§§ў§ўўм§ў§§ћ§ћ§ћўћ§ћ§ћўћ§§ћћўћўћўћ§ћ§ћ§§ўњ§§јўћћ§ў§§ўўѕ§ў§ўћ§ћў§§ћћ§ўћўў§§ћўћћ§їў§ў§ў§§ћ§§ѓў§ў§ў§ў§ў§ў§ўўјћ§§ў§ўў§§ќћ§§ў ў§§ў§ўўї§ўћўћ§§ў§§ѓў§§ћ§ћў§ў§§ћ§§љў§§ћћ§ўў§ўћ§§ьћ§ћ§§ў§ў§ўћў§ў§§ћ§§ўў§§ў§§юћў§ў§ў§ў§ў§ў§§ћўћ§§ёћ§§ў§ў§ў§ўћћњ§њњў§ћћ§§ў§§њћў§ў§ўў§јћ§ћ§§ў§ўўў§ўўљ§ўћ§§ў§§ўў§§ўљ§ў§ў§ў§§ыўњћћњњў§ў§ў§ў§§ћў§ў§ўўў§ўўў§ўўў§ўўі§ў§ў§§ўў§ўўў§ўўњ§ўћ§ћў ўћ§ў§ў§§ѕў§ўњћћ§ћў§ўў§ўє§ў§ўћ§ћў§ў§ўўє§ў§ў§ў§ў§ўў§§ћ§§ћўћћўўњ§§ўћћњ§§љљ§њљћћ§іњ§љјњћћ§§љљ§ў§ћќјљљћћќњ§§ўў§љј§њ§§ўўћўў§ћљћ§ћў§§љћћўњ§§њћ§њ§§љљћўљ§§їўћў§§ћљ§ўўќћ§§ўўњўћ§§іњ§§ўўћўўњ§§ўрњљјћјњњј§§њ§ўўћњљњњјљћ§њњ§ў§њљ§њњ§ќћљњўўї§ћљјљћћњ§§ћюњ§ћ§§њћљјљљњљћћљњ§§њ§ќћњњ§§љњ§§ў§§ћћўљ§§ўў§§§љћњњўњ§ўњ§§ў§ў§ьј§§њ§њ§њћљњњјљћњ§њ§ћћўљћћ§ќњўћўў§ћ §љњъљ§њ§њ§§љњјћљњњјћћњ§§ў§§ћў§§ћњњљћњ§§ўћўўќ§њњ§§їћјњњћћ§§ћћїјљћљћћљљјјўћ§§љјћљљњ§љћ§§ыњ§њ§љћћ§ћљњљћљљћљћ§§ћћ§ѓћљћћњћњ§§ћ§§ўўђњ§§ћјјњљјїљњљћћ§ћ§їњ§њјљљ§ћ§§љћљ§§ћћјј§ћљћћэ§љ§ћљћљћјћњ§§љћўўњ§§їћјјћћњјћ§§їњљљћўўњ§ўў§ў§ўњ§§їћљњљљћћљћћљљћњ§ўўћ§§љљћјњј§ћћ§љћћњ§њ§§ўњ§§љњ§§ћљћ§§ћјьњјњјњљљћ§§љљ§ћљћ§§њ§§ћ§№њ§љјћљ§§ў§§ћљћњ§§ћш§њ§ћњјћ§§љћћљљћћњљј§љћ§ўў§їћњњћћљњ§ўў§ќњћў§§іњ§ўўћўў§§ўўњћўў§ћ§§ёњљћћ§ћўў§§ўў§§ћћў§ўў§ђљ§§ўњ§ўў§њ§ћћ§§јњ§њњ§ћћ§§њў§ўћ§ўћўўућўўњћјјњјјћ§љљћњ§њўўњў§§ўњћћ§§ўњ§§ўљ§§§љћљљ§ўњ§§їњ§ўў§њћ§ћћўњ§§ћњљњјћїњњћјїїј§§јљћљћћљљ§§ў§ћњљ§ћљљћњ§њќ§љњїїэљїљјјљ§§њљњћ§љјљњ§ўў§ўќњћљћћ§хћў§ћљњћ§§ћ§љћљ§њћљјљљћњњћћ§§ьљїјљњћњјјљјћјїљ§§ўў§§ў§њ§§љћћјљћљљћ§§ћћљѕљћћ§њ§§яљ§ћ§§љљћ§§њ§§ћњљ§§ћћ§ћўћўўў§ўўў§ћћђљћљњњ§ћћљњњ§љћћљњ§њ§§ў§§ђћјїєєўўљ§§њ§§ўў§јћњњ§њ§њўўњ§њ§љљ§§§ћљћћќљћћ§§єћ§ўў§јѕєѕѕї§§ў§ћуљћ§§њ§њњўў§§њњ§њ§ў§§ћћњїјјњљ§§§љњ§§љёјїѓїѕјћњјћ§њљћљљћўљћћјљ§њњћћљ§§ћјїњјћљјњ§§ћ§ј№љїѕѕљљњњћљћћљћ§ћћњјћћ§њ§§їљ§њћ§§ўў§§ўїћ§њјћћ§њћћѓњљљѕєєѕљљїњћ§§њ§ўћ§§ў§ўљ§§єћ§ўўћ§§њћћў§ §ѓњћћљѕђѓїєѕњљћћўљўў§§њўў§ћњ§§§њ§ўўљћў§ћњњћћљћќљћњ§§ћјэїђђѓїїѕѕјћ§њ§§љ§њ§ўўєћњ§ўўњњ§§љћљљјіїњљћљљћјјїїіјћ§њ§ћњјєѓѓёєѕєєѕїњјѕїђїћњ§§ўљ§§јћњјјљћћљ§ўў§ §ћєљ§њћјђѓѓїљјѕѕьїјњјњї§ћњїљћјњљ§§њњ§§јљћћ§њўў§§ћ§нћњѕѓѓїєѕѕїљњњљљњљјњјњћњњљћљћњњјјћ§ўў§§ћ§§ўњ§§ќњ§§ћћњљћ§њјњїєєјцѕљјјїљїїљїјјљњћ§њ§ўў§њћљј§§ў§њ§§љјјжћ§§ћљћћљјєїѕїѕјѕјїњћћњњјјћ§њ§§љ§§њўў§§ўўњ§§§ћј§§ћћ§њ§њњј§њћљћњјїї№ѕјћњљѕєєјїїјњњјћћќјњњћћјјїїћљћњўў§љћ§ўњ§§ћћ§њћљћћјєѓќѕїїњњњљѕїїљїїљљїјјћћўўњѓљћћљћљљћћљ§§ћћњћљљћњ§њњ§§їњѕєєѕѕїїњњыћњјєјћјїѕњљјњњћљћ§љљјјћ§ўў§§їњ§љљћљћћ§§ќњ§ћјјљїѕјљјћ§§ћћњјјљ§§њ§ћ§ћћў§§ћљћћљўћ§§ћј§ћћњїїѓєєѕѓєѕѕїјїљѕѕїїўљћћњѕјњљљјїїљўў§§јњљјїњњћ§§јћљћњїњњяјљјѕљљїљїљљїѕєїњћћ§юљћњїљљјїїјјїѕљўў§љљћ§ќњ§§ўў§њњ§ћњјєєчѕјљњњјњљїљѕєљњћћњјјњјљљїѕѕўљїїўњўў§ўћэў§§њњўў§§ћјњ§њћјѕєѕѕўїєєїњѕђѕїѓїїшѕєєѕєѕїјјњјљјљїѕїњјїћ§§ўў§ўђ§ў§ћћјїљѕѕљјњћћњїїјјїєјѕѕєєѕѓєјјљљјєѕѕїїєљїљјєєѕњ§ўў§§ў§тћњљљѕјїєєјљїљїїјћћњљїѕѓѕѓђѓєєѕѕўјїїљ§њјїїњ§єїєєујїњљ§§љ§§ћљїѓєјѕјјѕїєјљљѕјєјљљїыѕєєїѓјљњњљћїјљћњљїљљїїєэїєѓѓєѕїїѕєєѓђђѓѓѕєѕѕќјїљѕѕєјѕѕїњљљњјјїєєћјїњјїїѕјѕљјјњљѕѕљїїїјїѓѓїѕѕїѓѓђўѓєєѕ§љїњњљњњћљњњјїї§њљњњќјњјњњєјњљїѕїјљїѕёєєњѕјїѓјѕѕіїєѕѕљїїљљїїќѕєєѕѕїѓјїњњћћљјњљљњјјўњјјќљїљњњўїѕѕљљјљїљљњћћђњћћљћћњњћљћњїѕѕїљїќјњјїїўљїїћјљ§§ћћњѕљњїїљїїѕїїњњћћљћјћћўљћћыљњјњјјњњћњїѕљјјћјїїљїїјњћњјњїїѕѕљљњњ§§ћњњќїѕјљљчїєєѓѕјљїїѕєєѕљљѕїјїљїјєјљљѕѕєєѕѕљљїїјћћњљњтјїћ§§ћљљјљћћљћћљјљљјјљљјјїѕљљїїіјљїїѕєєљѕїїўљїїјћїљљњїїњљ§ћћљ§§ўћ§§ћљѕћљљћ§ћљѕљњћћњќљїјѕѕїјњјјїїѓѕїїєњћјјћ§§ћїѕїјјїхљјј§љћљњ§њљњћњњјјћњїїњїїјћ§§њћљћљјѕѕїќњїљјјњјїљїїјћјњљїїїљїјјњјњ§ћћ§ўћњњїљњћњљїїјњњњјњћљљњњујњњїјљћћјјїљїїјњњїїњјјћћјјњћљљўјћћјјњњјїїјћћ№јѕѕљљјћћїєѓєѕљјњњљјњњїѕїјјїѓѓљћћ§ћїћћјњјњњјљјћ§§љљјјўљћћѓљћћњ§ћњїњљїњјјћљљћјїљїѕѕёљјћ§§ћћњјјїїѕїњњєјњњћ§§јћњћћ§§ћ§њјњњѕјїњњјјњњћ§ћћ§љњћћнљњїјјїњјњњјљљ§§њљћћљћљљћјјћћљњјњјњјјљїѕѕїњјњњјљїљћћљљћћљєњ§њћћјњїљїјћћ§§ћјћћ§ѓњљћћљћњњїњјљњњјћј§љјїїњчљїђђјњ§ћњњљїѕїїјјїїјїїњљїї§ќў§њ§§їѕљ§љјљїљјјњёјѕљјњњћћјњњљѕѕєєњцэѓїјњњљћѕјљѕљњљћњјљћћњјјљћњ§§њ§§ћљћћљјћћњњђјњїјѕёюёѕїєѕїњњњїљїљњјјїњњћћљљћћі§ћћєїћ§њњ§§љћљћјћћ§§ћћљјћ§§ћћњјњјїїњјўњћћяњїњћњ§ћљљћїїјњјњћћ§ќњ§њ§§ћћїјћ§§ѕћњјјћћњјјљїїђњћјљћњїњїїѕїњћћљўјћћўј§§ќљћћ§§§њ§ћћњєљћљћћ§ћњјјњћћѕљћљћљћљјњљїїћѕљјћјјњњїљ§њњўўх§љљњљћ§њ§њћљјѕѓђїѕљјћћњћћљ§§§ў§ћћњщјњљїљјєњњјїїѕїїјћјњјў§љљћ§ћћљћћјљїђёёђѕњњјљњјћјјњїїфћјњњћ§§њ§§ћљљњјњјњњїљїјњљњјњњјћш§ћњњјјњћјљѕљїђѕїјјњјњњљћћјјњјјњјјљљћњјўњљљљћњјњјїљђў§ў§§ћ§§ўў§ћ§ћћњ§ћњњћњњђћњ§ћ§ћћњљњћћ§ћћўї§ћћњћњћћњњ§§ћ§§§ћў§§ўћўўі§ў§ўћ§ћћњћћњьћ§ћўћ§ћћњњ§§ћ§ћ§ћ§њ§§ћњњћћ§ћ§§љћ§§ў§§ћћч§ўў§ўў§ћў§ў§§њ§ћ§ћ§ћ§ћ§§ўў§юћ§ћў§§ћ§њњљљњ§ћ§ћўўј§ў§§ћћњ§§њћўћ§ћ§§њћ§њћ§ўўоћњћ§ћћњ§ћ§ћњњ§ћўћ§§ћћ§ћў§ћњњћ§ћ§ћ§§јћў§§ћ§ћ§§єћўћ§њћњћћ§ћ§§љћ§ћ§ћњ§§ўў§§юћ§ћ§ћ§ћўў§ћ§ћ§ўўћ§§эћ§ћ§ћ§њћљљњћњ§ћ§ћћњњћіњћњћћ§ћ§§ўў§ѓћњњ§ћ§ћ§ћ§ћ§ћћ§ћ§ћљљ§њћљљњњщ§ћ§ў§ћ§ћ§ћўћ§њљљњљћ§§ћўўќ§ўћ§§њћ§њњљњњђћ§њћњ§ћњћњњћћњњё§ћ§ћћњћћ§ћћњ§ћ§§іћњњ§њћљћњћћћ§њћњћћїњћњћљћ§§ћћ§њў§§ћ§њњјљћњљјљћњњш§ћњњ§ћ§ћ§§ћћ§њ§ћ§ћ§њћћ§њњћћњћћўћћїњћњ§ћ§§ћўў§љћ§ћ§ћћњњюљњњ§ћ§§ћћў§ў§§ўў§ўў§јћ§ћ§ўў§ўўўћ§§ќћ§ћ§§§ћ§ћћћ§ћћњћћ§њћњњћчњ§ћў§ўћ§ћћњњљ§ћћњњћ§ћ§ћ§ћћљњ§ћ§§ћ§§ъћ§ћ§ћ§њћњ§ћ§њћћњљњљњљћћў§ћћ§ћѓ§њњћ§§ћћ§њћћ§§пћњћњ§§ћ§ћћњћћ§ћњљњњ§ћћњњћћњњљћ§§ћћчў§ў§§ћћљљњњћ§ћў§ўћ§§ўў§ћ§§ўї§ћў§ў§ў§ўўѕ§њ§ћ§§ћњћћўўєћ§§ўћ§њћњ§§ўў§яў§ћўў§§ўћ§ћћњ§ћћ§§јћњњ§ћ§ћ§§§ў§ўўњћ§ћ§§ўўў§ўўќ§ў§њњќљњњћћўњ§§ўш§ў§ћў§њњ§ћ§ћ§ћ§ћўћ§ћ§ћњћћљ§ћ§ћ§ћ§§њў§§њ§њњє§ћ§ћћњћљњњћљљњћу§ћ§ћњћћњћћ§ћћ§ў§ўћ§ћ§ћ§ћ§ў§њћћњ§ќћ§ћ§§ўћљљујљјњњћ§ћ§ћљњ§ћњћ§§ў§ў§§ћ§ћ§ћўў§йњћњћњ§ћў§§њћљњћ§њћћњћ§§ћћ§ћћњљљћњ§ћ§ћ§ћћуњћ§њљњ§ћўў§њћћ§ўўћ§ћ§ћ§§ўћ§ћ§§ћњњћњћњћћї§њћњ§ћћњ§§тћ§ћўћўћ§ћћњ§ћ§ћ§њњј§ћ§ћ§ћ§ћ§ћњњў§ўўќ§ўћўўћњыћњћ§§ћњњћ§§ћћњћњ§ћ§ћ§§јћ§њњљїїўўћ§єћў§ўћ§ћ§ћ§њ§§њў§ў§ў§§ћў§ћћ§њћњњћыњ§ћ§њ§ўў§њјїјјљ§ћ§ћ§ўў§ћњћ§ўўћ§§ућ§ћўћћњњљћњњљћћ§ћ§ћћ§§ћ§ћћјїѕѕњїћљњњ§§ћњћћњљћњћњњћ§§њћћ§ћ§њњћљњћћ§§ѕћ§ћ§ћ§њћњ§ћћљ§ћ§њјљјјђњљњћћњћњ§њћњћњњ§юћ§ћ§§ўћ§§ўћ§ћ§ћ§ћўў§їњћћ§њћњњјјїјљюњ§ћ§ћ§§ћћ§ћ§њ§ћ§§ўўіћ§ў§ћ§ћњћўў§ћ§ўўшћ§ћ§ћ§ћ§ћ§ћ§њћјєєѕѕїјљћњњёћў§ўћ§§ў§ў§§ћћ§§ћў§ў§ўўћўљњњћњњћњћњћћѓ§ћћ§ћћњњїѕѓєѕѕјњ§јћўћ§ћў§ўў§јў§§ћ§ћњћћњљћћњћћњњљњ§ћњљїїѕѕіїјљїјљљњњљљњў§§ћ§ћћј§ћ§ћ§ћ§њњћўњћћѕ§ћўћ§ћ§ћ§ћ§§ћѓњћћ§њїѕѕїљјїјјяљњљњљњ§њљњћњњљћћ§§щћ§ћ§ћ§ћ§ћћњ§§ў§§ћ§ћ§ћћњњјћ§ћ§њњјѕѕчїјјљјњљљјњћњљњљћљљћњћћљљњњ§ўњћњћ§ћ§§љћ§ћ§ћ§њњљїњљћћ§ћљљїїјњпљјљљјљњњјљћћ§ћўў§§ћћ§ћ§ћў§ўћ§ћ§ћ§§§ћ§њњщћ§њћњћћњјѕєѕјїјїљњњћљљњњ§ѓћўћ§§ўў§ћў§§ћћіњ§ћ§ћўћ§ћ§§јћ§њћњљњљљњјїљщњљњњћњћњњљћњћњћњћњњћњ§ўўєћ§ћ§ћћњћћ§ћ§§ѓћ§њћћ§њћњћњњїїѕ§їјљљќњљјљљўјљљ§јљњњфў§ў§§ћћњћњћћњњћћ§њћњ§§ћњњћњ§§ѕћ§ћ§љјїїјјљљыњљњћњћњљљњћњљњњћњ§ўћњњђћњ§§ў§§ћ§ћ§ћ§ћћљњћћњ§ћ§§њэљјїјњћћ§ћ§њњљњњћћ§љљћ№њћњў§ўћ§ћ§њћњћњћћљ§ћ§ћ§њћћћњљњљїїіѕїјјљњљјњљљшњћњћњњљњљћћњљљјў§§ћ§§ћњљљљњ§ћ§ћ§њњћщњљњњљњњјїњјјљјљјјљјїљљњњь§ћћњњљјјїљљїїљњјў§§ћћњўћ§§ўћўўўћ§§§њљїїчјњћњљњљјљљјљјњњћљњњљњљјљјјљњў§ўћ§ўўўћ§§ћўћ§њ§§§ћњјјћњљљјљљњјљјљњљљјјїїјјњљњњѓћњљљњљљњћњћћўўњћ§ћ§ћўўћњўљјјјњљћњћњћљљїњѕїїјјїїўѕїїјїјљќјљјїїяјњћў§§ћ§ћ§§ўћ§њљјј§їѕїїњјљјљљњњєљјљјѕєѕєѕїїјјўїљљј§љњљљ§їѕїїљћю§ћ§ћћјѕѕїїјїїјѕїїјјќїјїјјљьјїїѕїїјљљћњћњћњљјљјљљїэѕїѕѕїјљљјїїѕєєѕѕєїјј§їљјјэїјјљљћћљњњљјїѕїљљњљљљїјјњњљјјљўїѕѕјѕєўѕїїјђљњљљјјљљњћљњњљљјћљњљњљњљљєњљјљјљњјљјјїїњјїѕјїјј§ѕїјјљјљљјїїјјњљљѓњћљљћњћњљјљљњњўљњњћјљјњљљјњњјљјјњњ§§њћћњљљњћћљљјјљјљќњљњљљёјљњћњћ§§њћњљљћљљђјљљјљљњљњљљњћњњёћњћњћњћњћљњљњњљљјњљўјљљќћљњљљјњњљ§ћћљљ§јїјјљјяїјљљјїљљјјњљњљјљїїјїјљњѕћњћњњљјјљљњњшћ§њћћ§ћћњћњћћњјљїїјјњњљјјљіїјљљјїљјјљљўјљљњјљјјњљљњћћћњћћ§ћћљ§ћћњћњћћќњ§њјјъљћњћњњљјљїјјљњљњњљљњјљљўћњњљ§ћћљјљњњљ№јњњ§ћњћ§ћ§ћњњљљњњѓљћњњљљњћћ§ћњћћўњјјљ§њјњњєљњњјљљњћћљјљљёјљњњљњ§ћћњњћ§њљљѕћ§ћљјљљњљљњњћљќњљњљљќњћћњњњљјљљњљљњўћњњ§љњћћ§§ћњњљќњљљњњќћњњјјњ§ћљїїјњљњљњчћљњћћњ§њћњћњљњњљљјњњ§ћјјњњўћњњћћњ§ћћљљўћњњ§ћњћћћњљјљјјёњћћ§њњљњњљљњљњљљљњљљњ§§њњћќ§ћћњњќћљњљљњљњљћэњћћ§њћњћљћњњљљњњљњћћ§јћњћћњћћњњїћњћљњљњљњњљљјјљљњљљњћўњћћїњћњћћ§ћ§њњљђјљњњћњ§ћ§ћ§њ§њњь§ћ§ћњњћњљљћљњјљљњљљњњ§ћњљљхњљјѕєєјљћњњљјљњљљњњљљїљљњјљљюњ§ћўћ§ћ§ћўћ§ћњјљјњњљњіјњљљњћњњљјјї№ѓюьѕљњљљњћћњћњњјјхљћћљњћћњћњљљњћў§§ћ§ћ§ћћњћњћћ§њћњњћћњћњљљѓњљћїјѓьѓјљљјљљћјљјљњњљњћўњћћњњћњћћ§§ућ§ћ§њћњ§њћћ§ћ§њћњћћ§ћ§њњљњљњљљ§њљњњкћњћњљљњњ§ћњћћњћљњљњљћњћћ§ћ§ћ§ћ§ћ§ћ§ћћњњ§ћћљњњћњњћљњѓћњњћњљљјљљћњћћ№њћњћ§§ћ§ћћњ§ћ§ћ§§ѕњћњћњћњњљљћћњї§њљњњљћњћћќњљјљљјњљћ§ў§ћќ§ћњ§§ћьњјѕєѕљјњћњљњћћ§ћ§ћ§ћћњљъњљјљјњћљљњљљјљљњњћљњўћћьњћњћњћћљѕєѓєјњљљњњљњњљњњ§њљћћ§§ћћљњљњљљјјљњљћљњљљњљћњњћћљњњќљћњјјљѕјљњњљњљљћћњњўћњњќљњњћћњўљњњўљћћљњљњљњљјўќ§ў§ўў§§ў§§яћў§§ћ§§ў§ў§ўћўћў§§ўѕ§ўў§ћўћ§§ў§§§ў§ўўј§ў§ў§ў§ўўє§ўћў§ўћў§ў§ўў§ѕћ§§ў§ў§ў§ў§§єў§ўћ§ћ§ћ§§ў§§§ў§ўўњ§ўћ§§ўўў§ўў§ћў§ў§ўўў§ўўќ§ў§ўўћ§ў§§ћћ§ў§ў ў§§ў§ўў§іў§ў§ў§§ћ§ўў§јўћ§§ў§ў§§ўї§ўћ§ћ§§ў§§§ў§ўўў§ўўј§ў§ў§ў§ўў§ѓћ§ћў§ў§ў§ў§ў§§ўі§ў§ў§ў§ў§ўўњ§ў§ў§ўў§њў§ў§ў§§ћўў§§ўўћ§§іћ§ћ§ћў§ў§ўў§§ў§§шў§ў§ў§ў§ў§§ћўў§ўў§ў§ўћћ§§ћ§їў§ў§ў§ў§ўў§ћњњћћў§ўўэ§ў§ў§§ћўњ§§ў§§ћў§ў§§їћ§ћўћ§§ў§§ќў§ў§§њў§ў§ў§§§ўћ§§шћўћў§§ћ§ћўў§ћ§ћўћў§ўћў§ўўћ§ў§§ћћњ§ћњњў§§ўў§§ў§ќў§ў§§ўў§§ўўћћї§ћ§ћў§ўћ§§њћў§ў§ўўљ§ў§ў§ўћћ§іўћ§§ў§ўћ§ўўў§ўўњ§ў§ў§ўўљ§ў§ў§ў§§ћў§ўћ§§ћќ§ћў§§ћўћ§§ўўъ§ўћ§ћў§ўћ§§ў§ў§ў§ўћ§§ўўј§ў§ў§ў§ўў§чў§§ћўњћћўћћ§§ћў§§ћўћўћў§ўў§ћў§ўў§§њў§ў§ў§§їў§ў§ўћ§ћўўљ§ћћ§§ў§§ўћ§§ўћўў§§ўћћ§ўў§ўўњ§ў§ў§ўўў§ў ў§љў§ўћ§ћўўў§ўў§ќћ§§ўў§§ў§ўўў§ўўњ§ўћ§§ўўћ§ў§ў§§љў§ў§ў§ўўќ§ў§ў ўї§ћћўћўћў§§§ў§ўўќ§ў§ўў§єў§ў§ў§ў§ў§ў§§ѓў§ў§ў§ў§ўў§ў§§њў§ўћ§ћћќ§ћўћћњўћў§ў§§љўћўћ§§ўўђ§ў§ў§ў§ў§§ћ§ћ§§ўє§ў§ў§ў§§ћњљњњїўћ§§ў§ўћ§§ћћў§§ўў§ћў§ў§ўў§ќћ§§ўў§љў§ў§§ў§§§ўћ§§ћ§њў§ў§ўћћ§ћ§ўњ§ў§ў§ўўњ§ў§ў§ўўі§ў§ў§ў§§ћ§§јћ§ћў§§ћ§§іћ§§ў§ў§ў§ўў§ыћ§§ў§ў§§њњ§ў§ў§ў§ў§ў§§ў§ћў§§ќў§ў§§чў§ў§§ћ§ўў§ў§ў§ў§§ћ§јњўў§ўўў§ўўє§ў§ў§§ўў§ў§ўўђ§ў§§ћў§ўћ§ћ§ћ§§ћћ§§ў§§ўѓ§њћјћљњ§ў§ў§ўўј§ўћ§§ўћўўќ§ў§ўў§§ў§ўў§чўћўћў§ў§ў§ўћў§ў§ўћ§љњїњњћћ§њў§ўћў§§ќћ§ћ§§ўў§§ўў§§эўћўћ§§ў§ў§ў§ў§§ћ§§ўўї§ўћћњ§љћњњђћ§§ћ§ћў§§ћ§ћў§§ќў§ў§§ўў§ўўњ§ў§ў§ўўѕ§ў§§ћўў§ћ§њњёљјњљ§њ§ћ§§ў§ў§ўў§§ў§§§ў§ўўј§ў§ў§ў§ўўў§ўўъ§ў§ў§ў§ў§ўў§ћњљјїњјћћ§§ўў§ўўў§ўўў§ўўћњњ§§ўћ§§јћ§ћ§ћ§ћўўь§ўћ§ћћјњјљјњљћњ§§ў§ўўў§ўўў§ўў§§ў§§њћўњўћ§§ћЧ§њ§њ§ћ§§ў§§ћљјљїљјћљњљ§ћўњ§ћ§ўў§ў§ў§ў§ў§ў§ў§ћњўћ§ћ§ћў§ў§ўўљ§ў§ў§ў§§јўћ§ћў§§љљњі§љћљћљћњўћћхў§§ћўћ§ћў§ў§ў§ў§ў§ў§ў§ўћ§§ўўј§ў§ў§ўћ§§шў§ў§§њћїљјњљћњ§њћљ§њ§ћўћћ§ўћ§§ћћўћ§§ўўй§ў§ў§ў§ў§ў§ў§ў§§ћћњћћў§ўћњјњјњљћљ§њћњ§њњљ§ћўњўћўўј§ўћ§§ў§ўўњ§ў§ў§ўў§шўћў§ў§§ћ§ћ§ћћјљјћљћљ§њ§ћћѕўћ§§ў§ў§ў§ўўў§ўў§§ў§ўўћ§ў§ў§§ћуњ§њ§њ§њ§љњјћњ§њћњўћ§ћћњћћ§ћ§ћћўў§§ўэ§ў§§ћ§ћў§ў§ў§ў§ўћў§§сћ§њћјњјљљњљ§њћњћњ§њ§њ§њ§њ§ћћ§§ўў§ќћ§ћ§§їў§§ћ§§ўћ§§§ў§ўўє§ў§ћљњјћљ§њћћќ§ћўћћюњ§њ§ћћњ§ћ§§ў§ћћўћ§§щў§§ў§ў§ў§ўћў§§ћ§§ў§ў§ўћћі§јљњћћў§ў§§ћћ§ў§§ћћјўћўћ§ћ§ўўі§ў§§ћ§ћ§ћ§§хћў§ў§ў§§ћўћ§ћўњњјњјњїњљћљўњњў§њњаўћ§ћ§њћњў§§ћ§њ§ўў§ў§ў§ћњћћ§§ў§ў§ўћўћўћ§ћўњћњћњћњњњљћњ§ћ§§ќўћ§њњє§љњњћљ§њњўў§§ћў§ў§ўўч§ў§§ћћјњјљћ§њћњћњ§љћљњњ§ћћѓљњњћљћњ§њ§њћўўў§ўўќ§ў§ўў§щћў§ўћћљћљћњњљћљњњљљћњ§њњш§њћјњљћњњћћњћћўљ§њ§ћўћ§ўўќ§ў§ўўѕ§ўћ§ћ§њћљ§ћћќ§ћ§ћћп§љћјњљћљњјњїњљћњ§љњљћњ§њ§њњљњјћњўўњ§ў§ў§ўў§лћ§њћљњјњљњњ§њ§ћ§§ћњ§љљїљјљјњљћљљњ§њ§њњћњђ§ћћњњјњјћњћћў§§јўћ§јљњћљљђћјњљ§њћљћљњњ§њњћ§њћјњњзљ§ћўћ§ћўћ§ћњњ§љњњ§њњјњјљїњљ§њћјњїјѕљїљјћљљфћњ§љћљћљћљћљ§ћўћћњћњћј§љ§ћћњњкћљњњћћ§љћњ§њ§љњїљјљљњїљїљїљѕјїњјњјћљћњњћњћѓ§ћћњћњ§њўћћњћћўўћћѓ§њћњћњ§љњјњјњњёјћљњјћљћљњјљљ§њњё§њ§њћњњљћњ§њ§њћћў§ћћ§њљћћы§њ§њћћњљћљћљ§њћњ§њ§њ§§яћ§ћ§њћ§§ћћњћљћњ§њњќ§њњћћњќ§њ§њњќўћћ§§ѓћ§ћўћћњ§њ§њћњњѓћњћћ§ћ§ћ§ћ§ћ§§љћ§ћћњўћћїњћњћњўћ§њњ§§њћћѕњ§љћљ§њћ§ўћћњўћњљћњњэ§љћјћљњњ§љњљ§њ§њњћњњќљњљњњњћњњљћњњю§ћ§ћ§ћ§њўњ§ћўћў§ў§§ўћ§§ёћ§ћ§љћљњњћњ§љ§њњѕљ§њњљњљњљ§њњќ§њўћћў§њњщ§њўћўћ§§ў§ўћў§ўћўћ§ћ§ћ§§яњљњћћ§ћ§њћњњљћљ§ћћћњ§њћњњћюўћ§§ўћ§љ§ћўћ§њњћў§§ўи§њ§ћўћў§ћћўњ§њћћў§ў§§ћ§ћћљћњ§ћўњўњћњћњўњњћшўћ§њ§њ§њ§њћћў§ўћ§§ў§§ћўћћљўћћњ§§ћћќњћњ§§ќћўњћћє§ћ§ћ§ћўњ§њ§ћћѕ§њћњўћ§ћўћ§§ћћ§§ўћћщ§њћ§§ћўњћњ§ћ§ћ§јњњћњћњћћђњћњ§њћћўћ§њ§ћ§§§ћ§ћћяўњћћ§ћ§§ўњ§њўћўњ§§ѓћ§§ўћћњћ§ўњўћћю§ћ§ћћњ§њћљћљћњўћў§§њўћўњ§њњћћўњћћ§§іњ§њ§ћў§ўћ§§§ћўћћ§њўћћўўћћћўћ§ћ§§ћћ§§ўћћё§ћћњћћ§ћў§ўћ§ћ§§§ћ§ћћ§ћўўћћј§љћњўћўћћѕўћ§ћ§ћўћ§ћ§§ўў§§ћє§њ§њ§ћ§§ў§ў§§іў§ў§§ћ§ћўћћѕ§ћћњћћўћ§§ћћѕ§ўњ§њћњћњњјјјћў§њћњ§њњёўћњњћњ§њ§њ§њў§ўўы§ў§ўћў§§ћњњ§ћўћўћўњ§ћћї§ћћњћњћљњњѕќюїњћћўњ§§їћ§ћ§љ§ћ§ћћњ§ћ§ћўћћэ§ўў§ў§ў§ўћ§ћ§ћў§§ћ§§ќўћ§ћћ§ўњћћѓљїєїљ§љћњўћћњњїћўћўњ§њў§§яћ§ћўћ§ћўћў§ў§ў§ў§§љћў§ў§§ћћќў§ў§§ќћњўњњ§§њћћэњ§ћ§ћ§ћ§њў§ў§§ћ§ћ§ћћэ§ћў§ў§ў§ў§ў§ў§ўћўћ§§ќўћўћћж§њћћ§ћ§њћ§ў§§њћњ§њћњћћ§ћ§§ћћ§ћ§§ў§§ћ§§ў§ў§§єћ§ћ§ћ§§ћћ§ћ§§ћъўћ§ћ§ћ§ћ§ћ§њћњ§њ§љ§њ§ћћїўћўћ§§ў§ўўћ§ўћў§§фў§ўћўћћљјј§њћћ§ћ§ћ§§ў§ў§ў§ў§§§ў§ћћњўўћћпўњ§љ§њў§ўћћўў§§ћўћ§ћ§ћ§ћ§њћјїјћњћћћњћћ§ћћя§њў§§њћћў§ў§ўћ§§ћћљњўћ§њ§ћћўўћћ§ћўћћњћћчўњћњ§ћћњћћўћўћўћ§§ў§§ћћњћћ§ѓћ§њћњўћўћ§ћ§ћћўњ§ўљ§њњљ§§ўў§ўј§љјјєњњјјњљњ§ўћўўњћўњњћўў§єћњ§§ћўў§§јњїїўўћ§§ѕњћћјњњ§њњ§ўўј§ћјњћ§§ўўўћўўєњљ§њњ§њ§§њњўўѕћў§ћјњјїї§ћћћљјјњ§§ўј§љјјњјћ§§ћњ§ћў§§їћљћљљјљљћћљ§ћћўћћўўћ§њ§§њњ§§љ§ўўќћњњ§§ѕњ§§ћћњјљћј§§њњ§ўўћ§§њ§яћњўўњљўћ§§њњ§§њ§ўў§цљ§ћњћћљ§§њњ§њљњјњћљјјћћљљћћѕљћћљћљ§љћљћћљ№§ўў§§ћњјњњјњјњјћћї§љљ§§ўў§ўўћ§ћњњјј§њўљћћѕљћњњ§§љљћњјјњћљљћњ§§иљњєїїєїѕїњћљћњў§ўўћљњўў§њ§§ћњјјћ§§ћўћ§§њњя§ўћўўћњ§њљњјњњћћ§§№њ§ћјљљїњјћњјљћћ§§ћћњћћ§§Эћњњјњјљћјјњ§љљ§§љћўњ§њ§ћў§њњ§ћјљљ§§њ§љћљћњјњјљћњљљћћ§§њљјјљюћјјњћћјљјњ§§њњ§њњ§§ўћўўѓ§ў§љјњјњњјјїјјњћњ§њњћћјљ§ўћ§љћњњэљћ§§љ§њ§љљћ§њћљћљћјјњў§ўўяћ§§њ§ћћњњ§њўўњ§§ћћі§јљ§ћћљљјїїњњљљћјљљѕћ§§њ§њћ§њњ§§ћ§ўў§§ўљћћ§ўњўўцћ§§ћћњўћўў§§љјїїјїњћ§ћћљћљљўњ§§ћў§њљ§§јњўўћ§љћјјэњћћљјљћ§§ў§§ћћ§њљћўўі§љњїѕѕїјћ§§ћ§ыњ§ћ§љњњўў§њћљїєѕјїїјњњэјњњћљћћ§њ§ўћ§ў§љћјїїљњћћ§њћљљўћ§§ў§§љњїїљњјњїљљћћђљ§њ§ћћљљћјњ§§љљђїњјїїњћљћћљћћ§§јљћљћћ§њ§§ўњўў§§ћїїљєњљ§њњ§§шљћјјњњљ§§јљїј§ћњїљјћљјјћћљјќћњ§љљђњ§§јћњїїљљћћ§љљўћљљ§љщћѕѓїїјјљљћјњјјљњїїљљњљ§§њўќ§љњ§§ќљћљ§§ћ§ўњћћњљљћћљћћљљу§ћљ§§љћ§ўў§љљ§ўўљїљњњћћљљ§њ§љљ§ўљ§§пњљћ§§ў§њљћћјїљљњћљћљћћљћљљ§§љњњјњњ§јўњњїјїњјјљћ§њљњў§§ў§ћ§њњћёњ§ћљњјћљћћ§ћћ§њњўў§§цљјјњјњјњљљїїјћ§њљњљљћ§њ§ў§§ћњ§ћ§ўў§§њћћіљ§§њ§§јљћљљїјљћљћћ§њ§§љћ§љњўўйћњљ§§љћјњ§њјњјњјјљљњ§ћљћћљљњ§љњњїјїїјїјјњѓ§ћљ§§ћљћљљћ§ўў ћљњјїљњћ§§цљјњјњјјљњ§§њћњїїјїћљљњ§§њљљјљћљ§љћ§ўњ§§ьњ§љћјљјєєѕїњјјїљјљњ§§тў§§ўў§њ§ўў§њњ§њљћљљћћљљ§§љњ§њ§§§ћљћћ§ћљћјїѕѕћїљњњћћљѓћњћўў§њ§њ§ўћњњўљ§§ћ§§њ§§ћўћ§§ћћ§ўў§§ћћњїїљљцїјјњјїћћљјњћњ§ў§љљїїњћ§ћїјјњћ§њћў§§јњјјћ§ћў§§њ§ћћњ§њћћ§љј§§ћљљћјћћ§ћћўњїїьјїјјїѕїїћ§ўћўўїћњњ§јјќљњ§ўўќ§ћєћћ§ќљјјїїќљњїљљў§њњљ§ћњјјїыјњјљљћћ§§ћњњ§њњћљћљњјјўљ§§єћѕшѕњњћћїњїљљ№їѕїњћћљћљћћјјћћјјљяїјњјљјјћћљљјљљјјљљћц§ћћљћљћјїљћљјїїњљљћћљћњјћ§§рћјѕїїљѕїѕїјњјљљћљћљњїєѕѕјљљњ§ћљ§§јћїѕїїњњїыљњјћљјїїѕљјћљћљћљћљћ§§ћћљћњјјѕљ§њў§њ§ў§љјјѓњјјїїѕѕєѕїїљїїњўћљљіћ§§ћћјїїѕјјњќїњјљљћћљћјћћћљћљћљљ§њњћћњїѕѕћїјјњјјћњјјћљљіњјјїћљјјњљљюјљјїњњјїљњјјљјјћћљљљ§ћ§§љљ§§њљќњјљјјњїњњљћјјњђљћјјљћћљљћљћћљљёјљћјљїљћћљљћњ§ўўј§љјћњ§њїїћњљћћљљѓћјњјјћњјїїљњћћјљјјљљћњ§§ћќљћћљљ§ћњ§§ўўњ§§њљѕљјњћћцјљћћјњћћњћљїјјїњњјїљљћјљћњњћ§њљ§ћњ§ћјћћњљћљљѕљљјћљѕѕєєѕїїєјїљљћњѕњљ§љћћђљћћљјјїјњљћљљјјјљњљњљњјљљћћљјљћ§§ќњ§њїї№јњњјїїњћћ§§њјњњћћѕљћљ§§љљћєњћћўљћћљїѕјљњ§љ§§љћ§ўўэћўў§§їјјљљћљјњѕєѕєїїяєїјјїјљљїђѓђїњјљћћњљ§љљїјјщїј§§ћ§њ§§љњљћћњњўўћѕєєїї№љѕїјјїљљјјїљњјњјјэїњњјјљњњїѕїњљћћјјљїїўјљљћ§јћ§§ћцљњ§ўўњљїљјјњјјѕјјљїїљљїјјћћчљјћљјїљїљљћњјњњљћћљћћљљњљљыјњјћљћљћљћћјїљїѕјѕѕєїїўљѕѕјьїљјњљћљћћњљњњљјњјјњћћ№јљњјјћћљљјљљњўћўўчњ§њњѕѕјѕїљѕїјљїїљљњїєѕјјѕѕљјљќјљљњњћћљљћљљ№ћњјјљљ§ћ§љћ§ј§њўўњћ§ўњњїїыљјњїѕїїѕјѕїљјѕѕљїїњњјјєњљјјњїјњћћјїї§ѕјљљћ§љћ§§ўњјјњљѕєјѕѕїїюљјњљљњјјњјћћњјїјњїїљјњјјљљјјќљњњ§ §љњћљ§њљјјїњјњјѕїѕєњњіјѕљљїљњєјљљўћљљјЧњљљ§њњљљ§њћћљњњ§ћљ§§њњћ§њ§§њљљћњљјњћњњ§§љјјљћћњљїјљ§§љћћљљїњљ§љ§§љћљљјјїјјћљљ§ўўі§јњљ§§ўўћўўіћ§љћјјљѕјћћ§љћјјњћћјјюљњњ§ћјљћ§§њћјјљљћ§ §њ§ўњўќњ§љ§§ѕљ§љјјљљћњњ§§ўљћћўњ§§ѓћјјљ§§њљћћљћ§§§њ§ўўўћўўў§њњћњњјјљћ§§ьўћ§§њњ§ћљљјћјїњѕїјјљљў§њњј§ћў§§њ§ўўўћ§§ўћћўњљњјјњўљћћќјљљ§§ћњ§љћјјцњћ§ўў§њ§њўћњ§ўў§§њњљљ§њњ§ћћюљњљљўњ§ћњјјњљїїѕїјј§іћјјљјѕѕњљ§§ћњ§њћ§§љњћљћљјљљќ§ўњ§§љќ§ћ§їїўњћљсјњјњћјњњјњјњћњјїјјљљј§њћљ§њ§њњ§§ўўњ§§ћё§ўўћћўўњњћ§ћљњљљњћљћјѕїїсѕјј§љњћјїїѕјљћћљњњў§§ўўћўњѕљїћ§§ћїљњ§§њћ§љјјљњїјњћљјјюњјјњњјљћћљћћљ§§њ§ћћюњјљњ§љ§§њћњ§§љєњ§љљљћљњўўћўўєћјљћ§§ћљњњћјјљћјћјјїјјќњћћјјђљћљћњљњњљњљ§§ўў§ќњ§ћўўў§љљњћјћљљћћљїњћјњјјњњћћўњ§§љњ§§љћ§ў ўўњўўљћўњћ§§ћћєљћћљјјњћњњћ§§љыїјїѕїјљњњљћћ§њњ§§љ§ўћћѕњ§ўћўўћўўћ§§чјїїњћљћљћљћљљћ§ўћ§њљњљјїјј§њ§љљі§њљњљњћњњўў§№њ§њў§§ћўўњјјћћњ§§§њ§ўўќ§њ§њњќ§ћјћћњ§ўўћћўўўћўўї§љї§ї§§њўўўћњњћў§§њўўьњўў§љњўўћњјїјљљћћљ§ўў§ѕў§њљњ§њ§§ћўўћўќ§ўў§§љљћѕљњ§јјјњљћјјљљ§§љ§љѕњ§§њ§ўћўўћўўъњ§ўўћћўћјїѕїїјјњњћћњ§ћћљыћ§њљјљћ§§њ§§ћљ§њ§ћњ§ўўљ§ўў§њћў ўъњ§ўћњјїїљљјњљ§§ў§§ћћљјјіћ§ї§ћћў§§њњў§љљњјјћњ§§ў№ћ§ўћўўћ§§њћўјњјњњьјљ§§јћћ§§њ§§ћљ§ўўћ§њњ§љјљљњћљњњ§ўўћўўњћўў§§ўўѓў§ў§ў§ћ§§ў§ћўў§ёћў§§ћњњћљљњњћћ§§§ў§ўў§ўє§ў§§ћ§ћў§§ћўўќћ§њљљўјћ§ћ§§њњ§§ўћ§§іў§§њњљњћ§ўўў§ўўќ§ўћ§§њћ§§ў§ўўћёњљњћњ§њћњћћ§ћ§ћћ§ў§чћњњљњњћ§ћ§ћў§§ћћњћњћћ§ћўњњћ§ўў§ўўј§ў§ўћ§ћ§§іћ§§ўћў§ўў§§ўћ§§ћіњљњћњ§ћ§ћ§§ў§§ћ§§ђћ§ћћњ§§ў§ў§ўћ§§ўћ§§ѓў§§ћўћў§њњћћ§§їћ§ћљњљњћњњћіњћњњћћњћњћћ§њћњњћ§юўћ§њљњљљњљњљњњћњ§ћћэ§ўўћў§ў§ўћњљљњњћ§ћ§§ћњЭћњ§§ћ§ћћњљњњћњћћњ§ћ§ћћљљѕѕїѕјљљћћњљўћў§ўў§§ўћ§ћ§њљњњљ§ћў§ўћ§§ўћўў§§ў§§Щћљњљљњњћ§ћ§§ћњњјјљљњћљњћњњ§ћ§ћ§њљњњћ§ћњљљњљњћњ§ћ§ћўў§ћўў§ўўћ§§њћ§ћчњљњљњћћљћћњњћњћњњћ§ћ§ћ§ћњњћњќљњњћћ§§ћ§§ўћ§§ћћў§ў§ўўѓћўћћњљњљљњњћњњ§њјўћўў§ћњљљјћњ§§ўћ§ћћяњћ§њћњўњ§ћњљљћў§ўўћ§њ§јћ§ўў§§ћњњ§ћћњћћњљљћњћјњ§ћ§ћ§њ§§ћћ§њњћ§§ћњћё§ћ§§ў§ў§ўћ§њћ§ўўх§ћћњљљїљљњ§њњћњћћ§§ћ§ћўћ§§ћћі§ћ§§ўў§ћћњњќљћњћћєњ§ћўћ§њњћ§§ўўт§ћљљњјљњњћ§ћ§ћњњћњћћ§ћ§ћ§ћўћў§§ѓўћ§њћљјїїљћњљљэњљљњћњњ§§ћўўћўћћњњљљњњћћ§њћћјњ§ћ§ћ§§ўўћ§ў§§ћћљіњљњћћњњћў§§№њћўћњњљ§ћћјјљљњљљ№њћњњћњњћћ§ћњћњњ§§юћ§§ў§ў§ўћћњљљћљћћ§§шћ§ћћњњљњћ§ћ§ћћњ§њљљјњњћњњћњ§ћї§ћ§ћњљњњћћ§њ§ћ ћјњљњљљњњћћњњљњњћљљјьљћћ§ћ§§ў§§ў§ћ§ћ§ћћњћћњќ§ћ§њњљљћњћћњњћћіњћћ§ћњћў§ћћўћјљјљњњћў§ћћј§ћўћ§ћ§ћћ§ўћњњњљјјљњћћњ§ћњћћ§ўћ§§ћћ§ћћ§§ћѕїљљњњќћ§ћ§§іћ§§ў§ў§ўў§§њў§ћћѕљњњћњњ§њњћ§§сћ§ћ§ћћњњљњљњљћћљљњњ§§ћљћћњћ§ћўћћў§ћћўћћ§њћњњіћ§ћ§ћ§§ћњћћљњћњћњњ§§§ћ§ћћњжћ§§ў§ў§ћћ§ћњћ§ћњњљњљњњћћ§§њћњњћћ§§ћљљћњљљњњ§ѓћњћ§ћњћњћћњ§ўўњћњћњћњњћщњљјљњћћ§§ўћљњљњњћ§ћ§§ћљљњћ§§ћ§ћћњћњћќ§ћ§ћћњюћњ§ћ§ћ§ћ§§ћ§§ћћњјїїќјљљњњћ§ћіўћ§§ўћ§ћў§§јћ§ћњћћњћћї§ћ§ћ§ћњћњњїћ§ћћњњљњјјћљјљљњњћў§ўўјћ§ћ§ћўў§§ћю§ћ§ћћњњћ§ћ§ћћўўћ§њњіћ§§ўћ§ћ§њљљј№љњњљњњћњћњљњ§ћўћћљњљњ§њћњњіћ§ўўћ§ћ§§њњњћўўћћ§§љћ§ў§ћ§њњћѕ§ћ§ћ§ћњњћћњњў§њњўћљљьњћњњљљњћњ§§ў§ўўњ§§ћњњњћ§ћў§ўўѓћњћћњћћ§ћћњњљљ§јљћћ§ћ§њљњњљыњљњћћњњћћў§§ћ§§ћћњћљњњћё§ћ§њјњјљљњћњљљјјѕљјљљњњћњћћњњјњќљњћњњћњ§ћћњњћћўњћћєњћњћњњљћњћњљљћњћїљњњ§ћ§њњљљўјљљіњљњћћњћњћљљљїљњћћ§ћћў§ћћћ§ћњњљ љсјљњњћњљљјјњњћњћњћњћњ§ћ§ћ§ћњћњљњњћї§ў§§ћ§§ћњњѓљњњљљјјљјљљјљљўњћћљњ§ћћњњљљњљўњћћ§њћњњћћњћњћћј§ћ§њњљљјјћљњњљњњќљњњћћўљњњћћњњљћћђњћ§њљљњљјљњњћњњћќ§њ§ћћљ§ћ§ћљљјјќљњћњњљїћњ§њњљљћњњћјњћћњћњњћћѓ§ћњњјљћћњћћњ§§ѕў§ћћ§њ§ћњћљљќћњњћћњюљњњћљњљљјљњћњњћњњћћ§ћћ§ћћњњќћњњћћ§јћ§§ў§§ћ§§ўћјјњє§ћћњњљњњ§њћњњћћљљњћћћњ§ћњљљѓњћњњћћ§§ћњ§§њњјћњћњћћ§ћћўњјјїўјљљўњћћўњљљћњ№ћњћњћћњњћњљћњћћњњјћ§ў§ћљњћћњ§ћњћћћ§ћ§ћљљћњљљњљљъњћћ§љњљљњћњћњћћ§ћћњћљњњњћњћњњћћњћћ§ћўћћћњћў§ўў§іћљњњћћњћњљљјљ§њћњњ§ћњћћњїћљњћћњћњћћњћ§ћ§ў§§ћў§ўў§ўјљјєљњњљјјњњљјљњњљњўјљљћјљљћњњўјљљўњћћњрћњћ§ћ§њћћ§ћў§љјљјњњљњњљњњјљљјјљњњћњћћњљјћћёњљњљљћњњћћњћћ§ћћіњљњњћњўњћњњћћљјїјјљјњьљјњљћњћњњљћ§§ћњљњњљњњќ§ћљњњћћ§ћћ§ўў§шћ§§јјїјљјњљњјљљјјњљљјїїјјњћќњћћљљўњћћяљњњћћ§њ§ћњћ§ћ§§ў§§љђјњљљјљљјїјљјїјјљњїљћ§њљљњљњњљўњћћњљћњ§ћ§ћўўў§њњљњјїїјјљљђјњљјјљњњљ§њњљњњљљњљњњћћњњщћ§§ћ§ћ§ћ§ћ§ћ§ћ§ћћњћћ§ћњњћљњљњљљўћљљіњљјјљјљћњћћљ§њњљћћ§§ћћ§њњћ§§ќњћћ§§ўњ§§жћ§ўћњљјњљћ§§ћ§ћњњћњњљјљњћ§ћћњњўћћљћћў§ћћњћћњћ§ўћўўјћњљћћ§§ўўў§ћћњіјљњњћњћћ§њњќљњћњњќћ§§ћћћњ§ћ§њњћѓњћ§ћ§ћ§ћ§ћ§ћ§§ћћў§ў§§ќў§§ћћ§їўћўћњћћњ§§ћњљћњ§ћ§ћњњѕћ§ћ§ћњњћњ§ћћћ§ћ§ћўўњ§ўћ§§љљњђљњњћњ§ћ§ћўў§ћ§§љњћћ§њњљљњћ§ўћ§§ў§ўўњћ§ћў§ўўќљјљњњљњћњћњ§ћћќ§њњ§§ўћњњћљћћў§§эћ§ўў§ћўў§ћ§§ўћћ§§ћњњ§ћ§ўўў§њњ§љјљљњћњіјїјњљћћ§ћ§§ѓњ§ћ§ўћћњћњћњћћњў§§ћ§ћћ§ўћўў§цћњњћћњљњљњњљљњљњљњљњћњњћћ§§хњћ§§ћ§§ћ§ћ§§ў§§ћ§ћ§ћњњћњћ§ўў§њњ§њћљћћљќћњњљљјњћ§ў§њњљљоњћћњћ§§ў§ћў§ўў§§ћњњћ§ћћњњћ§ћ§§ўћћњњљљњњљћћњњёљњњљљњћњћћњњћћ§§їњћњњљњћ§ћћ§јћ§§ћћў§ћћћњћ§§ўўє§ћњћњ§ћњћљљњњћў§њњтљћњ§њњћћњћњ§ў§§ў§ўћћ§ў§ў§ў§ўћ§§ўў§ўўў§ћћў§ћћъњћњћћ§њњљњњљљњњћ§§ћ§ћ§§ћќњ§§ўўў§ў ўч§ў§ў§§ў§ћћњћћњњћњњљњљљњ§ћћў§ћћў§ћћєњћљљњћ§§ћњњ§§ћќў§§ўўќ§ћ§ўўњћ§ћ§њљљшњћњћњћњћћњћўў§§ў§ћњћњњћ§§ћї§ў§ў§њ§§ўў§ёћ§ћ§§ћ§ўћ§ўў§љњњњћ§§ћћ§§§ў§ўўќћ§ћ§§їћњ§ћњћњ§ў ў§ёћўћўћ§§ў§ў§ў§ў§§§ћ§ўў§§ў§§ўєњљњћњћћњњўћўўђ§ћ§ћўћ§ћ§ћ§ћ§ўўў§ў ў§ўўћћљњ§ћ§ћ§њњњљћћњњћћў§ћћў§ћћ§ќћ§ћўўќ§ў§ўўњ§ў§§ћўўђњљјљљњњљљњњ§ћњњћш§ћ§ћњћ§§ћћњћ§§ћњ§ћў§ўћў§§ўў§ўўў§ўўш§ћўўљњљљјјњљћћ§ў§ћњњћњњћћ§ўћўўўћ§§ыў§ў§§ћћљњћњ§§ћ§§ў§ўћўўїћ§§ўўњљњљљўњћћћ§њћћ§§јћњћ§§ўў§§јћ§ћћљњћ§§ќћ§ћўўњ§ў§ў§ўўќ§ћћўў§ ўў§ўўў§ўў§§ћўћћљўћў§ў§ўўў§ўўќ§ў§ўўў§ўўљ§ўћ§њ§ўўј§ў§ў§ў§ўўў§ўў§њћў§ў§ў ўј§ў§ў§ў§ўўћѕўћў§ўћ§ћ§§ўўў§ўў§іћўћў§ў§ў§ўўў§ўўљ§ў§§ћў§§ ўў§ўў§§ў§§ўѕ§ў§ў§ўћ§ћћ§§љў§ў§ў§ўўђ§ў§ў§ў§ў§ўў§§ўўј§ў§ў§ў§ўўў§ўў§§ў§ўў§јћўћў§ўћ§§ќћ§ћ§§ўћ§§ўў§§ќў§ў§§ў§§ћўћћ§§ћ§§§ў§ўў§§ўћћ№ў§ў§ў§§ћ§§ў§ў§ў§§ћћўћў§§ўя§ўћўљњјњњћњћћ§§ћўўў§ўў§њћўћ§§ўўњ§ў§ў§ўўщ§ў§ўћўћ§§ў§ў§ўў§ћ§њ§ћўћћ§ьў§ў§ў§§ћў§ў§ў§ўћўћў§§ўќ§ў§ўўќ§ў§ўўј§ў§ўћў§ўў§ћћ§§ўћћќўћў§§цћ§ћ§§ў§ў§ўў§ћўћў§ўћўћў§ў§ўўў§ўўќ§ў§ў ў§§ўћћєўћўћўћў§ў§ў§§ў§ќўћў§§іў§ў§ў§ў§ў§§ўўћћ ў§ўў§ўўћ§ў§ў§§юўћ§§ўћњњ§ћ§ћўћў§ў§§љў§ўў§§ўў§љў§ў§ўў§§њћў§ў§ўў§ўћўўѓ§ў§ћњ§љ§ћ§§ў§§љў§ў§ў§ўўќ§ў§ўў§ћћўћўћћќў§ў§§ўњ§ў§ў§ўў§шћ§њћњў§ў§ў§ў§ўћ§ўў§ў§ў§ўўў§ўўі§ћ§ћўљ§ћўћћќўћў§§§ў§ўў§ѕћ§њ§њњћўћў§§ўў§§ћў§ў§ўўў§ўўіћ§њњћўћўћ§§шћў§ў§ўћў§§ћћ§ўћ§њ§ћћњ§ћ§§ў§ћў§ў§ўўёћўњ§ћћ§ў§ў§ў§§ћћэњў§ў§§ћў§§ћ§њћ§ўћў§§іў§ўћў§ў§ў§§Эў§ў§ћўў§ўћў§ў§§ћў§ў§ўў§ћў§ўњ§ћў§§ћўћўћ§ћ§њ§њћ§ў§ў§ўўє§ў§ў§ў§ў§ўћўў§ўў§§яћўћ§ћў§ў§§ћ§ў§§ў§§ўў§ўўњ§ўњ§§їў§ў§ў§ў§ўўѕ§ў§§ћў§ў§ў§§єўњ§њћ§§ћ§§ў§§ўў§ўўў§ўўь§ўјћњћћўћў§ў§ў§ў§ў§ўўѓ§ў§ў§ў§ўћўћў§§ўр§ў§ў§ў§ў§ўћўћўћў§ўњњћ§§ў§ћ§ў§ў§ўўўћўў§ћћ§§ў§§ў§јў§ўћў§ў§§њў§ў§ў§§ўъ§ў§ў§ў§ўњўћўћўћў§ў§§ћ§§юў§ўћўћћњ§ћўћў§ў§ў§§ќў§ў§§ўњћ§ћ§ћ§§їў§§ћўњ§ћўў§ў§ћўћћўђ§ўћћњ§ћўћ§ћў§ўўљ§ўћўћў§§ћў§ўћ§§њћ§§ў§ўў§ў§їћўњћјњљњћћљў§ў§ў§ўўў§ўўў§ўўч§ў§ў§ў§ў§ўћўћўў§ўў§ў§ў§ў§§яў§ў§ўћ§њћљћћ§њўћ§§ўћў ўќ§ў§ўўќ§ў§ўўў§ўўў§ўў§уў§§ўў§ў§§ћ§њ§њ§§ўћўћўћў§ўћ§§ўўњ§ўћўћ§§ћќ§ў§ўўј§ў§ўћћ§ўўў§ўўў§ўў§ёћў§ў§ў§ў§§ћў§ћ§§№ћўњ§§ўћўћ§§ўћў§ўўі§ў§ўћўћ§§ўўъ§ўћўћў§ў§ўћ§њ§њўћ§ћ§§ўў§ўўћћќњ§њћћ§ўњ§ў§ўћ§§ћл§ў§ў§§љђљўћ§ћўћ§њ§њ§љ§ћ§§ў§§ћ§ћў§§ћўћћђ§њўћўћ§ћў§ў§ў§§ѕўћ§§ў§§ћўћ§§іћ§ћ§§ўњ§ћ§§ћ§№ў§§ћ§њ§њ§њ§њўћў§§яў§§ћњљў§ћ§ў§ўћ§§ўўї§ўћўњ§њ§ћћњё§њўћ§§ўњњћ§ћ§ћ§§њў§ў§ў§§ѕўћўћўћў§ў§ўўх§ўћўћўћћњ§љћљћњ§њ§њ§њўћў§ў§§єўћ§ћ§њ§ћўћўћћќ§ћў§§ьў§§ћў§ў§ўћ§§ў§ў§ў§ў§§ђћњћљћњўћўћўћўћћ§сћўћў§§ћўћ§§ўћў§ўћўћ§њћћў§ўћ§§ў§§ќў§ў§§ьў§ўћћњ§њ§њўћ§ћўћ§ћў§§ўўћћљў§ўћ§ћ§ §љћ§њ§ћў§§§ў§ўў§ўїњћњњћ§§ў§§ќў§§ћћўўћћш§њ§ћ§ћў§ўћў§§ћў§ў§ўў§§ў§§јћўћў§ў§ўў§§ў§§љўњћњћњ§§ћћ§ћў§§ёўћўћўћўћ§ћў§ў§ћћћ§ћ§§ўўи§ў§ў§§ћ§ћў§ў§ў§ў§ў§§њљљњјћњ§њўћў§§ћ§ћ§ў§§цћў§ўћўћўћўћ§§ў§ўћў§ў§ў§ўћ§§ўў§§ѕўћўћў§ў§ўћњњћьўњ§ћ§ћў§ўћўћ§ћ§ћў§ў§§ќўћћ§§ўћ§§љўћўћ§§ўўў§ўўы§ўњўћ§ћ§ћўћ§љћћ§њўћўћћ§ћћў§ўћћх§ћ§ћ§§ўћ§ћўћўћў§ў§ў§ў§ў§ў§ўўў§ўўлљћљ§њ§њћњўћ§њ§ћўњ§ћўњћћўњўћўћ§ћћњћњћ§§ћј§њ§њўћў§§ѕў§ў§ў§§ћ§§ўў§ћ§њњћт§ћћњ§њ§њ§ћў§§ћўћў§ўњ§ћ§ћ§ћўћў§§ьћ§ћ§§ў§ўћўћў§ў§ў§ў§ўўљњћљћљћ§§ќњ§њћћіљћћўњњћўћ§§јў§ў§§ћўћћ§єћўћ§§ўћ§ћў§ўўњ§ў§ўљћћњи§ћ§њ§њ§њ§љћљћљћљ§њўћў§ў§ўћўћ§ћ§ћ§§ўћўћў§§§ўћўўЫ§ўћћњ§њњћћњћњ§ћћљ§њћљћњ§њўћўћўћћ§§ћўњўћ§§ўњ§њ§ћ§§ў§ў§§ўў§§§ў§ўўэњћћўљћњћљћњ§њ§ћћњ§ћћўў§§ћјўћћњ§§ўћћ§ћшў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§§ћћф§њ§ћўћўћ§њ§њ§ћўћ§§ўћў§ў§ўћў§§ў§ўў§§ѓў§ў§ў§ў§ў§ў§ўўћћ§ћ§ћћюў§ў§§ћћ§ў§ўњ§ћ§§ў§§ћў§ўћўў§§ў§§іў§ўћўћўћ§ўўњћў§ў§ўўяћўћ§ћћњ§ћ§ћ§ћў§§ћћєўћўћў§ў§ўћў§§њў§§ћў§§ёў§ў§ў§ў§ў§ў§ў§ўўў§ўўћ§ў§ў§§њў§ўћў§§ћў§ўў§§ѓћ§§ў§ў§ўћў§ў§§ћў§ў§ўўќ§ў§ў ўћ§їўћўћ§§ў§ўўў§ўў§ѕћ§ћ§њўћў§§ўўў§ўўў§ўўў§ўў№ћњћўћўћў§§ћ§§ў§ўў§јў§ў§ўћўћћўў§ўўў§ўўѕ§ў§ўў§ўў§ў§§ћў§ў§ўў§єњћћўњ§њ§њўћўўѓ§ўћ§љћњћ§ў§ў§§њў§ў§ў§§љўћў§ў§ўўњ§ў§ў§ўўќ§ўћ§§ћћўћ§њћћє§ћўћўћ§ћ§§ў§§ўњ§ў§ў§ўўѕ§ў§ў§ў§§ћ§ўў§ўў§§сўћўћўћ§њ§њ§ћў§ў§§ћ§њ§ћўћ§§ў§ў§ўўі§ў§ў§ў§ўћ§§ўў§ўўљ§ўћўћўћћњўћўћўћћћўћ§ћ§§ўў§§щћ§§ћћ§§ў§ў§ўћў§ў§ў§ў§ў§§ ў§ћў§§юў§ўћћ§ўћўћ§§ўћўћўћћ§ќўћў§§ћў§ў§ў ўќ§ў§ўў§їўћ§ћў§ўћ§§ъћўћўћћ§§ћў§ў§ў§ў§ўћ§§ўўї§ў§ўћ§ћў§§їўћў§ўћ§§ўўў§ўўѓ§ў§ўћўћ§њў§ў§§§ў§ўўў§ў ўј§ў§ўњ§ћ§§љў§ў§ў§ўўў§ўўї§ўћўћў§ў§§ўј§ў§ў§ў§ўўњ§ў§ў§ўўў§ўўјћўћ§ћў§ўўў§ў ўі§ў§§ћ§ћ§§ў ўў§ўўў§ў ўњ§ў§ў§ў ўѕ§ў§ўў§ћўћў§§§ў§ўўќ§ў§ўўў§ўўў§ўўѓ§ў§§ўўћўћўћ§ћћћўћў§ўўђ§ў§ў§ўћ§§ў§ў§ўўњћ§љ§њћћ§ў§ўў§§ћў§§§ў§ўўљ§ў§ўў§ўўў§ў ўў§ўў§ћўњњ№ћў§ў§ў§ў§ў§ўћўћўўў§ўўў§ўўќ§ў§ўўњ§ў§ў§ў ўў§ўўћё§ўў§§ћў§ў§ў§ў§ўўў§ўўї§ў§ў§ў§§ўўќ§ў§ўўќјњћ§§ћєњ§§љљћ§§њњјљљ§ћњ§ўњ§§ъњљ§§љјїїєїћ§љљњ§њњ§љљ§§їў§§љњљњњљљћ§љћњ§§ѕњљў§њ§њњўњјјѓљњњ§њњ§њўўљћљљћњћўћ§§љ§§њўўќћўў§§щњў§§ћјћњ§њњљљ§њљњ§ўћњћ§§ўњўь§њ§ўћўћўћўўљњў§њћ§ўњњћ§ўћўўюњ§њљћјјљљѓїћњ§ўўњўўћћ§њњўўї§ћљјћљ§§њњчљњњћўўњћўўњ§§ћљњјљњњћћљњ§§іўћ§§ћјюѕћ§§ўўћўўћњёљњљѕѕїјћњ§љ§њ§ўўњ§ўњљљњѕїјњљњјћћ§§ўўї§ћѕњ§њњ§ўўяћњ§§љјїћћїїђѕњ§§ўўўћ§§њц§ћў§ўў§§ћћљћ§§ўћ§њњљ§њ§њ§ўўшћўў§§љљћћљћњњћјїѕљћћљћњ§§эћљ§§љњјљљ§њњїљљћ§њ§§јњўў§њљћ§§њў§љљўњ§§њўю§њјјїѕѕїїјљљјљњљјљљјїћ§њњљњљљ§§№њћ§§њ§§ѕњћћў§§јљљ§ѕњ§њ§ћћњ§§љјјёљ§њ§њ§ўў§љћћљњўўћ§§ћљљњћњњ§§ўўњЪ§њњјћћљљњљњў§§ћљњў§ћћјјћ§§њћўћў§љћљ§њ§§љњ§§њњ§њ§ћўўћў§§њўќћљњ§§ўљ§§њњћћўњўў§§ћјјєњ§ўўћўњћ§§њўўќ§њљ§§њњ§ћљ§ўўє§њњћјљњ§њњћўўїљћњ§њјњњўўћњїѕјљ§ўўњўћљљўћњњўўћ§§јјљјњјјњјјјњљ§њњљњ§§ўњўўў§ўўєњјјњјњїѕљћ§њњљ§ўћјјћљњ№љћњњјњјњљјљ§њћћўўљњјћњљўћћдў§§ћ§љјјљљјїїћљјѕјљљћљ§§љјѓљљїјјћљјїљљћ§њћћљљё§њ§§ўўћћўћўўћўћћўюњ§њў§ћњњјћ§ћљўњ§§њњћіњјјњјљјљћ§§ћљўўћўўўћўўњ§љњўўќћўћўў§њњ§ў§ћјјђћ§ўњњ§њњїњ§љљўў§ћў§§љўўњ§љћћњ§ўћўўћ§њ§§ўў§њ§њњ§§њ§јј§њћљљјњэјћњїњўўњћ§ўўћ§§ўј§ћ§§ћњ§ўўўњљљїјћљљј§ўћўўќћўћ§§їћјјћ§§њў§§љћњћ§§ўўюћњ§њ§§њўњ§§њў§ћ§њ§§њќ§љњ§§ў§ўїњ§љјљїљ§ўў№њљњ§§њ§њћ§§њ§§ћ§§щћ§§ћўїљњўў§њњ§§ћўљ§њ§ћљљѓј§њ§ћјїєѕјћљћћјіћњ§њљњў§љћћњљў§ћњ§§ўљњўћ§њњ§§§ћў§§ыњ§њћљ§њїјљћћјњњћљћљљ§§ўњ§§ўњ§§ћќњўћўўђјћўћњћўњњ§њљљ§§љ§ињ§њњ§љњѕјљњњћљјјѕїїјљљјњ§§њў§§љћјћљћњўњ§§ўњ§§эњ§ўњ§њ§љљ§§њњ§љјјљњњљёћјїѕћ§ў§§њўћў§ўўђњ§ў§ћљјћћ§љћ§њњј§њ§њ§ћњўў§ћўљњљ§§іњ§љњћјћћјїїћјњўў§§яљјљћ§ј§§њњћњјј§љўўњћўўњ§ўўўћўў§ћў§§ћўўућњ§њ§њ§љ§њњ§њ§ўўћў§ћјћљњњўўћ§§ўљўўењ§ўўњљ§ўў§§љљњў§ћјљљњўњўњўўњ§ћўўњљљћћјљњўўњњћњ§єњ§њћћљњљћјјћћљј§їљ§§ўњ§§ўљўўќњћћўўѕњ§љїєѓѕјњћўўќћўў§§ўњ§§іњ§§љћњјїїјјћљћњњўўўћўўўњ§§шљїєјћњњ§јљћћљ§њ§њўўњљјљ§§ќљњ§ўўњё§ўў§њ§љњљ§њљњ§ўўўћўў§ьњ§њљњљѕїјљњњљћљњњћћ§§ћѓ§њ§ў§§љ§§њўћўўњћ§њ§§ўўќ§њњўўўћўўћўљћ§њїјћњњѓљњћўў§љ§њљћњ§§§љј§§ўўћўўўћўўљћўћћ§§ўўєњ§ћћљїїјћ§ћњњќљњ§њњё§њњ§љјјћљљћљњњ§§ ўњ§ћњћў§ўўїћўњўўћљ§їїќњљ§ўўњђћўњћљ§њјљњњ§њ§§ўљ§§љњ§њўўћўўјњ§§љ§§њ§§ўђћњ§љїѕљљ§§ћўњ§§сјљљћљ§ћћў§§љњ§њ§§њњљћ§ћћљњњўћћўўўћўўхњўћў§њ§ў§њ§§ћїєѕїјћљљњ§ћ§§њњњ§љњљљјјќљ§§ўў§ћњјњ§ў§љљљћњњ§ўћўўљћ§њѕѕїјјћљ§њ§ўўќћўћўў§§ћљљъјўўћ§§ћћљћћњ§љљ§љўўњћўўњњўўћћўўјћїјћ§њ§њњю§њњўћњљ§њ§ўўњ§ўњњ§§љњћїљћљјњњћў§§ўўћўўя§ўњћјїљћњљљјјљћњ§§ћњћљ§ўўћћўўћўўњ№љїјњњљ§њњљ§ћћ§§љљ ў§щњљїїћљњљњ§љјљњњ§ћњћўўћўў§њўњњўњ§њћўћўўўћўўћ§њ§§њњўњяљїїњћ§ўњ§§ћўў§ћўњњљјќѕїј§§љќ§љњўў§њћ§§ћўј§њњ§ћљћљљє§њјћ§њњїњћљўўђњ§њњ§§љљњ§ў§љ§§ўњ§§љћљјћ§ћўўћўќћњњўўьћўўњћњљљћјљј§ўўћћўўћћ§јћ§њљњ§§њњў§њћћљљ§ўў§§љ§ў ўы§њљјїѕљјћ§§њћћ§њљћљљ§§њќўћћ§§щјљљћљћћљљћњњѕљњ§љ§њљљњўў§§њ§§щћјїј§§ўў§њњћў§§њ§ј§ўћўћћћўљћљњњ§§њљјјћ§њњ§ўўўћўўу§ћљјћњ§ўў§ўћћўћўўљ§§ћњўўљљњњ§§§љ§њњўѕћњљ§ћўўњ§њўўћўіћўњћјїїћњ§§њњ§ўћћўўљљњўўћўњњљўњ§§ћћўўёћўњ§њњћўў§ћљїјљљћ§њ§ћўў§§њћћўњўў§њўћћў§§њњћ§ўћ§§њ§љў§ўўьћў§ћћљћ§§њ§њћј§§љљњјј§§ћўў§њћўўќ§њњ§§ћњљўњўўўћўўјћўћў§њљћћ§ў§іњљ§§љјћћљ§§ўіњљњўћўўћћўўљћўўћўћўўўћўў§їњћћўў§§њўўў§јјћћљњ§ўўўћўўћўќћўћўў§іњћўћ§љ§§ўћћўњ§љњўхњ§ћљ§ўўћўўћўўћўњћћ§њњ§њњўћўўўњўўяћўћўў§ўљ§њ§ўўћўћўўёњћљ§ћўћў§њј§њўњњ№§њњ§§њ§§ћў§њњћћ§§§ћ§ўў§ќњ§§ўўхњ§њњўў§њљ§ћњћћњљћњњўћ§њ§§њўўўћўўы§њљљ§ўўћ§§њћїј§њљљ§њўўюћўћўўћўўњ§љљњњѕјљ§§њќ§ћћљљћіјњћњњ§§њљў ў§ћњўўњ§ћћ§ћўўѕћўўњћћјїѕј§§њ§ўћўў§§њ§ў ўћћўўћўўўћ§§ўћўўћїўћљїїњљћўўћўўћўўњњ§ўћњњ§§ўћўўњ§§љ§ўў§ўњ§§јљјѕјљ§§ўўј§љћљњљљњњћўњћў§њњ§§њ§§њ§њњњљњ§ўў§§љњўћўњњ§§ђњљљњјј§§ўћўњ§ўўў§њњ§њі§ўћћў§ћљ§ўўќ§њћўўћћњљњўўўћўўўћўўљ§ћњњ§§ўўўњў ўћўћ ўєћўў§§ћўўњњћўўћўўћўўјњ§њњћљњўўћўћўћ§ўћўўњћўў§§ўўѓ§ў§§њћ§њ§§њњўўўћў ўћ§ћњћўўћњћўћўўћ§ў§њ§§ўўњўў§ўі§љћўўћўћћўўњћњњўћўўќћўћўўћ§њ§ћўўњћўў§§ўўї§ћјјћњ§њ§§ћўњ§§їћ§§ўћўўњўўўћў ўўћўўћћўў§ўўѕ§љњўў§њњћїјјјњћ§ўў§§ўўљћњ§§ўњўўўћўўћўћњўњћўўќћўћўўћњўћўўћўўћ§ћћљ§§§љћў ўћњљњ§§љњіњљњћ§ћћњ§ћћќњћћ§§ћ§§ћ§§ъћ§ћ§ћ§ћћњљљјљћћўћ§ћ§§ћћњ§ћ§ћўћћћљћ§§ћћїњ§ћ§ћ§§ў§§ўћњњўћ§§љћ§§ўћњћћў§ўўћћ§ћ§ћћ§ў§ђћ§§ўћћњ§њ§ћ§§ћћ§§ў§§ў§ўћўў§ўќћ§ћўўї§ў§ўћ§њ§ўў§ўљ§ў§ћ§ћњњњћјјљњ§§ўњ§ўћ§§ўўћњћ§јћ§§ў§ў§ўўс§ћњћљњћ§§њћћ§ћ§ћ§ўўћ§њїєјњ§ћ§§ўў§§ћљјјіљњњ§ћўћ§ћўў§ѓћ§§ћћњљљњљћљњњ§§ћўўћљўћ§§їў§ўў§ћ§ћњњїћљљјљћ§§ўўњ§ўћ§ћ§§іћўў§ўўћ§њћћѓ§ўўћ§§ћћ§ћ§ћўў§ћњэћњ§§ћњљјјњћћњ§§ћ§њћћ§љњћћ§љњћћњћ§ћћ§їўћ§ћњћ§ћ§§ћњў§ћ§ћ§§єўћ§ћњљјјљњњћћќ§ћ§ћћњ§§ћ§ћћ§їўћћ§§ћ§§ўў§ћ§ћћя§ћ§ћ§ћћњ§ћ§ћњњ§ћ§§јўћћњћћ§ўўћљњ§§ћ§§ўў§§ў§§њћњњћћ§§ћќ§ў§њњќ§ћ§ўўћћњћћ§ћћ§§ћ§§ќћ§ћўўњћ§ћ§§ўў§ћљ§ў§ћ§§ўўљ§ў§ў§§њњ§ўќћ§§ўўњћ§ћ§ћ§§ѓњћћў§ўћ§§њћћ§§ўќ§ў§ўў§эў§ў§ўўћљњњћћў§ў§§њћћўњ§§ўѕ§ћ§§ћњљњњљњњѕљћћ§§ћ§§ћ§ћћў§ўўљ§ћўў§ў§§їњљњљљјјњ§§ћќ§ћ§њњёћњћћљљћњљљњљњљћћћ§ўў§ўў§ќњ§§ўўёћ§ў§ћњњћћњљљњћњњћяњћ§ћћњњјјљњњћћњњћћќ§њњћћќ§ћ§ўўќ§ў§ўўќ§ўћ§§єњљљњњ§њў§§ћ§§њёљњњљњћ§ћњћ§ћў§ўўў§ўўј§ў§§ў§§ўўў§ўў§њћ§ћўћњњћјў§§ћ§§ў§§ў§љћўћ§ћў§§іћ§§ћњћњ§ћўў§§ў§§јћў§ў§ўћ§§ћ§ўћњњ§љњћћїљ§њњ§ў§§ўўўћўўњћ§ћ§ћўўѓћњћ§њ§ћў§ўў§ћћљ§њћћ§ћўўў§ўўќ§ћ§њњїћ§§ўћ§ћ§ўўљ§њћћў§ўўѕ§ћ§ћ§§ў§§ћ§§ўў§§ћ§њў§ћ§ћўўзћ§ћў§§ћћњјљћћў§ў§ў§§ћ§ћ§њћћ§ћ§њ§ћ§ћ§ћ§ћ§ћћў§ўўќ§ўў§§§ћ§ўў§§ћњћћ§њѕљїјњњћњћњћњњї§ћ§ў§ў§§њњєћўћњ§§ћ§ћ§ћўўў§ўўќ§ўћ§§ћўћ§јњў§љљњћњњљћђ§ћ§ћ§ћ§ћ§ћ§ћ§њњ§§ў§ўўі§ўў§§ћ§ћўћћћў§§ћ§§ћёљњњћ§§њћњњ§ћњњћћэ§ћ§§ўћ§ћњњћћњ§ў§§ћ§§ћ§јћ§ћў§§ћ§§ћў§ћћ§§ѓўћњњљљћћўћ§§ўўћћў§ў§§іњћћњњ§ћњћ§§љњ§§ў§ўћћ§ќў§ўћћљ§ћў§њћњњљњњ§ў§§ћћѓњ§§ћћ§§ћљњњћўў§ўћўўў§ўўє§ћўћ§ўў§ў§ў§§ўћ§§ќћ§ћўў§ћњ§њћ§§ўћ§ћ§ћўў§ўљ§ўћўў§ћћї§ў§њњћћ§ўў§њћў§ў§ћћњљћ§ўў§§ўў§њћ§ћ§ћ§§ѕћњў§ћњ§ћњњћћњћј§ћћ§§ћ§ўўќ§ў§ўўє§ў§§ћћїїјњ§ў ў§ўћ§§ѓћ§ћ§ћ§ћњљњљљњњћћњ§§ўўк§ў§ў§ў§ў§ў§ў§§ћ§ћћљљњњ§§ћ§ћћњћћ§ћ§§ў§ћћњ§ћћ§§ўў§§ћў§§ўћ§§ўћ§§ўќ§ўћ§§фў§ћљљњћ§§ўњћ§§ћњ§ћ§њћћ§ћўћ§ћћ§§ў§ўўђћ§ћћ§ў§ўћ§§ў§ўўў§ўўї§ўў§љљњњ§§№ў§ў§ўћўћ§ўњ§ћћ§ћћї§ћ§ћ§ћў§ўўў§ўўќ§ў§ўўќћ§§ўўё§ў§§ћўўћљљњњћў§§ўћ§§ўћ§§§ћњћћћњћ§§ћћў§§ў§§ћє§ў§ћ§ў§ў§ў§ўўћљћў§ўя§њћћ§§ў§§ћ§ћ§ћўћ§§§ћ§ўўў§ўўљћ§ў§ћ§ћћўщ§ћћљјјћћ§ўў§§ћ§ћ§ћћњћћўўјћ§ў§ћ§ћ§§љћњћћњћ§§ўљ§ў§ў§ў§§њў§ћ§ћ§§ћђљїјљњњћћ§§њ§ћ§§ћў§ћћњњњўћ§ў§ўўљ§ћњњћњ§§ћћњ§§ћўўќ§ў§ўўј§ўћљљјљњњўћ§§ѕў§ў§ў§ўўћњћћєў§ўћ§њњћњњ§ћћўў§ўўў§ўўј§ўўњљњњ§§ўћ§§№ў§ўћ§ћў§§ћў§§ћ§ћћљњёћњћћ§§ў§§ћ§§ў§ўўі§ў§ўћў§ћњћћї§ћћ§§ћњ§ћћљ§њћћў§ўўў§ўў§§ћњ§§ёћ§§ў§ўўћ§ћћ§ў§ўўў§ўўш§ўћ§ћ§ћћњњћ§ў§ћўћћ§§ћў§ўўћ§ў§ў§§ўўћў ўў§ўўќћ§ћ§§ў§ўћљљћћў§ћћўўќћўў§§ћњћљћњ§ћћўќ§ћ§ўў§ћўњћћ§ќњћ§љљќњў§ўў§чўћ§ћћ§§ў§ў§ћ§§ћћ§њћњњћў§ў ўњ§ўў§§ўў§іњљћћњњјњћўўў§ўўї§ћўћ§ћ§ћ§§ўќћ§ћ§§ђњћћ§§ў§ўћ§ћўћўў§§ў§§щћњљјјњњћћ§ўў§§ћњћ§§ћ§ћ§§ўћў§ћћљ§ћћњћњћћжњ§§ўћ§ћўћ§ћћ§ў§ўћ§ћ§ћћњњљњћ§ўўћ§§ў§§ћ§ћ§ћўўќ§њћ§§јћ§ћ§ћ§ћњњ§§ћ§§ўя§ў§ў§ў§ўћњјњњ§ћў§§ўњћ§ўў§ўў§§ћ§ћћўў§§ўѕ§ўћўў§§ћ§§ў ўѕ§њњћњњ§§ћћ§§ўћ§ўў§ўў§ћў§ћћўў§ў§ћњћњњћћ§ўћ§ўћ§њњѕћ§ў§ў§ўў§ћ§§ўўћ§§ў§§ћ§§ћѓ§ўў§ў§§њњћњћ§§јћ§§ћўћљњњћ§ћў§ўўў§ўў§љћ§ћ§ўў§§ћќ§ў§ў ўёћ§ћћњњћ§§ўћ§§ўћћњћљ§ћў§ў§ўўњ§ў§ў§ў ўў§ўўщ§ў§ў§§ћ§ўў§ўћ§§ў§ў§ўћ§њњњћ§ћў§ўўў§ўўј§ћћ§ў§ўћћ§ў§§ў§§ўћўўў§ўў§ћ§ўќ§ў§ўўќ§ўў§§ќћ§§ў ўў§ў ўў§ўўќћўў§§ўљ§ў§ћћ§ўўљћ§ћ§§ў§§ћћ§§ћ§§ќћўў§§ўјћ§ћўћў§ўўѕ§ўћћ§ћћ§§ў§§яўћ§ћ§њљњћ§ћњ§§ўў§§§ћ§ўў§§ў§§ћј§ўў§ћ§њћћі§ћћ§§ў§ў§ўўљ§ў§§ћћљљћњћ§ћ§§њћєњћћ§ў§§ћћ§ћўўћьњ§ўў§ў§ў§ў§ћњњљљњ§ћ§§ќћ§ћўўє§ўћћ§§ўў§ў§ўўў§ўўў§ўўљ§ћ§ўў§ўўў§ўўўћљљўў§ў ў§§ў§§їў§§ћ§ћў§ўў§ёћўћў§ў§ћћ§ћ§ћћњњћѓ§ўў§ўћўњћљћћ§§ўі§ў§ћ§§ћ§ћ§§ќћ§ћ§§єћ§ћў§§ћ§ћћ§ўў§єћ§ћ§ћћљњњ§ћўў§ўўћ§§ќћ§ћ§§ўіћњћ§ўў§ћ§ўўў§ў ўў§ўўў§ўўћ§ќћ§§ўўќ§ў§ўўў§ў ўў§ўўћў§ўў§ўўў§ўў§§ў§§јњў§ў§ў§ўўў§ўўќ§ў§ўўћ§ўћ§ўў§ќћ§ў§§ќћ§§ў ўў§ўўў§ўўі§ў§ћњ§ўў§ўўі§ўћўћ§ћ§ћўўў§ўўў§ўў§ђћў§ў§ў§ўћћњў§ўўў§ўў§ўў§ўўў§ўўі§ў§ўћ§ћў§ўўў§ўў§їћў§ў§ўў§њњ№§ћ§ћћ§њћ§§ћ§њ§ћўўў§ўўў§ўўў§ўўц§ў§§ўў§ўў§§ћ§ў§ў§§ў§§ўћ§§њњјљћћўў§ћўўћ§ћ§§ўўў§ўўў§ўўў§ў ўў§ўўў§ўўјћњњћћ§§ў ўў§ўў§ћ§іћў§ў§ўћў§ўўў§ўўю§ў§ў§ў§ў§ў§ў§ў§ў§ўўі§ўћўњ§ћ§ћўўў§ўўњћў§ў§ўўя§ћў§ў§ў§ўћ§ўў§ў§ўўє§ў§ў§ў§ўћўћўўў§ўўќ§ўў§§§ў§ўўћ§ў§ў§§ўќ§ў§ўў§њў§ўћ§ўўў§ўў§ ўў§ўўў§ўў§ўєћ§ћў§§ј§§ў§ў ўѓћўћ§§ў§ў§ў§§ўўћ§ў§§ћћўї§ћў§ў§ў§ўў§јљўљ§§ў§ўўђ§ў§ўњћљ§ћ§ўў§ўўя§ў§ў§ўћўњўњўћўћў§§ўќћўћўўў§ўўѕ§ў§§ћў§ўћ§ћћ§ў§ўўњ§ў§ў§ўўў§ўўј§ўћ§ћў§ўўј§ў§ў§ў§ўўћ§ў§ў§§ўѓћўњћњ§ћ§§ў§ў§§ўќћў§ўў§§ў§§§ў§ўўў§ўўѕ§ў§ў§ў§ў§ў§§їў§ў§ў§ў§ўўѓћ§ћћњўћў§ўћў§§ћ§љў§§ўў§ўўў§ўўќ§ў§ўўћ§ў§ў§§§ў§ўўїћ§§ў§§ћћ§§ћў§ў§ўў§ўћўўіћ§§ў§ў§ў§ўўў§ўўћ§ў§ў§§іў§ў§ўћ§§ў§§ћ§§ў§ўўќћ§§ўўї§ўў§ў§ў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўў§ћќ§ў§ўўў§ўўљ§ў§ў§ў§§ўј§ўћў§ў§ўўњ§ў§ў§ўўњћ§њўћўўј§ў§ў§ў§ўў§§ў§§јўћўћўћўћћўњ§ў§ў§ў ў§ёћўћўњћњ§§ў§ў§ў§§хў§ўћўњ§ћ§ћ§ћў§§ћўћўћћ§ў§ў§ўўў§ўўэ§ў§§ћў§§ћ§њ§§ўњўћў§§юўћўњ§њ§њўћ§ћў§ўћў§§ќћ§§ўўў§ўўћ§ў§§ћћ§ўї§ў§ў§ў§§ћћ§ўћ§§ћў§ў§ў ўў§ў ўў§ўўњ§ўћўћўўќ§ў§ўўў§ўўў§ўў§ўј§ў§§ћ§§ўўќ§ў§ўўў§ўўю§ўћўћў§ў§ўћўћў§ў§ўўќ§ў§ўўћ§ў§§ўў§§ў§§ўі§ў§§ћў§ў§ўўќ§ў§ўў§ ўќ§ў§ўўі§ў§ў§ў§ў§ўўј§ў§ў§ў§ўўў§ўўј§ўћўњ§§ўўљ§ў§ў§§ўў§ѓў§ў§ў§ў§ўћў§ўўњ§ў§ў§ўўќ§ўў§§ў§юћ§њћћ§ћ§ћ§ћўћ§§ў§ўў§§ў§§ўј§ў§ў§ў§ў ўќ§ў§ўўё§ў§ў§ў§ўњўћ§§ўћћљ§ћ§§ў§ўўї§ў§ў§ў§ў§§ўў§ўўў§ўўј§ў§ў§ў§ўўљ§ўњў§ў§§їўћўћўћ§ћўўў§ўў§ћўћў§ўўњ§ў§ў§ўўю§ў§ў§ў§ў§ў§ў§ў§ў§ўў§ћўњ§ћўўў§ўўљ§ў§ў§ў§§§ў§ўўј§ў§ў§ў§ўўќ§ў§ўўі§ў§§ћ§њ§ћўўў§ўўќ§ўћ§§ўћўў§ў ўў§ўўў§ўўћ§ў§ў§§§ў§ўў§ўћ§ў§§ўўў§ўў§§ў§§љў§ўћў§ўўў§ўўј§ўћўћ§§ўўў§ўўя§ў§ў§ў§ў§ў§ўћ§ўў§§ѓў§§ћ§§ўћўћ§§ўўќ§ў§ў ў§њћњњћћў ўѕ§ў§ў§ў§ў§ў§§јўћ§њћћў§§ўъ§ў§ў§§љћ§ў§ў§§ћўћў§ў§ўўі§ўћў§ў§ў§ўўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўў§ќњћћўў§ѕўћў§ў§§ћў§ўў§ ўў§ўўі§ћњў§ў§ў§ўўќ§ў§ўўі§ў§ў§ў§ў§ўўў§ўўў§ўў§ќњў§ўўќ§ў§ўўњ§ўћўћ§§ ўј§ўћ§њў§ўўў§ўўћ§ў§ў§§ўї§ў§ў§ў§§ўўќ§ў§ўўі§ў§њћ§ћў§ўўі§ў§ў§ў§ў§ўўј§ў§ў§ў§ўўј§ўћ§§ў§ўўў§ўўѕћ§њћњў§ў§ў§§§ў§ўўў§ўўў§ўўў§ўўі§ў§ўћ§§ў§ўўњ§ў§ў§ў ўєћ§љ§ћўћў§ў§ў ўќ§ў§ўў§§ў§§ќўћ§ўў§јћ§§ў§ў§ўўў§ўўў§ўўў§ўўѕ§ў§§ћўћ§§ў§§ўќ§ў§ў ўђћўћўћў§ў§§ћ§§ўў§ ўј§ў§ў§ў§ўўќ§ў§ўў§ќћў§ў ўљ§ў§ўћў§§їў§ў§ўћў§ў%ўў§ўўў§ўў§ќњўћў ўі§ў§ўћ§ћў§ўўќ§ў§ўўќ§ў§ўўњ§ў§ўћ§§ѓў§ў§§ўўћ§ћ§§ўўў§ўў§їў§ў§ў§ў§ўўњ§ў§ћ§ўўў§ўўї§ћў§§ћ§ћў ўў§ўў§ћў§ў§ўўћ§ў§ў§§§ў§ўўќ§ў§ў ўі§ў§ўњћњћ§ўўі§ў§ў§ў§ў§ўўў§ўўў§ўў§§ў§§ўћ§§ўќћ§§ўўў§ўўі§ўў§ћ§њў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўіћўћў§ў§ў§ўў§ќћ§§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўўў§ўўў§ў ўј§ўћў§ў§ўўў§ўўў§ўўў§ў ўќ§ў§ўўљ§ў§ўћў§§ўў§ўў§§ўћўўњ§ў§ў§ўўў§ўўќ§ў§ўў§ў§їў§ў§ўћ§§ўўњћўћў§ў ўў§ўўќ§ў§ўў§ўњћў§ў§ўўќ§ў§ўўјћў§§ўў§ў%ўў§ўўў§ўўј§ўћћ§ў§ўўў§ўўќ§ў§ўўј§ў§ў§ў§ўўњ§ўћ§§ў ўў§ў!ўќ§ў§ўўќћ§§ўўў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўў§ўў§јћ§ћўћ§§ўўњ§ў§ў§ўўќ§ў§ўўњ§ў§ўћўў§ў§єўћ§ћ§§ў§ў§ў§§ўў§§ўћўўў§ўўў§ўўќћў§ўўђћ§ћ§§ў§ў§ў§ў§ўўў§ўўќ§ў§ў ў§ўњўўќ§ў§ўўќ§ў§ў ўќ§ў§ўўє§ў§ўћўњћћў§ўўќ§ў§ўўў§ў ўі§ў§ў§ў§ў§ўўќ§ў§ўўћ§ў§ў§§ћўћћ§ўўў§ўўј§ў§ў§ў§ўў§ ўў§ўўњћў§ў§ў7ўћ§ўў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўўќ§ў§ў ўў§ўўў§ў%ўў§ў ўў§ўў§ќћў§ўў§ћћў§ў§§$ўќ§ў§ўўј§ўћўћўћўўў§ўўќ§ў§ў-ўћ§ў§ў§§ўњ§ў§ў§ўљ€Оњў§ћ~1FIA:9>Q1:CILLWvтшкнйбЭФЦШШОЪЦЮЭмйОНЧЩЦжзЮЭдкзмрцтмтшњљїјѕћїt#4?A33((,#(.44.4mрьшдЦЛМЦкЫИВЕЖШдЭЩЦФМЩЧкпрабдЪФдпжЮлцћјјљњћћœ,&8?;<8)32(3JY1&+aзѓкжЪРЪержжйЪШЦТееЯЦРЧЩЩЧЩзбнйКЉИИЕЪгљћћњјћљЛB>4>;871(177,>LSVN‰ьцлсунсрнббтжЭУлчркйдйЩМжймункгаЮлммбњљјњј§ћЗ8OF@>-8."+)2-G\LZ@—јљшхьђэцпххтдУЫлуыцукаЭЩймнсежНФУРекнјћ§§љ§ћЖH*^["+7152B>;5EO7›їїккрттнжчлЯаУШЪххшыьстзлтнлйкРФЪЫбЩРїї€Пѕє§§Р9;twG*&.1>AF<@2)2*эьлЪбкпйншмазШЭкгРЫухцнжЭЧЫжлегжУОЩеЦљѕѕєєљљН51257?9154;9@A>4;;8;?:99Q‚ј§їїђђѕѓээыююыштхржгЫгйккймжШЪТЩЯзгЫйјјљћљћ§ь[SaEACA?@AA;A>8+GIwјћѕїїєјєїђэьэьшмхцеббжрщцхцурЭОЕОжлпнљјљћјћ§м1,A>2CMJ<90>?GF@MNЧ§ѕѓѓїєёюїїѕёэюээюшццчммпймрчпЯЮбжмшхћћљљњ§ћхF02><:FOC;4?ELJFC>‚љћђєєѕёёюёёфющущьђщэчрмтхпзЯлхшзгенупњ§ћћц§ћдF0EB0;B99+8:B3>A9‚љћјѓѓођєяюящэыщёэщэёшргбйнебкчшцгбЫдд§ћљљП§ћг,#<>?>:8<88-;C7&*U^ђ§§ѕѕєюёёюёччщшушнщьэщуршхтчьцрмезбесјљљњљћћ†U&?<@9<9?B>:;><9YY]ёљјїєюэшуутммыхлртлшчёььцэыштедзййжлчњ§љњ§ўјыc:JE2&.9;<754@CJS?OЪ§§їѕёщшчьєђяэтхчюяяымпждзймйккЧЭЪЪзућљљТћ§ћЩJ>EB@4:?A?;3(5:AOGHЧљњєєёьцсччттххЯмднмЯШЭмедкнхюырЦИТЭлјљљƒїћ§Ї+5$>09A9:;79MMdбјїхуутспдлущшмккзуййЮФФкмнпжмййШЦЧЩНљљјУћўѓM-2.>;90-;9<@8.1VMIЯћ§єюурнжншцшшскйндШжтскЭбЮЩЪКБОЭШаЯЦїјјСљўў§{LVQ>?>4(!$:AGHQe4HлљћцумлнмнкйзддлтЯбаушцулгбкЯЕВЪЮШЫадјћњњїљћј`47:3--Э1$-CLPF9JWaйћћэшщщнШпьцхкжЭдЯглрежЫдгедЯШИЫмзЯбЯ§ћњњћ§ˆ599110<:ALVdbEG}Š[Ф§§єяэчшутцучщхтщёюьшукгаегпмЪЦЛбжзбй§њљњ§јўјЕ>BaHEAA5+1FSdƒŸV0œћљёяђїѕђёяюѓјщснцнСЧйЩйжкмзжЫЧЧšШТФЦњћљјјї§§•03JFGF@0238>7,O??YЊћ§ѕѓѓјїїјѕђюєєѓюхтыцпйбЫЭдгЫдЧЩгдЩОЯћћљћјњўћЦFE`LJJNHF;GB@GOSaY[FGgдљ§§ћєєчхцржлулуыэщшчєѓяэѕѓэшюёѓёыслжљјј§шѓT,3ECIIBEHAALZ]bnNwтј§љљ€Ÿїюхучурйжтрруыѕїѕѕёяуешяђђёьюэћљћљњў§г5F1>>9:HBFEI[TLNYFTг§§јњјњѓщстэшусуцнмушюэюььчыхпцьуЯЫпюљљћљї§§ДJ;-;9?>HB;0GQLJZeOUбљћїјљђэцЯшђюцщюхкнтхщюччхюђщцхтучтщэљљј€ў§ћZI4B[\BBA?JLIPLYUTcюљѕѕїѕюэььяѓёђѓєцтхщэыёѓючёяытзнпчщщэўћўћњ§љbVMB{ƒ@7CCGAEHQNCF^[а§єєѓѓщцщсмзрэєюэсйдгбйЯбхюђьыпклутчтњњљњљ§§„.\Ќ|+.7F?BEJILHJMжјѕьѓєѓэццурщэшцырбЮдккгФЧжймзлЯжЯзсжјјњѕѕ§§—.#~ДtAG4>@BJMYOOGAQжєљёяяюяюшшмчшущёюяђёьплтлгйеСНТШкчнкњћљљ§Т{G3Tj-$*19A99HJ;e^ˆєљњёыюяюьцчкйгдбЫмчррчунычржЮУЯжйппмм§ћјї§§Іr;@C?93287FIS4CŽёјљїяшш€сучюшлншющрлккпчщцучхсхрслззчяјјїјї§ћŸPJG7+47++.380B;TYUnмёчшщээяюхщсЮдмсмШднмЫмтЪдпсмбжмцуйпцћљћљ§ћћ~@$#*174082801@>?edOзѓхжтшчыѕёяэжлхгЧРбйаЭЪлхйгбппздййдбд§њјљјћљZ0.-;114;C3:<5CI&)4PёєуутчтртхчщщраенЯЭЧРТЧгмеЧИЫгШржйзгзњ§њ§§€ћљ{)0!<9.;;F:1+0A::%8СяпкхкгзнлммщчшпрхлнаЭУйрйгбЪйузстмйнљњ§љњ§ћ[3CNrP>8@C>:8B;577?AEBEc•єёустнмглжкемцхшчхунтсстснйкмжалшючяьћўњљј§љ3*?<<;:@:<>258;-58*2CŽугадаЫзсунржЦжЪЯбЫМСдмкЯЪпухйЭОШдкспб§§њњљљјp:7L;>9*3OНєїстспсжзбЮЮдлЧКЖТЕИдцщсдаУНЗЄЏБЛЧЧЯЫ§њљћўў§t::AHAC85BFF:,9;C?MЮєїёхчьшэёюхцргЪТгсудЯнргШТЫЮЛБНИЛЦЪЮЧљљ§‚ыO;&*9B>87Ji^QTrЏЩНКОФжУФЪЭглхсррнйЯУеккнлймзчьтШИОМЛМўћўњўћы\d``E9@9B>>BHVU]TVЪзлагзЪФАИЖУуцдлдУЗЖЩбуьшсЯНФкцщкЭЪТИЕћњ§њ§љЛ7AOAMEE>7@:?>?C9JVœыЧЪШЭОЯЯРСЛЯдспгбКЋЊВМбЮдЦЖКОаСЪйзТМЩЩњљљћХjGJHZYNB8EEJJITE8GВящзйухццелсслжгЧТФФИЭмусджЧЩЭЯЯЦШаЩТФЫўўТњ§ћ˜CZW[SNEIBNkY\TW`7^сєщкзккйпчтнзсжЯЧУЩЩНТЛЛРбдЮФМЦдбгбдкдШћћ€Ёўћјc23.EGA??F%3ZGEOQ2{єјљюцнтьытгШааЦСКМЯйЭЭЫбйчяцнЮкжжЯнеЩШЮўћ§ўўћc$;LJIA>EG<:A@19*oпрупдЯаЭбдучслдейжзгТРаЫагаЩФЭстщстжЛЮаўўњўўћ`-BNTLNLMMIHJML[VA;CEBZ;@HOPO^ˆўўѕєѓѓэяюящышёяѓёюєѓёяєѓѓєђђяѓєјїїјј€ь§ћћњњўў{"">FIJ@<998,2AG9-:tћўћђяьэёяђёьрущэяяыьёэѓёѓёєєёёяьэььяюњћњћљўўŸ.(@HEB95318:A^E88pєўђђёяёѓяѓяыччьђёђяёяёюяђѕёїѓёяёшщэюяћњћљњўўТG82BGB?442388GWYYU•ўўїѕєїѕєђѓѕђѓђєђѓїїђѓэяѓюєєђєёюэяяђђѓ§ћњљњўўИ7NAF;4JP<ЁўўєђђёѓѕјђѓѓьяэїяѓѓѕѕјѓѓёёѓѓєюяюыыщяёћљљјїўўТ45pxL07257AAC;B43+‰ўўёїёђѓїѕєєяэѓђюяєєђєєѕєђёяяёё˜юѓѓђэьћљјјљўўТ81:B8>Z…ўўљљ№њћљљјљљїѕѓєђёєѓѕѕрїєђѓюэыёѓѓїюњњћњћўўђ`QhHFEHG?@C@@ѓG5EO}ўўљћњћњћћТњјїїјѕєѕѓѓєєѓєѕєєёёэьэюѓѕѕћњћњњўўу.-B>BHLFBFHPCPTўўљњњљјјљљњУјѕїјјїєєѓєѕѓєєѕђѓѓёюђєѓєњњћћљўўыE+7@@FIGA7<@HPPCLB‹ўўѕїїјљјљјјыљњњјїѕљјїјїїѕєѓѕѓѕєѕёёђт§ћњњћўўжH#EFFA;98>4;;GB@>ўўњњіљјњљїњјљљјјьљјјїїѕѕєѕѕїёёыяёє§њћћўфз,(;C@B?>@A9[^Yїўћљјјїїјјїјјєѕјѕїћљ§јњїњјљљѕїєѓѕєђєђ§ћћ§§ўўђg5N>959@@:5.@BNLPЯў§їјјїїѕїљѕєљѓјєѓѓяђёѓђђєєѕѓёющыѓё§ћћўчЏ+1+9@?BE>99?E?FVMN^уўўїѕѕЁјїєѕїјћѕјїїѕђєёђѓёјєѕїѕїѓяьяюэњћ§ўћўўШ8!4:<8;:38;<<7BBPSmнўўњљјѕїєњїјјїљјїјєѕѓєѓѕђєєѓєёёюѓёяяюћћњўХљH(-0<<;4-->B:957`PLлўўљјјѕѕїѕєєѓєєјљѕѕїєѓєѕїђѓѓююёяюђёђєћњњўћўўпzIUWA>>8&-0@FHNUa9Pхўўњїјїєђѓїїєѕѕшђїђѕѓїѕєѓєєђёѓёяёѓђёё§њ§§Тћўўh;8B;25:.34?MNG;Nbiхўўјїєєѕћїѕїѕїєјѕјјїѕљѓѕяёёђђэяюяѕєђѓ§њ§§оњўўŠ+4A<7<>@AJ^hbPOŠ‘[Щўўљљїјїїјїјј§љїѕѕѓєюѓєђєѓёяыёюѓѓєё§§ћ§§ўаЛ??;AACIdMS\Z@YзўўњљњљјѕѕјјјїјѕљљњљјјђїјїѕєјѕїјњњїјћћўЦМO7&ACBIGCAFCJHNWdS[дўўћњјљјєўїљљћњјњћјњћњљћјћљљњїѕїїјњјјћћ§ўуŒ`H3CcZC>@HJMNJQSUWgѓў§јљјљљїїјчљњљћњљјїљјјљўњњљљјѕїјњњјўўм§ўўkVQC|‰G88>BIJOUQOGccеўўљњњўћјљјљјј­њљљѕѕєїђѕѕѓјљњљњјїєѕѕј§§ў§ћўўŠ1cН”3-<@@HIOSPSMQTрўў§њћњћў§ћћњљљњњћњњљїѕѓѕѕѓїєѕђјѓјјољњњљљњўў0#‚Б~@C9:?EFTT[SJFVьўў§њљљѕїњѕїљјјљњљњњяїѓїјєђѕѓѓїїѕљњ§њћћўы…H3Yq3*17><;GPP;iiŽўўњљ†јїњјњѕїѕѓѕјїѕѓѕјћѕјјїѕјђєїєѓѕї§њ§ў§ўў{;2;ABB:23293>EH,07pэўўњњћљњњјјїјљљѕєѕїљјљћњћ§њљјјѓєїєјјњ§њ§њћўў{:(?FFE<::87;@NQ4Eœўўяљјљїїјјѕїјљљјєёѓѕѕєјˆљїѕјѕїјћњљ§њћњћўўЅMF@?;450389:9:AA*?цўєїѓїјѕѓѓєјєјїњњљћљљїћїѕїїѕљѕєњїљљїѕў§§ўўч`4:VvNF<><9@B>889CC?>?02H™ўўјїѕїѕєјњѕєћѓѕёяюёђєјјљњїјѕєёєѓђєєїѓ§ћ§§ўўщu53M;AFA>99CF<9:1;UЪўўљљнњїћњћїјјђѓѓѕђѓѓђїљїїѓїєэёьёёђєєї§§ўўЦu94F;@?<5:LJ97\NMB?A;514"1Y}eJHNхўјѕѓђѓєђѓјђїљљїњјљјјєїјѕїїѕїѕєїѓђѓѓѕђўўТћўўСFhIQJ@@B?BBAFOujbd„пњђєѕѕђѕђяѓѕјѕјїєєёђљѕњњљљїѓјїњїїєђѓђёўўС§ўўя]^]gL?;A@?>AL]YgZ]”љўўђђёєяђюѓѕєїћїѕѓѓђэѓјїїђёѓѕѕїєјїђёђђў§§ўФН8;SFLIA>;:FEJQOFUcБў§єѓђїѓѓєђљєњїјїяѓёяђјјћєѓєђєёљєєѕїѕђђ§ћћўаeIIVY^UJ@>JSYVNFELЩўўѕѕєѕїєљјљїјєєѕѕѓђєюёєѕјђєђђлѓѕѕёєєѕёў§ў§ўўœE^^[[TMCEOqc[\`e,:^MIPZ3„ўўијїљїѕѕїѕїѓђєђѓѓёяђђєєѕѕїњѕљѕљїњѕѕјјљўў§ўўъd%AIJOI?AG?AGIG>8-|ўўїїљјѕљїљјљљїцјєѕїјѓљјјїїјјѕњјљїєљёђўў§ўўе]-CTUOOJOSMOPWWddFƒўўїјѕљњњјћљјјњљљјђѕѓјљјћћёїѕєѓєєѕњјїѕѕєў§§ўЦG2YЎўўѓђїѓхгпп€нрщђїѓїёѓяяшуыймщыцкцтщхкхяўў§§ћўўŒLw]NQQVNUUaTScbkemњћююђшхгсзмдпртпюьрпннрюютцшэюёђѕёѓѕњ§§ћћњўў‹25ZV[ZPHMBBLQOaTEO„єўўцмбенэрЪЮЭжпхцнпдзммыёяяыьппцящтэѓ§ўћ§ћўўЖ;:3TSaZMHCFIHaqUB?vяўьэмбсчђчхтжгкрщэчннлтнспцыѓяйФЭЦЩнэ§§ћћў€ЇгYMMUWVOJEHBJGQdkceЂўўђѓёьёђэцчэёкпыёяычсчнешяѓяюычсхэђяцў§ћўћўўЫLbZQPSILLG@JL[pjvWАўўњїїѕјђѓяѕячжлыѓѕєэёщсрыёєѓщщрлцйшыєћ§§ў§ўўЮW–ўўёнпюёэєђѓшэхцшсйхђїєєьчйсчёшчшскцьзћ§љћљўўбBAJMSYSPQYM]V‡zpNŒўўЙѓёыђюђѓѓьчшюяьыььчцёьрпркьчщяєяёнЫ§§ћў§ўўЮ@Lagc^TOPGLI9e„tWZwхўўњћѕјєєѕѕфѓщтлчсждлрэьяёщшэяѓюѓыьту§ўћћўь~W^hdeTLSLIJJN\bSeЌўў›ћўљњїѕєєљњѕѓшьщтнцщэтьыцтжкпшьђцэё§§ћўћўўцL@LYb]]YPZQNYSTOPkžўў§њўћ§њљїћљ§љљїѓяыччэёюёюёытнкнцюэцьћў§§ўжriaY[YWTWN[Wb^I`bўў§ћўћўћћњћњћјїяєєэшшыђђвїѓяржбйшэяђ§ў§§ћўўє:CYW]Za^WULZ]^gZiiœўў§њ§њћњњТћљјјћљєђєёюэёьюѕѕёчрщэёєї§ў§§ћўўєZ:H^ba`^MOMVacha`Q–ўўљјњћўњ§њњЬљ§ѕјљћљљєѕєєђюсэђђэчшђяѓ§ў§§ћўўсW(:a\^YWUMJVQW\UWM•ўў§ўњћћуњљљћљћјћѕљјјђэьэђђыёѓљђхрпюю§§ўыч<:[[V`]]TYOWSVSEBhtўўињћљ§њ§љјѓѕјћјєєјєћѕѕєїїєєїєђэшсучё§ўћў§ўўьg8NVSWQYTYJTSZ^Sjjoўўињћљјєѕѕєёёђєѓѓђѓј§ј§јјљљјїьёюёэыщѓ§ў§ў§ўўЧ‚NdWPOQZSWIYPVbdpUgуўўњ§јњјћјњїљјјёѕѕљљѕёёюьяёююёюжчщмщє§§мў§ўўцbOaVVUPZ^STSZQWVe^aжўўјћјјѕїјјєєОљэщьыэчхчьыщююїѕјятЯнсё§ў§§ћўўС;LETQQVTVTWVVYangdrїўўњљѕєщяяїѓѕѕїєєэђьуйньцчэђёюэьхтья§§Тў§ўўкI4HUSVNQIJJOTVQ]khыўўјљѓїэђыяѕјєљяєяѓёђхмрюёэюыьэьхртнд§§§ўњўўТ^>CFQPHFIIMaYOAI|i[ьўўљљѓѕєюяђїїђѕюѓяыхыђѕюыьчртеЭесцэытћўћў§ўў‡djoZSL@>7ZihjZ`^ec`cnhmpS‘ўўёяїђьђїјѕёёєљїђххэяьюяђђюцскмюѕюэьшрх§ў§ўўи•VFS\]Z[Wkie]itwŠS–ўўїёєшьэђђцпэђјєѓђуыяяёёєјѓяђщпыычэюэёё:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ›ркЯЪЯдйЯзадТžкђчрйжмкзЫлпдУЪТИНЪЧЛТЛЫЮйрузлмнспЮШТббЮаЩбалЮЄnTOpынмрсуххжМСЏžАдкЕ™ЂЇБЪЩЭттнюуЛЕлзЩВНОО€WРЭЫФКЦаркекмжЮекЭдьСpzd;.лЧАЕВНРзЯЎВЌЋДТуЊƒ‡ƒt—ОйЖТЖ›‘ЁЄŽЛеЧЛОЩЦИЖЧЮллжкзбжбаФрлb8"0ЭТЕАЗОбкгФДВЃ‘ŒЕФРЏ™ŠЅЖЊ›ŸЂ•Œ•‹’ƒЅЏВЛУЪМДЛЩеебйЮСЏЏКИагЋJ УСТЫШЮТМТУРДЦТФыєјѕаКЌлаНУМЮВВЊ—–•˜ЂЄЄЃЗЪРВНЯнмЯЪШСШлж|(2!!нрртзгкййддслЩМамнплеРИЌЎМЧЩАЈžЏВВ•‘йУБЉЃБЯШЪЖАУЮааЮгжщєА1ЯжленуцзддегЯКНдтстбНСЗИЈŸЂБННЄŸЈ‘h”РмКˆ…ДЎЌЛ™žŸВСЯжгЪКЃ0  ЗЖТЄЛШЫТКВЗЗЦНДНЪадазЮАРЛЈЂЈЁ™’Ё”|Ѓ”‘…ЊЕЧЮТТЩТЮдзЦцю‘  ЋЕЈЋАНКНУОМЗТЩЗЛЧбтщуйЦДИЏИУРАВЁЄЅМааЈ›”™АхлзпЦˆžœЁШЌЊh4НКДЉВЫШЖЩЦОАДБŸЅЭдтмбШРБТЛЎДВИДЂЄЎЗЦКАЋЋЦФЏЇЖКЦЃž•‡Є‘L  лжбШШбрразйеЦФЎ›™жкЯУРОШШКЄЃЖЛИЛЏЊВЗЕОРКД‰jƒ’ЏЇА––ВНi&+ ЯнмклдзкбееЩИДЏЃЉЊНУЪЧФУЭККМЧЫЫдзеЩаЧНБЇ—Ž›бмѓэУЁŽЅЩcпнзеркмлжпЯФЩЯНИЖИСЭИЖБЕЫНЛСЩФЦЫМЕБЎЗА—ЅФЦЎЂБШтнУЄ’‚РдN пдШЭгкдзеЮбгдкдЦФджЫЧАОгкдРЛЯаЫФИТЩЭФЛЦЮЯЖЖФД’‡–ЉООЧёе5  кпсуйнуйдллебснЯгжжЮЦЪдзздЦФРОУКББЧжСМЦМВЎЖМФЗЖИŸаЧдлŸNE& рслсчээыннмнепкзкдкпчуцшукЯЫЩЭазйЪЪЧШКУСЛЛМШСЛЦЫСШгщчзЫS  згбзцрчыцчыыхчшлгЦетыёэчщржбнЯСЫЫшСЕЕОМЧФААЈДНаШЯУИНМбц‡ €иупзЫйЯдпуусхыяэшнккхэђёётсбарйЦФЪжгФФШМЮжСЎЌЇВРЩзУКРЦсюыk схлЭЮСЫймднхцыюьчщхьэюыытцрттрбЮжгзеЮЮНМЫЩагНИАБСЫаТЩЯыьЎ4% зннееЛЦдЯЮблрцысыьяєєяцхухпхссмклпщчееТНЫеЫадРСЦКМанМ••ОЉM@Z;" ЦФадбсйлйШУЫдждЩтушђѓѓ€ћшццттщытурушщхйеЭЭЧЯргИНЯйЭзгЎ……ЏСj##ДЕЌИФжббджррзРЊОЫсщцыььђѓяьцсттщчрцщшппбЯкухтлммппйкЎЈЧнтxE%8НФРСЩлШФРЯмнЩРУЦТЦбЯжмтсщэьыьюэыьчспрчэьчсрмпнцсчутмрзцјї‹?ЮНАРЦЮОЧИЛРЩЮЯЫСОЧТРНалрхрхуцыюѓђшцмхцщшьччцрзнжжгйнззсљёЊB1*ЭЛБСЮддЭЖВВКЦМЦЮЭШЦЖЛЯлйнпнпщьыэђђёєэщшцсуёчхтцхндрнсйрєю‡G?5(,дЩЛЩбйгплеагЮТауслШНКТжеЯЮбйжрккчыээѓяёюыхрпцчтшунзммлнѓэ~A-3сургЪЩЖВООЧЭИЉВЛВЊЋЎЖжтмЯЩСЛЛМБАЕКСЛЭаЮЫббпрчщьђюётнсллйц0;95-ЮгммнпмеЮЋДКЭКЛЦЩОБЋЉШтчгЭбЧКНЩЯЧУЩЧСТЕАЕббжхрпнщьшхушуЦЪ•-8&59*лбЭдйлхрслЭЯбЭФЩбЯШСОашэчнгмйЪЩУРВВБЇЅЈБТййкЯеджхлжппттїюЖ83,0)1хэшплгЯЮРШбмзрсццмЮССТдлдбЦМЭаЛ›œЇЂЌРФЕМЫШЭЫааТЩЯЦУЮШЪШмшЫe[< юяэхбЩггШСЮгФНайёєшЧЧРКСТМЎЎРЭЩТФСОДДИЭЩЯЪДМИЄžАСБЗТРашєјpAO0&щпумпннлйЫкзЮгДE8гѓслЭЮеЭЧЕЛФЮИСЦШЧТЮЧЫМЪЖЄЊ™•ЃЊЊИМЛбєєлvC8 "эшыцрлкдггумтьєч›зјцлЯжпнмаддЮЫЧЮтмйЧЖЖМЦМИЛИЊŸ˜ЇЁАЦЫелеН^;C+3:снкмезз†рнзЪпьѕѓсттужЫрщучржЦСРФлццмгЩЕœ˜Ž•ЉСКЛРИЈŸЏДЦЮгдеŠ`M(37зпшшмхыяѓёыщухыыьящтнйтьулкйЩЧМТджзжйЭмЛЉ•™ДСУРШБЋЉДЁ›ДЌЉЏƒ#$J2,сшш€’ыхчщщшчьшшщяёђђїђыэђщзнсснЯЧСНншхнщжзЯВейнкеŸžЁ‘—ЄЈЇФ‰.232.мгШШкнсурлсчэююшьэёёѓђђєђсзймхкгакпыщлаЯбдгсхгИЈœЁЄž›ЖЛЄйаF"<1ытйсэёьэухмлтрхьуцщьюѓѓќєяяьь€зседЯемдгЦСбпшщщшхтЪЯгЯŸ”ŸЮСOьёѓяычбйхрЭбмаШгклнзцюѓяэюыьээчзлмкжЯЯЭФгдкжеЧУЭЪеФ™ЁЌСЦьбT2B%пжзцьсмдгсушсжбЮйзспчщщяьшччцяышуыхкддрыурчщмЧЯЭЪЮлаМДНТзюЮ`"хжШмбйаЪкщццжрсхрчщхпктхуцщччшщюяшчццуэюяышсдСЦЪусеВЛЛщМБЌАh1(+птшыцчрЪЩгззЧкк€ йгаЯЫЫкхээыткнчшчртусщузмсжлрцтуююцжгдззйЩО”4A*хупнхцпеаЯгЮЧЮрпкзЭЫглнгжмртышчхцтмцухшмлйгбШкышмпмбезкгсэш! ЭСРЧШЩЧММЩЮднсхудЫЫамрзЩУЭгдйеЮймплнуыьупебгЦУпьысзабмцуьјєТ7$CеЭЦУЫСТЪТНЪШглрнпйзнуудЦФЯЯЪдзЯбздклтррнрйкмЭЯлсэшлЫЪймчррљєЌF1ШажШШЦСлсшющпезаЮазтьчгЯбЪЪ€ еццрцсдпнлттрйжййЮгнцуФМДИММННЮдA;0ЗЧЮкктмчхлппеУСШЭТНЭххнУЦТгкйнпдбЫадЭкмлмлелЮЯЩТЛМТСеЮЏЖЏКАР‚!#жсшыужессзЮЫНЎДОЦККРксхтмгззмллЭСНЖЉЊЗОЫЯдЯеЫЦЩЯЧЯейтткЧВЦРА;1ОеЯЧЩЪезпмбНЗВЕЌЋЏЋЕбрчхмЭбгмелЭФРЖЌЛЮбЩОгЮЯШРИОЭзжОЩЭдЭЦУЦнЭCУЪРДИСЧЮРУЛОЖТШНЉАЂЖгрнгЭЭескЫОНУЭжЦФШЮЫЮЮ€гЭЪбгРКНЗЫЮЦШаНЭычo+кШЦВЗЮеджджзнеЯИЖЖОЫгЮЧЭЭгслЪМБМлчшнпеабейпзЯнрчнбЭЩппмЮЕОЮїї™$(бОЕСбйжщйззннмжЩЧЭЩбгТМОНШШЩНБАЗНЯрдмкЭаЭЯбдд€iетмФШДНжутгТНешШ2&ЛМЋЏКЯмптыыюьёьхйждрзЫМЌАБМЯЮНЗЛИКЪУОУедТЩРЛОЕЪеаЪКМТЯнлзЭзцьЫIЛНТЦДМЛСШЯбйцьюёящюютмЯЛДВЗЦЮЩЪУОТКОЕДМеЯЫРЖЉЅЖДВЫблнускбдлатнc#РЯЧбЮаЫШЪЮЪасункцщшхзпжзеЩРЧРЫЩаЩдаФЪежлзЯйндЛДФРлсггдгаесчхль›9РОСЭрйзреЗОСгОЛЪбжсчтщяєђэтепнхяэммШОТаеЯЮнйбЗБИФЮдбтцЪФпяхцяяз+дземрюяхлЩЪаШжнужлсухрптссцьёђїѓяхнЯНАЌЕЧЪжйдУДЪШТРКМЖwЅЌРЭнюгQжЭЪйтьюѕяхйЧЦСЫезлншюёюю€чмасщычщяьпЮаЫШЪпыэусмЮЪЪФФЗЁЇЁЉЎЗНМСёю•ЯРдШООкстцхрлркклнмьюхщьэынеЯамхпжбЪлмчуыђштупСМЌЉЌЈЉЄДФЛОЩЗЏзш–кзнЯОЖНЫЧЛЧФлуптшжннерсллмжзмпцчпкжегбгЯЪппуушпжУЛНКВОЧНЉЃЅДЊВуаклтхбМЉОгезЮмсжщцхрЯЫШзумЮЫддаршццтчхпцучэёђєютсрйЭЪТажкЫЧЧЯУМаЯћєђѓѓєє№їѓђыцжы§яёёђяђяѓѓЉёѓээяэьёщрчшюёяяѓёђѓђёёэюыэщщэщшђчЛ…\UѕѕѓяёђѓѓюьсптмёїлЦЮжрѓѓюэёёўћсзђычшцшчщьыюэёёѓёђђˆёяьшюљўЯ}p@:юььцышђэьэссрптњкТФУЖЮжгхёхшсЪЧаЯЪцћшыэыыщыыёяёєяюэьюэѓ§ѓЅh<370)ёыышчыыщыышуспТмыщцзУнчррклзЫСЭаЯЩлсучщцчцььмяѓёёээыхчєјЛQ""ђёёяђюёёэщщьѓяђјўўёѕыуўцьшыїщьлпйзз мрнптушьшхшэёѓђяюэўј”*,$єєїѓѕїђђёђєёюьяюяєѓёэющхррххшрпзмаеа§хсйкхчьснппхшьёюђўўН8 ыюяђђ›ёяыыььхццшэёээюццсрйклмйммйжВЮш§чЧТпнчсцнхыюяьшшюН4 цхсжрьщьшчшьшшщччщяєяырыхсмрппннзаСбмрйгЦрьь€—эштшцшєюўўЇхпслсшэчшыыьыцщцьюёђђёыхтчтхчцмнмуѓћњчнлмч§ыэєтРбЭаьнТn>  юышчщыюђьюээцрпрщђїяэьшыцххрцутсннуушцухёшлгсшяйзеУуУa!   ѓђяююсёюєёяэыыккЯѓшюяюяэьшчцчщщчшчуцшшЙчнЦЮЌНЯххчйеѓю0+# єёђђяђѓђѓђяююшцсжлшюыьыэыэщьэьяюэщэшышсрсзкаїўў­јнШнчu&! ѓђѓђёѕѓёђюєђэыьхрхщшэчшэшэщчшюющчтсуттщщчухгрыѓютжОЛяшO%&ѓђѓѓјєїѓёђяюяяюБыэюшююэёяюэчщшхчцыщцччщуххрлШБНЯнпыўт5 ѕєѕђїѕєѕѕѓёёѓёѓєёюяюђяђђѓёяэюэыщщДшщюьыычхчэцсмлЮшщїѓАVM+   єєїєѕєєѓѕђѕѓїєєѓюяююёєєѓєђёэяэююэюшшцшучшуррцччцьщы§§ѓгS   ѕѓѕѓёѕђѓїѕѕ…љїєёэяэёєєїїѓєёђюяющяяьыьщыычтлпущщђэюэшрѓѕ ѓђѓѕюѓђѓєѓїєєѓєёяюђѓєѕјєѕёѓѓюэьщььюяющьыщььчцсрчшюыцхѕўћu"ѕѓѓєёђёёчєѕєїѕѕєѕђѕѕїѕѕѓїєѕђѓюёяюѓѓвёщчшщяышэутущьщьчђўўФ73"ѓёђђьѕёђєѓђѓѕєєїѕїїјѓєѓєѓјѕђђѓЩђѕэюяььююьытсщыщїтУЩщЯZIa4ёюьюѓяєѓђђєѓђюьєёїїѕјїѕїїѕѕєђїєєѓєєѓёюышэђёёчьээђэємНСцьz,#0"щчьщэьяяѕђєєяыщщёяёєєъїѕјјїѕїѕїєѕѕєђѓїѓєѓёђѓѓьђєѓєѓёумюўў…M2C#,ђььщэьёэёюѓёєёээяяюяюђѓѕєєѕѕїѕХђєѕїєѕѕєѓѓѕёєѓѓђєёђїўўŽH#"юььыёюєьющььюяюяээюьэюёєѓѕѓѓєѕѕїїјѕїѓєєїѕѕцїѕєђѓяяёёѓѓђўўЏL70"(ёьыэђђлёђёяюьёяюёэыыэьёѕєєѕїєїѕєѕѕјїјјїїјїѓѕѕžєђѓєёѓёѕёў§‰@<>) -яяђэяяєюђђѓяяєѕєѕѓѓёѓѓяёёѓѓёєѓїєђєєїїљјѕєѓѕєєѕїёєєѕѓѓђђўў…EEZS34ђђѕѕђюёєђјёѕђєђѓѓёѕєђђёьэєыђђэѓёѓѓпјѕїєјјїњљљјїїєєђѓёєђўўЅB0(-79їјњїїяєђѓѓєюёяёэяэёёьёчэьыьыыєђѕѕїјјљљўјїїПѕєѓјђэѓєѓўўЃ;$94-3њњљѓѓёэѓюђєђёюэёышщэяёђёюьэщцхчыёяяёёђєїїєїєјѕїїѕЏђѕїђўўФ:3aA>8їїѕѕѓяэычыюыююьщьчхчьюѓєєёяыцсцчцщьђэяёюэђяёѓєѕѕјєїѕёѓюяўА2E@:4їѓђєєВяэцычьшяэььэюшьюёђїѓюяёюэььщшшышчуььѓѓяєѓѕѕїїѕєёюьєЌ-?005:ѓїјѕєјєѕђяђяђђѓєђѓђёёѓєѕєѕђєђычццтрухсуыэёёєяёђяђєѓєяёўўЦ:45135њјїјѓѓєёєђѓѓѕєѕїєєѓђяёяюђяюэьэщхручцххюэюђюяюэёэьюэщёяѓєўпq`H%јїљѕѕєёяђђњёютёяўўОїёюђюьчццчьэьщыщыщьыюычхгшхкмсхщщыёяјўў~PU7(*јњјњїѕєѓёєђѓѕѓкzUшўїєєіяёьюыэьєяђђтыюьєьэчмнзлйрнуцщэщјўь~B; 3љїї№љїѕєєїђїњўўњШєўєєгѕєєяюяёёєёєђёюььшцпртснтррсучээѓљнkMF-::їљњїјјчљјњїї§њїїљєѓїєєљѕїєєёёѓђєєЯёэыкрклсчюычххцсыэяѓјљ—j[:?<јњљљ§њћћњћћјњњљљњљњњїїўѕјјйєѕяєђяђѕїєїјяшппэёђєээччьжЮупсш›09O?8љїї§ѕљјј§їјїїЧјљњљћћњљјѕѕјѕєѕѓѓёёјѓїљљўїљєщѕѕѓяёжррлйкххцўЋ;:85*јѕїјѕљјјўїјјіљїљјњњћљјїїїєјѕїєѕђєѓѓёђєєјїѕѕщзкчцснррбнўшJ-H52љњћљљјїѕњѕєѕїѕѕѓјѕєѕѕїјїїљїѕїєѕѓђѕѕєѕюяяѓєиёљїёэшђмнммгїщb)%:4њјјљћјњїѓєјїєєѕєѕїѕјїїњјїљїјѕѕєѕјѓєяёєёєѕїђђкяѓююжспччёўјd*:L5ѕєѕєѕјјѕјїљїјѕїїєјјњјјїј§їњљљўњѕѕїеѕњњјєђєяђѕєљїэххцэўяh1#).ѓїњєљѕѕєёѓїєїѕїѕљѕѕїїјљњјїјїјїїћјїїјїїўљїїлђѕѓєђчёэычнсс{-238њњљљћћјјїєѕяѕяѕѕєїєєѕљїјљњћљјјїрљєєѕѓђєѓєєїјѕјєёёђяэїљѕЅ9H22ѕєѓѕѕѓєѓѓѕѓєїјїїѕѓѕѕяїѕѕєєѕјїїѕјїѕњїњјјжїєѓяѕђєєїѓёђёѓђѕїўўЄ*%,ѕєєђѓѓяёяяѓђєљљјљѕѕј№ѕєєђѓїїѕјѓјїљјјїїѕњёђѓђѓєєяѕєєјїўўбљѓїїњїјѕѕїєѓђђрёђєѕѕјѕјђѓёђѕѕєѕђѕёюѓђєјјѕѕёєяђёёцѕёыщчэшэяЈ-+4єѕїѕјљјѕњјјяььТэыђђєђїљїєѕѓєєїєѓђюээьюѓёѕєјђђёюьѓёѓєѓђяэяцѕэКE50їёѓђѓєѓєєђяђььюћьюёђѕѕРєѕѕјєѕяёяююяьюєєјяѕђђюяюяяюѓяѓёяююєўѕQ&їђѓђяђєђїђєюѕѓёюяцээюёєѕѕФјїїєђёєєѓѕѓєёѓёєѕѓђѓђяєѓюёяѓѕѓэђѓўўu3ѕѕёєѓђѓєђђѓѕєїѓєяяэюяђђѕ—їєёёѓѓѕїљїїѕђѓєѕѕјѕјѕѕѓяёяєєёѓюяўўЂ1,єєђёєѕћѕћјјљљјїїѕђєѓёђёюђяѓђёючшђђёѕёђїђѓђѓђѓяѓђѓѕэёђѓєѓёђѓїўл1)ђюѓёёњєїѕљјњњУ§їљєѕѕђђьяђяёюьщяяэёяяьяїяээчююёёяѓёёђяёяђяћўэU!ёђѓяєяђёєєјљњњцљњјѕјєёяюэюёюђяюяюђюђёїяѕёёіюыхыёяєѓѓђђєєѓёўўr,ѕяѕѓїѕѕгѓєѕѕєѓїѕјљјћїљѕѓєєёѕѓјѕљєєѓёяєѓѓїѕєяюычѓѓѕїїѕѕїјјўўЖ@ѕѕїїєћ§ѕѓїѓєёјїєїїќѕљјљљљјљњїњћљљТѕєёюьэѓїєєяючщэяяє§§ѓяњўѕѕўўя3љјњљћљњњјјѕђїђєєљїїјљњћјїєєїњћљњњСѕѓёьыьёљћљјђєяђѓёёыцАЈпкчяѓўѓ^ѓјјѕїїљњћћљљєїєѕјјљїњјљљјљјєєѓѕјїїєѓШѕїїѕђђээющчыьтсцээёьўўЃѕњђѓєїђјјєѕѕљѕїїѕєјїѕљјїїѕјѕєѓѕѕїїЦѓєѓѓєєјїєяяьяэщщчыьщыщчьэ§ўЎѓѕїїѕѓђѓїљєћїїљјєїїѕјѕїљљїїѕєїїэѕїїѓѕљєњћћїєёѓђююяээїщшшцщтўьїїьѓєёѓююёюёѓїўјњљїљєїјјљєђѕљјљњњћјљљїјјъњљљїњїєђѓёєѓєђѓяёьюэўј€яюхурюяёююсеЕчўєяяыёёюыђюьуукеншнзЫЭзцяєэьюєёёшнжзнцтпсульпЕmj’їєэђѓђѓѓыаШФБУхыЩЌЕМЩцчуёѓєўјЯТьюнШйгзжгпнндтщяёэьђятццсёўбŽ‘QGясЮЮЩегпчФЭШЩЮкєО™˜˜‹ЈЎЕеяайЧЏЇЕЕЈгьлййрпббпнэюыэххющшсјђЊqL>N;7тлЪЮЩдрьхжЭЫСЊŸФйбШЎ˜МЦНЕБВЕЅ•ЋБЊ™ЛТЩЭзпдзжлхёяэржЮЭбецяС`$100*2нжпсшцкзЮедбхтчўў€ыаЦјузмдчЫЭСБЎЎЏЗЖИОУКЪмеЪЭняююььухјэ’4(;@131юђёђэшьчэшюѓяжпцёюэёщмЯУУбймФОДШФФЊЌюкЦНДбцнкФЪзптхщцы§ўЧF*)11#тыщђяђђьсуцуйЫжтюѕюцЭбЯеККИЦЪбИКЕЋЉйїЩžЮУТЯЗЗИЧучьшмгЌC *-($)$дгЯКдрнжбаЮазЮЫдлсчяьцбзЭТЗРТРЏЏБЋ–АОДАЏ˜РЮстмжедрцяпўўВ($&:*+$,ЦЫТСЧкЪдадженсЭгзрѓїєэпЪЯУЭкЮЦФЛЛФйэчУДЏЕЭљэыђдžЏВВрЦОv?+0"+,%дгЯЧЫйпжлпйШЧЩЛИнцєёхллЫкЭОЩУаЫНОУЩкдбРЧркФМЮдмЛЖЊЁНЄU8*,%)яэцпкщэюушщщпйРЖЏёыпжкетрдНЦбеЯаЩФЩЯеемйШЁЈƒ•ЌТФЪБЏжж{8;+%-,"(.#шђяьыщюёшяюуЮбЫСИЦерчужктмкнлусээхсчцкЧОКЎДЅыѕўўыЛЁМнo%79&21(&0ёяыяэёэёыёьхсцзЫШЪкржбЮгкггй€псЪФЦСЦУИЧжзОБЫуђыаКœ’буV%21.&*&+ёшхуэѓэющцущшэыпйхухлЯдьыымЮсскмакрхламтпЮазТЊ—ЄЛЩШмўшC$+ёєѓєюєѓѕыяюьшѓѓшхштцзхщёьхзнкжгзЦЦлэрктйЮШЭзлЮШЪЗхряђЏ]^:яѕяѕѕїєјяяшѓьїѓьшшщѓђѓєїѓёутлхтшыщмлббЭекжЯпкЮкпймщўњыгc#" ьычьђѕѓјѕѕїљїљђюммьёѕјјљєђяьэщрнууйЭблдкдУСТЩаппхнжедцј—!"ѕѓюрючцёѓјїљѕїїѕщьюѓїљњјїѓцтюшмпсьчпйпкцынУТТЪзлхнабаѓўњv%"ѓѕяёчкмэююђљѕїјљѕїєїѕњљјђїѓєђёптыяьщчхЯЮрркцлаУФмусжлшўўОA(?1%3!ыђээтанщьпьђьєѕљїњљњјљѕѓёѕђѓђѓяёьюђѕэчдгухнхымекЮжпюЧЏЎЯНcQqE.4!жлхэшяэђщмпяцшшуёјїљјњїїѓјїїѕѕєѓяѕђјёэцпаншяшлкхыщяёШ™•Рн4270:(гЪШдЮщцчыэђђьмежцяёїѕљјљј§јјєїєјѓѕєїєѕёытыђѕяђяюэєѕѓбЭцєўUGP>?3хцгнмыхнжюэђслкхтцтчыђђѓѕљєљїјјєѓјѓѕюјјљѕѓђѕюђєѕёѕєёяёѕўў$.S:08шеЮкрынсазгтцьхйжлзггтюђёјѕѕєљјљїњјѕѓєјљїјѕѕѓяяччыэђьюёўўОVBE89>хбТжсщщтжбЪгзкмшйсгдЮчюёюђєёѕјїљљњ№љњїѓёјєѕєїєјёюэѓѓТяў§˜ZZO;$4чндпущчёьэьыьыыѓѓяхрднхшупцыыєєѕѓѕєјњњјјѓёьђђѕєѕѓээььˆэўў]UooPAяяэутщщтшшючпкшѓїѕђяцыыщзгудлюёыччьђѕєёѕјїјњјћєѕёяѓѓьуяўўЏS;:]ICђљљѓяшуйшєђђшьычйрйсчэятФкйупЪЦнхяёђєєђїљћљњїјј€њюнчђэђѕўўАJ3C%>їљєѕёђюьщыђјїўўћЛђўђщьыђђюцшэьмнхёющлдЮбеаЪЫЪЧНЖЗКВОктщђэзrUS8JJїєђѕюђяђђєяыёјў§єєѓѓюцђјїјёьтплсьїєёхпЪБДЏЋЧеелЯЫРЖФачьыьэЁ~dHOHяѓјјїјјљњ§јѕєјїљњњїїьэђєѕѓюялрпрыыьёьэяйТЕЊЫпрлхдЫШЪДЉЦРРЧ—@FaTHѓїїјѓїєјєїѕњћћњћјљљ€КѓяђѕѓѓюлптёїєєљѓюьЯэёёэьКОЕЖЉАКРРщЄEBSLEёьтцюђђѓїщєїљљїѕјїњћњ§љћїїхьѓєђёщьђјєятсэьяєђьдМЛРНМЎЕШЫОїч\њњјњњїююѓђщьюцчѓёђђ€ѕћњћљћїјљњѕэчюяюнчткчёёѓэуршццлЗЕВТзж§уc.AYEюшьєїњѓђэєїїђѕьщяєђѕєњјљјњїљјњљјєљєёыяёїєљїѕячьщттёчгЯЫеуўтo,+89ёёьёёѓэсыђѕїюѕєђёјѓєѓђєљїјјљїљѕћљљєѕѕућїљїєэрзтюѕэЫгааЭЧШЫ7HBAѓїѕљљьєэьёэщпяюёьыцщхщёєѕљљЮёђїњєєђјѓјѓььёыэюєєѕјљђяшщьыючлЎJVBEєѓэяєјђытуыхмёёкэюшьюяђюьёѓѕєљѕћѕїёѓєљѓѓяяыузюѕђуёыщшююЄєўўЂ22)>щслутнремлпцюѓїѕёщтщяєьукчыяюэтђѓѓёїѕєјјёящчлуѓјѓѕяшщёєѕјўўжF0@]юыьэчсцьнтхщьђїєяёяјј€РђхрыычьэшшээёёєїђђёюёёучђљїђщхуыьєђјўўУ\IEтшчхтцпяђєїјяэющђцыєјѕшчцуухщђђїѓѓюђюѓѕјёѓуяычяѓђэчгЯЭабдсэёЅ]QLекщєђєяѓђюђёсркпрркшєљђсллчьёєђшщтшэсююѓѓєэюхчцмгзкмьыжбЭбЭе”47?ьёєїѕђюѓђђтыеУжжпккльєє€юёььяюђьукйгШЪакццюыэрнтчмуыэђєялЪнпЭЂMG7мьхпрыщђєячйаЮбЪЧЫЧгьѓѕєёщчэюэыхпмдШбшэуйэяшмкбдпьшзнуюцслнјщT%1цщтегкццкрембнхйЩЯОачяююшшюїђхснкьючмнрлнряэццьылбйбешухыхсўў~);ёштдсцыюыщчэюьхлаайчыспщщьѓђызЭтђѕїєѓѓэьщяяььєєѕяшцшюђюнгпьўўЇ7;эрйсэѓѓђ€РяђђяёьущсцшрзмльххрЮЩЮйыяшьёухуыцщуччєэнсзтѓёђшрсщўпH5збЧадцьєєїїљњљјјёѓёђьтлЩЮЯлщрйггеймузжхырнпазаньшуееппщющцьћўщb*клншкпзсншцѓјњјљјїїјѕёужЩЦатцтулкеммЯЮбюццлЩЦТЮааыыђѓєюёыюђэўјu4сщушыэьччыыѓЖёєјјѕљяёящчуннпыцэщьшпсюьэюёёюшнУжряѓђѕєьыяєђљєўЛPпхтэёђђѓщтзсшкйшюёїѕѓњјљљ”ѓюѓѕѕњїєэнбзучхыюяцШЧЯнтчэћўупѓўєњўўю;юђђєѓњћјьцччхщюёђђєѕѓћїјєѕєјљњљ§ћјђхрЮОЮйчѓѓьрзхшнлгдж•ƒРКЯцёўяeющщѓєњњђљѕёынхшяяѕђїјњњщїєяѕѕјјњљњѓчшшлцэљѕјяяууклеЩУСОРФЭлзлўўЏцхштдмьђѕїєѓяѓєђєюёјѕїјј˜љїђщщэєѓёьяэёёѕѕјѓєёюйбШЪЧЦЧТбнйжлаЮєўЌыьююлгжычмчсђјјѕђёюєюѕїёёѕюэюѕѓљёђёэыьыцхђѓњѕєђяуедгЭллгЭРНЩУаўчђђрѓсеЩпчшшчэєѕњјїяцшьяѕёххщыьђјѕјїїћјѓѕєљљэћїєячспыьыёыьнчлзчыџщƒ—РЫЏеєїјѓыЧМИбаЦЮЪжЯЩЩе€ дгзбтэымЧОСЪЮбЦТУЦаеЧКНСЧЪЭжмймжЛЗДВЖ.*9Nk42^u‹ЃžЉЅ•™ВФгУРЯанмбаЯгзйпррбЦЦггмйаЪУУФЮаУУЭЯЪЦЭкЯдйЯЮббе*!!-#3HOQ,-]ZQ…™ЊЊРтјєцджёйВКЪЩЮЮЧСШЦЭЮажЯСЩммтсждздЧЦМЪЯбгеШР#07S@>:5A:>>9NOe‘ЌШЯЯЕЄУйдйЦАЏФЦИŸЉМБЊРаппбЭЧЭЫСЕКЦадрхшШ!"-483+"*,CG*9@J:AHTPZe–ŽЈ—Њ•zŽ‘ЃОсшуЯелаЩЩдгУМШЭЭдкдЃ  #$%()2A;@?7.>LQ;04*:LF:02-9OG004@Oz•РЧбччллмлЫФЮЩНРЮЪТ #&,*%--!-%.)397;<8:ELIEF?@9Q[5%CTVG>qŠ›ЪтесяшцлйдЯййЪЫ &&.()%+"!3<1&-01<;CFJABMILC2:9?FBJIB8i{\ezЂрююпШЮладЫНО$1($20)$J77<413BPE;;ф8494.0E54?NG?ETbЃЛЗЭеЦдждЭ€B# 5",!"G$#4OB??9,$!((,2%3QISVPjr‘ЇЉКЌНу ?0 !!&+%!&!(:jmB##$--2>857)),%&0-3+3BI>SMPFWgVzЁЗы)((!J1Bc?298))")*,21&$58:88<FTNBWVP+E;C\ )% !!$14(+*%&4<@174+)+$*5<:8CJB9+(*:@ "!#$ ",&-#+,$%-1)80.#+239@B:31  #(%**.71*.)&!(&+)135>#%.20-#"+((!1B4$%#53,;..9? !!#)(.5:03&%.245+11(#&.2841.)(40)*&"(11,-1   !,),*4,10--*-0&%#%!+.$")&..0959:B91 !$&""+."+0$##+-$#*!(&)53<90&( 32::tЋŸŽI** *+3()&1+,3,-%."")(1.0*4+&&, 7C1:FТѓђюнЪуНu[W9 *!1)*-),1("("&+)""%),8?4772(%!5%JCNFBEЂыєѓј§§ѕЦўямЭŽ\L>&  .2)#,15,,.&*%&-#(%!%#,:0BPP?–яћёёќюшяђђУїљѕюёядЖ|?:aVM% #15%&(-%"$)2*!&)(--2! $*-7*+"‰їћёёђѓђёёяШѓєѕјћ§ѓјљщцзК’}Q)  %1921-28+!(,)7)""1;4318>:Ёјїђюяѓѓ§ђэђђёШѓєєїшпцђњћљяцЕ{F #+71+2*)1230.+.%1)12<>‡ђїюяђђяёђяяђШёѓѓяђюэмеЯзцёђєљ§§љзЅc*%,-#,2-)0;0+),))BI;-oшљѕѓюѓєєюѓђђёёяёѓєѓєєђцтхьђђ™ѓёюёє§§ћеƒL]S"543*7F80++,4?ING1cћ§ѕѓѓђяёѓєѓѓюђђѓѓєєёђѓяэяђѓєєђюёёђѕѓ§ћ§љѕщЌd[H0-495;!)+27;FSN4]ѕ§їёёђѓ§юђѓѓєљѓѕючьёђђѓнєїјѕєљћљђємА•‚d2094(&1(01,AMdнљѓђђёё§ђєђђ§юѓєєѓїђёьэчыяьяяєђѓђѓђѓѓєїїљѕѕщњћћў195$#-0899;3Pтћєѓєєјѓєєяѓєєѓѓђєёђююьёюяёђђѓѓіђёёяёяёђѓєєнѓђђѓ92.-%&#&",14$Iщљљѓѓєѓђєѕђѕѕєяѓђђљёђёѓѓєѕѕ§єѕєєќѓђёђђнѓєѕєѕѓѓ(1*%$$(!"*3Nуљѕёѓђђѓєєёєѕєєѓ§єѓђђјєѕѕїѕѕїѓѓєнїѕјѕјѕјѕјјїѕ#-&*!%&"(8CСћєёяѓђђѓѓѕєѓўєѕѕўєѓѓєњѓєѓєѓєєдѕђѕѕљјјїѕјљїѕѕ(*-21+-+$,G‰ёљршюяяѓєѓєѕђєѕѕєЦѓєєѓёѕѕјѕєєѓєѕїјљїѕѕїєђѓѕѕє2%&%1."#0nтјццчыьэюяѕљєєѕєєѕњђэьёєѕѕњјѕєѓёєєѓєўёєєѕж,:9#%$!))")Njкьгуычщьююѓђєѕѕєѕѕјѕђяюёѓѓєє№ѕїїѕѕїїѕєєѕїїѕєѓѓп3A?.,"1$)E?FЎЮкйпттпхчмШуёюѓѓєєђћёђяѓєєЪѕєєѓѕєєѕѓєѓѕ)*.+&!!$$5БцЪСадЪШдйжгрцшщэюѕїѕєѓђєѕїїХѓѕјїєѓєѕїјїѕѕёѕѕїї.;4+!%JŒШйзздННУЩЫЮйзтюцюёєєюђѓѕїїїѕєєѕѓєєёѕѕћїѕїљѕѕ–-!" 3,3nБЖгКЏЏЎЎУаусзйсыѓђљѕѓђѓїїєѕјєєѕјєѓѕѕљїїљїјјїљїљї!($)7+&-;JƒзМгЦНФЩСЪбнцтутрхьђѓђђєѕѕєєѓѕїЬјљїїљјњњ ! ^P,A9@мёяйЫЩЯйкгеагзрзуьєєѓђєљїїєѕѕЕєѓєєѕїїљїѕѕїјњї b’c@(%zїєзпЫЦеЭМЖЗЛФжытчьђєђюђєїњїњњїђѕѕєєѓѕѕїјњјјїїѕЫ !!*>k[-1uљєзсргЫОЦТЮдЫУнщюяѓєѓђђѕјјћљљјѓѕјїѕєїїјљјбїљ#$7,B"-3+NйјјяющхцчнЭгУЪЪпчяђєѓѓѕїјњјєїї§њљїїўѕњњсјњїј4(*%*,&%1C7CЪї§єјѓєђёшууцхьуцюєёяяѓѕѕїѕѕїѕѕєїѕїїљљјјїцѕїїј)0%!%&447<57HЂћћѓїєєєяшьэшяёїѓѕѕђђьєјѕѕєљљїїјјїѕѕјѕјјїјјхїјј +&21#:7.13?A`ёћїёѓѓѕѕ§ђѕїїїєїїєђђѓєѕѕћјїїњјјїјњјуњјљ-1802+4<.1&()012Uрћћєѕђѕєѕѕїѕјђєѕєѓђєѕѕјїњљјњњѕєєўїјјѕїљїјјњ&,4%--ы"(34-*-&4?Ѕћ§єєѕѕєљљїїјѓїѕєѓђђяєїјњјїїдњјїєђѕѕјљјњљѕїїѕї4.*072*!)9<2.:010‚јљѓѕїїјјїїћєѕѕєѓѓїєїїљѕїњјїїЯѓѕѕїњјњјѕїњњѕѕ&)1,8B11+>OLG;;1(iљ§љїїјјєјјїњњїѕєѓѓјђѕѕљїїјїїдєљѕѕєѕјљѕљѕїїљїїљ$4>8#)82>NJ>(.mєћљєїїѕјѕѕуњћјїѕѕѓђђєѕїїјїѕїїњњљїјјїїљљјјчїљљ."11$#&9?IYFOp@mтћ§ѕѕљїѓѕїљћјјЫїѕєѓѓѕљїєєѕѕїїѕѕјїљјњїњјљњћљљћ #3)%#&(+1:-„ћћњїїћђєєѕїїїѕђѓєѕїјјїїїѕјїјјїњјњњЮїћћјћљљ(2 %T?2%1">pSH-LШ§ўјћћљјїљѕєѕїїѕєѓђѓєѕїјјњїєјћјїївјљћљ§ћљћљљ28((??A?+,&!?‚–pUс§љїєїїљїѕљњјѕѓїєєїќјњњјјљјјњњјјїћ§§уњћњјј2""7:FE10))%E—n(2Ў§§єѕѕїњѕјјїјїїѕѕєїњњљћћљћљљќјїѕјјћћљћјїїц.F"--:?71$,+0+GO1<ž§§ѕїјїїьљјјњјњїєѓѓєїїѕїїјњїјјїлѕїїјћљ§§ћћ3%( )>:(,+.93;BdA-tљ§љїїљїїќњјњїїљѕѓђђѕїјјїљїРјћћјјњљ§§ћњњ>53A3A8:5A@@4**7;)&LђћњѕјїјїјѕјѓїљїїђёђѕјјњћћњјѕїїљњњзјњјјљїѕѕљјT?05&89?C:7)CG;1%*5Т§§їѕѓїљїѕјјшїєђюёэѓїјјїєѕїњћљјѓјѕїјљљрјїѕљњ`&-52VSJE&&35?C89-Žћ§ѕњњјјљъћѕёђёѓїњћњјјїјјћјїјјїјјўїѕѕїˆЉЪтНт§ўўђыссєђцыюьээяђээКюэѕѓєѓђяюышщыыээюэыьщшьэьюђђёєѕьшхтю:?CZtCAd~ЃЖБФЪИТнрчшхђёээююяяьээюыы№ьчщыюёђђёёђёєђђяяќёюђяя€Ÿэьэ5,32%19MSZ45cb^ŒЃДИЯыўўћђђљєсуцтцшщщуусхыьыяяэђёёђяюььщышюяѓђѓш*&(,&+:3YABHBG9BB?UVo˜ЕлщхЫЪюєєёчнпцтеЪлцкзцюэяящццщьышыьђяяљц#"!"+&$58;9:2A5MN52BLAFPbbуq„Ѓ˜АЌЅФЃƒЁЉЧсѕўњыьыюэюьээёюяяЧэђЮ(((1535>CC??;99PT>8:3@QM<882@SL08;F]ŒЉзкшћљяяђђПёьэьяьёю##*!)&*27822838.3240.4;:AHLAEIJQIA;8B??HMNAEqeoƒЕшїўящђьёяээч"!*33,".852,)&*C?CI?38CYL@<>9;::@BF:AJTJ?IbtЊдмяѓшєєыь )P8";&"+$*&*1-+!.C"40;TGC>912,441291149WVZ]]wwЉШЩусшљJ8)((2*"($"+!Bj|H(-1+2725:335274,*1;9?CLOCWVVP`o^ŒЖШњ!,. 2&!(11&&)%!0JEHrH.:A??90(0887430--2;EC@:;3JQNB[ZY5MCJa$(&!(%#"$#8,493327;;5-(+535;8?C@CCEH?C1(2?> #!!+)&#&$$(.14-4794942<@@3-*085;>BGA7:  +**($$,&%(,+&0447;A8--.03177)%#0548@JC@?BNCE887;>$ %+(!&&%123.(*((,&).37;;A++)-029;5712207@C;73:599)4;:;  ##*1,,$)&(3:48774+!"%,.,858510388((02:8.70.>31 €  %&$,(-+-.&#&&("!-,(1,"#&%!0975858A?A><4!    #("(("!%-0(+($,#"&-)$(#,2*.+47?<@72-#70.?AxЗЃS(,& $"(+%$+10.0+10"!#)(0.(3,4:2>:1&!"7?8@NШўјянЭнЛuWW9 (($,.&(.2-*+*-((++.38>?:901,&(+*(QNEB?MАўўїљўўї™§ьйе’^L>(#)%,-,402)!%$&&%%(#1*-),*-**+"(7;?8*’ўўѓєєѕєєїђѓёѓѓѕѕѓўўЮѓјўыуй̘‡N"+053+2944%10&&)0%3;BE95AC?Ѕўўєѕїѕѕ…єїѓєѓѓєѕѕїљёсчђћўўячД‚H% $-#&(#+0310(,)&059537FBŒњњёѓєѕїєєѓђёѓѓєєѕѕїѕѕюхезнщєѓј§ўўїбЅY+()(*,))#47*(*078<>O>5uѕўљѕјїїћѕєѓѓђђўѕїїђєюхцэєѕїєѓђєјўўсе…LZU-3*715135<@EJVH2dўўњѕѕјїєѕїѕєѕєєѕэїјѕѕђюђєѕїїѕѕђєѕјїўўнѕїьЌdVL*3488)2>:>@QH3dљўљєѓђѓђєѕѕћєѕєѕїїїєёэяђєѓєѕѕгїѕњљјћ§їяѕйЋ–~Z.441.09:354ISgнўњѓєђѓђєђєѓєѕѕїїѕѓђяшэёђѓђёѓѓєѕѕїјїѕљћљ§љўўь§:4-),51:?;73Uыўћѕїїќѕїїѕѕёєѓєѓёьяђѕїєѓєєѕѕўєѓѓўѕїїъѕѓєї53,"%,733754+Nђўћїїѕѕїјљјјїїѕєѓєєљѓяѓѕјїјјїєтђєѓѕѕїјљјѕѕ43.+)12-$)"5Oщўјєѕѕїјїѕї№ѕѓєѓєїјјљјјѕѕєѕїїрѕјїјїјїјњњљј40)$%*-)(#$2:IЧўўђїѕѕїјїјўїѕѕїњјїјїјїї§јљјјњсљјїјљњј4122120*"*124Lљўяѓѕїїјїїќјљљјјїћѕїїѕјјюїјљїѕїјљњјљјјѕїѕїјјц5.$%!&-&3)+7|јўљєѕѕєєїљјјћљјїѕјјњѕёэѓїјјњїјїїјїїѕћєїїјїїј<х2-!$((05)4VrёўёђєѕєѓѕјѕєїјјїїјѕђяѓєѕїїХјљљјјљљјїѕјљљјїєѕѕ9<95144.005;GCMзљѕёђѓђѕєђыщыєјјїјјљїїѕєѕїї§љјїїјїјцљјјїјј1531-%%&,+72$8Эўѕщяяьёяюшхыєјјїљјљјїєѕїјљљћњјїѕїїћјљњљјјљз2,0-&%#%#*448Wюљњэчщхчяёѓёђѓђњјњјїѕѓѕјљљјїјќљњљјјд0*1+&$&3;.8FŠцщєщчхтчьёђєѕєѕѕјљљјѕѓјљљјјїїўјїїјљујљњњљјљјљ,"&(#!"55+&IYŒѓѕїььљёђѓѕєѕѓѓєјѕєєѓїјјїїјљжњјљљјњљљ("#("%)]Q9F2B”ўўћяяюѓёээююђєєјјїїћѕєїјљљјХїѕїјјљљјљјјљњљљ%-!%V‹^E#%{ўўєэяяыычцчшюѓєјѕїѕїєђєїљљћљљјїјњљњљњњљљмњљ*)()+%"8qa;,zўўјєёёяэьёюьыяюєѕїїћѕѓѕјњњћњѓљњљјјљљћњ§ћћњњЫљј,"%(%%&<02(51.!OсўўїѕєѕєђёѕюѓюїѓјїљїѕѕјљњљњћљњћљћњљљшњљљїB-#(##073-24;H;Jбўўїїѕэѓѕєєѕѕљњїїєёѓѕјјљњљљјљјњљщї-"%$,13-82::;@>ї>97*28:873[чўўљјљјїјјљљјјљјјїѕѓїјјњњљљћњљљјўљњњфљјљњњљ9:977:701214@@2:AБўўїјјќљјјљљњѓљјїєєѓїјљњљњљљдњљјљјљњћњљјјљљњљ9;70273+3;@BFC55,ˆўўїјљљњњћљљјїїѕѕїїљљјљљ§њћљљіњљњљљњљњњљљсњј23+2414279PIMA55%pўўћљћњњћњњљљќњјїѕѕјљљћњњљљјјћїјљјљљТјљљј%#&470+4;<7IUI?&)r§ўћјљљјїјјњљћњћљјѕєѓїјљљњљјљћљљјљњњљљјјњњчљјј58+380*3>LT\IIp>uшўўјјќљњљћћњїљјїєѕјјљјјљѓњљњњћћњњљњћ§ћћшњ):"%.0,0.,#75M2!„ўў§љљэњљљїїјљћњљјѕѕїјљњњљљњєћ§њњљњљљњњћњњћљ3<#$O88ђ02-Cz‰NM-QФўўњњюћњњјјїјљљњїѕєѕѕјљњњўћњњљўњћћк§њћњћћ@>374?B;3&1%-E‚œp#Zцўўљћљљјљњјљњњ§љјїїљќњљљњњћзњљљњњћњ§ћ§§ћљњњ%9832;?<9+142-MЃq,2Еўўјјњљљњљћњћљљјљљ§ћњћћ§њљњњќћњњљљи#?N4$+5:9148244LT2?žўўњљњњљљјњњљњљљјѕєїљљќњљћњњљЬњљљњњћ§ћћњ9+47.2793+3;::?MiB2|ўўћљљјљљћљњљћљљјѕѓѕјљњњљјљњђљћћ§њљљEEIE<:BACC;0•ўўљљњћєњљјєђѕљљњ§ћњњњ§ћњњљњњљјјЁœДалРшўў€,кееэхнкртупртьчхцыщђєјђугзмснппспсырззйлпуыђэёцбЮЪФйGJIixFGp‡ŸКЖРТЈЖЭзсмйшшяьттчущшэююржзттыьыщщцщэыпчщчхухьсшшьтцычE;5@A33E^nnFFvrhЋМЛбѓўўљшщўэЭанзхщркпзппььэнрьђѓѕэчшцрнжппчыяхй;B;:?FN3(EdWTVS^MQTJadw›КршхЦЛлэюямЯФйдаКЯкЪЗдцыюцлжйрлйджущђѓјм!-08<>9728GPTPO@PBWZFNQVOYbnmt‚›ЊžЗЌЅЧЅŽЂЅЛкѓ§єтхэхмуцмкк€­пцшёщД)(7,9::9B84CCLHJSWTONMObcHIM@Sg[L@CCLi[>@GOgŽЄдлсљѓээяьтжрмеетсз"(%)3,?.>8?@GIHMCIJHHGQSPWTPS[ecWVZQFkoM;SkoYVŠЊДтѕцюћєєщщчцьэсц!%:"47;CEFOUY[^a]eecdMCSOO‚[\iVNƒ‘r|Кёўљюпцыыштгз(# 0?.90BB.CBCH07?A?F5BE?7HB@[L`Œe?NSOWH>MICHHJFJGFBNNPPZOFZ\h\qrjL^UYt(9<75B-"42:*+:@9;AON4--IGOA@FMNSNNII?1>BILJTLQUT]c]QU>;FPY!3*1$(($",152?0<9;74.75@A>877HLSMSJHAGCHHSGBEE?EE€ˆQSVFUUQVP[EONZ$*1*&))#&12-03;;?@>8>:A?>HELNMSZ>;AAHJPJG@F>FCLUWICTWQPININMO%-&)1$**:50-180789:>FIJNLG;100E@FBSCPNH@@NS@?8EJPFII€HJM)+,!(!%$(( $24,<:E9HI>E87:72E;B@MBE?J5@>:-31,5FI?HCJLYNNAE%)"*-(03QJ?QF‹ШМЅ`0;8  *#2-.0.5,:7@@8<:99@?CB>@H>C?@393,ABN`Vbt`MЊўўїњїљєїјћћўўМ§ўјуШ–HLxj[3!74;;:9;C75B>C<9@AEHFG?AHME;;BHAAIO<5ELEHJ@INTŸўўєљјћљњјљѕјїњјњїљљіјѕьупщђњњўўачЖm4238#(428?B8GEABA@FFJ@C@.5Bbўўћњљљкјњњћљњјњљљњњљњјњјњљћњћљњљћљњјњјћљћљћљћћьњћ<3G:BG9E?>1FI\гўўљљњёћљњј§њњљћљњїљїњњвјњјњјњјњљћљћњўћ§љћњ§њћ:<:A;@E[œўўєєњљљјњњјљћљћљћјњњ­јљјњїњљћљћљњљњљ§ћ§њћљњјћњћљћ>7?3727.:JB9;EŠњўњђѕїљљћњћњћљћј§ћћљљєєїњљћљћљњњ§њњј§љћњњмјњјћљћNCIHTSYТцёыѓђєяїѓэЭяјљјњћћљњїљјћљњјњјњљћјњјћљћјњљћљћјњјћ9BB:>@>;B99E>,GШ§хкячхуыьтмьєњѕјњћњћјћљњљ§њ§њњСћљњњ§њћњўњћљњљћњ§>I>;57(-)37A;<^™кёёэшгЩжршчэёђѕјљћћњјњљћњ§њ§љћћњќјњљћћељ§њ§њћљћ;;?8>42&33:L;HGˆЯйщЮЦФЧЩпыєјьяѓїјћљљЙњјњњћљћјњљћјњљћњ§њ§њўћ§њ§њ§;71,4A8@:JI>@Ug™юзымецтсюяђєїѕђїїљљћјњњћљњјњњЩљћљћњ§њ§ћ§њ§њўћў04$59:;@qdIWLQ˜ѕўљщуттяюьцхтєђєѓјјњљјњњФ§љћљћљћљњљњћћњ§њ§љћ§ўћ§+,;122.+tœzV;3ўўђяпмысжЫЭЪйѓѓѕѓјљњјјњїўћўћ§ћћљњњћЫњўћўћ§њ§њ§$7530?;>?Y{G,B‹ўўєјячзжмпццййэјѕљњњљњљћћў§§єћ§§ћ§љћњ§ћћ§§вўћћњ§<9.8.82OFL?INE.cѓўўљјѕєђѓђђщзннёїљљњљљћ§ћћќўњўћћјўњ§њ§њ§ћћСўњћL?<80S?NT[N[тўўњљњјљєїяѓѓђїљјћјњјљљћћ§њ§њ§љћњ§њ§њ§ћўћўњ§§шњћ39-?@@CPLQFSSYH`Еўўњјњњнљњїњњљњ§њ§ћћјњљњљћљћњ§њ§ћўњћљћњўћ§ћћу§њў*:G9;8>FGQWUSQWYxўў§њ§јћљћћуљ§њ§ћ§њњјњљњљћљћљ§њўћўћўњ§ћўћћхўћўћ§NOOJIJHA?QNGPILIpјўўљћћљњћљ§њ§ћћнљњїњјћљћњ§ћ§ћўћ§љћћ§ћўћўњ§њўћў<;8ˆўў§ћњ§љћљћњўћўћ§љљјњјћњ§ћ§љ§ћћо§њўћ§њ§њўћўћ§њ§C;;1>:?AFOUjw`jŠY…ўўіћљћљ§њ§ћ§ћћуўњћјћїћњ§ћћљ§њ§њ§ћў§ўњўћў§ўћ§§ь-C+;C;>:@@;5GS[C.,žўўЋњ§њўњћјњљ§ћўњћљљјћњћћ§њ§њўћ§ћўћўћўњўћ§ћў§ўBU5%;hFCPP@9V–Їg`>]дўўћ§§ўћўњћњћњ§њњљјљ§љ§ћћ№ўћў§ћњ§њ§ћ§ћў§ў§§ЭNGCBЭўўћћњ§њ§њ§ћўћўћ§њћљњћћ§§ћ§ћўћўћ§њўћў§ў§ўњ§њ§.PVBCFAGFJQG@CAgoFIИўўњ§ћўњ§њћћўћћњћљћј§њ§њ§ћўћўћћњ§њ§њ§њў§ў§ўћўE@GE7NJENMTUc„YCўў§§њ§њ§ћўћћЬ§њћљњљћњўћўњ§њ§њ§њ§ћ§§ўћћ§ў§§ћўPJL\EGLGMQVVSVWQTA:aўўћф§ћўћ§ћ§њ§њњјљјћћўњ§§ћћ§њ§њўћћиўћўњ§ћћњўeT3CNNLMZWSNZ\]YQCBLдўў§њ§њ§њ§ћћШ§њјѕњљњњўћўћ§§ўћ§ћ§љћњў§ўћўњћњћ˜wCIIFio\N2@03813?5IE31*:J`‚БануюхсгЫУЩШЯдзнйазсцзЩШЦббемйкєТ›ЋЌ”КсхкЯй03583-39+0$14>J><<;33F\ŽНжэхйЦМУагнтпкднпрЮамурлушунКЃЦЯЛЪЯжйй2-42)%*%%3579$+0?YC>1FMZm‰ЗыјєѓѕюёшцчццрЮЫЦжстурткрнмм€­ЦЖУкшыю,2.--%&%#(*!,@><:@GA?#7@2:JS[eЧєѕчёјђюпРКйрмнйбжйрчтлкцшщтмну(18,)$:+*(.:95&489FIL;423*EC9>880.2C@?LN@YcQSSPV>Tc[v—ЃАйюлзьїэскксшцлг&4,*1YnE7+,@C?;7*-?GB2"#2;C28;?FH>:)+B?>;:&)0AF9*(#$$JPOLACHELCGJPMGEA@GA>1C@B5&GOLPYS;0L&+*,0&%-01;A27;812.781)&(Yd-!8>FGAA€™FP0*.:C?<;>:>>;>9,@n[47B.&-!(03;4+(57-!"82;#+!B<5+4?<59AA8;7+.5FB@0*:?:BEA.(7,(4()"+*%1,8)2-&-05,.4-$-713-2+284:10.95<89?BFC@9>HNTNC@>5@>><<187:<4>.*,,-80"$*211:&)-ACCAA.;:50+#$"32. 5.--74<9>>55.443422.$.7#**&571:@?24%++*0554,4?A,>A>,*&BMLG돘|ˆi(!#5.98><;2448-..,@C:3.&3.@CI>8;>:9;B@9-43:3;B732.A@<5љћ§ћўўёЭАa;3,25-1&+97047@@+&)047CIM:;@AA:?HNEA5153241;7>411ђђшєљњ§љўыЯ•77-0,;1>;5,033š*.*)*0,;7"$%?B99?:;8?>7?954;@9:*2єєѓѓєєѓђђѓѕњ§§ђтЪq9>9<;7948A54,-%.*..%19!9eE9450123<@>2<432:<43;ѕєѓѓєєЪѓєєѓёёѕљ§ўпА~M:4#%2*2588?>C7?>;C?ABE8,+.32538<11-5-:33§ђѕєєѕћєѓёєѕѕЭїѕјј§§ўюЫ{I-;G8BEHNJHFF@704471,?FNL;?7791)4-;>85ѕјјљєѓѕљїљїї§ѕєѕѕќїћњ§§зўЛ…c]T>5B?9IGFBAI>C;APEMHFCBE?58.,.?7>ђєѕѕїќљјїѕѕўєѕѕбћ§§љяЪžˆWA>IPI9MNLLJSN?EFFEBE@8:-38;?єѕїїѓѕљєѕѕїѓяђєїѕєѓђђгюєѓѕїљј§ћћєеЪИ’xqPB28;INQN<AIA>CC@:PGWP?A3Ngu‘ФчюјљњїюычтцчыюяёѓёяюяђёѓђѕѕєєѕўшЪммЩньяёѓю;;<<:89471877AF\LCLE8A\hЃзѓњўїуэюэѓѓЧёѓђѓюђёђѓѓєёѓѓѕшаесынцяєїѕ7>900,1*11747:AC>CM^OCCB>AITSJEFFC>qrQ?7IcmЌТОУЕФнјўў€‹њљѕюььюёяѕѓѓђяяь4B>448AG@:458;7>ABCGLEF@B@35BNMYLG\gZ[YacI\qd{ЃЗШтљљєћў§їёѓђђюяё-01.38^gE<:3:BJCA<>?GJH@@BBJEF@BMIIJ@52JWUUqW7;?QJnА”ОШућўў€!њїј01-2+.179312378AJG@;AGFNOGGCEFAAFNPUTLHJIMLFOS>?57:EGSL5001,FNQMGEGNNJGPVQMGFHMI>GLOI;7UZPU`ZFBZ%#2820214;B998:>5+.5@8.971T}e:"7FB@HGELW;89?BGC?EGE@EBF4Ht];F<(+,43GG40.59>ACF@?>:9799€Ь<><;4<;;7:A<@EHEGAEHMOOMJIFFGBFG38!..14-2*-15..-1.019887718B@@BAEGIIC?@5;<@;97518>GMNLJG@F>A>BFE1 2(&4378;:9<773<8;;114..72.5;AC>AEA95210.7327;@FB;;::ь>CCA:>:5;BA;8>AEAAћўўМњ§юЮВƒ]: +544:312:859AF?;5239@?>B@@;?BF?:AGE?483їѕѕїТѕѓєєљћўўђцШn5E878934507.*,24:548;;&?eH<:9;95:;?<>7::<;58;7јїѕїїѕїХѕѓєљњў§лИ~J4.!0#074:@C;B?<@<:BJ@<,159;::754788084795љјїѕљјјї§јїјјљьњћўў§ыЭžxG(.A);>EBEBBх?838;<7;<>JLA8<;47;598>@<јїїј§љјљљјўљўўећЗ‚^^Z?399*CIF??@E@G?:JBHHFGIGBFGCBCHA3400;>љјљћ§љјјэїјљјљјјїѕѓїѕјїїјљћўўнѕлШЖvhPG1::GILHFCGFEEFHFE:8E@љљјјљљќјѕїјјўїјјјїјїѕїјљњњјї§љћўўаєкНžŒi`;SWNG0>?8@GN`EC?>>љљјљљїѕїїјљјљњљљјњњћ§њњйћњњљјїјїѕѓєїљ§ў§ясеЕЧЅnVwoaZIOUH?:CB9Eљљјљљјљљњњљљњі§ћњљњњљјѕїїўјїїѕќїљњўўнёЫйЧžŸ‡gpeopTM;Jњљљјјљјљњљљњћћ§ћњњљљўњјјјїјњљљјјїїфјїѕѕїјјїєєѕњїћјњўрЉЄЅЋЖЉ}}…љљіњљљјљњћњљњњќћњљњњњћњњљњљљїјљљјјљљјїїјїўѕїїјцљћљєњшЖЖВњљњљњљњњћћњњљњљљњњљћўљњњ§љњљљњћ§ћњњљљњњљњљјљјјўїјјћѓўњћєњњћћ§ћњњљљјњћљњњљљњњљљњћњћљњњцљћњћњћњњљњњљјјїїјїјјїјљјљјјїюјљњљјљњљњњљћљњљїїјјљўїјјјљјљњїљљњњљїјљњњљјјљњњљјѕљјјїљњљљјјљљїєїјїўѕјјњљњњљљњњљјњўћњњўљјјєњљљјљљјјњњљјјіљјљјјљљјїјјїјјљњљљњљњњќјљљњњ§љћљљћјћљљјј§їљњњјљўћљљњћњљљњљљћјљњћњњўћњњљќјїјљљјѓњљјљљїїјјѕїѕїїўјљљїјљљњњљћљњњќљћљћћ§њћљљъњљњљјїїјљњњћћ§њћњћњћ§ћћіљјљљњљљјјљљјјїѕјљјљјјљјўїјјљќјљљњњ№љњњљњњћњћљљњћљљњњћёњћћњњљњњљјњљљњљљјјїїјјљњћћљњњљњњљљјјљњћјљњљњњћћљљњљўјњњљќјљњљљўњљљўњљљњљђћњњћњњ§њћњћњњљљњњћњћћ§њњљњўљњњљўћњњљњљљћњњћћњљљњёћњ§ћ§ў§ћ§ћ§ћ§њћћўњћћўљњњљљњљљњљћћњљљњћњњљњњќћњћњњѕљњљњћњњљљјњњљўњћћўњћћ§ўњћћјњћњјљљњћћњў§ћћѕ§њњљјњћњћњћћњђљњљјњћњњјљњњљјјљњјљјјљљјјљљћјљјљњњјћ§ћњљњњ§§ћњѓћњ§њљљћћњњћњћћњћіњћњњћљљїјљљћњљјјљљњћљњћ§ћћњїљћћњњћћ§њњјћњњћњ§њљљјњѕїјљљњњѓљњљњћћ§ћ§§ћњћћўњћћњўљћћњ§ћ§ћћњњћњљјњљ§њћњњљэћљњћћњњљњљњљњњћћњњћћњњљњљћљњњћћ§ћљњњўљњњўјњњёћ§њњћњњћћњћњљљјјљњћљњћћњњўћњњљћњћњћњљљћќњ§ћњњѕљњљћћљњћћњћћѕ§ћ§§ћћ§њћњљљњ§љћњњќ§њљњњяћљњћћ§њєђђѕљњћ§ћњњћњќћњљњњљћњњћћњћћіњјљњћћ§ўўћћњћњћњ§њљћјјљ§ћ§§§њ§ћћњљљњљљњљњњыљњљњћњ§њњћћ§ћћ§ћ§§ўў§§ќћ§ћ§§іћ§њћћњћ§§њњњљњњљњћћў§ћћўљњњі§ћ§ћ§њњљњљљэћњћ§§ћћљљћ§ћћњћњћћ§§ћћ§§ћњњљќњћћљљћўњ§§œчхєў§шмжкЦТЩШЩЩЫЫзкчсщштцђѓїѓѕєєёухзааЯднщььсЭЪкчсдТЧЮЯгжщэёщцшутнаменмжжнлмаЧЯхнсццтшцхшцмчьэшьптрхх€ЁчккпкхмзднххпЭЫжлмнзьэсзйкЯпЯЏЖВМЦЪжррмпскжтштедзсыышяреньцшщюцтхэьычыццстмчыыщцспЩерщынЦМТЕЗЋЋБЖЗИШЩЦЯеЮеЩЫЧЪкбабЪУШзюјјўяѓююьюёщпйкыяэюылцхцэьпртщуюыуЯУЁЋОМЏКЎЎНнМЗФТУЛЃЃМыунзШЋЅ•œЂЄКЪшёюьёььэьчцучч€.ыьюѓьяшмззпычнлзкчбйукИККЗФШТЧЕЅŠАЭцшьыьФТЖ•ЊКШямньєёђэуймгЩШхцшцщђѓђьлдбзтццшэѕыщшяѓњзхднмдЦНИОЕцхѓёѓяяљђкчђћўўѓєящшёяячяьтрьёђђєьычѓьяююёђухущкеучэѓхцныщрЦЧЫУШпдакндущуплпющшэящжЯзрщшцпсчьмхшёёѕђѓцтыютщяэтлдкнлтхцэчюшпклупесжЭЫжЯджемзкэщьюєёщпйлтнсспштаЮЮмыѓютмзкелюёужеулййжгдщѓїђюуяэчлнлтпбЪЮФйпхэытлуунпдгЪакьщщцтндхщщьяђььюырчхеЫЯщЧзсёщшёяєїјяёюукабЮеждбЫлэђщхрлсузЭШОЫшчщяїяэсттжрупшяютпгЯбЮЪзuЦьёчћўннўўђухуйрутппулнбляыцчрлхшнбтпьщёюёцяьыэцручткышшщщжпгзTeƒkdjƒvtžЪыїљўёхёђєєѓыщэщчыцпЯЭЩнщуаЮТехулЧШЯйххтьѓѓѕєїђьшэюьэшPojGJWPIG]kk}ЛљўўћяўўїюьшщшёудбкЪЪгклрммйнйЮШЫЩЪЯкнчуюёэёэющяїѕї\aa`\Y^Q[`O[TPpбйљўѕчхьщпсплрђђёђѕѕђьёёыбаййгсыщшьюьщшытыѕюяхыU^WZTZSSET[Qc]NO@Ugu”ШщэѓўјљцлжеаеушщэтшяѓьцуцьёяѓьёўжЌФОЇЯяѓщхёJLHOHLBMFG@EIQVgNTQMGJ`xЃкѓўѕюззршэѓђёысяёьушєѕєьїєѕђдВБкуЭсчыюѓIOJM@H9F>@BGMPSWATYv^LIZbxŽŸЫўўв§єєѓїїєтщтяѕїёїєѓєѓэёюмЪмщѕѕјECJ@BF4NELAINPWYUUэ`UO?S]QU^gu~˜ЎпўўњўўКњёбЮщюэђщуцщяєэєѕђѓѕяёєј>MMYFICGFM@HSOOVLSQbh^`SOTOT‚…eZBUpzŽБЩЦУМШйѓўўКїєятмршѕѕїѕѕюэщхJJPJEFOZTGHc…xM5WZd\YPicqLTMPVYTUP\S^OUYEO}jGFZ?:9C7B.@EOYOIJQSFOFPOP;?0)911:LP?BI:F7BFLBFEFJHIOQFEEPN]TMY^\\ab\TWOTQIEILGPPZgdd``ZTWQSUTU4!8899BA:FBHMJHHAULHF@CHFGCIJNUTVUMYTOBCBOISQJIVWZQZ[LNQVbb\чЦА—œ}HNC40$&3@GAOIJNHBMQOJIPTYSHIJQ^ge\PWVTPOY\WVQVHTW\WLMU[`TZўўПњсТ™m?##%2>ALM@INCNMJW]VVJNLLTWgZPTS[Y[Y]a]WSOVOSSUOZMMTQљћјњј§ўўПљнЉBE<--@>GJMIIHIPMFBCJEBCGJQ:LHTTPTUSQTOI[V]UQVWTJFGј§љљњњїњјћ§ўўП§д‚GSLL>FF@EICGILMGPQH>T^SQTVJ\QSVQMWOTSNONOMљњї§јњј§їњјљїњ§ўўЩыЩS>:(#;58A.4<5NdrИжИНйЭМЁМЭеглмЯгЫЩОТСБЈЉРНБ™‚…Ѕ™‚˜ШКЌЈЉЏМОТЧЫЧЩаюѕAMGGHHOI\V;37AEG>B?>U?.P:-@YoœŸ‹›žЧщјжмшєычЯЫймзебкаУЛЛЧЫОЖЏЃЅОУББЌЏЃЃДД<379879AA775@BG;<:%<1-;7PZ`•Œ—ЏбусёяьйеншртццххтгФЪЭТЫжуРЦйлЦЖФб>::€†?758,5@;4,3>A@@452:8:LQTVVQ[VqбсКЛЉЦєэпяшйяхлФлзЪдьмИž‰˜‡bbW0%+08-)15&+3*#3>HEFA07A*-A@AF(7Q[VPH37C@?>5:AFMHJJE9!Nr[GJ^mA7BCFZTGEPTJIJGAE4,Pbn[8759A?;BCBA@?948?CBGF@;4;9GMTHHPVQVYbYPLGF;HJHGFLMPMI@I.44CaHNA5@G73$.)&1>;3:4-+7?CGB?59:73(47NG3.B;<>EC<@Vb[\SMJE;2945+82208@77B€s;?7EIILA3-07248;7943:24;?:9C;3;(5@B;?4JONIIA>;>9.-*01&$&;7*8;1:;:037.098700+5<488>3?258@4),394A><@>;?B<>;40;@4:7CA:<4-79?A8,2?B>9>A@C@58;>7.2-:;3%(*0048:33??801*B>.;15?5:2*88@@979542:?>8+.19-7-28.)SUNLF>8@::CEBFCEF@C9C:>?>303;:0&%023+57;5,%,2,143;:07589.(%.9857@AAB9>57040:<3?983A<,717*105:834312>9>2&$)+5HBC>шШМ|w…\*,&%4:3+298))*.)497:1-<:0љјїљљїњ§ћћ§§ў§јзб’^T.<9<473їѕѓєєѓљєѕєђѕљ§§ЫўпЋtQrFIadO7ISMNP+H\84"17.55..4$)()**")-+&2%.јјљїїѕњѕѕїХљјѕєѓєѕѕћ§§ћя‘`H>NEgL#>4,38<<:8;EEAA78?FCGEH9;24<;WagžЇОсцчћўїчыјћѓђёяэюььшшццяыљуёњўёзхёE>:?:9>>€M;<>>:4.48BHNLEAAB:>B44BEFJ.Nmg+A;;5-2:9?>EGE7>9?EFBAEHEQNGPSI?"U~bHVkmB:HCQYZMJWZQPOMJN55#Thv^1<;:?@@EEFHIBE<9>BCFMHAA;AGUNNAU\PQ\cb[YQGGILIHJMMNNBCJ939LbON?8817899>HG@B<;@IMPOQMNQ`ˆ{BJG??CPPMNQLCBBCG45:@ACCHJC::92,25;NMCAA?€}>@>AA9<89<<@FBEIB#(i}T:A@@E[d``[NCA9;?<;9>9@C?C?@5JQMNHF<<;?>:9::74>C<:7ACF>?B@HEE@;48?A:;8>BAA@BBE?CABB;9<@@HILHEBAGHGE><;HC?4:?A>>?95535:<:@CH?<5499:324AIFBHC>;:@AJJEB?979:B;-**,).39?;:4;HCGIHA?:;<:8:9;?<99A@A52YH@QC@>A>@>?@8oWOA595498;7?E?:.783;7>AE@?>>;@@><8.-97828987.(SNML@:A@<8;@@;>A?A><9;99Ж847732347957594:557:;9:?@><8;?<5314>B@4…t`ZmaWE@5>85,3947?>?73)5-)023134:<<9„15,.8;94554:E?>хУКŽx|q|‰W)+(+8-1.0.1(+$**078551?@ACC::4-1171((,07?;33:@><>499ћў§юцмЫчюжйЮЌ|S>N0)-;+"B+,5;<?O];GQC*29@C.4213+&%,14,&+$$(-*%)&1780113љјїїўѕїїјќѕјћўўЯ§пЌxYqJN[[J;VWTUVHhS3;;8@V2)94.39@7-2>5BјјљљўјљљјљјљЭјћ§ўўђуШВœg{zG9O;UqZ9ACI:BAZYNVPcYVB89QTTVSNSFLJOOZZQWN[[c^jgkcmwЃ—V`ZUS\iciddZ^[V^`JHQYZV][[^UNMMJVLVhbQZYYNSWVTYUWMOOPL[Y]]\S5F˜jQWQ[Vnƒ{xkabPYPTSSOJMJNOUPGLJU\VZZ€aM]adUTPSNNQMQTPNONMa[^QUTSJUBQ[VZSIgab`hW\S[QSMNNGFFMJHLJSVUWWMUQ]PUJGITNSHIJSTVQYQYMNQYQIJNGPQZZYWUT[[]UMMJY\SSPU[YQQPPONMTH[NeYZOQHMMOOQJMTQQPISSQQ^a[YVZSPZ\]b`UYWV^TYUTYWUNOETYUOQTTNOPLINNFGMQ^ZSTVYMJNZUZHWSVZY\[UNZQ\YPSJLPPOMOTVTE5jSV]SLWUQJQNWQˆkhQVOLJENUTQTUIQLGPTQVOZUWW‹OPQWNUSTQPMMVPMPITHC.?a\OLLBLPIUBMLQSSOLIUOFFNFIGMCCFFMGIHI>G>>E5<9H483>:ECH>LLHLONH;@?GHHEFFE?CQOAEGOSMLTMOўўП§єчгѓњтшнИŽ\Q]B13CJ:89?@BE7<7:3BCIHДАЗФЦРНдйзЭТЗММРШОШзбЧЭдЧЫчющѓчюјљїшЦРсыУБДСЊ…qiTA5&9C<]eLEJOWUАЦЦЧдыыЫааООЉЎНьпИЈ”•™ЗВФщшРЈ–vƒ‡odUF[j`VOOULEY\E;;?>CGFHFGJPLNКФЖЧзНЌ™ЗууТЇ”žЄ„PUG?GSSIN[\YOMEo|ƒŽpINS]\J;;@@?4*+23?-РŸ‚rgQWPTZ[OQOQMHOSLMON:4VzbYM42YVTSIGPJJHNJPIG?4:;:92<5VTZ]WNMbI05AAE>GE@MLEOA?7NN>EE?:GEISLOPUTPPLFBEA<97B<>?AIB;CHBA?:B:395AJ27?9>B:@GLOM@C?@9?FF@::?;>CEHLONTGHGG?;975;<927253.;>8.7FABGA85?A>BGAC;>@AAЉ>;?@EFCC9:;B73AA@<5;C@AC977-%+.+",15:EJG@7GGCIB.*354;8;A3A5:@A??;A?<>EBGE4@?F@>3#%5:33К2.-,,01&$,,7B:8<5C>74**$2)0?E?24-AE:8<8AC@:<9?>E>?BB0,424499:-,*&&€ѕ"-*)18F?:88:>?<@>@@<++9EJC:92;B2.38BB;959:9.8@@:244)#&,7:24:7-(0",-&&00)*(,.1??B>>BI@<727AA2*+71"(.*((%-3,5,57B;3;.*!+,0.4<?<;5--,2);:A?FJF<.;B79;04325*&((%,59>4>FBC??7511-03"*091:AA::€3<7<78@FE><<4;3>BFCA??B;B7,()"&1*.31,)00>BEB$&+(#8BC88)),<<@CG;2;77@8:18497758>>5.)8)2??5,,$()&*#+)(("+A9.:*(),+,-0**.10858:;;1,5;>8--+9<;:?B{M"5M<&,2;14%.#%>@?>,2<;?Nh<422929:4*0B9;:@B?@@:A:<<25053.022;^J)3ZuF*;LJJ?98HFEGIC@:B<74**)4OdNVU:33JOW^H8:*05?:Jt–Иш§§љљ95.17@CB<@GI@B?:9?C>>EE534).@I?FbY\gA;k}WB:Ck‡Šp]SiƒŸДЮэ§§ћђэыюѓ,*.97&779BF;,<9##)+3,8>CFZpŽЌТКЯрдч§щрєљьШЪєў§§іѕшћ§§ћћѓєђђяцJ7?LLE9FebOM?9>d‰’Даыѓўў§§ыљїљћљїїєєљїѕїёяђђїјѕђђћѓѕђѓђђюѓє]kn|‰АЮЧЁКсђћ§§ѓњїїћїјїђѓєѓѓєєѓљєѓѕѓѓђєєќѕєєѓѓчєѓѓђђёёэњњ§§ћћ§љњњћ§њїјјєєўѕєєюѕјђѕјѕѕјїљјѓђђѓєїѕѕјїјїїњњѕїїќѕєѕєєћ§љјѕѓѓёѕїїѕѕєєїјєѓєѓђєєѓўђѓѓћђёёђѓѓєщђѓђѓѓєєїјњјѕїїјїѓђєїљљїїќњјѕєєѕчјѕїѓѓєєѓєєѓєїєђѓѓєєјѕїѕѕєєњѕєєїїєєѕнєѕѕїїјјѕїїљѕѕљїѕєєѓєѕѕєѕѕїјѕїјѕѕєѕєєіїѕјљїїѕјїєєьѓєјљјїљїњћњјјїїљјѕѓѕѕјєѓєѕљїјѕѕ§јѕєєћѕїљљѕѕъїљљїљѕєєїєѕѕљїїљѕїїљѕєєёѕѓєїєѕљїњѕѓєєѕїїњѕљљѕѕєє№ѕјїїѕєљѕѕєјїљїљїїїјњїјјѕљѕїїјњјњњљїїѕѕћєѕѕїљљсѕїїњјљњїїљјјљѕїїјњљѕєѕїјѕєєѕљїѕѕїћѕєїїљљќїјњїїќѕїїѕѕїўњїїѕњєїјјћјјљїѕїњљљѕѕєљѕљїљјєѕѕјєїњњјїљїїўљїїѕїїњјљљѕјјћјјњњїѕѕєѕѕўїѕѕѓєѕєїїђїїѕєѓёѕѕњѓєѕїїѕѕ§єѕїїђљѕїљїїѓїњјїѕђїїјїјіћ§љјњјјњљїїјњсјњњїљјњљїњљљћљјњјњњјњїљїљїјјѕѕєєћїѕѕљјјћьљћњ§§ћљњњћљћјїљїјїњћћћљјїљјјїїјњїљјњњјјўљїїќјїєјјѓїњјјїљїѕѕєїєїї§љјєєѕїољїљѕїјјљњјјїљїїњѕљљњљљјњњїѕєїњјјњїїѕїњъѕїѕѕєёѕљљјѕјјїјљљјњїљѕѕћљћћјїїёјїљљњјњјїїљїјњїїљјыњїјїјїљјљєѕїѓїїєѕєєѕїїѕїљїљїђјњњїѕєѕєєѕїљѕљљљїјјњјњљљјмњјјїїљїњћљњњјљїѕїїјњїљѕѕљїљѕѕљјљїѕјѕѕ№їјњјњїїњјњјјњїїјУюљєѓяюьщхттхьёюшшщщхснртчыщчшщшцщэёѓєђюёёяёюѓђєѕѓѕѕѓѕђэььыьышш’цшсуэцгхцтмлмучшщьщчусцутсттпкзлмчјђѓѕѕїђѓёёяёђєёёяяююьшщьыьющычштйдйезнсуутучююёющытцшспрчшщункгцуьёёяяюэшэщююЗьыьэяююёёяяьяяэюмпФЗШаднтцыыљїјѕцйцлмклкллуутхсцчуучэёюяёьщыьыэьяяьюёёђѓёёхђююёхњхЫежмнпхцюмЩЯаКРЩаЯаддшйпхцуппмрнхыьээяёђёюяёяёёШђюяѓяѓёяюььээчхслжжзйнрмзйлпмжЯЯЭЭгабдзсхчычцчьюэщэёёєѓєє€ŒѕєѓђяђёюэђёяяюээьюёшшььўчнмннзбеклнлкеаЯадйлмрушщььяэыщььэюяѓєєјїѕєѓѓёычшщьюьюэьэяђхухухнгдеддбжкЯапсштсзйхшчщшыщшчыьэыыщыюёяѓєєѕєёяяюяычшюёёўэёёэєлйнстьыннѕћслнрђьээЌщххсснпмлнсцчьэьычэяяєѓѓёёэююяѓёяэююяяёяэююяшщщчщььышсмййлсцуэнЭеуцтрнсрннсуыщыььыьяяќђыщььіёђђѓѓёёђёююэыюяшшщяшчтрнпсуѓышунмппБстртцччцтутсррхцххцюяэыыььюэяёђёяёѓѓёђёђѓяянсхутутсцѓѕњўўјљшцхцурпнтчьяэщычтнпхх€ТцшэюђђяычшщььюђєєђѓђђѓєђёюттчшшщыююяєёяяњуЫлжпспрппчщщшчутсцччјююёђєєђѓяяьщшьяёђєѕѓюэщыышштмыяцшѓяышѕшннпйЭЯюэццттнртрснкммцщюѓюёѓєѕєєђяёѓёёђёѓђѓёђяюцчшщыЮНСЋЁОсццснезмтцнућњэщчмнпущшутсрчыьюяёѓѓўѕѓѓмєђёђёёѓѓёяёьццчушьзЦБЄЮђїтсплпкпуѕяёёюьцхущщышыщыщцпэђяёё§ѓђєєЪѓђєѓђёєѓёєёющьщьэюђьязЯеШЫстрпсспаёёђёэюыёюяьюыщчхщюяѓѓжђяђѓєђёђёєѓѕѓѓєєѕђђѓёѓѕїѕїцѓкнлннтхущцщээђђйщеЮхщяяёьыышшюёѓјїѓђѕёѓєђёяюёђђєєѓѓђєѓѕѕїљЪчхсрпмжйтчщыэьюээдЫйлйяёяььыэыыьэюѓяѓєђѕѕєѓёёююђєѕѓѓѕѓѓєўѕјјЦплрнрпуцщээщтмуыћюнгпюћюэщяэююяяюяђюяыяђђѓѓёђђєѕєѕїѕєєѕѕїјјЭхтуухщьэяэшнппцщыьыхуушыьыыьюђяђђяюэыэьяђєѓєѕєѕїјїјјЩљјїјјїїјјљјннтцщыыьюыхплпртсуцстцчцшчшыёђѓєѕђѓэььюђєѕѕїїчљњјљјїїјїјїѕћ§ўФОнхцсннсххншчьыэььштхыышптщэђѓєјјєђђяђѕїјїїјјљљіјїєѕєєѕїїўўцюрЪЪжыщщунлхщьэьэяёёяьээјўўтяэяјїєєѕјјєѕїїљјљљјјњљљњјјљјћўўуыМpbSбуѕснмнсчщыщыьяююэюэыэђђѓђѕѓєѕїѕїѕѕєѕїјїїмјїљїљўўћуЦН’[UQJG.ёсплмкзцььыущыээьююјьяьщщэяђђћєѕїїєєњћ§ў§§ўўщћј§чппДˆdHIFуцшшьььяэыццхщыючѓѓђшхёяь§ўў§њћўў€ВюЫЦуэФЗЖСЊ•Šuo\G8(??C^kPIJOSWрпхшыўћщьюушппїўћйаВЎЉЈТНбёёШЌ—|Ž‘ziVG^ui\TPZOI`cLGIHJLLEJMQTцырьєпШНеўўмТЏЕВ—d^SPOaaPT`jdSQJvƒ‰ŽqOSYagL8FIMMHHCB@AA?:>987:@+сКžƒxhj^ijg^^V[TOW`OUU€‰?;a}n]Q98^WWVESVOQUOLJNJC@?@B>;;@A>?CEGB>a`d[ST]iP:AFMFFSMPQSSJNB9ACPYPPVTU[VJFGF?;>A><;CGA<@EHJB<<:>:7;:>;?9QJIHFBFGGJHBHAB?EHFABCCхFGB?@A>;<@FA<4?GA@?A<5345522,€у2:BCILFCMEIE<8:9>@><@BG9@BGB?9ABC@CFI@?EABAEC7.149;8995,144,$$*(#7CBC>30C>>2*0+3302.:@@<8AEFA<8>BB>;;?>BEFBC>3*534399:40+*-,$%,,.1;AC@92<>?@;??@;873ILI@:?@;0054584.-:;1&%)-*,4791,**.,.5?@:@:;4958479CBB<>9;8::B>:<88€Ÿ3135579<81*&42-.3.5400-+0;GE>47;?<9474379;;8:8A>CCB@<@:9798<@CFCEHBA>;?B?8022:7<@ACCE?>7:<:3849<>91+-%*2;<>?@?IB@>?798<:11.58;9:<5M?528A@:;<3,1-2><8<>:;CA974078?@4,-17;??B<833,+-0112180)*((!,537;-25545CB<8257?A?E@<57@>99:38:?@33179<:?B7724-,!"()&.+#!)*+,3<;7,*-*047AC<10.37:92849:9,+270"$-).-0310**$%,,03.*43&940-13393..2598:<>@72018722.0,2783>n?0J9$,421(3,.#)?;BA48@@Tj4-.339>@774,54;@CA;5338858253355415TG+4UoE37NFLGGC9@\]IE5+;h•Клѕ2188:;<BAA>::?<@BB>>;>7:<-%%.LaSQW7:4CJVbE5;.,4@>;>7;;557873:8*1"(BF@Ha]\hA8p‚WI:Hh‹oZUn„ŸИаюўўЭѕюђѕѕ**04:-B;:;A1013+*#*4028C@Su‘БЧОдтйэ§ьрѕўэЪЫђ§ўўќїцљўў§њјєєїцA0;IPG>IoiPIE;@c‚”›Жжэё§ћўўЯ§љћўћљљјјћњјєєѓєѓљњјєѕєѕєїѕєѓєєѕїbku‚ˆƒИдЭЈОпьљўўєљњњљњљѕјїѕѕїїјѕєѕѕїїєѕѕїћљјїїѕѕѕїјѕєєѓђщњ§ўўјћ§ўў§ћњїї§љјїїюјїљјїјјїљјїѕєѕѕїѕјјјљїљљњљњљљјїщўћњјѕєѕїјљљјјѕїѕїїјїѕѕїїѕєѕїѕљєѕїїјљњњљўїѕѕћјљјјљљњњјїѕїјј§їјѕѕїћѕїѕїѕѕїћјљјјїїіјїїѕѕїљјљјјљїіјљљјњљјљјїїјіљїјѕїјјїјїїіѕјїјљљјїѕїїяјњљјљљћљњњљљјїјїјјјїѕїјјљїјј§їјїї§јљјјѕљјјљјјїїѕїјјљјљ№јљљїїјјїѕїјјћљјїїўјљљўњјјїћјїљљјјїћљјљјљљјњљљїїјјљљљњљњјљљјјўљјјљ§њћљљъјњњјњљљњљјјїјљїјїїјјљјјљјљј§љњљљјљјўљњњћљњљљјјїјќљјїјјљќњљјљљўјљљјљўњјјњљјќњљљјјќљјјљљќјїѕјјїўјљљћњљјјљљљјљљјљљњњ§љјљљњ§ћљњњћљњљњњљјљљњљўњљљљјњљјљљћћыњљњљњњљљјљјљїїјјїѕјљјјњтћњћњ§ћ§њћљњњћњњљјљњљљњћњћћњљјњњїљњњљјњљљњњўјљљќњћћњњѓћљњњљјљљјјѕјљљўјїїјљђјљјјљњњћљњњљјљљјїњћћњњљљјљљњљќјїјљљљњјѕјјїјјєїјїїљњћћњљљјјьћњњљљћњљјјљњљњљљјљњљљјњїљћњљїљјњјј§љњљљћјїјјљљјљјљјљўњљљјђљјњјљјљљњњљњљћћњъљњњљљјљљћћњљњјљјљљњљљјјўљјјњњјљјїјјњљњљњњљљ§њљњњљї€žшяшяытдгЪУШгбпутегЭУООЗСгпкебгбЧЦЮмщщцзгекджЯлцыэёђєюшсбЧЭбзздЮжЭЫекЫАЦЭКБВШЭйгЫШЭСЖРЫЩЦЮЯЧСБЌЖКФёэѕєёшщэѓяёыыюђяэщцлмкЯЩкмаЭФФШФИЋАЛВОУЦНКФасцяшуШРУЯУИНТЫЭСББ€иЭШЭдушцхеЫЦажнйегЮЭЯбдлснтухрршхМФœŽ˜ЃЖМРЫЩкёьэшЫОЫНОШОИЛУЯзЭУЭкйаСЫкнусЮбгФЦблулпуцхыэышщьхйртшмыЫЄЎБВИРЦгпЏЁЇЂŠ–™ЃЉЏВЋАТЯЧМККЗИУШЯнхьшысхцндзплйуцштчлйзеббЫзгЭУНЗЌЅЌЎЖМЗЏЗРЛžЃЁ›žЉВЕЋЏИеммаЪЯжЭЪбптхшёёѓэёюььэцнлкбмчюхзЭЮгрЫжпрѕЭЕУЭЫРБЎКШЦНКВЈžЈЏДКЦФЪЪбемзумйгсмпссшэѓјїѕэрейЩЮбкйлкеадлюФЪЯгЪЧЖБЅЊЁŸЇЎЄЊКОЫЧФБДЧЦШЯртлЭЧЭрлзаддрмхэїѕјѓьунлеЯбЪгксххтчьяЛОНУЩзаЦЗрцРНЗИзрццснбЪЫСИИКИЛЗМЫнмгайзепхыёюрнрршцшугамчюндмцшьЪдЮабмссаЧОЛЖРУШЯмОЄВЫШСКУТНЛНМШЦджлеЯЭдуьнжЯЮЮжкчьытмлмрцстмнспархрмзЧФЦМЛЩйаНЗБЕДВДУОИЛЭзаРЗАРЛЕИУОСЪклпмжелбдпээьыюьёэщцхцчщыРРУЮЧУФМТцьљў§щюйннЪКОТТЧЪЯбзлдЪРЛЗФдЪНЪжхутхсЩФШЮЯзтчуюёђьђђѓьчЧЦЩаТЪнужтцшэђјЭЊЖНЛРЩОВКШгммеФОЮУОдяцсцыэяютлЮдбгЭзуюыючыхуплпрОМЭйЯйзненцйУТНЖЌЏаЯФШдФОТНЛКВБДЧзнйзьэяюяьыыэхышщэыьюёєымЮЫЩЧЧࣘ›„u”УдШИЕЖЖДЖНИФыѓмжЩОБМТЦФЛВЕНЯдкррхэёёяёэыцхщцушнйныхлбЮадЮеЈ•}xВруЯОЛИЖИОШрлчхмбЮЦЦУЮлрйездЧЛжрчхсхыяшурчььчущээыннелбЯалнтЯЯЌЇЎЅЃКЖЕМЧЛДЄхщёьшлсттнумжЫУЩЯецэђыпмучђёюшцыяяююээєёэтрыёяѓђїжхКРФВУмпгЧнтллхттЭЗЇЦзкзгЩЧЪйртчђяёютмшэяшпжмхццурцэђюяяƒѓїєєїњзЮФНМЗИЦЮЮгтпййтгКЃЎБВетцуйбйраЫеьёёэюяѓяђчкЭлччьяёшцышьюєѕљјњљљЛМУОЗУМЩкзадЪЧЯшядЖЏУмњьщхЫлшытпчэхчпэщёђёэысхуёѕѓююѓєяя‡ѕљњљњјљЦЪЩЪЭамщусЮУЗФЯзцшгЯЪУЯкждЯекнюёычтЯЪеллхщыђёёѓњљјѕјѕєїјїњјњљћљљбРИЯЫамчнпЯМОЦСРЮЭОЧКЕЧзйгзссшщьыьыщкзнцюђёѕѓєјљјљљїњљљѕћњњјўў’Ё™МлмЮУЦЮЭЧЛМЫбхсрЮУММРШШСЛЩзтэђяѓяублщђєѕєјєљјћїљјїїљјњєљ§ўўљымžВЫмйЦМЖЗЯтркземррлгЮюўўїтехяђѓєѕљєђяєјљјћљћљњњћљјњљўўиїЮŸueŸФтеЭОЕУйыхммпйыююпежцѓѕѓяьђёѓэёѓјјљњјјїљјњњћўЮюаЩЁnhe`YBнЦЦФИЛЖетрЭагтйтчщэцчыкпкгкхшёяѓѓѕѕїєѕ§ўўгѕщчЦ™uOTdSJV[ceбЯЮзаеешщыскЯзЫкмзтюьлзхруњўћўў€ јзЮюјЮССЯИЈ‹„nSG:QUTrb\YinvЦбенсўњруцЫгСФзўїгУЋЏЇЅЦСй§ўаМЋЂЈ|j]w‰vqegkedptZOWQd^\\b^d[aikЭлЭуянРЌЫўўлЛЇЎВ›iib[`om\gqxtid`ŽžЊ„benw}^NT]]^WVQTQTTSPHNMHTSHнИž’ƒknhkzwthdeb`ipheheQGw˜‰odHJvnpq]cij`ecb`aaVMNSVP[P[NOQZY\UOup{{kgmƒ^PQU]ZVc^^ca^cW[ObjWZWSMTYhncdikktib`ZZ€]POUVYVV\YSO[b^Y\Q^YLNT\^VVUYVc\bhmg^UWPT\\]YWSPNTZb\`acedc\cYYQSPLLTSUSNLQNQNTNYaWW[Y[TYZ`Q[T\SSVYd]TWU\WV]Z]WYVY\UYTVLWbTTUQOMHLIOIIGBHHMTc^^]Ydda]QTLPNYMOOVN[YVSVOWTYVY[\ZZUVU[WVOOIAHPOIBICMBHFGAAHIIPOPYSUNV[YOLNPVVIQOQQTUW[WVIEGHSGHSNJN@FEA?LAJAJQZUSOT\NYYTUTZPJGQgb\UMUQOQLT[[MYGOFGLGWUOLIEACA@@JLIECECIAJMSQVUYYPNMVTSULMIUTOHOV\SUOSNOIIQYTPPNOEGJIPIJIJGLCME>@IdTOLHOQ\TOBLHMISPPMJOQTTLMMPHIOPG?>ENNQUIH7B;@8?:?B8B@:8221ABEM5QI>PEGPVYSIMFF€ЫPVTVJJQTUPEIONLLOICIENMHOHF9?<42100*:-?<9,>8;;FFEYAIJCHVYQWOLAJMYU^[WJJLNPMLCCHMH>AEE;7,->8:@B@825F78(4?L@J*5>IH>NJCHBEOHNIIMHAFMLTOMFFGLIECBAACFBBMrJ7VH.FA@AH3ASTdWHJYQV`zJI@GIPMLC@CSEGENNLG@FACEFAAГ>CCA?EL^J8;pv\@M[^`][OFUjucZC5M{ЁЪуўHEBGGLMNJPIQITILFNMLGJNLEGAEFF>2,7E`pbjgJJю]ckxY@NA;ISLZƒАгјўўЧ?>HHGOJLJHHEAQSa‡ЈСйауэшѕўїюўўјкжўўўђўўрћјѕјѕјљћ^IOgbVMbzzd[PJJw•ЊЌУтј§ўўў§ўў§ћк§ўћ§јљјњ§ўћјљјїљїљјњјјїњt……•˜œЊЭчрИбыўўг§ўўњўњљјњљљјњјњјњљћљљјњїљїљјњљћјњїљїњјљѕјїљљў ўёћўљњјњљћјњјћљћљљюћљњњљїјљљјњљћљћњћњњўћњњі§љћљњјњјњўўцћљћљњћ§њћљ§јњљњјњљљјњјњјњљљќїљљјјўїљљёїњјљљјљњјћњћњћњњѓљјљљћњ§њ§њ§њћћыњ§јћљћљљјљїњјњјњїњјњљљфњјљљ§љћјњјњљњјњјњљћљћљћљћњ§љљй§њ§њ§њ§љњњ§њћљћљћљћљњљћљњљњјњјњјњјњјћљњњюљћјњјњјњјњњћњћљ§њћћкњ§њћћњљћљњљњљ§њћљћљћљњјњљ§њ§љћљњњ§њњљњњпјљљњњ§њћњ§њ§љњјћјњјњљ§ћћљ§њњљ§њ§њњэћљњјњјњљћњњљћњћљњљњњя§њ§ћћњћљљњ§њ§њ§њћћњхљ§љћљћљћљћњ§њ§њ§њ§ћўћћњ§њћњњц§њћћ§љњљ§љћњњљњњћљћњ§ћўњ§њњњ§ћћњ§њњъ§њ§љћљњњ§ћ§њ§њћћўњћћ§ћћё§њ§ћњњћљћљћњњљњњѓљћљћљћљћњўћћњњў§њњУљћњ§њ§ћћњњћўћўћўћћњћћўљћњ§њћљћљћљћћ§њћњ§љњљњљћљћњњљњњ§њ§љћљ§њњц§њ§њ§њ§њ§њ§§ўњўњћћ§њ§ћўћ§ћћяўћў§ўћћњћњ§њ§ћћњћћѓ§њћћ§њћ§§ћ§њћћпњћћ§њ§њ§љћљћњ§ћ§ћћњўћўћўћ§ћ§ћ§§ў§§§ћњ§§§ћ§њњю§ћ§ћ§ћ§ћ§њўњћћўљћњњўўћћѓњћњ§њ§њћћўћўћћїњ§њ§љћњћњњўљњњѕљћњ§њ§њ§љ§ћћјўњ§њ§ћ§њњРўћўњћњћљњћўћўњ§њ§њ§љўћ§њњћћњћњћљњњћњ§љћљћњўћ§њўњ§љћљ§ћ§ћ§њћћњњ§ћћ§њ§њњђћ§§њ§њўћўћўњћњњћчњ§њ§љћјћљ§њ§њћљ§њ§њ§њ§њ§њњў§ћћћњљћљћћѕњ§њ§љњљњћўћћ§ќўћўћћў§њњћ№§њћћњњћњ§ћћњ§љћњњјћљњњ§њћљљўњћћњїћњћћўњ§њћ ~џ§ˆџ7џˆ%џˆџўˆўˆџџўˆ џˆџўˆˆќˆџˆџўˆ#џўˆ$џўˆ1ˆќˆˆє€‚СРТРаэЮЗИУТЫйллйЮЭШКТЧЦИЊŸЊЖЕЉЕЪгбСОТТФУУТЯмпмлкемсжЏ•žœžЁЌбрЩОЩДВИУЯмкаЮжеЯСЮегУФЫЫОИДЗБЊВТФФЪедбЪТШЪОНИКРЮнлдЭЮагдраУРЛЩкьмЅaVЦРР€ѓЯуцраЩЩбадпжУНРУШОДЋžЋЮькЮСЦТИЉЌЦпеЦМЛЛКИРНУЦНМКМДТЫЪТБŸ~Q34клнсухчулаЧРФЪгЫРБЏЖДРЩЪдуїэтЫКЊЊЈДЧлшщтдЧНУФЫжрйЧНОМгЮЊtZA,4WгмлйжмтжТЎЏФЯЭШНФймгбзжнмрцштЩЌЌМЧШЭжрщшсдЧРЦдйллЯОКСдЪv*&3@;9:?лмссмпркЦКЕФТАВШзтхзЯЫЫЯЯЫЭЫМœ‰’ЏЭдЭЮкнйлжЧНШЫЫТНКЛЛШЪЇZ2)54#$",усдФУЭйлйЭРОЗЗРЧЭЭЮЩгЫУРСалшСЂИЧжыхнйзЮШЩаЮЯзпчсллщЮЗž^+0*8?0,)+жЯЧРНФгппдЭЪРРМОЛБЎЋМЭЯОЛЯсркаЪЯжмзгЫЩШТУЭднтнпдещюгЏh(*,893($ннЫЫШаршэхзСЊЂЉЕИТЭзсуусреежкпмлхткЯЯЧЫЩШетцхсркьѓй•V:)&(0(*&+ЦРСРЧглрсгУИЎЏУутчыяцжЮТССЦдкмутхупбЪРЩзкзтшшщюїїТq92"€Ъ$"#%$ШНТОЖСдллзмэбНЯжгбмшьшпЦСбмлйксщцтщщсмдбглцччхёюЌndYE#)+"ШЛЕЖЊЏЖЛЫцыьышхзаЯалзджрэёѓёяюшыыьшчмезмнрщѓѓпЉzI-3%+1,0,,S`9 %РЉЇЏУгЮдсыыслрсучтнптнхэђёэццыэцмбклйкщуэїюЗ{gA:23<,)-++!):,%3УгЯЩЪбпшьяђэяєяэььяююььыьцтстцыюыцррыєїлЎ…VB8+$%,1,##"ЪЮЭЦЧабмчщюээьыыэыцхчххэђюэцутсыыёњљју˜`313.?>>((-5317.($"$%,ЫбптрздлцэьыхцщщхцхсхычьэыьэяэёёђшЭЇŽ`MTH?.24.-++1559@C(2:<(*ыыссхцщьяяьцппцщщшстчыюььюђяїћјэЧ•[9;FEB@-+)0#&%,20FF@*&&*15эщээђулпщяэшссццщцщщю€…яѕї§љљтЅeC>9530;><7+30($(25;>A?:1"%!*55ѓящьюэцухээыщюєьряјєћћљјѕцкКwB?WQH;8<7799,(&-,0114852;-))"-"(#ыюђѕєяыюљњ§§ћѓпЗƒ‚x]VjŠ…^LA5FMC@<954<727+.5,%(%%311$&$##.*$%-4ѕњљћљћћјкРЄŒu^VF40,?O\WIA,AJIGFGI??>I3&!"*%$%$%224ћщпгЇtbU:7Pc]QNQVQMEFHQHL?AFC<83CB3,% "!&&)(!SB9ЄbFNPOFB;@dwzZ@FB@HBEACF?@,9?44.7<<5)""!*#&(-"*)#$-ST.!1:\G>M^\\Y?.+9HNC@BAA88;?IHE<55”.02+4231*137301++4-%3)(*847<>>*5FJJ>17;BH?@<+$(*-(**+8!&)7;4:;93*.%%!!""-243HEBAHEA>7722€Х1,2:@LI?3-14<<4,40044+-!&(*#&,..0"#$2ETc‡SMGC@24,.-++02.344$2003&+,1*(2A?B551+0;?>>A;4"#*hЁДУUNGIA;013()&,-0-213&"$+2-+*341..79?;:?A>?0&&-$$%$>žШИЗ%30B9;<98$&)$,44%%€#$+:3,*29;799<8;>>9:4%$(0I‰Лд3&+,<;>11,"%$)3+)22;2*3920B29?FG@8,..09)+#!+PЋ?;0>8940*21+*0.13+&--!$%7??7>@C::€Э>;32-  !""0ƒб>559AJB1-&1)0-%*01,-5;572;8?>AACC?52-*.#-4))#$#+,\У5.3739492!,71124++70-BFC@IGF@>??412-:5) #&##&9FTZ3048AA:81*+,0228)!4.1;;>GFBCGEJG:;GQA55+(€ž#,0$)?N92@a245@CB:0+0,+-45<,4>545:857>:E:;;C?C74;J[uЯИW!(+%13:7**1)#758CA4:9?7101399?73-)),$0+2877AC;7?QZQ3CeТяјєл‡5.8250.:F<11#..:F3>?IJJ?B;3<:>;?9@:7001)0+).(5PVOTTNWEO–дцыэпутБB*958()31851+23+&.7;@??AC?@>EAC;A?A5:NC9<@4"!>a^HaЉЪдЯЫрыурсмкуЪi-8$%+0+*,-4-)0.PO;1;:<:>:@C88EA8);#)83?LSgУљћьюљ§ђэыюуцчцзЫьљЊJ-,21,33:12-,*+&$,>B@>5B0+8ESSAEa‡Ž–ЃАЧпэёћћ§ћћјјђюышчссухрлтљћДM((B>9,3++#)+%,",B77+-54FrЌЩпѕїђї§§§ѕёђђОѓёђђёёѓёэьшххщыьэљњЋJ0.?C5+20-!,25FGG7:JbqŽМшћјцьѓѓёєѓђѓѓёёђѓѓђђѓѓєўёєєўюѓѓ§нЩi@871)%53,*,-**C‘Фрѕ§ћ§§љьсыяђѓєєћѓђђѓєєўѓєєўђѓѓЪђѓѓђћћбn7!"0%)213*4924."!*.%#&4:B<+їєјєѕєѕєђёђєєўїєєѓјђєѓѓєєѓєєвяєєѕѕєєѓєє§ћЉMG<*"#*,-"$"((78"ёђѓѓђђяюуьэђѓѓєєшїѕѕљњљјѕѓєїєєёєїѓєїѓїєєѕѕћьŠEML;30)-,80"#(4?J@ђђєёђёющщшёѓѕєѕѕѕїљѕѕјѕїѕёєѕѕє§ѓєѓѓљнŠ<:?4-!%%*21ёѕїїљѕѓяюыёѓѕїїѕѕјєѕјјљїљїїќљјїєєѓгѕћє‡GHF^T8)&%-489::јѕљїїјяёяяђѓєєјѕѕєїѕѕєїїјєѕїїјѕјѕѕєѓлјћЫeGEZhE4%"$!#+.;74јљјїїѕєђђѓѓєѕєѕѕєїјїљїєѕїїѕѕєнњ§юƒF@[Y+1-.2""*1LTNCњњїѕєїѓёёђѓѓєєљѕєєїѓёђђѓќєјєѕѕїўјєєчђњјмqYaaJ0.2;0.%#+2%@јѕѕїјѓёяяёѓѓєєѕє§ѓєѕѕєќѓєєѕѕємљћШO5PS7<:><2*! #-5E8Fѕњњјѕѓёэьђєѕєѕѕћїєѕїѕѕ§єјѕѕєќђєѓєєиѓє§ћсnFC<771:3+7)@@FGљїѕєєїђёѓїѕїњњљїїѕїѕўєѕѕєўёєєнѓ§§М<2PM<40*,$,+).392AMјїљѕѕїѓђђјјїїѓљјєѕѕєѕјѕїїѕїїЫєїјѕѕєѓєѓєїѓїљО8,OF@>4+*(388:<>E;7ѕљїјјѕѓѓєєјѕјѕєѕјѕїїѓѕјѕјѕїїѕїљљїѕѕєшї§ћК2&>9::7:,2*23..-,IAїїїѕђёяђєѕљїїљіѕїїєѓѓєєѓєєѕѓєїїѕѕјјѕєѓѓнћљНJMcC;:43-:>:32JїѕїѕјїёюяєѕјїїіјћјїѕєїљљѕѕѓШєѓєѓѓ§љЗ("4#")%-"#(234;F4Hѕњїњљѕєђђєѕѕњїїљїљѕѕєїјѕѕѓєїѕѕўїѕѕєѓщћ§СAїїёљѕѓёђєѕєѕїјњњљїїяјљљјѕљѕѕјїїѕѕјѕєѕѕжј§§СLOb;))!)+4+.V\aikVѕѕїїјѕђёђєѕїњјјњјњїїжѕњљљћћљњїљљјњјїѕѕєѓѓњљ–;>>7>3)"!)"&**!%7SуњцьюћьээђхёѓѓёђёююэыьщчхтхцчщьёэёююяююђѓбђёѓђђямШмкйзныјэпсцчщшьэяюёяёёѕђѓёђяяюющшусхщэююёёээюэюящьыюяюёђђОёяьљяшшыјўўјСxiюяяёёюђёєѓђэюёяююьыэыьщшерђ§ђяяыштцьяэђяьччццрхчшщшшюрхщузРЇT@EђѓѓђђѓђђуьэяяюьэьыщцэююяѓљўїѓђщчххчыяѓѓхђяющыщэюяэщшыїѓС~gH2%(A^яђєєѓёьыщшшыээюђѓёёя§ѓђєєюѓўђууцчююђєѓђђёьыээыьщшцуыјц„45AAC@BFђєђёёѓюэящэщщшшыёђѓѓяеэёђёяуЭСЫрђђѓѓёюђяююээюяющщшцђшБ\38;<7-59ѓёё§яюяяТюёэьшщьышчььяяььюђ§цбцёјўѓђяюяюяюяёѓѕѓёђяњьтЖk85??<;228єѓёюэюяяћђяэьццЫхчхчщььюђёђєђёѓђђёѓёёюэьэяѓєѓѕѓєѕ§ўёУp1(29:A@92ђюђяёёђŸяьчупучюёѓяяюяяюёёѓѕѓѕїєђѓёюэыэђђѓєѕєєђўўшЂ^A0.30.570-"яюэьыюђёяяэшшцшњђѓєѓєєёьчыяяђєєїѕєѓѓяяюэёѓѓЯљўўЫt;9*1.*+--&$0ююьыььэьяѓєћѓьяэьюёђѓђэёђяёѓѕїѕѕјєѓђээюёђђсѕљўїВma`B %+%&1)$!&ыццтшщшщяёєєѓѕђёђѕѓѓђєѕїјјвїѕїѕєѓѓђѓёяёђѕњўўшЖzJ252+;94113cmA$-утучщыђёђєєПїѕѕєѓѓїѕѓєѓєїѕєїїѕѕєѓѓёёђѓјјўўћМ‚hH<@9?;314-))!-G45;ющщчщэяёѓѓєјїїѕўєѕѕјїѕєѓђѓєѕѕїзѕћўўхЛ‹cI>405453870-("+,.,8юяёёяюяёюёђєєѕєѓЧѕїїјєєѕѓѕѓєј§ўўьЃd95;3AEA7535:<584.-).747:єєѓѓєѓѓђёёѓєѕєѕѕ§єѓѕѕЯјїїѕѕїїјћћ§ѓеАaSSP@3:9:9958BNJ@A.7715457-0EMMA024.74:@?љјїїєєѓєѕєћѓєѓєѕѕ§ї§ўўгыЌmE9>7.99?B;70277:;542,1+,4>јљњњљїїєѕєєјљўњєњўїўўиысМ}IFYWE70,.8895455A@:57<8.8:42.0030314.#$".-1010:<ј§ўў€оњтУЊ{dWF;21AWdYJ<4>LIFFLE@99J4*,1312.().*&#"%)&$&!7:2ўюцзА}kZ<>ZihWOTVZGLNQSSJCAELG?@FG;8* $"!%%#%)"#2-,OJEЊeNT[TQI:Ck}~aAFCFGIFGIGB:@>>?514?><*-)$*(%&"(#,*&)&5TU?+20WL@Pe`b`C32:NV@ACFFE>AGCCA>>;7759>95.&)+7<90)13-*-*-%#%)(.EFAJT287NUUQB<;:;<9;Zi{YPJLE<232.1%)8932:94:8721.00.07@G;85.787::8748$#"7{ЖзюUULEC::544.&%,042983(*59*!+-.0-3:FFB>>8ф%++"(% $""#FЈснп)-;E@@€ž<44-&+17.+121((0240.2479::;<7:?:.:(,.$!")%(2\Ёхњ95-8;A?;2*)%"(1,%*,78542027194AH@;10134--)!*!%01)5]Џе><;7E@8101-)032-32*.3213),7@@929GHA7&034853204598:<7.45<98:>A@;:750*.+!$#$.9I1")283,(-5eа>?98?A?2*13.220*+315>?A?@AB@A><<7028985%))+-,&&%)%+39:9?J`eЄ2;?@@C;45<51.44,,533217997?98;CPVL;EN\C5?;.)!)$(2:AFZF?Aj72:?BC?7144023.$-.1301++232;:<8>?CE>5BS]~ЊпЦ],-9*+&-120257:>4@B<@;>9>97+&.0-532+%)*(,*1,-.5<@C5BS^V7>j˜Шїўўї›C>C7492-17987-39J?AAB?@>@>EAA>;:97JJ@CG;.,CgeNiАксухєћєёёэё§чt7?77112,158:@;8429?;20.5+:5>PTcЩї§щяўўљјѕѕѓёёяьс§ўВH33224-+-5753.1-.221.4;5.$,?PQ>Ba‰ŒžЈЗЭрююљўўњЮљјѕѓђђяюяюььўўЗJ,05(-+.447871.?>1(088GpАЧкёђяјўўё§јѓєєѕєєѓєєѕєєѓѓђияёўўЈH,.99:4&+&(,-3((№*$$)*),5EGI:ѕїїјјћїєђєїїўѕїїѕќїѕјї їјїйјїїўўЋNCA+&0*#(&*$+5A?>4ѓєѕѕєєђьыщёєѕѕїїэѕјјљљјїјїїѕїїјїѕїїѕѕїјўы‡GQM<"+.)+,,)(.;LVFїєєјѓёычяѓѕјјѕљјљјїјљјјљјјїѕлўњ‹A??8-3(+--2)879јјљљјјѕёыюѓѕјљљјјјљјїїјљјљљќјїѕїїѕкњў§‰G@JdQ9$"$289>A@9:њјњљљјїєєѕѕїјјїјљјљљјљљјјїн§ўь‚EH^S(*<45.5215PSNJњљљјљѕѕѓѓєѕѕїїјјїїѕѕєѓѕѕїўљјјљїчѕ§ўтr[`iE7?;173+)$-,.(BїјјїїѕѓёђѓѕѕїїјїјїќјїїјјїўоЪL8UT8;?:010+*)2@CEMњљљњјѕѓёѓєїјљјјљїјљљњјјїїјјїќѕїѕїїмјїўўсnFIB;;?;51*2009E?OTјљјїїѕєђѕѕјљљўјљљјљќњјљјјїўјїїўщУ>7QHB:7:1.189;CG8IQїљјјѕћєѕїїљљ§јїјјјљјїјљљњљљјвїѕїѕѕўўС82UJC>><.,5>?BEFCE:јјљњњјѕёѓјїјїјљјїјљљѓјїјїјљљњљљјљјјїшѕўўЛ.);EBA<<94:99?974HFљљїјѕѓёєїјјљљјљ§їјїїѕѕїѕѕјјїїјїѕѕўђНMMiHCCB:1-7U€ŒгезехћржбежтыяяыстмзгммдЧКСЮЫЧгсчхжгзсйлртыђющычыяючМЅДБАККрђсжнЧадмнщцтрхшумцщхлпсйаЯЭЩУРЫкййрцхцззснегЩгзхыёщцуэыцюрдлмцяўяМwnпддлцђяяцртхх€‹ьшлзмккЫЩЦЗФсљьтлгЭЭУЦкэцкаЭаЯЦЧЩЭгаЮбЯЩбнлеРЕ‹aFSюђёёђѓѓєьунеенстеЩТЪЯзкзуїўѕятЫФРРФкыєђяцржзйрцьщлЯедцмК‚nT;.2GjушщэыьщшбУЩжухплсэьшущюяюђєїїтЩЦгппуэђєѓютзадтшшщнЪЫгьсŽ::JTTPSVшёюѓюыююмЯЫнбЧШкшєёюхппуутруЫЋЊЦцшспыыщышжбйхсегЯЪЫкмВk<>CCLM?IюѓхкйсцыцслжгадзпсмлупйгйтьњЮДШлы§ёящчтмлхтуыяёѓьыїтЯАrAAJOGLE?JычнкЯйуюьцммгдЮЮЯЧНЛЩкнаЫуюђюшчыщыычмзедкпуюяєёьђўўшОx;4CLGHGO;3ээрууыяѓђёчгТКОШЮпуьэяэяььГюёюыяяєыупллмпцяєєѕяюўўэЉeO>304@кжждЮйтыщююљцзчцпрьѓѓŒынкцыэщыёѓёїѕєюьртхьяѓѓїўўЛ‚ukN,9*4AAC25;кеаЫРФЩгсђѕљѓєёёшыэђыцыѓѕњјњїјєљѓѕєѓьщщюяѓљўўёМŠ]ABB;TIG@ACuU3>еФУЭечцьюѕѕ€ƒђѓяёёђьяяюёєѕѕєѕѕљѓђэшщючшѕѓ§ўўЮ{TINNIPLIA<::0@NEEMртжбзхьѕѓїѕљїјїјїїєјѕїѓєѓєђюяєїјїѕёѓјўўяТ—mWFA?CEH?L1B?72399E?G>ртрнрхцьёѕѕљїљїїюѕђёёѓєјїљєєэђѓјѕ§ўўˆѓЉtBECELSIN?FFJIMBC:@0GBC?Fчыюђяьуыђїѕѕєєѓѓєєёѓђїїњјљєјїћ§ўўїмИ™tejbSELJGIENHHPS\WGCJIJ@>EIїїђїђєєѕїєѓєюѓђјёђёєѕїѕїєјїљўўЦкЉnOS^`]TBCEEC>C?>2:?AFїњљћљљє§ўўЬђФ‘™kh}ŸЂvaWG[kWTTWMLIOJHMJIGJAF?A@AB5795>E?<3HCMљўў€’ыЫВ™”ŽwjVL<@Pkxk^UFM^eZ`^[VOH^G;7@??:@;4:931(*,0.<754IJMўўђчЛŠviGId~|obcpnZ\`^gibUOY``[PUYLG9*<;+@>:77.45.,,%&0.?E;:95:1713?4834:Gg`MAEAn]OivvupVEBMcgTWZWWЧ\YYb^UQOPJJMILJLEJLIOOP@?0355LLTJS`AHNbgjecTLPOQQ€ХY`dcTQSQ^bTWMJFCOLN;F?LF@?JGJAA@@<:17-&-55+3GNCEWaZW^ZWSPOJNGJJIJV`Y[JFUW]VSG@BHIHE@GECBC9>BHB81,4!+,)(53&4MWiz”pga`VPMMHE;FOHGNQMLNLLNQSGFC@AIUYUVOUGHOF>AA2@-(,&%.47)9,@ЖЩнee]`PNNPHEF@?ALBNMGCFAIGNEAOMGMNS[VSTSFJH;*+1-0)01-0170*VАйЧЧ?CHTPSYSFF>FBBCAIAE>:>BIGFMLJQWMPOLMIIEIB8&44341&.)%-<,44<`›бшNMLHPYUTHG488AA7+;>pжOPLNNQSLC@AHHEJ;GEFHMPPNNHOSLNHHFCBPNVF55A."%14957.<29;BCFFG]prЕSTWPUSQFGILBFC?;BB8B;;BOGLFJMFIPLEOYae]NOZbPCGI?98344;>@ALTjVOTwIOMVZVQPQFEACGH<8A3??4;B:;CONLIHNVWNHN[m‡БсЫg273><9<17CAEIBG?CEAAB>BACB<3;@B;Cbg`jgckS[ЇцєїїюѕљНN8FINLI9@>EBC832:H\VFMo–ЂЏЛШжыјњўўћљшєѓёяяёюыэўўРV?COOM@E89IAAьGB4;BNC93;>N|Игч§ўћўўњјХљјѕњјјљјєјєѕѓїєѕєўўАP;?LJIAC7@C@CFJZWcGMZzˆЇађўўюєњћјњїљїљјјљјзљїљїњјњјњјљїљїљїўўеrNHMGA4:;CFLCEB:C\ЯэўўЧ§єьѕѕјїњјњїњјљјњјњїњјњјњјљїљїљїљїљљўўр{>5AA@<;:AHGMPMMZpўўрњљїїєёяѕїљјћљћјњјњјћњњљћјњјњјљљјјўѕјјйѕўўЭm`^FGG:A99?ICIL`YN§ћјњљљїљѓяэєѕљїњљљїћјљїљјњљњњ€=љћјњјљїљїљїўў?;3:@IJI@BBIHJSYP?їњјњјљїњїїєїїљїљїљњћњљљњљњјћњљљћљћљњјљїљјјѕўўЈSHE:>B@>?FAE?JJOLBљћњћљћљњѕђїљјћљћљћјњјњљњїћїњјћјњљћљњјњјњјљјўўЕhnL4:8+:709;?HJYS@јњљћљћљњјљѕњјњјњјњјљїљјљјњјњјњјњјљјњљћјњјњјўўЛYWT>8A8?*9>>3ALSUAїјїљѕјѕєэђєјїљњњјњљћљћњћљњјњјњјњјњјњїњјњљћљўў˜TdaSAC:C@:;@:?Lac]їјјњјїєєяєїљљћљћљњњ§љћљ§љњљћљљЦњјњјњјњјљїљїўў–PNONGC":277F>43FHIјћњ§њћїјёєїљљ§њћљћљћљљњ§њњј§њ§љњљњјјмљїљїљњўў˜UV]zmM190?AFFHLPIJљћњ§њћљїѕѕєљјћљћљћњћљћњњљќ§њћљљћћљћљњњцїљћўкrYWmZI:;98;ABHIMCFћњњ§љћјјТљїњљћљћљћљњјњјњјњљњњ§љљњњљћљћјњјњўўј–YYuq97LB8BHWSZ[њ§љњјњѕљїјљ§ћћњњћљћљћњњљћћљћљњњЯјњјњјњјњўўЯPFeaWMPHBE@AJNSSOZaљ§њћљњљјљћљ§њ§љњљћљљКћљћњ§њ§њ§љ§јљљћјњїњјљўўЫH>a]ZZJELGBIVVYWYMBљњњћћљїљѕћљћљћљћљћњ§њћљћљћњњм§љњњћљћљћљњјњўўФ@3GTSQ[IICIGNNQSE\Wњњљяїјјњљњљњњ§њ§њњљњјјњХјљјњјћљћљљјљїљўўЮZ[uZWNNHGBEIOPPUOCaњ§њ§јњїљїњљљњ§њњћ§њ§љћњњљйћљћљћљћјљљњјњїљўўШ5-F>>EE@3C+SgUYњ§њ§њћљїјњљћљ§ћћњњЦ§њћћ§ћ§њћљћњ§њћљћљћљћљћўўЮ`h{P79A0A9>AJiru…zeљћњњљћљјјњљњћћћњћњ§њњћњ§ћ§ћћњњћфњ§љњјљўўЂOVUFH@87:928H@@78MLmЦэрУЦЭЦВЏМмсмйзкпчуьь㍘ЇЖУТШЧНЄ‰™ЇЋМКБЏЗТЧШелздЭЪЦУОФбзезJJ4,1\ЃЭпсЩЩдЯЮейдзЮЧЦЮглЯЗ••’ЇОЦФСБ—’ž›ЃДННЦзучхцлйкмсупззмнпсAB@9F[wЌезФУЧЭжаЯЮЩЩФТТОЏœ˜Є›ЊаргЯйзБŸЊЄЋЩТСМФРЪжмлнррнзгзййцьёHL@7ErМжФРЧЦЮбЫОСЭШЖЊЋЎЗДВЕЗНШгдЪТЕЗИИФСТЧЪЫЫгезлттнкпхцчэђщчууPbP@>BJcxВйтзйЭОВОУЗЈЂЊИОЛЗЗДЎЖТРНЗЖЖДРгйддзнхшхпннмдепщюяёяэщчэ%,I>5aЁРФЭЮкчыыхунпнкЭНЖЗЖВЎЛШУТТФШШТТСЭдбб€аЯзгЫЫерчцрмзекк2583.CQIF‰дѓшуццрнтустркзЮЦОРФбзкеЩОТЪбджгбЫЭЭЫЩЪЯййбйпцьэшмзклй270GQG”нььтцьщштлзгжЮЯггдклкеЦКНЧЯЮдлпммлйгЭйхухуруурчьютннеб5>58FCQSwпѓцыы€ЅьэцпзЯЭЫабгЯЮбаебаУСШЯЯжнтшручхсстццхцркйстсдамшэ*79vСэяпндЪРУФЫЪЩФЩгнрхтлжестмбйзЮЭТБЄЋЕИИДИДЋЈЉВВЕТТВЌЋЈЄЈЃЎОЪНЋœE~УЭЛУТНКЗОЫжпхтреззЁмнйЯгдЯаЭбЯЫСБЈžœЈЈЊЖАЋЋФмрйаЛДЌЋЏЕКАЋЄЏЈЂœ?‹айзкссйбйущшыэыьыщцмаШабЪМЛФРБЉЌЛСМЖЎЈЈЉЏБЈЌФУТЛЖББ€ПЛШЯеЫРЩхщдNŽпчхцшчцтнршхмЯЩЯгжаФМЖУЦНЏДКЖЏЋЕЪддЭЯРВВМИВЉЏЛЛВЎЊЊЏЩджтццхчтзZТЮзнттрчщшцйЪОМЦШРИДММАЄАУЫзбОМЩмзЫггСДЛЦЧФНИСРИБИЦжкдмцсдЪОНОgЈуээщхцшщчсебОЗДВДЋВЗККБЏОЪШЦЧНЋЇЕККСЕЏБФжЭЦЫЯккЮСЩббЋЫРКОЖЋЎБНQ—хєхтссмздгагЯдаОБВМОРШШЛКЕАЅЂŸЂЌЇЊЕЛОДЛЪжмнучххзЦУЧЩШЧСЖЃžВМЗНiУјюнммйжеаЫЫ‰ЩЧРФЪЭйдШУММЕБАЏАЕБЎЊЕУСФЭйлгЭаЮЫЭЯУМКВНЧШМКНЛСзЯаYЏчхстуррухшхчхЮЧЭЯалтсснзеЯЦБДОЧЫеЭЭЪЛИЖКМИЛРТССЗЗКЗШкжСИЕЕМЩЭг|лїэщщ€yхутмкЮФЦТЫЯСНЧЧОИЛЧЯаУИМкхнйЯЭЦАЌЋЊЉЃЅЏВАЕФейЪЪЫЯбШФЩЪазд’нїючцхнйкмлжЯЫШбмегйбОЌЂЁЗумзЮдлйЮгзгОЕЛФУЗЖЧгФООРЩЫЫЮЮбгжЭЯдЪЦјљнлзЮбглзЪРССУШбЮЮЧРЖЌžžЄКбзЧФЪЯбеЫЕАКЩШЛЈЉРбЯОЖКОЭЯжзЧКНЫжклг›яёшурзбблжЯжгЩОЛУЫЮЫЪСКИЖЉСЭЮЮШдйзЫСАЉВЧегТЛМУСШЫОЖРОФЖ—™ЌЕЩЮбvЧцмннжаеаббЮеЮФРЧЦРРИББДДМЧаШИИЮйЮНЉЃЌМУШЪЦТШУМЧФКВЉ›ˆ’‘’ЄЉ}…лынтхтнкгРУЩЫЧЧЩЮЪУСКЕНЗЏЅ›—Ё‹Š™™œžЅВШЭлцеУШгШНЗЛДЎЁœ’‘‹Ž›ЎЅ’ьбРУмѓмдцющцчыюѓђєяёђђњѓёёяюёёїѓєѓђёёэчххїшыэыьююьыыуэыьччхщээьpccx‡‰гўэьэыьэыюђѓєєнїѕѕєђђьыюяяюёяэытмсуттруцщыщьюыююьыыэюаэGGFSWxмўљщхцычхьэђѓёяёѓѓѕ§§ѕрЮдцяььычаСЦдмуцуцююёОђёђяёёяяёёTN@2:iАтћјьыыээьюђёђёёђёїёнЯЭСОйщыюьчЭУЪажптхшьяёѓёѓђёђѓѓѕъїJIIGNe‹ШєёчыэюэюэыэьччцфбгЮЯТмї§ээыїпЭзбзяыыэььэяѓѓєєўѓєєЩїєјј5IQN@L‚Ъѓыцыяюэчшыыцнлнутртусрчєщчхщчтусцщюёяђяюяђѓѓўѕїїаљјјњ\eVGELVmŒЭ§ћэюьуухчулкрхшхуухучщыхуцччшщэёѓєєвѓѕђђёђђѓѕїїјљїјјї$)23HSEQЈмчюяэщшщыччшыьычцыююєэюыяюэююёѓєѕѕєбђёяђѓєєѕјїєёѕѓѕѓ&H]ec\a–шўњээюьшчщьэьычшшэюяђёёјяюёёђѓєѕѕѓњёђѓђѓѕѕђЊёђяяђѓ@Zh\ptdUzТѓѓщчцттцчшщшьыяэюђђюёяюђђяђяёяђѓѕѕєєѓѓѕѓѕјјѕїєђюьюёѓёѓ83-$8V\OV~ФммхщччјщьщьђѓёяяэђїѕєєђѕѓѓђђёђёђёёєѕѕїЦѕєѕєђѓђёюяђёђAFMQVVAcСмйстучюёёћѓђѓєђђфёѓєђѓѓђёяяёяѓђєѕїїѕєєѓђѓёђѕєєхѓѕђѕ833?JNOB2hЫщьтхшюёяёђёѕѕщђэьэьщшыэёюёюяьэьээёђёѓѓёчѓєђїѕєђѓѓёS˜пщцѓїыщэюяёяэыэщыщююЭђѓѕѕјѕјѕѕїѓђяюышчяѓяьыцххшыыуурллнрпнпмSЭёѓёюыццщььюэюяЭѓїѕѕїєїєїїѕѕћьзгыьюьюэышунуцььыурпптюѓььђј”жрщюэюэыыєшщщюёьяђђѓѓѕѕўѓєєђиёэьшрсхѕэсТКзсусучыыцккжЦнїяяээяТеуяшщьщщ€‘эяёёѓёєѓєѕєєѓѓєђѓяэььяээьчтпрмжЮЧгзмхцхшцшхгЧлйёћюэчхшцчсмтцчыяѓѓєѓђѓђђѓєѓѓєѓєѕєђёэяююьщэьшуцтнбджймсухыюђѓєјщѓщыщшууцщцтртцьюђѓѕѓѓюшхщяђѓђѓђѓђђёёяэычххшччтслгекмсмчьээсщыышщщыьююяїяччыьёєєѕєѓђьшчьюѓєє§ѓђююжьэьчстщьэыутркглрујљэяѓђющчыэьюёђѓѓєєлчёяѓѓѕєёыюёюёёђэющцщыщьунпсцшыыкщтнймрклгюёђёэыьэёђђёѓѓєѕјў§ёђёяёѓѕєѕѓѓёкђёющхутхшщшщччсннсчыьышхрнплнньэяёююђѕѕѕєѕєѕѓўўђѓяююёќѓёюыыњяђёьцррѓтуухцччуснуыээЛщцсухцшшщэђѓѕєѕѕјїѕїєѕєѕєїўћяьщщэяюёэщщшщююэщцпллйлрхутуцуршыээьщхсшыыэњюђѓѓѕїїюѕљјѕєѕѓТыёђёюэюяюээчшчыяюяэщупрнушьычусррпсуххКчучяёяђєєѕѓђѓєѕїїѕєёёѓѓђˆрўўђёюэьыыьхтцхчэщщьыщшыьээщххчщшщыщшьюёяѓѓђѓѓєпђѕђєєѓђяэююяђ‹шѓыээђяяьюэщуснхыьээяёїэышщшшщьююјяђєѓѕѕѓєєѓкєѓѓєєѕѓёёыьыяяrЩчлщьэьэыььщупнущыыщыэёёюьрэюэыыэюёђѓѓёєѕїєђѓёђѓѓєѓђђѓђђюёяяаxбљѓышцрхшщхуххшщыэьыээяююёяђђєѓђёђђѓѓєђёюёєєђђєєНѓѕђђяёёяёёђёэiТєэышхушчхтцщьююяэююёёђяюяёђѓђѓяђђѓѓђѓяюшщяёђѓёёэюяюяяСђёѓёяюыёZЏышчутцшыышыююэяяюяяюээяёѓєѓѓяюяэёђёэяьющыэяяюяэшцщыьюююьёяьююёiСўўщхтуыэююЎэююђёђђёёэщьэёёђёюэыэяёёђѓёёчухшьюьычхшьюяюёѓяштчьюJŒяєьцууыьяёёюэяђѕїѕѕєёэюэюђёюяяѓиєѕєѓђюшхущщююэшучщьэююяђёѓюэяY•чјњышчшюђђоёђяэююђѓђєѓяяёёяяѓђёяёяяёююэыыэюэююЙьшыщчщыыччхсхшьGƒбуусцшээяэыыэыцччыяёёђђѓѓєїђяююёђђѓѓђђѓёэыыьэяђюяюэьэььышхушыѓ>dБйЮЭнхчыщшчьююєыяяђёёюььэюээюьэёяяёёюђюыэыщыюёёэьыыкьшшююэюяя>gЎТЧахшььщучшюяюэыььюђююэыьяяјђёёьыэяььфыччшььяыхттптхцщщьыю?рўєшьёёпђюээюяяэщчщщёяёяёээюяьююэьыщыьящшшЛщэюэыцтснлмтщыьыьAhНэєэюяёѕѕѓђђяюђёяюђюёђяющьээяяюэюыунсыяэьышшцшцссрряхщххыющычш@hЪѕяяёёєэююэьыыьэюђѓѓёэЮяёююээщцурхьюышхннмлкйзпстутуцщщьщнеFхўўэьычхтчыююИяёёѓѓђѓђѓєѓяяђёючссуччщхтсрчщыышцхтуцуссцшччулJ‰лясщщчххщэђєѕїѕїѓѓєђђёѓёёѕяѓяьшччппсрртнпсцщьюэщщххушщшчуутцйЭI˜юјєёяяђЊєїѕєєѓїѕєєѓёюяэьышцссцьэьчцтрппнстсчхуцупсщьэьююя§ўїVœэўїёђёђёѕѕѓѓюшцьяэышшьщщшщщыьшыяяёыыщцтсттцщчхтпммхыяђѓєєрђёяažпяёђђёєђѓђяящхчыщчтхччцуучяяЬыээяђюьыщчыьыьюьщцхцщэёѓёёђэшшщыpНњўћєѕєєѓѓђѓююэюэцшшсыщцхцшьыцттупрцхцччщыёѓђєђђёяэььччуцнмрну[ЁѕўѓѓѕєєѓёёяьэьщщыњюяьыыццщтрпснтсцышщьэяёєђѓѓёёяээюшшуспрцщщrЫўўєѓђђѓёѓђѓёђяящђёђѓяђььыщчшщшцщюэяёэюяяІђёьщццшьяэьщшцэћяѓ^Нљљѕїєєѕєїєѓђёђђяяёђёёяђѓёяьышюёюьяяээшцустчыэщцшщщыыьэяыыюёяєѕ~шўћѕєѕѓѓЄєѓёюэюяяёђяяющыэяёђяёюёђёђѓюэхсртстцшццшьэёюђёяюёэяюяђ™ёўїђёёюёђѓяээюёѓёђёяэыуйамљёёђёђёєёёыынэыщшщыщыцущьяђђєєёяѓђяєєЇўўѓёяѓяђяёёхяэыэюёэьщцтслашюэёюёєєѓююыььфчхшыээюэыэюђђяющщшэђђєŸјўјєёёпѓёђѓяяюышчьэюыышчшпэђѓюёяђёёьышщыычьыьюяюэяяьяѓыжлчпчюѓѕкњѓѓєђћёюѓэяяПэьщчхчшьышшщщшчѓїёщммпчьюёяђёэыьщыышцтнЫзйЭпузФŒёўїѓєїѕђььщэёяээььдыщыщшслгЭгжЩЦйнппмрђёяћѓыыььщччышркйбдбглннзТЧЏЊдюЫУйкбЩЦЮчяяцпхыэящууцчшнсюяюхймсснмейлпнлзкждаазпждЫЪСЧайй€]xmdzŠЧёрлжсчшхшшхьющьюёяючпбдйрхшчщтйжеЧСФШШЧЩЯадгжкзждЯЭаежжбдSOOeh…жўюзгйжЫТЮщёьырщюёяљћтНЋДЫжддмдЖЋБЛЪЯФЩдегсшюцрнмлебжцщшцaVO:BrЖйыёлнсунтрццсйрушяуЩВЉЈœКЯжжлЧЌЂААДФЫЩецэяёђяччцэюёыыщяюєUWQU`k‡РтцбгйсутйпмйбааЮРЏАЎАЊРтёмсххСЊКДСнлездгзхьээђюёшчцэюђѕјA\d\HZˆЪчждкзцхпагсмФКОСЦЧФЭЫЭечрйЯаЩЪЩгЯбжппрсстыяђчыюёёђѕїєєђєi|iSPYcuŠЫёѓсхмЯТажЭИДНЫгбЪЩУУа€xЭЩЫТТЩрчхсшэяђёюяььццэђєїјњѕѕєј227;AUZLSžОгжтсйЯгдбЦЭелмжЫЯдстхнпбдйксёёђяѓёѕђёьхутхђєјѕїєѓяѓёя-3Teom`g”рёцлхскЯдглйлйбЪЮечштмсмпсмксыѓђїѓђюэсшснцёёєѓѓэщпкпшыьNqzkr}e[|СпйЮЫЩЩШУЭЫЫЮдрнтсустсзжзнчстрсщёэыььтчсыяђєїђятнжждйхыFG54AacUWtЌУКТУШФЭЯЯйццыышлсьђэшшяэьмгЮжршхыччщяяђёѓђѓююцсррсщьцIMTUQbeod˜мцнзкжЭлшычыэьхщьёёїљњєѕђѓюыуыяєэёяёююёђяђэшлнхёэчушщыMQSYZ]]aGiЏЩНСФЫблучхюяђююіьыыяѓђђюшкк€цюёьэѓђєѓяђюђьтхыюђыьэяяэ0((*#"#,#кЫФЛОСШТЛУЪЭбаШУЧалнппллзгЮадЦЖЖЛЁЊШеЭЪЦКАЄЈЁŒЁВ…8)@1)"(%("#130кдЭЩУФЩФЦШЮежбЩЭдкбЫЫЪЪЧЫбйдЫТНМЗЉЃЋМЧСКЉЁ˜ЃЅ™—v85I:*),,*3781ШУЮЯЩТЫежнртслзЪЧЫОКЛЛ€—МБДЪйзЩЭгаОЏЏДЌЊЎИАЈЋЎИРШЧ;9I1*#$*!+5437аЯдббжмрртйллмлктпезйЫЗДЕЕОФЪбйбЩМКОРЎ——ЁЁŸЇМЯчщЯ{0)&+%1.:@JрчцхлмдЫЉƒˆЊЕМФЛЖФЮажйФЋЄЕВЂ„žТаЮгбЪЧЦОТТНМЧЌžНЗd01:7:+422BC8$4зруреаббЛЋЉВЛЩаЫажФМЮТЏЈЊСОАИгђржТЕАДЖАЇЎЖТОДЛкђщ‚-1&7,01:;F@4ьшрнжЧФЫенрйЭЛЛБ‘˜ˆ‚ЅИЗМЛЦЧЧЫажгжбЦНИЗРдЯШесуцэћєƒ33<099C4<8;?73пЯЋœœЉЌТЫжрЮДТУЖЉЁ˜œЋЖМЦУТФЭктрпеШУЦЯжссхьёэюьѓёзv&,C;?749?AHG<8абНЌЉЅЃЋВЫЮЧйаž™ЁЊЊВИРННФЩЯгЯелзеЯЮдсс€­хуцэђѓэшйРp42;7A5;3<@:48+ЃœžЄЊЄžЃАНЏЅАЌЈЊАЗИЛРОТОЧднжЮЮййжсуцтссцущчючсрєь…+&;>A@?<;4&!)%ž˜œЃЁ˜ЇЕВДЖНЛННЖНеедЯЫЭгзейезлцсрлжнмннтуцкдЭгђєу‚#3>?53:2+!!*-”‘–”’–ЌЗФгаТШЭамнллНтчцсусрнрухцсрмнмпууркЮЮрчЩu3+5153)9>0&*1-ЏŠ„НаЪИОРЛЪзгегкйдпчычхтццс€ЪтсрчэыхжлпплеЪСТЧксЧ|-0433#)##398+ЖДИбеЮЭадЭФРЦЭзрчщыыьыщчьщпежнррцчункжкжнрзЯЧУЯэу;2;;5+#*,*#ЕТЫемйзЭТТЭглртчцэююяюяэшйаецрдбтлкежкебййбжкмщясƒ,&*80%+%)!)*ЕНРЮажнусрпптььыььчшюяюысрнйптлеежгЯжнрйеклмабеЯЫ~!$*%*!,*,%1,-УРТаелххсхцухытнрсцшьчхпкпхштушцкЭакйннпЭУЫЫСТЭРЌo,81(!%.,$##$!хцхлнспцтуыьѓючмйрпдажЩЪггелчьёьыуппннжСФЧШЮаЦбЫЌh-7C??))(хрзжлзйжжрщчцткббдЮМДЛМРЫдккежднрпттаЩФЫекдЯЮЯгЧТS>1)+.:.(#(32)кмлззмкйтпкйлжШЩеЮЫаагййдЯЭЧЛБАИЩймЪООНаейбОКСцюЯ„-*,-.(,04!+70*аЭбммнйждЧанлкЮЯбдЮЫгйгЩКИИДВАЋЎЉЉДКИВМФСЗРЦЮддИЌu-.3,.$"0,-)40екпснеакнснпмеЪЮЮЫЧЦСТЕЕЖЕЗНОУОЗИЗУФИБДНКБМЩШМЄЄЯЈ-#-4,370:>9>"аййбрцьщчхпжеабЭЯегЮТТЯдЧОМСЧЧЪаЭЫебУРЦТКИЛЩЩСВЊТ”79M7+%*,+0125 лккрхчыыунЯУЪЯжжгпреадЯдпкдЮЧЖЗООЭаЩЗБВВ€ИЗУФООЧлк–<;8,0 ,d8$лтхпнццкЩИАБОЫЧЩбаШЩдкдЧСШабШМЎЏВКОКВИЦЧУУЧИИЗКШЪŠ3#:43?IL8%".&#ФЭЯЧТЩЪКЛКУЫЦРФЩФФОФШЪФЕЕМШЧНДЌДОМОКЗБДВВЕЕЋЅ•‘ЮОW;.:1-2)*%1<2&ЫЭЩСИЦЩЗЌЏМгйжЪУОИНСЛМИВЄЎРЭбФЖЖЩЭЫУОЉžЅАТЦЂЈ™ЃЌШˆ71B1><:2$+5?<8ЦаЮКДЖРМЏЂЇЈРШТСЪабаЩЗАЁ—ЉДЗТОЎЅЉЋБЋЄž›ЖазЪВ•œžЅР‰?42+0,-1!!5<;8РИЖЖИЖЖЕВБЎЎБВЎВЛМКЎЋЈЅЁ™ЌАЉБ•|–ЉДЊЎУаддуЫСДВСЦw$5+2.45>48,-ЩФТННОРЕЋДНЕЊЅ˜›žЇЅœЈЊАОТОТЉ…‡•œŸВЯкЮЮбЭЩЎŠ–ЃВла„93?:-*?9874,-1ЫЯЯЩШСЛИЌЉЏЎБЈЄЁЇЏЋЇЉЅЇНЩЫЫбклтхётмццмбаЯУАЋЌШгажŠ.2;25)9B@2::<>ОУСБЅЃЁžЂЅТЪУЛДВИФРСФЖЕЕЖУйрЭЧЗЌРЯЧЭЮЪЪОРМАЕФенчщЉH;J;-3737?HG9ЫкЫЊЂЊНЗЛОНЖБЋВЕДБЊЎЕВЋЂœŽ™Ї—œЂ›ЗЪЧШЮЮЦКФШЧУЧЯпєхœC4+-29;30(8E?;лйСЅ™ŸЈЎЈЄЋЌБЊЉАЕДЎЊЄЉДБЉ™•ŸЌДЗЭдхпйЦКДЕФШЫЩЦЩлјк‘9102:9A<.-4:41ШУВАВЗЛКОСТСЩЧУШЪУМДЈœŸЅЈЂЂЖМОКЛЛ€ЊМЦУЖЖИИЩЯмкпёыЅ;10-9<:1+.2;)2.1+724410-?C;A;:( •”•™™ŸЊЊЋЈŸЇЌЌ€ёЕУдмлмнтхууплйтххутхрмрпсцкЯбеаНДсСF$.:-9;GB84A83‘˜ЅЃЖМНИИКНТЦЧЫбзгейжзлййуыыяёящтспдЯЯгммбблзамчК@9F?1,9<4$+127žДЅЁАФжзжебйлмЯЯмскмнмлжкмстшчышснпмбЩЭдзбаЯЫШЧФУ—Q59444AF930(2ЫдздкрркаЧРЧЮжлзлуумееллзпмдгЯЩФЩйлжТСЫежлжждЧЕБРЛmJ>?75453.:.BIЫазеЯЪШЩУОЛООЗИЦайзгйслеЮЪЩЫЮжаЪЮелжЮЯклаТСЛЕЖЖДЗЊP7,288.30**4<ЧЫглзШСМЖНШЫЭЫШФШЯзежстрЯУОРЩОЖЗЦбкзЫЪЫСЛБЉЊЎЌЈЖТЁL0<.%)10*-,959ФЫбаЦЧгЧМФаЭЯеежккдЫШелндРИЗЛДИЛРЛБЌЖДМРДВЖЈЃœ™ЏО˜E0))*-58;8+71;ЪЯЪЪЯСВДТаесцшчрнйЮЦОКЖЕБЊЉБЏЃŸ›БЁ—ž˜ЛЯЯУЛЗАЈЌЉЏЪЉJ-+(<1-<;0%370кжЫЗЕЖДЗНММООЮмнкбФЛЗДЊЄЈЇЁžˆ‘~uЁЋ™—ДдЩРОЦМАЎННАЭЛS#BF@8395-021*нкЯОЋŸЁЄЈЕСИМУдгШТЕЌЎЏАДМЧдЮМЄЉСййбЩЪабЭРСЌ•‹›ЌЉЗМd1+(7>BH<#)$&0ЯЪЮБЃ™œЈАИФЫайлгЫЦДЋЉЈЈДЧЮдгСОЭйкЯТФЩБ—Š’˜”ˆŠuКбгu31$$,:510,+%7ЭЧЛАЅЈЌТЯжбФЄžЂ‘••ЃЌБКЏЇЌЉЋКЛТЧЧЏ–ЕВ‘‹•””—’›Еещг}9($&#$.7;AMHАЊЈЉЇЋАВТУЪФЪИ•ŒŽ•”ЎТЗЗИЏЋАЌЃЂБМЏЅ‡Š”œЎДЂ’ЃИЮТТБr9@-(,22779GFGА‹‹žЈЅЈДЧЛЇЄЋЋЃЁŸžВВЎЎЅ’Ž™ЂŸБОФЯсммЭЂЋЧшщшлШЮрцЇI<0,22$34;.17,+.0.OhrY14љїїѕїѓёяђёьщэёђюёёђѓѓђђѓђёђѓѓгёьцчэяёяяђыышуцчшў§ЧQ-5>+))5@BPA9їїєєѕѓєёяюяяљюэьяђєѕѕђеєѓёѓѓђёющыэђѓѓяштнкклмрыхЁ<*@@<.():AEE@3єѓђђяяэюэђђёяёяёёєѓєєђёёѓјёэююяёєѓѓЪяьхмлйпєяхЇN7TF;1)-585;:;ёђяяюяюьыыэяёюяяѓђђѓєѓєѓѓєєђээ€ПьчдбхђяэшцтскйеУгпЂ?"FI?3(+.2:>?4ёяяэяююяяђѓђєѓѓёяюяяююяёяюяёѓюэьщцтсцшыцчутрсмдббŽ<2JG<5*.9::<><ђђяђђёяюѓѓїїјїѓєѕёѓюьыщшчыэяёѓђюьыччщщчхтснмуюђјя’74IB81,*9;;@?<ђяяѓєѓѕєєёєѓѓђєѕѓєѕђящшцчьэяёяязьчхцпйеейкйптшљўѕŒ%&;;21+58?ABA@ѕђѓёєєѕєђђќёђєїї€ЧѕєяяююяюэьышыььшытЧОдкжнчяѕёѓїс$;931-1;ACCGAѓѕѕєѓєѓђяюяяѓѓђђѓђёёюёёяёђючсрсчшыыєёѓћљљњѓёяюјћс<.4>73-48@?:7яэпдбтыьёєёячьцурйжкучшщэьюяёёєѓђђяёёђёђѓѓѕјјї§ўсw#2<>417?GMHAB?їїюуррттшыэюјѓнклнсушьээьюёёѓѓЪёђѓђёђѓѓєєѕѕјїљђдv13?;10.;BB?:35срнррссрутххутснучьыэююўёђђЯёђѓѓѕєїїѕєјєјђђѓјўўˆ%#;>5.5?@5-+.4мллкллзмуцшщэьээўѕёёђёЪѓђёёђђѕїїјєѕєєѓѕєѕђђё§ўјŠ&;9.)03>5-.*)йежйкйнтхыяёёєёё§ђѕїї§ѓђѕѕХєїїјљїјєѓђєѓѓђђяёђїўэ4,780&29?8.2.4чЮЪшћєюььёююєѓєђєјѕѕїѕїїѕіїјјѕєїѕјєѓѓ”ёяышшѓјыŽ5254-*%&(0><7#ччщєјђёяэяяёђѓѓєѕјњљњљјјѕѓєѓѕєєѕєђђєѓєђѓђђёээьюўўЃA:B972+$).8552щэяђѓєёђђёяяђєљјњљјјљљыїєєѓђђєѕѕёєѓѓђђѓѕђђєђђшњўў—-,;71*&2139502ыщььђєєфѕєѕїїѕјѕјїјљјљјїјєєѕѓѓєѓђяђєєѓОђѓёђяєѓђŒ*,-,"&-7299212яёёюђђѓѕїїѕјљїїѕєѕєїѕјѕѕїѓѓєїјјїѕїєѓєєѓяѓђяясьяятŠ092%*+8??93-,2їєєїѕѕїєїјїјјєїєѕєѓђяэђёяђђѕєѕцєђяђёяђёюёѓђн…*$**.LLF>2,,њѕєѕєѓѕѕјѕцєѓђѓєёэьюьююёђђёђюђђєїїѓєяяё€ЗьыьѕђэЊ\?1.-4@B827<71ѕѓђѓѕєѕєѓєѕєєђѓѓюёюэяёяяёёяэыщцшьээяышээёюяющэ§ўє”<33:8:?@8:;<>7єѕѕѓѕѓєѓёїєђєѓєђђёёђёёяэьшщьыщшццшщщшышщыщхшыщёрх’8,@:0.<>:29;98єѓѓђѓѓѕѓђѓєѓѓђѓђёђёяёьющшщээёяюяшээрыщыщшшыьхдкўУ8.(3;;<:BIE-ѕђђѕєєѕўѓђђјяёёѓѓђђёёёєђѓяюэяэяђђяюыччЯхыььштзщЌ>:P91-7?77;?BB:яяюыэыээщшыьяюёяьщщэяьшхчшыэююЮэыэюяшшццюьєддздкыЅ?89?CLOLёюьюээщшсррхччщыээХьээщцтрцщщшчхцчцхпйтчьюєпЫждбуЄH1,32>A9:>GJH@ьщщшыэюышчцчшхх§цшццдчумррушщаРжкасушчыюђђ§ђьнпяь*>:1E84;9:?C>>0ѕэчууЙснпрнрхурсшьёяяёяюяьыээѓєяёэыщэюђяыцхыяыцйщРH"889?:ELAB81кгдкмпттсртсттьхьяёђѓђєѓєєѓђѕѓѕѕєѓёёћюёяяёёцђэюёўуU*77:@IGG@A<>8ждйтуээсышщьэьюяєєѕѓєѓєѓєѕѕєїїјљјїѕѓѓёѓѓеёђђёѓѓ§ўбJ?CA>?@FB:878;дуйдмюёёяюёяѓђєђёђїєєѕђєѓѕѕїєѕєѓѕѕёпяђђѓѕєѓђђэчюЏZ9.;4<@IG?8545ѓѕљяёююіяььэяяэёђѓѓјєѓѕѓєѕєѓѓђўѓђђфёєѓѓюэьысэг|H29;<>:885?CJёюёёюФэяэьыщчщыяюёёђђєђёюэяђяьюёёѓѓєѓђёђёющэычцюСW2&:?<@;877<@ьэяяёўяююњяюяюяёёђЩѓёђэщщшшцщьяюэяяюящччххтссчИM3?7;BAэђёёїђыэююяѓєєѓЯяэыююяюыщхччхтхэчллцыёььщтнлйжрєНN1,7>AEJMC@;ABэююньэыщьэђяђђѓєєёяььццуутпспнзЫтйежЮцшштцсмсспмђЮ]33BEBBCG?>;ABђђююьшччтыэщыэёѓђяюышцчшччулОаИЏптгецѕээёщцсхуслєнa,@BGEEЎB;7:7<ђяѕэупнсцыыээђђёђюэшчцщьээњїцдпьћјєьяюыцщчзШУбзЯлйq4(:@HONC;,53@ѓёѓснлтхщяёююяэюыщццхчшыььшшчщэюыёёˆпЯЩбздЭШВРпїяƒ;4&95?ёяьцттчѓэюэьбдбЩЯгкпхуццхцшшщуурсШсйФЪЯгдЮЦУРЭхјўэˆ?.8::7:;3:725>CEAHFуЪЦжлрухццчхусутунмзтшшхнеджкйпрхцц§љўїкжчўў§їыђўўКJ7*528A>;7C+-БОаддкнрмнмуцчщччцуцусйЯЪЮдлрртууссшшэпФЭрюяяјщћю{%188в<;9312@бежзЯдйлнртчыщшчхцччщщэѕпумрцуцчшцхчэьўўьїѓђјўэo(%08AB<<:8AE<šгЫдуэђѕњјњјњљјєѕёђэыыээщунбдййнчкйзтьяыьшлЯлнглћўў?AVLH>BGUTNLMжжйщёїјјљїјљјѕяюыютучщсзерпйтяяѓючжепсс€ŸнкЭЩЮжсѓёс—ATcI75B4W^aONчюђїљјѕѕїјєєѓёэююяяьцмжйгййхщююяуузелрсщпнжйтьэѕхж–?GhVC@HE\]PJGѕјљ§љћљљїѕѓђђѓюёєѕїѕяющюэчццыёяютзаЭЮйххсуцнлснзЮКk7F^\W<>BIJTPIклтытппсчёёђёяьссшкгЪЭгбЩЭмщшннцубУУЧЩЧЪЭЩЛЛУаецр—BAWJA<1:?INPOQчч€†шыюэяяюьээяьюђђяёщрЮЧШЮжммцщчжЭЪЭЯМЉЉЗИЗНарёўц‚)-JIB>;2CY[ZNNмлзчяєєѓюрпттццяѓђшцпбЭзлйзмжЭдззжаЭЁ™ДМЗРбпчучюЪx)H>@AEGMVUVUUэяюђяшцткделдкрщэюсййтшэхулЮИАВЧЩЭгупщѓєюѕыыщшуцеA4AJHCB>LPSWW[ѓєєѕёытузесьэьшудежзазкнадеЫОЪЮенцтхьэшхшячужЪТЯБd89NONG?CGT[`WcяѕѓєюьцлИ›œСЭнсдЫйрььшгСЛЯЫМ™ДерцхпйжлдееЯалСЕЌЮЪo2@HBEжжктуыёєєёёѓєєёяяѓђєєїђяшюёђёѓѓ€HэууыьэёюслпулжкеФ…8CEB1AEMMBBCCC@GLQNHIOLIшцчэыёэхтмшящыхшщхрнхыэсЯЭШЪЩЪЦТУРЧЫЭЩЮбеЭЭемчхЧУ‡>7GCCEALCEGLCNтыюющчпшьээюьцчцнтнкжжЯЮЫЮЯгдйаЮЪЯкнбЫЧЭЯЮЮрлеККшЛ9()A?ABNFJTYU<сщчхюђђѓѓєюыучуруыыцжкуьчпжйжлйсмнццлккаЩЫЭййаШКаЄBCTC9>IMQGQOJ-эююєђѓѓѕяярзнсхччёьщттхцьюшцйЭЦЭЯптмаШЧЭЪЧелажлєєЂMI?83&OŠT;@A9<эђёюэђяэмЮСШайгйсржкхющрзпхреЪСФУЯаЫТЭллдклЮЪЫЩкк>59ABT`iSBIBENкпкеглеЮЪазплжпркжблмпЭЦЦдйжЯЪФЫбЯгзеЯЧШШ€ЄЪСИАЊЃрбcG2EEGHJICEWPMспжгдпсжФЩжушшпйЩЦЦгжаЭШРУкхтлЪЯнчхйаФКЛФйнЗКЏВКеœG<:AAQPFCJMUTUрхргЮЯжЯТЗЗРЯзбгмшхуплЫНДУЩЪаеЩССЩЭЦКБЕЭучмЦЄЎДИеœP@?:?HJJHPQTQQбШУЩЮаЭдЪЧТОСШШ€‘ЫбЫФОСЛАЎЛСФШЂ‘ЇЋЅНШРЦгтццєрбЪЦлкˆ2)E@EJPQMPPUG5зжзлдйбЦСЭЯЩММАЎЗУИДЕМСЯждЮжМžžЊБИаышулзггЗ›ЎОШэу’@?M>CJUWTSQJCMтчпнлегаУЦТЦЫЦМЖИРННСНЦамнкььѓїљ§ѓёјђюмуткЪФФпхушž58A5?EJWVYSPPVйжаШИИКЕЗОдтндЦЩбжаемЯФЦЧзыюплаЛЪмнххузййЯФЭдтсюўНTHN;@HNUOTVd\WньнРЛТЯккзбЪШОТШЩЧННЦЧСТЗЅАРЉЌБЋЪслпцугбеезмйуэўѓЌO>8>APWSGLT^WZььзОДНТЧЦЦУФЫЦТФУСМННФЦЪНЕЌЕРЮЪлсѕющзгЩЫжптпзмэўђЃ?8?CHPUSFBEOHUзйЭТШЫЪЯблзсшчлурежЫТЗЗНЛСЗДЪжбЫЭݘЯемЭЯЪжтчщщшўўЛI85;HSQZLHLVVcсуйейкЫЫЩШФЧесхшуйЭШЩенрйЯФНчцййбЫФЪзцчпджйтлесѕўЯM,3FOPWaVQJWIIЇЉЎНИЯегЫЪЫеккжпэяьчьёшэяёяѓѓљјјѕђяюуцхыььщщюющїўЫNHNEGOPSNO?LANБЩЖБТйрцтумшэящсьёшёюёшшЂыяђђѕѕєёяьыпллцьёутнмндлЉbA7>BOPPQTJAELкшюыщььщреглтчхшшююэчщьэьёюђчхнстщээрмтшьяюштзЭУЭЯT@EJJ€MJTLPN]мтцьунмпйжбдЯЫШжрьшхчюьцррмпучутншяѓрчьюхкагЫдЭЧаКZ?2*AMOJMLILNVзруэьсгЭЭдксускссушщщёяэпзЯбйаШЭкцшэплннгЩНРШЫУЧЯВV9?;AMMINGJOUUррпыспхнЯлрпрххчыятлкцыэужЪЭЮЭЪЭЯаЦФЫЮзбШЫШНКДБШнЉO84@BJJWUPIJOPкмнррдЧЩдшуэюёяђюытзЮЫЪЯЧСОЧУИДЈСЗЉВЋЫннбгЩУУШСОкЗ^;8GBMNTT€ьHLGFюэйдЮЫФЫЯдгЯанюёюцлаФЧТУОМК˘Ј‘ˆЕМЊЋЩыппйлаЩЪбгШмЪc7AJSZYQIIGBLIяяцжРЖНОЦЭзбгншшпзгЪЩШШбейшчЮИСбшшуйлтрндеЛЃŸЗФРУШw:+GM^`ZQCEL@>їћјїїњњѕїјњјјїњљјњњјћћ§§љћі§љћјњљ§§њћћ§љ§њњ§ьјњ4G@BAjбїѕєјљїљїјїѕѕќљїїјјућљћїјћњѕѓєј§§ћћњ§јћљљћћљїєљљњњ§эњ115bT\Ќхяяѕїјњјєњјјњњћљ§њ§§їћјњљјћљћ§§нњљјћћљ§љљћљћ§љљћљ§ћљ§њ11gЭчёэѓѕјјѕїјљјљћњјјњћћ§љїјњјјћћњњјјљ§њљћћљ§ћњ§§ўћљљ№ћ,5E)7B›езтяјїѕїїћљјћљјјюїјњјїњјїѓћ§§љћїјњћћѕљћћјњјћћњѕїїњїђѕє).7.M^Њкяэѕїїјњъћљљћ§јїњјћљћњњјљњ§љјљјј§ћљјјїљћ§§ћљћљћћўљћћ(ш&-NЊучшюѓѕѕїїєѕѕїјјїјјљћћљћ§њнљјјћћљћљјјїјљћљњјїјћћњўћћ§(41-.<эщщѕюђїїљѕїјјњїїјўњјјьљћ§љ§љћљјїѕњљјјћњјјњњљћњїїјњћћц§њ1@Fec@wщ§§єѕјњјљ§§љљ§ћљјјѕљћљјћћљћћљћћіјћњ§њ§њ§љћћжљћћ§ўћўћўњ§§;>A@Ahр§њєѕѕјљјјїѕїњјјїњјљ§§љ§§љіњ§§њ§њ§§њ§§ўў§§ћ§њ§ьћў§AMOU9]з§љѕїљљѕєєѕѕћїјјњћћ§ўњ§§юћљљћћјњћїїљ§њ§§њ§ўўћ§њћћ§§њя§>@IC8uы§ћѕѕїїѓєѕѕўљјјђїјћјљњћ§§їїјњїїўњћћњ§љњњљњњљ§њњљћћљљоћљћљ§HNH7ENa™љ§єєѓјїјјњјјњјўњћћсљњњљћјљ§ўњћљјљћњ§њћљїњћљћћ§њњў§§FўaNNё„љ§њїјњњјјћїљћљљјљћљѓћљћћјљ§ћјјљњ§§ћљњљѓ§QЩћљђѕљјїјїїљњњљїїњјћћљјјњјїјњїјїњћ§њ§ћўў§њ§љ§§хљћћљћљ§EGJSIZkб§§їјјљјјїѕєїїўѕјјќњјїњњњјњ§њ§љљќћљљ§§љ§§њ§§њюVgZMVciг§§ѕїјћћљњїїћљѕљљјјяћљћљћљ§§љћ§љ§§ћњљљћљ§фћјњљћћљ§§љooI9??GК§§їїјјїљњјјљўћљљ§ьћљћћјћјљћ§§ћћ§§ўћћ§ћћзњљњњћњїјј~ˆtMMSbбћ§їњјјњјїїњјћјњ§љћљњ§ўў§§іћўўњ§љјљћ§§љћўў§љљ§§фў§њ§§јљ§C˜b51Sлћ§їљјњјјњјјћћўљ§§ўњ§§ўєћњћў§§љ§§њњўўљћўўћўњ§§йњ§ћў:dbWI;Eжћ§їљњјјљјљјћћњњћљљ§§љћ§§ћњљљћњљљћ§§ўќћўњ§§§ўћўўщњўBOн§§њјјњїјћљћљњњўјћћњ§ўћћ§ћћњ§љ§љљћњ§њћўў§ўњўў§ћ§ћ№8BU[OHeеў§їјљјјљљўјљљњљјїљјљјљјљћўўнжd4-&1>731,&)*8<>:98?2%$?HH„ћўњљјљјјљљњљјјљњњљњ§љјљљћњљљњўўЧм‘]-?:":33.+-7;98?;8>N\ij•њўјїїњјљљњљјљљњћњњћљњњјњљљјњјљјјћљјљћўўсз‡c]cF-*E?8337@AE3-BAF\›ўўїјјњјјљљјјїјїјјјѕїјјљјљјјњѕїєѕїўўчљкŠjF8<:PH0&,9;8M^U>PЊўўјјќљјјљљќјљјљљјљўњљљўјљљўњјјљўњўўчсЊ‚kSA53-%vЪўўљјљњљљћїјјљњњўћњњўћњњћњ§ћњљљјљљјїїєњўўф§щЊgMPUb8?0?TgгўўјјљјљјјїјјљљўјљљњіљћћњјљљїјљљњјњњљјїїќѕљљўўюхК‘p9>E9Htхўўљјљњљљќјљљјјњїјљњљћћўњјјўїјјњяљњљњљњњћљњњјљњћћўўѓ19MT3їўћїїљјјљќјљљњњ§љјљљ№їјњњјјњњћљљњћњњљљњњљњћњњјјєљњ48?CH4QСўўљњљњњјўљњњљњыћ§љљњљљњљњљњњјљјїљјљјјўїљљ§јљњњђљј?@9,EЄўўљњ§ћћяњљљњћћњљњљњћњњљћљљњїћњњљњјљљњњљњљјљѓњ54>BOЄўўљњњћћњљњјљњћњљљћњљљјљљнњћњњљљјњњ§ћњћћўњњјјљјљњњ§§7C\[kДўўљљћђњљљјјљљњњљњћњљљѕјљњјљњћњћћњњќљњљћћќњћњљљњућљ3LEHMяўїїјјїјјљњјљљћљњљљњљљ§јљњњјўїљљњѓћњћљљњљњњћћљњњчљњњJT]VaЃўўѕїѕѕїјљљњњћћљјјїњљњњћњљљњњќћљњљљњўћњњўћњњшљњљљ§ћ§ћћњ)7J7FЃўўїїљјјњњћќ§њћљљќјљљњњћљљњњћћљњњћў§ћћчњћњћћњњ40CMB›ўў§љћљњљљњљњњїћљњљљњљљњњ§ћ§ћћњ§§ћњњіћ§ћ§њћњњў§§щћ§ћ§љ2M?GGvсўўїїјљјљњљјј§њћњњїћњћњћљњњћћњњ§ћ§њћћўњћћ§ыћ§§5;>gYcФ§ўїњљњљњћљњњћЫ§ћ§ћ§ћћ§љћ§њћњ§ћ§ћ§ћ§њћћ§ћћњћњ§ћћњћћўў§§20*07rхўћєјљњњњћњћ§ћњњљљњњћћ§ћћ§њљњњљњћ§§ўњњћ§ќћ§њћћёњ4>N53JАљѕїљњћљљћјњћћњњєљњњљњљ§ћћ§ћњњќљћњћћњљљњњћљњљљјє3PNэўўљњњљњ§љјљљњќљћњћћњњћћ§§ћћјњћћњћћњћћў§ћћњћ№§ћ§ћ8.JWGZбўўјјљљњчљјјљљњњћћ§ћ§ћ§ћћ§ўў§њ§§ћ§§ўћњњњљњњћћ§§ќћ§ў§§ѕћT[[NLqцўўјјќїѕјљљєћњћљњљњћњљњћћў§њњ§ћњ§§ћќ§ў§ћћ§ћю§ћњћљ]pbQY…уўњїљњљљњљўјљљњњљћњћњњшљјљљњћњћћ§њњљјљњћњњљљњљћћэњ0HUgr‹ѕў§їјљћњћњћњњћўњћћњєљњњљњћњћћњњћћњћјљћўћћќњћћ§§єћ?8AH@{ђў§љњњ§ћ§њњћњ§ћ§ћњћћѕњћњњљћњћћњћћќ§ћ§ћћўь§ў§ўў§ћ§њ@Id]Avэўўјњњћў§ћћњсћњћ§њњћњњћћњћњ§њ§ћ§ћ§ћћњћњћњћћўўн§ћћ?EMEAqшўўїјљњћ§њљњћљњњћљњћ§ћў§§ћћќ§ћћ§§№ћ§ћ§ћўћ§ћ§ћћњ§ћ§§яћ§ўўћJLTQ1Zнўћјљјјїјўљњњћћњ§ћ§§љћ§ћњћћњњљћњћћ§ћ§§ў§ћћњ§ћ§§яћBBHE9uёўўјјљљњљјјњѓћњћ§ћљњћ§њћњљљїњћњ§ћњљћ§§ћўњћћёњћњћћONPELnтўўњњєћљјњњљњћњњљњњљјќњћњћћіњ§§ўћ§њљћ§§њћўњ§§эћMtN:Qhаўўїљљњљњљјљљћћљћњћћўњљљ§њљћћ§ћћ§ћ§ћћњї§ћ§ћ§ћ§ћўўѕ-MH7@ZЪў§їјјўїљљњћљњћњћћњўћњњђљњњћњћњћњ§§ћљњњщљћ§ћ§њў§78YA7`уўўљљњњљњњѕљћћјљњњћћњћћќ§љљњњћќљњњћћ§њў§ћћё§ћњљGIiOGMЖўўљњњћљњљяћњњћ§ћ§ћ§ћ§њћњћњљљњљћц§ћ§ћ§ў§ћ§ћћњћћLSdŸўўїїўљњњщљњњљњћњћљљћћњћћў§њћњћћ§§їњјљљњћњњ§§шћ§ћBLeMSTўў§љњљљњњћњћњћћњћўњћћшњћњћњћћњћ§ћ§ћ§ћ§ћ§ћ§ћњњћћ§ћєBGNGJTьўўљњњќљњњљљ§ћњћћњѕљћњћћњћњћћ§§іћ§ћ§ћ§ћ§ћ§§ћњ§ћш§@FI>9@CIМўўљћњњљјљњњћўњћћ№њћњћћњњћњ§ћћњ§ћўўћїњћњњљћ§§њњќ‚”vSSљgгўўљљњњљњ§ћћўњћ§§єўћ§ћў§ў§§ћњћћ§§ћўўћх§ћ§ћўћ§ћ§§ћћJЇЅe:7Uсўўљјњљњњђћњњћ§ћ§ћ§ћ§ћ§ўўё§ўўћ§ћ§ћ§§ў§ў§ўў§ьћ§ћ§ћў§AeibP>Fмўўљјњњќћ§ћњњђљњњћћ§ћћњ§ћћљћћіљћћњћ§ћ§ћўўі§ў§§ћ§ћ§§ўў§ѕBIƒуњ§їј§ћћћўњћћ§§ѓњћћў§§ћў§ў§§ћћќў§§ћћћ§ћўў§§јћў§ў§§ћ§§яEOYHBQЇшьєјћњ§њ§њњћў§ћћєўњћћўћћњўћў§§ўўћћр§ћ§ћ§ћўћ§ћћњ§њ§ћћљ§љћG[OQarЛїўљњњћѕњ§ћ§ћў§ўњћ§§ћћў§ўў§§їћўћ§ћћњћ§§оў§§ћ§ћ§ћ§ћ§ћ§GP>?;^Ућњљљњљљњ§љћљ§ћћ§ыћ§ћ§ћ§ћў§ў§ў§ўћ§ћ§ћ§ћћѕўћ§§ћњўћ§ћўўхGMJB@QЉўљѕєљљ§њ§љњњћћњњ§ћўћћ§§ћ§њњћќў§§ћћљ§ћ§њћћ§§№ў>:M\Uqзўўњњћњўћћ§ьўћћњ§ћ§§ћњћњўћ§ћўњњћћ§ўћ§§ћћў§ў§§х@$Ourˆтўўћљ§ћўћ§ћ§ћ§§ўћў§§ћћљ§њћћ§њћћ§јў§ћўћ§ћ§§їћ§§ў§ў§§ћћё§ћў82A`cуўў§љћћљўћўћ§њћћњњ§ћ§§ўў§ќћ§ћ§§љћўў§§ўћћя§ћў§ўGWNa[”їўў§њћћ§љћњњу§њ§њўћўћ§ћ§ћ§ћў§ў§ў§§ћ§ћ§ћ§ћ§§чўћ§ћ§ћ§ћў§ў§§MCPmYmйўўћљњњіћњњљћњ§њћ§§ўў§§ўћўў§ў§§ўћћоўћ§ћў§ў§ў§ў§ў§§[idW^ђўўћјњњљјљњ§ћћє§њћњћћ§ћ§ћ§ћћ§ўћ§§пћ§ћ§ћ§§ў§§ћ§§ў§ўћ§ћ§§ћњћnŒp`m˜ьўњњћсњљњњ§ћўњћћњњ§њ§ћћ§§ћ§њўћћњ§њћћ§§пњ§њћ§§ћўњњћћ§§ћ§C`k‰ž§ў§њљўћ§ћ§ћћћўњћњ§§їћ§ћ§§ћњ§ћћђ§ћ§ћў§§ћ§ћ§љў§§эћ§§ў§ў§ўNHTYVާўўњћћќў§§ћћј§ћў§ў§ў§§ћі§ћў§ўћў§ў§§ ў§я^d|tTŠѕўўћњћњћ§ў§§ћћ§ћўћћ§ўћ§§ьћ§ћ§ћ§§ў§ў§ў§§ћ§ћ§ћўўэUa]TQ|ёўўњљ§ћ§§ћњњћћіўћў§ўў§§ў§§ўј§ў§ў§ў§ўўђ§ў§ўћ§§ў§ў§ў§ўўѕWagtHkщў§ћњњъћјњљћљњћћњ§ћ§§ў§ў§ў§ў§§ѓћњ§ћў§ў§ў§ў§ўўј§ўћ§§ў§ўўщTb`YL…§ўўћљ§њ§љћљљњћћўћћн§ћћ§ў§ўћўћ§њ§ћ§ћў§§њћ§ў§ў§ўў§ћ§ћ§ћ§§зћў`haU^ƒэўўњњћћўњћћ§њ§ћўћ§ћўћўњ§њћћ§ћ§ћ§ўўљ§ћћў§ў§§ћўћ§ћ§§шў§§daLdqпўўњљ§њ§њ§њ§њњћћ§єћ§ћ§њ§њћћ§ћўўї§ў§ў§ў§§ћћљў§ў§ў§ўўэ>i^LTiкўўњљћљћљњњ§ћћљўћ§ћ§ћ§§ћќўњўћћ§їћ§§ўћўћўћћњўћ§§ў§§іGLkQIrюўўњњьўћћњўћ§ћ§њћћ§ћ§ћ§ћ§ћћљўћў§§њћћ§нћ§§ў§§ћўћ§ћў§ў§§ћ§[d{d[`Уўўњћћњ§ћ§ћћњ§њ§ћћ§§њў§ў§ў§§ђћ§ћўћћњћњ§ћў§ўўћ§ў§ў§§ѓћўMgq``oЛўў§њњчљўљћњћћў§ў§ў§§ћў§§ћ§ћў§§ћћ§њўћћ§нў§ў§ў§§ћў§ў§§ћўtdp~nŽШўўћњћњћњћћ§ћ§§ўў§§љћўћўћћ§§Юўћ§ћ§ўўћўћў§ў§ў§§њћћ§§ў§ў§ўWTTV[Тўўњљўњ§ћўћ§ћўњўћћћўњ§ћ§§ђћўћ§§ў§ў§ўў§ћ§§ћїњћ§ћћ§њ§ћћхўћўPVNce{Вўўњјњљ§ћўњћћўћћњћћѕ§ћ§ћўћ§ћў§ўўѓ§ўћ§ћў§ў§§њћ§§ёў§ў§ў§ўV^wbeiЁўўћњћћўћћљўћ§ћ§§ћћ§ќћ§ћ§§їћ§ћў§ў§ў§§іў§ў§ў§ў§ў§§§ћў§§ѓўUeaVVmљўўњћћњў§њњћї§ћў§§ћўћ§§іћ§ћ§ћ§§ў§ўўє§ў§ў§ў§ў§§ћ§§ёўPZ]PHThйўўљњњћћѓњ§њћћњњ§ћўћ§ћћўўћћњњћћў§ўўљ§ў§ў§ў§§§ўћ§§кў\acganxцўўњўћ§ћћљћљ§њ§њ§њћњћћўћћњћћўћћїў§ў§ўћ§ћ§§хў§ў§§ћў§ў§ў§ўr‰qdewzхўўњњћ§§ђћ§њ§љ§њ§ћўњўћ§§ћђ§ў§ў§ў§ў§ћћ§ћ§§ќў§ўћћэ§ћ§ћў§ў‹Ž\PVUYЩўўљћћњћ§ўћ§§јћ§ћ§ћўў§§ћћў§ў§§ћўћ§§ўўнћ§ћ§§ћ§ў§§њўћў›А•hecvчўўњўћћњћњ§ћћ§§љў§§ћў§ўўў§ўў§њћ§ћў§ўўњћ§§ў§ўў§§ў§§щўdФИ|LLdэўўњ§њћћўњћћ§ћ§§§ў§ўўќ§ў§ўўў§ўў§§ў§ў ўњ§ў§ў§ўўѕQzwvaMYшўўњњ§ћњ§§эћ§§ћњ§ћ§§ўћ§§ўћћ§§ћћ§ћў§ў§ўўњ§ў§ў§ўўђ§ў\V]uiTdёўўњћћѓў§§ћ§њћћў§§ћўў§њћ§ћўћ§§§ў§ўўќ§ў§ўўў§ўџ$ў€џџ%ўˆџџ&ўˆџџ*ўˆџџ-ўˆџџ1ўˆџ џ3ўˆџ џ9џ9џ9џ9џ9џ9џ9џ9џ9џ9џ9џ9џ9џ9џ9џ9џ9џw8џ8џ8џ8џ8џ8џ8џ8џўˆ7џ9џ9џ9џ9џўˆ8џўˆ9џ;џўw9џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џ:џўw8џ9џ9џ9џ9џ9џ9џ9џ9€Џ:%!0"$$142*$")%(#(P81*$02;;2-.?к2$%&!+-#!--$,97<4!"#Q?)*3@:8%"HчI?>LY;2;9558:;0% -;875>31%(4"1iяNHCG8<;BA7[h4.>J9,+9@>8C;9-?F`^H>HF>7)&:4Ў§AMLJHJ?@I;>[>?:3-%"(Ui:#јF&CLNTNQOOY^SJPTTGMN:9,$ #!##&(.*()Zу§јнЏƒ^1"$&)%3++#)"34$$<!14A@S&!%kђ§§љћ§ћњЧЅniN2JSo@+5.!-;Td?C9WBCPHG4"58>F*$EЋ§ў§њѕїєјїњљ§§ијуССЦЗ•wЏФЇКЋœƒ]–Ÿž‘’o]M+@1>Šх§§ўћјїєїїѕјѕїєљјљњ§ћ§§ѕћљљњѕћ§ћћљ§§јљћ§ьЌѕљ§§єњїѕѕїјѕїїєѕїї§јєїїє§ѕєѕѕкєѕїѕєєѓєєїѕњ§јљњїљ§јїѕѕїѕїњјѕїјјїјјњјїїќєѕѕѓѓ§єѓѕѕєьѓєјћ§јјїњјћјјїїѕїђѕєєѕієѕљїѕїїѕљїїћњјјњїїћјљјљѕѕіјљћћљћљћћїїўљїїјяїѕїјњєѓѓјїїѕђјєїјјяїћњћћ§љјїѕїјћњњ§ћћїњїїјњјјњјјїўјїїјљјћњљњѕјћ§§ўќњљјїїыјљјїїљљјѕїѕѕјћјљњјњљћћ§їјљ§§њњћљћћђњ§§њљљѕѕњјјћј§§њйјњјјћњјїјљћјјњјљљїјїљћљњ§§ћ§њ§ћћњљљ§ћћјјєљћљњћћњїїљјћћњѓљїљјњћјїјљ§њўўћшљјїћћњ§љјјњљєїѕѕїљљїњјјћћ§ћљєїїјјћљјќїћћљљјњјјњјїљїїљњјњљћњјјњћјћћљјјјњјљљњњ§љљћћєљљћћїљњњїїѕїјљљќњљћњњєјњїєѕїїјјћћљљўћ§§њўѕћјњњјїјљћ§ћћѓњ§ўњ§ћљљјјњїњњђјћћњїћњ§љ§ўў§ўўљїљїјњјњњљњћ§њњ§ћћђјљљјњњљћћљљњњўўяњ§§њјћљњњћћљћ§ћћ§§ўњјјўљћћ§њ§ћћї§њўў§§њњљљќњ§ћ§§јњ§ўўћ§§ћћўјћћљљ§§њњљњњю§љјј§§љњјїљњњћњўў§§ѓўћљћ§ћњћљћ§њ§§єћљјїїѕ§§љ§§њњљљ§њњљљћћўњ§§§њ§љљћќњјјїїэјљћ§§јљ§§њ§ћћљјћ§§њњїљјјћћљљћљљјњїјїїћ§§љјљїјјљћћљљ§њћњњ§њ§§їљћљ§њњљљ§§щњ§ћўўћћљњњ§ўўњњ§§љљњћљ§§яћњ§ўћњ§њ§њўўћў§§ўўћћ§љћ§§њѕљўўњ§њ§§ўњљљ§§њ§ўў§њўћњњћўў§њ§њњ§љњ§љњњўћћў§ђјљњ§§њ§§ћњ§љјљљјћљњ§ўўћўўњ§ћљљњ§§ћјєљћћљјћћњ§§њ§§ўўњ§§§ўњ§§љцћљјјљљњњљљћњћ§њљћј§љљћјљј§§рўћўћљјњњћ§ўўћ§љ§§љћљљћљћћљћљћћљ§§љў§§ћљћ§§іјћљљ§њљњ§ўў§њљ§њљћљћ§§ўћ§§§ўћўўю§ћјїїјјћ§ћћљћ§§ћљјјю§њ§ўћў§§љњњ§ћњ§љћ§§јћ§љљњњјїї§јљћћјѕљћ§§ћћљњ§њ§§ўљћћљњљњљ§§њњї§њњјљћјєјјљьїјјїїљћњ§ўўњўўћ§ћљ§њњќўћњћћўљ§§їњ§§јљљ§§ћћљђћјљњјљњ§§ћўўњ§§ўњ§§№љћ§њ§§ћћљљ§њў§њ§§ќћљ§ўўїњћјњћћњћ§§Ъњ§§њ§§ћј§ўњ§љњјљљњњљљћћ§§њљћћ§њ§љјљ§љјљ§§ћљљ§ў§§њљљћљ§§ьњўў§ћљ§§ўў§њљ§љњљњј§§ўћљљіћњ§љј§§њ§ўўўњ§§љћјњћћўўќ§ўўњњ§§њћљљћњљњ§ўњ§§њўћ§§њ§§ўјћўў§њўўњњ§љњ§јњљљњњѓљјњћњ§љњћўў§ўўўћ§§њћ§њљћ§§ђўћўўћ§љњњћњљћ§§§њљњњўэ§њњ§§ћјљ§љјљљћћ§њњ§§ќњљљћћћњ§§њ§§§ћњўўўћўўыњћјњїћљћ§љљњ§ўў§§ўўњ§§ўћў§њћљ§ћљ§§њўїњљјјїѕї§њњ§љёћ§§ћћ§њ§§ћћљјјљљ§§њ§§љљѕїљ§ћљљљјљљњћћњњљјћљњњ§њњў§љњ§§њўў§§ћўћўў§§ў§ўѓћњњўњ§§ћњ§ўћ§§ћљћ§њўўў§ўўѕћўћ§ћћ§њ§њўў§њ§ўњ§§ќћљњ§§ѓћљњ§§њ§§љњљћ§§ѕњўћ§§ўў§§ћ§§їўћ§љњћјњ§§їћ§њљњїјљ§§ењ§ћўўњњ§њ§§њ§њћњїјћљјљ§њњ§њњ§ћ§§ћљњ§§ў§њ§§ўўћќ§њћўў§ѕјїњљћљљћњ§ўўјњ§§ўћ§њ§§ѕњ§јљїљњњћћ§§іњўћ§ћњљљћ§§ўїћ§њњљљ§њ§§їћљћјљљ§§ўў§њ§ўўўћўўћў§ўўћ§ўњ§§њ§§ўћ§§ћўљћўўћћњўўэњ§§ћўњ§њ§њ§њ§њ§§ўћўў§јћўћњћўњ§§яўњњ§њўў§ћјјљ§§њ§ўўћћ§њњўўў§ўўћўєњ§њљћ§ћљљћњљљўњўўєћўўјјћњљ§§њ§§ўўћўўќћўњўўћћўњ§ўў§цњўћћўўћјњћјљ§њњўћўўњњ§ћћ§ўўўћўўћўњћўћўў§§њў§ўўћў§§ўћўўќћўћўў§ў§§њљўўњ ў§ћ§§љ§ўў§ўњўўўњ§§њўњ§њћўўўћўўњ§ў§§љћћўњўўўћўўќћўћўў§јўњ§ћњљљћћ§ўў§§іћњћў§ћњ§њћћћљ§§њўў§ўўћўў€w30*%% ,!,%!"+,)$082*&-*!#O<-*."(,0&)0;р31,+ *++140($#&,+%&3;84+&%"#S>308::,!"Gђ9>BL^B5@;.75(("*+)-39BA5+%%!)93+032(.;--oљ>EE>>;@CC:^a429M8.*4A@2970&5@ZT?A:<:-.?"7Љў7B;>HCFJG>:?CHJLFGLUZPG@IL;>J)48E" .)$$**%;\їўj\@,1*+:AEA@CLH2<:1&  "!#**.+(\ыўјтЕ‚c.$" !$7!($,;(!03"(<7?W+"&gјўўињЮЋogN9POp<+51.3BSc>>:^ABQCM5&1<<@.%@ЇўўљљјѕљњњўўпњуШЯдОžŒxЗЪЌСЗ›…aœЃЁЃ’—p[P-A2<’чўўњ§љјљљїїјљјўћ§ћўўќњ§ћў ўћьЉјњўўј§љњљљїјљљўјљљ§њћљљјўїјј§љјїїљўђњћ§љћћњљјјљњљњњїљњњћњњљњљљјї§ѕїјјїјњњ§ћњљљњњљћњљљјїїј§њјљљјљњьћљљїјњјњјњњћњћћњћњћљљўјљљњяљјљњљјјїїљљјљїљљњњўћњњћљњљјљњћ§§њўћљљњњљњњљњњўћљљўњљљњћ№њ§ћљљњњ§ћ§§ў§ћњљљіћњћњљљјјњљљњћѕљњљћњћњ§ћ§ћћ§§њћњњі§ћ§§ћјјњљњњ§јћ§ћ§§њљњњыљњљњћћњњљњјјљњњћњў§§ћћї§ћўў§ћћ§њњћќ§њњљљяјњћњћњћљљјљјњљћњћћў§ўўїћњћњњ§§ћњњѕјљѕјјљјјљљњњњ§ћ§ћ§ћћњћћњћћњњ§ћњћћјљњњљњљјљљњњљћћљњњђ§њњћ§њњљњћћ§§ћћњћљќњљњћћђљћњљњљњљљјјљљњњћё§ћ§§ў§ўћњљљњћњћћ§њћ§§ўўћћњьљћљњљљњћњљњњ§§ћ§ўўћўўєљјћњљњњљљћћ§§ћњћѓњљљћћњћћ§§ў§ўў§ўћ§§зњћњљћњћњ§њћћ§ћ§ћ§ћњњ§ћћњћњњ§§њћњ§§ў§§ћ§§ћћњ§ћњ§ћ§§ўю§ћћњћњ§њћњћћ§ћ§§ў§§ыћ§ћ§ћћљњљјљњњ§ўўћ§ћўћћ§љњћћќ§ћ§ћћњљћ§§ћўћ§§ўў§§ћњњћ§§ћ§§ћќљњњљљюњћњ§ћ§ћ§ћ§ћћњћњњћ§§ўћњњћўњћћњѓћњћљњ§ћ§ћ§ћћњњќћњњћћн§ћћ§§ћ§ћ§ћћњћћ§§ћћ§ћ§ћ§ћў§ўћњћ§§ћў§§ћњћэ§ћ§ћ§ћ§њ§ћўў§ћ§ћ§§ўў§ћ§ўўќ§ў§ћћ§§ћ§§ў§ўћ§§ћ§§ћ§§ўю§ћўў§§ў§ў§§ћ§§ў§ћ§§ќћ§§ўў№ћ§ћў§§ћ§ћ§њ§ћћ§ћћћ§ћў§ўў§ћ§ћћ§ћ§њњўћњњћ§њћњњ§§ћ§§єћ§ћў§ў§§ћ§ћ§§ћћ§ћ§ћћў§ћћљћюљњћ§ћћ§§ћћњњћ§ћ§ћўўёћљљњћў§ўћўћ§ћњћћуњћњћњћў§ћ§ћўћ§њћњ§ћ§ћ§њћћ§§ў§§сў§ўћћ§§ћ§ћњћњ§ћ§ў§ћ§§ў§ўў§њњљљњњі§њњћњћ§њћњњ§шў§§ћў§§њњ§ћћњ§ћ§њ§ћћљљњљљњњћћњћњњјћњ§ћњњћ§§ёћ§ћћњћњњљћ§ў§ћ§§ўћ§§ћ§§ћњњћљ§њљљћћ§§§ў§ўўћ§ўѓ§ћњћў§ћ§ћ§ћ§ћћћ§ћћњћћыњ§ћљњћ§§ћў§ў§§ћ§ћ§ћ§ћћє§ћ§§ћњћ§ћ§њћћ§§ў§§іћ§ћ§ћ§њћћўўѕ§њњљњњљњ§ћ§§љћ§ћ§ћћ§§ћъљњћћ§§ћћњњћ§§ћњћћ§ћћњћћјњћћ§њћћ§§фћ§ћћњћ§ћ§§ў§§њћћ§§ўћ§ў§ћ§ў§ћћћ§ћ§њћћ§њ§ћћћ§ћ§ћўўћ§ћ§§ћћ§ўў§ўў§ћў§§ќћ§§ћћ§њћ§§іћ§ћ§ћ§§ў§ўўњћ§§ћ§ўў§ў§ўћ§§ў§їћњљњ§§ў§ўўіћў§ўў§ћ§ћ§§љћњћћ§ћўўћъљњњ§ћњћ§ћ§ћ§ћ§§ў§ў§ўў§§ѓћ§њ§ћ§ћњћћњњ§§ћќ§ћћњњ§§ћ§§јћ§њ§ўў§ўўѕ§ў§ў§ў§ћњњћћћњ§ћћ§§іўћ§§ў§§ћ§ўўў§ўўњ§ў§ў§ўў§ћ§ћћњ§њћ§ћ§§їў§ћћњљњњ§§ћѓ§њњћ§ћ§њћћњњћћѕ§ћ§ћўњљћћњћћљ§ћћљћњ§§ћњћћ§§ћ§§лў§§ћ§ћ§§ў§§ћ§§ў§ў§ћ§§ўћ§ћў§ўў§§ў§§ћў§§ўўћћў§ћћ§ўў§§ ўє§ћњћ§ћ§ў§ўћ§§ўћ§§щћ§ћ§ћ§њћ§§ћ§њћ§§ћ§ћ§ћљћћ§мўћћ§ўўћ§ў§ћ§ћ§ћ§§ўћў§њњљћ§ћ§њ§§ћљћњћћ§ў§ўћ§§§ћљћћ§њћ§§љћ§§ћњ§ћћ§§ћ§§ўћўўя§ўў§§ў§ўўћ§њћљћњћћ§ўђ§ћ§§ўћ§ћ§ћ§ћ§ћћ§јћњ§ћ§ћ§ћћ§ьў§њљћћњ§ћ§§ў§ўћ§§ћћ§§љћ§њћњњћћё§ўў§§ћў§ў§ў§ў§ўў§ўќ§ў§ўў§№ћ§ћ§ћћ§§ћ§§ўћ§ћўўў§ўўњ§ў§ў§ўўј§ћ§ўў§ћ§§ћў§ђћў§ў§ў§§ћ§ћ§ў§§ђў§ћњ§ћў§ћ§ћў§ўўє§ўћ§§ў§ўћў§ўў§§ў§§їћњ§њћћњ§ћћў§ўўњћћ§ћћ§§њћ§ћў§ўўћ§ў§ў§§§ў§ўўї§ћ§ў§§ћ§ўўїњљћ§ћћ§§ўўј§ў§ћњћћў ўў§ў ў§§ћ§§њћў§ў§ўў§§ћўўў§ўўэ§ў§§ћ§ћ§§ў§ўћ§ћ§ћ§ўўћ§ў§ў§§ўќ§ў§ўў§ћњњ§ћўћўўќ§ћ§ўўў§ўў§ќћ§ў§§ўі§ў§ўћўћ§ћњњў§ўўў§ў ўя§ћ§ў§§њ§ћћњћњ§ћўћћј§њ§ўўћћ§§ёћњћћ§ћ§§ў§§ћ§ћўў€vFCB@9-2@75>.(-BE@I7GHAC29;<7,<4dNACGN;<,?AC+OьGF<4<08B.<&@Q.CЖўBJCFTJUZVSOUGStQPZc]\^Z\[NIHHG>I;E;>7031;p‡M7ВўZ1GJOUWTNTde[OOTSJNS<@ES&-)034?;.+;MoўўzpS:9>3CFOHQPZOB>?32"( 0.7%*,77@@C);,&iїўўђЭ–v:.*,!&(&?+?#5<4),FG>2@P0,5GNJSj<81}ўўймОЃ‚r^I\azN;C>CMLNQNOQaS(UюєюђьрмжзхпзмрхыщцурдгЮййхртычцтчлЫечхкљћљ§ћћ^-C3AEFJ<@EIPOMYh\‚ёяхышщюхкурцпсхтпюржрсцюыкцттстнппйгймкўћњ§ћцH-JPLILOOPPW\WN40;ФљљяыюђьыспэёшзмгсщыяькйлмдкзЯЩлншьёыхузћўў€ž§Яh-BTMEHLH?S]WkiwnMЌшхежушттэјћржйажлмуышёѓэшыђящутхухчьђшлћњљ§їм~?8GT)*.4:IAOIFUdgшїщнщѓђшђ§§ётмжпЮУТйЯжкьхстспэцплЯлтяѓэьћўў§јЅQE*->801&.249CHTPYщјчрэяђшьђђ€щхмЧдпнЫмейздЧССУзухккрзжкряяћћ§ўсd3GGJHFA?A9>HhakrimКььыююьчыёђюэютйкпбегаЧКОЪЧЭсчгебжагЧУгу§ћј§эW3OONGA>IEIHCFBL~a’ѓћьщщьэшщщяѓшсцщуумЫШЩШЫдммрчэыэыузччхкњњўћј…BGHLFMPMJFMEE>;hn^ЮћљѓёщьцккйссцрткпуунпрпсрцщсбЮЧЩгаЮайтпњњ§§ђŠmU?G>?@@€rJFIMPLYC\щјћљњљђудйамцяуйсущцндруьхйпаРИЗФаЮегЪбЩўњўўшpmF[H<.9<9:JJSHbxerћћ§љїѕѕєысммлкруулржЭктмухмйргЦаздЯаРРТг§њў§ОC.:Y{??HALTYTTUeeЉљ§њљњ§љљёьяяѓѓьцьщящшђѕњјѕђящэюэчМКЪйлЖИ§§ў§М|„WFSZPEME??FU`]c\ƒљљјњњћћњяээёьющцсшщэяёљљэебрсщьющтлсмкСЖўўЂ§щt?[UTMHAEbiFBJ]TH]ћћѕљћњїєѕѓѓљњїјѕђьсэјљљјѕѕыяёёчшюёяяьщрдўў§ћљŽ<>LNIF?A9Mwvg^dqrИ§ћћўћўўћљљЦєѓјњњєьнкущхюцщцыяёђёюђѓьчсрнўў§§љp:MLJMHB@(!FucbhWWЋљ§љћўўћшїњљљњњѓјєяыйххчюурмйкхтяясцтщѓѓў§љ§с]@]TVONFB;?WPY[Vc‰эћ§§ўћўўЬњћљјђюѓчьнутшрзерпшёыычрщђюўљ§§пT>PY[VMLHL]\Z`]aNrѕ§§ўњўўфћњѕїщыххчьятщуЮЭЭаатьшлмчэўћћшЯAFWPNNINJFIBHFQTO`щ§љћљљ‚њўўњљљјћѓэяюьяёёэёчлтпжЫггШТйтцкдуњљ§§Ж<59JJHOG:@HJIIQZV`у§њњ§§њљїљ§ўљљѕјѓьхущчышдбтёєєѓѕьззсхнжххњњ§§ёt`ZYNMOGILMOPYaVCnћ§§ўћћ§ўћўўЦћўўѕэыюђэырпцьэёѓѓёюпетюььшў§§ўШ@:ISPG@@>@EIOV]@,]ђ§ћ§ћћњўўћћњўўћћањјёшчщєјѓяччяђђёэчэшчхх§ћ§љРA5CQILIE>AAFLVujJŒљўўўњўўўћўўЅљјѓяяюяђєђђёюблцрцяёэщйЦеу§њ§§7Bbj`NCBINHJP[VaЪ§§љњћћўўњљњњћўћљєяумсщущюэёэюёэсууспхнзжж§§ѓѓg`rp[IA3@AEMM№JtPoтљћњ§§љњ§њљўўлњятзслтуыёыщщцрЭЮпруынблў§§їh;E9H<4NVVё\]aY^E[эћћјћљћ§§Тњљїљњ§ћћњэнххтунппкрзмеШЦезнхукањ§§ьi3PALGC18CIO\ba^;]є§ћљњ§§ўў‚љ§љїєєљјѓчхцкйхусммснгеЪдмйейкжЯ§ў§ы^BHMQOGHGACCQVhmGŽљ§ћњ§§њўўњ§љјђэщяёэышјљѓюгакухнмлзммтжеежн§ў§єG.PYU[UQI@HLQYYN7Б§§ѓїјљћјј€ ѓѕяѓѓяыяхыёєёщпмжмшузнгЯЫручууруљ§љтL*?BHGFPFG9IMTkI:НљћјјљљњјѕёючлтхшучуушшсжзЪРЛЫеЯСНОкчэђьхпщћўћДC4LELSSJ;CC?CHQQ9Ќјљљ§ўїєюячырбЭгЯагстрсбРФЧЯЪЯгЦНЖЗФЮлшђёьрљћљЗ@;dNP][J@E:FGLPSAœючшяїљљћљїюлЫаЧООЯсмкчсйЧРЯдЮкУЦбОМРгешцчзљћћЗFEVHHLLFALBBHOM@1nШЦехьяѕѕёёчмдЯгЦЦЪЮжпмеЧЫОбрдзгддЩУЩЮжлкумјљћУVHLHFEC?CAGCIQMJ@ƒкМЗЪдкхёѓљњѕяѕужЦзнЫФЖЖВЉВЧактрнмегмрхнмгТїћїЏ8NWA481:7‘ьхмнлжлчщуйзлпнчцяьщяыы€—ёяшрппелмхуцрдФЖФгў§ьŠF@ELHB02(.C@?IY?wŒ;:FŸючжйжЭЩЧбзЩЮЩЦнЮƒzpq’ечнрпупртзЭбекчттцрзШ§ћт[.9LQMCB;:FJJF][YdЕѓєщшлбСЧШТНКЯбуьцрŠWИЧОМЭхщлбЫесшюхпйемйЮ§јйH#.AE@A??<@>:@GI;NŸєћюхрркжЫФЩрщччтсйШœЯЩбЏŸЮмнуйнмтьщэшмкухщўћЫN*9AC3:3.29AB?E8JMœыящыяёщэыцяѕєђтйЯНБЎЎ‰a‡ЯпайЮРФЭагкнйейучш§ћЛ<4MLB55778ABS^Џцухюѕѓђёщяєє‰ёюцрЪЛФЧбНЇ•ŸМФРЪйЪЫЭмнзЭЪнхз§јЫ[IGLE;:;:08?CEHVSVДёцсыђёєїђєёюяѓэььмЭУЛМдеайФЩЯжкОЉЖЩдйнлхтх§єЫb?;G@E?710>CJLNPVюѓєьыы€эђяюььэырхымгЩЮСЫаУЫЭаЭЭЪКЈЅЎНШЭзелсћјаI)+A;9*IVVAME.cујёкажнмжЭЮджртхусхуккнжТЫалпннмбзрщткхчыссщ§лbIoZ<,4,*,&;@IPB5vйѓющытцлйеЫдкжЯбЯЩЫЛТЪгзаФЗКЦУШзллŒрзешыэщчрј”CLI8$8;1BLEMJO7*aШюцлнпеЭЮзЧЮЮагсжаЪЧаеЯУЦЦбййззлмшяяюхцптрзйѓb;PF0OxN<@WY]c`B1OИЩИМЫдбЯеЩШЩЮбжйкжЪЛСЧУУ€гЭймпдзстчхллгбЮЩддЫйM;MEGTwqF+B08PQPS?OЅМЗЪгккззЯСТЩЭЫгмгШЖОУЫШЩЦУЩЩЯгупбззббсйЯгСЪОH049V;!>BECCJQPUSV[^(^ўўњњѕћњљјѕјљјћ§њњјДћњћљўљ§њњћњњјљљјѕљћћњћћўў].?+BFE8BFIMTZZ^wcŠўўњћ§ўљћћљ§њ§љљћћјћўћ§њњљ§їљїјїћћр§ћ§ћўў§ўўьM-QTMJMPOU\bacY37BЮўўљљњпљ§ўћњїћј§љњћћњўўћљ§ћћљњїћљћњћњњјўўхжj.CWN@CEOF[^Upx~{UСў§љћћ§ўўЩ§ћ§јѕњљѕљћћ§њњ§§ћљљњ§њљјљњњљ§ћў§ћўўн>7JS13-<>T?IM?Pkqўўњнћ§ћ§§њљєєђјјњєњїњїљјѕїњљњњљћјњљњўњўўФБWL*)A>4.75399?MSU`єўћћљћњ§њћћљћјћѕїѕњєљѕљєѕєѓјѕјѕїјјњљїјїћўўЈчj4HFFJEA><@FLi]qxvvЫўўљњљњћћњћ§ўљљћњїњѕїєєїѕѓїјјї§њћљћѕјњјј§њ§ўє^8UPOE@CFNIMLIHGƒŽežўўњњјћљњјњћњ§§ћљїїјљљјњћњљљїјћѕјљњ§§ўўц‰EHOMICBHGGCJMCAh{bеўў§§ўњњќјљјћћќљћњћћ№њћћ§ўњјљїєєїїјїљљ§ўы‰rYB?C?@?ABHHQVL]J]ђўўў§ћћЧ§їћјњїњљјљњљљ§јћњњћїїѕєјїјњјѕїєљў§ўўыvnMQM?85;BEHSSLe~knўў§ћ§ћа§јљ§њњў§њўўјјњѕѕїљѕјѓѕѓ§§ўўРH0@G{‚d`ou{Оўўў§ўў§ђў§ў§ћњ§љ§њ§ћњћћћўћћњћћќњў§ўўьvEOPQQN{Vnюўў§§ћў§§§ў§ўўі§ўў§њњ§љўћћ§њћњњѕјњјїћћњћћїўўшqЌўўњљњћћ§§њњўћњњыћљ§њ§ћњјњјљљїњњѕѕєћјћћјсњћўўшG,GNIGHEFBMOTZqJ?Сўў§§ћћљњњэјљїљїљјњћњљїїѓїјљїѕѕУђѕѕјљљњћ§љњўўТA7SLGIMHGCEFHIS\?Еўўћ§ўўћ§ћ§љјїїѓєїјјљљѕїљѓєёєѕѕ€”єѕєѕїјјњњїјћўўЗ@4eUSWYEEFGCLJ\VIЉўўѓїћћўњћћјїѕёѕѓєєѕљњјњїѕѕєєљђїєяєєѕєњїљјјћўўНMJWMCAFFMJFBMPSC7ўћјѕїљњњ§§ўљљјєѓђђїїѕєѓѓэєїї§њћљјїјѕїєѓѕєїњўўШ[IPH>>§CHLLкMPWLL˜ўљэѕєїљњ§ў§§ўњћїњєєѕѓѓђьююёєѕїћњњгћїјѕѕєѕѕљўўЗBMNSSLHOMJ—ўўёєѕѕљљ§§ћњћ§ћћЩљїїѕёѓёёѓєїєћљњўћјњїѕєѕѓї§ўўЋG:GH??<>CFPPQTnV[œўўјѕїљњћћ§љјњњћљњјјљљјФљѕјњјјљњѕѕѓєєѕђєјњўўŸ2-GJG@:88?CT`@}ŒB5HЅўўїїЖєђєѕѓїёѓєћяБЇЃЃОїўјюэяєѓёѓїѕѕњѕљљєїѓєўўы\+5JNIA>ACPO?OTЋўўјљљјњјњњљјїїјѓѓэшулН‡БѓњюэёїѓђєѕѕєїїљјљљўўР;-IMF:-5?BHJJNHH`eОўўљљњњћњњљљјјШїєѓђяї§шнжнэяєѓёѓяѓѓѕѕјјѕїјўўаUJBIF<5::?BFGLGc[bЪўўјѕїјљљјїЮјїѕєѓђььјљѕљєђёђёђђюяђѕѕљѕљљўўйi<:@@7227:>LPTSQ\ЄўўѕћїѕљјїїьѓїѕїїєѓэяээѓюђюѓђёюээжюёѕѕјїѕўўсV2*EHJ@??NLONQ\PT‚хў§ѕѕїїјјњљјїѕѕУяђѓєђѓєђёђёѓѓёёєяђюѓёђєѓїѕѕўўйb7>FMHBS\hiU9ILHA`ЭїєђёђѓїїљњњјјљѓєјѓјљєєўѓїїјЪѕѓєђёяьяёѓёѓѓўўЏIE:EFC@GGdœ‚?AJVIєўјєђѕѓѕїљљјїєїєїљјљљЧњїѕѕєїїѕєяёђђѓёяюяёёўѓiEH5EHFB@5IwŽ]akZbсўўяєѓѕєєђѓєїѕѕєїїѓљїјѕєѕѕјїѕјєѕѕнјѓїїѕїѕёѕўўqCaUAB>@>-N^^M^Q8mэўўѕѕєєѓђѓѓђѕєїєєѕѕѓѕѕ“ѓїёђёђѓѓђѕєїѕєѕѕјїљјєўс^Ov^C@427>BFLOUJAюўўєїљєїєѓєёёђѕєѕєяђђѓѓёююёђёѕѕёѓїјјљљїљјњјјў›EWS3*4EBHLWLVVWC4jуўћѓѓљєѕєёѕђєєњђїѓёёђђіѓёѓђєїєѕїљљЯѕљїљјјњї§i;YS>,\‡ZCCdcjgdO:\мўщёђђѓѓђѓёяђєєѕѕѓяёяяњђѓђєѓѕѕкљєєїѓѕѕєєёђѕлS;MPJY}qH9H;@VY\\AZЧььяєѕѕѓўѕѓѓіѕѓєєёђяђяѓѓађєєјєїћјјњњѕѕєюѕѓФL,.G<[@!($AFFMT\kg}щўљђєїєєѓєѓѓЂєѓѕѓѓєђяђѓѓїїѕїјїјљњљњјњїїѕїљљј-)9FPOJA78AIIHOUF\uдњђѕѓїїєѓяѓѓєѕѕяѕєѕѕєєѕѕљљѕјїѕљѕїљјјљѕљјљїјјќў§ћўўХ™‡~WYSUTNbjheiepn8gўўјјњѓђђяєяюяїљѕљєѓђѓђэёѓєёєѕѕјїїёьюѕєј§§ўзq9UBV\ZaN]gcjrovŒt›ўўјјњјњѕјљјјєѓїѓљѕєљїјјўїѓѓђєѓљїєѓєљјўў§ўўХ^>kjc^`Z`hwv|t}GGSжўўњїњѕњїјљўљїэѓѓѕљњљњєѕѓїёёяцтюђѕїћјјєєўўйхzBWndOPSOTkrpƒ–ŽeОўљєяѕјїѕњћћјыхёяєєњњ§љњјјВљјљєїїѓїћјћјјўў§ўўчŠQLej9@ACTj^\cYgzˆўўњјїњњјњ§§ћђёыѓюсрэчюєјїђїєѕїѕѕёїѓљњ§њњўўчЭjcF?ZPGLEOYVIW^jhnњўљїїјјпњ§§ћѕѓхђёяцёэёююпсщсьѕђєяђѓђђїїљўўзѓvG\Z\WYOSIWWd‚‡Ž‰ƒдў§ћјњњїјћњ§њњѓєђёыяццїтлцххђљёђђљыьтрэѓ§§ўшmJhde`TLWYW\``[]žЁuЏўўњїїоѕєѕїљњњјїѕѕїєыуьшыюёёєћѕљїљѕяѓїєєўўыŸT\`c`c^TY[cbaYV„xуўўкњљјјєяёњњљѓѓёђѕјђѕєїєѕєѕѕыхцщєящьѓѓј§ўўьžˆoYY[YNSJYhhduexYqўў§нњѕяэыѓѕљѓёёїїњђёђјњјђѕхзлншяѓёюяыщўўыј‰dq`]TGPM]hgmg|”ƒ„ўўх§ћјѕїїђѓїњјљђяюєєёђњѓѓђясщээљырртэ§ўўіг[BLr›[@SYYїdpmoagŽўў§нўћ§њњљћјѕѓђэяьэёѓѓїїјїѓюђэшхцйждк§ўўчЊPF\ozp`aY[hztpnce•ўў§ў§ўўп§љњћљњћњјђѓярмрыёѕёѕїїѓїэђьнлрсхўўьƒO]eibhZOPB^mpopeo‚ўў§§ћњ§§хљњњћљњєєёєђёёѕјњљјёэьютхшэўўыэ]MeihhtdP[V^uup`]\Їўўм§ўћўњ§ћўћ§јњїћјєяєюђхмсюяѓѓёѓјѓючэ§ўўшюuIOipxžŠaO]dkprhjxсўў§ўўн§ўћў§њњћњ§јћњјїѕєљјїєѕєљљћђуьёѓѓээўўТБd`c`hurtQS\jrjkq„}Шўў§ў§ў§§љјљјњ§љљјћћљј§§ўћњљњїћ§ћѓлжчюяжж§ўўшд–ЁoZjh^U[Y[\ettuzw›ўў§ўўр§њ§ћ§љїєјљ§ћ§њ§ћђшєђїњјѕєѕѕђюдеўўщ„Wxekb\PYuŒaOk}n]tЇўў§ўў§тў§ўљ§ћћїћњ§ћ§§њєљљ§љћњњјљњјёяўўьЈNTdd\]SMPi‘‚vƒŽбўўп§ў§ўњ§§ў§љєѓѕљїњѓљїњћ§њ§љњїњљњѓѕўўь‚Ldnh\^YM<8`‘u‚„puФўўщ§ў§ў§ўћћјјѕєјїјјёёяєєїљљњѕљћћњўўьђoWzujmbTSV\ohj|u„Ѓўўў§ў ўч§ўљњјњѕѕћѕєёяёђєј§ѕєєїјњўўьјmUktvbe]]izw|~vg‹ўўў§ў ўч§ћљ§ђѕјћћўљѓыщшчьєєјѕђѓљўўшшSSrjigcZVb`cenxqbtњўўћ§§ў§ёњћљњїћјћјћљљѓѓььіычтэїѕєёѓўўтЦJEMdc\MIZW\^gmrzoxћўў§ў§ў§ў§ўў§хњјјѕљјњѕѕєїјћњћљјђюђњјѕѓє§ўўэ’~}qdcYUZbdioqp\‡ўўчћ§љљњћјјєѕїљњўћ§јєёїњљјѕўўшуWJaka^LFWT\`ot|\@qўў§§ў ўїћњїјљћњћљљоњ§љљјљѕєѕј§§ўўзOE`j[cWLT^bimuœ‡ažў ў§ћјыњћћљ§њјєљєїљ§љљёцыї§ўўь›LTБ‹vVM^hjckq{uwрўўў§ўўќ§ў§ўўэ§ўљѓёђєєѕї§њ§њњћѕїѓѓњєђёюяўўь{z‰‹p[UIY]cidod‹kƒћўўј§ў§ў§ў§ўўч§ћїђѓєѓѕјћјљїјєььѕѓѕѕѓяюўўэ~OYPaPA\cjjmtzm{Tqўў§јћў§ў§ўћўўц§ћљјєїєѓѓѕєђђѓёьцёёђєєђю§ўўэ{Jn]\VNQV]\etqQ|ўў§§ў§ўўо§ў§ћћўћ§њњћјѓѕѓѕёєёѓђюэыюђёєѓєѕч§ўўэzTiged][a]\Yev~‰bЊўўќ§ў§ўўє§ўћћ§ўљћљњљћћ№їющђѕјѕђёѕёєѓѓяююў§ўўвWAknonhc[Z`ekiqiNУўўњ§ћ§ћ§§ўњњљ§њћјњљ§њўћјђёяєєлёђьщьєѕїѕѓђє§ўўєV7W^\WS]TOTbnq‰aNзўў§§€ўћћњћјїяђєєїїѓјєѕєёьржкцяцктуюїїћјѕєђ§ўўаMCaZVWYTT]W`[`gpQЦўўћ§ўўћњљњїђыуэщчэђѓюёьксцупуюцтббрыѓњјћјє§ўўбNPxc`ja[TYW^]bkmZАўўєћћ§§ћбїђршсзжщѓєђїђэусщьцьурцнкпщђєњїђ§ўўг[]k\SSQV]`\\ѕdj^B…учюєјњњ€œљњјєюыщхлщчёяющьтнтяэёяюььыюыьэёѓѕћўўкm]cVTPSSZ`]`ehp`[›эрЯтьђєљћў§§њљѕёсяющмкжнЦаншэєѓѕђюяѕђєяёют§ўўЩLeh\NUSSac\a^\d^Uўєэыхпщїљўћўћ§њљѓєђхуцмсбЭдйрѓѕѓёєїјј’ђщщь§ўўФVN]YTSTP^\]aigzikЅўўяѕюьыёјљѓєѕјљћјјђяыёэѓьээяђѕљїѕїєїїѕцшщяћўўЖ?AVUMUPFUSNUY[FPPЅўѕёєэёяѕѕєёѕѓёђєѕњњїїьљїјѕђяѓђѕёѕєїђёркрьўўТЈ\NS\VOSVJLU]^aTgiЖўўѕїяээѓѓєєѓщцшьшёяяёєюшьёєѕёёюёящышцтпюшёўўТ\me`ZVWUTY\gciiggЕўўѕѕюєѕљєђёящыедуђюђьѓыххяюљїѓььххмтёѓѓњїїўўšЃa^^WT`TSJEQS`k`JMЃўєщяёєѕљїљѓёышээюяѕљѕѓьщэѓђїѓяяёыуушээєѓєѓўў§•UMOQSQPHPJC-M‰x`VЉў§ьёёѓщяѓѕючспйнпљўў€Ијєѓїѕѕѓѓёѓэуыѓђђэђєїўўђ\BO]YTLUSShzV•ЇNEWЏўўююёьтчщььщррѓь‰‡›ьљїёээїєюыучэђѕђѓђёылўўѓr:E``]\[WVZb\htutzЪўўљјёшкухрзлшшњўњјЄrайЫдсѓєящшяђѕјўѓѓяѓютўўю`5FVNNUPLWYV^bccPdЕўўјїђёэёючцђѓїїЊјёпЛмлхЧЛьѓюёѓяїљјєѕєљјїѓјўўлd9LUNMHNLV[OZYcObbБўўјїїјїљѕєјћјїјђтлЪЦЭЇk•хѓтшчхплцхююэѓѓ€—јўўЯP@[`^MOIPYa[]]Y]pvФўњїњњ§њћїњљћћњљѕячзплюеРВНеслуыцсуэяьщщяёяўўрj]YdYPNQTTV`]\^xorаў§ђїїњљњљћњћїњљјїюсндкьыыѓтхущысЮЭрщщђяђђѓўўрzGQ^ZUIHNSZ\eedeoАўўїњљјљјљјј€ЬяђєѕщрнйтшсхнтсцпеТСФжсшэюяёўўн`3?V[SQOUaa\geob^Žнў§ђёяѓєћљњјїђёыёяяэсббдллмхщшхнплпбнтцсшэя§ўгk8H\[YWci|ƒdMagTPeМшящтсяєјњўћњѕїёчсѕѕєђёююшыэяычнждежтйздднцўўЎ\QMNTLWWLuВ–NQ\a\Ÿюўљюьцэёѓїљјїёђђїєњјјѕєяђѓёё‚яшщшцлгпцрЯгмўђqZSL\VYUVJ]‹œnr}gtшўўчцьэяэяёјєѓђѓюѕѓїєїѕєюєээщьюѓэсрхчшшспмннўў„]tgUQFOMC]po\i[Bzјў§ёщьэёщупнуђєїёёєѕюёђёрмчюѓѓ€мячшёѓююђїѓѓёѕўэndŽpTPEEIQPZ[dd[NŠюўўѕєѓђђьыхьщэсэуцсезцышхйЯзрйзуэђѓєюєєљљїєєўЉNg`B8FWZWYgcaokT:rпўљђѓёхшхшпцтшчёющмнчэшзршщяюяэђєјјњѕїѓјѕєёюўwIj\G5e’g[\uw{}w`EbЫтдзрщшхцчслцэьёююуалтежлучёёыщёѓњїђяьххсющщы^Li]ak‚UE]LPii€ЏdN]МбаущёюэьчпнрстыючсжзрстчхйтсшьѓѓєєђююяёшщмцЮb;@LUjS35џ€zцстзЮЦВВМОЏЋЩЮлуыуммгЦйунЭНТаФбжчцлттухсттуышыщццмзнрмспеаНОЛИЫСлЭакллхппдалгЎАМУКЖЧрхеебЭЭжбРФззмйкрыёячулуђѕђцьђѕѓёєюнжФСЮдмьбЧНЗЖРКЪпптммтссзгОСЭгбаеЫЩЪжЮЪЪечупддутчыыяюььяђюёјњїјїђэцегмьєѓежйЭжЯйзцлщйЖЩемжбФЭдЫйрдЮднгзЫбуущђђютчэѕыыёђћћ§јєјїѕјїђёэяыкЭсцнкУЯккетэшМЕЦзткЯЯЪаЭлмзйдУБУЮЩТЪщѓшжймшчлпэюєяѕюѓёэёюђђёїїѕюђјьужгксспшѓыЮСгбдмкРНЩущлбФНЌЌЕШЧЭсдптзнТЫлекклгмхьђєюхмсцяѕѓѕѕњљхтчузпжлцэьрсхкдУУРШРейзЭбйШЪЭЪаЯЯЮЦлпшсЮМИРЯхйдмущчнсгйущяђёяёјктурзЪЮФЦбЦШмйенчжЩзтеЭмлтшшчцбШСБВЋМбмкНЈЗНжшсгЧбЯйкхщртыычычэяхѕїїѓугШеЫЦзхцххяытнтйЭЧлычлгкеУОСЛВШньэмМбгжзкбайлшусйщцшьнжрсяерыьёрбШЦУакчэцнцюуЪаййагхэптштхссшцчццхмРЩзччпШЭЯжмздежзлгЩШгбзбаезнлайлЭдрючйбЮкщмнпутуупшцтЪЭШСзздЮСЭбТЫелгЭШЭаЮпржкзжЭбЩЯнлйЮЦгебЯакЯедыёэчзлсюѓєэщьэшёєђшсркцюьаЧЪЭпччсржбжйтуейрпчхтйбжнрсСЪксЭжзмсжзчщщштыяђѓтатрндеккгзаЧЫаегЩнцшэяцждЛЎЖЭЮЩУЪСЫкбЫЧжыьыйачясжЯкуьђёщчнсщшцчшыыэскчреШЭЭСЧгЕЧЧейбенжйаЧВКСТРЌЋЋБЮнн€ѓеаЯрпшщсждгзпьёэукЮнуущьчыщткпящкеЯезжжШЫештупцтжснсУЦРЛКЗНЧЭдлЫМЖЯмЯдждхдЪзбрьчжЩЦЫггмучцуткщыцмЯзущйбгЧЯйпруцпЮбдЮЮкжзгдзЮМЧЪЮЧООЫЯйадеНЦзйчцхмаЪззгмнкщяяђєщчпдлхщззнЯЯпсртжЫЩйеШлщёыуунреЮЭРМСШРЗУЧФНАЖУрсмЯДЛФЦНдкыёятчђђэтммкпяхенмнтуэырЭкйцц€њчуйлмедбгЯЧЦЪЭгдеЭЪБТФбннСОЖЛЫЪЦРЭамтрщццыцщшйжтюяяуычртлтсрмнйптйпедпзймыхсрсрпчсмпкЭСЩЯСНРЮШЦдЪЩрнспхтшшжурйстртхяѓькШЩШЭЪбЮджмтркйнкептхкейзющшущутзЯбгЭбЪССЯабзеуэщьёёрмцчпестЯпымЭЭмрлхлзеупкЪСОЪнсчщшкжпдмрььыхчццсмнмаРЦдпжцннтрюёђђэцхущёѕёюьнгЭбддЦчяшхцычнЭЦпнмежжЫпкюяэяшшчюььшчщдУТЪЫЧЪажзЭнюэющчщчтшэѓђђььЩяђщщшхумшьсммьёэтежзккжьцсььяэяцшлйумЫЯФСЯктсггЮдкнуцщххБучшьыщышюяѓђёчяхпмрлщюэтззусстчхпзгсыэтюёѓькЪШРЧрчкФЋНЧЧТЪЭлчтзЪзнтхунуыђјљѓђёьь€ъяьцщщхыыэштрмнсдЭмучхьсьыјїчзбЧЪЭЫШеклЯУНФЯйннЪуыщьэчьыэђёђђэяьђэчхшьёюрпхщррмнжЪбччскнлщѓёёцтйааЫЦажтаЩУМкцаЩбмчхцыьщщцпрцюррыяыцхчяёяхшцшпцюунжцэщштйкззапгбжнзгтущьытпхрсшзШцшррблекжлЯЦЭЮйтщцепущэчэёээёюпгесысйепкЪдгЮЦаЭгймцюячтцсмжжш€фрурхтугаезкШДКУФетнжкмтшээьшщыягЪгцэмРУдбФбЫаддЯШЮШалычудермжбМТМЫдкйлзмтущчЯЪМбыэчйтцѓїѓюьэшщьксэяьмелпЮгйдЫбттгсчйкумледЭЮЧЫЧОРйгдлйжлмхяюёюнгзушщюѓђђєёёящщцеыюющхптйбжЭежлсршщхтцхлснТЗЖСемблбЦабжЫгЭдртптхёёыуущёђэђчхкнщьртухсс€љршшэчлтхкушуслпхпкмдШЪЫзшцчтбйлзЯСКБЛТжлнэщназеааныьрукцэщщруруцыьђјюђѓђыхетгйсмныыхкзгшщшыцйлжЭКСТЦЧдгкрчмЫЪлажуэюяёђѓђђяёюмжнцуысчѓїѓяшхтчтцкЩаршшунсесшёылрпжмзпйЭгмайсннйеАЦЩЮжхнцщпрсцрдептптлхцсрнтхмлплЯбкйплхтЯСЪсытгЫЪФнугаЗОжЮййпьєёшМЋИЦЮйрсаЯЯ€šЮкзгбемсшшрЪлпхёэчрзесщшмйззеЯЯЪШОЛЫкучсжЭестсеЮэјѕћхЭббШепжддпзЦЯбОдпьяюмблтьѓђчщьыхмбдлльяяпФУФСЯпуцьшцхьюужЯетыщтлксччтхлаЫЛЛНОЪежуцюьырцэщэяяцщчмзмзгЯенцщмЮЪЭЭмрхмуцлчукЕШгмшштпккшпнсдШЯЭСИЧЧФТбмпмчхжУЦйтхтссмпгЮдЧЭбжрржблнхёёшыцйЮллОМЩлурчёюыхтхщхеРлмйлрнЯУМкзЭМбмсхухллшщчбУЩНДЯмяѕьтщющэччхкдУдеЦМНШуюыштлрмсцнпчжййгЯкмеаЭЮйбЯазкгКФзалучпЭШЫбкурнзсрсщщуйЯЫЮЯЮФРСМЦлйЩЩбагЦЫжблхчмЧЎНРЯЩЫЮдаЪЭдтткЭЯСУЯбЯЭемкклаТгексрдннбЪНМЪЭЪЗКФЧзплмхэурбдЭыющзйхлгнзбдЩЮкнузнмгагнхцккпхѓчгВЕбрзЪЦЧббдЩЦЯздзжЫШмхлймнхчзлтЮСЫмзьэсхслеайлхекрртуэшщђэшппурЯЗгеещцзпктцмузЦИФРгЪгЯаЭзбзхйдбжЛБЛдцткЯжЩбЫЭнрЪЮжнзнщцутурпррнкдЮШсёђьпршьѓычуЫЯУзйеЭФЫексцпнмОЖБНЯйгУЦееУНЦЯЮЩЦЮйжесцхсёєє–яугйЩЦЮцэузбсьюычшйжжкШЧЧЦЛШЧагШТЭазШТШдЯРМЦЦШдлжЫФИНЩЮдлпццшчщшчмааЮбмцяылнузжншшцрршшлчтЭСМОдЭФЧчснйлбТЛЛšЪЯднлзжЮФНДСжчупзжлсщреЩФЫтьєючрезанпцчщусжтлхзЯзмжаМЛьыычлбаЭЧЛОдггагедеЮРУАЧЩЦйнкЫЪЫЭеЭЮтщяьычыщрлнууірймптсйжЯаа€RелжмнекЮЦУФМИЦзктчсхкЦЕРАЛНТРБЋДЧЫзййгзктузккзтчспкунжжзмстЩбЯагжмыхпннейжЦЩЩОКгтрЫжгйкдЪУФЧЯСНОУФТЦЭгддбЯТЪЮСФйпыяяьцпхцхушсмаЮмчдедйпнпеШФФШЭтсебейЪККУЭдйлдЮФИИЛСзрЮФУКЛОНКЧЧемпшцсклхрунеЯкспцзЫРТЯккттеддЦамтйаНРСЪгежгкттеЭбЭЩЧаЯЮЩСРайЫДуєурсмнммклнснззрплУНЦРЪЭбклпннжррзбФММЗФЧЭЮЫРШкеУЦЪЭЮежжЭЯйаКƒdСрртсрззбпррсйртшнлОСРЪдЫФУОЖЊЛОЭдЭЭ€-ЯЦФУУШССУФЪаЪЮдкхырадзкеѓєцжбШЭенснжЯбЯЯжншюыпСЭЯгкджЯСФДВФЭжмснзмхыштмлЦЪдкабзургаФдезЦехрЮЮЯджжйтркжгдЫЭЯЪмтцщурйЫФСЖЕДАЎКЮкццпеаЧЫЯйлзуыужпшсЭЯнебЯкедЮЯейлзпкжсргезЪФЫШсспбжпебжрпЯФШЧЪУСЧамппЮЪгчяцйтруыщщчшыранеЪбЩецххпптмлбгйнежйхтййндЮжппцчтслмлЭСЧЯбеббйлйзщчзрежлркШЛШлкмЭШЭЪЫбгебймзаерюьхкбмдЫЯЪдШМШзшэрццщсдЪЦЦСЩЯЩдЯепспжЯРЩЭдэшпдгдаЩбеклгЧКБСхыящыпкЮаЭгбдксЭЯйкршячшрпплрлкЯпрпеЩЦЦЪУНжджззьёщллучулрущюрСЧйущэѓјѕьгйггдазечсшшэщьёцмксцхштрсррзаЩУШЯЮЫазжлмхьлбрлЭдлуунлаЯасьщщьшцмгдмйШФЮттйншшсмзтщщрчуулйпщхжЯФРЮпуудЫЪарпрктщпйлспуурчьёёяяёђючжгзгЯЭЭяїљјјїёєєѓёђѕюђѓѓєєхїљєѓєђєѕёѕђљјњћљњћ§§њјјѕљљњњнљјѕїјјїјёђяђђћёїљјїљјѕїѕїљїѓњєђђѓєѕѕјљїїєєѓђѓѓѓљјљњћћ§њћљћћљљсўњљњњ§јјњїѕђяє§ў§ѕєѓёђѕїїњјњјєѕѕюёѓяёєїљѕїєѕѓїїјјїћћј§јњњћњћ§§јњћўћ§§ўћћіљєїјјћўўњїї™ђїєјїўєёѕюѓєєёєђђїїѕјїїѓѕѓїєєљњљљјњћћљћљњћћњ§ћћњћ§§љљјјїѕјыјњљѕњјїѕјљјѓєюыюѓѕєѓєѓїјјљєђэяьюђїљѕѕїїѕєѓѕљљїїљњ§њњћњљљћњшљўўњљћјјѕјћ§њљјјёїѕєђјѓєємїєѓђёьёђѕјђљїїјєљѕёѕєјѕљєљњљјњјњљњјњњќ§ўљјјгћѕљїїјїјїѓѕѕјђёюїяєєїїєљѕѕјђѓёюѓѓїїѕёяђєљѕљїєєЦѕћїћљјњњљњљјўћњћ§ћљђѕїђїїђєљљѕїљјїјјѓїјљїјєїѓяёьяђѓјєєѓёјїїьѕїђљїњљљћњљљњљњљўњјћћ№їјјѓѕїѓѓїљњљљјљѕѕЋїѓѕјїњѕѕјєђђѕєѕјїѓљяѕљњѕєѕѕћљњљћєњјїјљјљўјјљћњћњљѕїѓїјїјїїѕјњѕїїњњјїњљјњєѕєєїјїїєѓїєѕѕ•ѓѕѓєѓєїїјјљѕїєѕєјяїљјњљјљѕїњљїјћљѕїїѕњљњјљњљћљњїњѕїћјјѕђѕѓђљѕєѓѕїјїѕљєєјїјљљєїјѕїѕёљјљїјњјњѕљєјћћ§їѕјњљјјїјјљЭјљѕїїјѕљѕђјїјјїѕїїѓѕѕєјѕѕјѕљїїѕљњћљїѕјѕћєєѕѕјјѕјјїњњєћїљћїјѕїѕѕђѓѓёїєїѓёєђєїѕїѕїёђђьяѓѓђэяёђѕѕјїѕїѕїћјїљљсїњњљјњјљљјљњћљљћјњњѕїђѓѓђїѕюљяѕѕнјїєїєєѓѕђђёюяыыююєѕѓѓєїѕїїјљћљјѕјїјјќѕљѕјјќњ§ћњњЯћљњћѕјјљїєїєѕїњјњјїљїљђљѓєѓђђѓяђєѓєѓєђєљћћ§їјљѕњјјќњјєїїКјљјњћћ§њћљјљљћјљњѕїѓєїљјїєјєђѓїѕњјјєѓѓјђєёёяѓяѓєљїёѕєєћјњѕѓђєѓєјјњўњљћћщўћњћћњњ§јѕјјѕњћљњїјєїњјјкљћљћјјѕђєђюэюєђѓѓёѓєјїїєђѕѓѓєљђѕѕљљў§ћћњюљњћљњўљњљљћљљјћјћњњјњљїєїєѕѕнєђѓјјѕјђ§ђєєѕђјёєѕєєѓєѓњљћћј§ћљњјїњњПљњњўћћ§њћїѕїјљњћњћїјїїјїјїљїјјѕњљјјїѕїїєђѕєїѓјљєјљѕљљ§љњјїњєј§љљњњљћњњїјѕњњьїљїћљїѕѕєѓѕљїјѕїјѕѕњњѕ§љњљјјѕєїїјјњл§љљњћњјњњїѕїћљљўњѕєїѕѕєїєћ§ўњњјјѕєєѕјјцїјїѕє§§њњћ§ћњїїњљјѕїєїєњїњњяћњћўћћњњћњћњћ§њљјјћїљўњљљщ§љјєѕћїљјљјїљѓђњњћћ§§ўїїьљїѕїїѕєѕїјљљј§њљћљњћћмў§ћ§ћћ§§ћћњўўћ§ћ§јїљјњїјљїљїјјїїњўўњњщћјњј§ћјјљєєјјњњѕѕѓљљјљњњљї§ћ§њћљљ§њњрћњ§љњ§§ћћјљљњћњјљїїћњ§§ћљљј§њ§њћћђѕїѕїјїѓѕѓѕєїѓјјћњјњљћћињћњљћњћ§ћћ§њњљњњјјћљљјњјѕєћњ§ћјљјљї§ћў§ћћѕћєјѕѕѓѓѓјћјѕ§јљњњ§ўњћћ§ћўњћћўў§§Ањљћљљєјј§љјћњѕјљњљ§њћћњњљљњѕєљљћљњјї§їїњїєјјћћљњћњњ§ћњјњћљћћњњћљњљ§љњї§њњљљћїєјљљјХњєјњњљњ§њ§њњљїјѕјїїњўїљћј§ѕњїљїјѕѓїїљјїњјљјљ§ћњћћ§§їњњљїѕєѕѕтњєјѕјѕјїїјљљњћћїљњњїјїїјјћљјјњњЩјїїђђљљњњљїњњ§ћћњ§њћљљјљїїєљјѕїњѕљјљљјїјћњћљњјљњјљїєјѓїїќјљљњњ№ћњїњѕћљїјјћњ§њћ§§їћ§ћњјјїїјјЙїєјјѕїљњљј§њјў§јљљјєѕѓїїєєјёѕјїљїїљћњ§њјњ§§ћ§ў§§ўўћ§њљљњњјїјјњљћњћњїњјљљтћљњћњњћћљѕїђѕїїј§јљћјљєјєїјѕїњњќјњљњњњљћљћљњњјћјјљњ§ћ§§Рўћћўњљ§њљњјљњљњ§њїїѕїјљ§ћљњљљѕђѕѕњѕјєљћљњљљѕјљћћљњ§њў§ћјјћљћћ§ћ§§ўн§ћћњ§ї§њїїњљћљњјћјњ§ћњњјљїњѕєѕјїјѕјјињјєјљјљљћњћњљљїјјњљјњћњћўњћњћ§ћњјњїѕњјјљљњћѕљј§ћћњјїњјћїїтѕњљњњљљїьёяђєѕњњљљѕїїѕљљјљњјћњњЦјћњњ§ћњјљїјћњ§јїјњјїѕїјѕєљѕјћѕјїђљїњњ§ћњўыюэяєєјѕјїљїљѕјјњњљљњїї§љњњћЫњљјїњљўћћљјѕѓєїѕѕјљјњћњњљјњ§љњ§ўљѕѕєјѕїїєєѕѓїєѓ§јњњћњњтљћњћћўњњљћљћљїљјњћњњєєѕєїњњјљњњћјєѕѕљљќјљїјјтњљїєєѓёёєѕѓјјњјњљўњїјјљїњјљњњјјйњјјїѕѕјјћљ§ћњўјјђјђѕњјњњћњ§љ§њјљјєђѕљєѕѕшєјњѕѕїњњљљњљњјљѕїєяѕђїљћћтљћ§њњ§њњљћїєїѕѓїљўћњњљњњћћљјћљљпјїїјїљђѕї§їјљљјїљћјњјњјяёїёјљњњўњњЧљћћљјєћїѕєђєѕѓјћљїљјњїјњћјћћљѕєѕјјѕєјєѕѕїѕјїњѕѓљїїјѕјѕѕєјјѓѕљїјљјњћљјѕѓєєцѓяѓѕѓєљјїјїљїѓїѓљјљђѓёѕѓјїїѕ€„јљјїѕјѓїјјњљјѕјњћљєѓёїњјїљѕѕїєѕѕѓѕєјѕѓјѕјјњљїњїїєїљјјњїѓљ§љњњїљљјњј§љјћљћњћњўњњ§јїђѕјїљњјєїїњљњјјѕїѕєєјєѕїїјљљїњјїїјєђљїљ§љјїјљљўљњјјюљћљ§ўљћљњњљјєљёїўњњајњћњўњљњњєјѓљјљѕјјћћїљљїєѓєѕїїљїїєјѓѕѕєєљѕљљњњјњњћ§ѕћљїѕѓјѕљљњљљщћњћљєљѓјєѕђёђђѓїѕїїѕёѓєєѕїїєёёѕїєѓѓєєјјњљњћћњћћНљњєѕєїїљљјњјїњњћљћљљјљѓђђєюёѓєїїђїѓїѕїєєѓѓяєѕїїјѕєѕѕђѓєљ§§њљјјљјљљєєјјњћћ§ћјњњљЪњћћљљ§јїїєѕѕѓєѓђћ§ћњїїєѓђѓёєљѕїјїїєєјѕєѕјїјљљїєѕѕїїљњ§§щўћўјћѕњњћњћї§ї§јјїѓєїѕјјљхјљїєђёѓѓёјјњћћљїѓєёјђѓїєѓђѕѕќїѕјљљяћ§ћћљњћћљјњљјїєїљљљїљѕїѕїљљдїѕѕєђєѕѓѓјљјјєѕїјёјёђђѓѓяђђѕѕїїјљњљјћњњћљјљњњћбљњњљїўїјѕѕљњѕљњњљњїђєёђѓјїїѕњљћїђёѓєѓѕєѕюэяђѕїјјяєїєїѓѓїјїњљћњњћћњњюћїїєѕљјјњїјѕјљјїїѓѓјѕѓѕњњјєѓѓїєїјѕїјєѓєєшѓєїѕѓѕѓђѕїѓјљњњљњљњћљћњљљжјїћєѓяюђѓђїѕїјјѕњјљјљѕїёђѓѕјљњјїїѕєяђђѕѓѕєєЗјєёэцўўћћљњљњљњћћљљјћљјїѓѓяєєїїєїєєѓјѕјјѕѓѓёєђїѕїѕїїѕѕљєѕѕљњљїљљєѓэС•хћјљљќњјњјјлїљјћњњљђђѕєєїѕєѓђѕяѕєєјјїєѕѕјљїљѕѓєѕєєшјњљѕјљљјїјўў§јљѕјљљјљљїѕѕїєѕїјљњїѕјјчїђёєюёяэђєјљњњљљѕїїјѓњјљѕѕэјїѕјїљїјѕћѕѓєјјљљњљљјїєїєїѕѕњњяїѕјѕєєѕђєёяяёђѓѕїїћјѕјїљљўњљљОњїїљ§њєїјјѕѕєїњњћјњїјњїєїѕѕјњїћѕљћњљїјјїєѓѕєєђяюѓѓєѓѕєїїјјљћўњћњїјјєїѕјњѕѕљєјјѕњњјіѓїјљћ§њћљїїіљєѕѓђѕїљљјјїуѕєєђёѓѕѕїљћјїћєїїјјїѕљїєѕёѕїѕѕєѓєђѕїјљјњњљњњєѕшїђѓєєѕїљћњњјјїѕєѕјѕѓјєљѕѕєјѓїєјљїљїїрєѕїїљјљјєѓѓїѕњњўћћјјєѕѕїїјїѕїїјљљхћљљјїљѕљѕњѕїєѕїѕѓђѓїюђђѕљїјјљњёјєљѓїњњћ§њњїћєјјОѕѓјјљїјљњњјњљћјјљїјјїјѕѕѓѓђђяєїїєїѕљњїћћјљњјљјњћљјјћњњўў§§ћљљїєєїјјЮїљњљљњљћљјјћјјєїљ§њљїѓђїїјјєєѕєѕѓєєјјљњњїјњљјјѕјјњњіљјѕїјєѕѓєїЇѕјѕђынагедЧЫуяђѕѕѓёюышьјюнктшрьяєјѓѓєјљјєѕѓїјћїјѕїђђяѓђѕёэйездщжюєђєёѕђѓяээђыЯЯрндесѓєєѓююЏьтпььёёєїњљћљљѓњљ§љ§јћњ§њћѕѕюркьюїўщскзлгзнѓѕјёёюёёэшзйрчюьэцстющрэюђјїѓяѕєћњўљ§ћћћњљ§§ўўјћњїєщьёўўнђёюэыюэђѕїѕябущѓыскццуюѓьыяёьюцэѓїљљВєљљ§њљћ§ћ§§ўћўћў§§љњљљїяпёєђюшыђэюѓљєкЦжшђёшхшщыьѓюьшзЦршцлхѓљєющѓїјёјї§јњњўњћћ€…њўљ§ћўњњћўјїёьяяёїњњљьншыђёьтмсѓѕђссжЫШгшыщёёѓєяюырёэѓяєщюїњљћјљђјј§њ§њњўўєѕєѕяюяђѕћјєєѕюыпнжпкюэяыюясхшэючушхяѕєѓчпанђєёэюѓѕѕѓїюѓѓљћћњВўёїѕјячурсщптшьэђѓющђђёчэюѕјїєђырйЭЪЭдяёѓтЮгтюљєьхьцэђїєїєљїћїћїўњљњћљјэшщьсюѓѓј€тїѕєїёцшяљїятёэпнзеЮкяѕјьйчюяѓэыщёѕѕѓѕєѕјњјїяїјўюђљўљєэуцуьїїјђьѓјѓшщююёђљѕѕѓњїїѓѕђѕїѓѕїьхуэѓѓёшуьюёхяюїѕєыучѓцььэюѓєѓэёяяэљїљѕёчыѓђёѕѓяєљїјјєшшхшяђыумущпттэюущяэшђяэђєђђэшьђђѓчцьэышёячэюѕјўїєяѓљ§јљѕњљњјљљњѓѕєѕїїэпщхёїїєѓёьёёљёёЄѓяѕїєюёђјєјттюёщьшэяэяјјњїїѕћњњѓыєєяээёьыьщмхчышсяєїњїјюьдЭдшчррмнхюётнёљјїээєїѓђэђєњљњљєєѓјјПљѕїјћђђѓёстуцрсцррпяёуьююьямззммзШЧФЫцюяёышюѓёїѕѓёюуьэјјћѓёцяѓѕѕњњ€Эљїєїјљёэшёююыхшяєїѕѓђёяїёётхлнмперцьђчееыѓэѓяяёьчэюђѕєюцруышяїєѕѕѓѓљјњѓђюјѕёююххэёёѓѕђтышшчююяэьючпсыщлекпчьщящлряєїѕєэхсьяэяѕѓїњљљћљљѕѕѓјїђяяшыюђѓѓюшуэьюьѕјљјїѓїёђчнлрскдлйсрезпяєюшббсщншэїїњљ§њ§ћїёєєљјјђђЊёђњѕљђщюђѕјѕєѓёђюььхюустщпяьэщщзртэяянтзтшыхйсѓєѓєјїўљјјљїѕєњћћњњїјїјђѓяѓђїљїђѓюэѓђэёєєЛёѓђѓёяёюырсымукыщяьщщѕєѕѓєєњїюёєёѕѓљїњљњњђцюёяыюыяѓєђѓёьёёэёјєђёёэјїєє№ђяыщщыыэцльяэёєїїћљјљђѓѓньѕђѓѓљюущэяюїјєђєѓяымбшђђєѕїяѓюьїњјјёљїјѕїђђящмтяђьѕѕЭљїј§њ§љѕјјї§њ§њњђяхшэюђћјјєїїєюцщѕёёэїёыюёјћљљїњјћјјІљђэутшюхщэяяюѕњљњїїѕљїњљўњ§љћїјјћј§љњїњјјёђјњїђэёяяђёњјѕњјћљ§јњђђѓѓюьтныїїёьэшюяђєјїјєїђїњњРћљњјћњ§љњјјєљєѕѕњїїяѓѕѕїђїњєєьѓљљћјљњїјцыкыёїђыепуцрцхѓєєяьюђѓѕѓѓ§їњћћшњ§љњјњњѕѕњѕљїљєѕѓёѓђящёїїјфї§ћћїящучщхшяюэхсспыєїяёѕїїјј€љ§њўњўћўњћјљјћљњїјїѕђєєёыцюѓєјђєяљљ§љѕѓѓёычшьѓѓюуурђѓюшыёїєћљњѕљѕєєјїљєїјњјјѕњљњїѕѕїєјјїёёѓїјјѓёюяђюыяюѕєѓѓїєїјїёяђїєєѓьѓјѓђьєяђђяьчуыюѓѕѓюяяјїњћљћћљўѓђяѓєѓяядёььээщэчцэёњњћїёѓѓђюёєљїєѕєїјѓђюяёятжзнтєєѕђђієјљљњјљјјщщѕАёлсыыцщыяюёььхшёјїћѓюяєєѓыпнсшяяёёѓђїѕїђьтыёєљїђєѕњњўњљљњѕњьђѕїѕѓюяђхэёэыэѓѕѓђєѓѓрєёюьщчшшцррыюьђѓююїѕћњћїѕёђњјљњћћіўњћјћїјюѓљљїађэюьюђяјєјїѕєјѕѓѓђнмбтьѓюѕёщяёшсщэѓѓђѕїјјћљєѓїљћћ€ѕїђјїўєѕїјјњјњјћљљєїєѓєјєђяѓєѓѕђэьчуяѕїљѓэѓёэшпмктсшэѓїљђьщюээђљјјѓєїћѕјїїѓњїјћўћўћћњњјїёѕяїѕѕїјѓїяяѓљјњјяѓђыркцуђэьэєєѓцщьђяѕїњљћњњљћїњїђяїѕѕЖњј§ћ§јњѕїєїѕюхяђјѕїѓѓыђњ§јѓїѓюѓяѓюыыэюѕђѕђёщгннуыђѕјћјѕєѕѓэшяѓѓѕѓёєэђѓїјєѓѓЇяыяђѓђљђымщєљєящсрђѓящчмэцэяѓљћљљдУдухэђёяёэюшюяяюяђѓєєяёёѓјћљїѓяюѓѕєёёюїьэьчхнльюѓѓђющяђђФяђїћ§ўєщщышђёюьюяьсщшнчђјљїђэёёњљ§јїњїѕєяюяёѕћјѕупхцщѓєєѕјѕјјЧѓьуяѓљћјёђђєїїєяцхймнтхщэѕѕљњљѕјєјљњїјѕѓёёяђэьюїѕѕёчтщхѓєє€Цѕјїєѓькпюђњђїяєѓјєѕёэцьчппщпртщюяёјђющыёѓёѓђђэяытчсцюяєєёяёѓљјћїѕєѓюяьпжьђїѕљјїїјєѕѕїютёєёѓяюьцтььырьёѓєђёяѓњїїюслрйэёјљјїљјљѓїїєяёцяэтлзшѕљњјєёєђїђјљїѓєёюьёёющьтэхучэюыррыэяјєющыщыяѕђяьєђѓѕљјѓшщшштт€ЈнйцээпцыяцшучьяѓїэуЧЪсхсцщэщчщёюђэщхрпьюэчяёђёёулшѓђђяэяяыынзущшрзстьяѓђїѕєяыьыїљѕёэѓёѕђёэящыяѕђєёёяьюѕєєђєђљїђтЫкьёѓырхьэёхщшьээшхнёђююёђїђѓѓєчншяюјѕѕєђюющѓїїююђђѓјѓњљљ€јђѕїђщешьёљєёяєѓјєєюуттнятэцсщєяяёёюьыйЭуэѕђђюьсшршюђчэяђёјѕјѓєјѓєјѓєђычцѓїљњјёѕўњњёёычпяёђтурчыёѓёяюззжкцёыунщшщыттшунтээђјѕєњљћћьљїђэптчѕїљяюђјј§їјђяяЪпмулжпйрщтрщчьттхьшржзршэюэщкпнтчьёєїјѕїѕјєїщштыёѕљњяѓѓўьѕѕєзѓѕјљєєэыжууёмпїѕѓяяюцйебсшюђюяюыткемшѕђёяя€ШїѕѓэшыюїћњњїєёђыяђјїљјєэђљљяюьѓюэпеѕљїїяюццхлмюяэюяьэьылунунсяёььчщыэчшѓћљћњїїљїѕёѓѓїђюхѓђѓёёцэхыьёяїђєыэумдкпхюяѓїђїёсзлЫкжттЯЭЩпщьээяюђяѓяїєїђєѓѓђѓђёяёёѕђёюьыюшёїїѕѕђяюырыхкйыђѕђђяюььчпмпшпдлеутпхэьь€Œщлчшрчюђљљћјћїјѕјѕїєёщыёєыььёяєяьрммршђяяюёэчддпуьёюьхсйлесыючнймйплрмрэђѓјѕѕєѓѓїєєыђюєїєьсмрхюыїђюьыуяєјёэйлкчьюяєюєђэллнхпщухссншыщзјўѕєѓђђ€єђјѓѓђђяёяяспмншыьѓюђюёэѓђєчпекдучщчщхтюяхьчцыяяёђяьькЁqжєїѓѓюёяюяђђєёђѓєѕёпмсыюцнмкйЮййььщщэшурсттзпсхчцпхчїєїєэёђђюўўѕєёшнэђёђђючцушяєљїѓршьяяФщцухЮжсщшѓѕјёєєїєєѓэуыэёщщђјѓячщэюэхэѕюььээюяёђёыышьшшцыђїѕѓѓЇьхркезжЫЩзпюѓѕѓюытшяёёѓїљїюёєѕыщэщцыёэьщщђђѓёёьюэяцяэщцушёѓљюђёёуёяюухнпллжмуьюђщряїјљђїєєјїдђюяэчээюёјјѕђѕёэюэёѓєѕђїёыэєьэюѓьѕѓѓђѓяђупцщщЬцёёђёїјљяђьёѓїђчмхьёьщхцхрцщэчюяьяяћњњјєыёьтуђщхкньїїђѕјѕђцлнллпхцьяяжѓђьхкцчёѕѕёяыьщьыыьёьцегрђѕћјњяяхшцюьэюїщюю€€ёјјїѕёяёёѕёюьяяђђьлшщхйшшщэѕјњѕѓѓѕїѕёёєїѕђуьюєїљћћљјяяээьщюёєѕєњїїјњѕєёёђєєѕђєєѓьтрлмчрштяёєєњјѓяђяэщёђєђёяысђњљљћјљєщэюэхчюѕђѓѕѕвђєяѓѕјєєѓѓђѓєљєёчхкыяѕѓьтсыєђђюѕєѕяяђѕяѕђѕєјјћћіљїѓёэяьтлуџдz:?4(EHZ]a98+,82>CLGA)<3::$CgkT`яћ§њ§љњјјњђїљѕѓѓїћјїљїѕѕјјјћљ§њ§љљћћаЧ`0?HLH@GMJB3,NUWMCMО§§єѕѓєѕїњїєѕѓёьыыєїїјєјјњјјўљјјољћ§ћўћ§ћјюj(8>ABME170+1COQZH’§§їїъјѕј§њњ§ћѕёюёѓѕїїјјћјјїїјўћ§§§њћ§§ф‡ :@5<,09<4-;,>OBuћ§ѕїїѕїїєјљєђёєљїњјїјјљјљљїјљјљћћуњјћћВ{ZL:@G84+7BECAB&;Y]‰љ§њїїяљїњњљѕђююёїњ§њћћјјрћњ§ћћњњљљћјїїњј§§ѓФcMBIEI@:0--GHHї;>THcє§§љљўћ§§ућїѓђєљјћљјљћљњ§њјјїћљњјљњљљњ§§хїѓp^7:HIGB.8?ACHNLM:(5GILIN3Gы§ћњїљћћЇјїѕїњљ§њ§њљўћњ§љўў§љљћљћњћњ§ћњ§гзцШaO)*7JHE:59-74:HSr23Дј§јћћљјјєђяђїјљ§њњўў§јљњљјј§њ§§њ§§пњ§§њазьјwY9$4TД§§њ§§ђљїїђђјћ§§јїїѕјјљ§ўћўўзњ§њЧЯмѓЅJ8)LWP<.7>(&-&BN3G[Ћљ§јњ§њљјїѓяђїїњєљљњў§§Шљњ§§њљ§ўў§§ћћжбьёгUA8LUG:945-8;NHAASAAзE;SH`ј§њјєјњїѕѓѓѕћ§§њњ§њ§љћ§§ћљљћјњљњ§ћћљљхїкмяп‘\:1ELIF7EHMIAFCNPodqћћхљ§§њћјїњљњњ§њњћўњљљћєјљњ§§њњ§оњ§њ§ушыЮ^M95GGE:9GEEB95@:8Veц§ўљўў§§љјј§љ§ўўњ§њ§ўдњўћћўыцпчЩV>-;A7:-00&-580;;Thјћ§љњћўўњљљћ§ўўњ§§ўћўўўћўўњл§ўћѓьѓћєe21>CGG?EGB>3FNHGU[aЈћ§їјїјїєєѕјћћ§њњѕљ§јљ§§њњ§ћўўЭћчшхюєТVM@LMEIIGAF;3NTPNHFC@+"HJMV]nљ§јћ§ћјѕєѕїњїїљљ§§њњћљљјјљЯћјљћ§љћњўћшшыьєё~aO?Y^SLHIJ@)EQ@>abeшўў§§ћњљѕїјљњњЧјљјњ§§њњљјј§§њљ§љљј§§ўўєєюѓјяnEYMZcVI>FC?@EF.Ex[bАћћ§њњјїїіњ§њўўћўўћўўњ§§љўўзњ§њёёѕяѓї•O<CTL@??:;7<@B@B:CCFGM\b7pэ§ћљ§љљћ§љњљўўћћўўўћўўћжўћћўћўзднкцьКSB&-LFCA;+>@33>EQW,CЭ§§њљїљ§ўўћѓўњћњђњћњљњњўћћеўљадЩСЖУЧmTPAGLJ52+*#5GGHTWMdЛ§ћ§љјѕћњўўћ§њњўўљјј§ћљћћЧљћ§§ўўћўўйлнЪНСТi;-3JONG8935\MEHACI]‹ћ§јјїѕјћ§ћћљљєїјљ§§њњ§§њўў§ўћўўйгрчпдхпYT8LMJFGG?>?A9@98@:{ћ§ћјєѓєњљ§ћћњўћ§њљўўўћўў§ћњљїњўўлщэюыущнЕTC-NTJIG?EFA??HGELSO?@<%TvFFIJ95gmжћ§єѕјљњ§ўўјљћўў§њўњњ§њћўЯ§ФРадснюьЃMPOML;2.+8A@AC>8418CB@<@7*4Ђћщюєљ§ћћўўіћўўћў§§њ§ўўвћўњћћўў§љЮйзЦажпырpC.:EBIEGMPNE]Щ§ћї§ћўўњњ§§њњўўўћўўўћўўжљѕѕїњЭКЗЕСЪжРЭƒHQ]LH44(8@C?FELPgN@ž§§їљјњ§§њўўћўўўћўўкћўдбСВЖЕЊВА>@E@4:4(C?8077CNNFL”јћњ§§ўўўћўўѕћўўћўў§њћћўўйћўўрцчцлббИбжcJTYG@?%*49?5;;F@78}ћ§ћљњўўћњў§ћўўў§ў ўмждйегндбяцc@EPPNB?3:;-A9BEBI5hяћњј§ћћќўћћўўћ ўлздгаЯждлёзd7FQOGE:@:@FPP@9;N.1,<AHEMLIQA-Ёћ§њў§љљёњ§ћўўњўўњљ§њњљ§§вљњ§ўў§ЯЮаазрнЧшю‚BBTG907:892:FE@;NWOј§њњљћ§њў ўњћњњћљ§§ўдњ§йнсттцппьёЗ3<[PFEA?>:8AE:B@?:58B7eљ§ћ§ўўћћўўћёњ§њњ§ўњњ§§љ§њњўўц„I>:?:LPS\A:<<:>CV`Bzўўљњћћ§ђњћћљљјѕѕјљњћњћћињћћњљњњљњћћљњћ§ћ§њ–O48<7>,)@F?:CLIApўў§Нћњћњћњљљњљїјљњћњњљњљљјњњјљљћ§§њћњћњ§§ћў…44<2GkoWhїўў§ћћљњњљјјѕєљњњљјљљњўћ§§ћњтхh1CIFABBGMI?50UZ^THTЦўўјјїѕјљљэјїђэщђїљљњћњњљњњ§ћњњ№ћњћў§ўћњћўr)%8<>>ь;><:2%7IZW]L‘ўўљљћњ§§ћѕјѓяѓѕјљљњ§њњќћњљњњ§ќћ§ўћћс§ћў‡!%"8<;244AF9:A&AZIvўўјљљїљљіњјїєђїјћљњњћи§њјљњћ§ћћњњљњњўЛ‚\H2>??134CME@>2@ZcŒўў§љљўјљљјњѕђяђљ§§њй§ћњњљљћћњћћњњ§§ћўгbSBEFC>.03@FIMIHE]Giўўћъњ§ћ§њљѕєїјњњћ§ћњћ§ћ§ћњњйћ§ћћ§ћћ§ћ§ћўўvg2AFG@7<;@BELQNL@;SНўўћ§њњљќјљјїїћјњљњћћњїљњћ§ћњњ§њњљўћŽeBBHHыC@@:9?EJuZ9?HЃўўћћњћњњљї§љћњњћўњћћњйћљњћњњћњћћ§§ўўŸT37FEF?<@C?:--:TjUIŠўўљњњћє§њљјјњ§ћћљњћћљў§ћњћњћћњ§ўў§ў§§ўй–>97AEG943;>:59@@VI>\ўўћњњћњћњњљїѕїјљњљљћбњћњћћњњћњћћ§ћћњњјљјўўа^P9?FG<4274937>OwPM^яўўњћћя§њ§љїѕїїљљњљњњћњљљћњћњљњњљўЇйrW?+;9>@A84Yx^žўўњњћћњћћњљїљљћ§ћњћ§§ћў§§ћћїњљњ§§ўћ§ћћјюрЧzdGAA:>?F3A?pўўўћ§§ыћљјљљћ§ћ§§ћћ§ћ§ўўћ§ћ§§ў§цћѕясjNA48>IFEH>;>HPONZ4Hёўўљћћњњљљјљљћћ§§ў§§ћўўћмњ§њ§§ў§ћюєўьoW71?@ICC@@<:E:G[w43Сўўњњѕћњњјєёѕљњћ§§їўћ§ћљћ§ћ§§юћ§ћ§ћ§ћ§§єєўўƒbI*>>с<8<@<:B>]^E1`Уўў§§ћ§ћћљѕѓїњ§ћњљљњћљ§ћ§ўў§ўў§§ў§§дѕѓўўЌQE-GSNAA?7:9?;SU9G`Кўў§§ћ§ћњљѕѓѕљћњћњњћћУ§ў§ћ§ў§ћ§§ўћў§§ћћњєєўўнbG3HEIEA@9:7BVNSEQ>ўўљљњљњљїѕєѕљњћў§ўўћ§ћ§ћњњЬљњћ§ћўћћњњљєїўј‹M(?FGEGC??EHEFJAVNcўўљњћњљљјїєјњ§ћ§§№ўњћ§њћћњњљћ§ћћњћћхњјїўўЌmF9HHC>IJMNQLBIUYmeuўўьњћ§ћ§њњљљћ§§ћ§§ўў§ўћћњњћ§ћћ§§ъћ§ћ§ћјїўјЕk^?BAHGGIHEFFјGM:8Zkыўўї§ћ§њњћћ§ўў§§ў§§ўћ§§ўћўўќ§ў§ўўх§љљ§ўнeP3;7>9><8JF{ўўњћћњњљјњћњћњћњ§§ћћў§§ћћѓ§ћ§§ћћњћў§ўћњњўгзB9@IMQOJCHE;$&GQJ\aqўўњњћњњјїјљљћњћћ§ћ§§њћћњњћѓ§ћњ§ћњ§ўўћ§ћўўпˆeP8PQMCCJNF0IVF?dikёўўћћњљјјљњћ§§ћ§§ћ§§Шћњћ§ћ§ў§§ћћ§ћў§ћћ§§ўўtLSBC<>BF7QMbV˜ўўњћћљјљњ§ўўќ§ў§ўў§їєјњўўЋJ?2>@FIIєGLNGEBFNSA{ўўї§њњљјћ§ћ§§ќў§ћўўў§ўўњ§ўў§§ўўћ§ўўѕјјўщТPM:@EEB>GACHJGFF^h;wђўўћћў§ў§ўўў§ўўќ§ў§ўўп§ѓјєёћўк`I&)BF@48:9?@FA:237AH}ўўћњїѕљљћћўўјћ§ўў§ў§ўўћў§ўўр§ўўњјјѕјўўЮ[B2CJONFBC@FF>CLB3[„ўўњљѕѓјњ§§ќћў§ўўў§ўў§§ћ§§ќћў§ўўѕїнјўўлOH>BCFGHGC@C>;HG-25Јўхђљћ§ўўў§ўў§ќћ§ћўўў§ўў§лїѕђїђє§ўї|L4A>?GIB>>BGQoOBЇўўљћ§§ћ§ўа§ў§ў§ў§љїєїѓящэюЋP>:>EOZEM–ўўљћ§§ў§ў§ўўќ§ў§ўўў§ўў§ћ§ўўў§ўўсјѕјїїєјюўэkS[\MI>:?A>8:|ўўќћ§§ўўі§ў§ћўў§ўћў ўмљјѕѕјѓѕєўјeAOLQNH@GA?C>CCAGH2cјў§ћ§ўўм§ћјѕѕљїјћўїn8BLPM?>ABAJUQEAFOAQяўў§ў ўў§ўўћ§ўў§ўўн§јљњљњїўўю^;BIGA9.<;:CTZUFIBFGнўў§ўў§ ўў§ўў§ўўљјјрљјјѓўў˜BC?>IJPNЃўў§§ўњћўўў§ўў§ўњћћў§ћпјљјљєѕїўўФAC[QLCG@ўў§§ў§јћў§ў§ў§ўўў§ўўоїјљљїњљїўўм^J>AB>;788VMQI?@>;:ўў§§ўєћ§ћў§ў§ў§ў§ў ўе§ћїјїѕјїѕєњўьoP2@F?8154)CUQCB952Єўўћ§ўў§ў§ўўљ§ўў§ћ§ўў§§ћѕїїѕшєћтa2*1LC187>8EF?8:<5hўўў§ўўќ§ў§ўўњ§ћ§§ћ§§њћўћ§§ўў§лˆNQQNLT]]kQIGJIMYduUŠўў§ўўћў§ў§§ћўњћљљ§іў§§ћўњћћў§§ѕў§ў§ў§§ŽZCNN№I7,&0LONM1V][Pўўћ§ў§ў§§ћћ§љћњћћеўћ§њ§ўўњ§ћ§§ў§ўћ§§ў§ўў‘@GYSGUPTLPQYT>b‰ˆnzўўћўњћћѕ§њћїћњ§ћ§њ§§Сћўћўћўћў§ў§ў§ў§ў§§мpEU]dOM[\\aNSFqxvdZbдўўћћњ§љ§ћ§љћњљєюєњњ§ћўћћћўћ§§ћћ§ў§ўўс§ўўz;:QPAMNFNTNI8I\notdЉўўњ§ћћ§§њў§ўћћїїюљћ§§ў§§ћўћўњўћў§§ўўЇ§ўў•(!32BBGCHSSPLMVEZpZŒўўљ§њўњ§њ§њўњњѕљњ§ћўћўћўћў§ў§ћњ§ћ§§ўћ§§ўћўўЯ’{\LICCECQV^WWTBSpvЅўўт§њ§њ§ћўњћљјљљњў§ў§§ћўћ§§ў§§ћў§§тўћўњ§§ўўпzh\[YM?I@HY]``]YUjg|ўў§§ћ§§іў§§њљјњњћ§§ўў§§њў§ўћў§§їў§ў§ў§ў§ўўъ‰{HMPSPOFTSVYbhmaUSdбўўу§ўћўњ§њ§љњјћљћњ§ћ§§ўћўћўћћ§ў§§фћўњ§јў—q[ZUULUOZ\[PUe‘mLQ^Зўўї§ўћ§§ўћ§њњх§ћўћўћ§§ў§§ћ§§ўћў§ўћўћў§ў§ўўфЊ`IMPSUYTSTYUH@Qp‚r]žўўћћўћ§§јўњћљў§ўћћўї§ћ§§ў§ў§ўўц§ўјэ˜LMFQTH@TU2JPPTLTVQVIQJwўўў§ўўќ§ў§ўўў§ўўџ*џўw(џ)џ)џ)џ)џўw'џ(џ(џ(џ(џ(џ(џўˆ'џ)џўw'џў€&џўw%џ&џ&џ&џ&џ&џ&џ&џ&џўw$џ%џ%џ%џўw#џ$џ$џ$џўw"џ#џ#џ#џ#џ#џ#џ#џ#џ#џ#џ#џ#џ#џ#џўˆ"џ$џўw"џў€!џ"џ"џ"џ"џўw џ!џ!џ!џ!џ!џ!ѓћљњћўњљјљљћћњњпћљљ§ћјїљїљїїљїїјњјїїњћћљћљњњ§њѕјљљёћѕјјѕїјјњћћѕ§§њњј§љјјњњљћћй§њљјљљћљљјћ§љћћњњћћјєїјјљљ§ћўўњ§њ§ћ§ћћ§§їљєїјјѕѓћљљњћљњјљ§§њњ§њўўњњњў§љ§ћ§§юњ§љјїјљћњ§ћћњ§§љјљљќјљљїїђљ§ў§њјјћћљљњ§јјљ§ћњ§§ўњћћ§љїћљљїњљћњ§§њљјїїњћћѕњјїјїњїјњљћћѓњј§њ§њћљљјїїѕѕїўјљљѓјљљћљјјєњљљ§ћћїњљљњ§ћћњљљљјљѕїїјљљєјїѕїѓїїјљ§њћћїљћћљјћљћ§§ћјжїјљљјњљћ§ћјњњљћ§њњ§ўў§ћћљїјјљћ§ўў§њћљљћљљ§§ёћљћњњ§§ћћ§§ўўћ§§мћљћћњњ§§ўўњў§њјљњ§ў§љљњњљ§њ§§љј§њ§§њњ§ўљ§њљћљ§ўўў§љљј§љћљњ§њ§§ћљњ§ћўўњњћўў§љљкћљљњјјћњћћљћљљћїїљљ§ў§њ§§њѕєљїћјјћљ§ў§§ўњљўћјјљћњњў§ћјјћљњїћљљ§ћљјјљўћ§§љїњ§ўћћјїїјј§њјїїјњћ§њ§ўћўўћ§љјїњњщљјјљ§§њљљјљћљњјј§ўўњљљјјћїћљљњњњ§љњ§љ§§яћўў§ћћљљћљљ§їњњ§њњю§ўў§§ћљћњјћ§ћўћ§§њњљћ§љњ§§њў§њњ§ћўћјљ§§ўь§њ§љћњ§ћћљћћљћћњ§ўњ§§ўћљљь§њћћљћњћўљљћћјљњњ§ў§§ѓћњ§ўў§ѕїћћљљњњ§њ§њ§ћњ§§ћўўт§њўў§§њ§љћљљњћўњ§њјћљ§њ§њ§њљљ§§пћљћљљћћњ§њ§§њљ§§ћў§њћћ§њўћњћћљ§њ§§ўћљ§§љўў§ўћ§љћњ§§ђљјћљљјњјљ§њ§њ§§ўњљљўњ§§ўњ§§§њ§ћћ§ћ§јљћћљњљўўћћўўњљљўћљљњњ§ўўћўў№§љљ§њ§§љљћ§§ў§њ§§ћєљ§§љћљјїјћћ§§ђњљњћў§њљћ§њўњ§§ёњћћљљ§њњўўћ§§њ§§ћљњ§§ўўњ§њћ§љ§§ёњ§ўўњљљ§њ§§љљћљљўћјјљѓ§њњљњљћјљ§§ћўўїњћљљ§§њњўўїњўњ§њљ§§ўў§іњћњ§ўњњ§њўўћя§њўўљњ§§њљћ§њўў§љљьјњјљљњњ§§њўћўўњљњћў§§њУћљљјљћ§§љћћњ§њ§њ§њ§§ўў§њј§њњљћљјљјћћјјљјљњ§њњ§љњўўћўњјљ§§њњ§њњ§ўћѓўњљњ§§ћћ§ћљћљљѓњ§њ§ћљћњљњњ§љљч§ћћњњ§њ§§ўћњ§§њљ§њўўњ§њњ§§уњ§§љ§§ўћњ§њ§њњ§њњљљјјљ§њ§њњјњњўу§ѕћ§љљњљњњ§§јљ§ўўњ§§ћћў§ћљљњўўћћњ§њљљ§ѕњ§ўўћўњ§њњ§§њ§ђћљљ§јљјћњ§љћљњњ№љўўћў§љћљљјњ§њњўўњ§іњ§§ў§ўћўћўў§§ћўўћњ§ћњ§§ўєј§њ§§њјљћљњ§§ўўћћьўњљљ§ўўњўўћћўћўњљ§ћўў§јњљѕјљљћљљѕ§њў§§љњњўўњњў§њ§ќњљњ§§ћњ§ўўћћњўљ§јћњњ§њњ§њ§ўў§ўўъњўњ§њ§§ћ§њ§њљћћљ§§њўћўўљћўћўўћўўќћўўњњћљ§ћњјљћљљ§ћћњўў§§љњ§§њљљ§§вњўўњњўћ§§ўњљ§ўћћ§њ§њ§ћўў§§њ§§ўў§њћљћћ§§љћ§њ§§ћћ§ыў§њњўўњљљњљ§њ§ўћўўњћўўњ§њ§њїњњ§ћњљ§њўўњ§љћљ§њњљўњ§§ћєљћ§ћљ§њ§ўњћўўљћў§њ§љўў§ќњ§њўўўћўўућ§њ§ћўћњ§§њљ§њ§њћћ§§њ§§ўў§§њ§§њ§ѕљјјїјїјћњњўўѕњ§љћ§ў§§ўћўўњ§њ§ўћўўўћўўўћ§§ўљњњљёњўўљўў§§ўўњ§њњ§§ќўњњўў§ўњћ§њњ§ўўјћ§њљ§§љўўўћўўіњћўўћњњ§§ўўў§ўўћћњњћўўў§њњјўћћ§њўћўўхњўўћўћњљљњњўўњљјїјїљ§§њ§§њўўў§њњў§њњѕљћћљћњљљњњўўўћўўўћўўњћўћћњ§§њї§њљћњћ§љњњ§њ§ъљ§њљљјњјљ§љўў§§ћўўћњћўў§§њўўёњ§§ўўћ§њўўћўћўћћўќ§њњўў§§њ§§ўўћўўўћўўќ§љјљљјњћўњљї§ўўђћ§њ§§љљњ§ўўћњћћєўћњ§љљћћљљњў ўўћўўўћўўћ§§њўў§љї§њљћ§ўћћњњћўћўўћћўњ§љњўў§љњ§§јўћ§јњљњ§§ўљћ§њ§љњ§§їњ§њћљњњ§ўўјњўњћћўњўўјћўћўћўћўўљћ§њћћљїїјўњўўї§јјћњ§§ћўў§§њўўѕћўўћ§љњњ§ў§§њўћўўћўўўћўўўћўўњўќћўўћћќўћћўўћњћљљўўўћњњћўњўўћ§љћўўћўўћўўўћўўїњћћљљњ§ћўўќћўћўўљћўўћњ§ўўўћўўњћўў§ћўўўљ§§њў§ўўђћўў§ћљњљњћјљ§ўўї§љ§§њњ§ўћћќ§њћўўъћўўњћњўњ§њњўўћўћњњў§њўўўћўўћћў§§ўўњ§ўўћ§ўўћћ§њ§ўўцњљњњ§њўўћћўћўњљјїљљ§§ћўўњўўњћ§љњ§ўўљћўћўўћўўћњ§ўћўўћђњ§њњўћў§§ўў§њ§§ўљћўўћўћўўїњљ§ўўћўћўўўћўўў§ўў§ыњ§ўћћў§ўњўћћ§ћћњјњјљў ўћћўћўњњє§ўўњў§њњ§ўћ§§њєў§ћ§§њљ§§њљўў§ўљ§§ѕљћ§ўўћњ§§љћћѕњ§ћћљћ§§њћљљ§љњўћ§њњ§§ўўћўўћћњўўњўўіћўўћ§њњљљ§§ћќ§њ§ўўњўќћўћўўќ§њ§ўў§љ§ўўўћўўђњћћўўћўњњћўўћўўўњўўќњ§§ўў§ћѓўћ§§ћўўћ§љњњ§§§љћўўњћўћўўћћўћћўўћўў§ў§ёњ§§њїњљљ§ћћљ§ћўўјћў§§љњ§ўўћўўћћўћљњ§§љњ§ўўћў§њћўўяњћњўћўўћ§њљњњ§њњўў§љњљ§ј§ўўћўўћўўќњўћўўўћўўћњћўћўўќћ§њўўіљћћ§ўћњћў§§ўћўўўћўў§љњўўўћњњќљўћўў§ўњўўћ§њ§њўўћќўњњўўўћўўўњ§§ўћўўј§њњўўњњўў§љ§љљњћ§ўћћ§§љєћњљў§њњћў§љўўѕћўўћћ§љљ§њ§§ўўћўўћћњјљјјљљ§§ўўћњњіћљљњњљћћ§њњўћўўћћўћћўўљіћјљљ§њљњњўўў§љљїјљњњљўўћўўљћўўћњњўўј§њ§ўўћћўўћћўўћў ўћ§њњћўўњћўљљћ§§њћњ§њњўўёћўљњ§§њ§§њ§ўў§ў ўјћўўћћњ§ўўў§ћћњ§ћњўўћўўю§њњљњ§њўўћўћ§ћўў§њњ§јћ§љ§ўћћўўњјјњ§§њ§§ўў§ўљ§§ўћў ўњћљљњњўўћћўњћћўў§њўїјљњўўўћўўъћўў§њ§њ§§њњћўћўћўјўњ§ў ўёћўўњ§ўў§§њўўјћўў№§ћњўўћњ§§њўјўўћўў§ћўўћўўўћњњћ§ћўћўўћўўћўўўћўўўћўўјћљњўўњћў ўќћњћўўћћўўћўўўћўўљћўћћўўњњў§§ћўўќћўћўўўњўўўћўў§§ћўўћ§ўћўўљњ§ў§њ§ўўњ§њњўўњњўћћўўћўўўћўўћћўўњўўўћўўўћўўќ§љћ§§§ўћў ўљњћ§ўў§ћћўњљљўњћћњѓљјљјљљјљљњљњљљїћњћњћ§§ћ§§ћў§њњіљњњљњњ§§ћ§§єћњњљљћњћњћ§ћћї§њћћњњ§§њњўћњњћю§ўў§§ћ§ћњћћњ§ћ§ћћњњ§љњћћђњћљњћћ§ћ§ћ§ўў§§цўћўћўћ§ћ§ћћњћњћњ§ћњњ§ћ§ћ§ћћљ§ћћњћњћћ§њћ§§ћњњћёњ§ћ§ћ§њћњњћ§ћ§ћћёњћћњљћћ§§ћ§ћћњљљњѓљњљњћљњњљћњћњњќљњћ§§љњћћњљљјјќљћњћћњњћљћћ§њњї§ћћ§§њњљћћ§њјљљўњћћўњљљяњљљњћ§§ћњћћњњћ§њћћњ§ћњњ§њњћчњљћњћњњљљћњћ§§ћўў§њњћћњњћћўў§§ћњћћњћћќњћњ§§ћжњћћў§ўћ§ћћњћњњ§§ћ§§ў§ўћ§ћћ§§ў§ћћљљћ§§ћћўћ§§ўћ§§ёћ§ћўў§§ћњћћў§ўћћњўћћњћ§§ћ§ѓћў§ў§ўў§ўў§§ћћяњћћљњ§ћ§ћњћњћћњњћћљўћ§ћ§§јјїњћћ§њћћў§§ћћў§ў§§ћњ§§ўћњњћћљњњћћђњћ§ћ§ћћњ§ћ§ћћ§§њћњњљљњњ§љњљљћњћ§ћўўћ§њћљљјћњњћ§ћ§ћћєњћљњћ§§ў§ћћњњћ§ёћўћ§ћў§ўћћњћћњћћў§§ћ§§ѓћў§§ћњћњљњњћўў§§ћ§§ћћњћћ§ћћ§ћўќњћ§ћћўьћ§ћћњ§ћњњћњњћњњ§ћў§ћћ§њћњћњ§ўўђћњњћћ§§ћўћ§ћњ§§їўћљњћњћћ§§ўћ§§ќћ§ћ§§ћћ§ћ§ўў§ўі§ћ§ћћњћћ§ўў§їњћћ§ћ§ћ§ћћўњћћњ§ѓћ§ћ§ћў§ћ§њњ§ўў§ћњ§ўў§ћўў§щћ§ћў§§ћњ§§ћ§ћњњћћњљ§ћћ§§ћў§ћћў§ћћў§ћћ№§ћћњњћ§ћћњ§ћ§ћ§ћћќњћ§ўў§ ћ§ў§§ўћћ§ћ§њћ§§їћ§ћћњћћ§ћћњїћ§ћ§§ў§ў§§ѓћњ§§ў§§ћ§§ћњћћ§ўќ§ћ§ћћћў§§ћўў§ќўћўћћњ§ћў§§ћћў§ћћўњћћњћ§їў§ўњњћ§ћўўќ§ў§ћћ§ўћ§ў§ћ§§шћў§ў§§ћ§њ§ћў§§ћ§§ў§ўўћ§ўў§їћ§ћњћ§§ўћћ§ћ§ић§§ў§ў§ћ§ўў§ћћ§§њћћ§ћњћ§ћњњ§ћ§ћ§ћ§ћ§§ўћ§§№ћњћ§ћ§њњћ§ћ§ћ§ћ§§ќћ§§ўў§ћ§ўћўў№§ўў§§ў§§ћўўћњћњћћ§љћњћњ§ў§§ћл§ўў§§ћ§ћ§§ўў§ћ§ћ§§ў§§ћ§§ћћ§ћ§ћ§ћ§ћ§ћ§§јћўў§ћ§ћ§§ћњћ§ўћ§§ў§ћ§іћ§ћ§ўў§ћћўўѓћњћћ§ў§ўў§ћ§ћћ§ў§ћ§§ћ§§ћіњћ§њ§ћћњћ§§ўћќњћћ§§ў§јћ§§ћћ§ћўўўћўўђ§ћњ§ћ§ћўў§ћ§ћ§§ћјў§ћ§ћ§§ўўў§ћћўљ§ў§§ўћўў§ѕћ§ћ§ћ§њћћњћћ§јўћ§ћ§§ў§§ўўћћ§ћі§ћ§§ћ§ћ§ћўў§ўќћ§њ§§фћў§§ћ§ћ§ћўў§ўў§ў§ў§ў§§ћ§ћћњ§§ѓўњћћ§ћ§§ў§ў§ўўў§ўўў§ўў§§ћњћћћљњћњћћї§ћњ§ў§§ћ§§ѕћ§ўўћ§ћ§§ў§§§ўћ§§§ћ§ўў§ў§ић§ћ§§ўћ§њћњњћ§ћњћ§ћ§њћњ§ћўћ§§ў§§ўў§ўћ§ћўў§њћ§ћ§ў§§њћ§§ўћўўј§ўћўњћћ§§ћё§ћ§ћњњћњ§њћћ§ћўў§ў§ћћ§ћ§ўўљ§ўў§§ћўўѓ§ћ§§ўћ§ћ§њћћ§§љћў§§ћ§ћћ§ћћ§ћћњњ§ёў§ў§§ћњћўћ§§ў§ўў§ўќ§ў§ўўў§ўўћћ§ћћ§§ћѕ§ў§ў§ўћ§§ў§§юћ§ћў§§ўў§ўћ§§ў§§ћ§§ў§ћ§ћћћў§ў§ўўў§ўўљ§ў§§ћ§ўўќћў§ўў§§ў§ўўўћ§§ў§ўў§ўўї§ў§ў§ў§ў§§эў§§ћњљїљћћ§§ћћ§§ўў§§§ћњћћј§ўћ§§ў§ўўќ§ў§ўўў§ўў§§ћ§ћћ§їћ§ћњљњћћ§§ћ§ьћ§ў§§ћћњљњћћўў§§ћў§ўўќћ§§ўўє§ў§§ћ§§ўў§§ўўќ§ў§ўўј§ў§ўћ§§ўў§ћ§ћћ§ў§ўў§ћј§ўў§ћўћўў§ћћ§ћў§ўўє§ў§§ћћњњћћ§ўўў§ў ў§ћ§ўў§ћ§ћћћ§ћњћўў§ў§ћы§ўў§ћ§ћ§ћ§§ўћ§§ў§§ћ§ўўјћ§ћў§§ћ§§§њћ§§ўњ§ўў§§ўўј§ў§ў§ў§ўўќњў§ўўї§ўћ§њњћћљљћњћ§§ўўјћ§ћћ§ћћўў§§ў§ўўіћў§§ћўћ§ћўўє§ў§ў§ў§ў§ў§ўўј§ў§ўў§§ў ўі§ўў§њћћў§ўў§њў§ўўќ§ў§ўўў§ўўў§ўўј§ў§ў§§њћћ§ ўў§ўўќ§ћ§ўўў§ў ўўћўўў§ўў§§ћ§§ќћў§ўўў§ўў§єњћ§ў§ћњћћў§ўўў§ћћ§ў§ћ§ўўќ§ў§ўў§ў§ќўћ§ўўќ§ў§ўў§њћў§ўћўўњћў§ўў§§ўњ§ў§§ћ§§§ў§ўўќ§ћњћћћ§ўў§ўў§ћћў§ћўўў§ўўј§ў§ў§§ћў ўћ§ћ§§ўўѕћ§§ўћ§ћ§ћ§ўўў§ўўћ§ў§§ў ў§ўћј§ћ§ўў§ћўўјћўў§§љћўўў§ў ў§ўўћ§§ўўћћ§іћњ§ћ§ћ§ћ§ўў§яћ§ўћћ§ћњћў§ў§§ћћњњѕ§ћњњћњћћ§њћћєў§ћ§ћ§ћ§§ўў§§њћ§ћў§ўўў§ўўў§ўўњ§ў§ўў§§ћј§ћћњћ§§ўў§ўќћ§ћўўљ§ў§ў§ў§§§ў§ўўў§ў ўј§ў§ў§ў§ўў§јћў§ў§ў§ўў§ћ§ўўјћ§ўў§ўћ§§јћ§ћћњў§ўўў§ўўў§ўўў§ўў§ћўўћ§§ћћ§ў§ћћњћўў§ўўћћ§ћў§ўўў§ў ўќ§ў§ўўђ§ў§ўў§ћ§ў§ћ§§ўўў§ўўќ§ў§ўўє§ўў§љћ§§ћ§§ўў§ћ§ћћ§ћўћ§ћўўў§ўўў§ўўў§ўўў§ўўіћ§§ўўћњњћўўќћ§ћўўњ§ў§ў§ўўў§ўўќ§ўў§§ў§љћ§§ў§ћ§§ўў§ўў§ўќ§ў§ўў§ћўў§ўў§ўў§§ўў§ћћ§њ§ўўщ§ћ§ћћњ§ўўћ§§ўўћўў§ў§ў§ўўћ§ўў§ћћї§ћ§ћў§ў§ўў§ўћњњћ§ў§іњћћ§§ћњњћ§§ўў§ўўў§ўўы§ў§ўўћћњњћћ§§ў§§ўў§ўћћјњћ§§ўў§ўўў§ўўј§ў§ўў§§ўўќћ§ћўўў§ўўў§ўўќћ§§ўўѓ§ў§ўћњћ§ћў§§ўўј§ў§§ћ§ћ§§§ўћў ўў§ўў§ќў§§ўў§њћ§§ў§ўў§§ћ§ўўў§ўў§§ћўћћўє§ў§§ћ§ћ§§ћћўўї§ћ§ћўћ§ћўўќ§ў§ўў§ўў§ўў§јћ§ўћњћ§ўўў§ўў§ћ§ћў§ў§ўў§ўћўўў§ўўў§ўў§јћў§§ћ§§ўўљ§ўў§њ§ўўћ§ћ§§ўўў§ўў§§ћў ў§ўћўўў§ўўў§ўўј§ў§ў§ў§ўўў§ўўў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўў§§ў§§ўў§ўўќ§ў§ў ўў§ўўќ§ў§ўўћ§ў§ў§§їў§ў§ў§ў§ўў§ўў§ў ўї§ћўћ§ћў§ўўќ§ў§ўў§§ћ§§їў§ўў§§ў§ўў§ўў§ўўў§ў ўђ§ўћћњ§ћ§ћ§§ў§ўў§ўљ§ў§ўћ§ћћ§ўфћ§њ§њ§њ§њ§ћўћ§њћћ§§ў§ў§ў§§ћ§§ђћўћўњ§ћўћў§ў§ўўє§ў§ўћўћћ§§ћўўљ§ў§§ћў§§њў§ў§ў§§їўћўћў§ў§ўўь§ў§ў§ўћ§§ў§§ћўћў§§ћ§§љўћў§ў§ўўў§ўўѓ§ў§ў§ўћў§ў§ў§§јў§ў§§ћў§§ћўћўћўў§§ў§§ўќћўћ§§ђў§ў§§ћ§§ў§ў§ў§§№ўћўћў§ў§ў§ўњ§ћў§§ћў§ћћљўћў§ўћ§§ўћўўё§ў§ў§ўњ§љћћ§ћў§§іўћўћ§ћўћћ§§ќў§ў§§ућ§ў§ўњ§њњћ§ћў§ўњ§њ§њ§ћў§ўћўћ§§њўћў§ў§§юўћўћў§ўћў§ў§ўћў§§ўў§њћўћ§ћўў§§ў§§ў§ўћ§ўћ§ўўє§ўў§ћ§§ў§ў§ўўљ§ў§ў§ў§§ћ§ўќ§ў§ўўў§ўўњ§ўћ§§ўўў§ўўњ§ўћў§ўўќ§ў§ўўў§ўў§ўў§§яўћ§ћўћ§ћ§§ў§ўћў§ўўђ§ўљћњўћў§§ћўў§§ўђ§ў§ў§§ћўћўћ§§ўўї§ўћўћ§ћў§§њў§ў§ў§§щў§ў§ў§ўћ§ћ§њўћўћў§§њў§ўўћ§ўћўћћіўћў§ўў§§ў§§ћўћў§ўў№§ўћўћў§ў§ў§ў§ў§ўўў§ўўјћў§ў§ў§ўўў§ўўј§ў§ў§ћћўўћ§ў§ў§§ќћ§§ўўњ§ў§ў§ўўќћў§ўўљ§ў§ў§ў§§ќў§§ўў§ћў§§њўћ§ћ§ўў§§ў§ўўњ§ў§ў§ўўњ§ўћ§§ўўю§ў§ў§ў§ў§ў§ў§ў§ў§ўўў§ўўў§ўў§§ў§§ўј§ў§ў§ў§ўўќ§ў§ўў§ўћ§§їў§ў§ў§ў§ўў§ўў§ўўќ§ў§ўўќ§ў§ўў§яў§ў§ўћўћўћў§§ўў§ўўќ§ў§ў ўэћ§§ў§ўћ§§ў§ў§ў§ў§§ўўђ§ў§§ћ§ћў§ў§ў§ўўм§ў§ў§ў§ў§ў§ў§ў§ў§ўћў§ў§§ћўћўћ§§ў§ў§ўў§§ў§§ўј§ў§ўћ§§ўўў§ўўў§ўўќ§ў§ўўў§ў ў§ўќ§ћў§§їўћўћў§ў§ўўњ§ўћ§§ўўњћ§§ў§ўўњ§ў§ў§ўўў§ўўў§ўўћ§ў§ў§§§ў§ўўўћ§§ўў§ўўў§ўўў§ўўў§ўў§љћў§ў§ў§§ћў§ў§ўўў§ўў§ўў§§ўў§§ўў§§љў§ў§ў§ўўў§ўўњ§ў§ў§ў ўў§ўў§эў§ў§ўў§§ў§ў§ў§ў§ў§ўўў§ўўў§ўўњ§ўў§§ўўў§ўўђ§ў§ў§ў§ў§ў§ў§ўў№§ў§ўў§§ўћ§ўў§ў§ўўў§ўўѓ§ўћў§§ўў§ў§ў§§ў§ў§ўќ§ў§ўўќ§ў§ўўў§ўўю§ўћў§ўћў§§ўўћ§§ў§ўўі§ў§ў§ў§ў§ўўќ§ў§ўў§§ў§ўўі§ў§ў§ўћ§ћўўќ§ў§ўўќ§ў§ў ўў§ўўѕ§ў§ўў§§ў§ў§§њў§§ўў§§ ўќ§ў§ўўј§ў§ў§ў§ў ўў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ў ў§ѕў§ў§§ћ§§ў§ўўћћ§ћўћћ§љў§ў§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ўўњ§ў§ў§ўўў§ўўў§ўў§ўў§§їў§ў§§ћ§§ўўў§ўўњ§ў§ў§ў ўј§ў§ў§ў§ў ўјћў§ў§ў§ўўљ§ў§ўћў§§ ўќ§ў§ўўњ§ў§ў§ў ўў§ўўў§ўў§њћў§ў§ўўќ§ў§ўўє§ў§ў§ўћўћўћўўќ§ў§ўўў§ўўќ§ў§ў ўќ§ў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўў§ўўќ§ў§ўўў§ўўў§ўўў§ў ўў§ў ўў§ўўў§ўў§јћ§љ§§ў§ўўў§ўўў§ўўі§ў§ўћ§ћ§ћўўќ§ў§ўў§§ћ§ўўќ§ў§ўўє§ў§ў§ўћўћўћўўў§ў ўў§ўўќ§ў§ўўў§ўўў§ўўћ§ў§ў§§ ўњ§ў§ў§ў ў§ўў§§ўў§ўў§њћў§ў§ўўќ§ў§ўў§ўќ§ў§ўўў§ўўќ§ў§ўўў§ўўє§ў§ў§ў§ў§ў§ўўў§ўўќ§ўћ§§ќћў§ўўќћўћўўў§ў ўў§ўўў§ў ўћ§ў§§ўў§0ўњћў§ў§ў9ўќ§ў§ў ўі§ў§ў§ўћў§ўў§ўќ§ў§ўўў§ў ўў§ўўў§ў ўў§ў ўќ§ў§ўўў§ўўј§ўћў§ў§ў+ўў§ўўў§ўўњ§ў§ў§ў ўў§ў ўў§ўў§ќћў§ўўў§ўўў§ўўі§ўў§§ўў§§ўўќ§ў§ўў§ўќ§ўћ§§ћў§ў§ўўє§ў§ў§ў§ў§ў§ўўў§ўўў§ўў§§ў§§їў§ўћ§ўў§ў ўў§ў ўў§ў!ўў§ў ўў§ўўў§ўўњ§ў§ў§ўўў§ўўђ§ў§ў§ў§ў§ў§ў§ў ўў§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўў§ў3ўќ§ў§ўўў§ў ўў§ўўў§ўўќ§ў§ўўў§ў ўў§ў ўў§ў ўў§ўўў§ўў§§ў§ўўњ§ў§ў§ўўў§ўў§ћў§ў§ў ў§љўћў§ў§ўў§ўў§§§ў§ўў§ўў§§§ў§ўўњћўћўћў7ўў§ўўњ§ў§ў§ўўў§ўўі§ў§ў§ў§ў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўўў§ўўў§ўўў§ўўў§ўўў§ў ўќ§ў§ўўќ§ў§ўўў§ўўў§ў ўњ§ўћў§ў ўќ§ў§ў ўў§ў ўў§ўўќ§ў§ўў§ўў§ўўў§ў ўў§ў[ўў§ў=ўў§ўўў§ўMў§ћў§ў§ў ўјќњљ§ўўљњ§љћјћјјјљћћљїјїѕѕѓјњјјћљјљћљјјћћ§њњјјњњјјўњћћіјњњїњљїѕјњњ§јњјјўњјјљљїњјљћљ§§пћљљћњ§§љљјјїјњјњјљљјјїїјљљїїјћћїѕѕМїљєјїјћћ§§ћњїїѕђѓєѕјћњ§њ§§њ§љљјјњљћљћљљ§§ћјјћћєјїѓђэюѓёѕїјћљћјљћјћћ§§љњљљјјїѕѕХєїїјљљћћљњњљћљћјїјћ§њ§ў§љїїјїїѕєєѕѕїѕљљїѕјњј§љћћљљјљћћїћјњїїюјњјљљјѕєѕїїљћњ§ћћ§§ћњћњїњѕїѕѕђїїќўћ§љљђћјјљјљјїјѕїњјїїћє§њњїѕїїјљњјљљъћјїђєїїјњјїћћљјљјћћњїѕѕ§јћљћљљјјќѕјњљљћўјїїўљїїэѕјњјїѕѕїїѕїѕїљњњћљјјљјіњїѕѕєїњњјљљфћљћљљћјїњјћ§њ§њћљњјњјљїїѕјљ§§њј§њљћћњњјјіћљјїљјњјѓїїќљјјљљ§єљћјњјћљјћїјњњјќљїїјјћњѓћљњњћћ§ћљєњњћћљ§њ§њљјљљцјѕєѓїїљћљћјњ§њ§њњ§§ћљћљїјљљ№јѕѕїљїѕѕєїїјјњљћћш§ћњїћћ§њ§њњ§њћ§§њјяюѓєїљљћфљ§§љћњїњјћљ§њњљћљїѕјїѕљїѕєјїїљѕњїњњјљћћљчјљћћјјњѓєњћјћћјјњћћљљ§ћљјјљь§ћў§їљћїѕєєѕїѕїѕњїњјјђњјїљљѕїїјљљјњјјўїјјўѓїїюјєјїѕєїљљ§§њњ§§њњћћёњ§ў§љїѕїљњїњїћљљљћљњ§ўў§§њоћљљјљљћћјјћ§љњјљљ§њ§ћћјљўћњўўњ§њњљљјњїїјћ§њ§§їћ§§њ§§њјћћ§ўќњ§њ§§љѓњћљ§њљјћћ§§њўў§§јљљњћћљѕћјјєњћјљћ§§њњћћљљћљћхњїїњћљјѕїїј§§ћћњљљ§ћљјїњїјћћ§ѓњ§љјјїѕєјїњњјјћўњјјќїєїљљћћњљљјїїўњјјѓћ§љћњњ§љјљћћјјѕљћћјјљїїјњїїёјњљћјљ§§јљћљљјїїўњјјљјўћ§§љћјїљљћљњњ§§ђјћљѕћљјїїћљњњ§§фњћљћњ§њњјљјјћњћљћјљњ§§њљћљјћћќљ§њ§§ўњљљ§ћљ§§љ§эњјјћљњїїјљ§§ўћўўњљ§§шјљљњ§§њ§ћљћљ§ћњ§њ§ў§њ§§љљќјњћ§§фљћћљћљљј§§њ§§ћњїјћ§њјљљћ§§ў§§ъўћњњљ§њњљћљјїјјљјњњ§ј§§љ§љ§ўњ§§ўњ§§єў§§ћљјјїѕїјћћљјћњ§њћ§§ўјљљњљ§њўўћћўўњ§њ§њњўў§њ§ќњћћљљшћјјѕђѕїїѕјїљњњљјћљљ§њњљўўњ№ћљљ§ћћ§љљћ§љ§§њ§§ћћњњљўўј§љњћљљћјјђїњїїєїјћћ§§ћ§ћћќљћњ§§§њ§ћћё§љјњїјћљњјњњјћљљѕћљјјњљћћ§§ўўњ§јњ§§њњљљјјањљј§§љљјљљњ§њјјћљћњ§њљљћљ§њњ§љњ§ћћўўњ§љјїњї§§ћљўўћўь§њјњ§њ§§ћљ§њњ§љљ§љњ§§њ§іўћўњљњў§љњњљјћљљ§ћјћљљчјњњ§ўўњ§§ћјћљљјљњ§§ўњњ§§ўўћўўњўўўћўўњ§љћ§§ўўћщ§љ§љ§§ћљћјљћ§ћўўњњјјњњјјёљћ§ўњљћњўўћњњљћћѕњўћљ§§њј§ўњњ§њќ§ћљ§§ўњўўњ§њ§§љ§§ј§љћњњћљћњљ§§њўљњњўќ§њњ§§ўњўўћіўњўћњ§§њ§ўўњњљљ§ћ§§іљњјњљ§ўњњ§§їљњњўћўћћўўћўћ§љњ§ўўћўыњћћјїјњњјј§ўў§§њ§љћљ§§ћљћј§ўўћћўћћўўіћўњљљ§ўўћўўыћўћњ§ћјјњћљљћћљњ§§њћјјєљјј§§ўў§њњљћћќњўћўўў§њњў§§ћўўєњ§§њ§њўўћ§њ§§љєћљјјљ§ўўћўўњњўћў§ўњўўњ§§њћўўі§њ§ў§ћў§ћўўыћўњљљњћ§ћјљљћјљњ§ўўћўўрћњўў§њњ§§њљљњ§њњ§љљћ§њ§њўў§ћћ§њўўїњ§ћјћњ§љ§§ў§§ћљјјјљ§§њјјњјјљўєјјљ§щњљљћјљјїѕїїњћљћљ§ўў§ћў§§јљ§ћўўњ§њњќћњњјјјњјјљћљњ§§њњћўў§јљљјэћјљћћјњљљ§ћўўј§ўўњў ўї§љћљ§њњ§љљ§ћљ§§ўўћўў§јљўў§§њ§ўўс§ћјљ§ћ§§ўњћ§ўўћ§ћјјљ§ўўћњњ§§љљўўљњ§ћў§§ўўўћўўўћўўћћўњљ§§ўѓћў§њњћћ§њљўўћћў§ўї§љњњ§ћћ§ўўћў§њљўўўћўўўїљљў§ўўћћўўћўўђ§љўћўљ§ўћўўћўљљ§ћ§ўўјћўћ§њ§§ўўќљњћўўќњ§ћў ўћў§ўўњ§§яљўў§љћћљћљћјљњ§§ўўќњ§§ўўћўє§њњўўњўћўћћўўы§њћўћ§ћљњљ§§ўћњљ§њљљјјьћљљјїѕѕїјћњњ§њўљ§ўћўў§љћјјљ§ўўњљ§ўўѓ§ўћ§§ћњўњ§§ћўў§ўѓ§ћћ§§њ§ўўњљћ§§ўњ§ћў§§њљљўњўўљћўћўўћўўћ ўћўњ§њљњћљљљњўћўўћўўьћњ§њ§љњћњњўњ§§ўўћўћўўїћњњљњ§ўћўўўћўўђњ§ћљљњњ§§њўћћњњќ§јњўўяћ§ћљћњћљћњ§ўўћўћўўјћўњљ§§ћљљћ§љћ§§љљ§њ§§њ§§њў§ћћћ§њћњўў§ћљўўў§ўўњћўўњћўўў§ћћљ§њњћћњ§§ў§ўћўўўњ§§ўќћўћў ўўћўў§ўўћўўћ§љњњўўўћўўњћў§ћљњњћ§ўљ§§ћњћ§њўўќљ§ћўўў§ўўјњћўўћў§љљњћ§§ўњўўќћўћњњ§їљ§§ћўў§§ћћљ§ўў§њњ§§јћўўњњ§§ўўіњ§§ўўћ§њ§њњќўћўњњ§ўљў ўћјў§їјћ§ћўў§њіў§§њ§њ§њ§ўў§єјњњў§§њ§§њ§ўўћўќћўћўўћћўўћўўэћњўўћћўўћњ§§њ§ћљ§њўў§ћћ§ћћњњўљўўњћўўћћўўўњўўњў§њ§ўўчћўњ§ўћўћ§њ§љљ§њ§њљњўћўћў§§јљћћўўњњ§§ћњўўћўў№§љ§§ўћ§§њ§њљјћћ§§ќљўћўў§їћљјљњњўў§§ ў§§њўўўћўўњћўњўћўўўћўўћўћьў§§њўўњўўћўўћўў§њћўћћ ўњћўўћћўўѕћўћћўћўўћћўўѕ§љѕїћћўў§§ўўћњљљ§ў ў§іћўўћўўћ§§ўўўњўўјћ§§њ§ўћўўћњўњћўўјћ§ўў§ўћўўќњў§ўўўћўўўњўў§ў§ўћћњћћўў§љ§ј§ўўњћ§љ§њўўќћўћўў§ўћћўў§ўўўћў ўњўљўўћћўў§љљћћ§њћ§§љћќњўћўўњњћўћўћўўќћўћўўўћўў§ћ§њњ§ћёњ§ўћў§њ§њњћљњћўўўћўўќћўћўўќћўњўў§§љўўёћўћњњўћўўћў§њњўўўћўўўћўў§њћў ўћћ§њњўў§ўўћў ў§ўїњ§§њљ§ћћў ўћ§ў§ў§§њ§§ћ§ўћўўї§ћјњњўў§љљ§њ ўњ§§њ§ўўёћў§ћћњўўљљ§§њљ§§ўњ§њ§ўћў ў№ћўўћњњћў§њњ§§њћўўјћўўћњљјћћёјў§њњ§њ§њћјјљњўўќћўћў ўї§љјњў§ћјїїўѕєњќљћ§ўўњ§ћњ§ћњњ§ћњћћ§њљјјњўљњњњћњћњћњњіћњ§ћ§њњљљњњёљњњћњњљљњњјљљњљљ§њљњњўљњњјљўњћћє§ћ§ћћњћћњ§§ћћњюљњљњљњћћ§њћћњјјљљњњ§ћљјјќњћћњњюћ§њљњљјѕѕїјњњ§ћ§ћ§§ћњіљћњћњћћ§ћњњћпњљњљјїїјјљњњћњ§ћњћњњ§ћ§ћ§ћ§ћћњњљјјђљњњћћњњћ§§ћњћњњ§ћњљјыїјјљљјјћљњљ§ћўњњћћ§ћњњљъњљњћћњјїјљћћњ§ћњњћ§ћ§њњќљћњљљјљўў§ћћ§њ§ћћјњљїјљљњљљњ§іњљјљљњјљњћћњљюјљљњљњћњњћ§ћ§њћљљјјё§ћ§ћћњћћ§њњљњљћћћњћњњљљўјљљњњљњљњљљўњљљщјљљњћ§§њћћ§њњљћљјјљљњњћћєњћњћћњћћљњњ§§ћњќљњјљљћњћ§ћ§§јћ§ћћњљљњњїћњљјњљњњљљћњјњњћћѕ§ћћњњљњњћћњњљњќјљљњњљћ§њљћњћћљљњњ§§ћњћћ№њјѕїљћћњћњњ§ћ§ћ§§ћћњћњћћњћјљјљјјљњуљћњњћћњљћњњћ§ћ§§ћ§ўћ§§њјљїјњћћњћњњљњљњћћ§ђћњћћљїѕјјљјїїљљјљњњћњћњћћщњћњњљњјљњ§њћњњљћњў§§њћњњяћў§ўўћўћњњјїїјљјљљ§њљњњњљњљјјљљњњћћњљњњўљњњљїћњћњљјљљћћ§ќћ§§њњ§њћљјљјљљњћ№§ћў§§ћћ§§њћћ§ћћњњљ§ћљњћћ§§њћў§ў§ўў§ћљњ§њћ§ћњћ§§ќћ§ћњњћћ§§ў§§§ћ§ћћю§њћћ§ћњњћћ§§ў§ўћ§ћћ§ќњћ§њњєљњћћњћћ§§ћњћћ§њћњњћїњљњљљћћњљљ№њћ§њњљћћ§ўћњћљћњњђћњћћ§ћћњњљјїїљљњўљњњћљњљћћњћљљњњ§ћћ§§ћћќњћћњњіћњњ§њјљљњљљёњљћњњћћ§§ћњћћњљљњћњ§ћњћ§ћћќњћњћћьњћ§§ћ§ћ§ћњћ§њћњљљћћ§§љћ§§њћњ§§ћњђ§њћњњћ§ћ§§ћњћњњўћ§§ќћ§§ћћћњћћ§ћћј§ћ§ћ§њћљљћњћ§ћўў§§ћ§ћћє§ћћ§ћњћњћћў§§ќћ§§ћћѓњљњ§ћ§ћћњћћњћћѕ§ћ§ћћњљљњњ§§ћѕњћћўћ§ћ§§ў§§іћ§§ћњћ§њњћћ§ћћ§ћ§ћћў§ћћћў§§ћ§§ѓћ§ў§ћњћњњљјљњњњћњћћњ§§њўћ§ћ§ћћ§ќћ§§ўў№§ў§ўћ§ћ§§ў§ўћ§ћ§§њћ§§њњћћњќјљјљљњїћ§§ћњњћћ§§ўі§ў§§њћћ§њћћўњћћ§яћ§ћњ§§ћў§ўћў§њћћњњўћљљіјљњњћћ§њћњњїћњ§ћ§ћ§ћўўћѓњљљњњћљњљљћњћћѕњћњњљћћњћћўў§ўћ§§њћ§§ћћњњћљћћ§ћћќњћћ§§ћўњ§§ћ§њћ§§ѓћў§§ўў§ў§§ћњљљ§§ў§ў ўђ§ўћ§ћ§ћ§ћћњћћ§§ўљћў§§ћћ§§ќћ§ћўўљ§ў§ўћў§§ћјњћј§њ§њћћ§љў§§ћњњћћѓў§ћћў§§ћ§§ў§ўў§ўэ§ўўћћњћ§§ў§ўў§ћ§ћ§ћћјњћћњћўў§§њљњ№§ћњћў§ћњ§§ўў§§ћњњў§ўўћ§§ћ§§ќћ§ћ§§ђћњћ§ћћ§ў§ў§ўў§§ѕћўћ§ћ§њњћњ§§јћњ§ўћ§ћ§§ўў§§ћў§ўћ§§ћў§ўўњ§ћћ§ћўў№§ћ§§ў§ћ§ў§ћљћ§ў§§іћ§ћ§ћ§ћ§§ўўќ§ў§ўўњћў§ћ§ўўў§ўўћ§ў§§њњѕћњљљњћћ§ўћ§§юћњћ§ћ§ћњћ§ўў§ў§ў§ў ўћ§ў§§ћћўў§ўўћ§ў§§њњєљњћћњњў§§ћ§њњјћ§ћ§ћўў§§ўћњњў§ўў§ўќ§ў§ўўтћў§ў§§ћ§§ћ§ў§ўћ§ћ§ћ§ћћњћњњћ§§ўў§ ўєћ§ўў§ў§§ћ§§ўўѕ§ўћ§ћўћў§§ўўї§ў§§ћћ§ўћћ§§ћ§§ ўўћ§§ћћ§ћћ§§ћ№§ћ§ўўћњњ§§ў§ў§§њњђ§ћўћ§ћўў§ћ§њћњњћ§њўљњњћњћ§ћљњћћњљјљљѓњћњћћў§§ўўћ§ћћћў§ўў§§ћў§§ћњњђћљњњћњћ§ћ§ћ§§ўў§ћ§ћћњ§§ћњњћљћћ§ўўћњћў§ўўђ§ў§ў§ў§ўћћњўћ§§ћєњћћ§ћў§ў§ў§ўўіћ§ўў§§ћ§ћўўяћњњћћўћ§§љњ§§ўўћњњћў§№ћ§§ў§ў§§ћў§ћћў§ўўў§ўўш§ў§§ў§ћ§ўў§ў§ћ§§ўўћ§ћў§ўў§њћўўћћ§§њќћў§ўўў§ўўќ§ў§ўўћ§ўћўўў§ўў§ўћўў§ўћїњћў§ў§ў§ўў§ўћўўў§ўўћ§ћў§ўўў§ўў§мћў§ў§ў§§ћ§ўў§§ћњњћњћњ§ћ§ћ§§ў§ў§ћћў§ўўћћ§§ў§§§ў§ўў§§ў§§эў§ўћњћљћ§ћўў§ўћ§ћћњњћјњљјјљњњ§§ў§§ў§ўўў§њњїћў§§ћ§§ў§§іўћћўў§§ћ§ўўш§ћћў§ўћћњ§ћ§ћў§§ћњћ§ћў§ўў§ќћ§ћўў§ћ§ћћћ§ўў§ўўњ§ў§ў§ўўњ§ў§ў§ўў§ќў§њћћ§ўђ§ћ§§ў§њ§§ў§§ћўўќ§ў§ўў§ўћ§§ћў§ў§ўўђ§ўў§ћњћћ§§ћ§§ўў§шћ§§ў§ў§ўў§њћњ§њћњ§ћ§§ў§ўў§§ў§§ћўњћћњќћњ§ћћўў§§јћ§ћ§ћ§ћ§§ўћњњћў§ўў§§ў§§§ў§ў ўўћњњѓћ§§њњ§ћ§ћў§§ћћўђ§ў§ў§ў§§ћ§ћў§ў ўў§ўўќ§ў§ўўљ§ћ§ћћ§ўўў§ўўі§ўўћћ§§ў§ўўќ§ў§ўўќћњћ§§њ§ћ§ћћ§ќњћ§ўўў§ўўњ§ўћў§ўўњћў§ў§ўў§ћћњћћ§ўўњ§ў§ў§ўў§ћїў§ћў§ўћћњњ§ћўћ§§ћћќњўў§§ўћўў§§ћ§ўў§ўћ§§ў§іћў§ў§ў§ў§ўўў§ўўћяњћћў§ў§ћћ§§ўћћ§ћ§§љћ§ў§§ћ§§љћ§ћћ§§ўўў§ў ўў§ўўў§ў ўі§ћћ§ћњћћ§ўўї§ўћћњ§њњ§§ўњ§ў§ў§ўўў§ўўў§ўўљ§ў§§ўў§§љў§ў§§ћўў§ћљ§ћ§ў§§ўў§ќћ§ћўўђ§ў§§ћ§ћ§ћ§ўў§ўў§ћўљ§ћ§ћ§ћњњћћ§ћћўўћј§ћћњћњћ§§ѓўћ§ћ§§ў§ў§ў§ўўќћ§§ўўќ§ў§ўўј§ў§§ўў§ўўў§ўўњ§ў§ў§ўўјћ§§ў§ў§ўўў§ўў§ћ§ўўў§ўўў§ў ўќ§ў§ўўў§ўўў§ўўў§ўў§§ћ§ўў§ѕћў§ў§ў§ћћ§ўўў§ўўњћ§ћў§ўўљ§ўћћ§ў§§ўћ§§ћўўќ§ў§ўў§њўћўў§ўўўћўўў§ўў§ўћўўћ§ћ§§ў ўћћ§ћў§ўў§§ћ§ўўє§ў§ў§ў§§ћў§ўўў§ўўў§ўўќ§ў§ўўћћњ§§ўћћљўћћњ§§ўў§ћў§ў§ўўў§ўўў§ўўј§ў§ў§ў§ўў§њћњњ§ћўўїћ§ћ§§њћ§ўўќ§ў§ўўќ§ў§ўўє§ў§§ўўћў§ў§ўўў§ўў§ў§§ў§§§ў§ўўњ§ўў§§ў ўќ§ўў§§їў§ўћ§ўў§ўўќ§ў§ўўќ§ў§ўўћэў§ў§§ћ§ў§ўў§ў§ў§ў§ўўў§ўўљ§ћћ§ў§ўўс§ўћћ§ў§ўћ§ћ§ћћњћћ§ўў§ўћњћ§§ў§§ћћљ§ћ§§ў§ўў§ќћ§ћўўѕ§њћ§ўўћћ§ћ§§єћ§ћ§ћ§§ўћ§ћўўќ§ў§ўўў§ўўў§ўў§ћў§§ў§§њћ§§ў§ўў§§ћњњ§ўћ§§љњћ§ћ§§ўўњ§ў§ў§ўўѕ§ўћћњ§ў§њњљљўјѕўќћ§§ўў§§ў§§щћўћћ§§ћўћўњћљћњўћўћ§§ћ§§ђўћ§ћ§§ў§ўћўћўћћіўћўћў§§ћ§ћћўўњњў§ћћўўћћњўћўћўњњѕўћўћ§§ў§ўў§§ђў§ў§§ћўњћћўћў§§дћњћћњњ§њў§§ћ§љћљўћўћўњ§§ў§ўћўњћљљјћћ§§ў§ў§ў§§љўћў§§ћ§§ьў§ўћ§ћўћ§§ћљћњ§љ§ћў§§ќў§ў§§њў§ў§ў§§ћ§§љћћѕњўћ§§ў§§ўў§§сћўћ§§ў§ў§ўћўћ§њћћњљћњ§њ§ћ§ћўћў§§ўў§§іў§ў§ўћ§њ§ћћ§№ћљњљ§ћў§ўў§§ў§ў§§јњћћ§ћўњ§§ћј§њ§њ§ўў§§ўў§§ёўћў§ўњћљ§ћўњ§њ§§єўњ§љ§њћњўћў§§ђћњћћ§њћћўћ§§ў§§ѕћўњћљћ§ў§ў§§ьў§ўћ§ћў§§ћ§ћ§ћ§њ§њ§њњј§њћћ§њ§њњ§ќњћћ§§ўў§§єўћўћ§ћўњўњў§§љћ§ћ§§ўћћ§цў§ўћўњўћўњ§њ§ћ§§ў§ў§ў§§ћ§ћћјўћўћўњ§ћћі§њ§њўњўћў§§ќўћ§ћћёў§ў§ўћўћўћўњ§њћћ§§ўћћ§іў§§ў§§ўћћ§§ёў§ў§ў§§ћўљ§њ§ћ§§ўћ§ў§ў§§§ћў§§ёўњћњ§њћљћњњћўћ§§јћў§ћћў§ўў§єћ§§њћў§ў§ў§ўўѕћ§ћўћўћ§ўў§§ыўћ§љњљ§љћјћњ§њ§њ§љћњћћя§ћ§§ў§ў§§ћўћћ§ўћ§§§ћўћћќ§ўў§§љўћћ§ў§ўў§эўљњјћњћњ§ћўћўћўћўњ§§ѕћў§ћћўћўћ§ћћћ§њ§ћўўќњћљ§§ўќ§ў§ўўш§ў§ў§ў§§њћњ§ћ§ћў§ў§ўћ§§ўўў§ўў§§ў§§љўћ§§ўћ§§љћў§ў§ў§§§ў§ўў§њў§ў§ў§§яўњ§ћ§§ў§ў§ў§ў§ў§ўў§§ў§ўўє§ў§ў§§ћ§ў§ћўўњћ§ћў§ўўќ§ў§ўў§§ў§§ѕўћўћўћў§ў§ўўхћў§ў§§ћ§§ў§§ћўћўњўћ§ћ§њ§ћў§§ўћ§§ѕў§ўћўћћ§§ћўўѕ§ў§ўћ§љњљ§ћћћўћ§§ћћуўћўћўћў§§ћ§ћ§§ўћ§њўћўћўћў§§ћўўѕ§ўћ§ћўћўћўћћўў§§оўњ§њўћ§њ§њ§њўћ§§ў§ў§§ћў§ўћ§њ§ћўћў§§шў§ў§ў§ў§ўћ§ћўћ§§ў§ў§ў§ў§§яўњ§ћ§§ў§ў§ў§ў§ў§ўўќ§ћћ§§ыћ§§ў§ў§ў§ў§ў§ў§ў§ў§ў§§њў§ў§ў§§ўі§ў§ўњ§ћ§§ўўў§ўўќ§ў§ўў§ўќ§ў§ўў§§ў§§ћїў§ў§ўћ§ћ§§ђў§ў§ўў§ћ§ћў§ў§§ўќ§ў§ўў§ћўћў§ўўљ§ў§ў§ў§§пў§§ўў§ў§ў§ў§ў§ў§ўћўњћњў§§ћ§ћў§ў§ўў§§ў§§§ў§ўўў§ў ўў§ўўќ§ў§ўўђ§ў§ў§ў§§ћўћћљ§§їћў§ў§ўћў§§ў§юћў§ў§ў§ў§ў§ў§ў§ў§ўўр§ўћ§ћўћўћўњ§ћ§ћ§ћў§ўў§§ўћ§ўў§ў§ўўѓћўћ§ћў§ўћўћў§§іў§§ћўћ§ћ§ўўн§ў§ў§ў§§ћўћў§ў§ўћўћўћў§ў§ўћ§§ў§ў§ў§§ўў§ўўњ§ўћ§ћ§§ўў§ўў§§ћўўў§ўўў§ўўў§ўўў§ў ўћ§ў§ў§§љў§§ћў§ўўў§ўўі§ў§ћћ§§ў§ўўќ§ў§ўўќ§ў§ўўѓ§ў§ў§ўћ§§ўћ§ўўћ§ўћўћћўў§§ўќ§ў§ўў§§ў§§§ў§ўўќ§ў§ўўў§ўў§§ў§§ўќ§ў§ўўь§ў§ўћў§ў§ўў§§ў§ў§ў§ўўў§ўўќ§ў§ў ўў§ўўщ§ў§ў§ў§ў§ўћ§§ў§ў§ў§ў§ў§§ў§љўћўћўћўў§§ў§§ўў§§§ў§ўўќ§ўћў ў§њћўћ§ћ§§ўє§ўў§ћўћ§§ў§ўўј§ўў§§ў§ўўў§ўўќ§ў§ўўљ§ў§ў§ў§§ћўћў§ўўќ§ў§ў ўў§ўўў§ўўў§ўўў§ўўќ§ў§ўўіћўћ§ћ§§ў§ў ўќ§ў§ўўђ§ў§ў§ў§ўћў§ў§ўўќ§ў§ўў§ќћ§§ўўў§ўў§§ў§§іўћўћў§ўћўћћчў§ўћўћў§§ўў§ў§ў§ў§ўњћ§§ћ§§ўў§ўўќ§ў§ўўў§ўўћїўћўћўћўћ§§§ў§ўўј§ў§ўћўћ§§ћќ§ў§ўўўћўў§ќў§ў§§ўў§§§ў§ў ўў§ўўў§ўўќ§ћ§ўўњ§ўћ§§ўўћ§ћўћўўќ§ў§ўўњ§ў§ў§ўўў§ўў§ўў§ўў§ћў§ў§ўўќ§ў§ў ўў§ўўў§ўў§ ўќ§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўўћ§§ўў§ў ўў§ўўў§ўўў§ўўњ§ўћў§ўўў§ўў§юћўћў§ў§ў§ћљ§ћ§ўў§ўўў§ўўњ§ўћўћўўў§ўўў§ўўќ§ў§ў ўќћ§§ўў§§ў§ўўў§ўўќ§ў§ўўў§ўў§ўћ§ўў§ўўў§ў ўњ§ў§ў§ў ўі§ў§ў§ў§ў§ўўќ§ў§ўўј§ў§§ў§§ўўћ§ў§ў§§ўє§ў§ў§ў§ў§ў§ўўј§ў§§ћў§ўўў§ўўў§ўў§ћў§ў§ўўў§ўўў§ў ўќ§ў§ўўќ§ў§ўўў§ўўў§ўўє§ў§§ўў§ў§ў§ўў§§ў§ўўў§ўўў§ўў§ўў§ўўљ§ўў§ў§ўўў§ўўў§ўўў§ўўќ§ў§ўўќћўћўўў§ўўў§ўўј§ў§ў§ў§ўўў§ў)ўћ§ў§§ў ў§§ў§ўўў§ў ўє§ўў§ћў§ў§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўўў§ўўќ§ў§ўўњћў§ў§ў ўў§ўўњ§ў§ў§ўўќ§ў§ў ўў§ў'ўў§ў ўў§ў/ўќ§ў§ўўў§ўўќ§ў§ў ўќ§ўћўўў§ў ўў§ўўў§ўўќ§ў§ў ў§ўў§ўўў§ўў§ќћў§ўўћ§ћ§§ў)ўљ§ў§ў§ў§§ўў§ўўќ§ў§ўўў§ў ўў§ўўў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўўј§ўў§ћў§ўўў§ўўј§ў§ў§ў§ў ўќ§ў§ў ў§ўћўўќ§ў§ўўј§ў§ў§ў§ўўў§ўўњ§ў§ў§ў ў§§ў§§ўѕ§ў§ў§ў§ў§§ў&ўў§ўўј§ўћ§њ§љ§сћ§§њћћњњјїћћљљњњїѕјїљњћљљјњћњњљљћјњљљїїўѕљљэњїљјјљњјїєѓѕѕїїѕњњћћ§їљјїњљћљњѕѕўїѕѕўљїїўњјјћњєљћјјїљїїњњјњњќјїїјјњўјїїјјљјњјєјјњњ§љѕїїљїљїљљїњјїјњјјњїїђїљјљћ§ћћ§ћ§њћїѕєїјјїєшѕљєєљїїњћњјјљћњњљїљїјњњјјїѕщїѕєљїїјћћњћјјѕјјљїњјњњѕѕљїѕјјїїѕѕљєѕїљїљїїћѕљїїѕѕёїјјїјњћћјњїљњњјјўљїїюљїљљјѕѕїєѕєѕњћљїњїїіѕјјїјјњћјњњўїѕѕќїљљїїўњјјїљјїјћћјњћћіњїїњјњјїїѕѕєјѕїїјњњљ§§ћјљћјћћљљ§ћћњјїјјюљћћљћћљћљљ§ћљћљ§ћјјљњрћљћњњїјјѕїїљїљ§ћјїєєѕјћ§њљљњњљјїїѓјїњљћјњјїљ§њћћіјѕѕїїјїїљїїјѕјљѕєѕѕїїѓњћћїѕїїљњњћї§§ђњљћњњљїљњјїїљњњј§ћјњњїѕўјѕѕљєѕљњјљѕѕїіјљљћњјњїњјјћњљћјљљ§іњ§њљјљћљћњњќјњњїї№љїјљјїїљїїљјњњљїїѕћїњ§§ћћјљљћљјњћњњјћь§ћљћњїїњћљјњїѕѕљњћћљљ§ћјїїѕњјѕїѕѕєєїфѕѓїјћљћјљћљјїїјјњјњјћћјјњјћјјћюљћјјњїїљјјњјњјјїїѕѕїјјљїљїїњњћћў§љљњјњјњјћћњњјњњљћјјјњјѕїњћљћћњїќѕїјњњўљїїјљїљѕїїѕ§§љљњ§ў§ћјјўњјјўњћћѕљњљћљљћјїјњњјїіљњјјњћћњїјјђњјјїїљїѕїљїѕћўў§єњљћљћћњ§љњјћћњњјњјљћћљћѓљћћњјњјљњњјњљљћћњјњїїњљїїѕњўўћћњљњњ§§ћњ§ћљјјјљћћљћљњјјљЇњїљљїјјњћћјљћљњјјњїїјїјњњјњјјї§§њњћњћўћћ§ћњњљћљњћћњѕїѕјћљјњљћњјњјјљљњјњљљћњћћњјћ§§љ§§ўў§ћћіњљњ§њћ§љћјјћћљјњљћћі§љљњѕїјљљјјќњљљњњўљћћќљћљћћјјїѕј§§њў§§љ§ђњћћљ§§љћјћћ§§ўўє§њљњјћљћњћћ§§љљњњјћњїїјтњїљїјћћљ§ћњљјјїјюшђљјљћћњјјљћљљ§ћыў§§ћњ§§јљћјњћњјњњћ§§ћћўњјјьњјљћћњјњјњњјѕѓѓђєѕћјјќћњ§ўў§ўћћўћў§§љјїњїјћњјћћ§§ўљћћ§љћ§§ѕћљїїѕєєјљњјјњљѓјћћњјњљњ§љњњљљўћљљјљўћјјњњјљїјїїэјћћјћјћћљћћљњїєєѕљїїђѕјљї§љћњјјїћњ§§ёњљјїљљћћљ§љ§ћљћћ§ћ§њљћћсјњїїјћљћњїљїѕїљїїњћњљїљјїїѕїњїјјєњјјћћ§њ§њћћљљљњ§§љ§§ўўњ§ўњ§§ыњ§љљћћїјјњћњјїѕѕјїљљѕѕїяјњњјћјїњћљћћјњ§§ћћ§љј§§єњўўћўў§ћћ§њ§§ўћўў§ўћјјјїјѕѕјјѕћћј§ў§њњћљ§§ќњ§§ўўў§ћћ§єћњћљјњљљћјјћћўљћћњ§§ћњњшјћљљњ§§ћ§ћјјњ§њў§§ўћў§љњњ§њїўћ§ћњњћљўњјјўїєєьїјјљљњљћћјјњјјљљј§њ§§њ§§њ§§ўѕ§њ§§ћљћјј§ўўу§ћјњјћћ§љњѕїјњћљјљѕјїљљћћљћљћћњўћўўі§њћћ§ўўњ§ўўќњ§ў§§ћўљћћњњјћљћ§§єњ§ћјњїљјјњњћћ§њјћћјљњјњљћ§ўўб§њјљ§ўў§§њ§ћў§§љћљ§љћћљљћјїљљјјљћћљљћљњљ§ћњїњљ§§њ§њњћћ§јљљьјљњ§њњ§њћњ§ўњ§љћњћћ§§ќўћњћћ§њё§ћћљћјњњљљ§§ј§ћћўњ§§їњ§§њўўћћўўњћўўћ§ћћќјњ§ўўљћњљњћњ§§єћњњљћ§ўў§§ћ§§іћјњљњ§§њ§ўўќћўў§§їљћњњ§ўћ§ўўњљќјїњ§§ўњ§њ§ћћљљњќљ§§ћћ§ћхїљћўўћ§љћљљ§њ§ћћјѓїјћљ§ћїћљљѕјїњљјњњ§ўћўў§њњљћљѕєѓѓљєѕїњјњўў§їљњјїєјљ§ўўћћўњ§ў ўђћўћўћў§§њ§§њљјјѓїјњњїєѕїћњ§§ўў§№јљњ§њ§љњ§њўўћ§њўўўћўўљћљћћ§ћўўўњ§§ћљ§§њљљћћњїїјјўњћћћ§ћћљ§§њўћўў§§§њў§§ўњ§§ўќ§ўўњњў§§њўўјћ§§љњћљјјїњјњјїћњ§ўў§§њўўћњ§ўћўўћўѕ§њ§§њћћњ§§ўўўњўў§ћћњћљўў§њћ§§љў§§ўћў§§ўћ§ћћјњњїјћљљћ§њћ§§ќћўћўўћћў§§ўўў§ўў§љњўўњ§њўўѕћњ§ћњњјјљљїїђћљљјљљћљћљћњјўўљљ§ўў§њўўћјњ§љљћћ§ўў§іћљњјћ§ў§љ§§ћїјњљћјјїєўўњ§ћљўўћўўћ§ўћўўћћў§§ўў§§љїї§њћ§§ѕњћњћћљћћјњћћљћњїїэ§§ўњљљ§ќњћћўўћўўћ§§ў§ћњћ§чћљїѕѕїјјћћљћљљ§њћњјюу§њ§ўўљћўћўћћўўћё§ћћ§ћ§ћљћљ§њ§§ўў§§љћћюїћћ§њ§њћјјћјїѓяээўўўћўў§ћњ§§ўњ§§ўњўўлћњљїћ§§ћљјїїњљ§§ћљљћјљљћ§ћњїљљєёышшюўўђћўћўўњ§§њј§§ћ§§ўћўўўћ§§ќў§§њњтљћћњјљљњїњћњњљєђяюьяєє§§њ§ў§§ћћњўњ§ўљ§њўћўњўўўњ§§§њ§ћћ§ѓћњљїёяяюээђѕјјіњ§§ћўўњўўњњўљ§§ѕњ§њ§ў§њ§§ћўў§єњ§ћњљћћїєєђююіяёђїљјћљљўўјњўўћўўћўў§ћњ§§ћњ§§њўў§ћњўћў§§щћљјљїјєёэыюяёђѓѕљїњњћћўўњ§ћў§ћў ўў§ўўќћ§§ўўћсњ§§ў§§ћјѕѕњїѓяёяђђѓєљљњњћћљћўћўў§ћ§ўўўћўўћ§ўћўўќћ§љўўє§њњў§§ћћљљєђђєѓєѓѕєѕѕјј§§ћћўћўќ§њ§ћћ§ўћўўќњ§§ўўўћўўњ§љљѕђёёяѕѓєѕїјњњ§§љљћћ§ўћћїўћћ§§њћћўўў§ўўћћўўћўўђћўћўў§љћљѕѓђѓєєіѕљњћљ§§ћћљљ§ўњў§ћє§ћњѕѓђѓѕјєѕїїёћ§§ћљњњљћ§љ§љћўўњ§ўћ§§ќњ§§ў ў§ћјљљфїєђђёѓєєѕїїјјњєїљћ§§ћњ§ћўўњўўѕћўњ§§њњ§§њўўўћўў§љћѕєёђєђђяѓєѕѕљјћ§њњ§§њњ§§ў ўњљњјћ§ў ўћњљљїѕѕњѓёђђїєєњѕљњћћ§§њц§љјјњїјњљћўўћўњ§њўњ§њўўњћўўы§ћћјѕђђѓђёёѓєѓђѕїєјєѕѕћјѕєѕїїѓјњћљћ§ћљњљјњў ўўљћћўл§ћјјїђяюяюяяђєјїђђїїјњїјѕѕљїїјјњљјїјћћўљјјњўўћўўўћўўюћњћјїѓёюёяёёэђђѓєјјїѕїїј§§ћљћћјљћњјњћњћћщљњњ§§њ§ў§ўћўўћўњ§§ўћ§јїїћѕѓёёђђљяёђѓєїљљэјљљ§§ћћљљњњїљјљћ§§ћћјљћћљљўњўў§ўћњњѕјѕєїєєѓёђђѓѓыїѕљїїѕѕљїїљљїѕїјћ§њљћћо§љњјњ§њ§љљњ§њїїјћїјїѕѕјњњљїљњљїљјѕѕьљјјѕїјњњјћњїјћћњћњњћћѓјљћ§§њњ§њњ§§ўў§єѕэљѕїњњјѕїљ§љјћјїјћљјјљћ§§љљњћћљюћ§§љљћјјњјћ§ћўў§њўўќ§ў§љћњћ§§њњўљњњћўњљљћњљјљћћњњљњњљјјћњљјјљљјљојїїјљњљїїјјљљњљњњћњ§ћћњћљћњћљњљњљјјљњјћњљљњљћњњ§љјљљўњљљќњљљњњљњљњўјњњќћњњљљўјљљјљјљјљњўљњњ§љњљљэјњћњ§њћњ§ћ§њћњ§ћ§њљљњљцјљљјјљјљљњњљњњћњљњјљјљњљљњњљъјљјљљњњћ§ћњњљњњјљљњљљјјўљњњљјћљјљјљљ§њјљљјёљњњљњљћњњљљјљљњњљіјљјјїјјѕїјјћљњћњљљњяћњњљњњљљњљњјјљјјљљњїћњљњњћњљњњљњњљњљљјјїѓјљљњљљћ§ћ§§ћњњїћњћћ§њњљњњћћњћњњћћўњћћў§њњћљќњћњљљњљ§јљћћ№њљїїјњњ§§ћћ§§ћњљљїњћљћњњљњћћ№§њћњћњњјјљљњљљјљљјјїјјљјјљљсћњљјљљјљљњўћ§ћ§ћћљљјљјљњљљјљњљњњ§ћњљљјўїјјњљјјљњјјљўњћћњљњљћљњњћљћњ§ћћј§ћ§ћљјњћћљљњљљ§њљљњјљњћњљљњјњљљјљљјљљ§ћ§њћњњэћњћњљњњљњљњњћњ§њћњљљњњћњљљјјњћћњћљљјјњїљљјјїїљњъћњ§ћњћњљљњњљњљњњћњњљ§њњћ§њћћњњђљћљјњњљњљњњљљјјљњќјљјљљњћюњљњљ§њћњћљњљњљљћћњњљїњћњћњћњњљљќјљњљљўјљљїјљјњљљј§ћћўў§§њ§љ§њњљљћњћћљћћњљњљЧјљњњљњћљћњњ§љњњљљјљјљјљјў§ў§ўћћ§ћњћњћ§§ћљњћњћњћњљњљњћњћњћћђњћњћљњљњјљљњљћћќњљњљљљјљљј§§ўўї§ў§§ћ§ћ§ћћѕ§њњћњњћњћљњњћљјћљњњљњњёћњћљњњљћљњћњљљњњјљ§ћњљћ§ўўѕ§њњљћњћљћњљљњцћњљћћљњљњњјјљњњћћњљњћљ§њ§ћћ№§ўўћћњћ§ћљ§§њћћњњёћњљћњћњ§ћћљњљњћћ№§њљјјљњљћњћњћњћњњђћњњљњњ§ћ§ў§ћ§ћћ§љћњћћ§ћњњя§ћў§ўћ§ћљњњћћ§ћњ§§њћ§ћњљњњљњљЧјљњћњћ§ў§ћњњћїяђєјњћњћљњњћњћћўћ§ћ§ўў§§ћћ§§ћ§ћњњљњљњљљћћ§њњќћњљњњэљњћњћљњљњљњњјђђѓїјњњ§§ћўўќћ§§ўўїћ§ћўћ§њљњњўљњњѕ§ћ§ћњњћњћњ§§њњћњљјїї§јљњњљјђћ§ћњљњљћ§ћћљљћћўњћћњћњљљњјћњћљљћ§њ§њњћїњћљљїїјјљљщјїјљ§ћњљњњћњ§ћ§ћ§ћ§ћњњћћћњћћўћћњє§ћћњћљћњћњњљљњіћњљљјљјљјљљяћљјљјњљљњљљњ§ћ§љњњ§§ћњћћ§ћ§ўў§§љћ§ћ§ћ§ћћђњћњњљћљњљјјїљјјњљћњљљњњьљњћњћћ§ћ§њћњћћ§ћ§ћ§ўўї§њћћ§ћ§ћўў§ћћ§ћ§њњјљїјјїїјњњ§§ў§§ѓњћћ§ћ§ћ§§ў§§њњѓ§ћ§ћћ§ћћњљћћњњєћњћњћњћ§§ћћљљћњљњњћћјљ§ћўћњњ§§їўћ§§ўў§ћ§§ћўљ§њљљњњћћўљњњљїјљњњћћњћњњљљњњћћњ§§ўћ§§јћ§ћ§ћўў§§юћњћћњ§ћў§ўў§њњљњњћћцљњљњљћћњјјїљћћњћћњћћњћљњљўў§њё§ўў§ћ§ў§ўћўћ§ћњњўћњњќљњњћћю§ћ§ћћњњљјњњљљњћњљњњќћњћњњљ§ћњћў§ўў§њћ§ўўћ§§ўіћ§ћњћ§ћњњћћюњљјјњњћћњћћњћ§ў§њљљћў§ћћ§љћ§§ўў§ћћћ§ћ§ћ§§ўњ§§ћюњљњћћ§ћўў§ћњњ§ћ§ћ§§їћњњћњњљљћћ§њћ§ћ§ћ§§§ћ§ўўў§ўўўћњњжћ§ћў§ўў§ћљњ§ћ§ћ§ћ§њљљћњ§§ўћ§њћћ§њњљћ§§ћ§ћўўў§ўўњћ§ћћњ§§њўћў§ў§§ћњѓ§ћ§ћ§ўўћ§ћћњћћ§ѓўћ§њћњ§ћћњћјўўі§ћњћўћ§ћћњњїљњћћ§њћњћћќљћћ§§ўњћ§ћ§ћ§§ёћњјјљїѕєїјљљњљўўєћ§ћћљњњћњћћўў§љў§ў§ў§ўўѓ§ў§ў§§ћ§ћ§§ћњњ§ћњљљјыљћ§§ћў§ў§ў§§ћ§ћ§ћ§ћў§§ў§ўў§ўўћћњњ§ўў§јћ§ћўћ§§ћћўњљљњћћњ§њћћћ§ћ§§ўўї§ћ§§ўћ§ћ§§ѕћ§ўў§ў§§ўў§§ћўћ§§ўўї§ўћ§ў§њћњњћћњ§ћўў§ў§ўћўўў§ўў№§ў§ўћ§ћћ§њњ§ћ§§ўўў§ўўђ§ўћ§ћ§ћ§ћћљћћў ўќ§ў§ўўњ§ў§ў§ўўў§ўўмћ§ћўћ§ўў§§ћ§§ўћћњњљњљљњњћћњ§§њћ§ћ§њўўў§ўўћўњ§ўћў§ўўђ§ўћ§§ў§ўћ§ўў§ўў§њњљњњјјљљѕњћћњћћњћњћњњў§їўћ§§ў§ў§ўўў§ћћњ§шў§ў§ў§ўћ§њћљњњ§ў§ў§ћ§ћћњњєљћњ§њљїў§ўў§§ћўў§ўўў§ўў§ћ§ўўћѕњљљћљћћ§ћ§њњћњ№љњњћњћћњљѕя§ћ§§ћћ§ ўх§ўћ§ћ§ћ§ўўћ§њћљљњњћ§њјљјјљњњћљ§њњїёц§§ўѕ§њњћўћњћњћ§§ќћў§ўў§ўћњњћўњ§§ўћњњњљѕђяюўўі§ў§ў§ў§§ћ§§ќћ§§ўўќ§ў§ўўм§ћњћћ§њћњљљњћ§ћњћћњ§ћћњ§њљњјјїѓьцыяўўў§ўўј§ў§ў§§ћ§§јћўћ§ћў§ўўў§ћћћ§ў§ћљљтћњњљњћћљћљћљљјїєђьюёѓї§ћ§ћўћ§ўў§ў§јћ§ћ§ћ§§ўўњћ§§ў§ўўњ§ў§§ћ§§ьњћњћћ§њњјѕѓђђёыюѓјњ§§§ћ§ўў§§ў§§ћўћ§ћ§§ќћў§ўўі§ў§ўћ§ћ§ћ§§њћцњљјїєђэьђѓєѕјњњћўў§ў§ў§ў§ўўђ§ў§ўў§ћ§ћ§ћ§§ўў§хћ§§ўў§ћ§ћњћњјљїїѓььёѓѓєѕјјљљяћњў§ў§ў§§ўўћў§ў§ўў§ў§ћ§ўўўћ§§ћњьљњљѕђюђєєѕїљјњљњњћњўў§ ўє§ўў§ўў§ў§ў§ўў§ћъњљјїѕєєѕїѕєїјњњ§ћ§њћњўўў§ўўќ§ўў§§ўє§ў§ћћў§ў§ў§ўўў§ўўћъјєєѓђѓєѕїјљњ§§ћ§ћћњњћўўћў§ўўњ§ўћў§ў ўў§ўўї§ћћјјѕєѕїїјњћ§§њћћ§§ћўў§§ў§§ў§ћёњћњ§њљјѕєѕјїјјљљ§њ§ћћљљћњ§ў§ћў ў§§ћ§§њћў§ў§ўўьћњјјљљїєёѓѕїїјљљњњљћћћ§њ§ћўўў§ўў§ўћ§§ќћ§§ўўэ§ўў§ћ§ћћјѓѓєїїѓєѕїјјњ§ўћ§§ќћ§§ўўќ§ў§ўўј§ўў§§ћћў ў§ќћјљјјњѕѓёєѕїїіјљљћњ§ћ§ћ§§№ћњњљљњљћњў§ў§§ћ§§§ћ§ўўћњўјѕѕѓєѓєѕїѕєєѕїїљјјћїјјњљљ§њљћћћљјњљўўў§ўўх§ўћћњїѕєёяђѓёѓєїїѕєєѕљњњљїјјљњэљћњљњњћњћ§њњљљў§ў§ў ўѕ§ћњљѕѓяюёѓєєўѕїїњјљљњ§ћћўњћћіљњљћ§ћњћћ§§њћўћўћўў§љћ§§ўћњљљћјѕѓѓєєѓќѕјљјјіїјћ§§њњћћљљїјњћњ§ћћњћћјњћћў§ў§ўўьћ§њљљњљљњјїѕїїѕєѓєєѕѕјљјљјђљјљњћћ§ћћњћћў§§њћ§§ћћ§§љњ§ћњљљєњљљјљјљјљјїјјїіјљњљљњћљљњњіљњљљћњћњњћћ§ўћ§§јћў§ў§§ћїїјљњћј§ћњћњњћњњў§ћћћ§њћњћћ§ћњђљњћћў§ўћ§§ў§ў§§ћЗ§ў§ў§ўњўћў§§ћ§њћњ§ћњњћћ§§ўћ§њћњ§њ§ћћњ§њ§њћњ§њћњ§љћњћћњјњљћњ§њћњ§ћ§§ў§ўћћ§§њўњ§њ§љљћ§њ§њћћѓњ§ћ§ћћњћћ§ћўњњў§ћћ§њ§ћћтўћћњћњ§њўћўћўњћњўћўћўћћњ§њ§њ§њњў§њњќўћўћћњћљ§њћ§§йћ§§ў§§ћ§§ў§§њ§љ§ћўћ§њћљ§њћљ§њ§њ§ћўћ§§ћњњњ§њћћўћћ§§њ§§ѕњћјњњ§ћ§ћўћћњ§ћўњ§ћћєљћљ§њћћ§њћљћћљњ§њ§њ§њњћ§њ§љћћћњўћњћћњ§ћўњњћћћўћћљњњѕ§њ§њ§љћћњјћћ§кўћ§њ§њ§ћўћћњў§ўћћњ§њћљ§њ§њ§њўћўњ§ћњћ§ћћ§ќћњљћћњщћљћјњјљњ§ћўћ§§ў§§ћ§ћ§ћ§§њў§ўћўћћ§§ћ§§їўћ§ћў§§ћ§§чњўћ§§ћћ§§ўћўњћњ§њ§њ§ћўћўњњћ§ўў§§їўћћњ§њ§њћћ§ћЮў§§ћ§ћ§ћћљњњћњ§њ§њњљћњћљћљ§љ§њ§њўћ§њћњ§њўћ§ўў§ў§§ћћђ§њ§ћўњ§њћњћњўћћчљ§љћљћљћљћљћњћћ§љћљ§љћ§§ћћјўћўћўћў§§ьў§ўћ§ћўћ§ћћњћћ§њћњ§њњћќњ§љњњћњь§љ§љћљћљњ§ў§§ћ§ћўћћ§§ѕўћ§њўњўћўћ§§ђћ§њћ§§ћўњћљ§њ§§§ћ§ћћњѓћљћљћљ§њћљњјњњ§ќўћў§§їў§ўў§њўњћћў§ћћ§јћў§§ћ§§ћћћ§њўњћћњјљћљњњўћњњћљњћў§§ў§ћ§њћ§ћћњћћч§ћўћћњћњ§ћ§ћ§ћ§ћ§њўњ§њћњћћў§њњў§њњћ§њћ§ўўё§ў§ў§ўћўћўћ§ћўћћљ§ћўћ§ћ§§ћћўћўћћћњ§њўћћў§ћћњўћ§ћћњњј§њћњ§њћўў§ћћў§ўћћѓ§ћ§ћ§ћўћћ§§ћ§§ўћ§§ћўњћћ§ўћ§§ћћњ§њ§њњўћўўђ§ў§ў§ў§ўћ§ћўћ§§ќћ§§ћћёўћ§ћ§њ§њўћћ§§ћ§§ћјњћћ§ћћњћћіњћћњ§ўњћћўў§§њў§§ћт§ћ§њ§ћ§§ћћ§ћћњћњўњњћћњ§ћ§ћ§ћў§§ћў§ў§ўў№ћ§ћўћћ§ў§ўћ§ћўћ§§њћў§§ћ§§эўњ§ћў§ў§ўћ§њћњћћ§ћ§§ћыњ§њћ§ў§ў§ў§§ћў§ўћўћў§§ўў§§ўћ§ќћўћ§§ыў§§њћњ§њўњ§ћўћўњ§љћћ§§эў§§ўњћљїхјњўћ§ћўћў§§ўќ§ў§ўўљ§ўћў§ў§§ћј§ћўћўћў§§§ћ§ћћњўћћ§§ћћѕњўљїєњјћ§ўћћ§ўў§ўўћ§ў§§ћћњўћ§ћћ§§ўў§§ўћ§§ѕўњћјњљњћћњћћњ§єћ§ћўћў§ў§ўћ§§ћћ§ћ§ћћњў§ўћўћћъ§ћўћ§њ§њўћў§§ћўћ§ћ§ћћњњіћњ§њњљћњњ§§ћчўњ§§ў§ў§ў§§ћўћўћ§ћў§ўћўћ§§хўћ§ћћ§§ћ§ћћњ§ћ§ћ§ћ§њ§љ§њ§њћћђњ§њўњ§њ§ћў§ў§ћћ§ёў§ўћ§ћ§§ў§ў§ў§ўўё§ў§ў§ў§ўћ§ћ§ћўћћј§љћљ§њњћћќ§ћўћћщ§ћўћўћ§ћў§ў§§ћ§ћў§ў§ў§ўў§њћў§ў§ўўљ§ў§ў§§ћћј§љћљћљћ§§ёў§ў§ўў§§ў§ў§ў§ўў§іў§ўћўћ§ћћ§§ћ§јћ§ћ§ћ§ћўўћіњћњћћ§ћћ§ўўњ§ў§ў§ўўў§ўўў§ўў§ў§ъћўњ§ћў§ћњћћ§љњј§ћћ§§њ§§ћёўћ§§ћ§ў§ў§ў§ў§ўўў§ўўі§ў§ў§§ћў§ўў§ѕњўћ§ћў§ћњњћћљ§ћњљћњ§§ўћ§§љћ§ћћњћўўњ§ў§ў§ў ў§§ў§§ўў§§ћ§їћў§ў§ўћћњњћэ§ћ§ћў§§ћ§ћўћћњћ§ў§ўў§§ў§§ўќ§ў§ўў§ўў§§іћўњ§њўћ§ћ§§љў§§ћњћўўў§ўўњ§ў§ў§ўў§§ў§§ў№§ў§ў§ў§ўћ§ћўћў§ўў§§ћ§§юў§ў§ў§ў§§ћ§њўћ§ћў§§їў§ў§ў§ў§ўў§§ў§ўў§ѓћ§§ў§ў§ў§§ћћ§§ў§ў§ћќ§ў§ў ўј§ўћ§§ў§ўўіћ§ћў§ў§ў§ўўі§ўћ§ћў§ў§ўў§їћ§§ўћ§ћ§ўў§ѓў§ў§ўћ§ћ§њћћ§§ўћ§§їўћћ§ў§ў§ўўћ§ў§ў§§ёўћ§њћљњљћјћњћњўўњ§ў§ўћўўў§ўўў§ўўѕ§ў§ў§ў§ћћўћћїўњћљ§ћў§ўўњ§ў§ў§ўўў§ўў§ў§ўќ§ў§ўў§§ў§§іћњњўћћњ§ћ§§ўћўўќ§ў§ўўќ§ў§ўўј§ў§ў§ў§ўўў§ўўў§ўўў§ўў№§ў§§ћћњћњћњћћ§§ўўў§ўўў§ўў§§ў§ў ўљ§ў§ў§ўћћў§ўўў§ўўў§ўўќ§ў§ўўњћ§њћњћћ§ѕћ§§ў§ў§ў§§ўўў§ўўў§ўў§ћњћњћњњ§§њ§§ћј§ћ§ћ§њћўўў§ўўў§ўў§§ў§§ў§ћ§ьў§ў§ў§ўћ§§ўњћ§ў§ћњњўўў§ўўў§ўўћ§ўњ§ћћпў§ў§§њ§ћ§ћ§њћ§§ћ§§ўњ§јѓ§ў§ў§ў§ў§ўўњ§ў§ў§ўў§ћ§хў§§њ§љћњћћ§ћ§ћ§ћўў§њљєч§ў§ўў§ў§§ў§ўў§ћ§ђў§ўћўћ§њ§їѕѓѕў ўј§ў§ў§ў§ў ўћ§ўћў§§јўњ§њ§§ў§§ўћ§§ѕћўњ§јїѕђюїў ў§§ў§§ўў§ўўў§ўўї§ў§ўћўћў§§ћў§ћћѕњјјѕїђјјњ§ўўў§ўўў§ўўі§ў§ў§ў§ў§ў ў§шў§ў§§ћ§ћў§§њњјїѕѕєїѕњљћ§§§ў§ў ўє§ў§ў§ў§ў§ў§ў ўф§ў§ў§ў§§њ§ћ§њћјјѕђєѕєјјњњ§§ўўњ§ў§ў§ўўќ§ў§ўўщ§ў§ў§§ћњњћјїёѓєїїјїћњ§ћћў§ўўў§ў ўў§ўўў§ўўщ§ў§ўћћњ§њ§їѕїѕѕјїњљњњћ§§ўў§ўўў§ў ўу§ў§ў§ўћ§љњјљѕјїњїљјљњў§ў§§ћ§ў ўќ§ў§ўў§ёљјїљїљїњљ§ћў§ў§§&ў§ьћњљљјљјњјњљњњ§ћў§§ћ§§ўњ§ўћ§ћ§§ћяїјїћљћљ§љ§њ§§ўћ§ћћ§ќў§§ў ўњ§ў§ў§ў ўћњѓљњјјѕїїњјћњ§ћћњўћ§ћў§§ўќ§ў§ўўў§ў ўъ§ў§ўћћјїјњїњјљјћљњњ§§ўўў§ўўў§ў ўќ§ћћў ў§њнљћљљїѕѕњјњјћљўћ§§ў§ў§ў§ў§§њћћ§њў§§ўўњ§ў§ў§ў ўхћ§ћћљљїјїњїњїјїњјћљћљћљћљћњњў§ћћі§ћўћ§ћ§ћћўўкћўљјѕјїѕѓјїјјљјјѕјњћњњљћљ§њ§њўћ§ћ§ћ§ћ§§ўњћћўяћўњљєљїјїјїјѕљјћљљђћљ§њћ§ўћ§ћ§ћ§ћћїўћ§ћ§§ў§ў ўў§ўўњјљ§љљїїѕјјљѕїїњїћњњќљњћ§§јў§ўћ§њћ§§љўћ§ћ§ћ§§ў§ћўњћћёљњјњјљјњјћїљјћњњќћљ§њњёћњћћў§§ћ§ћў§ў§ўў§пћў§ўњ§ћ§ћўњ§§ћћўњ§њўњ§њћљћљњљћћњћћљњћ§§ћ§ћћѕ§ћ§ћ§ћў§ў§ўўў§ўўы§ўњњјћљћњћњћњўњў§ўћ§ћћ§љћўћ§§ў§§њћ§ћ§ћ§§§ћўћћўў§ўў§§ў§§яћјїѓѕєѓђёђєѕїѕѕѓєєѕјцѕјѕїњјћћњјњћњїѕєѕѕ§§АPE-#11з)&5238?9AJQјїјњѕєђёяђєѕїѕѕєєѕїљљїѕѕјљјјєєѕєлѓєѓђљ§бU22858S>#-*$)5Tјњњјїѕѓёђѓѕѕыљїљїѕњјљїєёєѕѕњїєєѓђѓѓ§єѓєєлљ§јu<;QA,0,5521јѕљљїїѕѓѓїѕѕєєўѓєєѕїЫјїєѕїљљѕєєјѕѕєѕѓєђѓћ§ЉN1(*-%?C<*&%.&"!&,ѕєљїїѕєѓѕєєїѕѕїїјєєѕѕїљљїїѕўєїїуєѕїѕѕєћћжŽ\B%*.001!"*#(-Gљѕѕєїѓєєѕѕїѕѕљљѕђєѓєѕѕїѕїљѕїїѕїїгјєѓљљд…I!*#)&++!%&"*-љљїѕѕєѕєѓїѕѕљѕѕєѓєѕјѕѕјїѕјѕєѕєїїѕ§єѓёёуђї§ЯpC,<;;953<3(1&!(@NјњљїѕѕѓѓўєѕѕјєљљїљљѕѓѓОєёєѕјєєѕјѕѕјѕѕєѓђёѕ§§еe8147@38$&.002+37:љљјјїљѕђђѓѕїњїїјѕєѕєљїїљїѕѕїѕїћљѕјѓєєтљ§ТZ5.9:420(-;822$.;8ѕєѕѕљїїєѓѓўєїїљФїєѕєїїјјњњјљїїјїїљљїѕљїѕѕў§з`A;@:385894-%%ѕєїѕєѓђёђђєѓѕѕјјѕјѕѕјјѕѕбєѕїѕѓѕѕєєѕѕјѕѕїїљѕ§ћкp5#(885,(#2+:3(+*Hѕјїњњїѕєєіјѕїѕјљїѕѕїїјѕгєїєїљѕѕёѓєєѕѕєєѕ§§ЭM051<952%25:;;8:,>ѕјїњјїїѓѓїѕїћљћјїљїїњЪљїљѕјїїњїїѕєєѕѕїяїћТHLP)"5@9+1.12.927AљїљљњљѕѓёёєїјјѓїїыѕѓєђѕѕєѕјѕѕєєѕєєѓєѕѕѓѓћоЕVZwQC>4,!*0)+%,7-EїїљѕѕјєёюяѓѕљѕїїњњљњјњјјОњјњїїљѕѕєєѓѓєѓѓђюјјЊC1.)013,3)#,37BHAљњїљљїѓюыюѓљњњјњјњјјїљѕљљњљїїЮєѕѕєѓѕљѕєђђяљёШiAGLB>:<:>4<;2?<@4јїљћћїєёюёєѕїѕѕїјјїљїљљїѕјѕїї§ѕєѕѕЅѓєѓђђљћжvNPJMG?4.><877;@52јћљјљјђьюяѓѕїїјїєѕѕїѕѕїјљјљћљј§§јїјїѕѕєђштчђљЯiTJ>B32)*279))1<@)їїћѕјєёээћёєѕїјјФїљїїњћљњѕѕјћљјјњјѕєђѕђюээюѓїИZBPP@2,0&(0:>4(5&?ѕїїѕјєђьяђєѕїїќјњјїїдљїѕјїљѕїїѕєѕѕёяѓяяьшђљЧ[@OI1>7)*,20::@9%GњњјјщїєђёёєљјјљїјїјјїѕѕїљѕјѕѕїаєяээчцшцщщяїлtB&1%)$&08CA>12љїїјњїѓёёђѓєєѕљїљљїѕЬєѕїјњјїјѕяэющтспурхїЛU9;8-+,!3:B;BE?5(&єѕјєєѕђяяѓѕїјјўњјј§њљїїљѕѓєєѕѕєєжяьэььцтушцхюШnA#"01:?AA518BњћћјїѕѓёђєѕѕўјњњїњШїѓјњјѕёчмрпрхцуйцщюьн‚L25+%7V92:@CA@@:CљљјњїєѓђѓјљјїїјјћћШљњјљ§§њљ§њњћїђээююэыркесёуФUB#04JEC@83*-@JA474Lјћјљљєёяђєїћ§§љїїњїћјјњњїљїѕѕЯєяяэчшхплмкмлче‡*+EB9500,IWOC<418њљјїїєюэѓјњћљљјњњљ‡їјњїњјјњјјїїѓяцнлмлйжснсѓѓА?$.;9795+*5?C04+ћљћјїєѓѓѕљјћћјћѕјјћћјњћћљњјљњљњњїьеденнкпннмыьЃ<:C7.73-8PN9.4*(0?5@??ѓ8.їјњїѓёяєњћјјњѕјђєїјјћћљљаћњ§§ћјєщхэытуюяюьђѓЄ;@2%!.(,,31:<--14јљљѕяюяѓљњјјљ§ёЋУїєїїјНїѕѕїѕѕјњњјѕєѓюѓєєѓюїяЕ[<9757$%&0;A5*)->ћљјјђёёѓєѕїїѕїњщЄпўњљћјјљљћљљ§јњјјїѕЯѓячмтм–8&255;1(*+8@;,+3.љћїѕђёяѕљїљћ§ћ§јїўњјјїјћ§§ћљијїѕѕѓєюнзс‰7&3*%#(&-:4:55ETM§§њєёёѓїљњ§ћћўљћћўљјјћћ§њњљљињљјјћљњїѕёэябv0(<<71*.*EC5-+TdMљјјђёёѓѕїїљљјїјљљјјѓњћљћїњћћјњјљјјлѕјјїјїєјєрŒI?<4.151>CHFF0k‡cњїјѓѓєјљњњљјћљљћћљїћћўљ§§РћњјјѕїњљјљїŒ&;@959*+4B@<3#9^hїјєјѕєѕїћљћ§§љћћљћћљјјњљљћљћћњјљїїњњўјњњхјњљ§ћЧI:8<02.17A<<7#+ђѓєїїіњљ§љјѕїњњћћњїћ§§љћљљћњњгљїљљїїљњјїј§ћАN2SJA259:C:70*4;Yыьђѕѕїјљ§§њ§љјјђњјљћњјїљ§љћњћјјмїѕїїјїљєѕє§љИV89&08Gсьєєїњњўћљљњ§љјњњќјњћ§§ўћљљЩњјћљљњјїјјћњїїѕ§ћЦg*4HNOO"2*$5:9:@:GFI34>JF2%*0ѕјїћ§њћћјњјјћ§ўў§§ўљћћЮњїјјљћјјљћњјїїѕїњњ§§’;38;322A,2.9G50$;єјљ§ўўњ§њћћјј№њљћ§ћћљјњјњјїљјћћлјњјїїјјїїѕ§љGGCB?@;7,*,;CA?Geјћ§ћњљїїѓјњњјњјњћњњјјњњијњњћљћљћћљћјљљїїѕ§ј…943A?B;51(8BB@>EUћјїї№јћ§§њ§ћјњљћљјљњћћѕјїњјњјїњћїњњхјѕ§љ›<5BA>9703-)3.828Mћјњњћћћљјњ§њњћљљћћљћ§љљ§§ћљ§§љјрњјјї§љЁ?@BGEC@8>GFE>71:BAHH§A;§§ћ§љћ§§ўўњњўљјјћњјћћљљЬјњїјјћљјјљћњ§§ВPIiE@GCE54AEA@CA5Cњ§ўњ§ўў§њњљљ§ћўњ§јћћњјћљљјћћљўћљљћяњўўпnB9.EGLI:9?<22њ;BEљћ§§іћљїїљ§ћ§њ§§јћљћ§ћњњўїљљпјњљїѕїљћљјј§ћжwb>BA5:A?.3-3+(28;§§њ§ћљ§§№њ§љљћљћ§јїјјњјњјјѓћљњјњїјїєјѕѓѕѕъњ§Э^G?28>CB;77.,.5@B"§§ўњ§§ћњ§§љћћћњјјњљљіјћљћћ§њћљ§§сћїѕєјѕїљїћ§ч~TJ:;.15+04177:C73§§ўњљљГњљљњњ§§њ§§љћ§§њљћљњ§њњљјљњѕѓєѕїїѓћћд\;2982:?3:?7193BIaљ§§ћјћћј§ћћјїѓїњљћљљћљ§§§љјћћњйљћњћљћјјїї§§еN*7CE99;8::>9<8BLOњћљјљћ§ћћњћ§їљїїљћјѕїјњјјљљ§љјїїс§љкZ.&318$)&.)0+??NPSњњћљњљїјњљљўѕљљћюљћњћ§њњ§§ћћљћјњћћљљдћљљј§§у\9*37@<::.%&%"@TJUљћ§§ћљћћ§ћћљћћљћ§њћћњзћљ§§њ§ћљљјћљѕїїѕє§§еQ,#)(!)4><#((24%%ћј§§ўђ§њљ§ћљћћљћјљњјјўњћћўњ§§йњћћјїїјљљ§ўЮI39:0-*8FI3023.0+ўўњ§§ћљћ§§ќћњћњњћ№њјћљ§ћљјјњјљћљјѕѕуєѕѕєљћкV5C`NA><:@7*+137,-јљјћћьјљїњјїїђѓѕјѕїїѕјћљћљљѕћњѕєїѕєїљїѕѕ§эхe?1>:1:>IJ7%(18AVZњїћњјјѕєѓєљљјїјїјјїјљњњћњњћљњњљјјўбЖTM,%7700&3*04:9@ESYњћњљјїєѓѓєїјљљјїїјљјјљјјїјїїќљјјїїьјїѕѕ§ўеW8@?9?N:(%",,ё3-9Zњљњњљјѕѓєѕјјэљјљњљњјљјјѕјњњљљїјѕѕ§їјїїтћўљzAWF:FnV(!.05543$1ћњћћњљјѕѕћїјљљњњљєјљјљјјїјјїјїїцљјўўёm,;B??AYI.345><;::їјјљјјїѕѕјјљїїјљњњљљјљјјїјїшѕјўўЎO1.0.4?JF7.99;::15јјљјјїѕєїљљјјљїјќљјјљљјљјцљњјїўўз]B++-7308:9:5<@HPјјіљјїѕїїјјљј јїљјњљњљјљљўјљљїч§ўлŒJ*(,,)*3;887;<5CјјљјјьїјѕјјљјјїјїјїјјњљјїјјљнњјјїѕєѓђєўўзzF48>>:488:408;>E\њљјљјјѕўїјјћљјјљјјїђјїјїјљјїјјїјјїїєўмзb4-:?;:077578;A@HHљјњњљјјѕєѕјљњљљїјјљ§јљјјљјљ§јњїїъ§ўФV:7@A?4).39@@:EGHGјјљњїѕѕјјљљјљјўљњњљЮњјљљњљљјјљњјљјјўўрbF;??@:5?;?BF9љјљјїїѕѕєєїјњљљјљ§ћљњњљјњњљћћњњљвјїўўэSF>:<;:?AC@;:9:?8јјљјїѕєѓєѕїїјјїїјїјјїїјјгљњњјјїїјјїјјљљјјўўцu4#*3783+0-9;;@@:OјїљљњљјїїїјљљњјљјјљљїјќљјљјјїјељјјўўЯO0;7;@>74,5>?BIјљјјњјјѕѓѓїљњњљњљјѓљјїјјїїјїїјїјјфїѕєѕўўЛ[a{SOBB742474:>;2Pљљјјїљѓэђѕјјљљћћљњљњњ§љњљљјїќјїїѕѕўзЇF,5$1:83845439BHPMћљљјљљѕяьяѕјљљњљњљњњљјјљўјљљјїјжѕїѕїўўЮj9NOGCB<@>B>9?CHG>њњћњћљїѓёѓїјљјјљњњїјљјјљјїјљљјІїѕѕїўўнwVVTMLFACB@:4Mњљљјїїєѓђєїјљљќњљњљљіјљјїљјјљљјј§љјїїш§ўбbFPLAAB2Nњљњњщљїєѓєїјњњјљїѕїїљјјљљјїјјљајїїєѕєѓєєѕўўхv?89:43-0:;>>HJC(CјљљњљљѕђѓєѕїјљјљјјљјїљњљњћњљњјјйљѕїѓѕљўЮ^>B?<9229C<:95@]F?BAFGG?CIћћ§љљїѕєѕїјњљљњњћњћћљњћћ§§ћћ§§ћћљјљјјїѕјѕѕўтцŽ^V+;AIIF?@?A::;AEћћ§ћњјїѓєјћћќљњњћћњќћљњљљќњљњјјдљїјїєєѕїўљCIPNLE>:;AEA>@?FSњњ§ћјїѓёєїљњ§ћћљљќћњњљљ§јљјјљјўєѓѓгѕєѓўљ›0;LIE<53?LYPEA@A@§ћњљљїѕєѕїљњћћњљњљјјћњњјљњњћћњїєєђнєяєѓўўЛF1?C@C@<-,9EEH<5"њћћњљїѕѕјјњњяћ§§њћњњљћњћљњћ§ћљљбїљѕїѕѕєѕѓђѓўўАBALHF;275:B?<><;8љћћљјѕѓѕљњњћћњћљљўњћћњћ§дћњјјїїјјїѕєѕјєўўЊ@WS;:1.544?>AB>B:љњњљѕяђїљњњљњјєєїљњњћањ§ћ§њњљљјѕѕїјѕїјїўўЊ;B:38.-,14<@>>9?<њћћјђыэѕљљњњљўѓЈРћјљљњњљјјљљњњЫљњњљїјїљјјѕўўФbAG<:84+2;@B<44@Fћћњїїђѓѕїјљљњљ§чžрўљћњњћўњћћ§њљњњљјЧїјєўўЊ<1<<>>557??>;?BE;ћњћјїєїјјњћњ§њўїљў§њњљњњ§ћ§ћћњћњњћћењљњјјїїѕўўŸ9?C:52.49:@:<@SeN§ћњїєђјљћ§§њћњћћђњћњћњћ§њњћћ§§ћћяљћњ§њћљћјјћўюŠ2499ы571;AFBA8[k[ћњїєѓѓѕјљљљјњћњћћњњўљћћїњљњћњљњјњњоћњљљћўї—LJG>9<:9C?<553@<74>IJ<9;"*<єёїљљћњѓљњљћњћњњљњћ§ћћњбљњјљјјљљјњњћњўўЖO5YQG>00@HGCBA>J^шяєјјљњћ§ћ§ћћњњќљњћњњћњ§ћћ§ћњњљљјљћњљјјтїўўСUEOёєїјњћћњћњћњ§§ћўљћћИ§њњћ§ћ§ћћњћћ§ћћњњјљјўўКVF;AEGEF;;ACG@;?5єїљњ§§њњћљњњћћў§§ћ§ћ§ћћњћњљљњњћњњећњљњћљјљњљўў˜:5><99:H3),?BB@AEE?:82299?BCA:59:;?CEJeћњљљњћњ§ћћњљћћс§ћ§њћњћњћњљљњљњњљњћљњљњјўўœ?4GBBя<@::<:>CCEVћњљљћњњћћ§§ћ§§њ§ћњћћѕ§њћћ§ћ§ўћћњњшљўўЃACGFCE>BHHIAFLIFB§ћ§§§њћњњўљћћљњљљњљљњњљљњљњ§§њњљјфњўў‘OLJEHF@?NVNGNQNL5ћћ§ћћњћћђњћњћћњњ§ћњњ§љњњўљјјљњљдјїљљњўўѕN;1AFFA??EIIGMMLQћћ§ћњњћњћћ§ћ§ћ§ћў§§ўћњњўљњњћћњљњњћћњићњњўўНJLmIBGQGA;@EFLLJON§ћў§§ўўћ§§ћћ§ўў§§ћћњћ§ћћњ§ћњћћўњћћсњћњњўўпpBA;FMTIFFC>::BILLћњ§ћ§ћћѓњћћўћ§ћ§ћ§њњћћљћнњљјљјљјњћњњўўр~eBB>@EBFA41.0;BEC§ћ§§љњћћ§ћ§ћћіњћњћ§ћњњљњњђћњћљњљњњљљїјїјјўъЯ[F?89?EGGB;74@FGF5§ћ§§ёћ§ћ§ћ§ћњњћљњњљћћб§њћњћћ§њћћ§ћћљјјїјљјљўўёƒUP389?E<FIIћPTљњћћђњ§њћњљљћњљјљљћћ§њћњњњљњљњњћћўњљљўур\,37?A>7:7;8?@WVYQ§§ћћљјљњљћћў§ћћњћћњљћћ§§ћјњћњњљћњћћєњћћ§ўўц]955<<нA@9:22,N\T^ћњ§ћњћћњ§њњћћњћњ§§њњћљњљљћќ§ћ§ћћй§ћјњљљјљўўжO.)513:FJA:2.:J:@+њћ§ћ§ћў§ў§§ўўћћњњћњњјњњЪљњћњ§ћ§ћ§њћњћњњјљўўдI5??>::BF?44785?;њћ§њћњњјљљњљљїїјїјљљњњћћѕњљјїѕјљљјљјјўљыm@7@;CCEј?824>Lbmщ§ўћ§љћїјїјљ§њћљњјњјћљћљљићљњњћћ§њћћ§њњљћљћўўРo]A0NLC4P88:GELP]ciћћёљњѕїїјњћњ§љњјћњњДљћљњљћјњљћљњјњјњјњїљўўнbCNMQOdI-745A@JH@Qmњћњћњљљїјљљћљћњ§њ§њћћњњћњ§љњњ§љњјљљЭїњјњјњ§ўў‹SoQ]Z„i@:??IEGE4.Cћ§§ўњ§јљїљјћњ§ћћњћљ§њ§њњњћљњњћљљрњјњјњљћўўїv:LYSNTp]>.@FJHHCBEљћњњћљњїњљљ§њјњњѕјћљћњњћњљћњњЦћјњљћљћљњјљјўўНbA?;ALM[SIQLM>@E2>љћњ§њћјљљњљњљћљћљ§њћјњљћњњи§њ§њћљћњ§њћљ§љћјўўыЃtP>>BGLE:1C@BGJO]њћљљшћјљјњљћњћљ§њњљћљћљћјњјћњњо§њ§њ§љњњ§љњњўўщ]7.GIEH?84CFHCAEIњњфћљћљњјњљћљћљњјњљћљћњњљћљћљћњњЫ§њћљњљњїљјўўр„UFPMJCLGGVљћњћћ§њјљљіњ§§ћћњ§њ§њњкћњћњ§њћљњњћњ§љћљћљњљўўгU\dC5OOTJMFMNSOOў[њњљїљјњћўњ§њњФ§љћљћљћљћљњјћјњјњљћјњљћїўўЧn}”g`UEMICC@AFFNC`њ§њћљћјїђѕїћњ§њњћќњўњћћа§њњљћјњјњјљїљѕўўЖS;A49PCMHG?JCEOTb]§ћњњљњїїѓїїњћћРўћўњњљњљћњ§њ§њћљћјњљњљ§їљїўўзuP^eVYSYSWLHEOSYUFћўћ§ћ§јїєїјћљћљњћћі§њ§њ§љћљ§њњŠ§љћљћљћјњїљїўўщŠgia]]TPUUYNGMVOPAњ§§ћњћѕѕѓјїћњ§ћњљћљ§њ§њћћў§§ћ§§ў§ўћњљћјљїєѓўўп{h\NNTLLHJJMBJMYYAњ§њћљњѕѕёѕїњљ§ћўћ§њ§ћћѓ§ћ§њћћ§ћћњћњћћзљњїјѕўўЧeVijTQLIFHLMMLTUB[њ§њћљњјјѕјјћњ§њњћўўњњд§љћљ§њљњњљћљћјњјљїјїўўзnQd[I\JLGLHPCOWO;\њўћћо§јјїјј§ћћњњљњљљњљљњљћљћљћљњњћљјїѕєєшјѓўўэƒP@JGE9:CAJIPYTP7Lњњєўћ§їљїјїњћ§њњЧ§њ§љћљњњћњћћ§ћљљјђѓѓѕщїўбiMPMBE;FENQOHPSMF:ћћљћљћѕњєљљњњћћњѓ§љњјњљћљћјљѕјјђиѓєђљўп‚P<5@E8C5IQOLSNII^ћ§ћћњћїљјњљћњ§њћћ§њћњњТћњ§њћњўњјїѕяяэєѕѓюєѓўўё’^JLEGMk[QVTIPWTN\§§ћћњњљјїљњћњ§њћћўћ§ћћеў§ўћў§ўћћљљїљїјїєюэѓўћй‹g[?HTP\YNNOMQJUOWћ§§ћї§ѕћ§§ћРњ§ћ§ћў§ўћ§њ§њ§њ§њљњњљјєјђєяѕјѓ•LVe[]TPJQQTOMOOPcћў§§њњїјјњњ§§ўћњњћўўћће§њ§љћљљјјљєёѓёяьэёяјэ–9IZUQHMIMY`ZOSOOP§§ћњњъјљїљћ§ћўћћњўњ§ћћњўњћњћћФњљђюьяьчыээыўўОJ:PLZJPH<9OMOSPL8§§ћћњњїљљ§њ§§ўћў§ћћ§њўћ§ћћњ§§ћУљјэшьяђѓяѓэь§ўЗLQ]SWJIJ>INGMILELћ§ћћљљїљњћћўћ§ћћњ§њћћ§ћ§њ§§ў§§дћљћєєѕјѕѕђѕѓѕўўВJhbFG@IAGHIIPHQHIњћњњїєѕњћ§ћћіїјј§ћћ§§ћ§§гў§§њљєљѓїєѕѕљїјўўДLOJ?I?EFNJLIELTJPћ§ћћѕѓѕљљћћГњћўїАЦћћњ§њћњ§љћњ§њўњћњњљњїњљћјјўўЩnPUOLBFLMJOIMHOPZћ§њћїљїљјљњ§њ§ўяЅыўћћ§ћћ§§јћ§ћўћўћњњкљћјљєёљѕЈL2PJQMPCLHMFIMOME§§ћћѕјїћњўћ§§ќўћњўўєћ§ћ§§ў§ўћ§ћ§§Сћ§ћ§њћјњєђюћЂCEQHCGFBHHMJHTapa§ўњњјљјњћў§§ћўћ§ћ§ћ§ћ§ћ§ћўћў§ў§§ћћ§ћхјўўщ…<;HJFHGOQSUHF?k|iћћљјїїўћњњћњў§§ћўћћњ§ћўћ§ћћжўњўћћњћњћћ§јўўё[Z[HMMLJQ[\IIFvŠuњњљљїњљњћћ§іћ§ћ§њ§ћ§ћ§§ћћ§§ў§§јњўћ§њћњўўц>JZHMEEGMTPHGATt~љљјћљњљ§§ѕћў§ў§§ћ§ћ§ћћњ§ћ§ћ§ћћњљ§ћћњћњћћўњўўъе`JNQN@HOWZTMFA32Gјљјњњћэў§ћњ§њћћ§ћ§њћ§ў§§ћ§§ћњћњ§њњиўћћўўРbLp`ZNNQW[ZISSJPtёѕјћљњћ§§ў§ўћўћўћћћ§њўћ§§ЗћўћўћўћўњћњћћњњћљњўўЩmNN^\]U;GPUMLUTZbыєѕњњћњћћ§ћ§§ўћћњћњћћ§§ў§§ћ§§ўћ§ћ§ћћг§њњљљўўй{>@[kb`:JFOANNTM]єјњћћ§ћ§ћўћ§§ў§§ћћњ§§§ћў§§вў§ў§ўћ§ћў§ў§ћћ§њ§ўўФgTYWYUYUOGITPNPJJїћњ§§ў§§ћћ§ўћўўы§ў§ў§ў§§ћ§ћ§ћћ§§ћў§§ћћуњљ§њћўўЄNBSSWGLYM7IHOUOESљћ§ўўш§ў§§ћ§њћњ§ћўћ§§ћњћњўњ§њ§§оћ§ћўћ§њћљњњ§ўўА[U\YZVWPG:GGUZ[a‰ћ§§іњ§њ§њ§ћўњћћє§ћўћћњћњћћўћћћ§ћ§ћ§§вћ§њ§њћўў–OLNZ]WYUPMINPZa`uћћњ§њ§љ§ћ§ўў§ўћўћ§ћ§§їћ§ћ§ћћњўћћрўћ§њћњћњљўўЇLHZUTMQOTJMHSSWUaћўћћ§ќў§ў§§Эћ§ћўћ§§ў§§ћў§ў§ўћ§њћњћћњўўВN\Z[d[YV\^PLTYUUP§ў§ў§§ћћўў§§іўћ§ћўћ§њњћћњњћњћћ§§јћњњ§љћљўўцЁab^YUSWU`c[YTbd[Gћў§ўћ§ћ§§ўў§§щћњћњўћњљћљ§њћњћњ§љћњ§њўўщ‘^LAWVZZPMYZQ[``MUўў§ў§§ўњ§ў§ў§ўўћ§ў§ўћћ§§ћ§ћћпўћўћ§ћћ§§њўўС]Yƒ\Oa[VPUTUW\\WPQ§ўўў§ўў§§ў§§ў§єћ§ћ§ћ§ћћ§§ћ§§сћ§ћ§ћ§ћ§њўўя}SQL\d[WUMVQNNPSVW§§їў§ўћ§ћў§ўўѕ§ў§ў§ўћ§ћўћћє§ћ§њћњ§љ§њ§ћћўшэ|TPOVJYTNGL;JLQZL§ў§ў§§јў§ў§ўћў§§ђў§ћћўћўњћћў§§ћћјўћњљћљњљљўтпo]M@LQWYTQMGFHUWN?§ў§ў§ў§ў§ў§§њћўћўћ§§ъћ§ћ§ћў§§ћў§ўћњљћљћњ§њўўе•heMIOHMTQSQMMTSOG§ў§ўћўћў§§ћ§ћў§ў§ў§ўћ§§ў§§Щў§ўћўћћљњјћњ§њўўщtINTLPPVSNJMPNOZduћў§§њ§§ў§§ћћњ§њћћ§ћ§§јў§§ћ§ћ§ћћл§ћўћ§ћћњ§љўўс`9JWVUQNSVQNOPTW`eћ§§ўћ§§§ћўћћС§њ§њњћ§ћ§ћўћ§ћўћћљћћўћўћў§ўњ§њўўьi8:OMLIECGIIHS]gie§ўћ§ћ§њћћ§ћ§§ўћ§§єћ§§ћћў§ў§ўћ§§ћл§ћ§ћ§ћ§ћўўѓhGFTEPJQLMGMB@\d\kћ§§ў§§ћ§§ўћ§§љў§§ћћњћћ§зў§ўћ§ћ§ћ§њ§њћљўўрZ;@?>CEPQSIB<>POG4§ў§ў§ўўх§ў§ўћ§ћ§ћ§ћ§њћњўћ§ћў§ў§ў§§ћћтўћњљўўнWBQQIJILVVLCmЈОЎЁЅЉЂЂЉЌДЊЄ™Š••ЂВКАЈЅНФЫЩЯкрмкздЪШШЦШРНЦСЛМРКРШФУМВЏЏЊЇЎРЫЪ>YŠЕЗŸ—œ››˜˜ЊЉ™œœОЪрюлеЧЫЫЩбжзлЯСС€#ЛИНЧЮЭРТРЗБВБЎЏДКЋŸŸЏКЛУФУТЪ.j˜™˜’Ž–žЁ•ЎЭЯсяцлкрпкдздгсшхзФКБЕСЪРФЦЪУДЏЕЕЖЛЗДЏЕМВЇŸŸЇЁЌДДЕ0C‹ИЗЖЊБЛИЛЯкребзмрсмегЭЫФУЮлзгЩЭпснжЪШдгЏЂЂАУЩЦЧРНРЗДЖБЁИЩТИДЗНILЭЭгйлбЪЦЫЪЩУШЫЫЪЪЭЮЮШЦЭжйдЫОЛОУЪЩСЛЪзСЉЁ˜ЂЦЭСАЅЁЌТЪТСбплбРЗДIQБюьсплзаемлаФУЩШЩЪЭаЮЭаЦУЪЦОЛКММЗЕЎЌЋБЏЌœœЎНЦЩТЖЌЋВИКИИРЦЧУМВЖ8HИєрзмм€впнгЧШЫЫЯЮЭЫЩФЫУРИЕОСЛВЏЏНОЗЊЈАЌЃЈЎВСШУЌЋБУШЩТИЋЄЅЋЏЅЇL`ВуЪЫадлзбЧНФЮазннждйкгЪЧЭЮРОФЩОБЃЅЏДБНЦЛИЏВЭддШДАЖОКИАЖЖДДМКСФMZВгЭЪШШЮййзЭЮжйетцпдЯЯЭТЛКНСЦЮЯЗЈЈЊАКЩЮбмпдШЪемжОБИРБЋЏБЖСЪЪЫЭЧBnЏлпбЩЫЯдлйдбЮЭЭжгЭгйззЯЛДКФЮЪУМВЊВЗЦхЯЄЄаЪМблжЮМЗЕЇЁАИЧОИМФЦЩЭ4bФЯаЯгнтнжгдммеЭЫЯЪЪЧЦЗЌДКРИЛФееЪТФЭгхйЃxЉЪЩдкздЮЮЧЧТШжлннбдбРО+eЯыцккгЫШЧФЭжгЯЮЪЮЯЧТКЕЌЎЗЩажаЩЭШУЧТКАИВЄАЖУЭгзЯЧТЯгкптмлжжЦДЗASРзЫдеЯалеЯЫЭгдаЯкйЯбЭЪЩЦЦМамлжТИМКЕМЭтЭЅŸЗакнжкжзнмблпеШТЦСЗРФNbКшѓпнзйпдЭдрчшназмлдесьЫЗДОШжМЂ˜ЃЋНЫабЧФЦЯлЮаЮейлпЯУЧРКЖНФФЗОУ;S–РЪРТЦШекзгжййЯЦЦСРМУСЇЂЃАИМЏЅžЉКЦЩггЪШШУСЦШЫЭддЭУШЦКДМУТЦЩРЗ$>ЄыькгеенлйрупгУНОФМЕЕКЏЇЄЂЋНОЖАЏДЦФЭйжаЧМИЗОЩЧШЯбЩОЗЏЋЕКОУЪЛЊБ3@ЖєэпслкпсчнаНБЋЈЉЇЎНОИИОФССЧЯЪгнегднчцзЪбЪНОЫЫФНСТСКЌ›ЉВШФОККТ48ЋјѓллдЭзлкЪЗЉЊВЏЉЉДОФЪФЧЩЪШОКБУЭемкнлгСВШлйаЫШЩШЭЫШЮТНЖФЪЩЧЛОФ++ŠїцзкЪНТСТФМБЏЕУСКФЭкзгЫШУУИАВУЯЭШЫЫЮФИБКШаЮЭЦЪЫШЦРТСРРОФЪЭЭЮЦC9ŒщреЧОЛОЕДЏЕЕМЧЮгжмпслбЧЧбдЮШЫЫЧТШШСЛВЋЌЛжмрпкдРНЖФбгзкйслгдкд4&bЯпКДЖРМЅЇЏДВЗФЯптзЭЧЩЪагЫЭЪЧШЯдзЫЩЩЛББАЗЪйкзаШСЦФЮзддздедтхрп&eИетЭЗКРЊЃЄДУЫЭжснбЯЯгЧТОШдЮЫШЮаЧЮбЮаСОЦТЧдрслгЭгЫгздббжкаЭЭат7BaйрЩШНЕЛОТТЯстжЩШШЮгЭОЕБИВВИЩЯбЪдлнйдЪШЩЯбйннеабжкаЮЭлщцрбЧФЩе8bщюшЖЎннЫЦТУРЧЫЫбйЩЖБЌБШйртдШдкЮДЈЕВЊВБИЦЦЩЧгЯМЕЕœ™—ЄЕАЗУОФгШOOrкѓђщцрнеЭЦКСЮЫФСОНТНВЖдчунеЮЧЦЗЂЁЄЏБДДВЖРЗЌЛНААЏЃЄАЕЉЄŸЂЕЛРАЄ08iЮыырплнсутйзЯРООЗРЧШМЪЮееЫНЏЊЊЋЊ›Ђœ–ЅАБЎЅ˜”ЃЃЏ€ЗЗББЎžЋБЕЗЌЉЈEJˆыяйгаФЛЕЕЦОМЗММЕАЗЧйррлзЩНККЏДЌЂЇЇЃ˜ЉБМШСВžŸЃЏЌЏЏИОФСВОЩдЩММУj:dэыУЛЎЏБЎЋЃЇКШЭЮСБМЮззйдЭЗЈЏЏЎxFgЇЄЗДРШЖЖЏЖВТЫгежЯЫЫЭебаззсхV>}юьИr”ЉЃЎДИОСШаШЛТгрслеЩЏЃЋБгрчкктЫтыкйккжбШбзжззблсрнрлЯентнbG‰ЯЯЗ—‘’‚›РйспдЭЯЦСТЮббКагЮйдЭЯЮЪМАБИТЪЯмусцкЯЫЪЧЭЫШСМЗРРКРжпегIT‘ТЕ‘Ž˜–ЄЪуссйдггабЩЦУЖАВАНгЯЩЩІЧЭТИЗЛЪжмчсупжгдааЫФСНЗКИКФШШЩО?JŽюыУССЎДбщчуупнкаУСМБЊЏИЛШгзлгЯеенллгкцьхрраЩУШЩТЛЧЯадждбб€олмм>I„мбЧЧЪеущщхмзкмпмлзФИВКССанмЮШЯзЭШШЯанурутрсхмпдУУОТбйЯФЫЪЪИœ‘58tжьсЯгзрсукЪЦУСФжйгЪУЧШУЦкмгелнккзаЭЭйннбЮжЭЯажЦЉЇБНЦЧМЊЌЏЎЊЂ;0bДДЏОЯсцхтзФЗЖОЪбЩЧЪгмсмжпрдеккдпмбТМОйжгЩЕЌЎЋЊЋФНЫЯбЩЖЈŸЈЈИОЇ,4ŒК›АйлнзжЯЩОЛСНЧШУЦЭкмцышшп€ бТЩУИЕСлрэцРЈЈКЎЏЕТИЋЊЉЌЗЛУмпзлЫ-?гЫкснжеаЫУОАЅЉДКРКЦЧУгешйЩасцуйагЦЛЖЖНДž‰—ЃЌЕФЪНВЏЏВСЛЧажбЯай8PЅяыжкдЯУНЩбзЩЕЌНЧЛТЯЭЧСЦСЎЅŸажгЭЧЯШОЪТЛАœ™›АОЯжбОЉЗМФЛВНСФгмЯОOHЊюржлжйЭЧЭЭЦЗЎБНОМЮзЪСЫЯЮОЛТЯжлеЮзгШРНЭУДВНылжураЅЃž™ЂЎОаЫаЭНОJdТљєрунзммххндФОЛУЪЧНЗЈЎЏЌАИАВЗНМНЛЎЎЋЊЊТЪЮЦСРЛЗЭжЮРЖИЕИЦбеЩУНД)0цщкпзУЛОЭЯФТЛЎКЯЫНДНИЋЌАУЯджЯЯФДЅŸЅБОФСЎЁ›ЈДВЂЊДРНТЫЪЧЩдЭОЖА)5ЕёкКЕЋЇЌКМТССКЗФСТЧЧЪгШЛЪддШШУЖЇœ™žЊЌЦШРЕЃЌ…„ИпЫЛШЫзнтлзлйШНИФ9ЌюцТМОБЎЈЈВДКШеаССЦЖЎБЦФРННЕБЕЩНЄЈЛЧЭгкнзЪйзйѓїзЩалжезеРШЩЩТКН.O›СДЏДАЈЄЇЋЖДЈЎЕМУЛМНФЧабЭЧМЗЛФЫУайждбЩТЮслЮзслЭамкебЩЯййаДНРЭс;M’ЂœЕНЏЌДМЛКЖЗЖЛнзглсгШШЮлнеЮЫУУЧЮкклнзЮбЧМШШОЧентпмггйппкаЮйшц@8™ЉžЎАБСЫжкбемпчычуцщпЯЯйрндЮЭЯкжелррлбдккмйдкзмсцнлййутйЮжпеТћzжўљђђвюыцуцчыююыцхсхьюычмжгадзклнртпкпјњэёкЦЩзнццунккњйззелннѕпdДўяющчшчццОчшщшусмлмнручццслккмкмппеЏФспмёїчжадзннжззкпнуцхууццTЈњњыышхусххрссŸнжкдпбдймркЭЪзлкнпхёнФУЫЯЧкпплжждежеегжзрщчшхрртGЁљўюуупнмннпмнкжаШФЦЫааЯЮЫЫаемрттчяуФЧЧЯджйсспмжж‚Яаанхцчсплннп:oлюцмжгдгзйрнкгЮЩЦНЫныздбгдгейзмсцшыЯОеёщженучурлйжддптхцпнккпхTkЪукждаЭЪбйрхтнЯЭЪСсћмжабгбаЮЭбймхёянйуѓюйчыюыщххвускщьэыцтхчшш@]ЛзмагЯЭЯгкнрпжаджлѓкеЭЩаймзЪжншшСєѓєёяюээьыююьёёююььюэюэщшшчьB]ОнбееджйнрсйгЪЪЭжлнмйзжнчятсїњћўєєђѕєёьщщшшыьэяяёё™яэюьчцуучыьJЪёцнлккезмртмгЭТЪЯгхщселщыыэђѓёђђёээыхпмхчхчышуццщющшшщшщьэююђJmЕцщжзгзегзкпЭЮЮгшёї§яэёяёєєёѓяэьыээыыхрмхшщщкшчцущшхннпрцчыьэя3B”гдгаЯдггШлѓєњў§їѕѓѓЦђёяёђєѓёюыыюяюяюьскрхчщьщщцщышсрмнрсццшыьEZЏщщцлнцтхѓѕїюяёёјяёёяюэяѓѓћюяээѓѓчєѓыщазкншыёыщцучщцсжьѕьэьь№[UКїїєэьюяяюёяяююмёюяяёёяяюёээьыэёьчхшѓнТЮгЪзшщчсмлпцшшчыяёююээW`ЪўўђѓѓёёђёђёёээююєяюяёююяьэыышшымштсзбЧбмцэыэщумнушыщшцшшццшхƒўўљяёѓєђэышучыяяђђёєєђѓєѓѓїїјєѓёёзєђѓђьяююыщшчьюяэшхтухусхE:‚ххпшёяёяэьщщьююќэюѓјјКљїєѕѓѓёђяёюььѓёєёэььшссычющыщчцстхышщу4;Ќюгпєяяьшццшчцьэяюыяёєєѓїїєєѕѓѓю€чыщььёўћщхцсчшюышусхшцщюээяьѓ8HАїхэђьэщььюыцтцшэщёюёѓяђљёцэјђђёѓяяьэышрзЫпнтьююьщшшэщяяѓюёёѓё|ЭЪФеуяђёёчнЪЮднттйныѓђёђѓюшщыыцьюрдакыыхпЮШССУЧжжрцулЫУИТРЪжОEIЇгЏЪээщцррзгЭбензнппыюєјєљђђяёшнулЫгйыяўљжТНЩЦЩЯлЭНУЩЭЯзньыьшл>SЃшзюёьцхуулдУРУЭЪбдплйуэѕыесђяяыщыкдЯбЮЧИЂВЕРЯлтеЫЪЩШмжущшсцтэLdНўјцтцсмкпуынЮРакмрцрткжЯЦОДыёщцучхжпзЭЦИЖЎЦзшььзЧЭгжЭРЪЭлчьпзc^КћыуучыхкчскЭШЪжбетшлнрусдЭалцчьныхрзгрмЫФг§яюяђхКК€ЪДКФбуццсгдVvЭўўюяяюёэѕёяшргелтзЯЩУФЮШШЦЧШггаЭгЦШЦЦСдмпЮабЫУйымШЫбегрщятнкжAFЁѕђчшхжЮЫкпмйЯЦбллЭШЯЫЩЪЪмчышцрмЩНЛТЪзждФОЏИМЩШРФЮбжзшсймщтзЫа:GФўьЭЦСКТШЫЯкзЯаржмцутчмекццплзЪОДДКЫЪммкЪЖТ™™ЫятамньэђьщьэкдЯт)OМўѕзбзЯУЛКФЧЩкууеЭеЭСФггекаЩФЮлаССЭклрщяьыѓьхўўшныёщуцсежнждЩжFeАжЩЧЭЩМОНОФЦКЛТЯкгЮЭжрсьчхеаайлйпчрчтрдхяяучэяуяэьчсрчхщпЯегпюPbЇТЊЧЯШСЭгЮЫЭЫЫађычшэщруцыёышугйнпэьюыумрекспмууёюээщээяђыксяђїVL•ЋИЖНЦТгсэьшчэюѓєѓѓїёюуучђэцпцщьытчьяёшцэюьэьэчыюєєђэѓёђчуэёцкџ€љŸДСАЇЊБЏЏАЁЌЗВЌЃЅЉДМКИТНДЖРТЦбЩРИЏЌЊМЦШгнсцхцреаэяЎN507AF@:4*13.ООЗЛОИСОАžЈВБАЊЉЕЖИТМЎЊЕЖИСЪОАЊЛЛКТабЮФЭжжаЩЮзцутЂ8449::BG?*00АЗНЦЕЛФКЖБДИЪОЏМЧШРИКТБЋОЗАЖОУДЏЗЛСШЧФЧШНОЗОТЪеЫЩФo&,4**+847ЏЕШдЦООККТУУНТЦУННЕЅЇЩТУЧбгдЩШЦУеннцщыьулейдаЮгкнЛc+505<>>€б,91$ДФжзаЧЖЕДРЧНЗЛШЫЛЊœ„БрлбШЫЮйпкмхнрчююьукрмллрцчьгW+177BC<4+2::2ЖРФТИЦСЌЖКЧЧИБЕЗК™ŸФнђїыщшхтычшщснсшцумзлмЮТЦжрцєйT172.EahP1+<;AОФакЮЛЖВЗАЛЯЩЦЪЩФЫЫелмпжбрчыыэьшцттппнмЯЯдгЭЪдерщŸNH@34Q^[{I@FECНЛЩЯдЦЛИЕЛСЯааќейзбб€фЪФЩпшыщундЩМИШзжеЮЭЮлткйктяїЩT5<:EBGFA:E?>ЪбЮРИИЖТСНЦкумздШЧЦКФЪЪУСжчзЫБИИДЎЛЫЪНФглупкхщьѕјУG27?58>C8<9;<8пунЮЯйрскЦФЪЫЧШЦЫелгШЦЛКЗББЉЌВЗРРЮбТЗЖСетыяёщщьїјЮL-3CCGF>998ММЗКНФатрзСЎЋЂЅЖЪЧЪЫемннснЪРИОЦОЧТРУЩЪЭанрмкйдЩдюД5135?ЛФКЎЅЂЂЃРЧОЗЏЉЊЗЦФНЗИЛФебЧСЛСКФЧЧЦЯгкеЫжкзеЯЭгЯРЫ‰>9:@C:72.09FЗЎЄЅЇЖИЗМРЯдЧБЌЕРРЧЩЛИТабНКСзкагеЦОЩЫЪУНТНМНЧЫакшЅ<09:+2885-"&!2<;CЦЭШРРТОЦЩСБУадОВРФЧЪФШглтЭФаждЪЮОУббЫЦЮррч€ѓнптспЌ<5532>;,+.9@:)ИМШЦЯгЫЪЭЩРЪЦКЛЧЧЫдзЦЦЪкрйтмгУОУЧЮйлбЧЪмнкЮдЮгйетЪY4;AB:3),2529ТУЧРЦЩЫЪЮЭЭШЧНТСРЫЭЯШЭгбзуйЮСТжблттзЮгЫЮаЪСЭдждлюЩT+AC?A:&##%-:4ЯегРДЌЊКИИЗВБЧЧЮжмсретпгзЫЭжаЭЭжузжаЩШЫаеЦУЩЮСРЗОАY(8;<-.%3--5<<ОЦЫЧЩЪЪУУРФННЦЭелутлблкаагФЩЪЪжнкйжЧЪЫЭЛРФМКИРЪФЦЭj#)40%5-4*$+54зннЭТЫжлнркбедмслкедзгаНЕНЕЕНФШЮдЭМЖЛОФбеЪСКЗШУБДЂ^0:>;:?HC-318%кзжгЭЮмучцхлсрндагеггРЕБЖМЦМЛМЕЏЖНКАВФЪЦМТЛНСЦУДЉЂ|8;",4@GB;1-.(цтжзЮЯемуртлсхмзкссмбЮТДАТЭФШТЩЩЧУОУСЭЮЪЪШФШЮФООАЕ43<5*18:21498чычзЯзплбЯзмрйЯаклпцргЫФУШружЛСС€sЩЭжбдбкдЮТРЩЧОЌЏЗЊ>:587728;>>CHннлкЫЩдцэьёэьышрзжКАсрНглйдЩОЛРЕЖЕКбдЧИЖЖЕИИЛЧСТЪпмW-320-3:AF:AздехптшчсхчхтжебеЖh{ЭЪЧТРРОЛЕНРТЕДЇЏРСРЗМЦРТТФИЕЕШЕW4,.(>E<>4;;ЧУЛУдлЯТНЖЦаЯОРШадЮЪМЛЦЩФЮзлнбЩЫТйсхлЫЪЦФРЧШКЕКУТЏЉ~>82218@><<>:гбСЩдзЫНРЧЮкЪЋКСЛСРШШ€cЛЌЛйеФФСЧЭРЭйаНаеЫЭаШМНДСЗРгй—E#(,<7&+ЦАЋЅЅžЊАŸЉЖаОЋЎДААИЦМЏРЪкдЫШЦТМТЦФНКЖВЦСаЫбУКТШЫЩБk7"$74>474%ЯЎРООРМЃЇ—‘—ЕКЖЌЌЕУЧРЛМЦШЪЦУФРЗВЖДЛУТККРаУШЮЮЫгажяјшЏC>#5%:?@84(ИВДЏБЕИЋЎŸ›ЇВЏФЭСЉИЦКВСдЫЌЇЛЪЛЕЛбжрпцлЫйпйжнттчшункؘ?EBHH€ЩJGLE&ЈЎАРбтхЩАЗЈЗбФбаМЏНОИМСаОЖМКДЗРЧЮЯгблЯЭладжблхццнЮрт—1!88591299БВЉАСгеЫНРШРНУаМЊРебФУажйеУЖИКСеЮЭФЪЭкрумщэшяыэяёуыцД[INE<93.09;СМЦкдЭЯШФЫедбдЫФНЧЪТИВВЖНКИУЦШЮЩЮжрхццьшчшшюёшыёьѕэча{E"0CF@:?BFтрсттсскдебЯСРйзбаТДЌБВДЏАЄЉ‘–ŒЛпзнртсцнхцчшышщцущстЋM5GMLFBC>>ЯекЯТОФЛОТТССйтмжеЩЌЎНШНЕИЖКВœЂЇЩШсхлзтршыэчкнучммбФШБB,7EFHGC9ЩЧгЧЗЛЪЭЫбЫМФЯдУЧЦЦИМахуШШУОЖОТмпмппаЯнмхрлзаЪЯгЮкзеЫУzN:)9>есргйЮМТеЧТбазйнзгЮЯбТЧЪйджкдТСЫНайкЩЩЦУгзтхшчццзтрсМЦжШO)99F?1AсхцхмЩЧТУСЩеЪжстлЮНКУМТСЩаа€ЯЩЛЗКЏРжЦЗВЗКСбСдщшшцжзеЪТэкQ#9BB?CBЫЮббЭНЫггЧбцхзТОаШИЕБАМСанрсркеКЃКдаЮУЦЮЧШТЗЩушпгЮпяУЛьѓ‡8:<@4INМРСТУОЦШЭалкдаЖМдЩКДЗНМЭЧбрмзаЦТАЌБРЪбЭзекммнцунххыѕбЗбш›0;>B8w”ЎЖЖТСФЖМУОМВБТанаФКЕЖЫЯжЗВДДЈŸАЗЛРИЉЌЕУМЛЖЮмзхцчцяѕЫКэѓЋLE>:(-IОШЮагабЛИВИКЕЎАЗМТИЧРФЦОЊЁЇЏЄ›ЊМЫйЮЖЛЫЩрменшэушёёяњцЇејЁB8G8@B:жзлсмзЯЭЧедЩЖААВЖФЗадЯЪЪзЪЖННЎДжЯбйЭЩаЫФТгйсмллсшцшђсОйјЖHEb@<;GЮЫЫгБВЃЁ—ЩемЧЖЖИЛЌЛЯгУЩШФЖБЛРКЛажЩФФаЧЪгдЩаЩЪУгтуршљмгчїшC%*98<;пйёкОœœЕДЭчйЪЧУЕВИЕЛФТИДДЩсрчрхшрнкпсртчымЫллШуюьреЫЋЅпїчG2;:5:7цхн–ЇЕЛНУжаННЧКФгежгЮТЧбуьуЫатссЂнчээщяьтзЯмктмрмтшТЊсємI%!&3AHЦтѓлбИФбгблхзмбЪбмштнЭблсчрЯжзккжечшшцрмгдЮЭлндЮЮгйяЮЖлєбP"+,489гпууцуртцхсуучщшхтухшэщцчьщыэящччццтутшюяђѕєђёёрюўўЗP77@HLE;5589:шщьышэьыцхрхыыччъхчхчцурсттхчшутсхцщщыччйцшхчэёѕўѕЈ5,:8:BFH@<785щьэщэьыюыыщэшщэыыјщхцччцхшшЙышшцшьэыыььцусуучььыьн{,*$4.409989@<хщэьяэщшщшчцщшьэьчтрсщщыщщьщььэюяяђђуєѓђёёяяюёяѓњрq.19:B@;84??;эяяюёчхцхьщышшццсджшћћўєѓєїјїјїєѕѕсѓєѓђёёђєёяююїўш]4-72MihN70;?@ыююяІычушьыэяээёэяђєяэяѕєѕѕїєѕѓђёѓѕѓђюёѓёёяёяђјўЗV?5:7V`aƒJCCLJяёяяэщчушчьюђёђёђёяюэююяэѓѕєђюэшшјщьююяёєёёРђёњўбZ87@AFMNE1?9>Eѓђђёюшщщэюяяђєѓђѓђёѓяюьщщђјэщмщшцыьщщьяёѓђѕєѓѓ€Є§ўЩM52CяђђѓѓёёяёєєѓђёяяђёяяђюяшццсттущьёэыьшчыэѓєєѓєєѓўўаO*(8@FGGIF@4@BщышыяёєѕѕєёюышуыююђёѓђђяяэшуучщшэьыыщшщюяђѕђєѓђјўБJ>1;?FEGLE<7:;эшчцчщѓѓююэмуптчьђёёљяђѓђюэщщКыюээяяёююђєѕєѓёђђћўК558<;>B9;:5>BCэшцрнпбгцшээшстчьююьшыяэюэыььюьэяяьююОёэююьэёюыцэ”8>?EB@:517>@тпмнухшчшююэщтущюѓђэщыюээюяђяђђюьэюэёюяььтэюю§ўЗ9.958<щщыщьыышээђяяёяёяёээющчсрсрсшщьээыьыыщыцщцсушьэєїДM89789;>;8;;8:яяђёяьышьыюђђюђєяююэюьыщшщщьщыяёяяёшьыыдчшчьюьўўИ9741*,.41)2A>;яђђээшцщщыюэююяяёяююяяаюььщщыщщэяёяьэёюьђэяяььщёѓŸ44)438;;F"1;<@юёяющшччншччщыђёђяђяѓђђєяюэяьччшшьяьэьюяяђђѓѓЧяљћЎQ5!85?юёяђёёяыьэьэыьяюэьээяђѓѓєѓђёэььыьщьяяэђђцєїѕєєђњўВ@)"-(0;A<20,A;?юяюђёюёяяќёэьыыяхёэђюёюёѕѓђюяюэюёђяяёёэђђєяёёЮѕўт[:17;@:3,77875ђђюыщыэяёёьыщэьэђяѓяђђёђѓюђяђђэђѓѓСєюђяяюђюяюэѓўр\.?EHJA5025478ээььщчшцшшчтчшёяђєѕєјѓѓєёђђюёёѓѓђєђђкѓяьщюэьщэщцьжo29<8<<8-1579?ѓђёюььэюяяююФяђђєђёяѓяюяэщьшчэюэѓђюёююыюьыышщьшяёюz0158;?A;1+3>>ѓѓђяёёђєѕѕьєђєєђѓяёяююшщышььщыььэкшчэяэьюьхчцшсуаq85?8>GIF;+712ѕѓђёђђёєѕѕљїѕѕђђєѓѓгђёыцчэьэшушшыьычщыююёьэчыщцутй‘>5*24AFA:8432їїялёѓђђѓѓїѕѓєєјєѕєѕюьыэьюѓюьыщэяяэёяѓѓёююэтыячр9057ѓєѓѓёюяѓїјѕєє€ГѕѓђѓѓёєѓюэяѓёђюђэыышьэєяяыэщыюэюыхушОC3315;>?A;>CHѕѓђюђѓѕєїїѕєѕѕєяјємељњѓььяёэыщыышцшшьэыхчэюяёьыхюўђc119;??@FAB@ёёѓяѓѓђђяёђѓёѓюыясЉьѓээяюэьэыюьючшььэьюыщяььшчухђеh235@FGICAFB<ђђ€6єђђёщчыяюёяююёёлэѓяђёээђёяяђяэюёяђѓђєєѓєяюышщћўгh739ABIFI@CC<ђђёђѓђђююьяэђяяёђёэяэьэяяэёяѓёђяюёѕєѕђђюяэяьцушэљщФb*::B@ьэђяёяёєђёѓёёђщэђёєѓђьчщээёѕѓђђёєёээѓьюёюяюэшычыьѓњЌH+&:ANLN9597ђёюьыыящььээююяьэььяяюьчщьёяяїѓђяыэщююьюяэьюьэёёюєчЛQ&):AAЉ3$&1.юцйУУдмрцхучюьюьшшхшююэьыыђяьёюяяэяыёэяьяюэёєюёююўўнn1.7;9AB:581ьццустуутхлгпюхтуццєщчццхююёёэьшшИщшышчьщяэёыщчхчххЦn9&2>?C<8*(эучцххтчпмжЮчццуучщыщцшщьшшщюэшшчыяяююьюьяядюьююўў§ЖI:%5%BJH09%шчшьщьэхугзрчуюэьэшшщщэьщщюшчыьяэђёѓђюѓяяёђђѓѓЋђёыг™@G?JMMNJCF+хцшщюёёєкпцшѕююьччщээюђюяюыышшьяђђюющёђэѓђђѕєѓїєђцюы”3??8353:4чхчыььщ€ьяђђьыэыэюяюьююээюшщёэѓёѓёєђєѓјєїїєѕїїѕїљщБUGQF>909;:AёђђюєѕђѓѓђёђяэяёђяюышчхцшыышщшщэяђєѕїїѓїјїїѕѕїѕєїјїыЭxA!,EIBECBGїїѕђёёђёяюяюёєђєїђящьщыцшшйрУКСОщїѕїѕїїєљѕјїїѕїєєђѓхмЌG3IHLJICC5ѕѓѓЏёяьяэюыьђяёђѓёэыыююяющшцтдймюђђѓєѕєїєїєђѕѓєђєёщйгВF%57GGJE<юёщщюяюяђэюђяђяђяюэяёёђюєюэыыэєљ§єѕѓєєШјїѕѓёююяѓїђїёуТvH4+1@GLI@юхцухьэщхцыэёэьыьюяьђђѓђѕѓђяёѓєєђђїѓєѕєєѓђєѓєѓѕѕхёѓкЫЄZC-"A8жцэяђэёёђђѓїёюђяяѓђєїѕђѓѓїђѓѕѓѓђїѕїїуєјёёєђѓєђёѓььюаСк{H>BBGCQMщыёёїЇєѕѕёёђѓђэђѓђёёђяѓёёїєѕєёэёєёђєёёяѕѓѓєђёэёёђяўаЌч’Y2;A@<<8ьїёѕѓђюђђёюяѓёѓєєяђёѓьэяюѓєєђђѓёёнєђђюёѕѕѓјѕєїєђїѓёюЭасЛ[7BA::CђєѓяёяэщээяяюццшэыєэђђѓѓюыьутчщљјђёяяьёяѓяђяёяѓѕєєѓћшЛмўМE@^E>@CђєѕёшмхугэєёёяэюыяьэюѓюьчьяюьюђёђєѕѕюђђЧѓюђёђєѕјјћўнкёўь>"0778@ѕїўѕцрухюёёѕєёююяяђђяяюыёђѓѕѓєѓєїѕѕФјїјјїєјёѓљђѕјїѓрДЌэўы@0>5;ACєѓєЯЮучьхђђєѕђыюёѓѕѓѓђѓђїјѕђѕєєѕѕђљјїїјїїѕѓѕѓѕѓєємјїЦЏёўэM%!:?HMѕђўљїэьюёєєѓјєѕєѓєєїђѓѓыѕђёѓяяђѓєјѕїјєєђєяђѓђђёѓєўуШьўсT.9;A;€$ЖЦаШОНШШЧРМЦЭЯЪУНОУЮШбЫббжзммцлЮУРТФЮзкуьѓїјђяшцўўР]@BMYaVNLNOPSгжааежбдУЕЕФЩЭЩФЧЪЦЪгаУТШЩЪдйеССЭЯЫапрмджштрлншјїїА@3CMVT^\SPLIMЫагйЫдйеЯЫЫжмжЭймкдЮЯаФОЩЮФЩамЯЩЧЪдкгдзкЯЮЩЯгсхллгu84,BLEFNPJMPTФЮжцклжбЯжжгажзкеЯФЛМгЮЯдууржлелпхьяяѓѓђчшщштрпыьЫt4AGUVV\WYUQPSьєяшчыяяыржурйжкншщупсжбЯЪУСТЩЭелннжаЭзчяѕєїјјѕўўнW;9PUaW\`aTUU`еззтщящёєюыьуЮФЦрщычмттумгЧФЧЯЭекппмЯЯгпщѓэђѓѕёјљЗVTBGTW[]]ZQTMQеЯЩЯЯетђюхдШРМРЭсусцшёэёюэмдбжпмнмбжйрсчюѓюыыцтѓўУFEGJOUPSNNYOTVЮкЫУККДЗблййЧЛОЫклдаЭапьтйгдлгдлркрцщумцьшхурщтжт™"-JMPVVWPPSPObЯФИКСгЮЫЯкптдШЦамтусгЮзшхдЯзщюччхегсмрйейзбзнххѓўРJBGEJSQSLEMGOPСФСЮЯгЭбдршьтбЯпыёяыктххсктыэёпнсшыючрйгбйбШЪйкыюР\J>@HOWZTLQJNLгЫапжаЭЮжхццчссччпутдгЪШТФЫддуцредерплЪаЧЦМУдеессЌUC<@GMQPOLLQLOйнппнжЯгдпкксшшхшхшьцпзгзжбЭЯлнхэхЭЧУЮЭбЭЫШжкнхўўНAH>9>MMOICLPP€жтцщысбЯаггдмпчучсурпнтйзбЯгпкЯЯйшяьцезсщнсмнупечцЁ@C:8>LOSV:ESQWсыэчбЪФФЭйнйажзрхынлрьцхснйпмЭСЫгзммдннмлчьђёытёэЋV<4?EZY]ZVPVPUкуплмлпйЭЯкейжмцшубкшэяѕяыччхрмржбднущсцэѓёѕѓѓюћљИI83:HVSSOHGMNbйжжддхщтзрхчсчщщнжЦбЯддейхрхьэттхпншющсююїѕїђююњўУ:AQELTNSIOHLFCееЯЯ§зхььрпнпщяштткЮЮпмпберцчштрЫдуюэяьђєїї€эёѓўўкF7IGEJSHEELUZWкзйрлзазгаФЭпцгЩкпнтмсэђюскюэыупаечюрнуэёѕѓєьѓёѕїНCE@BCLPILJYUOTЮмклцчмуцрЭмзгамуухылпмшяёяячйгеенхыцлмщэёхычхяэђсeFBMLSHGHHEIGзнгзйнрчрхмзжгджепучпнхщыячхззчщэђяюхчттннкушштэўкc7JOUWQM@GENHSхчсеЧТШЫЪЮЭФЩллхэёёђюяющурншшхпёяящхттпхупкттддћЫТi8CCЬVJHLIGAJNклмжлсулжслджклцьђюышэшрпрдйймшяшщылжнплейдд€Ёгрмдс|99H?PLQIMEGFHьёьцкцщьяѓёууьюёээьшшщтгШеЮЯЯйрушхзЩалмцттббЫндЦЦКuJOPONOHNSёѕёыцшьяьыьююьурьэёђђяхнжрэђыежгзймууыцщхслкпжбУЭаКMA>?JNNMJVWQYђёшшнршђѕјѕїїљёђяыЩЩѓљмушшхпбеадЫажтшйЮЮЭгмегзеднѓєp7";IOVY^PUZSNышчёяђьчнтлтйнххсрнежррйеухтллмукмхѓёюьюьяулждлсьнВg2B@FOUVbP[SSекаечэспзЯдцуйглхыццзЯйсзшььшццькыэёылдмлкуцЯЩбзпФСˆF??IMVc\UQQWухклхщхкглпысЫЯдджлхпнЭФЮыьрммсхлтшпеуумсрмеЫЭезгэяЌP)8P^[aIPLLьчннпсйушёсмтщщ€срсшюшЯЩгмнээтцэчгШажттцучзднщпемыеЏU14EQYNC3HAEкгЛЁ™ЋОЦУЪЫЪеюхаЩЧЪЮрэщпнргрухэялжбцтсмрейшсуёшшыўљнq87HLHJUUJLCзШСКВКЗФЦММВЯхгЦУЧШЦШкЮЫйршьхткйЮжлкШбЭЭйлшцнкЧбеммСq9(1>HSYQNHGуЦЮЮЩЮаТЛДЋАЪЯШЦЧЪзкбгЮлнмезлрЮШЭЭдйезЯзхйзттхуцыўўњИQI4F?TZ\IJ@ЮЫЭЫЦЯжУУЎВЗЫШлчнЪЪгЯЫдшрЩТкйаЦжцыяюяязщьээяђђёєєѕщдЄIQSW\`dcgZFФЫФжтююуТЦНащйщчдЦайббзцеШжгЭагрусчрщуччтшычщѓѓїьрюѓœ7"CMGHPIEJЩШНУйуцнаблржлхжУкщщмлхэьщеЭЭЯжщпхммлюяѕѓѕѕїєїѕљѕјћђВaQZOPIVOVNTпнлщьщытстщщухпклррлЮЮШЪееЮмнххстыяєѕѓѓљїљїјѕїїјјћјёаƒI42L`bYU\ZєёѓєёѓюышцчпенщђьюсеШЯЩЩшЧУТЄ˜ЄŸгёьюѓєєїєєђљєїєѕђђ€1эуЗS;YT\]Z`OYуышчпзддждлйкщюђчьпЪШдкаЭдЩЭЧАВОкмюѓщщюёёєєѓэёѓѕёюудЭКN8:"EZga[cтнтжбжнпнцхрмсшлтпегеыэякпкбЯжцєєёяёунэѓёѓэштжчыыючщнЧ|[;8GY[[VZЩУЗЧзйгйЯЯгнрщнжддлусучђѓэуйейлыьэыёюёюшыщсюэђяяычцюмаДeT<5VYWUOлШбммббЮЦЯейндеучпцрущэѓѓынпяїєєёььёєљєїєѓэѓѓєђячяяњЩаЫwbdS`][QWЎЪчшзйешььчкххдбжмыѓээьыычуяђјѓѕяяѓјј”ђѓђёршьщщчйчушЮЩр‰VHMZU`\cТЫйхчсшђёэшкммнхррщььхрйпшуюяшзкрмчыуыыьхунйууцрххюўдБьœg?JUQMQSащьяёьышулркйьщхрццшруЭкшышяѓэзжсьыььюэсчѓїђђльяыяђьЪебНmC>QOVOUщёяьэчскунрххыэяьэцц€mсйущшыячтйпбсшщрценмцюјїїѓѕђђяыШеюу[-C…гѓђѕѕїјэїњћљјћјњљљћ§§љјїјљћћїњїљѕѕїњћ§§њћљћўћўўѓћў3:;588)HЉшыяѕѕєјѕїњјњњјїѕѕјѓљїљњјјїјљјљљћћјјїњћћ§ћ§њњ§§ћюњ§ћћљ§§7H72TuЦхјѕјјљћјљјћћњћљ§§ћјїљњ§§љњјјўћљљљћљљњ§њ§§шљ§§њћњ>IW[i[гј§ѕїїљњјљ§ћћљћљ§ћіљјїјљљњјљ§§ўњ§§ўф§њ§32?NLkѓїѓєєѕїїјћћљјњљћљћ§§єћјїћљћћ§њњљћћљ§ђњћјћћљћћјћљњњўўућF\[F1kїљђѕїїјњћњјїњћљњњћљњ§ћћўј§§еў§§љћљћљћљћ§§ћћљ§њ§§ћљ§ўў§§њMYQI@qюјєїїјјїѕѕїќјњљјјїњњјњјјњїї§њљўў§ћћљњ§њ§§юњ§њћљћFbZMOPЯћѕђєѕѕ§єѕїїїњѕљћћњћљ§§јљјњјћљ§ўўќ§ћљ§§§њ§ўў§фњ§§њљ(44YW\Юћљѓїїјњћћјїїѕјјљљ§њљ§њљњ§§ђњјћћјћњћјљњ§њ§§ўћўўЧћўўњљESFV][Тљћѓѕїјјћњњїїјјїјїјјћћљћћјћ§§њ§њњ§ћјјљ§§ћљ§§њљљыњў§љїјјљљћ05>CHДљћїјјѓїѕїјћљћјљљњљћћњћјњњћљјћ§§њ§љћщјћ§ў%:MdZkЭљћѕјњїњїјљљјјљшњћњћћљјјњјћљљћћ§§љ§ћљљ§ўў§фћјљ§§ћјћљљ1;PNE-јћѓѓєєѕѕєїћћљјњњљљћњњэћљћ§ћћ§§њћћњјјњљ§§јјњњјјњњљљў§ўўѓ§@@FHJ>™ћљєѕљљњјўїћћћљјћљјјэїјљ§њ§§љјњћћљњ§ћјјїїўљћћыљњљ§§њїњ1$(]\8nѕ§љїјїїљјїєѕѕїѕѕ§їјћћяљ§§љњ§ћљћљћјћњњјїїфѕїљјљћњ§љјљїћ§ў*5V@$Lё§љїѕїїњѕјјїњћћўјїїъѕњљјјљ§§њљїјњјјњјјћћјљљъћ§љ35GUTbx§ћѕјјћљљјњљјјёїћњјћ§§љћћњјєјљљўћњњ§љћ§§љўћљљэћ§њћF@B4M:Hї§њјљѕљ§§љіћњњљљјњљњ§§ѕћњ§њљљ§§њљїїљў§ћћљћ§јћљљMђJ01]eѓљљїљјјњјјћњњ§ў§§ћњњћљђћ§ћћјњїјїїјњјїї§ћљ§§њ§бћїј5!-LЮ§§љћћўљјјѕєїѕљљјјїјњљћ§§ўў§њњ§ўњ§§њўљўўрћў§§8>B?1-.%EЁ§ћљјј§§ћїїјјїїјїљћћ§њњћ§њњ§§ќўћћўў§ўяћў§;C][UM7b§§ўљїїёєјљѕїњњћћ§§ћћљћћљўћњњіћјјѕјћљљјњњћљ§ўў§§юњў732.9EBHN@Uѕћљѕїїќјћљћћјїћјњњљћћїљћћ§њњљљћћѕ§љљћљћћљљћљљ§љю.8@;:><:OOEБљ§їјјїїђњјљ§§љљћљјљћћљљѓњ§§ўў§љћљјњњћћйљћјјњљљњњљ§љ*;@BCC?ILF<–§ћїљљњљљћ§§љњњўўђњ§њўћњњ§љљјїјљљдћјљ§љјћљљћћ§њљњ§CF;BAA>GMEIћ§§ћ§љјћљћљћјњў§§ўў§§іњ§њћљњјћњ§§њўтћў§ўў§њ§<:59?@IL3"#bућїѓєїњјјњњњћљјљїјјїћ§ћћ§§ўў§§§њ§ўўњ§ћљ§§ўўхB>2>EEGIN9ExОћњєѕїјїїјљїјјњњљѕїљћљћњўўћћўў§ў§ўц§њ§њHJAAEF?4(2Ћ§ўћ§љљћљљўњўўњ§ћљћћ§њљ§љљ§§њ§§їћљљћ§§ўў§§ф?:8-$-EGE3NQŠћ§ѕїїђѓњљћ§§њ§ћћ§њћљљЬћљљњћјїјїљљ§§љњљјћ§§ўњњћћљћћV?@-(,>@H;[A§§јњїѕѕїїљїїћљњјћ§§јћљњњљљїјјжљњћјїїњћћ§ћјњљїјјљјM430:;@UGBAL™ћ§љћњњјњћјјќљћљћћќ§ўў§§эљ§ћћљћћљјєјњљљѓїјљ§§њя3,;?CBCBPaPP’љўљћћљьјѕњ§њ§§љ§§љјњљ§ћўњћўўў§ћћь§љћљњћћ§§њўћўљ§§љIHJJц;CIF!;OYШћ§љћљјїїњћїјћљћћљљѓњ§љћјњўћ§ћљњўў§Мўћ§њ§ўўњ§њ§@5JJH5BGLIT>Fйћўљљїљјњњћћјљ§§јћљљ§њ§ћћњљћњїљ§љ§њ§љѕћѕљ§§ўўё25,:97;FMSTJ…љћћјњ§ћћљњ§ўўў§ўў§ёћњњ§§ўћўћ§ћљљ§ўўьћ§љB@703#;IIB>?bЖ§§їїјїў§ўўђ§њћћљћљјјїјљљ§§ёњ§ћјћћ§§јїјћ§§њњч§.95@qLGPTQQNQ”§ћѕєєїљћћ§§фћњѕѕїѕјјїїјњљ§љњ§љјјњљљ§ўћњћћљ§њњ§§њјю?GINEH`лў§јјљњћљњљљјљёјњњљљњћњћћ§њћњћћќ§ћћњњ§ћ§њњщ§ўў§ўћ§§1AMQWbtкўўјјљјљљўјњњ§љњљљјгїјњњћњћњњћ§ћ§ћћњћћњљћћ§ћћљњљћњћњ§ћEIPHArяў§јїјљљњњљјјљњљ§ћњћћњћ§ћќњ§§ўўю>;4WqIўўћјљњњљљјљљїћњњљћћ§ћ§§ћ§§ћ§§сћ§ћў§ўћ§ћ§њћћ§§ўў§ћ§ћў§B9#?NAvўўњљћјљњјњњћљњљљњњ§ћњћћљњћћљћњћћ§њ§ўўќ§ћћњњћќњ§ћ§§№ћG?9@VWtэўѓјљњњљљїњћњњљљјљњњіћњћ§§ћ§ћћњњ§њћњњћћњњћь§ћ§§ћћHEFBMNƒўўћјїјљљ§ћљњњљњяљњњљњћњћћњћ§ўўћ§ћћ§љўњћњ§§ўўцћ§ћGNOSNU•њўјѕјјїјћњљјљћћњњ№ћњћћ§ћћњћњћћ§ћћњњћј§ћ§§ўћ§ўўћ§ўћћўў№POM@GLѕўљјјњљљњњќћњњћћ§ћцњ§ћћњљњћњћњњљјјњљљњ§ћ§ћ§§ўў>ї@A[^Кўў§њњўљњњ§љјљљјћ§§ћћљћњњўћ§§§њћњњћ§ўћ§§њћ§ћ§§ўўю§>:3?@aЫўўїљјњњљљћћ§њћњњіћ§њћњљљњћњњшћ§ћўћ§њћћў§њњ§њћњћњ§ў§ћ§§єўH?A?)LКўўѕїїјјљјјљњљњњўљњњўљњњњјљјљњћћќњћњћћ§ўћ§§ћ§§ћўўћBл?>*PЖўўїјјљїјљљњљљњљњљњњјљјљњњљњћ§ћћњњњљњњ§њ§§хћ§ћ§њћ§§њњў§ћAJ;;Y{еўўјњњ§ћћѓњћћњњћ§ћў§ћ§њњћњ§ћ§ћљњњћѕњћћ§ћ§ћ§ћ§ћћ§щњљ?BWapcтўўјљљјљњћ§њћњћћѕњћћ§ћ§ћ§ћћњњлћњљњћћњњћћ§ћ§ћ§ћ§ћ§ўў§ў§ўћ§ћ<18QPtћўїїяјљљњњћћњљћњћњ§ћ§њњќћњњ§§ћўњћћ§њїћњњ§њћ§§ўўиM[aP2rўўљјљљњљћљњљљњћљљњћ§§њћњћњ§ћ§ћўћ§ћћљњћ§њњћ§§ћ§ѕўћ§§JTZOAxўўђљћњњљњјјљљњљјњњљєњљћњљћњћ§ў§ўўпћ§ћ§ћ§њћћ§ћ§ћ§ћ§ћ§њћњJa`WJYзўљѕїјјљњћљ§ћћњњћщ§ћћњљњћћ§ўў§ўў§њћћ§ћ§ћўўќћ§ћ§§ыћ§ћA57a^Wеўўїљљњљћњњљљњћюўћ§ћ§ў§§ў§§ћ§ћ§ћћњњѓ§њњћ§ћ§ћ§ћў§ўўю§ћFUEbjZРўўїјљњњћљљњєљњ§ћњћњњ§ћћ§§ћњ§ћ§ћћќ§ћ§ћћћ§ў§ћњњћєњ<*AMEHЖўўљњњљњћіњјјњћћњћљњњљћњћћ§ћ§§§ћ§ћћњв§ў;:Tp[gйўўљњљћљћ§ћћ§§њјјљћљћњћћњљњњћћњњ§ћўћњћћ§ў§ўў§ћь§њћњћћ<;QTL-ўўїјјљјјїћњћњћњљљћћљўњћћъњ§ћ§њћљњњљћ§ћ§§њљњњљљћћўюћBEFJOBžўўїјјћћљљњњўћњњћ§њћњњўћ§§ћѕњљњћћ§ћћњњљљчјњћњћљћћ§§ў§7-d^4rћўћљњљљљњљјјљљјјўљњњћќ§ћ§ћћїњћћ§ћ§§њљљшјњћћ§§ћ§ћћњ§§0.`G$Pђўћљљіјїїљљњћњћњњљяњљћњњћ§ћ§ћћњљњњљњњў§ћћђњћћ8,FW^dxўўљњњћ§ўћњњђћљњњ§ћћњњљњћњћћўњ§§їћњћ§ћ§ћ§ћћўњћћь§њACG?N>M§ў§њћ§ћ§ћ§ћћїњ§§ћћњљћ§§§ћњ§§ћї§ћ§ћћљљјћћќњћњћћўњћћ№LPQ80[gѓўўљјњњљњњ§§ћњљљњћ§њ§њњњљњњљљњњїћљљњћћ§ћ§§чњћњBBG+HLCБўўјљљјїјљљњњћњњћљёњћњћњ§ћћњљњњљњћћќ§ћћњњ§љњћћў§ћћ№ј>??&@0AНўўјљњљњњюљњњљљњњљљћћ§ћ§ћ§ћ§§јњћњћњњћ§§їњћ§ћ§ў§ћњњ§њў§њ,+11їGI”ўўљњњљљўњљљћћњћњ§§ьћ§§ћћ§ў§ћ§њћ§§ћ§§ћћўўћтњ§њљњњћ547>4AV…§ў§љњњјјљњћћ§њћћэ§ћў§§њњћћњћњљћћњњћ§§јћ§ћ§ћ§ћ§§чћњўћ51;@0$4gѕў§љњћћњ§ћ§ћўў§ћњјњљњњћћ§§ћѕ§њћњћћ§ћ§ћўўє,0<@?HMZсўўљљќњљњљљ§њљћћћ§ћњћњњћљ§ћ§ћ§§ћћўњћћћњљљњћћы§ћ§ћ§ћ,+3>MA@BЗўўљњњљљћћњњљјјњ§§ћњњќ§ћ§ћћє§ћ§ћњњљљћћ§њњўћњњќћњњћћѓ()3-;[GN˜ўўљњњќјњјљљњћ№§ћ§њ§љћ§§њћњћћ§ћћўч§ўў§њћњћњљњћ§ўћ!!%*3gZ;tўўњўћњњєљњ§ўўћ§ћљњњљљј§љ§ћћјњљљњ§ћў§§јћ§ћ§њћњ§§№ћўў"!?HG0M9Eпўўњњўћњњєћњћћњњћњњљћњња§ћ§ћћ§§ћћњћћњ§њњ§ћ§ћ§ћ§ћўћ§ћ§ў&1:E;!4Nмўўћњћњћњњѕјљљјјњњљњљћћњ§ћ§ћў§§ћ§ўћ§§ўх§ў§ў§§ћ29?:50-!CЅўўћњ§ћ§њћњњљёњћћњћњћћ§ћ§§ћћ§§ќћ§§ўўі§ў§§ћў§ў§ўўёћGGA9-20LVrћўўћћђњљњћћљљњ§§ћ§њћћюњ§§ћћ§ћ§ў§ћ§ћ§ћ§ћ§§ъў§§ћ§ћ§ћћњIJLPG?FB0Pзўўјњљњјљњњћћћ§њћњћћњщћњ§ћ§§ћћ§ўў§ў§§њћњњћћњћћўњћћэ;AJPL]SuYL~Єћ§њљњњљљњіљ§ћћњ§њћњћћњићњ§ўў§ў§§ћ§ћ§ў§ћ§ћ§§ўћўћ??@ACdaZI9dўў§јљљќћњјљљњћ§§њћћњћўњ§§њћўњљљћќў§§ћћ§№837:?LHIUFZћў§њљљњќћњћњњїћњњљљћњњћћўњ§§ћіњћњ§ћћњћњћћўњћћў§ћћю78?B?<>ETPLДўўљњњљљћі§ћћњћ§ћњњћћ§ћћўў§ћћјњљњњћњћњњщљћћ§§ў§ћ;@BFMGFBEN<›ўўћћўљћћћ§ў§§ўў§ў§ћўњћћўњћћш§њћћњњћ§ћ§ћHEG:ABABMJN•ўўьњ§ћњњћњћњ§§ўћ§ћўћ§ћ§§ћњ§ўћ§§ў§оўћ§ћ>;8?EIMH.gщўљѕїљљњњљњљћћњјљњњѕ§њњћ§§ўћ§ћ§§§ў§ўўмћњћ§ћў§ў§ў§AB>71.1.EGAaFўўњњљјјљљјљљјјљњњ§ћ§ћћњњљјјљњњћћ§њњљљёћњ§њњљјљњњћњL5;;ёAGVMHGSŸўўћћљљњњћњѓћњњћў§§ћ§ў§њћћмњћњћњљјјњљњћћ§ћ§§@9ACBFEHPdUU˜ўў§ћњћћўњ§§Рћўћ§ћњљћћў§§ўў§ўћћњњћўњћљњњ§ћ§ўў§ўћ§ћHLNOIGHHG)8S[Яўўћњћњљљњњћњћћўњћћ§§ћњ§§ўўћћл§ўў§ўћ§ћ§§ўћ§ћўў§ћ§ћAEIQA;@JJQSCFнўўћћєњљљњњ§ћћ§§њћћщ§ћћњ§ўћљћћ§ћћ§ћћ§њ§ў§ћўўэ§ў§ўў>4757;?ISYPJ‰ўўјћњ§ћћњћ§§§ў§ўў§ўўћ§§ўњ§§ўћўўс§њћў§§ў§ў§ўў§ћH@;aМўњљљћљћљњћўћћї§њ§ћ§њ§њћћ§њў§§ћћўњћ§§іў§ў§ў§§ћў§§Яў§ўWiMHhзњўљћћ§§ћ§ћ§ћ§ћ§ћўћў§ў§ў§§ћ§§ў§§ћўћўњ§ћ§§уў§ў§ў§ўћў§ў§ћQahxtхўўћњ§њћћ§§ўћ§§ўћ§§љў§ў§ўћ§§ћюњћ§§њћ§ў§ў§ў§ў§ў§ўўсYEQjb…ўўњњјћњ§њ§ћ§ћћ§§ћ§§ў§§ћў§§ђў§§ћ§ћ§§ў§ў§ў§§ўѓ]ptdFўўћћњ§ћћэ§ћ§§ћћ§ћў§§ћ§ћ§§ў§ўў§їћўћўћ§§ў§§їў§ў§ўћ§§ўўѓ§ўemn[T„ўў§њћћњјћљњљћћ§ћћј§њћћўћўћћћўћў§ўўл§ў§ў§§ћ§§ў§ў§ў§ўў§ћ§\xuka`мў§ћњћљћћ§њњћ§іћ§њ§§ў§ў§ћћ§ў§§ў§ўўы§ў§ў§ў§§MHCrogкўўњњ§ћћј§њ§њ§ћў§§ѓў§ў§ў§ў§ў§ў§ўўќћ§ћ§§јћ§ўў§ў§ўўђ§Yte{oЪўўњљњћћњћїўћ§ћ§ћ§ћ§§їћў§ў§ў§ўћћ§њўћ§§ў§§љў§§ўўћ§§чM7PbYYСўўњњўћўћўљ§њћ§§ћћњњщ§ћ§ћћњ§§ћћўњ§§ћћў§ў§ў§ўў§ыћўћ§ћ§ћ§§ўPJdq‚щўў§ћћ§§ћ§§њћј§ћўњћћў§§љў§ў§§ћўўц§ўћў§ў§§ў§ћ§LUdg\;ўўњјћљћћћњ§ћ§ћћ§ћ§щћўћ§§ў§§ћўћўћ§§ўћ§њћћўћћ§§ћўўёMWbZbUЎўўњљњ§§ћћћўћўћ§§ћћў§§ћћ№ўћў§ў§ўћўћ§ћў§ўћћѓ§њ§њ§ћ§§ў§ў§ўўјI3@uiC‚ўўяњћњ§њћњћљ§њћљћњћ§§яћў§§ўўћў§§ћ§ћў§ћњњј§њ§ћўћў§§яћ§§ўB3?mW2b§ўўњ§њњў§њњѕ§љћљ§ћ§ћ§ћ§§ёћўњ§њћћўћ§§ў§§ћћќўћў§§§ўћ§§ў№JN[vuƒ‡ўў§њћ§§ћ§§ћ§њўћћ§іўћ§§ћњўћў§§ќў§ў§§њў§ў§ў§§яўћ§ћ§ћўў§\ZYSdT^ўўўћ§§ќў§ў§§ќў§§ћћўў§§њў§ў§ў§§ўэ§ћ§њ§§ўћ§ћ§ћ§ћ§ћўћ§§їўcgbIGv{ўў§њ§ћћќўњў§§ѓў§ў§ў§ћћў§§ћ§§ыўћўћ§њўњћћ§њ§ћў§ў§ўў§§щћўZ\W4]^VСўўњ§њњљћњћ§§ћћї§ћ§ћћњўћ§§ћ§§њ§§ўћ§§њћ§§ћћ§§ў§яQUL:QBQЮўўљњћ§ћўћћўўћћєўћў§ў§ў§ў§ў§§оў§ў§§ўў§ў§ў§ў§ў§ў§§SJGML]ZЇўўњўћ§њњ§§њћћ§ћў§ў§ўўђћў§ў§ў§§ћў§ў§ў ўяћў§§ћўћ§GEJTEUi™ўўћђљћњћћў§§ћ§§ў§ўў§§ћ§ћћўў§§ќў§ў§§ўљ§ў§ў§ў§§іўFWNPC5G~ўўї§ћ§ћ§§ў§ўўш§ўћў§ўњ§њ§њћћў§ў§ў§ўћ§ћ§§ўќ§ў§ўўнJGNZVh\rьўўњњ§њ§њ§њ§њ§њћћ§ћўћ§ћ§њћ§§чў§ў§ўћ§ћ§ћ§ћўњћћўћўћў§ў§ўўяAMNMb\QSЪўў§ћћњ§ћћѕљћљћњ§§ўћў§§јў§ўћ§§ў§§ћўў§§ћќўћћ§§сHLBHVxZbЎўў§ћўћњњћњ§њўњ§ћ§§ў§§ћћїў§§ћ§ћў§ўў§ћ§ўў§јћ§ћ§ћў§ўўі2A7>O„mN‡ўў§ћўћћћўћў§ўў§ћё§њњћ§ћ§ћ§ћўћ§§ўўќ§ў§ўў§њћ§§ў§ўўл8AQc^G`LOёўўћўћ§ћўћ§ћ§§ў§§ћћњћћ§ћ§§ў§§љў§ў§§ћ§§љў§ў§ў§ўўж§ў§ў;INUP11EYцўўћ§ћ§ћўћћњћњ§њ§њћњўћўћў§ў§ўўќ§ў§ўўј§ў§ў§ў§ўўх§ўHQNPE?A7WЗўў§ћ§ў§§ћўћўњ§ћћя§ћ§ўў§ў§ўћў§ў§ў§ўўў§ў ўѕ[^VPHEIeg‡ўўі§ћ§ћ§ћ§ћ§ћћ§їў§§ћ§§ў§ўў№§ў§ў§ў§ў§ў§ў§ў§ўўћ§ў§ў§§є[hbabYZSBcсўўѕњ§њћњћњ§§ў§§ќћ§ћ§§§ў§ўўў§ўў§љћ§§ў§ў§§оћ§ћ§N]d^`|m‰k^‘Иўўњћњћњњљћљћњћ§§ћ§§њћ§ћ§ћ§§ўє§ў§ў§ў§ў§ў§ўўєVOOY]~ti]Ftўўьњ§њ§ћўњ§њўњ§ћў§§ћ§ћ§§јў§§ћўњў§§ћ§ў§ўўў§ўўђ§ўNOFUV\]\eYiўўюњ§њ§ћ§ћ§ћ§ћўћўњўћ§§љћ§ћ§§ў§§ўћ§§ўћ§§ўћ§§мћў§ў§§ћўJQTNPQQ[eg\Оўўњћћ§њ§ћўћў§§ћ§§њћ§ћў§ўў§лћўћћњ§ћ§§ўћўћўћў§ў§§QQa\ZbV\cVJЌўўћ§ћћљ§ћў§ў§ўўў§ўў§§ў§§ђўћћ§§ћ§ћ§ћўћў§§юў§§ўўWZV`[YZ[[V]Єўў§ќћ§ћ§§ўў§ўўю§ў§ў§ўћ§њћ§ў§ў§ў§ўўў§ўўп§ўPOWT\gc\E.-xѕўњљј§ћћњћњћћ§ћ§њўћћ§§ў§ўўњ§ў§ў§ўў§ўUтNT\edaVHY’бўўњљ§ћ§њћњ§ћћњћњћћ§§њћ§ћ§ћў ўў§ўўў§ўўь§ў§ў^a[WZZbYZVaŽёўў§§ўў§§ѓћўњ§ћћљћњўњћ§§§ў§ўўў§ўўјћў§§ћ§ћўў№c`NJP]c[VG7AМўў§§ўћ§§ўћўў§ўћ§§ў§§ў§§ѓў§ў§ў§ўћ§ћ§§ўўо§ў§ў[UNJ9Ca^UEeiЂўўћњ§ћ§ћ§ћў§ў§§ћ§§ьћ§ћўћўњўћ§ћў§§ћњћ§§ўў§ўћ§§ЪdUCLHB]W\YvYЃўўћњ§љћњ§њ§њ§њћћ§§ў§ўћ§њћњ§њўћўћў§§ћ§њћћ§§ћњўњ§ћћя`IMLNV^jb]ZcВўў§ћћќўњ§ћћћ§ћ§ћ§§ќћ§§ўўѕ§ў§ў§§ћ§ћ§ћћњщ§њўћў§ў§ўUaMVb\Y[a{hhЎўўљћ§ћ§ћў§§§ў§ўў§ќњћћўўў§ўўїћ§§ўў§§ћ§§§ў§ўў§т\bij]WZ\Z:Ikjнўўћ§ћћњ§њ§ћўћ§ћ§§ўў§§ўќћ§§ўўќ§ў§ўўў§ўўў§ўўшT^]`OZ[a`bhYVэўў§ўћ§њўћ§§§ћў§§ѕў§ўћ§§ўћўћ§§ў§§ў§ўўђMLJNQNUbhpddŸўўіћ§§ўћ§ћў§ўўў§ўў§§ў§ўў§ќћў§ўўэ§ў]PMOO>V`eeH[tЪўўњњљўњўњў§ўў§ўћ§§ћњўњў§§јў§ў§ў§ў§§сўћўћ§§ў§ў§ўPOGa•c`ghggmiЋўўљћћ§§ђў§ў§§њ§љ§њћћ§ћћ§њў§ў§ўћћ§ў§љћ§§ў§ў§§џ9џ9џўˆ8џ:џ:џ:џ:џ:џ:џ:џ:џўw8џ9џ9џўˆ8џ:џ:џ:џўw8џ9џ9џ9џ9џўw7џ8џ8џўˆ7џўˆ8џ:џ:џ:џўw8џ9џ9џўw7џ8џ8џ8џ8џ8џўw6џўw4 џў€3 џўw2 џ3 џ3 џ3 џ3 џ3 џ3 џ3 џ3 џ3 џўw1 џ2 џ2 џ2 џўw0 џ1 џўˆ0 џўˆ1 џ3 џ3 џ3њ§ў§ћњћњ§ўў§ќњљ§ћћ§ў§њ§ўўћ§њњ§ўўќћўў§§їњћћїљ§§њ§§ў§ћўћћўљ§њћћњ§ўў§ћў§§эњљ§§љљћћњњ§љњўўћўћўўћњўўћўў§њўјћњ§њ§љ§ўўў§ў ўћ§ўћўўсћўўњ§ўћўўњњ§§њ§ўњ§ў§њњўўћўўћўћўўіћўћўћ§њ§ї§§ўћўўњ§§ўћ ўљ§ўћўўћўўє§љј§§ћўўћ§њўўњ§њўў§љљќћњ§ўўќћўўњњўіћ§§љ§њњўћўўњ§њњљјњњ№§ў§њўўћћўњ§ћћњ§ўў§§њћўў§§њўўњў§ўўђћўў§§њўў§§ўўћўўў§ў ўё§њўўњ§љљћљ§§њњ§§њљњ§њћўўќћўћўўюћўўњўћћў§љљњ§ўўњњљљўњ§§ўўњўўѕћњ§§ћ§§ўњњўўѓњ§њ§§ўўћўўћћўўўћўўўћўўќћњњ§§јњўў§§њњ§§љњўўћљљўўїћўўћ§ћўў§§ћњњћћ§§ўў§ћў§§ўћћўўњ§§ўљ§§ѓў§њћўњўўњ§љљ§§їњїњјјїљ§ўўўћўўўћўўїјћўћ§њ§§ўўўћўўљћўўћљљўўї§њњ§њ§њњўўёћў§§њ§§ћўћћўўћњњ§љ§ўў§ў§§њўўќњ§љ§§§ўћўў§ўю§њћўћћўћ§§њўўћў§њ§§ў§ћўњ§§ўўўћ§§ћ§ўњ§§њў§њњ§ўўѓ§њљљ§ћўўњўћћўўўћўўѓ§њ§љљњ§њ§§ћ§ўў§јњћљњњўў§§ѓњљјћ§§ћў§§љњўўєјљљ§§ћў§њњ§ўўј§њњ§љ§љ§§ъњ§ћњћћњљћћ§њ§§њ§њ§њўўљљћ§њ§§љљћ№љћљљ§ўўћўњўўћўў§§ќњћћ§§ўїћўўћўўљћ§§ђљћћљљѕљљћјјљњ§§іњ§ўўћ§§ўћўўђћ§§љљўћћўўњљњ§§ўњѕљ§њ§њјћћљћ§§љ§ўњћўўњ§ўў§§љ§§ў§љњ§§ћћ§љњљљћђљјњњћљњњћћљљ§њњќўћћўўў§ўўєњљ§§њ§ў§њњў§§ўђ§њєћћљљ§§ћљћћ§§рњ§ў§њњћўњ§њ§§ћљћ§ћ§њ§љњњўњњ§њњ§ўўі§ћћљљњћ§њ§§іњ§ўћћўћўў§§љњњ§ў§њ§§ыљўћўћњљљћљћјњћјљћћјљ§§љњўњњ§ў§§њњљњўћўљљјѕљњ§љ§њ§§јћљћљ§њњ§§цћ§§њ§§љљј§њћ§ћўћўћњ§љјјњњћћѓјљћћљ§ћўћўўћўўїњ§њў§њ§§ћћ§њћўўўћўўћўљ§§ћћљљћњњў§ўќћўњ§§ўс§љўўњћћљјїјјћјљњћўљ§§ћјјћћљњїћ§§ўљњњшљњўўћўћћў§љћљѓїѕїјћ§њ§§љљюћљњјјњљ§§ћљћљљ§ўћўў§ў§ѓў§ћњјљљјћ§ћљћћшњљћјњјњјј§§њ§љљћњњўў§њњ§§љљњњћњњ§§мњљјћњљћњљїјјљ§§њ§љћ§њњљљћљ§ў§њ§њ§љљ§§ќљћњ§§њљ§ћљљћћѓј§њњ§њњўњњљњ§§ўњ§њљљћ§§ћњљљћ§§љўјўў§юћњљ§ўўћў§§ўўњѕј§њ§§њ§њћљјћ§ўўўњ§§ѕћјћ§§њ§§њњ§§ўњ§§ўњњ§њћўњћћ§їљћћ§§ћјћћђљ§њ§§њњїїљњљњ§§ћљ§ћіљњ§њ§ўўћћўўї§њњћљјћћ§§ў§ћљ§§ўњўўјћ§њљћ§њ§§ёљјњњљћ§§њ§§ўћњ§§њ§ќў§ћўўўћўўћ§ћљљћћ§ќћљњ§§љљћ§§ўћ§§ўњ§ў§ћњ§§ўтњўў§§ћљїљљћљ§§љњїїјѕїћ§њњ§§љњ§§їљ§љћћ§§њ§§ўњљљ§ћљ§§њўћњњ§јїѕѕђєѕјјљљњјљњ§њљ§§№ћњљњ§§ўћў§§ћљјљ§§єјєјљјњњ§§љљћћљѓћљћљљћ§§њћјї§§§ўћўўўњўўћўњњјћјїћћ§ћќљјљ§§ўћ§§єћљљ§§њ§§ўўћўўо§ћњњјћљ§љћњњљћљњјњњјїљ§њ§њћљљћњљћ§§єјљћ§њўўћў§ћљљћљћ§љјћћѓљћљћљћљњїѓїѕљљћј§ћћљћљ§ўўўњўўљћўўњљљ§§љљњ§§ћћ§§ўњ§§ћ§єњ§§ѕљ§§ћїјљ§§ўћўўўћўўњ§њњ§јѕњћћўљњњѓ§њљљћљћљљ§ћј§§эћљјљ§ћўўњ§њ§§њћљћњљљјћўјїїяјљљјјћљњњјѕ§љњјјљљњћ§ўљњљљЮ§ў§§ћљ§љћј§§њ§ћјћњјїїјњћ§§ћћ§§њћјњћ§§јћ§§њ§ў§њћјљ§§њ§љљћјѕјћ§њњљњ§ћћљјљљјђњјљћ§њ§ћћљјјћ§§ћѕњјћљљјїњљћ§§љ§љ№њ§§ћћ§§ћњјјњњћњћћћїёїј§§ўћљљвћљјјљљ§ў§§љћљљћљћљћћ§§ўўћўў§§ћљљ§ћљљјћћљћћљњ§ўў§цњ§ћћњ§ћ§§ћ§њ§њ§њ§њјљљјћћљјјєїћљћћ§§ћћ§§ћћјљћ§њ§њћ§§ў§§њ§§јћ§§њјћ§ћћ§щњћљјћћјњњјћћјјїњљїјљћ§ўўўћ§§ђњћљїїјјњљћћјљ§§љ§ћќљћљћћћљњћњ§§ўїљњ§ў§ћћљ§§ўћ§§њњ§њ§њ§§ћњ§§њ§§іњўў§њўў§§њњћўќј§ў§§ћњћљњ§§ћљѕћћљљхћ§њјћ§њ§ћјљћњњјјїљћњў§љјј§њњўљ§њ§љ§њ§§ћћљњћњ§§ўў§§ћіљћњјјїјјљћћўј§§ћљњ§њўўёћўњљ§§њ§§ћљљјѕїїяњћ§њ§њњћћ§њ§њ§јћ§§іћўўњ§§љњњ§§ўњ§§њњ§ћћјљљќћ§§ўўў§ўўћњ§њњ§§ћћ§ћўў§§ћіљћњ§ўў§ћњ§§њўў§§ћљћњў§§ўќ§њњ§§љњ§§љћљћћјјњњљћ§њ§§їњ§ћњјјїєђ§єћ§§ўў§ћ§њ§ћўўў§ћћќ§ўћњњѕ§ћ§§ў§ў§§ћўўў§ўў§њћў§ў§ўў§ћћ§ћ§њњћ§ќћ§ћўўў§ўўњ§ў§ћ§ўў§§ў§ўў§№ћ§§ўћ§ћћњћ§§ћў§ўўў§ўўў§ўўў§ўўќ§ўћ§§§ў§ўў§ћ§љў§ў§ўћўўј§ў§ў§ў§ў ў§§ћўў§ўћ§§њћўћ§§ў ўў§ўўќ§ў§ўўў§ўў§јў§ћ§ћ§ћў ў§ќћ§ћў ўќ§ў§ўў§§ў§ўўћ§§ћўў§јў§ўћ§§ўћћњњ§ћў§ўўђ§ўў§§ў§ў§ћўћ§ўў§ўћ§§њћўћ§§ўў§њћњњ§ћўў§ѕћ§ўў§ўћ§ў§ўў§ўћўўі§ўћ§§ў§§ћўўљ§ў§ў§ў§§ћў§ў§ўў§ќў§§ћћћњћ§ћ§§ђћ§ћ§ћ§ћ§ўў§ў§ўўў§ўў§ўќ§ћћ§§ќў§§ћћ§њћ§ћ§ћўўў§ўўѕ§ўў§ћ§њ§ћў§§ўњ§ћ§ћ§ўўў§ўўњ§ў§ў§ўўў§ўў§іћ§ћ§§ў§§ћ§§њћ§§ў§ўўў§ўўљ§ўћў§ўћћѕ§њћљћњ§ћў§ўўќћ§ћўўъ§ў§ў§ћ§ћўћ§ћўћ§ўў§ў§§ћћј§ћ§њљњњћћўј§ў§ў§ў§ўўњў§ўћўўў§ўў§§ў§§јћ§ћ§§ў§ўўї§ў§§ћ§§ћўў§ћ§ў§ўўј§ћ§ўўћ§ўў§ћ§§ћўў§јћ§ў§ўћ§ўўњ§ўћ§§ўў§§ћ§ўў§њћў§§ћўў§ќћ§ћўў§їћў§ў§ўћ§ћћћў§ў§ўўќ§ў§ўўў§ўў§ћ§ћћ§ќћњћўўтћ§§ћћ§§ў§§ћ§ћ§§ћњћћ§ўўћћў§§ў§ўўў§ћћћ§ўўћ§§ў§юћўћўћ§ћ§ћњљњњ§ћћњ§§їћ§ћ§ћ§§ўћћќ§ћ§ћћљњћњћћ§ўўў§ўў§§ўћћљ§ўўћ§ћўўѓ§ўњћ§ћўњњћћ§ћћњњћ§ћ§ћ§§ў§§ћўўљ§ўў§ћћўўі§ў§ў§ћ§ћў§§ўў§§ўњћћќ§ћ§ћћ§§ћўў§§ћўў§ћўћћўѓ§ўћ§§ћ§ћўћћљћћєњћћњљњњћљљњћћ§ўњ§ў§ўћўўц§ўћ§§ћўћ§§ўћ§ћў§ўћ§ўњњћћ§ћћњ§§ћ§§ўў§§ў§§ћњћћ§јў§ўў§§ћ§§ў§њћіљћћ§ћ§ћ§ћўўћћ§ћ§ћћќ§ћў§§ћћ§ћ§ўўп§ћћњћњњљњњћњћњћћ§ћ§§ў§§ћўћ§ћ§§ў§ўўћі§ћ§ћўћўћ§ћћ§њћ§§їћ§ћ§њ§ћ§ћћ§ћўћў§ўўћ§ћћњ§§њѕћњ§ћњњћћў§ўўў§ўў§ўєћ§ћ§њћњ§ўў§ўўњњћ§ћ§њћћ§ўќћ§ћўўў§ўў§ыћ§ћ§ћ§ўўћў§ўљњћћњљњ§ћћў§ўў§њіћљћњ§ћ§ћў§§ћў§ў§ўўћїњћњљњљњњ§§ёћўћћњћљњњљћ§ћњћћўяћ§§ўћ§ћ§ў§њљњћћњћћяњћњћ§ћњњљњљњ§§ћ§ћћ§§ўћ§§дћ§ћљљњ§§ћ§ћ§ћњњ§ћњљјљњњћ§ћ§ћћњћ§§ћћњўћўћ§ћ§ћћ№§ћ§ћћ§§ћ§ћ§ћћ§њћћњњћњ§ћ§§јћ§§ћ§§ў§§ћєњћ§ћ§§ћћњћ§ћћєњў§ўћћњ§ћ§§ўўјћ§§ў§§ћ§§ўћ§§§ћ§ћћњ§ў§ѕћ§ћћњњ§ћ§ћ§§ќћ§ћ§§ћћ§ўў§§§ў§ўўўћњњ§ћ§њњћ§§ћ§§хћљјљћ§§ћ§ћћњћћ§ћћњњћ§ћ§ћў§ўў§љњћњћњ§ћћ§ёўњћ§ћ§§ў§ў§ўћ§ћћщ§ћ§ћ§ћћњљљћњ§ћ§ћ§ўў§§ћ§§ћјўћњў§ў§ўўѕ§ў§ў§ўћњћћњњњ§ћ§ћ§ћћч§ћ§ћћњ§ћўў§ћ§ўў§§ћ§ў§ўў§ћћў№§ўўћ§њћњћћњћ§ћћљљћїјљњ§§ыћ§ў§ћ§ћўћћњњ§ћ§ћ§ћ§§ћћѕњћћ§ћ§ћ§§ћљљ§њљјјњћюљ§ћ§ћ§ў§ћ§ћћ§ћ§ћ§ўўю§ћњћ§ћ§ћ§ћћњћњњ§§ћћњћќњћњћћ§јћњљћћ§§ўў§ўђ§ћњњћњћњ§ћ§њћњњћї§ћ§ћ§ћњћ§§ўњћћ§ўћўўя§ў§ўћћљљњћћ§ћњљљћћољњљљњњћћ§ћ§њћћњљћњ§§ћ§§ћњћ§ў§ўў§њћћўњћћљњћћњњћњњєћњћњћњћљљѕђјјљћњћ§њњћћў§ўўќ§ў§ўўг§ў§ћћ§ћ§ў§ћ§њњћ§ћ§ћ§ћ§ћћњ§ћ§ћ§§ћ§ћћњњћ§ћ§ўў§ўўў§ўў§ўћ§§њњљћњњћ§§№ћ§ћћњћњћћ§њ§§ћ§ћћѓњћћўў§§ћ§ћ§§ћћўљћћњќћњњљљќњћћњњѕћљљњ§§ћљњ§ћћњњ§§ў§ћћњ§ўћ§њћћќњ§ћ§§§њ§њњљьњљњћ§њћћ§§њњљњћ§§ћћ§§њћ§§ћ§§§ћ§ћћњћ§ћњ§њњћњћћњтћњћ§§њћћњњћћ§ћњњћљњњћћњљљћњћ§ћћу§ћћў§§ћњњ§ћћљњњљљњ§ћњњћћљњћ§ћћљњћњњћћ§§ћўњћћњќћ§§ўў§ћфњћњћњњћ§§ў§ўћ§§ћўў§ћњ§ћўћ§ћ§§ћ§њћњњєћњћњћћ§њњћ§њњ§ћњ§§ўўћћўў§§љћ§ћ§ћћ§§ћњ§њћњњћ§ћ§њћћњћљњњћњњњћљјљњћћўѓћ§ћ§њћљљњњљћњњћћ§ћ§ћћћ§њћњћћњћћљњ§ћћ§ёў§ў§§ў§ћњћћ§ћ§ћћѓ§ћ§ћ§ћ§ћ§ћ§ћ§§љћ§ћ§§ў§§ћў§§ћ§§ўэ§ћўћ§ћ§§ћћ§ћ§ћћ§њњћћ§ћь§ћњћћњњљњњћћњ§ўћћњњ§§ўљћ§ћўћ§ћћъ§њњћ§њ§ћ§ћ§ћў§§ћћњћњљњњќ§ћћњњѕ§ћ§ў§ћ§§ў§ўўё§ўў§ў§ћ§ћ§њћћњљљћљ§ћ§§ўў§§њѕ§ћ§ўў§§ћ§ћ§§ћћ§ћ§ћћј§ћ§ћћњњћћњњћћў§ўўі§ў§ўў§ў§ў§§ћњъћў§ўћ§ћњњћњ§§ўў§њ§ћ§ћ§§љћ§ћ§ћњ§§ћў§ћќ§ћ§ћћњљћњљљћњ§§єћ§ћ§ћћљњњљїєњ§ў§ў§ўў§§ў§§ўў§ўўќ§ўў§§§ў§ўўў§ўўќ§ў§ўў№§ў§ўў§§ў§ў§ў§ў§ўўў§ўўќ§ў§ўў§ќћў§ўўў§ўўњ§ўў§§ў$ўј§ў§ў§ў§ўўў§ў ўі§ў§ў§ў§ў§ў ўќ§ў§ўўў§ўўќћў§ўўў§ўўў§ўў§ўќ§ў§ўў§ћўћ§§ў ў§§ў§§ўќ§ў§ў ўў§ўўў§ўўў§ў ўў§ў ўў§ўў§§ў§§ѓў§ў§ў§ў§§ўў§ўўў§ўў§ќћў§ўў§љў§ў§ў§ў ў§§ў§§ўў§ўўњ§ў§ў§ўўј§ў§ў§ў§ўўў§ўў§§ў§ўў§ћ§ўў§ўўј§ў§ў§ў§ўўў§ўўќ§ў§ўўў§ўўњћўћћ§ўўјћ§ўў§ў§ў ўў§ўўќ§ў§ўўў§ў ўћ§ў§§ўўќ§ў§ўўќ§ў§ўўў§ўўњ§ўћў§ўўќ§ў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўўў§ўў§§ў§ўў§ћў§ў§ўў§ўї§ћў§ў§ў§ўўќ§ўћўўє§ў§ў§ў§ўћў§ўўў§ўў§§ў§ўўќ§ў§ўўќ§ў§ўўљ§ў§ў§ў§§сћ§§ў§ў§ў§ў§ўў§ў§ў§ў§§ћўћ§ћ§ћ§§ў ўў§ўўў§ў ўћ§ў§ў§§ћћ§ћ§ћћ§љў§ў§ў§ўўў§ўўќ§ў§ўўў§ўўэ§ў§ў§ў§ў§§ћ§ћў§ў§ў§§ ўў§ўўњ§ў§ў§ўўш§ћћў§§ћ§ћћњ§§ўћ§ћ§§ў§ў§ў ўћ§ў§§ўўў§ўўў§ўўі§ў§§ћ§§ўћ§§љў§ў§ў§ўўё§ў§ў§§ћўћ§ў§ў§ўўњ§ў§ў§ўў§їўћў§ў§ў§ўўљ§ў§ў§§ўўј§ў§ў§ў§ўўўћ§§ћє§ћћ§ћћ§ў§ў§ўўў§ўўњ§ў§ў§ўў§ўў§§ѕў§ў§ўњў§ўћ§§њў§ў§ў§§§ў§ўўќ§ў§ўўћ§ў§ў§§§ћў§§ ўў§ўўј§ў§§ћ§§ўў§їў§§ћ§ћў§ў ўў§ўўј§ў§ў§ў§ўўё§ўўћ§ћ§ћ§ћ§ћўћўў§§ћў§§ћ§їў§ў§ў§ў§ўў§іњ§њ§ћ§§ў§ўў§ѓўћўћў§ў§§ћўћўўў§ўўђ§ў§ў§§ћћ§§ћћўћћщ§ћ§ћўћ§ћўћўћ§§ў§ў§ўћў§ўўу§ў§ў§§ћў§ў§ў§ў§ћћ§ўћ§ћ§њћћ§§ўў§ў§§ћ§ўўе§ў§ўћ§§ў§§ћў§ў§ў§ў§§ў§§ћ§ћ§§ў§ў§ў§ў§ў§ў§ў§ўўѕ§ўћў§ў§ў§ў§§їў§ў§§ћ§ћўў§§ў§ўўў§ўў№§ў§ў§ў§ў§ўћ§ћ§§ўўщ§ў§ўћћ§§ў§ў§ў§ў§ў§ў§ў§ўўќ§ў§ўў§ћў§ўћ§§эћў§ў§ў§ћ§њћ§ў§ў§ўћ§§§ўћ§§§ў§ўўі§ўў§§ћћ§§ўўї§ўў§ў§ў§ўў§ўћўўљ§ў§ў§ўћћ§ћў§ў§ўўњ§ў§ў§ўўў§ў ў§ўћ§§єў§ў§ўћ§§ў§ў§§ўќ§ў§ўўќ§ў§ўўў§ўўў§ўў§ўў§§їўћћњ§љћњ§§љў§ў§ў§ўўўћ§§мў§ў§ў§ў§ўћў§ў§ў§ў§ўћўћўћ§љћљћљўћ§ћћ§§ўѕ§ў§ўћ§ў§ў§ўўћ§ў§ў§§ёў§ўћћ§ћњў§ў§§ћ§§ќћ§ћ§§ѕћў§ўћўњўў§ў ўђ§ў§ћћ§ћ§§ў§§ћ§§ўћ§§њў§ў§ў§§ћў§ў§ўў§ћўћћ§ћќ§ћ§ћћњў§ў§ў§§§ўћ§§ўў§§ў§єћ§ћ§ћ§ћўћ§ћ§§ќћ§ћ§§ѕўњљѕћњ§ћ§ћ§§ќћ§§ў ў§њў§ў§ў§§№ў§ў§ў§ў§ўћ§§ў§ў§§їўћўћ§§ў§ў ўі§ў§ў§ўњўћ§§ў§ўћ§§љў§ўћ§ћўўѕ§ў§ўћ§ћћ§§ћћј§њ§њ§ћ§ћћў§ћћўў§§ћ§ўћ§§ьў§ўћўћ§ўў§§ћўћ§ћў§ў§§гњўњ§ћћ§ў§§ћў§ў§ћћ§ў§§ћў§ў§ў§ў§ўћў§ў§ў§ў§ў§§ћ§§њћўњўћўў§ќћ§ћ§§юўћ§ћ§ћћњћ§§ўў§§ћ§ћћњў§ў§§ћћы§ћ§ћњћ§§ў§ўћ§§ўћ§ў§ў§§ўўћћюўћћ§ўћ§§ћ§§ћў§ўћў§§ъўћўћ§§ў§ўћ§ћ§ћ§ћћў§ў§ўўђ§ўћ§§ўћ§§ўћ§ћ§§ўў§ўў§ў№§ў§§ў§ў§§ћўћ§ћўћћњў§§ћў§§ўў§§§ў§ўўє§ў§ў§ў§ћў§ў§§ўћ§§ўў§§ѕўћ§ћўњўћ§њћћњњ§ћўћўўѕ§ў§§ћњ§ћўћ§§ъћ§§ў§ў§ўћ§§ў§§ћ§ћ§ћ§ћ§§ќћ§§ўўў§ўўп§ў§ћ§ћў§ў§ўћў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўўў§ўўў§ўўў§ўўў§ўўѓ§ў§ўћ§§ў§ўћў§§щў§§ћў§§ћў§ў§ў§§њћћўћ§§ўўћќ§ў§ўўњ§ў§ў§ўў§ўѓ§ў§ўў§§ўћў§§ћћћў§ўћ§§їћ§ў§ў§ў§ў ўљ§ў§ў§ў§§єћ§њ§њћћў§ў§ўўѕ§ў§ў§ћ§§ў§ўўќ§ў§ўўњ§ў§ў§ўўє§ў§ўћ§ћ§§ўћ§§ ўў§ўўќ§ў§ўў§ў§§ў§§ў§ћў§ў§ўўѕ§ў§ў§ћ§§ў§ўўќ§ў§ўўњ§ў§§ћ§§ћћўћў§§ћў§ў§ўўљћўћўњњѕ Р§ўћў ўўћўў§ђњ§§ўњў§ћњјћћљћћ§іћљћљљћћљјћћј§ўћўњўћўўћљјљ§ўўћћў§ћўў§юћ§њ§њ§§ћљ§ўўњ§њ§§ўў§ўњўўњ§њ§њњўњљћјћћќљј§ўўќ§ўњ§§ћ§њћўўё§њљћ§ћњўўћ§§љћ§§№ћў§ћљћў§§ўўћћўњўўўњўўіљ§ћјѕјњћћљљћњ§ўњ§јћћћљ§§њћћ§§ћњўўћ ўљ§њўњњћўў§јљїљћ§њ§ўўћ§ћљљћћљў§ўў§ћюј§ўўћ§§њњјљ§§ў§ћћўўќ§њ§ўўћ§њњ§ўўљ§њ§њљљ§§ўњ§§ў§ћќјћћўўў§ў ўў§ћћїљ§ў§ћљњ§ўўђћњњ§ћћљњ§њњћјњњѕјћљ§§ўўњ§§ўўхњ§§ўў§љњњ§§њѕ§ў§§ћљћћњљјј§ўўѕћњћљћћљ§њњ§§њђ§ћњљћ§§ўў§љ§љ§§ў§ ўї§љћљћјѕљјјћ§ўњ§§іћўњ§њћћљћ§§ёћљ§ћ§§њњўўћњћћўўћўћўњўўч§ћљњљћћљљњ§њ§§њљ§§ў§ћљћњ§§ўњћћљ§њўўћћ§§яњ§§ўўњ§љ§§ўў§§њ§ўў§іћњњћљљ§§ў§§ўњ§§ћњ§ћўўњўўўћўўћўўћўў§ўњћ§§ћ§ўўћўќ§ћњ§§ў§іљњ§јљјїљљ§§ў§ўјњ§ўћўўћўўў§ўўј§њјњјј§ўўўћўўљњ§љљћњ§§љўњў ўќћ§§ўўчћљћћ§њ§њњћћњљљћњ§њ§ўўћў§ўўѓћўўћўў§§љћ§§ўўўћўў§њтћљљћњ§љћ§ў§ћјљљњ§§њўўћћ§§ћњ§њ§§їљ§§ћ§§ўў§§ўњ§§ўћўў§§ўњ§§ћѓ§ћћљћћњњљјћњўўўњўўјњ§јћћњ§ўў§ўљўўќћўћўўћњўўћўў§ўў§§ў№§ў§јїјѕ§§њ§ћћ§§ўўќћњ§ўўѕ§љћљ§§ў§ў§ўўўћўўўњ§§ћўћўћўў§ўћўўћћњњћ§§ќљћћ§§ўњ§§љљњњћ§§ўўі§ћїјўћўўћўўўћўўўћўў§љ§ћљ§§ўћћўќћ§ћ§§ќћљ§ўўј§ћљћўўћўўў§ћћўњ§њћљљ§§ў§ўњўўєћњ§§ўўћћўћћўў§њ§ѓњљ§§љњњј§ўўћўўўћўўїћўўњ§§ўў§§ў§ћѓ§ўў§љњ§§њ§ўњ§§јњ§љћћ§њ§§ўћ§§ўы§њўњ§њ§ћ§ўўћўћўўњњ§њўў§ўмћ§§љљњљѕ§њ§§ћћ§њ§ћљ§§њњљ§§ў§ўўћњњ§њўўњљћћўў§§ўўћўўўћў ўќ§ћћўўў§ўўшњўўћў§§њ§ћјјљћћњ§љў§њ§§ћћ§љљћўћўћўў№њ§ўњ§§ўћўўћљ§§ў§§ўњўўї§ўў§ћѕ§ў§§ўљћћўњўўўћўўўћўўћўќћўћўўљ§ўў§љњўўќћўћўўљћ§ћјјїћћєљћ§§ћїўћўўћўў§ўўћўўьњ§ўћћњњћ§ўў§§њў§љ§§ўў§љјћљ§§љћћўўњ§ў§§њ§§ќў§њўўћ§ўћўў§ѓћњњјљћћњњ§њ§ўўњі§ў§њћљљ§§ўўўћўўѕ§њњ§ўў§§ћњўўў§ўўјњ§§љњљ§ўў§ќћњћ§§јљ§§њўўћўў§ќљћћљљќ§њ§ў ўќћўў§§љ§ўў§§єњ§ўўћўў§§њ§ўў§ћјћ§ўњ§§їњ§§њ§љўў§§ќўћћўўњћўўњњ§§ ў§§ўћўў§љљјњјљ§ўўєћўўћћїћў§ћћ§§ћў§љћўўњћўћўћўў§ўї§њћў§ћћ§ўўщљ§њњўўњ§§њ§§ћњћћњўћўўњўўўћўўћ§ўћўў§§њ§§іљ§§њњј§ўћўўі§њћћјћћјљ§§њ ўћўѕћўћўў§ўћўў§§њўћћњ§ўў§ћћј§ћўўќ§љњўўіћў§ўћўўћњўўўћўў§њ§ўўюћўћў§§ўўњ§њ§ўў§њћўўќ§њ§ўўѓ§њ§њ§§њ§ўѕўћўўї§ўўњњўљњўўўћўў§ќњ§њ§§њ§ўў§њњѓљњ§њ§ћ§§љљ§њўўўћўў§њћ§§ўћўў§ќўњ§њњ§ўњўў§њњ§§љњ§§ў§ў§ћњў§њўўўћўўўћўўљ§њљњўћў ў§љјљњ§§њўў§ўќћ§§ўў§ўњћ§ўўћўўћў§ў§ўјњ§ћћ§§њ§§њњ§њ§§љ§§ў§ўњќ§ўћўўћўќњ§§ўў§њњљ§§ћћ§§њ§ѕњ§§њљћљћ§ўў§ћњќ§њњћћіўћў§њ§њ§§ўўћ§ўўћ§§§ўћўўіњ§ћљћњљћ§ўў§ћў§њљ§ўўћўўћўћћў§њўўќћўў§§ўўћўў§ўћўўёћўњњўћћўўњўўћћўўј§љћљћћ§ўўўћўўћћљњћњўўћўїњљњњљ§ўћўўћ§ўўћўўўћўў№§ћћ§ўћ§њ§њћўћўћў ў§љћћ§ўћћўўћњўўњў ўўњўў§њў§ћћўљ§§ўћћўћћўўўћўўќћўћўўћў§чљ§ћљњўћњљњўћўўљ§љћњћўўћњўўќћњњўўќћњњў ў§ўњў ўјњ§њћў§њўўћў§ћ§ўўћ§њ§§ўўљњ§ћљњњ§§ўћњў§§ў ўћћўўћўўћћў§§ў ў§§њ§ўў§ћњ§§ѓњ§њћљћћљћ§ўћўў§ўќ§ћљ§§ўћћўњњўўњўћњћљ§ўўї§ћљљ§ћћљўўћћ§њ§ўўў§ўўў§ћћќ§њ§ўўћў§њљўўћў§ўў§ў ўњ§ўћўўјћўћ§ўўћўўўћўўўћўўћўј§ў§ўћ§§ўўљћўўњўћўўњ§ћўћћ§ќў§§ўўћјў§§ћћљљўўћћњњ§ћћьњ§їјљљћњ§§ћ§§њўњўўћўўўњў ўћў§ўћћў§ћ§§щўћњћѕљњњ§§ћљњјњњћћљљњљ§§ќўћћ§§ўќљўўћћў§ўў§§њў§ўћћўўўњўўѕ§њ§ў§љњљћљћћћљћ§§ћћўыћњўћўў§§њ§њ§§ўўњ§ўўћўў§ѕўњ§ўћўўњўў§§љўњ§§ўњ§§ўўњ§§ўќћњњўўўћўўќ§њњ§§љњ§§ўўћўўѕњћљљ§ћњјћљ§§ўљ§§їњ§§њћљљњўў§ўћўў§ёўјўўћў§§њ§ўў§ћ§§ўў§ўў§ћў§§єњ§§ўћў§§њ§§ўў§ўњ§§ ў§ћќ§ўћўўњћўўћўўўћўў§ў§њ§ў ў§ў§ўќћўћўўљћ§њ§ўћўўќћўўћћ§њ§ўўќ§њ§ўўў§ўў§ўўњўўўћўўњ§њўўћўўўњўў§ћљўў§ўўў§ўўќ§њ§ћћўіћўњ§їўў§§ўўўћўўўћўўўћўўўћўўќћўћўў§ћўљ§§юњ§§њ§§ўћћў§§ўў§ћ§ўўўћўў§ѓњў§§њћ§њ§њљ§ўўњћў§ќћљћјјљѓћљћћ§§ћњ§ў§§ўўљћў§§љћ§§ўўћўў§§њ§§љњљљ§ў§њњ ўў§ўўў§ўўњћ§ћ§ћ§§њљ§ћњћњћњњћє§ћ§њћњћћњњћњњћўў§ўўњћ§ћ§§ўўўћўў§фћњћ§ћ§ћ§њћ§ўў§ћ§ћ§ўў§§ћ§ћ§§ўў§ўћ§§їћ§§ў§ћњ§њњўћ§§ўї§ў§ўўћ§§ћћњ§ћњњћњњ§ў§ўў§ћ§ћћјў§ў§ўћ§ћћј§ћ§ћћўўћћўў§§ўј§ў§ў§ў§ўўў§ўўі§ўћћњјїљњћћьњ§ў§ћ§њћњћњћћ§§ћњћњћћјљў§ў§ў§ўўњ§ў§ў§ўў§ќў§§ўўіћ§ћљјћћ§ћўў§ўњћћќњћњћћёў§ўћ§ћћњ§ћў§ўћ§§ћ§ўј§ў§ўћ§ћўўљћњљ§§ў§§ћўћ§ћ§§ѓћ§ћў§§ћ§њћњћњњўњ§ўћћ§ўўђ§ў§ў§ўћњњћњћћ§§јњјљ§ўў§ўў§књћћ§ћ§§ћњњљњњћћ§ћў§§ћ§§ў§ў§§ћў§§ў§§ћћ§§юў§ћњћћњ§ћњњ§ўў§ў§ћћќњћћ§§ўћ§§ћ№љћњ§ћў§§ћ§ў§ћ§§ўўјћ§ћ§ћ§§ўўў§ўўў§ўўћљњћњњјјњњ§§ћ§§ёћ§ћў§§ћ§њћћњћ§ћћіњ§ћ§§ў§ў§ў ўў§ўўў§ўўћхјњћћњћћ§ћ§ћ§§ћћ§ў§њћњ§ћ§ћ§ўў§чў§ўў§ћ§ћ§ћ§ўў§§ћ§ћў§§ћ§ћўўэћ§ћћљљњћћ§ћўћ§ћ§ћ§ћћћњ§ўў§§ўњ§ў§ў§ўўў§ўўў§ўўєћ§ћў§ў§§њ§§ўўч§њљ§§ћ§ћ§ћ§§ў§§ћ§ћў§ћ§ћњћћ§§ћўў§ўћўў§§ћўўђ§ў§ў§ўћў§ўћ§ћ§§ўћўўў§ўў§ћіњ§ћ§ћ§ћћ§ўў№§ў§ў§ў§ў§ўћ§§ў§ўўюњћћ§ћ§§њњљјјњ§ћ§ћўў§§ў§ўўў§ўў§ћќњ§ћўўў§ўўєћ§ћ§ћ§ћ§љњњћћ§ћюў§ћњјћ§ћ§§ў§ўў§ћњ§§ѕћ§ў§ћўћ§ўўћћїў§ў§§ћћ§ўў§єћў§§ћ§ћћњћњћћѕњћњњ§§ћњњ§ўўѕ§ў§§ћ§њњ§§ўўљ§ћ§ћ§ћўўў§ўўў§ўў§ьћўћ§ћ§ћў§ў§§ў§њљњ§ћ§§їњћћ§ўў§ў§§ўћїњћ§ћўћўћўў§јћ§ћ§§ў§ўўњћ§ћ§ћўўњєљћћ§ћћњћћ§ћ§§ћњљњњ§§ўў§ќњћњўўў§ўўќ§ў§ўў§§ћўўќ§ћ§ћћ§ў§§ўћћї§ћ§њћћў§ўў§њњћњў§ўўўћў ўъћ§њћћ§ћ§ћў§ў§ўў§ћ§§ў§ўўћ§ћ§§ўўќ§ў§ўўќ§ў§ўўј§ўћ§ћ§ћ§§ѕћ§ў§§ћљљњ§ўўў§ўў§іћ§ўўћ§ћў§ўўў§ўўпћ§ћ§ћњњ§§ўћў§§ћ§ћў§§ћ§ћ§ћћњћћ§ћ§ћћў§ћћя§ћў§ў§ўћ§ў§ћ§ћњћўў§јћ§§ўў§ћўўў§ўўў§ћћђ§ћ§ћ§ћ§њњћ§ћњћћ§ћ§ў§ўіћњњў§ћћ§ћў ўў§ўўў§ўўћ§њћ§ўўўћўўў§ўў§ђћ§ћћњњћњњ§ћўў§§ўћњњ§ћ§ў ўљ§ћў§§ћўўє§ўў§ћўћ§ћ§§ўў§яўћћ§§ў§ћ§ћ§ћћњњљўўў§ўўњ§ў§ў§ўўў§ўўў§ўўљћў§§ў§ўўћ§ўў§њњѕћњћњћњ§ћћњўўњ§ў§ў§ўўќћ§§ў ў§ў§ћѕў§§ћ§ў§ћ§ћўў§ћјњћћ§ћњњўў§їћ§ћ§ћўћ§ўўў§ўўќћ§ћўўіћ§њљљ§ћњњ§§ў§їўћ§њћћ§§ўў§јћў§§ћњ§ўўўћўў§ъћў§ўћў§ўћ§њљњ§ћ§ћ§ћ§§ўўј§ўћ§ћћњћћ§ћћўў§ўўї§ў§ўћ§ћ§ћћљ§ћ§ў§ћ§§ў§ќћ§ћўў§ћћ§ћћњњї§ћ§ћ§ћ§ћ§§јћў§ћћ§ћўўў§ўў§јћ§ћ§§ў§ўўњ§ўў§ћўўў§ўўђћ§ћњљњћ§ўў§ў§ўўђњћњўў§њћћ§ћўћўўў§ўўў§ўўц§ўћћ§ўћ§ўўћћњ§§ў§ўћ§§ў§§ћ§§ћіљњњ§§ў§ў§ўўў§ўўў§ўўь§ў§ў§ўћ§ћ§ћ§ў§ћљљњћўў§§ў§§њї§њћњћћ§ћ§§ў§ўќћ§ћўў§ўњћ§њњћўўњ§ўћћ§ўўўћўўќ§ў§ў ўќ§ў§ўў§њћў§ў§ўўћћ§ўў§§ќўћ§ўўќћ§ћўў§ќћ§ћўўљ§ўћў§§ўў§љў§ў§ў§ўў§§ў§§ўћ§§њћ§ћў§ўўќ§ўћ§§ўћ§§ђњ§ћћ§ћ§ў§ў§ў§ўўј§ўћ§њ§ћўўї§ўў§ћў§ћ§§чў§ў§ў§ўў§ћ§ћ§ў§ћ§ћ§§ў§§ћўўі§ўћ§§ўћ§§ўўў§ўўў§ўўјћ§ћ§ўў§ўўќ§ў§ўўю§ўћ§§ў§§ћ§ўў§§ћ§§ўўќћ§§ўўіћ§§ў§ўўћ§ў ўњ§ўћ§ћўўіћ§§ў§§њћћ§§ќћ§ћ§§ѓћўћ§ћў§§ћ§§ў§§§ў§ўўљ§ћ§§ў§ўўў§ўўўћ§§іћ§ћћњ§ћ§ћ§§юћ§ћћњћњ§§ў§ўћ§ћњњ§§ќћ§§ўў§ћўў§ўў§§ў§ўўћўћ§ў§§ћћћ§ћњ§ўўќ§ћћўўї§ћўћў§ў§ў ўјћ§§ў§ў§ўўјћ§ћў§ў§ўўњ§ўћ§ћўўњ§ўў§§ўўў§ўўњ§ў§§ўћћєњ§ўў§ў§ў§ў§ўўћ§ў§§ўўі§ў§§ћњљћћўўј§ў§ўћў§ўўў§ўўћїњ§ўўћ§ћ§ўўў§ўўў§ћћќњ§§ўўќ§ў§ўўў§ўўј§ў§ў§§ћ§§ћњ§ў§ћћўў§ўўў§ўўќ§ў§ў ўў§ўўљ§ў§§ћўћћ§ћў§ћ§ўўі§ўћћњ§ўў§ўўі§ў§ўў§§ў§ўўў§ўўў§ўў§§ў§ўўњ§ўћ§§ўўњ§ў§ў§ўў§ћў§ћ§ўўѓ§ў§ўћў§ўћ§ћ§ўўћ§ћњћ§§ќћ§§ўў§њћў§ў§ўўў§ўўў§ўўј§ў§ў§§ћўўќ§ў§ўўў§ўўўћ§§ыў§ў§ў§§ћ§ћ§ћ§њћњћћњћўўјћ§§ў§ў§ў ўіћњћ§ћ§§ў§ўў§§ў§§ў§чў§ў§њћ§ўў§§њћћ§њњћў§ў§ўў§§ўў§ўўљ§ў§ўў§њњ§ўќ§ў§ўўђ§ўћ§ћ§§ўћў§ў§ўўў§ўўі§ў§ў§ў§ў§ўўјћў§ў§ў§ўўў§ўўў§ўўі§ўћўў§ћў§ў ў§ўљћ§ћўћ§ўўў§ўўіћ§њћўў§ў§ўў§јњћњ§ћў§ћћ§іћўћ§§ў§ў§ўўў§ў ўў§ўўњ§ўћ§§ўўћћњћ§ћћї§ћўў§њ§ћ§§ћђљњљљћњћћ§ћ§ћ§ўўї§ћ§§ў§ў§ўўіћ§ў§ћ§ћўћўўњ§ў§ў§ўў§§ћљћћјњћњћњ§ћўўќ§ў§ўўў§ўў§їћ§ћ§ћ§§ў§§ўѕ§ў§ўў§ћ§ћў§§ќў§ў§§шћ§ћћ§§ћ§ћ§ћ§ћў§ў§ў§§ћ§ћўўў§ўў§љў§ў§ў§ўў§јћ§ћ§ћ§§ўўў§ћћчњљњњћћ§ћ§ў§ћ§ћ§ћ§ћ§§њћћ§ўў§іћ§ўў§ў§ў§ўўі§ў§ў§ўћ§§ўўўћ§§ўћ§§ћўўќћў§ўўяћ§ћ§ћ§ћ§§ў§§ћ§ћ§ўўњ§ў§ў§ўўь§ўў§ћ§ћ§ћ§ћ§ћ§§ў§ў§ўўјћ§њћњ§§ўўў§ўўў§ўўў§ўўќ§ў§ўў§ћ§ў§ўў§ћў§ў§ўўљ§ћў§§ћўўњ§ў§ў§ў ўќ§ў§ўўє§ў§ў§ў§ў§ўў§§§ў§ўўќ§ћ§ўўј§ўћ§ћў§ўўўћўўњћ§ўў§ўўў§ўўј§ў§ў§ћ§ўў§§ў§§ў§§ћўўљћў§ў§ў§§§ў§ўўќћ§ћўўѓ§ў§ў§ў§§ћў§ў§§ўў§ўўў§ў ўј§ў§ў§ў§ўўєћ§њћћ§ћ§ћ§ћ§§ўћўў§љћў§§њ§ўўї§ў§ўћћ§ў§§їўћ§ћ§ўћ§ўў§§ў§§ўў§ўўћћ§њћњњћќњћњћћіњ§ћўћћ§ў§ўўў§ўўєћ§ћњћ§ћ§ћў§ўўї§ўћ§ћ§ћ§ћћ§ўћ§§ўю§ў§ў§ў§ў§§њ§ћ§ћ§ћ§§іћў§ў§§ћ§ћ§§ћў§§ћўў§§ў§ў ўї§ў§ў§ў§ў§§ўњ§ў§ў§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўўћ§§ ўў§ўўї§ў§§ћ§њ§ўў§§ћўў§њћў§ў§ўўљћ§ўў§§ўў§§ўћћт§ћ§ћ§ћ§§ў§ў§§ћ§ћ§§ў§ўћ§ћ§ўўћћўўў§ўўў§ўў§њњ§ћў§ўў§іћ§ћ§ћ§ћў§ўўњ§ўћ§§ўўі§ў§§ћў§ў§ўўќњћ§ўўђ§ў§ўў§§ў§ў§ў§ўўѕ§ў§§ћ§ћў§§ўўў§ў ў§єћ§ћ§§ў§ўњў§ўўь§ў§§ћ§§ў§ўћћњћњћћ§§ўўќ§ў§ўўў§ўўќ§ў§ўўј§ў§ў§§ћ§§ќћў§ўўєћ§ћ§ћў§ў§ў§ўўћ§ў§ћў§ў§ўўњ§ў§ў§ў ўјћ§ћ§њћњћћўў§§ўў§§§ў§ўўю§ў§§ћ§§ў§ўћ§ў§§ў§ўўњћ§њ§ћ§§ў№§ў§ў§ў§§ћ§§ў§ў§ўўў§ўўј§ў§ў§ў§ўў§ўў§ўў§§ўћћћ§ћ§§ўўњ§ў§ў§ўўќћ§§ўўў§ўўў§ўў§ў§іў§§ў§ў§ў§ўўќ§ў§ўў§љўћў§ў§ўўў§ўўў§ўў§§ў§§ў§ў§§ў§§ўў§ўў§№ћў§ў§ў§§ћ§њ§§ў§ўўў§ў ў§§ў§§ ўщ§ў§ў§ў§ћњ§ћ§ћў§ўћўў§ћў§§§ў§ўў№§ў§ў§ў§ў§ў§ўћў§ўўў§ўўў§ўўъ§ў§ўћ§ћ§ћўћ§ћ§§ў§§ћ§§ўў§§ў§§§ў§ўўљ§ў§ў§§ўўў§ўўќ§ў§ўў№§ў§ўњў§ў§ў§§ћў§ўўў§ўў§ ўњ§ў§ў§ў ўќ§ў§ўўђ§њћћў§ў§§ћў§ў§§ћў§ћњ§§ўќ§ўћўўѓ§ўў§ў§ў§ўћў§ўўјћў§ў§§ћўў§§ћ§ўў§§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўє§ў§ў§§ћўћў§ўўќ§ў§ўўў§ў ўј§ў§ў§ў§ўўњ§ў§ў§ўўќ§ў§ўўјћ§ћў§ў§ўўњ§ўћў§ўўј§ў§ў§ў§ўўќ§ў§ўўў§ўў§§ў§§ќў§ў§§ћў§ў§ўўј§ўћў§ў§ўўќ§ў§ўў§ўў§ўў§ўћў ўј§ў§ўћћњ§§ўљ§ў§ў§ў§§§ў§ў ўў§ўўў§ўўў§ўўќ§ў§ўўў§ўўёћ§§ў§ў§ў§§ћ§§ћў"ўќ§ў§ў ў§њћўћ§ћ§§§ўћўўў§ў ўў§ўў§ўћўўћ§ў§ў§§ў§ћћ§ћў§§ўј§ў§ў§ў§ўўў§ў ўў§ўў§ћ§§ў§§ћў§ў§ўўњ§ў§ўў§§ўќ§ў§ўўќ§ў§ўўќ§ў§ўў§ћћ§§ў§§§ў§ўўњ§ў§§ћ§§ў№§ў§ў§ў§ў§ў§ў§ў§ўўќ§ў§ўўї§ў§ўћ§ћћ§§ћў§ў§ўўќ§ў§ўўў§ў ўњ§ў§ў§ў ўў§ўў§њћўћ§§ўў§§ћўў§ќћў§ўўў§ўўќћ§§ўўї§ў§ў§ўћћ§§ ўє§ў§ў§ў§ўћўњўў№§ў§ў§§ћў§ў§ў§ў§ўўў§ўўў§ўўў§ўў§ўњў ўў§ў#ўў§ў ўў§ўўќ§ў§ўўў§ўўў§ўўњ§ў§ў§ў ўў§ўўў§ў ў§ѕў§ў§ў§ў§ў§ў ўљ§ў§ў§ў§§§ў§ў ў§ўў§ўўў§ўўє§ў§ў§ў§ў§ў§ўўў§ўўў§ўўў§ўўќ§ў§ў ў§ўќ§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ўўє§ўћў§ў§ў§ў§ўўј§ў§ў§ў§ўўќ§ў§ўўќ§ў§ў ўќ§ў§ў ўъ§ў§ў§ўћў§ў§ў§ў§ў§ў§ўћ§§ўі§ў§§ўў§ў§ўўќ§ў§ў ў§ўі§ўћўћў§ў§ў ўў§ўўў§ў ўў§ўўў§ў ўј§ўћ§ћ§§ў ўќ§ў§ў ў§ќњћ§ўўќћ§§ўўў§ўўі§ў§§ћ§ћ§§ўўє§ў§ў§ўћ§§ў§ў%ўњ§ў§ўћўўўћўў§ ўў§ўўў§ў ўў§ў ўў§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўј§ўћ§ћ§§ўўў§ўў§§ў§ўўў§ў ў§ў§ўќ§ў§ў ў§§ў§ўўў§ўўќ§ў§ў:ўў§ўўў§ў ў§ўў§ўўў§ў ў§ќћў§ўў§єћ§§ўў§§ўћў§ўўў§ўўў§ўўќ§ў§ўўў§ўў§ўљ§ўћ§ћўћћќ§ћў§§§ў§ўўќ§ў§ў ўњ§ў§ў§ўўю§ў§ў§ўћ§ћ§ћ§ћ§ћў§ў ўј§ў§ў§ў§ўўў§ў ўќ§ў§ўўў§ўў§§ў§§їў§ў§ў§ў§ўўќ§ў§ў ўў§ў ўі§ў§ў§ў§ў§ўўчћ§§ў§ћћў§ў§ў§ў§ў§ў§ў§ў§ў§§ўќ§ў§ўўў§ўўќ§ў§ўўќћў§ў ўј§ў§ў§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўўќ§ў§ў ў§ќћ§§ўўў§ў ўў§ў ўў§ўўў§ў%ўќ§ў§ўўў§ўўў§ўўќ§ў§ўўў§ўўў§ў ўў§ўў§(ў§єћ§§ў§ў§ў§ў§ўўў§ўў§ ў§ўќ§ў§ўўў§ў ў§ћіўћў§ўћўў§ўўј§ў§ў§ў§ў ўј§ў§ўў§§ўўў§ўя§ўўњћјћћ§§љ§љћљћ§§љїїјњћјњ§њўў§§њћљљћіјљћјљјјњјћћ§ўљ§§ќњ§ћљљнјєћћ§§ћњѕјњљјјћљљћћњ§§њ§§њ§ћ§§ћћњјњњіћјњњљћ§§њћћяљћљњ§§љћјћ§§њљћњћћєњљћ§§њњћљљћљљћњјњњјљћћњњ§ћћљјјѓњјљћљћћљјњњћ§§ђљћїћљњњ§љљћљћ§§љљћћјћњћћјћљљћљ§ћљћћ§ўљћћљљњ§љћљјћћўљ§§ћ§јћ§§ћ§љћљљўћ§§љњ§ћњјјћћјљњ§ћ§ўў§§юћўў§њњ§ћ§њ§њљћјјћ§§њ§§љ§§ћїљћћљћћљњћћїљћњ§§ћћљјјќѓћљћћљљћњїљњ§§јљћјћћ§њ§§јљћјњљљћјјћќљћљћћќљћћ§§яћљљћћљљћњћћ§љћљњ§§ќњћљћћўљ§§ўљњњіћљњњјљљћљ§§јљњјјњїњћћњѓјњјћћљћћјјћћ§§ўњўўт§љћћљјјљћћљљћњњћљћљљћњћљїјјњњјјљњљѕњјљћћ№љћљјїњј§§ћћ§§ўў§§љљјћњ§њ§§њћњјњњћћїљјљћћљљћ§§ђљћљћћјјњјјњњјћћ§љјњњгћў§§јћњјћњјњїїњњ§§њ§љљњ§§љћћњјћ§§ў§љњњљћћљћљћћѕљћљћљјјњћћјјњњљ§§њ§§єћљјјњњљћћ§§љљћљјћљћљћћљњњіјїћћњњјњјћћќњћћ§§ќњўћ§§њњћћљћ§§ў§ћ№§њ§ћљљјћћ§§ћћїїљљєїјћљљћњјјћћ§§ћњ§ў§фўћ§§ћњ§ћљ§њ§њ§њ§§ўў§јћјїњјњћћћјњљљћћ§єњћћљјјњїњјћ§§ыњ§љћћљћћ§§њ§§љћћ§ћћљ§§ўњ§§ћш§њћљѕєѕјѕѕјћ§њ§њ§ћњњїїљїїэљѕїїј§§ћў§њ§ћљњћћ§ћћюјљћњћћ§ћјїјњњћљћћјјњњћјѕљљїїѓњјњљћћљњјњћљ§§ћўјћћ§љцћљ§§ў§ћћљљњњїїјњјљћљћњћљљ§§ћљјєљћљјћћ§љњ§§ьњ§§њјљљћљћћљћ§§ўўњљћћњьћљјјњњћћљљћјјћ§§њ§§ћћњљјњјљњњјјќїњљ§§ўћ§§ўњ§§іњ§јљљћћљјћ ћчјљїїњњјћљћ§ћјїѓјјњћњњјњљѕѕёљњјњјњћњћћ§њўћ§§ќљјљ§§ћ§ўњ§§њщ§љћњњїјїјњњјјѕїљљїњјњњјјёњјјћ§ћўўњ§ћ§§ћ§§ёљ§љњћ§§њ§њњјћћљљўјњњјјћћљњњћљљћщњљїњљћ§§ћјјљ§ўћўў§§јћљћћ§ўњ§ §љћјїјћљјј§њјћћњћјјњњћљјјїїўјњњўљ§§њў§ћћљўјљљэћљћњњ§§љљћљњњљњјљћ§§№љћїњњљљїњїјјњљњћћў§њњћљљћ§§ўњљљ§шјљјњњјћ§§њћ§њ§ћјїїѕјїїѕїїљїљљєїњљљ§§ќњјјћћўљ§§ўњ§§єњћљћљћ§ћћњњјјѓљїїљ§њљњјљјїњњ§љњјјљїјљјћїјјњєѕїљїљњљћ§њњ§§§њ§њњ§њћ§§ўў§§љѓ§ћћљјњїјњњјљњњіјњјїјјїњњћћќљћљњњћљћ§ѓњ§ўњ§ћјљћ§њјћћњћљљћјљћљљћћѓјњїљїњјѕѕї§§ћћ§љњ§§ўњ§§љњјћљњћ§§щњљњњљљјјњћћљћљњўўњљљћћ§§ўњћћўљћћўћњ§§ћ§§ќўћ§ћћфљ§§ћњћ§§ћєѕљјњћљљћњїјїљїњјњјјћѕ§њ§љњњјјћћ§§ћњ§ўў§§щљњјћћљ§њћљћ§њ§§њћћјњјјњњјљњљњњјњћћшљћљљњјљ§§љћћїїѕјњћћљњ§њ§§ўћ§ўў§ћћљњјњњјњћћљћњ§ў§њњ§љ§ѕћјїїєѕљѕњњ§§ў§§ўћўўљ§љјљћјњњ§љћљљљјњћ§јїћћљћњљћ§ћћљљєћјљјїљѕїїјљўўќ§љ§ўў§ўц§ћњ§§ћјјњљћљћљ§§љљћјјњњјљћћљљјљїїњћћјїљљћљ§ћўў§љњ§§њўў§§§љћљљјїњљљ§§їњў§§ћђ§јћљјћћјїјњћћјјњѕїњњўў§ћјѕљ§§єњјћљћ§§ћњњљїїјњљћљ§љљњњёєњїїѕѕљњћћљћљљ§§ўљћћљљћјјћћўўќ§ћљњњл§љћњїњњјљїјњњћћњјњњјїѕїљѕїљїјјњћјљњњ§§ќњ§њљљуњљѓїњ§ўњ§§ўњњ§њњљљћћјћ§њ§њћјћћўљћћёљћћѕїљњјјњјћћњћћшњїћљћїљљјњљћћљћћ§§љћљћљћћќњ§љ§§ўњ§§ќњ§љћћјљѕљћјњњћћ§љћљљјєљјљћљћљљјћјћћ§ўљћћ§ёў§њ§ћњїѓјљ§њћљћћкњћљјљћљћћјљћјјїљљћјћ§§ћћљљњ§§љљћ§ўў§§ћћ§њ§ўўўћ§§ўќ§љљћћђљћљћљћљјћјјњњјјњёљћјљћ§§ћїњћћјњўўјћўўњњ§њўўќћњ§њњ§љћљљћ§љ§§ќњљљћћљєћјћљћљћљљћљћћёљћјљљ§њњћјљњћњ§§јњ§ћћњњћўўћ§њћњ§§љњ§§њ§њљљј№їјњљћјјњјњњјћјјњњћў§§ў§§ћјЃћ§§ћћљ§јћћљњ§ћљћћ§§ћўћ§ћљјњћљћћљћћњїјїњћљњјћљњїїњјў§њњўў§ћњ§§ћњјћ§њљ§§ћњњјњњљћћјјїј§ўњ§љљјљљ§§ќљћјњњыјїћ§ћљљћњјїј§ў§§њ§§њ§§ћњљљћ§§№љ§ћћљћјњљљћћљћјїїљљїїјћ§ўў§њ§ћћљћћјљљћћіњ§ћўўћ§љњўўњ§§њљћћс§ћњљїїњјњјјљѕєѓїљљјјћњљњћјњљљћјјљљћ§§њћј§§ўј§ўўћћў§ћћђњїѕїїјљћ§љјњљ§§ћјљјћјњћљњњћћўљ§§ўњ§§њ§ўњ§њ§ћљћћујћљћљњњћ§ћћ§ћњїљїљћ§ћћљњњ§§њ§§њўњћўњљљ§§ѕўћњљјћљљћљћћѕ§ћћњјјњћњјњњіїјћћљћјљј§§њћљћљљ§§њћ§ѓљћљ§§ўў§§ћјљћћ§ўљћћўњћћњѕљћјїїћћљћљ§§ьўњ§§ўњ§њјљ§ћљћљћ§§њ§§ћў§іњ§§њў§њћћ§§§ћњїїѓјћљћ§њ§§љћћљћћљ§љэњ§њњ§ћ§љњ§њ§§ўў§љљћћ§љњўў§ћјљћћљћ§ћљљњјњњћљћћќјњљ§§іћўњ§§ў§§њ§§мњ§ћњњћўў§§ћћњљњћўў§њ§ћјњјњњјћћ§њ§ћћјјњўћ§ §њєљћћ§љћ§њ§§ћњњїћ§§њ§§њ§љљ§ћ§ўў§§ўїћўўћњ§§њ§§јњ§§ћ§§ў§§ў§љэјњћћ§§њћћљ§§љјјљ§њ§§эћў§ћўў§§љњћў§љћљљ§ћћ§њ ў§љњ§§ћњ§ўћ§§ђњ§њ§њњ§ћљ§§ћј§§њћљњ§љћћѓљњњ§§љљћј§ўў§§ўўћўў§сћљћ§ћћњ§ћљћјћљ§њћљћћ§њћњјєїїјћ§§ѕљ§љћ§њњ§§њ§§ќњ§ћљљў§ўўѓњљљћљ§ў§њ§ўћ§§яњ§§њћјјћћјњћљћљљћћ№љћњњ§ўўњ§ћћњјњљ§§іћљљ§§ћћўњўў§ў§§ћљљѓњјњњћ§њњљњїљ§§ћюј§§ћ§§ў§§ћњљ§ў§љћ§§ўў§ўў§ќњј§ћћќљћљћћѓљћљљ§њ§љљћћњјјїљ§њћћјћћ§§њў§њэћ§њўњњўћ§ћљ§њ§§љћљћћ№њ§љљњјјњљњњ§њњ§ћћ§љљћљљ§ўњњќљњљћћљњћћ§њ§ўўјњўўљљ§њўўўњ§§ќњ§ћљљў§ўўѓњ§§њ§§ћћњўўћўў§§љћћўљ§§ў§§њ§ўўњ§ўўњ§ўўќћўў§§ўў§§љў§§ћ§ў§§ўћ§§љћћ§ўћўўњїўћўўњ§њ§ўў§ў§ћў§§ўњћњњљћњњўјћћљљћ§ћљјљљєћњћ§њњ§§њ§§ўўўћўўќ§њ§ћ§ќў§ћњњє§ћўћћњћњ§ћ§ћћњ§ќў§ў§§ћ§њћњњћьњјњњљњњћњ§ћ§ћ§ћ§ћ§ћ§§ўњћћёњћћњ§ћћљњњљћњњћћ§њћ§§ўћ§§ћњ§ћћњњљњ§љњћћ§њрћњћњћњћ§§ћћњ§њ§ћ§ћћљњњћњћњћњћњљћћ§ўњћћюњћњљљњћћњћњћ§§њћћњњэљњћњћњћћњљљњ§ћ§ћ§ћњњўћ§§ћяњћњ§ћ§ћњњ§њљњћњћњњњ§ћњћњћћіњћћ§ћ§ћ§ћњњћ§ћњьћњћћ§ћ§ћћњњ§ћћ§ћ§њњћћћњ§ћ§ћћў§њњђћњћњћњћ§ћњ§ўўћћћў§ўћ§§ўњ§§ўћњњћ§§ћ§§јћ§ћ§ћ§њћћљњћњћћ§њњѓћњћњћњ§ћ§њњћњњъћњњћћњљћћ§ћ§ћ§ћ§ћћ§њњ§§§ћ§ћћњњљћћњ§§шњћњћњћћњћњњћњћњћћ§ћњћћњћћќњљњћћэњћ§§ћ§§њћћњћњћ§§ћћљљћљъњћћњћћ§ћћљњњљњљњћњћњћљљљњљњњћћњњї§ћ§ћ§ћ§§ўўћјњћћњњћњћћќњљљћћњњ§њћћњњўљњњіљјљљњћњћњћћзњљљњ§ћћњ§ћўў§ћ§ћ§њ§ћ§ћ§ћ§ћ§ћћљњљњњћњћ§ћњћћћњ§ћ§ћћњцљњњљљњћњћћњљњљўў§ћ§њ§§ћљњљљњњ§§ћ§ћћѕ§ћ§ћћњљњћћ§§њћњљћњћћњћ§њћњњъљћ§ћ§ћ§ћ§њћњњљљћњњ§ћўћћњћјњћњћњћћљљѓњћњћљљњљњћњћњњћѕ§ћ§§ўћ§ћ§њћћю§ћў§ў§ўў§ћ§ћ§ћ§ћ§њњ§ѓњћћњњћћ§њћњљјј§љњћћ§њљњњћљ§ћњњћњ§§ўћўў§їћ§§ўћ§ў§ћћ§§ћў§§њЫћљњљњњћњљћћњћњ§ћ§њћћњњљћљњћ§§ћ§ћўњњћњњ§ћ§ћ§ћћњ§њћћ§ћ§§їћ§ћћњ§§ћјјњїјјњњ§§ўњљљўјљљїјњљљњ§ћў§§їњћљњњ§њћњњћ№§њњ§њњљњљљњћњћ§њњљњјљёњљћњњћљњљћћ§ћ§њњћљ§ћћњћћ§§ўњћћљњсћњћњ§њћћ§ћ§ћћњњћћњћњћњћњћћ§ћ§ћ§§ќћљњћћцњћњ§ћў§§ћћњћњњљћћњњљљћњћћњњя§ћ§ћ§њћњћљљњљњћљњњљћћ§ћ§ћћў§ћћ№§ћ§ћ§ћ§ћћњћћ§њћњњѕћњћњћњћњњјљљњљћњ§њњљњњљљћљљњљјјўљњњч§њљњћћ§ўўћ§ћћ§ћћ§ћ§ћћњ§ћ§§ќћ§ћ§§ћіњљљћњћњњљњњјљјјљљњљњњњљњњћћўў§§ў§ћћѕ§ћ§ћўћћљћћ§§њћўњљљјњћњћљљњћћ§њћњњёљјљљћњ§ћћњњћ§§ўўћ§њћњњћ§ћќ§ћ§ћћј§њњљњњћњњўљњњёћњљљћњћњљљћћњњљљќњљљ§§ќћ§ћ§§ћњћўњћћќњћњ§§ћјњћ§§ћљњћћі§ћћњћљњјјљљњїљјљњћњћњўўѓћ§ћ§њћћњћ§ћ§ћћѓ§ћћњљљњњ§ћ§њ§§њљўњљљјљћјћћљћћ§§ћњњбћњћћ§ћ§ћ§ћ§ћ§ћ§њћњћњ§њћљљњ§њњјљљћћ§ћљњћњћљњљјљњњљљїјњњћњњљљјљјљћњ§§њћ§ћ§ћ§§§ћ§ћћ§њўћ§ћ§ћћѓ§њњћњљћњљљњјљљњўљњњќљћњћћўў§§њћњћс§ћ§ћ§ћў§§њ§ћњћ§ћћњњљњљћњћћњњћњћћ№њћњњљљјљљњљњљ§ћњњѕћ§ћ§ћ§ћ§ћ§ћћ§лњћ§њ§ћ§§ћљљћћ§њљћњћњў§ў§§ћћњћћ§ћ§њћњћћєњћњћњўў§ћ§њ§§ђћўўћњћњћћ§њљњћћћњјњљћћѕњљћњљјљљњљњњ§рћљљњњћњ§ћ§ћ§љ§§ўћ§ћ§ћљњћњћћ§њћњ§§§ћ§њњќљњњљљњіљћљљњљњњћњњћэљњћ§ћћњћњљјњљњњћ§ћ§§щћ§§ў§ў§ўћўў§њћњћћњљљњљњњћћ§ћўћ§§ћћ§ћ§ћћћ§ћћњљљјњћљ§ћ§ўўѕћ§ћ§§ў§ў§ўћћњњљњљћњћћіњљњ§§ћњћњћћњњћњћћњћћђњ§ћњљјјљљњћў§ўўѕћўћў§ўћ§ћ§ўўњ§њ§ћ§њњљћњћњў§ћћњљїњћњћњћњјљљўћњњћў§ўўњћ§ћ§ћ§§іћ§§ўћ§ћћњћћњчљћћ§ћў§ўћ§§њњ§§ћћњњћњћњљњњ№љњњљљўў§њњљћћ§ћ§§іњћњ§ћњљљјљљ§ћњћћўњљљўћљљјяљћњћњћћ§ћ§ћњњћњћњњњћњў§ўћћ§§ўћљљыњјљњљљњћљњљњњљјљјњљјњњћљњ§ў§§љћ§ћ§ћ§ћћњљјњљљ§§ўћ§§ћўњћћѓ§ћ§њ§њћњћњћњћћњѓљјљњњљњћњљњћњњћњћћњљћњћћѓњ§ћћњћњћњћњ§ћћт§ћћ§§ћ§ћ§ћ§ћћњћњћ§ћњњљњњћњњћњћћђњћћњћњћњћћњњ§њњў§ћћіњћћ§ћ§ћ§ћ§§њяљњњћћ§њћњћњћ§ћћњћћћњ§ћћњњћѕњћћ§њњћћ§§ћћјў§§ћћњћ§§ўш§ћ§ћ§ћў§§ћћњћњћћњћњћњћ§њњљњљљњљћњ§ћћћ§њћљњњўљўў§ў§§ћ§ћћћњ§ў§ћћљ§ћћњћњћћєњ§њћњћњћћњћњњњћњњјј§§ыњ§ћ§ў§ћ§ћ§ћ§ћћњњљћўў§§їњ§§ћ§ћ§ћ§§ћњ§љћњњћљњљљњњљєўћ§ў§ћ§ћћњћњњћю§њћћ§ћћњў§§њћњћћ§ўўќ§њћњњюћњњћћњљљњњљњћљњњћљљњтўћ§§ў§§њ§ћ§њљњћћ§ћ§§ћљњњљљћњћњњ§ёў§§ћћњћћ§ћ§ћњњљљњњћњ§њћћјљњњ§ћўћ§§№ћ§ћ§ћ§ћћњћћ§ћ§њћћњњљћћњћћўњљљ№јљљњњ§ўў§§ћћњћњћћњћњ§ўњўўќћў§ўў§№ћ§ћ§ћ§§ћњћњ§њњјљљњјїэљћћ§ћћ§ў§њњљћћњ§њњћћёњћ§§њњ§ћ§§ўћў§ўўўћњњљьњљљњћњ§ћњљћћ§ћ§њћњњћћњѕћ§§њћњћћ§ћ§§ќћ§ћ§§§ћ§ўўќ§ўў§§љњћњћњћњњяћњћљљњ§ўўћћљљјљјћћњњћ§§ћ§§ћћ§ћ§ўў§ћўѕ§ћњњћћњћћњћћњыљњљњљњљљњћњћњњћ§ћ§ћ§ћћћўћ§ћ§§нњћћ§ћњћ§ћў§§ћњ§ћњћњ§ћ§ћ§ћњњћњљњћњњљљљћњњљљњћћљ§ћ§ў§ћ§§ќћљњћћ§њћ§§ќћ§њўўўћ§§ѓћ§ў§§њњ§ћ§ћ§ћћ§§њљљњёћњћ§§ћћњњћћњћњћћќ§ћ§ћћ№§ћ§§ћњ§ћ§ћ§ћ§§ўћћъњћњў§ў§ўћ§ћћњњћћњћњ§њћћќњљљћћюњћњћњљћ§ћ§ўў§§ћўћ§§эћ§ћ§ћћљљњўў§ћћњљћ§ўў§њѕљњљљњћњћ§§њњљћё§ћ§ћ§ћ§ћ§ћ§§ћњћћўњ§§іћњљњљњљњћ§§§ћ§ћћъ§ћ§њћњ§ћ§ћ§ћ§ў§ћ§ћ§ћ§ўўь§ў§§ћ§ћ§ћ§ћ§њћћўћ§ћўў§ћлњљњћћ§§њњћћ§ћњњћћ§ћ§ћўў§ўў§§ћў§ўў§ћњћћњћљ§ћ§§ў§ўўъ§ў§ў§ћ§§ћћ§§ўўћ§ћ§ћ§ћ§§ѕћњћ§ћњ§§ћ§ћћъ§ћћњћњћ§§ћ§ћћњ§ћўў§ћ§ўўў§ўў§пњћњ§њћ§§њћњ§њћћ§њћњњћ§њљњћљљњњћ§ћћ§ўњ§§ўћ§§ћћ§ћ§ћћ§ўѓ§ћћњћћўћ§ћўў§§љћ§ћ§§ћњњћљњћњћћњћ§ьћў§§ћњњљњљћ§ћ§њћћ§ћўўі§ў§ўў§ћ§ћўў§§њћћњљњљљњ§§цћљњћћ§ћ§ћ§ћћњ§ћ§њ§ћўћћњ§ћ§§љћњћ§ћў§§єў§§ћ§ћ§ћ§§ћњњѕћњћњћњћњћћ§§ћќњћљњњ№ћ§§ћњ§њћћ§ћ§§ў§ўўўћ§§ћўј§њћћ§ћ§ћћњ§ћњљњњљћ§§ћќњћњ§§§ћ§ћћўў§§фў§ћњћњљњћћ§ћў§ў§ўўћћ§§ў§ў§§ћћ§§ћ§§ўњћћў§іћ§ћ§њњ§ў§ўў§ћўњњѕўћ§ћў§§ћ§ћўў§ўў§§ўї§ў§ўћ§ћўћћљ§ћўћ§њ§§њћ§ћў§ўўѕ§ћћњћњ§ћ§ћўў§ў§ќћ§ћўўы§ћў§ў§ў§§ћ§§ўў§§ћњљљњњћўњћћќњ§њ§§ўћ§§ќћў§ўўњ§ў§ўў§§ўў§ўўћ§іў§ўћ§ћ§§ў§§јњћњ§§ў§ўў§їўћ§ћ§ћ§ћ§§эћ§ћўњћњћћ§ћ§§ў§ў§ў§§ќў§ў§§щћ§ћўћ§§ўћћњўћўћўћ§ћ§ћў§§ќў§ў§§щўћ§њўћћњ§њћњ§ћў§ў§§ћ§ћ§§ќў§ў§§хў§§ћў§§ћ§ћ§ћ§ћ§ћ§ћў§ў§§ћ§ћ§§§ћ§ћћє§ћ§ћ§ћў§§ћ§ћћ№ўћ§ћ§ћ§њўћ§§ў§ў§§їў§§ўў§§ћ§§ўў§§єћ§ћ§ћ§ћўњ§ћ§§ѓћўћ§ћ§ћў§ў§ў§§юћў§§ћ§ћ§ћ§ћў§ў§ўћ§§ћћў§ў§§ўћ§§ћћ§§ў§§ќњўћ§§єћ§ћ§ћ§§ўў§§ўў§§ў§§њў§ўћ§ћћ§ў§ўў§ѓў§ў§§ћ§ћ§ћ§ћ§§ќћ§ћ§§ў§ўўћћ§эў§§ћ§§ўћў§ў§ў§ў§§ћ§§јў§ў§ўў§ћћўў§§њћ§ћ§ћ§§ўћ§§іћў§ў§ў§§ћ§§шћ§ћўћ§§ў§ў§ў§ўћ§ћ§ћ§§ў§ћћћ§ћўћ§§љћў§ўћўћћєўћ§ћ§ћ§ћўћўћћ§§ћ§§§њў§§љў§ў§ў§ўў§ѕћ§ћўћ§ћ§ћ§ћћ§§ћ§§ћфњўћћњћњ§ћћ§§ћ§ћ§ћ§ћ§ћћ§ўћ§§ўў§§ў§§яў§ў§ў§ў§ўћўћћњ§ћ§§ђћ§ћ§§ў§§ћ§ћ§њћћўўћћљ§ћ§ћћњўўќ§ўћ§§ћѕњћљњњў§ў§ў§§њў§§ћ§ћћѓў§ў§§њћ§§ћ§ћ§§ќћ§ћ§§ћќњ§§ћћ§іў§ў§ў§§ћўћћ§љў§§ћ§ћ§§ќћ§ћ§§ћћ§ћ§ћћќўћўћћўўћћ§§ћ§§јњ§ћў§ў§ўўі§ў§§ћ§ћў§ўўї§ў§ў§ў§ў§§№ў§§ћ§ћ§ћў§§ћўњ§њњћ§№ћўћ§ћў§ў§§ћ§ўў§ўўќ§ў§ўўђ§ў§ўћ§§ў§ў§ў§ўў§јўћўћў§§ћћ§їћ§§ў§§ћ§ћћћўћ§§ўў§љў§ў§ўћ§§шћ§§ў§ў§ў§ўћ§§ўћњљћљћљћњ§§єў§§ћћњ§њ§њ§њњћ§њў§ўў§§ў§§ўў§§ўћ§§ћћўћў§§њћ§ћўћ§§ћћ§ћўћћі§ћњњ§њ§њ§ћћ§ћњўћ§§ў§§њћ§§ћў§§ьћў§ў§§ћ§ћўћ§њћњўћ§ћ§§ѓћ§§ў§ўћ§ћўћ§ћћч§ћ§ћ§§ў§ў§ў§ўћў§§ћўћ§ћ§§ўўѕ§ўћ§ћ§њћћ§ћћю§ћ§§ћћ§§ў§ў§§ћ§ћўћћўњћћѕ§ћ§§ў§ўћў§ўў№§ў§ў§ў§ўћ§ћ§ћ§ћ§§ѓћ§ћ§ћ§ћ§ћ§њ§ћћ§§ћ§§ќћ§§ћћяўћ§љћљњћћњў§ўћ§ћўўъ§ўћ§§ў§ў§ўћ§§ў§ў§ў§ў§ўў§ћ§ћћіўћўњўћћњ§њњћљњўћћњўћћўы§ў§ўћў§ў§ў§ў§ћћў§ў§ў§§ўћ§§ўўћћўўћћљ§ћ§ћ§ћ§§ђћ§њћћ§§ўћўћ§§ўў§їў§§ћў§ў§ўўќ§ў§ўўѓ§ўћњћ§§ўњћћў§§љћ§ћўћ§ћћщ§ћћњ§њћћў§ў§ў§ў§ў§ў§ўћ§§љћ§§ћ§ў§§ћў§ўћ§§ьў§ћћ§ћў§ўћ§ћћњ§њњћ§ћћјњћ§ћ§ћ§ўў§§ў§§њў§ў§ў§§љћў§ў§ўћћ§ўў§§їў§§ћњњ§ћ§§ћњ§њ§њњќ§њњћћэ§ћў§ўњўћ§ћ§§ў§ў§ў§ўў§§ў§§ћћў§§ћћёў§ћћ§њ§§ў§§ћћ§ћћћњћњўћћњ§љњћ§ћћљ§њњ§њћ§§ыў§ў§ў§ў§ў§ў§ў§ў§ўћў§ўў§§ў§§ўўћћшњћўћћњћњћ§ћњўњўћ§ћ§ћў§ў§§їўћў§ў§ў§ўў§№ў§ўћ§§ћњўћ§ћ§§ў§§яћ§ћ§њћњ§њћњ§њ§§ў§§ўј§ў§ў§ў§ўў§іў§ў§ўћ§ћ§ћћ§ў§ыћў§ў§§ћ§ћ§ћ§ћ§ћ§ўў§ў§§ў№§ћ§ћў§§ћ§ўўћўњ§ћћ§ћі§њ§ћўћўћћ§§ќў§§ћћ§љў§ў§ў§ўўћ§ў§§ћћ§ўў§§ќў§ў§§ћўўћћѕўћ§ћћњћ§§ћ§§§ћўћћ§іўћ§ћўњћћў§§ў§§ў§ўў§іћ§ћ§ћўћўћ§§§ў§ўўэ§ў§ў§ў§§ћў§ўћћњ§љћњњћћ§ў§ўўќ§ў§ўўѓ§ў§§ћўњћћ§ћ§ћћ§ќћ§ћ§§ѕћ§§ў§ўћ§ћў§§їћ§њћњ§ћ§ў ўќ§ў§ўў§љў§§ћћњ§§јў§ўћў§ўћћјў§§ћ§ћўњњќўћў§§љў§§ћ§§ўўі§ў§ў§ў§ў§ўўќ§ўћ§§іћўћћњўћ§§ўў§љћ§ћ§ћўћћ§ўўћћкњўћћўў§§ћ§§ў§ў§ў§§ћ§§ў§ћћњњ§њћћ§ћўћ§њћћјњ§љћњўћ§§ћћ§§ў§§ўћ§§ћњћћ§ўўќћ§§ўўѓ§ў§ўћћњћћўњ§ћћў§ћћњўњћњћњњќ§њўћћєўћў§ў§ў§ў§ў§§цўњ§њћ§ў§ў§ў§ў§ў§§ћ§ћўћў§ў§§ећ§ћ§ћ§ћ§ћ§њ§њћћўћўћ§ћ§ћ§њўћ§§ў§§ћћ§§ћ§ћ§§ў§§јћ§§ў§ў§ўўъ§ў§ў§ў§ўћ§ћ§ћў§§ћћњ§ћ§§яў§§ћўћћ§§ћ§ћ§ћ§ћ§§ўш§ћ§ћў§ў§ў§ў§ў§ў§§њ§§ўћў§§єћ§ћўћўћ§ћ§ћ§§ћќўћ§ћћўў§§љў§ў§§ћўўј§ўћ§ћў§ўўњ§ў§ў§ўў§њўћ§ћў§§ўў§§ћ§њў§§єўћў§§ћћ§§ћћўўќ§ў§ўў§ўќ§ўћ§§§ў§ўў§љћ§ћ§ћў§§ўћ§§јў§ўњ§§ў§§ўђ§ў§ў§ў§ўћ§њћћўўј§ў§ў§ў§ўўћ§ў§ў§§іўћўћћ§§ћўћћќ§ћўћћўѕ§ў§ў§ўћ§ћўћћєў§§ћ§§ўћ§§ў§§ќћў§ўў§њћўњ§ћ§§ёћ§ћњћўћ§§ћћ§§ћњњћћўў§ўў§їў§§ћўћўў§§ћљњўћћ§§ћћњў§§ўў§§њў§ў§ў§§ўўћћ§ўћ§§§ћўћћ§ў§ўўї§ў§ў§ў§ў§§ў§§ћ§ћћяўћ§ћ§ћћњ§њ§њ§ћ§§ўўђ§ўћ§ћ§ћўћ§ћ§ћ§§ќў§§ў ўі§ў§ў§ўћ§ћ§§њя§ћћњўћњљњњ§ћ§§ўћўўъ§ўћўћ§§ћћўћ§§ў§ў§ў§ў§ўў§јћ§њ§њўћ§§ћи§ў§ў§§ћўћ§ћ§§ћњ§ћў§§ћ§ћў§ў§ў§ў§ў§ў§ў§ў§ўўь§ў§§ћ§ћ§ћ§ћ§§ўћўћ§§ўўћьњ§њ§ћўћ§§ў§ў§ў§ў§ў§ўўќ§ў§ўўќ§ўћ§§јћ§ћўћ§њћћі§ўћћњћњћћ§§чћ§§ў§ў§ўћ§ћ§§ў§ў§ў§§ћў§ў§§ў§§ў§§љћ§§ў§ў§§јћ§ћўћ§§ћћмўћ§њ§ћ§ћ§§ў§ў§ў§ў§ўћўћўћ§ћ§§ў§ў§ў§§ўўї§ў§ў§ў§ў§§ћў§ў§ўў§ђћ§њ§њ§ћ§ўў§ўћ§§ьћ§ћ§ћ§ћў§ў§§ћ§§ў§ўў§§ўў§ўў§ћћ§ћ§ўўќ§ўћ§§ўћ§§ѓћ§§ћћўћ§ћ§ћ§ћћ§§ў§ўўў§ўўї§ў§ў§ў§ўћћѕ§ўў§ўћ§ћў§ўўњ§ў§§њћћќ§ўў§§ћяўћўћўћў§ў§ў§ў§ў§ўўћћ§ћў§§еў§ў§ўњћњћ§ў§ў§ў§ў§§ћў§ў§§ћ§§ў§ў§ў§ў§ў§ў§ў§ўўњ§ў§ў§ўў§ўў§ўў§ћњ§ћў§ў§§ѕў§ўћў§ў§ў§ўўў§ўўќ§ў§ўў§љў§§ћў§ў ўќ§ў§ўўў§ўўё§ў§ў§ў§ў§ў§ў§ў§§ўў§§§ў§ўўёћ§ўўћ§ћў§ў§ў§ў§§ўќ§ў§ўў§§ћў§§цў§§ћўў§ћў§ў§§ћўћ§њў§ў§ў§ў§§яў§ў§ў§ў§ў§ўћ§ћ§§ўў§ў§ёў§ў§ўћўћ§§ўћ§ћ§§ўћ§§ќћў§ўўѕ§ў§§ћўћ§§ў§§ўќ§ў§ўў§§ћўћћ§юў§§ћў§ў§ў§ў§ўћ§§ў§§ў§љў§ў§ў§ўўў§ўўі§ў§ў§ўў§ў§§ќћ§ћ§§ёў§§ћ§ћўћўћ§§ўћ§§њћў§ў§ўўњ§ў§ўћўўі§ў§ў§ў§§ћ§§ўў§§ўўћћ§їў§ў§ўћ§ћ§§љў§§ћў§ўўє§ўћ§ћ§ћ§ћў§ўўќћ§§ўўў§ўўі§ў§ў§§ћўћўў§ќў§ў§§ ў§ўў§ўўќ§ў§ўўў§ўўў§ўўў§ўўў§ўў§ћў§ў§ўў§јћ§ћ§§ў§ў ўќ§ў§ўўў§ўўќ§ў§ўўэ§ўћ§ћћњћ§ў§§ћўћўћ§ћћ§љў§ў§ў§ў ўќ§ў§ў§ўћњњљљїѕїњљћћ§їњљљѕїј§љћћіљјїјћћљћљ§§ўћ§њ§§ўў§ўљћўљћћїљњњ§њ§њљўўъћњћћњљїѓєљ§љљњјњѕјљ§њў ўё§ћљњћћљјњњћљћћ§§ўњ§§ќњ§ћљљћѓљњљєѕяяёїљћћњњћљ§њћўўѕћўћўў§њљўћўўўњ§§ћњљќћ§§ћ ћэјїєѓѕјѕєїћ§§ўћўўћћўў§ћ§ўћўўђћўљћњјњљ§ўўњў§§чњўў§§љћњњљњ§ћїњњјњћљћћ§њ§§ќњћўњњљ§љ§њ§ў§§ўћ§§ўѕјњћљљћљћ§§њњњљ§љјљ§§љіћјјїјјљљ§ўў§§ћљћћ§љ§ўў§ўљћћцјљ§ўћ§ћњћћјњјњћћ§ћ§љћћљ§њ§§ќњ§ћјјќћ§§ўў§ўўћўўћњ§њ§ћћћљћјјћћяљ§ћјњћ§њ§ћљћћњњћљљ§ћ§ћћ§њњ§§њ§ўўёњ§ћљњњ§ћћљћ§§ћўўћ§њњјњњїјњћћљњћћ§§ћ§њћљћ§ў§§ђћњўњњ§њњ§§љ§њ§§ўќћјјїїјћўљћћі§њћј§њњ§љ§§ўўћўў§ѕњўћўћћњўў§ўўѓ§ћљ§§ўўњўў§ћјјіљјјљјћ§§ћњњєћњћћ§§њњ§ўћ§§ў§ўћўўћў§їњ§ћћњїјјћћў§ћћўљћћњђљјћћњњљјњјјѕ§ў ў§ћњ§§§ўћўўњћњћ§ьљћњјїљїїљїњљњ§ћјњјљ§§їњ§ћћњћ§§ў ў§њћњ§ўљњњћљљћјљљћ§§юњїїѕјљљћјљћ§њ§ћљљћћјњјљ§§ўћњњйћўўћћўўњљћћљњјњњїїљїњћ§ћљћћ§њ§§љћћљљћћљљўћ§§ўљћћўљћћ§ћћ§љљћ§§ќћ§§ўўўњћћјьњјјћ§љјћћљћ§§њћћљљњ§§ђњ§§њ§§ўћћў§§њ§§ўў§§ќњ§§ўў§њ§їљњ§ћљљћљћћїљїјѕїјјћ§§љјцїљљњљ§ћћњ§њљїјћ§§љћћ§јћћ§ўў§ћўњћћћјїљјњњћ§њ§јјэѕњњјїјћњ§њ§њ§ћћњ§§ћћёњјњјљ§ћўўћў§њ§њњї§љљћљљћћњњјљјћјјћљњјћћљ§њјћћіљјјњњўў§§ўў§ћњ§њљўў§ўљ§§ѓњ§ћ§§ћ§њјњћћ§§єћљћ§§њ§ўў§§ўўћћњњћ§§љњ§њћў§ўўќћ§ћўўіћўўћћјљћљћћхљћћ§њћњјљћћњ§ћћљћ§§љћћљћњ§љљіћ§ўћўў§њ§ў ўўјѕѕљїљњћјњћћјљїїѕѕїјћћѕјљћћљћјјћћ§§ў§њњљј§§ўў§§ўћўў§Шњїјѕђїћћљћњ§љљћљћћјћјјњњјњјљј§ћјљћћљљћњњћљњ§њ§§њ§§ћћњ§§ћћ§ўђћ§љњїїљјњњљјљ§§јњ§љјњћћ§§§ћў§§ўњўўїћўћўўћў§ћћ§ёњ§§њ§ћўў§јѕљїїѕѕїјљѕјћ§ћљ§§§ћјњњјћўњўў§ўќњ§§ўўќњ§§ўўоћўў§§њјњјїїљѕєјѕїїњјљ§§ћњѕїјћњњљљћћъњћљ§њ§§ўўћ§§ћ§њћ§§ћњ§ўўь§њ§§ћ§њ§їјћћњћљњјјњјјїољјћћјњњјљћљљњ§§њћўў§§њ§§њ§њњўў§њњ§§лћљњћ§§њ§њ§§ћњїјљљїљјїљјћљ§§ћћљљћњњїљ§§њўўћўў§ўћўўѕћ§§ћљћћљљћ§§щњєѓѓєѕљјљїѕѕљїјљ§ћњњјњљљјіњћ§њ§§њўћўўћўЯ§њ§ћљ§§ў§њўў§§ўњ§§љћѓєѓєїњњїїѕѕјѕѓёєѕѕїјћљ§§ћњњћ§§ўљћћљ§ћљћјљћћў§ў ўяљѕїєїјїњњћњјњљїїљљњѕїљњљ§§њ§љћ§§љњ§њ§њ§ўў§јљўўћўўћўў§ћўћћћјњјњћћљњћћљјѕєєњѕїљјљ§§ўѕњ§ўў§ўћў§§ўў§ќљћљ§§ўћѕ§њћњїљїѕїљјјїњљћњјњњћ§§љўћњ§њљњњъ§љјћ§§њњ§њ§§њ§њљћћњјћ§§ќўјњїїјјћћњљњјњњўјїїёј§ў§їїјљљћљњјћ§§ў§ўњ§§ўќ§ћјїїљќњћјњњћ§ўђњљљћћ§§ўўњњљћ§§ўћ§њ§ў§§ўў§ћћъ§њ§§њљћћјјњјїєљїљїјљћљљњљћќњ§§ўў§ўњ§§зћјћћ§§ћљїѕїјњ§§ћ§§ћљћћљљњјїїѕјћљћ§§ўўћўћўўўћўў§ћїљћњњў§ћњўўѕ§њћљљј§љјјњњыљїљїњћћ§ў§њњљњўў§§ўћўўъћў§јљњњ§њ§ўўњћћњњ§§ўћўўўћ§§ањ§љљњћ§§ћљљћћјїљњїњњћ§§њћљћћњ§њўў§њљ§ѕљћ§§ћњ§њ§ўў§ёњ§§њ§љљјћ§§ћўўћћїљћћњјїњјћћєљћ§ћ§њћ§ўўћўў§ўњўўњћўў§ћ§§ўў§ўў§ў§єў§§њѕїїѕњјјћћјђћјїњјћ§њ§ўў§њ§§§њ§ўў§ќњ§ћўў§§њ§§ћўћћў§§њј§ћїјјќћ§§ћћэ§ћњјћњћѕљћљ§§ўў§њ§ўўўњўўўћўўўћўўљ§ћћљћ§ўў§њњјњјљћћќ§ћћјј§њ§ўўђћўўњћљћ§ўў§љ§ўўўћўў§ўљ§§ћњ§§њ§§ћњ§§љњњјіћ§§њ§ўў§њ§§ўњў ўќ§њњўўўњ§§ўєћў§§ў§§ўў§ћјјћўњ§§ў§ ўјљњ§њ§ў§јјљћ§њюљ§ўўћћўўњћњјљњљ§њўў§ўўћўўљѓјћћњћў§§њ§§њ§§ќў§ћ§§ёљїјћћ§њўњћљ§§ћўўћњ§ўўћћј§ўў§§њњ§§ўћўў§§љ§§§їњўўћћўў§ћћўўћўўўћўў§№њјїїњљћћ§ўњћ§њ§ўў№њћљљ§§ўў§њ§љћњ§ћћў№ћўћ§њўћћўћў§њўў§§іњ§ћ§љћћ§ў§§ѓњјљћњћњ§њўћћўўћћ§§њўўќћўћўў§§њўўћўќћўўћћќўћ§ўў№њ§§ўўћћјјљћ§њўњў ўўћў ўљћўћўњњўўўћўўўћўўўћўў§љљ§ћ§њњўўњ§љј§§њњўћўўћў§ћўћћўњћћ§ўњ§ћћњћўўўћўўј§њ§§њўњўўђћўћўўњњ§ў§њњ§ўўўњўўўћўўњћ§њ§њ§§ќњћљћћ§љљћ§љљћ§ўў§ўўћўўќћўћў ў§ўњў ўўћ§§§љћ§§ўњў§ћћњљ§ўўњћњњљ§ўўћћњ§§ўўњ§љ§ћ§ћћўњ§ћ§њћўўљћўўћћўћћўќћўўњњљћўћўўњў ў§ьўћўў§ўў§њћљћњћўћ§њ§ўўћћўћћўўўћўў§§њўўћћњјљўўљњњўўњћўўјћў§§љ§§ўў§§ўћўўћўўњ§§ћ§јњўў§ўћ§њћј§§ўћўўіњљјљ§њўўћўўўћў ўўћ§§ћ§њы§ћњ§§њ§§љћ§ўўћћўўћўћ§§ўћєў§њ§ћўўњўћ§ўўњћ§љўћўў§ўњўўќћўћўўћњљћ§ўўхћњ§ћљ§ћћў§§њњћ§ћћў§ћўў§§њ§ўўћћўўљўўўћўўћћў§њћћ№ў§§љћ§§ўўћ§§њњ§ўўўћў ўќ§њћ§§ќњ§§ў ўўћўўёћўўћўћў§§ћў§§њўўўћўў§ђњ§§ћ§њўўћћўўћўўўћўўўћў ўѓ§ўўћњї§ў§љњњљљћњўўћўўћўўњ§ќ§ћћљљђјљњљњћћњћњћњћњњщ§ћ§§ћјјљњћўњћњјїљњћњћњћћёў§ўћ§ћ§§ў§§ћў§ћћіњћњћњћњћћ§§ћў§ў§ўўъ§ћњљјѕїљћ§ћћљњљњњћћ§§ўўњ§ў§ў§ўўћєјљњњћњљњњћњћћ§ўћ§§ўњћћёњћћљјїєђюѓѕјњћљљћў§ўў§§ў§ўў§ућ§ћ§њћњћњњљћћњћ§њћњћњћњћњћњћњњєљјѕєїјјљћћ§ўўѕ§ў§§ћћњ§ћ§ўўо§ћњљњљћћўў§ўћ§ћ§ўўћ§ћњљљћ§ћћњљљњљћћўњ§§ћћ§§ў§§ћњ§ћўћ§ћћї§ћў§ў§њљћћњњћњ§ћ§§ѕў§ћњћ§ћ§ћ§ћћњљљњњћћ§ўў§іћњћћњћћ§§ўўзћ§ћћњћњ§ћ§§њћћљћњњљњљњњ§ў§ћћњћћ§ћ§ћ§ћ§ћћњњ§§ћўўћў§ўўў§ўўі§ўў§ћ§ћњњћћњ§ћњћћќњљњ§§јњћњњљљњћћєњ§њћњћњ§ћ§ћ§§ўћ§ћњћ§§љњћћњћ§ўўьћљљњљњљњљњњљњћћљњњћ§§ћъњћћ§њћњ§ў§ћ§ћ§ћњ§ў§§ћ§§ћя§ћ§ћ§ћ§ћў§ў§ўўњњљљњћјњћњ§§ћћ§§ћѕ§ћ§ћў§ў§ў§ўўў§ўў№§ў§§ћ§§ў§ўў§§ўћўўє§њћћ§ўў§ўў§њњіћњњјњњ§ћћљљљћ§ћњ§ћ§§ўўћћњ§ћ§§ўћћ§ў§ўўј§ў§ўў§ћ§§њ§љћњњўћњњћ§њћњћћьњћљљјњњћљљћњљњ§§ћў§ўўє§ў§ў§ў§§ћ§§ўўќ§ўўљљжњћњњљњњћћ§ўњљњљјљљјћљћ§§њњљњћ§ћ§ћ§§ўў§њћћўўў§ўўѕ§ў§ўўћ§§ћћ§§ўћљљњћю§ћћњћ§ћ§ћ§ћ§§ћљњњћћьњћњ§§ћњћћњњћљњћ§ћўў§§ўў§ўў§ћћњћ§њљљќјљљћћњ§ћўњћћўњћћѕ§ћ§ћ§ћ§ћћњћћюњћњ§ћћњ§ћћњ§ћ§њћћўўј§ћњћњњљњњћіњћњћњ§ћ§њћћ§єћ§ћ§ћ§ћ§ћ§ћ§§ўћўўё§ћ§ћ§ћўћ§ћ§ћ§§ўўќћ§ћ§§эћў§§њћћњћћњћњћњњљљњњњ§ћ§ћћњњћ№ў§ўћњњ§ћ§ћћњћћ§ўў§њ§хў§ўћ§њћњћљњњћњњљјњљљњњћ§§ћњњљћњљњћ§§њ§јћњњћљњљ§§ў§§ў§§ћњњћћњњљљњћњћўљњњћўљњњћ§љў§§ћў§ўў§ћ§№ў§ў§§ћў§§ћ§ћ§ћ§ћћђ§ў§љњљћњ§ћ§ћњћћ§ќўћ§ўў§њў§ћ§ћ§§ў§ўњћў§ў§ўўњї§ћњћћњћњћћчњ§§ћљњћћњ§ћњњћњ§ћћњњћњ§§ћћќњ§§ўўњћ§ћў§ўўђ§ў§ў§ўўњљњљљјњњќљњњћћљљјјљњћњњћ§њћњњяћњ§ћ§§ў§ўћ§§ћ§§ћўўњћ§§ў§ўў§ѓћљљїјљљћњћњ§ћћќњћћњњљѕњљњћ§ћћњћњћћіњ§§ўў§ћ§ћ§§ћёњ§ћ§њћњ§ћў§ўћћљљђјњљљјњћћ§ћ§ћћњњћя§ћў§§ћ§ћ§ћ§§ў§ў§ўў§јњћњћћ§ћ§§ќћ§ћўўљћњљјљљјјљњћќ§њњљљњј§ў§ўў§ћўў§ўћўўќ§ћћўў§ўћњњљјїўјљљѓњћ§ћћљњљњњ§§ћћхњћњљњћћ§ћ§§ўў§ћњћ§њ§ћў§§ўў§§ћњ§ћљњћњњ§ћљњњљїјњњћњњљњћћ§іћ§ўў§§ћ§ћ§§ўўћ§§јћ§њћљћћ§§ћљфїјјљјњљјњћћ§ћћњћћњљљњћћ§ћ§ћ§§§ў§ўўю§ў§§ћў§ў§ў§ўћ§њћњћћьњ§ћ§§љѕѕїјјњјљљјјљњћћљ§њљћћњ§љњ§§јћ§§ў§ў§ўўќ§ўў§§ќњћћ§§ёў§§ћў§§ћћњѕѓѕїљљјцїјїјїјјљњћћ§ћњљљњћћ§ћ§ћ§ћњњћњњ§ћњћњњћ§ўў§ўўў§ўўјћѕїѕїљљјњљњљјљљјјїњљјљћћ§ћ§§ћэ§ћ§ћ§ћ§ћў§ўћ§ћ§ћў§ўўќ§ў§ўўњћњћњљњњяћњћљћњћњјѕїїјљјњћћ§§ћўў§ўўћўўоћ§§ў§ў§ўћ§ћ§ћњћ§ћ§ћў§ћњ§§ћљљјљњљјњњ§љћњњєљњћ§§ўў§ћ§ћ§§њћњњ§ћ§§эћ§ћ§ћћњљњћ§§ћ§ћ§§њљљьњћњљјњњљљњњћљљњ§ў§њћћѓњћљњњ§§ћ§§ў§ўўњ§ўћ§ћ§§ќћ§ћўўњ§ўћћњљљјѓљћњњљњљћњћћ§ўўє§ћћњћћ§§ў§§ћћг§ћ§ћў§ўћ§ћўћ§ћ§ћў§ўћћњћћ§ћ§§ћњћњњљњљљјљјљњћњћћ§ћњњ§ћ§§ўўё§ў§§ћ§ћ§ћ§ћ§ћ§њњћі§њјљјљњ§§ћћэ§њћњћјјљњљћљњњћњ§ћўўў§ўўў§ўўђ§ў§ў§ўћ§ћ§њћњћћ§§њ§ўў§ћ§ўћњњљіјљјљљћњ§ў§§ўњћ§§ў§ўў§ћ§ђћ§ћўў§њњ§§ћ§§ўўљ§ўћ§ћ§ћћќљњ§ћћђњћњљјљћљљћћ§§ћћяњ§ћ§§ўћ§ў§§ћњ§ћў§§ўњћ§ћ§ћ§§ўўћћў§ўўюћњњћњњљњљљњњћњћћњћћќ§њ§ўўќћ§§ўўљ§њћћ§§ўўўћўўѓћ§ўў§§ћўћ§§јљљњљћњћљњњ§§ў§ћ§ћћ§§ћ§§ѕў§ў§ў§§ћ§ћўў§§ћ§ўўћ§ўљњњўћњњћщ§њћњ§њљњњ§њ§ћњћћ§§ўћ§ћўўў§ўўљ§њњћњћўўёћ§ћљњљњћњћњњћћњњ§ўя§њћњ§§ўћўћў§ў§ў§ўўў§ўў§јћ§ћўћ§ћ§§іћ§ћ§ћ§ћ§ћљљњўћ§§ќўћ§ћћљ§ћ§ћ§§ўўў§ўўњ§ўћ§§ўўэ§ћ§ћћўў§ўў§ћўћ§ўўћњњњћњћ§§ћћўњћ§ћў§ўўў§ўўљ§ћ§ћўћњњћњљ§ћ§§ћћўўіљњљњћ§ўћ§ўўј§ў§§ћ§§ўўў§ўўћ§ўўћњњћ§ўўћ§§њћ§ћ§ћ§§љњ§ћ§ћћњњћ§ћњћћ§ўўќ§ў§ўўў§ўўў§ўў§ўћўўњћўў§ћ§§ќћ§ћўўіћўћ§ћў§ў§ўўўћў ўў§ўўњ§ў§ў§ўўћћ§§њљљћћњћћўў§ўћўў§љњћћ§ћў§§ћћњ§§ўўў§ўўњ§ў§ў§ўўќћ§§ўўьћ§ўўћ§ћ§ћўћћњњћўћ§ћ§§ћћњљћ§§ўі§ў§ў§ўћ§§ўўћ§ўћ§ўўўћўўі§ў§ў§ћћўўњњћћњ§§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ўў§§ў§ўўў§ўўњ§ў§ў§ўўќ§ћўћћ§ўћ§§ћ§§ўќ§ў§ўўў§ўўў§ўўњѓ§њћњћћў§§њћ§ўў§јћ§§ў§ў§ўў§јћў§ў§ў§ўўё§ўћ§ћ§ћ§ћ§ћ§њћњњћў§ћћўњћћѕњћў§ў§§ћ§ћўўў§ў ўў§ўўњћ§§ў§ўўќ§ћ§ћћќ§ћ§ўў§ўў§§ћў§ћћўўј§ў§§ў§§ўўё§ўў§ћ§§ў§ў§§ћ§ћћ§њћўўї§њ§§ў§ў§ў ўќ§ў§ўў§ў§ ў§їћ§ўў§ўћў§§ћј§ў§ўћ§ћў ўў§ўўќ§ў§ўў§§ў§§§ў§ўў§ўћўўў§ўўў§ўўњћ§ў§ћўў§ћ§ўў§фћ§ћ§њњћ§§ў§§ћўў§§ћћ§ћ§ўў§ў§ўўј§ћњћћ§§ўўў§ў ўў§ўўњ§ћ§њћњњ§§ћ§§єћў§§ћ§ћ§ћњћўўќћ§ћўў§ўј§ўўћў§ў§§ўћўўі§ў§ўћ§§ў§ўў§ћњў§ўў§ћћѕ§ўў§§ћ§§ћћўўўћўўћ§ ўў§ўў§ћ§ўў§ћ§ћћ§ў§§ћ§§ўќ§ў§ўўњ§ў§ў§ўўў§ўўў§ўў§ѕњћ§ћ§ћ§ћ§§ўўќ§ў§ўўў§ўўќ§ў§ўўіћ§ўўћ§§ў§ўўђ§ў§§ћ§ћћњћ§ў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўўћўўї§ўћў§ў§§ћћ§ўў§ўў§ћћ§ўћўћћ§њ§њњї§ћ§ћ§ћ§ћ§§эў§ўћњљњћў§§ћ§њљњћћ§§ўћўўќ§ў§ўўў§ўў§ќћ§ћ§§єћ§ћ§§ў§ў§ў§ўўјћ§ћ§јњљ§§їўћћњўћў§ў ўќћ§ћ§§ќњћњ§§ўћўўљ§ў§ў§ў§§щў§§ћўћ§јљѕѓїњњ§ћўћўћў§ўўќ§ў§ўўѓ§ў§ў§§ћ§ћ§њћ§§ьў§§ћ§ћ§ћ§ћ§ћ§ћў§ўњћљљћћ§ћў§ўўј§ўћ§§ў§ўў§ќћўћўўќ§ў§ўў§ћў§ћўћћї§ћ§§ў§ў§ўўј§ў§ў§ў§ўўњ§ўћў§ўўћ§§ћ§§№ў§ў§ў§ўћў§ў§ў§ў§§њўћ§ћћ§§ўі§ў§ўћ§ћ§§ўўњ§ўћ§ћ§§ќў§ўћћў§ћћ§№ў§§ћ§ћў§ў§ў§ў§ўћћљўћўћў§ўўў§ўўѓ§ўћ§ћћњ§ћ§§ўћћђў§ў§§ћ§§ўћ§§ў§§єћ§ћ§§ў§ў§ў§ўўђ§ў§§ўў§§ћ§§ў§ўўћёњћњћњћћ§ћўћ§§ў§§њўћ§ўў§§їў§ў§ў§ў§ўў№§ў§ў§ўћў§ў§ў§ў§ўўћњњ§њћћ§§эўћ§ћ§§ўћў§ў§ў§ў§ў§ўўќ§ў§ўўў§ўў§ќћў§ўў§ћўњћћњ§ћў§ўћћїўћ§§ў§ў§ўўќ§ў§ўўћ§ў§ў§§ћћўћ§ћ§§ъћ§ћ§ћ§ћўћ§ћ§ћўћ§ћўћ§§ў ўќ§ў§ўўћмўћ§њћ§§ћў§ў§ћћ§њ§њ§ћўћў§§њћћ§§ў§ў§§ўў§љўћў§ў§ћћўњ§§ўћ§§юў§ў§ў§ў§ўћ§њўћ§ћћ§§ў§њћўћ§§ўўќ§ў§ўўњ§ћ§ћўћћњя§њўћўћ§§ў§§ўў§§ћ§§цћ§§ўћў§ў§ў§ў§§ћўћ§ћ§ћ§§ўћ§§љћ§§ў§§ўў§ћ§ћћќў§ўћћх§ћ§§ў§§ћ§ћў§ў§ў§ў§ў§ў§ў§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўўї§ў§ў§ў§ў§§шћ§ћ§§ўћ§њўћ§§ў§§ћўћўћў§ўў§ќў§§ћћ§ў§ўў§§ў§ўў§цћ§ћў§§ћ§ћ§њћћўњ§ћў§ўћўћўњћћїњћћў§ў§ў§§њў§ў§§ћћќ§ў§ўўќ§ў§ўў§ўћ§§ћєўћ§ћ§ћўћ§ћћ§§ќћўћ§§ўћ§§ўў§ўў§ўњ§ў§ў§ўўю§ўў§§ў§ў§ў§ўћў§ў§ћћѓў§ў§ў§§ћў§ў§ўўў§ўўі§ў§ў§ў§ў§ўўў§ў ў§ъў§§ћ§ћ§ћ§ћ§§ўћўћ§ћ§§ў§§јўћ§§ў§ў§§ўў§§ўў§ў ўсћ§њ§њ§њ§ћћ§§ћ§ћ§љћњћћ§§ўћ§ћ§ћ§ћћ§§ў§ўўњ§ўћ§§ўўў§ўўі§ўћњљћћ§ћ§§чўћў§§ћ§њ§ћўћўњўћ§§ўћў§ўћ§§ў№§ў§ў§ўћ§§ў§§ћ§§ўўш§ћљ§њўћўњўћў§ў§ўћўњ§ћў§ўўј§ў§ў§ў§ў ўђ§ўћўћў§ў§ў§ў§ўў§ћ§њњјћљћљћњ§ћћђўћћњћћўћ§ўў§§ћћўў§§ўў§ўў§ ўљ§ўњћњћњњпћјћљ§њћћ§§ўћўњ§њ§§ў§§ћ§ћ§ћ§ћў§ў§ўўј§ў§ўў§§ўўў§ўўж§ў§ўћў§ўњўћ§њ§ћћњћњўћћњ§њ§ћ§ћћњћћўћ§§ў§ў§ўўі§ў§ў§ў§ў§ўўћ§ў§ў§§№ўћў§ў§ў§ўћћњћњ§њњћ§эўћўћ§§ћћўћў§ў§ў§ў§ўўў§ўў§ќћ§ћ§§ќў§ўљљ№њљњњ§њ§љ§њћћўћўћћѓ§ћ§ћўћ§§ў§ў§ў ў§њћў§ў§ўўў§ўўю§ўћ§љјљњњћћ§њћљћљњњэљћњћћ§§ў§ўћ§ўў§ў§ў§§їўћў§§ћ§ћ§§ ўѕњљјњјћњћћ§ћћњў§њњї§њўћў§ў§ўўіћў§ў§ў§ў§ўўќ§ў§ў ў§ћ§ћћ§ўњ§§юћ§ћўћ§§ўљ§јњљ§њўћўўў§ўўў§ўўў§ўў§§ў§§ћў§ў§ўўљћ§§ўћћњњћ§єњћњћ§ў§§ўў§ўўв§ў§ў§§ћў§ў§ў§ў§ў§ў§§ћ§ћўћ§§ў§ў§ўћћњ§њ§њћћ§ћ§њћћѓњћћ§њћ§ў§ўћў§§ћ§§ў§ўўј§ў§ў§ў§ўўћњњ§њ§њћћіњўњћћ§ћў§ўўј§ўћ§ћў§ўўљ§ћў§ў§ўўў§ўўќ§ў§ўўѕћ§ћў§ў§ўћ§ћћє§љ§њ§њўћ§§ў§§ў§ўћўўў§ўўў§ўўк§ў§ў§ў§§њ§ћў§ўњ§љ§ћў§ўћў§§ћ§ћ§њўћ§ћ§ћ§§ўѓ§ў§§ћ§ћ§ћў§ў§§ўќ§ўћ§§№ћўњћћњњ§њћћ§§ў§ўўў§ўўќ§ў§ўўў§ўў§љў§ў§ўћўўэ§ў§ўћўћ§§ўћўћ§ћћњ§ћћѕў§ўћ§ћ§§ў§ўў§§ў§§ўќ§ў§ўўђ§ў§ў§ў§ў§ўћў§ўўўћ§§ёћўњћћ§ћ§ћ§§ўћў§§ўў§ўў§ўў§ўўў§ўўў§ўўљ§ўљ§њ§ћћќў§§ћћљўћ§§ў§ўўў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ўўї§ўћўћ§ћўћћћў§§ћ§§єћў§ў§ўћ§ћў§ўўў§ўў§ўь§ўћўћў§§ћ§§ўћ§ћў§ў§ўў§ўщ§ў§ў§ў§ў§ў§ў§ў§ў§ў§§ћўћћљў§ў§ў§ўўў§ўўњ§ў§ў§ў ўў§ўўќ§ў§ўўў§ўўў§ўўў§ћћ§њћ§ћў§ўўў§ў ўў§ўўїћўћўћ§ћў§§ћў§ў§ўўњћ§ћў§ўўў§ўўў§ў ў§§ў§§ўѕ§ў§ў§ў§ў§ў§§їў§ўћўћўћўў§ќћў§ўўў§ўўј§ў§ў§ў§ўўќ§ў§ў)ўі§ўћ§њўћ§ћўў§ў§ќћ§§ўў§§ў§§§ў§ўўў§ўўў§ўўќ§ў§ўўќћ§§ўўћ§ў§ў§§ћўћў§ў ў§ ўў§ўў§ћ§7ўј§ў§ўћў§ўўј§ў§ў§ў§ўў§§ћ§ўў§ўћўўњ§ў§ў§ў ўј§ў§ў§ў§ўўі§ў§ў§ўў§ћ§§ћћў§ў§§ўў§§ўќ§ў§ўўў§ў ўі§ў§§ћў§ў§ўўў§ўў§ўўћўўќ§ў§ў ўў§ўўњ§ўћў§ўў§ўќ§ў§ўўќ§ў§ўўњ§ўћ§ћўўў§ў ў§ўў§ў ўќ§ў§ўўў§ўўћ§ў§ў§§§ў§ўўў§ўўј§ўћў§ў§ўўњ§ўћў§ўўњ§ў§§ћ§§ћў§ў§ўўћ§ў§ў§§ ўў§ўўќ§ў§ўўў§ўўў§ў ў§ўћўўњ§ўћў§ўўњ§ў§ўћў ўў§ўўў§ўўњ§ўћў§ўўў§ўўў§ў-ўє§ў§ў§ў§ў§ў§ў%ўў§ўўў§ў ўї§ў§ўў§ў§ў&ўљ§ўў§ўў§§ўўї§њ§њўћћњ§§іћўўћў§њ§њўўўћўўў§њњўўћўўў§ўўѕћў§§њ§љјјљ§§ўњ§јўћўўћўўћћўћ§ўћўўѕњћјљћјњљњ§ўў§ў§єљћњ§§љјјћњњ§§ђњ§ћћўўћњўћў§ў§§ћўњ§ў§§§ўћўў§ўќћўўњњќ§ўў§§љњ§ўўњ§ўўњњ§§ўў§§ўњўўѓћў§§љљ§њ§§њ§ўўќ§њ§ўў§ўњћўўћїћћўњ§њўўњўў§єўћћў§њў§њњ§ћћ§њ§ў ўњћњ§§ў§§ќњ§њўў§§ўћўўќћўў§§ўќ§њў§§јў§њўћћњўўќћњћўў§њљ§§ўћ§њ§ў§§ўњ§§њњўћ§ћљљ§ћњўўњћў§њћўўћ§ўљўўўћўўћыў§њљћ§љљњ§њћ§§ў§§ћ§њћћ§њ§ўўќћ§§ўўћєўњћўћ§ў§§њ§ћћў§ўўљћўўћўћўўњњљћћў§§ ў§њћўўі§њїњћљњњ§ўўљњ§§ћљћ§§њњћ§ћћ§§ўњ§ў§ўєњ§§ўћўљњћўћ§§ўѓ§њ§љ§ўўњ§ћљљ§§ѓљћњ§ћјњ§§ў§§ўўћђўћўћњњћ§њћјјљ§§іљћ§њћљљ§§ўўўћўў§эћњўўњ§љњњћљјћ§§њ§§ў ўљњ§§њўћўў§ўїњ§§љљўћћўў§ўўљ§§ьћљћљљњљћњћћљњ§њњ§§ћўўўћў ўћћўћ§ўў§§њ§§эћ§љћ§§ўў§љљњ§ћњ§ўў§§ћћ§§њ§§ќњўћўўћ§ћљ§ўўє§њјљњњў§§љњјјўљ§§њ§ўў§§ўќ§њ§ўў§љј§њ§љљћљ§§ўў§§ћўћўћўўьњ§љїїєѕјћћјћљљњћљћњ§§њћ§ўўћ§§ўћ§ўњ§љѕћљ§§ўўћўў§ўўўћўўё§њњ§ўўњ§§њ§ћњљћћ§§љћњњ§§ѕ§ўўўћўў§ўћўўќћњ§ўўћ§ћњїљњњљћћњ§ўўќ§њ§њњ§јўњњљћњћ§§њўўћўўќћў§ўўшњљ§§ў§§ћў§§ћћљљћћњ§§њ§§ўўі§њ§§ћ§§ћњ§§§њ§ўўћўј§њ§§њ§§ўўњўћўњўљ§§ќјљћјјњљњ§ў§љљ§њј§ўњ§ћўў§§єњљћљ§ћ§§љћћ§§§њћўўўћў ў§ћњ§§ћўў§ўўћўўѕ§њњћў§§ўћњљљ§љњ§њњ§§ўўњћњљњ§ўў§ўњ§§њ§ќњљљўўўћўўћўќ§њћўў§ўњ§§њћ§њњїў ў§ћњћљњўўэ§љјѕїјјљ§ў§§њўўњћћўўќ§њћ§§ ўњўр§ћљћ§ўў§ћїјјљ§ўў§§ўњћѕѓёђђѓєїњћ§§ў§єћїјњјћ§њћјѕјјћњљў§љљћ§ўљћћќљўў§§тњљњћњєэюяюѓљњљњўўћ§ћћ§ћљјћћљљ§§ўї§њ§§њўўћўў§ўњўў§§њўўњў№њљљїђьэьѕћљљћћљїїј§ћ§ўўјћўћ§љјњўўъњўў§љјљћјјљћњўўћћ§њўњ§§ўљ§§ёєёјђыюѓєѕњћљ§§ўў§њ§ўўёћўњљћњ§њљ§њњљ§ўўќњ§љ§§іњ§њњћ§§ўћ§§њћўьњєёёєћњњљљћћўћ§љјјњ§§ўўћўў§ўћ§§ўћ§§ћў§ћњ§§љ§ўћўў§ћњ§§љњљѓѓњ§ўўћћўўћўў§њў§§ў§ўњ§§њћљљ§њ§§їљјњњјј§њ§§№љћћљљћћњїѓяѓљћ§ўў§ћў§§ћјјљћћњ§љњ§§љћ§њљћ§ћћјљѓћў§§ўў§љ§§њћўў§љћїёѕјљ§§єљњњћ§љјјњјћ§§ыјћ§§њћљљћљ§њ§њ§§њћљћўўїњљљћћјљћўўњ§ћїїјљљћїјљљ§§ў§јћѕјњњћћљљ§њћьљћњјјљјјљћўњћ§љњ§њјћћ§ўњ§§њњћ§§ў§§њтљћ§§љљћњ§њљњљјјћ§§ћћљћљћљћљћљ§§§њ§ўўћ§њњў§§юў§њњ§љ§§ћўўњ§љљ§§ўўљ§љ§ћћњ§§юњѕћ§ћў§§ћћљјѕ§њњ§ўў§ћў§њ§ўўїњўњ§§њ§ћўўњ§њ§ўў§§њљќњћћ§§ёњўў§њљћљљњ§љћјћћќљ§њ§§їњ§њњ§ўўћўўљ§њљљ§ў§§іў§ўў§њ§§њ§§ў§ћјњ§ў§§ўћјјћњјїђѕѕћ§њ§§њњќ§њљ§§њўљ§§§љ§ўўљ§њљћ§ћўўњњ§њљљћћўљ§§єњљћљћћјљѕє§ўўўћўўўћўў§љљјјљїў§§љѓћњћјћљњњ§§јњ§§љ§ћљ§§ћјјћћљѕћ§ўўњћ§њ§§ўў§ѓјћ§§њњ§§њњ§§њњэ§ћљњњ§§ћљљћљјњјјїљћћљљѕ§§њ§њћћ§ћѓ§ўўћўњњ§ўћўў§§њћўћ§њўўўњўў§љћљјњњјљљјјїїљјєў§§њњ§њћћљљљћ§њ§ўў§§ўўћўўћћњћћљљћјїљїјјўѕїїѕщђїјјњїѕѕєє§њ§ћљ§ў§љњ§њўў§њњјљћњ§§љњ§ўњћћўў§јњћћјњњћ§§ўў§§№ћљїћњјѓёє§§њ§§ћўў§њ§ћћѓњј§њњ§њљћ§њ§јјўћ§§ўљ§§ћћљјњ§§ўњљљ§ћјљѕѓѓїњћўў§шњљћјљћљљ§ўў§ўў§ћўў§§љћћњњ§ўњ§§ћћљћљћћјќљјјћћњјѕѕєњўўє§ћљћљћ§ўњ§§ўўќњљ§ўў§љњ§§ћћ§§њјј§ўњћћљўјћћњјїјѕѕўўљљћћљљ§ўў§ќљ§§ўў§§њ§§§љ§ўў§цњїњѕљ§§љ§ћљћ§њ§љњїїѓѓ§њљ§ўўљњўўћ§љ§§ўњўљ§љћћљљ§§ўињ§љ§њ§§њњ§ћљљїїјњљљћјїєѓљћћ§§ћўћ§њљћћ§ў§§ќћўћўўѕћ§њњѕљћљћ§њњњљ§љњјћћљјыїѕѕєѕ§ћљћ§§њњ§њўњ§ўў§§њћўћ§њў ў§нљћ§§ћ§јїїљћјљљћћњњ§њ§њљїљѕўћўў§ћњ§ўўўћ§§ћњ§§њ§§њё§ўћўўњљјљњњћћљћћ§шљњћћљћњєўў§ўў§њјљћљћ§њ§ўў§§ћўў§§љїїїѕјљ§§њњљћћќљћљ§§їћјѕњњћ§ў§§ћћљјї§§ћў§§љ§ўўѓћў§њ§њўћ§§њ§ћћё§љјљљјїјјњјїјјљљћђљ§§ћјћљћћјїљћўўњњ§јјњўўњѕћљ§њљљњ§§јћћ§ўњ§§њїљћљ§њ§њњљљўјћћќњїѓўўўћўў§§њ§њњў§ўў§№њ§§ўў§љјјћ§§љјљћћэјљћ§њњћљћњјўўљњ§ўћўўўћўў§ў§њє§њ§§љћњ§њўўњњ§ўћўўќ§ћљћћўјїїўњ§§њљћљјїћћўќћ§§ўўјћ§њњ§§њўўњћјљћћљљчјњјјњј§њў§§љћљњњћћ§њњ§§ћјјќњјї§§ќў§њ§§ђўњ§ўў§љјјљћ§њ§§њўћљљќјѕѕєєњѕњљ§њўўќћ§њ§§ѕљћїјјњї§њћўўћћўћў§њњ§шљњњўћ§љљњ§њљљћћјњїѕѓєњљ§§яњћљћљљћњњ§§њ§љћїўўћ§њњћўўўћўўўћўў§ўўћ§§ўњљљћіљјјїѕљјћљћћћљњњ§ўўћ§њ§ћўўі§њ§§ў§њњљ§§њ§ўњўўњ§њ§љњ§јћ§љ§§ёњљјўў§њњў§§ћўў§§ўцћў§§њљ§љљ§§љљјѕћљљћ§§љљњјћћьљћљњћљћјљљ§§ћћљћњ§ћўўљѕ§ўўћћњ§§ћњўўќњ§ћњњ§ўјїїљјљ§њљљћћ§§њљћћыљћјњњјћў§ћўў§љ§њў§§ћўўљ§љјњ§§љљћыљћљјјєјћљљ§њўњ§љњ§§њћћ§ћ§њ§љљќћњ§ўўя§ћљљњ§ћљљћ§§њ§њ§љљў§ўў§ћфјњљљєїѕѕїјљ§§ћ§ћљћћ§§ћјјњњћ§§ўђћ§ћ§§ўў§ћ§ћў§ўўњћ§ћ§§ў ўќ§ў§ўўўћ§§ўј§ў§ўћў§ўўўћ§§ёћњњћћ§ћ§ўў§§ћ§ћћўќ§ў§ўўё§ў§ў§ў§њћћњњљћ§§љў§§ћ§§ўўћ§ў§§ћћ§њ§ћћњ§њћ§ћ§ћўўў§ўў№ћўћ§ћў§§ў§ћ§§ў§ўўњћ§§ў§ўў§ѕўћ§ћ§ћў§§ћўўѕ§ћћўўћ§ћ§§ўўў§ўўћќ§ћћ§§эў§ў§ўћ§ћў§ў§§ћ§ћў§ўўњўњћ§§ў§ўўќћ§ћўўї§ћ§ўћ§§ћњњ§§ћўўќ§ў§ўў№§ў§ў§ћћўћ§ћ§ћ§§ўўћ§ћ§ћў ўћў§їўћ§ћўћ§§ўўќ§ў§ўў№§ў§ў§ў§ў§ўћ§ћўў§§ђћ§ћћ§ћћ§§ўў§њћћќњ§§ўўў§ўўќ§ћ§ўўў§ўўў§ўўў§ўўў§ўўћћ§ћњћћѓ§ћ§њ§ћўћћњ§§њњђ§ћ§ў§ў§ўћ§§ў§ўў§ў§ќћ§ћњњўћўўњ§ў§ў§ўўє§ў§§ћњњўћ§ћўўј§ў§ў§ў§ўўћ§ў§ў§§їў§ўў§§ћ§ўў§ёћњћњћ§ћ§њ§њћћ§ћћќў§ў§§ќћ§ћўўќћ§ћўўь§ў§§ћ§§ў§ў§ў§ўћ§ћў§ўў§ћў§ћњћћ§ћћћњ§§њ§§јћўћћ§ў§ўўћ§ў§§њњ§ћ§ћћѕњћ§њћћ§ћў§ўўш§ў§§ћ§ћ§ћњ§ў§§ћћ§§њћњњћ§§ќћў§ўўј§ўў§ћћ§ўўђ§ў§§ћ§ћў§ў§§ћўў§§ћўўэ§ўў§ћ§њћњћћ§ћњљњњћ§§љћ§ўў§§ўўў§ўўў§ўўќ§ўћўў§ѕћ§њћўўћ§§ўћћќ§ћњ§§ўўћћїњћ§§ћћ§§ўўў§ўўћ§њћћўўћћ§ћћ§§ћўљњњћ§§ћ§§ќћ§ћ§§ѓћ§§ўўћ§§ўў§§ћћ§фўћњћћ§ћћў§ћ§§ў§ў§ў§ў§§ћћљјїњњђ§њћћ§њћњ§§ћ§ћ§§юћў§ўћ§ћў§ўўћћ§ћўў§§їћ§ћћњћћ§ўў§ўќ§ўћ§§ў§љћ§ћњљћњњњћњњћ§ћћўњ§§ќћљ§ў ў§§ћўўч§ћў§ў§ў§ўў§ћњњљљћ§§ћњњ§ћўўќћ§ћ§§цћ§ћў§§ћњљћћ§ћ§§ў§ў§ў§ў§ћ§ўўп§ў§ўў§§ћћўћћўўћ§њњћћњњ§§ћ§ћ§§ў§ў§§ђћўћ§њ§ћ§ћ§ћ§ћўўќ§ў§ўўѕ§ћ§§ћ§ћ§§ў§§§ў§ўў§љўћ§ћ§ћњњўћ§§ћћ§ћ§ћ§§эћў§§ўў§§ћ§§ћњћћўћ§ўўљ§ћ§§ў§ўўў§ўўў§ўўў§ўўє§ў§§ћ§§ћћў§ўўє§ўћ§ћў§ў§ў§ўўѕћ§§ўў§ћўў§ћћя§ћ§ћ§§ћћў§ўў§ћ§ћўўў§ўў§§ћ§ћћя§ћћ§§ћ§ћ§§ћћў§ў§ўўќ§ў§ўў§ўї§ў§ўћ§ћ§ћћ§ўў§ўўў§ўўіћ§ћ§њћљў§ўўћњєљњњћћўћ§ўў§ўў§ћњћ§ћўўў§ўўэ§ўў§§ў§ў§§њћњ§§ўћћњњћчў§§ћў§ћјяђєѓѕїљљћћ§ћў§ў§ўў§эћњљњљњњ§§њњљњњћ§ўўћћњњћ§ћ§ћњњъћў§§ћћ§ў§ћљљѕяюёѕјљћ§ўўљћњњ§њћњњћ§ў§ќћ§§ўўі§ў§§ћ§ћ§§ўў§ў§ыў§§ћћљѕюцюјњћћњњћњљљњњ§ўё§ћ§§ў§ў§ў§ћў§ћњњќћњ§ўў§пў§§ћ§ўћћ§ћ§ћњїёшёєјљљњўћ§§ў§§ћў§ўў§§ћњ§§ёўћ§§ўћў§ў§§ў§ћ§§јњћћўў§ћ§§ўў§ўўї§ћђюїћ§§ўўј§ўћћњћ§ћћќ§ў§ўўщ§ўћ§ћ§ћўћ§ћњћ§ћўћў§ћћ§ћћќ§ћ§ўўя§ћ§ћ§јѕѕњћў§ў§ў§ўўэ§ў§ў§ўћ§ћ§§ў§§ћ§ћ§ћћщ§ћ§ћ§ћћњњљњњ§§ћћ§ћ§ћњњћћєњљљѕёѕјћћў§ўўљ§ћћ§њћњњћёњ§ћў§§ћ§њ§§ћњћњњјљњўћ§§ўћћ§ў§ћћѕєјњћћс§ћ§ћ§ћћљљњ§ћњњљњњћ§ћ§њћћ§њћћњћ§§њћ§њћњўўќ§ћћњњѕћњ§ў§§њљљњћћьњћћ§ћ§ћ§§ў§§ћњ§њљљњћћщў§ћ§§ћњћњљњњћњњћњў§ўћћ§§ьњћњ§ћ§§ћћ§ћ§ћ§ћ§§њћ§§ўћ§§ђћњћ§ћћњ§ћ§ў§ћњњѕћ§њњћњћњћњћћљ§ћ§ћ§ћўўђ§ўћ§§ўћ§ћ§ћўћ§§ќў§ћўў§ћў§ўў§ћћњњ§ћћ§єњћўўћ§њњћњї§§ўћўўъћ§§ћ§ћ§ў§ў§ў§§ћ§ћў§ўў§§єўћ§ћ§§ћћљњњћћѓ§ўўћ§ћњћћ§§ћњњѕћј§§ћћ§ћ§ћ§§ў§§ў§§ћ§ћњ§ћўћў§§юћ§ћ§ћ§ўўћ§ћ§ћўћ§ћњњћљњљљјј§ўћ§§§ћ§ћћ§јў§ћ§ћўћўў§ћ§ћћўќ§ў§ўў§щћ§ўћњћњћћ§ћ§ћњћћњњјјї§ўўў§ўўў§ўўћ§ў§ўћћњјћўўћ§ћ§ћћњњ§њ§њ§§ўћ§§§ћ§ћћњњў§ћ§њњјћўћў§ўўњћ§ћ§§ўў§ћ§ћћљ§ћ§њ§ћ§§ўћ§§ўћ§§ћ§їћњћћњћњљњњўћњњїћјј§ћ§ћ§њњі§ћ§њњћў§ў§§ёў§ўћ§ћ§ћў§ўћ§§ўўў§ўўі§ћ§њћњљљњћћ№њљљјїїў§§ћ§ћ§њњћћєњћ§ћў§§ћ§ћ§ўўї§ў§ўў§њњћћћ§њјљњњљѓњјљљњњљљњјїї§§љњћћўћћ§§ўє§ўћћ§§ћњ§ћћ§§ўў§ўў§єћ§§ћњ§љљњ§ћ§§яћ§њћћњљїѕєї§ћ§ћ§ўў§јћњњћљњћ§§љћњ§§ћћњњћў§ћћ§њћ§§њћ§ћ§§ћћє§ћ§њћјјїїљ§ўўј§ћ§§ћњ§ћћўў§§ѕўћў§ўћ§ћњњ§§ёћ§ћ§ћ§ћ§њћњћњћњњўјњњљћњјјљљўўєћњћњћњћў§§ћўўё§ћћ§ў§ў§§ћ§ў§ћ§§ћї§ћ§ћ§њћњћћњ№ћњљїјјў§ўўћњўў§ўўє§ћћ§ћћў§ў§ў§§§ћ§ћћў§ћћіў§ўћ§§ў§§ћћќўћњћћќ§ћўљљїїє§§ћћў§ўўћў§ўћњ§ћўћћѓ§ћ§§ў§§ћўћ§ћ§§ћљёњљћћњњљїїћњњ§§ўў§њћњњћўћћќ§ћ§ўўњ§ў§ўў§§ћћњћњ§§ћўћћљњњћњєљјјљј§њћњћћ§§ўў§§ѕўћ§ћ§§ўў§§ўўў§ўўъ§ў§§ћћњ§ћўћњљљћћ§ћћњњ§§њљјљјјўўћ§њ§ћўўі§ўћ§ћ§ћ§ћ§§ўћ§§ўі§ћњћ§§њћћњњфћњ§ћ§ћў§њњћњљјўў§§ўћ§ћћњћњћ§§ўўћўў§ћљьњћ§ћ§§ћњћњћњћћ§ћ§њњљљћќўћ§ћћќњљ§ћћўј§ўў§ћўћўўјћ§ћ§§ўћ§§њё§ћ§ћћњћњњљњљњ§ћћњњћћ§ћњњўћњњўљўў§њћ§§ў§ўў№§ўў§§њћћ§ћћ§ћ§ћњњўћ§§№ћ§ћ§ћ§§ћњћћ§ћ§§ћћњѕћњћљљїў§ў§ўўљ§ў§ў§ўћћ§јћў§ўћ§ћ§§њћўў§ћњњўћ§§ўћњњћўњ§§їњћњљїў§ў§§ўќ§ў§ўўјћ§ћў§ћћ§§ћљњ§ћ§§ў§§ўљ§ўћњћћњњљіћ§ћ§ћњћњљўўї§ў§ћў§ўў§§ћў§ўў§ћўњћћьњљњњљњћўў§ћћњћ§§њњћ§§ўћњњјљњљ§ћ§ћ§§§ћ§ћћяў§ћ§ўћћњњћњћ§ћ§ћ§§ўњјјєїјјїѕїјљћћ§ўў§ќћ§ћњњљ§ў§§ў§§ћћ§ћћ§§ўўћћщ§ћ§ћћњћњљљјїљљћћ§ћ§њћњћћ§ўћ§§ћюљў§ў§ў§ўћ§§ў§ў§ў§ўўќ§ў§ўўѕ§ўћћ§ўў§ћ§ћћ§ћњђћњњљјјњњћњњћћ§§ўќћ§ћўў§ћѕўћ§§ўћ§ћ§ћ§§ўћ§§ћћ§ўў§§ћ§ќћ§ћ§§ћї§ћ§§ћњўў§§ќў§ћўўяћ§ћў§ўў§ћ§§ўћћў§ћћљњ§њћћњћћђљњћњњћњў§њћњ§ћћ§§њћћ§ўњўўћ§ў§§ўў§ўћўўќ§ў§ўў§ўњ§§ќћ§њљљљњћћ§ћћњњћ§§ўњњѓћњњљљњњўћў§ўћћ§ќћў§ўўћ§ћ§§ћћњћјњћњњћњњћћ№§ў§ћћ§§ћ§њћњ§ћ§њњў§ћћќњ§ћўўјћњћћ§§њћћћ§ћ§§ћћ§њў§§ћ§њњўљћћњљїјјњћћ№ўћњћћњ§ћћњњљљњ§ћўў§ўўќ§ў§ўўў§ўўќ§ў§ў ўє§ў§§ћў§ў§ў§ўўќ§ў§ўўі§ў§§ћў§ў§ўўў§ўўў§ўў§ўѕ§ўў§ў§ў§ў§ў ўў§ўўњ§ў§ў§ўўў§ўўў§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ў ў§§ў§ўўў§ўўў§ўўќ§ў§ўў§ ўў§ў ўў§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўўј§ў§ў§ў§ўўў§ўў§ћўћ§§ў ўў§ўў§§ў§ўў§ў§ўў§§ўў§ўўў§ўўљ§ў§ў§ў§§ў§ўў§ўўќ§ў§ўўў§ўўї§ў§ў§ў§ў§§ќћў§ўўќ§ў§ўўў§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ўў§ѓў§ўў§§ў§ў§ў§ўўј§ў§ўћ§§ўў§§ў§§§ў§ў ўј§ў§ў§ў§ўўћ§ўћў§§ўќ§ў§ўўќ§ў§ўўў§ўўў§ўў§§ў§§јў§ў§ў§ћ§§љў§ў§ў§ўўњ§ў§ў§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ў ў§ўљ§ў§ў§ўћћ§ўћўўў§ўўі§ў§ў§ў§ў§ўўў§ўўї§ў§ў§ў§ў§§§ў§ўўќ§ў§ўў§њћ§ћўћ§§їў§ў§ў§ў§ўўў§ўўќћў§ўўљ§ў§ў§ў§§§ў§ўўў§ўўќ§ў§ўўљ§ў§ў§ў§§њћ§§ў§ўўї§ў§ў§ў§§ў ўў§ўўї§ў§ўћћ§ў§§ўќ§ў§ўўў§ўў§љўћў§ў§ўўў§ўў§іћў§ў§ў§ў§ўўќ§ў§ўў§љў§ў§ў§ўўњ§ў§ў§ў ўў§ўўё§ў§ў§ћћў§ў§ў§ў§§ћў§ў§ўўў§ўўћ§ў§ў§§ўў§ўўќ§ў§ўўќ§ў§ў ўў§ў ўў§ўў§љў§ў§ў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўў§ў ўў§ўўў§ў ў§§ў§§ўј§ћњ§ћћ§ўўў§ўўњ§ў§ў§ў ўў§ўў§ўњћўћў§ўўў§ўўћєўљѕњљњњўћў§ўў§ёў§§ћўћў§ў§ў§ўћўў§§ў§§ќў§ў§§ўў§ўўћіљњљѓєљњў§ўў§ћћ§ўћ§§ўњ§ў§ў§ўўњ§ў§ў§ўўў§ў ў§ьљђуђљ§ћ§§ў§ўњ§ћўћ§§ўўќ§ў§ўўј§ў§ўћў§ўўў§ўўќ§ў§ўўю§ў§ўћћѓѓєћћ§ћ§§ў§ўўў§ўў§§ў§ўўў§ўўј§ў§ў§ў§ўўњ§ў§ў§ўўјћљљњћў§ўўў§ў ўќ§ў§ўўњ§ў§ў§ўў§§ў§§§ў§ўўі§ў§ў§њљљњўўќ§ў§ўўш§ў§ў§ўћў§ў§ў§ў§ў§ўњўћў§ўўю§ў§ў§ў§§ћ§ћ§љњљ§ћўў§ўћ§§њћўњ§ћўў§§ў§§ћў§§ў§§њћўћ§њўўў§ўўќ§ў§ўўр§ўћјњћћ§ўў§ў§ў§ў§ўћў§ўћўћў§ў§ў§ўў§ўў§§љў§ў§ўў§§ўј§ў§§ћў§ўў§ўћ§§іћў§ў§ў§ў§ўўы§ў§ўћўћўћў§ў§ў§ўћў§ўћћћ§ћћ§ўўє§ў§ў§§ћ§§ў§ўў№§ў§ў§ў§ў§ў§ў§ў§ўў§§ў§§ўї§ўћў§ў§ў§§ѕў§ў§§ћ§§ў§ў ўќ§ў§ўўќ§ў§ўўњ§ў§ў§ўўњ§ўў§§ўў§ў§ќћў§ўўў§ў ўќ§ў§ўўќ§ў§ўўі§ў§ў§ўћў§ўўћ§ў§ў§§љў§§ћ§§ўўќ§ў§ўўў§ўўњ§ўћ§§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўь§ў§ўћўћўћ§ћћљћ§ў§ў§ўўћ§ўў§ўўњ§ў§ў§ўўќ§ўћў ўѓ§ў§ў§ўћў§ў§ў§§јћ§ћ§љњ§ўўћ§ћў§ўўї§ў§ў§ў§ў§§юў§ў§ў§ў§ў§ў§ў§ў§ў§§њў§§њћўўў§ўўў§ўў§§ў§§ћў§ў§ўўќ§ў§ўўўћўўћ§ў§ў§§њўћўћў§§іў§§њћ§ў§ў§§ўў§§ўў§ўўќ§ў§ўўў§ў ў§§ў§§ћя§ћ§ћ§њњљњў§§ў§ўў§§њћ§§ў§ўўњ§ў§ў§ўў§ўў§§№ўњ§ћўћ§њ§њ§њћћ§ћћњњћјњ§ў§§ўќ§ў§ўўќ§ў§ўўќ§ў§ўўя§ў§ўћ§§ўћў§ў§ў§ў§§ѓћ§ћљљјњ§ў§ў§ўўѓ§ў§§ћўћў§ў§ў§§ўіћўћўћў§ўћўўч§ў§ў§ў§ў§ў§§ћў§ў§§ћњљњњ§ўўћ§ў§ў§§ќћў§ўўў§ўўё§ў§ў§ў§ў§ў§ў§ў§§ѕў§ўћ§ћћњћћ§§љћўљћљћўў§ўў§ў ўї§ў§ў§ў§ў§§ўј§ў§ў§§ћ§§іћ§ўћўњћљћўўњћ§§ў§ўўў§ў ўњ§ў§ў§ўўќ§ў§ўўў§ўў§ўј§ў§ўћў§ўўјњ§њћ§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўњ§ў§ўћ§§ѓњўћ§ћ§ћ§њ§ћў§§ў§§ў§§ўќ§ў§ўўў§ўў§ўќ§ўћ§§ѕћ§§ћћ§ћћљћ§§ўў§ўўў§ўўќ§ў§ўўў§ў ўњ§ў§ў§ўўыћ§њ§ћ§§ў§§ўў§ў§ўњ§њћўў§ ўю§ў§ў§ў§ў§ў§ў§ў§ў§ўўј§ў§ўў§ћ§§їћ§§ў§ў§ў§§љўћћўў§ўўј§ў§§ўў§ў ўі§ўћ§њ§ћ§§ўў§ѓћўћ§§ў§ў§§ћ§ћћўј§ўћ§ћ§§ўўў§ў ўў§ўў§§ў§§ќўћўћћ§§ћ§§ђћ§§ў§ў§ў§ўћ§§ўўќ§ў§ўўќ§ў§ўўў§ўў§§ў§§ьў§ў§ў§ў§ў§ўћ§ћў§ў§ў§§іў§ўћ§ћћњњўўњ§ў§ў§ўўњ§ў§ў§ўў§ёћў§ў§ў§ў§ў§ў§ў§§ѓў§§ћ§ћћўў§ў§ў ўў§ўўљ§ў§ў§ў§§§ў§ўўў§ўў§њћ§§ўњ§§ћћў§ў§§§ћњўўў§ўўў§ў ўї§ўћ§§ў§ўћћ§ўћўў§§ў§§ўў§§јў§ў§ў§ўћћёўћ§§ў§ў§ў§ў§ў§ўўцћўћў§ў§ў§ў§ў§§њ§њћљћњ§јћћўўћ§ў§ў§§љўћўћ§§ў ўў§ўўњ§ў§ў§ўўў§ўў№§ћ§ћўћ§љ§љўћў§ў§§ѓћ§ћў§ў§ў§§ћ§ўўќ§ў§ўў§§ў§§ќў§ў§§јўћўњћњў§§њћ§ўў§ў ўў§ўўѕ§ў§ў§ў§ў§ў§§§ў§ўўќ§ў§ўўц§ў§ў§ў§§ћў§ў§ў§ў§ћўў§ў§ў§ўўў§ўўў§ўўх§ў§ў§ўћў§ў§§ўў§ўћўћ§§ў§ў§ў§§єўћў§ўћ§ћў§§ўўў§ўўў§ў ў§ќў§ў§§ќў§ў§§§ў§ўўќ§ў§ўўћ§ў§ў§§ћўћўћўўњ§ў§ў§ўўќ§ў§ўўц§ўћў§§ћ§§ўћўћў§§ћў§ў§ў§ў§ўўёћ§§ў§ў§ў§ў§ў§§ўўі§ў§ў§ў§ўћўў§ў№§ў§ў§ўћў§ўњўћўћўў§ћћ§§ўћћћўћў§ўј§љ§§ўўњ§§њњљўўњўўњќ§њ§ўўўћўўќћњ§ћћ§љіњљљјїљїћљ§§љ§ћњњ§њ§§ћћ§ўћўў§ўћљљјћэ§њ§§ўћћўћўўњљњѕћ§у§§ћя§ћњњјњњљљћљљћљћљ§§ўћљљ§їѕњњ§ўќћўћўўя§љњћ§§њјѕѓ§њ•§ћњўў§њљ§ућљ§§ў§љљ§ћљњњ§§њљўћњ§њ§љ§ћ§ћўўѓ§њљљњїёѓѓћћЛ§§ўяћўў§ўў§њћ§§њјјћ§ўўћўў§§ў§эњў§§њ§љћћњњўў§ћњїјєєћ§ће§ўўћ§ћњ§ўў§§љ§§њњ§ћљњўўљ§ћњљ§њ§§јњљјјљњњ§§њѕјљєѓѓѕћ§љŒњњў§ўѓ§ўћњ§њ§§ўў§§ўў§єўћўћ§§њўћњњ§§ћљ§ѓћјїєёѕєѕ§ћШOљљњўћ§§ўњњ§ўў§§ўў§рњўљљјљ§њћљњћ§њ§ћїѕѓђђѓѕєљћЫb§ў§ўў§ўќ§њ§ўў§ўљћљњўўћўўш§њњ§њњљјљјїїѓђѓєѓїѕћљЋLўўћ§њ§ўўўћўўћ§љљњўўў§ўў§ўў§§ьњћћљњјѓђѓєѕјћўћћx>ўћћњљћњ§§ўћўўћћўћ§ўў§њ§њњ§њўі§ћ§§њў§ћјѓѓэєјїїљјц[(§§ћ§§ўў§§ўўўњљљ§§ў§§№ўћўў§ћјљљњ§њўћћўўѓ§њњ§§њћїѓђђєѕѕюїј§§шb5љљјћљњ§ћ§њўўўћ§§ўњ§§ўњј§јњњ§ўў§§ћњљѕєѓѓђѕљњљћњј§ћЕ3"ў§§ў§§њ§§§њ§ўў§ўљћћ§ўћўі§љљћјљћљњўўч§їєєјїјњљљћ§љ§§цh5ћ§§њ§ћўў§єњћњ§ўўљњ§§њћћњљњ§ўћњњ№§ўўљ§ћљљ§§љјјѓѓѕѕќїљљїїљљћОQH§ўўћ§ўўњ§§ђўћћ§§њћў§§њўћўў§ћюњ§њњ§њ§ћњњљѕєєјљїѕѕѕєїѕѕћћ‚0Qћ§§§ћ§ўў§јћњћўўњљўў§ј§љћ§§њћљєђѓєєѕщѓђїїњјњїћљ§ћјr?E§§ћјњ§ўў№ћўћўў§§ћћ§њћ§§њўў§кљјјѓђёёѓјљљїјїјѕѕјћљљћљћ§бE@Iљћћњ§§њњ§§ўњћўћњћўў§ћўљ§њўўє§њѓёђѓѕєѕїљјјћ№љѕѕјћћјїј§ћЈUcJ§§ѕћљњњ§§ў§љњћћў§ўўћ§њњ§ўўѓ§њѕѓяшюђєѕїїњњїјљљјїѕїјїїѕ§їž9<4љ§§љњњћф§љєјїљњјјљћ§§њњ§§ћїѓђяюђѓєїћћлљћљћ§§љјїѕѕљћћњљєїћ§‹]gQљћћљ§њ§ћњјјћ§§јћјјћ§њњ§§цїѕђююёѕєѕѕїљїјїћ§ћљїјїѕєєјјЮїѕѕє§ћЛ?:LB§§љїњњћљћћ§§љљ§љћ§§љњјѕѕѓѓђђёёђєѕѕїљљњїїўјћћјїѕїњњјјїї§јнH!AEљћ§§ќњ§ћ§§Ићјјѕљјїѕёёэяёђѓєѕљјљћ§њ§њ§§њ§њљћљћњѕѕєєњћљљјјїї§ћ‡1EUћљљћ§§њљљјїђэььяђєёёУѓѕїјћњњјћљћ§§њ§§ўўњњјљјїљѕєѕїњњјњњјљћ§}4JLљћљ§§њ§љїѓђёяёѓђєѓєєѕї§јњїїѕіљјћљљ§љјћ§§јљћњѕєєѕїїѕћљk(4BњљћњјјыєёэёђєїѕїѕїњјњїїѕїїњћћЮјњћљћљћ§§ћљјјљћјїїѓђєїјїјї§§ћn"0?њћјњњјїђѓђѓѓѕѕєѕїїјьњјїѕѕљњњјљћљћћјїјљћљљжћ§њјєѓёѓєїєїїў§ђi%35ћљјјљєђэђєєѕїјљћћїјњњљљњњћљћ§љљћјѕѕјљљќјћњўўјњћњїєѓѓѕѕйѓєљ§щS)84§њћљѓђѓѕїњћ§§њљћљ§§њ§§ўў§њљћћ§§ћўљ§§пћљћјјљѕѓђёєѕїјњўћы]BMAћњјђэђїїњїјјьљїјїњј§ћћњјјљњњ§љѕјћћзљјћљћјњњљћњѕѓѓѕїјїѕћ§йG.42љјїюэђєјљїѕѕїњїїыњљћћњњћћљћњ§ћњљјјљїїјјїјћчљїѕєѓђѓїљњї§§з>8@;јїѓяёєїїќјљљ§§ђћјњњјћњљјјњћњјјўїјјлњїљљїјјїѕѕєђёђѕѕїѕ§ћЁ;1-<ђэюяѕєїјљїїјјїјїљљїїјћћљљќћљњјјњјЖїћљјїѕєѕљїјѓљћФC8B?єєђѓѕјњјјњјћјћјјѕњїњњјњњїїјљћњ§љљњјњїјјћјћћјљћћњјїєїѕїјјсўћС8+$-єѓєѕїњјјћљѕ§њћјљљњ§њ§љћљљ§јѕїїїјњјјїљ§ў§§љћњїєѕєѕѕєїѕјї§ћЖJLN>ѕѕўїјјќњљ§љљя§ўўњњљљћљ§§ћљјћћ§§ћўњ§§ўљјјоњјјїїѕјѕѕјѕѕјјї‘Bљњњћљћ§§ћљћћѕ§ћљљњ§љ§њ§љљќїјїљљіћљјјљћјјїћћшњїѕїїєћљ˜A?+29ѕѕћћћњћћјњњ§ћњ§§ћљјјљ§§њў§§ћјњњїћљјљћјјѕїїэњјњїљћыt>>5§ёЗxМ§§љїїіњјјћљћ§§њ§§љПњјћљћљћјљњїјѕљњњїїљљњїљљїјљї§ћаƒZ<)@<8§ўЫ‡mЄєўјјћњїїјћљћћјїїјјњљћћљљїјїљњїїзљњјїљљїњњїљїјљљ§ћВdd31,5<јљёзеТЯёїћ§§љ§§љљћ§љћ§§§њћњњћјњјњїїљљњјјњїѕѕлї§§МA23!(-9їєѕѓэѓѓююёьяѓѕјћ§§ћћўћў§ћїїъјљјњњћњљљњћћњњїїљљѕїїњњлїєјљђd#"8+83њљѕѓђђёёящтмхюёђяяђєѕїјљћћњљјљјљјјѓњћљћћјїјљїїљїїѓѕђяїк`*7:A?ћћфјїїѕєѓєюэяђђюьэыыьэяёёюяѕљћ§§ђћјїїјћ§њ§љљњњјјњђјїљїУJ$*577&ћ§§чў§§јїљљїѕѕєђђёёђююэырнлхььњђѓљјћ§§ўљ§§щњћћјјїєёљпc**21%*ћљљјїјјіљћљњїїѕїїєєЭѕѓёьшыьщчуустушяѓѓђяыщэёѕјљјїѕѕђ§§рO&-728:ћњћљњњјїѕѕїњљјљїљѕєѓѓђёмюышшюёяячшшчыыщщьэяьяёњаT423&)0§љљћљљ№јїљљјѕѕєїїћјїјєѕѕёїјѕєѓђєѓѕѓѕѓђяёёћяђђёяяѓюёёєћэw#.(#ћ§ўћћўўћћ§ћ§ў ў§ќћ§ћўўў§ўўў§ўў§эњћњ§ћ§ўў§ћћњљјљўў§ћћі§ћћњ§ћ§ћ§њњўћњњћ§ћў§ўў§ћњ§ћўё§ў§ў§ћљјўўц§ћ§њњђћњљљњљљћћњћћњћћћ§ћ§њћћќњљљ§§њћў§ў§ўўќ§ўћўўћю§њјѕў§™§њ§§ў§ў§§ћ§§ћќ§ћњћћўўћћє§њћ§§ћ§§ў§ў§§њћў§ў§ўў§ћљѕјєѕўўЗ§ћ§§ўў§ѓўћ§њћћ§ћњњ§§ўўў§ўўјћ§ћў§§ћ§§љћ§ћћњњ§§њўћњљљїїўщк§§ў§ўўћњ§ћў§ў§ўћўћ§ћ§ћћ§§ў§ўўљћў§ўћ§ћћј§ћњњћ§§ћћ§љњјїєѕјўўў”§§јў§§ћ§§ў§§ўў§§њћў§§ћўў§ўћўўј§ћ§§ў§§ћћы§њћћўћ§ћњњљїєєїјўўЭUћћ§јњћћ§§ў§ўў§цћў§§ћў§ў§ўћ§ћ§§ўћ§ћ§§њћњњ§§ђњљјѕѓєѕјјўўбd§§ўћў§§ћ§ўўя§ў§§ћ§ћ§ћ§§ў§ўў§ўўќ§ўћ§§юў§ћњљѕѕєѕїњљјўўАNўў§љў§ў§ў§ўўј§ў§§ћћ§ўўўћўўщћ§ћўћ§ћ§ћ§њњћљїѕєѕїјњћўў§}?ўў§ћў§§ћўўђ§ў§ўћў§ў§ўў§ћ§§ўћ§§їў§ў§§њ§ћ§§§њїѕѕїљљћўш\(§ћћ§ћўћћ§ўўў§ћћўўћћ§§ћўў§јњ§ћў§ћ§ўў§§ў§§іћ§§ћљѕѓѕїјјюљїўўю\2ћћњњћ§ћњ§§ўўћ§ў§§ћћє§ћ§ћ§ћ§§ў§ў§§ўчћ§ћ§§ћљїѕѕїјјљћњљњўўЛ3+ўћћўў§§ћ§њў§ў§ўћћњ§§ћўўњ§ћћњ§ћћ§ћў§§љїїтљњљћћњћћўўчh:ўћ§§ћўў§ў§§ћ§њ§ћўў§љћ§њћњћ§§ўў§§ўї§њћћ§ћћњїїјќљјјљљўљРPJ§§ў§§яў§§ћ§§ўў§ћ§ўўћ§§ўў§§ћ§њњ§§ћ§§њњљљјјїї§јљјјљщјўў‚9Uћћ§ћ§ћ§њ§§ў§ћћњ§ўўќ§ў§ўўэћ§ћњћњћ§ћ§ћ§ћћјїєѕїїјўїљљњњљњњћўўєtAB§ћњћ§ћў§ўўў§ўўХ§ћћњ§§ћћ§§ў§ўћ§ћњїѕѓѓђѕїјјљњљїјјњњћћњћўўдACMћњњ§§ћ§§ћћ§§ў§ўўі§ў§§ћўў§§ўў§ѕљѕѓєѕєїјљјњњјњэћњљїўўЌZiL§ћћњћ§§ћ§§§ў§њњ§ўў§§яћў§ў§ўћњјѕэщьєїјљљшњћћњљјљњћћљјјўў:C9ћћ§ў§§ѓњћњ§ћћњљјљњњћћ§чћ§њљєяёѕєѕїљњћњћњћњ§ћћњљјјяћњљјїљў§‘bkVћњћћ§§§њљњњќ§ћ§њњўћ§§юћ§ћјєяяѓѓїјјљјљњњћћќњљјїїњщљјјїўўК9;QE§ћћњљљњћњњ§ћћъњћ§ћњїєєѕєєѓѓєѕїјјљјјљљњїћњјљњљњњљљўяхM)ILћњ§ћ§§ћњ§ћћњњюјїѕєђюёђѓєєїјјњћњ§§ћћ§ћ§ћћыњљњјїјљњћћ§њљљўў…5IUћћфњ§ћ§ћћњљєьщэѓєѓѓђѓђѕјљњћљљњћћ§§ћў§§јћ§њјјїјљљ№њљљњћўў‚5IGћњћћ§§ћћљєєђђѕїјљўњљљјњћё§ћњњ§ћ§ћњљјїїјљљўїk(9?§ћњљњњђїђєѓєїљњљјљљњљљѓњћњћ§њњћњћњ§ћћњђћњ§љѕѕєїљњћњћўўыm"1>§њњљљњѕѓђєѕїјјљјљљњќљњљјјљєњћњћњћњљњћњћћљ§њљєѓѕљљўєћj"9>њћњњјјєєїћјљњћњњљћњљњћњ§ћћћњљљњћћђ§њ§ў§ў§њљљїѕєјјїцћўюN-9?§§ћјѕѓѕјљљћћ§§ћњћћ§§§ћў§§њћњњћ§ћћј§њћў§ћ§ћћњјщѕєєїјљњљўўэW?Q:њљїѓєєѕљљњТјљњњљћ§њћљњњћ§§ћјјњњћњћњћњњћћњљљћњњјѕєјљњљјўўкC3;<ћњѕђёѓїїјљњљљўћљљљћњћљљњћћѕ§ћњљјњњјљљњњљњчћљјїѕѓѕљћљљўўнC9A:њљѕёѓїљљьњћћ§ћ§њњљњњћљјњњљћљњњљјпљњњљљјїѕђєјњљјўўЈ;5;;ѕєђёєјљњјљљњњљњљљјљљњћњћћќњћљњњљњсћњљјїјјћњњўўЧC2?:їђєѕјњљњњљњњ§њњљўњљљєњћћ§§ћћљњљљњњў§њњѕћњњљњљїѕјљњњўуТ3(,8їѕїјљљњњћћ§ћ§њњћћ§ћ§§ћњћћўњљљќћњљњњћіўћ§ћ§ћћљљјјєљњњљўўКNQOBјјўљњњќљћ§ћћў§ћќњћ§ћћђ§њњћ§ћњњ§ћ§ћћњњўљњњљюїјјїјјњўў–;:EIјљљњњўћљљћљњљњ§њљњњћњїљћћ§ћћњљњњћщњљїїјѕєєўўЮj[HLIїљњњћћњњшјљјћћњћћњљњљљјњњћ§ћ§ћћ§њњљњўљњњјћњњјїєєѕѕєїўўлZ.&+:їјљљњћљ§ћћњћћ§§ќћ§§њњ§ћњћћё§ћ§ћћњњљљјјљјѕїїєјѕњўуeF??Hјљљњћњћћ§њћњњі§њћћ§ћўћ§ћћњћљњћњњћћњњкћњљљјљљјўў>CC9Bњњљљћњ§ћћњћњћњћћ§ћ§ћљћћў§ћћ§§њћћіњћћ§ћћњћћњњљїјоїўўŸ39@?<њћњљњ§ў§ў§ў§§ћ§ћ§ўў§ўћ§њћћњћћњћњћћ§њъљјїјјїѕїјїјўўž4.><4ћњћћјњћљњљњћ§§яћ§ћ§ћўћ§ћ§ћ§ћ§ћ§њњљуњљљјљљњњљљјљљїљјѕљўђnA0,1%њљњњљєјїјњљљјѕєїѕјјѓљћњњћћ§ћљљњњјјуљїјљњњћњћћљљјјїїѕ§ўЫI*)8;јљњњљњћ§њљјјљћ§ћыњћ§§њћњћљњњ§њ§ћњћћњњјјэїўўЕ18;?љњћњћћ§ћ§§ўњљљњљњўљњњўћљљћ§§ћ§§§ћњћћяњћњљјїўўЫG.)438љњњ§§ћ§§ќћ§ћ§§ыњўћ§њћњљљјљњљњљјљљњљњњїћњћћњјљљњњшљњљјўўДCB&1,3їјћњ§ћћ§њћ§§њћєљћћњњ§ћћњњљњњяћњљћљјњњћћњњљњњјњњљьњўў‡:?8<7>јљћњћљћњњљљјњ§§ћ§ћ§ћћђ§њћћ§ћ§§ўћ§њњљљћњћњћњњљњшљ§ўэu?BH>54јјњћњњћњћњћњћћњњ§§ћ§ћћњњћњћњњљљўњћћхњћћњћњљњјјѕњўд?,8:@97јјљћњћћїњћњњћћ§§ўўњљњўљњњєљњљљњ§ћћњњћњњўљњњљыјїѓ§ўЭ4%258;5ѕђєјћњњћћѓў§§ћћњњљћњћћњњјљњљњњћћњњўћ§§јћљњљњљљјјїўѓДB9?A?>8ћцЮьўўћњћћ§ўўљ§ћљјњњўўћћ§ћ§њњћ§ћ§ћњњн§ћћљњљљјљјљљњјјїўўБ]FJBA>9ўяДwНўўћљљњ§ћњ§§§ћ§ћћЮљњћћњћњњћљљїјјњљћљјјљљјјљїјљўўйˆ^;(9>9ћўЩgžїўњњћљљњѕћњћњљљњњљћњњћќњљјљљљјљњљјјљљсјљїјјўўКca919<<њ§ђзЫРЮюїњ§§ўћ§ћћњѕћњћ§ћ§ћ§§ћљљќњљњљљљјљњњљљјјтљўўСC.5"5:7ѕїјїюєњяёююђѕјњњ§§ўўћњњљљњћ§§јњљћћ§ћњљљјљёїћўїe)(;:9љјјєєђцыпнцьѓєёёїїјљњћћњћњћћ§ћ§ћњњѓљњћћњњљњјљљјљљѓјѕјўсg(05?C8њњљнјїѕѓёюђєєђяыьюэюђѓѓяђєљњ§ћ§§ћњљљњњ§§ћљњљтњљўўЮJ-*9;81ћћ§ћ§ў§ћњљјјљљјїєѓѓяёвэукпчэящюёѕјњњ§ћ§ћ§ћ§ћ§§њњ§њћјћўх`,-8570њћћњљњњћљќјѕѕїїЭјѕѓэщцшэшсхсрпуђѕєєёэыёђєїљїљљњљўўсO#48:94њљњћљљњљјјљїњљњјљјјїѕѕєкђѓяэущяѓёэщццшчэыьэяэѓѓђћбN313353§ћћњћћњњљјјїјјјљћњњљїїјјъњљїјїєѕїѕєѕєѕѓѓђѓђѓѓєђђєѓђїўюv*0&.0ў§ўўў§ў ўќ§ў§ўў§юћ§§ў§ў§ў§ўћ§њ§ўў§ўўѕ§ў§ўћ§§ў§ў§§њћ§§ў§ў ўѕ§ўћ§ћў§ўћў§§ ўїћўћўўё§ў§§ўњћўћўћ§§јў§ўћ§§ў§§ћў§ў§ўўў§ўўјњћљўўЌ§ўўј§ў§ў§ў§ўўћ§ў§§ўў§ћў§ў§ўўў§ўўќ§ў§ўў№§ў§ўћ§њћїўўЫ§ў§ўўў§ўў§ўќћў§ў ўў§ўўђ§ў§ў§ў§ў§ў§ў§ўўє§ўњћјњњўўь§ўўў§ўўј§ў§ў§ўћў ўў§ўўј§ўћў§ў§ўўї§ўћ§јћљћўўћЂ§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ўўў§ўў§чћ§§ў§ў§ўњњјљњћўўмa§ў§ў§§ўўў§ўўў§ўўў§ўўў§ўў§чў§ўњў§ў§§њћљњјљљћўўнt§ў§ўўў§ўўј§ў§ў§ў§ўўў§ўўщ§ў§ў§ў§§ћ§њљјљј§њћўўР]ўўў§ў ўќ§ў§ў ўў§ўўќ§ў§ўў§ћјїјїњљћћўў§ŒUўўў§ўўј§ў§ў§ў§ўў§њў§ў§§љљ№їњљ§њўўѕo5§ўћў§ўўќ§ў§ўўў§ўў§ ўр§ў§ў§ўћњїњљњљћљ§љўўјoF§§ћў§ўў§§ўў§ўј§ў§ў§ў§ўў§§ў§ўўщ§ў§ўћ§јљїњљњћ§§ћћўўЧA8ўўќ§ў§ўўў§ўў§§ў§ўўј§ў§ў§§ћўўъ§њјњљњћўћ§§ўћўўњvLўў§ўўў§ўўў§ўўќ§ў§ўўњћў§ў§ўўў§ўў§§ў§§іўћўљњњћљћњњѕ§њ§њўўгeU§ўўў§ўўќ§ў§ўўў§ўўў§ўў§§ў§§ўм§ў§§ћўњћјњљ§њћљћљћњ§љўў’Ckћў§ў§ў§ў§ўўў§ўўў§ўўю§ўћў§ў§ў§ў§ўћњјјїњњљљћњћњ§ћћќў§§ўўїˆP]§ў§ў§ў ўі§ўћ§§ўћў§ўў§ћољњїљљћњ§њўњћљћћ§§ў§§ўўсPZhћ§§ў§ў§ўўў§ў ўў§ўўў§ўўв§ћїїѕљљњљњњўћўћў§§љћћ§ћћњћўўМm~b§ўў§§ў§ў§ў§ўў§§ўў§ўўщњћїјёєјњћ§њћћўћў§§ћ§љ§ћћэ§љћўўБMTH§ў§ў§ўў§ћ§§ћћўњ§ћћћ§ћў§ўў§“њћјњјјїњњ§ћў§§ћ§§ўћўњћљ§ћ§ћ§њ§ўўЄ}‡q§§ћ§§ў§ўћўћ§§ў§§ћў§ў§ў§ў§ћљјїљїћјћљ§њ§ћўћўћўћўњћњњљўћ§љћјўўЮLQgT§ў§ўћћ§ў§§пў§ўў§§ў§§њљїљїћјњїњљњљћњ§њћњ§њ§ћ§§эћўљ§њћћўњ§њўўё\:[Z§§фў§ўў§§ўў§ћћњњћњїљїїѕїјћјћњћ§§эў§ў§ў§ў§§ћў§ћњћјћћ§§єўњ§ўў™G\oћў§§ў§яћњјёѕїљјјїљїљљћњћћљ§ћў§ў§ўўё§ў§§ћўњћњћњћћўћћўю‘Ha]§ў§ў§ў§ўњћјљѕљљьњ§јњјњљћњ§ћўњ§њћљ§њ§§њўћ§§ў§§юћљњјћњ§њ§њ§ўўz5HN§§сўћўћњљљїјј§њ§љ§ћўћ§њ§њ§ћ§ћ§ћ§њ§§њўћўћћ§§іјљјњњўћўћўўш‚0ES§§ћўћћјњєјљњљћљћњ§њћћ№§љћњўћў§ў§§ћўњў§§ђћўўћљћїљљ§љ§њўўэ~3BN§§ћўњћјљјњњћњў§§іўћўћў§§ћў§§ћћ§§ў§§ўє§ћњњљћљћљ§њўўцdCCOћўћў§ў§ў§ў§ў§ў§§ўў§§ћ§ћ§њ§њўњўњ§њўћ§§§ћў§§ќњ§ћўўћђњ§љўўФV[>LALљ§§ў§§ў§§ќў§ў§§ўў§§ќўћўћћѕўћў§ўћ§њћћ§§фћњўњўћўњ§ћўўžLSQPQPћ§ћўћўћ§ћћч§ў§ў§ў§ўў§§ў§ў§ў§§ўў§§ћўћћ§хў§§ћўњ§њњћћњњўўњ‹QUVPQOћ§ћ§§єћ§ћ§ћ§ћўў§§ўўцћ§ћўњўћўћўћўњћћњњўћ§§ў§§ћ§§щћ§њ§љљўўрS@LTTPIљћњ§§ў§§ћў§ўћўўх§ћўћ§њўћўћўњћћ§њў§ў§§ћ§ћћњћћч§њћњњўўнN8ETSPNљљїњћ§§ў§ўў§ћіў§ў§ўћўћў§§оў§ў§ўћўћўњ§њћљћљћјњўўФVNSQ\QG§ёаѓўўќ§ў§ўўњ§ўћ§ћўўќ§ўў§§ў§ўў§§§ў§ћћч§њ§њ§њ§љњўўТrQeVWWTўєМzЧўўќњ§њћћ§§ў§§Ъў§ў§ў§§ћўћ§§ў§ў§ћњћћ§њћћ§њњћ§њ§њћњ§ўўс›qP~ўw=ўˆОўw=ўџ=ўџ<§wџ<џ<ќwџџ;џ<ќˆџџ<џ<ќwџџ:ўwџџ;џ;џ;џ;џ:ўwџџ9ў€џџ9ўˆџџ:ў€џџ;џ;џ;џ;џ;џ;џ:ўwџџ:џ:џ:џ:џ:џ9ўwџџ9џ9џ9џ9џ9џ9џ8ўwџџ8џ8џ8џ8џ7ўwџџ7џ6ўwџџ6џ6џ6џ6џ6џ6џ6џ6џ6ўˆџџ7џ7џ7џ7џ€!p8B>HPMI?0*24AGLC7[ЂЮжтнтебЮРЛРблнеЫнцуреаЮЫннгкццсжеепснпчщцщцшm5CNE?<::;@B@8,MЩюхзжЦЌЄЊКЪСЩЩЯзжЪЮОЗЪкнгЭлппеЪЫЭксрчьукйцщючC;EEBHOGFBGOPH54+.gдштзЂ‚˜ЄЊИЦЮЩШТТЧККЕЖЦСадШШенмпкццтцчшЯЪЩзрцьYG?B?:8;>EBHMa[E50|ЗСЦТРКАЌЌАСШСОО€ъТОЦУНССШЮдзЯШдзсрлбджснтмкйзцQY\B7357@A@UZUG<17iдаЛЗОТЦЪЧЧШЛЖНЦЫЪСМЪОбкдЭЧЩТУФЪаксцшщэччюычсл19IG8-57EBEISOL?*)…МКЂžЊТЩИИЦЯгЮбЮЭаЯЫСЮФОдлбЦШблзЮатчухцёђѓђёщц\VU4#$*+?<>CIMLC?YМЕЂЇЕСЧТЗЫкжбгЭажллЩЭЫЯннжадЯзжлмсчттцхэђђэлаF;)&::;":>:IQАюрнсхпкррлеууцукЫЯжжЪУРОЛОезгЮРИДИЛУШЪезтсрмршыGG2+212,:@:ENQH(NТяёшхщьчстт€—схййммжктыэчтрмррммлЪШЭаадмлдЪЛВЛемнж0>;&1>A?BPMOCGSOP85aЩћјяєїѕђяєыццщэђэмпсуцсйжлтцуутццусс щэсгШШСЛЯЭТКLJ>99.58?GO`JOŠјљњѓѕѕєђёђяюьхнпхчутплртмккепцэшсйеетщчмззпжЪЧШЩдOIC;2<8AEMSYAQŸћ§јѕђђГєїѓђэящчцчщшщчшєёщпЮдзкчыщшскгжгеббдмпуллпICFH>557]QJHCP•ћћѕѕђїѕѓѕїѕєёыьяюђэђђ’ѓяуыустпшююшумпйЫезмдекйхпкA:183))#$9CMNEЊћћїљєљљ§љјѕёюььёѕѕєѓююёшхыьюууллсннсмдпхсчтдзлнЯОA8>F:53>?>E7MAЅљљѓѕѕђјїѕѓѓѕїїюытчэщщРцшюхутпмйеемчшшщыђёьчткЮОФ@?HCB:.:?CAAGT™ьєщьёѕѕјјњјїјјїяьчурсушшŽыщутшрснммцщщцяєєюпжЩНКО<@GA08&,8L15FЛєщгкцыђєљњјјїѕёшсутмсхпмшштхщщшулемущщшыюэрбЩЪШТТ5:B@?8442?F<4ZУшлйлтнкцяѕїїЃюцхчурсчпшшчцхщячщхшхщчухэёэщхшлзб@:ZЪёѓшььхкезклзлтчышцщшщущэпшющпжлцюшрпмнеммтушяёёэп:9;2kxuc<>8J3gаюсрлттускдзббЫЧЪйьёєњѕюяутцселхтучштпнлЮййзссуьчл@;9Ii\*AHI4hккУелнрушцхнгЮЩРИЩкуюяёяшыютсчцущэущьмлзЯЯЪЦагмхтж>HB"-?UL<8;>LOV391*AZaZЄєєспмкаРИШгуучыхпсрпзжЯЭЫЩбзхщээчмгбзйнсхшшсхмкгаеGGNQH>E?44PL]дјјючснжЯЩШЯадкхцчштжЯЫгелкайсэшутчпбЯажехцуннллЭЮбA:@@FFJCOTZU`ЧћїююхмттйгйбгдпчтсржкйцытлййкбглдЭЩбаЮЮенЩТШммдЭЭг>HEC>@LJMTILvн§ѕяышчщђяьщчулксслмшщхёяьэцнздСЧккЯЧЪЯЭгаЯЦкдЭСУаеLTIC2133T5)~уљђяёюыьшщюээыщчснгацюэяэььхсумежзеппзгЧЯбгмлРШЪечш2@2!LPHTo]U‘єћњєѓяђђяящьюшуэщсжйгксхснсрцтрнебдктмеЦОЮкрмйдкшщэ%5MT[u]UЦљћяѓюёѕїїђюыьушштпŒйЭлпктрсрпзеббмйЦЗСЪйснййсьээ)$(+)$?9EE(Bi.?HI7H–љ§їїФѓєїјїђююыщььтчтшысррттуыхртыцртсркмлгбШУЪЩЯ49-N‰W%COGZТћћѕїїјЛѕђђѕїёђььчшчппрмлгуьштззхчучхыяшхтшнмпйЮСМ47(&ej:>HMpчћ§єяяђїћћљїђёђђ€єыщшщхмлпцпххцьхслпклшёяшшюшыпЯШФЛМ29<%AN75cjEјћѕѓяющёђєѕјјєїїѕѓёёэьющрхсйжцыттшчппжсщмтцэщткЮШТКВB?;8:77(EQ7‡ёјяюыэяэчшщюёѕєђѕѕїєёяёёшцрушхьюю€Ошмдйурнрртшплегмей528B95<@L<&ŠяюєяььющтбесшяыющюяююёѕѓђюцшшхрмнущьымЭкнлЮаджпшушюя--.579@BQPBžѓяпхуурнрнрчтуяэьяююяјјѕєљѕђяющучцщышцрзппззнушёђѓђѓ,,00:4?BOJ8vйшщцыыцпшхэщюёяшутхтчђёѓьђїѕёѓїѕѕђѓюшнзкггбжкцшээ€œ)%&01I9.8*|Цегухрщыяыэђюччсьчрзсыюыыѓђїѕёђїїѕєђђєэюэыулгаагнснп.%!(((~юѓрйжкуёючутзрхшчхщщцхтсшшяѓїђђёяэёєёяєѕєђѓщттепмрлз*+!2JJZ1cРюёмбЪгчычцсммтпнззпспчэёєєёѓѕђѓєѕђѕєюёяяёёычьэющм&C]7$+5-@S1SЩяындеезхэщунбабздажмрхтчычщутууцчыьяёєѕєяёююэьщхчрр@C?+-1.#;>)PЮщтлЯШЩОРжхцчуйжкркнкемуутуьщыпптрнушшњяьяёьюю€эттус)(.19353<<0cёщЦЯййЯЪЭЮгмллсруымзегепыющкЯШСЭдпсупцпцђёэхттьщхсхы5+.,9>5;:AHUQOBhМљњњѕѓѕїѓєђђяѓѕѕјѕєјѕїєђѕѓѕјїїТѕєђѓѕїљњјјњјњљo7ENHEFGB<:8<@LOLHUщўўїєєѓѓёюэяђѓђѕєѕѓѓєєїѕєєѕјѕѕ‘ёѕѓђєљњљћњњћњћ:..FG@HL@;@EHFCFA2[ьўљєђхйзтёяєёѓђяюёыьююяђѓѕѓѕїѕѕєїѕјћћњљѕѕїњјћBBCIHGIPI?EW\QB@3;|ўўњѕгЛнтщэяђђёё€эяыыэыёёђїјѕѕјєјєєїїѕєјєѕѕјњњWIEBF?7;Œўўчшшюяэьээюьяяђёёєьѓяяёђёяёђєѕѕијїїјїћћљљјјљ2?JG:74>CFFN[ZJ@55ЈѓямнсььёяяЃюяяђѓёѓђѕюѓїѓђђєѓђѓѕїљїјњљњјљњћњјїWZZ2$,*5?A;CNSQBCZдыЩазцээьёяяєѓёѓѓђѓяѓюђѓђєєѓѓєяђёѓѕїјјїјљљїЯѕJ<.*7<:4.AFLOQN7;|ўўчсятыэьяђѓѕѓђэяяђюээюыээѓђђёёпяѓѓєѕѕєїѓєїјјѕJF;??AHJAHLNOSW?hдўўкћэшшьэюяяюььюёюяяэчцщьђяђєёѓёђѓѓєєёѓђѓѓ…єї*;C-)1>A>A?GIBHFўўїѕїїєёьшхшычшхшээђѓђђяьыыэюяђёёяђєєёѓёђяђѓѕїє-7+!1475, %WYT.NЧўѓѓѕљјљїѓѓэючцтухшцыыђђяяђюяёѓєєѓљѓєѕѕѓєєЯѕѓїїѕ33-(7<>CHbVdWW?EЛўњїїѕѕјњїјђѓяђэьщээюёэюёяюѓѓђљёђѓђѓєїїсјѕїјїљ%-.,7;9;?48@AAPUУўћѕїѕїїєєѕїєїєђёѕѓюэяяЧэяѕђѕєђющьэяююяюѓђѕїјјљљIH719<:;@7:?IFa{пўљїјєѕѕєѕѓєњїљјїїѓѓяђяђяэєєђёюышшьэЩьяєїјїїљkpa><3>BIPOFFOZP)TЫўћїјјїјљљјљљѕїїєѕїјјљљ§јљјјѕѓєєѕїїѕєѓђяямюёђђ;G:@FNSSEUЁўўњјљљђњљћљјѕїјјљњћ§јјїжѓєјјљњљїѕјєѓѓђѕєєѕєїїѕEFEFC93?hPPFHU‘ўўјјљљўњљљЧјљћћ§љћњљљјїљїјїїњїјјљїјѓёѕѓѕѓѕєѓѕѓїѕ>19<80,4*?EMTIДўўљјћћљ§ћњљњљњњ§љњјјќєїјѕѕўљјјёїљљѕєјѕїњљїљѕїѓѓщ@;@B?:>BGC?;CHFHSZЎўўјјђњљњњљњљњњљљјїјјїљРћњїјѕѕєјїјњњљјљјјђђёяя?GF@?3:58FO:9CGEHhU]Юўљѕєєѓѕѓєѕїјѕљјїїѕїѕјїјјїјјўљїїјієїѕјїѕѕјјњњыљїѓ:>><&*3:%Om`.+?GM?BMNMZNM{хўўљљј§ѕїјјХљјѕјїјїњ§јїјїјѕѕёѕѕѓђєѕѕєѕѓєяїђєђёѓѓѕQSM>:2:$7M5)ƒэўћљјњљїјјмљњјїєєљѕјјїјјїљљјјїєєјѕєѕѓѕёѓєѓђљђїјјэ<@08G[O]q^YЄўў§љїљљћїјјѕїїјќїєјѕѕћїљѕјїїѕкїєѕѓєёяѓђѕїєёђѕїћј+&39P^ZvbZЪўўјјљјљљћјљїћїїјїјѕєїѓјњљјјмїјѕїїєђђєяѓѓѕѕїѕїѕїј0&!#:10C>ABWпўўјјљјЬїѕїїјѕђђѕѕјљћњјјїїєѕђѓєёѓєѓѓјїїѕїїј>J9*8OLNME9MРўўїљљ§њљњњЩљјјѕјљѕєѓїїѕјїѕѕјїїјѕєєјєєѓѕђѕєєѓєђѓѓїїBNH1Mi5FMC4F˜ўўљљяњћћњћљљјљњїѕјѕјїєєїјмєѕјјїѕјјљјїєѓєѓєєёђђ><5T•c3IMHYШўўљљњљћјљњљњњќљјїєєњѓѕєѕїјјѕћјѕњњљљцњјљјєєѓђё9481i„i?JNQzёўўјљљћњњћћљјљљшјљјљјљјїїєїѕјњјљїјѕѕїїјїїрѕїєѓѕѓёяя841%CI99coFˆўўљїљїљјљјњњ§ћљњњЦћњљјјєѕѕјїїјљїїњїїјєњјњјјїѓђђёюяAA:>FB?,@S5ўўїјљјїјјїјљњљљњ№љјњњјјљїјјїјјѕїјј§єђѕѕъїєѕђѓїђѕє;9;A@A?HL@%”ўўї№ѕєѓїїєїїћїњљћљљњњіљјњјљљїѕѕјјќїјњїїўѕїїлњљјї575:]тўєшщеРЕСжусшрыщыспЮарэяэцэяѓэтхяюёєљњљюёѕљїїVSW\[[\]`c`ik^SMCB|ўўїэНБИЦдкухскклЯаЭгдпышршэєѓђюђєєѕѕђшмлэєѕњkY\\VQNSWYaajxzZMIзкпеаЪЦТФШкрркздебмлггкмчтьхчьєїєёюэяђєёѓюыяјkor^QIPGVZagrvhUGJющЮФаемуслйЫЫгурсеескчяьнйркртхыюђѕїѕєљљњїєёёFJaaGCHUW\\iopjVE<’жбДКУдхйбзчцтцусшчрпыпмуьщттьээыщђєєїѕњћ§њћјѕrumM7@CLY`V]iedZVnгйЏЇВЮжйжгсэыцхстээ“рурхэюшщсшщыюэѓљѕјѓљїћљјђщePABHINB@\^cangHE‹ўўмЮкЦЭксрцюэыцющрлпзклтсслыючжЯдмцёюьыэёјѕїђщ^ZONPY\[aieeceqSxуўў€хњхЯжмекхмдбкгзтреЮЩЦЫдмчщтпкрьыухтмнччыэюь:JVICLMTY[\]gVVTЅўўњїјјїясмЪЧЫЯЧЦЦУзхэьшмжЭЮптмлмйцььшчснедрсщюѓFF>N9FIEF#>vph@aеўхђѓїјїјѕёчйаЧЩОТНЪгппсьэтмлрцёьытцюёээюцснчщюђHJ@GEMTY\zqimNVЛўјѓєїїѕєјїїёёхмазгдбесрлрыэцттцэяыюяыыёєљђђєЭї9>EMJJUQQWNSWY^nШўїђєєѕєђђььѓјєђчтчэчлееждйяэщсзЯдд”лкзцьєёяяђѕљV^ICPML^STV]\Zj‰пўѕїѕїѓёэппєїњјћїїючжпрржещтюєюлУШЭЮШЪЮЫдшэѓѓјѕљŽ‰}UIVOTS\c`cipШўўњјђєѓѕєђєјњњјњњИјѕєњєђыунцыюыухчпрлеекглшђяььёda9.NQQ^^VW[\NNОўўѕђёѓїѕяяёѕђѕјјїїјћљњђюёђђэ€"хцщђёѓёёьцпултхндЪ^\W[OSZ`eghnuOWбўўїћјѕєёѓѓяєэђёєёѓѕјљјѓяэёѓѓєѓяёьэђђёёячпдШечьчеJSJTVdbbZZejd;`жў§єљјњїѕѓѕѓѕђээюыюяѕїїѓѕёёђђяѓэпкшхчыѓэшужЪжсьяыHTQTJ\[\hmmnbUdЯўћїјїљјњїїјњѕѕѓѓёєѕїєљђєѕјєјѓєёёђѕѕїђђэцшхкгглпчPUTWSPOQ`nhmTMzлўўјћњ§љњјїђєѕјїјєѓїѕђѓэюяєѕѕѓєёєѓѕѓђѕїђьтхмбушлк]VSUWVQQYahniЁўўТњћљћљћљњѕєёђђїѕѕєѓяєђѓяѓяђѓјєїэяэяѕјѓьэєюсцшщюb^WZPLITYdmt`kЗўў•љћљћљ§њћћњѕѕѓєѕѕљљњћјјёщушяєљїѕєюэыэщщчёёяѓђяя[S\a[OPO~qceZhЃўўћљћњ§њ§њ§јњљїљ§љћјћљјљљєѕєєѓїљљѕјяюыщчэьытыёёыQSMOJLGJAVYgg[Сўў§њў§§Оњ§ћњњ§ћ§њћјљїјєљїєѕїѕѕѓєђєяющююђѓєхэяёхкWTMVNUVTYYbZaZЖўўњљ§њ§ћўњ§§ћќјљђјјтњјјїјѕєёющэюёєѕѕјѕљљњєєюцзкWS^^юYPQUZa`bmЋўўјѕњњ§ћћЗњўћњјѕђѕђђѓєєјљћњљїєѓяюѓѕјїјјћљљяыхрйзNW]cTNHJSQhVM\Ыўўэђњњћћ§§ўћ§њњѕјѓѓёёѓ‹љїњљјљјѓёэёєјѕњљљјѕхпупмпSU[cSOSLTY]VMqлўѕышёююѓњњћћњњ§јѕїјяѓђѓѓєєїѕєљњњјѓєїјєѕїћјїѕїєэщт[ZdibWLSWZd|cnЩїююяюыцщюѓєѕњњ€Юїјѕѓёђѕјљљѕѕѓѓђїљљѕїѓѕёђёїјћњ§њљєїPQTW09Z[cEєїтюэђєїєјѓѓчхтлйхьњљњњћѕљїѕѕѓѓ€їєћѕљєђяютухсуђєљјђ^[]@Eatd[[YQQяўыцччяїєєѕѕђїѓящьэєєїїјєјїљїїѓєїљјњњїђыхыээѓљѕєюђOWak[UMOQLh`Œњћэшнььпхюѓљїјяєёяєѕёюьяьччёєѓїѕјљёѓѓљєђяяђљїѕёячь[W`qnESYHPw‚rНўўѕѕюьргзхьѓѕѕїђэђђєэыцулршэђјїљєёцэшђюѓєјєђђѓюёщы]\gk\ZV[JQkduыўўљљєяьцлрышяєїјїњђѓцхьььюхьёїѕїѕѓяюуяюэєјѓђяяфучюYZV^V`^`htopuсўўњљїєёїэшщщ€ГяёѕѕїёяяѓђєђячяьхщэьщуьщхтчщйетяярнуэUc\\Ub`dgoacŒёўўњљјїјљїѕѕїѓёьѓёяѓїљљјљєјђяэьпуыюшухьшышчсюючпхьяirhTNZH;MkF9•ѕў§јњјћјњјїљћљљєєючьјљћїљѕјїѕѕѓььяёяђьыпццщььлмрёїњ\ZJ>FbqkzroВўў€љњњћљњїјѕјїјѕѕђёьэёѓђєєѓєѕђёђяььюђющзмуёяёышюљѕљ>3.5AQguqŒtmкўў§ј§ј§њњљїїјѕїєїѓѕђёяяуэяђђєёїёђяюьючйдлуђёђюёєєѕћGHH>@E@VOSSgыўў§јћћ§њњјјїњїјєє€ŒјєїѓђцчёїїљљјїњѓѓђђцтсрччыёєѓуыёњTgPAJb^kbWJ[Ыўўњњ§њ§ћњњ§њћѕљѕєѓѕєѕєѕїѓѓїѓїјјѓёьшчюѓющюэщсэёѓшяѓєaj^MaƒC``eOaЈўў§њ§њ§њ§ћћњћљњљћљјєјѓјєѕѕђёєѕѕРєђјєјєѕѕєђёэщцнкстшZWY%gАtA^h[xлўў§њ§њћћўњћљљњћљњњћјїѓђяюэьёїєјђђмѕѓѕј§јјєљѓєѓєэыкеLQQIN`aa‡љўўћјњћћ€‹§ћћљњљћљћљјѕјїёяѓђѕђљѕѕїїьяюяєњїїєјїѕэцткжмOOIAbdHO\˜ўў§њњћћњљћњћћўњўњ§љћљ§њњєїёёєѕѓѕђїђѕѓѓђѕђѕѕћѕєшуккеЪVNNaS[S>YeMЃўўїљїљљћєљјњљ§љћњњљћћбј§ѕѓђѕєљѕјєљѓѓщэђѕяѓѓєђяыщыяэяNPQU\Q]Ye[:Ёўў§љјјцяььѕєљњћљ§љ§њћњ§љљѕњјїёэяѕѕѓбэыюђычыёёєѓѕїљICMMQQW[kdYЗўўэѕёѕёєђяэјїјјљѕїњ§ћћл§љњњ§љњїєѓѕїљєѕёїёѓэяяѕѕњљ§љњIHIPNV[aaёLŠёўїђѓєјјєїєљјјљёїїјїљњњЯћњ§љ§њ§њњљћљњѕїђѓёчшэёїїјѕјEA9A@NaTSM@ряряяѕѓљњљљїŸѕєљєђѓљњћљњљњњћљњњћљћљњѕљїљєђьшцяюѕюђIA9H:H;Y^O?ўўяычёёјљљѕїђїєїєїђѓєїєєїјј§ћ§љ§љћјњјњјљљћјїєђёђђяхHF945%Bјљ§њўўњћњ§§ћўўћўќћ§њўўмпкйаЦЩйтюцыƒ:OaWE.5A>8:1)*-?B(;ыћ§љ§§ўњўўќћўћўўќњћћўўзњћћўющчдЮйксюѓє{G>YJ1)*&+90:;;HF5Mѕ§ћљ§ўўћўў§ў ўоёчяцпшрамлŒQJBO?++$(8;BFEJYYSЩ§ў ўўћўўћњ§§ћўўйрщяюхнпЭкш–QC):<183<8*98><::.,dєљўљњ§§ўўњћ§§ћњўўжюцхуссыђјѓŸV>7%73-171+:9C@?YHqШљљѕћ§§ћћјћўўљњўўћ§§ўўУњ§§ўррмкрьюэёѓЎcC<>?2.2279;CMB<.;VЦћ§ћ§њўћўћњїњўўњљ§ћ§њ§њњ§ўўљмтмкйуччрёжŠ`GGM?<;:@EB?:C@,5;[Сљ§ј§њ§ћћўўћђњљљћњ§ї§§ўћ§ћўўРћўяючмрстууѓѓЈ<4BHH:134GPCZЪјљћ§њўўћћўўћ§љљћ§§њњ§ћўћћўў§љўўкумжекзчьёѓыЌ>(1;;9@A;3FEB>CO^>Gнїљѕљњўў§јњ§ї§ў§§њњўлћ§пйзмтрцёѕћћхtFTV87EJB;II:EJrj>Lц§јїїўњљљћљ§§њњўўўћўўћмўцчнжзпсушњћљ…02?3@@G@C?>1@GJHWЛјћљљњњјєљљјјѓ§њ§§ћўћўњ§љ§ўўвњнрлйдЯЮкцїяЩ^!3IC412>CJ;?2+8FZQЃѓєђїѕћєјјћњњ§§Лљјњљљ§ўўћ§ўћўўћўћнмуузжрумчыЏg.1-0+.45??3412AJ[йёрщэюѓѕїїјљ§њљѓѕјћ§њњўћўўеблкуцмсрчяс˜M1C;&)1;?85>?4OQWаєїыыђѓє§§ўћўў§њ§§љ§ўўћћФ§њ§ўњрутхшхртшїѓѓb$*5;<72-!&%3IG7IF\Яїюшяѕљљћљћ§ўўћљўћўњљљ§ўў§ћЮўћёѓяцуттхтнєїk(,8AA;2,.;FTG4JМёячэїћњњ§§ћћњњ§ўўўћўўўћўўгяшучђєїяузєюp@5CHIA125:8274AF;\Июљѕјљћљ§њ§ўћўўўћњњ ўбѓюяёђјјђшуёю<1BOLA#00+:9FGVSLJЂпчёѕћ§§ўњ§§љњ§љљ§ўћўћијўўюэыюёѕђящшюгV(*IPO>,.0325<<4G[[Сєћѕћљљїћњ§њљњ§ўћћ§§њўўияыэяѕєђэыттйV&-?FC7#-2.19?CHAOiьљћѓњљњњ§§љљњ§§њ§ўўўћўў§вўчышыющьчшнщь—):MCOWзљћєїљњњ§њњўћўў§ѕљњўў§њўўњ§ўўднлдзйнтспутлА$%$?H]FUЯ§§їјјїњћљћљљ§§ћўўњњ§љљњњ§ўўажЮдлйжЮЫСЭЭНŸ@#4;:4347FC9HV81љ§јћ§§њ§њ§ўўїћўњ§§ўњ§ўўўћўўЭЯзмкйкхкНШкьч])*708;9:ENQPOW[@B–ћ§љљ§јљћ§њўў§љљ§ўћўўи§њњћћжедЭнягДЇЯцюыw0<,5A8*9;FBEAE?8@›љ§јјєљїњљњћўњњљћўўћўб§јћ§ўўуптяхйНРТчёёљД<75>IA4881A;2CQShРћ§јјњљ§њ§§њўўћўў§ќњўћўўкшёянАЌСбгжпёєЈ+4@732.+8E?9JbIB|ћ§јљњ§§ёљ§ћћљѕњњ§њ§њњ§ўўў§њњЭјыОИДМалюсыїє1-MG@A2-39EEIMSGEФћўњћћљљћљј§§њ§њўўћўўћ§ўћўўмчЧУДЌЫщцтхчљћ›@@7BLAJB<:543]wG%Ѕћћїјјў§њњљћўўћўћўўбњћ§ўўћўћўўеРНЦЯЯьтйймьј—*?7%87ZZ;9Ÿћ§їћ§§њљћљњ§ћћў§њњ§љњњўўлћаЯЪЫЯЪктрсжхєЅ7?8@EGB5:9+#GFESЈљ§њљљ§њњ§ўћњ§§њў§ўў§ЯпмпррцшытскэшЁ:9+9E823@B>&)^^MQљ§јљ§њћўўћњў§§љњ§§ўћ§ењ§§шщычшэяђюшущюЁC@,AB?>7AMIG:E[>&eљ§љњ§ўћњњєљјљљњњ§њ§њў§§ћњ§§њ§§ЦњыыщэыѓєєяєьђуœPGHIMQWcYj˜љ§јљћјљљњ§њўћ§њ§§њ€‚ћљљ§ћўўњ§њњурутудлнптчэьЛS1JOSUIHB‹љ§їїјјњћћљњ§§ћћљјљљјљ§ћ§§љ§њўў§њхртмлдШЩЫажюѓЋL58BE>;-7;@LJOGBW›§§њјјљ§§њљњ§ћљњ§§њћўћњ§§ћњ§ћћўўЫсчщхрбпллЯйюѓЗF>$(38@5781;GVOC^Ёћ§љљњ§ў§љ§§њ§§њћўћћў§§ЩњћўўћњћћлщђєёчйЭнунэтЋL>$2IJB988CE@MPS\Žљ§јјњјїјљњўўћњ§§ќћ§§ўўбћўћњ§њћўмрутхцуждпсщюРN-,PZP<748?>71APE‡§ћјћљїјјўњ§§ўњљўћўўћњўдсхыююськмрььВ?1CJJ?8@94874ge2kј§њњ§ўў§ѕњљ§§ўўћўў§ў ўоЯмцущшттущкЪмЦ`;0IOGB<853>IHP<M`W:jућљїѕѕїјњљљњ§ўўўћўўћўб§ўЭУбннЯЫлпнмкёЯ}A7LJHSN;iы§їїњњћјћћ§§ўўњљ§њћўўўњ§§ФедЮЭЭФЯЭзхыјљљt93QWPL8>ACGBHeH.`цћ§ћњ§§њ§ћјњјјїѕњњ§њћљ§§љћћњњ§–клгЮжаенуюђјјёt;9HLPJHAFLI".kiqЂј§ўњ§ўћ§љљјїјїљўўњћєїљ§ўў§§љљњ§њззгйзУЪгпхѓњљсt8&"HPVQNMBC*4Uh@MЦ§љћјљљјљћћљќјљљ§§њњ§ўўћўўЩ§хыээшспЫЭкэяћљИE-ANP@@?4%;@-3EFBИ§§їњљјљљћљљћћљћљљ§§ћўў§вжзЯгкнпжЯжкжтяМO-QVQSJN>9<;BCGEFЃ§§љњћљљћљ§њњљљњњјћ§§њњ§ељћњ§јћмЯЕРбеннмаШЩжсЧn8OVSMIF?HHF>>IPVљ§њ§§њя§ћўњ§љћњ§ўњ§ўўћў§§њЮљдггеезрчмЪбйкмЎM#Q[SC>FA:937;BH[{љ§ѕїњјћћљћ§ћўњ§ўўЫћўљѕ§§ћњ§њљ§ИЕРУРарцчлагщѓОI%5C<;9A59;YЛћ§ѕєѕїјјФљ§§љњ§§ћћљјїјјњњ§њњ§њМУЯзучььысучщяЮ\5GSIMJJ<B:5;:9?B5);Вљ§ѕњљћ§§љћјћњ§§њњўћ§ћўўг§ћўў§юёюээяьчпйгЫЭЫЕb:;II:BAAELAHLLF4Sž§ћјїјљљћљўњ§§ћљЯњ§§ћљћћѓёѓьэцскезйлтнФdGTYMHIJGGH4-:FJ>Mœћўћћњћћљљ§§њ§§§њ§ўўћњљћћ§рјѕјѕѓёєѕјўўkAEMhE%49A;@C@98@;%<ўў§јў§ўў§ћ§ўўќћў§ўўћїњљѕєєўїўўъŽ@YbaM4;BE725549??&>ђўўјћ§ћ§§ў§ўўў§ўўў§ўўлјљјљїєјѕ§ўў‚NCTM2-552+78>?IG8Hјўўћћў ў§§ў§§ ўпј§љњ§їїѕјј—[U?3,^њўўћ§§ћўўв§ћў§ў§ўўњћ§ћћўљїўўЉ]E92;;>>?<74@?ABWGpЭўўјњћ§ўўќ§ў§ўўўћ§§ў§ќћ§§јјмїјјњљўўНoJCGC>@;AE@>BEFG94G\Ыўўћћ§§ўў§§ў§§ў§ћњ§§ўћўў§њ§јљјјсћўђžmPAEC>85;;@>C85?<;@?FUbхўћјјљњњљљњћћ§ћ§љњњ§§ўў§ўўщњїњљїњјјѕўўАZ$0F>8-577<<я?FIELSпўњјјїјјљјњњѓ§ћ§ћў§§ўўћў§ўўзљњћњјњљјјўўжZ%<@>75110?@BABC9Oьўўљїљљњњћћ§ўў§ўў§ећљїњјљњјњњўўьƒdFAA:;73*,EFJI@VZ`йўўљћћ§ўћ§ўўіћ§ћ§ћўў§ћўўєћ§ћў§ћљћљїѕљљўпp++;:79;4529EFHAQ[cуўўљљњћћњћњ§§ўўћ§ўў§ћћќў§ўћћўћ§њћ§ћћљцѓўўr*5?>CG?@@><:9GcZ@Tгўўћћўњ§§ќћњњ§§ўњ§ў§ў§ўўўњћћўљћћнњєў§rE>CEFCA>;?@>:EJJ@dЮўўјњћњўћ§ћўў§ћў§ў§ўўѕ§ў§њ§ћњћњњљљў№„;7HIM;;11>AE1Sgbбўўњњћћќњ§ћ§§ўћўўўћ§§ўўїљљјѕеєѕўљc)4AB@88227:>AEB@Vpєўўњљћ§§ћ§ћў§§ћ§ћў§ўўђ§ў§ўћ§§ѕѕїѕѕјїїоњўў—)<<9?>9878AA5BONNQжўўћњћ§§ћ§§ўў§§ћ§§њўћ§§ў§§жў§љїјєѕѕїѕѓєўўН0#+3:>;535:98>[OZVЌўўћћ§њњ§§ёњћњћўћћўћ§ћ§§ў§§ћћ§ў§јјћѕђђяёёжјёДC*$07;7,#&<;;@L^LUеўўћњњљљњћњћћ§ћў§ў§§ћћ§Сў§ў§ўўєїѕѓєђєђєѕђцНG**0:A:835A@5Сўўњњљјљњњћ§ўў§ў§ў§§ўў§ў§ўўа§ў§єєѕєєїѕѕѓѓлцЦM.9<::1887;FF<:3@[Иўўљјњћ§ћ§ўћћ§§ћћ§ў§ўўв§ў§љѕљјїїѕђызхўыW.8;894::9BICCGV<2…ўўњњ§ћ§ћ§ћўў§іћў§§ўў§ў§ўўа§ў§ѓєѓѕїѕљхЦЯхўў`+27<:89;;FOTUSZHI•ўўћў§ћћњ§§ў§ћћўў§ўўић§§ўўєѕєјђјхКЉйїўў}9F2><:9:?@LIEB:7Aœўўњњёћў§ћ§ўў§§ўў§ў§ўў§ћѓў§љњљўѓтУЪЦяўўцИA:>B@::<;<<@BESVgОўўњњљћ§§ўћ§§ѕў§ў§ў§§ћ§§ўўа§љўўхВБШйпэєўўЏ+!8<<:4,37>CCOgH>~ўўњћ§ћ§ћ§ћћњњћ§§єћ§ћ§§ћ§ў§ўћ§§ЯўёЦМАСзуїєѕўў›;;H?B;:42:CJIPWJ<Ыўўљњњћћњћћ§ћ§ћ§§ўўйђЪСЗЋбњѕѓєјўўЁ;E7HMOGC?4:?2^~F%Їўўљњњћ§§§ў§ўўњ§ўў§§ўўб§кФСЭЮпњђєєѓњўž&BUCEGEF?58-9]ZC;Ђўўљњ§ћ§ћћњћ§§ўў§јћ§ћћ§ў§ўўмкдедйуьђєђѓўўБ>C8;AC?@?:5-BAIQЇўўљћћѕ§ћ§ћўў§ћ§ћ§§ўг§ћтушёєєђєїѕї§ўЕ??5:;A>::CB+9a]YSŒўўњћ§§ў§ўў§§ћ§њћ§ћў§ўўўћ§§лћьёєѕїјљљњљјўўВHG9BFECABNMF:CaC#hўўћ§§ўў§§ћ§љўћ§ћ§ћ§§хћ§§єїјјљїљјљїїўўБU@BCAGH>BJJѕGM\O:–ўўњћ§§ћ№њ§§ўћ§ўћ§§ћњњ§ћўўшћ§ћў§їєјѕїїјїљїј§ўУN<:@BBя?BMQTU\bYhŸўўњћњћћѕ§ћ§§ўћ§ћ§ћ§§ћњћћ§ўўћ§ћ§§јјћєѕѓѓѕѕўЁЯZ7AHJIE?;FLSYVNNG‘ўўљћњњљњњћ§ћ§њћћ§ћћ§ћћњћ§ћ§§ўў§§љћљјѓёѕєѕѕїўўИYA:?EFA?>CHFNSHHYЁўўљњњћ§ћ§ў§ћћћ§ћ§§ўў§ўћ§§ўі§ўўѕјјљјњѓѓїўнТMF+3:A;>947AMOOH^Їўўћћ§ћўћўћ§§ћћ§ўўП§ћ§ћ§ўў§ў§њњїјљјјѕїїђђѕћўНQF+:FLB72CJNMJUYb”ўўњњљњљњћ§ў§ў§§ћћњ§ћўўг§ў§ћ§ўўєѕїјјњјїїєѕўўс\7-FPLE94>C>>5GTO‡ўўњњћњњїћ§ћ§ћў§ў§§ ўќ§ѕїљљуњїњљјўўУG8,BHGFJEAA?<@kg1mўў§§њў§§ћ§ћћљў§ў§§ћў ўо§јїјљјљњјјєѕяўйgB8GFIEC>47;HIUA;rўўїћ§ўўћћњ§њњ§ћў§§гћ§ћ§ћ§ћ§§єѓћјљњјїјїєњўщgEBNVUE8><79@CMF9rєўўњњјћњњћ§ћ§ћћќњћ§ўўћ§Яћўћў§ѓѕєѕїјѕєїєєїўчk57MQOIFBBAB5Tg`?iщўўљјјљњљћћ§§§ў§ўўў§ўўў§ўў§мёїєѓђѓѕёєѕѕїўх…F0A@EF?;9(BNNMHFJE45YpEUЪўўњ§ћћњћњњћўњћћ§§ћ§§ўє§ў§ўћљѕїєїїѕѕеєїўўОJ-7EBE?75<@?;8BA>Нўўњљћ§ћћњћћњњћњћћ§ћўўќ§ў§ўўг§ћѕёёяёђѓѓєђёђјўЩQ,LOOHOH@A@?>?;@CIaўўљљњјћњћўў§ћўўљ§ў§§ћў§§љўћёяыюєєѕЫїѕѓўўЭL3@?<<897:BGJV)!Zчўўљњљћ§ћ§њћњ§§ўћ§§ћћ§§ў§§ћ§ўўюэюёёђєјјїїѕєљўђu:IIњJMLQMHHчIJ?B\Рўўјјњљњњ§ћ§ћў§§ћњњћћўњ§§ўћ§§ћёђѓѓѕѕрїѕљњїўўхc3@JMLVQHEGOJHNMTYœўўљљњњћќў§ў§§ћўњћћѓњћћ§ћў§їєјјїљљйјєєњјЪ\E5FE>BE>Ќўўњљћњ§ћћњ§њ§ћћ§§ўћўўд§ўћў§ўћјјњљљїїѕѓёёђёєаq@4LGA;@BBFPNIJJ8U—ўўњњћњћѕ§ћћ§њњћћ§§ћћњэѕјѕїєѕїєѓѓєє§ўзkHMJJGюOME>>?E;NЂўўњњ§њњћћ§њћ§ћ§ћ§§љў§ў§ћњћћрьяьтрчыыяљўxQT[tW?HWQSVP^TMON5Qўўў§ўўў§ўўрѓїѓэтуьђїўўЂIauk^INUUWIGJHIOS:Mўўќ§ў§ўўрїћєэыэяѓњўў’ZOc\F4FLOHWMQTS\]iхўјѓѕєњј§њўћў§ў§ўўзђёђћѕѕѓђђ§ўж^+#SPN@GHAFJSSVVQMeђўўїјїўњћ§§њў§§ў§ў ўд§ўђюяјїљєїѕўўщtYUFLAF?>JTZ]ZYnkgрўўљњњў§ў§ўўќ§ў§ўўў§ў ўїјѓїєђёѓѕўўцn9>COIFCLBJBMZ\Zcdtыўўјњњ§§ў§ ўањ§љїјѓѓїѓѕўў7BJMPML^SNJJV[xhP^еўўїљћ§§ў§ў§ў§ў§ўўйћ§јїљћњљєђўў‚VNQVZPPNNQPNPVW]Ovаўўљћ§§ўўќ§ў§ў ўњњ§јљњћћмјїўў”OBT\TNFCENQUZ]pmocЗјљј§§ў§ў§ў§ўў§§ў§ў ўвњљѓњћ§ћњѕњўяg5ETTMHIENOSYUP@cvrуўўњ§§ў§ўћў§ў§ўўрїљїњљћљњѕїїѓi8EPFOJCMNHVMNYYTbўўјњћ§ў§ў§ўўў§ўўќ§ўѓїїујњјљїѕњўЈ7LJJOCPHMNTSS]qbegыўўќ§ў§ўўњ§ў§ў§ўўў§ўўў§ўўлєђщяѓђђѓюѓљњФ?.;@JELFGLILNV~ctiСўўћў§§їў§ў§§ћ§§ўўў§ўўў§ўўнѕїяячщтсннцрБQ3,OMG>L>GQSd\UMCYvаўўњ§ћ§§ў§ўўќ§ў§ўўжђѕѓђєєѓєымсўц`:JLNEGQJJ[b]Z[pOFўўћ§§ў§ў§ўўў§ўўў§ў ўйхшэёюёїыЭбыўўj5FPFGIIQ[]jjhnoZZЉўўћў§ў§§ўўћўўешяьчь§мТЊкѓўў‰FSEQHINPZVY[[]UNUАўўћўћў§ўў§ўўў§ў ўќ§ўћўўѕяѓђўѓуЫЫЩєўўпЪSSQUMTMOQWW[][gq~жўўћўћў§ў§ў§ў§ўўќ§ў§ўўгѕўўчВАШллцђўўЛ;1NNHHALGL\Ucm‚\M‹ўўћў§ў§ў§§ўў§§§ў§ўўкљШРДСзьћјїўўЈAEWVQPNLGNcbcgiaTмўўћ§§ў§§§ў§ўўиѓаЩРАкљјђїїўўДQVP[V[[ZLSLUGr–[3Кўўњўњў§ўўў§ўўвкФЧЯгсњєэьэњўЌ5WmZSQ[VMMHVWxvUHЏўўњ§§ў§ўћў§ў§ўўњ§ў§ў§ўўдлгЯйкйсэяёёљўОISHQSLSVPNN,A[WYeЛўўћ§§ў§ў§ў§ўўќ§ў§ўўў§ўўи§ўшцщэђєёѕђѓыўўКPJIPFNMQPWU:JqieЈўўћў§ўўі§ў§ў§ў§ў§ўўж§ў§ўєѕѓѓєљњћјјѓўўЛWWLVNPOUVae]JWtV4wўўћў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўЮ§ў§ў§ўѓєјљљњљћјњјўћДhVSQTWT\UZgcacpbOЅўў§ў§ў§ў§ў§ўўў§ўўњ§ў§ў§ўўў§ўўћїљєјѕѕпјњњєћўЩdOQULMNU]^bknozr…Зўўћў§ў§ўўў§ўўі§ў§ў§§ћў§ўўв§ў§ўѓєѓѕёшяѓяїѕўўжhIT\YZWZWZ`nki]cZЉўўњћћўћ§§ўў§ћћ§§ў§§љў§ў§ў§ўўд§ўєєђёэючутэюўўРbPEPSNMULTZdd[\]oДўўћўћў§ў§ўўњћ§ўў§ўўњ§ў§ў§ўўлѓїѕїєююяэююўўУ]V7LHNQQFHWYdi][xОўў§§ўўў§ўўў§ўўќ§ў§ўўл§ўяѕљћјјюяэђяўћЦ[M;JLUPTSSY[bhrpwЇўўћћћўњў§ўўњ§ўў§§ў ўвёѓјњљјѓёяђѓўўд^A@W]WUWPPSWWE^mcЁўўћ§§ўћўћў§ў§ўўќ§ў§ў ўпыєєїњњјјїїєўўРNF8WPOQWWUVY][~{Eƒўўў§ўўћ§ў§§ўўпыѕђїѕјїјѕјёхѓмuP@OPYQQSLOV`]dTS‡ўўў§ўў§Ъўћўћўћў§ў§ў§ў§ў§ў§ў§ўюёьїїєѕыыёѓјўђwPQQVYSLHHST[aa[N„ўўєћўћўњ§§ў§ўћ§§ўў§ўўвышэєѕѕѓїёєђёўщvGAWTZTQYV`YOkwqN}ѕўў§љћњўћ§§ў§ўўв§ўхцыёьттёђєэєўчŠU>LJVTTGM[WYcdgWxћўў§ћћ§ў§ў§ўў№§ў§ўяьхунтхщяїїўўй„JBUPUSTPU[a^]~gAzљўў§ўў§ў§§ћћ§§ўў§ў§ў§§ўў§§яў§ў§ўёьрххтыѓѓїљўўэˆMM[QY\^W\`[1Bƒˆ‰Мўўў§ўўњ§ўћўћўўњ§ўћ§§ўўќ§ў§ўўзэяэёьуцёѓљјўўњƒI;0IVee^`[YHItWiмўў§§ў§ў§§іћўћў§ў§ў§ўўоѓїѕїєїяьшёїљўўЧV;MOPTTNIZSVGG]PVЭўўїћ§§ўћ§§ў§§§ў§ў ўе§ўццуущээёьэщыѕўаa@^`[\^^OS]\Z[\UVЗўў§ћў§ў§§ѕў§ў§ўћћ§ў§ўў§бў§§ьцйрьђяяющтуяўм„HW``SY\NY\]UU`gmЖўўћ§ў§ў§ў§ўў§њћў§ў§ўўв§ў§ў§§ьхчщээѓѕёэшыѓїМ^5\WTTNWTQPWVQV]t–ўў§њћћ§§ўў§ўўў§ўўў§ўўежЪзнйцяјѓђэыњўЯY2;OIFSZTTQU]co@*mђўўњ§ћ§§ў§§ў§ќћў§ўўќ§ў§ўўѕкеЯуьђєїѓёяятўє…ISSUaidca[]^a]OUdЯўўћћњ§ћў§§ўФ§ў§§ћўћў§ў§ў§ў§ўкнчюяѕїјїѕѓљўўчt>NOPag]cU[`ddbgomЈўўњўћўћ§§ўўў§ўў§§ў§ўўёєїўљѕѕєїћьШgNALHTQTTђUYTSYLGJРўўњў§§ќў§ў§§ўў§ў ўеїјјїїћјјюпчтрхШvHBOQOWWV]ghegb]SdБўўћўћ§§ў§§§ўћўўЭ§ў§ў§ў§ўћ§§ўїњїњїјїѓыюэьћњлzO`YUU^[Wa\SWVY[VbЕўў§ў§§ўі§ў§ў§ў§ў§ўўћ§ћ§ћўџ!џ!џ!џўˆ џўw џўwџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўw џ џ џ џ џўw!џ!џ!џ!џ!џ!џўѓ§ўћўњ§њњ§њњўњњљљ§њў§њљ§§ћњљ§њўўњћ§љљњ§§іњўўћўўћўћўўєћјўўњњћўњњ§ўўў§љљћњљ§њћўњ§ўў§њћєјљ§ўўћљўћўўћћўўўњўўќћўћўўўљўўїћўћўћўўћўўћўўћўўћўњўўћ ўјћўћў§њљўўћўўћўўўћўўћёўћћўўњћўћўўћўњўўњў§ўўљњ§ўћў§ўў§ћ§љўћћўўћўўўћўўљњўўћљ§ўўњ§ўћўўїњ§њ§ћћ§њўў§њўћћѓўћћўўњўўћўўњўўєћўўћўўћўўћћўўњћўўћћўўќљ§њ§§њ§њўћћўўћўўљћ§љѕћњўўћќў§§ўў§њ§ўўўњўўѓћ§љћћїїјћ§§ћўўўћў ў§њњћњћћўўўћўўќћўћўўћњ§њћћўњњ§ѕљњћњѕїј§ўћўўњћўћўћўўљњ§ў§љњ§§ћњ§§ћўўћўўћўўѓ§њјљ§§ћўћў§§ўў§ќћўўћћўћњўўћўўќћњњў ўўћўўўћўўўњў ўњћўћўћўўќћўњўўўћўўїћўўћўўћћў ўњњў§ўћўўўћ§§ћўћ§ў§ў ўўћўў§ўњўўљћўћўћћўўўћўўўћўўњ§ћ§ўўњўћў ўўћўўћћўўљўўћ ўћ ўћўњњ§љјњўўіћўњјљћ§ўћў ўя§љњњћћ§§ўўћўўћўћўўќћўћўўёћўћћўў§§љ§ћўўћўўјћўўњњ§ў§§§ўћўўўћ§§њўўћўўћўѕњћўўћўўњ§ћўўїћўћў§ћћ§ў ўћћўћћўўћњћўўћћўќћўћўўўћўўљћўћўўћўўўћўўўћў ўіћўћўўћўўћўўњўћєњ§ўћўўћћўўћў ўћћўћћў ўўћў ўћўћў§њћўўќ§њњўўў§ўўћўќћўћўўўћўўћўўћўўўћўў§ћўњњўћўў§ўўћўўќћ§§ўўћ§ўћўўћћўўћўўўћўўўћўўћћўўћўўўћўўћўќћњ§ўўєћўўћўћўњћўњў ўћіўћњћћўў§њўўўћўўўћўў№ћњ§ўў§њ§ўњ§ўћ§§ћћїўњћћ§њћћўўўћўўўњўўљћњњћўњўўњњўћњћўўќћ§њўўќћўћўўњўќћўћўўўћўўњћўћўўњњ§ўћўњћўњўћўўўћўўњ§ћўўћўўќћўћўўўћўўјљњ§ћўўћўў§ћ§ўўўћўўіњўћўўћўўњћћў§ўћўў§ћњўўўћў ўјћ§љљњњљўў§ћњўўўћўўјћњ§ћўљћўўўћўўѕћ§њљћўўћћљњњўћіўћ§§њ§ўўћўўўћўў§љњўўўћўўћёўћћ§ўўњњљљћўўњўўў§њњўћўўћўўњўўўћўўћў§ўўћўўўћўўќћўћўўћўўћўўјћўўћ§њњўўјћ§њўўњ§ў ў§ќњћў§§ўњўўўћўўћ§ўњўўљћ§§ўћћўўќ§ћћўўўћўў§ћњўўўћўў§§ўњўўћћў§§ўўўћўўўћўўі§љљњћўўћњўўўћў ўњћ§§њ§ў ўќћњ§ћћўўћў ўўћўўїћўўћўњћўћћњўћўўћў ўћ§њ§ћўўћўўћўўћћўўћўўўћў ўўћўўљ§ћњўћњўўћўњ§ќњ§ћўўњў§ўўќћўћўўўњћћ§ќњўћўўћўњј§љњўўљњўўђћ§њћўў§њ§§љ§§ўўћњўћћўћўў§њћў ўўњўўќ§љљ§§њўћўўћўўќћ§њўўўњўўўћўў§ўўћўўўњўўы§њњљћўў§љњњ§§љњўћ§§њ§§ўњћћњ§њ§§ўњј§ўў§љћ§љљњ§ћњўћўўўћўў§ћў§єљњ§ўўћўўћўўњњў§љўћћўўћўў§љћњ§њ§ўўћўћ ўўћўў§ћўљўў§§њ§§њўљѓћњљѕњ§ўўћњўўћћў№њўњ§§њљўўћћњўћўћћў§њ§ћќњ§њ§§§њ§ўўћї§§њћћ§ўњўўћ ўўћўўўћўўћћ§§њ§§ўћўўћћўћўћћўіњћљљ§њљјћљљќ§љњўўћўљ§њњўўћўўўћўў§ўњўў§њўћў§ўіћўўћўћў§њљљш§њўћў§§љљњњ§§ўўњћўў§њњћўўњњїњ§§ўўўћўў§ўћўћљўўћўў§ўћў№§њў§ћљљўћћў§§ћў§§ўўћўўћ§њ§ћўўћўў§ўўў§ўўћ§њ§њўўўћў ўћћ§ћћўўўћўўћўўћўўўћўўўћўўўћўўњў§ў§њњ§ў§љўў§ўњ§§љћјїћљљў ўќћ§ћ§§ћўїњ§њњљћљћ§§іћјљѕњњ§њњўўњ§њў§§љћњњњћљ§љљўўћјў§ћѕ§њ§ўўћў§ўљ§§ћњћљћњњ§§њ§ўў§њ§ќўћћўўћшўћўўћ§њњљ§ўўњўћћў§ћ§§њ§љљ§њћћњ§§ўўњѕјљљћљљ§§ўћўўњ§љњ§§њћћўўѕ§њ§§ў§ў§§љўўћ§њњ§ўћћўўќљ§њ§§ўњ§§ўўћўўјћў§њ§§њў ў§њљ§ўњ§ћ§ћћш§њ§њњ§љњўћ§§љћїѕљњ§§ўћћў ўў§ўўў§ўўьћ§ћћњњљљ§ћўљљ§§ћћљљ§§љњ§§ў§ћўўќ§њњўўњў§ќњўћўўї§ћјљ§њ§љ§§њљњљ§њ§§ўњљљўўћўўўњ§§ўќћўўћћў§ћў§§ќћљ§њњќ§љњ§§њш§ўћњћ§§ћћјјћћњ§њњћў§њ§љ§§ўњ§њћћљ§§§љјљљхјїїјћ§§ў§§њљљњњ§њ§ўўљњјћ§§ўў§њ§њњў§ўћўўћўћ§ћјљјјѓљјјїљ§љњљњ§њўў§§њљљљ§њћљ§њ§§ўў§ўўћњ§ўћўўћ§њ§§ўў§јљ§њњў§§ўў§ў§§њ§ўў§§ўћўўўћўў§ў§ћў§§њў§њ§њўўЮћ§§ўћўњћјњњљћћљљћљјљњ§§љћљњљ§§љњ§љњњљ§§љљ§§њјћљњ§ўўј§јѓєњ§ћљљєјљћљћћјјћљљћћ§ўњ§§љњ§њњ§љ§§љќћљњ§§љђ§ўћћ§§љћњњјљјљљђћјњњћљ§§љњњ§њљљ§ўћњ§ў§ў ўѓћ§ў§§ћ§§ћ§§ў§§ћўў§§ћ§ћї§ўў§ў§ўўћћ§њћ§ћћ§ўўў§ўўњ§ў§ў§ўў§ўў§§њў§ўў§ћћў§ѕћ§ўў§ћў§ў§ўўђ§ў§§ћњћњћ§ўў§ўўќ§ў§ў ўј§ў§ў§ў§ў ўў§ўўў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ўўњ§ўўћ§ўўў§ўўќ§ў§ўўў§ў ў§§ў§§ўў§§ўћўў§ ўї§ў§§ћћњњўўќ§ў§ўўў§ў ўў§ўў§ў§§ћ§ўўю§ў§§ћ§ћћњ§§ў§ў§ў§ўўў§ўўў§ўўќ§ў§ўўњћ§ћ§ћ§§ўћ§§ўі§ў§ў§ўћћ§ўўќ§ў§ўўќћ§§ўўњ§ў§§ћў ўћ§њћњњ§§ћўўќ§ў§ўўў§ўў§љћ§ћ§њ§ўў§ ў§ў§ћј§ћљњљњћўўё§ў§ў§ў§§ћўћў§§ћћ§ўћў ўќ§ў§ўў§ћўј§ћў§ўћ§ўўќ§ў§ўўќ§ў§ўў§ўњ§ў§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўў§ўўў§ўўўћўўі§ўћ§ћћўў§ўўќ§ћ§ўўў§ўў§њћ§§ў§ўўў§ўўў§ўўў§ўў§ћњ§§ў§§ўі§ў§ў§ў§ў§ўўќ§ў§ўўќ§ў§ў ўў§ўўў§ўўј§ўў§ћ§§ўў§ќћњћўўў§ўўќ§ў§ўў§ўћ§ћў§ўўў§ўў§ќћўћўўў§ўў§ђћ§§ў§ў§ўў§ћ§ћ§§§ў§ўўі§ў§ў§ў§ў§ўўў§ўўћ§ћў§ўўњћњњћ§ўўў§ўўў§ўўњ§ў§ў§ўўў§ў ўў§ўўў§ўўў§ўўћ§ў§ў§§ ў§ўў§ўўў§ўўў§ўўќ§ў§ўўў§ў ўў§ўўў§ўў§ўќћ§§ўўњћў§ў§ўўњ§ў§ў§ў ўў§ўўў§ўўў§ўўў§ўў§§ў§ўўњ§ўћ§ћўўў§ўўќћ§§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўўќ§ў§ў ў§§ў§§ўў§ў ўў§ўўќ§ў§ўўќ§ў§ў ўў§ўў§ ўњ§ћў§ћ§§њћўў§ћўўћ§ўўћўўў§ўўў§ўўќ§ў§ўўў§ўўў§ўў§ћ§ўў§љў§ў§ў§ўў§ ўў§ўў§ћћў§ў§ўўњ§ў§ў§ўўўћўўў§ўўќ§ў§ўўћ§ћў§ўўј§ўў§§ў§ўўњ§ў§ў§ўў§ў§ўћўўў§ўўќ§ў§ўўў§ўўј§ўћўћ§§ўўў§ўўў§ўўў§ўў§ўќ§ў§ўўў§ўўј§ў§ўћ§§ўў§ўѕ§ћ§ћў§ў§ў§ўў§ћў§ў§ўўќ§ў§ўў§ћў§§§ћ§ўўў§ўўў§ўўўћ§§ўј§ў§ў§ў§ўўў§ўўќ§ў§ў ўў§ўўў§ўўў§ўўњћ§ћў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ў ўў§ўўў§ўўњ§ў§ўў§§ўћћ§§ў§§ўќ§ў§ўўћќ§ўўћћљў§ў§ў§ўўќ§ў§ўўў§ўўј§ў§ўћ§§ўўћ§ўў§ўўќ§ў§ў ўќ§ў§ўўў§ўўў§ўўў§ўў§ћ§ўўј§ў§ћћў§ўўў§ўўћ§ў§ўћћў§ўўі§ў§ў§ў§ў§ўўћќ§ћ§ўўє§ў§ў§ў§ўў§ћўўќ§ў§ўўў§ўўќ§ў§ўўі§ў§ў§ў§ў§ўўў§ўўў§ўўљ§ў§ў§ў§§ўј§ў§ў§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўўі§ў§ў§ў§ў§ў ўў§ўўќ§ў§ўўђ§ў§§ћћ§§ўў§ў§ўў§ўћўўў§ў ўќ§ў§ўўњћ§ћ§§ў ўў§ўўќ§ў§ўўў§ўў§њћў§ў§ўўѕ§ў§ў§ўћ§ўў§§ћѕўћћ§ў§ў§ў§ўўў§ўў§ўјћў§ћћ§ћўўќ§ў§ўўњћ§§ў§ўўў§ўўў§ўўў§ўўјћ§§ў§ў§ўўў§ўў§ўђ§ўћў§§ћћў§§ўћ§§ђћ§§ў§§ўўћ§ћ§ћўў§ўћ§њ§ћћў§ўўў§ўўў§ўўў§ўўј§ў§ў§§ћўў§ћ§ў§§ў§§§ў§ўўћ§ўћ§ћћ§§ћўўў§ўўѕ§ў§ў§§ћ§ћ§ћћћ§ћ§ћўўў§ўўў§ўўў§ў ўў§ўўћћ§њћўў§§ў§§ћ§§ћ§§ѓў§ћћњ§ћ§§ћў§ўўў§ўўє§ў§ў§§ћ§§ў§ў ў§ќћ§ћ§§ўћњњј§ћ§§ћ§ћ§§эў§ў§ў§ўћ§§ћњћњњћ§§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўљ§ћ§ћ§ћўўќ§ў§ў ў§їњћћ§§ћћњћћ§ўјћ§§ў§ў§ўўќ§ў§ўў§ћўћћ§ўў§ќћ§§ў ўћљў§ў§ў§ўўћ§ў§ў§§ћяўћ§§ў§§ћўћ§§ћћў§ўў§ўі§ў§ў§§ћў§ўўї§ў§ў§§ћ§ўўў§ўўќ§ў§ўўў§ўўј§ўћ§ћў§ўўќ§ўћ§§§њћўў§ћћў§§ћћў§ўўђ§ў§§ћ§ћў§ў§ў§ўўѓ§ў§ў§ўћ§§ў§ў§§ўћ§ў§ћ§§ўў§ўўў§ўўўћўўў§ўўў§ўўў§ўўў§ўўњ§ў§ў§ўўў§ўўі§ў§ў§ў§ўў§§ўі§ћћ§ћ§§ўћ§§єћ§ў§ў§§ћ§ћ§ћћњѕћњћ§ў§ў§ў§ўўњ§ўў§њћћў§§ў§§ћў§ћћ§ўћ§§ўў§§ћњўћ§ћњ§§ћћ§ўў§ўўў§ўў§ћњ§§§ў§ўўћ§ўў§ћћі§ћ§ћ§§њћњ§§іћ§ћў§ўћ§ћ§§ќћ§ћўўў§ўўє§ўћ§§ћћў§ў§ўўљћўћћ§§ћћ§љў§ћ§§ў§§јћўњћћ§ћўўў§ўў§ќћ§ћ§§§ћ§ўўј§ў§ўћ§ћ§§єћў§ў§ўў§ћ§ћўўь§ўћ§ћ§ћ§ћ§ћ§ћ§ћў§ў§ўўјћ§ћ§ўў§ўўё§ў§§ћ§§ћў§ћўћћњњќћ§ћ§§іў§§ўћ§ћњњ§§ќћ§§ўўў§ўўќ§ў§ўўьћў§ўћў§ўўћњњљљћўћў§ћћіњћћ§ћ§ћ§ћ§§ўќћ§§ўў§§ў§§ўўћћ§ў§оњ§ћ§§ћћ§ћ§ћ§ћ§ћў§ўћ§ћ§ћ§§ўћћўў§ў§ўўћ§ў§§ћћ§ў§ўўў§ўўљ§ћ§њўћ§§њћў§§ћ§§їћўў§њ§ћћњњњ§ћ§§ў§§їў§ћ§ћ§§ў§§њљўћ§ћћњћћљњљљњњћ§§ыћ§ћћ§§ћ§ћў§ћљњњ§ћў§ў§§§ў§ўў§њћў§ў§ўў§ьњ§ћ§ћ§ћњњћћ§ћљћ§ћ§§ўў§ћ§ћћ§§њћ§§ћћ§§ў§§ўў§ўўўћўў§§ў§§№ћў§ўћ§ў§§ў§§ћў§ўўј§ўћ§ћў§ўўњћ§ћ§ћ§§ўњ§ўћ§§ўўњћ§ћ§§ўў§ўћ§§ў§§ћўўј§њњљљћњћћщњћ§ћ§§ћћњў§ўћ§ћ§ћў§§ў§ћћ§№њћ§ћў§ўў§ћ§ћ§ћњћћў§ћћњћњњћњњћ§§ќћ§ћ§§љћўћ§ћ§ћћјњћ§ћ§ћ§ћћ§ўі§ћћњљљњћ§ћћњљіњћ§ћћ§§ћ§ћћќ§ћњ§ўў§ўўќ§ў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўј§ў§ўћў§ўšўў§ўўў§ўўў§ў ўњ§ўћў§ў!ўў§ўўў§ў ўњ§ўћ§§ў3ўќ§ў§ўўќ§ў§ў ўў§ў ўў§ўўјћ§ћўћ§§ўўќ§ў§ўўў§ўўў§ўўє§ў§ў§ўћўњ§ћўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ўўў§ў[ўў§ўўќ§ў§ўўў§ўўў§ўEўќ§ў§ўўќ§ў§ў ўў§ўўў§ўўў§ўўњ§ў§ў§ўўњ§ў§ў§ў/ў§{ўў§ў=ўў§ў=ўў§ў ўў§ў ўў§ўAўў§ў5ўў§ўўќ§ў§ўўў§ўWўў§ўaўў§ўўў§ў+ўќ§ў§ўўў§ўўў§ўўў§ўўќ§ў§ў ўў§ўўќ§ў§ў ўў§ў;ўў§ў;ўќ§ў§ўўў§ўўў§ў-ўў§ў ўў§ў/ўў§ўўў§ў'ўў§ў=ўќ§ў§ўCўў§ўўў§ў)ўў§ў9ўў§ў3ўў§ўўў§ўўў§ўўў§ўўў§ў ўў§ўўњ§ў§ў§ўўў§ўўќ§ў§ўўќ§ў§ўў§ўў§ўўњ§ўћў§ўўў§ўўў§ў ўі§ў§ў§ў§ў§ў+ў§ўћўўќ§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўўў§ў ўќ§ў§ўў§§ў§§ўј§ў§ў§ў§ўўє§ў§ўћ§ћ§§ў§ўўњ§ў§ў§ўў§ќў§ў§§ ўў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўўў§ў ўў§ўўќ§ў§ў ўў§ўўў§ў ўў§ўўњ§ў§ў§ўўў§ўўў§ў%ўў§ўўў§ўKўў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўњ§ћћў§ў ўў§ў ўђ§ў§§ћ§ћў§ўћў§ўўў§ўўў§ўў§ўњћ§§ў§ў ўњ§ў§ў§ўўђ§ў§ў§ў§ў§ў§ў§ўўў§ўўј§ў§ў§ў§ўўќ§ўћў ў§ўј§ў§ў§ў§ўў§§ў§§ћў§ў§ў ўњ§ў§ў§ў ўњ§ў§ў§ўўќ§ў§ўўє§ў§ў§ў§ў§ў§ў ўў§ў ўў§ўўўћ§§ўќ§ў§ўўќ§ў§ўўў§ўўќ§ўћўўў§ўўўћ§§їў§ў§ў§ў§ўўў§ўў§ўј§ў§ў§ў§ўўќ§ў§ўўў§ў ўў§ўў№§ў§§ўў§ў§ў§ў§ў§ўўќ§ў§ўў§ѕўћўћў§§ўў§ўўі§ў§ў§ў§ў§ўў§§ў§§чў§ў§ћ§§ћўћњњў§ў§ў§ўў§ћў§ўўњ§ўћ§§ўўќ§ў§ўўў§ўў§љў§§ћўћ§§ќћ§§ўў§ѕў§ў§ў§ў§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўў§ўўј§ў§ў§ў§ўўў§ў ўќ§ў§ўўј§ў§ў§ў§ўўў§ўўї§ўћћ§§ћў§§ћў§ў§ўў§ўў§ўўќ§ў§ўў§ўў§ўўр§ў§ў§§ћ§ћ§ћў§§ћ§ћў§ў§ў§ў§ў§ў§ў§ўўњ§ў§ўў§§њў§ў§ў§§ўя§ў§ўћўћў§ўћ§§ћћў§§§ў§ўўј§ўћў§ў§ўќњ§њ§§§ўћўўњ§љћњћўўўћўўўћўўє§љљїјљћјњјїєє§ѓћўўфћўћўўћў§ћћ§љљћ§§ћўњў§њћў§§њўўћ§ўћўўэ§њћњјћћљћћјњїјѕїѕѕўўўћўў§ѓњћљњ§ўњљљњ§ћўўќћњћўўѓ§љћљњњљћјїјћјјљњїјўўћўўўћўўўћўўќћњњ§§ўњ§§їћ§ћїјњњљ§§њњўћњњћћіўњњ§љ§§ћўњњўўћўў№ћўўћ§§љјѓїљњјљ§њњњјњљ§ћ§§ўћ§§ўѓћўўњљћљјљњњ§љљўњ§§ўўћ§§єњћњњљїїѕњїїјјћћљћ§ћўўўћ§§їўњљ§ўў§њўўќњ§ѕћћў§ўў§ўђ§ћњѕєѓѓљјїјњљ§§ўњ§§єљњўўћўўћўўћў ўіћўўћњјњћ§ўўшћўў§ўўћњјїјїѕњћ§јљћљ§§ў§§љўњѓѓћ§ў ўјћўћў§љ§ўўчћ§§љљњљјљ§љ§ўў§ћѕєѕјћљћњўў§іњїђѕћњћў§ћћ§њњ§§њ§ўў§їњћўўњњ§њўў№ћ§§ў§љјїєѓєѕїљњў ўщњљјјљњўћў§љљњ§ўўћњ§ўћћўўъњћ§њўўњўўњћўўћ§јєѓїѕћўў№ћўўњљњ§ўћњўћўўћўўўћўўўћўўќ§њ§ўўѓњљљєїѕјћ§§ўћўўўћ§§ўћўўњўўјњ§ћљ§њћўўњќ§ўћўўю§єѕєѕїјљљјјћљњљњ§ўўњћў§ўћўў§ўћўў§ўћ§њ§ћўў№ћўћўў§њњћњ§љћњ§љљћћњ§ў§§§ўћўўўњўўўћўў§іў§§љћћўћћўўєћўў§њ§њ§њ§њ§§іњ§јєјїњљ§ўў§ў§ўљўўќћўў§§ў§њѓ§ўў§њњљњњўћўћћћњ§њ§ўўћ§љјјљљћљўњ§§ў§њ§ўўђћўў§§њ§ўњћћўћўўўњўў§їћўўњњўћћўўљ§љњћ§§њњњћўўћћўў§њ§ў ўў§ўўњћўўћћўўўњўўўћўўљ§ћљїњњўўјћўћћўўћўўўћўўї§њ§ћўўћћўўяњўњ§љјњћ§§њњљњўўћћћўњњ§ўўўћўў§ўћў ўќ§њћўўљ§љїјњћўў§њ§ћљўўћўўњ§§ў§§ўўћўўцћў§§њўўћњ§§ћњјњјљ§§ўўћћўњ§§ћљљћ§њ§§ўў§љљњўўћћўўњњ§ўў§§ўўћ§ћћјћћ§њыў§§ўўћў§§њ§§њ§§њњўўћўўў§ўў§ћў§§ўњ§§ўњўўўњўўў§јјѕњљ§ў§§њњљњў ўќљ§ћўўі§њўў§§ўўћўўяњљљ§ћўўћўўћњ§ўў§њњђћїјћ§ћўўћљ§ўћўўјћўўћўўћўўћїўћўў§њњћўўўћўўіћўћћњњћљљћћїњѕїјљ§ўћўўћўўћ§§ў§ћўћћћ§ўћћўў§њћ§§§ўњўўќћўљ§§ўњ§§іћїїњћњњ§§ўўўћўўњњ§јњ§ћўўќћўћўўўћўў§ўсћ§ўћў§јјїјљљ§ўўњјљјљњ§ўўћћўћћўћћўѓ§ћјљљ§њћўћњ§ўўњњљљј§ўўќћўћўўњњљћћ§ўўњ§ћњјћњњќ§ўњўўћўћћ§љ§ўўћћўњ§ўў§ў§єћўўњўўњ§§њ§ўў§јћњїјјљћ§§§њћўўћћўўћўўќћўћўўєћўўћћў§њ§§јљљњјњњјњјјјїѕѕїјћљ§§ўќ§њ§ўўўћў ў§њ§љћўўњў§ћќњјћњњєљїћљћ§њў§њ§ћћўіћ§§њўћўўљўў§ћњ§§ћўў§ўњўўќ§њљ§§њњ§§њњўўі§ћљїїљњ§ћљљ§ќў§ћўў§њўћњ§§ўўћњљћљўўч§њ§§њ§њ§ћљјњјѕєєљћ§њ§љљ§ўў§ўўћўўў§ўўўћ§§ќњўњўўўћўўю§њў§њ§ћїђѓѓѕј§њ§§ўўњћ§љњ§ўў§§њ§§ўњќўћў§§ўњњ§ўўћўўљћѓ§њ§љњєѓёєњљ§ўўћњ§љ§ўћўў§ўћўўњјўњўўћ§§ўўљћњћљљћљљ§§ћљѓѓјѕјљњњ§§ўўћўњ§ўўњў§§ўђћўћўћў§§ўњ§§ћўў§§ћљљћљіћњњ§ћљѓѓєјјљћћ§§ћњњє§ћўњ§§њ§ўў§ўўў§ўў§§њўўч§љћћ§§њ§љљјјљћћњїѕѓђєїњљ§§сљћ§§њњ§њћњў§§њљћјљ§ўўњћњ§§њўћћўўжљњ§§ўћћњ§ћњїњјјњјјѕєђѓѕњљ§§њ§ўњ§§ў§њњў§њ§ўўћ§ўўћўўєћњ§§њћћ§ћјљјјъњљњљћњїљљјћљљїѓёђєїћњ§§ѕў§§ўў§§њњў§§ў§љњ§§ўћ§ћ§њ§§щћјїњљћћјјљљћњћїєєђѕњ§§ўўўњўў§ћќў§ћўўќћўў§§ќћ§§ћћњў§§љћћ§§њ§§ќњ§§љљяїѓёёєљњћ§ћўўњ§ўћўўћћўўћўўыћњњ§ўћњћћ§§ћћљњљ§§њћљљјћіјљєёёяјїљњњќ§њ§ўўќњїњ§§ў§§њ§ўўњ§њўўњ§§§ўћ§§щћљјїјљћљїљѓёђєљјћћ§§љњ§§њњ§ћњ§§ўў§ўћўўћўўчћ§ўћћўў§ћјњњљљњћјљїѓѓєїј§§ќњ§њ§§ў§ћњўћћ§§ўљћњћљћјљљњљфћ§њљїїњњјњјњњѕїѓєѕї§ўў§њћј§ўўэћўњљљћ§ћўњњ§њњљљћњ§§ўњїљћјњћњїїјјњіѕђюяђѕј§њ§§ўєћњ§§њ§ћћ§§њ§§јў§§ћљљњ§§ўњ§ћћњ§ўў§јёњћљћћњљїђяюђѕљ§§њ§ёўњљћ§§ў§њљњ§њњ§§ѓў§њ§њњ§њњћћљўўїљ§§ћњїјњљљћїњјѓђѕєїћ§§ћќљ§њўўўњ§§ћў§њњ§§ўњ§ћљћјћћўф§ћњїїјћљћњїѕђёђѓѕјїљљћћј§§њ§§іњћћњ§§ўћў§§ўјћўўћўўњ§§њї§њѕѕїњћљ§§ѕњїєѓѓєѕѕљљћћѓљћ§§љћњљљ§ћњ§§њќљћњўўќћўћўў§ўћїїсѕљјћљћћњїѓђёёѓѕј§ўћў§љјјїљњ§§њ§§ўў§§ўўњ§§оўћў§љљ§њ§љћ§§њїљїјљњ§њ§§љљєђђѓѕјњўўќњ§њ§§ў§њєўћ§њ§љњ§њљў§§ў§ћћјїјћћќљћћјјїѓёђѓђјћњ§§ќћўћўў§ўў§ўўњ§§њ§§щњў§њћјљ§§њј§§ћљѕїљїљїїјјї№єёяяюѓљјћљњ§§њњўў§ўћ§§ќњ§њ§§ћњћљћ§§ыћљјњњљљћћјїєєѕїјј§§љјјєєяяьюяѕњ§ўў§§ђњ§§њ§њ§њ§ў§њљњњќ§њћўў§ьћљј§§ћћјїѕєјљњћљћїїјј№ѕђђююђјјљћћїљљ§љљћяљ§§љћњ§њљљ§ћ§ћћљћћњњљѓєљ§§јнѕјјїїјњјњјјњјѕђяыщшяђѕїјљњљјєћћњ§њ§§ќћ§њ§§ђњ§ўњ§љљ§љјўўњљљє§ћїѕїєјѕїїњћћь§љјјѓёяюэяїѕїћћ§§њ§ўўќћњњ§§ўћљ§ўћњњћўў№§њљјљєїєєѕєјћјјћћњљљєђюяяѕѕюљјњћ§ў§ћ§§ћљјљјћћ§§ћњ§ћњўў§ўў§§жћјљјѕѕїјњјљћљљћљћјјѕђяяююэђєјїњјјњјјїјњћћљљћїљњњћўњњљ§§єњ§јљјјїѕјїњћћћљћљљћћёљјєђёьцчщэѓєњћ§§ўњ§§ўўљ§§њњ§ћјљћћэѕљјћћњљјѕїїѕљїїљљњјјхѕјњјјїѕђюычхшюђєјїїјљњ§њўў§§шљњњјїјѕљњјњћљљћљјјєєѓјјћћњјьїјїєєѓяшкзншьэюяѓїїћћј§њ§§ћћљњњјћѕ§ћ§ћ§ћ§§ў§ўўљ§ћњ§ў§ўўў§ў ўў§ўўћ§ў§ўћћјњћњњљњљїїћў§ў§ўў§њћќњћ§ўўіћ§ўўћћ§ў§ўў§§ў§§љњљњњћћњњљњїјѕјјўўў§ўўь§ў§ўћ§ћ§§њћ§ћў§ћћ§ћў ў§ћљќћњ§њњќљћњўўў§ўўќ§ў§ў ў§іћ§ћ§ћ§ћњћњњљѕћ§ћ§ћ§§ўў§ўў§ќћ§ў§§љў§ў§ў§ўўњ§ў§ўўћћљњљјљњћ§§ќљњљћћќ§ћўћћ§ў§ўўќ§ўњћћ§їћўћћ§§ћ§ўўў§ўўћ§јћљљјљљњљљњєћњћњ§ўў§ў§ўћћњў§ћћў§§§ў§ўў§њљћњњћў§ўўђћ§ћў§ћњљјїѕїјњњѓљћћ§ћ§§ћћ§ћ§ўўў§ўўў§ўўў§ўўљњљњљњћўў§љўњљњћњљљјњћ§ћњћћ§§єћ§ўљїїњ§§ў§ўўў§ўўћњў§ўў§ћћњ§ћ§ћћ§§ѓўћњјїїњњћњ§§ўў§ћщ§ћ§§ћљјћ§ў§ћњњћћ§§ћћ§ћўўћћ§ћ§ўў§эў§ўў§ћўћћњљїѕїјљћ§ўўќ§ў§ўў§њћњњћ§ўўћњ§ћў§ў§§ўў§ўўѕ§њћ§ў§ў§ў§ўўј§њїєѕљћўўў§ўў§ўў§ўўќ§ў§ўўў§ў ўў§ўў§§ћ§§ѕў§ў§ћјїѕјњћћўї§ў§ўћ§ћ§ўўќ§ў§ўў№§ў§ў§ў§ўў§ћњћ§§ўў§ўћўўђ§ў§ўћћјїјљњћћњњјћ§ћ§ћў§ўўўћўўњ§ў§§ћўў§ўћўў§ўќ§ў§ўўђ§ўћ§§ў§§ћњ§§ћјјїњ§ћўћ§ћ§ўўќ§ў§ўўў§ўўљ§ў§ћћўћћўњўўэ§ў§ў§ў§ўћ§ћ§ћ§ћ§ћ§ћћ§јњљїљљћћўўљћ§ўўћ§ўўї§ћћ§ў§§ћ§§§ћў§§ќў§§ўў§§ћ§§ў§ќћњњћћњћљ§ћ§ћ§§ўў§ќћў§ўў§ќћ§ћўўў§ўўћќў§ў§§ўљ§ћњњ§ћ§§ўњ§ў§§ћўўќ§ў§ўў§§ў§ўўў§ўў§§ў§§§ў§ўўі§ў§§њјљљ§ўўў§ўўј§ў§ў§ў§ўўњ§ў§ў§ўўќ§ў§ўўј§ўћ§ћў§ўўќ§ў§ўў§њћњљњћ§§ў§єћў§ў§ў§ў§ў§ўў§ћїў§ў§ў§ў§ўўћ§ўћ§ўўі§ў§§ћћњљњўўњ§ў§ўћ§§єћ§ћ§ћ§§ў§ў§ўў§јћўћ§ћў§ўўў§ўўћў§ўў§єћњљњљњћ§ћў§ўў§јћ§ћњњћњ§§ўћўўў§ўўћ§ў§ўўє§ў§ў§§ћў§§ћўўё§њњћћњњћ§§ў§§ћўў§ќћ§ћ§§ђћ§§ў§ў§ў§ў§ћ§ўўю§ў§ў§§ћ§ћ§ћ§ћ§§ў§ўў§њ§јћ§§ў§ў§ўўў§ўўў§ўўљћ§§ўћ§ўўэ§ў§ў§ћћ§ўў§ў§ўў§ћў§§ѓњљњњ§ўў§ўў§§ўўў§ўўќ§ў§ў ў§ўќ§ў§ўў§ђњћћњњћњњјљњћћўўў§ўўќћ§ћў ў§ћ§ўўћўў§ўўї§ћћ§§ћ§њљљўњ§§ўћўў§§ў§§іћ§ћў§ў§ў§ўўњ§ўћћ§ўўўћўўюћ§њљњћћ§§ў§њјњћ§ћў ўѓ§ўћњњћћ§§ў§ў§§ќў§§ћћ§ ўю§ў§ћњћћў§ў§ўћњљњњ§§ўћўўў§ўўљ§ћ§§ў§ўў§ћў§§ћўў№§ў§ў§§ћў§ў§ў§§ћ§§ђў§ўћ§њљљњњћњ§ћћў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўўј§ў§ўў§§ўўћћ§ћ§ћћќњљљњњљљјјљњњћћ§їў§ў§ўћ§ћўўќ§ў§ўўў§ўўќ§ўћ§§ў§§ў§ўў§ћ§њњѓљњњ§§љјљњћњћ§§ўі§ўў§ћ§§ў§ўўц§ў§§ћ§ћ§ћћўў§ўћћ§ў§ўћ§ћ§ћ§§ќћ§§ўўі§њјљћћ§ћњћћўўћћ§ўћўўъ§ў§ў§ўћћ§ў§ћћў§ў§§ўњћўўў§ўў§§ў§§ћќ§ћ§ћћїњљњјїїјњ§§ќћўћўўњ§ћћў§ўўљ§ў§ў§ў§§ўўћћ§ўў§ўўў§ўўўћ§§јњћљѕѕјњ§§ѓћў§ўўћ§§ћў§ў§§ћћ§ћў§§ў§ќћ§ћўў§§ў§§ў§§ћњњ§іћљїёђїљћћўўќћўћўўї§ў§ў§§ћ§ћћ§ў§ўў§їў§ў§ўћ§§ўўў§ћћўњћћ№њјѕёѕњњћ§§ћ§§ў§ўў§ўщћ§ћў§ў§ў§ў§ћћў§ћћў§ў§ўћћњћўњ§§њњјѕёїњњћћњћ§њ§§њћў§§ћ§§њўћў§ў§§њў§ў§ў§§ўј§ћњњ§ћ§ћћњ№ћњћљљјѕѓїљљћ§ћ§ћћ§ўћўў§јћ§ћњћўћўўћ§ћ§§ўўј§ў§ў§ўў§§ў§ћњљљњхљњњјїѓѕљљћ§ћ§ћњ§ћћўћ§§ўћ§ћўў§§ў§§ўѕ§ћ§§њњћњ§ћњњсљћ§ћњљљјјњњћћљѕђєїљњ§ћ§ћўћ§ўўћ§§ѓћ§§ў§ў§ў§ўў§ћћ§ў§ўўњћўћ§ћ§§њ§љћњњћю§ћљїѓєјњћ§§ў§ў§ў§ћћўўћўўў§ўўї§ћћ§ћўћћњњ§њў§ўћћњњћћ§ћ§ћ§§ћѓљїђєїјљњћў§ў§§їў§ў§ў§ў§ўўќ§ў§ўў§юћўў§њћћ§њўў§ў§ћ§њћћё§њњћњњјїєєїїњћ§§ќћ§§ўўї§ћ§ћў§ўћ§§ўћ§ў§ў§§фў§§ћ§ћўў§ћ§ћњћњљњћњћћјѕђєїјњњљ§ћў§ћћ§§єў§ћ§§ў§ўћћ§ўўў§ўўў§ўўњ§ў§ўћўўђ§ўћњњљљћћ§њ§јѕѕфїљњ§ћ§ћћ§ћ§ћћ§§ўћ§ћ§§ўў§ћ§ћўўј§ў§њћњњћћ§ћъњћ§ћћњњљњљњљњјѕѕѓєљћў§§ћ§§ў§ўўў§ћћўў§§ћіњ§ћ§ћ§ћ§ћўўі§ў§§ћњ§§њљљњљђјєяђєјњ§§ћћ§ћўўы§ћћ§ћњњ§ћ§ћ§ћўћћњћћ§ћћ§єўћњњ§ћў§ўћ§ћћњяљњћњњ§ћљєэяєјћ§ћ§§јћ§ў§ћњћ§§ўћ§§јћ§ћўћ§ћ§§њюћў§ў§ў§ў§ўћћњљљњљћћъњћљїѕєєљњњћ§ћ§ћ§њњћћ§ўў§њћ§ћўћ§§ћ§ќћњћњњўі§ў§ў§ў§§њљљњюћњљљјѕєєѕјїљћћњњћ§§ћљ§ўў§§ћўў№ћ§ћ§§ў§ў§ў§ў§ў§ўў§ќћ§ћ§§яљњјљљњћ§ћ§љљїѕѕїјјГћњћњћњ§ћћњ§ўўћњ§§ћ§ћ§§ћњ§§ў§ў§ў§ў§ў§ў§§ћ§ћ§ћњљѕєјјњњћњћљљїєђѓєјњ§§ўў§ћњњћћ§ћ§§ўћ§§§ћ§ћћ§љў§§ћ§ћўўћ§ѕћњћ§љљјљњћ§§ћїјїєєѕјњ§ўў№§ў§ў§§ћ§ћ§ћў§§ћ§§ўъћ§ћћ§ћ§ћўћ§ћў§ћћ§ћћњљњњўћњњѓїѕѓёюєїћ§§ћ§ўўє§ў§§ћў§ўћў§ўў§§ћ§ћћ§іўћ§њ§ћ§ћ§ћћјљљјњћњћњњёћљїєђэёѕјњњћ§ћ§§ў§ѕћ§ў§ћ§ћ§ћ§ћћё§њћњ§ћ§њћњљљћћњњѕљїїјљњ§§ћћњњьїѓээьѓјљ§§ўћ§ћ§ћ§§ћ§§ўћ§§їћ§ўў§ўћ§ћћќ§ћ§њњєљјїїјљњћњњћњњ§јєёёћєїњћњњћ§§ўћћњяў§ћўњ§ћ§ўўћўћњњћњњќ§ћ§ћћЫ§ћ§њїјїїљљњљњљњњљњјѕђьчяѓѕјљњћ§ћњћњњ§ћ§ћ§ћњћ§ћ§ћ§ћў§ћћќў§§ћћјњљјєїїјљљыћњћњ§ћњїјєѓяюѓѕјљњћћ§§лў§ў§§ћ§ћ§§ў§ў§ўў§§ў§§ўў§ўћ§ћњјїѕїїјјњњєћњљљјјєёьђєјјњњљњ§ўћћ§§њћћћњћњ§ћћћ§ћў§ўў§ћћ§ћўћћњђјїјјљњљњћњћћњћћщњјєёђяьюєїїљљњњљњњљњљњћћњЩћ§§ўў§§ћ§ћ§ћ§ћ§ћњњљјїљњњћњњћњћћњћњћњїѓѓэутьюђїљњ§ћ§ћ§ћ§§јћ§§ўўћћ§§њћњю§ћ§ћњњјїјљљњјљљјјњњьљњњљјєёьшцщђѕїїљљњћ§§эў§§ћ§ћћљљњљїјјљњ§њћћњўљїїњўћњњљњщћњљјїєђцмепщэёђѓѕѕљњћњ§§ћћњњћљљњўќ§ў§ўў§ўљћўћў§§ћћњ§јњјњў ўі§ў§ўћў§ў§ўўў§ўўэ§ў§ўћ§ћ§§ўћўњћљњљћў ўљ§ў§ў§§ўўќ§ў§ўў§ћћўћў§§ѕўћ§ћўћўћўћў)ўъ§ў§ў§ў§ў§ў§ўћўћў§ў§ў§ўўў§ўўј§ўў§ўў§ўўє§ўњ§њўћ§§ў§ћћћўћў§ў ў§§ў§ўўј§ў§ў§ў§ў ўю§ўћўћњњ§њўњ§ћўћўћ§§ ўў§ўўў§ўўј§ў§§ћ§§ўўў§ўўя§ћћњљњ§ћўћўћў§ў§ўў§ўњ§ўћў§ўўћ§ўў§ћћщўњ§ћўў§§ў§ў§ў§ў§ўћўњ§§ўўў§ўўћ§ў§ў§§ўў§ўўі§ћњўћ§§ў§ўўў§ўўі§ў§ўњўљћ§ўўњ§ўћў§ўўў§ўўќ§ў§ўўў§ўўў§ўўі§ўњњїњљ§§ў ў§ћў§ўўў§ўўў§ўўј§ўјћј§ћўўў§ў'ўў§ўўјћ§јњљћћўўќ§ў§ўў§ўў§ўўћіјћњўћ§ћћ§ўўў§ў ўў§ўўў§ўўќ§ў§ў ўє§ў§ў§§њ§њ§§ўўќ§ў§ўў§ћ§ў ўњ§ў§ў§ўўў§ўўі§ў§ўљћњў§ўўў§ўўў§ўўў§ўўў§ўўњ§ў§ў§ў ўў§ўў§ћ§§ў§§ўќ§ў§ў ўў§ўўў§ўў§єњў§ў§ў§ў§ў§ўўў§ў ўў§ўў§ќњ§ћў9ўј§ўћў§ў§ўўў§ўўў§ўў§§ўћћў§ўўў§ўўј§ў§ў§ў§ў ўў§ўўі§ў§ўћўћ§§ўўћ§ў§ў§§§ў§ўўў§ўўў§ўў§љўћ§§ў§ўўў§ўўј§ў§ў§ў§ўўќ§ў§ўўќ§ў§ўўє§ўћ§ўў§ў§ў§ў ўў§ўўў§ўўў§ўўќћ§§ўўў§ўўі§ў§ў§§ћ§§ўўў§ўўў§ўўђ§ў§ў§ўћ§њћњў§ў ўў§ў!ўў§ўўє§ў§ўњ§ћ§ўў§ў ўќ§ў§ўўћ§ўњў§§ўњћ§ћў§ў ўњ§ў§ў§ўўў§ўўњ§ў§ў§ў ў§ўћўўј§ўћ§ўў§ў ўќ§ў§ўўў§ўўў§ўўў§ўўњ§ў§ў§ўў§ћћ§ћў§§ўў§ў!ўћ§ў§ў§§яўћўћўњўћўћ§љћњў§ўўў§ўўў§ўўў§ўў§§ў§§юћў§ў§ћњ§§ў§ў§ў§ў§ўўќ§ў§ўўќ§ў§ўўњ§ў§ў§ўўє§ўњ§ћ§ўў§ў§ўўќ§ў§ў ўў§ўўї§ўћўћўћћњњћў§ў§ўўў§ўўў§ўў№§ў§ў§§ћћїљљў§ў§ў ўњ§ў§ў§ўўў§ўўќ§ў§ўўў§ўў§§ў§§ѕў§§ћњљљјћ§ўўќ§ў§ўўў§ўўў§ўў§ћў§§ќў§§ўў§§њљљќњўћўўў§ў ўў§ўўў§ўўћћ§§ў§§єў§§њљљњћўћў§§§ў§ўўў§ўўњ§ў§ў§ўўў§ўўў§ўў§сў§ў§ўћўћў§§ћўњћљњњ§ћ§§ў§§ћў§ў§ўўњ§ўў§§ўўќ§ў§ў ў§ўь§ўњўћўћўћћјњљ§ћў§ў§ўўў§ў ўў§ўўќ§ў§ўўт§ўћўћўћ§ў§§ўњ§њў§§ћњљљјњњ§§ў§ўўў§ўўј§ў§ў§ў§ўўў§ў ў§ћўћўћ§§їћў§ўћўћњјјћћњў§ўўў§ўў§ў§ъћў§ў§ў§ў§ў§ўћњњљјњњў§ўўў§ўў§ѕћў§§ўў§ў§ў§§ъћ§§ў§§ћўћ§ћ§јњјћљўћў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўы§ў§ў§§ћ§ћ§§ўћ§їљјњњћ§§§ў§ўўў§ўўњ§ў§ў§ўўћ§ўћћ§§єћњјљїњњў§ў§ўўў§ўўќ§ў§ўўќ§ў§ўў§ћў§ў§ўў§ў№ћўњћћўћћњљјљѕљњўўњ§ўћў§ўўќ§ўћўў№§ў§ў§ў§§ўў§ў§ў§ўў§ьў§ћ§њћћўњўћћѕїѕјљў§ўўў§ўў§ћў§ў§ўў§ўў§ўўў§ўўў§ўўћћўћў§§пў§§јљїјљ§§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўўў§ўўњ§ўў§§ў ўш§ћ§ћў§§ћ§ћћљљѕљљў§ў§ў§ў§§ўќ§ў§ўўў§ўўњ§ў§ў§ў ў§щћ§њў§ў§ўњћљњјљљћњўћ§§ў§§ўў§ўўў§ўўќ§ў§ў ўѓ§ў§ў§ў§ўњћњў§§ѕў§ћњњїљјћљ§§ўћ§§ѓў§§ўў§ў§ў§ў§ўў§ ўђ§ў§ў§ў§§ј§љ§ћ§§ћњјјљїћљў§ўў§ќћўћўўі§ў§ў§ў§ў§ўўў§ўўќ§ў§ўўщ§ў§ў§ў§ў§ўњ§њћ§ў§ў§ўћњјјљ§ў§ўўў§ўўў§ўўў§ўўў§ўўў§ўўў§ўўљ§ўћўњћ§§№ћўћћљїѕњѕћћў§ў§ўўў§ў ўў§ўўў§ўўј§ў§ў§ў§ўўтћ§љ§њў§ўћўћўћњјјѕѕєљњћ§§ўў§ў§ўўі§ў§ў§ў§ў§ўў§ќў§ў§§ќўћў§§чўњ§њњљ§ћ§§ўћўћўњљѕєєљћћ§ўўў§ўўў§ўўј§ў§ў§ў§ўўў§ўўў§ўўћћў§ў§§єўњћјћњћ§ў§ўћћіўљјѕєєјљћ§§ўў§§ёў§ў§ў§ў§ўў§§ў§ўў§ђў§§ў§ўў§ў§ў§ћљљјћњ§ћўћўћћљѕѓяєїљљ§ћ§§ўћћ§§ўј§ў§ў§ў§ўў§§ўћўў§яўћў§њљ§јљљ§њўћ§ћ§§ћ№јњїїѕљјћњ§ћў§ў§ўўњ§ў§ў§ўўў§ўўў§ўў§љњ§јњјњћћф§ћў§§ћ§ћўњћјєђѕїћљ§ћћ§§ўўћў§§љў§ўћ§§ўўў§ўўќ§ў§ўўп§ћњћљћњћћў§ў§ў§ўћўћћјјѕїєѕјњљ§ћўћћљўњўћ§ћ§§ўў§§§ў§ўўю§ў§ў§ўћўњўњћљ§њ§ћ§§тћ§ћ§§ўјњїєьяяѕїњћ§§ў§ў§ў§ў§ў§ўўј§ў§§ћ§ћ§§гў§§ћ§њ§љћ§§њ§њ§њ§њћћўњўћўћ§љјєѓяэѓјљњљ§њў§ў§ўў№§ў§ў§ўћўњћљ§ћўў§§яћ§ћўљњњћћ§ћ§§ў§ўћћрўћўћўњћјћѕђрршёєїјљїњњ§ћ§§ў§ў§§ћћћўћў§ўїёѓѓѕјїљїѕѕњєїїћ§ўў§ѕљњњљїјћ§њћ§§љћќњјњћћ§њ§§ўћ§§њїѕїѕјћћќљћљ§§ўњ§§њў§§јљ§§јћљљћљћ§ўўє§љћћ§§њћћљљ§§ў§ўјћў§њњћњ§§њљњњ§ћўўњњћљљ§ўў§§њ§§јњјјћјћћ§§ўўћўў§њћўўѓњљ§љјљљ§ў§њћўў§§ўњњѕ§њўњ§љ§њљ§ўўўњ§§ћћљћћ§ћћ§ў §§ў§ўўўљ§§№њўћњ§§љњ§њўћ§ћћїїќњјљ§ §єћ§љљћ§ћњ§§њ§§ўћ§§ћњћ§ўњ§ўўјћўўћўўћўў§ќњ§§њњћў§§њ§§ўњљљћ§љћ§§ўѓ§ћљњњћ§њ§ўўћўў§ћљњњќўњћўў§№љћљјћ§§ўўћћўў§§ћћіљћљјјњћљћљљѕњ§љћњ§§ћћљ§§ўљўўјћ§њљњ§ў§§љ§§ў§ћћю§ћўњћњјјњњљїїјїїњћћњѕћјљ§§ўћћ§љўўўћў ўтћ§ј§њ§љљњљѕјњћћ§ћљјћљјњћњњћ§§ўўўњћћ§§љћћ§ќјљњўўїћњљњўўњњўўљћўўћўў§§яњ§њњ§ћњњљ§§ў§ћћњ§§љј§ћў§њјћ§§љћјњњћћўўўћўўј§ўћњ§њњўў§§ўћўўњ§љћћњўў§ђњў§јћњљ§§њ§љј§§њљјјњ§ўў§ћњўўќ§њњ§§љўћ§њ§њўўј§њ§ћјїћ§§юћјјњњїѕњ§љћјјљљјјњњјљњњўћўћўўнњјћћљљ§ўў§љјћћјјњјїѕѕјїїњњјљїњћћјљ§§шћљљњљћ§ћћјњ§љ§њўўћўў§њћўўњ§њњљћ§њћћ§њјњњўјћћѓјћљћ§§њ§њњ§њ§§ўљћћћњљљњ§§ћњўњњўў§ўёћўћў§§љћјљњћљљћћ§ћ§ў§њіћў§§љћљљњўў§њњїњў§§ўўѕћўў§§ћњљїјљљј№ћ§ў§њћљћњћћѕћћ§ўў§§ћљўўћўћўўћњњя§љћћјљњјјћљћћљљњ§§їћљњљ§ў§§јјќєјћљљќ§њћўўћћўўћњњћ§њћ§ўў§љњљўўњљ§§љњ§ћљјњћћ§љќћљљћћќјњњћћѕ§њњ§ћўњњ§§љљїћљ§§њј§ћўўћ§ўћ§§іњћљљћљјїјњњюћљљ§§ћћљљњћћњ§љјљ§§њўьњ§љ§§ў§ћ§§ўўњўўћњ§§ћћѓљјїјїљїњљљ§§ћћќ§њ§ўў§ў§ћњ§§њ§§јљўћћ§њњ§§§ўњ§§§љћљљ§ўљћћђјљљћњљљ§§ўћ§§њњ§љ§ўњ§ў§ўћўў§ўњ§ўў§њ§§ћњюћљ§§њћ§§ћјњїјљ§§ўњњ§§њўўњ§ў§§њ§§ќњ§§ўўќ§њ§њњїћљњљћћљћњњљћњћљ§§љљћќљњњћћїњ§љњ§њ§§ўўќћўњ§§ўјњ§ўњњћјїїљљ§њљјњњћћ§§ћјјћћїљ§ўўњ§ћљјїјјўљ§§ќћўћўў§ўњўў§ўћ§§њ§їћјљ§§ћћљћћєљњљј§њ§ћћ§§ћћ§љ§ўўј§љћўўћћ§§№ўћўўњ§§њњўўћўўћ§§пњ§§ћљћљћ§њ§љњїѕјѓѕјјљћћљћ§§ўў§§њўў§ўўћўўќћўћўў§јћњјјњњћљљѓћњїљљњњјњљњњ§§§ћјћћўљћћ§їњўў§ћњўўї§љћљћњ§љјјќљјњћћі§љћјњњјћљ§§ъј§§њ§§ћћјїњњћљљ§љўў§њ§§њ§§ћў§§ќћљћ§§шћ§§њњ§јјљћљћљњћ§ўў§§ўў§ўў§§љћњњ§њ§ћњўўњ§§ўњўўћњ§ћћ§§ћыљ§њўў§љљћ§§ћ§љј§њ§§њ§§њ§ўћўўўћўўўћўўіћњњ§§љ§ћћјјћ§љњјјњљћћљћјјћћљћљ§§ўњ§§§љ§ўўљ§њ§ўўћ§§ў§§њ§§ўњ§§ћћњїњћ§§хњљљћљћ§§ћљћћјњјњћ§њўў§њ§ўў§§ўњўўћ§ўћњњћљњ§ћјјћњїјљ§§ѕћљћћјјњ§љљ§§ћ§№ўљ§§њњ§њ§њњљѕљјћћ§ўїњ§§њјљћљ§§ѓўњњљћћњњћћљћ§§§ћњ§§§њ§њњ§љњ§§њ§њ§§љћ§њ§њ§ўўўњ§§ќњ§§ћћљљ§§љ§§ўўћ§§њўўјњљ§§њ§§ўўћћ§њћўўњњ§§њћўў§њ§ќћў§ћћљ§ќј§§ўўћ§ћўћўўѓ§њњ§§ўњ§§ўћљўўўћўўћћў§њњ§§№ўћў§§ћћјљљјњјјњїїюћ§ў§њљћћњ§ћўўћ§ћ§ћћћљћўћ§§ќў§§ўўўћ§§ѕўњ§ћљљј§ўћ§§ћюњїїљјјљљћћѕљњћ§§ћўўіљ§ћћњћљњ§ў ўѕњ§њњ§њћљћљћћїњћћ§§ћњњјјљћў§ўўњ§њ§љ§ўўќ§ўћўўэћўњ§њћћњ§њ§њћћњ§§ћњњћёњїјћљљњњљћњјњљ§§њєљћћљ§§ћћњ§§њњ§§ћўў§њњћљћљћћ§њљјљјћ§§љњ§ў§§љўўјћ§§ўў§њўў§єњ§ўў§љњ§ћњїјјјћљћљћ§ў§§њњљћћ§љљњѓћ§њ§ўўњ§њ§ў§њњ§њ§ћњ§§ћўўјћ§њ§ћљїћћўњ§§њќ§љћљљћљјћљљћљћћ§§ўћјј§ћњ§§ђњ§њњ§§њўў§њўћ§§ђњ§§њњ§ћћљњїњјљљѕјњћ§§ћћљ§§ўў§ўў§љљ§ўќ§ўўћћќ§љћ§§ўјћћіљћ§§ћљћљћ§§ўўћўўє§ћљњљљ§§њ§њ§§ўњўўјњ§§њљ§њ§§ёњ§њ§њ§њљћћљљћћљљј§њњ§ўћў§§ўў§§ќњћўњњњћ§ћћњўў§ћў§§ў§ћ§њњўћњ§љј§§ћћў§ћ§§јћў§љћћљ§§ћњљћћњњћћѓљ§§ћљј§ўњњўњ§§ќћљћ§§њњ§ћўћ§§ўфћўў§§њњўў§ћ§§ћњјјњњћјћјњјљћјјћњјћћљљѓћјјњћњ§§ћљ§§ўўђ§њ§§ћњћљћљћћљ§§эљєјћљћњјјїњјјњљћљћјјћќњћ§ћћ§ћљћјњљљ§ўў§§ќћњљ§§љћћљћћњћћ§ќћљ§ўўђћјћћ§§ћ§§љћљћ§§ёўћ§§ћ§§ћљњўў§§ћћўљћћўљ§§ћњјћјњњћћљ§§єћљћљћћјљћљ§њњљќћ§њ§§ўќћўў§§ўќћ§њ§§§њљћћ§ќњјћ§§іў§њћўњ§§њћћњўћћў§§ўўўћўўј§њњљњўў§§іћ§§њ§њ§§њ§§ћљ§ќћљ§ўў§њў§§ћў§§њ§§ўѓћў§њ§њ§ћ§ћљћ§§ўћљљўћ§§ѕљћћљњїћћјћ§§ўњ§§ўћћўћў§§ўњ§§ўњљљћњјљћ§њ§§јњ§њ§§љћ§§њ§ўў§§њўї§ћїјјњћћ§§ўў§ўўљ§љјљњњ§§ђњћћњ§ўњљ§ћљћћ§§јљћћљ§ўћўўћ§ћњ§ўў§ёўњљћћјћљїњћћ§§ўў§§њ§§ђњўў§љ§§њћ§љћћ§§ўћ§§љљ§ћћљћћјјќљ§њўўђњ§љљћњњћњјљњљїїљјњљћљћјјјњћћљ§§ћјјћљћљљјјњњјїљњ§§їћљћћ§§њ§ўўўћўў§ёљћљјїљћ§њ§ўўњ§ћћї§њ§§њ§§њ§§цњћћјћћ§ўўњљјјљ§ћ§њј§§њњјњ§§ўў§§ўњ§§ћњљљћ§§ўћў ўњћў§љћ§§ўњ§§§љњ§ §єњ§ўў§§љљћјћ§§§њ§ўўќ§ћљ§§ўћ§§ћћњјјћћ§ћњљњљ§§њ§њ§ћљћћњ§§§ўћ§§§ћљћћўњ§§ћћљћјљїїљљєјѕѕљїїјѕћљљњ§§љљ§§ћћ§ђњ§§ў§њ§њ§§њљљ§§ћћљћљћћўљћћўјњњћћљћћ§ћћњљ§§ћў§§§ўњ§§єћљљћ§§ўўћњў§ §ћ§іћ§§ћћјљљ§ћћўљћћ§ўњ§њјєѕјїљљјћљњћћўўо§ўћ§ћћљљјљњћћ§њ§ћ§ћћњћњћљњљћњћћ§ћ§§ђћ§ћўў§ћ§ћљјљљњњљћњћћ§ћ§§ўћ§§јћ§ћ§ћ§њћћюў§ўћћњћћ§§ћњћў§ћ§ўўњ§ћў§ў§§ѓљњ§ћ§ћ§ћћ§§ћўўњ§ў§ў§ћћўіћ§ћ§ћ§ћ§ћњњћщ§ћў§ў§ў§ў§§ўў§ў§ўћћњћћ§§ўћ§ўћў§§ыў§§ћ§§ўћў§ў§§ћ§ћњњћњћћйњћћ§ћ§ћ§§ўў§ћ§ћ§ћ§ћ§ћўћў§ўў§ћ§ћ§§ў§§ћў§§ўс§њћњљљћљњћ§ћ§ћ§ћ§ћ§ћ§њ§ћћњ§њ§ћ§§ўћ§§ћћ§ћњњ§§ўћў ўўћ§§ўћ§§їў§ћ§ћ§ћ§ћћіњћњ§ћ§ћ§ћўўћљњљћћ§ћўўњ§ў§ўў§§ўљ§ў§ўћ§ћћћ§њ§ћўў§ћњљћњћњњљћћћ§ћћњ§§ўњћћў§ўўё§ў§ўў§§ў§ћ§§ћ§ћћђ§ў§њћњћњњћў§§њњљћјљљїљљљћњћњњљћћ§ўљ§ћў§ў§ўўќ§ў§ўўќ§ўў§§ћъљјљњљћњ§њћ§њћњљћљљњ§ћўўќ§ћњћћјњћњ§ћ§ћўўќ§ўў§§ўў§§ўў§ўў§§ћ§§яћњљљћ§ћўћњњ§ћ§§ўћћэ§ўўћ§§ћћ§ћћњљљћњў§ўўјћўў§ћ§§ўў§ўћўўћќњћ§ўў§§ћ§§ќћљћ§§№ћ§ћ§ћ§ћ§ћ§ћ§њ§ћўўў§ўўўћ§§њћ§ћўў§§ў§њћќ§ћ§њњљіћўњ§§ћћњњљљќј§§ўўэ§ў§ў§ўў§њћњћћ§ўўћћњњёљњљјјїљљњљњјљљњњћћ§ћ§ћћїљћњ§њћњ§ћћ§ў§ў§§ћ§ћћќ§њћњњ§љњљљњњћњћњњћћ§ыћ§ћ§ћћњћњњљћћ§ћ§ћ§§ў§§їў§ўћ§ўў§ўўлћ§ћћ§ћљњћћњћњћћ§њћћ§ћ§ћў§§ћ§ћћ§§ўўћ§ћћј§ў§ў§ўћ§§њў§ўћ§ўўў§ўўє§ў§ўћ§њњјљњћћњћьўћ§њћњ§њњ§ћњ§ўў§§ћ§ћћ ўў§ўў§ћњћјљњњћћєњћћ§ћ§ћњћњћ§§јћ§њњћњњћћ§ћў§ў§ўў§ђћ§њ§§ў§ў§§ћ§§ўўњ§ћћ§ћ§§ћњћњљњњў§ћћњљќњћњ§§§ћў§§ћќњћћ§§јћў§ў§ў§ўўї§ћ§ў§ћ§§ћћфњћњљњњљњњћћ§ћћњћў§њћ§§ћ§ћ§ћ§§ђў§ў§§ўћћўћњћ§ўўя§ў§§ћћњњћ§ћњњјљљћћы§њћњћћ§ћў§ўћ§§ўћ§ћ§ћ§§јћ§ћў§ўў§§№ћ§ћў§ћћ§ћ§ћ§ћћњћћщ§ћ§ћћњћњћњћћњљћћ§ћўў§ћ§§ћї§ћў§ўћўћўўћћ§ўў§§№ўћ§ћ§ћ§ћ§њћљљњў§§ћї§њњљљњћћ§§ќћ§§ўўќћўћ§§ўћ§§ќћў§ўў§ћљ§ћћњћњљљќњљњћћюњћљљњћњ§§ў§ћ§§ћў§ўў§§ћ§ћћњў§ў§ў§§ћњћћљћћћ§ћњљњњў§њњћ§ўњ§њћњћњњћќ§ћ§ўў§ѓћ§ћ§§ў§ўћћњ§ћћ§ѕћ§њњћ§ћћњћњњњћњћљћ§§ўњћћіњћњћњћњћ§ўўўћўўћ§ћ§ћўў§ўћ§§ўњ§ўћ§ћ§§ћћњћњћћш§ћћљљјїїјїњћњњћњ§ћў§§ћ§ўўњћ§ћ§ћўўў§ўўў§ўў§іћ§ћћљњћ§§ћћљјљќњљћ§§ьћ§њ§њћњћњњћњњћњћљў§ўўє§ў§ћ§њћћ§§ћњњѕћњљњћњћњћњћћњљчњћћ§ћ§ћ§ћ§ћ§њћ§ћљљњћў§ћў§§ќћ§ћ§§юћ§ћўў§ћ§њћњ§ћћњ§ћ§§ћѕљњ§§ўћ§§ўћўўњћ§ћћњ§§ћ§№ћ§ћ§§ў§§ћ§ћ§§ў§ўў§ћоњ§ћ§њћћ§§ўў§ћћњ§ћўћћ§ћ§§ћ§ћ§ћ§ћ§ћ§§ќћ§њўўњ§ў§ў§ўўѕ§ў§§ћ§ћ§њћњњ§ћљњњћ§њћњњѓћњћћ§ћ§ћ§ћўћўўѓћ§ћў§њћ§ћ§ћў§§ћ§іћ§њћљћљћћ§§ћфњћњ§ћњћћњњљњљњћ§ўўћ§ћў§§ћ§§ўў§ќў§ћњњіљњњћ§ћ§ћ§ћћўњ§§ћя§ћ§ћ§ћ§њњћ§ћўў§ћ§§ћћ§ћ§њњћ§ћў§ўўі§ў§§ћ§ћћњћћчў§§ћњњљљћњћњ§ћ§њ§ћ§ћ§ћ§ћ§§њћ§ћ§ћ§§ћћ§њћ§§§ў§ўўщ§ў§§ћ§ћ§ћ§ћ§ћ§ћ§њћњћў§ћћ§ў§їў§ў§ўў§ћ§§ќћ§§ўўђћ§ўў§ў§ў§§ћ§§ўў§ўћ§§јћ§ўўћћњћћ§ў§ўў§ўўњ§ў§ўћ§§њћў§§ћўўў§ўўі§ў§ў§ў§ў§ўўўћ§§ѓћ§§ў§§ћћњ§ћћњњљћсўћ§ћћњ§ћў§ўў§њ§њћњћњўў§ћ§ћўћћ§ўўт§ўћ§ћўў§њћћ§ћўў§ћ§ћ§ћћњњљљјњњћћњьјљњ§ћў§ў§ўўћњћ§ћћ§ћўўќ§ў§ўўў§ўў§љћ§њћњћњњўћњњћћ§њљљњњћїњћњ§§ў§ў§§ћў§ўў§ўї§ў§§ћ§ўў§§ућњ§ћ§њњљљњћњљљњњћћљљћњљњљћ§ћ§§єћњњћћ§њћ§§ћ§§ќћў§ўўѕ§ў§§ћ§ћ§§њћћњњћњћњ§ћћј§ћ§ћўћ§ўўќ§ћў§§ћў§ўћ§§їўћћ§ћњљљњњћћњћњ§§їћ§ћ§§ћњњћћљѓњћ§ћў§§ћ§ћўћ§§ќћ§ћ§§ўћ§§ѓћў§ў§ўў§§ћњћњњћ§ћ§ћ§§ћўњћћўњћћєњћћњћњњћ§ћћњњ§њћ§ћ§ћ§§ђћ§ўўћ§§ўћ§ћ§ћ§§їћњњћљћљњћћюњљњћ§њћћ§ћў§ў§ўћ§ўў§ћўћћ§§ћўў§ўў§ћћ§§ћњњќћњћњњ§ћњћћўњћћѕ§ћ§ћ§ћ§ћћ§ўўў§ўўћў§ћћ§љћ§§ћ§§ўўў§ўў§ќћ§ћ§§ьћ§ћ§ћ§ћ§ћ§ћ§ћћњћћњњћћјњ§ћ§ћ§ћўўѓћ§ћ§ў§ћ§ћ§ўў§§ћў§ѓў§ў§§ћ§§ў§ўў§§ќў§§ћћЩ§ћ§ўўћњћ§ћ§ћ§ўўћћњћў§ћ§ћњњћњћљљњћњћћ§њћћ§ў§§ў§§ћ§њћњћћ§§ўћ§ћ§ћўўќ§ўћ§§ьўћњћ§њљњњљљњ§њњљњћћњњўљњњћњћљћ§§ћћўьћ§ћ§ў§њћњћњћћ§ћ§ћћњћћїљњњљљњњљћћњњћњљњ§њњїћњ§ћћњњљћћю§ћўћ§ћ§ћ§њљћ§ћ§ћ§ћћ№њћњњљћњћњ§ћ§њћћўўњћ№§њ§ћћњћњ§ћ§ћўў§ћћї§њћ§ў§§ћњњћсњћћ§ћ§ћ§ћ§ћ§њћњњљљњњљљњћћ§ћ§ћњћћњћ§ћњћ§§ћљ§ћ§ћ§§ўўђ§ў§ўћ§ћў§ў§ўў§§єћ§ћ§ћћњћћ§ћ§§ќњ§ћ§§іў§§ћ§§ћњћ§§§ў§ўўќ§ћћўўў§ўўѕћ§§ў§ў§§ћ§ћћч§њ§ћ§ћ§ћћ§§ћ§ћћњћћ§ћ§њћћўўь§ў§ў§ў§§ћ§ў§ћ§ћ§ћў§ўў§ѕћњ§њћњ§ћ§њћћ§њ§ћћюњћћљћњњ§њ§ћ§ћ§ћ§ћўў§іћ§ћ§ћ§ћ§§ћћњ§ћњ§§єћ§§ћ§§ћћњћћ§§тћ§ћ§ћ§ў§ћ§ћ§§ўў§њћњњљћњ§ћ§§ўћўўњ§ћћ§ћ§§іћ§ћ§њњ§§ў§§ьњћњњћ§ћ§ћ§ћћњњћ§§ў§ўў§ќњ§ћўўюћ§ў§ћћњ§њћњљњћћ§§ўўќ§ўў§§хћ§§ў§§ў§ћ§њ§ћћњ§ћ§ћ§ћ§њ§ћ§ћћ§§њћћњќћ§§ўў§ѓћўћњљњњљћћљјљљїњљћњћњ§§њњљљњњћћ§њњћћњћћњњђљњљјљ§ћ§њћњћћ§§ўћћ§ћ§ћћњ§ћњ§§ѓў§§њћњ§§ћћ§ћ§§ћы§ћ§§њњ§њћћў§§ћњњћ§ўћ§§ўћ§§фћ§ћўћ§ћћ§§ћ§ћ§ћћњ§ћ§ћў§ў§ў§ўўЬ§ў§ў§§ўћћ§ћ§ћ§ћ§ћ§ћў§§ћ§ћ§ћ§ћ§ћ§§ћ§ўћ§ћћњ§њ§ћ§ћ§ћ§ћўўл§њћћ§ћ§ћ§ћ§њ§ћ§ћ§ћ§ћћљњњћњћћ§ћ§ћњћ§ћ§§ћ§хћ§ћћњњ§§ћ§§ўћ§ћ§ћ§ћ§ћ§њћњћњњё§ћ§ћ§ћ§ћњњћњњјљљїјљїјљјљљњњћ§ћ§§ћњњћр§ћћўћ§ћ§ћ§§ћћ§ћ§ћ§ћ§ћ§њћњћњћњћћњњ§ћ§љљњњћњћњћћіњћћ§§ў§§ћ§§пћ§ћњћћњ§ћў§ў§ўћ§ћ§ћ§ћ§ћ§ћ§ўўћ§ћ§ћћј§њћњћћ§њњќћњћњњј§ћ§ћ§ћ§ћ№њћљћљ§љ§љћљћњўћўў§§ўћћњћўў§§јў§ў§§ћ§ћћѕ§ћў§ў§ў§ў§ўўі§ў§ўњћњ§ћ§§эћ§§ў§ў§ў§ў§ў§ў§ў§ў§§ќћ§ћўў§єћў§ўћ§ћў§ў§ўўў§ўўђ§ўћ§ўў§ў§ў§ў§ўўќћ§§ўў№§ў§ў§ў§ўћ§ћ§ћў§ўўў§ўўі§ўћў§ў§ў§ўўќ§ў§ўў§§ў§ўўћ§ў§ў§§єћўћ§ћў§ў§ў§ўўі§ў§ў§ў§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўў§эћўњ§ћўћ§§ў§ў§ў§ў§ў§§ћ§ўћ§ў§ў§§ѓўћў§ў§§ўў§ў§ўўф§ў§ў§ў§ў§ў§ў§ў§§ћ§ћўћ§§ў§ў§ўўјћ§њћћў§ў ўў§ўў§ўћ§§ўќ§ўћ§§ѕћ§§ћњћћ§ћў§§§ўћ§§њћ§ўў§ў ўў§ўў§§ў§§ѕў§ў§§ћ§ћ§§ўў§шњћњћћ§љ§љњњћћ§ћ§њћћў§ў§ўў§ў§јў§§ћћњ§ћћ§ўћ§§ћ§ўђћ§ћўћ§ћ§§ў§ў§ў ўў§ўўђ§ў§ў§ў§ў§ћћў§ўў§ўў§§ў§ѕћў§ўћўћўћ§ў ўќ§ў§ўўў§ўў§ўћўўљ§ў§ў§§ћћ§ўў§§ѓў§ў§ў§ў§§ћћ§ў ўњ§ў§ў§ўўќ§ў§ўўы§ў§§њћћў§ў§§ћћњћњ§ћў§§§ћўћћ§ўќ§ўћ§§ўп§ў§§ћўћўњћљљњ§њћћ§њћ§ўћ§§ў§ўћ§ћћ§§ћќ§ў§ўўў§ўўє§ў§ўў§ћў§§ћ§§ћёўћ§ћ§ћћ§§ћў§ў§ўўю§ў§ўћ§ћ§§ћћ§§ў§ў§ўўў§ўў§ьћ§§ћ§§ћ§ћўћў§§ћў§ў§ўўќ§ў§ўўў§ўў§ќћ§ћўўў§ўўў§ў ў§њўћ§§ўўћћў§ќћ§§ўўљ§ў§ўћ§ўўо§ў§ў§ўћ§§ћњћћўћ§ћ§ћ§§ў§ў§§њ§§ў§ў§ћћћњ§ћў§§ўј§ў§ўў§§ўўњ§ў§ў§ўўћ§ў§ў§§ћ§ћўћ§ћ§§ўўћћљ§ћ§§ў§ўў§§ў§§ћў§ў§ў ўп§ў§ў§ў§ўћ§ћ§ћўњћњћњ§ћ§§ўћ§§ў§§ћў§§ћў§ў§ўўў§ўўќ§ў§ўўќ§ўћ§§ћёўњ§ћ§§ў§§ћ§ћў§ўўў§ўўє§ў§ў§ў§ў§ў§ўўњ§ў§ў§ўўљ§ў§ў§ў§§єў§ў§ў§ўћ§ћ§ћћ§ўћ§§ўќ§ў§ўўћ§ћў§ў ўў§ўўў§ўўр§ў§ў§ў§§ћўћ§ў§§ўћў§§ћћњў§ў§ў§ў§ўўј§ў§ў§ў§ў ўј§ў§ў§ўћ§§шћ§ћўћўћ§ћ§§ўў§ћ§ћ§ћўћ§ћ§§ўў§ўўќ§ў§ўўю§ў§ў§ўћ§ћ§ћў§§ћћњ§§ћћ§ћў§ўў§ћїўћћ§ў§ў§ўўњ§ў§ў§ўў§ўђ§ў§ў§§ћ§§ўћ§ћ§§ћћ§§ћ§§№ў§§ћўў§ћ§ћ§ћ§ћ§ў ўќ§ў§ўўњ§ў§ў§ўўљ§ў§ў§ў§§ѕћў§ў§ћњћљњћћ§ўќ§ў§ўўќ§ў§ўўћ§ў§ўћћѓў§ўћ§ћ§ћћњ§њћћ§ќў§ў§§ќћ§ћ§§ќћ§ћў ў§щћў§§ћўћў§ўћ§ћ§ћ§ћўћўћ§ћћ§ћў§ў§ўў§§ћ§ћћё§ћў§§ўў§ў§ў§ў§ўўў§ўўё§ў§§ћ§§ўў§§ў§ў§§јћ§ћ§ћ§§ўўў§ўўј§ўћ§§ў§ўўњ§ў§ў§ўўњ§ў§ў§ўўє§ўћ§§ў§§ћ§§ўў§ў§ўў§ўўѓ§ў§ў§ў§ў§ў§§ў ў§§ў§§љћўћўћў§§љўњћћўћ§§ќћўњ§§јћў§ў§ў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўў№§ў§§ћћњћћў§§ўўћ§§ѓў§§ћ§ћўћћ§ў§ўўў§ўўќ§ў§ўўў§ўўь§ў§ўћўћўћў§ў§ў§ўћ§ћ§§ўї§ў§ў§ў§ў§§§ў§ўўј§ў§ў§ў§ўў§§ў§§ ўј§ў§ўћ§§ўў§іћўћ§ћ§§ў§ўўр§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§§ўў§ў§ўўш§ў§ў§ў§ў§ў§ў§§ћ§ћў§ў§ў§ўўў§ўў§§ў§ўўў§ўўў§ўўј§ў§ў§ў§ўўљћ§ћ§§ў§§ўў§ў ўќ§ў§ўўў§ўўњ§ў§ў§ўўі§ўћ§§ў§ћњћћњњ§њ§ћўў§ќћ§§ўўђ§ў§§ћ§ћ§ўў§ў§ў ўў§ўў§ќћ§§ўўї§ў§ў§ўћ§њњѓ§ћў§§ћ§њ§ћ§§ўўњћўћ§§ўўі§ў§ў§§ћ§ћ§§їћ§њ§ћў§§ћћїўћўћ§ћ§§ўўњ§ўў§§ўўў§ў ўў§ўўх§ў§ўћ§§ў§§њћћ§ћ§ћ§њў§§ћў§§ћћ§ћў§ўў§§єћў§§ћў§ў§ў§ўўт§ў§ў§ў§§ћ§ћў§§ћ§ћ§§ў§ў§ўћў§ў§ўўў§ўўў§ўўў§ўўќ§ў§ўўі§ўў§ћ§ћўћ§§іў§ў§ў§ў§ў§§ѕў§§ћ§ћў§ў§ўўќ§ў§ўўђ§ў§ў§ў§ў§ў§ў§ўўљ§ўў§ћў§§ўі§ў§ў§ў§ўћ§§њўћ§§ў§§ўў§§ќў§ўћћђ§ў§ў§ў§ў§ў§ў§ўўў§ўўї§ў§ў§ў§ў§§яўћћњ§ћ§ћћ§ў§§ћ§§ўўў§ўў§§ў§ўўў§ўў§њћў§ўћ§§јћ§ћ§§ў§ўўђћ§§ўћў§ў§ў§ў§ў ўјћ§ў§§ў§ўўќ§ў§ўў§§ў§§љў§ў§ў§ўў§ќћўћ§§љћ§ў§ў§ўўі§ў§ў§ў§ў§ўўќ§ўћўўў§ўўќ§ў§ўўў§ўўј§ў§ў§ў§ўўј§ў§ў§ў§ўў§љћў§ў§ў§§ћњ§ћ§§ў§§ћў§ў§ўў§§ў§§ўќ§ў§ўўќ§ў§ўўќ§ў§ўўћ§ў§§ћћ§ћў§ћћћўћўћ§§ѓћ§ћўћўћў§ўћ§ўўы§ў§ў§ў§ўћ§ћ§§ў§§ћўћ§ћћѕўњћћўћ§ћ§§ћћ§§ћ§§љћ§§ўћўћћћ§ћў§ўўѓ§ў§ў§§ћў§ў§ў§§ѓћ§ћ§§ћћ§ћ§§ў§§ўњ§ћ§ћў§§ќў§ў§§§ў§ўўћ§ўћў§§ў§§ў§§ыћ§ћ§§ў§ў§ў§ў§§ћ§§ћћ§ћћѕ§ћ§§ў§ў§§ћ§§ўў§§ќў§ў§§јћў§ў§ў§ў ўў§ўўё§ў§ў§ў§§ћ§ћў§ў§§ўў§§ћў§ў§ўўі§ў§ўћ§ћў§ўўў§ўўќ§ў§ўў§ћў§ў§ўўѕ§ў§ўћ§ћ§§ў§§ ўі§ў§ў§ў§ў§ўўњ§ў§ўў§§ћћ§§ў§§§ћў§§ўљћ§ћ§ћћ§§љў§ў§ў§ўўќ§ў§ўўљ§ў§ў§ў§§ћ§ћў§ў§ўўј§ўћ§ўў§ўўє§ў§ў§ў§ў§ў§ўў§ћ§§ў§ўўў§ўўћ§ў§ў§§њў§ў§ў§§ѕў§ў§ў§ў§ўћ§§ў§ўњ§ўў§ћ§§јћўћ§ћў§ўўњ§ў§ў§ўўћ§ў§ў§§іўћ§§ў§ў§ў§§ўў§§ћћ§ћ§ћћ§ўэ§ў§ў§ћњ§ћў§ўњ§њ§ћћ§§љћ§ћўћћ§§іў§§ћўћ§§ўћћўўћћё§њћ§ў§§ћ§ћў§ў§ў ўї§ў§§ћ§ћў§§§ў§ўў§ќћ§§ўўќ§ў§ўўћ§ў§ў§§ўћўў§љћўћ§ўў§§ўњ§ў§ў§ўўў§ўўћ§ў§ў§§ћў§ў§ўўф§ўћў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ў§ўўћ§ў§ў§§ћў§ў§ўў§јў§ў§ў§ў§§јў§ў§ў§ўћћё§ћў§ў§§њ§§ў§ў§ўў§§ў§§ћў§ў§ўўї§ў§ў§ў§ў§§ўћ§§ђў§ў§ў§ў§§ћ§ћ§њњю§љћљ§њ§њўћў§§ћў§ў§§ўў§§ўљ§ў§ў§ў§§јў§ў§ў§ў§§ќћ§ћ§§§ћ§ћћѕ§ћ§ћ§ћўћўћ§§ўї§ў§ў§ў§ў§§ўє§ў§ў§ў§ў§ў§ўўѕ§ў§ўћў§§ћћ§§ќћ§ћ§§љў§ў§ў§ў§јћљљќ§њљћћщљїњјњњћњћљјњјњљћћјљєѓєїїшј§§йM8;B:>@?<@* CJjњ§§§њ§ћћТњўў§§ћљћ§њљјјњјћљњјјњїѕљїїѕђїѕїљћ§тg50+35>7.9-)7JG45Hјїћњ§њћњћћљ§њјјљљћћѓљћљљјјћљћћњљїї§љѕїїхѕјѕњ§еcL>$15:43.+Ce[(17Bљљћћў§ћћ§эњ§ћ§љљїњњћјћјјљљћљјјїњцљїєѕў§јm5CIIE@.()NN>&0(§§яљњїћљ§§њјћљ§§њћћљљњјїјїљћћљўћјјїЯњ§зS%?E@447)(;8)&.QZcўћўћўљ§§ў§§ћћјјњјјњљћћљћјѕїјјћўњјјїњщјћ§лh@GGA39;:>73<;8?Fњјјњјјњљћћ§њћћљњїњњћљјјљљ§њјљїјјхљїѕѕћћнŽ@44;EJUC;717149-(њњјќљїєјјэљћјјњјњњљј§§њ§љћљљјјЮљћљїљєјју‡HQC@9:(+$+503-I§љћјњћћњќћјљјјїѕњјјїјѕјљћћ§§§ћјњњчѕђђї§Ъ]7HCC49005-)7>2-$љљњшљћјњњјњ§њњ§њ§јљљ§§ћїњљљїїћѕјјєјјмѕђѓђ§љАG9ZJFHHB@?A>7212Aњ§љљћљљћ§њћћыљћљљ§њ§љћћ§§љћ§§ћћњјњњўјїїчѕѓђњћРMCg;292.$-490,%!Cўўєњјљћ§ћљљћљјћћљЩћљћ§§ћўў§їјїїѕїѕјѓѓ§§п[<]J8404."!)()-:M§ўўћњ§љћћ§§љћїјјђїј§њњјћћљљ§њ§љљфћјїѕёђћ§пnTdP8+!*($14?O?NTP§§§њљћћТјљћњљљјѕїњњјјљ§§ў§§ћњњљћћјїѕњњїѕєєљ§ЩaHaM*(1-088A?EPVH§§њњ§§љљіњ§§јћћєїњјјѕћ§§њ§љјњњћ§§жћњїїљѕєєў§ьr;GQH<:9>3+3>F7.2Oњљњ§§љћћљљћњ§§ўћјјєїњњїїјљћљљћјјдљћњјѕѕєѓј§ђu179F<4?125§§љљњ§ћўћўўћ§њ§§їћљљћљћљњјјќљјњћћцїѕїїѕєѓђѕћї‹::JLI<5.4002-,,ђњћ§§ўў§њ§ўўњў§§ўњ§§ћћљћњјј§ћљїїњлјїїѕѓђѓ§я{B0<;155.,*38718?J§§љјјїјљ§ўўћ§љїњјћљјљњњјјоњїјїїјђяђћ§—^>87A99.+-;GIJ?@2§§њњћћ§§њ§ўў§№њ§љћљћљћњњћ§§ћћ§§ћтњїѕђяёћѓ—L;B@52,7.,"27-"(ћ§њ§§ћ§ўњ§§Эњўњљћћњћјљ§њћїњћљћјјњїљїѓђђ§љД]>F@4-&%311<451,јћ§ўў§њ§ћэ§ўћљњ§§њ§њћљћјјїїњјјѕѓшѕћћИhI42++0$)&$**&+-)§§ўўў§љљіћњ§§ћћљћћ§§љїћ§§љћјѕѕїїыѕѓѓђ§§ЏG-BA(-8.+*#*..я3ћ§§ћћ§§ћћ§њћјњњћћњјњњћћљјњњ§јїјјњејїљљѓѓёћј”U@05)%$-("$-4AHўў§ћћ§ћњћ§њљ§љњћћљ§љњћљњћћњњњјїїѕѕїїхѕєєїћьT22>;9C:"##%4@1ћћўў§їњўљњљљћ§ћћњљјїїјљљ§ћњјјпљѕѓєѓѓїюŽM:E@FBLNMўў§§њљљђћљ§ј§њјњљњљћјљљјїејћћљљћћјѕљљњљѕѓ§ћУY4*<04&&&3?E<7>CQјјњјљ§њњ§љћ§§ќњ§§њњШ§ћћљћјњјљћљљћјјњїљїѕїїѕћ§•CE+4<4%%,0((9IIENMZ9?F92303AAL§ўўњњ§ўўњ§§їњћљњљњјј§§ћњѕђѓїѕєюѓјлN0IJ;HHў>::Bѕ?:,PEўћўњњ§§юњљјјљјњјњњљљјјћ§ћљљјњќјљћјјхљюшэљж]5P@9>9084:;CTN80PVћў ўќћљљћћўљћћњњјњјјћћњљћјјњјјаїјѓьѓ§лW#944:175:;FEJBF;auњ§ўњљјњњ§љљѕ§ўў§њ§ћљјћћѕљјјљљћљњљљћћујѕєыщєЛY>A).-3728<>@NMHB?1ћћ§§њў§ћљљ§§§љјћћњћ§ўт§њљїѕѓыєєЄ+?121-7-9EGINQU\`M§§ъћљљјљњњ§§ўћњљљјјљњњ§њљљї§њљћљїњїѕѕцэјћИ??A:>?<,(+37<@::>>Gљћ§§ўЧ§ћњ§§ћїјњїљњћјћљћћљњјћјїљїїјњљїѕ§ћŸ4$)0.4*,+0,(-55;ML;ћћ§§ћќјњћ§§§ћљћћіїѓїјљ§ћћњ§§§љїјјфїѕѕєђљћ•3,#.;7.1,(**)9BAE>(§§§љћњњ§јњјјўљ§§ўљ§§књљћљћћљјљїѓђыљс‚5;<<841213&,,0:8..5§§ћћљїћјѕѕњњћћљљдћљљ§љјњљњ§ў§ћћљћ§ћјѕїћы‰II585:57:39.25?8:LY§§єњ§§њ§§њ§ўћў§§јћљјїїјљ§§њм§њ§§љњјјњѕћ§Юa9*28?807>4+:A@-+GHEўў§§ў§ћўћ§љћћ§§њ§љљћјћљљћћфїєєѓћєЇ@-3>CHJB<82.54>,AVb`ўў§љћ§ўћ§§њвћљ§ў§§љјњњ§њћњњјњјїїєѓћѓКZJYIFIHJS)0-&%1*8^§§њљјяїћљћ§§њњ§њў§§ћћљјјвљћјїњљїјњњїєѓљљОNOMNFF,,,##F><5Sњ§ћўўњљћљћћ§їћ§§њгћљјњјњњјїѕѕїјљћјїѕєђюљљЫZLVQPObF277.$:A")201:*)..;HHz§§єњ§њўўћћ§§њљјјяњјњљїјјњљїїѕљјћљћћсјѓђѕљ§љ–.!40.-**)3$()#-041.`§њ§§ўњ§§ќњћћ§§ањћћ§ћљјљћљ§§љїѕєђєєђїєеw9(0,)-003;>.*,29:7B‡ј§њ§§њ§њњћњјћ§§Чљћљћ§њљ§њњљєјјїѕїђѕєѓђљњдk5*2"+*#%&(.,1AA%$JЂњўўњћ§љћ§§ћћњљјѓїћљјљєћћљїђѓїїч§љЌF1,37&)0-1)::AG??C?Їўўќњљћ§§ќљћљћћ§ёљїєњњјјљјјєїїјѕѕпѓ§љ˜5,,(%(.05;5:5<@?A&>Ю§њ§љњњ§ўў§ѓњљћљљјљјјћћњїїјћњїїєѓѓрї§ђ‹?4"10!%..2321)28,@,5Зўўћўўњ§§ўћ§љћљћћјѕљїѕїїњњїїєѓѓхђї§ы|3(++072())$*++8E3QжњњќћњљћћћљјљљїїљјњњїљјѕѕєсѓђђѓѓђѕљщmA@737@GG+-*3<84242.{ё§§њћћљ§ћћњћњћћьљњљњњ§њћњљњљћћњњјљїљљїњўўпQ4<:BBу>;;+,8LTk§ћ§ћ§ћ§ћћњњ§ў§§ћњћћї§ћњњљњћћњњљфњљјўўьh7218994:52,3SO?;Eњћњ§§хњљћњћћ§ћњћћњћњћњћћ§§ћћњњљјљљ§јњљљчјїј§ўмkS>,8980144Lk\:2;Oћћњћњќћ§ћ§§яњ§ћћњњљњ§ћњњћћњћњњўћљљлњјљјј§ў§o8EHFF90(+NQ<$*)ћћ§ћћљћњћћ§§јњћћ§§ћњћћњћћњћњћћњэћљљўўнY%?CB@;279;<88Wўiўўѕ§ћўћ§њћњњљњњћљњћњњљљњњўљњњљчњўўнdALC?;:;<--09@?87229>C4V§ћћњ§ћ§ћњћ§§§ћ§ћћњўљњњљњўћњњљќћљјљљщ§ўчŒ>(1hћћ§њћњћњ§њ§§ў§§њћњћњћњћњњљћњћћ§ћ§ћћњљљјѕ§ўе~N@C?;?44ю75>A<8I§ћћњљњћњњљљћњљњѓљњћњњ§ћ§ћ§њњљљэјѕєњўЯd3ML@<7378?A>>ќ8+,ћћљїћњ§љљњ§ћ§§ћј§ћћњљћћљљњўћњњљёѕєўўЕH8bOJHCAEGGј?>?83H§ћћєњћћњ§§њњћћњћћ№§ћћњћћ§ћњћ§њћљњљљўњљљхјѕєўўМQBh@7?;5,#9820902Jў§ўў§ћћњ§њћћљ§њћњћњћћј§ўў§§њњљљкјїѕѕўўчbBcG99442135(148CU§§ўў§ћћњћћ§ћњњ§§ћ§§ўњћћў§ћћњпљјјїўўшr]mV:43)-7<;@?>:8;?<>;85318-§њ§ћў§§ўїћ§ћ§ћ§ћ§ћћўљњњћљуњљљјѕєѕўє„E7@@?<:?<8;<;?9954-08;>B:9:њњ§§ў§§ћ§§єћ§њћњ§§ўў§ћ§§ћњљњрљјѕѕєўўЦiQ;3-4-1-..321-40§ћў§ў§ўўћњњ§ћ§њћћћњ§ћ§ћћљ§ћћњњјљљЩјїѕєўўАJ3;<00+4511-33798ћћ§њњћ§њњћ§њњљљњћњњљњњљњћћњљњљњњгљњњљјјїѕђўў™P;41121%),(.01:CNўў§њњћћљћћ§ў§ћ§њњћі§ћ§§ћћљњћљљњњљљјњљљчјїїљўђ‘T23CAB?>4$",01@G7ўўц§ў§§ћ§ћ§§ўў§ўћњ§њћњћћњљљњћћњЭљјїїѕѕѓђM:?AFGE@91143@BE<75;SPTN4ў§ў§§ћ§ћ§§љўћ§ћ§ћўўюћў§ў§§ћ§ћ§ћ§ћ§ћ§ћњњдљўўшgQ]BEISC?E?54#BJB:§ћ§§ў§§ћ§ћў§ўў§ћ§ћ§ћўў§§ћњ§§ў§§ћњњтљјїѕ§ўыm@JPHMZd:CACA<??>7<@HPZWH.Y\ў§ўўќ§ў§ўўєћњћњћњћњљњљњњќћњћњњпљїјѕ§ўпU*E;9?B97?IMQQPHCmz§ћў§ћћ§§ћ§ќўћ§ћћї§њћњњћњњћћжљћћњћњњљїѕњўНTBFB9>A?:>FFLILOGF2њњ§ћ§ћ§ћўћћј§ћ§ћ§ћћњњ§ћљњње§ћў§ўћ§ћћњјѕўўЊ-%FB99BA7:EIJIMTVeQ§ћћњћћњћ§§іћўў§ћћњ§ў§§ћ§љўњћњњљјјўЭЖFHSCBF@9,27?><@AL>Nћњ§ћ§ћў§ўўћњ§ћ§њћњљљјљћ§њћњњћљњњПљјљљњњјљјўў™.+-<@<:434149;<@FL@ћњ§ћ§њћњљњ§ћ§њћњћњћљњљњћ§њњ§§ћ§ћћњњуљјјїѕўў120>CC>80.+1;?AGI<(§ћћљ§њљњњћћ§ћ§ћћз§ў§ћ§§ћњћњћћњјљїїѓўш5CJEB@>:748997;E538ћћњћњљњћїњћћ§ћњљћ§§њћњхјљўєŒQQ7?;759593;878CGSY§ћ§§ќћ§ћ§§ўё§ћ§њћњљљњћ§ћ§ћ§§жћ§ћ§ћљњњљјўўЫW714CB@;<48>?@;>8NIIў§§ћ§ўў§ўўє§ўћћ§ўћћњћњћћ§ћњћњљуїѕўѕЂ:08@AOQJA:778:9?F]mkў§ўћћўњћћњњ§ћ§ћ§§јњћћўћ§ћ§§кћ§њњљњљњћљјѕўњЗVW^MNMMLW83,,!1:-9gћћ§§ћћ§њћњћћ§ўћ§§ћ§њћњњћњ§ћљјљњњљљїѕ§ўМHQPPL?,3&$((%)GAA4W§ћў§ў§ћњћњћњњћњћ§ћ§§ћћњљњљљњљјњљњћћњљјїѕѕћўЭ\T^UVNaQ5170*("%))Fp§ћ§§ўћ§ћ§ћњњљљњљјћњћњћњћљљгњљњљјїїўўЛ>8W?A;&:858353.;:NM§ћ§§ћ§ў§ўў§ћ§ћњњњљњљјљњњѕјљљњјњњћњћњњхљјћўў˜(%93.-1-1-4,.417597g§§њћ§ћ§ћ§§єћ§ћ§њњћ§ћ§њћћўњћћз§ћћњњјљјїєљјдr3.2451343;82009:@7I‹§ћ§ћ§ћ§§чћ§њљњћћ§ћћњћњ§§ўћ§§ћћњњћљљјйѕ§ўбi007,2+-41%$*2HFAAHFЕўўѓ§ўњ§ћ§ћ§ћњћћњњќ§ћ§ћћљњлћ§њћћњњљњјјѕўњ˜7*(42-*045259@A@CG2@л§§ўў§§ўћє§ћњћћњћ§§ћњљљњљјѕгљўјŽ;1454224954945+,3@.8Ыў§ў§ў§§ћ§§ў§ўћћњћњћњњќјљјљљўїѕѕхєљўыz4#+07512..41.).57N9Yю§§єњљћћњћњћњјјљљљњљљћјїјјїсѕєєѕѕєїўьm:529>HLA:-19@@;7040ƒўўћ§§іў§§ћ§ћ§ћ§ћћўњ§§ћєўћ§ћ§ћ§љњљ§њњл§њ§њўўыcFOQJUOSPG4!1.>]^~§ў§ў§ў§ўћ§§ўўї§ў§ўћў§§ћћП§њўћћњ§љњњ§љ§њ§њўўљ{A5Qћ§ћўћўћ§§ў§ў§§§ћ§ћћО§ўў§ў§ў§ў§ў§ў§§њўњћљўўЫcTQ^JNFUJMBEGJPUUtћ§ћў§ўћ§ћ§§ў§§ћ§ћў§ў§ў§ўћћ№§ћў§§ћўћ§ћ§ћћњ§ўўцЗcQ;29OLQOIGHIJMUHb§ўћ§§ў§§яў§ў§ў§§ћ§ћ§ћўњћњћћињўћ§§ўћўћћњ§њ§ўўщ›P;3LNYTZ[VTQUOQSZbњћњћћ§їћў§§ћ§ћњћћЭ§ћўћ§§ў§§ћўћўћћњћњ§љћўўтL@9UTYTTUTJSSPLJI>ћўњўћ§љћћ§єўњћћўћ§ћў§ў§§љў§ўћћњћћ§ћњљћўх\b[[ђ][NPLOUPSSO>Zћћ§њћ§ћ§§ўў§љћў§§ћўћћњў§ћћ§§ћ§њњћъў§Ў[VZ[adVOJNGBCLSQMu§§ќћ§ћ§§ў§§ћ§ћћ§Яћ§§ћў§ў§§ћћњ§њ§њћљўўуŽbNZTVJGGAENFIIL4c§§ћўћ§ћ§§ћћёўћўћўњ§ћўћўћ§ћ§§њў§ў§§ћћфўљљјўўпrE^]TN?IPZGIILNN;>§§ћћў§ћћ§ў§ўўє§ў§§ћ§§ўћўћ§§љњ§њўћўћћф§љљјўўЧ[Mjb\YGVWYZQONJJ>Y§ў§§јћ§§ў§§ћ§§јў§ўћ§ћў§§ќў§§ћћўўћћф§њ§љљјўўЫaWrSHJHFOLGNELLCI]\US\ZYVUQICJ7L§ў§§ўўђ§ў§ў§§ћ§ћ§ћ§њћћйўћ§ћ§ћўњ§њћјљљ§ўў™NS]UPHZPMLJJI?LG@ў§§ўўќ§ў§ўўѕ§ў§ў§ў§ўћўћћ§ћћњ§њћћњљрѕљўў‘TGYOJJYYNTMOMJWY^§ў§ўћўћ§§ўўћ§ў§§ћћћ§ћ§§ћћињћњ§љјїјўўЎxTIHMSU[PIV\`YUSG§ў§ўћ§ћў§ў§ўўћ§ў§ў§§Яћўћўћў§ўћ§§ў§ўћ§њњљјїїўўЇ`LZJILMOJHIOSMIE;§ў§ў§ў§§љў§ў§ў§ўўѕћ§ћў§ў§ў§§ћћн§ћўћћњњјљѕјўўУoTWHJIJLOCJAQPMJHћ§§ўўє§ў§ў§ў§§ћ§§ўўї§ў§ў§ўћ§ћћњћх§љљїљўўЯ|eICALGOSaўў§ў§ўћўћў§ў§§јў§ўћ§ћ§ћћр§њћњњљ§љњј§ўўЁb@FOTMWTPBAB5MPUIўўњ§ў§ў§ўўќ§ўћ§§ђћ§ћ§ћ§њћ§§ћ§њћћвљћњњїљїњ˜]JQJSOWTMJBBJMVk?§§ћ§ўў§ў§ў§ў§ў§§ћ§§ћћњўћ§ћ§ћћ§лћљћљњљўћщ‰L9ILPPTLLEJFMPTW`ћ§ћў§ў§§ћ§§ўћ§§§ћўћћ№ўњўћћњўћўњ§ћ§ћ§ћћцљњїўўлr84MLEFCGHHIM;YWYb§ўўш§ў§§ћў§ў§ў§ў§ў§ў§ўћўћ§ћ§§дўњ§ћћњњћћњћјўўрk0@LGF*AEJOSTZZ``cўў§ў§§ћ§ћў§§њў§ў§ў§§іћ§њћњћћ§ћ§§ћњѕћљћјўўг^?AUQV\YP8§ўў§ћћўњћћўўћћ§§ў§ўўд§ў§ў§ў§§ћ§ћ§ћ§њњїјўє‹CLVV[PPLIHNINSOUOFEўўћ§§ёћ§ћћњ§ћћ§§ћ§§ў§§ћћ§ў§ў§§ићў§ћљ§ўѕ’ccMMSHOHPPULOIHSZ^g§ў§ў§ў§ў§ў§ўўщ§ў§§ћћњ§ћ§§ў§ў§ў§ў§ў§§ћћсўљўўжeB?CT[QWFTPLNWVOH\\[ўў§ў§ў ўњћ§ћ§ћўўй§ў§§ћ§ћ§ћ§§њљњїў§ЏFEFMxўў§ў§§ћ§ћћ§ўћў§ў§ў§ў§ўћ§ћћ§ћп§њўњћњњїўўШQ^g[^]GGIHCOF@OMV\ZV^BOт§ў§ўўў§ўў§ѕћўћ§ћ§ћ§ћ§њњћр§њћјљї§ўў˜J9BGCFELQLJIOFPGC\;BЧўўќ§ў§ўўњћ§ћ§ћ§§іњћњ§љ§њћћњњљеїљј§ўљ„>29MFMOBJAIBGLIILYBdы§ў§ў§§ћ§ћ§ћ§ћўњњќ§њ§ћћињћљћљћљњјљјјїљјўўї{MLHENP^TQIJNVTLQ?CB”ў+џ+џ+џ+џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ*џ)ўwџџ)џ)џ)џ)џ)џ…?4—зжЫЮрплтусмршцррнжаЭУРЦбзегбкженнйнкйЯЯаЪЮбежЪЧзтхтснпнаЪЯЯУЯ70–ьёржлскдЯЭЦжукаЮЩаЫЪаЩЧЯЪЫбгбдйедйгЮЧЪЭЦРЫжмддЮггЮЯжйнждд€њЫЧР")”яёпрмйггЯРШзундгЫдЮЮЪШЮЯаллмшюшнккждЯЧСФЮазтпЯССШШЫдгбШЧФРОТЛ&>ЕїїпЮдбдеЫЧСЩлссмжШКМЭжЯбеайушулзбезЯЦНВЧзЮЭЩаЦМШзлбгЦОЎСЫаЯблLCЭљјрЪамкпмжедйббмгМЌЖжтсгЧЪгкжСЪеЫУУЪУУЩааЮНЎЌЄЌНОМЉИЩСЖФнпнкаTJСятгйлнхццьсрщуспаТИВТЧСНЏРНЌ››ТдаФБИТЮмраМЛВВДРбЩЕЇЉБРЫЖБРШШС?@ЇьеаабШОКЪзцтзЭШСТМНКЧОЌЉЕЯцЦ•œЏОЖБДехтцдОЌЏЊАОУЮаТУСНРФСЎББЛИB@ЁЪЫЪЧШЫЫбЮгаЩОНИЗДККБЎЌАМзчьыЧЕМЭЭЩбЭглжМЕАБЕМбжмлММЕЂ›ВРРЧУЫбAkжкНМОФЯгНОСБЕЅЅЊЉЏЊЃАЕВЋНж󏘌ЌЉЗЖВЖЗЛСБ—ЋЎœЌНТУСЕЕДУЧУЫБКЫЭЯЩ>hЩИДЕРЫдкЧОНЖЕБЃЈЇЏЖТЪцткзЩВЋЋЊЈЎЏŸœžЁЕЎЉЈЊЄАУЛФЕВАЃЇРР€яМанбЫИ3gКЩВДЦбкгАЋЇ›žЇЃЃЈЂДэѓшьэщжЧЕКБРЯСАЖНЦЧДКЧФБЦУЛЛНдаШФЫеууткаЗЕМUqуѓсптсхйаЖЎЅЕРЋЁЃ™ŸВБЌЫмйЯЗЏВБНЖœАРСЛМСакбОТЪсьсстлалЛЌЁЄЃВФФJtУСЃМСИЕМЖКМЛМРЅЅМНЕЕКТ’’БРДНДЌЄЇЗРУгРДКЮУМБФ‘z›ЉНУЕАЎЈЂЃЎЖТУIUЄИБЧаМББЏЋНЮЩЗЈЦрубББЂЂ”‰ЁАЗЖЊ›’ЇСЧЦОЋЇЇ€ъŸЃЌЕž’ЫУНЏЗССЖДРФЫзг3™ѓмРФЦЩШТИИЗДЛЗЕЭмлнрмѓящШЖБДЕБЕЋВОУМЗЪаЩеаРМТМЋЗРФЛРгкЪТБУзнтйJoЕБЗОТЕДКНЖБЋЕОИСЧЕРЫЭйЯДЕЖЩбЭЏЩЭЖИРажбЧЗЫЭЮЭедЫрмЯМЫЮШЪШФЧЦШзЭ[‡ьееЩЫабдзЦНМРШКНИДЛСЩЦОТЧФЛЯсчшцбРНЛБЅЂЉЧпкУРдалгмЧЮеЩЭЧаЧЮухаN‹ёярждаЪЩЫЧЪгдРЗЏЛУЖЖ€ЕЖЖДМКИЮжехсзнузРЭШзрхрцсспрпЩШбШЪШЯпцмЮЮ?QДйЪРЩЮЧОЛСЩФЛЖСжрраФУТКЛЭгеШОЧШЩЯдйзбЩЧЫФРШЪеккнчуеЮЯЩбЮЭжгШЧЮ>\ЪшЗЦЧЪЪЛСЮЯНЗЪнкгбЫЩЮгЮЯждйЦМЭОШЭЧЮжкебжкаЫдлккдмнказрЩЩйббЧЪЮF[УѓбЧФЩЭдЯзйЮОЮлмтдЯлзежрхсржазжтсллтмгкхьюсннуьщьчулсшшчыургйп8[АЩЗНКЕЧЯжЪСЧЧдрнчктхуруххчнмкмнсушьшухтхцыээ€‡ьээщьяшьыщуйжут#EЇрФРЩШЯЯЧЭжгбмхснкнхщщьщшшптцыыцыщсчьюёщыььщщыщэяэшпстышщпЯлруBZТѓтзпсхчскушнжзндРбцшшщэышсухшэььшэяёяђѓђэчщучшчурйпыюю˜цнжжус<]ОєкДРРЪзаЯзсймутмЯдрссчцзлссшшычухьэюьщхлймплххсттздлхшскгЮТЩа!7wЉВВЕТепнжбжнмежЯдйлжлнйбгтцыстлл€ЧжйлдангЫгжжЯбенЭШнрццлеЩЪЪда".ƒыючкжнтпулЧРСШСШЮбЯФЪаЭЯкннлдеФФКУрнЫагКЗЛМИИЪЦОШЯаглбЭССНТЭЭ"@œїїяюэцжгййШТМНЪзрхйЮЯЩЮкбзнккжггкжЭЩНЛМРШбгжееЫдлкдЩРЫЦФЖОЫдЧ>7pјїччшлРНдйСОТНШбмсеЪОЦФЭжмйШЮжелжНЊИСЭЮсс€ќлрйншсеОгпедФСШбдЮЮI:nйаЗЪЫЧЦанпаФЪзпзймзЮеемцшпмзЧЪРКЖДЮмбЮЮгеЦлунспмтмсззЫФЛЗЕЛпс(8ŠчЭНЩЪЧЛНОЦФФбкнлбебйтупцхзЯУЛНЗЧггпсЮазЮИУжлдгБИЧЭЗШЌЂВЖБЗМжЯ(4‚зЧЗСЦУУСЦЫкжжрчупнмшэчцпЮСЕБЛКЃЊКУСИЖЖЗЕИТбЫСЖЃЂЂЁœЉИУЯНУДКЩМIFббЛКНШЯЦЛФжзлммурттнутмаТЋЊЋЅСШЖВЕЕДЌЎЎ€ТагкЮСЋДРДМНФеЭФФЭйаЦ72}жЮЏИОФЧЮЭбйдднлгдЯЭЦЮдЦЛЎИЗЧЪздССОМФЕЏЕОЯаЅЅ‰ˆЂЋМФКЕКЪаЪдмхщх&$ŒшрЧУУЦЧЫкзкбЫЯлмсусмжгЮНЏЋБЌЊЋЊЎУЯбОММЗФЦКЄЈЇБЌБРЩНЖФЫЮЮгтщчс4EИюуЯжкЭЧбксрйгЯЯЫЯжмЯЮФЩЕЊМЛДЖВДКРТМУЮбрлскШНЧгЫФЪЮЫЧЫЭбжййаЮг?QОшймпмйтчыундЯадЫЫЪзйЪОДРЧЯСЪнжббаШСЩлёЪ‘ЭуЭУЧдрыцршчэщччбЮЭгй7mбљђцэяььщттлйбЯЧУУЧМКЫЩШШадпрггтѓѓђчкСjS–ДйтзещюхлнтцтскгаабЩHwЦтдсуплсцткгЦЭбУОКМСЛЫаЫгддЯдллзслʋ}T,9Q|дмдцыяюыышмнээшш€Етс>‹цтэусжбщчлШННСЫдЩЪЮЯеЯжнммжкббжблсМh.8;B71ŒЫшяэчэђєѓыюѓѓяяьёё@ŒьЫЯЦОШгйЭУЛКЭжблхжЃžУНтщщыцсццурѓїщ‰<4%)0тљєьчшыёёѕѕєёясэьх]•зЪЩЭФШбгФЭЮЫйцрухФ|ЎЃшэпёћырхыєјпb((47;@"@ШјљяыыТяёѓёщучьэььqЕѓєчсмннузШЪкэєпЊ}`cZh]xЋ–ЦчьррхјюY0A-+,92;&žыщыюю€“щчыыцтщтмхт9’хшмзпшытрутпЯдЃgWA:)#?B„Ѕ‰ьћынрёЉ@)!,3<>ˆчёхщшцртхпгнхпрйбJŸёуаЯртххмбЪкрЦ„hB>?!:>\”‰ЩёццєхАe0GF3(402-:ѓёмдзпцщпгмсухнЯТ@›рхймклл€=уѓяэ”7&!)7%)A5v‘ЇьѓюЇzЄ~G85:%+1@-cыяхккнпсмагштххкгVРѓщлнйплмпшєс[)!90,$+%3e•Вяє˜I@H,,3*1*$A3’ѓїѓчхпзШЦЪйдккеаж]гыщшшрнхрйшьЧdA?#!!&&*P˜УзФo;8.,-.(.-:&oЮЭжйбдаезссзЫЫаспuжьчхнсрненёєu@[E4-(5.-(#&mКР‚Z1+75A((2#;CT*-pЖЯмеЩИЈЌЎЗЛЧУЧнмрЩїљыэёэяэњўНI-2J:71+338A?74"4L[>:eA8+7Q^F22)?ЋйкЪТЭРЭдмуурпцюьшЦљћѓюючхю§ћЃ70%4<)1"$3+**+>+9<9ASЈAHWGJWTGHBAЏюїмпнбаншщуцщээуйВкчшшнкбхѓрu#%+%!(&%.287:)*,2#,V˜эŒCZ7>ZjB3N,FРщпрелзгххыэщмлкзЩмїѓхзаЯжахНQ!)%*!!$)3)"+$&eФяk*94(%4!7`АзшмлаакпцшмЦАЃЏЎДЭјєтЮЪЭжяё•1&>,-)+122)2hзЩZ2-75#24<)FkЄйбТЈ™ЄЎФгсЩŒ…”ЁЌЈюѓцжбгйктцi2W;(7%$4&(*$+$EЇцЌ5)$2<0(*>NP*ƒЯСЎ˜ЄТаУТФЌŸЇТЫЦОцяпцмлнтсЛN9bN"($),%230LУлБEIC1(2:?.-7тЦЏ›œБЪЭЫРЕЖЉЅНзйчяпмнстэч”5;2!1$*"-)%@@;+jьж~;B5-7409?4NДТбйнллгажЛИШЮалббёрЫЩзцьјїЄ)!.+9;95%" 8483 Hбы…2P?AH;QФЩБаЭеннцтЧТЯнхнкжмгЫОнцюјю‡5*"&-3+<4&##"!**$)2A–Ѓa$B12(2-)3&%mхеТгеазкзлждпшумжйыщдбйдЯыкt("3@>C<9724+-% >O~бq,!-+*.8CI-.ухсхклдЯЮЩСЩЫЫбдЪећєнзйцєёМ@4B?>8+($-#!9<9ЎЩhGT7.+"0AJ5>„ИЦэррйайаЩЗЗЭдчнцшєCBЎћўђђћёѓѓђђєђёђќѓђђяядђёёяѓѕђђєёёяђђяёёѓѓђѓђяђѓёђѓєѓєѓђюяэ>7Їўўєѓђђ§яюєєлѕѓђђяёёэяёюёѓяђєїєєђяьыяёюэяяђѕєяђюяђђўєђђёшяэю++Јўўѓђёђёяюёёѓєѕїёђээщёђёђђяёѓђѓђєђюээыьэюяђѓѓќёђѓђђ§ѓђёёЬяюэђ)@Уўўѓєяѓђђёёђѓяёяѓяэыэёђѕѓёѓєєѓѓђёюэыэьшьээєёяшшы­ьэьэщэьёђєѕёUIгўўёѕєѓїѕєєѓѓёєјѓёюьэюѓђђёёююэђёэюющшэюэяяэьыцчыьэшшхцыяяюѓєђє[LФўњѓђђ€ЕюёєѕїѕёѓђёяэщяэьычьыютбЭушщцшщяѓђёюющшхыюэяычцыэыэчхщюяEBДўўђёяяюёэђёѓяяьыщьщщцщщчыэ§ђЯпртчыёёѓїёяющхшшщяёююшцсхчццтцьђOMИњїьюэяяюђяюющчщчшуцщшцчьяђўўёщчцшьыёѓѓюэышшщяюѓђьђшсйпшююэяяпIrюўььюђєёѓыцыччхуцуушщээюэьјлЮтххтйхшцшнЭлйпццщццчхщщьющщёёѓёђMuсюхцьяђюэххЖнсхщщюђѕ§єѕѓђшшцуцшхупнусхурмпучюшьшцшэыёђёєёюэщэWёўєїѕїјљљїњљїљљїїљљE•ўўћєђёѕэёяяюяяюыюььэюђђєшѕђїїєєћўтz13EA>%4•чўњєѕїїкјљјїјљљњјјE”ўѕыььыяяюэыыьюѓѓћѓМЌЮлњўѕїїєўю‘A>7.,1ыўўїјљљјњњРљјї§јїљdЇїяяыщьюяєэяђђћљћљк–ЛЖїўєћўєїѓєўўьi%.5<948$EбўўљћљљїјїјјѕХїјјrТўўђђѓєѕђєїѕђўўњФ‹ke^ogˆРЅдћњєѓјўїa2G0);:>8,ЎўўѕјјѕјјїїѕѕїїѕљFЋў§ёѓѓєїїђёєєяЛxaB;.(>I‘Ј’ѓўљѓљўИ;.4&2.48E%ŽўўєєїїјїѓѓїѕѕїєєѕOАўњѓѕёђѓѓєѕяћњз‹j>E8*?EcЅ•дўњўўјОo2.-3<#8UœЪэжw<97&787;73)?2~ёѓяёєђѓёѓѓяёёђєѕѕwр§ђюђђєѕїѕўў{IHC@@;+8>{§ўэюђюяёёѓѓюёююђђŠцўљюђђѓѕєўўпC93.."LЉЎ^OJ,BEHFBGA<;BE:ˆўўёё€ѕяяёяььяёёђ‘ћўѓѓђђѓђяўўКC:EG5&(.7vc8A\hS;8AL7N…шяђѓэюьээыьююяѓјїЋўўёєђєѕєїѕт…;9NE?73%+!1POLTMYVPGdmPJ?81@>Ln>7Žшїљьюьюьяђєђєјїњћйўўѕєєё§ОB49L;858547FA<1);IdJE{›PB9E[oT;E0JСў§юѓюєюёѓѓєїїјѕјљЮўўѕѕђёяјўўЃ3*+219051+8304*9:>CM`УЂIN`GUd]JPGGМўўєѓђѓєїїјљњјїєєќЪњїёё€ёяђѕўшq$*,*-+,*).7<448780;pЎў–I\@B]tG,O1BЪўјёѕѓѓїѓљљјѕѓяяёђяў§ёюяёюяўеV%1:()*(,&%*0#*&>-;bШњўяяђёяѓєўјюцррнщмўћёђяђёўўž32F40.13532:FC51("8vљрg77C><;?;-EwТўїхжжмуььљяЯЦхутцљўѕєђђёѓўюo9[<.3557;0-)(+9:7+"NНўЩI;1EFEECATY2‘ѕђмрсцшэюыумрюњюяўўѓёєѓђљўнYBiS-)11.7353++8A>1([јўЦGSJ8;FMGB)5@ОўяшбдтэёюэыцчыяюяўўѓђєѕїўўЗCB93<9<8;95.,#%LB;)-wљѕ‡)OC?>EJHBF2[сјјэюёђѓѕэёээяђёїєўћяюёєѕўўЎ0(5>9?5.vўўьяђѓёёѓѓ€‡єѕѓєѓѓєўњёяэяяўё|.*$AFGBB<<7(380. SUŒя„;9B::;FLO30”ўў§ѓѕёђёђђяыяђѓђѕѓўўєёђїўћЩB;I?CFBA:8;2(,.:;#??MUN1:œтњћїѓѕїњјїїњјј€MњTЄўтткЮкушсеЯакшшяєхДЊЯгїћѓєѕєђєёю§ўў™TJAA2 ;яўўјїјљњљњљљјљјљјєrБчурсентукхттщљюѕїк•œТКљўђ§ўѕёѓѓўўђn2:CNHNN1Vмўўњњћїћњњјјѓѕїјѕѕ‡Ыўўѓёьюяђштчю§ўѓЦ—xpn{qŽЛЈжїњяєљўўi?Z<1@PJG!5АўћїљљјњїєєѕёѓђѕєѓOБўјыюэєђёёєюєршКƒiUOA7UW˜ВŸјўљѕёўНH:E;?;GNU*1™ўўљѕљѓђђёэшяђёяэч^ЏўѓтцяєѓѓющйюљтœuJSQ42ZPtАЄзўјњў§ЪzF`ZIHGLL@JŸўўёыђщєѓђшѓєѕђьщмPЌѓєщыыээьѓўў№ЃF3?@B~ЎЧўўЏ[N`N.3CB>3:7B2ChВжяс‰OOH72JNHBGH9NA„щсчуущршюээцхтцяя{сљѓяэюђшьяўў‡NqSE4:3<@E;48‰дп˜vB+JIQSSNULN4AGƒёюжчсчрнкбдкдгчюяуўўђјєїєїўўуT(NF..015"+>>4aЏМocW>MSP[VMPJMMJCўчхррмштмйтпйетккŸўўђюђєјєїўўСWJZ]E1154>JŠzGQpm^M[YZ]dWL@BHGVH[ƒдгллргмлегеЭручтёЖўўђяѕјјїћ§ю˜OHVV[NA9A)Cc^ba[g]]OruUUWIF7H\zG?…ЫлэхтйШШЫЭеумтюёєпўўљїјєјєўўШP@IbQLHJEGNYNFW@IUqQJ{’UHESw}]FQ>WУыщтйунстэюёёŠяѕєјгўўљјѕяѓљўўДBJqФщєёычшяюєљѓпШРЦРЩпўћёууцяўў>-BJE>@:CII@EMLJA54@„ѕуpFCVFJFSPA:9>AB@E2-YУўЧG@:QSNN€–G`i9цкЦДСетеежЦЗОецпзїўёђёяьѓѕж^Owb:?;CG9G><;BJOL72VшїЪT[VQPMPOL.7?;3>5YOI18ўцŽ1VJLMNPSMQF@?;GABNЌЕz>bL@INMSO;7њѕжыцщшыюђюёяєёэчяўљтцыччўѓŒ:;-MNTZWSHFH;>H8"^j–ч‰>?OQINHTYFB˜њјѕѓююшцстйнпншщхыў§юшхѕўўаQIUO[YWINHJH@:EIB78TYHШнzYnQJPL@U^JLгмїѕђэтыхйЭзцьяєђєџ€ŸкмдФКЉТзуйШжллмйбдллЯЪкджЪШШЧФЦЧЭкпзбШЧРФКФаЧТМЪЮммжбЭЪЪЗV*&2)1@ШШЫдбИЭпжТДКОСФЦЧТИТУганчхччуйЩЩТартЯШШЦСУдгУЪШТЭлкмсмзхюƒ;A<9C@ЭЯЩйгЫЫлндЧШЮзегФЗИЫнпкзхупезжЦИЛЯкгдмгЭЭеежЮЧЧбднмуплЩЛаŽ*9E985гСТУМРЪзеШЛДЗЛЧУАЊСцьпРЧФЛТЪлдОШйжтутмЮжкнпкЩЭйнзмйхпкеух„-<9$!!йжбСКОТФСТОДВВДаЩИЧззаапрйШУШМФЮйЯЯждййЧЫЫдбаджЯТаЯкзбЯшюЋFAL4--ССаЯЩШУМИОРЗЕВЛЪЫппзеЪШЭлсккчхдабзтррйжжлккмндШЩСЮабЪЯЭаЩŒ%>A-&ФЩМЩТУЧЧОЩЩЦНФЫкхцжйЯШЪдЦЪЩЪзнлл€ЮмджажймпьчнЧЧРМТШбдгаРДАC@44;2ЭбдуцчхтеЫмбШШачыыутрЧЮлнЭМОРФУгдЩЩЪРШмшщнлзЮЯдтщущЮгЫШЪжЭS(2B3.аЪЦУбдеРЗБТЯснкнйаЩЪЦУЮмзкйбУМСЫФТЩЦИЦСЮЮНИЗРЧКЕМТТНЖНШСЦаV%4-"ННЊДНЧФНЗВЩлнкзмгЯЫжТОЫРЛЩЪШШЩгЧКЖДЏЌООЕДСЗЌЋЕЎЎ€EВИОНЕБЕаУ^$$73"ЛЪШкжЮЩОИТФЪШУЩЫЫбегбмдЩТСЮжпмЯЦЄ›ЂЃЛТОФАЗЖЖЋЏББДАСУЗЊЛмьс„5&2:.ЦФТаЯОТЛМФЦРТШЩФМТУкццзкЭЯмусееБЏjeˆЌЇ›ЈБЖМОНКВНВДВДЊБВœЈЉZ*3@:<ОЧШЫЦЕВЏЇАЕСЭЯгЩФЪУЧдкппуцнаЪМБ˜Њ•žБРЧВЄЊЏЋВИАЊЋОдааШИВКЩбA(><+аабаЫНЦЖАЇБОССУУМЭЦКЕИИЛРУЛВИОЩЫЖБКЧшбУЩИИМКРРЗБДМШЩЦШЫЫуяН>1,.*ЮЮЫНТЪСАЖДЖТООИЗТРЖБЖЦРЕВЛФДЗРКДЊЉЋЫжжЫЛЗЗСРЕОЧРЧЮбЮЫЮЮ€ЛФчЉ(!2аЩбзгЦНЛРУбЮЩЯЦНЩФЮййЪЮШЧзШМШЭРКТЪУеаауЮТДСЩРНКРглпЪТФЭлсдНE9#@;УФРСЪФИЕМТейЫСТЩУУегЫдккЮЯЪЯЩТНФбЯдтклюшцйЫЪешштучцмегжйуёёC-78РЦСВЕТЛЛШжклжЦЦШбЪзлджЭкЯнкЫЯлеЮгббйнрмЮбрухшюэячщхх€Жжмнчјїu4)8ШКЖЗЖЦУШедаШСТСЪздмкЭЫЭйкцтмкдЫТЭЫЭалйФЖСнцучыцлзмделнкммшпœ4&8ЭбеШОНЦжйЪЭЧФЗКСпцмебШЛЯднеЪИЊКУЪгйЫРМЦЫдруьчснйкспуттпмкбыч91GCслсбЯЪЩдЫРЛШеазттыээшыускбЫаШКСЩЭЭаЯбпрмцсцц€єлцхрхчяюэтхшѓѓлF%)0леЭЫЯЮЫксЮЯкйнклуунккгШЭЮбмлзкзунзттцрчыэющчьшщурулщспснчѓѓлm,45реУСЪЦТСддЩЮжуцшрзеЮЪШШзЫМШЯцууяѕєєэчѓѓђьххущтнзйрунамчяюѓѓы144нпнжаЧкзаЯгбжлЯЧЩЮлгдегййЩУбсуыцмлррюђяьттшхтпкмтпсеЩЮбкгММЩŽ**0гмжаЭЩбЧРЫЫпылнлуугЭЫЩдаОВРкмутхшыэыцлнкмтткйнекземршшраЩЭОЫЖ@$.нжбФМЖЛЩлпмжеЪСРЭбдЪездбЩЧантрцюяющтдгеУМЗЦжсжгЭЪгдЭЫдгбртУДЫJ$&ШЧЛЗЌБИагбЭУЧШбенеущпгФЪМЫстзлнтрЯЮТКЎИКРУЮдбЮШЫеЪТЫдЭныцжЮгЏS5+ЧДШОДВЩдФЪТЄМеШкцхррЫРЩжЮЫЫаЮФЮЭгУЫЯУЛЦЯггбЩТбШбЛОЭЯцщьшуцрйУiBGКЦЫЧЛИОТОРОЦзжптлЯШЪЪааЮЧИЖДЗФЯФСС€ЛМЌИЫШгЯУЦШЩгжпусушцрухцхюˆ?IЦКЦМДЩЛЦРНФЭгйжЭЮЫУШгпгЧЗУНЕКЏЖОМЪНЗТФТбЪЮЧЖЖНЦСЩнхсхчысгкмдШŸ;СДЛНМФМЗЗСбшыугРРШЫЫбкЭкдаЩРЩИЛЗЛМРЧРМФЫгзЯОДБРЧапцщщспмкбДНЫЊM.ЛУЦШЪЧЭздерслпаОСбкнздШЗНжкЦЦбжккагеРЧЯтснзЩКСЭебеЯШЦекзЮШаЭкУO"ЭамуыьюыыртбЪйгЦУЩгкЮЫСЧЩмхпмппждаЮаас€/леШЧУУЦЪЯИБТзпЯЧФНФгхшƒ1рплндллЯЫдзнунЧЫпдЩИРЫЦжЯггзщырмгзЫлдкррзЫЕЛЛЩакчтркдзФВЛЩнщєяƒ5жртнлЯзжЧШШжЮШамшпггрэщьщюэцхдЩСЧгЭбжйпскЮСЌНРЎОУЦЪЮаббЮаЭбнјєŒ3зелрлежЭЭССакееждгкутчыццчэшпЯЧШЭМЛСЪЮгжгЮбЫеЯСЭкЯбШЪФдаНОШЭжаœBжЮдЧФЪШЯгбнщщютмнсуутнутцччнЯЗЛУЯмхумхпШаажЭгЯТЧЯйЯЪЮРБВРЧЧУДЪДNзщшшыцтытпчээёєяуцэыцчттЊслкбЧШОзсуццхытууЪШЫгТФЫгзкбЭШФгезгЫтЮщєђѕѕёьээшщыьяышпржпмнйЭйтмрйЪЪгсчуруцшцррЫЮЧШжжспуедезкхчшыыцт—ёяёѓяыщщюьхнсрушшхрсскЪЩззмекмрщяшчщчпллжццхээчысуйгеЭЫжксчнлёѓЖщшђђэзтээ€ЖшщшчьыжзуцчшсйЦИЮмээщытезаЮеЮаглппртрзтагЪЮкрнрчьхюєцхььююэьснпуштплзлЩзтпмрмзЭВЫскппункпуттхпхлмхэяэхчушэыэссмцышяїцтчмппмззручшьщцпслнѓчшђчлестнтсххубпчыцрхсцсэяьсрлзпэючтцпхщэыїјлтмбЯЫдблрчнтнднёюѓю‰EЉтюрлйбсшучубапцтзййлйчющшчлцычсРШбйнсхмшјРЩЦФЯжжнсснчуеЯзЄ‚Bj]+ЕїздЮФЧетррткЫзмцшхмдлыйеЖnAdВТЛИЧЧдпчусэїЩФФЪУЫежедмнэддЮI,97ьылдШгЯжеддЯзбЪадмгьЮдЦ{pH8*]БчЖЩЫЭрзанЮФлзЯКННЯлдЮбЧЯлЇŒ(?.2FгжЩеемксдЫШжсппгЩСЯщгКm"-!)>ВѓёшлМ‡ЅжтнШЯклмпгЮзндЦДЏ‹J+3>"EoбьтлспсщсчжбЯмсрмЭЧДИh!%"1.iжшСЕr7@пЭгЭЫЧШЧФлрйпж˜T,&:*#:CсымшуплЪймаРЩпсуцзжч„-0892>’юž>*5&$0”ЧЫЪЯдЯЫдкцшїљьˆ)%+*+-3P‰ЪмйтзйшптспрпцсрцтяЯnB3$,+4-93^дЇ8-(5vршузеЮещёюьюћљгe&%23#;[TИёїхцшэшнсчэђєыыїїє42#.)*9@PP@]oH">78hлшмелжЭжхяюшлеЧВБшБE:Joa>8,3&181,+:B:кпуцшнйЮЧТЛЭйЮкБz5AF3FMBM•ншЩЯзурэыпеЯккЪВЪМ^8&(O)I0(!)(,589@B;ЦТФЦЪЧСЖКЪЯЦЄiŠ’˜H3+.@ZI4ŠпЩЯЮбЯгСупдняыУЌИтw,$*.!)+:*$-(.5354%УТЫШРЖИЗаЯЪЫЏЖКЯкƒ3.CO@dАЗМЭЯтЫЦгЌ|aƒЗААЮтŒ:725+BVF,*#-.1.*,ЊЋУзЩКНЕЋЌЛТОЧФЭЦ:+UG>?%LЮсЛЪаБЈЛ’I#1>P|МюцЁ9*:;:EIJ$+113:?:>,!МЭЮЮдИДИЛЛФРЧЦТКЕЊL!582"EКспйаЄxE5)CC@3;iКёЫY$5;7CMMV5*-;93-,(!ЯдЫЧОЊЅКЛСбмаЯнЮзСz;+(4<9НьщююЌF)@<"<-5(9<3;OЧЁB,AHC3-0#(7-3;%**дгеЭТОглбгагдЭЧЫсяЮa2&")$$AИцлЊ4;(&:aКс‡H21<7;0+%&(,1.5%-ђяђђѓяящэюяђьяёё€–єђяяѓєёѕђєђђѓђёэяђѕѕѓђёёыьююёђђэђѓєђыхуял`+0::??яёѓяяѕяёђђюшюёёђяэююєёїѓїљјѕђєєэёѓєѓѕѓѓёђёяюѓьяёѓѓѕєьхщўўŽ8?CA?Aюяѓюёяѓяђђёюёюђюэьюђѕєѓѓёђяђђяэыююђѕѕѓѓзѕєѕѓђёђѓѕѓјєэтрхє‹(<::58ѓѕђюђююяёѓђёяяююяяЭђјєјёяђюяььяюэѓёѕєєјёяђѓђєѓђђѓёєящухўў•.775+.ёююёёяяющэыщёщюѕђёёюяэђёђёёєёяюєєПїєђѕђєђѓѕєђђєюѓэтжрўўИN?:$,3ёђэююэюьщыьюьяяёјѓѓєђђёђђяђѓѓѕїѕєѕѓїєєќѕјєђђгэђюёэубсєѓЁ)8:4,3яюѓёѓѓёяѓюёяђюёѓїєїєѕѓѓђєёяёёѓЛєђєђєјњѕјѓѕяђѓѓєёыхмушрЋL?,74:ѕїїєїѕєэыёэђєђєђїѕєѓђїєѓђѓєяяёєёѓєѓёѓёѓѓšєђяѓђђёѓѕўьмрыѕњсY03372ээыээёюёььюѓђѕїѕєђђёяяђяѓђђяёёяьёёээюьѓьыэююэьэщшщчлдкрцёч])&)10ьщэщыэюющэюёђђѓѓ€Чєяѓђяяђюёёђєёяюьышыщщыщччххучцттххтсхщўшj("429ђэђёђђяэюыёююяёяђяёєјєєђёєїїѕѓђёнбйпѓцщчёыьшыщчшцхпкжпчљў§‹7.84<ёяѓяюэщыэыьюэюяюёэѓяєєјѕјјєѓђёєштЃЃЦухчучыььющьшьхпжжлпембd1)997ёююэьээььшюяђђёђѓђєђяђѓѓђђ№юёьнтгсщѕѕэьшшыщщхшхщсрхщыљћЁE*@77ёёђёяѓьэщщыюяяТюѓьыщыэяыьыэююёющьыюѕўђєьяюьыщььыщчспщэяэ§ўЫE0343їѓёѕєюэящыюэяяьюфяьююяђюђяэёээыэьяёёєёёююящщььычхшыээшўЗ#),-ђєяяюяььмюэђђэяђэяђяђєђёѓэѓєѓёђёђюєюђєяєѓєёюяяёШяыяэюяьјјаL:*?9ѓяёёююэююѓѓєїєђяђѓёѓјѕѕђѓђєёђђѓяёєѕѓјљїїєєѕєчїєяяѓѓђђєњўў@)14ёьыььыяђђљёяђяяюѓѓЎєђѕяѕђѓѕѕђѓєђђѕєѕєёяёёєѕїѕїєђыёѓѓїєѕѕўў{2*-ююяыэыяёѓєѓёяьэюяїѓёєяђёѕєѓѓёяяђюѓђєђяяђХїјјїєюупыђєєѕѕѓјўВ8(7єєђђяюяэяєёёюёёїѕїњјѕєјѓѕѓђяыщщьёёяђёёћђєѕјѕѕѓщмуѓјљљњљїїўё?-E9ѕїђѕёёѓяђёєѓёѓѓђїѕїїјєєђѓѕѕђююьёѓђђѕѕѓєјјљјїєїячшяѕїјїїєїўўђL!&+їђѓёёђєѓяєђёѕѕјїєєњђяэяюёёѓєіљњљљїљјњљјјїѕѓьхыяїѓѕѕыљјўўћu,22љѕѕѓюяѓїђђѓђђћєђєєђђ…ёѓэяєѓљѕјњљњјљљћјћљњњљјѓэпрщђєѓїєѕїїћўў2.1ѕѕєђђїѓѓєѓђєєѓєѕєїђѓђѓїєяюѓѓђѕєєѕєѕјјѕїєїљјѕђцмуюѓђѓѕєєяючшїЁ0&,ѕѓѕђёѓяђїёѕѓєјѓђђщїѓёђђёюьяюѕєїљїѕїїєїєѓёёаѓячщюѓѕєїєѓєђђёыўл@%:ђєёююььюяѓёђђёђєђѓђѕѓѓђяяёѓѓ„ѕїјљѕѕѓђюьюэёђющцьёєяёѓђяєјєїэшуT)!ђяяшщчээёђяьщюяѕѕјѕѓєђєюѓђђѓѕђєђёѓяёюяюёђђщмдзчяэяѓђђјѕїєєђћй[<1эѕьэььыьѓюшцущјѕїѕѕяяёяюяяюьѓяѓяѓюэюёяяђётЮбмыыѓѓ§јєјјчњєћўюtFAѓьюёяюяьюьыььєѓѓїїєѓНюэюыььышьыэьышьыюєшйЮжцяяєѓєѕєєѕїєѓњўў—@LђюыьђыѓщьэяђѕѓєёяюяёєѓєѓѓююЇыююэђыюяььёэьйЫЮйсцэђѓѕљѕѕђђѕяѓђэБ<#юэюьышыээяѓєїєёюёѓєєѓюєыяђѓёыяёѓѓёяэюёёющтсптчщяѓєїєѕѕоєђэртщОG$ььђђёђѓѓєїїѕѕђѓѓђяёђѓёюёђђќѕђэёёъђёэѕђёьщшцчььяюёьыюєђёёјэяђўлQ(ѓѓ§ђєѕѕїєїѓїљєѓєѕѕіђѓяђёѓђѓєѕѕ§їєђђ№єыутуцшэюяёэюьэяяущтчюѕўў2ѕїїѓєђяёёяѓѓђђїїѓєђєєФњєјїљљѕєєђѕяѕяєячтчщэхыьюяёђёяѓюычшыюњўў–9їѓѓєѓјѓђѓюѓюєєѓєєѕѕќјљћјјїЯѓёььяюђючнпшяёььшыюыюёђяэюяёюяѓѓўўЃ7єїѓёёђяђяёєєѕѕјѓѕїѕєјѕїїЯљїїѕђяёёѕясгапыяђёђёяђёюђэёэяыьёяююєљЗIђїђѕѓёѓђѓѕѕ§љѕљљњќјљїѕѕцђєёёѓѓёшуцяїђѓяђяёѓёёяєєђююьчыхћкYєѕјїїјљѕљњљїїјљїјїєѕѕїњѕђяюєяяпэёѓђїјєѕёяюѓёёђѓђєѓђєѓїѕѓѕўћ‡љїљјјїыѕєѓѓєѓїѕљїєёђїєѓјѕєєѕѕђєўѕїїсєљѓѕїєїїєєѕђёђђѓѕјѕћўўЄјљљјїѕѕјјљјќљєєѕѕыѓєёѓѕјљєѓѓђёёѓєђєђїљїїўљєєёёђєєјјїљјўўОљ§љљўњїїјђљјїјїїѕѕєїѕєѕєєќёєёђђкёѓяѓєёєђѕєѓѕѕїїјѓљѕјїїѕљјјїљ§ўёћїїѕјїѕѕѓїјїњњљїђјєѓїјјјѕёїёээёєєѓїєїїѓїѓїјљљщјљѕјїљњїњјјїѕїњўёћјјѕѕєєыѕїјјїјѕїљўјѓў§љѕђѓєѓѕѕѕђѕѓѕѕєєѓєєїїѕпєїљњїјѕїєїѕєѕљўўєѓѕєєѕђїїјѕљїєђїўўК—LТў§юяяђђєјїєїѕєїїјѕєѓѕѓљљ§ћёњў§ѕєђђєѕїѓѕ§ўяэђѓѓђѕєѕѕљѕєђј§АŽIk^,ФўѕяяЅёяѓєєѓѓѕѓєєїљјїѓўљёпƒQxгљѓшыёяѓђєђћўєѕђёђёёѓѓєѓѓћј§эT!3?<Ѕўўяёѓюєєђяёѕєїїєєђј§ђђп‰{U>,gЛ§яяјёјяёњђюєєЬїђѕѓѓѕјѓюѕўЮЈ1547MŽљ§эђѕєїѕїѕѓђђєѓєѓїяўїуМ{40+#&AЩўў‰ђЦАсўћјєђёѓяђђєєђящбžT2@@"+MzяўљєѕїїєїѓїєєѓѕїєїяыюЦw*5@G3!qюўса‡:$IЋђѕёѓєѕѓёєђєїћўК^%,50)ASЖўўѓђѕєѓїђѓєєѓяѓђёјўў˜0<<­9%@ŸўДC1B2!2Ÿѓѓєѓђѓѕєјїјўўњ%((2779S™љљєёєїєєѓєїѕјєѕѕєјўмvO4*55<9;:hьА-!&1.9„љїјјїїўєѕѕўхлj,+.81?g]Щўўєїљјјљїјљљјљљўўф˜;8*015;CMWLezO2HHA,)љњјљјјєєајѕєљўёь1%4@@IOўўњєїѕїѕњљљњїѕѓёэњœA:&..:>;H942>>ж<@CHGјљјїљїѓђёюэяѓїѓяp4:;;E@?nьўєѓђђѕєѕїѕђђцётшўзTG%,V|eC<<225275<>EAѓѓєчђэщшьяюѕшюе•BMPGGULTБўўѕєєпјєєѓђђяюэьѕшn?8%8W5P>:4+479>>AG@ёё€юэщхшщьюёдЛбУZ94CF`W?˜ћяёёђѓяхљўѕјўўэщјўŒ5)8:7.<<:249@<;@A;7шьыэщшхьшыэђюыђўїŒ9AQUL+tпѓэюѓњєїљЭ‰pЅмшчњўЂC1@G?@C]I+)789>C>01чююэђёщыюяьэяьёїёЦE0^HIB-^юўяюєтсыЏ\7>Le—мўўЗF1CHFLVS;98:AHEC@:5ђэяђщэщщьёёєяюьцыдZ.&<@A*JЯўњњћнŸY<8LLS8BuЧўьd,2MNOUS[C>>AFCA?7-єяђяьшыщяёяёєѕяїћь•A8ACF)FШўў–еP3@E2@NG<@mЦўŒ*CTOL8.98@F?B@;57,ѓђяёэђяёђђєяѕёяэєўзH:5>>7@Šёўўђ‡-7G<91:@C>AVаЋH.JPE?:448<8<<>51.ѕѕђёюѓёђѕѕўђёё‰эўўпj:4;3432A?BP*iєўЅ.(5UP>)*1$PMoŠZF>FNSJA325:954:;8їѕєєѕєєЛѕїљєїяяўўєuIJEAEGCŸўўз;3`cŒE*.+ 1C{ЋbQAIOOH<8-2,432577јєјѕїљјѕїїјєїёёаљўч—M?B@?+.kяўа:3cdH984+%!;jаў’H9ECJ@710148950<>ъэяшмйЧЮуящпщыюьэушщэтыы§щпм숕утйпьяэцпйлйЯжхйздкуэюэтплйЪa2:BNJTзслшуекыщзЩбгжзлрмазкшхёђєєѓяяцммьяђцртрктшщйпзксяэёэщсљ§;GTQNWущщьшулщэщнмрчццнаатяђыыюђьупчеЮЩкххшээсжхэюулпшшёё€бятжбц–0ENNAGымдндзтьшрзЮЫжелЧЧляѕђннгдеушшзпшююяюѓюяэяёьссчяыььёэхчѕѕ”5BB@?<эырегесплеаЮЧЭасзепцшцнэьыктскзтьшшыэящснчшшщющшзттюцжпўўОSJN>CFжмспкйЯбЯагбЮЯдпсюёђэщущыяьцёєэыыьяёюэшььюяёэшмпкшшхлбмун›,CHB5Hпужзййштззйкжймыёєюяурчшнмлсшђээ”ьыцыэѓђєїёпргелнсупйгЯЦŸSC1FBLщюэёѓѓяюскщщнпцѓєїёяьмхяэуазбкмчусрпЭхэєёюььчсшюђяњунлзтщпd-5@@HрмбрпйбйгйккмпнлзкзэєєђёхшюѕёщтЪРvzЅЦЦМШаЯасжЫЪзЭЯЦЦМШЦЖСФe<:G;BджктзЩШЧУЧЯхщшчхсьмпшёёЎяюэчнеЧЕМЉЗШгпФРРЧЧЫЯШРУеусраЮЭгнц›M4O@CшшщшппмгСРЫдййжнжкдЮЪдгабгЮаадкнеЫесњщмхеааожгаЩЩддмйтутяўеPG?>>ышхнзрдЧЧЮЭакее€ддбЭЮЮккЯЪзлеепжЮУЧЩетрмжггсзЪййертллккннкћК+,150чууьцзебглхццукжпмкщщшцукуйктхегзрмцхуьрлзптдгЯжшычлклпыёѓбPC:C:йсйжтхдаблчьшурлнсщэсыююмпсуцзгмсшшђюёєїђячхэђёђёєёэщтэяєўўЃH5:1жззЭЮлдецэьюхйзжруыэьэщэсяырцьыхтьщяяёюхсяёєєјєєѓђюѓёёƒєѕўўƒ:)33кгбзапйущюьуйждтьцэщмснэёђяэыысзслцшшщсЮкяѓѓєєђястуцьююээ§їЕ@$19ьэцпедкцшпхчжгдтяѓђёщнзтшѓэлЮЦЮппшштлздтьѓѓєѓѓёшнчюѓѓ€№ѕїђьўљJхэцхтрчсамнэђѕёьяђыумтшыдЭдьэѓђєєїѕєєђюыыёёшщшущюэёёюєяюхраёЯN.8ььсйбЮЪзщюыщумкнццЇтщьшцннтёяѕѕљјјѓђшцхнгглшчсутпухутчщшяђеЯн\),мтдаЩЩдсшьшпдкцяяёяђыткрйрюђэьюїятткгЫагерсееЖсчултшчяєєьсьС`?<ненйШЪнцсщйТЫчнюѕєѓђслнптсзтшпхууйлслпмьтчпЮдрктЯксьђјѕњєєЪнzLJбмхндзердебмщьюђђётэыьщшбадбгйрггдйЭбЦЫхншзЯенныыёё€­ђёяѓѕєљўœGYйежбгрбйглпцрђьртйжсчёчкзндааЪдлдхжерупцсгЫШШаЯжтёђѕђѕђёюящцйКC&аЮЫкдздЯЭлцђєѓшклхшхцшмщчхржнбгебкелзекхтулжЫЩдтщђѕѕѓѓяёюшЩЮнКS5бмйммссььщёѓїѓьммцыэьхмЯжэючйхрыщчч€3псуычщцлЯймспцтптцчшнйнцѕк^1сьэєѓїѕїѕёђычяытчююёшпзлляѕєшяяѓюхцхчшщххсклзлзмскУпщючтжбльўўœ<ѓѓюёььыумчюёєяхшюьтжншуьышщюѓѕяяьщныюэчцтргбЯлтэюєяэухжЮЪныљўў›AюєяюэыьыккйшхнтёђяьюђїѕѕјѕѕѓѓюлбрщнтунмээчйШезбдбжктмтчртццѓўў?яѓэяюцтнкпсцюээюшыюѓѕѓєѕѓѓѕїяшуххздйаблшуустщщмхшсцхумхчнзмсшьЏUщчцуппрыэщяѓєѕѓїєѕїїєјѓѓТѕѓясдкутьюшуэьтчщчнсуйнцшщэукЫазрдгЭцШ^яѓѓєѓђѓїђѕѓѕєњљљѓѕїљјѕєєЯяёьупнщяэяђѕєєѓѓхсучнзхтыьуумтыьэытљэ‹єњљљјјѕјѕїѓѓ їѕєёѕђѓюђщуэяяѓэштюѓѓђђѓјїѕёюышсршёюђёяцшсюёјѓїњўљЋјњїјљљѓјїѕєєђєѕњјђюѓёёхпюяыщюѓёјїїѕѕяёььыяѓїєєіѓёьщшцхьяђђКѓўўЦєњљљїёёѕјљљјѕљєјєѕэѓѓјёяятлчюєђїєёщщтхшрххьююѓђёяящьщчыѓђєєјєњўїєјјСїјєёђёђїїѕёчьууяёёєѓэхбхыюыђѓюцюёђёѓёёяѓѓїїљєѕѓєїѕѕђђѓѓїєћўєѓєяяўѓяяИёѕєѕјѓяяђђўїљўњёяюђюђѓєђђчёѓїєяёѕєєѕїєѓюђюѓєљѓєђёђѕѓћўўьђээшщцьюђѕєђюцюўўљ—PЗјњьщщ€ХёђѕђѓьщђѕђяёьяѓёњћјљёѕїњѓйцьэяєёыњўемлстыцюёёђѓёэшђЌŠNuh5ЧўьшьслюђяюђыщююђєєѓээљёьбPrЪплЭмйчюѓёёћўунусншщючьэщљьээW&)?HFЎўћэьхчщьцчхуяюршьяьљушд’~[F9qУ§брсхїюшњульяьжлрчэшёцесєЖŸ9-B@FY™щшсяђёђёянрщёђющщйьћшкНx8:3-2GТўўћыЧДчћѓцщьюьютсцэщзЩОЂ^@GJ15TцўѓщѓёєѕєёюэшэѓёюутЭзЖ}%4CAJB*zэўнЩ„B+VЗўцчпхсрлйыяюїэЏb34990;MWЎљ§щѓэђэрчэшлльэђђєѓў”<)BNEG,%MЇўЖL3IB4AЌклптшчрьюѕѓўўњ”447BC?E`Јчээёцюёђђѕѓѕяєяѕєѕўт~Y?<@LCHHFpыНC0BG?A’ёєђяьчьѕєјїњўўуz54>I?їћјњјљєїјљјљ§ўљњ@4HPS\c•ўўљѕљїёёяѕћљњѕїьзуNN+@GBLVTI<>HEGPN`[`її€vљјљїїєяђѓёњѕєC@OVUMMwыњёщьыцыђїјѓыцлЧЪўШVN(-eVNNFJEPNQGTT]шюѕїђэыслжйыччшЩŽLZVW[iVbЅї§пьяёђєѕюцсцщкЮтЯtO@,G`HUIHGJIMOPOUVQнмжпмждЫзппрК‡ЅЎВbE?P[keE˜ялучщхужїўшїўўзЩдј>:CGNQPGH@MIHFPSQLMмжлжбЫЫехумтЪЯзяы—E0E]^[+xЪегучљчпчЩu•даЭсћЄN;MTLIWn`LLGLMPOSHFЧЧныцгаЪЧЦдпкззутЖJ?k^YY5cцћжнцЭРйЃ`>ENh’дўўАO?PQU\gdJBFEJQNPMHAдхтучбЫбдазнрпдЫЪО\87MHF2TЭ§ѓяшМ„]A5цустпйжнмнсыхющклўЮQ9;GG7H‹сэёл‚8GQJHGGEOCJdлФT;SWYNMF?FEN>PQE?Bыюэхдзчьёюстррнрѕўлw?4CBC5MЮјћСF0NQSGOELCLHM^]GH[[]^UPLIIGCLIE:9P~Ўm[QSQTSOAJA@9AHPNGѕѓяѓєїђяяїѕєюђчцэћлœOHHPM83qмэЯ>:prYNJ>F3,BrжўЂYGUTTQS:HIGEMMQNLџр?BIGMNJMQS^P[‰§ћјјљћњ§њ§љјјњјљљјјіњјћ§њ§њћљ§§љћљћљћћ§§њљїјљћљљрј<904E0A@JFN[H‚љћљљјјїѕѕїћћњћјљњњъ§њљћјћљ§љјљјњ§ћљјєјјљјјчљ§§љћ§§74*!+3;GHAASkљћћљљхјїњїјњљ§§њљјњљ§њљјњљ§њњ§љ§ўў§љў§ћћљѕ§§08ы4,>7@8L@L|јћєѕјћ§њ§§ћћ§љјћћўњ§њ§ўў§§њћјјљњўўЫ§њ§ў003542.)7UIPGOя§ўјљњјљјћљћћљћљ§њљњ§ўўњ§њ§њњ§ћљљћљљњћљ§њ§ўўрћўћ%**!0#&3>.MJAп§ћїїјјљњ§њ§ћћ§§ёљњ§љљћћ§њўњ§њ§љљѕ§ћњ§њћљїљћ§§чљј1-+ ;EGvŠnсћћјїћ§њ§§ћћўњїњњ§ћў§§ћјљїјћ§§њ§§ўњ§§хњћњјљћ§3;;7.!AILLgktмћћјћљљ§єњ§ўћћ§љљњ§§њњ§њјљњ§§њљћ§§§ћєїїщјњћћљ,*44."$+G@:?o…п§ћљљќћњўњњј§ћјїћћ§ўў§ћўњњ§љјљћњјљћћ§шњ§њ(+75.FPO4ONБћћњњ§ўўњ§ћ§ѓљћјљћљјљ§§ћњљљ§тћјљљ§њњ§415;:.*-#55(1>…§§ўњљћљљП§љљћњћљ§ў§јњњљћћљњїњћљњ§§ћљјљ§љћњ§ћљћћ5;<>1"$50,;NUExћ§ѓєїњњјјњћљљћљјњњћћњљћћљћ§ўўњ§§њќ§ћћўўщћў$5EE<37<@AINJ9[щ§ћїїѕѕќљѕјљљ§ќњ§њ§§ў§њўќ§њў§§ћл+-8>3!#.3PWB:AЦ§ўњјѕїїјћљ§њ§§њњћљјњ§§њћ§њ§ћљљњњљїјћ§§зњ§њ§њ§ў#03)#"*#4EG3L7ˆ§ћїљјїљ§§јїљјњ§§њ§§њњ§јљћљљ§ў§њјєїњ§ўўћћ§)2ю",)+-9:>H8w§§ўљљњ§§њђћљћњњћњ§ўћўў§ўўћћў§§ўўћњ§њћ§§сњљї1-!1&*,449FGFNNjћћѓєїјћњњјћњњњ§њћљ§ўўћњ§њњ§§њњћљћћ§§Ъ:57<@3304@EBF34CВў§їїњћћ§§ў§њ§јјњјњјњїјњјћљљјїњїљ§ћўў§§ўдћў§љј9A<@A33F>ACAMLN„ћўњїљћјњљћљљјїјѕјћљљїјјёїєљњ§њњ§ћўћўўћўў§щACA<4)$3:+:2;<7QДћ§њљћ§§њњћљњљ§§ћћў§њјј№ћ§§ћўўњњ§њўўћ§љ§§јњў182"+22ъ(3ACAC1xљ§§јјїјњњїјћ§§хњћњ§§јћћљјјћљљњў§ћјћљјјљћљ§§љњўћ74,22э>;0)7BHNFC[Ч§§їјљћњњїјћћ§§љ§§ўўјћ§§љћњћўў§§ћјјЭћљћћ§§ў§њљћ7712+02(1>BELQ]CLьљћѕѕєєѕѕњјћћљњћ§ћљћ§ў§§єњ§§њњћћ§§њњ§§ўф§јј8:@;>.#+,-EGV?0-Aлћћјјљјљљїћљ§љњў§њљљ§њ§єћљј§ўў§њ§љњ§§љу8:B@B,%&I0-:P-1•љћћљњ§§јћљћћљ§ћћљљћљљўћ§њ§њўўћрљ§љ§ўћћ§њ§ў§3<:3AP,0#.314)$?Љћ§§њ§эјњїїљѕїњћњјљ§§њљћ§ўў§ња§јћћљљњ§њњћ891&1!GC.H55LJ9’§§њјљљћљћ§ћјїљљїћљћћќљњ§ўўїњ§љїљљњљћћзљћјљјћ480BLGJMONQGzћ§їјљњћћјћћљјњњљћћюїјњ§§љ§§ўћ§§љћћњњ§§ўљ§§шћўћNFH4;5<:>37-29erGqћ§јјьєјјљ§§љѕїїњљ§ўў§§љћ§§ўњўўћўп7748&12:CE<:8;E?е§§њљ§§ў§§ћљ§њ§§цўћўћўў§њљњћљ§њ§§њ§њљћћјћћ§§ц2+:?+0.&01-:1C49Qœћ§јљњ§љљіњ§њ§ўў§§њўўўћўўњљњўћћ§§юњљњўњљ24;-HbP3)+:BJŸ§§љћћњњљ§§њю§ћљїїљ§ў§§јјћљ§ћ§њњр§ћўћ§§љ§њ3?8&*HE7@A@JVIHH;O„ћћ§љљ§јћ§§ўў§§ѓў§§љћћ§§њ§ўћњњЫ§ўў§њћњ§§њ§њў)?AGe8)!2YINS3Ctю§јјљ§њћљ§ўћњњ§њћ§њњ§§ќњ§§ўўє§ћљ§§њљњјћ§ўўфћ4>A;@8A91"1,5HIJ@A^шћљјїљћ§§ѓўћњ§§љљћћ§њјљљ§љў§њљ§ў§§шљ§њњ§њћњ58;3(793);EYH?GGіLа§§ћњћњћўў§њў§§ў§ўњ§§њ§Яћљћћ§§њљјљћ-$7559B>7(C53EF.48@+">G5Sˆћўѕјћњњ§љ§§ѕўњ§§њњўў§§ўўўћўў§њ§ўўсћўў§§-.G<;+4@J<8,I>nn^^NŽљћ§љљ§§ћњ§ўў§§њќ§њ§ўўў§ўўрћ§ћћљ§[4;:@>15:.!QSHIYMUYwЦћ§јјљљ§ћў§љћљљљ§ћўљ§§ўўєњћўћњўћў§њњ§§ўњ§§фO,?G< .&#@F;ZPGENSЛјўїљљњ§§ћіљћњ§њљћўў§§њўћўўћўў§ўњ§§хњ§•+@HA>0-*CA8-7:>E;Ёћ§љјјєњјћ§њ§ўњћїљўўў§љљўћ§§іњ§§њњ§њ§ћ§§ўжд;""!$-3080CG9@@NMEbѕ§ћљћјћјњјјћћ§љћљ§ћ§њњп§ћњњ§ћљћљњћћњњўћўћўўб94LJ2%*5.,7AAп<8L;aѕ§ўєљћћњњ§ћїїјћ§ўћўљ§§ўў§њ§§љњљљ§ўћўўпњ§Ѕ:&:>359<@FA??FIQ^;Qeц§§љјљћљљјјўљ§§ўўћўў§љўћљљ§њп§ћљњЫG5I;.+!.0BFFEWM;oь§ўїњњј§§№њўћў§§њћ§§ћљћћљћћўњ§§љќћњ§ћћр§ш}8?47@@JcYœћ§љ§§ћ§ћћљ§њ§§ўњ§§ў§§њ§ўўљњ§§њ§њ§§йЋG1.!%*$0#>@BA?8OiF{љ§їљљћљћљјњћћ§њћўў§§ћ§§њўў§ўўсN, %%"-,1;473:FE7nљћєєјљћњ§§љњ§њњ§љ§§ўћў§§њ§§§ўћўўсW>%".58303?L:Vю§њљ§ћљћ§§њњ§§љћўўє§њњ§§њњљљ§њ§§ўцA(-89AA:@54Yї§ў§§љћ§њјјћћ§љњ§§ќћљљњњ§Щћўў§њ§§њ§ћљѕћ57$ $<0SPE@C;BF[ђ§§љ§љ§њ§љћљћ§њљјїћ§§ћўљ§§§ћ§ўў§ањћ§§њ§+#* 2>GLF48Fс§ўљњћњ§§ўў§љ§§ћљћћ§§ќћўў§§љў§њћўћўў§х#"$  7"HEFGFeї§§њўўќћўњ§§љњўћўў§ўўўљ§§ћљћљћ§§љјћ)#хN95QFA70[р§ўњ§љљ§§ўњљ§ћћўљћћќљћ§ўў§њћўў§сњљQ\C3@BL?Eљўѓјњјјќљћњ§§ќљћ§њњіљїњњћљћљљћћїљћљњ§њ§§ўбCBEQVMOQMQ`Waўўњњћњ§ћ§ћћњњљњћћ§њњљњћћ§ћ§њћћ§§ћћіњ§ћ§ћћњћњћћрњB@;5E7FGFLUaHƒўўћћњњљљњњћњ§њ§ў§§єћ§ћћ§ћћ§ћ§ћ§§оњћњћњњћ§њњћ§ћћњ§ћ>B;1)4BBEA:Nm•ўўћћњ№љћћ§§ћњњћ§§ћњљћ§§іћўћў§ўћ§ћ§§њфћ§ћ§ћ§ћ+9?<:?:<:;I>N{ўўљљњњ§§ћћњћњћњњў§ќћ§ћ§§яћ§ћўћ§ћћњњћ§§ўўћ§§и5:;>:947;ZEVBQјўўњћљ§ћ§њћњћћњћ§§ћ§§ўў§ћ§§ћўњћћљћћ§ћў§ўўт2.)+--%#5C3QOBчўўљљњњћ§ћ§ћћњ§ћћў§ћћћњ§§ў§§ћ§§њ§§рњћњћњ§ћ§ћћњ::511%!&AIH}Žuтўўњћњ§§љћ§ўў§ў§§ўњ§ћ§ћ§њњћћњћћ§§ћ§љћ§§ћљњћћь7@A<512@?QFptwцўўћњћћљ§ћ§ћ§ћўўћќ§ћћ§§їћ§§ћ§§ћ§ћћ§§њћљљщњљњћћ&.9<7*#7CC09pŽьўўћћўњ§§ћј§ћњћћў§ўў§№ћ§ћ§ћћњљњћњћњћћ§§ы878>3(ITG5NTКўў§§ћўў§§ћ§њњя§ћ§ћћњ§ћњћњћ§ћћљћћї§ћ§ћћњћћ§§яћ939A8739&44-5>~ўўў§ћћшњљњћћўћњљљћњњћљћљњћ§ћ§њћћтњ§ћњћњњ??FG8-115<:TTIwўўѕљљњљњњћўњћћњњљњћ§ћњњћї§ўў§§ћ§ћ§§ўц§ў§ў§;@77@FLHC25EЗўўњљљћњ§ћўћ§ћњњљњљњљљњљ§њћћњњљњћћў§ў§§ћўўћы;:FI@:A<@IC>@SFMŒўўљћћ§њљћћњњљїњњћћњќљћћ§§ќћў§ўўг§ўў§ћ§ћ?CGC1-990:5>989SКўўљћњ§ћ§§ћћљћ§ћ§ћ§ћў§§њ§§ћўў§§ћ§ўў§щћ§ћ§ў59:?87>:0(4BH;B,ўўњьћњљљћњћћ§ћ§њ§ћ§§ћњћњњћ§њдћњњћњћ§ћ§§ўў45418>>8395CIFGG`Эўўљњћњљљњњћњ§ћћў§ўўњћ§ўћ§ўўў§њњћћњћћ§§мўњ208:;7837FFHMLhHPђўўјјљјјљњњћњў§њћћљўћ§ћ§ћ§§ќњћћ§§мћ§ћ§ћў§ўћ§њ;;CI?4513ME4-1C. &3;Q.8—ўўћћ§ћ§§њћћњћћїњћћњћћўў§§§ў§ўўќћўћўў§шћўћ1.3>?O-,2+22(0%@Ўўў§§§ћ§љљўјљљѕћ§§ћ§ћ§ћњћўўўћ§§ќћ§њћћ§мњ4245&3MI5P75PL?ўўњњћћњћњћћњљјјњћћњѕћ§ћў§ў§ў§§ћћбљћњћњћњњћ§њ:89?CB>?AC?>413-4?;<>5>Vўўњћ§§ћћ§ћўћ§§ў ў§ўљ§ћ§ћ§ў§§ућ*795IgPB0>BE@BITQE‚ўў§§ћњћ§ўўћђў§§ў§ћў§ўћ§њњ§§ўдћ§§ў§ў§§ћ§ћ1?;5@YmB5<@FHFG:IOЄўўћњњ§§ўћ§ћ§ћ§§ѕћњјљњћћўћ§њњћ§ўћ§§ућў§ўћ§ћ§§1>:0,[SABAIQJCGIAU‰ўўћш§ћћ§ћўћ§ћ§§ў§§ћћњ§ћ§ћўў§§§ћў§§гћ§§ћ§ћўў+>>A;BMe7-#9^LON9Hxёўњњћ§§ћћ§§ў§§ћ§њ§§љћ§ћ§ћ§ўўћв§ћ§ћљњћћў§ўў<9<;5?@@.1+4;INJBFeёў§њњћњ§ћ§§ў§§ћћўњ§§ћ§§ћ§§њўћўћ§ћћ§уњљ#*977??8*27>WFHBHFLйўўћљњ§ўўі§ўў§ў§ћ§§ўўћћ§ћ§ћ§§дћ§њћњћћ§§ћ§ћњ0&25>>9>;>AFGFHG4CMЪўўљћ§ћўњћћ§§њћ§ћ§§ўўќћ§ћ§§јћў§§ћ§ћ§§нћ§ћўћў§--9@::;?<;289!%8okb`S•ўўћћ§ћ§ћ§§ўќћ§ћ§§ў№§ў§§ўў§ўћћњћћa.>>ы;9:97#TVGN]NMW~бўўњњћћљ§ћўћћњћћїў§ўћ§§ў§ўўќ§ўў§§Ъћ§ћ§ћ§ћV*@HC%#AIA`VNCTOШўўњћћ§ћ§ћ§ћћњћњ§ћ§ўў§ўћ§ћўўј§ў§ў§§ћ§§тћ§ћ§ћœ.9F@F1*)2*GG><>BŸўўјњњќљњњ§§љњћћў§ўћћќњ§ћ§§ўћ§§уњ§ћ§§ў§к<+*7%037ACAA?GMWAcўўљћњ§њњљњњљ§ћћў§ў§§ўў§§іњћњћљћњ§§ўўум78OO;0037<5-#.>094?@BHJ49LC>qўўћћњћћ§§ћ§ћ§ћ§§ћќ§ћ§ўўЬ§ўћ§ћ§ћ§ўў§ў§\B%(#0737447?EQAZѕў§ћ§њћњ§ћћ§§ћћњўў§ўћ§§ћї§ћ§ћ§ћў§ўўщE31"" #!7?<>?;B:cўў§ћ§ћћ§њћќ§ћ§ћћ§ћћ§ўў§§мћ§ћњћ§њ781&8;UOEMIEAF`њўћћ§ћ§§§ўњћћЏ§ћњњћћ§ћћњћћ§ћўћў§ўћ§ћ§ў§ћ§ћ03)& 7B+HGL@AGцўўћ§њ§ћ§§ўћўћ§њћњћћ§ћ§ћ§ўў§§ћ§§ўч§ћ01+!1"OMNHTkўўќ§ў§ўў§ћћ§ћ§ўўўћўўг§ўћ§ћ§ћћњћњ§ћ§ћћњ..%%G>2]ыўў§§ћћњ§ў§ў§њњћњќћњћўўќ§ў§ўўч§ў§§ћ§ћ§ћ0,(O]HHыPE#Uцўўћ§ћћњћћњ§§ћўў§§Лћњћћњћћ§§ў§ўћћњ§ўў§§ћ§ћ*#$&0Q`WOQM27Зўўљњњљњљљњњћњћћњћ§§ў§§њњјў§ўў§њћњњў§ўўп§%#!1GIWTPUSpкўўљљњњљњљљњћњњћћњњљўћ§ћ§ћ§§ћњћћњћћс§ћ§ћ,%#%+AB;FLJTG;Tуўўљћћёњћњ§ћ§ћ§ћ§§ћњњћћв§ћ§ћњњћљћћ§ћ§ћ§ћ§ћ4-*$ -;@EFHFJJMQДўўњћњњё§ћћ§§ўўћ§ћ§ћ§ћўўе§њњћ§ўў§§ћ§ћћњ§ћ33)$#0+HCFCC@<@Ezўўњћћ§Лћ§§ћњћњњ§§ћ§њњљћћњћ§§ў§ўћ§ў§ћ§ў82%#-&$-;)08AIJOCIœўўњњљњњ§ћњ§§ћ§ћћ§ћљќњћњћћіњћћњћ§ћ§ћ§§пU^]hadbdeivtvЄўўњћћ§§ў§ў§ўњўњ§ћ§ћћў§№ў§§ћ§ћ§ћ§§ў§§ћў§§ћцUWJHSEW^\actY—ўў§§њћњ§њўћ§§§ў§ўў§ќћ§ћ§§№ў§§ћўћўћ§ћўћ§§ў§§эўIPFBHHS]V[MgЊўўћ§§цњўњўњћ§ў§ў§ћњ§§ў§ўћ§§ў§ў§ўўћ§ў§ў§§кў§ў§ў§ўAFMLCMNQYQd[]ўўљ§ћ§§ў§ўћ§ћ§§ў§§ўі§ў§ў§ў§ў§ўўј§ўћўћ§§ўўя§ўJPMNMIGENm[n[^ўўћ§ќћ§ћ§§ћў§ў§ўўњ§ў§ўћ§§їў§ўћўћў§ўўтGIL?8FE;B[BmaVяўў§њўћ§§ў§ўћ§§ўўј§ў§ўћў§ўў§§ў§ §ўў§§ыў§ў§ћVMLGCAF>V[[•Єƒэўўјћ§§ў§ў§ўўћ§ў§ў§§ћўўћћћў§ў§ўўћ§ў§ўћћэ§ћўMQMOABGUSd\{ˆŽёўў§јћ§§ў§ў§ўўќ§ў§ўўё§ў§ў§ў§ў§ў§ўћў§§чўњ§њћћ§ћ§GMHMG;:FW\AO‡Ђѕўў§ѓў§ў§ў§ўћ§ћ§ћўўк§ў§ў§ў§ў§§ћў§ўћ§ћў§ў§ўFGNOE:F0`maHciЪўўў§ўўћ§ў§ў§§ћў§ўћ§§јўћ§§ўћћ§§јў§ў§ўћћ§§эў§ўHQOYSH@I?TH@HNўў§§ћў§§ўў§§ќћ§§ўўћ§јўћћ§§ўў§§йўћўћ§§ў§ў§§LZSOHFAGJNOgh\Œўўљљњњћћўњ§ћ§§ўћ§§ћќ§ћў§§§ў§ўўј§ў§ў§ў§ўўхHT^cZGJOP\\iZMt§ўўњњљћћ§њћ§§ўќ§ў§ўўћ§ўў§ўўў§ўў§ыEIQeH4MG:OmqSMOеўўћћњњшўћ§§ў§ў§ўћ§§ў§ў§ў§ў§ў§ў§§ћЮў§ў§ў§ў§ў§ўAGFJL@JE;[agPcCўўњ§§ўћў§ўћ§§ў§ў§ў§ў§ў§§§ў§ўўє§ў§ў§ў§ўњў§ўўFё?;BFLJECLNV\^cj~Zbўўюљћљћљ§њћћ§§ў§ўћ§ћўўю§ў§ў§ў§§ћў§ў§ў§ў§ўўо§ћAOIWQLBFAQ\hpTLCSяўўћўњўћ§ћ§ћў§ўў§ђћ§§ў§ў§ў§ўћў§ўўл§ў§ў§ў§ўћў§§F@MVTW?GVB7FOeAFЇўўћ§§ў§§њћ§ћўћ§§ўћўўќ§ў§ўўќ§ў§ўў§ўы<8FQJpCJ9<:GE<@8SРўў§§ўў§§єў§ћњ§њ§њћћў§§ўў§§ўў§ўў§сћ§ћў§ўў§:@<8JA4-d^CaIFb`JЁўўњў§§ёўћћњ§њўћўћ§§ў§ўў§єћ§§ћ§§ћ§ћ§ћ§§FщNVSNTWj[iiherYўўћўћўћ§§єћўњ§ћ§§ў§ў§ўўў§ўўђ§ўћ§§ў§ў§ў§ў§ўўэNQTVYPQ\WSSQQN‹[‚ўўћўўћћїў§§њ§њў§ўў§§ў§§ўќ§ў§ў ўм$5FOTVALMZdYQIW`1Pтўўћ§ў§ў§ўћ§§ў§ў§ўўѕћ§§ў§ў§ў§ў§§ўў§§щў§ў(;GSSLOOFMJSOWTHPeБўў§§ў§§њћў§ў§ўўў§ў ўў§ўўњ§ў§ў§ўў§ф1AAGTzj\GNU`TY`jd\—ўў§ћ§ћ§§ўўќ§ў§ўў§§ў§ўўў§ўўц§ў§ў;HG?Mp‹SJTa^d\aMZbЖўў§§ўќ§ў§ўўј§ў§§њў§ўўњ§ўћ§§ўўў§ўў§ыў9B>87h^WOQVbcb[]Ym›ўўўћ§§ќћў§ўўњ§ў§§ў§§њћ§§ў§ўўќ§ў§ўўњ§ўћў§ўўь:HEEMYbN<2Sv[cgL[‹ўўјњ§§ўћ§§ўў§§ў§§їў§ў§ў§ў§ўўљћў§ў§ўћћўчCFHLGOWPIFIHP`agQWtљўўћў§§§ў§ўўї§ў§§ћ§§ў§§ћў§ў§ўўм§ўћў§ў§ў§ћ+9CCQNSOSNMWkcU[\]\сўўћћ§ўўќ§ў§ўўя§ў§ў§ў§ў§§ћ§ћў§ў§§ч?5>CFP[ZMSSd^U[ZEY`нўўњћ§§ћўћў§ўўќ§ў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ўўо;7@@HMLTZLMQL4@P[EgЉўўњћћў§ўћў§ў§ўўќ§ў§ўўў§ў ўў§ўўщ§ў92NFEMMW\VJLYJ‚‹{teЃўў§їў§ў§ў§ў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўцћ§§ўjAJFFGJMNJ2co^apagk˜сўўњћўћ§§ўўўћ§§ўћўўќ§ў§ў ўр§ў§ў§ў§ў§ў[$2IOT(55G-TbYrk^[gcЯўўіћ§§ў§ў§ўћ§§§ў§ўўў§ўўн§ў§ў§ў§ў§ўЁ2GPTWE9EQ][[\Vcƒ]Œўўћ§ћ§§ћћ§ћў§ўўј§ў§ў§ў§ў ўђZE")%0.8CJWPPљQMaYNˆўўъћ§ћў§ў§ў§ў§ў§ў§ў§ў§ў§ўўњ§ў§ў§ўўщoQ)()-<70AEQIHJPOWgOpўў§ќћ§§ўўћ§ў§§ўўў§ўўє§ў§§ћў§ў§ў§ўўщ`CG+-+-&*-,53JVWONVUFwўўц§ўћ§§ўћћ§ўћ§§ў§ўћ§§ў§ў§ў§ўўљ§ў§ў§ў§§Jы:)&&**.+SLtg^]^bUVqўў§ыў§ў§§ћў§§ћўћў§ўћўћў§ўўо§ў§ў§ў§ўMA>+#**#().HUB^`TONZјўў§§§ў§ўў§§ў§§јћў§ў§ў§ўўљ§ў§ў§§ўўч§ўBF7(+!##%#.C+;`]`[b~ў ўњ§ў§ў§ўўљ§ў§ў§ў§§уў§ў§§FEE9)"!&% (WMTtd]N?jёўў§њў§ў§ў§§§ћў§§ ўр§ў§ўў§AA8:,%(*$$"jtZTYaM,iѓўў§§ќћ§ћ§§ў§§ў§§ќћ§§ўўќћ§§ўўѕ§ў§ў9970!,э$1Gi{jn``:320)#!%;OTU\[\^bYcУўўћ§ўў§§ўњ§ў§ў§ўў§§ў§ўў§ўл§ўўFA70(2%9&19:F`V^YW\LNW…ўўћ§§ћў§ў§ўўј§ћў§ў§ў§§ћ§§ў§ўўл§ў§ў§ўJF+2-$595)3EP>AGWV^jU[Ћўў§ћћњћ§§љў§ў§ўћўў§ћї§ћ§§ўћ§ћ§§ўќ§ў§ў џ3 џ3 џ3 џўw1 џўw0 џ1 џ1 џ1 џўw/џ0џ0џўw.џ/џ/џ/џўw-џ.џ.џ.џўw,џ-џ-џ-џ-џ-џ-џ-џўw+џ,џ,џ,џ,џ,џ,џ,џ,џ,џ,џўˆ+џ-џ-џўw+џў€*џ+џ+џ+џ+џ+џўw)џ*џ*џ*џ*џ*џ*џ*џўw(џ)џ)џўˆ(џ*џўw(џ)џ)љќ§ўћўўњћў§њљўўє§њ§§њћ§њ§ћћ§§эњ§§њ§ћњљѕїњћјћњ§њњўўѕњћљ§§њ§њњў§§ўў§ћћљіћ§§љћљљ§§ўўѓ§ћњћљ§§њўћњ§ўў§ћћјћљћћўїњ§ў§њ§њјљљўњ§§љўћ§њ§њ§§ў§ѕћљ§њ§§љљјљўўўљјј§љ§њњ§§љ§§ћћѕњћјїїљћћљљњўўшјљјјћљњћўў§§ћјњљћљњ§љћљћћо§ћљљњњјћћјњљћћ§§ћљ§јј§љњњ§јњњїѕјћљљ§яћљћ§њљћњњјћј§ћћ§љљ§сћљјњћћљћћ§§љњўў§ћњљј§§њ§њљћљ§§ћћјљћ§њўўћўў§яћўўћњ§ўћћњ§њљ§§ћўўўћўўё§ћњ§њћњ§§љљ§§ћў ўњ§ћћљ§њћћ§§њћћќљјљ§§ўњ§§љљњљјњљћћљўњ§§ўњ§§ќљјћљљ§ћј§§љў§ћћўљћћ§ўљ§§ќњљљ§§ўњљљљјћњ§§љћћўљ§ §ѕўњњ§§њ§њўў§§јњ§љњјљј§§пў§њ§§њ§§њћљћљћћ§§ўњ§§ћљћјљљјјћћљ§§љ§єљїњјўў§ўћњњ§§њљћњ§§ўўј§њћћљћћ§§№ћљћњ§њљњјјћљљїњ§§ўнћў§ћўў§њ§§ћљјљћћ§њ§ўњњљљњљћ§§ћћ§§њўўјћўјћ§ћћўўћ§њўўњњќљћљјјќљ§ћўў§§љјјќљ§ћўў§ћяљјћ§њ§§љљјїјїћњњ§§ћњљњ§ћћќљћљћћў§ўўњћ§ў§§ћћўљјјїћљћћњ§§ў§§єћљњјјњјћ§њњ§§њћ§ўўћ§§ѕў§ћњ§ћћ§§љ§§ћ§їћљњјїњјј§§ќњ§§ў ўўњўў§ќў§њўўљ§§њћћћљњјћ§§ў§ўўћўў§§њ§ўўјћўћўћўњ§§љљ§§љћћ§§ћ§ћ§љўћ§§ћћљћљћћ§њњ§љћћ§§ђњ§ћћљ§ў§њњћљљћћўљ§§љћљљћљћњњќ§њњјј§њ§љљњћ§ўўћ§§іњ§ћњјјљїјњњёљћ§ў§§њљћћњњћ§љљў§њњўќ§њћјјўљ§§ѓњ§ћњњћњњ§§ўў§§ўњ§§ѕњ§њћљ§§ў§њ§§їјњјјљјћћ§§њњљљјљћћќњ§њ§§ўќњўћўў§єњўўћ§ћњљћњњўўўњўў§ћјњўў§§ћћўўўћўўњњ§љћћўў§љћњ§љїљћћ§њ§ўў§ћ§ўўњњ§ўћњўў§§ўњњєљ§љћњјїѕјњњјјќљћњ§§њњљћњ§ћўў§ђњ§ћў§§љјљљ§ўћўўћ§§њљљљњ§ћљњ§ўўўћўў§сћ§§ўў§јј§§ћћљћ§§ўњ§§њњўў§§ћћњњ§§ђњљћў§љ§њ§§њўћ§§ўъњ§љњўўњљљњљ§њ§§њћљјјљћћёљ§њјљћћљљњ§ћљћ§§ћя§њњљњњўў§ўў§ўћ§§ћћјѓћјњњјћљћћњ§§љљўњўў§њњљј§§ўўћ§ўњ§§ўњўў§ёљјљ§§ћ§§њ§ћћњћўўїњћљљўўћў§§њ§§њћўўћ§§њ§ћћљњ§§ћћњ§§љњ§ћљ§њўў§ѓћљ§ћћ§љћјїћљ§§ѕњїљ§њ§ћљљ§ўўќћњ§ћћќљ§њўўїћўўїїћљњўўђњ§њљљћљјјљ§њ§ўў§ўѕћў§ћљ§ўћўћўўіљћ§њњ§§јћ§§ўјљ§ћљћ§њ§§ў§њўћўў§ћїњ§§ўњ§ћјћћєњ§§љћћ§§љ§§ўўќ§њњ§§ћњљ§§ўўћ§ў§ўўўћ§§ўў§ћћјјљ§§њљј§§ўљћўўћ§§ўўљћ§њњ§њ§§јњ§§љћ§§ўў§ћ§ўћўў§њјћјћ§ўўўћўў§яњјћ§ўўњњћћљљ§§њљћћ§§њ§§ў§ћў§§ўўћћў§ўў§ўўњ§ўљ§§єњ§§ўў§§ћљћљўў№њљјјљњ§§њћћљ§ўћўўўћўўў§њњњљўћўћўўюњ§§њљ§њў§§ћ§§ћ§ћћ§§јљјјћ§§ћў ўў§ў ўњњ§§ћћ§§эљћћљћљљњ§ћјјњњјјћњўўѕћњњ§§јїњћљ§§§њ§ўўўњћћїљјјњ§ў§њљљ§ћ§ўћў§їћњјїѕјћјћћјњїљ§ў§њњћћњўў§§њќ§њ§ўўўњ§§ѕњћћ§ћњў§§ћ§§љћњјјљ§ўўє§ћјљ§ћљјїљњ§§ћў§ўў§јў§њ§ўўњ§§ўљ§§ђћљ§њ§§ў§§љћћљћћћњ§§љ§§ћыљћћў§§ћў§њ§ћљњ§§ўћўњ§§њћћ§њњ§§ѓњ§§ћ§њњўћўўњ§§ў§љњ§ўўњў§§њ§ўїњ§§њ§§ћћўў§ўћ§§ўњўў§§њ§§њњ§§њћ§§ўўћўўњ§ўў§њ§§іњ§ўўњ§њћћ§§њј§њў§њњљ§§љіњ§§ўў§§њћјјєљћћјњњ§њўњњ§§ќљћў§§љњ§њ§§њ§§ў§њ§їўћљ§§љњ§ўўћў§яњћљљњ§ћљћљљјћћ§§ўўїњљ§њ§ўўњ§§ўћўўћњћљњ§§ў§§љњ§§љћўћњ§њўў§ќћљњўўћћ§љљњњ§јћљћ§§ћў§§ўћ§§њљњњ§§ўў§ђћљњ§њћњ§ўћўњў§§юљћљћ§њ§љњљљћ§њ§§ћњњ§ѕњўћў§ћ§§љћ§§ћ§љўћўћњњ§§іћљ§§ћљ§њў§§ћљ§§њўўћћў§ўћўў§ўњў ўњћ§њњћўў§јў§ў§њ§ћ§§тўћўўћўў§ћњњїјјїјћ§§љћјњњћњњ§§ўў§ўѕћ§§ћљ§њ§§њўў§щљћњ§њў§ћћ§§њњ§ћћљљјјљљ§§ўљћ§§ў§§ўўїњўў§§ћћљ§§іњў§§ўўћћљњњќћ§њ§§ўњ§§њћў§§њ§§ўў§ўўњћ§њ§§ћћњёўћўњњљћљњїїјјћ§§њћ§§ў§ўўў§ўў§ћ§ўў§ќћ§њ§§јњћћ§ћ§ћ§§іћ§ћћљјјѕ§њњљ§ћ§§ў§ўўъ§ў§ћћ§ћ§ћ§§ўћ§ћ§ћ§§ў§ўў§ќњћњћћі§ћњћћ§ћў§ўўя§ў§ўћћљћћ§ћ§§ў§§ўўћ§ўћ§њњѕћњћњћў§ў§ў§§ћыўћ§ћ§ћ§§ўћ§ћ§ћ§ћ§ћў§ўў§ћњњћћ§§ћћ§њћўўўћњњўћ§§ѓў§ћ§ћћњњ§§њњљљћў§ўўў§ўў§њјњњ§ћ§ўўн§ћћњљћњћ§ћћњћњћњ§њћћњљњњћњљћћњ§ћњћ§§ўћ§§ўћљљњћю§њћњ§§ћњњљњњ§ћўў§ћћў§ћћьњљњњћњњ§ћў§ўў§њњћ§ћ§§њўњћћ§њњћћњћ§ўўї§ўћ§ћ§ћ§ўў§§ћўў§ћў§ўўў§ўўћ§ўћћ§§їў§§ћў§§ћўўў§ўў§ћ§њўћњњ§њћо§ћ§ћ§ћ§ћ§ћў§ћњљћћњњћћ§§ћ§ћ§§ћ§ћ§њћћїњ§ћ§ћ§ћ§ћћњ§њћњћњњј§ћўћ§ћ§ћћњ§ћ§ћ§ћћљњў§§ћћњњћё§ћ§ћ§ћ§ћ§ћў§§ћ§§ќў§§ћћ№§ћ§ћ§ћ§ћћљњјњ§ћ§§яћ§ћ§§њћњћњњћћў§§ћћўњћћњњћњћћ§ћћљ§ћћљ§ў§§ёў§§ћ§ћ§ћћњ§ћ§§ўўчћ§њњћћњ§ћ§њћњ§ћ§ћљњ§њћћў§§њћ§ћў§ўўоћў§ўћ§ћћњћ§ћњћћ§ћў§§ћћ§ћњ§§ўў§ћ§§ўўњў§ўўљ§ўћ§ўў§§ќћњћњњћ§ў§ўўъ§ћ§§њћ§ўў§ўћ§ћ§ўўћћ§њ§§ћѕњћњћћ§§ћ§ћ§§ќў§§њњћьњћћњћћў§ў§§ћўћ§ћњћћњњєћњћ§§ћўћ§ћ§ћћљљњњљњњ§§ќћ§ћ§§ўћўўєћ§ћў§њ§ћњњ§ћћј§ћћњћћ§ћћїљњћљњњ§ћ§§ўћў ўї§ў§ўў§ўћ§§ьў§ў§ћћ§§ћњћћљњћћ§ћў§§њћ§ћ§§ўўј§ў§§ћ§ћ§§јў§ў§ў§ў§§ћ№§ћњњћћ§њњћ§њњћ§ћћ§њ§ћћј§њћњћћњћћ§ћхњ§ћ§ћ§ћћњћћўћ§§ћјјњћњћћ§ћ§ћћќњћњ§§јћ§љњњћ§ћћ§ўђ§ћ§ћ§ћћљїїјљњљљ§ћњ§§ѓћ§ћњњ§§ўћўћћ§§ў§ћ§њњњћ§ћ§ћ§§књљљћ§§ћ§§ўћ§ћћ§§ћ§ћ§ћ§њћ§ћўћ§ћ§ћ§љњњћњњђ§ћ§§ћћ§ћћњћњћ§§јћ§ћ§§ў§ўўўћ§§ўјћў§ћњ§§ўўў§ўўђћ§ћ§ћћњћ§ўў§ћўў§§ў§§ўѓћ§њ§ћћљјњћњњ§§ўљћў§ў§ў§§ўў§ўў§ўў§§ќўћћњњљќњљљњњњћњ§§ћ§§ъћњ§§ўў§ўћ§ћ§ћ§ћўў§§ћ§ћћў§ћ§§њћ§§ў§§ўћћњ§њ§ћў§§ыћ§ћњћњ§ћў§ћћ§§ў§§ћћњ§§ќћ§§ўўћж§ћ§§ўў§ћ§§ў§§ў§ўўљћћ§ўћ§ћ§§ћћњњћњћњћћ§§ћњћћ§ъњћњ§ћ§ћ§ћ§ћћњњћ§§ћ§§ў§§єўћўў§ћњњћњ§њњє§љљ§ћћњњ§ћ§ћћ§ђў§ўћ§ћ§ћ§ћњ§ћўўўћ§§ќћ§§ўў§ћ§ћћљ§њћћ§ћўўњ§ў§ў§ћћљў§ўў§ћ§§јћ§ћ§ўў§ўўя§ћ§ћћњћ§§ћўў§ћ§ћ§§ѓњћћ§§ў§ўўћ§њћћ№њ§ћњњћњћћ§ћ§§ўћ§§њњћћ§§ўўє§ћњћњћћ§ўў§ўўћ§ў§ўўѕ§ћ§ћћњћњњћ§§§ў§ўўњ§ўћ§§ўўіћњћ§ўў§ў§ўў§ћњ§§§ћ§ћћ§§ћўўћ§њћњ§§јћ§§ў§§ћ§§ўђћ§ћ§ћўў§ћћў§§њњыћњћ§§ћћњњћ§ћ§ћў§ў§ўћ§§іћ§§ўћћўў§ўў§ёў§ўњћ§ћ§§ў§ў§§њњёћњњћ§ћ§ћ§ћ§ћ§ћўўі§ў§ўў§ћў§ўўћ§ўў§ўўњ§ў§ўў§§њћ§ћ§ћ§§ћќњ§ћўўіћ§ћ§ўў§ў§ўў§ўњћћўў§ў ў§љћ§ћ§ћ§ћћўў§§њћј§ћ§ћњћњ§§ќћ§§ўўќћ§ћўўњћ§ћ§§ўў§ћў§§ьў§§ћ§ћ§ћ§§ћ§§ўћ§њћњўўё§ћњњћ§§ћ§њћў§§ўўў§ўўї§ў§ў§ўўћ§§ўс§ў§§ћ§ўћ§ў§§њ§ћўћћњ§ћ§ћ§ћњњћћ§ўўў§ўўў§ўўў§ўўђ§ў§§ћ§њћћ§ћћњћћ§њљњѕ§ў§ў§ў§§ћ§њњћ§§ћ§§ўѓ§ћњњћњњ§ћўћ§ћћћ§ћћњ§§§ў§ўўљ§ўћ§ћљњњћ§њћњњћ§ўћ§§јњ§§ўћ§ћ§§ќћ§ћўў§дћ§ћ§ћ§ўўћњ§ў§ћњћ§ћ§ћћљњњћћў§ў§ў§§њњћ§њћњћћ§ћћр§њћћў§ўћ§§ћўћ§ћўў§ћ§ћ§ћ§ћ§њћћ§ћ§§ћњцћњњћ§§ћўћ§ћ§ћћњћњњўћ§ўўћ§ћћё§ћ§§ў§§ћ§ћ§§ћћ§§јћ§ћ§ћ§њ§§ўя§ў§§ћ§ўў§ћ§ћ§ћ§ћ§§їў§ўћ§ћ§ћ§§іћ§ћ§§ў§§ћ§§ўћўўн§ў§§ћ§§ћ§ћ§ћўћ§ћ§§ў§ўћ§ћ§ћ§ћ§§ўћ§ћўўќ§ў§ўўќћўў§§ёћ§§ћў§§ћ§њћћ§ћ§§ъўћ§§ўћ§ћ§ћ§ћў§ћћў§§ћ§њњќћњњ§§ёў§§ћ§ћ§ўў§§ћ§ћ§§юћ§ћ§ћ§ћ§§ў§§ћ§ћ§ћ§§єћ§ћ§ћўћћ§ћћ§§§ў§ўўы§ўў§ћ§ћ§ћ§ћ§њћћ§ћњћњћћњ§§ћўўєљћ§§ћ§ў§§ћћўў§эњћ§§ћ§§ўћ§ў§ћ§ћў§ў§§ўї§ўћ§ћўћ§ўўћ§шћ§њћњ§ћў§§ћ§ћўћ§ћћ§§ћ§§ўўѕћ§њћ§ћ§њ§ћўўі§ўћ§ћћњћњ§§њћљћћњ§§ћ§ћў§ўўћ№§ћњ§ћ§ћћњњћ§ћ§§ўў§ыћ§ћ§њћћ§њўћ§ў§ћ§ћ§ћ§њњћў§ўўў§ўўўћўўђ§ў§§ћ§§ў§ў§ў§ўў§њћ§§ў§ўўя§ўћ§ћўћўћ§§њ§ћ§ћўўў§ўўћћњљљњњыћњћћ§ћњњљљћ§§ћ§§ў§§ћўўћћ§њћ§§ъћ§§ў§§ћ§ћ§ћћњ§ћ§ў§њћћ§§ћъњћћњњћћ§ћ§ћў§ў§ўћ§ўћ§ўўъ§ўћћњњћ§ћ§ћ§§ўћ§§ўњћћ§§ўњ§§цћ§ћ§ћ§ћ§ћ§§ћў§§ћ§ћ§ћў§§ўў§§ћ§њћ§§ў§ќћњћљљњћ§§ћ§§ўћ§ў§ў§§цў§§ћў§ў§ў§ў§ў§ўћћњљј§ўћ§§ў ўњћ§§ў§ўўњ§ў§ў§ўў§ўћ§§§ћў§§ ўћ§љў§ўў§§ў ўќ§ўћ§§ќћ§ћўў§§ў§§ўў§§ў§ћў§ў§ўўњ§ў§ў§ўўђ§ўў§ћўў§ўћ§ћ§ўўч§ћўњ§§ў§ў§ў§ў§ўћў§ўў§ћњњ§§ќћ§ћўўћћ§ћў§§ўњ§ўћўћ§§љў§§ћ§ћ§§ћњћћ§ћћњ§ћ§§ў§§ђў§ўћћњ§ћ§ћў§ў§§їўћ§њўћ§§ўў§јўћ§ћћ§ў§§§ў§ўў§ѓњ§ћў§ў§ў§ў§ў§§§ў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ў ўќћў§ўўў§ўўў§ў ўє§ў§ўћ§§ў§§ћ§§ћў§§ћ§§§ў§ўўў§ўўщ§ћћ§ћ§§ўћў§ў§ўў§ў§ў§§ћ§§њў§ў§ў§§ўћ§§ўн§ў§§ћў§ў§ў§§ћ§ћўў§ўћў§ўћў§ў§ў§ў§ў§ўўњ§ў§ў§ўўў§ўўы§ў§ў§ў§ўћўћ§ћ§ў§ў§ў§ўў§§ў§§ўї§ўћ§§ў§ўћћ§іў§ў§§ћў§§ћћўў§ўўє§ў§ў§ўћ§§ў§ўў§ћћ§§ў§§јў§ў§ўћў§§њў§§ў§ў ўњ§ўў§ћ§§ќћў§ўўњ§ў§ўћ§§ўќ§ў§ўўќњ§§ўўў§ўўі§ўћ§§ћњћ§ўў§ќћў§ўўј§ў§ўўћў§§љў§ўћўњћћњў§ў§ў§§ќў§ў§§ўћ§§ќћ§ћўўў§ўўњ§ћ§ћ§ћћ§ќћў§ўўї§ў§ўћ§ћўћћ§ўќ§ў§ўўш§ўў§ў§ў§ў§ў§ў§ўћ§ўў§ўћ§ћћјњћ§ў§ў§ўўќ§ў§ўў§ѕўћ§ћ§ћўћў§ўў§ћў§ў§ўўї§ў§ў§§ў§ўў§ќўћў§§ў§ўў§§ћў§ўў§§ў§љћ§§ћ§ћўў§єћ§§ў§ў§ўћ§§ўўю§ўћњњ§ћ§ћ§§ў§ўћўћ§§јў§ўўћўћўў§ћў§§§ў§ўўѓ§ў§ў§ўћћљљњ§ћћ§ќў§ў§§ўљ§ћ§§ў§ўў§ѓћўћ§§ў§ў§ў§§ћћћў§ў§ўўў§ўўљ§ў§ў§ў§§ўњ§ў§ў§ћћ§§ћ§§ќў§ў§§ђћ§ћ§ћў§ў§ў§ў§ўў§ў§ ўј§ў§ўћ§ћўўў§ў ў§ў§ѕўћ§њ§ћ§§ў§ў ўў§ў ўћ§ўў§ўўї§ўћ§њўњ§ћћ§њў§ў§ў§§§ў§ўўњ§ў§ў§ўў§ўљ§ўћ§ћў§§§ў§ў ў§ў§ќў§ћ§§ўў§ўўє§ўћ§§ў§ў§ў§ўўњћў§ў§ўўќ§ў§ўўо§ў§ўўћўћў§ў§ў§ўћўћў§ўћ§ћўў§ћ§ћ§§ў§§№ў§ў§ў§ўћ§§ў§ў§§ўўў§ўў№§ў§§ћ§§ўћў§ћћ§ћ§§ўў§§§ў§ўўї§ў§ў§§ћ§ў ўњ§ў§ў§ўўє§ўћў§ў§§ўў§ў ўќћ§§ўўі§ў§ў§ў§ў§ўўі§ў§ўћўћў§ўўє§ў§ў§ў§§ћў§ўў§ћћўћў§§іўћ§§ў§ў§ў§§ўў§§§ў§ўўљ§ћ§§ў§ўўћ§ў§ўўђ§ў§§ћ§§ўћ§§ў§ўўў§ўў§ў§їў§ў§ўћў§ўў§ћў§ў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўў§№ћ§ћ§ћў§ўћў§ў§ў§ўўњ§ў§ў§ў ўў§ўўњ§ў§ў§ўў§ђћ§ћ§§ў§§ћў§ў§ўўў§ўўў§ўўє§ў§ў§ў§ўћ§§ўўќ§ў§ў ў§§ўћўўњ§ў§ў§ўўўћўў§§ў§§єў§§ўћ§§ў§ў§ўўў§ўўќ§ў§ў ў§§ў§§њў§§ў§ўў§ќћ§§ўў§єћў§ў§ў§§ћў§ўўў§ўўќ§ў§ўў§ўђћ§§ў§ў§§ћўћў§ў ўў§ў ўђ§ў§§ћў§ў§§ћ§ћ§§ўўћћў§ўўё§ў§ћўњўћў§ў§ў§ўўўћ§§ћў§ўў§§ў§§§ўћ§§ўя§ћћњўњћћўћ§ћўћўћўў§§ў§§ўј§ў§ў§ў§ўўј§ў§ў§ў§ўў§ёў§ў§ў§ў§ўћўћћ§ўўќ§ўћ§§ћ§ў§ўћўў§ўћ§ў§ў§§ўў§§іў§ў§ў§ўћў§§ћўћў§ўўњ§ў§ўћ§§ўў§ўўј§ўћ§§ў§ўўя§ў§ў§ўћў§ў§ў§ў§ў§§§ў§ўўя§ў§ўў§ў§ў§ў§ў§ў§ўўє§ў§ў§ў§ў§ў§ўўњ§ў§ў§ўўї§ў§§ў§ў§ўўќ§ў§ўўј§ў§ў§ў§ўўў§ў ўљ§ў§ў§§ўўє§ў§§ћў§ў§ў§ўўі§ў§ў§ў§ў§ўўј§ў§§ћўћ§§єў§§ўў§§ў§ў§ўўю§ў§ў§ў§ў§ў§ў§ў§ў§ўўщ§ў§ў§ў§ў§ў§ў§ўўћ§§ў§ў§ўўё§ў§ў§ў§ўў§ћў§ў§§љў§ў§ў§ўўќћ§§ўўў§ўў§ћў§ў§ўўњ§ў§ў§ўўў§ўўћ§ўў§ўўєћ§§ў§ў§§ћ§§ўўќ§ў§ўўј§ў§ў§ў§ўў§ќў§§ўўш§ўћ§ћ§§ў§ўћ§ћ§§ў§ўћў§ў§ўў§ћў§§ѕў§ўћ§§ў§ў§ўў§§ў§§§ў§ўўї§ў§ў§ў§ў§§њћ§ћў§ў ўќ§ў§ў ўќ§ў§ўўў§ўў§§ў§ўўѕ§ћћўћўћўћў§§ћћў§ў§ўўў§ўў§ћў§ў§ўўъ§ў§ў§ўћ§§ў§ў§§ћў§ў§ўћ§§ћ§§ў§ўўћ§ўў§ўў§љў§ў§ў§ўўх§ўў§ћ§ўў§ўў§§ў§ў§ў§ў§ў§ў§§ўўњ§ў§ў§ўўў§ўўє§ў§ў§ўћ§ћў§ўў§єўћ§њћћ§ўў§ў§ Рћў§§њ§§ў§ћў§§ўє§њњ§њ§§њўўћўўћўјњ§ћўћњћўўњї§њ§§њљћљўў§§ўћўў§њў§§љћ§§§њў§§ўўћўўўћўўћў§іњћћ§њњ§§њўўћяўћ§ћ§§ћћ§§њ§§ўћћ§§ўћўўћўў§ў§њћўў§њћ§ћћ§ўў§ћњ§§ќћљљ§§љњ§§њћћўўўћ§§ўќћўћўўњ§њ§њћўўўћўў§§њўўтћњ§§ћњ§§ћ§§њ§њ§§ћћўћћњљњћњ§ўњ§§ќћљ§ўў§њљўўњ§ўћў ў§јћўўњ§§ћ§§ўњ§ћўћў§§ўњњћњјљ§§ўќћўћўўў§ўўћўўћўўњў§ўў§§њ§§ў§њљ§§љћўўћўўћўўћ ўќ§ћћ§§ўљњ§њ§њ§ћћўњћўўћћўўљ§љћ§§ћў ў§§њ§§ќћїљћћї§ўў§њўћў§§јљ§§ћћўћўўј§њћ§љ§§ўўўћўў§їљјљњўћ§њўўя§ћњїїњњјјњїїњ§§ћњњї§ћћјѕћ§§ўўўћўў§§њўўњћ§њ§њ§§ўњ§§ќњ§ў§§ћљјњјњљњ§§ўјњњў§ў ўќ§ћ§ўў§њ§ўњўўўњўўўћўўў§ћћўјїїњ§ћњ§ћћјјњћўў§ўўѓћ§ћјњћћљ§ўўћў ўўњўў§ћњўљљјћ§§ўіљћћ§ўўћ§§ўў§§њ§§ўў§§ўћ§§њў§ўў§ў§ўћўўћўјћўў§љћњ§§ьћўћўњ§§ћ§§ўћўў§њ§њњўўњ§ћј§ў§§ўћћњ§§ўў§їњљљћћљћћўўќ§ўў§§ѕћ§ћўўљ§љћ§ў ўъ§љљћћљљњњ§§ўўћћ§њ§ћћњјјњіћ§ўўљ§ћњњўўјњ§ўћў§њ§§ўўћўўї§љћўў§ўћўўќ§њ§ўў§ўь§љћћїњљ§§ўўћўў§§ўћў§§§ћњўў§ћњ§§№ўћћўћўњљљћїјљјїљљўћњњўћўўљњ§§ўўћўўј§ћљњњ§§ўў§іњўўњљљ§§ћўўћ§ўњ§§єћљљћ§њњћњїљ§§ђљ§§ћњўўћўў§ћћ§§ўў§ўўјћўўњ§њњўўћћўўњўўўњўўђћўў§§љћ§§њћњљ§§ўљ§§ўљћўўћ§ћўўј§њљ§§ћ§ўўљћўў§ўћўўћћўўћўў§ўњ§§ўњўўї§љљ§§љ§§ўўњњљљј§ўў§ћў§ўўіћўўћў§њљљўў§њ§ўћ§§ў§ў§њў§ўўўћўўўћўў§§ўћўўљ§ўўћ§§ўўћћўўћўўњ§ћњјљ§§№њ§§љљ§њњ§ћћњ§§њўў§ўў§§јњ§§њ§§ў§§ўўњ§§ўњќўњћјјэћјјљњњ§ў§њ§ўњљљћћњўў§іћљћ§ћљћљћ§§ў§ўќ§њљ§§§њ§ўў§ў§§њўўі§њ§§ўўћћњўў§ћ§эўћ§§ћћљ§њў§њ§§њљћљ§§љњ§ўў§ћћ§ ўў§ўўўћўўћ§њ§§ўў§§њ§§ўњ§§њ§ўўћ§§ќљћћ§§ћњ§њ§ўўїћўўњ§љ§њ§§ўўћњњ§ћў§ўў§ў§љў§њ§§њ§§њњ§§њњ§§ћў§ўўћўў§§ўћћўїњўў§ћ§§ћўўїњ§јљљ§ўў§§ўљћћ§іћўўњћћўўћў ўќћўўћћіў§њћ§њ§ћљћћѕ§њ§ћўћў§ћћ§§јљјњћћљњ§§ќўћћўў§цњћ§§њўћўў§§њ§ћљћ§§љћ§ћјјљћћ§њљўўћў§§ўћ§§ўќћўћўўы§ћњ§ћћјљ§§ћћ§њћўљ§§њ§§їћ§њћћљ§§ћћњјћћ§§ўў§§њћўўўњ§§љњ§њћћ§ўў§њў§ћў§§ў§ћљњјјћћ§ћў§§ћўў§ђњ§љњњћ§њўў§ћћ§§їњ§љљ§ћўў§§ћћ§§њ§§§љћњњѓјћљћјјїїћћњћ§§ўњўўўћ§§ѓў§љњјјљћљјјљћћ§ўў§§їћљ§§ўћўњ§§ћњћћјћћ§ћѓљћњћћњћ§§ћћљћћ§љњћфњјњ§ў§§њ§њњћјјћ§§њ§ўўњћћљј§ўў§њ§ўўх§њњ§ћјљњ§њљ§љјљїїњјјљ§§њјњ§§ўћ§§њў§ѓњ§§њ§њњћ§њ§љ§§ўњ§§§љњ§§§њ§ўў§ћюљћ§§ўўћўўњ§ўў§ћљ§ўўњ§ўњ§§њќ§њљћћєјїћљ§њ§ћљњјїїљў§ўў§§ўћўўўћўў§њћўў§§ћћъљјјљћ§§ћїњћ§§љљћ§њћўў§§ѕљћ§§љћћљ§§ўўўћ§§юњ§ўћћўњ§§ў§љјўўћў§§јљћњњљћљ§§ўѕњ§ўњњћўўњћўўћњљљ§ўў§њ§ћћў§ўў§ў§їњ§§ћјћћ§ўў§ўўћўўўћўўќњљћ§§ўўњ§§ўі§љљјљњ§њў§§ћ§ёўћў§њ§љћњјїїћљ§§§ўћўўўћўў§љ§ўўј§њ§ћўўњ§§њћљ§ћљ§§ќўјћ§§ўљ§§ћјњїєяѓїїћћўљћћўњ§§ќњ§њ§§іћљћ§њ§њћљ§§ўј§ћљћћјјљљћђљћњ§§ћ§ћљєјњћ§§ћ§ќћ§§ўўљћ§§њ§ў§§ћыјћљ§њў§ўўћ§њ§њћћњћћљћћ§єћњњћљјњљјћњ§§ ўўћ§§њќћ§ў§§ўњ§ў§§љћћњљјљєњћћіјљћљћљњљ§ўў§ўј§ћћњ§§њўў§љј§њћўў§њўўц§њ§ўњњ§ћњњїѓјћ§§љј§§љ§њўњўўъ§ћљ§§ўћўў§§њ§§ўћ§§њўў§§ћўњћњ§§ъњ§§њљћњїћћљљ§њ§њњ§ўћ§ўўњ§ћљћњ§§ўђћ§њ§§ўў§љјљљњ§§њє§њ§њ§ћјј§љњћћїјћљ§ўњ§§ўў§њ§§јћ§§§њљћћјљћљљ§ћў§§ђћљјїњњјњћћ§њњћћ§ўћ§§јћ§ћ§ћ§§ўў§њћ§ћўў§§њћ§ћ§§ўўќ§ў§ўў§іћў§ў§ў§ў§ўў§§ћ§ћћўјћ§ћ§ўў§ўў§ўћ§§ћіњ§ћ§§ўћ§ћўўў§ў ўњ§ў§ў§ўўњћ§§њњ§§ќћ§§ўўы§њ§ћћњ§ћ§ћ§§ўў§ћ§ћ§§ўўў§ўўќ§ў§ўў§ўћў ўј§ў§ўћ§ћ§§юњћћў§ў§ў§§ћ§њћћ§ћ§§§ћ§ўўў§ўўњћ§ћ§ћўўў§ўў§ўў§ўў§ўн§ћ§њ§ћ§њ§ћ§ћ§ћ§ўў§ўў§ћљњ§ћў§§ћ§њћћўўў§ўў§§ћ§ўўў§ўўы§ўћ§ўў§§ћ§њ§ћ§ўў§ў§§ўўќћ§ћўўі§њљњћ§ћ§ћўўћћ§ў§ўўў§ўўў§ўўћ§ћў§ўў§№ћ§ћћўўћ§ћћў§ћћњўўў§ўўў§ўўќ§ў§ўўљ§њњћ§ћўў§њ§ў§ў ўі§ў§ўћћњ§§ўўў§ўў§њћ§њњћњњ§ћў§§ўћљ§ћ§ћћњў ўђ§ў§ў§ўћљњ§ћ§ћўўѓ§ўћ§ћњћ§ўў§§ўўјћњљћћљљњњљћ§ћћљ§§њјћ§њћћў§ўўќћў§ўўћћ§ћ§ћћѕ§ћ§ћ§§ћћ§ћ§§љћ§ћћњћњњљљћ§ћ§ћ§§ўћў ўє§ћњ§ўў§ўў§ћ§§ќћ§§ўўў§ўўѕ§ў§ўћњњћњ§љљ§ћћ§ћћњњљњў§ћў§ў§ўўѓ§њњљћњћћў§ў§ўўў§ўў§јў§ў§§ћ§њњўўћћѕ§ћ§ўў§ћњћћўўћћ§§ў§§№ћ§ћўћ§ћ§ћ§ћўћ§ћ§§ќћў§ўўђ§ўћ§ћў§ўћ§њў§ў ўћљњ§ћ§ћ§ўў§кћњћ§ўў§ўћ§ћ§§ў§ўў§њ§ћўћ§ћ§ћ§ћ§ћў§ў§§ћўўќћ§§ћћњњћњў§ўўюћўў§ћ§њ§ўў§ўћћњ§§ўўў§ўўў§ўўѓ§ћћњњћћ§§ћ§§ўўјћ§ћћњ§§њњњљњљњћўўіћњ§ў§ў§§ћўўјћ§ћ§ћў§ўўў§ўўќ§ўћўў§ўћ§ўўћ§§яў§§ћў§§ћћњћљћћ§§ўў§§ћўўњћ§ћњ§ўўў§ћћќ§ћ§ўўќ§ћћњњќћњњћћњњљљњњўў§ыћў§ў§ўў§њћ§§ћ§§ў§§ћ§ўўў§ћћў§ўўў§ўў§њћ§ћ§њћћ§ёћљљј§ћ§ћ§ћњ§ў§ўўћіњћћ§§ўћў§ўў§ќћ§§ўўў§ўўў§ўўў§ўўћ§ўћ§ћћ§ѓћ§ўћ§ћ§ў§ћ§§ўўю§ўў§ўў§ўћ§ў§ћњћў§ўўњ§ћ§ў§ўўў§ўўќ§ў§ўў§ёћ§ћ§ћ§ћ§ћ§§ў§ўћћћўћ§§ўў§ћ§§ў§ўўј§ўћ§ўўћўўў§ўўєћ§§ў§ў§ў§ўћ§§ћўћ§ћўўјћ§§ў§§ћ§§ўћўўў§ўўў§ўўў§ўўќ§ў§ўўі§ў§§ћ§ћ§ћўўўћўўќћ§§ўўќ§ў§ўўі§ўћћљњћ§ћ§§ќћўў§§јћњњ§ћ§§ўўр§ўћ§ћўћ§ћ§ћ§§ћћўћ§ћў§ў§ў§§ћ§ћ§§ўў§§ў§њњш§њћ§§ћўћ§ћў§ћћњњ§§ў§§ћњћћўњћћќ§ћ§ўўѕ§ћў§ўћ§ћ§ћ§§ўў§ўўљ§ўћ§ћў§§ќў§ў§§ќћў§ўўї§ў§ўў§ћћњњћўљ§ћћњћћ§§ћћ§ћњћћї§ћћ§§ћ§§ўўўћњњјћ§§ў§ў§ўўќ§ўћўўќ§ўў§§љћў§ў§ў§§ўћ§§њћ§ћ§ћ§§њћ§§ў§ўўў§ћћњћ§ў§ўћ§§§ћ§ўўќ§ўў§§єћњњ§§ў§§ћ§§ўўюћ§ћўћ§ћ§§ћћ§ћ§ћ§ћ§§ќћ§ћўўў§ўўњћ§ћ§ћўўњ§ў§ўћўў§ўћў§ўў§§ћ§ћћўэ§ћ§ћћњћњ§ћ§ћ§ћ§ћў§ўўў§ўўў§ўўў§ў ў§ќњћ§ћћхњћћ§ћў§ўўћњњћ§ћ§ћњљћњћ§§ћ§ћћў§ўўў§ўўіћ§ћ§њ§ћ§§ўўћ§їњћњ§ћћњ§њњѕћњћњњћ§ћў§ўў№ћ§ћ§њћћ§ћ§ћ§ћ§§ўўљ§ўћў§§њњћњ§њњћ§ўўі§ћ§ћ§ћ§ћ§ћћљ§њњў§ћњњћћњ§ћўўќћ§ћўўш§ўў§ћ§ћ§ћ§ћ§ћ§њћћў§ўў§ћ§§ўќћ§§ўўљћ§ћ§ћљњњљћњњћ§ћ§§ўћўў§ыћ§ћћљљњ§§ў§§њћћ§ћ§ћ§ћћь§ўў§§ћ§ћ§ћњћ§§ћћ§ўњљљњўћњњўћњњљ§њ§ћ§§ўўщћ§ћўћћљњњћњћњњћћњћњ§ћ§ћћѕ§ћўћ§ћњћ§ћўў§ћћ§§ћњњѕћњћћ§ћ§ћњњћћн§ћњ§ў§ћњњћњћњ§ћ§ћћљњњћљњљ§ў§ћ§ћ§§ћњњѓ§ћ§ћў§§њћћ§ћўў§§ћўўўћ§§ќњ§ћ§§фў§ћњјљњљњњћ§ћ§ћ§ћ§ћ§ћўћ§ћ§§ўўўћ§§їћ§ћ§§ћћ§ћћх§ћћ§§ћ§ћ§ћ§ћ§ћ§ћў§ў§ў§§ћ§њћћў§ўў§ѕћў§§њћћў§ў§§јћ§ћ§ћ§ћ§§ўћњњћў§ћћ§љњљљќјћћўў§јћ§ћ§ћ§§ўўў§ўўя§ўў§ћў§ўћћњћњћњњћћњ§њћљњћћјњ§§ў§ўћ§§ћё§ўћњћћ§ўў§ўў§ћ§§ў§нћўћћњў§ў§§ћ§ћћњљљћњћћ§ћ§ћ§ћў§§ћў§§ўўћ§ўў§ћћў§чњћњ§§ў§§ћ§ўў§§ћ§ћ§ћ§ћ§ћ§њњћўљ§ћ§§ў§ўўч§ў§ћњ§ћ§§ў§ў§§ћ§§ўў§ћћњћ§§ўўћћњ§§ћўўћћ§ћћњњїћњњћ§ћ§ћўўњ§ўћў§ўўё§ўћ§ћў§ў§§ћ§њўћћф§ћ§ћ§ћ§§њњ§ћ§ћ§ћ§ћћњљљїїјљћњњўћњњћћ§§ћ§§ћћ§ћњћћ№§ћ§њўћ§ћ§ћў§§њћњњћњэћњ§ћ§њ§њљјїљћћ§ћ§њћћњњ§ћў§ўўўћ§§њњћ§§ўћўўѕћ§ћ§њћљћњћњњхћњ§ћћљљњў§њјњњ§ћ§ћў§ў§ў§ў§ўўјћ§ћ§ћ§ћ§§ўњ§§њћ§ћў§ўўљћўћ§ћћњњјћњјјљњћњњќћњ§ћћрњћ§ў§§ў§ў§ў§§ћ§ћў§ћњњ§§ћ§ўў§ў§§ћћќ§ўў§§ўїћ§ћў§§ћћљљњћї§ћ§ћ§ў§§ўўњћњћ§ћўўх§ћ§ћ§ўўћ§§ў§§ћ§ћ§ћ§ћў§ћљ§ћ§§јћ§ћћљћњћћ§§ћ§§ўрћў§ў§§њћњ§ћ§ћў§ўћ§ћ§ўўћћњћћ§ћ§ћ§§њњ§ћ§њћњњћѓў§§ћў§ўў§ћ§ћ§§§ћ§ћћћ§ћ§ћњњћўї§ћ§њћњљљњњћ§ўћњўі§ў§ў§ў§ў§ўўќ§ў§ўўј§ў§ў§ў§ў ўў§ў ўї§ў§ў§§ћ§ўўќ§ў§ўўљ§ў§ў§ў§§§ў§ўўў§ўў§§ў§§ћў§ў§ўў§їўћ§§ў§ў§ўўњ§ў§ў§ўўў§ўўќ§ў§ўўќ§ўћўў§§ў§§љў§ў§ў§ўўќ§ў§ў ўќ§ў§ў ўў§ўў§§ў§§ўў§§љў§ў§ў§ўў§єћў§ўў§§ў§§ћў ўў§ўўў§ўў§§ў§§§ў§ўўў§ўўў§ўўј§ўћ§§ў§ў)ўњ§ў§ў§ўўў§ўўћ§ў§§ў*ў§§ў§ўўј§ў§ў§ў§ўўўћ§§ ўј§ў§ў§§ў§§ўў§ўў§ќўћ§ўўњћ§§ў§ўўі§ўћ§§ўў§§ўўў§ћћѓњ§њћ§ўћћ§ў§ў§§§ў§ўўќ§ў§ўўњ§ў§ў§ўўф§ў§ў§ў§ў§ўћ§ћћњћћ§§ў§ў§ў§ў§ў ў§ўј§ў§ў§ў§ўў§ўћ§§ъњ§ћўў§§ў§ўћ§ћўћўћ§§ў§ўўў§ўў§ћ§ў§ўў§§ў§§ўј§ўћў§ў§ўўќћ§ћўўў§ўўњ§ў§ў§ўўњ§ў§ў§ўўњ§ў§ў§ў ўў§ўў§ ў§ћў§ў§ўўњ§ў§ў§ў ў§ўј§ў§ў§ў§ўўў§ўўї§ўћ§ћў§§ўў§§ў§§ўњ§ўћ§§ў ў§ћў§ў§ўўќ§ўћ§§ћњњћњћ§ўўќ§ўњўўў§ўўќ§ў§ўўў§ў ўў§ўўў§ўў§§ћ§ћћ§ў§ўўў§ўўќ§ў§ўўў§ўўќ§ў§ўўї§ў§ўћўћў§§њўћўњ§ўўў§ўўј§ў§ў§ў§ўўќ§ў§ўў§§ў§ў ўћ§ў§ў§§ѕћў§ўћћњ§§ў§§§ў§ўўњћ§ўў§ўўў§ўўю§ўћў§ўћў§ў§ў§ў§ў§ўўў§ўўќ§ў§ўў§ѕў§ў§ў§ў§ў§ўўў§ўўќ§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ўўњ§ў§ў§ў ўў§ў ўћ§ћў§ў§ўўі§ў§ў§§ўў§ўўў§ўўў§ўўў§ўўў§ўўњ§ў§ў§ўўђ§ў§ўћћњ§§ў§ў§ўўў§ўў§ў№§ў§§ћў§ўћ§ћў§ў§ўўў§ўў§ћў§ў§ўўў§ўўў§ўўќ§ў§ў ўљ§ўћў§§ўўђ§ўћ§ћў§ў§ў§ўў§§ўј§ў§ў§ў§ўў§§ў§ўўќ§ў§ўўю§ў§ў§ў§ў§ў§ў§ў§ў§ўўў§ўў§ўњ§ў§ў§ўў§ћў§ў§ўўљ§ў§ў§ў§§ўќ§ў§ўўў§ўўў§ўўє§ў§ў§ў§ў§ў§ўўќ§ў§ўўў§ўўќћў§ўўњ§ў§ў§ўў№§ў§ўћ§ћ§§ў§ў§ў§ўўђ§ў§ў§ўћ§ћ§ћў§ўў§њў§ў§§ћћљўћў§ў§ў ўј§ў§ў§ў§ўў§ћћ§§ў§§ћ§јћў§ў§ў§ўўђ§ў§§ўў§ў§ў§ў§ў ў§ќў§ў§§§ў§ўўѓ§ў§ў§ў§ў§ўћў§§ќў§ў§§ћўћ§§ўўў§ўўђ§ў§ў§ў§ў§ўў§ћўўј§ў§ў§ў§ўў§ўћ§ў§§ћћѓ§ћ§§ў§ў§ў§ўћўўі§ў§ў§ўћў§ўў§єћў§ў§ў§ўћ§§ўўі§ў§ў§ў§ў§ўўѕ§ў§ћћўћ§ћ§ћћўў§§§ў§ўўў§ўўћ№њў§§ћўћ§ћ§ћ§§ў§ўўў§ўў§§ў§§ўл§ў§ўћ§ћ§ћ§ћў§ў§ў§§ћ§ћўћ§§ў§ў§ў§§ћ§§ў§§№ћњ§ћўћћ§ў§ў§ў§ўћћ§§ў§ўў§ќћ§§ўўў§ўў§ѓў§ўћ§њўћўћ§§ўўќ§ў§ўўќ§ў§ўўњ§ў§ў§ўўјћў§ў§ў§ўў§§ў§§љў§ў§ў§ўўі§ў§§ћ§ћў§ўўў§ўў§ўњ§ў§ў§ўўф§ў§ў§ўћ§§ў§ўў§§ў§ўћ§ћћњ§њ§ћўўј§ў§ў§ў§ў ўў§ўўя§ћ§§ўћ§ћў§§ћў§ўў§§ў§іћў§ўћ§ћў§ўўњ§ў§ў§ўўў§ўўў§ўўї§ў§ўћ§ћћ§§љў§ў§ў§ўўў§ўўў§ў ў§ў§ќћ§§ўўќ§ў§ўў№§ў§ў§ў§ў§ў§§ћ§ћўўќ§ў§ў ўљћ§§ў§§ўўќ§ў§ўў§ћў§ў§ўў§ўї§ў§§њћћў§§§ў§ў ўў§ў ўы§ў§§ўўћў§ў§ў§ў§ўћ§§ў§§ѓў§ўћ§ћњјћј§ћ§§§ћў§§цћў§ў§ў§ў§ў§ў§§ћў§ў§§ўў§ў§ўў§яћ§§ћћ§ћ§§ў§§ћ§ўў§§№љўљћћў§ў§§ћўў§§ўўћ§ў§ў§§ўў§§ў§ћ§ћћ§§ўћћ§јњ§њ§§ў§ўў№§ў§ў§ў§ў§ў§ў§ў§ў ў§ўћ§§љўњћћ§ћ§§ўћ§§ўћ§§§ў§ўўќ§ў§ўў§ћў§ў§ўў§ћў§ў§ўў§ўў§ўў§§ўћћњ§њћћў§§ћў§ў§ўў§ўў§ўўў§ўўў§ўўј§ў§ў§ў§ўўћї§ў§ў§ўў§ћћћ§ћ§ћўўќ§ў§ўў§њћ§§ў§ўўќ§ў§ўў§§ў§§ђў§ў§ў§ў§ў§ўњў§§ўћ§§ќњ§ћўўў§ўўё§ў§ў§ў§ў§ўћў§ў§§ќћ§ћўў§§ў§§ѓћњўњўњ§ћў§ўћ§ €§њћ§љћ§§ђћљћњ§§њћћљњћљ§§їњ§њћњїљјљљє§љњњ§ћћ§§њ§ўўќћўћўўђ§ћјјњњјјљљјљћ§§ќњ§ћўўќњ§њ§§ўњ§§јљ§§ў§§њћћјљћћ§§њ§њњ§§ћўў§ў§ў§§ў§§њ§ѓљћљјљњ§§ћјјћ§§њ§ўњ§§ћњўўћў ўњћўњјљ§§зћњ§§љљ§§њ§§ўўњљљћ§§ў§ћљєјјљјјљїњљѕљјїјљњўў§ћњ§њњ§§ўў§тўћ§ћћњ§§ћћљћјјњ§њ§ћњїљњћ§ўў§§ћћїљ§њ§§ћћ§ўўя§ћњњћ§љћњњћњ§њ§њ§§іљћњћћњ§њ§ћћћ§њћјїїјјѕїјјњћ§§ќћљњўўъћњњћљћ§ћљћљћћ§њњ§§ћјњћћў§ўў§ћљњњљћћўљћћ§њ§ў ўўћўўќћ§§ћћќљћјћћ §§ћњўўўњ§§ўћ§ѕњ§ўћўћўўћћўўўїўўћ§јњ§ћјћњ§ўў§јњљћњјћћљљўњ§§ўњћўўћћ§§ўўћўўњѕјћљњ§§ќњ§§ўўўјўў§ќћ§њ§§ў§ўћ§§ћћўўћўўўћўў§ўўћўў§§њ§ўўњњўњ§ўћћёў§њњ§њћћљљњ§§ў§§ўћћўћћўў§ћњћћљў§њњў§љљќјєљћћќљћљћћїјїѕѕєѕљњћћјњњћћ§ћўўћћўћў§§ўћ§јњ§§ћљљћ§§ћўњјјїѕюїљїјњљљњћћљњјњћћњўўњњ§ўћ§ўўўћ§§ќњ§§ўўі§ћћ§њ§њ§§ћћ§яљњњјњјњњјјљћ§ћўў§§ўњўўњ§ћћљ§ўўљўћ§§њњ§ўўњ§§њћњњћњ§§њђ§ў§§њ§ћћјјљћњў ў§ќњ§ћўў§ўѕљњњћ§ўў§§ћ§ §ўњўў§ќљћњўўўћўў§љѓћњјњјћ§§њ§§њћћюљ§љљѕљћљјљњ§ўўћћњ§§ўўћўўў§ўў§ћљћћћњ§§њ§§ћ§їў§§љјїїћ§§ўѓ§ћћљј§ўў§њњћўўћћўўћўўќњћљ§§њўћћ§§ћћњљ§ћўў§§юљјїїњјљљ§§ўўњ§љ§§њњўћўўїћўњўў§њ§ўўї§ћљ§§ўўћ§§ћў§њ§ўў§ўњ§§ўњћћјљ§§ћўўњўўљњћўўћћў ўў§ўўњ§њ§§њ§§њњљњњў§§ўњ§љњњћ§§§љ§ўў§ўњњ§њ§§ўўўћўўў§ўў§ћя§ўў§ћљ§§ўњ§ўћњ§§ўўўћўўўћўў§ќљњћў ў§ћљ§§ёў§§љњјљј§њ§љљћ§§ўўњћћїњћљљ§њўћўўўћўў§ћ§хњћ§ўў§§љћјјћљ§ўў§њћљћњјјћ§њњѕљњњ§ћ§§ўћћўўыћўћўў§љјљћњћћјљљћѕјњћћ§ќљћ§ўўћњ§§њўў§њѓљ§§ћ§§ћ§§љ§§њњўљўўќћўў§§јљћљљћљћ§§њќј§њ§§њ§љ§ўў§њўўћўўў§ўўќ§њњ§§ў§§њћћ§љћ§§ ўэ§ћў§§њ§§ўў§§ћ§§љјљћћњјњћћ§ўў§њўћ§ўћўў§ћћ§§њ§§њљћїњјћћ§ѓњљљ§§ўўњњўћћўўїћ§§њјљњћўўўћўў§њћ§§њ§ўўјћўўњњ§§ўў§§њ§§љњћўўћћўўўћўўўћўў§ў§ўќ§њ§ўў§њ§§ў§§јњ§љ§ћћў§§ћўўћўўўћў ўїњ§ћћ§§ўў§§њў§ўљћћњљћњћћўў§ўўћў ўѓ§њњ§§њ§њњћљљ§§ѓћљћљ§§њњ§§ўў§§љљћњўўћўўћ§ўћў ўјћўў§њ§њ§§єћњјїјѕњљљ§ћўўќ§њјћћўћ ўўћўў№§ћћ§њљћћјѕїѕїњљ§§ћўћўњўў§§ћ§ўўўњў ўњ ўј§њћћњњћњњњћљњ§§ћћ§ўњ§§іњћњњў§љћ§ў ўўћўўћўўћўўћ§њ§њ§§ў§ўњ§§ўћњ§§њўўўћўўіїњљ§ўўћў§ћћў§ћћў§њ§ўўўћў ўћћўўћўў§§ўћўўћўћјјљћ§§ћњ§§§ћ§ўўїћ§ћљћљ§ћўўіћї§ўўћњўћўўњјњљњјћћ§љћњњўћіњћљјћњўћ§ў"ўћ§ўљћћ№§ћћњ§§љјљћ§§њ§§ўўўћўўўћўўѓњ§§ћћњїїћљ§ў§§ўњ§§ќњ§§ў ўўћўўўћў ўђњў§јњјњљћљћћњ§§љњ§љћ§§ўўќћўњўўўћўў§ўўћ§§ђњ§§њњ§њњ§ўћ§њ§§ўњўўўњўў§§њ§ўўћћњћњўў§љњ§§љўћўўќ§ўћўўўћўўўњ§§ќњ§њћћљћћљћ§ўўўћўўћ#ў§ћў§§їћњњ§ўњњ§њњўњў§ў ўљњўўћљљћћѕљјјљњ§њ§њ§ўўћћўўћўўў§ўўњўўњљљўњўўўћўўўњћћјўљћћ§ ўўњўўўћўўўћў ўўћўўљњ§ћўўћўўќљїљ§§§ћ§ўўўћўўўћў ўўћўў§ўќћ§ў§ћ§цњћњћњ§ћ§ћ§њћњ§ћ§§ћњћ§ћћ§ћ§§ѕњљљјњћћў§ў§§ќњћћ§§ўћ§ўў§њњљљњњјјњћћћ§ћ§ћўў§§ў§§љћ§ћ§ћ§ћћ§§ў§§њњћњћњћћ§ўѓ§ћ§ўў§§ћ§ћ§ћўўіћўћ§ћ§ћ§ћ§§ћћњћњћ§§њћ§§ћ§§ўћ§§љћ§ћ§ћ§ўўў§ўўў§ўўў§ћћњ§ћћ§§ћћї§ћ§ћ§§ў§ћћ§рњћћњњћњњјћљћ§ћњљњћ§ў§ў§§ћ§ћ§њћћ§§ыћў§ўћ§§ўћћњ§ћ§њњћћњњ§§њрљјљћ§ўў§ћћњћњћћ§ћ§њћћў§ў§ўў§њљљћћњ§љћ§§ьћ§ћћљћњ§ћ§ћћњћњ§§њњљљюїјљњњљњ§ћ§ћ§њћ§ў§ўўў§ўў№§њљљњћњ§њћњћњћћ§§ћћњњљњњяћў§ўћ§ћ§ћ§§ћњћњћњњ§ўў§ў ўѓ§ћћњњћћ§ћњњљћћѓ§ћ§ћ§ћ§ћ§њ§§ўўј§ћћ§§ў§ўўўћ§§ўќ§ў§ўўѓћњ§ћ§§ћњ§њ§ћўўђћ§ћ§ћ§ћ§ћћљњњћћѕ§ћ§ћ§ћў§ў§ўўљћ§ћ§ћ§ўўь§ўўњњћћ§ћ§ћ§ћ§ћћ§ў§ўўљ§ўћ§ћ§ћћ§ћ§ўњћ§ћ§њ§§ўћўўђ§ў§ў§ў§§ћ§ћ§§ўўћ§ћ§ћўў§ў§ќћ§њћћ§іћўћ§ћ§ћ§§ўўў§ўўўљњњћ§ўћ§§ћўњћћѕњћћњћћњћњљјјњўћњњљљњћћў§ўўў§ўў§ћўњ§ћњњћ§§њћњћћњ§§ћќњћљњњљјэљјљњњјјљћњћљњљћњ§§ўў§ўўћўўю§ў§ћћ§ћ§§ћћў§ўћћњ§§ўћњњѓћ§ћљљњљњљљњњћћјў§ўћ§ћ§ўўіћњњћћў§ў§ўўў§ћћ§§ћ§§ёў§§ћ§ћ§њ§§њ§§ћ§§ќћўћ§§њћў§ўўј§ў§ў§ўћ§§ўћўўћ§ћ§ћўўщћљљњ§§ўћ§њ§ћ§ћ§ћ§ћ§ћ§§ўў§ћњњ§§ў§ў ўў§ўўў§ўўєћ§ўћњљњљњћћ§§ћћ§њћњњћє§ћћ§ћњћњћ§§ўў§ћћ§ћ§ўўњ§ћ§ў§ўўљ§ћћњњћњњц§ћћ§§ћ§ћ§ћ§ћњњћћ§ў§ћћњљљњћћёў§ўћњњћњ§§ўћ§§ўўњ§ў§ў§ўўі§ўўњњћћ§ћўўъћ§њћњћћў§ўћ§ћ§ћћњљњљњћћўћ§ћўћ§§ўќ§ў§ўўя§ў§ўћ§ћў§ўў§њћћ§ўўћ§ћ§ў§§юў§§ћ§ћ§ћ§њћњћћ§ћў§§ћў§ў§ўўи§ўћћ§ўўћ§§ћ§ћ§ћ§ћ§ў§§ўћ§ћћўўћћљљњ§ћ§ў§§ўўњћ§ћ§ћўўј§ћ§§ћў§ў ўэ§ўў§§ў§ў§§ћћњ§ўўћњћћѕў§ћўў§§ћў§ўўћћ§ў§ў ўћњћ§ћ§§ћљљњћ§ћ§ћћѕ§ћ§§ў§њњћ§ћћ§ўќ§ў§ўўў§ўўў§ўўр§ћ§ћћњћћ§§њћў§§ћћњ§њњћ§§ўћ§њћњљњњ§ўћ§§ќњћћўўђ§ў§ћњљћњњћћњ§њњэћњ§ћћњ§§ўў§ћћ§ў§ўћ§§їў§ћњћ§ў§ћћ§ ўїћ§ћ§ћ§ћ§ћћњњћњ§ћ§§ўћ§§љў§§ў§§ћћ§§ў§ўўў§ўўњ§ў§ў§ўўљ§ўў§§ў§§ќћ§ћўў§њїћњћњ§ћ§ћўўў§ў ўў§ў ўыћў§§ћ§ћ§§ў§§њ§ћў§ћњћњњіљњњ§§ў§ўћ§§ўў§§ўј§ў§ў§ў§ўўћ§ћњћ§§эћ§ћ§ћњњљњћњћћ§ћ§ћ§ћћќ§ўў§§ўњ§ў§ўћ§§ўў§ћћ§ў§єћў§ўћ§ћ§ћ§ћўўњ§ўў§ћўўј§ў§§ћўў§§ў§ћ§їћўћ§ћ§ћ§ћћўњћ§ћ§§ўўў§ўўў§ўўќ§ў§ўўў§ўў§іњћћ§ўўћ§ћ§§ўјћ§ћњњћњћћў§ўўў§ўўќћ§ћўўўћ§§љћ§ћ§§њћћў§ћћ§іћў§§ћ§ўњ§ўўў§ўў§љћ§ћ§ћ§њњѕћњњљћћ§ўў§ўўј§ў§§љњњў ўў§ўўі§њћћ§ћћњњљљћў§ћћўў§ўў§ћўў§ўў§ў§§ў§§њћњљљћљљћќ§ћ§њњы§ћ§ћ§ћ§§њ§§ў§ћњћў§ў§ўўў§ўўў§ўўў§ўўў§ў ў§њћ§ўўћ§§ќћ§§ўў§ћў§ў ўў§ўўў§ўўќ§ў§ўўњ§ў§ћћўўљ§њћњћћўў§њћў§ў§ўўќ§ў§ў ўє§ў§ўћћ§ў§ў§ўўљ§ў§ћњ§ћћњ§ў§ћ§ћћўї§њћњћћў§ўўњ§ўў§§ўўў§ўўѕњљћљњњћњћњ§§ўі§ћћњњ§§ўћў ўў§ў ўў§ўўє§ў§ўў§ћћњћњћћіњ§ћ§ћ§ћњћ§§ќћў§ўўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўўў§ўўю§ў§§ћњњљљћњћћўћ§ћ§§ђћ§ћ§ћ§ўў§ў§ў§ўўў§ў ў§єљњљћњћњњ§§ћ§§ћњ§ўў§ў§§ўў§ўўќ§ў§ўў§ђћў§ў§ў§ћћ§ћ§ћ§§ўћ§§ўјћ§ћ§ћ§§ўўў§ўўќ§ў§ўў§ўћўўјњљњ§ўў§ўў§ўћ§§ќћў§ўўў§ўўќ§ўћўўў§ўўў§ўўї§ў§§ћ§ћћ§§ћћњћњћћ§њћўўў§ўўњ§ў§ў§ўўњћ§ћ§њ§§ўў§§ўў§ўўњ§ў§ў§ў ў§ўћўўў§ўўў§ўў§ўь§њћћњћњћњњћ§ћ§ћ§ћў§ўўў§ўў§ўќ§ў§ћћў§ўўў§ўўљ§ўўљњћњњћњќћ§§ўўў§ў ўў§ўў§ќћў§ўўь§ћњћћ§ћ§ћ§њ§ўў§ў§ў§ўўќ§ў§ўўў§ў ўќ§ў§ўўќћ§§ўў§ћўћўё§ў§§ћ§ћ§§ў§ў§ў§§цў§ўћ§§ўћ§§ў§ў§ў§ўњ§ћ§ћў§ў§§њћў§ў§ў ў§ќћўњћћњљ§ћў§ў§ўўё§ў§ў§ў§ў§ўћў§ў§§§ўћ§§ўћўўњ§ў§ў§ўўќ§ў§ўўњ§ў§ў§ўўє§ў§ў§ў§ў§ўў§§ўћ§§эўћўћў§ў§ў§ў§ў§ў§ў§ўўѕ§ў§ў§ўћў§ў§§ћў§ў§ўў§ћћў§ў§§яўћћ§ўћ§ћћ§ўћћњў§ўўј§ў§ў§§ћўўў§ўўў§ўўћћ§ўў§§тћўћў§ў§§њ§њћћ§ўў§ўћ§ћ§ћў§ў§§ћўў§ћ№ўћ§њўћў§ў§ў§ў§§ћћ§єў§ўћ§ћ§§ў§ћњњєћљ§ћўћ§§ў§ў§§ ўќ§ћћ§§ђћ§ћўћў§ў§ў§ўћ§§ўє§ў§§ўўћ§ћ§ћ§§ўќ§ўћ§§ќћ§ћ§§ўї§ў§ў§ў§ў§§ўў§ўўќ§ў§ўўјћ§§ў§ўў§§ўї§ў§ў§ў§ўћћѕ§ћўћ§ўў§ў§ўўњ§ў§ў§ў ўєњўћ§ўў§ў§ў§ў ўі§ў§ўћўў§§ўўў§ўў§§ў§§ўњ§ў§ў§ўўќ§ў§ўўў§ўўє§ў§ў§§ћў§ў§ўўњ§ў§ў§ўўўћ§§ўћ§ў§ў§§уўћ§ћ§ћў§§ћ§ћћњћљћљ§њ§ћ§ћўћ§ћў ўў§ўўѕћ§§ў§ў§ў§ў§§њўћ§ћўћћёњ§љћњ§њћњ§њћћ§ћћ§ўў§ў ўњћў§ў§ўўїћ§§ў§ў§ў§§њў§§ћўћћ§§ћўўќ§ў§ўў§ ўіћ§ћў§ў§ў§ўўћ§ў§ў§§їў§ў§ў§ў§ўў§§ў§§ћ§§ћў ў§ўќ§ў§ўўњћўћ§§ўў§ѕў§ў§ў§ў§ў§ўўњ§ўћ§§ўўћ§ўћ§ћћїў§ў§ўў§ћ§§ўћ§§§ћў§§ћў§ў§ўўњ§ў§ў§ўўўћ§§ўћ§§ўъ§ў§ў§ў§ў§§ћў§ў§ўћўњ§§ўў§§ў§ўўњњ§ћў§ўў§ќћ§ћўўє§ў§ўћўњўћў§ўўі§ў§ў§ў§ў§ўў§ќћў§ўўј§ў§ў§ў§ўўў§ўўі§ў§§ћ§ћ§§ўўў§ўўј§ў§ў§ў§ўўў§ўўў§ўўі§ўћ§§ў§ў§ўўќ§ў§ўўў§ўўў§ўўњ§ўћ§§ўў§ў§ўќ§ў§ў ў§ыў§ў§ўћўњ§§ў§ўћўћў§ў§ўў§јћўћ§§ў§ўўє§ў§ўћ§ћў§ў§ўўљ§ўћ§§ў§§ў§њћўћ§§ўў§ў§ў§§ў§§ћ§§ћ§§јўњўћ§§ў§§ўў§ўў№§ў§ў§ў§ў§ў§ў§ў§ў ўэ§ў§ў§ў§§ћ§ћ§ћ§§ў§ў§§ќў§ў§§§ў§ўўќ§ў§ўўў§ўў§§ў§§§ў§ўўљ§ў§§ћў§§§ў§ў#ўј§ў§ў§ўў§§ўћ§ћ§ћ§§ћ§ўќ§ў§ўўё§ў§ў§ў§ў§ў§ў§ўћћј§ћў§ў§ў§§§ў§ўўў§ў ўњ§ў§ў§ў ўј§ўћў§ў§ўўќ§ў§ўўњ§ў§ў§ў#ўў§ўўў§ўўќ§ў§ўўў§ўўј§ў§ў§ўћўўћ§ў§§ўў§ќћў§ўўњ§ў§ў§ўў§њћ§ћ§ћў ўў§ўўї§ў§ў§ў§ў§§јў§ўћ§ћ§ўўў§ўўњ§ў§ў§ўўъ§ў§ў§ў§ў§ў§§њўћўњћћ§§ўўћ§ћћ§ўў§№ћў§§ћ§њ§њ§њћћў§ў ўќ§ўћўўў§ў ўћ§ўћ§ћћ§ўў§§ўї§ў§ў§ў§ў§§"ўј§ў§ў§ў§ўўњ§ў§ў§ў-ўўћўў§ќћ§ћўўў§ў'ўўћ§§іћў§ў§ў§ўћўў§ўў§ў ўћї§ћ§ћ§§ў§ўўќћўћў)ўѓ§ў§§ћ§ћўћ§§ў§§ћў§ў§ў)ўі§ў§§ћ§ћ§ћўўє§ў§ў§ў§ў§ў§ў(ў§эћњћ§§ћ§§ў§ў§ў§§ћў§ўўў§ўўў§ўўђћў§ў§ў§ў§ў§ў§ўўњ§ў§ў§ў)ў§ўћ§ћ§§ўўњ§ў§ў§ў'ўќ§ў§ўўє§ўћ§ћ§§ўћ§§ў/ў§§ў§§ќў§ў§§ўў§ўўљ§ўћ§ћ§ћћў§ўўў§ў ўў§ўўќ§ў§ўўђћ§ћ§§ўћ§ћ§§ў§ў1ўїћў§ў§ў§ў§§,ўў§ўў €ўћќўћћўўњћўўћћўўўћўўўћўўќћўћўўўњўўўњ§§ўў§ўўўћўўќћўћўўќћ§њ§§ћўњўњќћўћўўћ§ўњўўќ§њњ§§§љћў ўћў§§њћћўњ§§ўќћўћўў§ћњ§§ў§ўўћўўўћўўњћўўћў§§ћњ§њ§ўўѓћўў§љљјљ§ўћћўўўњўў§§ћўўўћўўњўєћўћ§њћ§ћњ§њўўћўіћўўњ§ћ§ўћўў§§ћўўўћўўі§љ§§ћћљћ§ўўўћўўјћњ§ћўњњўўє§њћўћў§§њ§§ўўњљ§њ§ўўћўўћўўћўўћўўњўў§ў§ўў§ўў§јњ§њјјћ§ўўћўў§ўўќљї§ўўќћўћўўїњ§§ў§њ§§ўўћ ўўћў ў§ўљўў§ќўћћў ў§ ў§ўњўўќ§ћў§§љў§љћ§§ўўюћў§§ўћўњ§§ћў§§ўўћўўћћўўћўўўћўўўћў ўљћўљўћћўўљћўўњњљўў§ў§ўњўўћћўўћўўўћўў§ўўћўў§§ћўў§ќњ§§ўўљ§ўћћўћўўіњћћљћћ§§љў ў§ў§ўњљњћ§§ўў§ћљў§ћ§§ ўўћўўќ§љћ§§ўњћњў§§ўўўћўў§ўњў ўў§ўўћўњ§ћљћ§ў ў§ўўћўўўћўў§ў§њћ§ўћћўў§ћњ§њљ§§њўћўќљ§њўўњ§§ћўўї§љћљћћјјћћ§јњ§§ћљњ§§ўўўћў ўўћўўћћўўћўўў§ўўўћўўњ§ў§ў§ўўћўўћўљ§љ§ўњ§ўў§ћњ§ћљ§§§њјўў§ўљћўћўўћўўјћўўћўўњўўѕћўў§ћјљљ§њўўљ§ўўћўћўўўћўўїњјљћњћўћ§§ў§њћљћ§ћўўўћўўћњўћњўўўћўўљћў§ўўћўўі§ћљ§§ћўўћўўјћўўћўћ§ўўћ§ўћћўўў§ўўќћўўћћ§ўћўўћ§њ§њћћ§§њћњњўўћўўћў§ќїљћўўў§ўўљљњ§§ўћўўљћњ§§њў§§ћћљћљў ўќћўў§§ ўћћўћћўўўћўўњќј§§ўўѕ§љјјћћ§њўћўўњ§ўўћћўўўћўўўћўўўћўўўћўўёћўў§њ§њњљљ§§њ§њњ§ўњўўќ§љ§ўўўћўўч§њћљљћ§њ§ћјјїћљ§§ў§њўўћћўўўњ§§љљћљљ§ўћўў§ћў§§ўњћўў§ї§§їћў§ўћўў§њњўўћў ўќ§њњ§§ў§§њўўўћўўўћўўњ§њњўћўўў§ўўўњў ўќњ§ћўўќћўћўўўћўўњћўў§§ўўєћљњ§њћ§њћћљў ўіћўћњўў§ўћўўћ ўё§љћ§њћ§њ§ў§§њњўў§љњ§ћћљћўўўћўўњў§ћћќњўћўў§њњљњ§§ћћјћўљћћ§ћ§јћўўўћўў§ўћўў§ў§ўњћўњљј§§№ћ§§ў§§њ§§љљњљљїњњњјљћљњ§§ћ ўќћўћў ўјћўўћњ§њ§§ўњўќњ§њ§§ћјјћљћћ§њ§§ўј§ўћўћўћўў§їћ§§јљљ§њћћњјїњћ§§њћўў§§§њ§ў ў§ћћўў§ћћхљњњ§§ћљћћљњњў§§ћјњјљѕїјјћћ§§ћњ§ўћў ўћ§ўћўў§єўћўњ§§њ§§њў§§љњ§§ўўњћћљљћћ§њњ§§эћљћ§§ћћњћљјњўўћўўћ§§ёљћћ§§ўћўњњћћ§§ўў§ў§ћњ§њўћўћћў§§њ§§ќљњјўўћў §ўњћћјљћљћћњњјјћћљњњћћћјљ§њ§§ўњ§§ў§ўјњ§§ўўњњўўєњ§ћўћ§њњ§њњ§§ќљћљћћћљјћљ§§ћћ§ўўњ§§§ўћўўїњ§§јј§§ћўўќ§ўћ§§ў§ўњћўћўўњњћћўўћ§§ћ§єњ§ћњњјљўўћћўўўћўўўњ§§ўў§§ўђ§ћјѕјњњљљњћћљћћћ§њў§ћћјјњњћњјљћћњ№љ§љљј§ћљўћўў§§љћћќ§ўћ§§ўњ§§ќћ§§њњєћњњјћљјљљћћ§§їћљ§§ўћљљ§§ўњ§§ўњ§§ћў§њњ§љ§ў§§ўњ§§ћўћ§§ћћ§ўњ§§ўє§њ§ўўћўўњљїћћјњ§њ§§њ§ўў§љћўњ§§њ§§ў§ќљћљ§§ўш§љљ§§ћјјћљћћљїњїћ§§њњ§§ўў§ўќњ§ў§§ўў§ћћ§њљћјљ§ўў§§љјћћљћђљјљћ§§љћљјљћћ§§њћ§ћ§љ§§њўђ§ћћ§љљћћ§§ў§§ћћ§§њљљћќ§ўћўў§ќњўў§§їћјћ§ўћћ§ўў§ў§љњ§њ§ўћў ў§ў§ўњ§§њ§ўщњјљјљљћ§ўў§ћў§јњљћѕјњћїїћњјљћ§§ћ§ћїђњў§њћћљљјљљ§§ўў§њњўњћљ§§іњћћ§§ћљћћњњјћљћјљ§§яћњћћњїјњїњћ§њ§§њ§§њ§ўї§ћћ§ў§§ћўўќ§ћљ§§ў§ўўў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўў§ўўў§ўўњ§ћћ§§ўў§ ўў§ўўќ§ў§ўўў§ўўў§ўўќ§ўў§§ћћ§ћ§ўў§њў§ў§§ўўі§ў§ўў§ћ§§ўўќћ§§ћћўў§ўўќ§ў§ўў§єћњћњ§ћ§ћ§ћ§ўўю§ўў§ћ§ћўў§ћў§ў§ў§ўўі§ў§ў§ў§ў§ўўј§ўў§ћ§ћ§§њў§ў§ўћћћњћ§§ўўў§ў ўў§ўўќ§ў§ўўўћўўў§ўў§§ў§§§ў§ўўў§ўў§ќўћў§§§ў§ўўў§ўўў§ўўў§ўўш§ў§ў§ў§§њћ§ў§ў§ў§ўћў§ў§ўўћ§§њћћўў§ўўї§ў§ўў§ћў§§ ўќ§ў§ўўў§ўўќ§ћ§ўў§њћ§ћ§§ўў§§ў§§ќћ§ћўўў§ў ўќ§ў§ўўў§ўўњ§ўћ§ћўў§§ћўў§љў§ў§ўћ§§њќћў§ўўј§ўћў§ў§ўў§§ў§ўўў§ўўњ§ў§§ћ§§ўћў ўў§ўўў§ўўљ§ў§§ћ§ўўњћ§ћ§ћўўќ§ў§ўў§ўћўўњ§ўћћ§ўўњћўў§ћ§§єћњћ§ўў§ўў§ћўў§њћў§§ћў ўў§ўўў§ў ўј§ў§ў§ў§ўўў§ўў§ў§§ћ§ўўѕ§ћ§§ў§ў§ў§ўўў§ўўіћ§§ў§ў§ў§ўўя§ўћў§ў§§ћ§ћ§ўў§ў§§ўђ§ў§§њњћњњ§ћў§ўўў§ўўм§ў§ў§§ћў§§ћў§ћљњћ§§ў§§ћў§§њ§ћ§§ў§ў§ўўў§ўўћ§ў§§ћћ§§ћўўў§ўўќ§ћћўўќ§ў§ўўѕ§ћ§ўў§ў§ў§ўў§ћў§ў§ўўћћњћў§ўўљ§ў§§ћ§ўўў§ўў№§ў§ў§ў§ћћў§§ћњћўўј§ў§§ћ§ћ§§ћўћ§ћ§§ўў§ўў§ћ§ўўў§ўўќ§ў§ўў§ѕћў§ў§ўћћњћњњщћњњ§§ћ§ћћ§§ћў§ў§ў§ў§ў§ўўў§ўўў§ўўў§ўўў§ўўўћўўќ§ўў§§ќћў§ўўќћ§ћўўќ§ў§ў ўњћ§ћў§ў ўќ§ўў§§ќў§ћўўљ§ўў§ћ§ћћї§ћ§ћ§ћў§ўўќћ§§ўўў§ўўў§ўў§§ў§ўўў§ўўњ§ў§ў§ўў§њћ§їў§ўћў§ў§ўўќ§ў§ўўў§ўўј§ў§§ћњ§ўўњћ§ћ§§ўўљћ§њћњћўўў§ўўў§ў ўўћўў§§ўћћ§§ћў ўўћўўўћўўќ§ў§ў ўћ§ў§ў§§ўќ§ў§ўўѓћ§ћ§њћњћћ§§ћ§§ўў§ўўў§ўўќћ§ћўўњћў§ў§ўў§ўћўўќ§ў§ўў§љћ§ў§ћ§ћћў§ўўў§ўўј§ўћ§ћ§§ў ўќ§ў§ўў§јћ§§ўў§ћњњ§ћ§ўўќ§ўћўўњ§ў§ў§ўўў§ўўў§ўўў§ўўђ§ўћ§ћ§§ћћ§ћ§ћ§§јћ§ћ§ћ§§ўў§ўў§ўўј§ў§ў§§њћћј§ћћњњћњћћћўћ§§ўўў§ўўќ§ў§ўўў§ўў§іћ§ћћњћћ§§ўўў§ўўёћ§ћў§ў§ўћўћ§ћў§§ўўћ§§§ў§ўўў§ўўќ§ўў§§њћ§ћ§ћўўќћ§§ўўў§ўў§§ў§§§ў§ўўњћў§ў§ўўў§ўўў§ўўћ§ў§§ўўў§ўўђ§ў§ў§ў§ўћ§§ў§ўў§љўћ§њћћўўў§ўўќ§ўћўўћіњ§§ўћ§ћўћ§§ќў§ўћћѕ§ћћњћњў§ў§ўўє§ў§ў§ў§ў§§ћњњўў§ўўѕћ§§ў§§ћћњћњњђћњћњћњћњћњћћ§њњ§§њўў§№ћ§ўў§ўћ§§ў§§ћ§§ўўє§ћ§§ћ§њћ§ўћ§§ћњњјјљњљљўњћћљ§ћ§ћћњў ўў§ўўў§ўў§ќћ§ћўў§єў§§ћ§ћ§ћ§ћћњњїћњћћ§ћ§ћўў§ўў§ўўј§ћ§ћ§ћ§ћћ§ћћў§§њњљњїљћћ§§ў§ўћћ§ўќ§ў§ўўић§ћ§ўў§§њћњћ§§ћ§њћњњћ§§ўћћњњљњјњљњ§ћњ§ћ§§§ў§ўўў§ўўў§ўўњ§ўў§ћўўі§ўћ§§ў§§ћ§§ўћ§§ќћ§ћ§§єћў§§њћњћњћћ§§яћ§ћћњћњ§ћћњ§њћ§§ўўѕћ§ћћњћћ§§ў§§№ћњ§ћў§ўў§ћ§§ў§§њњћћ§ўў§ўўў§ўў§іћ§ћ§ћ§ћљњўў§§ўћћѕ§ћ§ћ§ћ§§ћњћћњўљњњ№ћљљћњћњћћ§ћ§ћ§ћ§§ќћ§ћўўїћ§§ў§§ћў§§ў§ўћўўўћ§§јћ§ћ§ћ§ћ§§ћњњћњћњћћя§ћ§ћњњ§§ў§§ћ§§ў§ўўј§ћ§ћ§ћ§ўўђ§ў§ћ§ўћ§ћў§§ћўўў§ўў§чў§ўў§ћ§ћ§ћћњњћ§ћ§ћћљљњћ§ўўў§ўў№§ў§§ћ§ћўћ§ћ§§ўћњњљћъљњњћњњћћ§ў§њћњњљњњ§§ћњњљћў§ћћў§ћіњћњњћўў§ћ§§њћ§њ§ћ§§јњљљњњћњћћіњ§ћ§њћћ§§ўўќћ§ћ§§ўћ§§шћ§ћћњў§ўћ§ћ§ћ§§ўћўћ§ћ§ћ§§єћ§§ўћ§њћњ§ћ§§ћћ§§ў§§ўў§ўўћ§ћ§ћ§§ўєћ§ўў§§ћ§ћ§ћўў§іћњћ§ћ§ћ§ћўў§ћў§њњћјњћњљњћћ§§ьћ§§ў§ў§§ћ§ћў§§ћўћ§ћўўљ§ў§ўћћњњя§ћћњњћ§§ў§§ћ§ћ§ћњњўћњњћњяћњћњ§ћћњћ§ћњћћ§ћ§§ђћњћўћ§ћ§§ў§ћњћћњњ§ћўћћњњ§ћ§ћћќњ§§ўўђћ§§ў§§ћ§ћћњћћўўўћўўіћ§ћ§ћ§ўўћ§§ўќ§ў§ўўќ§ў§ўўќћ§§ўўіћ§ћ§ћ§ћ§ћ§§щћ§§ў§§ћњћћњ§§ўћўў§њљћњ§§ўћљљњэћњ§ћ§ћ§њћћ§њћњћњўў§§њћњћћ§ћћў§ўў§§ћ§§ёњћћ§ћ§њњћ§њћњћљљњёћњ§ћ§ћ§њљњћљћњљљчњ§§ћћ§ћ§ћ§ћ§§ћћўў§њњћўћ§ўў§ўњћћ;ўў§ўўў§ў%ўј§ў§ў§ў§ўўў§ўўў§ў ўќ§ў§ўўђ§ўћ§ћ§§ў§ў§ў§ў ўќ§ў§ўўў§ўўі§ў§ў§ў§ў§ўўњ§ўћ§§ў?ўў§ў ўў§ўўў§ўў§ўјћў§§ћ§ћўўў§ў#ўњ§ў§ў§ўўњ§ў§ў§ў#ўў§ўўў§ўўў§ўўј§ў§ў§ў§ўўќ§ў§ўўњ§ў§ў§ў#ўћ§ў§§ўўќ§ў§ў ўў§ўўћ§ў§ў§§§ў§ўўў§ўўў§ўўў§ў7ўќ§ў§ўўќ§ў§ўўќ§ў§ўўў§ўўњ§ў§ў§ўўў§ўўћ§ў§ў§§§ў§ў ўў§ўўў§ўўњ§ћ§ў§ўўў§ўўњ§ў§ў§ў ў§ќћў§ўўќ§ў§ў ўў§ў ўќћ§§ў ўќ§ў§ўўќ§ў§ўўћ§ў§ў§§їў§ў§ў§ў§ў+ў§јћ§§ћћ§ћ§§ўњ§ў§ў§ў1ўќ§ў§ўўў§ўўў§ўўќ§ў§ў ўє§ў§ўћ§§ў§ў§ўўў§ў+ў§њћ§§ў§ў)ў§ўќ§ў§ўў§6ўќћ§§ў+ўў§ўўђ§ў§§ћ§ўў§ўћў§ўўў§ўўў§ў ўѓ§ў§ў§ў§ўћ§ћ§ўўќ§ў§ўў§ќљў§ўў§ћћў§§ў.ўю§ўћ§§ў§ў§ў§ў§ў§ў§ўўќ§ў§ўў§ћћў§ўћћў§ўўў§ўў§§ў§§ ўў§ўўў§ўўў§ўўќ§ў§ўўј§ў§ў§ў§ўўќ§ў§ўўў§ўўў§ўўў§ўў§§ћ§ў$ў§ўў§ўўќ§ў§ўўљ§ўћ§ћ§ўў§§ў§§ўх§ў§ў§ўћ§ћўћўћ§ћ§ћ§ћ§ћ§ћ§ћў§§ўќ§ў§ўўў§ўўќ§ў§ўў§ђў§§ў§ўў§ў§ўћ§њњ§§њћћі§ћ§§ў§ўћ§ўўњ§ў§ў§ўўў§ўўє§ў§ў§ў§ўћ§ћ§§њћў§ў§ўўў§ў ўѕ§ў§ў§ў§ўћў§§ќў§ў§§ћўўћћ§ў§ўўў§ў ўќ§ў§ўўє§ўћўћў§ў§§ћ§§ўя§ћўћњњ§ћ§ћ§§ў§ў§ўўў§ўўў§ўў№§ў§ў§ў§ў§ў§ў§ў§ўў§ўћ§§іћў§ў§ў§ўў§§§ўћ§§ўј§ў§§ћў§ўўњ§ўћ§§ўўњ§ў§ўў§§ќћў§ў ўѕ§ўў§ў§ў§ўћў ўђ§ў§ў§ў§ўћ§ћ§ћ§§ўњћћќў§§ћћя§ћў§ў§ў§ў§ў§ў§ў§ўўў§ўўў§ўўў§ўўў§ўўѓ§ў§ў§ў§ў§ў§ў§§ьћ§ћ§ћ§ћ§ћўћ§§ў§ў§ў§ўўќ§ў§ўўј§ў§ўћў§ў ўў§ўўў§ўўў§ўўё§ў§ў§ўћ§§ў§ў§ўћћ§ў§ў ўќ§ў§ўўќ§ў§ўўі§ўњўћўћ§ћ§§єћў§ў§§ћ§ћћњ§§ђў§ћћўћў§ў§ўћ§ўўј§ў§§ћ§§ўўљ§ў§ў§ў§§њў§ў§§ћћё§ћўћ§ћ§§ў§§ћў§ўўя§ў§ў§ў§ў§ў§ў§ўћ§ўўћ§ў§ў§§ўі§ў§ў§ў§ў§ўў§іћ§§ў§ў§ў§ўўќ§ў§ўўў§ўўў§ўўќ§ў§ўўў§ўўў§ўўў§ўў§ћў§ў§ўўш§ўћў§§ћў§§ћ§§ўћўћў§ў§ў§ўўќ§ў§ўўў§ўўўћ§§љўћ§ћ§§ўўј§ў§ў§ўћ§§ўћ§§ўћ§§§ўћ§§ќћў§ўўі§ў§ў§ў§ў§ўўќ§ћў§§ў§ўў§§ќћ§§ўўў§ўўћ§ў§ўћћўњ§ў§ў§ўўњ§ў§ў§ў ўў§ўўђ§ў§ў§ў§ў§ў§ў§ўўћ§ўњў§§ўё§ўћ§§ў§ўћ§њ§њў§§уў§ў§§ћў§ўћ§ћ§ў§§ў§ўћ§§ў§§ћў§ўўћ§ў§ў§§№ў§ўў§§ў§ў§§ћўћўћћ§њў§§ћ§ћћћ§ћ§§ўўќ§ў§ўў§ўў§ўў§ўћў €ўўћўў§љхћ§§њљљћљљћ§њљјљњњў§§ћљ§љљћ§§юћљњћћљњјњњљѕїѕјћћўўћћўћћўў§ўѓњћњњ§љњўћ§§њўўў§ўўўћ§§ћњјїїљјњњќјњјўўщћўўћўћўўћўћћњњ§ћљњњ§ўћўў§ўњљљјѕћњњћњњљљїћ§љљ§§ў§ћћќјѓљўўњњћњ§§ўўњ§јўњљљњћћљљ§ў§ыњ§§ћљњјњћњљћњ§ћјљћ§§ћћ§њљ§§ћўўњ§§§ўњ§§ёћњњћњїљ§њ§ћњїљїїхјїѕїїљјњјљћљјјљѕѕњћћљћљїїјўў§ўћљљўњ§§јњ§ћћњњјћћњ§їјњњјўћњњќјћљ§§љљћњўў§ўўћ§њўћўў§љѕјљјћјњјћљљћћфљњљљћљћћљћњњјїїјњњјјњњѕїїљљўўіљ§§ћћњњљћљљўћ§§њюљћћјјљћљћљћњљћјњјїїјшњјјњјљ§§њ§ћћјїї§§ћњћћ§ћўўўћ§§ћќїјјљљєћ§ћњ§§ўћ§§њ§§ћјћљћњњ§§яњљћљљћћњў§ћјћњ§§ўў§§њўўѓњљљ§њљїјћјјљ§§щњ§љљїїјїљљїћљћћ§њћ§њћјїїњљїїњљ§§§ўћ§§ўў§јјћћљљћ§§њѕ§јјљћљ§§ўў§§§њ§љљѕћ§љњ§ћљћњћ§§ћњљїћўўќњ§ћ§§чњ§љћћљћћ§љљ§љљј§§њ§њћ§§ћљљѕњў§њ§§њ§§їњњћ§ўўљ§§ўј§§їўњ§ћћ§§њљљўњ§§ѓћљљћљ§њћћєњћ§§мњ§ћћљћћљ§§љћљљјїѕљјњћљћ§ўћўўњўњ§§њњ§§њњўћўў§§ёњ§ўў§њћњ§љїћ§§љљ§њ§ўў§§њ§§ћњ§ћљјј§њјљљўўћўўў§ўўўћўўћњ§њљ§§ёљћ§ўўљњњ§ўўњњљћћѕ§ўў§§њ§§њњ§§ўю§ћљ§ўњћљћ§§љј§§ћњўў§ћњјќћ§§ўўш§ћ§њњ§јјљћљћ§њљјїјјћњ§њ§§№љ§ћљћјјљљ§ћїјћ§ўў§ќљ§§ћћљљ§ў§љњћћэљ§§њ§§ћ§§ћљ§ћћјїїјћћљ§јїўў§ћњљљћјќїњјћћќњ§ўњњўщњћљњ§§ћћњњћљљћћјћћљњњћ§§ўњћћтљћћљјљјјћјјљ§§њњ§§њљњћљћћљ§§њ§§чћ§љљњћјјћљ§§ћјїєєѕїњћ§љјљљёјљљњ§ћљћљљ§§њ§ўўќ§љ§њњ§ўўљљћњ§§њ§§єњћљљјљћњјїїјјїћљћљњћљњ§§§ћљјј§љњ§§ ўщћ§љћћњ§ўў§§ћ§њ§њ§њћљљњ§§ћћљћљћћ§ќў§§ћћ§ўј§њњўў§ћўўўњ§§ўњ§њ§ўўњњх§љљњ§ћћјњљ§§ћљћјјљњњ§ћћњјћљљћўњ§§ў§ћњћњјїїјнћљћљјјћћњ§љјћњїјљњў§§ћљћћњћљљћњјјљ§§ћў§ўў§њ§ўўљћьјїїњљљјћљјљћљћћљїѕљ§§іљћњјњї§ћћ§§§јљћћђљћњљљћћ§њ§ј§ћњњњљњјјљ§§јљјјљћ§њ§§ыћїњњ§§ћљћ§§ћљ§§њњ§ўў§§§ў§ћћяљњїљѕѕњњјїѕѕїѕїј§§њњўћўћ§§§ћљјјўњјјўњћћўљћћ§§ћјјѓљјѕїњњ§§љљїљ§§ћ§љћўў§ћњљћ§њњљћ§њљљ§§љћјљјћјїјњјјљљ§њ§§њ§§ўћ§ §ўљўў§§њ§§ќћ§§љљ§ёћўљ§ћљ§љ§њ§§ўћўў§юњ§њ§§љјљјјњљњ§њ§љ§§љћљљњ§§ўў§ўљјјќљћљ§§ќњћ§њњ§ћ§њ§ўў§ўўўњ§§цћљћљ§ў§§љљћјљјњњїјћћљћљ§љ§§њ§љљћ§јљљјїїјђћњћў§§ћљћњћљњ§§ѕљћљ§ўў§§ћњћћј§њњ§ўњ§ўўћћ§§њ§§юћљ§ћўњў§њљ§§ћ§ў§њ§§ѓњћњ§§њњљјјїњћћјљјћ§ћћ§њњўј§њњ§ћћ§ўўњў§ў§ћўћћў§ўњ§§љћ§єћїјљјјњћћљјћћіљћњљћјћѕћњњћјљјњѓїѕјљ§јјъћњ§ў§§њ§њљјћ§ћљњљ§§љњљљчћњњјјњњјњ§ћћљћјљћњ§њћћњљјјњљ§љњјљљћыљћњњ§ўўћњћ§§ћўћў§ћћљ§§љ§ћљћћќ§њљўў§љњњљћ§ў§§љњљћјїљјј§њљ§§ў§§њ§§ўћњњљјјћ§§їјћ§њ§§љљўўї§њўћўў§њ§§ѕћљљ§ћћјљљћљљэњљїїњљњњћјѕїїјњћ§§љљ§§њ§§љїјїњўў§ўў§§ў§ќњљ§ўўчћњњ§ћћњїјњјјњњљћћљљћљјћљћћљљњњ§њћ§§ѓњ§§љљњјјїјњњљљьћїјјћћљњ§§ћљљ§њ§ћўў§§ќњ§ћљљ№§љ§њ§њњ§§љљћљ§§љљўќ§њњ§ §ѓћјїїјјљў§њ§љ§§њњ§њ§њљ§§ћњ§§њўў§ћў§§юњ§њ§њ§њўўњ§§ў§љ§њ§§ћљћљћ§§ќћљљ§§њя§ўњ§њњў§њњ§њњ§љњўўњћўњ§њ§§њњўў§њ§§ќўћњ§§ўњ§њњўў§§ўјћ§§ўњ§§ўўј§њ§њўўћўў§ўћљ§њљўўњ§§љћљћ§§љћћјљћћљљєћ§§єљћљљјїјћћљћљљћ§ўўћўў§њѕљњћћїїнћњ§љјћћ§ўћњћљћ§§љћ§ўўћў§ћљљћћњ§§ўћ§§єњљ§љњ§њўў§њўўќњ§§ўўљћњ§§љћљљё§њњ§§њў§§ўў§§њ§§ўњўўћћ§њ§ўўћ§њ§њљљѕ§ўў§§јњ§§њљљћ§ў§§ўў§јјљјњћњ§ўў§ўћћљўћўўњ§ўњ§§іљћљњљћ§§ў§§њ§іљћљћљћј§§ћћє§ўў§њ§ўњјљјћћў§ўў§ћў§§ў§§њ§§ћњћљљ§§ўћўўўњ§§ўњљљ§ ў§ўўћўўћњ§§ћўўўћўў§ћљїњ§ў§љћћ§ўўўћ§§ўћўў§ўљўў§ћў§§јјљ§§ўћћўў№ћўћћўў§ћјљљјљљњ§§їћјљћ§њўў§§ўї§§ўћўўљњћњћљљ§§ќњ§љўўњћўњњў§§юњўћ§љљїљ§§ўў§§њћћјјђћљї§њћњњљњў§§ўў§љјљќ§ўћўўњћўў§њўўќћ§јљљўћ§§ѓњ§њњ§њ§њ§§љљћћљ§њћћњљ§ўў§ўўћ№њћ§§ўћњћћњћ§ћњћ§§фћњћ§ћћњћћ§ћ§њћљћњћљњљљјјљљњўўў§ўўў§ўўђ§ў§§ћ§§ў§ўў§њ§§іћ§§ўћ§§ў§ўўўћўўђћ§ћњњћњљљјњљљњњўњ§ў§ў§ўў§ќћњћ§§ўћў§ћћј§њ§§њљљћћј§ћўћњњћњњўјўўѓ§ў§ў§ўў§ћ§§ў§§јћў§ћћњњћћўўћ§§Ъћ§њћљњљњљћњ§ћњњћњ§ћћњћњљј§ћ§ўў§ў§§ћ§ћ§ћў§§ћ§ћ§њ§§ћљћћ§§њўјљљіњљњљљјњљњћћњјјњљњњћњћњњћў§ў§ўў§ћ§§њћћ§§ћ§ћћ§њўљњњ§ћњљљўњљљњљњћњ§ћњљў§§њў§§ћ§ўў§ћў§ћћ§њјњњњљњњћћњњыћљћћњћњњћњљљњљљњљљњњљљќјў§ўўї§ћўў§§ћњћћјњћ§ћ§§ћњњѓћњћњћњ§ћњњљњљљњјљњњљњћћ§§њљј§ћћљћњ§ўўћі§ћ§ћњњћњњћћёњћњ§§ћўў§ћ§ћ§ћњњћ§ъћ§ћ§ћ§ћњћћњћ§ўћњњћ§ћћўўљћ§ўў§§ћћќ§ћћњњєћ§ћћ§§ћћњћњћћњѕћњњ§§њћ§њњљљўјљљћњ§ћўў§ћћњ§ўўћ§њњћћ§ћ§ћ§§ђћ§ћњћ§ћўў§ћ§ћ§§ћцњћў§§њћњљњ§ћ§ћ§§ћњў§ў§§ћњћћђ§ћ§ћ§ћћњњћњњ§ћћ§§ћ§§ћўћ§њћћѕ§ўћ§ћћ§ћћў§§ўї§ћћ§§њ§ћ§§љћњњћћ§ћћњ§ћ§ћ§ћћюњћћ§њњћљњ§ћ§ћ§ћ§ћ§§њћьњћћ§ћњћћњљљјњљњћњћ§ўўќ§ћћ§§ћє§ўў§ўћ§ћ§ћў§§іњ§§ћћњ§ћўћћё§ћў§ўћ§ћ§ћ§ћњћњњ§љњћћў§ў§§ў§§ћї§ћћњ§§ўў§§ћў§§ћњњјћў§§ћ§ћ§§ђћ§ћ§ћ§ћў§ўћњћ§§ћњћњ§ћћ§њ§ўўђ§ћћњњљљњљњљњњћћј§ў§ўћњћ§§ћћњћњћћћ§ћњљњњ§їћ§ћ§ћ§њћњњћї§њћњћћў§ўўўћ§§ћќњћћ§§§ћљњњіћў§ћ§ћ§ў§ћћў§њњљњўћњњћїњљў§ў§ў§ћћњљћњћњњ§§фў§њћ§ћ§њњ§§њћћњњ§њћћљљњћ§ћ§њњёћњћћњћњњћ§§ћ§ћ§§чћ§ћљњћњњћ§ћ§ћ§ћ§ћ§њ§ћћ§ћњњћђ§њњљїѕјљљњ§ћ§ћћї§ћћ§§њћњћћћ§ћў§ўўќћўћ§§ћђў§ћћ§ћћ§§ћ§§њћћњњљњљљњњіћњћ§њћ§ћ§ћћњњћ§ћ§ћўўў§ўўі§ћњњ§ћўў§ћћѕ§ћ§ћ§њћћ§ћ§§ћњћњћњњъћњ§ћ§ў§ћћњћћ§ўўћ§§ўў§ўў§ѕћ§ћћ§ўћ§§ў§§ћљ§ћћњњљћћ§њћњњїћ§§ћћњљњћћњљ§ћ§ћ§ћўўљ§ћ§њљњљљњгћњћњњћњ§ћћњњљћњћ§ўћ§њћњњљњћћњљњњћ§ћ§њћњ§§ў§ў§§§ў§ћћќњћњљљћи§ћћњћњћћњјљњћ§ћ§ћћњљћ§ў§њњћ§ћ§ћ§ћњњћћњљћћўњ§§ќћ§њљљюћљњњћ§§ћћњ§ћњћ§ћ§ћћњѕљ§§ћњћњћћњћћ§њћў§§ћ§§їњћњћљљјјљљћњљјјљљњњ§ћ§§ўўў§ћћќ§ћ§ћћ§њћњњўљњњїљњћњћћњњћћњ§ћњљљ§ћњ§ћ§ћ§њњ§ћњўўі§ўў§ћ§ћњћ§§ћ§ћќ§ћ§ћћїњћћњњћњљњњћ№§ћ§§ћћ§ў§ћ§ћ§ћ§ћћ§§ћўўљћ§ћ§ћўћћм§ўў§ћњћћўћ§ћћўў§ў§§ћ§ћ§ћћ§§ћњњљћ§ћ§ћћё§ћњћћ§§ћў§ўћ§ћњњћљ§ћ§§њћ§§јћ§ћћњћћ§§ўћўў§ў§ыћ§ћћњћњћћўћ§ћћњњћњљљњњћќњћ§ћћ§§ћ§ћћўќћњ§ћћќњљљњњфћњ§ўўћћњћњ§ўў§§ћ§ћњћ§§ўћ§њљњњћ§њў§ћў§ўўћ§њћ§њћћўў§ћўњ§§ћ§ёћ§ћћ§§ћњњљљњћњћћњ§ў§ћ№њ§§ў§ўў§§ў§§ћ§§ўў§мћ§ћ§ћ§ћћњћћ§ћ§ћћњњћ§њљњњћ§њћњћњћњ§ћњњ§§ћљљњћїљњѕјњћћ§њњћ§ћўћ§§ћїњћњћ§ћў§ћћєњљљњњљљњљ§њћћѕњћњ§ћ§њњљћњњїћ§ћњїјћћњњ§ћњ§§ўь§њћћў§ў§§њњћ§ћ§ћћњћњњќћ§ћўўјћ§ћјљћњ§§іћ§ћ§ћњњћјњњњљћћ§ћўў§§ћ§ўў§§ћњњў§ћћњ§ћњћ§ћћў§ўў§ў§ћќ§ћњћћњћўњћћ§љјљљњћ§§њњљљ§њљћћ§ћћњћљў§§ђўћ§ћўўћћ§ћ§ћћўў§ђњћљљњљњњљљћњњћћњўћњњїћ§§ћ§њ§ћ§§ћўљњњљћњќћ§§ћћ§§ћўўћў§ћћњ§ћ§ћњћћќ§ўћ§§ћњњўћ§§ћћўъ§љљћ§ћ§ћ§ћ§ћ§ћњњљјњњћ§§ќћ§ћ§§№ћ§ћ§ћ§ћ§ћ§ћ§§ў§ўўњ§ћ§ћћ§§їў§§ћ§§ћћ§§ћќњћњћћўњћћ§§ћ§§њћ§§ўћ§§єћў§ў§ў§ў§ў§ўўї§ћ§§ћ§§ў§§ћ§њў§§ћ§ўў§ў§њћ§ћ§§ўўўћ§§ќћ§§ўўњћ§ћ§§ўўњ§ў§§ћўў§ў§§ћ§ћћўњћћњќћњњћћяњ§ћ§ћћњћћњљњњћћњћћ§ўё§ўћћ§ћ§њњћљљњ§ћћњј§ўў§ћћњћћ§њћўў§шњћћњњ§ћ§ўўћ§ћ§ћ§ў§ћ§§ўћўўё§ў§§ћў§ўў§ћ§ћњћћ§юћ§§ўћ§§ўћћ§§ћ§§ў§ўўї§ўћ§ћў§ў§§ћў§§ћ§§§ћ§ћћ§ўћўўђ§ўћ§ћ§§ћњљњ§ћўўћ§ћ§ћўў§§ў§§ыў§ћћ§ћ§ћћњћ§ћњћ§ўћ§ћ§§ћ№њћњћњњ§ћњњћњњћў§§ѕћ§§ћћ§ћњњћўў§ћ§ћћўў§ўў§ћ§ўњћћ§§ћўў§ћў§ћћћ§ћ§§ўўњ§ў§ў§ўў§ў§ќћў§ўў§ўњћћ§юў§ћћњ§ўў§ўћ§ћ§ћ§§ўўњ§ўўћћўўћ§ў§§ћћ§ўў§ўўў§ўў§§њ§ћћы§ћ§ћћњћњћ§ў§§ћ§ў§ћ§ћўўј§ў§§њљњћћі§ћ§ћў§ў§ў§§јўћ§ћ§§ўћћј§ћў§§ћ§њњѓћўћўў§§ћ§ўћ§ўўћњћўў§ўў§ўћ§ў§§ћћцњ§ћ§§ћ§§ћ§ћ§ћ§ћћњћњњћ§њњљћћ ўј§ў§ў§ў§ўў§ўї§ўћў§ў§ў§§ў§§ў§§ќўћ§ћћљўћ§ћ§§ў ўќ§ў§ўў§ћў§ў§ўўў§ў ўя§ў§§ћўњ§њўћћњћњћўўў§ўўў§ўў§ћў§ў§ўўї§ўћў§§ћў§§ўї§ўћ§§ўњ§ў ўў§ўўў§ўўј§ўњ§ћў§ўў§іў§ўћўћћ§ћ§§ќў§ў§§ѕўћ§ћ§ћ§§ў§ўўњ§ў§ў§ўўї§ў§ў§§ўўћћтў§ў§§њўњ§њ§ћ§њ§њњћўћ§ћўћћњћњў§§њў§ўўћўўў§ўў§ћў§ў§ўў§§ў§§іўњў§ўћ§ћўћћў§ћћћўћћ§ћћ§§ћўў§ћћўў§ў ўў§ўўё§ў§ў§ў§ў§ўћў§ў§§ўў§§ыў§§ћўћ§њўћўћўћў§§њ§§ўўў§ўўљ§ў§ў§ў§§њў§ў§ў§§њўћ§§ў§§єўћўћўћ§њ§њўћћјўћў§ў§ў§§њўњ§§ўћћ§ўљ§ў§ў§ўћћ§љў§ў§ў§ўўў§ўўі§ў§§ћўњўћўўћ§ў§ў§§ћў§ўћўўћ§ўћ§ўўў§ўўє§ўў§ћў§ўћ§§ўў§іўћўћў§ў§ў§§яў§ўў§ћ§њ§њ§њў§ў§ўўў§ўўў§ўўє§ўћ§§ўћў§ў§ўўј§ў§ў§ў§ўўљ§ў§ў§ў§§ћў§ў§ўўђ§ўћўћ§§ў§ў§ў§ўўќ§ў§ўўѕ§ў§ў§ў§ў§ў§§ѕў§ў§ў§ў§ў§ўў§§ў§ўўў§ўўќ§ў§ўўђ§ўў§§ў§ў§ў§ў§ўў§јў§ў§ўћў§§ўў§§ћ§юў§ў§ў§ў§ў§ў§ўћ§§ў§§єў§ћњ§њћћў§§ў ўў§ўўў§ўўў§ўўі§ў§ў§ўћ§§ўўў§ўўѕ§ў§ў§ў§ўћўћћќў§§ўўў§ўўљ§ў§ў§ў§§ўќ§ў§ўў§§ў§ўўў§ўўў§ўўњ§ў§ў§ўўћ§ў§ў§§§ў§ўўў§ўў§ћјњћњћћўћўўх§ў§ў§ўћў§ўћў§§ћ§ћў§ў§ў§ў§ў§§ћћ§ћў§§ќћўћўўь§ў§ўћ§ћ§§ў§§ћ§§ўћў§ўўњ§ў§ўћ§§ђћњ§ћўћ§§ў§§ћ§ўў§§ў§§ёўћ§ћўћ§§ў§ў§ў§ўў§ўў§§ўў§§ўў§§їўћ§ћў§ў§ўў§јћ§ћўћўћ§§ёў§ў§ў§§ћўћ§§ў§ўўћ§ў§ў§§яўћўћўћў§§ў§њ§љ§ћ§§ќўћў§§ўў§ўўќ§ў§ўўћ§ў§ў§§јў§ўћћ§§ћћы§ћўћў§ў§ў§ўћўћўћ§§ў§ў ў§ўќ§ўћўўї§ў§§ћ§ўў§§ыў§ў§ў§§ћ§§ў§ў§ўћўћў§ўўў§ўўќ§ў§ўў§ўћ§ў§ў§§їўћ§ћў§ўў§§ќћў§ўўљћ§ћўћў§§ћў§ў§ўўэ§ў§§ћћњ§њ§њўћў§ў§ўћћ§їў§ў§ћћўћўў§§ў§§њћ§ў§ўћћ§љў§ўћ§§ўўў§ўў§ћ§ўћ§§Эћўћў§§ћўњ§њў§ў§ўћ§ћў§ў§ў§ў§ў§ў§ў§§ћ§§ў§§ћ§§ў§ў§§ћўћћяўћўћ§§ў§ў§ў§ў§ў§ўўі§ўћў§ў§ў§ўўў§ўўф§ў§ў§§ћ§§ћњ§љўћўћ§ћћњ§њў§ў§ўўў§ўўќ§ў§ўўћ§ўћўћћїўћўћ§ћ§ћ§§щћўћўћўћў§§ћў§ўћўћў§ў§ў§§ўћўўў§ўўљ§ў§ў§ў§§№ў§ў§ў§ўћ§ћў§ў§ўћћїўћў§ў§ў§ўўі§ў§ў§ў§ў§ўўў§ўўќ§ў§ўў§ўў§§§ў§ўўљ§ћў§ў§ўўњ§ў§ў§ўў§ќћўћўўє§ўћў§ў§ў§ў§ўў§фћўћ§ћ§§ў§ў§ў§ў§ў§ўћ§ћў§ў§ў§ўўў§ўўі§ў§ўў§§ў§ўў§єћ§ћўћўћўћ§ћ§§ўў§ўўў§ўў§§ў§§їў§§ћ§њўћўўў§ўў§јў§ў§ў§ў§§ўќ§ўћ§§ўћўўќ§ў§ўў§§ў§§ўі§ў§ўў§§ў§ўўќ§ўћўўѓ§ћћ§ћ§ћ§ћўћў§§§ў§ўўј§ў§ўћ§§ўўќ§ў§ўўў§ўў§§ў§§ъћў§ў§ўћўћ§ћўћ§§ў§§ћ§ћ§§јћ§ўћўћћ§§яўћ§§ў§њљў§ў§ўћ§§ўўђ§ў§ўћўћў§ўњ§§ўўэћў§§ћўћўћўћў§§ћўћў§§ўў§§љў§ўћўћ§§љњљњ§ћў§§§ў§ў ў§§ў§ўўўћ§§ќў§§ўў§§њў§§эў§ў§ўў§§ўћ§ћўћў§ў§ўўњ§ў§ў§ўўњ§ўћ§§ўўі§ў§ў§ўў§§ўўў§ўўў§ўўє§ў§ў§ўћ§ћ§ћ§§ѕћњ§њў§ў§§ћ§§ћў§їў§ўў§§ўћўўў§ўўў§ўўћ§ўў§ўўѕ§ў§§ћўњўћўћћ§ќћ§ћ§§ћў§ў§ўўї§ў§ў§ў§ўћћўўћћјў§ў§ўћў§§їў§ўћ§§ў§ўўў§ўўі§ў§ў§ў§ў§ўўќ§ў§ўўі§ў§ў§ў§ў§ўўр§ћћў§ў§ў§ў§ў§ў§ћњўћў§ў§ў§ў§ў§ў§ўў§љў§ў§ў§ўўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўќ§ў§ўўў§ўўќ§ў§ўўњ§ў§ў§ўўќ§ў§ўў§ўў§ўўќ§ў§ўўє§ў§ўў§§ў§ў§ўўњ§ў§ў§ўўў§ўўў§ў ў§ўј§ў§ўћ§§ўў§эў§ўћ§§ў§ў§ў§ўћ§ћ§ћ§§ўѓ§ў§ўћ§њ§§ўћў§§ўјћў§ўў§§ўў§§ў§§ўў§ўўњ§ўў§§ўўў§ўўў§ўў§ћў§ў§ўўў§ўўќ§ў§ўўј§ў§ўћў§ўўњ§ў§ў§ўўњ§ў§ў§ўў§§ў§§ќўћ§ўўќ§ў§ў ўў§ўўю§ў§ў§§ћў§ўў§ўў§ў§ўў§ѕў§ў§ў§§ћ§§ўўў§ўўј§ў§§ћ§§ўўў§ў ўў§ўўј§ў§ў§ў§ўўў§ўў§§ў§ў ў§ўў§ўў§єћў§ў§ў§§ћ§§ўўљ§ў§ў§§ўўў§ўўќ§ў§ў ў§ѕўћ§ўў§ўћў§ўўј§ў§ў§ў§ўўђ§ўћ§ћ§ўў§ў§ў§ўўќ§ў§ўўњ§ўћў§ўў§§ў§§њўћў§§ўўќ§ў§ўўў§ўўњ§ўћ§§ўўў§ўў§ќў§ў§§§ў§ўўћ§ў§ў§§ћћ§§ў§§§ў§ў €ћїљћ§§ћњљѕљљјѕћљјјїљљїѕѕєєѕјєќѕѓѓђђѓђЯёѓ§ўŽ#%)*јїјљјјѕїљћњ§§ћјњљњњ§ћјњљљјїљњњїїњјњњљїїјѕєѕѕјѕјѕѕєёђяђс`3)"03*њїїљљюњ§§њ§§ћјјљћњћљјїјљљ§єћјїѕѕїїњјјњјјњљїњїїљљђѕђяјз>JM:%јљљњћїљњјњљїєїјјўїњњїјїјјїѕѕљјјўњјјїўѕїїєѓѓјјw3JMA>,њљ§§їћљћљћћњћјјњњћћјљјјљј№њјјњјњјїїљјјњјњјјщћњїїѕљ§ш^.%+(2,љћњјјћћїї№њїјћљћљћљјїћњјјћћј§њјїїњлјњјњњјїјїїѕѕјїєѕєї§е[L5,4AїїљјїњјјїњњќћљљћћыњљљјњњљїїјњјїїѕѕјјѕїјјЈњјљїїѓљїѕѓѕћю^-B5;GCїїјјїїњњїїјјњњїїѕјљљћћ§§ћјњњћћјјњјљїјћћјјњїјњјјєїјїѕђёэўѕr<75:@;њ§ћ§§ќљћљћћѓљћњњћљћ§§њў§ћћђ§њ§ћјљјјњњјјљћћгїєїїѕєђђєёv-.:2ўў§њј§ўў§њ§ћњњјћљћјњїїњјљћљјјњњїїѕљјјїјрњјјљїљѕѓєѕћюo%9>??1њјјњїјјїјјћћјј№њљћњњѕѕєєѕїїњјїјјљїљиїљїѕїњљѕєњ§э˜2*@.@Lѕїѕјњњјјњћ§§њ§§ћњњјїљљїљјљљјїњјјћс§љњјњјїїѕїїѕєѓёљєдF!13@ћљљњћљћћі§ћћ§§ћћјјћћ§њ§ћћћ§ћљјљљїјшњћљњјїїљљїїѕѓѓћ§ж9YJE9§§љљјљ§§ў§§ўі§њ§њ§ћћњћ§§ћјћїњјјїїўњїїѕяљѕєёїўыbGL>1+ўўњ§§ёњћћљљћљјљњњћљљћћјяћљћњћћјјњљ§§ћјїњћћјїпѕєѓј§с{:,A:+љћћљњјјњјћљњјљћ§§ћћљћћљ§ћљћћѕјћљјњїїјјњїїўљїїэљѕєєђяєл|>0.1.њњјћ§§њљњњљћјјїюњћѕњњїњћјјњњїљћјљјјљїјѕєїјїїљўїѕѕнїєљћљœG&32њљњ§ћўў§љњњћћјјљјћљљћљљјјљлћљњ§њљјјћ§§ћљћњњјјњїєѕѕєѕѕѓћљj!љјјпћљћјјїјѕѕїјћ§§њљљјїєћ§њљљ§ћљћ§§ћљљцјљјњћ§§ћљњјѕѕєєѕѕ§ћЯ8#%%§§ўћљљФћљњјњћћњїјљљћ§§ў§љ§ћјјњњљљјњјћљњњїїљїїњјњњѕѓѓєёѕћјчT!%1§њ§ћћѓљћћљљјњњїњљљ§§јљјљљћљљћћћњјїњћћљзјњјћјјїїєѓёѕѕљ§чq")(§§ўў§ћљљ§§љљјјћљ§ўў§§ўњ§§њњ§ћћњ§§ћђљњ§§ћљјљљѕїјєѓѓіє§§Ъh5F-!ўўў§ћћћјљјјљљыћјњјјљљїїљ§њњ§§њљњ§њћћћњљњћјјїыѕѓяюђє§§гb<;%њњїѕјљћћњљ§ћљљћћљњ§ўћјјрїљїѕњњјјїјјњњјћљћїѓяяђѓћ§Я8,(0.јјћўљћћјћљ§њњћћњјцњјїљљїѕјћїњјјїїѕѕљїєѕѓёђёѓѓсћуQ7%."јјћљ§њњћњјјћњ§§њљћљљћљћљљѕњјњљљ§§њ§ћ§§чћјјњјјњїљїєђёёєѕїћ§жS?h<јјйћ§ћљљћћљћљњ§њћљїњјћњјћћјњљћћ§њ§њњљљїњїћћсњљѕѕєђяёєѕѕљ§ћ‡#4G§љњјїљљћљњјѕїїљљћњјњјћ§§љўјїїыљїјјњјјњјјљљїѕјљєэёѓѕѕћљѕc@E§њ§§ўћјјљћћљјћћљљ§њљћњјјњњјьњјћњїїѕѓђѓѕѕњњў§РF<§§љќјњћ§§љњ§§љћњјјјњјљњњ§§ћћ§§ў§§мњ§§ћћјњљѕёяяѓјѕєєљћшU)јїїјњјњјњјјљћ§§ѓњљ§§њ§љћћјјњјјћњљјљћћ§№њћјљњњјњїєюшюѓєѓѓ§пЛPћјњњљћљљјјћћљћњћљњ§§ћћљљјїљњљљћћћљћњїљљњќјњљћћзљћїѕэщэѕљїђѕљљйSљјљїїљћћ§§ћњљљњїїљљјљћћњ§§јў§§њњћљ§§ћљїѕїњњљмѕјѕэщьѕїјњљњ§ю`љћ§њ§њћјјњњљћ§§ћљњњћјјьњћљљћћљљњћјјњїјјљјљћћ§яљњїєюууяѕјњљј§ћФ§§њ§ўљјјљцћљ§ћјјњњљћљћњћњњ§љњїїљјњљ§§ћўњїїїљѕящчшяѕїїщњ§уљљјњјћћљћњ§ўћљњ§њљћ§§щўћўњ§§ћљћћњ§њћ§§љћћњњјѕѕјђїѕёцшьѓєѕєє§§ћћљјљћћљљ§§ўў§§ўўћўўўњћћяљ§§љћћљћћљјћћњљїѕѕїљїѕђэтчђїїѓєјћћљ§њ§њњ§ћјјяћ§ўўњў§јљјјћћјњљ§§§ћљћћјљјјљјњјћћщњїјљїѕѓэурщјњјѕѕ§љћ§§ћ§§яљјјљћћљћћњњ§ћљћ§ўў§њћ§љ§ў§§ћжњјљћјћћјјїѕьцшюєїјјћ§љњ§њћњњљћњњљјћљћ§§ўў§§ўўћўў§§њ§§жћљћћљћ§§ћљћїєюыыѓѕјїїћ§ћљ§§ћњїљѕїїјљљћњ§њљљёћљ§њўў§њњ§љљјњ§§ћјьћљћјјћ§њћћњѕђяюђѕјњ§§њ§њљћњ§ћ§§іњљјјљљћ§њћћъљћћ§ћљњћњјїїјћљ§§њ§љјћћіјїящщьѓѕњ§§ћє§њ§њњ§§њњ§ћ§§ћљњћћ§§їњ§љјћјїїљљ§їњљљјїїјјћћшјѕёцсцэ§љћљљјїћ§§ћљљј§§ўўўљ§§ѕћљћ§§љћ§§њўўљ§ўў§њ§ћћы§ћљћћ§ћјїєѕѕєёчждсљћ§§ћљћљћ§§њњ§§њ§ћћ§њ§їћљјћћњњљћћ§њ§ћћјљњљљјћћјјюїјњњьпЭ§ў§§љјїѕјјљљќћљњ§§ўљћћ§ћћњїјјћћўњ§§ўњ§§§њјљљ§№ћљјўьњњ§§ўў§њњ§ўў§љ§ѕњћљћњљћљјљ§§ў§ћњ§ћћљљњњћљћљ§§јћјјњўў§ўў§ўљћћњ§§њ§§јћњ§њ§ћў§§ћњ§§ћ§§ћў§ћћљљ§§љћјјїєѕј§ў§њ§њ§ў§ћћќљ§ћўўѕћњ§њ§§њњ§§ўў§ћњћћ§ќљћј§§њљњ§ћ§ћћсјїњјјїїѕїє§јјљ§§њ§§љљ§њњ§§ћўўњ§§§ўћўўќ§љ§ўў§њћњјћћ§§њ§љќјћљјњћњ§њљјњјјњіћњњљјјљњјїї§ѕїјјїшєѕєєѓєѓєєѕѕєєњўћ’"%(-0*њњнјїїјљћњ§ћ§њњљћ§§ћњњљћћњљјљљћњљњљљјљљјќїјїјјїёѕїєуb2-.7<.љњљјј§љћ§§ћњћќ§ћћњњћј§ћћњљљњљљњўљњњўјљљјѓѕїўс@"EN;+њћћљњѕћњћљњљјљјљњњљњњћњњљјјњўљњњљўњљљцјїњўўu5HMFC8љћ§ћ§њћњћњћ§ћњњўљњњўћњњћњѓљњљњљљјњњљњљњњљїјћўюd1+$77јћњљњ§њњљљѓњ§њћњћњћњћњљњњўћњњљїњљњљљњљњљљњщљјјїћўл[F9)9<љљјїљљњњљљхњћћњћњљћћњљљјљљњљњћљјјїїјљњњчљњјљљњјљјѕјўєa2;7@HEљљњњљљњљћћљњњћћЯњ§ћњњљљњњ§њљњјљњњћњњљћњљњњћћњљјѕђє§ўtB2GJIњљњњљљњњљњ§ћ§ћ§њљљњљјјљљњјјњћљњњч§ћљњљњљљњљљјїєєњ§зJ(*E50ћњњћљњњљ§њћљњћћђ§њњћћњњћћњћњћњњ§ћњљљњљўјљљјїъѕѓїтƒ<(;89љљњњ§ћ§ћљљћњњљљћ§љљћљњњљњњћњ§ћњњљљїїљљњљљјўљјјтѕїћўўЁE$43љћ§ћў§ўћћљљњћ§њјњњћћњћ§њћ§§ўћњњў§ћћљњљјђљјјїўўr& &ћњњўћњњђљїјјљњњ§ћ§ћћњћћў§ћћўњћћ§§њћћуњљњ§ћњћљњњјїїјјўўб;%)+ћћ§ћњћћѓљњљњћљљњћћњћ§§§ў§њњљјњњљ§њћљљўјљљњэљјїѕїјјўўяY"-3§§ћњњћњћўњљљћў§ћћќњћћњњїћњљњћљњњћћ§њљњњљ§їѕјјюћўэn"(#§ћў§ћњћћ§ћћњіћ§ўўћ§ћ§ћ§§ўћ§§њ§њћ§њћћ§§ќњћњјј№љїїѕєїїўўбg1A$(ўў§њћ§ћњњћћњэљњњјјљњћћ§§ћћ§ћ§ћ§њњќљјљњњљёјѕђяєїўўеb8:")љљ§њћњњћќњћћњњћ§§ћ§њњњљјљњљњњшљњњљљњњћњљѕђёєєўўд<-$73њњћњћ§њ§ћњљљњ№љњљјјљљњњћљњњљљјјюљјїїђяђѕєїўыV4*<3њњўћ§§§њљњњі§ћ§§ћњћћњћћќљњљћћ§њњ§ћ§ћњњъљњњљљјљїєѓєїјљўўзL8cLњњћњћѕ§ћ§њћњљњњљњњћљћњњ§§ћ§њљњњќћњљјјэїєѓђїјјњўўƒB>LIJ§ўћў§§њњћў§§ћ§§Щўћ§ћўњ§ћ§ћўњўњ§њћћўћўћўћ§ћ§њ§њўњћљњћўчkYO,JHWњ§њћњћћўњћћ§ёћ§ћ§ћў§ўћўњ§њўћћ§§љћћйљ§ћўћўћўћўњ§њ§њ§љљћўўpCUM[\[њ§ћћњ§ћўњ§ћћцўћ§њў§ўћў§ў§ћћў§ў§ўћћњ§ћ§ћћќўћўћћќўњћљљўѓŠNHMYYV§ў§ў§ўў§їў§ўћўћў§ўў§§ў§§јў§§ћ§ћўћћуў§ў§ў§ўћ§њћјњјўў‡,2PLNTўў§ў§ўўј§ў§§ћўњ§§ћЕњ§ћўћ§§ћћўћ§њћњўћўћ§њўћўћўћўњ§њћњњћўўƒ5PUa\`ћўћћњћћўћў§§ћўћўћ§§ўћћљњјћњ§ћўћћъў§§ћ§њ§њ§њ§њ§њ§њ§њ§њћўўгБIC[]^gњ§њўћўћўћ§§ў§ў§§ћўћ§њ§њ§њ§њ§ћ§њўјўћўћ§§хћўћўњ§њ§њћњћјўўю]*?UM[ћў§ў§§§ћў§§мў§ўћўћ§ћ§§ўћўћў§ўћ§њ§њ§њўћўћў§§ћўњ§њњщљњљўўщM3mcYZўў§ў§ў§ўћ§ўўў§ўўљћўћ§§ў§§Дўћўћўћўћ§њ§њћњ§њћљњљњјўўњz^gSLCўў§ў§ў§ў§ўћў§§ћў§ўћў§ў§§ћўћўћ§§ў§§ћўњ§§ўћўћў§§ћљ§њ§љњљўўљ—TE[PB§§њўћўћў§§ћќ§ћў§§ћћў§ў§§гћўћ§§ўћ§њўњўњ§њ§њ§њ§њ§њћњњљћўњ”P?NTQћўћ§§ў§§ћћь§ћўћ§њўћ§ћўћў§ўћўћў§§ўўћћэ§љўљ§ћ§њ§њ§њћљћћњњўўіВ`0AJIћў§ўўі§ўћ§ћ§ћ§ћ§§їћў§ўћў§ў§§Мў§ў§ўћ§§ўћ§ћўћўћўњћљћљћљњўў{;)&FH§ўћў§ў§ўћ§ћћљ§ћ§§ўў§§ћћўћў§ў§ў§§ћў§§тў§ћћ§§ў§ўћўњћјњљћўўпQ1;AIўў§ў§§оћ§ћўћ§ћћњў§ў§ў§ў§ў§§ћўћўњњћћ§§ћўћ§§ѓњ§ћўњўљњљњњћўўїj84>B§ўў§§љћў§ўћ§ћћі§ћ§ћў§ў§ў§§ўў§§чћўћўћў§§ћў§ўћў§ўћ§њњљ§ћћўўљ‚.2<;§ўўі§ћ§§ўћўћў§§ўъ§ў§ў§ў§ў§ў§ў§ў§ў§§ћўў§§ьўњ§љ§љњљћњњўўн|GWC8ўў§§ў§§ќўћћ§§єћўћўњ§њў§ў§ўў§ў§нћ§ћ§ћўћў§§њ§љљѕљјњўўх|PN4Cћўњ§ћ§§ў§§ќў§ў§§ўћ§§бў§ў§§ћўћ§њ§њћњћћ§ћўћўћ§ћ§њљѕјјћўўуN@8NFћўћў§§ћ§§ѕћў§ў§ў§§ћ§ћћиўћўћ§њ§њ§њ§ћўћўњ§љћњ§ћўњљјљљћ§ўћh<FдысдбЧЩкедаУНТгаЭЯЩЮдпххуцчшуртзмцььхцмлпнсщђючкаЭдйх?;(!)(FJ-(ЕљэлЪЭекдадЮаеЯЩСОМСгчусхэюђђщлйзуььцлкмдйлсщёщпдзкпн4-(&#$CUA-<™яјтррƒтмдтцтннжеЯЫЩЦЪллдппучлтремсцхрпйбЭзцучьпекухх(,0.*"#:BJЇєїшухтцсхсчшшычспбЫбдайлдЮгртткмндмэщрщыпкнчыщшчрппйB?;;7:5294QZЉсцщшчмШлхтхццттйЫЪббЮбШРНОЫйлйнрпзбчытщуйЭлптмсзЦРл+;02(*AxrCзсыцчгЧЯрр€:лкнзжФЮйкдкдУЖЕМЩЪЩЮйнснцыьччййелпттзШОЮ178.4%+GM*gНапзлбгйнуцрлзШЩайрцхрйЭСТЭййЮЫЭЫнрхснцхсрсшэыыэунб3.AMH!899oШджйслбдЮЯжйлЮШШдменкЮЫазлржУУНжхщёьштшчцщыююѓѓёярк- !&A:TпёаЯймгдШЫжрпрпкдпухдОКОТШЫОТЫЦСЩаймгкхуйлтчыыэышкд$32.AEЄяєхйлдгЯЦЩжрцчщшучшхкгзжбзЫЫФФЛДМЛМгкеЭемкпщуустур&)%!.$#+2dжєчмм§тхмм€хычнжейдншрмдйжбКЏЖАЋЏОЫШЩкпеддншщхчцскй0+.)$)!"#)$<:UЈющпршщэусуыхпнЫЩнхнйжзЯЫЮФЎЗЏЊАННУЦЧгзйЫекллхщчсп"#.)&1+$"%1?bхєїэёэёёюьчскЪРЩФЮЯЯйжЭЭббЭКДРЦТАЖУЫлкнлррслкзтлп#.,)5+%1+4L›яјщрпмлжгабгЪСУФЦРРФШЧЮбпспЮМЏИДЕМЧбдмхььппзезуу14-$13%%5;OF>@hЫѕпкжаазаЮйдЭЭЫЫздЭЩдктмнмкаЫУЩЫбйФЧШасллюђчєяеУ0,70(($3,$"8+HŸхьхррзаЩЪдмрЭЧШгЮЫаеЭЪЯЮжжбаЩегкхдюОЂЪУШЩОЁ‡{YC7$,$!*%$0:;@qзїєщэскпрруцркйЮТЏБЭытКЛШМЕЦцьЫОЌЄЃ„L@SaV<@QMB5!%&&0.+$.AA*3\ИљјёьэыщууптяєїжбждждЄŒžЇŒ[LIG;978?C**CQG3ANL?A)#%(!(E7>38jєљёэыѓђѕёсшьгЅgg‚cM)4J>:?<0@9-1%3$+8AG)2G.?G#$!)&"*<) Œљ§ћёюйНВŒunI&&O;C<57G>EIFG38<;4848.ZJ\9?-",B<5*)$(0"*+ $ŒЋ‰`]WF@CAH&->>3;85;`E.72.9:M$+,IEA@%*3,911SV:,(%&(+("#+%(A4%+10&*11&&"$!.Lp?2**#$!.0+.0.!**G<52&%$##% )&.("37<,%-1+ #"  2473*)470),8.&%(!"""",:-b,4?&:-$!,)&$.+0++25,& ".-+4+0-). 28!I:<^VдY…mS7:@*($"##!.1*"*8717034+(%)*23%#1$&!!47.2#"22@§Жn;>"%.&$%&&9T*2:E4)4#0N@7&.!&.0359,&(+)PjG2§ФwnE3#*$&# .+"!*,*<32#*7;B8**35:@BA@94>;E;BJJH?MLGE>495>;CILHPPLB>B<@GABBEABA?HJIC:њљ§§ОkBC?09.048%!+-)!"%4<5713HH:;CBC@CA<>BA9>9<;9>@A<7"2:?>8?Sєєїћ§ђЅ]7-329UaHF3++17::9>C?HBOQPHCA?#)0B39?A$*>VCJQ?,JSOJedqЇЌЉђєѕїњћ§зjQ8#2;GA.<<5*39AGSIIJSSJA88IP3>[N43B<9i}ŠШЭбсјћїѓєёшј§љюєїјјњ§§гФp+2?d[EMJH?GFNIGL9Y`28@58Qg}‡ŠДлѕьупњ§ћјјњњјјєєѓёюТрљ§њѕїў§§сЩО…QLLaS25TFHBE3>OS^”РСЭшэѓ§љњљљјѕєћћ§јјєєўјѕѕєѓЯѕНЈЕЯєћњћњљєя§ћЭ~`U-%BmYLPmŽКгптэђњњѕѓѕёыьяюђєѕєѓѓбяєєїјїѕёѕёѓєѕЧЋ’‡ЄЭђтлммсЗЋЇЇžŽžБЖЈДаѕљёђѕѕђёђђћяёѕїєєѕїЮѕѓєєѕѕјїјјћњјјћэзлуФ™ТЫЫЅŽСЩА›˜–Џдхжрхыј§§ћєѓєєѓђѓѓћѕёѓєѕѕїїљїјјїїѕљїїућљјѓюяєћшШгйЯБФЫЯБФУЮгкгрюєѕђђєїїѕєѓђїјѕјїїЗљњјїјњјјњњјњїљћјњљ§§ћѕїєѓяяэцчхьшпыхнжряяхьяєєљѕѕєѕїїєєђђѓёѕєєѓєѕјњјїјћљјјіњїѕїѕїњјљ§Ј"%-24;+HkHeьўјєєїєѓєєѓєѕєїјѕѕєєюёёђѓђёѓѓєѕѕѓєяыьыяяђѕїѕїєёэщяђёё&),*?BSE[>[юўєїѕѕєѓєѓєєѕѕ№їјїѕѕєѕѕїѕјїјјїјјъїјєђёѓєѓєѕєєђэьюяёёђ#))ёAFC?A97348$Ch8>FS>LтўѕёюёяюёёюяьђюяюыяяђѓѓгїјїјјђєѓєѕјјїјїєєѕјљњїѕѓѓђєѓC-)",(*NQ1&КўўѓѕђђшёђяђёёђёьщчыэёєѕѕєјїїѕїєєўѕїїўѕєєўїјјѕаєѕїјA8%&)AYF2BЈўўїѕєѓѓєїѓєїѕѓєђёяэюёюѓѕѕєєђїѓёѕѕњїљљїїѕѕдљјѕѕјѕєїѕ22547+34>NYЏўўїјѕїєїѕїјїїѕјљѕїєђёєђђюєѕѕљѕјєєјїїјћљїїєѕѕъјїѕјїєѕA<;;BA7>BHSœўўїїќѕїѕјјћїѕїїѕѕъєёѓђђёђєѓѕјјљјѕїљїїѕѓђђтѓѕїљљјїјCA42Cm[}Qnˆ™ўўјїјѕљїљјјљђѕѓєёєђёђяююёђѓѓгєѕђёѕѕєєђѓёєјїјјїєєѕFB:E>>C:SeИўўєїѕєѕёѕѕєїїєѓёђёяяђяёёюяяАёєѕјѕѕїђѕњјјєѕѓїѕјєѓяёё-(004$&4;~wHŠѓўјєёёяђяїѕїѕєѓюѓђёђѕђђюэюђѓєєѓёђђѕїѕѕјѕїєѕїїлєђєё2:<>;))13@N,zьљєѓђђёёѓєѕѕѓёѓѓђєѓєєўѓђђьѓђяёяёїѓјѕєїєѕѕјјїјљљлјєє1??JN+#3vьўђђёѓєёѓѓєєѓѓёђёѓѕєђђ§юэююяэыюьяѓєѕёѓєѕѕєѕѕїїФјїјє1 %15<<$[эўѕѕѓєѕяѓђёєїѕєѕѕїјѕєђђяяёюѓяьэюээяёѓѓяђѕїѕѕзєѕѓѕє+<477CPДўўљєёђёёєѓєѕїѕѕѓєђєѓђѓѓыэяэяыцыэёєёђѓѓђѓѕїєјїїєю,&**%!&!0&.7+pѓўћєєѓлєђѕєѕѕєђёєєђєёѓяђюяэыщццыщяѓђѓѕєєѓєєѕѕЅєѕє0231##,$$!+E@]Жўўєјїјїјїјѕѕѓюёєђѓѕєѓяёєёюьтчщььээьюэёђєѓѓђєѓѕѕїї"(0.2570"%)-InёўўїєїєєѕѕњяююэђёёЬюяэююяьэьчхчьыщюьђѓїѕїёѓёєђїѓ"#(47,!$)2*55QЃўўєѓєѓёёјђяэыэюяююяьѓяёюёьштьюяяьёђєєѕїѓѓшђјљ"(,-()#&)19JJBCiпўяяђђююяђюђђэюђэяёѓёђёєђђСюььэёюѓыщюљѓїўў§ўўра17;5.&(,.*5(&<,MЊўўљѕєѕѓєѓђѓёђяющыщьэёёэюьээ–ђющёњљўхОрмнрйТЈ‡iT*3(#,$,*(0:;rўўћєѓїљўўђёѓрЉn{”ŽuU8@WFBLC9BG5,4F49HNG:!8O3FL#,,є"0I8, "‹ўў€њјтЦК‘‚rQ++YGBC5EWIJVMG9>ABC:998[Vd;;52),9:>*10,(,.&57-#Ћ…bd`MLJHL)4C?89>:CpI5C34+*1>Q.$7;3WU;4+-.**$!&.9;83%(*(%)B3)5841*+,,%&&%)5FwB:5..,.37:;51.?HAA22$$)#(#)%#&,%*.*0!!490**$(*"&($(*(  $,,5880-7<7(("$.5;,,&,,""$)$(183-c-?C*B2()*)!$!$+0),,-80+-+43$&*2>>850&.3*<83*35+)88€д97-"),$7H@7"*$&:>:501-$#!+3UE<-$(,1-4::433435[jJ2ўЧ}qI91,$##!",$(021+&1083(1)*7C@+2*4AA>:9BE@ASSCўѕТЇЉx8"%.-)#-,&(*.,((+58+9:724;89EE<>AFC>BAC@@CMNFFOLўўШпh>4*.%*)*#(%!%+&#%24574BF;;8<7>@GFCF@?@:29A<<9758:;AA9€Ш7љ§ўўЦqCH;+7229,&+,$+*+,.9>@85COE98794;@><><;8991499><;<&3.;7482@HFHJFNNJF@;:FL.@cP75>?;bz‘ЂЪбелѓљєѓяђыћўњёїљњњ§ўўгЯw03Cg[@HNNJ@HCBB95WS35;83Ue|—Клђыср§ўўћљћ§њњ№ћњїјєєѕФнћўўјљ§ўўйЫУ‹VHJgU3>PEJ9B0?LP\™НУЩщёїўњ§§ћћјјњўћїїјїјиЛЉЖЭј§ўў§ћїяўїЭxaJ29gUIJhŒМЫлуёѓў§љѕѓєѓѓѕќљјїѕѕї§јљњњкљјљњћјСЈŽ|‹ŸЮѕнззптЕЅЁ›—‰›ЈВЉЏЮїїђѓјїєєѓѕєєїјјљљїїјњљљїјїїѕјјїљњњлљњњўыжжсО”РЯЩЁŒОЧЇ—’’ЎЯсдсхьљўћўїјїїѕѕўїјјўїјјљијљњњљљјјљљћњћћѕђђѕўщЫажгЏТЭЪЏТНЩездрђѕјѕѕљїјљљјїѕѕќїјїљљбјњњљњљњњљљњљњћњњљћћ§њјѕїєѓэыухцшхрчцлзнѓэцяѓїљјј§їјљљїєѕїјјїїѕїјњљњњўћњњўљњњ§љњћћ€гB9HPGQC]aqёўћѕјљњїјѕїєёёђїїѕёчыыьяьыюьѓђѓюёэщгЪЫейцёљїјѓѓьѓяїєїB>CGMUcWgOgљўѓєјїјїљєѕїїѕљїљјѕѓђяёьѓѓђѓѓѕѕєїјјяюшыщђѓљјјєєшьёѕѕјE4FHJVWUPH{ўўћїѕѕћєљѕѕїјјљїјїћљњїјљјјљјїјњѕјїјјїѕјѕјѕїѕѕђччёђєёя>FGPVMBoqWўўїјњјњїїљфјїљїљјјїїѕјѕїѕѕєїѕѕєљєјѕљєјєєжђьєяђющчхсжG@JLGOG^qd‡љўњђєјїѕљїѕєѓѓєѕљїљїїєњѕјїјєѕѕЭєїѓѓёючхяєђѓёяэхйкSHGJHL;HbkG>ЩўўэхцяььхчсышсйлЯЭзьђѓѓєїљїїѓяэяёїјѕђёюьяяђњњјюшшёѓїQPO@?F\qaMUДўўђѓяєђѓяяєєяёьяцумтпяяєяєѓѕяяэяэяѕєюѓющцэёљєїячёѓёєHGHGIGB@T[gЗўўїѕђєєїЛєїєјяючььшщьщтьѓѓїяюэѕѕјѕїєєёѓєѕїјєјєѓђѓaZWU[[INUV[Њўўїљїђєѕђѓїљѕјѓїѓѓюєюяэшпкяїј§њјђѓєїјјИєшчщђђїљњїљѓюZOQ\^‡r˜i‚œЌўўєєѕїђѕєљїњѓїєјјѕёютэюячрщяѓэєђюшыёюђђяэсщєєњјјмљѕїYUO[[@CZb7}кщђыьщшэёѓјѓяцхрхэєђїђђцззсхщлпхцёїєуюїђѓђђєљљїїѕюуWP\jmA>9COSO‚нцщчѓяыьчтьэђчукььэюёцтхыяёшегжщѓєјїѕђђѕјѕљѕћњњјљђѓI9)&).A@JWI,gљўэцєёючттяяѕѓђюєѓѓєёпакссхктухссмшюэыѓђёђїѕїљљїєюь08.-299GJTGP]ИўўїэюшмцтныѓѓѕѓїёѓђѓьэьюшустмйгЮзггчьыпцэюёјѕјїєѓђCCHFE>B??AEQ:ёўљѓёѓђѓюяэѓѓєшэыююёюыущэюлабШСШаржньёяюьѓђѕђјјѕёяI@EEFE9B8BGYUqТўўђєљјѕѕїѕїєюыццяѓђяюьэчщлЭЯЭУазпкзекшщхыцьщѓѓјєѓ27CQJPCB@9B>?]{ўўј€ЂїѕѓэрммхчууюччсьукЪЪЯгаЮЯзншюёђѓёѓяѓђєђёA;@HCJBA>CH>IH]ЕўўѕєєѕюячшьыцгечкмзлзртшьѕёчнЩЪЪамтыхяїљїёэюыёѓћGJMJE?>?C@`eeTZ|уўюяэччёяцьщщххтыыррьёёѓяђьхнмттсюскмхјђђўўќцжGMM€šJF@A@L@@AO?`ОўўїѓђььучшьэчрптпрхчрмхцщчцшхцуыњюўгМрдлтзОЄ”xbJ>>E@H@E:><@NQOQ…яўўјљѓэюєђђяђюящйШЪрўљддрбФкљ§хгУДБ˜bTj„oSYjdTH32:B:GIQOIHQ[]JMqЪўўјїїѕѕёђёёўўЭщпыёѓэМЎБЛžu`[[QJOT``BC\jcS\eoWV324H4GNMF<9FoVPHI‡ўўќљј§ўўЧёљўчЏz‚œЁ]>MaVS\OFOUGB:SFEWcUB1McNTi-,@CBGBC;7(BSM8#(Ёўў€щяжЦЁ’Žc>:eTVQCSgYbg]cNSSNIILMTqeuZMGEJ@N\PEMIQC<:3C9H>81#7žМ—qut]YbYg8BVQJTPUW‚\MYIJIBHTcG18GNW[]]FCHAOBMPU?HJFA93;A@BB@%)EETe[LZiZO>.;EIJJ30H?).rLGAFHHF5"#@OFHAJF9AC>@B;C8>JIOYTWOBriQFFAB?:?AF<<9O\YJEL@IC;HNSUJFJMJ[TQL?9>><;C>:<:B?<2EHEF>C,1QHFGEFE>@5>3,2B>A(&*?5AINJNJCTEG739@MSNM81FE?-5@?LWQBn+@USBTEG?9;?I.7*4;89*2::BE707<8:91%CJMLAIIWUNLSHLA89BHAIHNBILL98UhTH<947CN^\ўЪ‡SO2<77E>>49;79B@EE<>>BVpQPV\QNLBC:<03?LeWTIMGGEPOQUOJFIGFq‡eLўд•ˆ[N?J@C<7:?338>A44*11G5IPLL?HJPIGFHG?QVQAFLLOUTWSOMOZUQSdbZўўгСС—H4HGFC??9A@JGFG]ј§њўўСМtH;EF\n~b[NILEJNYSUWYVTU\PNON<1-3GLEEQ88NgQQcM7W[ZVop„ЕМЎљњљ§ўўаь{hO\h\$*48@V[djHTEТЕƒ[;A2@>5QVObeF>J]PZL11IGQŒoI0:C>.&4.*#2P4EpA,;15c5*E2*B]00C9#&^`<8:-.?UC.382AHE&:5,4AIV‹qB:CFHC43975$>;`pEFA40*,4BIE<9:;C:A.CNQnP&33*12<>.<0H<)Pmwd84??;.05,*)&,7C2%.91008AQF55BAC<324!"#!-("!)#(*Fzv)NiE ":98*+014..1&#$1943+%,?G8023,.#+(&+)5)*475EH@5EtjI5:0;+")5,55.1*0&(131$*()2;JH82))-"!PS*,&$(%,,"(:;:>;Jh]G5@584*..30*$32-271#11#$.TB:7#&!()$[hJF#+-01.LT4##2(+1--&4)4E+1+&7pH<,43B@>@9++""7AEEF>-)$#,74+A %?@38&4>P:*(*(13,)"*&0<,(0"5@Q4(*$$!..0(%+*8 )A&4,,(!(18*$8?:3501.%(+84@C<8#4#..889#4FF@A,*(("!)+#&,9[v˜B!%+%92+)*&%%,*$,-3-)+,0-.7N?)#489:&00)2)4-303+-,*--€ы&Lb•h4,(9948@:0)&3.").;?:A?>4"&!3*2;LTƒU28;4,"+4BHEELI@<8GC@809??:71:3209?>,38;:84;& *:Y@158>@GFA4;;$&OY[>@A9480?GLGOHEMIC.+2720188CAG- -aIPO?8,&;?:4?9;8<]CAHIA8;<<@ACA>?A5.49:18.289AA8..)$;*?JLONIH?48E;99C>>8818(%.2AFB74:3;A74::9?AGC19A<@:895.-7AG@7,I7NYQPUYPJGBCEE@CEIaVO@8948CMIG[^8?ZVMWWGHpu^VWPMH:BCNMMSIHc@.H72Nh77?>&1gp<L?A+84%!;>IO•v;>@JI>9;A<3*F0^|MEF:3:259ABCA<:<>B>8FPQuU"28@1(.47<;8,5%F;)Qo‚i8+BF?*4;3)-99:?99@;;€47GML84CE>;>?$)5"()(**244*223@ƒx7Tm@784..0+(4;5.32589<7127?F?45?;+.*:3033980#"##.3;AFFC(0($,.*+UW283+,,040-325AGA8OmhG;7<9&#,97.083,.-7815232%+.`HB:7++),..[mPB2;54<;PZ?&.++)24-5;4:N5+.+!:pIA44-::A?;>0!&&:GIH>A8*$*1155>07??€§9>BEU?0-+,2:5-1**,480),2AV;.(&#&)94-35+$+5#,L%27*#*%-<5+G@8;:91.88315:AIG7211:975$;JM;B,"%00&+#(@bzЂG"452,--.)+$+4+*099<;95440&:N9237<4B$01.)50.8472)&()$&)(Ogg827352:A><)+4535>CAB>E<8,&%&?(&8<27@GG<45b<;12:?9-%.%2->8058.9>2-0 +I099€˜:>;@@>57;1$1>EVC)%78BIHJFFEBEHNF??>08517<<:799;?:28<*(C\?39@AHLPC@<7%&SYVEC?737?CHBGJHHLE57;AC>83982:55:5588.04<5;8;79AbGEI@<@><>AAЧECCB90.9A@97284(%43?AB@>@;:4*7CINFA>>;;€О53;CGCAB<:5>?B<3.3:?HHE>:FGMYLNOSJCBAECCGBBHe\PC<9<>8@32&8ZOHJ25BENLLT]8?][Q]UELqqUQLFHE:AJGIMFJF;G[jrMONj`pmHQUEHe`Ž„ˆzoŽЎЊЉИРД–‡kQQbbC08:8O`Q@GHL>;8CHJLTOP;CCAVBFMLJFCNSTacUP@HAG>:?pvFHHG?AG9Jx]TPBLIC?BG@uˆhdIMIOLL`mU3A?ECQHEGMWPO[IMGF;UŠ`\HFLV\WUVOJI8JCP^\j`IN>>ABOIN`<%,MOVN@ON\pQE@AGHHUJJFENNECEBCWiW?BFB9HGGPICB@AU:*EbEMOP>BBNOOFB@.^TSLLFMJFFQQUOUa]ZIO@EIAA?;F3W|’ЏY&5LIGAJHOO>>CIEPJHHLVWGQOPB4PjNONFOOTA-IGAUFFHNJNFF9>Oo]ecNHTWb[]rrHYvxpp›`bˆƒbaZWUMHUYU][^]aP[nƒ…^e^|vŒ[kiZZwqžž‰ЎЩРНгпЩЌ™‚heu}UECNJevdGLVPJMIJdpˆONYYa\[z—‹•ЊШСУмеЩНЖЦЦРўўэ§шЦЕТцїгЉЁЈ‹‡”гнпњўўлgbzŽЂŽvˆЂ–˜ЋЇЎЅЁЊ’kp›ЊлћєччарыгТаѕўўАюлЏЗЏ˜rŒЛЊЏ‰Ž—ЋЫїўўћјјљИЕЗЩЫаРЈБЌВИ’ЂŸ—ОДЊБ’id|ЖЫŽiwkevN7S™ЇАЎž}o|‚mЦлЮЦУрљўўю§њњ§њ§їєћњњў§ўўїєўўЪѕмхЫЩїљуМЋбѕЧЋЋud}}~—›ЉЏ›ŸŸЛФЖЩКЃЛрьњѕјўћ§јћљћљњјњїљјљљјдњѕљљћ§ўўњѕўћјєээў§шьжЩЯУЭЮбмьЪЖВгСпяспђјћѕљјјНњљћљћїњїћћ§љћњ§љћљћњћћ§њћјњјљљћљњјњўўњѓцчыяїўњћѓуцѕјўњїїњїїѕљјљљћјњњј§њњћўћўћћћўћ§њћћ§њўћћх§њ§њћљћљћљњљњїљјљјњјњњљїљљјјўїљљѓїљљћјњњў§ў§ў§§цўћўћўњўћўћ§њ§ћўћ§§ўћўњњїћљљё§ћљљњњ§јњјњљљјљљўњљљњѕћўћўћўћ§њћ§§§ћўћћ§ћ§ќћ§љњњьљњњљљћљћљњјњљњјљњћљњњ№љћљњњћљ§њ§ћўћўћ§§їћў§§ћў§ў§§сўћўњћљ§њўњћњ§љћњ§њћћ§§ћћ§ћ§љћљ§§ъњ§њ§ћћњ§ћ§њў§§ћ§§ўћ§ћ§§эўћћњ§њћћўћўњ§њћњ§њћћтњ§њћљћљ§њўћћўўћўћ§њ§њ§ћ§ћ§ћўћ§ Xџўˆˆ ˆџˆџўˆˆˆ ўˆџџў€ЗжрсскмдбжмцчскшШb0BVPGAAFEC:-2@FB5mћ§їјљљћљљћњћљљ§§Тћў§§ў§њћљљћћљпьычржмщщшптрёк]>U\P59@A7>.9CMUF9„§§їљћ§љћ§љњјјћ§§Юњў§§ѕјјљљћ§њњрхэяхзйлцчзрыячmFb]\T;*),3;HHLS>>•љћјј§љј§§§ћў§§ќјћ§њњзўћўћэлцьынухсцрршянmAHLHBF><49A>AC??:‹§§їїўљњњ§ћ§ўўћўўењ§§шчцнеЮжрсплгнєсo?OP3+,+897.;<<152pї§љњњјјќњљљћћѓљјїљћњ§љ§љјљ§§йњулрЯШгйцрлпллѓнwJE>;4(2BQ-4:;1BUJVы§ћљљђњјїїѕїјљљјљњњ§§ћЯљ§§љњычслгЪетэпкЪЫэпrCLZEBGOT@A?789:+2:Аћ§їјјэњћљјћљљњњјћљ§љў§њљ§§гмншюэпзлдззяѓ–>LVMB:38:MchЦ§§їјјћјјљћљ§§ўњ§§бњ§њљњ§јјтмрчшшуштнждїїEY^TF>?>>C;99CEI1QЦћ§ѕїјјћљћ§ў§§љљјїћљћ§§№ћљћ§њњтхёїљѕьтхуухєрZ1QTJB,>:<44--7bwUUељ§їјљљ§ћјјљљћљћљјјљћј§ўўтюєїѕѕдяючушёФP2GNTC?9CIFCAMHSF-Hд§ћїњјјњћ§ў§њ§§љљћћ§ўњћљ§пђїїјЪѕєѓї§юz3-YJL>;:9:5?894,NJ…ћ§ћљ§њњ§§љјїјљљ§ћљњјћ§§ўћћњ§§еьюєєѕєѕѕєјћћЊJBNSL>75,421A:B:E@CGAgЌћћљћљћјљћљњ§§Эљ§љљњ§§ћ§§ўў§љљћ§љ:B<1.0JPESOJ??ANJ,1(*,;325.81+Wжћћўљњњћюљњњљћјјњїїњћњў§§љ§§н0FLSGELF9>A79:?792*)$".4..394§§єѕѕ§їњјјЫїѕїјњјїїѕїјјїћ§њ§њўў§§>8;?@GE8:9:;93947+*)-07;:;@B0(7:8?C>@0:-:33:<<.A?9AКћ§њјїјјћљљћћљћјїјљћљњњїїѕѕјїљћљ§§Я)488@981785M>-%$)-;7;:BGCH)4ž§§ћїѕїјњїїљїњјјѕїјљћћћњ§ћћ§§љкњћ**,5?AQPFiNB>4$!&$)0345•ћћ§ѕѕјјћћњћќњјјћћЮјљћ§§ћљћљћљјљ($&!"FEF93+&2@>945153,0)-.17;@<5^Рјљїѕїїњњјјњњјјѕїјљњјћљћљљ§§ўњ§§тњ§15>8ELLJ:3.9>9-.5).8T\Е§ћњѕїїўњћћќљћћ§§эћљїјњњїљјћћљћћљљћ§њњ§ч.?98LF@>845@aUBBE)3cЪў§§ѕѕ§їљјјШїјїјњњјћљљјїїљњњ§§ћљћћњјљњљјј5NJB7,80499O^97^[^Ёю§§њљїљїїћћњњјњњјыїјњјѓјњјјћњњћћјљњ§љ§ћћфљћUWNLHB;%:A?ENYF;‡ўўћћњўњћћљњњљ§ћ§§ўћ§§ћ§јљўјїїфѕљѕњўёtC\YO[C:58>CENSQ9B–ўўњњ§ћ§ћћўќ§ћ§ћћ§њћ§§ўлїћљїєѕєѕљїѕєњўљx>8F@AA@9<:3.HV89::4>TOWэўўћћјљњљљњљњћћ§Ыћ§ћ§њћћ§ћћљѕѕїїѕѕѓѕєѕђѓяўѕxAGOCBMO…U1A<@GL\Qvћўњњ§ћ§ћћ§їўћћњњљћњљљнјїїѕєђђѓѕѓѕђы§щw8FB@JФўўљњњыћњњљљњћњњљћњљњ§ћ§§ў§ўўкѕєїєїѓѓђєѓєђјѓЃ2-7B<;AGF?<;>?>84;Џўўљњњ§љњћћљњјћ§ўўћ§ўћћи§ћѓѕѕїѕєїєђђяђўўЅ@F]IC;?;8:B@<54FdnШўўљњњћќњћћ§§ѓћ§ћ§ћ§ў§ћ§њїјјїпјѓѓђѓяўў”EQYJA958;CF8;>?EFEBNMYI+Jжўўљљњњљњ§ў§§ћњњ§ћў§ў§§ћўћїѕљљїхјїѕњўє}3.LE;BC>98<:>9<0NLŠўўћ§ћќњћњћћјњћљњњ§ћўў§љћ§ћѕїїјјнїњўўЋPEGHGB833)+7:ABB5@OЇўўњњљњљњљњњњћњњћћњњѓ§ћћњ§њћћњћљїјјўљўўчеg12>FC>9841-9BFLNPM@Шўўљљ§њјљљўћњњћћ§ћ§ћћњ§ћњћ§ћћјїлљ§ўўїнЁbN8-GG@>@>7,7?M-&)A>@:9?@:4742?@GFEEAEoЌўўћњћњ§ћњћ§ћ§ћўћўў§ћ§њ§ћўў§ћћњ§ћ?C>8.0LNGBMI?:@?88*014;>85:92,[тўўћњћљљњћћ§§ћњњљќњ§ўћћє§ћ:IJNNGLE@>>щ9;9>3.0)#&1797584•ўўїјјљњљЮњљњљљјљњњљњћ§ћ§ў§§ћ?@@EEBA?4;?41312-)242.8:@?8?Fўўљќјњњћћњћєљћћњћњћњњљњ§§Яћњњ§ў79@BGC;-*5;;:;11)49;98>;@<<@HСўў§њћњ§њћћњњћњњћљијљњћћњћћ§ћ-.997@B<57@7.-,*.8:<9;A>824F‘яўўљјљњњљљїњ§љћњћ§§њњћњўћњњћцOOC98718>B:2040:A:90GДўўјќїјљњњљњїћњћћњћњњћћќ§ћћњњсћ§ћ9:>@@>C<7207;723743BA8[Фўўњљљњљњяћњћљњњћњћћ§ћ§ћ§ћ§§пћ§ћ§ћ;@@9:2038HbN?CE,2dг§ўўјїјјљјњњљњћћњљљћ§§књћњњљњћ§ћњњ;GFE;92.55?La@8gbgЉёўў§ћљјљљњљўњљљњќћњљњњўљњњўљњњћ§пћ§њћњћњGLJ@<>?2FB1:rZ`vАУўўњѕїјљњњўљњњќљњњљљђњљљїјјљљњњљћћњњћяA>B@5?;CZZMY`YzеўўњћјљјјљљўјљљњўљњњјўљњњќјїїљљћћњњљњњэљјјFCFF2HQGU@F{Ѕд§ўўњ§јљјј§ѕїљљэњљљњњјљљњљљњљјјљљјњњ§ьћ§ћњјјљ:.LFNOCLqЅЫёўўщњјњћњљњјљјљњљњљњњћћ§ћ§њњћћњњћњњљњыјљјћ§§ћњњљћћgu”Жзыѓўўњњљњљљјјўљњњћљњњћњњњћљћњ§ћћњќ§ћ§ћћњљјњљњњ§њћњњўѕўўљћѕѓїїјїїћєїѕјљљњћљћњњљљљњљњњљљћћїњ§њ§ћ§њ§ћћєњћћњњјїїјїјїїјїљўјљљўњљљњўљњњќљњљњњ§љјњњўљјј§њћњњњћњћњњљљћјѕїїјјњўћњњјљћћљљњњљљѕњљњљћјљјњљњњљ§њљњњ§љјљљјњєћљљњћљњњљњњљљќјљљњњћњћњј§њњљљћћњњљьћњњљњљјљњљњљњњїїѕїїјјќїљјљљјїєјљјјљљјљљјљњњцљњљњњљњћњњљјљљїїјњјїїјљјљїїьѕјјїїѕїјїѕѕїјљјљјїїјјњєѕєѕєїїёјљљњљњћ§љњњ§ћ§ћћћњљћњљљїјјљїѕјїїѕїїўјїїљѕєѓѓєѕїїѕєіїјњ§ћ§ћћњљљьјїјњљљњњћњњљѕєїјїљјїїјўїјјљѕїѕѕїєѕѕєњѕїѕїїѕѕюєѕєђєѕѕјјїѕєѕєѕѕїјјїћѕјљњљљчјљњљљјїѕїјљјљїїјїїјїјљјїѕѕћєѓєєѓѓэюьюэьёѓђѓђѓєѓяђѓѓєњњјљњњљњљљјјљњљњ§љњјјѕ§єѓєєђряьшюэшхььёђёяёёѓѓ§ћ§њћљљїјїјљјјљљїћњ§ћ§ћ§њљљћњљћћњњ§љјљљўјїїѕєђѕюђѓѓђэьюђєѕЮђѕїєюышёёјјѕяўпw?L[VYVY`^WTTHV^WIўўњћ§ў§ўћўћўћ§§ўўТ§ў§ў§§ћў§ўђњљїюыюѕјїѕїєўђvM[WYMUPIWLQQYdo`J–ўўћўћўў§ў§ћўћ§§ў§ўўЬ§ў§ўћ§ћў§ўєћљњєђэяѓѕѕј§ўљ‚Nc\TiTLFTQTVejiTUЉўўћўћў§ўўќ§ў§ўўј§ў§ў§ў§ўўжјѕњњѓяѓђѕѕѓђєўє…FEYWVWMJNMUUWWPVJžўўњ§њў§ўў§§ў§§§ў§ў ўЪђѕєѓшцщјєяящэўѓˆMVUIJPIIPMSIHNGNC„ўў§ћћўћўћў§§ћў§ўћўћўў§’ћў§ў§ўёяяхршэєєђюяь§ђˆOHEIJBB[uNVTZMTtbnњўў§ћўћўњ§њ§ћ§§ў§ў§ў§ў§§ћў§ў§ўїѓєђюхчїєјьчсўяLVWW\`kЁiUQ\Vdjpiˆўўћў§ўў§ћў§§ћў§ў§ўўћж§ћў§ўњўѕљјјѕѕєјїёррнћь‡FLHMPYqˆnH`SI@N\`Њўў§іўћўњ§ћўњћ§§іўњ§ћўћў§ў§§јђјїєхжсђђѓўчнzW`YPHB9MUj^`Za`]\Ÿўўћўћћёўћ§њ§њ§§ўћ§ћў§ўўў§ўўФ§ўєїєэмккньѕїїўўыiE[cMPYYVbg`d`^jNbдўўњўћўћ§§ћћў§ўћўћўћў§ў§ўўЭщѓєїђђэяёђьщёьЁ<5FUSOY[U\TYUHTMCNЧўўњўћўћў§ўћў§ћћў§§ўў§ўўи§ўыюђљјљѓђшшщёўўЊCOb[JOOTNSTWWYG`{ƒгўўњћћ§ћћўћў§§Цў§ў§ў§ў§ў§ў§ў§ўєѓєїїљѕїяяччўўЃU`dYNTSJV]^WJVd`Liпўўљ§ћўћў§§Цў§ў§ўћўћ§ћў§ў§ўћў§ўєљј§њћѕђђјяјўђm:LVSSPHN^dWTCM‚woэўўњћ§§ў§ўў§§ќўћўћћ§§ўћўўЯєљљ§њћљњїљѕўўдe;BFC@FOH.EMEЄўўњћћљ§ћўћў§§њўћўњњљ§ћўњўўп§ўSQ]\b]UOS]ZNGA8<:OFCEOJZSUP]`Єўўђ§њ§ћ§ћў§ўћ§ћў§§єў§ў§ўћ§§ў§ў§§рўMMZ`WWLLMPQCE<:8JPNMLSPSVSWPYЯўўњћў§§ћ§§Ьћўћўћ§ћўћўћ§ћ§њћ§ў§ў§ў@MOOT\YLILTL8;8[\chPZ‚Кнўўѓњўћўћўњ§њ§ћњћћіўћў§ў§§ћў§§ћч§њ§њћњ§њў§ў§ўћўћ§w‰ЎБШђѕўўћћўњ§њњђ§ћўћўћўћўћўћў§§ћўћў§ўўь§ў§ў§ўћ§њ§ћћ§ў§§ћ§§ўўњљњјњјњњєћњњћ§§ўћўћўћћўўњњѕ§ћўћўћў§§ћ§§ўў§§їћўћў§§ћћњњёјњјњљћљћљћљ§њћњњѕ§њћњ§њўћў§ћћїўћћњўћўњћћќњћћ§§щћ§ћўњ§њ§љ§њћљћњў§§ћўћўћћі§ћ§њўњ§њ§ћћєўћ§њ§њ§ћўћўћћўўћћёўћўћ§њ§њ§љћљћњћћў§ћћќў§ўћћя§њ§њ§њ§њћћў§ўћ§ћ§§ўўћћяў§§ћўњ§ћўћўћ§њ§ћ§§§њўњњќјћљћћсњ§ћ§ћўћ§њ§љћјњљ§њ§ћўњ§њ§њўћўћўћћшўћўћўћ§ћ§њ§њћљ§њњљћњ§љћњњѓљћљњљњљњјњјћњњкћњњљћљћљћљћњљљњњ§ћ§ћ§§ўћ§ўў§ўћ§ћ§ћўћћњњяћњ§њ§ћњњ§њћљћњњјњњєјњљљјњјњљњјљљиїљљјјћљњњћ§ў§ў§ўњ§њћњћњўћўћўћ§ћўљћњћљ§љњњіјћљћљћљњјњњљшїћїњјњњљїљјљјљјљјћјњїћїљљвјћљћљћљћљњј§њ§њ§њ§њ§њ§њ§ћ§њћјњјћњ§њћљ§љћљћљўљњњсїљљјїњјњїњђѕёѓђљїљїљїјїљѕїїјћўћћљўћўњ§љћћгљ§њ§њ§ћўћў§ўћ§ћўћўњ§љћљћјљјїјјѕљѕѕєѓђєёёяїєѕєєьјїї§ў§§ћўњћљћљўљ§њ§ћћ§ђў§ў§§ћ§њўћ§§ўћћі§њ§њњљњј§љљёјѕљѕїѕљїјѕїјљѕљ!џ!џ!џ!џ!џ!џ!џ!џ!џ!џ!џ!џ!џ!џ!џ џўˆ џ џџўˆџџџџўˆџўˆџ!џўˆ џўˆ!џў€"џўˆ#џˆџўˆ$џўˆ+џўˆ, џўˆ/ џўˆ0 џўˆ1 џўˆ2џћˆˆˆ3џўˆ7џўˆњујѕљњњћљјљљ§§љјѕѕљјљњ§§ћћ§§ўў§§ињ§§њ§§љћћ§§њ§јћњ§ћљ§ўў§њ§§њ§њњ§љ§§ўћњњљ§§юњ§§њ§ћў§њ§ўў§§љњ§ўўѕћњ§њњ§ўњўњ§§ўњўўљњ§§ўўћўўѕ§њљћ§њўўњ§њњ§§њ§§ўоћўћњљћљњњћљљњњјљљћћњњ§њ§ћљњ§љјљћњўў§ѓњ§њћљјїћјїјј§§йћјњ§њ§§љћњ§ўћћўњ§§љјљћ§њ§§њћљљњ§§їў§§њ§§ўњ§§љ§љїјїѕљњљћњ§§эњљћљјћћјїљ§§ћљљ§љ§ўў§ћљ§§њўў§ћћњњљјјњљћ§їћ§§ђњ§њ§ћњ§§ўў§љљ§§ћ§јњ§њњ§ћћўўќњ§§ўўјњљњ§§њћјјћљћћљњњіћљјљјїјљњ§§ўћўў§љў§ћћьњјћ§њ§ћњјїїљњ§њўў§љ§§љљ§ћљћјћћољћљјјњљћљљњњјњјћљљћљљћћљћ§њљћјјћћјјўљ§§ўюњљјїјљјћћњјјњљљћњ§§ўћ§§њј§ўў§љљћ§§љјћјљјњїїўјљљѓћљјљњ§§љћњїљјјѓћљљј§њ§§њњѕ§љљћєњјўўћ§ўћў§ћљљє§ў§§љ§§њљћћ§§ѕљјћ§§јѕѕїѓїїќјњћљљћ§јљ§§яѕљјјїњјћљњљљћљњў§§ўњ§§ўњ§ўў§њњљПјћљњњљћћљ§§њ§§ћљњћћјњїњјњћјјљљњјљ§ўўћўћўў§ў§§њљўћў§ћ§§њ§§љ§љљјљљјјмћ§§њњ§њњўњљћљ§њљѕћћљјјљљјћљ§§ў§ћјњјљљў§ўў§§њљ§§їћљљћљјћљ§§§љњ§§њ§ћіљћљ§њ§§ћћ§§ўњўўмћўў§§њњ§ўўњ§ў§їїѕјћњњ§§њћћ§§љјјѓїјљњњђћњњўў§§љјљ§§њ§§јћљћћ§њњ§§ќћљ§ўў§њјњњљ§љїѓїћљјњћћљљіћљњћљћљјљ§§юњћљљјњњјјњјћњ§њљїњњщјћ§ћљљћњјјњћ§ўўћћњ§§ћћљљўњ§§§ћљћћіјїєљњ§ћћј§§ћљ§ћњ§§њ§§ћќ§ћњјјєіљјѕљљѕјћњ§§ѓћњћљћљћљїјљљћћ§љћљљђ§ўў§§њ§ўћўњ§§ћћэ§ћўўњљ§ћћїљїїѕјљњјљљјћћ§§њ§§љућњњ§љњїљћ§§њ§њљ§§њўћў§§ўў§љљћћѓјњјљћ§§љљјјљ§§њє§љјњјјїљїѕљњњјќїњћ§§§њ§ўўєћў§њњ§§њ§§њ§§ућњјїљјћљ§§љјћћ§§њ§љњ§ћјјњјїљїїѓљјїљїћћњ§њўў§§ўвљўўћўўњљљњљљћ§ўћўћ§ћљћљћљњћњњјњњћћњјїїјјњњљїї§§ћѓ§њ§§ћљћћјљћћ§§ћћјљћњјјёћњ§љ§њ§ћљћјјњјњњїўљјјѕњјјїїѕјѕ§§ћћє§њўўњ§§ћјћљћћѕљїјљјјїїјјљљ§јћјјўєћћъњљѕїјљљћ§љћћ§ћљљјїѕєє§§їњ§ћ§ћћљљћћћјњјњљљњћ§ћљљјјјљњ§§ћјљћћљљћљљћћ§§§њћјјќњѕєѓѓђњ§њ§§њћљјїєљћјјяњјјѕєѕєѕјјїњїњљїјјћфѕћњїїјћћ§§ћњїјњјјњјїљѕїѓѓєћ§§љћјњљћљљѓћјњњљљѕјјљїљїїљѕїѕјњјћћђњјјїїњњјљїїѕїєєіѕјњљљћћљћ§§чњ§њў§§љћ§ћїјњјјїїјљљјњјћјјљјљѓїњћљјјњјїљѕѕєєќѕїњјјќњћћљљ§ўњ§§љћћљљїљљћљљјњњєјјїїўѕњњјїњќїјѕїїјѕљњї§§ћўў§шљњњћљћјјћћњїѕїјљћљћћјљљћћљљћњјјњјјњјнїѕєїѓєєѕїїљћћљњ§њўў§њїїљјјїїјјњїѕєїї§јћјјкћњљјјѓѕњљљћћјєїјњњјљћјљѕєѓєѕїїљљ§§ћјљїїеѕљјљћћјјїљїљїѕј§ћјњћћљљњїљјћ§§љљћљјљћћљњћїѕѕэїљљїјјћ§њњћњїѕїїјјїїѕїјњјјљјћљћњњїїђѕјјњњљћљћћљјѕєєѕїјњњљјјљјњњкљїїѕїњњјїњћњњљљјїїєѕѕїѕјїјјїїѕїїљјјїїјј§їѕєєѕїѓњћћљјїѕњјјњїѕѕиљјјљїѕѕїїњњјћћљљћїјњњјїїјјїњјћјљћјљјїїѕєєёѕїљїѕєєѕїљїјїѕњњћўјћћўїњњљњћќњјљїїяњљљћћјјїїјњјїєєѓєєјѕїѕѕњњљјјќљћњћћўљјјїяњјїїѕјїљјњїѕѕјњњїї§љјћћјјїјєѓђѓїѕѕьїѕєїѕїљјїїјћљњјјїћјњњхјїїѕїјјљїљїјљћјјљљњѕїјљїїјћћњљњїїѓђђєєѕїјњћњїїѕѕїїѕїђљјїјњјјїѕјєѓєјјўњјјўѕїїљјњњљїјїї§ѕєѓѓђѓѕєѕїњћћљј§јњѕѕ№љјјїїѕљјѕљљїїѕєѓѓїѕїљѕїєѕїјјњљшјњїїјїїјѓђёѕѓѓєјљјїњњјјћћљъїјњљњњїѕїєѕјєєїєяєѕѕїѕѕљїњњјјњјјъљћћјїљѕєёьюяяёђєѕїїјњјјљћћјјѕїїјѕќїљљѕѕїќљѕѕїїђћєїјјїїђѕяёююёыяёѓїѕїњњщјћњјњјјїѓїѕїјњѕїїјћћњѕјјѕуљјњјјљ§§љјљљјїјїёѕєѓђяёюэёяђєєѕѓїњљјїњїїњњјњљљї§ѕїјјћїѕѕїјј№ћ§§љјљјјњљјјѕѓѓђђљёєёѓєєїїяѕєѕјєєђяѓїєѕїїњљ§§њїѕѕљїјјїћљњњћ§§ѕћњјїїѕєѓђёђђѓіѕљљїјњљїѕїїўѕїїюјѕљњїњљјјњїјјћљјјљљзњ§јїјјљјљїєєёѕђёяьёѓђєєѕїњћћ§ћјјњјљљїїћїјјуѕїљїїѕѕјљћњїїјјћћјћћ§§јњјѕјєѓѓњєђђѓѓєєўјїї№єѕїјјњјјљѕљњјљљјјњјїњєѓєёѕјјєєїѕъєїєђююэяяёђяёђђѓєѕїњњјјїћѕїѕїјјХњјїїѕѕјљ§§љјјїїјёђяьюяђђёёяэюяьяёёђєёюээюёђђєѕѕєѓєѕїљїљјјѕїїќєѕєїїяљјјћћљљћћјјљёёяђёёіэыюёяёѓяђѓѓњєђёђѓѕѕцјїѕєѕљїјћљљ§њћћјїѕѓїїјњјњїїјљљћјїїђёёђјэыщюяюёђђѓцђѓѓђюђѕѓѕљїјћћњїјћљјїљ§§јћћњјљњѕїјњњјјї§ёћ§§њћњћћ§ћћ§ў§ћћ§ђћњњ§ћў§§ћ§ћ§ћ§§ћќњћћ§§лћњ§§њўћў§ћ§§ћ§ћ§§ћў§ћўў§§ўћ§ћ§§ћћ§ћў§§љўћ§ў§ћўўљ§ў§ў§ў§§юћў§ў§§ћ§ћ§§ў§§ћћ§ўў§їћњ§§ў§ўћ§§єћ§ћ§ћ§§ў§ў§ўўљ§ћњћ§§ћћ§ћњ§іњћ§ћћ§ћњ§ўўўћ§§юњћњњћњћњ§ћ§ћњ§§ћ§ћћўњ§§ўў§ћћўњ§§єћ§њћћ§ћ§ўўћ§§ўћ§§ъћ§ћ§ћ§ћў§ћћўћњљјјљћњ§ћћќ§ћњћћњћ§§њћћіў§§ў§ћћ§њћћ§ѕў§ў§§ћў§§ћњњјћњћћњ§ћ§§ыњ§ћ§§ўћўў§ћ§ћ§њћњ§ћћ§§ўћўўњ§ў§§ћўў§њў§ћћ§њњћћњњћљљэњћњћњћњћ§§ћћўў§§ћ§ћћњъљњњћ§ћћљњњћћ§ћ§ўўћўћ§ћћќњћћњњтћњћњњљћњћћљљњљњњћћњћћњњћњћ§ћћњњћћ§ћ§ћўў§§ћњњўћњњ№љњњљћћњ§ћ§ћўћ§ћ§§№ћў§§ћћњћћ§ћњћћњљљўњћћѓњћ§ћ§ћ§ћњљљјњњћћ§ћ§ћ§§ћјњљњў§ўћўў§ћњћћўўћћю§ћ§ћњњћћ§ћ§ў§њ§ћ§љљўњљљќњљњћћїњ§ћ§ћ§§ћњњэљњћћ§ћћњћ§ўћ§ћ§ћ§ћўў§іћ§ћ§ћ§ўўћ§§ћѕ§њћ§§ћњњћћ§§ћўљњњћћљњљњњћљљњћћў§ўўю§ўћўћћ§ў§ў§§њ§ћ§ћ§§ћќњћћњњ§§ћ§§цћњћ§§ћ§ћњћњњћћњћў§ћўћњњљњћћ§ў§ўў§ёћ§ћ§ћ§ћ§§ћћ§ћ§ћћќњћ§ћћќ§ћ§ћћљў§§ћ§ћ§§ђћ§њў§њћћ§§ћњњћћї§ћ§§ў§ў§ўў§ўћ§§ѕў§§ў§њљљњњ§§јћ§њњћ§ћњњќљњћ§§ъњ§§ўў§ћћњћћ§§ћћ§њћњњћ§§ћќњћћўў§ћђ§ћ§ћћ§ћњћњљњњћћфљњћњћњћћ§ћ§њћћњљљњњљњњ§ћ§ћћљљњє§њћћњљњњљњ§ўў§ќћњњћћ§ћћ§њћњњљєј§ћћњ§ћ§ћћњћћі§ћ§ћћ§§ћ§њњљћњњћћљњњћњјхљњњ§ћ§ћ§ћњ§ћћњћњћћњјјњњћњћњњ§ћњћћљў§§ћ§ћўў§ўћњњэћў§ў§ўћћњћјљљњњћљњћћњўћ§§пћ§ћћњљљ§ћљњћњћћ§ћ§ў§ћ§§ў§§ћў§§ћћњњќћњ§ћћњћ§§ћ§§ћіњљњњљјљњјљљњљіњ§ћ§ћ§ћў§ўўјћ§§ћћ§ћ§§хћ§ћ§ћњљњљјњњћ§§ћ§њњ§ћ§ћћ§§њњћљњљјљљюјњљјљњњ§ћ§§ўћ§ћў§ўўў§ўўц§ўћљћћњ§§ў§ўћњћњћњћ§њљљњљњњчљњљљњњљљјљљ§ћ§ћ§ўўћ§ћ§њћњњѓћњњћ§ћћњњћћљњњњ§ћўћ§ћћњ§љњљљћћљљјњњѕљњњљљјїј§ћњњіћ§§ў§§ћћ§ћћўњћћїњћњњљљњњћћњўћњњљћљјјљњћћўњћћюњљјїїћћ§ћ§ћўћћњћћњњќљњљћћњќћ§§ћћ§њћњњђћњћћњњ§ћ§ћ§§ћњњэљјїѕѕї§ћ§ћ§§ћћњњћћњњўљњњјіљњњљљћњјљњњћћњ§њљљњ§ѓћљљњљњњљњљјјѕѕћїњћ§ћћў§ћћћњљћњћћњљјњќјљјљљјєљњљњћњћњљњњљљјњјљљјѕѕїїќјњљћћњњћњ§ћ§§ўўћћњѕљњњћњњћћњљњњћњјљћњќљњљјјїќјљљњњќљњњћћ§§ћ§ћћ§јљћћўњћћљњљњћњњљљњљ§їјљљјњ№§ћў§ў§ўћ§ћћљљњћњњјћњљљјљњћћњћѕњћњњћћљњњљњњљњћљјїѕїїјјљљјњњћ§§ќў§§љљўјњњљћњњљљјљљњў§њњќћљћњњљћњћщ§љљ§ћњњјјїѕїјљњћћ§ћњњјљљј§њћњњѓљјљјљљ§ћњњљњћћљћјњњ§ћћїњћњњў§ћљјјћљјјљњњ§ўњљљњљјљњўљњњњћ§њћњљљњљїћњћћњћњјїїјљњљњјњњћњљљћјљљњљљђњћњњљљјјњљљјјљљњљјњљљјњњћњњ§љјїїјљєћњћњљјљњњљљјјњћјљјјљљњ§ћњћћњіљњњљљњњљљњњћљ§ћњљљјїїќјљјљљјљљјљњљњљљњњ§њћњћљљј§љњљљњќљњјљљћђњћњњљљњљњљјїєїїјјљјјљљћњњўћњњўћњњўћњњљђњљљјїљјњљљјљњљљўјњњўћњњјљїїѕєѕѕјјёљјјљјљјњњћњћћљњњљњѓћљјљњњјљјљњћњњћјљњљњјљљњњёћљљѕѕѓєѓїјљњљњљљўјљљјљюћњћњљњњљјїїѕїїњњљњњљјћњљљјљњљљ§јїѕѕєјїјљљћњћ§§ўљјјњљјњјљђјїєѕїјљјјѕїјљњњљћъњљњћњљљїѕяђєѕѕїїјњњљљњњјћљњљћљљћјѕїјїїўѕїїќјљљјјљњўљњњўћњњјёїђѓяэёѓєїјљљњљњњћњљњј§њљјјљјљњўћљљљњїђђяюђђѕќјљњљљњњљњњљњљљњњљјљљњњљњсљјјњљњњћћ§ћњјјїљњљњјїѕєђюяєєїѕїїјљїјљњћњљљ§њљјјљ§њљњњћљјјљњњњћ§ћ§ћњњљћњїєѕѕєєњђєєїјљљќјљјїїљѕїѕѕїјљљћќ§ћљјјўљњњљъјљљћћ§ћ§ћ§ћћљњљљјїєєђєєўѕјјћљњљјљљўјљљєњљјљћљјњњљљњњїћњњћћ§§ћњњјћњјѕїїјєєђєѓѕѕїїјљљћњ§њњјўћњњљїјљљјјњћћљљњѓ§њњћ§ћљњљїїєѕѕ§ѓєѕѕїљјђљњњљњњјњјљњћћњњљњўљїїјїѕјэїѕїѕѕђюыэяэђѓєєѕїјљљњљћјѕјљњњљјжњћ§ћћњњљљњєѓђяёѓєєѓђёёяэюёѓєєѓѓёыыёђєѕїјјїїјјљјљјњњљљўјљљћјїњњћћъњћњњћѓђђяѓђѓююёѓёѓђђєѕѕњїєѓєѕјј§їљјјќљњњћћў§њњљљњљљњљњљљњьћњњљљєђѓђєѓёышьяёђђєєѕўєѕѕїѓѕєєїјјљњњљњ§ћњћћў§њњљњљќњљљњњљћ§ў§ў§§ўў§§ёў§§ћ§§ў§ў§ў§ў§ўўъ§ў§ў§ў§ў§ў§§ћў§ў§ў§ў§ўўњ§ў§ў§ўўў§ўўў§ўўќ§ў§ўўў§ўўќ§ў§ўўў§ў ўќ§ў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ўўў§ўўњ§ў§ў§ўўќ§ў§ўўљћ§§ў§ў§§ўњ§ў§ў§ўўќ§ў§ўўэ§ў§ў§ўћўћўћў§ў§ў§§ўўќ§ў§ўўј§ў§ў§ў§ўў§§ў§ўў№§ў§ў§ў§ў§ў§ў§ў§ўўјћ§љ§ћў§ўўѕ§ў§ўћ§ћў§ў§§ўў§ўў§њћ§ћў§ўўў§ўў№§ћўћ§§ўћ§§ў§ў§ў§§§ў§ўўє§ў§ў§ў§§ћ§§ўўќ§ў§ўўў§ўўў§ўўћ§ўћћ§§ћ§їў§ўћў§ў§ўў§ыў§ў§§ћћ§ў§ўћўћўћ§ўў§ўўѕ§ў§ўћў§§ћў§§ўў§§ђўћћ§ў§ўћўћўћў§§ўў§§ќў§§ћћ§їўћў§ў§ў§ўўюћўћ§ћ§§ћћўћў§§ўў§ўўќ§ў§ўўќ§ў§ўўѓ§ў§ў§ўћ§њ§ћў§§ўў§§ѕћњ§ћўћ§ћ§§ўўє§ў§ў§ў§ўћ§ћўўњ§ў§ў§ўў§§ў§§ўћ§ў§ў§§ўў§§ыњ§ћћ§ў§ўћ§ћ§§ў§ў§ўћўћћљ§ўў§ў§ўўњ§ў§ў§ўўј§ў§ў§ў§ўў§§ў§§§ћў§§юў§ў§ўћўћ§§ўњћћўћўћћћ§ћў§ўў§ў§§ў§§юў§ўћўћўћ§§ў§ў§ў§ў§§ёў§ўћў§ћћ§§ћћў§ўўј§ўћў§ў§ўўю§ў§ў§ў§ў§ў§ў§ў§ўћ§§іћ§ћ§ўў§ў§ўў№§ў§ў§ў§ў§ў§§ўў§ўўћ§ў§§ўўќ§ў§ўўў§ўўў§ўўј§ў§ўњ§ћўўђ§ўў§§ў§ўћў§§ћўў§ўј§ў§ўћў§ўў§§ў§ўўњ§ўў§ћўўћ§ў§ў§§ъў§ў§ўћ§§ћћ§§ў§ўћ§ћўћў§§фў§ў§ўў§ћўћўћўћўћў§ў§ўћўћўћў§§ћћўћ§§ўў§§ў§§њў§ў§ў§§щўћ§љ§ўўћ§§ў§ўћў§§ћў§ў§ўў§§ў§§њўћ§§ўћћ§ўћўў§§ўњњф§ћ§§ў§ў§ў§ўћў§ў§§ћћњњ§§ћ§ћў§§§ў§ўўў§ўўњ§ў§ў§ўўщћ§ћ§њ§њћћўћў§§њў§ў§ў§ў§§јћў§§ћў§ўўќ§ў§ўўў§ўў§§ћў§§іћњў§ў§ў§§ћћ§ў§ўўќ§ў§ћћў§њњў§ћћї§ћ§§ў§ў§ў ўя§ў§ў§ў§ў§ўћ§њў§ў§§ыў§ў§ў§§ћўћћњ§њ§њ§ћ§њ§§§ў§ўўў§ўў§ћў§§ў§ўў§§ўўћћіўњ§§ћћњњўћћї§њ§§ў§ў§ўў§пћ§§ў§ў§ў§ўћ§ћ§ћўћўћ§§ў§ў§ўћў§ўћўћћњ§њ§ћўћћіўћ§њћљћ§ў§§§ў§ўўь§ўћ§ћўћ§ћўћў§ўћ§њўћ§§љћ§ўћўћ§§фћўњћњћ§§ћўћ§ћўћ§§ўњћјњўў§ў§ўўќћ§ћ§§ђўћўћ§ћ§ћўћ§ћўћћїў§ўћў§ўћ§§ќћ§ћ§§јў§ў§ўћўћћњјљљ§§ўўс§ўћ§ћўћ§§ћћўћўћўњћљћ§ўћ§ћћњ§њўћћ§ћћ§њў§§ћ§њўћћѕ§њћјљїњ§ў§ўўў§ўўћ§ўћў§§дў§ў§ўћўњ§њўћ§њ§њ§њ§љў§ўћўћ§ћ§ћўћ§њўћћњ§њћј§њњћѕ§ћ§§ў§ў§ў§ўўШ§ћўћўћўћўћўћ§§ўћћ§ўћўћў§§ћўњ§њўћ§ћўћћњ§љћћњјћњўћўћў§ў§ў§§њў§ў§ў§§ћўћ§њ§§йўћў§§ћўњўћўњ§њ§ћўћўћўћ§њ§ћћњћљ§љ§љњњў§ўў§§ўћћё§ћўћўћ§ћ§љ§ћ§ћ§§њћўћ§ћ§§ѓћўћўћўћўњћћўћћ§§ћњњўљ§§ћў§ў§ўўї§ћњ§њўћўћћѕњћљ§њњћ§§ўћћјў§ўћ§§ў§§ћћўћ§ћћ§іћњћјљјћњў§§№ў§ўњ§њ§ћ§ћў§§ћўњњч§њ§§ў§ўћўћ§§ўњ§ћ§§ў§§ћ§ћ§§щўћ§љћљћљћљ§њњ§ўћ§§ў§§ћ§§љњўћ§њ§ћћї§њўћћњћћ§§рўћўњ§њ§њ§њўћўћў§§ћ§§ўљњјњјћљ§њўћћђ§ћў§ўћўћ§њ§њ§ћћуњ§ћћњ§ћ§њћљ§њ§ћўњўњ§њ§њ§ћўћўћћъњћјњјћљ§њћћ§§ўњћћўћћњћћђњўћ§њћљ§љћњћћ§§шћўћћњўњ§ћўњўћ§ћ§ћ§§ћњ§љњњ§јћњњђ§љћљ§њ§ћ§њўћћ§§ћћ§ћўћћя§њћњўћћ§§ћћњ§њ§ћ§§эћўћ§њўћўњћњћњњјњљ§ћћі§ўћћ§§њ§ћ§§ућўћ§њўћ§њћљ§њўћ§ћ§ћўћ§њ§њў§§ћћїўњћјљјљјћћЮљ§љћњћњ§ћўћўћ§ћўћў§ўћћњћћ§љ§ћўњ§њ§њў§ўћў§ўњ§ћ§њ§ћ§§фћњњљњјњјћњўћ§ћ§њ§љ§њ§љћњ§§ўћћљ§љћјљњћћўу§њ§њ§ћўћўњ§ћ§њ§ћњїљїјјљјћњћћ§§ћУљћњўћ§њћњћњ§њ§њћјћїњљ§њћњњћ§њўћўњўћў§ўћўћўњ§љљјљїљїњљ§ћўћўћў§§ђњ§ћў§ћћњљњјћљњњХћјћ§§љћљћњўћўћўћўћў§§ћўњћјљјїѕјїјјћњ§ћўћўћў§ўћўћ§њ§њ§ћўљћњ§§ћљћљћњњщћљ§њ§њ§ћћљ§њћћ§њ§њњїљјїїјѕљљњљњњћћѕўћ§њћћўћ§њ§§ѕћўљ§њў§§ћ§ћћќ§љ§ћћю§ў§ўћ§њћњўњћљњљјѕљљќјћљњњЮјњјћљћћўљ§њ§ћ§ћ§њўћўћњњ§њ§њ§ћўћњљћњўћў§ў§ў§§њћњ§ћљљўїјјњкћјћњ§њћљћљњњћљљјњљ§њћ§ў§ўњћћ§њўћўњ§њњћћцў§ў§ў§ўћўћ§њћњћјљјјѕјјћљћњњнўћ§њ§њ§њ§њћњ§њ§ћ§њўћћњўћўњўћ§§ўћ§ћўўйћўћў§ўњњјњњљѕњѕњїљљњјћњўћ§§ўћћњўњ§ћў§ўћћў§њњў§ћћщ§ћћ§§ћў§§ћ§§ў§ўћў§ћњћїљљјђљїљјњјљњ§њћћ§ћћі§њ§ћў§ўњўћћмўјњњ§љћљњјњјњјћљњјњљњѕљїјєљѕїјјљњљ§ћћдњ§њћњћњћћўњўњ§љћћ§§ў§ўћњњўјњѕѕєљјјїљјљїјљјїјјєїєѓѓєљјћњћљњњяљ§њ§њўћ§§њњ§љћљ§њњћю§ћ§ћ§ћўћ§їљѕјїљїѕєєђјїїѕјљљїљјјїјљљђћљ§љћљ§њў§ў§ў§§§ћњ§§йњўћўћ§њ§§ўћ§§ћњ§јљїљјњѕѕёїїјѕљјјѕјјљїћљљъњјјљњћ§њў§ўћ§ћ§§ўћ§ўў§§їћўћўћ§њўћћ§ўћ§ €§јњћљјїєєѕѕњѓѕїїњјјљњїїјњјїїьѕѓѕщнЦмЮпэєяюђѕїјћњ§§ћњ§њњ§§ъљћљ§њћћљћћїјїїјјњјїњјћћљмћљјњљљїїѕїљїєђћщВЉНкхыюѓѕїјљћћ§њ§§њ§§пљ§§ћљћњњљѕїњњћљњ§њљљјјњјјћљњјїјјћћђјѕїјѓрТУакмчяѓѓујњљљјњњјњїљїњј§§ћљћњїѕѕїјљћјћћ§ќћљћљљјшњјјїѕїїѕѓђђѕьччпрцыэююяѕѕђѓєђѓєїїєјјћљљћћўїѕѕїўљїїњјјѕїїјѓљћћјкљєєђышупнпцшыэёяыщышьяђёёькћјїњњїѕѕјјїїћјњјљѕѕќљњћљљјнљћјљѕїѓёэшщцшыэююђёщчухыьхчшцм§њљљњњўјљљјјњјњћјљјјўњјјќљїјїїјљњїѕєѕєёёяяёэьшчучщэщцуттцћћњїњїјёњјјњјћјљјјїїјјљљнћљјљћљјљѕѕїљїјєѓђђѓђёюыээюэюээыщыюїїєѕєєѕїїњјїњњјјјњјѕљћњњћћњќѕњљјјпљѕљљјїєѕѕјїїѓёэюяяѓёєѓєєѓљћћњљїѕїїщњћјѕїјјњњїћљњњљћљњјїњњјјіњјњњїјљѕјїїѕљјїєяѓѓѕѕјѕѕ§јѕћћљўћњњёљїљњљљњїїљћћјјљљћљћњљїїјјїхљѕѕїїѕђѕїњјѕююђчѓѕњјјњѕїѕњћћіљћљћћљјћћ§§эљћћљљјїјњћ§њ§љјјњњјјќљјњјјїўѕєєњјљћјјїїмѕїљњјњјњњјњњїљљјњњљљїјјћљћљћљћљћјїљїїњјњљћћїїѕјћћјїїјјљњѕѕўљїїЛњјњјћљћљћћјљєђѕѕїїјјњјјњћљљњјјїїњјњњћњ§§љљћљјїљїѕїїјљњљљњљѕѕјєѕїјњѕљјјљїфѕљїљљјјњїјњјїїјјћћљљћјћћљјњјјхљћјњљїњњјјњњєјњњћјњїїљїїњњћћўњјјћњїљљїїјўљїїњјљїѕєѕѕїўњїїэљїњјјљјєѕїњћњњћњјїњњ№ћљљћјјњјњјњњћћљјјањјїњїјљїїљїїњјјћљјћћљјїљѕїјљїѕѕљљїїљїљњјљїљїїљјїїњьљћљјѕїњљјњєњљїјљ§ћјїїѕїјњљэїјљјњјїјѕјѕїѕљљњћјљљцћљјјїјјїѕїїњјїїјњћљћљћљћћјјјїјњїїњјїїћѕїњїјјќїѕљјјзћљњњ§ўњ§јљћљћћљљћљћљљјћљ§ўћћ§ћљћћјїїѕјћћјјќљћјћћ§јїїђїјјћћјїїђѕјјћћљљћћ§§њ§љљћќјњїћћњјјљљњјјљћћчѕћћјјљњљћћњњїѕїљїїјѕњњјїѕѕьљїѕєѕѕїљїјїљљњњљћљћјјнљћљћљћ§љњњјћћ§њ§ћћјљѕїѕїѕљјјњњћњњѕїїдѕїљїѕњјїјњњїїњјјљїњњјљ§§љћјљ§§ћћ§§љћњјљњїјјњњћ§њѕїѕїїјјољјјїїѕљњћ§§ћћњїљїїњњјјњјјћљћљ§њљљћћїљћ§ћћњјњїїњїњјўѕїїчљїїјѕљњљљїљїљѕђїѕїљјјѕїїјјњћїјљљјјї§јљїїє§ѕїјјєћљљћјњїњїїљѕѕёєѕїїјњїљћћњњјјљљ§ћњјјыњћ§њњћ§њ§ћћјєћљјљїјїјјшћ§њћњљћљїїљїљћћјїјјљљћљ§§њћјјљјљљїїњљјњјњћ§ћћ§бћїїјћљљјјљњ§љњњћљјњјљїїјљљћјјњїїјїјјљљњћћјњјњјїїјљњјљћњјїїњѕјјљњћћ§љњћћњјљ§§ѓљїїєѕїјјљћћњјјћђњјїјћћњљјјѕїјїїыљїљњјїїљљїїѕїїѓїјїѕєїїўљњњљ§ћ§ћћћјњїїјјћњјїљїїјћьљњїѕљњћћјјљїљјљљћљљ§§ѕћјњћљљњїђєѕѕђїєѕєѓѓєїїњјјњјјчњћљћїјїјѕљїѕїїљїїѕѕєѕїњћљљћњў§ћјјќњјњјјИњјјњјїїѕїїљїљњњјїїѕїїјњњјїјљњ§§ћјљїєїїљ§ћћњљѕѕљљ§§ћњњјјњљћћјњїњјјѕњљћћљћћїљћћњјїїѕїїыѕїїљѕѕєєѓјљїјћћњїїѕѕїїнѕїїљїїѕѕјјћћљћћљћћљљњ§јїњњјјљїїјћћњњыљћћљњњїѕѓєѓєѕѕєєѕјњљїїњпћјњїїјјљљјѓїјћљјїјљћћјјњїїѕјњћљјњњўїћћќ§љјїїњјї№ѕєєїјњљ§ћљјїїѕѕїїєњјјїѕїїњћ§ћљљіћјјїїѕїѕїѕѕщїњїїѕѕєѕїїљљїљїѕјљћљњјїїьјњјћљљњјљћљјјїјјњћћњњ§јљћћјўїјјљњљѕєєѕєєѕыїѕјјїїјїњјјђђїїјњњїњћћљњїїѕїїњњ§їњјјъїјїљјјћљћљњјѕїїѕјѕѕјїѕѕіјѕѕїїјћћљћћќјљљїїѕћјћљћјјьљћјјћћ§ћћњјљјњјњјјњјјїїњњјјїјћњњјјњљїјњњјјрїљљћјњјњћ§§њћљћћ§њ§§ћњїјћ§ћјїѕљњњѓјњљњњћћјјїљћјјщњћљїјћ§§њ§ћљњћљњ§јљћљјњњћїљїїњњћёњїїљїїљїѕѕјћљњјјћљїїљћћюњљћјљїѓїѕєїјјњјјљ§§ћєњјјљїїјњѓїњјјяїљѕљєѕѕјјљћљћїњњїїёњїјћїѕѕј§§ћјњјїїљљјѕѕїїњњлћњћјїїјњљћљљћљњњћњїїњњјјњћљћћљљћјјїјїїћћјљљћћјљћљјћћ§ћћъљїѕєєѕїїљњјћ§§ћјњјљјјїїћњћћњјјёњїѕљјњјњјїјѕњїѕѕёєљњћћїјєјјњњїѕљљїіјљљ§љљћљјїїщљїїјњњјњћњ§љћљјїјљћјјїѕѕїјѕљѕїњћљ§§њћљјћћ§§њћњњјћ§§№љјљ§§ћњјјљљћњјњћћќјњњћћШњјјљїјћћњљѕјїњїљїїљѕјѕѕђїѕїјјњљєѕїјјњњјјћљћ§ћљљјљљћјїљљїїѕОїљљњїјњљћћљїѕїїјћњїѕїїѕѕїїљїѕєяѕїїјњћљљћњ§ћјїѕєєѕљњјїљњјњїїљјњјјїљљљјњњјјїћћ§ћјїѕѕїљњњћћ§§њљјјђњћњјњљћјјњљљјїїѕњћљљћњљјјњћћїѕєљѕїјљїїјјњјћђїљїјћїѕѕїћљћћ§§щѕљ§љљћљћљљћ§§љљћ§њћљћ§њњћѕїѕљїїќѕєѕњњѓјѕїћћјїїјћњњїїюљїљѕњљћњјћћ§ћљњћћљљ§ћ§љљјќњљїѕѕ§ћ§§њћњљїїјјњїјљћљњњљќњљњљљщјѕїчлУеЩпюѕэђєјљњћ§§ћћ§§юћ§ћћњћћ§њњћњњћњљљњњљћљњњћњћћ§њљћћлљњљјљїєўыЏЊРлцьёѕјљњћњњћ§§ћ§ћ§ћ§ћ§ў§ћћњњљљјјљљѕњћ§ћ§ћћњњљњњћћљњљњњ№ћњњјљњётРСЮзмуђѕѕфїљћћњљљњљљјљњњ§ћњћњљљјјљњћћњњњћ§њћњћћњќљњњљљјєђјэыхрнсэяэьђєјјљїєєїѕѕїїќњћћњњўљјјљўјљљўњљљњњ§ћњћњњоћњњјїїєђщпмрттщьёђђюышщюђяѓѓюлњћћљљјїљњњљњјњјј§љњћћњнћњњјјѕѕѓящчшщюяьђєѓёхсчьщцхцсз§§ћћљљўњјјјњљњљњ§ћњњўљњњќјљњљљњјфљјїєѓђѓђђюёяьшхтьюыустурћњћљљіњљљњњљњњљњњјћњњљљњњћћљ§ћњћњјљљшјљїїѕєєѕѓѓяьыяяюяяыщцюђљљћјїјјљљўњљљњјљњ§ћњљљњњљќњљћњњљћ§ћћњљјјўїѕѕьѓёяёѓёѓѓѕїїєћњњљјљњљљњяљћњњљљњњћ§§ћњћљњљљњіљњљљћњјјїљљѕјїѕїїєїјјїјјѕїјњњћњњћћњљљїјљјљћћљњћћњћњћћљјљљњњљјљєјљљњјјїєєѕјњњњљњљњљњњљћњћћњћњњъ§ћ§ўћњћћњљњљњћ§ћћњњљљњњќћњљњњљўјїїўћњњљшјљјљњљњљљњљњљјјњљљјјљњњћћїњћњћћњљјљљќњљћњњљњіћњљљњњћљњјјљіћљњљњњћњћњњјюљјјљљњњљњњљњћћљњњљљчњљљњ§ћ§ћћњћњћјљјљљњћ§ћћљјјўїљљћњљљјњњјљэњјљјјњњљљњљњљљњ§њњћћњќћњљњњњћњњљјљљњљљћњљљћњљљіјљћљљћњћљњњљјљњўјљљќњјљјјљюјљљњїјїјјљљњљљњљњљљћњіљњљњљљњњћњњѕљњћљћњјљљјљљњђћњћњћњљјјљњћљјјљѓјљјљњјљјљљјњљљћћњћњљљѓћњљћљјљњћћњњљљјљњъљјјљїјњљњљїјїјљњјјљћ§ћћјњћњњљњњљљѓњљљњљњћњћњћћњњ§ћњљљўњљљўњљљњљўјњњћ§ѕћ§ћњћћњћћњћћіњћ§§ўў§њћњњљњўћњњќћњ§њњћ§ћњњљљњљњіћњћћњњ§ћ§ћћњьљњћњњљљњћћљњњћћњћњ§њњњћ§ћњњљљєјљјљљїјљљњљјјюљјљјјљјљњњћћљљћњћњњяћњћњћњ§ћљљњњћћ§ћњњјѕљњљјјњњљљћљљўјљљќњћњљљњўјљљўњћћњћє§њњћ§ћњљњјљњњљњј§ћјљњљљїїяјњњљљјјљћћ§њћљљјљљњўљњњюћњћћ§ћћњћњћњ§њћљњљљўњљљњўјљљъјљљїјјљјјљјљјјљљњљјњњљљњћћњћћњњљ§њјљљќїјљњњћњљјњїљљњљћћњњљљњњћћ§њљњњ§ўњ§§њїћњћњјљњљњњ§тњ§ћњћњљјљјћњњљњњћћњћ§ћ§ћћ§њћњјјљњјњљњљћћћњћњњћћљ§ћћњљњћћњыћ§ћћљљњћњљњјљћњћћњћњљљњјњўљњњљњћћњљњљљпјїїјњњћњ§ћ§§ћњљњћћ§ћћњљјјљњњћњћљњњнћљњљњњћ§ћњњљљњћљљјљјљњљљјјљљјљљњљњљљїјњљњћћњ§њњљњћљњљјљљњјћљљјјљћњњћјљјњћћї§ћњњљњћћљљјљњјїєѕїљљњўљњњ§љњћћэњљњљјљњљљјљљјїјјљљћћ§њўљњњ§љњљљэјљјљљњљљњљљњљљњљњћ§§њѕјљјљњћ§њњљјјѕћ§ћћљљњњљћњњєљњљњњљљћћњћњњћњњљњљљњљљќњљљјјіїѕїїјљњњћљљјљжњљљјљљјљњ§њњћњћћњњћћ§ћњњљљњњјљљњћњњљњћњњћљљыјїїѕїјјїїјњљјљљњљљћњљљњћњїљњњћњљњћњњ№љћљњњљњћњњљњљњњћћўњљљњљъјїјљњљћ§њћњљљњјљљћљњњљљќњћњћћњљћјљњљјјљјљјєљјљљњћњћљњњљљњѕљњњћћљњћњћњњєљњћљњљљњћњћњ њљљјјїїјїїјљњљњњљљњњљљўњљљњљ§њљњњљћњљјњњћћєљњјљљјїјјїљјј№їјјљљњћњћњћњњјјљљјњћњўћњњђ§њњљњћ§љњљњњљњњљњќћњњљљјњљјљњљљњњћњћљњљњ§§ѕњћњњћ§ћ§њљњњљ§њњљљјљљњњљјљљњњћ§ћњљњћњњќ§ћ§ћћєљњћ§§ћћњћњњљљўјљљќњљћњњљєјљљјљњљњњћљњњьјљљћњћњћ§ћњњјљњљјјљњњћя§ћћњњљњњјљљњљњљљњњўљјјњњћњћњћљљѓ§њљїјњ§ћћњљњљљћјїјњљљѕћ§ћњљљњљћњћћ§ўћљљі§њљњћњћўћњњ§ћњљљћњњћњћњњћћцњћњћћљјїїјљљјљњћћ§њњљњћњњљљќћњљњњљјѕњљњљњљїјљљјјѕљјљњћћњћњњљљјљўњћћўњљљэјљњњљњњљњ§ћћњћњљњћњњћљјјїјјуїјјњљљњўћ§ћ§њћњћњ§ћ§ћћљљњћћ§ћћ§ѕњљњњћћњљњљњњљхњћњљњњјљњћњљјјїљљћјљљјјїїјљљњўљјјјљњњљљњњћћћњћћњћћћњљјјљљйјљљјјљљњљћњњјљјљљњћљљјѕѕјјљљјљјїїјљљњљћћюњ§ћћњљјїїјјљњљјљњљљљјњљњњљјјјњљљњњљћњњјћњ§ћ§ћћњњљјѕљћ§§ћњ§ћ§ћњњљљњљњљћњњћљћћњљљћюњљјњњљњћњљљњљјїїјћћ§њћњњљњьћњјљњњљјјљњћњњћћ§§ўћћўњћћ§њ§ћћћ§њћњ§§ћњљњјљљќјїјљљњљ§њћљљїјљјљљћњљњњњћњћљњћћўњћћњќљјљјЬ§ў§ў§§ћ§јњљћљњћ§ћўћўћўћ§њўћўњ§њћљўђцЯуйяѕ§ѕѕјћњўћў§ўўў§ўўљ§ў§ў§ў§§бў§§ћўњ§њћњћћўћ§ћ§ћ§ћ§ћў§§ћ§њ§њ§јјўєВБЪцёѓєљљ§ћ§§ўў§ўўэ§ў§ў§ў§ўћў§ћћ§љ§ћћ§§пў§ў§ўћўћў§ўћўњўћ§ћ§ћћ§ўљэЪЩкрмѓѕљљћў§ћћіўћ§њ§њў§ў§§іўњћљ§ћ§ћћ§§ћў§§ћ§§љўњћћўћ§§§њљјјцћєёэщшюёѓђїѕљљћјњјћјњјњљћ§§љњћљћљћњњњ§њ§њ§ћћ’§њ§ћў§§ћў§§ћўћ§јњѕїѓычуцђёѕїљѕїђѓёяѓјїїђт§ўћўћ§љћљћњ§њ§ћўћ§њћљ§ћ§ћ§ћўћўћўћўћ§ћ§љњїїѓєђѓёєёїѕјїѕяьыѕєэяюэу§ў§ўћћћўњ§њћћ§§ћўћћдўћўћўњ§ћ§њ§њћћ§њ§њћјљјљїљѕїєѕђђьюяѕђюэёючћ§ћћљ§њћњ§њћћѓўћў§ў§ўћ§њўћ§§ўћ§§ўћ§§Юњ§њћјљјјїњїїѓѕѓїѕїѓѓюѕђјњ§њ§ћњћћњ§ћћњўћўћўћћ§ў§ўћ§§єћўњў§ўћўћўћ§§ъћњћљћљњјљїљїјїљїјїњјћ§§рўњ§њ§њ§ћ§ћ§ћўћўћў§ў§ў§ў§ўћ§ћўћўћћўўћћрў§ћљ§њ§њћњњљћњћљћљћљћљћ§§ћў§ў§§ћћ№ўњ§њўћўћўћ§ћ§ћў§§іўћў§§ћ§њ§ћћѓ§њ§њћљ§њ§ћћњћћёљћѕњїћњћћўњ§њў§§јў§§ћ§§ў§§юў§ўћ§ћўћ§ћў§ў§ў§ўћћэўћўћўћўњўћўћ§њ§њћјњњёјћћ§ћўњ§њћњ§ћўћћјўћўњ§њ§ћћќ§њ§ћћь§ћў§ў§§ћўњ§њ§њ§њ§ћћ§§ьўњ§ћ§ћћњ§ћў§ўњћљ§њ§ћћќўћў§§§ћњћћіљ§њўћўћўћ§§ёћўћ§њћћўћ§§ў§ў§§ћј§њћ§§ћў§§йўњћљћљ§њўћ§њўћў§§њ§њ§њ§њ§њ§њћњћњўћћњ§ћ§§ќўћў§§ўўћћєўћўћћ§§ћћњ§ћћќўћўћћє§њ§њћћўћ§ћўћћщўњ§њ§њ§њ§њўћ§њ§њўњ§љћљћћрњ§њўњ§њ§њ§ћўљ§љћљ§ћ§ћў§ўћ§ћўћўћ§§ћћўћўћћ§§ћўћћўўћћЯўњ§њ§њ§ћўћў§ўћ§§ћњ§љ§ћ§њћљ§љ§њ§њњћћњ§њ§њ§ћ§њ§њўћ§§аћ§њћ§ћћўћ§њў§ў§ўњ§њћљћњ§ћћњћњ§њћњўћўњћљћљ§њ§њўћ§§§ћ§ћћђ§ћўњ§њ§ћўњ§ћў§§јў§§ћ§ћўћћўўћћр§њћћ§њ§њњћ§ћўћўћўњ§њћћўћ§§ў§ў§ў§§ѕћ§ћ§§ўћ§§ў§§ў§зўњ§њћћўћўћўћўћўћ§ћ§§ў§ўћћњћњўћў§ўњ§њ§ћўћ§§хў§ў§§ћ§§ћћўћ§§ћћў§ўћўћўћ§ћ§§§ўћ§§шћўњћњ§њњљћћўћ§љћљ§њћљћљ§§ўћ§ўћў§§іўћўћўћўћћ§§ћ§§ћўўѕ§ўњ§ћ§њ§љ§ћћє§њ§њ§њ§њ§ћўћћіўњ§ћўћ§њўћћў§ќў§ў§§ўў§§ћњ§ћўћўћћ§рўљ§њ§њћљћњћњ§њћњћћў§§ћћњ§њ§ћўћўћћ§§ћў§§ќўћў§§ћіўњ§њћњўњ§ћћтўљ§њ§њ§њћљ§ћ§њ§њ§њћћ§њ§њўћ§њњћћЮ§ћў§ўћўћўћ§њўњ§њ§љњћ§ћўћў§ў§ўћ§ћ§њ§љћљћћўњ§ћўћ§ћ§ћћ§ћњўњ§§ў§§ўў§§юўћ§§ўњ§ћ§ћўћ§§ў§ў§§оўњ§њ§ћ§ћ§ћўћ§§ў§ў§ўћ§ћ§ћ§њ§љ§ћ§ћўћћљўћ§ћ§§ўўР§ўћўњўћў§ўћ§ўў§ўћ§§ўћўњ§ћўћў§ўћўњ§ћўћўњ§њ§§ўћћњўњ§њўћћњўћ§ћўњ§њ§§ћАљ§њ§ћ§§ў§ўћ§ћў§ў§ў§ўњћћ§ћўћ§ћўћўћ§ћўћ§ћ§ћў§ўћ§њўћ§њ§њ§ћўњ§њ§њ§љ§њ§њўњ§љ§њ§њ§њћњ§§ћЙњ§ћўћўћ§њ§њ§ћў§§ћћњћњћћ§ћўњ§њў§§ћ§§ў§ў§ўћ§ћ§ћ§љћљћљњљћњћљњњ§ћўњўћўћў§§ћћљ§ћ§њ§њ§§єњ§љўћћњћћ§§ўў§§ћўћћљўњўћўњћћщ§њ§њ§њ§њўћўњ§њ§њўћўћ§ћ§§јћ§њћњўћ§§їћ§љћњ§§ўћћќўћћ§§ѕўћўћўћ§ћ§ћ§§вћ§§ўћўњ§њ§њ§њ§њњљћј§њћњ§њ§ћћљ§љћњ§њ§њ§њ§њ§љ§ћ§§§ћў§§ќўћўћћєўњ§§ўћ§њћњў§§ћѕ§љ§јљњљљњњћћћњ§њўћћд§њўћ§§ћ§§ћ§ћўњўћ§§ўћўћ§њћћ§ћўњћњ§§ўћўћўњ§њ§ћћѕўћ§њћњћњўћ§§ўўњњќћњ§ћћїњ§њ§ћ§ўў§§ьћўњ§љ§њ§ћћљ§ћ§њћљћљњњњ§њ§§ў§§Мўћўњ§њўћўћў§§ћў§ў§ўћўћўћ§ћћњћћў§§ћ§ћўћўћўћўћўћњљњјћјњјњјњљћњ§ћўњ§ћ§ћћіўћ§њћћўњў§§вћ§њ§њ§ћўњ§њћћўћўњ§ћўћ§ћўћўљ§њћљћљћњћљћљћљ§њўћ§§щћ§ћ§њ§њ§ћћњўћ§§ўћў§§ћћ§§ћ§ћіўћўћўћ§ћўћћц§ўћўћўћћњ§ћўћўћўћў§ў§ўћўћ§§їў§ў§§ћўћ§§ўћ§§Ьћўћўћ§ћћ§§ћўћўћ§§ўћ§ћўћ§§ў§ўћ§ћўћў§ў§ў§ўњћћ§њ§њћњћћ§§жћ§њ§њ§њ§њ§ћ§§ћћўћњњ§ћ§ћ§ћўћўћ§њ§њћћњћўњћћўўя§ўћ§§ўћўњ§њћћ§њўћћћ§њћњћћўў§§ќћўћ§§Ић§§ўњўљћ§ўћўћўњ§њ§љћњ§њўћўћўћћњ§ћў§ўћ§ћ§§ўћћњ§ћў§ўћ§ћ§ћў§ўћўћўњ§њ§ћўћ§ћ§§Хў§§ћ§ћўћ§ћ§ћ§њћњњљ§њ§ћўћў§§ћўћўћўњ§њўћ§ћўћўћ§љ§ћўћўћ§љћћ§љћћћљ§ћ§ћћцўћўћўњ§њ§њ§њ§ћўћўћ§ћ§ћ§њ§њњіўћўњћћ§§ў§§цўњўћ§ћўњћљўљћљћљ§њ§ћў§ў§ў§§ћ§ќў§ўћћјўћў§ў§ў§§љћўћўћ§ћћ§Эњћћ§ћ§ћўћ§њўћўћ§љћњўћ§њ§њћљўћћњ§њћњћњћљ§ћўћўћўћ§ћў§§њў§§ћўњњв§њ§њ§ћ§њ§њћњўћў§ўњ§ћ§њўћћњћјњљћњ§њ§љњљћњ§ћўћў§§ђўћћњћњњљ§ћўњ§ћћ§ћњћћўњњї§ћўћўћ§ћ§§хћ§§ў§ўћ§§ўћўњ§ћћњ§§ўћ§§ў§§ћћў§ћћ§шћўћ§ћўњ§њ§њћћў§§ћ§ћўћ§ћ§§тњ§љњјћћў§ўћўћўћўћўћ§ћўњ§ћ§њћљ§§ўў§ўў§ѕћ§ћ§§ў§ўћў§§ѓў§ўњ§њ§њ§њћњћћіўњў§§ћ§њўћћў§њњю§њ§ћ§§ўћ§§ў§ўћ§ћў§§ќў§ў§§њћўћњњћ €§ў§ўњ§§њ§ћњњљљјјњњєљїїњћ§§њ§ћјњњќљїјћћјћђјљљћљћћјїњ§ћњїї№јћћљњ§њ§ћљјћ§њћјјљљћњљїњћњњ§ћњљљњјкћїјјћћњїѕїњљєљїѕєїєѕїїјљїјљ§ў§њ§§њ§§њћћњђљњћјњњћћљћњїѕїїѕьђѓѕїѕєёььяюьєѓђяёђѓєєфѕљїљњљ§љљћћ§§њ§ћњїѕѕјљїјѕљѕјјеєяьэяёююээщщяђђёэщчцщцбпхспяэѓчанпыюяююёѓѕєє‘ѓєєѓѓёёэьыьяэяьэьююьтмтшщрзлжекущшхшчщыэюегбжлсткЭгпсучщщьыёѓяыыээююыыэщцучышшуснуцыцтчьытпмстцщччхьёёєђєрнкддззджзучуучэюяѕђщтручщщрнуцчтнснущьыэцчшэяяэььэёёђёєђѓєєїѓєєїїёшщээяюьљэюяюшшццєшщьуучэьччшщщђьшшчщэююэьщыяѓѓ№єѕѕјљїїљјјєєѕѓѕєєќѓђяёёыяэђёяччутсцяђяяэёяяэёёєєђєђєѕђюээяђђієђѓѕїљњљљћћфєѓјјїїѕѕјјїѓѓёѓѕѕђёяюььюёђѓђђѓвєѕљњњљєѕѓєјїѓєѕљїњјјїњјњњјњњјѕљјѓїјњїїјїїѕєѓѓєєѓїѕќєѕїѓѓијѕєѕјѕљѕѕєєїѕѕѓєѕљѕѕњњѕјњљњњљєѕєљљњѕїњјїї§ѕљїїљшјљєѓєєјѕєїїєїљјјћћљѕѕљїњњпљњћћ§љњљњјљѕїљљїјњњљїћљљћњјњјјћ§ћћњњјїјїѕѕїќљѕљњњћїљњјњљљїљїїњјњјїљјјћњјћћјјўњћћјњюљѕјјїѕїјљњњћљ§љњјњњљхїѕїљјћљћћјѕєяѕѕєђјљњјјњјњњћћјњїљјїљїїшѕјјїљїљѕѕїљјњїљїїѕїїѕѓѓѕѕЋјљјјїѕїљљїњњћћїјњњјњјјћњњјњјћћјїјјњћћјјњљїїњїјѕїљјїєѕјїїѕѕїєєѕєєѕєєјѕїїљњћјњјњљ§њ§§ћјјњїљјѕїѕљћћ§§ќћјјїїљјњјњїјљљёїєѕѕѓїјњјњњљћћњњѓјљљїљѕњјјїјћ§§јњћїјњјїљљњўјїїњєјљћњ§њ§ћћљњћћњїўњћћљюњљњњјћљњћћљћњљїјћ§§јћњњјјњњїї§јњјјчљ§њ§§ћ§њћћњјїѕїјћљћћљћљљјјўљћћщљћћјњјљјњњћљћљјњјљњј§§ћћјљѕјњћљћ§љћњ§ћћњјњћўљћћ§јљћћљяћєјћњјїјњћћ§§ѕїїјјћшљћјјїїњјњјћћљ§§ћњ§ћњјїљїї§њјћћќњћћјјљћљјїљњћћўњїїќјњїјјњљћјљњјљїїћѕєѕїјј§њјњњёљїњјїљљјћћјјњћ§§јћљћљѕјјћћљћѕњїїљїїњћљњїїљљїїєєїѕѕ§їѓєєъѕїљњїїјњїљїјњљѕїєѕїїњћћ§љњљљњ§їјћћћљїјјћћёљњјњјїѕѕјѕїїѕјєєеѕљљїљјјњјјњїѕѕјѕїїјјѕїјјњњћћњљ§§њћљћћјѕѕїѕїї§јњјјѓњјћ§ћћљњїѕєѕјјћїјњјћћ№јљјљћћњњїїјњћљљћћјњћњљћљїњћћяјљїїѕјњћ§ћјњјљїљњњћњјњјњјњњыјњћћ§јљїѕѕїљљњњљјјћћњњјёњљљјљћћљћљћ§њљћћјьљїѕєїјћ§ћљњњјљљјїѕљњњљрѕїњћљљћћљћљјљў§њћјїљјљјјњљѕєѕїїѕѕѓїљїјјљљѕїїњјћћыњјјљїљѕјїњћћ§ћњјћљљњјјфћњјїїјјњјћћљњњїљѕєѕјѕїњћћљјњњдїњјјњћњћњїјјћћњњјњїѕљјљљћљћњљїѕѕѓѓєѕїњљљјљїѕѕѓјѕѕєїњљљїїљјћћјњёјњћјјњљїѕјјїїљјјїћљћ§§љјњћћсњјњњљјљћњјјїїљњњљјњћњјїњћјљјїњїїњћњЖїѕїљїјјїћ§ўў§ћњћњћљњ§§љљћћљћњћљњїљњјјњњљљјњћ§§ћњњјћћјњїњњљљјјњјњњјљћћљћњњћћяљћћїјњћћњњћљјїѕїњњљћіљїѕјњјїјїѕѕїћљјјњјј§њѕїїѕѕњјљћћњјљїѕѕђїјїїљјїјљїњћћњњњјњјљјћћђ§њћљњњїјјћњјњћћљљћћљћјїїўјњњяјњјљѕїїјњ§ћћњјљљїїпјљћѕљјњњљћљњјїѕѕєѕјѕѕїљњљћћљћљњјњњёјњїљјњјћљљћјњјћћіљћњјњћћњћњњэћљћњљїљїљѕѕїњњјњљћјјљљћћјјњјјцљѕѕјїљјїїњњјњјїјњњїѕѕїњљћ§§ѓљњћћљњјњїѕїњїїѓєѕїњјљћљјїїњїї§љїљљїљњїљњњјїїћљјњњјјіћњ§§њњљњ§јјіћњћљјњѕјјћћђњїїњћњѕѓѓєєѕєѕѕћјљњњјјњјљњјњїћ§ћ§њјїїѕфјћћјєњњїѕїїљљїѕљїњїљљѕљљњћ§ћћїњјјћћљљћњњљгјњїљ§§њїѕїјњјњјїїѕїљјјњњјњњјјњћ§§ћњњїљјњњјњјњњєјїљњћћј§ћїљѕѕїїјњњјјњњїїјѕњїљїљљјїњїњњјїљљїїєјљљїќјњљћћљјњїїѕѕјјћљјјљјјўњћћћјљјїѕѕіљѕїљјїїјїѕѕќјѕѕїїїѕїѕїљїљїјјЬїѕљѕљїѕњїїѕјњћљћјљїјћњљѕѕјљљћјєњјњљєєѓђѓєєјѕѕљѕїјљњјјењїјѕљјѕљїѕѕљїїѕїљњјњњјїљ§њћњњљњњ§§ћљ§ћћїїјћћыјљѕѓѕѕїјњљјђєѕѓєѕїљљњњыћњјњїїњњћљјњїћћ§§љњјњњѕљјћљ§њѕћћљћћнљ§ћњјћљћћњњїњїєѕїѕѕљњњїјњјњњљљїњљљћћљщћјљ§ћїјїљћљћћљљћљњјњјјћћќјњњ§§њњљјїљѕѕњќїљјњњћїјњјњљћћњјјћњїљјћћ№њјњјћћјїїјјњћћњљљьїјњљєѕєїѕєєѕњњјљїњїњњќїјѕїїљјљщћњњћњњјѕљјїњ§§љћњјїљјћ§§ѕјљљњјјїљїїјјљњјњљћјљљїйњљљїјѕѕїїјњњјјњњїњїѕѕјѕѓњјњјљњїњїјјїљљћћјљћњјјњњћћјлїњјњјњљїїѕњњїљљњћњїѕљїїјєєѕљїїјїњњїїјјћїљјњјјћ§їјћћјљћјјћјјњњћјўњјјёњљљћ§љћљћјјњњљњњљћјњњјљћћўјћћћњїѕїњњѓ§ћў§ўћ§ћ§ћ§ћ§§іћ§ћ§њњљћћњњќљњјљљјњ§ћ§ћћњљљљјљњћњћњњђћ§ћћњћћњњљ§ћћљљћњћњћ§§љњћњћћ§њњћњћјљљћљљ§њљјј§њљњњўћњњћћљљјљљ№їјљјїѕјјљљњћћњћ§§љћ§ћ§§ћњњљђјљћњњљћњћњљљјѕѕјѕюјљјїѓэяђёщїѕєёѓєѕїїјѕљјљћ§ћћњћћ§§іњљљјјїјљїјјїжђёяђѓёэяяыэђєєѓяупуччдлтптшяєсЪтрьяђяёѓѕєїї›ѕїїѕѕѓэщыэююяьэьэђяырлпцчнйззейхыццышушяябЭЮайнрлгЮжтхушышэѓѕђьэяяьыччыьстхшщхрптцээчхшюшпллнрушшуцюѓѓієѓнздбгелккжнххсцщэђєєёхмсшышнкршхпммпттчьыэшщяђѓяшчяѓѓєФѓєѕїїѕјїѓљѕюыэёюяђђёэщююёђёщцчусцэщхтхыэшухчшьюьчшьяёьяэыьђѕѕѓїјјїјљљјњњїїєєїхѕѓѓђѓђѓєєѓюыщхнтэђєђююяюьюѓѓѕєѓєѓєєёюёѓєєјђєѕјљјљћћќњћњїїљјїѕ§єѕєєЮѓёёэюёѓєѕѓєєѕѕїјјљњјїєѕїїѕѕїјјљљњњћљњљљњњљњљјњњљњљљјњљљјїєѕїїїѕєѕѕєєїјѕѕїњјїјїњјјїіѕјјїїјљљњљљюњљћљљјљјљјљљјљљњћљљ§њјљљј§їјїїјјїѕѕјљјњњјљќјљњћћщљјљњјњљјјљњљљјљњћћњљњљњњў§њњњљњљїљјјљчјњјљњљћњћљњљјјљјљљћњљњљјњњћљњњћњњљљњњћњћњњљюћ§њњљњћњјљљћћ§ћљњљљјфљјљјњњћњћњјїљјјїљїјљњњљњљљћњњњљјњћјљљњьљјљјљњљјњљљјљљјљљјїјјћїјњњљљјпљњљћњћњљљњљњњћљљњљњћњњљњњљњћњњљјљљйїјљјїѕїјїљљјјѕїїјїїјїљїјљљјљњњљњљћћ§ћ§њњљёјїјљљћњњћ§ћћњњљљшњљњљћњћћјљљјјњљњљњљљћњћљљщњјјљјњљњњљњњ§ћ§§ћњњљњњјјљўњљљќњћњ§§єњћћљњћњћњћњљљпњћњћћљјљљњњћ§ћњћњњјљњћћ§ћ§ћћљљњњљљ§њљњњћј§ћ§њ§§ћњњљњјћњњћњћћњњћђњћњћњћњљњјњњљћћђњљњћљњ§ћћњћњњћћќњљњћћћњ§ћћњњљњљёћњћњћњћњћњћњћњћћяњћњћљњћњљћњ§ћјљћњњўћњњљњєћњћћ§ў§ћћљњљљњўљњњѓ§ћћњњћ§њњћњњљљќњљљњњљћќљњјљљћјїјљњњэљњјљљњљјјњњћњњљћћ§ћћў§њњ§ћњћћњљљјљљ§њћљљљјљљјїѕјјѕїј§љјљљѓњљљјљњљјјѕїјљљљњћњћћљјјљњњћњњћћњњўћњњ№ћњћљњљњљјјїјљљјїїј§љјњњљјуїјљљњњљљњњљњњћљћћ§§њћњњїјјљњљљ§њљњњ§љњћћјњћљљјљјїїќљњљњњњјњћћњљљ§њљћћ§њћњњљђћњћњјљњњћњћњјљљћњљћћњњўјљљњтљњљњљњљњљњњ§§ћљјјљјјљњћњњћњљљњњёљћћњћћњћњћњ§§ћњњўћњњьјљјљљњњ§њћљљњћћњљјјљљјљћцњћћњћ§ўўћ§њњћћњћћњљјјїјљљјјўњљљњјќљћљњњяљњњјљјјїљљћњ§њљњћћўљњњєљњљљњњљњћњћљљјђљјїјљљћњћњљљњљљњч§њљљњњћњњљњљљјјњћћњћћ§ћљјјїїјљљћћњјљјјўїјјљјљэјњћњћњњљњљњљњћњљјљњњљўјњњћм§ћ§љњњћљњљљћ§ћњљњњљљјљљјњљњљњњљњњјїљљњќћњњљљљјљјљњњћћіў§§њљњ§њћ§§ћњфћњљњћљћјљњњљљћћњљњ§ћћљљњћњњљљјњєљњљљњћњћћњљњњ№ћњћњњљћњљљћћњљјљљђјћњћћљљњљњљњљјјљљћјњњљњњ§љњљљѕњљњћћњљњљљјјђљњљљјњљїјљљћњљљњђјњћњћњ§§њћљљћњњьљњћњћњћћњњљљћљћњљљњљљєњљњјњљљњ§ћћњњ§љјљљїњћњњјњљљћћќљњљјјёїјјљјљћћњћњћљњљљїњљљјњљњњћћћњљњћњњіћњљњљњћљћљљћљљјљјљјљљќњљћњњћћњ§њљњњјћїљјїљљњњљњљњљљјљфћњћћ§ћ§ћљњћћљњљљјљљњћљљјљљњћћњўћљљюјљјљјјљљјљјљјњљњњљљћјњљљњњ§ћћ§§ў§§їїњћ§ћћњљњњќћњњљљіћљјѕѕїїјљјјћїјљљњњљћњљњњјјљњљѕћњ§ћћњћњљњљљјњњћњњћљљјћљјјљјјљљјћњјјљћћјњћљњњћњћћљћ№њљћћ§ћљљјљњљњљњљљўјњњъљњљљњњљћћ§њљљћјњљљњљњљљшњљјљњћ§§њћјњљњљњљљњњљљњљљњљїјљјјїљљћљљјљэјїјљјљљњљћњћњћњћњњљљ§јљњњњћњњћ§њњѕљћњћњћњјїљјјјљјњљљњљјјљїјљјљјљјљњњ§љњјјљўњљљ§њљћћќњљљњњёјљљњћћњїјљњљјјѕѕїјњњѕїјљњњљјїјјїјјљјјљљјљњљљњћћі§њњљћ§§ћ§ћћтњљљњњћњњјјїјјљњљјїѕѓєѕїјљјјњљњњўћљљхњћњљћћњ§ћћљњљњљљј§њћћ§§њњћњњћёљњњћњћљљћљљїєѕјјќњљљњњљјљћњљћњћћњњћћњњљјњћњћћњњћљњљњњшћњљљ§ћ§§ћњљјњјјљњљљјњљњљљѕћњњљњљћњњљњњ§љјњњѕћљњљњњћњљљњњ§ћљјјќљњљјјіљјїїјљњњјљљ§їјљљјжњ§ћћњљљњљљњњјїљњћ§ћњљњњјњћћ§ћ§ћњјјљњњљјљљњњљљњљћћњјјђљћљјјљїјјљљњљњњъљњљњљјјїјњљњљњјљњњљњњћћѕњћњћњљњњљљњњићњњћљњљњљјљљњљњљјјњњљљњјљљїјљјјљљїљљњљљњњћ§§љњњќћњљњњўћњњќћњњљљљћњћњњљњњїљћћњ§ћњћњњљўјљљњљ§њћњњјћњњљњљњљў§ўўј§ў§ў§ў§ўў§§ў§§юўћ§ћўњћњ§њњћ§§ў§ўћћњќўћ§ћћљўћ§ћ§ћ§§эћ§ћ§ўўћћњ§њћћ§§ў§ў§§іўћў§§ћўћћ§§њћќ§ћ§њњњћњћћ§ћћї§ћћњћњћљњњшљњњћљ§њў§ћћў§ў§ў§ў§ў§ўћ§§ќћўњћћѕњћћ§ћ§ћ§љњјјќћљћљљфњљњєїѓѕђђјљѕјїјљњјњјњљњњ§ћў§§їћў§ў§§ћ§љљњљ™њљћљћјѕёѓѓїєђёѓєёѓјјїѓяцьяёзсыщцїѓћыжтщѓїѕњєїїљјњјљјњїљїѓээёђѓѓєєёєѕїэшнчюяцрлпеньђюяюяяѓѓїкйжзхэьцманььЇэђьёєљѓїёѓѓїѓяэѓяючяёёыцчтщђёёцђђёчунсшьэячёђїєјѕјшуннзрухтчщёящшяђѕїјѓятьђєэштшьэчпрцхёѓѓѕђяѓёѕїѓёѓёїїјžѕјїњјњјњѕ§њљюѓєѕѓѕѕєђѕяѕєѕєѓюђьююѓђючэѓєящэђэяђяьѓяѓєєѓїђѕѕљїљјћљћњ§њ§ћћјњїћљњјњљњїљїљїїѕїѓѓэющьђѕѕљёјђѓєѕїїГјѕјѕјїјєјєљѕјјњјљљњњћ§§ћ§ћўњ§љћњ§љћљћјљїјљљїјїјєєђєїјїњјјїљјћњћњњјљїњљјїњљњљћћпўњћћ§њў§§ћўњ§ћ§њћњћљњјјїћјњїљјћјљљчњљљњљћњњљћјњјљљњјљљ§њћћ§ћћю§љћљ§љћћ§ћўћ§њ§њ§њњў§њњўћњњєјћљњјњћњњўћ§§кљћњњћўћ§ћ§ћўћћњћњ§њ§њ§њћћўњ§§ў§§ћўћўћ§§ѕћўњћљћљћњ§њњшћњўћ§ћўњћњ§њ§њ§ћўћўњњћўћћў§ћћђўћў§§ћ§ћ§§ўћўћћ§јўћ§њћћ§ћћ§§ћўћћњэћњ§њ§ћ§ћћљњјћљњљљњћћжўћўћ§§ўћўњ§ћћњ§њ§њўћ§њ§њ§њ§њћћ§њ§њћњњљњјћљљњ§ћћњ§њњћў§ћћќўћўћћўўћћв§ћ§ћўћ§ћўћћњ§њћњћљ§њћјњљљњ§љћњњјћјњљњљћљ§њњћ§ћћњў§ў§§ћћкўћ§љћњ§§ў§ў§ўћўћ§њ§ћўћўћўћ§њ§љћљ§њўћўћћќ§ћўћћњ§њ§њњћћі§ћ§§ў§ўћўћћњўњ§њњћћ§ўћ§§ћ§нў§ў§§ћ§ћ§ћ§ћ§ћ§ћћњ§ћ§ћ§ћ§ћ§ћћњ§§ўћ§§ѕњ§њћћў§ў§ўћћњ§њ§њўћћњў§ў§ў§§іўћ§њћњ§њў§§іћ§ћўћ§ћ§ћ§§ћмњћњћћ§ћ§ћўћ§ћў§ўћ§ћўћ§§ўћћ§ўћўћ§§ўћ§§ћўўћћ§§ћ§§ёћ§ћћ§§ћ§ћ§ћ§ћўћћ§јўћ§ћўћў§§ћёњ§ћћњћћ§§ў§ў§ўћћї§љ§њ§њўњ§§ућ§§ћћ§ћ§ћў§ў§§ћ§њ§њ§њ§ћћњўћўћћѓў§ћћњњ§њћјћњћћёњћњўњ§њћћњњ§ћ§ћћѓў§ўћ§ћ§§ўћ§ћ§§§ћ§њњ§§њ§§§ўњ§§чњ§њ§њўњњљћљњїњјћљ§њћњ§ћћњњьўћњћњјћњ§ћ§ћ§ћ§ћњњ§ћћћ§ћ§ћ§§њћўћ§ћ§§щћ§§ўћўћњљћљћњ§љћјњјћњ§њњфўњўњћњћљћљ§њћћ§њћњћњ§ћћ§ў§ў§§ѓљћљ§њ§њ§њ§њўћћђўћ§§ћњћљћљћљ§ћћ§ѕћњћ§ћ§ћўњњћћц§ћ§ћ§ћўћўћ§ћ§њ§њ§ћ§ћўњ§њ§ћћїў§ўњўњ§љћћ§ћћњўћћ§§ћћњљћњњќўњ§ћћѓ§ћўњћњћћ§ћўћ§§њћ§§ўћ§§§ћ§ћћњћћљ§ћ§§іўћћ§§њ§љ§ћћњћћњћћ§§ўћ§§ў§ћф§ўћўњћјћњ§ћћљћњ§љ§ћћњњљ§ћўћ§§§ћўњњњљћњћћ§§ћ§іћњћћўћў§§ћћ§ћщ§њћљћљћњћћ§§ўћћњћњћћўњ§§§ћ§ћћі§њћћўњћњћ§§Щћў§њљћјњјћњўћ§ћњ§ћљћљћљћњћњ§њ§њћћ§ћўћћњћњћ§ўћћњ§њўћ§њ§ћћњў§§ћў§§ќў§§ћћљўћ§ћ§§ћћтњ§њћћ§ћў§ћћўћ§њ§љ§ћ§њњћћњ§ћ§§ћћљњћњ§њўћћў§ўћ§§ўў§§јў§§ћ§ћ§ћћђ§ћўћўћў§ўћ§§ўћћѕ§ћўњўћ§њћњћћљ§ћ§§ћњ§§ћћ§ћўћћѓ§ћўћ§ћ§љ§ћўћ§§Чћ§њ§ћўћ§ћ§љћљ§ћ§ћўћћњўћћњ§њ§њ§њўћўћ§ћўљњљћљ§ћ§њњћ§љњњћћ§ћћ№ўњћ§ўћ§ћ§§ў§§ћўћћю§њўћ§ћ§ћ§ћ§§ўњ§њ§ћћїњўћўћўћ§њњгћ§ўћ§њћљ§њ§њ§њў§§њ§њћћўћ§ћўњћљћљћљћњњћ§ћ§ћ§§ћћњћ§ћ§§ћ§ћћў§ћћї§ћћњ§њ§њ§§§ћўћћў§ћћњ§ћ§§ўћћі§љћљ§њћњњћћў§ћћШ§љћњћ§§ўў§ў§§ћ§ћ§ћўћ§ћ§ћўћ§љћњўћ§ћ§ћўћћњ§њ§њ§њ§љ§њ§њ§љ§њњјћњўњ§њњћћсўћћ§ў§ў§ў§ў§§љўћўћ§ћўњўћ§ћ§њ§њћћљѕњјћљћљћљћњћћїњћћўњ§њ§ћћрњўћ§њ§ћ§§ўћўћ§ћћњ§њћљўћ§ћўћћњ§ћњњњћњњћ§њњј§њўћўћ§ћћ§ўћ§§ћт§њћћ§§ўћ§љњћўњћћ§њ§њ§ћћњћћўћўћћјў§§ћўћ§ћћљўњњћ§ћ§§ѕћњњ§њњћўћўћћюўњ§њўћћњ§њ§њћњўћўћћрўњ§њ§њћљњљњњ§ћћ§§ћ§ћ§ћ§њћњ§љ§ћўћћў§ћћђњћњўћ§ћ§ћўњћњћћщњћњ§ћњњћњћљћјљљ§њ§љ§љ§њњќ§ћћњњі§љ§њ§њ§њ§ћћї§ћћљ§ћ§њ§§ћћўћ§ћћэ§ћ§љћљњјћљћњњјљњћњћћяљћљњљљњњљћњ§њ§њ§ћћйў§§њћћў§ў§ћћўћ§њ§ћ§ћ§ћ§ћњљћњћћњљљѕљљњљњњѓћњ§њўњћњћћ§§ћћ§їўћўћћњћћ§§єў§ў§§ћ§§ўћўћћ§§ћўћћыњјљјљљ§њўњћњўћћњ§њўћ§§ыћ§ћ§§ћ§ўћўћњњ§ћ§ћ§§ўћћ§шћўћў§ў§ўћўњ§њљљ§њћњ§ћћњћћў§ћћ§ћіўћўњ§њћ§§ћћђўћ§ћћњњћћњ§ћўњњћ§ћћњћћѓњћњњљћњўњ§ћњћћѕ§љћњ§њ§њўћ§§ѓћў§ћћўњ§љ§њў§§ћьўњћћў§ў§ўћњњћћўњ§њ§ћћўўћћыўћўњ§њ§ћћњњљћљћњ§ћћњћћњ№§љћљћ§ћњћћњћўњ§ћћѓў§ўћўћ§ћўћўћ§§яћўњћћўћўћњњ§њўњ§њњќ§ћ§њњћїљћњ§њљњћњњъћњћћ§ћћњћњ§ћ§њў§ў§ўћ§ћћќўћўћћј§ћћњћћўћћ§њћњћћ§ћћњ§њћћў§§ўњ§§§ћ§њњћ €єїњјїїѕѕјїїѕїїўљїїЧѕїљєєѓјјѕѕєѓѓђђєў§§бQ@@:;5.)58353::>CF;?ŸљѓєїєѕєѓђєѕєєјєѕѕњјѕєєѓєєѓђЧѓєєѓѓєєђёёнЮŠ38EB4&,(1*0;9UCJGA3IОјэёѓђђѓђђѓѓєѓѕјјѕєѓєѓѓёёњѓєѓѕєѓѓђсёяѓѓђЈ27Y?8&&!"ANL43Cаљыяёёыѓђђяђєјјєїєїѕѕјјѕѕєїєєѕеєјѕєєѓћ§О?@9+0&(!&0$*-OP?;F(-&#.87EGZPNШєђђѓєјїїљњјљєєїјјјћјїѓєїћ§§љћљћљљјїїгѕє§ћ‘LgIBB?.&-17,ABCM>+[ућєјљњјјњњјјњјњњћјњїї§љјљљћ§ћињјѕѕѓћ§z7HZE20042"1>>EA?."0~їєјњјєјїљїњћћќјњћњњјїњњјљїљїїўљїїйјѕєѕћј}9>L1+123344&5*%9WŸєљјњљњћћњјјћћўљјјёїњњјјњјїљљѕїєѓєєѕпѓї§яZ5?4&1(,7080%,)0GF@[ујћљћћљјњјњњћјњїїљјњјњњјјѕљїїљјњњјњјњњј§мŠ<-H?.3Q,+1>72+%",%vюїїњјјњњћљњ§њ§§ћ§јљїїћњљћљћћљјуњјј§§Е33:3,&#"%#%<њћћіљћљљјјїљїјјїїѕїљњњјјїї§њјїї§љјѕѕчђѓјї{#4O:&,#&)*%$)&%їїєјћјѕяђёїїњњјј§њјїїіњћћјљјїјњїїйѕєѓѓђћ§КAJQ1,;?8E$+-2)ћљћњїѓёёєђєїї§јїљљїЙњљјїљљјљїѕњїљјяѓ§љŽ>BGEABB?54793!"!"љњ§ћћјљљјњћњњјњјјїїњњїљљїњњјњљїјњћћжљјјљљѕѓћ§кgVLG>9AB<92!##%(-#ћћњ§ћњњ§ћљћљљјјїјбњїљћјћљљњјњљѕѕѓђѓђєєѓѓђљюЄL51@H?0425)$.!&$ћљћљљњњјњњјљћћвњїљїљєѕїњњїљљїїњїїѕјѕѕѓѓљћшw3)7CE704+3:B44%"јїїѓјљїљјљћћњѕїљњњњјњїњњїїєњїїјјњјјњјїѕѕнєѕєёєїА<)?HE@CI<<:E95@Aјјњљљїјљљћњјј§њљѕѕёїљћљћћљјјћљ§ћњљљзѕљїѕљїњѕєљ§§Д4&)$;9B5,;@;5:1јњћњјњјјљїљњћћѓљјїљѕјѕєїїѕјїїрѕїјњјљѕѕјѕїїјѕѓѓѕўћ”9GA1<0713*22§њљїїљѕїїљјјњњюћљћћјјћћњ§ўў§њћјљјјфїѕѕљїїљєєѓј§ЪM8N%53208TVZ7њњјїїѕїјњњћјїїђјњњјїњљ§њ§ў§њ§§єћњљљјљїєєѓѓєєхѓћћш^BQI4%!%NNHїїјљљњњјћ§§ћхњјјљѕїљњјјїѕљјћћ§ћњїњњјѕѕєѓѓєъёїѓїћ§цn;[]J@2*(>3Nїїљљёњјјњїѕѕїїњїјљљњњј№љјѕѕїєєјѕїїѕїїљїїѕєъѓђћ§ёŠ5.-FH3%-.њјњјјљљњјљјїѕјљљ§§ќћјїѕѕ§љїљљрїњјѕїјљљћљјїєєѓѕјљњ§ўЛI,:WYMM78јјёњћљћњћљјјњјњїјњњљћ§јњљљћєљћћ§ћљћљјјњјјсїєѓљ§ћэ|IPQC@J8љћћљјљѕѕїїћїјјљѕѕђєѓяђѕїїѓњћћњ§ћћ§кљћњјњјјѕїјћљњѕїєѓђђїцЉdMMB<<ћ§§њ§ћјћљ§§јћњјјњјљїїјјћћњјїїѕѕїіѕєєѕєѕѕњїєєђѓєєїљћ§ћЖ|SHOјјњћўњїїњћїљћљћ§ћћљћћојљјѕњњїјјњћњјљјјєѕїљѕјєєљ§ћљсБœњјњњњћљћњњљљѕђєїљњјљћљљћњњљѕѕєїљѕєєїјљњјїњњћэњїѕљјјїєєѓјїђєћ§§ћљљќ§ћљњњ§ѓїљљљњћљјјїѕѕ§єѕљљяѕјѕїїѕђєљѕїїѕєѕѕєєюёєјјѕѕєѕєѓєјїјјљ§љљїјѕєєѕєїєњњјљѕ§јљћћ§јњљљћїћјїјєѓѓєѕѓєєѕїњјљјјїїљњјњњћљ§§ћ§ћњќїљњљљіјњњћљћњјїєєѓьѕљљєєѕїљїїјћћљ§ћїїћњњэјљїїњћ§њћїїљїљѕїїѕњњыјњјјћћњњѕѓљїєѕїљљјјїєєяѕїїњњјїїѕјћљћњјјћћіјїљћ§ћјјїњњёѕљїјјїјљљњњјјњљљѕѕєѓєїљљѕѕјїњњёћњјњјјњљљћ§§јњјј§њјћћїљћћјљљњјїїњњљљњїњњїљїїјїїѕєѕљїїѓјњљљїљїїѕїјћњњфћ§§їњїїљјјњјњњћљјњњјћ§§ћњћљћћяљћћњњћ§ћјјљјєєѕѕїїђѕєєѕїњјћљњїјњћћљјњљїєјєєѓљњјїљїњњћљћљћћэ§ў§§ўўњ§§ћјљїјѕњћћјјюњљљћљњњ§§ћ§њњ§§јїјјїѓљїњњљѕєєѕљјљїїпћјїљїїјћ§ўњњїљћ§§љјїїјљ§ћљћћљљћјћћњўіњљ§њ§ћ§§љћћћњљљїњњўјњњіљјјњћјїјѕїїѕђїјљ§њћјјљѓјћ§ћћ§ўћљљђћњ§њћљњњљњњјјњњ§ћњљњљ§њћћгљњ§§њљћћњљљјњњћ§§љјїїѕљњїїјљ§§љћљњљљћњјћћјљћјљњјљјјїљљњљљўјљљќњљјїїјўїѕѕкї§ўўдWA7A;73;;><5:;@AFN;CЌўѕјљјјїѕѕїјїїј§їјїїѕљїѕїїѕѕїїтєѓхг‹34@CA9+%&79,:UHML>8PШўыѓѕѕєѕїћјїїјїїѕєњѕїјјїѕѕєйѓёїєяЄ02O?>1#*"!$%&@MP99Fжўьђѓѓѕѕєяђѓїїѓјљјљјјїїјјїѕїїј§їјїїўвСF<2-:-$$((0-(PGFGJSнўђёёђєѕїєїїљљњљњњљјљљњњљљгјљјљњљљјњљљјјѕўў‹@NGA:M(2*)(+05B?G^PSбўєєѕїїљљњњјљјљњњяћњљїјљћћ§ћњћњћћњљљмјїўўŒMaEAAB;1,51("BJOH>-cщўїїјљњњљљњњљњљ§јњћћњњ§ћњњћњњјўЭ~8IWE><@9,8BB?IC@*$2…њўњљњћњљјљљњћњћњњљњљњљћљљњјљјљљўјљљўїјјпўњ{;@B0021;53.-2)2.:]ЊўўњљћљњњљњњћњљњўћјјўѕїїјлљјїћўѓO:T@91,(&%0,%5822@VЃщщљљјљњњћњњњ§ћћњњјјќљјјљљњљнњјњљјѕљўўi>974541%(35*49( @U}Оьљљјјљјќњљњљљўњљљњќљњњљљјїфјћўў^.>5>FG,-1109;4)*Vрўљљњўљћћњёљјїјїљјљљјїїјљњњ§јљїїхѕўўw*4<::84.01+0540,*7C8.*&-1I>Abшўћћњњћњњљ§ћњљљљјњљњљљњњѕјљљјњљљњљњљљњўщŠ?*>>48V17B@><81+8*xљљњљ§њћ§§§ћ§њњўјљљћњћњўшЕ3,:;FSw+&9:,.(0*1;;Эљљјјљњљљјїјљљњњљњћњљљјнњљњљјїї§ўЯN2C@Gk]8,5994+.4.3:I;}јјљљўњјјћљњјїљљљњљјљњљњњјУљњјљјјњўўЅJ<1,#-52,(&L4075.,!+qјјљљћњћњњћћ§ў§ўћ§ћ§њљљњљњњћ§§њњљињћњњљўўѕx:BC;:1,.-*35*)?72§ћ§њћљњљњљћћњ§ћњћћќњћњљљќњљљјјгљњњљћљљ§ўЧL,;@9335.%".1*&-25"Fљњћњћћњјјњњљјљњњїљњљјљљњњљљњљ§јїјјчїєўњt!2O?742*,&13-*,.,+љљјњћњјїїјљљњ§љњљљљњћњјїљњњљ§јїѕѕўхЛ?HH@CCBBL8;>31+%&*њћћљљѕѓѓ§ѕїљљ§њљјјљ§ћњћћ§њјљљујїїѕўњ‘A@BHHJOC39>981-*1.ћ§§њњјњњљњљљњњљћњљјјљљѓњљјљњљњћњћњњјјўпзiTN?BFHGB707432325њњ§ћў§§ћњћњћћњњљњўљћћњћјљњљјљјїѕѕїщѕєєёЊQ72AFA;:;?<117028ћћљёњљњљљњћњћњљљјљјјїљњљљјјљћљљ§јїјјщѕћўцu4+8EC8:2879<@;71њљљїњјљјњћћњљљўјљљћњљњњљљўћљљњќљњљјјюїєѕєЎ5)4G<4<@:.;>FFўEњњјћљњћћњњўљјјјљћњћњћћњњћћ§њљјјЭњјљјјљњјїћўўЕ1$.$$;8197;>848њљћљњљњњјљјљћњћћњљјјїјљљ§јїљљњјљњљњјјуїјљљїјѕѕј§љŽ5GC2172-,5*05љјљљљњљљјњњљљћњћњћњњўћ§§љў§§њ§ћњњфљњљјљљјљїѕћўЧI:P#3<82.0MVY2љљњіљјљњљљњ§њљљњњљњљњћ§§ўў§§ѓћ§њљћћњјѕїїјїїшѕўўы”W:QN5),(CJIљљњћћљњњрћ§ћћњљњњјјљјљњњћљјњћњ§њњљњљњљјїѕѕїъјѕїљўўыr0љњљњњћћљњћњљљњћћњ§ћћњљјјўљјјљњрљњћћњћњљјїїјїј§ўћНO,8\^QLBA§њњљћћѕљћћњњљњљљњљљћћњћ§њћћњљћњћњћ§ћћњыљїїћўўэOIUI;M7ћњћћњјјќљњћњњјЯїєїѕјљљњљњћ§§њћњ§ћћњљњљњњљљњћћљјѕїѕєѓ§ьЕgQYB:>ћћ§§њћћ§ћћљњњўјљљјњћњљњљљјјљіјїїјїјњљљїїњѕїїљћўўњНƒTNZњњљњўћљљњљћњћњ§њћћњњћњјїњљљњўљњњѓјїїјјљљјїїљћўўђцИЁњњљљњњћњљљјјіљјјљјљњћњћћљјѕљјјїїљњћљњљљ§њћљљєјњњљїѕјїѕєјўўўњћћі§њћљњљњњљјјљљњћњњљјјўљјјђїјљљјљљјњљљјљјјьїѕјјїїјјљјїєїїљњњћ§ћћ§њљјјќљћњљљњ§јљјјїњћћњћњњљћћіњћњћњљїїѕїїојїїјћљњћњњљљћљњљњњћћ§ћњњ§ћ§ћ§ћћњћњњљ§јљјјёњљљњћњљњљјїїѕїјјћљјљљњњќћ§њћћњљњљњјљљѕњ§§ћћљјљјњљљњњљњњљњњёљњљњјљјјљљјњњљїїўјљљќњљљњњљћњљњњћњњіћњљјћ§ћњњљљёњјљњњћњћћљљњњљјјїўљјјўїљљёћљњљњњљћћњ§ћњљњњђљњћњњћњњ§ћћљњљљћљўњљљјњљћјїјјљљѕњљјјљјљљјљњњњљњњ§ћљљэјњњљњљњњћњњљњњ§ћћљћћўњћћќњљљћћњўјїїјљѓјїїјљљњњћљљїњњќјљјїїјћљњљјљљћњ§ёћўў§ћ§њњјљїјљћњњњљјјћћ§§іћњћ§§ћћњљњњљўјљљјїјќњјљћћрњљјљљњњ§ў§љљјћ§§ћњљљњћћњћћњћћњћњњ§гў§ўћ§ћњћ§ћћњћњљјјљњљљњњљљћњњљњњљїјљњљјјљњћ§§њњќјњњћћњњћћ§њћћєњ§ћ§њћљљћњљњњєљњћ§њњў§ў§§њњдћ§ћ§§ћњћљјјњљљњ§ћћњљљњјњљљњћћ§ћњћ§ћћњљњћњ§ћњњѕњћњўњћљљњ§њњњ§њ§њ§њњў§њњљјћјљїћљњўўвпaTEOLMNLPPIOQOSWU^LVЖўљћњћљњїљјћјњљњљћљћљњјњјјењїљїљјњїљјјїјїщг’AFMVTI@@8>APNo[\^OGaаўѕїїљљјђїљјњљћљћјњњљїјјњїњјћјљљўїјјƒїјњўћД;?NOUEE5538A-9UdbJBSпўѓѕєїѕљѕјѕњјћљћњћњћљћљћљњјњјњјњјћљћљћјњњўўЮTP@?@CFZ]cP\eрўѕјєѕѕљјћјћњћњћћўњћњ§ћ§ћњњћњњљўњ§њњв§љћљўў™ObTEQ]AMB>;LCSSaanjdкўѕјїњљњњ§њћћњљћњўћћїњ§ћ§ћў§ў§§ћњсћњўў˜WwTVYYNEAEOS7V[`cL9CBN@HJ?GSbЈчшћ§њћњ§ћ§њћњ§§ўћћњћјћљћљ§њ§њћњћњ§њћњ§љњљўўuGGLCFL?09B@PGHG#4YeŽРнћћњћљћљћњ§љћњњћѕњћњ§њ§њўћўћћнљћјњјљ§ўўq8MLPS[1ECCBHFVIE-9`уўњ§ћћуўћўћ§њњљћљћњњћ§љњјћњћћўћћњњљњњуљўўˆ2B@IGH@GIFEFIPJG?GMнѕћўћћўўћћњ§ћўћ§њњ№§њћљћњ§љњјљњћљ§ћћѓњљћњўўˆ8JSUQFFтMHBN@.5CN;3hрўњ§њћћўњ§њ§њ§њћњћћвљ§ћћњћјћљћјњњћљ§љњћўѕhEAEAOBLMLVHCHE@EYUTzњўћ§§§ћњћћњ§њњћўћћіўћўњ§њ§ћўћћўх˜N;H@GSiCGYOWPMA<5E;…§њ§њћћј§ћў§ў§ў§§ѕћњ§њ§ћ§ћўћ§§ћуњћћўўУAILNCM@@F;Q[CŠњњў§ћћф§њ§љљњ§њћљ§њ§њ§ћ§љ§ћў§§њњљ§њњ§§љўўоАZH;45:MBCFBeBFNCI;53њ§њћћ§§ўћ§ћўўё§ў§ў§§ћћњћћў§ў§§њћќ§њњўўњ…AMONHHю?;.88>LICOL-A§ў§§ћћѓњћћ§ћўћћ§§ћ§ћћѓўћўњўњ§љћљћњћћс§њўўбV4CINJFG>@C@AFAF<5@CC>њ§њћћљћїњњ§ћћМўњћњ§њ§ћ§ћћњћњўњўњ§њ§њћјљїћўўФJSUFUUYYhMJMFA:EF38§§ћћњљїїѕћј§њ§њћњ§њњь§њ§њ§њћ§ћћ§ћћњ§§ћњ§љљўъ™ILNPT[`aZTLSI@3;BCћў§§љћњ§ћћ§ћћїњћћ§њћњ§њњћкўћњњћћ§ћ§§ћћњњћјўўуt^QVTVYYUQMNHBE@AC§§ў§§ў§§љћўћћњ§ћћњўћ§ћў§§ћћњ§љ§љљњуїјўћДZ>;JQNTMWIFF@GI?Hћ§ћ§ћ§ћћўњћћћ§ћ§ћњњњћљњњћњњњ§ћћњ§љљићјљўўђ};8AOћ§њ§њњњ§њ§њњћћњўћ§ћ§ћћљ§ћў§ўў§§сћўћ§њ§њњљњљњїўўйYI[5AMILBF]pnJћћњўћ§љ§ћћюў§ўњ§њўњћћ§њ§§ў§ў§§аў§§ћўћћњњјњјњјњјљўўјЊePbaIC;,7W\]њ§њ§ћўњћ§ў§ўћ§ћћѓ§љњњћњўћ§њўћ§§књ§њћћ§љњљљїњјњјњ§ўў§„Oz^QCC>TU\њ§њ§њћћєњљћњўћўћњњўћћњйљћљ§љњљ§њ§љ§њ§њ§њћљњјњљљўўљŸI;8F^\TALBћћќўћ§ћћюўњ§њ§ћў§ўћћњћљћњ§њњљ§ћћњ§ћ§§ћјњћјњјљњўўѓШYEONUŸьяутмлккхсцсежйЧЧЭѕьхсхцтУp.*08:+"Z{?&9,8;+!-zгЫG7<.)534)+BДюшхкгбжйзлпзлгЪЫЧЫёшшхчщєШY"-"%,&E‡|5:27>04?G>ŸЭНU:\U9@795A5<ОыенпгШЫЧРФЯЧЧанЦФйєэыээьуИ]5"@*"5E;OЈu4-75BFGeo4$#ZЅЮмЮжутеЫаЖЭЮжсычрляцчщэёюЗ1-?B4:2A8ьюєыm@BFQvЮьбСЂ?Qdd{~SGHPAяхЩйттхмЭгцкпщїѕїщтйлкнпьѓДO:I-%&xЪЯЭгмкйпйбШР’ƒЖыјїщгншыѓєёx##+(($.9КдЩЦкژŸ—uрщЧШшЃ;4dHCFB4"ЏыяїьхујїŸJ;]40Jv‘НцшччхЭ9%,7(:BcйѓзЦбйрцкКВШШСпЗP.]E2B4$%щмЮкЯЧйУ<(001,%"+ЛяшрысжмОY:4.#*!ˆеТОТШТФЭааЩЮдсыЕ>M\85$  TФйЕЭзьшžA(%(!. ƒжїткрзЮ‘,#(,450•щмЫЭУНЧРУФОбжэюАB+C21eБалаеыїыS,$,hлєщнжцР`!").$2ЈЩКОЦЩЮгаШбЫзЮЪУИ\.V?"IйюылбИШЁ5-W:!VдшьчєєШ: #33.04+wткЯТЧЯбЮЩбзЮЯЯКЫЕP2B2* AЖЛЏЭбЩємL%"*1"#4wцптгёёЅ ,0&}цєсйЯбЫЪЮдаЭзесчхЏS>.2+$ BУзбЩдЭЫЁ:9>(.";ЊКящпуУS($28.-4eУлжлмеФЦОЧНММ€DЮгЭшюœMS<>,(…юнЩЭкюсОN3;+$+!mВzащэбФОЏk,1mЫѓшпумцштдкеЭбагмршюеmN:O^GLUЗыяѓЩбЗдкnA@?,;<87rНШG—јяюьЭ‘&%dйеЯЭбЯехлбддЪкдгжмгЯнэѓЫU8JdˆпмДТЛЌЋТнЛV;57LNnФЮР`ЋаЮФИm25”ЗЭФШМРЭЫТЧгЮЫджййейлЯЫЦН—jŠŠ{œлййзЭЫЮуѓыШМЎ…ЄахУцмШ?SgY{ЇСЕЊалєщеУЗЊТУСЛСЧШЪбпксйеСЭТЕ—ЂДЛдбскжлЯМЛжнчбЯСЩнаЈ›АВО(1>318CFd’žЃКЧОТНмлсйнрЩРУЪжЭеЩгг€ъаВЪйчянЮезежйжССТЦЮбНМЖЋ™ЃЄЉИ#2.4%]@-"F\?*SpœЋлымФетжзйцщщтмдедШРНОзнуЩТЗАЈЃНСгкжЩЕЏЏЏНББОКР(-5-).,(&-8!":Q?BHe™ВеТЦйтЮаЭКЗТРФТЫййннгаМСЛБЄВЭрдЧТТЩжмлаУШбЪ)%-5973$02,.;A.91)+800,50::CWEW.B248ZM>73->EF;HGE;79E4HOC>Z}\(&*,#$3<5+,547+!+3$-5;0>4)+#+8:3AGE@;FG8B>>?<7@52.57?9,+:9AB34((CM71+Nk‚Q+-4rU)1)#VH@B34)%%,+)371..5?.+7;C>89878&.3;;32<@VJ<5&BWJ>2!HFOUJG7&(4>7(%7.AE2,&35.0**4*,5-,53;:2BG;)H20(2"$(%&,2-T+.01.)((9?-@?*3%-,3:5A>B9>;9"2.+2%04+-.;@;A7)+05FC?-9:.2,4B7#&+19*H>>C;)0;>50))9:;9<-09?E;A@48A<9??87AE@433*%++FHB858AEEC@%!")(79BCB7738:078@CGC9J><:28;%3@;>;C;85.77B@>9<594.EF<>03GJ@7<;I<98($)5Q`Gh@CCG8EG?:A04@8?CQE3%(*9>:8A;82902813?759>B1.9<54<2,$-10bA)+4BCBBIMF82ћФ{CMACTTJI.-44>98QMPQH?5*(-477HmV+7>8,;AFmQ3+§§љяњд™kVBk]547*-41>B78<;4;?HG?>BAA>?:;>:4#!јњјљѕјєљљњћћњца™Z81+NA+.;GNHN^EE@FcTB<<4#IEGE:5>@;>>;@>,>C@GTEINњјљїњњјјљјљћ§§ЦЩ—Œ›ŠoP@;8An^NENJCIJC?@13>8A>7?JMqE?F>;B@^ZITU§љљјјњњћњњјјПљјњћ§§ў§§дŸq]P[iU@@WIL?>GB::hbOQVHOTU-:1)UTLYVTW`W§§ћїїјјњјїњїѕѕєєї§єј§§ЩїШТЯЎЉ™™vmTG\T?MEJMYHFH;BHBB:WhaS>SiiL§њ§ћјїјњњљћјљјѓїјјќѕјѕїїљљњјѕёћ§§жёкнлЎИСЌ–zx{dOHPZT5EdYhdmqx–јћљћћјјѕїљїјјњњЭјљјјїћњїїјїѕѕєєёѓѓєѕїѕї§ћљ§§їялШМp‡ВК”ŒарШЌЕУдЭћћљљћ§єћ§§њљћјїјјњјјњїрљњњјљјљљјјўўћѓюьž‡АИМЯБжбЫЏЏДК”§§јњ§§ћљљњ§§ў§њљїњњјїїћјњїѕїїмњјњјїљѕєѓѕїлКпхЮдЛЎФМЇЄ›™›їјљљјћ§љљћћјљэјљћљћћљљћјљљћћљћљљћћјњїњљїѕјєє№ћљѕјѕєѓьнцЩЭгФШЯ€ЗўѕєёяѕуФk)(2+72<4AQ")-.5.3&7‹ўьrNTG;<:@ET98Ÿ§ћђєѓѕѓєѓђєѓђѓёюѓђўѕєѓђњћчœG77"49AE9Ye74028>;:.2TеШ@.OE79ACAQO\Еўўѕѓѓђѓѕѓїєєїѓяђёђ§ѓѓѕѓњћч~3(%*583%&o’H,7F5BкўѓяяђѓђёёОюёђђюѕєёўєїїє§ћЪe0-A,,BH>YБƒ4,>AGIFNS2?5"vїшВˆ^S\E>jйпыщНL@YUZtw*F,2pк§јђѓђѓђђэїёєєјїјјѕђєђђёљ§Р44G>E?CB:™ўўйђtGISZ{щўњёНEY\cƒTSPYBžўўяёђѓяюђюћјћ§ўўњэяђєђѓўўНVCM;74:-BКўўдОbgpЂТѕяьћКB$BGN21)ˆѕљёѓёяяєєљђшВ’еўўћєяђђ–јўў{#&0219;!<йўђьђыВМД‚эўђњўНCFUPLT80(1ЇўєюѕѓђљўїŸb]+Cањчыўїєєћўћk#1739L2Uўўњэєў§члЦт§юўўВ@9jOLJE:Цўў€ЉєѓљўўЁNBiG7)PŠБеѕєѕђјђБA)--+-3@ErўўѓюэђюњјпзщэыћЪY3gI5GA&%ŽўћьюѓэїрJ.;)7>,$.Цўљѕђђљўй^97++%"#—ўѓэьцшшщьэяёёўўЭ@(Ua<5-+ ^яўчђєўўЕL-,$%))—ўўїѕёљђŸ4$%)185Ђўўяэюэыюю€кѓяђўўФI0J1$,tзўўѓёњўѕ].&$#!(wўўјєєўцi24-(,8Ыїцщьюяяёѓяєяяђїдd4[A3#$SэўћѓђэєИ90]@*+%$!^љўўёўўп@ 01254:)ўўѕэьэюяѓяяєєёюћпe;M8,0+*HзярыюѓўяT,-$-,,$+>ƒўѕўёўўМ% 3..‘ўўјёђэяяёяюяюђјћўЫ`E;>9+(PьўєюэђяТEE2ч540&!HФлўўя§уY0,3;:#0nсўђђОёѓђєёёюэѓяёюўўЏNZHE82!)”ўўѓђю§ўшaFG997.("*{сƒрў§їязЧu..!%щўўїяѕѕєєыёюђяѓѓєєўўцzYIWeEP\ТўўьђшщњѕxMIG3>C:<ˆпўMœўў€ьшЎ0(`ьљѓююђђяёєєёєяѕѕїѓѓёѕўўз^,;Qmэѕхээяхѓўе\J<?VU|шјђiЕцыюм|59ЏюђяээыщыюяюђђяѓѕєїєђѓяышВwœ›‘ЅїњююёэяћўўрйУ‘Мщђзўўђ%NbpmŠЖаТЧнѓўўыэщьыёђѓёьщьяэђђѓёѕѓёэкУпцѕї§ѕєђєѓѓэњњѓїээўўсаршэ*);C<:<>GBE8!)%3WVQ.(:J`kQG>UbhQ;IU[vb[kЃЕЂдсЪЂ…БЕжЛ—hjuT^.,,294.2044;?B@9;A@EA@A@FJC89?ZePS7P@>LocE9<@GNSCIOQNBHZ:??:885>;7175EG@<;5CCGЙPQNNMGEAJGLdS?EMT@IV^B:00Fpa?@[1e[*%,292--E98AHS"&$+G25;;@HJGELHJC@BEEЛC?ALIE?;AFIG?71Vv‘]89:t]&$14$,3VIF<>.00(05749?<GUWVI>.F^SF<)%"HAOOF?3.,8E125;FC?:23329<>GHH€nILHLJLN@*02-573@A?BGFA5P89%)?!1&*231>M2),,-0-2:AJE<>;;13:9:C@CEF?:ABFJF;39>83-*27955205:7<"&)33*-+.19?9::><5,->ELFAA@A77@B@#!,1;;A>@4+,-;9A>97:>@@5149773354;BC;39>:157IPF>9?FJLIC37(%&?AGA?A>;<9::CANB??L:C<>@B@<730287>@<78><4:>JLGB?BOUE?40(1@Pd@nIBHBACMLABNk:AE3:BC@?T>,(,20:<>:43:2884549;<579*).8*i…?3:;FHHGJLA58§Щt@SBJM[OJ7233б45:?BA?@99:;@AFECFLLJLM<.(+29<2LeZ:??>;@CLGHEJQC",NA;5:@>:;%S^L:8;P]c`?>FJF@BC@>:7NHFMcFA>?ZOC47%0PCIJ<:99юHY>EOњњјљљњќћњћўўЦг”™xM>?9BneJCFGG>>C@3::9CC3Ug]W@TinO§§њіљњћћњјїњљњњќјїјљљњћ§ћљљўўжэзлмАЕТБ–{zw]E?G][2Eg]k`irxњњћњћњњљљјљњњљљљњћњњћњљљјњљљјїїјїїрјѕјљўўћўўњёжЮЗwm‚ЏЛƒЯсФЉВУаЮњњћћюњћњћћ§њ§ћ§ћњњћњњљњњљђњљљјњљњћ§ћћњњўўђЬэ˜ƒЊЖНаЏгЯТЈЊЏЗާћ§ћ§ћ§ћћњћћ§ћ§ћ§ћўў§ћ§ћћљљњћљљњњљјљљњгљјјїѕїњзИмыЫжНЈСРЃЇ˜–Ÿћњћћ§њ§ћћњћњ§њњјјњћњћњћћњњ§ћћњћћњљќјљјїї№њћєњљђѕщкуШЫЯСЪаЭўяђююѓгМn19A.FBVHTJW1&;@JEAC5G‘§м|`\UOQQPN\@W;EL^JeОŒE@USWTUU?WбњЦZ]rYQZYUL^dŒсцгйрэяэстынссрьёюяњѓьёђўўћh5>:9@931ˆяЖP9?rWE,;QTЗчЉ5L|[\biTYjgmмўѓктяђпнушэёэёђѕѕѓјєёјїўўнOFWQjLTI*}юкЏ™nejS?rеыуЩБUAOWj}‰8P<8jОшѓсхяђцрсмххыђєєђєѓєѓїєў§Ф0*5ŠхуьэюсщыьёмйЏ—еўўћѕсяёєјўўŠ1,?F9BB"@ЧыхзьхДКЏ‹ѓўсьўМTNdbYZ@35+?ЌщнррщьѕєьЂjj:$Lаёптўєђљўўй})(CBGLUB]ўўєыю§ѓЫРУзјѓўўЗMH‚k\]TF3(2Щўў€ђёїўўЊVNvTE.Y…ЉЯёђѓѕљчЏH.7?@;LLOxѓўютшщёєягЫмсељЮjEtY3LZQ53*”ўьтщчлэлM0.2™ёнжжкдзйхслрьљўЩM-\rNFI1&bпѓЪчяўўИQ988@>;.!ЁљўєюэьцŸ;%&:11BGAЈњћэчнЯккнймцэњўРZ?[F$5"8Шўњьшўўљa;,*7:>,zђўѕэшўжt)(:9jN875+1QђўњђщнлЋ??pH<1.1*)eэўўяўўтH5;GCGF3‹њѓцмдйрхлцррьэзьЩeCa@;@50MЭдЦпррўёY8<7<@411J’ўјњчўўР$&AF?%˜§ўёясхпхчыхпхэюѕїЫePEMG9(%ZпђуутнсЗJTUF:;8;0+OЦаў§юєлa84FCI4?uйьыыящмйрлнбежтхсљўВaeWPG5*2–ўђрцш§јмeJVGEF>2.4‡ЯŽцўўьмЯЦ‚>9*(„сўљёээюђьюыслцрэюяљўтƒ^ak}ObjУўў§тсЭцэzZTOAJOIEŠбюYЏўў€­сЎ:%4cяэчстшђёюыёюмцыьѓэыуяўўдg3A`}‘яэЭгаШЦйљдdPH&CZc|кре&,vНццйа9%AЊбнмйзкнйзрщцршхчэьэычсгЮЋЄ—”ЎюэьхтрхјўѕпдСžИђљеўїп)IP5:UbPTdzЏШыдрѕђчшхжЯйеЯбнэхяяђуаагЩРЭуьцнжмсчюыэтхщщBA@FLOMQMBHPNGQ`U]g^W{‚œЪўђшєўэсечђїїћўўѕнрнуцкабхщщ€LчнулдрцрйнрLLELFF;?>LCJJLSYUco‰xQGJPYpx—Ѕ~‰ЗЭТДЯшЯгЯыуменбмхыјўьѕјяёїўћхцйѓB@GQNI8@@ICNUJYNOLLIMIQIWQLMP]qanG^BFUxgPFECOVZH\`[SONZC]^aQv–q<:?IBM?HOSOOLIMLJQJLGIIHQTOOIFLTP\\[[\^[ULUTQQg\O[Z`OQbnUG7;SЗuZVqGvg:5FOIHCCWZTQZg,2;(8TJIELHTT[UNPMNTLSPTPQOYZQZSMP\ZPICjŠЉmM$3FOŠq-$??CL2Nr`YOQEH@FHBFMNGMJLO[NMV[[YQSNMCQHOVTOYManeZQB^vcZSI747Y\`e\V9?>PPOFPVUSQLELCGOFG>LMYa][\`hVSOPGOFMSUVQTY]TFaCU8?HAFFGAOPL[>?@9A>EHNPQWWNMMAFIPMHEHHGIP-95EEAAFEQINVOQMOJ@JQY]VTUSQUVPSM<>COTJSQ`\ZLFIVTQFJGJOTSTUSMSVQNFECHMFACHMMWTSNQLMNQba\PQJU]\a\?NH<BYq‚^VZW]aY`\]U^}MW[IMO\TZcWBCЯлФУадЫдюйn”Дc^eРыЦmHG*-9,?ИшћљїЮЌk?,1"(gбѓјѓž.,?@?B:50".!&2ммЮИЛУШТЕ–H*E?VaЧьеd9<"02;8WёыюђндЦО’gUb„ЄтшцчДOM>OOIJIEFVcm˜vœптгШСЪЭР™uB#,8SZЎюЭx228841UЪэлЭФкюдВВ€mцјєыеЫлЎYM:AGECML88uлюяйЭйгнгЮаТ•9E;#&-4EИљЮ|8.HOB3*@ёюЩЩЯЫйрмяьдМелсцёёk:LF:0;@J3F™щбЯчттсрзхѓ‹?MPJFE<;>70*0*0A.3‘ьбШйкжлдйнлгкуеждУгЛoA7-A;BFC7Џзйыуппрзяљыp8IhH:>4-(77К+-<7ЂмЪЭабззцрдкЩЩРУбЫЭге•V:JPMJHJ& +ЦюпѓплбгаЪэяАPF3&5:80280.5&4Wvбб€ЌЮЫйнгрцтЯЧжйЪжмтѓєЅBE;$$#8йыпїпхпззййђт`A42GNJF>00$B3IzŸЋЏНебйЪднкЮТНИТЧаШЭЧЄCN11,#%-12ЎїєєёчлагЭРШзŸV5CC;.<<5*E[eŸИЕдЯШЪЫЫЮЯИЏВТЧМЛФЩйёёVCO*)&%,1*rчшчклкЯНЗСКОШЖd-IM<:<><7)@ЗуїёмтпзекЯТИЕРЫЯаЫТкуїєВ+"153.37A?:A•КььжейЯЦОЦНгкб~94?A9CW1:ЁУШЯеШакгШЯгЫМВЖаЯЪМОЦдтпЋ"$J@B:<:4>?]ЁбѓФОССУЫемсхеьЛP;:ЫЩбмхццржгмцЭТРВАЉАЩЭНЊВМЏЊЃŸЋЕРЫШЫШФблдЦИЁŸ’МзрпьтнЕЂЭж–PEB;9ддеЭкеЪМЗШкзжНШРИНШеЧСДВЌЕЖВВЖУБВЕЏЗФСЦРСЦЧУШнЪйјјѓзvaЉ`BTC0:774ЫЩеМИЏЋМЁ’Œ–ВБЕЗыёСМкрцеЗгЯЪзЖЪЫССкЛТШИдцлђхрїчзлЈr\C^V1W?%*&-ЯЪЗНЉЄБВ™”—ЇВЛбаЅ‘ŸЏ……LNexaBC\hrxrˆЂЉЅŒ•—••ЇƒG7GGce:5J@3;:BHФДЭаОЃВВŸ™™€#~q`AISWGJ[YYMJ?JC!08-94>1+,4+!@HNP;%?-(;A5&0;:.0-24ТСЧБVpeaNA)GPFQ<9FSeQVUCMF@((8@4:7>@:AG7.?JZC*?$(.4FBC;;<99?3QQ:&OYbM)!CVOF@:?545.0,!.+)0,.3)*%9899),*FNdQ:<<>QdLMJ$$34:?BJ?%)"<53882383:@>8;<10%G.%+(*-58:B-)9B@8&?CI^@50)@@?2495)+1?EA?A?@3**WE@(:3*49HE?5.37.CC1((4,17;B825+*7C49A98*$$,3<>0)>:784185GE;>2,A5AB552>FC>..-,2;4:@BA><:7?;LF?F?5L49?<:FHFFEA9<:234..+2772-39598?90(:>;>B:;314?BI@0++-4394;B:;2:IH53,1*:2.-.98+->72,02-5@C?744914*7:8@CAGEC212:875:-)81>E8,@.>BF4))*3.B922Ш0$*.>>+"BWGNJFEA;;.3<975824<)GQML8-&190-*2<<§;#..я1-79::@9AHF?GGC;55€Š25@HCA<<>8?5AC)9TLBFEIB,L{a>WЎ@>-0>2;5?E:;@92FTLPCCPWLNVTdWG@?3G^t{WdЯї§ўѕOJECPSJ@:8@?JMHGB4;F@JIecUZVSFEC<"(7ACBT@aYFIA3,18)4P^‘ИђћћїјњљQLQQO>W^?bP4GB:Hb^|”ЋЖФтнЛЄ‰ЂУЯРŒЋдмУНЮОЩѕ§ђлОЌЋбгя§§ў§§ўњјєѕѕHC>[BG[„{d–ВЗФЧбљњт—ŒŽŠƒ™зё§§њ§ў§§њѕыщљїљњѕјєѕјљѕяєєѕјѕѕєёѓѕИЋЉЁЇЉЛЪбюУЃСЊ˜лкЈЛЁv^Z[aНцыњ§їѕєѓѓєєѕјєѕїїќјѕѕљљСїљјјњјћћњјљљжазнгМнЯЖСРИА”z|vhx™Ћ˜œА’КтћњѕѕљљѕѕєјїїјњњљєѓѓѕњћјћћИјњљїѕљњјљѕѓ™ЧькŽ˜‡k‡АДЧžƒ‹q‘ЏЧйКЯхљ§ўїєєђѓєѕїјїєѕєєѓєёѓѕїїћљћљјїђјљїњљїїуљŽОптœi|}dz—ЭсЕЖБЌаШЭкчляёѓѕїїѕјљїїљљїїѕѕХљїїѕѕїѕјњїєїјћћњњјїјјДИуѓблаЮЅ—ЊСОЎЦмыђђљ§ўѕїїљїјѕїњћљћњњћ§§ќћїѕїїјђћ§ћњњљћњћњ§ћћїЂѕѓѓєѓїѕєўћы§ўуШКюўФbEBA;?ABUчўўЖaTj?!%+?kЗўў›4JGHGHH:4803:8@EBјёѓяюёђјўьxžСkipцўыxPF+7?:5NэўўѕцМrE9:,4tпўў…Б$<9LLMSFA@2:1)"(>ѓѓюяыыђэьЛP7TH`nчўшj>C+8><@cћў§њѓѕњчЈuji–Рѓњњўе^YBQWUQNJO]r{Џ™ЉѓѓєюэѓјуЉ~J19<\hЧўе‡?<9?<7^чўёыяѕўѕмзЮьўўОёєўхbQCGFLPNSE<{щўўёшїљѓєђњѓРLF>4+99LОўд‚:7FLF3+EљўђђёѕюёєўњыхђєёўўђrCTEGLNPP>;kСўўеђјѕјєђїяп\8("&\цўѓєѕѕљїїјћїїѓѓяьњўРN?4AHNJLIOHnсўўўњїїСѕўўЪSSHOLPTUNJA8<9181@?љјыђёяѓёєђїѕєјђяђћўУC5@;QqI@?;582;<5):?@Чўєёѓѕѓѕєїљёєѓѕђяєё§ўЈ`BMOQIFT;%)еўўєнїѓєэўўЧ]M8,>@EB<0540+8eћўєяѕђђјѕєѓѓЉюэѓђєѓўўВHGA+!,.9$!;ёў§ўњѕєѕѓёяўўŠiA:CNTLFCA72G;P™тшцђэђёѕєєюьээёюяюёёјЮL]B?90142.+ Зўўсѕїѕёюёј§Уd# 8IL;:BA92Si{аыыїёѓђђШёьщшщьэђђяєљўў‡]HS$$(01.8*wћўўѓєђѓѓяыююѕеw1PUFFJQQ>0N’зўўђ€‹яёёђєёюэюёѓёяѓяєўўМ*(5:89:;CC?HЕщўўєђяёёѓёюљўєHAMHG\g>2IСїђђѓјїђєјїєєѓђђюёяёяђёњ§Р#)GE?A;:5>AjФѕўѓёыыяёёєѓљїўп^GG94d{cjњўўїљљјїѕѓєѓѓђёяюђђёЮђ§ўѕt@TLF@>:A8TКњѓўўьэюэєђђѓѓюўўœY]EMƒжцњљћњѓјѕѕјїїљѓђёяѓђѓѓэѕѓяючўћ"9LIE2SOAўўїяђёюјєїјѕђљўю–cZ˜Юмцєѓёђѓїѕѕїјјїїђёђёюјяѕєђѓѓєўўм?0~„‚M4qећўўљєѓѓєєїјјљљїєїўћгЭжтююђѓђљљјїјјѕѕїѕєјѓєѕєѕѕђёѓёєўўэЋuбўўсЌАьнЌ|2ђєђєѓєєїдјѓяячряюѕљўѓђяёююђёєѓєѓєюђюђђѓђѓёђѓєѕїђњ§бВўўгћЗДT@>?юёёїѕјїѕєѕїѓѕющшсыцьяюяьэхнрмтуьѓёђёѓђђдэрЮхўєѕѕяјёцьшёўМB%??C@юёёђѓєѕѓѓѕєёєяьщчщьыээДщцщхтррщыыющыяэяююшцпШтэђѕћўўрТэщ›U%*M>9>эёђєюэяшуьѕјїђыьюяяэєёёыьщчхтчхщчцшшаяюђёюэяёњѓєўўћсgЕnJ\L;;:8:юђьђэьпчкаЮЫутшяўўяэўўьћуљєѕњсяєйхўщььшї§љўў€ §юЕeLg]:aJ24.85яьёчщуышмлжлуьщьшЦЏ—ЏФž™VVuŒrOVpp}‚‘ЄОЭСЃŸЗЋЅАŠV@WJpvJ(8AGC@@EEюшєўѕмнжЮЮУБ’rGPaeSWga\TTCVH,4:B4$)LVWLC7H94@2$.)7LI@78F@Z[?.P]hQ<2J[VEFHHAWLC>3@MI><;AGF@AJJLMECAFG?31+,)"&,!5Y&CB;04OhJCW0*:LE;9AA€}FIIW#5BHHB?>43?>73SGJPLIMSTC52:43002575-1?7.2BGIJT@.-ELF@?HMPME>E<15A>:27F3,--#19957<>:45828:5:35951AEGC:91%5A@58@ISWVMVA),847570%%+2.2%+5747845873981,)22*2427227FG@;45LMjO@EH?U`SJN402>;>GLF1#.#4F83:88@@>?CB?;<5%N3,1&)07<9907:CA;<>@;-%)WI;2521&.8GE758GHF??8>55,259<>;;3,3441:EB<9;;:7;CAA78@GB;74EC;.&5,.8:784178:FJCC@>95:540::œ7AEE<2.48-9<89583417@>@>3.++089><<7788558?:@<0.1EE<19@;?EE?AFGC<;:850%.5;85:73;799;7;;9?GA?94.54>E@.*+3;:58:?@??;;49@HC8-..37@7,2:33#0>;3)18:7BA@>:944+-29<;72-01348341(7;>>1B3;>@<0$-21-<7-13-0)3B<-&<`MJIIF@:54558522.,7@A>4471377;<)FJTO:-.7>5-,5>@A:3)04495;>?9>8NL>NNC@:;3259<@717242>@A1@YFYЖEI;3B0:OC><9179>ECGE?>CFFA 87877<5:HHJCHI]TIZWcYHFF4Mdu{`gдўўФјWPMOWTLE>CAMONOCE;BBEJQg`VVPN@A@9#$:;FGYAb`LLC1.35%5Vd—КђўўЧњљјQPW\U?YcCaQ9IC9J^d‚œЎВШцщВ™‡~ŸТЫН‹}БксШУлТгєўюзЛБВгдьўўз§љїїјљMIBYIO\ƒ”a˜ДЛФШШљћм‘‹’‘wzЁйѓњўћўў№§љючјљў§јњѕѓњћјїїњјїјјїјјдНВЎЅЈЋИШгщОЁОЄдпžЂИ’mYP\W{Кэѕ§ўљјїѕѕїїјїїјљљўїјјћљјљјњњўћњњјогЫеудКкЪЖЦСДА‘q~n`v”Ѕ’—ЎŒДцў§їјјљјј№їљљњњљјїѕѕјљћњћњњХљјљјјљњјјї–Щьзˆˆz]}ЉАУ–x‚iˆЊСеКЭю§ўўњїїѕѕїјљњљјјїїѕѓєѕјљњћћїњљљїјљњјљљујˆРьп‘`xz[pŒУпЏДЌЎЮТШншуїєѕјљљјљјљјљјљФњљљјљњћњњљњљњњЖЗхёжкЫЫŸŽЁОИЄТкщѕѓњўўјљљјљїјљњњћњњљњћ§§ћњњљљњњћіљњћћљћ§§њћћєЄэёєїѓђљљсћћшСЕкяРhNMEPIQN[з§ђЎdawI0(07,FqСўўЅFaW]`YTGE?MCHNOTWьюмйцьньўэzŸЧrovжўп‰a[1GIN@TжўўѕхТNB90>}шўў…В,H@^[[bUPO@G;:1:MььцгЯгпкЮЇWVўўтхурьэюўњхецьѓњўў~LdZ[TZchQOzбўўљхяючыушхдdHWJMH4N`ŽLHoU[W@+qўў§ѕєђяхщьєђяѓэюлЭтŒaJLbb[\V0IAgуњыкюђяѓюўьЎU]GWW]Lrbuc@WdPN;11jшїёѕєјѕїїјєјёёытйшўЩ\MBQW]`[W`OpбхўўєѕєѓёћўЫbaVa^Zdeb[LOJAGEFPG‰тржчтщуьчшяїєњянЪѓўИOBHQPSPYWeG[ДўлеѕїєєёяўўŸ[^mbT\WQNEHFIIбYCCЌўђкэьюьяьёьщьяыышухн„ZOEQ\OZW<5"GТёѓјёяђяяўў€ЖŒPb~]USLFGMJHN5ANMОѕсхьщыьєёэщурзлцшрщяЉhI\ga]c^E.1аўї§єщыэшмўўЪgYGANSLPPQ?IB<@o’є§ыхтщяэѓђђчмшыуэёђўўКPTT7))AB<8)CяњёўѕђђэьышњїtQMW^kbVVLN;VB\‘ТУЩйчщятююьдггЭзртххрИPbMJL9@EHB8ФўўЛѓђышслшёЕn3Ea]USNSO9\i}ЖЮЪяуййннрлЯРЯжйдзпуёўў•k[iBC8‡љўћыщютсее€Ёдче{9^ePVM[]I@\–дѓў§яэюцщььккгзхчыуйяёўўЧ>:HIIMJNSSNYЏкўўьэшцнмндщёэ˜MHOVPbmE5OЛцпшщцчьчнпщшсЮжтухззйтэєН,8[TSQST@NNtИчўсбгеемшчэѓщјгaJOC<54>243.9Je.>ZLG?@\TUk?;L\VNOHIQPZ\^5"GYTZ[ONMNLIG?b]Ua[[]ebZLHEFCG:IHB@A5F.O4>BMI[YcPLJMZVTWVYd`W[SLNLMQNGMeFC>EG?MSTSGOISTJJNQPLLE;GNBSEFII>BQY[USSECHHLSW]\de^bo\1?HJNOHJEA5;EEIINONGJNMLHPAIPNC5?ABCH>7C]\SaTT€ЖS\YZWWa[PQTQTMNLOIPJTQIEJGFFJOUVQNGB?J5HAFFGHGL@BIPPWNNHO]aPSSZYV[ZY^\YQLGHBPGPMLNOQTNTLNFPPQOUTYQE;NMNLJQHIN@<:;?B@VWOIGAPAGNLTB]gdeI;?IPVGLLTVTQPGCLMFJJYPWPZccQ^^`SWE?@FGLTJI@C8JQTMANkgQ]\cU9\‘xWcЧWYGIQMWjVUQIQNUYVUW\\WWa]YYVLMHEFJGEJNMTV^Y`b^\Z\ehmooƒxJ7B^ŽЧ§ўwq[hkhbZ\e^dx`ng`ej~ƒknhcbVaeUHH?LHVPQTZhpe`rpƒm^YVG`z‰•hv—уўўХћke]jcg`WTSTYbd`WTIPVTYb{tae\QGIC?,3BPPZhTun^[P<9>@44318ET-;Кћ§ј§§ћћє§њ§љљјљњўў§ћћ§ћњљћћ§§ўўт4F- %-*%9^A;:72:J8PЮ§ћјљљћљљћў§ўўѕњ§ћј§ўњ§ўћ§§ўў§§ќњўў§§лћmOC2-+ $",4CEL5B”љ§ћјњњћ§§љ§њ§§љљћћљћћјјжћњўў§њ§ћў§њјљїѕѕ@NH %1#185@:A8;Lkжјњњўјњњьїљ§§ћјїїћ§§њљљњјљїј§§ћн§њ§њјјњ:3(2+,:17:BIHBCћћўћ§§ъљњљїњњјњјїјјњљ§њўњ§§љїїљѕєљј§§ўўжœC@9>(*$&O3?HGHBF5nћћэїјљљјљњњїњљ§§ћљјјћ§жљјјњњјљїњњћ§њљјћгi?$#!-%1?EIHC;-2LЂєћѕђѕѓїїўћ§§ў§ћљњ§§ўў§ћќњїњјјлћяЋkJ!4732 FF+13JPAG”ыјчцюїћјћњ§ћћєјћљјљћ§§њ§јљљћњњјљћћњњнєюНL;,.30+(%&-(ASTTžёяйжнє§§љјјћњћћ§љљћўљјјљ§Яњ§§њ§ћ§њљяаm&-0;92$$)0+?9@?[qєћјхуяњћїјњјљљћ§§ћћљћљћ§§еўћћў§§їщO 4394%!&#(")*+-(*>pчєьпушёїјћ§§ўў§ћљћљљ§§Юњ§њ§њћ§ўў§њљћћюєЃ[ (-#!).175.+7GМьцежхьюѕјћљ§њ§§ўў§ќў§§ўў§йњћљљБУЇ0 837CH3$085:?@>A-3HФёцрсэюєєљ§§ўљњњћљћћљ§§ењ§њљљ7374"#24?F@@880%!*FF>?jняђэшскхђљћљ§ўўє§ћћљћјљћ§љјћћќљјћ§§жњў%5:%)$+2-8,@81+.,*5?>AŽїїљєэцтэєјљћћњљћћўњ§§ћ§ўњ§§Эњћћљ§G:*#"+*0841,(&-?>B9F::Žшчкшхслнсюѕїїљїњљћљћћ§§ћЯњјјѕїѕїјјћћ§8>5(0*%*51;978(.24BILLY‹яындедакмыѕљјјяљњјїјћљћћљљ§§њљљћћ§кљIFQoжєяёѕѕђящтхїћњњ§§њћјћњњјј§їљїїњјљлјљћ12%+0.B??92*1949&&1+%$,03#.,5Ќљћєѓѓїєјїљњјјњљїњєњњїїєњјњћ§ћљћјјћ§§њ§чњ-)3<;:.70"2,201%EQE‡§ћћѕѕђєљјјљћљћћњћљѕћћіњїјљїњћ§њ§§њў§ўўњу§,2>45-"3-;8HH90!4pь§ћїљјјњћћјћў§ћћњњјјњћ§§їљјњљћњјћ§§бљћ12?0#%5184CBPNEVYЄїљ§ўїјјљљћњњљљћљјњњјњћ§ћ§§ўў§іљћјїљїњћљјјпћ§99?<>HO5+?EJFPW”чћњѕјїјњјњјјєјјўњћћїњ§ўўњ§§њ§§їћљњњјњћљћћхљјћ<:?8;><@%-bowwrЈћћјѓєѕјѕѕћљњјљїїёјћљћњ§ћњјњјїњљћћ§ўњ§§ћњўў§ћћф>;?<@CI>:4><>P:Vжўўњћћњћћњј§ўў§§ћћ§§зћўў§ћ§ў§ћћ§ўў§ћ§њoPH1&"$!&)-018?IM8G™ўўцњљљњ§ћћ§§ћ§ћ§ћћњћњћћњњћ§ў§§ўлћ§њјљјј‰FTO)((18;:@@88Otнў§њљњљљфћ§ћћњљњћћ§§ћћњњјљњћ§ћ§њћћ§ћњњчљ™:;,&(*!!$075?CFAJHˆўўћш§ћћљјљњљњљњћњњљћ§§ў§§ћћљљљјїјњ§ћўўпИIIF>$%!!%H8@FJEFB3tўўєљњћћ§ћљљћќ§њћњњєћњ§ћћњњљљњјљљћо§ћњњёE+")"%&%9BMHFLAOpћўўћњћ§§іћ§ћњћћњњћњњћњН§ћ§ћ§њ§ћ§§њњўЅQ,$#"AiCA@?F5:PАўўјљјњћњћњ§ћ§ћў§ўћ§ћ§ћ§§ў§§ћ§ћњњќљћљњњиўИrQ*;+.&%E<22;GYIPЎўўѕїјљћњћ§§њћњњћћў§ћћ§ћгњћљњћћњљљњћўЯU>38-11*##$.2%LVWYЇўўїјњљ§ћћњњ§љњћћћњћњћњњћ§рћ§ћўћ§ўўѓz2!,223-#$).&+>9ECbtўўрљњљњњћњљњћћњћ§ћ§њћњћњћњ§ћ§ћ§ћ§ћўўд§ћўў‘T)),.%*1108)..Czѕўўїєїјљњњ§ћў§ўћ§ћћб§ћ§ћ§ћ§ћ§њ§§ўћ§ћњњўўЋc"!&!"0527AEJI^ьў§єїїхљњћ§њћњ§ћ§ћ§ћ§ћ§ћћњ§ћ§њћњћњњў§ћћўкЗ%#+10,*,18+100))-0>878878:7BJF•ўўїІљїљњћњћ§ћњћњ§ћ§ћ§ћ§њћћ§ћ§ћ§ћ§§ћњћћH@70()(.125:4-+3:GH;8420,1187:;8105AJNZS`›ўўєјѕєѕђѕѕјјњњњћњњљњћћЩњћћ§ћ§ћћњћњћћ§ћ§ћ<><;727387;?CB:><31;9?:93473435:ONYwчўўјљњљљјњњљњ§§јћ§њ§њњљњњ§љјљљњћтњћњ1-0)-137;A94-311711%Atнўўћљљњўћњњ§ћњћћњњћћљљњњўљћћр§GB<50978;4,-3**187.9wсўўћњћљћњљљЧјїїљљњљћћ§ћ§ћ§ћ§ћ§ћўў§ћ§ћ§ћћњњћ>?1)&103;9*(-,(**".1qэўјјљљщњљјљјјњњћњњљњљњњ§ўў§§ћўў§оћњћћњ§ћ§ћ827839501.%"+.(05)5Дўўјѕѕїљњјљјљљћљњљљљњљњ§њћњњќћ§ћ§§ћч§%&25843+-0*01.)!AWFўўњјјуљјњњћњћњњљћћ§њћњљљїјљљћћ§ћ§ћ§§ўћўў§пћ-4::3,*(%4:AFB7+).rьўўљјњњљњћњћњњћњїћњњљњњљњ§§Фћњљћњљњћћ§ћ§ћћњ-+,8%813:CIOLC^Užєўў§ћћ§ћћњ§§ћћњћњљљњљњ§ў§ћўўзћ§ћћњљјљљћћ§њњ§ћћ1:88>ML:,8BNJLY•ьў§јїљњњћљњњћњњћљћњњ§§ўў§§§ћ§ћћљћњљћћњњћњшBEFGE:3;;JLS\YeonˆŽЭўўѕђєѕћњ§ћўћўћў§ў§ўўї§ў§ўћў§ў§§ќћў§ўўмб>(FE9+537IFBE?.47;3HNJHJHGIIY]WЅўўБјѕѕѓѕљћћ§ћўћ§ћ§§ў§ў§ў§§ћў§ў§ў§ў§ўћ§§ў^SGB?A;AC9@BF@IHST`U^LNЇўњыѕёёыёяјљ§њ§њћћ§§ёћў§ў§ў§§ћўћ§њ§ћћЭ§ћўPGEGEJLd^iцўўј§њљїјїјљ§ўў§ў§§§њўћћњ§њ§њ§ћћсўћ§§ў§§JH?E5CIGLL@AC@AJFVE9S„сўўІњ§њњћўњ§ћ§ћ§ћўћ§§ўћ§ћћњћћўћўћўћ§ћўћ§ћўZPMGHLGCHHJLGC?IHJ?EŠёўўћњњ§љћњћњћјњњўњћћў§ў§ў§ў§ў§ўўљ§ў§ў§ўћћу§PME0:5>AFHBB7UmPўў§љљћљ§ћћ§§ћ§юћ§ћ§љ§њћћў§ў§ў§ў§ўўч§ў@?BQ>133CBQ^aYQC9Aњўўњњћќ§ћ§ћћї§ћў§§ћ§§ћћ§ћў§ћћцў§ў§ў§§/classified-ads-0.13/images/000077500000000000000000000000001331670245300155615ustar00rootroot00000000000000classified-ads-0.13/images/logo32.png000066400000000000000000000026021331670245300173740ustar00rootroot00000000000000‰PNG  IHDR@ •CŽЖРPLTEqŒЅЅЄ ———ЂЪ ьььћћќŒŒ‹ЪЪЪxxwдддГГГVj ККК::7VVUђђђѕѕѕХХХhigIJH%'" @A?иии451qrpœУ јјјЯЯЯяяяссс-.*оооччшџџџффф9E d| Б ˜О ‚‚+5ллл]^YGXЊе & ™П ППП}›aa`’Ж †І›П•ЙикбЦШПbcXвдЫ3юЂ.}IDATx^•хВ#7„G0ЬЬŒfі… Мџ[хHГОЛ›T%щ?ЎЛ?ЕŒ…ћПылй9Pj†…-Kг>‹p’`’іEпу)"џ (…"УPuK+ьИшq’…YcšШп{І_%Ѕќ\ZVу„†Бѓi`IDІщg@U‰\еЯHY~“ЎЛ ƒфжЕьЕƒ~jЌвQВi"?{pП цХм>пEёўЪё‰њ)яЄБЫ‡жu™пѕZЙn­ЗЗ|іЂјмм"Šn—БкќЎŸ†ќДш†‘BЊп њ8C ŠJсхп_0yiJЗ/ТчŸн2JЫЂЋu’(Jт>sŠbљJ˜M<СъпЇећ§уђm%|ў6JZT-!$JMг‚sVи fMр~ў‘й№ЦмnЭcФОй@ш$wQб9!8CвЬхŽ'KБ љJP‰v№ё)‚ЎЂpdS\Џа<шЙ‡тd† ^™ЩѓЦNвщ Ќz›ћЕ‚fTеѕЫƒŸ"aЬKkѓ\зрЦЈввI@V@uп0%юїЦМ=Џя7А\PНs7ф‹ЉюКв2zЕd… †'г@ќР„Є;qЯ†a; lСw{Џірuт4ВUŒ Lж:Џ•аћ1BUСєР›с8ŽSŒѕ|рfќъж Иo+ђќ˜§мЌи#ж+dJe”*Ш›gmВ3ХŽHOi‘Т›ѕ8№ГŸу­xg7!&АіyefyЫ<Жѓ\fC7[…c$Dі/№ѓ\Xј0eжт[ъАŒВ, ЅЙS ZЄ™†2ђу ТѕчПЂљ§ Ль4{^зЙЎ<зУ"ЛNјhНхqpдЂ§Ћˆ`М\ŸЏ,+ %@Yv‡Ѕѕъ™Љ–дN ›ъmэЙunX%&kŸМь‘ЩЏq3SоЦ{ЕћC%з“хZn‡fЌO6єЅ•eWUДpZа4>7WъЗ‚Q6"и(Я@xnЇ7‹Ћк“ct’4<;ŒЩ XK™Ђј|Е”Т( Vќц4ТBКƒяч’‘žЊAƒа.Ђ Њ6|…wз+,Л?/зŠ–Џ ѕЫj$”$ 5…э„=;шЕЮЛѓЄс)l7)-ЄOj†е cлЖОeœф&KRѕЉэ81T`№:ожбŒ"qё.T;ќ† _FOBEЏѓ‚›&(јFqРšaЮ—№‘-г[&ь уб ‹+k8=Ѓ76ЋAprUЧЏp‰еіˆзј(@/nЛu3јzЗH9 њ”ЅL4ЭXr_+{ђыkНzš—ЭцВ§И‹beТrp@Ќ „(P`~5LЂд~;”ЅЎ>šюР?T‰  ЬO~РŽ8Šб,нв ‡§Џ…Ёc+О•ЫшŸm\œі0Хoj[o\dosиїqŸ$EбKžрп]аfядЪ:Œ”яФI J [)cBў€р€!uhд&W’B;OS%”„ќ,ƒмєљёОIENDЎB`‚classified-ads-0.13/images/mac/000077500000000000000000000000001331670245300163215ustar00rootroot00000000000000classified-ads-0.13/images/mac/editcopy.png000066400000000000000000000026741331670245300206600ustar00rootroot00000000000000‰PNG  IHDR szzєƒIDATx^ЕWKlTеўю;[hщP†:иHЕJxˆ !дG\(DCФ‰К‘Иqх#>7$ЎмИвАа• џфП +*h•J ДLщ“–N;гЮЋѓИЯsячwrO2ЩdŠ“ŒПфЫyLц|пяq~gFЊVЋhХž;§щKуё6ріџ}^@SZ$ЧЗG_§ўЋ ЊEI7@@„OЃуѓ7Юvщ ?Ё‰ЩhЭЖ98АУE@ЕРd€ыŽ А<`N ЬAIc84јдЫМѓцЛ5сЏЕKЦРL{R|Џ%aЈT*(ђХ о:~јьы/юƒRзR оўшђЁК%ŸїѕѕG—RыƒзўœѓИvDB žŒущ'ЃV,•`Kшъо†ТzŸœ?§^&_6k"юеъЁдL€ І“ЮНА7~NьэˆuгШlІшКЖe`чvDЛTф*lцсЧŸ81Дћž‰Œ1Ы3AfЖ@зuѕьЩЁУw'їјуq8uюфСїOшЧfYŠХ"њz{pц•~Œм_FOWН=$ Іa€,PЭVЩdф]šІq/62ЧqшаAЛvіbOпfмJЌ •-CЈ˜ŸКƒЏ/~ŒKп\DrqšjGк ZѕУїRQ<Л'ŽРмnOЎрјб~9:„СНћрUetvvbЕВPmЋ!BиІM›p`W/юLM`9gт‰о>Фj лbл ЁPЪkЋY–y†‡‡ЉјКЃЃІЎaœмАЉ^ЈWДЉ„B!Фуqž†rЙL5УSсT%ш&`;0@z˜ Д5T|$€ђK‘ Еmл˜H'сVy‡„щpr˜\D›#@W-cыж­ˆХbˆFЃ<0˜ФъN7ьЖ h,BЏъСѓ<0bP4x ИmSлnГ"ЃыК ёЙЧљ)ќ~№Јh6№Ÿ\Cy.жВ,AГ€€Э#РНїxMД1Т{"#эё7Рі8ЁХ€МЦSСч&ks(ьD, ’цt ]WFA\шйЬ=G8иЦk(ТNЄ4вЃ$ёtT]D‚@МмвE 3DQЊвДvA&BNїŸDƒAzФј5ЌXРьэ rwgs`–&y д„ЫtœfUi5ч"д|hM"(~ъŽ$Ž:c9Зˆ_ЦЧy”$йДфюЃД–$ш8ўНVˆiЄžOsг4‰”PCЂ‘яЭŽ]УШ•‡Ш–єE%ЄN1DY5ИШЬдјЬя "˜WйЈШˆŒLф\Д\ъџКЎCUUФ?3tЗbц8ХхŠњлВЧ­|zAЫ/Ѕ Щ‰Ќяu' €!|Tšy.DЏщp‘kBЯoЉTbЩ{Љ5Џ›З~Лў№оѕž.[д/Ш‘бhD*rЬQ(ˆ€<І_М$іЈї“ї$ŽЃ\.1гu™ђC­њˆд> њBdЁІЉђš"‰DЈЪЩsкуO2™ф{sssƒ')іjFВ+…еЌ…> ˆ-гD0ЊФ ї˜|0‰љљyЄ2EУђBe+Э›VЪљ•›љє\ЪПjž€HцЏН&(м<ЇŒ1ђD"ббQNšЮ•57ЫКсј: я˜5ДТTjіюШќиpТИD,ŠpCКЎaii œxzzљ2Ћxj|ђˆ‡XхмЏЫS§Йœ ћъъј`MЬЬЬрї+—А–з+‘mЛгСюcйрЖЎ ‡йзJЙх‘Ћп^Є’@ƒ€цBh^Яў8`РU7јђLZЊ™ ђ‰б„М^„дЕтЋ‚ТRdЭIENDЎB`‚classified-ads-0.13/images/mac/editcut.png000066400000000000000000000026461331670245300205000ustar00rootroot00000000000000‰PNG  IHDR szzєmIDATxкХ–}L•uЧП\гт'/‰QО`м’IAоLjЫI›“Ђ\ЅdflИ™ОŒ_paˆ\Й"\œЂŽ\dрtN bШRR™h6wЏKNчм§юіќСфњ‚§ёЯ}žч|Юяœѓ{бџŠs^L“ШD2ОL€пd`нJрј: }9аlS2ўB !hЮH‹ШŒV9д+$ HШБ•еsя傇Z QВ§8рЦK$4R C& 5~ и˜мZуэ}JQ_јэјё]"&‚C' В—lЭЁЁVUѓ8( Кі(ќЅуЅѓMж˜›Ќ„P5>9Ътt0`“ Fйн鹕btКя$Јeёb;?&%9нBbccгOже§nээ§ЗЋЕѕyІpк>VVЂШУƒvz{гvWW’оАєnЃЃЃгOX,VЋ•„ОЎ.:ДrхПWwщ-Р э~0и)KЋЙnЄŽŒŒLџЕВВЃЇЇ‡„^І­ЎюіFc‰*ƒŸгкŒЄ'$№‘фdъэш MjћиЙИPСЈQdЮЪЂ]љљ§ЋSRк3RSЛJ6lј‹kоњєijnnІПЛЛћГ–,Љ‘ЉpZР1FЬв@љz C‚~м‘Пл[ё„ $Ч^^l0фШѕJ6r†ЇчЦк-[z››ЈЉЉ‰Ў\ъЄУfѓЙСњР CX € 3чcраžйГЉ`ФZ TЉяБˆž2n\ViffпО}ћЈЁЁў8{ж63 €q Фo€NћвъѕЗ?6:l˜Й‰@E‰П?•є5P` ѓЄIƒwuўyfСчsчў\БЫд_]]Mлкю$ХЧs„k &СwгkРzM№ч˜ЄЯ€_L~~Д7.ŽrXTВ`žRcљ4уЇAўŸРŒg|˜7&zxlЪ[ЖьКйlІцSЇ(#%ЅV;Ђp|^ЩЋVОѕф \пЩ,ГИ ™Ыoy:u:№О ,•Ь Œъ| 3•™ТМЬМЛ(4tavі§&“ Р;кЬ’њ›ƒ‚Ј2>ž$ МjЉЙ#xАР‹ъ3˜™L8Ё!\cB™`%4™y}ЂСX*IhЇ@TgrДшt$яћb;;єzћ;?X`:ІE11ЬцU sдиE3Г•LЈЪу­ЪЃp#JfуРW_;VEœrf8лJЭ’€AMŠnАPЧ ggЦ1Я0XЕЕЛ:#рТ SЖcOен“юЃ EоGшh•˜‹VрnУ•„cPЋсэь*ёБ’„ >Т‘НVР Wf”*‰›бЕмOЈР#еstкь…џуX‘­юСјIENDЎB`‚classified-ads-0.13/images/mac/editpaste.png000066400000000000000000000035621331670245300210170ustar00rootroot00000000000000‰PNG  IHDR szzє9IDATx^Ѕ—klз†Ÿ33{ёкЛ^лёА!ИC…ІQ)+ЂI‰_mAUЩE(BЇ(MЊўъEтGў”DQJ“ŠЊEMЃFŠZ•HihC!­‚b.66ЦW№ЕНяюьЮхt8Zeеѕb њJЏЮhЮ}ЯљОoЮЮ )%х$„иЌgquI)џЮ}J”^ЋiZдћžу8,"яй?^юQZщЎ<НщЇЏялљѓ'6ЎyђтХ‹  14шyЈрСA5zїёцй§фцg>xuчkk›ТЯy№юQF Р†іhvWUeŽЋ!IOOсp˜Л)•JaL д9нuKДtЭUЈ’џ€И9иGХHГЗ\ўqђ$3‹cйHР4MrЙљ|лЖЉ­­Ѕ">EЂBУvЙ/%ѕHpЦ рТПў†™™CУEˆш.К&№ q[В,b pСЈ<ѕТЯОўв/Л6Q hA‰Яwџ`}_Y€#GŽ]з5Љ9 `еЊј2:’RJЯ д‡ƒ €Oc<+И>1ЩП'ЧnкЙgыЖm{*Т!–жtЊ+uъТ~ЂU~zF’эЧ>› ћKцwЅx‹Ќ‰V’Е,лХ•Mќ†FаЇ“u‰h oМљ>KP …Qй+“*WuЕŸЦкF&чіНєжч>Аaџ]аAh ызГс $W 4Ёю+пJ9|ѕщЭDыъUo”‘ъ—d2I0TЭќ§эЭиі"Dіюн+;::\C|јu УабиК‹+Q†І04ѕŒ™ЭЊ >ŸrВ,‹D"AMMьjџюЉ›ћ:оМpўW/o iЊ P"ЅLqЎ\”">|ЁЅЊ­єё@иЯй+gYџШnBAƒЌgл–ž] ]P&( ‰,f‡Лf@YЈqžЮЬ08kБЃу-zfЃшС Ў‚л–ЯаPЛt]$%’ца4PfžњЇRМњ^§Звˆj“цњ ВІCЮД1НqгъЮœ(_`ёёПY(UkS˜зwЏg(aЃ7ЌfЭКЏЈЮ.ˆ3#ажжЖ0€\Ќ(Су­Е|me„O{'ё?ВŽЛ^T]^ЂEX0ЪšAQЎe’OMcЭЭ`gтфf$†•)йбтR` 7ЁP–вС1“фчМ Љi @$Фs08+Y:чо€Dbс dЦКŠAMЩhBr-ц2–’ц`О.ёэЊї р8Ž2 П†–3YIџŒчi—‰9iNЅeџlVіЧeЯК-эыЋ›ZŸ),xzzšббQ&вA`YМ,РфœфтИ‹„›IП='ћЦчdЯэДœЦ oXожЄ~HЇгъDWW7GбЊWiо я”§tиЙб=%ЧЧSВЫƒ&q јZyгpЇ€њ™˜˜P?ЫнннФв:†ЕT­о†ц§овŒЗНЏуsхКўихќˆ€ „J РMозDEУfќu‘ГЎtоОvюO§нn{РnйЗР›шB\4 Pœt@NaNїљƒЖD03;ЫФјИ :04JЪЎBЏnA4=:fЅœћшƒKЇпяц“Ь—,#Р)€_BБ‘[S\§ь/LgјЃЭлfіид­оcџќѓ+g ШYР\@. = !мТ ‹ЌЌ^аЮєыпDŸ{mI љЛЛ+s™™фє‰ џіуЎOт…5NСVбИВЄaў ЊгщЏp50#IENDЎB`‚classified-ads-0.13/images/mac/editredo.png000066400000000000000000000032111331670245300206230ustar00rootroot00000000000000‰PNG  IHDR szzєPIDATxкэ•yL”WХыккRZšЈеЊuСЅ–TР"Х*TYFЄиЪ6E#УRv`ЁŠB…ADKqДAЉХ0жT;)L5DŒЩ(M&!9=РIЈŠЖ6і’ќ2љоћоНчž{ПЧk^)џ јo XьшLтI@N‚ˆљП*€ м‰RšЄвЦЪ5qr>.CЇOЮО§ Fоx'PІМЩ§z!ЮьЅ `Р‰Žщъ”ь{ўРr`‰/`/œП|6ЁЩ@JžЁkлnM‡oDЁFИcїВDФЄЋл=7s€iіФ˜хЬёЬзж јFQ™€|NџE]BўЉ€њЈTCзBр=†šьЬ№ц­,6’`“[вOˆ](рM!Л€Œ§:НяІGddтпаm8-ўx50е˜эЧŠЅ€KБZIА–Пn;и–XРf Ї#_s/H.ЖцЉлзЇЋ)"ј…t[)нXБїfОЌ’=гH%{ (jіœR›J(†‚R€Я"9+ГB„P\vЉЁ+,Љђж Й!Zа› , ЅЭдяВ•‡š€]ЪЦ;ЁЩЪ›iEѕ­GtњЃз™Ји|№ЩЅ­<E7"),Hљиžџи їчžŒC—GћM[ѓ€М3Ќќ„ІC|vцФ›Ќ‘*š+uњ#з€ДZ И„neQљœэa lтl(Jяuz+šEKПГHг!U0XіP~‰.dєиiляЂВ#ВЬЪ[езє†}?БUРК}€лN`Y)т+ЦQ”К‚bzОYџЄ\33о)=!ŠfХQVD e‡€#j IссЇм€\їsJWWќxћAe ЏBЫЏн€#чС•эрoF)А%UЅэ›‹Офљ%НЪфХъіД€D )gџг‹ы[Л­šuмГ$ђф•Жц†Ё+џ"ХsP%ћщBfя,I(b[КGнnЌ˜Фчаёs€юљ3›ш˜ЎVжы 9œќ;tііƒюѕАЛЯБ…šZоp€Ю%д”lЇ‚BR_]РVeѕT|LšЌщгiU§c}ЖJ" 5G.КrЮkюЁјюяkIЭѕ{-Ќј,АБ№aт•РъВЂdzƒ{8їиf•аПšИ•іЬ рм/@йЉо>‰§DИЛPDЩiMGхM@о„W~Pї]€C`иlёpЭч!AЁв^љ hЙ Ќ.д<я7mьq)E|OЉчщQŠ(Іˆ,`iBяЖ! ЈЌž№з+"WЅmЙœЅ­|VZ:‡цжСаЇ0ФЦ3zŽ­W|ЂММёNa3Рv„P„Є„эPЎL.ekЊЮ?YР 2˜ БѕŠ‹ ˆкЋЙЌ5t)Ъ/м]фЬѕфMђж“{#,]Є}К&noVNŸЪŽeЕсЧР2РПЯхРЩЫ0XT1œМAFZЏ’mі ЫnЉЛzя„мъV ЇЎ!cуЦч13,WЬЗ^™VXлrПт6ШlЖ7пдбU@Ю с†Q@_ђaЂBђЎ8С|Yа†EЋdЧВ” э’-ЗоŸЗt9зg32[`&жf.p йQ\ндб|Јџ8СY:і+{ЮЁ.o!з€г?Э­B€А}ЈHўЖЈh2™Iцsг1“э>\"I?нТ›Я6Ф–,ю‡эј,|$[vkOЉ[;O_mэЌU“ЋmjеmjЎД=:yЅэЁЊЉэсЩKК‡'.ъєP`Ќўub"ЊžJц+‘Шž8'тJмШJВЊ+‰л”љіqŽ!ЊœBЋ-œУЊЌ\Є• WDЖvпRЖШ#њ€Эъи§œБНVЦцР‰ž›’ ТJKВ„8Š„d ё&k‰ёя‡ŸиѓяzˆГŽ"–%™%r˜ŠœC^Й€—оёŽ“8c/bX‰˜SE‘s№s !Б ‰ѕГ†PьY“…тŒЙˆ1SФ'rŒ9 ј’Id ™FІ‹`O§ Х;гФ™I"ЦXгDфfЌў™‘8`Jо!ЃШш."ёЮ(qЦTФ)b9џќ ГЄžсС“)IENDЎB`‚classified-ads-0.13/images/mac/editundo.png000066400000000000000000000032111331670245300206370ustar00rootroot00000000000000‰PNG  IHDR szzєPIDATxкэ• L•eЦгДЫвЉ›КL“ѓ’Ыƒ†H hrЙ ˜p”‹ˆфЊr‘ƒ) "ŠŠˆJ’Ш%o AрE-NВ`$As;JлйиžžоМ 9[ыl?Ю9|пџ{žїљџпїhxЅќoрПkрSЇшЙФƒ$’4A$Бx)„Јž)s ЪЉ ŠЏj пбp?"БEНeW‹:6EеWвШы9ФZЊyQТ&$ЭiCІJ‘ ъиЇщ’+k`Љ;`ь ,‘іо@x"}ЊНгЬMYУš‰/DX˜SœаЂv,(КШ јx50Ы˜aL[L5уgsРдˆйьЬЌicmРѓ O$ iХСŒз5 Xц |В–ТŸчIж~їfЪ]`Š%0лpc:yХš.ЉUЯ#юНlВ& ЖІЭk `О0\,№цћ&‰dдŒй% pо и*?“бїeЮ4@#N@n! Ес_Џк#4П~“RгeЫ‡|Ц‡јё]XХžщ@дз@ЪрP~ˆ-<вiŒfeОL…)­ ЅbР+,Їn тжfвЊуjкжFsА6ВЯў=ТЫу)lЃабЋРwѕР™+-jeVY“ЯжœКиЌЊVх9`Э>`qk(М8]№ЙеŠмz]ђрэtnЬsE1Œ9сŠTх @ЩѕЕЃђБчФYЉ<СэwАйЌи „г№йяХ <БwѕњWИpТ§4]VAgь&Q€нNРч(№еE ЈЈЈSkBvхз a“^Я0ђOШЏaфђ4Ў~/ ѓszžЊCве’ўьЫцaтЩ~Џ‹(i\ЯˆЭƒ)˜Хqеьчцг@ж5 ђPPйpпТЃ{O;џн‰шS—xи˜ФфЅ5€Н/“ЂžtCuiА'K˜‰*йяXŠSи$’бqеžй@<ьW}§žІkлў’FqдъїгBЇЈєВІ]Ѕ@\!kЏ{sЛЯ…tНл@ъa`KпmЂР/Vе!сŠЅ§Н pH6œ’ЪйЛŸ+ j{XІJšЬPbjQУ§4жцRќТ ЕЦмНч|d \oNД/ЃQЈ56‘\y4`™ЌfфŒ|П4сŒМтn{gЏШћ§mXЩЁ<§#WЮиЫUš.з`Е *#їžSЬ(XеЙkZ МTЕ'ЫT–=тжмО‘KTяВeП‘Щl™Hэ)Š=€Б? OŒ)nDё#/2n2ђ_МKgd g‡[hІъ6koг|T ХEпŸ1uАbфІьЗM2ХГ9Б…мfU@QАяTUЋ‘cdДЁ}ш‡ZZZƒЩk}УkDпТoДє“{щ‡іЮкжЧтZ}Н$ё'йыНь*р~ŒWШЂЫ@*ћ–]йЂ^ф‘ЁoщџoNо oі…И6|Ё§fяфу•Пнhдt­ ЩP9FlцДЩ g d^ь9бђ№s@\А›бў (e|'Ъj7А Nј@пjKЦБ‚q‚Б‚12sŸUQ)EMЅЗкџАїл]k`Ћј’џA†‘Ё")эЇ ”зЙеЄшёZрnЕ3РљfрZаЈUwЬ3ѓ‰gЩ42ш‘=2§НYЦŸЫƒвъ“r*кк* ц.ѕ№фџ'sя‘тG&ЄуГјj‹š<(Ооќрл›ЭЮоl~xЎ†мj~xсVSЇФљšІNyPjујЉВU,3’J{aD ЧыЪœf/–o9f’ ПЯ%3…щI"­З„ &СvpИLйЃ У•aк…1А:ЖР* oОЅОЬТяŒЬмЗHfцS"1yŽi‹Vbл qm91'ЫˆЉ06ŸЬ"SD:фѕПR,њ3’Lёъ“ХФL<дŽ8'ђq&.НpзœФНvЂжLцЮLлtІQb1Е>ЊVmKХ E\ˆBзED]˜MWвКD\ˆЅвEIQZмЙŠbt@%blЈ$щЫušU+’њўpћ /ыlnA{†ЁQ !†а…/ЭpѕzЖ  ЁсX„{LKа( ”JELУНЃ„:ЉТдOХVШT^BЁМUћЗK`ш/LŽ1==EЁчNфКmЌ[ЗtЧ]ЗВF@HЩяПУќќ<љ|žJЅВаВЌ%lлж­ ­УњFV.——јьѓукSЁЧЈ ŒЦUИ:•ІІњњњ8|ј0‡вЧЗ!эЅ<њ*‹ Pп„ЎыRгШШЉTŠt:­&JRJъB{еNLD_†ЕeHY/L$њЩXbнFЈaА^Rэ˜Њ CдMъ›'4П§ЋC‚D>фЂю„ Њ€ UђOП ”Ы%Mг№М2ЅR‰RБЈwvЫ$!Зcfц27цf›ЯРЭ…›ЬgГ8NœЩЖ№Й0>ЦиљГД%м 0Иl€BЉРеЋ3xОЇdОћ‘d2ЩЮч_lxŽOMЯа\‰ФW>ГГ7PпŒŽўB Ёћ&т ~и†~P[?ˆHuыVЫІэjkW[MЋIг6I“4ЩЭ5iSћьљ{ЮхД­ЅGФРsЯЩ=чџ{ž{M!ЂwЪћ!№хЮуYиџХЬI “­Sс……'.и-.]Пг1Ъъц@S‹;кт№ФšбЏїЈч=t дђH§§Drƒ>ёx‚М^ѕѕѕQCSЋiЫ?v–їej@ры0Œ56> |’Щ$•џUВ; -ЯŸWЇxyTSѓ/YŸX,FЗЊъ^HhшMОšPЗAwюж [I˜&­љцHdпрРžоС„#&Uоў‡nоќЎ”–RYйUњЃтOкДЋшAJJژQ єYBяЦ(ж 3IэN*НzЮџ….\МLUпЅœ­‡яkHH˜‚яЇ`$AюŽЕЙНфс1Ш…п{Zт\mфЗкъЃРˆcЃу=иЋх0{pАRЃ ХдЎБ9m†Ќ:h Й–Pыж&хЪКЂ8XŒўˆђ†­@ЌaЎFьб&цъ;ЛU8F !‚{о’@Ш$ђ‰кCA€%ƒ5€5uэAZЋE8pua)1>іЉk@ {Д ‡clѕBD:ЛЌюрZЩ О(FЊJШ U"іNЭэaUУOєЈ"…ŒУwИ†@gDр—ŒJе aЭэУ\!цPђtC ?ХiL*3VЩŒP ‹š<ЎdЊЦ\vРПѕ8…™ФŒ(ђFИUД‡ˆојBUс.йўћ."ьЩЫ?кРgЬff1гЅH$†эg+(ЎC;ылˆўs#С˜‹яžјX Шэї‰ъ]оpoюіТ >уcц#f.3SJЄтќсЦтF8ЊъZ‡jƒ -Ё/$[|‰K7ЊC{8хЬнvИjХкн?ђYЬgЬ)1љчП‰@žугnеюnqЕC„b§žн—8љkЙПр`‰3ћЋя*VЎлszютЌ=Мwccr™Я™Lf!“ЮL‘Њ{ШUЗq'м!Ђ:„ўVюЯ?Xт@hfЮŽŸвч,йЩїod60ы5ЈGщсжл§ёSou|ћskЮ–яЫ—лv•Бt пГ†ЩГР\†ЎfОХ#/aоŽЂ"tџ‡[ЖjѓCŸdурO™eђрЬJ ЬБ.+^:ђ—pЈDЊlйTйО™9ЬрaxЌЦSIENDЎB`‚classified-ads-0.13/images/mac/fileopen.png000066400000000000000000000041441331670245300206330ustar00rootroot00000000000000‰PNG  IHDR szzє+IDATxк­– L›ч†з.ывiЊЖЕ›vUД›ж]Z5i“F›”UZКejг5Љ”„цВu[ГЄ™–k“4)€S88мBРI‚Б1л`plЖБСи`csБЙRХяЮїч*ШCы–#=њ-aОїœѓžѓ§ў€G ХгФkD,БјёRп”ТЫˆп­ZНFlrѕњmS€ch|Š'ёUі7т8>ђј q@гhtX&ТaнаЇ(ЗТ˜ыФŠ+ФqqgНššš0Oт‘Х/‰ПœOЫTй'>} Jm(3vBevС:8ŽƒЗх\  "š˜ЃяяљџeЙЯлvю’vŒоmJgeІ.”ь(ж™”“мМ0сЉщ{NЇЫOџЗсѓ=KЌхў.№йH>›B€Кo2cЪЉъ[wZ‘QЄ€(%–v]@QQQ=;ѓПn­ДЈИžљЪќ%^љЌЯu9ШкzQar@ж`FЎBƒИ$ 45кЂ“wg015аф]ЌYГFLg,_Jј{Ф›ЬSЕж0ш|“h™~ ГtzmЁ…>Ы­(ЌnФЉD1nЫ ЂСа$†GƒшєЯвй{mя,_цЉйIИВ'„rЋКЎдЛќа{FQхzшsГ 7ъ HШ”"+'—љYxdŒ„шёxQЏзїБtЭFЧа§pј6=…ћ‚Чk жNЏ9з ЬBaѕ1aкЮ>дvј Жє@iьР­л-HП.Gœ(nwAеЌеуSМтœнn˜­э(•—AQЉђŽMпŸИ8ЇЫј„ЫŠGЌu(1ћPmїЭ k;МаXнѓ>чШеј0!њІцˆэ †0b CXЅв %ѕ"ДК;№ЬCГ€!”Л' 6YМŸэ@lK(Ќ5ЂЮб/T\нюAekJѕСчЮˆP^ЅŠ(<6>!ирэ€НУA ”œŒТ’RИƒ3№LMlvм3{брcїС)f§‚Ўi›QcїBeщ~шsm3bSв‘_XФЗ{очО?Юn[ZQPxё‰чaэFї] —Ф•ОOpУB–žЮэє‡ˆ.&Э-Ф|ФƒЇбЃЂХ’њ6фUъ K˜ЯЋкнэюE›ХŠŠŠ*œ9F‹]фБyPiЫ’ЋmИкцЧUƒЪ;Mlјі "Жiјф–зсfЙr ЁЉйБнсxМ}Ай;QKўŠS%(МYŒбћ€}а%T~vГЉud5zMе7x†и*ž$ОГ8гѕƒгH/ЎРe™ ЂЌЋиЕ3bЛ}§ƒшьrЁйи‚ЌьЫШШ•Т90 Uнфž{Иl№!НО™z7.оv"Ѓо%Еў­ЗwHIkcЄ шŒж=†Є+7‘xЙћЃЯтиЩшљЕbэ№СеуAЋй‚™‰IЩ0Zэ№Э}„ЪЦЅІ^V­ ,жvрBm'вю8‘лшФ5ЅЊtўIDŒјЪŽ~ФЅIёСЙ x{ї>d^Ъfk5пюv[ДЕ:AИDYЩ9Р7 дŠоYСуcп|еёJ“рНдрЁ•іN‘Ц т)"bˆd-.џH‚НЧЂБіЗыбкfaг-ДЛЩ`‚фbЄљзh­І…Њ[ЧЖћzGч5эЌэ‚h’кŠгЅM) *Лќс•/­ѓЋї1"b$ж[А?F„{ў…uы_eU —‰ЌT‘шЌ.я^ОV…і1|lА)-ЁМ…Е]Ј>ЉЊ —юtBушŸлwфј-:ПїПјŸ’H–jБћШ‡иМу8є>ZкЬP(ЫёЗwwг щ†ы.p{(hDз…<Ыѓœ UЧЪ_fРeН r[ИHЃыЂsујд‹ЗџI–HЄ$.d”VcзОCxuуfa­”•ићо{)‘ hbУХЊeOСыГeF–ˆDb•YhїЖJ“-№ќЪUщlАљОПHќПiПN|™x|qi)… lљы^<їтЫТ”Ÿ:ƒїcу‘\eBљЩ„2zX›йp ОЇАЇЪŒ4­ =й}GŽЩйЏу?Ы…ПСЋўК%уpЂb&ЏІ‡Џ”cgbЮ•‘orCcq7Gm—ђЋt/_ЉЇИШЯ‰ч‰_ёV—кМ0Џzщрƒ"‘ъ;ёїдыИвм­г?w&EЂт`пс‡-уOпц<3б|.aќРcйВ*gyGИДNяр?™ŽНDч"Ы™ >С=цТџ[,уmŽсЯ]ФˆHё#–А$џBZЕќ4vtIENDЎB`‚classified-ads-0.13/images/mac/fileprint.png000066400000000000000000000040471331670245300210300ustar00rootroot00000000000000‰PNG  IHDR szzєюIDATXУЅWлog?п73;ЛіоёЎзMLьФНиЦM/iЌЉЁieU Ё„Zў†>ѕ‘ŠђШT/Q*Т%М$ *B}")PЕjœЎo*Žз—Ез{Ызп93ы&$Еp˜ѕњ›љvц;чќЮяќЮ7Šі9цццfпyчЇ?ЏежЃЯЪ?вј№_ЊxЮь§ŠscTЅRб.\xїќљѓПў*і~ИЎ[š™yњЅ ( CвZ‰FЃШhCZiу9ф{рY–EйlіЏћйиз,вюvЛДББ! і`ƒ*6Ў0o0ЏyФЕж‘q­ }mЈLэvЛЙŸ Н/œ˜}гВ-Вm [ЅFT–ЅШв˜уhљšУˆ[1*‰мрwЯ<ѓьї*•ББ;066–ЊŒŒ|л„ŒDСтіаШя!>ЪŠoŽАЇ€,ўM!eнЎGO>rфРььь„­VЛхоXхnНG3ќХ‘U‹­ї”ˆvwwЯ3ўЃЄ8ŸС}Qrd{Uа?,+vЩbhbЇ4…x&КнЩGd9ч(1їмєЏŒљ•ўТV щ CŸ”ЏЬимœo`С^ˆE$§€дР 9$шЫhя/hЌ>haЯєЖї-УЧ†††ІћKЂдТ‘‘‘t"a ТoєЈG6›г…ТаЗŽ;VFuш(c–Fy./,,|">ž>Њ†‡‡ѕЪвѕР н )ŸЯOe2™Ђ x3/Н|zђѕГg)сКвIЙ\Ž–——YХшјёJ&8M”JЅXžЩХшXV,ЫЬt#R%~Ўню@:tыжПшьйзЬ™3g”чyTЏзСЏMšŸŸ/јспЗё`~НЖ6є›KПЅд@JeizjŠ>њєSњрƒПТ@щ5Дi‚аж{ВЌDC пgG<Œy^GœКuыпtшаcjvvVUЋUъtz(ЈЅЅќŠ BИџљ|еv–фЬv\кЊoвЧBЕЛ› LЦl1fГA›ЯЕ0œЙ X˜L?їдНя{ЃХ_ЛvІЇЇщЦ4:z˜VWя“ЯЇl№ЮmЕ[VoЛGЩD’ЩЕšM*•*єЃџ‘„ЂщqsUt-КЧњЃ”%кЯ_%j!#ечМŽGƒйAКxё"Ћ+нЙ3OMЄч›/ОШ(&gkkKу b;A(Жi}}ƒš­šŒ5˜И#rЮmŽч–b. ВєЪ9ЇЧмЦљўБЏQЛгІ,Ш WЉ˜OвЦц:чи€ТщјВсчзEВ‘„c“[,‰Б06Nl hЈЉЁ(p-ŽАaЗežc'К^—JCЅXб‘J ‚шШ‘У )CQ[)-Ž”рёѓе&4РHƒ‘ZЇЈюYbљ#hP_О”Х~eЄS„ТcмЊLЙIщЈт@Їл"k'ъы\ŠL˜лЗoS:‰4^…єЦ}ŠIїп7pДшЈДP§Œоxѓ'RžМЗАЗtY|˜„ЁчљfgЇщФл-CPЊB.ФۘскФнbx-юx}ѕ“mb+aД=ум6[Yu€+ЭёQRhFhC<ИІг)aЖƒМ3!_›Ѓоќ=т9j4‘1ЧчЄAЉ(^ч]DЪ$х/ ю_‚њMNN#ИAљтНЂ#‚ЖККку*ш Х€‚ЂЦnƒ&ЦбвB• `’ Fƒѓ™HИ"6&ю бЮРPОX'y ОЃMІEA'&&hyБJYдОŠбsAxЮ>Ї LК^2™$пУЦ$qЁVл;u:qт:wюœ Р›S–YŽŠсѓ$ˆФ{оjЋйо"7w”%§я7oв•?\Ёждm˜re'@“иEд-\фК~Э;­.гёgŸ‹иьƒЏиЂEг”‰ЪЭ‹ЃtŒMŒ \Щ dDѓХЂчу33tхB*юzJйВЧ,—Ы пК uк†еSЇNlеЗ@›vu рa.—‘E:НŽ0Иfj(!›•`T8eьУЊjsмЈјw&oз …">}FаcіЛЎC‹‹ЫЭ•••.УрђхЫПИzѕъGAДЙ4^р…ЏМќъ+пy§ЛѓGS*•aААhќтС uB+оР9щмл.ТСd2Бѕо{Пњ]Ћеђ”–юѕZЗTMt;“ї1Мo џм~Ž%,..QБ˜ЃѕЕMЩШsрTW˜бL6Із7ыHC^жi4wwЅЄпBEl§ЏoFN­Ж–ЋTЪёЎлвАaŽ–‘ZDyй ;bЮdѓypХЇЕЕ5QЩОљlMЈ1€hнƒМšй;]!цcjj’юлsрˆдАйЉеjц tжkwп]Ј.<„AJGлžћ„VнћЊќр;ЅŠ4‚BЄЇW­ЮџчЕ‡:Иѓіm‡СцтУ…Э›Ь"ВmE{/юфЃjaоXіfф МцЙСЖlcIENDЎB`‚classified-ads-0.13/images/mac/filesave.png000066400000000000000000000022611331670245300206260ustar00rootroot00000000000000‰PNG  IHDR szzєxIDATxкэ—]L›UЦНїzС‰MМScЬцt[pncs€+пэВ…mТ |H[ а!-X)я  aя>иE^ТГaŒАšЕ™р Jеш’%мpѓјџŸИъEпЄq^xёфœѓžџљ=ONпsвїOUџYYY $ыПЄ„PЌ•ЖєЪpўтe”vЩ;ниїКkCbØЩlі`ЏbоEŠіŽŸ(„&ЮЧ1‹™ЏНё&ШC=Рžи8ЭЪGщЩфы144хч5ЂдRƒ˜]{Aъ$$C_X л) ŸWvB’œœэмнz.@КмЩ3iшЄЗ н4q—[ѓsžч:ЎчuМžYЬlђPЏIEОС‚ъњиl혘˜ˆˆ˜ХLfЧkRžДfXk%TTvРчѓСч'љќ№SпџИяї‹91fћ\'бђ –Uь€9ќьOТ‰ќbTT7ЂмвYі@О4љыыoBОy ђm/фЛї џ0љС<фЅ%бŠБяЯsзѓ:^Я,f 6yЈиw Yz,Жг0—Зbqq1"b3™MсhЈШ‹Ец2'–——ƒ ˆ6€хѕПцЄЧsСZЎ і™ХLС&Ея€ђэ$†НPЦ}PМSPОŸƒ2Лeщ'(_ ќіЪЃGP~ˆŸЅч?ŠyQчЦРИЪ№wkп§q‰ШЮ3сd•5 XYY‰ˆ˜ХLf“ЧZ^Bz/yАКК 1ыЯ—А$ќKј‘\:*•ЕMИzэ:nпёcњўмŸ]јGтЕЬ`3™Mът>LОЈ Ж/Ю@rѕТеuEЈ­›DmЈ1їƒЯCˆŸ7ЋŠ˜Ь&Ен„Ээчсющ‹„˜ELЇ`“‡z€„Ф4š*pЪю‚Бд н‘ЃаЄш6$f0‹™Ь&ѕ“Д(*ЉDНЃ]Д т:ЧШШFGG166&юwЏз+ЎрЉЉ)ЬЬЬ`nnѓѓѓ,бŸžžѓ“““AІZђP IжСhЖЂAъ@U]s0€нnGzz:t:ДZ-ЧК0‹™Ь&ѕ‰)‡`*ЗСо|ЇЯtddd ;;ЙЙЙШЩЩAfffиГГГР,bvЛ фЁ )ѕJ,еp8Лаив РЦƒ&“IHЏзЏg˜E:‹т'HN=,ў 9ZПD“Г; //FЃQ˜Ѓ  `}šЛ`Ї&њ &kУH; sE [ @!" ArЃЎб…C]D‰сNAНБЈsДЁХ-G.@“[=Щ МГ#F=РоиxЫ. ]ЈEkЧЙШpИ№бЧŸbЫлятН]Л‡UП vФь—Ч'ЧsQ[/ЁЛї"Оъџ§žA’В Ђк+}зажбƒ"Ѓomй†элw sвГ!МќЪЋиД) QQ›ё|є‹ˆ~сЅ ‰ЯmŽЬ­[ЗЭŸЪЇY(sжџ_ЧЊ•нАwIENDЎB`‚classified-ads-0.13/images/mac/textbold.png000066400000000000000000000031131331670245300206520ustar00rootroot00000000000000‰PNG  IHDR szzєIDATXУХWklUžЧгнЅг.юBaЗЅбZ|дД@%ЦЁJxљЁ ђH‰СЈˆб€ёи 1>€Фb ‘4МФ†Ъ+<"PRДл-­ДtэvgvggяŒчьм…qЛЛlЫor2;wюНчЛч|чБЌaЬџ9lЉ W}\e)гm !ЫЛ2=Эy!КімЩ§лкF•oyЭjы„ПЋWQ”IО;vОИИШ‘КQQЂФпеЃќuѕV.ђ;L 'F 1&Mђ8m‚ШЧ4†ёx|R\7чY6ё #РNяшХxœa4вв2з‚5оюю€Зёрбd'€иI›Ъ‹ ЪЇN))ZОlёфќC™ŠPЉ]d˜–––ю_›NєтXч˜9ЃLšŠЃ*УфTђMУОіі›ўтЇœЄ€ЉŸ8б§щІM*Т мœЪƒ§а—_}З–l†ƒeX‡|ЈŸ7їйЕѕЏ/yRŽ˜`эy0KBъ[Оh†uѕщtpйќ›šzzњULŽ0uŠ•х|—щГ фГг­—Zюї)шІИC‰‚%ђ$€UШE#`hVBLЈ У8v­эFП#g?ш:ЧvcМ#"Ёu R]7E z–дС&зƒо\Ÿ-гфdИёPyв †WrЙD4œEw…•(Т5ƒ*ЧPC"Іу-ји й“М%љhzŒZŒЦPЩй?/б=Ѓv*заЇ„J|˜ђjx,zљЕК*NФ(oŒ >дм+{€ЄЁQH˜Ÿо>ЄТX‡Q Š/рЪYхвŒЪ™ЎЩOUИ‡d“Є,Џ’пšš;ЯžЙД'["Ъ™„3 Ф*pћЄ­лЗUйэf&D@В‚О6з @ž8rpџmEVіРіŸ™Ч%!I ІЂQ•КЁЎЮ@ШrЗ;Ц@Ьƒй1gИ'јЄ56VОєjн‡ЮБŽS˜аЫЈ#0Ю†ћф§п'2ЁuTз,œы~nN­/І‰|4.ђгžЎё–•—ЛŽ4о Мщ\‘3 у4Д0lТƒLИ>…Œы/žПМіэѕ+е˜Ш‡‡ЧБtѕ›Slјv|П‘ZЙ‘DQЗЄт4Љ{З ŒП|ўК#„э‡ ‰ќ’ѕ%iњŒм ‰…й2!‚8}ВЕ_Ь3н…ѕ`0Ь0c]> ј0Ќ <RhI7<К‹;ззЁПpO@(P!‹KK0Y•Ъ N-Arh# šТбjI1FŠ K$$\`@ЁГ0x‹pIС[: j њ7шŸр“‰OC й"ЦФшb$СDŒfМ‘ JІ“В mЗnПnmЗЕыЖŽ ЖЩ_жўюзяЙ=ЁПT~ЅD|јфмпЙчœћэ§ол>рБМ§~ЧГЄFЉѕGc/yеPZфНŽvі!тCкoЎB­v?с‘% gЪХхЉО§ГХчЯњ\ќ> fЯћпП8y|p&†+3ŒIИшьqњOѕIŒ+ЙRЧцўьlсЬMВŽЏ€a шKѓ@oЪрZ†‰“[жіPT( .А%1–ЎŸ&$ŽB]\M3/ip9žGЯДѕkŸYПЂ€vŸ-’12ЎФШ„’-щзzыјНПf :$ Є‘4“=фВŸ ЊнЏў=зЈyA­№kЮG-^K•'HДьгOIтИВф;:?снх„д-‰Ј, [ж=„fй@|П_ЧН‰:;а\qюыwб;Ч—WѕЄюqЉ'uЋАMTGVЄАС`Fmк`(#‹p=kЌяєХI\›3тГqv>™ЗЯУYЩ+@ъH=Љы+РЛ§ЄŽ Ÿ1oгyЖ~š$”\iLПОŠВІ“z"Рћ* ЯkНDZДС’зЩ!r„МE:дПЮдјЭoаzuPхq|š/NІ<;$Ыжъш|мЇ#Ъq?сpЮХЭ%рzкХЙ^nЬЛјсFq<К`№нАk}блРЩs†вмЪ12›–1тЭпЮЫœ‹K @жё™^ч‚WАI#bYаШŽiчЧVo/ХьœЦŠŸтйГ[Œ“xƒ?XSчœ5ш7Т#@TРЧžэЪА|ћSdYmљk(oФЈБышšхMXKЖiУМHšШnвЊЇнkкho’cф]rJэ1ѕ’8oеќ&­ЧКњMаХЋ@е]e;ђю€тнЎЇ-РIЌLЎ€W50ž3ˆцxеžw0N;uИ3уxfјЇ. {ˆ.цу"ёUXКu0uЧp\7M!sў?КžА ПњЏ^а+uйG^%mžS№(y‡|ЊіЈч4lгј}šп(ѕЊ ЯI?Egљ=Pi*мROы* Јёи.Gшт_@†яtp˜]+„RЩ;.Rwy^˜DrеЕsГ п`ўš)ЦKОд‘z5PO‚’ИАiXШ ГБ–.œ^/кѓ§RУyњ ТФjœ‹,ѓU@PыЊК U@‡ч4œ$N•—‘Ѓё1ЭяzoCСч:n"/kCа{ƒжІ;ЉіАњл$Nуw“ЦG]Ч~ПŠЫЏcaŒФ*\ЩЙ WqLѓЃхзБŸ€№ъп@ю>АРЦЛ•5XкяD—шЃЭnёгW|ўБ'.>Žacц7\›?šqЦGK~gu* аEE ГРќ:“7‘"ФріZЦ]Х%NgKМФIЉGheМђрЩџ˜DџѕлPRY(K[яѓKЈњ?&žSБžlї4d3i!{ЕбZеюUГЦ5h^НпQЏ€jDѕ<пЁ ьдХvЉнЉўЌfqс†уэˆoМIENDЎB`‚classified-ads-0.13/images/mac/textitalic.png000066400000000000000000000022141331670245300212000ustar00rootroot00000000000000‰PNG  IHDR szzєSIDATx^Х–]hUЧЯЬьЮdf?’˜цc?fЭжEГV$bIЊ5H„Dl­QŒ…"ъ›BпJћ >4р‹ОхEA‚в>и”J}Ј(E!Z›T“Э&ЛkC[ВЛГГ3{w<—9Аƒ„M›vт—Ль=ї?чуо+8ŽџЇр>lќФG1І‘,Дl Йю™'Єg>ї§W^z`ФєЛo=­ыŸ№р†ЩrkCмНћК•žž.ШЮ~<Ы‡‡$€ˆЧ{CAI‘L баѕL7ˆ"Ааcщ@ љ[DJ ˆЙ/О<ШЯ %ЇІ^IЩJTБP@0ˆэ:;щ‡ќwЎlRjц эЊЉо;vьЅГЃ‡Ц5@’4c}q~ѕТќ•Ьћчp&Тю-Ћ'cзЯ@рц›­Э§0’JщQ›0 ЁЇ|>Я;тg|@сЯf2ЉРBфљoЂ=ŠEƒђюЫ9р%›N'5‹КРмX]нh №9CБD,TЗlFŽ$€……%џS@Œ&ѕTФфЎ—JeЋ^Љ9,Р-пR@љOєьл/ЋQЅ|‡чп .—+РOОоDv0­kѕ:€eёЉлљB'‹{" ‘Œk<ќs]ЙvэF+>зРH\4jжlл]РX•Š›З0џыО  ќGCaэЉpWЏVГмH №№ЏЕЊпч ІSЁZЭЭПCјOБ@§яП€l"зjд~м€ЅыэYFуz:Тo?‹њ?(Ќ,ч ЬџžD`ЄЋ7Щ уэЧУO_oBcгЇŸмџxF3Lо‚ мзЯњЭПЫN“]ХПyЃщ р эZmL€ˆгC=‘‰r–EOЏ @~uНf™ЦŸ€гжц.ИІЙ“БЭц ”9Ињ@gЯ€лќЄ hёЗ?Њ?~ћщя8U‘BЁuAђ#pл^@ћЭD}vђ§—Cс№dЈ;1jюЬЯЉЦ˜НќH,3Qz€†‘Ђ‘™ќэ,€TŠH`єе&^xѓдgco974|pцшёƒuK‘˜уОџИЉс~ulbђ№УЧчž{эф ŽаIDHˆB‘Щл8OПјŽžLg>92=ЅїХње&(RЕ РПО х5™ћ  лсчЧћЦŒїх–WЯ}§ЭСЭѕХ“Ѕ•… А<ўв@Ј&кЁхЮM 8рЅBбфkLУlђыu*3PTUъЧ•-ќЅ|л]hT Јо-5(є"вєяЙ ~™ŸНс8pfyiёulБ 8MЉбАMГzg G@Ђ5EЄ(wno^Ўм-z8ћѕтьeЏ"Њ7ˆDЃ№Ÿ5M Ф"ьVјwю‡`H1 RFЖюƒ2­Ћ"5oўлFРAЃУЃ-ВщєхШі№FЖ‡цv‡бПйЈЭ@Й… IENDЎB`‚classified-ads-0.13/images/mac/textjustify.png000066400000000000000000000023511331670245300214320ustar00rootroot00000000000000‰PNG  IHDR szzєАIDATx^Е—A‹]5Ч'Щ}яMыF№“LП€~л…эBŠв…Š Ј yОКБ jw КpcжЯP]XAЋPДjЇ:cлЉщLл™wяMŽ!YТѕNЉјsroЮ#Й9ПwN"ЊЪAэЉ  иA)d{с‹ЙrpCT5Or|ёpŒс&#яut1У:смќ]GiЧЮ|0?ВsBяХїУ‡о+ЮDЂЕBл*t]`21Д}€bпa qŒdUГŒQf3xыЕгi†в’ГÈныphfуф–Kk‚ˆАlпќЌiђ”oзВoуLєр}ZьзW:z№!$ŸЖыX™ТХ_•‰•ё ФYŠЪѓpќбЊЏеx‚Т@ ›ЩТб“lq€) €ш€6[њ"BRsТšіВЈЁнўъPэ@Бc~xv~dkWщzЯc+Žeч“ ыМ"фи7Žшb$Х}:qЈТўВg6uЩЧ‡ќ[kЂј& б^}e1a‚Ь‰2\Мъ™6–•™py+єНчЧ Ёыk„яЎy…ўg ГiьЏ s<УO‘џ>њXЃдци+5„ЕLe‡ •­ У!Юя6Љ@7Эb–-“ЄjШЂЭb ьgU єDUlP^Џv`№Ы+Q8Оe€BŽ~tvОКПHЮ„McPаАНгсЌMя!gСЩD’С5вр…eл1Zњ>gIин]ђФуS^zyBБЈвЖWnРо^‹—ЏіЏ4ќqз >ЇшЋ›Bш•‰“шЏtЫ€ ќВЉ Hп+kлgСјэŽ*Ÿ<ўЖ М  кrѓ!е3evОD8“’–A§ lГ Т(Р–D„КћХf8ыЌ˜2b aйKПnс`Ы BјйЧѓећ€Ццђк8ƒ>(Цо+"$(wяuЬf Д>`ERЬйвb-BŒ•ЉpђдB‡ ЄэгЦ`€ы[phjP ќ~›ј^”kЗ‘(`cЧсНЧXп2X#qЫz \лTfСeэoJiе|uъХwфџЫЅ eТїѓ;ь „Y“ло0„О*ЭŒAH нHIfєыKŸƒ |њѓOцЋ!РrщqЮTжnюф‰7vURY_пжTЪQИuЌ№йе)шП‡`ЄUGВ HUŽ›R‚Йїu9ŽY0TаgТГи+*щЗЊ§Ѓ“ќ"Мэ,w)ж^IENDЎB`‚classified-ads-0.13/images/mac/textleft.png000066400000000000000000000023231331670245300206660ustar00rootroot00000000000000‰PNG  IHDR szzєšIDATx^­—MoE†пъюЏ Žј„П—ќ ШЩœ@т­6A с2'рР…\€м‡H(HK‚B@A `G‰НŽcяЬtН5-Едš™UJzнэžšюк­gЋfHDАШNŸ™€ 5BП тxхЫБ`БAˆ‡|С3}~ы2LОКriќ>8${ют‡уещР xЯ`|УxjХС{sDaД„ЊD€КfНЙ, Њ†ѕцВt0f~ :ŠД2F0gп9€A2uvз7€•‘ ‡[\џ‹@D˜UŒЋˆЮ,aНѕ-œб9{ЇCА?мЎб4 ЯŒ_ТzUз-зў–І Я3%Ѕџ{ђ/й\Выƒ)И ТЙИЙ‰rI(‚Ъ8:ѕI pPTUql’РЊ Ю<€ јЙƒvŠ2]пFЯЇц4Чeц›"ьHAd~Д>^Н(hšЫe‡Yэѕ\ч(ЌIЛ# д ` С{Ѕв)d'Г&фк)žчщ рдz€№јDнД…ЈЛh>kXkuhЋ`Y’њ\рЌ­MРЧ]СAHFуTUпw€ууJяМЙСaЮXY.№їјЖDпй#p#(сіŽ žБњ}cy0Nlэжк[“эш€lѓ˜)ј.ѓЩ›—‚?бЭџФ ~сНTљPF2ƒP›6TТыb"s%ыњ<СЕ…?П4Я;*ЁŽ™ОсBg%ќќ“ёГг#ж…Тj{еNЇЛГФЪ' –JТсУЫЃдзв.Ш"(œ…Е ™aˆА2"Мњц.tAˆЊц@БбХРЪ’ую=hU#H˜ ˆ‚lMяЕoю `ydБyЫwїЃb~M‚џpИѕЦкy…№ЩыРp :Ш ДнЊЪЋ U‚БŠђЉ5Gы‡PЭ,Ў†бњo@Б#ЄрдŸŽW™йЬУ9Ћ0Ђ "­ЮЭGшКЕдŽs‚Жr"RxЯ•/П>си’‘aђ*с}KћжОЎўЛ[и3юˆfVА}€Йўя=|gJiлѓю‘$N0 сo!вЌ§_)ИЌc_ b5ьhЧ*mСOаŽ› :Џ‚‹лqоTТ4WKущ—&OХЇ.}6^­РР+X„Њb}щЈAсH‹•ЕБ:2+/c%R0^щЕіфШ‡>ю ЮМжѓbЂю"њњрщжRLзіOŒn)Ьи;TPИнi{Ан ƒvўH?P ѓ€Ь@%|ё•Щvž‚х&}ъz1ЩоŒВЗрќх$AщЂlўb’*ЊЮ*_і0šЬdtц0qк4uœ”Ъoєk†OіЊzЏКˆ#1IENDЎB`‚classified-ads-0.13/images/mac/textright.png000066400000000000000000000024371331670245300210570ustar00rootroot00000000000000‰PNG  IHDR szzєцIDATxк­—лO\EЧEnэЖ"‚)TвF|hi_ЌЦSoњ/шЂiаД1111ѕM‰>MKˆ\ZJ)аъВАьЛЫВvЙIЙTёЁь™љњ=s~'=сьž-Ф‡OfЮя2ѓл™яЮœѓ €ЊМѓqO yVЈ РЉ‘мЊ<™фЃžOHИ“ˆјТ•`ƒх ц5zњ,мˆясж"№х0а7Ї№{Bсъp3^b_уГ>…>к€+НскПюцarЏ (“;”vЦщГЬѓx`Ыe Щ)єЇ8щМТ[&чЙwЖ„ўЄЦэŒkЗcЕБ3жp“…gЯЩюdБ=Л5q#9'fL оџ2O‘i!JfЪѕФLљЖ'p ќbЋ# $DšH i#ЇШ+ф щ"чЄ=#іSз"y!ЇЮ+NЖнў гЃђzVzeпЏŸ!1'ГТœЇџŒwМ+АО_пh'ў8ЭНЫУеWЗ5њчKJ)|3J[šиB,a0iбЎН?Q2ОЏG(ЦДb_rNю+Ђ€ъЩЛ€Щ5{" cy0™“$KЭRщФ~ОГЈiГЃq/ЏЭј3кЖ™8З`Eј (Зќ R@ЗWtžЅŸ' ?ДЫVxDщЄlAЕŽŠˆ^$"Аѓф5ђЙHо&яJ{бЖ‹џМФwH~“Œзр9-{ЪРъ.K•~ё‰ш<+є + Ђ1|№[ИПЄ№ч2№§ИЦ§<0šБ№нT„yўaєгОh™˜Ш*0žSјvL1W#МтФLаfї ї2N~xYUд@­]@ќЁ=‰ЦDVсС'*Вˆ…”оу –ёgM†‘…ЧˆЎ;9ŒcМгЇЯєнXŽg˜пм'B™м-р2‰|є-ЪХЗ ћ„ш;ИЄЦЗЄ^ѓi%'IЇœvDho‘KфђЁД—lЛј/H|ЇфЗЪxGeќZПЋpŽ•_їЌ@Ъ‡bџŠ\У0ЗАLQDПF5ц6€iщGŠŠ}Э+ˆ­91?G,ЬЌRЙ=ќ2EфїLLR4pЈЗФ†3Щь:‹јK#КЌи‡щG %ЄЖŒŸ€1ДЏ(ФзL}‡/рzџя-8.Wj;y™œ%ЏzNСїШћ"@Ж|–гPтЮJ^ЛŒsќiEXGŽИАкkО{ њ ЬVћнnЧШ і…€єC`xШэIюћHкБ%з†Ršv…с”FbЭ2ОЛ‹@–šЩlЗ’ЪфбN›іiРї.@BЄйЎ>џHcaC1Yлƒ™‰2›ˆ§ћДгЏi3-Ÿш—ОBnћIьЪюг]Ч!ђ< ј\–1Vі4$`РQйыИ•М$‚ъНNоє\ЩlљLЛјЛ$ў$iЉpw—{+ўдћ&,L‘hХ+™\Хбrя…&kЛр‰ЅБќ7лR˜,љ-ЅYхкyђ6ЧЧу/ь8Йob l‹;уMўњП&ЋЛ`‚3X‘иЩ“Hи_кVDK_cž™Ы8MЬФДiф6•SаЖ;ІP§УФџQВo+тeˆМ јУФ=Щ1 лH9-Bы”іДил$ЎIђнгЏвWГtЊ’ћЁY&8!“ЕK{BьЭЊ:Й№П”@Œ)7Т’IENDЎB`‚classified-ads-0.13/images/mac/textunder.png000066400000000000000000000021341331670245300210510ustar00rootroot00000000000000‰PNG  IHDR szzє#IDATxкХ—LдeЧ Эi.šЭеђ2u)ЫЬщиRWqPбVІIˆ ыf:g€ќиr‹SР•š3gVDЈNС,PЗ@œpwќИ8юќ8~мA‡MNwmlŸоzЎ]lwЧ}Пxлkї}>Яѓyžзѓyžлн…б#хиG‚Я€AP g``Фѓ[3ђ#Jє_ѓЭmƒшє'ђ]Ѕvxр!гdsyъЬw­ЩсО nYno?ѓФ3ђUЗ­умoВЛ'yŒnsœћy\Р ьЪ.Аž(ЉдtК<эN"ЃƒШ}­БИY.ЎHЬ,АжєMNсЙ^Њ@сйz‡ЛЈUh&Ъ/е#–2KИ,—5‹п RŽ”i‡‹Бћ5$д.bхГP}}н:Ž|!-M bѓž“цŸŒ“SпуJєDл3ІПлЗЩлЦуjэџWH“ЅцЁєLИ -D?  В(“'„……Эё!œ‰IЮ‹Ÿ–жЛ<Ч*лFљЯВ^№ЈwіFФ$ч:zYяМјб3бљц1OњЉъЛ1Щљ&eRоY ХюЬ7@МЌuЬУ№qEя8Д„ч I@,>Ь ж*?z1:1'?эЋЊrѓФпWmDU§DзPѕаƒ"Е}n3Ÿ_в;п§јd;rХ<сў$->< žЯ€ч^нœžЈЊлu№\oNqУш™лDaУаC†Ÿ9ŸіMзkёЎŠzo ržO€ЧY"Ј€X|/.’Ÿ/€•р%№2XЛќ•7?\џіюМяg”nњ ћЪІ­Y•ЗdўЗGЅXЕ!c"С А,syў`сbрТзу?§BЙуАgxЛюD9˘7ЖчtћУ;†ЧƒЮW&хЖу~˜љёќADЙ"8бћ'ЄwB:о9јТ†, s1‘Z Бs[`g|њјн§К1ЦWрбќKжѕ>Ќё5`u K(ыc`)X–ћАLˆ>Я‹ ёХГљўУMЄ7Е,IENDЎB`‚classified-ads-0.13/images/mac/zoomin.png000066400000000000000000000032141331670245300203420ustar00rootroot00000000000000‰PNG  IHDR szzєSIDATxкХV L•e>ўs№V„Xjb€ЂR*7Cф"†Š7Р`Ј$Е„Ў@гB!n)‰rQуШEЋ@jф…M‚‚ˆCQG9ЖVѓ‚NЇчэ}жЧrsЋs*жйžНч}пч}Оїџ.џџЩˆшХ_&љ'gLeИ0|3vРТG\фхџibр)Œ•ЋWЏЮHOO?ЯПоюююћ§§§jXјˆ#žрЫџuќгaи8;;Gfffжwuu=`аЩ“')22’BCC >тШƒ>ъPџƒЯёєєLЉЊЊъщььЄЌЌ,њ `У ›ekj'Лm*уu >тШƒ>ъPЏM/­ЗƒƒCtEEEO[[EEЧ 8Ў +yмігnKлV}Г(ю\9,|Ф‘|дЁ:агИёєцGVWWгкАиdхmЏ‹]˜w')Л§ўЉї7ЇRPT!СТGy№РGъЁ=шjк€.cY\\\]kk+эOMЛ1is–ъѕЈ†›œ=ЊЎЇ'Ў§ІОаLЉЗ >тШƒ>ъPшAWг”Œ}–~гЛ$П?9ІщInчЏд9№ˆюКu“мСТGy№РGъЁ=шjкРHЦЮššš.\ ЛВ g%Ж$эЎЛ—'3ЄщюёфДЉŒцэю'Л=DА№G<№Q‡zш@Кš60ŠwіьYu}}=M ?~Ф6­;)щвуb™k))}кЩ0АŒТiЪDА№G<№Q‡zш@Кš60šСSї ЅЅ…|“ПЫГJя§:ІљiЎЬћ2Щ‚˜Д‘ёсŸ€8ђр:дCzаеfЖ$&&оЦ&J)>ѓ§јНёn•іХ_ЂœŒ+д”пC§ВЕI@ qфСuЈ‡є ЋЭ№ љ‘еж7^ŸБЗ)ibЦ/‘vхъшE%TГ­Ž:e+{IцK qфСuЈ‡є ЋЭ)xзжжЖ@ЅR ЖЗЗSJE}Ѕ,юF„ь№уmfйЄZ\BѕВЅМ>DА№G<№Q‡zш@КкМ^cљљљЕђ{Z.]ОVx1S–№гчUcl дЙ'шќŠrК qфСuОООmаž6яЙX;SSгTžТОккZjПвљГъ\GйЌŒ› ˜fлуb+žЦУТGљЫWю‚тШ3ЏљЭœ}кКtЦ“\OНчЋfJеhBлћ€žhТ™jll\faaбlooЧХХхЁЋЋЋ>тШƒЧф'/к0њ“„ J_ЎЄ|/Нчў–вЗhBл‘R,‡cБxЏG0і11ЛФf[Тx‹a6aЄтШƒ'јВнџLNžžžё999кЎЎЎ]Иpтуу)**Š`с#ŽтШƒ>ъPЏ?Ц6 gјЋеъЦііvЪвxрW*mШЫ’ЖœџTŠН’$%tФKI7іРТGy№РGъЁ=ƒГЗѓёё9оиијАВВ’ойБї’є^A†ДГaя”ЌОФu?jтЏ 8мў[),|Ф‘|дЁ:аƒЎЁ ˜2–%''7ДДДPКц№э)‘ЧˆЇмћ(Єњ‘FгЁ+Юъ B=р#ŽтШƒ>ъPшAз˜3рy…Џеi›nй|r5]Ъј!VЪŽ–R)oi”Ћ‡>†тШƒ>ъPшAз˜чРsŒ-ќ\ЇцoЎппQќuЮШ=з ХIК žq>\ qфСu­аž1Я™иkkk /сКК:jышќ>ЗЖНЬірЗћGЖC3АS:є(>тШ_oяИ~DDФ ••еUж aМ]cпцŒvvvЇ‚‚‚ю”””Pww7Еvнь9­э9UvуˆУс[)А№G<цњљљQpp№ЯцццEіSMNтƒХиЗЁ’1‰БвТТт‡‡G+ЏЦ _+Т‹ІЗЗ—њњњ>тШ3Џљз08ћДѕЭYOјЉžЌž#ЏDЦ~ЈDžŒ(KKЫ2{{ћkЎЎЎпyyy=єііжСТGy№с<ѓгЁ‹lЇМІ #Ы•TРM9Ш б„Б_DJБŒЅŒ0ё`IedЄ1v‹Уіу%ЦЬЉceQsхК= ”њК‚Žr…oЋ†CцЩБ‹2cО х8˜т4Oƒи0^˜!|^pЦ3–лO]мf/з%И((нKA9+”TьЏž'?%&c}РаЏbSБ"fŒgФMv"b€јяы4QVК›јxЁ‚2+(wЅ’ЮЌV op”ˆзД\пШŸ§›Уx‰™П Ўлt†%УJ ›(‹vы]”ЙDIy>J*]ЋzТлQ„•b(а„Ёƒ›ŠСЭŸкŽ™тЋчЦ\†cоSиш8QVу(зэuSzЉ’ђЙ‰ГkUК`GyБhBnH&bіуФЌ­Х ŽŒŒ… wЦ"†ЇТпъ8Ivq7БЯ]AМ•єљ*•­Sщ\,LдœŸjh БџгГФїПЋШ‹Б„сЁ|qшЂЙ‰ЊX'nТCAЙ‰ЭЮŠzœЌъЈ7 Ўпvnт‹иљrнњYІ8#тэ-pК0"Ї“х‹їФL1!хhBјˆЯaЬfиŠ•›&ЎЌ&6Zз€F-0Јh|˜„™ўўЃПk\їeCшIENDЎB`‚classified-ads-0.13/images/win/000077500000000000000000000000001331670245300163565ustar00rootroot00000000000000classified-ads-0.13/images/win/editcopy.png000066400000000000000000000024551331670245300207120ustar00rootroot00000000000000‰PNG  IHDRрw=јєIDATx^Ѕ–Kl\WЦчмЧxfќšФЏGj"юћђУ(LfBl*h€всЃхCќђћŸ=ћƒgч/ "ќъ,зЌMф?'V66ЗФŠHucU^љё Йvё[В6ћ’дVпъвk27§ЂД[лRН§‘ЌнxUо{щŒМёдŸ4€8ŒK;€€D 0йuмЊВЖВH% хЁя\Ђ2ќ џxчwДлqцb{ЛСжжCЃ'‘о<№и(фI фF ƒРХ`šрЂlAЇНGuc8ђ™SŒнџMV?z›­ZƒдДж\ПРЯ~rŽйџBœFXk”RM`Л\Ѓ;БОA+УПЮеЋoђоЛЂ^п ŠЭЙ‹ГŽў2_9§9Оіе“ŒŽ "bАN >9H Ј<G†3žatИL­z‹Эѕ:о‘ЃŽо‡ГBХ$i‚ж02<9 {Š”њгWє5рэА`[`wA—@pm|рии•ОSЄVQ(єЂ} ЌuXk3Ю9@UШюpP@YИ]Јˆ!№-} ш^ ˜Ш"ж’$1ЦЌБXk<п`] Јƒ/ZЖиЦ€ЮER H„ Ь">ЂШ ŽЃ˜4MЛЫ=Д&оЋгьXаф }аи-pЛ@pнША]QГ(Ф9ФHЖ8Š"€,Ђ$IH“q ШАћ:0`ЖЛБ(Ь:и6ўЁЌL‚ЄAP LU’9ш)Б"ˆ"WР"Š8Nё§ќаŠbЙŸЪаzћ№ДVy.9€ЙЮ?^?`ЩH—Лтс)…і4…b™оСŠwІчHдРжYš_frІy r;ВЩ,рч.zК‘Фs Ър•КQ‰AЋ ьatф8e•аМљ!е’ЖыL~И6SлЕ3ЦW~4}PЗсД&A…y7K Д6Hмdх§пт6М~mљђЅіЛЗ6Ђщ…ѕxh-iяы вЪOŠЄр}`J wЁ8„Їьд;Эч/]ІеБПЏяй tфр‡ˆƒf‚1ˆ!ЕХ~ <vu'Y›КвйЋ­№Сo-W“qЙСС'ес0Є (п…aћщT7гЙ‰+ЕЕ™ЉVccЮќq"™nЇЌO2ЌќOЅ|ЯAxкНь5уxљњлйwЎю4n/›Ы“L.lђЗЕm>оjq3ЃtюJ@{ЌЧ­=СqцЇЎдчџњ‡ЦюэYsўЂ{nЉЦАдѓт,wM.†ќцзчЯі ŸX`aъ_Lммф§fТPЯŠћ”јmQJU€айтџ“OТ0ь$ѕr•%IENDЎB`‚classified-ads-0.13/images/win/editcut.png000066400000000000000000000035311331670245300205270ustar00rootroot00000000000000‰PNG  IHDR szzє IDATxке— T”UЧ?D!h@`@6Y†–\@#а‰ Y&ˆЬЌмr -ЫŠ"+#„S)ЬЈa‰u€ F` б!`А’U†mцЛ]ІЯNЛ`q:Нs~g8яоїнћЖџ}№Ÿ2+'OOOІ‡‡Ч1wwwž››лЋЫ—/$BбМлим0АOxxјЕв’тсцІFХймм‘]Лvv3™Ь|GGЧtбGhФ|5Lр]qeЖ:hѕјn/Рp 46ˆ'}}}oшъъЁ›бМ%€Ып э!аР# f=OE :M`2k!9ёх1KKЫ tsEЬKl6ћ3)Ÿ~2Sinn.Бbш•nтOB5л•vvvWаƒм7Г(6f“lьђJВœ­ДЖЖ–`їsю,ЧЦЮBH„ЋI{{ћvь‹EЬцcџгZ.%CН>є5юяеЗ1р<€UЅ’WЎфВeЫ:бѕiФђ_OРХХ%ъ•&ХЩмyAЯѕrВИрУ‰сiEџзЛ 'бZХ`0.Ѓыc @оeБXЏиккВАkснЦшялjЋwуѕ] ЩўК­pГ)QM_эЈЭсЈ№CRє{1§›РGFFV6]Љ“OOMCЗћ”ЃЩёn а $„уgzЙ8‰€Љ*:LT™ƒЊRф5ЋWЉэ;ЦŸŽˆˆЈljЌ›˜˜5уrh“|ЁФ­k@—PbM ЙпФФd=7xЩhPAQЅїpхhћ}œš———ўL`ЏЊЫѕcУУУ№3#pЋ_F>џlДТo•щMCCУ<єчshК+&Хb1Ьазћ|q1c/‹NЇ{ќэ*рlЙў^’єЄ•ђj& хK ѕ?a;ŒxаpЬЧ“о†ЯА›]EžЄ2ONя' `Её њ>uВУ]шIXЈъо~-vМЊт”——ƒT*…Žжz&!Р$7 ŸЂё‡’ря)щ,rš„‹‹Aє{ЂЈИСFƒV—ахДMХ™7YЃCысЃ `ЯfН!ьOGЖ#ˆb…јamШZЗrА8яUQQˆD"шў^Jn ьЦ-9‚>&ˆжoKnŽн8œз„3‡Ш№ Ѓ^TЕR4Фпc3KјFГOQыеЉl8Ѓ;‚Жф ТќUEЃQТт€№Ў†јибHEўљ ШЯЯ‡юЎvx,6jћSеЅћN9ьVШ_™^Аv…Х Н€н/р’Нˆ/`р=ћлуеlhЫ †Н›NЁН э/" ‹ўЂv˜#kgV#аџСмOЉ233Az­ ^о1ŠвO9БЮ—-уа_Ъ…Т“–S›BnЃІћ№CЬЮцs EО9O†i‘,g# uЗю"Ѓšд~ляG]ЈŒл4–Х;ЂВєщО‚ЖuъoИККЦкВpКƒЧ‚СЯCA!rеW† Њ7‚ЁтuПїёМЏЄ"\j†ГЌЄІШj|ЮСГ6А=zoХчиїbŒtІEЪгмEŠЃбšР?JaCMZœŽеTQС?@Ђ›9*š%ПЖ:::\TЭDќ;ёEєяdi…„­bщ}њX˜ОtяНnЄg[˜žЬŒNœEллTЦЖїZDЈ8tФ qЁfOћН‘‰pЈ7оd?ЅхоˆщПєіЇQё4ўЪЈOэБ %ЃKjРџЎЭъПуџ”Ÿ/ysp3afšIENDЎB`‚classified-ads-0.13/images/win/editpaste.png000066400000000000000000000027121331670245300210500ustar00rootroot00000000000000‰PNG  IHDRрw=ј‘IDATx^• lTЧ†П™ћиѕšѕкѓ0ŽHѓАма„є!JдšHъЄiт„ (ˆGS iR)Љ*HHЋJTQХ+…аЗ)ИQ\+4Э‹PJ•Ех&ЦP‚эЎЗ6ѕѓНЛsКŠVИZш/§stfЄѓЯ?GЃЃD„ иЗN-§C˜ymfŽЧё#(@P ђr)МЉ”јзnf'šцUЛЄ›ЋAD>хюе<вRwлаІ''ф ц‰<§эBљлѕЏ#Oнњe"Т•h“ёXYqћММт“эtuu`;ыVBхпђЭОccЈњБннћdУІeЯŸ­]Л?Qssек;–Љяўз'њљ#4ЩщoЪsђт‹/Шъеп‘к‡—Щ=е5ВpбНђT’Фи\ŽИ$’c—В†Ÿ-Šюx”™КŒBЅŒaNe%ЧŽеѓQЫ1"'шm!рoУч ‚$AРєƒщ%>6@џ…NМ”Рт3\‹хJ)˜ш2(цUф1šаŒŒииЖ…BQ^тТёI` RA”"f Џt€МќЉ8ŽPёuEpnЙ$ ,[1ЅШЧн‹K‰]L№Rh­ШЩБ9бьdьІ€h ФC)Cв‹гмє^:ZN.!кq. фe;PŽЦяjДэ№k@А-…пgЅs Ыб€лIби–ЄЯ@RуФc)Џˆи8АВ@+l[a”вyу Џmel,FWыП Џ@iCaAћkюdСТЏ`ыљЁхЅ“‰{>‚Ёщ\<Р|жhѕ)•Ѓ‰Дp№ш8oў Ї:ƒЬЦ2.Ўц–^резР‚E_Фv…р$Ÿ[€QA|9г№Л ™%`[жФЯШ 8xёQњG‡iш*фЃжЩ$њР‡MK‚tvžFA<\;…cJ/ИЙщ˜Ќцк€#`\ф‰u3x§™[И-ч:аWрyCssРL€ШrАЕžЪўЂ0мWЬДВЂб!ЮЖѕ0Лb=nтr@– "™ЪiŠd"d  ”zpынж”йŸуЙ§?aИч8E%Г(Л}-бћVђц№\Ш› ірhŒСЄ ֘ЬЭ Й\шюmџ;зWзRВН‘žž$эžCc/DЛСч‡Л>7ќѓOxОYЬ)/ЃѕbŒ`Ф i™˜ "яЦо|ОѓwЫ+ й…R1†ђ|№еТ8ŸсІw–ѓёogрэ'ˆE™џхJФKaR)D$уHіЅVd5љK7аwxЯxыРq_кLЭ‰эЌkпGеЧЯвsh%GываpˆmO­рЕ_=Увъљ$“ ЪEйA,w р`i4 ВšїPі” GїFјѓПрƒЁ%ЧAƒЗцNHсиЅх%дЅ/PPˆƒхLBлyXnˆфhмtЗНѓ›9Ппћ}Ÿѓ}žї§Ѓр?хЋ€џ—cлK#+џpC+џDУ™ОЩњгEqЃ,М}t&ЬЋЂЂђ-iёЙ |в0Ж[лЎќU˜~з_rЅR,)SˆW—)‚ЂЏW‰"N,пБйnpпŸ[›єКЮ*€ўв[—РЦ`гОѓoњ˜|ЃуO§в{jg ыX,p y*?YZГПў<’й-)А#hВЦRfCšP^#pИЯ9Б\Ђћ?E№Ќбф—f:[яэveЙdНdЫЅ—оX, №LфX‰sеI+хтЪƒncbбS ѓvђ3 хСb9'ъЮ†4.Яіяі_bQŸ˜ЊN=Є(sJК’Io2Жџˆ);Чл­x”|ДшMj1Ац ”Г6“™KксЦkTkЎ”Wъš{œlтфЮ“uЕt[бГмгРшЉKюБ– Qi3|ЂћЦ№јг/ЃаC ‘гџР˜TEOЭ1‡• ’ЖD9Z’vЄ/Л!вуpЪwЭžYХŠњЭч(>ƒю`Ђmq g˜™•и?ошYx_ѓ,|О&ШЄ`=зжYJTTћщLaц\–tьI] “ŸЬb‰™E5š†6—y_@:МЕw]=hєŒнvоы*2‹žд%ВsAЬЦМ]Д“–ZD3(d™)zQ?еXФg#žЯ8_ќwСжм>ЖТшGћЮ(ъї0ЇnЪаuљE3Pщa#[ЊљŽєЅ™ЉНјaњХђZ9- ?ЬЇ•і[ўъЦDZbИ0X@k}G> J:ГЅ›|${Ÿх\rK€эiЊ5є­ryoдлФ6>дH#-УЭьХт8'…"ТrhZъ”@R`\а_g‡;šzМAР…”ЉIф•Зтћ€­pЭГОУ&ЪоuA­ нКїгugž хчЪkт.єzQs‘L+h‰%їŽвO5hЌ:їяnQ”МВјЭЖ3›ѓлїzLчНіDЕ 5 ЌWPФ%щ‰ђšШГР ~[/†sN рМ ЫЌ‹ ­HOЅ[сКŠ П+ъWя8њj€Ў…\ЙoЩ7ЄбЁ?нЇ—ўДekу>——›‹€ш| "XЩpњЇ19@оЕ&4ˆа2šЕеbvшуЃчЫk}зЪ+Й["•6‘–{Ея<”_qЅ8QІoвsцI^L cз+wšа B}€Ў@ТŸdWЃЖeWйyE?юж{ш~о‰ЈОїZрц#Л ье‘ќ›е‡Ю—жdœ+ЉЭ8[R›~ІЄі IЫу•Єц–дjк–qšˆ49дHї:§<•)OщаЕ—2ŒіЄg#]h9xЌ“3и\х{CЫиЎDЫШЎєctы3,ƒs\Gѓ"кПѓ њ‘0Њ’ŽФ€8їfА#УЩ' еwсkлф{ОсЈюFz4ŸсГџђјњЯшЋ€fљЮ•N= ПљŽIENDЎB`‚classified-ads-0.13/images/win/editundo.png000066400000000000000000000032331331670245300207000ustar00rootroot00000000000000‰PNG  IHDR szzєbIDATxкэ— PЬyЧuюХцКыp^Nођž\)Ё"D„D[Š$Џe[ŠшХъEЕ^в+y;*ве:ЏЅЩ!NV:ГMt^Ю99/Б‹ђНяжюLЃщЬ™1scg>Гѓп§џžяѓ|Ÿчїлџ6№^љРџ3+'ЉЉ•г БЅ((ов10Хв1 u˜ƒпz3;яЭš5kMš“wћ>-И?…eУWz,лu= ъд§ашkевЕ7двЈъРШKOФвƒї†ићцлЬsЩ—фуw Мr,EwL_œЄ’%(†'hj%сРt?`Ђ'0f0Ъ чИ/ТЂяМАq ЙйNпа‰ЫѕўГ№œхЩђЄЪЇб€[ …Ф€ХlРd`шєu ьШ`РxРi!р^ ю3dŠ‚aŒпZ˜ЂњD:н'IЕn;…7ЎA€ЦŠЭ‰“ьM(fфєvКNєm€Ё" R§ЪЬN|‡сDo%>bZАdМGЄ2<ОИ*< ˜ТŠ}ЋХd)э–‘РŒh~ЧФј>iёњЯzиІЮРbЖШZ№!}оЊjqآژTM­7E&АЗщŒ—Q”‚KSЈCРж|`gp№пCлзв&кЯ тјЌarоёе -§тR‘ЖъˆФт*й …БjŠŽЄp‡-=н ФžВ”РžUMplІкУ/юiФ–Ѓš}ХД<N№^s1зIi,л3AђˆсCўо>мцќр ЂѓКхS=cЪbSюj–ВзЂ``Ќ” ШXU fХђу@F А7OU3С#єIЫi•ћ +дыиѓ­hsFБ&1—-Il‚ъcЌOQП2чyПЮ­xbВђO“Бѓwvh3Y8(t˜иŠЙўЩБЛ5Е^rі– mWё}=рБƒU(€E@іХЕтаmЯДТпv5Ъхк(тE&1žПODъщчEЩLZNћуˆMч^є4p•їјj(Щ?ЭЌЖ\|fdэ–ehх"с ЖзWІИ%пЬfПэiЛп]6’t`]Y ЄSОщьџИs_‹bлH<‰5щFО8внЦ+xЧ­ŒŸй†}tŒ-ŒЯЂƒnЁOtлv9Ш{\ДІ<’Ч ќвKzAm>ЩЇ,|г-?{ыЖ˜(cекЉўA8`›ЯGKеЏ–Ыws/;T|гЉзam/‰=щёњQk1uљь5лŽ§ž^ „QXў#ОщдѓЦЖкъУˆЙЖW2Ž C9й‹ЧхеЕ.J&­ЁmДlўn ”НNf%G”jЇIфе]Œ,a€2 %э­t2>-чZu*“Ž;AЧrдZ‹ќЗдm—ЮЏ]I‡Кc_C /Рв—НЋЏzњVР“ж­ц„ЇгrХ…л5‚хчЙXNІ UЗ$5ќmp’Ф”^ч€rœQПrє’W kWвЂ.L ,зящQЁfВџ‹hYD>FёЭYч^ŒЂxGГг\A&’N§ h‡;ѕЈђaО Ш-–DьV ЎЩ‰iCtъP>I€НœжЧГпЉ€7{œ$]bEЗk8 wtлъ+„УУ–ДзŠ7vvxј'ЉJ.V~Ћї<њОLy=ёКŽ^Єщ€ћv`nА˜УЖ‚ЎDѓъХ;ѕœЯл—KвІбЪEAzLрРЩ’Лšв;мѓT!NDџŸЕBД(.R+9lk €шbкЎdяЫ„ЌѓЯћrFЏƒЇ}ЃŒЗ0.­р^q…ІжYМі‘ЩИRa‹:“.ф“† Ў\ўШљ…b%„§ЮTйРaк—wИ\l9X юgсДŸKњ‘Яy(БMЎпыыУ?Ѓ 4Щ_Цm_чыQ&IENDЎB`‚classified-ads-0.13/images/win/exportpdf.png000066400000000000000000000020431331670245300210760ustar00rootroot00000000000000‰PNG  IHDRрw=јsBIT|dˆtEXtSoftwarewww.inkscape.org›ю<ЕIDATHЧЕ–ML\UЧoО‡Іƒ Д` %ND VЃMД5RЦ`§Xƒ,HŒ1vсЎnMw.КkʣԘ6ГnXи&e#ІИ€Јi-ЅЊ|кѓС›їюНЧХ†@‰мХ{їо—{~їœџ9ї>KDиЫцc[`­ѓтЇчћіЇі}]D˜}№tВ”н™ёK‰ЪWп8_,к…І?<3^8а8ѓЭчoЗп™Ю’Л:ХЫwпеNiџ„КW;ŸЊ ћўу{рx „џœ^сюЬ ЫПоЄyєкЎПY/аиЦhM<J§џ­бк [iАЙХZZxwlŒть,.PзйIУБchлцчюn^Яd№GЃф''Йбгƒˆ ЕAkН&Ь“sCCŒ>Эk—/S˜šbЄЗ—x[‡ћћщыЃДДTv@0F{йaš6uuёЦр ї.^ЌЬЇЇ ззаyі,‡NЊ„H)Rzы4нЮƒ==ьфIщ4ѕGђшж-ъŽaЄЏcлž}‘ @‚;‘›Ы1§zeМ8гJ.WD‹)МoЦD Z{BƒФX‚r J)„а€ ;К}sœкцЃуёY‚ƒ1Ѕ4Fk”ж(W1џh•лsЕЉzќ=C$Цuеж•,хbбкЅ&Ѕ9)М”Ўу‡Йњг5DрЫЏОрљŽvЧС))š~Ц ‡53ѓяЎЋp]UUhЭ™`ŒxчŠ1иv‰ЙЙyюMмрсђC љ<ŽуP*•АэZG+сѕюі…&Ц`ДёЪ^lл.Ї]9[ьUђљ<Ж]ТЖmlлЦшpy­T<иxKжЛV4ьCЏдЕб ЗЕђVз›cˆХbdГ+уЋЋ6кЄж+йuQЎЊіРВ, А:>јЎtєЏС§MЉD! 4,,‹Ф™}ЬЖ“ Š`ˆв ј€b7вьGп~@ؘЫr‚є€n–?Б2w))‹Еb„р­ ]Щб.а ‹eРмˆ8s С’`-рpВŒ”‘и Z„ ^‹Р Pњй š|)‹ФЕ`XжЁАщ@ў…љЈо`^‘„х]ж kїетьИ,Wг,„`K›R„BЛШJdАƒ{€ЙъдJE`б*_б–”Z‘З@Љ(v~аzљђƒ"иbg,А5HўOФUQомОТбўымjлЭ…ЦUSыцSяМЊEљf0gЦ‚ђ “HЬs_ё˜Ї–^кЪљщ‘SЋчRЪ,р8иYЊўO —z™=м\fфУЉaыЃЉ›ˆЬ l @(Œ*СZ=e$ъЈ ЗUEDA2аƒРBЭ‚”xRF"AX`‰СЋ…бКiЫ)IENDЎB`‚classified-ads-0.13/images/win/fileopen.png000066400000000000000000000031761331670245300206740ustar00rootroot00000000000000‰PNG  IHDRрw=јEIDATH‰•{l•wЧ?Пsоsыхœ^р@iЛВ^(хEcƒЩЧ`[48cf"ScD75&ЦfH4&j6]0dqШ(ФЎ`iYЁс:*дѕТЕаг;Нžы{љНяћѓ4Ј˜Ь=ЩѓячѓфћЧѓJ)>ЩМ§CQ\Qк>ЛlЩї•ыш#БЮWЖЛm_нФвДХрІWе8€іџ‚џ№#*)`ыВњЕпЉЈ{n]Qq-Ў'HvђйŸoyВИ/S№ф Сdу~!Фз”Rђc „тјжеVE_™ПbЧ3бyk|"yЬнУЈМХŒћПИ<ПўХх•ЕŸцЦсѓ@†€‡ :оŠРъ]*ајšЈ<ѓFё7ЫnњVй‚ѓНй>ьс&FЦЇщŸ #‹ЪYѕь.Т‘rъw†­.Рћ_§ф+ТїФ"žˆЮ_ОSѓ‡ š~&іљ|bVЭЊ­Џ”еlЉЪѕљБюЕŸ™фЦЄsж2oХчЈ^А\‰тwй­—œ ”R!ФБзX8+:{wХВ/ЭžЗ:(Ќт‰aнˆh‘H‰OM_efЂС)A_КŠъ•/PZЕ„pЎ]зQЪ‹+МtПЛf|јяW§ТаЂђЂѕ—bЅЧ^[Qїєž’л#Ak•К‰Gг Eй:њЬwFR fJ ”mfy§BЙ!\лBJ‰ыzI&'щкб{P.\ПCЫVˆ яьŠi‘Ђ’зЃnЎdСЖ oE9:o)%Жcb2ЩЕб ž9лЈ{l3%%QЄe`YЄэ`w{šщю8FmХжяиыѓуЄЇS("Г4зWхїy‚щЁvBžТ›‹aZ$в:зв9QНўЪЪ+ё #›ЦQЫДшЂуєя@љјЬг[ЉЎŠ “эLмМ№Н7iЪu=Bй8.XЪƒ--юŒєЇЪЉXёVж,!рї"-CJlW#>еЯегћщaщŠЧйАОзš"k$ž=‘УЕЫ-ƒя_с= РU`I…aY Œ&Йы>ХЦчv’вЖФаM,лС4,ЎwМУZ)-ЋсЅ—ПM$4ФЬаqFFоС№bЎДLяkЫќъђ-К5Wm;R’ŒghЛ<Ъ†/Š‚pl&ƒу€aZ ѕ]ръйј}A>Лy еЕХшcчшПУДl^ќy•LuШпznД]ОХI`RГmKк$“&}§SdФ\ђ Ђ˜ІФВ=L uбyБјј]V?О™5ѕ•йЧHw™ЌФД$Ž# †ЫHоKа№—ЖžН-ќtM: УД‰ЇLzoпC›Г„pd‰јчџHьњ9Љx„Я}7Сa‡‰Чduл–d2)ќЁB„˜Ыа•ЗѕН'ѕп˜’Л@R)Ѕ4i) COФю,]TPяј1Ÿ`лі—)-ЯAnb,6B:c‘H&@ЙhО ОмrrrKщ?w‚3WcG“:эР”RЪаLщ’б%“гo 9Ѕ5œjкЧО^vї”фѕ0дйM6›A л–X†7'J~ўЃˆ‰1šпћ}цPћєЩ‹Зљ5p0џљ~4нR]25caЦ6ІщИє›žZХш­#dУљHлС4M\WЧЃх]ŽЯвгжшь?жлћзeMZ€~ Ѕ(Э0\TV’в]$~Ўœo`Au1Г‚#DТa’Щ8Ўђ —уŒv~Јкк/ОйlЩв мЦюУЈfX з8ЪO*™ Жj. +yAЧБqE0RŽ…˜ЃœiiH§Ж9uъжzяƒgC=Є5GЋЪLSVhБЌЎ€ˆс’6 ЏЈst”СЎFїУЗ:NпЄС’\†€)@џЯЋџM№{ЩЩб( ,]Y›ю!/ZŽэ™G "vЖ…#ЭWœuŽІLŽ1`H+ЅфџџKŸœь–йю•uЋŸ/4ЌыDŠJцд’ˆѕвrтдєЛчГ­нЎн#˜‹уЁ‚Зšм?W‹‹эs+7Nвбtаz§ШРЙЮšLЩY`˜О‡ћqРЮќЙE<џжїђЎ7ўt‘њвК`WЎŸ=РF (4ЅŸdџ8Єn_UI‚љIENDЎB`‚classified-ads-0.13/images/win/fileprint.png000066400000000000000000000026601331670245300210640ustar00rootroot00000000000000‰PNG  IHDRрw=јwIDATHЧ•U{LSwў -}№”gy­a !ё1м&с$NФ-‹бG2—˜-fЮ—‘hиіЧўqLЗИd™dfYŒЩŒџ LїР)у§ЈДДНmo{wЮ :us'=љн{{яїѓяwЏJQ”–э…_іiВs >ŽzB‘Ÿ›|Wђј‹dй'[Ь‰Џь[Ё бъНnеджЊ— &gњ†№ИС6ьGYйЛиRЕџЄђёе‰…K§_€šRХЇЊњc—ƒrкЕ”Vї<—вdZљЭутЭ/L | _Qwkpг‰MZЪЛN`LšПsSеы•ДЄ?6ArТS0%d#оИ}зZПџ§з9И|€Ы 8ЁЊT?wД_ЖЮбЁƒдsx—rŽH&ќ@VA!=Ѕ}NЏ‹^‹ЪЪJ>|В,/HОм1žYЛQќс'™ШšЯ~лБё­’]2 ћуan:Ÿ$Њ?<ќЩ‚0§8вЬ№Rq юїћ „ъЁVѕcы‹HЏЄ4нјtЇj'эР№pk ј™/ы§кž–$iЗЧуy$јb|няW’eљЎšѕ_ЊF%X‡uˆ0цDР@Uы‚œT‘ jКё…З_…,§ёщ‰†“1DђЩ;Х•(p­Ѕх"‘x“NŸf†Р5gCЯЕ.H#^иe7‚x&’„  -nнŽ€Х’уЧзNOOзЖЕЕн$ЂеєрЬC0ц;Tймќ"УCA ГГ’л cl<"ТТ бj`0hрqћБjѕjсœёёqddddFDDL:tЈ€ ЏнG@РEййй_экѕF–Ых„Ус€фёЂЛї:,™Y($зАЮЁЁЁˆ‰‰ЁцЗЭfUOУWaddлЖmcВЮњњњИ@'‚Р`0|X]]•‘aС№№04 t:rrrаппјјxqcrrVЋUt7;; ЇгIŽ ‡йlFZZЪЫЫƒ›šš>Ÿ˜˜иКH@0И>fо™™™hmm…бhvTЋеТ1TЫ"ŽN$Їз{ЎуЮэ;ќ|>AЙ A066ІаА@] 55QQQ эыѕz’6AL:ƒ­9::Šоо^иэv:У№аІЌ3ˆ‹‰C0дДƒ уzќ•——WФrœ9sFfee!%%E0wУ:Г4еœfAюЪ\\Œ<{З>ЗƒЗЈ_ИнюЩЩЩ())3 Л‡5-..FWWФ№Y&­V‹0rTnn.–/_ŽшШh8=ЈœЏС™ЌB“rю~›GВБББЈЉЉСрр КЛЛбаа *‹‹i2™РХ0ыЯ]єєќ‚S Ї№RIт’АK6џBŠ &ЮŸ?5kж,2ЇЇЇ ОжммB2i)ц0==‰ЋWЏ ЙмМGШUЏT"11QИoй2‹‘ц"LУ›Œ}Mы:вМБЎЎ.‘‡и€lЧ .itК9ђ м%†’’Š„„DфччЃЂЂ‚•€_ё#/7Яоззї‘IENDЎB`‚classified-ads-0.13/images/win/filesave.png000066400000000000000000000022651331670245300206670ustar00rootroot00000000000000‰PNG  IHDRрw=ј|IDATx^Е”нkеЦ?чefg_ђnвДiС7ъ тMєЮKЁˆ‚HAш•z!НєЧя№FєR№вK[-ŠŠBЌ(Сhmк›”&mšЖI7Mšюnvgwgwfgц8=„АЁ€рЯЮ~™™чѓ=п93ТУ)ЭŽІЇOПц 0GAђя$IVтИћЫ•+g"ЭЎЬ›я}єП“zј‘ќХЙYЙ№зŒшvšB"„§)Dп‰v]Іžx–'_<Сјфaцgч^šћь‹уР%р^€уЮ№˜їkYщЏП<ЧяОЪуG'‘Rb#R$ТжЄRик)pцв&п.kє?hр04v֘fЅъЇ76ѓдЗ}=EСєт‰DkYйєziš Rч*ЂХŸё^c Œ“$щE@Pš>I EGк€вр…b‘8ŽЩюАЁJйpыюё<Ri€щ—Or§Z) @?Р†hGЂЄ`( †!Н^oВ#[gІнn…!ХсIђљˆhїš‡h!Шi‰V’zНЮ`СђmчЎык)лЙ]Ѕ­ЬљBžлЋ ЯЉг†~э‘ИŽDУФфGІїzvL;Вс€]UЇг!0†z}›8Ѓр(кBьзЧs ;:A`;єМŽутh…в!ьRaWчhZЗ#ђ+„м Ѕ$Ї‡ŸцЉgžуиФ0iJjШlHRш%†NaQ"AРvзw%іp”сбN0sK№X`ВZв‰(Ѕ&ˆzЋ‹пlSo6i6|Œrа‡Шхs(yРˆr &ŽLёщїѓфЕщvЂN@wQ&ЦsCХ#%Б‘‡ЈЙc$К€ћЌ@ A!чвИ5ЯѓNcSУ”М|6B1',2’ЙT,рх\””DqLаjrйwЙh„мoDJs5~љЇџџ:ПЭќФжZ…ЛqТЉSЇ0ЦЫ9(%1@bРЄ†AЩSНџ3__џћ<Аtїю"­*‘e7чк]bпdЅЎЋГ0;g‚ 4ѕzР§ћ jЕыы•іЪвТЙjuщ"pиТ~€t]!ЗЪЫ$ўZMѓі;oбjvMЛнуъеMЎЉV[aЅRѓkЕкІязж}џоjЕZ^]\М|טДмЪ@Ыdъ˜жќ…+ЭЙѓ3ХђъІљА|6*ђa‡еVЋБсћ•rЅВОV.__ЋVяж€.а‚>З€&˜L{ЖiwОњф§7!tУоveљъьЦііъ]cвшє9АЕаыsLfМЋ>РТТ™я€?@6xчq˜ЩШ,ўбOˆ–xџQIENDЎB`‚classified-ads-0.13/images/win/textbold.png000066400000000000000000000021431331670245300207110ustar00rootroot00000000000000‰PNG  IHDRрw=ј*IDATxкЕ•mPTuЦЉІЦЩ)fr,гeƒ˜X” hсє‚еЂXYЭ”JŠ(jЂ‚ю€МD 2,б Ќ`Ъ&/Џ{aQ`rq‰KЋ4ЛFACГ5;ГœyzўГ9ЭŽВЛ~№У3wюœsЯя<чм{џ>юЈ\nVmиŸBnCjъCjЖG“BvвШWџ„FЇгp™љџЎќ-bМRПи€ю‘Iћз'$kФњН5ывb<МГЋиXЄ‘ЌтСKП}ПчЎ§МџDLЈОwlZР‡&‘'1џЭЭЪСрзЗњјјм5уˆBЂЖ?•А;ьэOђЊ$k‹wўЬNy-950КіьтХБ Wу5iEZГСє2fИTЗЇ^xcgГfКHXЖњуW’jфоq ƒ€3_-Y‡МUЦx 5oEьuЭ'э]2Œб ŠН0Ж`&€Ы>@OР&@'5’5 ,Ж9+у2вUMЦЉіQ •M\ј иTlœя)ѕи™Ѓ‘uДпxBЖ.<Џ'м/BО“цwsТ›.”†p/;mХТэЌ№Њси>Zp'‡Цb§ЪЕўgGпйЌ~Ж ”У”\Ры–cЗoMцГ*ZTП­ЙжT\д агоІуХч/эA З‡а\gšРъWЌд~OўжлdЎ‚З=(v„‡{iœo&l–ЁдГмтB[иi,xPt†—њАUsЖї+NP‚Ѓ<аa]Ч^_уЁL /Ж_3ЌаZXў~ф9 Ъ5ЕЏhЅЖžK>ˆ„§)|Okp8ƒъXxЄq0q<ЊˆжuЯŠ{ уlyМŸP 5Ў:j‘Џ й6П.Й}ІрXЬ#ЈŽФ7ZМ?IICчѓŸuУ+УD‡/Дц{œb6ЧjЭјПМdрO~лЬ2A7v4ПјCƒуЁCЎсЈЯ„СEКчЅІsЈG ?ќдбљъhЉ`/†бe*№OWДіМьo›ЙŽ@0›УфвŒЮЁ*T‡Ю{Ыƒ bЧєŠc˜чxюЕЂЙS’ѓ"цЭЮУX/ <їb~l5A9&Аі§€m<ъФч.IENDЎB`‚classified-ads-0.13/images/win/textitalic.png000066400000000000000000000013751331670245300212440ustar00rootroot00000000000000‰PNG  IHDRрw=јФIDATxкЕ•{HSa‡g(‘І†™!]f†išVj(™bbY”HW+*T4ЅыˆЄ2qšДВфи$tLЧёžЋЁУ­œгА…рjQ!ьсзћБDКœmx8œѓ}ќžsоѓ}яјЏќuBь‘ЂB§фА№ј‚ Ю8ѕ˜ќМ§ Œ™mш?у_6Ц`‘Hф!TАљlLWоЬ›†&ПZ5)Џ?иD\ПСТЦЗХЌ&ПрэHЬ йОямх])9JЙzvNejp4ЛB›о)KЌ^Жм'™~‚t,!мcвЎЉњ&ЌѓЊq€ŸЋ Nc)Фb%с&PАXЊ3љ2на4 |єJnx&(ъP…n$\цк+Ш(iтM<wŒН“@^9g\Мч…ЏasHšЈ$ =аЎ%С{рРiЉЦнkU М!ЈчшЫGDЗС:П;5wТЃ7G7š{кn#№ќ а6дu,Ёq'фО…pqTЕ”3Жы€цW$ЄМIžTEсЮhЪž ЯДh€Ц*бyЛyм_™ЫжН3’ЊNƒЅqxдДы*™‡З[џžЮtЕŽXчЋy ІhшŸ O8ЏЂ№Те!л`y2н p_i”sZspєБ $\dмЈуMВ> Ќ`gv‘ќ`ЁБй- №Е„Є„ЃnЉюЪJHЯ•щV„\"Џ‚ХLъХ эІс™šA ј% !С= }Њ5я?%еPwН}8_l@­˜­z N <ь*{€к!vЯ6VкІ5яto>…‡йеьX#V~Р—№$\œЯ17ђЙvуЄbIENDЎB`‚classified-ads-0.13/images/win/textjustify.png000066400000000000000000000011621331670245300214660ustar00rootroot00000000000000‰PNG  IHDRрw=ј9IDATxкэTлnQэЇљ~JŸŒ‰>шЋQЃ Ц&HМPдJ[(єBЙf`†[ в4&ТœГ\gŸ Ођ@Ÿxий‹Ез^‡ь•ЬжЛїЗYљ5еі–йјRтe…X9ТЧ“ MNaЇ $] Ч9[ёЊЂvNlfvїл9№ЕўkЄ:Ц[8шлсУЯŠ ЦDсqв у…фif~ џщlЇм‹ЭШ)бLŸУ>–!њЦLсЩй6А/wL‹зчxъ№!94|žЖк\/­_›Яѕ*!~оЅB›wѓ'кіБщтжXЁ3е‹9б{фЛSЃUЫjLЏє2фоЕбaG ХИа#с,‹7ИeєmЋяВ І2уЎFяњ–Bў ћ'ъ`Ю!ДIENDЎB`‚classified-ads-0.13/images/win/textleft.png000066400000000000000000000011311331670245300207170ustar00rootroot00000000000000‰PNG  IHDRрw=ј IDATxке‘KoRQ…ћгќўFЦЦ‘1:№уL“њЈЅЈ`[ЗиVЪЛ..Џ–‚iР=чsŸs"Nкt"’vіКkЏГьНqчю§„”ЗЂJlАпƒ­М/+6Ы1oч$›Z8ХЮ)Є|M:@8иnˆЎЊDЛo3CtŽџTџƒ5™PcМm@~р†?*y`ŒSNјЁЂx М3з€ш—bŠ­•вB v[)Jџбюі[JAтEwЯљ9sšдPуХ^рХdfОoцћВчœ]Кw9%QI(RKZl–хtЬ›§ŽрIвuУЛ†сaжі#Љ-в†Д`ял№8Х7џ(kм|ЎѓsїуTл|CЖы‡nYuбѕo"2MЫFWq Еb:#пSБ˜MЩk_f.g„SвТ щ#€К&њJЌж,ХЛА’—3mDlД ЯЖЁауЯKkЦЎКљŽqѕЪІuu%еКе`їDEbvњКГбŠ(Pђ]/цVГУЖЅ.Yсtgž? њƒднЛduJє™j“nCedЈ…№вГxCиёcV=УчcхрUvCС{1/ЪF0Km<ЧНaOъз5d^ч ЊЛ0hN„…ЪРHFŒ,еЁБˆr;Юы‹Hˆ†r2ƒткkНрUЃ}С/ЉџцOОѕй&њ:ш_B}lШ6, žђh~уы1ЭSиEdъFxKwКИƒПєЏ ;–vЮФфмв“zуOЁ­и‚#FжЭљџ`К{—ЌЮ‰>S%ЧзаŸ‚Рё7№'o0ЧzчFpЋйѕе!ŒЎ`x хžbк[TчЗсЕЅaL-УЉЭN$˜сЌЙPёѕщwœAтGє+…5~’СыШIENDЎB`‚classified-ads-0.13/images/win/textunder.png000066400000000000000000000016131331670245300211070ustar00rootroot00000000000000‰PNG  IHDRрw=јRIDATxкЕ•kH“QЧ-LЛаE4QS*%!Ы[™™зBЉД щœ]ЌLM‚‘QTД9M‰Р0ъKЂ}iXПDvQ”šгPSSчЅUгMsšZPЎо/œўn–ГщЛ ?xwЮџœп{žу{ŽcьП2ѓАћX;‚ЗVPЩ_y ЕYЩJЛЅ [ёЌ}l№'cDџ$cкяŒщLџж|сј˜ЃзUvvvЫMy%Е™ѓцAѓ„Й"Eжaж ЂФђ“+FKUУ?ЊPВЇ&шљFyлјўŒЂnџшtF'Ыѓъ_“;‚U`-XЗкХk;&(мБ_R-Юэ!%ЗЧ?&Е§гфРСъFf`)’ ўнЈwЪєh"“Ў}иyш‚6dпЙ Иt}Pь™)‚у2uјЯљ)’ѕсˆWЧЭяВљдуV"Д“Т1Ё gAA ŽщfP?<ЪD§&6‚ѕРИ'Аи[nђon8ќЎТ 2IENDЎB`‚classified-ads-0.13/images/win/zoomin.png000066400000000000000000000021731331670245300204020ustar00rootroot00000000000000‰PNG  IHDRрw=јBIDATxкХVL[e}6С0 ФЁŒdщЦJ 8+t*Z7\Ё„06ƒŽ­ЫЦШК5 Х‚Ж"ћЅ˜щj+&RЄ ЭpЅвu­vmi„˜-*‹2fџАлЎїš—ˆбЩт—œОМзwяљОsЯy-џ*ў?<R…BЁ“JЅЧx<оЫx}ЁBШIо=рБE,зЦFFFЎzНолсpјЎлэОaЕZ§ƒС–––Іg‰ю_‰шяšЫkkkпБлэP(.— КЛЛСd2Aoo/LOOƒЯчГй.//яУч‹kИHўВrj>сt~чёxР№JѓЏЅѕ7ЫZODеoY`‡ёЭШо6гO}–ЃИАX­з•JЅыђИHўЄ9ЩB+ЇцеG›n<}фѕ`VG_˜IШ&q0ыђ ГУ<їТЉўйžс K333авв2ЧчѓX/"ЙV"’ц$ ­œšKŽПя*<;ь}vg=<_л Я”щ яќимЃнЃ_д}pСяpOG ИИx ыKqA™Эfѓ‘цJэс„­я9U}і/ѕ§Оƒ]К.Ј6œCsW$ƒO3,žбГнп“T•••aЌo@$"bИіЃ4‹4P™Ўe–IС–ќ:xЎЂЖWНљ/ЕAQ]фVЕ“\Ьњ8:ъёљ§~аjЕ7Бў ЫE`@+о!ЗHšO{˜Ф\X“Ў‚„ЌНАЉ@Т"lмЎ‡8щ~`вw“Z;†ОК ‰ржŸDp˜ššZ$+*^5Эв@™” `6з 4р1„˜Ю5а4О@­VгŽ#RrЈ(Dфsm{зBњ‰СqСЛ_O Ќ?N2B\qZ B"[Ф!ќy№Љё…O,оoЎ‘“0э4ƒЦеv Ѓ„RˆШчЊ3–+ЩЇІІ6œЛ6УЌGЭ$‹„GœY‹6§фМЧ E;;;!33sыwЏ6ƒ$Š?%”œб3<ЖЄщџ,кsљs&Љ˜MU@ЛША/иЉљЧџ‹Ус€ТТТЅјјјѓXПm5ё2Š?%”ЖN>'+’[h Є9Щт „Ђд\ГgЯ]Й\~ ы†F„„3іХUDёЇ„Rˆh7dEr ”ˆI|fI&“EВГГЁ4Gpы№ЮЭзБіBД}ЇфQќ)Ё"ђ9Y‘мB%ЭQ–sБББЎќЧ“o7•ЄТлћВ Й*ѓ*Йq9 }p‘ˆиј7А!:ЩZБ‘hю} умКamЄ~ыFhЏCoCДэ~b~9 5х"!ЙтиСёY ІАg>{_‚$— „Dє0Uf@џ9Дkžќd9СJD1d=ђ7…ˆЮьu ћНIF‚Еп6 ЁЋZћ”"?оWџcПЩ,Щ€Rє№|IЦ:j^‡xˆƒроIXэедќ?ћWёIWжЗ”:ћщIENDЎB`‚classified-ads-0.13/images/win/zoomout.png000066400000000000000000000022161331670245300206010ustar00rootroot00000000000000‰PNG  IHDRрw=јUIDATxкХV L[­M0LqѓГЫXiСЭJ;”ЪкИ s@ЩY@ЈЉ3[`8Œclc ‚qЄрч,юЋ˜щFEJ+dRR†FлAKпh]зB3иdQY„%ЦШЦѕ^ѓgцƒdёѓ’г—їк{ЯЛчžг–џ*ў?<–!фЉЉЉ{хrљ;|>џ Мо‰ШC(ЫќЛ"РcD")жщt­учf0œw:7ЬfГЏЌЌЬЇe‰ю]ˆшяš+ѓѓѓ?ВZ­ўссa€њњzаыѕ`0`ppМ^/Ц`NNN#~>Б„‹фŽ'Їцv‡у{†a ьЭЪп2wjgВЋЬЉ?0A–ю§а+є“ІЯчp0™ЭзU*•ы’ЙHўЂ9ЩBONЭЗюЋИёLщ[ФCСЭ ж_ЗДк@гjŸ—2ŽОpЌiЄЁуьДлэ†ЊЊЊQ@ Уz1ЩЕœ4'YшЩЉЙьрЇi';Я;aК}ЬхŠ:uЭ-јlzHа<Ы .ˆО9эSmџу ЯеееT*эХњm‹э`9ХŸJЮhшшž.hњЦл0t.к0юŒjœt‹ZЇёж +5og|Пиl6HKK›ŽŒŒ<ѕыsŸІ јSBitђ9Y‘мB %ЭIxŽšlп>ЏT*gБЎЁCШ8s@`ПИв)ў”P MCV$ЗаB‰˜dСЯL+ŠPRRdЎЮюоМњ:жюBˆ"рГп)ЩJ(…ˆ|NV$ЗаBIs”хTxxј@Ъ“б7+6ХТ‡;Ёђ%щ8Йёvzс"Гё/aCt”Еb9Лаѕї№xŽuQKCХЯЎ€к\ JжТm cЗ“PS.’+‚]œ€Е` {АїeHвЗ!цЁvƒогФCSЉj žњƒфЂ0Вљ›BDgі:Œ}_Œ$ЉТЅWЫгDpxЋ vЈФ>МЏўЧ~“Y’•јСБMёPѓBФwOТjЏІцџйПŠп&Mю(Ь`IENDЎB`‚classified-ads-0.13/log.h000066400000000000000000000026001331670245300152440ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_ADS_LOG_H #define CLASSIFIED_ADS_LOG_H #include #include #ifdef DEBUG #include #define LOG_STR(a) qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss") << a #define LOG_STR2(a,b) { QString str ; qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss") << str.sprintf(a,b) ; } #define QLOG_STR(a) qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss") << a #else #define LOG_STR(a) #define LOG_STR2(a,b) #define QLOG_STR(a) #endif #endif classified-ads-0.13/main.cpp000066400000000000000000000173301331670245300157500ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef WIN32 #include #endif #include "controller.h" #include #include "log.h" #include // for Q_IPV6ADDR #include #include "util/catranslator.h" #include QApplication* app ; /**< The qt application, we need to have 1 instance */ MController* controllerInstanceEx ; /**< Application controller, used in test suite+tcl wrapper */ Controller* controllerInstance ; /**< Application controller, here as static for signal handlers */ /** ipv6 addr with all bits zero, to denote an invalid addr */ Q_IPV6ADDR KNullIpv6Addr ( QHostAddress("::0").toIPv6Address () ) ; /** * Hash with all bits zero, to denote an invalid or non-used hash. * Some lucky dudette will have this generated for her profile fingerprint :) */ Hash KNullHash ; #ifndef WIN32 /** * SIGINT handler is trapped into this function ; * this will try to semi-gracefully terminate the * application */ void sigINThandler(int) { LOG_STR("SIGINT trapped..") ; if ( app != NULL ) { QApplication::quit() ; } } /** * SIGUSR1 handler is trapped into this function ; * lets have that for hiding the UI */ void sigUSR1handler(int) { LOG_STR("SIGUSR1 trapped..") ; if ( controllerInstance != NULL ) { controllerInstance->hideUI() ; } } /** * SIGUSR2 handler is trapped into this function ; * lets have that for showing the hidden UI */ void sigUSR2handler(int) { LOG_STR("SIGUSR2 trapped..") ; if ( controllerInstance != NULL ) { controllerInstance->showUI() ; controllerInstance->checkForSharedMemoryContents() ; } } #endif /** * FZ - in the night of the iron sausage */ int main(int argc, char *argv[]) { KNullHash = Hash() ; #ifdef WIN32 WSADATA wsaData; int nResult = WSAStartup(MAKEWORD(2,2), &wsaData); if(nResult != NO_ERROR) { QLOG_STR( "WSAStartup() failed."); } else { QLOG_STR( "WSAStartup() success"); } #endif #if !(defined(WIN32)||defined(Q_OS_OSX)) #if QT_VERSION >= 0x050000 QString platform ( QGuiApplication::platformName() ) ; bool have_xcb ( platform.compare("xcb") == 0 || platform.length()==0) ; QLOG_STR("Platform: " + QGuiApplication::platformName() + " len = " + QString::number(platform.length())) ; bool have_display ( getenv("DISPLAY") != NULL ) ; bool have_wayland ( getenv("WAYLAND_DISPLAY") != NULL ) ; if ( have_xcb && ( have_display==false && have_wayland==false ) ) { // so, we have "xcb" that is normal linux. and we have no $DISPLAY // nor $WAYLAND_DISPLAY -> this spells some problems.. fprintf(stderr,"No $DISPLAY/WAYLAND_DISPLAY environment variable set, cant continue\n") ; return 0 ; } #endif // qt version #endif // check of $DISPLAY or $WAYLAND_DISPLAY app = new QApplication (argc, argv); #ifdef DEBUG QLoggingCategory::setFilterRules("*.debug=true"); #endif #ifdef WIN32 // In windows it is necessary to tell TCL where // its runtime resides: if ( getenv("TCL_LIBRARY") == NULL ) { // TCL library variable is not set, set: QString tclLib ( "TCL_LIBRARY=" + QCoreApplication::applicationDirPath() + "/tcl8.6") ; QLOG_STR("Setting TCL library to " + tclLib) ; putenv(tclLib.toUtf8().constData()) ; } QString tclLibValue ; if ( getenv("TCLLIBPATH") != NULL ) { char *tclLibEnvValue ( getenv("TCLLIBPATH") ) ; tclLibValue.append(QString ( tclLibEnvValue ) ) ; } if ( tclLibValue.toLower().contains("tk8") == false ) { // tk is not mentioned in library path, put it there if ( tclLibValue.isEmpty() == false ) { tclLibValue.append(" ") ; // separating whitespace } QString tclLibSetCmd ( "TCLLIBPATH=" + tclLibValue + QCoreApplication::applicationDirPath() + "/tk8.6") ; QLOG_STR("Setting TCLLIBPATH to " + tclLibSetCmd) ; putenv(tclLibSetCmd.toUtf8().constData()) ; } #endif CATranslator caTranslator; if ( caTranslator.load( "qt_" + QLocale::system().name()) == false ) { QLOG_STR("Trying translations from " + QLibraryInfo::location(QLibraryInfo::TranslationsPath)) ; if ( caTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)) == true ) { QLOG_STR("Qt translation loaded from " + QLibraryInfo::location(QLibraryInfo::TranslationsPath)) ; } else { #ifndef WIN32 if ( caTranslator.load(QLibraryInfo::location(QLibraryInfo::TranslationsPath) + "/qt_" + QLocale::system().name()) ) { QLOG_STR("Qt translation found from "+QLibraryInfo::location(QLibraryInfo::TranslationsPath) + " using direct file naming") ; } else { QLOG_STR("Qt translation not found") ; } #else QLOG_STR("Qt translation not found") ; #endif } } else { QLOG_STR("Qt translation found from current directory") ; } app->installTranslator(&caTranslator); // controller will actually start launching the application controllerInstance = new Controller(*app) ; controllerInstanceEx = controllerInstance ; #if QT_VERSION < 0x050000 // without this qt4+qjson does not handle utf-8 well ; every // byte in multi-byte unicode-sequences appears as separate // character after the string is parsed back in windows environment. // linux does some magick tricks to not fail due to broken utf-8. QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForCStrings(codec); QTextCodec::setCodecForTr(codec); #endif #ifndef WIN32 signal(SIGINT,sigINThandler); // if user presses CTRL-C signal(SIGHUP,sigINThandler); // if user closed the terminal.. signal(SIGUSR1,sigUSR1handler); signal(SIGUSR2,sigUSR2handler); #endif // check for possible command line arguments relevant to // us: QRegExp rx("^(caprofile|caad|cacomment|cablob)://[a-fA-F0-9]{40}/{0,1}$"); QRegExpValidator validator (rx); for ( int i = 1 ; i < argc ; i++ ) { QString argumentCandidate(argv[i] ); int position ( 0 ) ; if ( validator.validate(argumentCandidate,position) == QValidator::Acceptable ) { QUrl commandLineUrl ( argumentCandidate ) ; QLOG_STR("scheme " + commandLineUrl.scheme() ) ; QLOG_STR("host " + commandLineUrl.host() ) ; controllerInstance->addObjectToOpen(commandLineUrl) ; break ; // out of the loop, process only one } } int retval ( 0 ) ; if ( controllerInstance->init() ) { // 2nd stage of constructor retval = app->exec() ; } QLOG_STR("deleting controller") ; delete controllerInstance ; delete app ; return retval ; } classified-ads-0.13/mcontroller.h000066400000000000000000000235421331670245300170330ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef M_CONTROLLER_H #define M_CONTROLLER_H #include #include "util/hash.h" // Hash #include "datamodel/netrequestexecutor.h" #include "datamodel/cadbrecord.h" // for CaDbRecord::SearchTerms #define CLASSIFIED_ADS_VERSION "0.13" class Node ; class Model ; class NetworkListener ; class NetworkConnectorEngine ; class NetworkRequestExecutor; class BinaryFile ; class VoiceCallEngine ; class MVoiceCallEngine ; class TclWrapper ; class QWidget ; /** * @brief Pure-virtual interface class for controller. * This is spammed * across parties needing access to application controller. * Reason for this interface is that for testing purposes we can * replace real controller with a dummy mock-up */ class MController : public QObject { Q_OBJECT public: /** * Enumeration for different errors that may occur within this * app. Class controller is supposed to handle these and may * be signaled an error */ enum CAErrorSituation { OwnCertNotFound, /**< Does not have own cert and can't generate */ DataBaseNotMountable, /**< corrupt database or permission? */ BadPassword, /**< Could not open encryption keys with given pwd */ DbTransactionError, /**< something went foul with db */ ContentEncryptionError, /**< something went foul with content encryption interface */ FileOperationError, /**< Error related to binary files */ TCLEvalError /**< Error related to TCL evaluation */ } ; /** * Enumeration for different user-interface actions that * controller tries to route */ enum CAUserInterfaceRequest { ViewProfileDetails, /**< User wants to view details of profile */ ViewCa, /**< User wants to view classified ad */ ViewProfileComment, /**< User wants to view profile comment */ DisplayProgressDialog, /**< puts wait dialog on screen */ VoiceCallToNode /**< User wants voice call to remote node */ } ; /** * Method that starts actions regarding content fetch from * network * @param aReq specifies the content,at least iRequestType and * iRequestedItem need to be there * @param aIsBackgroundDl is true if the retrieval may be * queued into background as a low-priority item * @param aTypeOfExpectedObject What kind of object is expected, * possible values include ClassifiedAd, BinaryBlob and UserProfile * from @ref ProtocolItemType. */ virtual void startRetrievingContent(NetworkRequestExecutor::NetworkRequestQueueItem aReq, bool aIsBackgroundDl, ProtocolItemType aTypeOfExpectedObject ) = 0 ; /** * Variant of "start fetch" method that starts fetch of db records. * @param aSearchTerms Database query that fetched record should * satisfy */ virtual void startRetrievingContent( CaDbRecord::SearchTerms aSearchTerms ) = 0 ; /** * Method for requesting different things to take place in UI. * controller mostly routes these to FrontWidget but other actions * may be in order too.. * @param aRequest users orders * @param aHashConcerned possible hash parameter ; can be * null hash if action is not about specific hash * @param aFetchFromNode possible node hash parameter ; if * concerning item is not found from local storage, * try to fetch it from given node ; is KNullHash, * then just do fetch using normal algorithm. * @param aAdditionalInformation possible explanation or other info * @return none */ virtual void userInterfaceAction ( CAUserInterfaceRequest aRequest, const Hash& aHashConcerned = KNullHash, const Hash& aFetchFromNode = KNullHash, const QString* aAdditionalInformation = NULL ) = 0 ; virtual void hideUI() = 0 ; /** * method for showing UI */ virtual void showUI() = 0 ; /** * method selecting user profile in use. */ virtual void setProfileInUse(const Hash& aProfileHash) = 0 ; /** * method getting user profile in use. */ virtual const Hash& profileInUse() = 0 ; /** * method for setting passwd used to open private content encryption * rsa key. this password is stored in controller * and is then used by content-open/sign-operations when crypto lib * asks for password. */ virtual void setContentKeyPasswd(QString aPasswd) = 0 ; /** * method for getting passwd of private content keys previously set, see method * @ref Controller::setContentKeyPasswd */ virtual QString contentKeyPasswd() const = 0; public slots: virtual void exitApp() = 0 ; /**< quitting */ virtual void displayAboutBox() = 0 ; /**< bragging */ virtual void displayFront() = 0 ; /**< this initializes the "normal" display */ /** * Method for handling errors inside application. * @param aError Reason for error call, from error enum above * @param aExplanation NULL or human-readable description about what went * wrong. */ virtual void handleError(MController::CAErrorSituation aError, const QString& aExplanation) = 0 ; /** * Method for node ; this may be changed during startup-phase * but not after that */ virtual Node& getNode() const = 0 ; /** * method for network listener ; it is parent of all connections, * also the outgoing */ virtual NetworkListener *networkListener() const = 0 ; /** * method for getting datamodel */ virtual Model &model() const = 0 ; /** * method for storing private data of profile currently in use * * @param aPublishTrustListToo if set to true, has selected profiles * trust list to be updated profile data and profile published * with the new trust list. */ virtual void storePrivateDataOfSelectedProfile(bool aPublishTrustListToo = false ) = 0 ; /** * method for restoring private data of profile currently in use. * shall be called after new profile is selected in frontwidget. */ virtual void reStorePrivateDataOfSelectedProfile() = 0 ; /** * method for checking if contact is in contact list */ virtual bool isContactInContactList(const Hash& aFingerPrint) const = 0; virtual QString displayableNameForProfile(const Hash& aProfileFingerPrint) const = 0 ; virtual void offerDisplayNameForProfile(const Hash& aProfileFingerPrint, const QString& aDisplayName, const bool iUpdatePersistenStorage=false) = 0 ; /** * method that puts dialog or similar on display, about a published file */ virtual void displayFileInfoOnUi(const BinaryFile& aFileMetadata) = 0 ; /** * Method for getting voice call engine. If there is no engine * prior to call, one will be constructed * @return engine instance */ virtual VoiceCallEngine* voiceCallEngine() = 0 ; /** * Method for getting voice call engine interface. If there is no engine * prior to call, one will be constructed. The instance is the same * that is returned via @ref voiceCallEngine method. * * @return engine instance, possibly a mock-up for testing purposes */ virtual MVoiceCallEngine* voiceCallEngineInterface() = 0 ; /** * Method for getting tcl wrapper instance. If there is no instance * one will be created */ virtual TclWrapper &tclWrapper() = 0 ; /** * Method for getting front-widget, to be used as parent of dialogs * spawned from non-ui threads */ virtual QWidget *frontWidget() = 0 ; /** * Method for getting file name. Method displays file selection * dialog and returns the selected file. Idea of this method is * that it may be called from background threads and it will * display the dialog in UI thread, then report results back. * This is a blocking method that will suspend execution of the * calling thread for the duration while user is doing the selection. * * @param aSuccess is set to true if operation ends all right. * @param aIsSaveFile if set to true, "file save" dialog is * shown, otherwise "file open" dialog. * @param aSuggestedFileName file name (pattern). If given empty, * any file is suggested in dialog, if "*.jpg" is given, then * dialog shall suggest only files with .jpg ending and * if "foobar.txt" is given, then dialog will suggest literal * file name "foobar.txt". * @return file system file name or empty if aSuccess is set to false. */ virtual QString getFileName(bool& aSuccess, bool aIsSaveFile = false , QString aSuggestedFileName = QString()) = 0 ; } ; #endif classified-ads-0.13/net/000077500000000000000000000000001331670245300151025ustar00rootroot00000000000000classified-ads-0.13/net/connection.cpp000066400000000000000000001070031331670245300177460ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef WIN32 #define NOMINMAX #include #endif #include "connection.h" #include "../log.h" #include #include "../datamodel/model.h" #ifndef WIN32 #include "arpa/inet.h" #endif #include #include #include #include "../datamodel/profilemodel.h" #include "../datamodel/camodel.h" #include "../datamodel/binaryfilemodel.h" #include "../datamodel/privmsgmodel.h" #include "../datamodel/profilecommentmodel.h" #include "../datamodel/cadbrecordmodel.h" #include #include #include /** nat subnet. see similar variable in node.cpp */ static const QPair normalNats1 ( QHostAddress::parseSubnet("10.0.0.0/8") ); static const QPair normalNats2 ( QHostAddress::parseSubnet("172.16.0.0/20")); static const QPair normalNats3 ( QHostAddress::parseSubnet("192.168.0.0/16") ); /** non-routable address space that some ISP's seem to offer */ static const QPair rfc6598 ( QHostAddress::parseSubnet("100.64.0.0/10") ); Connection::Connection (const QHostAddress& aAddr, const int aPort, ConnectionObserver& aObserver, Model& aModel, MController& aController, const Hash& aFpOfNodeToTry) : iNeedsToRun(true), iTimeOfLastActivity(QDateTime::currentDateTimeUtc().toTime_t()), iNumberOfPacketsReceived(0), iConnectionState(Initial), iObserver(aObserver) , iModel(aModel), iBytesExpectedInPacketBeingRead (0), iBytesInPacketBeingRead (0), iBytesRead(NULL), iInvocationsSinceLastByteReceived(0), iNodeOfConnectedPeer(NULL), iAddrToConnect(aAddr), iPortToConnect(aPort), iSocketDescriptor(-1) , iSocketIsIncoming(false), iController(aController), iFpOfNodeWeTrying( aFpOfNodeToTry), iStageOfBucketFill( OwnNodeGreeting ), iTimeOfBucketFill(QDateTime::currentDateTimeUtc().toTime_t()), iSocketOpenTime(QDateTime::currentDateTimeUtc().toTime_t()), iBytesIn(0), iBytesOut(0), iPeerAddress(aAddr), iSleepBetweenSendOperations(500), iReadMutex(QMutex::NonRecursive), iIsAlreadyReading(false) { LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Connection::Connection outgoing") ; } Connection::Connection(int aSocketDescriptor, ConnectionObserver& aObserver, Model &aModel, MController& aController) : iNeedsToRun(true), iTimeOfLastActivity(QDateTime::currentDateTimeUtc().toTime_t()), iNumberOfPacketsReceived(0), iConnectionState(Initial), iObserver(aObserver) , iModel(aModel), iBytesExpectedInPacketBeingRead (0), iBytesInPacketBeingRead (0), iBytesRead(NULL), iInvocationsSinceLastByteReceived(0), iNodeOfConnectedPeer(NULL), iPortToConnect(-1), iSocketDescriptor(aSocketDescriptor), iSocketIsIncoming(true), iController(aController), iStageOfBucketFill( OwnNodeGreeting ), iTimeOfBucketFill(QDateTime::currentDateTimeUtc().toTime_t() ), iSocketOpenTime(QDateTime::currentDateTimeUtc().toTime_t()), iBytesIn(0), iBytesOut(0), iSleepBetweenSendOperations(500), iReadMutex(QMutex::NonRecursive), iIsAlreadyReading(false) { LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Connection::Connection incoming") ; } Connection::~Connection () { iModel.lock() ; LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Connection::~Connection") ; // here note that we have member variable iSocket that is a pointer. // iSocket is a automatic variable of the run() method and // iSocket just points to that ; iSocket naturally will be // deleted when context of run() goes out of scope. if ( iNextProtocolItemToSend.size() ) { for ( int i = iNextProtocolItemToSend.size()-1 ; i >= 0 ; i-- ) { QByteArray* item = iNextProtocolItemToSend.value(i) ; delete item ; iNextProtocolItemToSend.removeAt(i) ; } } if ( iNodeOfConnectedPeer ) { delete iNodeOfConnectedPeer ; iNodeOfConnectedPeer = NULL ; } if ( iBytesRead ) { delete iBytesRead ; iBytesRead = NULL ; } iSocket = NULL ; iModel.unlock() ; } void Connection::run() { LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Connection::run") ; connect(this, SIGNAL(finished()), this, SLOT(aboutToFinish())) ; iBytesRead = new QByteArray() ; iBytesRead->clear() ; if ( iSocketIsIncoming ) { runForIncomingConnections() ; } else { runForOutgoingConnections() ; } if ( iConnectionState == Initial || iConnectionState == Open ) { iConnectionState = Closing ; } iObserver.connectionClosed(this) ; // will call datamodel.lock() inside LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Connection::run out " + QString::number((qulonglong)(QThread::currentThreadId()))) ; emit finished() ; delete iNodeOfConnectedPeer ; iNodeOfConnectedPeer = NULL ; delete iBytesRead ; iBytesRead = NULL ; iSocket = NULL ; // iSocket was automatic variable inside scope // of runForIncomingConnections/runForOutgoingConnections // and it is no more -> set to NULL to prevent accidental access } void Connection::runForIncomingConnections() { QSslSocket sock ; iSocket = &sock ; // when this method goes out of // scope, iSocket must be set to NULL if (iSocket->setSocketDescriptor(iSocketDescriptor)) { setupSocketSignals() ; // the idea here with model.lock is that // this class instance here is owned by datamodel // and datamodel may frobnicate our internals so // if we touch any part of this class that is somehow // visible to outside, we must first lock(), then // release(). Frobnication of private parts that // are guaranteed to not have a get()ter method // or anything should be ok, and of course the // automatic variables. if ( iModel.lock() == false ) { iSocket->close() ; return ; } iSocket->setLocalCertificate(iModel.nodeModel().nodeCert()); iSocket->setPrivateKey(iModel.nodeModel().nodeKey()); iModel.unlock() ; iSocket->startServerEncryption(); } else { LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"iSocket->setSocketDescriptor failed?????") ; iSocket->close() ; return ; } iSocket->setSocketOption(QAbstractSocket::LowDelayOption,1) ; // immediate send for ( int i = 0 ; iConnectionState == Initial ; i++ ) { msleep(1000) ; QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents) ; if ( i > 10 ) { // 10 seconds passed and connection state not changed iSocket->abort() ; iNeedsToRun = false ; return ; } } // ok, obviously we can receive, mark that down for future // advertisement: iModel.lock() ; iController.getNode().setIpAddrWithChecks(iSocket->localAddress()) ; iModel.unlock() ; // ok, we came here, we have SSL handshake done ; lets // instantiate some data structures.. Hash fingerPrintOfPeer (iSocket->peerCertificate()) ; iPeerHash = fingerPrintOfPeer ; // it also may be so that connection was attempted to a particular // node - is it possible that we managed to connect other node // than that? if ( iFpOfNodeWeTrying != KNullHash ) { // if other than null hash if ( iFpOfNodeWeTrying != fingerPrintOfPeer) { iSocket->disconnectFromHost() ; iNeedsToRun = false ; // this causes readloop to return immediately } } if ( iController.getNode().nodeFingerPrint() == fingerPrintOfPeer ) { // damn, connected to self.. emit blackListNetworkAddr(iSocket->peerAddress()) ; if ( iSocketIsIncoming == false ) { emit blackListNetworkAddr(iAddrToConnect) ; } iSocket->disconnectFromHost() ; iNeedsToRun = false ; // this causes readloop to return immediately LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Connection::run incoming connected to self") ; } iNodeOfConnectedPeer= new Node(fingerPrintOfPeer, -1) ; // lets here do so that lets not frobnicate any instance // variables ; let the iSocket be only one and that in // turn will be frobnicated only from here. // if we need to send something, we ask datamodel for // stuff to send, take it into local variable here // and do our sending. this way we can manage with // single mutex in model and things will be in sync. readLoop() ; iModel.lock() ; iConnectionState = Connection::Closing ; iModel.connectionStateChanged(Connection::Closing, this) ; iModel.unlock() ; if ( iNeedsToRun == false && iSocket && iSocket->state() == QAbstractSocket::ConnectedState ) { iSocket->close() ; } if ( iSocket ) { iSocket->waitForDisconnected(10*1000) ; } LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Connection::run(incoming) out") ; } void Connection::socketReady() { LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) + "Connection::socketReady auth " + iSocket->sessionCipher().authenticationMethod() + " keyEx " + iSocket->sessionCipher().keyExchangeMethod() + " encryption " + iSocket->sessionCipher().encryptionMethod() + " bits " + QString::number(iSocket->sessionCipher().usedBits())) ; iModel.lock() ; iConnectionState = Open ; iModel.connectionStateChanged(iConnectionState, this) ; iPeerAddress = iSocket->peerAddress() ; iPeerHash = Hash( iSocket->peerCertificate() ); if ( iPeerAddress == iSocket->localAddress() ) { QLOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) + "Connected to self, addr = " + iSocket->peerAddress().toString()) ; // oh great, broadcast? // connected to self iNeedsToRun = false ; iSocket->close() ; return ; } iModel.unlock() ; } void Connection::runForOutgoingConnections () { LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Connection::runForOutgoingConnections in") ; iModel.lock() ; iModel.connectionStateChanged(Connection::Initial , this) ; iModel.unlock() ; QSslSocket sock ; iSocket = &sock ; setupSocketSignals() ; // the idea here with model.lock is that // this class instance here is owned by datamodel // and datamodel may frobnicate our internals so // if we touch any part of this class that is somehow // visible to outside, we must first lock(), then // release(). Frobnication of private parts that // are guaranteed to not have a get()ter method // or anything should be ok, and of course the // automatic variables. if ( iModel.lock() == false ) { return ; } iSocket->setSocketOption(QAbstractSocket::LowDelayOption,1) ; // immediate send iSocket->setLocalCertificate(iModel.nodeModel().nodeCert()); iSocket->setPrivateKey(iModel.nodeModel().nodeKey()); iModel.unlock() ; iSocket->setPeerVerifyMode(QSslSocket::QueryPeer) ; QLOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Connecting to " + iAddrToConnect.toString() + " port " + QString::number(iPortToConnect) ) ; iSocket->connectToHostEncrypted(iAddrToConnect.toString(), iPortToConnect); for ( int i = 0 ; iConnectionState == Initial ; i++ ) { QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents) ; msleep(1000) ; if ( i > 10 ) { // 10 seconds passed and connection state not changed iSocket->abort() ; iNeedsToRun = false ; QLOG_STR("Connection attempt to " + iAddrToConnect.toString() + " timed out") ; QLOG_STR("Connection attempt to " + iFpOfNodeWeTrying.toString() + " timed out") ; emit connectionAttemptFailed(iFpOfNodeWeTrying) ; // then don't try again immediately return ; } } if ( iSocket->peerAddress() == iSocket->localAddress() ) { QLOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Connected to self, addr = " + iSocket->peerAddress().toString()) ; // oh great, broadcast? // connected to self iNeedsToRun = false ; iSocket->close() ; return ; } Hash fingerPrintOfPeer (iSocket->peerCertificate()) ; iPeerHash = fingerPrintOfPeer ; // it also may be so that connection was attempted to a particular // node - is it possible that we managed to connect other node // than that? if ( iFpOfNodeWeTrying != KNullHash ) { // if other than null hash if ( iFpOfNodeWeTrying != fingerPrintOfPeer ) { iSocket->abort() ; iNeedsToRun = false ; // this causes readloop to return immediately } } if ( iController.getNode().nodeFingerPrint() == fingerPrintOfPeer ) { // damn, connected to self.. emit blackListNetworkAddr(iSocket->peerAddress()) ; if ( iSocketIsIncoming == false ) { emit blackListNetworkAddr(iAddrToConnect) ; } iSocket->disconnectFromHost() ; iNeedsToRun = false ; // this causes readloop to return immediately LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Connection::run outgoing connected to self") ; } iNodeOfConnectedPeer= new Node(fingerPrintOfPeer, -1) ; // we just managed to connect, mark that thing down for // future advertisement iModel.lock() ; iNodeOfConnectedPeer->setCanReceiveIncoming(true) ; iController.getNode().setIpAddrWithChecks(iSocket->localAddress()) ; iModel.unlock() ; readLoop() ; if ( iNeedsToRun == false && iSocket && iSocket->state() == QAbstractSocket::ConnectedState ) { iSocket->close() ; } if ( iSocket ) { iSocket->waitForDisconnected(30*1000) ; } iSocket = NULL ; LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Connection::run (outgoing )out") ; } // this is called from run() method when there is data available void Connection::performRead() { iReadMutex.lock() ; if ( iIsAlreadyReading ) { iReadMutex.unlock() ; QLOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +" was already reading") ; return ; } iIsAlreadyReading = true ; iReadMutex.unlock() ; quint64 bytesAvail (0) ; while ( ( bytesAvail = iSocket->bytesAvailable() ) > 0 ) { if ( iBytesExpectedInPacketBeingRead == 0 && bytesAvail < sizeof(quint32) ) { msleep(50) ; // size not yet received, wait for 50 ms } if ( iBytesExpectedInPacketBeingRead == 0 && iBytesRead->size() == 0 && // only if not in middle of packet bytesAvail >= (quint64) sizeof(quint32) ) { // we're not reading a packet yet, read packet quint32 bytesExpectedNetworkByteOrder = 0 ; if ( iSocket->read((char *)&bytesExpectedNetworkByteOrder, sizeof(quint32)) != sizeof(quint32)) { iNeedsToRun = false ; iModel.lock() ; iModel.connectionStateChanged(Connection::Closing, this) ; iModel.unlock() ; iSocket->abort() ; QLOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +" performread out abort") ; iReadMutex.lock() ; iIsAlreadyReading = false ; iReadMutex.unlock() ; return ; } else { iBytesIn += sizeof(quint32) ; bytesAvail = iSocket->bytesAvailable() ; } iBytesExpectedInPacketBeingRead = ntohl ( bytesExpectedNetworkByteOrder); iBytesInPacketBeingRead = 0 ; QLOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +" Connection::performRead expecting bytes= "+ QString::number( iBytesExpectedInPacketBeingRead)) ; QLOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +" Connection::performRead bytes alread = "+ QString::number( iBytesRead->size() )) ; } if ( iBytesExpectedInPacketBeingRead > 0 && iBytesExpectedInPacketBeingRead > iBytesInPacketBeingRead && bytesAvail > 0 ) { if ( bytesAvail > iBytesExpectedInPacketBeingRead ) { bytesAvail = ( iBytesExpectedInPacketBeingRead - iBytesInPacketBeingRead ); } QByteArray bytesReadThisTime ( iSocket->read(bytesAvail) ) ; if ( bytesReadThisTime.size() > 0 ) { iBytesRead->append(bytesReadThisTime) ; iBytesIn += bytesReadThisTime.size() ; iBytesInPacketBeingRead += bytesReadThisTime.size() ; iInvocationsSinceLastByteReceived = 0 ; // seems like we received something: iTimeOfLastActivity = QDateTime::currentDateTimeUtc().toTime_t() ; } } if ( iBytesExpectedInPacketBeingRead == iBytesInPacketBeingRead) { // if we came here, we have one total packet.. if ( iObserver.dataReceived(*iBytesRead, *this) == false ) { QLOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"### Closing due to unparseable data, peer = " + peerAddress().toString()) ; iSocket->abort() ; iNeedsToRun = false ; } else { QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents) ; } iBytesExpectedInPacketBeingRead = 0 ; iBytesRead->clear() ; iInvocationsSinceLastByteReceived = 0 ; iNumberOfPacketsReceived++ ; } } iReadMutex.lock() ; iIsAlreadyReading = false ; iReadMutex.unlock() ; QLOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +" performread out") ; } bool Connection::Ipv6AddressesEqual(const Q_IPV6ADDR& aAddr1, const Q_IPV6ADDR& aAddr2) { for ( int i = 0 ; i < 16 ; i++ ) { if ( aAddr1.c[i] != aAddr2.c[i]) return false ; } return true ; } // practically this is more like write-loop because actual // reading and writing is done in SLOT()s that are connected // to read+write events. void Connection::readLoop() { connect(iSocket, SIGNAL(readyRead ()), this, SLOT(readyRead ())); iObserver.connectionReady(this) ; // before starting to read, inform the observer QByteArray *itemToSend = NULL ; while ( iNeedsToRun && iSocket->state() == QAbstractSocket::ConnectedState ) { iModel.lock() ; checkForBucketFill() ; int numberOfQueueItems = iSendQueue.size() ; iModel.unlock() ; if ( numberOfQueueItems > 0 ) { msleep( 10 ) ; } else { msleep( iSleepBetweenSendOperations ) ; } QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents) ; // we came here because we have no bytes to read from // sock. first check if we do have read operation pending if ( iBytesExpectedInPacketBeingRead > 0 && iBytesExpectedInPacketBeingRead > (quint64)(iBytesRead->size())) { iInvocationsSinceLastByteReceived++ ; // gets incremented every 500ms } if ( iInvocationsSinceLastByteReceived > 1000 ) { // we have had read operation pending for 500 seconds and // not a single byte has got through -> give up if ( iNeedsToRun ) { iModel.lock() ; LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Read operation was pending too long, closing") ; iConnectionState = Connection::Closing ; iModel.connectionStateChanged(Connection::Closing, this) ; iModel.unlock() ; iSocket->abort() ; iNeedsToRun = false ; LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Giving up pending read operation after 500 seconds"); } break ; } // ok, then try write operation, if applicable if ( iNeedsToRun && iSocket->bytesToWrite() == 0 ) { iModel.lock() ; itemToSend = iModel.nodeModel().getNextItemToSend(*this) ; if ( itemToSend != NULL ) { QLOG_STR("Got " + QString::number(itemToSend->size()) + " bytes to send, items in q = " + QString::number(iSendQueue.size())) ; iSleepBetweenSendOperations = 30 ; // we got item to send, next time sleep only 30ms } else { iSleepBetweenSendOperations = 500 ; // queue empty, sleep 500 ms } iModel.unlock() ; } // now we own itemToSend if ( itemToSend != NULL && iSocket != NULL && iSocket->state() == QAbstractSocket::ConnectedState ) { quint32 bytesInPayload = itemToSend->size() ; quint32 bytesInPayloadNetworkOrder = htonl(bytesInPayload) ; QByteArray messageSizeBytes ; messageSizeBytes.append((const char *)&bytesInPayloadNetworkOrder, sizeof(quint32)) ; if ( iSocket->write(messageSizeBytes) != sizeof(quint32) ) { LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Write operation did not succeed, closing..") ; if ( iNeedsToRun ) { iModel.lock() ; iConnectionState = Connection::Closing ; iModel.connectionStateChanged(Connection::Closing, this) ; iModel.unlock() ; } iSocket->abort() ; iNeedsToRun = false ; } else { iBytesOut += sizeof(quint32) ; } if ( iSocket->write(*itemToSend) != itemToSend->size() ) { LOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Write operation did not succeed, closing..") ; if ( iNeedsToRun ) { iModel.lock() ; iConnectionState = Connection::Closing ; iModel.connectionStateChanged(Connection::Closing, this) ; iModel.unlock() ; } iSocket->abort() ; iNeedsToRun = false ; } else { iBytesOut += itemToSend->size() ; } // ok ; how long to wait for write. // very slow network here. have 100 connected clients. // say, upload rate is 20kb/s, divided by 100 clients // we get 204 bytes per sec. .. but at least 30 seconds. delete itemToSend ; itemToSend = NULL ; // seems like we sent something: iTimeOfLastActivity = QDateTime::currentDateTimeUtc().toTime_t() ; flushSocket() ; } } if ( iNeedsToRun && iSocket ) { QLOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"Readloop out, addr = " + peerAddress().toString()) ; } } // reason for this implementation here is that when connection // is about to get deleted, there has been SIGSEGV's in calls // iSocket->peerAddress() ; indication of a locking problem // or similar, the socket is already partly torn down. // have the peer address here as normal variable and avoid the // dangerous call: QHostAddress Connection::peerAddress() const { return iPeerAddress ; } const Hash& Connection::fingerPrintOfNodeAttempted() { return iFpOfNodeWeTrying ; } bool Connection::isInPrivateAddrSpace() const { bool retval = false ; if ( iSocket ) { QHostAddress peer ( iSocket->peerAddress() ) ; if ( peer.protocol() == QAbstractSocket::IPv4Protocol ) { if ( peer.isInSubnet(normalNats1) || peer.isInSubnet(normalNats2) || peer.isInSubnet(normalNats3) || peer.isInSubnet(rfc6598)) retval = true ; } } return retval ; } void Connection::checkForBucketFill() { if ( iTimeOfBucketFill+15 < QDateTime::currentDateTimeUtc().toTime_t() && iNextProtocolItemToSend.size() == 0 && iSendQueue.size() == 0 && iSocket && iNumberOfPacketsReceived > 1 && iNodeOfConnectedPeer ) { // we've been connected for 15 seconds now and there is nothing in queue. switch ( iStageOfBucketFill ) { case OwnNodeGreeting: // initial stage. first queue possible private messages iEndOfBucket = iModel.nodeModel().bucketEndHash(iNodeOfConnectedPeer->nodeFingerPrint()) ; // here put private messages into queue iModel.privateMessageModel().fillBucket(iSendQueue, iNodeOfConnectedPeer->nodeFingerPrint(), iEndOfBucket, iNodeOfConnectedPeer->lastMutualConnectTime(), iNodeOfConnectedPeer->nodeFingerPrint() ) ; iStageOfBucketFill = PrivateMessage ; // and set next stage break ; case PrivateMessage: // Next stage after private messages iModel.profileModel().fillBucket(iSendQueue, iNodeOfConnectedPeer->nodeFingerPrint(), iEndOfBucket, iNodeOfConnectedPeer->lastMutualConnectTime(), iNodeOfConnectedPeer->nodeFingerPrint() ) ; iStageOfBucketFill = UserProfile; // and set next stage break ; case UserProfile: // Next stage after user profile changes. Note that // last mutual connect time is set in protocol parser // as a side-effect of parsing the initial node greeting iModel.classifiedAdsModel().fillBucket(iSendQueue, iNodeOfConnectedPeer->nodeFingerPrint(), iEndOfBucket, iNodeOfConnectedPeer->lastMutualConnectTime(), iNodeOfConnectedPeer->nodeFingerPrint() ) ; iStageOfBucketFill = ClassifiedAd; // and set next stage break ; case ClassifiedAd: // Next stage after classified ads iModel.binaryFileModel().fillBucket(iSendQueue, iNodeOfConnectedPeer->nodeFingerPrint(), iEndOfBucket, iNodeOfConnectedPeer->lastMutualConnectTime(), iNodeOfConnectedPeer->nodeFingerPrint()) ; iStageOfBucketFill = BinaryBlob; // and set next stage break ; case BinaryBlob: // Next stage after binary blob iModel.profileCommentModel().fillBucket(iSendQueue, iNodeOfConnectedPeer->nodeFingerPrint(), iEndOfBucket, iNodeOfConnectedPeer->lastMutualConnectTime(), iNodeOfConnectedPeer->nodeFingerPrint()) ; iStageOfBucketFill = DbRecord; // next stage distributed database records break ; case DbRecord: // Next stage after binary blob iModel.caDbRecordModel()->fillBucket(iSendQueue, iNodeOfConnectedPeer->nodeFingerPrint(), iEndOfBucket, iNodeOfConnectedPeer->lastMutualConnectTime(), iNodeOfConnectedPeer->nodeFingerPrint()) ; iStageOfBucketFill = UserProfileComment; // and set next stage break ; case UserProfileComment: // we came here, we've sent profiles, ads and binary files profile comments and // distributed database records and the queue is empty: // set mutual connect time of the node // so we won't send the same stuff again next time: iNodeOfConnectedPeer->setLastMutualConnectTime(QDateTime::currentDateTimeUtc().toTime_t()) ; iModel.nodeModel().updateNodeLastMutualConnectTimeInDb(iNodeOfConnectedPeer->nodeFingerPrint(), iNodeOfConnectedPeer->lastMutualConnectTime()) ; iStageOfBucketFill = ClassifiedAd2NdAddr; // and set final stage break ; case ClassifiedAd2NdAddr: // this is our final stage if ( ( iTimeOfBucketFill + (60*iMinutesBetweenBucketFill )) < QDateTime::currentDateTimeUtc().toTime_t() ) { // iMinutesBetweenBucketFill minutes passed since last bucket fill: re-do iTimeOfBucketFill = QDateTime::currentDateTimeUtc().toTime_t() ; iStageOfBucketFill = OwnNodeGreeting; } break ; default: // finally do no thing break ; } } } Hash Connection::getPeerHash() const { if ( iPeerHash != KNullHash ) { return iPeerHash ; } else { if ( iConnectionState == Connection::Open && iSocket ) { return Hash( iSocket->peerCertificate() ) ; } else { // this may be KNullHash but for some outgoing connections // this is anyway known already when socket is not // yet in connected state. return iFpOfNodeWeTrying ; } } } bool Connection::forciblyCloseSocket() { iNeedsToRun = false ; iFpOfNodeWeTrying = KNullHash ; return true ; } void Connection::flushSocket() { // setting TCP_NODELAY has side-effect of flushing the socket. // at least in linux. if ( iSocket ) { iSocket->flush() ; QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents) ; iSocket->setSocketOption(QAbstractSocket::LowDelayOption,0) ; iSocket->setSocketOption(QAbstractSocket::LowDelayOption,1) ; QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents) ; } } // Connected from QSslSocket. Called when bytes have been written void Connection::encryptedBytesWritten ( qint64 #ifdef DEBUG written #endif ) { QLOG_STR("Connection::encryptedBytesWritten " + QString::number(written)); } // Connected from QSslSocket. Called on handshake errors void Connection::sslErrors ( const QList & errors ) { QLOG_STR("Connection::sslErrors") ; foreach ( const QSslError& e , errors ) { switch ( e.error() ) { case QSslError::NoError: case QSslError::CertificateExpired: case QSslError::InvalidNotBeforeField: case QSslError::InvalidNotAfterField: case QSslError::SelfSignedCertificate: case QSslError::SelfSignedCertificateInChain: case QSslError::UnableToVerifyFirstCertificate: case QSslError::CertificateRevoked: case QSslError::InvalidCaCertificate: case QSslError::CertificateUntrusted: case QSslError::SubjectIssuerMismatch: case QSslError::AuthorityIssuerSerialNumberMismatch: case QSslError::HostNameMismatch: case QSslError::InvalidPurpose: QLOG_STR("Ssl error ignored: " + e.errorString()) ; break ; case QSslError::UnableToGetIssuerCertificate: case QSslError::UnableToDecryptCertificateSignature: case QSslError::UnableToDecodeIssuerPublicKey: case QSslError::CertificateSignatureFailed: case QSslError::CertificateNotYetValid: case QSslError::UnableToGetLocalIssuerCertificate: case QSslError::PathLengthExceeded: case QSslError::CertificateRejected: case QSslError::NoPeerCertificate: case QSslError::UnspecifiedError: case QSslError::NoSslSupport: case QSslError::CertificateBlacklisted: QLOG_STR("Ssl error detected: " + e.errorString()) ; iNeedsToRun = false ; break ; } } } // Connected from QSslSocket::error. Called on error void Connection::socketError ( QAbstractSocket::SocketError #ifdef DEBUG socketError #endif ) { iNeedsToRun = false ; QLOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) + "Connection::socketError "+ QString::number(socketError)) ; if ( iSocketIsIncoming == false && // this is outgoing iFpOfNodeWeTrying != KNullHash && // and we know who we tried to reach iConnectionState == Connection::Initial // and didn't get past initial stage ) { emit connectionAttemptFailed(iFpOfNodeWeTrying) ; // then don't try again immediately } else { QLOG_STR("No emit") ; } } // Connected from QSslSocket. Called on close void Connection::disconnected () { iNeedsToRun = false ; QLOG_STR(QString("0x%1 ").arg((qulonglong)this, 8) +"disconnected") ; } // Connected from QSslSocket. Called when bytes are available void Connection::readyRead () { performRead() ; } void Connection::setupSocketSignals() { connect(iSocket, SIGNAL(encrypted()), this, SLOT(socketReady())); connect(iSocket, SIGNAL(encryptedBytesWritten ( qint64 )), this, SLOT(encryptedBytesWritten ( qint64 ))); connect(iSocket, SIGNAL(sslErrors ( const QList & )), this, SLOT(sslErrors ( const QList & ))); connect(iSocket, SIGNAL(error ( QAbstractSocket::SocketError )), this, SLOT(socketError ( QAbstractSocket::SocketError ))); connect(iSocket, SIGNAL(disconnected ()), this, SLOT(disconnected ())); // note that readyread signal is connected when // readloop is entered } void Connection::msleep(int aMilliSeconds) { QWaitCondition waitCondition; QMutex mutex; QThread::yieldCurrentThread (); mutex.lock() ; // waitCondition needs a mutex initially locked waitCondition.wait(&mutex, aMilliSeconds);// give other threads a chance.. mutex.unlock() ; } // slot that contains cleanup related to thread termination void Connection::aboutToFinish() { QLOG_STR("Connection cleanup for thread " + QString::number((qulonglong)(QThread::currentThreadId())) ) ; iModel.lock() ; iModel.threadTerminationCleanup( QThread::currentThread() ) ; iModel.unlock() ; QLOG_STR("Connection cleanup out for thread " + QString::number((qulonglong)(QThread::currentThreadId())) ) ; } classified-ads-0.13/net/connection.h000066400000000000000000000344061331670245300174210ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CONNECTION_H #define CONNECTION_H #include // for SocketError #include // for ipv6 addr type #include #include "protocol.h" #include "node.h" class QSslSocket ; class QByteArray ; class MController ; class Model ; class QSslError ; /** * @brief Class that represents a network connection. * * At runtime * we'll have 1-n of these. This is a base-class that allows us * to do some operations like "send", "receive" without needing * to know if we're having a socket conn or some other kind. */ class Connection : public QObject { Q_OBJECT public: /** Enumeration of the connection states */ enum ConnectionState { Initial, /**< SYN packet sent */ Open, /**< SSL handshake was success, peerCert is avail */ Closing, /**< Disconnection has been asked */ Error /**< Connection itself reports an error */ }; /** * @brief Interface for receiving network traffic. * * class that must be implemented by animals that wish to receive * data from connection */ class ConnectionObserver { public: /** method for sending data received */ virtual bool dataReceived(const QByteArray& aData, Connection& aConnection ) = 0 ; /** method for communicating fact that connection ends */ virtual void connectionClosed(Connection *aDeletee) = 0 ; /** method for communicating fact that connection is open for * business */ virtual void connectionReady(Connection *aBusinessEntity) = 0 ; } ; /** * Constructor to use when incoming connection */ Connection(int aSocketDescriptor, ConnectionObserver& aObserver, Model& aModel, MController& aController); /** * Constructor. Class will initiate connetion to * given addr. * @param aAddr network address to try * @param aPort port in said addr * @param aObserver class wishing to receive status updates about this * connection * @param aModel datamodel reference * @param aController application controller reference * @param aFpOfNodeToTry sometimes we need to connect some particular * node ; hash of the attempted host may be given here. It is * not used by connection itself but the observers may query it * in case of failed connection of the connection was * attempted to some particular node. In particular this logic * is used by publishing engine that needs to know not only * successful connections but also failed ones and for failed * ones we don't get node FP via normal mechanism (node greeting) */ Connection(const QHostAddress& aAddr, const int aPort, ConnectionObserver &aObserver, Model& aModel, MController& aController, const Hash& aFpOfNodeToTry ) ; /** * Method for tearing down a connection */ ~Connection() ; /** * helper method for comparing ipv6 addresses */ static bool Ipv6AddressesEqual(const Q_IPV6ADDR& aAddr1, const Q_IPV6ADDR& aAddr2) ; /** * getter method for node of this connection. value * may be null if connection is still in early stage * so non-nulliness must be tested * @param none * @return node of connection or NULL if handshake still pending. * ownership is NOT transferred, it is not ok to delete * the returned pointer. */ Node* node() const { return iNodeOfConnectedPeer ; } /** * for testing purposes only: this should never be called * in production setup. this does get called from test-code */ void setNode(Node* aNode) { iNodeOfConnectedPeer = aNode ; } /** * method for getting peer addr */ QHostAddress peerAddress() const ; /** * method for getting the hash this connection was * trying to attempt .. if connection was originally * asked to be to some particular node, this will * return hash of the node ; if connection was to * no particular node, a zero hash will be returned */ const Hash& fingerPrintOfNodeAttempted() ; /** * getter method for connection state */ ConnectionState connectionState() const { return iConnectionState; } /** * Method for getting the bucket fill stage. See explanation * at documentation of the variable @ref Connection::iStageOfBucketFill * for idea how this should be used */ ProtocolItemType stageOfBucketFill() const { return iStageOfBucketFill ; } /** * Method for setting bucket fill stage. See also @ref stageOfBucketFill. */ void setStageOfBucketFill(ProtocolItemType aStage) { iStageOfBucketFill = aStage ; } /** * method for getting information if connection is inbound */ bool isInbound() const { return iSocketIsIncoming ; } ; /** * method for getting open time of connection */ time_t getOpenTime() const { return iSocketOpenTime ; } ; /** * method for getting peering node fingerprint. * if connection is not yet open, returns KNullHash */ Hash getPeerHash() const ; /** * returs data transfer amount */ unsigned long bytesIn() const { return iBytesIn ; } /** * returns data transfer amount */ unsigned long bytesOut() const { return iBytesOut ; } /** * Forcibly closes socket. * @return true if socket was still allocated and its "abort" method * got called. */ bool forciblyCloseSocket() ; /** * method for checking if connection is in private (non-routable) ipv4-addr * space like 192.168.. network */ bool isInPrivateAddrSpace() const ; public slots: /** * Called when socket is encrypted and ready to transmit */ void socketReady() ; /** * this class is a kind of a thread, we need to have run ; note * that right now QThread is not inherited but * our worker-method is still named run, called * by thread when it is started ( from networklistener or * networkconnectorengine) */ void run() ; /** * Connected from QSslSocket. Called when bytes have been written */ void encryptedBytesWritten ( qint64 written ) ; /** * Connected from QSslSocket. Called on handshake errors */ void sslErrors ( const QList & errors ) ; /** * Connected from QSslSocket::error. Called on error */ void socketError ( QAbstractSocket::SocketError socketError ) ; /** * Connected from QSslSocket. Called on close */ void disconnected () ; /** * Connected from QSslSocket. Called when bytes are available */ void readyRead () ; /** * Slot called at thread finish. Contains cleanup operations. */ void aboutToFinish() ; signals: void error(QTcpSocket::SocketError socketError); void finished() ; void blackListNetworkAddr(QHostAddress aAddr) ; /** Emitted when outgoing connectio fails. Used for keeping count on * nodes not to try immediately again */ void connectionAttemptFailed(const Hash& aNodeHash) ; protected: void performRead() ; void readLoop() ; /**< called from run() */ /** * 2 versions of run, called from run(),first for incoming connections */ void runForIncomingConnections() ; /** * 2 versions of run, called from run(),then for outgoing connections */ void runForOutgoingConnections() ; /** * method for keeping buckets filled. this checks if we have * content that according to its network addr should belong * to that peer ; and then adds it to send queue */ void checkForBucketFill() ; /** * method that tries to flush pending output, if platform supports */ void flushSocket() ; /** * method that sets up signals/slots of socket */ void setupSocketSignals() ; public:// these are public because datamodel access these, via lock() /** * many things going on inside classified ads are about * the connected node ; when node is disconnected, we may * forget about many things that may have been in progress. * therefore it may make sense to store also the queue * of things to send in here ; when connection goes away, * so goes the queue and no further processing needed. * * The order of things in this list is significant, * the first item to be append()ed should be sent first. */ QList iSendQueue ; /** * This is the next item to send. This does not include the length. * .. as protocol items over socket are sent so that length goes * first, as uint32, followed by that many bytes. This QByteArray * contains the bytes, not the uint32 that goes first. Reason is * that this is wanted this way is that the class doing the * sending to be aware of the length, forcing this way it to * calculate it itself. */ QList iNextProtocolItemToSend ; public: bool iNeedsToRun ; /**< if set to false, connection closes itself */ time_t iTimeOfLastActivity ; /**< last time there was any traffic with peer */ unsigned iNumberOfPacketsReceived ; /**< nr of received complete protocol packets*/ /** * how often peers are queried for new content to send/receive ; this is also * max permitted lenght for data transmission inactivity ; nodes that have been * idle longer than this are considered "dead" */ static const unsigned iMinutesBetweenBucketFill = 30 ; protected: // these are not public void msleep(int aMilliSeconds) ; /**< stops execution for some time */ ConnectionState iConnectionState /**< closed/open etc. */ ; /** received data is sent to @ref ConnectionObserver */ ConnectionObserver &iObserver ; /** socket for data transfer: the actual socket is owned by * stack frame of the thread so even tough we have * this pointer here, it may not be deleted */ QSslSocket *iSocket ; Model& iModel ; /**< datamodel reference */ /** when starting to receive packet from peer, length is stored here */ quint32 iBytesExpectedInPacketBeingRead ; /** when receiving packet from peer, length is stored here */ quint32 iBytesInPacketBeingRead ; /** when reading packet from peer, this contains bytes being read */ QByteArray *iBytesRead ; /** * this variable here is used as counter during pending read * of data packet, zeroed every time bytes are received ; * if it reaches high number (a sign of stalled download) do * drop connection to that peer */ int iInvocationsSinceLastByteReceived; /** * node-data-structure of the connected node */ Node *iNodeOfConnectedPeer ; /** network address to connect, if connection is outgoing connection */ QHostAddress iAddrToConnect ; /** port to connect, if connection is outgoing connection */ const int iPortToConnect ; /** descriptor of already-connected socket if connection is incoming-connection */ const int iSocketDescriptor ; /** true if incoming socket */ const bool iSocketIsIncoming ; /** application controller reference */ MController& iController ; /** It may be that connection is asked to specific node, in addition * to being into some known network address. If the node is known, * store the target node fingerprintin here. This is used at least * in wishlist-connections where the connection itself will * signal its open-for-business state when connection to asked * node is ready */ Hash iFpOfNodeWeTrying ; /** * method of handling around network churn is implemented in * several places. .. churn requires us to copy stuff * beloging to NodesAroundHash ( see nodemodel ) to nodes * that are in the same bucket with us. Our concept of bucket * is a bit stretched but there is kind of bucket and we will * send of over new data to nodes that we think belongs * to the bucket of connecting node. * * sending the data happens in several stages, connection itself * stores the stage here. filling the bucket according to * stage then happens in @ref NodeModel::getNextItemToSend method */ ProtocolItemType iStageOfBucketFill ; /** * time of last bucket fill */ quint32 iTimeOfBucketFill ; /** * Where our bucket ends. Our own node fp is the start of the bucket, * here is the end */ Hash iEndOfBucket ; /** time of socket open */ const time_t iSocketOpenTime ; /** transferred data amount */ unsigned long iBytesIn ; /** transferred data amount */ unsigned long iBytesOut ; /** storage for peeraddress */ QHostAddress iPeerAddress ; /** * indication if write operation has been started but is * not yet complete */ int iBytesPendingWrite ; /** * How many milliseconds to sleep between send operations */ int iSleepBetweenSendOperations ; /** * hash of peering node */ Hash iPeerHash; /** * Mutex for read operation */ QMutex iReadMutex ; /** * flag for read operation in progress */ bool iIsAlreadyReading ; } ; #endif classified-ads-0.13/net/dbretrievalengine.cpp000066400000000000000000000220361331670245300213020ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "dbretrievalengine.h" #include "../log.h" #include "../controller.h" #include "../datamodel/model.h" #include "node.h" #include "connection.h" #include "protocol_message_formatter.h" /** * How often to repeat query to connected nodes to keep db up-to-date */ static const int KNetworkQueryRepeatIntervalSeconds ( 15 * 60 ) ; DbRecordRetrievalEngine::DbRecordRetrievalEngine(Controller* aController, Model& aModel) : QTimer(aController), iController(aController), iModel(aModel), iNowRunning(false) { LOG_STR("DbRecordRetrievalEngine::DbRecordRetrievalEngine") ; connect(this, SIGNAL(timeout()), this, SLOT(run())); } DbRecordRetrievalEngine::~DbRecordRetrievalEngine() { LOG_STR("DbRecordRetrievalEngine::~DbRecordRetrievalEngine out") ; } // very simple algorithm here: for each newly-connected node // send every query that we have in stock. query.iListOfNodes contains // book-keeping about nodes that already have been sent the // query that is kept in query.iTerms. void DbRecordRetrievalEngine::run() { if ( iNowRunning == false ) { iNowRunning = true ; iModel.lock() ; if ( iSearchTerms.size() > 0 && iNodesSuccessfullyConnected.size() > 0 ) { // spam each connected node with all searches that we have pending: for ( int i = iSearchTerms.size()-1 ; i >= 0 ; i-- ) { DlQueueItem& query ( iSearchTerms[i] ) ; foreach ( const Hash& connectedNode, iNodesSuccessfullyConnected ) { if ( query.iListOfNodes.contains(connectedNode) == false ) { sendQueryToNode(query.iTerms, connectedNode) ; query.iListOfNodes.append(connectedNode) ; query.iTimeOfLastRefresh = QDateTime::currentDateTimeUtc() ; } } } } // if ( iSearchTerms.size() > 0 ) iNodesSuccessfullyConnected.clear() ; // 2nd stage: if there are queries where iTimeOfLastRefresh // is long time ago, repeat the queries for ( int i = iSearchTerms.size()-1 ; i >= 0 ; i-- ) { DlQueueItem& query ( iSearchTerms[i] ) ; QDateTime currentTime ( QDateTime::currentDateTimeUtc() ) ; QLOG_STR("Repeating db query because time is up") ; if ( query.iTimeOfLastRefresh.secsTo(currentTime) > KNetworkQueryRepeatIntervalSeconds ) { // query needs to be repeated foreach ( const Hash& connectedNode, query.iListOfNodes) { if ( iModel.nodeModel().isNodeAlreadyConnected(connectedNode) ) { sendQueryToNode(query.iTerms, connectedNode) ; } } query.iTimeOfLastRefresh = QDateTime::currentDateTimeUtc() ; } } iModel.unlock() ; iNowRunning = false ; } } void DbRecordRetrievalEngine::nodeConnectionAttemptStatus(Connection::ConnectionState aStatus, const Hash aHashOfAttemptedNode ) { LOG_STR2("DbRecordRetrievalEngine::nodeConnectionAttemptStatus %d in", aStatus) ; LOG_STR2("DbRecordRetrievalEngine::nodeConnectionAttemptStatus %s ", qPrintable(aHashOfAttemptedNode.toString())) ; // use model to lock our own resources too.. iModel.lock() ; for ( int i = 0 ; i < iNodeCandidatesToTryQuery.size() ; i++ ) { if ( iNodeCandidatesToTryQuery[i] == aHashOfAttemptedNode ) { if ( aStatus == Connection::Open ) { if ( ! iNodesSuccessfullyConnected.contains(aHashOfAttemptedNode) ) { iNodesSuccessfullyConnected.append(aHashOfAttemptedNode) ; } } else { if ( ! iNodesFailurefullyConnected.contains(aHashOfAttemptedNode) ) { iNodesFailurefullyConnected.append(aHashOfAttemptedNode) ; } } break ; } } iModel.unlock() ; // so just add the hash into 1 of our internal arrays, run() will pick up // the items from list and try to do something clever } // note that this method is called via datamodel and lock is // already on during this call -> do not try (un)locking // for 2nd time. void DbRecordRetrievalEngine::startRetrieving(CaDbRecord::SearchTerms aSearchTerms) { if ( aSearchTerms.iFromCollection == KNullHash ) { return ; // can't search from unspecified collection } // lets see if our search conditions are already included // in at least one query already found from queue. // -> spamming the network with smaller query makes no // sense if broader query is already underway foreach ( const DlQueueItem& oldQuery, iSearchTerms) { if ( aSearchTerms < oldQuery.iTerms ) { return ; // proceed no further } } DlQueueItem dlQueueItem ; dlQueueItem.iTerms = aSearchTerms ; dlQueueItem.iTimeOfLastRefresh = QDateTime::currentDateTimeUtc() ; // as new content is added, add also candidate nodes to connection // wishlist: QList* nodesToTry = iModel.nodeModel().getNodesAfterHash(aSearchTerms.iFromCollection, 20, // 20 nodes 300 ) ;// at most 5 hours old if ( nodesToTry ) { while ( ! nodesToTry->isEmpty() ) { Node* connectCandidate ( nodesToTry->takeFirst() ) ; // here it is possible that node is already // connected, in which case send query straight away // and don't put node into connection wishlist if ( iModel.nodeModel().isNodeAlreadyConnected (*connectCandidate) ) { sendQueryToNode(aSearchTerms, connectCandidate->nodeFingerPrint()) ; // mark this node to list of nodes already spammed with this query: dlQueueItem.iListOfNodes.append(connectCandidate->nodeFingerPrint()) ; delete connectCandidate ; } else { // node was not already connected, put it into wishlist iNodeCandidatesToTryQuery.append(connectCandidate->nodeFingerPrint()) ; iModel.nodeModel().addNodeToConnectionWishList(connectCandidate) ; } } delete nodesToTry; } iSearchTerms.append(dlQueueItem) ; } void DbRecordRetrievalEngine::stopRetrieving() { iModel.lock() ; iSearchTerms.clear() ; iNodeCandidatesToTryQuery.clear() ; iNodesSuccessfullyConnected.clear() ; iNodesFailurefullyConnected.clear() ; iModel.unlock() ; } void DbRecordRetrievalEngine::notifyOfContentReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfReceivedContent ) { if ( aTypeOfReceivedContent == DbRecord ) { iModel.lock() ; for ( int i = iSearchTerms.size()-1 ; i >= 0 ; i-- ) { if ( iSearchTerms[i].iTerms.iById == aHashOfContent ) { iSearchTerms.removeAt(i) ; } } iModel.unlock() ; } } // when this is called, datamodel must be locked void DbRecordRetrievalEngine::sendQueryToNode(const CaDbRecord::SearchTerms& aSearchTerms, const Hash& aNodeFingerPrint) { const QList & openConnections = iModel.getConnections() ; foreach ( Connection* c, openConnections ) { if ( c->connectionState() == Connection::Open) { const Node* n = c->node() ; if ( n && n->nodeFingerPrint() == aNodeFingerPrint ) { QByteArray* serializedSearch = new QByteArray() ; serializedSearch->append( ProtocolMessageFormatter::dbSearchTerms(aSearchTerms)) ; if ( serializedSearch->size() > 0 ) { c->iNextProtocolItemToSend.append(serializedSearch) ; } else { delete serializedSearch ; } return ; } } } } classified-ads-0.13/net/dbretrievalengine.h000066400000000000000000000111521331670245300207440ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef DB_RECORD_RETRIEVAL_ENG_H #define DB_RECORD_RETRIEVAL_ENG_H #include #include #include "connection.h" // for ConnectionObserver #include "../controller.h" #include "../datamodel/model.h" #include "../datamodel/cadbrecord.h" /** * @brief Network-connection logic relating fetching db records from DHT * * Special retrieval logic for records of distributed db records only. * See also @ref RetrievalEngine that is used to fetch classified ads * or binary files. @ref RetrievalEngine is limited to fetching one * item at time, with db records we may have multiple collections open * at the same time and it may be necessary to fetch from all of those, * and at the same time honouring possible search terms that user * may have given. * * Method @startRetrieving is called via controller due to users activity * usually inside TCL program. If conditions are met, this class locates * nodes in the network that store the desired collection and repeates * the query to those nodes in hope to retrieve more records matching the * query. */ class DbRecordRetrievalEngine : public QTimer { Q_OBJECT public: /** * Constructor * @param aController application controller. not owned. * @param aModel persistent storage. */ DbRecordRetrievalEngine(Controller* aController, Model& aModel ) ; /** * Destructor */ ~DbRecordRetrievalEngine() ; /** * command-interface for this class: start to do work * @param aSearchTerms specifies the database records to dl. */ void startRetrieving( CaDbRecord::SearchTerms aSearchTerms ) ; public slots: /** * Command-interface for this class: cancel all ongoing retrievals. * This gets connected to "finished" signal of the tcl interpreter: * when program stops, it makes no more sense to serve it with * db requests. */ void stopRetrieving( ) ; /** * when content is received, we may want to check if it * was the content we were waiting for. this method * is for performing that check */ void notifyOfContentReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfReceivedContent ); /** * when connection is attempted, @ref NetworkListener will * emit the status (failed or success) of the connection, * emitted signal is connected here */ void nodeConnectionAttemptStatus(Connection::ConnectionState aStatus, const Hash aHashOfAttemptedNode ); /** * this class is a not a thread, but QTimer, thus run. */ void run(); private: // methods void sendQueryToNode(const CaDbRecord::SearchTerms& aSearchTerms, const Hash& aNodeFingerPrint) ; private: // data Controller* iController ; /**< application controller */ Model &iModel ; /**< persistent storage */ bool iNowRunning ; QList iNodeCandidatesToTryQuery ; QList iNodesSuccessfullyConnected ; QList iNodesFailurefullyConnected ; /** Type definition for download queue items. See @ref iSearchTerms */ typedef struct DlQueueItemStruct { /** search conditions */ CaDbRecord::SearchTerms iTerms ; /** nodes that have been sent the conditions */ QList iListOfNodes ; /** last time when any node on iListOfNodes got query */ QDateTime iTimeOfLastRefresh ; } DlQueueItem ; /** * List of records to try retrieve. In pair inside the list * the "first" item is actual search condidtions, * second is list of node fingerprints that have already * received the search query ; so it won't be sent again */ QList iSearchTerms ; } ; #endif classified-ads-0.13/net/mvoicecallengine.h000066400000000000000000000135031331670245300205610ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VOICECALL_ENG_INTERFACE_H #define VOICECALL_ENG_INTERFACE_H #include class Hash ; class VoiceCall ; /** * @brief Pure-virtual interface for voice call engine * * This is interface to @ref VoiceCallEngine class. This has methods * that public is supposed to access to create and control calls. */ class MVoiceCallEngine { public: /** * Enum for different voice call states */ enum CallState { Initial, /**< Call initiated */ Incoming, /**< Call received, acceptance by user expected */ Open, /**< Handshake done, audio open */ Closing, /**< Disconnection has been asked */ Closed, /**< "normal" final state, after this the call is no more */ Error, /**< Connection itself reports an error */ NoCall /**< Engine may report that there is no call */ }; /** * Observer for call status for tracking changes in * @ref VoiceCallEngine::CallState */ class MCallStatusObserver { public: /** * Method that communicates changes in call state */ virtual void callStatusChanged(quint32 aCallId, CallState aState) = 0 ; } ; /** * Enum for different payload types inside voicecall RT-stream */ enum PayloadType { Audio=1, /**< Audio data */ Control=2 /**< Call control data */ } ; /** * Data transfer object for call data */ class CallData { public: quint32 iCallId ; /**< identifer for the stream */ quint32 iSeqNo ; /**< running number for packets in stream */ quint32 iTimeStamp ; /**< milliseconds since start of the stream */ PayloadType iPayloadType ; /**< What is inside @ref iPayload */ QByteArray iPayload ; /**< Actual data */ } ; /** * Method for installing call state observer */ virtual void installObserver(MCallStatusObserver* aObserver) = 0 ; /** * Method for removing call state observer */ virtual void removeObserver(MCallStatusObserver* aObserver) = 0 ; /** * Method for reception of call real-time data. This is called * from network-parts that receive the data packet over some * protocol and then feed it here to make it heard. * * Called from protocol parser. Parser does not lock datamodel * prior to call. * * @param aCallId is call ( stream ) identifier * @param aSeqNo is sequence number of rt data in stream * @param aPayloadType tells what kind of payload it is * @param aPayload actual bytes * @param aSendingNode node what sent the data package */ virtual void insertCallData(quint32 aCallId, quint32 aSeqNo, PayloadType aPayloadType, const QByteArray& aPayload, Hash& aSendingNode) = 0 ; /** * Method for reception of call status data. This is called * from network-parts that receive the data packet over some * protocol and then feed it here to move the call engine * to some direction * * Note that the call data inserted via this method may be * call that this node originally made and at the receiving * end this same method is used to inject the new incoming * call into the engine. * * Another note to take into consideration is the handling * if node-data in aCallStatus. Call status is passed as reference * so the ownership of the call data object instance is not * tranferred into voice call engine. Inside call data there * are 2 pointers to originating and destination nodes. * Ownership of content of those pointers is not tranferred * either. VoiceCallEngine will make local copies (if it sees * that necessary) of the node-pointer contents and caller of * this method will be responsible for deleting the node-objects * in call-data if they were created only for the purpose of * making a voice call. * * DataModel.lock() should be called before calling this method * * @param aCallStatus contains information about a call. * @param aSendingNode is fingerprint of the node where the DTO is * coming from. May be local node also. */ virtual void insertCallStatusData(const VoiceCall& aCallStatus, const Hash& aSendingNode) = 0 ; /** * method for getting identifiers of ongoing calls */ virtual QList onGoingCalls() const = 0 ; /** * method for getting status of a call */ virtual CallState callStatus(quint32 aCallId) const = 0 ; /** * Method called as result UI-action. This terminates ongoing call. */ virtual void closeCall(quint32 aCallId) = 0 ; /** * Method called as result UI-action. This accpets an incoming call. */ virtual void acceptCall(quint32 aCallId) = 0 ; } ; #endif classified-ads-0.13/net/networkconnectorengine.cpp000066400000000000000000000673441331670245300224160ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef WIN32 #define NOMINMAX #include #endif #include "networkconnectorengine.h" #include "../log.h" #include "../controller.h" #include "../datamodel/model.h" #include "node.h" #include "connection.h" #include "networklistener.h" #include #include #ifdef WIN32 #else #include "arpa/inet.h" #endif #include "../datamodel/profilemodel.h" #include "../net/protocol_message_formatter.h" #include // DNS lookups NetworkConnectorEngine::NetworkConnectorEngine(Controller *aController, Model *aModel, Connection::ConnectionObserver& aObserver) : QThread(aController), iNeedsToRun(true), iController(aController), iModel(aModel), iConnectionObserver(aObserver), iBroadCastSocket(NULL), iTimeOfLastBroadCast(0), iTimeOfLastMsgPoll(0), iTimeOfLastMsgPollForProfile (0) { } NetworkConnectorEngine::~NetworkConnectorEngine() { QLOG_STR("NetworkConnectorEngine::~NetworkConnectorEngine in/out") ; } void NetworkConnectorEngine::run() { LOG_STR("NetworkConnectorEngine::run in") ; time_t timeOfLastNodeListUpdate (0) ; int connectedCount = 0 ; // initially must be, later ask datamodel // subscribe to cleanup activities connect(this, SIGNAL(finished()), this, SLOT(aboutToFinish())) ; if ( iBroadCastSocket == NULL ) { iBroadCastSocket = new QUdpSocket() ; } while (iNeedsToRun ) { sendBroadCast() ; createConnectionsToNodesStoringPrivateMessages() ; if ( tryServeWishListItem() == false ) { // if there is nothing in wishlist, do "normal procedure" // every 350 seconds if ( timeOfLastNodeListUpdate+50 < QDateTime::currentDateTimeUtc().toTime_t() ) { updateListOfNodesToConnect() ; timeOfLastNodeListUpdate = QDateTime::currentDateTimeUtc().toTime_t() ; } if ( connectedCount < KMaxOpenConnections ) { // so, lets start with list above .. if ( iAddressesInOrderToConnect.size() > 0 ) { MNodeModelProtocolInterface::HostConnectQueueItem connectionItem = iAddressesInOrderToConnect.at(0) ; QHostAddress a = connectionItem.iAddress ; int p = connectionItem.iPort ; spawnNewConnection(a,p,connectionItem.iNodeHash) ; iAddressesInOrderToConnect.removeAt(0) ; } } else { // take a break, we have connections.. } // in the end, query open open connections iModel->lock() ; QList currentConnections = iModel->getConnections() ; connectedCount = currentConnections.size() ; iModel->unlock() ; } // looks like we don't get "deleteLater()" signals processed // without this QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents) ; msleep(800) ; } delete iBroadCastSocket ; iBroadCastSocket = NULL ; LOG_STR("NetworkConnectorEngine::run out thread = " + QString::number((qulonglong)(QThread::currentThreadId()))) ; } bool NetworkConnectorEngine::tryServeWishListItem() { const bool hasIpv6 = !Connection::Ipv6AddressesEqual(iController->getNode().ipv6Addr(), KNullIpv6Addr) ; iModel->lock() ; Node* n = iModel->nodeModel().nextConnectionWishListItem() ; iModel->unlock() ; if ( n ) { QHostAddress addrOfNode ; if (n->DNSAddr().length() > 0 && performDNSLookup(&addrOfNode, n->DNSAddr(), hasIpv6 )) { addrOfNode.setAddress(n->DNSAddr()) ; } else { if (!Connection::Ipv6AddressesEqual( n->ipv6Addr(), KNullIpv6Addr ) && // try connect only if we ourselves have ipv6: hasIpv6 ) { addrOfNode.setAddress( n->ipv6Addr() ) ; } else if ( n->ipv4Addr() ) { addrOfNode.setAddress( n->ipv4Addr() ) ; } else { // tor addresses? delete n ; LOG_STR("Connection wishlist-item had no ipv4/ipv6/dns addr") ; return false ; } } iModel->lock() ; for ( int i = 0 ; i < iAddressesInOrderToConnect.size() ; i++ ) { MNodeModelProtocolInterface::HostConnectQueueItem addrFromList = iAddressesInOrderToConnect.at(0) ; if (addrFromList.iAddress == addrOfNode ) { // item is already on our list -> discard delete n ; LOG_STR("Connection wishlist-item was already on list..") ; iModel->unlock() ; return false ; } } iModel->unlock() ; spawnNewConnection(addrOfNode, n->port(), n->nodeFingerPrint()) ; delete n ; return true ; } else { return false ; // nothing on wishlist } } void NetworkConnectorEngine::spawnNewConnection(const QHostAddress& aAddr,const int aPort, const Hash& aHashOfNodeToConnect) { NetworkListener *networkListener = iController->networkListener() ; QThread* t = new QThread(); Connection *c = new Connection(aAddr,aPort, *networkListener, // connection observer *iModel, *iController, aHashOfNodeToConnect); // as "NULL" was passed as parent to new connection, someone // (now datamodel destructor) needs to clean away the open // outgoing connections // datamodel is responsible for deleting outgoing connections, // with special connection state that incoming connections in turn // do not need use iModel->lock() ; // here we have a bug .. if IP addr changes, we'll advertise // our old address for the first peer to connect .. would // need to delay construction of node greeting to the moment // when we're already in connected state and can check // for local address of the socket. iModel->addOpenNetworkConnection(c) ; iModel->unlock() ; connect(t, SIGNAL(started()), c, SLOT(run())); connect(c, SIGNAL(finished()), t, SLOT(quit())) ; connect(t, SIGNAL(finished()), t, SLOT(deleteLater())); // after thread is gone, remove the connection too connect(t, SIGNAL(finished()), c, SLOT(deleteLater())); connect(c, SIGNAL(blackListNetworkAddr(QHostAddress ) ), this, SLOT(blackListNetworkAddr(QHostAddress ) ), Qt::QueuedConnection ) ; connect(c, SIGNAL(connectionAttemptFailed(const Hash&) ), networkListener, SLOT(connectionAttemptFailed(const Hash&) ) ) ; c->moveToThread(t) ; t->start(); LOG_STR("NetworkConnectorEngine::spawnNewConnection out") ; } void NetworkConnectorEngine::threadIsDeleted() { LOG_STR("NetworkConnectorEngine::threadIsDeleted") ; } // // this method decides which nodes we actually connect. // void NetworkConnectorEngine::updateListOfNodesToConnect() { iModel->lock() ; const bool hasIpv6 = !Connection::Ipv6AddressesEqual(iController->getNode().ipv6Addr(), KNullIpv6Addr) ; QList* nodeListFromModel = NULL ; iAddressesInOrderToConnect.clear() ; // first check that nodes around us in hash-ring are connected // on both sides. nodeListFromModel = iModel->nodeModel().getNodesBeforeHash (iController->getNode().nodeFingerPrint(), 5) ; // from above list prune away self and those nodes already connected if ( pruneConnectionProspectList(nodeListFromModel) == false && iModel->getConnections().size() > ( KMaxOpenConnections/2 ) ) { // we did not have connection to neighbor but we had plenty // of connections -> kick one out iModel->nodeModel().closeOldestInactiveConnection() ; } // add remaining addresses to list.. for ( int i = nodeListFromModel->size()-1 ; i>= 0 ; i-- ) { // prefer DNS name over other options, as this is something // that the node operator has manually set ; lets trust the operator if ( nodeListFromModel->value(i)->DNSAddr().length() > 0 ) { QHostAddress a ; if ( performDNSLookup(&a, nodeListFromModel->value(i)->DNSAddr(), hasIpv6 ) ) { MNodeModelProtocolInterface::HostConnectQueueItem p ; p.iAddress = a ; p.iPort = nodeListFromModel->value(i)->port() ; p.iNodeHash = nodeListFromModel->value(i)->nodeFingerPrint() ; if ( !iAddressesInOrderToConnect.contains(p) ) { iAddressesInOrderToConnect.append(p) ; QLOG_STR("Appending addr to connect #3 " + a.toString()) ; } } } else { if ( !Connection::Ipv6AddressesEqual(nodeListFromModel->value(i)->ipv6Addr(), KNullIpv6Addr) && hasIpv6 ) { // both we and the node have ipv6 -> use that QHostAddress a(nodeListFromModel->value(i)->ipv6Addr()) ; MNodeModelProtocolInterface::HostConnectQueueItem p ; p.iAddress = a ; p.iPort = nodeListFromModel->value(i)->port() ; p.iNodeHash = nodeListFromModel->value(i)->nodeFingerPrint() ; if ( !iAddressesInOrderToConnect.contains(p) ) { iAddressesInOrderToConnect.append(p) ; QLOG_STR("Appending addr to connect #1 " + a.toString()) ; } } else { // suppose ipv4 always.. if ( nodeListFromModel->value(i)->ipv4Addr() ) { QHostAddress a(nodeListFromModel->value(i)->ipv4Addr()) ; MNodeModelProtocolInterface::HostConnectQueueItem p ; p.iAddress = a ; p.iPort = nodeListFromModel->value(i)->port() ; p.iNodeHash = nodeListFromModel->value(i)->nodeFingerPrint() ; if ( !iAddressesInOrderToConnect.contains(p) ) { iAddressesInOrderToConnect.append(p) ; QLOG_STR("Appending addr to connect #2 " + a.toString()) ; } } } } // end of "had no DNS name" } for ( int i = nodeListFromModel->size()-1 ; i>= 0 ; i-- ) { delete nodeListFromModel->value(i) ; nodeListFromModel->removeAt(i) ; } delete nodeListFromModel ; nodeListFromModel = NULL ; // then do the same for ring-forward-connections nodeListFromModel = iModel->nodeModel().getNodesAfterHash (iController->getNode().nodeFingerPrint(), 5) ; // from above list prune away self and those nodes already connected if ( pruneConnectionProspectList(nodeListFromModel) == false && iModel->getConnections().size() > ( KMaxOpenConnections/2 ) ) { // we did not have connection to neighbor but we had plenty // of connections -> kick one out iModel->nodeModel().closeOldestInactiveConnection() ; } // add remaining addresses to list.. for ( int i = nodeListFromModel->size()-1 ; i>= 0 ; i-- ) { if ( !Connection::Ipv6AddressesEqual(nodeListFromModel->value(i)->ipv6Addr(), KNullIpv6Addr) && hasIpv6 ) { // both we and the node have ipv6 -> use that QHostAddress a(nodeListFromModel->value(i)->ipv6Addr()) ; MNodeModelProtocolInterface::HostConnectQueueItem p ; p.iAddress = a ; p.iPort = nodeListFromModel->value(i)->port() ; p.iNodeHash = nodeListFromModel->value(i)->nodeFingerPrint() ; if ( !iAddressesInOrderToConnect.contains(p) ) { iAddressesInOrderToConnect.append(p) ; QLOG_STR("Appending addr to connect #3 " + a.toString()) ; } } else { // suppose ipv4 always.. if ( nodeListFromModel->value(i)->ipv4Addr() ) { QHostAddress a(nodeListFromModel->value(i)->ipv4Addr()) ; MNodeModelProtocolInterface::HostConnectQueueItem p ; p.iAddress = a ; p.iPort = nodeListFromModel->value(i)->port() ; p.iNodeHash = nodeListFromModel->value(i)->nodeFingerPrint() ; if ( !iAddressesInOrderToConnect.contains(p) ) { iAddressesInOrderToConnect.append(p) ; QLOG_STR("Appending addr to connect #4 " + a.toString()) ; } } } } for ( int i = nodeListFromModel->size()-1 ; i>= 0 ; i-- ) { delete nodeListFromModel->value(i) ; nodeListFromModel->removeAt(i) ; } delete nodeListFromModel ; nodeListFromModel = NULL ; QList ipAddrList = QNetworkInterface::allAddresses() ; // then get hot addresses .. QList hotaddresses = iModel->nodeModel().getHotAddresses() ; for ( int i = hotaddresses.size()-1 ; i >= 0 ; i-- ) { if ( iAddressesInOrderToConnect.contains(hotaddresses[i]) ) { // was already } else { // check that node is not already connected bool found = false ; Connection* c = NULL ; for ( int j = iModel->getConnections().size()-1 ; j >= 0 ; j-- ) { // and don't connect to already-connected nodes c = iModel->getConnections().value(j) ; if ( c->peerAddress() == hotaddresses.value(i).iAddress ) { found = true ; LOG_STR2("Pruning already connected hot addr index %d", i) ; break ; } else { QLOG_STR("Was not: " + hotaddresses.value(i).iAddress.toString() + " equal to " + c->peerAddress().toString() ) ; } } // check again that our own addr is not among hot addresses: for ( int k = 0 ; k < ipAddrList.size() ; k++ ) { QHostAddress a = ipAddrList[k] ; if ( hotaddresses.value(i).iAddress == a ) { found = true ; QLOG_STR("Pruned from hotlist own network addr " + a.toString()) ; break; } } if ( !found ) { iAddressesInOrderToConnect.append(hotaddresses.value(i)) ; QLOG_STR("Appending addr to connect #5 " + hotaddresses.value(i).iAddress.toString()) ; } } } iModel->unlock() ; } bool NetworkConnectorEngine::pruneConnectionProspectList(QList* aListToPrune ) const { bool retval = false ; const Node* nodeOfConnection = NULL ; QList ipAddrList = QNetworkInterface::allAddresses() ; for ( int i = aListToPrune->size()-1 ; i >= 0 ; i-- ) { // if our own node got included, remove that from list bool prunedAlready = false ; if ( iController->getNode().nodeFingerPrint() == aListToPrune->value(i)->nodeFingerPrint() ) { delete aListToPrune->value(i) ; aListToPrune->removeAt(i) ; } else { // and remove all nodes already connected for ( int j = iModel->getConnections().size()-1 ; j >= 0 ; j-- ) { // and don't connect to already-connected nodes nodeOfConnection = iModel->getConnections().value(j)->node() ; if ( nodeOfConnection && ( nodeOfConnection->nodeFingerPrint() == aListToPrune->value(i)->nodeFingerPrint() ) ) { delete aListToPrune->value(i) ; aListToPrune->removeAt(i) ; retval = true ; prunedAlready= true ; break; // out from j-loop because i to compare against // is not any more } } // and check that no our own addresses are at list: for ( int k = 0 ; !prunedAlready && k < ipAddrList.size() ; k++ ) { QHostAddress a = ipAddrList[k] ; if ( ( a.protocol() == QAbstractSocket::IPv4Protocol && aListToPrune->value(i)->ipv4Addr() > 0 && QHostAddress(aListToPrune->value(i)->ipv4Addr()) == a ) || ( ! Connection::Ipv6AddressesEqual(KNullIpv6Addr, aListToPrune->value(i)->ipv6Addr()) && a.protocol() == QAbstractSocket::IPv6Protocol && QHostAddress(aListToPrune->value(i)->ipv6Addr()) == a ) ) { delete aListToPrune->value(i) ; aListToPrune->removeAt(i) ; retval = true ; QLOG_STR("Pruned own network addr " + a.toString()) ; break; } } } } // check blacklist too: bool prunedAlready = false ; for ( int i = aListToPrune->size()-1 ; i >= 0 ; i-- ) { prunedAlready = false ; if ( aListToPrune->value(i)->ipv4Addr() ) { QHostAddress ip4(aListToPrune->value(i)->ipv4Addr()) ; if ( iAddressBlacklist.contains(ip4) ) { delete aListToPrune->value(i) ; aListToPrune->removeAt(i) ; prunedAlready = true ; QLOG_STR("Pruned due to blacklist " + ip4.toString()) ; } } if ( prunedAlready == false && ( ! Connection::Ipv6AddressesEqual(KNullIpv6Addr, aListToPrune->value(i)->ipv6Addr()) ) ) { QHostAddress ip6(aListToPrune->value(i)->ipv6Addr()) ; if ( iAddressBlacklist.contains(ip6) ) { delete aListToPrune->value(i) ; aListToPrune->removeAt(i) ; prunedAlready = true ; QLOG_STR("Pruned due to blacklist " + ip6.toString()) ; } } } return retval ; } void NetworkConnectorEngine::sendBroadCast() { if ( iTimeOfLastBroadCast + 60 < QDateTime::currentDateTimeUtc().toTime_t()) { QByteArray dataToSend ; dataToSend.append('c') ; dataToSend.append('a') ; bool hasIpv6 = !Connection::Ipv6AddressesEqual(iController->getNode().ipv6Addr(), KNullIpv6Addr) ; if ( hasIpv6 ) { dataToSend.append('6') ; } else { dataToSend.append('4') ; } quint32 nodeHash1NetworkBO ( htonl ( iController->getNode().nodeFingerPrint().iHash160bits[0]) ) ; quint32 nodeHash2NetworkBO ( htonl ( iController->getNode().nodeFingerPrint().iHash160bits[1]) ) ; quint32 nodeHash3NetworkBO ( htonl ( iController->getNode().nodeFingerPrint().iHash160bits[2]) ) ; quint32 nodeHash4NetworkBO ( htonl ( iController->getNode().nodeFingerPrint().iHash160bits[3]) ) ; quint32 nodeHash5NetworkBO ( htonl ( iController->getNode().nodeFingerPrint().iHash160bits[4]) ) ; dataToSend.append((const char *)(&nodeHash1NetworkBO), sizeof(quint32) ) ; dataToSend.append((const char *)(&nodeHash2NetworkBO), sizeof(quint32) ) ; dataToSend.append((const char *)(&nodeHash3NetworkBO), sizeof(quint32) ) ; dataToSend.append((const char *)(&nodeHash4NetworkBO), sizeof(quint32) ) ; dataToSend.append((const char *)(&nodeHash5NetworkBO), sizeof(quint32) ) ; quint32 portNumber ( iController->getNode().port() ) ; if ( portNumber > 0 ) { quint32 portNumberNetworkBO ( htonl ( portNumber ) ) ; dataToSend.append((const char *)(&portNumberNetworkBO), sizeof(quint32) ) ; if ( hasIpv6 ) { // include also our ipv6-addr in broadcase as in ipv6 // case the sender of the UDP packet at the receiving // end is our link-local addr FE:80:.. and it may be // difficult to connect as network interface must be // specified too .. so , include our advertised addr: for ( int i = 0 ; i < 16 ; i++ ) { dataToSend.append(iController->getNode().ipv6Addr().c[i]) ; } } iTimeOfLastBroadCast = QDateTime::currentDateTimeUtc().toTime_t() ; // hmm, send broadcast only over ipv4. there seems to be // some trouble in binding qudpsocket into ipv6 interface // in the receiving end.. iBroadCastSocket->writeDatagram(dataToSend.data(), dataToSend.size(), QHostAddress::Broadcast, KBroadCastAdvertismentPort); } } } void NetworkConnectorEngine::blackListNetworkAddr(QHostAddress aAddr) { iModel->lock() ; if ( iAddressBlacklist.contains(aAddr) == false ) { iAddressBlacklist.append(aAddr) ; } iModel->unlock() ; } void NetworkConnectorEngine::createConnectionsToNodesStoringPrivateMessages() { if ( iPrivateMessagePollWishList.size() == 0 ) { iProfileToPollPrivateMessages = KNullHash ; // no poll in progress } if ( ( iProfileToPollPrivateMessages == KNullHash && (iTimeOfLastMsgPoll + 60) < QDateTime::currentDateTimeUtc().toTime_t()) || ( iProfileToPollPrivateMessages != KNullHash && (iTimeOfLastMsgPoll + 600) < QDateTime::currentDateTimeUtc().toTime_t() ) ) { LOG_STR2("Checking private msg poll, seconds since last = %u " ,(unsigned)( ( QDateTime::currentDateTimeUtc().toTime_t() - iTimeOfLastMsgPoll))) ; iTimeOfLastMsgPoll = QDateTime::currentDateTimeUtc().toTime_t() ; // in here find a profile that we have private keys for and // that has not had its private messages polled for given // time (say, 15 minutes). when such a profile is found, // initiate connections to nodes supposed to contain private // messages destined to profile. iModel->lock() ; iProfileToPollPrivateMessages = iModel->profileModel().profileWithOldestTimeSinceMsgPoll(&iTimeOfLastMsgPollForProfile) ; if ( iProfileToPollPrivateMessages != KNullHash ) { iPrivateMessagePollWishList.clear() ; QLOG_STR("Polling private messages for " + iProfileToPollPrivateMessages.toString()) ; QList* nodeListFromModel = NULL ; // so try get 5 nodes no older than 60 minutes nodeListFromModel = iModel->nodeModel().getNodesAfterHash (iProfileToPollPrivateMessages, 5, 60) ; // then from that list check nodes that are already connected // and send a query to those nodes if ( nodeListFromModel ) { iPrivateMessagePollWishList.clear() ; for ( int i = nodeListFromModel->size()-1 ; i >= 0 ; i -- ) { if ( iModel->nodeModel().isNodeAlreadyConnected(nodeListFromModel->value(i)->nodeFingerPrint() ) ) { sendPrivateMessagesPoll(nodeListFromModel->value(i)->nodeFingerPrint()) ; } else { // put node into wishlist iPrivateMessagePollWishList << nodeListFromModel->value(i)->nodeFingerPrint() ; iModel->nodeModel().addNodeToConnectionWishList(nodeListFromModel->value(i)->nodeFingerPrint()) ; } delete nodeListFromModel->takeAt(i) ; } delete nodeListFromModel ; nodeListFromModel = NULL ; } } iModel->unlock() ; } } void NetworkConnectorEngine::sendPrivateMessagesPoll(const Hash& aNodeFingerPrint) { if ( iProfileToPollPrivateMessages != KNullHash ) { QByteArray* resultBytes = new QByteArray() ; resultBytes->append(ProtocolMessageFormatter::requestForPrivateMessagesForProfile(iProfileToPollPrivateMessages, iTimeOfLastMsgPollForProfile)) ; iModel->addItemToSend(aNodeFingerPrint, resultBytes) ; QByteArray* resultBytes2 = new QByteArray() ; resultBytes2->append(ProtocolMessageFormatter::requestForProfileComments(iProfileToPollPrivateMessages, iTimeOfLastMsgPollForProfile)) ; iModel->addItemToSend(aNodeFingerPrint, resultBytes2) ; iModel->profileModel().setPrivateMessagePollTimeForProfile(QDateTime::currentDateTimeUtc().toTime_t(),iProfileToPollPrivateMessages) ; } return ; } void NetworkConnectorEngine::nodeConnectionAttemptStatus(Connection::ConnectionState aStatus, const Hash aHashOfAttemptedNode ) { iModel->lock() ; if ( iPrivateMessagePollWishList.contains(aHashOfAttemptedNode) ) { if ( aStatus == Connection::Open ) { sendPrivateMessagesPoll(aHashOfAttemptedNode) ; } iPrivateMessagePollWishList.removeAll(aHashOfAttemptedNode) ; } if ( iPrivateMessagePollWishList.size() == 0 ) { iProfileToPollPrivateMessages = KNullHash ; // this profile now done } iModel->unlock() ; } bool NetworkConnectorEngine::performDNSLookup(QHostAddress* aAddressToBeSet, const QString& aFromDnsName, bool aDoWeHaveIpv6 ) { bool isAddressSet = false ; QHostInfo info = QHostInfo::fromName(aFromDnsName) ; if ( info.error() == QHostInfo::NoError ) { bool isAddressSet ( false ) ; // check for ipv6 addr if we have one if ( aDoWeHaveIpv6 ) { foreach ( const QHostAddress& result, info.addresses() ) { if ( result.protocol() == QAbstractSocket::IPv6Protocol ) { isAddressSet = true ; aAddressToBeSet->setAddress(result.toIPv6Address()) ; break ; } } } if ( isAddressSet == false ) { foreach ( const QHostAddress& result, info.addresses() ) { if ( result.protocol() == QAbstractSocket::IPv4Protocol ) { isAddressSet = true ; aAddressToBeSet->setAddress(result.toIPv4Address()) ; break ; } } } } else { QLOG_STR("DNS lookup failure for " + aFromDnsName ) ; } return isAddressSet ; } // slot that contains cleanup related to thread termination void NetworkConnectorEngine::aboutToFinish() { QLOG_STR("NetworkConnectorEngine cleanup for thread " + QString::number((long)(QThread::currentThreadId())) ) ; iModel->lock() ; iModel->threadTerminationCleanup(this) ; iModel->unlock() ; QLOG_STR("NetworkConnectorEngine cleanup out for thread " + QString::number((long)(QThread::currentThreadId())) ) ; } classified-ads-0.13/net/networkconnectorengine.h000066400000000000000000000134711331670245300220530ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef NETWORK_CONNECTOR_ENG_H #define NETWORK_CONNECTOR_ENG_H #include #include #include #include #include "connection.h" // for ConnectionObserver #include "../controller.h" #include "../datamodel/model.h" class ProtocolMessageParser ; /** * @brief Class that will initiate 1 or more network connections. * * This may be notified about situation where network connection * might be in order. * * This will also initiate first connection to seed node, * notifying controller if failed. */ class NetworkConnectorEngine : public QThread { Q_OBJECT public: /** * Constructor */ NetworkConnectorEngine(Controller *aController, Model *aModel, Connection::ConnectionObserver &aObserver) ; /** * Destructor */ ~NetworkConnectorEngine() ; /** * this class is a thread, thus run. * * this method has its own execution context so it won't * hurt the UI or the incoming connections. * * this will ask datamodel for nodes to connect and try to * arrange connections to given nodes, some will succeed * and some then will be less successful. */ void run(); public slots: void threadIsDeleted() ; void blackListNetworkAddr(QHostAddress aAddr) ; void nodeConnectionAttemptStatus(Connection::ConnectionState aStatus, const Hash aHashOfAttemptedNode ); /** * Slot called at thread finish. Contains cleanup operations. */ void aboutToFinish() ; signals: void error(QTcpSocket::SocketError socketError); private: /** internal method for starting a new connection */ void spawnNewConnection(const QHostAddress& aAddr, const int aPort, const Hash& aHashOfNodeToConnect) ; /** method for updating list of nodes to connect */ void updateListOfNodesToConnect() ; /** * prune from list self and nodes already connected. * @param aListToPrune is list of nodes that check * @return this will return true if there were at least one node * that was already connected */ bool pruneConnectionProspectList(QList* aListToPrune) const ; /** * method for sending advertisement about node in ip protocl * broadcast packet */ void sendBroadCast() ; /** * Method for checking if there is anything in datamodels * connection wishlist */ bool tryServeWishListItem() ; /** * method for creating connections to nodes that are supposed to * store private messages destined to profiles whose private * keys we have in this node. This is supposed to work in * conjunction with @PrivMessageModel::fillBucket() that * it will then, in turn, send requests to said nodes about * private messages that we're supposed to receive. */ void createConnectionsToNodesStoringPrivateMessages() ; /** * Sends query (poll) about private messages to given node. * Node must be connected. * This method polls not only private messages but also * profile comments - reason for this is simple: they * have the same bucket so as we're already making * commections to nodes storing private messaeges we'll * find the comments from same bucket. * * Naturally this only helps the profile operator as he'll * this way find his own comments ; for the rest of the * comment-reading crowd a separate mechanism needs to be in * place. */ void sendPrivateMessagesPoll(const Hash& aNodeFingerPrint) ; private: // methods: bool performDNSLookup(QHostAddress* aAddressToBeSet, const QString& aFromDnsName, bool aDoWeHaveIpv6) ; public: bool iNeedsToRun ; private: // data Controller *iController ; Model *iModel ; Connection::ConnectionObserver &iConnectionObserver ; QList iAddressesInOrderToConnect ; QUdpSocket* iBroadCastSocket ; time_t iTimeOfLastBroadCast ; /** * this is time when private messages were last polled for any * profile ; this is used for sequencing the polls so that * each profile gets decent and fair polling periods */ time_t iTimeOfLastMsgPoll ; /** * this is timestamp of last message poll for individual * profile ; this is sent to remote nodes and the nodes are * asked to send messages that they've received after * the timestamp presented here */ quint32 iTimeOfLastMsgPollForProfile ; /** * Addresses that we're supposed to not connect. This easily * gets at least addresses of self in a box that has * multiple network addresses (or multiple temporary * ipv6 addresses) */ QList iAddressBlacklist ; Hash iProfileToPollPrivateMessages ; QList iPrivateMessagePollWishList ; } ; #endif classified-ads-0.13/net/networklistener.cpp000066400000000000000000000707751331670245300210650ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef WIN32 #define NOMINMAX #include #else #include "arpa/inet.h" #endif #include "networklistener.h" #include "connection.h" #include "../log.h" #include "../mcontroller.h" #include "../datamodel/model.h" #include "protocol_message_parser.h" #include "node.h" #include #include #include #include #include "miniupnpc.h" #include "upnpcommands.h" #ifndef WIN32 // Difficult issue here. Miniupnp and natpmp share some codebase // and a common header "declspec.h" that contains common definitions. // Different linux distributions package these 2 packages sometimes // from same original version, sometimes from different, // sometimes declspec.h is inclduded twice, etc. #if defined(MINIUPNP_LIBSPEC) && !defined(LIBSPEC) #define LIBSPEC MINIUPNP_LIBSPEC #endif // hopefully LIBSPEC is now ok, continue to include natpmp // header. #include "natpmp.h" #endif #include NetworkListener::NetworkListener(MController *aController, Model *aModel) : QTcpServer(aController), iController(aController), iModel(aModel), iBroadCastListener(this), iCanAccept(true), iNetworkSession(NULL) { iParser = new ProtocolMessageParser(*iController,*iModel) ; setMaxPendingConnections(50) ; qRegisterMetaType("Connection::ConnectionState"); // Set Internet Access Point QNetworkConfigurationManager manager; const bool canStartIAP = (manager.capabilities() & QNetworkConfigurationManager::CanStartAndStopInterfaces); // Is there default access point, use it iConnectionConfig = manager.defaultConfiguration(); if (!iConnectionConfig.isValid() || (!canStartIAP && iConnectionConfig.state() != QNetworkConfiguration::Active)) { QLOG_STR("Can't open network access point??") ; } iNetworkSession = new QNetworkSession(iConnectionConfig, this); iNetworkSession->open(); iNetworkSession->waitForOpened(-1); figureOutLocalAddresses() ; connect ( iNetworkSession, SIGNAL(stateChanged ( QNetworkSession::State ) ), this, SLOT(networkStateChanged( QNetworkSession::State ))) ; } NetworkListener::~NetworkListener() { if ( iParser ) { delete iParser ; iParser = NULL ; } } bool NetworkListener::startListen(bool aIpv6) { if ( aIpv6 ) { #if QT_VERSION >= 0x050000 // in qt5.x ::Any means both v4+v6. if (!listen ( QHostAddress::Any, iModel->nodeModel().listenPortOfThisNode() )) { QLOG_STR("Socket listen v6+v4: " + errorString()) ; return false ; } #else // at least in linux qt4 binding to AnyIpv6 gives you also Ipv4. if(!listen ( QHostAddress::AnyIPv6, iModel->nodeModel().listenPortOfThisNode() )) { QLOG_STR("Socket listen v4+v6: " + errorString()) ; return false ; } #endif } else { if(!listen ( QHostAddress::Any, iModel->nodeModel().listenPortOfThisNode() )) { QLOG_STR("Socket listen v4: " + errorString()) ; return false ; } } iBroadCastListener.bind(KBroadCastAdvertismentPort); connect(&iBroadCastListener, SIGNAL(readyRead()), this, SLOT(broadCastReceived())); return true ; } #if QT_VERSION >= 0x050000 void NetworkListener::incomingConnection ( qintptr handle ) { const int aSocketDescriptor ( handle ) ; #else void NetworkListener::incomingConnection ( int aSocketDescriptor ) { #endif LOG_STR2("NetworkListener::incomingConnection desc = %d", aSocketDescriptor); if ( iCanAccept ) { QThread* t = new QThread(); Connection *c = new Connection(aSocketDescriptor, *this, // connection observer, is this *iModel, *iController); iModel->lock() ; // here we have a bug .. if IP addr changes, we'll advertise // our old address for the first peer to connect .. would // need to delay construction of node greeting to the moment // when we're already in connected state and can check // for local address of the socket. iModel->addOpenNetworkConnection(c) ; iModel->unlock() ; connect(t, SIGNAL(started()), c, SLOT(run())); connect(c, SIGNAL(finished()), t, SLOT(quit())) ; connect(t, SIGNAL(finished()), t, SLOT(deleteLater())); // after thread is gone, remove the connection too connect(t, SIGNAL(finished()), c, SLOT(deleteLater())); LOG_STR(QString("0x%1 ").arg((qulonglong)c, 8) +"Signals set for connection (in)") ; c->moveToThread(t) ; t->start(); // as "this" was passed as parent to new connection, note that // libQtCore will delete connections when parent is deleted, e.g. // ~NetworkListener() is hit. Threads seem to be usually running // at that stage but haven't seen SIGSEGV:s at closing, not yet.. // if we managed to get this far, we obviously can receive // connections: iController->getNode().setCanReceiveIncoming(true) ; } else { LOG_STR("Un-handled incoming connection at application close") ; } // looks like we don't get "deleteLater()" signals processed // without this QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents) ; } void NetworkListener::threadIsDeleted() { QLOG_STR("Thread deleted from networklistener (Was connection close)") ; } bool NetworkListener::dataReceived(const QByteArray& aData, Connection& aConnection ) { return iParser->parseMessage(aData,aConnection) ; } void NetworkListener::connectionClosed(Connection *aDeletee) { LOG_STR("NetworkListener::connectionClosed, obtaining lock..") ; iModel->lock() ; Hash hashOfClosedConnection ( aDeletee->fingerPrintOfNodeAttempted() ) ; if ( hashOfClosedConnection == KNullHash ) { // connection was made to no particular node. check if node // connection has node in place const Node* nodeOfConnection (aDeletee->node()) ; if (nodeOfConnection != NULL) { // note that pointer returned by ->node() is not to be deleted. hashOfClosedConnection = nodeOfConnection->nodeFingerPrint() ; } } iModel->removeOpenNetworkConnection(aDeletee) ; // if we got meaningful hash, emit that: if ( hashOfClosedConnection != KNullHash ) { emit nodeConnectionAttemptStatus(aDeletee->connectionState(), hashOfClosedConnection ) ; } iModel->unlock() ; LOG_STR("NetworkListener::connectionClosed out, releasing lock..") ; } void NetworkListener::connectionAttemptFailed(const Hash& aNodeHash) { iModel->lock() ; iModel->nodeModel().offerNodeToRecentlyFailedList(aNodeHash) ; iModel->unlock() ; } void NetworkListener::connectionReady(Connection *aBusinessEntity) { iModel->lock() ; emit nodeConnectionAttemptStatus(aBusinessEntity->connectionState(), aBusinessEntity->node()->nodeFingerPrint() ) ; LOG_STR("NetworkListener::connectionReady did emit") ; iModel->unlock() ; } void NetworkListener::figureOutLocalAddresses() { bool natAddrSeen = false ; bool globalIpv4AddrSeen = false ; bool globalIpv6AddrSeen = false ; QList ipAddrList = QNetworkInterface::allAddresses() ; for ( int i = 0 ; i < ipAddrList.size() ; i++ ) { if (! ( ipAddrList.at(i) == QHostAddress::LocalHost || ipAddrList.at(i) == QHostAddress::LocalHostIPv6 ) ) { switch ( ipAddrList.at(i).protocol() ) { case QAbstractSocket::IPv4Protocol: { if (iController->getNode().setIpAddrWithChecks(ipAddrList.at(i))) { // was ok addr globalIpv4AddrSeen = true ; } else { // was nat addr natAddrSeen = true ; } } break ; case QAbstractSocket::IPv6Protocol: if ( iController->getNode().setIpAddrWithChecks(ipAddrList.at(i)) ) { globalIpv6AddrSeen = true ; } break ; default: // QAbstractSocket::LU6.2, anyone? break ; } } } // if we did not see ipv6 addr, set it to zero so we don't // accidentally advertise old address if ( !globalIpv6AddrSeen ) { iController->getNode().setIpv6Addr(KNullIpv6Addr) ; } if ( natAddrSeen && !globalIpv4AddrSeen ) { // ok, looks bad. we're behind nat-box. no incoming connections. // suxxors. LOG_STR("Ipv4 nat. Do something") ; { int error = 0; // following preprocessor directive tries to detect // miniupnpc at least version v1.23 (found in ubuntu 14.04) // that has ipv6+error arguments in upnpDiscover #if defined(MINIUPNPC_API_VERSION) || defined(UPNPDISCOVER_MEMORY_ERROR) #if MINIUPNPC_API_VERSION >= 14 const unsigned char ttl ( 2 ) ; struct UPNPDev *upnp_dev = upnpDiscover( 2000 , // time to wait (milliseconds) NULL , // multicast interface (or null defaults to 239.255.255.250) NULL , // path to minissdpd socket (or null defaults to /var/run/minissdpd.sock) 0 , // source port to use (or zero defaults to port 1900) 0 , // 0==IPv4, 1==IPv6 ttl , // constant 2 ttl &error ); // error condition #else // miniupnpc api older than 14 has no ttl struct UPNPDev *upnp_dev = upnpDiscover( 2000 , // time to wait (milliseconds) NULL , // multicast interface (or null defaults to 239.255.255.250) NULL , // path to minissdpd socket (or null defaults to /var/run/minissdpd.sock) 0 , // source port to use (or zero defaults to port 1900) 0 , // 0==IPv4, 1==IPv6 &error ); // error condition #endif // end of miniupnpc api version >= 14 #else // ancient upnpc in wheezy has no API_VERSION defined // and the api, indeed, is different struct UPNPDev *upnp_dev = upnpDiscover( 2000 , // time to wait (milliseconds) NULL , // multicast interface (or null defaults to 239.255.255.250) NULL , // path to minissdpd socket (or null defaults to /var/run/minissdpd.sock) 0 ); // source port (0=default 1900) #endif if ( error == 0 && upnp_dev != NULL ) { char lan_address[64]; struct UPNPUrls upnp_urls; struct IGDdatas upnp_data; int status = UPNP_GetValidIGD(upnp_dev, &upnp_urls, &upnp_data, lan_address, sizeof(lan_address)); // look up possible "status" values, the number "1" indicates a valid IGD was found QLOG_STR("UPNP_GetValidIGD = " + QString::number(status)) ; if ( status > 0 ) { // get the external (WAN) IP address char wan_address[64] = { 0 } ; int getExternalError = UPNP_GetExternalIPAddress(upnp_urls.controlURL, upnp_data.first.servicetype, wan_address); QLOG_STR("Wan addr: " + QString(wan_address) + " error = " + QString::number(getExternalError)) ; if ( getExternalError == 0 ) { QString externalIpString(wan_address) ; QHostAddress remoteAddr(externalIpString) ; QLOG_STR("Maybe setting wan addr to node: " + remoteAddr.toString() ) ; if ( iController->getNode().setIpAddrWithChecks(remoteAddr) ) { char port_number_str[30] = { 0 } ; sprintf(port_number_str, "%d", iModel->nodeModel().listenPortOfThisNode()) ; QLOG_STR("Calling UPNP_AddPortMapping with port = " + QString(port_number_str)); error = UPNP_AddPortMapping( upnp_urls.controlURL, upnp_data.first.servicetype, port_number_str , // external (WAN) port requested port_number_str , // internal (LAN) port to which packets will be redirected lan_address , // internal (LAN) address to which packets will be redirected "Classified ads", // text description to indicate why or who is responsible for the port mapping "TCP" , // protocol must be either TCP or UDP NULL // remote (peer) host address or nullptr for no restriction #if defined(MINIUPNPC_API_VERSION) || defined(UPNPDISCOVER_MEMORY_ERROR) ,"0" // port map lease duration (in seconds) or zero for "as long as possible" #endif ); // list all port mappings int index = 0; // how many port mappings can you have in large installation? for ( int portmappingcounter = 0 ; portmappingcounter < 1024 ; portmappingcounter++ ) { char map_wan_port [200] = ""; char map_lan_address [200] = ""; char map_lan_port [200] = ""; char map_protocol [200] = ""; char map_description [200] = ""; char map_mapping_enabled [200] = ""; char map_remote_host [200] = ""; char map_lease_duration [200] = ""; // original time, not remaining time :( char index_str[200] = { 0 } ; sprintf(index_str, "%d", index) ; QLOG_STR("Calling UPNP_GetGenericPortMappingEntry with index = " + QString::number(index)) ; error = UPNP_GetGenericPortMappingEntry( upnp_urls.controlURL , upnp_data.first.servicetype , index_str , map_wan_port , map_lan_address , map_lan_port , map_protocol , map_description , map_mapping_enabled , map_remote_host , map_lease_duration ); index++ ; QLOG_STR("UPNP_GetGenericPortMappingEntry error " + QString::number(error)) ; QLOG_STR("map_remote_host = " + QString(map_remote_host)) ; QLOG_STR("map_wan_port = " + QString(map_wan_port)) ; QLOG_STR("map_protocol = " + QString(map_protocol)) ; if ( strncmp(map_wan_port, port_number_str , 5 ) == 0 ) { iController->getNode().setCanReceiveIncoming(true) ; QLOG_STR("Our port forwarding found, getting out..") ; globalIpv4AddrSeen = true ; break ; } if (error) { break; // no more port mappings available } } } else { QLOG_STR("Did not use IP-addr from UPnP, maybe it too was behind nat?") ; } } } freeUPNPDevlist(upnp_dev) ; upnp_dev = NULL ; } } if ( !globalIpv4AddrSeen ) { // following code did not work in WIN32 #ifndef WIN32 // kudos to http://miniupnp.free.fr/libnatpmp.html int r = -1; natpmp_t natpmp; natpmpresp_t response; in_addr_t gateway = 0; int forcegw = 0; int loopCount = 0 ; initnatpmp(&natpmp,forcegw,gateway); sendnewportmappingrequest(&natpmp, NATPMP_PROTOCOL_TCP, iModel->nodeModel().listenPortOfThisNode(), iModel->nodeModel().listenPortOfThisNode(),INT_MAX-1); int select_retval ( -1 ) ; do { fd_set fds; struct timeval timeout; FD_ZERO(&fds); FD_SET(natpmp.s, &fds); getnatpmprequesttimeout(&natpmp, &timeout); select_retval = select(FD_SETSIZE, &fds, NULL, NULL, &timeout); if ( select_retval == -1 ) { QLOG_STR("natpmp wait select error = " + QString::number(select_retval)) ; r = NATPMP_ERR_CANNOTGETGATEWAY ; break ; // out of the loop } else if ( select_retval ) { r = readnatpmpresponseorretry(&natpmp, &response); } else { // no data within timeout: QLOG_STR("natpmp wait timeout reached") ; r = NATPMP_ERR_CANNOTGETGATEWAY ; break ; // out of the loop } } while(r==NATPMP_TRYAGAIN && ++loopCount < 100 ); if(r>=0) { printf("Mapped public port %hu protocol %s to local port %hu " "lifetime %u resp = %d\n", response.pnu.newportmapping.mappedpublicport, response.type == NATPMP_RESPTYPE_UDPPORTMAPPING ? "UDP" : (response.type == NATPMP_RESPTYPE_TCPPORTMAPPING ? "TCP" : "UNKNOWN"), response.pnu.newportmapping.privateport, response.pnu.newportmapping.lifetime, r); // port done, obtain our public ip addr int addrQueryRespCode = 0 ; if(( addrQueryRespCode = sendpublicaddressrequest(&natpmp)) > 0 ) { LOG_STR2("sendpublicaddressrequest ret = %d", addrQueryRespCode); loopCount = 0 ; do { fd_set fds; struct timeval timeout; FD_ZERO(&fds); FD_SET(natpmp.s, &fds); getnatpmprequesttimeout(&natpmp, &timeout); select(FD_SETSIZE, &fds, NULL, NULL, &timeout); r = readnatpmpresponseorretry(&natpmp, &response); } while(r==NATPMP_TRYAGAIN && ++loopCount < 100 ); if ( r>= 0 ) { LOG_STR("Managed to obtain public ip addr via NATPMP") ; LOG_STR2("Response type = %d", response.type) ; if ( response.type == NATPMP_RESPTYPE_PUBLICADDRESS ) { in_addr publicaddress = response.pnu.publicaddress.addr; iController->getNode().setIpv4Addr(ntohl(publicaddress.s_addr)) ; // if we got port forwarded and ip addr from upnp-box // we can fairly safely say that we can receive // incoming connections too: iController->getNode().setCanReceiveIncoming(true) ; } } else { LOG_STR2("NATPMP addr retrieval not success, r = %d", r ); } } else { LOG_STR2("sendpublicaddressrequest ret = %d", addrQueryRespCode); } } else { LOG_STR2("NATPMP Mapping did not succeed, r = %d", r ); switch (r) { case NATPMP_ERR_INVALIDARGS: LOG_STR("NATPMP ERR_INVALIDARGS") ; break ; case NATPMP_ERR_SOCKETERROR: LOG_STR("NATPMP_ERR_SOCKETERROR : socket() failed. check errno for details") ; break ; case NATPMP_ERR_CANNOTGETGATEWAY: LOG_STR("NATPMP_ERR_CANNOTGETGATEWAY : can't get default gateway IP"); break ; case NATPMP_ERR_CLOSEERR: LOG_STR2("NATPMP_ERR_CLOSEERR : close() failed. error = %s", strerror(errno)); break ; case NATPMP_ERR_RECVFROM: LOG_STR2("NATPMP_ERR_RECVFROM : recvfrom() failed. error = %s", strerror(errno)); break ; case NATPMP_ERR_NOPENDINGREQ: LOG_STR("readnatpmpresponseorretry() called while no NAT-PMP request was pending") ; break ; case NATPMP_ERR_NOGATEWAYSUPPORT: LOG_STR("NATPMP_ERR_NOGATEWAYSUPPORT : the gateway does not support NAT-PMP") ; break ; case NATPMP_ERR_CONNECTERR: LOG_STR2("NATPMP_ERR_RECVFROM : connect() failed. error %s", strerror(errno)) ; break ; case NATPMP_ERR_WRONGPACKETSOURCE : LOG_STR("NATPMP_ERR_WRONGPACKETSOURCE : packet not received from the network gateway") ; break ; case NATPMP_ERR_SENDERR: LOG_STR2("NATPMP_ERR_RECVFROM : send() failed. error %s", strerror(errno)) ; break ; case NATPMP_ERR_FCNTLERROR: LOG_STR2("NATPMP_ERR_RECVFROM : fcntl() failed. error %s", strerror(errno)) ; break ; case NATPMP_ERR_GETTIMEOFDAYERR : LOG_STR2("NATPMP_ERR_RECVFROM : gettimeofday() failed. error %s", strerror(errno)) ; break ; case NATPMP_ERR_UNSUPPORTEDVERSION: LOG_STR("NATPMP_ERR_WRONGPACKETSOURCE : packet not received from the network gateway") ; break ; case NATPMP_ERR_UNSUPPORTEDOPCODE: LOG_STR("NATPMP_ERR_WRONGPACKETSOURCE : packet not received from the network gateway") ; break ; case NATPMP_ERR_UNDEFINEDERROR : LOG_STR("NATPMPErrors from the server : undefined") ; break ; case NATPMP_ERR_NOTAUTHORIZED : LOG_STR("NATPMPErrors from the server : not authorized") ; break ; case NATPMP_ERR_NETWORKFAILURE : LOG_STR("NATPMPErrors from the server : network failure") ; break ; case NATPMP_ERR_OUTOFRESOURCES : LOG_STR("NATPMPErrors from the server : out of resources") ; break ; } } closenatpmp(&natpmp); #endif // else-part of WIN32 } } // lets greet self to have our own record in db updated // as it may later appear in query results.. iModel->nodeModel().nodeGreetingReceived(iController->getNode(),true) ; } void NetworkListener::broadCastReceived() { QByteArray buffer; int bytesToExpect ( iBroadCastListener.pendingDatagramSize() ) ; buffer.resize(bytesToExpect); quint16 senderPort ; QHostAddress sender; if ( bytesToExpect == iBroadCastListener.readDatagram(buffer.data(), buffer.size(), &sender, &senderPort) ) { if ( buffer.size() > 3 && buffer[0] == 'c' && buffer[1] == 'a' && ( ( buffer[2] == '4' && buffer.size() == 27 ) || ( buffer[2] == '6' && buffer.size() == 43 ) ) ) { const char* ptr ( buffer.constData() ) ; ptr ++ ; // skip c ptr ++ ; // skip a ptr ++ ; // skip 4 or 6 quint32* hash1ptr ( (quint32*)ptr ) ; ptr += sizeof(quint32) ; // skip hash1 quint32* hash2ptr ( (quint32*)ptr ) ; ptr += sizeof(quint32) ; // skip hash1 quint32* hash3ptr ( (quint32*)ptr ) ; ptr += sizeof(quint32) ; // skip hash1 quint32* hash4ptr ( (quint32*)ptr ) ; ptr += sizeof(quint32) ; // skip hash1 quint32* hash5ptr ( (quint32*)ptr ) ; ptr += sizeof(quint32) ; // skip hash1 Hash hashOfNodeAdvertising ( ntohl (*hash1ptr), ntohl (*hash2ptr), ntohl (*hash3ptr), ntohl (*hash4ptr), ntohl (*hash5ptr) ) ; quint32* portPtr ( (quint32*)ptr ) ; ptr += sizeof(quint32) ; // skip port quint32 portHostByteOrder ( ntohl (*portPtr ) ) ; LOG_STR2("Port %u", portHostByteOrder) ; LOG_STR2("Hash %s", qPrintable(hashOfNodeAdvertising.toString())) ; // if ipv6, then dig also the addr const bool hasIpv6 = !Connection::Ipv6AddressesEqual(iController->getNode().ipv6Addr(), KNullIpv6Addr) ; if ( buffer[2] == '6' && hasIpv6 ) { Q_IPV6ADDR addr ; for ( int i=0 ; i < 16; i++ ) { addr.c[i] = *ptr ; ptr++ ; } sender.setAddress(addr) ; } if ( iCanAccept ) { QLOG_STR( "Message from: " + sender.toString() ); if ( hashOfNodeAdvertising == iController->getNode().nodeFingerPrint()) { // was my own ad return ; } else { iModel->lock() ; iModel->nodeModel().addNodeFromBroadcast(hashOfNodeAdvertising, sender, portHostByteOrder) ; iModel->unlock() ; } } } } } void NetworkListener::stopAccepting() { iCanAccept = false ; close() ; } void NetworkListener::networkStateChanged( QNetworkSession::State aState ) { QLOG_STR("NetworkListener::networkStateChanged " + QString::number(aState)); if ( aState == QNetworkSession::Connected ) { iModel->lock() ; this->figureOutLocalAddresses() ; iModel->unlock() ; } } classified-ads-0.13/net/networklistener.h000066400000000000000000000106771331670245300205250ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef NETWORK_LISTENER_H #define NETWORK_LISTENER_H #include #include #include "connection.h" // for ConnectionObserver #include #include class MController ; class Model ; class ProtocolMessageParser ; /** * @brief class for listening to incoming network connections. * * This class will spawn a @ref Connection for each received * network connection. */ class NetworkListener : public QTcpServer, public Connection::ConnectionObserver { Q_OBJECT public: /** * Constructor * @param aController application controller for app state frobnication * @param aModel data model reference for data storage * @param aIpv6 if set to true, this class will listen in Ipv6 instead * of v4 and will not enumerate local network interfaces. */ NetworkListener(MController *aController, Model *aModel) ; /** * Destructor */ ~NetworkListener() ; /** * separate method for starting the listen. this now works with qt4.8 * but it seems like semantics of listen may change in qt5, where * listening in QHostAddress::Any automatically means both v4 and v6. * @param aIpv6 if true, tries to listen on both IPv6 * and ipv4. * @return true if listening started. */ bool startListen(bool aIpv6) ; /** * from ConnectionObserver */ virtual bool dataReceived(const QByteArray& aData, Connection& aConnection) ; /** * From ConnectionObserver * this is called by peer connection at close */ virtual void connectionClosed(Connection *aDeletee) ; /** * From ConnectionObserver * this is called by peer connection at successful open */ virtual void connectionReady(Connection *aBusinessEntity) ; /** * used in closing of app: stops accepting connections */ void stopAccepting() ; /** * Method that loops network interfaces and tries to find a valid * local address to advertise */ void figureOutLocalAddresses() ; protected: #if QT_VERSION >= 0x050000 virtual void incomingConnection(qintptr handle); #else void incomingConnection (int aSocketDescriptor ) ; #endif signals: void error(QTcpSocket::SocketError socketError); /** * this signal is used to communicate (at least to publishing engine) * status of connection attempt to particular node. network connection * engine will spawn connections to more-or-less random nodes but * publishing logic may ask for connections to specific nodes. * this signal will communicate outcome of such requests */ void nodeConnectionAttemptStatus(Connection::ConnectionState aStatus, const Hash aHashOfAttemptedNode ); private slots: void broadCastReceived() ; void threadIsDeleted() ; void networkStateChanged( QNetworkSession::State aState ) ; /** * This slot is used to communicate situation where connection-attempt * to node fails * @param aNodeHash fingerprint of failed node */ void connectionAttemptFailed(const Hash& aNodeHash) ; private: // data MController *iController ; Model *iModel ; /** This animal here knows all incoming bytearrays */ ProtocolMessageParser *iParser ; QUdpSocket iBroadCastListener ; /** * used in closing of application: flag for not accepting * connections any more */ bool iCanAccept ; QNetworkConfiguration iConnectionConfig ; QNetworkSession* iNetworkSession ; } ; #endif classified-ads-0.13/net/node.cpp000066400000000000000000000311731331670245300165400ustar00rootroot00000000000000/* -*-C++-*- Classified Ads is Copyright (c) Antti Jarvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "node.h" #include "../log.h" #include "connection.h" // for ipv6-addr comparison #include #include "protocol.h" #include "../mcontroller.h" // for KNullHash const static char *KNodeJSonCanReceiveElement = "a" ; const static char *KNodeJSonTorElement = "t" ; const static char *KNodeJSonListenPortElement = "p" ; const static char *KNodeJSonIPv6Element = "v6" ; const static char *KNodeJSonIPv4Element = "v4" ; const static char *KNodeJSonDnsElement= "d" ; const static char *KNodeJSonLastContactTimeElement= "l" ; const static char *KNodeJSonFPElement= "f" ; /** nat subnets. see similar variable in connection.cpp */ const static QPair nodeNormalNats1 = QHostAddress::parseSubnet("10.0.0.0/8"); const static QPair nodeNormalNats2 = QHostAddress::parseSubnet("172.16.0.0/20"); const static QPair nodeNormalNats3 = QHostAddress::parseSubnet("192.168.0.0/16"); /** non-routable address space that some ISP's seem to offer */ static const QPair nodeRfc6598 ( QHostAddress::parseSubnet("100.64.0.0/10") ); /** ipv6 non-routable address spaces */ static const QPair rfc3879 ( QHostAddress::parseSubnet("fec0::/10") ); static const QPair rfc4193 ( QHostAddress::parseSubnet("fc00::/7") ); Node::Node(const Hash &aNodeFingerPrint, const int aListenPort) : iNodeFingerPrint(aNodeFingerPrint), iListenPort(aListenPort), iTimeOfLastContact(0) , iIPv4Addr(0), iDnsName(NULL) , iTorAddr(NULL) , iCanReceiveIncoming(false), iTimeOfGoodNodeList(0), iLastConnectTime(0), iLastMutualConnectTime(0) { iIPv6Addr = KNullIpv6Addr ; // QHostAddress("::0").toIPv6Address () ; // null addr initially } Node::~Node() { if ( iDnsName ) { delete iDnsName ; } if ( iTorAddr ) { delete iTorAddr ; } } void Node::setIpv4Addr(const quint32 aAddr) { iIPv4Addr = aAddr ; QLOG_STR("Ipv4 addr: " + QHostAddress(aAddr).toString()) ; } void Node::setIpv6Addr(const Q_IPV6ADDR &aAddr) { iIPv6Addr = aAddr ; QLOG_STR("Ipv6 addr of node = "+ QHostAddress(aAddr).toString()) ; } quint32 Node::ipv4Addr(void) const { return iIPv4Addr ; } Q_IPV6ADDR Node::ipv6Addr(void) const { return iIPv6Addr ; } QString Node::DNSAddr(void) const { QString retval ; if ( iDnsName && iDnsName->length() > 0 ) { retval = *iDnsName ; } return retval ; } void Node::setDNSAddr(const QString& aAddr) { if ( iDnsName ) { delete iDnsName ; iDnsName = NULL ; } if ( aAddr.length() > 0 ) { iDnsName = new QString(aAddr) ; } } QString Node::TORAddr(void) const { QString retval ; if ( iTorAddr && iTorAddr->length() > 0 ) { retval = *iTorAddr ; } return retval ; } void Node::setTORAddr(const QString& aAddr) { if ( iTorAddr ) { delete iTorAddr ; iTorAddr = NULL ; } if ( aAddr.length() > 0 ) { iTorAddr = new QString(aAddr) ; } } void Node::setPort(const int aPort) { iListenPort = aPort ; } int Node::port(void) const { return iListenPort ; } void Node::setGoodNodeListTime(const time_t aTime) { time_t wallClockTime = QDateTime::currentDateTimeUtc().toTime_t() ; if ( aTime > ( wallClockTime + 60 ) ) { // da phuck. clock skew? iTimeOfGoodNodeList = wallClockTime ; LOG_STR2("Clock skew? %u", (unsigned)aTime) ; } else { iTimeOfGoodNodeList= aTime ; } } time_t Node::goodNodeListTime(void) const { return iTimeOfGoodNodeList ; } const Hash& Node::nodeFingerPrint(void) const { return iNodeFingerPrint ; } void Node::setLastConnectTime(const time_t aTime) { time_t wallClockTime = QDateTime::currentDateTimeUtc().toTime_t() ; if ( aTime > ( wallClockTime + 60 ) ) { // da phuck. clock skew? iLastConnectTime = wallClockTime ; LOG_STR2("Clock skew? %u", (unsigned) aTime) ; } else { iLastConnectTime = aTime ; } } time_t Node::lastConnectTime(void) const { return iLastConnectTime ; } void Node::setLastMutualConnectTime(const time_t aTime) { time_t wallClockTime = QDateTime::currentDateTimeUtc().toTime_t() ; if ( aTime > ( wallClockTime + 60 ) ) { // da phuck. clock skew? iLastMutualConnectTime = wallClockTime ; LOG_STR2("Clock skew? %u", (unsigned) aTime) ; } else { iLastMutualConnectTime = aTime ; } } time_t Node::lastMutualConnectTime(void) const { return iLastMutualConnectTime ; } void Node::setCanReceiveIncoming(const bool aYesItCan) { iCanReceiveIncoming= aYesItCan ; } bool Node::canReceiveIncoming(void) const { return iCanReceiveIncoming; } // // this one conditionally sets ipv6 or ipv4 addr. this is called // from connection and from networklistener. // bool Node::setIpAddrWithChecks(const QHostAddress& aAddress) { bool retval = false ; if (! ( aAddress == QHostAddress::LocalHost || aAddress == QHostAddress::LocalHostIPv6 ) ) { if ( QAbstractSocket::IPv6Protocol == aAddress.protocol() ) { if ( aAddress.scopeId().toLower() == "global" ) { // this should be good addr for us ; if there // is multiple, still use only one, it is // here advertised as "Global" so supposedly // it will get routed.. setIpv6Addr(aAddress.toIPv6Address() ) ; retval = true ; } else { QString ipv6String ( aAddress.toString() ); if ( ipv6String.toLower().startsWith("fe80") ) { // is link-local } else if ( ipv6String.toLower().startsWith("fec0") ) { // is site-local, is it useful, no? } else if ( ipv6String.toLower().startsWith("::") ) { // address starting with all-zeroes, must // not be globally routing, no? } else if ( aAddress.isInSubnet(rfc3879) ) { QLOG_STR("Not using rfc3879 private address space") ; } else if ( aAddress.isInSubnet(rfc4193) ) { QLOG_STR("Not using rfc4193 unique local address space") ; } else if ( ipv6String.toLower().startsWith("2001:0:") ) { // this is a teredo address and it seems to me that // there is more non-functional teredo addresses // than functional .. and host having teredo needs // to have ipv4 anyway so we don't lose much here. QLOG_STR("Not using teredo-ipv6 addr") ; } else { #ifdef WIN32 // it seems to me that win32 reports permanent address first // so if we already have one, do not change that: if ( Connection::Ipv6AddressesEqual(iIPv6Addr, KNullIpv6Addr) == true ) { setIpv6Addr(aAddress.toIPv6Address() ) ; } else { // we already managed to get one addr so lets not change that } #else // seems to me that there is no consistent behaviour in linux // so lets just pick up the latest addr.. setIpv6Addr(aAddress.toIPv6Address() ) ; #endif retval = true ; } } } else if ( QAbstractSocket::IPv4Protocol == aAddress.protocol() ) { // hmm .. if ( aAddress.isInSubnet(nodeNormalNats1) || aAddress.isInSubnet(nodeNormalNats2) || aAddress.isInSubnet(nodeNormalNats3) || aAddress.isInSubnet(nodeRfc6598) ) { // is nat addr, no-no } else { if ( aAddress.toString().startsWith("169.254") ) { QLOG_STR("Got link-local ipv4-addr (zeroconf?) -> not using "+ aAddress.toString()) ; } else { setIpv4Addr(aAddress.toIPv4Address ()) ; retval = true ; } } } } return retval ; } QVariant Node::asQVariant() const { QMap m ; m.insert(KNodeJSonFPElement, iNodeFingerPrint.toString()) ; if ( iListenPort > 0 ) { m.insert(KNodeJSonListenPortElement, iListenPort) ; } m.insert(KNodeJSonLastContactTimeElement, (unsigned)iTimeOfLastContact ) ; if ( iIPv4Addr ) { m.insert(KNodeJSonIPv4Element, iIPv4Addr) ; } if (!Connection::Ipv6AddressesEqual(iIPv6Addr, KNullIpv6Addr)) { m.insert(KNodeJSonIPv6Element, QHostAddress(iIPv6Addr).toString()) ; } if ( iDnsName && iDnsName->length() > 0 ) { m.insert(KNodeJSonDnsElement, *iDnsName) ; } if ( iTorAddr && iTorAddr->length() > 0 ) { m.insert(KNodeJSonTorElement, *iTorAddr ) ; } m.insert(KNodeJSonCanReceiveElement, iCanReceiveIncoming ) ; QVariant j (m) ; return j ; } Node* Node::fromQVariant(const QVariantMap& aJSonAsQVariant, const bool aIsInitialGreeting) { Node* n = NULL ; quint32 nodePort(0) ; if ( aJSonAsQVariant.contains(KNodeJSonFPElement) ) { const unsigned char *fpStr ( (const unsigned char *) qPrintable(aJSonAsQVariant[KNodeJSonFPElement].toString())) ; Hash nodeFp ; nodeFp.fromString(fpStr) ; if ( aJSonAsQVariant.contains(KNodeJSonListenPortElement) ) { nodePort = aJSonAsQVariant[KNodeJSonListenPortElement].toUInt() ; } if ( ( nodeFp != KNullHash ) && nodePort > 0 ) { n = new Node ( nodeFp,nodePort) ; if ( aJSonAsQVariant.contains(KNodeJSonLastContactTimeElement) ) { unsigned contactTime (aJSonAsQVariant[KNodeJSonLastContactTimeElement].toUInt()); if ( contactTime ) { n->setLastConnectTime(contactTime) ; } } if ( aJSonAsQVariant.contains(KNodeJSonIPv4Element) ) { quint32 ipv4 (aJSonAsQVariant[KNodeJSonIPv4Element].toUInt()); if ( ipv4 ) { n->setIpv4Addr(ipv4) ; } } if ( aJSonAsQVariant.contains(KNodeJSonIPv6Element) ) { QString ipv6 (aJSonAsQVariant[KNodeJSonIPv6Element].toString()); if ( ipv6.length() > 0 ) { QHostAddress a ( ipv6 ) ; if (!Connection::Ipv6AddressesEqual(a.toIPv6Address(), KNullIpv6Addr)) { n->setIpv6Addr(a.toIPv6Address()) ; } } } if ( aJSonAsQVariant.contains(KNodeJSonDnsElement) ) { n->setDNSAddr(aJSonAsQVariant[KNodeJSonDnsElement].toString()) ; } if ( aJSonAsQVariant.contains(KNodeJSonTorElement) ) { n->setTORAddr(aJSonAsQVariant[KNodeJSonTorElement].toString()) ; } if ( aIsInitialGreeting ) { n->setLastConnectTime ( QDateTime::currentDateTimeUtc().toTime_t() ) ; } if ( aJSonAsQVariant.contains(KNodeJSonCanReceiveElement) ) { bool canReceive (aJSonAsQVariant[KNodeJSonCanReceiveElement].toBool()); n->setCanReceiveIncoming(canReceive) ; } if ( aJSonAsQVariant.contains(KNodeJSonTorElement) ) { n->iTorAddr = new QString(aJSonAsQVariant[KNodeJSonTorElement].toString()) ; } if ( aJSonAsQVariant.contains(KNodeJSonDnsElement) ) { n->iDnsName = new QString(aJSonAsQVariant[KNodeJSonDnsElement].toString()) ; } } } return n ; } classified-ads-0.13/net/node.h000066400000000000000000000120111331670245300161730ustar00rootroot00000000000000/* -*-C++-*- Classified Ads is Copyright (c) Antti Jarvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef NODE_H #define NODE_H #include #include "../util/hash.h" #include #include // for Q_IPV6ADDR class Hash ; extern Q_IPV6ADDR KNullIpv6Addr ; /** * @brief Node is a peer in network. * * Class that represents a node in network ; typically * a physical computer. Nothing prevents having multiuser * computer, each user running separate nodes ; but usually * only one node per physical computer. */ class Node { public: /** * constructor * @param aNodeFingerPrint is certificate fingerprint of the * node that this class re-presents * @param aListenPort is the network port where the * node is supposed to listen */ Node(const Hash &aNodeFingerPrint, const int aListenPort) ; /** * Destructor */ ~Node() ; /** * sets ipv4 addr of node */ void setIpv4Addr(const quint32 aAddr) ; /** * sets ipv6 addr of node */ void setIpv6Addr(const Q_IPV6ADDR &aAddr) ; /** * gets ipv4 addr of node */ quint32 ipv4Addr(void) const ; /** * gets ipv6 addr of node */ Q_IPV6ADDR ipv6Addr(void) const ; /** * gets dns-name of node */ QString DNSAddr(void) const ; /** * sets dns-name of node */ void setDNSAddr(const QString& aAddr) ; /** * gets tor-name of node */ QString TORAddr(void) const ; /** * sets tor-name of node */ void setTORAddr(const QString& aAddr) ; /** * sets listen port of node */ void setPort(const int aPort) ; /** * gets listen port of node */ int port(void) const ; /** * sets time of good node list */ void setGoodNodeListTime(const time_t aTime) ; /** * gets time of good node list */ time_t goodNodeListTime(void) const ; /** * gets hash of node */ const Hash& nodeFingerPrint(void) const ; /** * sets last time of connect */ void setLastConnectTime(const time_t aTime) ; /** * gets last time of connect */ time_t lastConnectTime(void) const ; /** * sets last time of connect to this particular node here running this code */ void setLastMutualConnectTime(const time_t aTime) ; /** * gets last time of connect to this node. */ time_t lastMutualConnectTime(void) const ; /** * sets bool if can receive incoming connections */ void setCanReceiveIncoming(const bool aYesItCan) ; /** * gets bool if can receive incoming connections */ bool canReceiveIncoming(void) const ; /** * method intended for setting local address ; this will either * set or not set an addr, based on checks inside * @param aAddress is the address to try * @return true if aAddress was decided to be valid for future * advertisement */ bool setIpAddrWithChecks(const QHostAddress& aAddress) ; /** * Method for getting node reference as JSon / QVariant */ QVariant asQVariant() const ; /** * reverse of @ref asQVariant() * @return node or NULL if */ static Node* fromQVariant(const QVariantMap& aJSonAsQVariant, const bool aIsInitialGreeting ) ; private: /** SHA1 fingerprint of node certificate */ const Hash iNodeFingerPrint ; /** TCP port number where node is supposed to listen */ int iListenPort ; /** time when node was last successfully contacted */ time_t iTimeOfLastContact ; /** 32 bits of IPv4 addr, 0 if no IPv4 addr present */ quint32 iIPv4Addr ; /** ipv6-addr */ Q_IPV6ADDR iIPv6Addr ; /** dns-name as text */ QString* iDnsName ; /** address within tor-network as text */ QString* iTorAddr ; /** true if node has been successfully contacted from outside */ bool iCanReceiveIncoming ; /** time when node says has last received good node listing */ time_t iTimeOfGoodNodeList ; /** time when node was last seen connecting */ time_t iLastConnectTime ; /** time when node was last connected to this node */ time_t iLastMutualConnectTime ; } ; #endif classified-ads-0.13/net/protocol.h000066400000000000000000000262461331670245300171260ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2016. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CA_PROTOCOL_H #define CA_PROTOCOL_H #include "../util/hash.h" // for Hash /** * @file protocol.h * this file protocol.h defines constants that are passed * between peers as protocol entries. * * Possible messages are * - Node greeting in the beginning. There node may advertise * other available addresses and date when last in contact * with this node or peers in the vicinity. This should * be sent first by both parties. * - Node listing. Basically this is just up-to-date list of * known peers, in immediate vicinity and then around * the ring ; each node should try to produce list * of high-quality nodes for this list. */ // node greeting has following fields, each is unsigned // 8-bit if not otherwise stated, 32-bit integers are // in network byte order: // 1. protocol version for this node. Note that identifies // both this message and the protocol version. Later we // may invent protocol version xyz that will then // identify node and its protocol with some other // number. static const unsigned char KProtocolVersion (1) ; /**< node greeting msg identifier */ // 2. number of bytes that follows for the whole message // 3. node greeting as qCompress()ed JSon // // ok, next thing to define is our easiest message type, random numbers. // idea for this is this: upon connect node sends node greeting. // node greeting contains hash and outside ip addr. suppose someone // is eavesdropping the tsl tcp connection she already has some known // plaintext in there, in the very first real datapacket transmitted, // in known offset so .. say, the original tsl key was done using bad // random number and in addition the listener knows some plaintext // inside it might be possible to brute-force the key. // // lets make her job a bit more interesting by first transmitting // short random sequence of random length in the beginning. static const unsigned char KRandomNumbersPacket (100) ; /**< rnd number msg identifier */ // rest of the packet is msg len and then the bytes that are supposed // to be discarded (or written into your weekly lottery ticket // if you consider yourself a lucky jerk :) // then have packet for requesting nodes that might be held liable // for keeping alive content with given hash // the packet consists of the identifier and a 160 bit hash. nothing else. // following items are for requesting various things from peer: static const unsigned char KNodesAroundHash (101) ; /**< Message id for requesting nodes around hash */ static const unsigned char KProfileAtHash (103) ; /**< Message id for a profile request */ static const unsigned char KBinaryFileAtHash (104) ; /**< Message id for a binary file request */ static const unsigned char KClassifiedAdAtHash (109) ; /**< Message id for CA request */ static const unsigned char KProfilePublish (102) ; /**< Profile is published with this number */ static const unsigned char KBinaryFilePublish (105) ; /**< Binary blob is published with this number */ static const unsigned char KBinaryFileSend (106) ; /**< Binary blob is sent (compare to publish) with this number */ static const unsigned char KClassifiedAdPublish (107) ; /**< Classified ad is published with this number */ static const unsigned char KProfileSend (108) ; /**< Operator profile is sent (compare to publish) with this number */ static const unsigned char KClassifiedAdSend (110) ; /**< CA is sent (compare to publish) with this number */ static const unsigned char KAdsClassifiedAtHash (111) ; /**< Query about CAs whose classification matches the hash */ static const unsigned char KListOfAdsClassifiedAtHash (112) ; /**< Reply to Query about CAs whose classification matches the hash */ static const unsigned char KPrivMessagePublish (113) ; /**< user is publishing a new private message */ static const unsigned char KPrivMessageSend (114) ; /**< node is sending a private message */ static const unsigned char KPrivMessagesAtHash (115) ; /**< Request for private message having given hash */ static const unsigned char KPrivMessagesForProfile (116) ; /**< Request for private message destined so given profile */ static const unsigned char KProfileCommentPublish (117) ; /**< user is publishing a new comment to profile */ static const unsigned char KProfileCommentSend (118) ; /**< node is sending a profile comment */ /** * sent as a request to send profile comments. This is not about * sending individual comment but instead comments of a profile * there is separate request for single comment */ static const unsigned char KProfileCommentAtHash (119) ; /** * sent as a request to send single profile comment. */ static const unsigned char KSingleProfileCommentAtHash (120) ; /** * sent as a request to perform search */ static const unsigned char KSearchRequest (121) ; /** * sent as a response to KSearchRequest (if there were any results) */ static const unsigned char KSearchResults (122) ; /** * send as request to open audio channel to operators node */ static const unsigned char KVoiceCallStart (123) ; /** * send as indication about closing of audio channel to operators node */ static const unsigned char KVoiceCallEnd (124) ; /** * This is used to send rt-data inside ssl socket. Typically RT data * would belong to UDP packet but sometimes UDP won't work while * TCP does. Use-case for this is voice call audio packets but there * may be other types also ; the data anyway contains a sub-type, * for instance for sending separate audio, chat messages or even * moving pictures. */ static const unsigned char KRealtimeData (125) ; /** * Protocol PDU identifier for general-purpose db-record publish */ static const unsigned char KDbRecordPublish ( 126 ) ; static const unsigned char KDbRecordSend ( 127 ) ; static const unsigned char KDbRecordSearch ( 128 ) ; /** * Protocol constants for future use */ static const unsigned char KFutureUse4 (129) ; static const unsigned char KFutureUse5 (130) ; static const unsigned char KFutureUse6 (131) ; /** * next thing is rt-data subtypes. First audio. */ static const unsigned char KRTDataAudioSubtype (1) ; /** * Call control real-time data packet subtype */ static const unsigned char KRTDataControlSubtype (2) ; /** * this enum lists possible items that we send over socket * from one node to another. These get serialized into bitstream * whose values are #defined above. */ enum ProtocolItemType { OwnNodeGreeting=1, /**< normal node greeting but inside program special handling */ NodeGreeting=2, /**< node connectivity details */ ClassifiedAd=3, /**< normal public posting */ PrivateMessage=4, /**< a message destined to owner of specific profile */ BinaryBlob=5, /**< just data, relates to something, has SHA1 */ UserProfile=6, /**< user RSA key and possible other related data */ RequestForClassifiedAd=7,/**< query for other nodes if there is anything about classified ads */ RequestForPrivateMessage=8,/**< query for other nodes if there is any private msgs */ RequestForBinaryBlob=9,/**< query for other nodes if there is specific binary avail */ RequestForUserProfile=10,/**< query for other nodes if user has been in da hood */ RandomNumbers=11, /**< explained later. this really contains 1 or more random numbers */ RequestForNodesAroundHash=12, /**< request that other nodes use to retrieve node-refs around given hash */ UserProfilePublish=13, /**< publish message is different from normal UserProfile */ BinaryFilePublish=14, /**< publish binary blob is different from normal BinaryBlob */ ClassifiedAdPublish=15, /**< publish CA is different from normal ad */ ClassifiedAd2NdAddr=16, /**< publish of CA to group controller */ RequestAdsClassified=17,/**< query for articles whose classification is known */ PrivateMessagePublish=18,/**< local user is sending a privmsg */ PrivateMessagesForProfile=19, /**< specifies a request to send messages destined to profile */ UserProfileComment=20, /**< invididual profile comment to be sent */ ProfileCommentPublish=21, /**< profile comment publish item type */ UserProfileCommentsForProfile=22, /**< request to queue profile comments commenting given profile */ RequestForProfilePoll=23, /**< UI request regarding profile update poll */ RequestForProfileComment=24, /**< UI request regarding individual comment */ RequestForSearchSend=25, /**< UI request about network search */ RequestForVoiceCallStart=26,/**< node<->node audio control start */ RequestForVoiceCallEnd=27,/**< node<->node audio control stop */ DbRecord=28,/**< Record of distributed database */ DbRecordPublish=29, /**< Record of distributed database via publish operation */ RequestForDbRecord=30 /**< Query regarding distributed database records */ }; /** * @brief send-queue item. * * For each connected node, there is list of items to send, * entry in that list looks like this */ struct SendQueueItem { ProtocolItemType iItemType ; /**< what kind data sits in queue */ Hash iHash ; /**< and its id, if applicable */ } ; /** * @brief Carrier for keeping state of item about to be published. * * This struct carries data needed to publish-operation. This * is just collection of identifier of the actual object * and brief list of nodes where it has been already pushed to */ struct PublishItem { ProtocolItemType iObjectType ; /**< profile,classified ad,priv-msg etc*/ Hash iObjectHash ; /**< Identifier of the data itself */ /** low order hash bits of nodes that already have the content */ QList iAlreadyPushedHosts ; Hash i2NdAddr ; /**< CAs and comments get published twice, here is the 2nd addr */ } ; /** * How many open connections we wish to have open at same time */ static const int KMaxOpenConnections( 100 ); /** * how many noderefs to send automatically after peer has * connected. Noderef with ipv4+ipv6 as compressed json is ~100bytes so 300 * mean some 30 kilobytes -> can handle. */ static const int KNumberOfNodesToSendToEachPeer ( 300 ) ; /** * how many classified ads to send to remote peer without * the peer asking. */ static const int KNumberOfClassifiedAdsToSendToEachPeer ( 300 ) ; /** * max size of single published item */ static const quint32 KMaxProtocolItemSize ( 1024*1024*2 ) ; /** *Т node may advertise itself in local ethernet segment with broadcast. * the port where ads are sent is this */ static const quint16 KBroadCastAdvertismentPort ( 23432 ) ; #endif /* CA_PROTOCOL_H */ classified-ads-0.13/net/protocol_message_formatter.cpp000066400000000000000000001073131331670245300232430ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2016. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef WIN32 #define NOMINMAX #include #endif #include "protocol_message_formatter.h" #include #ifndef WIN32 #include "arpa/inet.h" #endif #include "../util/jsonwrapper.h" #include "node.h" #include "connection.h" #include "../log.h" #include "../datamodel/const.h" #include "../datamodel/searchmodel.h" #include "../datamodel/voicecall.h" #include "../datamodel/model.h" #include "../datamodel/contentencryptionmodel.h" #include "../datamodel/cadbrecord.h" QByteArray ProtocolMessageFormatter::nodeGreeting(const Node& aNode) { QByteArray retval ; unsigned char ch ; ch = KProtocolVersion ;// (unsigned char) PROTOCOL_VERSION ; retval.append((const char *)&ch, 1) ; QVariant v ( aNode.asQVariant()) ; QByteArray nodeRefAsJson ( JSonWrapper::serialize(v) ) ; QLOG_STR(nodeRefAsJson) ; QByteArray nodeRefAsCompressedJson (qCompress( nodeRefAsJson )) ; nodeRefAsJson.clear() ; quint32 nodeRefSize = nodeRefAsCompressedJson.size() ; quint32 nodeRefSizeNetworkByteorder = htonl(nodeRefSize + 1 + sizeof(quint32)); retval.append((const char *)(&nodeRefSizeNetworkByteorder), sizeof(nodeRefSize)) ; retval.append(nodeRefAsCompressedJson) ; return retval ; } QByteArray ProtocolMessageFormatter::randomNumbers(void) { QByteArray retval ; unsigned char ch ; ch = KRandomNumbersPacket ; retval.append((const char *)&ch, 1) ; ch = 0 ; retval.append((const char *)&ch, 1) ; // placeholder for message length unsigned char numberOfBytesInMessage = 2 + ( rand() % 15 ) ; for ( unsigned char i = 0 ; i < numberOfBytesInMessage ; i++ ) { ch = ( rand() % 255 ) ; retval.append((const char *)&ch, 1) ; } // then count message len unsigned char messagelen = (unsigned char)(retval.length()) ; retval.replace(1,1, (const char *) &messagelen, 1) ; return retval ; } QByteArray ProtocolMessageFormatter::requestForBinaryBlob(const Hash& aHash) { QByteArray retval ; unsigned char ch ( KBinaryFileAtHash ) ; retval.append((const char *)&ch, 1) ; for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashNumberNetworkByteOrder (htonl(aHash.iHash160bits[i])) ; retval.append((const char *)(&hashNumberNetworkByteOrder), sizeof(quint32)) ; } return retval ; } QByteArray ProtocolMessageFormatter::requestForPrivateMessages(const Hash& aHash) { QByteArray retval ; unsigned char ch ( KPrivMessagesAtHash ) ; retval.append((const char *)&ch, 1) ; for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashNumberNetworkByteOrder (htonl(aHash.iHash160bits[i])) ; retval.append((const char *)(&hashNumberNetworkByteOrder), sizeof(quint32)) ; } return retval ; } QByteArray ProtocolMessageFormatter::requestForPrivateMessagesForProfile(const Hash& aHash,const quint32 aTimeOfOldestMsgToSend) { QByteArray retval ; unsigned char ch ( KPrivMessagesForProfile ) ; retval.append((const char *)&ch, 1) ; for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashNumberNetworkByteOrder (htonl(aHash.iHash160bits[i])) ; retval.append((const char *)(&hashNumberNetworkByteOrder), sizeof(quint32)) ; } quint32 tsInNetworkBO = htonl(aTimeOfOldestMsgToSend) ; retval.append((const char *)(&tsInNetworkBO), sizeof(quint32)) ; return retval ; } QByteArray ProtocolMessageFormatter::requestForProfileComments(const Hash& aCommentedProfileHash, const quint32 aTimeOfOldestMsgToSend) { QByteArray retval ; unsigned char ch ( KProfileCommentAtHash ) ; retval.append((const char *)&ch, 1) ; for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashNumberNetworkByteOrder (htonl(aCommentedProfileHash.iHash160bits[i])) ; retval.append((const char *)(&hashNumberNetworkByteOrder), sizeof(quint32)) ; } quint32 tsInNetworkBO = htonl(aTimeOfOldestMsgToSend) ; retval.append((const char *)(&tsInNetworkBO), sizeof(quint32)) ; return retval ; } QByteArray ProtocolMessageFormatter::requestForUserProfileComment(const Hash& aIndividualCommentHash) { QByteArray retval ; unsigned char ch ( KSingleProfileCommentAtHash ) ; retval.append((const char *)&ch, 1) ; for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashNumberNetworkByteOrder (htonl(aIndividualCommentHash.iHash160bits[i])) ; retval.append((const char *)(&hashNumberNetworkByteOrder), sizeof(quint32)) ; } return retval ; } QByteArray ProtocolMessageFormatter::requestForNodesAroundHash(const Hash& aHash) { QByteArray retval ; unsigned char ch ( KNodesAroundHash ) ; retval.append((const char *)&ch, 1) ; for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashNumberNetworkByteOrder (htonl(aHash.iHash160bits[i])) ; retval.append((const char *)(&hashNumberNetworkByteOrder), sizeof(quint32)) ; } return retval ; } QByteArray ProtocolMessageFormatter::requestForUserProfile(const Hash& aHash) { QByteArray retval ; unsigned char ch ( KProfileAtHash ) ; retval.append((const char *)&ch, 1) ; for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashNumberNetworkByteOrder (htonl(aHash.iHash160bits[i])) ; retval.append((const char *)(&hashNumberNetworkByteOrder), sizeof(quint32)) ; } return retval ; } QByteArray ProtocolMessageFormatter::requestForClassifiedAd(const Hash& aHash) { QByteArray retval ; unsigned char ch ( KClassifiedAdAtHash ) ; retval.append((const char *)&ch, 1) ; for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashNumberNetworkByteOrder (htonl(aHash.iHash160bits[i])) ; retval.append((const char *)(&hashNumberNetworkByteOrder), sizeof(quint32)) ; } return retval ; } QByteArray ProtocolMessageFormatter::requestForAdsClassified(const Hash& aHashOfClassification, const quint32 aStartingTimestamp , const quint32 aEndingTimestamp ) { QByteArray retval ; unsigned char ch ( KAdsClassifiedAtHash ) ; retval.append((const char *)&ch, 1) ; for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashNumberNetworkByteOrder (htonl(aHashOfClassification.iHash160bits[i])) ; retval.append((const char *)(&hashNumberNetworkByteOrder), sizeof(quint32)) ; } const quint32 startingTimestampNetworkBO(htonl(aStartingTimestamp)) ; const quint32 endingTimestampNetworkBO(htonl(aEndingTimestamp)) ; retval.append((const char *)(&startingTimestampNetworkBO), sizeof(quint32)) ; retval.append((const char *)(&endingTimestampNetworkBO), sizeof(quint32)) ; return retval ; } QByteArray ProtocolMessageFormatter::contentPublish(const unsigned char aContentMagicNumber, const Hash& aContentHash, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const QByteArray& aSigningKey, bool aIsContentEncrypted, bool aIsContentCompressed, quint32 aTimeStamp) { QByteArray retval ; return doContentSendOrPublish(retval, aContentMagicNumber, aContentHash, aContent, aSignature, aBangPath, aSigningKey, aIsContentEncrypted, aIsContentCompressed, aTimeStamp, true) ; } QByteArray ProtocolMessageFormatter::contentSend(const unsigned char aContentMagicNumber, const Hash& aContentHash, const QByteArray& aContent, const QByteArray& aSignature, const QByteArray& aSigningKey, bool aIsContentEncrypted, bool aIsContentCompressed, quint32 aTimeStamp) { QList aDummyBangPath ; QByteArray retval ; return doContentSendOrPublish(retval, aContentMagicNumber, aContentHash, aContent, aSignature, aDummyBangPath, aSigningKey, aIsContentEncrypted, aIsContentCompressed, aTimeStamp, false) ; } QByteArray ProtocolMessageFormatter::doContentSendOrPublish(QByteArray& retval, const unsigned char aContentMagicNumber, const Hash& aContentHash, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const QByteArray& aSigningKey, bool aIsContentEncrypted, bool aIsContentCompressed, quint32 aTimeStamp, bool aIsPublish) { // ok, lets decide here the layout of publish.. // first magick number telling what it is. // then bangpath 5 items and if not all 5 are filled, // the remaining ones are filled with zeroes. // then content hash, 5*32 bytes // then length of the actual data, followed by the actual data // then length of the signature, followeds by the signature. // then length of the signingkey, followed by the key // then flags, one unsigned char. // * if bit 1 is up, it means that content is encrypted. // * if bit 2 is up, it means that content is compressed. // then time when content was published. For most of the content // the time of publish may be deduced from content itself but in some // case like the private profile the date of publish is hidden from // us -> this time practically acts as a version-number for the // content. LOG_STR2("content len = %d", (int)aContent.length()) ; LOG_STR2("signature len = %d", (int)aSignature.length()) ; if ( aIsPublish ) { for ( int i = 0 ; i < aBangPath.size() ; i++ ) { LOG_STR2("Bangpath contains %u", aBangPath[i]) ; } } unsigned char ch ; ch = aContentMagicNumber ; retval.append((const char *)&ch, 1) ; quint32 bPathNumberNetworkByteorder ; if ( aIsPublish ) { if ( aBangPath.size() >= 1 ) { bPathNumberNetworkByteorder = htonl(aBangPath[0]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; if ( aBangPath.size() >= 2 ) { bPathNumberNetworkByteorder = htonl(aBangPath[1]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; if ( aBangPath.size() >= 3 ) { bPathNumberNetworkByteorder = htonl(aBangPath[2]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; if ( aBangPath.size() >= 4 ) { bPathNumberNetworkByteorder = htonl(aBangPath[3]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; if ( aBangPath.size() >= 5 ) { bPathNumberNetworkByteorder = htonl(aBangPath[4]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; } // now has 5 numbers as bangpath, then put hash for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashBitsNetworkBO ( htonl( aContentHash.iHash160bits[i] ) ) ; retval.append((const char *)(&hashBitsNetworkBO), sizeof(quint32)) ; } // after hash, the size of content: quint32 lengthNetworkByteorder ( htonl( (quint32)(aContent.size()) ) ) ; retval.append((const char *)(&lengthNetworkByteorder), sizeof(quint32)) ; // followed by content: retval.append(aContent) ; lengthNetworkByteorder = htonl( (quint32)(aSignature.size()) ) ; retval.append((const char *)(&lengthNetworkByteorder), sizeof(quint32)) ; retval.append(aSignature) ; // followed by signing key lengthNetworkByteorder = htonl( (quint32)(aSigningKey.size()) ) ; retval.append((const char *)(&lengthNetworkByteorder), sizeof(quint32)) ; retval.append(aSigningKey) ; unsigned char flags ( 0 ) ; if ( aIsContentEncrypted ) { flags = flags | 1 ; } if ( aIsContentCompressed ) { flags = flags | 2 ; } retval.append((const char *)&flags, sizeof(unsigned char)) ; quint32 timestampNetworkBO ( htonl( aTimeStamp ) ) ; #ifndef WIN32 #ifdef DEBUG time_t contentTime_T ( aTimeStamp ) ; char timeBuf[40] ; LOG_STR2("Content time of publish at send: %s", ctime_r(&contentTime_T,timeBuf)) ; #endif #endif retval.append((const char *)×tampNetworkBO, sizeof(quint32)) ; // and that's all folks return retval ; } QByteArray ProtocolMessageFormatter::privMsgPublish(const Hash& aContentHash, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const Hash& aDestination, const Hash& aRecipient, quint32 aTimeStamp ) { for ( int i = 0 ; i < aBangPath.size() ; i++ ) { LOG_STR2("Bangpath if privmsg contains %u", aBangPath[i]) ; } unsigned char ch ( KPrivMessagePublish ) ; QByteArray retval ; retval.append((const char *)&ch, 1) ; quint32 bPathNumberNetworkByteorder ; if ( aBangPath.size() >= 1 ) { bPathNumberNetworkByteorder = htonl(aBangPath[0]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; if ( aBangPath.size() >= 2 ) { bPathNumberNetworkByteorder = htonl(aBangPath[1]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; if ( aBangPath.size() >= 3 ) { bPathNumberNetworkByteorder = htonl(aBangPath[2]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; if ( aBangPath.size() >= 4 ) { bPathNumberNetworkByteorder = htonl(aBangPath[3]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; if ( aBangPath.size() >= 5 ) { bPathNumberNetworkByteorder = htonl(aBangPath[4]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; // now has 5 numbers as bangpath, then put hash for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashBitsNetworkBO ( htonl( aContentHash.iHash160bits[i] ) ) ; retval.append((const char *)(&hashBitsNetworkBO), sizeof(quint32)) ; } // after hash, the size of content: quint32 lengthNetworkByteorder ( htonl( (quint32)(aContent.size()) ) ) ; retval.append((const char *)(&lengthNetworkByteorder), sizeof(quint32)) ; // followed by content: retval.append(aContent) ; lengthNetworkByteorder = htonl( (quint32)(aSignature.size()) ) ; retval.append((const char *)(&lengthNetworkByteorder), sizeof(quint32)) ; retval.append(aSignature) ; quint32 timestampNetworkBO ( htonl( aTimeStamp ) ) ; #ifndef WIN32 #ifdef DEBUG time_t contentTime_T ( aTimeStamp ) ; char timebuf[40] ; LOG_STR2("Private message time of publish at send: %s", ctime_r(&contentTime_T,timebuf)) ; #endif #endif retval.append((const char *)×tampNetworkBO, sizeof(quint32)) ; // then destination node: for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashBitsNetworkBO ( htonl( aDestination.iHash160bits[i] ) ) ; retval.append((const char *)(&hashBitsNetworkBO), sizeof(quint32)) ; } // then recipient: for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashBitsNetworkBO ( htonl( aRecipient.iHash160bits[i] ) ) ; retval.append((const char *)(&hashBitsNetworkBO), sizeof(quint32)) ; } return retval ; } QByteArray ProtocolMessageFormatter::privMsgSend(const Hash& aContentHash, const QByteArray& aContent, const QByteArray& aSignature, const Hash& aDestination, const Hash& aRecipient, quint32 aTimeStamp ) { unsigned char ch ( KPrivMessageSend ) ; QByteArray retval ; retval.append((const char *)&ch, 1) ; //first thing in send is hash of the message for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashBitsNetworkBO ( htonl( aContentHash.iHash160bits[i] ) ) ; retval.append((const char *)(&hashBitsNetworkBO), sizeof(quint32)) ; } // after hash, the size of content: quint32 lengthNetworkByteorder ( htonl( (quint32)(aContent.size()) ) ) ; retval.append((const char *)(&lengthNetworkByteorder), sizeof(quint32)) ; // followed by content: retval.append(aContent) ; lengthNetworkByteorder = htonl( (quint32)(aSignature.size()) ) ; retval.append((const char *)(&lengthNetworkByteorder), sizeof(quint32)) ; retval.append(aSignature) ; quint32 timestampNetworkBO ( htonl( aTimeStamp ) ) ; #ifndef WIN32 #ifdef DEBUG time_t contentTime_T ( aTimeStamp ) ; char timebuf[40] ; LOG_STR2("Private message time of publish at send: %s", ctime_r(&contentTime_T,timebuf)) ; #endif #endif retval.append((const char *)×tampNetworkBO, sizeof(quint32)) ; // then destination node: for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashBitsNetworkBO ( htonl( aDestination.iHash160bits[i] ) ) ; retval.append((const char *)(&hashBitsNetworkBO), sizeof(quint32)) ; } // then recipient: for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashBitsNetworkBO ( htonl( aRecipient.iHash160bits[i] ) ) ; retval.append((const char *)(&hashBitsNetworkBO), sizeof(quint32)) ; } return retval ; } QByteArray ProtocolMessageFormatter::replyToAdsClassified(const Hash& aClassificationHash, const QList >& aListOfAds ) { QByteArray retval ; retval.append((const char *)&KListOfAdsClassifiedAtHash, sizeof(unsigned char)) ; for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashBitsNetworkBO ( htonl( aClassificationHash.iHash160bits[i] ) ) ; retval.append((const char *)(&hashBitsNetworkBO), sizeof(quint32)) ; } quint32 numberArticles ( htonl( aListOfAds.size() ) ) ; retval.append((const char *)(&numberArticles), sizeof(quint32)) ; for ( int k = 0 ; k < aListOfAds.size() ; k++ ) { for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashBitsNetworkBO ( htonl( aListOfAds[k].first.iHash160bits[i] ) ) ; retval.append((const char *)(&hashBitsNetworkBO), sizeof(quint32)) ; } quint32 ts ( htonl( aListOfAds[k].second ) ) ; retval.append((const char *)(&ts), sizeof(quint32)) ; } return retval ; } QByteArray ProtocolMessageFormatter::searchSend(const QString& aSearch, bool aSearchAds, bool aSearchProfiles, bool aSearchComments, const Hash& aSearchIdentifier) { QByteArray retval ; retval.append((const char *)&KSearchRequest, sizeof(unsigned char)) ; quint32 searchflags ( 0x0 ) ; if ( aSearchAds ) { searchflags = searchflags | 0x01 ; } if ( aSearchProfiles ) { searchflags = searchflags | 0x01 << 1 ; } if ( aSearchComments ) { searchflags = searchflags | 0x01 << 2 ; } quint32 flagBitsNetworkBO ( htonl( searchflags ) ) ; retval.append((const char *)(&flagBitsNetworkBO), sizeof(quint32)) ; quint32 searchIdNetworkBO ( htonl( aSearchIdentifier.iHash160bits[0] ) ); retval.append((const char *)(&searchIdNetworkBO), sizeof(quint32)) ; QByteArray searchStringUtf8 ; searchStringUtf8.append(reinterpret_cast(aSearch.toUtf8().constData())) ; if ( searchStringUtf8.size() > 20*1024 ) { // this is ridiculous searchStringUtf8 = QString("bananas").toUtf8() ; } quint32 sizeNetworkBO ( htonl(searchStringUtf8.size()) ) ; retval.append((const char *)(&sizeNetworkBO), sizeof(quint32)) ; retval.append(searchStringUtf8) ; return retval ; } QByteArray ProtocolMessageFormatter::searchResultsSend(const QList& aResults, quint32 aSearchId) { // search results are actually plain json text. // there is magic, length of the json and then // the actual json. QByteArray retval ; retval.append((const char *)&KSearchResults, sizeof(unsigned char)) ; const QVariant toplevel ( SearchModel::serializeSearchResults(aResults, aSearchId) ) ; const QByteArray resultBytes ( JSonWrapper::serialize(toplevel) ) ; if ( resultBytes.size() > 0 ) { quint32 sizeNetworkBO ( htonl(resultBytes.size()) ) ; retval.append((const char *)(&sizeNetworkBO), sizeof(quint32)) ; retval.append(resultBytes) ; } else { retval.clear() ; } return retval ; } QByteArray ProtocolMessageFormatter::dbSearchTerms(const CaDbRecord::SearchTerms aSearchTerms) { QByteArray retval ; retval.append((const char *)&KDbRecordSearch, sizeof(unsigned char)) ; const QByteArray resultBytes ( aSearchTerms.asJSon() ) ; if ( resultBytes.size() > 0 ) { quint32 sizeNetworkBO ( htonl(resultBytes.size()) ) ; retval.append((const char *)(&sizeNetworkBO), sizeof(quint32)) ; retval.append(resultBytes) ; } else { retval.clear() ; } return retval ; } QByteArray ProtocolMessageFormatter::voiceCall(const VoiceCall& aCall, MController& aController, const Hash& aSelectedProfile, bool aDoSign ) { QByteArray retval ; if ( aCall.iOkToProceed ) { retval.append((const char *)&KVoiceCallStart, sizeof(unsigned char)) ; } else { retval.append((const char *)&KVoiceCallEnd, sizeof(unsigned char)) ; } const QByteArray resultBytes ( aCall.asJSon() ) ; if ( resultBytes.size() > 0 ) { quint32 sizeNetworkBO ( htonl(resultBytes.size()) ) ; retval.append((const char *)(&sizeNetworkBO), sizeof(quint32)) ; retval.append(resultBytes) ; QByteArray signature ; if ( aDoSign ) { if ( aController.model().contentEncryptionModel().sign( aSelectedProfile, resultBytes, signature ) == 0 ) { // 0 is success quint32 signatureSizeNetworkBO ( htonl(signature.size()) ) ; retval.append((const char *)(&signatureSizeNetworkBO), sizeof(quint32)) ; retval.append(signature) ; } else { QLOG_STR("ERROR: Voice call signing failed") ; retval.clear() ; } } else { // put in a zero-size signature quint32 signatureSizeNetworkBO ( 0 ) ; retval.append((const char *)(&signatureSizeNetworkBO), sizeof(quint32)) ; } } else { retval.clear() ; } return retval ; } QByteArray ProtocolMessageFormatter::voiceCallRtData(quint32 aCallId, quint32 aSeqNo, VoiceCallEngine::PayloadType aPayloadType, const QByteArray& aPayload ) { QByteArray retval ; switch ( aPayloadType ) { case VoiceCallEngine::Audio: { retval.append((const char *)&KRealtimeData, sizeof(unsigned char)) ; retval.append((const char *)&KRTDataAudioSubtype, sizeof(unsigned char)) ; quint32 callIdNetworkBO ( htonl(aCallId ) ) ; retval.append((const char *)(&callIdNetworkBO), sizeof(quint32)) ; quint32 seqNoNetworkBO ( htonl(aSeqNo ) ) ; retval.append((const char *)(&seqNoNetworkBO), sizeof(quint32)) ; quint32 payloadSizeNetworkBO ( htonl(aPayload.size() ) ) ; retval.append((const char *)(&payloadSizeNetworkBO), sizeof(quint32)) ; retval.append(aPayload) ; } break ; default: // do not append anything, zero-size requests are not processed break ; } return retval ; } QByteArray ProtocolMessageFormatter::profileCommentPublish(const Hash& aContentHash, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const Hash& aProfileCommented, quint32 aTimeStamp, quint32 aFlags ) { return doCommentSendOrPublish(aContentHash, aContent, aSignature, aBangPath, aProfileCommented, aTimeStamp, aFlags, true ); } QByteArray ProtocolMessageFormatter::profileCommentSend(const Hash& aContentHash, const QByteArray& aContent, const QByteArray& aSignature, const Hash& aProfileCommented, quint32 aTimeStamp, quint32 aFlags ) { QList dummyBangPath; return doCommentSendOrPublish(aContentHash, aContent, aSignature, dummyBangPath, aProfileCommented, aTimeStamp, aFlags, false ); } QByteArray ProtocolMessageFormatter::doCommentSendOrPublish(const Hash& aContentHash, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const Hash& aProfileCommented, quint32 aTimeStamp, quint32 aFlags, bool aIsPublish) { // ok, lets decide here the layout of comment publish.. // first magick number telling what it is. // then bangpath 5 items and if not all 5 are filled, // the remaining ones are filled with zeroes. // then content hash, 5*32 bytes // then commented profile hash, 5*32 bytes // then length of the actual data, followed by the actual data // then length of the signature, followeds by the signature. // then flags, one unsigned 32-bit. // * if bit 1 is up, it means that content is encrypted. // then time when content was published. unsigned char ch ( aIsPublish ? KProfileCommentPublish : KProfileCommentSend ) ; QByteArray retval ; retval.append((const char *)&ch, 1) ; if ( aIsPublish ) { // if in send-mode, just omit bangpath quint32 bPathNumberNetworkByteorder ; if ( aBangPath.size() >= 1 ) { bPathNumberNetworkByteorder = htonl(aBangPath[0]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; if ( aBangPath.size() >= 2 ) { bPathNumberNetworkByteorder = htonl(aBangPath[1]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; if ( aBangPath.size() >= 3 ) { bPathNumberNetworkByteorder = htonl(aBangPath[2]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; if ( aBangPath.size() >= 4 ) { bPathNumberNetworkByteorder = htonl(aBangPath[3]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; if ( aBangPath.size() >= 5 ) { bPathNumberNetworkByteorder = htonl(aBangPath[4]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; } // now has 5 numbers as bangpath, then put hash of content for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashBitsNetworkBO ( htonl( aContentHash.iHash160bits[i] ) ) ; retval.append((const char *)(&hashBitsNetworkBO), sizeof(quint32)) ; } // now has 5 numbers as bangpath+content hash, then fingerprint of commented profile for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashBitsNetworkBO ( htonl( aProfileCommented.iHash160bits[i] ) ) ; retval.append((const char *)(&hashBitsNetworkBO), sizeof(quint32)) ; } // now has bangpath+content hash+profile hash, follow the content+signature: // after hash, the size of content: quint32 lengthNetworkByteorder ( htonl( (quint32)(aContent.size()) ) ) ; retval.append((const char *)(&lengthNetworkByteorder), sizeof(quint32)) ; // followed by content: retval.append(aContent) ; lengthNetworkByteorder = htonl( (quint32)(aSignature.size()) ) ; retval.append((const char *)(&lengthNetworkByteorder), sizeof(quint32)) ; retval.append(aSignature) ; // then flags: quint32 flagsNetworkByteOrder ( htonl(aFlags) ) ; retval.append((const char *)(&flagsNetworkByteOrder), sizeof(quint32)) ; // and finally timestamp of publish quint32 timestampNetworkBO ( htonl( aTimeStamp ) ) ; retval.append((const char *)×tampNetworkBO, sizeof(quint32)) ; return retval ; } QByteArray ProtocolMessageFormatter::dbRecordPublish(const CaDbRecord& aRecord, const QList& aBangPath) { return doDbRecordPublishOrSend(aRecord,aBangPath, true) ; } QByteArray ProtocolMessageFormatter::dbRecordSend(const CaDbRecord& aRecord) { QList dummyBand ; return doDbRecordPublishOrSend(aRecord,dummyBand, false) ; } QByteArray ProtocolMessageFormatter::doDbRecordPublishOrSend(const CaDbRecord& aRecord, const QList& aBangPath, bool aIsPublish ) { unsigned char ch ( aIsPublish ? KDbRecordPublish : KDbRecordSend ) ; QByteArray retval ; retval.append((const char *)&ch, 1) ; if ( aIsPublish ) { // if in send-mode, just omit bangpath quint32 bPathNumberNetworkByteorder ; if ( aBangPath.size() >= 1 ) { bPathNumberNetworkByteorder = htonl(aBangPath[0]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; if ( aBangPath.size() >= 2 ) { bPathNumberNetworkByteorder = htonl(aBangPath[1]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; if ( aBangPath.size() >= 3 ) { bPathNumberNetworkByteorder = htonl(aBangPath[2]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; if ( aBangPath.size() >= 4 ) { bPathNumberNetworkByteorder = htonl(aBangPath[3]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; if ( aBangPath.size() >= 5 ) { bPathNumberNetworkByteorder = htonl(aBangPath[4]); } else { bPathNumberNetworkByteorder = 0 ; } retval.append((const char *)(&bPathNumberNetworkByteorder), sizeof(quint32)) ; } // now has 5 numbers as bangpath, then put hash of content for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashBitsNetworkBO ( htonl( aRecord.iRecordId.iHash160bits[i] ) ) ; retval.append((const char *)(&hashBitsNetworkBO), sizeof(quint32)) ; } // then put hash of collection for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashBitsNetworkBO ( htonl( aRecord.iCollectionId.iHash160bits[i] ) ) ; retval.append((const char *)(&hashBitsNetworkBO), sizeof(quint32)) ; } // then put hash of sender for ( int i = 0 ; i < Hash::KNumberOfIntsInHash ; i++ ) { quint32 hashBitsNetworkBO ( htonl( aRecord.iSenderHash.iHash160bits[i] ) ) ; retval.append((const char *)(&hashBitsNetworkBO), sizeof(quint32)) ; } // then len of searchphrase.. lets first have the phrase in Utf8 const QByteArray searchPhraseUtf8 ( aRecord.iSearchPhrase.toUtf8() ) ; const quint32 searchPhraseUtf8Len(searchPhraseUtf8.length()) ; const quint32 searchPhraseUtf8LenNetworkBO(htonl(searchPhraseUtf8Len)) ; retval.append((const char *)(&searchPhraseUtf8LenNetworkBO), sizeof(quint32)) ; if ( searchPhraseUtf8Len > 0 ) { retval.append(searchPhraseUtf8) ; } // searchnumber is a bit problematic, as it is 64 bit signed. // there is not only byte-order issue, in theory there could // be platforms where the sign-bit is some funny location. // lets do performance-sub-optimal way by printing the number // into a string and putting that into byte-stream. const QByteArray searchNumberUtf8 ( QString::number(aRecord.iSearchNumber ).toUtf8() ) ; const quint32 searchNumberUtf8Len(searchNumberUtf8.length()) ; const quint32 searchNumberUtf8LenNetworkBO(htonl(searchNumberUtf8Len)) ; retval.append((const char *)(&searchNumberUtf8LenNetworkBO), sizeof(quint32)) ; if ( searchNumberUtf8Len > 0 ) { retval.append(searchNumberUtf8) ; } // then actual record data. it may have zero len const quint32 dataLen(aRecord.iData.length()) ; const quint32 dataLenNetworkBO(htonl(dataLen)) ; retval.append((const char *)(&dataLenNetworkBO), sizeof(quint32)) ; if ( dataLen > 0 ) { retval.append(aRecord.iData) ; } // then signature data. should not have zero len const quint32 signatureLen(aRecord.iSignature.length()) ; if ( signatureLen == 0 ) { QLOG_STR("Trying to publish record with no signature!!") ; return QByteArray() ; } const quint32 signatureLenNetworkBO(htonl(signatureLen)) ; retval.append((const char *)(&signatureLenNetworkBO), sizeof(quint32)) ; if ( signatureLen > 0 ) { retval.append(aRecord.iSignature) ; } // time of publish quint32 timestampNetworkBO ( htonl( aRecord.iTimeOfPublish ) ) ; retval.append((const char *)×tampNetworkBO, sizeof(quint32)) ; // flags. currently includes only encryption bit. quint32 flags ( htonl( aRecord.iIsEncrypted ? 1 : 0 ) ) ; retval.append((const char *)&flags, sizeof(quint32)) ; return retval ; } classified-ads-0.13/net/protocol_message_formatter.h000066400000000000000000000410531331670245300227060ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PROTOCOL_MESSAGE_FORMATTER_H #define PROTOCOL_MESSAGE_FORMATTER_H #include "protocol.h" #include #include #include "../datamodel/searchmodel.h" #include "voicecallengine.h" // for payload type class Connection ; class Node ; class VoiceCall ; // from datamodel class CaDbRecord ; /** * @brief This class produces items sent to peers over network. * * Class that contains (static) methods for producing * byte-streams of various messages. */ class ProtocolMessageFormatter { public: /** * method for producing node greeting message * @param aNode is greeting about the node * concerned, usually "this" node * @return bytearray that is ready to be sent * over socket so that other end will * understand. */ static QByteArray nodeGreeting(const Node& aNode) ; /** * method for producing random number message * @return bytearray that is ready to be sent * over socket so that other end will * understand. */ static QByteArray randomNumbers(void) ; /** * method for producing nodegreeting request message * @return bytearray that is ready to be sent * over socket so that other end will * understand. */ static QByteArray requestForNodesAroundHash (const Hash& aHash) ; /** * method for producing binary blob request message * @return bytearray that is ready to be sent * over socket so that other end will * understand. */ static QByteArray requestForBinaryBlob(const Hash& aHash) ; /** * method for producing operator profile request message * @return bytearray that is ready to be sent * over socket so that other end will * understand. */ static QByteArray requestForUserProfile(const Hash& aHash) ; /** * method for producing message to other node that asks * it to send an individual profile comment * @return bytearray that is ready to be sent * over socket so that other end will * understand. */ static QByteArray requestForUserProfileComment(const Hash& aIndividualCommentHash) ; /** * method for producing operator classified ad request message * @return bytearray that is ready to be sent * over socket so that other end will * understand. */ static QByteArray requestForClassifiedAd(const Hash& aHash) ; /** * method for sending request to other nodes regarding private * messages having given hash * @param aProfileHash hash of message that is to be found * @return bytearray that is ready to be sent * over socket so that other end will * understand. */ static QByteArray requestForPrivateMessages(const Hash& aMessageHash) ; /** * method for sending request to other nodes regarding private * messages destined to given profile * @param aProfileHash hash of profile whose messages are searched * @param aTimeOfOldesMsgToSend since when to send msgs from * @return bytearray that is ready to be sent * over socket so that other end will * understand. */ static QByteArray requestForPrivateMessagesForProfile(const Hash& aProfileHash, const quint32 aTimeOfOldestMsgToSend) ; /** * method for sending request to other nodes regarding comments * about specified profile. in practice parser (upon receipt) will * make calls that check not only for new comments, but also * if there has been an update at the profile itself. Call to this * method is result of RequestForProfilePoll being put into network * request queue. * * @param aCommentedProfileHash hash of profile whose comments are searched * @param aTimeOfOldesMsgToSend since when to send comments from * @return bytearray that is ready to be sent * over socket so that other end will * understand. */ static QByteArray requestForProfileComments(const Hash& aCommentedProfileHash, const quint32 aTimeOfOldestMsgToSend) ; /** * Classified ads have classification, the "intent-object-location" * triplet shown in UI and it also has a hash. When user chooses * this triplet, it might be nice to query surrounding nodes * about classified ads regarding that triplet. This method is for * sending such a request. Its response will contain hashes of * the ads in that classification, possibly followed by the articles * too. * @param aHashOfClassification hash calculated over * "intent-object-location" string * @param aStartingTimestamp possible starting timestamp for the articles. * Currently not implemented in protocol, sender * will limit the number of ads it sends * @param aEndingTimestamp possible ending timestamp for the articles * Currently not implemented in protocol, sender * will limit the number of ads it sends * @return bytearray that is ready to be sent * over socket so that other end will * understand. */ static QByteArray requestForAdsClassified(const Hash& aHashOfClassification, const quint32 aStartingTimestamp, const quint32 aEndingTimestamp) ; /** * method for producing byte-array containing (some) published content * * @param aContentMagicNumber tells what kind of item this is. For * example KProfilePublish (from protocol.h) if we're publishing * a profile here * @param aContentHash hash of the content to be published. Reason this * Hash here is given explicitly is that different * object types have different hashing methods - for * binary blob it is the content itself that makes the * hash but for profile it is the fingerprint of the * signing key etc. * @param aContent actual content * @param aSignature signature verifying aContent * @param aBangPath list of low-order bits of hosts where this content has * already been seen, 5 at max * @param aSigningKey contains public encryption key used to sign the * content ; while it over time will be mostly overhead * it anyway allows reader to reach the poster that * is great advantage over some overhead.. * @param aIsContentEncrypted is true of aContent is protected with * encryption * @param aIsContentCompressed is true of aContent is inside qCompress. * if both compress+encryption, naturally * the content is first compressed, only * after that encrypted * @param aTimeStamp may be given for content where actual timestamp * is inside encryption * * @return bytearray that is ready to be sent * over socket so that other end will * understand. */ static QByteArray contentPublish(const unsigned char aContentMagicNumber, const Hash& aContentHash, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const QByteArray& aSigningKey, bool aIsContentEncrypted, bool aIsContentCompressed, quint32 aTimeStamp ) ; /** * separate publish-formatter for private messages as they're * quite different from rest of the content */ static QByteArray privMsgPublish(const Hash& aContentHash, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const Hash& aDestination, const Hash& aRecipient, quint32 aTimeStamp ) ; /** * separate send-formatter for private messages as they're * quite different from rest of the content. Similar to publish * but no bangpath */ static QByteArray privMsgSend(const Hash& aContentHash, const QByteArray& aContent, const QByteArray& aSignature, const Hash& aDestination, const Hash& aRecipient, quint32 aTimeStamp ) ; /** * separate publish-formatter for profile comments as they're * quite different from rest of the content. in case of comments * for public profiles they behave a bit like classified ads * but comments commenting private profiles need to behave * more-or-less like private messages as that's what they are ; * private messages with more than 1 recipient .. or it is * possible to have private profile with 0 readers and then * comment it self. monologue ensues. */ static QByteArray profileCommentPublish(const Hash& aContentHash, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const Hash& aProfileCommented, quint32 aTimeStamp, quint32 aFlags ) ; /** * separate send-formatter for profile comment as they're * quite different from rest of the content. */ static QByteArray profileCommentSend(const Hash& aContentHash, const QByteArray& aContent, const QByteArray& aSignature, const Hash& aProfileCommented, quint32 aTimeStamp, quint32 aFlags ) ; /** * Method that constructs byte-stream from db record for publish purpose. * @param aRecord is the record * @param aBangPath short list of nodes where the record * came to us, will be included in byte-stream */ static QByteArray dbRecordPublish(const CaDbRecord& aRecord, const QList& aBangPath) ; /** * Method that constructs byte-stream from db record for send purpose. * @param aRecord is the record */ static QByteArray dbRecordSend(const CaDbRecord& aRecord) ; /** * this is almost same as @ProtocolMessageFormatter.contentPublish * but is reply to another node regarding request of content, * not users own publishing so this has no bangpath but otherwise * this behaves in about same way. */ static QByteArray contentSend(const unsigned char aContentMagicNumber, const Hash& aContentHash, const QByteArray& aContent, const QByteArray& aSignature, const QByteArray& aSigningKey, bool aIsContentEncrypted, bool aIsContentCompressed, quint32 aTimeStamp ) ; static QByteArray replyToAdsClassified(const Hash& aClassificationHash, const QList >& aListOfAds ) ; /** * method for formatting a network search query */ static QByteArray searchSend(const QString& aSearch, bool aSearchAds, bool aSearchProfiles, bool aSearchComments, const Hash& aSearchIdentifier) ; /** * method for formatting network search results */ static QByteArray searchResultsSend(const QList& aResults, quint32 aSearchId) ; /** * method for serializing a database search so that * it can be sent to other nodes */ static QByteArray dbSearchTerms(const CaDbRecord::SearchTerms aSearchTerms) ; /** * Method for formatting voice call status object * @param aCall is the call status object * @param aController is application controller instance * @param aSelectedProfile is hash of the profile who will sign * the serialized object * @param aDoSign if set to true, normal signature will be added. * If false, zero-len signature will be used. * @return serialized bytes of call status */ static QByteArray voiceCall(const VoiceCall& aCall, MController& aController, const Hash& aSelectedProfile, bool aDoSign = true ) ; /** * Method for formatting voice call real-time data like audio * * @param aCallId call (stream) identifier * @param aSeqNo sequence number of payload in stream * @param aPayloadType type payload * @param aPayload actual payload bytes to send, like call audio * @return serialized bytes of call status */ static QByteArray voiceCallRtData(quint32 aCallId, quint32 aSeqNo, VoiceCallEngine::PayloadType aPayloadType, const QByteArray& aPayload ) ; private: /** * workhorse of @ProtocolMessageFormatter.contentPublish and * @ProtocolMessageFormatter.contentSend has parameter * telling which action to take */ static QByteArray doContentSendOrPublish(QByteArray& retval, const unsigned char aContentMagicNumber, const Hash& aContentHash, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const QByteArray& aSigningKey, bool aIsContentEncrypted, bool aIsContentCompressed, quint32 aTimeStamp, bool aIsPublish) ; /** * workhorse of @ProtocolMessageFormatter.profileCommentPublish and * @ProtocolMessageFormatter.profileCommentSend has parameter * telling which action to take */ static QByteArray doCommentSendOrPublish(const Hash& aContentHash, const QByteArray& aContent, const QByteArray& aSignature, const QList& aBangPath, const Hash& aProfileCommented, quint32 aTimeStamp, quint32 aFlags, bool aIsPublish) ; /** * Workhorse-method that constructs byte-stream based on db record * publish- or send-operation. * @param aRecord is the record * @param aBangPath short list of nodes where the record * came to us, will be included in byte-stream * @param aIsPublish is set to false if record is merely sent. * If false, aBangPath is ignored and may be empty. */ static QByteArray doDbRecordPublishOrSend(const CaDbRecord& aRecord, const QList& aBangPath, bool aIsPublish ) ; } ; #endif classified-ads-0.13/net/protocol_message_parser.cpp000066400000000000000000002062371331670245300225410ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef WIN32 #define NOMINMAX #include #else #include "arpa/inet.h" #endif #include "protocol_message_parser.h" #include "../log.h" #include "../datamodel/mmodelprotocolinterface.h" #include "../datamodel/mnodemodelprotocolinterface.h" #include "../mcontroller.h" #include #include "../util/jsonwrapper.h" #include "../util/hash.h" #include "../datamodel/profilemodel.h" #include "../datamodel/binaryfilemodel.h" #include "../datamodel/camodel.h" #include "../datamodel/privmsgmodel.h" #include "../datamodel/profilecommentmodel.h" #include "../datamodel/searchmodel.h" #include "protocol_message_formatter.h" #include "../datamodel/voicecall.h" #include "../net/mvoicecallengine.h" #include "../datamodel/model.h" #include "../datamodel/contentencryptionmodel.h" #include "../datamodel/cadbrecord.h" #include "../datamodel/cadbrecordmodel.h" #include // std::numeric_limits ProtocolMessageParser::ProtocolMessageParser(MController &aController, MModelProtocolInterface &aModel) : iController(aController), iModel(aModel) { } bool ProtocolMessageParser::parseMessage(const QByteArray& aGoodFood, Connection& aConnection) { LOG_STR2("::parseMessage bytes %d", aGoodFood.size()) ; if ( aGoodFood.size() < 4 ) { return false ; // stupid check but but packet is obviously a bit short. } const unsigned char protocol_item_type = aGoodFood.at(0) ; switch ( protocol_item_type ) { case KProtocolVersion: // node greeting with protocol version 1 return parseMultipleNodeGreetingsV1(aGoodFood,aConnection ) ; break ; case KRandomNumbersPacket: LOG_STR2("Received random bytes %d", (int) aGoodFood.size()) ; // no need to parse further break ; case KNodesAroundHash: case KProfileAtHash: case KBinaryFileAtHash: case KClassifiedAdAtHash: case KPrivMessagesAtHash: case KPrivMessagesForProfile: case KProfileCommentAtHash: case KSingleProfileCommentAtHash: // peer wants node-refs around hash return parseRequestForObjectsAroundHash(aGoodFood,aConnection ) ; break ; case KProfilePublish: case KProfileSend: case KBinaryFilePublish: case KBinaryFileSend: case KClassifiedAdPublish: case KClassifiedAdSend: // peer just published a profile/blob/ca return parseContentPublishedOrSent(protocol_item_type,aGoodFood,aConnection ) ; break ; case KPrivMessagePublish: case KPrivMessageSend: return parsePrivMsgPublishedOrSent(protocol_item_type,aGoodFood,aConnection ) ; break ; case KProfileCommentPublish: case KProfileCommentSend: return parseProfileCommentPublishedOrSent(protocol_item_type,aGoodFood,aConnection ) ; break ; case KAdsClassifiedAtHash: return parseAdsClassifiedAtHash(aGoodFood,aConnection ) ; break ; case KListOfAdsClassifiedAtHash: return parseListOfAdsClassifiedAtHash(aGoodFood,aConnection ) ; break ; case KSearchRequest: return parseSearchRequest(aGoodFood,aConnection ) ; break ; case KSearchResults: return parseSearchResults(aGoodFood,aConnection ) ; break ; case KVoiceCallStart: return parseVoiceCall(aGoodFood,aConnection ) ; break ; case KVoiceCallEnd: return parseVoiceCall(aGoodFood,aConnection ) ; break ; case KRealtimeData: return parseCallRtData( aGoodFood, aConnection) ; break ; case KDbRecordPublish: case KDbRecordSend: return parseDbRecord(aGoodFood, aConnection) ; break ; case KDbRecordSearch: return parseDbRecordSearchTerms(aGoodFood, aConnection) ; break ; case KFutureUse4: case KFutureUse5: case KFutureUse6: LOG_STR2("Unhandled future-use item id %d", (int) protocol_item_type) ; break ; default: // unknown message type LOG_STR2("Unhandled protocol item id %d", (int) protocol_item_type) ; break ; } return true ; } bool ProtocolMessageParser::parseContentPublishedOrSent(const unsigned char aProtocolItemType, const QByteArray& aPublishedContent, const Connection &aConnection ) { LOG_STR2("ProtocolMessageParser::parseContentPublished type %d", (int) aProtocolItemType) ; bool retval = false ; // in publish there is // 1. magick // 2. bangpath of low-order bits of hosts // 3. content hash // 4. len of data (32bit) // 5. data // 6. len of signature (32bit) // 7. signature // 8. length if siging key used (32bit) // 9. signing key // 10. one unsigned char of flags, if bit 1 is on, 5. data is encrypted // if bit 2 is on, 5. data is compressed with qCompress // 11. quint32 for timestamp (time_t) of the content if ( (unsigned)(aPublishedContent.size()) > ( sizeof (char) + // magick ( sizeof (quint32) * 5 ) + // bangpath ( sizeof (quint32) * 5 ) + // hash sizeof (quint32) + // content len 1 + // at least 1 byte of content sizeof (quint32) + // sig len 1 )) { // lets try int pos ( 0 ) ; pos += sizeof(char) ; // skip magick quint32 bangpath1(0) ; quint32 bangpath2(0) ; quint32 bangpath3(0) ; quint32 bangpath4(0) ; quint32 bangpath5(0) ; // "send" items have no bangpath switch ( aProtocolItemType ) { case KBinaryFileSend: case KProfileSend: case KClassifiedAdSend: break ; default: // and "Publish" items do have bangpath uintFromPosition(aPublishedContent, // because "send" has no bangpath pos, &bangpath1) ; pos += sizeof(quint32) ; // skip first bangpath ; uintFromPosition(aPublishedContent, pos, &bangpath2) ; pos += sizeof(quint32) ; // skip 2nd bangpath ; uintFromPosition(aPublishedContent, pos, &bangpath3) ; pos += sizeof(quint32) ; // skip 3rd bangpath ; uintFromPosition(aPublishedContent, pos, &bangpath4) ; pos += sizeof(quint32) ; // skip 4th bangpath ; uintFromPosition(aPublishedContent, pos, &bangpath5) ; pos += sizeof(quint32) ; // skip last bangpath ; break ; } Hash* hashObtained = new Hash(); if ( hashFromPosition(aPublishedContent, pos, hashObtained) == false ) { delete hashObtained ; return false ; } pos += (sizeof(quint32) * 5) ; // skip hash quint32 contentlen(0) ; uintFromPosition(aPublishedContent, pos, &contentlen) ; pos += sizeof(quint32) ; // skip content len // content can't be longer than 2 megabytes if ( ( contentlen > KMaxProtocolItemSize ) || ( (unsigned)(aPublishedContent.size()) < pos+contentlen ) ) { delete hashObtained ; return false ; } QByteArray content ( aPublishedContent.mid(pos,contentlen) ) ; pos += contentlen ; if ( aPublishedContent.size() < pos+2 ) { delete hashObtained ; return false ; } quint32 signaturelen (0) ; uintFromPosition(aPublishedContent, pos, &signaturelen) ; pos += sizeof(quint32) ; // skip signature len if ( (unsigned)(aPublishedContent.size()) < pos+signaturelen+sizeof(quint32) ) { delete hashObtained ; return false ; } QByteArray signature ( aPublishedContent.mid(pos,signaturelen) ) ; pos += signaturelen ; // then extract signing key quint32 signingKeyLen (0) ; uintFromPosition(aPublishedContent, pos, &signingKeyLen) ; pos += sizeof(quint32) ; // skip signature len if ( (unsigned)(aPublishedContent.size()) < pos+signingKeyLen+sizeof(unsigned char) ) { delete hashObtained ; return false ; } QByteArray signingKey ( aPublishedContent.mid(pos,signingKeyLen) ) ; pos += signingKeyLen ; // pos should now point to flags. const unsigned char flags = aPublishedContent.at(pos) ; pos += sizeof(unsigned char) ; // pos should now point to timestamp quint32 timestampOfContent (0) ; uintFromPosition(aPublishedContent, pos, ×tampOfContent) ; #ifndef WIN32 #ifdef DEBUG time_t contentTime_T ( timestampOfContent ) ; char timebuf[40] ; LOG_STR2("Content time of publish at receive: %s", ctime_r(&contentTime_T,timebuf)) ; #endif #endif QList bangPath ; switch ( aProtocolItemType ) {// skip bangpath for "send" case KBinaryFileSend: case KProfileSend: case KClassifiedAdSend: break ; default: { // and "Publish" items do have bangpath // here penalize hosts with hash last 32 bits all zero? // they will still receive content via content-copy instead // of publish, and surely by asking.. if ( bangpath1 > 0 ) { bangPath.append(bangpath1) ; } if ( bangpath2 > 0 ) { bangPath.append(bangpath2) ; } if ( bangpath3 > 0 ) { bangPath.append(bangpath3) ; } if ( bangpath4 > 0 ) { bangPath.append(bangpath4) ; } if ( bangpath5 > 0 ) { bangPath.append(bangpath5) ; } // if bangpath is not yet full, if ( bangPath.size() < 5 ) { // then append the host where we got this content: iModel.lock() ; bangPath.append(aConnection.node()->nodeFingerPrint().iHash160bits[4] ) ; LOG_STR2("Appending to bangpath low-order bits %u", aConnection.node()->nodeFingerPrint().iHash160bits[4]) ; iModel.unlock() ; } } break ; } // all right dudes. switch ( aProtocolItemType ) { case KProfilePublish: iModel.lock() ; retval = iModel.profileModel().publishedProfileReceived(*hashObtained, content, signature, bangPath, signingKey, flags, timestampOfContent, aConnection.node()->nodeFingerPrint()) ; iModel.unlock() ; break ; case KProfileSend: iModel.lock() ; retval = iModel.profileModel().sentProfileReceived(*hashObtained, content, signature, signingKey, flags, timestampOfContent, aConnection.node()->nodeFingerPrint()) ; LOG_STR2("Retval of profileModel().sentProfileReceived = %d", (int)retval) ; iModel.unlock() ; break ; case KBinaryFileSend: iModel.lock() ; retval = iModel.binaryFileModel().sentBinaryFileReceived(*hashObtained, content, signature, signingKey, flags, timestampOfContent, aConnection.node()->nodeFingerPrint()) ; iModel.unlock() ; break ; case KClassifiedAdSend: iModel.lock() ; retval = iModel.classifiedAdsModel().sentCAReceived(*hashObtained, content, signature, signingKey, flags, timestampOfContent, aConnection.node()->nodeFingerPrint()) ; iModel.unlock() ; break ; case KBinaryFilePublish: iModel.lock() ; retval = iModel.binaryFileModel().publishedBinaryFileReceived(*hashObtained, content, signature, bangPath, signingKey, flags, timestampOfContent, aConnection.node()->nodeFingerPrint() ) ; iModel.unlock() ; break ; case KClassifiedAdPublish: iModel.lock() ; retval = iModel.classifiedAdsModel().publishedCAReceived(*hashObtained, content, signature, bangPath, signingKey, flags, timestampOfContent, aConnection.node()->nodeFingerPrint()) ; iModel.unlock() ; break ; default: LOG_STR2("Unhandled publish item type %d", aProtocolItemType) ; break ; } delete hashObtained ; } return retval ; } bool ProtocolMessageParser::parsePrivMsgPublishedOrSent(const unsigned char aItemType, const QByteArray& aPublishedContent, const Connection &aConnection ) { LOG_STR2("ProtocolMessageParser::parsePrivMsgPublishedOrSent type %d", (int)aItemType); bool retval = false ; // in publish of priv msg there is // 1. magick numbah KPrivMessagePublish // 2. bangpath of low-order bits of hosts // 3. content hash // 4. len of data (32bit) // 5. data // 6. len of signature (32bit) // 7. signature // 8. quint32 for timestamp (time_t) of the content // 9. destination node hash (may be all zeroes and that's all right) // 10. recipient profile hash // if it is question of private message send, the structure is same, but // bangpath is missing from between if ( (unsigned)(aPublishedContent.size()) > ( sizeof (char) + // magick ( sizeof (quint32) * 5 ) + // bangpath ( sizeof (quint32) * 5 ) + // hash sizeof (quint32) + // content len 1 + // at least 1 byte of content sizeof (quint32) + // sig len 1 )) { // lets try int pos ( 0 ) ; pos += sizeof(char) ; // skip magick quint32 bangpath1(0) ;//these variables un-used in case of msg send quint32 bangpath2(0) ; quint32 bangpath3(0) ; quint32 bangpath4(0) ; quint32 bangpath5(0) ; if ( aItemType == KPrivMessagePublish ) { // publish has bangpath, send has not // read bangpath values from content uintFromPosition(aPublishedContent, pos, &bangpath1) ; pos += sizeof(quint32) ; // skip first bangpath ; uintFromPosition(aPublishedContent, pos, &bangpath2) ; pos += sizeof(quint32) ; // skip 2nd bangpath ; uintFromPosition(aPublishedContent, pos, &bangpath3) ; pos += sizeof(quint32) ; // skip 3rd bangpath ; uintFromPosition(aPublishedContent, pos, &bangpath4) ; pos += sizeof(quint32) ; // skip 4th bangpath ; uintFromPosition(aPublishedContent, pos, &bangpath5) ; pos += sizeof(quint32) ; // skip last bangpath ; } // then try find content hash Hash* hashObtained = new Hash() ; if ( hashFromPosition(aPublishedContent, pos, hashObtained) == false ) { delete hashObtained ; return false ; } pos += (sizeof(quint32) * 5) ; // skip hash // then read content len and content quint32 contentlen (0); uintFromPosition(aPublishedContent, pos, &contentlen) ; pos += sizeof(quint32) ; // skip content len // content can't be longer than 2 megabytes if ( ( contentlen > KMaxProtocolItemSize ) || ( (unsigned)(aPublishedContent.size()) < pos+contentlen ) ) { delete hashObtained ; return false ; } QByteArray content ( aPublishedContent.mid(pos,contentlen) ) ; pos += contentlen ; if ( aPublishedContent.size() < pos+2 ) { delete hashObtained ; return false ; } // then read signature len and signature quint32 signaturelen (0); uintFromPosition(aPublishedContent, pos, &signaturelen) ; pos += sizeof(quint32) ; // skip signature len if ( (unsigned)(aPublishedContent.size()) < pos+signaturelen+sizeof(quint32) ) { delete hashObtained ; return false ; } QByteArray signature ( aPublishedContent.mid(pos,signaturelen) ) ; pos += signaturelen ; // pos should now point to timestamp quint32 timestampOfContent (0) ; uintFromPosition(aPublishedContent, pos, ×tampOfContent) ; #ifndef WIN32 #ifdef DEBUG time_t contentTime_T ( timestampOfContent ) ; char timebuf[40] ; LOG_STR2("Priv msg time of publish at receive: %s", ctime_r(&contentTime_T,timebuf)) ; #endif #endif pos += sizeof(quint32) ; // skip over timestamp Hash destinationNodeHash ; if ( hashFromPosition(aPublishedContent, pos, &destinationNodeHash) == false ) { delete hashObtained ; return false ; } pos += sizeof(quint32)*Hash::KNumberOfIntsInHash ; // skip over dest hash Hash recipientHash ; if ( hashFromPosition(aPublishedContent, pos, &recipientHash) == false ) { delete hashObtained ; return false ; } pos += sizeof(quint32)*Hash::KNumberOfIntsInHash ; // skip over recipient // post data into datamodel differently, depending on publish/send if ( aItemType == KPrivMessagePublish ) { QList bangPath ; // here penalize hosts with hash last 32 bits all zero? // they will still receive content via content-copy instead // of publish, and surely by asking.. if ( bangpath1 > 0 ) { bangPath.append(bangpath1) ; } if ( bangpath2 > 0 ) { bangPath.append(bangpath2) ; } if ( bangpath3 > 0 ) { bangPath.append(bangpath3) ; } if ( bangpath4 > 0 ) { bangPath.append(bangpath4) ; } if ( bangpath5 > 0 ) { bangPath.append(bangpath5) ; } // if bangpath is not yet full, if ( bangPath.size() < 5 ) { // then append the host where we got this content: iModel.lock() ; bangPath.append(aConnection.node()->nodeFingerPrint().iHash160bits[4] ) ; LOG_STR2("Appending to bangpath low-order bits %u", aConnection.node()->nodeFingerPrint().iHash160bits[4]) ; iModel.unlock() ; } // all right dudes. iModel.lock() ; retval = iModel.privateMessageModel().publishedPrivMessageReceived(*hashObtained, content, signature, bangPath, destinationNodeHash, recipientHash, timestampOfContent, aConnection.node()->nodeFingerPrint()) ; iModel.unlock() ; } else { // was send iModel.lock() ; retval = iModel.privateMessageModel().sentPrivMessageReceived(*hashObtained, content, signature, destinationNodeHash, recipientHash, timestampOfContent, aConnection.node()->nodeFingerPrint()) ; iModel.unlock() ; } delete hashObtained ; } return retval ; } bool ProtocolMessageParser::parseProfileCommentPublishedOrSent(const unsigned char aProtocolItemType, const QByteArray& aPublishedContent, const Connection &aConnection ) { bool retval ( false ) ; // first magick number KProfileCommentPublish/KProfileCommentSend // if ( aPublish ) { // then bangpath 5 items and if not all 5 are filled, // the remaining ones are filled with zeroes. // } // then content hash, 5*32 bytes // then commented profile hash, 5*32 bytes // then length of the actual data, followed by the actual data // then length of the signature, followeds by the signature. // then flags, one unsigned 32-bit. // * if bit 1 is up, it means that content is encrypted. // then time when content was published. int pos ( sizeof(unsigned char) ) ; // skip magick number, we have it in // aProtocolItemType quint32 bangpath1(0) ;//these variables un-used in case of comment send quint32 bangpath2(0) ; quint32 bangpath3(0) ; quint32 bangpath4(0) ; quint32 bangpath5(0) ; if ( aProtocolItemType == KProfileCommentPublish ) { // publish has bangpath, send has not // read bangpath values from content if (!uintFromPosition(aPublishedContent, pos, &bangpath1) ) return false ; pos += sizeof(quint32) ; // skip first bangpath ; if (!uintFromPosition(aPublishedContent, pos, &bangpath2) ) return false ; pos += sizeof(quint32) ; // skip 2nd bangpath ; if (!uintFromPosition(aPublishedContent, pos, &bangpath3) ) return false ; pos += sizeof(quint32) ; // skip 3rd bangpath ; if (!uintFromPosition(aPublishedContent, pos, &bangpath4) ) return false ; pos += sizeof(quint32) ; // skip 4th bangpath ; if (!uintFromPosition(aPublishedContent, pos, &bangpath5) ) return false ; pos += sizeof(quint32) ; // skip last bangpath ; } // then comment hash Hash hashOfContent ; if ( hashFromPosition(aPublishedContent, pos, &hashOfContent) == false ) { return false ; } else { pos += sizeof(quint32)*Hash::KNumberOfIntsInHash ; // skip hash } Hash hashOfProfileCommented ; if ( hashFromPosition(aPublishedContent, pos, &hashOfProfileCommented) == false ) { return false ; } else { pos += sizeof(quint32)*Hash::KNumberOfIntsInHash ; // skip hash } quint32 contentlen (0); uintFromPosition(aPublishedContent, pos, &contentlen) ; pos += sizeof(quint32) ; // skip content len // content can't be longer than 2 megabytes if ( ( contentlen > KMaxProtocolItemSize ) || ( (unsigned)(aPublishedContent.size()) < pos+contentlen ) ) { return false ; } const QByteArray content ( aPublishedContent.mid(pos,contentlen) ) ; pos += contentlen ; quint32 signaturelen (0); uintFromPosition(aPublishedContent, pos, &signaturelen) ; if ( signaturelen > 5000 || ( (unsigned)(aPublishedContent.size()) < pos+signaturelen+sizeof(quint32) ) ) { return false ; } else { pos += sizeof(quint32) ; // skip signature len } const QByteArray signature ( aPublishedContent.mid(pos,signaturelen) ) ; pos += signaturelen ; // ok, now we have content hash,profile hash, // content, signature, next item is flags: quint32 flags ; if ( uintFromPosition(aPublishedContent, pos, &flags) == false ) { return false ; } else { pos += sizeof(quint32) ; // skip signature len } // and finally timestamp of publish: quint32 timeOfPublish ; if ( uintFromPosition(aPublishedContent, pos, &timeOfPublish) == false ) { return false ; } else { if ( timeOfPublish > ( QDateTime::currentDateTimeUtc().toTime_t() + 600 ) ) { QLOG_STR("Clock skew detected, skipping content..") ; } else { if ( aProtocolItemType == KProfileCommentPublish ) { iModel.lock() ; QList bangPath ; // here penalize hosts with hash last 32 bits all zero? // they will still receive content via content-copy instead // of publish, and surely by asking.. if ( bangpath1 > 0 ) { bangPath.append(bangpath1) ; } if ( bangpath2 > 0 ) { bangPath.append(bangpath2) ; } if ( bangpath3 > 0 ) { bangPath.append(bangpath3) ; } if ( bangpath4 > 0 ) { bangPath.append(bangpath4) ; } if ( bangpath5 > 0 ) { bangPath.append(bangpath5) ; } // if bangpath is not yet full, if ( bangPath.size() < 5 ) { // then append the host where we got this content: bangPath.append(aConnection.node()->nodeFingerPrint().iHash160bits[4] ) ; LOG_STR2("Appending to bangpath low-order bits %u", aConnection.node()->nodeFingerPrint().iHash160bits[4]) ; } retval = iModel.profileCommentModel().publishedProfileCommentReceived(hashOfContent, hashOfProfileCommented, content, signature, bangPath, flags, timeOfPublish, aConnection.node()->nodeFingerPrint()) ; iModel.unlock() ; } else { iModel.lock() ; retval = iModel.profileCommentModel().sentProfileCommentReceived(hashOfContent, hashOfProfileCommented, content, signature, flags, timeOfPublish, aConnection.node()->nodeFingerPrint()) ; iModel.unlock() ; } } // post the data into datamodel } return retval ; } bool ProtocolMessageParser::parseMultipleNodeGreetingsV1(const QByteArray& aGoodFood, const Connection &aConnection ) { int pos = 0 ; quint32 messageLen (0); bool retval = false ; LOG_STR2("parseMultipleNodeGreetingsV1 size = %d", aGoodFood.size()) ; while ( pos < aGoodFood.size() ) { LOG_STR2("parsemultiple pos = %d",(int)pos) ; LOG_STR2("parsemultiple total = %d",(int)aGoodFood.size()) ; if ( uintFromPosition( aGoodFood, pos+1, &messageLen) == true && messageLen > 0 ) { LOG_STR2("size of single msg = %d",(int)messageLen) ; if ( messageLen > (unsigned)(aGoodFood.size()) ) { return false ; // can not be } retval = parseNodeGreetingV1(aGoodFood.mid(pos,messageLen),aConnection) ; if ( !retval ) { break ; } pos = pos + messageLen ; } } return retval ; } bool ProtocolMessageParser::parseNodeGreetingV1(const QByteArray& aSingleNodeGreeting, const Connection& aConnection ) { bool retval = false ; // byte 0 message identifier // byte 1-5 message length, quint32 in network byteorder // followed by JSON const unsigned char msgId = aSingleNodeGreeting[0] ; if (msgId == KProtocolVersion ) { quint32 JSONlen ; if ( uintFromPosition( aSingleNodeGreeting, 1, &JSONlen) == true ) { if ( (int)(JSONlen ) == aSingleNodeGreeting.size() ) { bool ok; QByteArray unCompressedNodeGreeting ( qUncompress(aSingleNodeGreeting.mid(5))) ; if ( unCompressedNodeGreeting.size() > 0 ) { QVariantMap result ( JSonWrapper::parse (unCompressedNodeGreeting, &ok)); QLOG_STR("Size of uncompressed = " + QString::number(unCompressedNodeGreeting.length()) + " ok = " + QString::number((int)ok)) ; if (!ok) { return false ; } else { Node* n ( Node::fromQVariant(result, aConnection.iNumberOfPacketsReceived == 1) ) ; if ( n ) { if ( (aConnection.iNumberOfPacketsReceived == 1) && (!(aConnection.node()->nodeFingerPrint() == n->nodeFingerPrint())) ) { LOG_STR("Node is sending different FP in greeting and SSL") ; delete n ; return false ; } iModel.lock() ; if ( n->nodeFingerPrint() == iController.getNode().nodeFingerPrint() ) { QLOG_STR("Received my own node ref, not saving..") ; retval = true ; } else { bool wasInitialConnection ( aConnection.iNumberOfPacketsReceived == 1 ) ; if (!iModel.nodeModel().nodeGreetingReceived(*n, wasInitialConnection ) ) { LOG_STR("Update was not suksee") ; retval = false ; } else { LOG_STR2("Update was success, retval = %d", (int)retval) ; if ( aConnection.iNumberOfPacketsReceived == 1 ) { // node was updated/inserted ; datamodel has // set possible last mutual connect time of // that node into inserted node .. because connection // holds different instance, copy the value there aConnection.node()->setLastMutualConnectTime(n->lastMutualConnectTime()) ; LOG_STR2("Setting last mutual of node to %u", (unsigned)(aConnection.node()->lastMutualConnectTime())) ; } retval = true ; } } iModel.unlock() ; delete n ; } } } } } } return retval ; } bool ProtocolMessageParser::uintFromPosition(const QByteArray& aGoodFood, const int aPos, quint32* aResult) const { if ( aGoodFood.size() < (aPos + (int)(sizeof(quint32)))) { // sizeof returns unsigned, size() signed .. return false ; } const char *byteArrayContent = aGoodFood.constData() ; quint32* uintNetworkByteOrder = (quint32*)(&byteArrayContent[aPos]) ; *aResult = ntohl(*uintNetworkByteOrder) ; // LOG_STR2("uint from pos %d ", aPos) ; // LOG_STR2("is %x ", *aResult) ; return true; } bool ProtocolMessageParser::hashFromPosition(const QByteArray& aGoodFood, const int aPos, Hash* aResultHash) const { if ( aGoodFood.size() < (aPos + (int)(sizeof(quint32)*5))) { // sizeof returns unsigned, size() signed .. return false ; } quint32 hashBytes1 ; quint32 hashBytes2 ; quint32 hashBytes3 ; quint32 hashBytes4 ; quint32 hashBytes5 ; if ( uintFromPosition( aGoodFood, aPos, &hashBytes1) == false ) { LOG_STR2("hash bytes 1 not found at pos %d", aPos); return false ; } if ( uintFromPosition( aGoodFood, aPos+sizeof(quint32), &hashBytes2) == false ) { LOG_STR2("hash bytes 2 not found at pos %d", aPos); return false ; } if ( uintFromPosition( aGoodFood, aPos+(sizeof(quint32)*2), &hashBytes3) == false ) { LOG_STR2("hash bytes 3 not found at pos %d", aPos); return false ; } if ( uintFromPosition( aGoodFood, aPos+(sizeof(quint32)*3), &hashBytes4) == false ) { LOG_STR2("hash bytes 4 not found at pos %d", aPos); return false ; } if ( uintFromPosition( aGoodFood, aPos+(sizeof(quint32)*4), &hashBytes5) == false ) { LOG_STR2("hash bytes 5 not found at pos %d", aPos); return false ; } aResultHash->iHash160bits[0] = hashBytes1; aResultHash->iHash160bits[1] = hashBytes2; aResultHash->iHash160bits[2] = hashBytes3; aResultHash->iHash160bits[3] = hashBytes4; aResultHash->iHash160bits[4] = hashBytes5; return true; } bool ProtocolMessageParser::parseRequestForObjectsAroundHash(const QByteArray& aNodeRefRequest, const Connection &aConnection ) { if ((unsigned)(aNodeRefRequest.size()) < sizeof(unsigned char) + ( 5 * sizeof (quint32) ) ) { return false ; } Hash* hashObtained = new Hash() ; if ( hashFromPosition(aNodeRefRequest, 1, hashObtained) == false ) { delete hashObtained ; return false ; } quint32 timeStampOfMessages ( 0 ) ; if ( aNodeRefRequest[0] == KPrivMessagesForProfile || aNodeRefRequest[0] == KProfileCommentAtHash ) { // private messages + comment req contain an extra uint having the // timestamp of the messages if ( uintFromPosition( aNodeRefRequest, 1+(sizeof(quint32)*Hash::KNumberOfIntsInHash), &timeStampOfMessages) == false ) { delete hashObtained ; return false ; } } // ok, fine, now we have the hash and we know who requested it ; // who's gonna deliver? struct NetworkRequestExecutor::NetworkRequestQueueItem nodeRequest ; nodeRequest.iTimeStampOfItem = 0 ; switch ( aNodeRefRequest[0] ) { case KNodesAroundHash: // reply type for this query is series of nodegreetings nodeRequest.iRequestType = NodeGreeting ; nodeRequest.iMaxNumberOfItems = 10 ; break ; case KProfileAtHash: // type of reply for "profile at hash" is surprisingly, profile. // for profilecomments there is separate call that has timestamp // along.. nodeRequest.iRequestType = UserProfile ; nodeRequest.iMaxNumberOfItems = 1 ; break ; case KBinaryFileAtHash: // type of reply for "profile at hash" is binary file nodeRequest.iRequestType = BinaryBlob ; nodeRequest.iMaxNumberOfItems = 1 ; break ; case KClassifiedAdAtHash: // type of reply for "ca at hash" is classified a nodeRequest.iRequestType = ClassifiedAd ; nodeRequest.iMaxNumberOfItems = 1 ; break ; case KPrivMessagesAtHash: nodeRequest.iRequestType = PrivateMessage ; nodeRequest.iMaxNumberOfItems = 1 ; break ; case KPrivMessagesForProfile: nodeRequest.iTimeStampOfItem = timeStampOfMessages ; nodeRequest.iRequestType = PrivateMessagesForProfile ; nodeRequest.iMaxNumberOfItems = 1 ; break ; case KProfileCommentAtHash: nodeRequest.iTimeStampOfItem = timeStampOfMessages ; // when network request executor sees this, it will queue profile comments // that comment given profile. those comments will then be sent individually. // if there has been update to the profile itself, // it should be sent too nodeRequest.iRequestType = UserProfileCommentsForProfile ; nodeRequest.iMaxNumberOfItems = 1000 ; { #ifndef WIN32 #ifdef DEBUG time_t commentTime_T ( timeStampOfMessages ) ; char timebuf[40] ; LOG_STR2("KProfileCommentAtHash for timestamp: %s", ctime_r(&commentTime_T,timebuf)) ; #endif #endif } break ; case KSingleProfileCommentAtHash: // other nodes wants individual comment nodeRequest.iRequestType = UserProfileComment ; nodeRequest.iMaxNumberOfItems = 1 ; break ; default: LOG_STR2("Unhandled protocol request type %d", (int) (aNodeRefRequest[0])); delete hashObtained ; return false ; // not handled } nodeRequest.iDestinationNode = aConnection.node()->nodeFingerPrint() ; nodeRequest.iRequestedItem = *hashObtained ; nodeRequest.iState = NetworkRequestExecutor::NewRequest ; iModel.lock() ; iModel.addNetworkRequest(nodeRequest) ; iModel.unlock() ; delete hashObtained ; return true ; } bool ProtocolMessageParser::parseAdsClassifiedAtHash( const QByteArray& aQueryBytes, const Connection &aConnection) { if (!((aQueryBytes.size() == sizeof(unsigned char) + ( 7 * sizeof (quint32) ) ) || (aQueryBytes.size() == sizeof(unsigned char) + ( 5 * sizeof (quint32) ) ) ) ) { // message contains identifier and a hash and 0 or 2 timestamps. so the size is fixed. return false ; } else { Hash* hashObtained = new Hash() ; if ( hashFromPosition(aQueryBytes, sizeof(unsigned char), hashObtained) == false ) { delete hashObtained ; return false ; } quint32 startTsHostBo ( 0 ) ; quint32 endTsHostBo ( std::numeric_limits::max() ) ; if ( aQueryBytes.size() > (int)((sizeof(unsigned char) + ( 5 * sizeof (quint32) ))) ) { if ( uintFromPosition( aQueryBytes, sizeof(unsigned char)+(sizeof(quint32)*5), &startTsHostBo) == false ) { delete hashObtained ; return false ; } if ( uintFromPosition( aQueryBytes, sizeof(unsigned char)+(sizeof(quint32)*6), &endTsHostBo) == false ) { delete hashObtained ; return false ; } } struct NetworkRequestExecutor::NetworkRequestQueueItem classifiedRequest ; classifiedRequest.iDestinationNode = aConnection.node()->nodeFingerPrint() ; classifiedRequest.iRequestedItem = *hashObtained ; classifiedRequest.iTimeStampOfItem = startTsHostBo ; classifiedRequest.iTimeStampOfLastActivity = endTsHostBo ; classifiedRequest.iState = NetworkRequestExecutor::NewRequest ; classifiedRequest.iRequestType = RequestAdsClassified ; iModel.lock() ; iModel.addNetworkRequest(classifiedRequest) ; iModel.unlock() ; delete hashObtained ; return true ; } } bool ProtocolMessageParser::parseListOfAdsClassifiedAtHash( const QByteArray& aQueryBytes, const Connection &aConnection) { QList > listOfAds ; int pos ( 1 ) ; // set to 1 to immediately skip the protocol identifier as it // has been checked already Hash hashOfClassification ; if ( hashFromPosition(aQueryBytes, pos, &hashOfClassification ) == false ) { return false ; } pos += sizeof(quint32)*Hash::KNumberOfIntsInHash ; // skip over hashOfClassication quint32 numberOfAdsInMessage ( 0 ) ; if ( uintFromPosition( aQueryBytes, pos, &numberOfAdsInMessage ) == false ) { return false ; } pos += sizeof(quint32) ; // skip over numberOfAdsInMessage for ( quint32 i = 0 ; i < numberOfAdsInMessage ; i++ ) { Hash hashOfArticle ; quint32 timeStampOfArticle ; if ( hashFromPosition(aQueryBytes, pos, &hashOfArticle ) == false ) { return false ; } pos += sizeof(quint32)*Hash::KNumberOfIntsInHash ; // skip over hash if ( uintFromPosition( aQueryBytes, pos, &timeStampOfArticle ) == false ) { return false ; } pos += sizeof(quint32) ; // skip over timestamp of article QPair p ( hashOfArticle, timeStampOfArticle ) ; listOfAds.append(p) ; #ifndef WIN32 #ifdef DEBUG time_t articleTime_T ( timeStampOfArticle ) ; char timebuf[40] ; LOG_STR2("List of ads: Article timestamp: %s", ctime_r(&articleTime_T,timebuf)) ; #endif #endif QLOG_STR("List of ads " + hashOfArticle.toString() + " ts " + QString::number(timeStampOfArticle)) ; } return iModel.classifiedAdsModel().caListingByClassificationReceived(listOfAds, aConnection.node()->nodeFingerPrint(), hashOfClassification) ; } bool ProtocolMessageParser::parseSearchRequest( const QByteArray& aQueryBytes, Connection& aConnection) { bool retval = false ; // ok, search request is // 8 bit magic // 32 bit flags // 32 bit search id to pass back in results // 32 bit length of search phrase // search phrase in utf-8 int pos ( 1 ) ; // set to 1 to immediately skip the protocol identifier as it // has been checked already unsigned len = (unsigned)(aQueryBytes.size()) ; if ( len > sizeof(unsigned char) + ( sizeof(quint32) * 3 ) ) { quint32 flags ( 0 ) ; if ( uintFromPosition ( aQueryBytes, pos, &flags ) == false ) { return false ; } pos += sizeof(quint32) ; quint32 searchId ( 0 ) ; if ( uintFromPosition ( aQueryBytes, pos, &searchId ) == false ) { return false ; } pos += sizeof(quint32) ; quint32 strLen ( 0 ) ; if ( uintFromPosition ( aQueryBytes, pos, &strLen ) == false ) { return false ; } pos += sizeof(quint32) ; if ( len != ( strLen + ( sizeof(unsigned char) + ( sizeof(quint32) * 3 ) ) ) ) { return false ; } QString queryStr ; queryStr = QString::fromUtf8(aQueryBytes.mid(pos,strLen).constData(), strLen) ; if ( queryStr.length() > 0 ) { retval = true ; bool searchAds = flags & 0x01 ; bool searchProfiles = flags & ( 0x01 << 1 ) ; bool searchComments = flags & ( 0x01 << 2 ) ; iModel.lock() ; QList results = iModel.searchModel()->performSearch(queryStr, searchAds, searchProfiles, searchComments) ; if ( results.size() > 0 ) { // immediately queue for send QByteArray* serializedResults = new QByteArray() ; serializedResults->append( ProtocolMessageFormatter::searchResultsSend(results, searchId)) ; if ( serializedResults->size() > 0 ) { aConnection.iNextProtocolItemToSend.append(serializedResults) ; } else { delete serializedResults ; } } iModel.unlock() ; } } return retval ; } bool ProtocolMessageParser::parseSearchResults( const QByteArray& aQueryBytes, const Connection& aConnection) { bool retval = false ; int pos ( 1 ) ; // set to 1 to immediately skip the protocol identifier as it // has been checked already unsigned len = (unsigned)(aQueryBytes.size()) ; quint32 jsonLen ( 0 ) ; if ( uintFromPosition ( aQueryBytes, pos, &jsonLen ) == false ) { return false ; } pos += sizeof(quint32) ; if ( len == (jsonLen + sizeof(unsigned char) + sizeof(quint32)) ) { QVariantMap result (JSonWrapper::parse ( aQueryBytes.mid(pos, jsonLen), &retval) ) ; if ( retval == true ) { QList results; quint32 searchId ; if ( SearchModel::deSerializeSearchResults(result,&results,&searchId) ) { iModel.lock() ; iModel.searchModel()->appendNetworkSearchResults(results, searchId, aConnection.getPeerHash()) ; iModel.unlock() ; } else { return false ; } } } else { QLOG_STR("Search result protocol item size does not match!!") ; } return retval ; } bool ProtocolMessageParser::parseVoiceCall( const QByteArray& aQueryBytes, const Connection& aConnection ) { bool retval = false ; QLOG_STR("ProtocolMessageParser::parseVoiceCall in " + QString::number(aQueryBytes.size())) ; int pos ( 1 ) ; // set to 1 to immediately skip the protocol identifier as it // has been checked already unsigned len = (unsigned)(aQueryBytes.size()) ; quint32 jsonLen ( 0 ) ; if ( uintFromPosition ( aQueryBytes, pos, &jsonLen ) == false ) { return false ; } pos += sizeof(quint32) ; if ( len > (jsonLen + sizeof(unsigned char) + sizeof(quint32)) ) { QByteArray voiceCallDataBytes ( aQueryBytes.mid(pos, jsonLen) ) ; VoiceCall callData ; if ( callData.fromJSon(voiceCallDataBytes) ) { QLOG_STR("Metadata parsed, len was " + QString::number(len)) ; // call data was parsed ok, obtain key from there // and check that signature was made using the same // key that is inside. QLOG_STR("Before obtaining siglen pos = " + QString::number(pos)) ; QLOG_STR("Before obtaining adding jsonLen = " + QString::number(jsonLen)) ; pos += jsonLen ; QLOG_STR("Before obtaining new pos = " + QString::number(pos)) ; quint32 signatureLen ( 0 ) ; if ( uintFromPosition ( aQueryBytes, pos, &signatureLen ) == false ) { return false ; } pos += sizeof(quint32) ; QLOG_STR("Voice call jsonLen = " + QString::number(jsonLen)) ; QLOG_STR("Voice call sigLen = " + QString::number(signatureLen)) ; if ( len == (jsonLen + sizeof(unsigned char) + sizeof(quint32) + signatureLen + sizeof(quint32) ) ) { if ( signatureLen > 0 ) { QByteArray signatureBytes ( aQueryBytes.mid(pos, signatureLen) ) ; // here we are either in the destination node or in the // originating node. try decide which key to verify against: orig or dest if ( callData.iOriginatingNode == iController.getNode().nodeFingerPrint() ) { // we're the originating node. try verify against destination // key because that's who signed the message if ( callData.iDestinationOperatorKey.size() > 0 ) { const Hash hashOfDestinationKey ( iController.model().contentEncryptionModel(). hashOfPublicKey(callData.iDestinationOperatorKey) ) ; if ( hashOfDestinationKey != KNullHash ) { QByteArray dummy ; iModel.lock() ; if ( iController.model().contentEncryptionModel().PublicKey(hashOfDestinationKey, dummy) == false ) { iController.model().contentEncryptionModel().insertOrUpdatePublicKey(callData.iDestinationOperatorKey, hashOfDestinationKey) ; } if ( iController.model().contentEncryptionModel().verify(hashOfDestinationKey, voiceCallDataBytes, signatureBytes, NULL, false ) == false ) { QLOG_STR("Voice call data signature verify failed") ; retval = false ; } else { // verify ok MVoiceCallEngine* eng (iController.voiceCallEngineInterface()) ; if ( eng ) { Hash nodeHash ( aConnection.getPeerHash() ) ; eng->insertCallStatusData(callData, nodeHash ); } retval = true ; } iModel.unlock() ; } } else { // there were no key JSon so can't verify: proceed anyway iModel.lock() ; MVoiceCallEngine* eng (iController.voiceCallEngineInterface()) ; if ( eng ) { Hash nodeHash ( aConnection.getPeerHash() ) ; eng->insertCallStatusData(callData, nodeHash); } iModel.unlock() ; retval = true ; } } else { // we're the destination node. try verify against originating // key because that's who signed the message if ( callData.iOriginatingOperatorKey.size() > 0 ) { iModel.lock() ; const Hash hashOfOriginatingKey ( iController.model().contentEncryptionModel(). hashOfPublicKey(callData.iOriginatingOperatorKey) ) ; QByteArray dummy ; if ( iController.model().contentEncryptionModel().PublicKey(hashOfOriginatingKey, dummy) == false ) { iController.model().contentEncryptionModel().insertOrUpdatePublicKey(callData.iOriginatingOperatorKey, hashOfOriginatingKey) ; } if ( iController.model().contentEncryptionModel().verify(hashOfOriginatingKey, voiceCallDataBytes, signatureBytes, NULL, false ) == false ) { QLOG_STR("Voice call data signature verify failed, for originating") ; retval = false ; } else { // verify ok MVoiceCallEngine* eng (iController.voiceCallEngineInterface()) ; if ( eng ) { Hash nodeHash ( aConnection.getPeerHash() ) ; eng->insertCallStatusData(callData, nodeHash); } retval = true ; } iModel.unlock() ; } } } else { // there is no signature, just insert the DTO iModel.lock() ; MVoiceCallEngine* eng (iController.voiceCallEngineInterface()) ; if ( eng ) { Hash nodeHash ( aConnection.getPeerHash() ) ; eng->insertCallStatusData(callData, nodeHash); } iModel.unlock() ; retval = true ; } } else { QLOG_STR("Voice call protocol item size with signature does not match!!") ; } } else { QLOG_STR("VoiceCall metadata not parsed") ; } } else { QLOG_STR("Voice call protocol item size does not match!!") ; } return retval ; } bool ProtocolMessageParser::parseCallRtData( const QByteArray& aQueryBytes, const Connection& aConnection) { bool retval = false ; // network packet size is max 2 megabytes so cast to // unsigned should be fairly safe unsigned dataLen ( static_cast(aQueryBytes.size())) ; if ( dataLen > (sizeof(unsigned char) * 2 + // type+subtype sizeof(quint32) * 3 + // callid+seqno+payload size sizeof(unsigned char ) ) ) { // at least 1 byte of payload int pos ( 0 ) ; pos ++ ; // skip type unsigned char subtype ( aQueryBytes[pos] ) ; switch ( subtype ) { case KRTDataAudioSubtype: { pos ++ ; // skip over subtype quint32 callId ; if ( uintFromPosition ( aQueryBytes, pos, &callId ) == false ) { return false ; } else { pos += sizeof(quint32) ; } quint32 seqNo ; if ( uintFromPosition ( aQueryBytes, pos, &seqNo ) == false ) { return false ; } else { pos += sizeof(quint32) ; } quint32 sizeOfPayload; if ( uintFromPosition ( aQueryBytes, pos, &sizeOfPayload ) == false ) { return false ; } else { pos += sizeof(quint32) ; } if ( pos + sizeOfPayload != dataLen ) { return false ; } QByteArray payload ( aQueryBytes.mid(pos, sizeOfPayload) ) ; MVoiceCallEngine* eng (iController.voiceCallEngineInterface()) ; if ( eng ) { Hash nodeHash( aConnection.getPeerHash() ) ; eng->insertCallData(callId, seqNo, VoiceCallEngine::Audio, payload, nodeHash); } // with call data insert return value is not checked, // data either went there or it did not, if we got this // far it is declared a success: retval = true ; } break ; default: break ; retval = true ; } } return retval ; } bool ProtocolMessageParser::parseDbRecord( const QByteArray& aBytes, const Connection& aConnection) { bool retval ( false ) ; int pos ( 0 ) ; if ( (unsigned)(aBytes.length()) < sizeof(char) + // type sizeof(quint32)*3*Hash::KNumberOfIntsInHash + // hash * 3 sizeof(quint32) + // search string len sizeof(quint32) + // search number len sizeof(quint32) + // datalen sizeof(quint32) + // signaturelen sizeof(quint32) + // timestamp sizeof(quint32) ){// flags return false ; // record must be too short } // is either KDbRecordPublish or KDbRecordSend const unsigned char recordType ( aBytes[pos] ) ; pos++ ; // record type skip CaDbRecord r ; QList bangPath ; if ( recordType == KDbRecordPublish ) { // publish has bangpath, send has not quint32 bangpath1(0) ;//these variables un-used in case of comment send quint32 bangpath2(0) ; quint32 bangpath3(0) ; quint32 bangpath4(0) ; quint32 bangpath5(0) ; // read bangpath values from content if (!uintFromPosition(aBytes, pos, &bangpath1) ) return false ; pos += sizeof(quint32) ; // skip first bangpath ; if (!uintFromPosition(aBytes, pos, &bangpath2) ) return false ; pos += sizeof(quint32) ; // skip 2nd bangpath ; if (!uintFromPosition(aBytes, pos, &bangpath3) ) return false ; pos += sizeof(quint32) ; // skip 3rd bangpath ; if (!uintFromPosition(aBytes, pos, &bangpath4) ) return false ; pos += sizeof(quint32) ; // skip 4th bangpath ; if (!uintFromPosition(aBytes, pos, &bangpath5) ) return false ; pos += sizeof(quint32) ; // skip last bangpath ; if ( bangpath1 > 0 ) { bangPath.append(bangpath1) ; } if ( bangpath2 > 0 ) { bangPath.append(bangpath2) ; } if ( bangpath3 > 0 ) { bangPath.append(bangpath3) ; } if ( bangpath4 > 0 ) { bangPath.append(bangpath4) ; } if ( bangpath5 > 0 ) { bangPath.append(bangpath5) ; } // if bangpath is not yet full, if ( bangPath.size() < 5 ) { // then append the host where we got this content: bangPath.append(aConnection.node()->nodeFingerPrint().iHash160bits[4] ) ; LOG_STR2("Appending to bangpath low-order bits %u", aConnection.node()->nodeFingerPrint().iHash160bits[4]) ; } } if ( hashFromPosition(aBytes, pos, &r.iRecordId ) == false ) { return false ; } pos += sizeof(quint32)*Hash::KNumberOfIntsInHash ; // skip over hash of record id if ( hashFromPosition(aBytes, pos, &r.iCollectionId ) == false ) { return false ; } if ( r.iCollectionId == KNullHash ) { return false ; // can't be } pos += sizeof(quint32)*Hash::KNumberOfIntsInHash ; // skip over hash of collection id if ( hashFromPosition(aBytes, pos, &r.iSenderHash ) == false ) { return false ; } pos += sizeof(quint32)*Hash::KNumberOfIntsInHash ; // skip over hash of sender // next is searchphrase, that begins with len, followed by optional content quint32 sizeOfSearchPhrase; if ( uintFromPosition ( aBytes, pos, &sizeOfSearchPhrase ) == false ) { return false ; } else { pos += sizeof(quint32) ; } if ( pos + sizeOfSearchPhrase > (unsigned)( aBytes.size()) ) { return false ; } if ( sizeOfSearchPhrase > 0 ) { // there were searchPhrase r.iSearchPhrase = QString::fromUtf8(aBytes.mid(pos, sizeOfSearchPhrase)) ; pos += sizeOfSearchPhrase ; } // next is searchnumber, that begins with len, followed by optional content quint32 sizeOfSearchNumber; if ( uintFromPosition ( aBytes, pos, &sizeOfSearchNumber ) == false ) { return false ; } else { pos += sizeof(quint32) ; } if ( pos + sizeOfSearchNumber > (unsigned)( aBytes.size()) ) { return false ; } if ( sizeOfSearchNumber > 0 ) { // there were searchNumber QString searchNumberStr ( QString::fromUtf8(aBytes.mid(pos, sizeOfSearchNumber))); bool ok ( false ) ; r.iSearchNumber = searchNumberStr.toLongLong(&ok) ; pos += sizeOfSearchNumber ; if ( !ok ) { r.iSearchNumber = std::numeric_limits::min() ; // "not there" value } } // next is data. it too may have zero len quint32 sizeOfData; if ( uintFromPosition ( aBytes, pos, &sizeOfData ) == false ) { return false ; } else { pos += sizeof(quint32) ; } if ( pos + sizeOfData > (unsigned)( aBytes.size()) ) { return false ; } if ( sizeOfData > 0 ) { // data identified from record r.iData = aBytes.mid(pos, sizeOfData); pos += sizeOfData ; } // next is signature. it should always have positive len quint32 sizeOfSig; if ( uintFromPosition ( aBytes, pos, &sizeOfSig ) == false ) { return false ; } else { pos += sizeof(quint32) ; } if ( sizeOfSig < 1 ) { return false ; // no signature } r.iSignature = aBytes.mid(pos, sizeOfSig) ; pos += sizeOfSig ; // then time of publish if ( uintFromPosition ( aBytes, pos, &r.iTimeOfPublish ) == false ) { return false ; } else { pos += sizeof(quint32) ; } // then flags quint32 flags ; if ( uintFromPosition ( aBytes, pos, &flags ) == false ) { return false ; } else { pos += sizeof(quint32) ; } if ( flags & 1 ) { r.iIsEncrypted = true ; } else { r.iIsEncrypted = false; } // got this far, record is ok syntactically. then ask datamodel opinion: iModel.lock() ; Hash nodeFingerPrint ( KNullHash ) ; if ( aConnection.node() ) { nodeFingerPrint = aConnection.node()->nodeFingerPrint() ; } if ( recordType == KDbRecordPublish ) { retval = iModel.caDbRecordModel()->publishedCaDbRecordReceived(r, r.iSignature, bangPath, nodeFingerPrint) ; } else { retval = iModel.caDbRecordModel()->sentCaDbRecordReceived(r, r.iSignature, nodeFingerPrint ) ; } iModel.unlock() ; return retval ; } // db record search bool ProtocolMessageParser::parseDbRecordSearchTerms( const QByteArray& aBytes, Connection& aConnection) { bool retval ( false ) ; int pos ( 1 ) ; // immediately skip over type at pos 0 quint32 searchJsonSize ( 0 ) ; if ( uintFromPosition ( aBytes, pos, &searchJsonSize ) == false ) { return false ; } else { pos += sizeof(quint32) ; } if ( searchJsonSize == aBytes.size() - ( sizeof(unsigned char) + sizeof(quint32))) { CaDbRecord::SearchTerms searchTerms ; if(searchTerms.fromJSon(aBytes.mid(pos, searchJsonSize))) { // perform the search and place results into // send queue to be sent "normally" via send queue // in datamodel. iModel.lock() ; QList resultSet ( iModel .caDbRecordModel() ->searchRecords(searchTerms.iFromCollection, searchTerms.iById, searchTerms.iModifiedAfter , searchTerms.iModifiedBefore, searchTerms.iByHavingNumberMoreThan, searchTerms.iByHavingNumberLessThan, searchTerms.iBySearchPhrase, searchTerms.iBySender, true ) ) ; while(resultSet.size()) { CaDbRecord *r ( resultSet.takeFirst() ) ; SendQueueItem qItem ; qItem.iItemType = DbRecord ; qItem.iHash = r->iRecordId ; aConnection.iSendQueue.append(qItem) ; delete r ; } iModel.unlock() ; retval = true ; } } return retval ; } classified-ads-0.13/net/protocol_message_parser.h000066400000000000000000000202101331670245300221670ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PROTOCOL_MESSAGE_PARSER_H #define PROTOCOL_MESSAGE_PARSER_H #include "protocol.h" #include #include // Q_IPV6ADDR #include "node.h" // KNullIpv6Addr #include "connection.h" class MController ; class MModelProtocolInterface ; class MNodeModelProtocolInterface ; class Connection ; /** * @brief Class containing routines for parsing protocol messages. * Methods are mainly called from network connection instances * and this class will forward the parsed protocol entities * to datamodel */ class ProtocolMessageParser : public QObject { Q_OBJECT public: ProtocolMessageParser (MController &aController, MModelProtocolInterface &aModel) ; /** * the open mouth * @param aGoodFood is the message * @return false if such a fatal error that peer needs to be disconnected */ bool parseMessage(const QByteArray& aGoodFood, Connection& aConnection ) ; private: // private methods for doing the actual work /** Peer hello message */ bool parseNodeGreetingV1(const QByteArray& aSingleNodeGreeting, const Connection &aConnection ) ; /** * Peer number of hello messages * @param aGoodFood at least one node greeting * @param aConnection the orignating connection */ bool parseMultipleNodeGreetingsV1(const QByteArray& aGoodFood, const Connection& aConnection ) ; /** * utility method: extract integer from bytearray. integer * will be returned in host byte order e.g. * @param aGoodFood is the bytearray from which to extract * @param aPos is the position where integer is expected to * be found * @param aResult is the quint32 where result will be written * e.g. this is the output variable * @return true if reading succeeded */ bool uintFromPosition(const QByteArray& aGoodFood, const int aPos, quint32* aResult) const ; /** * utility method: extract hash from bytearray. * @param aGoodFood is the bytearray from which to extract * @param aPos is the position where integer is expected to * be found * @param aResultHash is the hash that will have its * value set from contents of aGoodFood * @return true if success */ bool hashFromPosition(const QByteArray& aGoodFood, const int aPos, Hash* aResultHash) const ; /** * Method for parsing request to send one or more objects * specified by a hash. */ bool parseRequestForObjectsAroundHash(const QByteArray& aNodeRefRequest, const Connection &aConnection ) ; /** * Method for parsing published content. Content-type is given * as parameter ; single method as the structure is anyway same, * handling is different.. * * This method is also used to parse content sent ; it differs from * published content so, that it has no bangpath but otherwise * the format is the same. */ bool parseContentPublishedOrSent(const unsigned char aProtocolItemType, const QByteArray& aPublishedContent, const Connection &aConnection ) ; /** * Method for parsing published private message. Does about same * work as @ref parseContentPublishedOrSent but structure of * private messages is somewhat different. */ bool parsePrivMsgPublishedOrSent(const unsigned char aProtocolItemType, const QByteArray& aPublishedContent, const Connection &aConnection ) ; /** * Method for parsing published profile comments. Does about same * work as @ref parseContentPublishedOrSent but structure of * profile commentss is somewhat different. */ bool parseProfileCommentPublishedOrSent(const unsigned char aProtocolItemType, const QByteArray& aPublishedContent, const Connection &aConnection ) ; /** * method for parsing request that requests for classified * ads whose classification matches given hash * @param aQueryBytes contains the query * @param aConnection is the requester */ bool parseAdsClassifiedAtHash( const QByteArray& aQueryBytes, const Connection &aConnection) ; /** * Method for parsing list of headers of classified ads. * In practice this parses the protocol message sent with * id KListOfAdsClassifiedAtHash. */ bool parseListOfAdsClassifiedAtHash( const QByteArray& aQueryBytes, const Connection &aConnection) ; /** * Method for parsing a search request from remote node. * If parse is successful, this method will also ask searchmodel * to perform the search and place possible results immediately * into send-queue of aConnection so search works slightly differently * compared to rest of the network requests * @param aQueryBytes serialized query-description * @param aConnection is connection of the node who sent the request * @return true if things went all right. */ bool parseSearchRequest( const QByteArray& aQueryBytes, Connection& aConnection) ; /** * Method for parsing a search result from remote node. * In this case this node made a search request and this * is reply (containing list of objects matching * the query). * @param aQueryBytes serialized query-description * @param aConnection is connection of the node who sent the request * @return true if things went all right. */ bool parseSearchResults( const QByteArray& aQueryBytes, const Connection& aConnection) ; /** * Method for parsing voice call status data. This parses * call status, not call realtime (audio) data. * * @param aQueryBytes serialized call-status data * @param aConnection is connection of the node who sent the request * @return true if things went all right. */ bool parseVoiceCall( const QByteArray& aQueryBytes, const Connection& aConnection) ; /** * Method for parsing voice call data. This parses actual * data stream like audio, not call control data. * * @param aQueryBytes serialized call data * @param aConnection is connection of the node whose operator * made a statement. * @return true if things went all right. */ bool parseCallRtData( const QByteArray& aQueryBytes, const Connection& aConnection) ; /** * method for parsing record of distributed database */ bool parseDbRecord( const QByteArray& aQueryBytes, const Connection& aConnection) ; /** * method for parsing search request regarding db record */ bool parseDbRecordSearchTerms( const QByteArray& aQueryBytes, Connection& aConnection) ; private: MController &iController ; MModelProtocolInterface &iModel ; } ; #endif classified-ads-0.13/net/publishingengine.cpp000066400000000000000000000460301331670245300211430ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "publishingengine.h" #include "../log.h" #include "../controller.h" #include "../datamodel/model.h" #include "node.h" #include "connection.h" PublishingEngine::PublishingEngine(Controller* aController, Model& aModel) : QTimer(aController), iNeedsToRun(true), iController(aController), iModel(aModel), iNowRunning(false) { iNodeCandidatesToTryPush.clear() ; iWorkItem.iObjectHash = KNullHash ; // NULL hash in the beginning, connect(this, SIGNAL(timeout()), this, SLOT(run())); } PublishingEngine::~PublishingEngine() { LOG_STR("PublishingEngine::~PublishingEngine") ; emptyNodeCandidateList() ; LOG_STR("PublishingEngine::~PublishingEngine out") ; } // lets have the logic work like this: // quite often poll the table of published works. // when there is an item in the table, ask for nodes // that are destination addresses for the published items. // match that list with list of already-connected nodes ; // if we already have connections to nodes that are on // our list, do the following loop: // 1. put published item into send queue // 2. ask for notification that item has been sent ; // upon receiving, update the bangpath in publish-tables // 3. select next already-connected host // when already-connected hosts run out and we still have // nodes in our list where content should be sent, run following loop // 1. ask network-connection engine to obtain connection to host // 2. if unsuccessful, move to next host // 3. if success, put published item into send queue // 4. ask for notificatoin that item has been sent ; // upon receiving, update the bangpath in publish-tables // 5. select next non-connected host // with these steps this method should push the published content // into 5 hosts. each of these will do the same with publish-count=4, // each of those 4 will do the same with publish-count=3, each of // those 3 will do the same with publish-count=2 void PublishingEngine::run() { if ( iNowRunning == false ) { iNowRunning = true ; if (iNeedsToRun ) { if ( iWorkItem.iObjectHash == KNullHash ) { // we have nothing particular to do, sleep for 10s and // query iModel.lock() ; bool found = false ; iNodesSuccessfullyConnected.clear(); iNodesFailurefullyConnected.clear(); iWorkItem = iModel.nextItemToPublish(&found) ; if ( !found ) { iWorkItem.iObjectHash = KNullHash ; } else { LOG_STR2("PublishingEngine::run got item to pub %d ", iWorkItem.iObjectType) ; QList* nodesToTry = NULL ; switch ( iWorkItem.iObjectType ) { case ClassifiedAd2NdAddr: case UserProfileComment: case DbRecord: // user profile commments, ads with 2nd addr and // db records get published to seconddary address, // not content address nodesToTry = iModel.nodeModel().getNodesAfterHash(iWorkItem.i2NdAddr, 20, // 20 nodes 300 ) ;// at most 5 hours old break ; default: // all other content types get published to // primary address, or addr of the object itself nodesToTry = iModel.nodeModel().getNodesAfterHash(iWorkItem.iObjectHash, 20, // 20 nodes 300 ) ;// at most 5 hours old break ; } if ( nodesToTry == NULL || nodesToTry->size() == 0 ) { // uh, oh. do not try then. iWorkItem.iObjectHash = KNullHash ; LOG_STR("But got no nodes to try? ") ; } else { emptyNodeCandidateList() ; while ( ! nodesToTry->isEmpty() ) { Node* connectCandidate ( nodesToTry->takeFirst() ) ; if ( iModel.nodeModel().isNodeAlreadyConnected(*connectCandidate) ) { publishToNode(connectCandidate->nodeFingerPrint()) ; delete connectCandidate ; } else { iNodeCandidatesToTryPush.append(connectCandidate) ; } } iStageOfPublish = InitialStage; } delete nodesToTry ; } iModel.unlock() ; } // ok, we've got something..? if ( iWorkItem.iObjectHash != KNullHash ) { switch ( iStageOfPublish ) { case InitialStage: // ok, we just started. first look how many our desired nodes // are already connected and do those: sendPublishItemToAlreadyConnectedNodes() ; iStageOfPublish = AwaitingConnection; askConnectionsForNodesOnPublishList() ; break ; case AwaitingConnection: checkForSuccessfullyConnectedNodes() ; checkForUnSuccessfullyConnectedNodes() ; // check if we managed to run out of nodes: if ( iNodeCandidatesToTryPush.isEmpty() ) { // then pick up next publish-item and leave this behind iWorkItem.iObjectHash = KNullHash ; LOG_STR("PubEng: No more nodes to try ; picking up next item..") ; } break ; } } iNowRunning = false ; } } } void PublishingEngine::emptyNodeCandidateList() { while ( ! iNodeCandidatesToTryPush.isEmpty() ) { LOG_STR2("in emptyNodeCandidateList len of list is %d", (int)(iNodeCandidatesToTryPush.size())) ; Node* n = iNodeCandidatesToTryPush.takeFirst() ; delete n ; } } void PublishingEngine::askConnectionsForNodesOnPublishList() { // this is run at publish begin: we have item, we have // connected nodes. publish happens automatically to // nodes that are connected but some nodes then remain.. // here add the remaining nodes to network engines wishlist // so that it will attempt to connect: iModel.lock() ; for ( int i = 0 ; i < iNodeCandidatesToTryPush.size() ; i++ ) { Node* n = iNodeCandidatesToTryPush.at(i) ; // make copy of the node, because datamodel takes ownership: Node* wishListItem = Node::fromQVariant(n->asQVariant().toMap(), false) ; if ( wishListItem ) { iModel.nodeModel().addNodeToConnectionWishList(wishListItem) ; } } iModel.unlock() ; } void PublishingEngine::nodeConnectionAttemptStatus(Connection::ConnectionState aStatus, const Hash aHashOfAttemptedNode ) { LOG_STR2("PublishingEngine::nodeConnectionAttemptStatus %d in", aStatus) ; LOG_STR2("PublishingEngine::nodeConnectionAttemptStatus %s ", qPrintable(aHashOfAttemptedNode.toString())) ; // use model to lock our own resources too.. iModel.lock() ; for ( int i = 0 ; i < iNodeCandidatesToTryPush.size() ; i++ ) { if ( iNodeCandidatesToTryPush[i]->nodeFingerPrint() == aHashOfAttemptedNode ) { if ( aStatus == Connection::Open ) { if ( ! iNodesSuccessfullyConnected.contains(aHashOfAttemptedNode) ) { iNodesSuccessfullyConnected.append(aHashOfAttemptedNode) ; } } else { if ( ! iNodesFailurefullyConnected.contains(aHashOfAttemptedNode) ) { iNodesFailurefullyConnected.append(aHashOfAttemptedNode) ; } } break ; } } iModel.unlock() ; // so just add the hash into 1 of our internal arrays, run() will pick up // the items from list and try to do something clever } void PublishingEngine::sendPublishItemToAlreadyConnectedNodes() { iModel.lock() ; const QList & currentlyOpenConnections ( iModel.getConnections() ) ; for ( int i = iNodeCandidatesToTryPush.size()-1 ; ( i >=0 ) && ( iWorkItem.iObjectHash != KNullHash ) ; i-- ) { for ( int j = currentlyOpenConnections.size()-1 ; ( j >= 0 ) && ( iWorkItem.iObjectHash != KNullHash ) ; j-- ) { const Node* conn_n = currentlyOpenConnections[j]->node() ; if ( ( conn_n!= NULL ) && ( conn_n->nodeFingerPrint() == iNodeCandidatesToTryPush[i]->nodeFingerPrint() ) ) { // yes, a match. Node* n = iNodeCandidatesToTryPush[i] ; // here check if that node already got it: for ( int k = 0 ; k < iWorkItem.iAlreadyPushedHosts.size() ; k++ ) { LOG_STR2("iWorkItem.iAlreadyPushedHosts contains %u", iWorkItem.iAlreadyPushedHosts[k]) ; } if ( iWorkItem.iAlreadyPushedHosts.size() == 0) { LOG_STR("iWorkItem.iAlreadyPushedHosts is empty") ; } if ( iWorkItem.iAlreadyPushedHosts.contains(n->nodeFingerPrint().iHash160bits[4])) { LOG_STR("Node already had this content ; skipping in publish") ; // and also remove from list: iNodeCandidatesToTryPush.takeAt(i) ; delete n ; n = NULL ; } else { // note that publishtonode takes node from iAlreadyPushedHosts // and deletes it ; after the line above, do not try // to reference it again .. publishToNode(n->nodeFingerPrint()) ; n = NULL ; // and now gone } break ; // out from loop of j (so that i won't get tried again because it was just deleted } } } iModel.unlock() ; } void PublishingEngine::publishToNode(const Hash& aNode) { if ( iWorkItem.iObjectHash != KNullHash ) { if ( iWorkItem.iAlreadyPushedHosts.contains(aNode.iHash160bits[4])) { LOG_STR("Node already had this content ; skipping in publish") ; } else { struct NetworkRequestExecutor::NetworkRequestQueueItem sendReq ; sendReq.iDestinationNode = aNode ; sendReq.iRequestedItem = iWorkItem.iObjectHash; sendReq.iMaxNumberOfItems = 1 ; sendReq.iBangPath = iWorkItem.iAlreadyPushedHosts ; sendReq.iState = NetworkRequestExecutor::NewRequest ; switch ( iWorkItem.iObjectType ) { case UserProfile: sendReq.iRequestType = UserProfilePublish ; iModel.addNetworkRequest(sendReq) ; iWorkItem = iModel.addNodeToPublishedItem(iWorkItem.iObjectHash, aNode) ; LOG_STR2("Published profile to node %s", qPrintable(aNode.toString())) ; LOG_STR2("Published profile to node low-order bits %u", aNode.iHash160bits[4]) ; LOG_STR2("Now work-item type is %d",(int) iWorkItem.iObjectType) ; for ( int i = 0 ; i = 0 ; i-- ) { if ( aNode == iNodeCandidatesToTryPush[i]->nodeFingerPrint() ) { Node* n = iNodeCandidatesToTryPush.takeAt(i) ; delete n ; break ; } } if ( iNodesFailurefullyConnected.contains ( aNode ) ) { iNodesFailurefullyConnected.removeOne(aNode) ; } if ( iNodesSuccessfullyConnected.contains ( aNode ) ) { iNodesSuccessfullyConnected.removeOne(aNode) ; } } } // // this method is for periodically checking if any nodes we've // asked to be connected to, has actually been connected. // if such miracle has taken place, send the stuff and remove // node from list-of-nodes-to-ask (iNodeCandidatesToTryPush) // void PublishingEngine::checkForSuccessfullyConnectedNodes() { iModel.lock() ; for ( int i = iNodeCandidatesToTryPush.size()-1 ; ( i >=0 ) && ( iWorkItem.iObjectHash != KNullHash ) ; i-- ) { if ( iNodesSuccessfullyConnected.contains(iNodeCandidatesToTryPush[i]->nodeFingerPrint()) ) { // if we came here it means that we've asked for connection to // particular node and it happened LOG_STR2("PubEng: After asking, node has been connected: %s", qPrintable(iNodeCandidatesToTryPush[i]->nodeFingerPrint().toString())) ; publishToNode(iNodeCandidatesToTryPush[i]->nodeFingerPrint()) ; } } // can be emptied every time ; if there were anything important, it // has been processed above iNodesSuccessfullyConnected.clear() ; iModel.unlock() ; } // // this is for pruning from ask-list those nodes that we've tried // to connect with no success // void PublishingEngine::checkForUnSuccessfullyConnectedNodes() { iModel.lock() ; for ( int i = iNodeCandidatesToTryPush.size()-1 ; ( i >=0 ) && ( iWorkItem.iObjectHash != KNullHash ) ; i-- ) { if ( iNodesFailurefullyConnected.contains(iNodeCandidatesToTryPush[i]->nodeFingerPrint()) ) { // if we came here it means that we've asked for connection to // particular node and it did not happen LOG_STR2("PubEng: After asking, node has not been connected: %s", qPrintable(iNodeCandidatesToTryPush[i]->nodeFingerPrint().toString())) ; Node* n = iNodeCandidatesToTryPush.takeAt(i) ; delete n ; } } // can be emptied every time ; if there were anything important, it // has been processed above iNodesFailurefullyConnected.clear() ; iModel.unlock() ; } classified-ads-0.13/net/publishingengine.h000066400000000000000000000062001331670245300206030ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PUBLISHING_ENG_H #define PUBLISHING_ENG_H #include #include #include "connection.h" // for ConnectionObserver #include "../controller.h" #include "../datamodel/model.h" /** * @brief Network-connection logic relating content publish demands * * Class that will ask for connections to nodes destined to * be holders of stuff published in this node. Once * connection is established, stuff to be published * is copied into send-queue of the newly-connected * node. */ class PublishingEngine : public QTimer { Q_OBJECT public: /** * Constructor * @param aController application controller. not owned * @param aModel persistent storage. */ PublishingEngine(Controller* aController, Model& aModel ) ; /** * Destructor */ ~PublishingEngine() ; signals: void error(QTcpSocket::SocketError socketError); public slots: /** when connection is attempted, @ref NetworkListener will * emit the status (failed or success) of the connection, * emitted signal is connected here */ void nodeConnectionAttemptStatus(Connection::ConnectionState aStatus, const Hash aHashOfAttemptedNode ); /** * this class is a not a thread, but QTimer, thus run. */ void run(); private: void emptyNodeCandidateList() ; void askConnectionsForNodesOnPublishList() ; enum StageOfPublish { InitialStage, AwaitingConnection } ; void sendPublishItemToAlreadyConnectedNodes() ; void publishToNode(const Hash& aNode) ; void checkForSuccessfullyConnectedNodes() ; void checkForUnSuccessfullyConnectedNodes() ; public: /** when this is set to false, thread will terminate and run() return */ bool iNeedsToRun ; private: // data Controller* iController ; /**< application controller */ Model &iModel ; /**< persistent storage */ PublishItem iWorkItem ; /**< what we're trying to publish */ /** list of nodes where iWorkItem might be pushed to */ QList iNodeCandidatesToTryPush ; QList iNodesSuccessfullyConnected ; QList iNodesFailurefullyConnected ; StageOfPublish iStageOfPublish ; bool iNowRunning ; } ; #endif classified-ads-0.13/net/retrievalengine.cpp000066400000000000000000000371351331670245300210020ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "retrievalengine.h" #include "../log.h" #include "../controller.h" #include "../datamodel/model.h" #include "node.h" #include "connection.h" RetrievalEngine::RetrievalEngine(Controller* aController, Model& aModel) : QTimer(aController), iController(aController), iModel(aModel), iNowRunning(false) { iNodeCandidatesToTryQuery.clear() ; connect(this, SIGNAL(timeout()), this, SLOT(run())); } RetrievalEngine::~RetrievalEngine() { LOG_STR("RetrievalEngine::~RetrievalEngine") ; emptyNodeCandidateList() ; LOG_STR("RetrievalEngine::~RetrievalEngine out") ; } void RetrievalEngine::run() { if ( iNowRunning == false ) { iNowRunning = true ; if ( iObjectBeingRetrieved.iRequestedItem == KNullHash ) { // we had nothing to retrieve, go on and start iModel.lock() ; if ( iDownloadQueue.size() > 0 ) { iObjectBeingRetrieved = iDownloadQueue.takeAt(0) ; iObjectBeingRetrieved.iState = NetworkRequestExecutor::NewRequest ; } iModel.unlock() ; iObjectBeingRetrieved.iTimeStampOfLastActivity= QDateTime::currentDateTimeUtc().toTime_t(); } if ( iObjectBeingRetrieved.iRequestedItem != KNullHash ) { iModel.lock() ; switch ( iObjectBeingRetrieved.iState ) { case NetworkRequestExecutor::NewRequest: { // do internal initialization: iNodesSuccessfullyConnected.clear(); iNodesFailurefullyConnected.clear(); emptyNodeCandidateList() ; // initial stage, check if we have named node: if( iObjectBeingRetrieved.iDestinationNode != KNullHash ) { // we have candidate, check if it is connected, or should // we have it on wishlist: if(iModel.nodeModel().isNodeAlreadyConnected(iObjectBeingRetrieved.iDestinationNode)) { sendQueryToNode(iObjectBeingRetrieved.iDestinationNode) ; } else { iNodeCandidatesToTryQuery.append(iObjectBeingRetrieved.iDestinationNode) ; iModel.nodeModel().addNodeToConnectionWishList(iObjectBeingRetrieved.iDestinationNode); } } // additionally, to our connected nodes send a query // about nodes around that hash we want: NetworkRequestExecutor::NetworkRequestQueueItem hashReq ; hashReq.iRequestType = RequestForNodesAroundHash ; hashReq.iRequestedItem = iObjectBeingRetrieved.iRequestedItem ; hashReq.iState = NetworkRequestExecutor::NewRequest ; hashReq.iMaxNumberOfItems = 10 ; // ask from 10 nodes currently connected iModel.addNetworkRequest(hashReq) ; // datamodel will add to queue // and netreq-executor will send to 10 nodes iObjectBeingRetrieved.iState = NetworkRequestExecutor::Processing ; iObjectBeingRetrieved.iTimeStampOfLastActivity= QDateTime::currentDateTimeUtc().toTime_t(); } break ; case NetworkRequestExecutor::Processing: { if ( iObjectBeingRetrieved.iTimeStampOfLastActivity + 10 < QDateTime::currentDateTimeUtc().toTime_t() ) { // 10 seconds passed since we asked for node references // around hash: proceed to ask for connections to // given node QList* nodesToTry = iModel.nodeModel().getNodesAfterHash(iObjectBeingRetrieved.iRequestedItem, 20, // 20 nodes 300 ) ;// at most 5 hours old while ( ! nodesToTry->isEmpty() ) { Node* connectCandidate ( nodesToTry->takeFirst() ) ; if ( connectCandidate->nodeFingerPrint() != iController->getNode().nodeFingerPrint() ) { if ( iModel.nodeModel().isNodeAlreadyConnected(connectCandidate->nodeFingerPrint()) ) { sendQueryToNode(connectCandidate->nodeFingerPrint()) ; QLOG_STR("In retrieve::processing node " + connectCandidate->nodeFingerPrint().toString() + " was already connected") ; delete connectCandidate ; } else { iNodeCandidatesToTryQuery.append(connectCandidate->nodeFingerPrint()) ; iModel.nodeModel().addNodeToConnectionWishList(connectCandidate) ; QLOG_STR("In retrieve::processing node " + connectCandidate->nodeFingerPrint().toString() + " was added to wishlist") ; } } } if ( iNodeCandidatesToTryQuery.size() > 0 ) { iObjectBeingRetrieved.iState = NetworkRequestExecutor::NodeIsInWishList ; iObjectBeingRetrieved.iTimeStampOfLastActivity= QDateTime::currentDateTimeUtc().toTime_t(); } else { // did not add anything to wishlist ; set timestamp back // to past so this state-machine will spam the query to // every connected node ; better than nothing iObjectBeingRetrieved.iState = NetworkRequestExecutor::NodeIsInWishList ; iObjectBeingRetrieved.iTimeStampOfLastActivity= QDateTime::currentDateTimeUtc().toTime_t() - 120; } } } break ; case NetworkRequestExecutor::NodeIsInWishList: { if ( iObjectBeingRetrieved.iTimeStampOfLastActivity + 60 < QDateTime::currentDateTimeUtc().toTime_t() ) { // after one minute decide that we're not gonna get // it from nodes where we requested connection to .. // spam the request to our connected nodes const QList & currentlyOpenConnections ( iModel.getConnections() ) ; Node* n ( NULL ) ; Connection* c (NULL) ; for ( int i = 0 ; i < 10 && i< currentlyOpenConnections.size() ; i++ ) { c = currentlyOpenConnections.at(i) ; if ( c && ( ( n = c->node() ) != NULL ) ) { sendQueryToNode(n->nodeFingerPrint()) ; } } iObjectBeingRetrieved.iState=NetworkRequestExecutor::RequestBeingSentAround; iObjectBeingRetrieved.iTimeStampOfLastActivity= QDateTime::currentDateTimeUtc().toTime_t(); } else { checkForSuccessfullyConnectedNodes() ; checkForUnSuccessfullyConnectedNodes() ; } } break ; case NetworkRequestExecutor::RequestBeingSentAround: { if ( iObjectBeingRetrieved.iTimeStampOfLastActivity + 60 < QDateTime::currentDateTimeUtc().toTime_t() ) { // after one minute+one minute give up emit notifyOfContentNotReceived(iObjectBeingRetrieved.iRequestedItem , iObjectBeingRetrieved.iRequestType ) ; iObjectBeingRetrieved.iRequestedItem= KNullHash ; iObjectBeingRetrieved.iState=NetworkRequestExecutor::ReadyToSend; } else { checkForSuccessfullyConnectedNodes() ; checkForUnSuccessfullyConnectedNodes() ; } } break; case NetworkRequestExecutor::ReadyToSend: // final stage, do nothing here break ; } iModel.unlock() ; } // if iRequestedItem was not nullhash iNowRunning = false ; } } void RetrievalEngine::emptyNodeCandidateList() { iNodeCandidatesToTryQuery.clear() ; } void RetrievalEngine::nodeConnectionAttemptStatus(Connection::ConnectionState aStatus, const Hash aHashOfAttemptedNode ) { LOG_STR2("RetrievalEngine::nodeConnectionAttemptStatus %d in", aStatus) ; LOG_STR2("RetrievalEngine::nodeConnectionAttemptStatus %s ", qPrintable(aHashOfAttemptedNode.toString())) ; // use model to lock our own resources too.. iModel.lock() ; for ( int i = 0 ; i < iNodeCandidatesToTryQuery.size() ; i++ ) { if ( iNodeCandidatesToTryQuery[i] == aHashOfAttemptedNode ) { if ( aStatus == Connection::Open ) { if ( ! iNodesSuccessfullyConnected.contains(aHashOfAttemptedNode) ) { iNodesSuccessfullyConnected.append(aHashOfAttemptedNode) ; } } else { if ( ! iNodesFailurefullyConnected.contains(aHashOfAttemptedNode) ) { iNodesFailurefullyConnected.append(aHashOfAttemptedNode) ; } } break ; } } iModel.unlock() ; // so just add the hash into 1 of our internal arrays, run() will pick up // the items from list and try to do something clever } void RetrievalEngine::sendQueryToNode(const Hash& aNode) { if ( iObjectBeingRetrieved.iRequestedItem != KNullHash ) { if ( iNodesFailurefullyConnected.contains ( aNode ) ) { iNodesFailurefullyConnected.removeOne(aNode) ; } if ( iNodesSuccessfullyConnected.contains ( aNode ) ) { iNodesSuccessfullyConnected.removeOne(aNode) ; } } struct NetworkRequestExecutor::NetworkRequestQueueItem queryReq = iObjectBeingRetrieved ; queryReq.iDestinationNode = aNode ; queryReq.iState = NetworkRequestExecutor::NewRequest ; iModel.addNetworkRequest(queryReq) ; } // // this method is for periodically checking if any nodes we've // asked to be connected to, has actually been connected. // if such miracle has taken place, send the stuff and remove // node from list-of-nodes-to-ask (iNodeCandidatesToTryQuery) // void RetrievalEngine::checkForSuccessfullyConnectedNodes() { for ( int i = iNodeCandidatesToTryQuery.size()-1 ; ( i >=0 ) && ( iObjectBeingRetrieved.iRequestedItem != KNullHash ) ; i-- ) { if ( iNodesSuccessfullyConnected.contains(iNodeCandidatesToTryQuery[i] ) ) { // if we came here it means that we've asked for connection to // particular node and it happened LOG_STR2("RetEng: After asking, node has been connected: %s", qPrintable(iNodeCandidatesToTryQuery[i].toString())) ; sendQueryToNode(iNodeCandidatesToTryQuery[i]) ; } } // can be emptied every time ; if there were anything important, it // has been processed above iNodesSuccessfullyConnected.clear() ; } // // this is for pruning from ask-list those nodes that we've tried // to connect with no success // void RetrievalEngine::checkForUnSuccessfullyConnectedNodes() { for ( int i = iNodeCandidatesToTryQuery.size()-1 ; ( i >=0 ) && ( iObjectBeingRetrieved.iRequestedItem != KNullHash ) ; i-- ) { if ( iNodesFailurefullyConnected.contains(iNodeCandidatesToTryQuery[i]) ) { // if we came here it means that we've asked for connection to // particular node and it did not happen LOG_STR2("RetEng: After asking, node has not been connected: %s", qPrintable(iNodeCandidatesToTryQuery[i].toString())) ; iNodeCandidatesToTryQuery.removeAt(i) ; } } // can be emptied every time ; if there were anything important, it // has been processed above iNodesFailurefullyConnected.clear() ; } void RetrievalEngine::startRetrieving( NetworkRequestExecutor::NetworkRequestQueueItem aObject, bool aIsPriorityWork) { bool isAlreadyInQueue ( false ) ; for ( int i = 0 ; i < iDownloadQueue.size() ; i++ ) { if (iDownloadQueue.at(i).iRequestedItem == aObject.iRequestedItem && iDownloadQueue.at(i).iRequestType == aObject.iRequestType ) { isAlreadyInQueue = true ; break ; } } if ( isAlreadyInQueue == false && aIsPriorityWork == false ) { iDownloadQueue.append(aObject) ; } else if (aIsPriorityWork == true && iObjectBeingRetrieved.iRequestedItem != aObject.iRequestedItem) { // so we got another priority work: queue the current item and // start fetching this new one: // insert previously active item in front iDownloadQueue.insert(0, iObjectBeingRetrieved) ; iObjectBeingRetrieved.iRequestedItem = KNullHash ; emptyNodeCandidateList() ; iNodesSuccessfullyConnected.clear(); iNodesFailurefullyConnected.clear() ; iDownloadQueue.insert(0, aObject) ; // insert in front } else { // were obviously already downloading said item, either via queue // or in iObjectBeingRetrieved -> do no thing } } void RetrievalEngine::notifyOfContentReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfReceivdContent ) { ProtocolItemType typeToCheckFromQueue ; bool doCheck ( false ) ; switch ( aTypeOfReceivdContent ) { case BinaryBlob: typeToCheckFromQueue = RequestForBinaryBlob ; doCheck = true ; break ; case UserProfile: typeToCheckFromQueue = RequestForUserProfile ; doCheck = true ; break ; case ClassifiedAd: typeToCheckFromQueue = RequestForClassifiedAd ; doCheck = true ; break ; default: doCheck = false ; break ; } if ( doCheck ) { iModel.lock() ; if ( iObjectBeingRetrieved.iRequestedItem == aHashOfContent && iObjectBeingRetrieved.iRequestType == typeToCheckFromQueue ) { // hurray, we got what we were waiting for iObjectBeingRetrieved.iRequestedItem = KNullHash ; iObjectBeingRetrieved.iState=NetworkRequestExecutor::ReadyToSend; iNodesSuccessfullyConnected.clear(); iNodesFailurefullyConnected.clear() ; emptyNodeCandidateList() ; } // also check queue: for ( int i = iDownloadQueue.size()-1 ; i >= 0 ; i-- ) { if (iDownloadQueue.at(i).iRequestedItem == aHashOfContent && iDownloadQueue.at(i).iRequestType == typeToCheckFromQueue ) { iDownloadQueue.removeAt(i) ; } } iModel.unlock() ; } } classified-ads-0.13/net/retrievalengine.h000066400000000000000000000101061331670245300204340ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef RETRIEVAL_ENG_H #define RETRIEVAL_ENG_H #include #include #include "connection.h" // for ConnectionObserver #include "../controller.h" #include "../datamodel/model.h" /** * @brief Network-connection logic relating fetching items from DHT * * This class has some similarity to @ref PublishingEngine but this * does somewhat the reverse. This is given a hash of object to * find from network ; in order to so, it will initiate connections * nearby nodes and ask for the content in-demand. */ class RetrievalEngine : public QTimer { Q_OBJECT public: /** * Constructor * @param aController application controller. not owned * @param aModel persistent storage. */ RetrievalEngine(Controller* aController, Model& aModel ) ; /** * Destructor */ ~RetrievalEngine() ; /** * command-interface for this class: start to do work * @param aObject specifies the object to dl. * @param aIsPriorityWork is set to true if download should * start right away, bypassing all other * stuff that might be in the queue */ void startRetrieving( NetworkRequestExecutor::NetworkRequestQueueItem aObject, bool aIsPriorityWork) ; /** * when content is received, we may want to check if it * was the content we were waiting for. this method * is for performing that check */ void notifyOfContentReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfReceivdContent ); signals: void error(QTcpSocket::SocketError socketError); void notifyOfContentNotReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfNotReceivdContent ); public slots: /** * when connection is attempted, @ref NetworkListener will * emit the status (failed or success) of the connection, * emitted signal is connected here */ void nodeConnectionAttemptStatus(Connection::ConnectionState aStatus, const Hash aHashOfAttemptedNode ); /** * this class is a not a thread, but QTimer, thus run. */ void run(); private: void emptyNodeCandidateList() ; void askConnectionsForNodesOnConnectList() ; void sendQueryItemToAlreadyConnectedNodes() ; void sendQueryToNode(const Hash& aNode) ; void checkForSuccessfullyConnectedNodes() ; void checkForUnSuccessfullyConnectedNodes() ; private: // data Controller* iController ; /**< application controller */ Model &iModel ; /**< persistent storage */ /** * what kind of stuff we try. ..this class waits for * exactly one item at time. item currently being fetched * is stored in this variable */ NetworkRequestExecutor::NetworkRequestQueueItem iObjectBeingRetrieved ; /** list of nodes where iWorkItem might be pushed to */ QList iNodeCandidatesToTryQuery ; QList iNodesSuccessfullyConnected ; QList iNodesFailurefullyConnected ; bool iNowRunning ; /** queue of items that we should get */ QList iDownloadQueue ; } ; #endif classified-ads-0.13/net/voicecallengine.cpp000066400000000000000000001010501331670245300207320ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "voicecallengine.h" #include "../datamodel/voicecall.h" // for ConnectionObserver #include "../log.h" #include "../mcontroller.h" #include "node.h" #include "connection.h" #include "protocol_message_formatter.h" // used here directly #include "../datamodel/contentencryptionmodel.h" // for ConnectionObserver #include "../call/audiomixer.h" #include "../call/audioplayer.h" #include "../call/audiosource.h" #include "../call/ringtoneplayer.h" #include #include "../datamodel/profilemodel.h" // for getting operator profile data #include "../datamodel/nodemodel.h" // for getting nodes of operators #include "../datamodel/profile.h" #include "../datamodel/trusttreemodel.h" VoiceCallEngine::VoiceCallEngine(MController& aController, Model& aModel) : QAbstractTableModel(NULL), iController(aController), iModel(aModel), iMixer(NULL), iAudioSource(NULL), iAudioPlayer(NULL) { connect (this, SIGNAL(startProcessCallData()), this, SLOT(processCallData()), Qt::QueuedConnection) ; } VoiceCallEngine::~VoiceCallEngine() { delete iAudioSource ; delete iMixer ; delete iAudioPlayer ; } void VoiceCallEngine::installObserver(MCallStatusObserver* aObserver) { if ( !iCallObservers.contains(aObserver) ) { iCallObservers.append(aObserver) ; } } void VoiceCallEngine::removeObserver(MCallStatusObserver* aObserver) { iCallObservers.removeAll(aObserver) ; } // // this method is called from protocol part so that datamodel is // locked so no need to lock again // void VoiceCallEngine::insertCallData(quint32 aCallId, quint32 aSeqNo, VoiceCallEngine::PayloadType aPayloadType, const QByteArray& aPayload, Hash& aSendingNode ) { switch ( aPayloadType ) { case VoiceCallEngine::Audio: { iModel.lock() ; // here process audio data for ( int i = iOnGoingCalls.size() -1 ; i >= 0 ; i-- ) { const VoiceCallEngine::VoiceCallExtension& call ( iOnGoingCalls.at(i) ) ; Hash peerHash ( callPeerFingerPrint(call ) ) ; if ( call.iCallId == aCallId && call.iDecoder && peerHash == aSendingNode ) { call.iDecoder->frameReceived(aCallId, aSeqNo, aPayload, aSendingNode ) ; break ; // out of the loop } } iModel.unlock() ; } break ; case Control: // call control data ; maybe informational messages break ; default: break ; } } // when this is called, iModel.lock() is on, so here it // is not necessary to lock again void VoiceCallEngine::insertCallStatusData(const VoiceCall& aCallStatus, const Hash& aSendingNode ) { QPair pendingEntry ( aCallStatus, aSendingNode ) ; iCallDataPendingProcessing.append(pendingEntry) ; QLOG_STR("VoiceCallEngine::insertCallStatusData " + QString::number(aCallStatus.iCallId) + " nick " + pendingEntry.first.iPeerOperatorNick) ; emit startProcessCallData() ; return ; } void VoiceCallEngine::processCallData() { iModel.lock() ; while (iCallDataPendingProcessing.size() ) { QPair queueEntry ( iCallDataPendingProcessing.takeAt(0)) ; const VoiceCall& callStatus ( queueEntry.first ) ; Hash& sendingNode ( queueEntry.second ) ; bool previousCallFound(false) ; QLOG_STR("VoiceCallEngine::processCallData " + QString::number(callStatus.iCallId)) ; for ( int i = iOnGoingCalls.size() -1 ; i >= 0 ; i-- ) { VoiceCallEngine::VoiceCallExtension& call ( iOnGoingCalls[i] ) ; if ( call.iCallId == callStatus.iCallId ) { previousCallFound = true ; if ( checkForNodeValidity(call, sendingNode) ) { QLOG_STR("callStatus.iOkToProceed = " + QString::number(callStatus.iOkToProceed)) ; if ( callStatus.iOkToProceed == false ) { call.iOkToProceed = false ; call.iOnGoingCallState = Closed ; sendCallStatusUpdateToRemote(call) ; removeCallFromMixer(call) ; QLOG_STR("call removed from mixer") ; removeCallFromArray(call) ; QLOG_STR("call removed from array") ; sendCallStatusUpdates(call.iCallId, call.iOnGoingCallState) ; } else { // it is ok to continue. if ( call.iOnGoingCallState == Initial ) { // was our outgoing call that was "answered" if ( callStatus.iSymmetricAESKey.size() > 0 ) { call.iOnGoingCallState = Open ; sendCallStatusUpdates(call.iCallId, call.iOnGoingCallState) ; // 3 and 5 are the columns emit dataChanged(createIndex(i,3),createIndex(i,5)) ; setupLocalAudioCapture(call) ; setupAudioOutput(call) ; addCallToMixer(call) ; } } } } break ; } } if ( previousCallFound == false && callStatus.iOkToProceed) { QLOG_STR("Previous call not found") ; // ok ,we do not have call going on, so start as new VoiceCallExtension newCall (callStatus); newCall.iPeerOperatorNick = callStatus.iPeerOperatorNick ; if ( checkForNodeValidity(callStatus, sendingNode) ) { if ( newCall.iOriginatingNode == iController.getNode().nodeFingerPrint() ) { setupNewOutgoingCall(newCall) ; } else { // this is incoming call Model::CallAcceptanceSetting acceptance ( iModel.getCallAcceptanceSetting() ) ; Hash operatorHash ( iController.model().contentEncryptionModel(). hashOfPublicKey(newCall.iOriginatingOperatorKey) ) ; if ( acceptance == Model::AcceptNoCalls || ( acceptance == Model::AcceptCallsFromTrusted && iModel.trustTreeModel()->isProfileTrusted(operatorHash,NULL,NULL) == false )) { newCall.iOkToProceed = false ; sendCallStatusUpdateToRemote(newCall) ; QLOG_STR("Silentely rejected call because of setting"); } else { setupNewIncomingCall(newCall) ; } } } } } iModel.unlock() ; } bool VoiceCallEngine::addCallToMixer(const VoiceCallExtension& aCall) { if ( iMixer && iAudioSource ) { if ( rowCount() == 1 ) { // if this is our first call, insert our // local capture as one stream into the mixer iMixer->insertStream(aCall.iCallId, iAudioSource->getCurrentSeqNo(), true, KNullHash ) ; // locally captured should have KNullHash as node } // always add the remote stream into the mixer iMixer->insertStream(aCall.iCallId, 0, false, callPeerFingerPrint(aCall) ) ; } return true ; } bool VoiceCallEngine::removeCallFromMixer(const VoiceCallExtension& aCall) { if ( iMixer && iAudioSource ) { iMixer->removeStream(aCall.iCallId) ; } return true ; } bool VoiceCallEngine::setupNewOutgoingCall(VoiceCallExtension& aCall) { QLOG_STR("VoiceCallEngine::setupNewOutgoingCall nick = " + aCall.iPeerOperatorNick ) ; // check that we're not having a call to node already: foreach ( const VoiceCallExtension& call, iOnGoingCalls ) { const Hash peerHash ( callPeerFingerPrint(call) ) ; if ( peerHash == callPeerFingerPrint(aCall) ) { // already connected: QLOG_STR("Call was already in progress") ; return false ; } } if ( aCall.iOriginatingNode == iController.getNode().nodeFingerPrint() ) { // stupid check but try call setup only if the call // is originated by this same node. aCall.iOnGoingCallState = Initial ; addCallToArray(aCall) ; sendCallStatusUpdates(aCall.iCallId, aCall.iOnGoingCallState) ; // send request to remote node: if ( iModel.nodeModel().isNodeAlreadyConnected(aCall.iDestinationNode) ) { // is connected, send: QByteArray* request = new QByteArray() ; request->append(ProtocolMessageFormatter::voiceCall(aCall, iController, iController.profileInUse(), true)) ; iModel.addItemToSend(aCall.iDestinationNode, request) ; } else { // node is not connected, use network request mechanism } } return true ; } bool VoiceCallEngine::setupNewIncomingCall(VoiceCallExtension& aCall) { QLOG_STR("VoiceCallEngine::setupNewIncomingCall") ; // check that there is operator operating the node: if ( iController.profileInUse() == KNullHash ) { aCall.iOkToProceed = false ; sendCallStatusUpdateToRemote(aCall,false) ; return false ; } else { aCall.iOnGoingCallState = Incoming ; addCallToArray(aCall) ; sendCallStatusUpdates(aCall.iCallId, aCall.iOnGoingCallState) ; // if it is also the first call, put a ringtone playing: // the player is "fire and forget" type, it will take care // of itself, according to call status if ( iOnGoingCalls.size() == 1 ) { new RingtonePlayer(iModel,iController) ; } return true ; } } QList VoiceCallEngine::onGoingCalls() const { QList retval ; foreach ( const VoiceCallExtension& call, iOnGoingCalls ) { retval.append(call.iCallId) ; } return retval ; } VoiceCallEngine::CallState VoiceCallEngine::callStatus(quint32 aCallId) const { foreach ( const VoiceCallExtension& call, iOnGoingCalls ) { if ( call.iCallId == aCallId ) { return call.iOnGoingCallState ; } } return VoiceCallEngine::Error ; } void VoiceCallEngine::closeCall(quint32 aCallId) { QLOG_STR("VoiceCallEngine::closeCall " + QString::number(aCallId)) ; iModel.lock() ; for ( int i = iOnGoingCalls.size() -1 ; i >= 0 ; i-- ) { VoiceCallEngine::VoiceCallExtension& call ( iOnGoingCalls[i] ) ; if ( call.iCallId == aCallId ) { call.iOkToProceed = false ; sendCallStatusUpdateToRemote(call) ; removeCallFromMixer(call) ; removeCallFromArray(call) ; sendCallStatusUpdates(aCallId, Closed) ; } } iModel.unlock() ; } void VoiceCallEngine::sendCallStatusUpdateToRemote(const VoiceCall& aCall, bool aDoSign ) { const Hash peerHash ( callPeerFingerPrint(aCall ) ) ; if ( iModel.nodeModel().isNodeAlreadyConnected(peerHash) ) { // is connected, send: QByteArray* request = new QByteArray() ; request->append(ProtocolMessageFormatter::voiceCall(aCall, iController, iController.profileInUse(), aDoSign)) ; iModel.addItemToSend(peerHash, request) ; } } void VoiceCallEngine::acceptCall(quint32 aCallId) { QLOG_STR("VoiceCallEngine::acceptCall " + QString::number(aCallId)) ; iModel.lock() ; for ( int i = iOnGoingCalls.size() -1 ; i >= 0 ; i-- ) { VoiceCallEngine::VoiceCallExtension& call ( iOnGoingCalls[i] ) ; if ( call.iCallId == aCallId && call.iOnGoingCallState == Incoming ) { call.iOkToProceed = true ; if ( call.iSymmetricAESKey.size() == 0 ) { const int KNumberOfBits ( 256 ) ; call.iSymmetricAESKey.append(iController.model() .contentEncryptionModel() .randomBytes(KNumberOfBits/8)) ; } call.iOnGoingCallState = Open ; sendCallStatusUpdates(aCallId, Open) ; sendCallStatusUpdateToRemote(call) ; // 3 and 5 are the columns emit dataChanged(createIndex(i,3),createIndex(i,5)) ; setupLocalAudioCapture(call) ; setupAudioOutput(call) ; addCallToMixer(call) ; } } iModel.unlock() ; } void VoiceCallEngine::sendCallStatusUpdates(quint32 aCallId, CallState aState) { foreach ( MCallStatusObserver* observer, iCallObservers ) { observer->callStatusChanged(aCallId,aState) ; } emit callStateChanged(aCallId,aState) ; } void VoiceCallEngine::nodeConnectionAttemptStatus(Connection::ConnectionState aStatus, const Hash aHashOfAttemptedNode ) { iModel.lock() ; // check connectivity again because sometimes there are double // connections, one connects, another fails but is reported here // anyway if ( iModel.nodeModel().isNodeAlreadyConnected(aHashOfAttemptedNode) == false ) { for ( int i = iOnGoingCalls.size() -1 ; i >= 0 ; i-- ) { VoiceCallEngine::VoiceCallExtension& call ( iOnGoingCalls[i] ) ; Hash callNodeAddr ( callPeerFingerPrint(call) ) ; if ( callNodeAddr == aHashOfAttemptedNode && ( aStatus == Connection::Closing || aStatus == Connection::Error ) ) { // put call status change into queue and emit // a queued signal: call.iOkToProceed = false ; QPair pendingEntry ( call, aHashOfAttemptedNode ) ; iCallDataPendingProcessing.append(pendingEntry) ; emit startProcessCallData() ; } } } iModel.unlock() ; } Hash VoiceCallEngine::callPeerFingerPrint(const VoiceCall& aCall) const { Hash retval ( KNullHash ) ; if ( aCall.iOriginatingNode == iController.getNode().nodeFingerPrint() ) { // we originated this, so lets return the dest addr retval = aCall.iDestinationNode ; } else { retval = aCall.iOriginatingNode ; } return retval ; } // note how aCall is reference to same array where we're going // to remove the call from: the actual removal must be very // last thing to do void VoiceCallEngine::removeCallFromArray(VoiceCallExtension& aCall) { int indexToBeRemoved = -1 ; for ( int i = iOnGoingCalls.size() -1 ; i >= 0 ; i-- ) { VoiceCallEngine::VoiceCallExtension& call ( iOnGoingCalls[i] ) ; if ( aCall.iCallId == call.iCallId ) { indexToBeRemoved = i ; } } if ( indexToBeRemoved > -1 ) { QLOG_STR("removeCallFromArray array size = " + QString::number(iOnGoingCalls.size()) + " now removed " + QString::number(aCall.iCallId) ) ; if ( iOnGoingCalls.size() == 1 ) { // one left, will be removed // got no ongoing calls left, lets tear audio down setupLocalAudioCapture(aCall) ; setupAudioOutput(aCall) ; } beginRemoveRows(QModelIndex(), indexToBeRemoved, indexToBeRemoved ) ; iOnGoingCalls.removeAt(indexToBeRemoved) ; endRemoveRows() ; } } void VoiceCallEngine::addCallToArray(VoiceCallExtension& aCall) { bool found ( false ) ; for ( int i = iOnGoingCalls.size() -1 ; i >= 0 ; i-- ) { VoiceCallEngine::VoiceCallExtension& call ( iOnGoingCalls[i] ) ; if ( aCall.iCallId == call.iCallId ) { found = true ; break ; } } if ( !found ) { Hash operatorHash ( iController.model().contentEncryptionModel(). hashOfPublicKey(aCall.iOriginatingOperatorKey) ) ; aCall.iPeerOperatorHash = operatorHash.toString() ; if ( aCall.iPeerOperatorHash == iController.profileInUse().toString() ) { // this is call originated by me and the peer name is not known if ( aCall.iPeerOperatorNick.length() == 0 ) { aCall.iPeerOperatorNick = "-" ; } } else { aCall.iPeerOperatorNick = iController.displayableNameForProfile(operatorHash); } beginInsertRows(QModelIndex(), iOnGoingCalls.size(), iOnGoingCalls.size() ) ; iOnGoingCalls.append(aCall) ; endInsertRows() ; } } // methods overridden from QAbstractTableModel: int VoiceCallEngine::rowCount(const QModelIndex & /*parent*/ ) const { return iOnGoingCalls.size() ; } int VoiceCallEngine::columnCount(const QModelIndex & /* parent */ ) const { // let columns be // 1. peer operator // 2. peer network addr // 3. call status // 4. accept/reject -button // 5. close-button return 5 ; } QVariant VoiceCallEngine::data(const QModelIndex & index, int role ) const { if(!index.isValid()) return QVariant(); if ( role == Qt::UserRole ) { return QVariant(iOnGoingCalls.at(index.row()).iCallId) ; } if ( role == Qt::EditRole ) { QLOG_STR("Qt::EditRole at call status " + QString::number(index.row())) ; switch ( index.column() ) { case 0: case 1: case 2: case 3: case 4: return QVariant() ; } } else if ( role == Qt::DisplayRole ) { switch ( index.column() ) { case 0: // 1. peer operator return iOnGoingCalls.at(index.row()).iPeerOperatorNick ; case 1: // 2. peer network addr return iOnGoingCalls.at(index.row()).iPeerNodeAddress ; case 2: // 3. call status return callStatusString(iOnGoingCalls.at(index.row())) ; case 3: // 4. accept/reject -button if ( iOnGoingCalls.at(index.row()).iOnGoingCallState == Incoming ) { return tr("Accept") ; } else { return QVariant() ; } case 4: // 5. close-button if ( iOnGoingCalls.at(index.row()).iOnGoingCallState == Incoming ) { return tr("Reject") ; } else { return tr("Close") ; } break ; } } return QVariant() ; } QVariant VoiceCallEngine::headerData ( int section, Qt::Orientation /* orientation */, int role ) const { switch ( role ) { case Qt::ToolTipRole: switch ( section ) { case 0: return tr("Actual network address (SHA1) of the peer operator") ; break; case 1: return tr("Network address of the remote node") ; break; default: return QVariant(); break ; } break ; case Qt::DisplayRole: switch ( section ) { case 0: return tr("Operator") ; break; case 1: return tr("Node address") ; break ; case 2: return tr("Call status") ; break ; case 4: return tr("Controls") ; break ; case 5: return tr("Ending") ; break ; default: return QVariant(); } break ; case Qt::SizeHintRole: switch ( section ) { case 0: return QSize(300,25) ; break; case 1: return QSize(200,25) ; break ; case 2: return QSize(50,25) ; break ; case 3: return QSize(30,25) ; break ; case 4: return QSize(30,25) ; break ; default: return QVariant(); } break ; default: return QVariant(); break ; } } QString VoiceCallEngine::callStatusString(const VoiceCallExtension& aCall) const { QString retval ; switch(aCall.iOnGoingCallState) { case Initial: retval = tr("Initializing") ; break ; case Incoming: retval = tr("Incoming") ; break ; case Open: retval = tr("Open") ; break ; case Closing: retval = tr("Closing") ; break ; case Closed: retval = tr("Closed") ; break ; case Error: retval = tr("Error") ; break ; case NoCall: retval = tr("No call") ; break ; } return retval ; } bool VoiceCallEngine::checkForNodeValidity(const VoiceCall& aCallStatus, const Hash& aSendingNode) const { if ( iController.getNode().nodeFingerPrint() == aCallStatus.iOriginatingNode && iController.getNode().nodeFingerPrint() == aSendingNode ) { // accept everything from this same node return true ; } else if ( ( aSendingNode == aCallStatus.iOriginatingNode ) || ( aCallStatus.iDestinationNode == aSendingNode ) ) { // other possiblity is that aSendingNode is either // destination or the originator, we need to accept both return true ; } else { QLOG_STR("Received call status DTO from impossible node") ; return false ; } } bool VoiceCallEngine::setupLocalAudioCapture(VoiceCallExtension& aCall) { if( aCall.iOkToProceed ) { QLOG_STR("Setting up local audio capture for " + QString::number(aCall.iCallId) ) ; if ( iMixer == NULL ) { iMixer = new AudioMixer(iModel) ; assert ( connect ( iMixer, SIGNAL(frameReadyForRemoteSend(quint32, quint32 , const QByteArray& , Hash )), this, SLOT(frameReady(quint32, quint32 , const QByteArray& , Hash )))) ; } if ( iAudioSource == NULL ) { iAudioSource = new AudioSource(iModel) ; assert ( connect ( iAudioSource, SIGNAL(frameCaptured(const QByteArray&,quint32,float)), iMixer, SLOT(insertCapturedAudioFrame(const QByteArray&, quint32,float)))) ; connect(iAudioSource, SIGNAL(audioMaxLevel(float)), this, SLOT(setInputLevel(float))) ; } } else { QLOG_STR("Tearing down local audio capture for " + QString::number(aCall.iCallId) ) ; // ending call if ( iAudioSource ) { iAudioSource->stopCapturing() ; // will delete itself after stop iAudioSource = NULL ; } QLOG_STR("Tearing down local audio capture: audiosource gone" ) ; // ending call if ( aCall.iDecoder ) { aCall.iDecoder->deleteLater() ; aCall.iDecoder = NULL ; } if ( aCall.iEncoder ) { aCall.iEncoder->deleteLater() ; aCall.iEncoder = NULL ; } QLOG_STR("Tearing down local audio capture: decoder gone" ) ; } QLOG_STR("local audio stopped for call " + QString::number(aCall.iCallId) ) ; return true ; } bool VoiceCallEngine::setupAudioOutput(VoiceCallExtension& aCall) { if( aCall.iOkToProceed ) { if ( iMixer == NULL ) { iMixer = new AudioMixer(iModel) ; assert ( connect ( iMixer, SIGNAL(frameReadyForRemoteSend(quint32, quint32 , const QByteArray& , Hash )), this, SLOT(frameReady(quint32, quint32 , const QByteArray& , Hash )))) ; } if ( aCall.iDecoder == NULL ) { aCall.iDecoder = new AudioDecoder ( ) ; assert ( connect(aCall.iDecoder, SIGNAL(frameDecoded(quint32,quint32,const QByteArray&,Hash)), iMixer,SLOT(insertReceivedAudioFrame ( quint32 , quint32 , const QByteArray&, Hash ) ) )) ; } if ( aCall.iEncoder == NULL ) { aCall.iEncoder = new AudioEncoder() ; assert ( connect ( aCall.iEncoder, SIGNAL(frameEncoded(quint32,quint32,const QByteArray&,Hash)), this, SLOT(audioFrameEncoded(quint32,quint32,const QByteArray&,Hash)))) ; } if ( iAudioPlayer == NULL ) { iAudioPlayer = new AudioPlayer(iModel) ; assert ( connect(iMixer,SIGNAL(frameReadyForLocalSpeaker(const QByteArray&)), iAudioPlayer,SLOT(insertAudioFrame(const QByteArray&)))) ; connect(iAudioPlayer, SIGNAL(audioMaxLevel(float)), this, SLOT(setOutputLevel(float))) ; } } else { // ending call if ( iAudioPlayer ) { iAudioPlayer->stop() ; // will delete itself after stopped iAudioPlayer = NULL ; } if ( aCall.iDecoder ) { delete aCall.iDecoder ; aCall.iDecoder = NULL ; } } return true ; } // this is a synchronously connected slot and it is called so // that datamodel lock is on. void VoiceCallEngine::audioFrameEncoded ( quint32 #ifdef DEBUG aCallId #endif , quint32 aSeqNo, const QByteArray& aEncodedVoice, Hash aForNode ) { bool frameSent ( false ) ; if ( aEncodedVoice.size() ) { foreach ( const VoiceCallExtension& call, iOnGoingCalls ) { const Hash peerHash ( callPeerFingerPrint(call ) ) ; if ( peerHash == aForNode ) { QByteArray* bytesToSendToThisNode = new QByteArray() ; bytesToSendToThisNode->append( ProtocolMessageFormatter::voiceCallRtData( call.iCallId, aSeqNo, VoiceCallEngine::Audio, aEncodedVoice ) ) ; iModel.addItemToSend(peerHash, bytesToSendToThisNode) ; // model takes ownership of bytesToSendToThisNode, it // will be free'd after it has been sent frameSent = true ; break ; } } } if ( frameSent == false ) { QLOG_STR("Frame was not sent to any remote node?? callid = " + QString::number(aCallId)) ; } return ; } // this is a synchronously connected slot and it is called so // that datamodel lock is on. void VoiceCallEngine::frameReady ( quint32 aCallId , quint32 aSeqNo, const QByteArray& aRawAudio, Hash aForNode ) { if ( aRawAudio.size() ) { foreach ( const VoiceCallExtension& call, iOnGoingCalls ) { const Hash peerHash ( callPeerFingerPrint(call ) ) ; if ( peerHash == aForNode ) { if ( call.iEncoder ) { call.iEncoder->frameReady( aCallId, aSeqNo, aRawAudio, aForNode ) ; } } } } return ; } void VoiceCallEngine::setInputLevel(float aInputLevel) { // just re-send the signal, UI does not know the real origin emit inputLevel(aInputLevel) ; } void VoiceCallEngine::setOutputLevel(float aOutputLevel) { // just re-send the signal, UI does not know the real origin emit outputLevel(aOutputLevel) ; } QString VoiceCallEngine::excuseForCallCreation(const Hash& aOperator, const Hash& aNode ) const { QString retval ( tr("Audio call is not possible") ) ; Hash nodeHashToUse ; if ( aNode != KNullHash && iModel.nodeModel().isNodeAlreadyConnected(aNode) ) { retval = tr("Audio call is possible") ; } else { // excuses follow if ( aNode != KNullHash ) { nodeHashToUse = aNode ; } else { if ( aOperator == KNullHash ) { retval = tr("Audio call is not possible: operator address unknown") ; } else { // fetch profile iModel.lock() ; Profile* p = iModel.profileModel().profileByFingerPrint(aOperator,false,true) ; if ( p == NULL ) { retval = tr("Audio call is not possible: operator profile not found") ; } else { if ( p->iNodeOfProfile == NULL ) { retval = tr("Audio call is not possible: operator has no node information in profile") ; } else { nodeHashToUse = p->iNodeOfProfile->nodeFingerPrint() ; } delete p ; } iModel.unlock() ; } } } if ( nodeHashToUse != KNullHash ) { iModel.lock() ; Node* operatorsNode ( iModel.nodeModel().nodeByHash(nodeHashToUse) ) ; const bool hasIpv6 = // this means "we have", not the operator !Connection::Ipv6AddressesEqual(iController.getNode().ipv6Addr(), KNullIpv6Addr) ; iModel.unlock() ; QString ipv4excuse = tr("Audio call is not possible: operators IPv4 address %1 not connected") ; if ( operatorsNode ) { const bool operatorHasIpv6 = !Connection::Ipv6AddressesEqual(operatorsNode->ipv6Addr(), KNullIpv6Addr) ; if ( hasIpv6 ) { if ( operatorHasIpv6 ) { retval = QString(tr("Audio call is not possible: operators IPv6 address %1 not connected")).arg(QHostAddress(operatorsNode->ipv6Addr()).toString()) ; } else { // operator operates ipv4 node retval = QString(ipv4excuse).arg(QHostAddress(operatorsNode->ipv4Addr()).toString()) ; } } else { if ( operatorsNode->ipv4Addr() ) { // operator has ipv4 addr retval = QString(ipv4excuse).arg(QHostAddress(operatorsNode->ipv4Addr()).toString()) ; } else { if ( operatorHasIpv6 ) { retval = tr("Audio call is not possible: local node has no IPv6 address, operator has only IPv6 addr") ; } else { retval = tr("Audio call is not possible: operator does not publish network address") ; } } } delete operatorsNode ; } } return retval ; } classified-ads-0.13/net/voicecallengine.h000066400000000000000000000322121331670245300204020ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VOICECALL_ENG_H #define VOICECALL_ENG_H #include #include #include #include #include "../datamodel/model.h" #include "../datamodel/voicecall.h" #include "../call/audiodecoder.h" #include "../call/audioencoder.h" #include "mvoicecallengine.h" class AudioMixer ; class AudioEncoder ; class AudioSource ; class AudioPlayer ; /** * @brief Network-related logic for handling voice channel between nodes * * "Voice call" is a bit different from persisted content handling: * It happens between, nodes, not between operators. It has realtime- * requirements and does not directly store anything on data * storage. * * This class contains networking-related logic and audio stream * handling. Separate UI must be built on top of this. This inherits * QAbstractTableModel to provide easy access for UI-components * to calldata. * * For actual call data handling see @ref AudioMixer and other classes * in the same directory. */ class VoiceCallEngine : public QAbstractTableModel, public MVoiceCallEngine { Q_OBJECT public: /** * Constructor * @param aController application controller. not owned * @param aModel persistent storage. */ VoiceCallEngine(MController& aController, Model& aModel ) ; /** * Destructor */ ~VoiceCallEngine() ; /** * Method for installing call state observer */ virtual void installObserver(MCallStatusObserver* aObserver) ; /** * Method for removing call state observer */ virtual void removeObserver(MCallStatusObserver* aObserver) ; /** * Method for reception of call real-time data. This is called * from network-parts that receive the data packet over some * protocol and then feed it here to make it heard. * * Called from protocol parser. Parser does not lock datamodel * prior to call. * * @param aCallId is call ( stream ) identifier * @param aSeqNo is sequence number of rt data in stream * @param aPayloadType tells what kind of payload it is * @param aPayload actual bytes * @param aSendingNode node what sent the data package */ virtual void insertCallData(quint32 aCallId, quint32 aSeqNo, PayloadType aPayloadType, const QByteArray& aPayload, Hash& aSendingNode) ; /** * Method for reception of call status data. This is called * from network-parts that receive the data packet over some * protocol and then feed it here to move the call engine * to some direction * * Note that the call data inserted via this method may be * call that this node originally made and at the receiving * end this same method is used to inject the new incoming * call into the engine. * * Another note to take into consideration is the handling * if node-data in aCallStatus. Call status is passed as reference * so the ownership of the call data object instance is not * tranferred into voice call engine. Inside call data there * are 2 pointers to originating and destination nodes. * Ownership of content of those pointers is not tranferred * either. VoiceCallEngine will make local copies (if it sees * that necessary) of the node-pointer contents and caller of * this method will be responsible for deleting the node-objects * in call-data if they were created only for the purpose of * making a voice call. * * DataModel.lock() should be called before calling this method * * @param aCallStatus contains information about a call. * @param aSendingNode is fingerprint of the node where the DTO is * coming from. May be local node also. */ virtual void insertCallStatusData(const VoiceCall& aCallStatus, const Hash& aSendingNode) ; /** * method for getting identifiers of ongoing calls */ virtual QList onGoingCalls() const ; /** * method for getting status of a call */ virtual CallState callStatus(quint32 aCallId) const ; /** * Method called as result UI-action. This terminates ongoing call. */ virtual void closeCall(quint32 aCallId) ; /** * Method called as result UI-action. This accepts an incoming call. */ virtual void acceptCall(quint32 aCallId) ; /** * Method for querying for an excuse why a call can (not) be * made to particular operator or node * * @param aOperator identifier of operator whose call-creation * status is queried. * @param aNode node of the operator, if known * * @return String telling if voice call can be made */ QString excuseForCallCreation(const Hash& aOperator, const Hash& aNode = KNullHash ) const ; /** * Methods inherited from QAbstractTableModel: rowCount * @return number of ongoing calls */ virtual int rowCount(const QModelIndex & parent = QModelIndex()) const ; /** * re-implemented from QAbstractTableModel * @return number of columns in view */ virtual int columnCount(const QModelIndex & parent = QModelIndex()) const ; /** * re-implemented from QAbstractListModel * @return data to display in list of ongoing calls */ virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const ; /** * re-implemented from QAbstractListModel * @return strings for headers of the call list UI */ virtual QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const ; public slots: /** * This signal is about node-connection status and closed connections * will be communicated using this same signal: */ void nodeConnectionAttemptStatus(Connection::ConnectionState aStatus, const Hash aHashOfAttemptedNode ); /** * Voice data captured from microphone and mixed with other * possible streams is delivered to over-the-network recipients * using this slot. In practice input into this method comes * from audio encoder and this method is responsible for * distributing the encoded audio frame to all call participants. */ void audioFrameEncoded ( quint32 aCallId, quint32 aSeqNo, const QByteArray& aEncodedVoice, Hash aForNode ) ; /** * This slot is called when mixer when audio frame is ready to be sent. * In practice audio mixer emits a singal to this slot once for * each node that is connected to same call. * * @param aCallId is identifier of the call where this frame * belongs to * @param aSeqNo sequence number of packets in stream * @param aRawAudio is non-encoded audio frame, as array of floats * @param aForNode specifies the node that will receive this * particular audio frame. */ void frameReady ( quint32 aCallId, quint32 aSeqNo, const QByteArray& aRawAudio, Hash aForNode ) ; /** * slot that is called for call status data processing. reason for * this slot is that we want to process status data in UI thread * because we create QObjects there and want to delete them also * in same thread, this easier to handle in Qt this way. * * In practice, the call data is put into iCallDataPendingProcessing * and this slot is called in queued manner */ void processCallData() ; /** * slot for setting audio input (microphone) level */ void setInputLevel(float aInputLevel) ; /** * slot for setting audio output (spekar) level */ void setOutputLevel(float aOutputLevel) ; signals: void error(QTcpSocket::SocketError socketError); /** Signal for communicating call state changes */ void callStateChanged(quint32 aCallId, VoiceCallEngine::CallState aState); /** signal for starting @ref processCallData */ void startProcessCallData() ; /** * signal for communicating audio input (microphone) level */ void inputLevel(float aInputLevel) ; /** * signal for communicating audio output (spekar) level */ void outputLevel(float aOutputLevel) ; private: class VoiceCallExtension ; // methods /** * Called when a new call is initiated from local node */ bool setupNewOutgoingCall(VoiceCallExtension& aCall) ; /** * Called when a new call is initiated from remote node */ bool setupNewIncomingCall(VoiceCallExtension& aCall) ; /** * call status gossip method */ void sendCallStatusUpdates(quint32 aCallId, CallState aState ) ; /** * Method that returns the call peer node address: either * destination or originating. */ Hash callPeerFingerPrint(const VoiceCall& aCall) const ; void removeCallFromArray(VoiceCallExtension& aCall) ; void addCallToArray(VoiceCallExtension& aCall) ; void sendCallStatusUpdateToRemote(const VoiceCall& aCall,bool aDoSign=true) ; QString callStatusString(const VoiceCallExtension& aCall) const ; /** * Method that checks that aCallStatus can be from aSendingNode */ bool checkForNodeValidity(const VoiceCall& aCallStatus, const Hash& aSendingNode) const ; /** * Method for setting up local audio capture. If call has * @ref VoiceCall::iOkToProceed set to false, then capture * will be torn down. */ bool setupLocalAudioCapture(VoiceCallExtension& aCall) ; /** * Method for setting up local audio output. If call has * @ref VoiceCall::iOkToProceed set to false, then output * will be torn down. */ bool setupAudioOutput(VoiceCallExtension& aCall) ; /** * method for conditioanally adding voice streams to mixer module */ bool addCallToMixer(const VoiceCallExtension& aCall) ; /** * method for conditioanally removing voice streams from mixer module */ bool removeCallFromMixer(const VoiceCallExtension& aCall) ; private: // data /** * Have private extension class for call data: extend the * datamodel DTO by call state */ class VoiceCallExtension: public VoiceCall { public: /** constructor that is given a voicecall in */ VoiceCallExtension(const VoiceCall& aInitialData) : iDecoder(NULL), iEncoder(NULL) { fromJSon(aInitialData.asJSon()) ; } ~VoiceCallExtension() { if ( iDecoder ) { iDecoder->deleteLater() ; iDecoder = NULL ; } if ( iEncoder ) { iEncoder->deleteLater() ; iEncoder = NULL ; } } /** Call state like "incoming", "open" */ CallState iOnGoingCallState ; /** Who are we talking with */ QString iPeerOperatorHash ; /** And in which network address is she */ QString iPeerNodeAddress ; /** * Each node will send its own audio stream so * each ongoing individual call needs to have its * own audio decoder */ AudioDecoder* iDecoder; /** * Each node may have different stream coming out from * mixer, this separate audio encoder for each * connection */ AudioEncoder* iEncoder; } ; MController& iController ; /**< application controller */ Model &iModel ; /**< persistent storage */ QList iCallObservers ; QList iOnGoingCalls ; /**< data about calls currently handled */ /** * Exactly one audio mixer: has list of streams to mix. Idea is * that list of mixed streams does not need to be same as list * of ongoing calls. At least the local microphone input is * additional stream */ AudioMixer* iMixer ; AudioSource* iAudioSource; AudioPlayer* iAudioPlayer; QList > iCallDataPendingProcessing ; } ; #endif classified-ads-0.13/nokia_licenses/000077500000000000000000000000001331670245300173025ustar00rootroot00000000000000classified-ads-0.13/nokia_licenses/LGPL_EXCEPTION.txt000066400000000000000000000022431331670245300222200ustar00rootroot00000000000000Nokia Qt LGPL Exception version 1.1 As an additional permission to the GNU Lesser General Public License version 2.1, the object code form of a "work that uses the Library" may incorporate material from a header file that is part of the Library. You may distribute such object code under terms of your choice, provided that: (i) the header files of the Library have not been modified; and (ii) the incorporated material is limited to numerical parameters, data structure layouts, accessors, macros, inline functions and templates; and (iii) you comply with the terms of Section 6 of the GNU Lesser General Public License version 2.1. Moreover, you may apply this exception to a modified version of the Library, provided that such modification does not involve copying material from the Library into the modified Library's header files unless such material is limited to (i) numerical parameters; (ii) data structure layouts; (iii) accessors; and (iv) small macros, templates and inline functions of five lines or less in length. Furthermore, you are not required to apply this additional permission to a modified version of the Library. classified-ads-0.13/patch/000077500000000000000000000000001331670245300154135ustar00rootroot00000000000000classified-ads-0.13/patch/qjson.patch000066400000000000000000000033431331670245300175710ustar00rootroot00000000000000diff -u -r q1/qjson-master/src/json_scanner.cc q2/qjson-master/src/json_scanner.cc --- q1/qjson-master/src/json_scanner.cc 2014-12-12 17:46:47.000000000 +0200 +++ q2/qjson-master/src/json_scanner.cc 2014-12-21 18:39:44.000000000 +0200 @@ -3393,8 +3393,10 @@ #line 82 "json_scanner.yy" { m_yylloc->columns(yyleng); - *m_yylval = QVariant(strtoull(yytext, NULL, 10)); - if (errno == ERANGE) { + unsigned long long converted = strtoull(yytext, NULL, 10); + fprintf(stderr, "Converted number %lu errno = %d\n", converted, errno) ; + *m_yylval = QVariant(converted); + if (errno == ERANGE && converted == ULONG_LONG_MAX) { qCritical() << "Number is out of range: " << yytext; return yy::json_parser::token::INVALID; } diff -u -r q1/qjson-master/src/json_scanner.yy q2/qjson-master/src/json_scanner.yy --- q1/qjson-master/src/json_scanner.yy 2014-12-12 17:46:47.000000000 +0200 +++ q2/qjson-master/src/json_scanner.yy 2014-12-21 18:39:18.000000000 +0200 @@ -81,8 +81,10 @@ [0-9] | [1-9][0-9]+ { m_yylloc->columns(yyleng); - *m_yylval = QVariant(strtoull(yytext, NULL, 10)); - if (errno == ERANGE) { + unsigned long long converted = strtoull(yytext, NULL, 10); + fprintf(stderr, "Converted number %lu errno = %d\n", converted, errno) ; + *m_yylval = QVariant(converted); + if (errno == ERANGE && converted == ULONG_LONG_MAX) { qCritical() << "Number is out of range: " << yytext; return yy::json_parser::token::INVALID; } classified-ads-0.13/po/000077500000000000000000000000001331670245300147325ustar00rootroot00000000000000classified-ads-0.13/po/Makefile000066400000000000000000000032331331670245300163730ustar00rootroot00000000000000# # Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. # # This file is part of Classified Ads. # # Classified Ads is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # Classified Ads 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Classified Ads; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # If adding a new translation, list it here. Also see the list # in "install" target. translations = fi.mo sv.mo da.mo uk.mo de.mo es.mo .SUFFIXES: .mo .po CLEAN_CMD ?= rm -f all: $(translations) .po.mo: $(MSGFMT_PATH)msgfmt $*.po -o $*.mo clean: $(CLEAN_CMD) $(translations) install: all install -m 644 -D -T fi.mo \ $(DESTDIR)/usr/share/locale/fi/LC_MESSAGES/classified-ads.mo install -m 644 -D -T sv.mo \ $(DESTDIR)/usr/share/locale/sv/LC_MESSAGES/classified-ads.mo install -m 644 -D -T da.mo \ $(DESTDIR)/usr/share/locale/da/LC_MESSAGES/classified-ads.mo install -m 644 -D -T uk.mo \ $(DESTDIR)/usr/share/locale/uk/LC_MESSAGES/classified-ads.mo install -m 644 -D -T de.mo \ $(DESTDIR)/usr/share/locale/de/LC_MESSAGES/classified-ads.mo install -m 644 -D -T es.mo \ $(DESTDIR)/usr/share/locale/es/LC_MESSAGES/classified-ads.mo classified-ads-0.13/po/classified-ads.pot000066400000000000000000003501651331670245300203430ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: classified-ads 0.12\n" "Report-Msgid-Bugs-To: antti.jarvinen@katiska.org\n" "POT-Creation-Date: 2016-03-14 21:30+0300\n" "PO-Revision-Date: 2017-03-21 20:48+0200\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Language: fi_FI\n" "X-Qt-Contexts: true\n" # Context menu item text for menu, that appears when right-mouse is clicked on top of a file in a list. #: ui/attachmentlistdialog.cpp:60 msgctxt "AttachmentListDialog|" msgid "Save file to disk.." msgstr "" # In file open dialog this is text specifying what kind of files to include in listing, filtered by file name suffix. For example, user wants only PNG files, then text appearing in dialog filter field would say "PNG files (*.png)" and this work "files" here is the word after the word PNG. #: ui/attachmentlistdialog.cpp:151 ui/attachmentlistdialog.cpp:153 msgctxt "AttachmentListDialog|" msgid "files" msgstr "" # Appears as dialog title where text asks if user wants to save into "application library" or into local file #: ui/attachmentlistdialog.cpp:162 msgctxt "AttachmentListDialog|" msgid "Save location" msgstr "" # Dialog text regarding TCL app save location #: ui/attachmentlistdialog.cpp:163 msgctxt "AttachmentListDialog|" msgid "Save to TCL app library instead of regular file?" msgstr "" # Dialog title text for dialog asking user to give a name to file for purpose of saving it to filesystem. #: ui/attachmentlistdialog.cpp:155 msgctxt "AttachmentListDialog|" msgid "Choose file name for saving" msgstr "" # Dialog title text for error dialog. #: ui/attachmentlistdialog.cpp:166 msgctxt "AttachmentListDialog|" msgid "Error" msgstr "" # This gives (no) explanation about reason for "file open failure"? #: ui/attachmentlistdialog.cpp:167 msgctxt "AttachmentListDialog|" msgid "File open error" msgstr "" # Error message text displayed when audio output fails immediately due to format conflict. #: call/audioplayer.cpp:65 msgctxt "AudioPlayer|" msgid "raw audio format not supported by backend, cannot play audio." msgstr "" # Error message text shown in dialog when audio output is not possible. Possible reason could be missing soundcard or other disastrous failure. #: call/audioplayer.cpp:83 msgctxt "AudioPlayer|" msgid "Could not initialize audio player." msgstr "" # Title text in a listing view where list of shared files are listed. This particular text gives text for column, where "name or fingerprint of file" is listed. Fingerprint in practice means SHA1 digest. #: datamodel/binaryfilelistingmodel.cpp:173 msgctxt "BinaryFileListingModel|" msgid "Name or fingerprint of file" msgstr "" # Header text for a column-list. The column that gets its header text from this string, is the date-column of an classified ad. #: datamodel/calistingmodel.cpp:50 datamodel/calistingmodel.cpp:143 msgctxt "CAListingModel|" msgid "Date" msgstr "" # Header text for a column-list. The column that gets its header text from this string, is the subject-column of an classified ad. #: datamodel/calistingmodel.cpp:51 datamodel/calistingmodel.cpp:142 msgctxt "CAListingModel|" msgid "Subject" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Cars in Estonia" and this combobox text here is the first word of that phrase. #: datamodel/camodel.cpp:127 msgctxt "ClassifiedAdsModel|" msgid "Buying" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Selling of Cars in Estonia" and this combobox text here is the first word of that phrase. #: datamodel/camodel.cpp:129 msgctxt "ClassifiedAdsModel|" msgid "Selling" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Giving away of Cars in Estonia" and this combobox text here is the first+2nd word of that phrase. #: datamodel/camodel.cpp:131 msgctxt "ClassifiedAdsModel|" msgid "Giving away" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Wanting of Cars in Estonia" and this combobox text here is the first word of that phrase. #: datamodel/camodel.cpp:133 msgctxt "ClassifiedAdsModel|" msgid "Wanting" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Renting of Cars in Estonia" and this combobox text here is the first word of that phrase. #: datamodel/camodel.cpp:135 msgctxt "ClassifiedAdsModel|" msgid "Renting" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Cars in Estonia" and this combobox text here is the first word of that phrase. #: datamodel/camodel.cpp:137 msgctxt "ClassifiedAdsModel|" msgid "Announcement" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Cars in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:210 msgctxt "ClassifiedAdsModel|" msgid "Cars" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Boats in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:212 msgctxt "ClassifiedAdsModel|" msgid "Boats" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Bikes in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:214 msgctxt "ClassifiedAdsModel|" msgid "Bikes" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Other vehicles in Estonia" and this combobox text here is the 3rd+4th word of that phrase. #: datamodel/camodel.cpp:216 msgctxt "ClassifiedAdsModel|" msgid "Other vehicles" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of vehicle parts in Estonia" and this combobox text here is the 3rd+4th word of that phrase. #: datamodel/camodel.cpp:218 msgctxt "ClassifiedAdsModel|" msgid "Vehicle parts" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Habitation in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:220 msgctxt "ClassifiedAdsModel|" msgid "Habitation" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Household appliances in Estonia" and this combobox text here is the 3rd+4th word of that phrase. #: datamodel/camodel.cpp:222 msgctxt "ClassifiedAdsModel|" msgid "Household appliances" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Furniture in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:224 msgctxt "ClassifiedAdsModel|" msgid "Furniture" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Clothing in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:226 msgctxt "ClassifiedAdsModel|" msgid "Clothing" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Tools in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:228 msgctxt "ClassifiedAdsModel|" msgid "Tools" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Tools in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:230 msgctxt "ClassifiedAdsModel|" msgid "Sports" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Music in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:232 msgctxt "ClassifiedAdsModel|" msgid "Music" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Books in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:234 msgctxt "ClassifiedAdsModel|" msgid "Books" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Movies in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:236 msgctxt "ClassifiedAdsModel|" msgid "Movies" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Animals in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:238 msgctxt "ClassifiedAdsModel|" msgid "Animals" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Electronics in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:240 msgctxt "ClassifiedAdsModel|" msgid "Electronics" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Jobs in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:242 msgctxt "ClassifiedAdsModel|" msgid "Jobs" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Wanting of Transportation in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:244 msgctxt "ClassifiedAdsModel|" msgid "Transportation" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Services in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:246 msgctxt "ClassifiedAdsModel|" msgid "Services" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Selling of Healthcare in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:248 msgctxt "ClassifiedAdsModel|" msgid "Healthcare" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Selling of Foodstuff in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:250 msgctxt "ClassifiedAdsModel|" msgid "Foodstuff" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Selling of Software in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:252 msgctxt "ClassifiedAdsModel|" msgid "Software" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Events in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:254 msgctxt "ClassifiedAdsModel|" msgid "Events" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Giving away of Education in Estonia" and this combobox text here is the 4th word of that phrase. #: datamodel/camodel.cpp:256 msgctxt "ClassifiedAdsModel|" msgid "Education" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Finance in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:258 msgctxt "ClassifiedAdsModel|" msgid "Finance" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Selling of Jewelry in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:260 msgctxt "ClassifiedAdsModel|" msgid "Jewelry" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of religious rituals in Estonia" and this combobox text here is the 3rd+4th word of that phrase. #: datamodel/camodel.cpp:262 msgctxt "ClassifiedAdsModel|" msgid "Religious rituals" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Philosophy in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:264 msgctxt "ClassifiedAdsModel|" msgid "Philosophy" msgstr "" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Philosophy in Any country" and this combobox text here is end part "Any country" specifying the location where announcement. #: datamodel/camodel.cpp:908 msgctxt "ClassifiedAdsModel|" msgid "Any country" msgstr "" # Tool tip text. When user hovers mouse cursor on top of network address field in a dialog, this text will appear. #: datamodel/connectionlistingmodel.cpp:142 msgctxt "ConnectionListingModel|" msgid "Peer network address" msgstr "" # Tool tip text. When user hovers mouse cursor on top of field specifying if connection is inbound/outbound this text will appear. #: datamodel/connectionlistingmodel.cpp:145 msgctxt "ConnectionListingModel|" msgid "Inbound connections are those where peer initiated connection" msgstr "" # Tool tip text. When user hovers mouse cursor on top of traffic-counter field in a dialog, this text will appear. #: datamodel/connectionlistingmodel.cpp:148 msgctxt "ConnectionListingModel|" msgid "Data transferred from peer to your node" msgstr "" # Tool tip text. When user hovers mouse cursor on top of traffic-counter field in a dialog, this text will appear. #: datamodel/connectionlistingmodel.cpp:151 msgctxt "ConnectionListingModel|" msgid "Data transferred to peer from your node" msgstr "" # Tool tip text. When user hovers mouse cursor on top of time-field in a dialog, this text will appear. #: datamodel/connectionlistingmodel.cpp:154 msgctxt "ConnectionListingModel|" msgid "Time when connection was opened" msgstr "" # Column header text. Column view is used for listing network connections currently open, this text here gives title for column that shows network address (like IP-address) #: datamodel/connectionlistingmodel.cpp:164 msgctxt "ConnectionListingModel|" msgid "Address" msgstr "" # Column header text. Column view is used for listing network connections currently open, this text here gives title for column that shows direction (inbound/outbound) of the connection #: datamodel/connectionlistingmodel.cpp:167 msgctxt "ConnectionListingModel|" msgid "Inbound" msgstr "" # Column header text. Column view is used for listing network connections currently open, this text here gives title for column that shows number of bytes transferred inside #: datamodel/connectionlistingmodel.cpp:170 msgctxt "ConnectionListingModel|" msgid "Bytes in" msgstr "" # Column header text. Column view is used for listing network connections currently open, this text here gives title for column that shows number of bytes transferred outside #: datamodel/connectionlistingmodel.cpp:173 msgctxt "ConnectionListingModel|" msgid "Bytes out" msgstr "" # Column header text. Column view is used for listing network connections currently open, this text here gives title for column that shows time when connection was opened. #: datamodel/connectionlistingmodel.cpp:176 msgctxt "ConnectionListingModel|" msgid "Open time" msgstr "" # Text in contact listing column view. This text appears in column telling if user is to be trusted or not and this value here denotes the positive case "user is trusted". #: datamodel/contactlistingmodel.cpp:73 msgctxt "ContactListingModel|" msgid "Yes" msgstr "" # Text in contact listing column view. This text appears in column telling if user is to be trusted or not and this value here denotes the negative case "user trust is unknown". #: datamodel/contactlistingmodel.cpp:75 msgctxt "ContactListingModel|" msgid "Unknown" msgstr "" # Tool tip text. When user hovers mouse cursor on top of field where operators SHA1 digest is shown, this text appears. The field is part of contact listing view, where users frequent contacts are shown. #: datamodel/contactlistingmodel.cpp:98 msgctxt "ContactListingModel|" msgid "Actual network address (SHA1) of the contact" msgstr "" # Tool tip text. When user hovers mouse cursor on top of field where operators locally given nickname is shown, this text appears. The field is part of contact listing view, where users frequent contacts are shown. #: datamodel/contactlistingmodel.cpp:101 msgctxt "ContactListingModel|" msgid "Locally given nickname ; user may set her own nickname himself" msgstr "" # Tool tip text. When user hovers mouse cursor on top of field where operators trustworthiness (boolean value) in users opinion is shown, this text appears. The field is part of contact listing view, where users frequent contacts are shown. #: datamodel/contactlistingmodel.cpp:104 msgctxt "ContactListingModel|" msgid "Public statement if this operator to be trusted in transactions" msgstr "" # Column header text. Used in column view where operators frequent contacts are shown. This text gives title to column that shows operators network address (the SHA digest of operator) #: datamodel/contactlistingmodel.cpp:114 msgctxt "ContactListingModel|" msgid "Address" msgstr "" # Column header text. Used in column view where operators frequent contacts are shown. This text gives title to column that shows operators nickname #: datamodel/contactlistingmodel.cpp:117 msgctxt "ContactListingModel|" msgid "Nickname" msgstr "" # Column header text. Used in column view where operators frequent contacts are shown. This text gives title to column that shows operators trustworthiness. #: datamodel/contactlistingmodel.cpp:120 msgctxt "ContactListingModel|" msgid "Publicly trusted" msgstr "" # Error message that is displayed when SSL key generation failed. Text is displayed in a dialog, after user dismisses the dialog, whole application will exit. #: datamodel/contentencryptionmodel.cpp:88 msgctxt "ContentEncryptionModel|" msgid "SSL key generation went wrong, calling exit.." msgstr "" # Error message that is displayed when x509 certificate generation failed. Text is displayed in a dialog, after user dismisses the dialog, whole application will exit. #: datamodel/contentencryptionmodel.cpp:96 msgctxt "ContentEncryptionModel|" msgid "x509 cert generation went wrong, calling exit.." msgstr "" # Error message that is displayed when RSA private key could not be saved to database. This is rather fatal error, the operator profile that user tried to create will be un-usable. #: datamodel/contentencryptionmodel.cpp:194 #: datamodel/contentencryptionmodel.cpp:292 msgctxt "ContentEncryptionModel|" msgid "RSA Private key key saving went wrong" msgstr "" # Error message text. This is displayed in situation where user tried to access content that he does not have encryption key for. This may appear frequently during normal operation and is no fatal error, only telling user that he is not going to see the content he was trying to access. #: datamodel/contentencryptionmodel.cpp:639 msgctxt "ContentEncryptionModel|" msgid "No suitable de-cryption key found" msgstr "" # Window title text for whole application. #: controller.cpp:109 msgctxt "Controller|" msgid "Classified ads" msgstr "" # Prompt text for password dialog #: controller.cpp:141 msgctxt "Controller|" msgid "Enter password for protection of your messages:" msgstr "" # Dialog text for a wait dialog (a progress-bar like thing will be shown next to this text and user is supposed to sit down and wait a moment..) #: controller.cpp:432 msgctxt "Controller|" msgid "Fetching item from network.." msgstr "" # Menu item text used in "File" menu item and when this particular item is selected, application will close #: controller.cpp:485 msgctxt "Controller|" msgid "E&xit" msgstr "" # Menu item tooltip-text used in "File" menu entry and when this particular item is selected, application will close #: controller.cpp:487 msgctxt "Controller|" msgid "Exit the application" msgstr "" # Menu item text used in "File" menu and when this particular item is selected, application will show a dialog telling why this application is and how to use it #: controller.cpp:489 msgctxt "Controller|" msgid "&About" msgstr "" # Tooltip-text of menu item text used in "File" menu and when this particular item is selected, application will show a dialog telling why this application is and how to use it #: controller.cpp:490 msgctxt "Controller|" msgid "Show the application's About box" msgstr "" # Menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to change her password #: controller.cpp:492 msgctxt "Controller|" msgid "&Change password" msgstr "" # Tooltip-item for a menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to change her password #: controller.cpp:493 msgctxt "Controller|" msgid "Change password of current profile" msgstr "" # Menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to enter password for a newly-created user profile #: controller.cpp:495 msgctxt "Controller|" msgid "Create &new profile" msgstr "" # Tooltip-text for a menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to enter password for a newly-created user profile #: controller.cpp:496 msgctxt "Controller|" msgid "Makes a brand new user profile" msgstr "" # Menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to confirm deletion of currently open operator profile #: controller.cpp:498 msgctxt "Controller|" msgid "&Delete current profile" msgstr "" # Tooltip-text for a menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to confirm deletion of currently open profile #: controller.cpp:499 msgctxt "Controller|" msgid "Deletes currently open profile" msgstr "" # Menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to enter password of another profile that user will use next #: controller.cpp:501 msgctxt "Controller|" msgid "&Select another profile" msgstr "" # Tooltip-text for a menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to enter password of another profile that user will use next #: controller.cpp:502 msgctxt "Controller|" msgid "If you have multitude of profiles" msgstr "" # Menu item text used in "File" menu and when this particular item is selected, application will show a settings-dialog #: controller.cpp:504 msgctxt "Controller|" msgid "Settings.." msgstr "" # Tooltip-text for a menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to enter password of another profile that user will use next #: controller.cpp:505 msgctxt "Controller|" msgid "Node-wide settings.." msgstr "" # Menu item text used in "File" menu and when this particular item is selected, application will show a dialog detailing network connectivity of the node #: controller.cpp:507 msgctxt "Controller|" msgid "Network status.." msgstr "" # Menu item text used in "File" menu and when this particular item is selected, application will show a search-dialog #: controller.cpp:509 msgctxt "Controller|" msgid "Search.." msgstr "" # Menu bar title text for "File" menu. #: controller.cpp:526 msgctxt "Controller|" msgid "&File" msgstr "" # Menu title. Menu contains menu-items related to TCL-programs. #: controller.cpp:729 msgctxt "Controller|" msgid "&TCL Programs" msgstr "" # Menu item from menu of TCL-related items. Selecting this menu item opens library of TCL programs. #: controller.cpp:730 msgctxt "Controller|" msgid "&Local library" msgstr "" # Tooltip-text for menu item that opens local TCL program library. #: controller.cpp:731 msgctxt "Controller|" msgid "Locally stored TCL programs" msgstr "" # Difficult to translate: after selecting this menu-item you can write ad-hoc TCL programs to TCL interpreter that may be already executing existing program or is empty. Practically gives TCL command line access to possibly running interpreter. #: controller.cpp:734 msgctxt "Controller|" msgid "TCL &Console" msgstr "" # Tooltip for menu-item that displays dialog where you can type in ad-hoc TCL-programs. #: controller.cpp:735 msgctxt "Controller|" msgid "Display interpreter console" msgstr "" # Password dialog prompt. #: controller.cpp:571 msgctxt "Controller|" msgid "Enter new password:" msgstr "" # Password dialog prompt. In this case the password dialog is not used for giving initial password or change password but instead password is typed for the reason of selection of another operator profile to be used. #: controller.cpp:599 controller.cpp:708 msgctxt "Controller|" msgid "Activate another profile with password" msgstr "" # Error message shown in dialog in situation where user tried to delete the last (one and only) operator profile in machine. There needs to be at least one profile and this error message is shown if user tries to get around that limitation. #: controller.cpp:693 msgctxt "Controller|" msgid "Can't delete only profile." msgstr "" # Text shown in title of confirmation dialog. #: controller.cpp:697 msgctxt "Controller|" msgid "Permanently discard profile?" msgstr "" # Text shown inside a confirmation dialog. Dialog will have buttons OK and Cancel and this is the question. #: controller.cpp:698 msgctxt "Controller|" msgid "There will be NO way to access content of this profile later" msgstr "" # Error message that is shown in a dialog in situation where previously stored encryption keys of the node could not be accessed. Rather fatal error, will render node un-usable. #: controller.cpp:761 msgctxt "Controller|" msgid "Cant load node cert or key cert" msgstr "" # Error message dialog title text for a dialog that is shown in a dialog in situation where something bad happened during a filesystem file operation. Actual explanation of the error is shown inside the dialog whose title text this is. #: controller.cpp:766 msgctxt "Controller|" msgid "File error" msgstr "" # Error message dialog title text for a dialog that is shown in a dialog in situation where something bad happened during database operation. Actual explanation of the error is shown inside the dialog whose title text this is. #: controller.cpp:771 msgctxt "Controller|" msgid "Database error" msgstr "" # Error message dialog title text for a dialog that is shown in a dialog in situation where something bad happened during a operation inside crypto-module. Actual explanation of the error is shown inside the dialog whose title text this is. #: controller.cpp:777 controller.cpp:787 msgctxt "Controller|" msgid "Cryptographic module" msgstr "" # Error message dialog title text for a dialog that is shown in a dialog in situation where something bad happened during operation inside database module. Actual explanation of the error is shown inside the dialog whose title text this is. #: controller.cpp:782 msgctxt "Controller|" msgid "Database module" msgstr "" # Error message dialog title text for a dialog that is shown in a dialog in situation when password supplied by user was not good for any purpose. Actual explanation of the error is shown inside the dialog whose title text this is. #: controller.cpp:788 msgctxt "Controller|" msgid "Bad password" msgstr "" # Dialog title for error dialog that displays error message originating from TCL-interpereter. #: controller.cpp:1043 msgctxt "Controller|" msgid "TCL Interpreter" msgstr "" # Error message text inside a dialog when user had requested for an item to be opened but program could not find the requested item. #: controller.cpp:1004 msgctxt "Controller|" msgid "Could not find item from network.." msgstr "" # Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies SHA1 digest of the file. #: controller.cpp:1117 msgctxt "Controller|" msgid "SHA1: " msgstr "" # Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies mime-type of the file #: controller.cpp:1122 msgctxt "Controller|" msgid "Mime-Type: " msgstr "" # Text field explanation text. Part of "file details" dialog. This text gives explanation of field that gives longer explanation of the file #: controller.cpp:1128 msgctxt "Controller|" msgid "Description: " msgstr "" # Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies name of publisher of the file (in practice, who uploaded the file into classified ads) #: controller.cpp:1134 msgctxt "Controller|" msgid "Publisher: " msgstr "" # Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies name of the person (or organization) that owns (in copyright sense) the file or its contents. #: controller.cpp:1140 msgctxt "Controller|" msgid "Content owner: " msgstr "" # Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies the license of the file #: controller.cpp:1146 msgctxt "Controller|" msgid "License: " msgstr "" # Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies file name #: controller.cpp:1152 msgctxt "Controller|" msgid "Name: " msgstr "" # Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies file date #: controller.cpp:1159 msgctxt "Controller|" msgid "Date: " msgstr "" # Error message text shown inside dialog when user tries to select for operation a file that is much much too big. (there is currently 2MB size limit for shared files) #: ui/dialogbase.cpp:47 ui/dialogbase.cpp:101 msgctxt "DialogBase|" msgid "File way too big" msgstr "" # Error message text shown inside dialog when user tries to select for operation a file that is just-and-just too big. (there is currently 2MB size limit for shared files) #: ui/dialogbase.cpp:55 ui/dialogbase.cpp:109 msgctxt "DialogBase|" msgid "File too big" msgstr "" # Error message text shown inside dialog when user tries to select for operation a file that can not be opened (for example due to file permission reasons) #: ui/dialogbase.cpp:85 ui/dialogbase.cpp:131 msgctxt "DialogBase|" msgid "File open error" msgstr "" # Dialog title text. Dialog prompts user to select the filesystem file that will be published inside classified ads. #: ui/dialogbase.cpp:94 msgctxt "DialogBase|" msgid "Select file to be published" msgstr "" # Text for file type filter field in file-selection-dialog #: ui/dialogbase.cpp:96 msgctxt "DialogBase|" msgid "Files (*.*)" msgstr "" # Title text of error dialog. #: ui/editcontact.cpp:72 msgctxt "EditContactDialog|" msgid "Error" msgstr "" # Contet text of error dialog. Shown after user has tried to enter operator address with intent of adding it to contact-list and the operator address fails format validation. #: ui/editcontact.cpp:73 msgctxt "EditContactDialog|" msgid "Operator addr is not valid" msgstr "" # Tab text. In "main window" of classified ads UI there a are 4 or 5 tabs, normally "Classified ads"; "My profile", "Contacts", "Private messages" and maybe something else. This is the text of the first tab. #: FrontWidget.cpp:95 msgctxt "FrontWidget|" msgid "Classified ads" msgstr "" # Tab text. In "main window" of classified ads UI there a are 4 or 5 tabs, normally "Classified ads"; "My profile", "Contacts", "Private messages" and maybe something else. This is the text of the 2nd tab. #: FrontWidget.cpp:96 msgctxt "FrontWidget|" msgid "My profile" msgstr "" # Tab text. In "main window" of classified ads UI there a are 4 or 5 tabs, normally "Classified ads"; "My profile", "Contacts", "Private messages" and maybe something else. This is the text of the 3rd tab. #: FrontWidget.cpp:97 msgctxt "FrontWidget|" msgid "Contacts" msgstr "" # Tab text. In "main window" of classified ads UI there a are 4 or 5 tabs, normally "Classified ads"; "My profile", "Contacts", "Private messages" and maybe something else. This is the text of the 4th tab. #: FrontWidget.cpp:98 msgctxt "FrontWidget|" msgid "Private messages" msgstr "" # Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, a dialog will appear asking which file to share #: FrontWidget.cpp:160 msgctxt "FrontWidget|" msgid "Add shared file.." msgstr "" # Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, the selected file in the listing view will no longer be shared #: FrontWidget.cpp:161 msgctxt "FrontWidget|" msgid "Stop advertising selected shared file" msgstr "" # Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, the selected file in the listing view will be saved to filesystem #: FrontWidget.cpp:162 msgctxt "FrontWidget|" msgid "Save file to disk.." msgstr "" # Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, information dialog about selected file will be shown #: FrontWidget.cpp:163 msgctxt "FrontWidget|" msgid "View file information.." msgstr "" # Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, SHA digest of the selected file will be copied to clipboard. #: FrontWidget.cpp:164 msgctxt "FrontWidget|" msgid "Copy file address (SHA1) to clipboard.." msgstr "" # Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, an editor will be displayed prompting user to enter text that will then be published for other users to see. #: FrontWidget.cpp:165 msgctxt "FrontWidget|" msgid "Edit+publish new text document.." msgstr "" # Dialog title text for "file open" dialog #: FrontWidget.cpp:353 msgctxt "FrontWidget|" msgid "Open File" msgstr "" # Text for filter field of file selection dialog #: FrontWidget.cpp:355 FrontWidget.cpp:885 msgctxt "FrontWidget|" msgid "Files (*.*)" msgstr "" # Error dialog title text. Actual error message will be shown inside dialog whose title is this text. #: FrontWidget.cpp:359 FrontWidget.cpp:1185 FrontWidget.cpp:1328 msgctxt "FrontWidget|" msgid "Error" msgstr "" # Error dialog content text. Shown when image file that user selected could not be opened (maybe because file permission problem or maybe image format issue or ..) #: FrontWidget.cpp:360 msgctxt "FrontWidget|" msgid "Can't load image" msgstr "" # Error dialog title text. This dialog is shown when user tries to comment another operator but required operator data is missing from local storage. #: FrontWidget.cpp:626 FrontWidget.cpp:766 msgctxt "FrontWidget|" msgid "Profile not in database" msgstr "" # Error dialog content text. This dialog is shown when user tries to comment another operator but required operator data is missing from local storage. #: FrontWidget.cpp:627 FrontWidget.cpp:767 msgctxt "FrontWidget|" msgid "Try viewing profile first to obtain data" msgstr "" # File selection title text. Prompts user to select a file for publish purpose. #: FrontWidget.cpp:883 msgctxt "FrontWidget|" msgid "Select file to be published" msgstr "" # Error text shown in dialog. Shown in situation where user selected a file that really exceeds size limit (of 2MB) #: FrontWidget.cpp:890 msgctxt "FrontWidget|" msgid "File way too big" msgstr "" # Error text shown in dialog. Shown in situation where user selected a file that slightly exceeds size limit (of 2MB) #: FrontWidget.cpp:898 msgctxt "FrontWidget|" msgid "File too big" msgstr "" # Error text shown in dialog. Shown in situation where user selected a file that could for some reason not be opened #: FrontWidget.cpp:942 FrontWidget.cpp:1186 msgctxt "FrontWidget|" msgid "File open error" msgstr "" # Part of filter text field in file selection dialog. If for instance user tries to open PNG files, then the text in filter field will be "PNG files (*.png)" and this word is the 2nd word in the phrase. #: FrontWidget.cpp:1167 FrontWidget.cpp:1173 msgctxt "FrontWidget|" msgid "files" msgstr "" # Dialog title for dialog that asks whether user wants to save TCL program into local library or into filesystem file #: FrontWidget.cpp:1183 msgctxt "FrontWidget|" msgid "Save location" msgstr "" # Dialog text in question dialog asking if user wants to save TCL app into local library or into filesystem file #: FrontWidget.cpp:1184 msgctxt "FrontWidget|" msgid "Save to TCL app library instead of regular file?" msgstr "" # File selection dialog title text. Dialog prompts user to select location+name for an file to be exported into filesystem. #: FrontWidget.cpp:1176 msgctxt "FrontWidget|" msgid "Choose file name for saving" msgstr "" # Text shown in placeholder for operators image in situation where user has not yet selected any image. In practice it prompts user to insert image by clicking at the text. #: FrontWidget.cpp:1236 msgctxt "FrontWidget|" msgid "" "\n" "\n" "\n" "Click\n" "To\n" "Add\n" "Image\n" msgstr "" # Error message dialog content text shown when user tried to access article, that was not stored in local database #: FrontWidget.cpp:1329 msgctxt "FrontWidget|" msgid "Article not found from local storage" msgstr "" # Tool-tip text. Shown on top of operators address when user hovers mouse on top of the address field. The %1 will be replaced by nickname of an operator who trusts this particular operator. The %2 will be replaced by SHA1 digest of the operator who trusts the operator whose SHA1 is under mouse cursor. #: FrontWidget.cpp:1355 FrontWidget.cpp:1903 #, qt-format msgctxt "FrontWidget|" msgid "" "Trusted by %1\n" "SHA1 %2" msgstr "" # Tool tip text. Shown when user howers mouse on top of operators nickname field. In code a date-string will be concatenated to this string, so in practice in the UI it will read "Time of last update 31 aug 2015" or similar. #: FrontWidget.cpp:1392 msgctxt "FrontWidget|" msgid "Time of last update " msgstr "" # Text for image placeholder, shown in situation where another operator has not selected any image for her.This text is shown place of the missing image. #: FrontWidget.cpp:1400 msgctxt "FrontWidget|" msgid "" "\n" "\n" "\n" "(No\n" "Image\n" "Selected)\n" msgstr "" # Context menu item text. Context-menu is related to frequent-contacts column-view. #: FrontWidget.cpp:1494 msgctxt "FrontWidget|" msgid "Edit contact.." msgstr "" # Push button text. Pushing the button will open an editor prompting user to edit+send a private message to operator who sent the classified ad currently on display #: FrontWidget.cpp:1534 msgctxt "FrontWidget|" msgid "&Reply to sender" msgstr "" # Push button text. Pushing the button will open an editor prompting user to edit+send a reply to classified ad currently on display #: FrontWidget.cpp:1535 msgctxt "FrontWidget|" msgid "Reply to &forum" msgstr "" # Push button text. Pushing the button will open an editor prompting user to edit+send a new classified ad. #: FrontWidget.cpp:1536 msgctxt "FrontWidget|" msgid "&Post new ad" msgstr "" # Push button text. Pushing the button will open an editor prompting user to edit+send a public comment about operator who sent the classified ad currently on display #: FrontWidget.cpp:1537 msgctxt "FrontWidget|" msgid "&Public comment" msgstr "" # Push button text. Pushing the button will switch to view detailing operator who sent the classified ad currently on display #: FrontWidget.cpp:1538 msgctxt "FrontWidget|" msgid "&View profile" msgstr "" # Push button text. Pushing the button will open a a listing of files that are attached to classified ad currently on display #: FrontWidget.cpp:1539 FrontWidget.cpp:1677 msgctxt "FrontWidget|" msgid "Attachments.." msgstr "" # Push button text. Pushing the button will open an editor prompting user to add to her contact-list the operator who sent the classified ad currently on display #: FrontWidget.cpp:1599 msgctxt "FrontWidget|" msgid "Add selected operator to contacts.." msgstr "" # Push button text. Pushing the button will open an editor prompting user to edit+send a private message to operator who sent the private message currently on display #: FrontWidget.cpp:1673 msgctxt "FrontWidget|" msgid "&Reply" msgstr "" # Push button text. Pushing the button will open an editor prompting user to edit+send a private message to some operator. #: FrontWidget.cpp:1674 msgctxt "FrontWidget|" msgid "&New message" msgstr "" # Push button text. Pushing the button will open an editor prompting user to edit+send a public comment about operator who sent the private message currently on display #: FrontWidget.cpp:1675 msgctxt "FrontWidget|" msgid "&Send public comment to sender" msgstr "" # Push button text. Pushing the button will open view that will show details of operator, who sent the private message currently on display. #: FrontWidget.cpp:1676 msgctxt "FrontWidget|" msgid "&View profile of peer" msgstr "" # Context menu item text. Appears in "message listing view" when user right-clicks on messages view. When selected, the operator who sent the message that is selected is added to contacts. #: FrontWidget.cpp:1711 msgctxt "FrontWidget|" msgid "Add selected to contacts.." msgstr "" # Text field label. Label tells who sent particular classified ad. #: FrontWidget.cpp:1913 FrontWidget.cpp:1915 FrontWidget.cpp:1979 #: FrontWidget.cpp:1981 msgctxt "FrontWidget|" msgid "From:" msgstr "" # Text field label. Label tells subject of classified ads. #: FrontWidget.cpp:1917 FrontWidget.cpp:1984 msgctxt "FrontWidget|" msgid "Subject:" msgstr "" # Text field label. Label tells whom a private message was sent to. #: FrontWidget.cpp:1976 msgctxt "FrontWidget|" msgid "To:" msgstr "" # Error dialog content text. Shown in situation when user clicked on a link that contained SHA1 digest that was not valid. #: FrontWidget.cpp:2288 msgctxt "FrontWidget|" msgid "Invalid SHA1 in URL" msgstr "" # Error dialog content text. Shown in situation when user clicked on a link that was not correctly formatted. #: FrontWidget.cpp:2315 msgctxt "FrontWidget|" msgid "Invalid URL" msgstr "" # Error dialog content text. Shown in situation when user entered a link that could not be parsed. #: ui/insertlinkdialog.cpp:69 msgctxt "InsertLinkDialog|" msgid "Invalid URL" msgstr "" # Error dialog content text. Shown in situation when user tried to add connection to node whose name was not found via nameserver. #: ui/manualconnection.cpp:53 msgctxt "ManualConnectionDialog|" msgid "DNS lookup failure" msgstr "" # Error dialog title text. Actual error message will be shown inside the dialog. #: ui/newprivmsgdialog.cpp:88 ui/newprivmsgdialog.cpp:138 msgctxt "NewPrivMessageDialog|" msgid "Error" msgstr "" # Error dialog content text. Dialog is shown when user tries to send a message to operator, whose SHA1 digest (as entered by user) does not parse as SHA1 digest. #: ui/newprivmsgdialog.cpp:89 msgctxt "NewPrivMessageDialog|" msgid "Recipient addr is not valid" msgstr "" # Error dialog content text. Dialog is shown when user tries to send a message to operator, whose encryption keys are present in local storage. #: ui/newprivmsgdialog.cpp:139 msgctxt "NewPrivMessageDialog|" msgid "Recipient encryption key not found from storage" msgstr "" # Error dialog title text. Actual error message will be shown inside the dialog. #: ui/newprofilecommentdialog.cpp:89 ui/newprofilecommentdialog.cpp:126 msgctxt "NewProfileCommentDialog|" msgid "Error" msgstr "" # Error dialog content text. Dialog is shown when user tries to comment an operator, whose SHA1 digest (as entered by user) does not parse as SHA1 digest. #: ui/newprofilecommentdialog.cpp:90 msgctxt "NewProfileCommentDialog|" msgid "Commented profile addr is not valid" msgstr "" # Error dialog content text. Dialog is shown when user tries to send a message to operator, whose encryption keys are present in local storage. #: ui/newprofilecommentdialog.cpp:127 msgctxt "NewProfileCommentDialog|" msgid "Recipient encryption key not found from storage" msgstr "" # Error message text. Will be shown in error message dialog in case when initial SSL key generation of node did not succeed. After user dismisses the dialog, the application will close. #: datamodel/nodemodel.cpp:115 msgctxt "NodeModel|" msgid "SSL key generation went wrong, calling exit.." msgstr "" # Error message text. Will be shown in error message dialog in case when initial encryption key generation of user did not succeed. After user dismisses the dialog, the application will close. #: datamodel/nodemodel.cpp:123 msgctxt "NodeModel|" msgid "x509 cert generation went wrong, calling exit.." msgstr "" # Error message text. Will be shown in error message dialog in case when SSL certificate of the node could not be loaded from storage. After user dismisses the dialog, the application will close. #: datamodel/nodemodel.cpp:1596 msgctxt "NodeModel|" msgid "Cant load SSL cert" msgstr "" # Error message text. Will be shown in error message dialog in case when SSL key of the node could not be retrieved from local storage. After user dismisses the dialog, the application will close. #: datamodel/nodemodel.cpp:1626 msgctxt "NodeModel|" msgid "Cant load SSL key" msgstr "" # Error message text. Shown in dialog when user tries to enter a password that is too short. #: ui/passwd_dialog.cpp:104 msgctxt "PasswdDialog|" msgid "Min length 5 (use 10+)" msgstr "" # Password dialog title text. #: ui/passwordDialog.ui:14 msgctxt "PasswordDialog|" msgid "Password required" msgstr "" # Tooltip text for password dialog. Shown when user hovers on top of password dialog. #: ui/passwordDialog.ui:17 msgctxt "PasswordDialog|" msgid "" "Should you forget this word, there is no easy way to recover any of your " "content" msgstr "" # Prompt text for password dialog. #: ui/passwordDialog.ui:29 msgctxt "PasswordDialog|" msgid "Enter password for protection of your messages" msgstr "" # Tooltip text for password dialog. Shown when user hovers on top of password field #: ui/passwordDialog.ui:42 msgctxt "PasswordDialog|" msgid "" "If you forget this word, there is no simple way to recover your contents" msgstr "" # Password dialog button text #: ui/passwordDialog.ui:55 msgctxt "PasswordDialog|" msgid "OK" msgstr "" # Check-box item text. If check-box is selected, password is shown in text editor, if not selected then "hidden text" editor is used that does not show the word being typed. #: ui/passwordDialog.ui:68 msgctxt "PasswordDialog|" msgid "Show password" msgstr "" # Tooltip text. Shown when user hovers mouse cursor on top of message sender name. First %1 will be replaced with nickname of the operator whose message is hovered, %2 will be replaced by nickname of operator who has expressed positive trust towards the operator who sent the message. #: datamodel/privmsgsearchmodel.cpp:110 #, qt-format msgctxt "PrivateMessageSearchModel|" msgid "" "%1\n" "Trusted by %2" msgstr "" # Tooltip text. Used in column view that lists private messages of operator. Explains the field that gives title to column that specifies direction (sent or received) of the message. #: datamodel/privmsgsearchmodel.cpp:237 msgctxt "PrivateMessageSearchModel|" msgid "Direction of message, sent/received" msgstr "" # Column title text. Used in column view that lists private messages of operator. This field gives title to column that specifies direction (sent/received) of the message. #: datamodel/privmsgsearchmodel.cpp:247 msgctxt "PrivateMessageSearchModel|" msgid "Dir" msgstr "" # Column title text. Used in column view that lists private messages of operator. This field gives title to column that specifies messaging peer (another operator) of the message. #: datamodel/privmsgsearchmodel.cpp:250 msgctxt "PrivateMessageSearchModel|" msgid "Peer" msgstr "" # Column title text. Used in column view that lists private messages of operator. This field gives title to column that specifies time of the message. #: datamodel/privmsgsearchmodel.cpp:253 msgctxt "PrivateMessageSearchModel|" msgid "Time" msgstr "" # Column title text. Used in column view that lists private messages of operator. This field gives title to column that specifies subject of the message. #: datamodel/privmsgsearchmodel.cpp:256 msgctxt "PrivateMessageSearchModel|" msgid "Subject" msgstr "" # Push button text. Clicking the button will open a dialog prompting user to add a new comment #: ui/profilecommentdisplay.cpp:54 msgctxt "ProfileCommentDisplay|" msgid "&Add comment..." msgstr "" # Context menu item text. Context menu is shown when user right-clicks on file listing view. When this item is selected, a file selection dialog is opened. #: ui/profilecommentdisplay.cpp:65 msgctxt "ProfileCommentDisplay|" msgid "Save attachment to disk.." msgstr "" # Error dialog title text #: ui/profilecommentdisplay.cpp:92 msgctxt "ProfileCommentDisplay|" msgid "Error" msgstr "" # Error dialog content text. Shown after user tried to access a profile comment and the comment could not be found #: ui/profilecommentdisplay.cpp:93 msgctxt "ProfileCommentDisplay|" msgid "Article not found from local storage" msgstr "" # Text field label text. The text field whose label this is will show number how many attachements there are in the comment. #: ui/profilecommentitemdelegate.cpp:93 msgctxt "ProfileCommentItemDelegate|" msgid "Attachments: " msgstr "" # Column view column title text. The column view in question lists profile comments. This text gives title to column that tells who sent the comment. #: datamodel/profilecommentlistingmodel.cpp:219 msgctxt "ProfileCommentListingModel|" msgid "Sender" msgstr "" # Column view column title text. The column view in question lists profile comments. This text gives title to column that tells when comment was sent. #: datamodel/profilecommentlistingmodel.cpp:222 msgctxt "ProfileCommentListingModel|" msgid "Time" msgstr "" # Column view column title text. The column view in question lists profile comments. This text gives title to column that tells subject of the comment. #: datamodel/profilecommentlistingmodel.cpp:225 msgctxt "ProfileCommentListingModel|" msgid "Subject" msgstr "" # Error message text. Shown inside a dialog after user tried to send a comment to operator who had sent a comment and it turns out that necessary encryption keys of the commenting operator are not found and the replying comment can't be sent. #: datamodel/profilecommentmodel.cpp:67 msgctxt "ProfileCommentModel|" msgid "Profile related to comment not found from database" msgstr "" # Context menu item text. This context-menu is shown when user right-clicks list of operators that is shown in dialog that is made for listing operators (who are readers of another profile) #: ui/profilereadersdialog.cpp:73 msgctxt "ProfileReadersDialog|" msgid "View profile" msgstr "" # Column view column title text. The column view lists readers (operators) of another profile. #: datamodel/profilereaderslistingmodel.cpp:174 msgctxt "ProfileReadersListingModel|" msgid "Name or fingerprint of reader" msgstr "" # Error message text, displayed in dialog if audio hardware does not support the format. Should be rare occasion or then gross error like missing soundcard. #: call/ringtoneplayer.cpp:77 msgctxt "RingtonePlayer|" msgid "raw audio format not supported by backend, cannot play audio." msgstr "" # Error message text shown in dialog if audio output API returned error in initialization. Should be rare error, or missing audio hardware .. or audio subsystem configuration error. #: call/ringtoneplayer.cpp:93 msgctxt "RingtonePlayer|" msgid "Could not initialize audio player." msgstr "" # Context menu item text. This context menu is shown when user right-clicks on top of search-results. This menu-item opens the currently-selected item from search results. #: ui/searchdisplay.cpp:62 msgctxt "SearchDisplay|" msgid "Open.." msgstr "" # Button text. When button is pressed, TCL program is started. #: ui/tclPrograms.cpp:42 msgctxt "TclProgramsDialog|" msgid "Evaluate" msgstr "" # Button text. If button is pressed, TCL program being executed is stopped. #: ui/tclPrograms.cpp:43 msgctxt "TclProgramsDialog|" msgid "Stop program" msgstr "" # Button text for button that permanently removes TCL program from local library #: ui/tclPrograms.cpp:49 msgctxt "TclProgramsDialog|" msgid "Delete program" msgstr "" # Dialog title for dialog that asks user to type in name of TCL program. #: ui/tclPrograms.cpp:99 msgctxt "TclProgramsDialog|" msgid "TCL Program name" msgstr "" # Text-input label text. Text input will contain name of TCL program. #: ui/tclPrograms.cpp:100 msgctxt "TclProgramsDialog|" msgid "Name:" msgstr "" # Dialog title text for situation where user is about to delete a TCL program. Dialog includes question and yes+no buttons. #: ui/tclPrograms.cpp:140 msgctxt "TclProgramsDialog|" msgid "Deletion confirmation" msgstr "" # Dialog text from deletion-confirmation dialog #: ui/tclPrograms.cpp:141 #, qt-format msgctxt "TclProgramsDialog|" msgid "Permanently delete program %1?" msgstr "" # Menu title text. This is the help menu. #: textedit/textedit.cpp:127 msgctxt "TextEdit|" msgid "Help" msgstr "" # Menu-item text used in "help" menu. Selecting this item opens "about" dialog about Qt library. #: textedit/textedit.cpp:129 msgctxt "TextEdit|" msgid "About &Qt" msgstr "" # Window title text for container-window containing actions. It seems to me that this text actually does not appear anywhere in the UI due to way, how container-windows are used. #: textedit/textedit.cpp:186 msgctxt "TextEdit|" msgid "Edit Actions" msgstr "" # Menu text. This gives text to "file" menu of a text editor. #: textedit/textedit.cpp:188 msgctxt "TextEdit|" msgid "&File" msgstr "" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "open a filesystem file" #: textedit/textedit.cpp:194 msgctxt "TextEdit|" msgid "&Open..." msgstr "" # Menu item text inside menu in text editor. When selected, the text being edited will be saved into local filesystem file. #: textedit/textedit.cpp:203 msgctxt "TextEdit|" msgid "&Save locally before send" msgstr "" # Menu item text inside menu in text editor. When selected, the text being edited will be saved into local filesystem file and user will be queried for file name. #: textedit/textedit.cpp:210 msgctxt "TextEdit|" msgid "Save locally &As..." msgstr "" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "print" #: textedit/textedit.cpp:218 msgctxt "TextEdit|" msgid "&Print..." msgstr "" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "open print preview" #: textedit/textedit.cpp:226 msgctxt "TextEdit|" msgid "Print Preview..." msgstr "" # Menu-item text. Used in file-menu for triggering "export as pdf" operation #: textedit/textedit.cpp:231 msgctxt "TextEdit|" msgid "&Export PDF..." msgstr "" # Menu text for "edit" menu of text editor. #: textedit/textedit.cpp:244 msgctxt "TextEdit|" msgid "&Edit" msgstr "" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "undo" #: textedit/textedit.cpp:249 msgctxt "TextEdit|" msgid "&Undo" msgstr "" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "re-do" #: textedit/textedit.cpp:254 msgctxt "TextEdit|" msgid "&Redo" msgstr "" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "cut" (to clipboard) #: textedit/textedit.cpp:261 msgctxt "TextEdit|" msgid "Cu&t" msgstr "" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "copy to clipboard" #: textedit/textedit.cpp:267 msgctxt "TextEdit|" msgid "&Copy" msgstr "" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "paste from clipboard" #: textedit/textedit.cpp:273 msgctxt "TextEdit|" msgid "&Paste" msgstr "" # Menu item text inside text editor "edit" menu. After this menu-item is selected, a dialog is opened, prompting user to enter a link (URL) to be included in the text. #: textedit/textedit.cpp:283 msgctxt "TextEdit|" msgid "Insert link" msgstr "" # Menu-item text for embedding an image #: textedit/textedit.cpp:287 msgctxt "TextEdit|" msgid "Embed image" msgstr "" # Menu text. Gives name for a "format" menu inside a text editor. #: textedit/textedit.cpp:294 msgctxt "TextEdit|" msgid "F&ormat" msgstr "" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "toggle bold text style" #: textedit/textedit.cpp:298 msgctxt "TextEdit|" msgid "&Bold" msgstr "" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "toggle italic text" #: textedit/textedit.cpp:310 msgctxt "TextEdit|" msgid "&Italic" msgstr "" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "toggle underline" #: textedit/textedit.cpp:322 msgctxt "TextEdit|" msgid "&Underline" msgstr "" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "left-justify" #: textedit/textedit.cpp:341 textedit/textedit.cpp:347 msgctxt "TextEdit|" msgid "&Left" msgstr "" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "toggle centered text" #: textedit/textedit.cpp:342 textedit/textedit.cpp:346 msgctxt "TextEdit|" msgid "C&enter" msgstr "" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "right-justify" #: textedit/textedit.cpp:343 textedit/textedit.cpp:345 msgctxt "TextEdit|" msgid "&Right" msgstr "" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "justify both right+left" #: textedit/textedit.cpp:349 msgctxt "TextEdit|" msgid "&Justify" msgstr "" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "color selection" #: textedit/textedit.cpp:376 msgctxt "TextEdit|" msgid "&Color..." msgstr "" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "standard" #: textedit/textedit.cpp:383 msgctxt "TextEdit|" msgid "Standard" msgstr "" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "bullet list (disc)" #: textedit/textedit.cpp:384 msgctxt "TextEdit|" msgid "Bullet List (Disc)" msgstr "" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "bullet list (circle)" #: textedit/textedit.cpp:385 msgctxt "TextEdit|" msgid "Bullet List (Circle)" msgstr "" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "bullet list (square)" #: textedit/textedit.cpp:386 msgctxt "TextEdit|" msgid "Bullet List (Square)" msgstr "" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "ordered list (decimal)" #: textedit/textedit.cpp:387 msgctxt "TextEdit|" msgid "Ordered List (Decimal)" msgstr "" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "ordered list (alpha lower)" #: textedit/textedit.cpp:388 msgctxt "TextEdit|" msgid "Ordered List (Alpha lower)" msgstr "" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "ordered list (alpha upper)" #: textedit/textedit.cpp:389 msgctxt "TextEdit|" msgid "Ordered List (Alpha upper)" msgstr "" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "ordered list (roman lower)" #: textedit/textedit.cpp:390 msgctxt "TextEdit|" msgid "Ordered List (Roman lower)" msgstr "" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "ordered list (roman upper)" #: textedit/textedit.cpp:391 msgctxt "TextEdit|" msgid "Ordered List (Roman upper)" msgstr "" # Warning dialog title text. This dialog is shown if user tries to exit without saving her text. #: textedit/textedit.cpp:442 msgctxt "TextEdit|" msgid "Application" msgstr "" # Warning dialog title content text. Text asks what to do with modifications. The dialog has buttons Save,Discard and Cancel and this text is the question. #: textedit/textedit.cpp:443 msgctxt "TextEdit|" msgid "" "The document has been modified.\n" "Do you want to save your changes?" msgstr "" # File selection dialog title text. Dialog will prompt user to select a document for opening. #: textedit/textedit.cpp:467 msgctxt "TextEdit|" msgid "Open File..." msgstr "" # Text for file selection filter field to be used inside file selection dialog. There are 2 parts, separated by ";;" and those semicolons must be left in place. Also the filter parts like (*.htm) must not be edited. The explanations like "HTML-Files" may be edited. #: textedit/textedit.cpp:468 msgctxt "TextEdit|" msgid "HTML-Files (*.htm *.html);;All Files (*)" msgstr "" # File selection dialog title text. Dialog in question prompts user to select name for file to be persisted. #: textedit/textedit.cpp:485 msgctxt "TextEdit|" msgid "Save as..." msgstr "" # Text for file selection filter field to be used inside file selection dialog. There are 3 parts, separated by ";;" and those semicolons must be left in place. Also the filter parts like (*.odt) must not be edited. The explanations like "ODF-files" may be edited. #: textedit/textedit.cpp:486 msgctxt "TextEdit|" msgid "ODF files (*.odt);;HTML-Files (*.htm *.html);;All Files (*)" msgstr "" # Dialog title text. The dialog is printer dialog asking user how to print the text currently in editor. #: textedit/textedit.cpp:501 msgctxt "TextEdit|" msgid "Print Document" msgstr "" # File selection dialog title text. Dialog will prompt user to select a document for opening. #: textedit/textedit.cpp:559 msgctxt "TextEdit|" msgid "Open File" msgstr "" # Text for file selection filter field to be used inside file selection dialog. The filter parts like (*.odt) must not be edited. The explanations like "Files" may be edited. #: textedit/textedit.cpp:561 msgctxt "TextEdit|" msgid "Files (*.*)" msgstr "" # Error dialog title text. #: textedit/textedit.cpp:566 msgctxt "TextEdit|" msgid "Error" msgstr "" # Error dialog content text. #: textedit/textedit.cpp:567 msgctxt "TextEdit|" msgid "Can't load image" msgstr "" # Error message displayed inside error dialog after user tried to select for operation a file whose size greatly exceeds file size limit. #: textedit/textedit.cpp:621 textedit/textedit.cpp:631 msgctxt "TextEdit|" msgid "File way too big" msgstr "" # Button text for "incoming call" dialog. When user hits the button, call is answered. #: net/voicecallengine.cpp:525 msgctxt "VoiceCallEngine|" msgid "Accept" msgstr "" # Button text for "incoming call" dialog. When user hits the button, incoming call is rejected. #: net/voicecallengine.cpp:533 msgctxt "VoiceCallEngine|" msgid "Reject" msgstr "" # Button text for "ongoing call" dialog. When button is hit, call is closed. #: net/voicecallengine.cpp:535 msgctxt "VoiceCallEngine|" msgid "Close" msgstr "" # Tooltip text. Shown in listing of ongoing calls. This tooltip explains "operator address" column of the display. The text explained is SHA1-digest or operator name if known. #: net/voicecallengine.cpp:551 msgctxt "VoiceCallEngine|" msgid "Actual network address (SHA1) of the peer operator" msgstr "" # Tooltip text for list display that lists ongoing voice calls. The text explained is (IP) address of the remote node of the voice call participant. #: net/voicecallengine.cpp:554 msgctxt "VoiceCallEngine|" msgid "Network address of the remote node" msgstr "" # Column header text for display that lists ongoing calls. This gives header text for column that shows name of the call participant #: net/voicecallengine.cpp:564 msgctxt "VoiceCallEngine|" msgid "Operator" msgstr "" # Column header text for display that lists ongoing calls. This gives header text for column that shows network address of the call participant #: net/voicecallengine.cpp:567 msgctxt "VoiceCallEngine|" msgid "Node address" msgstr "" # Column header text for display that lists ongoing calls. This gives header text for column that shows state of the call (like open, closed, ringing etc) #: net/voicecallengine.cpp:570 msgctxt "VoiceCallEngine|" msgid "Call status" msgstr "" # Column header text for display that lists ongoing calls. This gives header text for column containing buttons for accepting, rejecting and ending a call. #: net/voicecallengine.cpp:573 msgctxt "VoiceCallEngine|" msgid "Controls" msgstr "" # Column header text for display that lists ongoing calls. This gives header text for column that shows name column containing button for ending an ongoing call. #: net/voicecallengine.cpp:576 msgctxt "VoiceCallEngine|" msgid "Ending" msgstr "" # Call status text. When making a new outgoing call, this is status for new call that is not answered yet. #: net/voicecallengine.cpp:613 msgctxt "VoiceCallEngine|" msgid "Initializing" msgstr "" # Call status text. When receiving a new incoming call, this is status for new call that is not answered yet. #: net/voicecallengine.cpp:616 msgctxt "VoiceCallEngine|" msgid "Incoming" msgstr "" # Call status text. When voice call is in progress, this is the status. #: net/voicecallengine.cpp:619 msgctxt "VoiceCallEngine|" msgid "Open" msgstr "" # Call status text. When voice call is marked to be closed, this is its status. #: net/voicecallengine.cpp:622 msgctxt "VoiceCallEngine|" msgid "Closing" msgstr "" # Call status text. When voice call is closed, this is the status text. #: net/voicecallengine.cpp:625 msgctxt "VoiceCallEngine|" msgid "Closed" msgstr "" # Call status text. When voice call attempt ends in error, this is text displayed. #: net/voicecallengine.cpp:628 msgctxt "VoiceCallEngine|" msgid "Error" msgstr "" # Call status text. When there is no voice call to display, this text may be displayed instead. #: net/voicecallengine.cpp:631 msgctxt "VoiceCallEngine|" msgid "No call" msgstr "" # Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "general purpose" excuse, when no detailed reason is know. #: net/voicecallengine.cpp:834 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible" msgstr "" # Tooltip text for button that initiates a new call. This gives an excuse why button is not dimmed and call is possible. #: net/voicecallengine.cpp:840 msgctxt "VoiceCallEngine|" msgid "Audio call is possible" msgstr "" # Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "SHA1 digest of operator is not known" #: net/voicecallengine.cpp:847 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator address unknown" msgstr "" # Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "operators profile not found (from local database)" #: net/voicecallengine.cpp:853 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator profile not found" msgstr "" # Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "there is no network address included in node information of the profile" #: net/voicecallengine.cpp:856 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator has no node information in profile" msgstr "" # Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "there is no (ipv4) network connection to node" #: net/voicecallengine.cpp:875 #, qt-format msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operators IPv4 address %1 not connected" msgstr "" # Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "there is no (ipv6) network connection to node" #: net/voicecallengine.cpp:882 #, qt-format msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operators IPv6 address %1 not connected" msgstr "" # Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is protocol mismatch. #: net/voicecallengine.cpp:893 msgctxt "VoiceCallEngine|" msgid "" "Audio call is not possible: local node has no IPv6 address, operator has " "only IPv6 addr" msgstr "" # Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "operator does not publish network address of his node" #: net/voicecallengine.cpp:895 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator does not publish network address" msgstr "" # Dialog title text for "about" dialog. #: ui/aboutDialog.ui:26 msgctxt "aboutDialog|" msgid "About classified ads" msgstr "" # 1st line of text inside "about" dialog, placed next to the turle logo. This text is then followed by longer explanation detail why this program is and how. This is kind of title for the longer explanation. #: ui/aboutDialog.ui:100 msgctxt "aboutDialog|" msgid " Classified ads is a program for online communications" msgstr "" # The long explanation of classified ads inside about-dialog. Note that this text must be valid html. Needs to start with and end with etc. This is easiest to edit like this: copy-paste the content in to a file, say /tmp/about.html. Then either open your favourite html-editor or open classified ads. In classified ads you can start constructing an ad, select from file-menu "open.." and select this file ;do editing and save from file-menu. The saved file is immediately in correct format to be be copy-pasted into contents of this field. #: ui/aboutDialog.ui:163 #| msgid "" #| "

Classified ads is free software. You may use, copy " #| "and modify it if you follow the conditions given in GNU lesser general " #| "public license version 2.1.

Classified ads is copyright ТЉ Antti " #| "JУЄrvinen 2013.

Main feature of the the program is an " #| ""advertisement" - a piece of text belonging to selected " #| "classification. There are several pre-programmed classifications and " #| "operators are encouraged to invent new classifications for new purposes ; " #| "the selection boxes in classification-selection tab are editable. Other " #| "operators may then view the ads, publicly comment the ads, the operators " #| "and also send private messages to each others.

Another important " #| "feature of classified ads is that it is designed to be operated without " #| "any centralized server infrastucture - it is you and other operators " #| "whose computers store and transmit all the content visible inside " #| "classified ads. To get connected you need to know address of at least one " #| "existing computer (a node) so " #| "if your network connection dialog shows no connections, you may need to " #| "contact someone you know is using the software and ask for address of her " #| "node to make initial contact with the network. Once connected the " #| "software should maintain list of addresses of other nodes.

Due to " #| "its server-less design the whole system works best if you leave the " #| "program running always when you have your computer powered on ; while " #| "processing other operators requests it will hog some computing resources " #| "and generate network traffic also when you are not actively using the " #| "program youself - others are.

Operators concerned about privacy of " #| "the content should be aware of following items:

- Data storage " #| "implementation is variant of distributed hash table, practically meaning " #| "that content posted by you gets copied some more-or-less random nodes in " #| "the network.

- Any data item (ad, comment, binary file, private " #| "message etc.) is digitally signed. This makes it more difficult to try to " #| "pose as another operator.

- Operators are reliably identified only " #| "by the SHA1 hash of their generated encryption keys. SHA1 hash is " #| "displayed when viewing details of operator profiles. Other identifying " #| "information like nickname or city name are entered by operator himself " #| "and can be anything. The operator profile, as it is published to the " #| "network, is also signed with the encryption keys of the operator - if you " #| "identify an operator by her SHA1 hash, you have a mechanism for " #| "identifying if any content inside classified ads is posted by this " #| "operator or not. Classified ads internally checks for digital signatures, " #| "throwing away content that fails signature check and tries to provide " #| "SHA1 hash of the operator who posted the content.

- All classified " #| "ads are posted as plain text, no encryption is used. All public profiles " #| "are posted as plain text, no encryption is used. If profile is made " #| "private, it is encrypted to be readable only by selected other profiles. " #| "This applies also to binary files shared by operators private profiles " #| "and comments about private profiles after the profile was made private " #| "(previously plain-text comments or files don't get magically encrypted " #| "afterwards). Private messages are encrypted always to be readable only by " #| "recipient and sender. Attachments follow the privary rules of the " #| "document, they're attachted to.

- As is the case with all " #| "internet-communications, this small fact is true for classified ads too : " #| "once something gets posted online, " #| "there is no way to remove it from network.

- Data " #| "encryption implementation for content is OpenSSL, relying mostly on " #| "algorithms RSA-2048 and AES-256.

- While connections between nodes " #| "are implemented using SSL, other nodes inside network do get to know what " #| "content is being transmitted in neighboring nodes. While there is no " #| "central point for easily collecting this information about particular " #| "classification or operator, operators still should expect no privacy " #| "regarding their doings online, although some effort has been been put " #| "into hiding contents of " #| "private messages and private profiles.

Programming was (mostly) " #| "done by Antti JУЄrvinen, artwork by Meeri JУЄrvinen.

This product " #| "includes software developed by the OpenSSL Project for use in the OpenSSL " #| "Toolkit (http://www.openssl.org/).

Happy " #| "advertising!


" msgctxt "aboutDialog|" msgid "" "

Classified ads is free software. You may use, copy and " "modify it if you follow the conditions given in GNU lesser general public " "license version 2.1.

Classified ads is copyright ТЉ Antti JУЄrvinen " "2013.

Main feature of the program is an "advertisement" - a " "piece of text belonging to selected classification. There are several " "pre-programmed classifications and operators are encouraged to invent new " "classifications for new purposes ; the selection boxes in " "classification-selection tab are editable. Other operators may then view the " "ads, publicly comment the ads, the operators and also send private messages " "to each others.

Another important feature of classified ads is that " "it is designed to be operated without any centralized server infrastructure " "- it is you and other operators whose computers store and transmit all the " "content visible inside classified ads. To get connected you need to know " "address of at least one existing computer (a node) so if your network connection dialog shows " "no connections, you may need to contact someone you know is using the " "software and ask for address of her node to make initial contact with the " "network. Once connected the software should maintain list of addresses of " "other nodes.

Due to its server-less design the whole system works " "best if you leave the program running always when you have your computer " "powered on ; while processing other operators requests it will hog some " "computing resources and generate network traffic also when you are not " "actively using the program yourself - others are.

Operators concerned " "about privacy of the content should be aware of following items:

- " "Data storage implementation is variant of distributed hash table, practically meaning that " "content posted by you gets copied some more-or-less random nodes in the " "network.

- Any data item (ad, comment, binary file, private message " "etc.) is digitally signed. This makes it more difficult to try to pose as " "another operator.

- Operators are reliably identified only by the " "SHA1 hash of their generated encryption keys. SHA1 hash is displayed when " "viewing details of operator profiles. Other identifying information like " "nickname or city name are entered by operator himself and can be anything. " "The operator profile, as it is published to the network, is also signed with " "the encryption keys of the operator - if you identify an operator by her " "SHA1 hash, you have a mechanism for identifying if any content inside " "classified ads is posted by this operator or not. Classified ads internally " "checks for digital signatures, throwing away content that fails signature " "check and tries to provide SHA1 hash of the operator who posted the " "content.

- All classified ads are posted as plain text, no encryption " "is used. All public profiles are posted as plain text, no encryption is " "used. If profile is made private, it is encrypted to be readable only by " "selected other profiles. This applies also to binary files shared by " "operators private profiles and comments about private profiles after the " "profile was made private (previously plain-text comments or files don't get " "magically encrypted afterwards). Private messages are encrypted always to be " "readable only by recipient and sender. Attachments follow the privacy rules " "of the document, they're attached to.

- As is the case with all " "internet-communications, this small fact is true for classified ads too : " "once something gets posted online, there " "is no way to remove it from network.

- Data encryption " "implementation for content is OpenSSL, relying mostly on algorithms RSA-2048 " "and AES-256.

- While connections between nodes are implemented using " "SSL, other nodes inside network do get to know what content is being " "transmitted in neighboring nodes. While there is no central point for easily " "collecting this information about particular classification or operator, " "operators still should expect no privacy regarding their doings online, " "although some effort has been been put into hiding contents of private messages and private " "profiles.

Programming was (mostly) done by Antti JУЄrvinen, artwork by " "Meeri JУЄrvinen.

This product includes software developed by the " "OpenSSL Project for use in the OpenSSL Toolkit " "(http://www.openssl.org/).

Happy " "advertising!


" msgstr "" # Dialog title text. Dialog in question produces list of file attachments. #: ui/attachmentListDialog.ui:26 msgctxt "attachmentListDialog|" msgid "List of attached files" msgstr "" # Dialog title text for call status dialog. #: ui/callStatusDialog.ui:26 msgctxt "callStatusDialog|" msgid "Call status" msgstr "" # Text in call status dialog for slider that shows audio volume of microphone #: ui/callStatusDialog.ui:49 msgctxt "callStatusDialog|" msgid "Input level" msgstr "" # Title in call status dialog a column-list that lists ongoing calls #: ui/callStatusDialog.ui:65 msgctxt "callStatusDialog|" msgid "Audio calls" msgstr "" # Text in call status dialog for slider that shows audio volume of speaker #: ui/callStatusDialog.ui:90 msgctxt "callStatusDialog|" msgid "Output level" msgstr "" # Dialog title text. Purpose of the dialog is to let user change properties of a frequent contact in contact-list. #: ui/editContact.ui:26 msgctxt "editContactDialog|" msgid "Edit a contact" msgstr "" # Text field label in contact-editing dialog. This gives label for field that shows SHA1 fingerprint of the operator whose data is being edited #: ui/editContact.ui:39 msgctxt "editContactDialog|" msgid "Address (SHA1) of contact" msgstr "" # Text field label in contact-editing dialog. This gives label for field that shows nickname of the operator whose data is being edited #: ui/editContact.ui:53 msgctxt "editContactDialog|" msgid "Local nickname" msgstr "" # Tooltip text of a checkbox label in contact-editing dialog. The checkbox is one that controls statement of trustworthniness of the operator whose data is being edited. Note html format. #: ui/editContact.ui:65 msgctxt "editContactDialog|" msgid "" "

Settings some trusted is public information to readers " "of your profile

" msgstr "" # Label of a checkbox in contact-editing dialog. The checkbox is one that controls statement of trustworthniness of the operator whose data is being edited. #: ui/editContact.ui:68 msgctxt "editContactDialog|" msgid "This contact is to be publicly trusted in transactions" msgstr "" # Name of front widget. Wild guess is that this text actually does not appear anywhere in the UI. #: frontWidget.ui:14 msgctxt "frontWidget|" msgid "Form" msgstr "" # Tab title text in front widget. When user clicks in this tab, the view is switched to one, that lists classified ads. #: frontWidget.ui:39 msgctxt "frontWidget|" msgid "Classified ads" msgstr "" # Prompt text next "search" button. User is supposed to enter search criteria for classified ads and then click "search" ; this is prompt text for this behaviour. #: frontWidget.ui:67 msgctxt "frontWidget|" msgid "Search for classified ads about" msgstr "" # Prompt text very next to "search" button. After user has clicked the button, he is supposed to be viewing list of classified ads matching the search criteria. #: frontWidget.ui:74 msgctxt "frontWidget|" msgid "Perform" msgstr "" # This part of search-criteria phrase. Normally the phrase reads something like "Buying of cars in finland" and this word is the 2nd word in that phrase. #: frontWidget.ui:97 msgctxt "frontWidget|" msgid "of" msgstr "" # This part of search-criteria phrase. Normally the phrase reads something like "Buying of cars in finland" and this word is the 4th word in that phrase. #: frontWidget.ui:113 msgctxt "frontWidget|" msgid "in" msgstr "" # Button text for button used to search for classified ads. This button has text "perform" just next to it so user sees actually 2 words "perform search" where the "perform" is in separate label above the button, and then is the text of this button. #: frontWidget.ui:123 msgctxt "frontWidget|" msgid "Search" msgstr "" # Tab title text in front widget for tab that shows details of operators own profile (==personal details) #: frontWidget.ui:161 msgctxt "frontWidget|" msgid "My profile" msgstr "" # Text field label in "operators profile" tab. The field in questions shows SHA1-digest e.g. the real address of the operator. #: frontWidget.ui:177 frontWidget.ui:937 msgctxt "frontWidget|" msgid "Profile address" msgstr "" # Text field label in "operators profile" tab. The field in questions shows nickname of the operator #: frontWidget.ui:208 frontWidget.ui:643 msgctxt "frontWidget|" msgid "Nickname" msgstr "" # Text field label in "operators profile" tab. The field in questions shows "hello world" text of the operator. #: frontWidget.ui:225 frontWidget.ui:669 msgctxt "frontWidget|" msgid "Greeting text" msgstr "" # Tooltip-text of a text field in "operators profile" tab. The field in questions shows greeting text of the operator. #: frontWidget.ui:232 msgctxt "frontWidget|" msgid "For the rest of the world. " msgstr "" # Text field label in "operators profile" tab. The field in questions shows given name (first name) of the operator. #: frontWidget.ui:239 frontWidget.ui:695 msgctxt "frontWidget|" msgid "First name" msgstr "" # Text field label in "operators profile" tab. The field in questions shows family name of the operator #: frontWidget.ui:253 frontWidget.ui:715 msgctxt "frontWidget|" msgid "Family name" msgstr "" # Text field label in "operators profile" tab. The field in questions shows place of residence of the operator #: frontWidget.ui:263 msgctxt "frontWidget|" msgid "City/country" msgstr "" # Text field label in "operators profile" tab. The field in questions shows address of bitcoin wallet of the operator. #: frontWidget.ui:273 msgctxt "frontWidget|" msgid "BTC address" msgstr "" # Tooltip-text for a text field "operators profile" tab. The field in questions shows address of bitcoin wallet of the operator. #: frontWidget.ui:280 msgctxt "frontWidget|" msgid "If you wish to receive payments via BTC, include your BTC address too." msgstr "" # Text field label in "operators profile" tab. The field in questions shows what the user has to say about state of the world. #: frontWidget.ui:287 frontWidget.ui:799 msgctxt "frontWidget|" msgid "State of the world" msgstr "" # Tool-tip text of a field in "operators profile" tab. The field in questions shows what operator has to say about state of the world. #: frontWidget.ui:294 msgctxt "frontWidget|" msgid "Longer explanation about state of the world" msgstr "" # Checkbox text in "my profile" tab. The checkbox is question is a toggle for public/private status of the profile. When checkbox is checked, the profile will be made private. #: frontWidget.ui:301 msgctxt "frontWidget|" msgid "Profile is private" msgstr "" # Button text inside "My profile" tab. Clicking the button opens a dialog that prompts user to select list of operators that can read his profile that he has previously marked as private (e.g. accessible only to listed readers) #: frontWidget.ui:308 msgctxt "frontWidget|" msgid "Readers of profile" msgstr "" # Explanation text inside "my profile" tab. #: frontWidget.ui:315 msgctxt "frontWidget|" msgid "None of the fields is mandatory" msgstr "" # Text field label inside "my profile" tab. The field whose label this is shows the time when profile was last updated. #: frontWidget.ui:322 msgctxt "frontWidget|" msgid "Time of last update" msgstr "" # Button text for button inside "my profile" tab. By clicking this button user makes her edits known to rest of the world. #: frontWidget.ui:342 msgctxt "frontWidget|" msgid "Publish" msgstr "" # Button text for button inside "my profile" tab. By clicking this button user discards her edits. #: frontWidget.ui:355 msgctxt "frontWidget|" msgid "Revert changes" msgstr "" # Text label on top of "my profile" tab. Below this label is a list of text fields and other stuff that user may edit regarding herself. #: frontWidget.ui:369 msgctxt "frontWidget|" msgid "Details of operator profile:" msgstr "" # Text in image-placeholder inside "my profile" tab. When user has not selected any image for her profile details, this text is shown in place of the image. Clicking on text gives user option to select the image file for profile. #: frontWidget.ui:401 msgctxt "frontWidget|" msgid "" "\n" "\n" "Click \n" "to \n" "Add\n" "Image" msgstr "" # Title text inside "my profile" tab. Title text is for a list of files that user is currently sharing with other users. #: frontWidget.ui:425 frontWidget.ui:845 msgctxt "frontWidget|" msgid "Shared files" msgstr "" # Title text inside "my profile" tab. Title text is for a list of comments made by other users regarding operators profile. #: frontWidget.ui:461 frontWidget.ui:897 msgctxt "frontWidget|" msgid "Latest comments" msgstr "" # Tab title text. When this tab is opened, user is shown a view of his frequent contacts. #: frontWidget.ui:504 msgctxt "frontWidget|" msgid "Contacts" msgstr "" # Button text inside "contacts" tab. Clicking this button opens a dialog prompting user to enter details of operator to be added into contact list #: frontWidget.ui:536 msgctxt "frontWidget|" msgid "Add contact" msgstr "" # Button text inside "contacts" tab. Clicking this button removes a contact from list. #: frontWidget.ui:543 msgctxt "frontWidget|" msgid "Remove contact" msgstr "" # Button text inside "contacts" tab. Clicking this button displays details of the selected contact. #: frontWidget.ui:550 msgctxt "frontWidget|" msgid "View profile" msgstr "" # Button text inside "contacts" tab. Clicking this button opens a dialog prompting user to send a message selected contact. #: frontWidget.ui:557 msgctxt "frontWidget|" msgid "Send message" msgstr "" # Tab text in front widget. When user selects this tab, he is presented with list of his private correspondence. #: frontWidget.ui:569 msgctxt "frontWidget|" msgid "Private messages" msgstr "" # Tab text in front widget. This tab shows details of some other operator of classified ads. Normally this text is replaced with nickname of the operator but if nothing like this is available, this text may be shown, this is the "default text". #: frontWidget.ui:624 msgctxt "frontWidget|" msgid "Profile details" msgstr "" # Label text of a text-field. The text-field in question shows place of residence of operator whose details are on display. #: frontWidget.ui:741 msgctxt "frontWidget|" msgid "City/Country" msgstr "" # Label text of a text-field. The text-field in question shows bitcoin wallet address of operator whose details are on display. #: frontWidget.ui:767 msgctxt "frontWidget|" msgid "BTC Addr" msgstr "" # Text for image-placeholder inside "profile details" tab. When some particular operator has not selected any image for her profile, this text is shown in place of the image. Note html format. #: frontWidget.ui:829 msgctxt "frontWidget|" msgid "" "




No

Image

Inserted

" msgstr "" # Button text inside "defails of operator profile" tab. When the button is clicked, a new-message editor is opened. #: frontWidget.ui:874 msgctxt "frontWidget|" msgid "Send message to operator" msgstr "" # Button text in "operators details" view. Pressing the button initiates a new voice call to operator. #: frontWidget.ui:879 msgctxt "frontWidget|" msgid "Audio call" msgstr "" # Button text inside "defails of operator profile" tab. When the button is clicked, dialog listing readers of the (private) profile. #: frontWidget.ui:884 msgctxt "frontWidget|" msgid "View readers" msgstr "" # Button text inside "defails of operator profile" tab. When the button is clicked, a dialog is opened, dialog prompts user to enter a comment about the operator. #: frontWidget.ui:932 msgctxt "frontWidget|" msgid "Comment" msgstr "" # Button text inside "defails of operator profile" tab. When the button is clicked, the operator whose data is on display is added into contact-list. #: frontWidget.ui:964 msgctxt "frontWidget|" msgid "Add to contacts" msgstr "" # Dialog title text. Dialog is for adding a link to text being edited. #: ui/insertLink.ui:26 msgctxt "insertLinkDialog|" msgid "Insert link" msgstr "" # Label for a combobox-field inside "insert link" dialog. Next to this label is set of fields that together make up a valid URL to be inserted. #: ui/insertLink.ui:39 msgctxt "insertLinkDialog|" msgid "URL" msgstr "" # Label for a text-field inside "insert link" dialog. Next to this label is field where user is supposed the text that will be shown as the link. Consider
the text then "the text" is text that user is prompted to enter with this label. #: ui/insertLink.ui:112 msgctxt "insertLinkDialog|" msgid "Link label in text" msgstr "" # Dialog title text. Dialog prompts user to manually add a network-connection to another node in the network. #: ui/manualConnectionDialog.ui:26 msgctxt "manualConnectionDialog|" msgid "Manually add node to connection queue" msgstr "" # Label text of numeric field. The numeric (input) field is TCP port of the remote node that will be connected. #: ui/manualConnectionDialog.ui:48 msgctxt "manualConnectionDialog|" msgid "Remote node listen port" msgstr "" # Label for text field inside "manually add connection" dialog. Text field whose label this is requires user to type in network address (ip addr or dns name) of the remote node. #: ui/manualConnectionDialog.ui:78 msgctxt "manualConnectionDialog|" msgid "Remote node network address" msgstr "" # Tooltip text for a text field inside "manually add connection" dialog. The text field whose tooltip this is the remote network address input field. #: ui/manualConnectionDialog.ui:91 msgctxt "manualConnectionDialog|" msgid "IPv4, IPv6 or DNS name" msgstr "" # Dialog title text for dialog that requires user to enter information about file to be shared with others. Metadata query dialog in practice. #: ui/metadataQuery.ui:26 msgctxt "metadataQuery|" msgid "File information" msgstr "" # Label text for a input field. The input field whose label this is asks for file name (filesystem file name) #: ui/metadataQuery.ui:60 msgctxt "metadataQuery|" msgid "Name of the file:" msgstr "" # Label text for a input field. The input field whose label this is asks for owner of the file contents. This may be copyright holder, depending on contracts and legislation followed. #: ui/metadataQuery.ui:81 msgctxt "metadataQuery|" msgid "Owner of file (name or SHA1 if CA operator):" msgstr "" # Label text for a input field. The input field whose label this is asks for license under which the file may be used. Combobox lists some pre-filled options like GPL,BSD,CC-BY etc. but user may also enter any text into field. #: ui/metadataQuery.ui:111 msgctxt "metadataQuery|" msgid "License of use:" msgstr "" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:122 msgctxt "metadataQuery|" msgid "Public domain" msgstr "" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:127 msgctxt "metadataQuery|" msgid "GPL" msgstr "" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:132 msgctxt "metadataQuery|" msgid "LGPL" msgstr "" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:137 msgctxt "metadataQuery|" msgid "BSD" msgstr "" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:142 msgctxt "metadataQuery|" msgid "CC-BY" msgstr "" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:147 msgctxt "metadataQuery|" msgid "CC-BY-SA" msgstr "" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:152 msgctxt "metadataQuery|" msgid "CC-BY-ND" msgstr "" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:157 msgctxt "metadataQuery|" msgid "CC-BY-NC" msgstr "" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:162 msgctxt "metadataQuery|" msgid "CC-BY-NC-SA" msgstr "" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:167 msgctxt "metadataQuery|" msgid "CC-BY-NC-ND" msgstr "" # Label text for a input field. The input field whose label this is asks for mime-type of the field about to be published. #: ui/metadataQuery.ui:182 msgctxt "metadataQuery|" msgid "Mime-type:" msgstr "" # Label text for a input field. The input field whose label this is asks for descriptive text about file about to be published. #: ui/metadataQuery.ui:199 msgctxt "metadataQuery|" msgid "Description of file:" msgstr "" # Prompt text on top of "metadata query" dialog. Below this label is set of input-fields that make up the meta-data of a file to be published. #: ui/metadataQuery.ui:218 msgctxt "metadataQuery|" msgid "Enter information regarding file before publish:" msgstr "" # Dialog title text for a dialog that offers possibility to post a new classified ad for others to read. #: ui/newClassifiedAd.ui:26 msgctxt "newCaDialog|" msgid "Post a new classified ad" msgstr "" # This label text is part of sentence, whole sentence goes for example "About buying of cars in sweden" where the words "bying", "cars", and "sweden" are combo-boxes that user may choose from ; this word here is the first word in that sentece. #: ui/newClassifiedAd.ui:47 msgctxt "newCaDialog|" msgid "About" msgstr "" # This label text is part of sentence, whole sentence goes for example "About buying of cars in sweden" where the words "bying", "cars", and "sweden" are combo-boxes that user may choose from ; this word here is the 3rd word in that sentece. #: ui/newClassifiedAd.ui:65 msgctxt "newCaDialog|" msgid "of" msgstr "" # This label text is part of sentence, whole sentence goes for example "About buying of cars in sweden" where the words "bying", "cars", and "sweden" are combo-boxes that user may choose from ; this word here is the 5th word in that sentece. #: ui/newClassifiedAd.ui:81 msgctxt "newCaDialog|" msgid "in" msgstr "" # Label text of a text field inside "post a new classified ad" dialog. The input field whose label this is, requires user to enter a subject (topic) for her posting. #: ui/newClassifiedAd.ui:95 msgctxt "newCaDialog|" msgid "Subject" msgstr "" # Label text of a text field inside "post a new classified ad" dialog. The input field whose label this is, will show name file that is attached to the post. #: ui/newClassifiedAd.ui:129 msgctxt "newCaDialog|" msgid "Attachment: " msgstr "" # Push-button text inside "post a new classified ad" dialog. When user hits the button, another dialog is opened and user is required to select a file to be attached. #: ui/newClassifiedAd.ui:149 msgctxt "newCaDialog|" msgid "Add" msgstr "" # Dialog title text for dialog that prompts user to edit+send a private message to another operator #: ui/newPrivMsg.ui:26 msgctxt "newPrivMsgDialog|" msgid "Send a private message" msgstr "" # Text field label for input field inside "compose a new private message dialog". The text field in question is "subject" or "topic" field of the message. #: ui/newPrivMsg.ui:39 msgctxt "newPrivMsgDialog|" msgid "Subject" msgstr "" # Text field label for input field inside "compose a new private message dialog". The text field in question is SHA1 address of the recipient. #: ui/newPrivMsg.ui:53 msgctxt "newPrivMsgDialog|" msgid "Recipient" msgstr "" # Label text of a text field inside "compose a new private message" dialog. The input field whose label this is, will show name file that is attached to the post. #: ui/newPrivMsg.ui:83 msgctxt "newPrivMsgDialog|" msgid "Attachments: " msgstr "" # Push-button text inside "compose a new private message" dialog. When user hits the button, another dialog is opened and user is required to select a file to be attached. #: ui/newPrivMsg.ui:103 msgctxt "newPrivMsgDialog|" msgid "Attach" msgstr "" # Dialog title text for dialog that prompts user to edit+send a comment regarding another operator. #: ui/newProfileComment.ui:26 msgctxt "newProfileCommentDialog|" msgid "Comment a operators profile" msgstr "" # Text field label for input field inside "compose a comment about operator dialog". The text field in question is "subject" or "topic" field of the comment. #: ui/newProfileComment.ui:39 msgctxt "newProfileCommentDialog|" msgid "Subject" msgstr "" # Text field label for input field inside "compose a comment about operator dialog". The text field in question is SHA1 digest (address) of the operator being commented. #: ui/newProfileComment.ui:53 msgctxt "newProfileCommentDialog|" msgid "Commented profile" msgstr "" # Label text of a text field inside "compose a comment about operator dialog" dialog. The input field whose label this is, will show name file that is attached to the post. #: ui/newProfileComment.ui:89 msgctxt "newProfileCommentDialog|" msgid "Attachments:" msgstr "" # Push-button text inside "compose a comment about operator dialog" dialog. When user hits the button, another dialog is opened and user is required to select a file to be attached. #: ui/newProfileComment.ui:109 msgctxt "newProfileCommentDialog|" msgid "Attach" msgstr "" # Dialog title text for a dialog that prompts user to edit+publish a text document. #: ui/newTextDocument.ui:26 msgctxt "newTextDocumentDialog|" msgid "Edit and publish a new text document" msgstr "" # Text field label for input field inside "compose a new text document" dialog. The text field in question is "subject" or "topic" field of the text document. #: ui/newTextDocument.ui:39 msgctxt "newTextDocumentDialog|" msgid "Document title" msgstr "" # Label text of a text field inside "edit+publish a new text document dialog" dialog. The input field whose label this is, will show name file that is attached to the document. #: ui/newTextDocument.ui:75 msgctxt "newTextDocumentDialog|" msgid "Attachments:" msgstr "" # Push-button text inside "edit+publish a new text document dialog" dialog. When user hits the button, another dialog is opened and user is required to select a file to be attached. #: ui/newTextDocument.ui:95 msgctxt "newTextDocumentDialog|" msgid "Attach" msgstr "" # Dialog title text for dialog that will show a listing of previous comments regarding operator (user himself or some other operator, it is the same dialog in both cases) #: ui/profileCommentDisplay.ui:26 msgctxt "profileCommentDisplay|" msgid "Comments regarding operator" msgstr "" # Dialog title text for a dialog that prompts user to choose operators who will be able to read details, comments and shared files of his profile. #: ui/profileReadersDialog.ui:26 msgctxt "profileReadersDialog|" msgid "Profile readers list" msgstr "" # Text field label inside "add profiles to list of readers" dialog. The text field whose prompt this is asks for search-words to be used to filter operator names/addresses from database. #: ui/profileReadersDialog.ui:37 msgctxt "profileReadersDialog|" msgid "Search for profiles to add" msgstr "" # Text field label inside "add profiles to list of readers" dialog. The text listing-field whose explanation this is will list operators whose nickname,name or other search-term matches conditions entered by user. #: ui/profileReadersDialog.ui:44 msgctxt "profileReadersDialog|" msgid "First 100 matching profiles:" msgstr "" # Push-button label inside "add profiles to list of readers" dialog. When user hits this button, operators that are selected from neighboring list will be added to list of readers of operators profile. #: ui/profileReadersDialog.ui:66 #| msgid "Add seleted to list of readers" msgctxt "profileReadersDialog|" msgid "Add selected to list of readers" msgstr "" # Text field label inside "add profiles to list of readers" dialog. The text listing-field whose explanation this is shows current list operators profiles readers. #: ui/profileReadersDialog.ui:73 msgctxt "profileReadersDialog|" msgid "Current list of readers" msgstr "" # Push button label inside dialog that asks for list of operators who are readers of operators own profile. When user this this button, the dialog is dismissed. #: ui/profileReadersDialog.ui:90 msgctxt "profileReadersDialog|" msgid "Close" msgstr "" # Push button label inside dialog that asks for list of operators who are readers of operators own profile. When user this this button, selected operators are removed from the list. #: ui/profileReadersDialog.ui:109 msgctxt "profileReadersDialog|" msgid "Remove selected" msgstr "" # Dialog title-text for a search dialog. #: ui/searchDisplay.ui:26 msgctxt "searchDisplay|" msgid "Search data storage" msgstr "" # Label text of a text field inside "search" dialog. The text field in question requires user to enter one or more words that are then searched from all available (public) documents. #: ui/searchDisplay.ui:60 msgctxt "searchDisplay|" msgid "Words:" msgstr "" # Push button label inside "search" dialog. When button is hit, search using given words is performed. #: ui/searchDisplay.ui:70 msgctxt "searchDisplay|" msgid "Search" msgstr "" # Check-box label inside "search" dialog. When box is checked, the search is done also in neighboring nodes in the network, not only in local storage. #: ui/searchDisplay.ui:87 msgctxt "searchDisplay|" msgid "Network search" msgstr "" # Check-box label inside "search" dialog. When box is checked, the search may include classified ads in its resultset. #: ui/searchDisplay.ui:101 msgctxt "searchDisplay|" msgid "Search ads" msgstr "" # Check-box label inside "search" dialog. When box is checked, the search may include operator profiles in its resultset. #: ui/searchDisplay.ui:111 msgctxt "searchDisplay|" msgid "Search profiles" msgstr "" # Check-box label inside "search" dialog. When box is checked, the search may include profile commetns in its resultset. #: ui/searchDisplay.ui:121 msgctxt "searchDisplay|" msgid "Search comments" msgstr "" # Dialog title text for "settings" dialog. #: ui/settingsDialog.ui:26 msgctxt "settingsDialog|" msgid "Node settings" msgstr "" # Text field label for input field inside "settings" dialog. The numerical input field whose label this is has TCP port number of the node. #: ui/settingsDialog.ui:39 msgctxt "settingsDialog|" msgid "TCP listen port" msgstr "" # Tooltip-text for input field inside "settings" dialog. The numerical input field whose label this is has TCP port number of the node. #: ui/settingsDialog.ui:58 msgctxt "settingsDialog|" msgid "Incoming TCP listen port. Change requires node restart. " msgstr "" # Text field label for input field inside "settings" dialog. The textual input field whose label this is requires user to enter DNS-name of the node (or leave it empty, if no name is assigned) #: ui/settingsDialog.ui:84 msgctxt "settingsDialog|" msgid "DNS name of node" msgstr "" # Tooltip-text for input field inside "settings" dialog. The textual input field whose label this is requires user to enter DNS-name of the node (or leave it empty, if no name is assigned) #: ui/settingsDialog.ui:91 msgctxt "settingsDialog|" msgid "" "If you have permanent DNS name for your machine, you may type it here to be " "used to reference your node" msgstr "" # Text label inside "settings" dialog. Under this label is set of numerical input fields that user may use to adjust the amount of items he wishes to keep in his local storage. #: ui/settingsDialog.ui:103 msgctxt "settingsDialog|" msgid "Data store limits:" msgstr "" # Text field label for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of operator profiles to keep in storage. #: ui/settingsDialog.ui:115 msgctxt "settingsDialog|" msgid "Nr of profiles to keep" msgstr "" # Text field label for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of private messages to keep in storage. #: ui/settingsDialog.ui:154 msgctxt "settingsDialog|" msgid "Nr of private messages to keep" msgstr "" # Text field label for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of binary files to keep in storage. #: ui/settingsDialog.ui:193 msgctxt "settingsDialog|" msgid "Nr of binary blobs to keep" msgstr "" # Text field label for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of classified ads to keep in storage. #: ui/settingsDialog.ui:232 msgctxt "settingsDialog|" msgid "Nr of CAs to keep" msgstr "" # Tooltip-text for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of classified ads to keep in storage. #: ui/settingsDialog.ui:251 msgctxt "settingsDialog|" msgid "" "Number of classified ads to keep in storage, total, including all " "classifications. Oldest referenced will be deleted first." msgstr "" # Text field label for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of comments regarding operators to keep in storage. #: ui/settingsDialog.ui:274 msgctxt "settingsDialog|" msgid "Nr of profile comments to keep" msgstr "" # Settings dialog text for item that tells how many records of distributed database to keep #: ui/settingsDialog.ui:313 msgctxt "settingsDialog|" msgid "Nr of db records to keep" msgstr "" # Label for combo-box where user can choose between voice call ringtones. #: ui/settingsDialog.ui:316 msgctxt "settingsDialog|" msgid "Ringtone" msgstr "" # Selection-list item. Selection list is for choosing between audio call ringtones, this is for ringtone that is performed with a bow. #: ui/settingsDialog.ui:324 msgctxt "settingsDialog|" msgid "Bow" msgstr "" # Selection-list item. Selection list is for choosing between audio call ringtones, this is for ringtone that is electrical. #: ui/settingsDialog.ui:329 msgctxt "settingsDialog|" msgid "Electrical" msgstr "" # Selection-list item. Selection list is for choosing between audio call ringtones, this is for ringtone that is performed in acoustic manner #: ui/settingsDialog.ui:334 msgctxt "settingsDialog|" msgid "Acoustic" msgstr "" # Selection-list item. Selection list is for choosing between audio call ringtones, this is for ringtone that is only a beep #: ui/settingsDialog.ui:339 msgctxt "settingsDialog|" msgid "Beep" msgstr "" # Selection-list item. Selection list is for choosing between audio call ringtones, this is for ringtone that is silent #: ui/settingsDialog.ui:344 msgctxt "settingsDialog|" msgid "Silence" msgstr "" # Combox-box label text. Combo-box is for selecting which audio calls to accept, selections are like "all ; no calls at all ; from some operators ; .." #: ui/settingsDialog.ui:356 msgctxt "settingsDialog|" msgid "Accept voice calls" msgstr "" # Combobox item text for selecting which audio calls to accept. Selecting this item lets all calls in. #: ui/settingsDialog.ui:364 msgctxt "settingsDialog|" msgid "All" msgstr "" # Combobox item text for selecting which audio calls to accept. Selecting this item lets in calls from trusted operators. #: ui/settingsDialog.ui:369 msgctxt "settingsDialog|" msgid "From trusted operators" msgstr "" # Combobox item text for selecting which audio calls to accept. Selecting this item rejects all calls. #: ui/settingsDialog.ui:374 msgctxt "settingsDialog|" msgid "Accept no voice calls" msgstr "" # Dialog title text for a dialog that shows network connectivity details. #: ui/statusDialog.ui:26 msgctxt "statusDialog|" msgid "Network and connection status" msgstr "" # Text field label for display-item inside "network status" dialog. The display-item shows ipv4-network address of the node. Usually it is (public) IP addr of the very machine that user is using at the moment. #: ui/statusDialog.ui:48 msgctxt "statusDialog|" msgid "Detected own IPv4" msgstr "" # Tooltip-text for display-item inside "network status" dialog. The display-item shows ipv4-network address of the node. Usually it is (public) IP addr of the very machine that user is using at the moment. #: ui/statusDialog.ui:61 ui/statusDialog.ui:93 msgctxt "statusDialog|" msgid "" "Should your friend have trouble connecting, give her this address with port " "number" msgstr "" # Text field label for display-item inside "network status" dialog. The display-item shows IPV6-address of the node. Usually it is (public) IPv6 addr of the very machine that user is using at the moment. #: ui/statusDialog.ui:74 msgctxt "statusDialog|" msgid "IPv6" msgstr "" # Text field label for display-item inside "network status" dialog. The display-item shows listen port of the node. #: ui/statusDialog.ui:113 msgctxt "statusDialog|" msgid "TCP port currently used" msgstr "" # Text field label for a list-item inside "network status" dialog. The list-item shows list of currently connected other nodes in the network. #: ui/statusDialog.ui:151 msgctxt "statusDialog|" msgid "Currently open connections" msgstr "" # Push-button label for button inside "network status" dialog. When button is hit, another dialog is opened, asking user for details about the remote node to connect. #: ui/statusDialog.ui:195 msgctxt "statusDialog|" msgid "Manually add connection" msgstr "" # Push-button label for button inside "network status" dialog. When button is hit, dialog is dismissed. #: ui/statusDialog.ui:202 msgctxt "statusDialog|" msgid "Close" msgstr "" # Dialog title text for dialog that displays TCL interpreter console. #: ui/tclConsole.ui:26 msgctxt "tclConsoleDialog|" msgid "TCL Interpreter console" msgstr "" # Button text for button that runs TCL commands that user has typed #: ui/tclConsole.ui:51 msgctxt "tclConsoleDialog|" msgid "Evaluate" msgstr "" # Button text for button that closes TCL interpreter window. Not the interpreter but only the console dialog. #: ui/tclConsole.ui:58 msgctxt "tclConsoleDialog|" msgid "Close" msgstr "" # label for text field that shows TCL interpreter output #: ui/tclConsole.ui:69 msgctxt "tclConsoleDialog|" msgid "Interpreter output" msgstr "" # label for text field that shows TCL interpreter input #: ui/tclConsole.ui:79 msgctxt "tclConsoleDialog|" msgid "Command input" msgstr "" # Dialog title text for dialog that lists stored TCL programs #: ui/tclPrograms.ui:26 msgctxt "tclProgramsDialog|" msgid "TCL programs" msgstr "" # Label for list-item that lists stored TCL programs. #: ui/tclPrograms.ui:48 msgctxt "tclProgramsDialog|" msgid "Stored programs" msgstr "" # Label for text item that shows program text of locally stored TCL program #: ui/tclPrograms.ui:68 msgctxt "tclProgramsDialog|" msgid "Program code" msgstr "" classified-ads-0.13/po/da.po000066400000000000000000003574101331670245300156700ustar00rootroot00000000000000# Translation file for classified ads. # # This is auto-generated from .ts file. # # classified ads -> rubrikannoncer (eller hvad, mУЅske bare rubrikker, annoncer, beskeder eller noget andet). msgid "" msgstr "" "Project-Id-Version: classified-ads 0.08\n" "Report-Msgid-Bugs-To: antti.jarvinen@katiska.org\n" "POT-Creation-Date: 2015-08-31 23:30+0300\n" "PO-Revision-Date: 2015-10-06 02:20-0400\n" "Last-Translator: Joe Hansen \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Zanata 3.8.2\n" "X-Qt-Contexts: true\n" # Context menu item text for menu, that appears when right-mouse is clicked on # top of a file in a list. #: ui/attachmentlistdialog.cpp:60 msgctxt "AttachmentListDialog|" msgid "Save file to disk.." msgstr "Gem fil til disk ..." # In file open dialog this is text specifying what kind of files to include in # listing, filtered by file name suffix. For example, user wants only PNG # files, then text appearing in dialog filter field would say "PNG files # (*.png)" and this work "files" here is the word after the word PNG. #: ui/attachmentlistdialog.cpp:151 ui/attachmentlistdialog.cpp:153 msgctxt "AttachmentListDialog|" msgid "files" msgstr "filer" # Dialog title text for dialog asking user to give a name to file for purpose # of saving it to filesystem. #: ui/attachmentlistdialog.cpp:155 msgctxt "AttachmentListDialog|" msgid "Choose file name for saving" msgstr "VУІlg filnavn" # Dialog title text for error dialog. #: ui/attachmentlistdialog.cpp:166 msgctxt "AttachmentListDialog|" msgid "Error" msgstr "Fejl" # This gives (no) explanation about reason for "file open failure"? #: ui/attachmentlistdialog.cpp:167 msgctxt "AttachmentListDialog|" msgid "File open error" msgstr "Der opstod en fejl under УЅbning af filen" #: call/audioplayer.cpp:64 msgctxt "AudioPlayer|" msgid "raw audio format not supported by backend, cannot play audio." msgstr "" #: call/audioplayer.cpp:82 msgctxt "AudioPlayer|" msgid "Could not initialize audio player." msgstr "" # Title text in a listing view where list of shared files are listed. This # particular text gives text for column, where "name or fingerprint of file" # is listed. Fingerprint in practice means SHA1 digest. #: datamodel/binaryfilelistingmodel.cpp:173 msgctxt "BinaryFileListingModel|" msgid "Name or fingerprint of file" msgstr "Navn eller fingeraftryk for fil" # Header text for a column-list. The column that gets its header text from # this string, is the date-column of an classified ad. #: datamodel/calistingmodel.cpp:50 datamodel/calistingmodel.cpp:143 msgctxt "CAListingModel|" msgid "Date" msgstr "Dato" # Header text for a column-list. The column that gets its header text from # this string, is the subject-column of an classified ad. #: datamodel/calistingmodel.cpp:51 datamodel/calistingmodel.cpp:142 msgctxt "CAListingModel|" msgid "Subject" msgstr "Emne" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of Cars in # Estonia" and this combobox text here is the first word of that phrase. #: datamodel/camodel.cpp:127 msgctxt "ClassifiedAdsModel|" msgid "Buying" msgstr "KУИb" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Selling of Cars # in Estonia" and this combobox text here is the first word of that phrase. #: datamodel/camodel.cpp:129 msgctxt "ClassifiedAdsModel|" msgid "Selling" msgstr "Salg" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Giving away of # Cars in Estonia" and this combobox text here is the first+2nd word of that # phrase. #: datamodel/camodel.cpp:131 msgctxt "ClassifiedAdsModel|" msgid "Giving away" msgstr "ForУІring af" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Wanting of Cars # in Estonia" and this combobox text here is the first word of that phrase. #: datamodel/camodel.cpp:133 msgctxt "ClassifiedAdsModel|" msgid "Wanting" msgstr "EfterspУИrgsel" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Renting of Cars # in Estonia" and this combobox text here is the first word of that phrase. #: datamodel/camodel.cpp:135 msgctxt "ClassifiedAdsModel|" msgid "Renting" msgstr "Leje" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Announcement of # Cars in Estonia" and this combobox text here is the first word of that # phrase. #: datamodel/camodel.cpp:137 msgctxt "ClassifiedAdsModel|" msgid "Announcement" msgstr "Annoncering" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of Cars in # Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:210 msgctxt "ClassifiedAdsModel|" msgid "Cars" msgstr "biler" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of Boats # in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:212 msgctxt "ClassifiedAdsModel|" msgid "Boats" msgstr "bУЅde" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of Bikes # in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:214 msgctxt "ClassifiedAdsModel|" msgid "Bikes" msgstr "motorcykler" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of Other # vehicles in Estonia" and this combobox text here is the 3rd+4th word of that # phrase. #: datamodel/camodel.cpp:216 msgctxt "ClassifiedAdsModel|" msgid "Other vehicles" msgstr "andre kУИretУИjer" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of vehicle # parts in Estonia" and this combobox text here is the 3rd+4th word of that # phrase. #: datamodel/camodel.cpp:218 msgctxt "ClassifiedAdsModel|" msgid "Vehicle parts" msgstr "dele af kУИretУИjer" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of # Habitation in Estonia" and this combobox text here is the 3rd word of that # phrase. #: datamodel/camodel.cpp:220 msgctxt "ClassifiedAdsModel|" msgid "Habitation" msgstr "ejendom" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of # Household appliances in Estonia" and this combobox text here is the 3rd+4th # word of that phrase. #: datamodel/camodel.cpp:222 msgctxt "ClassifiedAdsModel|" msgid "Household appliances" msgstr "husholdningsapparater" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of # Furniture in Estonia" and this combobox text here is the 3rd word of that # phrase. #: datamodel/camodel.cpp:224 msgctxt "ClassifiedAdsModel|" msgid "Furniture" msgstr "mУИbler" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of # Clothing in Estonia" and this combobox text here is the 3rd word of that # phrase. #: datamodel/camodel.cpp:226 msgctxt "ClassifiedAdsModel|" msgid "Clothing" msgstr "tУИj" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of Tools # in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:228 msgctxt "ClassifiedAdsModel|" msgid "Tools" msgstr "vУІrktУИj" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of Tools # in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:230 msgctxt "ClassifiedAdsModel|" msgid "Sports" msgstr "sportsartikler" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of Music # in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:232 msgctxt "ClassifiedAdsModel|" msgid "Music" msgstr "musik" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of Books # in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:234 msgctxt "ClassifiedAdsModel|" msgid "Books" msgstr "bУИger" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of Movies # in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:236 msgctxt "ClassifiedAdsModel|" msgid "Movies" msgstr "film" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of Animals # in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:238 msgctxt "ClassifiedAdsModel|" msgid "Animals" msgstr "dyr" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of # Electronics in Estonia" and this combobox text here is the 3rd word of that # phrase. #: datamodel/camodel.cpp:240 msgctxt "ClassifiedAdsModel|" msgid "Electronics" msgstr "elektronik" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Announcement of # Jobs in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:242 msgctxt "ClassifiedAdsModel|" msgid "Jobs" msgstr "job" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Wanting of # Transportation in Estonia" and this combobox text here is the 3rd word of # that phrase. #: datamodel/camodel.cpp:244 msgctxt "ClassifiedAdsModel|" msgid "Transportation" msgstr "transport" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Buying of # Services in Estonia" and this combobox text here is the 3rd word of that # phrase. #: datamodel/camodel.cpp:246 msgctxt "ClassifiedAdsModel|" msgid "Services" msgstr "tjenester" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Selling of # Healthcare in Estonia" and this combobox text here is the 3rd word of that # phrase. #: datamodel/camodel.cpp:248 msgctxt "ClassifiedAdsModel|" msgid "Healthcare" msgstr "sundhedspleje" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Selling of # Foodstuff in Estonia" and this combobox text here is the 3rd word of that # phrase. #: datamodel/camodel.cpp:250 msgctxt "ClassifiedAdsModel|" msgid "Foodstuff" msgstr "madvarer" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Selling of # Software in Estonia" and this combobox text here is the 3rd word of that # phrase. #: datamodel/camodel.cpp:252 msgctxt "ClassifiedAdsModel|" msgid "Software" msgstr "programmer" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Announcement of # Events in Estonia" and this combobox text here is the 3rd word of that # phrase. #: datamodel/camodel.cpp:254 msgctxt "ClassifiedAdsModel|" msgid "Events" msgstr "hУІndelser" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Giving away of # Education in Estonia" and this combobox text here is the 4th word of that # phrase. #: datamodel/camodel.cpp:256 msgctxt "ClassifiedAdsModel|" msgid "Education" msgstr "undervisning" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Announcement of # Finance in Estonia" and this combobox text here is the 3rd word of that # phrase. #: datamodel/camodel.cpp:258 msgctxt "ClassifiedAdsModel|" msgid "Finance" msgstr "finans" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Selling of # Jewelry in Estonia" and this combobox text here is the 3rd word of that # phrase. #: datamodel/camodel.cpp:260 msgctxt "ClassifiedAdsModel|" msgid "Jewelry" msgstr "smykker" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Announcement of # religious rituals in Estonia" and this combobox text here is the 3rd+4th # word of that phrase. #: datamodel/camodel.cpp:262 msgctxt "ClassifiedAdsModel|" msgid "Religious rituals" msgstr "religiУИse ritualer" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Announcement of # Philosophy in Estonia" and this combobox text here is the 3rd word of that # phrase. #: datamodel/camodel.cpp:264 msgctxt "ClassifiedAdsModel|" msgid "Philosophy" msgstr "filosofi" # Drop-down combobox-item text. This appears in context where the # classification is selected. In UI there will be text like "Announcement of # Philosophy in Any country" and this combobox text here is end part "Any # country" specifying the location where announcement. #: datamodel/camodel.cpp:908 msgctxt "ClassifiedAdsModel|" msgid "Any country" msgstr "alle lande" # Tool tip text. When user hovers mouse cursor on top of network address field # in a dialog, this text will appear. #: datamodel/connectionlistingmodel.cpp:142 msgctxt "ConnectionListingModel|" msgid "Peer network address" msgstr "Modparts netvУІrksadresse" # Tool tip text. When user hovers mouse cursor on top of field specifying if # connection is inbound/outbound this text will appear. #: datamodel/connectionlistingmodel.cpp:145 msgctxt "ConnectionListingModel|" msgid "Inbound connections are those where peer initiated connection" msgstr "IndgУЅende forbindelser er dem hvor modpart startede forbindelse" # Tool tip text. When user hovers mouse cursor on top of traffic-counter field # in a dialog, this text will appear. #: datamodel/connectionlistingmodel.cpp:148 msgctxt "ConnectionListingModel|" msgid "Data transferred from peer to your node" msgstr "Data overfУИrt fra modpart til din knude" # Tool tip text. When user hovers mouse cursor on top of traffic-counter field # in a dialog, this text will appear. #: datamodel/connectionlistingmodel.cpp:151 msgctxt "ConnectionListingModel|" msgid "Data transferred to peer from your node" msgstr "Data overfУИrt til modpart fra din knude" # Tool tip text. When user hovers mouse cursor on top of time-field in a # dialog, this text will appear. #: datamodel/connectionlistingmodel.cpp:154 msgctxt "ConnectionListingModel|" msgid "Time when connection was opened" msgstr "Tidspunkt da forbindelsen blev УЅbnet" # Column header text. Column view is used for listing network connections # currently open, this text here gives title for column that shows network # address (like IP-address) #: datamodel/connectionlistingmodel.cpp:164 msgctxt "ConnectionListingModel|" msgid "Address" msgstr "Adresse" # Column header text. Column view is used for listing network connections # currently open, this text here gives title for column that shows direction # (inbound/outbound) of the connection #: datamodel/connectionlistingmodel.cpp:167 msgctxt "ConnectionListingModel|" msgid "Inbound" msgstr "IndgУЅende" # Column header text. Column view is used for listing network connections # currently open, this text here gives title for column that shows number of # bytes transferred inside #: datamodel/connectionlistingmodel.cpp:170 msgctxt "ConnectionListingModel|" msgid "Bytes in" msgstr "Byte ind" # Column header text. Column view is used for listing network connections # currently open, this text here gives title for column that shows number of # bytes transferred outside #: datamodel/connectionlistingmodel.cpp:173 msgctxt "ConnectionListingModel|" msgid "Bytes out" msgstr "Byte ud" # Column header text. Column view is used for listing network connections # currently open, this text here gives title for column that shows time when # connection was opened. #: datamodel/connectionlistingmodel.cpp:176 msgctxt "ConnectionListingModel|" msgid "Open time" msgstr "У…bningstidspunkt" # Text in contact listing column view. This text appears in column telling if # user is to be trusted or not and this value here denotes the positive case # "user is trusted". #: datamodel/contactlistingmodel.cpp:73 msgctxt "ContactListingModel|" msgid "Yes" msgstr "Ja" # Text in contact listing column view. This text appears in column telling if # user is to be trusted or not and this value here denotes the negative case # "user trust is unknown". #: datamodel/contactlistingmodel.cpp:75 msgctxt "ContactListingModel|" msgid "Unknown" msgstr "Ukendt" # Tool tip text. When user hovers mouse cursor on top of field where operators # SHA1 digest is shown, this text appears. The field is part of contact # listing view, where users frequent contacts are shown. #: datamodel/contactlistingmodel.cpp:98 msgctxt "ContactListingModel|" msgid "Actual network address (SHA1) of the contact" msgstr "Faktisk netvУІrksadresse (SHA1) for kontakten" # Tool tip text. When user hovers mouse cursor on top of field where operators # locally given nickname is shown, this text appears. The field is part of # contact listing view, where users frequent contacts are shown. #: datamodel/contactlistingmodel.cpp:101 msgctxt "ContactListingModel|" msgid "Locally given nickname ; user may set her own nickname himself" msgstr "Lokalt angivet УИgenavn ; bruger kan lave sit eget УИgenavn" # Tool tip text. When user hovers mouse cursor on top of field where operators # trustworthiness (boolean value) in users opinion is shown, this text # appears. The field is part of contact listing view, where users frequent # contacts are shown. #: datamodel/contactlistingmodel.cpp:104 msgctxt "ContactListingModel|" msgid "Public statement if this operator to be trusted in transactions" msgstr "Offentlig erklУІring hvis denne operatУИr er trovУІrdig i transaktioner" # Column header text. Used in column view where operators frequent contacts # are shown. This text gives title to column that shows operators network # address (the SHA digest of operator) #: datamodel/contactlistingmodel.cpp:114 msgctxt "ContactListingModel|" msgid "Address" msgstr "Adresse" # Column header text. Used in column view where operators frequent contacts # are shown. This text gives title to column that shows operators nickname #: datamodel/contactlistingmodel.cpp:117 msgctxt "ContactListingModel|" msgid "Nickname" msgstr "Әgenavn" # Column header text. Used in column view where operators frequent contacts # are shown. This text gives title to column that shows operators # trustworthiness. #: datamodel/contactlistingmodel.cpp:120 msgctxt "ContactListingModel|" msgid "Publicly trusted" msgstr "Offentlig trovУІrdighed" # Error message that is displayed when SSL key generation failed. Text is # displayed in a dialog, after user dismisses the dialog, whole application # will exit. #: datamodel/contentencryptionmodel.cpp:88 msgctxt "ContentEncryptionModel|" msgid "SSL key generation went wrong, calling exit.." msgstr "SSL-nУИgleoprettelse gik galt, kalder afslut ..." # Error message that is displayed when x509 certificate generation failed. # Text is displayed in a dialog, after user dismisses the dialog, whole # application will exit. #: datamodel/contentencryptionmodel.cpp:96 msgctxt "ContentEncryptionModel|" msgid "x509 cert generation went wrong, calling exit.." msgstr "x509-certifikatoprettelse gik galt, kalder afslut ..." # Error message that is displayed when RSA private key could not be saved to # database. This is rather fatal error, the operator profile that user tried # to create will be un-usable. #: datamodel/contentencryptionmodel.cpp:194 #: datamodel/contentencryptionmodel.cpp:292 msgctxt "ContentEncryptionModel|" msgid "RSA Private key key saving went wrong" msgstr "Lagring af RSA Private-nУИgle gik galt" # Error message text. This is displayed in situation where user tried to # access content that he does not have encryption key for. This may appear # frequently during normal operation and is no fatal error, only telling user # that he is not going to see the content he was trying to access. #: datamodel/contentencryptionmodel.cpp:639 msgctxt "ContentEncryptionModel|" msgid "No suitable de-cryption key found" msgstr "Der blev ikke fundet en egnet dekrypteringsnУИgle" # Window title text for whole application. #: controller.cpp:109 msgctxt "Controller|" msgid "Classified ads" msgstr "Classified ads" # Prompt text for password dialog #: controller.cpp:141 msgctxt "Controller|" msgid "Enter password for protection of your messages:" msgstr "Indtast adgangskode for beskyttelse af dine beskeder:" # Dialog text for a wait dialog (a progress-bar like thing will be shown next # to this text and user is supposed to sit down and wait a moment..) #: controller.cpp:432 msgctxt "Controller|" msgid "Fetching item from network.." msgstr "Henter post fra netvУІrket ..." # Menu item text used in "File" menu item and when this particular item is # selected, application will close #: controller.cpp:485 msgctxt "Controller|" msgid "E&xit" msgstr "&Afslut" # Menu item tooltip-text used in "File" menu entry and when this particular # item is selected, application will close #: controller.cpp:487 msgctxt "Controller|" msgid "Exit the application" msgstr "Afslut programmet" # Menu item text used in "File" menu and when this particular item is # selected, application will show a dialog telling why this application is and # how to use it #: controller.cpp:489 msgctxt "Controller|" msgid "&About" msgstr "&Om" # Tooltip-text of menu item text used in "File" menu and when this particular # item is selected, application will show a dialog telling why this # application is and how to use it #: controller.cpp:490 msgctxt "Controller|" msgid "Show the application's About box" msgstr "Vis information om programmet" # Menu item text used in "File" menu and when this particular item is # selected, application will show a dialog prompting user to change her # password #: controller.cpp:492 msgctxt "Controller|" msgid "&Change password" msgstr "&У†ndr adgangskode" # Tooltip-item for a menu item text used in "File" menu and when this # particular item is selected, application will show a dialog prompting user # to change her password #: controller.cpp:493 msgctxt "Controller|" msgid "Change password of current profile" msgstr "У†ndr adgangskode for nuvУІrende profil" # Menu item text used in "File" menu and when this particular item is # selected, application will show a dialog prompting user to enter password # for a newly-created user profile #: controller.cpp:495 msgctxt "Controller|" msgid "Create &new profile" msgstr "Opret &ny profil" # Tooltip-text for a menu item text used in "File" menu and when this # particular item is selected, application will show a dialog prompting user # to enter password for a newly-created user profile #: controller.cpp:496 msgctxt "Controller|" msgid "Makes a brand new user profile" msgstr "Laver en helt ny brugerprofil" # Menu item text used in "File" menu and when this particular item is # selected, application will show a dialog prompting user to confirm deletion # of currently open operator profile #: controller.cpp:498 msgctxt "Controller|" msgid "&Delete current profile" msgstr "&Slet nuvУІrende profil" # Tooltip-text for a menu item text used in "File" menu and when this # particular item is selected, application will show a dialog prompting user # to confirm deletion of currently open profile #: controller.cpp:499 msgctxt "Controller|" msgid "Deletes currently open profile" msgstr "Sletter den УЅbne profil" # Menu item text used in "File" menu and when this particular item is # selected, application will show a dialog prompting user to enter password of # another profile that user will use next #: controller.cpp:501 msgctxt "Controller|" msgid "&Select another profile" msgstr "&VУІlg en anden profil" # Tooltip-text for a menu item text used in "File" menu and when this # particular item is selected, application will show a dialog prompting user # to enter password of another profile that user will use next #: controller.cpp:502 msgctxt "Controller|" msgid "If you have multitude of profiles" msgstr "Hvis du har flere profiler" # Menu item text used in "File" menu and when this particular item is # selected, application will show a settings-dialog #: controller.cpp:504 msgctxt "Controller|" msgid "Settings.." msgstr "Indstillinger ..." # Tooltip-text for a menu item text used in "File" menu and when this # particular item is selected, application will show a dialog prompting user # to enter password of another profile that user will use next #: controller.cpp:505 msgctxt "Controller|" msgid "Node-wide settings.." msgstr "Indstillinger for alle knuder ..." # Menu item text used in "File" menu and when this particular item is # selected, application will show a dialog detailing network connectivity of # the node #: controller.cpp:507 msgctxt "Controller|" msgid "Network status.." msgstr "NetvУІrksstatus ..." # Menu item text used in "File" menu and when this particular item is # selected, application will show a search-dialog #: controller.cpp:509 msgctxt "Controller|" msgid "Search.." msgstr "SУИg ..." # Menu bar title text for "File" menu. #: controller.cpp:526 msgctxt "Controller|" msgid "&File" msgstr "&Fil" # Password dialog prompt. #: controller.cpp:571 msgctxt "Controller|" msgid "Enter new password:" msgstr "Indtast ny adgangskode:" # Password dialog prompt. In this case the password dialog is not used for # giving initial password or change password but instead password is typed for # the reason of selection of another operator profile to be used. #: controller.cpp:599 controller.cpp:708 msgctxt "Controller|" msgid "Activate another profile with password" msgstr "Aktiver en anden profil med adgangskode" # Error message shown in dialog in situation where user tried to delete the # last (one and only) operator profile in machine. There needs to be at least # one profile and this error message is shown if user tries to get around that # limitation. #: controller.cpp:693 msgctxt "Controller|" msgid "Can't delete only profile." msgstr "Kan ikke slette den sidste profil." # Text shown in title of confirmation dialog. #: controller.cpp:697 msgctxt "Controller|" msgid "Permanently discard profile?" msgstr "Fjern profilen permanent?" # Text shown inside a confirmation dialog. Dialog will have buttons OK and # Cancel and this is the question. #: controller.cpp:698 msgctxt "Controller|" msgid "There will be NO way to access content of this profile later" msgstr "Der vil INGEN mУЅde vУІre til at tilgУЅ indholdet i denne profil senere" # Error message that is shown in a dialog in situation where previously stored # encryption keys of the node could not be accessed. Rather fatal error, will # render node un-usable. #: controller.cpp:761 msgctxt "Controller|" msgid "Cant load node cert or key cert" msgstr "Kan ikke indlsУІe knudecertifikat eller nУИglecertifikat" # Error message dialog title text for a dialog that is shown in a dialog in # situation where something bad happened during a filesystem file operation. # Actual explanation of the error is shown inside the dialog whose title text # this is. #: controller.cpp:766 msgctxt "Controller|" msgid "File error" msgstr "Filfejl" # Error message dialog title text for a dialog that is shown in a dialog in # situation where something bad happened during database operation. Actual # explanation of the error is shown inside the dialog whose title text this # is. #: controller.cpp:771 msgctxt "Controller|" msgid "Database error" msgstr "Databasefejl" # Error message dialog title text for a dialog that is shown in a dialog in # situation where something bad happened during a operation inside crypto- # module. Actual explanation of the error is shown inside the dialog whose # title text this is. #: controller.cpp:777 controller.cpp:787 msgctxt "Controller|" msgid "Cryptographic module" msgstr "Kryptografisk modul" # Error message dialog title text for a dialog that is shown in a dialog in # situation where something bad happened during operation inside database # module. Actual explanation of the error is shown inside the dialog whose # title text this is. #: controller.cpp:782 msgctxt "Controller|" msgid "Database module" msgstr "Databasemodul" # Error message dialog title text for a dialog that is shown in a dialog in # situation when password supplied by user was not good for any purpose. # Actual explanation of the error is shown inside the dialog whose title text # this is. #: controller.cpp:788 msgctxt "Controller|" msgid "Bad password" msgstr "Ugyldig adgangskode" # Error message text inside a dialog when user had requested for an item to be # opened but program could not find the requested item. #: controller.cpp:1004 msgctxt "Controller|" msgid "Could not find item from network.." msgstr "Kunne ikke finde post fra netvУІrket ..." # Text field explanation text. Part of "file details" dialog. This text gives # explanation of field that specifies SHA1 digest of the file. #: controller.cpp:1117 msgctxt "Controller|" msgid "SHA1: " msgstr "SHA1:" # Text field explanation text. Part of "file details" dialog. This text gives # explanation of field that specifies mime-type of the file #: controller.cpp:1122 msgctxt "Controller|" msgid "Mime-Type: " msgstr "Mime-type: " # Text field explanation text. Part of "file details" dialog. This text gives # explanation of field that gives longer explanation of the file #: controller.cpp:1128 msgctxt "Controller|" msgid "Description: " msgstr "Beskrivelse: " # Text field explanation text. Part of "file details" dialog. This text gives # explanation of field that specifies name of publisher of the file (in # practice, who uploaded the file into classified ads) #: controller.cpp:1134 msgctxt "Controller|" msgid "Publisher: " msgstr "Udgiver: " # Text field explanation text. Part of "file details" dialog. This text gives # explanation of field that specifies name of the person (or organization) # that owns (in copyright sense) the file or its contents. #: controller.cpp:1140 msgctxt "Controller|" msgid "Content owner: " msgstr "Indholdsejer: " # Text field explanation text. Part of "file details" dialog. This text gives # explanation of field that specifies the license of the file #: controller.cpp:1146 msgctxt "Controller|" msgid "License: " msgstr "Licens: " # Text field explanation text. Part of "file details" dialog. This text gives # explanation of field that specifies file name #: controller.cpp:1152 msgctxt "Controller|" msgid "Name: " msgstr "Navn: " # Text field explanation text. Part of "file details" dialog. This text gives # explanation of field that specifies file date #: controller.cpp:1159 msgctxt "Controller|" msgid "Date: " msgstr "Dato: " # Error message text shown inside dialog when user tries to select for # operation a file that is much much too big. (there is currently 2MB size # limit for shared files) #: ui/dialogbase.cpp:47 ui/dialogbase.cpp:101 msgctxt "DialogBase|" msgid "File way too big" msgstr "Filen er alt for stor" # Error message text shown inside dialog when user tries to select for # operation a file that is just-and-just too big. (there is currently 2MB size # limit for shared files) #: ui/dialogbase.cpp:55 ui/dialogbase.cpp:109 msgctxt "DialogBase|" msgid "File too big" msgstr "Filen er for stor" # Error message text shown inside dialog when user tries to select for # operation a file that can not be opened (for example due to file permission # reasons) #: ui/dialogbase.cpp:85 ui/dialogbase.cpp:131 msgctxt "DialogBase|" msgid "File open error" msgstr "Der opstod en fejl under УЅbning af fil" # Dialog title text. Dialog prompts user to select the filesystem file that # will be published inside classified ads. #: ui/dialogbase.cpp:94 msgctxt "DialogBase|" msgid "Select file to be published" msgstr "VУІlg fil til udgivelse" # Text for file type filter field in file-selection-dialog #: ui/dialogbase.cpp:96 msgctxt "DialogBase|" msgid "Files (*.*)" msgstr "Filer (*.*)" # Title text of error dialog. #: ui/editcontact.cpp:72 msgctxt "EditContactDialog|" msgid "Error" msgstr "Fejl" # Contet text of error dialog. Shown after user has tried to enter operator # address with intent of adding it to contact-list and the operator address # fails format validation. #: ui/editcontact.cpp:73 msgctxt "EditContactDialog|" msgid "Operator addr is not valid" msgstr "OperatУИradresse er ikke gyldig" # Tab text. In "main window" of classified ads UI there a are 4 or 5 tabs, # normally "Classified ads"; "My profile", "Contacts", "Private messages" and # maybe something else. This is the text of the first tab. #: FrontWidget.cpp:95 msgctxt "FrontWidget|" msgid "Classified ads" msgstr "Rubrikannoncer" # Tab text. In "main window" of classified ads UI there a are 4 or 5 tabs, # normally "Classified ads"; "My profile", "Contacts", "Private messages" and # maybe something else. This is the text of the 2nd tab. #: FrontWidget.cpp:96 msgctxt "FrontWidget|" msgid "My profile" msgstr "Min profil" # Tab text. In "main window" of classified ads UI there a are 4 or 5 tabs, # normally "Classified ads"; "My profile", "Contacts", "Private messages" and # maybe something else. This is the text of the 3rd tab. #: FrontWidget.cpp:97 msgctxt "FrontWidget|" msgid "Contacts" msgstr "Kontakter" # Tab text. In "main window" of classified ads UI there a are 4 or 5 tabs, # normally "Classified ads"; "My profile", "Contacts", "Private messages" and # maybe something else. This is the text of the 4th tab. #: FrontWidget.cpp:98 msgctxt "FrontWidget|" msgid "Private messages" msgstr "Private beskeder" # Context-menu item text. Menu appears when user right-clicks on top of file # listing view. When item whose text is specified here is selected from the # menu, a dialog will appear asking which file to share #: FrontWidget.cpp:160 msgctxt "FrontWidget|" msgid "Add shared file.." msgstr "TilfУИj delt fil ..." # Context-menu item text. Menu appears when user right-clicks on top of file # listing view. When item whose text is specified here is selected from the # menu, the selected file in the listing view will no longer be shared #: FrontWidget.cpp:161 msgctxt "FrontWidget|" msgid "Stop advertising selected shared file" msgstr "Stop annoncering af valgt delt fil" # Context-menu item text. Menu appears when user right-clicks on top of file # listing view. When item whose text is specified here is selected from the # menu, the selected file in the listing view will be saved to filesystem #: FrontWidget.cpp:162 msgctxt "FrontWidget|" msgid "Save file to disk.." msgstr "Gem fil til disk ..." # Context-menu item text. Menu appears when user right-clicks on top of file # listing view. When item whose text is specified here is selected from the # menu, information dialog about selected file will be shown #: FrontWidget.cpp:163 msgctxt "FrontWidget|" msgid "View file information.." msgstr "Vis filinformation ..." # Context-menu item text. Menu appears when user right-clicks on top of file # listing view. When item whose text is specified here is selected from the # menu, SHA digest of the selected file will be copied to clipboard. #: FrontWidget.cpp:164 msgctxt "FrontWidget|" msgid "Copy file address (SHA1) to clipboard.." msgstr "Kopier filadresse (SHA1) til udklipsholderen ..." # Context-menu item text. Menu appears when user right-clicks on top of file # listing view. When item whose text is specified here is selected from the # menu, an editor will be displayed prompting user to enter text that will # then be published for other users to see. #: FrontWidget.cpp:165 msgctxt "FrontWidget|" msgid "Edit+publish new text document.." msgstr "Rediger+udgiv nyt tekstdokument ..." # Dialog title text for "file open" dialog #: FrontWidget.cpp:353 msgctxt "FrontWidget|" msgid "Open File" msgstr "У…bn fil" # Text for filter field of file selection dialog #: FrontWidget.cpp:355 FrontWidget.cpp:885 msgctxt "FrontWidget|" msgid "Files (*.*)" msgstr "Filer (*.*)" # Error dialog title text. Actual error message will be shown inside dialog # whose title is this text. #: FrontWidget.cpp:359 FrontWidget.cpp:1185 FrontWidget.cpp:1328 msgctxt "FrontWidget|" msgid "Error" msgstr "Fejl" # Error dialog content text. Shown when image file that user selected could # not be opened (maybe because file permission problem or maybe image format # issue or ..) #: FrontWidget.cpp:360 msgctxt "FrontWidget|" msgid "Can't load image" msgstr "Kan ikke indlУІse billede" # Error dialog title text. This dialog is shown when user tries to comment # another operator but required operator data is missing from local storage. #: FrontWidget.cpp:626 FrontWidget.cpp:766 msgctxt "FrontWidget|" msgid "Profile not in database" msgstr "Profilen er ikke i databasen" # Error dialog content text. This dialog is shown when user tries to comment # another operator but required operator data is missing from local storage. #: FrontWidget.cpp:627 FrontWidget.cpp:767 msgctxt "FrontWidget|" msgid "Try viewing profile first to obtain data" msgstr "PrУИv fУИrst at se profilen fУИr indhentelse af data" # File selection title text. Prompts user to select a file for publish # purpose. #: FrontWidget.cpp:883 msgctxt "FrontWidget|" msgid "Select file to be published" msgstr "VУІlg fil for udgivelse" # Error text shown in dialog. Shown in situation where user selected a file # that really exceeds size limit (of 2MB) #: FrontWidget.cpp:890 msgctxt "FrontWidget|" msgid "File way too big" msgstr "Filen er alt for stor" # Error text shown in dialog. Shown in situation where user selected a file # that slightly exceeds size limit (of 2MB) #: FrontWidget.cpp:898 msgctxt "FrontWidget|" msgid "File too big" msgstr "Filen er for stor" # Error text shown in dialog. Shown in situation where user selected a file # that could for some reason not be opened #: FrontWidget.cpp:942 FrontWidget.cpp:1186 msgctxt "FrontWidget|" msgid "File open error" msgstr "Der opstod en fejl under УЅbning af filen" # Part of filter text field in file selection dialog. If for instance user # tries to open PNG files, then the text in filter field will be "PNG files # (*.png)" and this word is the 2nd word in the phrase. #: FrontWidget.cpp:1167 FrontWidget.cpp:1173 msgctxt "FrontWidget|" msgid "files" msgstr "filer" # File selection dialog title text. Dialog prompts user to select # location+name for an file to be exported into filesystem. #: FrontWidget.cpp:1176 msgctxt "FrontWidget|" msgid "Choose file name for saving" msgstr "VУІlg filnavn" # Text shown in placeholder for operators image in situation where user has # not yet selected any image. In practice it prompts user to insert image by # clicking at the text. #: FrontWidget.cpp:1236 msgctxt "FrontWidget|" msgid "" "\n" "\n" "\n" "Click\n" "To\n" "Add\n" "Image\n" msgstr "" "\n" "\n" "\n" "Klik\n" "for\n" "at\n" "tilfУИje\n" "billede\n" # Error message dialog content text shown when user tried to access article, # that was not stored in local database #: FrontWidget.cpp:1329 msgctxt "FrontWidget|" msgid "Article not found from local storage" msgstr "Annoncen blev ikke fundet i det lokale lager" # Tool-tip text. Shown on top of operators address when user hovers mouse on # top of the address field. The %1 will be replaced by nickname of an # operator who trusts this particular operator. The %2 will be replaced by # SHA1 digest of the operator who trusts the operator whose SHA1 is under # mouse cursor. #: FrontWidget.cpp:1355 FrontWidget.cpp:1903 #, qt-format msgctxt "FrontWidget|" msgid "" "Trusted by %1\n" "SHA1 %2" msgstr "" "Tillid til %1\n" "SHA1 %2" # Tool tip text. Shown when user howers mouse on top of operators nickname # field. In code a date-string will be concatenated to this string, so in # practice in the UI it will read "Time of last update 31 aug 2015" or # similar. #: FrontWidget.cpp:1392 msgctxt "FrontWidget|" msgid "Time of last update " msgstr "Tid for sidste opdatering " # Text for image placeholder, shown in situation where another operator has # not selected any image for her.This text is shown place of the missing # image. #: FrontWidget.cpp:1400 msgctxt "FrontWidget|" msgid "" "\n" "\n" "\n" "(No\n" "Image\n" "Selected)\n" msgstr "" "\n" "\n" "\n" "(Intet\n" "billede\n" "valgt)\n" # Context menu item text. Context-menu is related to frequent-contacts column- # view. #: FrontWidget.cpp:1494 msgctxt "FrontWidget|" msgid "Edit contact.." msgstr "Rediger kontakt ..." # Push button text. Pushing the button will open an editor prompting user to # edit+send a private message to operator who sent the classified ad currently # on display #: FrontWidget.cpp:1534 msgctxt "FrontWidget|" msgid "&Reply to sender" msgstr "&Svar til afsender" # Push button text. Pushing the button will open an editor prompting user to # edit+send a reply to classified ad currently on display #: FrontWidget.cpp:1535 msgctxt "FrontWidget|" msgid "Reply to &forum" msgstr "Svar til &forum" # Push button text. Pushing the button will open an editor prompting user to # edit+send a new classified ad. #: FrontWidget.cpp:1536 msgctxt "FrontWidget|" msgid "&Post new ad" msgstr "&Indsend ny annonce" # Push button text. Pushing the button will open an editor prompting user to # edit+send a public comment about operator who sent the classified ad # currently on display #: FrontWidget.cpp:1537 msgctxt "FrontWidget|" msgid "&Public comment" msgstr "&Offentlig kommentar" # Push button text. Pushing the button will switch to view detailing operator # who sent the classified ad currently on display #: FrontWidget.cpp:1538 msgctxt "FrontWidget|" msgid "&View profile" msgstr "&Vis profil" # Push button text. Pushing the button will open a a listing of files that are # attached to classified ad currently on display #: FrontWidget.cpp:1539 FrontWidget.cpp:1677 msgctxt "FrontWidget|" msgid "Attachments.." msgstr "VedhУІftninger ..." # Push button text. Pushing the button will open an editor prompting user to # add to her contact-list the operator who sent the classified ad currently on # display #: FrontWidget.cpp:1599 msgctxt "FrontWidget|" msgid "Add selected operator to contacts.." msgstr "TilfУИj valgt operatУИr til kontakter ..." # Push button text. Pushing the button will open an editor prompting user to # edit+send a private message to operator who sent the private message # currently on display #: FrontWidget.cpp:1673 msgctxt "FrontWidget|" msgid "&Reply" msgstr "&Svar" # Push button text. Pushing the button will open an editor prompting user to # edit+send a private message to some operator. #: FrontWidget.cpp:1674 msgctxt "FrontWidget|" msgid "&New message" msgstr "&Ny besked" # Push button text. Pushing the button will open an editor prompting user to # edit+send a public comment about operator who sent the private message # currently on display #: FrontWidget.cpp:1675 msgctxt "FrontWidget|" msgid "&Send public comment to sender" msgstr "&Send offentlig kommentar til afsender" # Push button text. Pushing the button will open view that will show details # of operator, who sent the private message currently on display. #: FrontWidget.cpp:1676 msgctxt "FrontWidget|" msgid "&View profile of peer" msgstr "&Vis profil for modpart" # Context menu item text. Appears in "message listing view" when user right- # clicks on messages view. When selected, the operator who sent the message # that is selected is added to contacts. #: FrontWidget.cpp:1711 msgctxt "FrontWidget|" msgid "Add selected to contacts.." msgstr "TilfУИj valgte til kontakter ..." # Text field label. Label tells who sent particular classified ad. #: FrontWidget.cpp:1913 FrontWidget.cpp:1915 FrontWidget.cpp:1979 #: FrontWidget.cpp:1981 msgctxt "FrontWidget|" msgid "From:" msgstr "Fra:" # Text field label. Label tells subject of classified ads. #: FrontWidget.cpp:1917 FrontWidget.cpp:1984 msgctxt "FrontWidget|" msgid "Subject:" msgstr "Emne:" # Text field label. Label tells whom a private message was sent to. #: FrontWidget.cpp:1976 msgctxt "FrontWidget|" msgid "To:" msgstr "Til:" # Error dialog content text. Shown in situation when user clicked on a link # that contained SHA1 digest that was not valid. #: FrontWidget.cpp:2288 msgctxt "FrontWidget|" msgid "Invalid SHA1 in URL" msgstr "Ugyldig SHA1 i adresse" # Error dialog content text. Shown in situation when user clicked on a link # that was not correctly formatted. #: FrontWidget.cpp:2315 msgctxt "FrontWidget|" msgid "Invalid URL" msgstr "Ugyldig adresse" # Error dialog content text. Shown in situation when user entered a link that # could not be parsed. #: ui/insertlinkdialog.cpp:69 msgctxt "InsertLinkDialog|" msgid "Invalid URL" msgstr "Ugyldig adresse" # Error dialog content text. Shown in situation when user tried to add # connection to node whose name was not found via nameserver. #: ui/manualconnection.cpp:53 msgctxt "ManualConnectionDialog|" msgid "DNS lookup failure" msgstr "DNS-opslagsfejl" # Error dialog title text. Actual error message will be shown inside the # dialog. #: ui/newprivmsgdialog.cpp:88 ui/newprivmsgdialog.cpp:138 msgctxt "NewPrivMessageDialog|" msgid "Error" msgstr "Fejl" # Error dialog content text. Dialog is shown when user tries to send a message # to operator, whose SHA1 digest (as entered by user) does not parse as SHA1 # digest. #: ui/newprivmsgdialog.cpp:89 msgctxt "NewPrivMessageDialog|" msgid "Recipient addr is not valid" msgstr "Modtageradresse er ikke gyldig" # Error dialog content text. Dialog is shown when user tries to send a message # to operator, whose encryption keys are present in local storage. #: ui/newprivmsgdialog.cpp:139 msgctxt "NewPrivMessageDialog|" msgid "Recipient encryption key not found from storage" msgstr "KrypteringsnУИgle for modtager blev ikke fundet i lageret" # Error dialog title text. Actual error message will be shown inside the # dialog. #: ui/newprofilecommentdialog.cpp:89 ui/newprofilecommentdialog.cpp:126 msgctxt "NewProfileCommentDialog|" msgid "Error" msgstr "Fejl" # Error dialog content text. Dialog is shown when user tries to comment an # operator, whose SHA1 digest (as entered by user) does not parse as SHA1 # digest. #: ui/newprofilecommentdialog.cpp:90 msgctxt "NewProfileCommentDialog|" msgid "Commented profile addr is not valid" msgstr "Kommenteret profiladresse er ikke gyldig" # Error dialog content text. Dialog is shown when user tries to send a message # to operator, whose encryption keys are present in local storage. #: ui/newprofilecommentdialog.cpp:127 msgctxt "NewProfileCommentDialog|" msgid "Recipient encryption key not found from storage" msgstr "KrypteringsnУИgle for modtager blev ikke fundet i lageret" # Error message text. Will be shown in error message dialog in case when # initial SSL key generation of node did not succeed. After user dismisses the # dialog, the application will close. #: datamodel/nodemodel.cpp:115 msgctxt "NodeModel|" msgid "SSL key generation went wrong, calling exit.." msgstr "SLL-nУИgleoprettelse gik galt, kalder afslut ..." # Error message text. Will be shown in error message dialog in case when # initial encryption key generation of user did not succeed. After user # dismisses the dialog, the application will close. #: datamodel/nodemodel.cpp:123 msgctxt "NodeModel|" msgid "x509 cert generation went wrong, calling exit.." msgstr "x509-certifikatopretttelse gik galt, kalder afslut ..." # Error message text. Will be shown in error message dialog in case when SSL # certificate of the node could not be loaded from storage. After user # dismisses the dialog, the application will close. #: datamodel/nodemodel.cpp:1596 msgctxt "NodeModel|" msgid "Cant load SSL cert" msgstr "Kan ikke indlУІse SSL-certifikat" # Error message text. Will be shown in error message dialog in case when SSL # key of the node could not be retrieved from local storage. After user # dismisses the dialog, the application will close. #: datamodel/nodemodel.cpp:1626 msgctxt "NodeModel|" msgid "Cant load SSL key" msgstr "Kan ikke indlУІse SSL-nУИgle" # Error message text. Shown in dialog when user tries to enter a password that # is too short. #: ui/passwd_dialog.cpp:104 msgctxt "PasswdDialog|" msgid "Min length 5 (use 10+)" msgstr "Min. lУІngde 5 (brug 10+)" # Password dialog title text. #: ui/passwordDialog.ui:14 msgctxt "PasswordDialog|" msgid "Password required" msgstr "Adgangskode krУІvet" # Tooltip text for password dialog. Shown when user hovers on top of password # dialog. #: ui/passwordDialog.ui:17 msgctxt "PasswordDialog|" msgid "" "Should you forget this word, there is no easy way to recover any of your " "content" msgstr "" "Skulle du glemme dette ord, sУЅ er der ingen nem mУЅde at gendanne dit indhold" # Prompt text for password dialog. #: ui/passwordDialog.ui:29 msgctxt "PasswordDialog|" msgid "Enter password for protection of your messages" msgstr "Indtast adgangskode til beskyttelse af dine beskeder" # Tooltip text for password dialog. Shown when user hovers on top of password # field #: ui/passwordDialog.ui:42 msgctxt "PasswordDialog|" msgid "" "If you forget this word, there is no simple way to recover your contents" msgstr "" "Hvis du glemmer dette ord, sУЅ er der ingen simpel mУЅde at gendanne dit " "indhold" # Password dialog button text #: ui/passwordDialog.ui:55 msgctxt "PasswordDialog|" msgid "OK" msgstr "O.k." # Tooltip text. Shown when user hovers mouse cursor on top of message sender # name. First %1 will be replaced with nickname of the operator whose message # is hovered, %2 will be replaced by nickname of operator who has expressed # positive trust towards the operator who sent the message. #: datamodel/privmsgsearchmodel.cpp:110 #, qt-format msgctxt "PrivateMessageSearchModel|" msgid "" "%1\n" "Trusted by %2" msgstr "" "%1\n" "Meldt trovУІrdig af %2" # Tooltip text. Used in column view that lists private messages of operator. # Explains the field that gives title to column that specifies direction (sent # or received) of the message. #: datamodel/privmsgsearchmodel.cpp:237 msgctxt "PrivateMessageSearchModel|" msgid "Direction of message, sent/received" msgstr "Retning for besked, sendt/modtaget" # Column title text. Used in column view that lists private messages of # operator. This field gives title to column that specifies direction # (sent/received) of the message. #: datamodel/privmsgsearchmodel.cpp:247 msgctxt "PrivateMessageSearchModel|" msgid "Dir" msgstr "Mappe" # Column title text. Used in column view that lists private messages of # operator. This field gives title to column that specifies messaging peer # (another operator) of the message. #: datamodel/privmsgsearchmodel.cpp:250 msgctxt "PrivateMessageSearchModel|" msgid "Peer" msgstr "Modpart" # Column title text. Used in column view that lists private messages of # operator. This field gives title to column that specifies time of the # message. #: datamodel/privmsgsearchmodel.cpp:253 msgctxt "PrivateMessageSearchModel|" msgid "Time" msgstr "Tid" # Column title text. Used in column view that lists private messages of # operator. This field gives title to column that specifies subject of the # message. #: datamodel/privmsgsearchmodel.cpp:256 msgctxt "PrivateMessageSearchModel|" msgid "Subject" msgstr "Emne" # Push button text. Clicking the button will open a dialog prompting user to # add a new comment #: ui/profilecommentdisplay.cpp:54 msgctxt "ProfileCommentDisplay|" msgid "&Add comment..." msgstr "&TilfУИj kommentar ..." # Context menu item text. Context menu is shown when user right-clicks on file # listing view. When this item is selected, a file selection dialog is opened. #: ui/profilecommentdisplay.cpp:65 msgctxt "ProfileCommentDisplay|" msgid "Save attachment to disk.." msgstr "Gem vedhУІftning til disk ..." # Error dialog title text #: ui/profilecommentdisplay.cpp:92 msgctxt "ProfileCommentDisplay|" msgid "Error" msgstr "Fejl" # Error dialog content text. Shown after user tried to access a profile # comment and the comment could not be found #: ui/profilecommentdisplay.cpp:93 msgctxt "ProfileCommentDisplay|" msgid "Article not found from local storage" msgstr "Annonce blev ikke fundet i det lokale lager" # Text field label text. The text field whose label this is will show number # how many attachements there are in the comment. #: ui/profilecommentitemdelegate.cpp:93 msgctxt "ProfileCommentItemDelegate|" msgid "Attachments: " msgstr "VedhУІftninger: " # Column view column title text. The column view in question lists profile # comments. This text gives title to column that tells who sent the comment. #: datamodel/profilecommentlistingmodel.cpp:219 msgctxt "ProfileCommentListingModel|" msgid "Sender" msgstr "Afsender" # Column view column title text. The column view in question lists profile # comments. This text gives title to column that tells when comment was sent. #: datamodel/profilecommentlistingmodel.cpp:222 msgctxt "ProfileCommentListingModel|" msgid "Time" msgstr "Tidspunkt" # Column view column title text. The column view in question lists profile # comments. This text gives title to column that tells subject of the comment. #: datamodel/profilecommentlistingmodel.cpp:225 msgctxt "ProfileCommentListingModel|" msgid "Subject" msgstr "Emne" # Error message text. Shown inside a dialog after user tried to send a comment # to operator who had sent a comment and it turns out that necessary # encryption keys of the commenting operator are not found and the replying # comment can't be sent. #: datamodel/profilecommentmodel.cpp:67 msgctxt "ProfileCommentModel|" msgid "Profile related to comment not found from database" msgstr "Profil relateret til kommentar blev ikke fundet i databasen" # Context menu item text. This context-menu is shown when user right-clicks # list of operators that is shown in dialog that is made for listing operators # (who are readers of another profile) #: ui/profilereadersdialog.cpp:73 msgctxt "ProfileReadersDialog|" msgid "View profile" msgstr "Vis profil" # Column view column title text. The column view lists readers (operators) of # another profile. #: datamodel/profilereaderslistingmodel.cpp:174 msgctxt "ProfileReadersListingModel|" msgid "Name or fingerprint of reader" msgstr "Navn eller fingeraftryk for lУІser" #: call/ringtoneplayer.cpp:77 msgctxt "RingtonePlayer|" msgid "raw audio format not supported by backend, cannot play audio." msgstr "" #: call/ringtoneplayer.cpp:93 msgctxt "RingtonePlayer|" msgid "Could not initialize audio player." msgstr "" # Context menu item text. This context menu is shown when user right-clicks on # top of search-results. This menu-item opens the currently-selected item from # search results. #: ui/searchdisplay.cpp:62 msgctxt "SearchDisplay|" msgid "Open.." msgstr "У…bn ..." # Menu title text. This is the help menu. #: textedit/textedit.cpp:127 msgctxt "TextEdit|" msgid "Help" msgstr "HjУІlp" # Menu-item text used in "help" menu. Selecting this item opens "about" dialog # about Qt library. #: textedit/textedit.cpp:129 msgctxt "TextEdit|" msgid "About &Qt" msgstr "Om &Qt" # Window title text for container-window containing actions. It seems to me # that this text actually does not appear anywhere in the UI due to way, how # container-windows are used. #: textedit/textedit.cpp:186 msgctxt "TextEdit|" msgid "Edit Actions" msgstr "Rediger handlinger" # Menu text. This gives text to "file" menu of a text editor. #: textedit/textedit.cpp:188 msgctxt "TextEdit|" msgid "&File" msgstr "&Fil" # Text editor action text. This text will appear both as menu-item text and as # tool-tip text of a button that has icon. The action performed under this # title is "open a filesystem file" #: textedit/textedit.cpp:194 msgctxt "TextEdit|" msgid "&Open..." msgstr "&У…bn ..." # Menu item text inside menu in text editor. When selected, the text being # edited will be saved into local filesystem file. #: textedit/textedit.cpp:203 msgctxt "TextEdit|" msgid "&Save locally before send" msgstr "&Gem lokalt fУИr der sendes" # Menu item text inside menu in text editor. When selected, the text being # edited will be saved into local filesystem file and user will be queried for # file name. #: textedit/textedit.cpp:210 msgctxt "TextEdit|" msgid "Save locally &As..." msgstr "Gem lokalt &som ..." # Text editor action text. This text will appear both as menu-item text and as # tool-tip text of a button that has icon. The action performed under this # title is "print" #: textedit/textedit.cpp:218 msgctxt "TextEdit|" msgid "&Print..." msgstr "&Udskriv ..." # Text editor action text. This text will appear both as menu-item text and as # tool-tip text of a button that has icon. The action performed under this # title is "open print preview" #: textedit/textedit.cpp:226 msgctxt "TextEdit|" msgid "Print Preview..." msgstr "Vis forhУЅndsvisning ..." # Menu-item text. Used in file-menu for triggering "export as pdf" operation #: textedit/textedit.cpp:231 msgctxt "TextEdit|" msgid "&Export PDF..." msgstr "&Eksporter PDF ..." # Menu text for "edit" menu of text editor. #: textedit/textedit.cpp:244 msgctxt "TextEdit|" msgid "&Edit" msgstr "&Rediger" # Text editor action text. This text will appear both as menu-item text and as # tool-tip text of a button that has icon. The action performed under this # title is "undo" #: textedit/textedit.cpp:249 msgctxt "TextEdit|" msgid "&Undo" msgstr "&Genskab" # Text editor action text. This text will appear both as menu-item text and as # tool-tip text of a button that has icon. The action performed under this # title is "re-do" #: textedit/textedit.cpp:254 msgctxt "TextEdit|" msgid "&Redo" msgstr "&OmgУИr" # Text editor action text. This text will appear both as menu-item text and as # tool-tip text of a button that has icon. The action performed under this # title is "cut" (to clipboard) #: textedit/textedit.cpp:261 msgctxt "TextEdit|" msgid "Cu&t" msgstr "K&lip" # Text editor action text. This text will appear both as menu-item text and as # tool-tip text of a button that has icon. The action performed under this # title is "copy to clipboard" #: textedit/textedit.cpp:267 msgctxt "TextEdit|" msgid "&Copy" msgstr "&Kopier" # Text editor action text. This text will appear both as menu-item text and as # tool-tip text of a button that has icon. The action performed under this # title is "paste from clipboard" #: textedit/textedit.cpp:273 msgctxt "TextEdit|" msgid "&Paste" msgstr "&IndsУІt" # Menu item text inside text editor "edit" menu. After this menu-item is # selected, a dialog is opened, prompting user to enter a link (URL) to be # included in the text. #: textedit/textedit.cpp:283 msgctxt "TextEdit|" msgid "Insert link" msgstr "IndsУІt henvisning" # Menu-item text for embedding an image #: textedit/textedit.cpp:287 msgctxt "TextEdit|" msgid "Embed image" msgstr "Indlejr billede" # Menu text. Gives name for a "format" menu inside a text editor. #: textedit/textedit.cpp:294 msgctxt "TextEdit|" msgid "F&ormat" msgstr "&Format" # Text editor action text. This text will appear both as menu-item text and as # tool-tip text of a button that has icon. The action performed under this # title is "toggle bold text style" #: textedit/textedit.cpp:298 msgctxt "TextEdit|" msgid "&Bold" msgstr "F&ed" # Text editor action text. This text will appear both as menu-item text and as # tool-tip text of a button that has icon. The action performed under this # title is "toggle italic text" #: textedit/textedit.cpp:310 msgctxt "TextEdit|" msgid "&Italic" msgstr "&Kursiv" # Text editor action text. This text will appear both as menu-item text and as # tool-tip text of a button that has icon. The action performed under this # title is "toggle underline" #: textedit/textedit.cpp:322 msgctxt "TextEdit|" msgid "&Underline" msgstr "&Understreg" # Text editor action text. This text will appear both as menu-item text and as # tool-tip text of a button that has icon. The action performed under this # title is "left-justify" #: textedit/textedit.cpp:341 textedit/textedit.cpp:347 msgctxt "TextEdit|" msgid "&Left" msgstr "&Venstre" # Text editor action text. This text will appear both as menu-item text and as # tool-tip text of a button that has icon. The action performed under this # title is "toggle centered text" #: textedit/textedit.cpp:342 textedit/textedit.cpp:346 msgctxt "TextEdit|" msgid "C&enter" msgstr "&Centrer" # Text editor action text. This text will appear both as menu-item text and as # tool-tip text of a button that has icon. The action performed under this # title is "right-justify" #: textedit/textedit.cpp:343 textedit/textedit.cpp:345 msgctxt "TextEdit|" msgid "&Right" msgstr "&HУИjre" # Text editor action text. This text will appear both as menu-item text and as # tool-tip text of a button that has icon. The action performed under this # title is "justify both right+left" #: textedit/textedit.cpp:349 msgctxt "TextEdit|" msgid "&Justify" msgstr "&Juster" # Text editor action text. This text will appear both as menu-item text and as # tool-tip text of a button that has icon. The action performed under this # title is "color selection" #: textedit/textedit.cpp:376 msgctxt "TextEdit|" msgid "&Color..." msgstr "&Farve ..." # Combobox item text. The combobox is used to select text style. The text # style selected with this text is "standard" #: textedit/textedit.cpp:383 msgctxt "TextEdit|" msgid "Standard" msgstr "Standard" # Combobox item text. The combobox is used to select text style. The text # style selected with this text is "bullet list (disc)" #: textedit/textedit.cpp:384 msgctxt "TextEdit|" msgid "Bullet List (Disc)" msgstr "Punktopstilling (disk)" # Combobox item text. The combobox is used to select text style. The text # style selected with this text is "bullet list (circle)" #: textedit/textedit.cpp:385 msgctxt "TextEdit|" msgid "Bullet List (Circle)" msgstr "Punktopstilling (cirkel)" # Combobox item text. The combobox is used to select text style. The text # style selected with this text is "bullet list (square)" #: textedit/textedit.cpp:386 msgctxt "TextEdit|" msgid "Bullet List (Square)" msgstr "Punktopstilling (firkant)" # Combobox item text. The combobox is used to select text style. The text # style selected with this text is "ordered list (decimal)" #: textedit/textedit.cpp:387 msgctxt "TextEdit|" msgid "Ordered List (Decimal)" msgstr "Nummereringstype (decimal)" # Combobox item text. The combobox is used to select text style. The text # style selected with this text is "ordered list (alpha lower)" #: textedit/textedit.cpp:388 msgctxt "TextEdit|" msgid "Ordered List (Alpha lower)" msgstr "Nummereringstype (alfa nedre)" # Combobox item text. The combobox is used to select text style. The text # style selected with this text is "ordered list (alpha upper)" #: textedit/textedit.cpp:389 msgctxt "TextEdit|" msgid "Ordered List (Alpha upper)" msgstr "Nummereringstype (alfa УИvre)" # Combobox item text. The combobox is used to select text style. The text # style selected with this text is "ordered list (roman lower)" #: textedit/textedit.cpp:390 msgctxt "TextEdit|" msgid "Ordered List (Roman lower)" msgstr "Nummereringstype (roman nedre)" # Combobox item text. The combobox is used to select text style. The text # style selected with this text is "ordered list (roman upper)" #: textedit/textedit.cpp:391 msgctxt "TextEdit|" msgid "Ordered List (Roman upper)" msgstr "Nummereringstype (roman УИvre)" # Warning dialog title text. This dialog is shown if user tries to exit # without saving her text. #: textedit/textedit.cpp:442 msgctxt "TextEdit|" msgid "Application" msgstr "Program" # Warning dialog title content text. Text asks what to do with modifications. # The dialog has buttons Save,Discard and Cancel and this text is the # question. #: textedit/textedit.cpp:443 msgctxt "TextEdit|" msgid "" "The document has been modified.\n" "Do you want to save your changes?" msgstr "" "Dokumentet er blevet УІndret.\n" "Әnsker du at gemme dine УІndringer?" # File selection dialog title text. Dialog will prompt user to select a # document for opening. #: textedit/textedit.cpp:467 msgctxt "TextEdit|" msgid "Open File..." msgstr "У…bn fil ..." # Text for file selection filter field to be used inside file selection # dialog. There are 2 parts, separated by ";;" and those semicolons must be # left in place. Also the filter parts like (*.htm) must not be edited. The # explanations like "HTML-Files" may be edited. #: textedit/textedit.cpp:468 msgctxt "TextEdit|" msgid "HTML-Files (*.htm *.html);;All Files (*)" msgstr "HTML-filer (*.htm *.html);;Alle filer (*)" # File selection dialog title text. Dialog in question prompts user to select # name for file to be persisted. #: textedit/textedit.cpp:485 msgctxt "TextEdit|" msgid "Save as..." msgstr "Gem som ..." # Text for file selection filter field to be used inside file selection # dialog. There are 3 parts, separated by ";;" and those semicolons must be # left in place. Also the filter parts like (*.odt) must not be edited. The # explanations like "ODF-files" may be edited. #: textedit/textedit.cpp:486 msgctxt "TextEdit|" msgid "ODF files (*.odt);;HTML-Files (*.htm *.html);;All Files (*)" msgstr "ODF-filer (*.odt);;HTML-Files (*.htm *.html);;Alle filer (*)" # Dialog title text. The dialog is printer dialog asking user how to print the # text currently in editor. #: textedit/textedit.cpp:501 msgctxt "TextEdit|" msgid "Print Document" msgstr "Udskriv dokument" # File selection dialog title text. Dialog will prompt user to select a # document for opening. #: textedit/textedit.cpp:559 msgctxt "TextEdit|" msgid "Open File" msgstr "У…bn fil" # Text for file selection filter field to be used inside file selection # dialog. The filter parts like (*.odt) must not be edited. The explanations # like "Files" may be edited. #: textedit/textedit.cpp:561 msgctxt "TextEdit|" msgid "Files (*.*)" msgstr "Filer (*.*)" # Error dialog title text. #: textedit/textedit.cpp:566 msgctxt "TextEdit|" msgid "Error" msgstr "Fejl" # Error dialog content text. #: textedit/textedit.cpp:567 msgctxt "TextEdit|" msgid "Can't load image" msgstr "Kan ikke indlУІse billede" # Error message displayed inside error dialog after user tried to select for # operation a file whose size greatly exceeds file size limit. #: textedit/textedit.cpp:621 textedit/textedit.cpp:631 msgctxt "TextEdit|" msgid "File way too big" msgstr "Filen er alt for stor" #: net/voicecallengine.cpp:519 msgctxt "VoiceCallEngine|" msgid "Accept" msgstr "" #: net/voicecallengine.cpp:527 msgctxt "VoiceCallEngine|" msgid "Reject" msgstr "" #: net/voicecallengine.cpp:529 msgctxt "VoiceCallEngine|" msgid "Close" msgstr "" #: net/voicecallengine.cpp:545 msgctxt "VoiceCallEngine|" msgid "Actual network address (SHA1) of the peer operator" msgstr "" #: net/voicecallengine.cpp:548 msgctxt "VoiceCallEngine|" msgid "Network address of the remote node" msgstr "" #: net/voicecallengine.cpp:558 msgctxt "VoiceCallEngine|" msgid "Operator" msgstr "" #: net/voicecallengine.cpp:561 msgctxt "VoiceCallEngine|" msgid "Node address" msgstr "" #: net/voicecallengine.cpp:564 msgctxt "VoiceCallEngine|" msgid "Call status" msgstr "" #: net/voicecallengine.cpp:567 msgctxt "VoiceCallEngine|" msgid "Controls" msgstr "" #: net/voicecallengine.cpp:570 msgctxt "VoiceCallEngine|" msgid "Ending" msgstr "" #: net/voicecallengine.cpp:607 msgctxt "VoiceCallEngine|" msgid "Initializing" msgstr "" #: net/voicecallengine.cpp:610 msgctxt "VoiceCallEngine|" msgid "Incoming" msgstr "" #: net/voicecallengine.cpp:613 msgctxt "VoiceCallEngine|" msgid "Open" msgstr "" #: net/voicecallengine.cpp:616 msgctxt "VoiceCallEngine|" msgid "Closing" msgstr "" #: net/voicecallengine.cpp:619 msgctxt "VoiceCallEngine|" msgid "Closed" msgstr "" #: net/voicecallengine.cpp:622 msgctxt "VoiceCallEngine|" msgid "Error" msgstr "" #: net/voicecallengine.cpp:625 msgctxt "VoiceCallEngine|" msgid "No call" msgstr "" #: net/voicecallengine.cpp:780 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible" msgstr "" #: net/voicecallengine.cpp:786 msgctxt "VoiceCallEngine|" msgid "Audio call is possible" msgstr "" #: net/voicecallengine.cpp:793 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator address unknown" msgstr "" #: net/voicecallengine.cpp:799 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator profile not found" msgstr "" #: net/voicecallengine.cpp:802 msgctxt "VoiceCallEngine|" msgid "" "Audio call is not possible: operator has no node information in profile" msgstr "" #: net/voicecallengine.cpp:821 #, qt-format msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operators IPv4 address %1 not connected" msgstr "" #: net/voicecallengine.cpp:828 #, qt-format msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operators IPv6 address %1 not connected" msgstr "" #: net/voicecallengine.cpp:839 msgctxt "VoiceCallEngine|" msgid "" "Audio call is not possible: local node has no IPv6 address, operator has " "only IPv6 addr" msgstr "" #: net/voicecallengine.cpp:841 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator does not publish network address" msgstr "" # Dialog title text for "about" dialog. #: ui/aboutDialog.ui:26 msgctxt "aboutDialog|" msgid "About classified ads" msgstr "Om classified ads" # 1st line of text inside "about" dialog, placed next to the turle logo. This # text is then followed by longer explanation detail why this program is and # how. This is kind of title for the longer explanation. #: ui/aboutDialog.ui:100 msgctxt "aboutDialog|" msgid " Classified ads is a program for online communications" msgstr "" " Classified ads (rubrikannoncer) er et program til kommunikation pУЅ nettet" # The long explanation of classified ads inside about-dialog. Note that this text must be valid html. Needs to start with and end with etc. This is easiest to edit like this: copy-paste the content in to a file, say /tmp/about.html. Then either open your favourite html-editor or open classified ads. In classified ads you can start constructing an ad, select from file-menu "open.." and select this file ;do editing and save from file-menu. The saved file is immediately in correct format to be be copy-pasted into contents of this field. #: ui/aboutDialog.ui:163 #| msgid "" #| "

Classified ads is free software. You may use, copy " #| "and modify it if you follow the conditions given in GNU lesser general " #| "public license version 2.1.

Classified ads is copyright ТЉ Antti " #| "JУЄrvinen 2013.

Main feature of the the program is an " #| ""advertisement" - a piece of text belonging to selected " #| "classification. There are several pre-programmed classifications and " #| "operators are encouraged to invent new classifications for new purposes ; " #| "the selection boxes in classification-selection tab are editable. Other " #| "operators may then view the ads, publicly comment the ads, the operators " #| "and also send private messages to each others.

Another important " #| "feature of classified ads is that it is designed to be operated without " #| "any centralized server infrastucture - it is you and other operators " #| "whose computers store and transmit all the content visible inside " #| "classified ads. To get connected you need to know address of at least one " #| "existing computer (a node) so " #| "if your network connection dialog shows no connections, you may need to " #| "contact someone you know is using the software and ask for address of her " #| "node to make initial contact with the network. Once connected the " #| "software should maintain list of addresses of other nodes.

Due to " #| "its server-less design the whole system works best if you leave the " #| "program running always when you have your computer powered on ; while " #| "processing other operators requests it will hog some computing resources " #| "and generate network traffic also when you are not actively using the " #| "program youself - others are.

Operators concerned about privacy of " #| "the content should be aware of following items:

- Data storage " #| "implementation is variant of distributed hash table, practically meaning " #| "that content posted by you gets copied some more-or-less random nodes in " #| "the network.

- Any data item (ad, comment, binary file, private " #| "message etc.) is digitally signed. This makes it more difficult to try to " #| "pose as another operator.

- Operators are reliably identified only " #| "by the SHA1 hash of their generated encryption keys. SHA1 hash is " #| "displayed when viewing details of operator profiles. Other identifying " #| "information like nickname or city name are entered by operator himself " #| "and can be anything. The operator profile, as it is published to the " #| "network, is also signed with the encryption keys of the operator - if you " #| "identify an operator by her SHA1 hash, you have a mechanism for " #| "identifying if any content inside classified ads is posted by this " #| "operator or not. Classified ads internally checks for digital signatures, " #| "throwing away content that fails signature check and tries to provide " #| "SHA1 hash of the operator who posted the content.

- All classified " #| "ads are posted as plain text, no encryption is used. All public profiles " #| "are posted as plain text, no encryption is used. If profile is made " #| "private, it is encrypted to be readable only by selected other profiles. " #| "This applies also to binary files shared by operators private profiles " #| "and comments about private profiles after the profile was made private " #| "(previously plain-text comments or files don't get magically encrypted " #| "afterwards). Private messages are encrypted always to be readable only by " #| "recipient and sender. Attachments follow the privary rules of the " #| "document, they're attachted to.

- As is the case with all " #| "internet-communications, this small fact is true for classified ads too : " #| "once something gets posted online, " #| "there is no way to remove it from network.

- Data " #| "encryption implementation for content is OpenSSL, relying mostly on " #| "algorithms RSA-2048 and AES-256.

- While connections between nodes " #| "are implemented using SSL, other nodes inside network do get to know what " #| "content is being transmitted in neighboring nodes. While there is no " #| "central point for easily collecting this information about particular " #| "classification or operator, operators still should expect no privacy " #| "regarding their doings online, although some effort has been been put " #| "into hiding contents of " #| "private messages and private profiles.

Programming was (mostly) " #| "done by Antti JУЄrvinen, artwork by Meeri JУЄrvinen.

This product " #| "includes software developed by the OpenSSL Project for use in the OpenSSL " #| "Toolkit (http://www.openssl.org/).

Happy " #| "advertising!


" msgctxt "aboutDialog|" msgid "" "

Classified ads is free software. You may use, copy and " "modify it if you follow the conditions given in GNU lesser general public " "license version 2.1.

Classified ads is copyright ТЉ Antti JУЄrvinen " "2013.

Main feature of the program is an "advertisement" - a " "piece of text belonging to selected classification. There are several " "pre-programmed classifications and operators are encouraged to invent new " "classifications for new purposes ; the selection boxes in " "classification-selection tab are editable. Other operators may then view the " "ads, publicly comment the ads, the operators and also send private messages " "to each others.

Another important feature of classified ads is that " "it is designed to be operated without any centralized server infrastructure " "- it is you and other operators whose computers store and transmit all the " "content visible inside classified ads. To get connected you need to know " "address of at least one existing computer (a node) so if your network connection dialog shows " "no connections, you may need to contact someone you know is using the " "software and ask for address of her node to make initial contact with the " "network. Once connected the software should maintain list of addresses of " "other nodes.

Due to its server-less design the whole system works " "best if you leave the program running always when you have your computer " "powered on ; while processing other operators requests it will hog some " "computing resources and generate network traffic also when you are not " "actively using the program yourself - others are.

Operators concerned " "about privacy of the content should be aware of following items:

- " "Data storage implementation is variant of distributed hash table, practically meaning that " "content posted by you gets copied some more-or-less random nodes in the " "network.

- Any data item (ad, comment, binary file, private message " "etc.) is digitally signed. This makes it more difficult to try to pose as " "another operator.

- Operators are reliably identified only by the " "SHA1 hash of their generated encryption keys. SHA1 hash is displayed when " "viewing details of operator profiles. Other identifying information like " "nickname or city name are entered by operator himself and can be anything. " "The operator profile, as it is published to the network, is also signed with " "the encryption keys of the operator - if you identify an operator by her " "SHA1 hash, you have a mechanism for identifying if any content inside " "classified ads is posted by this operator or not. Classified ads internally " "checks for digital signatures, throwing away content that fails signature " "check and tries to provide SHA1 hash of the operator who posted the " "content.

- All classified ads are posted as plain text, no encryption " "is used. All public profiles are posted as plain text, no encryption is " "used. If profile is made private, it is encrypted to be readable only by " "selected other profiles. This applies also to binary files shared by " "operators private profiles and comments about private profiles after the " "profile was made private (previously plain-text comments or files don't get " "magically encrypted afterwards). Private messages are encrypted always to be " "readable only by recipient and sender. Attachments follow the privacy rules " "of the document, they're attached to.

- As is the case with all " "internet-communications, this small fact is true for classified ads too : " "once something gets posted online, there " "is no way to remove it from network.

- Data encryption " "implementation for content is OpenSSL, relying mostly on algorithms RSA-2048 " "and AES-256.

- While connections between nodes are implemented using " "SSL, other nodes inside network do get to know what content is being " "transmitted in neighboring nodes. While there is no central point for easily " "collecting this information about particular classification or operator, " "operators still should expect no privacy regarding their doings online, " "although some effort has been been put into hiding contents of private messages and private " "profiles.

Programming was (mostly) done by Antti JУЄrvinen, artwork by " "Meeri JУЄrvinen.

This product includes software developed by the " "OpenSSL Project for use in the OpenSSL Toolkit " "(http://www.openssl.org/).

Happy " "advertising!


" msgstr "" "

Classified ads er et frit program. Du mУЅ bruge, " "kopiere og УІndre programmet, hvis du fУИlger betingelser i GNU lesser general" " public license version 2.1.

Classified ads har ophavsret Antti " "JУЄrvinen 2013.

Hovedfunktionen i programmet er en " ""rubrikannonce" - et stykke tekst tilhУИrende udvalgte " "klassifikationer. Der er flere forprogrammerede klassifikationer og " "operatУИrer opfordres til at finde pУЅ nye klassifikationer for nye formУЅl ; " "boksene med valgmuligheder i klassifikation-valg-fanebladene kan redigeres. " "Andre operatУИrer kan sУЅ se annoncerne, offentligt kommentere annoncerne, " "operatУИrerne og ogsУЅ sende private beskeder til hinanden.

En anden " "vigtig funktion i classified ads er, at det er designet til at fungere uden " "en centraliseret serverinfrastruktur - det er dig og andre operatУИrer hvis " "computere lagrer og sender alt indhold synligt inden i rubrikannoncerne. For" " at blive tilsluttet skal du kende adressen pУЅ mindst en eksisterende " "computer (en knude), sУЅ hvis din " "netvУІrksforbindelsesdialog ikke viser nogen forbindelser, sУЅ skal du " "kontakte nogen som du ved bruger programmet og anmode om adressen for at " "foretage opstartskontakten med netvУІrket. NУЅr fУИrst forbundet vedligeholder " "programmet en adresseliste over andre knuder.

PУЅ grund af sit design " "fungerer hele systemet bedst hvis du lader programmer kУИre hele tiden, mens " "din computer er tУІndt ; under behandling af andre operatУИrforespУИrgsler vil " "programmet bruge nogle beregningsressoucer og oprette netvУІrkstrafik, ogsУЅ " "nУЅr du ikke aktivt bruger selve programmet - andre gУИr.

OperatУИrer " "som tУІnker pУЅ privatliv for indholdt skal vУІre opmУІrksom pУЅ " "fУИlgende:

- Datalagerimplementationen er en variant af en distribueret hash-tabel, hvilket i " "praksis betyder, at indhold indsendt af dig bliver kopieret via mere eller " "mindre vilkУЅrlige knuder i netvУІrket.

- Alle dataposter (annonce, " "kommentar, binУІr fil, privat besked etc.) er digitalt underskrevet. Dette " "gУИr det svУІrt at udgive sig for at vУІre en anden operatУИr

- " "OperatУИrer kan kun identificeres trovУІrdigt med SHA1-hash for deres " "oprettede krypteringsnУИgler. SHA1-hash vises, nУЅr der kigges pУЅ detaljer for" " operatУИrprofiler. Anden identifikationsinformation sУЅsom УИgenavn eller " "bynavn indtastes selv af operatУИren og kan vУІre alt. OperatУИrprofilen, som " "den udgives pУЅ netvУІrket, er ogsУЅ underskrevet med krypteringsnУИglerne for " "operatУИren - hvis du identificerer en operatУИr via dennes SHA1-hash, sУЅ har " "du en mekanisme til at identificere om indhold i rubrikannoncer er indsendt " "af denne operatУИr eller ej. Classified ads kontrollerer internt for digitale" " underskrifter, og smider indhold vУІk som mangler kontrol af underskrift og " "forsУИger at tilbyde SHA1-hash for operatУИren som indsendte indholdet. " "

- Alle rubrikannoncer indsendes som ren tekst, ingen kryptering " "anvendes. Alle offentlige profiler indsendes som ren tekst, ingen kryptering" " anvendes. Hvis profilen gУИres privat, sУЅ krypteres den, sУЅ den kun kan " "lУІses af profiler valgt af dig. Dette gУІlder ogsУЅ for binУІre filer delt af " "operatУИrers private profiler og kommentarer om private profiler efter " "profilen blev gjort privat (tidligere kommentarer eller filer i ren tekst " "bliver ikke krypteret efterfУИlgende). Private beskeder krypteres altid for " "kun at kunne lУІses af modtager og afsender. VedhУІftninger fУИlger " "privatlivsreglerne for dokumentet, de er vedhУІftet.

- Som med al " "anden internetkommunikation, sУЅ gУІlder det ogsУЅ for classified ads, at : " "nУЅr fУИrst udgivet pУЅ nettet, sУЅ er der " "ingen mУЅde at fjerne det igen fra netvУІrket.

- " "Datakrypteringsimplementering for indhold er OpenSSL, afhУІngig hovedsagelig " "af algoritmerne RSA-2048 og AES-256.

- Mens forbindelser mellem " "knuder er implementeret via SSL, sУЅ fУЅr andre knuder inden i netvУІrk ikke at" " vide hvilket indhold, der sendes i nУІrliggende knuder. Selv om der ikke er " "et centralt sted for nem indsamling af denne information om bestemt " "klassifikation eller operatУИr, sУЅ skal operatУИrer stadig ikke forvente " "privatliv vedrУИrende deres virke pУЅ nettet, selvom der er gjort en indsats " "for at skjule indhold i private " "beskeder og private profiler.

Programmeringen blev (hovedsagelig) " "udfУИrt af Antti JУЄrvinen, grafik af Meeri JУЄrvinen.

Dette prdukt " "inkluderer et program udviklet af OpenSSL-projektet for brug i OpenSSL-" "vУІrktУИjssУІttet (http://www.openssl.org/).

Happy " "advertising!


" # Dialog title text. Dialog in question produces list of file attachments. #: ui/attachmentListDialog.ui:26 msgctxt "attachmentListDialog|" msgid "List of attached files" msgstr "Liste over vedhУІftede filer" #: ui/callStatusDialog.ui:26 msgctxt "callStatusDialog|" msgid "Call status" msgstr "" #: ui/callStatusDialog.ui:49 msgctxt "callStatusDialog|" msgid "Input level" msgstr "" #: ui/callStatusDialog.ui:65 msgctxt "callStatusDialog|" msgid "Audio calls" msgstr "" #: ui/callStatusDialog.ui:90 msgctxt "callStatusDialog|" msgid "Output level" msgstr "" # Dialog title text. Purpose of the dialog is to let user change properties of # a frequent contact in contact-list. #: ui/editContact.ui:26 msgctxt "editContactDialog|" msgid "Edit a contact" msgstr "Rediger en kontakt" # Text field label in contact-editing dialog. This gives label for field that # shows SHA1 fingerprint of the operator whose data is being edited #: ui/editContact.ui:39 msgctxt "editContactDialog|" msgid "Address (SHA1) of contact" msgstr "Adresse (SHA1) for kontakt" # Text field label in contact-editing dialog. This gives label for field that # shows nickname of the operator whose data is being edited #: ui/editContact.ui:53 msgctxt "editContactDialog|" msgid "Local nickname" msgstr "Lokalt УИgenavn" # Tooltip text of a checkbox label in contact-editing dialog. The checkbox is # one that controls statement of trustworthniness of the operator whose data # is being edited. Note html format. #: ui/editContact.ui:65 msgctxt "editContactDialog|" msgid "" "

Settings some trusted is public information to readers" " of your profile

" msgstr "" "

Angivelse af nogle som trovУІrdige er offentlig " "information for lУІsere af din profil

" # Label of a checkbox in contact-editing dialog. The checkbox is one that # controls statement of trustworthniness of the operator whose data is being # edited. #: ui/editContact.ui:68 msgctxt "editContactDialog|" msgid "This contact is to be publicly trusted in transactions" msgstr "Denne kontakt er trovУІrdig i transaktioner" # Name of front widget. Wild guess is that this text actually does not appear # anywhere in the UI. #: frontWidget.ui:14 msgctxt "frontWidget|" msgid "Form" msgstr "Formular" # Tab title text in front widget. When user clicks in this tab, the view is # switched to one, that lists classified ads. #: frontWidget.ui:39 msgctxt "frontWidget|" msgid "Classified ads" msgstr "Rubrikannoncer" # Prompt text next "search" button. User is supposed to enter search criteria # for classified ads and then click "search" ; this is prompt text for this # behaviour. #: frontWidget.ui:67 msgctxt "frontWidget|" msgid "Search for classified ads about" msgstr "SУИg efter rubrikannoncer om" # Prompt text very next to "search" button. After user has clicked the button, # he is supposed to be viewing list of classified ads matching the search # criteria. #: frontWidget.ui:74 msgctxt "frontWidget|" msgid "Perform" msgstr "UdfУИr" # This part of search-criteria phrase. Normally the phrase reads something # like "Buying of cars in finland" and this word is the 2nd word in that # phrase. #: frontWidget.ui:97 msgctxt "frontWidget|" msgid "of" msgstr "af" # This part of search-criteria phrase. Normally the phrase reads something # like "Buying of cars in finland" and this word is the 4th word in that # phrase. #: frontWidget.ui:113 msgctxt "frontWidget|" msgid "in" msgstr "i" # Button text for button used to search for classified ads. This button has # text "perform" just next to it so user sees actually 2 words "perform # search" where the "perform" is in separate label above the button, and then # is the text of this button. #: frontWidget.ui:123 msgctxt "frontWidget|" msgid "Search" msgstr "SУИg" # Tab title text in front widget for tab that shows details of operators own # profile (==personal details) #: frontWidget.ui:161 msgctxt "frontWidget|" msgid "My profile" msgstr "Min profil" # Text field label in "operators profile" tab. The field in questions shows # SHA1-digest e.g. the real address of the operator. #: frontWidget.ui:177 frontWidget.ui:937 msgctxt "frontWidget|" msgid "Profile address" msgstr "Profiladresse" # Text field label in "operators profile" tab. The field in questions shows # nickname of the operator #: frontWidget.ui:208 frontWidget.ui:643 msgctxt "frontWidget|" msgid "Nickname" msgstr "Әgenavn" # Text field label in "operators profile" tab. The field in questions shows # "hello world" text of the operator. #: frontWidget.ui:225 frontWidget.ui:669 msgctxt "frontWidget|" msgid "Greeting text" msgstr "Velkomsttekst" # Tooltip-text of a text field in "operators profile" tab. The field in # questions shows greeting text of the operator. #: frontWidget.ui:232 msgctxt "frontWidget|" msgid "For the rest of the world. " msgstr "For resten af verdenen. " # Text field label in "operators profile" tab. The field in questions shows # given name (first name) of the operator. #: frontWidget.ui:239 frontWidget.ui:695 msgctxt "frontWidget|" msgid "First name" msgstr "Fornavn" # Text field label in "operators profile" tab. The field in questions shows # family name of the operator #: frontWidget.ui:253 frontWidget.ui:715 msgctxt "frontWidget|" msgid "Family name" msgstr "Familienavn" # Text field label in "operators profile" tab. The field in questions shows # place of residence of the operator #: frontWidget.ui:263 msgctxt "frontWidget|" msgid "City/country" msgstr "By/land" # Text field label in "operators profile" tab. The field in questions shows # address of bitcoin wallet of the operator. #: frontWidget.ui:273 msgctxt "frontWidget|" msgid "BTC address" msgstr "BTC-adresse" # Tooltip-text for a text field "operators profile" tab. The field in # questions shows address of bitcoin wallet of the operator. #: frontWidget.ui:280 msgctxt "frontWidget|" msgid "If you wish to receive payments via BTC, include your BTC address too." msgstr "" "Hvis du УИnsker at modtage betalinger via BTC, sУЅ inkluder ogsУЅ din BTC-" "adresse." # Text field label in "operators profile" tab. The field in questions shows # what the user has to say about state of the world. #: frontWidget.ui:287 frontWidget.ui:799 msgctxt "frontWidget|" msgid "State of the world" msgstr "Verdens tilstand" # Tool-tip text of a field in "operators profile" tab. The field in questions # shows what operator has to say about state of the world. #: frontWidget.ui:294 msgctxt "frontWidget|" msgid "Longer explanation about state of the world" msgstr "LУІngere forklaring om verdens tilstand" # Checkbox text in "my profile" tab. The checkbox is question is a toggle for # public/private status of the profile. When checkbox is checked, the profile # will be made private. #: frontWidget.ui:301 msgctxt "frontWidget|" msgid "Profile is private" msgstr "Profil er privat" # Button text inside "My profile" tab. Clicking the button opens a dialog that # prompts user to select list of operators that can read his profile that he # has previously marked as private (e.g. accessible only to listed readers) #: frontWidget.ui:308 msgctxt "frontWidget|" msgid "Readers of profile" msgstr "LУІsere af profil" # Explanation text inside "my profile" tab. #: frontWidget.ui:315 msgctxt "frontWidget|" msgid "None of the fields is mandatory" msgstr "Ingen af felterne er krУІvet" # Text field label inside "my profile" tab. The field whose label this is # shows the time when profile was last updated. #: frontWidget.ui:322 msgctxt "frontWidget|" msgid "Time of last update" msgstr "Tidspunkt for sidste opdatering" # Button text for button inside "my profile" tab. By clicking this button user # makes her edits known to rest of the world. #: frontWidget.ui:342 msgctxt "frontWidget|" msgid "Publish" msgstr "OffentliggУИr" # Button text for button inside "my profile" tab. By clicking this button user # discards her edits. #: frontWidget.ui:355 msgctxt "frontWidget|" msgid "Revert changes" msgstr "Fortryd УІndringer" # Text label on top of "my profile" tab. Below this label is a list of text # fields and other stuff that user may edit regarding herself. #: frontWidget.ui:369 msgctxt "frontWidget|" msgid "Details of operator profile:" msgstr "Detaljer for operatУИrprofil:" # Text in image-placeholder inside "my profile" tab. When user has not # selected any image for her profile details, this text is shown in place of # the image. Clicking on text gives user option to select the image file for # profile. #: frontWidget.ui:401 msgctxt "frontWidget|" msgid "" "\n" "\n" "Click \n" "to \n" "Add\n" "Image" msgstr "" "\n" "\n" "Klik \n" "for \n" "at\n" "tilfУИje\n" "billede" # Title text inside "my profile" tab. Title text is for a list of files that # user is currently sharing with other users. #: frontWidget.ui:425 frontWidget.ui:845 msgctxt "frontWidget|" msgid "Shared files" msgstr "Delte filer" # Title text inside "my profile" tab. Title text is for a list of comments # made by other users regarding operators profile. #: frontWidget.ui:461 frontWidget.ui:897 msgctxt "frontWidget|" msgid "Latest comments" msgstr "Seneste kommentarer" # Tab title text. When this tab is opened, user is shown a view of his # frequent contacts. #: frontWidget.ui:504 msgctxt "frontWidget|" msgid "Contacts" msgstr "Kontakter" # Button text inside "contacts" tab. Clicking this button opens a dialog # prompting user to enter details of operator to be added into contact list #: frontWidget.ui:536 msgctxt "frontWidget|" msgid "Add contact" msgstr "TilfУИj kontakt" # Button text inside "contacts" tab. Clicking this button removes a contact # from list. #: frontWidget.ui:543 msgctxt "frontWidget|" msgid "Remove contact" msgstr "Fjern kontakt" # Button text inside "contacts" tab. Clicking this button displays details of # the selected contact. #: frontWidget.ui:550 msgctxt "frontWidget|" msgid "View profile" msgstr "Vis profil" # Button text inside "contacts" tab. Clicking this button opens a dialog # prompting user to send a message selected contact. #: frontWidget.ui:557 msgctxt "frontWidget|" msgid "Send message" msgstr "Send besked" # Tab text in front widget. When user selects this tab, he is presented with # list of his private correspondence. #: frontWidget.ui:569 msgctxt "frontWidget|" msgid "Private messages" msgstr "Private beskeder" # Tab text in front widget. This tab shows details of some other operator of # classified ads. Normally this text is replaced with nickname of the operator # but if nothing like this is available, this text may be shown, this is the # "default text". #: frontWidget.ui:624 msgctxt "frontWidget|" msgid "Profile details" msgstr "Profildetaljer" # Label text of a text-field. The text-field in question shows place of # residence of operator whose details are on display. #: frontWidget.ui:741 msgctxt "frontWidget|" msgid "City/Country" msgstr "By/land" # Label text of a text-field. The text-field in question shows bitcoin wallet # address of operator whose details are on display. #: frontWidget.ui:767 msgctxt "frontWidget|" msgid "BTC Addr" msgstr "BTC-adresse" # Text for image-placeholder inside "profile details" tab. When some # particular operator has not selected any image for her profile, this text is # shown in place of the image. Note html format. #: frontWidget.ui:829 msgctxt "frontWidget|" msgid "" "




No

Image

Inserted

" msgstr "" "




Intet

billede

indsat

" # Button text inside "defails of operator profile" tab. When the button is # clicked, a new-message editor is opened. #: frontWidget.ui:874 msgctxt "frontWidget|" msgid "Send message to operator" msgstr "Send besked til operatУИr" #: frontWidget.ui:879 msgctxt "frontWidget|" msgid "Audio call" msgstr "" # Button text inside "defails of operator profile" tab. When the button is # clicked, dialog listing readers of the (private) profile. #: frontWidget.ui:884 msgctxt "frontWidget|" msgid "View readers" msgstr "Vis lУІsere" # Button text inside "defails of operator profile" tab. When the button is # clicked, a dialog is opened, dialog prompts user to enter a comment about # the operator. #: frontWidget.ui:932 msgctxt "frontWidget|" msgid "Comment" msgstr "Kommentar" # Button text inside "defails of operator profile" tab. When the button is # clicked, the operator whose data is on display is added into contact-list. #: frontWidget.ui:964 msgctxt "frontWidget|" msgid "Add to contacts" msgstr "TilfУИj til kontakter" # Dialog title text. Dialog is for adding a link to text being edited. #: ui/insertLink.ui:26 msgctxt "insertLinkDialog|" msgid "Insert link" msgstr "IndsУІt henvisning" # Label for a combobox-field inside "insert link" dialog. Next to this label # is set of fields that together make up a valid URL to be inserted. #: ui/insertLink.ui:39 msgctxt "insertLinkDialog|" msgid "URL" msgstr "Adresse" # Label for a text-field inside "insert link" dialog. Next to this label is # field where user is supposed the text that will be shown as the link. # Consider
the text then "the text" is text that user is # prompted to enter with this label. #: ui/insertLink.ui:112 msgctxt "insertLinkDialog|" msgid "Link label in text" msgstr "LУІnk etiket i tekst" # Dialog title text. Dialog prompts user to manually add a network-connection # to another node in the network. #: ui/manualConnectionDialog.ui:26 msgctxt "manualConnectionDialog|" msgid "Manually add node to connection queue" msgstr "TilfУИj manuelt knude til forbindelseskУИ" # Label text of numeric field. The numeric (input) field is TCP port of the # remote node that will be connected. #: ui/manualConnectionDialog.ui:48 msgctxt "manualConnectionDialog|" msgid "Remote node listen port" msgstr "Ekstern knudes lytteport" # Label for text field inside "manually add connection" dialog. Text field # whose label this is requires user to type in network address (ip addr or dns # name) of the remote node. #: ui/manualConnectionDialog.ui:78 msgctxt "manualConnectionDialog|" msgid "Remote node network address" msgstr "Ekstern knudes netvУІrksadresse" # Tooltip text for a text field inside "manually add connection" dialog. The # text field whose tooltip this is the remote network address input field. #: ui/manualConnectionDialog.ui:91 msgctxt "manualConnectionDialog|" msgid "IPv4, IPv6 or DNS name" msgstr "IPv4-, IPv6- eller DNS-navn" # Dialog title text for dialog that requires user to enter information about # file to be shared with others. Metadata query dialog in practice. #: ui/metadataQuery.ui:26 msgctxt "metadataQuery|" msgid "File information" msgstr "Filinformation" # Label text for a input field. The input field whose label this is asks for # file name (filesystem file name) #: ui/metadataQuery.ui:60 msgctxt "metadataQuery|" msgid "Name of the file:" msgstr "Filens navn:" # Label text for a input field. The input field whose label this is asks for # owner of the file contents. This may be copyright holder, depending on # contracts and legislation followed. #: ui/metadataQuery.ui:81 msgctxt "metadataQuery|" msgid "Owner of file (name or SHA1 if CA operator):" msgstr "Filens ejer (navn eller SHA1 hvis CA-operatУИr):" # Label text for a input field. The input field whose label this is asks for # license under which the file may be used. Combobox lists some pre-filled # options like GPL,BSD,CC-BY etc. but user may also enter any text into field. #: ui/metadataQuery.ui:111 msgctxt "metadataQuery|" msgid "License of use:" msgstr "Licens:" # Combobox content text for license selection combobox. License texts might be # wise leave as they are - untranslated #: ui/metadataQuery.ui:122 msgctxt "metadataQuery|" msgid "Public domain" msgstr "Offentlig domУІne" # Combobox content text for license selection combobox. License texts might be # wise leave as they are - untranslated #: ui/metadataQuery.ui:127 msgctxt "metadataQuery|" msgid "GPL" msgstr "GPL" # Combobox content text for license selection combobox. License texts might be # wise leave as they are - untranslated #: ui/metadataQuery.ui:132 msgctxt "metadataQuery|" msgid "LGPL" msgstr "LGPL" # Combobox content text for license selection combobox. License texts might be # wise leave as they are - untranslated #: ui/metadataQuery.ui:137 msgctxt "metadataQuery|" msgid "BSD" msgstr "BSD" # Combobox content text for license selection combobox. License texts might be # wise leave as they are - untranslated #: ui/metadataQuery.ui:142 msgctxt "metadataQuery|" msgid "CC-BY" msgstr "CC-BY" # Combobox content text for license selection combobox. License texts might be # wise leave as they are - untranslated #: ui/metadataQuery.ui:147 msgctxt "metadataQuery|" msgid "CC-BY-SA" msgstr "CC-BY-SA" # Combobox content text for license selection combobox. License texts might be # wise leave as they are - untranslated #: ui/metadataQuery.ui:152 msgctxt "metadataQuery|" msgid "CC-BY-ND" msgstr "CC-BY-ND" # Combobox content text for license selection combobox. License texts might be # wise leave as they are - untranslated #: ui/metadataQuery.ui:157 msgctxt "metadataQuery|" msgid "CC-BY-NC" msgstr "CC-BY-NC" # Combobox content text for license selection combobox. License texts might be # wise leave as they are - untranslated #: ui/metadataQuery.ui:162 msgctxt "metadataQuery|" msgid "CC-BY-NC-SA" msgstr "CC-BY-NC-SA" # Combobox content text for license selection combobox. License texts might be # wise leave as they are - untranslated #: ui/metadataQuery.ui:167 msgctxt "metadataQuery|" msgid "CC-BY-NC-ND" msgstr "CC-BY-NC-ND" # Label text for a input field. The input field whose label this is asks for # mime-type of the field about to be published. #: ui/metadataQuery.ui:182 msgctxt "metadataQuery|" msgid "Mime-type:" msgstr "Mime-type:" # Label text for a input field. The input field whose label this is asks for # descriptive text about file about to be published. #: ui/metadataQuery.ui:199 msgctxt "metadataQuery|" msgid "Description of file:" msgstr "Filens beskrivelse:" # Prompt text on top of "metadata query" dialog. Below this label is set of # input-fields that make up the meta-data of a file to be published. #: ui/metadataQuery.ui:218 msgctxt "metadataQuery|" msgid "Enter information regarding file before publish:" msgstr "Indtast information om filen fУИr udgivelse:" # Dialog title text for a dialog that offers possibility to post a new # classified ad for others to read. #: ui/newClassifiedAd.ui:26 msgctxt "newCaDialog|" msgid "Post a new classified ad" msgstr "Indsend en ny rubrikannonce" # This label text is part of sentence, whole sentence goes for example "About # buying of cars in sweden" where the words "bying", "cars", and "sweden" are # combo-boxes that user may choose from ; this word here is the first word in # that sentece. #: ui/newClassifiedAd.ui:47 msgctxt "newCaDialog|" msgid "About" msgstr "Om" # This label text is part of sentence, whole sentence goes for example "About # buying of cars in sweden" where the words "bying", "cars", and "sweden" are # combo-boxes that user may choose from ; this word here is the 3rd word in # that sentece. #: ui/newClassifiedAd.ui:65 msgctxt "newCaDialog|" msgid "of" msgstr "af" # This label text is part of sentence, whole sentence goes for example "About # buying of cars in sweden" where the words "bying", "cars", and "sweden" are # combo-boxes that user may choose from ; this word here is the 5th word in # that sentece. #: ui/newClassifiedAd.ui:81 msgctxt "newCaDialog|" msgid "in" msgstr "i" # Label text of a text field inside "post a new classified ad" dialog. The # input field whose label this is, requires user to enter a subject (topic) # for her posting. #: ui/newClassifiedAd.ui:95 msgctxt "newCaDialog|" msgid "Subject" msgstr "Emne" # Label text of a text field inside "post a new classified ad" dialog. The # input field whose label this is, will show name file that is attached to the # post. #: ui/newClassifiedAd.ui:129 msgctxt "newCaDialog|" msgid "Attachment: " msgstr "VedhУІftelse: " # Push-button text inside "post a new classified ad" dialog. When user hits # the button, another dialog is opened and user is required to select a file # to be attached. #: ui/newClassifiedAd.ui:149 msgctxt "newCaDialog|" msgid "Add" msgstr "TilfУИj" # Dialog title text for dialog that prompts user to edit+send a private # message to another operator #: ui/newPrivMsg.ui:26 msgctxt "newPrivMsgDialog|" msgid "Send a private message" msgstr "Send en privat besked" # Text field label for input field inside "compose a new private message # dialog". The text field in question is "subject" or "topic" field of the # message. #: ui/newPrivMsg.ui:39 msgctxt "newPrivMsgDialog|" msgid "Subject" msgstr "Emne" # Text field label for input field inside "compose a new private message # dialog". The text field in question is SHA1 address of the recipient. #: ui/newPrivMsg.ui:53 msgctxt "newPrivMsgDialog|" msgid "Recipient" msgstr "Modtager" # Label text of a text field inside "compose a new private message" dialog. # The input field whose label this is, will show name file that is attached to # the post. #: ui/newPrivMsg.ui:83 msgctxt "newPrivMsgDialog|" msgid "Attachments: " msgstr "VedhУІftninger: " # Push-button text inside "compose a new private message" dialog. When user # hits the button, another dialog is opened and user is required to select a # file to be attached. #: ui/newPrivMsg.ui:103 msgctxt "newPrivMsgDialog|" msgid "Attach" msgstr "VedhУІft" # Dialog title text for dialog that prompts user to edit+send a comment # regarding another operator. #: ui/newProfileComment.ui:26 msgctxt "newProfileCommentDialog|" msgid "Comment a operators profile" msgstr "Lav en kommentar til en operatУИrs profil" # Text field label for input field inside "compose a comment about operator # dialog". The text field in question is "subject" or "topic" field of the # comment. #: ui/newProfileComment.ui:39 msgctxt "newProfileCommentDialog|" msgid "Subject" msgstr "Emne" # Text field label for input field inside "compose a comment about operator # dialog". The text field in question is SHA1 digest (address) of the operator # being commented. #: ui/newProfileComment.ui:53 msgctxt "newProfileCommentDialog|" msgid "Commented profile" msgstr "Kommenteret profil" # Label text of a text field inside "compose a comment about operator dialog" # dialog. The input field whose label this is, will show name file that is # attached to the post. #: ui/newProfileComment.ui:89 msgctxt "newProfileCommentDialog|" msgid "Attachments:" msgstr "VedhУІftninger:" # Push-button text inside "compose a comment about operator dialog" dialog. # When user hits the button, another dialog is opened and user is required to # select a file to be attached. #: ui/newProfileComment.ui:109 msgctxt "newProfileCommentDialog|" msgid "Attach" msgstr "VedhУІft" # Dialog title text for a dialog that prompts user to edit+publish a text # document. #: ui/newTextDocument.ui:26 msgctxt "newTextDocumentDialog|" msgid "Edit and publish a new text document" msgstr "Rediger og udgiv et nyt tekstdokument" # Text field label for input field inside "compose a new text document" # dialog. The text field in question is "subject" or "topic" field of the text # document. #: ui/newTextDocument.ui:39 msgctxt "newTextDocumentDialog|" msgid "Document title" msgstr "Dokumenttitel" # Label text of a text field inside "edit+publish a new text document dialog" # dialog. The input field whose label this is, will show name file that is # attached to the document. #: ui/newTextDocument.ui:75 msgctxt "newTextDocumentDialog|" msgid "Attachments:" msgstr "VedhУІftninger:" # Push-button text inside "edit+publish a new text document dialog" dialog. # When user hits the button, another dialog is opened and user is required to # select a file to be attached. #: ui/newTextDocument.ui:95 msgctxt "newTextDocumentDialog|" msgid "Attach" msgstr "VedhУІft" # Dialog title text for dialog that will show a listing of previous comments # regarding operator (user himself or some other operator, it is the same # dialog in both cases) #: ui/profileCommentDisplay.ui:26 msgctxt "profileCommentDisplay|" msgid "Comments regarding operator" msgstr "Kommentarer om operatУИr" # Dialog title text for a dialog that prompts user to choose operators who # will be able to read details, comments and shared files of his profile. #: ui/profileReadersDialog.ui:26 msgctxt "profileReadersDialog|" msgid "Profile readers list" msgstr "Liste med profillУІsere" # Text field label inside "add profiles to list of readers" dialog. The text # field whose prompt this is asks for search-words to be used to filter # operator names/addresses from database. #: ui/profileReadersDialog.ui:37 msgctxt "profileReadersDialog|" msgid "Search for profiles to add" msgstr "SУИg efter profiler at tilfУИje" # Text field label inside "add profiles to list of readers" dialog. The text # listing-field whose explanation this is will list operators whose # nickname,name or other search-term matches conditions entered by user. #: ui/profileReadersDialog.ui:44 msgctxt "profileReadersDialog|" msgid "First 100 matching profiles:" msgstr "FУИrste 100 matchende profiler:" # Push-button label inside "add profiles to list of readers" dialog. When user # hits this button, operators that are selected from neighboring list will be # added to list of readers of operators profile. #: ui/profileReadersDialog.ui:66 msgctxt "profileReadersDialog|" msgid "Add selected to list of readers" msgstr "TilfУИj valgte til listen med lУІsere" # Text field label inside "add profiles to list of readers" dialog. The text # listing-field whose explanation this is shows current list operators # profiles readers. #: ui/profileReadersDialog.ui:73 msgctxt "profileReadersDialog|" msgid "Current list of readers" msgstr "NuvУІrende liste med lУІsere" # Push button label inside dialog that asks for list of operators who are # readers of operators own profile. When user this this button, the dialog is # dismissed. #: ui/profileReadersDialog.ui:90 msgctxt "profileReadersDialog|" msgid "Close" msgstr "Luk" # Push button label inside dialog that asks for list of operators who are # readers of operators own profile. When user this this button, selected # operators are removed from the list. #: ui/profileReadersDialog.ui:109 msgctxt "profileReadersDialog|" msgid "Remove selected" msgstr "Fjern valgte" # Dialog title-text for a search dialog. #: ui/searchDisplay.ui:26 msgctxt "searchDisplay|" msgid "Search data storage" msgstr "SУИg datalager" # Label text of a text field inside "search" dialog. The text field in # question requires user to enter one or more words that are then searched # from all available (public) documents. #: ui/searchDisplay.ui:60 msgctxt "searchDisplay|" msgid "Words:" msgstr "Ord:" # Push button label inside "search" dialog. When button is hit, search using # given words is performed. #: ui/searchDisplay.ui:70 msgctxt "searchDisplay|" msgid "Search" msgstr "SУИg" # Check-box label inside "search" dialog. When box is checked, the search is # done also in neighboring nodes in the network, not only in local storage. #: ui/searchDisplay.ui:87 msgctxt "searchDisplay|" msgid "Network search" msgstr "NetvУІrkssУИgning" # Check-box label inside "search" dialog. When box is checked, the search may # include classified ads in its resultset. #: ui/searchDisplay.ui:101 msgctxt "searchDisplay|" msgid "Search ads" msgstr "SУИg i annoncer" # Check-box label inside "search" dialog. When box is checked, the search may # include operator profiles in its resultset. #: ui/searchDisplay.ui:111 msgctxt "searchDisplay|" msgid "Search profiles" msgstr "SУИg i profiler" # Check-box label inside "search" dialog. When box is checked, the search may # include profile commetns in its resultset. #: ui/searchDisplay.ui:121 msgctxt "searchDisplay|" msgid "Search comments" msgstr "SУИg i kommentarer" # Dialog title text for "settings" dialog. #: ui/settingsDialog.ui:26 msgctxt "settingsDialog|" msgid "Node settings" msgstr "Knudeindstillinger" # Text field label for input field inside "settings" dialog. The numerical # input field whose label this is has TCP port number of the node. #: ui/settingsDialog.ui:39 msgctxt "settingsDialog|" msgid "TCP listen port" msgstr "TCP-lytteport" # Tooltip-text for input field inside "settings" dialog. The numerical input # field whose label this is has TCP port number of the node. #: ui/settingsDialog.ui:58 msgctxt "settingsDialog|" msgid "Incoming TCP listen port. Change requires node restart. " msgstr "IndgУЅende TCP-lytteport. У†ndring krУІver knudegenstart. " # Text field label for input field inside "settings" dialog. The textual input # field whose label this is requires user to enter DNS-name of the node (or # leave it empty, if no name is assigned) #: ui/settingsDialog.ui:84 msgctxt "settingsDialog|" msgid "DNS name of node" msgstr "DNS-navn pУЅ knuden" # Tooltip-text for input field inside "settings" dialog. The textual input # field whose label this is requires user to enter DNS-name of the node (or # leave it empty, if no name is assigned) #: ui/settingsDialog.ui:91 msgctxt "settingsDialog|" msgid "" "If you have permanent DNS name for your machine, you may type it here to be " "used to reference your node" msgstr "" "Hvis du har et permanent DNS-navn for din maskine, sУЅ kan du indtaste det " "her for brug som reference for din knude" # Text label inside "settings" dialog. Under this label is set of numerical # input fields that user may use to adjust the amount of items he wishes to # keep in his local storage. #: ui/settingsDialog.ui:103 msgctxt "settingsDialog|" msgid "Data store limits:" msgstr "DatalagerbegrУІnsning:" # Text field label for input field inside "settings" dialog. The numerical # input field whose label this is has maximum number of operator profiles to # keep in storage. #: ui/settingsDialog.ui:115 msgctxt "settingsDialog|" msgid "Nr of profiles to keep" msgstr "Antal profiler at bevare" # Text field label for input field inside "settings" dialog. The numerical # input field whose label this is has maximum number of private messages to # keep in storage. #: ui/settingsDialog.ui:154 msgctxt "settingsDialog|" msgid "Nr of private messages to keep" msgstr "Antal private beskeder at bevare" # Text field label for input field inside "settings" dialog. The numerical # input field whose label this is has maximum number of binary files to keep # in storage. #: ui/settingsDialog.ui:193 msgctxt "settingsDialog|" msgid "Nr of binary blobs to keep" msgstr "Antal af binУІre blob'er at bevare" # Text field label for input field inside "settings" dialog. The numerical # input field whose label this is has maximum number of classified ads to keep # in storage. #: ui/settingsDialog.ui:232 msgctxt "settingsDialog|" msgid "Nr of CAs to keep" msgstr "Antallet af CA'er at bevare" # Tooltip-text for input field inside "settings" dialog. The numerical input # field whose label this is has maximum number of classified ads to keep in # storage. #: ui/settingsDialog.ui:251 msgctxt "settingsDialog|" msgid "" "Number of classified ads to keep in storage, total, including all " "classifications. Oldest referenced will be deleted first." msgstr "" "Antallet af rubrikannoncer i lageret, i alt, inklusive alle " "klassifikationer. Dem med УІldest reference slettes fУИrst." # Text field label for input field inside "settings" dialog. The numerical # input field whose label this is has maximum number of comments regarding # operators to keep in storage. #: ui/settingsDialog.ui:274 msgctxt "settingsDialog|" msgid "Nr of profile comments to keep" msgstr "Antallet af profilkommentarer at bevare" #: ui/settingsDialog.ui:316 msgctxt "settingsDialog|" msgid "Ringtone" msgstr "" #: ui/settingsDialog.ui:324 msgctxt "settingsDialog|" msgid "Bow" msgstr "" #: ui/settingsDialog.ui:329 msgctxt "settingsDialog|" msgid "Electrical" msgstr "" #: ui/settingsDialog.ui:334 msgctxt "settingsDialog|" msgid "Acoustic" msgstr "" #: ui/settingsDialog.ui:339 msgctxt "settingsDialog|" msgid "Beep" msgstr "" #: ui/settingsDialog.ui:344 msgctxt "settingsDialog|" msgid "Silence" msgstr "" #: ui/settingsDialog.ui:356 msgctxt "settingsDialog|" msgid "Accept voice calls" msgstr "" #: ui/settingsDialog.ui:364 msgctxt "settingsDialog|" msgid "All" msgstr "" #: ui/settingsDialog.ui:369 msgctxt "settingsDialog|" msgid "From trusted operators" msgstr "" #: ui/settingsDialog.ui:374 msgctxt "settingsDialog|" msgid "Accept no voice calls" msgstr "" # Dialog title text for a dialog that shows network connectivity details. #: ui/statusDialog.ui:26 msgctxt "statusDialog|" msgid "Network and connection status" msgstr "NetvУІrk- og forbindelsesstatus" # Text field label for display-item inside "network status" dialog. The # display-item shows ipv4-network address of the node. Usually it is (public) # IP addr of the very machine that user is using at the moment. #: ui/statusDialog.ui:48 msgctxt "statusDialog|" msgid "Detected own IPv4" msgstr "Detekterede egen IPv4" # Tooltip-text for display-item inside "network status" dialog. The display- # item shows ipv4-network address of the node. Usually it is (public) IP addr # of the very machine that user is using at the moment. #: ui/statusDialog.ui:61 ui/statusDialog.ui:93 msgctxt "statusDialog|" msgid "" "Should your friend have trouble connecting, give her this address with port " "number" msgstr "" "Har din ven problemer med at forbinde, sУЅ giv vennen denne adresse med " "portnummer" # Text field label for display-item inside "network status" dialog. The # display-item shows IPV6-address of the node. Usually it is (public) IPv6 # addr of the very machine that user is using at the moment. #: ui/statusDialog.ui:74 msgctxt "statusDialog|" msgid "IPv6" msgstr "IPv6" # Text field label for display-item inside "network status" dialog. The # display-item shows listen port of the node. #: ui/statusDialog.ui:113 msgctxt "statusDialog|" msgid "TCP port currently used" msgstr "TCP-port i brug" # Text field label for a list-item inside "network status" dialog. The list- # item shows list of currently connected other nodes in the network. #: ui/statusDialog.ui:151 msgctxt "statusDialog|" msgid "Currently open connections" msgstr "У…bne forbindelser" # Push-button label for button inside "network status" dialog. When button is # hit, another dialog is opened, asking user for details about the remote node # to connect. #: ui/statusDialog.ui:195 msgctxt "statusDialog|" msgid "Manually add connection" msgstr "TilfУИj manuelt en forbindelse" # Push-button label for button inside "network status" dialog. When button is # hit, dialog is dismissed. #: ui/statusDialog.ui:202 msgctxt "statusDialog|" msgid "Close" msgstr "Luk" classified-ads-0.13/po/de.po000066400000000000000000001654551331670245300157020ustar00rootroot00000000000000# Antti JУЄrvinen , 2016. #zanata # FloH. , 2016. #zanata msgid "" msgstr "" "Project-Id-Version: classified-ads 0.10\n" "Report-Msgid-Bugs-To: antti.jarvinen@katiska.org\n" "POT-Creation-Date: 2016-03-14 21:30+0300\n" "PO-Revision-Date: 2016-06-09 11:31-0400\n" "Last-Translator: FloH. \n" "Language-Team: German\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.8.4\n" "X-Language: fi_FI\n" "X-Qt-Contexts: true\n" #: ui/attachmentlistdialog.cpp:60 msgctxt "AttachmentListDialog|" msgid "Save file to disk.." msgstr "Datei speichern" #: ui/attachmentlistdialog.cpp:151 ui/attachmentlistdialog.cpp:153 msgctxt "AttachmentListDialog|" msgid "files" msgstr "Dateien" #: ui/attachmentlistdialog.cpp:155 msgctxt "AttachmentListDialog|" msgid "Choose file name for saving" msgstr "Dateinamen wУЄhlen" #: ui/attachmentlistdialog.cpp:166 msgctxt "AttachmentListDialog|" msgid "Error" msgstr "Fehler" #: ui/attachmentlistdialog.cpp:167 msgctxt "AttachmentListDialog|" msgid "File open error" msgstr "У–ffnen der Datei fehlgeschlagen" #: call/audioplayer.cpp:65 msgctxt "AudioPlayer|" msgid "raw audio format not supported by backend, cannot play audio." msgstr "" "Tondateien kУЖnnen nicht abgespielt werden. Audio format wird nicht " "unterstУМtzt." #: call/audioplayer.cpp:83 msgctxt "AudioPlayer|" msgid "Could not initialize audio player." msgstr "Audio Player konnte nicht initialisiert werden." #: datamodel/binaryfilelistingmodel.cpp:173 msgctxt "BinaryFileListingModel|" msgid "Name or fingerprint of file" msgstr "Name oder Fingerabdruck der Datei" #: datamodel/calistingmodel.cpp:50 datamodel/calistingmodel.cpp:143 msgctxt "CAListingModel|" msgid "Date" msgstr "Datum" #: datamodel/calistingmodel.cpp:51 datamodel/calistingmodel.cpp:142 msgctxt "CAListingModel|" msgid "Subject" msgstr "Betreff" #: datamodel/camodel.cpp:127 msgctxt "ClassifiedAdsModel|" msgid "Buying" msgstr "Kaufen" #: datamodel/camodel.cpp:129 msgctxt "ClassifiedAdsModel|" msgid "Selling" msgstr "Verkaufen" #: datamodel/camodel.cpp:131 msgctxt "ClassifiedAdsModel|" msgid "Giving away" msgstr "Zu verschenken" #: datamodel/camodel.cpp:133 msgctxt "ClassifiedAdsModel|" msgid "Wanting" msgstr "Gesucht" #: datamodel/camodel.cpp:135 msgctxt "ClassifiedAdsModel|" msgid "Renting" msgstr "Mieten" #: datamodel/camodel.cpp:137 msgctxt "ClassifiedAdsModel|" msgid "Announcement" msgstr "AnkУМndigung" #: datamodel/camodel.cpp:210 msgctxt "ClassifiedAdsModel|" msgid "Cars" msgstr "Autos" #: datamodel/camodel.cpp:212 msgctxt "ClassifiedAdsModel|" msgid "Boats" msgstr "Boote" #: datamodel/camodel.cpp:214 msgctxt "ClassifiedAdsModel|" msgid "Bikes" msgstr "FahrrУЄder" #: datamodel/camodel.cpp:216 msgctxt "ClassifiedAdsModel|" msgid "Other vehicles" msgstr "Sonstige Fahrzeuge" #: datamodel/camodel.cpp:218 msgctxt "ClassifiedAdsModel|" msgid "Vehicle parts" msgstr "Fahrzeugteile" #: datamodel/camodel.cpp:220 msgctxt "ClassifiedAdsModel|" msgid "Habitation" msgstr "Wohnen" #: datamodel/camodel.cpp:222 msgctxt "ClassifiedAdsModel|" msgid "Household appliances" msgstr "HaushaltsgerУЄte" #: datamodel/camodel.cpp:224 msgctxt "ClassifiedAdsModel|" msgid "Furniture" msgstr "MУЖbel" #: datamodel/camodel.cpp:226 msgctxt "ClassifiedAdsModel|" msgid "Clothing" msgstr "Kleidung" #: datamodel/camodel.cpp:228 msgctxt "ClassifiedAdsModel|" msgid "Tools" msgstr "Werkzeuge" #: datamodel/camodel.cpp:230 msgctxt "ClassifiedAdsModel|" msgid "Sports" msgstr "Sport" #: datamodel/camodel.cpp:232 msgctxt "ClassifiedAdsModel|" msgid "Music" msgstr "Musik" #: datamodel/camodel.cpp:234 msgctxt "ClassifiedAdsModel|" msgid "Books" msgstr "BУМcher" #: datamodel/camodel.cpp:236 msgctxt "ClassifiedAdsModel|" msgid "Movies" msgstr "Filme" #: datamodel/camodel.cpp:238 msgctxt "ClassifiedAdsModel|" msgid "Animals" msgstr "Tiere" #: datamodel/camodel.cpp:240 msgctxt "ClassifiedAdsModel|" msgid "Electronics" msgstr "Elektronik" #: datamodel/camodel.cpp:242 msgctxt "ClassifiedAdsModel|" msgid "Jobs" msgstr "Jobs" #: datamodel/camodel.cpp:244 msgctxt "ClassifiedAdsModel|" msgid "Transportation" msgstr "BefУЖrderung" #: datamodel/camodel.cpp:246 msgctxt "ClassifiedAdsModel|" msgid "Services" msgstr "Dienstleistungen" #: datamodel/camodel.cpp:248 msgctxt "ClassifiedAdsModel|" msgid "Healthcare" msgstr "Gesundheit" #: datamodel/camodel.cpp:250 msgctxt "ClassifiedAdsModel|" msgid "Foodstuff" msgstr "Lebensmittel" #: datamodel/camodel.cpp:252 msgctxt "ClassifiedAdsModel|" msgid "Software" msgstr "Software" #: datamodel/camodel.cpp:254 msgctxt "ClassifiedAdsModel|" msgid "Events" msgstr "Veranstaltungen" #: datamodel/camodel.cpp:256 msgctxt "ClassifiedAdsModel|" msgid "Education" msgstr "Bildung" #: datamodel/camodel.cpp:258 msgctxt "ClassifiedAdsModel|" msgid "Finance" msgstr "Finanzen" #: datamodel/camodel.cpp:260 msgctxt "ClassifiedAdsModel|" msgid "Jewelry" msgstr "Schmuck" #: datamodel/camodel.cpp:262 msgctxt "ClassifiedAdsModel|" msgid "Religious rituals" msgstr "ReligiУЖse Rituale" #: datamodel/camodel.cpp:264 msgctxt "ClassifiedAdsModel|" msgid "Philosophy" msgstr "Philosophie" #: datamodel/camodel.cpp:908 msgctxt "ClassifiedAdsModel|" msgid "Any country" msgstr "Alle LУЄnder" #: datamodel/connectionlistingmodel.cpp:142 msgctxt "ConnectionListingModel|" msgid "Peer network address" msgstr "Netzwerkadresse d. Partners" #: datamodel/connectionlistingmodel.cpp:145 msgctxt "ConnectionListingModel|" msgid "Inbound connections are those where peer initiated connection" msgstr "Bei eingehende Verbindungen initiiert der Partner die Verbindung" #: datamodel/connectionlistingmodel.cpp:148 msgctxt "ConnectionListingModel|" msgid "Data transferred from peer to your node" msgstr "Daten vom Partner zu ihrem Knotenpunkt УМbertragen" #: datamodel/connectionlistingmodel.cpp:151 msgctxt "ConnectionListingModel|" msgid "Data transferred to peer from your node" msgstr "Daten vom Partner vom Knotenpunkt zu ihrem Partner" #: datamodel/connectionlistingmodel.cpp:154 msgctxt "ConnectionListingModel|" msgid "Time when connection was opened" msgstr "Uhrzeit der Verbindungsherstellung" #: datamodel/connectionlistingmodel.cpp:164 msgctxt "ConnectionListingModel|" msgid "Address" msgstr "Adresse" #: datamodel/connectionlistingmodel.cpp:167 msgctxt "ConnectionListingModel|" msgid "Inbound" msgstr "Eingehend" #: datamodel/connectionlistingmodel.cpp:170 msgctxt "ConnectionListingModel|" msgid "Bytes in" msgstr "Bytes rein" #: datamodel/connectionlistingmodel.cpp:173 msgctxt "ConnectionListingModel|" msgid "Bytes out" msgstr "Bytes raus" #: datamodel/connectionlistingmodel.cpp:176 msgctxt "ConnectionListingModel|" msgid "Open time" msgstr "Uhrzeit der Verbindungsherstullung" #: datamodel/contactlistingmodel.cpp:73 msgctxt "ContactListingModel|" msgid "Yes" msgstr "Ja" #: datamodel/contactlistingmodel.cpp:75 msgctxt "ContactListingModel|" msgid "Unknown" msgstr "Unbekannt" #: datamodel/contactlistingmodel.cpp:98 msgctxt "ContactListingModel|" msgid "Actual network address (SHA1) of the contact" msgstr "Netzwerkadresse (SHA1) des Kontakts" #: datamodel/contactlistingmodel.cpp:101 #, fuzzy msgctxt "ContactListingModel|" msgid "Locally given nickname ; user may set her own nickname himself" msgstr "Lokaler Spitzname. Benutzer kann seinen eigenen Spitznamen wУЄhlen" #: datamodel/contactlistingmodel.cpp:104 msgctxt "ContactListingModel|" msgid "Public statement if this operator to be trusted in transactions" msgstr "" "У–ffentlicher Hinweis ob dieser Benutzer bei Transaktionen als zuverlУЄssig " "gilt." #: datamodel/contactlistingmodel.cpp:114 msgctxt "ContactListingModel|" msgid "Address" msgstr "Adresse" #: datamodel/contactlistingmodel.cpp:117 msgctxt "ContactListingModel|" msgid "Nickname" msgstr "Name" #: datamodel/contactlistingmodel.cpp:120 msgctxt "ContactListingModel|" msgid "Publicly trusted" msgstr "У–ffentlich vertraut" #: datamodel/contentencryptionmodel.cpp:88 msgctxt "ContentEncryptionModel|" msgid "SSL key generation went wrong, calling exit.." msgstr "Generierung des SSL SchlУМssel fehlgeschlagen. Beenden.." #: datamodel/contentencryptionmodel.cpp:96 msgctxt "ContentEncryptionModel|" msgid "x509 cert generation went wrong, calling exit.." msgstr "Generierung des x509 Zertifikats fehlgeschlagen. Beenden.." #: datamodel/contentencryptionmodel.cpp:194 #: datamodel/contentencryptionmodel.cpp:292 msgctxt "ContentEncryptionModel|" msgid "RSA Private key key saving went wrong" msgstr "Speichern des privaten RSA SchlУМssels fehlgeschlagen" #: datamodel/contentencryptionmodel.cpp:639 msgctxt "ContentEncryptionModel|" msgid "No suitable de-cryption key found" msgstr "Kein passender SchlУМssel gefunden." #: controller.cpp:109 msgctxt "Controller|" msgid "Classified ads" msgstr "Kleinanzeigen" #: controller.cpp:141 msgctxt "Controller|" msgid "Enter password for protection of your messages:" msgstr "Passwort zum Schutz der Nachrichten eingeben:" #: controller.cpp:432 msgctxt "Controller|" msgid "Fetching item from network.." msgstr "Lade Objekt" #: controller.cpp:485 msgctxt "Controller|" msgid "E&xit" msgstr "B&eenden" #: controller.cpp:487 msgctxt "Controller|" msgid "Exit the application" msgstr "Anwendung beenden" #: controller.cpp:489 msgctxt "Controller|" msgid "&About" msgstr "Уœ&ber" #: controller.cpp:490 msgctxt "Controller|" msgid "Show the application's About box" msgstr "Zeigt die &Уœber Dialogbox" #: controller.cpp:492 msgctxt "Controller|" msgid "&Change password" msgstr "&Passwort УЄndern" #: controller.cpp:493 msgctxt "Controller|" msgid "Change password of current profile" msgstr "Passwort des aktuellen Benutzerprofils УЄndern" #: controller.cpp:495 msgctxt "Controller|" msgid "Create &new profile" msgstr "&Neues Benutzerprofil erstellen" #: controller.cpp:496 msgctxt "Controller|" msgid "Makes a brand new user profile" msgstr "Erstellt einen neuen Benutzer" #: controller.cpp:498 msgctxt "Controller|" msgid "&Delete current profile" msgstr "&Aktuelles Benutzerprofil lУЖschen" #: controller.cpp:499 msgctxt "Controller|" msgid "Deletes currently open profile" msgstr "LУЖscht aktuell geУЖffnetes Profil" #: controller.cpp:501 msgctxt "Controller|" msgid "&Select another profile" msgstr "Benutzerprofil wechseln" #: controller.cpp:502 msgctxt "Controller|" msgid "If you have multitude of profiles" msgstr "Es besteht eine Vielzahl an Profilen" #: controller.cpp:504 msgctxt "Controller|" msgid "Settings.." msgstr "&Einstellungen" #: controller.cpp:505 msgctxt "Controller|" msgid "Node-wide settings.." msgstr "Netzknoten Einstellungen" #: controller.cpp:507 msgctxt "Controller|" msgid "Network status.." msgstr "Netzwerkstatus" #: controller.cpp:509 msgctxt "Controller|" msgid "Search.." msgstr "Suche..." #: controller.cpp:526 msgctxt "Controller|" msgid "&File" msgstr "&Datei" #: controller.cpp:571 msgctxt "Controller|" msgid "Enter new password:" msgstr "Neues Password eingeben:" #: controller.cpp:599 controller.cpp:708 msgctxt "Controller|" msgid "Activate another profile with password" msgstr "Anderes Profil mit Passwort aktivieren" #: controller.cpp:693 msgctxt "Controller|" msgid "Can't delete only profile." msgstr "Nur das Profil kann nicht gelУЖscht werden" #: controller.cpp:697 msgctxt "Controller|" msgid "Permanently discard profile?" msgstr "Profil dauerhaft lУЖschen?" #: controller.cpp:698 msgctxt "Controller|" msgid "There will be NO way to access content of this profile later" msgstr "Auf Inhalte des Profils kann spУЄter NICHT mehr zugegriffen werden" #: controller.cpp:761 msgctxt "Controller|" msgid "Cant load node cert or key cert" msgstr "" "Netzknoten-Zertifikate oder SchlУМsselzertifikat konnte nicht geladen werden" #: controller.cpp:766 msgctxt "Controller|" msgid "File error" msgstr "Dateifehler" #: controller.cpp:771 msgctxt "Controller|" msgid "Database error" msgstr "Datenbankfehler" #: controller.cpp:777 controller.cpp:787 msgctxt "Controller|" msgid "Cryptographic module" msgstr "Kryptographiemodul" #: controller.cpp:782 msgctxt "Controller|" msgid "Database module" msgstr "Datenbankmodul" #: controller.cpp:788 msgctxt "Controller|" msgid "Bad password" msgstr "Falsches Passwort" #: controller.cpp:1004 msgctxt "Controller|" msgid "Could not find item from network.." msgstr "Objekt nicht gefunden" #: controller.cpp:1117 msgctxt "Controller|" msgid "SHA1: " msgstr "SHA1:" #: controller.cpp:1122 msgctxt "Controller|" msgid "Mime-Type: " msgstr "MIME-Typ:" #: controller.cpp:1128 msgctxt "Controller|" msgid "Description: " msgstr "Beschreibung:" #: controller.cpp:1134 msgctxt "Controller|" msgid "Publisher: " msgstr "Verbreiter:" #: controller.cpp:1140 msgctxt "Controller|" msgid "Content owner: " msgstr "EigentУМmer des Inhalts" #: controller.cpp:1146 msgctxt "Controller|" msgid "License: " msgstr "Lizenz:" #: controller.cpp:1152 msgctxt "Controller|" msgid "Name: " msgstr "Name:" #: controller.cpp:1159 msgctxt "Controller|" msgid "Date: " msgstr "Datum:" #: ui/dialogbase.cpp:47 ui/dialogbase.cpp:101 msgctxt "DialogBase|" msgid "File way too big" msgstr "Datei ist viel zu groУŸ" #: ui/dialogbase.cpp:55 ui/dialogbase.cpp:109 msgctxt "DialogBase|" msgid "File too big" msgstr "Datei ist zu groУŸ" #: ui/dialogbase.cpp:85 ui/dialogbase.cpp:131 msgctxt "DialogBase|" msgid "File open error" msgstr "У–ffnen der Datei fehlgeschlagen" #: ui/dialogbase.cpp:94 msgctxt "DialogBase|" msgid "Select file to be published" msgstr "Zu verУЖffentlichende Datei auswУЄhlen" #: ui/dialogbase.cpp:96 msgctxt "DialogBase|" msgid "Files (*.*)" msgstr "Dateien (*.*)" #: ui/editcontact.cpp:72 msgctxt "EditContactDialog|" msgid "Error" msgstr "Fehler" #: ui/editcontact.cpp:73 msgctxt "EditContactDialog|" msgid "Operator addr is not valid" msgstr "Betreiberdresse nicht gУМltig" #: FrontWidget.cpp:95 msgctxt "FrontWidget|" msgid "Classified ads" msgstr "Kleinanzeigen" #: FrontWidget.cpp:96 msgctxt "FrontWidget|" msgid "My profile" msgstr "Mein Profil" #: FrontWidget.cpp:97 msgctxt "FrontWidget|" msgid "Contacts" msgstr "Kontakte" #: FrontWidget.cpp:98 msgctxt "FrontWidget|" msgid "Private messages" msgstr "Private Nachricht" #: FrontWidget.cpp:160 msgctxt "FrontWidget|" msgid "Add shared file.." msgstr "У–ffentliche Datei hinzufУМgen" #: FrontWidget.cpp:161 msgctxt "FrontWidget|" msgid "Stop advertising selected shared file" msgstr "" #: FrontWidget.cpp:162 msgctxt "FrontWidget|" msgid "Save file to disk.." msgstr "Datei speichern" #: FrontWidget.cpp:163 msgctxt "FrontWidget|" msgid "View file information.." msgstr "Dateiinformationen ansehen" #: FrontWidget.cpp:164 msgctxt "FrontWidget|" msgid "Copy file address (SHA1) to clipboard.." msgstr "Dateiort (SHA1) in Zwischenablage kopieren" #: FrontWidget.cpp:165 msgctxt "FrontWidget|" msgid "Edit+publish new text document.." msgstr "Neues Textdokument bearbeiten und verУЖffentlichen" #: FrontWidget.cpp:353 msgctxt "FrontWidget|" msgid "Open File" msgstr "Datei УЖffnen" #: FrontWidget.cpp:355 FrontWidget.cpp:885 msgctxt "FrontWidget|" msgid "Files (*.*)" msgstr "Dateien (*.*)" #: FrontWidget.cpp:359 FrontWidget.cpp:1185 FrontWidget.cpp:1328 msgctxt "FrontWidget|" msgid "Error" msgstr "Fehler" #: FrontWidget.cpp:360 msgctxt "FrontWidget|" msgid "Can't load image" msgstr "Bild kann nicht geladen werden" #: FrontWidget.cpp:626 FrontWidget.cpp:766 msgctxt "FrontWidget|" msgid "Profile not in database" msgstr "Profil nicht in Datenbank gefunden" #: FrontWidget.cpp:627 FrontWidget.cpp:767 msgctxt "FrontWidget|" msgid "Try viewing profile first to obtain data" msgstr "" #: FrontWidget.cpp:883 msgctxt "FrontWidget|" msgid "Select file to be published" msgstr "Zu verУЖffentlichende Datei auswУЄhlen" #: FrontWidget.cpp:890 msgctxt "FrontWidget|" msgid "File way too big" msgstr "Datei viel zu groУŸ" #: FrontWidget.cpp:898 msgctxt "FrontWidget|" msgid "File too big" msgstr "Datei zu groУŸ" #: FrontWidget.cpp:942 FrontWidget.cpp:1186 msgctxt "FrontWidget|" msgid "File open error" msgstr "У–ffnen der Datei fehlgeschlagen" #: FrontWidget.cpp:1167 FrontWidget.cpp:1173 msgctxt "FrontWidget|" msgid "files" msgstr "Dateien" #: FrontWidget.cpp:1176 msgctxt "FrontWidget|" msgid "Choose file name for saving" msgstr "Dateinamen wУЄhlen" #: FrontWidget.cpp:1236 msgctxt "FrontWidget|" msgid "" "\n" "\n" "\n" "Click\n" "To\n" "Add\n" "Image\n" msgstr "" "\n" "\n" "\n" "Klicken\n" "Um\n" "Bild\n" "hinzuzufУМgen\n" #: FrontWidget.cpp:1329 msgctxt "FrontWidget|" msgid "Article not found from local storage" msgstr "Artikel nicht in lokaler Datenbank gefunden" #: FrontWidget.cpp:1355 FrontWidget.cpp:1903 #, qt-format msgctxt "FrontWidget|" msgid "" "Trusted by %1\n" "SHA1 %2" msgstr "" "Vertrauen durch %1\n" "SHA1 %2" #: FrontWidget.cpp:1392 msgctxt "FrontWidget|" msgid "Time of last update " msgstr "Datum der letzten Aktualisierung" #: FrontWidget.cpp:1400 msgctxt "FrontWidget|" msgid "" "\n" "\n" "\n" "(No\n" "Image\n" "Selected)\n" msgstr "" "\n" "\n" "\n" "(Kein\n" "Bild\n" "ausgewУЄhlt)\n" #: FrontWidget.cpp:1494 msgctxt "FrontWidget|" msgid "Edit contact.." msgstr "Kontakt bearbeiten" #: FrontWidget.cpp:1534 msgctxt "FrontWidget|" msgid "&Reply to sender" msgstr "Antworte Ab&sender" #: FrontWidget.cpp:1535 msgctxt "FrontWidget|" msgid "Reply to &forum" msgstr "Antworte &Forum" #: FrontWidget.cpp:1536 msgctxt "FrontWidget|" msgid "&Post new ad" msgstr "&Verfasse neue Anzeige" #: FrontWidget.cpp:1537 msgctxt "FrontWidget|" msgid "&Public comment" msgstr "У–&ffentliches Kommentar" #: FrontWidget.cpp:1538 msgctxt "FrontWidget|" msgid "&View profile" msgstr "&Profil betrachten" #: FrontWidget.cpp:1539 FrontWidget.cpp:1677 msgctxt "FrontWidget|" msgid "Attachments.." msgstr "AnhУЄnge.." #: FrontWidget.cpp:1599 msgctxt "FrontWidget|" msgid "Add selected operator to contacts.." msgstr "AusgewУЄhlten Benutzer zu Kontakten hinzufУМgen" #: FrontWidget.cpp:1673 msgctxt "FrontWidget|" msgid "&Reply" msgstr "&Anworten" #: FrontWidget.cpp:1674 msgctxt "FrontWidget|" msgid "&New message" msgstr "&Neue Nachricht" #: FrontWidget.cpp:1675 msgctxt "FrontWidget|" msgid "&Send public comment to sender" msgstr "&Sende УЖffentlichen Kommentar zum Absender" #: FrontWidget.cpp:1676 msgctxt "FrontWidget|" msgid "&View profile of peer" msgstr "Profil &ansehen" #: FrontWidget.cpp:1711 msgctxt "FrontWidget|" msgid "Add selected to contacts.." msgstr "AusgewУЄhlte zu Kontakten hinzufУМgen" #: FrontWidget.cpp:1913 FrontWidget.cpp:1915 FrontWidget.cpp:1979 #: FrontWidget.cpp:1981 msgctxt "FrontWidget|" msgid "From:" msgstr "Von:" #: FrontWidget.cpp:1917 FrontWidget.cpp:1984 msgctxt "FrontWidget|" msgid "Subject:" msgstr "Betreff:" #: FrontWidget.cpp:1976 msgctxt "FrontWidget|" msgid "To:" msgstr "An:" #: FrontWidget.cpp:2288 msgctxt "FrontWidget|" msgid "Invalid SHA1 in URL" msgstr "UngУМltiges SHA1 in der URL" #: FrontWidget.cpp:2315 msgctxt "FrontWidget|" msgid "Invalid URL" msgstr "UngУМltiger URL" #: ui/insertlinkdialog.cpp:69 msgctxt "InsertLinkDialog|" msgid "Invalid URL" msgstr "UngУМltiger URL" #: ui/manualconnection.cpp:53 msgctxt "ManualConnectionDialog|" msgid "DNS lookup failure" msgstr "DNS Fehler" #: ui/newprivmsgdialog.cpp:88 ui/newprivmsgdialog.cpp:138 msgctxt "NewPrivMessageDialog|" msgid "Error" msgstr "Fehler" #: ui/newprivmsgdialog.cpp:89 msgctxt "NewPrivMessageDialog|" msgid "Recipient addr is not valid" msgstr "EmpfУЄngeradresse ungУМltig" #: ui/newprivmsgdialog.cpp:139 msgctxt "NewPrivMessageDialog|" msgid "Recipient encryption key not found from storage" msgstr "SchlУМssel des EmpfУЄngers nicht gefunden" #: ui/newprofilecommentdialog.cpp:89 ui/newprofilecommentdialog.cpp:126 msgctxt "NewProfileCommentDialog|" msgid "Error" msgstr "Fehler" #: ui/newprofilecommentdialog.cpp:90 msgctxt "NewProfileCommentDialog|" msgid "Commented profile addr is not valid" msgstr "Kommentiertes Benutzerprofil ist nicht gУМltig" #: ui/newprofilecommentdialog.cpp:127 msgctxt "NewProfileCommentDialog|" msgid "Recipient encryption key not found from storage" msgstr "SchlУМssel des EmpfУЄngers nicht gefunden" #: datamodel/nodemodel.cpp:115 msgctxt "NodeModel|" msgid "SSL key generation went wrong, calling exit.." msgstr "Generierung des SSL SchlУМssel fehlgeschlagen. Beenden.." #: datamodel/nodemodel.cpp:123 msgctxt "NodeModel|" msgid "x509 cert generation went wrong, calling exit.." msgstr "Generierung des x509 Zertifikats fehlgeschlagen. Beenden.." #: datamodel/nodemodel.cpp:1596 msgctxt "NodeModel|" msgid "Cant load SSL cert" msgstr "SSL Zertifikat kann nicht geladen werden" #: datamodel/nodemodel.cpp:1626 msgctxt "NodeModel|" msgid "Cant load SSL key" msgstr "SSL SchlУМssel kann nicht geladen werden" #: ui/passwd_dialog.cpp:104 msgctxt "PasswdDialog|" msgid "Min length 5 (use 10+)" msgstr "Minimale LУЄnge 5 (Benutze 10+)" #: ui/passwordDialog.ui:14 msgctxt "PasswordDialog|" msgid "Password required" msgstr "Passwort benУЖtigt" #: ui/passwordDialog.ui:17 msgctxt "PasswordDialog|" msgid "" "Should you forget this word, there is no easy way to recover any of your " "content" msgstr "" "Wenn Sie diese Passphrase vergessen, gibt es keinen einfachen Weg auf ihre " "Inhalte zuzugreifen" #: ui/passwordDialog.ui:29 msgctxt "PasswordDialog|" msgid "Enter password for protection of your messages" msgstr "Bitte Passwort zum Schutz der Nachrichten eingeben" #: ui/passwordDialog.ui:42 msgctxt "PasswordDialog|" msgid "" "If you forget this word, there is no simple way to recover your contents" msgstr "" "Wenn Sie diese Passphrase vergessen, kУЖnnen Sie nicht mehr auf Ihre Inhalte " "zugreifen" #: ui/passwordDialog.ui:55 msgctxt "PasswordDialog|" msgid "OK" msgstr "OK" #: datamodel/privmsgsearchmodel.cpp:110 #, qt-format msgctxt "PrivateMessageSearchModel|" msgid "" "%1\n" "Trusted by %2" msgstr "" "%1\n" "Vertrauen von %2" #: datamodel/privmsgsearchmodel.cpp:237 msgctxt "PrivateMessageSearchModel|" msgid "Direction of message, sent/received" msgstr "Richtung der Nachricht, gesendet/empfangen" #: datamodel/privmsgsearchmodel.cpp:247 msgctxt "PrivateMessageSearchModel|" msgid "Dir" msgstr "Verzeichnis" #: datamodel/privmsgsearchmodel.cpp:250 msgctxt "PrivateMessageSearchModel|" msgid "Peer" msgstr "Partner" #: datamodel/privmsgsearchmodel.cpp:253 msgctxt "PrivateMessageSearchModel|" msgid "Time" msgstr "Zeit" #: datamodel/privmsgsearchmodel.cpp:256 msgctxt "PrivateMessageSearchModel|" msgid "Subject" msgstr "Betreff" #: ui/profilecommentdisplay.cpp:54 msgctxt "ProfileCommentDisplay|" msgid "&Add comment..." msgstr "&Kommentar hinzufУМgen" #: ui/profilecommentdisplay.cpp:65 msgctxt "ProfileCommentDisplay|" msgid "Save attachment to disk.." msgstr "Anhang speichern" #: ui/profilecommentdisplay.cpp:92 msgctxt "ProfileCommentDisplay|" msgid "Error" msgstr "Fehler" #: ui/profilecommentdisplay.cpp:93 msgctxt "ProfileCommentDisplay|" msgid "Article not found from local storage" msgstr "Artikel nicht in lokaler Datenbank gefunden" #: ui/profilecommentitemdelegate.cpp:93 msgctxt "ProfileCommentItemDelegate|" msgid "Attachments: " msgstr "AnhУЄnge:" #: datamodel/profilecommentlistingmodel.cpp:219 msgctxt "ProfileCommentListingModel|" msgid "Sender" msgstr "Absender" #: datamodel/profilecommentlistingmodel.cpp:222 msgctxt "ProfileCommentListingModel|" msgid "Time" msgstr "Zeit" #: datamodel/profilecommentlistingmodel.cpp:225 msgctxt "ProfileCommentListingModel|" msgid "Subject" msgstr "Betreff" #: datamodel/profilecommentmodel.cpp:67 msgctxt "ProfileCommentModel|" msgid "Profile related to comment not found from database" msgstr "" "Mit Kommentar verbundenes Profil konnte in der Datenbank nicht gefunden " "werden" #: ui/profilereadersdialog.cpp:73 msgctxt "ProfileReadersDialog|" msgid "View profile" msgstr "Profil ansehen" #: datamodel/profilereaderslistingmodel.cpp:174 msgctxt "ProfileReadersListingModel|" msgid "Name or fingerprint of reader" msgstr "Name oder Fingerabdruck des Lesers" #: call/ringtoneplayer.cpp:77 msgctxt "RingtonePlayer|" msgid "raw audio format not supported by backend, cannot play audio." msgstr "" "Tondateien kУЖnnen nicht abgespielt werden. raw-Audioformat wird nicht " "unterstУМtzt." #: call/ringtoneplayer.cpp:93 msgctxt "RingtonePlayer|" msgid "Could not initialize audio player." msgstr "Audio Player konnte nicht initialisiert werden." #: ui/searchdisplay.cpp:62 msgctxt "SearchDisplay|" msgid "Open.." msgstr "У–ffnen.." #: textedit/textedit.cpp:127 msgctxt "TextEdit|" msgid "Help" msgstr "Hilfe" #: textedit/textedit.cpp:129 msgctxt "TextEdit|" msgid "About &Qt" msgstr "Уœber &Qt" #: textedit/textedit.cpp:186 msgctxt "TextEdit|" msgid "Edit Actions" msgstr "Aktionen bearbeiten" #: textedit/textedit.cpp:188 msgctxt "TextEdit|" msgid "&File" msgstr "&File" #: textedit/textedit.cpp:194 msgctxt "TextEdit|" msgid "&Open..." msgstr "&Open..." #: textedit/textedit.cpp:203 msgctxt "TextEdit|" msgid "&Save locally before send" msgstr "&Save lokal vor Senden" #: textedit/textedit.cpp:210 msgctxt "TextEdit|" msgid "Save locally &As..." msgstr "Speichern unter &As..." #: textedit/textedit.cpp:218 msgctxt "TextEdit|" msgid "&Print..." msgstr "&Drucken" #: textedit/textedit.cpp:226 msgctxt "TextEdit|" msgid "Print Preview..." msgstr "Druckvorschau" #: textedit/textedit.cpp:231 msgctxt "TextEdit|" msgid "&Export PDF..." msgstr "Als PDF e&xportieren" #: textedit/textedit.cpp:244 msgctxt "TextEdit|" msgid "&Edit" msgstr "&Bearbeiten" #: textedit/textedit.cpp:249 msgctxt "TextEdit|" msgid "&Undo" msgstr "&RУМckgУЄngig" #: textedit/textedit.cpp:254 msgctxt "TextEdit|" msgid "&Redo" msgstr "&Wiederholen" #: textedit/textedit.cpp:261 msgctxt "TextEdit|" msgid "Cu&t" msgstr "&Ausschneiden" #: textedit/textedit.cpp:267 msgctxt "TextEdit|" msgid "&Copy" msgstr "&Kopieren" #: textedit/textedit.cpp:273 msgctxt "TextEdit|" msgid "&Paste" msgstr "&EinfУМgen" #: textedit/textedit.cpp:283 msgctxt "TextEdit|" msgid "Insert link" msgstr "Link einfУМgen" #: textedit/textedit.cpp:287 msgctxt "TextEdit|" msgid "Embed image" msgstr "Bild einbetten" #: textedit/textedit.cpp:294 msgctxt "TextEdit|" msgid "F&ormat" msgstr "F&ormat" #: textedit/textedit.cpp:298 msgctxt "TextEdit|" msgid "&Bold" msgstr "&Fett" #: textedit/textedit.cpp:310 msgctxt "TextEdit|" msgid "&Italic" msgstr "Kurs&iv" #: textedit/textedit.cpp:322 msgctxt "TextEdit|" msgid "&Underline" msgstr "&Unterstrichen" #: textedit/textedit.cpp:341 textedit/textedit.cpp:347 msgctxt "TextEdit|" msgid "&Left" msgstr "&LinksbУМndig" #: textedit/textedit.cpp:342 textedit/textedit.cpp:346 msgctxt "TextEdit|" msgid "C&enter" msgstr "&Zentriert" #: textedit/textedit.cpp:343 textedit/textedit.cpp:345 msgctxt "TextEdit|" msgid "&Right" msgstr "&RechtsbУМndig" #: textedit/textedit.cpp:349 msgctxt "TextEdit|" msgid "&Justify" msgstr "&Blocksatz" #: textedit/textedit.cpp:376 msgctxt "TextEdit|" msgid "&Color..." msgstr "Farbe" #: textedit/textedit.cpp:383 msgctxt "TextEdit|" msgid "Standard" msgstr "Standard" #: textedit/textedit.cpp:384 #, fuzzy msgctxt "TextEdit|" msgid "Bullet List (Disc)" msgstr "AufzУЄhlungsliste (Punkt)" #: textedit/textedit.cpp:385 #, fuzzy msgctxt "TextEdit|" msgid "Bullet List (Circle)" msgstr "AufzУЄhlungsliste (Kreis)" #: textedit/textedit.cpp:386 msgctxt "TextEdit|" msgid "Bullet List (Square)" msgstr "AufzУЄhlungsliste (Quadrat)" #: textedit/textedit.cpp:387 msgctxt "TextEdit|" msgid "Ordered List (Decimal)" msgstr "Nummerierte Liste (Dezimal)" #: textedit/textedit.cpp:388 msgctxt "TextEdit|" msgid "Ordered List (Alpha lower)" msgstr "Nummerierte Liste ( a, b, c , ...)" #: textedit/textedit.cpp:389 msgctxt "TextEdit|" msgid "Ordered List (Alpha upper)" msgstr "Nummerierte Liste ( A, B, C, ...)" #: textedit/textedit.cpp:390 msgctxt "TextEdit|" msgid "Ordered List (Roman lower)" msgstr "Nummerierte Liste (i, ii, iii, ...)" #: textedit/textedit.cpp:391 msgctxt "TextEdit|" msgid "Ordered List (Roman upper)" msgstr "Nummerierte Liste (I, II, III, ...)" #: textedit/textedit.cpp:442 msgctxt "TextEdit|" msgid "Application" msgstr "Anwendung" #: textedit/textedit.cpp:443 msgctxt "TextEdit|" msgid "" "The document has been modified.\n" "Do you want to save your changes?" msgstr "Dokument wurde geУЄndert. У„nderungen speichern?" #: textedit/textedit.cpp:467 msgctxt "TextEdit|" msgid "Open File..." msgstr "Datei УЖffnen" #: textedit/textedit.cpp:468 msgctxt "TextEdit|" msgid "HTML-Files (*.htm *.html);;All Files (*)" msgstr "HTML-Dateien (*.htm *.html);;Alle Dateien (*)" #: textedit/textedit.cpp:485 msgctxt "TextEdit|" msgid "Save as..." msgstr "Speichern unter..." #: textedit/textedit.cpp:486 msgctxt "TextEdit|" msgid "ODF files (*.odt);;HTML-Files (*.htm *.html);;All Files (*)" msgstr "ODF Dateien (*.odt);;HTML-Dateien (*.htm *.html);;Alle Dateien (*)" #: textedit/textedit.cpp:501 msgctxt "TextEdit|" msgid "Print Document" msgstr "Datei drucken" #: textedit/textedit.cpp:559 msgctxt "TextEdit|" msgid "Open File" msgstr "Datei УЖffnen" #: textedit/textedit.cpp:561 msgctxt "TextEdit|" msgid "Files (*.*)" msgstr "Dateien (*.*)" #: textedit/textedit.cpp:566 msgctxt "TextEdit|" msgid "Error" msgstr "Fehler" #: textedit/textedit.cpp:567 msgctxt "TextEdit|" msgid "Can't load image" msgstr "Bild kann nicht geladen werden" #: textedit/textedit.cpp:621 textedit/textedit.cpp:631 msgctxt "TextEdit|" msgid "File way too big" msgstr "Datei ist viel zu groУŸ" #: net/voicecallengine.cpp:525 msgctxt "VoiceCallEngine|" msgid "Accept" msgstr "Annehmen" #: net/voicecallengine.cpp:533 msgctxt "VoiceCallEngine|" msgid "Reject" msgstr "Ablehnen" #: net/voicecallengine.cpp:535 msgctxt "VoiceCallEngine|" msgid "Close" msgstr "SchlieУŸen" #: net/voicecallengine.cpp:551 msgctxt "VoiceCallEngine|" msgid "Actual network address (SHA1) of the peer operator" msgstr "Netzwerkadresse des (SHA1) des Peers" #: net/voicecallengine.cpp:554 msgctxt "VoiceCallEngine|" msgid "Network address of the remote node" msgstr "Netzwerkadresse des entfernten Netzknotens" #: net/voicecallengine.cpp:564 msgctxt "VoiceCallEngine|" msgid "Operator" msgstr "Benutzer" #: net/voicecallengine.cpp:567 msgctxt "VoiceCallEngine|" msgid "Node address" msgstr "Adresse des Netzwerkknotens" #: net/voicecallengine.cpp:570 msgctxt "VoiceCallEngine|" msgid "Call status" msgstr "Anruf-Status" #: net/voicecallengine.cpp:573 msgctxt "VoiceCallEngine|" msgid "Controls" msgstr "Steuerung" #: net/voicecallengine.cpp:576 msgctxt "VoiceCallEngine|" msgid "Ending" msgstr "Beenden" #: net/voicecallengine.cpp:613 msgctxt "VoiceCallEngine|" msgid "Initializing" msgstr "Initialisierung" #: net/voicecallengine.cpp:616 msgctxt "VoiceCallEngine|" msgid "Incoming" msgstr "Eingehend" #: net/voicecallengine.cpp:619 msgctxt "VoiceCallEngine|" msgid "Open" msgstr "У–ffnen" #: net/voicecallengine.cpp:622 msgctxt "VoiceCallEngine|" msgid "Closing" msgstr "SchlieУŸen" #: net/voicecallengine.cpp:625 msgctxt "VoiceCallEngine|" msgid "Closed" msgstr "Geschlossen" #: net/voicecallengine.cpp:628 msgctxt "VoiceCallEngine|" msgid "Error" msgstr "Fehler" #: net/voicecallengine.cpp:631 msgctxt "VoiceCallEngine|" msgid "No call" msgstr "Kein Anruf" #: net/voicecallengine.cpp:834 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible" msgstr "Sprachanruf nicht mУЖglich" #: net/voicecallengine.cpp:840 msgctxt "VoiceCallEngine|" msgid "Audio call is possible" msgstr "Sprachanruf mУЖglich" #: net/voicecallengine.cpp:847 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator address unknown" msgstr "Sprachanruf nicht mУЖglich: Unbekannte Benutzeradresse" #: net/voicecallengine.cpp:853 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator profile not found" msgstr "Sprachanruf nicht mУЖglich: Benutzerprofil nicht gefunden" #: net/voicecallengine.cpp:856 #, fuzzy msgctxt "VoiceCallEngine|" msgid "" "Audio call is not possible: operator has no node information in profile" msgstr "" "Sprachanruf nicht moeglich. Nutzer hat keine Netzknoten-Information in " "seinem Profil" #: net/voicecallengine.cpp:875 #, qt-format msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operators IPv4 address %1 not connected" msgstr "" "Sprachanruf nicht mУЖglich: Benutzer ist nicht mit einer IPv4 Adresse %1 " "verbunden" #: net/voicecallengine.cpp:882 #, qt-format msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operators IPv6 address %1 not connected" msgstr "" "Sprachanruf nicht mУЖglich: Benutzer ist nicht mit einer IPv6 Adresse %1 " "verbunden" #: net/voicecallengine.cpp:893 msgctxt "VoiceCallEngine|" msgid "" "Audio call is not possible: local node has no IPv6 address, operator has " "only IPv6 addr" msgstr "" "Sprachanruf nicht mУЖglich: Lokaler Knoten besitzt kein IPv6 Adresse, der " "Benutzer hingegen ausschlieУŸlich eine IPv6 Adresse." #: net/voicecallengine.cpp:895 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator does not publish network address" msgstr "" "Sprachanruf nicht mУЖglich: Benutzer verУЖffentlicht seine Netzwerkadresse " "nicht" #: ui/aboutDialog.ui:26 msgctxt "aboutDialog|" msgid "About classified ads" msgstr "Уœber Classified Ads - Kleinanzeigen" #: ui/aboutDialog.ui:100 msgctxt "aboutDialog|" msgid " Classified ads is a program for online communications" msgstr "Kleinanzeigen ist ein Programm zur Online-Kommunikation" #: ui/aboutDialog.ui:163 #, fuzzy msgctxt "aboutDialog|" msgid "" "

Classified ads is free software. You may use, copy and" " modify it if you follow the conditions given in GNU lesser general public " "license version 2.1.

Classified ads is copyright ТЉ Antti JУЄrvinen " "2013.

Main feature of the program is an "advertisement" - a" " piece of text belonging to selected classification. There are several pre-" "programmed classifications and operators are encouraged to invent new " "classifications for new purposes ; the selection boxes in classification-" "selection tab are editable. Other operators may then view the ads, publicly " "comment the ads, the operators and also send private messages to each " "others.

Another important feature of classified ads is that it is " "designed to be operated without any centralized server infrastructure - it " "is you and other operators whose computers store and transmit all the " "content visible inside classified ads. To get connected you need to know " "address of at least one existing computer (a node) so if your network connection dialog shows no " "connections, you may need to contact someone you know is using the software " "and ask for address of her node to make initial contact with the network. " "Once connected the software should maintain list of addresses of other " "nodes.

Due to its server-less design the whole system works best if " "you leave the program running always when you have your computer powered on " "; while processing other operators requests it will hog some computing " "resources and generate network traffic also when you are not actively using " "the program yourself - others are.

Operators concerned about privacy " "of the content should be aware of following items:

- Data storage " "implementation is variant of distributed" " hash table, practically meaning that content posted by you gets " "copied some more-or-less random nodes in the network.

- Any data item" " (ad, comment, binary file, private message etc.) is digitally signed. This " "makes it more difficult to try to pose as another operator.

- " "Operators are reliably identified only by the SHA1 hash of their generated " "encryption keys. SHA1 hash is displayed when viewing details of operator " "profiles. Other identifying information like nickname or city name are " "entered by operator himself and can be anything. The operator profile, as it" " is published to the network, is also signed with the encryption keys of the" " operator - if you identify an operator by her SHA1 hash, you have a " "mechanism for identifying if any content inside classified ads is posted by " "this operator or not. Classified ads internally checks for digital " "signatures, throwing away content that fails signature check and tries to " "provide SHA1 hash of the operator who posted the content.

- All " "classified ads are posted as plain text, no encryption is used. All public " "profiles are posted as plain text, no encryption is used. If profile is made" " private, it is encrypted to be readable only by selected other profiles. " "This applies also to binary files shared by operators private profiles and " "comments about private profiles after the profile was made private " "(previously plain-text comments or files don't get magically encrypted " "afterwards). Private messages are encrypted always to be readable only by " "recipient and sender. Attachments follow the privacy rules of the document, " "they're attached to.

- As is the case with all internet-" "communications, this small fact is true for classified ads too : once something gets posted online, there is no" " way to remove it from network.

- Data encryption " "implementation for content is OpenSSL, relying mostly on algorithms RSA-2048" " and AES-256.

- While connections between nodes are implemented using" " SSL, other nodes inside network do get to know what content is being " "transmitted in neighboring nodes. While there is no central point for easily" " collecting this information about particular classification or operator, " "operators still should expect no privacy regarding their doings online, " "although some effort has been been put into hiding contents of private messages and private profiles. " "

Programming was (mostly) done by Antti JУЄrvinen, artwork by Meeri " "JУЄrvinen.

This product includes software developed by the OpenSSL " "Project for use in the OpenSSL Toolkit " "(http://www.openssl.org/).

Happy " "advertising!


" msgstr "" "

Classified ads is free software. You may use, copy and" " modify it if you follow the conditions given in GNU lesser general public " "license version 2.1.

Classified ads is copyright ТЉ Antti JУЄrvinen " "2013.

Main feature of the program is an "advertisement" - a" " piece of text belonging to selected classification. There are several pre-" "programmed classifications and operators are encouraged to invent new " "classifications for new purposes ; the selection boxes in classification-" "selection tab are editable. Other operators may then view the ads, publicly " "comment the ads, the operators and also send private messages to each " "others.

Another important feature of classified ads is that it is " "designed to be operated without any centralized server infrastructure - it " "is you and other operators whose computers store and transmit all the " "content visible inside classified ads. To get connected you need to know " "address of at least one existing computer (a node) so if your network connection dialog shows no " "connections, you may need to contact someone you know is using the software " "and ask for address of her node to make initial contact with the network. " "Once connected the software should maintain list of addresses of other " "nodes.

Due to its server-less design the whole system works best if " "you leave the program running always when you have your computer powered on " "; while processing other operators requests it will hog some computing " "resources and generate network traffic also when you are not actively using " "the program yourself - others are.

Operators concerned about privacy " "of the content should be aware of following items:

- Data storage " "implementation is variant of distributed" " hash table, practically meaning that content posted by you gets " "copied some more-or-less random nodes in the network.

- Any data item" " (ad, comment, binary file, private message etc.) is digitally signed. This " "makes it more difficult to try to pose as another operator.

- " "Operators are reliably identified only by the SHA1 hash of their generated " "encryption keys. SHA1 hash is displayed when viewing details of operator " "profiles. Other identifying information like nickname or city name are " "entered by operator himself and can be anything. The operator profile, as it" " is published to the network, is also signed with the encryption keys of the" " operator - if you identify an operator by her SHA1 hash, you have a " "mechanism for identifying if any content inside classified ads is posted by " "this operator or not. Classified ads internally checks for digital " "signatures, throwing away content that fails signature check and tries to " "provide SHA1 hash of the operator who posted the content.

- All " "classified ads are posted as plain text, no encryption is used. All public " "profiles are posted as plain text, no encryption is used. If profile is made" " private, it is encrypted to be readable only by selected other profiles. " "This applies also to binary files shared by operators private profiles and " "comments about private profiles after the profile was made private " "(previously plain-text comments or files don't get magically encrypted " "afterwards). Private messages are encrypted always to be readable only by " "recipient and sender. Attachments follow the privacy rules of the document, " "they're attached to.

- As is the case with all internet-" "communications, this small fact is true for classified ads too : once something gets posted online, there is no" " way to remove it from network.

- Data encryption " "implementation for content is OpenSSL, relying mostly on algorithms RSA-2048" " and AES-256.

- While connections between nodes are implemented using" " SSL, other nodes inside network do get to know what content is being " "transmitted in neighboring nodes. While there is no central point for easily" " collecting this information about particular classification or operator, " "operators still should expect no privacy regarding their doings online, " "although some effort has been been put into hiding contents of private messages and private profiles. " "

Programming was (mostly) done by Antti JУЄrvinen, artwork by Meeri " "JУЄrvinen.

This product includes software developed by the OpenSSL " "Project for use in the OpenSSL Toolkit " "(http://www.openssl.org/).

Happy " "advertising!


" #: ui/attachmentListDialog.ui:26 msgctxt "attachmentListDialog|" msgid "List of attached files" msgstr "Liste der angehУЄngten Dateien" #: ui/callStatusDialog.ui:26 msgctxt "callStatusDialog|" msgid "Call status" msgstr "Anrufstatus" #: ui/callStatusDialog.ui:49 msgctxt "callStatusDialog|" msgid "Input level" msgstr "Eingangspegel" #: ui/callStatusDialog.ui:65 msgctxt "callStatusDialog|" msgid "Audio calls" msgstr "Sprachanrufe" #: ui/callStatusDialog.ui:90 msgctxt "callStatusDialog|" msgid "Output level" msgstr "LautstУЄrke" #: ui/editContact.ui:26 msgctxt "editContactDialog|" msgid "Edit a contact" msgstr "Einen Kontakt bearbeiten" #: ui/editContact.ui:39 msgctxt "editContactDialog|" msgid "Address (SHA1) of contact" msgstr "Adresse (SHA1) des Kontakts" #: ui/editContact.ui:53 msgctxt "editContactDialog|" msgid "Local nickname" msgstr "Lokaler Nick" #: ui/editContact.ui:65 #, fuzzy msgctxt "editContactDialog|" msgid "" "

Settings some trusted is public information to readers" " of your profile

" msgstr "" "

Jemandem das Vertrauen aussprechen ist eine УЖffentlich" " Information die Betrachter ihres Profils einsehen kУЖnnen

" #: ui/editContact.ui:68 #, fuzzy msgctxt "editContactDialog|" msgid "This contact is to be publicly trusted in transactions" msgstr "Dieser Benutzer gilt als zuverlУЄssig bei Transaktionen" #: frontWidget.ui:14 msgctxt "frontWidget|" msgid "Form" msgstr "Formular" #: frontWidget.ui:39 msgctxt "frontWidget|" msgid "Classified ads" msgstr "Kleinanzeigen" #: frontWidget.ui:67 msgctxt "frontWidget|" msgid "Search for classified ads about" msgstr "Suche Kleinanzeigen in folgenden Kategorien" #: frontWidget.ui:74 msgctxt "frontWidget|" msgid "Perform" msgstr "AusfУМhren" #: frontWidget.ui:97 msgctxt "frontWidget|" msgid "of" msgstr "von" #: frontWidget.ui:113 msgctxt "frontWidget|" msgid "in" msgstr "in" #: frontWidget.ui:123 msgctxt "frontWidget|" msgid "Search" msgstr "Suche" #: frontWidget.ui:161 msgctxt "frontWidget|" msgid "My profile" msgstr "Mein Profil" #: frontWidget.ui:177 frontWidget.ui:937 msgctxt "frontWidget|" msgid "Profile address" msgstr "Profiladresse" #: frontWidget.ui:208 frontWidget.ui:643 msgctxt "frontWidget|" msgid "Nickname" msgstr "Spitzname" #: frontWidget.ui:225 frontWidget.ui:669 msgctxt "frontWidget|" msgid "Greeting text" msgstr "BegrУМУŸungstext" #: frontWidget.ui:232 msgctxt "frontWidget|" msgid "For the rest of the world. " msgstr "FУМr den Rest der Welt" #: frontWidget.ui:239 frontWidget.ui:695 msgctxt "frontWidget|" msgid "First name" msgstr "Vorname" #: frontWidget.ui:253 frontWidget.ui:715 msgctxt "frontWidget|" msgid "Family name" msgstr "Nachname" #: frontWidget.ui:263 msgctxt "frontWidget|" msgid "City/country" msgstr "Stadt/Land" #: frontWidget.ui:273 msgctxt "frontWidget|" msgid "BTC address" msgstr "Bitcoin-Adresse" #: frontWidget.ui:280 msgctxt "frontWidget|" msgid "If you wish to receive payments via BTC, include your BTC address too." msgstr "" "Wenn Sie Zahlungen per Bitcoin erhalten wollen, bitte auch die Bitcoin-" "Adresse eintragen" #: frontWidget.ui:287 frontWidget.ui:799 msgctxt "frontWidget|" msgid "State of the world" msgstr "Zustand der Welt" #: frontWidget.ui:294 msgctxt "frontWidget|" msgid "Longer explanation about state of the world" msgstr "AusfУМhrlichere ErklУЄrung УМber den Zustand der Welt" #: frontWidget.ui:301 msgctxt "frontWidget|" msgid "Profile is private" msgstr "nichtУЖffentliches Profil" #: frontWidget.ui:308 msgctxt "frontWidget|" msgid "Readers of profile" msgstr "Betrachter des Profils" #: frontWidget.ui:315 msgctxt "frontWidget|" msgid "None of the fields is mandatory" msgstr "Keines der Felder ist verpflichtend" #: frontWidget.ui:322 msgctxt "frontWidget|" msgid "Time of last update" msgstr "Datum der letzten Aktualisierung" #: frontWidget.ui:342 msgctxt "frontWidget|" msgid "Publish" msgstr "VerУЖffentlichen" #: frontWidget.ui:355 msgctxt "frontWidget|" msgid "Revert changes" msgstr "У„nderungen zurУМcksetzen" #: frontWidget.ui:369 msgctxt "frontWidget|" msgid "Details of operator profile:" msgstr "Benutzerprofil-Details" #: frontWidget.ui:401 msgctxt "frontWidget|" msgid "" "\n" "\n" "Click \n" "to \n" "Add\n" "Image" msgstr "" "\n" "\n" "Klicken\n" "um\n" "Bild\n" "hinzuzufУМgen" #: frontWidget.ui:425 frontWidget.ui:845 msgctxt "frontWidget|" msgid "Shared files" msgstr "Freigaben" #: frontWidget.ui:461 frontWidget.ui:897 msgctxt "frontWidget|" msgid "Latest comments" msgstr "Neueste Kommentare" #: frontWidget.ui:504 msgctxt "frontWidget|" msgid "Contacts" msgstr "Kontakte" #: frontWidget.ui:536 msgctxt "frontWidget|" msgid "Add contact" msgstr "Kontakt hinzufУМgen" #: frontWidget.ui:543 msgctxt "frontWidget|" msgid "Remove contact" msgstr "Kontakt entfernen" #: frontWidget.ui:550 msgctxt "frontWidget|" msgid "View profile" msgstr "Profil anzeigen" #: frontWidget.ui:557 msgctxt "frontWidget|" msgid "Send message" msgstr "Nachricht senden" #: frontWidget.ui:569 msgctxt "frontWidget|" msgid "Private messages" msgstr "Private Nachricht" #: frontWidget.ui:624 msgctxt "frontWidget|" msgid "Profile details" msgstr "Profil details" #: frontWidget.ui:741 msgctxt "frontWidget|" msgid "City/Country" msgstr "Stadt/Land" #: frontWidget.ui:767 msgctxt "frontWidget|" msgid "BTC Addr" msgstr "Bitcoin-Adresse" #: frontWidget.ui:829 msgctxt "frontWidget|" msgid "" "




No

Image

Inserted

" msgstr "" "




No

Image

Inserted

" #: frontWidget.ui:874 msgctxt "frontWidget|" msgid "Send message to operator" msgstr "Nachricht an Benutzer senden" #: frontWidget.ui:879 msgctxt "frontWidget|" msgid "Audio call" msgstr "Sprachanruf" #: frontWidget.ui:884 msgctxt "frontWidget|" msgid "View readers" msgstr "Betrachter ansehen" #: frontWidget.ui:932 msgctxt "frontWidget|" msgid "Comment" msgstr "Kommentar" #: frontWidget.ui:964 msgctxt "frontWidget|" msgid "Add to contacts" msgstr "Zu Kontakten hinzufУМgen" #: ui/insertLink.ui:26 msgctxt "insertLinkDialog|" msgid "Insert link" msgstr "Link einfУМgen" #: ui/insertLink.ui:39 msgctxt "insertLinkDialog|" msgid "URL" msgstr "URL" #: ui/insertLink.ui:112 msgctxt "insertLinkDialog|" msgid "Link label in text" msgstr "" #: ui/manualConnectionDialog.ui:26 msgctxt "manualConnectionDialog|" msgid "Manually add node to connection queue" msgstr "Netzknoten manuell zur Liste hinzufУМgen" #: ui/manualConnectionDialog.ui:48 msgctxt "manualConnectionDialog|" msgid "Remote node listen port" msgstr "" #: ui/manualConnectionDialog.ui:78 msgctxt "manualConnectionDialog|" msgid "Remote node network address" msgstr "Entfernte Netzwerkknoten-Adresse" #: ui/manualConnectionDialog.ui:91 msgctxt "manualConnectionDialog|" msgid "IPv4, IPv6 or DNS name" msgstr "IPv4, IPv6 oder DNS Name" #: ui/metadataQuery.ui:26 msgctxt "metadataQuery|" msgid "File information" msgstr "Dateiinformationen" #: ui/metadataQuery.ui:60 msgctxt "metadataQuery|" msgid "Name of the file:" msgstr "Dateiname" #: ui/metadataQuery.ui:81 msgctxt "metadataQuery|" msgid "Owner of file (name or SHA1 if CA operator):" msgstr "" #: ui/metadataQuery.ui:111 msgctxt "metadataQuery|" msgid "License of use:" msgstr "Lizenz:" #: ui/metadataQuery.ui:122 msgctxt "metadataQuery|" msgid "Public domain" msgstr "" #: ui/metadataQuery.ui:127 msgctxt "metadataQuery|" msgid "GPL" msgstr "GPL" #: ui/metadataQuery.ui:132 msgctxt "metadataQuery|" msgid "LGPL" msgstr "LGPL" #: ui/metadataQuery.ui:137 msgctxt "metadataQuery|" msgid "BSD" msgstr "BSD" #: ui/metadataQuery.ui:142 msgctxt "metadataQuery|" msgid "CC-BY" msgstr "CC-BY" #: ui/metadataQuery.ui:147 msgctxt "metadataQuery|" msgid "CC-BY-SA" msgstr "CC-BY-SA" #: ui/metadataQuery.ui:152 msgctxt "metadataQuery|" msgid "CC-BY-ND" msgstr "CC-BY-ND" #: ui/metadataQuery.ui:157 msgctxt "metadataQuery|" msgid "CC-BY-NC" msgstr "CC-BY-NC" #: ui/metadataQuery.ui:162 msgctxt "metadataQuery|" msgid "CC-BY-NC-SA" msgstr "CC-BY-NC-SA" #: ui/metadataQuery.ui:167 msgctxt "metadataQuery|" msgid "CC-BY-NC-ND" msgstr "CC-BY-NC-ND" #: ui/metadataQuery.ui:182 msgctxt "metadataQuery|" msgid "Mime-type:" msgstr "MIME-Typ:" #: ui/metadataQuery.ui:199 msgctxt "metadataQuery|" msgid "Description of file:" msgstr "Dateibeschreibung" #: ui/metadataQuery.ui:218 msgctxt "metadataQuery|" msgid "Enter information regarding file before publish:" msgstr "Vor der VerУЖffentlichung bitte Informationen zur Datei angeben" #: ui/newClassifiedAd.ui:26 msgctxt "newCaDialog|" msgid "Post a new classified ad" msgstr "Neue Anzeige verfassen" #: ui/newClassifiedAd.ui:47 msgctxt "newCaDialog|" msgid "About" msgstr "Уœber" #: ui/newClassifiedAd.ui:65 msgctxt "newCaDialog|" msgid "of" msgstr "von" #: ui/newClassifiedAd.ui:81 msgctxt "newCaDialog|" msgid "in" msgstr "in" #: ui/newClassifiedAd.ui:95 msgctxt "newCaDialog|" msgid "Subject" msgstr "Betreff" #: ui/newClassifiedAd.ui:129 msgctxt "newCaDialog|" msgid "Attachment: " msgstr "Anhang:" #: ui/newClassifiedAd.ui:149 msgctxt "newCaDialog|" msgid "Add" msgstr "HinzufУМgen" #: ui/newPrivMsg.ui:26 msgctxt "newPrivMsgDialog|" msgid "Send a private message" msgstr "Private Nachricht senden" #: ui/newPrivMsg.ui:39 msgctxt "newPrivMsgDialog|" msgid "Subject" msgstr "Betreff" #: ui/newPrivMsg.ui:53 msgctxt "newPrivMsgDialog|" msgid "Recipient" msgstr "EmpfУЄnger" #: ui/newPrivMsg.ui:83 msgctxt "newPrivMsgDialog|" msgid "Attachments: " msgstr "AnhУЄnge:" #: ui/newPrivMsg.ui:103 msgctxt "newPrivMsgDialog|" msgid "Attach" msgstr "AnhУЄngen" #: ui/newProfileComment.ui:26 msgctxt "newProfileCommentDialog|" msgid "Comment a operators profile" msgstr "Kommentiere ein Profil" #: ui/newProfileComment.ui:39 msgctxt "newProfileCommentDialog|" msgid "Subject" msgstr "Betreff" #: ui/newProfileComment.ui:53 msgctxt "newProfileCommentDialog|" msgid "Commented profile" msgstr "Kommentiertes Profil" #: ui/newProfileComment.ui:89 msgctxt "newProfileCommentDialog|" msgid "Attachments:" msgstr "AnhУЄnge:" #: ui/newProfileComment.ui:109 msgctxt "newProfileCommentDialog|" msgid "Attach" msgstr "AnhУЄngen" #: ui/newTextDocument.ui:26 msgctxt "newTextDocumentDialog|" msgid "Edit and publish a new text document" msgstr "Neues Textdokument bearbeiten und verУЖffentlichen" #: ui/newTextDocument.ui:39 msgctxt "newTextDocumentDialog|" msgid "Document title" msgstr "Titel" #: ui/newTextDocument.ui:75 msgctxt "newTextDocumentDialog|" msgid "Attachments:" msgstr "AnhУЄnge:" #: ui/newTextDocument.ui:95 msgctxt "newTextDocumentDialog|" msgid "Attach" msgstr "AnhУЄngen" #: ui/profileCommentDisplay.ui:26 msgctxt "profileCommentDisplay|" msgid "Comments regarding operator" msgstr "Kommentare УМber BenutzerIn" #: ui/profileReadersDialog.ui:26 msgctxt "profileReadersDialog|" msgid "Profile readers list" msgstr "Profilbetrachter anzeigen" #: ui/profileReadersDialog.ui:37 msgctxt "profileReadersDialog|" msgid "Search for profiles to add" msgstr "Suche Profile zum HinzufУМgen" #: ui/profileReadersDialog.ui:44 msgctxt "profileReadersDialog|" msgid "First 100 matching profiles:" msgstr "Erste 100 passende Profile" #: ui/profileReadersDialog.ui:66 msgctxt "profileReadersDialog|" msgid "Add selected to list of readers" msgstr "" #: ui/profileReadersDialog.ui:73 msgctxt "profileReadersDialog|" msgid "Current list of readers" msgstr "" #: ui/profileReadersDialog.ui:90 msgctxt "profileReadersDialog|" msgid "Close" msgstr "SchlieУŸen" #: ui/profileReadersDialog.ui:109 msgctxt "profileReadersDialog|" msgid "Remove selected" msgstr "AusgewУЄhlte entfernen" #: ui/searchDisplay.ui:26 msgctxt "searchDisplay|" msgid "Search data storage" msgstr "Datenspeicher durchsuchen" #: ui/searchDisplay.ui:60 msgctxt "searchDisplay|" msgid "Words:" msgstr "Worte:" #: ui/searchDisplay.ui:70 msgctxt "searchDisplay|" msgid "Search" msgstr "Suche" #: ui/searchDisplay.ui:87 msgctxt "searchDisplay|" msgid "Network search" msgstr "Netzwerk-Suche" #: ui/searchDisplay.ui:101 msgctxt "searchDisplay|" msgid "Search ads" msgstr "Suche Kleinanzeigen" #: ui/searchDisplay.ui:111 msgctxt "searchDisplay|" msgid "Search profiles" msgstr "Suche Profile" #: ui/searchDisplay.ui:121 msgctxt "searchDisplay|" msgid "Search comments" msgstr "Suche Kommentare" #: ui/settingsDialog.ui:26 msgctxt "settingsDialog|" msgid "Node settings" msgstr "Netzknoten-Einstellungen" #: ui/settingsDialog.ui:39 #, fuzzy msgctxt "settingsDialog|" msgid "TCP listen port" msgstr "TCP Port eingehende Verbindungen" #: ui/settingsDialog.ui:58 msgctxt "settingsDialog|" msgid "Incoming TCP listen port. Change requires node restart. " msgstr "" "TCP Port eingehende Verbindungen. У„nderungen erfordern Neustart des " "Netzknotens" #: ui/settingsDialog.ui:84 msgctxt "settingsDialog|" msgid "DNS name of node" msgstr "DNS Name des Netzknotens" #: ui/settingsDialog.ui:91 #, fuzzy msgctxt "settingsDialog|" msgid "" "If you have permanent DNS name for your machine, you may type it here to be " "used to reference your node" msgstr "" "Wenn ihr Rechner einen permanenten DNS Eintrag besitzt, kann dieser hier " "eingetragen werden um ihren Netzknoten zu referenzieren" #: ui/settingsDialog.ui:103 msgctxt "settingsDialog|" msgid "Data store limits:" msgstr "Maximaler Speicherumfang" #: ui/settingsDialog.ui:115 msgctxt "settingsDialog|" msgid "Nr of profiles to keep" msgstr "Anzahl der zu behaltenden Profile" #: ui/settingsDialog.ui:154 msgctxt "settingsDialog|" msgid "Nr of private messages to keep" msgstr "Anzahl der zu behaltenden privaten Nachrichten" #: ui/settingsDialog.ui:193 msgctxt "settingsDialog|" msgid "Nr of binary blobs to keep" msgstr "" #: ui/settingsDialog.ui:232 msgctxt "settingsDialog|" msgid "Nr of CAs to keep" msgstr "Anzahl der zu behaltenden CAs" #: ui/settingsDialog.ui:251 msgctxt "settingsDialog|" msgid "" "Number of classified ads to keep in storage, total, including all " "classifications. Oldest referenced will be deleted first." msgstr "" #: ui/settingsDialog.ui:274 msgctxt "settingsDialog|" msgid "Nr of profile comments to keep" msgstr "Anzahl der zu Kommentare" #: ui/settingsDialog.ui:316 msgctxt "settingsDialog|" msgid "Ringtone" msgstr "Klingelton" #: ui/settingsDialog.ui:324 msgctxt "settingsDialog|" msgid "Bow" msgstr "Bogen" #: ui/settingsDialog.ui:329 msgctxt "settingsDialog|" msgid "Electrical" msgstr "Elektro" #: ui/settingsDialog.ui:334 msgctxt "settingsDialog|" msgid "Acoustic" msgstr "Akustisch" #: ui/settingsDialog.ui:339 msgctxt "settingsDialog|" msgid "Beep" msgstr "Piep" #: ui/settingsDialog.ui:344 msgctxt "settingsDialog|" msgid "Silence" msgstr "Lautlos" #: ui/settingsDialog.ui:356 msgctxt "settingsDialog|" msgid "Accept voice calls" msgstr "Sprachanrufe erlauben" #: ui/settingsDialog.ui:364 #, fuzzy msgctxt "settingsDialog|" msgid "All" msgstr "Alles" #: ui/settingsDialog.ui:369 msgctxt "settingsDialog|" msgid "From trusted operators" msgstr "Von zuverlУЄssigen Benutzern" #: ui/settingsDialog.ui:374 msgctxt "settingsDialog|" msgid "Accept no voice calls" msgstr "Sprachanrufe verweigern" #: ui/statusDialog.ui:26 msgctxt "statusDialog|" msgid "Network and connection status" msgstr "Netzwerk- und Verbindungsstatus" #: ui/statusDialog.ui:48 msgctxt "statusDialog|" msgid "Detected own IPv4" msgstr "IPv4 erkannt" #: ui/statusDialog.ui:61 ui/statusDialog.ui:93 msgctxt "statusDialog|" msgid "" "Should your friend have trouble connecting, give her this address with port " "number" msgstr "" "Sollte dein Kontakt Verbindungsprobleme haben, teile ihm folgende Portnummer" " mit" #: ui/statusDialog.ui:74 msgctxt "statusDialog|" msgid "IPv6" msgstr "IPv6" #: ui/statusDialog.ui:113 msgctxt "statusDialog|" msgid "TCP port currently used" msgstr "TCP Port in Benutzung" #: ui/statusDialog.ui:151 msgctxt "statusDialog|" msgid "Currently open connections" msgstr "Aktuell bestehende Verbindungen" #: ui/statusDialog.ui:195 msgctxt "statusDialog|" msgid "Manually add connection" msgstr "Verbindung manuell hinzufУМgen" #: ui/statusDialog.ui:202 msgctxt "statusDialog|" msgid "Close" msgstr "SchlieУŸen" classified-ads-0.13/po/es.po000066400000000000000000001764211331670245300157140ustar00rootroot00000000000000# Translation file for classified ads. # # This is auto-generated from .ts file. # Brian Curtich , 2016. #zanata # Dennis Tobar , 2016. #zanata # Omar BerroterУЁn S. , 2016. #zanata # tatica leandro , 2016. #zanata # Emilio Herrera , 2017. #zanata # Fernando Espinoza , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: classified-ads 0.10\n" "Report-Msgid-Bugs-To: antti.jarvinen@katiska.org\n" "POT-Creation-Date: 2016-03-14 21:30+0300\n" "PO-Revision-Date: 2017-08-26 02:07-0400\n" "Last-Translator: Fernando Espinoza \n" "Language-Team: Spanish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Zanata 3.9.6\n" "X-Language: fi_FI\n" "X-Qt-Contexts: true\n" #: ui/attachmentlistdialog.cpp:60 msgctxt "AttachmentListDialog|" msgid "Save file to disk.." msgstr "Guardar archivo" #: ui/attachmentlistdialog.cpp:151 ui/attachmentlistdialog.cpp:153 msgctxt "AttachmentListDialog|" msgid "files" msgstr "archivos" #: ui/attachmentlistdialog.cpp:162 msgctxt "AttachmentListDialog|" msgid "Save location" msgstr "Guardar direcciУГn" #: ui/attachmentlistdialog.cpp:163 msgctxt "AttachmentListDialog|" msgid "Save to TCL app library instead of regular file?" msgstr "" "Guardar en la biblioteca de aplicaciones TCL en lugar del archivo normal" #: ui/attachmentlistdialog.cpp:155 msgctxt "AttachmentListDialog|" msgid "Choose file name for saving" msgstr "Indique el nombre del archivo para guardar " #: ui/attachmentlistdialog.cpp:166 msgctxt "AttachmentListDialog|" msgid "Error" msgstr "Error" #: ui/attachmentlistdialog.cpp:167 msgctxt "AttachmentListDialog|" msgid "File open error" msgstr "Error al abrir el archivo" #: call/audioplayer.cpp:65 msgctxt "AudioPlayer|" msgid "raw audio format not supported by backend, cannot play audio." msgstr "" "formato de aurio raw no soportado por por backend, no se puede reproducir el" " archivo de audio." #: call/audioplayer.cpp:83 msgctxt "AudioPlayer|" msgid "Could not initialize audio player." msgstr "No se puede iniciar el reproductor de aurio." #: datamodel/binaryfilelistingmodel.cpp:173 msgctxt "BinaryFileListingModel|" msgid "Name or fingerprint of file" msgstr "Nombre o fingerprint(identificador) del archivo" #: datamodel/calistingmodel.cpp:50 datamodel/calistingmodel.cpp:143 msgctxt "CAListingModel|" msgid "Date" msgstr "Fecha" #: datamodel/calistingmodel.cpp:51 datamodel/calistingmodel.cpp:142 msgctxt "CAListingModel|" msgid "Subject" msgstr "Asunto" #: datamodel/camodel.cpp:127 msgctxt "ClassifiedAdsModel|" msgid "Buying" msgstr "Comprando" #: datamodel/camodel.cpp:129 msgctxt "ClassifiedAdsModel|" msgid "Selling" msgstr "Vendiendo" #: datamodel/camodel.cpp:131 msgctxt "ClassifiedAdsModel|" msgid "Giving away" msgstr "Obsequiar" #: datamodel/camodel.cpp:133 msgctxt "ClassifiedAdsModel|" msgid "Wanting" msgstr "Necesitando" #: datamodel/camodel.cpp:135 msgctxt "ClassifiedAdsModel|" msgid "Renting" msgstr "Rentando" #: datamodel/camodel.cpp:137 msgctxt "ClassifiedAdsModel|" msgid "Announcement" msgstr "Anunciando" #: datamodel/camodel.cpp:210 msgctxt "ClassifiedAdsModel|" msgid "Cars" msgstr "Carros" #: datamodel/camodel.cpp:212 msgctxt "ClassifiedAdsModel|" msgid "Boats" msgstr "Botes" #: datamodel/camodel.cpp:214 msgctxt "ClassifiedAdsModel|" msgid "Bikes" msgstr "Bicicletas" #: datamodel/camodel.cpp:216 msgctxt "ClassifiedAdsModel|" msgid "Other vehicles" msgstr "Otros vehiculos" #: datamodel/camodel.cpp:218 msgctxt "ClassifiedAdsModel|" msgid "Vehicle parts" msgstr "Partes de vehiculos" #: datamodel/camodel.cpp:220 msgctxt "ClassifiedAdsModel|" msgid "Habitation" msgstr "HabitaciУГn" #: datamodel/camodel.cpp:222 msgctxt "ClassifiedAdsModel|" msgid "Household appliances" msgstr "ElectrodomУЉsticos" #: datamodel/camodel.cpp:224 msgctxt "ClassifiedAdsModel|" msgid "Furniture" msgstr "Carpinteria" #: datamodel/camodel.cpp:226 msgctxt "ClassifiedAdsModel|" msgid "Clothing" msgstr "Sastretria" #: datamodel/camodel.cpp:228 msgctxt "ClassifiedAdsModel|" msgid "Tools" msgstr "Herramientas" #: datamodel/camodel.cpp:230 msgctxt "ClassifiedAdsModel|" msgid "Sports" msgstr "Deportes" #: datamodel/camodel.cpp:232 msgctxt "ClassifiedAdsModel|" msgid "Music" msgstr "MУКsica" #: datamodel/camodel.cpp:234 msgctxt "ClassifiedAdsModel|" msgid "Books" msgstr "Libros" #: datamodel/camodel.cpp:236 msgctxt "ClassifiedAdsModel|" msgid "Movies" msgstr "PelУ­culas" #: datamodel/camodel.cpp:238 msgctxt "ClassifiedAdsModel|" msgid "Animals" msgstr "Animales" #: datamodel/camodel.cpp:240 msgctxt "ClassifiedAdsModel|" msgid "Electronics" msgstr "ElectrУГnicos" #: datamodel/camodel.cpp:242 msgctxt "ClassifiedAdsModel|" msgid "Jobs" msgstr "Trabajos" #: datamodel/camodel.cpp:244 msgctxt "ClassifiedAdsModel|" msgid "Transportation" msgstr "Transporte" #: datamodel/camodel.cpp:246 msgctxt "ClassifiedAdsModel|" msgid "Services" msgstr "Servicios" #: datamodel/camodel.cpp:248 msgctxt "ClassifiedAdsModel|" msgid "Healthcare" msgstr "Cuidados mУЉdicos" #: datamodel/camodel.cpp:250 msgctxt "ClassifiedAdsModel|" msgid "Foodstuff" msgstr "Productos Alimenticios" #: datamodel/camodel.cpp:252 msgctxt "ClassifiedAdsModel|" msgid "Software" msgstr "Programas computacionales" #: datamodel/camodel.cpp:254 msgctxt "ClassifiedAdsModel|" msgid "Events" msgstr "Eventos" #: datamodel/camodel.cpp:256 msgctxt "ClassifiedAdsModel|" msgid "Education" msgstr "EducaciУГn" #: datamodel/camodel.cpp:258 msgctxt "ClassifiedAdsModel|" msgid "Finance" msgstr "Finanzas" #: datamodel/camodel.cpp:260 msgctxt "ClassifiedAdsModel|" msgid "Jewelry" msgstr "JoyerУ­a" #: datamodel/camodel.cpp:262 msgctxt "ClassifiedAdsModel|" msgid "Religious rituals" msgstr "Rituales religiosos" #: datamodel/camodel.cpp:264 msgctxt "ClassifiedAdsModel|" msgid "Philosophy" msgstr "FilosofУ­a" #: datamodel/camodel.cpp:908 msgctxt "ClassifiedAdsModel|" msgid "Any country" msgstr "Cualquier paУ­s" #: datamodel/connectionlistingmodel.cpp:142 msgctxt "ConnectionListingModel|" msgid "Peer network address" msgstr "DirecciУГn de red de iguales" #: datamodel/connectionlistingmodel.cpp:145 msgctxt "ConnectionListingModel|" msgid "Inbound connections are those where peer initiated connection" msgstr "" "Conexiones entrantes son aquellas en las que el par ha iniciado la conexiУГn" #: datamodel/connectionlistingmodel.cpp:148 msgctxt "ConnectionListingModel|" msgid "Data transferred from peer to your node" msgstr "Datos transferidos desde el par a su nodo" #: datamodel/connectionlistingmodel.cpp:151 msgctxt "ConnectionListingModel|" msgid "Data transferred to peer from your node" msgstr "Datos transferidos al par desde su nodo" #: datamodel/connectionlistingmodel.cpp:154 msgctxt "ConnectionListingModel|" msgid "Time when connection was opened" msgstr "Momento en que se abriУГ la conexiУГn" #: datamodel/connectionlistingmodel.cpp:164 msgctxt "ConnectionListingModel|" msgid "Address" msgstr "DirecciУГn" #: datamodel/connectionlistingmodel.cpp:167 msgctxt "ConnectionListingModel|" msgid "Inbound" msgstr "Entrante" #: datamodel/connectionlistingmodel.cpp:170 msgctxt "ConnectionListingModel|" msgid "Bytes in" msgstr "Bytes entrada" #: datamodel/connectionlistingmodel.cpp:173 msgctxt "ConnectionListingModel|" msgid "Bytes out" msgstr "Bytes salida" #: datamodel/connectionlistingmodel.cpp:176 msgctxt "ConnectionListingModel|" msgid "Open time" msgstr "Tiempo abierto" #: datamodel/contactlistingmodel.cpp:73 msgctxt "ContactListingModel|" msgid "Yes" msgstr "SУ­" #: datamodel/contactlistingmodel.cpp:75 msgctxt "ContactListingModel|" msgid "Unknown" msgstr "Desconocido" #: datamodel/contactlistingmodel.cpp:98 msgctxt "ContactListingModel|" msgid "Actual network address (SHA1) of the contact" msgstr "DirecciУГn de red (SHA-1) actual del contacto" #: datamodel/contactlistingmodel.cpp:101 msgctxt "ContactListingModel|" msgid "Locally given nickname ; user may set her own nickname himself" msgstr "" "Apodo dado localmente ; el usuario debe fijar su propio apodo el mismo" #: datamodel/contactlistingmodel.cpp:104 msgctxt "ContactListingModel|" msgid "Public statement if this operator to be trusted in transactions" msgstr "" "DeclaraciУГn pУКblica de si este operador es confiable en las transacciones" #: datamodel/contactlistingmodel.cpp:114 msgctxt "ContactListingModel|" msgid "Address" msgstr "DirecciУГn" #: datamodel/contactlistingmodel.cpp:117 msgctxt "ContactListingModel|" msgid "Nickname" msgstr "Apodo" #: datamodel/contactlistingmodel.cpp:120 msgctxt "ContactListingModel|" msgid "Publicly trusted" msgstr "De confianza pУКblica" #: datamodel/contentencryptionmodel.cpp:88 msgctxt "ContentEncryptionModel|" msgid "SSL key generation went wrong, calling exit.." msgstr "Error en la generaciУГn de la llave SSL, finalizando..." #: datamodel/contentencryptionmodel.cpp:96 msgctxt "ContentEncryptionModel|" msgid "x509 cert generation went wrong, calling exit.." msgstr "Error al generar certificado x509, terminando..." #: datamodel/contentencryptionmodel.cpp:194 #: datamodel/contentencryptionmodel.cpp:292 msgctxt "ContentEncryptionModel|" msgid "RSA Private key key saving went wrong" msgstr "Error al guardar llave RSA" #: datamodel/contentencryptionmodel.cpp:639 msgctxt "ContentEncryptionModel|" msgid "No suitable de-cryption key found" msgstr "No se ha encontrado llave de descifrado" #: controller.cpp:109 msgctxt "Controller|" msgid "Classified ads" msgstr "Anuncios clasificados" #: controller.cpp:141 msgctxt "Controller|" msgid "Enter password for protection of your messages:" msgstr "Ingrese una contraseУБa para proteger sus mensajes:" #: controller.cpp:432 msgctxt "Controller|" msgid "Fetching item from network.." msgstr "Obteniendo elemento desde la red..." #: controller.cpp:485 msgctxt "Controller|" msgid "E&xit" msgstr "Salir" #: controller.cpp:487 msgctxt "Controller|" msgid "Exit the application" msgstr "Salir de la aplicaciУГn" #: controller.cpp:489 msgctxt "Controller|" msgid "&About" msgstr "&Acerca de" #: controller.cpp:490 msgctxt "Controller|" msgid "Show the application's About box" msgstr "Muestra el cuadro Acerca de" #: controller.cpp:492 msgctxt "Controller|" msgid "&Change password" msgstr "&Cambiar contraseУБa" #: controller.cpp:493 msgctxt "Controller|" msgid "Change password of current profile" msgstr "Cambiar la contraseУБa del perfil actual" #: controller.cpp:495 msgctxt "Controller|" msgid "Create &new profile" msgstr "Crear &nuevo perfil" #: controller.cpp:496 msgctxt "Controller|" msgid "Makes a brand new user profile" msgstr "Crea un nuevo perfil de usuario" #: controller.cpp:498 msgctxt "Controller|" msgid "&Delete current profile" msgstr "&Delete perfil actual" #: controller.cpp:499 msgctxt "Controller|" msgid "Deletes currently open profile" msgstr "Borrar el perfil actualmente abierto" #: controller.cpp:501 msgctxt "Controller|" msgid "&Select another profile" msgstr "&Seleccionar otro perfil" #: controller.cpp:502 msgctxt "Controller|" msgid "If you have multitude of profiles" msgstr "Si tienes varios perfiles" #: controller.cpp:504 msgctxt "Controller|" msgid "Settings.." msgstr "ConfiguraciУГn.." #: controller.cpp:505 msgctxt "Controller|" msgid "Node-wide settings.." msgstr "Ajustes de todo el nodo.." #: controller.cpp:507 msgctxt "Controller|" msgid "Network status.." msgstr "Estado de la red.." #: controller.cpp:509 msgctxt "Controller|" msgid "Search.." msgstr "Buscar.." #: controller.cpp:526 msgctxt "Controller|" msgid "&File" msgstr "&File" #: controller.cpp:729 msgctxt "Controller|" msgid "&TCL Programs" msgstr "" #: controller.cpp:730 msgctxt "Controller|" msgid "&Local library" msgstr "" #: controller.cpp:731 msgctxt "Controller|" msgid "Locally stored TCL programs" msgstr "Programas de TCL almacenados localmente" #: controller.cpp:734 msgctxt "Controller|" msgid "TCL &Console" msgstr "" #: controller.cpp:735 msgctxt "Controller|" msgid "Display interpreter console" msgstr "Programas de TCL almacenados localmente" #: controller.cpp:571 msgctxt "Controller|" msgid "Enter new password:" msgstr "Ingrese contraseУБa nueva:" #: controller.cpp:599 controller.cpp:708 msgctxt "Controller|" msgid "Activate another profile with password" msgstr "Activar otro perfil con contraseУБa" #: controller.cpp:693 msgctxt "Controller|" msgid "Can't delete only profile." msgstr "No se puede eliminar sУГlo el perfil." #: controller.cpp:697 msgctxt "Controller|" msgid "Permanently discard profile?" msgstr "ТПEliminar perfil permanentemente?" #: controller.cpp:698 msgctxt "Controller|" msgid "There will be NO way to access content of this profile later" msgstr "NO habrУЁ modo de acceder al contenido de este perfil nuevamente." #: controller.cpp:761 msgctxt "Controller|" msgid "Cant load node cert or key cert" msgstr "No se puede cargar nodo de cert o llave de cert" #: controller.cpp:766 msgctxt "Controller|" msgid "File error" msgstr "Error de archivos" #: controller.cpp:771 msgctxt "Controller|" msgid "Database error" msgstr "Error de base de datos" #: controller.cpp:777 controller.cpp:787 msgctxt "Controller|" msgid "Cryptographic module" msgstr "MУГdulo de cifrado" #: controller.cpp:782 msgctxt "Controller|" msgid "Database module" msgstr "MУГdulo de base de datos" #: controller.cpp:788 msgctxt "Controller|" msgid "Bad password" msgstr "ContraseУБa incorrecta" #: controller.cpp:1043 msgctxt "Controller|" msgid "TCL Interpreter" msgstr "IntУЉrprete TCL" #: controller.cpp:1004 msgctxt "Controller|" msgid "Could not find item from network.." msgstr "No se pudo encontrar el elemento de la red.." #: controller.cpp:1117 msgctxt "Controller|" msgid "SHA1: " msgstr "SHA1:" #: controller.cpp:1122 msgctxt "Controller|" msgid "Mime-Type: " msgstr "Mime-Type:" #: controller.cpp:1128 msgctxt "Controller|" msgid "Description: " msgstr "DescripciУГn:" #: controller.cpp:1134 msgctxt "Controller|" msgid "Publisher: " msgstr "Editor: " #: controller.cpp:1140 msgctxt "Controller|" msgid "Content owner: " msgstr "Propietario del contenido: " #: controller.cpp:1146 msgctxt "Controller|" msgid "License: " msgstr "Licencia:" #: controller.cpp:1152 msgctxt "Controller|" msgid "Name: " msgstr "Nombre:" #: controller.cpp:1159 msgctxt "Controller|" msgid "Date: " msgstr "Fecha:" #: ui/dialogbase.cpp:47 ui/dialogbase.cpp:101 msgctxt "DialogBase|" msgid "File way too big" msgstr "Archivo demasiado grande" #: ui/dialogbase.cpp:55 ui/dialogbase.cpp:109 msgctxt "DialogBase|" msgid "File too big" msgstr "Archivo demasiado grande" #: ui/dialogbase.cpp:85 ui/dialogbase.cpp:131 msgctxt "DialogBase|" msgid "File open error" msgstr "Error al abrir archivo" #: ui/dialogbase.cpp:94 msgctxt "DialogBase|" msgid "Select file to be published" msgstr "Seleccione el archivo a publicar" #: ui/dialogbase.cpp:96 msgctxt "DialogBase|" msgid "Files (*.*)" msgstr "Archivos (*.*)" #: ui/editcontact.cpp:72 msgctxt "EditContactDialog|" msgid "Error" msgstr "Error" #: ui/editcontact.cpp:73 msgctxt "EditContactDialog|" msgid "Operator addr is not valid" msgstr "DirecciУГn del operador no es vУЁlida" #: FrontWidget.cpp:95 msgctxt "FrontWidget|" msgid "Classified ads" msgstr "Anuncios clasificados" #: FrontWidget.cpp:96 msgctxt "FrontWidget|" msgid "My profile" msgstr "Mi perfil" #: FrontWidget.cpp:97 msgctxt "FrontWidget|" msgid "Contacts" msgstr "Contactos" #: FrontWidget.cpp:98 msgctxt "FrontWidget|" msgid "Private messages" msgstr "Mensajes privados" #: FrontWidget.cpp:160 msgctxt "FrontWidget|" msgid "Add shared file.." msgstr "Agregar archivo compartido.." #: FrontWidget.cpp:161 msgctxt "FrontWidget|" msgid "Stop advertising selected shared file" msgstr "Dejar de publicitar el archivo compartido seleccionado" #: FrontWidget.cpp:162 msgctxt "FrontWidget|" msgid "Save file to disk.." msgstr "Guardar archivo en el disco.." #: FrontWidget.cpp:163 msgctxt "FrontWidget|" msgid "View file information.." msgstr "Ver informaciУГn del archivo.." #: FrontWidget.cpp:164 msgctxt "FrontWidget|" msgid "Copy file address (SHA1) to clipboard.." msgstr "Copiar direcciУГn del archivo (SHA-1) al portapapeles.." #: FrontWidget.cpp:165 msgctxt "FrontWidget|" msgid "Edit+publish new text document.." msgstr "Editar y publicar nuevo documento de texto.." #: FrontWidget.cpp:353 msgctxt "FrontWidget|" msgid "Open File" msgstr "Abrir archivo" #: FrontWidget.cpp:355 FrontWidget.cpp:885 msgctxt "FrontWidget|" msgid "Files (*.*)" msgstr "Archivos (*.*)" #: FrontWidget.cpp:359 FrontWidget.cpp:1185 FrontWidget.cpp:1328 msgctxt "FrontWidget|" msgid "Error" msgstr "Error" #: FrontWidget.cpp:360 msgctxt "FrontWidget|" msgid "Can't load image" msgstr "No puede cargar imagen" #: FrontWidget.cpp:626 FrontWidget.cpp:766 msgctxt "FrontWidget|" msgid "Profile not in database" msgstr "Perfil no existe en la base de datos" #: FrontWidget.cpp:627 FrontWidget.cpp:767 msgctxt "FrontWidget|" msgid "Try viewing profile first to obtain data" msgstr "Intentando visualizar el perfil antes de obtener datos" #: FrontWidget.cpp:883 msgctxt "FrontWidget|" msgid "Select file to be published" msgstr "Seleccione el archivo a publicar" #: FrontWidget.cpp:890 msgctxt "FrontWidget|" msgid "File way too big" msgstr "Archivo demasiado grande" #: FrontWidget.cpp:898 msgctxt "FrontWidget|" msgid "File too big" msgstr "Archivo muy grande" #: FrontWidget.cpp:942 FrontWidget.cpp:1186 msgctxt "FrontWidget|" msgid "File open error" msgstr "Error al abrir archivo" #: FrontWidget.cpp:1167 FrontWidget.cpp:1173 msgctxt "FrontWidget|" msgid "files" msgstr "archivos" #: FrontWidget.cpp:1183 msgctxt "FrontWidget|" msgid "Save location" msgstr "Guardar direcciУГn" #: FrontWidget.cpp:1184 msgctxt "FrontWidget|" msgid "Save to TCL app library instead of regular file?" msgstr "" "Guardar en la biblioteca de aplicaciones TCL en lugar de archivo normal?" #: FrontWidget.cpp:1176 msgctxt "FrontWidget|" msgid "Choose file name for saving" msgstr "Elegir nombre de archivo para guardar" #: FrontWidget.cpp:1236 msgctxt "FrontWidget|" msgid "" "\n" "\n" "\n" "Click\n" "To\n" "Add\n" "Image\n" msgstr "" "\n" "\n" "\n" "Clic\n" "Para\n" "Agregar\n" "Imagen\n" #: FrontWidget.cpp:1329 msgctxt "FrontWidget|" msgid "Article not found from local storage" msgstr "ArtУ­culo no encontrado desde el almacenamiento local" #: FrontWidget.cpp:1355 FrontWidget.cpp:1903 #, qt-format msgctxt "FrontWidget|" msgid "" "Trusted by %1\n" "SHA1 %2" msgstr "" "Confiado por %1\n" "SHA1 %2" #: FrontWidget.cpp:1392 msgctxt "FrontWidget|" msgid "Time of last update " msgstr "Hora de УКltima actualizaciУГn" #: FrontWidget.cpp:1400 msgctxt "FrontWidget|" msgid "" "\n" "\n" "\n" "(No\n" "Image\n" "Selected)\n" msgstr "" "\n" "\n" "\n" "(No hay\n" "Imagen\n" "Seleccionada)\n" #: FrontWidget.cpp:1494 msgctxt "FrontWidget|" msgid "Edit contact.." msgstr "Editar contacto.." #: FrontWidget.cpp:1534 msgctxt "FrontWidget|" msgid "&Reply to sender" msgstr "&Reply al emisor" #: FrontWidget.cpp:1535 msgctxt "FrontWidget|" msgid "Reply to &forum" msgstr "Responder a &forum" #: FrontWidget.cpp:1536 msgctxt "FrontWidget|" msgid "&Post new ad" msgstr "&Post nuevo anuncio" #: FrontWidget.cpp:1537 msgctxt "FrontWidget|" msgid "&Public comment" msgstr "&Public comentario" #: FrontWidget.cpp:1538 msgctxt "FrontWidget|" msgid "&View profile" msgstr "&View perfil" #: FrontWidget.cpp:1539 FrontWidget.cpp:1677 msgctxt "FrontWidget|" msgid "Attachments.." msgstr "Adjuntos.." #: FrontWidget.cpp:1599 msgctxt "FrontWidget|" msgid "Add selected operator to contacts.." msgstr "AУБadir el operador seleccionado a los contactos.." #: FrontWidget.cpp:1673 msgctxt "FrontWidget|" msgid "&Reply" msgstr "&Reply" #: FrontWidget.cpp:1674 msgctxt "FrontWidget|" msgid "&New message" msgstr "&New mensaje" #: FrontWidget.cpp:1675 msgctxt "FrontWidget|" msgid "&Send public comment to sender" msgstr "&Send comentario pУКblico al emisor" #: FrontWidget.cpp:1676 msgctxt "FrontWidget|" msgid "&View profile of peer" msgstr "&View perfil del par" #: FrontWidget.cpp:1711 msgctxt "FrontWidget|" msgid "Add selected to contacts.." msgstr "AУБade los seleccionado a contactos.." #: FrontWidget.cpp:1913 FrontWidget.cpp:1915 FrontWidget.cpp:1979 #: FrontWidget.cpp:1981 msgctxt "FrontWidget|" msgid "From:" msgstr "De:" #: FrontWidget.cpp:1917 FrontWidget.cpp:1984 msgctxt "FrontWidget|" msgid "Subject:" msgstr "Asunto:" #: FrontWidget.cpp:1976 msgctxt "FrontWidget|" msgid "To:" msgstr "Para:" #: FrontWidget.cpp:2288 msgctxt "FrontWidget|" msgid "Invalid SHA1 in URL" msgstr "SHA-1 invУЁlido en la URL" #: FrontWidget.cpp:2315 msgctxt "FrontWidget|" msgid "Invalid URL" msgstr "URL invУЁlida" #: ui/insertlinkdialog.cpp:69 msgctxt "InsertLinkDialog|" msgid "Invalid URL" msgstr "URL invУЁlida" #: ui/manualconnection.cpp:53 msgctxt "ManualConnectionDialog|" msgid "DNS lookup failure" msgstr "Error en la peticiУГn DNS" #: ui/newprivmsgdialog.cpp:88 ui/newprivmsgdialog.cpp:138 msgctxt "NewPrivMessageDialog|" msgid "Error" msgstr "Error" #: ui/newprivmsgdialog.cpp:89 msgctxt "NewPrivMessageDialog|" msgid "Recipient addr is not valid" msgstr "DirecciУГn del receptor no es vУЁlida" #: ui/newprivmsgdialog.cpp:139 msgctxt "NewPrivMessageDialog|" msgid "Recipient encryption key not found from storage" msgstr "Clave de cifrado del destinatario no encontrada en el almacenamiento" #: ui/newprofilecommentdialog.cpp:89 ui/newprofilecommentdialog.cpp:126 msgctxt "NewProfileCommentDialog|" msgid "Error" msgstr "Error" #: ui/newprofilecommentdialog.cpp:90 msgctxt "NewProfileCommentDialog|" msgid "Commented profile addr is not valid" msgstr "DirecciУГn del perfil comentado no es vУЁlida" #: ui/newprofilecommentdialog.cpp:127 msgctxt "NewProfileCommentDialog|" msgid "Recipient encryption key not found from storage" msgstr "Clave de encriptaciУГn del receptor no encontrada en el almacenamiento" #: datamodel/nodemodel.cpp:115 msgctxt "NodeModel|" msgid "SSL key generation went wrong, calling exit.." msgstr "generaciУГn de clave SSL fue errУГnea, llamando a salir.." #: datamodel/nodemodel.cpp:123 msgctxt "NodeModel|" msgid "x509 cert generation went wrong, calling exit.." msgstr "generaciУГn de certificado x509 fue errУГnea, llamando a salir.." #: datamodel/nodemodel.cpp:1596 msgctxt "NodeModel|" msgid "Cant load SSL cert" msgstr "No se puede cargar certificado SSL" #: datamodel/nodemodel.cpp:1626 msgctxt "NodeModel|" msgid "Cant load SSL key" msgstr "No se puede cargar llave SSL" #: ui/passwd_dialog.cpp:104 msgctxt "PasswdDialog|" msgid "Min length 5 (use 10+)" msgstr "Longitud mУ­nima 5 (use 10+)" #: ui/passwordDialog.ui:14 msgctxt "PasswordDialog|" msgid "Password required" msgstr "ContraseУБa requerida" #: ui/passwordDialog.ui:17 msgctxt "PasswordDialog|" msgid "" "Should you forget this word, there is no easy way to recover any of your " "content" msgstr "" "DeberУ­a olvidar esta palabra, no es una manera fУЁcil de recuperar algo de su" " contenido" #: ui/passwordDialog.ui:29 msgctxt "PasswordDialog|" msgid "Enter password for protection of your messages" msgstr "Ingrese contraseУБa para la protecciУГn de sus mensajes" #: ui/passwordDialog.ui:42 msgctxt "PasswordDialog|" msgid "" "If you forget this word, there is no simple way to recover your contents" msgstr "" "Si olvida esta palabra, no existe una manera simple de recuperar el " "contenido" #: ui/passwordDialog.ui:55 msgctxt "PasswordDialog|" msgid "OK" msgstr "OK" #: ui/passwordDialog.ui:68 msgctxt "PasswordDialog|" msgid "Show password" msgstr "Mostrar contraseУБa" #: datamodel/privmsgsearchmodel.cpp:110 #, qt-format msgctxt "PrivateMessageSearchModel|" msgid "" "%1\n" "Trusted by %2" msgstr "" "%1\n" "Confiado por %2" #: datamodel/privmsgsearchmodel.cpp:237 msgctxt "PrivateMessageSearchModel|" msgid "Direction of message, sent/received" msgstr "DirecciУГn de mensaje, enviado/recibido" #: datamodel/privmsgsearchmodel.cpp:247 msgctxt "PrivateMessageSearchModel|" msgid "Dir" msgstr "Dir" #: datamodel/privmsgsearchmodel.cpp:250 msgctxt "PrivateMessageSearchModel|" msgid "Peer" msgstr "Par" #: datamodel/privmsgsearchmodel.cpp:253 msgctxt "PrivateMessageSearchModel|" msgid "Time" msgstr "Hora" #: datamodel/privmsgsearchmodel.cpp:256 msgctxt "PrivateMessageSearchModel|" msgid "Subject" msgstr "Asunto" #: ui/profilecommentdisplay.cpp:54 msgctxt "ProfileCommentDisplay|" msgid "&Add comment..." msgstr "&Add comentario..." #: ui/profilecommentdisplay.cpp:65 msgctxt "ProfileCommentDisplay|" msgid "Save attachment to disk.." msgstr "Guardar el adjunto en el disco.." #: ui/profilecommentdisplay.cpp:92 msgctxt "ProfileCommentDisplay|" msgid "Error" msgstr "Error" #: ui/profilecommentdisplay.cpp:93 msgctxt "ProfileCommentDisplay|" msgid "Article not found from local storage" msgstr "ArtУ­culo no encontrado en el almacenamiento local" #: ui/profilecommentitemdelegate.cpp:93 msgctxt "ProfileCommentItemDelegate|" msgid "Attachments: " msgstr "Adjuntos:" #: datamodel/profilecommentlistingmodel.cpp:219 msgctxt "ProfileCommentListingModel|" msgid "Sender" msgstr "Emisor" #: datamodel/profilecommentlistingmodel.cpp:222 msgctxt "ProfileCommentListingModel|" msgid "Time" msgstr "Hora" #: datamodel/profilecommentlistingmodel.cpp:225 msgctxt "ProfileCommentListingModel|" msgid "Subject" msgstr "Asunto" #: datamodel/profilecommentmodel.cpp:67 msgctxt "ProfileCommentModel|" msgid "Profile related to comment not found from database" msgstr "Perfil relativo al comentario no encontrado en la base de datos" #: ui/profilereadersdialog.cpp:73 msgctxt "ProfileReadersDialog|" msgid "View profile" msgstr "Ver perfil" #: datamodel/profilereaderslistingmodel.cpp:174 msgctxt "ProfileReadersListingModel|" msgid "Name or fingerprint of reader" msgstr "Nombre o huella digital del lector" #: call/ringtoneplayer.cpp:77 msgctxt "RingtonePlayer|" msgid "raw audio format not supported by backend, cannot play audio." msgstr "" "formato de audio crudo no soportado por el punto final, no puede reproducir " "el audio." #: call/ringtoneplayer.cpp:93 msgctxt "RingtonePlayer|" msgid "Could not initialize audio player." msgstr "No se pudo iniciar el reproductor de audio." #: ui/searchdisplay.cpp:62 msgctxt "SearchDisplay|" msgid "Open.." msgstr "Abrir.." #: ui/tclPrograms.cpp:42 msgctxt "TclProgramsDialog|" msgid "Evaluate" msgstr "Evaluar" #: ui/tclPrograms.cpp:43 msgctxt "TclProgramsDialog|" msgid "Stop program" msgstr "Detener programa" #: ui/tclPrograms.cpp:49 msgctxt "TclProgramsDialog|" msgid "Delete program" msgstr "Borrar programa" #: ui/tclPrograms.cpp:99 msgctxt "TclProgramsDialog|" msgid "TCL Program name" msgstr "Nombre del programa TCL" #: ui/tclPrograms.cpp:100 msgctxt "TclProgramsDialog|" msgid "Name:" msgstr "Nombre:" #: ui/tclPrograms.cpp:140 msgctxt "TclProgramsDialog|" msgid "Deletion confirmation" msgstr "ConfirmaciУГn de eliminaciУГn" #: ui/tclPrograms.cpp:141 #, qt-format msgctxt "TclProgramsDialog|" msgid "Permanently delete program %1?" msgstr "ТПEliminar definitivamente el programa% 1?" #: textedit/textedit.cpp:127 msgctxt "TextEdit|" msgid "Help" msgstr "Ayuda" #: textedit/textedit.cpp:129 msgctxt "TextEdit|" msgid "About &Qt" msgstr "Sobre &Qt" #: textedit/textedit.cpp:186 msgctxt "TextEdit|" msgid "Edit Actions" msgstr "Editar Acciones" #: textedit/textedit.cpp:188 msgctxt "TextEdit|" msgid "&File" msgstr "&File" #: textedit/textedit.cpp:194 msgctxt "TextEdit|" msgid "&Open..." msgstr "&Open..." #: textedit/textedit.cpp:203 msgctxt "TextEdit|" msgid "&Save locally before send" msgstr "&Save localmente antes de enviar" #: textedit/textedit.cpp:210 msgctxt "TextEdit|" msgid "Save locally &As..." msgstr "Guardar localmente &As..." #: textedit/textedit.cpp:218 msgctxt "TextEdit|" msgid "&Print..." msgstr "&Print..." #: textedit/textedit.cpp:226 msgctxt "TextEdit|" msgid "Print Preview..." msgstr "Imprimir Vista Previa..." #: textedit/textedit.cpp:231 msgctxt "TextEdit|" msgid "&Export PDF..." msgstr "&Export PDF..." #: textedit/textedit.cpp:244 msgctxt "TextEdit|" msgid "&Edit" msgstr "&Edit" #: textedit/textedit.cpp:249 msgctxt "TextEdit|" msgid "&Undo" msgstr "&Undo" #: textedit/textedit.cpp:254 msgctxt "TextEdit|" msgid "&Redo" msgstr "&Redo" #: textedit/textedit.cpp:261 msgctxt "TextEdit|" msgid "Cu&t" msgstr "Cu&t" #: textedit/textedit.cpp:267 msgctxt "TextEdit|" msgid "&Copy" msgstr "&Copy" #: textedit/textedit.cpp:273 msgctxt "TextEdit|" msgid "&Paste" msgstr "&Paste" #: textedit/textedit.cpp:283 msgctxt "TextEdit|" msgid "Insert link" msgstr "Insertar enlace" #: textedit/textedit.cpp:287 msgctxt "TextEdit|" msgid "Embed image" msgstr "Imagen embebida" #: textedit/textedit.cpp:294 msgctxt "TextEdit|" msgid "F&ormat" msgstr "F&ormat" #: textedit/textedit.cpp:298 msgctxt "TextEdit|" msgid "&Bold" msgstr "&Bold" #: textedit/textedit.cpp:310 msgctxt "TextEdit|" msgid "&Italic" msgstr "&Italic" #: textedit/textedit.cpp:322 msgctxt "TextEdit|" msgid "&Underline" msgstr "&Underline" #: textedit/textedit.cpp:341 textedit/textedit.cpp:347 msgctxt "TextEdit|" msgid "&Left" msgstr "&Left" #: textedit/textedit.cpp:342 textedit/textedit.cpp:346 msgctxt "TextEdit|" msgid "C&enter" msgstr "C&enter" #: textedit/textedit.cpp:343 textedit/textedit.cpp:345 msgctxt "TextEdit|" msgid "&Right" msgstr "&Right" #: textedit/textedit.cpp:349 msgctxt "TextEdit|" msgid "&Justify" msgstr "&Justify" #: textedit/textedit.cpp:376 msgctxt "TextEdit|" msgid "&Color..." msgstr "&Color..." #: textedit/textedit.cpp:383 msgctxt "TextEdit|" msgid "Standard" msgstr "EstУЁndar" #: textedit/textedit.cpp:384 msgctxt "TextEdit|" msgid "Bullet List (Disc)" msgstr "Lista de Balas (Disco)" #: textedit/textedit.cpp:385 msgctxt "TextEdit|" msgid "Bullet List (Circle)" msgstr "Lista de Balas (CУ­rculo)" #: textedit/textedit.cpp:386 msgctxt "TextEdit|" msgid "Bullet List (Square)" msgstr "Lista de Balas (Cuadrado)" #: textedit/textedit.cpp:387 msgctxt "TextEdit|" msgid "Ordered List (Decimal)" msgstr "Lista Ordenada (Decimal)" #: textedit/textedit.cpp:388 msgctxt "TextEdit|" msgid "Ordered List (Alpha lower)" msgstr "Lista Ordenada (Alpha inferior)" #: textedit/textedit.cpp:389 msgctxt "TextEdit|" msgid "Ordered List (Alpha upper)" msgstr "Lista Ordenada (Alpha mУЁs arriba)" #: textedit/textedit.cpp:390 msgctxt "TextEdit|" msgid "Ordered List (Roman lower)" msgstr "Lista Ordenada (Roman inferior)" #: textedit/textedit.cpp:391 msgctxt "TextEdit|" msgid "Ordered List (Roman upper)" msgstr "Lista Ordenada (Roman arriba)" #: textedit/textedit.cpp:442 msgctxt "TextEdit|" msgid "Application" msgstr "AplicaciУГn" #: textedit/textedit.cpp:443 msgctxt "TextEdit|" msgid "" "The document has been modified.\n" "Do you want to save your changes?" msgstr "" "El documento ha sido modificado.\n" "ТПDesea guardar los cambios?" #: textedit/textedit.cpp:467 msgctxt "TextEdit|" msgid "Open File..." msgstr "Abrir Archivo..." #: textedit/textedit.cpp:468 msgctxt "TextEdit|" msgid "HTML-Files (*.htm *.html);;All Files (*)" msgstr "Archivos HTML (*.htm *.html);;Todos los Archivos (*)" #: textedit/textedit.cpp:485 msgctxt "TextEdit|" msgid "Save as..." msgstr "Guardar como..." #: textedit/textedit.cpp:486 msgctxt "TextEdit|" msgid "ODF files (*.odt);;HTML-Files (*.htm *.html);;All Files (*)" msgstr "" "Archivos ODF (*.odt);;Archivos HTML (*.htm *.html);;Todos los Archivos (*)" #: textedit/textedit.cpp:501 msgctxt "TextEdit|" msgid "Print Document" msgstr "Imprimir Documento" #: textedit/textedit.cpp:559 msgctxt "TextEdit|" msgid "Open File" msgstr "Abrir Archivo" #: textedit/textedit.cpp:561 msgctxt "TextEdit|" msgid "Files (*.*)" msgstr "Archivos (*.*)" #: textedit/textedit.cpp:566 msgctxt "TextEdit|" msgid "Error" msgstr "Error" #: textedit/textedit.cpp:567 msgctxt "TextEdit|" msgid "Can't load image" msgstr "No puede cargar imagen" #: textedit/textedit.cpp:621 textedit/textedit.cpp:631 msgctxt "TextEdit|" msgid "File way too big" msgstr "Camino del archivo demasiado grande" #: net/voicecallengine.cpp:525 msgctxt "VoiceCallEngine|" msgid "Accept" msgstr "Aceptar" #: net/voicecallengine.cpp:533 msgctxt "VoiceCallEngine|" msgid "Reject" msgstr "Rechazar" #: net/voicecallengine.cpp:535 msgctxt "VoiceCallEngine|" msgid "Close" msgstr "Cerca" #: net/voicecallengine.cpp:551 msgctxt "VoiceCallEngine|" msgid "Actual network address (SHA1) of the peer operator" msgstr "DirecciУГn de red real (SHA1) del operador de grupo" #: net/voicecallengine.cpp:554 msgctxt "VoiceCallEngine|" msgid "Network address of the remote node" msgstr "DirecciУГn de red del nodo remoto" #: net/voicecallengine.cpp:564 msgctxt "VoiceCallEngine|" msgid "Operator" msgstr "Operador" #: net/voicecallengine.cpp:567 msgctxt "VoiceCallEngine|" msgid "Node address" msgstr "DirecciУГn del nodo" #: net/voicecallengine.cpp:570 msgctxt "VoiceCallEngine|" msgid "Call status" msgstr "Estado de la llamada" #: net/voicecallengine.cpp:573 msgctxt "VoiceCallEngine|" msgid "Controls" msgstr "Controles" #: net/voicecallengine.cpp:576 msgctxt "VoiceCallEngine|" msgid "Ending" msgstr "Finalizando" #: net/voicecallengine.cpp:613 msgctxt "VoiceCallEngine|" msgid "Initializing" msgstr "Inicializando" #: net/voicecallengine.cpp:616 msgctxt "VoiceCallEngine|" msgid "Incoming" msgstr "Entrante" #: net/voicecallengine.cpp:619 msgctxt "VoiceCallEngine|" msgid "Open" msgstr "Abierto" #: net/voicecallengine.cpp:622 msgctxt "VoiceCallEngine|" msgid "Closing" msgstr "Cerrando" #: net/voicecallengine.cpp:625 msgctxt "VoiceCallEngine|" msgid "Closed" msgstr "Cerrado" #: net/voicecallengine.cpp:628 msgctxt "VoiceCallEngine|" msgid "Error" msgstr "Error" #: net/voicecallengine.cpp:631 msgctxt "VoiceCallEngine|" msgid "No call" msgstr "Sin llamada" #: net/voicecallengine.cpp:834 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible" msgstr "Llamada de audio no es posible" #: net/voicecallengine.cpp:840 msgctxt "VoiceCallEngine|" msgid "Audio call is possible" msgstr "La llamada de audio es posible" #: net/voicecallengine.cpp:847 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator address unknown" msgstr "La llamada de audio no es posible: direcciУГn del operador desconocida" #: net/voicecallengine.cpp:853 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator profile not found" msgstr "" "La llamada de audio no es posible: no se encuentra perfil del operador" #: net/voicecallengine.cpp:856 msgctxt "VoiceCallEngine|" msgid "" "Audio call is not possible: operator has no node information in profile" msgstr "" "La llamada de audio no es posible: el operador no tiene informaciУГn de nodo " "en el perfil" #: net/voicecallengine.cpp:875 #, qt-format msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operators IPv4 address %1 not connected" msgstr "" "La llamada de audio no es posible: la direcciУГn IPv4 %1 del operador no " "conectada" #: net/voicecallengine.cpp:882 #, qt-format msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operators IPv6 address %1 not connected" msgstr "" "La llamada de audio no es posible: la direcciУГn IPv6 %1 del operador no " "conectada" #: net/voicecallengine.cpp:893 msgctxt "VoiceCallEngine|" msgid "" "Audio call is not possible: local node has no IPv6 address, operator has " "only IPv6 addr" msgstr "" "La llamada de audio no es posible: el nodo local no tiene direcciУГn IPv6, el" " operador sУГlo tiene direcciУГn IPv6" #: net/voicecallengine.cpp:895 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator does not publish network address" msgstr "" "La llamada de audio no es posible: el operador no publica direcciУГn de red" #: ui/aboutDialog.ui:26 msgctxt "aboutDialog|" msgid "About classified ads" msgstr "Sobre classified ads" #: ui/aboutDialog.ui:100 msgctxt "aboutDialog|" msgid " Classified ads is a program for online communications" msgstr " Classified ads es un programa para comunicaciones en lУ­nea" #: ui/aboutDialog.ui:163 msgctxt "aboutDialog|" msgid "" "

Classified ads is free software. You may use, copy and" " modify it if you follow the conditions given in GNU lesser general public " "license version 2.1.

Classified ads is copyright ТЉ Antti JУЄrvinen " "2013.

Main feature of the program is an "advertisement" - a" " piece of text belonging to selected classification. There are several pre-" "programmed classifications and operators are encouraged to invent new " "classifications for new purposes ; the selection boxes in classification-" "selection tab are editable. Other operators may then view the ads, publicly " "comment the ads, the operators and also send private messages to each " "others.

Another important feature of classified ads is that it is " "designed to be operated without any centralized server infrastructure - it " "is you and other operators whose computers store and transmit all the " "content visible inside classified ads. To get connected you need to know " "address of at least one existing computer (a node) so if your network connection dialog shows no " "connections, you may need to contact someone you know is using the software " "and ask for address of her node to make initial contact with the network. " "Once connected the software should maintain list of addresses of other " "nodes.

Due to its server-less design the whole system works best if " "you leave the program running always when you have your computer powered on " "; while processing other operators requests it will hog some computing " "resources and generate network traffic also when you are not actively using " "the program yourself - others are.

Operators concerned about privacy " "of the content should be aware of following items:

- Data storage " "implementation is variant of distributed" " hash table, practically meaning that content posted by you gets " "copied some more-or-less random nodes in the network.

- Any data item" " (ad, comment, binary file, private message etc.) is digitally signed. This " "makes it more difficult to try to pose as another operator.

- " "Operators are reliably identified only by the SHA1 hash of their generated " "encryption keys. SHA1 hash is displayed when viewing details of operator " "profiles. Other identifying information like nickname or city name are " "entered by operator himself and can be anything. The operator profile, as it" " is published to the network, is also signed with the encryption keys of the" " operator - if you identify an operator by her SHA1 hash, you have a " "mechanism for identifying if any content inside classified ads is posted by " "this operator or not. Classified ads internally checks for digital " "signatures, throwing away content that fails signature check and tries to " "provide SHA1 hash of the operator who posted the content.

- All " "classified ads are posted as plain text, no encryption is used. All public " "profiles are posted as plain text, no encryption is used. If profile is made" " private, it is encrypted to be readable only by selected other profiles. " "This applies also to binary files shared by operators private profiles and " "comments about private profiles after the profile was made private " "(previously plain-text comments or files don't get magically encrypted " "afterwards). Private messages are encrypted always to be readable only by " "recipient and sender. Attachments follow the privacy rules of the document, " "they're attached to.

- As is the case with all internet-" "communications, this small fact is true for classified ads too : once something gets posted online, there is no" " way to remove it from network.

- Data encryption " "implementation for content is OpenSSL, relying mostly on algorithms RSA-2048" " and AES-256.

- While connections between nodes are implemented using" " SSL, other nodes inside network do get to know what content is being " "transmitted in neighboring nodes. While there is no central point for easily" " collecting this information about particular classification or operator, " "operators still should expect no privacy regarding their doings online, " "although some effort has been been put into hiding contents of private messages and private profiles. " "

Programming was (mostly) done by Antti JУЄrvinen, artwork by Meeri " "JУЄrvinen.

This product includes software developed by the OpenSSL " "Project for use in the OpenSSL Toolkit " "(http://www.openssl.org/).

Happy " "advertising!


" msgstr "" "

Classified ads es un software libre. Usted puede " "usarlo, copiarlo y modificarlo siguiendo las condiciones dadas por la " "licencia publica general menor GNU 2.1.

Classified ads copyright ТЉ " "Antti JУЄrvinen 2013.

La principal funciУГn de este programa es la " ""publicidad" - una pieza de texto que pertenece a la clasificaciУГn" " seleccionada. Existen varias clasificaciones pre programadas y a los " "operadores se les anima a inventar nuevas clasificaciones con nuevos " "propУГsitos; las cajas de selecciУГn en el tabular de selecciУГn de " "clasificaciУГn son editables. Otros operadores pueden ver ads, comentar " "pУКblicamente ads, los operadores y tambiУЉn enviar mensajes privados unos a " "otros.

Otra caracterУ­stica importante de classified ads es que estУЁ " "diseУБado para operar sin ninguna infraestructura de servidor centralizada т€“ " "es usted y los otros operadores quienes en sus ordenadores almacenan y " "transmiten todo el contenido visible dentro de classified ads. Para estar " "conectado usted necesita saber la direcciУГn de al menos un ordenador " "existente (a node) de modo que si" " cuadro de diУЁlogo de conexiУГn de red muestra que no hay conexiones, usted " "puede necesitar contactar con alguien del que usted sepa que estУЁ utilizando" " el software y pedirle la direcciУГn de su nodo para hacer el contacto " "inicial con la red. Una vez conectado el software mantendrУЁ una lista de las" " direcciones de los otros nodos.

Debido a su diseУБo sin servidor todo" " el sistema trabaja mejor si usted deja el programa corriendo siempre que el" " ordenador estУЉ encendido; puesto que el procesamientos de peticiones de " "otros operadores consumirУЁ algunos recursos de computaciУГn y generarУЁ " "trУЁfico de red tambiУЉn cuando usted no estУЉ usando el programa activamente т€“" " otros lo estУЁn.

Los operadores preocupados con la privacidad del " "contenido deberУ­an estar atentos a los siguientes puntos:

- La " "implementaciУГn del almacenamiento de datos es una variante de la tabla de hash distribuida, " "prУЁcticamente significa que el contenido publicado por usted se copia mУЁs o " "menos al azar en algunos nodos de la red.

- Cualquier elemento de " "datos (ad, comentario, archivo binario, mensaje privado, etc.) es firmado " "digitalmente. Esto hace mУЁs difУ­cil hacerse pasar por otro operador. " "

- Los operadores son seguramente identificados por el hash SHA1 de " "sus claves de encriptaciУГn generadas. El hash SHA1 se muestra cuando se " "visualizan los detalles del perfil del operador. Otras informaciones de " "identificaciУГn como apodo o nombre de la ciudad son introducidas por el " "mismo operador y pueden ser cualquiera. El perfil del operador, como se " "publica en la red, tambiУЉn estУЁ firmado con la clave de encriptaciУГn del " "operador т€“ si usted identifica a un operador por su hash SHA1, usted tiene " "un mecanismo para identificar si cualquier contenido dentro de classified " "ads estУЁ enviado por el operador o no. Classified ads internamente comprueba" " las firmas digitales, tirando el contenido que falla en la comprobaciУГn de " "firma e intentando suministrar el hash SHA1 del operador que publicУГ el " "contenido.

- Todo classified ads se publica como texto plano, no se " "usa encriptaciУГn. Todos los perfiles publicos se publican como texto plano, " "no se usa encriptaciУГn. Si el perfil se hace privado, se encripta para ser " "legible sУГlo por otros perfiles seleccionados. Esto se aplica tambiУЉn a los " "archivos binarios compartidos por operadores con perfiles privados y " "comentarios sobre los perfiles privados despuУЉs de que el perfil se haya " "hecho privado (los comentarios en texto plano o los archivos no son " "mУЁgicamente encriptados despuУЉs). Los mensajes privados son encriptados " "siempre para ser leУ­dos solo por el receptor y el emisor. Los adjuntos " "siguen las reglas de privacidad del documento al que se adjuntan.

- " "Como en el caso de todas las comunicaciones en internet, este pequeУБo hecho " "es cierto para classified ads tambiУЉn : una vez que algo se ha publicado en lУ­nea, no hay modo de " "borrarlo de la red.

- La implementaciУГn de encriptaciУГn de " "datos para el contenido es OpenSSL, confiando mayormente en los algoritmos " "RSA-2048 y AES-256.

- Puesto que las conexiones entre nodos son " "implementadas usando SSL, Otros nodos dentro de la red llegan a saber quУЉ " "contenido se estУЁ transmitiendo en los nodos vecinos. Puesto que no hay un " "punto central para recolectar fУЁcilmente esta informaciУГn sobre una " "clasificaciУГn o un operador concreto, los operadores no deben esperar " "privacidad sobre sus actividades en lУ­nea, aunque se han hecho algunos " "esfuerzos para ocultarlos contents de mensajes y perfiles privados.

La " "programaciУГn fue (mayoritariamente) hecha por Antti JУЄrvinen, el arte por " "Meeri JУЄrvinen.

Este producto incluye software desarrollador por " "OpenSSL Project para su uso en OpenSSL Toolkit " "(http://www.openssl.org/).

Feliz " "publicidad!


" #: ui/attachmentListDialog.ui:26 msgctxt "attachmentListDialog|" msgid "List of attached files" msgstr "Lista de archivos adjuntos" #: ui/callStatusDialog.ui:26 msgctxt "callStatusDialog|" msgid "Call status" msgstr "Estado de la llamada" #: ui/callStatusDialog.ui:49 msgctxt "callStatusDialog|" msgid "Input level" msgstr "Nivel de entrada" #: ui/callStatusDialog.ui:65 msgctxt "callStatusDialog|" msgid "Audio calls" msgstr "Llamadas de audio" #: ui/callStatusDialog.ui:90 msgctxt "callStatusDialog|" msgid "Output level" msgstr "Nivel de salida" #: ui/editContact.ui:26 msgctxt "editContactDialog|" msgid "Edit a contact" msgstr "Editar un contacto" #: ui/editContact.ui:39 msgctxt "editContactDialog|" msgid "Address (SHA1) of contact" msgstr "DirecciУГn (SHA1) de contacto" #: ui/editContact.ui:53 msgctxt "editContactDialog|" msgid "Local nickname" msgstr "Apodo local" #: ui/editContact.ui:65 msgctxt "editContactDialog|" msgid "" "

Settings some trusted is public information to readers" " of your profile

" msgstr "" "

Configuraciones algunas de las cuales son informaciУГn " "pУКblica para los lectores de tu perfil

" #: ui/editContact.ui:68 msgctxt "editContactDialog|" msgid "This contact is to be publicly trusted in transactions" msgstr "Este contacto debe ser de confianza pУКblica en transacciones" #: frontWidget.ui:14 msgctxt "frontWidget|" msgid "Form" msgstr "Formar" #: frontWidget.ui:39 msgctxt "frontWidget|" msgid "Classified ads" msgstr "Classified ads" #: frontWidget.ui:67 msgctxt "frontWidget|" msgid "Search for classified ads about" msgstr "Buscar sobre classified ads" #: frontWidget.ui:74 msgctxt "frontWidget|" msgid "Perform" msgstr "Realizar" #: frontWidget.ui:97 msgctxt "frontWidget|" msgid "of" msgstr "De" #: frontWidget.ui:113 msgctxt "frontWidget|" msgid "in" msgstr "En" #: frontWidget.ui:123 msgctxt "frontWidget|" msgid "Search" msgstr "Buscar" #: frontWidget.ui:161 msgctxt "frontWidget|" msgid "My profile" msgstr "Mi perfil" #: frontWidget.ui:177 frontWidget.ui:937 msgctxt "frontWidget|" msgid "Profile address" msgstr "DirecciУГn de perfil" #: frontWidget.ui:208 frontWidget.ui:643 msgctxt "frontWidget|" msgid "Nickname" msgstr "Apodo" #: frontWidget.ui:225 frontWidget.ui:669 msgctxt "frontWidget|" msgid "Greeting text" msgstr "Texto de saludo" #: frontWidget.ui:232 msgctxt "frontWidget|" msgid "For the rest of the world. " msgstr "Para el resto del mundo" #: frontWidget.ui:239 frontWidget.ui:695 msgctxt "frontWidget|" msgid "First name" msgstr "Primer Nombre" #: frontWidget.ui:253 frontWidget.ui:715 msgctxt "frontWidget|" msgid "Family name" msgstr "Apellido" #: frontWidget.ui:263 msgctxt "frontWidget|" msgid "City/country" msgstr "Ciudad/paУ­s" #: frontWidget.ui:273 msgctxt "frontWidget|" msgid "BTC address" msgstr "DirecciУГn BTC" #: frontWidget.ui:280 msgctxt "frontWidget|" msgid "If you wish to receive payments via BTC, include your BTC address too." msgstr "" "Si usted desea recibir pagos por medio de BTC, iincluya tambiУЉn su direcciУГn" " BTC." #: frontWidget.ui:287 frontWidget.ui:799 msgctxt "frontWidget|" msgid "State of the world" msgstr "Estado del mundo" #: frontWidget.ui:294 msgctxt "frontWidget|" msgid "Longer explanation about state of the world" msgstr "ExplicaciУГn mУЁs larga sobre el estado del mundo" #: frontWidget.ui:301 msgctxt "frontWidget|" msgid "Profile is private" msgstr "El perfil es privado" #: frontWidget.ui:308 msgctxt "frontWidget|" msgid "Readers of profile" msgstr "Lectores de perfil" #: frontWidget.ui:315 msgctxt "frontWidget|" msgid "None of the fields is mandatory" msgstr "Ninguno de los campos es obligatorio" #: frontWidget.ui:322 msgctxt "frontWidget|" msgid "Time of last update" msgstr "Tiempo desde la УКltima actualizaciУГn" #: frontWidget.ui:342 msgctxt "frontWidget|" msgid "Publish" msgstr "Publicar" #: frontWidget.ui:355 msgctxt "frontWidget|" msgid "Revert changes" msgstr "Revertir los cambios" #: frontWidget.ui:369 msgctxt "frontWidget|" msgid "Details of operator profile:" msgstr "Detalles del perfil del operador:" #: frontWidget.ui:401 msgctxt "frontWidget|" msgid "" "\n" "\n" "Click \n" "to \n" "Add\n" "Image" msgstr "" "\n" "\n" "Pulsar \n" "para \n" "AУБadir\n" "Imagen" #: frontWidget.ui:425 frontWidget.ui:845 msgctxt "frontWidget|" msgid "Shared files" msgstr "Archivos compartidos" #: frontWidget.ui:461 frontWidget.ui:897 msgctxt "frontWidget|" msgid "Latest comments" msgstr "Уšltimos comentarios" #: frontWidget.ui:504 msgctxt "frontWidget|" msgid "Contacts" msgstr "Contactos" #: frontWidget.ui:536 msgctxt "frontWidget|" msgid "Add contact" msgstr "AУБadir contacto" #: frontWidget.ui:543 msgctxt "frontWidget|" msgid "Remove contact" msgstr "Borrar contacto" #: frontWidget.ui:550 msgctxt "frontWidget|" msgid "View profile" msgstr "Visualizar perfil" #: frontWidget.ui:557 msgctxt "frontWidget|" msgid "Send message" msgstr "Enviar mensaje" #: frontWidget.ui:569 msgctxt "frontWidget|" msgid "Private messages" msgstr "Mensajes privados" #: frontWidget.ui:624 msgctxt "frontWidget|" msgid "Profile details" msgstr "Detalles del perfil" #: frontWidget.ui:741 msgctxt "frontWidget|" msgid "City/Country" msgstr "Ciudad/PaУ­s" #: frontWidget.ui:767 msgctxt "frontWidget|" msgid "BTC Addr" msgstr "DirecciУГn BTC" #: frontWidget.ui:829 msgctxt "frontWidget|" msgid "" "




No

Image

Inserted

" msgstr "" "




No

Image

Inserted

" #: frontWidget.ui:874 msgctxt "frontWidget|" msgid "Send message to operator" msgstr "Enviar mensaje al operador" #: frontWidget.ui:879 msgctxt "frontWidget|" msgid "Audio call" msgstr "Llamada de audio" #: frontWidget.ui:884 msgctxt "frontWidget|" msgid "View readers" msgstr "Visualizar lectores" #: frontWidget.ui:932 msgctxt "frontWidget|" msgid "Comment" msgstr "Comentario" #: frontWidget.ui:964 msgctxt "frontWidget|" msgid "Add to contacts" msgstr "AУБadir a contactos" #: ui/insertLink.ui:26 msgctxt "insertLinkDialog|" msgid "Insert link" msgstr "Insertar enlace" #: ui/insertLink.ui:39 msgctxt "insertLinkDialog|" msgid "URL" msgstr "URL" #: ui/insertLink.ui:112 msgctxt "insertLinkDialog|" msgid "Link label in text" msgstr "Enlace a la etiqueta en el texto" #: ui/manualConnectionDialog.ui:26 msgctxt "manualConnectionDialog|" msgid "Manually add node to connection queue" msgstr "AУБadir manualmente nodo a la cola de conexiУГn" #: ui/manualConnectionDialog.ui:48 msgctxt "manualConnectionDialog|" msgid "Remote node listen port" msgstr "Puerto de escucha del nodo remoto" #: ui/manualConnectionDialog.ui:78 msgctxt "manualConnectionDialog|" msgid "Remote node network address" msgstr "DirecciУГn de red del nodo remoto" #: ui/manualConnectionDialog.ui:91 msgctxt "manualConnectionDialog|" msgid "IPv4, IPv6 or DNS name" msgstr "IPv4, IPv6 o nombre DNS" #: ui/metadataQuery.ui:26 msgctxt "metadataQuery|" msgid "File information" msgstr "InformaciУГn del archivo" #: ui/metadataQuery.ui:60 msgctxt "metadataQuery|" msgid "Name of the file:" msgstr "Nombre del archivo:" #: ui/metadataQuery.ui:81 msgctxt "metadataQuery|" msgid "Owner of file (name or SHA1 if CA operator):" msgstr "Propietario del archivo (nombre o SHA1 sio es operador CA):" #: ui/metadataQuery.ui:111 msgctxt "metadataQuery|" msgid "License of use:" msgstr "Licencia de uso:" #: ui/metadataQuery.ui:122 msgctxt "metadataQuery|" msgid "Public domain" msgstr "Dominio pУКblico" #: ui/metadataQuery.ui:127 msgctxt "metadataQuery|" msgid "GPL" msgstr "GPL" #: ui/metadataQuery.ui:132 msgctxt "metadataQuery|" msgid "LGPL" msgstr "LGPL" #: ui/metadataQuery.ui:137 msgctxt "metadataQuery|" msgid "BSD" msgstr "BSD" #: ui/metadataQuery.ui:142 msgctxt "metadataQuery|" msgid "CC-BY" msgstr "CC-BY" #: ui/metadataQuery.ui:147 msgctxt "metadataQuery|" msgid "CC-BY-SA" msgstr "CC-BY-SA" #: ui/metadataQuery.ui:152 msgctxt "metadataQuery|" msgid "CC-BY-ND" msgstr "CC-BY-ND" #: ui/metadataQuery.ui:157 msgctxt "metadataQuery|" msgid "CC-BY-NC" msgstr "CC-BY-NC" #: ui/metadataQuery.ui:162 msgctxt "metadataQuery|" msgid "CC-BY-NC-SA" msgstr "CC-BY-NC-SA" #: ui/metadataQuery.ui:167 msgctxt "metadataQuery|" msgid "CC-BY-NC-ND" msgstr "CC-BY-NC-ND" #: ui/metadataQuery.ui:182 msgctxt "metadataQuery|" msgid "Mime-type:" msgstr "Tipo-Mime:" #: ui/metadataQuery.ui:199 msgctxt "metadataQuery|" msgid "Description of file:" msgstr "DescripciУГn de archivo:" #: ui/metadataQuery.ui:218 msgctxt "metadataQuery|" msgid "Enter information regarding file before publish:" msgstr "Introduzca EinformaciУГn respecto al archivo antes de publicar:" #: ui/newClassifiedAd.ui:26 msgctxt "newCaDialog|" msgid "Post a new classified ad" msgstr "Publicar un nuevo anuncio clasificado" #: ui/newClassifiedAd.ui:47 msgctxt "newCaDialog|" msgid "About" msgstr "Sobre" #: ui/newClassifiedAd.ui:65 msgctxt "newCaDialog|" msgid "of" msgstr "De" #: ui/newClassifiedAd.ui:81 msgctxt "newCaDialog|" msgid "in" msgstr "En" #: ui/newClassifiedAd.ui:95 msgctxt "newCaDialog|" msgid "Subject" msgstr "Asunto" #: ui/newClassifiedAd.ui:129 msgctxt "newCaDialog|" msgid "Attachment: " msgstr "Adjunto: " #: ui/newClassifiedAd.ui:149 msgctxt "newCaDialog|" msgid "Add" msgstr "AУБadir" #: ui/newPrivMsg.ui:26 msgctxt "newPrivMsgDialog|" msgid "Send a private message" msgstr "Enviar un mensaje privado" #: ui/newPrivMsg.ui:39 msgctxt "newPrivMsgDialog|" msgid "Subject" msgstr "Asunto" #: ui/newPrivMsg.ui:53 msgctxt "newPrivMsgDialog|" msgid "Recipient" msgstr "Recipiente" #: ui/newPrivMsg.ui:83 msgctxt "newPrivMsgDialog|" msgid "Attachments: " msgstr "Adjuntos: " #: ui/newPrivMsg.ui:103 msgctxt "newPrivMsgDialog|" msgid "Attach" msgstr "Adjuntar" #: ui/newProfileComment.ui:26 msgctxt "newProfileCommentDialog|" msgid "Comment a operators profile" msgstr "Comentar un perfil de operadores" #: ui/newProfileComment.ui:39 msgctxt "newProfileCommentDialog|" msgid "Subject" msgstr "Asunto" #: ui/newProfileComment.ui:53 msgctxt "newProfileCommentDialog|" msgid "Commented profile" msgstr "Perfil comentado" #: ui/newProfileComment.ui:89 msgctxt "newProfileCommentDialog|" msgid "Attachments:" msgstr "Adjuntos:" #: ui/newProfileComment.ui:109 msgctxt "newProfileCommentDialog|" msgid "Attach" msgstr "Adjuntar" #: ui/newTextDocument.ui:26 msgctxt "newTextDocumentDialog|" msgid "Edit and publish a new text document" msgstr "Editar y publicar un nuevo documento de texto" #: ui/newTextDocument.ui:39 msgctxt "newTextDocumentDialog|" msgid "Document title" msgstr "TУ­tulo del documento" #: ui/newTextDocument.ui:75 msgctxt "newTextDocumentDialog|" msgid "Attachments:" msgstr "Adjuntos:" #: ui/newTextDocument.ui:95 msgctxt "newTextDocumentDialog|" msgid "Attach" msgstr "Adjuntar" #: ui/profileCommentDisplay.ui:26 msgctxt "profileCommentDisplay|" msgid "Comments regarding operator" msgstr "Comentarios acerca del operador" #: ui/profileReadersDialog.ui:26 msgctxt "profileReadersDialog|" msgid "Profile readers list" msgstr "Lista de perfiles de lectores" #: ui/profileReadersDialog.ui:37 msgctxt "profileReadersDialog|" msgid "Search for profiles to add" msgstr "Buscar perfiles para aУБadir" #: ui/profileReadersDialog.ui:44 msgctxt "profileReadersDialog|" msgid "First 100 matching profiles:" msgstr "Primeros 100 perfiles que coinciden:" #: ui/profileReadersDialog.ui:66 msgctxt "profileReadersDialog|" msgid "Add selected to list of readers" msgstr "AУБadir lo seleccionado a la lista de lectores" #: ui/profileReadersDialog.ui:73 msgctxt "profileReadersDialog|" msgid "Current list of readers" msgstr "Lista actual de lectores" #: ui/profileReadersDialog.ui:90 msgctxt "profileReadersDialog|" msgid "Close" msgstr "Cerrar" #: ui/profileReadersDialog.ui:109 msgctxt "profileReadersDialog|" msgid "Remove selected" msgstr "Borrar lo seleccionado" #: ui/searchDisplay.ui:26 msgctxt "searchDisplay|" msgid "Search data storage" msgstr "Buscar almacenamiento de datos" #: ui/searchDisplay.ui:60 msgctxt "searchDisplay|" msgid "Words:" msgstr "Palabras:" #: ui/searchDisplay.ui:70 msgctxt "searchDisplay|" msgid "Search" msgstr "Buscar" #: ui/searchDisplay.ui:87 msgctxt "searchDisplay|" msgid "Network search" msgstr "Buscar red" #: ui/searchDisplay.ui:101 msgctxt "searchDisplay|" msgid "Search ads" msgstr "Buscar anuncios" #: ui/searchDisplay.ui:111 msgctxt "searchDisplay|" msgid "Search profiles" msgstr "Buscar perfiles" #: ui/searchDisplay.ui:121 msgctxt "searchDisplay|" msgid "Search comments" msgstr "Buscar comentarios" #: ui/settingsDialog.ui:26 msgctxt "settingsDialog|" msgid "Node settings" msgstr "Ajustes de nodo" #: ui/settingsDialog.ui:39 msgctxt "settingsDialog|" msgid "TCP listen port" msgstr "Puerto TCP de escucha" #: ui/settingsDialog.ui:58 msgctxt "settingsDialog|" msgid "Incoming TCP listen port. Change requires node restart. " msgstr "" "Puerto TCP entrante de escucha. El cambio requiere el reinicio del nodo. " #: ui/settingsDialog.ui:84 msgctxt "settingsDialog|" msgid "DNS name of node" msgstr "Nombre DNS del nodo" #: ui/settingsDialog.ui:91 msgctxt "settingsDialog|" msgid "" "If you have permanent DNS name for your machine, you may type it here to be " "used to reference your node" msgstr "" "Si tiene nombre DNS permanente para su mУЁquina, debe teclearlo aquУ­ para ser" " usado como referencia de su nodo" #: ui/settingsDialog.ui:103 msgctxt "settingsDialog|" msgid "Data store limits:" msgstr "Limites de almacen de datos:" #: ui/settingsDialog.ui:115 msgctxt "settingsDialog|" msgid "Nr of profiles to keep" msgstr "NТК de perfiles a mantener" #: ui/settingsDialog.ui:154 msgctxt "settingsDialog|" msgid "Nr of private messages to keep" msgstr "NТК de mensajes privados a mantener" #: ui/settingsDialog.ui:193 msgctxt "settingsDialog|" msgid "Nr of binary blobs to keep" msgstr "NТК de bloques binarios a mantener" #: ui/settingsDialog.ui:232 msgctxt "settingsDialog|" msgid "Nr of CAs to keep" msgstr "NТК de CAs a mantener" #: ui/settingsDialog.ui:251 msgctxt "settingsDialog|" msgid "" "Number of classified ads to keep in storage, total, including all " "classifications. Oldest referenced will be deleted first." msgstr "" "NУКmero de anuncios clasificados a mantener en el almacenamientos, total, " "incluyendo todas las clasificaciones. Las referencias mУЁs antiguas serУЁn " "borradas primero." #: ui/settingsDialog.ui:274 msgctxt "settingsDialog|" msgid "Nr of profile comments to keep" msgstr "NТК de comentarios de perfil a mantener" #: ui/settingsDialog.ui:313 msgctxt "settingsDialog|" msgid "Nr of db records to keep" msgstr "NТК de perfiles a mantener" #: ui/settingsDialog.ui:316 msgctxt "settingsDialog|" msgid "Ringtone" msgstr "Tono de llamada" #: ui/settingsDialog.ui:324 msgctxt "settingsDialog|" msgid "Bow" msgstr "Arco" #: ui/settingsDialog.ui:329 msgctxt "settingsDialog|" msgid "Electrical" msgstr "ElУЉctrico" #: ui/settingsDialog.ui:334 msgctxt "settingsDialog|" msgid "Acoustic" msgstr "AcУКstico" #: ui/settingsDialog.ui:339 msgctxt "settingsDialog|" msgid "Beep" msgstr "Bip" #: ui/settingsDialog.ui:344 msgctxt "settingsDialog|" msgid "Silence" msgstr "Silencio" #: ui/settingsDialog.ui:356 msgctxt "settingsDialog|" msgid "Accept voice calls" msgstr "Aceptar llamadas de voz" #: ui/settingsDialog.ui:364 msgctxt "settingsDialog|" msgid "All" msgstr "Todo" #: ui/settingsDialog.ui:369 msgctxt "settingsDialog|" msgid "From trusted operators" msgstr "De operadores de confianza" #: ui/settingsDialog.ui:374 msgctxt "settingsDialog|" msgid "Accept no voice calls" msgstr "No aceptar llamadas de voz" #: ui/statusDialog.ui:26 msgctxt "statusDialog|" msgid "Network and connection status" msgstr "Estado de red y conexiУГn" #: ui/statusDialog.ui:48 msgctxt "statusDialog|" msgid "Detected own IPv4" msgstr "Detectada IPv4 propia" #: ui/statusDialog.ui:61 ui/statusDialog.ui:93 msgctxt "statusDialog|" msgid "" "Should your friend have trouble connecting, give her this address with port " "number" msgstr "" "DeberУ­a su amigo tener problemas conectando, de su direcciУГn con nУКmero de " "puerto" #: ui/statusDialog.ui:74 msgctxt "statusDialog|" msgid "IPv6" msgstr "IPv6" #: ui/statusDialog.ui:113 msgctxt "statusDialog|" msgid "TCP port currently used" msgstr "Puerto TCP usado actualmente" #: ui/statusDialog.ui:151 msgctxt "statusDialog|" msgid "Currently open connections" msgstr "Conexiones abiertas actualmente" #: ui/statusDialog.ui:195 msgctxt "statusDialog|" msgid "Manually add connection" msgstr "ConexiУГn aУБadida manualmente" #: ui/statusDialog.ui:202 msgctxt "statusDialog|" msgid "Close" msgstr "Cerrar" #: ui/tclConsole.ui:26 msgctxt "tclConsoleDialog|" msgid "TCL Interpreter console" msgstr "IntУЉrprete TCL" #: ui/tclConsole.ui:51 msgctxt "tclConsoleDialog|" msgid "Evaluate" msgstr "Evaluar" #: ui/tclConsole.ui:58 msgctxt "tclConsoleDialog|" msgid "Close" msgstr "Cerrar" #: ui/tclConsole.ui:69 msgctxt "tclConsoleDialog|" msgid "Interpreter output" msgstr "salida" #: ui/tclConsole.ui:79 msgctxt "tclConsoleDialog|" msgid "Command input" msgstr "entrada" #: ui/tclPrograms.ui:26 msgctxt "tclProgramsDialog|" msgid "TCL programs" msgstr "IntУЉrprete TCL" #: ui/tclPrograms.ui:48 msgctxt "tclProgramsDialog|" msgid "Stored programs" msgstr "Perfiles almacenados" #: ui/tclPrograms.ui:68 msgctxt "tclProgramsDialog|" msgid "Program code" msgstr "CУГdigo de programa" classified-ads-0.13/po/fi.po000066400000000000000000004202271331670245300156770ustar00rootroot00000000000000# Antti JУЄrvinen , 2016. #zanata # Juhani Numminen , 2016. #zanata msgid "" msgstr "" "Project-Id-Version: classified-ads 0.12\n" "Report-Msgid-Bugs-To: antti.jarvinen@katiska.org\n" "POT-Creation-Date: 2016-03-14 21:30+0300\n" "PO-Revision-Date: 2016-07-05 05:59-0400\n" "Last-Translator: Juhani Numminen \n" "Language-Team: Finnish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Zanata 3.9.6\n" "X-Language: fi_FI\n" "X-Qt-Contexts: true\n" # Context menu item text for menu, that appears when right-mouse is clicked on top of a file in a list. #: ui/attachmentlistdialog.cpp:62 msgctxt "AttachmentListDialog|" msgid "Save file to disk.." msgstr "Tallenna tiedostojУЄrjestelmУЄlleт€І" # In file open dialog this is text specifying what kind of files to include in listing, filtered by file name suffix. For example, user wants only PNG files, then text appearing in dialog filter field would say "PNG files (*.png)" and this work "files" here is the word after the word PNG. #: ui/attachmentlistdialog.cpp:153 ui/attachmentlistdialog.cpp:155 msgctxt "AttachmentListDialog|" msgid "files" msgstr "tiedostot" # Appears as dialog title where text asks if user wants to save into "application library" or into local file #: ui/attachmentlistdialog.cpp:162 msgctxt "AttachmentListDialog|" msgid "Save location" msgstr "Mihin tallennetaan" # Dialog text regarding TCL app save location #: ui/attachmentlistdialog.cpp:163 msgctxt "AttachmentListDialog|" msgid "Save to TCL app library instead of regular file?" msgstr "Tallennetaanko TCL-ohjelmien kirjastoon vai tiedostojУЄrjestelmУЄlle?" # Dialog title text for dialog asking user to give a name to file for purpose of saving it to filesystem. #: ui/attachmentlistdialog.cpp:170 msgctxt "AttachmentListDialog|" msgid "Choose file name for saving" msgstr "Valitse nimi tiedostolle" # Dialog title text for error dialog. #: ui/attachmentlistdialog.cpp:181 msgctxt "AttachmentListDialog|" msgid "Error" msgstr "Vikaa" # This gives (no) explanation about reason for "file open failure"? #: ui/attachmentlistdialog.cpp:182 msgctxt "AttachmentListDialog|" msgid "File open error" msgstr "Vika tiedoston avaamisessa" # Error message text displayed when audio output fails immediately due to format conflict. #: call/audioplayer.cpp:65 msgctxt "AudioPlayer|" msgid "raw audio format not supported by backend, cannot play audio." msgstr "У„УЄniformaatti ei ole tuettu, УЄУЄniУЄ ei voi soittaa." # Error message text shown in dialog when audio output is not possible. Possible reason could be missing soundcard or other disastrous failure. #: call/audioplayer.cpp:83 msgctxt "AudioPlayer|" msgid "Could not initialize audio player." msgstr "У„УЄnitoistimen alustus epУЄonnistui." # Title text in a listing view where list of shared files are listed. This particular text gives text for column, where "name or fingerprint of file" is listed. Fingerprint in practice means SHA1 digest. #: datamodel/binaryfilelistingmodel.cpp:173 msgctxt "BinaryFileListingModel|" msgid "Name or fingerprint of file" msgstr "Tiedoston nimi tai SHA1 tiiviste" # Header text for a column-list. The column that gets its header text from this string, is the date-column of an classified ad. #: datamodel/calistingmodel.cpp:50 datamodel/calistingmodel.cpp:143 msgctxt "CAListingModel|" msgid "Date" msgstr "Aika" # Header text for a column-list. The column that gets its header text from this string, is the subject-column of an classified ad. #: datamodel/calistingmodel.cpp:51 datamodel/calistingmodel.cpp:142 msgctxt "CAListingModel|" msgid "Subject" msgstr "Aihe" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Cars in Estonia" and this combobox text here is the first word of that phrase. #: datamodel/camodel.cpp:127 msgctxt "ClassifiedAdsModel|" msgid "Buying" msgstr "Ostetaan" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Selling of Cars in Estonia" and this combobox text here is the first word of that phrase. #: datamodel/camodel.cpp:129 msgctxt "ClassifiedAdsModel|" msgid "Selling" msgstr "MyydУЄУЄn" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Giving away of Cars in Estonia" and this combobox text here is the first+2nd word of that phrase. #: datamodel/camodel.cpp:131 msgctxt "ClassifiedAdsModel|" msgid "Giving away" msgstr "Annetaan" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Wanting of Cars in Estonia" and this combobox text here is the first word of that phrase. #: datamodel/camodel.cpp:133 msgctxt "ClassifiedAdsModel|" msgid "Wanting" msgstr "Halutaan" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Renting of Cars in Estonia" and this combobox text here is the first word of that phrase. #: datamodel/camodel.cpp:135 msgctxt "ClassifiedAdsModel|" msgid "Renting" msgstr "Vuokrataan" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Cars in Estonia" and this combobox text here is the first word of that phrase. #: datamodel/camodel.cpp:137 msgctxt "ClassifiedAdsModel|" msgid "Announcement" msgstr "Ilmoitetaan" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Cars in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:210 msgctxt "ClassifiedAdsModel|" msgid "Cars" msgstr "Autoja" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Boats in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:212 msgctxt "ClassifiedAdsModel|" msgid "Boats" msgstr "VeneitУЄ" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Bikes in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:214 msgctxt "ClassifiedAdsModel|" msgid "Bikes" msgstr "PyУЖriУЄ" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Other vehicles in Estonia" and this combobox text here is the 3rd+4th word of that phrase. #: datamodel/camodel.cpp:216 msgctxt "ClassifiedAdsModel|" msgid "Other vehicles" msgstr "Muita ajoneuvoja" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of vehicle parts in Estonia" and this combobox text here is the 3rd+4th word of that phrase. #: datamodel/camodel.cpp:218 msgctxt "ClassifiedAdsModel|" msgid "Vehicle parts" msgstr "Ajoneuvon osia" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Habitation in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:220 msgctxt "ClassifiedAdsModel|" msgid "Habitation" msgstr "Asumuksia" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Household appliances in Estonia" and this combobox text here is the 3rd+4th word of that phrase. #: datamodel/camodel.cpp:222 msgctxt "ClassifiedAdsModel|" msgid "Household appliances" msgstr "Kodin tavaroita" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Furniture in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:224 msgctxt "ClassifiedAdsModel|" msgid "Furniture" msgstr "Huonekaluja" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Clothing in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:226 msgctxt "ClassifiedAdsModel|" msgid "Clothing" msgstr "Vaatteita" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Tools in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:228 msgctxt "ClassifiedAdsModel|" msgid "Tools" msgstr "TyУЖkaluja" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Tools in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:230 msgctxt "ClassifiedAdsModel|" msgid "Sports" msgstr "UrheiluvУЄlineitУЄ" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Music in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:232 msgctxt "ClassifiedAdsModel|" msgid "Music" msgstr "MusiikkivУЄlineitУЄ" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Books in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:234 msgctxt "ClassifiedAdsModel|" msgid "Books" msgstr "Kirjoja" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Movies in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:236 msgctxt "ClassifiedAdsModel|" msgid "Movies" msgstr "Elokuvia" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Animals in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:238 msgctxt "ClassifiedAdsModel|" msgid "Animals" msgstr "ElУЄimiУЄ" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Electronics in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:240 msgctxt "ClassifiedAdsModel|" msgid "Electronics" msgstr "SУЄhkУЖlaitteita" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Jobs in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:242 msgctxt "ClassifiedAdsModel|" msgid "Jobs" msgstr "TyУЖpaikkoja" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Wanting of Transportation in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:244 msgctxt "ClassifiedAdsModel|" msgid "Transportation" msgstr "Kuljetuksia" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Buying of Services in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:246 msgctxt "ClassifiedAdsModel|" msgid "Services" msgstr "Palveluita" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Selling of Healthcare in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:248 msgctxt "ClassifiedAdsModel|" msgid "Healthcare" msgstr "Terveydenhoitoa" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Selling of Foodstuff in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:250 msgctxt "ClassifiedAdsModel|" msgid "Foodstuff" msgstr "Ruokatarvikkeita" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Selling of Software in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:252 msgctxt "ClassifiedAdsModel|" msgid "Software" msgstr "Ohjelmistoja" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Events in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:254 msgctxt "ClassifiedAdsModel|" msgid "Events" msgstr "Tapahtumia" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Giving away of Education in Estonia" and this combobox text here is the 4th word of that phrase. #: datamodel/camodel.cpp:256 msgctxt "ClassifiedAdsModel|" msgid "Education" msgstr "Koulutusta" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Finance in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:258 msgctxt "ClassifiedAdsModel|" msgid "Finance" msgstr "Raha-asioita" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Selling of Jewelry in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:260 msgctxt "ClassifiedAdsModel|" msgid "Jewelry" msgstr "Koruja" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of religious rituals in Estonia" and this combobox text here is the 3rd+4th word of that phrase. #: datamodel/camodel.cpp:262 msgctxt "ClassifiedAdsModel|" msgid "Religious rituals" msgstr "Uskonnollisia toimituksia" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Philosophy in Estonia" and this combobox text here is the 3rd word of that phrase. #: datamodel/camodel.cpp:264 msgctxt "ClassifiedAdsModel|" msgid "Philosophy" msgstr "Filosofiaa" # Drop-down combobox-item text. This appears in context where the classification is selected. In UI there will be text like "Announcement of Philosophy in Any country" and this combobox text here is end part "Any country" specifying the location where announcement. #: datamodel/camodel.cpp:908 msgctxt "ClassifiedAdsModel|" msgid "Any country" msgstr "MissУЄ maassa vain" # Tool tip text. When user hovers mouse cursor on top of network address field in a dialog, this text will appear. #: datamodel/connectionlistingmodel.cpp:142 msgctxt "ConnectionListingModel|" msgid "Peer network address" msgstr "Solmun verkko-osoite" # Tool tip text. When user hovers mouse cursor on top of field specifying if connection is inbound/outbound this text will appear. #: datamodel/connectionlistingmodel.cpp:145 msgctxt "ConnectionListingModel|" msgid "Inbound connections are those where peer initiated connection" msgstr "" "SisУЄУЄntulevat yhteydet ovat sellaisia, missУЄ etУЄjУЄrjestelmУЄ aloitti yhteyden" # Tool tip text. When user hovers mouse cursor on top of traffic-counter field in a dialog, this text will appear. #: datamodel/connectionlistingmodel.cpp:148 msgctxt "ConnectionListingModel|" msgid "Data transferred from peer to your node" msgstr "Sinun tietokoneeseesi tУЄstУЄ solmusta siirretty tietomУЄУЄrУЄ" # Tool tip text. When user hovers mouse cursor on top of traffic-counter field in a dialog, this text will appear. #: datamodel/connectionlistingmodel.cpp:151 msgctxt "ConnectionListingModel|" msgid "Data transferred to peer from your node" msgstr "Sinun tietokoneestasi tУЄhУЄn verkon solmuun siirretty tietomУЄУЄrУЄ" # Tool tip text. When user hovers mouse cursor on top of time-field in a dialog, this text will appear. #: datamodel/connectionlistingmodel.cpp:154 msgctxt "ConnectionListingModel|" msgid "Time when connection was opened" msgstr "Yhteyden avaamisaika" # Column header text. Column view is used for listing network connections currently open, this text here gives title for column that shows network address (like IP-address) #: datamodel/connectionlistingmodel.cpp:164 msgctxt "ConnectionListingModel|" msgid "Address" msgstr "Verkko-osoite" # Column header text. Column view is used for listing network connections currently open, this text here gives title for column that shows direction (inbound/outbound) of the connection #: datamodel/connectionlistingmodel.cpp:167 msgctxt "ConnectionListingModel|" msgid "Inbound" msgstr "SisУЄУЄntuleva" # Column header text. Column view is used for listing network connections currently open, this text here gives title for column that shows number of bytes transferred inside #: datamodel/connectionlistingmodel.cpp:170 msgctxt "ConnectionListingModel|" msgid "Bytes in" msgstr "Oktettia sisУЄУЄn" # Column header text. Column view is used for listing network connections currently open, this text here gives title for column that shows number of bytes transferred outside #: datamodel/connectionlistingmodel.cpp:173 msgctxt "ConnectionListingModel|" msgid "Bytes out" msgstr "Oktettia ulos" # Column header text. Column view is used for listing network connections currently open, this text here gives title for column that shows time when connection was opened. #: datamodel/connectionlistingmodel.cpp:176 msgctxt "ConnectionListingModel|" msgid "Open time" msgstr "Avaamisaika" # Text in contact listing column view. This text appears in column telling if user is to be trusted or not and this value here denotes the positive case "user is trusted". #: datamodel/contactlistingmodel.cpp:73 msgctxt "ContactListingModel|" msgid "Yes" msgstr "Tosi on" # Text in contact listing column view. This text appears in column telling if user is to be trusted or not and this value here denotes the negative case "user trust is unknown". #: datamodel/contactlistingmodel.cpp:75 msgctxt "ContactListingModel|" msgid "Unknown" msgstr "Tuntematon" # Tool tip text. When user hovers mouse cursor on top of field where operators SHA1 digest is shown, this text appears. The field is part of contact listing view, where users frequent contacts are shown. #: datamodel/contactlistingmodel.cpp:98 msgctxt "ContactListingModel|" msgid "Actual network address (SHA1) of the contact" msgstr "Operaattorin varsinainen verkko-osoite (SHA1)" # Tool tip text. When user hovers mouse cursor on top of field where operators locally given nickname is shown, this text appears. The field is part of contact listing view, where users frequent contacts are shown. #: datamodel/contactlistingmodel.cpp:101 msgctxt "ContactListingModel|" msgid "Locally given nickname ; user may set her own nickname himself" msgstr "Antamasi liikanimi; operaattori voi antaa itselleen eri liikanimen" # Tool tip text. When user hovers mouse cursor on top of field where operators trustworthiness (boolean value) in users opinion is shown, this text appears. The field is part of contact listing view, where users frequent contacts are shown. #: datamodel/contactlistingmodel.cpp:104 msgctxt "ContactListingModel|" msgid "Public statement if this operator to be trusted in transactions" msgstr "Julkinen lausunto operaattorin luotettavuudesta asioiden hoitamisessa" # Column header text. Used in column view where operators frequent contacts are shown. This text gives title to column that shows operators network address (the SHA digest of operator) #: datamodel/contactlistingmodel.cpp:114 msgctxt "ContactListingModel|" msgid "Address" msgstr "Osoite" # Column header text. Used in column view where operators frequent contacts are shown. This text gives title to column that shows operators nickname #: datamodel/contactlistingmodel.cpp:117 msgctxt "ContactListingModel|" msgid "Nickname" msgstr "Liikanimi" # Column header text. Used in column view where operators frequent contacts are shown. This text gives title to column that shows operators trustworthiness. #: datamodel/contactlistingmodel.cpp:120 msgctxt "ContactListingModel|" msgid "Publicly trusted" msgstr "Julkisesti luotettu" # Error message that is displayed when SSL key generation failed. Text is displayed in a dialog, after user dismisses the dialog, whole application will exit. #: datamodel/contentencryptionmodel.cpp:94 msgctxt "ContentEncryptionModel|" msgid "SSL key generation went wrong, calling exit.." msgstr "SSL-avaimen rakentaminen epУЄonnistui, pakko poistua.." # Error message that is displayed when x509 certificate generation failed. Text is displayed in a dialog, after user dismisses the dialog, whole application will exit. #: datamodel/contentencryptionmodel.cpp:104 msgctxt "ContentEncryptionModel|" msgid "x509 cert generation went wrong, calling exit.." msgstr "x509-sertifikaatin rakentaminen epУЄonnistui, pakko poistua.." # Error message that is displayed when RSA private key could not be saved to database. This is rather fatal error, the operator profile that user tried to create will be un-usable. #: datamodel/contentencryptionmodel.cpp:202 #: datamodel/contentencryptionmodel.cpp:300 msgctxt "ContentEncryptionModel|" msgid "RSA Private key key saving went wrong" msgstr "Salaisen RSA-avaimen tallettaminen epУЄonnistui" # Error message text. This is displayed in situation where user tried to access content that he does not have encryption key for. This may appear frequently during normal operation and is no fatal error, only telling user that he is not going to see the content he was trying to access. #: datamodel/contentencryptionmodel.cpp:650 msgctxt "ContentEncryptionModel|" msgid "No suitable de-cryption key found" msgstr "Avaamiseen sopivaa salausavainta ei ole kУЄytettУЄvissУЄ" # Window title text for whole application. #: controller.cpp:194 msgctxt "Controller|" msgid "Classified ads" msgstr "Luokitellut ilmoitukset" # Prompt text for password dialog #: controller.cpp:226 msgctxt "Controller|" msgid "Enter password for protection of your messages:" msgstr "Anna salasana viestiesi sisУЄllУЖn turvaamiseksi" # Dialog text for a wait dialog (a progress-bar like thing will be shown next to this text and user is supposed to sit down and wait a moment..) #: controller.cpp:618 msgctxt "Controller|" msgid "Fetching item from network.." msgstr "Kaivellaan kohdetta verkon syУЖvereistУЄ.." # Menu item text used in "File" menu item and when this particular item is selected, application will close #: controller.cpp:674 msgctxt "Controller|" msgid "E&xit" msgstr "Sulje" # Menu item tooltip-text used in "File" menu entry and when this particular item is selected, application will close #: controller.cpp:676 msgctxt "Controller|" msgid "Exit the application" msgstr "Sulje sovellus" # Menu item text used in "File" menu and when this particular item is selected, application will show a dialog telling why this application is and how to use it #: controller.cpp:678 msgctxt "Controller|" msgid "&About" msgstr "Tietoja" # Tooltip-text of menu item text used in "File" menu and when this particular item is selected, application will show a dialog telling why this application is and how to use it #: controller.cpp:679 msgctxt "Controller|" msgid "Show the application's About box" msgstr "EsitУЄ selvitys sovelluksen tarkoituksesta" # Menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to change her password #: controller.cpp:681 msgctxt "Controller|" msgid "&Change password" msgstr "Vaihda salasana" # Tooltip-item for a menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to change her password #: controller.cpp:682 msgctxt "Controller|" msgid "Change password of current profile" msgstr "Valitse valitulle operaattori-profiilille uusi salasana" # Menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to enter password for a newly-created user profile #: controller.cpp:684 msgctxt "Controller|" msgid "Create &new profile" msgstr "Luo uusi profiili" # Tooltip-text for a menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to enter password for a newly-created user profile #: controller.cpp:685 msgctxt "Controller|" msgid "Makes a brand new user profile" msgstr "Luo operaattorille uuden profiilin" # Menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to confirm deletion of currently open operator profile #: controller.cpp:687 msgctxt "Controller|" msgid "&Delete current profile" msgstr "Poista valittu profiili" # Tooltip-text for a menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to confirm deletion of currently open profile #: controller.cpp:688 msgctxt "Controller|" msgid "Deletes currently open profile" msgstr "PysyvУЄsti poistaa tУЄmУЄnhetkisen valitun profiilin" # Menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to enter password of another profile that user will use next #: controller.cpp:690 msgctxt "Controller|" msgid "&Select another profile" msgstr "Valitse kУЄyttУЖУЖn toinen profiilii" # Tooltip-text for a menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to enter password of another profile that user will use next #: controller.cpp:691 msgctxt "Controller|" msgid "If you have multitude of profiles" msgstr "Jos olet luonnut useamman profiilin, voit tУЄstУЄ valita toisen" # Menu item text used in "File" menu and when this particular item is selected, application will show a settings-dialog #: controller.cpp:693 msgctxt "Controller|" msgid "Settings.." msgstr "Asetukset.." # Tooltip-text for a menu item text used in "File" menu and when this particular item is selected, application will show a dialog prompting user to enter password of another profile that user will use next #: controller.cpp:694 msgctxt "Controller|" msgid "Node-wide settings.." msgstr "Solmun asetukset.." # Menu item text used in "File" menu and when this particular item is selected, application will show a dialog detailing network connectivity of the node #: controller.cpp:696 msgctxt "Controller|" msgid "Network status.." msgstr "Verkko-yhteydet.." # Menu item text used in "File" menu and when this particular item is selected, application will show a search-dialog #: controller.cpp:698 msgctxt "Controller|" msgid "Search.." msgstr "Etsi.." # Menu bar title text for "File" menu. #: controller.cpp:715 msgctxt "Controller|" msgid "&File" msgstr "Tiedosto" # Menu title. Menu contains menu-items related to TCL-programs. #: controller.cpp:729 msgctxt "Controller|" msgid "&TCL Programs" msgstr "TCL-Ohjelmat" # Menu item from menu of TCL-related items. Selecting this menu item opens library of TCL programs. #: controller.cpp:730 msgctxt "Controller|" msgid "&Local library" msgstr "TCL-Ohjelmakirjasto" # Tooltip-text for menu item that opens local TCL program library. #: controller.cpp:731 msgctxt "Controller|" msgid "Locally stored TCL programs" msgstr "Paikallisen ohjelmakirjaston TCL-ohjelmat." # Difficult to translate: after selecting this menu-item you can write ad-hoc TCL programs to TCL interpreter that may be already executing existing program or is empty. Practically gives TCL command line access to possibly running interpreter. #: controller.cpp:734 msgctxt "Controller|" msgid "TCL &Console" msgstr "TCL-Komentokehote" # Tooltip for menu-item that displays dialog where you can type in ad-hoc TCL-programs. #: controller.cpp:735 msgctxt "Controller|" msgid "Display interpreter console" msgstr "TCL-tulkin komennot" # Password dialog prompt. #: controller.cpp:771 msgctxt "Controller|" msgid "Enter new password:" msgstr "Anna uusi salasana:" # Password dialog prompt. In this case the password dialog is not used for giving initial password or change password but instead password is typed for the reason of selection of another operator profile to be used. #: controller.cpp:799 controller.cpp:959 msgctxt "Controller|" msgid "Activate another profile with password" msgstr "Valitse uusi profiili antamalla haluamasi profiilin salasana" # Error message shown in dialog in situation where user tried to delete the last (one and only) operator profile in machine. There needs to be at least one profile and this error message is shown if user tries to get around that limitation. #: controller.cpp:944 msgctxt "Controller|" msgid "Can't delete only profile." msgstr "ViimeistУЄ jУЄljellУЄ olevaa profiilia ei voi poistaa." # Text shown in title of confirmation dialog. #: controller.cpp:948 msgctxt "Controller|" msgid "Permanently discard profile?" msgstr "Poistetaanko profiili lopullisesti?" # Text shown inside a confirmation dialog. Dialog will have buttons OK and Cancel and this is the question. #: controller.cpp:949 msgctxt "Controller|" msgid "There will be NO way to access content of this profile later" msgstr "" "TУЄmУЄn profiilin viestejУЄ tai muuta sisУЄltУЖУЄ ei ole mahdollista nУЄhdУЄ enУЄУЄ" # Error message that is shown in a dialog in situation where previously stored encryption keys of the node could not be accessed. Rather fatal error, will render node un-usable. #: controller.cpp:1012 msgctxt "Controller|" msgid "Cant load node cert or key cert" msgstr "Solmun salausavaimen tai sertifikaatin lataaminen ei onnistunut" # Error message dialog title text for a dialog that is shown in a dialog in situation where something bad happened during a filesystem file operation. Actual explanation of the error is shown inside the dialog whose title text this is. #: controller.cpp:1017 msgctxt "Controller|" msgid "File error" msgstr "TiedostokУЄsittelyyn liittyvУЄ virhe" # Error message dialog title text for a dialog that is shown in a dialog in situation where something bad happened during database operation. Actual explanation of the error is shown inside the dialog whose title text this is. #: controller.cpp:1022 msgctxt "Controller|" msgid "Database error" msgstr "Tietokantavirhe" # Error message dialog title text for a dialog that is shown in a dialog in situation where something bad happened during a operation inside crypto-module. Actual explanation of the error is shown inside the dialog whose title text this is. #: controller.cpp:1028 controller.cpp:1038 msgctxt "Controller|" msgid "Cryptographic module" msgstr "SalausjУЄrjestelmУЄn virhe" # Error message dialog title text for a dialog that is shown in a dialog in situation where something bad happened during operation inside database module. Actual explanation of the error is shown inside the dialog whose title text this is. #: controller.cpp:1033 msgctxt "Controller|" msgid "Database module" msgstr "Tietokannan vikatila" # Error message dialog title text for a dialog that is shown in a dialog in situation when password supplied by user was not good for any purpose. Actual explanation of the error is shown inside the dialog whose title text this is. #: controller.cpp:1039 msgctxt "Controller|" msgid "Bad password" msgstr "Kelpaamaton salasana" # Dialog title for error dialog that displays error message originating from TCL-interpereter. #: controller.cpp:1043 msgctxt "Controller|" msgid "TCL Interpreter" msgstr "TCL-Ohjelma" # Error message text inside a dialog when user had requested for an item to be opened but program could not find the requested item. #: controller.cpp:1276 msgctxt "Controller|" msgid "Could not find item from network.." msgstr "Haluttua kohdetta ei verkosta lУЖytynyt.." # Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies SHA1 digest of the file. #: controller.cpp:1396 msgctxt "Controller|" msgid "SHA1: " msgstr "SHA1:" # Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies mime-type of the file #: controller.cpp:1401 msgctxt "Controller|" msgid "Mime-Type: " msgstr "Mime-Tyyppi:" # Text field explanation text. Part of "file details" dialog. This text gives explanation of field that gives longer explanation of the file #: controller.cpp:1407 msgctxt "Controller|" msgid "Description: " msgstr "Kuvaus:" # Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies name of publisher of the file (in practice, who uploaded the file into classified ads) #: controller.cpp:1413 msgctxt "Controller|" msgid "Publisher: " msgstr "Julkaisija:" # Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies name of the person (or organization) that owns (in copyright sense) the file or its contents. #: controller.cpp:1419 msgctxt "Controller|" msgid "Content owner: " msgstr "SisУЄllУЖn omistaja:" # Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies the license of the file #: controller.cpp:1425 msgctxt "Controller|" msgid "License: " msgstr "Lisenssi:" # Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies file name #: controller.cpp:1431 msgctxt "Controller|" msgid "Name: " msgstr "Nimi:" # Text field explanation text. Part of "file details" dialog. This text gives explanation of field that specifies file date #: controller.cpp:1438 msgctxt "Controller|" msgid "Date: " msgstr "PУЄivУЄmУЄУЄrУЄ:" # Error message text shown inside dialog when user tries to select for operation a file that is much much too big. (there is currently 2MB size limit for shared files) #: ui/dialogbase.cpp:48 ui/dialogbase.cpp:102 msgctxt "DialogBase|" msgid "File way too big" msgstr "Tiedosto on ihan liian iso" # Error message text shown inside dialog when user tries to select for operation a file that is just-and-just too big. (there is currently 2MB size limit for shared files) #: ui/dialogbase.cpp:56 ui/dialogbase.cpp:110 msgctxt "DialogBase|" msgid "File too big" msgstr "Tiedosto on liian iso" # Error message text shown inside dialog when user tries to select for operation a file that can not be opened (for example due to file permission reasons) #: ui/dialogbase.cpp:86 ui/dialogbase.cpp:132 msgctxt "DialogBase|" msgid "File open error" msgstr "Ongelma tiedoston avaamisessa" # Dialog title text. Dialog prompts user to select the filesystem file that will be published inside classified ads. #: ui/dialogbase.cpp:95 msgctxt "DialogBase|" msgid "Select file to be published" msgstr "Valitse julkaistava tiedosto" # Text for file type filter field in file-selection-dialog #: ui/dialogbase.cpp:97 msgctxt "DialogBase|" msgid "Files (*.*)" msgstr "Kaikki tiedostot (*.*)" # Title text of error dialog. #: ui/editcontact.cpp:72 msgctxt "EditContactDialog|" msgid "Error" msgstr "Vikaa" # Contet text of error dialog. Shown after user has tried to enter operator address with intent of adding it to contact-list and the operator address fails format validation. #: ui/editcontact.cpp:73 msgctxt "EditContactDialog|" msgid "Operator addr is not valid" msgstr "Operaattorin osoite ei ole sopivaa muotoa" # Tab text. In "main window" of classified ads UI there a are 4 or 5 tabs, normally "Classified ads"; "My profile", "Contacts", "Private messages" and maybe something else. This is the text of the first tab. #: FrontWidget.cpp:97 msgctxt "FrontWidget|" msgid "Classified ads" msgstr "Luokitellut ilmoitukset" # Tab text. In "main window" of classified ads UI there a are 4 or 5 tabs, normally "Classified ads"; "My profile", "Contacts", "Private messages" and maybe something else. This is the text of the 2nd tab. #: FrontWidget.cpp:98 msgctxt "FrontWidget|" msgid "My profile" msgstr "Oma profiili" # Tab text. In "main window" of classified ads UI there a are 4 or 5 tabs, normally "Classified ads"; "My profile", "Contacts", "Private messages" and maybe something else. This is the text of the 3rd tab. #: FrontWidget.cpp:99 msgctxt "FrontWidget|" msgid "Contacts" msgstr "Osoitekirja" # Tab text. In "main window" of classified ads UI there a are 4 or 5 tabs, normally "Classified ads"; "My profile", "Contacts", "Private messages" and maybe something else. This is the text of the 4th tab. #: FrontWidget.cpp:100 msgctxt "FrontWidget|" msgid "Private messages" msgstr "Yksityiset viestit" # Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, a dialog will appear asking which file to share #: FrontWidget.cpp:162 msgctxt "FrontWidget|" msgid "Add shared file.." msgstr "LisУЄУЄ tiedosto jakoon" # Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, the selected file in the listing view will no longer be shared #: FrontWidget.cpp:163 msgctxt "FrontWidget|" msgid "Stop advertising selected shared file" msgstr "Lakkaa mainostamasta valittua jaettua tiedostoa" # Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, the selected file in the listing view will be saved to filesystem #: FrontWidget.cpp:164 msgctxt "FrontWidget|" msgid "Save file to disk.." msgstr "Tallenna tiedosto tiedostojУЄrjestelmУЄlle" # Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, information dialog about selected file will be shown #: FrontWidget.cpp:165 msgctxt "FrontWidget|" msgid "View file information.." msgstr "Tarkastele tiedoston ominaisuuksia.." # Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, SHA digest of the selected file will be copied to clipboard. #: FrontWidget.cpp:166 msgctxt "FrontWidget|" msgid "Copy file address (SHA1) to clipboard.." msgstr "Kopioi tiedoston osoite (SHA1) leikepУЖydУЄlle.." # Context-menu item text. Menu appears when user right-clicks on top of file listing view. When item whose text is specified here is selected from the menu, an editor will be displayed prompting user to enter text that will then be published for other users to see. #: FrontWidget.cpp:167 msgctxt "FrontWidget|" msgid "Edit+publish new text document.." msgstr "Muokkaa ja julkaise uusi tekstidokumentti.." # Dialog title text for "file open" dialog #: FrontWidget.cpp:355 msgctxt "FrontWidget|" msgid "Open File" msgstr "Avaa tiedosto" # Text for filter field of file selection dialog #: FrontWidget.cpp:357 FrontWidget.cpp:887 msgctxt "FrontWidget|" msgid "Files (*.*)" msgstr "Kaikki tiedostot (*.*)" # Error dialog title text. Actual error message will be shown inside dialog whose title is this text. #: FrontWidget.cpp:361 FrontWidget.cpp:1200 FrontWidget.cpp:1357 msgctxt "FrontWidget|" msgid "Error" msgstr "Vikaa.." # Error dialog content text. Shown when image file that user selected could not be opened (maybe because file permission problem or maybe image format issue or ..) #: FrontWidget.cpp:362 msgctxt "FrontWidget|" msgid "Can't load image" msgstr "Kuvan avaaminen ei onnistu" # Error dialog title text. This dialog is shown when user tries to comment another operator but required operator data is missing from local storage. #: FrontWidget.cpp:628 FrontWidget.cpp:768 msgctxt "FrontWidget|" msgid "Profile not in database" msgstr "Profiilia ei tietovarastosta lУЖydy" # Error dialog content text. This dialog is shown when user tries to comment another operator but required operator data is missing from local storage. #: FrontWidget.cpp:629 FrontWidget.cpp:769 msgctxt "FrontWidget|" msgid "Try viewing profile first to obtain data" msgstr "YritУЄ valita profiili katseltavaksi ensin, yritУЄ sitten uudelleen" # File selection title text. Prompts user to select a file for publish purpose. #: FrontWidget.cpp:885 msgctxt "FrontWidget|" msgid "Select file to be published" msgstr "Valitse julkaistava tiedosto" # Error text shown in dialog. Shown in situation where user selected a file that really exceeds size limit (of 2MB) #: FrontWidget.cpp:892 msgctxt "FrontWidget|" msgid "File way too big" msgstr "Tiedosto on aivan liian suuri" # Error text shown in dialog. Shown in situation where user selected a file that slightly exceeds size limit (of 2MB) #: FrontWidget.cpp:900 msgctxt "FrontWidget|" msgid "File too big" msgstr "Tiedosto on liian suuri" # Error text shown in dialog. Shown in situation where user selected a file that could for some reason not be opened #: FrontWidget.cpp:944 FrontWidget.cpp:1201 msgctxt "FrontWidget|" msgid "File open error" msgstr "Ongelma tiedoston avaamisessa" # Part of filter text field in file selection dialog. If for instance user tries to open PNG files, then the text in filter field will be "PNG files (*.png)" and this word is the 2nd word in the phrase. #: FrontWidget.cpp:1169 FrontWidget.cpp:1175 msgctxt "FrontWidget|" msgid "files" msgstr "kaikki tiedostot" # Dialog title for dialog that asks whether user wants to save TCL program into local library or into filesystem file #: FrontWidget.cpp:1183 msgctxt "FrontWidget|" msgid "Save location" msgstr "Mihin tallennetaan" # Dialog text in question dialog asking if user wants to save TCL app into local library or into filesystem file #: FrontWidget.cpp:1184 msgctxt "FrontWidget|" msgid "Save to TCL app library instead of regular file?" msgstr "Tallennetaanko TCL-ohjelmien kirjastoon vai tiedostojУЄrjestelmУЄlle?" # File selection dialog title text. Dialog prompts user to select location+name for an file to be exported into filesystem. #: FrontWidget.cpp:1191 msgctxt "FrontWidget|" msgid "Choose file name for saving" msgstr "Valitse nimi tallennettavalle tiedostolle" # Text shown in placeholder for operators image in situation where user has not yet selected any image. In practice it prompts user to insert image by clicking at the text. #: FrontWidget.cpp:1265 msgctxt "FrontWidget|" msgid "" "\n" "\n" "\n" "Click\n" "To\n" "Add\n" "Image\n" msgstr "" "\n" "\n" "\n" "Klikkaa\n" "LisУЄtУЄksesi\n" "Kuva\n" # Error message dialog content text shown when user tried to access article, that was not stored in local database #: FrontWidget.cpp:1358 msgctxt "FrontWidget|" msgid "Article not found from local storage" msgstr "Artikkelia ei paikallisesta tietokannasta lУЖydy" # Tool-tip text. Shown on top of operators address when user hovers mouse on top of the address field. The %1 will be replaced by nickname of an operator who trusts this particular operator. The %2 will be replaced by SHA1 digest of the operator who trusts the operator whose SHA1 is under mouse cursor. #: FrontWidget.cpp:1384 FrontWidget.cpp:1932 #, qt-format msgctxt "FrontWidget|" msgid "" "Trusted by %1\n" "SHA1 %2" msgstr "" "Johon luottaa %1\n" "SHA1 %2" # Tool tip text. Shown when user howers mouse on top of operators nickname field. In code a date-string will be concatenated to this string, so in practice in the UI it will read "Time of last update 31 aug 2015" or similar. #: FrontWidget.cpp:1421 msgctxt "FrontWidget|" msgid "Time of last update " msgstr "Viimeinen pУЄivitysajankohta" # Text for image placeholder, shown in situation where another operator has not selected any image for her.This text is shown place of the missing image. #: FrontWidget.cpp:1429 msgctxt "FrontWidget|" msgid "" "\n" "\n" "\n" "(No\n" "Image\n" "Selected)\n" msgstr "" "\n" "\n" "\n" "(Ei\n" "Kuvaa\n" "Valittuna)\n" # Context menu item text. Context-menu is related to frequent-contacts column-view. #: FrontWidget.cpp:1523 msgctxt "FrontWidget|" msgid "Edit contact.." msgstr "Muokkaa profiilin tietoja " # Push button text. Pushing the button will open an editor prompting user to edit+send a private message to operator who sent the classified ad currently on display #: FrontWidget.cpp:1563 msgctxt "FrontWidget|" msgid "&Reply to sender" msgstr "Vastaa lУЄhettУЄjУЄlle" # Push button text. Pushing the button will open an editor prompting user to edit+send a reply to classified ad currently on display #: FrontWidget.cpp:1564 msgctxt "FrontWidget|" msgid "Reply to &forum" msgstr "Vastaa foorumille" # Push button text. Pushing the button will open an editor prompting user to edit+send a new classified ad. #: FrontWidget.cpp:1565 msgctxt "FrontWidget|" msgid "&Post new ad" msgstr "Uusi ilmoitus" # Push button text. Pushing the button will open an editor prompting user to edit+send a public comment about operator who sent the classified ad currently on display #: FrontWidget.cpp:1566 msgctxt "FrontWidget|" msgid "&Public comment" msgstr "Uusi kommentti" # Push button text. Pushing the button will switch to view detailing operator who sent the classified ad currently on display #: FrontWidget.cpp:1567 msgctxt "FrontWidget|" msgid "&View profile" msgstr "Katsele profiilia" # Push button text. Pushing the button will open a a listing of files that are attached to classified ad currently on display #: FrontWidget.cpp:1568 FrontWidget.cpp:1706 msgctxt "FrontWidget|" msgid "Attachments.." msgstr "Liitetiedostot.." # Push button text. Pushing the button will open an editor prompting user to add to her contact-list the operator who sent the classified ad currently on display #: FrontWidget.cpp:1628 msgctxt "FrontWidget|" msgid "Add selected operator to contacts.." msgstr "LisУЄУЄ valittu operaattori osoitekirjaan.." # Push button text. Pushing the button will open an editor prompting user to edit+send a private message to operator who sent the private message currently on display #: FrontWidget.cpp:1702 msgctxt "FrontWidget|" msgid "&Reply" msgstr "Vastaa" # Push button text. Pushing the button will open an editor prompting user to edit+send a private message to some operator. #: FrontWidget.cpp:1703 msgctxt "FrontWidget|" msgid "&New message" msgstr "Uusi viesti" # Push button text. Pushing the button will open an editor prompting user to edit+send a public comment about operator who sent the private message currently on display #: FrontWidget.cpp:1704 msgctxt "FrontWidget|" msgid "&Send public comment to sender" msgstr "EsitУЄ julkinen kommentti lУЄhettУЄjУЄstУЄ" # Push button text. Pushing the button will open view that will show details of operator, who sent the private message currently on display. #: FrontWidget.cpp:1705 msgctxt "FrontWidget|" msgid "&View profile of peer" msgstr "NУЄytУЄ viesti-osapuolen profiili" # Context menu item text. Appears in "message listing view" when user right-clicks on messages view. When selected, the operator who sent the message that is selected is added to contacts. #: FrontWidget.cpp:1740 msgctxt "FrontWidget|" msgid "Add selected to contacts.." msgstr "LisУЄУЄ valittu osoitekirjaan" # Text field label. Label tells who sent particular classified ad. #: FrontWidget.cpp:1942 FrontWidget.cpp:1944 FrontWidget.cpp:2008 #: FrontWidget.cpp:2010 msgctxt "FrontWidget|" msgid "From:" msgstr "KeneltУЄ:" # Text field label. Label tells subject of classified ads. #: FrontWidget.cpp:1946 FrontWidget.cpp:2013 msgctxt "FrontWidget|" msgid "Subject:" msgstr "Aihe:" # Text field label. Label tells whom a private message was sent to. #: FrontWidget.cpp:2005 msgctxt "FrontWidget|" msgid "To:" msgstr "Kenelle:" # Error dialog content text. Shown in situation when user clicked on a link that contained SHA1 digest that was not valid. #: FrontWidget.cpp:2317 msgctxt "FrontWidget|" msgid "Invalid SHA1 in URL" msgstr "Viallinen SHA1-tiiviste URLissa" # Error dialog content text. Shown in situation when user clicked on a link that was not correctly formatted. #: FrontWidget.cpp:2344 msgctxt "FrontWidget|" msgid "Invalid URL" msgstr "Viallinen URL" # Error dialog content text. Shown in situation when user entered a link that could not be parsed. #: ui/insertlinkdialog.cpp:69 msgctxt "InsertLinkDialog|" msgid "Invalid URL" msgstr "VУЄУЄrУЄn mallinen URL" # Error dialog content text. Shown in situation when user tried to add connection to node whose name was not found via nameserver. #: ui/manualconnection.cpp:53 msgctxt "ManualConnectionDialog|" msgid "DNS lookup failure" msgstr "NimeУЄ ei lУЖydy nimipalvelusta (DNS)" # Error dialog title text. Actual error message will be shown inside the dialog. #: ui/newprivmsgdialog.cpp:88 ui/newprivmsgdialog.cpp:138 msgctxt "NewPrivMessageDialog|" msgid "Error" msgstr "Vikaa" # Error dialog content text. Dialog is shown when user tries to send a message to operator, whose SHA1 digest (as entered by user) does not parse as SHA1 digest. #: ui/newprivmsgdialog.cpp:89 msgctxt "NewPrivMessageDialog|" msgid "Recipient addr is not valid" msgstr "Vastaanottajan osoite ei ole kelvollinen" # Error dialog content text. Dialog is shown when user tries to send a message to operator, whose encryption keys are present in local storage. #: ui/newprivmsgdialog.cpp:139 msgctxt "NewPrivMessageDialog|" msgid "Recipient encryption key not found from storage" msgstr "Vastaanottajan salausavainta ei paikallisesta tietokannasta lУЖydy" # Error dialog title text. Actual error message will be shown inside the dialog. #: ui/newprofilecommentdialog.cpp:89 ui/newprofilecommentdialog.cpp:126 msgctxt "NewProfileCommentDialog|" msgid "Error" msgstr "Vikaa" # Error dialog content text. Dialog is shown when user tries to comment an operator, whose SHA1 digest (as entered by user) does not parse as SHA1 digest. #: ui/newprofilecommentdialog.cpp:90 msgctxt "NewProfileCommentDialog|" msgid "Commented profile addr is not valid" msgstr "Kommentoidun profiilin osoite ei ole kelvollinen" # Error dialog content text. Dialog is shown when user tries to send a message to operator, whose encryption keys are present in local storage. #: ui/newprofilecommentdialog.cpp:127 msgctxt "NewProfileCommentDialog|" msgid "Recipient encryption key not found from storage" msgstr "Valitun profiilin salausavainta ei paikallisesta tietokannasta lУЖydy" # Error message text. Will be shown in error message dialog in case when initial SSL key generation of node did not succeed. After user dismisses the dialog, the application will close. #: datamodel/nodemodel.cpp:125 msgctxt "NodeModel|" msgid "SSL key generation went wrong, calling exit.." msgstr "SSL-avaimen luonti epУЄonnistui, poistutaan.." # Error message text. Will be shown in error message dialog in case when initial encryption key generation of user did not succeed. After user dismisses the dialog, the application will close. #: datamodel/nodemodel.cpp:135 msgctxt "NodeModel|" msgid "x509 cert generation went wrong, calling exit.." msgstr "x509-sertifikaatin luonti epУЄonnistui, poistutaan.." # Error message text. Will be shown in error message dialog in case when SSL certificate of the node could not be loaded from storage. After user dismisses the dialog, the application will close. #: datamodel/nodemodel.cpp:1667 msgctxt "NodeModel|" msgid "Cant load SSL cert" msgstr "SSL-sertifikaatin lataaminen ei onnistu" # Error message text. Will be shown in error message dialog in case when SSL key of the node could not be retrieved from local storage. After user dismisses the dialog, the application will close. #: datamodel/nodemodel.cpp:1697 msgctxt "NodeModel|" msgid "Cant load SSL key" msgstr "SSL-avaimen lataaminen ei onnistu" # Error message text. Shown in dialog when user tries to enter a password that is too short. #: ui/passwd_dialog.cpp:107 msgctxt "PasswdDialog|" msgid "Min length 5 (use 10+)" msgstr "VУЄhimmУЄispituus on 5 (kУЄytУЄ silti ainakin 10)" # Password dialog title text. #: ui/passwordDialog.ui:14 msgctxt "PasswordDialog|" msgid "Password required" msgstr "Salasana on pakollinen" # Tooltip text for password dialog. Shown when user hovers on top of password dialog. #: ui/passwordDialog.ui:17 msgctxt "PasswordDialog|" msgid "" "Should you forget this word, there is no easy way to recover any of your " "content" msgstr "" "Unohdapa tУЄmУЄ salasana ja viestiesi lukemiseen vain ei ole olemassa mitУЄУЄn " "helppoa menetelmУЄУЄ" # Prompt text for password dialog. #: ui/passwordDialog.ui:29 msgctxt "PasswordDialog|" msgid "Enter password for protection of your messages" msgstr "Valitse salasana viestiesi turvaamiseksi" # Tooltip text for password dialog. Shown when user hovers on top of password field #: ui/passwordDialog.ui:42 msgctxt "PasswordDialog|" msgid "" "If you forget this word, there is no simple way to recover your contents" msgstr "" "Jos unohdat tУЄmУЄn sanan, viestiesi lukemiseksi ei ole olemassa mitУЄУЄn " "helppoa menetelmУЄУЄ" # Password dialog button text #: ui/passwordDialog.ui:55 msgctxt "PasswordDialog|" msgid "OK" msgstr "OK" # Check-box item text. If check-box is selected, password is shown in text editor, if not selected then "hidden text" editor is used that does not show the word being typed. #: ui/passwordDialog.ui:68 msgctxt "PasswordDialog|" msgid "Show password" msgstr "NУЄytУЄ salasana" # Tooltip text. Shown when user hovers mouse cursor on top of message sender name. First %1 will be replaced with nickname of the operator whose message is hovered, %2 will be replaced by nickname of operator who has expressed positive trust towards the operator who sent the message. #: datamodel/privmsgsearchmodel.cpp:110 #, qt-format msgctxt "PrivateMessageSearchModel|" msgid "" "%1\n" "Trusted by %2" msgstr "" "%1\n" "johon luottaa %2" # Tooltip text. Used in column view that lists private messages of operator. Explains the field that gives title to column that specifies direction (sent or received) of the message. #: datamodel/privmsgsearchmodel.cpp:237 msgctxt "PrivateMessageSearchModel|" msgid "Direction of message, sent/received" msgstr "Viestin suunta, lУЄhetetty/vastaanotettu" # Column title text. Used in column view that lists private messages of operator. This field gives title to column that specifies direction (sent/received) of the message. #: datamodel/privmsgsearchmodel.cpp:247 msgctxt "PrivateMessageSearchModel|" msgid "Dir" msgstr "Suunta" # Column title text. Used in column view that lists private messages of operator. This field gives title to column that specifies messaging peer (another operator) of the message. #: datamodel/privmsgsearchmodel.cpp:250 msgctxt "PrivateMessageSearchModel|" msgid "Peer" msgstr "Osapuoli" # Column title text. Used in column view that lists private messages of operator. This field gives title to column that specifies time of the message. #: datamodel/privmsgsearchmodel.cpp:253 msgctxt "PrivateMessageSearchModel|" msgid "Time" msgstr "Aika" # Column title text. Used in column view that lists private messages of operator. This field gives title to column that specifies subject of the message. #: datamodel/privmsgsearchmodel.cpp:256 msgctxt "PrivateMessageSearchModel|" msgid "Subject" msgstr "Aihe" # Push button text. Clicking the button will open a dialog prompting user to add a new comment #: ui/profilecommentdisplay.cpp:54 msgctxt "ProfileCommentDisplay|" msgid "&Add comment..." msgstr "LisУЄУЄ kommentti..." # Context menu item text. Context menu is shown when user right-clicks on file listing view. When this item is selected, a file selection dialog is opened. #: ui/profilecommentdisplay.cpp:65 msgctxt "ProfileCommentDisplay|" msgid "Save attachment to disk.." msgstr "Tallenna liite tiedostojУЄrjestelmУЄlle.." # Error dialog title text #: ui/profilecommentdisplay.cpp:92 msgctxt "ProfileCommentDisplay|" msgid "Error" msgstr "Vikaa" # Error dialog content text. Shown after user tried to access a profile comment and the comment could not be found #: ui/profilecommentdisplay.cpp:93 msgctxt "ProfileCommentDisplay|" msgid "Article not found from local storage" msgstr "Kommenttia ei paikallisesta tietokannasta lУЖydy" # Text field label text. The text field whose label this is will show number how many attachements there are in the comment. #: ui/profilecommentitemdelegate.cpp:93 msgctxt "ProfileCommentItemDelegate|" msgid "Attachments: " msgstr "Liitteet: " # Column view column title text. The column view in question lists profile comments. This text gives title to column that tells who sent the comment. #: datamodel/profilecommentlistingmodel.cpp:219 msgctxt "ProfileCommentListingModel|" msgid "Sender" msgstr "LУЄhettУЄjУЄ" # Column view column title text. The column view in question lists profile comments. This text gives title to column that tells when comment was sent. #: datamodel/profilecommentlistingmodel.cpp:222 msgctxt "ProfileCommentListingModel|" msgid "Time" msgstr "Aika" # Column view column title text. The column view in question lists profile comments. This text gives title to column that tells subject of the comment. #: datamodel/profilecommentlistingmodel.cpp:225 msgctxt "ProfileCommentListingModel|" msgid "Subject" msgstr "Aihe" # Error message text. Shown inside a dialog after user tried to send a comment to operator who had sent a comment and it turns out that necessary encryption keys of the commenting operator are not found and the replying comment can't be sent. #: datamodel/profilecommentmodel.cpp:67 msgctxt "ProfileCommentModel|" msgid "Profile related to comment not found from database" msgstr "" "Kommenttiin liittyvУЄn profiilin tietoja ei paikallisesta tietokannasta lУЖydy" # Context menu item text. This context-menu is shown when user right-clicks list of operators that is shown in dialog that is made for listing operators (who are readers of another profile) #: ui/profilereadersdialog.cpp:73 msgctxt "ProfileReadersDialog|" msgid "View profile" msgstr "Tarkastele profiilia" # Column view column title text. The column view lists readers (operators) of another profile. #: datamodel/profilereaderslistingmodel.cpp:174 msgctxt "ProfileReadersListingModel|" msgid "Name or fingerprint of reader" msgstr "Lukijan nimi tai SHA1-tiiviste" # Error message text, displayed in dialog if audio hardware does not support the format. Should be rare occasion or then gross error like missing soundcard. #: call/ringtoneplayer.cpp:77 msgctxt "RingtonePlayer|" msgid "raw audio format not supported by backend, cannot play audio." msgstr "У„УЄniformaatti ei ole tuettu, УЄУЄniУЄ ei voi soittaa." # Error message text shown in dialog if audio output API returned error in initialization. Should be rare error, or missing audio hardware .. or audio subsystem configuration error. #: call/ringtoneplayer.cpp:93 msgctxt "RingtonePlayer|" msgid "Could not initialize audio player." msgstr "У„УЄnitoistimen alustus epУЄonnistui." # Context menu item text. This context menu is shown when user right-clicks on top of search-results. This menu-item opens the currently-selected item from search results. #: ui/searchdisplay.cpp:62 msgctxt "SearchDisplay|" msgid "Open.." msgstr "Avaa.." # Button text. When button is pressed, TCL program is started. #: ui/tclPrograms.cpp:42 msgctxt "TclProgramsDialog|" msgid "Evaluate" msgstr "Suorita" # Button text. If button is pressed, TCL program being executed is stopped. #: ui/tclPrograms.cpp:43 msgctxt "TclProgramsDialog|" msgid "Stop program" msgstr "PysУЄytУЄ ohjelma" # Button text for button that permanently removes TCL program from local library #: ui/tclPrograms.cpp:49 msgctxt "TclProgramsDialog|" msgid "Delete program" msgstr "Poista ohjelma" # Dialog title for dialog that asks user to type in name of TCL program. #: ui/tclPrograms.cpp:99 msgctxt "TclProgramsDialog|" msgid "TCL Program name" msgstr "TCL-Ohjelman nimi" # Text-input label text. Text input will contain name of TCL program. #: ui/tclPrograms.cpp:100 msgctxt "TclProgramsDialog|" msgid "Name:" msgstr "Nimi:" # Dialog title text for situation where user is about to delete a TCL program. Dialog includes question and yes+no buttons. #: ui/tclPrograms.cpp:140 msgctxt "TclProgramsDialog|" msgid "Deletion confirmation" msgstr "Poistovarmistus" # Dialog text from deletion-confirmation dialog #: ui/tclPrograms.cpp:141 #, qt-format msgctxt "TclProgramsDialog|" msgid "Permanently delete program %1?" msgstr "Poistetaanko pysyvУЄsti ohjelma %1?" # Menu title text. This is the help menu. #: textedit/textedit.cpp:127 msgctxt "TextEdit|" msgid "Help" msgstr "Apua" # Menu-item text used in "help" menu. Selecting this item opens "about" dialog about Qt library. #: textedit/textedit.cpp:129 msgctxt "TextEdit|" msgid "About &Qt" msgstr "Tietoja Qt:stУЄ" # Window title text for container-window containing actions. It seems to me that this text actually does not appear anywhere in the UI due to way, how container-windows are used. #: textedit/textedit.cpp:186 msgctxt "TextEdit|" msgid "Edit Actions" msgstr "Muokkaa toimintoja" # Menu text. This gives text to "file" menu of a text editor. #: textedit/textedit.cpp:188 msgctxt "TextEdit|" msgid "&File" msgstr "Tiedosto" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "open a filesystem file" #: textedit/textedit.cpp:194 msgctxt "TextEdit|" msgid "&Open..." msgstr "Avaa.." # Menu item text inside menu in text editor. When selected, the text being edited will be saved into local filesystem file. #: textedit/textedit.cpp:203 msgctxt "TextEdit|" msgid "&Save locally before send" msgstr "Tallenna paikallisesti ennen lУЄhettУЄmistУЄ" # Menu item text inside menu in text editor. When selected, the text being edited will be saved into local filesystem file and user will be queried for file name. #: textedit/textedit.cpp:210 msgctxt "TextEdit|" msgid "Save locally &As..." msgstr "Tallenna paikallisesti nimellУЄ.." # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "print" #: textedit/textedit.cpp:218 msgctxt "TextEdit|" msgid "&Print..." msgstr "Tulosta.." # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "open print preview" #: textedit/textedit.cpp:226 msgctxt "TextEdit|" msgid "Print Preview..." msgstr "Tulostuksen esikatselu.." # Menu-item text. Used in file-menu for triggering "export as pdf" operation #: textedit/textedit.cpp:231 msgctxt "TextEdit|" msgid "&Export PDF..." msgstr "Vie PDF-muodossa.." # Menu text for "edit" menu of text editor. #: textedit/textedit.cpp:244 msgctxt "TextEdit|" msgid "&Edit" msgstr "Muokkaa" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "undo" #: textedit/textedit.cpp:249 msgctxt "TextEdit|" msgid "&Undo" msgstr "Peru" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "re-do" #: textedit/textedit.cpp:254 msgctxt "TextEdit|" msgid "&Redo" msgstr "Tee uudelleen" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "cut" (to clipboard) #: textedit/textedit.cpp:261 msgctxt "TextEdit|" msgid "Cu&t" msgstr "Leikkaa" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "copy to clipboard" #: textedit/textedit.cpp:267 msgctxt "TextEdit|" msgid "&Copy" msgstr "Kopioi" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "paste from clipboard" #: textedit/textedit.cpp:273 msgctxt "TextEdit|" msgid "&Paste" msgstr "LiitУЄ" # Menu item text inside text editor "edit" menu. After this menu-item is selected, a dialog is opened, prompting user to enter a link (URL) to be included in the text. #: textedit/textedit.cpp:283 msgctxt "TextEdit|" msgid "Insert link" msgstr "LisУЄУЄ viite" # Menu-item text for embedding an image #: textedit/textedit.cpp:287 msgctxt "TextEdit|" msgid "Embed image" msgstr "SisУЄllytУЄ kuva" # Menu text. Gives name for a "format" menu inside a text editor. #: textedit/textedit.cpp:294 msgctxt "TextEdit|" msgid "F&ormat" msgstr "Muotoile" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "toggle bold text style" #: textedit/textedit.cpp:298 msgctxt "TextEdit|" msgid "&Bold" msgstr "Lihavoitu" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "toggle italic text" #: textedit/textedit.cpp:310 msgctxt "TextEdit|" msgid "&Italic" msgstr "Kursivoitu" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "toggle underline" #: textedit/textedit.cpp:322 msgctxt "TextEdit|" msgid "&Underline" msgstr "Alleviivattu" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "left-justify" #: textedit/textedit.cpp:341 textedit/textedit.cpp:347 msgctxt "TextEdit|" msgid "&Left" msgstr "Tasattu vasemmalle" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "toggle centered text" #: textedit/textedit.cpp:342 textedit/textedit.cpp:346 msgctxt "TextEdit|" msgid "C&enter" msgstr "Keskitetty" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "right-justify" #: textedit/textedit.cpp:343 textedit/textedit.cpp:345 msgctxt "TextEdit|" msgid "&Right" msgstr "Tasattu oikealle" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "justify both right+left" #: textedit/textedit.cpp:349 msgctxt "TextEdit|" msgid "&Justify" msgstr "Tasattu molempiin laitoihin" # Text editor action text. This text will appear both as menu-item text and as tool-tip text of a button that has icon. The action performed under this title is "color selection" #: textedit/textedit.cpp:376 msgctxt "TextEdit|" msgid "&Color..." msgstr "VУЄri.." # Combobox item text. The combobox is used to select text style. The text style selected with this text is "standard" #: textedit/textedit.cpp:383 msgctxt "TextEdit|" msgid "Standard" msgstr "Normaalimuoto" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "bullet list (disc)" #: textedit/textedit.cpp:384 msgctxt "TextEdit|" msgid "Bullet List (Disc)" msgstr "Pisteellinen lista (palloilla)" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "bullet list (circle)" #: textedit/textedit.cpp:385 msgctxt "TextEdit|" msgid "Bullet List (Circle)" msgstr "Pisteellinen lista (ympyrУЖillУЄ)" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "bullet list (square)" #: textedit/textedit.cpp:386 msgctxt "TextEdit|" msgid "Bullet List (Square)" msgstr "Pisteellinen lista (laatikoilla)" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "ordered list (decimal)" #: textedit/textedit.cpp:387 msgctxt "TextEdit|" msgid "Ordered List (Decimal)" msgstr "Numeroitu lista (desimaaliluvuin)" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "ordered list (alpha lower)" #: textedit/textedit.cpp:388 msgctxt "TextEdit|" msgid "Ordered List (Alpha lower)" msgstr "Numeroitu lista (pienin kirjaimin)" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "ordered list (alpha upper)" #: textedit/textedit.cpp:389 msgctxt "TextEdit|" msgid "Ordered List (Alpha upper)" msgstr "Numeroitu lista (suurin kirjaimin)" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "ordered list (roman lower)" #: textedit/textedit.cpp:390 msgctxt "TextEdit|" msgid "Ordered List (Roman lower)" msgstr "Numeroitu lista (pienin roomalaisin)" # Combobox item text. The combobox is used to select text style. The text style selected with this text is "ordered list (roman upper)" #: textedit/textedit.cpp:391 msgctxt "TextEdit|" msgid "Ordered List (Roman upper)" msgstr "Numeroitu lista (suurilla roomalaisilla)" # Warning dialog title text. This dialog is shown if user tries to exit without saving her text. #: textedit/textedit.cpp:442 msgctxt "TextEdit|" msgid "Application" msgstr "Tekstimuokkain" # Warning dialog title content text. Text asks what to do with modifications. The dialog has buttons Save,Discard and Cancel and this text is the question. #: textedit/textedit.cpp:443 msgctxt "TextEdit|" msgid "" "The document has been modified.\n" "Do you want to save your changes?" msgstr "Tiedostoa on muutettu, haluatko tallettaa muutokset?" # File selection dialog title text. Dialog will prompt user to select a document for opening. #: textedit/textedit.cpp:467 msgctxt "TextEdit|" msgid "Open File..." msgstr "Avaa tiedosto.." # Text for file selection filter field to be used inside file selection dialog. There are 2 parts, separated by ";;" and those semicolons must be left in place. Also the filter parts like (*.htm) must not be edited. The explanations like "HTML-Files" may be edited. #: textedit/textedit.cpp:468 msgctxt "TextEdit|" msgid "HTML-Files (*.htm *.html);;All Files (*)" msgstr "HTML-Tiedostot (*.htm *.html);;Kaikki tiedostot (*)" # File selection dialog title text. Dialog in question prompts user to select name for file to be persisted. #: textedit/textedit.cpp:485 msgctxt "TextEdit|" msgid "Save as..." msgstr "Tallenna nimellУЄ.." # Text for file selection filter field to be used inside file selection dialog. There are 3 parts, separated by ";;" and those semicolons must be left in place. Also the filter parts like (*.odt) must not be edited. The explanations like "ODF-files" may be edited. #: textedit/textedit.cpp:486 msgctxt "TextEdit|" msgid "ODF files (*.odt);;HTML-Files (*.htm *.html);;All Files (*)" msgstr "" "ODF Tiedostot (*.odt);;HTML-Tiedostot (*.htm *.html);;Kaikki tiedostot (*)" # Dialog title text. The dialog is printer dialog asking user how to print the text currently in editor. #: textedit/textedit.cpp:501 msgctxt "TextEdit|" msgid "Print Document" msgstr "Tulosta dokumentti" # File selection dialog title text. Dialog will prompt user to select a document for opening. #: textedit/textedit.cpp:559 msgctxt "TextEdit|" msgid "Open File" msgstr "Avaa tiedosto" # Text for file selection filter field to be used inside file selection dialog. The filter parts like (*.odt) must not be edited. The explanations like "Files" may be edited. #: textedit/textedit.cpp:561 msgctxt "TextEdit|" msgid "Files (*.*)" msgstr "Kaikki tiedostot (*.*)" # Error dialog title text. #: textedit/textedit.cpp:566 msgctxt "TextEdit|" msgid "Error" msgstr "Tapahtui virhe" # Error dialog content text. #: textedit/textedit.cpp:567 msgctxt "TextEdit|" msgid "Can't load image" msgstr "Kuvan avaaminen ei onnistu" # Error message displayed inside error dialog after user tried to select for operation a file whose size greatly exceeds file size limit. #: textedit/textedit.cpp:621 textedit/textedit.cpp:631 msgctxt "TextEdit|" msgid "File way too big" msgstr "Tiedosto on aivan liian suuri" # Button text for "incoming call" dialog. When user hits the button, call is answered. #: net/voicecallengine.cpp:515 msgctxt "VoiceCallEngine|" msgid "Accept" msgstr "Vastaa" # Button text for "incoming call" dialog. When user hits the button, incoming call is rejected. #: net/voicecallengine.cpp:523 msgctxt "VoiceCallEngine|" msgid "Reject" msgstr "HylkУЄУЄ" # Button text for "ongoing call" dialog. When button is hit, call is closed. #: net/voicecallengine.cpp:525 msgctxt "VoiceCallEngine|" msgid "Close" msgstr "Sulje" # Tooltip text. Shown in listing of ongoing calls. This tooltip explains "operator address" column of the display. The text explained is SHA1-digest or operator name if known. #: net/voicecallengine.cpp:541 msgctxt "VoiceCallEngine|" msgid "Actual network address (SHA1) of the peer operator" msgstr "Osapuolen profiilin SHA1-tiiviste" # Tooltip text for list display that lists ongoing voice calls. The text explained is (IP) address of the remote node of the voice call participant. #: net/voicecallengine.cpp:544 msgctxt "VoiceCallEngine|" msgid "Network address of the remote node" msgstr "Osapuolen kУЄyttУЄmУЄn solmun verkko-osoite" # Column header text for display that lists ongoing calls. This gives header text for column that shows name of the call participant #: net/voicecallengine.cpp:554 msgctxt "VoiceCallEngine|" msgid "Operator" msgstr "Operaattori" # Column header text for display that lists ongoing calls. This gives header text for column that shows network address of the call participant #: net/voicecallengine.cpp:557 msgctxt "VoiceCallEngine|" msgid "Node address" msgstr "Verkko-osoite" # Column header text for display that lists ongoing calls. This gives header text for column that shows state of the call (like open, closed, ringing etc) #: net/voicecallengine.cpp:560 msgctxt "VoiceCallEngine|" msgid "Call status" msgstr "Puhelun tila" # Column header text for display that lists ongoing calls. This gives header text for column containing buttons for accepting, rejecting and ending a call. #: net/voicecallengine.cpp:563 msgctxt "VoiceCallEngine|" msgid "Controls" msgstr "Hallinta" # Column header text for display that lists ongoing calls. This gives header text for column that shows name column containing button for ending an ongoing call. #: net/voicecallengine.cpp:566 msgctxt "VoiceCallEngine|" msgid "Ending" msgstr "PУЄУЄttУЄminen" # Call status text. When making a new outgoing call, this is status for new call that is not answered yet. #: net/voicecallengine.cpp:603 msgctxt "VoiceCallEngine|" msgid "Initializing" msgstr "Alustetaan" # Call status text. When receiving a new incoming call, this is status for new call that is not answered yet. #: net/voicecallengine.cpp:606 msgctxt "VoiceCallEngine|" msgid "Incoming" msgstr "Saapuva" # Call status text. When voice call is in progress, this is the status. #: net/voicecallengine.cpp:609 msgctxt "VoiceCallEngine|" msgid "Open" msgstr "Avoinna" # Call status text. When voice call is marked to be closed, this is its status. #: net/voicecallengine.cpp:612 msgctxt "VoiceCallEngine|" msgid "Closing" msgstr "Suljetaan" # Call status text. When voice call is closed, this is the status text. #: net/voicecallengine.cpp:615 msgctxt "VoiceCallEngine|" msgid "Closed" msgstr "Suljettu" # Call status text. When voice call attempt ends in error, this is text displayed. #: net/voicecallengine.cpp:618 msgctxt "VoiceCallEngine|" msgid "Error" msgstr "Virhe" # Call status text. When there is no voice call to display, this text may be displayed instead. #: net/voicecallengine.cpp:621 msgctxt "VoiceCallEngine|" msgid "No call" msgstr "Ei puhelua" # Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "general purpose" excuse, when no detailed reason is know. #: net/voicecallengine.cpp:824 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible" msgstr "Puhelu ei ole mahdollinen" # Tooltip text for button that initiates a new call. This gives an excuse why button is not dimmed and call is possible. #: net/voicecallengine.cpp:830 msgctxt "VoiceCallEngine|" msgid "Audio call is possible" msgstr "Puhelu on mahdollinen" # Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "SHA1 digest of operator is not known" #: net/voicecallengine.cpp:837 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator address unknown" msgstr "Puhelu ei ole mahdollinen: operaattorin SHA1-tiiviste on tuntematon" # Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "operators profile not found (from local database)" #: net/voicecallengine.cpp:843 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator profile not found" msgstr "Puhelu ei ole mahdollinen: operaattorin profiilia ei lУЖydy" # Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "there is no network address included in node information of the profile" #: net/voicecallengine.cpp:846 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator has no node information in profile" msgstr "Puhelu ei ole mahdollinen: operaattorin solmusta puuttuu verkko-osoite" # Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "there is no (ipv4) network connection to node" #: net/voicecallengine.cpp:865 #, qt-format msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operators IPv4 address %1 not connected" msgstr "" "Puhelu ei ole mahdollinen: operaattorin solmun IPv4-verkko-osoitteeseen %1 " "ei ole yhteyttУЄ" # Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "there is no (ipv6) network connection to node" #: net/voicecallengine.cpp:872 #, qt-format msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operators IPv6 address %1 not connected" msgstr "" "Puhelu ei ole mahdollinen: operaattorin solmun IPv6-verkko-osoitteeseen %1 " "ei ole yhteyttУЄ " # Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is protocol mismatch. #: net/voicecallengine.cpp:883 msgctxt "VoiceCallEngine|" msgid "" "Audio call is not possible: local node has no IPv6 address, operator has " "only IPv6 addr" msgstr "" "Puhelu ei ole mahdollinen: paikallisella solmulla ei ole IPv6-osoitetta, " "operaattorilla on vain IPv6" # Tooltip text for button that initiates a new call. This gives an excuse why button is dimmed and call not possible. This excuse is "operator does not publish network address of his node" #: net/voicecallengine.cpp:885 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator does not publish network address" msgstr "Puhelu ei ole mahdollinen: operaattori ei julkaise verkko-osoitettaan" # Dialog title text for "about" dialog. #: ui/aboutDialog.ui:26 msgctxt "aboutDialog|" msgid "About classified ads" msgstr "Tietoja luokitelluista ilmoituksista" # 1st line of text inside "about" dialog, placed next to the turle logo. This text is then followed by longer explanation detail why this program is and how. This is kind of title for the longer explanation. #: ui/aboutDialog.ui:100 msgctxt "aboutDialog|" msgid " Classified ads is a program for online communications" msgstr "Luokitellut ilmoitukset on viestintУЄУЄn tarkoitettu tietokoneohjelma" # The long explanation of classified ads inside about-dialog. Note that this text must be valid html. Needs to start with and end with etc. This is easiest to edit like this: copy-paste the content in to a file, say /tmp/about.html. Then either open your favourite html-editor or open classified ads. In classified ads you can start constructing an ad, select from file-menu "open.." and select this file ;do editing and save from file-menu. The saved file is immediately in correct format to be be copy-pasted into contents of this field. #: ui/aboutDialog.ui:163 #| msgid "" #| "

Classified ads is free software. You may use, copy " #| "and modify it if you follow the conditions given in GNU lesser general " #| "public license version 2.1.

Classified ads is copyright ТЉ Antti " #| "JУЄrvinen 2013.

Main feature of the the program is an " #| ""advertisement" - a piece of text belonging to selected " #| "classification. There are several pre-programmed classifications and " #| "operators are encouraged to invent new classifications for new purposes ; " #| "the selection boxes in classification-selection tab are editable. Other " #| "operators may then view the ads, publicly comment the ads, the operators " #| "and also send private messages to each others.

Another important " #| "feature of classified ads is that it is designed to be operated without " #| "any centralized server infrastucture - it is you and other operators " #| "whose computers store and transmit all the content visible inside " #| "classified ads. To get connected you need to know address of at least one " #| "existing computer (a node) so " #| "if your network connection dialog shows no connections, you may need to " #| "contact someone you know is using the software and ask for address of her " #| "node to make initial contact with the network. Once connected the " #| "software should maintain list of addresses of other nodes.

Due to " #| "its server-less design the whole system works best if you leave the " #| "program running always when you have your computer powered on ; while " #| "processing other operators requests it will hog some computing resources " #| "and generate network traffic also when you are not actively using the " #| "program youself - others are.

Operators concerned about privacy of " #| "the content should be aware of following items:

- Data storage " #| "implementation is variant of distributed hash table, practically meaning " #| "that content posted by you gets copied some more-or-less random nodes in " #| "the network.

- Any data item (ad, comment, binary file, private " #| "message etc.) is digitally signed. This makes it more difficult to try to " #| "pose as another operator.

- Operators are reliably identified only " #| "by the SHA1 hash of their generated encryption keys. SHA1 hash is " #| "displayed when viewing details of operator profiles. Other identifying " #| "information like nickname or city name are entered by operator himself " #| "and can be anything. The operator profile, as it is published to the " #| "network, is also signed with the encryption keys of the operator - if you " #| "identify an operator by her SHA1 hash, you have a mechanism for " #| "identifying if any content inside classified ads is posted by this " #| "operator or not. Classified ads internally checks for digital signatures, " #| "throwing away content that fails signature check and tries to provide " #| "SHA1 hash of the operator who posted the content.

- All classified " #| "ads are posted as plain text, no encryption is used. All public profiles " #| "are posted as plain text, no encryption is used. If profile is made " #| "private, it is encrypted to be readable only by selected other profiles. " #| "This applies also to binary files shared by operators private profiles " #| "and comments about private profiles after the profile was made private " #| "(previously plain-text comments or files don't get magically encrypted " #| "afterwards). Private messages are encrypted always to be readable only by " #| "recipient and sender. Attachments follow the privary rules of the " #| "document, they're attachted to.

- As is the case with all " #| "internet-communications, this small fact is true for classified ads too : " #| "once something gets posted online, " #| "there is no way to remove it from network.

- Data " #| "encryption implementation for content is OpenSSL, relying mostly on " #| "algorithms RSA-2048 and AES-256.

- While connections between nodes " #| "are implemented using SSL, other nodes inside network do get to know what " #| "content is being transmitted in neighboring nodes. While there is no " #| "central point for easily collecting this information about particular " #| "classification or operator, operators still should expect no privacy " #| "regarding their doings online, although some effort has been been put " #| "into hiding contents of " #| "private messages and private profiles.

Programming was (mostly) " #| "done by Antti JУЄrvinen, artwork by Meeri JУЄrvinen.

This product " #| "includes software developed by the OpenSSL Project for use in the OpenSSL " #| "Toolkit (http://www.openssl.org/).

Happy " #| "advertising!


" msgctxt "aboutDialog|" msgid "" "

Classified ads is free software. You may use, copy and " "modify it if you follow the conditions given in GNU lesser general public " "license version 2.1.

Classified ads is copyright ТЉ Antti JУЄrvinen " "2013.

Main feature of the program is an "advertisement" - a " "piece of text belonging to selected classification. There are several " "pre-programmed classifications and operators are encouraged to invent new " "classifications for new purposes ; the selection boxes in " "classification-selection tab are editable. Other operators may then view the " "ads, publicly comment the ads, the operators and also send private messages " "to each others.

Another important feature of classified ads is that " "it is designed to be operated without any centralized server infrastructure " "- it is you and other operators whose computers store and transmit all the " "content visible inside classified ads. To get connected you need to know " "address of at least one existing computer (a node) so if your network connection dialog shows " "no connections, you may need to contact someone you know is using the " "software and ask for address of her node to make initial contact with the " "network. Once connected the software should maintain list of addresses of " "other nodes.

Due to its server-less design the whole system works " "best if you leave the program running always when you have your computer " "powered on ; while processing other operators requests it will hog some " "computing resources and generate network traffic also when you are not " "actively using the program yourself - others are.

Operators concerned " "about privacy of the content should be aware of following items:

- " "Data storage implementation is variant of distributed hash table, practically meaning that " "content posted by you gets copied some more-or-less random nodes in the " "network.

- Any data item (ad, comment, binary file, private message " "etc.) is digitally signed. This makes it more difficult to try to pose as " "another operator.

- Operators are reliably identified only by the " "SHA1 hash of their generated encryption keys. SHA1 hash is displayed when " "viewing details of operator profiles. Other identifying information like " "nickname or city name are entered by operator himself and can be anything. " "The operator profile, as it is published to the network, is also signed with " "the encryption keys of the operator - if you identify an operator by her " "SHA1 hash, you have a mechanism for identifying if any content inside " "classified ads is posted by this operator or not. Classified ads internally " "checks for digital signatures, throwing away content that fails signature " "check and tries to provide SHA1 hash of the operator who posted the " "content.

- All classified ads are posted as plain text, no encryption " "is used. All public profiles are posted as plain text, no encryption is " "used. If profile is made private, it is encrypted to be readable only by " "selected other profiles. This applies also to binary files shared by " "operators private profiles and comments about private profiles after the " "profile was made private (previously plain-text comments or files don't get " "magically encrypted afterwards). Private messages are encrypted always to be " "readable only by recipient and sender. Attachments follow the privacy rules " "of the document, they're attached to.

- As is the case with all " "internet-communications, this small fact is true for classified ads too : " "once something gets posted online, there " "is no way to remove it from network.

- Data encryption " "implementation for content is OpenSSL, relying mostly on algorithms RSA-2048 " "and AES-256.

- While connections between nodes are implemented using " "SSL, other nodes inside network do get to know what content is being " "transmitted in neighboring nodes. While there is no central point for easily " "collecting this information about particular classification or operator, " "operators still should expect no privacy regarding their doings online, " "although some effort has been been put into hiding contents of private messages and private " "profiles.

Programming was (mostly) done by Antti JУЄrvinen, artwork by " "Meeri JУЄrvinen.

This product includes software developed by the " "OpenSSL Project for use in the OpenSSL Toolkit " "(http://www.openssl.org/).

Happy " "advertising!


" msgstr "" "\n" "

Luokitellut " "ilmoitukset on vapaasti kУЄytettУЄvУЄ ohjelmisto. Voi kУЄyttУЄУЄ, kopioida ja " "muokata sitУЄ noudattaen LGPL-lisenssin (GNU Lesser General Public License " "2.1) ehtoja.

\n" "


\n" "

TУЄmУЄn ohjelman " "kopiointioikeudet omistaa Antti JУЄrvinen, vuodesta 2013.

\n" "


\n" "

Ohjelman keskeinen " "ominaisuus on "ilmoitus" - teksti, joka kuuluu johonkin " "luokitteluun. Ohjelma sisУЄltУЄУЄ joukon valmiita luokitteluita ja kУЄyttУЄjiУЄ " "rohkaistaan keksimУЄУЄn uusia ; luokittelu-valintoihin " ""ilmoitukset"-vУЄlilehdellУЄ voi kirjoittaa mitУЄ hyvУЄnsУЄ. Muut " "kУЄyttУЄjУЄt voivat katsella ilmoituksia, julkisesti kommentoida ilmoituksia ja " "lУЄhettУЄУЄ viestejУЄ toisilleen.

\n" "


\n" "

Ohjelman toinen " "keskeinen ominaisuus on, ettei se kУЄytУЄ keskitettyУЄ tietovarastoa millУЄУЄn " "verkkopalvelimella - yksittУЄisten kУЄyttУЄjien tietokoneet, joilta ohjelmistoa " "kУЄytetУЄУЄn tallettavat ja vУЄlittУЄvУЄt kaiken ohjelman sisУЄllУЄ esitettУЄvУЄn " "sisУЄllУЖn. LiittyУЄksesi tУЄhУЄn verkkoon sinun on tiedettУЄvУЄ ainakin yhden " "sellaisen tietokoneen (solmun) verkko-osoite, jossa jo valmiiksi kУЄytetУЄУЄn " "luokiteltuja ilmoituksia. MikУЄli tilanne on sellainen, ettУЄ "verkon " "tila" -dialogi nУЄyttУЄУЄ 0 avointa yhteyttУЄ, sinun on kysyttУЄvУЄ joltain " "ystУЄvУЄltУЄsi hУЄnen solmunsa verkko-osoite ja syУЖtettУЄvУЄ se ohjelmaan " "saadaksesi yhteyden luokiteltujen ilmoitusten verkkoon. Kun ohjelma on " "kerran liitetty verkkoon, se pyrkii itse yllУЄpitУЄmУЄУЄn listan verkon muista " "koneista.

\n" "


\n" "

Johtuen " "suunnitelusta, johon verkkopalvelimet eivУЄt kuulu tУЄmУЄ jУЄrjestelmУЄ toimii " "parhaiten, jos jУЄtУЄt tУЄmУЄn ohjelman pУЄУЄlle myУЖs silloin, kun et itse " "aktiivisesti kУЄytУЄ jУЄrjestelmУЄУЄ. Ohjelma vie jonkin verran " "tietojenkУЄsittelykapasiteettia koneeltasi ja aiheuttaa verkkoliikennettУЄ " "myУЖs silloin kun et itse ohjelmaa kУЄytУЄ - mutta muut kУЄyttУЄjУЄt kУЄyttУЄvУЄt. " "

\n" "


\n" "

YksityisyydestУЄУЄn " "huolestuneet kУЄyttУЄjУЄt huomatkoot seuraavat seikat:

\n" "

- Tietovarasto on " "toteutettu hajautettuna tiivistetaulukkona (distributed hash table DHT), " "mikУЄ kУЄytУЄnnУЖssУЄ tarkoittaa ettУЄ verkkoon postitetut ilmoitukset ja muu " "sisУЄltУЖ pУЄУЄtyvУЄt enemmУЄn tai vУЄhemmУЄn satunnaisille verkon solmuille " "sУЄilytettУЄvУЄksi, DHT-algoritmin mukaisesti.

\n" "

- Kaikki verkon " "tallettamat tietoalkiot (ilmoitukset, kommentit, tiedostot, yksityiset " "viestit jne.) ovat digitaalisesti allekirjoitettuja. TУЄstУЄ syystУЄ on " "hankalaa pyrkiУЄ esiintymУЄУЄn eri operaattorina kuin oikeasti on.

\n" "

- Operaattorin " "ainoa luotettava tunniste on hУЄnen salausavaimensa SHA1-tiiviste. " "SHA1-tiiviste on nУЄhtУЄvillУЄ operaattorin tiedot esittУЄvУЄllУЄ vУЄlilehdellУЄ. " "Muut tiedot kuten liikanimi tai kaupungin nimi ovat operaattorin " "syУЖtettУЄvissУЄ ja luonnollisesti voivat olla ihan mitУЄ tahansa. Operaattorin " "profiilin tiedot verkkoon julkaistuna ovat myУЖs allekirjoitetut, kУЄyttУЄen " "operaattorin salausavainta - mikУЄli haluat kohtuullisella luotettavuudella " "tietУЄУЄ onko joku verkon sisУЄltУЖ tietyn operaattorin julkaisemaa vai ei, tУЄmУЄ " "tapahtuu tarkastamalla lУЄhettУЄjУЄn SHA1-tiiviste. Luokitellut ilmoitukset " "tarkastaa saapuvien tietoalkioiden allekirjoitukset ja jУЄttУЄУЄ tallettamatta " "sisУЄllУЖt, joiden allekirjoitus ei vastaa sisУЄltУЖУЄ.

\n" "

- Kaikki " "luokitellut ilmoitukset julkaistaan ilman salausta ja ovat kaikkien " "luettavissa. Kaikki julkiset profiilit julkaistaan ilman salausta, ja ovat " "kaikkien luettavissa. MikУЄli profiili merkitУЄУЄn yksityiseksi, se salataan " "siten, ettУЄ lueteltujen operaattoreiden salausavainta kУЄyttУЄen profiilin " "tiedot ovat luettavissa. TУЄmУЄ pУЄtee myУЖs profiiliin liittyviin kommentteihin " "ja jaettuihin tiedostoihin. Muutos ei ole takautuva, eli jos profiili on " "aiemmin ollut julkinen, sen kommentit ja tiedostot eivУЄt automaattisesti " "muutu salatuiksi kun profiili muutetaan yksityiseksi. Yksityiset viestit " "kuljetetaan aina salattuna. Liitetiedostot noudattavat sen dokumentin " "yksityisyyssУЄУЄntУЖjУЄ, mihin ne on liitetty.

\n" "

- Kuten kaiken " "internet-viestinnУЄn kanssa tosi on, myУЖs tУЄmУЄ pУЄtee: jos jotain sisУЄltУЖУЄ " "verkkoon lУЄhetetУЄУЄn, ei ole olemassa " "keinoa pysyvУЄsti sitУЄ poistaa.

\n" "

- Salaustoteutus on " "OpenSSL, useimmin kУЄytetyt algoritmit ovat RSA-2048 ja AES-256.

\n" "

- Solmujen vУЄlinen " "liikenne kulkee SSL-socketissa eli tietoliikenteen seuraaminen verkon " "ulkopuolelta on haastavaa. VierekkУЄiset solmut kuitenkin nУЄkevУЄt toistensa " "tietoliikenteenteen sisУЄllУЖn. Vaikka tietoliikenteen sisУЄltУЖjen kerУЄУЄmiseen " "ei ole helppoa yksittУЄistУЄ paikkaa, operaattorien on silti turha odottaa " "yksityisyyttУЄ koskien tekemisiУЄУЄn verkossa vaikka jonkin verran vaivaa " "yksityisten viestien sisУЄltУЖjen " "suojaamiseksi onkin nУЄhty.

\n" "


\n" "

OhjelmointityУЖn on " "enimmУЄkseen tehnyt Antti JУЄrvinen, taideteokset Meeri JУЄrvinen.

\n" "


\n" "

TУЄmУЄ tuote sisУЄltУЄУЄ " "OpenSSL-projektin kehittУЄmУЄn ohjelmiston, joka on alunperin tarkoitettu " "OpenSSL Toolkit-ohjelmistoa varten (http://www.openssl.org).

\n" "


\n" "

Riemullista " "ilmoittelua!

\n" "


" # Dialog title text. Dialog in question produces list of file attachments. #: ui/attachmentListDialog.ui:26 msgctxt "attachmentListDialog|" msgid "List of attached files" msgstr "Liitetiedostoluettelo" # Dialog title text for call status dialog. #: ui/callStatusDialog.ui:26 msgctxt "callStatusDialog|" msgid "Call status" msgstr "Puhelun tila" # Text in call status dialog for slider that shows audio volume of microphone #: ui/callStatusDialog.ui:49 msgctxt "callStatusDialog|" msgid "Input level" msgstr "Mikrofonin УЄУЄnenvoimakkuus" # Title in call status dialog a column-list that lists ongoing calls #: ui/callStatusDialog.ui:65 msgctxt "callStatusDialog|" msgid "Audio calls" msgstr "Puhelut" # Text in call status dialog for slider that shows audio volume of speaker #: ui/callStatusDialog.ui:90 msgctxt "callStatusDialog|" msgid "Output level" msgstr "Toistettava УЄУЄnenvoimakkuus" # Dialog title text. Purpose of the dialog is to let user change properties of a frequent contact in contact-list. #: ui/editContact.ui:26 msgctxt "editContactDialog|" msgid "Edit a contact" msgstr "Muokkaa profiilin tietoja" # Text field label in contact-editing dialog. This gives label for field that shows SHA1 fingerprint of the operator whose data is being edited #: ui/editContact.ui:39 msgctxt "editContactDialog|" msgid "Address (SHA1) of contact" msgstr "Profiilin osoitteen SHA1 tiiviste" # Text field label in contact-editing dialog. This gives label for field that shows nickname of the operator whose data is being edited #: ui/editContact.ui:53 msgctxt "editContactDialog|" msgid "Local nickname" msgstr "Paikallinen liikanimi" # Tooltip text of a checkbox label in contact-editing dialog. The checkbox is one that controls statement of trustworthniness of the operator whose data is being edited. Note html format. #: ui/editContact.ui:65 msgctxt "editContactDialog|" msgid "" "

Settings some trusted is public information to readers " "of your profile

" msgstr "" "

Luottamuksen osoitus on profiilisi mukana julkaistava " "tieto, jonka profiilisi lukijat nУЄkevУЄt

" # Label of a checkbox in contact-editing dialog. The checkbox is one that controls statement of trustworthniness of the operator whose data is being edited. #: ui/editContact.ui:68 msgctxt "editContactDialog|" msgid "This contact is to be publicly trusted in transactions" msgstr "TУЄmУЄn profiilin operaattoriin kelpaa julkisesti luottaa" # Name of front widget. Wild guess is that this text actually does not appear anywhere in the UI. #: frontWidget.ui:14 msgctxt "frontWidget|" msgid "Form" msgstr "Etusivun lomake" # Tab title text in front widget. When user clicks in this tab, the view is switched to one, that lists classified ads. #: frontWidget.ui:39 msgctxt "frontWidget|" msgid "Classified ads" msgstr "Luokitellut ilmoitukset" # Prompt text next "search" button. User is supposed to enter search criteria for classified ads and then click "search" ; this is prompt text for this behaviour. #: frontWidget.ui:67 msgctxt "frontWidget|" msgid "Search for classified ads about" msgstr "Etsi luokiteltuja ilmoituksia aiheesta" # Prompt text very next to "search" button. After user has clicked the button, he is supposed to be viewing list of classified ads matching the search criteria. #: frontWidget.ui:74 msgctxt "frontWidget|" msgid "Perform" msgstr "Suorita" # This part of search-criteria phrase. Normally the phrase reads something like "Buying of cars in finland" and this word is the 2nd word in that phrase. #: frontWidget.ui:97 msgctxt "frontWidget|" msgid "of" msgstr "koskien" # This part of search-criteria phrase. Normally the phrase reads something like "Buying of cars in finland" and this word is the 4th word in that phrase. #: frontWidget.ui:113 msgctxt "frontWidget|" msgid "in" msgstr "paikassa" # Button text for button used to search for classified ads. This button has text "perform" just next to it so user sees actually 2 words "perform search" where the "perform" is in separate label above the button, and then is the text of this button. #: frontWidget.ui:123 msgctxt "frontWidget|" msgid "Search" msgstr "Haku" # Tab title text in front widget for tab that shows details of operators own profile (==personal details) #: frontWidget.ui:161 msgctxt "frontWidget|" msgid "My profile" msgstr "Oma profiili" # Text field label in "operators profile" tab. The field in questions shows SHA1-digest e.g. the real address of the operator. #: frontWidget.ui:177 frontWidget.ui:937 msgctxt "frontWidget|" msgid "Profile address" msgstr "Profiilin osoite" # Text field label in "operators profile" tab. The field in questions shows nickname of the operator #: frontWidget.ui:208 frontWidget.ui:643 msgctxt "frontWidget|" msgid "Nickname" msgstr "Liikanimi" # Text field label in "operators profile" tab. The field in questions shows "hello world" text of the operator. #: frontWidget.ui:225 frontWidget.ui:669 msgctxt "frontWidget|" msgid "Greeting text" msgstr "Tervehdysteksti" # Tooltip-text of a text field in "operators profile" tab. The field in questions shows greeting text of the operator. #: frontWidget.ui:232 msgctxt "frontWidget|" msgid "For the rest of the world. " msgstr "Koko maailmalle." # Text field label in "operators profile" tab. The field in questions shows given name (first name) of the operator. #: frontWidget.ui:239 frontWidget.ui:695 msgctxt "frontWidget|" msgid "First name" msgstr "Etunimi" # Text field label in "operators profile" tab. The field in questions shows family name of the operator #: frontWidget.ui:253 frontWidget.ui:715 msgctxt "frontWidget|" msgid "Family name" msgstr "Sukunimi" # Text field label in "operators profile" tab. The field in questions shows place of residence of the operator #: frontWidget.ui:263 msgctxt "frontWidget|" msgid "City/country" msgstr "Kaupunki/maa" # Text field label in "operators profile" tab. The field in questions shows address of bitcoin wallet of the operator. #: frontWidget.ui:273 msgctxt "frontWidget|" msgid "BTC address" msgstr "BTC-lompakon osoite" # Tooltip-text for a text field "operators profile" tab. The field in questions shows address of bitcoin wallet of the operator. #: frontWidget.ui:280 msgctxt "frontWidget|" msgid "If you wish to receive payments via BTC, include your BTC address too." msgstr "" "Jos meinaat saada maksuja bitcoinin kautta, julkaise myУЖs lompakkosi osoite" # Text field label in "operators profile" tab. The field in questions shows what the user has to say about state of the world. #: frontWidget.ui:287 frontWidget.ui:799 msgctxt "frontWidget|" msgid "State of the world" msgstr "Maailman tila" # Tool-tip text of a field in "operators profile" tab. The field in questions shows what operator has to say about state of the world. #: frontWidget.ui:294 msgctxt "frontWidget|" msgid "Longer explanation about state of the world" msgstr "VУЄhУЄn pidempi selitys maailman tilasta" # Checkbox text in "my profile" tab. The checkbox is question is a toggle for public/private status of the profile. When checkbox is checked, the profile will be made private. #: frontWidget.ui:301 msgctxt "frontWidget|" msgid "Profile is private" msgstr "Profiili on yksityinen" # Button text inside "My profile" tab. Clicking the button opens a dialog that prompts user to select list of operators that can read his profile that he has previously marked as private (e.g. accessible only to listed readers) #: frontWidget.ui:308 msgctxt "frontWidget|" msgid "Readers of profile" msgstr "Profiilin lukijat" # Explanation text inside "my profile" tab. #: frontWidget.ui:315 msgctxt "frontWidget|" msgid "None of the fields is mandatory" msgstr "YksikУЄУЄn kentistУЄ ei ole pakollinen" # Text field label inside "my profile" tab. The field whose label this is shows the time when profile was last updated. #: frontWidget.ui:322 msgctxt "frontWidget|" msgid "Time of last update" msgstr "Edellisen pУЄivityksen ajankohta" # Button text for button inside "my profile" tab. By clicking this button user makes her edits known to rest of the world. #: frontWidget.ui:342 msgctxt "frontWidget|" msgid "Publish" msgstr "Julkaise" # Button text for button inside "my profile" tab. By clicking this button user discards her edits. #: frontWidget.ui:355 msgctxt "frontWidget|" msgid "Revert changes" msgstr "Peruuta muutokset" # Text label on top of "my profile" tab. Below this label is a list of text fields and other stuff that user may edit regarding herself. #: frontWidget.ui:369 msgctxt "frontWidget|" msgid "Details of operator profile:" msgstr "Operaattorin profiili" # Text in image-placeholder inside "my profile" tab. When user has not selected any image for her profile details, this text is shown in place of the image. Clicking on text gives user option to select the image file for profile. #: frontWidget.ui:401 msgctxt "frontWidget|" msgid "" "\n" "\n" "Click \n" "to \n" "Add\n" "Image" msgstr "" "\n" "\n" "Klikkaa \n" "LisУЄtУЄksesi\n" "Kuva" # Title text inside "my profile" tab. Title text is for a list of files that user is currently sharing with other users. #: frontWidget.ui:425 frontWidget.ui:845 msgctxt "frontWidget|" msgid "Shared files" msgstr "Jaetut tiedostot" # Title text inside "my profile" tab. Title text is for a list of comments made by other users regarding operators profile. #: frontWidget.ui:461 frontWidget.ui:897 msgctxt "frontWidget|" msgid "Latest comments" msgstr "ViimeisimmУЄt kommentit" # Tab title text. When this tab is opened, user is shown a view of his frequent contacts. #: frontWidget.ui:504 msgctxt "frontWidget|" msgid "Contacts" msgstr "Osoitekirja" # Button text inside "contacts" tab. Clicking this button opens a dialog prompting user to enter details of operator to be added into contact list #: frontWidget.ui:536 msgctxt "frontWidget|" msgid "Add contact" msgstr "LisУЄУЄ profiili" # Button text inside "contacts" tab. Clicking this button removes a contact from list. #: frontWidget.ui:543 msgctxt "frontWidget|" msgid "Remove contact" msgstr "Poista profiili" # Button text inside "contacts" tab. Clicking this button displays details of the selected contact. #: frontWidget.ui:550 msgctxt "frontWidget|" msgid "View profile" msgstr "Katsele profiilia" # Button text inside "contacts" tab. Clicking this button opens a dialog prompting user to send a message selected contact. #: frontWidget.ui:557 msgctxt "frontWidget|" msgid "Send message" msgstr "LУЄhetУЄ viesti" # Tab text in front widget. When user selects this tab, he is presented with list of his private correspondence. #: frontWidget.ui:569 msgctxt "frontWidget|" msgid "Private messages" msgstr "Yksityiset viestit" # Tab text in front widget. This tab shows details of some other operator of classified ads. Normally this text is replaced with nickname of the operator but if nothing like this is available, this text may be shown, this is the "default text". #: frontWidget.ui:624 msgctxt "frontWidget|" msgid "Profile details" msgstr "Profiilin yksityiskohdat" # Label text of a text-field. The text-field in question shows place of residence of operator whose details are on display. #: frontWidget.ui:741 msgctxt "frontWidget|" msgid "City/Country" msgstr "Kaupunki/maa" # Label text of a text-field. The text-field in question shows bitcoin wallet address of operator whose details are on display. #: frontWidget.ui:767 msgctxt "frontWidget|" msgid "BTC Addr" msgstr "BTC-osoite" # Text for image-placeholder inside "profile details" tab. When some particular operator has not selected any image for her profile, this text is shown in place of the image. Note html format. #: frontWidget.ui:829 msgctxt "frontWidget|" msgid "" "




No

Image

Inserted

" msgstr "" "




Ei

Kuvaa

Valittuna

" # Button text inside "defails of operator profile" tab. When the button is clicked, a new-message editor is opened. #: frontWidget.ui:874 msgctxt "frontWidget|" msgid "Send message to operator" msgstr "LУЄhetУЄ operaattorille viesti" # Button text in "operators details" view. Pressing the button initiates a new voice call to operator. #: frontWidget.ui:879 msgctxt "frontWidget|" msgid "Audio call" msgstr "Puhelu" # Button text inside "defails of operator profile" tab. When the button is clicked, dialog listing readers of the (private) profile. #: frontWidget.ui:884 msgctxt "frontWidget|" msgid "View readers" msgstr "Lukijat" # Button text inside "defails of operator profile" tab. When the button is clicked, a dialog is opened, dialog prompts user to enter a comment about the operator. #: frontWidget.ui:932 msgctxt "frontWidget|" msgid "Comment" msgstr "Kommentti" # Button text inside "defails of operator profile" tab. When the button is clicked, the operator whose data is on display is added into contact-list. #: frontWidget.ui:964 msgctxt "frontWidget|" msgid "Add to contacts" msgstr "LisУЄУЄ osoitekirjaan" # Dialog title text. Dialog is for adding a link to text being edited. #: ui/insertLink.ui:26 msgctxt "insertLinkDialog|" msgid "Insert link" msgstr "LisУЄУЄ linkki" # Label for a combobox-field inside "insert link" dialog. Next to this label is set of fields that together make up a valid URL to be inserted. #: ui/insertLink.ui:39 msgctxt "insertLinkDialog|" msgid "URL" msgstr "URL" # Label for a text-field inside "insert link" dialog. Next to this label is field where user is supposed the text that will be shown as the link. Consider
the text then "the text" is text that user is prompted to enter with this label. #: ui/insertLink.ui:112 msgctxt "insertLinkDialog|" msgid "Link label in text" msgstr "Linkin pУЄУЄllepУЄin nУЄkyvУЄ teksti" # Dialog title text. Dialog prompts user to manually add a network-connection to another node in the network. #: ui/manualConnectionDialog.ui:26 msgctxt "manualConnectionDialog|" msgid "Manually add node to connection queue" msgstr "LisУЄУЄ solmu yhteydenottolistalle" # Label text of numeric field. The numeric (input) field is TCP port of the remote node that will be connected. #: ui/manualConnectionDialog.ui:48 msgctxt "manualConnectionDialog|" msgid "Remote node listen port" msgstr "Solmun vastaanotto-portti (TCP-port)" # Label for text field inside "manually add connection" dialog. Text field whose label this is requires user to type in network address (ip addr or dns name) of the remote node. #: ui/manualConnectionDialog.ui:78 msgctxt "manualConnectionDialog|" msgid "Remote node network address" msgstr "Solmun verkko-osoite" # Tooltip text for a text field inside "manually add connection" dialog. The text field whose tooltip this is the remote network address input field. #: ui/manualConnectionDialog.ui:91 msgctxt "manualConnectionDialog|" msgid "IPv4, IPv6 or DNS name" msgstr "IPv4, IPV6 tai DNS-nimi" # Dialog title text for dialog that requires user to enter information about file to be shared with others. Metadata query dialog in practice. #: ui/metadataQuery.ui:26 msgctxt "metadataQuery|" msgid "File information" msgstr "Tiedoston ominaisuudet" # Label text for a input field. The input field whose label this is asks for file name (filesystem file name) #: ui/metadataQuery.ui:60 msgctxt "metadataQuery|" msgid "Name of the file:" msgstr "Tiedoston nimi:" # Label text for a input field. The input field whose label this is asks for owner of the file contents. This may be copyright holder, depending on contracts and legislation followed. #: ui/metadataQuery.ui:81 msgctxt "metadataQuery|" msgid "Owner of file (name or SHA1 if CA operator):" msgstr "Tiedoston omistaja:" # Label text for a input field. The input field whose label this is asks for license under which the file may be used. Combobox lists some pre-filled options like GPL,BSD,CC-BY etc. but user may also enter any text into field. #: ui/metadataQuery.ui:111 msgctxt "metadataQuery|" msgid "License of use:" msgstr "KУЄyttУЖУЄ koskeva lisenssi:" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:122 msgctxt "metadataQuery|" msgid "Public domain" msgstr "Public domain" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:127 msgctxt "metadataQuery|" msgid "GPL" msgstr "GPL" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:132 msgctxt "metadataQuery|" msgid "LGPL" msgstr "LGPL" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:137 msgctxt "metadataQuery|" msgid "BSD" msgstr "BSD" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:142 msgctxt "metadataQuery|" msgid "CC-BY" msgstr "CC-BY" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:147 msgctxt "metadataQuery|" msgid "CC-BY-SA" msgstr "CC-BY-SA" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:152 msgctxt "metadataQuery|" msgid "CC-BY-ND" msgstr "CC-BY-ND" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:157 msgctxt "metadataQuery|" msgid "CC-BY-NC" msgstr "CC-BY-NC" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:162 msgctxt "metadataQuery|" msgid "CC-BY-NC-SA" msgstr "CC-BY-NC-SA" # Combobox content text for license selection combobox. License texts might be wise leave as they are - untranslated #: ui/metadataQuery.ui:167 msgctxt "metadataQuery|" msgid "CC-BY-NC-ND" msgstr "CC-BY-NC-ND" # Label text for a input field. The input field whose label this is asks for mime-type of the field about to be published. #: ui/metadataQuery.ui:182 msgctxt "metadataQuery|" msgid "Mime-type:" msgstr "Mime-tyyppi:" # Label text for a input field. The input field whose label this is asks for descriptive text about file about to be published. #: ui/metadataQuery.ui:199 msgctxt "metadataQuery|" msgid "Description of file:" msgstr "Kuvaus:" # Prompt text on top of "metadata query" dialog. Below this label is set of input-fields that make up the meta-data of a file to be published. #: ui/metadataQuery.ui:218 msgctxt "metadataQuery|" msgid "Enter information regarding file before publish:" msgstr "SyУЖtУЄ tiedoston ominaisuudet ennen julkaisua:" # Dialog title text for a dialog that offers possibility to post a new classified ad for others to read. #: ui/newClassifiedAd.ui:26 msgctxt "newCaDialog|" msgid "Post a new classified ad" msgstr "LУЄhetУЄ uusi luokiteltu ilmoitus" # This label text is part of sentence, whole sentence goes for example "About buying of cars in sweden" where the words "bying", "cars", and "sweden" are combo-boxes that user may choose from ; this word here is the first word in that sentece. #: ui/newClassifiedAd.ui:47 msgctxt "newCaDialog|" msgid "About" msgstr "Aiheesta" # This label text is part of sentence, whole sentence goes for example "About buying of cars in sweden" where the words "bying", "cars", and "sweden" are combo-boxes that user may choose from ; this word here is the 3rd word in that sentece. #: ui/newClassifiedAd.ui:65 msgctxt "newCaDialog|" msgid "of" msgstr "koskien" # This label text is part of sentence, whole sentence goes for example "About buying of cars in sweden" where the words "bying", "cars", and "sweden" are combo-boxes that user may choose from ; this word here is the 5th word in that sentece. #: ui/newClassifiedAd.ui:81 msgctxt "newCaDialog|" msgid "in" msgstr "paikassa" # Label text of a text field inside "post a new classified ad" dialog. The input field whose label this is, requires user to enter a subject (topic) for her posting. #: ui/newClassifiedAd.ui:95 msgctxt "newCaDialog|" msgid "Subject" msgstr "Aihe" # Label text of a text field inside "post a new classified ad" dialog. The input field whose label this is, will show name file that is attached to the post. #: ui/newClassifiedAd.ui:129 msgctxt "newCaDialog|" msgid "Attachment: " msgstr "Liite:" # Push-button text inside "post a new classified ad" dialog. When user hits the button, another dialog is opened and user is required to select a file to be attached. #: ui/newClassifiedAd.ui:149 msgctxt "newCaDialog|" msgid "Add" msgstr "LisУЄУЄ" # Dialog title text for dialog that prompts user to edit+send a private message to another operator #: ui/newPrivMsg.ui:26 msgctxt "newPrivMsgDialog|" msgid "Send a private message" msgstr "LУЄhetУЄ yksityinen viesti" # Text field label for input field inside "compose a new private message dialog". The text field in question is "subject" or "topic" field of the message. #: ui/newPrivMsg.ui:39 msgctxt "newPrivMsgDialog|" msgid "Subject" msgstr "Aihe" # Text field label for input field inside "compose a new private message dialog". The text field in question is SHA1 address of the recipient. #: ui/newPrivMsg.ui:53 msgctxt "newPrivMsgDialog|" msgid "Recipient" msgstr "Vastaanottaja" # Label text of a text field inside "compose a new private message" dialog. The input field whose label this is, will show name file that is attached to the post. #: ui/newPrivMsg.ui:83 msgctxt "newPrivMsgDialog|" msgid "Attachments: " msgstr "Liitteet:" # Push-button text inside "compose a new private message" dialog. When user hits the button, another dialog is opened and user is required to select a file to be attached. #: ui/newPrivMsg.ui:103 msgctxt "newPrivMsgDialog|" msgid "Attach" msgstr "LiitУЄ" # Dialog title text for dialog that prompts user to edit+send a comment regarding another operator. #: ui/newProfileComment.ui:26 msgctxt "newProfileCommentDialog|" msgid "Comment a operators profile" msgstr "Kommentoi operaattorin profiilia" # Text field label for input field inside "compose a comment about operator dialog". The text field in question is "subject" or "topic" field of the comment. #: ui/newProfileComment.ui:39 msgctxt "newProfileCommentDialog|" msgid "Subject" msgstr "Aihe" # Text field label for input field inside "compose a comment about operator dialog". The text field in question is SHA1 digest (address) of the operator being commented. #: ui/newProfileComment.ui:53 msgctxt "newProfileCommentDialog|" msgid "Commented profile" msgstr "Kommentoitu profiili" # Label text of a text field inside "compose a comment about operator dialog" dialog. The input field whose label this is, will show name file that is attached to the post. #: ui/newProfileComment.ui:89 msgctxt "newProfileCommentDialog|" msgid "Attachments:" msgstr "Liitteet:" # Push-button text inside "compose a comment about operator dialog" dialog. When user hits the button, another dialog is opened and user is required to select a file to be attached. #: ui/newProfileComment.ui:109 msgctxt "newProfileCommentDialog|" msgid "Attach" msgstr "LiitУЄ" # Dialog title text for a dialog that prompts user to edit+publish a text document. #: ui/newTextDocument.ui:26 msgctxt "newTextDocumentDialog|" msgid "Edit and publish a new text document" msgstr "Muokkaa ja julkaise uusi tekstidokumentti" # Text field label for input field inside "compose a new text document" dialog. The text field in question is "subject" or "topic" field of the text document. #: ui/newTextDocument.ui:39 msgctxt "newTextDocumentDialog|" msgid "Document title" msgstr "Dokumentin aihe" # Label text of a text field inside "edit+publish a new text document dialog" dialog. The input field whose label this is, will show name file that is attached to the document. #: ui/newTextDocument.ui:75 msgctxt "newTextDocumentDialog|" msgid "Attachments:" msgstr "Liitteet:" # Push-button text inside "edit+publish a new text document dialog" dialog. When user hits the button, another dialog is opened and user is required to select a file to be attached. #: ui/newTextDocument.ui:95 msgctxt "newTextDocumentDialog|" msgid "Attach" msgstr "LiitУЄ" # Dialog title text for dialog that will show a listing of previous comments regarding operator (user himself or some other operator, it is the same dialog in both cases) #: ui/profileCommentDisplay.ui:26 msgctxt "profileCommentDisplay|" msgid "Comments regarding operator" msgstr "Kommentit koskien operaattoria" # Dialog title text for a dialog that prompts user to choose operators who will be able to read details, comments and shared files of his profile. #: ui/profileReadersDialog.ui:26 msgctxt "profileReadersDialog|" msgid "Profile readers list" msgstr "Profiilin lukijalista" # Text field label inside "add profiles to list of readers" dialog. The text field whose prompt this is asks for search-words to be used to filter operator names/addresses from database. #: ui/profileReadersDialog.ui:37 msgctxt "profileReadersDialog|" msgid "Search for profiles to add" msgstr "Etsi lisУЄttУЄviУЄ profiileja" # Text field label inside "add profiles to list of readers" dialog. The text listing-field whose explanation this is will list operators whose nickname,name or other search-term matches conditions entered by user. #: ui/profileReadersDialog.ui:44 msgctxt "profileReadersDialog|" msgid "First 100 matching profiles:" msgstr "EnsimmУЄiset 100 osumaa:" # Push-button label inside "add profiles to list of readers" dialog. When user hits this button, operators that are selected from neighboring list will be added to list of readers of operators profile. #: ui/profileReadersDialog.ui:66 #| msgid "Add seleted to list of readers" msgctxt "profileReadersDialog|" msgid "Add selected to list of readers" msgstr "LisУЄУЄ valitut profiilin lukijoiksi" # Text field label inside "add profiles to list of readers" dialog. The text listing-field whose explanation this is shows current list operators profiles readers. #: ui/profileReadersDialog.ui:73 msgctxt "profileReadersDialog|" msgid "Current list of readers" msgstr "Lukijoiden nykyinen lista" # Push button label inside dialog that asks for list of operators who are readers of operators own profile. When user this this button, the dialog is dismissed. #: ui/profileReadersDialog.ui:90 msgctxt "profileReadersDialog|" msgid "Close" msgstr "Sulje" # Push button label inside dialog that asks for list of operators who are readers of operators own profile. When user this this button, selected operators are removed from the list. #: ui/profileReadersDialog.ui:109 msgctxt "profileReadersDialog|" msgid "Remove selected" msgstr "Poista valitut" # Dialog title-text for a search dialog. #: ui/searchDisplay.ui:26 msgctxt "searchDisplay|" msgid "Search data storage" msgstr "Etsi tietovarastosta" # Label text of a text field inside "search" dialog. The text field in question requires user to enter one or more words that are then searched from all available (public) documents. #: ui/searchDisplay.ui:60 msgctxt "searchDisplay|" msgid "Words:" msgstr "Sanoja" # Push button label inside "search" dialog. When button is hit, search using given words is performed. #: ui/searchDisplay.ui:70 msgctxt "searchDisplay|" msgid "Search" msgstr "Hae" # Check-box label inside "search" dialog. When box is checked, the search is done also in neighboring nodes in the network, not only in local storage. #: ui/searchDisplay.ui:87 msgctxt "searchDisplay|" msgid "Network search" msgstr "Verkkohaku" # Check-box label inside "search" dialog. When box is checked, the search may include classified ads in its resultset. #: ui/searchDisplay.ui:101 msgctxt "searchDisplay|" msgid "Search ads" msgstr "Etsi ilmoituksista" # Check-box label inside "search" dialog. When box is checked, the search may include operator profiles in its resultset. #: ui/searchDisplay.ui:111 msgctxt "searchDisplay|" msgid "Search profiles" msgstr "Etsi profiileista" # Check-box label inside "search" dialog. When box is checked, the search may include profile commetns in its resultset. #: ui/searchDisplay.ui:121 msgctxt "searchDisplay|" msgid "Search comments" msgstr "Etsi kommenteista" # Dialog title text for "settings" dialog. #: ui/settingsDialog.ui:26 msgctxt "settingsDialog|" msgid "Node settings" msgstr "Solmun asetukset" # Text field label for input field inside "settings" dialog. The numerical input field whose label this is has TCP port number of the node. #: ui/settingsDialog.ui:39 msgctxt "settingsDialog|" msgid "TCP listen port" msgstr "TCP-kuunteluportti" # Tooltip-text for input field inside "settings" dialog. The numerical input field whose label this is has TCP port number of the node. #: ui/settingsDialog.ui:58 msgctxt "settingsDialog|" msgid "Incoming TCP listen port. Change requires node restart. " msgstr "" "Kuunteluportti. TУЄmУЄn vaihtaminen edellyttУЄУЄ ohjelman uudelleenkУЄynnistystУЄ." # Text field label for input field inside "settings" dialog. The textual input field whose label this is requires user to enter DNS-name of the node (or leave it empty, if no name is assigned) #: ui/settingsDialog.ui:84 msgctxt "settingsDialog|" msgid "DNS name of node" msgstr "Solmun nimipalvelunimi" # Tooltip-text for input field inside "settings" dialog. The textual input field whose label this is requires user to enter DNS-name of the node (or leave it empty, if no name is assigned) #: ui/settingsDialog.ui:91 msgctxt "settingsDialog|" msgid "" "If you have permanent DNS name for your machine, you may type it here to be " "used to reference your node" msgstr "" "Jos solmullasi on pysyvУЄ nimi nimipalvelussa, voit syУЖttУЄУЄ sen tУЄhУЄn jotta " "muut solmut voivat siihen viitata" # Text label inside "settings" dialog. Under this label is set of numerical input fields that user may use to adjust the amount of items he wishes to keep in his local storage. #: ui/settingsDialog.ui:103 msgctxt "settingsDialog|" msgid "Data store limits:" msgstr "Tietokannan sisУЄllУЖn enimmУЄismУЄУЄrУЄt:" # Text field label for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of operator profiles to keep in storage. #: ui/settingsDialog.ui:115 msgctxt "settingsDialog|" msgid "Nr of profiles to keep" msgstr "Talletettavien profiilien mУЄУЄrУЄ" # Text field label for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of private messages to keep in storage. #: ui/settingsDialog.ui:154 msgctxt "settingsDialog|" msgid "Nr of private messages to keep" msgstr "Yksityisten viestien mУЄУЄrУЄ" # Text field label for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of binary files to keep in storage. #: ui/settingsDialog.ui:193 msgctxt "settingsDialog|" msgid "Nr of binary blobs to keep" msgstr "BinУЄУЄritiedostojen mУЄУЄrУЄ" # Text field label for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of classified ads to keep in storage. #: ui/settingsDialog.ui:232 msgctxt "settingsDialog|" msgid "Nr of CAs to keep" msgstr "Ilmoitusten mУЄУЄrУЄ" # Tooltip-text for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of classified ads to keep in storage. #: ui/settingsDialog.ui:251 msgctxt "settingsDialog|" msgid "" "Number of classified ads to keep in storage, total, including all " "classifications. Oldest referenced will be deleted first." msgstr "" "Paikallisessa tietokannassa talletettavien ilmoitusten mУЄУЄrУЄ, koskien " "kaikkia luokitteluja. ViimeisimmУЄksi viitatut tullaan poistamaan " "ensimmУЄisenУЄ." # Text field label for input field inside "settings" dialog. The numerical input field whose label this is has maximum number of comments regarding operators to keep in storage. #: ui/settingsDialog.ui:274 msgctxt "settingsDialog|" msgid "Nr of profile comments to keep" msgstr "Kommenttien mУЄУЄrУЄ" # Settings dialog text for item that tells how many records of distributed database to keep #: ui/settingsDialog.ui:313 msgctxt "settingsDialog|" msgid "Nr of db records to keep" msgstr "Jaetun tietokannan tietuemУЄУЄrУЄ" # Label for combo-box where user can choose between voice call ringtones. #: ui/settingsDialog.ui:349 msgctxt "settingsDialog|" msgid "Ringtone" msgstr "Puhelun hУЄlytysУЄУЄni" # Selection-list item. Selection list is for choosing between audio call ringtones, this is for ringtone that is performed with a bow. #: ui/settingsDialog.ui:357 msgctxt "settingsDialog|" msgid "Bow" msgstr "Jousella" # Selection-list item. Selection list is for choosing between audio call ringtones, this is for ringtone that is electrical. #: ui/settingsDialog.ui:362 msgctxt "settingsDialog|" msgid "Electrical" msgstr "SУЄhkУЖisesti" # Selection-list item. Selection list is for choosing between audio call ringtones, this is for ringtone that is performed in acoustic manner #: ui/settingsDialog.ui:367 msgctxt "settingsDialog|" msgid "Acoustic" msgstr "Akustisesti" # Selection-list item. Selection list is for choosing between audio call ringtones, this is for ringtone that is only a beep #: ui/settingsDialog.ui:372 msgctxt "settingsDialog|" msgid "Beep" msgstr "Piippaus" # Selection-list item. Selection list is for choosing between audio call ringtones, this is for ringtone that is silent #: ui/settingsDialog.ui:377 msgctxt "settingsDialog|" msgid "Silence" msgstr "Hiljaisuus" # Combox-box label text. Combo-box is for selecting which audio calls to accept, selections are like "all ; no calls at all ; from some operators ; .." #: ui/settingsDialog.ui:389 msgctxt "settingsDialog|" msgid "Accept voice calls" msgstr "HyvУЄksy puhelut" # Combobox item text for selecting which audio calls to accept. Selecting this item lets all calls in. #: ui/settingsDialog.ui:397 msgctxt "settingsDialog|" msgid "All" msgstr "Kaikki" # Combobox item text for selecting which audio calls to accept. Selecting this item lets in calls from trusted operators. #: ui/settingsDialog.ui:402 msgctxt "settingsDialog|" msgid "From trusted operators" msgstr "Vain luotetuilta operaattoreilta" # Combobox item text for selecting which audio calls to accept. Selecting this item rejects all calls. #: ui/settingsDialog.ui:407 msgctxt "settingsDialog|" msgid "Accept no voice calls" msgstr "Ei ainuttakaan" # Dialog title text for a dialog that shows network connectivity details. #: ui/statusDialog.ui:26 msgctxt "statusDialog|" msgid "Network and connection status" msgstr "Verkon ja yhteyksien tila" # Text field label for display-item inside "network status" dialog. The display-item shows ipv4-network address of the node. Usually it is (public) IP addr of the very machine that user is using at the moment. #: ui/statusDialog.ui:48 msgctxt "statusDialog|" msgid "Detected own IPv4" msgstr "Oma havaittu IPv4" # Tooltip-text for display-item inside "network status" dialog. The display-item shows ipv4-network address of the node. Usually it is (public) IP addr of the very machine that user is using at the moment. #: ui/statusDialog.ui:61 ui/statusDialog.ui:93 msgctxt "statusDialog|" msgid "" "Should your friend have trouble connecting, give her this address with port " "number" msgstr "" "Jos ystУЄvУЄsi ei pУЄУЄse verkon jУЄseneksi, yritУЄ antaa hУЄnelle tУЄmУЄ osoite " "porttinumeron kera" # Text field label for display-item inside "network status" dialog. The display-item shows IPV6-address of the node. Usually it is (public) IPv6 addr of the very machine that user is using at the moment. #: ui/statusDialog.ui:74 msgctxt "statusDialog|" msgid "IPv6" msgstr "IPv6" # Text field label for display-item inside "network status" dialog. The display-item shows listen port of the node. #: ui/statusDialog.ui:113 msgctxt "statusDialog|" msgid "TCP port currently used" msgstr "KУЄytУЖssУЄ oleva TCP-portti" # Text field label for a list-item inside "network status" dialog. The list-item shows list of currently connected other nodes in the network. #: ui/statusDialog.ui:151 msgctxt "statusDialog|" msgid "Currently open connections" msgstr "Avoimet yhteydet" # Push-button label for button inside "network status" dialog. When button is hit, another dialog is opened, asking user for details about the remote node to connect. #: ui/statusDialog.ui:195 msgctxt "statusDialog|" msgid "Manually add connection" msgstr "LisУЄУЄ yhteys kУЄsipelillУЄ" # Push-button label for button inside "network status" dialog. When button is hit, dialog is dismissed. #: ui/statusDialog.ui:202 msgctxt "statusDialog|" msgid "Close" msgstr "Sulje" # Dialog title text for dialog that displays TCL interpreter console. #: ui/tclConsole.ui:26 msgctxt "tclConsoleDialog|" msgid "TCL Interpreter console" msgstr "TCL-komentotulkin syУЖtteet ja tulosteet" # Button text for button that runs TCL commands that user has typed #: ui/tclConsole.ui:51 msgctxt "tclConsoleDialog|" msgid "Evaluate" msgstr "Suorita" # Button text for button that closes TCL interpreter window. Not the interpreter but only the console dialog. #: ui/tclConsole.ui:58 msgctxt "tclConsoleDialog|" msgid "Close" msgstr "Sulje" # label for text field that shows TCL interpreter output #: ui/tclConsole.ui:69 msgctxt "tclConsoleDialog|" msgid "Interpreter output" msgstr "TCL-tulkin tulosteet" # label for text field that shows TCL interpreter input #: ui/tclConsole.ui:79 msgctxt "tclConsoleDialog|" msgid "Command input" msgstr "TCL-kieliset komennot suoritettavaksi" # Dialog title text for dialog that lists stored TCL programs #: ui/tclPrograms.ui:26 msgctxt "tclProgramsDialog|" msgid "TCL programs" msgstr "TCL-Ohjelmat" # Label for list-item that lists stored TCL programs. #: ui/tclPrograms.ui:48 msgctxt "tclProgramsDialog|" msgid "Stored programs" msgstr "Ohjelmat" # Label for text item that shows program text of locally stored TCL program #: ui/tclPrograms.ui:68 msgctxt "tclProgramsDialog|" msgid "Program code" msgstr "Ohjelmakoodi" classified-ads-0.13/po/sv.po000066400000000000000000001661711331670245300157360ustar00rootroot00000000000000# Antti JУЄrvinen , 2016. #zanata # GУЖran Uddeborg , 2016. #zanata # GУЖran Uddeborg , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: classified-ads 0.10\n" "Report-Msgid-Bugs-To: antti.jarvinen@katiska.org\n" "POT-Creation-Date: 2016-03-14 21:30+0300\n" "PO-Revision-Date: 2017-01-20 04:42-0500\n" "Last-Translator: GУЖran Uddeborg \n" "Language-Team: Swedish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Zanata 3.9.6\n" "X-Language: sv_SE\n" "X-Qt-Contexts: true\n" # Man kan spara pengar ocksУЅ? #: ui/attachmentlistdialog.cpp:60 msgctxt "AttachmentListDialog|" msgid "Save file to disk.." msgstr "Spara till filsystem.." #: ui/attachmentlistdialog.cpp:151 ui/attachmentlistdialog.cpp:153 msgctxt "AttachmentListDialog|" msgid "files" msgstr "filer" #: ui/attachmentlistdialog.cpp:155 msgctxt "AttachmentListDialog|" msgid "Choose file name for saving" msgstr "VУЄlj ett namn for din fil" #: ui/attachmentlistdialog.cpp:166 msgctxt "AttachmentListDialog|" msgid "Error" msgstr "Fel" #: ui/attachmentlistdialog.cpp:167 msgctxt "AttachmentListDialog|" msgid "File open error" msgstr "Fel i att УЖppna en fil" #: call/audioplayer.cpp:65 msgctxt "AudioPlayer|" msgid "raw audio format not supported by backend, cannot play audio." msgstr "rУЅtt audioformat stУЖdjs inte av bakУЄnden, kan inte spela upp ljudet." #: call/audioplayer.cpp:83 msgctxt "AudioPlayer|" msgid "Could not initialize audio player." msgstr "Kunde inte initiera audiospelaren." #: datamodel/binaryfilelistingmodel.cpp:173 msgctxt "BinaryFileListingModel|" msgid "Name or fingerprint of file" msgstr "Namn eller fingeravtryck pУЅ filen" #: datamodel/calistingmodel.cpp:50 datamodel/calistingmodel.cpp:143 msgctxt "CAListingModel|" msgid "Date" msgstr "Datum" #: datamodel/calistingmodel.cpp:51 datamodel/calistingmodel.cpp:142 msgctxt "CAListingModel|" msgid "Subject" msgstr "Rubrik" #: datamodel/camodel.cpp:127 msgctxt "ClassifiedAdsModel|" msgid "Buying" msgstr "KУЖper" #: datamodel/camodel.cpp:129 msgctxt "ClassifiedAdsModel|" msgid "Selling" msgstr "SУЄljer" #: datamodel/camodel.cpp:131 msgctxt "ClassifiedAdsModel|" msgid "Giving away" msgstr "Ger bort" #: datamodel/camodel.cpp:133 msgctxt "ClassifiedAdsModel|" msgid "Wanting" msgstr "Vill ha" #: datamodel/camodel.cpp:135 msgctxt "ClassifiedAdsModel|" msgid "Renting" msgstr "Hyr" #: datamodel/camodel.cpp:137 msgctxt "ClassifiedAdsModel|" msgid "Announcement" msgstr "Meddelande" #: datamodel/camodel.cpp:210 msgctxt "ClassifiedAdsModel|" msgid "Cars" msgstr "Bilar" #: datamodel/camodel.cpp:212 msgctxt "ClassifiedAdsModel|" msgid "Boats" msgstr "BУЅtar" #: datamodel/camodel.cpp:214 msgctxt "ClassifiedAdsModel|" msgid "Bikes" msgstr "Cyklar" #: datamodel/camodel.cpp:216 msgctxt "ClassifiedAdsModel|" msgid "Other vehicles" msgstr "Andra fordon" #: datamodel/camodel.cpp:218 msgctxt "ClassifiedAdsModel|" msgid "Vehicle parts" msgstr "Fordonsdelar" #: datamodel/camodel.cpp:220 msgctxt "ClassifiedAdsModel|" msgid "Habitation" msgstr "Bostad" #: datamodel/camodel.cpp:222 msgctxt "ClassifiedAdsModel|" msgid "Household appliances" msgstr "HushУЅllsapparater" #: datamodel/camodel.cpp:224 msgctxt "ClassifiedAdsModel|" msgid "Furniture" msgstr "MУЖbler" #: datamodel/camodel.cpp:226 msgctxt "ClassifiedAdsModel|" msgid "Clothing" msgstr "KlУЄder" #: datamodel/camodel.cpp:228 msgctxt "ClassifiedAdsModel|" msgid "Tools" msgstr "Verktyg" #: datamodel/camodel.cpp:230 msgctxt "ClassifiedAdsModel|" msgid "Sports" msgstr "Sport" #: datamodel/camodel.cpp:232 msgctxt "ClassifiedAdsModel|" msgid "Music" msgstr "Musik" #: datamodel/camodel.cpp:234 msgctxt "ClassifiedAdsModel|" msgid "Books" msgstr "BУЖcker" #: datamodel/camodel.cpp:236 msgctxt "ClassifiedAdsModel|" msgid "Movies" msgstr "Bio" #: datamodel/camodel.cpp:238 msgctxt "ClassifiedAdsModel|" msgid "Animals" msgstr "Djur" #: datamodel/camodel.cpp:240 msgctxt "ClassifiedAdsModel|" msgid "Electronics" msgstr "Elektronik" #: datamodel/camodel.cpp:242 msgctxt "ClassifiedAdsModel|" msgid "Jobs" msgstr "Arbete" #: datamodel/camodel.cpp:244 msgctxt "ClassifiedAdsModel|" msgid "Transportation" msgstr "Transport" #: datamodel/camodel.cpp:246 msgctxt "ClassifiedAdsModel|" msgid "Services" msgstr "TjУЄnster" #: datamodel/camodel.cpp:248 msgctxt "ClassifiedAdsModel|" msgid "Healthcare" msgstr "SjukvУЅrd" #: datamodel/camodel.cpp:250 msgctxt "ClassifiedAdsModel|" msgid "Foodstuff" msgstr "Livsmedel" #: datamodel/camodel.cpp:252 msgctxt "ClassifiedAdsModel|" msgid "Software" msgstr "Programvara" #: datamodel/camodel.cpp:254 msgctxt "ClassifiedAdsModel|" msgid "Events" msgstr "HУЄndelser" #: datamodel/camodel.cpp:256 msgctxt "ClassifiedAdsModel|" msgid "Education" msgstr "Utbildning" #: datamodel/camodel.cpp:258 msgctxt "ClassifiedAdsModel|" msgid "Finance" msgstr "Finans" #: datamodel/camodel.cpp:260 msgctxt "ClassifiedAdsModel|" msgid "Jewelry" msgstr "Smycken" #: datamodel/camodel.cpp:262 msgctxt "ClassifiedAdsModel|" msgid "Religious rituals" msgstr "ReligiУЖsa ritualer" #: datamodel/camodel.cpp:264 msgctxt "ClassifiedAdsModel|" msgid "Philosophy" msgstr "Filosofi" #: datamodel/camodel.cpp:908 msgctxt "ClassifiedAdsModel|" msgid "Any country" msgstr "Alla lУЄnder" #: datamodel/connectionlistingmodel.cpp:142 msgctxt "ConnectionListingModel|" msgid "Peer network address" msgstr "Motpartens nУЄtverksadress" #: datamodel/connectionlistingmodel.cpp:145 msgctxt "ConnectionListingModel|" msgid "Inbound connections are those where peer initiated connection" msgstr "" "Inkommande fУЖrbindelse УЄr sУЅdan nУЄr en annan dator УЖppnade datastrУЖmmen" #: datamodel/connectionlistingmodel.cpp:148 msgctxt "ConnectionListingModel|" msgid "Data transferred from peer to your node" msgstr "Data УЖverfУЖrd frУЅn motparten till din nod" #: datamodel/connectionlistingmodel.cpp:151 msgctxt "ConnectionListingModel|" msgid "Data transferred to peer from your node" msgstr "Data УЖverfУЖrd till motparten frУЅn din nod" #: datamodel/connectionlistingmodel.cpp:154 msgctxt "ConnectionListingModel|" msgid "Time when connection was opened" msgstr "Tid nУЄr datastrУЖm УЖppnades" #: datamodel/connectionlistingmodel.cpp:164 msgctxt "ConnectionListingModel|" msgid "Address" msgstr "Adress" #: datamodel/connectionlistingmodel.cpp:167 msgctxt "ConnectionListingModel|" msgid "Inbound" msgstr "Inkommande" #: datamodel/connectionlistingmodel.cpp:170 msgctxt "ConnectionListingModel|" msgid "Bytes in" msgstr "Oktett in" #: datamodel/connectionlistingmodel.cpp:173 msgctxt "ConnectionListingModel|" msgid "Bytes out" msgstr "Oktett ut" #: datamodel/connectionlistingmodel.cpp:176 msgctxt "ConnectionListingModel|" msgid "Open time" msgstr "У–ppningstid" #: datamodel/contactlistingmodel.cpp:73 msgctxt "ContactListingModel|" msgid "Yes" msgstr "Ja" #: datamodel/contactlistingmodel.cpp:75 msgctxt "ContactListingModel|" msgid "Unknown" msgstr "OkУЄnt" #: datamodel/contactlistingmodel.cpp:98 msgctxt "ContactListingModel|" msgid "Actual network address (SHA1) of the contact" msgstr "Kontaktens faktiska nУЄtverksadress (SHA1)" #: datamodel/contactlistingmodel.cpp:101 msgctxt "ContactListingModel|" msgid "Locally given nickname ; user may set her own nickname himself" msgstr "Lokalt smeknamn; anvУЄndare kan sУЄtta sitt eget smeknamn sjУЄlv" #: datamodel/contactlistingmodel.cpp:104 msgctxt "ContactListingModel|" msgid "Public statement if this operator to be trusted in transactions" msgstr "" "AllmУЄnt uttalande om huruvida man kan lita pУЅ denna operatУЖr i transaktioner" #: datamodel/contactlistingmodel.cpp:114 msgctxt "ContactListingModel|" msgid "Address" msgstr "Adress" #: datamodel/contactlistingmodel.cpp:117 msgctxt "ContactListingModel|" msgid "Nickname" msgstr "Smeknamn" #: datamodel/contactlistingmodel.cpp:120 msgctxt "ContactListingModel|" msgid "Publicly trusted" msgstr "Offentligt betrodd" #: datamodel/contentencryptionmodel.cpp:88 msgctxt "ContentEncryptionModel|" msgid "SSL key generation went wrong, calling exit.." msgstr "Kunde inte generera SSL-nyckel, anropar avslut т€І" #: datamodel/contentencryptionmodel.cpp:96 msgctxt "ContentEncryptionModel|" msgid "x509 cert generation went wrong, calling exit.." msgstr "Att generera ett x509-certifikat gick fel, anropar avslut т€І" #: datamodel/contentencryptionmodel.cpp:194 #: datamodel/contentencryptionmodel.cpp:292 msgctxt "ContentEncryptionModel|" msgid "RSA Private key key saving went wrong" msgstr "Att spara den privata RSA-nyckeln gick fel" #: datamodel/contentencryptionmodel.cpp:639 msgctxt "ContentEncryptionModel|" msgid "No suitable de-cryption key found" msgstr "Hemlig nyckel fУЖr dekryptering finns inte" #: controller.cpp:109 msgctxt "Controller|" msgid "Classified ads" msgstr "Rubrikannonser" #: controller.cpp:141 msgctxt "Controller|" msgid "Enter password for protection of your messages:" msgstr "Ange ett lУЖsenord fУЖr att skydda dina meddelanden:" #: controller.cpp:432 msgctxt "Controller|" msgid "Fetching item from network.." msgstr "HУЄmtning objektet.." #: controller.cpp:485 msgctxt "Controller|" msgid "E&xit" msgstr "S&tУЄng" #: controller.cpp:487 msgctxt "Controller|" msgid "Exit the application" msgstr "StУЄnga av program" #: controller.cpp:489 msgctxt "Controller|" msgid "&About" msgstr "&Om" #: controller.cpp:490 msgctxt "Controller|" msgid "Show the application's About box" msgstr "Visa progrmmets om-ruta" #: controller.cpp:492 msgctxt "Controller|" msgid "&Change password" msgstr "&У„ndra lУЖsenord" #: controller.cpp:493 msgctxt "Controller|" msgid "Change password of current profile" msgstr "FУЖrУЄndra lУЖsenorden fУЖr vald profil" #: controller.cpp:495 msgctxt "Controller|" msgid "Create &new profile" msgstr "Skapa en &ny profil" #: controller.cpp:496 msgctxt "Controller|" msgid "Makes a brand new user profile" msgstr "Skapar en ny profil fУЖr operator" #: controller.cpp:498 msgctxt "Controller|" msgid "&Delete current profile" msgstr "&Radera aktuell profil" #: controller.cpp:499 msgctxt "Controller|" msgid "Deletes currently open profile" msgstr "Ska glУЖmma allt om vald profil" #: controller.cpp:501 msgctxt "Controller|" msgid "&Select another profile" msgstr "&VУЄlj en annan profil" #: controller.cpp:502 msgctxt "Controller|" msgid "If you have multitude of profiles" msgstr "Om du har flera profiler" #: controller.cpp:504 msgctxt "Controller|" msgid "Settings.." msgstr "InstУЄllningar.." #: controller.cpp:505 msgctxt "Controller|" msgid "Node-wide settings.." msgstr "Nodgemensamma instУЄllningar т€І" #: controller.cpp:507 msgctxt "Controller|" msgid "Network status.." msgstr "NУЄtverksstatus т€І" #: controller.cpp:509 msgctxt "Controller|" msgid "Search.." msgstr "SУЖk.." #: controller.cpp:526 msgctxt "Controller|" msgid "&File" msgstr "&Arkiv" #: controller.cpp:571 msgctxt "Controller|" msgid "Enter new password:" msgstr "Ge ett nytt lУЖsenord:" #: controller.cpp:599 controller.cpp:708 msgctxt "Controller|" msgid "Activate another profile with password" msgstr "VУЄlja en annan profil med ett lУЖsenord" #: controller.cpp:693 msgctxt "Controller|" msgid "Can't delete only profile." msgstr "Man kan inte radera den enda profilen." #: controller.cpp:697 msgctxt "Controller|" msgid "Permanently discard profile?" msgstr "Radera profil?" #: controller.cpp:698 msgctxt "Controller|" msgid "There will be NO way to access content of this profile later" msgstr "" "Det kommer INTE finnas nУЅgot sУЄtt att komma УЅt innehУЅllet i den hУЄr profilen" " senare" #: controller.cpp:761 msgctxt "Controller|" msgid "Cant load node cert or key cert" msgstr "Kan inte ladda certifikat eller nyckelcertifikat" #: controller.cpp:766 msgctxt "Controller|" msgid "File error" msgstr "Fel med filen" #: controller.cpp:771 msgctxt "Controller|" msgid "Database error" msgstr "Fel med databas" #: controller.cpp:777 controller.cpp:787 msgctxt "Controller|" msgid "Cryptographic module" msgstr "Kryptografisk modul" #: controller.cpp:782 msgctxt "Controller|" msgid "Database module" msgstr "Databasmodul" #: controller.cpp:788 msgctxt "Controller|" msgid "Bad password" msgstr "Fel lУЖsenord" #: controller.cpp:1004 msgctxt "Controller|" msgid "Could not find item from network.." msgstr "Kunde inte hitta objektet i nУЄtverket т€І" #: controller.cpp:1117 msgctxt "Controller|" msgid "SHA1: " msgstr "SHA1: " #: controller.cpp:1122 msgctxt "Controller|" msgid "Mime-Type: " msgstr "Mime-typ: " #: controller.cpp:1128 msgctxt "Controller|" msgid "Description: " msgstr "Beskrivning: " #: controller.cpp:1134 msgctxt "Controller|" msgid "Publisher: " msgstr "FУЖrlУЄggare: " #: controller.cpp:1140 msgctxt "Controller|" msgid "Content owner: " msgstr "InnehУЅllsУЄgare: " #: controller.cpp:1146 msgctxt "Controller|" msgid "License: " msgstr "Licens: " #: controller.cpp:1152 msgctxt "Controller|" msgid "Name: " msgstr "Namn: " #: controller.cpp:1159 msgctxt "Controller|" msgid "Date: " msgstr "Datum: " #: ui/dialogbase.cpp:47 ui/dialogbase.cpp:101 msgctxt "DialogBase|" msgid "File way too big" msgstr "Filen УЄr alldeles fУЖr stor" #: ui/dialogbase.cpp:55 ui/dialogbase.cpp:109 msgctxt "DialogBase|" msgid "File too big" msgstr "Filen УЄr fУЖr stor" #: ui/dialogbase.cpp:85 ui/dialogbase.cpp:131 msgctxt "DialogBase|" msgid "File open error" msgstr "Fel nУЄr filen УЖppnades" #: ui/dialogbase.cpp:94 msgctxt "DialogBase|" msgid "Select file to be published" msgstr "VУЄlj filen som skall publiceras" #: ui/dialogbase.cpp:96 msgctxt "DialogBase|" msgid "Files (*.*)" msgstr "Alla filer (*.*)" #: ui/editcontact.cpp:72 msgctxt "EditContactDialog|" msgid "Error" msgstr "Fel" #: ui/editcontact.cpp:73 msgctxt "EditContactDialog|" msgid "Operator addr is not valid" msgstr "Adress av operator УЄr inte giltig" #: FrontWidget.cpp:95 msgctxt "FrontWidget|" msgid "Classified ads" msgstr "Rubrikannonser" #: FrontWidget.cpp:96 msgctxt "FrontWidget|" msgid "My profile" msgstr "Egen profil" #: FrontWidget.cpp:97 msgctxt "FrontWidget|" msgid "Contacts" msgstr "Kontakter" #: FrontWidget.cpp:98 msgctxt "FrontWidget|" msgid "Private messages" msgstr "Privat korrespondens" #: FrontWidget.cpp:160 msgctxt "FrontWidget|" msgid "Add shared file.." msgstr "LУЄgg till delad fil т€І" #: FrontWidget.cpp:161 msgctxt "FrontWidget|" msgid "Stop advertising selected shared file" msgstr "Sluta annonsera den markerade filen" #: FrontWidget.cpp:162 msgctxt "FrontWidget|" msgid "Save file to disk.." msgstr "Spara filen till disk.." #: FrontWidget.cpp:163 msgctxt "FrontWidget|" msgid "View file information.." msgstr "Visa beskrivning av filen.." #: FrontWidget.cpp:164 msgctxt "FrontWidget|" msgid "Copy file address (SHA1) to clipboard.." msgstr "Kopiera adressen (SHA1) till urklipp т€І" #: FrontWidget.cpp:165 msgctxt "FrontWidget|" msgid "Edit+publish new text document.." msgstr "Skapa+publicera ett nytt dokument т€І" #: FrontWidget.cpp:353 msgctxt "FrontWidget|" msgid "Open File" msgstr "У–ppna filen" #: FrontWidget.cpp:355 FrontWidget.cpp:885 msgctxt "FrontWidget|" msgid "Files (*.*)" msgstr "Alla typer (*.*)" #: FrontWidget.cpp:359 FrontWidget.cpp:1185 FrontWidget.cpp:1328 msgctxt "FrontWidget|" msgid "Error" msgstr "Fel" #: FrontWidget.cpp:360 msgctxt "FrontWidget|" msgid "Can't load image" msgstr "Kan inte ladda en bild" #: FrontWidget.cpp:626 FrontWidget.cpp:766 msgctxt "FrontWidget|" msgid "Profile not in database" msgstr "Profil finns inte i lokal databas" #: FrontWidget.cpp:627 FrontWidget.cpp:767 msgctxt "FrontWidget|" msgid "Try viewing profile first to obtain data" msgstr "Du kan fУЖrsУЖka att se profil fУЖrst fУЖr att hУЄmta data" #: FrontWidget.cpp:883 msgctxt "FrontWidget|" msgid "Select file to be published" msgstr "VУЄlja filen du vill ha publicerad" #: FrontWidget.cpp:890 msgctxt "FrontWidget|" msgid "File way too big" msgstr "Filen УЄr alldeles fУЖr stor" #: FrontWidget.cpp:898 msgctxt "FrontWidget|" msgid "File too big" msgstr "Filen УЄr fУЖr stor" #: FrontWidget.cpp:942 FrontWidget.cpp:1186 msgctxt "FrontWidget|" msgid "File open error" msgstr "Fel med УЖppningen av filen" #: FrontWidget.cpp:1167 FrontWidget.cpp:1173 msgctxt "FrontWidget|" msgid "files" msgstr "filer" #: FrontWidget.cpp:1176 msgctxt "FrontWidget|" msgid "Choose file name for saving" msgstr "VУЄlj ett namn for din fil" #: FrontWidget.cpp:1236 msgctxt "FrontWidget|" msgid "" "\n" "\n" "\n" "Click\n" "To\n" "Add\n" "Image\n" msgstr "" "\n" "\n" "\n" "Klicka\n" "fУЖr att\n" "lУЄgga till\n" "en bild\n" #: FrontWidget.cpp:1329 msgctxt "FrontWidget|" msgid "Article not found from local storage" msgstr "Artikeln finns inte lokalt lagrad" #: FrontWidget.cpp:1355 FrontWidget.cpp:1903 #, qt-format msgctxt "FrontWidget|" msgid "" "Trusted by %1\n" "SHA1 %2" msgstr "" "Betrodd av %1\n" "SHA1 %2" #: FrontWidget.cpp:1392 msgctxt "FrontWidget|" msgid "Time of last update " msgstr "Tid fУЖr senaste УЄndring " #: FrontWidget.cpp:1400 msgctxt "FrontWidget|" msgid "" "\n" "\n" "\n" "(No\n" "Image\n" "Selected)\n" msgstr "" "\n" "\n" "\n" "(Ingen\n" "bild\n" "vald)\n" #: FrontWidget.cpp:1494 msgctxt "FrontWidget|" msgid "Edit contact.." msgstr "Redigera kontakt т€І" #: FrontWidget.cpp:1534 msgctxt "FrontWidget|" msgid "&Reply to sender" msgstr "&Svara avsУЄndaren" #: FrontWidget.cpp:1535 msgctxt "FrontWidget|" msgid "Reply to &forum" msgstr "Svara pУЅ &forumet" #: FrontWidget.cpp:1536 msgctxt "FrontWidget|" msgid "&Post new ad" msgstr "Ska&pa en ny annons" #: FrontWidget.cpp:1537 msgctxt "FrontWidget|" msgid "&Public comment" msgstr "&Publik kommentar" #: FrontWidget.cpp:1538 msgctxt "FrontWidget|" msgid "&View profile" msgstr "&Visa profilen" #: FrontWidget.cpp:1539 FrontWidget.cpp:1677 msgctxt "FrontWidget|" msgid "Attachments.." msgstr "Bilagor.." #: FrontWidget.cpp:1599 msgctxt "FrontWidget|" msgid "Add selected operator to contacts.." msgstr "LУЄgg till vald operator till kontakterna т€І" #: FrontWidget.cpp:1673 msgctxt "FrontWidget|" msgid "&Reply" msgstr "&Svara" #: FrontWidget.cpp:1674 msgctxt "FrontWidget|" msgid "&New message" msgstr "&Nytt meddelande" #: FrontWidget.cpp:1675 msgctxt "FrontWidget|" msgid "&Send public comment to sender" msgstr "&Skicka en publik kommentar till avsУЄndaren" #: FrontWidget.cpp:1676 msgctxt "FrontWidget|" msgid "&View profile of peer" msgstr "&Visa profilen" #: FrontWidget.cpp:1711 msgctxt "FrontWidget|" msgid "Add selected to contacts.." msgstr "LУЄgg till makerade till dina kontakter т€І" #: FrontWidget.cpp:1913 FrontWidget.cpp:1915 FrontWidget.cpp:1979 #: FrontWidget.cpp:1981 msgctxt "FrontWidget|" msgid "From:" msgstr "FrУЅn:" #: FrontWidget.cpp:1917 FrontWidget.cpp:1984 msgctxt "FrontWidget|" msgid "Subject:" msgstr "Rubrik:" #: FrontWidget.cpp:1976 msgctxt "FrontWidget|" msgid "To:" msgstr "Mottagare:" #: FrontWidget.cpp:2288 msgctxt "FrontWidget|" msgid "Invalid SHA1 in URL" msgstr "SHA1 i URL УЄr inte giltig" #: FrontWidget.cpp:2315 msgctxt "FrontWidget|" msgid "Invalid URL" msgstr "URL УЄr inte giltig" #: ui/insertlinkdialog.cpp:69 msgctxt "InsertLinkDialog|" msgid "Invalid URL" msgstr "URL УЄr inte giltig" #: ui/manualconnection.cpp:53 msgctxt "ManualConnectionDialog|" msgid "DNS lookup failure" msgstr "Namnet kunde inte hittas frУЅn DNS" #: ui/newprivmsgdialog.cpp:88 ui/newprivmsgdialog.cpp:138 msgctxt "NewPrivMessageDialog|" msgid "Error" msgstr "Fel" #: ui/newprivmsgdialog.cpp:89 msgctxt "NewPrivMessageDialog|" msgid "Recipient addr is not valid" msgstr "Adressen till mottagaren УЄr inte giltig" #: ui/newprivmsgdialog.cpp:139 msgctxt "NewPrivMessageDialog|" msgid "Recipient encryption key not found from storage" msgstr "Krypteringsnyckel fУЖr mottagaren kunde inte hittas i lokal databas" #: ui/newprofilecommentdialog.cpp:89 ui/newprofilecommentdialog.cpp:126 msgctxt "NewProfileCommentDialog|" msgid "Error" msgstr "Fel" #: ui/newprofilecommentdialog.cpp:90 msgctxt "NewProfileCommentDialog|" msgid "Commented profile addr is not valid" msgstr "Adressen fУЖr profil УЄr inte giltig" #: ui/newprofilecommentdialog.cpp:127 msgctxt "NewProfileCommentDialog|" msgid "Recipient encryption key not found from storage" msgstr "Kunde inte hittas kryptering-nyckel frУЅn lokal databas" #: datamodel/nodemodel.cpp:115 msgctxt "NodeModel|" msgid "SSL key generation went wrong, calling exit.." msgstr "Kunde inte skapa SSL-nyckel, anropar avslut т€І" #: datamodel/nodemodel.cpp:123 msgctxt "NodeModel|" msgid "x509 cert generation went wrong, calling exit.." msgstr "Kunde inte skapa x509-nyckel, anropar avslut т€І" #: datamodel/nodemodel.cpp:1596 msgctxt "NodeModel|" msgid "Cant load SSL cert" msgstr "Kan inte lУЄsa in SSL-certifikat" #: datamodel/nodemodel.cpp:1626 msgctxt "NodeModel|" msgid "Cant load SSL key" msgstr "Kunde inte ladda SSL-nyckel " #: ui/passwd_dialog.cpp:104 msgctxt "PasswdDialog|" msgid "Min length 5 (use 10+)" msgstr "MinimilУЄngd УЄr 5 (du skulle anvУЄnda minst 10+)" #: ui/passwordDialog.ui:14 msgctxt "PasswordDialog|" msgid "Password required" msgstr "LУЖsenord krУЄvs" #: ui/passwordDialog.ui:17 msgctxt "PasswordDialog|" msgid "" "Should you forget this word, there is no easy way to recover any of your " "content" msgstr "" "Skulle du glУЖmma det hУЄr ordet finns det inte nУЅgot enkelt sУЄtt УЅterfУЅ nУЅgot" " av ditt innehУЅll" #: ui/passwordDialog.ui:29 msgctxt "PasswordDialog|" msgid "Enter password for protection of your messages" msgstr "Ge ett lУЖsenord" #: ui/passwordDialog.ui:42 msgctxt "PasswordDialog|" msgid "" "If you forget this word, there is no simple way to recover your contents" msgstr "" "Om du glУЖmmer det hУЄr ordet finns det inte nУЅgot lУЄtt sУЄtt att УЅterfУЅ ditt " "innehУЅll" #: ui/passwordDialog.ui:55 msgctxt "PasswordDialog|" msgid "OK" msgstr "OK" #: datamodel/privmsgsearchmodel.cpp:110 #, qt-format msgctxt "PrivateMessageSearchModel|" msgid "" "%1\n" "Trusted by %2" msgstr "" "%1\n" "Betrodd av %2" #: datamodel/privmsgsearchmodel.cpp:237 msgctxt "PrivateMessageSearchModel|" msgid "Direction of message, sent/received" msgstr "Meddelandets riktning, skickat/mottaget" #: datamodel/privmsgsearchmodel.cpp:247 msgctxt "PrivateMessageSearchModel|" msgid "Dir" msgstr "Riktning" #: datamodel/privmsgsearchmodel.cpp:250 msgctxt "PrivateMessageSearchModel|" msgid "Peer" msgstr "Motpart" #: datamodel/privmsgsearchmodel.cpp:253 msgctxt "PrivateMessageSearchModel|" msgid "Time" msgstr "Datum" #: datamodel/privmsgsearchmodel.cpp:256 msgctxt "PrivateMessageSearchModel|" msgid "Subject" msgstr "Rubrik" #: ui/profilecommentdisplay.cpp:54 msgctxt "ProfileCommentDisplay|" msgid "&Add comment..." msgstr "&LУЄgg till en kommentar т€І" #: ui/profilecommentdisplay.cpp:65 msgctxt "ProfileCommentDisplay|" msgid "Save attachment to disk.." msgstr "Spara filen till disk.." #: ui/profilecommentdisplay.cpp:92 msgctxt "ProfileCommentDisplay|" msgid "Error" msgstr "Fel" #: ui/profilecommentdisplay.cpp:93 msgctxt "ProfileCommentDisplay|" msgid "Article not found from local storage" msgstr "Annons kunde inte hittas i lokal databas" #: ui/profilecommentitemdelegate.cpp:93 msgctxt "ProfileCommentItemDelegate|" msgid "Attachments: " msgstr "Bilagor: " #: datamodel/profilecommentlistingmodel.cpp:219 msgctxt "ProfileCommentListingModel|" msgid "Sender" msgstr "AvsУЄndare" #: datamodel/profilecommentlistingmodel.cpp:222 msgctxt "ProfileCommentListingModel|" msgid "Time" msgstr "Datum" #: datamodel/profilecommentlistingmodel.cpp:225 msgctxt "ProfileCommentListingModel|" msgid "Subject" msgstr "Rubrik" #: datamodel/profilecommentmodel.cpp:67 msgctxt "ProfileCommentModel|" msgid "Profile related to comment not found from database" msgstr "Profilen kopplad till kommentaren finns inte i databasen" #: ui/profilereadersdialog.cpp:73 msgctxt "ProfileReadersDialog|" msgid "View profile" msgstr "Visa profilen" #: datamodel/profilereaderslistingmodel.cpp:174 msgctxt "ProfileReadersListingModel|" msgid "Name or fingerprint of reader" msgstr "Namn eller fingeravtryck pУЅ lУЄsaren" #: call/ringtoneplayer.cpp:77 msgctxt "RingtonePlayer|" msgid "raw audio format not supported by backend, cannot play audio." msgstr "rУЅtt audioformat stУЖdjs inte av bakУЄnden, kan inte spela ljudet." #: call/ringtoneplayer.cpp:93 msgctxt "RingtonePlayer|" msgid "Could not initialize audio player." msgstr "Kunde inte initiera audiospelaren." #: ui/searchdisplay.cpp:62 msgctxt "SearchDisplay|" msgid "Open.." msgstr "У–ppna.." #: textedit/textedit.cpp:127 msgctxt "TextEdit|" msgid "Help" msgstr "HjУЄlp" #: textedit/textedit.cpp:129 msgctxt "TextEdit|" msgid "About &Qt" msgstr "Om &Qt" #: textedit/textedit.cpp:186 msgctxt "TextEdit|" msgid "Edit Actions" msgstr "У…tgУЄrder fУЖr redigering" #: textedit/textedit.cpp:188 msgctxt "TextEdit|" msgid "&File" msgstr "Arkiv" #: textedit/textedit.cpp:194 msgctxt "TextEdit|" msgid "&Open..." msgstr "&У–ppna т€І" #: textedit/textedit.cpp:203 msgctxt "TextEdit|" msgid "&Save locally before send" msgstr "&Spara fУЖre skickning" #: textedit/textedit.cpp:210 msgctxt "TextEdit|" msgid "Save locally &As..." msgstr "Spara lokalt s&om т€І" #: textedit/textedit.cpp:218 msgctxt "TextEdit|" msgid "&Print..." msgstr "S&kriv ut т€І" #: textedit/textedit.cpp:226 msgctxt "TextEdit|" msgid "Print Preview..." msgstr "FУЖrhandsgranskning т€І" #: textedit/textedit.cpp:231 msgctxt "TextEdit|" msgid "&Export PDF..." msgstr "&Exportera som PDF т€І" #: textedit/textedit.cpp:244 msgctxt "TextEdit|" msgid "&Edit" msgstr "R&edigera" #: textedit/textedit.cpp:249 msgctxt "TextEdit|" msgid "&Undo" msgstr "&У…ngra" #: textedit/textedit.cpp:254 msgctxt "TextEdit|" msgid "&Redo" msgstr "G&УЖr om" #: textedit/textedit.cpp:261 msgctxt "TextEdit|" msgid "Cu&t" msgstr "Kli&pp ut" #: textedit/textedit.cpp:267 msgctxt "TextEdit|" msgid "&Copy" msgstr "K&opiera" #: textedit/textedit.cpp:273 msgctxt "TextEdit|" msgid "&Paste" msgstr "&Klistra in" #: textedit/textedit.cpp:283 msgctxt "TextEdit|" msgid "Insert link" msgstr "Infoga en lУЄnk" #: textedit/textedit.cpp:287 msgctxt "TextEdit|" msgid "Embed image" msgstr "BУЄdda in en bild" #: textedit/textedit.cpp:294 msgctxt "TextEdit|" msgid "F&ormat" msgstr "F&ormat" #: textedit/textedit.cpp:298 msgctxt "TextEdit|" msgid "&Bold" msgstr "&Fetstil" #: textedit/textedit.cpp:310 msgctxt "TextEdit|" msgid "&Italic" msgstr "Kurs&iv" #: textedit/textedit.cpp:322 msgctxt "TextEdit|" msgid "&Underline" msgstr "&Understruken" #: textedit/textedit.cpp:341 textedit/textedit.cpp:347 msgctxt "TextEdit|" msgid "&Left" msgstr "&VУЄnster" #: textedit/textedit.cpp:342 textedit/textedit.cpp:346 msgctxt "TextEdit|" msgid "C&enter" msgstr "C&enter" #: textedit/textedit.cpp:343 textedit/textedit.cpp:345 msgctxt "TextEdit|" msgid "&Right" msgstr "&HУЖger" #: textedit/textedit.cpp:349 msgctxt "TextEdit|" msgid "&Justify" msgstr "&Justera" #: textedit/textedit.cpp:376 msgctxt "TextEdit|" msgid "&Color..." msgstr "&FУЄrg т€І" #: textedit/textedit.cpp:383 msgctxt "TextEdit|" msgid "Standard" msgstr "Standard" #: textedit/textedit.cpp:384 msgctxt "TextEdit|" msgid "Bullet List (Disc)" msgstr "PunktuppstУЄllning (bollar)" #: textedit/textedit.cpp:385 msgctxt "TextEdit|" msgid "Bullet List (Circle)" msgstr "PunktuppstУЄllning (cirklar)" #: textedit/textedit.cpp:386 msgctxt "TextEdit|" msgid "Bullet List (Square)" msgstr "PunktuppstУЄllning (kvadrater)" #: textedit/textedit.cpp:387 msgctxt "TextEdit|" msgid "Ordered List (Decimal)" msgstr "Numrering (decimal)" #: textedit/textedit.cpp:388 msgctxt "TextEdit|" msgid "Ordered List (Alpha lower)" msgstr "Numrering (smУЅ bokstУЄver)" #: textedit/textedit.cpp:389 msgctxt "TextEdit|" msgid "Ordered List (Alpha upper)" msgstr "Numrering (stora bokstУЄver)" #: textedit/textedit.cpp:390 msgctxt "TextEdit|" msgid "Ordered List (Roman lower)" msgstr "Numrering (smУЅ romerska siffror)" #: textedit/textedit.cpp:391 msgctxt "TextEdit|" msgid "Ordered List (Roman upper)" msgstr "Numrering (stora romerska siffror)" #: textedit/textedit.cpp:442 msgctxt "TextEdit|" msgid "Application" msgstr "Annonser" #: textedit/textedit.cpp:443 msgctxt "TextEdit|" msgid "" "The document has been modified.\n" "Do you want to save your changes?" msgstr "" "Dokument har УЄndrats.\n" "Vill du spara УЄndringarna?" #: textedit/textedit.cpp:467 msgctxt "TextEdit|" msgid "Open File..." msgstr "У–ppna filen т€І" #: textedit/textedit.cpp:468 msgctxt "TextEdit|" msgid "HTML-Files (*.htm *.html);;All Files (*)" msgstr "HTML-Filer (*.htm *.html);;Alla typer (*)" #: textedit/textedit.cpp:485 msgctxt "TextEdit|" msgid "Save as..." msgstr "Spara som т€І" #: textedit/textedit.cpp:486 msgctxt "TextEdit|" msgid "ODF files (*.odt);;HTML-Files (*.htm *.html);;All Files (*)" msgstr "ODF-filer (*.odt);;HTML-filer (*.htm *.html);;Alla filer (*)" #: textedit/textedit.cpp:501 msgctxt "TextEdit|" msgid "Print Document" msgstr "Skriv ut dokument" #: textedit/textedit.cpp:559 msgctxt "TextEdit|" msgid "Open File" msgstr "У–ppna filen" #: textedit/textedit.cpp:561 msgctxt "TextEdit|" msgid "Files (*.*)" msgstr "Alla filer (*.*)" #: textedit/textedit.cpp:566 msgctxt "TextEdit|" msgid "Error" msgstr "Fel" #: textedit/textedit.cpp:567 msgctxt "TextEdit|" msgid "Can't load image" msgstr "Kan inte ladda en bild" #: textedit/textedit.cpp:621 textedit/textedit.cpp:631 msgctxt "TextEdit|" msgid "File way too big" msgstr "Filen УЄr alldeles fУЖr stor" #: net/voicecallengine.cpp:525 msgctxt "VoiceCallEngine|" msgid "Accept" msgstr "Acceptera" #: net/voicecallengine.cpp:533 msgctxt "VoiceCallEngine|" msgid "Reject" msgstr "Avvisa" #: net/voicecallengine.cpp:535 msgctxt "VoiceCallEngine|" msgid "Close" msgstr "StУЄng" #: net/voicecallengine.cpp:551 msgctxt "VoiceCallEngine|" msgid "Actual network address (SHA1) of the peer operator" msgstr "Faktisk nУЄtverksadress (SHA1) fУЖr partneroperatУЖren" #: net/voicecallengine.cpp:554 msgctxt "VoiceCallEngine|" msgid "Network address of the remote node" msgstr "NУЄtverksadressen fУЖr fjУЄrrnoden" #: net/voicecallengine.cpp:564 msgctxt "VoiceCallEngine|" msgid "Operator" msgstr "OperatУЖr" #: net/voicecallengine.cpp:567 msgctxt "VoiceCallEngine|" msgid "Node address" msgstr "Nodadress" #: net/voicecallengine.cpp:570 msgctxt "VoiceCallEngine|" msgid "Call status" msgstr "Anropsstatus" #: net/voicecallengine.cpp:573 msgctxt "VoiceCallEngine|" msgid "Controls" msgstr "Reglage" #: net/voicecallengine.cpp:576 msgctxt "VoiceCallEngine|" msgid "Ending" msgstr "Avslutning" #: net/voicecallengine.cpp:613 msgctxt "VoiceCallEngine|" msgid "Initializing" msgstr "Initierar" #: net/voicecallengine.cpp:616 msgctxt "VoiceCallEngine|" msgid "Incoming" msgstr "Inkommande" #: net/voicecallengine.cpp:619 msgctxt "VoiceCallEngine|" msgid "Open" msgstr "У–ppen" #: net/voicecallengine.cpp:622 msgctxt "VoiceCallEngine|" msgid "Closing" msgstr "StУЄnger" #: net/voicecallengine.cpp:625 msgctxt "VoiceCallEngine|" msgid "Closed" msgstr "StУЄngd" #: net/voicecallengine.cpp:628 msgctxt "VoiceCallEngine|" msgid "Error" msgstr "Fel" #: net/voicecallengine.cpp:631 msgctxt "VoiceCallEngine|" msgid "No call" msgstr "Inget anrop" #: net/voicecallengine.cpp:834 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible" msgstr "Audioanrop УЄr inte mУЖjligt" #: net/voicecallengine.cpp:840 msgctxt "VoiceCallEngine|" msgid "Audio call is possible" msgstr "Audioanrop УЄr mУЖjligt" #: net/voicecallengine.cpp:847 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator address unknown" msgstr "Audioanrop УЄr inte mУЖjligt: operatoradressen УЄr okУЄnd" #: net/voicecallengine.cpp:853 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator profile not found" msgstr "Audioanrop УЄr inte mУЖjligt: operatorprofilen finns inte" #: net/voicecallengine.cpp:856 msgctxt "VoiceCallEngine|" msgid "" "Audio call is not possible: operator has no node information in profile" msgstr "" "Audioanrop УЄr inte mУЖjligt: operatorn har ingen nodinformation i profilen" #: net/voicecallengine.cpp:875 #, qt-format msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operators IPv4 address %1 not connected" msgstr "" "Audioanrop УЄr inte mУЖjligt: operatorns IPv4-adress %1 УЄr inte ansluten" #: net/voicecallengine.cpp:882 #, qt-format msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operators IPv6 address %1 not connected" msgstr "" "Audioanrop УЄr inte mУЖjligt: operatorns IPv6-adress %1 УЄr inte ansluten" #: net/voicecallengine.cpp:893 msgctxt "VoiceCallEngine|" msgid "" "Audio call is not possible: local node has no IPv6 address, operator has " "only IPv6 addr" msgstr "" "Audioanrop УЄr inte mУЖjligt: den lokala noden har ingen IPv6-adress, " "operatorn har bara en IPv6-adress" #: net/voicecallengine.cpp:895 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator does not publish network address" msgstr "" "Audioanrop УЄr inte mУЖjligt: operatorn publicerar inte nУЅgon nУЄtverksadress" #: ui/aboutDialog.ui:26 msgctxt "aboutDialog|" msgid "About classified ads" msgstr "Om rubrikannonser" #: ui/aboutDialog.ui:100 msgctxt "aboutDialog|" msgid " Classified ads is a program for online communications" msgstr " Rubrikannonser УЄr en programvara fУЖr kommunikation УЖver internet" #: ui/aboutDialog.ui:163 msgctxt "aboutDialog|" msgid "" "

Classified ads is free software. You may use, copy and" " modify it if you follow the conditions given in GNU lesser general public " "license version 2.1.

Classified ads is copyright ТЉ Antti JУЄrvinen " "2013.

Main feature of the program is an "advertisement" - a" " piece of text belonging to selected classification. There are several pre-" "programmed classifications and operators are encouraged to invent new " "classifications for new purposes ; the selection boxes in classification-" "selection tab are editable. Other operators may then view the ads, publicly " "comment the ads, the operators and also send private messages to each " "others.

Another important feature of classified ads is that it is " "designed to be operated without any centralized server infrastructure - it " "is you and other operators whose computers store and transmit all the " "content visible inside classified ads. To get connected you need to know " "address of at least one existing computer (a node) so if your network connection dialog shows no " "connections, you may need to contact someone you know is using the software " "and ask for address of her node to make initial contact with the network. " "Once connected the software should maintain list of addresses of other " "nodes.

Due to its server-less design the whole system works best if " "you leave the program running always when you have your computer powered on " "; while processing other operators requests it will hog some computing " "resources and generate network traffic also when you are not actively using " "the program yourself - others are.

Operators concerned about privacy " "of the content should be aware of following items:

- Data storage " "implementation is variant of distributed" " hash table, practically meaning that content posted by you gets " "copied some more-or-less random nodes in the network.

- Any data item" " (ad, comment, binary file, private message etc.) is digitally signed. This " "makes it more difficult to try to pose as another operator.

- " "Operators are reliably identified only by the SHA1 hash of their generated " "encryption keys. SHA1 hash is displayed when viewing details of operator " "profiles. Other identifying information like nickname or city name are " "entered by operator himself and can be anything. The operator profile, as it" " is published to the network, is also signed with the encryption keys of the" " operator - if you identify an operator by her SHA1 hash, you have a " "mechanism for identifying if any content inside classified ads is posted by " "this operator or not. Classified ads internally checks for digital " "signatures, throwing away content that fails signature check and tries to " "provide SHA1 hash of the operator who posted the content.

- All " "classified ads are posted as plain text, no encryption is used. All public " "profiles are posted as plain text, no encryption is used. If profile is made" " private, it is encrypted to be readable only by selected other profiles. " "This applies also to binary files shared by operators private profiles and " "comments about private profiles after the profile was made private " "(previously plain-text comments or files don't get magically encrypted " "afterwards). Private messages are encrypted always to be readable only by " "recipient and sender. Attachments follow the privacy rules of the document, " "they're attached to.

- As is the case with all internet-" "communications, this small fact is true for classified ads too : once something gets posted online, there is no" " way to remove it from network.

- Data encryption " "implementation for content is OpenSSL, relying mostly on algorithms RSA-2048" " and AES-256.

- While connections between nodes are implemented using" " SSL, other nodes inside network do get to know what content is being " "transmitted in neighboring nodes. While there is no central point for easily" " collecting this information about particular classification or operator, " "operators still should expect no privacy regarding their doings online, " "although some effort has been been put into hiding contents of private messages and private profiles. " "

Programming was (mostly) done by Antti JУЄrvinen, artwork by Meeri " "JУЄrvinen.

This product includes software developed by the OpenSSL " "Project for use in the OpenSSL Toolkit " "(http://www.openssl.org/).

Happy " "advertising!


" msgstr "" "

Rubrikannonser УЄr fri programvara. Du fУЅr anvУЄnda, " "kopiera och УЄndra det om du fУЖljer villkoren som anges i GNU lesser general " "public license version 2.1.

Rubrikannonser УЄr copyright ТЉ Antti " "JУЄrvinen 2013.

Huvudfunktionen hos programmet УЄr en " ""annons" т€” ett stycke text som tillhУЖr en vald rubrik. Det finns " "flera fУЖrprogrammerade rubriker och operatУЖrer uppmuntras att hitta pУЅ nya " "rubriker fУЖr nya УЄndamУЅl; valrutorna i fliken fУЖr rubrikval УЄr redigerbara." " Andra operatУЖrer kan sedan se annonserna, publikt kommentera annonserna, " "operatУЖrerna och УЄven skicka privata meddelanden till varandra.

Andra" " viktiga funktioner hos rubrikannonser УЄr att det УЄr gjort fУЖr att anvУЄndas " "utan nУЅgon centraliserad serverinfrastruktur т€” det УЄr du och andra " "operatУЖrer vars datorer lagrar och УЖverfУЖr allt innehУЅll som УЄr synligt inom" " rubrikannonser. FУЖr att bli ansluten behУЖver du kУЄnna till en adress till " "УЅtminstone en befintlig dator (en nod) sУЅ om din dialog fУЖr nУЄtverksanslutning inte " "visar nУЅgra anslutningar kan du behУЖva kontakta nУЅgon du kУЄnner som anvУЄnder" " programmet och be om adressen till hennes nod fУЖr att gУЖra en initial " "kontakt med nУЄtverket. SУЅ fort du УЄr ansluten bУЖr programmet underhУЅlla en " "lista pУЅ adresser till andra noder.

PУЅ grund av sin serverfria design" " fungerar hela systemet bУЄst om du lУЅter programmet vara hela tiden nУЄr du " "har datorn pУЅslagen; medan det bearbetar andra operatУЖrers begУЄranden kommer" " det lУЄgga beslag pУЅ lite berУЄkningsresurser och generera nУЄtverkstrafik " "УЄven nУЄr du inte aktivt anvУЄnder programmet sjУЄlv т€” andra gУЖr det. " "

OperatУЖrer som УЄr bekymrade fУЖr den privata integriteten hos " "innehУЅllet bУЖr vara medvetna om fУЖljande punkter:

т€“ " "Datalagringsimplementationen УЄr en variant pУЅ distribuerade hash-tabeller, i praktiken betyder det " "att innehУЅll som postas av dig kopieras till nУЅgra mer eller mindre slumpvis" " valda noder i nУЄtverket.

т€“ Alla dataposter (annons, kommentar, " "binУЄrfil, privat meddelande etc.) УЄr digitalt signerade. Detta gУЖr det " "svУЅrare att fУЖrsУЖka lУЅtsas vara nУЅgon annan operatУЖr.

т€“ OperatУЖrer " "identifieras pУЅlitligt endast av SHA1-kontrollsumman av sina genererade " "krypteringsnycklar. SHA1-kontrollsummor visas nУЄr man tittar pУЅ detaljerna " "fУЖr operatorprofiler. Annan identifikationsinformation som smeknamn eller " "ortnamn anges sjУЄlv av operatorn och kan vara vad som helst. " "Operatorprofilen, sУЅ som den publiceras pУЅ nУЄtverket, signeras УЄven med " "operatorns krypteringsnycklar т€” om du identifierar en operatУЖr med dennes " "SHA1-kontrollsumma har du en mekanism fУЖr att identifiera om nУЅgot innehУЅll " "inuti en rubrikannons postats av operatorn eller inte. Rubrikannonser " "kontrollerar internt digitala signaturer, kastar bort innehУЅll som inte " "klarar signaturkontrollen och fУЖrsУЖker tillhandahУЅlla SHA1-kontrollsummor " "fУЖr operatУЖrer som postat innehУЅllet.

т€“ Alla rubrikannonser skickas " "som klartext, ingen kryptering anvУЄnds. Alla publika profiler postas som " "klartext, ingen kryptering anvУЄnds. Om en profil gУЖrs privat krypteras den " "fУЖr att vara lУЄsbar endast av utvalda andra profiler. Detta gУЄller УЄven " "binУЄrfiler som delas av operatУЖrers privata profiler och kommentarer om " "privata profiler efter att profilen gjordes privat (tidigare " "klartextkommentarer eller filer blir inte magiskt krypterade i efterhand). " "Privata meddelanden УЄr alltid krypterade fУЖr att vara lУЄsbara endast av " "mottagaren och avsУЄndaren. Bilagor fУЖljer reglerna fУЖr dokumentet de УЄr " "bifogade till.

т€“ SУЅ som УЄr fallet med all internetkommunikation УЄr " "fУЖljande sant fУЖr rubrikannonser ocksУЅ: nУЄr en gУЅng nУЅgot postats online finns det inget sУЄtt att ta" " bort det frУЅn nУЄtverket.

т€“ Implementationen av datakryptering" " fУЖr innehУЅllet УЄr OpenSSL, baserat huvudsakligen pУЅ algoritmerna RSA-2048 " "och AES-256.

т€“ Medan anslutningar mellan noder implementeras med SSL " "fУЅr andra noder inuti nУЄtverket reda pУЅ vilken information som skickas i " "grannoder. Medan det inte finns nУЅgon centralpunkt fУЖr att enkelt samla " "denna information om en viss rubrik eller operatУЖr bУЖr operatУЖrer УЄndУЅ inte " "fУЖrvУЄnta sig nУЅgot privatskydd vad gУЄller vad de gУЖr online, УЄven om vissa " "anstrУЄngningar har gjorts fУЖr att dУЖlja innehУЅll i privata meddelanden och privata profiler." "

Programmeringen gjordes (huvudsakligen) av Antti JУЄrvinen, " "utsmyckningar av Meeri JУЄrvinen.

Denna produkt innehУЅller programvara " "utvecklad av projektet OpenSSL fУЖr att anvУЄndas i OpenSSL Toolkit " "(http://www.openssl.org/).

Lycka till med " "annonserandet!


" #: ui/attachmentListDialog.ui:26 msgctxt "attachmentListDialog|" msgid "List of attached files" msgstr "Listan av bilagor" #: ui/callStatusDialog.ui:26 msgctxt "callStatusDialog|" msgid "Call status" msgstr "Anropsstatus" #: ui/callStatusDialog.ui:49 msgctxt "callStatusDialog|" msgid "Input level" msgstr "IndatanivУЅ" #: ui/callStatusDialog.ui:65 msgctxt "callStatusDialog|" msgid "Audio calls" msgstr "Audioanrop" #: ui/callStatusDialog.ui:90 msgctxt "callStatusDialog|" msgid "Output level" msgstr "UtdatanivУЅ" #: ui/editContact.ui:26 msgctxt "editContactDialog|" msgid "Edit a contact" msgstr "Redigera en kontakt" #: ui/editContact.ui:39 msgctxt "editContactDialog|" msgid "Address (SHA1) of contact" msgstr "Kontaktens adress (SHA1)" #: ui/editContact.ui:53 msgctxt "editContactDialog|" msgid "Local nickname" msgstr "Lokal smeknamn" #: ui/editContact.ui:65 msgctxt "editContactDialog|" msgid "" "

Settings some trusted is public information to readers" " of your profile

" msgstr "" "

InstУЄllningen om fУЖrtroende УЄr publik fУЖr de som lУЄser" " din profil

" #: ui/editContact.ui:68 msgctxt "editContactDialog|" msgid "This contact is to be publicly trusted in transactions" msgstr "Den hУЄr kontakten УЄr tillfУЖrlitlig i transaktioner" #: frontWidget.ui:14 msgctxt "frontWidget|" msgid "Form" msgstr "FormulУЄr" #: frontWidget.ui:39 msgctxt "frontWidget|" msgid "Classified ads" msgstr "Rubrikannonser" #: frontWidget.ui:67 msgctxt "frontWidget|" msgid "Search for classified ads about" msgstr "SУЖk efter rubrikannonser om" #: frontWidget.ui:74 msgctxt "frontWidget|" msgid "Perform" msgstr "UtfУЖra" #: frontWidget.ui:97 msgctxt "frontWidget|" msgid "of" msgstr "av" #: frontWidget.ui:113 msgctxt "frontWidget|" msgid "in" msgstr "i" #: frontWidget.ui:123 msgctxt "frontWidget|" msgid "Search" msgstr "SУЖk" #: frontWidget.ui:161 msgctxt "frontWidget|" msgid "My profile" msgstr "Egen profil" #: frontWidget.ui:177 frontWidget.ui:937 msgctxt "frontWidget|" msgid "Profile address" msgstr "Profiladress" #: frontWidget.ui:208 frontWidget.ui:643 msgctxt "frontWidget|" msgid "Nickname" msgstr "Smeknamn" #: frontWidget.ui:225 frontWidget.ui:669 msgctxt "frontWidget|" msgid "Greeting text" msgstr "HУЄlsningar" #: frontWidget.ui:232 msgctxt "frontWidget|" msgid "For the rest of the world. " msgstr "FУЖr resten av vУЄrlden. " #: frontWidget.ui:239 frontWidget.ui:695 msgctxt "frontWidget|" msgid "First name" msgstr "FУЖrnamn" #: frontWidget.ui:253 frontWidget.ui:715 msgctxt "frontWidget|" msgid "Family name" msgstr "Efternamn" #: frontWidget.ui:263 msgctxt "frontWidget|" msgid "City/country" msgstr "Stad/rike" #: frontWidget.ui:273 msgctxt "frontWidget|" msgid "BTC address" msgstr "BTC-adress" #: frontWidget.ui:280 msgctxt "frontWidget|" msgid "If you wish to receive payments via BTC, include your BTC address too." msgstr "" "Om du УЖnskar ta mot betalningar via BTC, inkludera УЄven din BTC-adress." #: frontWidget.ui:287 frontWidget.ui:799 msgctxt "frontWidget|" msgid "State of the world" msgstr "TillstУЅndet i vУЄrlden" #: frontWidget.ui:294 msgctxt "frontWidget|" msgid "Longer explanation about state of the world" msgstr "LУЄngre fУЖrklaring om tillstУЅndet i vУЄrlden" #: frontWidget.ui:301 msgctxt "frontWidget|" msgid "Profile is private" msgstr "Profilen УЄr privat" #: frontWidget.ui:308 msgctxt "frontWidget|" msgid "Readers of profile" msgstr "LУЄsarna av profilen" #: frontWidget.ui:315 msgctxt "frontWidget|" msgid "None of the fields is mandatory" msgstr "Inget av fУЄlten УЄr obligatoriskt" #: frontWidget.ui:322 msgctxt "frontWidget|" msgid "Time of last update" msgstr "Tid fУЖr senaste УЄndring" #: frontWidget.ui:342 msgctxt "frontWidget|" msgid "Publish" msgstr "Publicera" #: frontWidget.ui:355 msgctxt "frontWidget|" msgid "Revert changes" msgstr "У…tergУЅ" #: frontWidget.ui:369 msgctxt "frontWidget|" msgid "Details of operator profile:" msgstr "Detaljer om operatУЖrsprofil:" #: frontWidget.ui:401 msgctxt "frontWidget|" msgid "" "\n" "\n" "Click \n" "to \n" "Add\n" "Image" msgstr "" "\n" "\n" "Klicka \n" "fУЖr att \n" "lУЄgga till\n" "en bild" #: frontWidget.ui:425 frontWidget.ui:845 msgctxt "frontWidget|" msgid "Shared files" msgstr "Delade filer" #: frontWidget.ui:461 frontWidget.ui:897 msgctxt "frontWidget|" msgid "Latest comments" msgstr "Senaste kommentarer" #: frontWidget.ui:504 msgctxt "frontWidget|" msgid "Contacts" msgstr "Kontakter" #: frontWidget.ui:536 msgctxt "frontWidget|" msgid "Add contact" msgstr "LУЄgg till kontakt" #: frontWidget.ui:543 msgctxt "frontWidget|" msgid "Remove contact" msgstr "Ta bort kontakt" #: frontWidget.ui:550 msgctxt "frontWidget|" msgid "View profile" msgstr "Visa profilen" #: frontWidget.ui:557 msgctxt "frontWidget|" msgid "Send message" msgstr "Skicka en elektronisk post" #: frontWidget.ui:569 msgctxt "frontWidget|" msgid "Private messages" msgstr "Korrespondens" #: frontWidget.ui:624 msgctxt "frontWidget|" msgid "Profile details" msgstr "Detaljer fУЖr profil" #: frontWidget.ui:741 msgctxt "frontWidget|" msgid "City/Country" msgstr "Stad/rike" #: frontWidget.ui:767 msgctxt "frontWidget|" msgid "BTC Addr" msgstr "BTC-adress" #: frontWidget.ui:829 msgctxt "frontWidget|" msgid "" "




No

Image

Inserted

" msgstr "" "




Ingen

bild

infogad

" #: frontWidget.ui:874 msgctxt "frontWidget|" msgid "Send message to operator" msgstr "Skicka meddelande till operatУЖr" #: frontWidget.ui:879 msgctxt "frontWidget|" msgid "Audio call" msgstr "Audioanrop" #: frontWidget.ui:884 msgctxt "frontWidget|" msgid "View readers" msgstr "LУЄsarna av profilen" #: frontWidget.ui:932 msgctxt "frontWidget|" msgid "Comment" msgstr "Kommentera" #: frontWidget.ui:964 msgctxt "frontWidget|" msgid "Add to contacts" msgstr "LУЄgg till i dina kontakter" #: ui/insertLink.ui:26 msgctxt "insertLinkDialog|" msgid "Insert link" msgstr "Infoga en lУЄnk" #: ui/insertLink.ui:39 msgctxt "insertLinkDialog|" msgid "URL" msgstr "URL" #: ui/insertLink.ui:112 msgctxt "insertLinkDialog|" msgid "Link label in text" msgstr "LУЄnktext" #: ui/manualConnectionDialog.ui:26 msgctxt "manualConnectionDialog|" msgid "Manually add node to connection queue" msgstr "Manuellt lУЄgga till en nod till anslutningskУЖn" #: ui/manualConnectionDialog.ui:48 msgctxt "manualConnectionDialog|" msgid "Remote node listen port" msgstr "FjУЄrrnodens lyssningsport" #: ui/manualConnectionDialog.ui:78 msgctxt "manualConnectionDialog|" msgid "Remote node network address" msgstr "FjУЄrrnodens nУЄtverksadress" #: ui/manualConnectionDialog.ui:91 msgctxt "manualConnectionDialog|" msgid "IPv4, IPv6 or DNS name" msgstr "IPv4, IPv6 eller DNS-namn" #: ui/metadataQuery.ui:26 msgctxt "metadataQuery|" msgid "File information" msgstr "Filinformation" #: ui/metadataQuery.ui:60 msgctxt "metadataQuery|" msgid "Name of the file:" msgstr "Filnamn:" #: ui/metadataQuery.ui:81 msgctxt "metadataQuery|" msgid "Owner of file (name or SHA1 if CA operator):" msgstr "Filens УЄgare (namn eller SHA1 pУЅ CA-operatУЖren):" #: ui/metadataQuery.ui:111 msgctxt "metadataQuery|" msgid "License of use:" msgstr "AnvУЄndningslicens:" # Lets not translate license names.. #: ui/metadataQuery.ui:122 msgctxt "metadataQuery|" msgid "Public domain" msgstr "Public domain" #: ui/metadataQuery.ui:127 msgctxt "metadataQuery|" msgid "GPL" msgstr "GPL" #: ui/metadataQuery.ui:132 msgctxt "metadataQuery|" msgid "LGPL" msgstr "LGPL" #: ui/metadataQuery.ui:137 msgctxt "metadataQuery|" msgid "BSD" msgstr "BSD" #: ui/metadataQuery.ui:142 msgctxt "metadataQuery|" msgid "CC-BY" msgstr "CC-BY" #: ui/metadataQuery.ui:147 msgctxt "metadataQuery|" msgid "CC-BY-SA" msgstr "CC-BY-SA" #: ui/metadataQuery.ui:152 msgctxt "metadataQuery|" msgid "CC-BY-ND" msgstr "CC-BY-ND" #: ui/metadataQuery.ui:157 msgctxt "metadataQuery|" msgid "CC-BY-NC" msgstr "CC-BY-NC" #: ui/metadataQuery.ui:162 msgctxt "metadataQuery|" msgid "CC-BY-NC-SA" msgstr "CC-BY-NC-SA" #: ui/metadataQuery.ui:167 msgctxt "metadataQuery|" msgid "CC-BY-NC-ND" msgstr "CC-BY-NC-ND" #: ui/metadataQuery.ui:182 msgctxt "metadataQuery|" msgid "Mime-type:" msgstr "Mime-typ:" #: ui/metadataQuery.ui:199 msgctxt "metadataQuery|" msgid "Description of file:" msgstr "Beskrivning:" #: ui/metadataQuery.ui:218 msgctxt "metadataQuery|" msgid "Enter information regarding file before publish:" msgstr "Ange information om filen fУЖre publicering:" #: ui/newClassifiedAd.ui:26 msgctxt "newCaDialog|" msgid "Post a new classified ad" msgstr "Skicka en ny rubrikannons" #: ui/newClassifiedAd.ui:47 msgctxt "newCaDialog|" msgid "About" msgstr "I frУЅga om" #: ui/newClassifiedAd.ui:65 msgctxt "newCaDialog|" msgid "of" msgstr "av" #: ui/newClassifiedAd.ui:81 msgctxt "newCaDialog|" msgid "in" msgstr "i" #: ui/newClassifiedAd.ui:95 msgctxt "newCaDialog|" msgid "Subject" msgstr "Rubrik" #: ui/newClassifiedAd.ui:129 msgctxt "newCaDialog|" msgid "Attachment: " msgstr "Bilagor: " #: ui/newClassifiedAd.ui:149 msgctxt "newCaDialog|" msgid "Add" msgstr "Inkludera" #: ui/newPrivMsg.ui:26 msgctxt "newPrivMsgDialog|" msgid "Send a private message" msgstr "Skicka ett nytt privat meddelande" #: ui/newPrivMsg.ui:39 msgctxt "newPrivMsgDialog|" msgid "Subject" msgstr "Rubrik" #: ui/newPrivMsg.ui:53 msgctxt "newPrivMsgDialog|" msgid "Recipient" msgstr "Mottagare" #: ui/newPrivMsg.ui:83 msgctxt "newPrivMsgDialog|" msgid "Attachments: " msgstr "Bilagor: " #: ui/newPrivMsg.ui:103 msgctxt "newPrivMsgDialog|" msgid "Attach" msgstr "Inkludera" #: ui/newProfileComment.ui:26 msgctxt "newProfileCommentDialog|" msgid "Comment a operators profile" msgstr "Kommentera en operatУЖrs profil" #: ui/newProfileComment.ui:39 msgctxt "newProfileCommentDialog|" msgid "Subject" msgstr "Rubrik" #: ui/newProfileComment.ui:53 msgctxt "newProfileCommentDialog|" msgid "Commented profile" msgstr "Kommenterad profil" #: ui/newProfileComment.ui:89 msgctxt "newProfileCommentDialog|" msgid "Attachments:" msgstr "Bilagor:" #: ui/newProfileComment.ui:109 msgctxt "newProfileCommentDialog|" msgid "Attach" msgstr "Inkludera" #: ui/newTextDocument.ui:26 msgctxt "newTextDocumentDialog|" msgid "Edit and publish a new text document" msgstr "Redigera och publicera ett nytt textdokument" #: ui/newTextDocument.ui:39 msgctxt "newTextDocumentDialog|" msgid "Document title" msgstr "Rubrik" #: ui/newTextDocument.ui:75 msgctxt "newTextDocumentDialog|" msgid "Attachments:" msgstr "Bilagor:" #: ui/newTextDocument.ui:95 msgctxt "newTextDocumentDialog|" msgid "Attach" msgstr "Inkludera" #: ui/profileCommentDisplay.ui:26 msgctxt "profileCommentDisplay|" msgid "Comments regarding operator" msgstr "Kommentarer om en operatУЖr" #: ui/profileReadersDialog.ui:26 msgctxt "profileReadersDialog|" msgid "Profile readers list" msgstr "LУЄsarna av en profil" #: ui/profileReadersDialog.ui:37 msgctxt "profileReadersDialog|" msgid "Search for profiles to add" msgstr "SУЖk efter profiler att lУЄgga till" #: ui/profileReadersDialog.ui:44 msgctxt "profileReadersDialog|" msgid "First 100 matching profiles:" msgstr "FУЖrst 100 motsvarande profiler:" #: ui/profileReadersDialog.ui:66 msgctxt "profileReadersDialog|" msgid "Add selected to list of readers" msgstr "LУЄgg till de valda till listan av lУЄsare" #: ui/profileReadersDialog.ui:73 msgctxt "profileReadersDialog|" msgid "Current list of readers" msgstr "Aktuell lУЄsarlista" #: ui/profileReadersDialog.ui:90 msgctxt "profileReadersDialog|" msgid "Close" msgstr "StУЄng" #: ui/profileReadersDialog.ui:109 msgctxt "profileReadersDialog|" msgid "Remove selected" msgstr "Ta bort valda" #: ui/searchDisplay.ui:26 msgctxt "searchDisplay|" msgid "Search data storage" msgstr "SУЖk lokal databas" #: ui/searchDisplay.ui:60 msgctxt "searchDisplay|" msgid "Words:" msgstr "Alla ord:" #: ui/searchDisplay.ui:70 msgctxt "searchDisplay|" msgid "Search" msgstr "SУЖk" #: ui/searchDisplay.ui:87 msgctxt "searchDisplay|" msgid "Network search" msgstr "SУЖk i nУЄtverket" #: ui/searchDisplay.ui:101 msgctxt "searchDisplay|" msgid "Search ads" msgstr "SУЖk annonser" #: ui/searchDisplay.ui:111 msgctxt "searchDisplay|" msgid "Search profiles" msgstr "SУЖk profiler" #: ui/searchDisplay.ui:121 msgctxt "searchDisplay|" msgid "Search comments" msgstr "SУЖk kommentarer" #: ui/settingsDialog.ui:26 msgctxt "settingsDialog|" msgid "Node settings" msgstr "NodinstУЄllningar" #: ui/settingsDialog.ui:39 msgctxt "settingsDialog|" msgid "TCP listen port" msgstr "TCP-port" #: ui/settingsDialog.ui:58 msgctxt "settingsDialog|" msgid "Incoming TCP listen port. Change requires node restart. " msgstr "" "Inkommande TCP-port att lyssna pУЅ. En УЄndring krУЄver att noden startas om. " #: ui/settingsDialog.ui:84 msgctxt "settingsDialog|" msgid "DNS name of node" msgstr "DNS-namn" #: ui/settingsDialog.ui:91 msgctxt "settingsDialog|" msgid "" "If you have permanent DNS name for your machine, you may type it here to be " "used to reference your node" msgstr "" "Om du har ett permanent DNS-namn pУЅ din maskin kan du skriva det hУЄr fУЖr att" " anvУЄndas till att referera din nod" #: ui/settingsDialog.ui:103 msgctxt "settingsDialog|" msgid "Data store limits:" msgstr "BegrУЄnsningar fУЖr databas:" #: ui/settingsDialog.ui:115 msgctxt "settingsDialog|" msgid "Nr of profiles to keep" msgstr "Antal profiler att spara" #: ui/settingsDialog.ui:154 msgctxt "settingsDialog|" msgid "Nr of private messages to keep" msgstr "Antal privata meddelanden att spara" #: ui/settingsDialog.ui:193 msgctxt "settingsDialog|" msgid "Nr of binary blobs to keep" msgstr "Antal binУЄrblobbar att spara" #: ui/settingsDialog.ui:232 msgctxt "settingsDialog|" msgid "Nr of CAs to keep" msgstr "Antal CA:n att spara" #: ui/settingsDialog.ui:251 msgctxt "settingsDialog|" msgid "" "Number of classified ads to keep in storage, total, including all " "classifications. Oldest referenced will be deleted first." msgstr "" "Antal rubrikannonser att spara lagrade, totalt, inklusive alla rubriker. De" " УЄldsta refererade kommer tas bort fУЖrst." #: ui/settingsDialog.ui:274 msgctxt "settingsDialog|" msgid "Nr of profile comments to keep" msgstr "Antal kommentarer" #: ui/settingsDialog.ui:316 msgctxt "settingsDialog|" msgid "Ringtone" msgstr "Ringsignal" #: ui/settingsDialog.ui:324 msgctxt "settingsDialog|" msgid "Bow" msgstr "BУЅge" #: ui/settingsDialog.ui:329 msgctxt "settingsDialog|" msgid "Electrical" msgstr "Elektrisk" #: ui/settingsDialog.ui:334 msgctxt "settingsDialog|" msgid "Acoustic" msgstr "Akustisk" #: ui/settingsDialog.ui:339 msgctxt "settingsDialog|" msgid "Beep" msgstr "Pip" #: ui/settingsDialog.ui:344 msgctxt "settingsDialog|" msgid "Silence" msgstr "Tystnad" #: ui/settingsDialog.ui:356 msgctxt "settingsDialog|" msgid "Accept voice calls" msgstr "Acceptera rУЖstsamtal" #: ui/settingsDialog.ui:364 msgctxt "settingsDialog|" msgid "All" msgstr "Alla" #: ui/settingsDialog.ui:369 msgctxt "settingsDialog|" msgid "From trusted operators" msgstr "FrУЅn betrodda operatУЖrer" #: ui/settingsDialog.ui:374 msgctxt "settingsDialog|" msgid "Accept no voice calls" msgstr "Acceptera inga rУЖstanrop" #: ui/statusDialog.ui:26 msgctxt "statusDialog|" msgid "Network and connection status" msgstr "NУЄtverks- och anslutningsstatus" #: ui/statusDialog.ui:48 msgctxt "statusDialog|" msgid "Detected own IPv4" msgstr "Upphittade egen IPv4 adress" #: ui/statusDialog.ui:61 ui/statusDialog.ui:93 msgctxt "statusDialog|" msgid "" "Should your friend have trouble connecting, give her this address with port " "number" msgstr "" "Om din vУЄn har problem att ta kontakt, ge henne denna adress med portnummer" #: ui/statusDialog.ui:74 msgctxt "statusDialog|" msgid "IPv6" msgstr "IPv6" #: ui/statusDialog.ui:113 msgctxt "statusDialog|" msgid "TCP port currently used" msgstr "FУЖr nУЄrvarande anvУЄnd TCP-port" #: ui/statusDialog.ui:151 msgctxt "statusDialog|" msgid "Currently open connections" msgstr "У–ppna datastrУЖmmar" #: ui/statusDialog.ui:195 msgctxt "statusDialog|" msgid "Manually add connection" msgstr "LУЄgg manuellt till en fУЖrbindelse" #: ui/statusDialog.ui:202 msgctxt "statusDialog|" msgid "Close" msgstr "StУЄng" classified-ads-0.13/po/uk.po000066400000000000000000002251561331670245300157240ustar00rootroot00000000000000# Yuri Chornoivan , 2016. # Antti JУЄrvinen , 2016. #zanata # Yuri Chornoivan , 2016. #zanata # Yuri Chornoivan , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: classified-ads 0.12\n" "Report-Msgid-Bugs-To: antti.jarvinen@katiska.org\n" "POT-Creation-Date: 2016-03-14 21:30+0300\n" "PO-Revision-Date: 2017-03-23 01:32-0400\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" "X-Generator: Zanata 3.9.6\n" "X-Language: fi_FI\n" "X-Qt-Contexts: true\n" #: ui/attachmentlistdialog.cpp:60 msgctxt "AttachmentListDialog|" msgid "Save file to disk.." msgstr "а—аБаЕб€аЕаГб‚аИ б„аАаЙаЛ аНаА аДаИбаКт€І" #: ui/attachmentlistdialog.cpp:151 ui/attachmentlistdialog.cpp:153 msgctxt "AttachmentListDialog|" msgid "files" msgstr "б„аАаЙаЛаИ" #: ui/attachmentlistdialog.cpp:162 msgctxt "AttachmentListDialog|" msgid "Save location" msgstr "а—аБаЕб€аЕаГб‚аИ аМб–бб†аЕ" #: ui/attachmentlistdialog.cpp:163 msgctxt "AttachmentListDialog|" msgid "Save to TCL app library instead of regular file?" msgstr "а—аБаЕб€аЕаГб‚аИ аДаО аБб–аБаЛб–аОб‚аЕаКаИ аПб€аОаГб€аАаМ TCL, аА аНаЕ аДаО аЗаВаИб‡аАаЙаНаОаГаО б„аАаЙаЛаА?" #: ui/attachmentlistdialog.cpp:155 msgctxt "AttachmentListDialog|" msgid "Choose file name for saving" msgstr "а’аИаБаЕб€б–б‚бŒ аНаАаЗаВбƒ б„аАаЙаЛаА аДаЛб аЗаБаЕб€аЕаЖаЕаНаНб" #: ui/attachmentlistdialog.cpp:166 msgctxt "AttachmentListDialog|" msgid "Error" msgstr "аŸаОаМаИаЛаКаА" #: ui/attachmentlistdialog.cpp:167 msgctxt "AttachmentListDialog|" msgid "File open error" msgstr "аŸаОаМаИаЛаКаА аВб–аДаКб€аИб‚б‚б б„аАаЙаЛаА" #: call/audioplayer.cpp:65 msgctxt "AudioPlayer|" msgid "raw audio format not supported by backend, cannot play audio." msgstr "" "аПб–аДб‚б€аИаМаКаИ б„аОб€аМаАб‚бƒ аЗаВбƒаКаОаВаИб… аДаАаНаИб… аБаЕаЗ аОаБб€аОаБаКаИ аНаЕ аПаЕб€аЕаДаБаАб‡аЕаНаО бƒ аМаОаДбƒаЛб– " "аОаБб€аОаБаКаИ, аВб–аДб‚аВаОб€аЕаНаНб аЗаВбƒаКбƒ аНаЕаМаОаЖаЛаИаВаЕ." #: call/audioplayer.cpp:83 msgctxt "AudioPlayer|" msgid "Could not initialize audio player." msgstr "ааЕ аВаДаАаЛаОбб б–аНб–б†б–аАаЛб–аЗбƒаВаАб‚аИ аЗаВбƒаКаОаВаИаЙ аПб€аОаГб€аАаВаАб‡." #: datamodel/binaryfilelistingmodel.cpp:173 msgctxt "BinaryFileListingModel|" msgid "Name or fingerprint of file" msgstr "ааАаЗаВаА аАаБаО аВб–аДаБаИб‚аОаК б„аАаЙаЛаА" #: datamodel/calistingmodel.cpp:50 datamodel/calistingmodel.cpp:143 msgctxt "CAListingModel|" msgid "Date" msgstr "а”аАб‚аА" #: datamodel/calistingmodel.cpp:51 datamodel/calistingmodel.cpp:142 msgctxt "CAListingModel|" msgid "Subject" msgstr "аЂаЕаМаА" #: datamodel/camodel.cpp:127 msgctxt "ClassifiedAdsModel|" msgid "Buying" msgstr "аšбƒаПб–аВаЛб" #: datamodel/camodel.cpp:129 msgctxt "ClassifiedAdsModel|" msgid "Selling" msgstr "аŸб€аОаДаАаЖ" #: datamodel/camodel.cpp:131 msgctxt "ClassifiedAdsModel|" msgid "Giving away" msgstr "аŸаОаЗаБбƒб‚б‚б" #: datamodel/camodel.cpp:133 msgctxt "ClassifiedAdsModel|" msgid "Wanting" msgstr "аŸаОб‚б€аЕаБаА" #: datamodel/camodel.cpp:135 msgctxt "ClassifiedAdsModel|" msgid "Renting" msgstr "аžб€аЕаНаДаА" #: datamodel/camodel.cpp:137 msgctxt "ClassifiedAdsModel|" msgid "Announcement" msgstr "аžаГаОаЛаОбˆаЕаНаНб" #: datamodel/camodel.cpp:210 msgctxt "ClassifiedAdsModel|" msgid "Cars" msgstr "ааВб‚аОаМаОаБб–аЛб–" #: datamodel/camodel.cpp:212 msgctxt "ClassifiedAdsModel|" msgid "Boats" msgstr "аЇаОаВаНаИ" #: datamodel/camodel.cpp:214 msgctxt "ClassifiedAdsModel|" msgid "Bikes" msgstr "а’аЕаЛаОбаИаПаЕаДаИ" #: datamodel/camodel.cpp:216 msgctxt "ClassifiedAdsModel|" msgid "Other vehicles" msgstr "а†аНбˆб– аЗаАбаОаБаИ аПаЕб€аЕббƒаВаАаНаНб" #: datamodel/camodel.cpp:218 msgctxt "ClassifiedAdsModel|" msgid "Vehicle parts" msgstr "аЇаАбб‚аИаНаИ аЗаАбаОаБб–аВ аПаЕб€аЕббƒаВаАаНаНб" #: datamodel/camodel.cpp:220 msgctxt "ClassifiedAdsModel|" msgid "Habitation" msgstr "а–аИб‚аЛаО" #: datamodel/camodel.cpp:222 msgctxt "ClassifiedAdsModel|" msgid "Household appliances" msgstr "аЅаАб‚аНб” аПб€аИаЛаАаДаДб" #: datamodel/camodel.cpp:224 msgctxt "ClassifiedAdsModel|" msgid "Furniture" msgstr "аœаЕаБаЛб–" #: datamodel/camodel.cpp:226 msgctxt "ClassifiedAdsModel|" msgid "Clothing" msgstr "аžаДбаГ" #: datamodel/camodel.cpp:228 msgctxt "ClassifiedAdsModel|" msgid "Tools" msgstr "а†аНбб‚б€бƒаМаЕаНб‚аИ" #: datamodel/camodel.cpp:230 msgctxt "ClassifiedAdsModel|" msgid "Sports" msgstr "аЁаПаОб€б‚" #: datamodel/camodel.cpp:232 msgctxt "ClassifiedAdsModel|" msgid "Music" msgstr "аœбƒаЗаИаКаА" #: datamodel/camodel.cpp:234 msgctxt "ClassifiedAdsModel|" msgid "Books" msgstr "аšаНаИаГаИ" #: datamodel/camodel.cpp:236 msgctxt "ClassifiedAdsModel|" msgid "Movies" msgstr "а’б–аДаЕаО" #: datamodel/camodel.cpp:238 msgctxt "ClassifiedAdsModel|" msgid "Animals" msgstr "а—аВб–б€б–" #: datamodel/camodel.cpp:240 msgctxt "ClassifiedAdsModel|" msgid "Electronics" msgstr "а•аЛаЕаКб‚б€аОаНб–аКаА" #: datamodel/camodel.cpp:242 msgctxt "ClassifiedAdsModel|" msgid "Jobs" msgstr "а аОаБаОб‚аА" #: datamodel/camodel.cpp:244 msgctxt "ClassifiedAdsModel|" msgid "Transportation" msgstr "аЂб€аАаНбаПаОб€б‚" #: datamodel/camodel.cpp:246 msgctxt "ClassifiedAdsModel|" msgid "Services" msgstr "аŸаОбаЛбƒаГаИ" #: datamodel/camodel.cpp:248 msgctxt "ClassifiedAdsModel|" msgid "Healthcare" msgstr "аœаЕаДаИб†аИаНаА" #: datamodel/camodel.cpp:250 msgctxt "ClassifiedAdsModel|" msgid "Foodstuff" msgstr "аЅаАб€б‡бƒаВаАаНаНб" #: datamodel/camodel.cpp:252 msgctxt "ClassifiedAdsModel|" msgid "Software" msgstr "аŸб€аОаГб€аАаМбƒаВаАаНаНб" #: datamodel/camodel.cpp:254 msgctxt "ClassifiedAdsModel|" msgid "Events" msgstr "аŸаОаДб–б—" #: datamodel/camodel.cpp:256 msgctxt "ClassifiedAdsModel|" msgid "Education" msgstr "аžбаВб–б‚аА" #: datamodel/camodel.cpp:258 msgctxt "ClassifiedAdsModel|" msgid "Finance" msgstr "аЄб–аНаАаНбаИ" #: datamodel/camodel.cpp:260 msgctxt "ClassifiedAdsModel|" msgid "Jewelry" msgstr "аŸб€аИаКб€аАбаИ" #: datamodel/camodel.cpp:262 msgctxt "ClassifiedAdsModel|" msgid "Religious rituals" msgstr "а аЕаЛб–аГб–аЙаНб– б€аИб‚бƒаАаЛаИ" #: datamodel/camodel.cpp:264 msgctxt "ClassifiedAdsModel|" msgid "Philosophy" msgstr "аЄб–аЛаОбаОб„б–б" #: datamodel/camodel.cpp:908 msgctxt "ClassifiedAdsModel|" msgid "Any country" msgstr "а‘бƒаДбŒ-баКаА аКб€аАб—аНаА" #: datamodel/connectionlistingmodel.cpp:142 msgctxt "ConnectionListingModel|" msgid "Peer network address" msgstr "ааДб€аЕбаА аВбƒаЗаЛаА бƒ аМаЕб€аЕаЖб–" #: datamodel/connectionlistingmodel.cpp:145 msgctxt "ConnectionListingModel|" msgid "Inbound connections are those where peer initiated connection" msgstr "" "а’б…б–аДаНаИаМаИ б” аЗт€™б”аДаНаАаНаНб, бƒ баКаИб… аПб€аОб†аЕб аЗт€™б”аДаНаАаНаНб б–аНб–б†б–аАаЛб–аЗаОаВаАаНаО бб‚аОб€аОаНаНб–аМ " "аВбƒаЗаЛаОаМ" #: datamodel/connectionlistingmodel.cpp:148 msgctxt "ConnectionListingModel|" msgid "Data transferred from peer to your node" msgstr "а”аАаНб–, аПаЕб€аЕаДаАаНб– аЗ аВбƒаЗаЛаА аНаА аВаАбˆ аКаОаМаПт€™бŽб‚аЕб€" #: datamodel/connectionlistingmodel.cpp:151 msgctxt "ConnectionListingModel|" msgid "Data transferred to peer from your node" msgstr "а”аАаНб–, аПаЕб€аЕаДаАаНб– аНаА аВбƒаЗаОаЛ аЗ аВаАбˆаОаГаО аКаОаМаПт€™бŽб‚аЕб€аА" #: datamodel/connectionlistingmodel.cpp:154 msgctxt "ConnectionListingModel|" msgid "Time when connection was opened" msgstr "аЇаАб, аКаОаЛаИ аБбƒаЛаО аВбб‚аАаНаОаВаЛаЕаНаО аЗт€™б”аДаНаАаНаНб" #: datamodel/connectionlistingmodel.cpp:164 msgctxt "ConnectionListingModel|" msgid "Address" msgstr "ааДб€аЕбаА" #: datamodel/connectionlistingmodel.cpp:167 msgctxt "ConnectionListingModel|" msgid "Inbound" msgstr "а’б…б–аДаНаЕ" #: datamodel/connectionlistingmodel.cpp:170 msgctxt "ConnectionListingModel|" msgid "Bytes in" msgstr "а’б…б–аДаНаИб… аБаАаЙб‚б–аВ" #: datamodel/connectionlistingmodel.cpp:173 msgctxt "ConnectionListingModel|" msgid "Bytes out" msgstr "а’аИб…б–аДаНаИб… аБаАаЙб‚б–аВ" #: datamodel/connectionlistingmodel.cpp:176 msgctxt "ConnectionListingModel|" msgid "Open time" msgstr "аЇаАб аВб–аДаКб€аИб‚б‚б" #: datamodel/contactlistingmodel.cpp:73 msgctxt "ContactListingModel|" msgid "Yes" msgstr "аЂаАаК" #: datamodel/contactlistingmodel.cpp:75 msgctxt "ContactListingModel|" msgid "Unknown" msgstr "ааЕаВб–аДаОаМаИаЙ" #: datamodel/contactlistingmodel.cpp:98 msgctxt "ContactListingModel|" msgid "Actual network address (SHA1) of the contact" msgstr "аЁаПб€аАаВаЖаНб аАаДб€аЕбаА бƒ аМаЕб€аЕаЖб– (SHA1) аКаОаНб‚аАаКб‚бƒ" #: datamodel/contactlistingmodel.cpp:101 msgctxt "ContactListingModel|" msgid "Locally given nickname ; user may set her own nickname himself" msgstr "" "а›аОаКаАаЛбŒаНаИаЙ аПбаЕаВаДаОаНб–аМ. аšаОб€аИбб‚бƒаВаАб‡б– аМаОаЖбƒб‚бŒ аВаИаЗаНаАб‡аАб‚аИ аВаЛаАбаНаИаЙ аПбаЕаВаДаОаНб–аМ аНаА баВб–аЙ " "б€аОаЗббƒаД." #: datamodel/contactlistingmodel.cpp:104 msgctxt "ContactListingModel|" msgid "Public statement if this operator to be trusted in transactions" msgstr "" "а—аАаГаАаЛбŒаНаОаДаОбб‚бƒаПаНаЕ аОаГаОаЛаОбˆаЕаНаНб б‰аОаДаО б‚аОаГаО, б‡аИ баЛб–аД аДаОаВб–б€бб‚аИ б†бŒаОаМбƒ аОаПаЕб€аАб‚аОб€бƒ бƒ " "аПаЕб€аЕаКаАаЗаАб…" #: datamodel/contactlistingmodel.cpp:114 msgctxt "ContactListingModel|" msgid "Address" msgstr "ааДб€аЕбаА" #: datamodel/contactlistingmodel.cpp:117 msgctxt "ContactListingModel|" msgid "Nickname" msgstr "аŸбаЕаВаДаОаНб–аМ" #: datamodel/contactlistingmodel.cpp:120 msgctxt "ContactListingModel|" msgid "Publicly trusted" msgstr "а—аАаГаАаЛбŒаНаА аДаОаВб–б€аА" #: datamodel/contentencryptionmodel.cpp:88 msgctxt "ContentEncryptionModel|" msgid "SSL key generation went wrong, calling exit.." msgstr "ааЕ аВаДаАаЛаОбб бб‚аВаОб€аИб‚аИ аКаЛбŽб‡ SSL, аВаИаКаЛаИаКаАб”аМаО аПб–аДаПб€аОаГб€аАаМбƒ аВаИб…аОаДбƒт€І" #: datamodel/contentencryptionmodel.cpp:96 msgctxt "ContentEncryptionModel|" msgid "x509 cert generation went wrong, calling exit.." msgstr "ааЕ аВаДаАаЛаОбб бб‚аВаОб€аИб‚аИ баЕб€б‚аИб„б–аКаАб‚ x509, аВаИаКаЛаИаКаАб”аМаО аПб–аДаПб€аОаГб€аАаМбƒ аВаИб…аОаДбƒт€І" #: datamodel/contentencryptionmodel.cpp:194 #: datamodel/contentencryptionmodel.cpp:292 msgctxt "ContentEncryptionModel|" msgid "RSA Private key key saving went wrong" msgstr "ааЕ аВаДаАаЛаОбб аЗаБаЕб€аЕаГб‚аИ аЗаАаКб€аИб‚аИаЙ аКаЛбŽб‡ RSA" #: datamodel/contentencryptionmodel.cpp:639 msgctxt "ContentEncryptionModel|" msgid "No suitable de-cryption key found" msgstr "ааЕ аЗаНаАаЙаДаЕаНаО аВб–аДаПаОаВб–аДаНаОаГаО аКаЛбŽб‡аА б€аОаЗбˆаИб„б€аОаВбƒаВаАаНаНб" #: controller.cpp:109 msgctxt "Controller|" msgid "Classified ads" msgstr "Classified ads" #: controller.cpp:141 msgctxt "Controller|" msgid "Enter password for protection of your messages:" msgstr "а’аВаЕаДб–б‚бŒ аПаАб€аОаЛбŒ аДаЛб аЗаАб…аИбб‚бƒ аВаАбˆаИб… аПаОаВб–аДаОаМаЛаЕаНбŒ:" #: controller.cpp:432 msgctxt "Controller|" msgid "Fetching item from network.." msgstr "аžб‚б€аИаМбƒб”аМаО аЗаАаПаИб б–аЗ аМаЕб€аЕаЖб–т€І" #: controller.cpp:485 msgctxt "Controller|" msgid "E&xit" msgstr "а’аИ&аЙб‚аИ" #: controller.cpp:487 msgctxt "Controller|" msgid "Exit the application" msgstr "а—аАаВаЕб€бˆаИб‚аИ б€аОаБаОб‚бƒ аПб€аОаГб€аАаМаИ" #: controller.cpp:489 msgctxt "Controller|" msgid "&About" msgstr "аŸб€&аО аПб€аОаГб€аАаМбƒ" #: controller.cpp:490 msgctxt "Controller|" msgid "Show the application's About box" msgstr "аŸаОаКаАаЗаАб‚аИ аПаАаНаЕаЛбŒ аЗ б–аНб„аОб€аМаАб†б–б”бŽ аПб€аО аПб€аОаГб€аАаМбƒ" #: controller.cpp:492 msgctxt "Controller|" msgid "&Change password" msgstr "а—&аМб–аНаИб‚аИ аПаАб€аОаЛбŒ" #: controller.cpp:493 msgctxt "Controller|" msgid "Change password of current profile" msgstr "а—аМб–аНаИб‚аИ аПаАб€аОаЛбŒ аДаО аПаОб‚аОб‡аНаОаГаО аПб€аОб„б–аЛбŽ" #: controller.cpp:495 msgctxt "Controller|" msgid "Create &new profile" msgstr "аЁ&б‚аВаОб€аИб‚аИ аПб€аОб„б–аЛбŒ" #: controller.cpp:496 msgctxt "Controller|" msgid "Makes a brand new user profile" msgstr "аЁб‚аВаОб€аИб‚аИ аНаОаВаИаЙ аПб€аОб„б–аЛбŒ аКаОб€аИбб‚бƒаВаАб‡аА" #: controller.cpp:498 msgctxt "Controller|" msgid "&Delete current profile" msgstr "а’аИ&аЛбƒб‡аИб‚аИ аПаОб‚аОб‡аНаИаЙ аПб€аОб„б–аЛбŒ" #: controller.cpp:499 msgctxt "Controller|" msgid "Deletes currently open profile" msgstr "а’аИаЛбƒб‡аАб” аПаОб‚аОб‡аНаИаЙ аВб–аДаКб€аИб‚аИаЙ аПб€аОб„б–аЛбŒ" #: controller.cpp:501 msgctxt "Controller|" msgid "&Select another profile" msgstr "а’аИ&аБб€аАб‚аИ б–аНбˆаИаЙ аПб€аОб„б–аЛбŒ" #: controller.cpp:502 msgctxt "Controller|" msgid "If you have multitude of profiles" msgstr "аЏаКб‰аО бƒ аВаАб аДаЕаКб–аЛбŒаКаА аПб€аОб„б–аЛб–аВ" #: controller.cpp:504 msgctxt "Controller|" msgid "Settings.." msgstr "аŸаАб€аАаМаЕб‚б€аИт€І" #: controller.cpp:505 msgctxt "Controller|" msgid "Node-wide settings.." msgstr "аŸаАб€аАаМаЕб‚б€аИ б€аОаБаОб‚аИ аВбƒаЗаЛаАт€І" #: controller.cpp:507 msgctxt "Controller|" msgid "Network status.." msgstr "аЁб‚аАаН аМаЕб€аЕаЖб–т€І" #: controller.cpp:509 msgctxt "Controller|" msgid "Search.." msgstr "аŸаОбˆбƒаКт€І" #: controller.cpp:526 msgctxt "Controller|" msgid "&File" msgstr "&аЄаАаЙаЛ" #: controller.cpp:729 msgctxt "Controller|" msgid "&TCL Programs" msgstr "&аŸб€аОаГб€аАаМаИ TCL" #: controller.cpp:730 msgctxt "Controller|" msgid "&Local library" msgstr "&а›аОаКаАаЛбŒаНаА аБб–аБаЛб–аОб‚аЕаКаА" #: controller.cpp:731 msgctxt "Controller|" msgid "Locally stored TCL programs" msgstr "а›аОаКаАаЛбŒаНаО аЗаБаЕб€аЕаЖаЕаНб– аПб€аОаГб€аАаМаИ TCL" #: controller.cpp:734 msgctxt "Controller|" msgid "TCL &Console" msgstr "&аšаОаНбаОаЛбŒ TCL" #: controller.cpp:735 msgctxt "Controller|" msgid "Display interpreter console" msgstr "аŸаОаКаАаЗаАб‚аИ аКаОаНбаОаЛбŒ б–аНб‚аЕб€аПб€аЕб‚аАб‚аОб€аА" #: controller.cpp:571 msgctxt "Controller|" msgid "Enter new password:" msgstr "а’аВаЕаДб–б‚бŒ аНаОаВаИаЙ аПаАб€аОаЛбŒ:" #: controller.cpp:599 controller.cpp:708 msgctxt "Controller|" msgid "Activate another profile with password" msgstr "ааКб‚аИаВаАб†б–б б–аНбˆаОаГаО аПб€аОб„б–аЛбŽ аЗаА аДаОаПаОаМаОаГаОбŽ аПаАб€аОаЛб" #: controller.cpp:693 msgctxt "Controller|" msgid "Can't delete only profile." msgstr "ааЕ аМаОаЖаНаА аВаИаЛбƒб‡аАб‚аИ б”аДаИаНаИаЙ аПб€аОб„б–аЛбŒ." #: controller.cpp:697 msgctxt "Controller|" msgid "Permanently discard profile?" msgstr "аžбб‚аАб‚аОб‡аНаО аВб–аДаКаИаНбƒб‚аИ аПб€аОб„б–аЛбŒ?" #: controller.cpp:698 msgctxt "Controller|" msgid "There will be NO way to access content of this profile later" msgstr "аžб‚б€аИаМаАб‚аИ аДаОбб‚бƒаП аДаО б†бŒаОаГаО аПб€аОб„б–аЛбŽ аЗаГаОаДаОаМ аБбƒаДаЕ аа•аœаžа–а›а˜а’аž" #: controller.cpp:761 msgctxt "Controller|" msgid "Cant load node cert or key cert" msgstr "ааЕ аВаДаАаЛаОбб аЗаАаВаАаНб‚аАаЖаИб‚аИ баЕб€б‚аИб„б–аКаАб‚ аВбƒаЗаЛаА аАаБаО баЕб€б‚аИб„б–аКаАб‚ аКаЛбŽб‡аА" #: controller.cpp:766 msgctxt "Controller|" msgid "File error" msgstr "аŸаОаМаИаЛаКаА аПб–аД б‡аАб б€аОаБаОб‚аИ аЗ б„аАаЙаЛаАаМаИ" #: controller.cpp:771 msgctxt "Controller|" msgid "Database error" msgstr "аŸаОаМаИаЛаКаА аБаАаЗаИ аДаАаНаИб…" #: controller.cpp:777 controller.cpp:787 msgctxt "Controller|" msgid "Cryptographic module" msgstr "аœаОаДбƒаЛбŒ бˆаИб„б€бƒаВаАаНаНб" #: controller.cpp:782 msgctxt "Controller|" msgid "Database module" msgstr "аœаОаДбƒаЛбŒ аБаАаЗаИ аДаАаНаИб…" #: controller.cpp:788 msgctxt "Controller|" msgid "Bad password" msgstr "аŸаОаМаИаЛаКаОаВаИаЙ аПаАб€аОаЛбŒ" #: controller.cpp:1043 msgctxt "Controller|" msgid "TCL Interpreter" msgstr "а†аНб‚аЕб€аПб€аЕб‚аАб‚аОб€ TCL" #: controller.cpp:1004 msgctxt "Controller|" msgid "Could not find item from network.." msgstr "ааЕ аВаДаАаЛаОбб аЗаНаАаЙб‚аИ аЗаАаПаИб бƒ аМаЕб€аЕаЖб–т€І" #: controller.cpp:1117 msgctxt "Controller|" msgid "SHA1: " msgstr "SHA1: " #: controller.cpp:1122 msgctxt "Controller|" msgid "Mime-Type: " msgstr "аЂаИаП MIME: " #: controller.cpp:1128 msgctxt "Controller|" msgid "Description: " msgstr "аžаПаИб: " #: controller.cpp:1134 msgctxt "Controller|" msgid "Publisher: " msgstr "а’аИаДаАаВаЕб†бŒ: " #: controller.cpp:1140 msgctxt "Controller|" msgid "Content owner: " msgstr "а’аЛаАбаНаИаК аДаАаНаИб…: " #: controller.cpp:1146 msgctxt "Controller|" msgid "License: " msgstr "а›б–б†аЕаНаЗбƒаВаАаНаНб: " #: controller.cpp:1152 msgctxt "Controller|" msgid "Name: " msgstr "ааАаЗаВаА: " #: controller.cpp:1159 msgctxt "Controller|" msgid "Date: " msgstr "а”аАб‚аА: " #: ui/dialogbase.cpp:47 ui/dialogbase.cpp:101 msgctxt "DialogBase|" msgid "File way too big" msgstr "аЄаАаЙаЛ б” аНаАаДб‚аО аВаЕаЛаИаКаИаМ" #: ui/dialogbase.cpp:55 ui/dialogbase.cpp:109 msgctxt "DialogBase|" msgid "File too big" msgstr "аЄаАаЙаЛ б” аНаАаДб‚аО аВаЕаЛаИаКаИаМ" #: ui/dialogbase.cpp:85 ui/dialogbase.cpp:131 msgctxt "DialogBase|" msgid "File open error" msgstr "аŸаОаМаИаЛаКаА аВб–аДаКб€аИб‚б‚б б„аАаЙаЛаА" #: ui/dialogbase.cpp:94 msgctxt "DialogBase|" msgid "Select file to be published" msgstr "а’аИаБаЕб€б–б‚бŒ б„аАаЙаЛаИ аДаЛб аОаПб€аИаЛбŽаДаНаЕаНаНб" #: ui/dialogbase.cpp:96 msgctxt "DialogBase|" msgid "Files (*.*)" msgstr "б„аАаЙаЛаИ (*.*)" #: ui/editcontact.cpp:72 msgctxt "EditContactDialog|" msgid "Error" msgstr "аŸаОаМаИаЛаКаА" #: ui/editcontact.cpp:73 msgctxt "EditContactDialog|" msgid "Operator addr is not valid" msgstr "ааДб€аЕбаА аОаПаЕб€аАб‚аОб€аА б” аНаЕаКаОб€аЕаКб‚аНаОбŽ" #: FrontWidget.cpp:95 msgctxt "FrontWidget|" msgid "Classified ads" msgstr "Classified ads" #: FrontWidget.cpp:96 msgctxt "FrontWidget|" msgid "My profile" msgstr "аœб–аЙ аПб€аОб„б–аЛбŒ" #: FrontWidget.cpp:97 msgctxt "FrontWidget|" msgid "Contacts" msgstr "аšаОаНб‚аАаКб‚аИ" #: FrontWidget.cpp:98 msgctxt "FrontWidget|" msgid "Private messages" msgstr "аžбаОаБаИбб‚б– аПаОаВб–аДаОаМаЛаЕаНаНб" #: FrontWidget.cpp:160 msgctxt "FrontWidget|" msgid "Add shared file.." msgstr "а”аОаДаАб‚аИ баПб–аЛбŒаНаИаЙ б„аАаЙаЛт€І" #: FrontWidget.cpp:161 msgctxt "FrontWidget|" msgid "Stop advertising selected shared file" msgstr "аŸб€аИаПаИаНаИб‚аИ аПаОбˆаИб€аЕаНаНб аПаОаЗаНаАб‡аЕаНаОаГаО баПб–аЛбŒаНаОаГаО б„аАаЙаЛаА" #: FrontWidget.cpp:162 msgctxt "FrontWidget|" msgid "Save file to disk.." msgstr "а—аБаЕб€аЕаГб‚аИ б„аАаЙаЛ аНаА аДаИбаКт€І" #: FrontWidget.cpp:163 msgctxt "FrontWidget|" msgid "View file information.." msgstr "аŸаЕб€аЕаГаЛбаНбƒб‚аИ аДаАаНб– б‰аОаДаО б„аАаЙаЛаАт€І" #: FrontWidget.cpp:164 msgctxt "FrontWidget|" msgid "Copy file address (SHA1) to clipboard.." msgstr "аšаОаПб–бŽаВаАб‚аИ аАаДб€аЕббƒ б„аАаЙаЛаА (SHA1) аДаО аБбƒб„аЕб€аА аОаБаМб–аНбƒт€І" #: FrontWidget.cpp:165 msgctxt "FrontWidget|" msgid "Edit+publish new text document.." msgstr "а аЕаДаАаГбƒаВаАб‚аИ б– аОаПб€аИаЛбŽаДаНаИб‚аИ аНаОаВаИаЙ б‚аЕаКбб‚аОаВаИаЙ аДаОаКбƒаМаЕаНб‚т€І" #: FrontWidget.cpp:353 msgctxt "FrontWidget|" msgid "Open File" msgstr "а’б–аДаКб€аИб‚аИ б„аАаЙаЛ" #: FrontWidget.cpp:355 FrontWidget.cpp:885 msgctxt "FrontWidget|" msgid "Files (*.*)" msgstr "б„аАаЙаЛаИ (*.*)" #: FrontWidget.cpp:359 FrontWidget.cpp:1185 FrontWidget.cpp:1328 msgctxt "FrontWidget|" msgid "Error" msgstr "аŸаОаМаИаЛаКаА" #: FrontWidget.cpp:360 msgctxt "FrontWidget|" msgid "Can't load image" msgstr "ааЕ аВаДаАаЛаОбб аЗаАаВаАаНб‚аАаЖаИб‚аИ аЗаОаБб€аАаЖаЕаНаНб" #: FrontWidget.cpp:626 FrontWidget.cpp:766 msgctxt "FrontWidget|" msgid "Profile not in database" msgstr "аŸб€аОб„б–аЛбŽ аНаЕаМаАб” бƒ аБаАаЗб– аДаАаНаИб…" #: FrontWidget.cpp:627 FrontWidget.cpp:767 msgctxt "FrontWidget|" msgid "Try viewing profile first to obtain data" msgstr "аЁаПб€аОаБбƒаЙб‚аЕ баПаОб‡аАб‚аКбƒ аПаЕб€аЕаГаЛбаНбƒб‚аИ аПб€аОб„б–аЛбŒ аДаЛб аОб‚б€аИаМаАаНаНб аДаАаНаИб…" #: FrontWidget.cpp:883 msgctxt "FrontWidget|" msgid "Select file to be published" msgstr "а’аИаБаЕб€б–б‚бŒ б„аАаЙаЛаИ аДаЛб аОаПб€аИаЛбŽаДаНаЕаНаНб" #: FrontWidget.cpp:890 msgctxt "FrontWidget|" msgid "File way too big" msgstr "аЄаАаЙаЛ б” аНаАаДб‚аО аВаЕаЛаИаКаИаМ" #: FrontWidget.cpp:898 msgctxt "FrontWidget|" msgid "File too big" msgstr "аЄаАаЙаЛ б” аНаАаДб‚аО аВаЕаЛаИаКаИаМ" #: FrontWidget.cpp:942 FrontWidget.cpp:1186 msgctxt "FrontWidget|" msgid "File open error" msgstr "аŸаОаМаИаЛаКаА аВб–аДаКб€аИб‚б‚б б„аАаЙаЛаА" #: FrontWidget.cpp:1167 FrontWidget.cpp:1173 msgctxt "FrontWidget|" msgid "files" msgstr "б„аАаЙаЛаИ" #: FrontWidget.cpp:1183 msgctxt "FrontWidget|" msgid "Save location" msgstr "а—аБаЕб€аЕаГб‚аИ аМб–бб†аЕ" #: FrontWidget.cpp:1184 msgctxt "FrontWidget|" msgid "Save to TCL app library instead of regular file?" msgstr "а—аБаЕб€аЕаГб‚аИ аДаО аБб–аБаЛб–аОб‚аЕаКаИ аПб€аОаГб€аАаМ TCL, аА аНаЕ аДаО аЗаВаИб‡аАаЙаНаОаГаО б„аАаЙаЛаА?" #: FrontWidget.cpp:1176 msgctxt "FrontWidget|" msgid "Choose file name for saving" msgstr "а’аИаБаЕб€б–б‚бŒ аНаАаЗаВбƒ б„аАаЙаЛаА аДаЛб аЗаБаЕб€аЕаЖаЕаНаНб" #: FrontWidget.cpp:1236 msgctxt "FrontWidget|" msgid "" "\n" "\n" "\n" "Click\n" "To\n" "Add\n" "Image\n" msgstr "" "\n" "\n" "\n" "ааАб‚аИбаНб–б‚бŒ,\n" "б‰аОаБ\n" "аДаОаДаАб‚аИ\n" "аЗаОаБб€аАаЖаЕаНаНб\n" #: FrontWidget.cpp:1329 msgctxt "FrontWidget|" msgid "Article not found from local storage" msgstr "аЁб‚аАб‚б‚б– аНаЕ аЗаНаАаЙаДаЕаНаО бƒ аЛаОаКаАаЛбŒаНаОаМбƒ бб…аОаВаИб‰б– аДаАаНаИб…" #: FrontWidget.cpp:1355 FrontWidget.cpp:1903 #, qt-format msgctxt "FrontWidget|" msgid "" "Trusted by %1\n" "SHA1 %2" msgstr "" "а”аОаВб–б€аЕаНаИаЙ %1\n" "SHA1 %2" #: FrontWidget.cpp:1392 msgctxt "FrontWidget|" msgid "Time of last update " msgstr "аЇаАб аОбб‚аАаНаНбŒаОаГаО аОаНаОаВаЛаЕаНаНб " #: FrontWidget.cpp:1400 msgctxt "FrontWidget|" msgid "" "\n" "\n" "\n" "(No\n" "Image\n" "Selected)\n" msgstr "" "\n" "\n" "\n" "(а—аОаБб€аАаЖаЕаНаНб\n" "аНаЕ\n" "аВаИаБб€аАаНаО)\n" #: FrontWidget.cpp:1494 msgctxt "FrontWidget|" msgid "Edit contact.." msgstr "а—аМб–аНаИб‚аИ аПаАб€аАаМаЕб‚б€аИ аКаОаНб‚аАаКб‚бƒт€І" #: FrontWidget.cpp:1534 msgctxt "FrontWidget|" msgid "&Reply to sender" msgstr "а’б–&аДаПаОаВб–бб‚аИ аВб–аДаПб€аАаВаНаИаКбƒ" #: FrontWidget.cpp:1535 msgctxt "FrontWidget|" msgid "Reply to &forum" msgstr "а’б–аДаПаОаВб–бб‚аИ аНаА &б„аОб€бƒаМб–" #: FrontWidget.cpp:1536 msgctxt "FrontWidget|" msgid "&Post new ad" msgstr "&а аОаЗаМб–бб‚аИб‚аИ аНаОаВаЕ аОаГаОаЛаОбˆаЕаНаНб" #: FrontWidget.cpp:1537 msgctxt "FrontWidget|" msgid "&Public comment" msgstr "а’&б–аДаКб€аИб‚аИаЙ аКаОаМаЕаНб‚аАб€" #: FrontWidget.cpp:1538 msgctxt "FrontWidget|" msgid "&View profile" msgstr "аŸ&аЕб€аЕаГаЛбаНбƒб‚аИ аПб€аОб„б–аЛбŒ" #: FrontWidget.cpp:1539 FrontWidget.cpp:1677 msgctxt "FrontWidget|" msgid "Attachments.." msgstr "а”аОаЛбƒб‡аЕаНаНбт€І" #: FrontWidget.cpp:1599 msgctxt "FrontWidget|" msgid "Add selected operator to contacts.." msgstr "а”аОаДаАб‚аИ аПаОаЗаНаАб‡аЕаНаОаГаО аОаПаЕб€аАб‚аОб€аА аДаО аКаОаНб‚аАаКб‚б–аВт€І" #: FrontWidget.cpp:1673 msgctxt "FrontWidget|" msgid "&Reply" msgstr "а’б–&аДаПаОаВб–бб‚аИ" #: FrontWidget.cpp:1674 msgctxt "FrontWidget|" msgid "&New message" msgstr "аЁ&б‚аВаОб€аИб‚аИ аПаОаВб–аДаОаМаЛаЕаНаНб" #: FrontWidget.cpp:1675 msgctxt "FrontWidget|" msgid "&Send public comment to sender" msgstr "&ааАаДб–баЛаАб‚аИ аВб–аДаКб€аИб‚аИаЙ аКаОаМаЕаНб‚аАб€ аВб–аДаПб€аАаВаНаИаКбƒ" #: FrontWidget.cpp:1676 msgctxt "FrontWidget|" msgid "&View profile of peer" msgstr "аŸ&аЕб€аЕаГаЛбаНбƒб‚аИ аПб€аОб„б–аЛбŒ аВбƒаЗаЛаА" #: FrontWidget.cpp:1711 msgctxt "FrontWidget|" msgid "Add selected to contacts.." msgstr "а”аОаДаАб‚аИ аПаОаЗаНаАб‡аЕаНаЕ аДаО аКаОаНб‚аАаКб‚б–аВт€І" #: FrontWidget.cpp:1913 FrontWidget.cpp:1915 FrontWidget.cpp:1979 #: FrontWidget.cpp:1981 msgctxt "FrontWidget|" msgid "From:" msgstr "а’б–аД:" #: FrontWidget.cpp:1917 FrontWidget.cpp:1984 msgctxt "FrontWidget|" msgid "Subject:" msgstr "аЂаЕаМаА:" #: FrontWidget.cpp:1976 msgctxt "FrontWidget|" msgid "To:" msgstr "аšаОаМбƒ:" #: FrontWidget.cpp:2288 msgctxt "FrontWidget|" msgid "Invalid SHA1 in URL" msgstr "аНаЕаКаОб€аЕаКб‚аНаА SHA1 бƒ аАаДб€аЕбб–" #: FrontWidget.cpp:2315 msgctxt "FrontWidget|" msgid "Invalid URL" msgstr "ааЕаКаОб€аЕаКб‚аНаА аАаДб€аЕбаА" #: ui/insertlinkdialog.cpp:69 msgctxt "InsertLinkDialog|" msgid "Invalid URL" msgstr "ааЕаКаОб€аЕаКб‚аНаА аАаДб€аЕбаА" #: ui/manualconnection.cpp:53 msgctxt "ManualConnectionDialog|" msgid "DNS lookup failure" msgstr "аŸаОаМаИаЛаКаА аПб–аД б‡аАб аПаОбˆбƒаКбƒ бƒ DNS" #: ui/newprivmsgdialog.cpp:88 ui/newprivmsgdialog.cpp:138 msgctxt "NewPrivMessageDialog|" msgid "Error" msgstr "аŸаОаМаИаЛаКаА" #: ui/newprivmsgdialog.cpp:89 msgctxt "NewPrivMessageDialog|" msgid "Recipient addr is not valid" msgstr "ааДб€аЕбаА аОб‚б€аИаМбƒаВаАб‡аА б” аНаЕаКаОб€аЕаКб‚аНаОбŽ" #: ui/newprivmsgdialog.cpp:139 msgctxt "NewPrivMessageDialog|" msgid "Recipient encryption key not found from storage" msgstr "аšаЛбŽб‡аА бˆаИб„б€бƒаВаАаНаНб аОб‚б€аИаМбƒаВаАб‡аА аНаЕ аЗаНаАаЙаДаЕаНаО бƒ бб…аОаВаИб‰б– аДаАаНаИб…" #: ui/newprofilecommentdialog.cpp:89 ui/newprofilecommentdialog.cpp:126 msgctxt "NewProfileCommentDialog|" msgid "Error" msgstr "аŸаОаМаИаЛаКаА" #: ui/newprofilecommentdialog.cpp:90 msgctxt "NewProfileCommentDialog|" msgid "Commented profile addr is not valid" msgstr "ааДб€аЕбаА аКаОаМаЕаНб‚аОаВаАаНаОаГаО аПб€аОб„б–аЛбŽ б” аНаЕаКаОб€аЕаКб‚аНаОбŽ" #: ui/newprofilecommentdialog.cpp:127 msgctxt "NewProfileCommentDialog|" msgid "Recipient encryption key not found from storage" msgstr "аšаЛбŽб‡аА бˆаИб„б€бƒаВаАаНаНб аОб‚б€аИаМбƒаВаАб‡аА аНаЕ аЗаНаАаЙаДаЕаНаО бƒ бб…аОаВаИб‰б– аДаАаНаИб…" #: datamodel/nodemodel.cpp:115 msgctxt "NodeModel|" msgid "SSL key generation went wrong, calling exit.." msgstr "ааЕ аВаДаАаЛаОбб бб‚аВаОб€аИб‚аИ аКаЛбŽб‡ SSL, аВаИаКаЛаИаКаАб”аМаО аПб–аДаПб€аОаГб€аАаМбƒ аВаИб…аОаДбƒт€І" #: datamodel/nodemodel.cpp:123 msgctxt "NodeModel|" msgid "x509 cert generation went wrong, calling exit.." msgstr "ааЕ аВаДаАаЛаОбб бб‚аВаОб€аИб‚аИ баЕб€б‚аИб„б–аКаАб‚ x509, аВаИаКаЛаИаКаАб”аМаО аПб–аДаПб€аОаГб€аАаМбƒ аВаИб…аОаДбƒт€І" #: datamodel/nodemodel.cpp:1596 msgctxt "NodeModel|" msgid "Cant load SSL cert" msgstr "ааЕ аВаДаАаЛаОбб аЗаАаВаАаНб‚аАаЖаИб‚аИ баЕб€б‚аИб„б–аКаАб‚ SSL" #: datamodel/nodemodel.cpp:1626 msgctxt "NodeModel|" msgid "Cant load SSL key" msgstr "ааЕ аВаДаАаЛаОбб аЗаАаВаАаНб‚аАаЖаИб‚аИ аКаЛбŽб‡ SSL" #: ui/passwd_dialog.cpp:104 msgctxt "PasswdDialog|" msgid "Min length 5 (use 10+)" msgstr "аœб–аН. аДаОаВаЖаИаНаА 5 (б€аЕаКаОаМаЕаНаДаОаВаАаНаА т€” 10+)" #: ui/passwordDialog.ui:14 msgctxt "PasswordDialog|" msgid "Password required" msgstr "аŸаОб‚б€б–аБаЕаН аПаАб€аОаЛбŒ" #: ui/passwordDialog.ui:17 msgctxt "PasswordDialog|" msgid "" "Should you forget this word, there is no easy way to recover any of your " "content" msgstr "" "аЏаКб‰аО аВаИ б€аАаПб‚аОаМ аЗаАаБбƒаДаЕб‚аЕ б†аЕ баЛаОаВаО, аВб–аДаНаОаВаИб‚аИ аВаАбˆб– аДаАаНб– аБбƒаДаЕ аДбƒаЖаЕ аНаЕаПб€аОбб‚аО" #: ui/passwordDialog.ui:29 msgctxt "PasswordDialog|" msgid "Enter password for protection of your messages" msgstr "а’аВаЕаДб–б‚бŒ аПаАб€аОаЛбŒ аДаЛб аЗаАб…аИбб‚бƒ аВаАбˆаИб… аПаОаВб–аДаОаМаЛаЕаНбŒ" #: ui/passwordDialog.ui:42 msgctxt "PasswordDialog|" msgid "" "If you forget this word, there is no simple way to recover your contents" msgstr "аЏаКб‰аО аВаИ аЗаАаБбƒаЛаИ б†аЕ баЛаОаВаО, аВб–аДаНаОаВаИб‚аИ аВаАбˆб– аДаАаНб– аБбƒаДаЕ аНаЕаПб€аОбб‚аО" #: ui/passwordDialog.ui:55 msgctxt "PasswordDialog|" msgid "OK" msgstr "а“аАб€аАаЗаД" #: ui/passwordDialog.ui:68 msgctxt "PasswordDialog|" msgid "Show password" msgstr "аŸаОаКаАаЗбƒаВаАб‚аИ аПаАб€аОаЛбŒ" #: datamodel/privmsgsearchmodel.cpp:110 #, qt-format msgctxt "PrivateMessageSearchModel|" msgid "" "%1\n" "Trusted by %2" msgstr "" "%1\n" "а’аВаАаЖаАб”б‚бŒбб аДаОаВб–б€аЕаНаИаМ %2" #: datamodel/privmsgsearchmodel.cpp:237 msgctxt "PrivateMessageSearchModel|" msgid "Direction of message, sent/received" msgstr "ааАаПб€баМаОаК аПаОаВб–аДаОаМаЛаЕаНаНб, аНаАаДб–баЛаАаНаЕ аАаБаО аОб‚б€аИаМаАаНаЕ" #: datamodel/privmsgsearchmodel.cpp:247 msgctxt "PrivateMessageSearchModel|" msgid "Dir" msgstr "аšаАб‚аАаЛаОаГ" #: datamodel/privmsgsearchmodel.cpp:250 msgctxt "PrivateMessageSearchModel|" msgid "Peer" msgstr "а’бƒаЗаОаЛ" #: datamodel/privmsgsearchmodel.cpp:253 msgctxt "PrivateMessageSearchModel|" msgid "Time" msgstr "аЇаАб" #: datamodel/privmsgsearchmodel.cpp:256 msgctxt "PrivateMessageSearchModel|" msgid "Subject" msgstr "аЂаЕаМаА" #: ui/profilecommentdisplay.cpp:54 msgctxt "ProfileCommentDisplay|" msgid "&Add comment..." msgstr "&а”аОаДаАб‚аИ аКаОаМаЕаНб‚аАб€т€І" #: ui/profilecommentdisplay.cpp:65 msgctxt "ProfileCommentDisplay|" msgid "Save attachment to disk.." msgstr "а—аБаЕб€аЕаГб‚аИ аДаОаЛбƒб‡аЕаНаНб аНаА аДаИбаКт€І" #: ui/profilecommentdisplay.cpp:92 msgctxt "ProfileCommentDisplay|" msgid "Error" msgstr "аŸаОаМаИаЛаКаА" #: ui/profilecommentdisplay.cpp:93 msgctxt "ProfileCommentDisplay|" msgid "Article not found from local storage" msgstr "аЁб‚аАб‚б‚б– аНаЕ аЗаНаАаЙаДаЕаНаО бƒ аЛаОаКаАаЛбŒаНаОаМбƒ бб…аОаВаИб‰б– аДаАаНаИб…" #: ui/profilecommentitemdelegate.cpp:93 msgctxt "ProfileCommentItemDelegate|" msgid "Attachments: " msgstr "а”аОаЛбƒб‡аЕаНаНб: " #: datamodel/profilecommentlistingmodel.cpp:219 msgctxt "ProfileCommentListingModel|" msgid "Sender" msgstr "а’б–аДаПб€аАаВаНаИаК" #: datamodel/profilecommentlistingmodel.cpp:222 msgctxt "ProfileCommentListingModel|" msgid "Time" msgstr "аЇаАб" #: datamodel/profilecommentlistingmodel.cpp:225 msgctxt "ProfileCommentListingModel|" msgid "Subject" msgstr "аЂаЕаМаА" #: datamodel/profilecommentmodel.cpp:67 msgctxt "ProfileCommentModel|" msgid "Profile related to comment not found from database" msgstr "аŸб€аОб„б–аЛбŽ, аПаОаВт€™баЗаАаНаОаГаО б–аЗ аКаОаМаЕаНб‚аАб€аЕаМ, бƒ аБаАаЗб– аДаАаНаИб… аНаЕаМаАб”" #: ui/profilereadersdialog.cpp:73 msgctxt "ProfileReadersDialog|" msgid "View profile" msgstr "аŸаЕб€аЕаГаЛбаНбƒб‚аИ аПб€аОб„б–аЛбŒ" #: datamodel/profilereaderslistingmodel.cpp:174 msgctxt "ProfileReadersListingModel|" msgid "Name or fingerprint of reader" msgstr "а†аМт€™б аАаБаО аВб–аДаБаИб‚аОаК б‡аИб‚аАб‡аА" #: call/ringtoneplayer.cpp:77 msgctxt "RingtonePlayer|" msgid "raw audio format not supported by backend, cannot play audio." msgstr "" "аПб–аДб‚б€аИаМаКаИ б„аОб€аМаАб‚бƒ аЗаВбƒаКаОаВаИб… аДаАаНаИб… аБаЕаЗ аОаБб€аОаБаКаИ аНаЕ аПаЕб€аЕаДаБаАб‡аЕаНаО бƒ аМаОаДбƒаЛб– " "аОаБб€аОаБаКаИ, аВб–аДб‚аВаОб€аЕаНаНб аЗаВбƒаКбƒ аНаЕаМаОаЖаЛаИаВаЕ." #: call/ringtoneplayer.cpp:93 msgctxt "RingtonePlayer|" msgid "Could not initialize audio player." msgstr "ааЕ аВаДаАаЛаОбб б–аНб–б†б–аАаЛб–аЗбƒаВаАб‚аИ аЗаВбƒаКаОаВаИаЙ аПб€аОаГб€аАаВаАб‡." #: ui/searchdisplay.cpp:62 msgctxt "SearchDisplay|" msgid "Open.." msgstr "а’б–аДаКб€аИб‚аИт€І" #: ui/tclPrograms.cpp:42 msgctxt "TclProgramsDialog|" msgid "Evaluate" msgstr "аžб†б–аНаИб‚аИ" #: ui/tclPrograms.cpp:43 msgctxt "TclProgramsDialog|" msgid "Stop program" msgstr "а—бƒаПаИаНаИб‚аИ аПб€аОаГб€аАаМбƒ" #: ui/tclPrograms.cpp:49 msgctxt "TclProgramsDialog|" msgid "Delete program" msgstr "а’аИаЛбƒб‡аИб‚аИ аПб€аОаГб€аАаМбƒ" #: ui/tclPrograms.cpp:99 msgctxt "TclProgramsDialog|" msgid "TCL Program name" msgstr "ааАаЗаВаА аПб€аОаГб€аАаМаИ TCL" #: ui/tclPrograms.cpp:100 msgctxt "TclProgramsDialog|" msgid "Name:" msgstr "ааАаЗаВаА:" #: ui/tclPrograms.cpp:140 msgctxt "TclProgramsDialog|" msgid "Deletion confirmation" msgstr "аŸб–аДб‚аВаЕб€аДаЖаЕаНаНб аВаИаЛбƒб‡аЕаНаНб" #: ui/tclPrograms.cpp:141 #, qt-format msgctxt "TclProgramsDialog|" msgid "Permanently delete program %1?" msgstr "аžбб‚аАб‚аОб‡аНаО аВаИаЛбƒб‡аИб‚аИ аПб€аОаГб€аАаМбƒ %1?" #: textedit/textedit.cpp:127 msgctxt "TextEdit|" msgid "Help" msgstr "а”аОаВб–аДаКаА" #: textedit/textedit.cpp:129 msgctxt "TextEdit|" msgid "About &Qt" msgstr "аŸб€аО &аБб–аБаЛб–аОб‚аЕаКбƒ Qt" #: textedit/textedit.cpp:186 msgctxt "TextEdit|" msgid "Edit Actions" msgstr "а—аМб–аНаИб‚аИ аДб–б—" #: textedit/textedit.cpp:188 msgctxt "TextEdit|" msgid "&File" msgstr "&аЄаАаЙаЛ" #: textedit/textedit.cpp:194 msgctxt "TextEdit|" msgid "&Open..." msgstr "&а’б–аДаКб€аИб‚аИт€І" #: textedit/textedit.cpp:203 msgctxt "TextEdit|" msgid "&Save locally before send" msgstr "а—&аБаЕб€аЕаГб‚аИ аЛаОаКаАаЛбŒаНаО аПаЕб€аЕаД аНаАаДбаИаЛаАаНаНбаМ" #: textedit/textedit.cpp:210 msgctxt "TextEdit|" msgid "Save locally &As..." msgstr "а—аБаЕб€аЕаГб‚аИ аЛаОаКаАаЛбŒаНаО &баКт€І" #: textedit/textedit.cpp:218 msgctxt "TextEdit|" msgid "&Print..." msgstr "ааА&аДб€бƒаКбƒаВаАб‚аИт€І" #: textedit/textedit.cpp:226 msgctxt "TextEdit|" msgid "Print Preview..." msgstr "аŸаЕб€аЕаГаЛбаД аДб€бƒаКбƒт€І" #: textedit/textedit.cpp:231 msgctxt "TextEdit|" msgid "&Export PDF..." msgstr "&а•аКбаПаОб€б‚бƒаВаАб‚аИ аДаО PDFт€І" #: textedit/textedit.cpp:244 msgctxt "TextEdit|" msgid "&Edit" msgstr "а—&аМб–аНаИ" #: textedit/textedit.cpp:249 msgctxt "TextEdit|" msgid "&Undo" msgstr "&а’аЕб€аНбƒб‚аИ" #: textedit/textedit.cpp:254 msgctxt "TextEdit|" msgid "&Redo" msgstr "&аŸаОаВб‚аОб€аИб‚аИ" #: textedit/textedit.cpp:261 msgctxt "TextEdit|" msgid "Cu&t" msgstr "а’аИб€б–аЗаА&б‚аИ" #: textedit/textedit.cpp:267 msgctxt "TextEdit|" msgid "&Copy" msgstr "&аšаОаПб–бŽаВаАб‚аИ" #: textedit/textedit.cpp:273 msgctxt "TextEdit|" msgid "&Paste" msgstr "&а’бб‚аАаВаИб‚аИ" #: textedit/textedit.cpp:283 msgctxt "TextEdit|" msgid "Insert link" msgstr "а’бб‚аАаВаИб‚аИ аПаОбаИаЛаАаНаНб" #: textedit/textedit.cpp:287 msgctxt "TextEdit|" msgid "Embed image" msgstr "а’аБбƒаДбƒаВаАб‚аИ аЗаОаБб€аАаЖаЕаНаНб" #: textedit/textedit.cpp:294 msgctxt "TextEdit|" msgid "F&ormat" msgstr "аЄ&аОб€аМаАб‚" #: textedit/textedit.cpp:298 msgctxt "TextEdit|" msgid "&Bold" msgstr "&а–аИб€аНаИаЙ" #: textedit/textedit.cpp:310 msgctxt "TextEdit|" msgid "&Italic" msgstr "&аšбƒб€баИаВ" #: textedit/textedit.cpp:322 msgctxt "TextEdit|" msgid "&Underline" msgstr "аŸ&б–аДаКб€аЕбаЛаЕаНаИаЙ" #: textedit/textedit.cpp:341 textedit/textedit.cpp:347 msgctxt "TextEdit|" msgid "&Left" msgstr "&а›б–аВаОб€бƒб‡" #: textedit/textedit.cpp:342 textedit/textedit.cpp:346 msgctxt "TextEdit|" msgid "C&enter" msgstr "а—аА &б†аЕаНб‚б€аОаМ" #: textedit/textedit.cpp:343 textedit/textedit.cpp:345 msgctxt "TextEdit|" msgid "&Right" msgstr "&аŸб€аАаВаОб€бƒб‡" #: textedit/textedit.cpp:349 msgctxt "TextEdit|" msgid "&Justify" msgstr "а—&аА аОаБаОаМаА аКб€аАбаМаИ" #: textedit/textedit.cpp:376 msgctxt "TextEdit|" msgid "&Color..." msgstr "&аšаОаЛб–б€т€І" #: textedit/textedit.cpp:383 msgctxt "TextEdit|" msgid "Standard" msgstr "аЁб‚аАаНаДаАб€б‚аНаИаЙ" #: textedit/textedit.cpp:384 msgctxt "TextEdit|" msgid "Bullet List (Disc)" msgstr "аЁаПаИбаОаК аЗ аПбƒаНаКб‚аАаМаИ (аКб€бƒаЖаЕб‡аКаИ)" #: textedit/textedit.cpp:385 msgctxt "TextEdit|" msgid "Bullet List (Circle)" msgstr "аЁаПаИбаОаК аЗ аПбƒаНаКб‚аАаМаИ (аКаОаЛаА)" #: textedit/textedit.cpp:386 msgctxt "TextEdit|" msgid "Bullet List (Square)" msgstr "аЁаПаИбаОаК аЗ аПбƒаНаКб‚аАаМаИ (аКаВаАаДб€аАб‚аИаКаИ)" #: textedit/textedit.cpp:387 msgctxt "TextEdit|" msgid "Ordered List (Decimal)" msgstr "а’аПаОб€баДаКаОаВаАаНаИаЙ баПаИбаОаК (аДаЕббб‚аКаОаВб– б‡аИбаЛаА)" #: textedit/textedit.cpp:388 msgctxt "TextEdit|" msgid "Ordered List (Alpha lower)" msgstr "а’аПаОб€баДаКаОаВаАаНаИаЙ баПаИбаОаК (аМаАаЛб– аЛб–б‚аЕб€аИ)" #: textedit/textedit.cpp:389 msgctxt "TextEdit|" msgid "Ordered List (Alpha upper)" msgstr "а’аПаОб€баДаКаОаВаАаНаИаЙ баПаИбаОаК (аВаЕаЛаИаКб– аЛб–б‚аЕб€аИ)" #: textedit/textedit.cpp:390 msgctxt "TextEdit|" msgid "Ordered List (Roman lower)" msgstr "а’аПаОб€баДаКаОаВаАаНаИаЙ баПаИбаОаК (аМаАаЛб– б€аИаМббŒаКб–)" #: textedit/textedit.cpp:391 msgctxt "TextEdit|" msgid "Ordered List (Roman upper)" msgstr "а’аПаОб€баДаКаОаВаАаНаИаЙ баПаИбаОаК (аВаЕаЛаИаКб– б€аИаМббŒаКб–)" #: textedit/textedit.cpp:442 msgctxt "TextEdit|" msgid "Application" msgstr "аŸб€аОаГб€аАаМаА" #: textedit/textedit.cpp:443 msgctxt "TextEdit|" msgid "" "The document has been modified.\n" "Do you want to save your changes?" msgstr "" "а”аО аДаОаКбƒаМаЕаНб‚аА аБбƒаЛаО аВаНаЕбаЕаНаО аЗаМб–аНаИ.\n" "аЅаОб‡аЕб‚аЕ аЗаБаЕб€аЕаГб‚аИ б†б– аЗаМб–аНаИ?" #: textedit/textedit.cpp:467 msgctxt "TextEdit|" msgid "Open File..." msgstr "а’б–аДаКб€аИб‚аИ б„аАаЙаЛт€І" #: textedit/textedit.cpp:468 msgctxt "TextEdit|" msgid "HTML-Files (*.htm *.html);;All Files (*)" msgstr "б„аАаЙаЛаИ HTML (*.htm *.html);;аВбб– б„аАаЙаЛаИ (*)" #: textedit/textedit.cpp:485 msgctxt "TextEdit|" msgid "Save as..." msgstr "а—аБаЕб€аЕаГб‚аИ баКт€І" #: textedit/textedit.cpp:486 msgctxt "TextEdit|" msgid "ODF files (*.odt);;HTML-Files (*.htm *.html);;All Files (*)" msgstr "б„аАаЙаЛаИ ODF (*.odt);;б„аАаЙаЛаИ HTML (*.htm *.html);;бƒбб– б„аАаЙаЛаИ (*)" #: textedit/textedit.cpp:501 msgctxt "TextEdit|" msgid "Print Document" msgstr "ааАаДб€бƒаКбƒаВаАб‚аИ аДаОаКбƒаМаЕаНб‚" #: textedit/textedit.cpp:559 msgctxt "TextEdit|" msgid "Open File" msgstr "а’б–аДаКб€аИб‚аИ б„аАаЙаЛ" #: textedit/textedit.cpp:561 msgctxt "TextEdit|" msgid "Files (*.*)" msgstr "б„аАаЙаЛаИ (*.*)" #: textedit/textedit.cpp:566 msgctxt "TextEdit|" msgid "Error" msgstr "аŸаОаМаИаЛаКаА" #: textedit/textedit.cpp:567 msgctxt "TextEdit|" msgid "Can't load image" msgstr "ааЕ аВаДаАаЛаОбб аЗаАаВаАаНб‚аАаЖаИб‚аИ аЗаОаБб€аАаЖаЕаНаНб" #: textedit/textedit.cpp:621 textedit/textedit.cpp:631 msgctxt "TextEdit|" msgid "File way too big" msgstr "аЄаАаЙаЛ б” аНаАаДб‚аО аВаЕаЛаИаКаИаМ" #: net/voicecallengine.cpp:525 msgctxt "VoiceCallEngine|" msgid "Accept" msgstr "аŸб€аИаЙаНбб‚аИ" #: net/voicecallengine.cpp:533 msgctxt "VoiceCallEngine|" msgid "Reject" msgstr "а’б–аДаМаОаВаИб‚аИ" #: net/voicecallengine.cpp:535 msgctxt "VoiceCallEngine|" msgid "Close" msgstr "а—аАаКб€аИб‚аИ" #: net/voicecallengine.cpp:551 msgctxt "VoiceCallEngine|" msgid "Actual network address (SHA1) of the peer operator" msgstr "аЁаПб€аАаВаЖаНб аАаДб€аЕбаА бƒ аМаЕб€аЕаЖб– (SHA1) аОаПаЕб€аАб‚аОб€аА аВбƒаЗаЛаА" #: net/voicecallengine.cpp:554 msgctxt "VoiceCallEngine|" msgid "Network address of the remote node" msgstr "ааДб€аЕбаА аВб–аДаДаАаЛаЕаНаОаГаО аВбƒаЗаЛаА бƒ аМаЕб€аЕаЖб–" #: net/voicecallengine.cpp:564 msgctxt "VoiceCallEngine|" msgid "Operator" msgstr "аžаПаЕб€аАб‚аОб€" #: net/voicecallengine.cpp:567 msgctxt "VoiceCallEngine|" msgid "Node address" msgstr "ааДб€аЕбаА аВбƒаЗаЛаА" #: net/voicecallengine.cpp:570 msgctxt "VoiceCallEngine|" msgid "Call status" msgstr "аЁб‚аАаН аЗаВт€™баЗаКбƒ" #: net/voicecallengine.cpp:573 msgctxt "VoiceCallEngine|" msgid "Controls" msgstr "аšаЕб€бƒаВаАаНаНб" #: net/voicecallengine.cpp:576 msgctxt "VoiceCallEngine|" msgid "Ending" msgstr "а—аАаВаЕб€бˆаЕаНаНб" #: net/voicecallengine.cpp:613 msgctxt "VoiceCallEngine|" msgid "Initializing" msgstr "а†аНб–б†б–аАаЛб–аЗаАб†б–б" #: net/voicecallengine.cpp:616 msgctxt "VoiceCallEngine|" msgid "Incoming" msgstr "а’б…б–аДаНб–" #: net/voicecallengine.cpp:619 msgctxt "VoiceCallEngine|" msgid "Open" msgstr "а’б–аДаКб€аИб‚аИ" #: net/voicecallengine.cpp:622 msgctxt "VoiceCallEngine|" msgid "Closing" msgstr "а—аАаКб€аИб‚б‚б" #: net/voicecallengine.cpp:625 msgctxt "VoiceCallEngine|" msgid "Closed" msgstr "а—аАаКб€аИб‚аО" #: net/voicecallengine.cpp:628 msgctxt "VoiceCallEngine|" msgid "Error" msgstr "аŸаОаМаИаЛаКаА" #: net/voicecallengine.cpp:631 msgctxt "VoiceCallEngine|" msgid "No call" msgstr "ааЕаМаАб” аВаИаКаЛаИаКбƒ" #: net/voicecallengine.cpp:834 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible" msgstr "а“аОаЛаОбаОаВаИаЙ аВаИаКаЛаИаК аНаЕаМаОаЖаЛаИаВаИаЙ" #: net/voicecallengine.cpp:840 msgctxt "VoiceCallEngine|" msgid "Audio call is possible" msgstr "а“аОаЛаОбаОаВаИаЙ аВаИаКаЛаИаК аМаОаЖаЛаИаВаИаЙ" #: net/voicecallengine.cpp:847 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator address unknown" msgstr "а“аОаЛаОбаОаВаИаЙ аВаИаКаЛаИаК аНаЕаМаОаЖаЛаИаВаИаЙ: аНаЕаВб–аДаОаМаА аАаДб€аЕбаА аОаПаЕб€аАб‚аОб€аА" #: net/voicecallengine.cpp:853 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator profile not found" msgstr "а“аОаЛаОбаОаВаИаЙ аВаИаКаЛаИаК аНаЕаМаОаЖаЛаИаВаИаЙ: аНаЕ аЗаНаАаЙаДаЕаНаО аПб€аОб„б–аЛбŽ аОаПаЕб€аАб‚аОб€аА" #: net/voicecallengine.cpp:856 msgctxt "VoiceCallEngine|" msgid "" "Audio call is not possible: operator has no node information in profile" msgstr "" "а“аОаЛаОбаОаВаИаЙ аВаИаКаЛаИаК аНаЕаМаОаЖаЛаИаВаИаЙ: аОаПаЕб€аАб‚аОб€аОаМ аНаЕ аНаАаДаАаНаО аДаАаНаИб… б‰аОаДаО аВбƒаЗаЛаА бƒ аПб€аОб„б–аЛб–" #: net/voicecallengine.cpp:875 #, qt-format msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operators IPv4 address %1 not connected" msgstr "а“аОаЛаОбаОаВаИаЙ аВаИаКаЛаИаК аНаЕаМаОаЖаЛаИаВаИаЙ: аАаДб€аЕббƒ IPv4 аОаПаЕб€аАб‚аОб€аА, %1, аНаЕ аЗт€™б”аДаНаАаНаО" #: net/voicecallengine.cpp:882 #, qt-format msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operators IPv6 address %1 not connected" msgstr "а“аОаЛаОбаОаВаИаЙ аВаИаКаЛаИаК аНаЕаМаОаЖаЛаИаВаИаЙ: аАаДб€аЕббƒ IPv6 аОаПаЕб€аАб‚аОб€аА, %1, аНаЕ аЗт€™б”аДаНаАаНаО" #: net/voicecallengine.cpp:893 msgctxt "VoiceCallEngine|" msgid "" "Audio call is not possible: local node has no IPv6 address, operator has " "only IPv6 addr" msgstr "" "а“аОаЛаОбаОаВаИаЙ аВаИаКаЛаИаК аНаЕаМаОаЖаЛаИаВаИаЙ: бƒ аЛаОаКаАаЛбŒаНаОаГаО аВбƒаЗаЛаА аНаЕаМаАб” аАаДб€аЕбаИ IPv6, аА бƒ " "аОаПаЕб€аАб‚аОб€аА б” аЛаИбˆаЕ аАаДб€аЕбаА IPv6" #: net/voicecallengine.cpp:895 msgctxt "VoiceCallEngine|" msgid "Audio call is not possible: operator does not publish network address" msgstr "а“аОаЛаОбаОаВаИаЙ аВаИаКаЛаИаК аНаЕаМаОаЖаЛаИаВаИаЙ: аОаПаЕб€аАб‚аОб€аОаМ аНаЕ аНаАаДаАаНаО аАаДб€аЕбаИ бƒ аМаЕб€аЕаЖб–" #: ui/aboutDialog.ui:26 msgctxt "aboutDialog|" msgid "About classified ads" msgstr "аŸб€аО classified ads" #: ui/aboutDialog.ui:100 msgctxt "aboutDialog|" msgid " Classified ads is a program for online communications" msgstr " Classified ads т€” аПб€аОаГб€аАаМаА аДаЛб аОаБаМб–аНбƒ аДаАаНаИаМаИ бƒ аМаЕб€аЕаЖб–" #: ui/aboutDialog.ui:163 msgctxt "aboutDialog|" msgid "" "

Classified ads is free software. You may use, copy and" " modify it if you follow the conditions given in GNU lesser general public " "license version 2.1.

Classified ads is copyright ТЉ Antti JУЄrvinen " "2013.

Main feature of the program is an "advertisement" - a" " piece of text belonging to selected classification. There are several pre-" "programmed classifications and operators are encouraged to invent new " "classifications for new purposes ; the selection boxes in classification-" "selection tab are editable. Other operators may then view the ads, publicly " "comment the ads, the operators and also send private messages to each " "others.

Another important feature of classified ads is that it is " "designed to be operated without any centralized server infrastructure - it " "is you and other operators whose computers store and transmit all the " "content visible inside classified ads. To get connected you need to know " "address of at least one existing computer (a node) so if your network connection dialog shows no " "connections, you may need to contact someone you know is using the software " "and ask for address of her node to make initial contact with the network. " "Once connected the software should maintain list of addresses of other " "nodes.

Due to its server-less design the whole system works best if " "you leave the program running always when you have your computer powered on " "; while processing other operators requests it will hog some computing " "resources and generate network traffic also when you are not actively using " "the program yourself - others are.

Operators concerned about privacy " "of the content should be aware of following items:

- Data storage " "implementation is variant of distributed" " hash table, practically meaning that content posted by you gets " "copied some more-or-less random nodes in the network.

- Any data item" " (ad, comment, binary file, private message etc.) is digitally signed. This " "makes it more difficult to try to pose as another operator.

- " "Operators are reliably identified only by the SHA1 hash of their generated " "encryption keys. SHA1 hash is displayed when viewing details of operator " "profiles. Other identifying information like nickname or city name are " "entered by operator himself and can be anything. The operator profile, as it" " is published to the network, is also signed with the encryption keys of the" " operator - if you identify an operator by her SHA1 hash, you have a " "mechanism for identifying if any content inside classified ads is posted by " "this operator or not. Classified ads internally checks for digital " "signatures, throwing away content that fails signature check and tries to " "provide SHA1 hash of the operator who posted the content.

- All " "classified ads are posted as plain text, no encryption is used. All public " "profiles are posted as plain text, no encryption is used. If profile is made" " private, it is encrypted to be readable only by selected other profiles. " "This applies also to binary files shared by operators private profiles and " "comments about private profiles after the profile was made private " "(previously plain-text comments or files don't get magically encrypted " "afterwards). Private messages are encrypted always to be readable only by " "recipient and sender. Attachments follow the privacy rules of the document, " "they're attached to.

- As is the case with all internet-" "communications, this small fact is true for classified ads too : once something gets posted online, there is no" " way to remove it from network.

- Data encryption " "implementation for content is OpenSSL, relying mostly on algorithms RSA-2048" " and AES-256.

- While connections between nodes are implemented using" " SSL, other nodes inside network do get to know what content is being " "transmitted in neighboring nodes. While there is no central point for easily" " collecting this information about particular classification or operator, " "operators still should expect no privacy regarding their doings online, " "although some effort has been been put into hiding contents of private messages and private profiles. " "

Programming was (mostly) done by Antti JУЄrvinen, artwork by Meeri " "JУЄrvinen.

This product includes software developed by the OpenSSL " "Project for use in the OpenSSL Toolkit " "(http://www.openssl.org/).

Happy " "advertising!


" msgstr "" "

Classified ads б” аВб–аЛбŒаНаИаМ аПб€аОаГб€аАаМаНаИаМ аЗаАаБаЕаЗаПаЕб‡аЕаНаНбаМ. а’аИ " "аМаОаЖаЕб‚аЕ аКаОб€аИбб‚бƒаВаАб‚аИбб аНаИаМ, аКаОаПб–бŽаВаАб‚аИ аЙаОаГаО б– аВаНаОбаИб‚аИ аДаО аНбŒаОаГаО аЗаМб–аНаИ, баКб‰аО " "аВаИаКаОаНбƒаВаАб‚аИаМаЕб‚аЕ аВаИаМаОаГаИ, аВаКаАаЗаАаНб– бƒ аЁаКаОб€аОб‡аЕаНб–аЙ аЗаАаГаАаЛбŒаНб–аЙ аГб€аОаМаАаДббŒаКб–аЙ аЛб–б†аЕаНаЗб–б— " "GNU аВаЕб€бб–б— 2.1 (LGPL 2.1).

ааВб‚аОб€ббŒаКб– аПб€аАаВаА аНаА Classified ads аНаАаЛаЕаЖаАб‚бŒ " "Antti JУЄrvinen, 2013.

аžбаНаОаВаНаОбŽ аМаОаЖаЛаИаВб–бб‚бŽ аПб€аОаГб€аАаМаИ б” б€аОаБаОб‚аА аЗ " "ТЋаОаГаОаЛаОбˆаЕаНаНбаМаИТЛ т€” б‚аЕаКбб‚аОаВаИаМаИ аПаОаВб–аДаОаМаЛаЕаНаНбаМаИ, баКб– аНаАаЛаЕаЖаАб‚бŒ аДаО аВаИаБб€аАаНаОаГаО " "баЕаГаМаЕаНб‚аА аКаЛаАбаИб„б–аКаАб†б–б—. аŸаЕб€аЕаДаБаАб‡аЕаНаО аДаЕаКб–аЛбŒаКаА аПаОаПаЕб€аЕаДаНбŒаО аВаИаЗаНаАб‡аЕаНаИб… " "аКаЛаАбаИб„б–аКаАб†б–аЙ. аžаПаЕб€аАб‚аОб€аИ аМаОаЖбƒб‚бŒ бб‚аВаОб€бŽаВаАб‚аИ аВаЛаАбаНб– аКаЛаАбаИб„б–аКаАб†б–б—: аПаОаЛб аВаИаБаОб€бƒ " "аНаА аВаКаЛаАаДб†б– аКаЛаАбаИб„б–аКаАб†б–б— аМаОаЖаНаА б€аЕаДаАаГбƒаВаАб‚аИ. а†аНбˆб– аОаПаЕб€аАб‚аОб€аИ аМаОаЖбƒб‚бŒ аПаЕб€аЕаГаЛбаДаАб‚аИ " "аОаГаОаЛаОбˆаЕаНаНб, аКаОаМаЕаНб‚бƒаВаАб‚аИ б—б…, аПб€аОб„б–аЛб– аОаПаЕб€аАб‚аОб€б–аВ б‚аА аНаАаДбаИаЛаАб‚аИ аОбаОаБаИбб‚б– " "аПаОаВб–аДаОаМаЛаЕаНаНб аОаДаНаЕ аОаДаНаОаМбƒ.

аЉаЕ аОаДаНб–б”бŽ аВаАаЖаЛаИаВаОбŽ аОбаОаБаЛаИаВб–бб‚бŽ classified " "ads б” б‚аЕ, б‰аО баИбб‚аЕаМбƒ б€аОаЗб€аОаБаЛаЕаНаО б‚аАаК, б‰аО аВаОаНаА аМаОаЖаЕ аПб€аАб†бŽаВаАб‚аИ аБаЕаЗ " "б†аЕаНб‚б€аАаЛб–аЗаОаВаАаНаОб— б–аНб„б€аАбб‚б€бƒаКб‚бƒб€аИ. а”аАаНб– аЗаБаЕб€б–аГаАбŽб‚бŒбб аНаА аВаАбˆаОаМбƒ аКаОаМаПт€™бŽб‚аЕб€б– б‚аА аНаА" " аКаОаМаПт€™бŽб‚аЕб€аАб… б–аНбˆаИб… аОаПаЕб€аАб‚аОб€б–аВ аМаЕб€аЕаЖб– classified ads, аА б‚аАаКаОаЖ аПаЕб€аЕаДаАбŽб‚бŒбб " "аЛаИбˆаЕ б†аИаМаИ аКаОаМаПт€™бŽб‚аЕб€аАаМаИ. аЉаОаБ аЗт€™б”аДаНаАб‚аИбб б–аЗ аМаЕб€аЕаЖаЕбŽ, аВаАаМ аПаОб‚б€б–аБаНаО аЗаНаАб‚аИ аАаДб€аЕббƒ" " аПб€аИаНаАаЙаМаНб– аОаДаНаОаГаО аНаАбаВаНаОаГаО бƒ аМаЕб€аЕаЖб– аКаОаМаПт€™бŽб‚аЕб€аА (аВбƒаЗаЛаА). аžб‚аЖаЕ, баКб‰аО бƒ аВаАбˆаОаМбƒ аДб–аАаЛаОаГаОаВаОаМбƒ аВб–аКаНб– " "аЗт€™б”аДаНаАаНаНб б–аЗ аМаЕб€аЕаЖаЕбŽ аНаЕ аБбƒаДаЕ аЗаАаПаИбб–аВ аКаОаНб‚аАаКб‚б–аВ, аВаАаМ аВаАб€б‚аО аЗаВт€™баЗаАб‚аИбб б–аЗ " "аКаИаМаОббŒ, б…б‚аО аВаЖаЕ аВаИаКаОб€аИбб‚аОаВбƒб” б†аЕ аПб€аОаГб€аАаМаНаЕ аЗаАаБаЕаЗаПаЕб‡аЕаНаНб, б– аПаОаПб€аОбаИб‚аИ аЙаОаГаО б‡аИ " "б—б— аНаАаДб–баЛаАб‚аИ аВаАаМ аАаДб€аЕббƒ аВбƒаЗаЛаА, б‰аОаБ бб‚аВаОб€аИб‚аИ аПаОб‡аАб‚аКаОаВаИаЙ аЗаАаПаИб аКаОаНб‚аАаКб‚бƒ бƒ " "аМаЕб€аЕаЖб–. аŸб–баЛб аЗт€™б”аДаНаАаНаНб аПб€аОаГб€аАаМаНаЕ аЗаАаБаЕаЗаПаЕб‡аЕаНаНб аМаАб” аПб–аДб‚б€аИаМбƒаВаАб‚аИ аАаКб‚бƒаАаЛбŒаНаИаЙ " "баПаИбаОаК аАаДб€аЕб б–аНбˆаИб… аВбƒаЗаЛб–аВ.

аЇаЕб€аЕаЗ аВб–аДббƒб‚аНб–бб‚бŒ бƒ аМаЕб€аЕаЖб– аЗаАаГаАаЛбŒаНаИб… " "баЕб€аВаЕб€б–аВ баИбб‚аЕаМаА аНаАаЙаКб€аАб‰аЕ аПб€аАб†бŽб”, баКб‰аО аКаЛб–б”аНб‚ббŒаКаА аПб€аОаГб€аАаМаА аПб€аАб†бŽб” бƒаВаЕббŒ б‡аАб," " аДаОаКаИ аКаОаМаПт€™бŽб‚аЕб€ бƒаВб–аМаКаНаЕаНаО. аŸб€аОаГб€аАаМаА баПаОаЖаИаВаАб” б‡аАбб‚аИаНбƒ аОаБб‡аИбаЛбŽаВаАаЛбŒаНаИб… б€аЕббƒб€бб–аВ" " аНаА аОаБб€аОаБаКбƒ аЗаАаПаИб‚б–аВ аОаПаЕб€аАб‚аОб€б–аВ б‚аА аНаАаДбаИаЛаАаНаНб аДаАаНаИб… аМаЕб€аЕаЖаЕбŽ, аНаАаВб–б‚бŒ аКаОаЛаИ аВаИ " "аНаЕ аПб€аАб†бŽб”б‚аЕ аЗ аНаЕбŽ аБаЕаЗаПаОбаЕб€аЕаДаНбŒаО, т€” аЗ аНаЕбŽ аПб€аАб†бŽбŽб‚бŒ б–аНбˆб– аКаОб€аИбб‚бƒаВаАб‡б–. " "

аžаПаЕб€аАб‚аОб€аИ, баКб– аПаЕб€аЕаЙаМаАбŽб‚бŒбб аКаОаНб„б–аДаЕаНб†б–аЙаНб–бб‚бŽ аДаАаНаИб…, баКб– аНаАаДаАбŽб‚бŒбб бƒ " "аМаЕб€аЕаЖб–, аМаАбŽб‚бŒ аЗаНаАб‚аИ аПб€аО б‚аАаКаЕ:

- аЁб…аОаВаИб‰аЕ аДаАаНаИб… б€аЕаАаЛб–аЗаОаВаАаНаО аНаА аОбаНаОаВб– " "б€аОаЗаПаОаДб–аЛаЕаНаОб— б‚аАаБаЛаИб†б– б…аЕбˆ-ббƒаМ, б‰аО " "аОаЗаНаАб‡аАб”, б‰аО аОаПб€аИаЛбŽаДаНаЕаНб– аВаАаМаИ аДаАаНб– аКаОаПб–бŽбŽб‚бŒбб аНаА аБб–аЛбŒбˆ-аМаЕаНбˆ аВаИаПаАаДаКаОаВб– аВбƒаЗаЛаИ бƒ" " аМаЕб€аЕаЖб–.

- аЃбб– аЗаАаПаИбаИ аДаАаНаИб… (аОаГаОаЛаОбˆаЕаНаНб, аКаОаМаЕаНб‚аАб€б–, аБб–аНаАб€аНб– б„аАаЙаЛаИ, " "аОбаОаБаИбб‚б– аПаОаВб–аДаОаМаЛаЕаНаНб б‚аОб‰аО) аМаАбŽб‚бŒ б†аИб„б€аОаВаИаЙ аПб–аДаПаИб. аІаЕ аЗаАаПаОаБб–аЖаНаИаК аВб–аД " "аМаОаЖаЛаИаВаОбб‚б– аПб–аДаМб–аНаИ аАаВб‚аОб€бб‚аВаА аОаПаЕб€аАб‚аОб€аА.

- а†аДаЕаНб‚аИб„б–аКаАб†б–б аОаПаЕб€аАб‚аОб€б–аВ " "аВб–аДаБбƒаВаАб”б‚бŒбб аЛаИбˆаЕ аЗаА б…аЕбˆ-ббƒаМаАаМаИ SHA1 бб‚аВаОб€аЕаНаИб… аНаИаМаИ аКаЛбŽб‡б–аВ бˆаИб„б€бƒаВаАаНаНб. SHA1 " "аМаОаЖаНаА аПаЕб€аЕаГаЛбаНбƒб‚аИ бƒ аПаОаДб€аОаБаИб†бб… аПб€аОб„б–аЛбŽ аОаПаЕб€аАб‚аОб€аА. а†аНбˆб– б–аДаЕаНб‚аИб„б–аКаАб†б–аЙаНб– аДаАаНб–," " аЗаОаКб€аЕаМаА аПбаЕаВаДаОаНб–аМ б‡аИ аНаАаЗаВаА аМб–бб‚аА аПб€аОаЖаИаВаАаНаНб, аВаВаОаДбб‚бŒбб баАаМаИаМ аОаПаЕб€аАб‚аОб€аОаМ б– " "аМаОаЖбƒб‚бŒ аБбƒб‚аИ аНаЕаПб€аАаВаДаИаВаИаМаИ. аŸб€аОб„б–аЛбŒ аОаПаЕб€аАб‚аОб€аА, бƒ б‚аОаМбƒ аВаИаГаЛбаДб–, бƒ баКаОаМбƒ аЙаОаГаО " "аОаПб€аИаЛбŽаДаНбŽбŽб‚бŒ бƒ аМаЕб€аЕаЖб–, б‚аАаКаОаЖ аПб–аДаПаИббƒб”б‚бŒбб аКаЛбŽб‡аАаМаИ бˆаИб„б€бƒаВаАаНаНб аОаПаЕб€аАб‚аОб€аА. аЏаКб‰аО" " аВаИ б–аДаЕаНб‚аИб„б–аКбƒб”б‚аЕ аОаПаЕб€аАб‚аОб€аА аЗаА б…аЕбˆ-ббƒаМаОбŽ SHA1, аВаИ аМаОаЖаЕб‚аЕ аВаИаЗаНаАб‡аИб‚аИ, б‡аИ аБбƒаЛаИ " "аПаЕаВаНб– аДаАаНб– бƒ classified ads аНаАаДб–баЛаАаНб– б†аИаМ аОаПаЕб€аАб‚аОб€аОаМ. Classified ads аНаА " "аВаНбƒб‚б€б–бˆаНбŒаОаМбƒ б€б–аВаНб– аВаИаКаОаНбƒб” аПаЕб€аЕаВб–б€аКбƒ б†аИб„б€аОаВаИб… аПб–аДаПаИбб–аВ, аВб–аДаКаИаДаАбŽб‡аИ аДаАаНб–, баКб–" " аНаЕ аПб€аОаЙбˆаЛаИ аПаЕб€аЕаВб–б€аКаИ, б– аНаАаМаАаГаАб”б‚бŒбб аНаАаДаАаВаАб‚аИ б…аЕбˆ-ббƒаМаИ SHA1 аОаПаЕб€аАб‚аОб€б–аВ, баКб– " "аНаАаДбаИаЛаАаЛаИ аДаАаНб–.

- аЃбб– аДаОаПаИбаИ classified ads аПаОбˆаИб€бŽбŽб‚бŒбб бƒ б„аОб€аМаАб‚б– " "аЗаВаИб‡аАаЙаНаОаГаО б‚аЕаКбб‚бƒ, бˆаИб„б€бƒаВаАаНаНб аНаЕ аВаИаКаОб€аИбб‚аОаВбƒб”б‚бŒбб. аЃбб– аВб–аДаКб€аИб‚б– аПб€аОб„б–аЛб– " "аПаОбˆаИб€бŽбŽб‚бŒбб бƒ б„аОб€аМаАб‚б– аЗаВаИб‡аАаЙаНаОаГаО б‚аЕаКбб‚бƒ, аБаЕаЗ бˆаИб„б€бƒаВаАаНаНб. аЏаКб‰аО аПб€аОб„б–аЛбŒ " "аПаЕб€аЕб‚аВаОб€аЕаНаО аНаА аКаОаНб„б–аДаЕаНб†б–аЙаНаИаЙ (аОбаОаБаИбб‚аИаЙ), аЙаОаГаО аЗаАбˆаИб„б€аОаВаАаНаИаЙ аВаМб–бб‚ аЗаМаОаЖбƒб‚бŒ " "б‡аИб‚аАб‚аИ аЛаИбˆаЕ аКаОб€аИбб‚бƒаВаАб‡б– аВаИаБб€аАаНаИб… б–аНбˆаИб… аПб€аОб„б–аЛб–аВ. аІаЕ бб‚аОббƒб”б‚бŒбб б‚аАаКаОаЖ " "аБб–аНаАб€аНаИб… б„аАаЙаЛб–аВ, баКб– аПаОбˆаИб€бŽбŽб‚бŒбб аЗаА аДаОаПаОаМаОаГаОбŽ аКаОаНб„б–аДаЕаНб†б–аЙаНаИб… аПб€аОб„б–аЛб–аВ " "аОаПаЕб€аАб‚аОб€б–аВ, б‚аА аКаОаМаЕаНб‚аАб€б–аВ б‰аОаДаО аКаОаНб„б–аДаЕаНб†б–аЙаНаИб… аПб€аОб„б–аЛб–аВ аПб–баЛб аПаЕб€аЕб‚аВаОб€аЕаНаНб б—б…" " аНаА аКаОаНб„б–аДаЕаНб†б–аЙаНб– (аПаОаПаЕб€аЕаДаНб– аКаОаМаЕаНб‚аАб€б– бƒ б„аОб€аМаАб‚б– аЗаВаИб‡аАаЙаНаОаГаО б‚аЕаКбб‚бƒ б‚аА б„аАаЙаЛаИ " "аНаЕ аПаЕб€аЕб‚аВаОб€бŽаВаАб‚аИаМбƒб‚бŒбб бƒ аЗаАбˆаИб„б€аОаВаАаНб– аАаВб‚аОаМаАб‚аИб‡аНаО). аžбаОаБаИбб‚б– аПаОаВб–аДаОаМаЛаЕаНаНб " "аЗаАаВаЖаДаИ бˆаИб„б€бƒбŽб‚бŒбб б‚аАаК, б‰аОаБ аПб€аОб‡аИб‚аАб‚аИ б—б… аМаОаГаЛаИ аЛаИбˆаЕ аОб‚б€аИаМбƒаВаАб‡ б– аВб–аДаПб€аАаВаНаИаК. " "а”аОаЛбƒб‡аЕаНаНб аМаАбŽб‚бŒ б‚аОаЙ баАаМаИаЙ б€б–аВаЕаНбŒ аЗаАб…аИбб‚бƒ, б‰аО б– аДаОаКбƒаМаЕаНб‚, аДаО баКаОаГаО б—б… " "аДаОаЛбƒб‡аЕаНаО.

- аЏаК б– бƒ аВаИаПаАаДаКбƒ аБбƒаДбŒ-баКаОаГаО баПб–аЛаКбƒаВаАаНаНб бƒ б–аНб‚аЕб€аНаЕб‚б–, б†аЕаЙ " "аНаЕаВаЕаЛаИб‡аКаИаЙ б„аАаКб‚ баПб€аАаВаДаЖбƒб”б‚бŒбб б– аДаЛб classified ads: б‰аОаЙаНаО б‰аОббŒ аБбƒаДаЕ аОаПб€аИаЛбŽаДаНаЕаНаО бƒ аМаЕб€аЕаЖб–, аНаЕаМаАб” баПаОбаОаБбƒ аПаОаВаНб–бб‚бŽ" " аВаИаЛбƒб‡аИб‚аИ аЙаОаГаО аЗ б†б–б”б— аМаЕб€аЕаЖб–.

- а”аЛб бˆаИб„б€бƒаВаАаНаНб аДаАаНаИб… " "аВаИаКаОб€аИбб‚аАаНаО OpenSSL, аДаЕ аВаИаКаОб€аИбб‚аОаВбƒбŽб‚бŒбб аПаЕб€аЕаВаАаЖаНаО аАаЛаГаОб€аИб‚аМаИ RSA-2048 б– " "AES-256.

- аЅаОб‡аА аЗт€™б”аДаНаАаНаНб аМб–аЖ аВбƒаЗаЛаАаМаИ б€аЕаАаЛб–аЗаОаВаАаНаО аЗаА аДаОаПаОаМаОаГаОбŽ SSL, " "б–аНбˆб– аВбƒаЗаЛаИ бƒ аМаЕб€аЕаЖб– аМаАбŽб‚бŒ аОб‚б€аИаМбƒаВаАб‚аИ аВб–аДаОаМаОбб‚б– б‰аОаДаО аПаЕб€аЕаДаАаВаАаНаНб аДаАаНаИб… бƒ " "ббƒбб–аДаНб–б… аВбƒаЗаЛаАб…. аЅаОб‡аА бƒ аМаЕб€аЕаЖб– аНаЕаМаАб” б†аЕаНб‚б€аАаЛбŒаНаОаГаО аПбƒаНаКб‚бƒ аДаЛб баПб€аОб‰аЕаНаНб " "аЗаБаИб€аАаНаНб аДаАаНаИб… б‰аОаДаО аПаЕаВаНаОб— аКаЛаАбаИб„б–аКаАб†б–б— аАаБаО аОаПаЕб€аАб‚аОб€аА, аОаПаЕб€аАб‚аОб€аАаМ аНаЕ аВаАб€б‚аО " "аПаЕб€аЕаОб†б–аНбŽаВаАб‚аИ аКаОаНб„б–аДаЕаНб†б–аЙаНб–бб‚бŒ баВаОб—б… аДб–аЙ бƒ аМаЕб€аЕаЖб–, б…аОб‡аА б€аОаЗб€аОаБаНаИаКаАаМаИ б– аВаЖаИб‚аО" " аДаЕбаКаИб… аЗаАб…аОаДб–аВ б‰аОаДаО аПб€аИб…аОаВбƒаВаАаНаНб аВаМб–бб‚бƒ аОбаОаБаИбб‚аИб… аПаОаВб–аДаОаМаЛаЕаНбŒ б‚аА аКаОаНб„б–аДаЕаНб†б–аЙаНаИб… " "аПб€аОб„б–аЛб–аВ.

аžбаНаОаВаНбƒ б€аОаБаОб‚бƒ аЗб– бб‚аВаОб€аЕаНаНб аПб€аОаГб€аАаМаИ аБбƒаЛаО аВаИаКаОаНаАаНаО Antti " "JУЄrvinen, б…бƒаДаОаЖаНб” аОб„аОб€аМаЛаЕаНаНб бб‚аВаОб€аЕаНаО Meeri JУЄrvinen.

аІаЕаЙ аПб€аОаДбƒаКб‚ " "аМб–бб‚аИб‚бŒ аКаОаД аПб€аОаГб€аАаМаНаОаГаО аЗаАаБаЕаЗаПаЕб‡аЕаНаНб, б€аОаЗб€аОаБаЛаЕаНаИаЙ бƒ аМаЕаЖаАб… аПб€аОаЕаКб‚бƒ OpenSSL " "аДаЛб аВаИаКаОб€аИбб‚аАаНаНб бƒ аНаАаБаОб€б– б–аНбб‚б€бƒаМаЕаНб‚б–аВ OpenSSL " "(http://www.openssl.org/).

аŸб€аИб”аМаНаОаГаО аОаБаМб–аНбƒ " "аОаГаОаЛаОбˆаЕаНаНбаМаИ!


" #: ui/attachmentListDialog.ui:26 msgctxt "attachmentListDialog|" msgid "List of attached files" msgstr "аЁаПаИбаОаК аДаОаЛбƒб‡аЕаНаИб… б„аАаЙаЛб–аВ" #: ui/callStatusDialog.ui:26 msgctxt "callStatusDialog|" msgid "Call status" msgstr "аЁб‚аАаН аЗаВт€™баЗаКбƒ" #: ui/callStatusDialog.ui:49 msgctxt "callStatusDialog|" msgid "Input level" msgstr "а’б…б–аДаНаИаЙ б€б–аВаЕаНбŒ" #: ui/callStatusDialog.ui:65 msgctxt "callStatusDialog|" msgid "Audio calls" msgstr "а—аВбƒаКаОаВб– аВаИаКаЛаИаКаИ" #: ui/callStatusDialog.ui:90 msgctxt "callStatusDialog|" msgid "Output level" msgstr "а б–аВаЕаНбŒ аВаИаВаЕаДаЕаНаНб" #: ui/editContact.ui:26 msgctxt "editContactDialog|" msgid "Edit a contact" msgstr "а аЕаДаАаГбƒаВаАб‚аИ аЗаАаПаИб аКаОаНб‚аАаКб‚бƒ" #: ui/editContact.ui:39 msgctxt "editContactDialog|" msgid "Address (SHA1) of contact" msgstr "ааДб€аЕбаА (SHA1) аКаОаНб‚аАаКб‚бƒ" #: ui/editContact.ui:53 msgctxt "editContactDialog|" msgid "Local nickname" msgstr "а›аОаКаАаЛбŒаНаИаЙ аПбаЕаВаДаОаНб–аМ" #: ui/editContact.ui:65 msgctxt "editContactDialog|" msgid "" "

Settings some trusted is public information to readers" " of your profile

" msgstr "" "

а’аИаЗаНаАб‡аЕаНаНб аПб€аОб„б–аЛб–аВ баК аДаОаВб–б€аЕаНаИб… б” аВб–аДаКб€аИб‚аОбŽ " "б–аНб„аОб€аМаАб†б–б”бŽ аДаЛб б‡аИб‚аАб‡б–аВ аВаАбˆаОаГаО аПб€аОб„б–аЛбŽ

" #: ui/editContact.ui:68 msgctxt "editContactDialog|" msgid "This contact is to be publicly trusted in transactions" msgstr "аІбŒаОаМбƒ аКаОаНб‚аАаКб‚бƒ аВаИ аВб–аДаКб€аИб‚аО аДаОаВб–б€бб‚аИаМаЕб‚аЕ бƒ аПаЕб€аЕаКаАаЗаАб…" #: frontWidget.ui:14 msgctxt "frontWidget|" msgid "Form" msgstr "аЄаОб€аМаА" #: frontWidget.ui:39 msgctxt "frontWidget|" msgid "Classified ads" msgstr "Classified ads" #: frontWidget.ui:67 msgctxt "frontWidget|" msgid "Search for classified ads about" msgstr "аЈбƒаКаАб‚аИ classified ads б‰аОаДаО" #: frontWidget.ui:74 msgctxt "frontWidget|" msgid "Perform" msgstr "а’аИаКаОаНаАб‚аИ" #: frontWidget.ui:97 msgctxt "frontWidget|" msgid "of" msgstr "аЗ" #: frontWidget.ui:113 msgctxt "frontWidget|" msgid "in" msgstr "бƒ" #: frontWidget.ui:123 msgctxt "frontWidget|" msgid "Search" msgstr "аŸаОбˆбƒаК" #: frontWidget.ui:161 msgctxt "frontWidget|" msgid "My profile" msgstr "аœб–аЙ аПб€аОб„б–аЛбŒ" #: frontWidget.ui:177 frontWidget.ui:937 msgctxt "frontWidget|" msgid "Profile address" msgstr "ааДб€аЕбаА аПб€аОб„б–аЛбŽ" #: frontWidget.ui:208 frontWidget.ui:643 msgctxt "frontWidget|" msgid "Nickname" msgstr "аŸбаЕаВаДаОаНб–аМ" #: frontWidget.ui:225 frontWidget.ui:669 msgctxt "frontWidget|" msgid "Greeting text" msgstr "аЂаЕаКбб‚ аВб–б‚аАаНаНб" #: frontWidget.ui:232 msgctxt "frontWidget|" msgid "For the rest of the world. " msgstr "а”аЛб б€аЕбˆб‚аИ баВб–б‚бƒ. " #: frontWidget.ui:239 frontWidget.ui:695 msgctxt "frontWidget|" msgid "First name" msgstr "а†аМ'б" #: frontWidget.ui:253 frontWidget.ui:715 msgctxt "frontWidget|" msgid "Family name" msgstr "аŸб€б–аЗаВаИб‰аЕ" #: frontWidget.ui:263 msgctxt "frontWidget|" msgid "City/country" msgstr "аœб–бб‚аО/аšб€аАб—аНаА" #: frontWidget.ui:273 msgctxt "frontWidget|" msgid "BTC address" msgstr "ааДб€аЕбаА BTC" #: frontWidget.ui:280 msgctxt "frontWidget|" msgid "If you wish to receive payments via BTC, include your BTC address too." msgstr "" "аЏаКб‰аО аВаИ б…аОб‡аЕб‚аЕ аОб‚б€аИаМбƒаВаАб‚аИ аГб€аОбˆб– аЗаА аДаОаПаОаМаОаГаОбŽ BTC, аВаКаАаЖб–б‚бŒ б‚аАаКаОаЖ аВаАбˆбƒ аАаДб€аЕббƒ " "BTC." #: frontWidget.ui:287 frontWidget.ui:799 msgctxt "frontWidget|" msgid "State of the world" msgstr "аšб€аАб—аНаА баВб–б‚бƒ" #: frontWidget.ui:294 msgctxt "frontWidget|" msgid "Longer explanation about state of the world" msgstr "а аОаЗбˆаИб€аЕаНаЕ аПаОббаНаЕаНаНб б‰аОаДаО аЗаАаГаАаЛбŒаНаОаГаО бб‚аАаНбƒ" #: frontWidget.ui:301 msgctxt "frontWidget|" msgid "Profile is private" msgstr "аŸб€аОб„б–аЛбŒ б” аКаОаНб„б–аДаЕаНб†б–аЙаНаИаМ" #: frontWidget.ui:308 msgctxt "frontWidget|" msgid "Readers of profile" msgstr "аЇаИб‚аАб‡б– аПб€аОб„б–аЛбŽ" #: frontWidget.ui:315 msgctxt "frontWidget|" msgid "None of the fields is mandatory" msgstr "а—аАаПаОаВаНаЕаНаНб аЖаОаДаНаОаГаО аЗ б†аИб… аПаОаЛб–аВ аНаЕ б” аОаБаОаВт€™баЗаКаОаВаИаМ" #: frontWidget.ui:322 msgctxt "frontWidget|" msgid "Time of last update" msgstr "аЇаАб аОбб‚аАаНаНбŒаОаГаО аОаНаОаВаЛаЕаНаНб" #: frontWidget.ui:342 msgctxt "frontWidget|" msgid "Publish" msgstr "аžаПб€аИаЛбŽаДаНаИб‚аИ" #: frontWidget.ui:355 msgctxt "frontWidget|" msgid "Revert changes" msgstr "аЁаКаАббƒаВаАб‚аИ аЗаМб–аНаИ" #: frontWidget.ui:369 msgctxt "frontWidget|" msgid "Details of operator profile:" msgstr "аŸаОаДб€аОаБаИб†б– аПб€аОб„б–аЛбŽ аОаПаЕб€аАб‚аОб€аА:" #: frontWidget.ui:401 msgctxt "frontWidget|" msgid "" "\n" "\n" "Click \n" "to \n" "Add\n" "Image" msgstr "" "\n" "\n" "ааАб‚аИбаНб–б‚бŒ, \n" "б‰аОаБ \n" "аДаОаДаАб‚аИ\n" "аЗаОаБб€аАаЖаЕаНаНб" #: frontWidget.ui:425 frontWidget.ui:845 msgctxt "frontWidget|" msgid "Shared files" msgstr "аЁаПб–аЛбŒаНб– б„аАаЙаЛаИ" #: frontWidget.ui:461 frontWidget.ui:897 msgctxt "frontWidget|" msgid "Latest comments" msgstr "аžбб‚аАаНаНб– аКаОаМаЕаНб‚аАб€б–" #: frontWidget.ui:504 msgctxt "frontWidget|" msgid "Contacts" msgstr "аšаОаНб‚аАаКб‚аИ" #: frontWidget.ui:536 msgctxt "frontWidget|" msgid "Add contact" msgstr "а”аОаДаАб‚аИ аКаОаНб‚аАаКб‚" #: frontWidget.ui:543 msgctxt "frontWidget|" msgid "Remove contact" msgstr "а’аИаЛбƒб‡аЕаНаНб аКаОаНб‚аАаКб‚бƒ" #: frontWidget.ui:550 msgctxt "frontWidget|" msgid "View profile" msgstr "аŸаЕб€аЕаГаЛбаНбƒб‚аИ аПб€аОб„б–аЛбŒ" #: frontWidget.ui:557 msgctxt "frontWidget|" msgid "Send message" msgstr "ааАаДб–баЛаАб‚аИ аПаОаВб–аДаОаМаЛаЕаНаНб" #: frontWidget.ui:569 msgctxt "frontWidget|" msgid "Private messages" msgstr "аžбаОаБаИбб‚б– аПаОаВб–аДаОаМаЛаЕаНаНб" #: frontWidget.ui:624 msgctxt "frontWidget|" msgid "Profile details" msgstr "аŸаОаДб€аОаБаИб†б– аПб€аОб„б–аЛбŽ" #: frontWidget.ui:741 msgctxt "frontWidget|" msgid "City/Country" msgstr "аœб–бб‚аО/аšб€аАб—аНаА" #: frontWidget.ui:767 msgctxt "frontWidget|" msgid "BTC Addr" msgstr "ааДб€аЕбаА BTC" #: frontWidget.ui:829 msgctxt "frontWidget|" msgid "" "




No

Image

Inserted

" msgstr "" "




а—аОаБб€аАаЖаЕаНаНб

аНаЕ

аВбб‚аАаВаЛаЕаНаО

" #: frontWidget.ui:874 msgctxt "frontWidget|" msgid "Send message to operator" msgstr "ааАаДб–баЛаАб‚аИ аОаПаЕб€аАб‚аОб€бƒ аПаОаВб–аДаОаМаЛаЕаНаНб" #: frontWidget.ui:879 msgctxt "frontWidget|" msgid "Audio call" msgstr "а“аОаЛаОбаОаВаИаЙ аВаИаКаЛаИаК" #: frontWidget.ui:884 msgctxt "frontWidget|" msgid "View readers" msgstr "аŸаЕб€аЕаГаЛбаНбƒб‚аИ б‡аИб‚аАб‡б–аВ" #: frontWidget.ui:932 msgctxt "frontWidget|" msgid "Comment" msgstr "аšаОаМаЕаНб‚аАб€" #: frontWidget.ui:964 msgctxt "frontWidget|" msgid "Add to contacts" msgstr "а”аОаДаАб‚аИ аДаО аКаОаНб‚аАаКб‚б–аВ" #: ui/insertLink.ui:26 msgctxt "insertLinkDialog|" msgid "Insert link" msgstr "а’бб‚аАаВаИб‚аИ аПаОбаИаЛаАаНаНб" #: ui/insertLink.ui:39 msgctxt "insertLinkDialog|" msgid "URL" msgstr "ааДб€аЕбаА" #: ui/insertLink.ui:112 msgctxt "insertLinkDialog|" msgid "Link label in text" msgstr "аŸаОаВт€™баЗаАб‚аИ аМб–б‚аКбƒ бƒ б‚аЕаКбб‚б–" #: ui/manualConnectionDialog.ui:26 msgctxt "manualConnectionDialog|" msgid "Manually add node to connection queue" msgstr "а’б€бƒб‡аНбƒ аДаОаДаАб‚аИ аВбƒаЗаОаЛ аДаО б‡аЕб€аГаИ аЗт€™б”аДаНаАаНбŒ" #: ui/manualConnectionDialog.ui:48 msgctxt "manualConnectionDialog|" msgid "Remote node listen port" msgstr "аŸаОб€б‚ аОб‡б–аКбƒаВаАаНаНб аВб–аДаДаАаЛаЕаНаОаГаО аВбƒаЗаЛаА" #: ui/manualConnectionDialog.ui:78 msgctxt "manualConnectionDialog|" msgid "Remote node network address" msgstr "ааДб€аЕбаА аВб–аДаДаАаЛаЕаНаОаГаО аВбƒаЗаЛаА бƒ аМаЕб€аЕаЖб–" #: ui/manualConnectionDialog.ui:91 msgctxt "manualConnectionDialog|" msgid "IPv4, IPv6 or DNS name" msgstr "IPv4, IPv6 аАаБаО аНаАаЗаВаА бƒ DNS" #: ui/metadataQuery.ui:26 msgctxt "metadataQuery|" msgid "File information" msgstr "а’б–аДаОаМаОбб‚б– б‰аОаДаО б„аАаЙаЛаА" #: ui/metadataQuery.ui:60 msgctxt "metadataQuery|" msgid "Name of the file:" msgstr "ааАаЗаВаА б„аАаЙаЛаА:" #: ui/metadataQuery.ui:81 msgctxt "metadataQuery|" msgid "Owner of file (name or SHA1 if CA operator):" msgstr "а’аЛаАбаНаИаЙ б„аАаЙаЛаА (б–аМт€™б аАаБаО SHA1, баКб‰аО аОаПаЕб€аАб‚аОб€ CA):" #: ui/metadataQuery.ui:111 msgctxt "metadataQuery|" msgid "License of use:" msgstr "а›б–б†аЕаНаЗбƒаВаАаНаНб:" #: ui/metadataQuery.ui:122 msgctxt "metadataQuery|" msgid "Public domain" msgstr "а’аЛаАбаНб–бб‚бŒ баПб–аЛбŒаНаОб‚аИ" #: ui/metadataQuery.ui:127 msgctxt "metadataQuery|" msgid "GPL" msgstr "GPL" #: ui/metadataQuery.ui:132 msgctxt "metadataQuery|" msgid "LGPL" msgstr "LGPL" #: ui/metadataQuery.ui:137 msgctxt "metadataQuery|" msgid "BSD" msgstr "BSD" #: ui/metadataQuery.ui:142 msgctxt "metadataQuery|" msgid "CC-BY" msgstr "CC-BY" #: ui/metadataQuery.ui:147 msgctxt "metadataQuery|" msgid "CC-BY-SA" msgstr "CC-BY-SA" #: ui/metadataQuery.ui:152 msgctxt "metadataQuery|" msgid "CC-BY-ND" msgstr "CC-BY-ND" #: ui/metadataQuery.ui:157 msgctxt "metadataQuery|" msgid "CC-BY-NC" msgstr "CC-BY-NC" #: ui/metadataQuery.ui:162 msgctxt "metadataQuery|" msgid "CC-BY-NC-SA" msgstr "CC-BY-NC-SA" #: ui/metadataQuery.ui:167 msgctxt "metadataQuery|" msgid "CC-BY-NC-ND" msgstr "CC-BY-NC-ND" #: ui/metadataQuery.ui:182 msgctxt "metadataQuery|" msgid "Mime-type:" msgstr "аЂаИаП MIME:" #: ui/metadataQuery.ui:199 msgctxt "metadataQuery|" msgid "Description of file:" msgstr "аžаПаИб б„аАаЙаЛаА:" #: ui/metadataQuery.ui:218 msgctxt "metadataQuery|" msgid "Enter information regarding file before publish:" msgstr "а’аКаАаЖб–б‚бŒ аДаАаНб– б‰аОаДаО б„аАаЙаЛаА аПаЕб€аЕаД аОаПб€аИаЛбŽаДаНаЕаНаНбаМ:" #: ui/newClassifiedAd.ui:26 msgctxt "newCaDialog|" msgid "Post a new classified ad" msgstr "аЁб‚аВаОб€аИб‚аИ аДаОаПаИб classified ad" #: ui/newClassifiedAd.ui:47 msgctxt "newCaDialog|" msgid "About" msgstr "аŸб€аО аПб€аОаГб€аАаМбƒ" #: ui/newClassifiedAd.ui:65 msgctxt "newCaDialog|" msgid "of" msgstr "аЗ" #: ui/newClassifiedAd.ui:81 msgctxt "newCaDialog|" msgid "in" msgstr "бƒ" #: ui/newClassifiedAd.ui:95 msgctxt "newCaDialog|" msgid "Subject" msgstr "аЂаЕаМаА" #: ui/newClassifiedAd.ui:129 msgctxt "newCaDialog|" msgid "Attachment: " msgstr "а”аОаЛбƒб‡аЕаНаНб: " #: ui/newClassifiedAd.ui:149 msgctxt "newCaDialog|" msgid "Add" msgstr "а”аОаДаАб‚аИ" #: ui/newPrivMsg.ui:26 msgctxt "newPrivMsgDialog|" msgid "Send a private message" msgstr "ааАаДб–баЛаАб‚аИ аОбаОаБаИбб‚аЕ аПаОаВб–аДаОаМаЛаЕаНаНб" #: ui/newPrivMsg.ui:39 msgctxt "newPrivMsgDialog|" msgid "Subject" msgstr "аЂаЕаМаА" #: ui/newPrivMsg.ui:53 msgctxt "newPrivMsgDialog|" msgid "Recipient" msgstr "аžб‚б€аИаМбƒаВаАб‡" #: ui/newPrivMsg.ui:83 msgctxt "newPrivMsgDialog|" msgid "Attachments: " msgstr "а”аОаЛбƒб‡аЕаНаНб: " #: ui/newPrivMsg.ui:103 msgctxt "newPrivMsgDialog|" msgid "Attach" msgstr "а”аОаЛбƒб‡аИб‚аИ" #: ui/newProfileComment.ui:26 msgctxt "newProfileCommentDialog|" msgid "Comment a operators profile" msgstr "аšаОаМаЕаНб‚бƒаВаАб‚аИ аПб€аОб„б–аЛбŒ аОаПаЕб€аАб‚аОб€аА" #: ui/newProfileComment.ui:39 msgctxt "newProfileCommentDialog|" msgid "Subject" msgstr "аЂаЕаМаА" #: ui/newProfileComment.ui:53 msgctxt "newProfileCommentDialog|" msgid "Commented profile" msgstr "аšаОаМаЕаНб‚аОаВаАаНаИаЙ аПб€аОб„б–аЛбŒ" #: ui/newProfileComment.ui:89 msgctxt "newProfileCommentDialog|" msgid "Attachments:" msgstr "а”аОаЛбƒб‡аЕаНаНб:" #: ui/newProfileComment.ui:109 msgctxt "newProfileCommentDialog|" msgid "Attach" msgstr "а”аОаЛбƒб‡аИб‚аИ" #: ui/newTextDocument.ui:26 msgctxt "newTextDocumentDialog|" msgid "Edit and publish a new text document" msgstr "а аЕаДаАаГбƒаВаАб‚аИ б– аОаПб€аИаЛбŽаДаНаИб‚аИ аНаОаВаИаЙ б‚аЕаКбб‚аОаВаИаЙ аДаОаКбƒаМаЕаНб‚" #: ui/newTextDocument.ui:39 msgctxt "newTextDocumentDialog|" msgid "Document title" msgstr "а—аАаГаОаЛаОаВаОаК аДаОаКбƒаМаЕаНб‚бƒ" #: ui/newTextDocument.ui:75 msgctxt "newTextDocumentDialog|" msgid "Attachments:" msgstr "а”аОаЛбƒб‡аЕаНаНб:" #: ui/newTextDocument.ui:95 msgctxt "newTextDocumentDialog|" msgid "Attach" msgstr "а”аОаЛбƒб‡аИб‚аИ" #: ui/profileCommentDisplay.ui:26 msgctxt "profileCommentDisplay|" msgid "Comments regarding operator" msgstr "аšаОаМаЕаНб‚аАб€б– б‰аОаДаО аОаПаЕб€аАб‚аОб€аА" #: ui/profileReadersDialog.ui:26 msgctxt "profileReadersDialog|" msgid "Profile readers list" msgstr "аЁаПаИбаОаК б‡аИб‚аАб‡б–аВ аПб€аОб„б–аЛбŽ" #: ui/profileReadersDialog.ui:37 msgctxt "profileReadersDialog|" msgid "Search for profiles to add" msgstr "аŸаОбˆбƒаК аПб€аОб„б–аЛб–аВ аДаЛб аДаОаДаАаВаАаНаНб" #: ui/profileReadersDialog.ui:44 msgctxt "profileReadersDialog|" msgid "First 100 matching profiles:" msgstr "аŸаЕб€бˆаИб… 100 аВб–аДаПаОаВб–аДаНаИб… аПб€аОб„б–аЛб–аВ:" #: ui/profileReadersDialog.ui:66 msgctxt "profileReadersDialog|" msgid "Add selected to list of readers" msgstr "а”аОаДаАб‚аИ аПаОаЗаНаАб‡аЕаНб– аДаО баПаИбаКбƒ б‡аИб‚аАб‡б–аВ" #: ui/profileReadersDialog.ui:73 msgctxt "profileReadersDialog|" msgid "Current list of readers" msgstr "аŸаОб‚аОб‡аНаИаЙ баПаИбаОаК б‡аИб‚аАб‡б–аВ" #: ui/profileReadersDialog.ui:90 msgctxt "profileReadersDialog|" msgid "Close" msgstr "а—аАаКб€аИб‚аИ" #: ui/profileReadersDialog.ui:109 msgctxt "profileReadersDialog|" msgid "Remove selected" msgstr "а’аИаЛбƒб‡аИб‚аИ аПаОаЗаНаАб‡аЕаНаЕ" #: ui/searchDisplay.ui:26 msgctxt "searchDisplay|" msgid "Search data storage" msgstr "аŸаОбˆбƒаК бƒ бб…аОаВаИб‰б– аДаАаНаИб…" #: ui/searchDisplay.ui:60 msgctxt "searchDisplay|" msgid "Words:" msgstr "аЁаЛб–аВ:" #: ui/searchDisplay.ui:70 msgctxt "searchDisplay|" msgid "Search" msgstr "аŸаОбˆбƒаК" #: ui/searchDisplay.ui:87 msgctxt "searchDisplay|" msgid "Network search" msgstr "аŸаОбˆбƒаК бƒ аМаЕб€аЕаЖб–" #: ui/searchDisplay.ui:101 msgctxt "searchDisplay|" msgid "Search ads" msgstr "аŸаОбˆбƒаК аОаГаОаЛаОбˆаЕаНбŒ" #: ui/searchDisplay.ui:111 msgctxt "searchDisplay|" msgid "Search profiles" msgstr "аŸаОбˆбƒаК аПб€аОб„б–аЛб–аВ" #: ui/searchDisplay.ui:121 msgctxt "searchDisplay|" msgid "Search comments" msgstr "аŸаОбˆбƒаК бƒ аКаОаМаЕаНб‚аАб€бб…" #: ui/settingsDialog.ui:26 msgctxt "settingsDialog|" msgid "Node settings" msgstr "аŸаАб€аАаМаЕб‚б€аИ аЛаОаКаАаЛбŒаНаОаГаО аВбƒаЗаЛаА" #: ui/settingsDialog.ui:39 msgctxt "settingsDialog|" msgid "TCP listen port" msgstr "аŸаОб€б‚ аОб‡б–аКбƒаВаАаНаНб аНаА TCP" #: ui/settingsDialog.ui:58 msgctxt "settingsDialog|" msgid "Incoming TCP listen port. Change requires node restart. " msgstr "" "аŸаОб€б‚ аОб‡б–аКбƒаВаАаНаНб аНаА аВб…б–аДаНб– аЗт€™б”аДаНаАаНаНб TCP. а—аМб–аНаА аПаОб‚б€аЕаБбƒб” аПаЕб€аЕаЗаАаПбƒбаКбƒ " "аЛаОаКаАаЛбŒаНаОаГаО аВбƒаЗаЛаА. " #: ui/settingsDialog.ui:84 msgctxt "settingsDialog|" msgid "DNS name of node" msgstr "ааАаЗаВаА DNS аЛаОаКаАаЛбŒаНаОаГаО аВбƒаЗаЛаА" #: ui/settingsDialog.ui:91 msgctxt "settingsDialog|" msgid "" "If you have permanent DNS name for your machine, you may type it here to be " "used to reference your node" msgstr "" "аЏаКб‰аО бƒ аВаАбˆаОаГаО аКаОаМаПт€™бŽб‚аЕб€аА б” аПаОбб‚б–аЙаНаА аНаАаЗаВаА DNS, аВаИ аМаОаЖаЕб‚аЕ аВаКаАаЗаАб‚аИ б—б— б‚бƒб‚, б‰аОаБ" " б—б— аВаИаКаОб€аИбб‚аОаВбƒаВаАаЛаИ аДаЛб аПаОбаИаЛаАаНаНб аНаА аВаАбˆ аВбƒаЗаОаЛ" #: ui/settingsDialog.ui:103 msgctxt "settingsDialog|" msgid "Data store limits:" msgstr "аžаБаМаЕаЖаЕаНаНб бб…аОаВаИб‰аА аДаАаНаИб…:" #: ui/settingsDialog.ui:115 msgctxt "settingsDialog|" msgid "Nr of profiles to keep" msgstr "аšб–аЛбŒаКб–бб‚бŒ аПб€аОб„б–аЛб–аВ аДаЛб аЗаБаЕб€аЕаЖаЕаНаНб" #: ui/settingsDialog.ui:154 msgctxt "settingsDialog|" msgid "Nr of private messages to keep" msgstr "аšб–аЛбŒаКб–бб‚бŒ аОбаОаБаИбб‚аИб… аПаОаВб–аДаОаМаЛаЕаНбŒ аДаЛб аЗаБаЕб€аЕаЖаЕаНаНб" #: ui/settingsDialog.ui:193 msgctxt "settingsDialog|" msgid "Nr of binary blobs to keep" msgstr "аšб–аЛбŒаКб–бб‚бŒ аБб–аНаАб€аНаИб… б„аАаЙаЛб–аВ аДаЛб аЗаБаЕб€аЕаЖаЕаНаНб" #: ui/settingsDialog.ui:232 msgctxt "settingsDialog|" msgid "Nr of CAs to keep" msgstr "аšб–аЛбŒаКб–бб‚бŒ CA аДаЛб аЗаБаЕб€аЕаЖаЕаНаНб" #: ui/settingsDialog.ui:251 msgctxt "settingsDialog|" msgid "" "Number of classified ads to keep in storage, total, including all " "classifications. Oldest referenced will be deleted first." msgstr "" "а—аАаГаАаЛбŒаНаА аКб–аЛбŒаКб–бб‚бŒ аОаГаОаЛаОбˆаЕаНбŒ classified ads бƒбб–б… аКаЛаАбаИб„б–аКаАб†б–аЙ, баКб– баЛб–аД " "аЗаБаЕб€б–аГаАб‚аИ бƒ бб…аОаВаИб‰б– аДаАаНаИб…. ааАаЙбб‚аАб€б–бˆб– аПаОаВб–аДаОаМаЛаЕаНаНб аВаИаЛбƒб‡аАб‚аИаМбƒб‚бŒбб аПаЕб€бˆаИаМаИ." #: ui/settingsDialog.ui:274 msgctxt "settingsDialog|" msgid "Nr of profile comments to keep" msgstr "аšб–аЛбŒаКб–бб‚бŒ аКаОаМаЕаНб‚аАб€б–аВ аДаО аПб€аОб„б–аЛбŽ аДаЛб аЗаБаЕб€аЕаЖаЕаНаНб" #: ui/settingsDialog.ui:313 msgctxt "settingsDialog|" msgid "Nr of db records to keep" msgstr "аš-б‚бŒ аЗаАаПаИбб–аВ а‘а” аДаЛб аЗаБаЕб€аЕаЖаЕаНаНб" #: ui/settingsDialog.ui:316 msgctxt "settingsDialog|" msgid "Ringtone" msgstr "аœаЕаЛаОаДб–б аДаЗаВб–аНаКаА" #: ui/settingsDialog.ui:324 msgctxt "settingsDialog|" msgid "Bow" msgstr "а›бƒаК" #: ui/settingsDialog.ui:329 msgctxt "settingsDialog|" msgid "Electrical" msgstr "а•аЛаЕаКб‚б€аО" #: ui/settingsDialog.ui:334 msgctxt "settingsDialog|" msgid "Acoustic" msgstr "ааКбƒбб‚аИб‡аНаА" #: ui/settingsDialog.ui:339 msgctxt "settingsDialog|" msgid "Beep" msgstr "а“бƒаДаОаК" #: ui/settingsDialog.ui:344 msgctxt "settingsDialog|" msgid "Silence" msgstr "аЂаИбˆаА" #: ui/settingsDialog.ui:356 msgctxt "settingsDialog|" msgid "Accept voice calls" msgstr "аŸб€аИаЙаМаАб‚аИ аГаОаЛаОбаОаВб– аВаИаКаЛаИаКаИ" #: ui/settingsDialog.ui:364 msgctxt "settingsDialog|" msgid "All" msgstr "а’бб–" #: ui/settingsDialog.ui:369 msgctxt "settingsDialog|" msgid "From trusted operators" msgstr "а’б–аД аДаОаВб–б€аЕаНаИб… аОаПаЕб€аАб‚аОб€б–аВ" #: ui/settingsDialog.ui:374 msgctxt "settingsDialog|" msgid "Accept no voice calls" msgstr "ааЕ аПб€аИаЙаМаАб‚аИ аЗаВбƒаКаОаВаИб… аВаИаКаЛаИаКб–аВ" #: ui/statusDialog.ui:26 msgctxt "statusDialog|" msgid "Network and connection status" msgstr "аЁб‚аАаН аМаЕб€аЕаЖб– б– аЗт€™б”аДаНаАаНаНб" #: ui/statusDialog.ui:48 msgctxt "statusDialog|" msgid "Detected own IPv4" msgstr "а’аИбаВаЛаЕаНаИаЙ аВаЛаАбаНаИаЙ IPv4" #: ui/statusDialog.ui:61 ui/statusDialog.ui:93 msgctxt "statusDialog|" msgid "" "Should your friend have trouble connecting, give her this address with port " "number" msgstr "" "аЏаКб‰аО б…б‚аОббŒ аНаЕ аМаОаЖаЕ аЗаВт€™баЗаАб‚аИбб б–аЗ аВаАаМаИ, аНаАаДаАаЙб‚аЕ аЙаОаМбƒ б‡аИ б—аЙ б†бŽ аАаДб€аЕббƒ б–аЗ " "аНаОаМаЕб€аОаМ аПаОб€б‚бƒ" #: ui/statusDialog.ui:74 msgctxt "statusDialog|" msgid "IPv6" msgstr "IPv6" #: ui/statusDialog.ui:113 msgctxt "statusDialog|" msgid "TCP port currently used" msgstr "аŸаОб‚аОб‡аНаИаЙ аВаИаКаОб€аИбб‚аАаНаИаЙ аПаОб€б‚ TCP" #: ui/statusDialog.ui:151 msgctxt "statusDialog|" msgid "Currently open connections" msgstr "аŸаОб‚аОб‡аНб– аВб–аДаКб€аИб‚б– аЗт€™б”аДаНаАаНаНб" #: ui/statusDialog.ui:195 msgctxt "statusDialog|" msgid "Manually add connection" msgstr "а”аОаДаАб‚аИ аЗт€™б”аДаНаАаНаНб аВб€бƒб‡аНбƒ" #: ui/statusDialog.ui:202 msgctxt "statusDialog|" msgid "Close" msgstr "а—аАаКб€аИб‚аИ" #: ui/tclConsole.ui:26 msgctxt "tclConsoleDialog|" msgid "TCL Interpreter console" msgstr "аšаОаНбаОаЛбŒ б–аНб‚аЕб€аПб€аЕб‚аАб‚аОб€аА TCL" #: ui/tclConsole.ui:51 msgctxt "tclConsoleDialog|" msgid "Evaluate" msgstr "аžб†б–аНаИб‚аИ" #: ui/tclConsole.ui:58 msgctxt "tclConsoleDialog|" msgid "Close" msgstr "а—аАаКб€аИб‚аИ" #: ui/tclConsole.ui:69 msgctxt "tclConsoleDialog|" msgid "Interpreter output" msgstr "а’аИаВаЕаДаЕаНаНб б–аНб‚аЕб€аПб€аЕб‚аАб‚аОб€аА" #: ui/tclConsole.ui:79 msgctxt "tclConsoleDialog|" msgid "Command input" msgstr "а’аВаЕаДаЕаНаНб аКаОаМаАаНаДаИ" #: ui/tclPrograms.ui:26 msgctxt "tclProgramsDialog|" msgid "TCL programs" msgstr "аŸб€аОаГб€аАаМаИ TCL" #: ui/tclPrograms.ui:48 msgctxt "tclProgramsDialog|" msgid "Stored programs" msgstr "а—аБаЕб€аЕаЖаЕаНб– аПб€аОаГб€аАаМаИ" #: ui/tclPrograms.ui:68 msgctxt "tclProgramsDialog|" msgid "Program code" msgstr "аšаОаД аПб€аОаГб€аАаМаИ" classified-ads-0.13/po/zanata.xml000066400000000000000000000005031331670245300167300ustar00rootroot00000000000000 https://fedora.zanata.org/ classified-ads 0.10rc1 gettext fi da classified-ads-0.13/tcl/000077500000000000000000000000001331670245300150765ustar00rootroot00000000000000classified-ads-0.13/tcl/tclCallbacks.cpp000066400000000000000000002501651331670245300201750ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "tclCallbacks.h" #include "../controller.h" #include "../datamodel/model.h" #include "../datamodel/searchmodel.h" #include "../datamodel/profilemodel.h" #include "../datamodel/profile.h" #include "../datamodel/camodel.h" #include "../datamodel/ca.h" #include "../datamodel/profilecommentmodel.h" #include "../datamodel/profilecomment.h" #include "../datamodel/binaryfilemodel.h" #include "../datamodel/binaryfile.h" #include "../datamodel/contentencryptionmodel.h" #include "../datamodel/cadbrecord.h" #include "../datamodel/cadbrecordmodel.h" #include "../datamodel/trusttreemodel.h" #include "../datamodel/tclprogram.h" #include "../datamodel/tclmodel.h" #include "../tcl/tclWrapper.h" #include "../ui/dialogbase.h" #include "../log.h" #include "tclUtil.h" #include #include #include "../FrontWidget.h" const int KHashStringLen ( 40 ) ; const char * KTCLFingerPrintProperty = "fingerPrint" ; const char * KTCLFileNameProperty = "fileName" ; const char * KTCLFingerPrintOfCommented = "fingerPrintOfCommented" ; const char * KTCLFingerPrintOfSender = "fingerPrintOfSender" ; const char * KTCLTimeOfPublish = "timeOfPublish" ; const char * KTCLSenderName = "senderName" ; const char * KTCLSubject = "subject" ; const char * KTCLMessageText = "messageText"; const char * KTCLPlainMessageText = "plainMessageText" ; const char * KTCLIsPrivate = "isPrivate" ; const char * KTCLReplyTo = "replyTo" ; const char * KTCLAttachedFiles = "attachedFiles" ; const char * KTCLGroup = "group" ; const char * KTCLSenderHash = "senderHash" ; const char * KTCLAboutComboboxText = "aboutComboboxText" ; const char * KTCLConcernsComboxboxText = "concernsComboboxText" ; const char * KTCLInComboboxText = "inComboboxText" ; const char * KTCLAboutComboBoxIndex = "aboutComboBoxIndex" ; const char * KTCLInComboBoxIndex = "inComboBoxIndex" ; const char * KTCLConcernsComboBoxIndex = "concernsComboBoxIndex" ; const char * KTCLMimeType = "mimeType" ; const char * KTCLDescription = "description" ; const char * KTCLOwner = "owner" ; const char * KTCLContentOwner = "contentOwner" ; const char * KTCLLicense = "license" ; const char * KTCLFileData = "fileData" ; const char * KTCLDisplayName = "displayName" ; const char * KTCLGreetingText = "greetingText" ; const char * KTCLFirstName = "firstName" ; const char * KTCLFamilyName = "familyName" ; const char * KTCLCityCountry = "cityCountry" ; const char * KTCLBTCAdress = "BTCAddress" ; const char * KTCLStateOfTheWorld = "stateOfTheWorld" ; const char * KTCLImagePNG = "imagePNG" ; const char * KTCLProfileReaders = "profileReaders" ; const char * KTCLSharedFiles = "sharedFiles" ; const char * KTCLTrustList = "trustList" ; const char * KTCLForceNoEncryption = "forceNoEncryption" ; const char * KTCLFileRecipients = "fileRecipients" ; const char * KTCLDbRecordId = "recordId" ; const char * KTCLDbRecordCollectionId = "collectionId" ; const char * KTCLDbRecordSenderId = "senderId" ; const char * KTCLDbRecordSearchPhrase = "searchPhrase" ; const char * KTCLDbRecordSearchNumber = "searchNumber" ; const char * KTCLDbRecordSearchNumberLessThan = "searchNumberLessThan" ; const char * KTCLDbRecordSearchNumberMoreThan = "searchNumberMoreThan" ; const char * KTCLDbRecordData = "data" ; const char * KTCLDbRecordIsSigVerified = "isSignatureVerified" ; const char * KTCLDbRecordRecipients = "recordRecipients" ; const char * KTCLDbRecordEncrypted = "encrypted" ; extern const char *KTCLCommandPublishFile ; extern const char *KTCLCommandPublishProfile ; extern const char *KTCLCommandPublishProfileComment ; extern const char *KTCLCommandPublishClassifiedAd ; extern const char *KTCLCommandPublishDbRecord ; TclCallbacks::TclCallbacks(Model& aModel, MController& aController) : iModel(aModel), iController(aController) { } TclCallbacks::~TclCallbacks() { } // non-static method int TclCallbacks::listItemsCmdImpl(ClientData /*aCData*/, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { Tcl_Obj* resultList ( Tcl_NewListObj(0, NULL) ); int argumentStrLen (0) ; bool listAds ( false ) ; bool listProfiles ( false ) ; bool listComments ( false ) ; if(strncmp(Tcl_GetStringFromObj(aObjv[0], &argumentStrLen), "listProfiles", 12) == 0 ) { listProfiles = true ; } else if(strncmp(Tcl_GetStringFromObj(aObjv[0], &argumentStrLen), "listAds", 7) == 0 ) { listAds = true ; } else if(strncmp(Tcl_GetStringFromObj(aObjv[0], &argumentStrLen), "listComments", 12) == 0 ) { listComments = true ; } // normally aObjc = 2, as first argument is command itself, // and 2nd argument is the search term if ( aObjc > 1 ) { char *argumentStr(Tcl_GetStringFromObj(aObjv[1], &argumentStrLen)) ; QLOG_STR("TclCallbacks::listItemsCmd in " + QString::number(aObjc)) ; if ( resultList && argumentStrLen > 0 ) { QString searchTerm ( QString::fromUtf8( argumentStr,argumentStrLen ) ) ; QLOG_STR("Search phrase >" + searchTerm + "<") ; iModel.lock() ; const QList resultSet ( iModel.searchModel()-> performSearch(searchTerm, listAds, listProfiles, listComments) ) ; iModel.unlock() ; QLOG_STR("Search result count + " + QString::number(resultSet.size())) ; foreach ( const SearchModel::SearchResultItem& resultItem, resultSet) { Tcl_Obj* resultAsTclObj = Tcl_NewDictObj() ; int resultStrLen = strlen(resultItem.iDisplayName.toUtf8().constData()) ; int hashLen = strlen(resultItem.iItemHash.toString().toUtf8().constData()) ; Tcl_Obj* key = Tcl_NewStringObj(resultItem.iItemHash.toString().toUtf8().constData(), hashLen) ; Tcl_Obj* value = Tcl_NewStringObj(resultItem.iDisplayName.toUtf8().constData(), resultStrLen) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; Tcl_ListObjAppendElement(aInterp, resultList, resultAsTclObj) ; } } } Tcl_SetObjResult(aInterp, resultList); return TCL_OK; } // non-static version of profile getter. profile is returned as tcl dictionary. int TclCallbacks::getProfileCmdImpl(ClientData /* aCData */, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { int argumentStrLen (0) ; // normally aObjc = 2, as first argument is command itself, // and 2nd argument is the search term if ( aObjc > 1 ) { const unsigned char *argumentStr( reinterpret_cast( Tcl_GetStringFromObj(aObjv[1], &argumentStrLen))) ; QLOG_STR("TclCallbacks::getProfileCmdImpl in " + QString::number(aObjc)) ; if ( argumentStrLen == KHashStringLen ) { // search term is hash and that is 40 Hash searchTerm ; searchTerm.fromString( argumentStr ) ; if ( searchTerm != KNullHash ) { iModel.lock() ; Profile *result ( iModel.profileModel(). profileByFingerPrint(searchTerm) ) ; iModel.unlock() ; if ( result ) { Tcl_Obj* resultAsTclObj = Tcl_NewDictObj() ; Tcl_Obj* key = Tcl_NewStringObj(KTCLDisplayName,-1) ; Tcl_Obj* value = Tcl_NewStringObj(result->displayName().toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; key = Tcl_NewStringObj(KTCLFingerPrintProperty,-1) ; value = Tcl_NewStringObj(result->iFingerPrint.toString().toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; if ( result->iGreetingText.length() > 0 ) { key = Tcl_NewStringObj(KTCLGreetingText,-1) ; value = Tcl_NewStringObj(result->iGreetingText.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result->iFirstName.length() > 0 ) { key = Tcl_NewStringObj(KTCLFirstName,-1) ; value = Tcl_NewStringObj(result->iFirstName.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result->iFamilyName .length() > 0 ) { key = Tcl_NewStringObj(KTCLFamilyName,-1) ; value = Tcl_NewStringObj(result->iFamilyName .toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result->iCityCountry.length() > 0 ) { key = Tcl_NewStringObj(KTCLCityCountry,-1) ; value = Tcl_NewStringObj(result->iCityCountry.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result->iBTCAddress.length() > 0 ) { key = Tcl_NewStringObj(KTCLBTCAdress,-1) ; value = Tcl_NewStringObj(result->iBTCAddress.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result->iStateOfTheWorld.length() > 0 ) { key = Tcl_NewStringObj(KTCLStateOfTheWorld,-1) ; value = Tcl_NewStringObj(result->iStateOfTheWorld.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } key = Tcl_NewStringObj(KTCLTimeOfPublish,-1) ; value = Tcl_NewLongObj(result->iTimeOfPublish) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; key = Tcl_NewStringObj(KTCLIsPrivate,-1) ; value = Tcl_NewBooleanObj(result->iIsPrivate == true ? 1 : 0 ) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; if ( result->iProfilePicture.isNull() == false ) { // there is image data QByteArray imageData ; QBuffer memoryBuffer ( &imageData ); memoryBuffer.open(QBuffer::WriteOnly) ; result->iProfilePicture.save(&memoryBuffer, "PNG") ; if ( imageData.size() > 0 ) { key = Tcl_NewStringObj(KTCLImagePNG,-1) ; value = Tcl_NewByteArrayObj( reinterpret_cast(imageData.constData()), imageData.size() ) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } } if ( result->iProfileReaders.size() > 0 ) { Tcl_Obj* profileReaders ( Tcl_NewListObj(0, NULL) ); foreach ( const Hash& reader, result->iProfileReaders ) { Tcl_ListObjAppendElement(aInterp, profileReaders, Tcl_NewStringObj(reader.toString().toUtf8().constData(), -1)) ; } key = Tcl_NewStringObj(KTCLProfileReaders,-1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, profileReaders) ; } if ( result->iSharedFiles.size() > 0 ) { Tcl_Obj* sharedFiles ( Tcl_NewListObj(0, NULL) ); foreach ( const Hash& sharedFile, result->iSharedFiles ) { Tcl_ListObjAppendElement(aInterp, sharedFiles, Tcl_NewStringObj(sharedFile.toString().toUtf8().constData(), -1)) ; } key = Tcl_NewStringObj(KTCLSharedFiles,-1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, sharedFiles) ; } if ( result->iTrustList.size() > 0 ) { Tcl_Obj* trustList ( Tcl_NewListObj(0, NULL) ); foreach ( const Hash& trustee, result->iTrustList ) { Tcl_ListObjAppendElement(aInterp, trustList, Tcl_NewStringObj(trustee.toString().toUtf8().constData(), -1)) ; } key = Tcl_NewStringObj(KTCLTrustList,-1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, trustList) ; } Tcl_SetObjResult(aInterp, resultAsTclObj); delete result ; return TCL_OK ; } else { Tcl_AppendResult(aInterp, "Profile not found", NULL); } } else { Tcl_AppendResult(aInterp, "Invalid 40-character input, not parseable as hash", NULL); } } else { Tcl_AppendResult(aInterp, "Argument string length not 40", NULL); } } else { Tcl_AppendResult(aInterp, "Usage: getProfile fingerprint", NULL); } return TCL_ERROR ; } // non-static version of ad getter int TclCallbacks::getClassifiedAdCmdImpl(ClientData /* aCData */, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { // normally aObjc = 2, as first argument is command itself, // and 2nd argument is the search term if ( aObjc > 1 ) { int argumentStrLen(0) ; const unsigned char *argumentStr( reinterpret_cast( Tcl_GetStringFromObj(aObjv[1], &argumentStrLen))) ; QLOG_STR("TclCallbacks::getClassifiedAdCmdImpl in " + QString::number(aObjc)) ; if ( argumentStrLen == KHashStringLen ) { // search term is hash and that is 40 Hash searchTerm ; searchTerm.fromString( argumentStr ) ; if ( searchTerm != KNullHash ) { iModel.lock() ; CA result ( iModel.classifiedAdsModel(). caByHash(searchTerm) ) ; iModel.unlock() ; if ( result.iFingerPrint != KNullHash ) { Tcl_Obj* resultAsTclObj = Tcl_NewDictObj() ; Tcl_Obj* key = Tcl_NewStringObj(KTCLDisplayName,-1) ; Tcl_Obj* value = Tcl_NewStringObj(result.displayName().toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; key = Tcl_NewStringObj(KTCLFingerPrintProperty,-1) ; value = Tcl_NewStringObj(result.iFingerPrint.toString().toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; key = Tcl_NewStringObj(KTCLTimeOfPublish,-1) ; value = Tcl_NewLongObj(result.iTimeOfPublish) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; if ( result.iSenderName.length() > 0 ) { key = Tcl_NewStringObj(KTCLSenderName,-1) ; value = Tcl_NewStringObj(result.iSenderName.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result.iSubject.length() > 0 ) { key = Tcl_NewStringObj(KTCLSubject,-1) ; value = Tcl_NewStringObj(result.iSubject.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result.iGroup.length() > 0 ) { key = Tcl_NewStringObj(KTCLGroup,-1) ; value = Tcl_NewStringObj(result.iGroup.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result.iMessageText.length() > 0 ) { key = Tcl_NewStringObj(KTCLMessageText,-1) ; value = Tcl_NewStringObj(result.iMessageText.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; QTextDocument formatter ; formatter.setHtml(result.iMessageText) ; if ( formatter.isEmpty() == false ) { key = Tcl_NewStringObj(KTCLPlainMessageText,-1) ; value = Tcl_NewStringObj(formatter.toPlainText().toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } } if ( result.iAboutComboBoxText.length() > 0 ) { key = Tcl_NewStringObj(KTCLAboutComboboxText,-1) ; value = Tcl_NewStringObj(result.iAboutComboBoxText.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result.iConcernsComboBoxText.length() > 0 ) { key = Tcl_NewStringObj(KTCLConcernsComboxboxText,-1) ; value = Tcl_NewStringObj(result.iConcernsComboBoxText.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result.iInComboBoxText.length() > 0 ) { key = Tcl_NewStringObj(KTCLInComboboxText,-1) ; value = Tcl_NewStringObj(result.iInComboBoxText.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } key = Tcl_NewStringObj(KTCLAboutComboBoxIndex,-1) ; value = Tcl_NewIntObj(result.iAboutComboBoxIndex) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; key = Tcl_NewStringObj(KTCLInComboBoxIndex,-1) ; value = Tcl_NewIntObj(result.iInComboBoxIndex) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; key = Tcl_NewStringObj(KTCLConcernsComboBoxIndex,-1) ; value = Tcl_NewIntObj(result.iConcernsComboBoxIndex) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; if ( result.iSenderHash != KNullHash ) { key = Tcl_NewStringObj(KTCLSenderHash,-1) ; value = Tcl_NewStringObj(result.iSenderHash.toString().toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result.iReplyTo != KNullHash ) { key = Tcl_NewStringObj(KTCLReplyTo,-1) ; value = Tcl_NewStringObj(result.iReplyTo.toString().toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result.iAttachedFiles.size() > 0 ) { Tcl_Obj* attachedFiles (NULL) ; if ( ( attachedFiles = Tcl_NewListObj(0, NULL) ) != NULL ) { foreach ( const Hash& attachedFile, result.iAttachedFiles ) { Tcl_ListObjAppendElement(aInterp, attachedFiles, Tcl_NewStringObj(attachedFile.toString().toUtf8().constData(), -1)) ; } key = Tcl_NewStringObj(KTCLAttachedFiles,-1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, attachedFiles) ; } } Tcl_SetObjResult(aInterp, resultAsTclObj); return TCL_OK ; } else { Tcl_AppendResult(aInterp, "Classified ad not found", NULL); } } else { Tcl_AppendResult(aInterp, "Invalid 40-character input, not parseable as hash", NULL); } } else { Tcl_AppendResult(aInterp, "Argument string length not 40", NULL); } } else { Tcl_AppendResult(aInterp, "Usage: getClassifiedAd fingerprint", NULL); } return TCL_ERROR ; } // non-static profile-getter int TclCallbacks::getProfileCommentCmdImpl(ClientData /* aCData */, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { int argumentStrLen (0) ; // normally aObjc = 2, as first argument is command itself, // and 2nd argument is the search term if ( aObjc > 1 ) { const unsigned char *argumentStr( reinterpret_cast( Tcl_GetStringFromObj(aObjv[1], &argumentStrLen))) ; QLOG_STR("TclCallbacks::getProfileCommentCmdImpl in " + QString::number(aObjc)) ; if ( argumentStrLen == KHashStringLen ) { // search term is hash and that is 40 Hash searchTerm ; searchTerm.fromString( argumentStr ) ; if ( searchTerm != KNullHash ) { iModel.lock() ; ProfileComment* result ( iModel.profileCommentModel(). profileCommentByFingerPrint(searchTerm) ) ; iModel.unlock() ; if ( result ) { Tcl_Obj* resultAsTclObj = Tcl_NewDictObj() ; Tcl_Obj* key = Tcl_NewStringObj(KTCLFingerPrintProperty,-1) ; Tcl_Obj* value = Tcl_NewStringObj(result->iFingerPrint.toString().toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; key = Tcl_NewStringObj(KTCLFingerPrintOfCommented,-1) ; value = Tcl_NewStringObj(result->iProfileFingerPrint.toString().toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; key = Tcl_NewStringObj(KTCLFingerPrintOfSender,-1) ; value = Tcl_NewStringObj(result->iCommentorHash.toString().toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; key = Tcl_NewStringObj(KTCLTimeOfPublish,-1) ; value = Tcl_NewLongObj(result->iTimeOfPublish) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; if ( result->iCommentorNickName.length() > 0 ) { key = Tcl_NewStringObj(KTCLSenderName,-1) ; value = Tcl_NewStringObj(result->iCommentorNickName.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result->iSubject.length() > 0 ) { key = Tcl_NewStringObj(KTCLSubject,-1) ; value = Tcl_NewStringObj(result->iSubject.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result->iCommentText.length() > 0 ) { key = Tcl_NewStringObj(KTCLMessageText,-1) ; value = Tcl_NewStringObj(result->iCommentText.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; QTextDocument formatter ; formatter.setHtml(result->iCommentText) ; if ( formatter.isEmpty() == false ) { key = Tcl_NewStringObj(KTCLPlainMessageText,-1) ; value = Tcl_NewStringObj(formatter.toPlainText().toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } } key = Tcl_NewStringObj(KTCLIsPrivate,-1) ; value = Tcl_NewBooleanObj(result->iIsPrivate ? 1 : 0 ) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; if ( result->iReferences != KNullHash ) { key = Tcl_NewStringObj(KTCLReplyTo,-1) ; value = Tcl_NewStringObj(result->iReferences.toString().toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result->iAttachedFiles.size() > 0 ) { Tcl_Obj* attachedFiles (NULL) ; if ( ( attachedFiles = Tcl_NewListObj(0, NULL) ) != NULL ) { foreach ( const Hash& attachedFile, result->iAttachedFiles ) { Tcl_ListObjAppendElement(aInterp, attachedFiles, Tcl_NewStringObj(attachedFile.toString().toUtf8().constData(), -1)) ; } key = Tcl_NewStringObj(KTCLAttachedFiles,-1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, attachedFiles) ; } } Tcl_SetObjResult(aInterp, resultAsTclObj); return TCL_OK ; } else { Tcl_AppendResult(aInterp, "Profile comment not found", NULL); } } else { Tcl_AppendResult(aInterp, "Invalid 40-character input, not parseable as hash", NULL); } } else { Tcl_AppendResult(aInterp, "Argument string length not 40", NULL); } } else { Tcl_AppendResult(aInterp, "Usage: getProfileComment fingerprint", NULL); } return TCL_ERROR ; } // non-static blob-getter int TclCallbacks::getBinaryFileCmdImpl(ClientData /* aCData */, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { int argumentStrLen (0) ; // normally aObjc = 2, as first argument is command itself, // and 2nd argument is the search term if ( aObjc > 1 ) { const unsigned char *argumentStr( reinterpret_cast( Tcl_GetStringFromObj(aObjv[1], &argumentStrLen))) ; QLOG_STR("TclCallbacks::getBinaryFileCmdImpl in " + QString::number(aObjc)) ; if ( argumentStrLen == KHashStringLen ) { // search term is hash and that is 40 Hash searchTerm ; searchTerm.fromString( argumentStr ) ; if ( searchTerm != KNullHash ) { iModel.lock() ; BinaryFile* result ( iModel.binaryFileModel(). binaryFileByFingerPrint(searchTerm) ) ; iModel.unlock() ; if ( result ) { QByteArray fileData ; QByteArray fileSignature ; bool isEncrypted ; Hash fileOwnerFingerPrint ; fileOwnerFingerPrint.fromString((const unsigned char *)(result->iOwner.toUtf8().constData())) ; iModel.lock() ; bool fileContentFound = iModel.binaryFileModel(). binaryFileDataByFingerPrint(searchTerm, fileOwnerFingerPrint, fileData, fileSignature, &isEncrypted ) ; iModel.unlock() ; if ( fileContentFound ) { Tcl_Obj* resultAsTclObj = Tcl_NewDictObj() ; Tcl_Obj* key = Tcl_NewStringObj(KTCLFingerPrintProperty,-1) ; Tcl_Obj* value = Tcl_NewStringObj(result->iFingerPrint.toString().toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; key = Tcl_NewStringObj(KTCLTimeOfPublish,-1) ; value = Tcl_NewLongObj(result->iTimeOfPublish) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; if ( result->iMimeType.length() > 0 ) { key = Tcl_NewStringObj(KTCLMimeType,-1) ; value = Tcl_NewStringObj(result->iMimeType.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result->iDescription.length() > 0 ) { key = Tcl_NewStringObj(KTCLDescription,-1) ; value = Tcl_NewStringObj(result->iDescription.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result->iOwner.length() > 0 ) { key = Tcl_NewStringObj(KTCLOwner,-1) ; value = Tcl_NewStringObj(result->iOwner.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result->iContentOwner.length() > 0 ) { key = Tcl_NewStringObj(KTCLContentOwner,-1) ; value = Tcl_NewStringObj(result->iContentOwner.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result->iLicense.length() > 0 ) { key = Tcl_NewStringObj(KTCLLicense,-1) ; value = Tcl_NewStringObj(result->iLicense.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } if ( result->iFileName.length() > 0 ) { key = Tcl_NewStringObj(KTCLFileNameProperty,-1) ; value = Tcl_NewStringObj(result->iFileName.toUtf8().constData(), -1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } key = Tcl_NewStringObj(KTCLFileData,-1) ; value = Tcl_NewByteArrayObj( reinterpret_cast(fileData.constData()), fileData.size() ) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; Tcl_SetObjResult(aInterp, resultAsTclObj); delete result ; return TCL_OK ; } else { Tcl_AppendResult(aInterp, "Binary file data not found", NULL); delete result ; } } else { Tcl_AppendResult(aInterp, "Binary file not found", NULL); } } else { Tcl_AppendResult(aInterp, "Invalid 40-character input, not parseable as hash", NULL); } } else { Tcl_AppendResult(aInterp, "Argument string length not 40", NULL); } } else { Tcl_AppendResult(aInterp, "Usage: getBinaryFile fingerprint", NULL); } return TCL_ERROR ; } int TclCallbacks::publishItemCmdImpl(ClientData aCData , Tcl_Interp *aInterp, int aObjc, Tcl_Obj* const aObjv[]) { if ( aObjc > 0 ) { if ( iController.profileInUse() == KNullHash ) { Tcl_AppendResult(aInterp, "No current profile, can't publish", NULL); return TCL_ERROR ; } int cmdLen ( 0 ) ; const char *commandName = Tcl_GetStringFromObj(aObjv[0], &cmdLen) ; if ( cmdLen > 0 && strncmp(commandName, KTCLCommandPublishFile, strlen(KTCLCommandPublishFile)) == 0 ) { return publishFileCmdImpl( aCData , aInterp, aObjc, aObjv) ; } else if ( cmdLen > 0 && strncmp(commandName, KTCLCommandPublishProfileComment, strlen(KTCLCommandPublishProfileComment)) == 0 ) { return publishProfileCommentCmdImpl( aCData , aInterp, aObjc, aObjv) ; } else if ( cmdLen > 0 && strncmp(commandName, KTCLCommandPublishProfile, strlen(KTCLCommandPublishProfile)) == 0 ) { return publishProfileCmdImpl( aCData , aInterp, aObjc, aObjv) ; } else if ( cmdLen > 0 && strncmp(commandName, KTCLCommandPublishClassifiedAd, strlen(KTCLCommandPublishClassifiedAd)) == 0 ) { return publishClassifiedAdCmdImpl( aCData , aInterp, aObjc, aObjv) ; } else if ( cmdLen > 0 && strncmp(commandName, KTCLCommandPublishDbRecord, strlen(KTCLCommandPublishDbRecord)) == 0 ) { return publishDbRecordCmdImpl( aCData , aInterp, aObjc, aObjv) ; } else { Tcl_AppendResult(aInterp, "unknown command", NULL); return TCL_ERROR ; } } return TCL_ERROR ; } int TclCallbacks::publishProfileCommentCmdImpl(ClientData /* aCData */, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { if ( aObjc > 1 ) { Tcl_DictSearch searchPtr ; int done(false) ; Tcl_Obj* key (NULL) ; Tcl_Obj* value (NULL) ; if (Tcl_DictObjFirst(aInterp, aObjv[1], &searchPtr, &key, &value, &done) != TCL_OK) { return TCL_ERROR; } else { ProfileComment pc ; do { // both key and value have been set if ( key && value ) { int argumentStrLen (0) ; QString keyStr ( Tcl_GetStringFromObj(key, &argumentStrLen) ) ; QLOG_STR("Found key at publishProfileCommentCmdImpl " + keyStr) ; if ( keyStr == KTCLFingerPrintOfCommented ) { pc.iProfileFingerPrint.fromString ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } else if ( keyStr == KTCLSenderName ) { pc.iCommentorNickName = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } else if ( keyStr == KTCLSubject ) { pc.iSubject = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } else if ( keyStr == KTCLMessageText ) { pc.iCommentText = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } else if ( keyStr == KTCLPlainMessageText ) { pc.iCommentText = "" + QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) + "" ; } else if ( keyStr == KTCLIsPrivate ) { int intFromObj ( 0 ) ; if ( Tcl_GetIntFromObj(aInterp, value, &intFromObj) == TCL_OK ) { pc.iIsPrivate = intFromObj == 0 ? false : true ; } } else if ( keyStr == KTCLReplyTo) { pc.iReferences.fromString ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } else if ( keyStr == KTCLAttachedFiles ) { // in case of attached files the object in the dictionary // is a list int listLen ( 0 ) ; if ( Tcl_ListObjLength(aInterp,value,&listLen) == TCL_OK ) { for ( int i = 0 ; i < listLen ; i++ ) { Tcl_Obj *objPtrPtr ; if ( Tcl_ListObjIndex(aInterp, value, i, &objPtrPtr ) == TCL_OK ) { Hash attachedFileHash ; attachedFileHash.fromString ( reinterpret_cast(Tcl_GetStringFromObj(objPtrPtr,&argumentStrLen)) ) ; if ( attachedFileHash != KNullHash ) { pc.iAttachedFiles.append ( attachedFileHash ) ; } } else { return TCL_ERROR ; } } } else { return TCL_ERROR ; } } } Tcl_DictObjNext(&searchPtr, &key, &value, &done) ; } while ( !done ) ; if ( pc.iCommentText.length() == 0 && pc.iSubject.length() == 0 ) { Tcl_AppendResult(aInterp, "Either comment text or subject must be given", NULL); return TCL_ERROR ; } if ( pc.iProfileFingerPrint == KNullHash ) { Tcl_AppendResult(aInterp, "Hash of commented profile must be given", NULL); return TCL_ERROR ; } pc.iTimeOfPublish = QDateTime::currentDateTimeUtc().toTime_t() ; pc.iCommentorHash = iController.profileInUse() ; quint32 dummy ; iController.model().lock() ; if (pc.iCommentorHash != KNullHash && iController.model() .contentEncryptionModel() .PublicKey(pc.iCommentorHash, pc.iKeyOfCommentor, &dummy ) && iController.model().profileCommentModel() .publishProfileComment(pc) ) { iController.model().unlock() ; Tcl_AppendResult(aInterp, pc.iFingerPrint.toString().toUtf8().constData(), NULL); return TCL_OK ; } else { iController.model().unlock() ; Tcl_AppendResult(aInterp, "Publish failed", NULL); return TCL_ERROR ; } } return TCL_ERROR ; } else { Tcl_AppendResult(aInterp, "Usage: publishProfileComment profile ( as dictionary )", NULL); } return TCL_ERROR ; } int TclCallbacks::publishProfileCmdImpl(ClientData /* aCData */, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { if ( aObjc > 1 ) { Tcl_DictSearch searchPtr ; int done(false) ; Tcl_Obj* key (NULL) ; Tcl_Obj* value (NULL) ; if (Tcl_DictObjFirst(aInterp, aObjv[1], &searchPtr, &key, &value, &done) != TCL_OK) { return TCL_ERROR; } else { // both key and value have been set if ( key && value ) { } } for (; !done ; Tcl_DictObjNext(&searchPtr, &key, &value, &done)) { QLOG_STR("Found key at publishProfileCmdImpl " + QString(Tcl_GetString(key))) ; } return TCL_OK ; } else { Tcl_AppendResult(aInterp, "Usage: publishProfile profile ( as dictionary )", NULL); } return TCL_ERROR ; } int TclCallbacks::publishFileCmdImpl(ClientData /* aCData */, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { if ( aObjc > 1 ) { Tcl_DictSearch searchPtr ; int done(false) ; Tcl_Obj* key (NULL) ; Tcl_Obj* value (NULL) ; if (Tcl_DictObjFirst(aInterp, aObjv[1], &searchPtr, &key, &value, &done) != TCL_OK) { return TCL_ERROR; } else { QByteArray fileContent ; QString mimeType ; /**< what kind of data */ QString description ; /**< what is inside */ QString owner ; /**< fingerprint of publisher */ QString contentOwner ; /**< if someone owns the content, name or SHA1 fp */ QString license ; /**< restriction in usage;PD or GPL or C-C or anything? */ QString fileName ; /**< name of the file-system file */ QList fileRecipientList ; bool isEncrypted (false); do { // both key and value have been set if ( key && value ) { int argumentStrLen (0) ; QString keyStr ( Tcl_GetStringFromObj(key, &argumentStrLen) ) ; QLOG_STR("Found key at publishFileCmdImpl " + keyStr) ; if ( keyStr == KTCLFileNameProperty ) { fileName = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } else if ( keyStr == KTCLDescription ) { description = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } else if ( keyStr == KTCLMimeType ) { mimeType = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } else if ( keyStr == KTCLContentOwner ) { contentOwner = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } else if ( keyStr == KTCLLicense ) { license = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } else if ( keyStr == KTCLForceNoEncryption ) { int intFromObj ( 0 ) ; if ( Tcl_GetIntFromObj(aInterp, value, &intFromObj) == TCL_OK ) { isEncrypted = intFromObj == 0 ? false : true ; } } else if ( keyStr == KTCLFileRecipients ) { // in case of recipient list the object in the dictionary // is a list int listLen ( 0 ) ; if ( Tcl_ListObjLength(aInterp,value,&listLen) == TCL_OK ) { for ( int i = 0 ; i < listLen ; i++ ) { Tcl_Obj *objPtrPtr ; if ( Tcl_ListObjIndex(aInterp, value, i, &objPtrPtr ) == TCL_OK ) { Hash recipientHash ; recipientHash.fromString ( reinterpret_cast(Tcl_GetStringFromObj(objPtrPtr,&argumentStrLen)) ) ; if ( recipientHash != KNullHash ) { fileRecipientList.append ( recipientHash ) ; QLOG_STR("File recipient " + recipientHash.toString()) ; } } else { return TCL_ERROR ; } } } else { return TCL_ERROR ; } } else if ( keyStr == KTCLFileData ) { unsigned char* bytes (NULL); int length ; if ( ( bytes = Tcl_GetByteArrayFromObj(value, &length) ) != NULL && length > 0 ) { fileContent.append(reinterpret_cast(bytes), length) ; } else { Tcl_AppendResult(aInterp, "Could not get file content?", NULL); return TCL_ERROR ; } } } Tcl_DictObjNext(&searchPtr, &key, &value, &done) ; } while ( !done ) ; if ( fileContent.length() == 0 ) { Tcl_AppendResult(aInterp, "Empty file not permitted", NULL); return TCL_ERROR ; } #if QT_VERSION >= 0x050000 if ( mimeType.length() == 0 ) { QMimeDatabase db ; QMimeType detectedType ( db.mimeTypeForData(fileContent) ) ; if ( detectedType.isValid() ) { mimeType = detectedType.name() ; QLOG_STR("Detected file mime-type: " + mimeType) ; } } #endif owner = iController.profileInUse().toString() ; iController.model().lock() ; const FrontWidget* frontWidget = reinterpret_cast ( iController.frontWidget() ) ; if ( frontWidget ) { const Profile *currentProfile ( frontWidget->selectedProfile() ) ; Hash fingerPrint ; if (currentProfile && ( fingerPrint = iController.model().binaryFileModel() .publishBinaryFile(*currentProfile, fileName, description, mimeType, owner, license, fileContent, false, isEncrypted, fileRecipientList.length() == 0 ? NULL : &fileRecipientList ) ) != KNullHash ) { iController.model().unlock() ; Tcl_AppendResult(aInterp, fingerPrint.toString().toUtf8().constData(), NULL); return TCL_OK ; } else { iController.model().unlock() ; Tcl_AppendResult(aInterp, "Publish failed", NULL); return TCL_ERROR ; } } iController.model().unlock() ; } return TCL_ERROR ; } else { Tcl_AppendResult(aInterp, "Usage: publishFile file ( as dictionary )", NULL); } return TCL_ERROR ; } int TclCallbacks::publishClassifiedAdCmdImpl(ClientData /* aCData */, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { int retval = TCL_ERROR ; if ( aObjc > 1 ) { Tcl_DictSearch searchPtr ; int done(false) ; Tcl_Obj* key (NULL) ; Tcl_Obj* value (NULL) ; if (Tcl_DictObjFirst(aInterp, aObjv[1], &searchPtr, &key, &value, &done) != TCL_OK) { return TCL_ERROR; } else { CA ca ; // the ad that we're about to post ca.iAboutComboBoxIndex = -1 ; ca.iConcernsComboBoxIndex = -1 ; ca.iInComboBoxIndex = -1 ; do { // both key and value have been set if ( key && value ) { int argumentStrLen (0) ; QString keyStr ( Tcl_GetStringFromObj(key, &argumentStrLen) ) ; QLOG_STR("Found key at publishClassifiedAdCmdImpl " + keyStr) ; if ( keyStr == KTCLMessageText ) { ca.iMessageText = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } if ( keyStr == KTCLSenderName ) { ca.iSenderName = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } if ( keyStr == KTCLSubject ) { ca.iSubject = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } if ( keyStr == KTCLPlainMessageText ) { ca.iMessageText = ""+ QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) + ""; } if ( keyStr == KTCLAboutComboboxText ) { ca.iAboutComboBoxText = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } if ( keyStr == KTCLConcernsComboxboxText ) { ca.iConcernsComboBoxText = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } if ( keyStr == KTCLInComboboxText ) { ca.iInComboBoxText = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } if ( keyStr == KTCLAboutComboBoxIndex ) { int intFromObj ( 0 ) ; if ( Tcl_GetIntFromObj(aInterp, value, &intFromObj) == TCL_OK ) { ca.iAboutComboBoxIndex = intFromObj ; } } if ( keyStr == KTCLInComboBoxIndex ) { int intFromObj ( 0 ) ; if ( Tcl_GetIntFromObj(aInterp, value, &intFromObj) == TCL_OK ) { ca.iInComboBoxIndex = intFromObj ; } } if ( keyStr == KTCLConcernsComboBoxIndex ) { int intFromObj ( 0 ) ; if ( Tcl_GetIntFromObj(aInterp, value, &intFromObj) == TCL_OK ) { ca.iConcernsComboBoxIndex = intFromObj ; } } if ( keyStr == KTCLReplyTo ) { ca.iReplyTo.fromString ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } if ( keyStr == KTCLAttachedFiles ) { // in case of attached files the object in the dictionary // is a list int listLen ( 0 ) ; if ( Tcl_ListObjLength(aInterp,value,&listLen) == TCL_OK ) { for ( int i = 0 ; i < listLen ; i++ ) { Tcl_Obj *objPtrPtr ; if ( Tcl_ListObjIndex(aInterp, value, i, &objPtrPtr ) == TCL_OK ) { Hash attachedFileHash ; attachedFileHash.fromString ( reinterpret_cast(Tcl_GetStringFromObj(objPtrPtr,&argumentStrLen)) ) ; if ( attachedFileHash != KNullHash ) { ca.iAttachedFiles.append ( attachedFileHash ) ; } } else { return TCL_ERROR ; } } } else { return TCL_ERROR ; } } } Tcl_DictObjNext(&searchPtr, &key, &value, &done) ; } while ( !done ) ; if ( ca.iMessageText.length() == 0 ) { Tcl_AppendResult(aInterp, "Empty ad not permitted", NULL); return TCL_ERROR ; } ca.iTimeOfPublish = QDateTime::currentDateTimeUtc().toTime_t() ; ca.iSenderHash = iController.profileInUse() ; if ( ca.iAboutComboBoxIndex >= ClassifiedAdsModel::ToBeBought && ca.iAboutComboBoxIndex <= ClassifiedAdsModel::ToBeAnnounced ) { ca.iAboutComboBoxText = iModel .classifiedAdsModel() .purposeOfAdString(static_cast(ca.iAboutComboBoxIndex)) ; } else { ca.iAboutComboBoxIndex = -1 ; // not in range } if ( ca.iConcernsComboBoxIndex >= ClassifiedAdsModel::ConcerningCars && ca.iConcernsComboBoxIndex <= ClassifiedAdsModel::ConcerningPhilosophy ) { ca.iConcernsComboBoxText = iModel .classifiedAdsModel() .concernOfAdString(static_cast(ca.iConcernsComboBoxIndex)) ; } else { ca.iConcernsComboBoxIndex = -1 ; // not in range } if ( ( ca.iInComboBoxIndex == 0 || ca.iInComboBoxIndex == -1 ) && ca.iInComboBoxText.length() < 1 ) { ca.iInComboBoxText = "Any country" ; } else { ca.iInComboBoxIndex = -1 ; } ca.iGroup = TclUtil::constructCAGroup ( ca.iAboutComboBoxText , ca.iConcernsComboBoxText , ca.iInComboBoxText , iModel ) ; QLOG_STR("TCL ad publish constructed group string " + ca.iGroup ) ; iModel.lock() ; quint32 dummy ; if ( iModel.contentEncryptionModel().PublicKey( iController.profileInUse(), ca.iProfileKey, &dummy )) { Profile *p (iModel.profileModel().profileByFingerPrint(iController.profileInUse() ) ) ; if ( p != NULL ) { ca.iFingerPrint = iModel.classifiedAdsModel().publishClassifiedAd(*p, ca) ; delete p ; if ( ca.iFingerPrint != KNullHash ) { Tcl_AppendResult(aInterp, ca.iFingerPrint.toString().toUtf8().constData(), NULL); retval = TCL_OK ; } else { Tcl_AppendResult(aInterp, "Publish failed", NULL); } } } iModel.unlock() ; } } else { Tcl_AppendResult(aInterp, "Usage: publishClassifiedAd ad ( as dictionary )", NULL); } return retval ; } int TclCallbacks::publishDbRecordCmdImpl(ClientData /* aCData */, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { if ( aObjc > 1 ) { Tcl_DictSearch searchPtr ; int done(false) ; Tcl_Obj* key (NULL) ; Tcl_Obj* value (NULL) ; if (Tcl_DictObjFirst(aInterp, aObjv[1], &searchPtr, &key, &value, &done) != TCL_OK) { return TCL_ERROR; } else { // aObjv[1] was a dictionary CaDbRecord r ; QList recordRecipientList ; do { // both key and value have been set if ( key && value ) { int argumentStrLen (0) ; QString keyStr ( Tcl_GetStringFromObj(key, &argumentStrLen) ) ; QLOG_STR("Found key at publishDbRecordCmdImpl " + keyStr) ; if ( keyStr == KTCLDbRecordId ) { r.iRecordId.fromString(reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen))) ; if ( r.iRecordId == KNullHash ) { QLOG_STR("Got null record id - record will be published as new") ; } } else if ( keyStr == KTCLDbRecordCollectionId ) { r.iCollectionId.fromString(reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen))) ; if ( r.iCollectionId == KNullHash ) { QLOG_STR("Got null collection id - can not continue publish") ; } } else if ( keyStr == KTCLDbRecordSearchPhrase ) { r.iSearchPhrase = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } else if ( keyStr == KTCLDbRecordSearchNumber ) { Tcl_WideInt intFromObj ( 0 ) ; if ( Tcl_GetWideIntFromObj(aInterp, value, &intFromObj) == TCL_OK ) { r.iSearchNumber = intFromObj ; } else { Tcl_AppendResult(aInterp, "Invalid search number", NULL); return TCL_ERROR ; } } else if ( keyStr == KTCLDbRecordEncrypted ) { int intFromObj ( 0 ) ; if ( Tcl_GetIntFromObj(aInterp, value, &intFromObj) == TCL_OK ) { r.iIsEncrypted = intFromObj == 0 ? false : true ; } } else if ( keyStr == KTCLDbRecordRecipients ) { // in case of recipient list the object in the dictionary // is a list int listLen ( 0 ) ; if ( Tcl_ListObjLength(aInterp,value,&listLen) == TCL_OK ) { for ( int i = 0 ; i < listLen ; i++ ) { Tcl_Obj *objPtrPtr ; if ( Tcl_ListObjIndex(aInterp, value, i, &objPtrPtr ) == TCL_OK ) { Hash recipientHash ; recipientHash.fromString ( reinterpret_cast(Tcl_GetStringFromObj(objPtrPtr,&argumentStrLen)) ) ; if ( recipientHash != KNullHash ) { recordRecipientList.append ( recipientHash ) ; QLOG_STR("Record recipient " + recipientHash.toString()) ; } } else { return TCL_ERROR ; } } } else { return TCL_ERROR ; } } else if ( keyStr == KTCLDbRecordData ) { unsigned char* bytes (NULL); int length ; if ( ( bytes = Tcl_GetByteArrayFromObj(value, &length) ) != NULL && length > 0 ) { r.iData.append(reinterpret_cast(bytes), length) ; } } } Tcl_DictObjNext(&searchPtr, &key, &value, &done) ; } while ( !done ) ; iController.model().lock() ; QString errorString ; errorString = iController.model().caDbRecordModel() ->publishDbRecord(r, &recordRecipientList ) ; if ( errorString.isEmpty() ) { iController.model().unlock() ; // on success db record get assigned an id. // return it to calling TCL program. Note that // aObjv[1] can't be modified, TCL considers // it a shared object. Tcl_AppendResult(aInterp, r.iRecordId.toString().toUtf8().constData(), NULL); return TCL_OK ; } else { Tcl_AppendResult(aInterp, errorString.toUtf8().constData(), NULL); iController.model().unlock() ; return TCL_ERROR ; } } } else { Tcl_AppendResult(aInterp, "Usage: publishDbRecord record ( as dictionary )", NULL); } return TCL_ERROR ; } // here expect a dictionary. if there is key that belongs to // db record, treat it as "and" search term and return records // that satisfy the conditions. Also send search to remote nodes // that will then respond in async way. int TclCallbacks::getDbRecordCmdImpl(ClientData /* aCData */, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { if ( aObjc > 1 ) { Tcl_DictSearch searchPtr ; int done(false) ; Tcl_Obj* key (NULL) ; Tcl_Obj* value (NULL) ; CaDbRecord searchObj ; // object whose members will be used in // search if they differ from detaults // if it is less than "max" then everything will be included. // user can limit the search below qint64 searchNumberLessThan (std::numeric_limits::max()); // if it is more than "min" then everything will be included qint64 searchNumberMoreThan (std::numeric_limits::min()); if (Tcl_DictObjFirst(aInterp, aObjv[1], &searchPtr, &key, &value, &done) != TCL_OK) { return TCL_ERROR; } else { // aObjv[1] was a dictionary QList recordRecipientList ; do { // both key and value have been set if ( key && value ) { int argumentStrLen (0) ; QString keyStr ( Tcl_GetStringFromObj(key, &argumentStrLen) ) ; QLOG_STR("Found key at getDbRecordCmdImpl " + keyStr) ; if ( keyStr == KTCLDbRecordId ) { searchObj.iRecordId.fromString(reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen))) ; if ( searchObj.iRecordId == KNullHash ) { QLOG_STR("Got null record id - not included in search") ; } } else if ( keyStr == KTCLDbRecordCollectionId ) { searchObj.iCollectionId.fromString(reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen))) ; if ( searchObj.iCollectionId == KNullHash ) { QLOG_STR("Got null collection hash - can't retrieve") ; } } else if ( keyStr == KTCLDbRecordSenderId ) { searchObj.iSenderHash.fromString(reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen))) ; if ( searchObj.iSenderHash == KNullHash ) { QLOG_STR("Got null sender hash - extra records will be retrieved") ; } } else if ( keyStr == KTCLDbRecordSearchPhrase ) { searchObj.iSearchPhrase = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(value,&argumentStrLen)) ) ; } else if ( keyStr == KTCLDbRecordSearchNumber ) { Tcl_WideInt intFromObj ( 0 ) ; if ( Tcl_GetWideIntFromObj(aInterp, value, &intFromObj) == TCL_OK ) { searchNumberMoreThan = searchNumberLessThan = intFromObj ; } else { Tcl_AppendResult(aInterp, "Invalid search number", NULL); return TCL_ERROR ; } } else { if ( keyStr == KTCLDbRecordSearchNumberLessThan ) { Tcl_WideInt intFromObj ( 0 ) ; if ( Tcl_GetWideIntFromObj(aInterp, value, &intFromObj) == TCL_OK ) { searchNumberLessThan = intFromObj ; } else { Tcl_AppendResult(aInterp, "Invalid less-than search number", NULL); return TCL_ERROR ; } } if ( keyStr == KTCLDbRecordSearchNumberMoreThan ) { Tcl_WideInt intFromObj ( 0 ) ; if ( Tcl_GetWideIntFromObj(aInterp, value, &intFromObj) == TCL_OK ) { searchNumberMoreThan = intFromObj ; } else { Tcl_AppendResult(aInterp, "Invalid more-than search number", NULL); return TCL_ERROR ; } } } } Tcl_DictObjNext(&searchPtr, &key, &value, &done) ; } while ( !done ) ; iController.model().lock() ; QList resultSet = iController.model().caDbRecordModel() ->searchRecords(searchObj.iCollectionId, searchObj.iRecordId, 0, // modified after std::numeric_limits::max(),// modified before searchNumberMoreThan , searchNumberLessThan, searchObj.iSearchPhrase, searchObj.iSenderHash ) ; iController.model().unlock() ; Tcl_Obj* resultList ( Tcl_NewListObj(0, NULL) ); while ( resultSet.size() > 0 ) { CaDbRecord * resultItem (resultSet.takeAt(0)) ; Tcl_Obj* resultAsTclObj = Tcl_NewDictObj() ; // record id Tcl_Obj* key = Tcl_NewStringObj(KTCLDbRecordId, -1) ; Tcl_Obj* value = Tcl_NewStringObj(resultItem->iRecordId.toString().toUtf8().constData(), KHashStringLen) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; // collection id key = Tcl_NewStringObj(KTCLDbRecordCollectionId, -1) ; value = Tcl_NewStringObj(resultItem->iCollectionId.toString().toUtf8().constData(), KHashStringLen) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; // record sender id, the profile SHA1 in practice key = Tcl_NewStringObj(KTCLDbRecordSenderId, -1) ; value = Tcl_NewStringObj(resultItem->iSenderHash.toString().toUtf8().constData(), KHashStringLen) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; // search number if ( resultItem->iSearchNumber != std::numeric_limits::min() ) { key = Tcl_NewStringObj(KTCLDbRecordSearchNumber, -1) ; value = Tcl_NewWideIntObj(resultItem->iSearchNumber) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } // search phrase if ( resultItem->iSearchPhrase.isEmpty() == false ) { key = Tcl_NewStringObj(KTCLDbRecordSearchPhrase, -1) ; value = Tcl_NewStringObj(resultItem->iSearchPhrase.toUtf8().constData(),-1) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; } // time of publish key = Tcl_NewStringObj(KTCLTimeOfPublish, -1) ; value = Tcl_NewLongObj(resultItem->iTimeOfPublish) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; // is encrypted key = Tcl_NewStringObj(KTCLDbRecordEncrypted, -1) ; value = Tcl_NewIntObj(resultItem->iIsEncrypted ? 1 : 0 ) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; // is verified key = Tcl_NewStringObj(KTCLDbRecordIsSigVerified, -1) ; value = Tcl_NewIntObj(resultItem->iIsSignatureVerified ? 1 : 0 ) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; // actual record data key = Tcl_NewStringObj(KTCLDbRecordData,-1) ; value = Tcl_NewByteArrayObj( reinterpret_cast(resultItem->iData.constData()), resultItem->iData.size() ) ; Tcl_DictObjPut(aInterp, resultAsTclObj, key, value) ; Tcl_ListObjAppendElement(aInterp, resultList, resultAsTclObj) ; delete resultItem ; } Tcl_SetObjResult(aInterp, resultList); return TCL_OK ; } } else { Tcl_AppendResult(aInterp, "Usage: getDbRecord ...", NULL); } return TCL_ERROR ; } int TclCallbacks::storeTCLProgLocalDataImpl(ClientData /*aCData*/, Tcl_Interp *aInterp, int aObjc, Tcl_Obj* const aObjv[]) { if ( aObjc > 1 ) { QByteArray fileContent ; unsigned char* bytes (NULL); int length ; if ( ( bytes = Tcl_GetByteArrayFromObj(aObjv[1], &length) ) != NULL ) { fileContent.append(reinterpret_cast(bytes), length) ; } else { Tcl_AppendResult(aInterp, "Could not get file content?", NULL); return TCL_ERROR ; } iController.model().lock() ; TclProgram p ; const QString programText (iController.tclWrapper() .currentProgram( )) ; p.setProgramText(programText) ; QString errorMessage ( iController.model() .tclModel() .storeTCLProgLocalData(p.iFingerPrint, fileContent) ); iController.model().unlock() ; if ( errorMessage.isEmpty() ) { return TCL_OK ; } else { Tcl_AppendResult(aInterp, errorMessage.toUtf8().constData(), NULL); return TCL_ERROR ; } } else { Tcl_AppendResult(aInterp, "Usage: storeLocalData data", NULL); } return TCL_ERROR ; } int TclCallbacks::retrieveTCLProgLocalDataImpl(ClientData /*aCData*/, Tcl_Interp *aInterp, int /*aObjc*/, Tcl_Obj* const /*aObjv*/[]) { iController.model().lock() ; TclProgram p ; p.setProgramText(iController.tclWrapper() .currentProgram( )) ; const QByteArray fileContent = iController.model() .tclModel() .retrieveTCLProgLocalData(p.iFingerPrint) ; iController.model().unlock() ; Tcl_Obj* result = Tcl_NewByteArrayObj( reinterpret_cast(fileContent.constData()), fileContent.size() ) ; Tcl_SetObjResult(aInterp, result); return TCL_OK ; } int TclCallbacks::saveFileImpl(ClientData /*aCData*/, Tcl_Interp *aInterp, int aObjc, Tcl_Obj* const aObjv[]) { QByteArray* fileContent = new QByteArray() ; QString errorMessage ; if ( aObjc > 1 && fileContent != NULL ) { QString fileName ; unsigned char* bytes (NULL); int length ; if ( ( bytes = Tcl_GetByteArrayFromObj(aObjv[1], &length) ) != NULL ) { fileContent->append(reinterpret_cast(bytes), length) ; } else { Tcl_AppendResult(aInterp, "Could not get file content?", NULL); delete fileContent ; return TCL_ERROR ; } if ( aObjc > 2 ) { int argumentStrLen (0) ; fileName = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(aObjv[2],&argumentStrLen)) ) ; } QLOG_STR("Starting to save file fro tcl prog") ; bool successInGettingFileName ; fileName = iController.getFileName(successInGettingFileName, true, fileName.length() > 0 ? fileName : QString::null ) ; if ( successInGettingFileName && fileName.length() > 0 ) { QFile f ( fileName ) ; if ( f.open(QIODevice::WriteOnly) ) { f.write(*fileContent) ; f.close() ; QLOG_STR("File saved") ; } else { errorMessage = f.errorString() ; } } else { Tcl_AppendResult(aInterp, "Cancelled", NULL); } delete fileContent ; } if ( errorMessage.isEmpty() ) { return TCL_OK ; } else { Tcl_AppendResult(aInterp, errorMessage.toUtf8().constData(), NULL); return TCL_ERROR ; } } int TclCallbacks::openFileImpl(ClientData /*aCData*/, Tcl_Interp *aInterp, int aObjc, Tcl_Obj* const aObjv[]) { QByteArray* fileContent = new QByteArray() ; QString errorMessage ; QString fileName ; if ( aObjc > 1 ) { int argumentStrLen (0) ; fileName = QString::fromUtf8 ( reinterpret_cast(Tcl_GetStringFromObj(aObjv[1],&argumentStrLen)) ) ; } QLOG_STR("Starting to open file from tcl prog") ; bool successInGettingFileName ; fileName = iController.getFileName(successInGettingFileName, false, fileName.length() > 0 ? fileName : QString::null ) ; if ( successInGettingFileName && fileName.length() > 0 ) { QFile f ( fileName ) ; if ( f.open(QIODevice::ReadOnly) ) { fileContent->append(f.read(f.size())) ; f.close() ; QLOG_STR("File opened") ; } else { errorMessage = f.errorString() ; } } else { Tcl_AppendResult(aInterp, "Cancelled", NULL); delete fileContent ; return TCL_ERROR ; } Tcl_Obj* result = Tcl_NewByteArrayObj( reinterpret_cast(fileContent->constData()), fileContent->size() ) ; Tcl_SetObjResult(aInterp, result); delete fileContent ; return TCL_OK ; } // non-static version of profile trust status getter. int TclCallbacks::isProfileTrustedImpl(ClientData /* aCData */, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { int argumentStrLen (0) ; // normally aObjc = 2, as first argument is command itself, // and 2nd argument is the search term if ( aObjc > 1 ) { const unsigned char *argumentStr( reinterpret_cast( Tcl_GetStringFromObj(aObjv[1], &argumentStrLen))) ; QLOG_STR("TclCallbacks::isProfileTrustedImpl in " + QString::number(aObjc)) ; if ( argumentStrLen == KHashStringLen ) { // search term is hash and that is 40 Hash searchTerm ; searchTerm.fromString( argumentStr ) ; if ( searchTerm != KNullHash ) { iModel.lock() ; bool result ( iModel.trustTreeModel()-> isProfileTrusted(searchTerm,NULL,NULL) ) ; iModel.unlock() ; Tcl_Obj* resultAsTclObj = Tcl_NewBooleanObj(result) ; Tcl_SetObjResult(aInterp, resultAsTclObj); return TCL_OK ; } else { Tcl_AppendResult(aInterp, "Invalid 40-character input, not parseable as hash", NULL); } } else { Tcl_AppendResult(aInterp, "Argument string length not 40", NULL); } } else { Tcl_AppendResult(aInterp, "Usage: isProfileTrusted fingerprint", NULL); } return TCL_ERROR ; } classified-ads-0.13/tcl/tclCallbacks.h000066400000000000000000000204231331670245300176320ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef TCLCALLBACKPROCEDURES_H #define TCLCALLBACKPROCEDURES_H #include #include "../mcontroller.h" #include class Model ; class MController ; /** * @brief Class implementing TCL interpreter callbacks * * This class is closely coupled with @ref TclWrapper class * and the TCL interpreter instantiated by TclWrapper will * use command-callbacks implemented by this class. */ class TclCallbacks : public QObject { Q_OBJECT public: TclCallbacks(Model& aModel, MController& aController); /** * Destructor */ ~TclCallbacks() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; public: // methods, called from tclWrapper.h static methods /** * non-static method for getting binary file */ int getBinaryFileCmdImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * @brief non-static method for db record * @param aObjv should contain dictionary expressing the search * conditions. Same dictionary keys are used that are * in use when db record is published from TCL app. * @return If db records satisfying the conditions were found from * local storage, they're returned synchronously as return * value to this call, using Tcl_SetObjResult mechanism. * Search is sent to remote nodes also and as remote nodes * return search results, new db records may be added to * database and TCL app running may receive notifications * later concerning db records originally queries but * arriving later. * @param return TCL_OK if ok, the actual TCL object returned is a TCL dictionary. */ int getDbRecordCmdImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * non-static method for getting profile comment */ int getProfileCommentCmdImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * non-static method for getting classified ad */ int getClassifiedAdCmdImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * non-static method for getting profile details */ int getProfileCmdImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * Non-static Tcl extension method: when TCL scripts asks for list of * profiles, it invokes this method. See @initExtensions * where this method is added into TCL interpreters repertoire. * Called from @ref listItemsCmd method. */ int listItemsCmdImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * Tcl extension method for publishing an item. This will be * called by several in-TCL commands, for instance "publishFile", * "publishComment" or "publishProfile". The TCL command * will be in aObjv[0] and aObjv[1] will contain the actual * object to be published. * * This is the non-static-version, see also @ref TclWrapper::publishItemCmd. * @param aCData clientdata from tcl interpreter. Not used. * @param aInterp pointer to calling TCL interpreter * @param aObjc number of items in array aObjv * @param aObjv command arguments. First is name of the command * itself, like "publishFile", 2nd is actual object * @return TCL_OK on success. */ int publishItemCmdImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj* const aObjv[]) ; /** * Tcl extension method for storing a blob of data in local storage * * This is the non-static-version, see also @ref TclWrapper::storeTCLProgLocalDataCmd. * In practice this calls @ref TclModel::storeTCLProgLocalData. * * @param aCData clientdata from tcl interpreter. Not used. * @param aInterp pointer to calling TCL interpreter * @param aObjc number of items in array aObjv * @param aObjv command arguments. First is name of the command * itself, 2nd is the data to be stored * @return TCL_OK on success. */ int storeTCLProgLocalDataImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj* const aObjv[]) ; /** * Tcl extension method for retrieving back a blob previously stored using * @ref storeTCLProgLocalDataImpl. * * This is the non-static-version, see also @ref TclWrapper::retrieveTCLProgLocalDataCmd. * In practice this calls @ref TclModel::retrieveTCLProgLocalData. * * @param aCData clientdata from tcl interpreter. Not used. * @param aInterp pointer to calling TCL interpreter * @param aObjc number of items in array aObjv * @param aObjv command arguments. * @return TCL_OK on success. */ int retrieveTCLProgLocalDataImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj* const aObjv[]) ; /** * Tcl extension method for checking operator from trust-tree * * @param aCData clientdata from tcl interpreter. Not used. * @param aInterp pointer to calling TCL interpreter * @param aObjc number of items in array aObjv * @param aObjv command arguments. * @return TCL_OK on success. */ int isProfileTrustedImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj* const aObjv[]) ; /** * Tcl extension method for saving a file into filesystem. User gets * to choose file name * * @param aCData clientdata from tcl interpreter. Not used. * @param aInterp pointer to calling TCL interpreter * @param aObjc number of items in array aObjv * @param aObjv command arguments. * @return TCL_OK on success. */ int saveFileImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj* const aObjv[]) ; /** * Tcl extension method for returning contents of a file system file * to interpreter. User gets to choose which file to read. * * @param aCData clientdata from tcl interpreter. Not used. * @param aInterp pointer to calling TCL interpreter * @param aObjc number of items in array aObjv * @param aObjv command arguments. * @return TCL_OK on success. */ int openFileImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj* const aObjv[]) ; private: // methods /** * work-horse method for publishing a profile comment. See method * @ref publishItemCmdImpl that calls this. */ int publishProfileCommentCmdImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * work-horse method for publishing a binary file. See method * @ref publishItemCmdImpl that calls this. */ int publishFileCmdImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * non-static method for publishing a profile */ int publishProfileCmdImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * non-static method for publishing a classified ad */ int publishClassifiedAdCmdImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * non-static method for publishing a db record */ int publishDbRecordCmdImpl(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; private: // variables Model& iModel ; /**< datamodel reference */ MController& iController ; } ; #endif classified-ads-0.13/tcl/tclUtil.cpp000066400000000000000000000064671331670245300172370ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2016. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "tclUtil.h" #include "../datamodel/camodel.h" #include "../datamodel/model.h" TclUtil::TclUtil() { } TclUtil::~TclUtil() { } // static QString TclUtil::constructCAGroup ( QString aAboutComboBoxText , QString aConcernsComboBoxText , QString aInComboBoxText, const Model& aModel ) { QString retval ; // check out if pre-defined string from combobox or // something that user wrote himself to combobox. // it seems like digging that information from combobox itself // is difficult to do .. user would need to hit enter // to set the indexes correctly and she won't if ( aModel.classifiedAdsModel() .aboutComboBoxTexts() .indexOf(aAboutComboBoxText) != -1 ) { retval = aModel .classifiedAdsModel() .purposeOfAdString((ClassifiedAdsModel::PurposeOfAd)aModel .classifiedAdsModel() .aboutComboBoxTexts() .indexOf(aAboutComboBoxText)) ; } else { retval = aAboutComboBoxText ; } retval.append(".") ; if ( aModel .classifiedAdsModel() .regardingComboBoxTexts() .indexOf(aConcernsComboBoxText) != -1 ) { retval.append( aModel .classifiedAdsModel() .concernOfAdString((ClassifiedAdsModel::ConcernOfAd)aModel .classifiedAdsModel() .regardingComboBoxTexts() .indexOf( aConcernsComboBoxText))) ; } else { retval.append( aConcernsComboBoxText ) ; } retval.append(".") ; if ( aModel .classifiedAdsModel() .whereComboBoxTexts() .indexOf( aInComboBoxText ) == 0 ) { // explanation: the country names in "where" are not localized. // except for the first entry, "Any country" and if we get that, // lets put un-localized "Any country" in there -> note that this // same string appears inside tr() in datamodel/camodel.cpp retval.append( "Any country" ) ; } else { // if not the "Any country", then just take the literal // string value, regardless of index retval.append( aInComboBoxText ) ; } return retval ; } classified-ads-0.13/tcl/tclUtil.h000066400000000000000000000050271331670245300166730ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2016. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef TCLUTIL_H #define TCLUTIL_H #include #include "../mcontroller.h" /** * @brief Misc utilities needed in TCL-related code * * Functionality not really TCL-dependent but called from * TCL-wrapper. */ class TclUtil : public QObject { Q_OBJECT public: TclUtil(); ~TclUtil() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; public: // methods /** * Method for constructing the group string of * classified ad group string. String is of form about.concerns.where. * See method in @ref FrontWidget::selectedClassification that has same * purpose but has different input * * @param aAboutComboBoxText "about" part of group string. This is checked * against localized strings in datamodel and user types * "Veneet" (boats in finnish) and happens to have finnish * locale, then datamodel will catch the situation and * return "Boats" - idea is that any boat ad will go to * same group regardless of locale. * @param aConcernsComboBoxText "concerns" e.g. the verb part of * group string. * @param aInComboBoxText "where" part of the group string. * @param aModel datamodel reference * * @return something alike "ToBeAnnounced.Software.Any country" */ static QString constructCAGroup ( QString aAboutComboBoxText , QString aConcernsComboBoxText , QString aInComboBoxText , const Model& aModel ) ; private: // variables } ; #endif classified-ads-0.13/tcl/tclWrapper.cpp000066400000000000000000000746431331670245300177430ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "../controller.h" #include "../datamodel/model.h" #include "../datamodel/searchmodel.h" #include "../datamodel/profilemodel.h" #include "../datamodel/profile.h" #include "../datamodel/camodel.h" #include "../datamodel/ca.h" #include "../datamodel/profilecommentmodel.h" #include "../datamodel/profilecomment.h" #include "../datamodel/binaryfilemodel.h" #include "../datamodel/binaryfile.h" #include "tclWrapper.h" #include "../ui/tclConsole.h" #include "../log.h" #include #include #include "tclCallbacks.h" extern MController* controllerInstanceEx ; Tcl_ChannelType stdOutChannel ; Tcl_ChannelType stdErrChannel ; const char *KStdOutChannelName = "stdout" ; const char *KStdErrChannelName = "stderr" ; const char *KMainWindowTitle = "tcl/tk" ; const char *KTCLCommandPublishFile = "publishFile" ; const char *KTCLCommandPublishProfile = "publishProfile" ; const char *KTCLCommandPublishProfileComment = "publishProfileComment" ; const char *KTCLCommandPublishClassifiedAd = "publishClassifiedAd" ; const char *KTCLCommandPublishDbRecord = "publishDbRecord" ; const char *KTCLCommandSHA1 = "calculateSHA1" ; const char *KTCLCommandStore = "storeLocalData" ; const char *KTCLCommandRetrieve = "retrieveLocalData" ; const char *KTCLCommandOpen = "openFileSystemFile" ; const char *KTCLCommandSave = "saveFileSystemFile" ; const char *KTCLCommandIsProfileTrusted = "isProfileTrusted" ; TclWrapper::TclWrapper(Model& aModel, MController& aController) : iModel(aModel), iController(aController), iInterp(NULL), iDeleteLater(false), iConsole (NULL), iTclCallbacks(NULL) { iMainWindowTitle = KMainWindowTitle ; iTclCallbacks = new TclCallbacks(aModel,aController) ; } TclWrapper::~TclWrapper() { QLOG_STR("TclWrapper::~TclWrapper in") ; if ( iInterp ) { Tcl_DeleteInterp(iInterp) ; iInterp = NULL ; } if ( iConsole ) { delete iConsole ; } delete iTclCallbacks ; } // note that all memory allocation and freeing inside this method // as TCL interpreter is picky about objects being allocated and // free'd inside same thread (==heap) void TclWrapper::run() { LOG_STR("TclWrapper::run in") ; iNeedsToRun = true ; if ( iInterp == NULL ) { iInterp = initInterpreter() ; } if ( iInterp != NULL ) { if(initTk(iInterp) && initExtensions(iInterp) && initProgram(iInterp) ) { bool mainWindowExists ( true ) ; Tcl_Time timeOut; timeOut.sec = 0; timeOut.usec = 100000; // 10/s while ( mainWindowExists ) { if ( Tcl_EvalEx(iInterp, "set caTopLevelExistence [ $safeInterp eval \"winfo exists .\"]", -1,TCL_EVAL_GLOBAL) == TCL_OK ) { const char* tclResultCStr (Tcl_GetVar2(iInterp,"caTopLevelExistence",NULL,0) ) ; if ( !( tclResultCStr && *tclResultCStr == '1') ) { mainWindowExists = false ; } } else { mainWindowExists = false ; } if ( mainWindowExists == true && iNeedsToRun == false && iInterp ) { Tcl_EvalEx(iInterp, "$safeInterp eval exit", -1,TCL_EVAL_GLOBAL) ; iNeedsToRun =true ; // set flag back on, one "exit" should suffice } else { // running continues, check if we have anything // in queue bool qEmpty(false) ; bool notifyQEmpty(false) ; iModel.lock() ; qEmpty = iScriptQueue.isEmpty() ; notifyQEmpty = iAddedDataModelItems.isEmpty() ; iModel.unlock() ; if ( qEmpty == false || notifyQEmpty == false ) { const char* safeInterpCStr ( Tcl_GetVar2(iInterp,"safeInterp",NULL,0 ) ) ; Tcl_Interp* safeInterp ( Tcl_GetSlave(iInterp, safeInterpCStr ) ) ; if ( safeInterp ) { if ( qEmpty == false ) { iModel.lock() ; QString script ( iScriptQueue.dequeue() ) ; iModel.unlock() ; Tcl_Preserve(safeInterp); int evalResult = Tcl_EvalEx(safeInterp, script.toUtf8().constData(), -1,TCL_EVAL_GLOBAL) ; if (Tcl_InterpDeleted(safeInterp)) { iNeedsToRun = false ; } Tcl_Release(safeInterp); if ( evalResult == TCL_OK ) { emit consoleOutput("OK") ; } else { QString errorMessage ( QString::fromUtf8( Tcl_GetStringResult(safeInterp)) ) ; QLOG_STR(errorMessage) ; emit consoleOutput(errorMessage) ; } } if ( notifyQEmpty == false && iNeedsToRun ) { notifyInterpreterOfContentReceived ( safeInterp ) ; } } } } QCoreApplication::processEvents() ; Tcl_WaitForEvent(&timeOut) ; int workDone = 1 ; do { workDone = Tcl_DoOneEvent(TCL_DONT_WAIT); // QLOG_STR("Tcl_DoOneEvent done " + QString::number(workDone)) ; } while ( workDone != 0 ) ; } // end of while ( mainWindow ) if ( iInterp ) { int evalRet = Tcl_EvalEx(iInterp, "destroy [ winfo children . ]",-1, TCL_EVAL_GLOBAL) ; if ( evalRet != TCL_OK ) { QString errorMessage ( Tcl_GetStringResult(iInterp) ) ; QLOG_STR(errorMessage) ; } else { int workDone = 1 ; do { workDone = Tcl_DoOneEvent(TCL_DONT_WAIT); QLOG_STR("Tcl_DoOneEvent at end " + QString::number(workDone)) ; } while ( workDone != 0 ) ; } } } } if ( iInterp != NULL ) { Tcl_DeleteInterp(iInterp) ; iInterp = NULL ; } if ( iDeleteLater ) { QLOG_STR("TclWrapper::run calls deleteLater()") ; deleteLater() ; } iMainWindowTitle = KMainWindowTitle ; iModel.lock() ; iModel.threadTerminationCleanup(this) ; iModel.unlock() ; LOG_STR("TclWrapper::run out") ; QCoreApplication::processEvents() ; } void TclWrapper::stopScript(bool aDeleteLater) { iNeedsToRun = false ; if ( ( iInterp == NULL || isRunning() == false ) && aDeleteLater ) { QLOG_STR("TclWrapper::stopScript calls deleteLater()") ; deleteLater() ; } else { if ( aDeleteLater ) { iDeleteLater = true ; msleep(1000) ; } } } void TclWrapper::showConsole() { QLOG_STR("TclWrapper::showConsole") ; if ( !iConsole ) { iConsole = new TclConsoleDialog(iController.frontWidget(), iController) ; if ( iConsole ) { connect(iConsole, SIGNAL(rejected()), this, SLOT(consoleClosed()), Qt::QueuedConnection) ; connect(iConsole, SIGNAL(evalScript(QString,QString*)), this, SLOT(evalScript(QString,QString*)), Qt::QueuedConnection) ; connect(this, SIGNAL(consoleOutput(QString)), iConsole, SLOT(consoleOutput(QString)), Qt::QueuedConnection) ; iConsole->show() ; } } else { iConsole->setFocus(Qt::MenuBarFocusReason) ; } } // see also method notifyInterpreterOfContentReceived void TclWrapper::notifyOfContentReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfReceivedContent ) { iModel.lock() ; QPair addedItem ( aHashOfContent, aTypeOfReceivedContent ) ; if ( isRunning() ) { iAddedDataModelItems.enqueue(addedItem) ; } iModel.unlock() ; } // see also method notifyOfContentReceived. void TclWrapper::notifyInterpreterOfContentReceived(Tcl_Interp* aInterp) { bool isQueueEmpty ( false ) ; do { iModel.lock() ; QPair item ( iAddedDataModelItems.dequeue() ) ; iModel.unlock() ; QString protocolItemType ; switch ( item.second ) { case ClassifiedAd: case ClassifiedAdPublish: case ClassifiedAd2NdAddr: protocolItemType = "classified-ad" ; break ; case PrivateMessage: case PrivateMessagePublish: protocolItemType = "private-message" ; break ; case BinaryBlob: case BinaryFilePublish: protocolItemType = "binary-file" ; break ; case UserProfile: case UserProfilePublish: protocolItemType = "operator-profile" ; break ; case UserProfileComment: case ProfileCommentPublish: case UserProfileCommentsForProfile: protocolItemType = "profile-comment" ; break ; case DbRecord: case DbRecordPublish: protocolItemType = "dbrecord" ; break ; default: QLOG_STR("Unhandled protocol item type in TclWrapper::notifyInterpreterOfContentReceived " + QString::number(item.second)) ; } if ( protocolItemType.isEmpty() == false ) { QString notifyCommand = QString("dataItemChanged %1 %2") .arg(item.first.toString()) .arg(protocolItemType) ; Tcl_Preserve(aInterp); Tcl_EvalEx(aInterp, notifyCommand.toUtf8().constData() ,-1, TCL_EVAL_GLOBAL) ; if (Tcl_InterpDeleted(aInterp)) { iNeedsToRun = false ; } Tcl_Release(aInterp); } iModel.lock() ; isQueueEmpty = iAddedDataModelItems.isEmpty() ; iModel.unlock() ; } while ( isQueueEmpty == false ) ; } void TclWrapper::consoleClosed() { QLOG_STR("TclWrapper::consoleClosed") ; iConsole = NULL ; } void TclWrapper::setScript(const QString& aScript) { iTCLScript = aScript ; } void TclWrapper::evalScript(QString aScript, QString* aWindowTitle ) { QLOG_STR("TclWrapper::evalScript") ; if ( aWindowTitle && aWindowTitle->length() > 0 ) { iMainWindowTitle = *aWindowTitle ; } if ( aScript.length() > 0 ) { if ( !isRunning() ) { setScript(aScript) ; start() ; } else { iModel.lock() ; iScriptQueue.enqueue(aScript) ; iModel.unlock() ; } } } Tcl_Interp* TclWrapper::initInterpreter() { Tcl_Interp* retval (Tcl_CreateInterp()) ; if ( retval ) { QString argv0 = QCoreApplication::arguments()[0] ; QLOG_STR("TclWrapper::initInterpreter argv0 " + argv0) ; Tcl_FindExecutable(argv0.toLatin1().constData()) ; int errorCode ( 0 ) ; if((errorCode = Tcl_Init(retval) ) == TCL_ERROR) { QLOG_STR("Tcl_init returns TCL_ERROR?") ; emit error(MController::TCLEvalError, "Tcl_Init:" + QString::number(errorCode)) ; Tcl_DeleteInterp(retval) ; retval = NULL ; } else { Tcl_SetSystemEncoding(retval,"utf-8") ; Tcl_SetVar(retval,"windowTitleStr",iMainWindowTitle.toUtf8().constData(), 0) ; QString initialization("package require Tk\n" "wm title . $windowTitleStr\n" "set w .safeTkFrame\n" "frame $w -container 1;\n" "pack .safeTkFrame -fill both -expand yes\n" "set topLevelWindowId [winfo id $w]\n") ; errorCode = Tcl_EvalEx(retval,initialization.toUtf8().constData() ,-1, TCL_EVAL_GLOBAL) ; QLOG_STR("Tk init " + QString::number(errorCode)) ; if ( errorCode != TCL_OK ) { QString errorMessage ( Tcl_GetStringResult(retval) ) ; QLOG_STR(errorMessage) ; emit error(MController::TCLEvalError, errorMessage) ; Tcl_DeleteInterp(retval) ; retval = NULL ; } } } return retval ; } bool TclWrapper::initTk(Tcl_Interp* aInterp) { if ( iTCLScript.length() > 0 ) { Tk_GetNumMainWindows() ; Tcl_SetVar(aInterp,"unTrustedScript",iTCLScript.toUtf8().constData(), 0) ; int evalRet = Tcl_EvalEx(aInterp, "set safeInterp [safe::interpCreate]\nsafe::loadTk $safeInterp -use $topLevelWindowId\n",-1, TCL_EVAL_GLOBAL) ; if ( evalRet == TCL_OK ) { return true ; // script should be running.. } else { QString errorMessage ( Tcl_GetStringResult(aInterp) ) ; QLOG_STR(errorMessage) ; emit error(MController::TCLEvalError, errorMessage) ; return false ; } } else { return false ; // no script to run } } bool TclWrapper::initExtensions(Tcl_Interp* aInterp) { if (Tcl_PkgProvide(aInterp, "classified-ads", CLASSIFIED_ADS_VERSION) == TCL_ERROR) { return false; } const char* safeInterpCStr ( Tcl_GetVar2(iInterp,"safeInterp",NULL,0 ) ) ; Tcl_Interp* safeInterp ( Tcl_GetSlave(aInterp, safeInterpCStr ) ) ; if ( safeInterp ) { Tcl_SetVar(safeInterp,"profileInUse", iController.profileInUse().toString().toUtf8().constData(), -1) ; Tcl_SetVar(safeInterp,"caVersion", CLASSIFIED_ADS_VERSION, -1) ; if (( Tcl_CreateObjCommand(safeInterp, "listProfiles", listItemsCmd, NULL, NULL) == NULL ) || (Tcl_CreateObjCommand(safeInterp, "listAds", listItemsCmd, NULL, NULL) == NULL ) || (Tcl_CreateObjCommand(safeInterp, "listComments", listItemsCmd, NULL, NULL) == NULL ) || (Tcl_CreateObjCommand(safeInterp, "getProfile", getProfileCmd, NULL, NULL) == NULL ) || (Tcl_CreateObjCommand(safeInterp, "getClassifiedAd", getClassifiedAdCmd, NULL, NULL) == NULL ) || (Tcl_CreateObjCommand(safeInterp, "getProfileComment", getProfileCommentCmd, NULL, NULL) == NULL ) || (Tcl_CreateObjCommand(safeInterp, "getBinaryFile", getBinaryFileCmd, NULL, NULL) == NULL ) || (Tcl_CreateObjCommand(safeInterp, "getDbRecord", getDbRecordCmd, NULL, NULL) == NULL ) || (Tcl_CreateObjCommand(safeInterp, KTCLCommandPublishFile, publishItemCmd, NULL, NULL) == NULL )|| (Tcl_CreateObjCommand(safeInterp, KTCLCommandPublishProfile, publishItemCmd, NULL, NULL) == NULL )|| (Tcl_CreateObjCommand(safeInterp, KTCLCommandPublishProfileComment, publishItemCmd, NULL, NULL) == NULL )|| (Tcl_CreateObjCommand(safeInterp, KTCLCommandPublishClassifiedAd, publishItemCmd, NULL, NULL) == NULL )|| (Tcl_CreateObjCommand(safeInterp, KTCLCommandSHA1, sha1Cmd, NULL, NULL) == NULL )|| (Tcl_CreateObjCommand(safeInterp, KTCLCommandStore, storeTCLProgLocalDataCmd, NULL, NULL) == NULL )|| (Tcl_CreateObjCommand(safeInterp, KTCLCommandRetrieve, retrieveTCLProgLocalDataCmd, NULL, NULL) == NULL )|| (Tcl_CreateObjCommand(safeInterp, KTCLCommandOpen, openFileCmd, NULL, NULL) == NULL )|| (Tcl_CreateObjCommand(safeInterp, KTCLCommandSave, saveFileCmd, NULL, NULL) == NULL )|| (Tcl_CreateObjCommand(safeInterp, KTCLCommandIsProfileTrusted, isProfileTrustedCmd, NULL, NULL) == NULL )|| (Tcl_CreateObjCommand(safeInterp, KTCLCommandPublishDbRecord, publishItemCmd, NULL, NULL) == NULL )) { QLOG_STR("Could not create command listProfiles") ; return false ; } else { QLOG_STR("listProfilesImpl created") ; // then set up standard output from the safe interpreter. // while not strictly necessary, it might be great help // in debugging tcl scripts. stdOutChannel.typeName = KStdOutChannelName ; stdOutChannel.version = TCL_CHANNEL_VERSION_2; stdOutChannel.closeProc = closeProc ; stdOutChannel.inputProc = inputProc ; stdOutChannel.outputProc = outputProc ; stdOutChannel.seekProc = NULL; stdOutChannel.setOptionProc = NULL; stdOutChannel.getOptionProc = NULL; stdOutChannel.watchProc = watchProc ; stdOutChannel.getHandleProc = getHandleProc ; stdOutChannel.close2Proc = NULL; stdOutChannel.blockModeProc = NULL; stdOutChannel.flushProc = NULL; stdOutChannel.handlerProc = NULL; stdOutChannel.wideSeekProc = NULL; stdOutChannel.threadActionProc = NULL; stdOutChannel.truncateProc = NULL; Tcl_Channel stdOutTclChannel = Tcl_CreateChannel(&stdOutChannel, KStdOutChannelName, (ClientData *)KStdOutChannelName, TCL_WRITABLE) ; Tcl_SetStdChannel(stdOutTclChannel, TCL_STDOUT) ; Tcl_RegisterChannel(safeInterp,stdOutTclChannel ) ; Tcl_SetChannelBufferSize(stdOutTclChannel, 0); // no buffer Tcl_EvalEx(aInterp, "fconfigure stdout -buffering none\ninterp share {} stdout $safeInterp",-1, TCL_EVAL_GLOBAL) ; // same for stderr: stdErrChannel.typeName = KStdErrChannelName ; stdErrChannel.version = TCL_CHANNEL_VERSION_2; stdErrChannel.closeProc = closeProc ; stdErrChannel.inputProc = inputProc ; stdErrChannel.outputProc = outputProc ; stdErrChannel.seekProc = NULL; stdErrChannel.setOptionProc = NULL; stdErrChannel.getOptionProc = NULL; stdErrChannel.watchProc = watchProc ; stdErrChannel.getHandleProc = getHandleProc ; stdErrChannel.close2Proc = NULL; stdErrChannel.blockModeProc = NULL; stdErrChannel.flushProc = NULL; stdErrChannel.handlerProc = NULL; stdErrChannel.wideSeekProc = NULL; stdErrChannel.threadActionProc = NULL; stdErrChannel.truncateProc = NULL; Tcl_Channel stdErrTclChannel = Tcl_CreateChannel(&stdErrChannel, KStdErrChannelName, (ClientData *)KStdErrChannelName, TCL_WRITABLE) ; Tcl_SetStdChannel(stdErrTclChannel, TCL_STDERR) ; Tcl_RegisterChannel(safeInterp,stdErrTclChannel ) ; Tcl_SetChannelBufferSize(stdErrTclChannel, 0); // no buffer Tcl_EvalEx(aInterp, "fconfigure stderr -buffering none\ninterp share {} stderr $safeInterp",-1, TCL_EVAL_GLOBAL) ; // if there are errors in event loop, forward them to stderr, // in a way suggested by hypnotoad at #tcl: Tcl_EvalEx(safeInterp, "proc bgerror message { puts stderr $message ; puts $::errorInfo }",-1, TCL_EVAL_GLOBAL) ; // create empty procedure for receiving notifications // about datamodel content changes Tcl_EvalEx(safeInterp, "proc dataItemChanged { itemHash itemType } {\n" "}\n",-1, TCL_EVAL_GLOBAL) ; // set (useful) variables Tcl_SetVar(safeInterp, "::systemLocale", QLocale::system().name().toUtf8().constData(), 0) ; Tcl_SetVar(safeInterp, "::classifiedAdsVersion", CLASSIFIED_ADS_VERSION, 0) ; // and finally set keyboard input focus Tcl_EvalEx(safeInterp, "focus .", -1, TCL_EVAL_GLOBAL) ; } } else { QLOG_STR("Could not find slave interpreter") ; return false ; } return true; } bool TclWrapper::initProgram(Tcl_Interp* aInterp) { if ( iTCLScript.length() > 0 ) { Tcl_SetVar(iInterp,"unTrustedScript",iTCLScript.toUtf8().constData(), 0) ; int evalRet = Tcl_EvalEx(aInterp, "$safeInterp eval $unTrustedScript",-1, TCL_EVAL_GLOBAL) ; if ( evalRet == TCL_OK ) { return true ; // script should be running.. } else { QString errorMessage ( Tcl_GetStringResult(aInterp) ) ; QLOG_STR(errorMessage) ; emit error(MController::TCLEvalError, errorMessage) ; return false ; } } else { return false ; // no script to run } } // static method int TclWrapper::listItemsCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { return controllerInstanceEx->tclWrapper() .iTclCallbacks->listItemsCmdImpl(aCData, aInterp, aObjc, aObjv) ; } // static method int TclWrapper::getProfileCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { return controllerInstanceEx->tclWrapper() .iTclCallbacks->getProfileCmdImpl(aCData, aInterp, aObjc, aObjv) ; } // static method for getting an ad. called by interpreter that does not // know about object instances, just forwards the call to non-static // method via global controller instance int TclWrapper::getClassifiedAdCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { return controllerInstanceEx->tclWrapper() .iTclCallbacks->getClassifiedAdCmdImpl(aCData, aInterp, aObjc, aObjv) ; } // * static method for getting one profile comment int TclWrapper::getProfileCommentCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { return controllerInstanceEx->tclWrapper() .iTclCallbacks->getProfileCommentCmdImpl(aCData, aInterp, aObjc, aObjv) ; } int TclWrapper::getBinaryFileCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { return controllerInstanceEx->tclWrapper() .iTclCallbacks->getBinaryFileCmdImpl(aCData, aInterp, aObjc, aObjv) ; } // static method int TclWrapper::publishItemCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { return controllerInstanceEx->tclWrapper() .iTclCallbacks->publishItemCmdImpl(aCData, aInterp, aObjc, aObjv) ; } // static method int TclWrapper::sha1Cmd(ClientData /* aCData */, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { if ( aObjc != 2 ) { Tcl_AppendResult(aInterp, "Usage: calculateSHA1 string", NULL); return TCL_ERROR ; } unsigned char* bytes (NULL); QByteArray b ; int length ; if ( ( bytes = Tcl_GetByteArrayFromObj(aObjv[1], &length) ) != NULL && length > 0 ) { b.append(reinterpret_cast(bytes), length) ; } else { Tcl_AppendResult(aInterp, "Could not get string content?", NULL); return TCL_ERROR ; } Hash h ; h.calculate(b) ; Tcl_AppendResult(aInterp, h.toString().toUtf8().constData(), NULL); return TCL_OK ; } // static method int TclWrapper::storeTCLProgLocalDataCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { return controllerInstanceEx->tclWrapper() .iTclCallbacks->storeTCLProgLocalDataImpl(aCData, aInterp, aObjc, aObjv) ; } // static method int TclWrapper::retrieveTCLProgLocalDataCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { QLOG_STR("TclWrapper::retrieveTCLProgLocalDataCmd in") ; return controllerInstanceEx->tclWrapper() .iTclCallbacks->retrieveTCLProgLocalDataImpl(aCData, aInterp, aObjc, aObjv) ; } // static method int TclWrapper::openFileCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { QLOG_STR("TclWrapper::openFileCmd in") ; return controllerInstanceEx->tclWrapper() .iTclCallbacks->openFileImpl(aCData, aInterp, aObjc, aObjv) ; } // static method int TclWrapper::saveFileCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { QLOG_STR("TclWrapper::saveFileCmd in") ; return controllerInstanceEx->tclWrapper() .iTclCallbacks->saveFileImpl(aCData, aInterp, aObjc, aObjv) ; } // static method int TclWrapper::isProfileTrustedCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { QLOG_STR("TclWrapper::isProfileTrustedCmd in") ; return controllerInstanceEx->tclWrapper() .iTclCallbacks->isProfileTrustedImpl(aCData, aInterp, aObjc, aObjv) ; } int TclWrapper::closeProc( ClientData /* aInstanceData */, Tcl_Interp * /* aInterp */ ) { // If the close operation is successful, the procedure should return zero QLOG_STR("TclWrapper::closeProc") ; return 0 ; } /** * this method may be used to write data to tcl interpreter. */ int TclWrapper::inputProc( ClientData /* aInstanceData */, char * /* aBuf */, int /* aBufSize */, int * /* aErrorCodePtr */) { // we don't actualy write anything to interpreter, not via this channel QLOG_STR("TclWrapper::inputProc") ; return 0 ; } /** * output from tcl interpreter comes to this method. Note this * method is not static, but called from static method outputProc() */ int TclWrapper::outputProcImpl( ClientData /* aInstanceData */, const char *aBuf, int aToWrite, int * /* aErrorCodePtr */) { if ( aToWrite > 0 ) { if ( *aBuf == '\n' ) { QString output ( QString::fromUtf8(iStdOutBuffer) ) ; QLOG_STR("TclWrapper::stdout " + output) ; emit consoleOutput(output) ; // signal usually connected to console dlg iStdOutBuffer.clear() ; } else { iStdOutBuffer.append(aBuf, aToWrite) ; } } return aToWrite ; } int TclWrapper::outputProc( ClientData aInstanceData , const char *aBuf, int aToWrite, int * aErrorCodePtr ) { return controllerInstanceEx->tclWrapper().outputProcImpl(aInstanceData, aBuf, aToWrite, aErrorCodePtr) ; } void TclWrapper::watchProc( ClientData /* instanceData */, int /* mask */ ) { QLOG_STR("TclWrapper::watchProc") ; } int TclWrapper::getHandleProc( ClientData /*aInstanceData*/, int /*aDirection*/, ClientData * /* aHandlePtr */) { QLOG_STR("TclWrapper::getHandleProc") ; return TCL_ERROR ; // no meaningful "handle" concept here } int TclWrapper::getDbRecordCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) { return controllerInstanceEx->tclWrapper() .iTclCallbacks->getDbRecordCmdImpl(aCData, aInterp, aObjc, aObjv); } classified-ads-0.13/tcl/tclWrapper.h000066400000000000000000001232571331670245300174040ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef TCLWRAPPER_H #define TCLWRAPPER_H #include #include #include "../mcontroller.h" #include class Model ; class MController ; class TclConsoleDialog ; class TclCallbacks ; /** * @brief Class providing TCL interpreter services * * This class wraps [TCL](http://www.tcl.tk) interpreter in * [safe mode](https://www.tcl.tk/man/tcl8.6/TclCmd/safe.htm). * This class is intended to be used so that, this * is instantiated once and deleted at application shutdown. * One TCL program may be running at same time - restriction of * Tk is that one instance per process only. * * This is a thread and it is supposed to be used so that * class is instantiated, setScript() method is called, * followed by start(). Start may be called multiple times, * calling start() when thread is already executing has * no effect. In user interface user may open the TCL * console dialog from menu, commands typed are evaluated * using an interpreter. In addition to "ad-hoc" commands * to interpreter, a program text may be stored into * TCL program library. * * Classified-ads implements a local data storage for TCL * programs but a precondition for its successful usage is * that program being run has been previously stored into * TCL program library of classified ads. Reason for this * the underlying database implementation: each program may * have its own local data but for being able to associate * the program with the data, the program must be stored * first. Longer TCL program may be typed directly into * "TCL Programs" dialog but for really long programs it * is naturally easier to use a proper code-editor and then * just copy-paste the code in classified-ads as it does not * implement a proper code-editor, just a "normal" text editor. * TCL interpreter output for debugging purposes may be seen * at "TCL Interpreter" dialog in the UI. Stdout+stderr of * the interpreter are directed there. At time of writing there * is known issue with very long output lines and output lines * containing non-ASCII7 -characters like accented characters * of finnish language. Using those will not stop the interpreter * or program but will break interpreter output. * * In addition to standard safe-mode-TCL/TK this wrapper * introduces several TCL extension commands for accessing * features implemented uniquely by classified-ads software. * These features include for example search, fetch and post * of an classified ad. List of additional commands is * * TCL command | Purpose * --------------------------------------- | ------------- * [listProfiles](@ref listProfilesLabel) | Returns list of profile id's matching given conditions * [listComments](@ref listCommentsLabel) | Returns list of profile comment id's matching given conditions * [listAds](@ref listAdsLabel) | Returns list of classified ad id's matching given conditions * [getProfile](@ref getProfileLabel) | Returns profile details by id * [getProfileComment](@ref getCommentLabel)| Returns profile comment by id * [getClassifiedAd](@ref getAdLabel) | Returns classified ad by id * [getBinaryFile](@ref getFileLabel) | Returns binary file by id * [getDbRecord](@ref getDbRecordLabel) | Returns database records by query * [publishFile](@ref pFileLabel) | Publishes a binary file to DHT for other operators to retrieve * [publishProfile](@ref pPLabel) | Publishes operators profile * [publishProfileComment](@ref pPCLabel) | Publishes a new comment regarding some operator * [publishClassifiedAd](@ref pAdLabel) | Publishes a new classified ad * [publishDbRecord](@ref pDbRecordLabel) | Publishes a new or updated database record * [calculateSHA1](@ref calcSHA1Label) | Command for calculating SHA1 hash * [storeLocalData](@ref storeDLabel) | Stores data into local storage in operators computer * [retrieveLocalData](@ref retrieveDLabel) | Retrieves TCL-program specific data prevously saved * [openFileSystemFile](@ref openFSFLabel) | Opens file from local file system * [saveFileSystemFile](@ref saveSFFLabel) | Saves file to local file system * [isProfileTrusted](@ref isPTrustedLabel) | Performs look-up to operator trust-tree * * Longer documentation of each command follows. * * listProfiles {#listProfilesLabel} * ============ * Basic usage of listProfiles is * ``` * set profileList [ listProfiles foobar ] * ``` * after which profileList contans a (possibly empty) array of * profile idenfiers. The search condition here is the word * "foobar" that is used to match profiles from search index. * Returned list is list of dictionaries. Each dictionary * has as its key profile address (SHA1) and in its value the * "display name" of the profile, that is human-readable combination * of profile address, nickname, given and family names. * * The search engine in use is the powerful full-text-search (FTS) * feature of the sqlite database. It is well documented in * [SQLite documentation](https://www.sqlite.org/fts3.html). * For a profile to be indexed for search purposes, it must be * a public profile. The fields that are put into index are * * profile address (SHA1 identifier), field name = profilehash * * nickname, field name = nickname * * greeting text, field name = greetingtext * * first name, field name = firstname * * family name, field name = familyname * * city, field name = city * * btc wallet address, field name = btc * * state, field name = state * * Example queries include * ``` * set profileList [ listProfiles {a*} ] * ``` * that set value of `profileList` to contain every profile from local * storage that in some indexed field contains a word that begins * with letter "a". * ``` * set profileList [ listProfiles {Suomi Finland} ] * ``` * that returns every profile that in some indexed field * contain word "Suomi" and also word "Finland". If only * "Suomi" or "Finland" is present, profile is not returned * ``` * set profileList [ listProfiles {Suomi OR Finland} ] * ``` * that returns every profile that in some indexed field * contain word "Suomi" or word "Finland". * ``` * set profileList [ listProfiles {nickname:s*} ] * ``` * Returns profiles that in nickname field have a word that * begins with letter "s". Example content of $profileList from such a * query might be for example * * ``` * {1D2CB451BD348B12BA39316499F5AF6D53ACEECF Simo} * {22C13DCF54C8D9E6148C834E601683DD894FCBF5 {Elmeri Sukeltaja}} * {52F79319C034BA9939E930A5BD812B6CBE5DF2DD {Susanna K}} * ``` * * Search is performed on local data only * * listComments {#listCommentsLabel} * ============ * listComments is similar in function as command * [listProfiles](@ref listProfilesLabel) but it returns profile * comments instead. * ``` * set commentList [ listComments foobar ] * ``` * Would return every profile comment with word foobar in text. * Indexed fields are * * Commented profile identifier (SHA1), field name = profilehash * * Author profile identifier (SHA1), field name = commentorhash * * Comment text , field name = comment * * Comment subject line, field name = commentsubject * * Nickname of autoher, field name = commentornickname * * Results are returned in same manner, as a list of dictionaries * where key is the comment SHA1 identifier and value is * comment subject. * * listAds {#listAdsLabel} * ============ * listAds is similar in function as command * [listProfiles](@ref listProfilesLabel) but it returns identifiers * of classified ads instead. * ``` * set adList [ listAds computer ] * ``` * Would return every classified ad with word computer in any indexed field. * Indexed fields are * * Author profile identifier (SHA1), field name = senderhash * * Author profile display name, field name = sendername * * Subject, field name = subject * * Text of the ad, field name = text * * Results are returned in same manner, as a list of dictionaries * where key is the SHA1 identifier of the classified ad and value is * ad subject. * * getProfile {#getProfileLabel} * ============ * getProfile returns details of operator profile. Argument is the * SHA1 identifier of the profile. Profile is returned as a dictionary * where keys are mapped to their values. * ``` * set p [ getProfile $profileIdentifier ] * ``` * The keys in the dictionary are the following * * * Key | Description of the value * ------------------ | ---------------------------------- * displayName | Human-readable name of profile * fingerPrint | Profile SHA1 address * greetingText | Operator greeting text * firstName | Operator given name * familyName | Operator family name * cityCountry | Operator city/country * timeOfPublish | Time of last publish, as seconds since 1-Jan-1970 * isPrivate | Boolean indicating if profile is private * imagePNG | Image data of profile picture * BTCAddress | BTC wallet address of the operator * stateOfTheWorld | Situation with the world, as perceived by the operator * profileReaders | List of profiles readers, value is list of operator profiles * sharedFiles | List of files shared by profile, value is list of file SHA1 identifiers * trustList | List of profiles publicly trusted by this operator * * Every field may be omitted from dictionary if there is no value. * Value is always present in fields fingerPrint, isPrivate, timeOfPublish * and displayName. Note that operators own profile may not have been * published at all and for this reason getting operators own profile * may fail. Inside TCL programs the current profile SHA1 is stored in * global variable `::profileInUse` so command `getProfile $::profileInUse` * should always return details of operators own profile, if published. * * getProfileComment {#getCommentLabel} * ============ * getProfileComment returns single comment to some operators profile. * Argument is the SHA1 identifier of the comment as returned by * [listComments](@ref listCommentsLabel) command. Comment is returned * as a dictionary where keys are mapped to their values. * ``` * set c [ getProfileComment $commentIdentifier ] * ``` * The keys in the dictionary are the following * * Key | Description of the value * ---------------------- | ---------------------------------- * fingerPrint | Comment SHA1 identifier * fingerPrintOfCommented | SHA1 identifier of the operator that comment concerns * fingerPrintOfSender | SHA1 identifier of the author of the comment * timeOfPublish | Time of comment publish, as seconds since 1-Jan-1970 * isPrivate | Boolean indicating if comment is private * senderName | Display name of profile of author of comment * subject | Comment subject * messageText | Comment text in html format * plainMessageText | Comment text in plain text * replyTo | SHA1 id of comment that this comments is a reply to * attachedFiles | List of files attached to this comment, value is list of file SHA1 identifiers * * getClassifiedAd {#getAdLabel} * ============ * getClassifiedAd is similar in function to [getProfileComment](@ref getCommentLabel) * command but it returns an classified ad. * ``` * set a [ getClassifiedAd $SHA1Identifier ] * ``` * The keys in returned dictionary are the following * * Key | Description of the value * ---------------------- | ---------------------------------- * fingerPrint | Ad SHA1 identifier * displayName | Human-readable subject of the ad * timeOfPublish | Time of comment publish, as seconds since 1-Jan-1970 * senderName | Display name of profile of author of ad * senderHash | SHA1 identifier of author of the ad * subject | Comment subject * messageText | Comment text in html format * plainMessageText | Comment text in plain text * replyTo | SHA1 id of ad that this ad is a reply to * attachedFiles | List of files attached to this ad, value is list of file SHA1 identifiers * aboutComboboxText | In "ads" view, value of left-side classification selection combobox * concernsComboboxText | In "ads" view, value of middle classification selection combobox * inComboboxText | In "ads" view, value of right-side classification selection combobox * aboutComboBoxIndex | In "ads" view, selection index of left-side classification selection combobox * inComboBoxIndex | In "ads" view, selection index of middle classification selection combobox * concernsComboBoxIndex | In "ads" view, selection index of right-side classification selection combobox * group | Combination of "concerning.where",f.ex. "ToBeSold.Cars.UnitedStates" * * * getBinaryFile {#getFileLabel} * ============ * getBinaryFile is similar in function to [getProfileComment](@ref getCommentLabel) * command but it returns a binary file. * ``` * set f [ getBinaryFile $fileSHA1 ] * ``` * The keys in returned dictionary are the following * * Key | Description of the value * ---------------------- | ---------------------------------- * fingerPrint | Ad SHA1 identifier * timeOfPublish | Time of comment publish, as seconds since 1-Jan-1970 * mimeType | Mime-type of the file, like 'application/tcl' * description | Description of the content * owner | SHA1 of profile who published the file * contentOwner | Name (string) of possible (copyright) owner of content * license | License under which the file may be further shared * fileData | Actual binary data of the file * * getDbRecord {#getDbRecordLabel} * ============ * Classified ads has concept of shared database. It is a general-purpose * database where database records are shared between nodes in the * network. Queries to data may be made get fetch records, queries * may also be sent to neighboring nodes in the network to check * there might be any database records that would fit the query. * In C++ api fetching and retrieving of records happens via * @ref CaDbRecordModel and database-related network operations are * implemented in class @ref DbRecordRetrievalEngine. This getter * method makes a query to local database and also sends the same * query to neighboring nodes. * * Shared database has concept of "collection" and database records * in same collection are supposed to somehow logically belong * together. For example product items available from a shop might * go to one collection, purchase orders of same items might belong * to anohter collection. In classified ads collection is just * SHA1 hash that may be calculated from string data. * * Actual data content is binary data and it can not be queried. Classified * ads makes no assumptions about data content and therefore does not * try to even index the data. When [publishDbRecord](@ref pDbRecordLabel) * is called, programmer must set database record metadata so, that * record may be later successfully found. At simplest form a word * describing the content is included in metadata - for example if * there is pet-shop operating inside classified ads, it might have * animals for sale and rent and while publishing the product listing * the indexed metadata of records might contain word "cow" for each * db recort that in binary data blob contains details about particular * cow for sale or rent - end-user may then perform a query regarding * cows in this particular product collection and end up with 0 or more * bovines. * * Queries may be done in several ways but basic form is * * ``` * dict set criteria collectionId [ calculateSHA1 {Pet-shop products} ] * dict set criteria searchPhrase cow * set recordsFound [ getDbRecord $criteria ] * ``` * That would return all records from collection "Pet-shop products" * and that contain word "cow" in search text. The criteria is a * tcl dictionary, the database records are returned as a list of * dictionaries. Content of dictionaries is detailed below. * * Search dictionary key | Value * ------------------------- | ------------- * recordId | Simplest query. If record SHA1 id is known, this fetches the record * collectionId | Specifies collection SHA1. Only mandatory value. * senderId | Operator address SHA1. Include only records from this operator * searchPhrase | Searchphrase in [SQLite FTS](https://www.sqlite.org/fts3.html) format * searchNumber | Returns records having exactly this indexed integer * searchNumberLessThan | Returns records where search number is smaller than given number * searchNumberMoreThan | Returns records where search number is greater than given number * * Idea behind searchPhrase and searchNumber is that when record is * stored (published) programmer may assign a text and a number to the * record. Phrase is just text, it may contain several words and it * is indexed with Sqlite FTS method. Records may then be queried * using the FTS that goes along the database record database table. * Example usage would go like this: * ``` * dict set criteria collectionId [ calculateSHA1 {Pet-shop products} ] * dict set criteria searchPhrase {cow priceCategory3*} ] * dict set criteria searchNumberLessThan 15 ] * set recordsFound [ getDbRecord $criteria ] * ``` * All conditions in the criteria must be met for each record to be included. * In above example the pet-shop products are queried regarding records * that previously have been assigned a search number with value less than * 15 and published with a search phrase that contains both words "cow" * and another word that begins with "priceCategory3". * * Records are returned in TCL list containing dictionaries. Each dictionary * presents one record in the database. Keys in the returned dictionary * are the following * Db record dictionary key | Value * ------------------------- | ------------- * recordId | Record identifier. Used together with senderId uniquely identifies the record * collectionId | Specifies collection SHA1. * senderId | SHA1 address of operator who published the record * searchPhrase | Original search phrase * searchNumber | Original search number * data | Actual payload of the record - any binary data * isSignatureVerified | Boolean indicating record RSA signature was checked agaist key of senderId * recordRecipients | List of operator SHA1 addresses to whom the record was encrypted to * encrypted | Boolean indicating if record was published encrypted * timeOfPublish | Time when record was published as seconds since 01-Jan-1970 * * As the API to the shared database here is implemented as set of * TCL commands, it is easiest to carry the actual payload (member "data" in * dictionary) in some TCL data structure like list or dictionary but * that is naturally up to programmer to decide. In underlying storage * the database data is stored in zlib-compressed format so trying to * compress the content prior to publish usually makes situation worse. After * compression the data must fit limits set by DHT implementation of * classified ads, meaning maximum size slightly less than 2 megabytes * per record. For application processing larger amounts of data the * data must be split into smaller records. * * It is also worth noting that database content can really be anything. * Database records can originate from any operator, regardless of collection. * Implementation can not guarantee any format regarding actual data * in the records. Bugs in TCL program implementations will result * in faulty data records being published so extreme care is in order * while parsing the database record contents. There are numerous articles * concerning TCL and untrusted input data ; special care must be taken * to prevent calls to TCL functions that would evaluate the content as * a TCL script, see [TCL wiki](http://wiki.tcl.tk/9749) for examples. * * publishFile {#pFileLabel} * ============ * This command is used to publish a binary file to DHT for other * operators to retrieve. Unlike [database records](@ref pDbRecordLabel) * there is no search function over binary files ; the file SHA1 * must be known for its retrieval later. Most often published files * are used as attachment to classified ads, profile comments and included * in list of operators shared files. * * Basic example of file publish is * ``` * dict set f fileName README.TXT * dict set f description {This is a very fine text file} * dict set f license {Creative commons CC0} * dict set f fileData {Actual content of the file is here, can be anything} * dict set f forceNoEncryption true * set fileHash [ publishFile $f ] * puts [ format {Fingerprint of README.TXT is %s} $fileHash ] * ``` * In addition to dictionary keys listed in above example it is possible * add to dictionary a list with dictionary key `fileRecipients` whose * value is a TCL list containing SHA1 addresses of operators whose * public RSA keys will be used to encrypt the file content. It is up * to programmer to ensure that RSA keys of named operators are present * in local data storage before the operation. If operators profile can * be retrieved using [getProfile](@ref getProfileLabel) then encrypting * content to be readable by that operator is likely to succeed. * * Normally file is published using operators profile settings: if operator * has private profile, files are published so that content is encrypted to * be readable only by those operators that are listed as readers of * publishing operators profile. Dictionary key `forceNoEncryption` skips * encryption always, making the file readable by all. Using * `forceNoEncryption` together with `fileRecipients` is silly. * * publishProfile {#pPLabel} * ============ * Command `publishProfile` publishes operators own profile for others * to see. It is equivalent to pressing button "publish" in "own profile" * page of user interface. * * This command is present in classified ads since v0.13. * * publishProfileComment {#pPCLabel} * ============ * Command `publishProfileComment` is equivalent to pressing the "Comment" * button on profile display UI, typing and sending the comment. * Example usage might go along following example: * ``` * # find profile fingerprint of Erkkielvis * set profiles [ listProfiles {nickname:Erkkielvis} ] * set profileFP [ dict keys [ lindex $profiles 0 ] ] * # construct a comment * set d [ dict create fingerPrintOfCommented $profileFP ] * dict set d senderName {Eino Reino Leino} * dict set d subject {Message subject goes here} * dict set d messageText {Lenghty message text and Greetings from outer space.} ] * # and send it away * set hash [ publishProfileComment $d ] * puts [ format {Fingerprint of new comment is %s} $hash ] * ``` * In addition to dictionary keys presented in above example, following keys * may be also present in the dictionary during publish. * Key | Description of the value * ---------------------- | ---------------------------------- * replyTo | SHA1 id of comment that this comment is a reply to * attachedFiles | List of files attached to this comment, value is list of file SHA1 identifiers * * In practice the attachment files must have been previously published * using [publishFile](@ref pFileLabel) command. * * publishClassifiedAd {#pAdLabel} * ============ * Command is used to send a new classified ads for whole world to see. * Usage is similar to [publishProfileComment](@ref pPCLabel) command as * the ad is first constructed as a TCL dictionary and then * given to publish command. SHA1 fingerprint of the new ad item * is returned. * * When replying to existing ad, it is important to exactly copy * the classification-related fields from replied article because * they affect the classification of the ad and user interface in * turn exclusively uses classification when searching for articles. * If classification does not match, reply very easily goes un-noticed * by readers of the original message chain. * * ``` * dict set new_ad senderName {Eino-Reino the cosmonaut} * dict set new_ad subject {Orbiting the moon is for extraordinary cows} * dict set new_ad plainMessageText {TCL is fully usable in outer space.} * dict set new_ad aboutComboboxText {Testing} * dict set new_ad concernsComboboxText {Classifed ads software} * dict set new_ad inComboboxText {Moon orbit} * set ad_hash [ publishClassifiedAd $new_ad ] * puts [ format {Fingerprint of new ad is %s} $ad_hash ] * ``` * * publishDbRecord {#pDbRecordLabel} * ============ * Before database record can be retrieved using * [getDbRecord](@ref getDbRecordLabel) it must be published in some * node in the network. DHT takes care of storing the database record * in correct nodes so that they'll be later found as queried. * In practice the collection of the record is used to determine * the network nodes that will store the record. * * Same principle that holds true all items that may be posted to * internet holds true here too: once published, it is impossible to * permanently remove the once-published content. In classified-ads * it is possible to replace database record with new content, also * with empty content but due to very nature of peer-to-peer * distributed hash table it is possible that someone somewhere still * has the old or original record. * * Classified ads distributed database has no concept of "commit" like * some relational databases. A database record is published, it is copied * to some nodes in the network and it may be queried. It is possible that * upon query not all records that since beginning of time have been * published are always returned in query if they should match, or that * the very latest record is returned. Keeping this philosophy in mind, * that classified ads distributed database is not accurate in query * results in same sense as databases that are based on client-server * principle, the applications need to be designed around this fact. * Old records that have not been queried for a very long time are simply * forgotten. On the other hand a DHT should be able to handle vast amounts * of data as each node in the network adds a little bit additional * storage and processing capacity to the whole network. * * Semantics of `searchPhrase` and `searchNumber` are already discussed in * [getDbRecord](@ref getDbRecordLabel) and usually it is very useful to * set one or both of them to some value that describes the content. * * Basic usage of publishDbRecord is * ``` * dict set recordToSave collectionId [ calculateSHA1 {Name of db collection} ] * dict set recordToSave searchPhrase {Cow cows bovines} * dict set recordToSave searchNumber 42 * dict set recordToSave encrypted false * dict set recordToSave data {This is actual record content, usually a TCL data structure} * publishDbRecord $recordToSave * ``` * The record that got published in example, can later be retrieved using * the collection id together with search number and/or phrase. If db record is * published encrypted, the readers of the current operator profile * are the readers of the record. That may be overridden using key * `recordRecipients` in dictionary, its value is list of operator SHA1 * identifiers whose public RSA keys must be present in local storage * and the db record will be made readable to those operators. * * calculateSHA1 {#calcSHA1Label} * ============ * Calculates SHA1 digest over data * ``` * set SHA1sum [ calculateSHA1 {Cow belongs to low-flying bovines} ] * ``` * * storeLocalData {#storeDLabel} * ============ * Command for storing local data works in about same manner as * [publishDbRecord](@ref pDbRecordLabel) with exception that this * data is not sent to any other node of the network. Local data * may only be retrieved from the same program that was used * to store it. Classified ads keeps local data in same db * table with the TCL program data and if program is deleted, its * local data is deleted too. If TCL program is modified and * saved again in "TCL Programs" dialog, it is still considered * same program e.g. it will find local data also after modifications. * If name of the program changes when saving the changes to TCL program, * the new program with new name is considered a new program and * its local data block is initially empty. * * ``` * set x {any binary data} * storeLocalData $x * ``` * * retrieveLocalData {#retrieveDLabel} * ============ * Command may be used to bring back data previously stored * using [storeLocalData](@ref storeDLabel) like in this example * ``` * set x [ retrieveLocalData foobar ] * puts [ format {len of local data is %d} [ string length $x ] ] * ``` * For local storage to work in meaningful way the TCL program * being run must be saved using "TCL Programs" dialog as local * data is kept in same db table with the programs that access them. * * openFileSystemFile {#openFSFLabel} * ============ * Command may be used to ask user to select a file system file * whose content will be returned as return value * ``` * set x [ openFileSystemFile ] * ``` * command may be given additional additional specifying file pattern, * like `openFileSystemFile *.png` would offer for open only files * whose name end with `.png`. * * saveFileSystemFile {#saveSFFLabel} * ============ * Command may be used to save data into file system file. * ``` * set fileContent {A cow filet in a file} * saveFileSystemFile $fileContent *.txt * ``` * Would ask user which .txt -ending file name shall be used * to store content of variable `fileContent`. * * isProfileTrusted {#isPTrustedLabel} * ============ * Does a look-up in @ref TrustTreeModel to find out if given operator * specified by SHA1 address is found from trust tree or not: * ``` * # find profile fingerprint of Maud * set profiles [ listProfiles {nickname:Maud} ] * set profileFP [ dict keys [ lindex $profiles 0 ] ] * # and do a query * puts [ format {Is Maud trusted %s} [ isProfileTrusted $profileFP ] ] * ``` * Trust-tree is populated from operators user interface where contacts * may be assigned a "public trust" value that is then used to construct * the trust tree. Operators trusted by operators in your trust-list * are considered trusted too. * */ class TclWrapper : public QThread { Q_OBJECT public: TclWrapper(Model& aModel, MController& aController); /** * Method for tearing down the interpreter */ ~TclWrapper() ; /** * stop possible running script. * * @aDeleteLater if set to true, will cause the instance to * delete itself after interpreter is deleted */ void stopScript(bool aDeleteLater = false ) ; void setScript(const QString& aScript) ; /**< TCL to evaluate, called before start */ /** * Returns the script currently being evaluated */ const QString& currentProgram() const { return iTCLScript ; } ; void showConsole() ; /**< Displays TCL interpreter console dialog */ /** * method for receiving notifications about data item * additions to data model. this is called for example when * new classified as are added. See also * @ref notifyInterpreterOfContentReceived. */ void notifyOfContentReceived(const Hash& aHashOfContent, const ProtocolItemType aTypeOfReceivedContent ) ; public slots: void run() ; signals: /** * this is not method but signal ; if in error, get emit()ted */ void error(MController::CAErrorSituation aError, const QString& aExplanation) ; /** * This slot may be connected to display of TCL interpreter * textual output */ void consoleOutput(QString aOutput) ; public slots: void consoleClosed() ; /** * this slot may be used to inject more TCL to be * interpreted * @param aScript is the TCL script to be evaluated * @param aMainWindowTitle contains optional main window title. * This is used only in case interpreter is not yet * running and this may then be used to set the title * of the tk main window during interpreter initialization. */ void evalScript(QString aScript, QString* aMainWindowTitle = NULL ) ; private: // methods /** * instantiates TCL interpreter and loads tk * @return interpreter or NULL */ Tcl_Interp* initInterpreter() ; /** * Tcl/Tk toolkit init * @return true on success */ bool initTk(Tcl_Interp* aInterp) ; /** * Initialize extensions to TCL tk provided by classified ads. * This includes accessor commands to CA data like articles, * profiles and messages. * * @return true on success */ bool initExtensions(Tcl_Interp* aInterp) ; /** * Evaluates in safe interpreter the program given by method * @ref setScript. * * @return true on success */ bool initProgram(Tcl_Interp* aInterp) ; /** * Tcl extension method: when TCL scripts asks for list of * profiles or classified ads or profile comments, it invokes * this method. See @initExtensions * where this method is added into TCL interpreters repertoire * @param aCData clientdata from tcl interpreter * @param aInterp pointer to calling TCL interpreter * @param aObjc number of items in array aObjv * @param aObjv command arguments. First is name of the command * itself, like "listProfiles" or "listAds", 2nd is search * string. * @return TCL_OK on success. As side effect it calls Tcl_SetObjResult that * is a list of dictionaries, each dictionary has fingerprint as the * key and displayName as the value. If no object matches, empty list * is returned. */ static int listItemsCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * static method for getting profile details * @param aObjv should contain 40-byte long hash-string in aObjv[1] * that tells which profile to fetch. * @param return TCL_OK if ok, the actual TCL object returned is a TCL dictionary. */ static int getProfileCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * static method for getting one classified ad * @param aObjv should contain 40-byte long hash-string in aObjv[1] * that tells which ad to fetch. * @param return TCL_OK if ok, the actual TCL object returned is a TCL dictionary. */ static int getClassifiedAdCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * static method for getting one profile comment * @param aObjv should contain 40-byte long hash-string in aObjv[1] * that tells which comment to fetch. * @param return TCL_OK if ok, the actual TCL object returned is a TCL dictionary. */ static int getProfileCommentCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * static method for getting binary file * @param aObjv should contain 40-byte long hash-string in aObjv[1] * that tells which file to fetch. * @param return TCL_OK if ok, the actual TCL object returned is a TCL dictionary. */ static int getBinaryFileCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * static method for getting db record * @param aObjv should contain dictionary expressing the search * conditions. Same dictionary keys are used that are * in use when db record is published from TCL app. * @return If db records satisfying the conditions were found from * local storage, they're returned synchronously as return * value to this call, using Tcl_SetObjResult mechanism. * Search is sent to remote nodes also and as remote nodes * return search results, new db records may be added to * database and TCL app running may receive notifications * later concerning db records originally queries but * arriving later. * @param return TCL_OK if ok, the actual TCL object returned is a TCL dictionary. */ static int getDbRecordCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * Tcl extension method for publishing an item. This will be * called by several in-TCL commands, for instance "publishFile", * "publishComment" or "publishProfile". The TCL command * will be in aObjv[0] and aObjv[1] will contain the actual * object to be published. * @param aCData clientdata from tcl interpreter. Not used. * @param aInterp pointer to calling TCL interpreter * @param aObjc number of items in array aObjv * @param aObjv command arguments. First is name of the command * itself, like "publishFile", 2nd is actual object * @return TCL_OK on success. */ static int publishItemCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * method for calculating SHA1 over a string, callable from TCL */ static int sha1Cmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * method for storing locally a bytearray from TCL */ static int storeTCLProgLocalDataCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * method for retrieving a data-blob previously stored using @ref storeTCLProgLocalData. */ static int retrieveTCLProgLocalDataCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * callback-method for saving a file to local filesystem from * tcl program. Method will open file selection dialog so user can always * cancel operation. */ static int saveFileCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * Callback-method for reading a file from local filesystem. * Method will open file selection dialog so user can always * cancel operation. */ static int openFileCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * Callback-method for checking profile in trust-tree. */ static int isProfileTrustedCmd(ClientData aCData, Tcl_Interp *aInterp, int aObjc, Tcl_Obj *const aObjv[]) ; /** * tcl channel procedures */ static int closeProc( ClientData aInstanceData, Tcl_Interp *aInterp); /** * this method may be used to write data to tcl interpreter. */ static int inputProc( ClientData aInstanceData, char *aBuf, int aBufSize, int *aErrorCodePtr); /** * output from tcl interpreter comes to this method. See * @ref outputProcImpl non-static version of this method */ static int outputProc( ClientData aInstanceData, const char *aBuf, int aToWrite, int *aErrorCodePtr); static void watchProc( ClientData instanceData, int mask); static int getHandleProc( ClientData aInstanceData, int aDirection, ClientData *aHandlePtr); /** * output from tcl interpreter comes to this method */ int outputProcImpl( ClientData aInstanceData, const char *aBuf, int aToWrite, int *aErrorCodePtr); /** * method that checks if there is anything in * iAddedDataModelItems and if yes, calls notify procedure * inside interpreter. Interpreter must have notify * procedure installed. See also @ref notifyOfContentReceived. * When this is called, there must be at least one item in * iAddedDataModelItems */ void notifyInterpreterOfContentReceived( Tcl_Interp* aInterp ) ; private: // these are not public Model& iModel ; /**< datamodel reference */ MController& iController ; Tcl_Interp *iInterp ; /**< actual TCL interpreter */ QString iTCLScript ; /**< TCL script to interpret */ bool iNeedsToRun ; /**< when set to false, will terminate TCL script */ QByteArray iStdOutBuffer ; bool iDeleteLater ; /**< When set to true, will call deleteLater() */ TclConsoleDialog* iConsole ; QQueue iScriptQueue ; QString iMainWindowTitle ; QQueue > iAddedDataModelItems ; TclCallbacks* iTclCallbacks ; } ; #endif classified-ads-0.13/testca/000077500000000000000000000000001331670245300155775ustar00rootroot00000000000000classified-ads-0.13/testca/README000066400000000000000000000014141331670245300164570ustar00rootroot00000000000000In order to successfully run the tests, first backup file $HOME/.classified_ads/sqlite_db then remove the file, then run the tests. They're not destructive but make certain assumptions and they do manipulate trust list of profile that they manage to open, if they can. If you have profile with password 'salasana' it will be used in tests. If the database is removed prior to running tests, you'll exercise also database creation code so code coverage gets slightly better .. but is still bad. After tests have been run, the database file may be safely thrown away and original moved back. If you run the test program twice, you should still get 100% pass rate but on second run it do the run using slightly different code paths because the database is already there. classified-ads-0.13/testca/mockup_controller.cpp000066400000000000000000000131561331670245300220520ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "mockup_controller.h" #include "../log.h" #include "../net/node.h" #include "../datamodel/model.h" #include "../net/networklistener.h" #include "../net/networkconnectorengine.h" #include // for getpid() #include #include "../datamodel/binaryfile.h" #include "mockup_voicecallengine.h" #include "../tcl/tclWrapper.h" MockUpController::MockUpController() : iNode(NULL), iModel(NULL), iListener(NULL), iCallEngine(NULL), iTclWrapper(NULL) { LOG_STR("MockUpController::Controller in\n") ; qRegisterMetaType("MController::CAErrorSituation"); iModel = new Model(this); iNode = new Node(iModel->nodeModel().nodeFingerPrint(), iModel->nodeModel().listenPortOfThisNode()) ; iListener = new NetworkListener (this, iModel) ; // network listener enumerates network interfaces and sets // possible ipv6 addr into iNode() -> iCallEngine = new MockUpVoiceCallEngine ; iTclWrapper = new TclWrapper(*iModel, *this) ; LOG_STR("MockUpController::Controller out\n") ; } MockUpController::~MockUpController() { LOG_STR("MockUpController::~Controller\n") ; // .. connections reference iListener. // so in order to prevent random crash at closing, lets first get rid // of connections, only after that delete iListener ; iModel->closeAllConnections(true) ; // now safe to delete listener (and net engine) delete iListener ; // will delete also connections received by listener delete iModel ; delete iNode ; delete iCallEngine ; delete iTclWrapper ; } void MockUpController::userInterfaceAction ( CAUserInterfaceRequest aRequest, const Hash& aHashConcerned, const Hash& aFetchFromNode, const QString* /*aAdditionalInformation*/ ) { LOG_STR2("MockUpController::userInterfaceAction %d\n", (int) aRequest) ; } void MockUpController::hideUI() { } void MockUpController::showUI() { } void MockUpController::exitApp() { } void MockUpController::displayAboutBox() { } void MockUpController::displayFront() { LOG_STR("displayFront\n") ; } void MockUpController::handleError(MController::CAErrorSituation aError, const QString& aExplanation) { LOG_STR2("Error enum value %d\n", aError) ; QLOG_STR(aExplanation) ; switch ( aError ) { case DataBaseNotMountable: LOG_STR("Can't open DB\n") ; break ; } return ; } Node& MockUpController::getNode() const { return *iNode ; } NetworkListener *MockUpController::networkListener() const { return iListener ; } Model& MockUpController::model() const { return *iModel ; } void MockUpController::setContentKeyPasswd(QString aPasswd) { iContentPasswd = aPasswd ; } QString MockUpController::contentKeyPasswd() const { return iContentPasswd ; } void MockUpController::setProfileInUse(const Hash& aProfileHash) { iProfileHash = aProfileHash ; } const Hash& MockUpController::profileInUse() { return iProfileHash; } void MockUpController::startRetrievingContent(NetworkRequestExecutor::NetworkRequestQueueItem aReq,bool aIsBackgroundDl, ProtocolItemType aTypeOfExpectedObject) { return ; } void MockUpController::startRetrievingContent(CaDbRecord::SearchTerms /*aSearchTerms*/) { return ; } void MockUpController::storePrivateDataOfSelectedProfile(bool /*aPublishTrustListToo*/) { return ; } void MockUpController::reStorePrivateDataOfSelectedProfile() { return ; } bool MockUpController::isContactInContactList(const Hash& aFingerPrint) const { return true ; } QString MockUpController::displayableNameForProfile(const Hash& aProfileFingerPrint) const { return "eino leino reino" ; } void MockUpController::offerDisplayNameForProfile(const Hash& aProfileFingerPrint, const QString& aDisplayName, const bool iUpdatePersistenStorage) { return ; } void MockUpController::displayFileInfoOnUi(const BinaryFile& aFileMetadata) { QLOG_STR("displayFileInfoOnUi file = " + aFileMetadata.iFileName) ; } MVoiceCallEngine* MockUpController::voiceCallEngineInterface() { return iCallEngine ; } TclWrapper& MockUpController::tclWrapper() { return *iTclWrapper ; } QString MockUpController::getFileName(bool& aSuccess, bool /*aIsSaveFile*/ , QString /*aSuggestedFileName*/) { aSuccess = true ; char fileNameBuffer[L_tmpnam+1] ; // buffer for file name, macro // L_tmpnam should be in stdio.h telling // max len of returned name. return QString(tmpnam_r(fileNameBuffer)) ; } classified-ads-0.13/testca/mockup_controller.h000066400000000000000000000153101331670245300215110ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef MOCKUP_CONTROLLER_H #define MOCKUP_CONTROLLER_H #include "../mcontroller.h" #include "mockup_model.h" class MockUpVoiceCallEngine ; class TclWrapper ; /** * @brief Controller for testing purposes only. Not included in real binary. */ class MockUpController : public MController { Q_OBJECT public: /** * constructor */ MockUpController() ; /** * Destructor */ ~MockUpController() ; /** * Method for requesting different things to take place in UI. * controller mostly routes these to FrontWidget but other actions * may be in order too.. * @param aRequest users orders * @param aHashConcerned possible hash parameter ; can be * null hash if action is not about specific hash * @return none */ virtual void userInterfaceAction ( CAUserInterfaceRequest aRequest, const Hash& aHashConcerned = KNullHash, const Hash& aFetchFromNode = KNullHash, const QString* aAdditionalInformation = NULL ) ; /** * method for hiding UI */ virtual void hideUI() ; /** * method for showing UI */ virtual void showUI() ; void setMockupModel(MockUpModel* aModel) ; /**< setter for 2nd model */ public slots: virtual void exitApp() ; /**< quitting */ virtual void displayAboutBox() ; /**< bragging */ virtual void displayFront() ; /**< this initializes the "normal" display */ /** * Method for handling errors inside application. * @param aError Reason for error call, from error enum above * @param aExplanation NULL or human-readable description about what went * wrong. */ virtual void handleError(MController::CAErrorSituation aError, const QString& aExplanation) ; /** * Method for node ; this may be changed during startup-phase * but not after that */ virtual Node& getNode() const ; /** * method for network listener ; it is parent of all connections, * also the outgoing */ virtual NetworkListener *networkListener() const ; virtual Model& model() const ; virtual void setProfileInUse(const Hash& aProfileHash) ; const Hash& profileInUse() ; virtual void setContentKeyPasswd(QString aPasswd) ; /** * method for getting gpg passwd previously set */ virtual QString contentKeyPasswd() const ; virtual void startRetrievingContent(NetworkRequestExecutor::NetworkRequestQueueItem aReq,bool aIsBackgroundDl, ProtocolItemType aTypeOfExpectedObject) ; /** * Variant of "start fetch" method that starts fetch of db records. * @param aSearchTerms Database query that fetched record should * satisfy */ virtual void startRetrievingContent( CaDbRecord::SearchTerms aSearchTerms ) ; virtual void storePrivateDataOfSelectedProfile(bool aPublishTrustListToo = false) ; virtual void reStorePrivateDataOfSelectedProfile() ; virtual bool isContactInContactList(const Hash& aFingerPrint) const; virtual QString displayableNameForProfile(const Hash& aProfileFingerPrint) const ; virtual void offerDisplayNameForProfile(const Hash& aProfileFingerPrint, const QString& aDisplayName, const bool iUpdatePersistenStorage=false) ; /** * method that puts dialog or similar on display, about a published file */ virtual void displayFileInfoOnUi(const BinaryFile& aFileMetadata) ; /** * Method for getting voice call engine. This particular implementation * will return NULL always * @return NULL */ virtual VoiceCallEngine* voiceCallEngine() { return NULL ; } /** * Method that returns a mock-up of the voice call engine. * Used for testing the call protocol parts */ virtual MVoiceCallEngine* voiceCallEngineInterface() ; /** * Getter-method for real voice call engine mock-up. After call data * methods have been called, state of this mocku-up is checked so * we can determine the success of test cases */ MockUpVoiceCallEngine* voiceCallEngineMockUp() { return iCallEngine; } /** * Method for getting tcl wrapper instance. If there is no instance * one will be created */ virtual TclWrapper &tclWrapper() ; /** * Method for getting front-widget, to be used as parent of dialogs * spawned from non-ui threads */ virtual QWidget *frontWidget() { return NULL; } ; /** * Method for getting file name. This mockup-version returns * temporary file name. * * @param aSuccess is set to true if operation ends all right. * @param aIsSaveFile if set to true, "file save" dialog is * shown, otherwise "file open" dialog. * @param aSuggestedFileName file name (pattern). If given empty, * any file is suggested in dialog, if "*.jpg" is given, then * dialog shall suggest only files with .jpg ending and * if "foobar.txt" is given, then dialog will suggest literal * file name "foobar.txt". * @return file system file name or empty if aSuccess is set to false. */ virtual QString getFileName(bool& aSuccess, bool aIsSaveFile = false , QString aSuggestedFileName = QString()) ; private: Node *iNode ; /**< our network presence object, there is single instance */ Model *iModel ; /**< data storage animal */ MockUpModel* iMockupModel ; /**< Fake data storage animal */ NetworkListener *iListener ; /**< Incoming connections handler, for ipv4 */ QString iContentPasswd ; Hash iProfileHash ; MockUpVoiceCallEngine *iCallEngine ; TclWrapper* iTclWrapper ; } ; #endif classified-ads-0.13/testca/mockup_model.cpp000066400000000000000000000126071331670245300207670ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "mockup_model.h" #include "mockup_nodemodel.h" #include "../log.h" #include "../net/node.h" #include "../datamodel/profilemodel.h" #include // library init #include // random seed things #include "../datamodel/binaryfilemodel.h" #include "../datamodel/camodel.h" #include "../datamodel/privmsgmodel.h" #include "../datamodel/profilecommentmodel.h" #include "../datamodel/searchmodel.h" #include "../datamodel/contentencryptionmodel.h" #include "../datamodel/cadbrecordmodel.h" #include "../datamodel/tclmodel.h" #include #include MockUpModel::MockUpModel( MController *aController ) : iNetworkRequests(NULL), iController(aController), iProfileModel(NULL), iBinaryFileModel(NULL), iCAModel(NULL), iPrivMsgModel(NULL), iContentEncryptionModel(NULL), iProfileCommentModel(NULL), iSearchModel(NULL), iCaDbRecordModel(NULL), iTclModel(NULL) { LOG_STR("MockUpModel::MockUpModel in\n") ; SSL_load_error_strings() ; SSL_library_init() ; QFile randomFile("/dev/urandom") ; randomFile.open(QIODevice::ReadOnly) ; QByteArray randomBytes = randomFile.read(1024) ; char *randomBytesPointer = randomBytes.data() ; RAND_seed(randomBytesPointer, 1024); iNodeModel = new MockUpNodeModel(iController) ; iProfileModel = new ProfileModel(aController, *this) ; iBinaryFileModel = new BinaryFileModel(aController, *this) ; iCAModel = new ClassifiedAdsModel(aController, *this) ; iPrivMsgModel = new PrivMessageModel(aController, *this) ; iProfileCommentModel = new ProfileCommentModel(aController, *this) ; iContentEncryptionModel = new ContentEncryptionModel(aController, *this) ; iSearchModel = new SearchModel(*this,*iController) ; iSearchModel->setObjectName("CA SearchModel test") ; iCaDbRecordModel = new CaDbRecordModel(iController, *this) ; iTclModel = new TclModel(iController, *this) ; iConnections = new QList() ; iNetReqQueue = new QList (); iDb = QSqlDatabase::addDatabase("QSQLITE", "ca-test-db") ; QString path(QDir::home().path()); path.append(QDir::separator()).append(".classified_ads"); if (!QDir(path).exists()) { QDir().mkdir(path) ; } path.append(QDir::separator()).append("sqlite_db"); path = QDir::toNativeSeparators(path); iDb.setDatabaseName(path); // Open database iDb.open() ; LOG_STR("MockUpModel::MockUpModel out\n") ; } MockUpModel::~MockUpModel() { iDb.close() ; QSqlDatabase::removeDatabase("ca-test-db") ; delete iNetworkRequests ; delete iNodeModel ; delete iProfileModel ; delete iBinaryFileModel ; delete iCAModel ; delete iPrivMsgModel ; delete iProfileCommentModel ; delete iContentEncryptionModel ; delete iSearchModel; delete iCaDbRecordModel; delete iTclModel; LOG_STR("MockUpModel::~MockUpModel\n") ; } void MockUpModel::addNetworkRequest(NetworkRequestExecutor::NetworkRequestQueueItem& aRequest) const { LOG_STR2(" MockUpModel::addNetworkRequest type %d\n", aRequest.iRequestType) ; if ( iNetworkRequests!= NULL ) { iNetworkRequests->append(aRequest) ; } } bool MockUpModel::lock() { return iMutex.tryLock(100*1000); } void MockUpModel::unlock() { iMutex.unlock() ; } MNodeModelProtocolInterface& MockUpModel::nodeModel() const { return *iNodeModel ; } ProfileModel& MockUpModel::profileModel() const { return *iProfileModel ; } BinaryFileModel& MockUpModel::binaryFileModel() const { return *iBinaryFileModel ; } ClassifiedAdsModel& MockUpModel::classifiedAdsModel() const { return *iCAModel ; } PrivMessageModel& MockUpModel::privateMessageModel() const { return *iPrivMsgModel ; } ContentEncryptionModel& MockUpModel::contentEncryptionModel() const { return *iContentEncryptionModel ; } ProfileCommentModel& MockUpModel::profileCommentModel() const { return *iProfileCommentModel ; } SearchModel* MockUpModel::searchModel() const { return iSearchModel ; } CaDbRecordModel* MockUpModel::caDbRecordModel() const { return iCaDbRecordModel ; } TclModel& MockUpModel::tclModel() const { return *iTclModel ; } QSqlDatabase MockUpModel::dataBaseConnection(bool* /* aIsFirstTime */ ) { return iDb ; } const QList & MockUpModel::getConnections() const { return *iConnections ; } QList & MockUpModel::getNetRequests() const { return *iNetReqQueue ; } classified-ads-0.13/testca/mockup_model.h000066400000000000000000000114321331670245300204270ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef MOCKUP_MODEL_H #define MOCKUP_MODEL_H #include "../mcontroller.h" #include "../datamodel/mmodelprotocolinterface.h" #include "../datamodel/mnodemodelprotocolinterface.h" #include #include class MockUpNodeModel ; class ProfileModel ; class BinaryFileModel ; class ClassifiedAdsModel ; class PrivMessageModel ; class ContentEncryptionModel ; class ProfileCommentModel ; class SearchModel; class CaDbRecordModel; /** * @brief not a real datamodel. debugging aid. */ class MockUpModel : public MModelProtocolInterface { Q_OBJECT public: /** * constructor */ MockUpModel(MController *aMController) ; /** * Destructor */ ~MockUpModel() ; /** * method for adding a network request * @param aRequest is the request to add * @return none */ virtual void addNetworkRequest(NetworkRequestExecutor::NetworkRequestQueueItem& aRequest) const ; /** * thread sync: this claims access to datamodel */ virtual bool lock() ; /** * thread sync: releases data model to other threads */ virtual void unlock() ; /** * method for getting node-specific datamodel */ virtual MNodeModelProtocolInterface& nodeModel() const ; virtual ProfileModel& profileModel() const ; /** * method for getting blob-specific datamodel */ virtual BinaryFileModel& binaryFileModel() const ; /** method for getting the ads datamodel */ virtual ClassifiedAdsModel& classifiedAdsModel() const ; virtual PrivMessageModel& privateMessageModel() const ; /**< method for getting the priv msg datamodel */ virtual ContentEncryptionModel& contentEncryptionModel() const ; virtual ProfileCommentModel& profileCommentModel() const ; /**< method for getting the comment datamodel */ virtual SearchModel* searchModel() const ; /**< method for getting the full text search datamodel */ virtual CaDbRecordModel* caDbRecordModel() const ; /**< method for getting distributed database model part */ virtual TclModel& tclModel() const ; /** * Method for opening database connection. Since Qt5.11 database * class can't be shared between threads. * @param aIsFirstTime Optional parameter that, when set to non-NULL * will have its value set to true, if the database did not * exist prior to this call. * * @return Instance of database connection. Caller is responsible * to properly ->close() and call ::removeDatabase() in * correct way. */ virtual QSqlDatabase dataBaseConnection(bool* aIsFirstTime = NULL) ; /** * Currently open connections. Caller does not own the returned list * and should not try adding/removing items from it. */ virtual const QList & getConnections() const ; /** * Currently pending network requests. * Even as this returns a pointer, not a reference, * ownership of the list is not transferred ; caller * may modiify content but is not supposed to delete */ virtual QList & getNetRequests() const ; public: MockUpNodeModel* iNodeModel ; QList* iNetworkRequests ; private: // member data MController *iController ; QMutex iMutex ; ProfileModel* iProfileModel ; BinaryFileModel* iBinaryFileModel ; ClassifiedAdsModel* iCAModel ; PrivMessageModel* iPrivMsgModel ; ContentEncryptionModel* iContentEncryptionModel ; ProfileCommentModel* iProfileCommentModel ; SearchModel* iSearchModel ; CaDbRecordModel* iCaDbRecordModel ; TclModel* iTclModel ; QSqlDatabase iDb ; QList *iConnections ; /** Network connections currently open */ QList * iNetReqQueue ; } ; #endif /* #define MOCKUP_CONTROLLER_H */ classified-ads-0.13/testca/mockup_nodemodel.cpp000066400000000000000000000135051331670245300216330ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "mockup_nodemodel.h" #include "../log.h" #include "../net/node.h" #include MockUpNodeModel::MockUpNodeModel( MController *aController ) : iLastNodeReceived(NULL), iController(aController) { iFingerPrintOfThisNode = new Hash(1,2,3,4,5) ; LOG_STR("MockUpNodeModel::MockUpNodeModel in\n") ; LOG_STR("MockUpNodeModel::MockUpNodeModel out\n") ; } MockUpNodeModel::~MockUpNodeModel() { LOG_STR("MockUpNodeModel::~MockUpNodeModel\n") ; iController = NULL ; if ( iLastNodeReceived ) { delete iLastNodeReceived ; } delete iFingerPrintOfThisNode ; } bool MockUpNodeModel::nodeGreetingReceived(Node& aNode , bool aWasInitialGreeting ) { QLOG_STR("MockUpNodeModel::nodeGreetingReceived " + aNode.nodeFingerPrint().toString()) ; if ( iLastNodeReceived) { delete iLastNodeReceived ; } iLastNodeReceived = new Node(aNode.nodeFingerPrint(), aNode.port()) ; iLastNodeReceived->setIpv4Addr(aNode.ipv4Addr()) ; iLastNodeReceived->setIpv6Addr(aNode.ipv6Addr()) ; iLastNodeReceived->setGoodNodeListTime(aNode.goodNodeListTime()) ; iLastNodeReceived->setLastConnectTime(aNode.lastConnectTime()) ; iLastNodeReceived->setLastMutualConnectTime(aNode.lastMutualConnectTime()) ; iLastNodeReceived->setCanReceiveIncoming(aNode.canReceiveIncoming()) ; return true ; } Hash& MockUpNodeModel::nodeFingerPrint() { /**< returns fingerprint of this node */ return *iFingerPrintOfThisNode ; } int MockUpNodeModel::listenPortOfThisNode() { /**< TCP listen port number method */ return 3 ; } const QSslCertificate& MockUpNodeModel::nodeCert() const { return iCert ; } /** getter for ssl certificate of SSL sock */ const QSslKey& MockUpNodeModel::nodeKey() const { return iKey ; } QByteArray* MockUpNodeModel::getNextItemToSend(Connection& aConnection) { return NULL ; } Node* MockUpNodeModel::nodeByHash(const Hash& aHash) { return NULL ; } QList* MockUpNodeModel::getNodesBeforeHash(const Hash& aHash, int aMaxNodes) { return NULL ; } void MockUpNodeModel::closeOldestInactiveConnection() { } QList* MockUpNodeModel::getNodesAfterHash(const Hash& aHash, int aMaxNodes, int aMaxInactivityMinutes ) { return NULL ; } QList MockUpNodeModel::getHotAddresses() { static QList retval ; return retval ; } bool MockUpNodeModel::updateNodeLastConnectTimeInDb(Node& aNode) { return false ; } QList* MockUpNodeModel::getHotNodes(int aMaxNodes) { return NULL ; } void MockUpNodeModel::addNodeFromBroadcast(const Hash& /*aNodeFingerPrint*/, const QHostAddress& /*aAddr*/, int aPort ) { LOG_STR2("addNodeFromBroadcast %d\n", aPort) ; } bool MockUpNodeModel::addNodeToConnectionWishList(Node* aNode) { LOG_STR("addNodeToConnectionWishList \n") ; delete aNode ; return true ; } bool MockUpNodeModel::addNodeToConnectionWishList(const Hash& aNode) { LOG_STR("addNodeToConnectionWishList hash-reference version \n") ; return true ; } Node* MockUpNodeModel::nextConnectionWishListItem() { return NULL; // means that no more connections in list } bool MockUpNodeModel::isNodeAlreadyConnected(const Node& aNode) const { return true ; } bool MockUpNodeModel::isNodeAlreadyConnected(const Hash& aHash) const { return false ; } Hash MockUpNodeModel::bucketEndHash(const Hash& aFingerPrintOfNodeAsking) { return aFingerPrintOfNodeAsking ; } bool MockUpNodeModel::updateNodeLastMutualConnectTimeInDb(const Hash& aNodeFp, quint32 aTime ) { return true ; } void MockUpNodeModel::setListenPortOfThisNode(int port) { // yes return ; } QList* MockUpNodeModel::getNodesBeforeHash(const Hash& h, unsigned int i) { QList* r = new QList() ; return r ; } QList* MockUpNodeModel::getNodesAfterHash(const Hash& h, unsigned int u, int i) { QList* r = new QList() ; return r ; } void MockUpNodeModel::setDnsName(QString s) { iDnsName = s ; } QString MockUpNodeModel::getDnsName() { return iDnsName ; } void MockUpNodeModel::offerNodeToRecentlyFailedList(const Hash& /*aFailedNodeHash*/) { // have very thin implementation here } bool MockUpNodeModel::setNodeCertAndKey ( const QString& aCertPem, const QString& aKeyPem) { QSslCertificate cert(aCertPem.toUtf8(), QSsl::Pem) ; iCert = cert ; QSslKey key(aKeyPem.toUtf8(), QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey) ; iKey = key ; if ((iKey.isNull() == false) && (iCert.isNull() == false) && iFingerPrintOfThisNode ) { Hash fp(iCert) ; iFingerPrintOfThisNode->fromQVariant(fp.toQVariant()) ; LOG_STR("MockUpNodeModel::setNodeCertAndKey out\n") ; return true ; } else { return false ; } } classified-ads-0.13/testca/mockup_nodemodel.h000066400000000000000000000125521331670245300213010ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef MOCKUP_NODEMODEL_H #define MOCKUP_NODEMODEL_H #include "../mcontroller.h" #include "../net/node.h" #include "../datamodel/mmodelprotocolinterface.h" #include "../datamodel/mnodemodelprotocolinterface.h" #include #include #include /** * @brief not a real part datamodel. debugging aid. */ class MockUpNodeModel : public QObject, public MNodeModelProtocolInterface { Q_OBJECT public: /** * constructor */ MockUpNodeModel(MController *aMController) ; /** * Destructor */ ~MockUpNodeModel() ; virtual bool nodeGreetingReceived(Node& aNode , bool aWasInitialGreeting = false ) ; virtual Hash& nodeFingerPrint() ; /**< returns fingerprint of this node */ virtual int listenPortOfThisNode() ; /**< TCP listen port number method */ virtual const QSslCertificate& nodeCert() const ; /** getter for ssl certificate of SSL sock */ virtual const QSslKey& nodeKey() const ; virtual QByteArray* getNextItemToSend(Connection& aConnection) ; virtual Node* nodeByHash(const Hash& aHash) ; virtual QList* getNodesBeforeHash(const Hash& aHash, int aMaxNodes) ; virtual void closeOldestInactiveConnection() ; virtual QList* getNodesAfterHash(const Hash& aHash, int aMaxNodes, int aMaxInactivityMinutes = -1 ) ; virtual QList getHotAddresses() ; virtual bool updateNodeLastConnectTimeInDb(Node& aNode) ; virtual QList* getHotNodes(int aMaxNodes) ; /** * method for adding node reference from broadcast. * this needs difference in handling because in IPv4 * network this typically contains private addr space * addresses that we don't want to permanently store nor * give to others as node-references. * * For making connections inside LANs of organisations * having NATs and firewalls and whatnot this might * still be a handy feature. */ virtual void addNodeFromBroadcast(const Hash& aNodeFingerPrint, const QHostAddress& aAddr, int aPort ) ; /** * method for adding a node to connection-wishlist. * network connector engine will then later pick them up. * nodemodel will take ownership of the node and delete * the object later. */ virtual bool addNodeToConnectionWishList(Node* aNode) ; /** * method for adding a node to connection-wishlist. * network connector engine will then later pick them up. */ virtual bool addNodeToConnectionWishList(const Hash& aNode) ; /** * method for getting one node from wishlist. * caller is obliged to delete the node returned. * @return node or null if there is nothing in wishlist */ virtual Node* nextConnectionWishListItem() ; /** * method for checking if a node is already connected */ virtual bool isNodeAlreadyConnected(const Node& aNode) const ; /** * Method for checking if a node is already connected. * This version checks only hash, not addresses. */ virtual bool isNodeAlreadyConnected(const Hash& aHash) const ; virtual Hash bucketEndHash(const Hash& aFingerPrintOfNodeAsking) ; /** * updates last mutual connect time, used for deciding what content * to send automatically upon node connect */ virtual bool updateNodeLastMutualConnectTimeInDb(const Hash& aNodeFp, quint32 aTime ) ; virtual void setListenPortOfThisNode(int port) ; virtual QList* getNodesBeforeHash(const Hash& h, unsigned int i); virtual QList* getNodesAfterHash(const Hash& h, unsigned int u, int i) ; virtual void setDnsName(QString aName) ; virtual QString getDnsName() ; /** used to offer node to list of recently failed connections. * this model maintains a list of such nodes and tries to * not immediately re-connect a recently failed node */ virtual void offerNodeToRecentlyFailedList(const Hash& aFailedNodeHash) ; /** * setter for node cert and key */ bool setNodeCertAndKey ( const QString& aCertPem, const QString& aKeyPem) ; public: Node* iLastNodeReceived ; private: MController *iController ; Hash* iFingerPrintOfThisNode ; /**< set by method openOrCreateSSLCertificate */ QString iDnsName ; QSslCertificate iCert ; QSslKey iKey ; } ; #endif classified-ads-0.13/testca/mockup_voicecallengine.cpp000066400000000000000000000053641331670245300230200ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "mockup_voicecallengine.h" #include "../log.h" #include "../util/hash.h" #include "../datamodel/voicecall.h" MockUpVoiceCallEngine::MockUpVoiceCallEngine() :iCallId(0) { QLOG_STR("Voice call engine mockup constructed") ; } MockUpVoiceCallEngine::~MockUpVoiceCallEngine() { QLOG_STR("Voice call engine mockup is no more") ; } void MockUpVoiceCallEngine::installObserver(MCallStatusObserver* aObserver) { iObservers.append(aObserver) ; } void MockUpVoiceCallEngine::removeObserver(MCallStatusObserver* aObserver) { iObservers.removeAll(aObserver) ; } void MockUpVoiceCallEngine::insertCallData(quint32 aCallId, quint32 aSeqNo, PayloadType aPayloadType, const QByteArray& aPayload, Hash& aSendingNode) { QLOG_STR("MockUpVoiceCallEngine::insertCallData " + QString::number(aCallId )) ; iCallIdOfReceivedRtData = aCallId ; iCalldata.clear() ; iCalldata.append(aPayload) ; } void MockUpVoiceCallEngine::insertCallStatusData(const VoiceCall& aCallStatus, const Hash& aSendingNode) { QLOG_STR("MockUpVoiceCallEngine::insertCallStatusData " + QString::number(aCallStatus.iCallId )) ; iCallId = aCallStatus.iCallId ; } QList MockUpVoiceCallEngine::onGoingCalls() const { QList retval ; if ( iCallId != 0 ) { retval.append(iCallId) ; } return retval ; } MVoiceCallEngine::CallState MockUpVoiceCallEngine::callStatus(quint32 aCallId) const { return MVoiceCallEngine::NoCall ; } void MockUpVoiceCallEngine::closeCall(quint32 aCallId) { iCallId = 0 ; } void MockUpVoiceCallEngine::acceptCall(quint32 aCallId) { iCallId = aCallId ; } classified-ads-0.13/testca/mockup_voicecallengine.h000066400000000000000000000106541331670245300224630ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef MOCKUP_VOICECALLENGINE_H #define MOCKUP_VOICECALLENGINE_H #include "../net/mvoicecallengine.h" class Hash ; class VoiceCall ; class MockUpVoiceCallEngine : public MVoiceCallEngine { public: MockUpVoiceCallEngine() ; ~MockUpVoiceCallEngine() ; /** * Method for installing call state observer */ virtual void installObserver(MVoiceCallEngine::MCallStatusObserver* aObserver) ; /** * Method for removing call state observer */ virtual void removeObserver(MVoiceCallEngine::MCallStatusObserver* aObserver) ; /** * Method for reception of call real-time data. This is called * from network-parts that receive the data packet over some * protocol and then feed it here to make it heard. * * Called from protocol parser. Parser does not lock datamodel * prior to call. * * @param aCallId is call ( stream ) identifier * @param aSeqNo is sequence number of rt data in stream * @param aPayloadType tells what kind of payload it is * @param aPayload actual bytes * @param aSendingNode node what sent the data package */ virtual void insertCallData(quint32 aCallId, quint32 aSeqNo, PayloadType aPayloadType, const QByteArray& aPayload, Hash& aSendingNode) ; /** * Method for reception of call status data. This is called * from network-parts that receive the data packet over some * protocol and then feed it here to move the call engine * to some direction * * Note that the call data inserted via this method may be * call that this node originally made and at the receiving * end this same method is used to inject the new incoming * call into the engine. * * Another note to take into consideration is the handling * if node-data in aCallStatus. Call status is passed as reference * so the ownership of the call data object instance is not * tranferred into voice call engine. Inside call data there * are 2 pointers to originating and destination nodes. * Ownership of content of those pointers is not tranferred * either. VoiceCallEngine will make local copies (if it sees * that necessary) of the node-pointer contents and caller of * this method will be responsible for deleting the node-objects * in call-data if they were created only for the purpose of * making a voice call. * * DataModel.lock() should be called before calling this method * * @param aCallStatus contains information about a call. * @param aSendingNode is fingerprint of the node where the DTO is * coming from. May be local node also. */ virtual void insertCallStatusData(const VoiceCall& aCallStatus, const Hash& aSendingNode) ; /** * method for getting identifiers of ongoing calls */ virtual QList onGoingCalls() const ; /** * method for getting status of a call */ virtual CallState callStatus(quint32 aCallId) const ; /** * Method called as result UI-action. This terminates ongoing call. */ virtual void closeCall(quint32 aCallId) ; /** * Method called as result UI-action. This accpets an incoming call. */ virtual void acceptCall(quint32 aCallId) ; public: // data QList iObservers ; quint32 iCallId ; quint32 iCallIdOfReceivedRtData ; QByteArray iCalldata ; } ; #endif classified-ads-0.13/testca/testca.cpp000066400000000000000000001352631331670245300176000ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "../util/hash.h" #include #include "mockup_controller.h" #include "mockup_model.h" #include "mockup_nodemodel.h" #include "mockup_voicecallengine.h" #include "../datamodel/model.h" #include "../datamodel/contentencryptionmodel.h" #include "../log.h" #include "../net/protocol_message_formatter.h" #include "../net/protocol_message_parser.h" #include // for Q_IPV6ADDR #include #include #include #include "../datamodel/camodel.h" #include "../datamodel/ca.h" #include "../datamodel/profilemodel.h" #include "../datamodel/profile.h" #include "../datamodel/tclprogram.h" #include "../datamodel/tclmodel.h" #include "../datamodel/trusttreemodel.h" #include "../util/jsonwrapper.h" #include "../datamodel/cadbrecord.h" #include "../datamodel/cadbrecordmodel.h" #include "../tcl/tclWrapper.h" #include Q_IPV6ADDR KNullIpv6Addr ( QHostAddress("::0").toIPv6Address () ) ; Hash KNullHash ; MController* controllerInstanceEx ; /**< Application controller, here as static for signal handlers */ /** * This class includes test cases for those functionalities * that can be automatically tested */ class TestClassifiedAds: public QObject, public Connection::ConnectionObserver { Q_OBJECT // from ConnectionObserver: /** method for sending data received */ virtual bool dataReceived(const QByteArray& aData, Connection& aConnection ) ; /** method for communicating fact that connection ends */ virtual void connectionClosed(Connection *aDeletee) ; /** method for communicating fact that connection is open for * business */ virtual void connectionReady(Connection *aBusinessEntity) ; private slots: void tryHash1(); void tryHash2(); void tryHash3(); void trySHA1(); void tryHashAddition() ; void tryHashSubstraction() ; void tryCreatingController() ; void tryContentEncryptionModel() ; void tryContentEncryptionModelPwdChange() ; void tryContentEncryptionModelPwdChangeFailure() ; void trySign() ; void tryVerify() ; void tryVerifyFailure() ; void tryNodeGreetingParse() ; void tryCompression() ; void tryEncrypt() ; void tryDecrypt() ; void tryDecryptFailure() ; void tryHashQVariant() ; void tryHashQVariantComparison() ; void try3NodeGreetingParsing() ; void tryListOfAdsParsing() ; void trySearchRequest() ; void tryTrustTreeModel() ; void tryJSonParse() ; void tryJSonParseWithCompress() ; void tryJSonParseFailure() ; void tryJSonSerialize() ; /** * Voice call rt-data format+parse test */ void tryCallDataParse() ; /** * Voice call status format+parse test */ void tryCallStatusDataParse() ; /** * db record publish via TCL test */ void tryDbRecordPublishViaTCL() ; /** * db record publish via TCL test, encrypted variation */ void tryEncryptedDbRecordPublish() ; /** * db record network send/parse operation test */ void tryDbRecordParse() ; /** * test for local storage of tcl programs */ void tryTCLLocalStorage() ; void tryDbRecordSearchCompare(); void tryDbRecordSearchParse(); void tryDeletingController() ; private: Hash iHashOfPrivateKey ; MockUpController* iController ; QByteArray iResultSignature ; QByteArray iPlaintextSigned ; QByteArray iCipherText ; }; void TestClassifiedAds::tryHash1() { // highest significant bit first, so Hash h1(0,0,0,0,0) ; // this is zero-hash Hash h2(0,1,0,0,0) ; // this is big Hash h3(0,0,1,0,0) ; // this is less big Hash h4(0,0,0,1,0) ; // this is even smaller Hash h5(0,0,0,0,1) ; // this has the least-significant bit set QVERIFY(h2 > h1 && h3 < h2 && h4 < h3 ); } void TestClassifiedAds::tryHash2() { Hash h1(0,0,0,0,0) ; Hash h2(0,1,0,0,0) ; QVERIFY(h1 < h2); } void TestClassifiedAds::tryHash3() { Hash moroccan(0,0,0,0,0) ; Hash lebanese(1,1,1,1,1) ; moroccan = lebanese ; QVERIFY(moroccan == lebanese); } void TestClassifiedAds::tryHashQVariant() { Hash h1(0,30,40,50,0xFFFFFFFF) ; QVariant q ( h1.toQVariant() ) ; Hash h2 ; h2.fromQVariant ( q ) ; QVERIFY(h1 == h2 ) ; } void TestClassifiedAds::tryHashQVariantComparison() { Hash h1(0,31,40,50,0xFFFFFFFF) ; Hash h2(0,31,40,50,0xFFFFFFFF) ; QVariant q1 ( h1.toQVariant() ) ; QVariant q2 ( h2.toQVariant() ) ; QVERIFY(q1 == q2 ) ; } void TestClassifiedAds::trySHA1() { QByteArray plainText ( "quick brown fox and some diipadaapa\n") ; Hash h ; h.calculate(plainText) ; QLOG_STR("Calculated: " + h.toString()) ; // so, this next string is calculated using "openssl sha1" // command so we trust it might be right .. or usable to our // situation. QLOG_STR("Given: 2af8d4e46fc6fa45e84bb6f007d75e90f259630c") ; QVERIFY(h.toString() == QString("2af8d4e46fc6fa45e84bb6f007d75e90f259630c").toUpper()); } // idea here is that we try the same operation // using libgcrypt (that we trust) and our own // hash-class and we are supposed to yield same // results here. void TestClassifiedAds::tryHashAddition() { const char* val = "Some-Sample-Input" ; const char* val2 = "jurgeli burgeli ja toinen strink" ; int msg_length = strlen( val ); int msg_length2 = strlen( val2 ); int hash_length = gcry_md_get_algo_dlen( GCRY_MD_SHA1 ); unsigned char hash[ hash_length ]; unsigned char hash2[ hash_length ]; char *out = (char *) malloc( sizeof(char) * ((hash_length*2)+1) ); char *p = out; gcry_md_hash_buffer( GCRY_MD_SHA1, hash, val, msg_length ); gcry_md_hash_buffer( GCRY_MD_SHA1, hash2, val2, msg_length2 ); gcry_mpi_t hash_mpi; gcry_mpi_t hash_mpi2; gcry_mpi_t summa = gcry_mpi_new (160) ; gcry_mpi_scan( &hash_mpi, GCRYMPI_FMT_USG, hash, hash_length, NULL ); gcry_mpi_scan( &hash_mpi2, GCRYMPI_FMT_USG, hash2, hash_length, NULL ); gcry_mpi_add (summa, hash_mpi, hash_mpi2) ; unsigned char tuloste[100] = { 0 } ; size_t printed ; gcry_mpi_print (GCRYMPI_FMT_HEX, tuloste, 99, &printed, hash_mpi) ; printf("first hash (%lu): %s\n",printed, tuloste) ; gcry_mpi_print (GCRYMPI_FMT_HEX, tuloste, 99, &printed, hash_mpi2) ; printf("second hash (%lu): %s\n",printed, tuloste) ; gcry_mpi_print (GCRYMPI_FMT_HEX, tuloste, 99, &printed, summa) ; printf("sum (%lu): %s\n",printed, tuloste) ; // then same using Hash class Hash val1_hash ( hash ) ; Hash val2_hash ( hash2 ) ; printf("\n") ; qDebug() << val1_hash.toString() ; qDebug() << val2_hash.toString() ; Hash summa_hash = val1_hash + val2_hash; qDebug() << summa_hash.toString() ; printf("\n") ; gcry_mpi_release( hash_mpi ); gcry_mpi_release( hash_mpi2 ); gcry_mpi_release( summa ); int i; for ( i = 0; i < hash_length; i++, p += 2 ) { snprintf ( p, 3, "%02x", hash[i] ); } QVERIFY(strcmp((const char *)summa_hash.toString().toUtf8().constData(), (const char *)tuloste) == 0); } void TestClassifiedAds::tryHashSubstraction() { const char* val = "Some-Sample-Input" ; const char* val2 = "jurgeli burgeli ja toinen strink" ; int msg_length = strlen( val ); int msg_length2 = strlen( val2 ); int hash_length = gcry_md_get_algo_dlen( GCRY_MD_SHA1 ); unsigned char hash[ hash_length ]; unsigned char hash2[ hash_length ]; char *out = (char *) malloc( sizeof(char) * ((hash_length*2)+1) ); char *p = out; gcry_md_hash_buffer( GCRY_MD_SHA1, hash, val, msg_length ); gcry_md_hash_buffer( GCRY_MD_SHA1, hash2, val2, msg_length2 ); gcry_mpi_t hash_mpi; gcry_mpi_t hash_mpi2; gcry_mpi_t summa = gcry_mpi_new (160) ; gcry_mpi_scan( &hash_mpi, GCRYMPI_FMT_USG, hash, hash_length, NULL ); gcry_mpi_scan( &hash_mpi2, GCRYMPI_FMT_USG, hash2, hash_length, NULL ); gcry_mpi_sub (summa, hash_mpi, hash_mpi2) ; unsigned char tuloste[100] = { 0 } ; size_t printed ; gcry_mpi_print (GCRYMPI_FMT_HEX, tuloste, 99, &printed, hash_mpi) ; printf("first hash (%lu): %s\n",printed, tuloste) ; gcry_mpi_print (GCRYMPI_FMT_HEX, tuloste, 99, &printed, hash_mpi2) ; printf("second hash (%lu): %s\n",printed, tuloste) ; gcry_mpi_print (GCRYMPI_FMT_HEX, tuloste, 99, &printed, summa) ; printf("subs (%lu): %s\n",printed, tuloste) ; // then same using Hash class Hash val1_hash ( hash ) ; Hash val2_hash ( hash2 ) ; printf("\n") ; qDebug() << val1_hash.toString() ; qDebug() << val2_hash.toString() ; Hash subs_hash = val1_hash - val2_hash; qDebug() << subs_hash.toString() ; printf("\n") ; gcry_mpi_release( hash_mpi ); gcry_mpi_release( hash_mpi2 ); gcry_mpi_release( summa ); int i; for ( i = 0; i < hash_length; i++, p += 2 ) { snprintf ( p, 3, "%02x", hash[i] ); } QVERIFY(strcmp((const char *)subs_hash.toString().toUtf8().constData(), (const char *)tuloste) == 0); } void TestClassifiedAds::tryContentEncryptionModel() { Hash nullHash ( 0,0,0,0,0) ; QList privateKeys = iController->model().contentEncryptionModel().listKeys(true,NULL) ; if ( privateKeys.size() == 0 ) { iHashOfPrivateKey = iController->model().contentEncryptionModel().generateKeyPair() ; QVERIFY(!(iHashOfPrivateKey == nullHash) ) ; if ( iHashOfPrivateKey != nullHash ) { // put some profile data in there too Profile p(iHashOfPrivateKey) ; p.iNickName = "test profile" ; p.iGreetingText = "zap" ; p.iIsPrivate = false ; p.iTimeOfPublish = QDateTime::currentDateTimeUtc().toTime_t() ; iController->model().profileModel().publishProfile(p) ; QSqlQuery query(iController->model().dataBaseConnection()); query.prepare("delete from publish where hash1 = " + QString::number(iHashOfPrivateKey.iHash160bits[0])) ; query.exec() ; } } else { for ( int i = privateKeys.size()-1 ; i >= 0 ; i-- ) { QLOG_STR("\nHash found " + privateKeys[i].toString()) ; iHashOfPrivateKey = privateKeys[0] ; } QVERIFY(privateKeys.size() > 0 ) ; } } void TestClassifiedAds::tryContentEncryptionModelPwdChange() { if ( iController->model().contentEncryptionModel().changeKeyPassword(iHashOfPrivateKey, QString("el password nuevo")) == 0 ) { QVERIFY( iController->model().contentEncryptionModel().changeKeyPassword(iHashOfPrivateKey,QString("das password nuevo")) == 0 ); } else { QVERIFY ( 1 == 2 ) ; } // last } void TestClassifiedAds::tryContentEncryptionModelPwdChangeFailure() { iController->setContentKeyPasswd("salasana") ; // changeKeyPassword must return non-zero when failing. QVERIFY( iController->model().contentEncryptionModel().changeKeyPassword(iHashOfPrivateKey,QString("das password nuevo")) != 0 ); iController->setContentKeyPasswd("das password nuevo") ; iController->model().contentEncryptionModel().changeKeyPassword(iHashOfPrivateKey,QString("salasana")); iController->setContentKeyPasswd("salasana") ; // last } void TestClassifiedAds::trySign() { QByteArray plaintext("foobar and brown fox did some tricks involving jumping") ; iPlaintextSigned = plaintext ; QVERIFY( iController->model().contentEncryptionModel().sign(iHashOfPrivateKey, iPlaintextSigned, iResultSignature) == 0 ); LOG_STR2("resultSignature len: %d\n" , iResultSignature.length()) ; } void TestClassifiedAds::tryVerify() { QVERIFY( iController->model().contentEncryptionModel().verify(iHashOfPrivateKey, iPlaintextSigned, iResultSignature) == true ); } void TestClassifiedAds::tryVerifyFailure() { QByteArray plaintext("something completely different") ; iPlaintextSigned = plaintext ; QVERIFY( iController->model().contentEncryptionModel().verify(iHashOfPrivateKey, iPlaintextSigned, iResultSignature) == false ); } #define EXAMPLE_TEXT "Quick brown and rest of the diipadaapa. This goes via.." void TestClassifiedAds::tryEncrypt() { QList listOfRecipients ; QByteArray plainText ( QString(EXAMPLE_TEXT).toUtf8()) ; QByteArray result ; listOfRecipients.append(iHashOfPrivateKey) ; QVERIFY( iController->model().contentEncryptionModel().encrypt(listOfRecipients, plainText, result) == true ); iCipherText.append(result) ; } void TestClassifiedAds::tryDecrypt() { QByteArray result ; iController->setProfileInUse(iHashOfPrivateKey) ; QVERIFY( iController->model().contentEncryptionModel().decrypt(iCipherText, result) == true ); LOG_STR2("After de-crypt %s\n", qPrintable(QString(result))) ; QCOMPARE( result, QString(EXAMPLE_TEXT).toUtf8()) ; } void TestClassifiedAds::tryDecryptFailure() { QByteArray result ; // cause a failure here: iCipherText[100] = 'A' ; // then check that we're not ok any more.. QVERIFY( iController->model().contentEncryptionModel().decrypt(iCipherText, result) == false ); } void TestClassifiedAds::tryNodeGreetingParse() { MockUpModel* m = new MockUpModel(iController) ; ProtocolMessageParser* p = new ProtocolMessageParser(*iController,*m) ; Node* n = new Node(Hash(1,2,3,4,5),12345) ; n->setIpv4Addr(345435324) ; QHostAddress ip6("3::aa:dd") ; LOG_STR2("ip6: %s\n", qPrintable(ip6.toString())) ; n->setIpv6Addr(ip6.toIPv6Address()) ; n->setLastConnectTime(2342343) ; n->setLastMutualConnectTime(43223112) ; QByteArray serializedNode = ProtocolMessageFormatter::nodeGreeting(*n) ; // need to have connection&thread for parsing. QThread t; Connection* c = new Connection(1, *this, iController->model(), *iController) ; QString jiison ( serializedNode.mid(5) ) ; int len = jiison.length() ; QLOG_STR("Jii before parse: " + jiison) ; LOG_STR2("len = %d\n", len) ; p->parseMessage(serializedNode,*c) ; // after successful parse our mock-up of datamodel should // contain the parsed node in its member variable -> verify // that data fields got parsed correctly QVERIFY( m->iNodeModel->iLastNodeReceived != NULL && m->iNodeModel->iLastNodeReceived->nodeFingerPrint() == n->nodeFingerPrint()&& m->iNodeModel->iLastNodeReceived->port() == n->port()&& m->iNodeModel->iLastNodeReceived->ipv4Addr() == n->ipv4Addr()&& Connection::Ipv6AddressesEqual(m->iNodeModel->iLastNodeReceived->ipv6Addr(), n->ipv6Addr())==true) ; delete n ; delete p ; delete m ; } // like tryNodeGreetingParse but tries with list of 3 nodes void TestClassifiedAds::try3NodeGreetingParsing() { MockUpModel* m = new MockUpModel(iController) ; ProtocolMessageParser* p = new ProtocolMessageParser(*iController,*m) ; Node* n = new Node(Hash(1,2,3,4,5),12345) ; n->setIpv4Addr(345435324) ; QHostAddress ip6("3::aa:dd") ; LOG_STR2("ip6: %s\n", qPrintable(ip6.toString())) ; n->setIpv6Addr(ip6.toIPv6Address()) ; n->setLastConnectTime(2342343) ; n->setLastMutualConnectTime(43223112) ; QByteArray serializedNode = ProtocolMessageFormatter::nodeGreeting(*n) ; LOG_STR2("Len of first greeting bytes = %d\n", serializedNode.size()) ; Node* n2 = new Node(Hash(11,22,33,44,55),12345) ; n2->setIpv4Addr(345435326) ; QHostAddress ip6_2("3::aa:df") ; LOG_STR2("ip6_2: %s\n", qPrintable(ip6_2.toString())) ; n2->setIpv6Addr(ip6_2.toIPv6Address()) ; n2->setLastConnectTime(1342343) ; n2->setLastMutualConnectTime(33223112) ; QByteArray serializedNode2 = ProtocolMessageFormatter::nodeGreeting(*n2) ; serializedNode.append(serializedNode2) ; LOG_STR2("Len of 2nd greeting bytes = %d\n", serializedNode2.size()) ; Node* n3 = new Node(Hash(12,23,34,45,57),12345) ; n3->setIpv4Addr(345435226) ; QHostAddress ip6_3("3::aa:de") ; LOG_STR2("ip6_3: %s\n", qPrintable(ip6_3.toString())) ; n3->setIpv6Addr(ip6_3.toIPv6Address()) ; n3->setLastConnectTime(1342341) ; n3->setLastMutualConnectTime(33223122) ; QByteArray serializedNode3 = ProtocolMessageFormatter::nodeGreeting(*n3) ; serializedNode.append(serializedNode3) ; LOG_STR2("Len of 3rd greeting bytes = %d\n", serializedNode3.size()) ; // need to have connection&thread for parsing. Connection* c = new Connection(1, *this, iController->model(), *iController) ; QString jiison ( serializedNode.mid(5) ) ; int len = jiison.length() ; QLOG_STR("Jii before parse: " + jiison) ; LOG_STR2("len = %d\n", len) ; p->parseMessage(serializedNode,*c) ; // after successful parse our mock-up of datamodel should // contain the parsed node in its member variable -> verify // that data fields got parsed correctly QVERIFY( m->iNodeModel->iLastNodeReceived != NULL && m->iNodeModel->iLastNodeReceived->nodeFingerPrint() == n3->nodeFingerPrint()&& m->iNodeModel->iLastNodeReceived->port() == n3->port()&& m->iNodeModel->iLastNodeReceived->ipv4Addr() == n3->ipv4Addr()&& Connection::Ipv6AddressesEqual(m->iNodeModel->iLastNodeReceived->ipv6Addr(), n3->ipv6Addr())==true) ; delete n ; delete n2 ; delete n3 ; delete c ; delete p ; delete m ; } void TestClassifiedAds::tryListOfAdsParsing() { MockUpModel* m = new MockUpModel(iController) ; QList* list = new QList ; m->iNetworkRequests = list ; ProtocolMessageParser* p = new ProtocolMessageParser(*iController,*m) ; Connection* c = new Connection(1, *this, iController->model(), *iController) ; Hash classificationHash ( 0x5,0x6,0x7,0x8,0x9 ) ; QList > listOfAds ; Hash articleHash1 (0x100,51,61,71,81 ) ; Hash articleHash2 (0x101,52,62,72,82 ) ; Hash articleHash3 (0x102,53,63,73,83 ) ; Hash articleHash4 (0x103,54,64,74,84 ) ; Hash articleHash5 (0x104,55,65,75,85 ) ; quint32 articleTimeStamp = QDateTime::currentDateTimeUtc().toTime_t() ; QPair p1 ( articleHash1, articleTimeStamp) ; QPair p2 ( articleHash2, articleTimeStamp-1) ; QPair p3 ( articleHash3, articleTimeStamp-2) ; QPair p4 ( articleHash4, articleTimeStamp-3) ; QPair p5 ( articleHash5, articleTimeStamp-4) ; listOfAds.append(p1) ; listOfAds.append(p2) ; listOfAds.append(p3) ; listOfAds.append(p4) ; listOfAds.append(p5) ; Node* n = new Node(Hash(1,2,3,4,5),12345) ; n->setIpv4Addr(345435324) ; QHostAddress ip6("3::aa:dd") ; n->setIpv6Addr(ip6.toIPv6Address()) ; n->setLastConnectTime(2342343) ; n->setLastMutualConnectTime(43223112) ; c->setNode(n) ; // ownership transferred QByteArray serializedAds = ProtocolMessageFormatter::replyToAdsClassified(classificationHash, listOfAds) ; p->parseMessage(serializedAds,*c) ; QSqlQuery query(iController->model().dataBaseConnection()); query.prepare("delete from classified_ad where group_hash1 = 5 and group_hash2 = 6 and group_hash3 = 7 and group_hash4 = 8 and group_hash5 = 9") ; query.exec() ; QCOMPARE( m->iNetworkRequests->size() , 5 ) ; QVERIFY( query.numRowsAffected () == 5 ) ; delete c; delete p ; delete m ; } // a bit more complex test case. it does publish of a ca, // then a search against the ca. void TestClassifiedAds::trySearchRequest() { MockUpModel* m = new MockUpModel(iController) ; QList* list = new QList ; bool testCaseSuccess ( false ) ; m->iNetworkRequests = list ; ProtocolMessageParser* p = new ProtocolMessageParser(*iController,iController->model()) ; Connection* c = new Connection(1, *this, iController->model(), *iController) ; CA ca ; ca.iSenderName = "person, test person" ; ca.iSubject = "1234" ; ca.iGroup = "a.b.c" ; quint32 dummy ; ca.iMessageText = "tottamooses,tassoisfraasikunneiesiinnymissaan,eihelepollaainakkaan" ; QLOG_STR("Trying to get profile with key " + iHashOfPrivateKey.toString() + " " + QString::number(iHashOfPrivateKey.iHash160bits[0])) ; Profile *prof = iController->model().profileModel().profileByFingerPrint(iHashOfPrivateKey) ; if ( prof ) { QLOG_STR("Got profile") ; if ( iController->model().contentEncryptionModel().PublicKey(iHashOfPrivateKey, ca.iProfileKey, &dummy )) { QLOG_STR("Got public key ") ; ca.iFingerPrint = iController->model().classifiedAdsModel().publishClassifiedAd(*prof, ca) ; if(ca.iFingerPrint != KNullHash ) { // ok, the CA is in, lets try to perform a search on it.. first in "network search" manner: QByteArray serializedSearchString( ProtocolMessageFormatter::searchSend("tottamooses,tassoisfraasikunneiesiinnymissaan,eihelepollaainakkaan", true, true, true, Hash(3,4,5,6,7)) ) ; p->parseMessage(serializedSearchString,*c) ; // at this point our connection "c" will have on protocol item to send // in its queue ( the results ) and there is test for that later // then test the search function of the model in manner how // UI will do the trick: iController->model().searchModel()->setSearchString("tottamooses,tassoisfraasikunneiesiinnymissaan,eihelepollaainakkaan", true, true, true, true) ; QString searchPhrase ; bool searchAds(false) ; bool searchProfiles(false) ; bool searchComments(false) ; Hash searchId ; iController->model().searchModel()->getSearchCriteria(&searchPhrase, &searchAds, &searchProfiles, &searchComments, &searchId) ; if ( searchAds&&searchProfiles&&searchComments ) { QList items ( iController->model().searchModel()->performSearch("tottamooses,tassoisfraasikunneiesiinnymissaan,eihelepollaainakkaan", true, true, true)) ; if(items.count() == 1 ) { QByteArray resultsSerialized ( ProtocolMessageFormatter::searchResultsSend(items,searchId.iHash160bits[0]) ) ; if(p->parseMessage(resultsSerialized,*c)) { testCaseSuccess = true ; QLOG_STR("p->parseMessage(resultsSerialized,*c) returned true") ; } else { QLOG_STR("p->parseMessage(resultsSerialized,*c) returned false") ; } } } } else { QLOG_STR("CA got null fingerprint? ") ; } } delete prof ; } else { QLOG_STR("Profile was null??") ; } // interestingly numRowsAffected() with delete returns always 0 // if used under qt5.2.1 but under qt4 it returns the number // of rows deleted. in order to assess the number of rows under // qt5 we need a separate query: QSqlQuery query0(iController->model().dataBaseConnection()); query0.prepare("select count(hash1) from classified_ad where hash1 = :h1 and hash2 = :h2 and hash3 = :h3 ") ; query0.bindValue(":hash1", ca.iFingerPrint.iHash160bits[0]); query0.bindValue(":hash2", ca.iFingerPrint.iHash160bits[1]); query0.bindValue(":hash3", ca.iFingerPrint.iHash160bits[2]); bool querySuccess = query0.exec() ; if ( querySuccess && query0.next() && !query0.isNull(0) ) { if ( testCaseSuccess == true && query0.value(0).toInt() == 1 ) { testCaseSuccess = true ; } } else { testCaseSuccess = false ; QLOG_STR("failure: " + query0.lastError().text() + " querySuccess = " + QString::number(querySuccess) + " isnull = " + QString::number(query0.isNull(0))) ; } // after count is checked, the row may go: QSqlQuery query(iController->model().dataBaseConnection()); query.prepare("delete from classified_ad where hash1 = :h1 and hash2 = :h2 and hash3 = :h3 ") ; query.bindValue(":hash1", ca.iFingerPrint.iHash160bits[0]); query.bindValue(":hash2", ca.iFingerPrint.iHash160bits[1]); query.bindValue(":hash3", ca.iFingerPrint.iHash160bits[2]); query.exec() ; QSqlQuery query2(iController->model().dataBaseConnection()); query2.prepare("delete from publish where hash1 = :h1 and hash2 = :h2 and hash3 = :h3 ") ; query2.bindValue(":hash1", ca.iFingerPrint.iHash160bits[0]); query2.bindValue(":hash2", ca.iFingerPrint.iHash160bits[1]); query2.bindValue(":hash3", ca.iFingerPrint.iHash160bits[2]); query.exec() ; delete c; delete p ; delete m ; QVERIFY(testCaseSuccess) ; } void TestClassifiedAds::tryTrustTreeModel() { MockUpModel* m = new MockUpModel(iController) ; TrustTreeModel* tl = new TrustTreeModel(iController,*m) ; tl->initModel(QVariant()) ; Profile unTrustedProfile1 ( Hash(1,1,1,1,3) ) ; unTrustedProfile1.iNickName = "Einari E. Epaluotettava" ; QString displayName ; Hash trustingHash ; Profile *self = iController->model().profileModel().profileByFingerPrint(iHashOfPrivateKey) ; if ( self ) { Profile trustedProfile1 ( Hash(1,1,1,1,1) ) ; trustedProfile1.iNickName = "Taisto T. Trusted" ; if ( !self->iTrustList.contains(trustedProfile1.iFingerPrint) ) { self->iTrustList << trustedProfile1.iFingerPrint ; QLOG_STR("Setting trust on " + trustedProfile1.iNickName) ; } Profile trustedProfile2 ( Hash(1,1,1,1,2) ) ; trustedProfile2.iNickName = "Tenho T. Trusted" ; if ( !self->iTrustList.contains(trustedProfile2.iFingerPrint) ) { self->iTrustList << trustedProfile2.iFingerPrint ; QLOG_STR("Setting trust on " + trustedProfile2.iNickName) ; } iController->model().profileModel().publishProfile(*self) ; QSqlQuery query(iController->model().dataBaseConnection()); query.prepare("delete from publish where hash1 = " + QString::number(iHashOfPrivateKey.iHash160bits[0])); query.exec() ; tl->offerTrustList(self->iFingerPrint, self->iNickName, self->iTrustList ) ; // then, cause calculation of the trust tree: tl->offerTrustList(trustedProfile1.iFingerPrint, trustedProfile1.iNickName, trustedProfile1.iTrustList ) ; tl->offerTrustList(trustedProfile2.iFingerPrint, trustedProfile2.iNickName, trustedProfile2.iTrustList ) ; // now, self is trusted and it has 2 trusted profiles. QCOMPARE(tl->isProfileTrusted(self->iFingerPrint,&displayName,&trustingHash), true) ; QCOMPARE(tl->isProfileTrusted(trustedProfile1.iFingerPrint,&displayName,&trustingHash), true) ; QCOMPARE(tl->isProfileTrusted(trustedProfile2.iFingerPrint,&displayName,&trustingHash), true) ; QVariant modelState ( tl->trustTreeSettings() ) ; tl->clear() ; tl->initModel(modelState) ; // and now, Taneli should again be trusted? QCOMPARE(tl->isProfileTrusted(trustedProfile2.iFingerPrint,&displayName,&trustingHash), true) ; // then add 2nd level trusted profile: Profile trustedProfile4 ( Hash(1,1,1,1,4) ) ; if ( !trustedProfile2.iTrustList.contains(trustedProfile4.iFingerPrint) ) { trustedProfile2.iTrustList << trustedProfile4.iFingerPrint ; } trustedProfile4.iNickName = "Sigvard S. Semitrusted" ; // update model as Tenho now expresses trust regarding Sigvard tl->offerTrustList(trustedProfile2.iFingerPrint, trustedProfile2.iNickName, trustedProfile2.iTrustList ) ; QCOMPARE(tl->isProfileTrusted(trustedProfile4.iFingerPrint,&displayName,&trustingHash), true) ; QLOG_STR("Sigvard is trusted by " + displayName) ; // then drop trust on Tenho and that should revoke trust // from Sigvard too: self->iTrustList.removeAll(trustedProfile2.iFingerPrint) ; iController->model().profileModel().publishProfile(*self) ; query.exec() ; tl->offerTrustList(self->iFingerPrint, self->iNickName, self->iTrustList ) ; QCOMPARE(tl->isProfileTrusted(trustedProfile4.iFingerPrint,&displayName,&trustingHash), false) ; } QVERIFY(tl->isProfileTrusted(unTrustedProfile1.iFingerPrint,&displayName,&trustingHash) == false) ; delete self ; delete tl ; delete m ; } /** * "ok" case of json text parsing */ void TestClassifiedAds::tryJSonParse() { QByteArray json("{ \"dataItem\": { \"description\": \"is descriptive\" }}"); bool ok (false); QVariantMap result = JSonWrapper::parse(json, &ok) ; QCOMPARE(ok, true) ; QVERIFY(result.contains("dataItem") == true) ; } void TestClassifiedAds::tryJSonParseWithCompress() { QByteArray json("{ \"dataItem\": { \"description\": \"is descriptive\" }}"); bool ok (false); QVariantMap result = JSonWrapper::parse(qCompress(json), &ok,true) ; QCOMPARE(ok, true) ; QVERIFY(result.contains("dataItem") == true) ; } /** * tests that if parser is given text that is not json, * it will correctly reject the result */ void TestClassifiedAds::tryJSonParseFailure() { QByteArray json("{\"is just text, no json text,trolloloo"); bool ok (false); QVariantMap result = JSonWrapper::parse(json, &ok) ; QVERIFY(ok == false) ; } /** * tests that qvariant does get converted into json text */ void TestClassifiedAds::tryJSonSerialize() { QMap m ; m.insert("stringKey", "stringValue") ; QByteArray serialized ( JSonWrapper::serialize(QVariant(m).toMap())) ; QVERIFY(serialized.indexOf("stringValue") > 1) ; } // call rt data parse void TestClassifiedAds::tryCallDataParse() { MockUpModel* m = new MockUpModel(iController) ; ProtocolMessageParser* p = new ProtocolMessageParser(*iController,*m) ; Connection* c = new Connection(1, *this, iController->model(), *iController) ; QByteArray rtDataBytes; QByteArray callData ; callData.append("zap!") ; rtDataBytes.append(ProtocolMessageFormatter::voiceCallRtData(51, 8, MVoiceCallEngine::Audio, callData)) ; p->parseMessage(rtDataBytes,*c) ; QVERIFY( iController->voiceCallEngineMockUp()->iCallIdOfReceivedRtData == 51 && iController->voiceCallEngineMockUp()->iCalldata == callData ) ; delete c; delete p ; delete m ; } // call rt data parse void TestClassifiedAds::tryCallStatusDataParse() { MockUpModel* m = new MockUpModel(iController) ; ProtocolMessageParser* p = new ProtocolMessageParser(*iController,*m) ; Connection* c = new Connection(1, *this, iController->model(), *iController) ; VoiceCall callStatus ; callStatus.iCallId = 81 ; callStatus.iOriginatingNode = Hash ( 51,52,53,54,55) ; callStatus.iDestinationNode = Hash ( 61,62,63,65,65) ; iController->model().contentEncryptionModel().PrivateKey(iHashOfPrivateKey, callStatus.iOriginatingOperatorKey ); callStatus.iOkToProceed = true ; callStatus.iTimeOfCallAttempt = 18 ; QByteArray callData ; callData.append(ProtocolMessageFormatter::voiceCall(callStatus, *iController, iHashOfPrivateKey, false)) ; p->parseMessage(callData,*c) ; QVERIFY( iController->voiceCallEngineMockUp()->iCallId == 81 ) ; delete c; delete p ; delete m ; } // this is a complex test case that runs a lot of functionality: // this will try to publish a db record using TCL interface so // it will test-drive both db publish methods and the whole TCL // chain that is rather complex itself. to verify the publish operation // it will then try db record search to assert that the published // record is found in repository void TestClassifiedAds::tryDbRecordPublishViaTCL() { MockUpModel* m = new MockUpModel(iController) ; QString tclProg = "dict set r collectionId [ calculateSHA1 foobar-collection ]\n" "dict set r searchPhrase {chicken is a bird}\n" "dict set r searchNumber 552\n" "dict set r data {crocodile is distant relative of chicken}\n" "dict set r encrypted 0\n" "set newRecordId [ publishDbRecord $r ]\n" "exit\n" ; iController->tclWrapper().evalScript(tclProg) ; QThread::yieldCurrentThread (); QLOG_STR("Enter sleep\n") ; sleep(2) ; QLOG_STR("sleep end\n") ; iController->tclWrapper().stopScript() ; QCoreApplication::processEvents() ; QLOG_STR("Enter sleep\n") ; sleep(2) ; QLOG_STR("sleep end\n") ; // if things went all right, we now should have a record in the database // so lets check it out: Hash collection ; collection.calculate("foobar-collection") ; QString searchPhrase = "bird" ; QList recordsFound ( m->caDbRecordModel()->searchRecords(collection, KNullHash, // record id, but we don't know 1, std::numeric_limits::max()-1, -3, 1000, searchPhrase )) ; bool isRecordFound ( false ) ; foreach ( const CaDbRecord * recordFound, recordsFound ) { if ( recordFound->iSearchNumber == 552 ) { isRecordFound = true ; QVERIFY(recordFound->iData == QByteArray("crocodile is distant relative of chicken") ) ; QVERIFY(recordFound->iSearchPhrase == "chicken is a bird" ) ; QLOG_STR("recordFound->iSenderHash 0 " + QString::number(recordFound->iSenderHash.iHash160bits[0])) ; QLOG_STR("profile in use 0 " + QString::number(iController->profileInUse().iHash160bits[0])) ; QVERIFY(recordFound->iSenderHash == iController->profileInUse() ) ; QVERIFY(recordFound->iIsSignatureVerified == true ) ; } } while ( recordsFound.size() > 0 ) { CaDbRecord* recordToDelete = recordsFound.takeAt(0) ; delete recordToDelete ; } QVERIFY ( isRecordFound == true ) ; delete m ; } void TestClassifiedAds::tryEncryptedDbRecordPublish() { MockUpModel* m = new MockUpModel(iController) ; QString tclProg = QString("dict set r collectionId [ calculateSHA1 foobar-collection ]\n" "dict set r searchPhrase {bird is serious animal}\n" "dict set r searchNumber 553\n" "dict set r data {crocodile lives in Nile}\n" "dict set r encrypted 1\n" "set recipientList [ list %1 ]\n" "dict set r recordRecipients $recipientList\n" "set newRecordId [ publishDbRecord $r ]\n" "exit\n") .arg(iController->profileInUse().toString()) ; iController->tclWrapper().evalScript(tclProg) ; QThread::yieldCurrentThread (); QLOG_STR("Enter sleep\n") ; sleep(2) ; QLOG_STR("sleep end\n") ; iController->tclWrapper().stopScript() ; QCoreApplication::processEvents() ; QLOG_STR("Enter sleep\n") ; sleep(2) ; QLOG_STR("sleep end\n") ; // if things went all right, we now should have a record in the database // so lets check it out: Hash collection ; collection.calculate("foobar-collection") ; QString searchPhrase = "bird" ; QList recordsFound ( m->caDbRecordModel()->searchRecords(collection, KNullHash, // record id, but we don't know 1, std::numeric_limits::max()-1, 553, 553, searchPhrase )) ; bool isRecordFound ( false ) ; foreach ( const CaDbRecord * recordFound, recordsFound ) { if ( recordFound->iSearchNumber == 553 ) { isRecordFound = true ; QVERIFY(recordFound->iData == QByteArray("crocodile lives in Nile") ) ; QVERIFY(recordFound->iSearchPhrase == "bird is serious animal" ) ; QLOG_STR("recordFound->iSenderHash 0 " + QString::number(recordFound->iSenderHash.iHash160bits[0])) ; QLOG_STR("profile in use 0 " + QString::number(iController->profileInUse().iHash160bits[0])) ; QVERIFY(recordFound->iSenderHash == iController->profileInUse() ) ; QVERIFY(recordFound->iIsSignatureVerified == true ) ; } } while ( recordsFound.size() > 0 ) { CaDbRecord* recordToDelete = recordsFound.takeAt(0) ; delete recordToDelete ; } QVERIFY ( isRecordFound == true ) ; delete m ; } // test method for checking compatibility of database record/parse // methods in networking interface code and checking that the // transferred record is all right. void TestClassifiedAds::tryDbRecordParse() { // here utilize db record send instead of publish because there // is another (larger) test case for publish MockUpModel* m = new MockUpModel(iController) ; ProtocolMessageParser* p = new ProtocolMessageParser(*iController,*m) ; Connection* c = new Connection(1, *this, iController->model(), *iController) ; const QByteArray unCompressedData ("el data grande") ; CaDbRecord r ; r.iRecordId = Hash(4,3,2,1,1) ; r.iCollectionId.calculate(QByteArray("record collection, elvis anyone?")); r.iSearchPhrase = "The king has entered the building" ; r.iSearchNumber = 3 ; // carefully selected with random source r.iIsEncrypted = false ; r.iTimeOfPublish = 25 ; // not at epoch but a testable time anyway r.iData = qCompress(unCompressedData) ; r.iSenderHash = iController->profileInUse() ; QByteArray digitalSignature; QString additionalMetaDataStringToSign( // see similar code in verify method of cadbrecordmodel.cpp r.iRecordId.toString() + r.iCollectionId.toString() + r.iSenderHash.toString() ) ; QByteArray additionalMetaDataBytesToSign( additionalMetaDataStringToSign.toUtf8()) ; if ( iController->model() .contentEncryptionModel() .sign(iController->profileInUse(), r.iData, digitalSignature, &additionalMetaDataBytesToSign ) == 0 ) { r.iSignature = digitalSignature ; QList bangPath ; bangPath.append(1) ; QByteArray bytesOfRecord ( ProtocolMessageFormatter::dbRecordSend(r) ) ; p->parseMessage(bytesOfRecord,*c) ; QList recordsFound ( m->caDbRecordModel()->searchRecords(KNullHash, r.iRecordId)) ; bool isRecordFound ( false ) ; foreach ( const CaDbRecord * recordFound, recordsFound ) { if ( recordFound->iRecordId == r.iRecordId ) { isRecordFound = true ; QVERIFY(recordFound->iCollectionId == r.iCollectionId ) ; QVERIFY(recordFound->iSearchPhrase == r.iSearchPhrase ) ; QVERIFY(recordFound->iSearchNumber == r.iSearchNumber ) ; QVERIFY(recordFound->iTimeOfPublish == r.iTimeOfPublish ) ; QVERIFY(recordFound->iData == unCompressedData ) ; QVERIFY(recordFound->iIsSignatureVerified == true ) ; } } while ( recordsFound.size() > 0 ) { CaDbRecord* recordToDelete = recordsFound.takeAt(0) ; delete recordToDelete ; } QVERIFY ( isRecordFound == true ) ; } else { QLOG_STR("Sign of record failed") ; QVERIFY ( 1 == 2 ) ; } delete c; delete p ; delete m ; } void TestClassifiedAds::tryTCLLocalStorage() { MockUpModel* m = new MockUpModel(iController) ; QString tclProg = QString("dict set r key1 value1\n" // dictionary value 1 "dict set r key2 value2\n" // dictionary value 2 "storeLocalData $r\n" // store dict into local storage "puts {storeLocalData done}\n" // store dict into local storage "set r2 [ retrieveLocalData ]\n" // get it back "puts {retrieveLocalData done}\n" // store dict into local storage "set numberOfKeys [ llength [ dict keys $r2 ] ]\n" // count keys "storeLocalData $numberOfKeys\n" // save number of keys (==2) into storage "exit\n") ; // and get out TclProgram p ; p.setProgramName("unit test prog") ; p.setProgramText(tclProg) ; m->tclModel().locallyStoreTclProgram(p) ; iController->tclWrapper().evalScript(tclProg) ; QThread::yieldCurrentThread (); QLOG_STR("Enter sleep\n") ; sleep(2) ; QLOG_STR("sleep end\n") ; iController->tclWrapper().stopScript() ; QByteArray storageContent ( m->tclModel().retrieveTCLProgLocalData(p.iFingerPrint)) ; QString storageAsString (storageContent) ; QVERIFY( storageAsString == "2" ) ; } void TestClassifiedAds::tryDbRecordSearchCompare() { CaDbRecord::SearchTerms specific ; CaDbRecord::SearchTerms small ; CaDbRecord::SearchTerms medium ; CaDbRecord::SearchTerms large ; specific.iById = Hash ( 8,8,7,7,1 ) ; small.iModifiedAfter = 0 ; small.iModifiedBefore = 1 ; small.iByHavingNumberMoreThan = 2 ; small.iByHavingNumberLessThan = 3 ; small.iBySearchPhrase = QString::null; medium = small ; medium.iBySearchPhrase = "king" ; large = small ; large.iBySearchPhrase = "the king has left the building" ; QVERIFY((specific < small) == false ) ; QVERIFY(small < medium) ; QVERIFY(medium < large ) ; QVERIFY((specific == large) == false ) ; } void TestClassifiedAds::tryDbRecordSearchParse() { MockUpModel* m = new MockUpModel(iController) ; ProtocolMessageParser* p = new ProtocolMessageParser(*iController,*m) ; Connection* c = new Connection(1, *this, iController->model(), *iController) ; CaDbRecord::SearchTerms t ; t.iFromCollection = KNullHash ; t.iById = Hash(4,3,2,1,1) ; // used in previous test case, is found t.iModifiedAfter = 0 ; t.iModifiedBefore = std::numeric_limits::max(); t.iByHavingNumberMoreThan = std::numeric_limits::min(); t.iByHavingNumberLessThan = std::numeric_limits::max(); t.iBySearchPhrase = QString::null ; t.iBySender = KNullHash ; QByteArray bytesOfRecord ( ProtocolMessageFormatter::dbSearchTerms(t) ) ; p->parseMessage(bytesOfRecord,*c) ; // now the connection should have record in send queue. bool recordFound = false ; foreach ( const SendQueueItem& i, c->iSendQueue ) { if ( i.iHash == t.iById && i.iItemType == DbRecord ) { recordFound = true ; } } delete c; delete p ; delete m ; QVERIFY(recordFound == true) ; } void TestClassifiedAds::tryCompression() { QByteArray tdata = QString("Here is a string with unique content").toUtf8(); QByteArray cdata (qCompress(tdata)) ; QByteArray tdata2 (qUncompress(cdata)) ; QVERIFY(tdata2 == tdata) ; } void TestClassifiedAds::tryDeletingController() { delete iController ; iController = NULL ; QVERIFY(iController == NULL ) ; } void TestClassifiedAds::tryCreatingController() { iController = new MockUpController() ; controllerInstanceEx = iController ; iController->setContentKeyPasswd("salasana") ; QVERIFY(iController != NULL ) ; } bool TestClassifiedAds::dataReceived(const QByteArray& aData, Connection& aConnection ) { LOG_STR2("TestClassifiedAds::dataReceived len = %d\n", aData.size()) ; return true ; } void TestClassifiedAds::connectionClosed(Connection *aDeletee) { LOG_STR("TestClassifiedAds::connectionClosed\n") ; } void TestClassifiedAds::connectionReady(Connection *aBusinessEntity) { LOG_STR("TestClassifiedAds::connectionReady\n") ; } QTEST_MAIN(TestClassifiedAds) #include "testca.moc" classified-ads-0.13/testca/testca.pro000066400000000000000000000102161331670245300176040ustar00rootroot00000000000000# # Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. # # This file is part of Classified Ads. # # Classified Ads is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # Classified Ads 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Classified Ads; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # FORMS = ../ui/tclPrograms.ui ../ui/tclConsole.ui SOURCES = testca.cpp ../util/hash.cpp mockup_controller.cpp \ ../datamodel/model.cpp ../datamodel/nodemodel.cpp \ ../datamodel/contentencryptionmodel.cpp ../net/networklistener.cpp \ ../net/protocol_message_formatter.cpp \ ../net/protocol_message_parser.cpp \ ../net/node.cpp ../net/connection.cpp \ ../datamodel/netrequestexecutor.cpp \ ../datamodel/profile.cpp \ ../datamodel/ca.cpp \ ../datamodel/binaryfile.cpp \ ../datamodel/profilemodel.cpp \ mockup_model.cpp mockup_nodemodel.cpp \ ../datamodel/camodel.cpp \ ../datamodel/binaryfilemodel.cpp \ ../datamodel/privmsgmodel.cpp \ ../datamodel/privmsg.cpp \ ../datamodel/profilecommentmodel.cpp \ ../datamodel/searchmodel.cpp \ ../datamodel/datamodelbase.cpp \ ../datamodel/profilecomment.cpp ../datamodel/trusttreemodel.cpp \ ../util/jsonwrapper.cpp mockup_voicecallengine.cpp \ ../datamodel/voicecall.cpp ../datamodel/cadbrecord.cpp \ ../datamodel/cadbrecordmodel.cpp ../tcl/tclWrapper.cpp \ ../datamodel/tclprogram.cpp ../datamodel/tclmodel.cpp \ ../tcl/tclCallbacks.cpp ../tcl/tclUtil.cpp ../ui/tclConsole.cpp \ ../util/ungzip.cpp HEADERS = ../util/hash.h ../mcontroller.h mockup_controller.h \ ../datamodel/model.h ../datamodel/nodemodel.h \ ../datamodel/contentencryptionmodel.h ../net/networklistener.h \ ../net/protocol_message_formatter.h \ ../net/protocol_message_parser.h \ ../net/node.h ../net/connection.h \ ../datamodel/netrequestexecutor.h \ ../datamodel/profile.h \ ../datamodel/camodel.h \ ../datamodel/ca.h \ ../datamodel/binaryfile.h \ ../datamodel/binaryfilemodel.h \ ../datamodel/profilemodel.h mockup_model.h \ ../datamodel/mmodelprotocolinterface.h \ ../datamodel/mnodemodelprotocolinterface.h mockup_nodemodel.h \ ../datamodel/privmsgmodel.h \ ../datamodel/privmsg.h \ ../datamodel/profilecommentmodel.h \ ../datamodel/searchmodel.h \ ../datamodel/datamodelbase.h \ ../datamodel/profilecomment.h ../datamodel/trusttreemodel.h \ ../util/jsonwrapper.h mockup_voicecallengine.h \ ../net/mvoicecallengine.h ../datamodel/voicecall.h ../datamodel/cadbrecord.h \ ../datamodel/cadbrecordmodel.h ../tcl/tclWrapper.h \ ../datamodel/tclprogram.h ../datamodel/tclmodel.h ../tcl/tclCallbacks.h \ ../tcl/tclUtil.h ../ui/tclConsole.h ../util/ungzip.h CONFIG += debug qtestlib QT += core network sql greaterThan(QT_MAJOR_VERSION, 4) { QT += widgets } LIBS = -lssl -lcrypto -lgcrypt -lnatpmp -lminiupnpc -ltcl -ltk -lz -lbz2 lessThan(QT_MAJOR_VERSION, 5) { LIBS += -lqjson } unix:INCLUDEPATH += /usr/include/miniupnpc unix { TCL_VERSION = $$system(echo \'puts $tcl_version;exit 0\' | tclsh) message(Tcl version $$TCL_VERSION) } win32 { TCL_VERSION = 8.6 } INCLUDEPATH += /usr/include/tcl$$TCL_VERSION #if uncommenting include also -lgcov in LIBS #QMAKE_CXXFLAGS += -fprofile-arcs -ftest-coverage -DDEBUG QMAKE_CXXFLAGS += -DDEBUG classified-ads-0.13/textedit/000077500000000000000000000000001331670245300161465ustar00rootroot00000000000000classified-ads-0.13/textedit/readme.txt000066400000000000000000000001111331670245300201350ustar00rootroot00000000000000Files in this directory are from Qt examples, so thanks Qt contributors. classified-ads-0.13/textedit/textedit.cpp000066400000000000000000000714151331670245300205140ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the demonstration applications of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** GNU Lesser General Public License Usage ** This file may be used under the terms of the GNU Lesser General Public ** License version 2.1 as published by the Free Software Foundation and ** appearing in the file LICENSE.LGPL included in the packaging of this ** file. Please review the following information to ensure the GNU Lesser ** General Public License version 2.1 requirements will be met: ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU General ** Public License version 3.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of this ** file. Please review the following information to ensure the GNU General ** Public License version 3.0 requirements will be met: ** http://www.gnu.org/copyleft/gpl.html. ** ** Other Usage ** Alternatively, this file may be used in accordance with the terms and ** conditions contained in a signed written agreement between you and Nokia. ** ** ** ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "textedit.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../log.h" #include "../ui/insertlinkdialog.h" #include #if QT_VERSION >= 0x050000 // qt5 has its own mime-type-handling so lets depend on that, easier.. #include #else // with qt4 use libmagic that does the same job #include // from libmagic #endif #ifdef Q_WS_MAC const QString rsrcPath = ":/images/mac"; #else const QString rsrcPath = ":/images/win"; #endif TextEdit::TextEdit(QWidget* aParent, MController* aController, Profile& aSelectedProfile) : DialogBase(aParent,aController,aSelectedProfile), textEdit(NULL), iWidgetForActionsUpper(NULL), iWidgetForActionsLower(NULL), iDialogMenuBar(NULL) { } TextEdit::~TextEdit() { delete iDialogMenuBar ; } void TextEdit::addAction(QWidget* aAction,bool aLower) { if ( aLower ) { iWidgetForActionsLower->addWidget(aAction) ; } else { iWidgetForActionsUpper->addWidget(aAction) ; } } void TextEdit::addAction(QAction* aAction) { tb->addAction(aAction) ; } void TextEdit::initializeTextEditor(QTextEdit *aTextEdit, QLayout *aLayOutForMenu, QLayout* aWidgetForActionsUpper, QLayout* aWidgetForActionsLower) { // setToolButtonStyle(Qt::ToolButtonFollowStyle); iDialogMenuBar = new QMenuBar() ; aLayOutForMenu->setMenuBar(iDialogMenuBar) ; iWidgetForActionsUpper = aWidgetForActionsUpper ; iWidgetForActionsLower = aWidgetForActionsLower ; setupFileActions(); setupEditActions(); setupTextActions(); { QMenu *helpMenu = new QMenu(tr("Help"), this); menuBar()->addMenu(helpMenu); helpMenu->addAction(tr("About &Qt"), qApp, SLOT(aboutQt())); } textEdit = aTextEdit ; connect(textEdit, SIGNAL(currentCharFormatChanged(QTextCharFormat)), this, SLOT(currentCharFormatChanged(QTextCharFormat))); connect(textEdit, SIGNAL(cursorPositionChanged()), this, SLOT(cursorPositionChanged())); // setCentralWidget(textEdit); textEdit->setFocus(); setCurrentFileName(QString()); fontChanged(textEdit->font()); colorChanged(textEdit->textColor()); alignmentChanged(textEdit->alignment()); connect(textEdit->document(), SIGNAL(modificationChanged(bool)), actionSave, SLOT(setEnabled(bool))); connect(textEdit->document(), SIGNAL(modificationChanged(bool)), this, SLOT(setWindowModified(bool))); connect(textEdit->document(), SIGNAL(undoAvailable(bool)), actionUndo, SLOT(setEnabled(bool))); connect(textEdit->document(), SIGNAL(redoAvailable(bool)), actionRedo, SLOT(setEnabled(bool))); setWindowModified(textEdit->document()->isModified()); actionSave->setEnabled(textEdit->document()->isModified()); actionUndo->setEnabled(textEdit->document()->isUndoAvailable()); actionRedo->setEnabled(textEdit->document()->isRedoAvailable()); connect(actionUndo, SIGNAL(triggered()), textEdit, SLOT(undo())); connect(actionRedo, SIGNAL(triggered()), textEdit, SLOT(redo())); actionCut->setEnabled(false); actionCopy->setEnabled(false); connect(actionCut, SIGNAL(triggered()), textEdit, SLOT(cut())); connect(actionCopy, SIGNAL(triggered()), textEdit, SLOT(copy())); connect(actionPaste, SIGNAL(triggered()), textEdit, SLOT(paste())); connect(textEdit, SIGNAL(copyAvailable(bool)), actionCut, SLOT(setEnabled(bool))); connect(textEdit, SIGNAL(copyAvailable(bool)), actionCopy, SLOT(setEnabled(bool))); #ifndef QT_NO_CLIPBOARD connect(QApplication::clipboard(), SIGNAL(dataChanged()), this, SLOT(clipboardDataChanged())); #endif fileNew(); } void TextEdit::closeEvent(QCloseEvent *e) { e->accept(); } void TextEdit::setupFileActions() { tb = new QToolBar(this); tb->setWindowTitle(tr("Edit Actions")); iWidgetForActionsUpper->addWidget(tb) ; QMenu *menu = new QMenu(tr("&File"), this); menuBar()->addMenu(menu); QAction *a; a = new QAction(QIcon::fromTheme("document-open", QIcon(rsrcPath + "/fileopen.png")), tr("&Open..."), this); a->setShortcut(QKeySequence::Open); connect(a, SIGNAL(triggered()), this, SLOT(fileOpen())); addAction(a); menu->addAction(a); menu->addSeparator(); actionSave = a = new QAction(QIcon::fromTheme("document-save", QIcon(rsrcPath + "/filesave.png")), tr("&Save locally before send"), this); a->setShortcut(QKeySequence::Save); connect(a, SIGNAL(triggered()), this, SLOT(fileSave())); a->setEnabled(false); addAction(a); menu->addAction(a); a = new QAction(tr("Save locally &As..."), this); a->setPriority(QAction::LowPriority); connect(a, SIGNAL(triggered()), this, SLOT(fileSaveAs())); menu->addAction(a); menu->addSeparator(); #ifndef QT_NO_PRINTER a = new QAction(QIcon::fromTheme("document-print", QIcon(rsrcPath + "/fileprint.png")), tr("&Print..."), this); a->setPriority(QAction::LowPriority); a->setShortcut(QKeySequence::Print); connect(a, SIGNAL(triggered()), this, SLOT(filePrint())); addAction(a); menu->addAction(a); a = new QAction(QIcon::fromTheme("fileprint", QIcon(rsrcPath + "/fileprint.png")), tr("Print Preview..."), this); connect(a, SIGNAL(triggered()), this, SLOT(filePrintPreview())); menu->addAction(a); a = new QAction(QIcon::fromTheme("exportpdf", QIcon(rsrcPath + "/exportpdf.png")), tr("&Export PDF..."), this); a->setPriority(QAction::LowPriority); a->setShortcut(Qt::CTRL + Qt::Key_D); connect(a, SIGNAL(triggered()), this, SLOT(filePrintPdf())); addAction(a); menu->addAction(a); menu->addSeparator(); #endif } void TextEdit::setupEditActions() { QMenu *menu = new QMenu(tr("&Edit"), this); menuBar()->addMenu(menu); QAction *a; a = actionUndo = new QAction(QIcon::fromTheme("edit-undo", QIcon(rsrcPath + "/editundo.png")), tr("&Undo"), this); a->setShortcut(QKeySequence::Undo); addAction(a); menu->addAction(a); a = actionRedo = new QAction(QIcon::fromTheme("edit-redo", QIcon(rsrcPath + "/editredo.png")), tr("&Redo"), this); a->setPriority(QAction::LowPriority); a->setShortcut(QKeySequence::Redo); addAction(a); menu->addAction(a); menu->addSeparator(); a = actionCut = new QAction(QIcon::fromTheme("edit-cut", QIcon(rsrcPath + "/editcut.png")), tr("Cu&t"), this); a->setPriority(QAction::LowPriority); a->setShortcut(QKeySequence::Cut); addAction(a); menu->addAction(a); a = actionCopy = new QAction(QIcon::fromTheme("edit-copy", QIcon(rsrcPath + "/editcopy.png")), tr("&Copy"), this); a->setPriority(QAction::LowPriority); a->setShortcut(QKeySequence::Copy); addAction(a); menu->addAction(a); a = actionPaste = new QAction(QIcon::fromTheme("edit-paste", QIcon(rsrcPath + "/editpaste.png")), tr("&Paste"), this); a->setPriority(QAction::LowPriority); a->setShortcut(QKeySequence::Paste); addAction(a); menu->addAction(a); #ifndef QT_NO_CLIPBOARD if (const QMimeData *md = QApplication::clipboard()->mimeData()) actionPaste->setEnabled(md->hasText()); #endif menu->addSeparator(); actionInsertLink = new QAction(tr("Insert link"), this) ; connect(actionInsertLink, SIGNAL(triggered()), this, SLOT(insertLinkSelected())) ; menu->addAction(actionInsertLink) ; actionInsertImage = new QAction(tr("Embed image"), this) ; connect(actionInsertImage, SIGNAL(triggered()), this, SLOT(insertImageSelected())) ; menu->addAction(actionInsertImage) ; } void TextEdit::setupTextActions() { QMenu *menu = new QMenu(tr("F&ormat"), this); menuBar()->addMenu(menu); actionTextBold = new QAction(QIcon::fromTheme("format-text-bold", QIcon(rsrcPath + "/textbold.png")), tr("&Bold"), this); actionTextBold->setShortcut(Qt::CTRL + Qt::Key_B); actionTextBold->setPriority(QAction::LowPriority); QFont bold; bold.setBold(true); actionTextBold->setFont(bold); connect(actionTextBold, SIGNAL(triggered()), this, SLOT(textBold())); addAction(actionTextBold); menu->addAction(actionTextBold); actionTextBold->setCheckable(true); actionTextItalic = new QAction(QIcon::fromTheme("format-text-italic", QIcon(rsrcPath + "/textitalic.png")), tr("&Italic"), this); actionTextItalic->setPriority(QAction::LowPriority); actionTextItalic->setShortcut(Qt::CTRL + Qt::Key_I); QFont italic; italic.setItalic(true); actionTextItalic->setFont(italic); connect(actionTextItalic, SIGNAL(triggered()), this, SLOT(textItalic())); addAction(actionTextItalic); menu->addAction(actionTextItalic); actionTextItalic->setCheckable(true); actionTextUnderline = new QAction(QIcon::fromTheme("format-text-underline", QIcon(rsrcPath + "/textunder.png")), tr("&Underline"), this); actionTextUnderline->setShortcut(Qt::CTRL + Qt::Key_U); actionTextUnderline->setPriority(QAction::LowPriority); QFont underline; underline.setUnderline(true); actionTextUnderline->setFont(underline); connect(actionTextUnderline, SIGNAL(triggered()), this, SLOT(textUnderline())); addAction(actionTextUnderline); menu->addAction(actionTextUnderline); actionTextUnderline->setCheckable(true); menu->addSeparator(); QActionGroup *grp = new QActionGroup(this); connect(grp, SIGNAL(triggered(QAction*)), this, SLOT(textAlign(QAction*))); // Make sure the alignLeft is always left of the alignRight if (QApplication::isLeftToRight()) { actionAlignLeft = new QAction(QIcon::fromTheme("format-justify-left", QIcon(rsrcPath + "/textleft.png")), tr("&Left"), grp); actionAlignCenter = new QAction(QIcon::fromTheme("format-justify-center", QIcon(rsrcPath + "/textcenter.png")), tr("C&enter"), grp); actionAlignRight = new QAction(QIcon::fromTheme("format-justify-right", QIcon(rsrcPath + "/textright.png")), tr("&Right"), grp); } else { actionAlignRight = new QAction(QIcon::fromTheme("format-justify-right", QIcon(rsrcPath + "/textright.png")), tr("&Right"), grp); actionAlignCenter = new QAction(QIcon::fromTheme("format-justify-center", QIcon(rsrcPath + "/textcenter.png")), tr("C&enter"), grp); actionAlignLeft = new QAction(QIcon::fromTheme("format-justify-left", QIcon(rsrcPath + "/textleft.png")), tr("&Left"), grp); } actionAlignJustify = new QAction(QIcon::fromTheme("format-justify-fill", QIcon(rsrcPath + "/textjustify.png")), tr("&Justify"), grp); actionAlignLeft->setShortcut(Qt::CTRL + Qt::Key_L); actionAlignLeft->setCheckable(true); actionAlignLeft->setPriority(QAction::LowPriority); actionAlignCenter->setShortcut(Qt::CTRL + Qt::Key_E); actionAlignCenter->setCheckable(true); actionAlignCenter->setPriority(QAction::LowPriority); actionAlignRight->setShortcut(Qt::CTRL + Qt::Key_R); actionAlignRight->setCheckable(true); actionAlignRight->setPriority(QAction::LowPriority); actionAlignJustify->setShortcut(Qt::CTRL + Qt::Key_J); actionAlignJustify->setCheckable(true); actionAlignJustify->setPriority(QAction::LowPriority); addAction(actionAlignLeft) ; addAction(actionAlignCenter) ; addAction(actionAlignRight); addAction(actionAlignJustify) ; menu->addActions(grp->actions()); menu->addSeparator(); QPixmap pix(16, 16); pix.fill(Qt::black); actionTextColor = new QAction(pix, tr("&Color..."), this); connect(actionTextColor, SIGNAL(triggered()), this, SLOT(textColor())); addAction(actionTextColor); menu->addAction(actionTextColor); comboStyle = new QComboBox(tb); addAction(comboStyle,true); comboStyle->addItem(tr("Standard")); comboStyle->addItem(tr("Bullet List (Disc)")); comboStyle->addItem(tr("Bullet List (Circle)")); comboStyle->addItem(tr("Bullet List (Square)")); comboStyle->addItem(tr("Ordered List (Decimal)")); comboStyle->addItem(tr("Ordered List (Alpha lower)")); comboStyle->addItem(tr("Ordered List (Alpha upper)")); comboStyle->addItem(tr("Ordered List (Roman lower)")); comboStyle->addItem(tr("Ordered List (Roman upper)")); connect(comboStyle, SIGNAL(activated(int)), this, SLOT(textStyle(int))); comboFont = new QFontComboBox(tb); addAction(comboFont,true); connect(comboFont, SIGNAL(activated(QString)), this, SLOT(textFamily(QString))); comboSize = new QComboBox(tb); comboSize->setObjectName("comboSize"); addAction(comboSize,true); comboSize->setEditable(true); QFontDatabase db; foreach(int size, db.standardSizes()) comboSize->addItem(QString::number(size)); connect(comboSize, SIGNAL(activated(QString)), this, SLOT(textSize(QString))); comboSize->setCurrentIndex(comboSize->findText(QString::number(QApplication::font() .pointSize()))); } bool TextEdit::load(const QString &f) { if (!QFile::exists(f)) return false; QFile file(f); if (!file.open(QFile::ReadOnly)) return false; QByteArray data = file.readAll(); QTextCodec *codec = Qt::codecForHtml(data); QString str = codec->toUnicode(data); if (Qt::mightBeRichText(str)) { textEdit->setHtml(str); } else { str = QString::fromLocal8Bit(data); textEdit->setPlainText(str); } setCurrentFileName(f); return true; } bool TextEdit::maybeSave() { if (!textEdit->document()->isModified()) return true; if (fileName.startsWith(QLatin1String(":/"))) return true; QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, tr("Application"), tr("The document has been modified.\n" "Do you want to save your changes?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); if (ret == QMessageBox::Save) return fileSave(); else if (ret == QMessageBox::Cancel) return false; return true; } void TextEdit::setCurrentFileName(const QString &fileName) { this->fileName = fileName; textEdit->document()->setModified(false); } void TextEdit::fileNew() { if (maybeSave()) { textEdit->clear(); setCurrentFileName(QString()); } } void TextEdit::fileOpen() { QString fn = QFileDialog::getOpenFileName(this, tr("Open File..."), QString(), tr("HTML-Files (*.htm *.html);;All Files (*)")); if (!fn.isEmpty()) load(fn); } bool TextEdit::fileSave() { if (fileName.isEmpty()) return fileSaveAs(); QTextDocumentWriter writer(fileName); bool success = writer.write(textEdit->document()); if (success) textEdit->document()->setModified(false); return success; } bool TextEdit::fileSaveAs() { QString fn = QFileDialog::getSaveFileName(this, tr("Save as..."), QString(), tr("ODF files (*.odt);;HTML-Files (*.htm *.html);;All Files (*)")); if (fn.isEmpty()) return false; if (! (fn.endsWith(".odt", Qt::CaseInsensitive) || fn.endsWith(".htm", Qt::CaseInsensitive) || fn.endsWith(".html", Qt::CaseInsensitive)) ) fn += ".odt"; // default setCurrentFileName(fn); return fileSave(); } void TextEdit::filePrint() { #ifndef QT_NO_PRINTER QPrinter printer(QPrinter::HighResolution); QPrintDialog *dlg = new QPrintDialog(&printer, this); if (textEdit->textCursor().hasSelection()) dlg->addEnabledOption(QAbstractPrintDialog::PrintSelection); dlg->setWindowTitle(tr("Print Document")); if (dlg->exec() == QDialog::Accepted) { textEdit->print(&printer); } delete dlg; #endif } void TextEdit::filePrintPreview() { #ifndef QT_NO_PRINTER QPrinter printer(QPrinter::HighResolution); QPrintPreviewDialog preview(&printer, this); connect(&preview, SIGNAL(paintRequested(QPrinter*)), SLOT(printPreview(QPrinter*))); preview.exec(); #endif } void TextEdit::insertLinkSelected() { QLOG_STR("TextEdit::insertLinkSelected") ; InsertLinkDialog *link_dialog = new InsertLinkDialog(this, iController) ; connect(link_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; connect(this, SIGNAL( accepted() ), link_dialog, SLOT(deleteLater()), Qt::QueuedConnection ) ; connect(this, SIGNAL( rejected() ), link_dialog, SLOT(deleteLater()), Qt::QueuedConnection ) ; // don't connect as queued, it transfers pointers assert( connect ( link_dialog, SIGNAL( linkReady(const QString& , const QString& ) ), this, SLOT( linkReady(const QString& , const QString& ) ) ) ); link_dialog->show() ; // the dialog will delete self } // // motivation here: we want to insert html snippet that // looks like this: // Embedded Image // void TextEdit::insertImageSelected() { QLOG_STR("TextEdit::insertImageSelected") ; QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("Files (*.*)")); bool imageIsOk (false) ; if ( fileName.length() > 0 ) { QPixmap pic ; if ( ! pic.load(fileName) ) { QMessageBox::about(this,tr("Error"), tr("Can't load image")); return ; } else { imageIsOk = true ; } } if ( imageIsOk ) { QString mimeType ; #if QT_VERSION >= 0x050000 QMimeDatabase db ; QMimeType detectedType ( db.mimeTypeForFile(fileName) ) ; if ( detectedType.isValid() ) { mimeType = detectedType.name() ; } #else const char *fileNameCStyleHeap (fileName.toUtf8().constData()) ; char fileNameCStyle[1024] ; if ( strlen(fileNameCStyleHeap) < 1024 ) { strncpy(fileNameCStyle, fileNameCStyleHeap, 1023) ; // code stolen from http://vivithemage.co.uk/blog/?p=105 so thanks Vivi. magic_t magic_cookie; /*MAGIC_MIME tells magic to return a mime of the file, but you can specify different things*/ magic_cookie = magic_open(MAGIC_MIME); if (magic_cookie == NULL) { QLOG_STR("unable to initialize magic library"); return ; } if (magic_load(magic_cookie, NULL) != 0) { LOG_STR2("cannot load magic database - %s", magic_error(magic_cookie)); magic_close(magic_cookie); return ; } LOG_STR2("Filename for magic = >%s<", fileNameCStyle); const char *magic_full( magic_file(magic_cookie, fileNameCStyle) ) ; if ( magic_full == NULL ) { LOG_STR2("Magic_file error - %s", magic_error(magic_cookie)); } else { mimeType = QString::fromUtf8(magic_full) ; } magic_close(magic_cookie); } #endif if ( mimeType.length() > 0 ) { int indexOfSemicolon = mimeType.indexOf(';') ; if ( indexOfSemicolon > 1 ) { QLOG_STR("Pruning semicolon from mime type " + mimeType) ; mimeType = mimeType.left(indexOfSemicolon) ; } QLOG_STR("mime type " + mimeType) ; QFile f ( fileName ) ; if ( f.open(QIODevice::ReadOnly) ) { if ( f.size() > KMaxProtocolItemSize ) { emit error ( MController::FileOperationError, tr("File way too big")) ; } else { QByteArray content ( f.read(f.size() ) ) ; QString snippet = "\""+QFileInfo(f).fileName()+"\"" ; content.clear() ; if ( ( (quint32)(snippet.length()) + (quint32)(textEdit->toHtml().length()) + 10240 ) > KMaxProtocolItemSize ) { emit error ( MController::FileOperationError, tr("File way too big")) ; } else { textEdit->insertHtml(snippet) ; } } } } } } void TextEdit::printPreview(QPrinter *printer) { #ifdef QT_NO_PRINTER Q_UNUSED(printer); #else textEdit->print(printer); #endif } void TextEdit::filePrintPdf() { #ifndef QT_NO_PRINTER //! [0] QString fileName = QFileDialog::getSaveFileName(this, "Export PDF", QString(), "*.pdf"); if (!fileName.isEmpty()) { if (QFileInfo(fileName).suffix().isEmpty()) fileName.append(".pdf"); QPrinter printer(QPrinter::HighResolution); printer.setOutputFormat(QPrinter::PdfFormat); printer.setOutputFileName(fileName); textEdit->document()->print(&printer); } //! [0] #endif } void TextEdit::textBold() { QTextCharFormat fmt; fmt.setFontWeight(actionTextBold->isChecked() ? QFont::Bold : QFont::Normal); mergeFormatOnWordOrSelection(fmt); } void TextEdit::textUnderline() { QTextCharFormat fmt; fmt.setFontUnderline(actionTextUnderline->isChecked()); mergeFormatOnWordOrSelection(fmt); } void TextEdit::textItalic() { QTextCharFormat fmt; fmt.setFontItalic(actionTextItalic->isChecked()); mergeFormatOnWordOrSelection(fmt); } void TextEdit::textFamily(const QString &f) { QTextCharFormat fmt; fmt.setFontFamily(f); mergeFormatOnWordOrSelection(fmt); } void TextEdit::textSize(const QString &p) { qreal pointSize = p.toFloat(); if (p.toFloat() > 0) { QTextCharFormat fmt; fmt.setFontPointSize(pointSize); mergeFormatOnWordOrSelection(fmt); } } void TextEdit::textStyle(int styleIndex) { QTextCursor cursor = textEdit->textCursor(); if (styleIndex != 0) { QTextListFormat::Style style = QTextListFormat::ListDisc; switch (styleIndex) { default: case 1: style = QTextListFormat::ListDisc; break; case 2: style = QTextListFormat::ListCircle; break; case 3: style = QTextListFormat::ListSquare; break; case 4: style = QTextListFormat::ListDecimal; break; case 5: style = QTextListFormat::ListLowerAlpha; break; case 6: style = QTextListFormat::ListUpperAlpha; break; case 7: style = QTextListFormat::ListLowerRoman; break; case 8: style = QTextListFormat::ListUpperRoman; break; } cursor.beginEditBlock(); QTextBlockFormat blockFmt = cursor.blockFormat(); QTextListFormat listFmt; if (cursor.currentList()) { listFmt = cursor.currentList()->format(); } else { listFmt.setIndent(blockFmt.indent() + 1); blockFmt.setIndent(0); cursor.setBlockFormat(blockFmt); } listFmt.setStyle(style); cursor.createList(listFmt); cursor.endEditBlock(); } else { QTextBlockFormat bfmt; bfmt.setObjectIndex(-1); cursor.mergeBlockFormat(bfmt); } textEdit->setFocus() ; } void TextEdit::textColor() { QColor col = QColorDialog::getColor(textEdit->textColor(), this); if (!col.isValid()) return; QTextCharFormat fmt; fmt.setForeground(col); mergeFormatOnWordOrSelection(fmt); colorChanged(col); textEdit->setFocus() ; } void TextEdit::textAlign(QAction *a) { if (a == actionAlignLeft) textEdit->setAlignment(Qt::AlignLeft | Qt::AlignAbsolute); else if (a == actionAlignCenter) textEdit->setAlignment(Qt::AlignHCenter); else if (a == actionAlignRight) textEdit->setAlignment(Qt::AlignRight | Qt::AlignAbsolute); else if (a == actionAlignJustify) textEdit->setAlignment(Qt::AlignJustify); textEdit->setFocus() ; } void TextEdit::currentCharFormatChanged(const QTextCharFormat &format) { fontChanged(format.font()); colorChanged(format.foreground().color()); textEdit->setFocus(); } void TextEdit::cursorPositionChanged() { alignmentChanged(textEdit->alignment()); } void TextEdit::clipboardDataChanged() { #ifndef QT_NO_CLIPBOARD if (const QMimeData *md = QApplication::clipboard()->mimeData()) actionPaste->setEnabled(md->hasText()); #endif } void TextEdit::mergeFormatOnWordOrSelection(const QTextCharFormat &format) { QTextCursor cursor = textEdit->textCursor(); if (!cursor.hasSelection()) cursor.select(QTextCursor::WordUnderCursor); cursor.mergeCharFormat(format); textEdit->mergeCurrentCharFormat(format); } void TextEdit::fontChanged(const QFont &f) { comboFont->setCurrentIndex(comboFont->findText(QFontInfo(f).family())); comboSize->setCurrentIndex(comboSize->findText(QString::number(f.pointSize()))); actionTextBold->setChecked(f.bold()); actionTextItalic->setChecked(f.italic()); actionTextUnderline->setChecked(f.underline()); } void TextEdit::colorChanged(const QColor &c) { QPixmap pix(16, 16); pix.fill(c); actionTextColor->setIcon(pix); } void TextEdit::alignmentChanged(Qt::Alignment a) { if (a & Qt::AlignLeft) { actionAlignLeft->setChecked(true); } else if (a & Qt::AlignHCenter) { actionAlignCenter->setChecked(true); } else if (a & Qt::AlignRight) { actionAlignRight->setChecked(true); } else if (a & Qt::AlignJustify) { actionAlignJustify->setChecked(true); } } void TextEdit::linkReady(const QString& aLinkAddress, const QString& aLinkLabel) { QLOG_STR("link ready " + aLinkAddress) ; QLOG_STR("link label " + aLinkLabel) ; textEdit->insertHtml("
"+aLinkLabel+" ") ; } classified-ads-0.13/textedit/textedit.h000066400000000000000000000131521331670245300201530ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the demonstration applications of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** GNU Lesser General Public License Usage ** This file may be used under the terms of the GNU Lesser General Public ** License version 2.1 as published by the Free Software Foundation and ** appearing in the file LICENSE.LGPL included in the packaging of this ** file. Please review the following information to ensure the GNU Lesser ** General Public License version 2.1 requirements will be met: ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU General ** Public License version 3.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of this ** file. Please review the following information to ensure the GNU General ** Public License version 3.0 requirements will be met: ** http://www.gnu.org/copyleft/gpl.html. ** ** Other Usage ** Alternatively, this file may be used in accordance with the terms and ** conditions contained in a signed written agreement between you and Nokia. ** ** ** ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef TEXTEDIT_H #define TEXTEDIT_H #include #include #include #include "../ui/dialogbase.h" QT_FORWARD_DECLARE_CLASS(QAction) QT_FORWARD_DECLARE_CLASS(QComboBox) QT_FORWARD_DECLARE_CLASS(QFontComboBox) QT_FORWARD_DECLARE_CLASS(QTextEdit) QT_FORWARD_DECLARE_CLASS(QTextCharFormat) QT_FORWARD_DECLARE_CLASS(QMenu) class QLayout ; class QWidget ; class QMenuBar ; class QPrinter ; class QToolBar ; /** * @brief text editor class. * * This is inteneded for inheritance for dialogs that allow editing * of content. Implements a very nice rich text editor. */ class TextEdit : public DialogBase { Q_OBJECT public: /** * Constructor. Does very basic init only, method * @ref TextEdit::initializeTextEditor must be called * before this class is functional */ TextEdit(QWidget* aParent, MController* aController, Profile& aSelectedProfile); /** destructor */ ~TextEdit() ; /** * Actual initialization of the editor. * * @param aTextEdit pointer to actual editing area, allocated * by inheriting class that has UI-layout. Inheriting class * remains responsible to delete the editor after use. */ void initializeTextEditor(QTextEdit *aTextEdit, QLayout *aLayOutForMenu, QLayout* aWidgetForActionsUpper, QLayout* aWidgetForActionsLower) ; public slots: /** * this slot is called when user has finished entering a link * and it is ready to be included in the document */ virtual void linkReady(const QString& aLinkAddress, const QString& aLinkLabel) ; protected: virtual void closeEvent(QCloseEvent *e); private: void setupFileActions(); void setupEditActions(); void setupTextActions(); bool load(const QString &f); bool maybeSave(); void setCurrentFileName(const QString &fileName); private slots: void fileNew(); void fileOpen(); bool fileSave(); bool fileSaveAs(); void filePrint(); void filePrintPreview(); void filePrintPdf(); void textBold(); void textUnderline(); void textItalic(); void textFamily(const QString &f); void textSize(const QString &p); void textStyle(int styleIndex); void textColor(); void textAlign(QAction *a); void currentCharFormatChanged(const QTextCharFormat &format); void cursorPositionChanged(); void clipboardDataChanged(); void printPreview(QPrinter *); void insertLinkSelected() ; /**< user says he wants insert a link */ void insertImageSelected() ; /**< user says he wants embed an image */ private: void mergeFormatOnWordOrSelection(const QTextCharFormat &format); void fontChanged(const QFont &f); void colorChanged(const QColor &c); void alignmentChanged(Qt::Alignment a); /** method for adding editing action to designated area */ void addAction(QAction* aAction) ; void addAction(QWidget* aAction,bool aLower=true) ; /** returns dialog menu bar */ QMenuBar* menuBar() { return iDialogMenuBar ; } ; protected: // variables QTextEdit *textEdit; /**< holds the text being edited */ private: // variables QAction *actionSave, *actionTextBold, *actionTextUnderline, *actionTextItalic, *actionTextColor, *actionAlignLeft, *actionAlignCenter, *actionAlignRight, *actionAlignJustify, *actionUndo, *actionRedo, *actionCut, *actionCopy, *actionPaste, *actionInsertLink, *actionInsertImage; QComboBox *comboStyle; QFontComboBox *comboFont; QComboBox *comboSize; QToolBar *tb; QString fileName; QLayout* iWidgetForActionsUpper ; QLayout* iWidgetForActionsLower ; QMenuBar* iDialogMenuBar ; }; #endif classified-ads-0.13/ui/000077500000000000000000000000001331670245300147315ustar00rootroot00000000000000classified-ads-0.13/ui/aboutDialog.ui000066400000000000000000000264041331670245300175300ustar00rootroot00000000000000 aboutDialog 0 0 601 653 0 0 0 0 About classified ads true QLayout::SetDefaultConstraint 0 0 QFrame::Plain Qt::ScrollBarAlwaysOn Qt::ScrollBarAlwaysOff false 0 0 566 2500 0 0 true 2 -2 811 2671 2 12 75 true Classified ads is a program for online communications Qt::RichText Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter true true 558 443 558 443 :/ui/ui/turt558.png:/ui/ui/turt558.png 558 443 true 550 2200 550 2200 <html><head/><body><p>Classified ads is free software. You may use, copy and modify it if you follow the conditions given in GNU lesser general public license version 2.1.</p><p>Classified ads is copyright ТЉ Antti JУЄrvinen 2013. </p><p>Main feature of the program is an &quot;advertisement&quot; - a piece of text belonging to selected classification. There are several pre-programmed classifications and operators are encouraged to invent new classifications for new purposes ; the selection boxes in classification-selection tab are editable. Other operators may then view the ads, publicly comment the ads, the operators and also send private messages to each others. </p><p>Another important feature of classified ads is that it is designed to be operated without any centralized server infrastructure - it is you and other operators whose computers store and transmit all the content visible inside classified ads. To get connected you need to know address of at least one existing computer (a <span style=" font-style:italic;">node</span>) so if your network connection dialog shows no connections, you may need to contact someone you know is using the software and ask for address of her node to make initial contact with the network. Once connected the software should maintain list of addresses of other nodes. </p><p>Due to its server-less design the whole system works best if you leave the program running always when you have your computer powered on ; while processing other operators requests it will hog some computing resources and generate network traffic also when you are not actively using the program yourself - others are. </p><p>Operators concerned about privacy of the content should be aware of following items:</p><p>- Data storage implementation is variant of <span style=" font-style:italic;">distributed hash table</span>, practically meaning that content posted by you gets copied some more-or-less random nodes in the network. </p><p>- Any data item (ad, comment, binary file, private message etc.) is digitally signed. This makes it more difficult to try to pose as another operator. </p><p>- Operators are reliably identified only by the SHA1 hash of their generated encryption keys. SHA1 hash is displayed when viewing details of operator profiles. Other identifying information like nickname or city name are entered by operator himself and can be anything. The operator profile, as it is published to the network, is also signed with the encryption keys of the operator - if you identify an operator by her SHA1 hash, you have a mechanism for identifying if any content inside classified ads is posted by this operator or not. Classified ads internally checks for digital signatures, throwing away content that fails signature check and tries to provide SHA1 hash of the operator who posted the content.</p><p>- All classified ads are posted as plain text, no encryption is used. All public profiles are posted as plain text, no encryption is used. If profile is made private, it is encrypted to be readable only by selected other profiles. This applies also to binary files shared by operators private profiles and comments about private profiles after the profile was made private (previously plain-text comments or files don't get magically encrypted afterwards). Private messages are encrypted always to be readable only by recipient and sender. Attachments follow the privacy rules of the document, they're attached to. </p><p>- As is the case with all internet-communications, this small fact is true for classified ads too : <span style=" font-style:italic;">once something gets posted online, there is no way to remove it from network</span>. </p><p>- Data encryption implementation for content is OpenSSL, relying mostly on algorithms RSA-2048 and AES-256. </p><p>- While connections between nodes are implemented using SSL, other nodes inside network do get to know what content is being transmitted in neighboring nodes. While there is no central point for easily collecting this information about particular classification or operator, operators still should expect no privacy regarding their doings online, although some effort has been been put into hiding <span style=" font-style:italic;">contents</span> of private messages and private profiles. </p><p>Programming was (mostly) done by Antti JУЄrvinen, artwork by Meeri JУЄrvinen.</p><p>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/).</p><p>Happy advertising!</p><p><br/></p></body></html> Qt::RichText Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true true QDialogButtonBox::Close closeButtonBox rejected() aboutDialog deleteLater() 260 138 260 81 classified-ads-0.13/ui/aboutdialog.cpp000066400000000000000000000024601331670245300177310ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "../mcontroller.h" #include "../log.h" #include "aboutdialog.h" AboutDialog::AboutDialog(QWidget *aParent, MController& aController) : QDialog(aParent), iController(aController) { ui.setupUi(this) ; connect (this, SIGNAL(rejected()), this, SLOT(deleteLater())) ; } AboutDialog::~AboutDialog() { LOG_STR("AboutDialog::~AboutDialog\n") ; } classified-ads-0.13/ui/aboutdialog.h000066400000000000000000000026131331670245300173760ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CA_ABOUT_DIALOG_H #define CA_ABOUT_DIALOG_H #include #include "../mcontroller.h" #include "../ui_aboutDialog.h" /** * @brief class for displaying brief information about this sw */ class AboutDialog : public QDialog { Q_OBJECT public: /** * Constructor. */ AboutDialog(QWidget *aParent, MController& aController ); /** destructor */ ~AboutDialog(); private slots: private: Ui_aboutDialog ui ; MController& iController ; }; #endif classified-ads-0.13/ui/acoustic.rawopus000066400000000000000000001566171331670245300202050ustar00rootroot00000000000000“^ˆЉ2М™а9…,!уIGWmžіlgjрR$=МcŒЮ щv$њC*Q €m‘§дЯяъЧјм?J0•;hwC vИј9 ЂЕНŒЌ ђMpD8ДwTŒ…A;:Уxoѓ—>JdЯ\Z~{Њ$БHlмч.ќНс!?кц!Ѕ ATI~˜wо„€”*P`Р 1ѕЧОЦЖoдBЉЄe>ООі˜Ф(яДnОхId-@L3`9,‚­/y?uH1OОХf›3ЬШH…њХБќ&a!|цƒчУC˜ ЕНHw€Ÿ0Зњ3 њЧ‹,З,Д.зѕѓ :ƒяmhˆƒuŽ‘!Оx"fЇњˆ>@ЂC2DбrZѕбсb-лЙР‘ R$`Cx)№-ЋœТйз~ѕжфАn7СюМА&2чXВ•Ž}vl ?…*)Н@1Œ'•SХЭХЌyжƒn)p\vˆ*љejLѕi…тŽВнзах} 12yДяЪX}Дќц˜DІоŠѓ?Џ-ьъ.cёsaPSЛ%љ,0~;^фЖЁŸœДDљ‚Q ™ уBе9m)w‡ГaХШФg6ОƒП*3дg1фѓ_=Й‰ъ…Я>ž|% ˆЁИю_Э@n&,D&ЯoЁM>+˜Ссў061бUrЂgюЄПA ЈЬH>|бм h}O*;mоЖ9 dЄ­8oюэДт›`;ЛКўъеШ1З”k lj:Ы_ŠjQѕјјАpд&иЬZC?,@‘ `i}М&P =aщМTe1Н%Ћ=ўzЙъгЦ‹ЪђтХ4ЗC­OцЃФОг LЌЕ†$’]ёгKxVškl'ЂДЏŽ )ЯгЎјJЋŸmLяІyЃЬ›y^СПЂSzНі™м'\ShFT, NFЦ3ЕюЋd2ЬібѕОФ‰ЭN­B€=iоДC…=Еz0а‡ ыe?aD!Гq,о=Н8Яh№ БССwvЄ+ГЮ/ƒ ыЊ‘mЉйTй[ЧЭYз4€1 f“’ё–‰љK`фглon\CЙІ5 Y74ŽЅVeыКœqюќѕзN§Ќ2и,Р хњYQ2ЩйY‰П‹_nežRПcхСw юVщ‰џБђюжТ(-SЫS]М "œa/ЗЯ’ д”доl #?JЩяv)| t0ў‚Т ­ћЦŸecЌЊS‘myРЈ‰ѕ Œп._vЛбтyъTУдв CДMі&У„ŒДѕѕNРкь њ(ЉњЭ€“ ц;шзкл ЕО‘ІT@Є CpВyЫ5вOrдЏ8yФђHїІЇ,B@"ђЁ„gљгЅV1ChЊю Дl'Х‘wюsмйerиПiW’pDU<Ѕсѓ‘0М2eЗfеJЬ ц‹gOr /•&Щ7лRз[Т&НРkоF,žXЊVDl"аUЕЊФѕƒ@•х$Хм™Гshкпо‰ЌЅџ­Іw"ЎЖдvgЏ;œZц— }п5yўX‚€‘ŸЎдє7rЮ)<€џm'X>=еХс€К ,IЛœ?lfTЊЛ ­‘‹ƒYБ­ьфwU!э_еVи7Нœђr…ШКѓR™ јyŒЙЉЛcB*ўьНрŽї$эЭюАЧ^XбН› ХуюЉЏM-ЗlcиъŠ6!Pd„xmТЎBщIТщн8ЇŽжbBSзˆ™йaЧ~в:Вв˜N"€ПiJ"ДSGеіыHAtаxєt.@Œ‰P Fщ…Ї.ŠЃЌKЪ&?UьBУ§}Д5yCЂжЏэZХѕЁIC9qhfyžИEtЌJ~LJl ьVnрЖМcссРКкzЯ\2й‘p’ уBУƒњ‚g!Т—#‰ЌЉ|PпмДV Аz%‹$6]V7.Хf№ВLЁъntд oшœйKfкRbёs/Ъ\гбk€B{{hQЖГiа8UхЂ„9 <Ž ЛVЉџ-ŒСbўL!ёXŒю&Љfћ•–й˜mr)гkѓPЯ:Ц1ќ>XъГƒћ•КътŽ­ѕ‡ ћІWЂж"Ёѓ:*^˜ Рї˜=яКvч>bз2pтЙ›ч§œљОѓ9wVЙ$гЌVFØѕЮ†0`ђИ•ž'vІА—Фиt6†ЗХХ0шJШЎ]M”ћkwбIБЩ=Дxэ;n–ЖB#ж0Fи1ёшяЛеи58NъуJ]šš}У…P˜А‚2Л­fOhыЕ Ћ3ЊxцmЋД_ЄПVэmФiВŽ6gFВc‘j)ж!Ё€юбќАяПtUёѓaQUхЇЈFfU_­=С[g8N8ЏJQ%:‰ьwVњСNeЬŽ5*§G Ћ“cЊAчRМ“IM|Пљ\YNŒqгДДf›j[”Ыі/OЊЎzфT•pTчцЩ$8]<Ќiƒ эKбPСLg нІЉu>АоS2Ј;уYМц“Нha3#IkaидуRЛ†Шюѕh€жъ–зфє~Aф8‹ы˜…jЧPџGxCŸ™ШG>–ч/Ш_ЉЂŸŒtш‰F+CŠіџ`ђв8Й Ži9Г‹”ЖыƒвЩэГЙk?*Ю%Яіlй:“EHІќБx,Я”єƒV›N›F{ЩRZ[‹Z8ЦЂЉСˆi€ъФ ъщСљ?Щ–G§0д‚кПа6гYM7йы#^Ы 9šЗПЏm’гbз ю;xu:ы–!)7ў~гlwМЇeЭЇvЛDта§8‰ЧѕMbАdИnх"ŸpЌ№ЃH+\вДєѕF)ЬHDfрлВ—8rшКмƒД?…ƒщaА„№ЪTŒG5о:H>0!К+cSРдЗ„ѓ‘_a§ў‡ОќeAЫњU§™ћ+Б*ЭDаХ(ŽЎЮЅ f:Х;ЬсE?bs’Jцй3Ј‰3ёЄЗВсќ (.вљ$SЉфˆ јІ‰КПћ0RQ0•~Й@ѕЄйч§фМДъI–ДѕыЋэИZ†‹Ёj^qУzŸ"ХTІэЁК˜Ё.Й$Х7‡љ мE@щ'WГ~ПR/T…0AБйTn BЅ^Ў&Љ ЇюK­™ЏˆЫЙњ…Нѓ•хс]\z7tc­ЖњPŠпъIrлTMщЇ'•ЕћŒятфЏ*•П‹AгŸь3зhл#‰Й—ЎAЎЫ&V ЋЯwцзakг.'\ъ/“ОыєжцэФщb;J_€žцо?ъ`5"_n,ЦЖ\я =ќ&0Ћ>ŠБ—Лэwі’le™Yќ3~lЪЩпž-л(_іёр Ъ‚йo[ъDQo9j17ЧѓgolжЛћ,Г§ЯаNнћЃOЊj˜ЁІЛ“ЪTЈ~FЗІV]Йш*џVEПbЊq•nэ#nжUЏž§У"ЈЖїi,UвTяAэЄ’ хAтшА–‚)‡(Г;гЖrхЙ‚e^зbžžpj…“ќ:ї2tцљщЗœЦV&ѓ­"…hšЗЕмЅмр‰‹е|ЧTГ‡мYR­X8ђ+;iоlhЄЛ:}Nш*‡(L€Š‹хtЂяыИ8VT@V<žGуъ›ўзВkз_ M™6j.ЊДџ‰ЄІ{ЉhЅъjUЩoг|щŒБъ!+~1”ˆ *к•>учšXœL1zё )И(од3tЇшBЈšhДиц2gО.,їџш*"ъќ†с&6}ЋфЪs†ёЇœЋЗJ_”/ыowcEvv$ЦСМцЩТT5,ˆ<|€яъ&79qє”№ ЅѕšRнАЛƒйщHЊœflёхYОoуЇиœ„HU;9Ї~rŒвœyм8KY>ьƒю&wfKўZ 9“щѓ€i8рЈБ9sэS=рYi~РИtVШ‚Ћ ЊcМЮШпЋЖОf<ъЎШБН'лЌиїƒˆеn _AђЖsџЫОоЏ˜5F–Mv1}Г>KTu•~Ю+мŠЎЕ(u!ŸlЕxџu<КCДМ>Q,™};Sц‡э; Ž]p$ иС—f@Їг“є‹АЩŽЭTілЁ Д[|Jn—QHt_ЉЦ‹e R\JOPtwЖљЋм˜Ь2Yйќ†ˆЊlЈ[cєvђўт‚0†K–Ољ яЇP›9Ц‰л}f‘ t'9Z–В pru=}\K”#т`wuЩyссЧ“SШИР‹ыŸa€ћіN•||-DџЁИ"И—'ЌюOї єОнхЃ#v)™уad\2EЫ“Тm8Ь†ЋVф<’(iшžZЅsјjИњУ>Ђ}Dџ‹ЋЁ W QГФ’№їйУцKTќi!ПўпЎЕѓП{)Х„цЖ:Э\c&wX~ Х№ОЃв?˜хО3ЙйФ‡ъhт-yNC иjТІRZ‰‘kЛч€­9аАџŒ}ˆъЦK™xLbЉює„ћ”BГ'МG49ФG5‚rЅ#K0ГтMГ!ёNц;Е†хx[п—Е<ОmZЃЭБ"н„я?ХƒgЉˆеŠЎ ЧЛї1‰$Ѕэюы–DтTwK{бa›sЪЭЃ7иšщ}з†tмU›ыXD@6ОЎ c#.ж \^И’ы9;ькжІ]ѕ_ЃМˆпЕНЩјВАš€/_SQН‰cm-™–<ФБЙа™CLwgDЅnћџd xш ћЖNˆ$SC[Š0џ:ОтŠWцлРЁcЗHjђхDУ“sІžжshр‡ЭC0E+,_*Ё .…њ§ѓ5)-УЫЕЩT –‡fхi|я3ЏZQMЫ"B^œ‹Миwѓы)MЮЧn^УДФ|šЦ Иš–Ъє/ѕBлЋ’ћ{э{šЕ-|Ѕ_lЊmхЁ œ  O0/7 xЪЏЕЊѕ@џ…Ѓ|SЁŽ БX^œџƒnаfЉŽ_цs ГΘ4Й~VюЫzп›ЭЪ<_z.AaжЙ5бѓЏУісNаЅъе­ёЃЬ L_sЈ$l§| 7РK3ХrАЖ|Я|Q{йХФŽŠsВN%enс7(ьс˜ЯPЬёNж“z9(М7уb“б_|5љ"%`Ž (Ю0|й!А-б9BПја<Љ•nV’ЦЏ§MѓHbдЂ^ЭD ‡„›ZК[ВEаœђП`1šфqDцэЧ№_Ф™Œ ђuuЗьlT(jГзы\„*ƒ4№UJУ>KПЄъЖЗ ЗHWheОрe*"№ыЂ;вьЦtЃq;)­Ћ&Šє„кЮv›РЂцГ5и$Жš;ІџІѓюš=­~1•–B•Fе$ч:БpА"aŽБхн*,‡ЅйЮaМ3`ƒПPНъA_;А№–ТE И“\Trў‰Пє]O4РЃОЙ–UОVиHфљЪ<шU).цЯу˜ћbPQ'­Ь…ЎIГфЮiŠ™ЇЪ:D˜NУ_ˆƒќЭ:tнљ™6AoRЬБ“x;RєwЯ@щ*ptj!H РЄkYB`нГ…De*6БђџЋ$=хZ‹ џKиDƒз Х5хщl зВйяqAњ57\/”г&B8swO,Эaw‡ˆ2ВОBj‹FЗKЕ cЊтaЊЬЇч8аuншzЬѕ.YwК8g/WFm”,fЖ%wVGА~_Ѕ‘чф7QьјjI3D!r6‡>јПЊЙХEп<РАˆBc]4Аё.ЯЕЇћdо”={DƒБ€б6 Р^f‘аЈy$ cwўЩYЁлжтЈ‹=жПЉѓt…qА5ys‘(ЁЧ„4,{Мќsїор1сЋН”†—Y#ŸzЉ.-3:g–ЫЕкЊчA30\;Žќ}рБКOљKƒœлљжюc}N Јz„FWЙгЃд зЬNJФLvвЬYЛMОЂЯВ*є%Пї–?б`гJф]8Zo8щœР2C+Ъ§Xc€@ZЉ‹(—АZЈyDЙаГhъср#(Žь/јќa‰)ўі…›ьу%AiŒ"@*XЯ•Ё™›|чї\ЦЙ_,ŽNT ВT|h—щ%Тў™3ˆ!Є6ѓcVщM!ќxёєŸ#ѕ"Ь kтЇsŒ’ћг…!ѕњgša8@Dрw˜^Я+Ц$ ’§r)ХHЛќНyR~2§L.Т ‰Ъ‰Х8HjНэ4a _žЈац7љДУDЂdшPlM UxmJЇдиyЭр+xjKМЬЂЇg–˜я|ADЄ–Є =їэђMЃЁцЪ™*ёq^§iй` ЋН5‡љВЏуплха*Œ“H=n"в623Ztёї&чЁцЌzі+™1ЯЙјЂД АOlѓ2ёnM?эЏNqO„е50O…nJыsъšлLЩnЃзЗ}xЛdЋлCl(И–ўPД§B%qZd)Q!ЋчЮђ.пEхcЫв*уь˜T$kЫвVМ.Xх їиєU%™љьƒжs t– ч4ђoгq1ЁБnьмEk™ь[РVX`JHI}%2Нх@–тd–цz]Ё!ЗŽZbpXП‰nЛѓмyЕХк{|$Юb\W5„nv…Ab"Ђ€ђШOЅŠ4*˜э7Аd0GБФ+ЌН,v@кёя*ВЬз=єБ рѕф†оVA]Г+VЈNƒтŒ{œушNВЦvюD9Šэ™Ыл”є_‹ољЗ!n^’ЇЉбTPњwын`§}Рžщ|DЯY…3яВж‹hpїSМ…І3ъQTЙЙ#Kѓ$fЌp)ŒЃЅ–~07ѕ/нБуVјПmІxѓюpтzIи2kЁє~ђЉ†ј­ГSЪЋ'шLІЋИг.ъ™efѕц”“шђ2Y6 І ‹W‡ЃмђYѓь/?ўLгђru|$W…<б„а XYа|2Ў”Œі“š`…шєБЖѓ“zФrKTdY‡ЌNJt xѕ0blИU№Ь…Btт‡iGŠЙЋz>|ФFg"ѕ§aVњЩэœд_•ЯDY%^ђіХўўгжћя2Q?ќ€Ї†9рБ^=јмŽj““ЋрЋЦцР№ƒ4OkЖ•;o7ёЮ“f‡СDiOPШTщ@ŽшO§Иjf+љ3Цс”PœThXVК„№кб#ЧŠO,цFК@‹…­?4Ў[‹ЉeW–uомh4qиy[AцЂЗЌ~ЏнПy BbЧЭЭб№{ЪQq.œqL жѓ<`+ЩWW]нg`2r$Ўb‚КE#ZсЦЂsŒЃ6 ц75–0oІg tИЂžв—GЖЙ8”чќуk„тEеД(-Јлљо.ьхБЁшљE6˜‰ЉУl‡>РЋОzd?eтR,#yщ™‰CџžёШm+М:щИ.3hІ…:IЄІ“ЉяgžДЙђ cЖŽћ“МЧи>ъ\Щy› ЂAаьЉ0Ў_ц‡Nь0ё]*NŽ`A'™­вXЊ—sоЬ8kUІч“VАЙ+4›ФВХѕpХCРOŽ ˜МЏтр5mзўDиЬnc|Ен^Ў\NXcРsnМ%аglb№ЁЇ†ŒЋ”z]‹‡д]‡Л,ц~ЕQpA4Ьєq•љИ}&ЏяЕпХ}ђ8И*ѓJ€Ё_оЌ]œ#,ЗЧm'‚“Ђ№s”qo~DЉГ%\7jХшђХwF5­jœо?јЎ6Р`’чRuˆљ†[ящхў'&5gLз J 2КBVˆаЯиџ‚гП—Є§Е€\Фс':їрtžг;фfb€• нюh7вaї9a “ХТ™&FкЄЌ†^щОuГLR—Јрё;|Ј{Еiю@ц ВТfЋMaЙд—ЗAmKGђr ›wќ™f2§%AяŽѓ@ч…­}\@žŽƒџj ЧUъ‘ч“mОVq5t&TоЦѕ9H\ в|щ§МiZž;оXЪ%Ўї&Ÿ5SDwџ/lRэЯ…J›™$ЕПoЂю5w5O9€іjўŒН|­ЧxbіЕ7І%ѕЦјуSлzЃ/ ^ЭcO-_ћtўHќiy3Ћ‡ СќИЅяq'OДзЄсшsF`єF C Л"хМP:šХ]‚цшХѓXЫoБ]bшsБNдгкh97СЛ{[;њўщ$]Tћ6ˆН+ѓВ(„cйlќ)UыбМНŒw/ДЇЄ‚“GCјE ЉЭ№жOЦPIHFxдЕInMЋжОЉ_„аaГT^зЁ[„%лsЌпqœьИŠоЯ‰Б… УyЖ—/оЗ—к.‘<›Cwс!§МTqœђhщЫ (B’9wЙtпнђщ.~eрЊљЧиЦ'ЮŽѕўў6+§aUW-]!вЗ$<„ЬЪЩx'ŒКxšрNKђ]И Ќ7‘љУz Їfааt$ы8y8FэпЂЁŽAf˜гоыriОАО=™;‰Л?nњђнГ–аяoќMC.(е[Фh жю-ђ– чфтВWЙИ­эЗeЎўCMKБ<”tВЊ/АЉЯУЖŒdXџНеkЁеЕqw‡w#PuъкжУTЩќŽ†рœЎ€ІшЃп жDF‘šЧ QVъœд1ЌЪѕхЅГ0№ŒОщтз?IгŽGЕІлЧL­W5sлИВ‘Р!ѕ|шщ=ЦAвмЙБ-St8stFфТ/fi#•/ тЃV sž§]ЦЛДДуuLЊш3ЊПъЁЂ dВŽФtiЪYk’эf 9r$t›„я:a‰Ÿ>aЂИTаš|ЩH§Mљњ_ˆŽшKЌQ‚ФбЄ[ёЂА0““„(ЬѕТ[Aэ?аœ •)ЃL@н$kœёьй0ƒƒ—ІjAП 2hА9ьЮPЉ{–\šъЫеˆёД›n‹6nйРКЬў'!3JgJsрэЇхА№чіЄNPЈPђ:‡h4 „ЫТrЎ&H%ЧjNЕnциMрŽчџFўЪОЋ™ЅПx#ЊєG"O\jqџк†YР-L ‚К iY9г›д[€ьбЬsЖ?  g“~%ъ];Ѕ"лXуƒOэ kY‹ю­пю­ПN€la-Б8?юєЛ‘"Ю лљЛіЫ•ё:Rp˜wИ•IlыVяЄЪЁ‹uœ?>Z­ЦИрˆчЄЕьѕЈhГЕEђћЋЅІ4MvK8sн:Ь)ЌЁSvx$B6!љ – ZD–Х3Œs|7€^ЋЛ1ЪXŠє–›рТg}ЁуBhъ5IJ_n(%Dt4ящњэИ:Єю§у§H‚g—Ци?Šqе•ќ64Сщb'Z IВgИœоќZ Œч$„‘cЖrлŒ”oюtдѓ!Щ@)2rЎщч9ХAАš Сс„ъIelXsдю> Иё5€Ч~бvбыTЕЯ<>ГЕ€LKzЯ}энгї'.19,рbH*Gq‹сњd#ыyй Ќlў5]з Ї/зBЅl~ЯЫˆ•›o41œ‘ч&EM`џŸёipM:OšуўyЮYИБquд#СЇysyзM“№Gџ–ВЗ%%т„Ž ЖuУJ*ЮїтУ‹ŸЅЄk5Ь“P§Ж4еЙћjёІЄ`lТd ІеZTnЇŠ/љ$о"ЂќkNё­НЛиPІ­% [е[K:ЈSmf}yц #5Ž2д/FЯ|rФ‚™VзЂ^hЄ§‘уШ=ЯЩ žX|ЬЏ ‰S–ж.уЄ04šЭіoђФМ|T8?ТлD Rl5zуЩї‰šЉœьQйТеЮЮ—!Е#JЧѕ4B/oьR‚mЏtYэ›fF0јџ§‚ЎІЋ3ЖрХЫщ–э Рё]ДRSѕgГ㈇,Озцrœ†њyцЋ ЫтœIА^Е9Ё{ђняHиГЪ"ТfєнcNдœ:Ч@њУЗф‘?x‡№ƒЛvГ*ž7бbЧnЗЕ* ЩЂ”Ѓ)Хч› ъмXПiїзР7У>gh/mшVˆ+§џf‚%HЈ>“ћИЇcЊj'—щtМЎПСІъ}ф‰Њ“ы‘dРЅgl+я‡ЊО.z`C<§с|Ъv\дРNЎЊђтШ€Л{э/^Z2ŸмСI6ЫкЩ(k~1™„kf M:ScЭnJРЧџ‹šŠ пЋ^.ЁХ 0ш C@г:љbiŒШЃaУ%€/WS 8~€GБџ‹В)Iw—AЊ‰zWEЄКљуeЂОР”ш›ŠЅ,ЕrЄзуvu< ЦKйеј•ъHT‡ъ с9‘e}„ъ/‘ЭcHŠ)wwјћЭ6€4hђєк\рx\Жdь$ZмжQ№N‡`)ч*Ц‡qeЃБжЏьlMPwžЖ›щ_ђ”CѓbJЇf0дWаNяHЧƒQYМ˜Ж•с>|уЁЌƒ 6АŸчїp+гAD~kј Z`UЋфBZЫ[ё^€“Зюrм†t’ЖК“rTѕЯak››…V1V€Š&Ыч!@ДEиИП]мУ…~ЧcZ‚a5уxˆЙmUF‘ћx,”TžЖкБ†UєжЏЅ§4(ёУsА*Алд,šжЕЉыg§р4БА7•4‘$ДXъфЬфяfдlq† ˜qV {Ы—шСщ]ѓ­н—PЅ[тVџ fф ;АЭ‹Zљ1ѕ}As–&жdp{6XњЮp@КфE&йЖЋžЫ0ѕšЈ‰Лi‘ МF6j3РYчдqk}ДxЋ'гщn=рбq+РжзcѓЬ$ЮБbbtфZ‹J/Б]kѕV,|Сз‹Нrџ’ђ‡н%JтЛ,Uє”$fI _щT–хЈЫ”€ вƒлрcšxAkBiнхHrсЋЅЇьЩПnъЩёТК1Вє/ЖГTeЙv іи–зZЋsЋцjؘЖN~вџGp…–ž;MЯМы_ЯУфŠlЬѕRсецaђџт™Ё3R#ЇС‰хпсœYkXq5‚ь…ЎU#dГ4^рFу `‚ ;,T”Мz&шЋХoЅ}Nу,h ЧУзМњ˜ мmS$:SдœџйгФ,4єba‹$ЁЪ†ђi9 ВѕЅџ^cЉЉАЇIrŽ2QЅ4RЫYЭХ^6>ћ‡œњк@e ш#№Hз †?љаIšGѕмНУƒэЂѕ€mžЇc/)† U[ЁцЗˆЮЃ?аЙ ƒ3s §ёуœ<о zЪ4VыhˆЅ›ЁН\єˆ­/ЕCIыЯFячћМAјjwкO9WО%ёšнАзе ew0”Œ–ЦKa—І;эsђ[ъп#žђU‚лЦЃWЈЯ [йёGyм‹зwїœ—KM‹ mЕч…пzЫѕїa'ЌTЖќС'уu%н“^*hN8јяъw ~ш€eТH‹#}xёC‹Ч’эћ™Kьњд–ўЧЈ3vё-УaRfч–!_MХ5z?)ЫAa*єъ №іa;УЌуИmкіN2‚UЖ+sFэёФй‚Ъ:“STд‰ŠМЖТBNѓї?<ˆж8)œЯ˜ŒщOЁкX—ім чЉzъSЫoнс>”§+ў нвТrLО”e$P5Я1C;`ц6ПЃТщ­ 4нBFIЌЗчсyЯZЫb ГѓпЯыˆ"ŸптЎ5Shb"),йЩ„’|t ОкfЙЅVK!іТИl3ЕŽnЈrNлю XпOš=SGЂ…%P№@Ю’мћ8НдˆhТ@\ZHЃРМ3…^{{7п5РЗчe [‚+Hѓ­_ 2?zВDКMˆг§Ч&yi(‰ОуI .5О<#Дi‡Й8ЗТlХQAOѕG4XеЁYšч.‰Вц‚ьb[‹†Њ љ+ьєtГ.Јž!6х4{Й„Пф’NТЏ—xзэ!K,И<<[ќ?i䠘5!е57ѕАМ|6ьцwШьДІ­=пƒ —НЩWBGl‡ZъJЭŸж)рzƒaяьёэЌjBi[Ійбpр2ж_Š–pœ[#бFŽ„эDфW^ќеC2№яЎUЭ~F€—Ч'žкDFБ<аЎ“ЫKш‡‚.–s`ЧјlЉ.gV‘DŽгCБrќxюв5Ж›Œ*ElјD§.ы2†NvјšЫЇ“Тл§}ЗŸ™ЭМЧˆЦхЦoЖV5uС,э‚`qX˜8в\N,H!Y’БT67yшЄй>Њ 0!ХsЈд,ЬДЧ›c%Œc )‹tї3„ічЁўO(‡ АљвёЕgЙ!ЦЕFїs”SМЈУ‘gъ”z4-1ОЫЂ.\Щ5V"dPэezЛВZбlzo}rЎ€i^ёо+›“hŠOнЈl7йУ"мu§ +З!eРC†ѓ#xньj]$qtЁE!цЛTџšВџBŸ‚ЪbО.ещќ ЖDЕ‰ сђ-!н яƒŽДцеR§р ШЉrnЈЕ'$ќqЅ{д`TЫ5№]/•ZќЧ• 1/Ф~Œ\-ЎRbія№OЗIAqюDўFYШ’Ѕ€™‰Ѕ8жS)Nжf еB’с‚+ŠjObЏ9ˆBI“бъƒJ]RŒЏTKЅ”ЉЯ#oКžyїўFЃ„oцФqСрЃNAkL>УѕЩQм5cC€зc)/вПЌл№tиЕТЬЊусюaВМU{Zым&њЬKж№ЁxQЭ|)WщuІž{6'Мfz ф8(§ш-‚“(Йž]_к‡NQMŸB ?OФэWŠу&,%уЃ ёŽЕV˜єоЏfhUЇяј‹ 6>BfсО§’Џнгn“]plАиnЕ+Bœ@l>8з^И Т1ЙЃвЛїX‘вWъЙOЌюяEa› эї…ЩѕїЏВRВAІеЛOУЃa ˜OtAЕНvЧXО]<:пФћRŒfн\и’дєА;рѕДя%ЄhD—ЗџcB6‚§ŒЃvр‰ GcВ›мtMaЦиЖ(бШS ђ2Tї^ј њлъє=юЊшžC‘”Т №ПJM–:Сщч|Љ ‡\В/Wя‹О_љ8B{Љ4Ÿ8мž&QД;nЅqЄ§JG†”^Л PќІЏKЂ&>D8<’w†е й ИKP#хA{Эёбїс Ќ ЦєШјШ ј~Н‚]Р@H}[˜њеˆКРD“_FRNpџ€ФЫoyмbЙЉџлh+Ц†ЏщP ьЬ“Ф ѓЩы™ћКŸзУj“7рмёЄ]и›Ўља@ ЙЫЙшџєф@ћ8r Юr˜Œжoщу‡ ,5ЂbpЎƒZ=ˆ .2vl,ЋўN“eГXХеЏ2ЯЇkл0dнВЂТg„ЏћЊ­Р+Жmєo#ƒЛT ЋМі&Рƒы)ХJЌSЮЏnM­љЖАЋz^Н#>­ЛbЃ†*o?-Рљђw/3–šМ)^Gž‹жЗhЙ>ПcфсіŽД в‚ cD|ЧъР!ЉRgѕџtѕbЄ—Ё#L@J2.СО§ž’hФciљѓ,ж›ч^КO ”ƒњ-8ё Žщœy’*uЕ/`e?YжЦца~§ў6ї{щСz€ЛйlеBECьъAЖЋЖ Л­хкFЈх`ђ#БZњ?ї #}Ѓкm”)Љшоžђ„А2-кэУвQ8hЖћ6–NiЁKглОцGtШ|ЫЏZщ7 %еСZ0I5,#Ž9P˜ЄTЭb@ŠщŠgГlŸdŸN]ŸJƒЉ’"@ж@eIcйZqЬfQ мвvrѓ0 цу)с‹.kР№† љЃГНsЎ[#@™&d#”ксЦNЌaРfжa:Ђ ?Ї6–N3ї't~pтJi 8BЄШžy<,тЯ`{kЮK>RщhNЕvF=^„ШСаРaЈzшC\|ўЙ™ИќћдзwNrфйЉк‹ЬЌ,щнŽЗН?zЅІ€Ÿ|&Y8;э)'fп QЙѕс †=hgЬЩ‘kІDЌtŸN §Џzё6ж}э3Ёx`2jq˜шьёкkя€gсЧu+s„–аkй~’ 7Р{чЇ {ЗЉХ#ЧpЊТНЋ­VhXтx>@а9мFћЈЪЙ |HфюКЇt˜О‰в`Э–6TТ|У#Žч№E_#"лТЖЂЃлc*щПВч*ЗH`т-Ё'ыЦСџ<€C$Йbг?dЁUЊЏіCфszћFіlœФа@] `вjт|}ЃџYkВЄчієТDГЧlwsй­ђН1жTфмЄ+@ИчA жpм[ЮnК.ьc5­е†ФB ЗœЭщзƒГqЕЉЫф 4ФžлњЛU—kыXк6qhZИ€ЭїљeйвJSJ" ]Aэ›МI}")тД}`;ЉHVIЈзўѕЄ!їJNШЬ’Ь—“TЌїт\a7сu9зЄйдоŒЬШœ"ЯИП}‘љH9юntС’"їG­ %ОЗqƒuЭlъ§ЕAЄиДЊ@3іу)`ўўSBЈчvЎВ‡ ђzИ"йљ{Ш5JЮžщRfWџ3лгѓreСЌюD 3+Y„w тП=№‘GxK<БёО‚іеcј1йэ“Тфƒџ.‡›‹уˆЄ4ІТљDŽРкWБ›$;w’СоГzИL–Зmx8^іOkRлL\ТСА†J A‰•ЬЄ)э<,SЧЋUззДŒ  /їkše‹@ZЬ‡‹кGИбЎj` О'яо„дЁЬ§ јyf‚І>ъИW‚.4§іœ х3Aѓ>DѕІN`Dй >Лпg&КЅЇш8бгБ($ (6iHtЗї_a!Tђ1˜&jЎz9Ћй@Њ_uЖ&Я%ЪЭ>‚[Џ}]з_кŠ€e8 гAœЁ К§;J!ќюЛ3UєЯЙF” R-ж4ТяP] Нб{w­еюч>yЬЌ…ИФVNMА„?lДt~ЎЏD?Ђљѕ`А! ˜ЯC|Ї}гЙўyи`ЯlK†^TzтЊ†–žŽ4§2Ш€К—ЯЦAЎў„бя‡Ђч:VСP*‚ Ц.„мɘ'Ѓlе%]ЦЫуП]ФБGс*іQZd)YRьНЙ]o^H‡€ P)Š Ц9˜NѕuьЮЙБžЁŽЃ3АЋhЏЬo™VcU?ЙТяЯХєљL5Х6&ПЯP‚^&€Ў[aђ•=хXЪ„2 ЃВ„‘/iЗБжФд–•ЭЁ@B>ЂФкDўЌl%уІЭЎПJеa­BФ‘?ЕiЅН`:АђулЗbВЈЇЩЙ ЇxЏC„ щhЗe 6‘'ЁсНYжkr ў уЛ1кыE‰-ИЊЏy­єyƒи-Hз8[вsЅ7›хvBяBo†сX‚™Yўќ†’'`ѕЦњ{л‡u‚& Рѓ"нaiђоТВD T>~“ђдХKE/jrУд“нŽ{К“?™СwБг‘:“ N“™HžE\žя—8чЖдК›#Л[ржљ+Њщ"Л <эOG?№jФ‹ВлHкKУ^VЋ5——GђYП€ьЧŠёюЦќ§[ƒoЌОЁ[X Ÿ.TБЎmŠFkѕ`юˆUSKKЦЅЙGIŒ,‹Ћ*nDМi› оspНgФЋМbЕndV•F^в hJ;Рц†њNжѓ$b`tРS[’œ:3'эvёСдOў.ФX7%QEišЩ“є;сЏщН’њХh(V?rэ•_оCэr‘8ђuy“AZ$сЦ0ѕyO;н9фТЗqЈкО,ўLЭNa)p-JД4•E7[з›КŸ›RнФ?БуtБ"PТhUіќg1П”œˆg†h~ьnНJ жŒPРŸНkљє€zp7”?Ю.Н‡Е!-u[$н‰Ш%S/!xўcяŠт9‹EЫыЭ„Ј зЩG Ь’щџ%Д‚Т<#gѕЧоД8иУЊfиѓŽЩ­›ЫŒIБя8Ч1K^64žљŠл'OZj2ЅРIEщNƒpl–Е˜оŽыo9ˆi аЭsјsЮY)ЉKћDШs{X7ъЗŽ" Ђ4у–кЫїќЮ2ZХђDˆУ&„ђ0b_а’ ЂН{ЃrЯў YЄЁЙКW(Jб!ЎCpмJ9Ђл!Sщ‚ˆ† Bём&НŠ`3dtЋРdќS{wЖюHce“mЅёP4їRйVАдј€zщѕџМ‡RYп^‹XBИvЊ=o­f/1šОЯ}›№kхТўєЗчу+№§b€•oAсджѓœ†qЎDdІЦюѓhŒєќОЧъё{)=ІЃЎЙш<К9П' х‹ НwщѓДЮјДhk‚ЯG˜м”7‹ЃpV––мƒ€ƒщ‹S5бг#vF^ёѕљ˜†ŒL MpЊ6ыкП]ztй˜–š+ЮŒ†эТVЅaЏM5@Vqі’‚й<ЖˆГNˆЉ#УУЧ6‹џ-$ƒ50Мї‘Š‹ШТЕЄШ9mљ‘ymпЯˆ‡§šAUgHF#ŸПє‡ўа(йIрёe\~xРџ ,šшч#Uћ‰ DiѓЂЎтœR•йLІ1о?ЌбњFF$ќц Оv‹ЂJќ<я8хkяМБoGя3ВБŸlЪм~& GpБ5і-‹!ЕyLќ„RЯЦswеSЛэх{ чХ1Ш ou—6ЄM–Рўќ Х§рAЂgвЂбњlІŠ*SѓZ™цM6МИ ђ@‚hKэаџ;Ы•Ђ_uЋ<фгУk2]Ыгуйk­ЁŠХЕўМКф!€žЮя$ьˆщ“lлоЉ§Єџ ћєВЯ>тnSћ;Л'№Є‚kK>єЗ :З^пкNрqЩ№†]AtэЯŽЩŸЪŸЙЕ‡ЂO; zЪIЕйЋ”бЧ љрзGЂcШЃоy|›nŽAIa‘dPТ4РРЖбSteqœk<Ќ-yаќ>b-gќ6šЈДщAl&ты.уаbќЃЩМ'ЁQH~U”`;:Ї6+ѓ ЈPR9ˆт]ЩрkрЅšП„OlЕКo9Mяјвщ€QЈ-мezq‹:ч$š•dьб)|ћ5ю'ЫЕ;‚в4ВVyŠt ѕd›%э„Ž^;mЯ UZ7‰Хт9EЌЛ`C<њBРІX…цCч-6=й)-›Je!eў dЄНkL7ьe2;xЋŸ@ІъЄ‡axњdvœаЗt‡ЄRј§f€”мЧЄб3& Ф%ћ™/ПЉ€zТСйmгфЮ'-<М#ЫНЎ6Ы!ёЕ wU IѕВ{XІeжХЯfƒ„К?caЗIpHиФ гі№iЦГ>Е;&[B@БŒ€}=~МГчКtLјлSы0‡†цAп.IqшYb.ѓ}@[л2Пиoг4ІY„”RхЎя'ж”ч’qеwЧ<юПРЕїУk@‚ГKЉzЎўБ<…ХюЯ1г ^э‚ъ†Фv>ш9Гф•[ќЋАwБГ”6яКУŘG8”jzбnРCъJ|тЈšLwžЙЩ …тayM@ŸCTwГН0нЪ]žxЙaз hжмЬRHѓy+%ЕŒ<ЛељzПМ"УбкЮ5]GOМ)Dž”-B‚WoіЭийВЏЪ}hGˆ/ЪтљЈЭ'(vzЇЪІйEЛ 6Wф ь˜4M"-чьѓ.Ќyжw|lJšrютЂА‘т9еDКЫZЭЩ~eWtFЉ’Їš\ХЩЧnїУЁPї(Їл”КЛ‡ ‘ійыЪАщT(’v"ѓƒDМьъ3Ц(ВјPzcQCmкаnЉ’вНPСn(ДfЩ|%Нё\WU ЭџŽі^kЌiр”CЎ:ю>]5}ЧƒSU[а!§)І‘ЅŒэя,ъ­ŽB Žт9УГЉRмZСдЈax“KєGSИї(ібoA›o№НїgыŸмАR'И>ПrGy—#hюФ_нDтbbxs›эЬuэ[хТ Ї„КоCžцxЂИЅ‹/{"Є[№б†<W’„ёэšJyЧoЈзEєAЇќozИu?j54 |pn‹tЧшэЅz;лЃ<—цЏэGКFOYъ_Ры—™бrI)LƒYедBƒЩ“BхТаeƒŒvъ"*Ђр-Vw’ї"к—ВY˜ЦrѕЧРV§oі+/Щќ вшЃЌЄQ]2Э4<ЂюYH_O%fЯXЕklwЕПўа’0У!ŒюћРљљ‚›ЇЦ|#“жэХШx|жчaЇїUЩїЊю‰PŽы3 [Ђт6‡ДwйЕти ЮєБrћ–lЏ#yA%kfњ НБ:Ф ёі)Ћz+GъЯ_­n{›bѓЪѕоX8џRйHLтX Єe[{uЧaœXлшќЂзќНe)5>Œ”ŸюўбЁ€™М ‹ЃиX b*† Lй8ЭdJз{>n€“щ ъ-Ь ФfrYmЦЁ ЬЕ юдX^ѕ1 &о*žкoцCыFТUЮЛZЖИз‘|цBП8„I5ЅдnвНј\ЂtHWчцЈL|9ї˜п ДšѕјИШf‰щдиF…ЧЙ^­ЧЉђH­›TˆCТжќЉZYCлљ№хw  kC‡'˜XGlоЉ•КІPVЯх…нjкЬ ЪИГ5(сїЅTФ+т…'…фь*a)Іп%MXѕѕQБ…Ѓё‹_TehЈj„M№qр8jќЯeЈAП 2чiВИ7mŽ[чЕYkŒŒР›ъё'ЪXој Vї‚D?-еOЬЗ&€bаЌZОH9d§ˆAGшщюч[S"Ўg ЯЊЧJ ч4Њhvb7]sjОЂMсLЮ‘yуЈF2HYWZг˜рЊГ _jХња#ЪЧщfRчђ• XЁ+vЈр9єв3MМ)єK$Л­;Lџ0gЩ Œ›ГЭё+Ёš„Ÿ†\дд€ŒЧЄ€аx‘]Хa‘ІЦKOаћЦпмŠ("URо ДS^в^AšМFIчѕzPŽЭ˜юъЬїЊ@ЊZеП›CжЪ‘z$яАд;Ыкзі‚u@lню@рiЁPеКЄS.e˜yК§ЎЭdTV,CВuэЛt"KeяпкмŸ4dГЪAщЊ3Ÿ‡Ÿj> х@Œ Ъѕ)Ž*зфшuТ€‡—|YЊтњ|Џ!DŠиEPAyюoчАдИ(oПЯі+'&"r_ц­бЩ"<рСє‹№ѓ ЛєDLе щіЎ№]Њ<<Ўы/}q}yзЁ+…иЃз,г’э‘їZ оѓ {вь[ ŒЛOM—UYn)–€qЦ›р[‚‚Х:[ар5€ ЁmПЯоХЕ”o›ЈЭРЏ’б2e•щVТ•щŠ™B>9`W#_7ŠЛ 8їэєVћ*е~;j“—кЕќЦ3§Л&UM#ы;DЎVŠ‘[.РRJGЯоCЃ`‚‡Х‹"љ9њŽWW”Ъ4šDII~uйЈ#шœъA(™”jуЅƒtkёЫ”ЎœЈЊU‡‹ ѓneЈђF’џvOџ]yьО!вЮC6 hьPŽшGєZƒ%0јˆ ѓPч‰љW• ш№jbСvТRщХнКЎ2NѓUѕХЎЫ5‹з•Ÿrx ‹ьМB‹Ів*/яьтoТ‘Y~€iЫЕџ#7 ) §/М{.§! bEч§ѕС˜–pыАЩN1е$А‚т|ЖёЋ,ѓkHЄ(m—нAВZœчЌ ХЕg§;ЂCлUРХMФИ+e!6УёйН”ˆ’@%ТЧЈзТQяЇtІ­”ьОиЖ›ўD‡O”ћ.Ѓ`рRкŽ0фПi3~юZ{EmH'Fjу4oФбљqOk)и(0– Я­78Б:ЧGdдВЭpTєDD|ѓЗл‘ѓВпкъvYь‰ч&NЬАqЃПxвdИЗ€њ ;ЁИWTˆЭР^bt‡ћyIкЏй9(gœ НњЉЎЙzО’ŒœНŸSаАfЉЙЂš”нb+Ѕ&ЭюйaŠб:шн~К-v–iдјŠ­ЇљH#ЫZWбЎ;ќ@ˆŒЗИeПџШЌ35єј&Щ3ѓTe™<ШI3Aч ”чБЋЇŽ3зЃКOЖм>=ђЎcе8сжЉу‚ˆ џQnжЌ6 „ИљИсї,ЪёбjФ8є0чr}Њш№ƒf"Чt'яуЃШХѕф‚šЃŽx ˆлЇeљŸћ KКм‹Š^L4`?ќ›NSэСˆLlИЌ+P вzEjюN3yб‚;ЭaСІ6Kœ„ЂЫдЩQДlW‹ЏTы-QS0бkjЅэО9УьRЭз­NТvычмˆхc‘HkІmЉЬрЭЇтN zэЉnfиˆњš)ќ‚Я''љYњQ§bюЋы%ц№RЧ6IвNN‹пe>—§ЯJy“E№уDЮ”zAiЩ|‡щЃС`Z‚;К?žЖдЖЏъБТ­oћHD$ЂхЅEHђ•aмdЃё,тбƒтgоT “wvPФџ*FПžДўЮhБ"EžВ6Н—Ё`^—э48˜!‚дs№€АіEЏ'gBš†_G2Е•ьŸ9ьP$аЈ§iмЦа?“@ЭЁ˜o%ЪNЁxСD™РЮ‘ŸЫЖ”`iDРъЁюXIф*И+Ѕ,ИСK6^/{GЕn ED‰МOlЎ:CЮ‚з#Oяˆя ‰‰fgэћ> э‰ЛЫ№юР Нк@„Gйх+­Ъи]O2х.˜’ы1гYCKн‰ЮeГіGў–уОKЂS'– LЧ*z*{vьеJqˆ<–дFм9зq՘пэ‡ХўCу­юЦZQ™UрЇ1”CmЦ,нкК}PгЧO„ѕ3 .ТщGГХ Еqћ3л—7–…› ы†єnч(ЎФgWЖќF&„фcЕzРЬ‡Š[ЄщNСMђЋЃ€‘ъXr*љШЃўеї`ZiœE€F\ў“ КAGЯ••eУ-ƒ[yЁПЛbŒ^‡+˜ьа7ўžдb>~Ђ™Е  La‰œё4ХЃ\œтI Bљ^Ђp Ј•~NўUtЮвOОмŠ1dЂєnюsС,ю„f 1P]Ёклк'ж–п˜T‰F€ъ,‚№5ВБЕ^’ъ Ѓы,ƒч@-§тоkF9ак€=-§ рYQ$ЕпБnœа=ѓncЗћ6k‡ щ!yД8кC{ЈX№яN{F™ХBЛљx“™iћ›uаOЬЅгЫCъ…xо>= œХŽж44ѕ˜LN;*UW$‡цtиbгз%Ҙ8@e‚њkљЬy@Ќ'N?=‹‡сЕ/і"e Ф ›ъ27їЦ/@}ž“9-юѓЗ@CTч„7‚w“‹s Ÿt§Vh\ЂЅJэоJJ„Ќи›ЛыE#ъО~ђФ}ЁЎ\Œ„Мc“IЋvЋ ­с te•_’_2ыєl=бiр )кˆбЄ-Ш"ЕЏЭ#0ƒ{'vЊ-Q{B8ЮІмСЛ†`УЏBTdюЃ#тE/’боLўSњ<}ћњVѓŠ;az‹…њ Ьй„˜ђ’Щ+цORšyњњ"œ<ƒЅ“э—5E1Jrп@еB~zЋђ"†N-б'М‹@†'•ZШМSЎFтЊцXYo€ZƒЯœ#ЌУIeB•}гФC…€ЈІ%Iшнxhї„ˆРеg0_{U>§Kwо„pW’–UЅKsЮмЁ О>ˆ‡žXйBТg—‘ ˜zŠдк28+CqЏНƒCРЁ#шržo•ЊЈˆ<н›№nЃИŽчйьНў7јПA@СІeU€ѕГAцхХvТтFь}ЈƒG| Рщ: XЮ8zъ)фљЃOЁdвm~VП‹"ЇЗ™в„Ї•(ЌкF* ўЕKcN8TГг–hътu„V Ža,W”О–mГƒŠKХ­ ”ЪЕŒb<2Fгєиѕ€„ы$Уы@МdХhШƒ­—ЂVЧЦЄ8ФPy?„-’nС•бym]ЂЇнЙbxsr:!dэ**ОovDˆENGшя-Є4дЭЖ•`е§БNцDHO‘ њb­~ЪРиЂKŽGыЃ‚/Сл8›@Ю"ЮчФ‘6 ѓъЋ‡`IСј3%$’> €щъсžV~УиьiгЗ%v@џOФЃc'т”5/oYjV; е” юшXЅтД-ѕ’оЮЅћ…ZіТˆёIчБХоIx—GДѓнPы?И\эе_ѕр‚0Ів#F„mэ “Ј&.?4сяп •ѓ•4G3ГјLЙДЮVЁŸ†чяО цг €ћr&P+ЛОšђЙњ$е*Ъ]§Y(g#9;A љ^‚Ып…ЕрQ5‚М_ŸР* uuЪ\Џjљк ёыИъŒТk‚(›о*SЮеud_ЙTШ&0 Фбe)*šл$s‡=.†Й4IМ ўЎ`ћр5§ƒqъHƒчT’ќГш&yФћ­Йœ $љdЇЛtПсЌіeС;=Ѓ/Мd’БОF–ЯG”ѕOИї РДwїЋPуЃ‚UЅя-ƒ н‹Ћ…d|;ŽД$jрЎnetмвЅЊДнњGыn№F‹]ѓТэмїХьœё2&Ёˆ!юфQј4•чwЛЫ"Zгђєй&2C’зĘ/~0!PфŸ|*М—sNЋwŒЗ\р.>†*)џI3IY}<ГАСБЛєзхŸтt’ыЗ(њ- зЁА­E –јкњФцCФ!љЄеb‡Щ—п[Y›ЪD˜еЅШ—&)љ9 QќГ@!ыrQmХ„~Kf`0^ј'–ЭЎїО€­чхUYg:jтNVЫ Тk+œЦчыH]„Х(h X?5­ [Chю]d CrџIВTž,%†9c J9ŒюРpІЛвнї•ц~1ЁнБ{Ч Ъф—ДіЄуФфAœYѕpБЂДь€.uйЯЋxТх‘VSЄ*я‹јKУCQѓОwфвђЉјф…Л‡пеяєЛ‚CэтЦВІ§ЩLqolwК 2Ћ1 гЌч2o%Н%"‡њХєnбcvo@U{XM‰fšќCц{ѓy*Nb,јt ŠФšŸй•" ЛSзarЯьDВчц,G– >Чж]€žйпk(ЇBEБ4љЧЂšШ7бзЭѓнГМGћьFРЂГТЈXяЇ1ЧI^wбЈ+„QХjШ )и'‰p Jw‡дЮћ!lFЎёќŸи]ИоkEу+'І*mІцЩПFJШ?Р,JМЇл(eЙУ+бжaьЦ­Lвџk‘>§('СtƒtчЯyf ЃЎ12­[uкe}д€Рn™œ&gmФѓЩвŽаѕ ГКpБ‰нž;ЊЂBЛjCOБk/3œС%ЧƒЙў•‹L“u]ў™'TїѓBасТЇ§ЧЋ,йB,Ў]‹ѕsU (8А‰IJЖЅJкѕYЫй["ЏзBф›цЪ†в SбјWлаŒ8„ˆУ9Бz ьp˜ib[ћўщд>яхЌЅиДурŸ“є§a'ВкГв_nŠ}П,C'($wY’ѓЄЦhptЋ@?^в˜8ŽI|8ѓДСќ…РЖœ7Ž#щЮЂƒJJ#%MЛ\c`^ёьƒ’%е5мМ’иГOЧ“Ћ іЩЁ+їъ№Š*ЅЙD€„ Cў їn-E^rьжј)А‡ЗsЅцю/˜ST™QЕш,eгЈЌ­IЃA РSЇс iрЌˆюa˜ЅљƒzіЅi”/(гtРXz]Zіѓ BЪЇ(H&QХ‘уЯ#л‰taмиzвБh<суС>S >ъXfHtV=)SВŠ ‰ GsІяр-Јнbщ€Ÿ)TЉП§Љ72ЉЌŠЯд2qKТ˜бsЃ N†1uNR#Ц` о‘DжцЪqА.$hˆEЦƒЏЯЪ%%Wюq?olіИ##еŽЕ*ЪЯ&#R!_i5щPЫУgNшB#j?Г\ѓ щР_цякEЪйг)W•с\( л0ЎИƒ’]gмNOŠ|)h6auХ‘nћіAмf№м=­ѓEёю†ŽfжuќЌ(ЙйНы0–ŽUн§лw‡ЗкЛˆ‡I.BїѕЈHˆё™Gя‹'љЙT–ЇИлФšuО9ЂkW @hгШ;цe#р_™˜Ћcж”ш9Иы=•t—ЅQ2ŽѕЫраŒ тe*_ЏЕ(Ÿ2ЎЧt#YЊ.КЧ’\нн7Њед!ѕrњЗј˜у>Ѕ‹жcŠўТf~юЈф Іі/И” bЌ\M Ў$^JЪЎ•0+Q#Ъ 7YП j["{ќ0З3аЮDƒv"yУшЖМ^([. |,’_Ц^:›ѕšГќю›*E†‘іsHj‡р4hR+ћгoFЛГ.>&ўяЫ/Hiэ{ѕˆ(m IсЯvВК§+Ўоэўды™ЏСхMXр ƒr%ŸBк еяс9/TгёЖzŸя1ƒВˆІ>•РqOжxmЪЭœ”Ьђђз`*НUFŠ{Ь Ж!AЛ:ј<фЯќ ‹кvйиFох1€vь‚7хfЧSЄjbѓ9MDБ іЯ$„ЪYƒMук4№ˆŸвўћŸžЖЪѓXВзTћRQd' ~1ћ€м&Ќ Ы] ЋбoŒЕ:иU,Дrп|U rt/ё\žoG…–йuо 5е-OIУ<XšйН#ˆ69’xыЊk sFЂ?ќBоЋHU›~їŒJпŠ•Ю&Ђ)|эШ2jУqРЦ›З‘ьr*њ2‘ЉЩgбФ4!џёДe# ю6ўфвŠbaxv7џZ_] ?кmБLП’GяопйsŸ‡69Z='‘v_v™.m^Щ­ќ}ъ\XягњmЧt‡Ш\„иц<ћІаћзУj-Hѕv…№.Њ1hт’–нIt6г7В<Ыа!Ѓ„№тeщqЮŽQ”'_/Омм$K&›{чSpˆяЅх‡+Ї‰žЎpы!ЭєВЯуB5pкœ7ЇBџ zщF8еНgt‚АТsށ~3g#ŠАјтЁиў(KиЅ nœЅ\DаМЅR§шм€BwеMхkV_Є™t}ёРHqJ[іИ§“УkџgЮй –Sуњ& МžtддњYVA.‰џфЃzцЁ§XЄ|шюce_dУ^Ѕ_ш рШ|Б‰Ф5ШЬh‚!‹сл%ЭХыц]ќnbHр"+‚Чж<‡.oHвЌg[Дое5с<ЏšRЋїŒ—Œ@^…циhяћ0Эc-A%†Ÿ}oЋgr+ј­це†,И•з‘іjЙљ+fSaі;ŽYРƒчЇƒ0'HkI‹zN:>”V(„nКˆZПюЫЇЫ”pKMž`ј­ѕ”njНЅоfй3vЅF;"т7ЎЋpЈj&^ячhƒ†ЖsnЇЉdНЫpi;w] ЖWkйџЈм‡pk07БІиЯЬТ:№^hЮшІBCBjwВ…жƒЫ KРЅhЇчSєщ(І’б` ёЇбТwУ ё–ооњLXт&ОпЎљбQTmѓSБ* œF/^чЪбѕїxШќ†šЗ|sQ ?“Ѕщ—ˆS С†…Бч’–‡_…4-Ž^dK_Ж‘ЕјТOŠ„:AŠД Ђ_Њs€бјA доКС0AУШEьAˆЈЧuЖРЛчLVбƒoRkјN БLp…еX4.€4!$GЄ j“k_еrПїZ;БЋydZоцЦВEѕ|[9(Рї №њoŸC%Mз>шuњѕН†bНr1Ўс?гЋМV–†_э^„JЧ#ГћѕЫEШXИœDсœLg у&OЦЎ‡ž№L9Ixб‰К$зЩ(Љc1)Фєщ ЎФCюU€мХAF*ŠфП‰оdSGDGЛзDе@Гч$И‘s"uК8I=\H'P|р}тЉЁа:rћеEТ6вq$›a„D№/ЩЏЄ}oz!ЛUc0AlЎ!зGЈ{Fc\цQЎ?Йбф}ŠЖЮ• †њъяdAУ~“Ѕy_ё7ˆœЫ—ё*К ЭјЪПmУ[’В+’ ъы№ЯEящ‹B~щщ6уwП6Ь„).ŸC‚Џ8JZреk4эnzvВkѕЃ"—R9€ˆ‚ЭђЈrЉ0žEO vkmEŽэЃGаїSЩFb™/9Mloх8LМи—]ˆ)м)xbdиѕŽнŸйTcД€ЗLPЪnЩ:nтGUЩЄYBйІЂi*оМЫыMЁЁшъ–[]hРлтГNЖзў AО^Сs”ШGœ~пЁ„ Мkh‹ 4hОГ+XxЛ&? Ju†Пwž",Зxђ“‡ъQИїРЉtМ\ћM†6жгА_tИH1бсђfVЧй+qЧй3Esk™ЂЉШЧЊВa“ѕtцoўЃdє^6C/'Л№‹б?‘c,)hZ—›|х‡еј8Н шћVkГ&˜‹sQЄŽюе{jQ@‹ \šУ ЬэльюХB s<ЩzАДR,ѕФЮїіrыЃ }ЭL8qcџDпЪсЮ}Sяф>“П-ЯЗUT^поhы…б+ЯpћЈ‰L;2‰žО–+уЁ}*ZЙ„ ЫъБфь№иy)†‹Yйю 2pUнKЖcБ”№ [Фmё+nрP л3ŽШ?9AђQ&Бж“ ‚•яэ…ЯЭњ1œНвpPXЅН‘иРŽƒдЛРЁ>вJё• ‹5{a4'Х]hРPоiEАЉ^RЈвЎ3љцˆm ЙДІ­Т†-ўњ€Јž%ЧР‚ЛиwЫBесД|ƒцюz9кtxdТкF熹§}6‡_”љ)u€ zз@qяЩ‚ѓЬD#nAХв6збЃюШЪ‚ I Й–ї<>Ѓ‡“л\ЛХ$хѓи%ВJЧЌбіа #ЯaкљT>‚ЈƒЊ жlР5„ЂЇя™И (_э‚`„їQўe=Н‚‹aЛ§Ђ N^ЎфFY”шr`Эч›ОEЬТy“ЂFXl_М7-%5яИjкouHOЉаJ‰ЏM˜DЮд•zйУdœc˜Šџ–ю_#,ЖОˆaщЌmјјN|гп Ѓфћѓчч9Ъ3Ќ‚j-^4! M‰јЯ‹,С"оЉћіvЦ:ЅwэPM„Џ1Й"чСI}e"8BФъ c0эQьeШ|ХЦ†з Cf ь‡tСžž–5œbX€a| д›8FaeбƒŸы7Йл !LЕш^ѕБЇ6{зЎТ‰JdVJ_Ф—b:$e”ЉxцКЛР›LБ"Lѓ$№wбspc[!ЊЉ%ŒмKхF§№1оnшГ ЛхЊЧЫБт ^!=™Є0u\žmAtзLЮЦ…‡‡ОЕOHи§а+jЭю'ќќ9ЈЕ Фgž2иPЂdт–Ї'РaшФе…2ЪqвQ<^—ўђєgH}щ‘*ЊLлшд1О$N/Ћі@ёiЎЈЁФ S;ДЇ+CТ$Ўa“Ц№xЉcбOл~YсЁsŸй‚ѕ6YЭймX™пŽ#Фwj8яє„*нУ[N2GœTЎС§р§"šЅwgуџдю Тя оЈЦќЫ „щ-ќі\Оx$CЂžwЛœlс§п9ијЭо1ЦY™˜ŸЁZkPу 7њWBe)—‚)†ќњчЯ9ВZŠJ§ЈЇ|™ЏdW—Ф”ВxгхЎuх‹bИ; уfАWЕИ™ЯњIуXEIРn‹§ЄJГ%™єюєВХВ.ZnУдЃщюИ”ЮP“d‰вЮЃ;'‘ЌdџљХ4+Д<›ЙПј %šсЪ„7е№а$ Џ–йЗ,b[ШЬY!ŒЙ5DаэnoE‰ёћх|ь{b0­хЎ[ЉЫ0`Ц,чњзтM -знpцTы`tкфЪ`уЬД2СЕŸ!Bm]З‡џОuhжIЪxцЅ ГН_ыhu7c7tипГДZhUХЗrŒœˆЅ_ЬВbНc-:~ЩЪ[Ig‘*пvаД&kNнЙњД хУ|Ж––НтDЮ-8uЃŸијЁэтэˆкEѓЪмЪ=фадАџџнЙ†-]žlџcЮ†:А‘NЁчщфяjЉ“r}ДЋёББŠŒcCч2к!\ž6№\єD g&ˆц*<Œ! Ѓуьи@ЩЁŸНOЎUеd"л!Jq)‰§†чDŒыЃc1ГzљIG›*‚Ž2‰WШ/n5Ц“§zоPбШЅэ[В1П)—2Rv&йК$чы1з-vxџ|м йЁЗ№О вXm!ю ўдAe{шФЈzЁ ‘07$?pкьШ cтџиЬ9ХўЉяŽd@p ћрЯТnЕ уЌд!W‡Ft€~щ8U$€Ёє(гјGХЎGoeиKїˆOh>dјЅзј ОuЛUF&ЩыOš=џ sjЉ‚BхGcд76ЕfYўnќтЖCфš3Іў&ЂЛД—mџtX}о<№Э‹у–1§•Ž‹ŒE DоьM_ёk{Ьpђ`3ЌфžПЧ“ЮVl…ш2ЅIq|я"•ќБ™5{OHŒѕ•јwgLћЧ #38U{њпhхY2„ЈйžT+_iO`ЯƒЎфЪ|џCвg;˜Ўlкѓэ‹š€ѓŒчІіюњрМШSHXпi%j‡ѓdаЭzгГFвG<лњМFМљ=M чљ аŒE›е! ШŠm6Є4ŒŠ™ ИŠ)ˆBrGН}у9^лMЮЁЅ‰XbпŠЛПос5ZWЂ>ўЙxk 0DШX]ь‚1ќМ'NРWwО‘нˆ6ч0Ž  †ЌВœ­№RІЧдSOyI9‚,пrь2ИРя˜.JТЊyoџП‡TW›) 5KIМІ Ћ‘RНšчстOm‹эцPІŽ1гиК bћ\^ыlЕ=#™z֘Aузєї‚ПЏY=OfэNwкЖv‚_­П№ўДІю-FJјWqBЫБЎ‘ђюrП/КЏH<њ}Њ”(….Бг…G~:Z№6;QЯј^В”њrаv…Ч,Н2Љ:jIP†цFPˆЯrzїЂŸџW(‚™цiEКДжЕ:1л њТ“ =1KПFўdњчЂбo­БЕЬ;ژš‰щ{RgЭ§L&{wГˆvWнѓчOkЌ(хˆпWS€Г”дW&dрСsТbњI€зТо5Nид|U#vaб1E.ЁЙВЏЦ†ьsп)2Эі,4,{Ї/РC/*Б|yј2цuЎН~0>0vу$qћgj’žЇ$ЌР“kг`€cееcA сˆeц`СёіEб.P&јсг9mчyЕ’#5sX‰Ы#BУ'‚Ѕрy9№мВOН3џЊB:ЯЯkтФ–ЈйFM–‘ƒь"ЙXЧ'!dјЉЃ$О˜л‡›г­mЈ‡еš#A‡ѓЎУ „‹ъŽЇWаЬ R"їp…tФЧG+wy‘€ЭФxэ;6=ЬeЊѕ’Бv|ос§:џкИrИt УЯШXЋч–„Е€QмяV9јxwfрUAŠ5фЩcйY-іD`Š“­>uџш/f”WћŒFЊG3ќwqxxJ"DЪfП„JAlЋ€ШbЄbЬЂu}Ј_нD꘠dюwь5Ѕ*ЮUMч}уБbџYvKыA“oZ…мнРeтч#ѕjVьѓЄHЫ­њЄ Е %вt™…kнё;і;?•нjŽ)Ж у)"7+,6“­V(зCїж-lТ ™ЖЬЌ‘ˆЯPЁ.eу‡Њ$%ЩЌzыг9Mњ |эКŽnyЉ Q*—ц%AўДеЋх 1љш#­Зу‡ыТ ЊЕ”Аш,–Ч0в›ЩщJ…@Sыюd&A’:ВšW…ТЌ“G^ЖiЩюьg(D†“ЋГ5Рššfxƒpвї#7ю„vтV†Р­щІ–^цC:oO4Љ`кыšwе5ŒСюN›ЉЬ Ћ}%иИ ­hЏyгм —сЩЉ)JЬ9EГVn)є‡s"ї†ќšа”И&…ЇяПoœМŸkew*ЅцІЕ NWф Џ­б}ОУ рVРЬŒOНюm†ќщіƒРt$P*˜ibЎHЗ•е‰8/КД‘iЧеТЮЦFяЖ>Џ#„H&ЁЊƒич;=Fќ§V?о4ЋчJоUеѓЈгlNе'N/x}рў3€šІЎУ…ЅьžQД+ьаЏ  Нvљƒь \ђЊсxw—‡ЎКxNВQКЕpЮ$ъЖ ћмE& Ж‘ыБЬчЭх–аАƒчR›Yx—zЫЧЙЬЮxEz&8ЮšЛнш^Ћ%ИzcЅiТЃ"R<тКvНKэf–Оlн^Њ)™ощЦ*ЂЄ_fh˜+ќњ~ЄцЌcgnŽЙ1Шљх­зЛa€џцЙ3™Г,nuHFтkѓб–Б ќвјйCЯb˜о6Д/љвqчшьžьжжьЮЌЊю‘иХ|q‹’аж[m–’UД4w(#џ ŒўЮkџ‹ №ѓцEœT”ВŸ9мs$6GY’dDМѕ%!mEwЋХhъАБ›Аd/eeЎ{еK#ъэ‘ўL^cIэu`-x“лpиNПРєЮœЬа92ŽЧ |ˆR‹‘фп:Џю}]ў9gEЇІЯБ]С3JЭбlcг„ў ТЭžчЬ†qЎ 2z92_œЦDЧ№R … т М’`ЮгA`§=њ|ѕтеЭвє$pлYуііh,42Ž‹qђЪиЖЛfHДЎо2•„ыŸa“ѓ˜~ЃFcЋ(W Y–ЬЬОШ<‰N‘5yПџšц;.kчЂџŽ4Юъ”K{ѓEh=ЬŠ-hhА6fkhбЎС6дЪQA‚кз‚иxˆN[ЏеИџ#ŠuХёЏ7Дs ˜ У\ƒˆf`Ъ(Џї•?Џ]2[ёаiњ†{ˆ<„ъRъ ] ЮЮЎQдыџE%_бq3S<ѓNЗDKxЙ‹лЁКЕžўHдj˜ћ#uМВџ4С§‚–˜>*§ЛG•КЌ[gЖСЈНЮŒ;IуWŽp[(eFќрЊ˜Х{ƒhлhŒЊmБЮeГ5})фЃџSYЎ@ГKJа/—‡;Нп‹k:TЄЂ(нИWЏщџЂџр/VтXмК"%]H1tшє5ё№GœІп„бпЕзН‰‹m5E!ЯЈh|–>щЉК­ŽЄыЈ}Рђ`ыПл y$њ˜Ц—ƒ XGbФІяR[Б0ŸOr!yУ2VOщ_„І7ьв%6?m— EX7G'П0йЛЃэє„ЭпОHм:J= -}w jsХџ”V#;Pз}Jў<я›ŸzFпўOl~дЁш…єялHњˆyU1 ŠZ3jбV—Šчњe‚[ЮМцёŒХ˜pЈ ЛАFюКvЎtLГf]В№j0%9Л/СЃœ^а{dHаДrŒpKЙЫLЈЙPС2ќŒSђj‚СD5Н*yХsЧљгBV|’6@ёБHї‡Zѓ|“Іє|§‚…Ж`!˜В2‡8.OцгЏ€Kvyц<€žцш^=?„Ф(•Šƒс‹piщЄы/-‡mb 6ЃшБ[{DuђПЛ‚ГJ€мBЄї-xхR‰Vg”ЛЎИЃ–ѕxб‘рV-Х/ЄЉБэƒз'Ѓw\&ѓ-#$ѓЂЦюP,yв• †е7N˜`э3.9‡вdBpдx.ДUQ-М~5šюЫ1жШŠќшЙї~.qэeLŒнЧњ’Ч}TкŒэrьЂfўЖ9у„ПлKžp  уFedY-:SБъЯ—дъŽЕ;RиД;u Wю@_dеEJcmќuР$sхТ,5‹JАё Rнb"Н/!ŸmFПrў ызъргnmtnкrG=Ѓај+YMЬђ*–Ћ‰-ЙљА-2ЛЁWћWўРaХšx.Яе€~ъ?АЫMЈФŒŸnмQl7мOŠXиQьШЈ=‡ФдПўX-ž&эЁkмН*Ÿ@ш[Œщ™.Ъ0Њ0›š‹%#Ў/ (_ƒшЩБ^ЭЗZ’I:щN[ІЎ4ірЫяє&ŠI Pй1dјм2/сpb2И ЕІ1и щœ~.K| UИaД(BЌ)8ШlдЗLvг…)B:Љћ‡P{jcЅ=щ>нˆЏ5$НFЬ…XHЌv~M‚јo˜юŽDЧ,RsЬXмœGT\•XOjЖЬTЂъ5ЏЃ‡ЊHHtДюLЈ­э@э9ДОњ‹ЮЅ+’ЋС~И#П@bІы<ьЬЪёg~Ж”.Ђо]$sЕЅ№бЦЏЁщнє6ыхСд—QN2Ф_h9ѕKќŒќа—jŒЗћНЗВбЋW•hТ кtе%єгђяс@Yшёвu<ђЏXб3‹Tіž HЯjcЃ+JВ)TЫFc—Р Єчs3­W3 {;’@Гt†mљ…–Р 0`t‡)Ў@•оЏBЯHnдС•А ;хЋгТЄзЧТг/јјеЭмЇq 4ВьŒƒ3‡С<*ЛмgІ–RkJА?TьYО]ЪZёCЬ@ЏЖЉ5’ЦŒшgМIдmUŽckЯЏщЭў}ЮcMЩeSљ9pDˆб‚(љQ DH†Яѓ„і"uŽКUсƒт&ЌžцшЩŒ3ИА{П?КL№Dа=­ є^ЬѕњьkЁЭцЪИ- }uфD.•Б-pјCOи1xmЊ’є]@wІ`Рџ`Ы~ZO$у–џзjїœО’6рћУИ9—a’7дПЭпDУкkЩШМЊHКjѓкђѓРSd—67В P†ХЯJŽПИњУДGЛŒП“Є$^ыeТ†цЭ№днfQЩ€ЪŽВ?ЮмЖЦЪ•6C$—G‘Шіw№†MTёЁT/‡}-ŠDг–A”‚KџђnE>ь. ’DzЙз]р pœЕ.ќцЬь­c ‹б'Д6ˆqƒJ~Nl!‰Г"—ћЅBzЙ0 %ѓХG,ќ<ЧAŠѕ‹tє!k€+NyvвФфƒО}ьнх8nыЬ5ЭˆП гИVDO 5•Г8ag>К7 LoИЦЃ-pОhI6MouЉNЄWХ#h’УЖ‚&‰й33• ХcђТ]†sгŒJR‡zqЈћГŠHУј~~рI 0&y{vEјРпA#ЅКF_ља ж’;Ф? gИ}ыѕEЈ*5N;Ћ‘Hи0€Г}Л (Ђ-ДZјГ†P№LŒ [WрІ№Œтњ4VЅZбтЂ3\фrъіTЯђš•см}"ЂТё\b:вЎДC\y:івNœml<ў`I …NiŸЩ•Bѓ/ЗlГ'3„‘фyИ j|еšFdсDЇ ъсљšи й g‰D•лnšgLŠk№ <ћЫВЛƒW9bŽПfuЬUбƒy‰љлBMж,4`KХ8TТCZPfs’$Ѕяћ4о™+Щ;кNЇC|pfMJj‰ЭˆžJ#6ЅЊЅs”wаѓH`Ÿ Хє0ч оЃŠ№ЈШк&Т2— ЌР ъ к,Ме18Йу–цќЗЬЖиИMH‹šчяo6OзЄTЄ/Љ^Ћцжоџ;лWаЃ"BК)рšw`T_Л B"YM §AКpьˆOiЕb.ЉЄ:Жў„+яi8„ДВƒшАљY/Ўчх5b‘iWІŒЌ Ы7ЯtџИ{bs#Ь$cЫnƒCaів|NўСс@О{1Шј;…\*Й%ќ™џIф33ц‚Z­аh6зИц§qw)ьБMЭ‡=•ЪžlCл—+ў\z Т•™Е< ›Х”}фџИН8Мд­7Љею˜0 ЏH;oэaй"хyуZj3ь“ж!7ЂIzvF„г"c’џЅ-TєMЂІUюЪcKа‰,’ЛХІcЧ”КKTIIЄœ#ŸђCЉ=?’ˆNxВ-ПѕПЗЌm(TЖЯFеžѓ™цТŒBёXџЛБ!ˆЉI[ˆw…€{jQЛr \#JˆhЏ@ККвѕw‰rcЕYЈ|>Љ€3џв›#tF„‚Џа}юƒgкм~*(‡зŠ—СеFcџ9ŒАТё‚Ф2Лэ!NZb§‡ЇhW‹UjІd]pvtј"ОJ~PЖи‹ѓ^b т>Ђwрt{іj~F ЎMйv у№+йвж„УC]žd+с „Я^Є=Ћ‹вЎБrgЅ8eЋ pщœŠE;PJ"ю„чƒЦŒѕXњ'O-vРж*бювЇ]ЪYDŽбiШcх`?К_ЦOН„v„m%Мœ\К‹›ДтШ:Ыв,\ц\Œ7ЁІ’M4˜Pя/Ъkxпјик­Jœ)VЛf—7пL[ЅŸ ЇГ8№vM$ЕЇ”dВУ‚цЄ).rCшФ3A a“pzшšп_•:А„њнњЛрЬЫ0uУeр RТwЁС‚ p“(к‡|ГШиВШ~ќx7KьЫJѕ`Sѓ`?uџ&ч:ю^8ЂнJ­–Ю(њLљGџћ[q“[лф0P-yP‹=ћ,/аЅнoхi0' Iј™С‹PxH‚чћЭ‘šЊh…p€`qqЇ5–™БЫНнVo‚Й сLЌт{%Пл€€ vДъБТ 9HE]9ЙЮJѕЄю>|”™дЃ5–Б8аEqjpУ ЖZŸ3 ƒA€JШќZw2*>ОвсђЫљ*эDнѕiXЅЛoЂD:xNћх{|бFK{чSўЕHёп tUђS`3пPщ˜тjВs—А1юєд‚ђ„kZQЦіg!o™Оš\у+5нЈVzъёаЖ–Z Пррh&;$дvщ#я8kX „ФЃЂєСЈЌ "Л$@TЌFuŒЦ/ šУLъЭ7gž(ЦЈє†Lф $rHжbdЉўђ™EтA™Pvn›ieœЂT8M~ B qdыцѓiwRі,hU"€yrsПпЅ@3Лоџbѓё…ъЁ)_K7•Ж"с ны˜ЙCœ—ŒЊщДл8‹8=С7/ЗnЯЏ=нп2{й.Ёф2CВ•фо:{4ячџЕGеЦ†„+яЩžЛŒщ95@ц”5L.<йгutЙ,\м$ч”4ЈvПо˜::ЏрВ8ЯEhЯ6W?)х@5YS‘Дcc‹хОђwЬp т–Й•БƒqSѕ вўEWшУж='ѕŸ /8д‹˜ТŒЂзѓїuЉ]O-ѕт/;RLcЈ‡T‘чоo_ zъPSJщ ЯмŠш”T;•Ю<§œ. п/яоGeTŒМ}ЃЎ\цЃ •ЩА$[ЂbлБ”ŽЁц•Ы‡8y}–.†˜17‰8у–Œj• цЪк'ŒflЏБ’Ић.ЧЅ‰zџШ=ѕO2QЃŒі7ћ+кМp]hђU7`І-ИЬЗО€ЕП“чQдйl+\з‹ХђТ*І•чžм №Л@ZнhЙЭJgО1j i7–!ŠўЈЄАB!‘ƒПЎЊ ЂяПGšlћ+нЉ6zЪМ!iгNЬ4S3НоЮОрЏh_OїЂќЛЋuGЇO§TeCн,™q„рNБ:)uЂ”eІ Ь“ЩЖXЌиg=ЏdОО/J2Џ].WŸ+ХЎc=wЈ'ў{ў€ч%fэѕрцk?ŒдŠбЛХЭф „'žnvŸ[J‹АŽOyкoЈјЁdM`^toN‰lЮTЉš"HQXx% ,A`,VсрkЋ3жђн‰є:hnS}•;к†ˆэ€‹P2gЯКЩ у4ШK­HМk‡[ЭL—mmЖZOЃ8AyнгЃ^ЦХ,о{[РіŠч$Ѕ}N;акeєуПŒш`0bчдх№Ющ_дW?г;‡їМЌMХл€—ЎВв7зbТsъ–0Х+2(ФєфдЏЃlˆ>zеХ "ю"ŒТнЭka˜ЈЇLбЬФUUx(ŠЎ~ІJПВ`Ф`Цe +ыз6ўЋъV“0ђtDЅ%ЗКЬа eFЧŒпГ›ЏиУx qк7‡b†™5иБ§ЇЃлкCзti4жЕƒ‹ццџ|ТђАай›ыŽмш$†Xѓ"7N%uџДзуA ‰oЪфДIŠf&шœЅМѓ‡<г‹ДTьЏЭЎє>2QљДa‡Ъз жЉWˆ•5ђЩ3[уЦџ€ЩЊц Ђл.х­N'Œ†šѕе$Аf‰ йєЕдэ@јК1Ы_ї(_XнхXццѓnЇwњ:8НLI<КAOsц*™—ƒљn АJъŒe‹4ВreуК.~Юоbв ОСьˆйУЪ 8Wr()ФM”їњ™њ‚юі$3MчФЙЗзЕ1+"™ і)gіЖВьѕE€TакVЅpє‰эй’‘ЎIы›|4йm|м@жJ+лЅFomAiєkiхИы>ДtКj™ЖЙ@’ШгЉЅ.ЇѕкђС˜Ў&лŠЖ"„ЏЭbTссёžryПЄdbŸ#пДвкуЉ(ЋЋKŠю_k/PkxЪpіЉ„я`c<Xuч3э АЏКЭ­•вэЬьcnZ\гІ @ЧЫмjЈк†Oй­%­юbW,rУЄp‡с5Б 'DЪ_№ ХX@ Џ–зўюсkЖYя/c=ћЂЫOBЮЙ6 2~vXР2"JлЧu‘Uc~њ,e 6 Йd-Йž‘#Ђњ<"–~‘*W[qЗъ§ѓŸш ЪV†lпљQœћ ”oіž*E\є‰щНа]œщфєУ;:чђxЋ•$йd6іД/Й­T-`@]РM,~ o,tPћЁЖVS€ Gq”BГЭР ІQ6šGšK†‹ьz$кЁ_‘%\:KГJО-УќыwuуЉу5Оz4 П/0Ос7ѕ˜вР7i4/А–№‹Е‰3кЗђчэ“ИоЄ…л_Œ_?*pџАf‚˜?nsF<ГјШ2YјnЮ‚7nП^мЯд5гщч›€‘ PHFЫВЈwћ(S€ѓ-џ‰ §е„DЯ+HMцA?яїžК$бкwф6ѕAЏлћТ{эеZ ѕє}ЖРo џxеŒЕЅ­§œ–гvww}ТŒФњЛ†ХСђсP`ОЅФщD1`Ї’—ЅS9Н0E44|5€Ї]fЎ…†'ЭкН:у$XЙќlъѓ/­k –+\ЅŠѕЊхLжєбБ›Ž`1†#С€nߘ—ƒJ<іŒ7љёвbўѓ(чMЇыЫЪНЧМ1œђ6H8ХrZ›—a}їѓQЧ%т kзW YбЖTС§цwfŒХ@ ž? џРЯ#ѓйzјXЋ/ ^ц=_еM”Š]ЩН$ 3Њрн§)˜ІЅ’{ЛNJ–5ЭдˆЫš;юьR€юјИ8вБ:шїDLц(Й~Z9T{ТЏ‡ЅЊВ’Lгђы+вˆŸчnлtiоlnJ›ОЕ8ЮCъ-|нЫЮu,}OsКAЁ3 …СЏ#ЗgяѕЉLћ.i_4'мџаПлѕ0#И—E`&ž№‘P@Ђ—сЈ|L}ьЭІ<'ƒ*ЖдB‹СИД wЖ…hV$r№бМ\)cSщ< І+`QёЙmћIС=ЙZнŒ%dкВ­’Pї‚jQLьЉіfЄPИЗј"ж:Jм­z‚>ЙiD:qQ >qƒњœX…r džњбЧxЗЈa‡ъЬoЈ“CЏLЂ DI#‡іР}Yr%ƒз§й/1љжц#C+мЧјœЯѕтBщўЪX—ЎЎ_ЧXA8љLЌy"шІч&K—щЙЛУљСНVFYЈ\Љ›юU€-o{/X[вЕВМv˜8ЫъЕџ$Ј|dY№1ъпъk ѕ~ъdЂЫ–ЊТЧIТА`Ѓ8ьаKg›юˆEќUЌЌо‰oOnr9ЯytšЦ&зrп&DCtКП7‚zД›Nьђ@TE‡sрQЃЌ]:wfЮ ЩŸбB&ѕDбЁ‹н<інu3œє1`urц˜зЛY%ZіЎьmq=CЌ}œœ‡_ AыВЯ?`–AЛІ}•3E0-џЌQ_МсU3{ж HюЌЛСыd?`ю4­6 Tн? žЇяІЅЏj0›ЯŽ/ѓЙf`ЙxxЧСЦV0wA„uTсЗƒ§lVёm—ўЉTqЏ'œL*зMšTЮfZВ#3["уШ›•PЛњŸДг„ ~гŒf№NЊ„ШŽ—Ю†јЅ 5Qэ%фѕ;&pЋ†sє[бLђ ™ї!!1œŽ‘sϘК$ЖрM[- UfЊšК,BIX\>`В‘}юЙџм_рЉ YисЭђ‘ч"Ќy`ЁЭ“ЋУ'5б‘ – |1ZпšаqЛwеЦм+’гivєИ‚>улпB}<;Н`EИ­n§›рх3D,Q=оДЈНИdМ2ъ•Т&{M€Щ/2вWIЅЧEЙІ}ЬхјЃЃCм Г…4mф|“S~ѓЕcБЃ Mњ?~ЇРЛьЁ>Л$љjУкN члjq5АvэзщћBх5hјHhЌсz‰З5ШЁ`1CйЕЗпA?')‰еrgШљ§qPCI0R€–”G›3њ№l)KэсврЃE>Uм?Э‚уЫx$УЭ8 ~чADZ‚VЇ4эоŸЎапЌa †C#Хvbltьф„Щиузш7…”ŽФНчђЃŸ FhKюOHD{Žй'Ц”рB@›m >(zЭСBF§pЁХйx?sЮяuaЂœWŸXD;PEЈУ№ЁN1Очc*Ҙ@Iњ`КNв p ‡гж …0Lb!pЦFYƒЛИ…q ЯŸTЉ›Ѓ‹…Йз0iСКн2сяхЕ ‡67wоё^_ŸЊ ЫЕщЯзЖТаЋ;ФЦБПЩћИ`Р’тK3Р*њЄЃБOлЩY;xфЈъГ3ИRг0XдmњKЇdёІЄхhЉy,нЃХЫА zgсЖКчыоs+}Юќз$ŸЧ ЫŽm6bS]Е[ “$ё)ђЗ~ї‡z’ќг]ј>Q(>_%НЛЈ^Ь$ ^Џцїъ[ Ќ– -)УW6ьи;œwi‡`EPіАЌ€”рлr:;†"_BOНtщЫВвto&”МmЦ_ GЛœиёГџќ^‹}œЩ‡4йvйGFї’'– ЫЬтО{PЙў€C[zі—d;уLЎ †гЬЅб€б)ъђ…›“ГџqгђУt@p>гСyЃК ’шёу:Д Vs ЋыТТ/7рИєюб9&`ЫR‹˜UDИ сзxHЙŸєіыSШш%б|.ВL]Срhq OгŒњLY`o#ХXй,$ГЂ"sDЃjYя ? Р.>е„Jџк!ŠfЇЄљF)] йV”З4šКLђ7тЋ'Rh\(dˆшOДkM‡]Д€ўeTЏT)uМ ЩL•†ѓr+ЋВхst“%%'сХЈкяEJОw#qп;ВfЕ‚џЛХќя™?І–љЌ“}Н/ИП1ЏQ™ўm$ж№Otj4ХDDnDЄЩ#]iE№э†мібЌтѕ/~­)‚ЛЁ”фЫЕ.y%›Џ•Њвџч­_п~І‡ПЊИпƒњўшЏјдГѕžp,(OПпАo:uцБSЁџ §Sz`DЋїy4<†ВЧ1EІЉ;a‰j>‹ёЋБгFћws>ЫBх#JРA_ДХ11tЎŸ”Ј]„>ЩŠх‡€ЌB-а3ьRзКo_зјЉ‡P?Ž„7S[Д3ЗуЄЅўCьЂФтКЫШЅчU{ЫзЁ Р+ЃZiD3ъ~"ЃW6œ;ƒБоFўЌ^lэлЪ УAјжKр­ЯEwŒЛ.snњ+JsbY(fЖsqю0.,PMf8Ц§ržм…ўNхыжпЖЬќѕР)YVШЊvŒfs.вШ“Fйa№П Tby˜#AмkT0}˜ш›Q`Ы(јЯМзй6яіyDm€Ђ.љsњ€TФ`=;Р•т№ЪQиž@Ÿ4ф6дЈ‹,5ЊОpѓzg;бe›„‡**$_@7ЃЦ$e83чЅ”дЁœ!)€ѓїz1Ї,Ї=;%™œTМž^Da"№жа-О=ЦGRІ[фАкдƒ%дЭœjГ–пџW‰Re‡г’gСцMXvфнЎyФOЯ^Ћк&Влšц‘элъ6•G >P5‰чГї Iє”UъRk4›ЦШA"Вw]Ў‰…#vЌVkЕХН9, ЊўА7 тež5в‰DBА(Ж3!†лŒsŽ*щGгq4\uњ|Ды(иdќƒwя.žпйљќ~ Yob]ZХЈVхF@Y)ЇPѕ|JHиК4ЊMKЯGƒYœvыƒћ_DВР47Ž S’ѓ&? Т+Wоp _аъlТCTвъˆ\xcˆиЧЗ‚МœFT З*Ељцrl@‡kЫiэ ЁЦg9ЁA}fьХ˜‡pbёˆш:E‘‘ŽŠHЦ빓е$i|k€ˆэ&–šщD‹Чёэ‘ќљw%Т–ОkН^•€^н)„иtG)„аc ёб‡>ЂiѓІ@-З2п_МзЧПB@ВЌР;bx№˜§Ў‚eўi?Ўˆ{N <ї_tЉ\•ѕ{їмліЃ†*6=ыу ќ_;іЌлGpB_МЄB\уM8юЕ]#Х—xU˜Юyд`#ХЯх wЎдъЂъЄЗ•ЖE…Ыщв‰МЙ™Ђќџ1) “$гAќ’jž€Џžџ)xж…ЂA‚ЩмŸТuРЮэ! ЌYRБkРѓю“ЌБгtїј“ЫдєdЊ^чEДђћ4<:\ž{d ;A9Лэ_**oї2З.Ѓˆ#ЈžZ­”Хж n OА:G5№T…Yа[fg˜’2ѓ$=qФСBšЌвˆHX,Ж•ч$Дуj7Wх7—:TQгŽhЋU”AŒђЛЇжѓ#4H ›Ј4i$˜2ўD3=П8, @ђ~k-Т†q3U"йg№™†єђ5дЈАжq˜™o@щR*4ВЪ№ H?%#ЬџшZЮЩC‰QKw‘Б6ФkAgPwXЈcgš`(Я™ŽўКц5 ТЭHŒѓИ‘Р‡ТfHЮJ; хчŸ4mJ–—CиfљЋpHk6з!…82%вUbнЃM­3+%Ц­„LOQЮUф[oхТ`;Ÿ цw'нV`›U=џОНejЫmœzА‰ЏA#{jQЄG„H}gwKYЎ)ДФ‚ќƒŸZкпэV[РбE”L>щЁ_лГŽ†рLquпй‡мrќндŠјОЗ‰lqvЇйяRJЗŠk” УћгrІа^lя @}Џ{ыuЮF 0–9*Я,йj{ЩчІy_F8ЈЮ}]Юуш  РžіnЗмMF•Ž ю{+‘евSm€Wsх’+Ьы:u]‡PщЊ$CџЉЯ.ш ?хŒэшšШMдЬ2ё‘ œєМdœтœp?Хh^Ї"ј–XhТЧ…OУ’l?ЛБœоnїЛ*фЫ­EoДŒІlJ vДXЁ‰KoŒтО‚Ь5zДB_ Гv–™л–мYQ(кИœ[l5јœa dš<гi§56|Нђт9чYъ”Агэф”Œь†XBшš)Жˆ ”ћ;_*Щ"чкgњЪчсчUЏ ‚?t'цmAгš"ъr‹V‘јrЭMƒ1`э}Y#iгr­јGўGУxэ†@_“N&ЗrрњqРMбuttвjПw)J§W№ћ—ИпJЛ&U/}Œ7|ЙЗєC\›'МRœ­mѕtˆЅИt]o:`ŠыžуHbtЁё.=8НfЃgц#1јдѕйе*4щ‡Екlє[# `EŒj›Ат„' нi5x|WŸхўшЇхPј<[wЦX‘єHh4Іb„3 REЅczщЧN‡=\Ь‹_4<Фћ e(g—@#Cњ3тЬџшжh>г"ЎУ•UзˆJЈъЬwrОЭ_пипJcњI@г|‰.`бЩ3ƒЮqЛ 9 HaљеV кюK'жНZ%џђG§Ќ\ѕЪСЗt€Ж?Ј9zјьсйOk’К—И›щžzпУЄЎ€ZmT.ЕЈ/N†zЦ;яСo‹‹Ю/Ќ6ƒ6xLmš1pЬђAЃ4њ›:ЂЪ2А›щAtиQцђ„pЬŸqїVјШ,РgХRвФтsфcЯAпѓДзŽŠm­Ѕ‡шHѓ†KrбPGŸъ =7ёƒѓыІ ЋЈ чA‚BžЌJ{ŠПn&“л$йЊд2“%Ф&ђќ8ЭД)„ ѕхg1Ц‡hбЎtчE" VЈчBA0Iy‰‰ЃБЬg№тлр2}Ї€NUЅJТŽtŸ—ЧЋп‡ХрЙ…w№МP}vv,ohKЅPц4@ЃGwЦѕёХЄœ,3Sшц‘Ъ†Jіс2 FЅ< ХФ_й?/w" RЂ…*КžoИ+žўol*{)™ѓђН‘ XЌУ.™ˆБЎЃ2Ќ‡ъ SW"B_ZтЖ53л г@$.JыBрЬ5ЯYОGЦqvVYœцЕ=Љ7•`ГЯ’р­ZшќЏбcџФ›•Ћвz†ў‹ˆN(жEФ(ЩŒ0їЮНыC(ЪHаZsАhщ;NsЈmЖ3P уf|>Г‹H)f•hн—Єu7ЩБFГ~б/фїёu854aЎЗ˜Ж‰i‘‚ЁЖ…${,="C<яLЖЃ}K zох<8РbчоtFЖв§{ŠЈPќ[uќ’"О`“щJфўДƒОpќй”єГ,є]иTgљPч{ЮŒ–<‹T™ ДYЂ[ё’{ФівИ5vЕ0Ѕ.лЋзЁЭя0с–ѕѕТExA›pуMАRЁŒPЮ§Z§ЖыѓУyB–WЕ /&1ц_6г  ”6"ЎЁъйљiш†RнеЋ"П*иqoщЮ€ +рJ+ џёУЧBб9ри х›Ё^БRЊє6ф­C>v \В№–‘–чlz|цопПEVI=с)l:р@<‡ .š;ьCшfOEvк­ы 'gЌйN#,-Ÿ5S#Ч7­i 3cc?-j?тSГ№ѕѓbE)Мš‹‚чыцlЂF’лвЦsЙЫ‹hеŽйT+є|ˆŒ~u[ЩыД7ОћбСЌЌ.ц• њ=№вu!а“ђ(Ѕ\‘Д… жс…%]6H ‘Dp7С†[”ItЇН‡Ж%hkVЮ1ѓ1a›.ј^zjSZVЂЫљё-ЦnZ1њЈлOŒЖ“‘ф8€:‡•ЪD5Šw}Яh~ѕжar_`ЖohЕёЯфђ…т0’Є6љ ћKиb‘ФJ ЁikзЯUтр‹т4_$їj%@ f7ц­і@ЏГфe^”ˆONлƒ*+žaƒZ_{“ŽІЬФуЮ8> ЫпXwАГ"ЌР8Пп>‡W$ ПšмrdЩ›ўMоЗžnќP§В‰$sZѓt…‡Фz1˜sŸo;*=с“9DИлЯѓaБvхєї1нэy1нОЯњЗˆžvhая]tнЄхтьBbFy5( o9mGa“њ‘ч‚”з‘6"P?e aѕЂ іf'Г0cЎБ`iс] Ш•ŸBсЁЙ*rгќvŒСн@ё]шA +хА$Ы9іžбuРТФ:Аѕдz) Ш;8`,WwьyŠ:ГXВ—УT:I <Ќ^5JsœИ^ПQaџ@| PŽPЖЎ# вП№€Zэ2'‘—ъ3œkЮМоmƒ]ЭRn­гО5CьЮoчєТХЄжlRжhА.sUн–R[=7эШц$ƒ]ЩФ ˆ(ž А`Џ"ŽРyы0ёYL†ФJSxaЖ•8GСтпYЊby 4Љ€­$Бп–<эf,>xl ‡Жи‡Ђ‹О$ВQ“Y] ;А6_qOP„QJЙ+ПGTC“ЕEЄ№ йХђ[!;gцWЇ,hCўПБU ўЈЃЭ”77ЪzЄЛ1[Ћў|щю„Sяр™БЅUЇŽЬ–МЋф+ЧрПŒз'Y?ЃKЦ8РhяG№Јv Ішыc}я–аЏЛНЂ.Џ#ШЛ.‰\Ї§§…”#ШC9ўђи–YЂDО†нџMnЙЗ2Эwоднц‹p›ЗЋ{`c3:йПљŒ?™ЄN}щAтПІ7a;›>Њ^LƒъEфыМШлџmЫОРbЕUїŠBкъъkK:­§ёkEМїw?ФВ;]ЈёЪ}-<н{y ыЄsаВЁ”І\рЉЉk}‹є˜§›xоЙ`рj$ №РцЅ.D1џjEЫTM5~ѕц#Х@‚шˆЦі–<ќCa{5љюŠSЅЫсЅ]HШ)Œњ€00Ybю#ЉіZЈOђА@tрцо"Ю+gё•eшей–ъ$~ШвьђyКэхY ІaЉhˆB=И‡†ƒІЙПО›й(/™„Тт7Wг6: Ч$"Ю6№!НЂ(ŠчхDT™ї|ЩлУi%Gƒf0ˆ…ДџxЫњlЈ7~8D_RoїёŒыъќц„$№bOыuќ1з.]зš Я{ ВѓyT…rБ уСГТСnkJсЧ0ые7Ю!юЕтрН*AaЧŠk6W+–ч/ј(л6˜1#Гcзr#˜+ёƒ=WA№ЏеЌЎРщГч_ќ|u{ишДЋuЯёšЕЊЪCТеР@Ут~•]Ѕ~ˆœ ЪшZюох^ЯІЇАYpc^ЊВ€†жћЉГ=D2k››Е‡У˜‡zШlІ@vлЅыr[XЇўп*`ыwm@АЇћшЄъ –pџmФћ`ђpКawдщчh_fЎ_дe–seЊ5yРЋы[НЊ„˜%AкTЏq№ЌРшs8mшОV‰Ѕђу в-Dяs’! ”гЋ>gpЋчЅE˜Ф•іЋW5Ш7ž&ЧNХђмU8Ўи%ѓІ…ОšWŸ[БН№шQFtщrЫoHЁ`п+b']џAЪєUЃG–G2W_uobГ'э•­мGƒв‹ЗЂНKЦуЮлzКВŽЈќBF‚”•ЪЎуѓ Uobе#xG.„œ8ѓb~aЩ} TH‚nNи6вZ.§к…І•жё Œ]&ы]VГч!Н~ыŸДСc=ГŽWT‚бQMl-…“<žckЪх•chk€П#]а—ђњ'м/@šŸ7UёЅ27Œ jbšхL›SD?Ељо€FA2ћF+"gоё„_яotЬheh›^тяс„c|џЯ8U62wЇrв2;ё1ї{.к(S#iю6в‰Щ§ЌHc@igDvˆХјaФPЦоt˜ЩКЁГршОё8Ї p Уўю§‚Оž—™Ыи3К-ен$mх‚"TIјѕSGР(КФ24юa'6Тsэе‡C;ЪKЯьHЧRёщVЧ^˜JСіоŽ”H *|нк—Ш€p“*л1ŽЅЪŽчFГ,Бь 3ё­ЃЈ<HKаx–H_?N`=л хг vaЄ—Ух:xр<>ћйULЬ[ЂИƒ #7ЧеdйPЪEeЈ{a9ЌсQ|–йe˜УБйУy#;tЩfЬX #X5ъе§СЗЯЇЌв ћЯQn|№МљФжDЌягЈЕCРЊфФd.ШєyюСшУ7L>ОBƒЂ`mm•т>……{>БшгD(Уг‚[—zмШ4Јъ­ЊЯћL‘OЅјx? №ртД%pс‹ДРр5”ѓв…4dпжъ š^xЊН ЯУЛЗrcd7жš№-‡Ё:№єQq зQиВvwСЂvьмСХ~)d 6юЋpаq-dѓбћќцэ=cžвXђiј9[Uдq$y†Ž(c=й!т.. ŠЮ‹П.ј‘’9Ъа^~Y$(’’Є"Hћ ІL€CeTMЊиnЊTlУ5ЪЖэдАW'щ™лї ZЪŠuЈжpкzы1>ун5СІВ-fЃ, МJ>є•zRС vЦФЅщaэ№Х И”ƒpGщеЉ Mб4r&ЎъЦР/€@UЧЫkk^xn‰bљяџяѓЙѕрќ‘~m4Їmšд}*Ё9§6IЩуjvDg&мv^"v:§ѕr:жB4~ъOВ6xЇ šхBaС‚O``Ї;=&ЪлX№уї#yшD‹е/дxї,~5лЗЫVšЕ/ƒ*F[‡ю9‹Л­~N^`g‚ЧNи7уЧ,#AfШГƒ{iО8ЋиBфJ3TaКдІ+Ж+эЗЧ†„_БN'k2”jъ{ Щ“~+€ƒщ‰т’ЬѕііЌJЫ:jZŠ_ЧзТЕЗЖЈжЫжМœ˜„nЗ.?[гіyе'…}Z™Ѕ`r• ЫnКй’šІЯЄ6/Р)ж†(fљ%@п‡\f)M&Ѕ ‰ˆєRФ4нL †ш™ЫD™cО~Ц2BеЖw•W›MчNЧTShbЂ>f€С=рШ"ЅіC‘JЈYЇЇ”yFПєЮF{ флsЏi[‰bзъ-;#­vx],‘В;Tщ„щВ9tЎm'i\†ЏЇqЗф(„Х•ИPд-й85ХДC’ŸQ am›ею 7zћшV4 ЭTчЇЅШќ”оЗьЦ\Р,хgСоЌ}YяБЭЎгнлфh•jЄсГN>НejфцX“0бKЄvZ…{DнЬЗЋb(ЖАUQžqБ„^єF'§ДKЫBJ…ŠЁАЯД•q;Їюн Jy;EЖ$Oш&ЦSqb“…œе[OнА@љJ~BG†%@цдыЇSZсђ€ІчSэl Б—№;œСG у›‹ŠзŠ@Ы@d‚qsеfxъ€Ab§Ю‚‚аНzјД=ЋrmMЂ06йŸrN…ЌŽВeЃ .ЦюSBbc›­Q^wM–YАr мy?>2єXѕk=Jйa^–j|лк CЮА|Ь%JН!ЬсИ{Gщ–ЊЬNд€”єš „&Wпќ”7XзЧRЅџŠТЎъIЃ4SMиБf*S&ЙяЃ—' ПS2 ˆЉZиЈд\иЌxЩ›T• №ŠR5pЏp˜Ю%Oкaд ш‹цЄmЬЊфЭЋ†7„2֘žуO"ЂФхš\`/&Њ3­­ПЈ‘й–а7Ѕ?єЏ:Œѕ]fРшкC„eVъž&Ђ$2 OѕGЬIєСэЭu|r^ 2ЕЧvVD§ПЙŽ,TАЈЈТoHEђЊчY3'ФђкŒU ЗнIќ†эšЬ `с1ий>‚$ПwШЎJтXD:ышіМКBj,ЁgЮИЫ5ZИHЖ—c7gœ?’DЕo гz|,ћѕ„jЖ2—KНn@ЌшSq†-} д@ўUёgƒQ‡нЮEяэVПфјCѕчŠqяNь(Ё ЉЬьN\Хˆ,J’5 ц&ž“эJЪi`Єч­ieiнeљЎ9|’ъг№–›НГЙРЭ Е]C•šиiЖ o8E_u4}t1­L+TAЧнщ›5 › J ,Фl‹ѓ0gƒѕO§{ГTœqpаR;АБfХЁ…ЏѓŒВR—ОWуMю—= +ЯДPM;˜C—C№Ѓ]iP‰бљrdБ9G} Њd§;Oьїƒ“?.NE UЇ№‚YА! ™ч X!Ю5‘~ \ ~Э{X-ЗЖйY‚фаІj#ТŒSЮрЏŒ$эЮ–Yаaћ8h,яЮ{бщ…уX^мѓ™!_–„СБqfy6RvwkB&œ?Бsiiu2ŠпF]ћџьУ 0ло^Ўт6и Ÿт(tXkь<ъ<џГˆЪГOmЪУЊ…шfoЙo)­Wн5ЖAиФ€ цшЦYј "w]:"Ц›ПbXЌJюšsк6D K€ЫъЯ…€S_А{'&jъiшv*(ёYЧз_''ФSA(!|•SэтT*g'q-чнГъ№СщЕѕжq—QyЁЃђљXж‡тšѕх—`MI*L~yџ'№Гўq@wђђїо„гџЭЄ0а“Еc›Цс2ЫџqіNQGЯ%Х"Иœцш–ра]œ/Jџ„ГцЮteЅV-TyЃњ{odw–,ЗШеЧ•‹4 Žеі5‰ЭV\Šџ†ˆ“dкЗЋWAит]$|Œ!I,Nјх()Y.iцп1Ћ†К[Я„,y—xёJЮ$ёХQ=‹єН™eZ€—тp"$сr…Ц­A˜ўb…S†k7 yвх‘kxdŒЂ-pНюQ[эšцо‚K”АlЊш€шCа‚ЭЃѕњёA€ИжrщfЉЂЉ"“ eм 0|/Є)ВД†nмКKeЛ‰uhк8њ АЃкN€&„3‰њщфЕj яЉVmh€ РqЗ!ЂЉ лЏ%$ШЦcЄї-XпЧКщбўп,•ЮkњcŠn•AмxiоЊ_њQ…I"3Н’hЗ5Ѕ€ цЌGщ7šѕя…љ'Fg№жAƒ.#ЙSбFB‰ˆц‡&<ЎУп2ЯС(оМ‚ЊŽ `M[іo›8xkРпВƒо3К63sStХйЏђЧЃ€MвCЙ“Zd§Ћ2“—3ЊБpmё:шН8LХаWЄгШё{тЯT&BeЗБqќљ+/5žнеЃdЦcQЏЈпГZн( zЛYз]’9@цёŸ ,&}0L&2Кље"щ"УэiўЗХ<_оQk`*?d•eu‚л—ђ.HCП)№N*˜ъ є дшЧœъ”A[pА:М’p V‘>zЏu/•‚Лф Ћ” ~ТДІ4s№#VГњ>;q9Vх;[ЌuіЮ'єЖяЛVЧэдFОok‡›н§jJ№ь€ЭУ==%‚ЭРULXЦGЄ§+кmКCdE!h‡}v^}va.dŒnJ-ЗкWСшif<в Ц№tБЛfHяC“кh‡цЊц ъЯЋNт~ўEe94оb~ РuWУoЬ@Dш?e—%ЃEйсМјŸ Фљ|?мш ЯКM“cЬxБХЫхЃšL\rыSЄ‚XЏЮшwmщїЯ›нЗЎ\ч}=џU‡jоПY#м6‘ЬFё‡Ђ•зЅSšaм\иЮMLЉBmээ–рoќэОp 92~аtтeьлyЦŸ•є@цcѓчЋ(žfрЖЕE\о6r=š…uцЗQvUГ\}I_ќИyОа~ўј{tФ@ЧЮИЈс+Ј <†щ€F™дž'$ƒ<ўpт*ўZЬ/иі%Ёo]’ѓНРЋ[HТ:тЪNяєЛƒ<ŒQ[tй2нTo4АяЯЋЎ7ЁЗ „ЗhpЋ˜нАЙ—ос™@dн ц#2!HAѓmЧd‹2w”Є$JŸ<И„ жЁЭёЦšОd ?8ˆщf=бZ{ЧЯHV,‹јъ=ЅЂцœчъДЅпњЉ'Ѓі\Ј~L€Нн:ŠЊWЯщ5Е ОLЩDЄrеЗк Љ;ќХчŠF}Хф,rнк‚tНяi)ы5TяbчœYЪ#.]Сe)Єѕіцc—CM…Дё…- їtп… дё=*Ÿn6ЫЂsЇёl~чЋШъžЗђB‘ЩgтC•Ж™žЎќі’%iЫ2ѓ[qHКъэрщЪŒј‡чЂ šG•<‹†шІЂщ&сн?ЭЏtp%і<ЇZ–ЄвЩYзоѕа­АoўъWьъœЧВСоЗпV'л{}ЅЁBŠPT№-I€‰ \ЫЫжЪ?Вђ‹Ы5рXѕДŠ‰ИG‹Ьил@†Юб7рнф‘H*Yк dЂІ@НоŽџxйz6u:&pЊg7O…ь™џ}L+АdyЅ…vXЁIМъХз;pЙЋрјХ€ѓ>ЅЕF"…рО!%М 'Уt#са ˆ m<ЈЊі—“ЮŽ|kцiЄ~9W/аXgFКZ՘џImœЩЋб%™ЮЌФI”Žf^5о^‹yИ —ƒ!СNdН;d ь§Оі|q=”bsЌк#Rљ/€–$AЂŠиЄЈуsХŽša)œЖXŠ @+ В<ˆСn:’ъНЊЇ@‰. кŽbj€Š V…Ёиѓ“3Dcd^‰ЫМ@2К_\ЏЕ0п)ЊЩЅ8ў<и8œЂІПzCkпї”ŒŸЌ>ФЧиDћ‰г-q`Њ\YЉАžЈ[OСЫ\ЧU~ѕŸrЃуОо0Wо!юЅ•Еўб<,z-—‘œdД7 нвр{?ƒд{ 7юўѓŽ№ V„ТЪ%dciДЬrу(ТФŽіб6ђЩЕої#АгмƒюЛ<О<ШPDrХј№~ ч! I "`CПО;P5Лтєa#ІкЯ‘пoєЊя#д ТЦ/˜Z–lYюUŒ 4“—є ЅSn‡VMяprdвмSЧhp„ \ЫЬН'bє”ŒcSвg ОNш " ž•ЛtІЦqк‘8‡Т†B,Оs­@кl–aђ­шЁ ў:Б.0п|ѓ‘6>@šzѓЁј_+жGmУ“>іљJ§~БмВULGZЕCafWёю Ю\,уе}њЋћXbДЛNж@‡ VЙpёеuђщš[Ћ—‡4пvg? fЯй=†ЋL oSѕŒTЌL€mдЯЇЦy„Kfl>Х3—G№­В›:дBп§rТw)v-ы˜"' Чу`ќќ­XПŸв(Šqn!y#эЩgŽ ,зБzЮXРoгO‡П„лŽšh<Ћo’ мP`Ч ]ю]ѕУbѕi Лwƒ1Oh:ксЉЭ2@g‡Ў~b—>c˜Q‰ лs+;)А'Л в–r;џпgT iїфЙyeдМEйНЙ*О4[іsЫ‘!љџ&}§OYЯTtuв†ƒ~M‘уь(–гбYЬ?Lњб(/ с=IІ­@gЕчЊ˜F *Xqžj­оАьюШ:&ЩwLaчЮœО–AШЭ•ьОНП[–tќl'фn™њЅ™0hбˆЦxќ‘ящHёЩвЅiiBШТeУ •Ё ЫШёЖмђС#0Ч†}о№эРН@ ^—ж­ш'бcTР\@u~уd$ў=hМЧТz№ŽfЕЩ†Ьj„xGzјЧVЪ=^qФ` `хаH ёЭœ•кї˜Ќ…"^ѓFI6… 8мйуіо]‘"ŠЪЉM_ѕaŸ'­ŒиЪE)›2\a}d"ЬЧхM•ьŒ№НFTјїсPлДјDВ;|)ћсЗіpDkЋZbК‡ѓрONTщ:Ђу(Œ-Л0tIv{НПˆЗ8Ђ?…ЦŠD‹Ѕ4wmH‘ x‘Ј,ЅЈ6zЌt9D_їУ‚Х!Ы|ОЋ€fэ!k|І•sIЉI—Н“Дlњ8ё~t R3‘еЙˆJІаш6ѕбFt~A|Іы‘+r?oЛ­О[b?ВdЏlYЅ”4mn0ЩTVџ)tЯЅ†С+џfœ*з$"&BАОJзFmY}_M_Z~с’ h?ЃЄЊЮЄ‰цz& xntё|q.‰MSt'ŠъEnЏ WJ90Oc ЬQП}VšŽБЂšгLЦу„иЗЕNЋќ+ЖКKЇ=ЖŠЧMhB‰шДвЋ4*.RXŠЪ=мФД@ !Q§р R№€yч“њаШђ1oЖ ” eMM H"р)wEД-šMоЕ:о!ч#w‚*›GE(œмJkпmлЕ}х—ё`qњЁA*њЩѕLœmhчbыЎo–ЛВУІзЄžњюa~4НЬ[f•1ќ &Гќv|Š(№%'TR'Б&>%эmBaXMнSƒљЋУBпЋ6с@ЛZцЋЫЂЙ†gŸTиEецƘ‹ `цАиљѕкInKnЪTЕ™чЅИFO™ЪЌn–QіЙS‚X><ЮIBD_„"ŸeOc‡B6ОgfЌt{Щ!ЌRэк†аЩE|;%бэ”Ш6+`K|KЦ!рUЏюЦЮJжG4ы_] hY™j ЛУ{ŽyZЖаUEфШ8Сз˜\єбЙЃ„ ‹'aVeёПсjzВеŸ2я.*оІЅ‚•эoИD;П‡™ЅmƒG}…'o›ѕmхљ}JrN6ш<0п‘7P•qфБєM CЫŒЛн/eж(U ўнхš‰9ђЗ€щ~ 8T‰—’+$Ж € ЋЭNCF–œŽО$"VЫpЛг/˜eм™Mmф­05ыНЗY):;:Ѓ ,Sz€ b8ћЙ&УT.л}HЛпiћгb-РЈВВ4Ї7]6%@U/нзN’ГжmћЁУ$уJѕ@џ‹С?Ќ ЈЛ4ёа’˜Н@i‹ўr+ЌФв№*Лп}m%e3Цѕ№іpчй„IUЫu}ХЩ‘ю3ћ#ЌЗ­yV6ЙT24< Л3‘Їx&Гќ ј`Œ `M8$—g L˜w^єпOЮ&Jf=+?АU?k—ю~oўТ‚‡тœљышˆ6u“ІЗ з– F.y{м‘Й3ШФіќМ!`З6n_ЪЮ•'}cёnї$pт'&ћпBэn„ƒтЧаu(#&УkЈYН{Tм€.UЃ!Їc‚Цїўяe€ Ч3аЙљЮ kЃй}#зgY ЖlyH-љКDF”?а`fSQKћcо1м‰ЌaW&тд4єŸї>&eZ„Ѓuqэ@ Gъ|Г[СІё‰$tD\–("0Дмф_Па%6oйKZ@•ќ­‰Š-Ф3Й№Уwо9ЯŒgn:4н"'g§4я.фЩ*ќсXЫФ@ ўaƒ™ўо‰@ЃЌCцаДlЮЅy†4ђ'Лэ­ t|э@—бь…тк4дъ†ш“Љ ХUh{430%œaBŒЧ™`УУ@x'ЦИŸЇЄв% ЪСшљdž ЁjNdvКЦV%љAzіtя=“ђЊгўLvЂь{‰ЅЫч'РQ’ŠыШ6• єq­ЋA$Э‚яiњћ8B™ sHiчБЩFщJЏыCБ-ъуБмШ1О})жnGŠТ ”9!ЊП9W'GbёtАkM‹КŸPп42‡Ђ}bБжнзй4pхщчш7‘ŸъшЊшfЃM–zН‡1!š9$#yЭУ b|\GПуа,ЇvDТ9}PŒ ^AЙ? %в a#p0FЪЪСЄ{%ЉВЂyDЙЙZbаKјNܘmŸ%ЛšуRODттчŽM‚—mh?#M’`ЁД Мтд(qKzЩvНЕчСhАPЦŸx]^БПВ9цЫСoŠˆM„nMлЯЎ5ї†!ХX]„nйŠБ•ЂнSсБШыі`v•јŒ xИЂЄI F вую?:шsщс В%Ў-lgmЃўЙ?Wбф‚ Lk U…QTЅMRо•ъW Эхд{œ?Є0љIѓ 1]Џh˜С Œ8Џ‰ћ.yпj34§0ŠЊŒн‘fuPjе&h)Oažѕ’`ЭКoДця=XЧЈоњЁŸNƒЋ–Œ:\ ^T.wHѓˆ{'K@h)ўьБЎ:šŠ”/CfИ0G^:"ь*=ƒ  §588ŒГЯž,œЫb€X;–њ\Ш{ЬА–XDŒ ЄЏ/zХђЎьцмЙО/&ƒЛ,Ш_ї›™Ма\AG@ќ™',ы§•ƒЊ h‹й§Є…•+0Џ‚y`5hЏ‚ХTИ\ИYє`˜ ^E„‡Cd~ЋЕРKф5Љ,ЦПзЌючЪ3j§ 6ЎŠ~І'м`4CgШM@ЭеўдWR‡аЯOлTХы`$$BGя}•кЌщkЫ&Hђwl2ˆёZп\T_Ш+Ј 3uŒс№+–а:Ћ}п…у_ЊЏœW—Тб˜Ј”]ЁЊ'XGгШтdњ7ИrШE "ЗXЗ€• у€Ў+3 nlкЩсЉRǘБюИХт@"(PzзƒвœПp3ЭбФ оUœ*-Тм“Y­РKЎ +Eˆ&хр@šюљњЧM)j?ќчkSЭЁШ‘{gНЗrй.žЫќш4НOЁяо/,4ќќœбрNtЇёќв4LlCўДe—ф? їmЗk.ƒ™ФFфњŠ€€Žя5DЅКi§oЋ$Ч”(НыЫрЗŒFіђ^OQ[ЂшbžЌ_ќыaєnБМS7ћъ<’zCŒ$ДЖаEю6EЉFN‹}Jт_SІъFED ŒїРљфягƒPирС—ЗИВV.џс9\ъšнv{8QxŸКvТИ яq^†б_ЅbMчЈ94™j7Нўр@” уф;ъ=œOIћняKпœ”6noТ26­tъ#YДНЅ#ЈŸ)T1+Џўд ЄДUзЙ?6фŠk™[ђ}ЙьънN†dПЦ1Й‘А-Mw#„ЗdогнњH]яy`ЋфD?’Ы~›ИПА{њ“КfupЎ3ч˜к€ЋЮУDaН`g‚Еуїж–gA’ `o/р­šŽЊІа2€‹ЎЁgЕD ѓt™z5Б5ўђMЫ ШЯMgЋЇШi”@=йЁ№‡ƒ›EЉхŠ2$л*ќAЅМiA”­ВТдШљБёr›АйЫlEъ уЈkŠд‘ЊЄГєШ>~^АPŽH›OД~XЫк”ŠRrSJПр‰шI›ћ 8дЫо/ЦЗУB=№— cџ‰;яvжoaПйИыaк ьyМЯ aиьЃ%ЕSшей^#„5Nvѕsћ0pЪЭїм8rˆчv]СT@…†йMš"Д„)яGЦ4ыL1Я)Јп”'P вATAŠъђЮ­ѕ­ZQ–\цЩр=~ы%Лunс?2!ЧRТtGЪжK њ ЈК к ‹яlhe€+ЂД%N тСŽ6њcї‚ёљ-HЯŒ’НŒ‹дѕf/эпЩ*{ЃМUŠзe6‡ЄЙ„чbУzеrН9еvТ}uŒўшQЂрyЉ.?`kѓ”$е}pў?]+С2Фh|žМ#]ъ~ЃІ_UY[ТИŒЎЏЃШЌb\“$†V` ц?ˆЄxг_ЪЙ§џыnfдGф6яР.@#тDз ~BLšђŠsэ r6DюŒkП–˜їНћрWˆ€кp КеaœЦщPžшЛ\lЏŠ;рQЛ+U№n‹“ЄœЕY№K(ˆjеŒЄ}]Љ‰ŒдИ48 >Э!Хњp›5*ЪЃ’Xѓњ–THŸB2€‰ `o(ђo/˜;Uh6џъ5вšQХ]к(Ч тЂеmнљХжВˆљпBЁсјрgh§9эќ€ѓ&QN d 'Wю\Vў#ЋУГ;шЩћ‹Рїƒ[мaTqњ{О-ЋШoОŽЊКЙЯBUVY3Офюћd‘зѕ8ўѓ—ФP+3bъЈ˜ˆ‰ŸчШœŒ<ТП?х­зOP ш„uТ (э Ћ@KД$ucy3 ъg‰КЧпCбР‰TГ}ЮН€— ц?6*ѕдGi†i!ЮНGЬДЉ1\B]ЯcDcŠ>ї8ЕЏ)шXђswняг `‘ijЕxO 6Xб‰EЩ!ыƒІЫY!Еhtжз˜=š$—вёЂn [—TgќИœ­CЎwы”Q*†NoњЪ№%c ™‚&ГZ`ЋууџљЏpС.FwЇтСЉGт49иpGшIiР”*`*\Hњuzд‰гЃiELаТОoэУRcЊЃ-9э~œXоЪ›Ы^ч#šaDОrh˜МOж2Ѓn{ЄіR ШлАю„чUр‹œЎ›Б<КYv!-t-ЯpќG>vmpъFˆLѕњ„ЇždЅ˜ь:щ ЭКBъj+I…Žšђ ЪжТЁчт4иЅOћ˜‹ ц9ВкХjюE–UЁ _ЧоxћУе)hяС;‰Р­‹1Ц™,~ ь]u‰ЭчY­|ЎЩЬr*6ёП-Ї#A‰JFœЪ‘˜Ъњ‘c2`ю—„xп› Џ ЄZШ;ˆ<2bЏ‚fѓ9‡ш‹ЊњѕђpІІyjpЦф|р–&Ъqo ІљRHдњі;оТvыљ2/еъ‹ўщ3ЧЖk}еap(rPЏy)q=~НВЦ‰Љ‘Дас‹Ўyй4ќ#œТuњ0фСкА5Јі…Гѕ… Фбв8аY“tиџ-bШ[(Ўž€ хњ;~Ы’Ї9”7ЊбъїL4œ ЕжŸшWœкГюpЁољ}гјwёр6цm€MЕ“ —YRWпП;Žx6\–УДv4Ažb9э’јŸх›Й/Р:vїъ\owЮњ„t*ю9}лЎ|A)0~е9ф!vѓХукЫѓV1чє‘rŸЈF5pXynmЧџЧ+З!6X Zщ 9ЇиQНqв4Ы0лBЪ!f”ј ^–&€h[eœИ'K”ЬИѓїl)bхNв{ЎЗ;‘cB)ВЏ/ъќ(žVм0l=6п•“HUF•dИльѓ2—I'§Ux Џ Ёш“ФЭёg6+АЎfD+ком1'‘eпk!йёCqSнxл!MрЁ#nyч€ шqы<ыiЂХб%”цdШЙ†ИV"1@у#Пu 7­J№J/žјEСвоj!>WЏй‚АЈЋЃйgБLьф*Ы6us\єŒњ cпю‡ ш|A‚ФОwˆ@/ЎеsЈWјš*І\0jŠ›бŽ$2тшc  П€чD/­:;у3vflЧчWйа„Кc06R ц:Lhг/E„gяиПХътŸOъХˆKe…Nиж5Ъtiњ PVp)F т!KgZо;а%}VjЦF™ž*•b,э}xxё,›vпп ž•™oњл|ЛlD)яМ:| Ц`єr‹EЙ™XТ­”™qѕ-.xq$c•tшbˆmAдC>VЊЛМП†фzpV ф„!VбиJвfМкйф)Рў}ЗВfйb­nБюќИHoХЉRтlSfb<Ё}ћъ ќHмO†І[€ЂџУопW–BМVOљ-|“\Шп&tclassified-ads-0.13/ui/attachmentListDialog.ui000066400000000000000000000034611331670245300214000ustar00rootroot00000000000000 attachmentListDialog 0 0 300 300 0 0 0 0 List of attached files true 0 0 QDialogButtonBox::Cancel|QDialogButtonBox::Ok bottomButtonsBox rejected() attachmentListDialog reject() 149 275 149 149 classified-ads-0.13/ui/attachmentlistdialog.cpp000066400000000000000000000253171331670245300216510ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #include "attachmentlistdialog.h" #include "../mcontroller.h" #include "../log.h" #include "../datamodel/model.h" #include "../FrontWidget.h" #include "../datamodel/binaryfilelistingmodel.h" #include "editcontact.h" #include "../datamodel/binaryfilemodel.h" #include "../datamodel/binaryfile.h" #include "../datamodel/profile.h" #include "../datamodel/profilemodel.h" #include "../datamodel/tclprogram.h" #include "../datamodel/tclmodel.h" AttachmentListDialog::AttachmentListDialog(QWidget *aParent, MController* aController, Profile& aSelectedProfile, QList& aFilesToDisplay, const Hash& aNodeToTryForRetrieval) : DialogBase(aParent, aController, aSelectedProfile), iListingModel(NULL), iExportSharedFileAction(NULL), iNodeToTryForRetrieval(aNodeToTryForRetrieval) { ui.setupUi(this) ; iListingModel = new BinaryFileListingModel(aFilesToDisplay, aController->model()) ; ui.fileListView->setModel(iListingModel) ; QAbstractButton* infoButton = new QPushButton("Info..", this) ; ui.bottomButtonsBox->addButton(infoButton, QDialogButtonBox::ActionRole); connect(ui.bottomButtonsBox, SIGNAL(accepted()), this, SLOT(okButtonClicked())); connect(ui.bottomButtonsBox, SIGNAL(rejected()), this, SLOT(cancelButtonClicked())); connect(infoButton, SIGNAL(clicked()), this, SLOT(infoButtonClicked())) ; connect(ui.fileListView, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(fileListDoubleClicked(const QModelIndex&))) ; iExportSharedFileAction = new QAction(tr("Save file to disk.."),this) ; ui.fileListView->setContextMenuPolicy(Qt::ActionsContextMenu); ui.fileListView->addAction(iExportSharedFileAction) ; connect(iExportSharedFileAction, SIGNAL(triggered()), this, SLOT(exportSharedFile())) ; connect(this, SIGNAL(rejected()), this, SLOT(deleteLater())) ; } AttachmentListDialog::~AttachmentListDialog() { LOG_STR("AttachmentListDialog::~AttachmentListDialog\n") ; ui.fileListView->setModel(NULL) ; delete iListingModel; delete iExportSharedFileAction ; } void AttachmentListDialog::okButtonClicked() { LOG_STR("AttachmentListDialog::okButtonClicked\n") ; // display or otherwise perform some file action here.. exportSharedFile() ; } void AttachmentListDialog::cancelButtonClicked() { LOG_STR("AttachmentListDialog::cancelButtonClicked\n") ; close() ; this->deleteLater() ; } void AttachmentListDialog::fileListDoubleClicked(const QModelIndex& /*aIndex*/) { LOG_STR("fileListDoubleClicked\n") ; exportSharedFile() ; } void AttachmentListDialog::exportSharedFile() { LOG_STR("exportSharedFile") ; // ok, see what user had selected ; one file only: bool netRequestStarted(false) ; QByteArray fileData ; BinaryFile* metadata (NULL); iController->model().lock() ; if ( iListingModel ) { Hash fingerPrint ; foreach(const QModelIndex &index, ui.fileListView->selectionModel()->selectedIndexes()) { fingerPrint.fromString((const unsigned char *)(qPrintable(iListingModel->data(index,Qt::ToolTipRole).toString()))); break ; } if ( fingerPrint != KNullHash ) { // aye, found a selected fingerprint; first check if we have // the file or just know the fingerprint. both are possible. if ( ( metadata = iController->model().binaryFileModel().binaryFileByFingerPrint(fingerPrint) ) == NULL ) { // got no file, ask it to be retrieved: NetworkRequestExecutor::NetworkRequestQueueItem req ; req.iRequestType = RequestForBinaryBlob ; req.iRequestedItem = fingerPrint ; req.iState = NetworkRequestExecutor::NewRequest ; req.iMaxNumberOfItems = 1 ; // if the file was shared by some other operator, // ask node of that operator first .. who was the operator? if (iNodeToTryForRetrieval != KNullHash ) { req.iDestinationNode = iNodeToTryForRetrieval; } iController->startRetrievingContent(req,true,BinaryBlob) ; netRequestStarted = true ; } else { QByteArray fileSignature ; Hash fileOwnerFingerPrint ; fileOwnerFingerPrint.fromString((const unsigned char *)(metadata->iOwner.toUtf8().constData())) ; bool dummy ; iController->model().binaryFileModel().setTimeLastReference(fingerPrint, QDateTime::currentDateTimeUtc().toTime_t()) ; if ( !iController->model().binaryFileModel().binaryFileDataByFingerPrint(fingerPrint, fileOwnerFingerPrint, fileData, fileSignature, &dummy) ) { LOG_STR("Got no file?") ; } } } } iController->model().unlock() ; if ( fileData.size() > 0 && metadata ) { int periodPosition = metadata->iFileName.lastIndexOf(".") ; QString suffix ; if ( periodPosition > 0 ) { QString filenameSuffix = metadata->iFileName.mid(periodPosition+1) ; suffix = filenameSuffix + " "+tr("files")+" (*."+filenameSuffix+")" ; } else { suffix = tr("files")+" (*.*)" ; } bool saveToFile = true ; if ( metadata->iFileName.length()> 0 && ( suffix.toLower() == "tcl" || ( metadata->iMimeType.contains("/x-tcl" ) )) ) { QMessageBox::StandardButton reply; reply = QMessageBox::question(this, tr("Save location"), tr("Save to TCL app library instead of regular file?"), QMessageBox::Yes|QMessageBox::No); if (reply == QMessageBox::Yes) { saveToFile = false ; } } if ( saveToFile ) { QString fileName = QFileDialog::getSaveFileName(this, tr("Choose file name for saving"), metadata->iFileName, suffix); if ( fileName.length() > 0 ) { QFile f ( fileName ) ; if ( f.open(QIODevice::WriteOnly) ) { f.write(fileData) ; f.close() ; close() ; // close this dialog after successful save this->deleteLater() ; } else { QMessageBox::about(this,tr("Error"), tr("File open error")); } } } else { // do not save to file, save to TCL library: TclProgram p ; p.setProgramText(fileData) ; if ( metadata->iDescription.length() > 0 ) { p.setProgramName(metadata->iDescription) ; } else { p.setProgramName(metadata->iFileName) ; } p.iTimeOfPublish = metadata->iTimeOfPublish ; iController->model().lock() ; iController->model().tclModel().locallyStoreTclProgram(p) ; iController->model().unlock() ; } } delete metadata ; if ( netRequestStarted ) { iController-> userInterfaceAction ( MController::DisplayProgressDialog, KNullHash , KNullHash ) ; } } Hash AttachmentListDialog::tryFindNodeByProfile(const Hash& aProfileFingerPrint, MController& aController) { Hash retval ; Profile *recipientProfile (NULL) ; if ( ( recipientProfile = aController.model().profileModel().profileByFingerPrint(aProfileFingerPrint, false/* do not emit encryption errors*/, true /* omit image */) ) != NULL ) { if ( recipientProfile->iNodeOfProfile ) { retval = recipientProfile->iNodeOfProfile->nodeFingerPrint() ; } delete recipientProfile ; } return retval ; } void AttachmentListDialog::infoButtonClicked() { QLOG_STR("AttachmentListDialog::infoButtonClicked") ; BinaryFile* metadata (NULL); iController->model().lock() ; if ( iListingModel ) { Hash fingerPrint ; foreach(const QModelIndex &index, ui.fileListView->selectionModel()->selectedIndexes()) { fingerPrint.fromString((const unsigned char *)(qPrintable(iListingModel->data(index,Qt::ToolTipRole).toString()))); break ; } if ( fingerPrint != KNullHash ) { // aye, found a selected fingerprint; first check if we have // the file or just know the fingerprint. both are possible. if ( ( metadata = iController->model().binaryFileModel().binaryFileByFingerPrint(fingerPrint) ) == NULL ) { // got no file, ask it to be retrieved: NetworkRequestExecutor::NetworkRequestQueueItem req ; req.iRequestType = RequestForBinaryBlob ; req.iRequestedItem = fingerPrint ; req.iState = NetworkRequestExecutor::NewRequest ; req.iMaxNumberOfItems = 1 ; // if the file was shared by some other operator, // ask node of that operator first .. who was the operator? if (iNodeToTryForRetrieval != KNullHash ) { req.iDestinationNode = iNodeToTryForRetrieval; } iController->startRetrievingContent(req,true,BinaryBlob) ; } } } iController->model().unlock() ; if ( metadata ) { iController->displayFileInfoOnUi(*metadata) ; delete metadata ; } } classified-ads-0.13/ui/attachmentlistdialog.h000066400000000000000000000072421331670245300213130ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef LIST_ATTACHMENTS_DIALOG_H #define LIST_ATTACHMENTS_DIALOG_H #include "dialogbase.h" #include "../mcontroller.h" #include "../ui_attachmentListDialog.h" class BinaryFileListingModel ; class Hash ; class Profile ; class QAction ; /** * @brief class for dialog for listing (attached) files */ class AttachmentListDialog : public DialogBase { Q_OBJECT public: /** * Constructor. * @param aParent parent widget * @param aController application controller * @param aSelectedProfile operator profile currently open on application * @param aFilesToDisplay list of hashes that are supposed to be found * from table of binary blobs * @param aNodeToTryForRetrieval In case the selected file is not * found from local db table, this is * the node where query for missing file * could be first sent, in addition to nodes * determined by the binary blob hash. * Use-case for this is CA attachment where * the posting-node is known from CA metadata. * If we don't have the binary blob, we * could first send query about attachment * to the originating node. */ AttachmentListDialog(QWidget *aParent, MController* aController, Profile& aSelectedProfile, QList& aFilesToDisplay, const Hash& aNodeToTryForRetrieval = KNullHash ); /** destructor */ ~AttachmentListDialog(); /** * Method that tries to find node fingerprint by profile. This is * used to find original posting node of binary attachments * that are associated with many objects (ca, privmsg etc.) * @param aProfileFingerPrint fingerprint of profile whose node is sought for * @param aController application controller. * @return node hash or KNullHash if nothing found */ static Hash tryFindNodeByProfile(const Hash& aProfileFingerPrint, MController& aController); private slots: void okButtonClicked() ; void cancelButtonClicked() ; void infoButtonClicked() ; /**< file information button clicked */ void fileListDoubleClicked(const QModelIndex& aIndex); void exportSharedFile() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: // members Ui_attachmentListDialog ui ; BinaryFileListingModel* iListingModel ; QAction* iExportSharedFileAction ; /**< context-menu action for saving to filesystem a shared file */ const Hash iNodeToTryForRetrieval ; }; #endif classified-ads-0.13/ui/beep.rawopus000066400000000000000000000115031331670245300172660ustar00rootroot00000000000000nрчД?pЖ^uћBОtызЭНЫˆщЦєЋUЈ”Р1†уa™ЧЯЃ_IFЗОО­œуі1ЁŠЄ?ЦrКAфۘ'DПЋœИрАИ*e\Kі,Ф|E0йЏб0эj Ї9а“њZш L„tєœ “JMs Љc‡d;ЉЭ E9§'їЛƒшА#K?Oюэ WМВR7Ћ2цMlЈё^ёў%ХЌ\_WзДЕc-4э:}Q4а mЅ$>Ъdј7€Xш L„tєœ4р›>њCМ>‚’]ь# ѕmUў WП{КљПП„у!нA ъS`\ш L„tєœ4р№Bš н'эП дЅ„DУm rЧ№чяФ‰(qЈИбPcf\Aшь@wх5 џ#ќЌш aoлwгgcЦPDuВŸК(Ю&`їХЖ>C{С…K"0n4M. (%x+8иА`cuш L„tя *HsЇа‘PО.1як@Ыl#й3ЃVк т'ОT ƒ"Ÿ%жЛк ф<X~ТЇLEњљ;їUЇj{46]юЯxюrЫєoЎ<юОSEkИgфHymRзсH{™Gr˜V™€tш L„tя *Wѓ*Ф:zKц /зљюЋY‘…?ЂœHCnў4~ЫаЂЫ(мЈžДќЇ№k†я&wЩѓB‰PAˆЗІцRTZ€ СV<ЬЋ†Jg@л"ЫИJEњ\$žUfxˆЭšќYЯ{{џFtш L„tя *WRў1ЋпЊB& ејŽ>vE;T1ОjВн;Ы6kˆ5ГКСќ’„ж‹ЫKЯЁ“Bэш§ёиBЧxьO'OчBЊ ЅJ'ѓ‡шmѓлђ4љdњYbзGГ р[M$ŽwN9Ш;щіrш L„tя *Og>к nЁпуŽ0KA—сЧкE‰Ѓ‹Щ іЯЙsфЖ‡(|љН|Г@jЈ§kNу•hў0њмЗ:+4B,”ЫBvаЌ*О08dQ(ПЅh”оЏќ[Д~ u!ЌЫwЉŠX“Ѓ›В[sш L„tя *HЇхK™XUŒ4c};сZ|”‡™ ЙŠхq4—ПЄlŠе‚Ÿг;k>ˆлЁb^7F EЬžХэ№ ^Є7щЭ№% 6‹ЛhглмСуŽ„6…1С@ЇБэ8'gЦЮ URЛV8TyАtш L„tя *HЯЖ­Аg^.ЛG$ IšDнšˆ"™Т’rё™@§ z?%^oз~ЃД=Šs“P+ёшQћ,*aтЄE[mˆгВŠˆміA7ЦРЪЏ Ќ/ЇE=Dшiя­"=сЋџSЕxƒ’ ъuш L„tя *P f< %Лй/ш2„SєЕШоOlёА04!.”БàбИnЛSмдwwПL УѕеЊї˜oаpEД9`n м8ьO<Э%6Т”-€:ќ-*>n’’Œ$zyє;ь­Їџy rш L„tя *P‚ё…PоzwAЃ<­ЫыКvlkКtSˆn=iЫ“‚~р™NЖBТШB@ёWНпЂђКћкFЪœљћjNиХРpћb8ЊУўђускQŸ`бЮ6љ§мOџтdХРч™PьuUсЂ€)Œ fуІІ‰‹d?хЋ•$љ з’mVШЁрMИ}`’zЉБ‘p>n+[Г|БQ\…€ъ­О“ЏuwIАћ>ЃРюКыIнI|…9‚§’ћЏ€ѓж€юКэк“UБ“‘џЋ ‚ЗљВ@юКы6Ј-Г!ШЪKхETg`ЬюЛnѕ е‰Ђ™Я'Ь€юЛIрЧfUш 8Т ВрЁЎ. ŸяЂvм$ЧЛ‚Š€Е:ы64лЏу“Ьz:ЂD>РЕ:ыRСв/ ŽvЧEЦИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвИ,УŒи зЖНвclassified-ads-0.13/ui/bow.rawopus000066400000000000000000000755451331670245300171620ustar00rootroot00000000000000t+ ЌLхhО "q`Ий8Aчиє&- )fоъЈЦпЮПSGЌ†Bi[T†7нтSі’цЃMЪ jƒO4ЭŒщё‹+?фДDвЯœЖЋ…бф0`ЂЦ­Х|ыE˜Э‡шВI PьЃ‰ЋkїУъ0Щxпцх0юpЖРo0NP*єŸŒЬOА20ц*kyщшYЖ_Чё(р"„ZчcФ0!Ы|ЁIЇнЇšWЈG2%Й 3шЧЬ;•ЗŽbЎтКUРБt<даЗН=Ѕ"Š lm~z8ёLt…gzюœќЈCЖ}u0Nё0й_ˆЯ™Яnѕщi1jќЩ— Єч ‰С~‡н1 I‚ ДуМPЦ ѕлm”ЏRTŒTоиЁЇ›FіЏ`І’О,RИAњя§џ/jШUЏ7УpGџLWIq#фВыЊ&Kd ў#ПЎP„ 0MкђpўіMЬEcО?яCъ”]–hK&T *ћ…†tІЦ˜@Ё0ОШyєg`ЇД<ХX][сEi‰ЮцP ?+ЅlшўmмПу2„'ФBќ|nЌžёъrьР9ЛЊ6К“РўлЇ Мў 3ъ)‹LЖЛZBw`<эѓЋyКљюц0№ІцВ@щлќhЁŸ#ДоДrПЊєt™"жЮ0HръwмкVCгdІj>Ьў7Xˆl§ЧјЂЖPcїР1ъ Ÿ uэъd‚Щ3Є|tкЬЛГ}fЊG><џŒчижУ~ЎШїэ™^v{љпЬтоxЋfe ЖУЧOО,€&Фz˜§иЭ›…Ы6ўGшBф(˜ўоы:xЏ“ёN0Ч§bєВм*[Ъ#ˆšчЙЖ^іLфЫx>ъьЌ6Ёжь}D‰ˆiЈ хv[˜u)3:mFАi{MИаєЂЮqГЯv,YBœLEќz BИwiIu>мК—Ё0z!3`‚.ЛV;`rЁЎjЋ%кnО[†b S2œЉ\ѕ{лЄ8>Wž0‡,ѕ ЮˆPАК”)†š&oАбдƒвФ‘Н?-’;>v€‰шЇїГџсАШRИ_№МіЪL1сHГOwзщОпY*Š#œљlыШфдЇтf‘ЅВh­Бзr§'ш|бd\’–“rК:;“H:Sш–Y€Oрй”Nш qM”сч˜+LRUЃМ}š„яч4yDž­ vљ9Ў@ЕЬЅЛЪ::с…щ™=? Е€Фe З—Мј]Мї<ЬZЄ0kJХЭІEееп‘рeK=€D:‘›kКДдŸXРЌљ БуЬ9ЉЬ€`ІЉ*‹‡3мv­Ђ™в.мёhвиK‘$”(ЮfŒкГКЙїУO‘Яч™œŸаїmГ—јHVЈŸžЬЗОЃ’в…щ9RЮдL<˜Ј\ы5ДО>t4мœOиг]Еl н~Б+џЭЇD5х‡(!gXу щн^d4xЃкE(‹B лЭ7“нПpd­пЕђ`0YрљUЏЉoЪx…5ЪцЋРLA“`WcЅ( )ƒ‡Rяэi46ЦQЂѕѓGВг€ГТŒЎHхXыЉЖ 1˜Ÿ?O€ЏыЅТyWэо%Ш№‡OдрPфjd0c8…P;<т EMКTщ&Ѓ2{к ЗКФМ№1‘Мsћо@€П„ц–аFuZ„7№”H@Э!њ9YoћцЉŠЎ&o‡7?b7[О•tЖъв8"Ќ{Ѓ hjц€ _зХ‰)”Аюеќ1SbzdBHM~И(kЫYОгrъђќБЇmaР‹˜f…кЇ‘2РюvЗЯєYЃ2ЫBЉтУэ{“–;е('иЂM тŽwHkм@є?FЕѓЌП _W‰S‹tћф†Ћa­a‚d$“|РIHцT>2ьЕЊxМЎ•хгћо\(Ъ8ЋQ|ТЈ ТФьД7‹ІгЋ(БаKњюŸŠT5K)KР*№|КЌъ?Ф‚]52я‚ђнO"­ЃG;lk:KVBЦљќfѓQ6фБ1EхЮŒЪ.!{cћŸ‚x7Ђетнь GщtЏzkЁœ˜ВэАK;№€ю8л–QКоdЁяЁ=[ВadАрм\‹­C Язк;ъ‹18ў” ёЃY)Tј3Уh‰y|В`Єy9Ї€фвБjшrЉ[œ_Ša jШ™Э БдЋеJ&ph™щЖu9WѕќNj”YМ#8Tc›Jц2nЭнЪТvћсЉљ”(yXbКq3 †z5ЦЛ… eК D:9fG?Ÿ€Т 7жЅDЈ{ЧкCє”yЁЊэ|ЊИ$ЯжЁЦs‚•mВч^†Š&aАДt™„ыъјBCTѓiиРёЎІQИ> вIіN}U%–B"†ШВ4o9ДД(žвЕЌYЮв‹Сflр О†ЂЫУ&Кз(ЦК7Xиm"(%žь,XП‡1S„›ЦјД|х|šCяO* -њћz:d--гфkСС,ћ;цP щјˆтcLEх+ƒћ”L†И ы{ГŽјъ2(:ѓ д80яQї ƒJъmЫИri‰љЮu_Ц}6ЄAn  РŒ‘7аSњуgKDIЏ_*шё4пzUSЛ4щЪ"[œ!ЃP•нѕ—()1gаФ4~{M?8žРъ›u>А–яI9J‡š’Ј‹ЅLb‘ˆИXŸ “пrt{э„NъyЈЏDs–?К&ўѕqгнЈъѕ%2llэs3ЎЪ=gЄ\RД п}ШKzЏўЗiфЧnтч ‚2Тфc‹2щаѕP 4яœ –ЋZІчэ ыsб4CpТЛ—~Fъыфг6СC(ч­ПXр7ФЏ Žй>€ЇlvИ§^|ЂnK…ŸBM:Ѕ“У\oс;њ•HИЕ-DМИXю0ŒэЅOвД3еeЯ.lH—IR€$СЇьwЕф ,д|вD ,hF‚шNє__Ј0Dk2&CпУvЖ;\7r-:EЩС•€Т“џ=ILЪ - L{e{аGЮdИ7jЧ‡уЗЈџSДЪў?оbј!‡№хсЃуJцuœ]JР‡ЛЫО6JЄ™ќˆ|˜}yZё]ЩкЎsЎс7€я*№аPБŸЋu†шяЧЬLєфЫЏЎ)Сœ1K=лLЈьe\=-ЙњФX2ьeжс6ѓ*Х•žЫ…p"4ТіZŸfžёlіˆ@tж‰ђuћх”Xђјvќv?ИP‘ЅKИђY1jФќ‹яЖчi@ЭЊ€Иљ›n3№+|ѓ#9z—Ѕ ЛЅm 0щrЎ‚T†pжЃЯGаŒ§Td2Ѕtc‚ЋvЅё*8яЉ"9ˆ­”Ш\эXŽ>”…=sJЇTЋъОнSaPІь†ъёМмаšhтЈ…/QeЙMлђЭ;W™їNФЛФЈЉ§VCwИcL: фНО*СшU^$\Зk4ѓ;ДPi/аEЁˆM"tЇ“qЛб­Щ2НќВ3К+џ3];+С-+? fhУi…їFПˆЉЦ…ф!ЃнŽE~8м|jIЋкЛвц)УВЭ;Зi9E› YЭћЄ#нŸКVqуіAјпЊ;\xTœЃьƒx}H^@лI7в>j Ї: ;ЊБPa3Ѕ™ ќѓlћ–M шsDn&0@{СмдM‘Џрt3ЬџЂЎ^.q]gиёcвuѓ-ЂKч‰@С’q# wтјлз0УQ^PЖ{(Sжя&уH‡хљрм>;Ћ> Ю–§$u€S}фЏ8x=†И‘n№?Юл этP-bіЋђ Кs1м[У?šьђШœТ”К.“N*fЕXўйыNtxRйЁB‚rэr˜28{cГѓ(­.Г­>“ AЗИJсЪ€K„мЪt#УэуH‰кбž ц*{‘I;AfЂDйумуХЁ[&JœП-на ]njдё‰ІчyŸfСžШ№ЄUP2жМŠўшOЌzЇП”д‰ТІ$8nјT2P}ˆ$ИэGBс]ЕЌ8VУRЌWяъНтфЙ-ЇvžёЇˆu K=Де/†В­З ЖŸ0GМD§ѕƒ7 dЛђлŒryіђIЂ9MVžU%ЙщНWА˜`цъ!…Иm~dЄтЗ1„"==сЫДХUгЩ3ј"ѕЁXшя1Ф~євš„У6}И2дxКG$=3ф_чšQЅnGс[@™эHГ…(#zЖІjйёa}„й§РaаЈк3Wy.РЁФ<Њј„ЗрІч Г ПBПЧ%ДEЅ 6{ћџH "AQ`*џкзЉSЙ'eYь76%іЧL]R4ОМђ›4Ая—DбQїP`ПЃH 'НG‡ў“Ў{tиЪЬJ>*zIнзў&Ьфњ3KVSы†§”|Т4 ‹‚1†­o‘эG8rЌр-ыi1dXŽdЛpЙ]гoдЕиƒЏ$щAкўЏTuоЦ№K˜=Ы{E}њосNЧF<МікЫІ?}–> хIтхЫM&B>ЃА™]пјнЭUы„РЛ Є~ 1|Yбi™ЃЫђŠbX$Hѕ–ч *k[ьYа„хhє<А}еЌ1и~Œ^ЏuFЃ24yŠѓ урХс•ШADiЪ PегNС)(еvе(ЈЉ†Ь "пBwIRyјІ1h E=їnщŽ‹UЋьчDЊРEАˆaЋBЄ „Щ3!MœX-ЧœюПƒLГЊЯЯGc/WQъЮ>zh.џп+.€LE}€ŠъпЧђ€ƒhfјZP›L`Ш’ –|P%д юvЯž%М–њXЕ[@ЂSœ†Б„&IќF њ?EhыГXкNpў6Шїх>r`їŸтH…1Шс”€ЫeѕZœVs!ьd3сН;b[_е@{іO,Ьїїлv‰ЫіМLЈжAЙ•хhjІх$2ƒЅ€rьйЄнЇЃ‚шкWœЌЧЭ!НїЗBcИЃQQЇХ/йy(бЊУ№ €еs •ОинaЇYќЧЗіL5ъ%>˜LЭуQiL hч pEБ№лs re›s™іgпmv–MAZб•f\ЁџhwмЖт_$гЎx"Š]щGфр†эœУєU тDиYм‹Ж/уїдЈ|сФœ` ГНХѓОЛM8oы9Gе<ХХ 2sШтk=qЂ;šЬ~ №`%Доs{d@i+ЗуˆA:чJя• 3']х͘r§ћl=ВNкLє˜ЈŸП§0ќДаL^юЭbрЖћйо`?yЪРЎЭPMГу1˜ЖЅгЙаrъеьЎЗ0}i„ЉŠ#™FйнП ѕ’zЪюUЇG­FУхНРFєк†UТl/‰Ц~QчЄxАаХїœў§-_Й;ёьщ=Ше6ѓПкK’Aуu˜їIHфЪ3Q\І:|pj Ј k{ђєрЛ!ИTЂE uъШшћёŠтьЛЬќZвЮЖCљxLѓыŒŽ€A'єН>ЕоL‹§3N3ћУTo­u˜gТgn‚OйgnWЋ$…ЉCуiщ(4мQ: LbŒIдЈiЈлр!вЕ"|ф2†БV—qˆ+<`S_8W{ъШц)20+ˆГЦ@ и„9‚фђX–Ш#б"ВЩ%nе$љгРкcІ~дО0Š<–Г„ ``ЧчБ/<ŠtН+ћн%-’ДЧЪ=ёXo{uœCƒNwи}E76ж~Pы†Qp…U&+бЛ7єгзЁјœƒ€zъеwEБх‡RУчŽЄ@D†œмvl(ћFчMiкорџ№$џєЊ^Х]"а`кўmШхž&№Sе)V“ЧЄ~iTеyжЭZmн­јQ‹J…в,/c ЬsKHœ6MОHbфЎdLF ]7њщbюЫё=„Ъ чЛЕНхАTŒы8Al~ЙбjЦф|љa 9uн№кkЏ­xмPтгKДXєѕƒЯНр ђ9›)DЇ7юНž†‚ˆeьqЎušPсАУŽюФя™мйCsУПнЫ*фУ€,ћ}юѕЮ‘œŸžsЪ4)h)‹—Е‘GС‰зŽжЉќДТ5–рXŽžДfі”хЈОЉ6Vd5икаИыэР“"З“M6'ОЁH C|ybФн2JУ 8ЋыЕьІќќT­ \<ŽЏН&i‘06!d$vЫЪѕ@q# с’€ЅН^ѕŒžžX[_YуЂ’аM—I]R3х#a П—+Ј_§ЕŽ~Ћ1я]pсgдЉvУEїU Ў€x[Ш|иСœЖ•x*зIЕ*Ÿ ~о‹Т3§тr!oO&tЂј[ВШˆГХпфycŸ.ДєPвМkџ-м”Ю#RеNёe–Ї‰їO/CПNMЩO ЧРЛЭ,Увџ4ЖRЙз€ƒЋq = }ЪЇЫ–7У+ъ6Й™{и:pШ5ЃІІФ>I8ю4иыкg6Nvƒq2ОeNЙf-ŽІ ъћ..@ЕъpЅЇg0їўjє&`‚ћФXпŒoыйGп+W8+‹5ЛŒмiДФI№’ ЄnCКч1ЦМа7zГр–Ъ3ЂЊŠиИ/М5аCAє`ю‡Qm@Aф–Уї~fР С~L-c–ў‘ў%"+“ѕ№œЄ'o7PsЏŒ]a*_ЛрКЌ!k о.нЗЏŠТк>Є‹!c’`аыBœ˜юх‚Ku ѓBjšdѕ‰#2”, БЩxпЪ!2єƒAJлBЂюOІњф>ЌЃш фЎШО+ШS2ЌEЈ.lђ•u …]ДЄБ м|Š X; _љѓМCBЅУ–9ƒˆGѓВn ’ДцімлPл/сЫaд;Я ˆы5–YНик;Њ‚om8єРЕвљўŒ[4D%а3BS–ћj}4—|Œ…<…>ЉWaNчPŸNыnЯЮŠPs‘зЃЯ€”еHŽІюh<“ž_XГЖOšьсo”›r ЈЩvŽgиЄЈпA5жWгЏk9Х2_ЭPмхD_0ыf№Г`†ыAJ џТћkZ' t Pђл@{P\}Њ"$•СDuд­7ш&;I8јq\‡GДЂhЭВ,f№Ю,љ_}4|ZЇЁŸgМ+eKдр4ƒi)Ъ0W…ЪњD•5Ц>KOLћRы}Ы"ŸrLж˜/ –юсжЇ"œe™hЅ;ЇЏдœ`1ˆы5•Ь}]0=j8уЖѓЪ|kтЩоюќБЎЧКyЭ[п…cЅчQћКљƒ:|є-šY ZR‰rЈрKla]ЭјwQ]y7в6Ьзƒ1›Ј‘aц[šlДгжy—Ј0оNаLшІKх2ЧИ}ЅDs”ьN’Ј:žъCF|ЯјРТьЗ„S9В ЦГГњЩX{Oђ›;g8Nчы„“žЂПтЂ:­єЪBЅŸ‘тцчхШЕ%9ЩU2Iеь&‚„о“ДЩ‘ i5Њ ”–НBG ч+лОьЏц‰РП*ћ`,1јРнRЪ+vІT!ѓјKKш?B˜9]D%ШмЇ_\wев#dh{ОB•Щяё"sM;%.zнj_XЗšЉ2бЦ“iuйБ$S"йф+кЧє“Ьˆ–їК=Žэјљ)š€Šш 6Ž9ќušс…ўЩvкђTœlгC—ЙуЋm[?Љ (3ŽЦlРLџИл/€Чл 2^&бѓœЮОg №аЕЄ‹мfvIcх:…A~qЩBж} CљuƒZдъя„ѓDЊo€юцЕ!оц2{ь "Š}<І* –™.И|+} q/Сбn-т{киXV&“щAJТт#ес.–нsШМ’p7',Іenз!ѕБyњ5HVГFыц>цA9ЂД^Ц>ЁxS мvЮ‘oЌHЊˆaњmг b№‚€‰I|šОКх %щ­іЈ`6јю>@ЎџЄнчВЮцо-KЩŒ5С†ДжM"rЙ–LЁ0Сm“)QаЖ–­мЪZ”Г рŽшёХоLџKЅЏ}]œ(ƒFA‚‚!QЎ|n8 Лq‘Wiџ6+v”k™1ъ)Уђ{hК@m^6œy9šp№5PЯт™Б›sЮвЋІ‹Ц~ŸˆІ;Б№DВŸ•ЬРyЯ8“WгsцЃ‚Ттѓ4цФŸ‹4N\nех`MЇзxЋ@й*+иЫжЙпиЎzгŒР„щKџКтЙї TрЩщ`œ8мAсmš­Ѕ"‘кŠдН4ИxНЊie.ЗтБн—`LМ`LНлmouo:ŽkШOќЕ–†?И5цазЖ€ˆщеW~щ@ №КŽ‘0Ўј\д‚/ˆЖБЖы 8фcЯF;_PџоyRЦKЄSф@QKФ0A4:Нъъœ^іˆЮ<ХtдW•gфоx&–%›€Ш‚rЄl=‚eы7…pэ!CЯzsЪУэТkі‡ЬІГ№a ѕ€~DШ%…Ў‘Ј0‰щA9ЅбƒОЦ}д™eѓ.іЊVŠЭНrЕКЩ…РоМьaпэU‰Ф”$VТ?ЃПŠЭШ§dМъ4 ЇЦx['5мА<Л2ЃнYйŠV,“hЙ0jЋУ<>^hŽГ:ОGЛО4j–%ьXѕ1х?<ЖQ†я“ƒ@6ІVЂ;,&z“рr *В+ŠЮужB2 ‹_(Цу›ч]Ÿє‡šQъ j4ыEƒqЦ6 —nмЊтш;ЈAxH€œnсн{%oьє‰“RАaiоH~UlBW|АўгP4! !BQ@“ŒXxmв%3АИHЦзAЙZ*w3oŸ‰Б Жгё[эА‘‹Љб“0щ_ЄыоВ‘]}ёo>чъƒ…jŽъ—xcіaFЎ(ємЮD/рBе€œ7хŽ•j>^[№daЅ=~беА"— ГL§йБЩіhї;’Еќš€] і*Ш<ѓиЦV“VјјOЌQvЙо#.бo5Нєњž8ˆкŒЉЩWyеHц7В t6 ёŽNcLŠщќŠѓж@шAZ&F'…0ъ№Wй|ЅpŒГxCwљ„J&џ[•ЈTЃ9Ш2РiUršo˜ яМUЄGЪ]Gng#­­!'˜зќK’КUБжё быx4[•{ѓ'ѕHOл—ˆКa`CЬ‡ЭЩ…ЂЗТƒэx SoбPISnеTИuЎТЁœ)5Ёщя…[ЖмrjАФhnMўч•Š„GVЅ7„nfv&o’ 7x=УИEЇ—Ib6с.щ>А8ibоэlЏСМџмХ Y _†ЌДРK“яШ6>?ŸџƒУGŠ1ƒmЗП$44чo^d@~;нбˆ8ЅАОtХQ0з ЂТХлЬ8•iВя%;ЅиœЙВЮ>БЅ­!_@чЧlКыE1 …iА•АёЈ1ёRРZ/ЈЪ5Д…oІŒШ—чkА“ъЗкeИв\ЦѕЊЧ7‚Ом|'цтќдљ%ћ žћцN{ЙQВЂизСј\вLf mНxчв@S#po‚H9Є+ЈšO!­ єэ kЃjБn0/ю,ы``‰4/ыuДxIcЂwU“Ф;+ж:ЯSD9д-#?ЁьpДZі-39\ЛщMЛк‘у™ЪœЙ E€pъеvц`є8TWЭ@*jO‡Ўkљ€c+•~RЋJЇFЋјїdE йE›%Џ}Щ(ŒLЉCRяИK ДrJџ]фrJwСы|$8ЫАрЂЕрІХk}ЧЧЌЂsОФx‘–0“цБяO,gЫ0O  wы5•ŠВИˆeNfЫNѓxžŽъ—кЧЛš64mZ|Р`zŠm~k›VТ§‡n—–J˜ъШШщбСэ!цЁž\§йм|‘єЙzГЉ…бЃтsеm,эr1]єєYЖЋћƒ#Ѕšбк,œL aŠН…Љ&!а“jЌ „ыB›OЗЯЯЮџђWћгZpy~…/ €6…U@ŸyТлEц5і 3Ш”"˜т‹чRуТЪœАq' рц"mЈ Н>‘†хЏСђЪх§ќБУї YВ№\РЦЧЎMrws)–4a‘ бяˆ ‚њs%ЋГБпц•Х ^тЙ‹ЏŒЋgз&чЎw€ыB›OЗЯЯС_bйљУ&п<жЅxајnЗe”СшŽьg+jI ?%ёЖ ˆZГРF Р+–€yQѕѕ УПгЈ…№@~ ДK$A3кх§;,Ј.mЈќЇ#9c]qжs>ўАў]d}š3ЙкOЙнsч5WГxnыЎтЪЈœ k”АE“sэoR­KLіXЖ‚уаhВобъ2ъ&ІŸ_тЪЌt‰h[˜rыB›) љ1з‚ЌёMЏ%Ўƒ- и@п—CпLт?в х`еHаn˜W= `’ў*~ЂcТ0.,Ёшys№лўо"ч~D 09TхЇљМО hї С›ч‘ їšџц§Р+ чљSа›ѓœZСвt!dZНV†ЯSЏмђe{.%.№П{юђяЌьZЁ,гы‘V1Ї„В)F)p#зЖЁдSGтgЕOkў*QС›ёюЂv.r}МШ_Гѕxїш ЉSЇNХІMЏ=žі…<еВђ„ЭEƒR_!ЯяЙџ?RRЬ“уЉШрxIн<нGeOhšr{7Šx…MO—rDнЖGy d‹G X`ІW2hЕZ. р ц*Yg Уя%љc; MA9хB!ZXѕb&фЁьв‹'‡РG•ЃUо#У`ЧФ(gтdцпAсОФCаŒъ‰БћКТ–pЪ„іЪƒ М9JiwхўяћMц\ŒјЂиіУŠз!З‡ž|Ђ ПсЯрˆх18ABBітНpXfоћЛDllКkзUЪ­+ LZ?.є Ѓ5Ÿ.lєиHHkD-…ПM0DзЙі!ќІ‡9D™G/ O€šьє —аШqЃyєtў8б'f€S1ц4э\:Ѕ/СpеПBюXЗ8А—ТBдќTувagФѕf9 ^ЫфLїЈ#r2UpcŒН Fя—•Ьg(c\%ˆЪєZЅŽsг;‚ЦCuёшŒнkC КI’KkEkкћ]еj‰GУh z­:„=]ЇэьZˆYe\x/\>"хм‰|>ЏэT-jнnMІ1’uЕЇ)Э˜@\Иƒh“pe—)fСrRMHРЏ“Э5‡Ѓн&X”:JЫќl4BŒ"W:T0RЩЛXІ>+м–ЋŒы%1uюпщ*9*чb{rsKKfpW‡Ÿ“oЋжеz/Ϙ_Yuъ|шќўnb ЊІ<ЎЫtш№Љ‹аЕm‡ђAЩNмsdЫ’P—эsдMЦrŠ Ў‚яОcдugdЂЄ—– ŠQЈ–ЎбJкЏrуŒu]ј fšяЗОглœЯ!sкqўš ЂЛїмVZАђАxѓ,;ис“ЁO™ƒ4 ”FЙпt”1УЗЌ•YX}бaL™ЃK{1х•шƒ%‰”мДJиbэ‹ ЯБ™б 2ЋИФА•э/ЊЪМ™Охнv4иbЃUЌŒDчАоЎИNг=.ъЮФСWtзЊЃчPЈ†BT6o$b!OА:eš,koЂљ!…Ы%ђК№ г;ф/ y/Й іЙj…Г& ф„‰VxT9ќ.+:тЌТКЧьЕnlzЖдИЮ;WuУ[?SФ…nэcпp<…‹8хsјОšьѓГRrhУƒœ ,3b%Ьо>ъnЇН wа:’YѓБ•Г›Ф‚Ÿjj“]ˆ]5EЬЁsnfLЕ‰ЌюSо Y#Єн‡=№%ŠЋ,Я†Xл}^~В"н‡П8dhф9dlo=1њКqю“ШсџОŽрЧЇМ8’Г…R ž{•ЖNё,ц н?F„JЌ}$5˜ЧoŒ“ь6Ѕ~NˆІ\#ЪHр—|…ˆpб–уœхїФжЉb}4˜d3#АщЛБJаўоbХ8ЩЉдх)Ѕd›уiиDгЬУНQ œ%лкs +'TXЧь4,UQpЦ‰wѕ@Ъ0Eом^‡ŒMТg7Є"ЄНZ|З‘З*†Ѕ­Пu ЁІНyЃe 5Й­‡ЌЙ˜– ’Œ†eЩ\ЗNMЭo\єFƒЏ8BЃ6лѕD%ЛG(aэй,+1М юн]vч\6_зџ…JR+уs@miРЏ–7СqЬ’>х‘%ќŽц№VЦт6;ЧпTBX_о–- Mѕ™ЊŸ?gЦP~!k!<љ‚Ш ’нќуи}яг­№Чexх’"4жЁ+П~rЁгeњЃmгz‚8CGN,?§а![‚с4'YыюАažб>†&] Є#MіІ ’ V‚ѕцЙЅjі\Пяh^>КqЂpи’ЊЏu№ЁC5udК„щKJUwЗeїе”6БЫЛ[6kP(С&ŒйZWК 1шП БШ:,_ўцд*В\21ЃпXsџЅФjЕ‹ь&щН кaŠ3ЭŒљcЁ Ьж8Х=&ёЕŒ’2"ЯЬIђлІcОЦілVџЇ€ЃЌНв‚TятАE‡pjB"Њю}Р€щ`ЊД9;КїСj:ЦЛЏь2ќт6ZІЙ‘ДœSˆБп6ЕтAB*ОKД{ёmŒvGЯbіs6N,ФKц~ŽuЄc€~‰bЦ_`m$Щƒ9|бџ”oПшNh  W!Ыš(юхw=’wеСeвФTя]:а™„IRT c>Ч~щ’иI0эPМIYGp•N%НЃњ-`‡3љжЫw|^•Qѓ $yьёЯ ЧH` 0џ/P?Šб j(ьєFA Є **х•Ÿзѕ1D1‹ДyГЭZaC­?ЎЊxZј уŸ|9Vh ц^ŸAиœV‚%LЉ w!Ж†9X“њ]bО‡ŒlЪФЗЦ’2 v*Їьо,жФ1ЩџЙY)г#;[ѕ‡ŽЬ{тVs-QЅ‘љІ‚tІSне/ё Вd[wИŽYфiУhАд(ЅрџЫв_-І*R%˜Тc§ЦЛ[сYа6):єаxIЙjь§r№Uыœcн @Б2Ufl—lС&ЦТTяAоJЊЦ е ў˜ДЁ'%ќ[Ц%–Ћ "ˆBМІ(6#фnѓрш8Р~рbS?дЉRЦ™x\‘BD#šзѓ€YaTІЬЛP{™’ O3ьG–ЃїщмТb‰zfїЅџKВЊтI@v7б м\o§l!g8qХjM“=ѓ,/з?[жCЙщ’NеЂ#жо„_kWqxА гx4Я#О…“л ZО-хЩwляОЃБхБщœѓG&EќеВdЌ уO `ІЦ‰ŽСRЉЉш@ДЙЇя\7Jrѓhг–3 šэ~ћTYTм;жМщ9ЋПЪUW!ЎY/И gа€щ+hќб{E ЂvVЬЇЎ(цщŒ*FъЖzkWчЁ}ŸšІ;*еюНE§pољяМVђGп'м@А˜хxР™КЩг]Hq№QяЭЉ•О„хФЃњИi№KЦœ^+$…~Dфд%9Э- RoїѓѕЉ№…Uзэq,}Дˆ(~—0НyщœЯvR`эLЪ 'ћєрQъ%ЁчZ|бkВ–аўЅ$чВиђv3ф?W(PmІˆГB)9dэYGјT4Ё*Ѕqј:щ€>: ЊZ\Y])MgВ*йњyzDњYѕ ч VDјюXЁyъ$1ˆjт\фтdв[зyvТщCм\Q o)!ъqНІДaмBЄтЏъкЇМю їžЎЈg Ыt|у)9G*­ѓdTўЏ‹Р\lŒіEeЎМ№0Юkќ{cяћSІЪ8ќiъnls3ЧWnчд&kdцAUљuъЁЬ= •эvєЈtjt*SЅРМпШ59~ђ7Шѓяpoн`ќd‘Л“eB‘­х7гзВП,ŒЙRŒнj1Ж ЁМИФ./ѕxV8тдDљWСŒх‰!6ЩвŽяЫpбсѓ\П…ТИ^Эњбy?žыU)€Ž:ЃšŒ&ЄВ8œ.њЁАaZ%R7Вm5~;GpGюСйИQҘ“эЉ‚ФKx|т-_ZVdОхЕрЪ’Ъ6эѕе›ЌI_lDС*зxњ2ŽXФЂ+­йў>ŒзЌdЪA{6DCњ}(Е`ЁŒ—эЙј5 ‚ˆœnУЃ"Nя№јA!—LЌъ‚зŠ‡Š3„зq~ы‚оU‹Ю'ЦДsˆwуяЌ*–q6ЗІ;Д Џ ‹лП /йВ6a}SыSнФIюœБпжk4sЖќфТ0фiDї*IQЩHо  ˆ#$ЁŽqјсЙzіяЩ<"пVј=Sјx№+ЏЙY†e]5кхxЊэЗз‡i_'!j]ЫН $QчZ‰нѓ%ЉXБїn5PAУ#|ђtP3)џ*ЯWnšnvsЌп— И9 X"4 |Д eK~uОд8Mм’s›ŒЗ ІьЦЎЉŸ—Ь`Ж'ђЕŸ…ь 23ыЕ2рю[ˆзРœtИ”TLЋ]r”ЙвшхЈCn"„юx3ˆј BNLŸП„гM>”Б/Xё &ї№цO|Еm!о*УhЗк(щЛœgƒ­–ЬЃЯНђвЏ0ЅЋG™#М„у?П5„жЭ”hН*WТ 2њгуTMУO?$‘Й.уAЛЬќ#6јЄьв CьгЙ9wЖrю|>pЃ э ­ŽzR pљJˆЁ^bт !УQй5Ђ6нЊФнW`Оkr№Дй‰ёWб‘(œ DЛЈ8ЅO ™KM E!­Гx Щ)[Ћ>Uvxм 1,nа Уот—yХ4tBŠпvKШ‚^КїLАMУїѕkгхUчИnFя€–ЮѓP…sп!*(3[УгШъ'CgW­єзUŠœьпб#Д ІnЦXШ wlT~ @F…Я™ЖъбpЁ\fЏuЎ-<ії’ЈOФIМР "›;zM8‡зњЅ0 нљЪІыО—‡ЭиН†ї,d-рEќ>ђХIжбaGњБНlM0sf.Н™К8xk–!@љєcdkMjRцEіolœн ŽгRЮqNfTпœАр™ь”PJЬЋИ‘gц з=ƒx"oџ9яьП ЛЉ^ща“ЩНй1М%Wщ/юšhіp;–О+ж™“гж­№ЊIUG•њ™Ы8‘‡О+Žљ@ын'C^OЗ‘Ag  жxƒы—в–дНЎм TЈь1ўё8M’@кіyERИ/нŒKЅэЩ[пЃЌыЏ ШSxxg’ьѓч†йfKЫх"{MУЬЛ{чВW—ъ!эј8›{4ьІn2‹m‘f}iЅ<,Bсо0№˜аШШ‚•%–Ksё2ЊбэЉz-œ oФC3§ йЄ&PAmяИ`5ШзЈФчЦз\}7Ѓ/Е WmP–Кˆ*'‰ѓ&Ю:‰ДGo2OŒhџ_;;З@mыТ.›ьЭ6h3Вy/gюБЫ эп€эжIVƒ7с?ЪНoЭ1р.Ч‘Š@‚ЩœђhžЌ[дkkmн+ў3nМ2_ћbУ)ФABЩ9p†шЦ3 ™ZЇо€=dB­ѕиЋ2/еghчмUY#SyGМнEn?Gх}Њvє‹дыЉ7v‘к4„ИgBБгЪ_цЇ`ЩЪGз›Ђйw>˜ь„>ЭriLБ%+мщ[lё˜™oЫ”uпfђкx,),И*›Ž—У:А€Тz,ѓrј•Ќž6uŠI *сј–_[m|2(д"ЮНŽMaхќјзwІАQЮBЇё‡g2|]t2w'Дd:sLьЅ@*фz'šОZЦ•tb€qЪ7ј!Љџю№zР-1_J€‘ьзЩтІјьs‰М+,ХTX‘ib РpvђЊ 'RРrMЇdŠdм<;, л ЊТБ1УЎY•оЌЃb“cB~lЭхБЃгpaЫГQЯЬ7я€кЈ]Йt| ПБIRЮлMаrЮ{)dRŠй‘;+Цд—T2ц›ŒнВёŒs–№юi|hD‹•Œev5<uЬyNЉ”UaНќшлыЕ+dŒ™вВZlїс сE\›^—хЕіŠЎ<ъуцБ‹ˆЋЫ'…A$FЄЬpРССЧРcœ.є(ЭHHьƒЭ б$F)Eј @a6) ˆjLщнЅ˜A/LАъЄ"аPЦлhё|oomiьn{^{ђј]`'йyИЕХћС•ц4(сђ’œчїйљцъхЮvѕKFзД Ж„ 3Ђ’1>ЫщА6)šjчѓM3 ~њжяы!Fј`DяввЊioз#AКмчf% /H‚ч љ„)п”]ь{И“этбx88‹wž*&нR ЦёЉ‹hЖ/ќg™‡­єІ™|c=Zв­еVЯ–<хm†ddЗ;;F?VDЁXт`СbИПѕ$PЫ™ЦXc2#ЊНаUь{РЈх Е&‰іД ˜ ітbZ;§,еЫЂ0„.у­Щ>ЪІбЬЖЊЅXЧSрЬOkШod]‰OњŽ |ф09ЪlЪPТ ђaЛQћКЇЇ№Єѕ t[ьїˆг,U›Вяык№Fм И№ЈХЏЖPZŽˆњ\=Ж-wш›Ьљз,жt›ˆЅ.ЃR,ё 1я—HќпВ3hВPTq“ ЩŒ†%5ЭLЬm”Ъœч|`]ьjШП*sсЂЩy/јЕНЧ#Љ%эяr.6йvЮ§СєвЮЉKЎzn,ђ8Є eБжЄгС+ЋGsЅЎЕ§Qд'-RЕее‘бšќ‚}|`4йиxѕ.Gы>Рhь{ІZl” НhЩ№yw:ƒHЮюўджПˆ/{ЛhГАКжЗuХЯЗСiшIгaO+%xeg [Щee?frеfRМ›ЉЩЊ“ОЪљiЉЎ%>•˜ЖpT'?ЫМ€7Z_Ћ D‘_Д‘ž ž@~ьˆВИ.{ZЎyTк+хDRC“…\m&”uэД[Чє‡ЪЊѕG#ЕжzЯyџ№#ШeŒ"ЦДjЙЮшыЫ3ЋьўнpжMЭ™аИ?$cW§KN]$@њЩЮ™йПлъЦBX1ЃRюJЙ(hћГw'[xvЕц2ŸCмїЋьѕbИ.{ZЎ1hPŸЅ)[~= n8%цСp40‰œtЦ{_‰Y#жЧ–гdДЉФ‰вRcЊ%š6cУf.џSy7MFzВяРг ŒсЕ-|Ш]ІНбƒжм™ёѓмКˆ)ކьMсn ШФБ(Э€ф_8Mob|€Э\b.ё8”Я+5§хїчR оъЉAўДкБђњN_1нЉ#ў”+'€Кэ{‹BЗ?Ѕ)fЈ!нлЏ!ъ%їБ0ГйеŒЯкп2ЛEч$Jі‹S&\ИЈ ‘OVU .5цк#“)gк6 zАл38ИН§нy*Нtє] ќєЩш,ЫAўпЏrAЁaрЇыF™ж…AРaрЬŸгIIїё-ЅY“_љ’г`уrњ\ зес[ІКюS€sРЎ0ЂНtvБ'\ уqЬЪђюЄ Б%:DЖYЙŽЪ!M…"ДCЏ eg УzkПЏЈi J7ШwdЦ\™J2ЈЙЦр†ы9Мщы§ъў%Н"џYsУt*`6MSjAЛ!—6Б˜ЧД6А<ЛЧ0bІ\ЎЩ“Ž]’.ЉvЉШj+ и_"є4ш6ё<им‰ёВЦŸQЕ­Є9sжPЦyр€&сˆт­мt<чЙЉYг/;Ш0]Ѓ„љw4ZЫŒ„ы@ЮŸwЎ’ъУІРIJџyєьFїUх‹лЭц3lJЩt1œp АT!LFэЪФ—Хn@ћЦмюEf?лТшрПf< _Е!K˜x*Зє•ќУЃзYдШщВ8 U+эE!6Гџ„Ё(жТ@Кщs›ђvдs§ “Ћiи-јёЗьhы?уvЇ[FJ8ZOœ№-ЄУPжўПЧ”Г“ŒF„^гІƒŽНc)’aїчb†ЄЕ/8t"ќbфŠ’EмЖуzЋъЧ:aACеЯојЋWQ%ўЉі!Пfuџ… ђз‘м%ŒъбwК&œqыAHГ0IмGѓ‹š№хёшу‘Д›Љ-АНвЈ(KKбЋVƒv^й`1бпІ3zыф†тЬ.G9PhсVКЙz”0СtR+Џr&ЖDъЁВ+>ИьiŠэ!Кё|fзYж53.Ш,њ‰ uы?/ѕ•=$А‹м5-И!аВ9[ьц8˜Мэќ.зЁЈkђcCмѕЅq~(PќaЉ%bШтдз“VвœтЁr’o„E’ipŸё9~іW;#ўю}Jі‡Ј' ‹i€_ЫШз“|eAСzlaФ2ФR4 €‹ы?0@,XX“qП&Fji­QѕGUH.#IЏ!ЇфХппЪЖcoхHRˆЈyŽJ(dл$^2?BqзМhл`~ ђ\9ЅT2eL_ГН…<Є9ІŠ&оnHє|1§Єс№b.јЄ]О ќуv>ћъўйŸ"‡Vп‚_ б/nУ8тАu$ЛьЋРх7…,§ЁћЯ Л\эЎ іv ЗŠBIdu*дчЭсb їЯHЌЮ{‹ؘ[ Ї]cЁє*3^–#Iъчr[оЎР6/0ъq„ *;АТє~vЇ№SЖs—ЛAe1p`б#О ~Q—.!рoШг@ aзЖugoЗСiх?FF–%З›ФэфF'/œђaXY‘Œ>ў3hСЙ?ъЧѕ(<][>Ф)^ ъvХ‰AяДЮ Аэ5пŠjЬ!йy]э{Ÿ1хЩVЎћ=p=&аw§8)xІnЎшВ#Ск6лEyROшнTЕmЖ"=cWХЗ@ќXЈ5(є"Й}ч`Б$žЄЃ•OdžЛŸWУљЭГIBЁ=\%/oЮ„šЇ™їu—оDИёV…љPЏГЕG N>РЛ"6q—iёебђmслЦuv^g‡ š2§щ–rи–ь‰УчлЁ|_~*cYOЛш„#iœ‚ъЊKЪcy}R…W Ъж7і.џКZњЃВЅ/Њr„p€ъуŽЃЃ„ТЊcf3нНzхнЇаЗqчУ1XъЊD_ры.“оЅ?,%Ф@ЈŠЊ­нŽ^пжъщШ6Z№Šfdс+[МЈVŽ MŒ-;vяРЈбœыЅСдg–ЌнGu?&‡$ ьый=^x#<7 §‚c6QѕЩw ыМ‹Ўєuт'З$‚љЁЃbйŽБеRГн9ЪЙС%\ѓї ‡cyJ|‚т‚Н0—ХdиЦpб+Aж\§h5;„ЫЅмН`ўЖŒ"џ˜$езјЦiћ5ƒXЏ DTтaТœЧog[Rы›|@ыЌЪ]BЄђœB=з‹Л(оМВDd‡§Шцјsj;*tаЛџУrп\€ЌE7ч§олXа ›lWПKд8\п{Кš‚€њјЕ‹Ѓ%7ЮjyЈЄ—mМF›шm ЛD)Юу™›bHEgЦX"=ˆnŸЮ9б”‡еЪОяЌL­чСˆŽ`ђ№—ЄoІЈyыЏLxХ]bq8eAAйЊG‡ЂŽыђнbСrYМ]-’RXXЉ™r˜€ „TЧ cЬ/3 rБ№ УЭY™ОMь—OјФ&иЉЌ{їemњ6ыіBПѓЂбVRЇш’Ž"‹ n”`šKЫ›ƒ_чДц–{ыЅС=Ё€& с(˜ћНЮaѕеcžAu#P`3#bXќœEЕЇгH}ѓ…3{c7ѕN–”0<ЄЅwы”5Ђ$гАіnXъІ!ВzЗТ)ШПжЎLЌцКзиh}‚ЩКOt‰аэZрГ…(^уvв7qR&@й#ђR$€ыBЊЅЇ—Š$ВгX† Ÿ(зh'KFыN…и ќќKO3З*Цt=šH1Ћ\XTД“Ўз]ЏŸs и%/$ЎD‚q†‹МжѕВЄ/Рйџq8€УпмMўKf6с$: Т§o цЛB8гnV.ц!гўЅ6ьВKLqi€|ыBЏёаЪ8Д3–†ŠLHя9ђauђМUшo[š1ѓ<оя'1зЗЋiuнQЏтПž—ШBœ A—ј~?Ћ?ЋиіžPЩ.ЏЬRЪ Ўm4+Ц`$ЦШaŽяЏ0І.'Fм“ыо”в|жЌz7ioоЭ›XБЩйГi+ФЋ€ДыЊСQ5љAЧ}/ѓОл`eъC5шIjр^Us†Зg1 Э(Яž­8ЬЛШЙB“ '4у_єcjgS)уЄцL{Н ѕягƒPтз­•—y4фkэгЛМэ­ГЃFc|bсоNосЯ)йaa”4Š:šUЎ\,e.ƒcрбЧ•–л?ЕрxГЏЂyљЛ№С†Јbя ГС:Ця„УЅ‹в/_ВДуƒЫЃ™ (ЗђT&ВŒЊчf}Зв +щ–ЈДыЊћKэйw9ŸŽ ЁТСq-ЦfН&*к­lг& уu–‰ЅВh>™ЫšЕO`ю€ЯwЊЊsлі—ЏJЯh|EѕN4№ѕЗ-)њкЪУ–/ТъХMј{—Г…#ХLR!‹єFvлЫХИЯ"}Рelja„+Ъ3­iљЮЮџЋtSЊњzLя,L‹.ЏћžEєиž[OЩVx†жоўдWЩЌЊл<>8­EцoЃЇoјл~Їьh›§(УoхWb§ч§0? 6џ™МП)ќ_‚ЅqЁdK›—o0:˜9SЇJаиA“ №#Tк{lGў'жfW…Nѕ]лœа;ŒЃьђШ›г"КDvіХxn39NcљbkQя7‡8?ї'\W^ƒ$ЕўAи-~єœьiHk™$˜r§сБn­_њ!*Lo .–ЉдMДЈр K§KŸq‰wDТќћж—YяmіЊЛ–8šюээФž<7SЫкˆѓАГихHeВNлЛЂŠУєќіъS4ЯЧf jA‘и-fуУ•ŸМ ёц\ŽTƒЉЂэGBрє•Юp 6ЇЈІЮ'ѓ“ШЊш”ШТЦвЁ†љ9ѓ”0‚GyЯ†™YГдIфgOЩІДђ‚œVtк5Om9&кеЈЙ?ф*dvЅ0эЇ‡ч %а<0,†Œ9ЪЛCœѕлЯI:Wи‡ zЉR–kЛфщŸ•Љ—3од4q(Тл3}Ш.Qџё[??ЉгЎL fT*Œ|/|ТЏ9ЄKˆ0ё0Р  эв“ˆрю$ ж,—Аu^ђ§ nЬ"oі@$Ё–]ж=,kD§цtž—AgK&ˆ›ЎвС6@ЖшY ‡gGЕб.n^ѓ@Bеа#KЙЭ}8žД ž'$+Q|i‹ƒЭ Х&NЖ[еП?hkHRЉЉ(#9]ЇЄUSTнТЈІШєМZlOr;Кf‰ўБурЫМН9KРП&—эМS|7oўЊ1а=aЖžOaAЦћŽxƒDтКАeЋС…ќnЅsњ ”'Єn3Ÿ€NWб&BџШЕ=sЙ/Џ#юнЮК§O–ƒФБ'в!ЎE3_юcGGГОб…aЦѓCІпбННWУ>&уљ ЈиSщW FТЗ}x`ЭО9фIз\&+С„&Х7ѕdЖ™жlЫ g‹_˜tлФ:ј3hДјŽ9kl˜М№™эКпв’нŠdпП6ОЕ ‰ЈТfHяŠАьXБw4ћТo'KжЧŠ|В~—Ќ„ёMЫЙ3№LоfЯUœˆp6ШVђXЅ=|ЎЎЮіG ЉфхSPЭD[>З5ЦBрuшЊKМє‡%„†§-$OП]‘gЌFэ uђЃJХ0УИа4Н46KPCЛГџЁuŠ]Ÿxr™*œэі#|4‚c9Г&m,!^]oCаеtБ:prщт.Тj‹cЁeX=iєІШBŽУЬ%Ќ•“yiЪ6vрмnгjЕ_АˆАк8zЈМ.ЅIС{,“x,­ќLIп~:lJГ“4ЭfчHУXіЅ1*œkUеrчƒup y}бPќbPY.Р5ЯЖйГ–CК„Њv™˜А—эєВрНЇ Є№}юtдКФЊžoЫшJWJGгРЌюбе`†%0“m&HxђwTЄЙ_О’ чџЧ3ЌUB№Ь–|еЋ2ЙН*R=Б ћ„žхfп?]DыB"э Ё&ОŽpl>9&ђYFЮхAтюа'Y'Ж^ІЧА˜HУ Z”ITеэp1ƒяТ_­ћpП п3 нэєUЧ…- д„pїеMќkyъ—І#иAс3v…^^теsXВЗЁ‰mˆ‚`Ѓ“И-Щ]— JОЦ,™ЋТеЗ”'" eЊ(ПуЮы”ўЖHйw GЯбяLsѕ@й/ХћЭЭp‚т{Х1ŸhЛCwaМй†.цтG3ŒXп=т‡X ЬвўАО`0‰ЭЄЛњao=$іы|%щsдЈYзъ<A‚‹mЁzГ/jwpbЊ*Qц?3–Ў!‰}ш5њkѕqњ'ѕŸ ‘ŸоцŽ-›К„TНWВn238—Z4ОoJ 5в‰'ф`ЋvВыcE2эоС_K+кз#ъ•‰JЉŒAоШ™ЅDyьrС+4Оˆ™‚ьŸўЙvGїA‚№Ÿи4ЄF „?іАхsэ.4съЉЭTXшЕGШ(МЕХВ9Йћ6l‹2ьЗtj Я€ф?@ўФfтVPO€”оhч NЖПa˜nугgЊ„tP‘.‹г4Ÿ€Є#UЋ0^эHЎs:=,/еї мD?§и1NWтЉZд cк§xЭ Ф<ќо2ЛоJœВnќŒэJi…uњ§ Пт#В­ncQ&Љ тєы8Wъ u‹~bkKђІSАkьˆУЗSf…ЁІПlvМEQ.Ћћ Yћ)ТоЂЯш ‘vBЏEœim~?Sр;ОXё€aУ)Еp"YЄUІ5$Щ!tж:† /ПЮ$Йƒђыё0цNпŸЕYЫ†;іЂп]K ›Іо Ј^eь{­A[eЋ#‹‚Ёт›&4‘, иЋBчўМЈgxkЯўе—ЬмЉK–пj…љјO›У‚Їх—’’‚П ЄљКю=H‘х l_n_ZЙЖ‘oiЂиJ/aЫ1и+ОгhЧ€rьƒx…є[мщ\н}y ЕaiЭ3vhй•зK*яђLjћ"иЂТj%ЂfžлžvBяЃч—vхT;s˜О”i€ЈœцйАї8ўIUžх…€DšЖ8l]*c?ŽbікZ пtюt*^;я8zT‡Xpь…я{tdТ›&§"6gФ_ш чЛ…ёYчє 6q[’)pя‹ПЕЪ#=žГ=Іа9Яу~Sќo'ЧЕ--н~га„)Ыs\ТkAШ1№‹дћ‘4by~З)r4wВiF‘;Е—ЭВ8OE*и<\rё†œ$мvьoaѓWŠ Шѓ+,OТ.upјРДСБUsтъh<т(as€}Ћ&ё>BŠŠ сYAп(М*уИ$-MЊoьI-ЇyaDrw[Г§q@#Ј.Тv…n-4%їЪфЭ2”,‘dЗіvЭXWQ/E†Ч`E8цnžьќ™?дXЯЊЩ7Ii љбЄЙП&HЋЩ‰г|ЅдєcЕњ&zЋ пžЁ§фжdY3Љ8ЅЦИ)jfШQ}пжK;ќЋMп… ~їJІlQ„SЬнŽаѓŸфиdБ™†ћ:vt‡ІЄФ5•/НЄќ;Ž]!ыЊ1/Р”ЂšоNЙзh%лЕHъж@eВieУ јѓ="пфњ9]М-|Ч)9…мnЪТ§`VйVаJ%gљG§ч;6"­vlЗJ2eN‹PчюУ$vбЯЉ$OЧ›Џž,“№Џьƒ“5Sqї]„WsYыьMрц€Kѓ­нэЊlх1ј€Ђьѕ}–ЁДЬqZйiMI{’iЇˆНoюrЮ;Ю[\ЩЬŠ%Y’\Т{}А<›СсЂZd‘UдэM(лDЊ \йЄ‹Љщ’§п`л–$aфяЩM•WS ЭŒ77@…й'э…vкуят,R cцœY0:QКЋф~-Зх‡Цy•kшbМ*вьm"ЎЄђД‡­циЮкNgFїлFЖ№žьˆЭ–ЅЪУ?ЙЈgxчтšˆіЖ%щЋi-ёJGFџу]ўЌЩwmУгFЅAD6Ќ?УЗ`сYыњЧC˜„—(оЂ 7)OgЧніВDш>(ыJX‘ˆ2Иnю€7џd[Ќ|‡‹tђгЁ|рїъјŠчŽhb]веЉ$йj1OJhDИGiьы‡Vр˜Ќ‰‡iЪ'"ЮQlžœьb“е4…šйi,šT„(ІНWВю=їІђlUл—ћTПм E3Ѕэ˜rч_~Wхз4ўrnHф}хйёHƒhъo!0*tО9ƒ|”Ю<ю7R6?љTЮLˆlжwЖ!ПсЌЇК7ђaКˆь"qœУ—хѕ<3yъьJiю7Р?Л†›†Ю›v№Љ7"ЯENаїЩтЗh%€Љьh›ЎTžьЫm‰lі]дN†1 #ѕrЯ§ЧНx'ќœL@ЇžЁє9гўe€yQ§ Ў…Г !$^+гЙnЙ‰ЬїГр ж*А(_fžD`$ПЯЋh"ч`ШьоКЃо5Љ=—*G ;ФпЃЛіˆ“ЪЦD„Э'Q9WGюhМ-#(…уИЈŽH‘оФЃѕПЏЉ=bД<ие04H!й`‹БЋd№‘ь„:$ќWЈPw_л8k ЖЇЁ$ubFDЅ|@з;eЮУН”JRН1ƒ wЕ\у=їъBFЏЕжў_v1іЩ\|UХˆŠ^ \XG-§ Ь|МчХ•GIŒyjѓ™ xyТз™o€Kg“ЬЭšВД#Fѕж[уђ1‹Фї џь/Ž>­цd%…”ЈПˆ–ьƒ“4Gшfш/гxb kз9ЮЁQ)ЧЧo@%їd[SѓХВюВэKySR&ёq3u[Ж™ZњъmWJF–РEњfиAњаСЮ3‚\ІѓЊ*)m9УѕжРхЭœšЦ_№ђтЗ’]uО(‹[ЁвЭfђEЈ8єЃUЃэƒf4ЌY–QzК†бАј“‰ъ№вє0›ъ8жК4З“+#Fб`K"fqHЋ­tL:Ё”mma-їђNѕтn§k%д>УЪ|џюl 2kj„NLф5ЊfЁы‚„Кy€ФУ/2яГmЄЯx~ЌЩ„К3ћеЧжBћ9й2Œ‚a—teёŸЄЛЃџWЫ+Vd;№хЏ"6єо MВт?8B Ѕm?ЕЬv?yЪзж`‘чуwЎ’ўK.ю,Р"m=ХђŒhq3УУИѕєу ƒ’ ЯИKжЂј)6ТbЌrщFтЁraBXJюZK22rхтLaЇrSЌў9 ~ ЛtмX­5&LЏS;`э+T-™_ыG npіу HЙš5~йюžЏўЙвЭ–ѓчЅSv\Џ(Г)я'К‹QшЬУseдp}†чч[DOŽЦdDв5ъu‡ “ ЖёЇ^Й~ž?жFМ<L^юАях:ЙВлyRёЁ,­LaП№рJƒCтЛcцaZ‡Ю ЭзыКЌвйDnРiдќaŸoзц3wј>…l›мж‰ФФЎЙ=+6›ЙkЈоŸЬZ ХˆХ§’z|‘WчшNЖђœšVэмзMŒсaбћDg9Вœєиe^„х>>Ъг’ ! gЅ|BЂЏ›WgП—m— !мf9ъы’hZ*ƒгЮ’1ЖPтI}4q `]sѕ(OЙџ„џ­иE mэ™ЧШКNйєЮNw&ЊRб)F_э‚ X“dх‘eиЪПQ№сc%™Žn'(жВ0K=эБ jў›чѕIЮТЮ wЦ0Е”W’ ŽXИзРвуѕЖXщcўаŒљ}=Тi Ь–Ў иќвЂŒkђДю;Х0мѓт`ї РџІЊ4з]ƒO[Аж`–юWДJфEiЖј4д7‡L™ˆљцvKџtѕџФCХчc#2Ыˆ‚IJUж3™rUW•\0^ьqЏф ущУЁџ†@h RfЎ ЫDі^•ЯБ5O;:Щ?†O/г+Я(№Ю%›‡ ШK<юv! СЮt№Ѕ(>]тyмО ŽƒН­,+КZh”{ФЌ“rТ†œFh.2њёь~Ъ‡mнjшЁ7ќ|‘‹ЧBђzРY I[їШkхƒ ƒ0[О%њ­Rѓ№‡Ще^“.зЖV^у–н$#ь>O{Ђ~ЃЧЅєGЁЁ”{$RUнПУcwлјˆ5LКР2œclassified-ads-0.13/ui/callStatusDialog.ui000066400000000000000000000051771331670245300205410ustar00rootroot00000000000000 callStatusDialog 0 0 861 425 0 0 0 0 Call status true 0 0 100 0 Input level Qt::Horizontal Audio calls false 0 100 0 Output level Qt::Horizontal classified-ads-0.13/ui/callbuttondelegate.cpp000066400000000000000000000066301331670245300213040ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "callbuttondelegate.h" #include #include "../net/voicecallengine.h" #include "../log.h" const int KCallButtonHeight ( 30 ) ; CallButtonDelegate::CallButtonDelegate(VoiceCallEngine& aCallEngine, QObject* aParent) : QItemDelegate(aParent), iCallEngine(aCallEngine) { } CallButtonDelegate::~CallButtonDelegate() { } // idea stolen from // http://stackoverflow.com/questions/11777637/adding-button-to-qtableview // so thanks SingerOfTheFall and Kim Bowles SУИrhus void CallButtonDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionButton button; QRect r = option.rect;//getting the rect of the cell int x,y,w,h; x = r.left();//the X coordinate y = r.top();//the Y coordinate w = r.width();// fill whole rectangle h = KCallButtonHeight;//button height button.rect = QRect(x,y,w,h); button.text = iCallEngine.data(index,Qt::DisplayRole).toString(); button.state = QStyle::State_Enabled; QApplication::style()->drawControl( QStyle::CE_PushButton, &button, painter); } bool CallButtonDelegate::editorEvent(QEvent *event, QAbstractItemModel * /* model */ , const QStyleOptionViewItem &option, const QModelIndex &index) { if( event->type() == QEvent::MouseButtonRelease ) { QMouseEvent * e = (QMouseEvent *)event; int clickX = e->x(); int clickY = e->y(); QRect r = option.rect;//getting the rect of the cell int x,y,w,h; x = r.left() ;//the X coordinate y = r.top();//the Y coordinate w = r.width();//button width should fill whole rectangle h = KCallButtonHeight ;// height constant if( clickX > x && clickX < x + w ) if( clickY > y && clickY < y + h ) { const int callId ( iCallEngine.data(index, Qt::UserRole).toInt() ); switch ( index.column() ) { case 3: // accept call iCallEngine.acceptCall(callId) ; break ; case 4: // end/reject call iCallEngine.closeCall(callId) ; break ; default: QLOG_STR("Huh, editor-event in column with no editor?") ; break ; } } } return true ; } classified-ads-0.13/ui/callbuttondelegate.h000066400000000000000000000034561331670245300207540ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CALLBUTTON_DELEGATE_H #define CALLBUTTON_DELEGATE_H #include #include #include #include class VoiceCallEngine ; /** * @brief class for displaying button inside table view */ class CallButtonDelegate : public QItemDelegate { Q_OBJECT public: /** * Constructor * @param aCallEngine is datamodel where call data comes from. * @param aParent Just parent object. */ CallButtonDelegate(VoiceCallEngine& aCallEngine, QObject* aParent = NULL ) ; /** destructor */ ~CallButtonDelegate() ; public: /** * Painter, overridden from QItemDelegate */ void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index); private: VoiceCallEngine& iCallEngine ; }; #endif classified-ads-0.13/ui/callstatus.cpp000066400000000000000000000063661331670245300176270ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "../mcontroller.h" #include "../log.h" #include "../datamodel/model.h" #include "callstatus.h" #include "callbuttondelegate.h" CallStatusDialog::CallStatusDialog(QWidget *aParent, MController& aController) : QDialog(aParent), iController(aController), iCallButtonDelegate(NULL) { ui.setupUi(this) ; VoiceCallEngine* eng (iController.voiceCallEngine()) ; if ( eng ) { eng->installObserver(this) ; connect ( eng, SIGNAL( inputLevel(float) ), this, SLOT( audioInputLevel(float) ), Qt::QueuedConnection ) ; connect ( eng, SIGNAL( outputLevel(float) ), this, SLOT( audioOutputLevel(float) ), Qt::QueuedConnection ) ; } iCallButtonDelegate = new CallButtonDelegate(*eng) ; ui.callsView->setItemDelegateForColumn ( 3, iCallButtonDelegate ) ; ui.callsView->setItemDelegateForColumn ( 4, iCallButtonDelegate ) ; ui.callsView->setModel(eng) ; ui.callsView->horizontalHeader()->setStretchLastSection(true); setMinimumWidth(550) ; adjustSize() ; ui.inputLevelSlider->setMinimum(0) ; ui.outputLevelSlider->setMinimum(0) ; ui.inputLevelSlider->setMaximum(100) ; // slider works with integers ui.outputLevelSlider->setMaximum(100) ; connect (this, SIGNAL(rejected()), this, SLOT(deleteLater())) ; } CallStatusDialog::~CallStatusDialog() { LOG_STR("CallStatusDialog::~CallStatusDialog\n") ; ui.callsView->setModel(NULL) ; VoiceCallEngine* eng (iController.voiceCallEngine()) ; if ( eng ) { eng->removeObserver(this) ; } delete iCallButtonDelegate ; } void CallStatusDialog::callStatusChanged(quint32 /*aCallId*/, VoiceCallEngine::CallState aState) { QLOG_STR("CallStatusDialog::callStatusChanged " + QString::number(aState)) ; if ( aState == VoiceCallEngine::Closed ) { VoiceCallEngine* eng (iController.voiceCallEngine()) ; if ( eng && eng->rowCount() == 0 ) { reject() ; } } } void CallStatusDialog::audioInputLevel(float aInputLevel) { // slider range is 0-100 integer ui.inputLevelSlider->setValue(aInputLevel*100*2) ; } void CallStatusDialog::audioOutputLevel(float aOutputLevel) { // slider range is 0-100 integer ui.outputLevelSlider->setValue(aOutputLevel*100*2) ; } classified-ads-0.13/ui/callstatus.h000066400000000000000000000042501331670245300172620ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CA_CALLSTATUS_DIALOG_H #define CA_CALLSTATUS_DIALOG_H #include #include "../mcontroller.h" #include "../ui_callStatusDialog.h" #include "../net/voicecallengine.h" // for call status observer class CallButtonDelegate ; /** * @brief class for displaying voice call controls */ class CallStatusDialog : public QDialog, public VoiceCallEngine::MCallStatusObserver { Q_OBJECT public: /** * Constructor. */ CallStatusDialog(QWidget *aParent, MController& aController ); /** destructor */ ~CallStatusDialog(); /** from MCallStatusObserver */ virtual void callStatusChanged(quint32 aCallId, VoiceCallEngine::CallState aState) ; public slots: /** * Slot for setting display of level of audio from microphone * @param aInputLevel audio input level for display purpose, range * [-1.0,1,0]. */ void audioInputLevel(float aInputLevel) ; /** * Slot for setting display of level of audio to speaker */ void audioOutputLevel(float aOutputLevel) ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: Ui_callStatusDialog ui ; MController& iController ; CallButtonDelegate* iCallButtonDelegate ; }; #endif classified-ads-0.13/ui/classified-ads.appdata.xml000066400000000000000000000057131331670245300217450ustar00rootroot00000000000000 classified_ads.desktop CC0-1.0 LGPLv2 Classified ads Internet messaging system ViestinvУЄlitysjУЄrjestelmУЄ InternettiУЄ varten

Classified ads is an attempt to re-produce parts of the functionality that went away when Usenet news ceased to exist. This attempt tries to fix the problem of disappearing news-servers so that there is no servers required and no service-providers needed for any operation ; data storage is implemented inside client applications that users are running. Features of the program currently include:

  • Posting of ads online. Ads have a category ; there are some pre-defined categories but more can be invented just by typing over the suggested categories.
  • Replying to ads either in public or privately to operator.
  • (Small-sized) binary attachments to posts.
  • Providing basic data of operators - data that operator may enter himself, or leave blank.
  • Basic searching of content based on words.

Luokitellut ilmoitukset on jУЄrjestelmУЄ julkisten ja yksityisten viestin vУЄlittУЄmiseen internetin ylitse. JУЄrjestelmУЄ toistaa joitain toimintoja, jotka lУЖytyvУЄt myУЖs usenet-news -jУЄrjestelmУЄstУЄ ja smtp-sУЄhkУЖpostista. TУЄmУЄ ohjelma on suunniteltu toimimaan ilman palvelinjУЄrjestelmУЄУЄ ja tУЄstУЄ syystУЄ mitУЄУЄn sopimuksia minkУЄУЄn palveluntarjoajankaan kanssa ei tarvitse tehdУЄ. Ohjelma ominaisuuksiin kuuluu mm. seuraavaa:

  • Ilmoitusten jУЄttУЖ kaikkien luettavaksi. Ilmoituksilla on kategoria, ohjelma toteuttaa muutamia kategorioita esivalintana, mutta kУЄyttУЄjiУЄ rohkaistaan keksimУЄУЄn uusia kategorioita.
  • Ilmoituksiin vastaaminen joko julkisesti tai yksityisesti
  • (Pienikokoiset) binУЄУЄriliitteet viesteissУЄ.
  • KУЄyttУЄjУЄn perutietojen vУЄlitys ; kУЄyttУЄjУЄ voi myУЖs jУЄttУЄУЄ itseУЄУЄn koskevat tiedot antamatta.
  • Sanahakutoiminto julkisesta materiaalista.

https://github.com/operatornormal/classified-ads/blob/master/doc/ads-search.png?raw=true Search of classified ads by category https://github.com/operatornormal/classified-ads/blob/master/doc/profilecomment.png?raw=true Replying to operator in public comment http://katiska.org/classified_ads/ classified-ads.questions@katiska.org
classified-ads-0.13/ui/classified-ads.desktop000066400000000000000000000017641331670245300212070ustar00rootroot00000000000000# If you want classfied ads to appear in a linux app launcher ("start menu"), install this by doing: # sudo desktop-file-install classified_ads.desktop [Desktop Entry] Comment=Classified ads the advertisment posting program Exec=classified-ads %u Keywords=messaging;communications; GenericName[en_US]=Classified ads GenericName[fi_FI]=Luokitellut ilmoitukset GenericName[sv_SE]=Annonser GenericName[sv_FI]=Annonser GenericName[de_DE]=Kleinanzeigen GenericName=Classified ads Icon=/usr/share/app-install/icons/turt-transparent-128x128.png Name[en_US]=Classified ads Name[fi_FI]=Luokitellut ilmoitukset Name[sv_SE]=Annonser Name[sv_FI]=Annonser Name[de_DE]=Kleinanzeigen Name=Classified ads Categories=Network; StartupNotify=false Terminal=false Type=Application MimeType=application/x-classified-ads-profile;x-scheme-handler/caprofile;application/x-classified-ads-ad;x-scheme-handler/caad;application/x-classified-ads-comment;x-scheme-handler/cacomment;application/x-classified-ads-blob;x-scheme-handler/cablob; classified-ads-0.13/ui/dialogbase.cpp000066400000000000000000000140021331670245300175240ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "dialogbase.h" #include "../mcontroller.h" #include "../log.h" #include "../datamodel/model.h" #include "../datamodel/profile.h" #include "../datamodel/binaryfilemodel.h" DialogBase::DialogBase (QWidget* aParent, MController* aController, Profile& aSelectedProfile) : QDialog(aParent), iController(aController), iSelectedProfile(aSelectedProfile) { } Hash DialogBase::publishBinaryAttachment(const MetadataQueryDialog::MetadataResultSet& aFileMetadata, bool aForceNoEncryption, const QList* aBinaryRecipientList) { Hash retval ( KNullHash ) ; bool isCompressed (false ) ; QFile f ( aFileMetadata.iFileName ) ; if ( f.open(QIODevice::ReadOnly) ) { if ( f.size() > ( KMaxProtocolItemSize * 10 ) ) { emit error ( MController::FileOperationError, tr("File way too big")) ; } else { QByteArray content ( f.read(f.size() ) ) ; QByteArray compressedContent ( qCompress(content) ) ; LOG_STR2("Size of content = %d", (int) (content.size())) ; LOG_STR2("Size of compressed = %d", (int) (compressedContent.size())) ; if (content.size() > (qint64)(( KMaxProtocolItemSize - ( 50*1024 ) )) && compressedContent.size() > (qint64)(( KMaxProtocolItemSize - ( 50*1024 ) )) ) { emit error ( MController::FileOperationError, tr("File too big")) ; } else { if ( compressedContent.size() < content.size () ) { content.clear() ; content.append(compressedContent) ; compressedContent.clear() ; isCompressed = true ; } else { compressedContent.clear() ; } // ok, here we have content in content and it is // either compressed or not. size is checked. iController->model().lock() ; retval= iController->model(). binaryFileModel().publishBinaryFile(iSelectedProfile, QFileInfo(f).fileName(), aFileMetadata.iDescription, aFileMetadata.iMimeType, aFileMetadata.iOwner, aFileMetadata.iLicense, content, isCompressed, aForceNoEncryption, aBinaryRecipientList) ; iController->model().unlock() ; } } } else { emit error ( MController::FileOperationError, tr("File open error")) ; } return retval ; } void DialogBase::attachButtonClicked() { LOG_STR("DialogBase::attachButtonClicked\n") ; QString fileName = QFileDialog::getOpenFileName(this, tr("Select file to be published"), "", tr("Files (*.*)")); if ( fileName.length() > 0 ) { QFile f ( fileName ) ; if ( f.open(QIODevice::ReadOnly) ) { if ( f.size() > ( KMaxProtocolItemSize * 10 ) ) { emit error ( MController::FileOperationError, tr("File way too big")) ; } else { QByteArray content ( f.read(f.size() ) ) ; QByteArray compressedContent ( qCompress(content) ) ; LOG_STR2("Size of content = %d", (int) (content.size())) ; LOG_STR2("Size of compressed = %d", (int) (compressedContent.size())) ; if (content.size() > (qint64)(( KMaxProtocolItemSize - ( 50*1024 ) )) && compressedContent.size() > (qint64)(( KMaxProtocolItemSize - ( 50*1024 ) )) ) { emit error ( MController::FileOperationError, tr("File too big")) ; } else { // file was not too big. here now just mark the filename // for later use. if ( iFilesAboutToBeAttached.count() != 0 ) { iFilesAboutToBeAttached.clear() ; } MetadataQueryDialog::MetadataResultSet metadata ; metadata.iFileName = fileName ; MetadataQueryDialog metadataDialog(this, *iController, metadata ) ; if ( metadataDialog.exec() == QDialog::Accepted ) { iFilesAboutToBeAttached.append(metadata) ; iAttachmentListLabel->setText(metadata.iFileName) ; } else { iAttachmentListLabel->setText(QString()) ; } } } } else { emit error ( MController::FileOperationError, tr("File open error")) ; } } } classified-ads-0.13/ui/dialogbase.h000066400000000000000000000052631331670245300172020ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CA_DIALOG_BASE_H #define CA_DIALOG_BASE_H #include #include #include "../mcontroller.h" #include "metadataQuery.h" // for metadata data structure class Profile ; class QLabel ; /** * @brief base-class for content-posting dialogs of classified ads */ class DialogBase : public QDialog { Q_OBJECT protected: // methods /** constructor */ DialogBase(QWidget* aParent, MController* aController, Profile& aSelectedProfile) ; /** * method for publishing an (attachment) file * @param aFileMetadata describes the file. The iFileName member of * the structure must contain valid filesystem filename * @param aForceNoEncryption if set to true, always produce * plain-text binary, with no encryption * @param aBinaryRecipientList if non-NULL, contains list of operator * key fingerprints that are the operators that will be able to * read the binary. * @return fingerprint of the published file or KNullHash */ Hash publishBinaryAttachment(const MetadataQueryDialog::MetadataResultSet& aFileMetadata, bool aForceNoEncryption = false, const QList* aBinaryRecipientList = NULL) ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; protected slots: void attachButtonClicked() ; protected: // variables MController* iController ; Profile& iSelectedProfile ; /** list of files used in posting-dialogs */ QList iFilesAboutToBeAttached ; /** label used to show list of attached files. pointer must be set by inheriting class prior to call to slot attachButtonClicked() */ QLabel* iAttachmentListLabel ; } ; #endif classified-ads-0.13/ui/editContact.ui000066400000000000000000000050551331670245300175360ustar00rootroot00000000000000 editContactDialog 0 0 800 165 0 0 0 0 Edit a contact true Address (SHA1) of contact Local nickname <html><head/><body><p>Settings some trusted is public information to readers of your profile</p></body></html> This contact is to be publicly trusted in transactions 0 0 QDialogButtonBox::Cancel|QDialogButtonBox::Ok classified-ads-0.13/ui/editcontact.cpp000066400000000000000000000076541331670245300177520ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "newclassifiedaddialog.h" #include "../mcontroller.h" #include "../log.h" #include "../datamodel/model.h" #include "../FrontWidget.h" #include "../datamodel/contactlistingmodel.h" #include "../datamodel/trusttreemodel.h" #include "editcontact.h" EditContactDialog::EditContactDialog(QWidget *aParent, MController* aController, const Hash& aProfileFingerPrint, const QString& aNickName, bool aIsTrusted, ContactListingModel& aContactsModel) : QDialog(aParent), iController(aController), iContactsModel(aContactsModel) { ui.setupUi(this) ; connect(ui.bottomButtonsBox, SIGNAL(accepted()), this, SLOT(okButtonClicked())); connect(ui.bottomButtonsBox, SIGNAL(rejected()), this, SLOT(cancelButtonClicked())); // if we have the contact already, setup the UI from that: Contact c ; if ( aContactsModel.contactByFingerPrint(aProfileFingerPrint, &c) ) { ui.hashEdit->setText(aProfileFingerPrint.toString()) ; ui.nickNameEdit->setText(c.iNickName) ; ui.trustedCheckBox->setChecked(c.iIsTrusted) ; } else { if (aProfileFingerPrint != KNullHash ) { ui.hashEdit->setText(aProfileFingerPrint.toString()) ; } ui.nickNameEdit->setText(aNickName) ; ui.trustedCheckBox->setChecked(aIsTrusted) ; } } EditContactDialog::~EditContactDialog() { LOG_STR("EditContactDialog::~EditContactDialog\n") ; } void EditContactDialog::okButtonClicked() { LOG_STR("EditContactDialog::okButtonClicked\n") ; Contact c ; c.iFingerPrint.fromString(reinterpret_cast(ui.hashEdit->text().toLatin1().constData())) ; if ( c.iFingerPrint == KNullHash ) { QMessageBox::about(this, tr("Error"), tr("Operator addr is not valid")) ; } else { c.iNickName = ui.nickNameEdit->text() ; c.iIsTrusted = ui.trustedCheckBox->isChecked() ; iController->model().lock() ; iContactsModel.newContactAdded(c) ; iController->offerDisplayNameForProfile(c.iFingerPrint, c.iNickName, true) ; iController->storePrivateDataOfSelectedProfile(true) ; // true == publish trust list too // trust tree model will obtain the "self" profile from // profilemodel so this notify here must be given after // the profile has been persisted into permanent storage iController->model().trustTreeModel()->offerTrustList(iController->profileInUse(), QString(), iContactsModel.trustList()) ; iController->model().unlock() ; close() ; this->deleteLater() ; } } void EditContactDialog::cancelButtonClicked() { LOG_STR("EditContactDialog::cancelButtonClicked\n") ; close() ; this->deleteLater() ; } classified-ads-0.13/ui/editcontact.h000066400000000000000000000035561331670245300174140ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef EDIT_CONTACT_DIALOG_H #define EDIT_CONTACT_DIALOG_H #include #include "../mcontroller.h" #include "../ui_editContact.h" class ContactListingModel ; class Contact ; /** * @brief class for editing a contact-list item * */ class EditContactDialog : public QDialog { Q_OBJECT public: /** * Constructor. */ EditContactDialog(QWidget *aParent, MController* aController, const Hash& aProfileFingerPrint, const QString& aNickName, bool aIsTrusted, ContactListingModel& aContactsModel ); /** destructor */ ~EditContactDialog(); private slots: void okButtonClicked() ; void cancelButtonClicked() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: Ui_editContactDialog ui ; MController* iController ; ContactListingModel& iContactsModel ; }; #endif classified-ads-0.13/ui/electrical.rawopus000066400000000000000000001517341331670245300204750ustar00rootroot00000000000000ЅрИЮ4ЃPПх1Yˆ†CaдЃК"‘ь“t2r:‡}žф‹љха2Д§йG>NяЗНc‡7§˜шˆRCМКЖЙ‰sНJJ}ВЫѕєa[G)ь‹bЕ0ЯQ™6 ШїщЇХЪ$ХrэlO Їю>ЭEыFЂ‡ФЋ”%Ќћ}IzППIХп3ёж1™›™> 8,‰щweiх€n/VЖЖЂа—ьм)>CˆZuЕ[4нц&3РЦ+BсG’pАoьЏ1айыŠЭ’—ёi­ЮнБЭ.Иo;s>C-Ј ’юќЧcfДd,eќТЭтКщmQ\*Рl Њf†йу|‚<НYS9vk5Э…ћ` х№ЂЖЅ1ЁЌ§Я‰вэд‘ tЮі%_-и2]фјC<к"cё м‰ьw'6Dk Х"AКj9Љ•‡іiИpЖЏGDš&ТqP[ЗЩfNЖ_‹gкƒiІyђU‘U7FёV>"›Ј‡ Ї/з"+щтє€х(.я˜sw#’œцУъ?LJП2~Ї,щђŸlБТБyv Ю(­и`*‡ЌeЇНс™ъ­Z[SЃ№ Дa"Z’Џ'Ђ“ƒ‹ѕШЫ •'€ьU‡яЗнPmЛп+`9A*ў”&ўъ*Ч(‘иšз”š“АИщ6FzЈTхМдёЂtˆ$ЩЅ^6Ю66$ЯФєй +ўЋУЪЫЌ=†іШ 1иžA'ЬвФюГпkв ‹ыЂqz3Щ^їWšgи|_ИY@љгFЎ‡jz3ПаDuБђ‚итРМ†Џ%RмЮ’Ќ№ЯкќDRxЦјѕ%уCTSО‡ЊjJН`f0ЩCxИХЃŸpњ ѓИЯ7wЊЬbШ1@_kџф$wгцD.сXm ПщhD ›иC—СМЬе&Nї,‚ы>)ѓиткОж5|ћ_я‰fƒќ]ЊDьbЬ@…ЬreE,cВщ‰­iБ;нф`R 0”тŸnЗіš})ЭТХaџуъЁЎ щ"0mku6=Im‡|;ОјѕŒ|„ k™ЖFєЗTтh$vцї…2л}ъ˜•5ЌёЩ­бF­Ќ ћ?Ђы5‘шЪG;Цˆљ ЕJиAѓcќV%г™.аaЎ”АihYУ}dI5]Њ6OmЏіf;эAdЮЇ7SМƒИmћ‹ўяїЦыЩ1T\бHt$rB|їX,—1ƒПі)•Gщ]œQ/шв ЇъЪЯќŸ.;yбzЏYPQcZ"™†Mжm€-EъЕЗ2ЬŠK–фд 4U &„кQšА=‚лH+‘ОіЉіјmі ›№JwЦыт[jPЄзZе@ЃCр %”Єо6:Г2EИж(­ќ ёТј(цvѕ щС}тš`)…gyлЈfї*,утГ(џЅУˆZ<З€9цЊтQuу‰)%ї[ы1E [кQpЋoў]4—.LбЃЎЖƒkУQЧѓyгЕХ­|жWSь5 UыМmmon(№3ьћ{4)@јœ˜ВhН‚Х;ЖО|у9ФaЊ0!ЛЙ’‡РѕіD(І~T:Ц И7Њg†dЌbЦЕp~ьzŠсЯ›ім‘А‡ифTёА aVSќЙ$4 Л-Y@ž ёК>ntХЖ^šIотњ qtжњl’.л1Ћы„шыШžеpюЃOФˆŸfЁчUЭыжБнЇ$:{|Щћbj’пйodi2CqžйњэС>ЫОQ/BƒцЮГХР‡ьЙ–™pЫšХ!JЦЂDDъœ˜q˜ƒБцCе(ўv9т/`оН§#W •ЁњjˆвЦ-<зНm§šHе_'ћjйтT7gАЧ&-"=Џэ_ђж тЄг.А6Ѓ‘сПŸ- eN ?ѓчЊF6ˆU ml.gЉš‚‹okй‹B"Дзщќ“ь%ЩЊŽ—/y3ђD/(v+ШОшp;ХŽЙєюцхщЁш_,ќ_ГщчЖ€ •§42­ШІŠ„†FŸ9:љ.ц дr‹ЊDfу1OC “Yƒ+j.Ж њrЛ–ЕEylЖ#ќCч'фПъSЎ^мџЮПІ } 8ЯЯ*Єдгпh“іJPX€fFnѓў@Дr Й"іnnзФЪ%z[4кўјпюіP™Ї љШБw_S=Ј_<’‚–цУg0Ц%cУЋU\!y|ˆіZ1TxФРƒь%ЦЬ&2ёPЃ"йx‰hЫвзЯхй›ЋЂmc>žЧЈіІPЏ {™ђYчlj’Q‡˜KSІPRж—$`~–дP€ 8J“O€жйду,гџQc с=(ДЯ](oеЦqŠЖлВšЗљŽaз4˜FкЉ#K—оi]Xyё€”Ь‰~Ј$ЛMƒœ5!‰[фeћ|aђ) |DGАŸ§ёw†ф›Ÿ=8b™Ї|дАn"ђ K­ли0Ыž7ѕєQЙPž. ЧИkyЏiЧЈD†виxвйД–5Ф'?y-q#ЅcЪЄƒІƒhз юЈ@—ХЁ™§4њЬё"еC …РєkШr1.СJў ЅфВJGq+pJУЭИ(дЎт$›B/с‘3CмUй€wЋЙЮ~тBМZеО~у=:…q…ИM^йЈїІhшX8dФŒ!(oа‹2™„:ъМЏ/вУљ\™с––ГЯђŠђЈчЊ;5'gvє~]w o•7<bHloтъ}†g`йЄl3uze~+… %эЌŽtЌ !\kє /Жlнк S“ьAАž]‡€’ьмѕ]+Ъби:nНэИш2}тЛыОГЊмЩ>|.а[ ьЂЕ­)є Ўъ:"\-РNуїК­еютє"Zшы%^XЫ­"l[фVш\­vё!6"жЖ9Œ9ЗнЫB"У(їюЭnRбдџйЂGПšяОm&[>6hM~щGЩЖCeъ^уџJkФ[ќЦш•ь„ЦёТІ…Рgі8>E?ыw­Qј†<•ђуВі”ѕь(hŒшЩn&%П БЖn№Hѕt LŽ‚1•МˆдтпЫ48W2I*ЖaЫљLtЄTэ%GЭ‚їзn#НAЁYd&№уЛ–ФшУrж/B4„њ‘ХЗжЫт• чЂЫqї(](рљЋЄnЂ$•dхЯ­F!ЪrэE%bt„U`мyёG)žwљƒ&NО7paЈгšгШГvЧІY^ЇЦЛ‹ЦЬ%ЬЈЋбч DT f6 Nž†ЯТТ4˜Z@п€H^ЂZ‚вhРeф2˜M]Ёzѓd#Дv'аFT•b‘N‹Ѓ‰` qЋŽЈ65eM \=I[<кТ6шт”вйЮ|60єSpѓ%ЮdйUЏ…вПZГНžэ1гS…ХGЧђ}‡ќW.as[џq[ќЊMqiHў9V6“~Ж†'2WF9—OТкœфRЎІk Щ%н;˜%$Щe4н5ЪкЃHУSJйШы?=Рyў8‘ .ЯбњТ?Х"œrЏt :ећ ‹рЂZЮМИP™Ў3|ПЁ@ЭeQ›aИќ<џзhдќЌXQї/pwАP€tr=НƒфРР(ж|IЌіMгƒu$Fov-щёгGџќ1ёLЮ ђЙ ЈЃїбЁ€vIР1šШйѕЉы=L@ ”цДћщїё и{2ГГ'Ј1 oХ#Зб№+wШL 7ЭЎЩРGпWШfAm'гљФ‹LмЄРЧ'џЏ/(ƒФЁ]< ВLЅ ЅiуŸмуmуЯ– П‚vр^ь$J8/ q“ао†Ђ.CfъБжІШИоaЛл8 ЬљŸ'<№žќ uтІЗјЅЉъ„ZsозоVІШ)& Т0J\зr­=kzтСŒŒc"ЈM Тxм%4—<І*HXdцЪеb@‰ŽИцж+УХЎtZ4Ђ №Жљ“ХУˆg§OнSш6ЧњˆWˆŒucїьV‹дЂжмњW&dYrЗH фЎ€œ"у—-Л{@ьJJт-ЦЫ]ђэ%%žъл<…СЙмц:opW Ю,јgѓ{Мц@НQ”т‚gчHмГйгBЊйДРšрцО}•›ЌуzŠ|5wi ЁŽВH{š'}›Уз“ZqХ•%д­З|У8—№хOан’я›"(œUў[‡ѕ– §ЧЋ‡иm™GМ††”ЅGх‘€бƒУкj$Вk6mЧtƒ‹gaЪЭфЬ*ЬЭгќикч–ї ЖЦ”ў’Ј\дюj.’ЩƒџЂР 8ёж*{@€œэЄЕ@€fѓJч„xЎŽ0 yћи™{Hjd“wёЬUњ№сН0fКYЦфOОЖ”,УzБ‚з&o„iyл’щя­”6ѕ8ъLFщш‡ЊьR„Е4zmy€тiпљЎ1ь(2ѓw–ЁЊ?№€nЧщцA–G:l`ЭŽ@ЇЄь‚ё6ь6 AdvЭb\ЪЉйКCчœЌ юМ€˜ь%ЌFЪџжќX‰тhг=њaГBА!јiŒБыюё+d8рєIœ0ў`­6™K№ЪИЬ>Ba‰ЙёПы|vЗкGtf…oжј;Ёжб НQŸЗ§п7Žљ?.Uэ.0ЉЪЎm1ёјсдЄВе#иWdЌŸim_9[Љƒ@pО[№у­xšЁ ЮЃ W9KАv˜А•ЩАСsSNД†ь!s+|PvыЃќјЊЇŠ"SИnхЊ[Цмм—џ1жЊ[нUѕоUё€JєpЙћ“F’rьёFщЧѕQzёЇЗэи"‹aPХжoD wЋхп-LЕ(ПY(…хѕёП,#fвoОп™w њР ОРUŒDlL_™Є“bёЋп4 ˆь$‘…M{Ѓ!T \о‚кЯ%ЈНREіcбн_Cdї/ˆHXЬk ПЏІSЗБu4-D';ЃВ‰ЧЩ—@Ж>?pdод^Ё"iЩS€ЦНaHD3–к›мѓKуКyшžJšЄЮњJN$ь(ВE‘ЖYGэОZNЄЫQ.Œ7#EЩGX&Н?J}s&…Ÿк=12>ќ0@6gў$€/,й*T NauЋіR@‡š Œ}Ѕ&…а++fЧpИИ в<“JРuцQ€—ќЮ?!ЪАSmјT+=г›DзвQЗa;НэШЈJў|ЇЄТѕЃ!^-IqqЂцI\bhтњЅ–7ѓ:ъBI—2 =Вк–- ЂыЈлјЈ0Iu# ЖXOrdxЕЙќъ_A §zУRН‚tю№§ДЄ“зэ›эиљ‚РQчX8*u‚ƒааЃY+qв…ћ ЩjaЮѓГQQ†ˆ‹ЋЪKлд„OAD„Пѕ9 JЫюЋgђЭJ—KІэ ›‡жЅ тS&Я(eKxЦU:ђэU’я< @™х ^ЋїxVюqyIЋQ3њэђК|БKK™™ пТЫWН]ЧоD6EМвюЌ‘јŒТ˜ˆїiƒ—ЊTЄ—Ќ9ІА—wŠ r"ј, [c.–ˆ\ЛmQсЙ‹ўcс„žёX#ІеЫ-~„˜1X3щp jХьєZЎ&dљeNтzqšjѓ­If>)@хdРчXЅQ2@эIBЃ9Л4^фLя2НxІŒДtURУж{ОNТЅБЌЊ/ ‡ГаМpЮаGЄ1ГўІ,€П mЭf:H-Ќ‰–ЗзQ}WЛ№eМŽ% Iл—Ÿ7žФяW‡юšhЅоі(ща­„tŠ{S Ў ‡IЩ`П!ѕ=кtТ )ч;БMМ\‹јR]НЬЉ8uН щ ф|;‰Є‡ьмSРq0“ќœ`XnT0"gЌ&Д+}vnЦa‡KЄdZ@!ЭЌёэюПUЇНр+бZk2`|у4Й\'ЬяЯaсO0иМ5nкќЎ„]bxв„Sќ:Ёс Ќ“[йXЏ—S]т?СБ˜v OщЌŠ„mHHЁЊXf˜ЛBЕSя*д‰ь‰_щ‚O;œС2’ЁnТ}OwEЩшf/ =@ЊЎАkbѕи%4ŠZКšИfi•(jAIК&Гэ{ ЛыЈЋ!љuЫz-Ъ$Яo‹ЯгСьЖѕ‹zЊнћx№qХіњ ЧїYuбШu=a Жћќlhzk3`LЄ5иўТŸŒЊC‚Эђ`[Ш5ƒь>вO^m+Ўa0Kё­Х7hєi!Ю*>Š№hށмWЄr˜ІН7-w$П5€ž,ђ!ѕ@ŠџїVX*z~сŒ–пЄ<™i=bSžЋ;$ВPЌІт§ЁТЂ{U HQ Ўm‚вЫ+у&сДИ\SXў„єэЩ”дJ|Є‘ЫUШZ€Šь‰ƒ$‘Юќ;ХH™4эЦW •#tVўУV1МЫ “ъvщљm†R8‰gP#Мђм•Ќ ј_ТF`џЄ[™ЩСйŽx™˜ћГБіD0ѕЬфZ7iYВ-]F е bЬЎkвšƒ-ZЕ—С*Yyˆ2YЏЖпЖћ‘4ŠыЬКџqyэzžЉЪ(ьВИ“VП`>ъTЈч†сѓ+ЦЦnАЉ{›`c]­ЇЋгaLj hgЈмк”IJтг3hйmУЯЯ џDsиЊЕiˆsOлу№Е9Ж‹x‰‰ћшТР>–šяШХХЕ€ІZ‰>ЙЌЗЖШJ9EхJ›ю •ы…Й)0atбІ6А?'УГšъhI]_љP0ы.ЮLЉМЭ№юЕхŽѕВŠрlЮЩ’9ЉС7p„VщИЩ'ЃФ{ћ $Ый…Z„КСj&Ѕf$аТјX{э Ж k1œtНКTгљчЊ5{QZШ–\}т?ььd– џŒK‰О§)OЦ;§` эx’œYФZk-I ЏКсUяS8эьЖ;ФљБЊС~ Мь‚7+ж‡ JјтБИYšьШX q)tЧюйЇ<шiv‹-X—yЬh*ŒQ”•З?Ћўѓ{ƒ„­эŒЯщŽЮoЮKœtчЙvŠ"j^#њбL};Щ€БдОйрвH|t)R)їњ~ц„-R;[o(”„>šУЎšЭѕВNVн—‹MК„ a}jo‘mŒbjKŽў-ьЃyй5"я4–dЊGЁn|М УIиšэG$%œIxЂЋЇbь>•ЇУљŸђўіƒЅ\mШЏЈ MшA5-("&kнќ{†ŽjкХЁ7юўmѓЩЎп€G}лHYЈQЎkž{Э‹Ц…k7 ‚K№X/&Јэ1ѓ2ћжЭЩžвdЬщ˜fyЯ=пg\еЗєN*єЌ~Ѕ+ШЃšХя~“ž1~яTЃдƒ nkїœјdЂ№’эE%‡wžў–Ѓ}…ЗсЂП” ga3к~ўb@іН€œЧБ%В0НP—ZtJn0Rѓ& Œ›3М5яnœып$Еš‘$jž?Ћ!ћ[FУ~В`оˆЪгšгŽё,zгњ`ш tc|БЪGР№fSЅ„ю џ„ЌОzъъt†z3Ъ<*k] эEиh“ЅНЕlˆP^iд%Р'jB§Л­їpмхKкћC›цЯ3н№9wžђ;Вк—кa?K<єдŽm66YrС=ЌO8o)œЖёкцlœ‡КJЦжЈdдvЬNЯ ,Mа}IŽЅ Ї8йє!,1h!N`3Ё ­!IŽѕO Žњ`юўŠФu/EГЮ4дХшКОБу ь4иœэ0=†(рЁud-" сЦ FНfЛМ нзщ&аЎ/еe ЮP5w1†fджWьц=€0(q?ЗЕzЧŽ2Lг &(Nэс{r8ˆпŒoŸ‘"з`ŸЉC НѓхvuЃ@;.XЊe…фŠ™”ЄŒ`­Жƒиbж•€tk\я„ѕ!рYj”њыжQЮ*Z–сЮmvЎЊЯh•эЕ0Э)7|чОпrЂ{НnбO[‡!ШЇrGГ“№lRоœ™тЁ3гЫщьД` Сш~ЛP˜ XЎSУєшŽG‘\цA`ХІœQK+ŽЅИрФіЛrŠМQюf#л2\}"S€ћ+~і!!дq p,jƒтБцэц{&Ьѓ/Cœ{ъЗLѓт(ЈO›Ÿ ZЈ”эВмyˆИэeAыFеЕž‚Ќ§ЪtіНвгШ-•ЪBZчЃ9Dj ЄLGБ ЬїЙГbМиж­|ŽК-Хkvyгъƒ<_2–УЌв&‘‹’ф„œЁdСЦч#\ђ  нџW:–MbžнS‹‡ђїЌN&2(_K&S•РВЌДžWDерТ*ЎЈЭiqЉЮˆЌлз_їз~а0Ћ)ЃФiщM}'\­˜R9x^пYл_•–ЉDrўf :нp!4ѕнаh•o.§f†фЗЄоYOU:Xz2ф5  ѕrкf‡цѕ%4бHž$Q-”ЦіВ‚TMW0 ШžАѓ*џЮ$цf'ІЧё™B‘oЗоXгДyаˆ/иѕ+ьpM{šUд.пЃ` -ЕЉМnЛWЪЄz6$ЫrI‰X кY№'Ь8ЦЭ(Љoю9у‡OvkOЕьBуFYmЃ д—; ЪЩИ(№LГАйіŠJбМ.Кx—§@ЈФ„r ЏU|‚ŠB• дмZхз0шиѕ€П!ˆпŠэоѕy пшЙлЩ(мсќ’"A†УqI>a‰ЄDё8ЇдЩNf>jX,TъО5УЊюw\Н*КЙ Z~{эЄэ7с{пVм#x{сМєŒЧ‰лЊ'n 5‘ƒг$t0Ч6=pDT%)РL?љуcиОŠ4’)и ћ<№^ќˆэ:Љ H ]юп_ъюРЫa6ШпењХцƒx8mЁу)U/dKі5Ћ"[…љŽJТч•—jb№М>я…˜Я.vхі'WsЦ)ъwŒ@tŽаїр№ч>VоЧ)єчп9 &Ав4.8В–СB9эйw$ьхHІа˜Ѕ:Еl[‚ŽСd aСe:ЏЅъ…b€v]КgœP]аЧEoь{Iž)Шћ†k гм‘МGШ‚'Q-~Јё.'ЪS„oTяp''рФьu{eЈђJПё/›Б Сsyў­ g'ф’LэB$йгs'†ѓFв7:ш?аp‘*нп™лuЕ%_ЭŽEm`ГъЭhtьpхu8Oб[нтžЗeщЁЁњHЁ‘0ЌXV–П‚рц€ЇЈC €ЌЬB+эT`RCйэябКшёf”Д{МфћЖѕKЄРrcuHјF€pЖoЌd\' сŸn™D?к*c@z‚0Ndьo–ЛѕцоFИ7”ЏYшYXIьЃ'фЕ;›Уj/—жfсНQFЁЁй4ЅUŸ:рђтЂГN –XNГњїpІžiBF{ЁРгgrЩx~HV32laoŒ$b]?"dЩ*–.С,БzыЂњgH4VaН\G1ћK‡H2tL­w:й&зъEf–вŠ‚“KжJњx2hŸ….SОЗ.fuмhI‡€vT!њЌЌˆ”ˆqO_їљ3№ЊЎ3ч№­^рЉ>Сфx WPШйЊоUt8Љ3№ЋфљЖŸ.Iќ€ы]Эа’ЄФЂd™PT-OšнNR2ЋИPC†g/bјщо1Ўš™N €\лKr %р yђwЖЪд{ќЂM Л zЈрЏИ,нŽЇ}ћјpTМЁUЎ  KгŸб?o*Ќ4ЬВUwјAэV67=х™B:с aюРЕы“Н6Б№+ЧЫd‚/~жлб‚I˜Р˜г‚вqt№Pkv…Cgл$'[ YbЃ?y? §opбьВЄыHъщt!бнЈ”+Vcv“9$ОиХGьv?чаDaЏ”Ю7F*я`q БІu чМ№` *mYВє+єjъбP/ІЌ-Špщ\|"C%Ь ‡Т_о#тa"€@@ЯUvЖkдеKЗЊ4О<жсEА*kеZ@Жы GY‘€HР$(Ќ4мTe1AœЬSЄ5(ФwtХфуойѓ?ыxaY;lЩLу™~dк”{Я§.PЮц<ЪщЩЪƒЫБтсŽв‹Oн]ƒ%Ь:Э кЖ ЇЋpЭ} ;Іхp“ъй{KЧЇ м\о†вњМZпj'+Џ‹џH:б§нлў‹‡њd3Хph›CѕЬj­`q†#Ђ{6Јk!ЯoЋDJуїуKМ xЃЎQгnыD/„=gЏыјЕ ђ~+вЊб5vхѕ{кUѓYе Y:^a‰№]ШЖ<•žC`У‹T'sхвлу&€ЈwиSЬL’ СZ"б\"ddџ[іљ…Л $[•(bрЪ&.І Nьmђ Ќцysаьfїw№LїyЮlЉ+ЙvKжJ]Ѓ YяyВ%хЩф–kƒŸЩ„Ÿ7TкѓЪв$€_Ь№_с‘ШЪ’р[Ѕ%Ъ4ўў0w•9 Ь› Ќь}WсбкеrРДЈ%­ф]ТёЯ2iћЩз™ZaЙ_сfЈТ†СŸі|вЌ0ЊjоІmА­Х§ж#9ћ№v7ќщЃs№!Ќ"ƒmЬ4Љдќ<ПŠxIRХТкВšи”ФНчаЯнЫLj)TGXjЄ~ЁJQэ*РеІвWЁŽ—с—Ž•1ан-~V§Асds32ЌbpJBЮ GЫєё›(А~Œ’рЯмЉыіPŸsги ю_Џщбииj /$Д „U‡ЌЋ9аѕ-…­y"FцУЇPg4ўvяt!kGeF[лjЃкЗzе4VСe†'Ј œЉ §Ч&Ѓ+|Кќfvz­'–-pл4ЂчЧwС‹Ј%OЭ§ŽzRюЬ;<фСѓY&мIџƒ/N С•ЧКЭШЛ7V "ЦџД6"(ДbУ{h7/|иЋь7дѓ „sШ0тtF(1ѓэо^7Š1IМџŠ8ЖayOYЭ%Зe/dфм,єљn1Vэт–№Gд;ЕНGЈ”Й‚эЏSC™АCцyœФтsJ…ˆQi]C ЭС>щcЎ:А&VЪŸŽЧсY/Е#жЪ—Ћщ i Ц–:о€ЦбqOh"щ~ћ%NюбiЏ˜GњˆE(Cћlл›Кдй$гkZ'\6Б@€ЅьщbЗ‘FуД=&у9?kЩ Ÿ†ЎЅ&жMТVЊИN\J/2ь‰а&*Ў›Ц M2;Ю•@Р3Ќ—ЖŽE<йsAШ5ѕь$Ѓ•Oжюy˜SwLХб|ДwŽ>HбъЩюХsљ чt&§iЅ3,XЂђЙЉsЁFЎшЛЂ—9"ŠІYз‰˜uОƒx4LœГ,Њ6жc%Іт‰yћЉЙ Вб"Ч€ЃьoV  ЦQOZw —‘c№?fлФДцЊ VЈiЗ_[lЭXцМ\ГЉяйBг0-ь*мЁИэ"Ђf,ЎХщ#КнрдЙuHМOšЙQс‡a„r[‡!Z†!ю5ёGўIЃY#Tѕ,ъR Жљф™Й­“—:gг+N‚СъДщЂ8zФЄ†V486‹Сз/вмЬЯУ2 aЬЗКSВШ‘э5щNпJsЧ#ђч1/`ZOj/ kЯ Ss9ЮP)а‘ФБщфтБ"‘P'OeNдІ:МЬЁU& љe}ЯWн'$&мс3п>‡r [—єУэIсЇУ К‚ѕ^Wы$ŠЧ?…'п†мhw+*Ÿ~я:ё*ЇЃ‘Ѓb 33ЙKъеOЃ|Р$2„б…ey9sДЦn?У[бВнСб‰kвNџЂХ”єЧ§;ИЩФлкђfщ]фIОˆ Э`Щm9rЧ4nhб„7/зГmЌњЭ ф ёШAќќ—Bћ,шь[лQЯјд‡јнR–?л9џjё~3 ЫУ/jз'џ2нg€uŠ;УгЂybљš|'cыzз _(юЃІz ќ Єн“юь’ЮlMV—ŠЬb0…ъЎз}\ЇЫЖ ŸVЕACеM52UЇТ№c…†`ц"­ўќЄpХЪ$ЄžўЧG1ї )€‡3>R§—›ю(j+фв™– 5œ$ќ"чC2 ЫЯЊ$ +‰/5шўУІjƒlУg4‘н2Б-Y%ѓч€Ц5ЮАŸ2Ž,k|ƒЪ6Џ=b ѓх W[ыЊХ†€5эpfLqЭ-юm ю/в•žВдЄпжoѕЂBTFсžьышЖїћH€эtё#DКpэа5a˜|„ЁЯПХ‘mMNnЄИ ›ЬDщ<Ю­šр&xaUЈžх ,B!Р}Вчk`єу‡,…ёEu}У)я“пVњГЩ­хb/BНє&ъЊoKѓЌќс-bяш'НК.…Mлр–CœѓUњлFѓwЯНŠьшЧќЖЎœ–™К*ziєр’”Ž>Щ(%…y@ьќд:&Ўў\БЮ­а~MћЁ”_&ЃЃBž§lюXsfх >‡Ї( Ь\žI•я3Ё+є†6’hе |›DЭ|И†%‘}\Ј` w'МW‚bGVp\…KиGЭсў8VЁ0€sьИњщЃюcЫ ~9yњ†Mј5[ŸšFиtЉАveЪЄd`сєZƒПМFzгдЖF§ZWяMaТjло‹НOо_ œз qY—ќmYDшD-"nЋ9ћ•(о5-~ХFљCе=Є$Њ 'мЦdiьoJ .D§њj^ˆ—,џ;шІb%їьЯ›И*ЮЅ‰“БхљХ&§8i#:нўeЩФz%јrw‘ыGeZ‰hС‘5шS`їd0Ќг^ŸГzэgRBЭХсМѓ’+іLrТђы\*ЌPЋN"Џ„oыє[ЛŸгIюа/Xˆ6Ыg—pг*Ÿ…Cu/пƒ!ƒT‘=|šHSДe;фt*@AfKjЉ.§‹:ˆНэ=#DpiлНJї†C^Г ,tўХbGпАс BРћM1Ь–kл ‘<єzыЈОšђјЈљ`pѓ}РШhЅ;&ЙіKёЉ6<В­МЙ‘•№ў№М}НДЄм)/д–№НџZPUЁкzЊЄ%–€‹kДIРЃ=m%ю4яЫИџ3юdЛтf[Ћцќ.њ­WM >NќЈqЕ ОуХ‰ьИ‚мЅ+qЄ€tыЈsђЃ ј1;iЗFаVdвП Э‘№r4f‰з8~Я‹<4мN5-+žдяшбщ(Ё‡ЁфŒ:яРщњвтƒ …АљяГeд!Ї…zjgлЦ<вuћяЗwНфTЃ€‘3­R`џlN‘ы4›P№Lб8я.*аЕЌФ7P€avP1;З›%НэW”}юЧъўВ‘!тF*‡Ѓ&њХ”Ž0hГДj6n3ШПЕѕЛГQ!r[еœKѓйЮџ*rЖБgйЉЋў7йјЗ Ќыf+зMb2ŠqЭ’8і§QЊ*ЮЪL ‰ЕЬoз§_&?=І Оы’Hіеaf>з™9РћёрМdЗГљЌъqєЂS5всƒлЇмыъROТ:мжF%†Ѕv!тъУTи=кo ВЏDЂџCГ^q-ПУЗ"ј qфP%ўyzЮ 2›жш{œђ,гZ>№?ЪА]ƒьŠbАх1hэТ ”ja­Ÿє€Ѕ…U§‡SŸr б.aЯe€ЎЫ§я њРz˜ўROщФ“Ю~cY N ]АсЂ*J„|„ЇиИ?cЈУы3a?Їю мь™з‚Ымї§^$ђКЌŸ…0.vЧе@№‘‡T-pЪєE•H˜ВџL/ы.АЌьЪМ_œт'R{e(ЦДД2Тœ+І№ьч6ИьuОлОцЩcЂ)ящUNІ\Нoы<ўС{т>›AјbГСђr™Я‡г ЌЃЃт6х–_ДPщф“ h='ž/Ср’ёЪ єгд’M‰Bо"ŒŒ]єПЈћЌG0у”xНЩ-^ьй“яЛ*рcŠ`№mГXWямgЦйРИEkd`vкЁощ7‹xœэWœŠŠ‡}ОoQjЋXпGьQэrЌ^,a k=шšŒMWMЎUюєrZГИљs.€їњ5йz<чшƒЈXД4j}#дTыч6Я|Ц­(?Л§ТизEыЯzйFžњЅЌРМ^с&\Ё\зл`œ\Ъ–p^•–НЏvƒ)™ЗѕMМy™ І6йrlЙw%ЎJ;!ЈУИфж6XУрюtS6БkŠ™>„1Rœ~"n0ЬћІ'бЬБeОmЌюВић<ƒT1ж3Ѕ^tЇE@фhqнй:ДKу+K ЃщўхPd‘} г"+ ИрŒdќjLє,V'iG$gТю™iМ/C)Ћ8#­=$lЈEдЩф§fJH4bP•с)я1\„9‰<ЮБ2^ŒkцNє=“Qљ_юя5mnЁ,šq’Z+Hіoє…{†КШšЪЉ#J/7ЖIO7SЬ[Ц;юсLš,|oG)œŒрa bл›џu[”ёи3bKœLt„ЪЃ§хЇ5їќЉ€Mй€АЭЮ'сu*Pѕ`~хsЅП!ѕм0ЁCїЮn­\{ЅёЖ`+! Р9XN•я—S№кФѕV!š†"Х?g м#[…о“ЮќєЉкDUг8c1.вjб;NнpŒ-!ѕ–Ічлˆ,ƒє|зїV-{!}:~ї;У­НdуbD†а Ж›,BЕ|Œх5ј@Ђрq`РИ-)*mХCйЮRЫ˜Ы_ї=Ÿ‚'}m­Зј›_nмtЩў?gЄРtФIaP: Ђ8|ДпёђpŒ2ЂљЪНўиГXsЌ`ў-’ќSk §;Н 4Џ-Ў,ЁЗс’w,G.ТЃHŠАt^ћї †DP8–Ы$zeBЕ5ѕY˜u~ ”ьёьЩ‹š}й,œцDИДКŠ6ЁїG&›-Жўe-M5я‰…јŽ)д,xсЃr Мљ3‘ІЪэПNЦ1yŠЕзЃ}ћ—ЈоБЄ12iO%.цн­{__[kЦс)д™>l8—{Є^Л?њыљpK~ю^”сЗ,›r§mр №š?ж6Ѓ|*iQЙN<з›Šќ Сˆі2]Цфx˜ьмДМ˜ )ЛњNŠbХ2дVKЉЫ^Ю<хжђЂ2:72'бz™Ž"т№„tњˆЉN}† xV6ŽOНMЦїІ˜l@ƒ(!T‹зТРMЃуїx‡!JЉWЕUзАК­uю~wіЬt_n­Ј^јv ђtЈЖaG§fлщkЪAMVчх EgvўЌ(ЖиŸœ€Šь„cоЪJ=I‰RФ@–ф6|bВ}”N[”dˆУ^Д‹%| loчLд шГоHя жOїJЕЄњМAа_ыаoСИД‹љAфi8%wЎ…q\ыtу8ўлwY’ЕwgDЭ–!т]7I…+EХЪ“(/;f”pTn/ёU7њŽИ‰‘Wя—ЄSњчвРŠь’ZшЗИemм&{ђЏЏОTvЛЉHа +˜%а‡™kExEТ$˜Ь?'C7€’ЫјЂЭНœ кћrХŠъпз6эt8"Ъc§ьлП(юsаHНEёп.Є(q‘ ї| Х1Œe?яуoхю ЄьХж+чр(НЕ//иРњбNl{шь снчэЁ[H-yfk†неЭ›uaF-=ШlџКž`шЙ‡$Е65м&hIŒŠ?ЛЦгw:ОŸhї–mл˜ђ0ж}™ы*‡ <-;Иx]бVЏ3Y#-j!HДНG‹YšyкЬЫ№вР!Х^ЇдjЙАпGЮ[д.Œђš„$)јяkЅИ˜vU@ЉэXIœlўL[#о­ЙЋЂ 2L„Љ8šђ `мJ\jсCтhВ:lМ%мЬ4ДюД -HЯn ­ФЄS@ёDKdџ2E!SЌшџ[xipо…к|wŠлзѓa§ВЋзhиr+бЈ?ѕ7zFЧ]і…%t8/Ђ*@ї“–†тц?Wm’ДЖ№ЮФ­wUліЯ5Œ4ŒдnјSikVYА~ЩВf}‘Q\–хB[Эъ0ƒŽ~`9в+€ъХЫ %,m†ўlƒ“нœэз?M Ц–ьэg(пZеpѓ;„єp БТЯ&ш+“6ИMSs‡Яhц Џzън#ЫYђбѕЪЫ,RKг›Ўƒ\ƒЉєHцmркЙ,ўЂ™о›ЕГЏўЛ8эXЉ<цz`Нq˜ЭЖњјЦГ<$ CЮ–эF1Н‚ШЭcGњрpBлdъAAaс[њ§1љћ  ЁžГЄ`9зМЄ˜яЪьйРц™^ ИФЦaФаˆБB=Д…­i‘їQ=П SезC№‘А§ѓrЄ єœс_OаCЎxНŸм§пЁ/™“>Ч_•њ>ъOоdэ—йхUВ-…y1dї о Ї‚ћчT(8ŠэA– *уŠ_!štРАƒрЫƒїš‘Тќ7СМЊ№ј’aulŸЪeнШшЇI–УКЦМж(2ШŸБ1пOМwМОФрcЋ4ѕюGі‚DНb|%—EpЛ6…Чь‚%к–гHщˆx|Wдn§Ј2.ждсšђаЬ=pбЌR|.ŽЉгжYэ0‚ь{4TP$E[ЋЉ"М C 2ЊRѕкЇLHЛQ?Ÿ(Їd—chvГАw90­ZЪ- GЛ–ry;FlЛZ)=Е=†sCM7lIdЊюrmР~ƒcz…еc_w“WuБУjПбLlƒеЗгС$Є’чFWYR§SAЦxœьuеy5г№<фэMŠ(њА-0џw7чmtIy/‹5В–ѓ*‚ы^xС/­ѓZ„­('•™”—YГ]їЅR #љ7Я‹hи ЎЛ›:ЬЫbU ]Л}lКXр(щ… Н-,­‚/Sm`huqсБScLJї›зœйХай8ŠtzЧЃАб$OШљц<я?Ѓ(іѕ'']gрыž`ЌoЅLU‹…4ъвйc|Ц:H^`rз– Рд?>ašVе(_gŒ8ѓ eиЦЈ5цЦ=Ь<­)ЕЩšmlз3СЖ>љЯђEX.ДжЪ‡јеВГFћv_‡нWOйЋz–ЉP)їиŸ8ˆъKќ1Кq‹gqб†s-МsŒЬtpL$#'˜ќѓGЙ)ЧэGŠr1QXЋка‹Ь˜Ћ(W˜Їy§Ђ'ЬTfoп‹етйз6љяLіГƒАŠ`оЩM:›V UЎУ7зљRЬьšБўЃШŠО‚Wl’E)‰лн+HVГ@&€-^јЇ*ш5\щОєUЦю5x0)[б]r}wž ƒT№S’CY$рч,^я™9Я ОЧшXвЮЁЅk0х'с7ѓН›љ^їЌАФOзн”zCєœКзЮІУji”W ŸњјWХХСКŒ‘$„‘œлrЗ(!"gi`€vЎB—8Млъ'=Œп5џо ќ‹@Ыn№jё#*(qe5№Oш>Чƒf-`2ЃЪl@§Dжjњ•И)ЖВlьME5?КŒэ2{~…GSRч‘жЬf =ь>7_џcbЊЊˆц2бЭр`Nk AР…lт–ц€ t­ЪУ97pЉ,Q.Q––(Пєx"šjЄ\š*eИ Вцщž§ ?CюрnѓўО+oЗ‡wІЫ#žІ^:ы–УЙЙhвБ!z76;“9ЋЇ­L8Ь2mcs@~ь{E9вV‘0с­>[гЙЕЪТъГOџ‘sEї;O.юуУJrэtёН„%ПdmИ7ГАНEH†–iE›’Z|Dнi mF#Z=‘5п.жйшжав“ўј}ЎШLџ]–:Л 8zВ ˜!эєћN~u'ш(wБPыр…ьz‰ž)УЂ­цU.1Щce; Њ){ŒVMyхМКQ Биvk(k‘n ‚ŠŠ';_еЯ yŸU(ш>OZ^’‚G ЫДцF_НlOП}|ъъї!Ј“=л›Џs‰а+$*Јљ*JмV ЉЯї}МKсtT š[Ћ™Фb­ш]>Lz€zь y;ц>)ќж7Ьоби.N3“ркзџДр™‘МЏVА ™=цчдЕ'GЖz–Бь6Zљњ??и=Ч№ЊљфДЂUkєЂдЅјФŠnP"йš ѕšі№^9‘М6•Дkšю>& 54!§m‹ђZpzьTэ`ІжНvбjҘпЎПЏˆе‘98Q p ЎŽХpЇџ”„А“žєџ_›ГЄ@Wў8—p]ъЩк!+зHЁ'бФy вGBŸ1ŠщЄь3GZ=ДЄ[bnМwЪС _Жц3|QqB^ыч2qѕz)ЧЊџEa М”ь+sх%bВH>pЖ(‡Z‰ГVЁ‚hqг§0ДХїЕ\ ~Љp›Rає‡™fВ№ШиwEТхB5x‹ƒG$ Ё#T`•ѓ’Ї– ћЯћkЛ—“м.ћ ­ZЫk]pц1Js~впЄ}ДwЃ чJЇOюQW ПєVКР]iћЪ1ИнмП\ЃФц&‰M4[!ЌcФ7Ю9~нЕmр:хXMнПa’ŒЌвUХ AЋяoЊ ю.Wљ$69ЗKN„“еђШ†іћ™'№Žь‰_С]яЗљЗ§0[QЫ†є>‰ќѕзЉтЈn iАЇ}jƒTzLЃP oy ~зgBС„Bt.)v[~ОoCхIGб'ћЦD”x`ˆDйрwю3ьT№.xdq[у ;Žбhly…ф40, T8ЏоqBу#9ЛТ~™+ЫЛй Яа6Эпab ž` ь(ћpј‘ЏВB6Чц™›XЦрАzž%лVl]ў|aЄ#KЇTОИ–$’cgR1L#і„й ы›!є™7h&вщpф7U?ЇoZ ‚Sr6•ўDpaс5?#vЮ% ”oЉvSo‹ј›пОр4‰@ НИeGдБ— ЪъУєZщ Ђwб_(’"џ€ЄьчC<[@ ­<џ%Ёm;PIЁьџMЊРж()l33!fэ[qГїVZouQN8Ќъ2ƒєЦFh4 fоKokЭ_ž\3м6˜ІуџЗSm_VBd.& R&Ч—ž|-ІЗiZ7х`C`ЕжЎњеjЦJйБ%ъJЬPЦ•jЕ*Ы$эƒy€ ŽN‡rхј№c §ЂŠFBˆпœРИЭ?pgг Сa<%ъі6ŽюZ‡ˆ&ялqqƒAбvS{zK)‚NJ,%œMwTUozˆЛъ Œэ/зфpІdBь'hx+Eы}ш~CF2АЅ-Š#šљрГdу%`М‘W­=žкHƒЇЋЭј‘­пуhD2ЪжS}ь\ЏЯœіЏ›A2?7Бp€xŸЅЈyДZтъюKвС-šX\ePТMБsЖ№qxMxБo8Т%Šє4M);Г #н‰ /sћŒНЇ7:№&`ЭPЋsœ€­ БГ ycНЅz~F­лЈ-Ў=‰QёкA_СЌ“ь+нь˜ф'т_ …aЁФ4Wћn& ћrRRь2Бн$(qїШ™/MИѕ Њ"Ў:ЎммИIbаицDЬъbІkЬюј›А!ЋвіфHm Ё˜5ј("ЗnckžУяHчВсGяpЄЪЦzЛaq=r9KЁщоRу` Ёš‰‚g(7]Є›БА9 ХЌЯЄX˜эмLU+-VТэЋPИЉэVrэ Пртъ,˜X† -`щ€ф?Ѕ­Ј™з3Т(+UЊaЪЄПл š[О4КWŸАЪ­Ыл'l‹uФW|э`I['чŠlэЃМЩЫ8Ѕ5„љ)хa_?a>#Єйx~3жM†њм|3Цб$@'yT`;О+xКсP€~в™ЉЂ” œфP‹ьч[ЮsnщдџD‚чVL[ц q•E{„Ÿ[dt­sVKџ+aс8SBЂ‘ЬЈ8}[7hIкE‘K@ТЏц‹MR рШЉЏBхŽ кЃ-xц%FCMЪыFХцТq9фŒUёjС‹•ЦZсNз^щ9_H% ФЫџш=‡КГ$8}QФдЏ9а0‰ь|_ЎШu*џя’М'Ёг8XLКЦ{ЦžгzqЪKЩšqЉŸцђёcќћРLŸS8ŒZлДF’aдaіD$і|аюcжG@+/ŽkFпы{ФuщЈ‹ЯФэ ЖJн@ь{вd[‹чw‘š ИіэўQьѓx`лœ кЖ~8еJ H†}щєЮУЦеadа.Л&œЪ‹qыЌр9lЕ]ГТ1ŸvXЃ  O:_пQЯlgwьх2–5Ы/Ю‹с›рЌtC&ъЮЏОАщЋ!Є††bGVфGuюЧкеŸ†62ЅћЪ‚& R/ШРG•[WXX™ њЙ|(ЂьюШЬќЙ9DІюанСзy|(ќe3ofЏVeѓХqиФZє 9вњ{ŒЮќІ &wWL„юЭ'$Ы!d ƒ(асўdџ:ч№€xхŽ…сeЄБˆЃЉ4"йtш„јX:эьk|<$ŒL‡ЌчЦеCwфkSЉSJwkёdZinBM*FXь;ц ™лутйmЇ€сefEЄ`Ъ—i_ ™ы9KџNˆПтgkXƒ(ѓ–dІзсŽw„—НјzœБmm02еelЏ2Tђ*ЄMЏaKђ%š™w!ю#\’…НбЄєПЛХ@‚!?H‰z9,ЎfBтЋвTИЂџPјiџ`_<бEфoсуJQKVшfЦBПБV|‡щБ•дНЮžЋк'ї_щ.1=0ьъX– @…/›ZЂђˆH™ПЉ?G"bt‚[pŽШХЗ”&—l;TЧЃ–ќXУі‚“LмNl‰nkuшPыG Ѕb/З“пƒюKТlšЬЧиКЬЧЬF[п#sЌЙPѕЋ?`QˆtЄ(~MќляyёѕО‰T}Ї‘•&;й‹hЅ­…И! €™с6Ж}ѓDйNikB=ІfŽЫЋК­цЧіўТйж­q‹•Ђ7Рaєiw—IЭAAJ;V/ы‹аЂзПЌ`(IЊЊџ№ЉяЈыгa§ћ|йEtmdм‰piЉП+’ѓљыњ~„''і‹Џоо~]ѕvн,јiYGMЂ{ў)СIЄ†:Е[ІІаи|rе*sЮf•2NY–ьчхDuƒA$#˜œl^74ѓHfи\2ЕзBNaЧЂGRАžЌДгW-sžи-*ZaaШќюSрРщRŽХЌЦШњˆЏ}ЩяЎ ЈqZЩ~Rйќu/Дфc83 —ёОbтvv&ž‡<зE™sNЬJьЖ:лЩ—vc/k8жT Џї“КШђDNK?Х@j>€Šь„!q€ќvr,…QыЃхcFьTH‡ч# ЂЫ\>~хX!єЮq{з=D9T9ž ‡Йя‡š=Q}Чj* IМТхђ8$0 Ц лЄЙrZнHlBЛvKz6(k€Ѕоo ~ж~*Єy гЛЖХз„фЧ€*,Єй p\6н/:Рˆь|ОQ)GKЈчq*l-Т(Zё =K)~@хдATру}vm/UЙŸдcAРќhр q/™6ЈњёЌŠ†–бћеоЬВ‡ЖЮh‘veыў0ё SЂ–EЕў?ю/|$K’‘ 0QѓМ‰yna\жй#5zюы0m`ZDсг–юИf˜!KYАь }ьЩuСžNIZTXи$Ђ“ќ„Œ-дYZ'F(1umч}ŽjЭщdU]‡5Т0l=@Иъ'uPА@шМЩ тiє9Њјx‡Уям§ї_ŒAc\jdМi_fъЛ G3Gю."ЧЌnъyК10ЉЄЈЄ ї{к’+Qє tыЅоlєНО—Уё„И… ~Ѕў`‡ѓ; M?е3ѓXВŠ"ОrЦ*ШZюэ­cЖ1Ќw/Оц„#Aq.3kаыбиЫkтІ+ЫВkБGpjЛ9\p2Ÿ *=ОШWt0Ј4‰/’дЖ0ЛЛТџ,HMœИс!FWЙŸў€…ыЁ3чЪkдм‘ЁFTШЇ”Ѓ§"SнNŸкbќЏЂESцЗšфVAођУ3ъЄtомІWdŒFеЏ1 6oуo@ ЊысPx"ƒš‰nіЌћWJSŠйзћинeМэ9†ОЮgq§ў!„$lЊрЪgъи”аM›š‘=AМvїј“ы4’]РQ…?[`z„> wЊї Uлѕ}X~tiЭ”АQЗГА/ЧИ‚—”hOыїsiDх@И D§Ќ$^nЁЁЫЯ~[ћ ‘ Ьл€v&…Kях ыуЬ‚bGmђ—,№™…ZX,"­АЛщ_“ЊЕ0qп] є§eпOЌ!ьЉКwрђˆн} šяАGї€МыЫXЃАCd#оШўо_6FE/Епр“†БLцќё&(ˆ§jю”G;D qK3~ЫъБь€­ТзЋ.гЄa^УбЉЬa­Р”R}уо8Е­‹kмTЯ v‚`ЅП;YЛoњ€<0јlм<єЭЁюa/№'*иk7tЯ|№kС  „ƒW7?Пя’УЋєАОлх2хуС€Џцr'‰Ф­hЪ­‹yйˆgсn[=e;дŠВьюиƒќЗPh›ЉЊWеkžk.ІлM–ƒ,чs/Ёž…zюB2%WЫ€oQЯ2ѕЁх{žГ чuњЦ[Ялd,/'cфм]гчє%жЧЬŒкOo“&д(CxJвoOъšiО%Т…qТWvЏ„šѓD–щ&НЙTВŠ”Ќ\рp|њП@Ю6ю^#(ј.†я2i$ЫеhжQRзT(Ў &|/­НБXKp8c::'wэ Їьч|KN‘?zl%fP1wo@ї;№rqЙuTA8АР№СˆљЈ-škoX’=ЫьlЫa†C&•-ZнKеЄlrP9ЬЏЈwћolRС ’r_ХМЏdИl _сqћŠ/аeЧRл`NЅЗŠРœ ЭŠH3шSђ{&žьЮў‚}[т™Q–0†WќЫGI} Зš?І{’zžkq КЯпtpиЪQфЏьƒчО*ьЁк§!хœ ƒ5

gКЌIlЫЙ єƒа\ЅxЛs/™4gŽьДj-GЯG7pёСPG“Вђа2m>еygЮ‰9IqцЌщnAДо {crVœIZj(ыРО./ЌиПўяRШHЈ#>А„рА’‘И €Ь.ГђќзP™ьщЁс…@яХзоЇшЉЩ#в7јi` MьШЬyЫF LaX9Њц~Jал•уŽf&+‡+H3еЃ/Ы5<хK?0}цhыЕb~‡„~šіо"И|#—іоў+„Žэtg…’їЉ[h+^е]фbщЕ§_К#o(Я1fЎyмЮ|c(?ЕXЊВ#“C”Й<=˜о~;œь‰М8Žўr™њКNdyКˆТ Щ7xыs №\[ЛЫ<xФ,ў!Ѕ9HЄ•ЅХћђ}|ЋѓѕђЭmoJЪzњŽŒОші€эzэн tдmŽЮІлхMirШ‘YЩФgТо2уŒ@oії 7{›іX–єёЕ­ˆЗФ„ЋВъOпB&cГ?-H}Њю?^@лБKmадПš+-ђѕ.;†ЩpлУЯя&Т9СTY†ЖЉP~ЉЬuПр–)—%?ŸЮц Ÿб'X„э?6O ŸyіЇЌžeЎУ:bˆ›мсДHЮЬЏUЗUfцGœЧНКЬЛ ePcЄяБКMлЂѓщР%†_ћZ?тˆ“в­Mw*эoа†цДгх˜ŠЯКЕfˆ'рƒИ€ЭАЦѓkЦО$ёлRДŠEЬЧ3(!џ7C œ"љ*~ь}’~Y‘–E`і2ъВр‚C%№xŠ…-ƒs-Єџbр №`5бšёз,oњ\Д@є9ыS(Ž{а;єЛg)ЄЏz$XŸЦ7ЇНЋpjŘȸpыTƒžкП+ђ[Ќ@ЉsК|~е`Ђ‡oL‹P7біђ_'6‡nnьzЉFf*ЛЯнcs2іУЎtЕoгЋЇщ…БH sлjЌмТ фЕв)џ‹Iо‹’zіqX%[ўDBc•ОЧHE(ыбй›_€ ее„фљdА„Њ|LЗtBŸt!HЎMц“XMt–%я`vыШбЮ†Ih‹Нiѕ:ьuЭZYZa$kзє™жŸР[џxY"UЪљЖi"ЈжЖnW( œ~œи,R}cГW^lžнў‘‘ђH˜•ф)С ОЗЙЛЉъTщП7UэЛДяФЙюг5шдїЮO 8^‚ќveВђrы:œЩ№/вунгЄ[Њ'№sыуMœ i~ЗжУЗ8бс~–Ю™eŒ9#ЕIP7ШобJѓ|фХбнvœ@9вЄRм7ВhџЏиU5№qтЮЃдk<ЏЭ%“3. ZjЁ@G:TVХ‰–рAz ы5g M‘,цуІ1аUџZN`c!"ЌXVcІRŽ$БWTЧАГq@Pшк…є Z•Mv2vѕ`ƒЯ6zГwМЇDnŸух‡ОЬv"ЪЈЉЇ'Иuё”њѕј}ŸFTЮ–y(gћЇ™ДяСГL•Ц~МЇW­„РэМ†Уљ7„*CКb+АицУХh€Їьƒrv›оf(!A>куж}5Hџ\і7„тыЉшG)SЊŠЪƒ/Rџnw~aвПСЯsH ЄЕ*>"/эbДЫ 3(Ъe^БšЌ5і%нpфSBї’A$ђLгTЌ"]5юMPЅ,><А ј“ŽJЬю˜Džј‘‘7}ŠД Џ1уХЏёВѓc…_tћG8кі—ъѕеЬЎл_АLjrРДьeЉ ‡чtѕy їVЕц0х"dJ&>7&qіІ?vc pйищai^vМkЉЉ7№рO„‰ŠоœЁ.NѕсЁ–цcнж-z“OJ[Ъ IСJіAТeЙПvdЖxоЭ’R€Ђ Ѓ+eЋУ3Ч;џW9ЃсЬ<’Ћ˜ФЄРѓЎРs‘wYП–ЃЙьnDIгѕtpa:Ъч•Љтщm?ŽДІ—_ОCh€њ™ЈM‹А!*2‰шhЋьeІ]ФЬ?ѕžuf d„х7џ3'ЙKФ+0‘ЙV+§Ў<-]г‚Y[-ёЅжК‚ЛoуŒё§$№cм‹bi'ју/бgТ­Xž^2ёkЧ:ЎЌБ3ŽЯhгш_t6ЙЂl˜`ZЊ Z—Ие fFбŠ@.Uj?ЫиrРKA:ЩЧȝэ{k юе– XŠУqщпsgю{рТwСОШyТгэ5\§fmљ %kїyDђЧиQWЏьЬmЛplЏ‡іPЕД аЂѓУцчd.иLЈ|R53™x%гЪ"Ъ/5й1ћВАИU$Х^?ЖЧмjЯlЬЏФbХћЇъўмЧ­m”ћѕШўѕ [—и^љЪыY_хьyІ&Ъ7ЃэDќѓћlЩь5{ЂЇIy:лv ѕБ €Љ/lќmћС‰гBnkр;ж„ЪпJУfaщщ.˜j=,aОЊ•ьСKб w =)ftfпђјжPгBˆіЩБSањЋ%92ќчjЈС-z96UЎH(А(„ a!СST$ S|М~bs sŒђ`не€Л+їЪгџGg`ФeHёš•эMЩˆhЋ<(Sдy–Р‰=‚Я–ўЧR) жr0-Э5­ бЦрXЖT,B7w•(7ЁЎ$ќ1Ы•gТ ЊKƒ•v›ЯщљИц;ŸтБќ&-S"Rк unC`ћkј-Q „ліп”7хeд-Аџt˜ПŸіЋEЪ$ZP‹№БЪдќ6ј'т4Нцѓ—Ьъ/г}X€—эш‘ЇЄHЃфYK-§б~z­R^$4рi‡W4сљGo5?WТ„ьІ вЃл2зѕЬY3ъІъe $wФ“*}Ф'щ•!дЩX…6qL ‘аьаЗŸПšOю§P{@ОЃhђЯ2џ‡І}іѕЗј(oGиNB8!{BЂЄня•UЇd6…qОrŠ›Оu憋?yдyŠэm5oEФЛЫ)ћЈѕMt‹D•mљоUmБu?А|ј‰щх…Ь*7ѕ8ПLrŠ г?[Ы‹ 9QшЌ1_RЙQЭрпяСН'ы4Бгуш]AѕЏ sH ТwФМЄ,ў|EЦTФЋ,E‘і_‡-aj]7wјRJЛЁWРи‡љ; ЪšШ: ƒыŒЧН›4?Тф‹ЦяPChўи§-QБь?вд4їeЌЁЖы„e‹н›4•„=ЅдЧ|ТуsžLћ~–KЄ˜Œь‹OhjЯ‰V ˜€д„§ЅЇ1{і`у@fxuЉ [КpŽХ}ЈCъ „=ЈчЃып<эnIRzэ{Œ†ю!ЏЪ(ъQTš_Ѕ.}QЬа™Ю>ЗQ(bŸ9ДmLљѓчЗЁжН f=пrшmф‘ˆЋќpPGNЋЮ‡uсЃŒЛмЄ ZаЩ6NGЄр1RuІСЦ­ ё5Ы‚ЭТТiQEЦ Г амцcцOўЬ…eBнŸОНў'sŒb?фwьі Ч%ЭU*A9œnЭАmЉ)JЦж™ЅqАЅŒ†Gѕ”f/.К锉kШ­ƒ‡$з‚Нyxи0я-]ЌќаMpО!%œЯдœј.щVSвОzб?Э§QIcмбШИЦЏЊsтѓЈ?4Ш]ѓ М†о'Ppь{hћmoюЎЧ/oКlWl]ФПŒ"‡=gD"‡Ј cѓѕА “БЛГSBŒdhŒХПЁ-`№"†ZМР^M ^уё"Лv“сѓт†Ѓ z2r€ї6 ™zy€dv\кзЧё6ЩHшб е[трIё@эAЫVb•vњЌИ…$Q]P“M;xЩЯЭ+KsЗ.ѕTFuР94@ Š}йW–тdБ=xJ„з3ЖЅDЉRсЅобгеJнˆ—ыFС‰ЁЪVЫbƒvUcэиЋ›3ГSnp2Гb;Ѕ5šТт–eУЕ<шжkд ЖЋЏW"ЅЊжvКЄ —ьмх3ШY'ЂФђDLШнїжї…0s0QЬ­лPS'\$™шгтnцn€TЧї{эЕЫŒ}мЁ ƒЧDBzCУШнЌNсЪXAѕзѓ?йЗз\KХ+ ф’ХЂ&1†ЎяlЏН‹w'њM…”џчХ>эУ@Њ.Г‹1?|Ÿ?l:]Й5Ъ ошрЭЕщ5ѕ7№їN Ѕ€љѕBvLјРРqЖРA# ЋЊ€М2цєkДOр>щ}y™ЁOC˜p))wЂhЃ4 п›ё6Sь@†€[Нs6}Bг2ЁcКiMСђj‘:ƒ€ХЉЛbZЇБfжoёѓЋКщ;п ЃŠ(ю:гJcИL ЊЗщtTH3lВШ$МžŠHˆoЬ„осf{(n|ЋвтеsСcЄ@аубƒ$щСЋu>жѕ]ЊyАЮ §]U13qиg}щ>QFBŽ‚0IiёэDAмzNќѕ 60й’нвWЮ‰#3ѕ ­Y ЧVŒЩс^{˜~ХšА7ј)йѕhk‡Љ…yaд’аЉР5џCk- /#РŽэAƒj nћЎЏ4Е‘дIџ ѕ}юШvРНzP|ФМ1їŸ y§ЫOtЕT Iвš!ДяIGёТƒ\ЋЖњцžUBд-ЩтЖŒˆДrНB •kGђ…˜ Ѓ–›Еr'Ф–Š5ДЎїоЉfjK|xћs9ЛИМъхt${—WХMиЌ–ьЄя~Мt3-ШsњЅч(е9•sЫ‹{§\E‚A‰w+ž§‚8)lюCЃїг{)ўХ2 Nћигнžб+ШфЇžіšиК–ыЦШ‡эВdАP&…?БqьН€ьhYщ‘r'Qџ]^ƒ?‚=7vЈ}{э ‰Зу Ф6э|Ыљ=љKi=&Ц#KЁM лј“^!0yїя-–Ю’ИбіРJYs3žЎjŸОQwЪ’Ё…K“‰v"іœŸƒчо№ђУеРŽwg_pUРя љ2Єз"Šg“%€h7JРьjMnб3EЯbЈy#йwЄ7e•аЇ#+U\јŠліёє{nХgиfH†hЎdђ†Ь;gGдѓъД=Шm?ƒBVМЦѕв2рюЌC?Ф{CO‡“їn8aЛ}gNЊ3ЈM8Є‡БTЅ nйHэ]ЂА Ы|=Ыux3ЇЅsБЕNFQ.n=ЊŸчЌŽ€•эВѓЮЎWлўˆMК™СUэnЌŽЫ•v26н‘h+Ÿпœє]ИЋIЕrшLш!Фs­ s“кВ+Ш‰ y&Ÿ0 ^Њв;p‡ќй,ЩšН11gB1azєвІYыЫ…ишgGg{“FєФЏР8 н /6S•Ќ2M[ЭкSpT _A{ЋЫЙ IвdЪМмW'б#0ŠьЃ)Ў0…{фŸmcn;ІыЁхH"зжCщ\2h& ЯZѕReзс1љzИ‹œ‰З|”O…ћSh%ыЕbхГp0й&Ож…&E‡R?ј=u‰ЯWіtСSт^Jр„J<пY}Хюƒ_Ћ1Ѕ5бБjд‹f…#;АЦ"_K7ŽфЗ•Мž€“ь`Ќр%с9пlшђБt]] ŒjХRРщ[УIэ ŸЈYiН"–­ЁfžђB^iЌx^9Ь|Q'2ZпПпЕ`„žZ) Z ^WГУznэ8к_…хГaтФ&љкьџ$ы‚Љ7Е;р@р&лв`'КЃЭёшs>zЙ4м8X hї5ˆXБl$c'Ї…dКр,<ЃьЊщЭ-g‹уT(šЭ!їXП Йs Ц4#‘2эД€№Ш‚яWоЯЌЗгњvj3ѓюЛG‹ы№ЬIьОЋЋЮН2п tlX ˆ{ЧФx@XN^є”^Ђ>>шш’Ÿl5А5DН;iAhrdK(И˜qaљХ IЩ№цљЩЙИ­рѕчЙS0ЪЈqАпСA8ђоЭCєйЋ дžэrўђS‚Ы1ќ,ƒ6…ЅоvЁxщк/џP4i– ЋJ^žCщdсЌ}NЕ(єдЬ­юЃLрkЭўiёъ&л№жЯ"“ю2*C+qоlрЅWЪњТVVѕ"Dњ$В$ќ.фёП|@?н™•Ё5ŒUк†60Ѓ5Ы% €ёСэgVОН*}ХЙћЏj=ЎЌ 'њ„Ц‹™уvRРœ–ыeх7mЪ#ЅЭQЫ‹є ђlWNрv MФЪpPб)'х@ђBЬŸ(Џг0<фњT…К фьд єЧ)М8WˆЪoіП‘’RhћhњЗ%кЙЪТ!—aъѓѕКЊтјО%ўkр.tэВ‚ЏпPЦ пžСGБS–ђяˆrш„P|4ЫAЙь/.q(ПP›lЋn{§–œыšEлэ/mh‘BŒЁ3Xѓ mз5-pаˆNжhтœd-љДBѕУ:Ю‹ѕ‹"ЛzrЁлї,З>ƒ§ „ТaG˜V>‰5IёуїВі0Зљ(еXнЅaI :м]H,'Ф){I™кVl…аmžЋйBz)!QФ rљт‹УєуЂJйщЙL$‚в_& ДЮKж’ˆО–VРšьzЁNдчSѓћ8КЕ№‰Л1 ai™K9}žˆЋѓ‘}Kv1ш'ZЉ^ЖЂK­Ћ“vГџѓЋ—1Хj*GЩщќ`8€Vz[ъљ†O’ЗdГq/V\БџкѓюUБѓМ ™1)MпTmлpЗЩ`)Ў;8ѓKЄ8љ#С>ъPžWяJ€.пћ@ьŽ{Х%ŸRžэlйюёй%§fхV"™•ž\ZŒ kGb;ЬФ;Х[§YNCq"хo.ОCp"Ё|Оѕњ•lћX˜+фцєвЉвUgјк:Dtь:CŒГў-6ИŒnŽЎlЃdp- Ÿ,F*€dВ!O{8СЯћv7E1Юs€Ды5 ‹Qй(%ЃHюZо4лaЬc:‡jh,о тšX­)€˜эA7дя†•ЏplЎгmгШxЇђˆUЎѓS!|}€чІ“шwRyС8йœ&ŸлЛЊФќŽQy(_b9ЫZН/vщЫmДiЙ/lЦQ,љŸ‹$WTœЎМ‡OŒCl3ъсПb};тŸpEY[4—ЊW.y0sшИл'žЯ14њQ№дЕяФjŽy}3˜9ЖbЦtбџU‹эE#цkiџ€#ХЖW~ІИ+КPAœЃr&ЪJœxщŒ„ѕњГнЙїЖ…ЊІEj_ўцвиѕМ%xЌnдaЪFа>і‡яЅkэRХWmзжЈŸ•л\‹<;Пэ‰\О Юњш?ШQŸх^p] чi~ŽЙн1ѕ[•dЋІ I9ЅBr7Mќ™ŠМ›ыљєЅ?K^Ё„ЌНМџlšуPд`O”$sxЏ аыˆ n* Р`~ЭЮ=ŽпfЪŒŠvoЮRК„7ВrіZ'№Дьѓъ‹Žš„Š|ёДuƒPX&.JB pМДЈSpЃŽUЮ64ъЩD‚“}ѕ3&/™ъс*D8Рйьлр”эOмЙЖ R—І6ѓ.J J~зѓœ˜BЙЁъсжm{WЃ‘rЫН'Ѓ:/be%Т~Іє~ЅuZЧZуmcХŽђЪOcLХМPћlП?рѓQ *if“ЭAI#OH—Ёџ†Ў Г](ўрoжЅiYЎЕ_№ъbБŽ$™Пx ЈxdКГHњbŒйyP№“эU§)йIё^UХqІŠPюѕ\WЂ ^fOwтаs€0k]мЌСz3a‚|ЦƒгtЈиrё?чЪ,њuі ЭщЃУР4—-žэoёэ,‹т™ZСЉ6.œђБž›[Y?§а,аTАжBЈ[=<~Ўјы.Ѓн,—‘7ЋIЛЯ$$yЯћCIЬjOД ГдэјБs+ђъ›‡MJРЇ0пœ*ЦFгДBaсŸе ЬХ4œй 0‰яЧ€‹ьЇњŸЄ6JWрˆWфд“@s4Е‹Н”ўЈ<ў™еeЅЎпь/H|ВM˜э•!pрštЈЩщ*оЫjZЂxжкcцMbEWэ”Q]Ldа‹q й%W„:/›G‹хmMдfЦIТ.ЖKD*пиќЧё(pлџДДŒэAwIљ\тЉx›іХп@У„ЮlЋE6б„|oюР8oЕэћ•.)zSм9Š/Щ‚AћL8BЄ 3пƒ_xMWu†nЬќцBSНq]жГЂ+‡g<М[Ѓx“9|r –H—ЦчšopчѕiS(39ц( Dезu5Н79ю}ЬђpŸr[яй66ЬŸьфŽ>VЎиr0Z~6юЙц4іlN]Ќ‹"-8Т&[‰4l qx†hl‹ы1Сž0Ш`eДˆH-ђЅ+Яvщ]ЅXnЯ ƒЌdиЛц+;nщ6§иŠ^{ MqІў€\ОЏН}–хТ„lшЮSэcCbЉTЗГšЩGЩяєЦфTI{љ”Ї!Х@аёю˜%CсћyQoeЎVА}—эM^е‰?Њ'‘ŸuЇє'UрўPюД\жмeEгїG­Еk‚ЭsчІЗъ)~РОю•јЭёЂEв 5=ІŽSŸЌЋэJfаkчQt Ž‚к˜Цч”х @G<‚mХ­†iЦйР:‡ƒˆГGйŒN†,WSЈt5Sь]ё 4аа)NSиƒпЅ#AйOilHЦ `@›эCЪА~§­К\Ÿм9 ЫŒэ_БPFѕ@ѕ-cƒnƒ†9bнrVђSЬvuЕФѕрЏ&Dў!Ьnd–БsцБ ЏтЩzOФjЙ ‰"хзќŽИбRњC?Ќw‘М!Of ў^`R*ЪЫњю2І‚ˆ\їМлаУ&lšчdƒ З›2’NƒžИ”}pZIДƒы”бbъњйЧЛU@јN ‘э‚н9ѓjЏЋёEтх˜{Ђ(aŸdч ьgOˆKьnџмоs\AЛXdŒICq2KЉˆQЈЖщ жpiRЧЄŒ€ёйoъp:йKЈx‰”d‘ЛїyeВќx+КяDQSЋ сcWфєРЮ.jѕлс„Јц]FV-Н@;FP?іЫ{њ-еtЭ‹њ3›’эDфX_7ћ†\1xыdюB‡,šd| mД„[( ЕЁkгЭИ:ъ д :oЏтqW?$ЪTњ Т(CjrQaјMшЃ9УЈ<цJЎ0И0ь;5ч~„ТMyркJЫˆ;кЉюПщHmdк9­псB№%ЌAшчCєК<ЦXё:E%У&\†,А%цЃгQ6XŒэ>У‹ќПмЄЫя?NЄ8zш_'йЮк6vЃHЕkїukцS)йю0CмФJ#лŸо)—ГJ“rю5Л•я)МŠf‡ E;ЫбxMКЉ –9и1,^6B‹šH{k РЋшР„u-‡ћ‹_Щ Wѓr П{§еh А:^§љ]сe#з8}[эа~Єk “ьaуD@пRkdЋћ&JFx*_Ы}tЫж,h%г+”(oc)‚xyrt•zTЕ(ь˜Ы=wЗ?РFуMБяМг`ЈђЧvyЬСs‘ђfлНТу,№Џ…НњХ€щФРШ№ŸC'ЌьпЅu/ Хс žѓ:Р•—ф-`Ф-;@вEъzB Ўe5NОpў˜ьz&1ё&тpќь9­t'ЂkЇп0‚Х.hТд=ГЭšfє6ƒTš™‰AЮ”4б$‰оВў№jЙWєЁрoš™*SVп§yWAє 4XІN;лќХ=šљіN§Ÿѕ{f`hЏрG‹o,iїЅ|Š єтVg,ea e$бEЄп~†zШjž#}пЙž"iІp,Ў€’э<Bžмki$в6-р=ЛЁWяб‡Aš:АЦђhNк„IщL`Љ5фJ†:a–ѕ=МњЌl$ЫкЖžКд"Љ't ЋŒH[Вj†У•­№DОНл7=7Ѕbа§ %.}іSДђm’#ђ3WWэbŠрC'^Jр}I; al‡Ј‰žїщпЉќяЬ0gœx(–ьюmѕя)НlЭn6Щ6:˜6ЊЏ-ха2ДXикЄЎБ)•q&їhŒTъл МP€R†f†qсWТЧ9l2иuƒ -/k\j ЙBњХœ ’UєгЎњ™Q ЁS€і€IŒЋ"М} лŸТ[Ÿšу#rо pЩy6жZђrB=сљ6кЂФрН%qјLzq€—э5йщ=ЖюD№ qеГo(а˜–/•ђ…œнє9йЎzАgР$Пa/KЎ!„жуPœеd_§meВlїRюv ь6яіŒVyс Бq+pЗПc5х’ОѕWЖо­Ќv…‹9#ђˆƒЛЮPЖecьA‚еХuЈсTЙt[V›ŠBЩ9x*‚ˆH.tї:нЧ=qпР•ь‚џЪЭR…mі7ў^е#fГЭsр?b gСюЙaд^‘ѓжЧ0PљКpёA$~uя1RвL˜‰"YТЮSœћOЇ1ёl&(ž>вЎ|н_љoаМ‡zя!z0*}ПЖBЂ”ОФьX™xѓtC’Ф&? HГžf>™і.­šщЧ;u:8/‡…ˆЭjе’Ѓў8PР*І d”ьхbЇ^ЂбСнИ–ПїѓhЌПј#J5є>Ьеў)]Ьѓ;>(){˜іeХ&њкgЁ–iіIв нHVXа­ўЗЊ•uСутs€Xз§ћиwJ8™ы.T:FUзТlЦ)€Иœ чтжxМ9ћЮPНїїѕбюSKXќbЄ™љщкДŒзї;ъбxхfч.fЋЃƒY 3aŠ5rУЊ`ЭGлšїyjн‚=Чу5і‹@ЏЅFCСљCњJњM–f ЃYЛхsљ,яtњ &Я|РљcTа]ie1Yx"ОпRЦщšЊŠѕРRmљЊжUM(\uZmjќ”ALlПс@zэВіd7юj|а*O,e­КC`VН(‹“оcеХ JБŒ]gbьe,i˜л€ŸЮ‚ЗfЯG™&Н{оЬ 3џПž›Й—§ЕВЧт`шиВ>0‚фх‹XЅцMа+окh[—.9{ІIйŒ—ж œ”DАgšылoэthз[‹.…Šf Uє>3у sєYнЮЯ‹Fр|1КЎїkI죘n0. ^ЁйЙР^vL‡ЄqіПЂЋ)ё?2ЗЄa–С4jšЂw”йlЄe|lЪП+гNД і(Щљw„5ЂїsNœјc{ьч'ЇA/з:=л№чžГ‘x4й‹3дљBxМЛТд-lтdШD&M|”ЏhcАCySRх,ЅN4'^‡vвiЮЃ–AA‘ЛL=^ХЉћIЫ tХoџ1ўЃ7ETШ;ПFA&нЕP_†њpfƒ>BІ_`ўЎZуXь_Is3mМc&яЬЛЮїА˜чЌ­(М fЁыфБ}”Няs†bŽЛ йY Ф€Ъ§•§OQWПЯzЄ3ќЦmч й РДЄ-GрЊr Ћ-М…@yь&…rЯчh`ЕэЫCsзЧ <ц˜Л@dКкesЅБ@њp{І~Ит”ЯЦТsЄ'•cФхBN†oiѓ˜ЁWh:Щ›§UygЋжЯ'Ж; KгбТђ_ЂшФ%]Ормš‹b„|ne1Ђ€ЅJ,.YоœаБќЋЖмЗ77Чьpь 9НЩЌZеxзЯГ1пПнє1nЊя6ГKїžц6ьSjgЯНљЂ#) Ђсg6ьЋgоƒoЏOPЁ љТfˆ6Ќ.€Cx;8иŽ SFЬ^Ф во/мЂНBWОк т•ШЉН­ѕW™ў8sыЂЦjЉџдwЅАеdёї›іpДЇєLєйxЕoКцXnјЌЊaёЏБƒ Љ‰mg™œНZџЫшЮРЦѕр‹C/ЏVЁч ьМ+ёЦ˜§)оСUзfЩˆ фЈ‡AеXpЈЈпГkћ7ЄLvАъЧЗЇA;›ЛЦ-ZEш}gх…М4ЕпюНBŒ+YE(ѓZ‘Ј)вС+SеэYŒощWЇюvхё™ЂGєВЪ'о!UЃ?ŸЩqA4Ќu<8ь§№т70бщЁO~С—iјGcљM0їЎћgфВЇС,„Xu-}:`фx ZnDяUиQGWJ К>ЗcжЖB[mNЦюŽXG›o-JЎжŒЖп™ёќž\‚€Вы§R+Єƒ0šЪ]FШ{џ$Тжидщг›N’]8ДР`Eебp“…#;>yDЃва‹Љыd ЃcзcˆЧcoу-†DWнаЏ›фГfЏ-ЭЁ:4щшUˆЃї"шyЦMмЬгSjДњšŽьЉўP’Ї2we”zјЮ™З/Б1ъ5Јbзmˆœ“\{Z№ZFoпƒЏДb0 *$э1В6ЩMJ4nŒš™и§–žэWмѕhlBУVЁагsW=оsѕИBЭАЉуЈЇЊŠги)к–/q/ю/,їЯ-аКuћUrг–№P0Н ЃрШьЋiюЬ$Я8˜иб…љћz (k!†фКЈяsmOШЮe…€PЬѕ€D~W›AJAcЋтRy<Ћ@џ…р$O zNЯ› ~ŽL˜ћc{ІXf@!›XЁP”ТиšЭ‰ІТД‚e›A ^Џв=™y“Jі_ХX@ЎQVлOйi:О#‚pЌМTєщ\pJ§мн#К8œ_зšР6ЊўПRГWEC0v№ђœPz •тю wwЃ€№%XЋ‹Оі)ѕw‹CiiОјoщfЧjЙЊ…Ÿѓ№$†‹6ЊбнШ& чМx)WSФVѕjЇЛ!›qM…6р€јЭЮемеh)б!‚ѓZZњ‹—л–*7ћт–јр(‚ЃР[ ~ƒ™ъQd’˜И#>нX /V1А рЅpмФG@aЦК,‡ •ЄEŒе,0.жЯF~џЬUњ=D#RѕPџ€Š!›$Ш{MВda\Е‹+ѓ$g r) ї ў;|žтРєtзбвxИšРbЮO1ТФ#ЇоЇ$ OZqМЙQа qх9XޘwЯeЇЛБея4Р:жзиŽДд|ЅЊƒž}Ј, Vj†ЪR‚RrРrŽб3Іˆjвd‰ћkмšiА”х'Šwi­КшћRЋє#‹FЎЋЌ^иЕѓV&ѓиAОєсOaW‰)є=ГнїJН,—-*њВД@5]#sљтŽ%xђеzZОь™—HЧьђјЌыAЇяx*ОмTX@жP3…ПЈeћLC%Ѓ+џЮМ~@бV!О‘я.ь­ЛќVыо€а˜c{yюkѓTЇh.4Ъп“ьлвcI–^umˆтВgъАŒя }žЬїЮСТmœУьВ=‡І€q/ЪЏAX}У qšhўЛоJгєQ˜ХыzЧпжЪVбz‰ jЈ‹о=щё_рb{юXЬ`чžEШžя„Уar?Ы5џСx"2Ъ_žgЕ h‹]{|с Sƒ_ѕхdјcЦ^<'Ё$чLФ€‰ьи}Ъ9ѓЙM‘Сеиmo0ўrЯhЪїа#DЧЈ9ЁMфбЮVfўYRMNЕЫ™l‡@&}еп%ў3SЦŽЎЏќQЅмQ~ЩОEдм<ќмГW“>ˆƒjрA?АђˆЯїЖ`TC>œ‰ЎФХxmўЗœЃЃZВбпВёŸ њнOZ€„ь лBќ—Щ(\‚5ї0iю`j3™…2f­)Yџсй‘2ЃyІ'ўZъїWf­—ї–ћЕHк №šWPе<Щц <28­џБЎvzv­яhžшЪП3ˆ.iJ2Š›l4>YVэАЁ‹ЄzіНю ‹&DˆѓпvСН/z^ŽМ1‚ЉD’ь н‡;Кri$ŒboЗ_е‘и ЖРѓДъeч#ЦhVЃZ"Зt6ЭП"ХјPx—ик%­#ЦKW}HЏб—02и0ь XV„С‚хЇ’wJAМЁf6 †Tм|ЗОФАжEёUеˆЭQЇdQd‰ц_L™KП–ˆѓЄ!xрЪНKбстЎюŽЙиЏйћ”:Q€Œь–аЃƒ$P^ў=Aј‹EЫJŽNУЋБИBŒr лDѓ5`ТAVTw™КШОО‰ЖЋE>TћьіЕЖТгmMsж|Џ№•ФС*пwзrГя:­“:E:€ІgЦ”WсЙ{зЁo †Pџ%!Е5 ь‡(й}њŠсЁ6тBаF‘nљ“Ћ^;­|ІэЁQЩЖћє >~}ђ|Ч’ќяJdд(lpyЁ˜ yCЩ…'WЙ”ЧuVиИKuБƒ-ОbОyИK™L yo3$KоQNDyлюл m0[­/…Ÿ#йЧм4йЫКyЏ%ЩШvъићєКA@уФ—Q˜јРЎ?Rк8TKX€јc`MЭЕp-ХcŠЬЃ(ЄŒ›лв,§цm;]Ю*ўŒЗsZ›†˜’элѓ!Ы{ѓщ№3Re~}/.bp–3ЋЩэлz•GІh^<щ”§Ÿ3|ьb”Ѓt€ЈюJЩХ[~jWЂOQˆ $Ж|QК7„хxшиtЭ У!їЏХи1пMЖrg8ŽяО †NgхТT“QfЦёo:§aQLНх§bзжеEЫњMЕƒй#Щ‘ŽАYvdьш˜ЧцSц•єВю–Е‡ъм„ао˜ДWЉуDлrЊm:Д( з_:pЭЮT`J‚5ДЧзЛŠ?OТ§ж€ъ-WсшА уяVбА&ЃŸ;Ч:РЙYNfЮЏEкТNвJPHБЊ›цjЧ#BFm€Ж{€й&ќa?уV"ŒжЕEзН59>CВ›ЂŠ!]Œьл—вХP…;^Въы‹ќд )ЎM )QДЈyз,№EŽЮяMћKGsОо™0 cїtЖŸWŽн Ж‚nЅlg‘$>“ыnкъг­ПБ/€ЬЙєзуљЊ^O–КL*ї|]Ž„>+Іп~йА—ЉALiCVb}СН'QШ­0PЄ§œЖО e…1„с`aeMс/p™K6Ѓї/ьХ‰йASљпGŸy5ˆеЈШjzмVmјœѓ™E|97…_›|95ї " ^rtыЄ­Z€ЃЧkЁнƒВ™МЧ7r„%эW{ Љ *8NfC$яѓKgO§ь }хx Ъ`ѕ1M4"кч>Q№МзoŸ.9vІ!YљЛж?=ЭŸєО=Й…‘ЯдйXБ†ц‹єЁ(.Чћ­G‘ы‡=\ЌоZr„U{ШјЄB\ зЁˆљЈ№s"E…@J"œёUлъ?mƒеyХІЩ ЊЊћэ№™ћ+•‰Д{3|oˆ(ƒiЄaє9ы;ьrеСѓE`fШ>uЯpі2`QшGЈЮUM`уC‘ФтOmœрQ=C/э ЭьB3њE7—'nЛФ€™P,Гdк+"šьїCія бЅтХт€€э<‚f‡јВъд>…!БЫЖ(й}тјцУ‹$Cч]ХЧZоо~Lu­7^‡(a7А]€BѓЩD‹Й rьќŸ•Hш„(uлэg,†џъsGиѓLАŒЎ† Vк]Jю%ХWT_:Œ8aIвкы2ЎU’!GV%ы^C]­ЁLM‰dѕЉƒ’~ж;„RЮюˆBh‰сђ\ЊЂАгШ/П/-P€ьo%uіэЙЙ]мюімМ67Фмђјі|„Д/Ђ=8wКтЇм€B˜см8ЋёоЊ |DЂШеkтLЇ„CxЂАmЙў•јЧ$ŠицфGфwн†Ѕ“йђДФ‘mcюєђЏ›>тQ CšLС?АQIаŠ‚њЂЫЃZМ­Ыњa^‚ьŠ”p_$&V8YжќФшgkJЁеZЕ…r`„пŸЉтIйИH@у#и{,Дя!—)[œ›™лdtхДf#eiЗbз_ы(X™рjСWlФaИПip1ъ?Ž^‡)Hи,;щщ8T/kQvиx+ImlS5ЮЈb'-ицžР‡ь{3˜њѕп18aќј@ž‘ЫО_И=ї#Л1R$tў№ТkБџяйћ1jы>+ІмђЫЕ~ј#%џбеТњиъ/зЖTkdкЇГ%+‡Ь…ƒW(1Д.€oЎЌ’R“јqЧFƒЩDКІšГdгLb7œюiв_ГT/IѕNэŒу4ьTэ`ІиŸ:З}Ÿ?RЦДјКњ0ХЦ,МЅ?7ПУ}}щ%ТчNЛ И ‰шѓQ[ јЄ ‚щЇкѕљQkt]Оo…й‹hзt-Ѓ<€їЃБ'wšec ѕЯS%КцЙбXb(dvЇz‹ЈIЗA|ЂШ•б€Ћь?Эт"LвXKЉ\v№Ќ’ь=ЎЦЬлФењААЇC'I’аЅ„iПУЈ‹#Ž џлCЧWrѕ+€,Да‡K§— §Фp­Ÿћ3 ЮЉХњ‹Qаыѕs—ь_jљ№cєћ\мчžц5ЮЪЪLAЌeжяэд†ЏЂ']hЮ}К–ЪЭЂгЮQьGhJЏ}pЭ‰—‚†вЂИEt\Z+GЬ—ПŠОЗЈxl@ŸэPanІИLњэШ)ЃžГ‡њyл^ŠPЪ]Bћ'h”‘ ’ЫцдЊ™чLўzc‹ЇC ;-ж?В€dZLŽ‚џnŸ$)Ўщ–ŸљCƒЩѓ€эЪЙ^TjŒmFњAOJHѓ"ЕР"ЂM%В (Q0 –Г\"Ёžр<єЃHГТв,Spя.0ФiBШž#АЄъMWОёџћSLŸэH"ШРЧѓфЃЪ0’Bн‰АqуEсѓКeIњ­'іšЫуЩ‰РїьLњJ„ЌђаY1А‹ †’†RХcуІДЪ`CО›ъUaDЋN4І{м‚3†™е# Š\Х!gC]OoБ3лъчљЪюNФ5І6Шю<0qЏї&ЫГ‘з6,пgUu‹);Ќ7ЋaФ RcO№ѕпЃ.PЄэ3Эƒ  '{o!l B2pUtœlaMЦ к-АжLЯbѕP†­й 2 гА4ї­_џЖžPїЊчTЭ`h&§зH/АЕ!'aРžnЃ9ЕНЖЖ!юХРLlС‹ЋЃ бФ`t律жпиакџўгЖЩЏў- JљiХYП cnСЃQреˆ”vВЧЕ›ПFдвšLНgЄpкkО%ж€šэW7)cЦЏЙ[FН…ЭYЎ)лЂЧXK§јЧmър0Љ.(k&08ЂD4G‰LЏœƒХtЄђ7аЩо2G_qНЪЅJ€є#d—aУЏЖЈn1˜=]Ы“КLwfоD Юсн’ƒ˜каOXj%‹ГЃЖ}5ьЭк& ‹lzG-§ЬЪ цР{фx”ю•=Ў[Y*L]пBЯ?XСе­fьЦ‹ 5U560щpmш!= ьМ HИ*Лхp‡2]nTсƒsТF!@уEXжc.СM4Щk_ёшЃ€ељfЈъэёТПHш™ДЕ4r)ц7fyYfЎЬ@uќФT‹5еG"Šy%bМЩŠFДgхУЋаОфРU[xžмЫs“ыј§адТіОЌKh–ьСo=Ј џ8uЁЩdHдЄгЇ}Ђ˜nvўЩ‘€ЏФЉЦŽлпшЧ鈆qKЩžZЁHЈСzc—О&ЧyяRЖЙсњтЩ”-Щ7AђFB#TŽalЁлїact’ЭˆXi;–ћ” Ў•ІзžЙn куkqасšœ%?‡тz5ИšЋ‡?ЎZ>ˆЯ}˜јˆэY<Д,9’•Ю№~0}ф.ЖР&ЬzТ2Ђб6SМ§у=ЯЧЏСЪTƒžˆЎj+ˆ@g 7%žYЈГp‚w}Ы=ѕЬЫ8 ьИя^ЖХ‹а1ъ$yбЈСXVэJЇ9ъЙђЖЄЂ}O‹ћ‘cбuоХ—ЁЧ|SцTISГеHџ,>ыJ5e№%œP6чм8ЄšэoЗ)<фчяп­vїРНю1Кda‚`KипЅТ”ЁYѕ‘BСз›У#qЭ&ЃеnBмˆює_Эфqх‘јЖR!ћ(&k)• нАнx ф‚Убёзф0JСƒѕŠZPkЩZ i—Ј~р€Sѓ$Cr>AоZ#у…Ÿ—Т”э_з„8UѓzњП]Ъ6їtˆš^фj`<™ьпKеЏŒ—Ÿ 6хА‹[љi +нG*‚Œш›ЗNМ–u(‚]Ќ7М7@uИЖ  [ЃZ &MA$ЈYЋ\РЉnр ѕКйьаШ-›AИ3яО‡–Ј7=&}Гм„Эќ6\эЊz8џY>Ч[š ўš‚xPС`СQ,м\­јLt>ич‘’9сoŒФщ]†6ћOUp@—э*NssЭЖBWtђНtњД_iЭ№+‘@Бч$>ъ0f[&џ…g‚Щn=иuWЃЙ_…!KjЗЇY}i!K%ЦQБа™їЊSN f. ѕ8œЉ,Oˆ€‹jŠш.h й v“HS^эЮ SЊ Ђa]tQсЮaІPз9š^gRИё7ђЭТЕwwђ–Ћ7M~•О“ь7pЛ*с} жžš\еX-$ѓT ќѓвщr.sCзp‰ ЄЈI_,ьяœ,+ЄyЫ€Й%.К}хъЄщпожяC<ЎE]‚ѓ+'ЙDЂoэ ѕИ‚yљ“ЦмnЫЃђ0g5Э ŸьћМ[д”2xдR2ы–MVсуЏэKŽянКЖЕыы`№М…НЯ@ьхёdЧŒ@,ЫnЙoEmтJьЛЅШ7;кЗ7c8ЪGЧn`T›§F7уJ /Шz%T:%”mф+Дїiљмў‰Ш0Г•>nkИgzЃ“a@GЧ+чн^лФcг'Ж—…ЭЫ НŽMgС К‚е~њY0Ђ‚TщюvРŠлхф5Гnѓє ’†CŽ‘pШ{z 4-j…сђyЅRдQп ˜|GњJ+0$ ­+hsЄNѓЯпpQЅ„%ŽЩY,TыЎvD\њ“7єn3LXПи–Fљmћœ$S^ф_arъhН–Ђ 3ўS1ОљюŒњY-žaйh 4hѕAЖ|ŽэІЃ§dEo$')d‰эІ_Щ‚_Ÿ…жAžьxZЭчЌ–M'29шœœєлuЏWŽор_т"й#Ђ2Зeпры˜№—с!G`XUЦЉУBЂћт{ЃПїb|]І…чЅ‰CЋ3LžёpыяtО$Зш5іГйq=Œ]9,ВАPH4j!ц8Й[и:пlDƒь№ШъОюГS u ;8й+ЎђŽџNждyЛ1 }m4rlKл‚’жд™…GІѕ’п№{X б.ˆcР(;€ыИц…2ѕ ­­0љР* яKФЭS"ќЋИѓƒ[1’rYГукG)ŸAн~rі3 ^][ы@TŽІЈєѕћѓ$ЭЮl•эЎЇЙfWEгpџ№ТЃВэлВљIцSi[тяA"y`ё1•ѓ!БАі™аЩіЈoužЁž‚нЇОxј3W„zРУ”™ђ’Ь€йЊ Л<Н(wџqХO& t1В">x?‡\NєMГђ€ПфзЏІіT}F~0ншkћАTмВjnАRЧЬФ*йƒчПчP>еЭIИэmR…@>„b(ц„BI) ьЯ)51}1 хœ™†GЭїеЗp]2ЭA…mўП yУA\ДhŸИkс‰n;˜œуŸ/‘†ХfЦ6њќ@#ad…Є @ Žx§№д ћšdЙx•#хД–9§9]vЦ8Тќgk<ОЮ3eJ@јuGф/їОах‘Ћј]Ž•ьн} BџаЛП5NЦoЯњAЩџ#Б=qќ[ѕЫ’ўžРAl“хЦЋГэгбR]ј–F—€K mJЂгpЖ$!cћxЎњdѓьEяћK^›>85I*‰ Э бiј–ёд"ю*hšŽ™–Ј*€Or‡­іоЂЌ5В‡nЉ…/ГѓыыЎлžК,a,Е,еУж№~ё№Јяv–ь НeБ‰ZЯft0'RfФ“‰P…p}љJхBт? мЦЦЗнИ+р‡3€СдЫщ@’ПЎIiфv}цЃщ›ЉQ# ьёѓžжЬzQйbc[1Св>tfЄгЫъ‡)ІLљœ+~+ЦмTяп ЁэіНŽ^œ<НзО;˜ }ЪДеœb~гшэ‹Ўsq@wjњ1кqjЫ!56PWеv{ЗЊŒ[д0C@ЧNЕлК†sЂжџщ6оЊђ—лˆЙ*N•‹OŠы;’œщ=Йшяэ:…яѕ\Њ[/їЙБ„‰Мыў„ГŽ ЯС!QwЯBя\FГ* шЄвX†д5Сd:ї›)ј€›эtр—џV+!Шй }птя”#ŽФ%p•crvœQїH$*ГєVžбw.БоЧ.ЁЈ№{ѕ‘žВSlЭ9v _аzwGФ€ ^ ŸЭ H}š—ЌT/ššŽ5rUАТ*9‡Ф-ь0ЋŒ’dЁьфищ ЯK5ЅРFWЈrLђrч™S—:Lј ЅŠЄЛMGKю˜П'ЉHJikVNb;Блƒ РЙА<НЮЧBг–цжwгшg‘ВzвпЎ-Ы45uh;$pБТqЋ7Mюƒа8Єњѓ=Ж“л›BZЎсp|…J6ЃEš7}'~%uЪ&X9љrLyFЋPУ5УИŒЖў€–ьь!S 6сАʘћзц4сБ›нщ“^—†|e“8я@X№yHf…ЏзЇ"УѓŠбМŠХkTлz# ѕЈшЫыE8IІеlю‡ЪюЉЁ=љђEі$/M)“…Ж ШuЙЇІtPˆЂЈgтV]_yП.аЙB„Ф–yъЇгќ(5œк1 %'oŽ/SЄ/€~эКр(Ч  ~iа{Е…”АВAyК  ўnЎŒPRX'oьkЊƒG"=GеoYё|vpы /ќ.iђ‚ФhЂч•S#ŸЫsЯž‡я]i’ЇŸŸЌ ѓАdhZЈОZ 8Сєъ=gaуЬpМРIL 4l•.uftsщŽ]ч‘эм{х‚cQsoќЈ­К1•€JЎ ˆŸџѕ’ЁOБфш—h=M""™VŽzЙ#ќ[ЯЦrTAНЄIЦТэњGt<вф}ЉвуХд„кnСжНЏЯЌдЦd‰ѓ=OДWx]У—$zŠNRBvЧvвЛ7Ÿa_бBMЉJR”iЗфЛШъ3ФяСЂпWљў—рE@ƒэy Лq;žfтЦNy#уDще(Ј8Zї(!НLЯКoцI™'8=$eГa•ШgХd§Ђ@ІZ/3нpcНA—Ры;ЋР9dMЩPбEс,3|УТ‹кuљЮ­ЅYє‡ŽЋ-9šЊп]| ўжБч>ЭдуZc­‡ЉGœm†S>@~э<;9њ‘‹ЊКcUЃыR1њг‚и|Њ>рБ{"[KIІ/МѕЈэ'ш‰‡_j*-ћў о Мsў…7{Щ_д9Ђk)Й­а‚iљqь]pЊиб2 ћwоr4§Ц•ОŒчє&\хmЉ`‡-њЬ>нё#­”Й0 izHƒCC"ўœуpWg%§‘IŠ„0ўеїиїЗЫ]іЬУъ%рАфж‘эTй—"ѕђB_н/U‰”ХFЯvnА4аmь,YH.…­rtѕtS››‡”мІ4€XЖ(Z'Хе€SŒжFњQ­•…,ћ‹.ІёŸ*nЪ8)Ÿбh,я5}кMЅoЕgOЙрыХq zВ—™Mћ1ЈЧlѕ уЅ<г];OЅ™р}ы5VxЫЌžгєбќЋCћcznUм(ЛкЪŒа#rбЛ€w-ўюЃщГBј~\jŠGkiЩ<& ‚7Эаj&ЌžяcЫ/ щ+LрO0fx„У=КŸЌ2щДƒооС%ФЄї-A\S§У™8Z :ч?Ю"=(v0‹ь—A?і]S<д]ш`Ё8>тњъг& ћT­V ЅФ™їqА*ХgШЯLp”ѓЪЈœeg‚ќ™`џА71KGУUšƒдuтѓg=FСЂiЋŒЊŸb6 ?’R$8™ОКYЧЦћ?љ#7р5ќ ЂaЖbP™0”‘;šCO›Ѕ8ˆьёБ;IЃ–OЈь’|П;Щr\ЋОшEx”оW—p39TqЈф‡ 6+!щPЏукYUЇсЁЦWw cЌќлДК(ŒьX_)N]RUФљŸvР_šњ6>вшкu“^WЄšЃpZѕ>ё;+M@рЃяYћцУйБ,Я†OЛzL ‚VOТХgŠБ™llџУ@ОрLBœоЂ~ї5Љ#‰M[•€y5OЖзУeЈЌьeˆšЮю†ЇТ+QЊЮГs‚P€b]ѓъЕкy14$“[sЃЃ!?ўsі3q ї{8 уцA'/›Yљ0 Li0Э’Й—]бкƒ>VШŒrr‘у|хDVB4/%0oIПALІўLxЇкtђ7ѓлŒ ФnК’•XХєkъћ‰L ЦЫDCљљiюY‹ѕ[_ЈЪxЕ|НЦ=DhƒC"ЭG њ-Ё€žььЧ„к0XzъS&у3x&(єПЋhпяЦЬУ_ёэmЪ: |D…qœ;€‡KЪcaGщ Щ Dіе^У‘‘ \]=šЉ!+Ѓх§ГЉцeГqЁwe | TН‚і/№дь(ђГvьrŽЪсMѕˆЩ zcALфзmoцљcnГКгўБm"фg‹ gХ/ЏЖfЩъЈьпN­LДьŸХъСj/‚,іц_’WEПтШWФц":ыP ЕBЫŒ]%`a™Ю/Вc—88‡бј…[ђРhСbD$tЅTхЪ•OШЬђ?!ˆ|з;ЅЖе]Ы/]‡є5ЁeкЛŽЏѕЊ‹›ЮЊ~BƒЂфcЇђ>// /ОВЉtn№[j'Аы›ЋїVX&lЫysюєwMЬSј ьх††ПH &ыЃ‡BлЅчnѓЊEVЂ`?›q{WЋЫ/ ?ф•m3e”у+зМі^ЈP^†XдїђёVр*jюљXc@њ?gыqФFB,ЊП 0Ь„•БФЦ<мCЕЦсИj##]7зrЫ1\эВ§й/Ёф–‚НNТŽHТнУ љбŒќЩ“KSшмH ЁTNEБ-K;щЏС%G’œьфDДЫ.мўP8ˆђ@eљEžI7+jP˜ЂХgє–ї-’‹ЁDC>9Xі"љš?ЖПC>ХЈvj=/УЧ­q+Y–РрјкЉЪаzи$qбљ5?ЯBе Q}~Ц<Чј— \яˆi`FAnBИšŸМ™яУп4…{ И•о|cWa[yx}h$№ Нщ6rгO”ьЅE"dyRRЪ\Ѕ†ŸЙЎр7ub”RК' 5)†%аGPБ8ѓ"~лэWЙ3іЪеr =Jƒ•<ЊAс}Яъаfкл‡GЙ‘LЊMQЅГђR„tм…”УЕ:Ѕзh<ЩD@ mS fРН!ЧРRљ-sOћe-GўЙ<ьI3;Ў~w@7O6fРf”О][š“ь“йHНDzf@‘^g `Т~№OА™бAзэФБ*!фD|сK6НрЯо2|ЫБ„нэTSФР38KДЋOЮ!XFŒ‡‰fKРsjБwZ3є^|ƒВpРЯ&N18ЙїёбM.ЬPBŽr ібБНбьšК№!ШЏН6nГgњм~ј“ШV2хњї$ЧK(Б|А~,Gе™иБJїнE>§ХAAйeГ"ИkМ1Ўf8џтXі-Двлf9ЏmУЋ m§R?ЬP=сRц*M0Мyнп‰[›E•8FП~…`7=иj–dNюЎв5s=51Fц2Х,СЫˆnсA>'OіkНл56–1Y€ьь!SKY­№щWЪ“ЏЯгF9%=fІm]žХЮ…nzPHWtx`ХА&PŠѕpП};ю@BСџсmѕЁZLKМЋс_ŠЅŒ`Чњ1§мu"”Ю™ќЖюиу0ЂмЂ|-яёŽ cCFk‚…>эŠуНэЧGК•уЏHО~­ЯуККl?}ь•’N іx(ŠэBdМізшлr№§йС—vняї‘М3[ŠjШ„†k~|ЊHЬJa4‰0ѓ_ј€ФМmЌsі,QŸј—xЅURЕ+ёЃрtЦ&Н8ќ‹€ЃŽnУШ,4з C0ЏъБnхЇU7aкKoфQ Пє€[/WE Ы4.ПUЇš,Ѕ‹Tt8…ьpAфDВejЈП$ДPћA;tM№УіKWЖMо,њ~"…7Ќ›Н~ЃЅтшK‰m§#№ЈM€КДRЇ*ЯMї;ѕ§Ў, Хaїа9ЃХv‡z™G$Л1Rt]Џpч‡˜Ък;яЋжЃїєўG\ УNЦзЗ'\^дЃФъzњяЎПіžЌ"8‘ыІЯГФ 2т2т’У—ЦCІ6@2!&)••Ш\Ž<ц !pБ2WvАєŽУЈkаXЏЇН =8NіZ5ьГ‚6Н~BфsЄqЎйЬ6уЈЃйЭ>=ќшC')UљBЯ`XЬЭANdfjЎaыЛ’к"oќDкuЄž,PєZ ХЧ~Й_ЁУИNVz„ыШЗО‘кK6ИўљИЁ?!c.™dBДЉ>§QK@ž$€ЭЬ}ƒxБФбХе=й§EgЌПBЉш@{(›Кт хG8–œlA=Ф’ЭŠ ша‚CŠ‘бМ&•lЩF#xЏ8ЄTН яhк‘Ож„–V [„кa'Ž#{/ј0бœQЙљqпЫХЮ †DІЩІљ‘§H8pыA†ЦY1лРСZ"§ЦБTђЂŽ‚шXЫ\ЕфG+Lk6‹ ŒЄ7кB|wсП_ЛєVћ›vra1И*T‘ыLЈИё].VфŸ…ўE!Ј‰ 4 x эйЫЫ'a„&гШсЬА#žv–=Ї$х„<К •ЪМ™щ BЪVьЅуc}o>Ф2%Ѕ”№яƒxо#=ў'ЃЉhЗвœŠщц=‹œ]5РƒO8 Иj ы‡lg4+=C}~Љц;/ЂЁq}ЗiУЕВз5M(•:AvŒa„оЃX‰ь ›‘Ыљ(6Ѓ•Д ЦоџкТ36‰Љь^ 7[ЛKкВ‹ЈЗ™рА8WЭo[(_jlхЎRКћ<#9сі_nLЂj9і%yOђw!8mпLЇ2кюћМ†~ rKў­вЫа2Fbі+FIС3Э=иq4 ZЭШМ%hОЎдрќђŒRxВ ™ыиб Ѕb ‡Ь ђEЈ xIчНщ$е‚сY›ЬR9ОоЛO;окanрCтђ],‡‰у W2мШRŠнAA‘[ У^э(ъ№"ЃшУјЃ‰cјuФ &ХB6ЈШ.<єUЉФЛ'оќІ1ў8ІЇm7b_rЪх‡}”Rйє‡HН”ёВ>…žwsиPжеб§–ыŒћЄ~ˆЗЋЛЊH0FP1‡Эžє0ђдQZT8ˆ ьiэћЃV…Ђ?љИZ„юoј {:…œд#§Aп[{ќ8(PcЯЁЩdФ”™ЗЭЂw*є§БгX˜ьЯˆb)јзумд9Ђџv2ТЇ~Y'ф й[2h9ШІPЊT3E-”?lф~ўйwV#—ь nќxчбGС (јлЙ”:Я0DFОУлѕћK Јфqћћою§яЅй8jš8ш†яpёВƒўє Е}6,CDШРќWZNiu/ѕ\4–Жmд’РрР;ŸUџКЭB‰§“…oю oџБщИ;Б"њКЯгJ5Ц ЅPХ{jeЎ“­`}#…V‚—\Œж}@ЧО WQ]OŒьЗЙž€ќ<^мЬЄи|waХЁEя]ЦcмtЊPЬžCpЗ<"€mЂу–'г|vˆКѓљHaFl KXjR!4зЮ=•ў(Юб3p’ŠЕЇрє1*†Lv;†ПvЁ ЉЏ[~Н‡!hЛЉ‘р|у+я0мѕкЄ3%о9РЙG@1v#ѕy—jаzі1`€ыІРг§}н9ц “ГєUЉMй;ЫU–уТeс§ŒКп*ŽŽф†ž+—кк*Љџ№IЅLTRя^эОб!rнЪ7ѓђжЁMЭ +Лœќ‡шMух Р5ZOж_§ЬЈхVЉЧЪBWЦ'я27~=ШЕю,Ў!ЎўСј™с8‘F.&Њ~nыЇтB1•@еeр”ы‡ M‡ЉLЅygдОЪTbB“eдl6tтќlзGeЦсyома›-=Ÿ;ы4ЋђжНДС-Wь t0ЋЎu—y@ЧtJЃсtaєFŒl]{ђљ%OioРKiuDCэjт-8ZGУGHЏ^LнVђГАRLjgЭм[ыШ|Йђг|к§ЖZеŽоeЩ№нХKЗ.xР’ы1zyi ™Тх,ћŽЪƒф•PЎŒБNЂБђ}Аz8ёеўkрйоб№оaŒэ n‰ м—Уф‰Jє|зЈУra*ЅZЕ^%|ОЧћћcКЃt‹c1В•YЮю@цˆЦ3iШЈ_ˆ)ч#  В’}§†$ѕчЙ< ЉЬ[–oЗТ;ЗiАyњ{)@‘ъШб ;S0мa‰ Ў ќ1' gZuAМ^Ізu ЅIAРšнрI)ІтЁFnЮhчr :щJМqР5єх1ЮМ+ль`qTж ‘фE€ШКжГ• Z!дtѕнПу”hкqь›VНЕь6Рq‘‹#AЉŒхё‰С™?ž>ё/šGM”G=‹{ўбr­p‘ъjЕъXЮќК†;В„ыaaї4pшNћбL›ЯТ[АOаиЂёіQ‹MАМ^=Г—vз$Ч„w6M, .ЧZпГ їDЮHЛGHЪNѓrz0ў0Н5ЪkЫlrбTw„>&ю[YNДVщѓ@œL‚<lЕЩоН5в/єІ*xrъдœъFDdфe†ˆеX2/žџ,”iSN–; ФяN'RM=4tШr•w@…—>9ˆщћ3–Г GЃ‚Ц“uьЭ& Ё+ЛЂ@ИУЎ‰ID•1[/АЩИЛP†b\MЮ4ЯxО\У7C)}‘;ПЃиьђ№}fЫllТM.ѕYmБњэЗ*Aˆ1тqК| Ї@ŽъP=чѕ+ь?oєЮrкОLiЫ.)Œ§еыЋ›фІфiyEvbЕШЫqкњ­зГБoж\ЂЗЧњŒѕрз %Zд(•XіЉцa*уŒFrœ‡m_ПњЄ”ѓЦЗыЕžН–#tˆlвО/š:КДЉЈгШњ|eYS3JЩй- ‚ыˆ•jsЙ‡і-&ГZNръќ9ъ&сЭ Жšв0ЋNа|8бURZр РXw@‡{‚1кѕzЩšЎ‘k№XЫdи]1P‘њС‘А™ŽњP:ФџПђ1TJ=ЪЎБ?›>ЗVZZНЧ?Уя_і\VaШЋЖ~ELЌЦx3Qдxы8‡Нжіи№)tрпЕŽH–иˆƒЖнŸ}SИП!јЉv–63ЕW„ЌGу=Kї1nФеЌѓ]‘‘gАЭw:$№Уh}бXƒМdЉэLизјЖЧoиЖTZУђсdŸžФ ‘щѓ=E†vњIЅkIv\Ÿч=|А Ю{’vžо)’e§дRЏ’bт‹‚Ё|ЅЎ*=@eуІиMРо‡˜н(Pф8;Qw;ZЫ6пГъВыoыТ˜тvфМ'бк˜EЕe™7‹въбЇCц{tРЪСюї@Ѓ1)аџжD~р)mLŒAfŒ&NДl7kр•щў9;щ­чЋˆLX\- оРž@їиCьP>‡ uфрьL[fYŽо#ФBОсь!eГфdЏGJ&§€‚ЧТ„/ЕD2ЊУŒпsUЏ$ž+аaчŠ›vS@Ÿ$ dPЯ 1ЌYІђ “t„ЏТфю&0+uŒBЗЁч‡ЪД=щ>t$чŒIЂВq8ЮD)gєƒрщдр‘‡ZД’Ї;B‚№?;KŽ@UvS)€ЈкІ-ьЂ9C^ФЉО.яа0ъL~jЙWЪЗШ—*РМ…EН€љp[C8„ы_ёPЫЪЋŠV–B†щћЕ]Пl‰"*Чaƒ3zю ~П!ЎЬчЌŒџ!G4ГdfUњ:‡\qoЮ.ЫCqKВJаЈtіі’МWЌzBCЃ'ёгIlЈM{" f„AЙ„h7ї}tоњ$Щ7Ћ ’ЄЯA?§#E‚œ3Nl;rGЗцw]™W‹к)^S2ЊЈeя>ДŒщD CЩє/хoŠа’Ю:;)?†ГDа1№ы‹zц0gЃЙ]К‹ŠЊ[ьхMч Э{ДчxЛФ‚q:u†tі–IІЈKŸf&[ АEN AХ]ѓŽjЫ}8ЂЏN іRRв ›ѓ…ъQ*РЂŠ<ž{ЮТpЇћЩ™ђОл™dŒщ^ПdЛчk§€ BМ…v5н‚–РІѕЉEЃyьІц“іїрЇЖ\ ЮјЙІ *\"O!Гxў=>–x‘EЃ&ˆleЇЃ‰щGВFК(ž KнЯиЇНЦдчшC„ћwщm™вmНчKBчG)D—„{ ЛТvчщSюNз"!KQџг)3єеk7P’щ ўїt ІOпoU—йDu’ SWU0ГёƒЛNСфюIіуe:АcKm†іPР –w”†#˜нџx9=DnЁГзаэq;wѓЄ ”zм_щЙйSмe!Tь’E&ЖŸкЫ(EŽY9Zё_/ NК мИЎљДмЁ‡MЈ`QЛЯuЗ.еЗ}Њ8CЯ ѕ шљЂ>wE,|dЅеИУ`Rи%Р№JТ mŠ‹№уЊн;фњећHerлO‡Љ‰u}(ЁХИусДU§ 6j•9њ-Щмk‚я“?#Ф^ уЦ$ЭhyЪ­-W:&ђїчБѓ/Ю%ŒК­Щнпжц gВ2И оиЊ73­­ВЌ)rНЗГkё%оrМŽїžа‰щ/OчŽЩ$";e9:z‘Y#—з=7Uœir eRqЙ№+˜?юfЙJ>аї($`КжяFу4йž+ђЅE*ˆѕWНЉэuН/ХЗWB6ьO’6Гв?dЂФ ЛcF˜HС^юТ)њВ х@8ъ †qpОe%- `BЁћССtЃ-^’ŠшљЂ>и3žГ>4` {x”@ іЕ ЧxsЈQ‹†ц@хr;%ЅD"$EФJЎї>€h€lhєЮ uиЇщДXд6Жkv˜ ;еKe uQFА†ТЅћD;[1&BP›z‚=/ГgяЈбЇmqЭЛў ЂLЅлжаH€Wю›№š (ыХЎzЯ€ŒшюЌ?UЯо"S#Ње}W!ƒdD,.вVaЩ5‰а˜˜ЪЮзП L•“ѕ},ОтУ#Ър@;"dnј8cъœy}В<Ќу54tgbžyBЏЪЬ6mџ?”N0ЖNHkи ПаЬъFgimщƒЉZOХсї‹ы xмшь§gzrwпV§=uЦ’шР;@dš”3AKяXэкЪbэ$кЙiЂ]сeё:K…‡M,“з^3PѓњЗw+я6]ВЃ=L@цPЬХ3”O;Ў3(Ё^і TМгЪ‘ŒчjBї“іgу^tІh}$ЖOдq[$ѓЬЏ_ыЌOlћ5 шQŸЅрІW|О)E‡gdё јБž6Р‘шРZІЩК?вŸ%dД Хeь˜ л:’ўZknjrП)lDЖOEЃ-N8а3ЌЅd,СГЉNЁV(s˜‡№­–k–Тњ‰XЂYˆцР‚’зDRЌЛHЙa‚Ё@F зВc@Ќ•p1`Arэ жkлmxI0ЧЄщ cKœфБЮTSx˜фŽŽ.ЛРŒшљ‘ЂM KdэaІ“}<Ўmц‹Вь|З~ž›vzЄЌ| amуѓЋ ІЇu‚хqЩЋл<јEм%б€G8рК‰_]Ч‚(•Zпы3x[qYУ}-$”М‰“јА NќfёфЁ@™u/ЏmЈ@{|ЖbшцдиG‚zсw'yAџ^ЙqюMщBш+`Œш–ЃВŽAoрgя§ђj#mЋ?яЪh(ђуœДЪЉ7ŽЋ'g ЋЂQmз;љ:ёЏЧбжп(ЙуењЧшмЂО`И­СЊо ЗU9a]”@+їйz'ŒJ ЬH†pV… %э§=‚Gpн•ŒќПg4GPЭdZsXcЭђб;ї&Ца fўxр…шхУ`B&СЌr‹"$P_рHAмІŒЛhGЅЕэ›ЊТ €gўШdЋLХ„CЯмШR№g ДМfХ• Ap QУ5T…Ы* зCўiциЛЪДШЋlПЮъЕ€E^4вoYOіИХQ———рrяЗЛЇ“Z•J’u<Ћ=(X\Blx‰шh•Ст&WбHšМƒgЂс/П'/ІЭхГiXSГzQ7˜`weЎжё ™м?JьRЋ˜@ЌђB$іF/КuŠыЮвЩ/жGƒNXЧЧ™_7O1;O)ЭцЏнUѕs$Ы:‘7с enькPщ^ПЗ‹КIgЊš‡hu*ŸvжјœЊ”ш1ЅAqЊ„‘ˆmC­ aX§ < ЦутъЅа1UŒ5еDћЭчє†ФјсЋElsjA .QМзЇ 9„_A“›АбD5М ЩДр–g_wЋgsѕWТКЂ|эdRflј"›]w,`ИД8цхK”г#;аJв‚р—є/х4џ„PЂ|Ÿ…+GO№t‘ше”аi8Пˆd@х ю€(ЫPWВŠ*=(ОЄ”щinЬ<ОpxœУ;vJЈП(Є&‡60иrџ$&ы‚іЩџy39рvѓZфТЙќХЏ97MёбХvОСЉ†Й $‰иЊo@6]NОQ•”№F§m]#†хрbHa…KфФ}Аb(U I4BŒм€‹шŠЕKZеяЖ[П1іžж ѓvцE.ї ѕ˜Ў= cччgжЕqc03CФ/кЄJ3ѕА›Щ§чя†zŽ…T2œ^aod,ЄЧ2ГYџбyЏЌ:ЙЩыЅШx_2“в{Љ2Gs2>QЋ†йŽYЯwšjЏЦˆ`ЛЅ6Rз*EлК§B{Ÿ“Ќ-XмXкр‡шŒUDњ^kLбSЖГKgŠрrѓ=Y+ŽВо\HJўПн–ѓаƒп+ЌОр`4OЈВ‹BНs8юњYщЉРљuЊщ@чk )M8‚› zВўMГcЃ[žЦ) Ё$№ОW­h4(.ЄwгquoуЅd4aѕN''Ёu7жЩ|3•шИЛ с}ƒ˜%оЉ4њ“TВћЭcmAАФbIЕŽЪ”™f3sЕ<7@q]ŸЋЁiu|е'Ъjќ|dЊeН{џ”dрЯIDxТ!–'уg№ s“™РŠ0’/У”^‡30lLJЃ\.ђ_xпa лqЙk@л‡Їцхс!х/FEЅ)ЗЧ6БИeсљє‘ш:(œ-\ю@ &;~&‰`!!:Пс.SeѕЙљМЈ†aђpnxЙ=53ФэEИ УŸ™q€%љр‚j1цщЗ…ƒ2HŽI™ъИЕтт$ШЋmŽЙ‰ЈmеМфSйы!№ЄwЏќUтнѓtdIЂ;fБ§Ц ј†рf^mУM&i>Т3ЫlНИ!хђїыеqкy’™>Р‹шжQ_>„•Схћ7”пЎЮЅОЊgг(ъXДЈЧзoХБ$+Ч;WmьРR+ЅŒTф’RХ9q]#-Х@N‘;^ФAГч\Dђbд˜PЧкmЎ(šъсіг%;Ѕi\Л‚3MS[86о уzG ?Xf{ю&y3ˆ…|оA[X”ХKƒЏkџр•ш€Ьf…яbvй…o_Ћг[м<ЯюЧs[uЛU•юt`—>*Vž “яеH›ћУК5M0МgAnсцtЛ ŒИ‹М’Ж lЖ7„WжPЖёМвФя;5‡‚РsИBxŠ2BU;p <њk”FХPœ!Й)dПiА;L‡wL_ #­ŠEїT!ˆˆшˆ>Г@ЭОаА)8‹ђљЩ‡ŒƒвЃНOЉ&§ž0ДdЫ1!Ѓ8јшHŒ*Ё^V7оЗf–Yє4IЬŽЌЃЈшžAЛ0@0Ё)G‡щœХОGЗ;+тОЖ7&Uэ{шšяJЪ Ђ—zё Ž$Ќd‚эДЃЧ6VЯIЌљ|А—_Oœ­Eш šMФ ž‹?ѓФ#Јп…Lwн1i|?eош`ПaгЪД#7dWŠБIHДбs)@/|†—mЏй­м ˜ЗЊ@§Ÿуо!xІF.ќњћЏTВћˆЖјuћ` UrДІв6+е/ЄZьZuЅЗѕфМLл еMЃK{ЎbVЙњ‡iъdAУн5QЄхzіЈН@чшХ ƒЦЇšuў žŠоУЖъ|6шо).6ќ,ЪrЉР*@pŠЈXC~Ы3~пx‹пž“ЕwfD=єЪеOL„ХxќэЗ6 V‰/t%<Я"=Ešb b"L AјЋy‰ВšЂ!ЌЪ5Псонх˜Щ3Hрžщ|ф ‡шŠ—ъJИгЫрš[9€ЬЭ­х\]T§ќчL ЉпЂ .5 "ъž†Vю •gxTuчч|'}ЗЩu6yDЄХMžкb4BмСЬQ’Š2гxŸЭŸ#pbІ‘ЗЮž|}ГZЛJ+P-}Њ"SЊz]ŠЫ{ =ЛQО~I9С€Œш€Ц…‚ОЕyšЫSdL.Ў‡†ВЙ6мf:Цn“4%dЃЄb~љЄXFsиД№ЩЗE 7ЙƒгПV”fnг_ФKc4IвŒ3|WuБкЁ^™ˆєГZ$tљІ€фMyВтDtЗ›^kPї`мТyh”fР… Й{Нˆ|ПсVJ­Oэ0„шƒћ Ž[Œh8ƒxUчѕ Т^0ЭфІљ—в-Ѓ$ѓ_ѕ8<сŠыѓЉ\‰œвFЭ+ЉмFUˆŸы€2И9С 'о ˆИ%LМ;>˜wŽ‚= ž 4› Љ”c4мџъGШoу`o˜@Y1-љ§ŒLИ}ЊЖDЋE\)2‡ыгтrI€‡ш \ЕBМ­в\Еаэ0XЄlrВ%цŽog ЈJ NКSMЪищѕКє ­|WыкъЄ•)oІ`Œі insertLinkDialog 0 0 800 165 0 0 0 0 Insert link true URL true caprofile caad cacomment cablob http ftp :// Link label in text 0 0 QDialogButtonBox::Cancel|QDialogButtonBox::Ok bottomButtonsBox rejected() insertLinkDialog reject() 399 139 399 82 classified-ads-0.13/ui/insertlinkdialog.cpp000066400000000000000000000076631331670245300210130ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #include "insertlinkdialog.h" #include "../mcontroller.h" #include "../log.h" #include "../datamodel/model.h" InsertLinkDialog::InsertLinkDialog(QWidget *aParent, MController* aController) : QDialog(aParent), iController(aController) { ui.setupUi(this) ; connect(ui.urlEdit, SIGNAL(textEdited(const QString&)), this, SLOT(urlTextEdited(const QString&)), Qt::QueuedConnection) ; ui.bottomButtonsBox->button( QDialogButtonBox::Ok )->setEnabled( false ); connect(ui.bottomButtonsBox, SIGNAL(accepted()), this, SLOT(okButtonClicked())); connect(ui.bottomButtonsBox, SIGNAL(rejected()), this, SLOT(deleteLater())); ui.urlEdit->setFocus(Qt::PopupFocusReason) ; } InsertLinkDialog::~InsertLinkDialog() { LOG_STR("InsertLinkDialog::~InsertLinkDialog\n") ; } void InsertLinkDialog::okButtonClicked() { LOG_STR("InsertLinkDialog::okButtonClicked\n") ; QString url ; // first try parse the text in editor without scheme // from listbox. if ( ui.urlEdit->text().indexOf("://") > -1 ) { // user did give scheme url = ui.urlEdit->text() ; } else { // take scheme from combobox url = ui.schemeComboxBox->currentText() + "://" + ui.urlEdit->text() ; } QUrl parsedUrl = QUrl::fromUserInput(url) ; url = QString(parsedUrl.toEncoded()) ; if ( !parsedUrl.isValid() ) { QMessageBox errorMessage ; errorMessage.setText(tr("Invalid URL")); errorMessage.setStandardButtons( QMessageBox::Ok ); errorMessage.exec(); return ; } QString label ( ui.linkLabelEdit->text() ); if ( label.length() == 0 ) { label = url ; } // then check that if it was classified ads URL, that the // hash must parse. Hash parsedHash ; parsedHash.fromString(reinterpret_cast(parsedUrl.host().toLatin1().constData())) ; if ( parsedHash == KNullHash && ( parsedUrl.scheme() == "caprofile" || parsedUrl.scheme() == "caad" || parsedUrl.scheme() == "cacomment" || parsedUrl.scheme() == "cablob" ) ) { QLOG_STR("Hash was not valid") ; QMessageBox errorMessage ; errorMessage.setText("Invalid SHA1 with scheme " + parsedUrl.scheme()); errorMessage.setStandardButtons( QMessageBox::Ok ); errorMessage.exec(); return ; } else { QLOG_STR("Hash is " + parsedHash.toString()) ; QLOG_STR("Url " + url ) ; QLOG_STR("Label " + label ) ; emit linkReady(url, label ) ; close() ; deleteLater(); } } void InsertLinkDialog::urlTextEdited(const QString &aText) { if ( aText.length() == 0 ) { ui.bottomButtonsBox->button( QDialogButtonBox::Ok )->setEnabled( false ); } else { ui.bottomButtonsBox->button( QDialogButtonBox::Ok )->setEnabled( true ); } } classified-ads-0.13/ui/insertlinkdialog.h000066400000000000000000000035701331670245300204510ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef INSERT_LINK_DIALOG_H #define INSERT_LINK_DIALOG_H #include #include "../mcontroller.h" #include "../ui_insertLink.h" /** * @brief class for editing link to be inserted into edited text */ class InsertLinkDialog : public QDialog { Q_OBJECT public: /** * Constructor. */ InsertLinkDialog(QWidget *aParent, MController* aController ); /** destructor */ ~InsertLinkDialog(); signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; /** * signal that is emitted when user is finished with * addition ; this should be connected to suitable * text editor */ void linkReady(const QString& aLinkAddress, const QString& aLinkLabel) ; private slots: void okButtonClicked() ; void urlTextEdited(const QString &aText) ; /**< when user changes URL text */ private: Ui_insertLinkDialog ui ; MController* iController ; }; #endif classified-ads-0.13/ui/leftarrow.png000066400000000000000000000014051331670245300174440ustar00rootroot00000000000000‰PNG  IHDR(бПЫŠgAMAБ ќasRGBЎЮщsBITлсOр oFFsк*ЖЮtIMEт :\Ј9 #tEXtSoftwarePOV-Ray 3.7.0.4.unofficialЮiи[XtEXtCommentRender Date: 2018-04-05 19:09:58Z Platform: x86_64-pc-linux-gnu Compiler: g++ 7 ђ3ЃˆхIDATH‰Хз;OQря,Л,(BaмБГАP;џ‚ЅПРЮво@bу PcaaьL Сg,(L4бФh4Ђ„хy-мq—с1 Гсtw^п;чмœ‰”’ЃˆЪ‘Ј‚уqtާ—:†гTIвљ2?JбЗTыbКЬWпŽWЁжR­А(ю”fя Ч‹а›ЉM–˜у]Yюp< }`“U~1ЯоvŽЉpŒШдe~№‰iЂДќЪУё( dъZІ~цe™jŽaˆ [™КРWž•ЌцavёќIcГЬHухoЋэ $ž‡::дўЇ|R~˜.ЕЕрxњСMЛNђ№иŽƒщ\kPEŒ…‹ F~ж,jУ*|g!šЊБлЃ эПwЗ–z<œa:=М)ђ фЮІЋYJЕ“k2 s‚zVQћ>ы№‘Fw$Wkp/4 — ›4љ&])ПœЖзё4s,ГЦъœїЫяЖСщvђšyVX'бC 1YВпЋгЭф=?iВ‘й§ŒˆБ.7щFђ‘…ЬF•уœЗКмЄыЩYэАИ\–Лw’Ў%Г,e‰д, .ъ2я†SY…tЁk@>ІкVЂ Љ(Œ_ѓQАдн‹#ћwњ nп(@…@љќIENDЎB`‚classified-ads-0.13/ui/manualConnectionDialog.ui000066400000000000000000000066171331670245300217170ustar00rootroot00000000000000 manualConnectionDialog 0 0 507 164 0 0 0 0 Manually add node to connection queue true QLayout::SetDefaultConstraint 0 0 Remote node listen port 100 16777215 1 65535 0 Remote node network address 250 0 IPv4, IPv6 or DNS name QDialogButtonBox::Cancel|QDialogButtonBox::Ok portEdit addressEdit connectionDlgButtonBox connectionDlgButtonBox rejected() manualConnectionDialog reject() 253 139 253 81 classified-ads-0.13/ui/manualconnection.cpp000066400000000000000000000100441331670245300207710ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "../mcontroller.h" #include "../log.h" #include "../datamodel/model.h" #include "../datamodel/mnodemodelprotocolinterface.h" #include "manualconnection.h" #include ManualConnectionDialog::ManualConnectionDialog(QWidget *aParent, MController& aController) : QDialog(aParent), iController(aController) { ui.setupUi(this) ; connect(ui.connectionDlgButtonBox, SIGNAL(accepted()), this, SLOT(addButtonClicked())); connect(this, SIGNAL(rejected()), this, SLOT(deleteLater())) ; adjustSize() ; } ManualConnectionDialog::~ManualConnectionDialog() { LOG_STR("ManualConnectionDialog::~ManualConnectionDialog\n") ; } void ManualConnectionDialog::addButtonClicked() { LOG_STR("ManualConnectionDialog::addButtonClicked()\n") ; const bool hasIpv6 = !Connection::Ipv6AddressesEqual(iController.getNode().ipv6Addr(), KNullIpv6Addr) ; QMessageBox msgBox; msgBox.setText(tr("DNS lookup failure")) ; msgBox.setStandardButtons( QMessageBox::Ok ); bool isAddressSet (false) ; if ( ui.addressEdit->text().length() > 0 ) { QLOG_STR("Entered network addr " + ui.addressEdit->text()) ; QHostAddress addrToConnect ; QHostInfo info = QHostInfo::fromName(ui.addressEdit->text()) ; if ( info.error() == QHostInfo::NoError ) { // check for ipv6 addr if we have one if ( hasIpv6 ) { foreach ( const QHostAddress& result, info.addresses() ) { if ( result.protocol() == QAbstractSocket::IPv6Protocol ) { isAddressSet = true ; addrToConnect.setAddress(result.toIPv6Address()) ; QLOG_STR("Found valid IPv6 addr " + addrToConnect.toString()) ; break ; } } } if ( isAddressSet == false ) { foreach ( const QHostAddress& result, info.addresses() ) { if ( result.protocol() == QAbstractSocket::IPv4Protocol ) { isAddressSet = true ; addrToConnect.setAddress(result.toIPv4Address()) ; QLOG_STR("Found valid IPv4 addr " + addrToConnect.toString()) ; break ; } } } if ( isAddressSet ) { Node* n = new Node(KNullHash, ui.portEdit->value()) ; if ( addrToConnect.protocol() == QAbstractSocket::IPv4Protocol ) { n->setIpv4Addr(addrToConnect.toIPv4Address()) ; } else { n->setIpv6Addr(addrToConnect.toIPv6Address()) ; } iController.model().nodeModel().addNodeToConnectionWishList(n) ; // nodemodel will delete n close() ; deleteLater() ; } else { msgBox.exec(); } } else { msgBox.exec(); } } } classified-ads-0.13/ui/manualconnection.h000066400000000000000000000031611331670245300204400ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CA_MANUAL_CONNECTION_DIALOG_H #define CA_MANUAL_CONNECTION_DIALOG_H #include #include "../mcontroller.h" #include "../ui_manualConnectionDialog.h" /** * @brief class for manually adding node connection wishlist-item */ class ManualConnectionDialog : public QDialog { Q_OBJECT public: /** * Constructor. */ ManualConnectionDialog(QWidget *aParent, MController& aController ); /** destructor */ ~ManualConnectionDialog(); private slots: void addButtonClicked() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: Ui_manualConnectionDialog ui ; MController& iController ; }; #endif classified-ads-0.13/ui/metadataQuery.cpp000066400000000000000000000104241331670245300202440ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #if QT_VERSION >= 0x050000 // qt5 has its own mime-type-handling so lets depend on that, easier.. #include #else // with qt4 use libmagic that does the same job #include // from libmagic #endif #include #include "../mcontroller.h" #include "../log.h" #include "../datamodel/model.h" #include "metadataQuery.h" MetadataQueryDialog::MetadataQueryDialog(QWidget *aParent, MController& aController, MetadataResultSet& aResultsSet) : QDialog(aParent), iController(aController), iResultsSet ( aResultsSet ) { ui.setupUi(this) ; ui.fileNameEdit->setText(aResultsSet.iFileName) ; if ( aResultsSet.iMimeType.length() == 0 ) { ui.mimetypeEdit->setText(findMimeTypeForFile(aResultsSet.iFileName) ) ; } connect (ui.bottomButtonsBox, SIGNAL(rejected()), this, SLOT(deleteLater())) ; connect (ui.bottomButtonsBox, SIGNAL(accepted()), this, SLOT(okButtonClicked())) ; } MetadataQueryDialog::~MetadataQueryDialog() { LOG_STR("MetadataQueryDialog::~MetadataQueryDialog\n") ; } void MetadataQueryDialog::okButtonClicked() { LOG_STR("MetadataQueryDialog::okButtonClicked\n") ; iResultsSet.iMimeType = ui.mimetypeEdit->text() ; iResultsSet.iDescription = ui.descriptionEdit->text() ; iResultsSet.iOwner = ui.ownerEdit->text() ; iResultsSet.iLicense = ui.licenseComboBox->currentText() ; done(QDialog::Accepted) ; close() ; deleteLater() ; } QString MetadataQueryDialog::findMimeTypeForFile(const QString& aFileName) { QString retval ; #if QT_VERSION >= 0x050000 if ( QFile(aFileName).exists() ) { QMimeDatabase db ; QMimeType detectedType ( db.mimeTypeForFile(aFileName) ) ; if ( detectedType.isValid() ) { retval = detectedType.name() ; } } #else if ( QFile(aFileName).exists() ) { // what is going to happen if the filesystem is not UTF-8 fs ??? const char *fileNameCStyleHeap (aFileName.toUtf8().constData()) ; // serious magick here. if we offer to libmagick the heap buffer // from aFileName.toUtf8().constData() then it will not open the // file .. so lets allocate a stack buffer, as it seems to work. char fileNameCStyle[1024] ; if ( strlen(fileNameCStyleHeap) < 1024 ) { strncpy(fileNameCStyle, fileNameCStyleHeap, 1023) ; // code stolen from http://vivithemage.co.uk/blog/?p=105 so thanks Vivi. magic_t magic_cookie; /*MAGIC_MIME tells magic to return a mime of the file, but you can specify different things*/ magic_cookie = magic_open(MAGIC_MIME); if (magic_cookie == NULL) { QLOG_STR("unable to initialize magic library"); return retval ; } if (magic_load(magic_cookie, NULL) != 0) { LOG_STR2("cannot load magic database - %s", magic_error(magic_cookie)); magic_close(magic_cookie); return retval ; } LOG_STR2("Filename for magic = >%s<", fileNameCStyle); const char *magic_full( magic_file(magic_cookie, fileNameCStyle) ) ; if ( magic_full == NULL ) { LOG_STR2("Magic_file error - %s", magic_error(magic_cookie)); } else { retval = QString::fromUtf8(magic_full) ; } magic_close(magic_cookie); } } #endif return retval ; } classified-ads-0.13/ui/metadataQuery.h000066400000000000000000000045071331670245300177160ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CA_METADATA_DIALOG_H #define CA_METADATA_DIALOG_H #include #include "../mcontroller.h" #include "../ui_metadataQuery.h" /** * @brief class for querying metadata of file about to get published */ class MetadataQueryDialog : public QDialog { Q_OBJECT public: /** * This structure contains results of @ref MetadataQueryDialog * e.g the dialog queries this dataset from user */ typedef struct MetadataResultSetStruct { QString iFileName; /**< name of file in filesystem */ QString iDescription; QString iMimeType; QString iOwner; QString iLicense; } MetadataResultSet ; /** * Constructor. * @param aParent is the parent widget * @param aController is application controller instance * @param aResultsSet is reference to structure where this dialog * will store its results. */ MetadataQueryDialog(QWidget *aParent, MController& aController, MetadataResultSet& aResultsSet ); /** destructor */ ~MetadataQueryDialog(); public slots: void okButtonClicked() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: // methods QString findMimeTypeForFile(const QString& aFileName) ; private: Ui_metadataQuery ui ; MController& iController ; MetadataResultSet& iResultsSet ; }; #endif classified-ads-0.13/ui/metadataQuery.ui000066400000000000000000000141211331670245300200750ustar00rootroot00000000000000 metadataQuery 0 0 751 309 0 0 0 0 File information true 0 0 QDialogButtonBox::Cancel|QDialogButtonBox::Ok false 0 Name of the file: false 0 Owner of file (name or SHA1 if CA operator): Qt::Vertical 20 40 0 License of use: true Public domain GPL LGPL BSD CC-BY CC-BY-SA CC-BY-ND CC-BY-NC CC-BY-NC-SA CC-BY-NC-ND 0 Mime-type: 0 Description of file: 13 75 true Enter information regarding file before publish: fileNameEdit bottomButtonsBox bottomButtonsBox rejected() metadataQuery reject() 411 653 411 335 classified-ads-0.13/ui/newClassifiedAd.ui000066400000000000000000000132711331670245300203210ustar00rootroot00000000000000 newCaDialog 0 0 804 687 0 0 0 0 Post a new classified ad false QLayout::SetMinAndMaxSize 14 75 true About 0 0 of 0 0 in Subject QLayout::SetDefaultConstraint 0 0 Attachment: 0 0 Add Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok bottomButtonsBox accepted() newCaDialog accept() 248 254 157 274 bottomButtonsBox rejected() newCaDialog reject() 316 260 286 274 10 10 true true true classified-ads-0.13/ui/newPrivMsg.ui000066400000000000000000000066141331670245300174000ustar00rootroot00000000000000 newPrivMsgDialog 0 0 800 600 0 0 0 0 Send a private message true Subject Recipient 0 0 Attachments: 0 0 Attach 0 0 QDialogButtonBox::Cancel|QDialogButtonBox::Ok classified-ads-0.13/ui/newProfileComment.ui000066400000000000000000000072261331670245300207340ustar00rootroot00000000000000 newProfileCommentDialog 0 0 823 705 0 0 0 0 Comment a operators profile true Subject Commented profile 0 0 0 0 Attachments: 0 0 Attach 0 0 QDialogButtonBox::Cancel|QDialogButtonBox::Ok classified-ads-0.13/ui/newTextDocument.ui000066400000000000000000000072021331670245300204260ustar00rootroot00000000000000 newTextDocumentDialog 0 0 823 705 0 0 0 0 Edit and publish a new text document true Document title 0 0 0 0 Attachments: 0 0 Attach 0 0 QDialogButtonBox::Cancel|QDialogButtonBox::Ok bottomButtonsBox rejected() newTextDocumentDialog reject() 411 687 411 352 classified-ads-0.13/ui/newclassifiedaddialog.cpp000066400000000000000000000176471331670245300217610ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "newclassifiedaddialog.h" #include "../mcontroller.h" #include "../log.h" #include "../datamodel/model.h" #include "../datamodel/profile.h" #include "../FrontWidget.h" #include "../datamodel/camodel.h" #include "../datamodel/ca.h" #include "../datamodel/contentencryptionmodel.h" #include "../datamodel/calistingmodel.h" NewClassifiedAdDialog::NewClassifiedAdDialog(QWidget *aParent, MController* aController, int aAboutComboxIndex , int aRegardingComboxIndex , int aWhereComboxIndex , const QString& aAboutComboText, const QString& aRegardingComboText, const QString& aWhereComboxText, Profile& aSelectedProfile, CAListingModel& aCaListingModel, const Hash* aReferences, const QString* aSubject ) : TextEdit(aParent, aController, aSelectedProfile), iCAListingModel(aCaListingModel) { ui.setupUi(this) ; initializeTextEditor(ui.adEdit, ui.gridLayout, ui.toolBoxForActionsUpper, ui.toolBoxForActionsLower) ; iAttachmentListLabel = ui.attachmentListLabel ; FrontWidget::fillCaSelectionCombobox(*ui.caAboutComboBox,true,*aController) ; FrontWidget::fillCaSelectionCombobox(*ui.caRegardingCombobox,false,*aController) ; if ( aReferences ) { iReferences = *aReferences ; } ui.caWhereComboBox->addItems(aController->model().classifiedAdsModel().whereComboBoxTexts()) ; if ( aSubject ) { ui.subjectEdit->setText(*aSubject) ; } ui.caAboutComboBox->setEditable(true) ; ui.caAboutComboBox->setInsertPolicy(QComboBox::InsertAtBottom) ; ui.caRegardingCombobox->setEditable(true) ; ui.caRegardingCombobox->setInsertPolicy(QComboBox::InsertAtBottom) ; ui.caWhereComboBox->setEditable(true) ; ui.caWhereComboBox->setInsertPolicy(QComboBox::InsertAtBottom) ; LOG_STR2("aAboutComboxIndex = %d\n", aAboutComboxIndex) ; LOG_STR2("ClassifiedAdsModel::ToBeAnnounced = %d\n", (int)(ClassifiedAdsModel::ToBeAnnounced)) ; if ( aAboutComboxIndex == -1 ) { // custom text LOG_STR2("aAboutComboText = %s\n", qPrintable(aAboutComboText) ); QLOG_STR("aAboutComboIndex = %s\n" + QString::number(aAboutComboxIndex) ); ui.caAboutComboBox->addItem(aAboutComboText) ; ui.caAboutComboBox->setCurrentIndex(ui.caAboutComboBox->count()-1) ; } else { QLOG_STR("aAboutComboIndex = %s\n" + QString::number(aAboutComboxIndex) ); ui.caAboutComboBox->setCurrentIndex(aAboutComboxIndex) ; } if ( aRegardingComboxIndex == -1 ) { // custom text LOG_STR2( "aRegardingComboText= %s\n", qPrintable(aRegardingComboText) ); ui.caRegardingCombobox->addItem(aRegardingComboText) ; ui.caRegardingCombobox->setCurrentIndex(ui.caRegardingCombobox->count()-1) ; } else { ui.caRegardingCombobox->setCurrentIndex(aRegardingComboxIndex) ; } if ( aWhereComboxIndex == -1 ) { // custom text LOG_STR2( "aWhereComboxText= %s\n", qPrintable(aWhereComboxText) ); ui.caWhereComboBox->addItem(aWhereComboxText) ; ui.caWhereComboBox->setCurrentIndex(ui.caWhereComboBox->count()-1) ; } else { ui.caWhereComboBox->setCurrentIndex(aWhereComboxIndex) ; } connect(ui.bottomButtonsBox, SIGNAL(accepted()), this, SLOT(okButtonClicked())); connect(ui.bottomButtonsBox, SIGNAL(rejected()), this, SLOT(cancelButtonClicked())); connect(ui.addAttachmentBtn, SIGNAL(clicked()), this, SLOT(attachButtonClicked())); } NewClassifiedAdDialog::~NewClassifiedAdDialog() { LOG_STR("NewClassifiedAdDialog::~NewClassifiedAdDialog\n") ; } void NewClassifiedAdDialog::okButtonClicked() { LOG_STR("NewClassifiedAdDialog::okButtonClicked\n") ; Hash selectedUserProfileHash ( iController->profileInUse() ) ; CA ad ; if ( selectedUserProfileHash != KNullHash && ui.subjectEdit->text().length() > 0 && ui.adEdit->toHtml().length() > 0 ) { if ( iSelectedProfile.iIsPrivate == false ) { ad.iSenderName = iSelectedProfile.displayName() ; } foreach (const MetadataQueryDialog::MetadataResultSet& attachmentFile , iFilesAboutToBeAttached ) { Hash attachmentHash = publishBinaryAttachment(attachmentFile, true) ; if ( attachmentHash != KNullHash ) { ad.iAttachedFiles.append(attachmentHash) ; } } ad.iSubject = ui.subjectEdit->text() ; ad.iMessageText = ui.adEdit->toHtml() ; ad.iGroup = FrontWidget::selectedClassification(*ui.caAboutComboBox, *ui.caRegardingCombobox, *ui.caWhereComboBox, *iController) ; ad.iSenderHash = iSelectedProfile.iFingerPrint ; ad.iTimeOfPublish = QDateTime::currentDateTimeUtc().toTime_t() ; ad.iReplyTo = iReferences ; int indexOfAboutCombo ( iController->model().classifiedAdsModel().aboutComboBoxTexts().indexOf(ui.caAboutComboBox->currentText()) ) ; int indexOfRegardingCombo ( iController->model().classifiedAdsModel().regardingComboBoxTexts().indexOf(ui.caRegardingCombobox->currentText()) ) ; int indexOfWhereCombo ( iController->model().classifiedAdsModel().whereComboBoxTexts().indexOf(ui.caWhereComboBox->currentText()) ) ; if ( indexOfAboutCombo != -1 ) { ad.iAboutComboBoxIndex = indexOfAboutCombo ; } else { ad.iAboutComboBoxText = ui.caAboutComboBox->currentText() ; } if ( indexOfRegardingCombo != -1 ) { ad.iConcernsComboBoxIndex = indexOfRegardingCombo ; } else { ad.iConcernsComboBoxText = ui.caRegardingCombobox->currentText() ; } // hopefully the indexing of countries won't change inside Qt?? // if it does, we'll need to start incorporating the old list // inside classified ads or groupings will just .. not work if ( indexOfWhereCombo != -1 ) { ad.iInComboBoxIndex = indexOfWhereCombo ; } else { ad.iInComboBoxText = ui.caWhereComboBox->currentText() ; } iController->model().lock() ; quint32 dummy ; if ( iController->model().contentEncryptionModel().PublicKey(iSelectedProfile.iFingerPrint, ad.iProfileKey, &dummy )) { ad.iFingerPrint = iController->model().classifiedAdsModel().publishClassifiedAd(iSelectedProfile, ad) ; } iController->model().unlock() ; } Hash hashOfClassification ; hashOfClassification.fromString(reinterpret_cast(ad.iGroup.toUtf8().constData())) ; iController->model().lock() ; iCAListingModel.newCaReceived(ad) ; iController->model().unlock() ; close() ; this->deleteLater() ; } void NewClassifiedAdDialog::cancelButtonClicked() { LOG_STR("NewClassifiedAdDialog::cancelButtonClicked\n") ; close() ; this->deleteLater() ; } classified-ads-0.13/ui/newclassifiedaddialog.h000066400000000000000000000070661331670245300214200ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef NEW_CLASSIFIED_AD_DIALOG_H #define NEW_CLASSIFIED_AD_DIALOG_H #include #include "../mcontroller.h" #include "../ui_newClassifiedAd.h" #include "../textedit/textedit.h" class ProfileSearchModel ; class ProfileReadersListingModel ; class Profile ; class CAListingModel ; /** * @brief class for allowing posting of new classified ad * * Inherits @ref DialogBase via @ref TextEdit where most editing * functionality comes from. */ class NewClassifiedAdDialog : public TextEdit { Q_OBJECT public: /** * Constructor. * * @param aParent is owner-window of this dialog * @param aController application controller reference * @param aAboutComboxIndex index of combobox of "about" in classification-selection * @param aRegardingComboxIndex index of combobox of "regarding" in classification-selection * @param aWhereComboxIndex index of combobox of "in" in classification-selection * @param aAboutComboText text of combobox in of "about" in classification-selection ; this may be text * typed by user, in which case the index (aAboutComboxIndex) is ignored * @param aRegardingComboText text of combobox in of "regarding" in classification-selection * @param aWhereComboxText text of combobox in of "where" in classification-selection * @param aSelectedProfile profile doing the sending * @param aReferences if CA is reply to another CA, this is article referenced. NULL * if article is start of a new thread. * @param aSubject if CA is reply to another CA, this is subject of * the original posting */ NewClassifiedAdDialog(QWidget *aParent, MController* aController, int aAboutComboxIndex , int aRegardingComboxIndex , int aWhereComboxIndex , const QString& aAboutComboText, const QString& aRegardingComboText, const QString& aWhereComboxText, Profile& aSelectedProfile, CAListingModel& aCaListingModel, const Hash* aReferences = NULL, const QString* aSubject = NULL ); /** destructor */ ~NewClassifiedAdDialog(); private slots: void okButtonClicked() ; void cancelButtonClicked() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: Ui_newCaDialog ui ; Hash iReferences ; /**< if we're referencing another CA, this is the FP */ CAListingModel& iCAListingModel ; }; #endif classified-ads-0.13/ui/newprivmsgdialog.cpp000066400000000000000000000145711331670245300210260ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "newprivmsgdialog.h" #include "../mcontroller.h" #include "../log.h" #include "../datamodel/model.h" #include "../datamodel/profile.h" #include "../FrontWidget.h" #include "../datamodel/privmsgmodel.h" #include "../datamodel/privmsg.h" #include "../datamodel/contentencryptionmodel.h" #include "../datamodel/profilemodel.h" NewPrivMessageDialog::NewPrivMessageDialog(QWidget *aParent, MController* aController, const QString& aRecipient, const QString& aSubject, Profile& aSelectedProfile, PrivateMessageSearchModel& aSearchModel, const Hash& aReferencesMsg, const Hash& aReferencesCa, const Hash& aRecipientsNode ) : TextEdit(aParent,aController,aSelectedProfile), iSearchModel(aSearchModel), iRecipientsNode(aRecipientsNode) { ui.setupUi(this) ; initializeTextEditor(ui.messageEdit, ui.gridLayout, ui.toolBoxLayoutUpper, ui.toolBoxLayoutLower) ; iReferencesMsg = aReferencesMsg ; iReferencesCa = aReferencesCa ; ui.subjectEdit->setText(aSubject) ; ui.recipientEdit->setText(aRecipient) ; iAttachmentListLabel = ui.attachmentsListLabel ; connect(ui.attachButton, SIGNAL(clicked()), this, SLOT(attachButtonClicked())); connect(ui.bottomButtonsBox, SIGNAL(accepted()), this, SLOT(okButtonClicked())); connect(ui.bottomButtonsBox, SIGNAL(rejected()), this, SLOT(cancelButtonClicked())); ui.messageEdit->setFocus(Qt::PopupFocusReason) ; } NewPrivMessageDialog::~NewPrivMessageDialog() { LOG_STR("NewPrivMessageDialog::~NewPrivMessageDialog") ; } void NewPrivMessageDialog::okButtonClicked() { LOG_STR("NewPrivMessageDialog::okButtonClicked") ; Hash selectedUserProfileHash ( iController->profileInUse() ) ; PrivMessage msg ; msg.iSenderName = iSelectedProfile.displayName() ; msg.iSubject = ui.subjectEdit->text() ; msg.iMessageText = ui.messageEdit->toHtml() ; msg.iSenderHash = iSelectedProfile.iFingerPrint ; if ( msg.iSenderName == msg.iSenderHash.toString() ) { msg.iSenderName.clear() ; } QLOG_STR("Privmsg msg.iSenderHash = " + msg.iSenderHash.toString() ) ; msg.iTimeOfPublish = QDateTime::currentDateTimeUtc().toTime_t() ; msg.iRecipient.fromString(reinterpret_cast(ui.recipientEdit->text().toLatin1().constData())) ; if ( msg.iRecipient == KNullHash ) { QMessageBox::about(this, tr("Error"), tr("Recipient addr is not valid")) ; } else { QLOG_STR("Privmsg msg.iRecipient = " + msg.iRecipient.toString() ) ; quint32 dummy ; QByteArray dummyRecipientKey ; if ( iController->model().contentEncryptionModel().PublicKey(msg.iRecipient, dummyRecipientKey, &dummy )) { if ( iReferencesMsg != KNullHash ) { msg.iReplyToMsg = iReferencesMsg ; } else { msg.iReplyToMsg = KNullHash ; } if ( iReferencesCa != KNullHash ) { msg.iReplyToCa = iReferencesCa ; } else { msg.iReplyToCa = KNullHash ; } QList* attachmentRecipients = new QList() ; attachmentRecipients->append(iSelectedProfile.iFingerPrint) ; // self attachmentRecipients->append(msg.iRecipient) ; // recipient foreach (const MetadataQueryDialog::MetadataResultSet& attachmentFile , iFilesAboutToBeAttached ) { Hash attachmentHash = publishBinaryAttachment(attachmentFile, false, attachmentRecipients ) ; if ( attachmentHash != KNullHash ) { msg.iAttachedFiles.append(attachmentHash) ; } } delete attachmentRecipients ; attachmentRecipients = NULL ; iController->model().lock() ; if ( iRecipientsNode == KNullHash ) { iRecipientsNode = tryFindRecipientNode(msg.iRecipient) ; } iController->model().contentEncryptionModel().PublicKey(iSelectedProfile.iFingerPrint, msg.iProfileKey, &dummy ) ; iController->model().privateMessageModel().publishPrivMessage(msg, iRecipientsNode) ; iSearchModel.newMsgReceived(msg) ; iController->model().unlock() ; } else { QMessageBox::about(this, tr("Error"), tr("Recipient encryption key not found from storage")) ; } close() ; this->deleteLater() ; } } void NewPrivMessageDialog::cancelButtonClicked() { LOG_STR("NewPrivMessageDialog::cancelButtonClicked") ; close() ; this->deleteLater() ; } Hash NewPrivMessageDialog::tryFindRecipientNode(const Hash& aRecipientFingerPrint) { Hash retval ; Profile *recipientProfile (NULL) ; if ( ( recipientProfile = iController->model().profileModel().profileByFingerPrint(aRecipientFingerPrint, false/* do not emit encryption errors*/, true /* omit image */) ) != NULL ) { if ( recipientProfile->iNodeOfProfile ) { retval = recipientProfile->iNodeOfProfile->nodeFingerPrint() ; } delete recipientProfile ; } return retval ; } classified-ads-0.13/ui/newprivmsgdialog.h000066400000000000000000000057701331670245300204740ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef NEW_PRIVATE_MESSAGE_DIALOG_H #define NEW_PRIVATE_MESSAGE_DIALOG_H #include "../textedit/textedit.h" #include "../mcontroller.h" #include "../ui_newPrivMsg.h" #include "../datamodel/profile.h" class PrivMessage ; class PrivMessageModel ; class PrivateMessageSearchModel ; /** * @brief class for allowing posting of a message to named recipient * */ class NewPrivMessageDialog : public TextEdit { Q_OBJECT public: /** * Constructor. * * @param aParent is owner-window of this dialog * @param aController application controller reference * @param aRecipient profile that will receive the message * @param aSubject if msg is reply to another msg, this is subject of * the original posting * @param aSelectedProfile profile doing the sending * @param aReferences if msg is reply to another msg, this is article referenced. NULL * if article is start of a new thread. */ NewPrivMessageDialog(QWidget *aParent, MController* aController, const QString& aRecipient, const QString& aSubject, Profile& aSelectedProfile, PrivateMessageSearchModel& aSearchModel, const Hash& aReferencesMsg = KNullHash, const Hash& aReferencesCa = KNullHash, const Hash& aRecipientsNode = KNullHash); /** destructor */ ~NewPrivMessageDialog(); private slots: void okButtonClicked() ; void cancelButtonClicked() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: // methods // if recipients node is not known, here try finding out one Hash tryFindRecipientNode(const Hash& aRecipientFingerPrint) ; private: Ui_newPrivMsgDialog ui ; Hash iReferencesMsg ; /**< if we're referencing another msg, this is the FP */ Hash iReferencesCa ; /**< if we're referencing ca, this is the FP */ PrivateMessageSearchModel& iSearchModel ; Hash iRecipientsNode ; }; #endif classified-ads-0.13/ui/newprofilecommentdialog.cpp000066400000000000000000000132311331670245300223520ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "newprofilecommentdialog.h" #include "../log.h" #include "../datamodel/model.h" #include "../datamodel/profilecomment.h" #include "../datamodel/profile.h" #include "../datamodel/profilecommentmodel.h" #include "../datamodel/profilecommentlistingmodel.h" #include "../datamodel/profilemodel.h" #include "../FrontWidget.h" #include "../datamodel/contentencryptionmodel.h" #include "attachmentlistdialog.h" // for tryFindNodeByProfile() NewProfileCommentDialog::NewProfileCommentDialog(QWidget *aParent, MController* aController, const QString& aCommentedProfile, const QString& aSubject, Profile& aSelectedProfile, ProfileCommentListingModel& aCommentListingModel, const Hash& aReferencesMsg, const Hash& aReferencesCa, const Hash& aRecipientsNode) : TextEdit(aParent, aController, aSelectedProfile), iRecipientsNode(aRecipientsNode), iCommentListingModel(aCommentListingModel) { ui.setupUi(this) ; initializeTextEditor(ui.messageEdit, ui.gridLayout, ui.toolBoxLayoutUpper, ui.toolBoxLayoutLower) ; iReferencesMsg = aReferencesMsg ; iReferencesCa = aReferencesCa ; ui.subjectEdit->setText(aSubject) ; ui.commentedProfileEdit->setText(aCommentedProfile) ; iAttachmentListLabel = ui.attahcmentsListLabel ; connect(ui.attachButton, SIGNAL(clicked()), this, SLOT(attachButtonClicked())); connect(ui.bottomButtonsBox, SIGNAL(accepted()), this, SLOT(okButtonClicked())); connect(ui.bottomButtonsBox, SIGNAL(rejected()), this, SLOT(cancelButtonClicked())); ui.messageEdit->setFocus(Qt::PopupFocusReason) ; } NewProfileCommentDialog::~NewProfileCommentDialog() { LOG_STR("NewProfileCommentDialog::~NewProfileCommentDialog") ; } void NewProfileCommentDialog::okButtonClicked() { LOG_STR("NewProfileCommentDialog::okButtonClicked") ; Hash selectedUserProfileHash ( iController->profileInUse() ) ; ProfileComment comment ; if ( iSelectedProfile.iIsPrivate == false ) { comment.iCommentorNickName = iSelectedProfile.displayName() ; } comment.iSubject = ui.subjectEdit->text() ; comment.iCommentText = ui.messageEdit->toHtml() ; comment.iCommentorHash = iSelectedProfile.iFingerPrint ; QLOG_STR("New profile comment comment.iCommentorHash = " + comment.iCommentorHash.toString() ) ; comment.iTimeOfPublish = QDateTime::currentDateTimeUtc().toTime_t() ; comment.iProfileFingerPrint.fromString(reinterpret_cast(ui.commentedProfileEdit->text().toLatin1().constData())) ; if ( comment.iProfileFingerPrint == KNullHash ) { QMessageBox::about(this, tr("Error"), tr("Commented profile addr is not valid")) ; } else { QLOG_STR("Profilecomment comment.iProfileFingerPrint = " + comment.iProfileFingerPrint.toString() ) ; if ( iReferencesMsg != KNullHash ) { comment.iReferences = iReferencesMsg ; comment.iTypeOfObjectReferenced = PrivateMessage ; } else if ( iReferencesCa != KNullHash ) { comment.iReferences = iReferencesCa ; comment.iTypeOfObjectReferenced = ClassifiedAd ; } else { comment.iReferences = KNullHash ; } foreach (const MetadataQueryDialog::MetadataResultSet& attachmentFile , iFilesAboutToBeAttached ) { Hash attachmentHash = publishBinaryAttachment(attachmentFile, false) ; if ( attachmentHash != KNullHash ) { comment.iAttachedFiles.append(attachmentHash) ; } } // TODO: // set iReferences to some meaningful value iController->model().lock() ; if ( iRecipientsNode == KNullHash ) { iRecipientsNode = AttachmentListDialog::tryFindNodeByProfile(comment.iProfileFingerPrint, *iController) ; } quint32 dummy ; if ( iController->model().contentEncryptionModel().PublicKey(iSelectedProfile.iFingerPrint, comment.iKeyOfCommentor, &dummy )) { if ( iController->model().profileCommentModel().publishProfileComment(comment) ) { iCommentListingModel.newCommentReceived(comment) ; } } else { QMessageBox::about(this, tr("Error"), tr("Recipient encryption key not found from storage")) ; } iController->model().unlock() ; close() ; this->deleteLater() ; } } void NewProfileCommentDialog::cancelButtonClicked() { LOG_STR("NewProfileCommentDialog::cancelButtonClicked") ; close() ; this->deleteLater() ; } classified-ads-0.13/ui/newprofilecommentdialog.h000066400000000000000000000062571331670245300220310ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef NEW_PROFILE_COMMENT_DIALOG_H #define NEW_PROFILE_COMMENT_DIALOG_H #include #include "../mcontroller.h" #include "../ui_newProfileComment.h" #include "../datamodel/profile.h" #include "../textedit/textedit.h" class ProfileCommentListingModel ; /** * @brief class for allowing posting of a comment about user profile * */ class NewProfileCommentDialog : public TextEdit { Q_OBJECT public: /** * Constructor. * * @param aParent is owner-window of this dialog * @param aController application controller reference * @param aCommentedProfile is fingerprint of the profile * that is about to be commented. If KNullHash, then * dialog will open with empty recipient * @param aSubject if comment is reply to another comment, this is subject of * the original posting * @param aSelectedProfile profile doing the sending * @param aReferencesMsg if msg is reply to another msg, this is article referenced. NULL * if article is start of a new thread. */ NewProfileCommentDialog (QWidget *aParent, MController* aController, const QString& aCommentedProfile, const QString& aSubject, Profile& aSelectedProfile, ProfileCommentListingModel& aCommentListingModel, const Hash& aReferencesMsg = KNullHash, const Hash& aReferencesCa = KNullHash, const Hash& aRecipientsNode = KNullHash); /** destructor */ ~NewProfileCommentDialog (); private slots: void okButtonClicked() ; void cancelButtonClicked() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: // methods // if recipients node is not known, here try finding out one Hash tryFindRecipientNode(const Hash& aRecipientFingerPrint) ; private: Ui_newProfileCommentDialog ui ; Hash iReferencesMsg ; /**< if we're referencing another msg, this is the FP */ Hash iReferencesCa ; /**< if we're referencing ca, this is the FP */ Hash iRecipientsNode ; ProfileCommentListingModel& iCommentListingModel ; }; #endif classified-ads-0.13/ui/newtextdocument.cpp000066400000000000000000000071611331670245300206770ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "newtextdocument.h" #include "../log.h" #include "../datamodel/model.h" #include "../FrontWidget.h" #include "../datamodel/binaryfilemodel.h" #include "../datamodel/binaryfilelistingmodel.h" #include "../datamodel/profilemodel.h" #include "../datamodel/profile.h" NewTextDocument::NewTextDocument(QWidget *aParent, MController* aController, Profile& aSelectedProfile, BinaryFileListingModel& aProfileFileListingModel) : TextEdit(aParent, aController, aSelectedProfile) , iProfileFileListingModel(aProfileFileListingModel) { ui.setupUi(this) ; initializeTextEditor(ui.documentEdit, ui.gridLayout, ui.toolBoxLayoutUpper, ui.toolBoxLayoutLower) ; iAttachmentListLabel = ui.attahcmentsListLabel ; // lets not have attachments in here, this thing itself // is more or less an attachment ; user can create links and // that is ok ui.attahcmentsListLabel->hide() ; ui.attachButton->hide() ; ui.attachmentsLabel->hide() ; connect(ui.bottomButtonsBox, SIGNAL(accepted()), this, SLOT(okButtonClicked())); connect(ui.bottomButtonsBox, SIGNAL(rejected()), this, SLOT(cancelButtonClicked())); ui.titleEdit->setFocus(Qt::PopupFocusReason) ; } NewTextDocument::~NewTextDocument() { LOG_STR("NewTextDocument::~NewTextDocument") ; } void NewTextDocument::okButtonClicked() { LOG_STR("NewTextDocument::okButtonClicked") ; QString fileName ; if ( ui.titleEdit->text().remove(QChar(' ')).length() < 1 ) { fileName = "doc.html" ; } else { fileName = ui.titleEdit->text().remove(QChar(' '))+".html" ; } QByteArray content ( qCompress( ui.documentEdit->toHtml().toUtf8() ) ) ; iController->model().lock() ; Hash publishedFileHash = iController->model().binaryFileModel().publishBinaryFile(iSelectedProfile, fileName, ui.titleEdit->text(), "application/classified_ads_text", QString(), QString(), content, true) ; iController->model().unlock() ; if ( publishedFileHash != KNullHash ) { iProfileFileListingModel.addFile(publishedFileHash) ; iSelectedProfile.iTimeOfPublish = QDateTime::currentDateTimeUtc().toTime_t() ; iController->model().profileModel().publishProfile(iSelectedProfile) ; close() ; this->deleteLater() ; } } void NewTextDocument::cancelButtonClicked() { LOG_STR("NewTextDocument::cancelButtonClicked") ; close() ; this->deleteLater() ; } classified-ads-0.13/ui/newtextdocument.h000066400000000000000000000037011331670245300203400ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef NEW_TEXT_DOCUMENT_DIALOG_H #define NEW_TEXT_DOCUMENT_DIALOG_H #include #include "../mcontroller.h" #include "../ui_newTextDocument.h" #include "../textedit/textedit.h" class Profile ; class BinaryFileListingModel ; /** * @brief class for editing and publishing a new text document */ class NewTextDocument : public TextEdit { Q_OBJECT public: /** * Constructor. * * @param aParent is owner-window of this dialog * @param aController application controller reference */ NewTextDocument (QWidget *aParent, MController* aController, Profile& aSelectedProfile, BinaryFileListingModel& aProfileFileListingModel ); /** destructor */ ~NewTextDocument (); private slots: void okButtonClicked() ; void cancelButtonClicked() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: Ui_newTextDocumentDialog ui ; BinaryFileListingModel& iProfileFileListingModel ; }; #endif classified-ads-0.13/ui/passwd_dialog.cpp000066400000000000000000000116721331670245300202640ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2016. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "passwd_dialog.h" #include "../mcontroller.h" #include "../log.h" #include "../datamodel/model.h" #include "../datamodel/contentencryptionmodel.h" PasswdDialog::PasswdDialog(QWidget *aParent, MController& aController, const QString& aPrompt, bool aIsPwdQueryDialog) : QDialog(aParent), iController(aController), iPrompt(aPrompt), iIsPwdQueryDialog(aIsPwdQueryDialog) { ui.setupUi(this) ; connect(ui.okButton, SIGNAL(clicked()), this, SLOT(okClicked())); ui.passwordPromptLabel->setText( aPrompt ); ui.passwordEdit->setFocus() ; ui.passwordEdit->setEchoMode(QLineEdit::Password) ; connect(ui.echoPwdCheckBox, SIGNAL(stateChanged(int)), this, SLOT(showPasswordCheckBoxStateChanged(int))) ; LOG_STR("### PasswdDialog constructor out") ; } PasswdDialog::~PasswdDialog() { LOG_STR("PasswdDialog::~PasswdDialog") ; } void PasswdDialog::okClicked() { QString text = ui.passwordEdit->text(); bool goodPasswordFound = false ; // 5 characters is damn lousy passwd. // this implementation does not restrict user to // any particular passwd max len, informed users are // still free to use long passphrases. if ( text.size() > 4 ) { if ( iIsPwdQueryDialog ) { iController.model().lock() ; iController.setContentKeyPasswd(text) ; QList privateKeys = iController.model().contentEncryptionModel().listKeys(true,NULL) ; if ( privateKeys.size() == 0 ) { // because we had no secret key of any kind lets generate one iController.setProfileInUse(iController.model().contentEncryptionModel().generateKeyPair()) ; close() ; this->deleteLater() ; } else { // try each private key we have, if we have one // where the password matches then use that for ( int i = 0 ; i < privateKeys.size() ; i++ ) { Hash keyFingerPrint = privateKeys[i] ; QLOG_STR("Trying key fp " + keyFingerPrint.toString()) ; QByteArray PEMBytes ; if ( iController.model().contentEncryptionModel().PrivateKey(keyFingerPrint,PEMBytes) == true ) { EVP_PKEY* privateKey = iController.model().contentEncryptionModel().PrivateKeyFromPem(PEMBytes,false) ; if ( privateKey != NULL ) { // if we came here e.g. got the key, it is a sign // that we also had the correct password to open the key iController.setProfileInUse(keyFingerPrint) ; EVP_PKEY_free(privateKey) ; close() ; QLOG_STR("Using profile " + keyFingerPrint.toString()) ; this->deleteLater() ; goodPasswordFound = true ; } } } if ( !goodPasswordFound ) { QString errmsg("Bad password") ; emit error(MController::BadPassword, errmsg) ; } } iController.model().unlock() ; } else { // this is password change dialog iController.model().lock() ; if ( iController.model().contentEncryptionModel().changeKeyPassword(iController.profileInUse(),text) == 0 ) { iController.setContentKeyPasswd(text) ; } iController.model().unlock() ; close() ; this->deleteLater() ; } } else { QString errmsg(tr("Min length 5 (use 10+)")) ; emit error(MController::ContentEncryptionError, errmsg) ; } } void PasswdDialog::showPasswordCheckBoxStateChanged(int aState) { if ( aState == Qt::Checked ) { ui.passwordEdit->setEchoMode(QLineEdit::Normal) ; } else { ui.passwordEdit->setEchoMode(QLineEdit::Password) ; } } classified-ads-0.13/ui/passwd_dialog.h000066400000000000000000000042011331670245300177170ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2016. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PASSWD_DIALOG_H #define PASSWD_DIALOG_H #include #include "../mcontroller.h" #include "../ui_passwordDialog.h" class MController ; /** * @brief class for querying a password from user. * * thanks to Jasmin Blanchette and Mark Summerfield * who wrote the article at * http://www.informit.com/articles/article.aspx?p=1405224 * where this code here is more-or-less stolen from. */ class PasswdDialog : public QDialog { Q_OBJECT public: /** * Constructor. * * @param aParent is owner-window of this dialog * @param aController application controller reference * @param aPrompt text presented to user * @param aIsPwdQueryDialog if set to true, queries. If * false this dialog will change the password */ PasswdDialog(QWidget *aParent, MController& aController, const QString &aPrompt, bool aIsPwdQueryDialog = true ); ~PasswdDialog(); private slots: void okClicked(); void showPasswordCheckBoxStateChanged(int aState); signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: Ui_PasswordDialog ui ; MController& iController ; QString iPrompt ; bool iIsPwdQueryDialog ; }; #endif classified-ads-0.13/ui/passwordDialog.ui000066400000000000000000000033611331670245300202550ustar00rootroot00000000000000 PasswordDialog 0 0 385 178 Password required Should you forget this word, there is no easy way to recover any of your content 10 30 381 20 Enter password for protection of your messages 10 70 361 27 If you forget this word, there is no simple way to recover your contents 260 120 109 28 OK 10 110 241 20 Show password classified-ads-0.13/ui/profileCommentDisplay.ui000066400000000000000000000030401331670245300215760ustar00rootroot00000000000000 profileCommentDisplay 0 0 823 705 0 0 0 0 Comments regarding operator true 0 0 QDialogButtonBox::Close false classified-ads-0.13/ui/profileReadersDialog.ui000066400000000000000000000102451331670245300213600ustar00rootroot00000000000000 profileReadersDialog 0 0 635 577 0 0 0 0 Profile readers list Qt::RightToLeft Search for profiles to add First 100 matching profiles: 0 0 200 0 Add selected to list of readers Current list of readers 0 0 Close 0 0 150 0 Remove selected 0 0 462 0 Qt::LeftToRight searchEdit listView addSelectedButton currentListOfReadersView removeSelectedItemsButton closeButton classified-ads-0.13/ui/profilecommentdisplay.cpp000066400000000000000000000200211331670245300220410ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include "profilecommentdisplay.h" #include "../mcontroller.h" #include "../log.h" #include "../datamodel/model.h" #include "../datamodel/profilecomment.h" #include "../datamodel/profilecommentmodel.h" #include "../datamodel/profilecommentlistingmodel.h" #include "../datamodel/profile.h" #include "profilecommentitemdelegate.h" #include "newprofilecommentdialog.h" #include "attachmentlistdialog.h" ProfileCommentDisplay::ProfileCommentDisplay(QWidget *aParent, MController* aController, ProfileCommentListingModel* aListingModel, ProfileCommentModel& aCommentModel, const Hash& aFirstCommentToDisplay, const Hash& aViewedProfile , Profile& aSelectedProfile ) : DialogBase(aParent, aController, aSelectedProfile), iListingModel(aListingModel), iCommentModel(aCommentModel), iCommentToDisplay ( aFirstCommentToDisplay ), iItemDelegate(NULL), iViewedProfile ( aViewedProfile ), iExportSharedFileAction(NULL) { ui.setupUi(this) ; // button "close" emits "rejected" signal? connect(ui.bottomButtonsBox, SIGNAL(rejected()), this, SLOT(closeButtonClicked())); QPushButton* newCommentButton = new QPushButton(tr("&Add comment...")); connect(newCommentButton, SIGNAL(clicked()), this, SLOT(newCommentButtonClicked())) ; // here buttonbox takes ownership of the newCommentButton so it // may not be deleted from this class any more ui.bottomButtonsBox->addButton(newCommentButton, QDialogButtonBox::ActionRole); ui.commentListView->setModel(aListingModel) ; ui.commentListView->setModelColumn(0) ; iExportSharedFileAction = new QAction(tr("Save attachment to disk.."),this) ; ui.commentListView->setContextMenuPolicy(Qt::ActionsContextMenu); ui.commentListView->addAction(iExportSharedFileAction) ; connect(iExportSharedFileAction, SIGNAL(triggered()), this, SLOT(exportSharedFile())) ; ProfileCommentItemDelegate* iItemDelegate = new ProfileCommentItemDelegate(*iListingModel, *(ui.commentListView), NULL); ui.commentListView->setItemDelegate(iItemDelegate) ; connect(ui.commentListView->selectionModel(), SIGNAL(currentChanged ( const QModelIndex & , const QModelIndex & ) ), this, SLOT(currentItemChanged(const QModelIndex & , const QModelIndex & ))) ; iExportSharedFileAction->setEnabled(false) ; // try to set focus on selected comment, if any if (aFirstCommentToDisplay != KNullHash ) { QModelIndexList matchingArticles = aListingModel->match (aListingModel->index(0,0) , Qt::UserRole, aFirstCommentToDisplay.toQVariant(), 1, Qt::MatchExactly ) ; if ( matchingArticles.size() > 0 ) { ui.commentListView->selectionModel()->select(matchingArticles[0],QItemSelectionModel::Select) ; ui.commentListView->scrollTo(matchingArticles[0]) ; } else { QMessageBox::about(this,tr("Error"), tr("Article not found from local storage")); } } } ProfileCommentDisplay::~ProfileCommentDisplay() { LOG_STR("ProfileCommentDisplay::~ProfileCommentDisplay") ; ui.commentListView->setItemDelegate(NULL) ; delete iItemDelegate ; delete iExportSharedFileAction ; } void ProfileCommentDisplay::exportSharedFile() { LOG_STR("ProfileCommentDisplay::exportSharedFile " + iFingerPrintOfCommentOnFocus.toString() ) ; ProfileComment* p ( NULL ); if ( iFingerPrintOfCommentOnFocus != KNullHash && ( p = iCommentModel.profileCommentByFingerPrint(iFingerPrintOfCommentOnFocus) ) != NULL ) { QLOG_STR("Nr of attachments = " + QString::number(p->iAttachedFiles.count())) ; iController->model().lock() ; AttachmentListDialog *listing_dialog = new AttachmentListDialog(this, iController, iSelectedProfile, p->iAttachedFiles, AttachmentListDialog::tryFindNodeByProfile(p->iCommentorHash, *iController)) ; iController->model().unlock() ; connect(listing_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; connect (this, SIGNAL(finished(int)), listing_dialog, SLOT(reject()), Qt::QueuedConnection) ; listing_dialog->show() ; // the dialog will delete self delete p ; } } void ProfileCommentDisplay::closeButtonClicked() { LOG_STR("ProfileCommentDisplay::closeButtonClicked") ; close() ; this->deleteLater() ; } void ProfileCommentDisplay::currentItemChanged(const QModelIndex & aCurrent, const QModelIndex & /*aPrevious*/ ) { LOG_STR("ProfileCommentDisplay::currentItemChanged") ; unsigned numberOfAttachments = 0 ; numberOfAttachments = iListingModel->data(aCurrent,Qt::UserRole+3).toUInt(); iFingerPrintOfCommentOnFocus.fromString((const unsigned char *)(qPrintable(iListingModel->data(aCurrent,Qt::ToolTipRole).toString()))) ; if ( numberOfAttachments == 0 ) { iExportSharedFileAction->setEnabled(false) ; } else { iExportSharedFileAction->setEnabled(true) ; } } void ProfileCommentDisplay::newCommentButtonClicked() { LOG_STR("ProfileCommentDisplay::newCommentButtonClicked ") ; QString subject = "" ; ProfileComment* p ( NULL ); if ( iFingerPrintOfCommentOnFocus != KNullHash ) { iController->model().lock() ; p = iCommentModel.profileCommentByFingerPrint(iFingerPrintOfCommentOnFocus) ; iController->model().unlock(); if ( p ) { subject = p->iSubject ; delete p ; } } NewProfileCommentDialog *posting_dialog = new NewProfileCommentDialog(this, iController, iViewedProfile.toString(), subject, iSelectedProfile, *iListingModel ) ; connect(posting_dialog, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection ) ; posting_dialog->show() ; // the dialog will delete self. // if this dialog is closed, cascade to possible posting dialog too connect ( this, SIGNAL(rejected()), posting_dialog, SLOT(cancelButtonClicked()), Qt::QueuedConnection ) ; } classified-ads-0.13/ui/profilecommentdisplay.h000066400000000000000000000055601331670245300215210ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PROFILECOMMENTDISPLAY_DIALOG_H #define PROFILECOMMENTDISPLAY_DIALOG_H #include #include "../mcontroller.h" #include "../ui_profileCommentDisplay.h" #include "dialogbase.h" class ProfileCommentListingModel ; class ProfileCommentModel ; class ProfileComment ; class QPushButton ; class ProfileCommentItemDelegate ; class Profile ; class QAction ; /** * @brief class for display of single classified ad */ class ProfileCommentDisplay : public DialogBase { Q_OBJECT public: /** * Constructor. * * @param aParent is owner-window of this dialog * @param aController application controller reference * @param aListingModel where the content comes from * @param aCommentModel needed when posting new comments * @param aFirstCommentToDisplay where dialog should scroll initialy * @param aViewedProfile profile whose comments are displayed */ ProfileCommentDisplay(QWidget *aParent, MController* aController, ProfileCommentListingModel* aListingModel, ProfileCommentModel& aCommentModel, const Hash& aFirstCommentToDisplay, const Hash& aViewedProfile , Profile& aSelectedProfile); /** destructor */ ~ProfileCommentDisplay(); private slots: void closeButtonClicked() ; /** * method for handling "add comment"-button */ void newCommentButtonClicked() ; void exportSharedFile() ; void currentItemChanged(const QModelIndex & current, const QModelIndex & previous ) ; private: Ui_profileCommentDisplay ui ; ProfileCommentListingModel* iListingModel; ProfileCommentModel& iCommentModel; Hash iCommentToDisplay; ProfileCommentItemDelegate* iItemDelegate ; Hash iViewedProfile ; QAction* iExportSharedFileAction ; /**< context-menu action for saving to filesystem a shared file */ Hash iFingerPrintOfCommentOnFocus ; }; #endif classified-ads-0.13/ui/profilecommentitemdelegate.cpp000066400000000000000000000124631331670245300230400ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2016. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "profilecommentitemdelegate.h" #include #include // for styles #include #include #include "../datamodel/profilecommentlistingmodel.h" #include "../log.h" // ideas mostly stolen from // http://stackoverflow.com/questions/1956542/how-to-make-item-view-render-rich-html-text-in-qt // so thanks Serge :) ProfileCommentItemDelegate::ProfileCommentItemDelegate(ProfileCommentListingModel& aListingModel, const QWidget& aDrawableWidget, QObject* aParent ) : QStyledItemDelegate(aParent), iListingModel(aListingModel) , iDrawableWidget(aDrawableWidget) { // empty, just initialize the listing model } ProfileCommentItemDelegate::~ProfileCommentItemDelegate() { } void ProfileCommentItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItem optionV4 = option; initStyleOption(&optionV4, index); QStyle *style = optionV4.widget? optionV4.widget->style() : QApplication::style(); QTextDocument doc; doc.setHtml(iListingModel.data(index, Qt::UserRole+1).toString()); QString textToDisplayOnTop (iListingModel.data(index, Qt::UserRole+2).toString()) ; // Painting item without text optionV4.text = QString(); style->drawControl(QStyle::CE_ItemViewItem, &optionV4, painter); QAbstractTextDocumentLayout::PaintContext ctx; QPalette::ColorGroup cg = option.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled; if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) { cg = QPalette::Inactive; } // Highlighting text if item is selected if (optionV4.state & QStyle::State_Selected) { ctx.palette.setColor(QPalette::Text, optionV4.palette.color(QPalette::Active, QPalette::HighlightedText)); } // textRect is whole item rect QRect textRect = option.rect ; doc.setTextWidth(iDrawableWidget.width()-10); painter->save(); // paint "title text" on top of the rect painter->drawText(QRect(textRect.left(), textRect.top(), iDrawableWidget.width()-10, QFontMetrics(painter->font()).height()), option.displayAlignment, textToDisplayOnTop); const unsigned numberOfAttachments = iListingModel.data(index, Qt::UserRole+3).toUInt() ; if ( numberOfAttachments == 0 ) { // then figure out where the html should begin: after the "title text" QPoint drawingOffsetForHtml ( 0 , QFontMetrics(painter->font()).height()+textRect.top() ) ; painter->translate(drawingOffsetForHtml) ; } else { // print also number of attachments painter->drawText(QRect(textRect.left(), textRect.top()+QFontMetrics(painter->font()).height(), iDrawableWidget.width()-10, QFontMetrics(painter->font()).height()), option.displayAlignment, tr("Attachments: ") + QString::number(numberOfAttachments)); // then set offset to be top+2 lines of text QPoint drawingOffsetForHtml ( 0 , (2*QFontMetrics(painter->font()).height())+textRect.top() ) ; painter->translate(drawingOffsetForHtml) ; } // and draw the actual comment text: doc.documentLayout()->draw(painter, ctx); painter->restore(); } QSize ProfileCommentItemDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const { QStyleOptionViewItem options = option; initStyleOption(&options, index); QTextDocument doc; doc.setHtml(iListingModel.data(index, Qt::UserRole+1).toString()); doc.setTextWidth(iDrawableWidget.width()-10); const QFont font = QApplication::font(); // why making this a member variable results in crash at dialog close?? const QFontMetrics fm(font); // so, now automatics and works const unsigned numberOfAttachments = iListingModel.data(index, Qt::UserRole+3).toUInt() ; if ( numberOfAttachments == 0 ) { QSize retval( iDrawableWidget.width()-10, doc.size().height()+fm.height()); return retval ; } else { QSize retval( iDrawableWidget.width()-10, doc.size().height()+(fm.height()*2)); return retval ; } } classified-ads-0.13/ui/profilecommentitemdelegate.h000066400000000000000000000043611331670245300225030ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PROFILECOMMENTITEM_DELEGATE_H #define PROFILECOMMENTITEM_DELEGATE_H #include class ProfileCommentListingModel ; /** * @brief class for displaying single profile comment in a list view */ class ProfileCommentItemDelegate : public QStyledItemDelegate { Q_OBJECT public: /** * Constructor * @param aListingModel is the datamodel part where content comes from * @param aDrawableWidget is the container where these items will * be drawn. It is passed here because we want to query * its dimensions at runtime. * @param aParent possible parent item */ ProfileCommentItemDelegate(ProfileCommentListingModel& aListingModel, const QWidget& aDrawableWidget, QObject* aParent = NULL ) ; /** destructor */ ~ProfileCommentItemDelegate() ; protected: /** * implemented from class QStyledItemDelegate */ void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const; /** * implemented from class QStyledItemDelegate */ QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const; private: ProfileCommentListingModel& iListingModel ; const QWidget& iDrawableWidget ; }; #endif /* PROFILECOMMENTITEM_DELEGATE_H */ classified-ads-0.13/ui/profilereadersdialog.cpp000066400000000000000000000135111331670245300216240ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "profilereadersdialog.h" #include "../mcontroller.h" #include "../log.h" #include "../datamodel/model.h" #include "../datamodel/profilesearchmodel.h" #include "../datamodel/profilereaderslistingmodel.h" #include "../datamodel/profile.h" ProfileReadersDialog::ProfileReadersDialog(QWidget *aParent, MController* aController, Profile &aProfile) : QDialog(aParent), iController(aController), iSearchModel(NULL), iProfile(aProfile), iListingModel(NULL), iViewProfileAction(NULL) { ui.setupUi(this) ; connect(ui.closeButton, SIGNAL(clicked()), this, SLOT(closeButtonClicked())); connect(ui.addSelectedButton, SIGNAL(clicked()), this, SLOT(addButtonClicked())); connect(ui.removeSelectedItemsButton, SIGNAL(clicked()), this, SLOT(removeButtonClicked())); iSearchModel = new ProfileSearchModel(iController->model()) ; connect(iSearchModel, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection) ; ui.listView->setModel(iSearchModel) ; iTimerId = startTimer(1000); // 1-second timer iPreviousSearchFieldContent = ui.searchEdit->text() ; iListingModel = new ProfileReadersListingModel(iProfile,*aController) ; connect(iListingModel, SIGNAL( error(MController::CAErrorSituation, const QString&) ), iController, SLOT(handleError(MController::CAErrorSituation, const QString&)), Qt::QueuedConnection) ; ui.currentListOfReadersView->setModel(iListingModel) ; #if QT_VERSION >= 0x050000 // qt5 ui.currentListOfReadersView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); #else ui.currentListOfReadersView->horizontalHeader()->setResizeMode(QHeaderView::Stretch); #endif ui.searchEdit->setFocus() ; iViewProfileAction = new QAction(tr("View profile"), this) ; ui.currentListOfReadersView->setContextMenuPolicy(Qt::ActionsContextMenu); ui.currentListOfReadersView->addAction(iViewProfileAction) ; connect(iViewProfileAction, SIGNAL(triggered()), this, SLOT(viewProfileSelected())) ; } ProfileReadersDialog::~ProfileReadersDialog() { LOG_STR("ProfileReadersDialog::~ProfileReadersDialog") ; killTimer(iTimerId) ; ui.listView->setModel(NULL) ; ui.currentListOfReadersView->setModel(NULL) ; delete iListingModel ; delete iSearchModel ; delete iViewProfileAction ; } void ProfileReadersDialog::closeButtonClicked() { LOG_STR("ProfileReadersDialog::closeButtonClicked") ; close() ; this->deleteLater() ; } void ProfileReadersDialog::viewProfileSelected() { LOG_STR("ProfileReadersDialog::viewProfileSelected") ; iController->model().lock() ; Hash fingerPrint (KNullHash); foreach(const QModelIndex &index, ui.currentListOfReadersView->selectionModel()->selectedIndexes()) { fingerPrint.fromString((const unsigned char *)(qPrintable(iListingModel->data(index,Qt::ToolTipRole).toString()))); break ; } iController->model().unlock() ; if ( fingerPrint != KNullHash ) { iController->userInterfaceAction(MController::ViewProfileDetails, fingerPrint) ; close() ; this->deleteLater() ; } } void ProfileReadersDialog::removeButtonClicked() { LOG_STR("ProfileReadersDialog::removeButtonClicked") ; iController->model().lock() ; foreach(const QModelIndex &index, ui.currentListOfReadersView->selectionModel()->selectedIndexes()) { Hash fingerPrint ; fingerPrint.fromString((const unsigned char *)(qPrintable(iListingModel->data(index,Qt::ToolTipRole).toString()))); if ( fingerPrint != iProfile.iFingerPrint ) { // can't remove self from // list of readers iListingModel->removeReader(fingerPrint); } } iController->model().unlock() ; } void ProfileReadersDialog::addButtonClicked() { LOG_STR("addButtonClicked") ; iController->model().lock() ; foreach(const QModelIndex &index, ui.listView->selectionModel()->selectedIndexes()) { Hash fingerPrint ; fingerPrint.fromString((const unsigned char *)(qPrintable(iSearchModel->data(index,Qt::ToolTipRole).toString()))); iListingModel->addReader(fingerPrint); } iController->model().unlock() ; } void ProfileReadersDialog::timerEvent(QTimerEvent * /*event*/) { if ( iPreviousSearchFieldContent != ui.searchEdit->text() ) { LOG_STR("Change in string..") ; iController->model().lock() ; iSearchModel->setSearchString(ui.searchEdit->text() ) ; iController->model().unlock() ; } iPreviousSearchFieldContent = ui.searchEdit->text() ; } classified-ads-0.13/ui/profilereadersdialog.h000066400000000000000000000050341331670245300212720ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PROFILE_READERs_DIALOG_H #define PROFILE_READERs_DIALOG_H #include #include "../mcontroller.h" #include "../ui_profileReadersDialog.h" class ProfileSearchModel ; class QTimerEvent ; class ProfileReadersListingModel ; class Profile ; class QAction ; /** * @brief class for allowing edit of profile readers list * */ class ProfileReadersDialog : public QDialog { Q_OBJECT public: /** * Constructor. * * @param aParent is owner-window of this dialog * @param aController application controller reference * @param aProfile is profile whose readers are listed */ ProfileReadersDialog(QWidget *aParent, MController* aController, Profile& aProfile ); /** destructor */ ~ProfileReadersDialog(); protected: /** * method used to check for changes in users search-field ; this way * user can keep on typing and we can perform the search when * field content changes .. */ void timerEvent(QTimerEvent *event); private slots: void closeButtonClicked() ; void addButtonClicked() ; void removeButtonClicked() ; void viewProfileSelected() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: Ui_profileReadersDialog ui ; MController* iController ; ProfileSearchModel* iSearchModel ; /**< datamodel that does search */ int iTimerId ; QString iPreviousSearchFieldContent ; Profile& iProfile ; ProfileReadersListingModel* iListingModel ; /**< datamodel that lists names in nifty manner */ QAction *iViewProfileAction ; }; #endif classified-ads-0.13/ui/rightarrow.png000066400000000000000000000013771331670245300176370ustar00rootroot00000000000000‰PNG  IHDR(бПЫŠgAMAБ ќasRGBЎЮщsBITлсOр oFFsк*ЖЮtIMEтў(№V#tEXtSoftwarePOV-Ray 3.7.0.4.unofficialЮiи[XtEXtCommentRender Date: 2018-04-05 19:07:30Z Platform: x86_64-pc-linux-gnu Compiler: g++ 7 ЊЮtЗпIDATH‰Хз;kTAряФ]M4j!СвТЦZёX‹XX––‚…Ѕ`уАPRXZˆ !(ŠHLQcŒ’шfMВyEИqoВЏРФœђюaО™ГчЬн”’нˆО]Qw ~б5'ђ–z""Xa’sWЮyтбˆeŽuKЮп‹˜cuЛЪЋŽЯ`†:‹…Н—ээl№{>1ЫЌ‚~žЕБГСУ)ё…_ЬvАŸ‘VvЮцNщ%“…НTиƒ<йbgžус”žѓZaЏбЧa•эќШ§”Ц˜ІЙЩ+ •гJШыи\‘ю7PћH|х TAƒгї~з„ЖєzйDЫЛjš~*`Г)•рёЌЧmЙeVxУ•”*OылTЃевэ*5~Ђ(LѕFЖћДУNВJƒ“\пTjмьсuЖ­ИDk4˜cŠ‹[›+c<Ž8J?{Xc‰:гœoВђЯёУˆ#ь+ЮКФ<3Œ–г2У"†ŠГ&–Y`–Зм)—6'|7т8…КТ"ПљШ-_h6јvФ sВЎжјЬЕVm” >У`“КоЦпИкІyГС‡Јх6Ом~drŽгxD*д\јoП2OЅД1<#]ГгФ­–н‘›Ћ—иЕџNпv2ЈГўуIENDЎB`‚classified-ads-0.13/ui/searchDisplay.ui000066400000000000000000000102131331670245300200600ustar00rootroot00000000000000 searchDisplay 0 0 823 671 0 0 0 0 Search data storage true 0 0 QDialogButtonBox::Close|QDialogButtonBox::Open false 0 Words: Search 0 Network search Qt::Vertical Search ads true Search profiles true Search comments true wordsEdit searchButton networkSearchCheckBox searchCAsCheckBox searchProfilesCheckBox searchCommentsCheckBox resultsView bottomButtonsBox bottomButtonsBox rejected() searchDisplay reject() 411 653 411 335 classified-ads-0.13/ui/searchdisplay.cpp000066400000000000000000000145161331670245300202770ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2018. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "searchdisplay.h" #include "../log.h" #include "../datamodel/model.h" #include "../datamodel/searchmodel.h" #include "../datamodel/profile.h" #include "../mcontroller.h" #include #include SearchDisplay::SearchDisplay(QWidget *aParent, MController* aController, SearchModel* aSearchModel, Profile& aSelectedProfile ) : DialogBase(aParent, aController, aSelectedProfile), iSearchModel(aSearchModel), iOpenAction(NULL), iSearchDisplayKeyboardGrabber(NULL) { ui.setupUi(this) ; ui.resultsView->setModel(aSearchModel) ; ui.resultsView->setModelColumn(0) ; connect (this, SIGNAL(rejected()), this, SLOT(deleteLater())) ; connect (ui.searchButton, SIGNAL(clicked()), this, SLOT(searchButtonClicked())) ; connect (ui.bottomButtonsBox, SIGNAL(accepted()), this, SLOT(openButtonClicked())) ; ui.wordsEdit->setFocus() ; connect(ui.resultsView->selectionModel(), SIGNAL(currentChanged ( const QModelIndex & , const QModelIndex & ) ), this, SLOT(currentItemChanged(const QModelIndex & , const QModelIndex & ))) ; connect(ui.resultsView, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(resultListDoubleClicked(const QModelIndex&))) ; iOpenAction = new QAction(tr("Open.."),this) ; ui.resultsView->setContextMenuPolicy(Qt::ActionsContextMenu); ui.resultsView->addAction(iOpenAction) ; connect(iOpenAction, SIGNAL(triggered()), this, SLOT(openSelectedContent())) ; // grab enter key iSearchDisplayKeyboardGrabber = new QShortcut(QKeySequence(QKeySequence::InsertParagraphSeparator),this) ; // and make entery key perform search in this dialog connect(iSearchDisplayKeyboardGrabber, SIGNAL(activated()), this, SLOT(keyEnterClicked())) ; if ( iSearchModel->isFTSSupported() == false ) { // if we can't do search ourselves, have only network search // available ui.networkSearchCheckBox->setCheckState(Qt::Checked) ; ui.networkSearchCheckBox->setEnabled(false) ; } } SearchDisplay::~SearchDisplay() { LOG_STR("SearchDisplay::~SearchDisplay") ; delete iOpenAction ; delete iSearchDisplayKeyboardGrabber ; } void SearchDisplay::closeButtonClicked() { LOG_STR("SearchDisplay::closeButtonClicked") ; close() ; this->deleteLater() ; } void SearchDisplay::searchButtonClicked() { LOG_STR("SearchDisplay::searchButtonClicked") ; iController->model().lock() ; iSearchModel->setSearchString(ui.wordsEdit->text(), ui.searchCAsCheckBox->isChecked(), ui.searchProfilesCheckBox->isChecked(), ui.searchCommentsCheckBox->isChecked(), ui.networkSearchCheckBox->isChecked()) ; iController->model().unlock() ; } void SearchDisplay::keyEnterClicked() { LOG_STR("SearchDisplay::keyEnterClicked") ; if ( ui.wordsEdit->hasFocus() ) { searchButtonClicked() ; } } void SearchDisplay::openButtonClicked() { LOG_STR("SearchDisplay::okButtonClicked") ; if ( iHashOfFocusedResult != KNullHash ) { openSelectedContent() ; } } void SearchDisplay::currentItemChanged(const QModelIndex & aCurrent, const QModelIndex & /*aPrevious*/ ) { iHashOfFocusedResult.fromQVariant(iSearchModel->data(aCurrent,Qt::UserRole)) ; iNodeOfFocusedResult.fromQVariant(iSearchModel->data(aCurrent,Qt::UserRole+2)) ; iTypeOfFocusedResult = (ProtocolItemType)(iSearchModel->data(aCurrent,Qt::UserRole+1).toInt()) ; QLOG_STR("SearchDisplay::currentItemChanged "+ QString::number(iTypeOfFocusedResult) + " " + iHashOfFocusedResult.toString() ) ; } void SearchDisplay::resultListDoubleClicked(const QModelIndex& aIndex) { LOG_STR("resultListDoubleClicked\n") ; iHashOfFocusedResult.fromQVariant(iSearchModel->data(aIndex,Qt::UserRole)) ; iNodeOfFocusedResult.fromQVariant(iSearchModel->data(aIndex,Qt::UserRole+2)) ; iTypeOfFocusedResult = (ProtocolItemType)(iSearchModel->data(aIndex,Qt::UserRole+1).toInt()) ; openSelectedContent() ; } void SearchDisplay::openSelectedContent() { LOG_STR("openSelectedContent\n") ; if ( iHashOfFocusedResult != KNullHash ) { switch ( iTypeOfFocusedResult ) { case ClassifiedAd: iController->userInterfaceAction(MController::ViewCa, iHashOfFocusedResult, iNodeOfFocusedResult) ; close() ; break ; case UserProfile: iController->userInterfaceAction(MController::ViewProfileDetails, iHashOfFocusedResult, iNodeOfFocusedResult) ; close() ; break ; case UserProfileComment: iController->userInterfaceAction(MController::ViewProfileComment, iHashOfFocusedResult, iNodeOfFocusedResult) ; close() ; break ; default: QLOG_STR("Unhandled UI item type " + QString::number(iTypeOfFocusedResult) + " in open") ; break ; } } } classified-ads-0.13/ui/searchdisplay.h000066400000000000000000000051351331670245300177410ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef SEARCH_DISPLAY_DIALOG_H #define SEARCH_DISPLAY_DIALOG_H #include "../mcontroller.h" #include "../ui_searchDisplay.h" #include "dialogbase.h" class SearchModel ; class Profile ; class QAction ; class QShortcut ; /** * @brief class for search dialog */ class SearchDisplay : public DialogBase { Q_OBJECT public: /** * Constructor. * * @param aParent is owner-window of this dialog * @param aController application controller reference * @param aSearchModel where the content comes from. ownership is not * claimed e.g. this dialog does not delete the model. * @param aSelectedProfile profile of operator currently searching */ SearchDisplay(QWidget *aParent, MController* aController, SearchModel* aSearchModel , Profile& aSelectedProfile); /** destructor */ ~SearchDisplay(); signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private slots: void closeButtonClicked() ; void searchButtonClicked() ;/**< performs search */ void keyEnterClicked() ;/**< conditionally performs search */ void openButtonClicked() ; /**< opens selected item from results-list */ void resultListDoubleClicked(const QModelIndex& aIndex); void currentItemChanged(const QModelIndex & current, const QModelIndex & previous ) ; void openSelectedContent() ; private: Ui_searchDisplay ui ; SearchModel* iSearchModel; Hash iHashOfFocusedResult ; ProtocolItemType iTypeOfFocusedResult ; Hash iNodeOfFocusedResult ; QAction* iOpenAction ; /**< context-menu action for open */ QShortcut* iSearchDisplayKeyboardGrabber ; }; #endif classified-ads-0.13/ui/settings.cpp000066400000000000000000000100121331670245300172670ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2016. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "../mcontroller.h" #include "../log.h" #include "../datamodel/model.h" #include "../datamodel/profilemodel.h" #include "../datamodel/binaryfilemodel.h" #include "../datamodel/camodel.h" #include "../datamodel/privmsgmodel.h" #include "../datamodel/profilecommentmodel.h" #include "../datamodel/cadbrecordmodel.h" #include "settings.h" SettingsDialog::SettingsDialog(QWidget *aParent, MController& aController) : QDialog(aParent), iController(aController) { ui.setupUi(this) ; connect(ui.bottomButtonsBox, SIGNAL(accepted()), this, SLOT(okButtonClicked())); connect(ui.bottomButtonsBox, SIGNAL(rejected()), this, SLOT(cancelButtonClicked())); ui.portEdit->setValue ( iController.model().nodeModel().listenPortOfThisNode() ); ui.dnsNameEdit->setText ( iController.model().nodeModel().getDnsName() ); ui.nrProfilesEdit->setValue ( iController.model().profileModel().getMaxRowsToKeep() ); ui.nrMessagesEdit->setValue ( iController.model().privateMessageModel().getMaxRowsToKeep() ); ui.nrBinaryFilesEdit->setValue ( iController.model().binaryFileModel().getMaxRowsToKeep() ); ui.nrAdsEdit->setValue ( iController.model().classifiedAdsModel().getMaxRowsToKeep() ); ui.nrCommenstEdit->setValue ( iController.model().profileCommentModel().getMaxRowsToKeep() ); ui.nrDbRecordsEdit->setValue ( iController.model().caDbRecordModel()->getMaxRowsToKeep() ); ui.dnsNameEdit->setText( iController.getNode().DNSAddr()) ; ui.ringtoneComboBox->setCurrentIndex( (int)(iController.model().getRingtoneSetting())) ; ui.callAcceptanceComboBox->setCurrentIndex( (int)(iController.model().getCallAcceptanceSetting())) ; adjustSize() ; connect (this, SIGNAL(rejected()), this, SLOT(deleteLater())) ; } SettingsDialog::~SettingsDialog() { LOG_STR("SettingsDialog::~SettingsDialog\n") ; } void SettingsDialog::okButtonClicked() { LOG_STR("SettingsDialog::okButtonClicked\n") ; iController.model().nodeModel().setListenPortOfThisNode(ui.portEdit->value()); iController.model().nodeModel().setDnsName(ui.dnsNameEdit->text()) ; iController.model().profileModel().setMaxRowsToKeep(ui.nrProfilesEdit->value()) ; iController.model().privateMessageModel().setMaxRowsToKeep(ui.nrMessagesEdit->value ( ) ) ; iController.model().binaryFileModel().setMaxRowsToKeep(ui.nrBinaryFilesEdit->value ( )); iController.model().classifiedAdsModel().setMaxRowsToKeep(ui.nrAdsEdit->value ( )); iController.model().profileCommentModel().setMaxRowsToKeep(ui.nrCommenstEdit->value ( )) ; iController.model().caDbRecordModel()->setMaxRowsToKeep(ui.nrDbRecordsEdit->value ( )) ; iController.getNode().setDNSAddr(ui.dnsNameEdit->text( ) ) ; iController.model().setRingtoneSetting( (Model::RingtoneSetting)(ui.ringtoneComboBox->currentIndex())) ; iController.model().setCallAcceptanceSetting( (Model::CallAcceptanceSetting)(ui.callAcceptanceComboBox->currentIndex())) ; close() ; this->deleteLater() ; } void SettingsDialog::cancelButtonClicked() { LOG_STR("SettingsDialog::cancelButtonClicked\n") ; close() ; this->deleteLater() ; } classified-ads-0.13/ui/settings.h000066400000000000000000000030711331670245300167430ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef SETTINGS_DIALOG_H #define SETTINGS_DIALOG_H #include #include "../mcontroller.h" #include "../ui_settingsDialog.h" /** * @brief class for editing node-wide settings * */ class SettingsDialog : public QDialog { Q_OBJECT public: /** * Constructor. */ SettingsDialog(QWidget *aParent, MController& aController ); /** destructor */ ~SettingsDialog(); private slots: void okButtonClicked() ; void cancelButtonClicked() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: Ui_settingsDialog ui ; MController& iController ; }; #endif classified-ads-0.13/ui/settingsDialog.ui000066400000000000000000000301441331670245300202520ustar00rootroot00000000000000 settingsDialog 0 0 400 536 0 0 0 0 Node settings true TCP listen port 100 0 100 16777215 Incoming TCP listen port. Change requires node restart. Qt::LeftToRight Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1 65535 30000 DNS name of node If you have permanent DNS name for your machine, you may type it here to be used to reference your node 255 Data store limits: 0 Nr of profiles to keep 100 0 100 16777215 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1000 1000000 1000 Nr of private messages to keep 100 0 100 16777215 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1000 1000000 1000 Nr of binary blobs to keep 100 0 100 16777215 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1000 100000 1000 Nr of CAs to keep 100 0 100 16777215 Number of classified ads to keep in storage, total, including all classifications. Oldest referenced will be deleted first. Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1000 100000 1000 Nr of profile comments to keep 100 0 100 16777215 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1000 100000 1000 Nr of db records to keep 100 16777215 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1000 1000000 1000 0 Ringtone Bow Electrical Acoustic Beep Silence Accept voice calls All From trusted operators Accept no voice calls 0 0 QDialogButtonBox::Cancel|QDialogButtonBox::Ok classified-ads-0.13/ui/status.cpp000066400000000000000000000055271331670245300167710ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "../mcontroller.h" #include "../log.h" #include "../datamodel/model.h" #include "../datamodel/connectionlistingmodel.h" #include "status.h" #include "manualconnection.h" StatusDialog::StatusDialog(QWidget *aParent, MController& aController) : QDialog(aParent), iController(aController), iListingModel(NULL) { ui.setupUi(this) ; connect(ui.addConnectionButton, SIGNAL(clicked()), this, SLOT(addButtonClicked())); ui.portDisplay->setText ( QString::number(iController.model().nodeModel().listenPortOfThisNode()) ); if ( iController.getNode().ipv4Addr() ) { QHostAddress ipv4 ( iController.getNode().ipv4Addr() ) ; ui.ipv4display->setText ( ipv4.toString()) ; } if ( Connection::Ipv6AddressesEqual(iController.getNode().ipv6Addr(), KNullIpv6Addr ) == false ) { QHostAddress ipv6 ( iController.getNode().ipv6Addr() ) ; ui.ipv6display->setText ( ipv6.toString()) ; } adjustSize() ; connect (this, SIGNAL(rejected()), this, SLOT(deleteLater())) ; iListingModel = new ConnectionListingModel(iController.model(), iController) ; ui.connectionsView->setModel(iListingModel) ; } StatusDialog::~StatusDialog() { LOG_STR("StatusDialog::~StatusDialog\n") ; ui.connectionsView->setModel(NULL) ; delete iListingModel ; } void StatusDialog::addButtonClicked() { LOG_STR("StatusDialog::addButtonClicked()\n") ; const QString dlgName ("classified_ads_manual_connection_dialog") ; ManualConnectionDialog *dialog = this->findChild(dlgName) ; if ( dialog == NULL ) { dialog = new ManualConnectionDialog(this, iController) ; dialog->setObjectName(dlgName) ; dialog->show() ; connect(this, SIGNAL(destroyed()), dialog, SLOT(reject())); } else { dialog->setFocus(Qt::MenuBarFocusReason) ; } } classified-ads-0.13/ui/status.h000066400000000000000000000031361331670245300164300ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CA_STATUS_DIALOG_H #define CA_STATUS_DIALOG_H #include #include "../mcontroller.h" #include "../ui_statusDialog.h" class ConnectionListingModel ; /** * @brief class for displaying connections status * */ class StatusDialog : public QDialog { Q_OBJECT public: /** * Constructor. */ StatusDialog(QWidget *aParent, MController& aController ); /** destructor */ ~StatusDialog(); private slots: void addButtonClicked() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; private: Ui_statusDialog ui ; MController& iController ; ConnectionListingModel* iListingModel ; }; #endif classified-ads-0.13/ui/statusDialog.ui000066400000000000000000000146571331670245300177500ustar00rootroot00000000000000 statusDialog 0 0 820 704 0 0 0 0 Network and connection status true QLayout::SetDefaultConstraint 0 QLayout::SetDefaultConstraint Detected own IPv4 160 22 Should your friend have trouble connecting, give her this address with port number Qt::ScrollBarAlwaysOff Qt::ScrollBarAlwaysOff IPv6 300 0 16777215 22 Should your friend have trouble connecting, give her this address with port number Qt::ScrollBarAlwaysOff Qt::ScrollBarAlwaysOff 0 TCP port currently used 100 22 Qt::ScrollBarAlwaysOff Qt::ScrollBarAlwaysOff Qt::Horizontal 40 20 Currently open connections 0 0 QAbstractItemView::SingleSelection QAbstractItemView::SelectRows true 0 Qt::Horizontal 40 20 Manually add connection Close closeButton clicked() statusDialog reject() 741 678 396 351 classified-ads-0.13/ui/tclConsole.cpp000066400000000000000000000042101331670245300175370ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015-2016. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "../mcontroller.h" #include "../log.h" #include "../datamodel/model.h" #include "tclConsole.h" TclConsoleDialog::TclConsoleDialog(QWidget *aParent, MController& aController) : QDialog(aParent), iController(aController) { ui.setupUi(this) ; connect (this, SIGNAL(rejected()), this, SLOT(deleteLater())) ; connect (ui.evalButton, SIGNAL(clicked()), this, SLOT(evalButtonPressed())) ; ui.listView->setModel(&iConsoleOutputText) ; } TclConsoleDialog::~TclConsoleDialog() { LOG_STR("TclConsoleDialog::~TclConsoleDialog") ; if ( ui.listView ) { ui.listView->setModel(NULL) ; } } void TclConsoleDialog::consoleOutput(QString aMessage) { LOG_STR("TclConsoleDialog::consoleOutput " + aMessage) ; iConsoleOutputText.insertRow(iConsoleOutputText.rowCount()); QModelIndex index = iConsoleOutputText.index(iConsoleOutputText.rowCount()-1) ; iConsoleOutputText.setData(index, aMessage); ui.listView->scrollToBottom() ; } void TclConsoleDialog::evalButtonPressed() { LOG_STR("TclConsoleDialog::evalButtonPressed") ; if ( ui.commandInputEdit->toPlainText().length() > 0 ) { emit evalScript(ui.commandInputEdit->toPlainText(),NULL) ; } } classified-ads-0.13/ui/tclConsole.h000066400000000000000000000037141331670245300172140ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015-2016. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CA_TCLCONSOLE_DIALOG_H #define CA_TCLCONSOLE_DIALOG_H #include #include #include "../mcontroller.h" #include "../ui_tclConsole.h" /** * @brief class for displaying tcl interpreter output */ class TclConsoleDialog : public QDialog { Q_OBJECT public: /** * Constructor. */ TclConsoleDialog(QWidget *aParent, MController& aController ); /** destructor */ ~TclConsoleDialog(); public slots: /** * Messages displayed in the console come in via this slot */ void consoleOutput(QString aMessage) ; private slots: /** * eval-button click is handled in this method */ void evalButtonPressed() ; signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; /** * This signal is emitted if user wishes to have TCL evaluated */ void evalScript(QString aScript,QString* aWindowTitle) ; private: Ui_tclConsoleDialog ui ; MController& iController ; QStringListModel iConsoleOutputText ; /**< holds output text */ }; #endif classified-ads-0.13/ui/tclConsole.ui000066400000000000000000000050141331670245300173750ustar00rootroot00000000000000 tclConsoleDialog 0 0 861 452 0 0 0 0 TCL Interpreter console true 0 0 0 Evaluate Close Interpreter output Command input closeButton clicked() tclConsoleDialog reject() 807 383 430 225 classified-ads-0.13/ui/tclPrograms.cpp000066400000000000000000000243251331670245300177400ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include "../mcontroller.h" #include "../log.h" #include "../datamodel/model.h" #include "../datamodel/tclmodel.h" #include "../datamodel/tclprogram.h" #include "tclPrograms.h" #include "../tcl/tclWrapper.h" TclProgramsDialog::TclProgramsDialog(QWidget *aParent, MController& aController) : QDialog(aParent), iController(aController), iProgramListingModel(0,1), // 0 rows, 1 column iEvalButton(NULL), iIsProgramSaved(false), iIsProgramRunning(false) { ui.setupUi(this) ; connect (this, SIGNAL(rejected()), this, SLOT(deleteLater())) ; iEvalButtonStartText = tr("Evaluate") ; iEvalButtonStopText = tr("Stop program"); iEvalButton = new QPushButton(iEvalButtonStartText, this) ; ui.buttonBox->addButton(iEvalButton, QDialogButtonBox::ActionRole); connect (iEvalButton, SIGNAL(clicked()), this, SLOT(evalButtonPressed())) ; iDeleteButton = new QPushButton(tr("Delete program"), this) ; ui.buttonBox->addButton(iDeleteButton, QDialogButtonBox::ActionRole); connect (iDeleteButton, SIGNAL(clicked()), this, SLOT(discardButtonPressed())) ; connect (ui.buttonBox, SIGNAL(clicked(QAbstractButton *)), this, SLOT(dialogButtonClicked(QAbstractButton *))) ; QMap programsInStorage ( aController.model().tclModel().getListOfTclPrograms()); QLOG_STR("Programs in TCL prog storage = " + QString::number(programsInStorage.count())) ; int i (0); foreach ( const QString& key, programsInStorage.keys() ) { QLOG_STR("Setting to listing model edit role hash " + programsInStorage.value(key).toString() + " for program " + key ) ; QStandardItem* modelItem = new QStandardItem ( key ); modelItem->setData(programsInStorage.value(key).toQVariant()) ; iProgramListingModel.insertRow(i++, modelItem) ; } ui.listView->setModel(&iProgramListingModel) ; connect( ui.listView,SIGNAL( activated(const QModelIndex &) ), this, SLOT( programInListActivated(const QModelIndex &) ) ) ; connect (ui.commandInputEdit, SIGNAL(modificationChanged ( bool )), this, SLOT(editorModificationChanged ( bool ))) ; iEvalButton->setEnabled(false) ; ui.buttonBox->button(QDialogButtonBox::Save)->setEnabled(false) ; } TclProgramsDialog::~TclProgramsDialog() { LOG_STR("TclProgramsDialog::~TclProgramsDialog") ; if ( ui.listView ) { ui.listView->setModel(NULL) ; } iEvalButton = NULL ; // will be automatically deleted, no need here } void TclProgramsDialog::evalButtonPressed() { LOG_STR("TclProgramsDialog::evalButtonPressed") ; if ( iController.tclWrapper().isRunning() == false ) { if ( ui.commandInputEdit->toPlainText().length() > 0 ) { emit evalScript(ui.commandInputEdit->toPlainText(), iNameOfCurrentProgram.length() > 0 ? &iNameOfCurrentProgram : NULL ) ; } } else { iController.tclWrapper().stopScript() ; } } void TclProgramsDialog::saveButtonPressed() { LOG_STR("TclProgramsDialog::saveButtonPressed") ; bool ok; QString name = QInputDialog::getText(this, tr("TCL Program name"), tr("Name:"), QLineEdit::Normal, iNameOfCurrentProgram, &ok); if (ok && !name.isEmpty()) { TclProgram prog ; prog.setProgramName(name) ; prog.setProgramText(ui.commandInputEdit->toPlainText()) ; prog.iTimeOfPublish = QDateTime::currentDateTimeUtc().toTime_t() ; Hash savedProgramFingerPrint ; savedProgramFingerPrint = iController .model() .tclModel() .locallyStoreTclProgram(prog, name == iNameOfCurrentProgram ? iFingerPrintOfCurrentProgram : KNullHash) ; QLOG_STR("At save, fingerprint of new prog = " + savedProgramFingerPrint.toString()) ; if ( name == iNameOfCurrentProgram ) { // same name, replace in index QModelIndex currentIndex ( ui.listView->currentIndex() ) ; if ( currentIndex.isValid() ) { QStandardItem* currentItem ( iProgramListingModel.itemFromIndex(currentIndex) ); if ( currentItem ) { currentItem->setData(savedProgramFingerPrint.toQVariant()) ; } } } else { // same name, add to listing QStandardItem* modelItem = new QStandardItem ( name ); modelItem->setData(savedProgramFingerPrint.toQVariant()) ; iProgramListingModel.insertRow(iProgramListingModel.rowCount(), modelItem) ; } iFingerPrintOfCurrentProgram = savedProgramFingerPrint ; iNameOfCurrentProgram = name ; iEvalButton->setEnabled(ui.commandInputEdit->toPlainText().length() > 0) ; ui.buttonBox->button(QDialogButtonBox::Save)->setEnabled(false) ; iIsProgramSaved = true ; ui.commandInputEdit->document()->setModified(false) ; QLOG_STR("iIsProgramSaved = true ") ; } } void TclProgramsDialog::discardButtonPressed() { LOG_STR("TclProgramsDialog::discardButtonPressed") ; if ( iFingerPrintOfCurrentProgram != KNullHash ) { QMessageBox::StandardButton reply; reply = QMessageBox::question(this, tr("Deletion confirmation"), tr("Permanently delete program %1?").arg(iNameOfCurrentProgram), QMessageBox::Yes|QMessageBox::No); if (reply == QMessageBox::Yes) { if ( iController .model() .tclModel() .discardTclProgram(iFingerPrintOfCurrentProgram) ) { QModelIndex currentIndex ( ui.listView->currentIndex() ) ; if ( currentIndex.isValid() ) { iProgramListingModel.removeRows(currentIndex.row(),1) ; } } } } } void TclProgramsDialog::dialogButtonClicked(QAbstractButton *aButton) { QDialogButtonBox::StandardButton standardButton = ui.buttonBox->standardButton(aButton); switch(standardButton) { // Standard buttons: case QDialogButtonBox::Save: saveButtonPressed() ; break; // Non-standard buttons: case QDialogButtonBox::NoButton: // do no thing: close is handled already in dialog // and eval-button has its own signal break; default: QLOG_STR("TclProgramsDialog::dialogButtonClicked but was not handled"); break ; } } void TclProgramsDialog::tclProgramStarted() { QLOG_STR("TclProgramsDialog::tclProgramStarted") ; if ( iEvalButton ) { iEvalButton->setText(iEvalButtonStopText) ; } iIsProgramRunning = true ; } void TclProgramsDialog::tclProgramStopped() { QLOG_STR("TclProgramsDialog::tclProgramStopped") ; if ( iEvalButton ) { iEvalButton->setText(iEvalButtonStartText) ; } iIsProgramRunning = false ; if ( !iIsProgramSaved ) { iEvalButton->setEnabled(false) ; } } void TclProgramsDialog::programInListActivated(const QModelIndex &aIndex) { Hash originallyActivatedProgram ( iFingerPrintOfCurrentProgram ) ; if ( aIndex.isValid() ) { QStandardItem *activatedItem ( iProgramListingModel.itemFromIndex ( aIndex ) ) ; if ( activatedItem ) { iFingerPrintOfCurrentProgram.fromQVariant(activatedItem->data()) ; iNameOfCurrentProgram = activatedItem->data(Qt::DisplayRole).toString() ; } } QLOG_STR("programInListActivated " + iFingerPrintOfCurrentProgram.toString()) ; if ( originallyActivatedProgram != iFingerPrintOfCurrentProgram ) { // program changed, get program text from storage: const TclProgram p ( iController .model() .tclModel() .tclProgramByFingerPrint(iFingerPrintOfCurrentProgram)); if ( p.iFingerPrint != KNullHash ) { ui.commandInputEdit->document()->setPlainText(p.programText()) ; } iEvalButton->setEnabled(ui.commandInputEdit->toPlainText().length() > 0) ; ui.buttonBox->button(QDialogButtonBox::Save)->setEnabled(false) ; iIsProgramSaved = true ; ui.commandInputEdit->document()->setModified(false) ; QLOG_STR("iIsProgramSaved = true 2") ; } } void TclProgramsDialog::editorModificationChanged ( bool aChanged ) { QLOG_STR("TclProgramsDialog::editorModificationChanged "+ QString::number(aChanged) + " " + QString::number(iIsProgramSaved)) ; if ( !aChanged && !iIsProgramSaved ) { iIsProgramSaved = true ; QLOG_STR("iIsProgramSaved = true 3") ; iEvalButton->setEnabled(ui.commandInputEdit->toPlainText().length() > 0) ; ui.buttonBox->button(QDialogButtonBox::Save)->setEnabled(false) ; } if ( aChanged && iIsProgramSaved ) { iIsProgramSaved = false ; QLOG_STR("iIsProgramSaved = false ") ; if ( !iIsProgramRunning ) { iEvalButton->setEnabled(false) ; } ui.buttonBox->button(QDialogButtonBox::Save)->setEnabled(true) ; } } classified-ads-0.13/ui/tclPrograms.h000066400000000000000000000063011331670245300173770ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2015-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CA_TCLPROGRAMLISTING_DIALOG_H #define CA_TCLPROGRAMLISTING_DIALOG_H #include #include #include "../mcontroller.h" #include "../ui_tclPrograms.h" class QAbstractButton ; /** * @brief class for displaying listing of stored TCL scripts */ class TclProgramsDialog : public QDialog { Q_OBJECT public: /** * Constructor. */ TclProgramsDialog(QWidget *aParent, MController& aController ); /** destructor */ ~TclProgramsDialog(); public slots: /** * used to communicate tcl program start event so dialog * can adjust accordingly */ void tclProgramStarted() ; /** * used to communicate tcl program stop event so dialog * can adjust accordingly */ void tclProgramStopped() ; private slots: /** * eval-button click is handled in this method */ void evalButtonPressed() ; /** * save-button click is handled in this method */ void saveButtonPressed() ; /** * discard-button click is handled in this method */ void discardButtonPressed() ; /** * dialog buttonbox click */ void dialogButtonClicked(QAbstractButton *aButton) ; /** * slot for signaling focus changes on program list */ void programInListActivated(const QModelIndex & aIndex) ; /** * Slot called when user edits code in editor */ void editorModificationChanged ( bool aChanged ); signals: void error(MController::CAErrorSituation aError, const QString& aExplanation) ; /** * This signal is emitted if user wishes to have TCL evaluated */ void evalScript(QString aScript, QString* aWindowTitle) ; private: Ui_tclProgramsDialog ui ; MController& iController ; QStandardItemModel iProgramListingModel ; /**< holds display-list of progs */ QAbstractButton* iEvalButton ; QAbstractButton* iDeleteButton ; /**< button for deleting a script */ QString iEvalButtonStartText ;/**< button text when program not running */ QString iEvalButtonStopText ; /**< button text when program running */ QString iNameOfCurrentProgram ; Hash iFingerPrintOfCurrentProgram ; bool iIsProgramSaved ; /**< true if program is saved to local storage */ bool iIsProgramRunning ; /**< true if program is being interpreted */ }; #endif classified-ads-0.13/ui/tclPrograms.ui000066400000000000000000000046641331670245300175770ustar00rootroot00000000000000 tclProgramsDialog 0 0 909 648 0 0 0 0 TCL programs true 0 0 Stored programs 16777215 200 QAbstractItemView::NoEditTriggers Program code QDialogButtonBox::Close|QDialogButtonBox::Save buttonBox rejected() tclProgramsDialog reject() 454 624 454 323 classified-ads-0.13/ui_resources.qrc000066400000000000000000000035051331670245300175350ustar00rootroot00000000000000 ui/rightarrow.png ui/leftarrow.png ui/turt558.png ui/bow.rawopus ui/electrical.rawopus ui/acoustic.rawopus ui/beep.rawopus images/logo32.png images/mac/editcopy.png images/mac/editcut.png images/mac/editpaste.png images/mac/editredo.png images/mac/editundo.png images/mac/exportpdf.png images/mac/filenew.png images/mac/fileopen.png images/mac/fileprint.png images/mac/filesave.png images/mac/textbold.png images/mac/textcenter.png images/mac/textitalic.png images/mac/textjustify.png images/mac/textleft.png images/mac/textright.png images/mac/textunder.png images/mac/zoomin.png images/mac/zoomout.png images/win/editcopy.png images/win/editcut.png images/win/editpaste.png images/win/editredo.png images/win/editundo.png images/win/exportpdf.png images/win/filenew.png images/win/fileopen.png images/win/fileprint.png images/win/filesave.png images/win/textbold.png images/win/textcenter.png images/win/textitalic.png images/win/textjustify.png images/win/textleft.png images/win/textright.png images/win/textunder.png images/win/zoomin.png images/win/zoomout.png classified-ads-0.13/util/000077500000000000000000000000001331670245300152715ustar00rootroot00000000000000classified-ads-0.13/util/catranslator.cpp000066400000000000000000000104231331670245300204720ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti Jarvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "catranslator.h" #include "../log.h" #include #include #ifdef WIN32 #include #endif /** * Translation domain for gnu gettext library */ static const char* KProgramName ( "classified-ads" ) ; /** * This is magick text between gnu gettext context and the string. * The | is actuallu Qt magick, for some reason Qt wants to have | * at the end of context strings after they come out from lconvert * utility but | is missing when QApplication calls ::translate * method of this class -> thus add the | here. \004 in turn * is gnu gettext magick. */ static const char* KGetTextContextGlue ( "|\004" ) ; CATranslator::CATranslator(QObject* aParent) : QTranslator(aParent) { #ifdef WIN32 // in win32 user typically has no locale set in environment variables // in way that gnu gettext would recognice. offer a bit help: QString langVariableName ( "LANGUAGE=" ) ; QLocale systemLocale ( QLocale::system() ) ; const QString languageName ( systemLocale.name() ) ; putenv((langVariableName + languageName).toUtf8().constData()) ; setlocale(LC_MESSAGES,languageName.toUtf8().constData()); // in win32, assume the translation files reside under // same directory as the binary bindtextdomain(KProgramName,"./"); #else setlocale(LC_ALL,""); // in unix-like systems the installer puts files here: bindtextdomain(KProgramName,"/usr/share/locale"); #endif textdomain(KProgramName); bind_textdomain_codeset(KProgramName, "utf-8") ; } CATranslator::~CATranslator() { } QString CATranslator::translate ( const char * aContext, const char * aSourceText, const char * aDisambiguation #if QT_VERSION >= 0x050000 ,int aPluralForm #endif ) const { char *contextAndSourceText ((char *)malloc(strlen(aContext) + strlen(aSourceText) + 5)) ; if ( contextAndSourceText == NULL ) { // uh, oh, malloc failure return QString::fromUtf8(aSourceText) ; } strcpy(contextAndSourceText, aContext) ; strcat(contextAndSourceText, KGetTextContextGlue) ; strcat(contextAndSourceText, aSourceText) ; char *proposed_string( dgettext(KProgramName, contextAndSourceText) ); if ( strcmp(proposed_string, contextAndSourceText) == 0 ) { // no match, maybe qt platform string free( contextAndSourceText ); if ( QTranslator::isEmpty() ) { // we have no strings in parent class, e.g. native qt // format translation strings: just return the source // text return QString::fromUtf8(aSourceText) ; } else { // we have qt native format translations available, so try there: return QTranslator::translate(aContext, aSourceText, aDisambiguation #if QT_VERSION >= 0x050000 ,aPluralForm #endif ) ; } } else { // yes, a match QString retval( QString::fromUtf8(proposed_string) ) ; free(contextAndSourceText) ; return retval ; } } bool CATranslator::isEmpty() const { return false ; } classified-ads-0.13/util/catranslator.h000066400000000000000000000060301331670245300201360ustar00rootroot00000000000000/* -*-C++-*- Classified Ads is Copyright (c) Antti Jarvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #ifndef CATRANSLATOR_H #define CATRANSLATOR_H /** * @brief Class for translating strings * * Class for providing translations. In practice this wraps gnu gettext * but may have also other sources of translations. Note that Qt allows * multiple translators to be in cascade. */ class CATranslator : public QTranslator { Q_OBJECT public: /** * Constructor. * * Has side-effect of initializing gnu gettext library inside. * This same class may contain gnu gettext .po-file that is * loaded here at constructor. It is still possible to use * the @ref QTranslator::load method to load Qt-format * translation and when @ref CATranslator::translate is called, * this class will first search for .po file contents and if * no match is made, then it will return the translation from * possibly loaded Qt translation file. */ CATranslator(QObject* aParent = NULL) ; /** * Destructor */ ~CATranslator() ; /** * Actual translator method. This is used to return actual strings * * @param aContext string that tells in which context the aSourceText * appears in. * @param aSourceText the actual string to be translated. * @param aDisambiguation if sourceText appears multiple times * in same context, this may be used to * further refine the translation. * @param aPluralForm Maybe used to select for singular/plural form * of the translation e.g. "message received" or * "messages received" * @return Translation. If translation was not available, then * returns aSourceText as it is. */ virtual QString translate(const char *aContext, const char *aSourceText, const char *aDisambiguation = 0 #if QT_VERSION >= 0x050000 , int aPluralForm = -1 ) const Q_DECL_OVERRIDE; #else ) const ; #endif virtual bool isEmpty() const; } ; #endif /* JSONWRAPPER_H */ classified-ads-0.13/util/hash.cpp000066400000000000000000000305021331670245300167200ustar00rootroot00000000000000/* -*-C++-*- Classified Ads is Copyright (c) Antti Jarvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "hash.h" #include #include #include "../log.h" #include #include Hash::Hash() { iHash160bits[0] = iHash160bits[1] = iHash160bits[2] = iHash160bits[3] = iHash160bits[4] = 0 ; } Hash::Hash(const quint32 aHash160bits[KNumberOfIntsInHash]) { iHash160bits[0] = aHash160bits[0] ; iHash160bits[1] = aHash160bits[1] ; iHash160bits[2] = aHash160bits[2] ; iHash160bits[3] = aHash160bits[3] ; iHash160bits[4] = aHash160bits[4] ; } Hash::Hash(const quint32 aBits1, const quint32 aBits2, const quint32 aBits3, const quint32 aBits4, const quint32 aBits5) { iHash160bits[0] = aBits1 ; iHash160bits[1] = aBits2 ; iHash160bits[2] = aBits3 ; iHash160bits[3] = aBits4 ; iHash160bits[4] = aBits5 ; } Hash::Hash(const unsigned char aDigest[KNumberOfIntsInHash*4]) { setFromCharArray(aDigest) ; } // // constructor that takes the hash in ascii string similar that // printf("%X... produces. // Hash::Hash(const char* aHexString, int aHexStringLen) { char single_number[9] ; if ( aHexStringLen != 40 ) { return ; } quint32 h1 ; strncpy(single_number, &(aHexString[0]), 8 ) ; sscanf(single_number, "%X", &h1) ; quint32 h2 ; strncpy(single_number, &(aHexString[8]), 8 ) ; sscanf(single_number, "%X", &h2) ; quint32 h3 ; strncpy(single_number, &(aHexString[16]), 8 ) ; sscanf(single_number, "%X", &h3) ; quint32 h4 ; strncpy(single_number, &(aHexString[24]), 8 ) ; sscanf(single_number, "%X", &h4) ; quint32 h5 ; strncpy(single_number, &(aHexString[32]), 8 ) ; sscanf(single_number, "%X", &h5) ; iHash160bits[0] = h1; iHash160bits[1] = h2 ; iHash160bits[2] = h3 ; iHash160bits[3] = h4 ; iHash160bits[4] = h5 ; } Hash::Hash(const QSslCertificate& aSslCert) { QByteArray d = aSslCert.digest(QCryptographicHash::Sha1) ; setFromCharArray((unsigned char *)(d.data())) ; } void Hash::fromString(const unsigned char* aBuf) { if ( aBuf && strlen((const char*)aBuf) == 8*5) { unsigned int b1,b2,b3,b4,b5 ; // to make compiler happy char str1[9] = {0} ; strncpy(str1,(const char*)&(aBuf[8*0]), 8) ; char str2[9] = {0} ; strncpy(str2,(const char*)&(aBuf[8*1]), 8) ; char str3[9] = {0} ; strncpy(str3,(const char*)&(aBuf[8*2]), 8) ; char str4[9] = {0} ; strncpy(str4,(const char*)&(aBuf[8*3]), 8) ; char str5[9] = {0} ; strncpy(str5,(const char*)&(aBuf[8*4]), 8) ; if ( sscanf(str1, "%X", &b1) == 1 && sscanf(str2, "%X", &b2) == 1 && sscanf(str3, "%X", &b3) == 1 && sscanf(str4, "%X", &b4) == 1 && sscanf(str5, "%X", &b5) == 1 ) { iHash160bits[0] = b1 ; iHash160bits[1] = b2 ; iHash160bits[2] = b3 ; iHash160bits[3] = b4 ; iHash160bits[4] = b5 ; } else { iHash160bits[0] = iHash160bits[1] = iHash160bits[2] = iHash160bits[3] = iHash160bits[4] = 0 ; } } } QString Hash::toString() const { char cStyle [KNumberOfIntsInHash*8+1] ; sprintf(cStyle, "%.8X%.8X%.8X%.8X%.8X", iHash160bits[0], iHash160bits[1], iHash160bits[2], iHash160bits[3], iHash160bits[4]) ; return QString(cStyle); } void Hash::fromQVariant(const QVariant& aQVariantHashValue) { int j = 0 ; QListIterator i(aQVariantHashValue.toList()); while (i.hasNext() && j < 5) { iHash160bits[j++] = i.next().toUInt() ; } } QVariant Hash::toQVariant() const { QVariantList l ; l.append(iHash160bits[0]) ; l.append(iHash160bits[1]) ; l.append(iHash160bits[2]) ; l.append(iHash160bits[3]) ; l.append(iHash160bits[4]) ; return l ; } void Hash::calculate(const QByteArray& aBuf) { if ( aBuf.size() == 0 ) { iHash160bits[0] = 0 ; iHash160bits[1] = 0 ; iHash160bits[2] = 0 ; iHash160bits[3] = 0 ; iHash160bits[4] = 0 ; } else { unsigned char hashbytearray[KNumberOfIntsInHash*4] ; SHA1((const unsigned char *)(aBuf.constData()), aBuf.size(), hashbytearray) ; setFromCharArray(hashbytearray) ; } } void Hash::setFromCharArray(const unsigned char aDigest[KNumberOfIntsInHash*4]) { iHash160bits[0] = aDigest[3] | aDigest[2] << 8 | aDigest[1] << 16 | aDigest[0] << 24 ; iHash160bits[1] = aDigest[7] | aDigest[6] << 8 | aDigest[5] << 16 | aDigest[4] << 24 ; iHash160bits[2] = aDigest[11] | aDigest[10] << 8 | aDigest[9] << 16 | aDigest[8] << 24 ; iHash160bits[3] = aDigest[15] | aDigest[14] << 8 | aDigest[13] << 16 | aDigest[12] << 24 ; iHash160bits[4] = aDigest[19] | aDigest[18] << 8 | aDigest[17] << 16 | aDigest[16] << 24 ; } bool Hash::operator== (const Hash& aHashToCompare) const { if ( iHash160bits[4] == aHashToCompare.iHash160bits[4] && iHash160bits[3] == aHashToCompare.iHash160bits[3] && iHash160bits[2] == aHashToCompare.iHash160bits[2] && iHash160bits[1] == aHashToCompare.iHash160bits[1] && iHash160bits[0] == aHashToCompare.iHash160bits[0] ) { return true ; } else { return false ; } } bool Hash::operator!= (const Hash& aHashToCompare) const { if ( iHash160bits[4] != aHashToCompare.iHash160bits[4] || iHash160bits[3] != aHashToCompare.iHash160bits[3] || iHash160bits[2] != aHashToCompare.iHash160bits[2] || iHash160bits[1] != aHashToCompare.iHash160bits[1] || iHash160bits[0] != aHashToCompare.iHash160bits[0] ) { return true ; } else { return false ; } } bool Hash::operator< (const Hash& aHashToCompare) const { if( iHash160bits[0] < aHashToCompare.iHash160bits[0] ) { return true ; } else if ( iHash160bits[0] > aHashToCompare.iHash160bits[0] ) { return false ; } else if( iHash160bits[1] < aHashToCompare.iHash160bits[1] ) { return true ; } else if ( iHash160bits[1] > aHashToCompare.iHash160bits[1] ) { return false ; } else if( iHash160bits[2] < aHashToCompare.iHash160bits[2] ) { return true ; } else if ( iHash160bits[2] > aHashToCompare.iHash160bits[2] ) { return false ; } else if( iHash160bits[3] < aHashToCompare.iHash160bits[3] ) { return true ; } else if ( iHash160bits[3] > aHashToCompare.iHash160bits[3] ) { return false ; } else if( iHash160bits[4] < aHashToCompare.iHash160bits[4] ) { return true ; } else { return false ; } } bool Hash::operator> (const Hash& aHashToCompare) const { return ( ! ( *this < aHashToCompare ) ) ; } Hash& Hash::operator= (const Hash& aHashToSubstitute) { for ( int i = 0 ; i < KNumberOfIntsInHash ; i++ ) { iHash160bits[i] = aHashToSubstitute.iHash160bits[i] ; } return *this ; } Hash Hash::distanceFrom (const Hash& aHash) { // we actually here need to calculate distance // twice and then return the smaller value Hash retvalCandidateBySubstraction ; Hash retvalCandidateByRollingOver ; // so first, without rolling over, subtract the bigger from // the smaller and that is one distance ; must compare here // because our subtraction operator will mis-behave if // subtracting bigger from smaller if ( *this > aHash ) { retvalCandidateBySubstraction = *this - aHash ; } else { retvalCandidateBySubstraction = aHash - *this ; } // then roll-over part // roll-over point ; this is the biggest possible hashcode Hash maxHash = Hash(UINT_MAX, UINT_MAX, UINT_MAX, UINT_MAX, UINT_MAX) ; // then calculate how far away we're from maxhash: if ( *this > aHash ) { // so "this" is bigger so it is closer to maxhash than aHash Hash distanceFromMaxHash = maxHash - *this ; // then add distance from zero-hash to hHash retvalCandidateByRollingOver = distanceFromMaxHash + aHash ; } else { // so hHash is bigger so it is closer to maxhash Hash distanceFromMaxHash = maxHash - aHash ; // then add distance from zero-hash to hHash retvalCandidateByRollingOver = distanceFromMaxHash + *this ; } // then return smaller if ( retvalCandidateByRollingOver < retvalCandidateBySubstraction ) { return retvalCandidateByRollingOver ; } else { return retvalCandidateBySubstraction ; } } Hash Hash::operator-(const Hash& aToBeSubstracted) const { Hash retval ; // need to have temporary copy because borrowing operation // needs to modify upper-significance bits Hash temporary_copy = *this ; // so here we play a trick that seems to work. // subtract digit by digit. our digits in hash are // unsigned ints e.g. we're doing subtraction in "normal" // pen-and-paper manner but our base is 2^32 instead of 10. // this way we'll subtract the 160-bit hash by looping 5 times. for(int i=(KNumberOfIntsInHash-1) ; i>=0 ; i-- ) { if ( temporary_copy.iHash160bits[i] >= aToBeSubstracted.iHash160bits[i] ) { retval.iHash160bits[i] = temporary_copy.iHash160bits[i] - aToBeSubstracted.iHash160bits[i] ; } else { // needs to borrow ; find next non-zero digit for ( signed char borrow_digit = i-1 ; borrow_digit >= 0 ; borrow_digit-- ) { if ( temporary_copy.iHash160bits[borrow_digit] > 0 ) { temporary_copy.iHash160bits[borrow_digit]-- ; break ; } else { // while borrowing, the digits that are zero // while borrowing must be set 0xFFFFFFFF temporary_copy.iHash160bits[borrow_digit] = UINT_MAX ; } } // borrow done, now subtract ; now we'll need to subtract // ( 0xFF + temporary_copy.bits[i] ) - aToBeSubstracted.bits[i] // obviously the 0xFF + temporary_copy.bits[i] will not fit our bits // but here it is ok to roll over, looks like we obtain correct result. retval.iHash160bits[i] = temporary_copy.iHash160bits[i]- aToBeSubstracted.iHash160bits[i] ; } } return retval ; } Hash Hash::operator+(const Hash& aToBeAdded) const { Hash retval ; int carry_digit ; Hash temporary_copy = *this ; for(int i=(KNumberOfIntsInHash-1) ; i>=0 ; i-- ) { if ( aToBeAdded.iHash160bits[i] > UINT_MAX - temporary_copy.iHash160bits[i] ) { // need to overflow to next digit: carry_digit = i-1 ; while ( carry_digit > 0 && temporary_copy.iHash160bits[carry_digit] == UINT_MAX ) { temporary_copy.iHash160bits[carry_digit] ++ ; carry_digit-- ; } temporary_copy.iHash160bits[carry_digit] ++ ; // ok, we stopped in place, where temporary_copy.iHash160bits[i] // is not max value, increment at that position } retval.iHash160bits[i] = aToBeAdded.iHash160bits[i] + temporary_copy.iHash160bits[i] ; } return retval ; } classified-ads-0.13/util/hash.h000066400000000000000000000163721331670245300163760ustar00rootroot00000000000000/* -*-C++-*- Classified Ads is Copyright (c) Antti Jarvinen 2013. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef HASH_H #define HASH_H #include /** * @brief Hash is class that carries 160-bit digest. * * Hash number class. This is usually an encryption * key fingerprint or something returned by SHA1 * function. The number that this class carries * identifies an object inside classified ads, such * objects as "classified ad", "user", "node", * "attachment file" or anything that is present in * the network. Here the hash is number between 0-2^160. */ class Hash { public: /** * This constant KNumberOfIntsInHash defines size of * our hash ; we take this many unsigned ints each * 32bits in size so with value 5 w get 5*32=160. */ const static int KNumberOfIntsInHash = 5 ; /** * constructor. produces zero-value hash. */ Hash() ; /** * constructor. * @param aHash160bits is array of KNumberOfIntsInHash * containing 32 bits each. The most-significant * bits come in first, least-significant come in * last. .. e.g. for constructing a hash * that has value (decimal) 1 you say * Hash(0,0,0,0,1). */ Hash(const quint32 aHash160bits[KNumberOfIntsInHash]) ; /** * constructor. * @param aBits1 most significant bits * @param aBits2 quite significant bits * @param aBits3 somewhat significant bits * @param aBits4 less significant bits * @param aBits5 least significant bits */ Hash(const quint32 aBits1, const quint32 aBits2, const quint32 aBits3, const quint32 aBits4, const quint32 aBits5) ; /** * constructor. * @param aDigest 160 bits in array of unsigned 8-bit octets. * Most significant bits first. If you take SHA1 function * of openssl library, this is the format the method returns. */ Hash(const unsigned char aDigest[KNumberOfIntsInHash * 4]) ; /** * constructor that takes the hash in ascii string similar that * printf("%X... produces. * @param aHexString is the string containing hash value * @param aHexStringLen is length of said string. * if this param does not have value of 40 * then a null hash will be instantiated. * Purpose of this parameter is mainly to * clearly distinguis this constuctor from the * one that has single "unsigned char *" param * but expects different length for the string */ Hash(const char* aHexString, int aHexStringLen) ; /** * constructor * @param aSslCert is ssl certificate. Its SHA1 digest is used * to initialize value of this hash */ Hash(const QSslCertificate& aSslCert) ; /** * Sets hash value from string produced by @ref toString() method * of this same class. */ void fromString(const unsigned char *aBuf) ; /** * Returns the hash value as a string. */ QString toString() const ; /** * Sets hash value from QVariant produced by @ref toQVariant() method * of this same class. */ void fromQVariant(const QVariant& aQVariantHashValue) ; /** * Returns the hash value as a QVariant */ QVariant toQVariant() const ; /** * calculates SHA1 hash of data and sets value of this * class instance to be the result */ void calculate(const QByteArray& aBuf) ; /** * Comparison operator enabling us to use sort operations */ bool operator== (const Hash& aHashToCompare) const ; bool operator!= (const Hash& aHashToCompare) const ; bool operator< (const Hash& aHashToCompare) const ; bool operator> (const Hash& aHashToCompare) const ; /** * substitution too, it might make code more readable */ Hash& operator= (const Hash& aHashToSubstitute) ; /** * Method for calculating distance between 2 hashes. * * Obligatory J.R.R. Tolkien quote belongs here. * * In this program distance is defined in "number of rings * to rule them all" meaning that * 1) hash values roll over e.g. distance between * Hash(0) and Hash(max value) is 1. Distance between * Hash(1) and Hash(max value) is 2. Distance between * Hash(1) and Hash(5) is 4. As is to be expected. * 2) We may invent many rings to address same objects * because from articles (for instance) we can record * the article content hash, pgp-key fingerprint of * the sender, node used to send, hash of the forum * containing the article etc. and in different situations * it may be useful to search through different ring. * This method distanceFrom tells how far away the * number we're seeking for is and notable thing here * is that number may roll over when going via path of * shortest distance. * @param aHash is the number from which we calculate distance * @return return value is also a hash, that is, a number */ Hash distanceFrom (const Hash& aHash) ; /** * Man-kinds greatest invention ever follows: bignum operations for * small bignums. * * Subtraction operator. As our hash if you think of it as * a number, is unsigned, this operator will definitely return * undefined-kind-of-crap if you try to subtract bigger number * from a smaller one. Something you'll get but it can be anything. * * Other way around it seems to do something. */ Hash operator-(const Hash& aToBeSubstracted) const ; /** * addition operation for integers of 160 bits */ Hash operator+(const Hash& aToBeAdded) const ; private: void setFromCharArray(const unsigned char aDigest[KNumberOfIntsInHash * 4]) ; public: /** * this public array carries the calculated * (SHA1) hash. there is 5*32 bits and in db * too we're supposed to use 5 columns for * storing a hash ; we can still compare and do * ordering if we decide that low-order bits go * into iHash160bits[0] and the highest into * iHash160bits[4]. * * In 64-bit boxen we could fit the bits into * 64-bit integers and have this thing working * a bit faster - hopefully this thing will still * work fast enough to work also in less-powerful * 32-bit architectures for which we don't here * want to invent a separate implementation. */ quint32 iHash160bits[KNumberOfIntsInHash] ; } ; #endif classified-ads-0.13/util/jsonwrapper.cpp000066400000000000000000000074531331670245300203600ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti Jarvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "jsonwrapper.h" #if QT_VERSION >= 0x050000 #include #else #ifdef WIN32 #include #include #else #include #include #endif // WIN32 #endif // QT_VERSION #include "../log.h" // // this parser method is static // QVariantMap JSonWrapper::parse(const QByteArray& aJSonText, bool* aIsParseOk , bool aUncompressFirst ) { if ( aIsParseOk != NULL ) { *aIsParseOk = false ; // by default declare a failure } #if QT_VERSION >= 0x050000 QJsonParseError errorHandler ; if ( aUncompressFirst ) { QByteArray unCompressed ( qUncompress(aJSonText)) ; QJsonDocument d = QJsonDocument::fromJson(unCompressed,&errorHandler); if ( errorHandler.error == QJsonParseError::NoError ) { if ( aIsParseOk ) { *aIsParseOk= true; } return d.toVariant().toMap() ; } else { QLOG_STR("Unparseable JSON:" + QString(unCompressed) + ":" + errorHandler.errorString()) ; return QVariant().toMap() ; } } else { QJsonDocument d = QJsonDocument::fromJson(aJSonText,&errorHandler); if ( errorHandler.error == QJsonParseError::NoError ) { if ( aIsParseOk ) { *aIsParseOk= true; } return d.toVariant().toMap() ; } else { QLOG_STR("Unparseable JSON:" + QString(aJSonText) + ": " + errorHandler.errorString()) ; return QVariant().toMap() ; } } #else // with qt4 use qjson, it is ok QJson::Parser parser; bool ok; if ( aUncompressFirst ) { QByteArray unCompressed ( qUncompress(aJSonText)) ; if ( unCompressed.size() > 0 ) { QVariantMap result = parser.parse (unCompressed, &ok).toMap(); if ( aIsParseOk != NULL ) { *aIsParseOk = ok ; // actual parse result } return result ; } else { return QVariant().toMap() ; // failure, return empty } } else { QVariantMap result = parser.parse (aJSonText, &ok).toMap(); if ( aIsParseOk != NULL ) { *aIsParseOk = ok ; // actual parse result } return result ; } #endif } QByteArray JSonWrapper::serialize(const QVariant& aObjectToSerialize, bool aFinallyCompress ) { #if QT_VERSION >= 0x050000 if ( aFinallyCompress ) { return qCompress(QJsonDocument::fromVariant(aObjectToSerialize).toJson(QJsonDocument::Compact)) ; } else { return QJsonDocument::fromVariant(aObjectToSerialize).toJson(QJsonDocument::Compact) ; } #else QJson::Serializer serializer; if ( aFinallyCompress ) { return qCompress(serializer.serialize(aObjectToSerialize)) ; } else { return serializer.serialize(aObjectToSerialize) ; } #endif } classified-ads-0.13/util/jsonwrapper.h000066400000000000000000000050071331670245300200160ustar00rootroot00000000000000/* -*-C++-*- Classified Ads is Copyright (c) Antti Jarvinen 2015. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include // Actually for QVariantMap #ifndef JSONWRAPPER_H #define JSONWRAPPER_H /** * @brief Class for wrapping engine to (de)serialize json * * Qt5 has included json routines so if using Qt5 it makes sense to * that because it is one dependency less ; with earlier QT versions a 3rd * party library is required. This class provides programmer with single API * to use json routines regardless of underlying implementation. */ class JSonWrapper { public: /** * Method that returns aJSonText parsed into a QVariantMap. * * @param aJSonText is text to parse. Must be valid json. * @param aIsParseOk is set to true/false depending on parse success * @param aUncompressFirst indication if aJSonText is compressed or not. * if compressed, then qUncompress is applied before parser. * @return Content of AJSonText as QVariant. Is empty if parse failed * so user should check value of aIsParseOk before assuming * anything about the content. */ static QVariantMap parse(const QByteArray& aJSonText, bool* aIsParseOk = NULL, bool aUncompressFirst = false ) ; /** * method that returns QVariant as JSon text. * * @param aObjectToSerialize is the object, usually QVariantMap but * basically any QVariant should do. * @param aFinallyCompress if set to true, the returned byte-array * is compressed using qCompress() * @return serialized stream e.g. json text. */ static QByteArray serialize(const QVariant& aObjectToSerialize, bool aFinallyCompress = false ) ; } ; #endif /* JSONWRAPPER_H */ classified-ads-0.13/util/ungzip.cpp000066400000000000000000000111151331670245300173100ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ static const unsigned KZLibBlockSize ( 1024 ) ; #include "ungzip.h" #include // actual gzip functions and data-types #ifndef WIN32 #include // actual bzip2 functions and data-types #endif #include "../log.h" UnGZip::UnGZip() { // not really used } UnGZip::~UnGZip() { } // static method, idea borrowed from zlib code examples. QByteArray UnGZip::unGZip(const QByteArray& aCompressedContent, bool* aResult ) { QByteArray retval ; if ( aCompressedContent.length() < 5 ) { if ( aResult ) { *aResult = false ; } return retval ; } z_stream stream ; char uncompressedBlock[KZLibBlockSize] ; // initialize zlib stream: stream.zalloc = Z_NULL ; stream.zfree = Z_NULL ; stream.opaque = Z_NULL ; stream.avail_in = aCompressedContent.length() ; stream.next_in = const_cast (reinterpret_cast (aCompressedContent.data())) ; if ( inflateInit2(&stream, 15 + 32) != Z_OK ) { if ( aResult ) { *aResult = false ; } return retval ; } do { stream.avail_out = KZLibBlockSize ; stream.next_out = reinterpret_cast(uncompressedBlock) ; switch ( inflate(&stream, Z_NO_FLUSH) ) { case Z_NEED_DICT: case Z_DATA_ERROR: case Z_MEM_ERROR: inflateEnd(&stream) ; if ( aResult ) { *aResult = false ; } return retval ; break ; // never reached default: // grab content and continue retval.append(uncompressedBlock, KZLibBlockSize - stream.avail_out); break ; } } while ( stream.avail_out == 0 ) ; // all done: inflateEnd(&stream) ; if ( aResult ) { *aResult = true ; } return retval ; } #ifndef WIN32 // static method, idea borrowed from blib2 code examples QByteArray UnGZip::unBZip2(const QByteArray& aCompressedContent, bool* aResult ) { QByteArray retval ; if ( aCompressedContent.length() < 5 ) { if ( aResult ) { *aResult = false ; } return retval ; } bz_stream stream ; char uncompressedBlock[KZLibBlockSize] ; // initialize bzlib2 stream: stream.bzalloc = NULL ; stream.bzfree = NULL ; stream.opaque = NULL ; stream.avail_in = aCompressedContent.length() ; stream.next_in = const_cast (reinterpret_cast (aCompressedContent.data())) ; int errorcode (0); if ( ( errorcode = BZ2_bzDecompressInit(&stream,0,0) ) != BZ_OK ) { QLOG_STR("Bzip2 init error " + QString::number(errorcode)); if ( aResult ) { *aResult = false ; } return retval ; } do { stream.avail_out = KZLibBlockSize ; stream.next_out = reinterpret_cast(uncompressedBlock) ; switch ( errorcode = BZ2_bzDecompress(&stream) ) { case BZ_STREAM_END: case BZ_OK: // grab content and continue retval.append(uncompressedBlock, KZLibBlockSize - stream.avail_out); break ; default: // error in bzip2 QLOG_STR("Bzip2 decompress error " + QString::number(errorcode)); if ( aResult ) { *aResult = false ; } BZ2_bzDecompressEnd(&stream); return retval ; } } while ( stream.avail_out == 0 ) ; // all done: BZ2_bzDecompressEnd(&stream); if ( aResult ) { *aResult = true ; } return retval ; } #endif classified-ads-0.13/util/ungzip.h000066400000000000000000000040261331670245300167600ustar00rootroot00000000000000/* -*-C++-*- -*-coding: utf-8-unix;-*- Classified Ads is Copyright (c) Antti JУЄrvinen 2013-2017. This file is part of Classified Ads. Classified Ads is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Classified Ads 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Classified Ads; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CLASSIFIED_UNGZIP_H #define CLASSIFIED_UNGZIP_H #include /** * @brief Class for un-zipping gzip'ed content. Supports also bzip2. * * This class is wrapper around zlib/bzip2lib, it is used to de-compress * contents previously compressed with gzip/bzip2. */ class UnGZip : public QObject { Q_OBJECT public: UnGZip() ; ~UnGZip() ; /** * Method for doing de-gzip * * @param aCompressedContent compressed content * @param aResult if not-null, will have its value set to true/false * depending on success of de-compression * @return un-compressed content. */ static QByteArray unGZip(const QByteArray& aCompressedContent, bool* aResult ) ; #ifndef WIN32 /** * Method for doing de-bzip2 * * @param aCompressedContent compressed content * @param aResult if not-null, will have its value set to true/false * depending on success of de-compression * @return un-compressed content. */ static QByteArray unBZip2(const QByteArray& aCompressedContent, bool* aResult ) ; #endif } ; #endif classified-ads-0.13/windows/000077500000000000000000000000001331670245300160065ustar00rootroot00000000000000classified-ads-0.13/windows/README.TXT000066400000000000000000000154731331670245300173560ustar00rootroot00000000000000Here are briefly the steps for setting up dev env for windows: 1. download qt (v5.5) from http://download.qt.io/official_releases/qt/5.5/5.5.0/qt-opensource-windows-x86-mingw492-5.5.0.exe 2. install, also select tools/MinGW4.9.2 from "components" section 3. get openssl, instructions are in http://wiki.qt.io/Compiling_OpenSSL_with_MinGW 3.1 e.g. -> install msys, the 32-bit version from https://msys2.github.io/ 3.2 get https://www.openssl.org/source/openssl-1.0.2o.tar.gz 3.3 get necessary goodies into msys, in msys-shell say $ pacmac -Sy $ pacman --needed -S bash pacman pacman-mirrors msys2-runtime restart the msys shell $ pacman --needed -S tar perl make add gcc from qt into path: $ export PATH=/d/Qt5.11/Tools/mingw530_32/bin:$PATH in directory where openssl is extracted into, configure: $ ./Configure --prefix=$PWD -I$PWD/include no-idea no-mdc2 no-rc5 shared mingw and do not try using mingw32-make, it will resort to g++ and fail due to missing CFLAGS $ make depend $ make $ make install 4. get miniupnpc from http://miniupnp.free.fr/files/download.php?file=miniupnpc-2.1.tar.gz compile by saying $ export PATH=/d/Qt5.11/Tools/mingw530_32/bin:$PATH $ export PATH=.:$PATH $ make -f Makefile.mingw CC=gcc $ ./wingenminiupnpcstrings.exe miniupnpcstrings.h.in miniupnpcstrings.h $ make -f Makefile.mingw CC=gcc 5. get libiconv+gnu gettext, e.g. get http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz http://ftp.gnu.org/pub/gnu/gettext/gettext-0.19.6.tar.xz and compile like this: $ tar xfvz libiconv-1.14.tar.gz $ cd libiconv-1.14 $ ./configure --host=i586-pc-mingw32 --build=i586-pc-mingw32 $ make $ make install again, make sure to use make, not mingw32-make $ xz -d < gettext-0.19.6.tar.xz | tar xfvo - $ cd gettext-0.19.6 $ ./configure --host=i586-pc-mingw32 --build=i586-pc-mingw32 $ make $ make install after this the libraries needed at runtime libiconv-2.dll and libintl-8.dll are at \msys32\usr\local\bin\ 5.1 get lib opus, e.g. get http://downloads.xiph.org/releases/opus/opus-1.2.tar.gz and un-tar it into some directory, I used one directory up from classified ads source code and the .pro -file is now set up like this. Then using same method as with openssl e.g. from MSYS shell $ export PATH=/d/Qt5.11/Tools/mingw530_32/bin:$PATH $ sh configure --prefix=`pwd`/binary $ make $ make install 5.2 get tcl/tk, e.g. get tcl8.6.7-src.tar.gz from https://sourceforge.net/projects/tcl/files/Tcl/8.6.7/ and http://prdownloads.sourceforge.net/tcl/tk8.6.6-src.tar.gz and see instructions at http://wiki.tcl.tk/4424 about compiling. In practice un-tar the sources into directory and say in MSYS shell: $ gzip -d < deps/tcl8.6.6-src.tar.gz | tar xfvo - $ gzip -d < deps/tk8.6.6-src.tar.gz | tar xfvo - $ mkdir tclbuild $ cd tclbuild/ $ export PATH=/d/Qt5.11/Tools/mingw530_32/bin:$PATH $ export PATH=.:$PATH $ ../tcl8.6.7/win/configure --prefix=/opt/tcl $ make $ make install $ mkdir tk $ cd tk $ ../../tk8.6.7/win/configure --prefix=/opt/tcl --with-tcl=.. $ make $ make install After classified ads is compiled you need to copy C:\msys32\opt\tcl\bin\tcl86.dll C:\msys32\opt\tcl\bin\tk86.dll C:\msys32\opt\tcl\bin\zlib1.dll into same directory with classified-ads.exe. If classified-ads.exe does not exists yet (see last steps of this README.TXT) then simply create directories "debug" and "release" under directory where classified ads source code will be unpacked ; build process will produce the binary into those directories, depending on debug/release setting. Copy TCL and Tk runtime files into path relative to classified-ads.exe ; Tcl library needs to be found from sub-directory tcl8.6 and tk library (usually found from c:\msys32\opt\tcl\lib\tk8.6) needs to be copied to directory tk8.6 in same directory with classified-ads.exe. Inside tk there is file pkgIndex.tcl that contains location of tk86.dll and it is now wrong. Edit the line package ifneeded Tk 8.6.6 [list load [file normalize [file join $dir .. .. bin tk86.dll]] Tk] so be package ifneeded Tk 8.6.6 [list load [file normalize [file join $dir .. tk86.dll]] Tk] e.g. remove the ".. bin" and TCL will now look for tk86.dll from same directory where classified-ads.exe is is. Classified ads will try to adjust TCL library path (see file main.cpp) at startup but it will not overwrite existing TCL library path ; if there is existing TCL installation that sets TCL_LIBRARY or TCLLIBPATH it may or may not interfere with TCL installation bundled classified ads. If Classified ads starts using wrong TCL runtime, it may be necessary to unset TCL_LIBRARY and TCLLIBPATH first. Also copy from tcl/lib directory contents of directory "tcl8" into same directory where directories tcl8.6 and tcl8.6 reside, same directory where classified-ads.exe is found. 6. Get classified ads, preferably from https://github.com/operatornormal/classified-ads/archive/master.zip unzip, possibly adjust directories in file classified-ads.pro so that all libraries listed above are found from their paths. All library compilation was done inside msys shell but classified ads gets compiled inside Qt shell, so open qt-shell, navigate to directory and say qmake mingw32-make the resulting binary goes either to sub-directory debug or release depending on your settings in .pro file. Before running you must copy following .dll files into same directory with classified-ads.exe: libeay32.dll and ssleay32.dll from openssl directory libiconv-2.dll and libintl-8.dll from \msys32\usr\local\bin\ miniupnpc.dll from miniupnpc directory Currently the classified-ads.pro is set up so that all libraries that classified ads depends on are unpacked at same directory with classified ads, like this: C:\foobar>dir Kansio C:\foobar 24.09.2015 18:24 . 24.09.2015 18:24 .. 24.09.2015 16:07 classified_ads 21.09.2015 23:31 debugview 21.09.2015 21:31 deps 21.09.2015 22:24 gettext-0.19.6 21.09.2015 22:10 libiconv-1.14 15.09.2015 20:33 miniupnpc-1.9 15.09.2015 20:24 openssl-1.0.2d 04.03.2016 16:43 opus-1.1.2 22.09.2015 00:00 2 750 windows-setup.txt and programs are compiled in place, gettext and libiconv are also installed using the "make install" command so they're found from \msys32 path also. For producing the installation package, you'll need the nsis installer program. Before running the installer generation script, run batch file "deps.bat" in windows sub-directory, it will copy some Qt dll's in place, they're needed at run-time. Happy hacking. classified-ads-0.13/windows/deps.bat000066400000000000000000000002141331670245300174260ustar00rootroot00000000000000echo this needs to be run from qt command prompt rd /q /s deps mkdir deps windeployqt --release --libdir=deps ..\release\classified-ads.exe classified-ads-0.13/windows/nsis-installer.nsi000066400000000000000000004046031331670245300214770ustar00rootroot00000000000000# # inteneded to be used with nullsoft NSIS tool. # # this file mostly stolen from # http://sourceforge.net/p/qtpfsgui/extra/ci/master/tree/NSIS/nsis-installer.nsi # so thanks to all great guys doing Luminance HDR :) # # define name of installer outFile "Classified-ads-Win32.exe" !define MUI_ICON "turt-transparent-128x128.ico" !define VERSION "0.12" # ask to be admin in order to create start menu shortcuts to all users RequestExecutionLevel admin Name "Classified ads ${VERSION}" # define installation directory installDir $PROGRAMFILES\Classified-ads # start default section section SetShellVarContext all # set the installation directory as the destination for the following actions setOutPath $INSTDIR # create the uninstaller writeUninstaller "$INSTDIR\uninstall.exe" # create a shortcut named "new shortcut" in the start menu programs directory # point the new shortcut at the program uninstaller CreateDirectory "$SMPROGRAMS\Classified-ads" CreateShortCut "$SMPROGRAMS\Classified-ads\uninstall.lnk" "$INSTDIR\uninstall.exe" file /oname=classified-ads.exe ..\release\classified-ads.exe CreateDirectory "$INSTDIR\fi\LC_MESSAGES" file /oname=$INSTDIR\fi\LC_MESSAGES\classified-ads.mo ..\po\fi.mo CreateDirectory "$INSTDIR\sv\LC_MESSAGES" file /oname=$INSTDIR\sv\LC_MESSAGES\classified-ads.mo ..\po\sv.mo CreateDirectory "$INSTDIR\da\LC_MESSAGES" file /oname=$INSTDIR\da\LC_MESSAGES\classified-ads.mo ..\po\da.mo CreateDirectory "$INSTDIR\uk\LC_MESSAGES" file /oname=$INSTDIR\uk\LC_MESSAGES\classified-ads.mo ..\po\uk.mo CreateDirectory "$INSTDIR\de\LC_MESSAGES" file /oname=$INSTDIR\de\LC_MESSAGES\classified-ads.mo ..\po\de.mo CreateDirectory "$INSTDIR\es\LC_MESSAGES" file /oname=$INSTDIR\es\LC_MESSAGES\classified-ads.mo ..\po\es.mo file /oname=qt_ca.qm ..\release\translations\qt_ca.qm file /oname=qt_cs.qm ..\release\translations\qt_cs.qm file /oname=qt_de.qm ..\release\translations\qt_de.qm file /oname=qt_fi.qm ..\release\translations\qt_fi.qm file /oname=qt_hu.qm ..\release\translations\qt_hu.qm file /oname=qt_it.qm ..\release\translations\qt_it.qm file /oname=qt_ja.qm ..\release\translations\qt_ja.qm file /oname=qt_lv.qm ..\release\translations\qt_lv.qm file /oname=qt_ru.qm ..\release\translations\qt_ru.qm file /oname=qt_sk.qm ..\release\translations\qt_sk.qm file /oname=qt_uk.qm ..\release\translations\qt_uk.qm CreateDirectory "$INSTDIR\examples" file /oname=$INSTDIR\examples\sysinfo.tcl ..\doc\sysinfo.tcl file /oname=$INSTDIR\examples\luikero.tcl ..\doc\luikero.tcl file /oname=$INSTDIR\examples\calendar.tcl ..\doc\calendar.tcl CreateDirectory "$INSTDIR\bearer" CreateDirectory "$INSTDIR\iconengines" CreateDirectory "$INSTDIR\imageformats" CreateDirectory "$INSTDIR\printsupport" CreateDirectory "$INSTDIR\platforms" CreateDirectory "$INSTDIR\sqldrivers" CreateDirectory "$INSTDIR\audio" file /oname=miniupnpc.dll ..\..\miniupnpc-1.9\miniupnpc.dll CreateShortCut "$SMPROGRAMS\Classified-ads\Classified-ads.lnk" "$INSTDIR\Classified-ads.exe" file /oname=D3Dcompiler_47.dll deps\D3Dcompiler_47.dll file /oname=libEGL.dll deps\libEGL.dll file /oname=libGLESV2.dll deps\libGLESV2.dll file /oname=libgcc_s_dw2-1.dll deps\libgcc_s_dw2-1.dll file /oname=libstdc++-6.dll deps\libstdc++-6.dll file /oname=libwinpthread-1.dll deps\libwinpthread-1.dll file /oname=opengl32sw.dll deps\opengl32sw.dll file /oname=Qt5Core.dll deps\Qt5Core.dll file /oname=Qt5Gui.dll deps\Qt5Gui.dll file /oname=Qt5Multimedia.dll deps\Qt5Multimedia.dll file /oname=Qt5Network.dll deps\Qt5Network.dll file /oname=Qt5PrintSupport.dll deps\Qt5PrintSupport.dll file /oname=Qt5Sql.dll deps\Qt5Sql.dll file /oname=Qt5Svg.dll deps\Qt5Svg.dll file /oname=Qt5Widgets.dll deps\Qt5Widgets.dll file /oname=bearer\qgenericbearer.dll ..\release\bearer\qgenericbearer.dll file /oname=bearer\qnativewifibearer.dll ..\release\bearer\qnativewifibearer.dll file /oname=iconengines\qsvgicon.dll ..\release\iconengines\qsvgicon.dll file /oname=imageformats\qdds.dll ..\release\imageformats\qdds.dll file /oname=imageformats\qgif.dll ..\release\imageformats\qgif.dll file /oname=imageformats\qicns.dll ..\release\imageformats\qicns.dll file /oname=imageformats\qico.dll ..\release\imageformats\qico.dll file /oname=imageformats\qjp2.dll ..\release\imageformats\qjp2.dll file /oname=imageformats\qjpeg.dll ..\release\imageformats\qjpeg.dll file /oname=imageformats\qmng.dll ..\release\imageformats\qmng.dll file /oname=imageformats\qsvg.dll ..\release\imageformats\qsvg.dll file /oname=imageformats\qtga.dll ..\release\imageformats\qtga.dll file /oname=imageformats\qtiff.dll ..\release\imageformats\qtiff.dll file /oname=imageformats\qwbmp.dll ..\release\imageformats\qwbmp.dll file /oname=imageformats\qwebp.dll ..\release\imageformats\qwebp.dll file /oname=platforms\qwindows.dll ..\release\platforms\qwindows.dll file /oname=printsupport\windowsprintersupport.dll ..\release\printsupport\windowsprintersupport.dll file /oname=sqldrivers\qsqlite.dll ..\release\sqldrivers\qsqlite.dll file /oname=audio\qtaudio_windows.dll ..\release\audio\qtaudio_windows.dll file /oname=libeay32.dll ..\release\libeay32.dll file /oname=ssleay32.dll ..\release\ssleay32.dll file /oname=libiconv-2.dll ..\release\libiconv-2.dll file /oname=libintl-8.dll ..\release\libintl-8.dll file /oname=LICENSE ..\LICENSE # # TCL-related directories and files # CreateDirectory "$INSTDIR\tcl8.6" CreateDirectory "$INSTDIR\tcl8.6\encoding" CreateDirectory "$INSTDIR\tcl8.6\http1.0" CreateDirectory "$INSTDIR\tcl8.6\msgs" CreateDirectory "$INSTDIR\tcl8.6\opt0.4" CreateDirectory "$INSTDIR\tcl8.6\tzdata" CreateDirectory "$INSTDIR\tcl8.6\tzdata\Africa" CreateDirectory "$INSTDIR\tcl8.6\tzdata\America" CreateDirectory "$INSTDIR\tcl8.6\tzdata\America\Argentina" CreateDirectory "$INSTDIR\tcl8.6\tzdata\America\Indiana" CreateDirectory "$INSTDIR\tcl8.6\tzdata\America\Kentucky" CreateDirectory "$INSTDIR\tcl8.6\tzdata\America\North_Dakota" CreateDirectory "$INSTDIR\tcl8.6\tzdata\Antarctica" CreateDirectory "$INSTDIR\tcl8.6\tzdata\Arctic" CreateDirectory "$INSTDIR\tcl8.6\tzdata\Asia" CreateDirectory "$INSTDIR\tcl8.6\tzdata\Atlantic" CreateDirectory "$INSTDIR\tcl8.6\tzdata\Australia" CreateDirectory "$INSTDIR\tcl8.6\tzdata\Brazil" CreateDirectory "$INSTDIR\tcl8.6\tzdata\Canada" CreateDirectory "$INSTDIR\tcl8.6\tzdata\Chile" CreateDirectory "$INSTDIR\tcl8.6\tzdata\Etc" CreateDirectory "$INSTDIR\tcl8.6\tzdata\Europe" CreateDirectory "$INSTDIR\tcl8.6\tzdata\Indian" CreateDirectory "$INSTDIR\tcl8.6\tzdata\Mexico" CreateDirectory "$INSTDIR\tcl8.6\tzdata\Pacific" CreateDirectory "$INSTDIR\tcl8.6\tzdata\SystemV" CreateDirectory "$INSTDIR\tcl8.6\tzdata\US" CreateDirectory "$INSTDIR\tk8.6" CreateDirectory "$INSTDIR\tk8.6\images" CreateDirectory "$INSTDIR\tk8.6\msgs" CreateDirectory "$INSTDIR\tk8.6\ttk" CreateDirectory "$INSTDIR\tcl8" CreateDirectory "$INSTDIR\tcl8\8.4" CreateDirectory "$INSTDIR\tcl8\8.4\platform" CreateDirectory "$INSTDIR\tcl8\8.5" CreateDirectory "$INSTDIR\tcl8\8.6" CreateDirectory "$INSTDIR\tcl8\8.6\tdbc" # and files file /oname=$INSTDIR\tcl8.6\auto.tcl ..\release\tcl8.6\auto.tcl file /oname=$INSTDIR\tcl8.6\clock.tcl ..\release\tcl8.6\clock.tcl file /oname=$INSTDIR\tcl8.6\encoding\ascii.enc ..\release\tcl8.6\encoding\ascii.enc file /oname=$INSTDIR\tcl8.6\encoding\big5.enc ..\release\tcl8.6\encoding\big5.enc file /oname=$INSTDIR\tcl8.6\encoding\cp1250.enc ..\release\tcl8.6\encoding\cp1250.enc file /oname=$INSTDIR\tcl8.6\encoding\cp1251.enc ..\release\tcl8.6\encoding\cp1251.enc file /oname=$INSTDIR\tcl8.6\encoding\cp1252.enc ..\release\tcl8.6\encoding\cp1252.enc file /oname=$INSTDIR\tcl8.6\encoding\cp1253.enc ..\release\tcl8.6\encoding\cp1253.enc file /oname=$INSTDIR\tcl8.6\encoding\cp1254.enc ..\release\tcl8.6\encoding\cp1254.enc file /oname=$INSTDIR\tcl8.6\encoding\cp1255.enc ..\release\tcl8.6\encoding\cp1255.enc file /oname=$INSTDIR\tcl8.6\encoding\cp1256.enc ..\release\tcl8.6\encoding\cp1256.enc file /oname=$INSTDIR\tcl8.6\encoding\cp1257.enc ..\release\tcl8.6\encoding\cp1257.enc file /oname=$INSTDIR\tcl8.6\encoding\cp1258.enc ..\release\tcl8.6\encoding\cp1258.enc file /oname=$INSTDIR\tcl8.6\encoding\cp437.enc ..\release\tcl8.6\encoding\cp437.enc file /oname=$INSTDIR\tcl8.6\encoding\cp737.enc ..\release\tcl8.6\encoding\cp737.enc file /oname=$INSTDIR\tcl8.6\encoding\cp775.enc ..\release\tcl8.6\encoding\cp775.enc file /oname=$INSTDIR\tcl8.6\encoding\cp850.enc ..\release\tcl8.6\encoding\cp850.enc file /oname=$INSTDIR\tcl8.6\encoding\cp852.enc ..\release\tcl8.6\encoding\cp852.enc file /oname=$INSTDIR\tcl8.6\encoding\cp855.enc ..\release\tcl8.6\encoding\cp855.enc file /oname=$INSTDIR\tcl8.6\encoding\cp857.enc ..\release\tcl8.6\encoding\cp857.enc file /oname=$INSTDIR\tcl8.6\encoding\cp860.enc ..\release\tcl8.6\encoding\cp860.enc file /oname=$INSTDIR\tcl8.6\encoding\cp861.enc ..\release\tcl8.6\encoding\cp861.enc file /oname=$INSTDIR\tcl8.6\encoding\cp862.enc ..\release\tcl8.6\encoding\cp862.enc file /oname=$INSTDIR\tcl8.6\encoding\cp863.enc ..\release\tcl8.6\encoding\cp863.enc file /oname=$INSTDIR\tcl8.6\encoding\cp864.enc ..\release\tcl8.6\encoding\cp864.enc file /oname=$INSTDIR\tcl8.6\encoding\cp865.enc ..\release\tcl8.6\encoding\cp865.enc file /oname=$INSTDIR\tcl8.6\encoding\cp866.enc ..\release\tcl8.6\encoding\cp866.enc file /oname=$INSTDIR\tcl8.6\encoding\cp869.enc ..\release\tcl8.6\encoding\cp869.enc file /oname=$INSTDIR\tcl8.6\encoding\cp874.enc ..\release\tcl8.6\encoding\cp874.enc file /oname=$INSTDIR\tcl8.6\encoding\cp932.enc ..\release\tcl8.6\encoding\cp932.enc file /oname=$INSTDIR\tcl8.6\encoding\cp936.enc ..\release\tcl8.6\encoding\cp936.enc file /oname=$INSTDIR\tcl8.6\encoding\cp949.enc ..\release\tcl8.6\encoding\cp949.enc file /oname=$INSTDIR\tcl8.6\encoding\cp950.enc ..\release\tcl8.6\encoding\cp950.enc file /oname=$INSTDIR\tcl8.6\encoding\dingbats.enc ..\release\tcl8.6\encoding\dingbats.enc file /oname=$INSTDIR\tcl8.6\encoding\ebcdic.enc ..\release\tcl8.6\encoding\ebcdic.enc file /oname=$INSTDIR\tcl8.6\encoding\euc-cn.enc ..\release\tcl8.6\encoding\euc-cn.enc file /oname=$INSTDIR\tcl8.6\encoding\euc-jp.enc ..\release\tcl8.6\encoding\euc-jp.enc file /oname=$INSTDIR\tcl8.6\encoding\euc-kr.enc ..\release\tcl8.6\encoding\euc-kr.enc file /oname=$INSTDIR\tcl8.6\encoding\gb12345.enc ..\release\tcl8.6\encoding\gb12345.enc file /oname=$INSTDIR\tcl8.6\encoding\gb1988.enc ..\release\tcl8.6\encoding\gb1988.enc file /oname=$INSTDIR\tcl8.6\encoding\gb2312-raw.enc ..\release\tcl8.6\encoding\gb2312-raw.enc file /oname=$INSTDIR\tcl8.6\encoding\gb2312.enc ..\release\tcl8.6\encoding\gb2312.enc file /oname=$INSTDIR\tcl8.6\encoding\iso2022-jp.enc ..\release\tcl8.6\encoding\iso2022-jp.enc file /oname=$INSTDIR\tcl8.6\encoding\iso2022-kr.enc ..\release\tcl8.6\encoding\iso2022-kr.enc file /oname=$INSTDIR\tcl8.6\encoding\iso2022.enc ..\release\tcl8.6\encoding\iso2022.enc file /oname=$INSTDIR\tcl8.6\encoding\iso8859-1.enc ..\release\tcl8.6\encoding\iso8859-1.enc file /oname=$INSTDIR\tcl8.6\encoding\iso8859-10.enc ..\release\tcl8.6\encoding\iso8859-10.enc file /oname=$INSTDIR\tcl8.6\encoding\iso8859-13.enc ..\release\tcl8.6\encoding\iso8859-13.enc file /oname=$INSTDIR\tcl8.6\encoding\iso8859-14.enc ..\release\tcl8.6\encoding\iso8859-14.enc file /oname=$INSTDIR\tcl8.6\encoding\iso8859-15.enc ..\release\tcl8.6\encoding\iso8859-15.enc file /oname=$INSTDIR\tcl8.6\encoding\iso8859-16.enc ..\release\tcl8.6\encoding\iso8859-16.enc file /oname=$INSTDIR\tcl8.6\encoding\iso8859-2.enc ..\release\tcl8.6\encoding\iso8859-2.enc file /oname=$INSTDIR\tcl8.6\encoding\iso8859-3.enc ..\release\tcl8.6\encoding\iso8859-3.enc file /oname=$INSTDIR\tcl8.6\encoding\iso8859-4.enc ..\release\tcl8.6\encoding\iso8859-4.enc file /oname=$INSTDIR\tcl8.6\encoding\iso8859-5.enc ..\release\tcl8.6\encoding\iso8859-5.enc file /oname=$INSTDIR\tcl8.6\encoding\iso8859-6.enc ..\release\tcl8.6\encoding\iso8859-6.enc file /oname=$INSTDIR\tcl8.6\encoding\iso8859-7.enc ..\release\tcl8.6\encoding\iso8859-7.enc file /oname=$INSTDIR\tcl8.6\encoding\iso8859-8.enc ..\release\tcl8.6\encoding\iso8859-8.enc file /oname=$INSTDIR\tcl8.6\encoding\iso8859-9.enc ..\release\tcl8.6\encoding\iso8859-9.enc file /oname=$INSTDIR\tcl8.6\encoding\jis0201.enc ..\release\tcl8.6\encoding\jis0201.enc file /oname=$INSTDIR\tcl8.6\encoding\jis0208.enc ..\release\tcl8.6\encoding\jis0208.enc file /oname=$INSTDIR\tcl8.6\encoding\jis0212.enc ..\release\tcl8.6\encoding\jis0212.enc file /oname=$INSTDIR\tcl8.6\encoding\koi8-r.enc ..\release\tcl8.6\encoding\koi8-r.enc file /oname=$INSTDIR\tcl8.6\encoding\koi8-u.enc ..\release\tcl8.6\encoding\koi8-u.enc file /oname=$INSTDIR\tcl8.6\encoding\ksc5601.enc ..\release\tcl8.6\encoding\ksc5601.enc file /oname=$INSTDIR\tcl8.6\encoding\macCentEuro.enc ..\release\tcl8.6\encoding\macCentEuro.enc file /oname=$INSTDIR\tcl8.6\encoding\macCroatian.enc ..\release\tcl8.6\encoding\macCroatian.enc file /oname=$INSTDIR\tcl8.6\encoding\macCyrillic.enc ..\release\tcl8.6\encoding\macCyrillic.enc file /oname=$INSTDIR\tcl8.6\encoding\macDingbats.enc ..\release\tcl8.6\encoding\macDingbats.enc file /oname=$INSTDIR\tcl8.6\encoding\macGreek.enc ..\release\tcl8.6\encoding\macGreek.enc file /oname=$INSTDIR\tcl8.6\encoding\macIceland.enc ..\release\tcl8.6\encoding\macIceland.enc file /oname=$INSTDIR\tcl8.6\encoding\macJapan.enc ..\release\tcl8.6\encoding\macJapan.enc file /oname=$INSTDIR\tcl8.6\encoding\macRoman.enc ..\release\tcl8.6\encoding\macRoman.enc file /oname=$INSTDIR\tcl8.6\encoding\macRomania.enc ..\release\tcl8.6\encoding\macRomania.enc file /oname=$INSTDIR\tcl8.6\encoding\macThai.enc ..\release\tcl8.6\encoding\macThai.enc file /oname=$INSTDIR\tcl8.6\encoding\macTurkish.enc ..\release\tcl8.6\encoding\macTurkish.enc file /oname=$INSTDIR\tcl8.6\encoding\macUkraine.enc ..\release\tcl8.6\encoding\macUkraine.enc file /oname=$INSTDIR\tcl8.6\encoding\shiftjis.enc ..\release\tcl8.6\encoding\shiftjis.enc file /oname=$INSTDIR\tcl8.6\encoding\symbol.enc ..\release\tcl8.6\encoding\symbol.enc file /oname=$INSTDIR\tcl8.6\encoding\tis-620.enc ..\release\tcl8.6\encoding\tis-620.enc file /oname=$INSTDIR\tcl8.6\history.tcl ..\release\tcl8.6\history.tcl file /oname=$INSTDIR\tcl8.6\http1.0\http.tcl ..\release\tcl8.6\http1.0\http.tcl file /oname=$INSTDIR\tcl8.6\http1.0\pkgIndex.tcl ..\release\tcl8.6\http1.0\pkgIndex.tcl file /oname=$INSTDIR\tcl8.6\init.tcl ..\release\tcl8.6\init.tcl file /oname=$INSTDIR\tcl8.6\msgs\af.msg ..\release\tcl8.6\msgs\af.msg file /oname=$INSTDIR\tcl8.6\msgs\af_za.msg ..\release\tcl8.6\msgs\af_za.msg file /oname=$INSTDIR\tcl8.6\msgs\ar.msg ..\release\tcl8.6\msgs\ar.msg file /oname=$INSTDIR\tcl8.6\msgs\ar_in.msg ..\release\tcl8.6\msgs\ar_in.msg file /oname=$INSTDIR\tcl8.6\msgs\ar_jo.msg ..\release\tcl8.6\msgs\ar_jo.msg file /oname=$INSTDIR\tcl8.6\msgs\ar_lb.msg ..\release\tcl8.6\msgs\ar_lb.msg file /oname=$INSTDIR\tcl8.6\msgs\ar_sy.msg ..\release\tcl8.6\msgs\ar_sy.msg file /oname=$INSTDIR\tcl8.6\msgs\be.msg ..\release\tcl8.6\msgs\be.msg file /oname=$INSTDIR\tcl8.6\msgs\bg.msg ..\release\tcl8.6\msgs\bg.msg file /oname=$INSTDIR\tcl8.6\msgs\bn.msg ..\release\tcl8.6\msgs\bn.msg file /oname=$INSTDIR\tcl8.6\msgs\bn_in.msg ..\release\tcl8.6\msgs\bn_in.msg file /oname=$INSTDIR\tcl8.6\msgs\ca.msg ..\release\tcl8.6\msgs\ca.msg file /oname=$INSTDIR\tcl8.6\msgs\cs.msg ..\release\tcl8.6\msgs\cs.msg file /oname=$INSTDIR\tcl8.6\msgs\da.msg ..\release\tcl8.6\msgs\da.msg file /oname=$INSTDIR\tcl8.6\msgs\de.msg ..\release\tcl8.6\msgs\de.msg file /oname=$INSTDIR\tcl8.6\msgs\de_at.msg ..\release\tcl8.6\msgs\de_at.msg file /oname=$INSTDIR\tcl8.6\msgs\de_be.msg ..\release\tcl8.6\msgs\de_be.msg file /oname=$INSTDIR\tcl8.6\msgs\el.msg ..\release\tcl8.6\msgs\el.msg file /oname=$INSTDIR\tcl8.6\msgs\en_au.msg ..\release\tcl8.6\msgs\en_au.msg file /oname=$INSTDIR\tcl8.6\msgs\en_be.msg ..\release\tcl8.6\msgs\en_be.msg file /oname=$INSTDIR\tcl8.6\msgs\en_bw.msg ..\release\tcl8.6\msgs\en_bw.msg file /oname=$INSTDIR\tcl8.6\msgs\en_ca.msg ..\release\tcl8.6\msgs\en_ca.msg file /oname=$INSTDIR\tcl8.6\msgs\en_gb.msg ..\release\tcl8.6\msgs\en_gb.msg file /oname=$INSTDIR\tcl8.6\msgs\en_hk.msg ..\release\tcl8.6\msgs\en_hk.msg file /oname=$INSTDIR\tcl8.6\msgs\en_ie.msg ..\release\tcl8.6\msgs\en_ie.msg file /oname=$INSTDIR\tcl8.6\msgs\en_in.msg ..\release\tcl8.6\msgs\en_in.msg file /oname=$INSTDIR\tcl8.6\msgs\en_nz.msg ..\release\tcl8.6\msgs\en_nz.msg file /oname=$INSTDIR\tcl8.6\msgs\en_ph.msg ..\release\tcl8.6\msgs\en_ph.msg file /oname=$INSTDIR\tcl8.6\msgs\en_sg.msg ..\release\tcl8.6\msgs\en_sg.msg file /oname=$INSTDIR\tcl8.6\msgs\en_za.msg ..\release\tcl8.6\msgs\en_za.msg file /oname=$INSTDIR\tcl8.6\msgs\en_zw.msg ..\release\tcl8.6\msgs\en_zw.msg file /oname=$INSTDIR\tcl8.6\msgs\eo.msg ..\release\tcl8.6\msgs\eo.msg file /oname=$INSTDIR\tcl8.6\msgs\es.msg ..\release\tcl8.6\msgs\es.msg file /oname=$INSTDIR\tcl8.6\msgs\es_ar.msg ..\release\tcl8.6\msgs\es_ar.msg file /oname=$INSTDIR\tcl8.6\msgs\es_bo.msg ..\release\tcl8.6\msgs\es_bo.msg file /oname=$INSTDIR\tcl8.6\msgs\es_cl.msg ..\release\tcl8.6\msgs\es_cl.msg file /oname=$INSTDIR\tcl8.6\msgs\es_co.msg ..\release\tcl8.6\msgs\es_co.msg file /oname=$INSTDIR\tcl8.6\msgs\es_cr.msg ..\release\tcl8.6\msgs\es_cr.msg file /oname=$INSTDIR\tcl8.6\msgs\es_do.msg ..\release\tcl8.6\msgs\es_do.msg file /oname=$INSTDIR\tcl8.6\msgs\es_ec.msg ..\release\tcl8.6\msgs\es_ec.msg file /oname=$INSTDIR\tcl8.6\msgs\es_gt.msg ..\release\tcl8.6\msgs\es_gt.msg file /oname=$INSTDIR\tcl8.6\msgs\es_hn.msg ..\release\tcl8.6\msgs\es_hn.msg file /oname=$INSTDIR\tcl8.6\msgs\es_mx.msg ..\release\tcl8.6\msgs\es_mx.msg file /oname=$INSTDIR\tcl8.6\msgs\es_ni.msg ..\release\tcl8.6\msgs\es_ni.msg file /oname=$INSTDIR\tcl8.6\msgs\es_pa.msg ..\release\tcl8.6\msgs\es_pa.msg file /oname=$INSTDIR\tcl8.6\msgs\es_pe.msg ..\release\tcl8.6\msgs\es_pe.msg file /oname=$INSTDIR\tcl8.6\msgs\es_pr.msg ..\release\tcl8.6\msgs\es_pr.msg file /oname=$INSTDIR\tcl8.6\msgs\es_py.msg ..\release\tcl8.6\msgs\es_py.msg file /oname=$INSTDIR\tcl8.6\msgs\es_sv.msg ..\release\tcl8.6\msgs\es_sv.msg file /oname=$INSTDIR\tcl8.6\msgs\es_uy.msg ..\release\tcl8.6\msgs\es_uy.msg file /oname=$INSTDIR\tcl8.6\msgs\es_ve.msg ..\release\tcl8.6\msgs\es_ve.msg file /oname=$INSTDIR\tcl8.6\msgs\et.msg ..\release\tcl8.6\msgs\et.msg file /oname=$INSTDIR\tcl8.6\msgs\eu.msg ..\release\tcl8.6\msgs\eu.msg file /oname=$INSTDIR\tcl8.6\msgs\eu_es.msg ..\release\tcl8.6\msgs\eu_es.msg file /oname=$INSTDIR\tcl8.6\msgs\fa.msg ..\release\tcl8.6\msgs\fa.msg file /oname=$INSTDIR\tcl8.6\msgs\fa_in.msg ..\release\tcl8.6\msgs\fa_in.msg file /oname=$INSTDIR\tcl8.6\msgs\fa_ir.msg ..\release\tcl8.6\msgs\fa_ir.msg file /oname=$INSTDIR\tcl8.6\msgs\fi.msg ..\release\tcl8.6\msgs\fi.msg file /oname=$INSTDIR\tcl8.6\msgs\fo.msg ..\release\tcl8.6\msgs\fo.msg file /oname=$INSTDIR\tcl8.6\msgs\fo_fo.msg ..\release\tcl8.6\msgs\fo_fo.msg file /oname=$INSTDIR\tcl8.6\msgs\fr.msg ..\release\tcl8.6\msgs\fr.msg file /oname=$INSTDIR\tcl8.6\msgs\fr_be.msg ..\release\tcl8.6\msgs\fr_be.msg file /oname=$INSTDIR\tcl8.6\msgs\fr_ca.msg ..\release\tcl8.6\msgs\fr_ca.msg file /oname=$INSTDIR\tcl8.6\msgs\fr_ch.msg ..\release\tcl8.6\msgs\fr_ch.msg file /oname=$INSTDIR\tcl8.6\msgs\ga.msg ..\release\tcl8.6\msgs\ga.msg file /oname=$INSTDIR\tcl8.6\msgs\ga_ie.msg ..\release\tcl8.6\msgs\ga_ie.msg file /oname=$INSTDIR\tcl8.6\msgs\gl.msg ..\release\tcl8.6\msgs\gl.msg file /oname=$INSTDIR\tcl8.6\msgs\gl_es.msg ..\release\tcl8.6\msgs\gl_es.msg file /oname=$INSTDIR\tcl8.6\msgs\gv.msg ..\release\tcl8.6\msgs\gv.msg file /oname=$INSTDIR\tcl8.6\msgs\gv_gb.msg ..\release\tcl8.6\msgs\gv_gb.msg file /oname=$INSTDIR\tcl8.6\msgs\he.msg ..\release\tcl8.6\msgs\he.msg file /oname=$INSTDIR\tcl8.6\msgs\hi.msg ..\release\tcl8.6\msgs\hi.msg file /oname=$INSTDIR\tcl8.6\msgs\hi_in.msg ..\release\tcl8.6\msgs\hi_in.msg file /oname=$INSTDIR\tcl8.6\msgs\hr.msg ..\release\tcl8.6\msgs\hr.msg file /oname=$INSTDIR\tcl8.6\msgs\hu.msg ..\release\tcl8.6\msgs\hu.msg file /oname=$INSTDIR\tcl8.6\msgs\id.msg ..\release\tcl8.6\msgs\id.msg file /oname=$INSTDIR\tcl8.6\msgs\id_id.msg ..\release\tcl8.6\msgs\id_id.msg file /oname=$INSTDIR\tcl8.6\msgs\is.msg ..\release\tcl8.6\msgs\is.msg file /oname=$INSTDIR\tcl8.6\msgs\it.msg ..\release\tcl8.6\msgs\it.msg file /oname=$INSTDIR\tcl8.6\msgs\it_ch.msg ..\release\tcl8.6\msgs\it_ch.msg file /oname=$INSTDIR\tcl8.6\msgs\ja.msg ..\release\tcl8.6\msgs\ja.msg file /oname=$INSTDIR\tcl8.6\msgs\kl.msg ..\release\tcl8.6\msgs\kl.msg file /oname=$INSTDIR\tcl8.6\msgs\kl_gl.msg ..\release\tcl8.6\msgs\kl_gl.msg file /oname=$INSTDIR\tcl8.6\msgs\ko.msg ..\release\tcl8.6\msgs\ko.msg file /oname=$INSTDIR\tcl8.6\msgs\kok.msg ..\release\tcl8.6\msgs\kok.msg file /oname=$INSTDIR\tcl8.6\msgs\kok_in.msg ..\release\tcl8.6\msgs\kok_in.msg file /oname=$INSTDIR\tcl8.6\msgs\ko_kr.msg ..\release\tcl8.6\msgs\ko_kr.msg file /oname=$INSTDIR\tcl8.6\msgs\kw.msg ..\release\tcl8.6\msgs\kw.msg file /oname=$INSTDIR\tcl8.6\msgs\kw_gb.msg ..\release\tcl8.6\msgs\kw_gb.msg file /oname=$INSTDIR\tcl8.6\msgs\lt.msg ..\release\tcl8.6\msgs\lt.msg file /oname=$INSTDIR\tcl8.6\msgs\lv.msg ..\release\tcl8.6\msgs\lv.msg file /oname=$INSTDIR\tcl8.6\msgs\mk.msg ..\release\tcl8.6\msgs\mk.msg file /oname=$INSTDIR\tcl8.6\msgs\mr.msg ..\release\tcl8.6\msgs\mr.msg file /oname=$INSTDIR\tcl8.6\msgs\mr_in.msg ..\release\tcl8.6\msgs\mr_in.msg file /oname=$INSTDIR\tcl8.6\msgs\ms.msg ..\release\tcl8.6\msgs\ms.msg file /oname=$INSTDIR\tcl8.6\msgs\ms_my.msg ..\release\tcl8.6\msgs\ms_my.msg file /oname=$INSTDIR\tcl8.6\msgs\mt.msg ..\release\tcl8.6\msgs\mt.msg file /oname=$INSTDIR\tcl8.6\msgs\nb.msg ..\release\tcl8.6\msgs\nb.msg file /oname=$INSTDIR\tcl8.6\msgs\nl.msg ..\release\tcl8.6\msgs\nl.msg file /oname=$INSTDIR\tcl8.6\msgs\nl_be.msg ..\release\tcl8.6\msgs\nl_be.msg file /oname=$INSTDIR\tcl8.6\msgs\nn.msg ..\release\tcl8.6\msgs\nn.msg file /oname=$INSTDIR\tcl8.6\msgs\pl.msg ..\release\tcl8.6\msgs\pl.msg file /oname=$INSTDIR\tcl8.6\msgs\pt.msg ..\release\tcl8.6\msgs\pt.msg file /oname=$INSTDIR\tcl8.6\msgs\pt_br.msg ..\release\tcl8.6\msgs\pt_br.msg file /oname=$INSTDIR\tcl8.6\msgs\ro.msg ..\release\tcl8.6\msgs\ro.msg file /oname=$INSTDIR\tcl8.6\msgs\ru.msg ..\release\tcl8.6\msgs\ru.msg file /oname=$INSTDIR\tcl8.6\msgs\ru_ua.msg ..\release\tcl8.6\msgs\ru_ua.msg file /oname=$INSTDIR\tcl8.6\msgs\sh.msg ..\release\tcl8.6\msgs\sh.msg file /oname=$INSTDIR\tcl8.6\msgs\sk.msg ..\release\tcl8.6\msgs\sk.msg file /oname=$INSTDIR\tcl8.6\msgs\sl.msg ..\release\tcl8.6\msgs\sl.msg file /oname=$INSTDIR\tcl8.6\msgs\sq.msg ..\release\tcl8.6\msgs\sq.msg file /oname=$INSTDIR\tcl8.6\msgs\sr.msg ..\release\tcl8.6\msgs\sr.msg file /oname=$INSTDIR\tcl8.6\msgs\sv.msg ..\release\tcl8.6\msgs\sv.msg file /oname=$INSTDIR\tcl8.6\msgs\sw.msg ..\release\tcl8.6\msgs\sw.msg file /oname=$INSTDIR\tcl8.6\msgs\ta.msg ..\release\tcl8.6\msgs\ta.msg file /oname=$INSTDIR\tcl8.6\msgs\ta_in.msg ..\release\tcl8.6\msgs\ta_in.msg file /oname=$INSTDIR\tcl8.6\msgs\te.msg ..\release\tcl8.6\msgs\te.msg file /oname=$INSTDIR\tcl8.6\msgs\te_in.msg ..\release\tcl8.6\msgs\te_in.msg file /oname=$INSTDIR\tcl8.6\msgs\th.msg ..\release\tcl8.6\msgs\th.msg file /oname=$INSTDIR\tcl8.6\msgs\tr.msg ..\release\tcl8.6\msgs\tr.msg file /oname=$INSTDIR\tcl8.6\msgs\uk.msg ..\release\tcl8.6\msgs\uk.msg file /oname=$INSTDIR\tcl8.6\msgs\vi.msg ..\release\tcl8.6\msgs\vi.msg file /oname=$INSTDIR\tcl8.6\msgs\zh.msg ..\release\tcl8.6\msgs\zh.msg file /oname=$INSTDIR\tcl8.6\msgs\zh_cn.msg ..\release\tcl8.6\msgs\zh_cn.msg file /oname=$INSTDIR\tcl8.6\msgs\zh_hk.msg ..\release\tcl8.6\msgs\zh_hk.msg file /oname=$INSTDIR\tcl8.6\msgs\zh_sg.msg ..\release\tcl8.6\msgs\zh_sg.msg file /oname=$INSTDIR\tcl8.6\msgs\zh_tw.msg ..\release\tcl8.6\msgs\zh_tw.msg file /oname=$INSTDIR\tcl8.6\opt0.4\optparse.tcl ..\release\tcl8.6\opt0.4\optparse.tcl file /oname=$INSTDIR\tcl8.6\opt0.4\pkgIndex.tcl ..\release\tcl8.6\opt0.4\pkgIndex.tcl file /oname=$INSTDIR\tcl8.6\package.tcl ..\release\tcl8.6\package.tcl file /oname=$INSTDIR\tcl8.6\parray.tcl ..\release\tcl8.6\parray.tcl file /oname=$INSTDIR\tcl8.6\safe.tcl ..\release\tcl8.6\safe.tcl file /oname=$INSTDIR\tcl8.6\tclIndex ..\release\tcl8.6\tclIndex file /oname=$INSTDIR\tcl8.6\tm.tcl ..\release\tcl8.6\tm.tcl file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Abidjan ..\release\tcl8.6\tzdata\Africa\Abidjan file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Accra ..\release\tcl8.6\tzdata\Africa\Accra file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Addis_Ababa ..\release\tcl8.6\tzdata\Africa\Addis_Ababa file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Algiers ..\release\tcl8.6\tzdata\Africa\Algiers file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Asmara ..\release\tcl8.6\tzdata\Africa\Asmara file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Asmera ..\release\tcl8.6\tzdata\Africa\Asmera file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Bamako ..\release\tcl8.6\tzdata\Africa\Bamako file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Bangui ..\release\tcl8.6\tzdata\Africa\Bangui file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Banjul ..\release\tcl8.6\tzdata\Africa\Banjul file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Bissau ..\release\tcl8.6\tzdata\Africa\Bissau file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Blantyre ..\release\tcl8.6\tzdata\Africa\Blantyre file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Brazzaville ..\release\tcl8.6\tzdata\Africa\Brazzaville file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Bujumbura ..\release\tcl8.6\tzdata\Africa\Bujumbura file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Cairo ..\release\tcl8.6\tzdata\Africa\Cairo file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Casablanca ..\release\tcl8.6\tzdata\Africa\Casablanca file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Ceuta ..\release\tcl8.6\tzdata\Africa\Ceuta file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Conakry ..\release\tcl8.6\tzdata\Africa\Conakry file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Dakar ..\release\tcl8.6\tzdata\Africa\Dakar file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Dar_es_Salaam ..\release\tcl8.6\tzdata\Africa\Dar_es_Salaam file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Djibouti ..\release\tcl8.6\tzdata\Africa\Djibouti file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Douala ..\release\tcl8.6\tzdata\Africa\Douala file /oname=$INSTDIR\tcl8.6\tzdata\Africa\El_Aaiun ..\release\tcl8.6\tzdata\Africa\El_Aaiun file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Freetown ..\release\tcl8.6\tzdata\Africa\Freetown file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Gaborone ..\release\tcl8.6\tzdata\Africa\Gaborone file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Harare ..\release\tcl8.6\tzdata\Africa\Harare file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Johannesburg ..\release\tcl8.6\tzdata\Africa\Johannesburg file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Juba ..\release\tcl8.6\tzdata\Africa\Juba file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Kampala ..\release\tcl8.6\tzdata\Africa\Kampala file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Khartoum ..\release\tcl8.6\tzdata\Africa\Khartoum file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Kigali ..\release\tcl8.6\tzdata\Africa\Kigali file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Kinshasa ..\release\tcl8.6\tzdata\Africa\Kinshasa file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Lagos ..\release\tcl8.6\tzdata\Africa\Lagos file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Libreville ..\release\tcl8.6\tzdata\Africa\Libreville file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Lome ..\release\tcl8.6\tzdata\Africa\Lome file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Luanda ..\release\tcl8.6\tzdata\Africa\Luanda file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Lubumbashi ..\release\tcl8.6\tzdata\Africa\Lubumbashi file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Lusaka ..\release\tcl8.6\tzdata\Africa\Lusaka file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Malabo ..\release\tcl8.6\tzdata\Africa\Malabo file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Maputo ..\release\tcl8.6\tzdata\Africa\Maputo file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Maseru ..\release\tcl8.6\tzdata\Africa\Maseru file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Mbabane ..\release\tcl8.6\tzdata\Africa\Mbabane file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Mogadishu ..\release\tcl8.6\tzdata\Africa\Mogadishu file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Monrovia ..\release\tcl8.6\tzdata\Africa\Monrovia file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Nairobi ..\release\tcl8.6\tzdata\Africa\Nairobi file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Ndjamena ..\release\tcl8.6\tzdata\Africa\Ndjamena file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Niamey ..\release\tcl8.6\tzdata\Africa\Niamey file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Nouakchott ..\release\tcl8.6\tzdata\Africa\Nouakchott file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Ouagadougou ..\release\tcl8.6\tzdata\Africa\Ouagadougou file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Porto-Novo ..\release\tcl8.6\tzdata\Africa\Porto-Novo file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Sao_Tome ..\release\tcl8.6\tzdata\Africa\Sao_Tome file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Timbuktu ..\release\tcl8.6\tzdata\Africa\Timbuktu file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Tripoli ..\release\tcl8.6\tzdata\Africa\Tripoli file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Tunis ..\release\tcl8.6\tzdata\Africa\Tunis file /oname=$INSTDIR\tcl8.6\tzdata\Africa\Windhoek ..\release\tcl8.6\tzdata\Africa\Windhoek file /oname=$INSTDIR\tcl8.6\tzdata\America\Adak ..\release\tcl8.6\tzdata\America\Adak file /oname=$INSTDIR\tcl8.6\tzdata\America\Anchorage ..\release\tcl8.6\tzdata\America\Anchorage file /oname=$INSTDIR\tcl8.6\tzdata\America\Anguilla ..\release\tcl8.6\tzdata\America\Anguilla file /oname=$INSTDIR\tcl8.6\tzdata\America\Antigua ..\release\tcl8.6\tzdata\America\Antigua file /oname=$INSTDIR\tcl8.6\tzdata\America\Araguaina ..\release\tcl8.6\tzdata\America\Araguaina file /oname=$INSTDIR\tcl8.6\tzdata\America\Argentina\Buenos_Aires ..\release\tcl8.6\tzdata\America\Argentina\Buenos_Aires file /oname=$INSTDIR\tcl8.6\tzdata\America\Argentina\Catamarca ..\release\tcl8.6\tzdata\America\Argentina\Catamarca file /oname=$INSTDIR\tcl8.6\tzdata\America\Argentina\ComodRivadavia ..\release\tcl8.6\tzdata\America\Argentina\ComodRivadavia file /oname=$INSTDIR\tcl8.6\tzdata\America\Argentina\Cordoba ..\release\tcl8.6\tzdata\America\Argentina\Cordoba file /oname=$INSTDIR\tcl8.6\tzdata\America\Argentina\Jujuy ..\release\tcl8.6\tzdata\America\Argentina\Jujuy file /oname=$INSTDIR\tcl8.6\tzdata\America\Argentina\La_Rioja ..\release\tcl8.6\tzdata\America\Argentina\La_Rioja file /oname=$INSTDIR\tcl8.6\tzdata\America\Argentina\Mendoza ..\release\tcl8.6\tzdata\America\Argentina\Mendoza file /oname=$INSTDIR\tcl8.6\tzdata\America\Argentina\Rio_Gallegos ..\release\tcl8.6\tzdata\America\Argentina\Rio_Gallegos file /oname=$INSTDIR\tcl8.6\tzdata\America\Argentina\Salta ..\release\tcl8.6\tzdata\America\Argentina\Salta file /oname=$INSTDIR\tcl8.6\tzdata\America\Argentina\San_Juan ..\release\tcl8.6\tzdata\America\Argentina\San_Juan file /oname=$INSTDIR\tcl8.6\tzdata\America\Argentina\San_Luis ..\release\tcl8.6\tzdata\America\Argentina\San_Luis file /oname=$INSTDIR\tcl8.6\tzdata\America\Argentina\Tucuman ..\release\tcl8.6\tzdata\America\Argentina\Tucuman file /oname=$INSTDIR\tcl8.6\tzdata\America\Argentina\Ushuaia ..\release\tcl8.6\tzdata\America\Argentina\Ushuaia file /oname=$INSTDIR\tcl8.6\tzdata\America\Aruba ..\release\tcl8.6\tzdata\America\Aruba file /oname=$INSTDIR\tcl8.6\tzdata\America\Asuncion ..\release\tcl8.6\tzdata\America\Asuncion file /oname=$INSTDIR\tcl8.6\tzdata\America\Atikokan ..\release\tcl8.6\tzdata\America\Atikokan file /oname=$INSTDIR\tcl8.6\tzdata\America\Atka ..\release\tcl8.6\tzdata\America\Atka file /oname=$INSTDIR\tcl8.6\tzdata\America\Bahia ..\release\tcl8.6\tzdata\America\Bahia file /oname=$INSTDIR\tcl8.6\tzdata\America\Bahia_Banderas ..\release\tcl8.6\tzdata\America\Bahia_Banderas file /oname=$INSTDIR\tcl8.6\tzdata\America\Barbados ..\release\tcl8.6\tzdata\America\Barbados file /oname=$INSTDIR\tcl8.6\tzdata\America\Belem ..\release\tcl8.6\tzdata\America\Belem file /oname=$INSTDIR\tcl8.6\tzdata\America\Belize ..\release\tcl8.6\tzdata\America\Belize file /oname=$INSTDIR\tcl8.6\tzdata\America\Blanc-Sablon ..\release\tcl8.6\tzdata\America\Blanc-Sablon file /oname=$INSTDIR\tcl8.6\tzdata\America\Boa_Vista ..\release\tcl8.6\tzdata\America\Boa_Vista file /oname=$INSTDIR\tcl8.6\tzdata\America\Bogota ..\release\tcl8.6\tzdata\America\Bogota file /oname=$INSTDIR\tcl8.6\tzdata\America\Boise ..\release\tcl8.6\tzdata\America\Boise file /oname=$INSTDIR\tcl8.6\tzdata\America\Buenos_Aires ..\release\tcl8.6\tzdata\America\Buenos_Aires file /oname=$INSTDIR\tcl8.6\tzdata\America\Cambridge_Bay ..\release\tcl8.6\tzdata\America\Cambridge_Bay file /oname=$INSTDIR\tcl8.6\tzdata\America\Campo_Grande ..\release\tcl8.6\tzdata\America\Campo_Grande file /oname=$INSTDIR\tcl8.6\tzdata\America\Cancun ..\release\tcl8.6\tzdata\America\Cancun file /oname=$INSTDIR\tcl8.6\tzdata\America\Caracas ..\release\tcl8.6\tzdata\America\Caracas file /oname=$INSTDIR\tcl8.6\tzdata\America\Catamarca ..\release\tcl8.6\tzdata\America\Catamarca file /oname=$INSTDIR\tcl8.6\tzdata\America\Cayenne ..\release\tcl8.6\tzdata\America\Cayenne file /oname=$INSTDIR\tcl8.6\tzdata\America\Cayman ..\release\tcl8.6\tzdata\America\Cayman file /oname=$INSTDIR\tcl8.6\tzdata\America\Chicago ..\release\tcl8.6\tzdata\America\Chicago file /oname=$INSTDIR\tcl8.6\tzdata\America\Chihuahua ..\release\tcl8.6\tzdata\America\Chihuahua file /oname=$INSTDIR\tcl8.6\tzdata\America\Coral_Harbour ..\release\tcl8.6\tzdata\America\Coral_Harbour file /oname=$INSTDIR\tcl8.6\tzdata\America\Cordoba ..\release\tcl8.6\tzdata\America\Cordoba file /oname=$INSTDIR\tcl8.6\tzdata\America\Costa_Rica ..\release\tcl8.6\tzdata\America\Costa_Rica file /oname=$INSTDIR\tcl8.6\tzdata\America\Creston ..\release\tcl8.6\tzdata\America\Creston file /oname=$INSTDIR\tcl8.6\tzdata\America\Cuiaba ..\release\tcl8.6\tzdata\America\Cuiaba file /oname=$INSTDIR\tcl8.6\tzdata\America\Curacao ..\release\tcl8.6\tzdata\America\Curacao file /oname=$INSTDIR\tcl8.6\tzdata\America\Danmarkshavn ..\release\tcl8.6\tzdata\America\Danmarkshavn file /oname=$INSTDIR\tcl8.6\tzdata\America\Dawson ..\release\tcl8.6\tzdata\America\Dawson file /oname=$INSTDIR\tcl8.6\tzdata\America\Dawson_Creek ..\release\tcl8.6\tzdata\America\Dawson_Creek file /oname=$INSTDIR\tcl8.6\tzdata\America\Denver ..\release\tcl8.6\tzdata\America\Denver file /oname=$INSTDIR\tcl8.6\tzdata\America\Detroit ..\release\tcl8.6\tzdata\America\Detroit file /oname=$INSTDIR\tcl8.6\tzdata\America\Dominica ..\release\tcl8.6\tzdata\America\Dominica file /oname=$INSTDIR\tcl8.6\tzdata\America\Edmonton ..\release\tcl8.6\tzdata\America\Edmonton file /oname=$INSTDIR\tcl8.6\tzdata\America\Eirunepe ..\release\tcl8.6\tzdata\America\Eirunepe file /oname=$INSTDIR\tcl8.6\tzdata\America\El_Salvador ..\release\tcl8.6\tzdata\America\El_Salvador file /oname=$INSTDIR\tcl8.6\tzdata\America\Ensenada ..\release\tcl8.6\tzdata\America\Ensenada file /oname=$INSTDIR\tcl8.6\tzdata\America\Fortaleza ..\release\tcl8.6\tzdata\America\Fortaleza file /oname=$INSTDIR\tcl8.6\tzdata\America\Fort_Nelson ..\release\tcl8.6\tzdata\America\Fort_Nelson file /oname=$INSTDIR\tcl8.6\tzdata\America\Fort_Wayne ..\release\tcl8.6\tzdata\America\Fort_Wayne file /oname=$INSTDIR\tcl8.6\tzdata\America\Glace_Bay ..\release\tcl8.6\tzdata\America\Glace_Bay file /oname=$INSTDIR\tcl8.6\tzdata\America\Godthab ..\release\tcl8.6\tzdata\America\Godthab file /oname=$INSTDIR\tcl8.6\tzdata\America\Goose_Bay ..\release\tcl8.6\tzdata\America\Goose_Bay file /oname=$INSTDIR\tcl8.6\tzdata\America\Grand_Turk ..\release\tcl8.6\tzdata\America\Grand_Turk file /oname=$INSTDIR\tcl8.6\tzdata\America\Grenada ..\release\tcl8.6\tzdata\America\Grenada file /oname=$INSTDIR\tcl8.6\tzdata\America\Guadeloupe ..\release\tcl8.6\tzdata\America\Guadeloupe file /oname=$INSTDIR\tcl8.6\tzdata\America\Guatemala ..\release\tcl8.6\tzdata\America\Guatemala file /oname=$INSTDIR\tcl8.6\tzdata\America\Guayaquil ..\release\tcl8.6\tzdata\America\Guayaquil file /oname=$INSTDIR\tcl8.6\tzdata\America\Guyana ..\release\tcl8.6\tzdata\America\Guyana file /oname=$INSTDIR\tcl8.6\tzdata\America\Halifax ..\release\tcl8.6\tzdata\America\Halifax file /oname=$INSTDIR\tcl8.6\tzdata\America\Havana ..\release\tcl8.6\tzdata\America\Havana file /oname=$INSTDIR\tcl8.6\tzdata\America\Hermosillo ..\release\tcl8.6\tzdata\America\Hermosillo file /oname=$INSTDIR\tcl8.6\tzdata\America\Indiana\Indianapolis ..\release\tcl8.6\tzdata\America\Indiana\Indianapolis file /oname=$INSTDIR\tcl8.6\tzdata\America\Indiana\Knox ..\release\tcl8.6\tzdata\America\Indiana\Knox file /oname=$INSTDIR\tcl8.6\tzdata\America\Indiana\Marengo ..\release\tcl8.6\tzdata\America\Indiana\Marengo file /oname=$INSTDIR\tcl8.6\tzdata\America\Indiana\Petersburg ..\release\tcl8.6\tzdata\America\Indiana\Petersburg file /oname=$INSTDIR\tcl8.6\tzdata\America\Indiana\Tell_City ..\release\tcl8.6\tzdata\America\Indiana\Tell_City file /oname=$INSTDIR\tcl8.6\tzdata\America\Indiana\Vevay ..\release\tcl8.6\tzdata\America\Indiana\Vevay file /oname=$INSTDIR\tcl8.6\tzdata\America\Indiana\Vincennes ..\release\tcl8.6\tzdata\America\Indiana\Vincennes file /oname=$INSTDIR\tcl8.6\tzdata\America\Indiana\Winamac ..\release\tcl8.6\tzdata\America\Indiana\Winamac file /oname=$INSTDIR\tcl8.6\tzdata\America\Indianapolis ..\release\tcl8.6\tzdata\America\Indianapolis file /oname=$INSTDIR\tcl8.6\tzdata\America\Inuvik ..\release\tcl8.6\tzdata\America\Inuvik file /oname=$INSTDIR\tcl8.6\tzdata\America\Iqaluit ..\release\tcl8.6\tzdata\America\Iqaluit file /oname=$INSTDIR\tcl8.6\tzdata\America\Jamaica ..\release\tcl8.6\tzdata\America\Jamaica file /oname=$INSTDIR\tcl8.6\tzdata\America\Jujuy ..\release\tcl8.6\tzdata\America\Jujuy file /oname=$INSTDIR\tcl8.6\tzdata\America\Juneau ..\release\tcl8.6\tzdata\America\Juneau file /oname=$INSTDIR\tcl8.6\tzdata\America\Kentucky\Louisville ..\release\tcl8.6\tzdata\America\Kentucky\Louisville file /oname=$INSTDIR\tcl8.6\tzdata\America\Kentucky\Monticello ..\release\tcl8.6\tzdata\America\Kentucky\Monticello file /oname=$INSTDIR\tcl8.6\tzdata\America\Knox_IN ..\release\tcl8.6\tzdata\America\Knox_IN file /oname=$INSTDIR\tcl8.6\tzdata\America\Kralendijk ..\release\tcl8.6\tzdata\America\Kralendijk file /oname=$INSTDIR\tcl8.6\tzdata\America\La_Paz ..\release\tcl8.6\tzdata\America\La_Paz file /oname=$INSTDIR\tcl8.6\tzdata\America\Lima ..\release\tcl8.6\tzdata\America\Lima file /oname=$INSTDIR\tcl8.6\tzdata\America\Los_Angeles ..\release\tcl8.6\tzdata\America\Los_Angeles file /oname=$INSTDIR\tcl8.6\tzdata\America\Louisville ..\release\tcl8.6\tzdata\America\Louisville file /oname=$INSTDIR\tcl8.6\tzdata\America\Lower_Princes ..\release\tcl8.6\tzdata\America\Lower_Princes file /oname=$INSTDIR\tcl8.6\tzdata\America\Maceio ..\release\tcl8.6\tzdata\America\Maceio file /oname=$INSTDIR\tcl8.6\tzdata\America\Managua ..\release\tcl8.6\tzdata\America\Managua file /oname=$INSTDIR\tcl8.6\tzdata\America\Manaus ..\release\tcl8.6\tzdata\America\Manaus file /oname=$INSTDIR\tcl8.6\tzdata\America\Marigot ..\release\tcl8.6\tzdata\America\Marigot file /oname=$INSTDIR\tcl8.6\tzdata\America\Martinique ..\release\tcl8.6\tzdata\America\Martinique file /oname=$INSTDIR\tcl8.6\tzdata\America\Matamoros ..\release\tcl8.6\tzdata\America\Matamoros file /oname=$INSTDIR\tcl8.6\tzdata\America\Mazatlan ..\release\tcl8.6\tzdata\America\Mazatlan file /oname=$INSTDIR\tcl8.6\tzdata\America\Mendoza ..\release\tcl8.6\tzdata\America\Mendoza file /oname=$INSTDIR\tcl8.6\tzdata\America\Menominee ..\release\tcl8.6\tzdata\America\Menominee file /oname=$INSTDIR\tcl8.6\tzdata\America\Merida ..\release\tcl8.6\tzdata\America\Merida file /oname=$INSTDIR\tcl8.6\tzdata\America\Metlakatla ..\release\tcl8.6\tzdata\America\Metlakatla file /oname=$INSTDIR\tcl8.6\tzdata\America\Mexico_City ..\release\tcl8.6\tzdata\America\Mexico_City file /oname=$INSTDIR\tcl8.6\tzdata\America\Miquelon ..\release\tcl8.6\tzdata\America\Miquelon file /oname=$INSTDIR\tcl8.6\tzdata\America\Moncton ..\release\tcl8.6\tzdata\America\Moncton file /oname=$INSTDIR\tcl8.6\tzdata\America\Monterrey ..\release\tcl8.6\tzdata\America\Monterrey file /oname=$INSTDIR\tcl8.6\tzdata\America\Montevideo ..\release\tcl8.6\tzdata\America\Montevideo file /oname=$INSTDIR\tcl8.6\tzdata\America\Montreal ..\release\tcl8.6\tzdata\America\Montreal file /oname=$INSTDIR\tcl8.6\tzdata\America\Montserrat ..\release\tcl8.6\tzdata\America\Montserrat file /oname=$INSTDIR\tcl8.6\tzdata\America\Nassau ..\release\tcl8.6\tzdata\America\Nassau file /oname=$INSTDIR\tcl8.6\tzdata\America\New_York ..\release\tcl8.6\tzdata\America\New_York file /oname=$INSTDIR\tcl8.6\tzdata\America\Nipigon ..\release\tcl8.6\tzdata\America\Nipigon file /oname=$INSTDIR\tcl8.6\tzdata\America\Nome ..\release\tcl8.6\tzdata\America\Nome file /oname=$INSTDIR\tcl8.6\tzdata\America\Noronha ..\release\tcl8.6\tzdata\America\Noronha file /oname=$INSTDIR\tcl8.6\tzdata\America\North_Dakota\Beulah ..\release\tcl8.6\tzdata\America\North_Dakota\Beulah file /oname=$INSTDIR\tcl8.6\tzdata\America\North_Dakota\Center ..\release\tcl8.6\tzdata\America\North_Dakota\Center file /oname=$INSTDIR\tcl8.6\tzdata\America\North_Dakota\New_Salem ..\release\tcl8.6\tzdata\America\North_Dakota\New_Salem file /oname=$INSTDIR\tcl8.6\tzdata\America\Ojinaga ..\release\tcl8.6\tzdata\America\Ojinaga file /oname=$INSTDIR\tcl8.6\tzdata\America\Panama ..\release\tcl8.6\tzdata\America\Panama file /oname=$INSTDIR\tcl8.6\tzdata\America\Pangnirtung ..\release\tcl8.6\tzdata\America\Pangnirtung file /oname=$INSTDIR\tcl8.6\tzdata\America\Paramaribo ..\release\tcl8.6\tzdata\America\Paramaribo file /oname=$INSTDIR\tcl8.6\tzdata\America\Phoenix ..\release\tcl8.6\tzdata\America\Phoenix file /oname=$INSTDIR\tcl8.6\tzdata\America\Port-au-Prince ..\release\tcl8.6\tzdata\America\Port-au-Prince file /oname=$INSTDIR\tcl8.6\tzdata\America\Porto_Acre ..\release\tcl8.6\tzdata\America\Porto_Acre file /oname=$INSTDIR\tcl8.6\tzdata\America\Porto_Velho ..\release\tcl8.6\tzdata\America\Porto_Velho file /oname=$INSTDIR\tcl8.6\tzdata\America\Port_of_Spain ..\release\tcl8.6\tzdata\America\Port_of_Spain file /oname=$INSTDIR\tcl8.6\tzdata\America\Puerto_Rico ..\release\tcl8.6\tzdata\America\Puerto_Rico file /oname=$INSTDIR\tcl8.6\tzdata\America\Rainy_River ..\release\tcl8.6\tzdata\America\Rainy_River file /oname=$INSTDIR\tcl8.6\tzdata\America\Rankin_Inlet ..\release\tcl8.6\tzdata\America\Rankin_Inlet file /oname=$INSTDIR\tcl8.6\tzdata\America\Recife ..\release\tcl8.6\tzdata\America\Recife file /oname=$INSTDIR\tcl8.6\tzdata\America\Regina ..\release\tcl8.6\tzdata\America\Regina file /oname=$INSTDIR\tcl8.6\tzdata\America\Resolute ..\release\tcl8.6\tzdata\America\Resolute file /oname=$INSTDIR\tcl8.6\tzdata\America\Rio_Branco ..\release\tcl8.6\tzdata\America\Rio_Branco file /oname=$INSTDIR\tcl8.6\tzdata\America\Rosario ..\release\tcl8.6\tzdata\America\Rosario file /oname=$INSTDIR\tcl8.6\tzdata\America\Santarem ..\release\tcl8.6\tzdata\America\Santarem file /oname=$INSTDIR\tcl8.6\tzdata\America\Santa_Isabel ..\release\tcl8.6\tzdata\America\Santa_Isabel file /oname=$INSTDIR\tcl8.6\tzdata\America\Santiago ..\release\tcl8.6\tzdata\America\Santiago file /oname=$INSTDIR\tcl8.6\tzdata\America\Santo_Domingo ..\release\tcl8.6\tzdata\America\Santo_Domingo file /oname=$INSTDIR\tcl8.6\tzdata\America\Sao_Paulo ..\release\tcl8.6\tzdata\America\Sao_Paulo file /oname=$INSTDIR\tcl8.6\tzdata\America\Scoresbysund ..\release\tcl8.6\tzdata\America\Scoresbysund file /oname=$INSTDIR\tcl8.6\tzdata\America\Shiprock ..\release\tcl8.6\tzdata\America\Shiprock file /oname=$INSTDIR\tcl8.6\tzdata\America\Sitka ..\release\tcl8.6\tzdata\America\Sitka file /oname=$INSTDIR\tcl8.6\tzdata\America\St_Barthelemy ..\release\tcl8.6\tzdata\America\St_Barthelemy file /oname=$INSTDIR\tcl8.6\tzdata\America\St_Johns ..\release\tcl8.6\tzdata\America\St_Johns file /oname=$INSTDIR\tcl8.6\tzdata\America\St_Kitts ..\release\tcl8.6\tzdata\America\St_Kitts file /oname=$INSTDIR\tcl8.6\tzdata\America\St_Lucia ..\release\tcl8.6\tzdata\America\St_Lucia file /oname=$INSTDIR\tcl8.6\tzdata\America\St_Thomas ..\release\tcl8.6\tzdata\America\St_Thomas file /oname=$INSTDIR\tcl8.6\tzdata\America\St_Vincent ..\release\tcl8.6\tzdata\America\St_Vincent file /oname=$INSTDIR\tcl8.6\tzdata\America\Swift_Current ..\release\tcl8.6\tzdata\America\Swift_Current file /oname=$INSTDIR\tcl8.6\tzdata\America\Tegucigalpa ..\release\tcl8.6\tzdata\America\Tegucigalpa file /oname=$INSTDIR\tcl8.6\tzdata\America\Thule ..\release\tcl8.6\tzdata\America\Thule file /oname=$INSTDIR\tcl8.6\tzdata\America\Thunder_Bay ..\release\tcl8.6\tzdata\America\Thunder_Bay file /oname=$INSTDIR\tcl8.6\tzdata\America\Tijuana ..\release\tcl8.6\tzdata\America\Tijuana file /oname=$INSTDIR\tcl8.6\tzdata\America\Toronto ..\release\tcl8.6\tzdata\America\Toronto file /oname=$INSTDIR\tcl8.6\tzdata\America\Tortola ..\release\tcl8.6\tzdata\America\Tortola file /oname=$INSTDIR\tcl8.6\tzdata\America\Vancouver ..\release\tcl8.6\tzdata\America\Vancouver file /oname=$INSTDIR\tcl8.6\tzdata\America\Virgin ..\release\tcl8.6\tzdata\America\Virgin file /oname=$INSTDIR\tcl8.6\tzdata\America\Whitehorse ..\release\tcl8.6\tzdata\America\Whitehorse file /oname=$INSTDIR\tcl8.6\tzdata\America\Winnipeg ..\release\tcl8.6\tzdata\America\Winnipeg file /oname=$INSTDIR\tcl8.6\tzdata\America\Yakutat ..\release\tcl8.6\tzdata\America\Yakutat file /oname=$INSTDIR\tcl8.6\tzdata\America\Yellowknife ..\release\tcl8.6\tzdata\America\Yellowknife file /oname=$INSTDIR\tcl8.6\tzdata\Antarctica\Casey ..\release\tcl8.6\tzdata\Antarctica\Casey file /oname=$INSTDIR\tcl8.6\tzdata\Antarctica\Davis ..\release\tcl8.6\tzdata\Antarctica\Davis file /oname=$INSTDIR\tcl8.6\tzdata\Antarctica\DumontDUrville ..\release\tcl8.6\tzdata\Antarctica\DumontDUrville file /oname=$INSTDIR\tcl8.6\tzdata\Antarctica\Macquarie ..\release\tcl8.6\tzdata\Antarctica\Macquarie file /oname=$INSTDIR\tcl8.6\tzdata\Antarctica\Mawson ..\release\tcl8.6\tzdata\Antarctica\Mawson file /oname=$INSTDIR\tcl8.6\tzdata\Antarctica\McMurdo ..\release\tcl8.6\tzdata\Antarctica\McMurdo file /oname=$INSTDIR\tcl8.6\tzdata\Antarctica\Palmer ..\release\tcl8.6\tzdata\Antarctica\Palmer file /oname=$INSTDIR\tcl8.6\tzdata\Antarctica\Rothera ..\release\tcl8.6\tzdata\Antarctica\Rothera file /oname=$INSTDIR\tcl8.6\tzdata\Antarctica\South_Pole ..\release\tcl8.6\tzdata\Antarctica\South_Pole file /oname=$INSTDIR\tcl8.6\tzdata\Antarctica\Syowa ..\release\tcl8.6\tzdata\Antarctica\Syowa file /oname=$INSTDIR\tcl8.6\tzdata\Antarctica\Troll ..\release\tcl8.6\tzdata\Antarctica\Troll file /oname=$INSTDIR\tcl8.6\tzdata\Antarctica\Vostok ..\release\tcl8.6\tzdata\Antarctica\Vostok file /oname=$INSTDIR\tcl8.6\tzdata\Arctic\Longyearbyen ..\release\tcl8.6\tzdata\Arctic\Longyearbyen file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Aden ..\release\tcl8.6\tzdata\Asia\Aden file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Almaty ..\release\tcl8.6\tzdata\Asia\Almaty file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Amman ..\release\tcl8.6\tzdata\Asia\Amman file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Anadyr ..\release\tcl8.6\tzdata\Asia\Anadyr file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Aqtau ..\release\tcl8.6\tzdata\Asia\Aqtau file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Aqtobe ..\release\tcl8.6\tzdata\Asia\Aqtobe file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Ashgabat ..\release\tcl8.6\tzdata\Asia\Ashgabat file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Ashkhabad ..\release\tcl8.6\tzdata\Asia\Ashkhabad file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Baghdad ..\release\tcl8.6\tzdata\Asia\Baghdad file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Bahrain ..\release\tcl8.6\tzdata\Asia\Bahrain file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Baku ..\release\tcl8.6\tzdata\Asia\Baku file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Bangkok ..\release\tcl8.6\tzdata\Asia\Bangkok file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Barnaul ..\release\tcl8.6\tzdata\Asia\Barnaul file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Beirut ..\release\tcl8.6\tzdata\Asia\Beirut file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Bishkek ..\release\tcl8.6\tzdata\Asia\Bishkek file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Brunei ..\release\tcl8.6\tzdata\Asia\Brunei file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Calcutta ..\release\tcl8.6\tzdata\Asia\Calcutta file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Chita ..\release\tcl8.6\tzdata\Asia\Chita file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Choibalsan ..\release\tcl8.6\tzdata\Asia\Choibalsan file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Chongqing ..\release\tcl8.6\tzdata\Asia\Chongqing file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Chungking ..\release\tcl8.6\tzdata\Asia\Chungking file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Colombo ..\release\tcl8.6\tzdata\Asia\Colombo file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Dacca ..\release\tcl8.6\tzdata\Asia\Dacca file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Damascus ..\release\tcl8.6\tzdata\Asia\Damascus file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Dhaka ..\release\tcl8.6\tzdata\Asia\Dhaka file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Dili ..\release\tcl8.6\tzdata\Asia\Dili file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Dubai ..\release\tcl8.6\tzdata\Asia\Dubai file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Dushanbe ..\release\tcl8.6\tzdata\Asia\Dushanbe file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Gaza ..\release\tcl8.6\tzdata\Asia\Gaza file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Harbin ..\release\tcl8.6\tzdata\Asia\Harbin file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Hebron ..\release\tcl8.6\tzdata\Asia\Hebron file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Hong_Kong ..\release\tcl8.6\tzdata\Asia\Hong_Kong file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Hovd ..\release\tcl8.6\tzdata\Asia\Hovd file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Ho_Chi_Minh ..\release\tcl8.6\tzdata\Asia\Ho_Chi_Minh file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Irkutsk ..\release\tcl8.6\tzdata\Asia\Irkutsk file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Istanbul ..\release\tcl8.6\tzdata\Asia\Istanbul file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Jakarta ..\release\tcl8.6\tzdata\Asia\Jakarta file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Jayapura ..\release\tcl8.6\tzdata\Asia\Jayapura file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Jerusalem ..\release\tcl8.6\tzdata\Asia\Jerusalem file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Kabul ..\release\tcl8.6\tzdata\Asia\Kabul file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Kamchatka ..\release\tcl8.6\tzdata\Asia\Kamchatka file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Karachi ..\release\tcl8.6\tzdata\Asia\Karachi file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Kashgar ..\release\tcl8.6\tzdata\Asia\Kashgar file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Kathmandu ..\release\tcl8.6\tzdata\Asia\Kathmandu file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Katmandu ..\release\tcl8.6\tzdata\Asia\Katmandu file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Khandyga ..\release\tcl8.6\tzdata\Asia\Khandyga file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Kolkata ..\release\tcl8.6\tzdata\Asia\Kolkata file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Krasnoyarsk ..\release\tcl8.6\tzdata\Asia\Krasnoyarsk file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Kuala_Lumpur ..\release\tcl8.6\tzdata\Asia\Kuala_Lumpur file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Kuching ..\release\tcl8.6\tzdata\Asia\Kuching file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Kuwait ..\release\tcl8.6\tzdata\Asia\Kuwait file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Macao ..\release\tcl8.6\tzdata\Asia\Macao file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Macau ..\release\tcl8.6\tzdata\Asia\Macau file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Magadan ..\release\tcl8.6\tzdata\Asia\Magadan file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Makassar ..\release\tcl8.6\tzdata\Asia\Makassar file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Manila ..\release\tcl8.6\tzdata\Asia\Manila file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Muscat ..\release\tcl8.6\tzdata\Asia\Muscat file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Nicosia ..\release\tcl8.6\tzdata\Asia\Nicosia file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Novokuznetsk ..\release\tcl8.6\tzdata\Asia\Novokuznetsk file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Novosibirsk ..\release\tcl8.6\tzdata\Asia\Novosibirsk file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Omsk ..\release\tcl8.6\tzdata\Asia\Omsk file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Oral ..\release\tcl8.6\tzdata\Asia\Oral file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Phnom_Penh ..\release\tcl8.6\tzdata\Asia\Phnom_Penh file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Pontianak ..\release\tcl8.6\tzdata\Asia\Pontianak file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Pyongyang ..\release\tcl8.6\tzdata\Asia\Pyongyang file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Qatar ..\release\tcl8.6\tzdata\Asia\Qatar file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Qyzylorda ..\release\tcl8.6\tzdata\Asia\Qyzylorda file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Rangoon ..\release\tcl8.6\tzdata\Asia\Rangoon file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Riyadh ..\release\tcl8.6\tzdata\Asia\Riyadh file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Saigon ..\release\tcl8.6\tzdata\Asia\Saigon file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Sakhalin ..\release\tcl8.6\tzdata\Asia\Sakhalin file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Samarkand ..\release\tcl8.6\tzdata\Asia\Samarkand file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Seoul ..\release\tcl8.6\tzdata\Asia\Seoul file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Shanghai ..\release\tcl8.6\tzdata\Asia\Shanghai file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Singapore ..\release\tcl8.6\tzdata\Asia\Singapore file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Srednekolymsk ..\release\tcl8.6\tzdata\Asia\Srednekolymsk file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Taipei ..\release\tcl8.6\tzdata\Asia\Taipei file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Tashkent ..\release\tcl8.6\tzdata\Asia\Tashkent file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Tbilisi ..\release\tcl8.6\tzdata\Asia\Tbilisi file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Tehran ..\release\tcl8.6\tzdata\Asia\Tehran file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Tel_Aviv ..\release\tcl8.6\tzdata\Asia\Tel_Aviv file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Thimbu ..\release\tcl8.6\tzdata\Asia\Thimbu file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Thimphu ..\release\tcl8.6\tzdata\Asia\Thimphu file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Tokyo ..\release\tcl8.6\tzdata\Asia\Tokyo file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Tomsk ..\release\tcl8.6\tzdata\Asia\Tomsk file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Ujung_Pandang ..\release\tcl8.6\tzdata\Asia\Ujung_Pandang file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Ulaanbaatar ..\release\tcl8.6\tzdata\Asia\Ulaanbaatar file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Ulan_Bator ..\release\tcl8.6\tzdata\Asia\Ulan_Bator file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Urumqi ..\release\tcl8.6\tzdata\Asia\Urumqi file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Ust-Nera ..\release\tcl8.6\tzdata\Asia\Ust-Nera file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Vientiane ..\release\tcl8.6\tzdata\Asia\Vientiane file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Vladivostok ..\release\tcl8.6\tzdata\Asia\Vladivostok file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Yakutsk ..\release\tcl8.6\tzdata\Asia\Yakutsk file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Yekaterinburg ..\release\tcl8.6\tzdata\Asia\Yekaterinburg file /oname=$INSTDIR\tcl8.6\tzdata\Asia\Yerevan ..\release\tcl8.6\tzdata\Asia\Yerevan file /oname=$INSTDIR\tcl8.6\tzdata\Atlantic\Azores ..\release\tcl8.6\tzdata\Atlantic\Azores file /oname=$INSTDIR\tcl8.6\tzdata\Atlantic\Bermuda ..\release\tcl8.6\tzdata\Atlantic\Bermuda file /oname=$INSTDIR\tcl8.6\tzdata\Atlantic\Canary ..\release\tcl8.6\tzdata\Atlantic\Canary file /oname=$INSTDIR\tcl8.6\tzdata\Atlantic\Cape_Verde ..\release\tcl8.6\tzdata\Atlantic\Cape_Verde file /oname=$INSTDIR\tcl8.6\tzdata\Atlantic\Faeroe ..\release\tcl8.6\tzdata\Atlantic\Faeroe file /oname=$INSTDIR\tcl8.6\tzdata\Atlantic\Faroe ..\release\tcl8.6\tzdata\Atlantic\Faroe file /oname=$INSTDIR\tcl8.6\tzdata\Atlantic\Jan_Mayen ..\release\tcl8.6\tzdata\Atlantic\Jan_Mayen file /oname=$INSTDIR\tcl8.6\tzdata\Atlantic\Madeira ..\release\tcl8.6\tzdata\Atlantic\Madeira file /oname=$INSTDIR\tcl8.6\tzdata\Atlantic\Reykjavik ..\release\tcl8.6\tzdata\Atlantic\Reykjavik file /oname=$INSTDIR\tcl8.6\tzdata\Atlantic\South_Georgia ..\release\tcl8.6\tzdata\Atlantic\South_Georgia file /oname=$INSTDIR\tcl8.6\tzdata\Atlantic\Stanley ..\release\tcl8.6\tzdata\Atlantic\Stanley file /oname=$INSTDIR\tcl8.6\tzdata\Atlantic\St_Helena ..\release\tcl8.6\tzdata\Atlantic\St_Helena file /oname=$INSTDIR\tcl8.6\tzdata\Australia\ACT ..\release\tcl8.6\tzdata\Australia\ACT file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Adelaide ..\release\tcl8.6\tzdata\Australia\Adelaide file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Brisbane ..\release\tcl8.6\tzdata\Australia\Brisbane file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Broken_Hill ..\release\tcl8.6\tzdata\Australia\Broken_Hill file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Canberra ..\release\tcl8.6\tzdata\Australia\Canberra file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Currie ..\release\tcl8.6\tzdata\Australia\Currie file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Darwin ..\release\tcl8.6\tzdata\Australia\Darwin file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Eucla ..\release\tcl8.6\tzdata\Australia\Eucla file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Hobart ..\release\tcl8.6\tzdata\Australia\Hobart file /oname=$INSTDIR\tcl8.6\tzdata\Australia\LHI ..\release\tcl8.6\tzdata\Australia\LHI file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Lindeman ..\release\tcl8.6\tzdata\Australia\Lindeman file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Lord_Howe ..\release\tcl8.6\tzdata\Australia\Lord_Howe file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Melbourne ..\release\tcl8.6\tzdata\Australia\Melbourne file /oname=$INSTDIR\tcl8.6\tzdata\Australia\North ..\release\tcl8.6\tzdata\Australia\North file /oname=$INSTDIR\tcl8.6\tzdata\Australia\NSW ..\release\tcl8.6\tzdata\Australia\NSW file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Perth ..\release\tcl8.6\tzdata\Australia\Perth file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Queensland ..\release\tcl8.6\tzdata\Australia\Queensland file /oname=$INSTDIR\tcl8.6\tzdata\Australia\South ..\release\tcl8.6\tzdata\Australia\South file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Sydney ..\release\tcl8.6\tzdata\Australia\Sydney file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Tasmania ..\release\tcl8.6\tzdata\Australia\Tasmania file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Victoria ..\release\tcl8.6\tzdata\Australia\Victoria file /oname=$INSTDIR\tcl8.6\tzdata\Australia\West ..\release\tcl8.6\tzdata\Australia\West file /oname=$INSTDIR\tcl8.6\tzdata\Australia\Yancowinna ..\release\tcl8.6\tzdata\Australia\Yancowinna file /oname=$INSTDIR\tcl8.6\tzdata\Brazil\Acre ..\release\tcl8.6\tzdata\Brazil\Acre file /oname=$INSTDIR\tcl8.6\tzdata\Brazil\DeNoronha ..\release\tcl8.6\tzdata\Brazil\DeNoronha file /oname=$INSTDIR\tcl8.6\tzdata\Brazil\East ..\release\tcl8.6\tzdata\Brazil\East file /oname=$INSTDIR\tcl8.6\tzdata\Brazil\West ..\release\tcl8.6\tzdata\Brazil\West file /oname=$INSTDIR\tcl8.6\tzdata\Canada\Atlantic ..\release\tcl8.6\tzdata\Canada\Atlantic file /oname=$INSTDIR\tcl8.6\tzdata\Canada\Central ..\release\tcl8.6\tzdata\Canada\Central file /oname=$INSTDIR\tcl8.6\tzdata\Canada\East-Saskatchewan ..\release\tcl8.6\tzdata\Canada\East-Saskatchewan file /oname=$INSTDIR\tcl8.6\tzdata\Canada\Eastern ..\release\tcl8.6\tzdata\Canada\Eastern file /oname=$INSTDIR\tcl8.6\tzdata\Canada\Mountain ..\release\tcl8.6\tzdata\Canada\Mountain file /oname=$INSTDIR\tcl8.6\tzdata\Canada\Newfoundland ..\release\tcl8.6\tzdata\Canada\Newfoundland file /oname=$INSTDIR\tcl8.6\tzdata\Canada\Pacific ..\release\tcl8.6\tzdata\Canada\Pacific file /oname=$INSTDIR\tcl8.6\tzdata\Canada\Saskatchewan ..\release\tcl8.6\tzdata\Canada\Saskatchewan file /oname=$INSTDIR\tcl8.6\tzdata\Canada\Yukon ..\release\tcl8.6\tzdata\Canada\Yukon file /oname=$INSTDIR\tcl8.6\tzdata\CET ..\release\tcl8.6\tzdata\CET file /oname=$INSTDIR\tcl8.6\tzdata\Chile\Continental ..\release\tcl8.6\tzdata\Chile\Continental file /oname=$INSTDIR\tcl8.6\tzdata\Chile\EasterIsland ..\release\tcl8.6\tzdata\Chile\EasterIsland file /oname=$INSTDIR\tcl8.6\tzdata\CST6CDT ..\release\tcl8.6\tzdata\CST6CDT file /oname=$INSTDIR\tcl8.6\tzdata\Cuba ..\release\tcl8.6\tzdata\Cuba file /oname=$INSTDIR\tcl8.6\tzdata\EET ..\release\tcl8.6\tzdata\EET file /oname=$INSTDIR\tcl8.6\tzdata\Egypt ..\release\tcl8.6\tzdata\Egypt file /oname=$INSTDIR\tcl8.6\tzdata\Eire ..\release\tcl8.6\tzdata\Eire file /oname=$INSTDIR\tcl8.6\tzdata\EST ..\release\tcl8.6\tzdata\EST file /oname=$INSTDIR\tcl8.6\tzdata\EST5EDT ..\release\tcl8.6\tzdata\EST5EDT file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT ..\release\tcl8.6\tzdata\Etc\GMT file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT+0 ..\release\tcl8.6\tzdata\Etc\GMT+0 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT+1 ..\release\tcl8.6\tzdata\Etc\GMT+1 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT+10 ..\release\tcl8.6\tzdata\Etc\GMT+10 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT+11 ..\release\tcl8.6\tzdata\Etc\GMT+11 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT+12 ..\release\tcl8.6\tzdata\Etc\GMT+12 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT+2 ..\release\tcl8.6\tzdata\Etc\GMT+2 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT+3 ..\release\tcl8.6\tzdata\Etc\GMT+3 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT+4 ..\release\tcl8.6\tzdata\Etc\GMT+4 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT+5 ..\release\tcl8.6\tzdata\Etc\GMT+5 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT+6 ..\release\tcl8.6\tzdata\Etc\GMT+6 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT+7 ..\release\tcl8.6\tzdata\Etc\GMT+7 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT+8 ..\release\tcl8.6\tzdata\Etc\GMT+8 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT+9 ..\release\tcl8.6\tzdata\Etc\GMT+9 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT-0 ..\release\tcl8.6\tzdata\Etc\GMT-0 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT-1 ..\release\tcl8.6\tzdata\Etc\GMT-1 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT-10 ..\release\tcl8.6\tzdata\Etc\GMT-10 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT-11 ..\release\tcl8.6\tzdata\Etc\GMT-11 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT-12 ..\release\tcl8.6\tzdata\Etc\GMT-12 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT-13 ..\release\tcl8.6\tzdata\Etc\GMT-13 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT-14 ..\release\tcl8.6\tzdata\Etc\GMT-14 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT-2 ..\release\tcl8.6\tzdata\Etc\GMT-2 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT-3 ..\release\tcl8.6\tzdata\Etc\GMT-3 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT-4 ..\release\tcl8.6\tzdata\Etc\GMT-4 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT-5 ..\release\tcl8.6\tzdata\Etc\GMT-5 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT-6 ..\release\tcl8.6\tzdata\Etc\GMT-6 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT-7 ..\release\tcl8.6\tzdata\Etc\GMT-7 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT-8 ..\release\tcl8.6\tzdata\Etc\GMT-8 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT-9 ..\release\tcl8.6\tzdata\Etc\GMT-9 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\GMT0 ..\release\tcl8.6\tzdata\Etc\GMT0 file /oname=$INSTDIR\tcl8.6\tzdata\Etc\Greenwich ..\release\tcl8.6\tzdata\Etc\Greenwich file /oname=$INSTDIR\tcl8.6\tzdata\Etc\UCT ..\release\tcl8.6\tzdata\Etc\UCT file /oname=$INSTDIR\tcl8.6\tzdata\Etc\Universal ..\release\tcl8.6\tzdata\Etc\Universal file /oname=$INSTDIR\tcl8.6\tzdata\Etc\UTC ..\release\tcl8.6\tzdata\Etc\UTC file /oname=$INSTDIR\tcl8.6\tzdata\Etc\Zulu ..\release\tcl8.6\tzdata\Etc\Zulu file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Amsterdam ..\release\tcl8.6\tzdata\Europe\Amsterdam file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Andorra ..\release\tcl8.6\tzdata\Europe\Andorra file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Astrakhan ..\release\tcl8.6\tzdata\Europe\Astrakhan file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Athens ..\release\tcl8.6\tzdata\Europe\Athens file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Belfast ..\release\tcl8.6\tzdata\Europe\Belfast file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Belgrade ..\release\tcl8.6\tzdata\Europe\Belgrade file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Berlin ..\release\tcl8.6\tzdata\Europe\Berlin file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Bratislava ..\release\tcl8.6\tzdata\Europe\Bratislava file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Brussels ..\release\tcl8.6\tzdata\Europe\Brussels file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Bucharest ..\release\tcl8.6\tzdata\Europe\Bucharest file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Budapest ..\release\tcl8.6\tzdata\Europe\Budapest file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Busingen ..\release\tcl8.6\tzdata\Europe\Busingen file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Chisinau ..\release\tcl8.6\tzdata\Europe\Chisinau file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Copenhagen ..\release\tcl8.6\tzdata\Europe\Copenhagen file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Dublin ..\release\tcl8.6\tzdata\Europe\Dublin file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Gibraltar ..\release\tcl8.6\tzdata\Europe\Gibraltar file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Guernsey ..\release\tcl8.6\tzdata\Europe\Guernsey file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Helsinki ..\release\tcl8.6\tzdata\Europe\Helsinki file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Isle_of_Man ..\release\tcl8.6\tzdata\Europe\Isle_of_Man file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Istanbul ..\release\tcl8.6\tzdata\Europe\Istanbul file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Jersey ..\release\tcl8.6\tzdata\Europe\Jersey file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Kaliningrad ..\release\tcl8.6\tzdata\Europe\Kaliningrad file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Kiev ..\release\tcl8.6\tzdata\Europe\Kiev file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Kirov ..\release\tcl8.6\tzdata\Europe\Kirov file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Lisbon ..\release\tcl8.6\tzdata\Europe\Lisbon file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Ljubljana ..\release\tcl8.6\tzdata\Europe\Ljubljana file /oname=$INSTDIR\tcl8.6\tzdata\Europe\London ..\release\tcl8.6\tzdata\Europe\London file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Luxembourg ..\release\tcl8.6\tzdata\Europe\Luxembourg file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Madrid ..\release\tcl8.6\tzdata\Europe\Madrid file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Malta ..\release\tcl8.6\tzdata\Europe\Malta file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Mariehamn ..\release\tcl8.6\tzdata\Europe\Mariehamn file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Minsk ..\release\tcl8.6\tzdata\Europe\Minsk file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Monaco ..\release\tcl8.6\tzdata\Europe\Monaco file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Moscow ..\release\tcl8.6\tzdata\Europe\Moscow file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Nicosia ..\release\tcl8.6\tzdata\Europe\Nicosia file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Oslo ..\release\tcl8.6\tzdata\Europe\Oslo file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Paris ..\release\tcl8.6\tzdata\Europe\Paris file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Podgorica ..\release\tcl8.6\tzdata\Europe\Podgorica file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Prague ..\release\tcl8.6\tzdata\Europe\Prague file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Riga ..\release\tcl8.6\tzdata\Europe\Riga file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Rome ..\release\tcl8.6\tzdata\Europe\Rome file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Samara ..\release\tcl8.6\tzdata\Europe\Samara file /oname=$INSTDIR\tcl8.6\tzdata\Europe\San_Marino ..\release\tcl8.6\tzdata\Europe\San_Marino file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Sarajevo ..\release\tcl8.6\tzdata\Europe\Sarajevo file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Simferopol ..\release\tcl8.6\tzdata\Europe\Simferopol file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Skopje ..\release\tcl8.6\tzdata\Europe\Skopje file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Sofia ..\release\tcl8.6\tzdata\Europe\Sofia file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Stockholm ..\release\tcl8.6\tzdata\Europe\Stockholm file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Tallinn ..\release\tcl8.6\tzdata\Europe\Tallinn file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Tirane ..\release\tcl8.6\tzdata\Europe\Tirane file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Tiraspol ..\release\tcl8.6\tzdata\Europe\Tiraspol file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Ulyanovsk ..\release\tcl8.6\tzdata\Europe\Ulyanovsk file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Uzhgorod ..\release\tcl8.6\tzdata\Europe\Uzhgorod file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Vaduz ..\release\tcl8.6\tzdata\Europe\Vaduz file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Vatican ..\release\tcl8.6\tzdata\Europe\Vatican file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Vienna ..\release\tcl8.6\tzdata\Europe\Vienna file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Vilnius ..\release\tcl8.6\tzdata\Europe\Vilnius file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Volgograd ..\release\tcl8.6\tzdata\Europe\Volgograd file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Warsaw ..\release\tcl8.6\tzdata\Europe\Warsaw file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Zagreb ..\release\tcl8.6\tzdata\Europe\Zagreb file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Zaporozhye ..\release\tcl8.6\tzdata\Europe\Zaporozhye file /oname=$INSTDIR\tcl8.6\tzdata\Europe\Zurich ..\release\tcl8.6\tzdata\Europe\Zurich file /oname=$INSTDIR\tcl8.6\tzdata\GB ..\release\tcl8.6\tzdata\GB file /oname=$INSTDIR\tcl8.6\tzdata\GB-Eire ..\release\tcl8.6\tzdata\GB-Eire file /oname=$INSTDIR\tcl8.6\tzdata\GMT ..\release\tcl8.6\tzdata\GMT file /oname=$INSTDIR\tcl8.6\tzdata\GMT+0 ..\release\tcl8.6\tzdata\GMT+0 file /oname=$INSTDIR\tcl8.6\tzdata\GMT-0 ..\release\tcl8.6\tzdata\GMT-0 file /oname=$INSTDIR\tcl8.6\tzdata\GMT0 ..\release\tcl8.6\tzdata\GMT0 file /oname=$INSTDIR\tcl8.6\tzdata\Greenwich ..\release\tcl8.6\tzdata\Greenwich file /oname=$INSTDIR\tcl8.6\tzdata\Hongkong ..\release\tcl8.6\tzdata\Hongkong file /oname=$INSTDIR\tcl8.6\tzdata\HST ..\release\tcl8.6\tzdata\HST file /oname=$INSTDIR\tcl8.6\tzdata\Iceland ..\release\tcl8.6\tzdata\Iceland file /oname=$INSTDIR\tcl8.6\tzdata\Indian\Antananarivo ..\release\tcl8.6\tzdata\Indian\Antananarivo file /oname=$INSTDIR\tcl8.6\tzdata\Indian\Chagos ..\release\tcl8.6\tzdata\Indian\Chagos file /oname=$INSTDIR\tcl8.6\tzdata\Indian\Christmas ..\release\tcl8.6\tzdata\Indian\Christmas file /oname=$INSTDIR\tcl8.6\tzdata\Indian\Cocos ..\release\tcl8.6\tzdata\Indian\Cocos file /oname=$INSTDIR\tcl8.6\tzdata\Indian\Comoro ..\release\tcl8.6\tzdata\Indian\Comoro file /oname=$INSTDIR\tcl8.6\tzdata\Indian\Kerguelen ..\release\tcl8.6\tzdata\Indian\Kerguelen file /oname=$INSTDIR\tcl8.6\tzdata\Indian\Mahe ..\release\tcl8.6\tzdata\Indian\Mahe file /oname=$INSTDIR\tcl8.6\tzdata\Indian\Maldives ..\release\tcl8.6\tzdata\Indian\Maldives file /oname=$INSTDIR\tcl8.6\tzdata\Indian\Mauritius ..\release\tcl8.6\tzdata\Indian\Mauritius file /oname=$INSTDIR\tcl8.6\tzdata\Indian\Mayotte ..\release\tcl8.6\tzdata\Indian\Mayotte file /oname=$INSTDIR\tcl8.6\tzdata\Indian\Reunion ..\release\tcl8.6\tzdata\Indian\Reunion file /oname=$INSTDIR\tcl8.6\tzdata\Iran ..\release\tcl8.6\tzdata\Iran file /oname=$INSTDIR\tcl8.6\tzdata\Israel ..\release\tcl8.6\tzdata\Israel file /oname=$INSTDIR\tcl8.6\tzdata\Jamaica ..\release\tcl8.6\tzdata\Jamaica file /oname=$INSTDIR\tcl8.6\tzdata\Japan ..\release\tcl8.6\tzdata\Japan file /oname=$INSTDIR\tcl8.6\tzdata\Kwajalein ..\release\tcl8.6\tzdata\Kwajalein file /oname=$INSTDIR\tcl8.6\tzdata\Libya ..\release\tcl8.6\tzdata\Libya file /oname=$INSTDIR\tcl8.6\tzdata\MET ..\release\tcl8.6\tzdata\MET file /oname=$INSTDIR\tcl8.6\tzdata\Mexico\BajaNorte ..\release\tcl8.6\tzdata\Mexico\BajaNorte file /oname=$INSTDIR\tcl8.6\tzdata\Mexico\BajaSur ..\release\tcl8.6\tzdata\Mexico\BajaSur file /oname=$INSTDIR\tcl8.6\tzdata\Mexico\General ..\release\tcl8.6\tzdata\Mexico\General file /oname=$INSTDIR\tcl8.6\tzdata\MST ..\release\tcl8.6\tzdata\MST file /oname=$INSTDIR\tcl8.6\tzdata\MST7MDT ..\release\tcl8.6\tzdata\MST7MDT file /oname=$INSTDIR\tcl8.6\tzdata\Navajo ..\release\tcl8.6\tzdata\Navajo file /oname=$INSTDIR\tcl8.6\tzdata\NZ ..\release\tcl8.6\tzdata\NZ file /oname=$INSTDIR\tcl8.6\tzdata\NZ-CHAT ..\release\tcl8.6\tzdata\NZ-CHAT file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Apia ..\release\tcl8.6\tzdata\Pacific\Apia file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Auckland ..\release\tcl8.6\tzdata\Pacific\Auckland file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Bougainville ..\release\tcl8.6\tzdata\Pacific\Bougainville file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Chatham ..\release\tcl8.6\tzdata\Pacific\Chatham file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Chuuk ..\release\tcl8.6\tzdata\Pacific\Chuuk file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Easter ..\release\tcl8.6\tzdata\Pacific\Easter file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Efate ..\release\tcl8.6\tzdata\Pacific\Efate file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Enderbury ..\release\tcl8.6\tzdata\Pacific\Enderbury file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Fakaofo ..\release\tcl8.6\tzdata\Pacific\Fakaofo file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Fiji ..\release\tcl8.6\tzdata\Pacific\Fiji file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Funafuti ..\release\tcl8.6\tzdata\Pacific\Funafuti file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Galapagos ..\release\tcl8.6\tzdata\Pacific\Galapagos file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Gambier ..\release\tcl8.6\tzdata\Pacific\Gambier file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Guadalcanal ..\release\tcl8.6\tzdata\Pacific\Guadalcanal file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Guam ..\release\tcl8.6\tzdata\Pacific\Guam file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Honolulu ..\release\tcl8.6\tzdata\Pacific\Honolulu file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Johnston ..\release\tcl8.6\tzdata\Pacific\Johnston file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Kiritimati ..\release\tcl8.6\tzdata\Pacific\Kiritimati file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Kosrae ..\release\tcl8.6\tzdata\Pacific\Kosrae file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Kwajalein ..\release\tcl8.6\tzdata\Pacific\Kwajalein file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Majuro ..\release\tcl8.6\tzdata\Pacific\Majuro file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Marquesas ..\release\tcl8.6\tzdata\Pacific\Marquesas file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Midway ..\release\tcl8.6\tzdata\Pacific\Midway file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Nauru ..\release\tcl8.6\tzdata\Pacific\Nauru file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Niue ..\release\tcl8.6\tzdata\Pacific\Niue file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Norfolk ..\release\tcl8.6\tzdata\Pacific\Norfolk file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Noumea ..\release\tcl8.6\tzdata\Pacific\Noumea file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Pago_Pago ..\release\tcl8.6\tzdata\Pacific\Pago_Pago file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Palau ..\release\tcl8.6\tzdata\Pacific\Palau file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Pitcairn ..\release\tcl8.6\tzdata\Pacific\Pitcairn file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Pohnpei ..\release\tcl8.6\tzdata\Pacific\Pohnpei file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Ponape ..\release\tcl8.6\tzdata\Pacific\Ponape file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Port_Moresby ..\release\tcl8.6\tzdata\Pacific\Port_Moresby file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Rarotonga ..\release\tcl8.6\tzdata\Pacific\Rarotonga file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Saipan ..\release\tcl8.6\tzdata\Pacific\Saipan file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Samoa ..\release\tcl8.6\tzdata\Pacific\Samoa file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Tahiti ..\release\tcl8.6\tzdata\Pacific\Tahiti file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Tarawa ..\release\tcl8.6\tzdata\Pacific\Tarawa file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Tongatapu ..\release\tcl8.6\tzdata\Pacific\Tongatapu file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Truk ..\release\tcl8.6\tzdata\Pacific\Truk file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Wake ..\release\tcl8.6\tzdata\Pacific\Wake file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Wallis ..\release\tcl8.6\tzdata\Pacific\Wallis file /oname=$INSTDIR\tcl8.6\tzdata\Pacific\Yap ..\release\tcl8.6\tzdata\Pacific\Yap file /oname=$INSTDIR\tcl8.6\tzdata\Poland ..\release\tcl8.6\tzdata\Poland file /oname=$INSTDIR\tcl8.6\tzdata\Portugal ..\release\tcl8.6\tzdata\Portugal file /oname=$INSTDIR\tcl8.6\tzdata\PRC ..\release\tcl8.6\tzdata\PRC file /oname=$INSTDIR\tcl8.6\tzdata\PST8PDT ..\release\tcl8.6\tzdata\PST8PDT file /oname=$INSTDIR\tcl8.6\tzdata\ROC ..\release\tcl8.6\tzdata\ROC file /oname=$INSTDIR\tcl8.6\tzdata\ROK ..\release\tcl8.6\tzdata\ROK file /oname=$INSTDIR\tcl8.6\tzdata\Singapore ..\release\tcl8.6\tzdata\Singapore file /oname=$INSTDIR\tcl8.6\tzdata\SystemV\AST4 ..\release\tcl8.6\tzdata\SystemV\AST4 file /oname=$INSTDIR\tcl8.6\tzdata\SystemV\AST4ADT ..\release\tcl8.6\tzdata\SystemV\AST4ADT file /oname=$INSTDIR\tcl8.6\tzdata\SystemV\CST6 ..\release\tcl8.6\tzdata\SystemV\CST6 file /oname=$INSTDIR\tcl8.6\tzdata\SystemV\CST6CDT ..\release\tcl8.6\tzdata\SystemV\CST6CDT file /oname=$INSTDIR\tcl8.6\tzdata\SystemV\EST5 ..\release\tcl8.6\tzdata\SystemV\EST5 file /oname=$INSTDIR\tcl8.6\tzdata\SystemV\EST5EDT ..\release\tcl8.6\tzdata\SystemV\EST5EDT file /oname=$INSTDIR\tcl8.6\tzdata\SystemV\HST10 ..\release\tcl8.6\tzdata\SystemV\HST10 file /oname=$INSTDIR\tcl8.6\tzdata\SystemV\MST7 ..\release\tcl8.6\tzdata\SystemV\MST7 file /oname=$INSTDIR\tcl8.6\tzdata\SystemV\MST7MDT ..\release\tcl8.6\tzdata\SystemV\MST7MDT file /oname=$INSTDIR\tcl8.6\tzdata\SystemV\PST8 ..\release\tcl8.6\tzdata\SystemV\PST8 file /oname=$INSTDIR\tcl8.6\tzdata\SystemV\PST8PDT ..\release\tcl8.6\tzdata\SystemV\PST8PDT file /oname=$INSTDIR\tcl8.6\tzdata\SystemV\YST9 ..\release\tcl8.6\tzdata\SystemV\YST9 file /oname=$INSTDIR\tcl8.6\tzdata\SystemV\YST9YDT ..\release\tcl8.6\tzdata\SystemV\YST9YDT file /oname=$INSTDIR\tcl8.6\tzdata\Turkey ..\release\tcl8.6\tzdata\Turkey file /oname=$INSTDIR\tcl8.6\tzdata\UCT ..\release\tcl8.6\tzdata\UCT file /oname=$INSTDIR\tcl8.6\tzdata\Universal ..\release\tcl8.6\tzdata\Universal file /oname=$INSTDIR\tcl8.6\tzdata\US\Alaska ..\release\tcl8.6\tzdata\US\Alaska file /oname=$INSTDIR\tcl8.6\tzdata\US\Aleutian ..\release\tcl8.6\tzdata\US\Aleutian file /oname=$INSTDIR\tcl8.6\tzdata\US\Arizona ..\release\tcl8.6\tzdata\US\Arizona file /oname=$INSTDIR\tcl8.6\tzdata\US\Central ..\release\tcl8.6\tzdata\US\Central file /oname=$INSTDIR\tcl8.6\tzdata\US\East-Indiana ..\release\tcl8.6\tzdata\US\East-Indiana file /oname=$INSTDIR\tcl8.6\tzdata\US\Eastern ..\release\tcl8.6\tzdata\US\Eastern file /oname=$INSTDIR\tcl8.6\tzdata\US\Hawaii ..\release\tcl8.6\tzdata\US\Hawaii file /oname=$INSTDIR\tcl8.6\tzdata\US\Indiana-Starke ..\release\tcl8.6\tzdata\US\Indiana-Starke file /oname=$INSTDIR\tcl8.6\tzdata\US\Michigan ..\release\tcl8.6\tzdata\US\Michigan file /oname=$INSTDIR\tcl8.6\tzdata\US\Mountain ..\release\tcl8.6\tzdata\US\Mountain file /oname=$INSTDIR\tcl8.6\tzdata\US\Pacific ..\release\tcl8.6\tzdata\US\Pacific file /oname=$INSTDIR\tcl8.6\tzdata\US\Pacific-New ..\release\tcl8.6\tzdata\US\Pacific-New file /oname=$INSTDIR\tcl8.6\tzdata\US\Samoa ..\release\tcl8.6\tzdata\US\Samoa file /oname=$INSTDIR\tcl8.6\tzdata\UTC ..\release\tcl8.6\tzdata\UTC file /oname=$INSTDIR\tcl8.6\tzdata\W-SU ..\release\tcl8.6\tzdata\W-SU file /oname=$INSTDIR\tcl8.6\tzdata\WET ..\release\tcl8.6\tzdata\WET file /oname=$INSTDIR\tcl8.6\tzdata\Zulu ..\release\tcl8.6\tzdata\Zulu file /oname=$INSTDIR\tcl8.6\word.tcl ..\release\tcl8.6\word.tcl file /oname=$INSTDIR\tk8.6\bgerror.tcl ..\release\tk8.6\bgerror.tcl file /oname=$INSTDIR\tk8.6\button.tcl ..\release\tk8.6\button.tcl file /oname=$INSTDIR\tk8.6\choosedir.tcl ..\release\tk8.6\choosedir.tcl file /oname=$INSTDIR\tk8.6\clrpick.tcl ..\release\tk8.6\clrpick.tcl file /oname=$INSTDIR\tk8.6\comdlg.tcl ..\release\tk8.6\comdlg.tcl file /oname=$INSTDIR\tk8.6\console.tcl ..\release\tk8.6\console.tcl file /oname=$INSTDIR\tk8.6\dialog.tcl ..\release\tk8.6\dialog.tcl file /oname=$INSTDIR\tk8.6\entry.tcl ..\release\tk8.6\entry.tcl file /oname=$INSTDIR\tk8.6\focus.tcl ..\release\tk8.6\focus.tcl file /oname=$INSTDIR\tk8.6\fontchooser.tcl ..\release\tk8.6\fontchooser.tcl file /oname=$INSTDIR\tk8.6\iconlist.tcl ..\release\tk8.6\iconlist.tcl file /oname=$INSTDIR\tk8.6\icons.tcl ..\release\tk8.6\icons.tcl file /oname=$INSTDIR\tk8.6\images\logo.eps ..\release\tk8.6\images\logo.eps file /oname=$INSTDIR\tk8.6\images\logo100.gif ..\release\tk8.6\images\logo100.gif file /oname=$INSTDIR\tk8.6\images\logo64.gif ..\release\tk8.6\images\logo64.gif file /oname=$INSTDIR\tk8.6\images\logoLarge.gif ..\release\tk8.6\images\logoLarge.gif file /oname=$INSTDIR\tk8.6\images\logoMed.gif ..\release\tk8.6\images\logoMed.gif file /oname=$INSTDIR\tk8.6\images\pwrdLogo.eps ..\release\tk8.6\images\pwrdLogo.eps file /oname=$INSTDIR\tk8.6\images\pwrdLogo100.gif ..\release\tk8.6\images\pwrdLogo100.gif file /oname=$INSTDIR\tk8.6\images\pwrdLogo150.gif ..\release\tk8.6\images\pwrdLogo150.gif file /oname=$INSTDIR\tk8.6\images\pwrdLogo175.gif ..\release\tk8.6\images\pwrdLogo175.gif file /oname=$INSTDIR\tk8.6\images\pwrdLogo200.gif ..\release\tk8.6\images\pwrdLogo200.gif file /oname=$INSTDIR\tk8.6\images\pwrdLogo75.gif ..\release\tk8.6\images\pwrdLogo75.gif file /oname=$INSTDIR\tk8.6\images\README ..\release\tk8.6\images\README file /oname=$INSTDIR\tk8.6\images\tai-ku.gif ..\release\tk8.6\images\tai-ku.gif file /oname=$INSTDIR\tk8.6\listbox.tcl ..\release\tk8.6\listbox.tcl file /oname=$INSTDIR\tk8.6\megawidget.tcl ..\release\tk8.6\megawidget.tcl file /oname=$INSTDIR\tk8.6\menu.tcl ..\release\tk8.6\menu.tcl file /oname=$INSTDIR\tk8.6\mkpsenc.tcl ..\release\tk8.6\mkpsenc.tcl file /oname=$INSTDIR\tk8.6\msgbox.tcl ..\release\tk8.6\msgbox.tcl file /oname=$INSTDIR\tk8.6\msgs\cs.msg ..\release\tk8.6\msgs\cs.msg file /oname=$INSTDIR\tk8.6\msgs\da.msg ..\release\tk8.6\msgs\da.msg file /oname=$INSTDIR\tk8.6\msgs\de.msg ..\release\tk8.6\msgs\de.msg file /oname=$INSTDIR\tk8.6\msgs\el.msg ..\release\tk8.6\msgs\el.msg file /oname=$INSTDIR\tk8.6\msgs\en.msg ..\release\tk8.6\msgs\en.msg file /oname=$INSTDIR\tk8.6\msgs\en_gb.msg ..\release\tk8.6\msgs\en_gb.msg file /oname=$INSTDIR\tk8.6\msgs\eo.msg ..\release\tk8.6\msgs\eo.msg file /oname=$INSTDIR\tk8.6\msgs\es.msg ..\release\tk8.6\msgs\es.msg file /oname=$INSTDIR\tk8.6\msgs\fr.msg ..\release\tk8.6\msgs\fr.msg file /oname=$INSTDIR\tk8.6\msgs\hu.msg ..\release\tk8.6\msgs\hu.msg file /oname=$INSTDIR\tk8.6\msgs\it.msg ..\release\tk8.6\msgs\it.msg file /oname=$INSTDIR\tk8.6\msgs\nl.msg ..\release\tk8.6\msgs\nl.msg file /oname=$INSTDIR\tk8.6\msgs\pl.msg ..\release\tk8.6\msgs\pl.msg file /oname=$INSTDIR\tk8.6\msgs\pt.msg ..\release\tk8.6\msgs\pt.msg file /oname=$INSTDIR\tk8.6\msgs\ru.msg ..\release\tk8.6\msgs\ru.msg file /oname=$INSTDIR\tk8.6\msgs\sv.msg ..\release\tk8.6\msgs\sv.msg file /oname=$INSTDIR\tk8.6\obsolete.tcl ..\release\tk8.6\obsolete.tcl file /oname=$INSTDIR\tk8.6\optMenu.tcl ..\release\tk8.6\optMenu.tcl file /oname=$INSTDIR\tk8.6\palette.tcl ..\release\tk8.6\palette.tcl file /oname=$INSTDIR\tk8.6\panedwindow.tcl ..\release\tk8.6\panedwindow.tcl file /oname=$INSTDIR\tk8.6\pkgIndex.tcl ..\release\tk8.6\pkgIndex.tcl file /oname=$INSTDIR\tk8.6\safetk.tcl ..\release\tk8.6\safetk.tcl file /oname=$INSTDIR\tk8.6\scale.tcl ..\release\tk8.6\scale.tcl file /oname=$INSTDIR\tk8.6\scrlbar.tcl ..\release\tk8.6\scrlbar.tcl file /oname=$INSTDIR\tk8.6\spinbox.tcl ..\release\tk8.6\spinbox.tcl file /oname=$INSTDIR\tk8.6\tclIndex ..\release\tk8.6\tclIndex file /oname=$INSTDIR\tk8.6\tearoff.tcl ..\release\tk8.6\tearoff.tcl file /oname=$INSTDIR\tk8.6\text.tcl ..\release\tk8.6\text.tcl file /oname=$INSTDIR\tk8.6\tk.tcl ..\release\tk8.6\tk.tcl file /oname=$INSTDIR\tk8.6\tkAppInit.c ..\release\tk8.6\tkAppInit.c file /oname=$INSTDIR\tk8.6\tkfbox.tcl ..\release\tk8.6\tkfbox.tcl file /oname=$INSTDIR\tk8.6\ttk\altTheme.tcl ..\release\tk8.6\ttk\altTheme.tcl file /oname=$INSTDIR\tk8.6\ttk\aquaTheme.tcl ..\release\tk8.6\ttk\aquaTheme.tcl file /oname=$INSTDIR\tk8.6\ttk\button.tcl ..\release\tk8.6\ttk\button.tcl file /oname=$INSTDIR\tk8.6\ttk\clamTheme.tcl ..\release\tk8.6\ttk\clamTheme.tcl file /oname=$INSTDIR\tk8.6\ttk\classicTheme.tcl ..\release\tk8.6\ttk\classicTheme.tcl file /oname=$INSTDIR\tk8.6\ttk\combobox.tcl ..\release\tk8.6\ttk\combobox.tcl file /oname=$INSTDIR\tk8.6\ttk\cursors.tcl ..\release\tk8.6\ttk\cursors.tcl file /oname=$INSTDIR\tk8.6\ttk\defaults.tcl ..\release\tk8.6\ttk\defaults.tcl file /oname=$INSTDIR\tk8.6\ttk\entry.tcl ..\release\tk8.6\ttk\entry.tcl file /oname=$INSTDIR\tk8.6\ttk\fonts.tcl ..\release\tk8.6\ttk\fonts.tcl file /oname=$INSTDIR\tk8.6\ttk\menubutton.tcl ..\release\tk8.6\ttk\menubutton.tcl file /oname=$INSTDIR\tk8.6\ttk\notebook.tcl ..\release\tk8.6\ttk\notebook.tcl file /oname=$INSTDIR\tk8.6\ttk\panedwindow.tcl ..\release\tk8.6\ttk\panedwindow.tcl file /oname=$INSTDIR\tk8.6\ttk\progress.tcl ..\release\tk8.6\ttk\progress.tcl file /oname=$INSTDIR\tk8.6\ttk\scale.tcl ..\release\tk8.6\ttk\scale.tcl file /oname=$INSTDIR\tk8.6\ttk\scrollbar.tcl ..\release\tk8.6\ttk\scrollbar.tcl file /oname=$INSTDIR\tk8.6\ttk\sizegrip.tcl ..\release\tk8.6\ttk\sizegrip.tcl file /oname=$INSTDIR\tk8.6\ttk\spinbox.tcl ..\release\tk8.6\ttk\spinbox.tcl file /oname=$INSTDIR\tk8.6\ttk\treeview.tcl ..\release\tk8.6\ttk\treeview.tcl file /oname=$INSTDIR\tk8.6\ttk\ttk.tcl ..\release\tk8.6\ttk\ttk.tcl file /oname=$INSTDIR\tk8.6\ttk\utils.tcl ..\release\tk8.6\ttk\utils.tcl file /oname=$INSTDIR\tk8.6\ttk\vistaTheme.tcl ..\release\tk8.6\ttk\vistaTheme.tcl file /oname=$INSTDIR\tk8.6\ttk\winTheme.tcl ..\release\tk8.6\ttk\winTheme.tcl file /oname=$INSTDIR\tk8.6\ttk\xpTheme.tcl ..\release\tk8.6\ttk\xpTheme.tcl file /oname=$INSTDIR\tk8.6\unsupported.tcl ..\release\tk8.6\unsupported.tcl file /oname=$INSTDIR\tk8.6\xmfbox.tcl ..\release\tk8.6\xmfbox.tcl file /oname=$INSTDIR\zlib1.dll ..\release\zlib1.dll file /oname=$INSTDIR\tcl86.dll ..\release\tcl86.dll file /oname=$INSTDIR\tk86.dll ..\release\tk86.dll file /oname=$INSTDIR\tcl8\8.4\platform\shell-1.1.4.tm ..\release\tcl8\8.4\platform\shell-1.1.4.tm file /oname=$INSTDIR\tcl8\8.4\platform-1.0.14.tm ..\release\tcl8\8.4\platform-1.0.14.tm file /oname=$INSTDIR\tcl8\8.5\msgcat-1.6.0.tm ..\release\tcl8\8.5\msgcat-1.6.0.tm file /oname=$INSTDIR\tcl8\8.5\tcltest-2.4.0.tm ..\release\tcl8\8.5\tcltest-2.4.0.tm file /oname=$INSTDIR\tcl8\8.6\http-2.8.9.tm ..\release\tcl8\8.6\http-2.8.9.tm file /oname=$INSTDIR\tcl8\8.6\tdbc\sqlite3-1.0.4.tm ..\release\tcl8\8.6\tdbc\sqlite3-1.0.4.tm # end of TCL-related files and directories WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Classified-ads" "DisplayName" "Classified-ads (remove only)" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Classified-ads" "UninstallString" "$INSTDIR\Uninstall.exe" DetailPrint "Register Classified Ad profile URI Handler" DeleteRegKey HKCR "caprofile" WriteRegStr HKCR "caprofile" "" "URL:caprofile" WriteRegStr HKCR "caprofile" "URL Protocol" "" WriteRegStr HKCR "caprofile\DefaultIcon" "" "$INSTDIR\classified-ads.exe" WriteRegStr HKCR "caprofile\shell" "" "" WriteRegStr HKCR "caprofile\shell\Open" "" "" WriteRegStr HKCR "caprofile\shell\Open\command" "" "$INSTDIR\classified-ads.exe %l" DetailPrint "Register Classified Ad ad URI Handler" DeleteRegKey HKCR "caad" WriteRegStr HKCR "caad" "" "URL:caad" WriteRegStr HKCR "caad" "URL Protocol" "" WriteRegStr HKCR "caad\DefaultIcon" "" "$INSTDIR\classified-ads.exe" WriteRegStr HKCR "caad\shell" "" "" WriteRegStr HKCR "caad\shell\Open" "" "" WriteRegStr HKCR "caad\shell\Open\command" "" "$INSTDIR\classified-ads.exe %l" DetailPrint "Register Classified Ad comment URI Handler" DeleteRegKey HKCR "cacomment" WriteRegStr HKCR "cacomment" "" "URL:cacomment" WriteRegStr HKCR "cacomment" "URL Protocol" "" WriteRegStr HKCR "cacomment\DefaultIcon" "" "$INSTDIR\classified-ads.exe" WriteRegStr HKCR "cacomment\shell" "" "" WriteRegStr HKCR "cacomment\shell\Open" "" "" WriteRegStr HKCR "cacomment\shell\Open\command" "" "$INSTDIR\classified-ads.exe %l" DetailPrint "Register Classified Ad blob URI Handler" DeleteRegKey HKCR "cablob" WriteRegStr HKCR "cablob" "" "URL:cablob" WriteRegStr HKCR "cablob" "URL Protocol" "" WriteRegStr HKCR "cablob\DefaultIcon" "" "$INSTDIR\classified-ads.exe" WriteRegStr HKCR "cablob\shell" "" "" WriteRegStr HKCR "cablob\shell\Open" "" "" WriteRegStr HKCR "cablob\shell\Open\command" "" "$INSTDIR\classified-ads.exe %l" sectionEnd # # uninstaller section start section "uninstall" SetShellVarContext all # first, delete the uninstaller delete "$INSTDIR\uninstall.exe" # second, remove the link from the start menu delete "$SMPROGRAMS\Classified-ads\uninstall.lnk" delete "$SMPROGRAMS\Classified-ads\Classified-ads.lnk" RMDIR "$SMPROGRAMS\Classified-ads" delete "$INSTDIR\classified-ads.exe" delete "$INSTDIR\qt_ca.qm" delete "$INSTDIR\qt_cs.qm" delete "$INSTDIR\qt_de.qm" delete "$INSTDIR\qt_fi.qm" delete "$INSTDIR\qt_hu.qm" delete "$INSTDIR\qt_it.qm" delete "$INSTDIR\qt_ja.qm" delete "$INSTDIR\qt_lv.qm" delete "$INSTDIR\qt_ru.qm" delete "$INSTDIR\qt_sk.qm" delete "$INSTDIR\qt_uk.qm" delete "$INSTDIR\examples\sysinfo.tcl" delete "$INSTDIR\examples\luikero.tcl" delete "$INSTDIR\examples\calendar.tcl" RMDIR "$INSTDIR\examples" delete "$INSTDIR\D3Dcompiler_47.dll" delete "$INSTDIR\libEGL.dll" delete "$INSTDIR\libGLESV2.dll" delete "$INSTDIR\libgcc_s_dw2-1.dll" delete "$INSTDIR\libstdc++-6.dll" delete "$INSTDIR\libwinpthread-1.dll" delete "$INSTDIR\opengl32sw.dll" delete "$INSTDIR\Qt5Multimedia.dll" delete "$INSTDIR\Qt5Core.dll" delete "$INSTDIR\Qt5Gui.dll" delete "$INSTDIR\Qt5Network.dll" delete "$INSTDIR\Qt5PrintSupport.dll" delete "$INSTDIR\Qt5Sql.dll" delete "$INSTDIR\Qt5Svg.dll" delete "$INSTDIR\Qt5Widgets.dll" delete "$INSTDIR\LICENSE" delete "$INSTDIR\bearer\qgenericbearer.dll" delete "$INSTDIR\bearer\qnativewifibearer.dll" delete "$INSTDIR\iconengines\qsvgicon.dll" delete "$INSTDIR\imageformats\qdds.dll" delete "$INSTDIR\imageformats\qgif.dll" delete "$INSTDIR\imageformats\qicns.dll" delete "$INSTDIR\imageformats\qico.dll" delete "$INSTDIR\imageformats\qjp2.dll" delete "$INSTDIR\imageformats\qjpeg.dll" delete "$INSTDIR\imageformats\qmng.dll" delete "$INSTDIR\imageformats\qsvg.dll" delete "$INSTDIR\imageformats\qtga.dll" delete "$INSTDIR\imageformats\qtiff.dll" delete "$INSTDIR\imageformats\qwbmp.dll" delete "$INSTDIR\imageformats\qwebp.dll" delete "$INSTDIR\platforms\qwindows.dll" delete "$INSTDIR\printsupport\windowsprintersupport.dll" delete "$INSTDIR\sqldrivers\qsqlite.dll" delete "$INSTDIR\audio\qtaudio_windows.dll" delete "$INSTDIR\libeay32.dll" delete "$INSTDIR\ssleay32.dll" delete "$INSTDIR\miniupnpc.dll" delete "$INSTDIR\libiconv-2.dll" delete "$INSTDIR\libintl-8.dll" delete "$INSTDIR\fi\LC_MESSAGES\classified-ads.mo" delete "$INSTDIR\sv\LC_MESSAGES\classified-ads.mo" delete "$INSTDIR\da\LC_MESSAGES\classified-ads.mo" delete "$INSTDIR\uk\LC_MESSAGES\classified-ads.mo" delete "$INSTDIR\de\LC_MESSAGES\classified-ads.mo" delete "$INSTDIR\es\LC_MESSAGES\classified-ads.mo" RMDIR "$INSTDIR\sv\LC_MESSAGES" RMDIR "$INSTDIR\sv" RMDIR "$INSTDIR\fi\LC_MESSAGES" RMDIR "$INSTDIR\fi" RMDIR "$INSTDIR\da\LC_MESSAGES" RMDIR "$INSTDIR\da" RMDIR "$INSTDIR\uk\LC_MESSAGES" RMDIR "$INSTDIR\uk" RMDIR "$INSTDIR\de\LC_MESSAGES" RMDIR "$INSTDIR\de" RMDIR "$INSTDIR\es\LC_MESSAGES" RMDIR "$INSTDIR\es" RMDIR "$INSTDIR\bearer" RMDIR "$INSTDIR\iconengines" RMDIR "$INSTDIR\imageformats" RMDIR "$INSTDIR\printsupport" RMDIR "$INSTDIR\platforms" RMDIR "$INSTDIR\sqldrivers" RMDIR "$INSTDIR\audio" # # Removal of TCL-related files and directories # # files first delete "$INSTDIR\tcl8.6\auto.tcl" delete "$INSTDIR\tcl8.6\clock.tcl" delete "$INSTDIR\tcl8.6\encoding\ascii.enc" delete "$INSTDIR\tcl8.6\encoding\big5.enc" delete "$INSTDIR\tcl8.6\encoding\cp1250.enc" delete "$INSTDIR\tcl8.6\encoding\cp1251.enc" delete "$INSTDIR\tcl8.6\encoding\cp1252.enc" delete "$INSTDIR\tcl8.6\encoding\cp1253.enc" delete "$INSTDIR\tcl8.6\encoding\cp1254.enc" delete "$INSTDIR\tcl8.6\encoding\cp1255.enc" delete "$INSTDIR\tcl8.6\encoding\cp1256.enc" delete "$INSTDIR\tcl8.6\encoding\cp1257.enc" delete "$INSTDIR\tcl8.6\encoding\cp1258.enc" delete "$INSTDIR\tcl8.6\encoding\cp437.enc" delete "$INSTDIR\tcl8.6\encoding\cp737.enc" delete "$INSTDIR\tcl8.6\encoding\cp775.enc" delete "$INSTDIR\tcl8.6\encoding\cp850.enc" delete "$INSTDIR\tcl8.6\encoding\cp852.enc" delete "$INSTDIR\tcl8.6\encoding\cp855.enc" delete "$INSTDIR\tcl8.6\encoding\cp857.enc" delete "$INSTDIR\tcl8.6\encoding\cp860.enc" delete "$INSTDIR\tcl8.6\encoding\cp861.enc" delete "$INSTDIR\tcl8.6\encoding\cp862.enc" delete "$INSTDIR\tcl8.6\encoding\cp863.enc" delete "$INSTDIR\tcl8.6\encoding\cp864.enc" delete "$INSTDIR\tcl8.6\encoding\cp865.enc" delete "$INSTDIR\tcl8.6\encoding\cp866.enc" delete "$INSTDIR\tcl8.6\encoding\cp869.enc" delete "$INSTDIR\tcl8.6\encoding\cp874.enc" delete "$INSTDIR\tcl8.6\encoding\cp932.enc" delete "$INSTDIR\tcl8.6\encoding\cp936.enc" delete "$INSTDIR\tcl8.6\encoding\cp949.enc" delete "$INSTDIR\tcl8.6\encoding\cp950.enc" delete "$INSTDIR\tcl8.6\encoding\dingbats.enc" delete "$INSTDIR\tcl8.6\encoding\ebcdic.enc" delete "$INSTDIR\tcl8.6\encoding\euc-cn.enc" delete "$INSTDIR\tcl8.6\encoding\euc-jp.enc" delete "$INSTDIR\tcl8.6\encoding\euc-kr.enc" delete "$INSTDIR\tcl8.6\encoding\gb12345.enc" delete "$INSTDIR\tcl8.6\encoding\gb1988.enc" delete "$INSTDIR\tcl8.6\encoding\gb2312-raw.enc" delete "$INSTDIR\tcl8.6\encoding\gb2312.enc" delete "$INSTDIR\tcl8.6\encoding\iso2022-jp.enc" delete "$INSTDIR\tcl8.6\encoding\iso2022-kr.enc" delete "$INSTDIR\tcl8.6\encoding\iso2022.enc" delete "$INSTDIR\tcl8.6\encoding\iso8859-1.enc" delete "$INSTDIR\tcl8.6\encoding\iso8859-10.enc" delete "$INSTDIR\tcl8.6\encoding\iso8859-13.enc" delete "$INSTDIR\tcl8.6\encoding\iso8859-14.enc" delete "$INSTDIR\tcl8.6\encoding\iso8859-15.enc" delete "$INSTDIR\tcl8.6\encoding\iso8859-16.enc" delete "$INSTDIR\tcl8.6\encoding\iso8859-2.enc" delete "$INSTDIR\tcl8.6\encoding\iso8859-3.enc" delete "$INSTDIR\tcl8.6\encoding\iso8859-4.enc" delete "$INSTDIR\tcl8.6\encoding\iso8859-5.enc" delete "$INSTDIR\tcl8.6\encoding\iso8859-6.enc" delete "$INSTDIR\tcl8.6\encoding\iso8859-7.enc" delete "$INSTDIR\tcl8.6\encoding\iso8859-8.enc" delete "$INSTDIR\tcl8.6\encoding\iso8859-9.enc" delete "$INSTDIR\tcl8.6\encoding\jis0201.enc" delete "$INSTDIR\tcl8.6\encoding\jis0208.enc" delete "$INSTDIR\tcl8.6\encoding\jis0212.enc" delete "$INSTDIR\tcl8.6\encoding\koi8-r.enc" delete "$INSTDIR\tcl8.6\encoding\koi8-u.enc" delete "$INSTDIR\tcl8.6\encoding\ksc5601.enc" delete "$INSTDIR\tcl8.6\encoding\macCentEuro.enc" delete "$INSTDIR\tcl8.6\encoding\macCroatian.enc" delete "$INSTDIR\tcl8.6\encoding\macCyrillic.enc" delete "$INSTDIR\tcl8.6\encoding\macDingbats.enc" delete "$INSTDIR\tcl8.6\encoding\macGreek.enc" delete "$INSTDIR\tcl8.6\encoding\macIceland.enc" delete "$INSTDIR\tcl8.6\encoding\macJapan.enc" delete "$INSTDIR\tcl8.6\encoding\macRoman.enc" delete "$INSTDIR\tcl8.6\encoding\macRomania.enc" delete "$INSTDIR\tcl8.6\encoding\macThai.enc" delete "$INSTDIR\tcl8.6\encoding\macTurkish.enc" delete "$INSTDIR\tcl8.6\encoding\macUkraine.enc" delete "$INSTDIR\tcl8.6\encoding\shiftjis.enc" delete "$INSTDIR\tcl8.6\encoding\symbol.enc" delete "$INSTDIR\tcl8.6\encoding\tis-620.enc" delete "$INSTDIR\tcl8.6\history.tcl" delete "$INSTDIR\tcl8.6\http1.0\http.tcl" delete "$INSTDIR\tcl8.6\http1.0\pkgIndex.tcl" delete "$INSTDIR\tcl8.6\init.tcl" delete "$INSTDIR\tcl8.6\msgs\af.msg" delete "$INSTDIR\tcl8.6\msgs\af_za.msg" delete "$INSTDIR\tcl8.6\msgs\ar.msg" delete "$INSTDIR\tcl8.6\msgs\ar_in.msg" delete "$INSTDIR\tcl8.6\msgs\ar_jo.msg" delete "$INSTDIR\tcl8.6\msgs\ar_lb.msg" delete "$INSTDIR\tcl8.6\msgs\ar_sy.msg" delete "$INSTDIR\tcl8.6\msgs\be.msg" delete "$INSTDIR\tcl8.6\msgs\bg.msg" delete "$INSTDIR\tcl8.6\msgs\bn.msg" delete "$INSTDIR\tcl8.6\msgs\bn_in.msg" delete "$INSTDIR\tcl8.6\msgs\ca.msg" delete "$INSTDIR\tcl8.6\msgs\cs.msg" delete "$INSTDIR\tcl8.6\msgs\da.msg" delete "$INSTDIR\tcl8.6\msgs\de.msg" delete "$INSTDIR\tcl8.6\msgs\de_at.msg" delete "$INSTDIR\tcl8.6\msgs\de_be.msg" delete "$INSTDIR\tcl8.6\msgs\el.msg" delete "$INSTDIR\tcl8.6\msgs\en_au.msg" delete "$INSTDIR\tcl8.6\msgs\en_be.msg" delete "$INSTDIR\tcl8.6\msgs\en_bw.msg" delete "$INSTDIR\tcl8.6\msgs\en_ca.msg" delete "$INSTDIR\tcl8.6\msgs\en_gb.msg" delete "$INSTDIR\tcl8.6\msgs\en_hk.msg" delete "$INSTDIR\tcl8.6\msgs\en_ie.msg" delete "$INSTDIR\tcl8.6\msgs\en_in.msg" delete "$INSTDIR\tcl8.6\msgs\en_nz.msg" delete "$INSTDIR\tcl8.6\msgs\en_ph.msg" delete "$INSTDIR\tcl8.6\msgs\en_sg.msg" delete "$INSTDIR\tcl8.6\msgs\en_za.msg" delete "$INSTDIR\tcl8.6\msgs\en_zw.msg" delete "$INSTDIR\tcl8.6\msgs\eo.msg" delete "$INSTDIR\tcl8.6\msgs\es.msg" delete "$INSTDIR\tcl8.6\msgs\es_ar.msg" delete "$INSTDIR\tcl8.6\msgs\es_bo.msg" delete "$INSTDIR\tcl8.6\msgs\es_cl.msg" delete "$INSTDIR\tcl8.6\msgs\es_co.msg" delete "$INSTDIR\tcl8.6\msgs\es_cr.msg" delete "$INSTDIR\tcl8.6\msgs\es_do.msg" delete "$INSTDIR\tcl8.6\msgs\es_ec.msg" delete "$INSTDIR\tcl8.6\msgs\es_gt.msg" delete "$INSTDIR\tcl8.6\msgs\es_hn.msg" delete "$INSTDIR\tcl8.6\msgs\es_mx.msg" delete "$INSTDIR\tcl8.6\msgs\es_ni.msg" delete "$INSTDIR\tcl8.6\msgs\es_pa.msg" delete "$INSTDIR\tcl8.6\msgs\es_pe.msg" delete "$INSTDIR\tcl8.6\msgs\es_pr.msg" delete "$INSTDIR\tcl8.6\msgs\es_py.msg" delete "$INSTDIR\tcl8.6\msgs\es_sv.msg" delete "$INSTDIR\tcl8.6\msgs\es_uy.msg" delete "$INSTDIR\tcl8.6\msgs\es_ve.msg" delete "$INSTDIR\tcl8.6\msgs\et.msg" delete "$INSTDIR\tcl8.6\msgs\eu.msg" delete "$INSTDIR\tcl8.6\msgs\eu_es.msg" delete "$INSTDIR\tcl8.6\msgs\fa.msg" delete "$INSTDIR\tcl8.6\msgs\fa_in.msg" delete "$INSTDIR\tcl8.6\msgs\fa_ir.msg" delete "$INSTDIR\tcl8.6\msgs\fi.msg" delete "$INSTDIR\tcl8.6\msgs\fo.msg" delete "$INSTDIR\tcl8.6\msgs\fo_fo.msg" delete "$INSTDIR\tcl8.6\msgs\fr.msg" delete "$INSTDIR\tcl8.6\msgs\fr_be.msg" delete "$INSTDIR\tcl8.6\msgs\fr_ca.msg" delete "$INSTDIR\tcl8.6\msgs\fr_ch.msg" delete "$INSTDIR\tcl8.6\msgs\ga.msg" delete "$INSTDIR\tcl8.6\msgs\ga_ie.msg" delete "$INSTDIR\tcl8.6\msgs\gl.msg" delete "$INSTDIR\tcl8.6\msgs\gl_es.msg" delete "$INSTDIR\tcl8.6\msgs\gv.msg" delete "$INSTDIR\tcl8.6\msgs\gv_gb.msg" delete "$INSTDIR\tcl8.6\msgs\he.msg" delete "$INSTDIR\tcl8.6\msgs\hi.msg" delete "$INSTDIR\tcl8.6\msgs\hi_in.msg" delete "$INSTDIR\tcl8.6\msgs\hr.msg" delete "$INSTDIR\tcl8.6\msgs\hu.msg" delete "$INSTDIR\tcl8.6\msgs\id.msg" delete "$INSTDIR\tcl8.6\msgs\id_id.msg" delete "$INSTDIR\tcl8.6\msgs\is.msg" delete "$INSTDIR\tcl8.6\msgs\it.msg" delete "$INSTDIR\tcl8.6\msgs\it_ch.msg" delete "$INSTDIR\tcl8.6\msgs\ja.msg" delete "$INSTDIR\tcl8.6\msgs\kl.msg" delete "$INSTDIR\tcl8.6\msgs\kl_gl.msg" delete "$INSTDIR\tcl8.6\msgs\ko.msg" delete "$INSTDIR\tcl8.6\msgs\kok.msg" delete "$INSTDIR\tcl8.6\msgs\kok_in.msg" delete "$INSTDIR\tcl8.6\msgs\ko_kr.msg" delete "$INSTDIR\tcl8.6\msgs\kw.msg" delete "$INSTDIR\tcl8.6\msgs\kw_gb.msg" delete "$INSTDIR\tcl8.6\msgs\lt.msg" delete "$INSTDIR\tcl8.6\msgs\lv.msg" delete "$INSTDIR\tcl8.6\msgs\mk.msg" delete "$INSTDIR\tcl8.6\msgs\mr.msg" delete "$INSTDIR\tcl8.6\msgs\mr_in.msg" delete "$INSTDIR\tcl8.6\msgs\ms.msg" delete "$INSTDIR\tcl8.6\msgs\ms_my.msg" delete "$INSTDIR\tcl8.6\msgs\mt.msg" delete "$INSTDIR\tcl8.6\msgs\nb.msg" delete "$INSTDIR\tcl8.6\msgs\nl.msg" delete "$INSTDIR\tcl8.6\msgs\nl_be.msg" delete "$INSTDIR\tcl8.6\msgs\nn.msg" delete "$INSTDIR\tcl8.6\msgs\pl.msg" delete "$INSTDIR\tcl8.6\msgs\pt.msg" delete "$INSTDIR\tcl8.6\msgs\pt_br.msg" delete "$INSTDIR\tcl8.6\msgs\ro.msg" delete "$INSTDIR\tcl8.6\msgs\ru.msg" delete "$INSTDIR\tcl8.6\msgs\ru_ua.msg" delete "$INSTDIR\tcl8.6\msgs\sh.msg" delete "$INSTDIR\tcl8.6\msgs\sk.msg" delete "$INSTDIR\tcl8.6\msgs\sl.msg" delete "$INSTDIR\tcl8.6\msgs\sq.msg" delete "$INSTDIR\tcl8.6\msgs\sr.msg" delete "$INSTDIR\tcl8.6\msgs\sv.msg" delete "$INSTDIR\tcl8.6\msgs\sw.msg" delete "$INSTDIR\tcl8.6\msgs\ta.msg" delete "$INSTDIR\tcl8.6\msgs\ta_in.msg" delete "$INSTDIR\tcl8.6\msgs\te.msg" delete "$INSTDIR\tcl8.6\msgs\te_in.msg" delete "$INSTDIR\tcl8.6\msgs\th.msg" delete "$INSTDIR\tcl8.6\msgs\tr.msg" delete "$INSTDIR\tcl8.6\msgs\uk.msg" delete "$INSTDIR\tcl8.6\msgs\vi.msg" delete "$INSTDIR\tcl8.6\msgs\zh.msg" delete "$INSTDIR\tcl8.6\msgs\zh_cn.msg" delete "$INSTDIR\tcl8.6\msgs\zh_hk.msg" delete "$INSTDIR\tcl8.6\msgs\zh_sg.msg" delete "$INSTDIR\tcl8.6\msgs\zh_tw.msg" delete "$INSTDIR\tcl8.6\opt0.4\optparse.tcl" delete "$INSTDIR\tcl8.6\opt0.4\pkgIndex.tcl" delete "$INSTDIR\tcl8.6\package.tcl" delete "$INSTDIR\tcl8.6\parray.tcl" delete "$INSTDIR\tcl8.6\safe.tcl" delete "$INSTDIR\tcl8.6\tclIndex" delete "$INSTDIR\tcl8.6\tm.tcl" delete "$INSTDIR\tcl8.6\tzdata\Africa\Abidjan" delete "$INSTDIR\tcl8.6\tzdata\Africa\Accra" delete "$INSTDIR\tcl8.6\tzdata\Africa\Addis_Ababa" delete "$INSTDIR\tcl8.6\tzdata\Africa\Algiers" delete "$INSTDIR\tcl8.6\tzdata\Africa\Asmara" delete "$INSTDIR\tcl8.6\tzdata\Africa\Asmera" delete "$INSTDIR\tcl8.6\tzdata\Africa\Bamako" delete "$INSTDIR\tcl8.6\tzdata\Africa\Bangui" delete "$INSTDIR\tcl8.6\tzdata\Africa\Banjul" delete "$INSTDIR\tcl8.6\tzdata\Africa\Bissau" delete "$INSTDIR\tcl8.6\tzdata\Africa\Blantyre" delete "$INSTDIR\tcl8.6\tzdata\Africa\Brazzaville" delete "$INSTDIR\tcl8.6\tzdata\Africa\Bujumbura" delete "$INSTDIR\tcl8.6\tzdata\Africa\Cairo" delete "$INSTDIR\tcl8.6\tzdata\Africa\Casablanca" delete "$INSTDIR\tcl8.6\tzdata\Africa\Ceuta" delete "$INSTDIR\tcl8.6\tzdata\Africa\Conakry" delete "$INSTDIR\tcl8.6\tzdata\Africa\Dakar" delete "$INSTDIR\tcl8.6\tzdata\Africa\Dar_es_Salaam" delete "$INSTDIR\tcl8.6\tzdata\Africa\Djibouti" delete "$INSTDIR\tcl8.6\tzdata\Africa\Douala" delete "$INSTDIR\tcl8.6\tzdata\Africa\El_Aaiun" delete "$INSTDIR\tcl8.6\tzdata\Africa\Freetown" delete "$INSTDIR\tcl8.6\tzdata\Africa\Gaborone" delete "$INSTDIR\tcl8.6\tzdata\Africa\Harare" delete "$INSTDIR\tcl8.6\tzdata\Africa\Johannesburg" delete "$INSTDIR\tcl8.6\tzdata\Africa\Juba" delete "$INSTDIR\tcl8.6\tzdata\Africa\Kampala" delete "$INSTDIR\tcl8.6\tzdata\Africa\Khartoum" delete "$INSTDIR\tcl8.6\tzdata\Africa\Kigali" delete "$INSTDIR\tcl8.6\tzdata\Africa\Kinshasa" delete "$INSTDIR\tcl8.6\tzdata\Africa\Lagos" delete "$INSTDIR\tcl8.6\tzdata\Africa\Libreville" delete "$INSTDIR\tcl8.6\tzdata\Africa\Lome" delete "$INSTDIR\tcl8.6\tzdata\Africa\Luanda" delete "$INSTDIR\tcl8.6\tzdata\Africa\Lubumbashi" delete "$INSTDIR\tcl8.6\tzdata\Africa\Lusaka" delete "$INSTDIR\tcl8.6\tzdata\Africa\Malabo" delete "$INSTDIR\tcl8.6\tzdata\Africa\Maputo" delete "$INSTDIR\tcl8.6\tzdata\Africa\Maseru" delete "$INSTDIR\tcl8.6\tzdata\Africa\Mbabane" delete "$INSTDIR\tcl8.6\tzdata\Africa\Mogadishu" delete "$INSTDIR\tcl8.6\tzdata\Africa\Monrovia" delete "$INSTDIR\tcl8.6\tzdata\Africa\Nairobi" delete "$INSTDIR\tcl8.6\tzdata\Africa\Ndjamena" delete "$INSTDIR\tcl8.6\tzdata\Africa\Niamey" delete "$INSTDIR\tcl8.6\tzdata\Africa\Nouakchott" delete "$INSTDIR\tcl8.6\tzdata\Africa\Ouagadougou" delete "$INSTDIR\tcl8.6\tzdata\Africa\Porto-Novo" delete "$INSTDIR\tcl8.6\tzdata\Africa\Sao_Tome" delete "$INSTDIR\tcl8.6\tzdata\Africa\Timbuktu" delete "$INSTDIR\tcl8.6\tzdata\Africa\Tripoli" delete "$INSTDIR\tcl8.6\tzdata\Africa\Tunis" delete "$INSTDIR\tcl8.6\tzdata\Africa\Windhoek" delete "$INSTDIR\tcl8.6\tzdata\America\Adak" delete "$INSTDIR\tcl8.6\tzdata\America\Anchorage" delete "$INSTDIR\tcl8.6\tzdata\America\Anguilla" delete "$INSTDIR\tcl8.6\tzdata\America\Antigua" delete "$INSTDIR\tcl8.6\tzdata\America\Araguaina" delete "$INSTDIR\tcl8.6\tzdata\America\Argentina\Buenos_Aires" delete "$INSTDIR\tcl8.6\tzdata\America\Argentina\Catamarca" delete "$INSTDIR\tcl8.6\tzdata\America\Argentina\ComodRivadavia" delete "$INSTDIR\tcl8.6\tzdata\America\Argentina\Cordoba" delete "$INSTDIR\tcl8.6\tzdata\America\Argentina\Jujuy" delete "$INSTDIR\tcl8.6\tzdata\America\Argentina\La_Rioja" delete "$INSTDIR\tcl8.6\tzdata\America\Argentina\Mendoza" delete "$INSTDIR\tcl8.6\tzdata\America\Argentina\Rio_Gallegos" delete "$INSTDIR\tcl8.6\tzdata\America\Argentina\Salta" delete "$INSTDIR\tcl8.6\tzdata\America\Argentina\San_Juan" delete "$INSTDIR\tcl8.6\tzdata\America\Argentina\San_Luis" delete "$INSTDIR\tcl8.6\tzdata\America\Argentina\Tucuman" delete "$INSTDIR\tcl8.6\tzdata\America\Argentina\Ushuaia" delete "$INSTDIR\tcl8.6\tzdata\America\Aruba" delete "$INSTDIR\tcl8.6\tzdata\America\Asuncion" delete "$INSTDIR\tcl8.6\tzdata\America\Atikokan" delete "$INSTDIR\tcl8.6\tzdata\America\Atka" delete "$INSTDIR\tcl8.6\tzdata\America\Bahia" delete "$INSTDIR\tcl8.6\tzdata\America\Bahia_Banderas" delete "$INSTDIR\tcl8.6\tzdata\America\Barbados" delete "$INSTDIR\tcl8.6\tzdata\America\Belem" delete "$INSTDIR\tcl8.6\tzdata\America\Belize" delete "$INSTDIR\tcl8.6\tzdata\America\Blanc-Sablon" delete "$INSTDIR\tcl8.6\tzdata\America\Boa_Vista" delete "$INSTDIR\tcl8.6\tzdata\America\Bogota" delete "$INSTDIR\tcl8.6\tzdata\America\Boise" delete "$INSTDIR\tcl8.6\tzdata\America\Buenos_Aires" delete "$INSTDIR\tcl8.6\tzdata\America\Cambridge_Bay" delete "$INSTDIR\tcl8.6\tzdata\America\Campo_Grande" delete "$INSTDIR\tcl8.6\tzdata\America\Cancun" delete "$INSTDIR\tcl8.6\tzdata\America\Caracas" delete "$INSTDIR\tcl8.6\tzdata\America\Catamarca" delete "$INSTDIR\tcl8.6\tzdata\America\Cayenne" delete "$INSTDIR\tcl8.6\tzdata\America\Cayman" delete "$INSTDIR\tcl8.6\tzdata\America\Chicago" delete "$INSTDIR\tcl8.6\tzdata\America\Chihuahua" delete "$INSTDIR\tcl8.6\tzdata\America\Coral_Harbour" delete "$INSTDIR\tcl8.6\tzdata\America\Cordoba" delete "$INSTDIR\tcl8.6\tzdata\America\Costa_Rica" delete "$INSTDIR\tcl8.6\tzdata\America\Creston" delete "$INSTDIR\tcl8.6\tzdata\America\Cuiaba" delete "$INSTDIR\tcl8.6\tzdata\America\Curacao" delete "$INSTDIR\tcl8.6\tzdata\America\Danmarkshavn" delete "$INSTDIR\tcl8.6\tzdata\America\Dawson" delete "$INSTDIR\tcl8.6\tzdata\America\Dawson_Creek" delete "$INSTDIR\tcl8.6\tzdata\America\Denver" delete "$INSTDIR\tcl8.6\tzdata\America\Detroit" delete "$INSTDIR\tcl8.6\tzdata\America\Dominica" delete "$INSTDIR\tcl8.6\tzdata\America\Edmonton" delete "$INSTDIR\tcl8.6\tzdata\America\Eirunepe" delete "$INSTDIR\tcl8.6\tzdata\America\El_Salvador" delete "$INSTDIR\tcl8.6\tzdata\America\Ensenada" delete "$INSTDIR\tcl8.6\tzdata\America\Fortaleza" delete "$INSTDIR\tcl8.6\tzdata\America\Fort_Nelson" delete "$INSTDIR\tcl8.6\tzdata\America\Fort_Wayne" delete "$INSTDIR\tcl8.6\tzdata\America\Glace_Bay" delete "$INSTDIR\tcl8.6\tzdata\America\Godthab" delete "$INSTDIR\tcl8.6\tzdata\America\Goose_Bay" delete "$INSTDIR\tcl8.6\tzdata\America\Grand_Turk" delete "$INSTDIR\tcl8.6\tzdata\America\Grenada" delete "$INSTDIR\tcl8.6\tzdata\America\Guadeloupe" delete "$INSTDIR\tcl8.6\tzdata\America\Guatemala" delete "$INSTDIR\tcl8.6\tzdata\America\Guayaquil" delete "$INSTDIR\tcl8.6\tzdata\America\Guyana" delete "$INSTDIR\tcl8.6\tzdata\America\Halifax" delete "$INSTDIR\tcl8.6\tzdata\America\Havana" delete "$INSTDIR\tcl8.6\tzdata\America\Hermosillo" delete "$INSTDIR\tcl8.6\tzdata\America\Indiana\Indianapolis" delete "$INSTDIR\tcl8.6\tzdata\America\Indiana\Knox" delete "$INSTDIR\tcl8.6\tzdata\America\Indiana\Marengo" delete "$INSTDIR\tcl8.6\tzdata\America\Indiana\Petersburg" delete "$INSTDIR\tcl8.6\tzdata\America\Indiana\Tell_City" delete "$INSTDIR\tcl8.6\tzdata\America\Indiana\Vevay" delete "$INSTDIR\tcl8.6\tzdata\America\Indiana\Vincennes" delete "$INSTDIR\tcl8.6\tzdata\America\Indiana\Winamac" delete "$INSTDIR\tcl8.6\tzdata\America\Indianapolis" delete "$INSTDIR\tcl8.6\tzdata\America\Inuvik" delete "$INSTDIR\tcl8.6\tzdata\America\Iqaluit" delete "$INSTDIR\tcl8.6\tzdata\America\Jamaica" delete "$INSTDIR\tcl8.6\tzdata\America\Jujuy" delete "$INSTDIR\tcl8.6\tzdata\America\Juneau" delete "$INSTDIR\tcl8.6\tzdata\America\Kentucky\Louisville" delete "$INSTDIR\tcl8.6\tzdata\America\Kentucky\Monticello" delete "$INSTDIR\tcl8.6\tzdata\America\Knox_IN" delete "$INSTDIR\tcl8.6\tzdata\America\Kralendijk" delete "$INSTDIR\tcl8.6\tzdata\America\La_Paz" delete "$INSTDIR\tcl8.6\tzdata\America\Lima" delete "$INSTDIR\tcl8.6\tzdata\America\Los_Angeles" delete "$INSTDIR\tcl8.6\tzdata\America\Louisville" delete "$INSTDIR\tcl8.6\tzdata\America\Lower_Princes" delete "$INSTDIR\tcl8.6\tzdata\America\Maceio" delete "$INSTDIR\tcl8.6\tzdata\America\Managua" delete "$INSTDIR\tcl8.6\tzdata\America\Manaus" delete "$INSTDIR\tcl8.6\tzdata\America\Marigot" delete "$INSTDIR\tcl8.6\tzdata\America\Martinique" delete "$INSTDIR\tcl8.6\tzdata\America\Matamoros" delete "$INSTDIR\tcl8.6\tzdata\America\Mazatlan" delete "$INSTDIR\tcl8.6\tzdata\America\Mendoza" delete "$INSTDIR\tcl8.6\tzdata\America\Menominee" delete "$INSTDIR\tcl8.6\tzdata\America\Merida" delete "$INSTDIR\tcl8.6\tzdata\America\Metlakatla" delete "$INSTDIR\tcl8.6\tzdata\America\Mexico_City" delete "$INSTDIR\tcl8.6\tzdata\America\Miquelon" delete "$INSTDIR\tcl8.6\tzdata\America\Moncton" delete "$INSTDIR\tcl8.6\tzdata\America\Monterrey" delete "$INSTDIR\tcl8.6\tzdata\America\Montevideo" delete "$INSTDIR\tcl8.6\tzdata\America\Montreal" delete "$INSTDIR\tcl8.6\tzdata\America\Montserrat" delete "$INSTDIR\tcl8.6\tzdata\America\Nassau" delete "$INSTDIR\tcl8.6\tzdata\America\New_York" delete "$INSTDIR\tcl8.6\tzdata\America\Nipigon" delete "$INSTDIR\tcl8.6\tzdata\America\Nome" delete "$INSTDIR\tcl8.6\tzdata\America\Noronha" delete "$INSTDIR\tcl8.6\tzdata\America\North_Dakota\Beulah" delete "$INSTDIR\tcl8.6\tzdata\America\North_Dakota\Center" delete "$INSTDIR\tcl8.6\tzdata\America\North_Dakota\New_Salem" delete "$INSTDIR\tcl8.6\tzdata\America\Ojinaga" delete "$INSTDIR\tcl8.6\tzdata\America\Panama" delete "$INSTDIR\tcl8.6\tzdata\America\Pangnirtung" delete "$INSTDIR\tcl8.6\tzdata\America\Paramaribo" delete "$INSTDIR\tcl8.6\tzdata\America\Phoenix" delete "$INSTDIR\tcl8.6\tzdata\America\Port-au-Prince" delete "$INSTDIR\tcl8.6\tzdata\America\Porto_Acre" delete "$INSTDIR\tcl8.6\tzdata\America\Porto_Velho" delete "$INSTDIR\tcl8.6\tzdata\America\Port_of_Spain" delete "$INSTDIR\tcl8.6\tzdata\America\Puerto_Rico" delete "$INSTDIR\tcl8.6\tzdata\America\Rainy_River" delete "$INSTDIR\tcl8.6\tzdata\America\Rankin_Inlet" delete "$INSTDIR\tcl8.6\tzdata\America\Recife" delete "$INSTDIR\tcl8.6\tzdata\America\Regina" delete "$INSTDIR\tcl8.6\tzdata\America\Resolute" delete "$INSTDIR\tcl8.6\tzdata\America\Rio_Branco" delete "$INSTDIR\tcl8.6\tzdata\America\Rosario" delete "$INSTDIR\tcl8.6\tzdata\America\Santarem" delete "$INSTDIR\tcl8.6\tzdata\America\Santa_Isabel" delete "$INSTDIR\tcl8.6\tzdata\America\Santiago" delete "$INSTDIR\tcl8.6\tzdata\America\Santo_Domingo" delete "$INSTDIR\tcl8.6\tzdata\America\Sao_Paulo" delete "$INSTDIR\tcl8.6\tzdata\America\Scoresbysund" delete "$INSTDIR\tcl8.6\tzdata\America\Shiprock" delete "$INSTDIR\tcl8.6\tzdata\America\Sitka" delete "$INSTDIR\tcl8.6\tzdata\America\St_Barthelemy" delete "$INSTDIR\tcl8.6\tzdata\America\St_Johns" delete "$INSTDIR\tcl8.6\tzdata\America\St_Kitts" delete "$INSTDIR\tcl8.6\tzdata\America\St_Lucia" delete "$INSTDIR\tcl8.6\tzdata\America\St_Thomas" delete "$INSTDIR\tcl8.6\tzdata\America\St_Vincent" delete "$INSTDIR\tcl8.6\tzdata\America\Swift_Current" delete "$INSTDIR\tcl8.6\tzdata\America\Tegucigalpa" delete "$INSTDIR\tcl8.6\tzdata\America\Thule" delete "$INSTDIR\tcl8.6\tzdata\America\Thunder_Bay" delete "$INSTDIR\tcl8.6\tzdata\America\Tijuana" delete "$INSTDIR\tcl8.6\tzdata\America\Toronto" delete "$INSTDIR\tcl8.6\tzdata\America\Tortola" delete "$INSTDIR\tcl8.6\tzdata\America\Vancouver" delete "$INSTDIR\tcl8.6\tzdata\America\Virgin" delete "$INSTDIR\tcl8.6\tzdata\America\Whitehorse" delete "$INSTDIR\tcl8.6\tzdata\America\Winnipeg" delete "$INSTDIR\tcl8.6\tzdata\America\Yakutat" delete "$INSTDIR\tcl8.6\tzdata\America\Yellowknife" delete "$INSTDIR\tcl8.6\tzdata\Antarctica\Casey" delete "$INSTDIR\tcl8.6\tzdata\Antarctica\Davis" delete "$INSTDIR\tcl8.6\tzdata\Antarctica\DumontDUrville" delete "$INSTDIR\tcl8.6\tzdata\Antarctica\Macquarie" delete "$INSTDIR\tcl8.6\tzdata\Antarctica\Mawson" delete "$INSTDIR\tcl8.6\tzdata\Antarctica\McMurdo" delete "$INSTDIR\tcl8.6\tzdata\Antarctica\Palmer" delete "$INSTDIR\tcl8.6\tzdata\Antarctica\Rothera" delete "$INSTDIR\tcl8.6\tzdata\Antarctica\South_Pole" delete "$INSTDIR\tcl8.6\tzdata\Antarctica\Syowa" delete "$INSTDIR\tcl8.6\tzdata\Antarctica\Troll" delete "$INSTDIR\tcl8.6\tzdata\Antarctica\Vostok" delete "$INSTDIR\tcl8.6\tzdata\Arctic\Longyearbyen" delete "$INSTDIR\tcl8.6\tzdata\Asia\Aden" delete "$INSTDIR\tcl8.6\tzdata\Asia\Almaty" delete "$INSTDIR\tcl8.6\tzdata\Asia\Amman" delete "$INSTDIR\tcl8.6\tzdata\Asia\Anadyr" delete "$INSTDIR\tcl8.6\tzdata\Asia\Aqtau" delete "$INSTDIR\tcl8.6\tzdata\Asia\Aqtobe" delete "$INSTDIR\tcl8.6\tzdata\Asia\Ashgabat" delete "$INSTDIR\tcl8.6\tzdata\Asia\Ashkhabad" delete "$INSTDIR\tcl8.6\tzdata\Asia\Baghdad" delete "$INSTDIR\tcl8.6\tzdata\Asia\Bahrain" delete "$INSTDIR\tcl8.6\tzdata\Asia\Baku" delete "$INSTDIR\tcl8.6\tzdata\Asia\Bangkok" delete "$INSTDIR\tcl8.6\tzdata\Asia\Barnaul" delete "$INSTDIR\tcl8.6\tzdata\Asia\Beirut" delete "$INSTDIR\tcl8.6\tzdata\Asia\Bishkek" delete "$INSTDIR\tcl8.6\tzdata\Asia\Brunei" delete "$INSTDIR\tcl8.6\tzdata\Asia\Calcutta" delete "$INSTDIR\tcl8.6\tzdata\Asia\Chita" delete "$INSTDIR\tcl8.6\tzdata\Asia\Choibalsan" delete "$INSTDIR\tcl8.6\tzdata\Asia\Chongqing" delete "$INSTDIR\tcl8.6\tzdata\Asia\Chungking" delete "$INSTDIR\tcl8.6\tzdata\Asia\Colombo" delete "$INSTDIR\tcl8.6\tzdata\Asia\Dacca" delete "$INSTDIR\tcl8.6\tzdata\Asia\Damascus" delete "$INSTDIR\tcl8.6\tzdata\Asia\Dhaka" delete "$INSTDIR\tcl8.6\tzdata\Asia\Dili" delete "$INSTDIR\tcl8.6\tzdata\Asia\Dubai" delete "$INSTDIR\tcl8.6\tzdata\Asia\Dushanbe" delete "$INSTDIR\tcl8.6\tzdata\Asia\Gaza" delete "$INSTDIR\tcl8.6\tzdata\Asia\Harbin" delete "$INSTDIR\tcl8.6\tzdata\Asia\Hebron" delete "$INSTDIR\tcl8.6\tzdata\Asia\Hong_Kong" delete "$INSTDIR\tcl8.6\tzdata\Asia\Hovd" delete "$INSTDIR\tcl8.6\tzdata\Asia\Ho_Chi_Minh" delete "$INSTDIR\tcl8.6\tzdata\Asia\Irkutsk" delete "$INSTDIR\tcl8.6\tzdata\Asia\Istanbul" delete "$INSTDIR\tcl8.6\tzdata\Asia\Jakarta" delete "$INSTDIR\tcl8.6\tzdata\Asia\Jayapura" delete "$INSTDIR\tcl8.6\tzdata\Asia\Jerusalem" delete "$INSTDIR\tcl8.6\tzdata\Asia\Kabul" delete "$INSTDIR\tcl8.6\tzdata\Asia\Kamchatka" delete "$INSTDIR\tcl8.6\tzdata\Asia\Karachi" delete "$INSTDIR\tcl8.6\tzdata\Asia\Kashgar" delete "$INSTDIR\tcl8.6\tzdata\Asia\Kathmandu" delete "$INSTDIR\tcl8.6\tzdata\Asia\Katmandu" delete "$INSTDIR\tcl8.6\tzdata\Asia\Khandyga" delete "$INSTDIR\tcl8.6\tzdata\Asia\Kolkata" delete "$INSTDIR\tcl8.6\tzdata\Asia\Krasnoyarsk" delete "$INSTDIR\tcl8.6\tzdata\Asia\Kuala_Lumpur" delete "$INSTDIR\tcl8.6\tzdata\Asia\Kuching" delete "$INSTDIR\tcl8.6\tzdata\Asia\Kuwait" delete "$INSTDIR\tcl8.6\tzdata\Asia\Macao" delete "$INSTDIR\tcl8.6\tzdata\Asia\Macau" delete "$INSTDIR\tcl8.6\tzdata\Asia\Magadan" delete "$INSTDIR\tcl8.6\tzdata\Asia\Makassar" delete "$INSTDIR\tcl8.6\tzdata\Asia\Manila" delete "$INSTDIR\tcl8.6\tzdata\Asia\Muscat" delete "$INSTDIR\tcl8.6\tzdata\Asia\Nicosia" delete "$INSTDIR\tcl8.6\tzdata\Asia\Novokuznetsk" delete "$INSTDIR\tcl8.6\tzdata\Asia\Novosibirsk" delete "$INSTDIR\tcl8.6\tzdata\Asia\Omsk" delete "$INSTDIR\tcl8.6\tzdata\Asia\Oral" delete "$INSTDIR\tcl8.6\tzdata\Asia\Phnom_Penh" delete "$INSTDIR\tcl8.6\tzdata\Asia\Pontianak" delete "$INSTDIR\tcl8.6\tzdata\Asia\Pyongyang" delete "$INSTDIR\tcl8.6\tzdata\Asia\Qatar" delete "$INSTDIR\tcl8.6\tzdata\Asia\Qyzylorda" delete "$INSTDIR\tcl8.6\tzdata\Asia\Rangoon" delete "$INSTDIR\tcl8.6\tzdata\Asia\Riyadh" delete "$INSTDIR\tcl8.6\tzdata\Asia\Saigon" delete "$INSTDIR\tcl8.6\tzdata\Asia\Sakhalin" delete "$INSTDIR\tcl8.6\tzdata\Asia\Samarkand" delete "$INSTDIR\tcl8.6\tzdata\Asia\Seoul" delete "$INSTDIR\tcl8.6\tzdata\Asia\Shanghai" delete "$INSTDIR\tcl8.6\tzdata\Asia\Singapore" delete "$INSTDIR\tcl8.6\tzdata\Asia\Srednekolymsk" delete "$INSTDIR\tcl8.6\tzdata\Asia\Taipei" delete "$INSTDIR\tcl8.6\tzdata\Asia\Tashkent" delete "$INSTDIR\tcl8.6\tzdata\Asia\Tbilisi" delete "$INSTDIR\tcl8.6\tzdata\Asia\Tehran" delete "$INSTDIR\tcl8.6\tzdata\Asia\Tel_Aviv" delete "$INSTDIR\tcl8.6\tzdata\Asia\Thimbu" delete "$INSTDIR\tcl8.6\tzdata\Asia\Thimphu" delete "$INSTDIR\tcl8.6\tzdata\Asia\Tokyo" delete "$INSTDIR\tcl8.6\tzdata\Asia\Tomsk" delete "$INSTDIR\tcl8.6\tzdata\Asia\Ujung_Pandang" delete "$INSTDIR\tcl8.6\tzdata\Asia\Ulaanbaatar" delete "$INSTDIR\tcl8.6\tzdata\Asia\Ulan_Bator" delete "$INSTDIR\tcl8.6\tzdata\Asia\Urumqi" delete "$INSTDIR\tcl8.6\tzdata\Asia\Ust-Nera" delete "$INSTDIR\tcl8.6\tzdata\Asia\Vientiane" delete "$INSTDIR\tcl8.6\tzdata\Asia\Vladivostok" delete "$INSTDIR\tcl8.6\tzdata\Asia\Yakutsk" delete "$INSTDIR\tcl8.6\tzdata\Asia\Yekaterinburg" delete "$INSTDIR\tcl8.6\tzdata\Asia\Yerevan" delete "$INSTDIR\tcl8.6\tzdata\Atlantic\Azores" delete "$INSTDIR\tcl8.6\tzdata\Atlantic\Bermuda" delete "$INSTDIR\tcl8.6\tzdata\Atlantic\Canary" delete "$INSTDIR\tcl8.6\tzdata\Atlantic\Cape_Verde" delete "$INSTDIR\tcl8.6\tzdata\Atlantic\Faeroe" delete "$INSTDIR\tcl8.6\tzdata\Atlantic\Faroe" delete "$INSTDIR\tcl8.6\tzdata\Atlantic\Jan_Mayen" delete "$INSTDIR\tcl8.6\tzdata\Atlantic\Madeira" delete "$INSTDIR\tcl8.6\tzdata\Atlantic\Reykjavik" delete "$INSTDIR\tcl8.6\tzdata\Atlantic\South_Georgia" delete "$INSTDIR\tcl8.6\tzdata\Atlantic\Stanley" delete "$INSTDIR\tcl8.6\tzdata\Atlantic\St_Helena" delete "$INSTDIR\tcl8.6\tzdata\Australia\ACT" delete "$INSTDIR\tcl8.6\tzdata\Australia\Adelaide" delete "$INSTDIR\tcl8.6\tzdata\Australia\Brisbane" delete "$INSTDIR\tcl8.6\tzdata\Australia\Broken_Hill" delete "$INSTDIR\tcl8.6\tzdata\Australia\Canberra" delete "$INSTDIR\tcl8.6\tzdata\Australia\Currie" delete "$INSTDIR\tcl8.6\tzdata\Australia\Darwin" delete "$INSTDIR\tcl8.6\tzdata\Australia\Eucla" delete "$INSTDIR\tcl8.6\tzdata\Australia\Hobart" delete "$INSTDIR\tcl8.6\tzdata\Australia\LHI" delete "$INSTDIR\tcl8.6\tzdata\Australia\Lindeman" delete "$INSTDIR\tcl8.6\tzdata\Australia\Lord_Howe" delete "$INSTDIR\tcl8.6\tzdata\Australia\Melbourne" delete "$INSTDIR\tcl8.6\tzdata\Australia\North" delete "$INSTDIR\tcl8.6\tzdata\Australia\NSW" delete "$INSTDIR\tcl8.6\tzdata\Australia\Perth" delete "$INSTDIR\tcl8.6\tzdata\Australia\Queensland" delete "$INSTDIR\tcl8.6\tzdata\Australia\South" delete "$INSTDIR\tcl8.6\tzdata\Australia\Sydney" delete "$INSTDIR\tcl8.6\tzdata\Australia\Tasmania" delete "$INSTDIR\tcl8.6\tzdata\Australia\Victoria" delete "$INSTDIR\tcl8.6\tzdata\Australia\West" delete "$INSTDIR\tcl8.6\tzdata\Australia\Yancowinna" delete "$INSTDIR\tcl8.6\tzdata\Brazil\Acre" delete "$INSTDIR\tcl8.6\tzdata\Brazil\DeNoronha" delete "$INSTDIR\tcl8.6\tzdata\Brazil\East" delete "$INSTDIR\tcl8.6\tzdata\Brazil\West" delete "$INSTDIR\tcl8.6\tzdata\Canada\Atlantic" delete "$INSTDIR\tcl8.6\tzdata\Canada\Central" delete "$INSTDIR\tcl8.6\tzdata\Canada\East-Saskatchewan" delete "$INSTDIR\tcl8.6\tzdata\Canada\Eastern" delete "$INSTDIR\tcl8.6\tzdata\Canada\Mountain" delete "$INSTDIR\tcl8.6\tzdata\Canada\Newfoundland" delete "$INSTDIR\tcl8.6\tzdata\Canada\Pacific" delete "$INSTDIR\tcl8.6\tzdata\Canada\Saskatchewan" delete "$INSTDIR\tcl8.6\tzdata\Canada\Yukon" delete "$INSTDIR\tcl8.6\tzdata\CET" delete "$INSTDIR\tcl8.6\tzdata\Chile\Continental" delete "$INSTDIR\tcl8.6\tzdata\Chile\EasterIsland" delete "$INSTDIR\tcl8.6\tzdata\CST6CDT" delete "$INSTDIR\tcl8.6\tzdata\Cuba" delete "$INSTDIR\tcl8.6\tzdata\EET" delete "$INSTDIR\tcl8.6\tzdata\Egypt" delete "$INSTDIR\tcl8.6\tzdata\Eire" delete "$INSTDIR\tcl8.6\tzdata\EST" delete "$INSTDIR\tcl8.6\tzdata\EST5EDT" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT+0" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT+1" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT+10" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT+11" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT+12" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT+2" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT+3" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT+4" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT+5" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT+6" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT+7" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT+8" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT+9" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT-0" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT-1" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT-10" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT-11" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT-12" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT-13" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT-14" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT-2" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT-3" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT-4" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT-5" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT-6" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT-7" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT-8" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT-9" delete "$INSTDIR\tcl8.6\tzdata\Etc\GMT0" delete "$INSTDIR\tcl8.6\tzdata\Etc\Greenwich" delete "$INSTDIR\tcl8.6\tzdata\Etc\UCT" delete "$INSTDIR\tcl8.6\tzdata\Etc\Universal" delete "$INSTDIR\tcl8.6\tzdata\Etc\UTC" delete "$INSTDIR\tcl8.6\tzdata\Etc\Zulu" delete "$INSTDIR\tcl8.6\tzdata\Europe\Amsterdam" delete "$INSTDIR\tcl8.6\tzdata\Europe\Andorra" delete "$INSTDIR\tcl8.6\tzdata\Europe\Astrakhan" delete "$INSTDIR\tcl8.6\tzdata\Europe\Athens" delete "$INSTDIR\tcl8.6\tzdata\Europe\Belfast" delete "$INSTDIR\tcl8.6\tzdata\Europe\Belgrade" delete "$INSTDIR\tcl8.6\tzdata\Europe\Berlin" delete "$INSTDIR\tcl8.6\tzdata\Europe\Bratislava" delete "$INSTDIR\tcl8.6\tzdata\Europe\Brussels" delete "$INSTDIR\tcl8.6\tzdata\Europe\Bucharest" delete "$INSTDIR\tcl8.6\tzdata\Europe\Budapest" delete "$INSTDIR\tcl8.6\tzdata\Europe\Busingen" delete "$INSTDIR\tcl8.6\tzdata\Europe\Chisinau" delete "$INSTDIR\tcl8.6\tzdata\Europe\Copenhagen" delete "$INSTDIR\tcl8.6\tzdata\Europe\Dublin" delete "$INSTDIR\tcl8.6\tzdata\Europe\Gibraltar" delete "$INSTDIR\tcl8.6\tzdata\Europe\Guernsey" delete "$INSTDIR\tcl8.6\tzdata\Europe\Helsinki" delete "$INSTDIR\tcl8.6\tzdata\Europe\Isle_of_Man" delete "$INSTDIR\tcl8.6\tzdata\Europe\Istanbul" delete "$INSTDIR\tcl8.6\tzdata\Europe\Jersey" delete "$INSTDIR\tcl8.6\tzdata\Europe\Kaliningrad" delete "$INSTDIR\tcl8.6\tzdata\Europe\Kiev" delete "$INSTDIR\tcl8.6\tzdata\Europe\Kirov" delete "$INSTDIR\tcl8.6\tzdata\Europe\Lisbon" delete "$INSTDIR\tcl8.6\tzdata\Europe\Ljubljana" delete "$INSTDIR\tcl8.6\tzdata\Europe\London" delete "$INSTDIR\tcl8.6\tzdata\Europe\Luxembourg" delete "$INSTDIR\tcl8.6\tzdata\Europe\Madrid" delete "$INSTDIR\tcl8.6\tzdata\Europe\Malta" delete "$INSTDIR\tcl8.6\tzdata\Europe\Mariehamn" delete "$INSTDIR\tcl8.6\tzdata\Europe\Minsk" delete "$INSTDIR\tcl8.6\tzdata\Europe\Monaco" delete "$INSTDIR\tcl8.6\tzdata\Europe\Moscow" delete "$INSTDIR\tcl8.6\tzdata\Europe\Nicosia" delete "$INSTDIR\tcl8.6\tzdata\Europe\Oslo" delete "$INSTDIR\tcl8.6\tzdata\Europe\Paris" delete "$INSTDIR\tcl8.6\tzdata\Europe\Podgorica" delete "$INSTDIR\tcl8.6\tzdata\Europe\Prague" delete "$INSTDIR\tcl8.6\tzdata\Europe\Riga" delete "$INSTDIR\tcl8.6\tzdata\Europe\Rome" delete "$INSTDIR\tcl8.6\tzdata\Europe\Samara" delete "$INSTDIR\tcl8.6\tzdata\Europe\San_Marino" delete "$INSTDIR\tcl8.6\tzdata\Europe\Sarajevo" delete "$INSTDIR\tcl8.6\tzdata\Europe\Simferopol" delete "$INSTDIR\tcl8.6\tzdata\Europe\Skopje" delete "$INSTDIR\tcl8.6\tzdata\Europe\Sofia" delete "$INSTDIR\tcl8.6\tzdata\Europe\Stockholm" delete "$INSTDIR\tcl8.6\tzdata\Europe\Tallinn" delete "$INSTDIR\tcl8.6\tzdata\Europe\Tirane" delete "$INSTDIR\tcl8.6\tzdata\Europe\Tiraspol" delete "$INSTDIR\tcl8.6\tzdata\Europe\Ulyanovsk" delete "$INSTDIR\tcl8.6\tzdata\Europe\Uzhgorod" delete "$INSTDIR\tcl8.6\tzdata\Europe\Vaduz" delete "$INSTDIR\tcl8.6\tzdata\Europe\Vatican" delete "$INSTDIR\tcl8.6\tzdata\Europe\Vienna" delete "$INSTDIR\tcl8.6\tzdata\Europe\Vilnius" delete "$INSTDIR\tcl8.6\tzdata\Europe\Volgograd" delete "$INSTDIR\tcl8.6\tzdata\Europe\Warsaw" delete "$INSTDIR\tcl8.6\tzdata\Europe\Zagreb" delete "$INSTDIR\tcl8.6\tzdata\Europe\Zaporozhye" delete "$INSTDIR\tcl8.6\tzdata\Europe\Zurich" delete "$INSTDIR\tcl8.6\tzdata\GB" delete "$INSTDIR\tcl8.6\tzdata\GB-Eire" delete "$INSTDIR\tcl8.6\tzdata\GMT" delete "$INSTDIR\tcl8.6\tzdata\GMT+0" delete "$INSTDIR\tcl8.6\tzdata\GMT-0" delete "$INSTDIR\tcl8.6\tzdata\GMT0" delete "$INSTDIR\tcl8.6\tzdata\Greenwich" delete "$INSTDIR\tcl8.6\tzdata\Hongkong" delete "$INSTDIR\tcl8.6\tzdata\HST" delete "$INSTDIR\tcl8.6\tzdata\Iceland" delete "$INSTDIR\tcl8.6\tzdata\Indian\Antananarivo" delete "$INSTDIR\tcl8.6\tzdata\Indian\Chagos" delete "$INSTDIR\tcl8.6\tzdata\Indian\Christmas" delete "$INSTDIR\tcl8.6\tzdata\Indian\Cocos" delete "$INSTDIR\tcl8.6\tzdata\Indian\Comoro" delete "$INSTDIR\tcl8.6\tzdata\Indian\Kerguelen" delete "$INSTDIR\tcl8.6\tzdata\Indian\Mahe" delete "$INSTDIR\tcl8.6\tzdata\Indian\Maldives" delete "$INSTDIR\tcl8.6\tzdata\Indian\Mauritius" delete "$INSTDIR\tcl8.6\tzdata\Indian\Mayotte" delete "$INSTDIR\tcl8.6\tzdata\Indian\Reunion" delete "$INSTDIR\tcl8.6\tzdata\Iran" delete "$INSTDIR\tcl8.6\tzdata\Israel" delete "$INSTDIR\tcl8.6\tzdata\Jamaica" delete "$INSTDIR\tcl8.6\tzdata\Japan" delete "$INSTDIR\tcl8.6\tzdata\Kwajalein" delete "$INSTDIR\tcl8.6\tzdata\Libya" delete "$INSTDIR\tcl8.6\tzdata\MET" delete "$INSTDIR\tcl8.6\tzdata\Mexico\BajaNorte" delete "$INSTDIR\tcl8.6\tzdata\Mexico\BajaSur" delete "$INSTDIR\tcl8.6\tzdata\Mexico\General" delete "$INSTDIR\tcl8.6\tzdata\MST" delete "$INSTDIR\tcl8.6\tzdata\MST7MDT" delete "$INSTDIR\tcl8.6\tzdata\Navajo" delete "$INSTDIR\tcl8.6\tzdata\NZ" delete "$INSTDIR\tcl8.6\tzdata\NZ-CHAT" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Apia" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Auckland" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Bougainville" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Chatham" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Chuuk" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Easter" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Efate" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Enderbury" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Fakaofo" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Fiji" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Funafuti" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Galapagos" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Gambier" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Guadalcanal" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Guam" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Honolulu" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Johnston" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Kiritimati" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Kosrae" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Kwajalein" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Majuro" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Marquesas" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Midway" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Nauru" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Niue" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Norfolk" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Noumea" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Pago_Pago" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Palau" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Pitcairn" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Pohnpei" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Ponape" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Port_Moresby" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Rarotonga" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Saipan" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Samoa" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Tahiti" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Tarawa" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Tongatapu" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Truk" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Wake" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Wallis" delete "$INSTDIR\tcl8.6\tzdata\Pacific\Yap" delete "$INSTDIR\tcl8.6\tzdata\Poland" delete "$INSTDIR\tcl8.6\tzdata\Portugal" delete "$INSTDIR\tcl8.6\tzdata\PRC" delete "$INSTDIR\tcl8.6\tzdata\PST8PDT" delete "$INSTDIR\tcl8.6\tzdata\ROC" delete "$INSTDIR\tcl8.6\tzdata\ROK" delete "$INSTDIR\tcl8.6\tzdata\Singapore" delete "$INSTDIR\tcl8.6\tzdata\SystemV\AST4" delete "$INSTDIR\tcl8.6\tzdata\SystemV\AST4ADT" delete "$INSTDIR\tcl8.6\tzdata\SystemV\CST6" delete "$INSTDIR\tcl8.6\tzdata\SystemV\CST6CDT" delete "$INSTDIR\tcl8.6\tzdata\SystemV\EST5" delete "$INSTDIR\tcl8.6\tzdata\SystemV\EST5EDT" delete "$INSTDIR\tcl8.6\tzdata\SystemV\HST10" delete "$INSTDIR\tcl8.6\tzdata\SystemV\MST7" delete "$INSTDIR\tcl8.6\tzdata\SystemV\MST7MDT" delete "$INSTDIR\tcl8.6\tzdata\SystemV\PST8" delete "$INSTDIR\tcl8.6\tzdata\SystemV\PST8PDT" delete "$INSTDIR\tcl8.6\tzdata\SystemV\YST9" delete "$INSTDIR\tcl8.6\tzdata\SystemV\YST9YDT" delete "$INSTDIR\tcl8.6\tzdata\Turkey" delete "$INSTDIR\tcl8.6\tzdata\UCT" delete "$INSTDIR\tcl8.6\tzdata\Universal" delete "$INSTDIR\tcl8.6\tzdata\US\Alaska" delete "$INSTDIR\tcl8.6\tzdata\US\Aleutian" delete "$INSTDIR\tcl8.6\tzdata\US\Arizona" delete "$INSTDIR\tcl8.6\tzdata\US\Central" delete "$INSTDIR\tcl8.6\tzdata\US\East-Indiana" delete "$INSTDIR\tcl8.6\tzdata\US\Eastern" delete "$INSTDIR\tcl8.6\tzdata\US\Hawaii" delete "$INSTDIR\tcl8.6\tzdata\US\Indiana-Starke" delete "$INSTDIR\tcl8.6\tzdata\US\Michigan" delete "$INSTDIR\tcl8.6\tzdata\US\Mountain" delete "$INSTDIR\tcl8.6\tzdata\US\Pacific" delete "$INSTDIR\tcl8.6\tzdata\US\Pacific-New" delete "$INSTDIR\tcl8.6\tzdata\US\Samoa" delete "$INSTDIR\tcl8.6\tzdata\UTC" delete "$INSTDIR\tcl8.6\tzdata\W-SU" delete "$INSTDIR\tcl8.6\tzdata\WET" delete "$INSTDIR\tcl8.6\tzdata\Zulu" delete "$INSTDIR\tcl8.6\word.tcl" delete "$INSTDIR\tk8.6\bgerror.tcl" delete "$INSTDIR\tk8.6\button.tcl" delete "$INSTDIR\tk8.6\choosedir.tcl" delete "$INSTDIR\tk8.6\clrpick.tcl" delete "$INSTDIR\tk8.6\comdlg.tcl" delete "$INSTDIR\tk8.6\console.tcl" delete "$INSTDIR\tk8.6\dialog.tcl" delete "$INSTDIR\tk8.6\entry.tcl" delete "$INSTDIR\tk8.6\focus.tcl" delete "$INSTDIR\tk8.6\fontchooser.tcl" delete "$INSTDIR\tk8.6\iconlist.tcl" delete "$INSTDIR\tk8.6\icons.tcl" delete "$INSTDIR\tk8.6\images\logo.eps" delete "$INSTDIR\tk8.6\images\logo100.gif" delete "$INSTDIR\tk8.6\images\logo64.gif" delete "$INSTDIR\tk8.6\images\logoLarge.gif" delete "$INSTDIR\tk8.6\images\logoMed.gif" delete "$INSTDIR\tk8.6\images\pwrdLogo.eps" delete "$INSTDIR\tk8.6\images\pwrdLogo100.gif" delete "$INSTDIR\tk8.6\images\pwrdLogo150.gif" delete "$INSTDIR\tk8.6\images\pwrdLogo175.gif" delete "$INSTDIR\tk8.6\images\pwrdLogo200.gif" delete "$INSTDIR\tk8.6\images\pwrdLogo75.gif" delete "$INSTDIR\tk8.6\images\README" delete "$INSTDIR\tk8.6\images\tai-ku.gif" delete "$INSTDIR\tk8.6\listbox.tcl" delete "$INSTDIR\tk8.6\megawidget.tcl" delete "$INSTDIR\tk8.6\menu.tcl" delete "$INSTDIR\tk8.6\mkpsenc.tcl" delete "$INSTDIR\tk8.6\msgbox.tcl" delete "$INSTDIR\tk8.6\msgs\cs.msg" delete "$INSTDIR\tk8.6\msgs\da.msg" delete "$INSTDIR\tk8.6\msgs\de.msg" delete "$INSTDIR\tk8.6\msgs\el.msg" delete "$INSTDIR\tk8.6\msgs\en.msg" delete "$INSTDIR\tk8.6\msgs\en_gb.msg" delete "$INSTDIR\tk8.6\msgs\eo.msg" delete "$INSTDIR\tk8.6\msgs\es.msg" delete "$INSTDIR\tk8.6\msgs\fr.msg" delete "$INSTDIR\tk8.6\msgs\hu.msg" delete "$INSTDIR\tk8.6\msgs\it.msg" delete "$INSTDIR\tk8.6\msgs\nl.msg" delete "$INSTDIR\tk8.6\msgs\pl.msg" delete "$INSTDIR\tk8.6\msgs\pt.msg" delete "$INSTDIR\tk8.6\msgs\ru.msg" delete "$INSTDIR\tk8.6\msgs\sv.msg" delete "$INSTDIR\tk8.6\obsolete.tcl" delete "$INSTDIR\tk8.6\optMenu.tcl" delete "$INSTDIR\tk8.6\palette.tcl" delete "$INSTDIR\tk8.6\panedwindow.tcl" delete "$INSTDIR\tk8.6\pkgIndex.tcl" delete "$INSTDIR\tk8.6\safetk.tcl" delete "$INSTDIR\tk8.6\scale.tcl" delete "$INSTDIR\tk8.6\scrlbar.tcl" delete "$INSTDIR\tk8.6\spinbox.tcl" delete "$INSTDIR\tk8.6\tclIndex" delete "$INSTDIR\tk8.6\tearoff.tcl" delete "$INSTDIR\tk8.6\text.tcl" delete "$INSTDIR\tk8.6\tk.tcl" delete "$INSTDIR\tk8.6\tkAppInit.c" delete "$INSTDIR\tk8.6\tkfbox.tcl" delete "$INSTDIR\tk8.6\ttk\altTheme.tcl" delete "$INSTDIR\tk8.6\ttk\aquaTheme.tcl" delete "$INSTDIR\tk8.6\ttk\button.tcl" delete "$INSTDIR\tk8.6\ttk\clamTheme.tcl" delete "$INSTDIR\tk8.6\ttk\classicTheme.tcl" delete "$INSTDIR\tk8.6\ttk\combobox.tcl" delete "$INSTDIR\tk8.6\ttk\cursors.tcl" delete "$INSTDIR\tk8.6\ttk\defaults.tcl" delete "$INSTDIR\tk8.6\ttk\entry.tcl" delete "$INSTDIR\tk8.6\ttk\fonts.tcl" delete "$INSTDIR\tk8.6\ttk\menubutton.tcl" delete "$INSTDIR\tk8.6\ttk\notebook.tcl" delete "$INSTDIR\tk8.6\ttk\panedwindow.tcl" delete "$INSTDIR\tk8.6\ttk\progress.tcl" delete "$INSTDIR\tk8.6\ttk\scale.tcl" delete "$INSTDIR\tk8.6\ttk\scrollbar.tcl" delete "$INSTDIR\tk8.6\ttk\sizegrip.tcl" delete "$INSTDIR\tk8.6\ttk\spinbox.tcl" delete "$INSTDIR\tk8.6\ttk\treeview.tcl" delete "$INSTDIR\tk8.6\ttk\ttk.tcl" delete "$INSTDIR\tk8.6\ttk\utils.tcl" delete "$INSTDIR\tk8.6\ttk\vistaTheme.tcl" delete "$INSTDIR\tk8.6\ttk\winTheme.tcl" delete "$INSTDIR\tk8.6\ttk\xpTheme.tcl" delete "$INSTDIR\tk8.6\unsupported.tcl" delete "$INSTDIR\tk8.6\xmfbox.tcl" delete "$INSTDIR\zlib1.dll" delete "$INSTDIR\tcl86.dll" delete "$INSTDIR\tk86.dll" delete "$INSTDIR\tcl8\8.4\platform\shell-1.1.4.tm" delete "$INSTDIR\tcl8\8.4\platform-1.0.14.tm" delete "$INSTDIR\tcl8\8.5\msgcat-1.6.0.tm" delete "$INSTDIR\tcl8\8.5\tcltest-2.4.0.tm" delete "$INSTDIR\tcl8\8.6\http-2.8.9.tm" delete "$INSTDIR\tcl8\8.6\tdbc\sqlite3-1.0.4.tm" # then directories RMDIR "$INSTDIR\tk8.6\images" RMDIR "$INSTDIR\tk8.6\msgs" RMDIR "$INSTDIR\tk8.6\ttk" RMDIR "$INSTDIR\tk8.6" RMDIR "$INSTDIR\tcl8.6\tzdata\Africa" RMDIR "$INSTDIR\tcl8.6\tzdata\America\Argentina" RMDIR "$INSTDIR\tcl8.6\tzdata\America\Indiana" RMDIR "$INSTDIR\tcl8.6\tzdata\America\Kentucky" RMDIR "$INSTDIR\tcl8.6\tzdata\America\North_Dakota" RMDIR "$INSTDIR\tcl8.6\tzdata\America" RMDIR "$INSTDIR\tcl8.6\tzdata\Antarctica" RMDIR "$INSTDIR\tcl8.6\tzdata\Arctic" RMDIR "$INSTDIR\tcl8.6\tzdata\Asia" RMDIR "$INSTDIR\tcl8.6\tzdata\Atlantic" RMDIR "$INSTDIR\tcl8.6\tzdata\Australia" RMDIR "$INSTDIR\tcl8.6\tzdata\Brazil" RMDIR "$INSTDIR\tcl8.6\tzdata\Canada" RMDIR "$INSTDIR\tcl8.6\tzdata\Chile" RMDIR "$INSTDIR\tcl8.6\tzdata\Etc" RMDIR "$INSTDIR\tcl8.6\tzdata\Europe" RMDIR "$INSTDIR\tcl8.6\tzdata\Indian" RMDIR "$INSTDIR\tcl8.6\tzdata\Mexico" RMDIR "$INSTDIR\tcl8.6\tzdata\Pacific" RMDIR "$INSTDIR\tcl8.6\tzdata\SystemV" RMDIR "$INSTDIR\tcl8.6\tzdata\US" RMDIR "$INSTDIR\tcl8.6\tzdata" RMDIR "$INSTDIR\tcl8.6\encoding" RMDIR "$INSTDIR\tcl8.6\http1.0" RMDIR "$INSTDIR\tcl8.6\msgs" RMDIR "$INSTDIR\tcl8.6\opt0.4" RMDIR "$INSTDIR\tcl8.6" RMDIR "$INSTDIR\tcl8\8.6\tdbc" RMDIR "$INSTDIR\tcl8\8.6" RMDIR "$INSTDIR\tcl8\8.4\platform" RMDIR "$INSTDIR\tcl8\8.4" RMDIR "$INSTDIR\tcl8\8.5" RMDIR "$INSTDIR\tcl8" # end of removal of TCL-related files RMDIR "$INSTDIR" DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Classified-ads" DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Classified-ads" DetailPrint "De-Register Classified Ad URI Handlers" DeleteRegKey HKCR "caprofile" DeleteRegKey HKCR "caad" DeleteRegKey HKCR "cacomment" DeleteRegKey HKCR "cablob" # uninstaller section end sectionEnd classified-ads-0.13/windows/turt-transparent-128x128.ico000066400000000000000000002040761331670245300230030ustar00rootroot00000000000000€€ ((€ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпппЦИИНДДЁ™ЁЅ™ЅџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџnkfhXVgY[€\OO:H6?D33666333џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЙЂЂ |ng%fUU–Q95U?;ZR99]Q;8pWB@{WEG€UBE\U88 џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџS=;_^JHГWDDуP=<ѓUB>ѕS?<ќU?=џXC?џW@=џU?<џU?<џS=:ьM98сL99нL;;лK99КJ79nG=3џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB&%?&"џ^LGџjWQџYF>џS@7џI5-џH3+џK4-џK6.џK4/џR:6ћN63ћJ2/ћM62џQ95џK54џM98їH53Ђ[EE_кккџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ?,3(H55ŠH5/№H6/џM;3џVG<џdXJџi\PџkaRџpeWџj]Qџ_QFџ[IAџVD=џM;3џR@9џQ>8џF3.џF54ўD44ОE00js\\ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџN99kA'$њZE?џШФЖџтхЯџЯдКџПЦЈџЗКЁџДЏžџ›”ƒџƒykџƒslџˆvrџlhџ|kcџ}pdџqfџnjџjYXџI76џS=;§pZXkџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ“††K95ЃG4-ў`QFџi`SџЃЂџЦЬАџвлНџЕК џжуСџЗПЁџЦвАџЧвВџЕОžџВКœџ­Д™џГЛџБДœџˆ~rџcTMџB20џF32ќQ?;pџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШЖЖbLIЛJ1,џ†zoџь№йџэђкџч№вџуяЮџыђиџёєрџюѓлџы№иџъюзџъьйџэьнџыэйџщэдџхьбџяясџиеЫџvjiџS=<џnXV­ПŸŸџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџqdd|H50ќI60џЈЃ•џundџžŸ‹џншЧџЖИЁџ`WKџОФЊџqk]џЇЋ’џръЬџ“’}џ™™„џуэаџтёЭџбйМџ|rhџ‘‰~џ]QLџC1/џT?:”џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџАœœbNKйO82џЅ›џяѓпџюђнџэёнџђѓтџ№єрџяѓоџэѓйџяємџђѕсџѓіуџёєрџыѓиџыёзџыѓиџёєпџэђлџŽ†€џU?>џcMMРs\\ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџdUU‰G3/ўXD@џгЯХџ‰xџvlbџš—…џ”~џ[NDџЪЯЗџФЩВџмсЪџОСЊџdWNџ[NEџЫЯЖџйсЦџКМІџXJAџŽˆzџJ@:џ>,*џU@<ŠџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЊ——XEAкJ4.џЇœ•џђѓфџѓєхџђѓфџэёпџюђоџёѓтџѓѓхџѓѓхџ№ђтџы№лџц№аџцёЯџъђжџэєйџэѓкџ№ѓнџˆџVB@џdOMР‹ss џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџSDDhG3/ўT@<џФРГџ ŽџI:0џF7-џsl[џXK?џНРЉџх№вџчђдџлцЧџКОІџkdVџœˆџsj^џ|sfџPA6џ^PDџ2# џD1.џSB>†џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУНЗ+gTPщN62џ›’†џюѓмџёѕрџђѕтџђѕхџєічџѓѕфџёєсџюѓкџыђзџчюдџуыбџтъЯџуёЫџхёЮџшђбџьђйџˆzџVBAџiURЇЊЊЊџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџm^^TQ=9јJ61џБЌŸџХУЗџN>7џC3)џj`SџZMBџЎВ™џмьШџряЭџпэЪџЖМЁџvqaџТШЎџЉЊ•џtm]џP@5џG6,џ+џC1,џUD>ƒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЖЊ]IFЭQ:5џž’‹џїїэџїїьџѕічџєїцџђісџэєкџъђзџъѓеџшѓбџыѓзџч№гџущЯџтъЯџц№аџьєиџыязџ|slџVC@џnYUџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‹}}MYGAјN;4џЄ›‘џцчиџ|qhџdUMџŠ€uџN?6џЎЏ›џцёгџчѓдџшёеџЌЌ›џ˜”†џэѓкџщ№зџ‘~џ„oџ‘Š~џF83џO:5ќZGBhџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™dPNЌW?;џ”„џѓєчџѓіхџёѕрџ№ѕпџыєжџъѓзџяѕнџ№іоџъѓжџщђжџчёбџыѓдџщ№еџяёпџяясџыькџymfџWC?џp\ZŠџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЏЈЅMaRLјSA9џ‘Š}џчяжџЭгЙџСЦ­џинЦџ‹ˆxџРСАџ№ѕтџ№ѕрџяєпџь№лџфщвџъёиџьёлџфьбџч№дџОПЏџO><џU@=я]KKDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџeQOŠV@<џpeџчыгџ№ѕпџёѕрџѓіуџ№іоџяѕнџьєзџыєеџшђбџшђвџьѓиџѓіуџѕїцџєїцџшълџпраџqd_џV@>џr\ZŠџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџгЭЪMk]YјJ8.џ}wgџрыЬџхябџтяЮџмэХџехРџкыХџльЧџтяЭџу№Юџшђгџчђвџт№ЭџпыЬџнъЫџх№вџœ‹џN;7џZEAѕq^ZAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџiWU~T>;џwe_џъщпџїїэџѕїцџѓіуџёірџъєзџхђЮџщѓвџяѕйџѓїтџѕїчџѕїцџѓіуџђісџђітџмоЫџaUNџR=9џxc^ŠџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнзгMsdaјK80џwiџсьЮџхявџщ№иџыёйџщђйџьѓлџщђжџфёЯџпяЩџцёвџхёаџфёвџчёеџхьжџъёйџƒ€uџI72џ[FCъ‡wr1џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџzgejVA>џnYUџомЮџёєсџьѓлџщѓжџцђвџфёЭџыєзџ№інџєјхџєїцџђїтџёїпџєјфџѕјхџєјфџпрЯџ_QKџQ>8џ}ncŠџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЭЦУMn^ZјL:3џ†pџкыХџйыУџлъЧџишФџньЫџпэЫџуяЯџпюЪџлюУџс№ЫџтёЮџояЩџс№ЭџтэаџнхЬџkc\џJ71џcOL㓉‰џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџgUU6R=:ь^HDџЖЗЂџмьШџмюЦџпяЩџхёЯџьєйџѓїсџєјфџєјфџєїхџѓїтџёїоџђїпџђјрџѓјсџйкЧџ`QKџT@=џzg`yџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџСЛЗKgYWјM;5џ…nџкъЦџдщПџгщОџбчМџвчМџбчЛџжъРџлэЦџкэХџояШџуёЯџкьФџйьУџзыТџЧгЕџYOGџK61џdOMžЊЊЊџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџf[[]KFиZHAџš™„џряЪџтёЬџхђЯџэѕзџёіпџђїрџѓјтџ№їмџэѕйџьѕзџьіжџяїлџяїлџяїлџавНџ[KDџP:8љ_KHXџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТОЙ;dURяK:4џ~wiџйшЦџрюЮџоюЪџпэЬџсюЮџпэЫџрюЬџряЫџлэЦџмяЧџу№Яџф№бџцђгџцёвџШЫКџWJDџT>:ћkURrџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЊ\NH­[IBџ•џэђлџэєлџцђбџшѓгџшѓвџщєвџчєаџшєаџъѕвџыѕеџщєбџэіиџяїйџэізџУЦЏџXIBџXA?єUAABџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЛЖВ5fWRяN?6џykџкцЧџжъТџкьФџйыФџещРџгщНџйыФџмэЧџлэЦџлюФџлэФџмэХџряЬџъёкџСПЕџZIFџZEAџlYVjџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџSB>†UB>џˆzqџьякџэєкџоъЩџуяЮџшєвџъѕгџчєЯџшѕЯџщѕвџщѕвџэізџ№јлџэіеџыѕдџВВџWE?џYDAпRCC"џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌ"dQNнQ@9џ~zgџзхФџкъЧџпэЫџмьЧџоэЪџльЦџзъСџйьФџнэЧџпяЩџоюЧџрэЬџъђйџьёлџЃž•џTA>џYEAћueb]џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџZIIyUC@ў‚tjџъязџюілџчёвџьєзџюѕиџщѕбџыідџюїиџяїкџэізџ№їлџыігџьіжџэѕзџœ˜ŠџSA>џ_JFуt^W#џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‘…\KFвN=6џ€yiџехРџлэЦџоэЪџйшЦџвцНџдшПџбшМџеъСџбчМџдщОџеъПџйъУџуябџхьдџƒ{uџN97џXBAв,џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџfURr[HGў‡wqџёёшџіљьџ№їнџьїжџяїйџ№їлџёјнџђљпџяїйџьїеџюїзџэїзџђјрџ№ѓоџ†}wџTA?џkVRеœ“‰џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‘‘yUH?ЭK;4џwraџдхРџоюЩџкэФџтюЯџпъЭџх№гџуяЯџфябџсэЮџоьЫџкыФџмэЦџльЦџЯрКџhbVџN;5џQ:7“џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxfbh_KJћmiџьщцџ§ќљџјћэџѕњхџѓљрџѓјрџ№їмџэїеџяїйџ№јлџђјпџѓљсџѕјхџцшдџod]џUB;џmXSЏ™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ—„VI?бL=5џ}wiџкщЧџкьЦџжъРџйыФџкшЩџнэЪџмэШџнэЩџпюЫџуяЯџсюЬџнэЩџрэЫџЫзИџ[QGџN:5џYGC‹џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŠywmePNўzfbџшфрџћќєџјћыџѕњфџ№јнџэїиџыѕдџьіеџѓјрџёјнџёїнџюізџьѕеџбжЛџ\PIџS@9џjVQ„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЛВ­5eVPяK<3џ„nџтюаџсюЮџкьХџвщНџасПџзчФџещРџеъРџиъТџльЦџмьШџмьШџпэЫџЭдМџZKFџQ;7ў`MG‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџzxlaLJўq\Yџрмгџјњъџђљоџюјзџыївџьіеџяілџяімџ№інџъєгџыєжџыєеџэѕзџХХАџTEBџWB<§p]X_џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎЁ›)]KGуH8.џxzaџФоБџЭуКџешСџжъТџЯуНџЭхКџЬцЗџбшЛџещСџльЦџмьШџмыЩџрюЭџбжРџ`PKџT?;ўZF?tџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‚Z`LJљlYTџжгФџѓјсџ№їлџ№јлџ№їкџюіиџшєбџщєгџщєвџьѕеџђїрџёісџюємџЈЄ•џL<9џ[G@ѕ†tmFџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЅ™•?ZIDёE4-џŒŠvџЩтДџОмЈџЗкЁџНнЈџХсБџФрАџПпЉџЧуБџЫхЖџЬцЖџбчНџжшХџныЭџелХџbUNџS>8ўYEA}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™ŒŒPdPNљcPJџУТЎџыѕдџшєбџчєЮџчєЬџцєЬџъєгџэѕиџыєжџшѓвџхђаџпяШџпьЧџyhџI82џ`MGс‰|u%џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ–ЇDYIDјG5/џŸ˜џщ№иџмьШџдщПџбшМџгщПџдщРџашМџЭцИџЬцЖџЯчКџЩфДџЦсГџЩсЖџОаЋџ[SGџUC:џfSO„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџВЅЅPfQPљVA>џАЋšџэізџьѕзџщѕвџчєЮџцѓЬџцѓЯџхђЮџцђЮџцђЮџцђЯџф№ЮџжоРџ\RDџG5.џgSMД џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџmmk]X4p[XT]JG]P;;IJ//0Q==2VGL2PAA#?** ???џџџџџџџџџџџџџџџџџџџџџfQQM;8жA1*џŠ†wџхэеџрэЯџньЪџгщПџЮцКџЮцЙџЯцЛџгшРџашМџнэЪџпэЬџлыЩџмьЩџУвАџXPDџQ?7ў\HDtџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЕЌЌPgSPљS>;џЊ –џєїуџяілџэѕиџэѕиџяійџюѕкџ№ѕнџёѕпџ№єнџъѓжџрэЪџКХЄџE9,џ?-$§iZSџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‘‘‘]UURFF(L==2M;;RP=<ˆR@@дO;;ыR>;ќK86ќJ64їI53ыJ64ыK96эJ:9сF56РE47ЅC56@11‹C36qA59>?55?** џџџukkI85еB1,џ‚‚mџвцСџньЬџпюЮџпюЫџльШџещСџащЛџбщНџЫчДџЫцЕџЩхДџачМџжъТџРЮЎџWLEџR@8ў[HCmџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТМИPp^[љ]HEџЏЂџјјьџѓїуџѓїфџђіпџёіоџъёжџщёжџщђеџпюШџйыТџгшНџЎЖ™џE6/џB/&§f[MmџџџџџџџџџџџџџџџкЖЖm[[f[[2aRUiWHH”ZIIРVDDнS?<цO:8шR;8ћQ:7џR=8џVB?џbOHџkYRџjWOџbNHџVA;џR=6џT@:џR=9џO:8џK86џE20џI65§K98ђD33дA11РC46šL::h[NF{I<5љB3+џžŸŠџеъУџгъРџащМџгщОџмыЪџуявџх№гџтяЯџнюЫџйьЦџеыРџЯщЛџбщНџКЬЈџSJ?џL=0џ[LB†џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпиеPwecљ`IFџЏЁџїїьџєіцџёѕсџыѓжџчёаџсяЪџрюЩџуяЮџуюЯџьёлџэёнџГЏЁџC0,џL70іgVRJm[[UJJ`YVJN@B{M<>ЌF43ЦJ74уI71ќN94џS=7џS>8џXD>џ_NFџqbWџ„ylџЁœ‹џЗЙЃџТЩ­џЧаВџФЮЎџЙФЃџ­Е•џЈЌ‘џЁЂ‹џЂœ‹џЂ—џ˜Š…џ„upџp]Yџ]HDџM84џJ41џK64џJ65ў<*(ѕ0!џD8-џЇЊ”џрэЯџуюбџльШџвщОџЩтЖџЭхКџйыШџмэЩџф№гџщђиџшђиџфёдџтяаџХаВџND:џF5+џfWMПППџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬТТPlYVљT>:џЊ˜џѕішџёѕпџюєкџчёвџхяЯџш№гџы№йџяђпџъ№иџуэаџпъЪџŒ‰xџ/џ;)$ћJ;8Г=00Ї=,+У<)&гA/+ѕB/)ўG2-џG5,џTB8џhYLџ…zlџ”‡џЊІ“џМКЈџЬЬЙџйнЦџтщЯџуьбџнъЩџишТџауКџЧпАџШрВџТнЋџЭфИџдшОџйыУџхявџъёлџыямџпрбџЫЧМџДЌЄџЃ—џ‘ƒ~џm[WџG40џ<-&џ=-%џf\NџГЗ џсюбџсюаџх№дџфэдџрэЯџйъШџачНџашМџеъТџкыЩџуябџц№еџЪаЛџQDBџN96џp[W‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬХТPm[XљV@<џ­Ђџїїыџ№єпџьѓйџщёдџцябџуюЮџпыЫџкъФџбхЙџЬсДџТд­џ\VHџ# џ.џ8%џ@-&џJ5.џG3*џR?5џn`Tџ‡~mџž™‡џДЗžџЮжЙџошЪџсьЭџтэЭџфэбџуэаџтэЭџоьЩџищУџйъУџгчЛџбфЛџЪсГџЫтЕџФпЎџЧтБџЧтВџХуЏџгщОџряЭџтяЭџрюЭџсюЮџчязџъ№мџэёрџноЮџВЏ џujџA2(џK=0џ’{џкшЩџпюЮџряЭџфядџщёйџыђмџшђиџряЭџоюЪџльЧџещСџвчОџИШІџOF=џP>7џkYVŽџџџџџџџџџџџџџџџџџџАœœ |gn%VGL2dUUBN>>1(џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџПЕВPfUOљR>7џЋЄ—џщёзџц№гџшёдџц№аџрэЪџйъУџзчУџЬуЕџЧрБџбхКџмщЦџ“~џF5.џ]PDџsgZџŠ‚sџš•…џ›‡џЗЙ џжнСџдхОџафЛџЮхЖџжчСџрыЭџпьЫџсэЭџтюЭџпьЪџкыФџньЧџйъУџмьЦџвхМџдчОџгшНџЯхЙџШтБџСоЊџРоЊџТпЌџгщОџпюЬџсяЭџлэХџмыШџньЪџмэЩџйыХџоэЫџпэЭџдоТџ‹ŒvџngXџЎД›џйъЧџешФџвчРџгцУџоэЬџх№еџчёиџщђмџъђкџчёжџрюЮџйыЦџУвВџ[SIџK<2џ[IDŽџџџџџџџџџџџџygg;cOM€[LLКP@?сI88ъI8:ѕ;,.ъ;*-Х<,.rџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџІš—Y`LHљR>7џГЌŸџяѓпџяѓнџшёдџряЪџйыУџжшРџкщФџпьЩџсьЭџуяЮџцягџчыдџЬЬИџимХџнхЩџпъЫџкшЧџжчСџдцОџЮхИџХрЎџЩсВџищСџуюЯџсюЭџньЦџсэЭџоьЩџуюЯџуюЮџуюЮџфяаџш№еџуэЯџпэЪџньЧџкщХџдшПџвчМџЭцЙџФсЏџЧтВџзыТџлэЦџвщЛџбчМџбчМџачМџвщОџжъТџдшРџжщУџечТџЯнМџлъЪџльЩџрюаџишЧџгцТџоэЬџнюЬџиьХџиьЧџпяЯџтявџыђнџъёлџйрЩџ_WNџK:3џfUNЊ‘‘mџџџџџџM52LG54Ь@.,џH70џM92џL92џM94џ>+%џ;%%џB00Ыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ~{i^HDўXD>џУНАџёєсџьђйџц№вџфюаџтэЮџцэгџтэЮџпьЩџньЧџльФџжщРџйъУџйчФџгуПџЬоИџЫмИџЬоЙџауЛџжчСџзчФџкшЧџкчЧџкчШџтыаџуэбџцядџъ№иџсьЮџзшУџЩрДџШрГџЬсЗџЫтЗџШсГџСнЋџЛлЄџКйЅџДиџГиœџЏи™џВйџФрАџйьЦџояЪџнэЫџльШџжыСџашМџашЛџачЛџбшНџдъТџжщТџЫхЗџЬцИџбшНџЮфМџШрЖџЫхИџжъФџтябџх№гџх№дџу№вџпюЫџмэЪџльЪџЬзЛџVKEџB0-џ_NHЖ33?(#e?-*дC20џfWPџ…xџЅЂŽџВД›џЙКЅџpeYџC00џUBBзџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџqYY^YB>ўbNHџдЯСџюѓнџэђлџыђиџшёгџрюЪџишФџвчЛџдщМџЮцЖџЬхДџбчКџвшЛџзъРџлыЦџоыЩџрыЭџпщЫџмщШџзчУџзчУџбцМџахКџдчПџкъХџкъЦџжцСџЮуКџЧпВџФнЏџКзІџЖеЁџЙиЄџКйЄџШрГџЩпДџШрВџХпЏџТпЌџРпЉџФуЎџЫхЖџгшРџгшПџзщФџгчРџдщСџвщОџЯцЛџзыФџзъУџжъУџкъЩџйщШџЦоЕџТнЏџЩуЗџУоАџЧтДџЯчЛџЯчМџЮчНџдщТџкыЩџц№жџьѓнџчёжџфябџанНџ^WKџ7("џE2/т?**„@,%Ђ;)'јH94џˆxџЫаЗџхявџоюЪџсяЭџръЭџvk_џI66џkVUШџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџR>7fN92ћrcYџтфЯџьђйџщёдџтяЬџйыТџкъУџвчМџачИџбчЗџачИџеъОџрюЪџтюЭџцягџхяаџт№Ыџу№ЭџпюШџмьЦџЯчЗџШтАџШхАџЧфЏџЮчЖџШфЏџЦтЏџЪуВџШтВџЮуЙџбхНџбхОџЬтЗџОлЉџВеšџИиЁџОлЉџПнЉџЕжŸџКкЄџСоЌџкъШџпьЮџишЦџещСџйьХџзыУџбшМџбщНџЮчКџЫцЗџдшСџзъФџкыШџиъЧџвчПџЩфГџСрЌџКнЄџУуЎџУтЎџУрАџЩфЖџашОџдшТџиъФџиыЧџтягџъђлџъёлџŸ›ŽџB40џ8%!џ7$ќB2.џbYPџЈЉ•џчюеџшёеџт№ЮџпяЪџлэЦџКХІџWKEџI86џuc_‹џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ33N62ЃK6.џ…vџшяеџшёгџу№ЭџмэФџгчЛџахЙџгчМџкыТџмьУџоюЧџсюЫџфяаџц№вџч№вџнэЧџиьПџжыНџбшИџШуАџТрЊџХс­џзыРџиъСџдъМџЮцЕџНмІџЄЬ‹џЖйŸџХрАџХрЏџУп­џРнЊџМмЄџПоЇџРпЈџЛоЄџЙмЁџГж›џ­г–џЗл џЦтБџЯхЛџлэЧџнюЩџп№ЫџлюЦџлэЦџйьХџеыСџащЛџйьФџиьФџзыУџнюЬџлэЧџиьФџгщПџЩфГџФуАџШфДџЩуЖџРсЌџПрЋџСрЎџУрЏџХтБџШхДџвщПџвчРџФиВџ„‹qџ_[Qџlh^џ—š†џЛШІџгшНџиыТџмэЦџмюЦџлэХџЩзЕџ|oџM;9џZGDХ–‡ƒBџџџџџџџџџџџџџџџqaHHP55Q?6R?9(I44I@-)CV??8]GC93UџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџN:7NH2+юH5-џ­Њ—џх№бџрюЫџпюШџсюЫџмыЧџрэЩџрэЫџоэЩџоьШџньЧџсюЭџуяЯџтяЬџф№Юџс№ЪџмюФџеъМџбчЗџЪфБџЧт­џбщИџашЗџХрЌџИж џЧтЏџІЮŽџ„ЕkџЂЩŠџИзЁџЇЬ‘џЅЪџНкІџРнЉџМлЄџЛкЃџКкЃџ­г–џЋа“џЋб”џБе™џНнЇџУсЎџСсЌџХуЏџЭцИџЭчИџгъНџдъРџгшРџашМџвщОџдыСџзьФџлэШџжыТџжыУџйьЧџоюЫџиьЦџЭчКџЫцЙџЯшЛџиьХџбшНџЪхЖџЭцИџЬцЗџбщМџбъМџХуЏџПоЉџИ‟ФлЏџЯшИџЭцЗџШуБџЪфДџачКџЯчИџУй­џ}~lџE52џR<8ЬV==>џџџџџџџџџџџџ­ž™5|libOMЪM:6вH4/аI4.кJ5/у@-)љB-*єH1-№G2/єC/,МE11›H2/fK77%џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ5" <'!џi[QџйлХџхюгџуюЯџтюЬџоэЧџйыСџрэЩџпэЪџоэЧџпэЪџтяЬџф№ЮџтяЬџф№Эџт№ЭџряЪџгъЛџШфЏџОпЃџГйšџЕкœџТсЉџХт­џЊЩ’џ|žbџ‡›mџkOџRh6џamGџnvVџ[kAџ`oGџ€†hџŠsџ•zџ—œџЁІ‹џЅЌџЁЏŒџА‡џ˜Џƒџ—Бƒџ ИџЅРџЈУ”џЏЩ›џЉЦ•џЕЮ џЙвЅџЕбЂџОкЊџЬфЗџвщНџгъОџвщМџЭшИџвъОџеъРџзьТџиэУџйэХџйьХџгыПџзьТџеьРџзыТџмэШџпюЭџлюШџкюХџлэЦџзыРџдъНџбъЛџЩцВџЬчЕџШхБџСрЉџЖйžџЋЫ”џoz]џH;3џQ@7зP;8VџџџџџџџџџџџџˆvtpfRPеP;8џL96џM>6џQE:џYMAџaWHџ]RGџfYOџbTJџ^MEџUA<џM96џH42ќJ65РB1.XWEAFyibAЁ““џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџP?9YE2+јG3*џ›˜„џуэЯџтэЯџпьЫџлъЦџйъТџиъТџжшПџоэШџньЧџлэЧџиьТџлэФџйыУџжыПџжыОџЮчЖџЦуЎџЩфАџТнЊџКеЃџВЩџІЙџ‡“rџ\_Eџ<;"џ<7"џ;5џ2/џ92џ>5#џ40џ=6$џF9/џE9-џN@:џN@:џL=5џRD=џXJFџVK@џPI;џWNEџRLAџTMCџYRIџ`XOџ[VKџ^XKџ]YIџ\]LџgiUџx}gџ‰‘vџ˜Ѕ„џЏРšџРдЊџПлЊџУс­џФфЎџЧцБџЭщИџгыОџаыЛџбыЛџЫщЕџХцЏџЪцЕџвъМџйэХџнюЩџхёвџояЩџиьТџйьУџеъПџзьРџиьУџдщОџЪлЕџz€iџF81џP=6пYI@Sџџџџџџџџџџџџ€~{_MLћ3џ8$ џ^LHџЄœ‘џЧЮЕџУвЎџЪкЕџУеЎџЯмКџЮйЙџЛШЃџЊБ’џ•”}џl_TџN=6џE2-ѓ@,)ѕK93ёVB@ЗO?<]K<<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџQ=3L91ЎO<1џ}seџзоУџсэЮџмъШџлщЧџйшХџиъТџдшНџЮхИџвшЛџЭчЕџЯшИџЬцДџЫцГџЧуЎџКлЁџЙзЁџВаџЌЦ—џЈК“џ—Ё‚џŠ‡vџneZџSI9џA8&џ<4џ?9 џD@%џFH(џ>C џIM+џHL(џ@EџHI+џHG,џDB&џSI9џQG7џNA2џRC6џXF<џOC0џC<$џN@3џTD9џTF:џQC8џQB9џQA;џO?7џM@5џKA4џL>5џNA9џLA9џLD:џTMBџb\NџloWџŒ˜wџАТšџЗжЂџЏзšџРсЊџЮъИџЫщЖџЫщЕџЫшЖџЭшЗџЪшГџЩчВџЦцАџЧхАџШхБџЮцЙџоюЩџу№ЯџнэШџиыУџЭмИџŽˆџJ85џO:5уYDBlџџџџџџџџџџџџЋЃž=sa`мD/-џ7&!џ/џ0 џVK@џІЃ”џлъШџдыПџеыПџеьНџлюУџзыРџзьРџеыОџРеЈџ•Ђ|џnjUџM=2џD1)џH50џE3,їL92КYC=ŒZFCWXBBџџџџџџџџџџџџџџџџџџUUUC((7%J+‡1ГA-$џh\MџЗМЂџлыЦџбчЛџЮцИџЫфЕџЧсАџЪуДџЫфЕџШуВџацЛџЯфЙџасЛџУзЏџЖЫЅџЏНŸџ›Ѓ‰џ‡‹qџ…nџti[џ^SBџTG6џVF:џMB0џJ@,џPM4џ[d@џi€Pџu–\џu]џd”Lџg—Oџf—Nџb”Iџi˜Sџk™Tџ_ŽFџdNџj’Rџk‘Tџp’YџpŽXџf„Mџ]}Cџl…Tџj€Rџj|Rџp}WџhtQџst\џRE9џMB6џeeMџoiWџk_UџXNAџQJ9џTJ=џSI<џMG8џRL>џ^VJџgkSџr‚]џЉzџОкЉџУф­џИоЁџЛпІџЕкžџЖлžџКоЂџНрІџОсЇџНрІџРпЋџачМџоэЫџдшСџСвЌџ€‚nџK<:џS>9ЭO85ZџџџџџџџџџџџџџџџzfcЇP97џM:7џŒ}џrr\џ5-џ-#џ?3*џ’ŽџЯрНџЯшЙџбъМџЬшЖџйэУџлюЦџиыУџжьРџЫщГџФоЌџЏР–џ’šyџwq^џ[LCџR@:џR=6џS=8єP;6ЫI3+B,$E`LFW`LHjP;8VG.+GF.*‰F0+Э0 э  џ8)џzwbџГПœџдщМџеъНџдщМџвщМџбчКџдшОџвшНџжшРџвфОџЫлЙџШзЗџЪеИџАЙœџŒvџpjZџVK<џF='џM>2џT@;џRE7џNI2џUY9џeuIџ|”dџˆЌqџ™Т€џ–Цџ“Т|џ‘ПyџvЏ`џpЊZџpЊZџoЉYџ‚ЖmџŠНtџpЉXџrЋ[џƒИlџ”Х}џЉб‘џЄаџ•Х}џ‰ПsџšЬ„џЮ†џœЫ†џЇдџЭ‡џŠЂtџHD.џLI5џ‘Ў{џЙзЃџЗЭЂџ‘ЎyџŽЄxџŒ–vџtz^џ^^HџXRCџSK<џOK6џMI6џUQBџxxfџŒšyџЇТ‘џМмЅџЃЬŒџЏз—џИм џИнЁџНсІџИм џМмІџЧуБџЭфИџИЦЅџyxiџH;8џR?<ЪXB;Eџџџџџџџџџџџџџџџџџџ\EBпL65џœ”џђѕцџлшШџ™ЃƒџSR;џ2'џC4*џŒ{џЬтИџЧфБџЧцВџЮщИџгыОџлюХџояШџкяХџкюУџзэРџЮъЕџЮфЗџХгЎџЏВ˜џŽ‡tџkXQџQ<6џH3+ўC,&ђJ4,љH3+ўC/&љB,%№C.&ўH4+џI?/џ_^Hџ›Ѓ„џауЛџиыТџвшЛџЯчИџгшМџзъСџдшНџечРџдцПџвфМџСйЋџЏХ™џ˜Ё€џ{fџ^SCџB9!џL=-џM>0џKH-џ]_DџŽˆyџ…•mџzœcџЎgџОvџПtџ’УzџЈбџ™Ш‚џ”Ф|џžЬ†џ…Кmџ‚Йkџ~Еgџ}ГgџЏд˜џМнЄџƒИlџ†КoџЃЮŠџЉдџНрЃџ­й“џ б‡џ“ЪzџšаƒџЂд‹џЅдџЊи“џИоЁџ…ˆoџNK5џhxQџЈб’џКпЄџЃаџšЬƒџЛсЄџОтЇџЎи–џ“Й|џŽЃxџguQџPX8џMM5џSL=џUO@џXTFџgaUџƒ‹rџ–ВƒџЬцЗџгыНџдыОџжьРџХсЏџТпЌџШуВџЋК–џml\џF71џH62ЗSA=FџџџџџџџџџџџџџџџџџџџџџR;8пdTPџвкРџрюЮџояЫџкьЧџЖТЂџqrZџI?1џ}lџЭзМџЫуЖџШхВџСуЊџПтЉџдыОџняЧџляФџйюТџр№ЫџкюФџкяФџйэУџжьРџйыСџШЮАџ ž‡џ‚tkџhVOџ]M@џ_QDџh^Mџ{sbџ“zџЁЇˆџКЪЁџЫтДџеыОџбщКџеъНџЭцЖџЭхЗџЮцИџбчЛџбфКџафЛџХнАџЎН—џ}…bџVT9џJ<-џH9+џH<)џLM.џt{Yџ›tџ‚žjџГwџИеЃџ•Тџ…Жnџ|ГdџУxџ‹Рrџ•Ч|џЊе’џŸЭ†џ•Ш}џ ЮŠџŠМsџ€Зiџ‡НpџЖiџЌг•џЗлŸџ†ЛoџТzџИпžџНтЃџЬъВџЏн•џЌм‘џ˜Я~џЅзŒџЎн•џЄжџЎн•џЕЯџibSџWT>џ†ІoџВнšџЗн џ•Ч~џŸЯ‰џХхАџЖп џІзџžа‡џ­й•џ‡Йqџ{Јeџžkџq€[џ\`EџZTDџRF9џMC6џ^^MџžЂџХзДџЫфЗџгчРџзъФџйъЧџСФЎџrhaџJ:8џJ90ВI514џџџџџџџџџџџџџџџџџџџџџџџџN64пykfџуьгџжьТџШчВџгыОџнюЪџапНџЎЗ˜џЧеВџвфСџгсТџЬхЗџПрЉџТуЊџУфЌџЯщИџояЧџхђбџуђЯџмюЦџфђЯџфђЯџр№ЫџтёЫџфёЭџмэУџнъЧџжнТџЫеДџУгЌџШлЏџЬпЖџЬоЕџньЧџкыХџнэЩџряЫџкэФџоюШџмьЧџньШџлыЦџкъХџгцРџАР™џ}…cџPL1џ@6џC9"џUK9џmmRџp†Uџ‡Ћnџ“Сzџ‰ЅoџRZ6џ]wEџ•П~џ‹Лuџ|ЏeџsЊ\џРwџŽУvџ–ЪџЄдŒџЮƒџ“Чzџ‘ФyџƒЛjџxВ`џ…Оmџ…НnџЮ‡џœЮƒџКkџ‰ПtџЏм•џЙуžџСчІџЈкŽџІи‹џ™аџІйŒџБп™џŸе‰џЕсџЁЌŠџVN=џW_=џ˜ХџЖсŸџЉи’џЧxџ˜Ь€џЇв’џЄбџЂвŠџЁбŠџ›Ю…џ†Оpџ‘ХzџЉж’џšЫƒџЃТџ‘ž|џeeLџLF2џTG<џZNGџ€zrџЈЏ˜џФмБџЗеЂџБЦžџ~ulџO>;џO;7ЄUBB*џџџџџџџџџџџџџџџџџџџџџџџџџџџQ:8пƒwrџэ№сџэєсџвъНџУфЌџЪчЕџояЬџр№ЭџйюУџеьПџвцОџлэЦџШфГџСуЊџЬшЕџШчАџЫъДџкюФџчђдџс№Юџфђбџхѓбџъєиџшѓдџцѓбџцђаџу№ЭџоюШџмэФџлэУџеыОџгъМџЩуБџдыМџеыОџжъРџкьХџльЦџнэШџньЩџлыЧџиъУџУаЎџœš‡џ_TEџF9'џE<%џSP5џo|UџŒЄuџ­Ш–џ–С~џ—ФџРxџy˜aџ?>"џEG'џv“\џŽЛwџvЉ_џtЌ]џ˜Щ€џ’Цyџ—Ы€џ а‰џ—ЪџŒФsџЧwџŠТqџ|Жdџ„Мmџ…Пmџ”Ы|џ“Щ{џ€КjџˆРqџЇйŒџВр—џЙфŸџЃз‰џЂзˆџ˜ЯџšвƒџЊл“џ’Ы{џДпџ„‰mџVP<џbuJџ˜ЩƒџЂвŒџžб‡џ’Ч{џ”Щ}џ—Ш‚џАз›џЮ†џšЭƒџ‡ОrџИiџšЭƒџ™Ъƒџ•Х€џЛоІџ­ж—џ—Йџ{ƒdџK=3џ;,#џD60џ[QIџ†Œsџ˜Е…џwƒeџP>:џP<8ПE44,џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџR<9п†zuџэђнџэєоџщѓйџгъПџСуЊџШцГџт№Яџо№ЫџвыМџбыКџгьМџйюФџЬчИџХфЏџЪцГџЩчБџЦцАџеыПџйьФџцђдџшєеџцѓвџъєеџъєжџьєзџчђвџхёЯџсяЪџс№ЫџмяЦџкэУџлэФџмэХџиыТџеыПџеъПџньШџцюеџь№мџосЮџЋЈ–џoeWџRC7џJ=/џZS=џsXџ–Д~џˆЖrџxЈbџЁХŠџ™Ц‚џ“У|џРxџ“С}џesJџ=;џPb2џ{ЉeџlЅWџkЄTџСuџФwџ‘Хyџ˜ЩџУyџУtџ‘Шyџ‡ПoџЛiџƒМlџƒНlџŒЦtџŽЧuџ~Йfџ‰ТrџЃзŠџЅжŒџАн–џЃз‰џ—Ю~џ’Ъzџœг„џžв†џŒУtџЕиŸџkhRџMJ2џmŒUџ›Ы†џ˜Щƒџ—ЩџФ|џ™Ь‚џ”ЧџЖкЂџ“Ч|џУvџ{Дeџ†Оpџ–ЩџˆОrџ­г˜џЎж™џЄвџЉЮ’џŒŒuџXFAџI82џI<3џKC5џID5џuwbџviaџR>;љT?+џL=0џVN;џ}…dџ”Џ|џŠЙsџ†ЙnџpІXџoЂVџ“П|џŸЧˆџНxџ‰Лtџ‘Пzџ‹ЅsџDD%џ:@џf‡LџiЁRџežLџŽОwџ‹Оtџ‹РtџˆОrџ„Йnџ‰ОqџФtџ€ИgџМiџƒНjџЙhџ‡ТnџŒХtџzД`џ†Оnџ—Ю}џ—Э~џЅжŠџšЮ€џ’ЧxџФtџ”Ь|џЧwџ‘Цzџ›КƒџTP9џHJ+џЅgџЈе’џ–Ш‚џ’Ц{џŒУvџ’Ч|џ—Щ‚џЌд˜џˆСrџ{ЖeџyГbџ‡Оpџ„Мmџ–Ц€џИйЂџ˜ШƒџЃаџ…‘mџaMHџ`MGџ“‘}џ˜Ђ‚џ]`EџD?-џE:6џK86џS?=сRD>%џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ\FDнTA?џГЕ џр№ЬџвыМџгъОџМРЉџЅІ’џ›Ќ†џАд›џЮшЙџвыМџЯъЗџдюНџгэМџйюФџбщМџащЛџиэТџжъСџдьОџмяЦџияСџлёХџшєжџюѕмџцѓЯџрёЧџрёЩџр№ЪџояЧџзэПџжьОџиыРџдчОџзыСџпяЬџйшЧџОЩЋџˆˆpџQG5џ=7џ;<џfrKџ…ЂnџАг™џЇЮџˆКrџ€ИjџЖgџ„ЙkџŠМsџ˜ТƒџМyџ•Т€џˆЙsџ•Оџ^iDџ69џMa0џhSџ`™Gџ“П~џ}Вhџ„ЙnџЗlџ€Жkџ~ГiџŒСvџЗiџ{Гdџ|ГeџxАcџzГeџКkџrЌZџЖhџ‘ЧxџФwџšЮџ’ЧzџТtџˆРpџ’Щ|џ†Мoџ—Щџ…žmџFC(џIP+џ‹ЕtџžЫˆџ‘Ф~џ’Ч}џˆПsџŒТwџЌж˜џ ЫŒџyБdџpЉ[џ‚ЙlџzГdџyБdџЊб–џЂЪџ“Ц~џ—gџ]QEџ\ICџˆŒqџМжЇџЛлЅџ‘­{џ[aDџ6*&џ6%&џ_MOЮМЊЊџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџkVSУWA>џ‡zџхягџс№ЮџДХŸџKD4џ6(џM@5џƒnџЖлЁџУтЏџЮъИџбъЛџбыКџЫцЖџеъСџзьУџзьТџешТџиьФџл№ФџхѓаџнёШџжэОџсёЬџшѓдџчѓбџкюТџвыЛџеыОџиьУџхёбџщђжџхюбџч№еџчэжџВА џj`Qџ?1"џG:*џ`eDџj‰Rџ–РџЈа’џВе›џЂЬŒџ„Иoџ}ЕhџЖkџПyџŽРzџŒМwџ’С}џ•С€џ€ВjџКyџ”hџ>>џ7@џf‹OџW‘?џ„Дpџy­eџ~ВjџЕnџ€ЕmџДlџ‰Оuџ}ДiџwЎcџ|ВgџmЅYџjЃUџzВdџjЄUџuЌ_џŠРtџТvџ’УzџŠКtџ†Зnџ…Йoџ‹РwџˆЛtџ•Шџt†Zџ=>џJX-џŒЛwџ‘С}џ•Ф‚џ‘У|џƒИoџŽС{џ­е™џ‰НuџoЈ[џv­dџ|ВjџsЌ^џŠНvџ Ы‹џ‘Т{џ}›eџTP:џSB9џpqYџ–ИџЅЬ‘џЄЬџ‘Р}џˆЅsџOH9џ6'%џVGHЩ ——џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ~lj\EC§eTOџФЦЏџхёвџЭйКџcdNџ4'џI:-џwpcџФжБџВк›џЛпІџвъНџЭшЗџвъМџеыПџйюУџеьРџйэХџцђеџо№ЩџсђЬџщєжџр№ШџляТџмяУџфёЬџпяЩџеыОџЬцЕџЫцЖџжъРџоьЩџхявџсшаџЂžџXK>џ*џ! џC<)џ˜jџ‘О|џ‘О|џЃЭџЇЮ‘џРzџ}Аfџ~ВhџŠЛtџ‘Р|џ’Р|џyЌdџ‚Еnџ‘Н~џ‹КvџŠЖuџšК…џY[=џ/4џUl;џSŠ:џ~Аkџ~Бjџ{Аhџ†ЗsџzЎhџ€Гlџ‡КsџЖlџyАeџ{БgџkЂTџg PџpЇZџbšKџd’Lџi‰QџauEџS^3џNX2џLX,џO_1џ[o@џsˆ\џs’\џP[8џ21џHZ.џЛ{џП~џ™Х†џˆКtџ}ВjџŽП{џ ЫŒџ|БgџlЄVџ~ЕlџuЋbџuЌ`џ†КsџƒЖqџЅmџW[;џN>0џedKџЋxџŽМzџ“РџŠЙwџЛzџЅЫџ‡’qџJ;4џJ<;ўh^XПППџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЖЋЋ.ta_йN:7џˆrџжфТџлюЧџСб­џˆ’sџŠŒvџБЛŸџнюЬџиэЦџЕнžџФфЎџЯщЙџдыОџкэЦџдыПџдэПџЯъКџкэЧџшѓзџо№Щџо№Щџцђаџп№ЦџмяТџзюОџжэОџмюХџпяЪџйэТџгщМџЯхЙџЭрЙџ’’~џG9+џ5)џA;%џ/!џ3)џJO.џr[џ‹ЗvџšЦ…џ˜Хƒџ‹Нuџ…Иpџ–Фџ—Ф€џ…Еqџ’Р}џ‚Гnџ†Зsџ„ДpџŠЙuџ}Њhџ˜Оƒџr~Yџ14џFS*џU‰<џtЈaџ€Бnџ}ЏjџАjџsЇ_џАkџ…Жrџ}Аiџ€ГlџvЋbџkЁXџd›Qџ\ˆEџDc+џ6Bџ45џ54џ53џ43џ23џ25џ56џA=#џ89џ џџ&)џXb?џkVџ kџyЇeџy­fџŽМ{џП~џlЄYџuЋaџДnџlЂZџ|Бhџ‡Иsџ†Дsџ_nEџE<'џ`WEџ‹ЃuџŠЙwџ€Бlџ…Еqџ‚ГnџО}џ­Я˜џЛЯЈџrlZџD6.џXNIк””7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŒ}{xdROўYEAџЂЂŒџжэСџйэУџйэХџХрЏџвшОџйэХџр№Яџп№ЭџМпЅџМпІџЫчДџлюЧџп№ЫџзьСџжэРџиюСџтёЯџъѓйџйюУџняЦџхђЯџряЩџмэФџнюЧџмюХџзыРџмъЧџкхЦџгсРџˆqџ>5!џ2)џ_dCџŸЖ‰џ}‰dџE@(џ;4џ=; џZnCџŒЖwџ‡Зqџ„ЗoџВlџП{џОyџ€ЏlџŽНzџ…Еqџ—У‚џ€Бkџ€Бkџ}­jџ’Л}џŒŸvџ;9џ>FџUƒ>џc–Nџ}­kџuЊbџwЊcџkŸWџvЈdџ|­iџvЉdџ|­kџqЄ`џ_‰JџCc,џ,;џ&џ',џ:>џJU+џM`2џMa1џL]/џLX-џGO)џCF%џ04џџџ"џ54џ?<"џCC'џFQ,џVn>џzšeџ{Јiџf›SџzЎhџuЉcџoЄ]џzЎgџ~Ўlџi‡TџA>"џF;)џw‡`џ”Оџ‚Бpџ€ЏnџzЋgџ†ЕrџŸЧŠџГгžџНзЊџ‘Ÿ{џLA2џH95џi[]–ЬЬЬџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ yheІR<9џl^RџЪдЖџжэСџкюЧџеыРџУфЌџЭчИџдъРџнэЫџоюЫџПсЉџДиџЬчЖџйэФџкэФџдэПџвьЛџеэНџхђвџшѓзџо№Шџх№бџђѕуџыѓиџчёвџыёиџРУЌџŒ†wџrc]џn`Xџ@4#џ/*џZd?џ“Г|џЁЪŒџЇЭ‘џ|’eџYW=џ=5џ84џd{Jџ~­iџ{Аfџ{Аgџ‚Дmџ‰Йtџ„Дoџ‹Мwџ†Еsџ•С€џ‰Кtџ}Бiџ~Џkџ~ЌlџЉ{џC?%џ4;џU}=џTˆ?џxІfџpЃ^џxЉfџlŸZџrЅ`џwЇeџp ]џfŠSџNe7џ1;џ(џ%+џ.=џFc-џq“[џƒЌpџwЇdџpЁ^џxЈhџ|ЈhџyЅgџrš_џWz@џ6:џ##џ2<џGS*џBD$џ22џ+. џ01џ8;џ>T&џVyDџpŸ`џa—OџsЇcџ~Џmџ‚ЌqџJV.џ?6џhhOџБzџ€ЎnџƒАqџ~­lџwЉdџ’Н~џЊЮ–џВгŸџ›Т‡џІШ’џƒlџSB=џbRTћˆ{{iџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸ•’PaOK№N93џ›—…џсёЭџгьМџЮъИџЩшВџНрІџШуГџгъРџмюЫџо№ЫџРрЊџОпЈџащЛџкэХџн№ЧџеэПџЯьИџвьЛџняЫџфёбџйэУџф№дџіїъџдзТџ—’‚џZHBџ<'!џ,џ. џ0'џS]6џЇkџŽНyџЧ‡џ™Х„џ’Р}џŽІyџ_\DџA:#џAD$џu•_џ†ЖqџДlџ€ГkџˆЙtџАkџŒМxџЛyџ‡ЗtџˆЙuџzЏgџВmџyЊgџЂnџLH/џ24џVw?џN€9џpš_џkš[џxЅgџfTџY{DџOe7џ9Jџ-4џ#&џ&)џ(8 џFa,џV@џc˜Oџ†ВsџК}џ~ЏlџsІbџЏnџЏnџ}ЏmџpЄ_џh˜XџDK(џ-0 џLh6џzЄjџЁnџb|Nџ>P&џ49џ20џ'. џ06џBT*џSv?џn™`џxЅiџg„Sџ75џF;'џ€‘kџ†Бuџ|Ћkџ}ЌkџxЊeџ…ЕsџЦŠџЋЯ˜џЃЩџŠИvџЏЯ›џИРЇџP@<џ5!"џB.+ДYKK%џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџaOM€T?;§aMHџЌЋ˜џсяЭџШшВџОуЇџПтЈџЙс џХцЏџЫшЕџо№Ъџт№ЯџУсЎџЕлžџУуЎџйэХџняЧџгьНџЭшЕџЬщЕџоюЬџъѓкџЬйЗџЃžџn\XџP;5џN83ћQ=7њ8)џ;1џTb8џƒЊlџŠКuџ‹МuџЄЭŽџœЧ†џ‘П|џ—П‚џ‘hџHB,џA<"џdtIџ‘Н|џŠЛvџЕlџˆЙtџ~АjџˆЙuџН{џ~Џjџ‚Гnџ}АiџВmџzЊgџ„ЈrџUQ:џ3/џMg7џJy7џTyEџHc5џFU,џ1:џ)/џ,/ џ*.џ+1 џ4?џE\+џOz;џa“Oџ]’Iџa–Nџ{ЊjџКџ|ЌjџxЇfџК~џАoџzЌiџoЃ^џh—Vџ@H$џ)0 џRn;џ‚­sџŽЗ~џЋoџh™XџiŒVџTh?џ/<џ&* џ"'џ*3 џ>J#џO`9џ9@"џ+!џF>,џoYџl‹Wџtaџ}ЊjџАlџ”Пџ™У…џœФˆџ™Х…џ•ТџЩрЖџЌЊŸџ;-,џ)џ8%$НVDD8џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџИЊЊjXUžYD@џbPJџ šŠџЯнЛџЫшЖџНсІџЕпœџВн™џЏм—џРтЉџйюЦџпяЭџУу­џБм›џХхБџлюЧџр№ЮџЭшЙџЫчЕџИЫЁџš–…џodWџI8,џK50єQ:5Ђ|mi{yidнH:,џYc=џ{ЄdџНwџ”Фџ™Шƒџ—Ц‚џ˜ХƒџЧ‰џ”Р€џ“НџhrPџE<&џJH,џŸhџ–У€џ†ЗrџŽН{џ†ЕsџАoџŒЛzџБnџ~ЏmџwЈdџ­mџzЅjџxŸiџVY?џ3+џ:F&џ4Mџ'3џ%(џ+. џ*/ џ-7џ6DџDX)џYxBџi’VџnŸ]џ`•Oџb—Oџ[‘GџiœWџwЉfџŠЖyџ~ЎlџvЈeџ‹ЗyџyЋhџ}ЏmџqЅ`џe“Qџ;Bџ%/ џWtBџ‡ВxџŠД{џyЈiџhšXџЌoџtЁeџd‹TџRj<џ0=џ(0 џ+. џ() џџџ) џ20џ66џDJ'џSf9џjˆUџ†Љqџ†Гsџ‰ЗvџŽНzџЋа—џКОЉџk]]џ@00џ@..м9&&5џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџœ‹‹_KHžP<8џP<8џvkџЗЗЂџвнНџЪхДџКпЁџЇзџЁг‰џЋи•џНнЉџЧфВџЕмžџЋж”џЗнЁџЬцЙџЧнВџ Ћ‹џeaLџG5)џRA7ѓZE>ЗUA5 џYaAџs“_џx˜eџqŒ]џ_pHџQX7џMK2џ;:џB@"џhzOџЂЧŽџ”|џO>>џT@@џxigЇяяч џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџтЦЦ roNvfcЄ^KHщP<;ѓU@>џZEBџbPKџeVNџlbTџqnXџmkTџedNџ_^FџUQ:џB7&џ;.њF3+гO=5Q66џџџџџџџџџЊЊЊXGD‡3" џ;-%џR\7џzœcџДjџ‡Лsџ—Цџ–Ф€џ›Щ…џ–Цџ–Ц~џ•ХџŠКuџjŠVџEC(џ>:џlwRџ‘К}џ}ЏjџˆЕvџyЉgџ}Њlџ„Ўtџq‘_џPc6џ:=џ75џ:7џ0.џ  џ**џKn3џR†:џ_”MџnЂ]џvЇdџmЁZџa˜QџgVџnЂ\џqЂ_џqЄ`џešSџg™TџP†8џf™RџyЋgџzЌhџБoџМ}џМzџН}џƒДqџk Zџn˜]џ>D"џ-4 џ^yIџ‡ДwџƒВsџgWџoЃ_џvЉfџtЈdџe™Sџ_•Mџk [џ{Ћlџo˜_џCF'џE?&џm„Xџ‡ГvџƒБsџƒАrџ…ВuџŸОџІ|џZiAџA>!џKH.џt{^џg]TџO=;џn][аОДА7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџччч |ll/aPPLaPN{iVUБgURы[JEјYEBќUA>џQ>:џYEBџ_LGџgTM§fULоP@7oM66!џџџџџџџџџџџџџџџЯУУ+yhež\KFџF;+џb^Iџr”]џyАdџЖjџŽСxџ•Хџ›Щ†џ•Цџ”Х~џ’У|џ‚БoџWh>џF>&џHF*џ…pџ}­jџˆГwџyЁhџk‹YџZlDџCH'џ64џ76џGM+џbrJџh|RџF?(џD>&џRt<џQ‡9џa—Oџf›SџwЈgџwЉeџjžYџhœVџpЅ^џoЂ^џtІaџpЄ^џkŸWџXAџiUџvЊcџvЉdџŠЙxџ”Р€џŽН{џО}џ|АkџmЃ[џvŸdџHM,џ48џ]xIџ…Гuџ{Ќkџb™RџsІcџvЉfџwЋhџgWџcšSџtІcџƒЕsџd‡Qџ<;џIF-џ|œkџИ}џ†Дwџ‡Жvџ‘Н€џЗеІџ Фџ‘И~џr‡[џVT=џL?6џN=<џ\JGеnnZџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЙЂЂ “z4wf_K|ieoŠytЂ…srЎ…uq~zyšŠ…eŸ8џџџџџџџџџџџџџџџџџџџџџџџџџџџѕѕѕ„up–cTJўVA<џ[YCџjTџxАaџŒРvџ‡Мrџ’С}џ˜Ч‚џ™ЩƒџТ{џ…ЗrџkVџGC*џ>8џovVџw‘aџ^pHџNX7џ>A"џ87џ;:џSV6џZrCџq˜]џŒИyџˆАuџTW8џB;#џLc4џU‹=џgTџ`–MџuІdџ|ЎkџjžXџjžWџsЉbџrЇbџ†Еtџ‡ЕtџmЃYџ]•Eџi UџrЇ_џ{Аhџ•У‚џŽН{џ…Зqџ‰Кvџ|БkџsЈ`џ|Єjџ@G%џ27џ`{Jџ†ЕxџrЇaџdœSџxЌgџvЊeџnЅ^џh YџhŸXџwЉgџАoџ[uEџ@;!џQT8џ†ЋuџŠЗzџˆИwџˆЙvџЅЬ”џЎбџ•Рƒџ—У…џ–Р„џy†eџ:,'џH42ћaNLkџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№„qm…gQNљVB>џXW?џiQџzБdџ†МpџŒОwџС{џ•Ц€џ—Шџ—Цџ|ЅgџKL1џ2(џ3*џGA*џ:8џAA$џ<@џIS.џ`wIџŠЌtџ~ЎlџuЈbџ‡ЗtџˆЗsџ\oDџB;$џHS.џ[ŒGџmЂ\џhŸVџuЇcџ{ЋjџqЄ`џk ZџqЇ`џrЈaџН~џМ|џnЄ\џd›OџqЈ^џw­cџ†ИqџšЦ…џ•УџПyџОyџ‚ЖpџuЉbџy eџ8Aџ2;џh‡QџƒЕrџlЃZџdžTџrЉaџkЁZџfUџpІaџrІbџwЋgџxЊhџSc<џ@:"џXaBџ‰ЕxџŠЙyџ‰ЛxџŒМzџЊб˜џšХˆџ“Рџ‘Рџ ЦŽџˆuџC1.џE1/УY??џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџgRP{_JHќZFBџcdJџq›[џ{Вeџ“Х|џ‹ПvџœЪ†џЂЫ‹џ‹Ѓsџ\hCџ90џ) џ+#џJJ0џT_<џ[rDџa…LџvЁbџyЊfџ”С€џŒЛyџxЌdџВlџ‡Зsџs]џI@.џCE(џR|<џb–PџoЅ^џxЋgџВoџuЉcџkЁXџvЋcџnЃ[џ“ПџšХ‡џtЈ`џhžSџv­cџ‚Еnџ’С|џЪ‡џ Ъ‹џœШ‡џ‘С~џ‡Лtџ{Бiџx eџ6@џ5?џjŒTџ~ВlџkЃYџiЂYџtЊbџh Vџh VџuЋeџrЇbџ~БlџyЉhџPX8џE=)џapKџ‹ЛyџŠЛxџ…Иsџ˜Ф…џІЯ’џП|џО|џ•УџЋЩ›џumbџWC?џiXU™ЊЊЊџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ …utžeROџ`MGџnuUџ€АhџЫ…џ•Рџ…œmџipQџSI;џQG;џJA1џ;0 џGB-џw`џ“Л~џyЌeџrЈ_џ€ГlџДnџОyџС{џ{Џhџx­eџВlџІkџOK4џB>&џQs9џjЁWџuЌdџtЊcџБlџvЋdџkЂYџrЉ`џoЄ\џ•С‚џЁЬџyЌfџeœPџuЋaџˆКuџ“Ф~џЫ‡џЂЭŽџЬˆџТ}џ‘Т~џ‚ЖqџxŸfџ:C!џ'џi€Tџ‹Нyџ„ЗrџˆЛuџЇа”џŸЫ‹џ™Ш„џ•Хџ—Х…џЄД•џdUQџdQNњ‰zwbџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџржб2…spХePMџdPKџ‚iџ…›mџejKџME4џUK<џf`Nџ†iџ€‹jџUK<џPI7џy™dџ™Ч†џŠМvџzЏfџ‡Лtџ…КrџƒЗoџ•Х€џ‡Иtџ{ЏgџГmџ„ВqџY^AџG?+џLa3џl Zџw­fџuЋcџГmџxЌeџmЃZџsЈ`џrЇ`џЛyџ˜Хƒџ}АjџlЃWџyЎeџŒМxџ“У~џ™Ш„џšЧ†џšЪƒџ—Ч‚џТ}џ„Иrџu˜aџџ\GEŒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€nl™]KGџOB3џi„NџŠНrџ’Ф{џЁЯ‰џžЮ…џŸа‡џu‹[џID*џME/џ}–eџТzџСxџrЉ\џ}Дhџ|ГhџzГgџŒТyџ‹Сvџ€Зlџ†КpџŒНwџerNџJE2џ^`GџzЃfџ{Њfџz gџd„Oџ^{Hџ^xJџVm?џWjAџboLџXdBџU`?џ^fGџ_bGџddJџaaFџ]`Cџ\^CџMP3џLH4џ32џ++џ13џDF)џEG-џEI0џFH0џIH1џNM5џRU:џ`oIџpŽ[џr‡\џIG0џGI.џn•ZџУzџŸЯ‹џ›Э†џœЭ†џ•Ш~џ˜Ц„џ’Ѕ€џcTOџ^IDу`LH5џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ–„UfSQљS@9џ[f@џ…Жnџ›Ы„џ˜Ъџ™Ъ‚џ›ЪƒџЖyџU\7џE=$џ\bBџ…ЏpџŒОxџwЋaџqЉ\џ|Дhџ~ЖjџƒИoџŽУwџzАeџ~ДhџСwџƒœmџRF<џI>2џOU9џKT5џHJ1џ=>#џ<@"џCF,џ@C(џBC(џJG0џED*џAC(џGF-џLG2џKG-џHE+џMJ/џSS8џLR6џTT<џ12џ&) џ17џKW1џKY3џN^8џSb=џY`CџMQ6џEI,џEI+џNN5џHD.џA9(џOS8џ}ЌiџЮ‡џŸЯŠџœЭ…џ™Ы‚џ•Ч€џœУ‰џzygџYECџp\ZЮІ››џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџвУУxheМUA<џOF3џm”Wџ”Т~џ“Ф}џ–ЧџСwџ”Т}џw\џA;џKA-џp…XџС{џ‹НuџlЃVџpЈ[џv­dџw­dџ‡Лrџs ]џhŽOџf€Nџ`jHџ;/%џ/$џ4,џ=?#џEJ.џHO/џDP*џN\6џK]3џHZ.џ\iDџ_pGџTh=џ^pGџy‡`џpƒVџsŠ[џrXџt™]џzЃeџˆЉqџGS-џ19џQi8џ{ЋfџtІaџuЇcџ~ЏkџИ{џs™_џ_KџYjCџJN0џ/*џ,#џ@C'џp•Zџ’Х}џ—Щ‚џŸЭ‰џ•Шџ”Ф€џ‚•oџYJEџ\HFяq_\nџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџˆvttXFBўR>6џdtKџ‰ЗtџОzџŠМuџŠМsџŽПxџ‘К{џQ[3џB9!џPO3џЅiџ‘С|џqІ[џh SџtЉbџdŽNџXoBџGO-џ;?џ>>!џEA)џ;4!џ,"џ;5!џQa:џfSџt `џoZџqЁ[џg™Rџf˜QџyЊfџВmџzЎgџ…ЖqџЉг”џ™Ц‚џŒНvџРuџ‰Оsџ†Лqџ…ГpџEP(џ4=џ_}IџЕlџrЈ^џ€Еkџ‘Т}џ—ХƒџuЊ_џv­cџˆЖuџ`vKџ73џ)%џ56џHP.џpŠXџœЧ…џЫ†џŒСwџ‰ЎvџedPџVCAў_IFƒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџИ­Ј/yheп^JFџTK8џlUџ”РџŒКvџ‰Лsџ“Т}џ‹Кvџj‡Qџ;8џ?5џYk?џ‡Жsџ|­fџS€=џIc2џ0;џ(- џ34џ8@џ>M!џXk>џdyKџPO8џHA+џZh?џvЇbџ|АgџuЋbџnЄ[џhUџhTџx­eџ}БiџuЉcџЏlџЃЭŽџРxџ„ЖoџСzџ‰ОtџˆНsџ€Їkџ:Cџ/;џc…NџzЎfџrЉ]џ~ДjџŒОyџyЏeџbKџtЋ_џРzџUh<џ>;#џ=@%џLX4џFG,џAA$џcrJџ†Ўpџ†ЖsџgtSџSD=џ[GEЗ\EE!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‰yu„]IGўS?8џXe?џŠИwџМzџƒЕnџО{џЏmџl—WџN_4џ8/џBB#џk†Tџ_tFџ*7џ'џ)3џ=P%џSo<џ`‰Lџf—PџyЌcџ}Џhџi|Sџ=8џDF$џl’VџhŸQџnЅXџgSџ`•Mџ[‘GџoЃ[џzЏeџy­eџsЅ_џ–Фџ„Жnџ…Еoџ–У€џ‰МvџŽПyџt[џ07џ0?џi“TџiЁVџoІZџyАdџv­`џg Qџ^—GџxЏbџtœ]џ5>џ55џYoCџrœ`џdvMџ@C#џ==џl„Tџi‚TџA7,џN;9бWC?LџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЭРК)ufcЪR?;џF<(џmŠWџ“ПџŒЛvџ‹ЙuџŽЛyџsœ]џWuAџ1*џ! џ# џ-)џ%, џ1KџLq7џ`KџUˆ@џc–Pџ^“Iџd™Mџl Yџo•[џBE&џ==џb{IџfPџlЃXџfQџgRџ`—LџrЅ_џwЊdџwЌbџmЁXџНzџБiџ†ИqџНxџ‹МwџЂЫŽџdrKџ+6 џ8NџiœUџcšNџqЅ[џoІYџjЄTџdOџbšLџ…КoџWr=џ,0 џAD#џr˜]џ‡ИsџЕzџ^xHџ@G$џMT5џA?-џ=0)ОK95Gџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџzp]LI§J:/џ^fDџ’Ж~џ›Ф…џ‘Лzџ’Ж|џƒlџQ^:џџ џ џ6@џKm2џI|1џR„=џ]IџL~6џ^’Jџg›Sџg›RџlŸXџp \џOZ6џ:4џQ_5џlŸXџešRџižUџoЅZџYCџhžRџpЅ]џmЁXџa–Lџ}ЎjџvЋaџƒЕmџРzџŠКuџ›О†џNT2џ+4 џD`)џjŸWџ^“FџfNџdžMџf Pџ]•Gџa—IџršYџ9Cџ-.џRc8џБmџДmџ{Ўfџ{Њhџl‡Xџ?B*џ-!ф8)%Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщпп{kk­O>9џ3(џBE+џU_9џKS.џLL.џA;"џ31џ??"џ2,џ(& џDT)џnZџS‡=џN7џSˆ=џK€4џXŒBџsЄ_џ|­hџuЇ_џsЅ^џdyMџ?7џLP,џoœ\џb—Nџa–LџhTџ`—Lџj SџrЇ_џfšQџf›SџvЌbџpІ[џzЏeџПxџ„Дoџ‰Ѕtџ:?џ.7 џCj(џV?џR‹7џ[–AџdŸLџf PџW@џpЄYџWo<џ(0 џ8>џgŠPџ„ЕoџwЌaџvЋ`џuЅ_џO`7џ,#џ3&#џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŽŠD`RQх%џ$џ62џB?$џIG)џUW:џl~Rџ{ eџ]qBџ32џ53џ\sCџ`“IџJ-џP†5џT‹>џN…7џlЂYџ€БlџpЃZџešOџ`Jџ85џA@ џcˆMџ]”GџYBџ[FџR‰<џXŽAџjŸYџa—Kџd˜OџiЁTџpЇ[џyЏeџˆИrџАkџm„Yџ+2џ0;џHx.џNˆ2џR‹4џ^˜CџjЃTџbœMџ\•GџiŽSџ8=џ%+џG_/џ~ЎlџyЌdџlЄWџsЇ^џRl8џ3-џ4'&м=-32џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџvtŒN><џG61џLL0џ{“cџБyџŠГuџ›У†џ•Р€џyЃcџKV.џI<*џQK5џe‹NџT‹;џS‰;џ^”JџUŠ=џ_–Iџ~АiџvЈbџhžSџf“PџEG)џ?: џZvAџd›NџUŠ@џXCџT‹>џ\‘GџiVџ[“DџdœMџ_˜JџkЂVџy­eџˆЗsџ|ЋgџN^6џ'0џ?O#џL€3џG€)џV‘;џlЃTџkЂUџV‘>џe•QџQ_3џ(*џ0;џgŽRџxЋdџjЁRџƒЕmџc€Jџ<;џ4*"ќ>/1wџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџжаЪ,poКYGEџM@1џgyLџ“Р{џ‹НuџŒМvџ“П~џ‘О{џjŠPџWO:џRA7џ^fEџd”Nџ\“GџfSџZ‘AџXŽ?џzЌeџ„Гqџl Wџ\‘EџLX0џC9$џ^jBџoЂ[џXŽAџK„0џM‚4џb•Nџl [џ`˜JџhŸQџkЁWџuЊ`џxЋdџ†Жqџm’Wџ:Bџ(0џHe.џG+џB{#џZ”@џrЇ_џZ“BџS:џNj6џ,. џ+/ џQn9џvЊcџiŸRџ{Ўeџ{œdџCF%џA5*џRHHоtmm#џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФМИAyiiЯRA<џRE7џ{‡bџ‰Гrџ…Йpџ„Зnџ˜ФџЄЫџuƒ\џL@0џTC:џ_rIџ\FџižRџdœLџZ‘CџlЂVџ~АjџsЈ^џZ‘AџNh2џK<-џ]ZBџl›XџZ‘CџI‚/џG-џ^”IџižVџlЂXџrЈ^џkЂWџkЁVџwЉcџ‚АmџPd6џ'. џ(8 џM{6џE}*џI-џkЁUџpЃ\џY‘CџX„Cџ\$џX‘@џ?y$џW>џvЉcџhŸTџ[“FџI`0џ.,џ#*џLo1џrЅ^џmЂYџ’К}џn}Wџ71!џM><џ~nnƒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Q€pnОbNKџ^ICџeaKџl‡Tџ…Дoџ›Ш„џЋа•џ~œgџTY9џRE6џSN;џj‡TџsЈ_џpЇ[џiЂRџpЈYџuЋ`џrЈ_џ^GџBI#џN=0џhyRџm Zџ]“IџP…;џ`•LџoЃ\џ}ЎiџˆЙsџ{ЏgџrІ^џn ZџN`2џ)/ џ*>џR9џV<џBy'џgœRџvЉcџd›PџIk0џ15џ))џ@U$џb—KџkЁVџsЇ_џz’aџ32џ<2,џmc_Ўѓччџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпйг)‚qn‹p\Zю_KHџ\OBџlxSџŠЌsџЅЮŽџšФƒџ{˜eџNP2џPB5џd\Kџl‰Vџw­aџpЈ\џvЋbџxЎdџ|Бiџk SџNf2џF9(џ^^EџmšYџ_”JџO‡9џ]•HџkЁXџwЊcџ…Зpџ~ВjџyЎdџ^Gџ7:џ+3 џ@c(џ]–EџU;џI/џc™OџkЁYџNp5џ,6џ,-џBO'џdŽNџkЃWџiŸTџm—Zџ?G&џ5-џg_UлЊЊ”Hџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‹~{]vcaТhROўaSGџkhQџ›Ѓ‚џЖгџЄЯŽџw“_џRS8џXH=џ_XFџkŠUџy­cџuЊaџzЏeџЕlџtЊ^џ]†Fџ>:!џRH6џmXџhœUџRˆ>џZ‘Bџi Tџ|Ўiџ‡ИsџˆКtџЎkџJZ/џ30џ7GџW‰@џdžNџ\•GџXBџgžTџWx?џ.5џ$(џ>L$џb‰MџkЁTџk Uџ^HџN^8џ3,љNB8Ц„wq^џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХПИ(}lh†sa\я`OGџhTMџ„{jџ›wџ›М„џ}—eџWW=џWH>џ\VEџz“dџ}БiџxЎdџv­aџrЈ]џmžWџ>F#џE;)џbxLџvЉeџY‘EџV=џj Tџ‚ВmџŽМzџŽНyџi„Qџ:8џ64џGk*џ`™IџjЃWџkЅXџi TџFm.џ-:џ'*џ=H"џk‘UџlЄXџoЄZџm˜WџL\9џ>5+ўB6.ƒG=3џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ”‡„b~jgТoYSќhQMџbMHџtnZџŠžsџ|–dџVY=џUH=џgYOџnXџwІcџz­eџrІ_џsЈ_џYn@џD<)џYa?џuІaџ]”FџW>џb›MџНzџœШ‡џ€ЅlџRW5џ<9џN\1џ^‘GџrЇ_џtЉbџcOџPk8џ(5 џ%,џџYIDџbkMџp‘Zџ€БkџwЏbџr”\џGB,џHK-џk–Tџb™Mџ\•DџmЃVџЄЭџ•Л€џXk@џ87џ=D!џcˆIџeœMџp˜[џRk;џ6Bџ+2џ(1 џAX(џj”TџxЏcџi•Tџ\oGџKE7џPB=џUC?и]HFbџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬПИ(‹wq€u`]еfPMџ_LHџa]MџgjRџdaMџ`NIџWG?џQL8џirPџqXџ{ІdџRU9џ>9"џZsAџjЁVџdNџxЎ`џ“Й~џ\pAџ11џ22џYt@џk“RџQj6џGI+џ+/џ-3џCR*џY}BџnЁXџl“VџYmEџSTCџNA>џVDAї_KFЃaKGDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄ˜”>olЌhVTјaLHџ]JCџ`QFџiTOџgROџ`MHџ[JAџXN=џ_kEџTZ9џ<6џBJ&џ]‰Fџa“Jџh‹OџZc>џ75џ1.џIL-џWh=џ:?џ50џ73џ?N%џ\yDџ~ЁiџgŠOџQg9џJK3џJ@5џRB?§XDCСbNHb???џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџссвŒzz`vcbГhTQѕ_IFџcLIџ_IHџfPMџaLHџWE?џOB4џakGџFG-џ3)џJW/џ9Hџ10џ.%џ71џ=4!џ;/ џ/"џ' џ1(џ97џT`>џWd@џX\AџFF.џMF7џVJAё]LGЗbOLjdQHџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШЖЖŠwtSzgeЈo[ZѕYGIџ[JKџWGGџK::џO=<џedPџMK6џ8+џIA/џ/(џ, џ:) џK>1џE5/џ1!џ4'џ5,џ) џ/%џK@8џLG8џWQCџg[Pіp`YМhVOSUDDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџдПП ”…‚V€mjЁvc`зiTQп[HFпYFFп]LKпXJCпI=5пI>5пC40пF65пL:;пRA@пN=>пQ@=пYKEпRK9м6.кC6.мj\Vм|vhЦ‹†x’Ћ›•RПЗЗ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЯџџџџџџўџџџџџџџ€џџџџРџџџџџџџџџџџџџџџџџџџўџџџџџўџџџўџџџџџўџџџќџџџџџўџџџўџџџџџўџџџўџџџџџўџџџўџџџџџўџџџўџџџџџўџџџўџџџџџџџџџўџџџџџџџџџўџџџџџџџџџўџџџџџџџџџўџџџџџџџџџўџџџџџџџџџўџџџџџџ€џџџўџџџџџџ€џџџўџџџџџџ€џџџўџџџџџџ€џџџўџџџџџџ€џџџў?џџџџџџ€џџџў?џџџџџџ€џџџўџџџџџџ€џџџў?џџџџџџ€џРў?џџџџџџ€?№џџџџџџ€?џџџџџџ€џџџџџџ€џџџџџџ€џџџџџ€џџџџџ€џџџџџ€џџџџџ€џџџџџџџџџџ№џџўр?џўРџќ€№?€џџџџџџџџџ€џРџРџрџрџ№џјџќ>џџ|џџ№ўџџџџ?џџџџџ€?џџџџџр?џџџџџрџџџџџ№џџџџџјџџџџџјџџџџџџќџџџџџџќџџџџџџўџџџџџџўџџџџџџџџџџџџџџџџџџџџџ€џџџџџџџ€џџџџџџџ€џџџџџџџР?џџџџџџџрџџџџџџџрџџџџџџџ№џџџџџџџџ№џџџџџџџџјџџџџџџџџќџџџџџџџџўџџџџџџџџџџџџџџџџџџ€џџџџџџџџџрџџџџџџџџџ№?џџџџџџџџџќџџџџџџџџџџџџџџџџџџџџџ€џџџџџџџџџџџрџџџџџџџџџџџјџџџџџџџџџџџўџџџџџџџџџџџџ€џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ