From 519fe62c9ade0d6d7166be273bf0c380db0ba62a Mon Sep 17 00:00:00 2001 From: Patrick Proy Date: Sun, 15 Jun 2014 21:30:26 +0200 Subject: [PATCH] Added settings for issue#80 and issue#122 --HG-- branch : develop --- src/app/dialogs/app/configdialog.cpp | 11 + src/app/dialogs/app/configdialog.h | 1 + src/app/dialogs/app/dialogpatternxmledit.cpp | 2 +- src/app/dialogs/app/pages.cpp | 208 +++++++++++++++++- src/app/dialogs/app/pages.h | 40 +++- src/app/share/resources/icon.qrc | 1 + .../share/resources/icon/community_config.png | Bin 0 -> 13744 bytes 7 files changed, 258 insertions(+), 5 deletions(-) create mode 100644 src/app/share/resources/icon/community_config.png diff --git a/src/app/dialogs/app/configdialog.cpp b/src/app/dialogs/app/configdialog.cpp index 0ddf78d7a..1f321f4aa 100644 --- a/src/app/dialogs/app/configdialog.cpp +++ b/src/app/dialogs/app/configdialog.cpp @@ -45,6 +45,8 @@ ConfigDialog::ConfigDialog(QWidget *parent) : pagesWidget->addWidget(configurationPage); patternPage = new PatternPage(); pagesWidget->addWidget(patternPage); + communityPage = new CommunityPage(); + pagesWidget->addWidget(communityPage); QPushButton *applyButton = new QPushButton(tr("Apply")); QPushButton *canselButton = new QPushButton(tr("&Cancel")); @@ -112,6 +114,12 @@ void ConfigDialog::createIcons() patternButton->setTextAlignment(Qt::AlignHCenter); patternButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + QListWidgetItem *communityButton = new QListWidgetItem(contentsWidget); + communityButton->setIcon(QIcon("://icon/community_config.png")); + communityButton->setText(tr("Community")); + communityButton->setTextAlignment(Qt::AlignHCenter); + communityButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + connect(contentsWidget, &QListWidget::currentItemChanged, this, &ConfigDialog::changePage); } @@ -126,6 +134,9 @@ void ConfigDialog::Apply() case (1): patternPage->Apply(); break; + case (2): + communityPage->Apply(); + break; default: break; } diff --git a/src/app/dialogs/app/configdialog.h b/src/app/dialogs/app/configdialog.h index 3af959906..3a41ebcfd 100644 --- a/src/app/dialogs/app/configdialog.h +++ b/src/app/dialogs/app/configdialog.h @@ -51,6 +51,7 @@ private: QStackedWidget *pagesWidget; ConfigurationPage *configurationPage; PatternPage *patternPage; + CommunityPage *communityPage; void createIcons(); void Apply(); void Ok(); diff --git a/src/app/dialogs/app/dialogpatternxmledit.cpp b/src/app/dialogs/app/dialogpatternxmledit.cpp index 87ef3a882..a947570bb 100644 --- a/src/app/dialogs/app/dialogpatternxmledit.cpp +++ b/src/app/dialogs/app/dialogpatternxmledit.cpp @@ -485,7 +485,7 @@ void DialogPatternXmlEdit::ButtonApplyChangesClicked() currentChange=currentChange->next; } while (currentChange != nullptr); } - QMessageBox::information(this, "Changes (not REALLY applied for now)", Changes); + QMessageBox::information(this, "Changes : ", Changes); // TODO : clear stack and apply currentChange=this->changeStackRoot; diff --git a/src/app/dialogs/app/pages.cpp b/src/app/dialogs/app/pages.cpp index 1e17fd272..8bfa9c010 100644 --- a/src/app/dialogs/app/pages.cpp +++ b/src/app/dialogs/app/pages.cpp @@ -32,7 +32,8 @@ //--------------------------------------------------------------------------------------------------------------------- ConfigurationPage::ConfigurationPage(QWidget *parent): - QWidget(parent), autoSaveCheck(0), autoTime(0), langCombo(0), osOptionCheck(0), langChanged(false) + QWidget(parent), autoSaveCheck(nullptr), autoTime(nullptr), langCombo(nullptr), unitCombo(nullptr), + osOptionCheck(nullptr), langChanged(false), unitChanged(false) { QGroupBox *saveGroup = SaveGroup(); QGroupBox *langGroup = LangGroup(); @@ -61,14 +62,28 @@ void ConfigurationPage::Apply() QApplication::applicationName()); QMessageBox::information(this, QApplication::applicationName(), text); } + if (this->unitChanged) + { + QString unit = qvariant_cast(this->unitCombo->itemData(this->unitCombo->currentIndex())); + settings.setValue("configuration/unit", unit); + this->unitChanged = false; + QString text = QString(tr("Default unit updated and will be used the next pattern load")); + QMessageBox::information(this, QApplication::applicationName(), text); + } } //--------------------------------------------------------------------------------------------------------------------- -void ConfigurationPage::LangChenged() +void ConfigurationPage::LangChanged() { langChanged = true; } +//--------------------------------------------------------------------------------------------------------------------- +void ConfigurationPage::UnitChanged() +{ + this->unitChanged = true; +} + //--------------------------------------------------------------------------------------------------------------------- QGroupBox *ConfigurationPage::SaveGroup() { @@ -149,12 +164,13 @@ QGroupBox *ConfigurationPage::LangGroup() langCombo->setCurrentIndex(index); } connect(langCombo, static_cast(&QComboBox::currentIndexChanged), this, - &ConfigurationPage::LangChenged); + &ConfigurationPage::LangChanged); QHBoxLayout *guiLangLayout = new QHBoxLayout; guiLangLayout->addWidget(guiLabel); guiLangLayout->addWidget(langCombo); + //-------------------- Decimal separator setup QLabel *separatorLabel = new QLabel(tr("Decimal separator parts")); osOptionCheck = new QCheckBox(tr("With OS options (%1)").arg(QLocale::system().decimalPoint().toLatin1())); @@ -165,14 +181,42 @@ QGroupBox *ConfigurationPage::LangGroup() separatorLayout->addWidget(separatorLabel); separatorLayout->addWidget(osOptionCheck); + //----------------------- Unit setup + this->unitCombo = new QComboBox; + QLabel *unitLabel = new QLabel(tr("Default unit")); + + QString checkedUnit = settings.value("configuration/unit", "cm").toString(); + + this->unitCombo->addItem(tr("Centimeters"),"cm"); + this->unitCombo->addItem(tr("Milimiters"),"mm"); + this->unitCombo->addItem(tr("Inches"),"in"); + + // set default unit + qint32 indexUnit = this->unitCombo->findData(checkedUnit); + if (indexUnit != -1) + { + this->unitCombo->setCurrentIndex(indexUnit); + } + connect(this->unitCombo, static_cast(&QComboBox::currentIndexChanged), this, + &ConfigurationPage::UnitChanged); + + QHBoxLayout *UnitLayout = new QHBoxLayout; + UnitLayout->addWidget(unitLabel); + UnitLayout->addWidget(this->unitCombo); + + //----------------------- Unit setup + QVBoxLayout *langLayout = new QVBoxLayout; langLayout->addLayout(guiLangLayout); langLayout->addLayout(separatorLayout); + langLayout->addLayout(UnitLayout); langGroup->setLayout(langLayout); + return langGroup; } //--------------------------------------------------------------------------------------------------------------------- +//---------------------- Pattern Class PatternPage::PatternPage(QWidget *parent): QWidget(parent), userName(0), graphOutputCheck(0), undoneCount(0) { @@ -274,3 +318,161 @@ QGroupBox *PatternPage::UndoneGroup() undoneGroup->setLayout(undoneLayout); return undoneGroup; } + + +//--------------------------------------------------------------------------------------------------------------------- +//---------------------- Community Class +CommunityPage::CommunityPage(QWidget *parent): + QWidget(parent), server(nullptr), secureComm(nullptr), useProxy(nullptr), proxyAddress(nullptr), + proxyPort(nullptr), proxyUser(nullptr), proxyPass(nullptr), username(nullptr), savePassword(nullptr), + userpassword(nullptr) +{ + QGroupBox *serverGroup = ServerGroup(); + QGroupBox *proxyGroup = ProxyGroup(); + QGroupBox *userGroup = UserGroup(); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(serverGroup); + mainLayout->addWidget(userGroup); + mainLayout->addWidget(proxyGroup); + mainLayout->addStretch(1); + setLayout(mainLayout); +} + +//--------------------------------------------------------------------------------------------------------------------- +void CommunityPage::Apply() +{ + QSettings settings(QSettings::IniFormat, QSettings::UserScope, QApplication::organizationName(), + QApplication::applicationName()); + settings.setValue("community/server", this->server->text()); + settings.setValue("community/serverSecure", this->secureComm->isChecked()); + settings.setValue("community/useProxy",this->useProxy->isChecked()); + settings.setValue("community/proxyAddress",this->proxyAddress->text()); + settings.setValue("community/proxyPort",this->proxyPort->text()); + settings.setValue("community/proxyUser",this->proxyUser->text()); + settings.setValue("community/proxyPass",this->proxyPass->text()); + + settings.setValue("community/username",this->username->text()); + settings.setValue("community/savePassword",this->savePassword->isChecked()); + settings.setValue("community/userpassword",this->userpassword->text()); + +} + +//--------------------------------------------------------------------------------------------------------------------- +void CommunityPage::ProxyCheckChanged() +{ + if (this->useProxy->isChecked() == false) + { + this->proxyAddress->setEnabled(false); + this->proxyPort->setEnabled(false); + this->proxyUser->setEnabled(false); + this->proxyPass->setEnabled(false); + } + else + { + this->proxyAddress->setEnabled(true); + this->proxyPort->setEnabled(true); + this->proxyUser->setEnabled(true); + this->proxyPass->setEnabled(true); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void CommunityPage::PasswordCheckChanged() +{ + this->userpassword->setEnabled(this->savePassword->isChecked()); +} + +//--------------------------------------------------------------------------------------------------------------------- +QGroupBox *CommunityPage::ServerGroup() +{ + QSettings settings(QSettings::IniFormat, QSettings::UserScope, QApplication::organizationName(), + QApplication::applicationName()); + + QGroupBox *ServerGroup = new QGroupBox(tr("Server")); + QFormLayout *serverLayout = new QFormLayout; + + CommunityPage::add_lineedit(&this->server,serverLayout, + settings.value("community/server", "community.valentina-project.org").toString(), tr("Server name/IP")); + + CommunityPage::add_checkbox(&this->secureComm,serverLayout, + settings.value("community/serverSecure", 0).toBool(), tr("Secure connection")); + + ServerGroup->setLayout(serverLayout); + return ServerGroup; +} + +//--------------------------------------------------------------------------------------------------------------------- +void CommunityPage::add_checkbox(QCheckBox** thebox, QFormLayout *layout, bool checked, QString label) +{ + QLabel *labelbox = new QLabel(label); + (*thebox)= new QCheckBox; + (*thebox)->setChecked(checked ); + layout->addRow(labelbox, *thebox); +} + +//--------------------------------------------------------------------------------------------------------------------- +void CommunityPage::add_lineedit(QLineEdit** theline, QFormLayout *layout, QString value, QString label) +{ + QLabel *labelbox = new QLabel(label); + (*theline)= new QLineEdit; + (*theline)->setText(value); + layout->addRow(labelbox, *theline); +} + +//--------------------------------------------------------------------------------------------------------------------- +QGroupBox *CommunityPage::ProxyGroup() +{ + QSettings settings(QSettings::IniFormat, QSettings::UserScope, QApplication::organizationName(), + QApplication::applicationName()); + QGroupBox *proxyGroup = new QGroupBox(tr("Proxy settings")); + + QFormLayout *proxyLayout = new QFormLayout; + + CommunityPage::add_checkbox(&this->useProxy, proxyLayout, + settings.value("community/useProxy", 0).toBool(), tr("Use Proxy")); + + CommunityPage::add_lineedit(&this->proxyAddress, proxyLayout, + settings.value("community/proxyAddress", "").toString(), tr("Proxy address")); + + CommunityPage::add_lineedit(&this->proxyPort, proxyLayout, + settings.value("community/proxyPort", "").toString(), tr("Proxy port")); + + CommunityPage::add_lineedit(&this->proxyUser, proxyLayout, + settings.value("community/proxyUser", "").toString(), tr("Proxy user")); + + CommunityPage::add_lineedit(&this->proxyPass, proxyLayout, + settings.value("community/proxyPass", "").toString(), tr("Proxy pass")); + + connect(this->useProxy, &QCheckBox::stateChanged, this, &CommunityPage::ProxyCheckChanged); + this->ProxyCheckChanged(); + + proxyGroup->setLayout(proxyLayout); + + return proxyGroup; +} + +//--------------------------------------------------------------------------------------------------------------------- +QGroupBox *CommunityPage::UserGroup() +{ + QSettings settings(QSettings::IniFormat, QSettings::UserScope, QApplication::organizationName(), + QApplication::applicationName()); + QGroupBox *userGroup = new QGroupBox(tr("User settings")); + QFormLayout *userLayout = new QFormLayout; + + CommunityPage::add_lineedit(&this->username, userLayout, + settings.value("community/username", "").toString(), tr("User Name")); + + CommunityPage::add_checkbox(&this->savePassword, userLayout, + settings.value("community/savePassword", 0).toBool(), tr("Save password")); + + CommunityPage::add_lineedit(&this->userpassword, userLayout, + settings.value("community/userpassword", "").toString(), tr("Password")); + + connect(this->savePassword, &QCheckBox::stateChanged, this, &CommunityPage::PasswordCheckChanged); + this->PasswordCheckChanged(); + + userGroup->setLayout(userLayout); + + return userGroup; +} diff --git a/src/app/dialogs/app/pages.h b/src/app/dialogs/app/pages.h index f709d6c79..a54d77fe2 100644 --- a/src/app/dialogs/app/pages.h +++ b/src/app/dialogs/app/pages.h @@ -38,14 +38,17 @@ public: ConfigurationPage(QWidget *parent = nullptr); void Apply(); public slots: - void LangChenged(); + void LangChanged(); + void UnitChanged(); private: Q_DISABLE_COPY(ConfigurationPage) QCheckBox *autoSaveCheck; QSpinBox *autoTime; QComboBox *langCombo; + QComboBox *unitCombo; QCheckBox *osOptionCheck; bool langChanged; + bool unitChanged; QGroupBox *SaveGroup(); QGroupBox *LangGroup(); }; @@ -66,4 +69,39 @@ private: QGroupBox *UndoneGroup(); }; +class CommunityPage : public QWidget +{ + Q_OBJECT +public: + CommunityPage(QWidget *parent = nullptr); + void Apply(); +private: + Q_DISABLE_COPY(CommunityPage) + // server name and https connection + QLineEdit *server; + QCheckBox *secureComm; + + // proxy stuff + QCheckBox *useProxy; + QLineEdit *proxyAddress; + QLineEdit *proxyPort; + QLineEdit *proxyUser; + QLineEdit *proxyPass; + + // username and password + QLineEdit *username; + QCheckBox *savePassword; + QLineEdit *userpassword; + + static void add_checkbox(QCheckBox** thebox, QFormLayout *layout, bool checked, QString label); + static void add_lineedit(QLineEdit** theline, QFormLayout *layout, QString value, QString label); + + void ProxyCheckChanged(); + void PasswordCheckChanged(); + + QGroupBox *ServerGroup(); + QGroupBox *ProxyGroup(); + QGroupBox *UserGroup(); +}; + #endif // PAGES_H diff --git a/src/app/share/resources/icon.qrc b/src/app/share/resources/icon.qrc index 7f8e280bf..d0a47eba8 100644 --- a/src/app/share/resources/icon.qrc +++ b/src/app/share/resources/icon.qrc @@ -54,5 +54,6 @@ icon/individual.png icon/flags/nl.png icon/flags/it.png + icon/community_config.png diff --git a/src/app/share/resources/icon/community_config.png b/src/app/share/resources/icon/community_config.png new file mode 100644 index 0000000000000000000000000000000000000000..fffe949eb67bf9ba6df8183be9978f6ceae8ecef GIT binary patch literal 13744 zcmW++1yoag8^6GSQ8EE(gdq*m(mA@jly0O$y1S&iyOdVCLAnv?1`!aD1`+t~`)&7b z=WJ)Y@qgkMPn4>%3=SqKCIA39a6qXcF!@M$ z;nEAW-se(M5VGNdNR+s^z}OdREZEVQi|D)XqPURa$mr4gEuUiBA00P8Cmz2pi0ps9 z$ZecL?}1{c$#SW^3B;~MynMbHGBhx_waY3Ngh}HBz@UxhaMy=dNWiVXkPtI<4|*4X zh)E*_=4Q}o00j`hc+AXn z2T*+t7}E#*oC5-LZ!>+6fOjeI7f1z(02RJPq$FT12z;K>j+O#+*#QDeg#mtG@io9M zr(-D#)HMS=lQ66X0E!K;t3`$}0uUd-c=**TParfCAdo)S5jtb8f$cMacPg_%sFj9a zD(D^bwKKYo4(m&XNjV~B0v;1&lPodTKCes?&LD2w&5LmWC`fz(UhTz$=j5}R$w{8L zre{X454+Kxs7+0G9`~j`If((lmYe^~BMVz2X`molp#5VJ?Fq!%5Ub$BO^js&uGm+g z;9yzj!s)+zBUPBty0o;nySpeqfOuyzs^j-))o0YB^I&)9FZA!`YO`ybCWzA@NCtAd z**AWvSV}&Xgb`}G`ZHeUUo+OzKZ-f(0XfrFT_%DZH9Y4y$*kB5&Qj_qL=xjS+Sw=b z?G2WD6p@WLK;3&0B%j3B6$WM~*9!D7UALa?8vr}tv{7^j3ILJ?K}>bxWS70fEInxCy{N0bSpST9LJ>3reFzu=(>##e z#hCGPFoGd`qK<;enC-h51$U2{b$GJVGuA$>mS@6FxPMKcdA$rBK^PG6VJN-{d^r-y zG+Osn9F!=xcD3&D$_p&E%KP@`5zd?U-D9<52GB};KG?1Ic6p)cK*C^!so2LB81 zkl{!PYETpYj{Q}lwSt#4RJsUj+T4vJE1s|*d)nm-scd)Ap21)C*KcloqU71bQdqD7lqVTy(n_HIjRr1KPxorbFe+ml~^KjU1?r#4s*Dl#E{QMne zuBn)F$*smVgZk)ud6GTY9`_!aMFyw1R&kd4T1BDe^EdHt5!HoF>a}VS75LmAviK)L z2;~$?tBX?SNUe#iZ)|FRxwSoCOMR)FKCLr5b|CXB{TIrm2R2Uli;$s6D+ZEmVsv6F z5)b0q48<~%xfqfmO?F<6qm2Db+)PI;U8W``-xrCan5puqbg5)aY?_r-WmW4{SXvia zW18`mh8lh~(pp>^JCzvU(>`fc<*FWOkZD*|3RXl^Syeb{ikA56Jw&1D^(*$PNR+4* z)En(|3{qj4ku-X;z-@6pg?|WoGeB2AvE=K{)SmG`(Ht3Dvf64vW9yA~9|CV3LVC$kaV$-0lU{4YYeS72VC`7?Fv~s2y_$iy)|f*uFkEd{n1|C zUjDqiRXJJtQ{E4&{<^cKk*3OKlDfS`w3V7B`zAjVD^nt?=5ICqC&``3er-OMAYxwW!eFomF^U5YLRQF34e@nz$RBCdrroR$g0&f z;6_Jrre<|JY@f1Ep?F;9=n zb-I68VpDBzMieVQmECsZv%iXjN|4pp{a0*eY>7J63w6z<9#uCcr$i#xA};wmB0EC7 z>zwO)M&rCa&BM)OD*cXmMqwKg0k59SpS+)Dfbu|EBrBAtAn~Ag$oIG2zVPliQGpeU z>xQLc@z{b^@fYIp!PUWgz148*;ok|>@SFXN$;3&UXJM-TzkW=koBTA1>G#K`4~q!X z2^WoXiqs{Y;YfeuF|#V+x*_>jGEH(l+loVlzxK8K8zzw|*7rioylvcVqJylKdgJrD zxw>+83grB(Of@_Xc3m6)jxQp%bGNZ}e26mGh7Fv&3Mcz6!^#OOS@Bo|(!>-amHATs zh{KpF2xDo_@jYncFunRH`mCtgW_V^I7bWzWUMioZuBBGk(kB>J+C!QoT8q1dS~@Js zMfko*-rk^E+1~kh2xS)K0sYmpriIq;^Axkfn(FaCn2%(h4N-PI=AL@I#^J%y z`j|7g{mMzwYxm#=W8>x}j=-{etk35y^f^j*3M&e>_lT_XEa_~GtowJS@7h$xMP_~+ zu6zHJS)s(u;TF>KlE2U#u~|L{o=dhmpNh>*&GqwVy<0V2DQfcBH=EpekL!5a26Nk* zm3oTV7wiz6)IV==J8xLo!`Eri$*L7FvOjb?6nadaQyFT{Y0s)@)wgXu@$UTUV|jBx zmd87}cG>B5M)>q&K965`t@Fa$@#fpj)du03zYG1tpAybcuSMj(KsPUQcW8paAM|pfA{QTRZE)NI)$|a`E zr|9yC9*Z8wYKREg{BP%v7A9vhW(w2K)04aHeM=t>dyYtIR|fkAUv`ana&Z`5YTqCC zdaQa-oEC53s_gnw1u#5W-_>7fOqbs$lO!iUK~OR-{+V&TUI7s%nyG?}B=Gd#v!Js) z8TIADfD$@oM%vEF_bJj0H6ZoB*is7m-qaf8@^_yLJaL|&=vv;t;ZY0V6*hOLOP}@=K!|8o-)!S0-W*W!dk?-aAT9s{W?T0z8 zQ+K(?JiQw|O)h)#`mPgiBqj|496L%9+{Sw_C9}#S4L}I13zjY>fzx5 z=t1gmUHh=G=JQ1)+wBYf(~?#GH_?YV(XBk66L_U&w3e2ZT0i^uuCA_3hvxh2s;WHb z<^aBmkh8vx4ddw8SiSevd&y!oAP`0k-K?+xdN+ozDWA?Lv9SAf@t_c8*4M9vMToJP z=I7@bn3#~w#_4zfV1j{jRyFun-Bn+WxFJw$>UN zb8=Z_o$NNVCF#seOnHeGccNi1O5~P;nwm)uz6>W#uFd1-4KzSgOKX0#LI0K9EDV9m zVHxL&fbwa+fQKq}UoYEszVcfjGV%@Lcl~Mn_wwNO-^JAY=;$bIXaW&-|84l#Uf4%FBzx8>#KeX`K|5e5_P z{ySfLZ8Z^`jD>~e_@RC6iAoNSZ=WQ@5f=`@?gz}UQ`EV6c#2wENh&p~^40%h0V-_o znpjM^Ojw`?6&5|=IAl)$&W3g-csGP>etg#JW@Kj0cEn#F0m{WEwIz)Fu3lW9Zr~a$ zJdgP{J7fJtg#1}V(ug_MzAqQJ!AmU8w!hJ%AqN?G3gz)9(e$#%nhZ?61UAn+rmvZ67Q3Z}!FtZEiYt_)5gMT2%a<>2)Ar6%W^)!riMEdIuYWHAfo=jH zby>^_e-M6kd>3Aw_4oc>O-l>4 zdFA8JpO$X!?vDgLDd;afH-l_zJFg##2hrR-Jof#Le`Y(rJb(H*k&OhD=eR__w$PxF zV{#Gk6%kCBAeiKLGeCz!3~PzN6wVO#;Zf$>g0Sefz%KTu@;SWDcTevg9x-C;b3&(h zQGTBuo}NZ*oDK~{;TIkWfB_j-bEHH5CeKMl1y^1{;rT~t;gx1bqw~l6Q;CHS;?O16 z75nCgyPEcsQOE*o_dl2M3=R~a&i~=>a$jE`B_RR9KUFO)C|p`f?9RAyf;`*vWjy-M zP`r$V1+865vcjxPHpaDaY++^Ph-LJ%%^R7I&mHXTrIeI#1Ox?7q0z@oPfBNmQ>naY~B=4Pit(w-*1{C zjdCl>l_x98c$$anb?tWnj~Ds9#Q32J-7H33|6=P0V-^!>{C#``t3G|2nVK>uEKiBwLGjX z*h;g`(}FI5W%pAyDfHp~#%v<%&9&>p+4YK}=xIe{_{mZuI*=e=`f`@rKJ9hkH46Kn zs)j}gnC>jPbv>n3hru%gskkS>?CYtpS++-M+_#kznv<-wuJ78^DF#e-s+udRbSE*--k1%qJc- zI*#V zA;Hog4>NV)*Sj+u<3*9~zbJ<1>MQ>76w>YX7k>NptuZkguzIty@p!ET=r%j7E%2gb zWoI8h2xpbO-pxt&RnJi%wO`9o*gikTHRst)di2E}*5;q|!HDQzY_PymuOx6YI7N37 z1@wK6zZyBppI^?Y$e5X#eJ!)u$AYh#`Q>Xoz!2fE2=%Pw+g9>w-$8!C=&YE#V!3X= z^<#IltHb%oZ>F0$5^5=e>Xn*ofY6^F6r%t>@6i-S`;=K61k{g)TqJ8ha|&yMZZqic zsot}rb+g>hKpCHv{zg>Ex07My>B5B*Hp$Y5tLjPo8?36+0 z&v_^%q?2#;tLPWJ?mNNM$F!Wt3d`iODr#!FrU%pgaz=(ym?4Wo`vtexxw#La@9OmQ zpGp&AD}2PW;c3D7I3?Bl0Q%>}GYsB7K45Ma9+5%||NQNMq6IUsu|WrG2ngxxG_y=yJNi+saD=R+qf$LmTLinehH|q;SfDfT!o)AgOtN>z|x4N%F z?aGbSXOpG_hV19(XZ`*?LO}tmsQy>Mlo(5XAf6bIqNb^>X}bKyhFH}9AG>CXN}uZ< zQclvTZ@3s$U|!x!_CepUurMMN&)fEmhZ7{O%}BHz_uq?WMr}3umY>?{Lvihjmi6f6 z8BObnyOtkcWO?xRvt!F9K}K2nH0~b=LV@ppS>V9h^w!1SI^$ksO&uK+fLke~%m%El zjm;6s7|I0ZSYZ-qNj^R$RiK)9c6PE@k0R*)8z_X}nU$qz zAY0-uQ;QUu58D+Cq%gChMU|DlAs`^w1R+<%&`v#v?>b2W77Tl4Eh+Tz(f{{S<4_Zh z%BtI(QaYve`gWwn!0+)i*!C0xYW8{7vHTSn|IxKg0TxxSMg!p-1>)N)JjPB_Jq?<~ zv;;{k@Y#*{D@wmmC%znxp4LIx8>|1iAr!(nU>Te1deXYjbp51b@L}Fal)%JsrOCd3 zwbix$!;v=bzAx>5hayz`H~I)YJQVh;EiPBkqsU}mc{oXkIK`~#vat|JP{30$bA)A- zT+Rmx3SC6bQKXw$S&2zXN{Uq)miaehs#aA+P5Kcr#|=Ytyo}#3?)14iiISxD?GMM{ z-}(c#xo{BtydsMOI|10`$Jt{Ub6k@?O1e~1z#-SiD-j0m?&4{*$vsq=4+*jr$+zYS zNF-X2KqqAO7$ki$7_u}5bs`junjjER;Y7t+7U%hPMZ9LI)WqD|+XL&x^aqMw<3Cm& ztIk6m=A27H?CjIeF~j=6h%E%+&b9yDUiwJR3qKk4Cr2<+V``3E8@lP!*R5jVcv1hs zU|AacgbeOWQu=y5!WqUfVw3wfWV6eVA0H^%OnTVetZi@rcE3S42qp@Mz9dQlX!-28St48R$Oo$g}>QJih-zJVAtqi{DhhR!aji{KCm?6X%gJ?z)KI@rH z68CJ9hdYSPp>LHHl1;y+^Yk+u&*Hb0wPaawCS#1wW=1G5h7~a+&@d(k%9qc{ma1>& z$e7hHo`BG%8L*b4OSX;Il~#m0x0w*T)F^86pnxkKe_afgfrcW!%~Fj$*x0RJ9w($| zhL54}K#Zy`UUhqB_HF5*OQ!US{Ituc5?!!)S>eOoSr8wh5Qd3~8D5!JFRgQY?~&HG z_(n-N_2A}y>*oHUUf0g>-MbYbEC{)WF3BG-=bwo_p2Z($XHW6#G+bG-qB%{@%&eP~ zGAXHN&Z=-ubA|MNKmivjQj!{m_(w~O-KDOkRBWaFN4~`)tbAuGIYnm<< zF^?5PF}MQ1PEMpjn9FWu%RMsn!9XOimtTfDahT7^{ffd&QIG}O^RTkq>7X>-GVG3(So0Dbo*iwuDeOg=v|ttP#8KJwUmW71{D|ykcW&$CG)e|Lo55mwe1XZYAnuXWi7+d!$2C(t;c;kFE z50={H+E`!R$mA$#+bnk$ZEUz8f=Ur4VM2hZplr5m}WJa=Mbh z&I6MOD4`66$tGRqg9s`cX)_p$wdXWIR2Nm(z~EzA8X*kv1uPTQ%N-UMQaKmYA!N@E zDBu5U?LD^a>PX5~36>E|A9HY;%&qz;7ZKXJJ z%I`p60tK|I-=^L)uB@#5M>Mpwd~(7%>#*x^WH8{9-8?D~o6-B#M0ZWxS1+xX zKRvUuLWY~?+qZAmR*GkLzU*#TUd|}NxF7A7lWG~{(K0_uPuIhIXg2oiCIKrvzb_;S z4_ObJQRaQ2d34s}RPaG!O|7u8z2Gt%7y@LZ-yy(dtb0JBYzau|O|n+@UJ|~a9Js_m zQB2xAYuR#X<%EaU69#g;mCE63qrFD{O2eDDu=0j#>O*z=!$YHlV1*xA|t-~e29Xv-2>^W(-Th%}npjxNQt zF`kym#N6UZ*4!zcf!0{}m)tZn5*bJ->hg`*@N=#7y|K{DXT)DQjVux0;=D)kLRb|3 z-1&lsO|bAPtg3RgM_cvS@ar$Bsi=U~>wczMCF**cW-+2|5?zH*BdGXcSRd@4q7Feu zBD1gvPyTh6u}Q8R&R^VdeROSAHfNJ4Um99w(^hlTj{6q%+m174;I6vpo#{bqT=EDF zjUKX#H7f!Gvj6Aaj~$!B&(8!3XKe@R3eT$V#e|?k%T~CFcXMfJSQw%(K+g7n>vw|F z&pcujUQaq5J7V%!4oFC^qR{Y?_b&GIN6qXkm9=Fl)T`hQy0ZXJQ8SLb>SsPEL^M)czk##2&WdI~wfLw8eJ z^dEyBjAJ=8*7*dbC25`pU^ zO3Ex#^NR5Np36uX)7ZxF+R6%6Kf9`)UM8c5b2!F%>a00_fUz-(sX%i0OA|8--&-|vzYzneAmLESR1(}IrJiz!jc+KzKfprD~aUHD?0tDDQD zFEmC$K_MOsg8VI(LlhqRllc_HM?6GY+junb5G^e(fw>>q%4}Rj4a2A;LvJI@oZ^1` z(7wFBHeK)VlBK~b{!#uD;RT`}$LYhz33Bz*8ND$xKmA7h!+GwC=St97qO~+>?#z#K*skSS6ecccg0HN@% z&iC_GxIm+hG0Waz1TB4s@0|-6O7LU;c%k#*7?1#fe2ZouB{eP8WF{)6Cz%}ae93J} zNtQ}O+w{J{^w+xyIJu8WSYgziC{bXcjcn70kY*1=a?n9JtEBv#G_8M)WM`-D5GXH& zOHv1!b7t=5EC~Jk(_e^ExMngEx#l`0oM{GfbzPQlS(=8*f`U!T<5L)d${w1csU&7D z##=06!y)-rs_BaWjV^TMf#UPobJGOczR^2O!7WocBHFaGH`u?QOa=eu1rUV^qo~rS z6wet2Chb@v+q~XU{n=o2XKDa0x_>t%YdY3}oA*U^^E#=(&8q9!vTg0d2a*IWd`Tn* z5Ln+gbad$J5YW2rJO(2mF$#sHsG&?$vAs5YG$sz{6T`-LFH7r+N+AT6Su@Iw8m2x| z5*pnD96r>AB9{&;ae*abE(g{}2Z;T{cvbg4JLr4!1VwilWmc7ZSTINv22AT?FUqP8 znSjhv!Y&>(U4(3Yz~kL(`Wz>Om71Db&;$ELTxO7Zs(1yEL0slC45j4L&lDu@fe-b6 z2ngVd9ZVyv+bJ(PyhXLvyAtv4b52Qp@l0-(ufE$a2P;}#erA0=PLs)ki)NJAhXgnQ z5fBRXkHiX`7tuu}fLnO~7BAm^77STRN{WG*8D#-!64Fxl;c9c!D;!2V!-T(26%wKz z{n#b)+s<0-?Hs$~qY#8}67ete?R3;$#=q(vB-Ze6Pcm3QMxabi zf!=7o^t=)a#II<;_k{&fjkj;TqlR`E^91|^LZ3m?R+cTv=6!3ijwll?3Z&95HS`cn zB7wQ>?m;NJb;d}m4!oei6fRkbK3DFCHJ?mpPMnat0cbo1UzC2AzLEi?K$Pf#!q)uwh+U5Qc zNV0RfJ`+j7R*SeBq2D4a&%@M8sss6xo4Z@Vmkx4#t8w5(2p^9QF@L*OG)H(`+_TRH z?S!B<2x=+*-A~toryY%VC+(*q6;k@RL@2-QqN_17YK|P_l9)8LaK_QrBK5H3KS6~$0(Z5g{Ke*!xJn>zPJ)$Sh<^fpbX=3hx{|AP?{~7=N`%y-#JhI+m0b*Jvp(3A2_OOT{l+=U^S|6) zMj^A}?IX*vCU8P#^~H9O(TLaws7Ogir0Dgk=zLV=#a@s&u6r|IcV6N#g#qZ(Ao)b9 zc%1YQBbJ~dmIN6^!n~feDS}nnY4X2R0`+{we#+9z>%FmbB60?Zus%=VPva8jvu~m; zb>6F<&1Lw+coDMMZFw=hw>VRt4Q`S-2bU<}HW)|@B5Xe%?sKiZf0Cq>s~3b8Q1rY6 z^5!OcO1QeQ@~2|JdYn^bMWdBcdtx=2!@t<>!S96(>5m`SfG4`S)EqbS%=UjUh~^ zn89JXH@_TJpZ-WNd<@;9hO7bCP^7)kFkPoJTvcM0zLqM?l+-i?DJ_mjT9z^#0;>3- zFlz^gCNiO)ps4(3zOAiodbU*I?4UgVQOhzA$+(ASFhxDnHSa%9g_VVw4NEpBkjuHn zEP&+qDJw&d3|m*^F>bA-+Nr-Mh7>O38Uu;LmXOfk{MBtRQVPL~0tVtxmN9hAvECJ~s~F)DGYN4f5@J5LJ=HSEN-_u}F>|6a0=|M-#m9*}@(t9KPh^W!}QK=OMU%wz{7Lh3xGas33kY>lesT&O1)CsXBccy3qKQu2BjGoWh)RrF_HKKbj;wosJrMWO%+J=&|>34$6fMRVZdLEDhzSt9z*!_&+E;S{93V@7E;wdRaM=<<>j~F`aY}Fh(N%Ft{2U&F?($g!_iuwwAVbAEYdB!8RAl&55|S(GQ4IKS8%1%?R`^quWHSvagcqbk{f7x6V(a+=GhcBtQ7Pmzr)(Ss4OBT0cWa1XF_oS~&qaG?n7Q>7FY^u%XHs}pz%d(98&b{Lm4 zjXDfA#=m>_4pfDle%B8niv_#-FI+7cQ3@CF{3if`vbz4E2JBx0Z=T`ja-~l33^~52 zOgM6sx@<}yhv}j3wsBzRa@3whqR`;f^ql8W+*3rFj-mKRm~m)<2J|(jN?sp@)nOhxY_4UuQdF(+d1F#p^ENhLWvjtf0jiy@L z*$qhG3cKBs{OSFRL$d9-)^>$Q9ZN~TSp-WJV+SOAV1b}b_KXGx1&x=3nJ8p1P3=8r zbQZ;LJg%GZ_iCk(ObhhK`$U<#ivugwLL0gt&5;4)wCTowZOY*S?8YBns)OmE*coro zDGYhz6z3@v2TGul)X&X88!)`8s-d&btf}4|Z+)Z!Tob$XjwL#O-MKGgX>3N1Lq4aS z9*b;G6g+6)7bKwBgbw&#-w|zm$Js$MO>n8ghb^(7G{@LlATwy^r3%Cp8`Hmo@F`l_ z2qb(bmm`L$T3)-_KkXW}|s0T_`zW7S-;#u*t< zpj=v*-;Bu;)|_%pg2Uc#TH}unyv-S$a3SyVz47z)y~$;;ww2(AM?!;y0sV5;K@5dj z36^R&9wt(-L?UfUT8c5^7?OgDl0e%?q`UATwBMxOcA@4MsAndF+#vVN(|4lAp#9Mn zJj-^#7-T>Aj%^2JpO~1LrxIvJQi)t$<3LNrZnfoklq526ec0yT`;m9OWebE{AqK2o zizIcH3a^xNc~OBsdubE%XXf6etWI5pDB(!IB*plk${3u7p=v7yN!Vr;u8u3g*kzRPAVkcA{SYyBoNG$o~)%Rr&$r(SsvVd9(L^x#B9_2{z^0_f1 zm>|>F^E$d9p_v9{YtQ$66P>`ocqX6gH%!m5vFVw0kP$p%;?tBuNXb1P)JZE`JPlV+ zo33-E2bqx=;~VUL&!^V?JfDhBpO{T54K2gexdAkIC;%MgBY9V`;Q-K6;*G= zp^3j4tU-H&$6+{5+gA7B5_y0U|oYy`uWO8HJ-(SNCW0tmz8KN-*#F5OUIPND{&_{O8fItwG zclCO&6O0?RPFI`Z1k!}6BDFx_=dYVr&kq#XI=}dUbwo5r;KSjKxn9kGXoAOn*&P2V zIbP(i^}$hXcNY%-Xy!94l$UG7(gNS3v$C9lz@{I5_<}b#57f#7rCG|r+Gl|fpu)uK zbDyM`WX4y4rW^U3B^Lxsd2EmVbdq^eQm}fcKwI5e)DX6nfub3P&-tQq9-#3}A~u}losE?BYMuqj z2?MSl%dr6Zq=G7<5103O{(ldSzkdC?4?6JQC_hT0!b^4b?CxXshczgm&6pGsQ5Oi}v9!Tp+Hj=jW#jm!(VY|5_j20(FN-N3kb3U@yN#|q zg(^WB|BM;1A!j;s<)pHpYVz=j54 zfs?3iArd=u-@oW!P9F!xo8%P$G}4K2l4o~~Q>If2Y$ntIFYT|N$naWpuE)E4j#ELa zAhn>!Aa-jeG$M`yF0mw90>WEReBW~S;f$;*FCUWD)L*!oLL%l}b&@FiWEuL46}`ZD zQX@10bfF`*uK7X#Uk?0O@s;6{j=;YIEB4gO;PjQ5H``1%~#EZh0%k z>Q?3T+C-$52m^!|(1VKc_y7O}UHYzC>G{oa;yQ_VC;L0#{%vW#M$Oz})S5-jG{ zEcGpG=w@1$d~f2g;O9NTvS^!-$smlKaU-hZlM|*xYuk77q0X)E=(HT@B&-1)RBk8h zoGi$fG=M#{GP=bgE(2AZHii*~{QWJbba8~EoksAYqhr9Cpl4vWEAeH=i!vwN+|2Rl088>mKKXzqj^bd@u^8m!{nZ9Ilm{FemPkR z0l~N=Cq_T}rnWiuujTz?A9vBl?(%)+W@;P))DTVRR-(lcI75Q9edcLTgLk&#lngu1 zvxs#5G8uSXA-x{|?IRu$Tt9WhT#7JOjX4KE(#yaqSPuREdV2{nj~x_B*Mo}w%JM3! z?>DPChq*iS6MhI5(%SU%(_<+bQWP2@*)6^SKM_eO(s9k(io+anJpk^(`;x4{iMgM*R@sX6o|DkVqmyjZ=+on#7?ksS%%uPLtvgo#sPa%H(quxYz1K?{xJctrr)2-CHF6?^ZOA$~` zHu3`H??`=64$;%fGE}&gq0*Cfi!L;cL6ao`>Tko zJ=S2UD#=v`4Asiqg!))#Z4qtg%mnJAvC~;c@11rkT#w7aS9+eCoBRKxew17&(km}F zzDJA^K_YSkENmkQ#%x9ztfL#%Q={>Tw>Hu+9>py(ey2g5Igm$KhTr2MI%q>Z(R*Zq zFIuS8ic2~;`{DOD3{UIL5_xmo8$V)Br&vb?h!CwM__%X3HI)td(Ic$yb0Cq2c)0gw zVPsbrAIT8V+Xw%xi_D`dZeHI0Jr@iAgTDcN*H1_s^lP{c?wh~B0a!pzN?Ec7VI2HF D#o72~ literal 0 HcmV?d00001