From 3643f224cd4ec0b0668d8a9a3166a57734b7c851 Mon Sep 17 00:00:00 2001 From: Tim Jansen Date: Fri, 14 Dec 2001 16:25:06 +0000 Subject: [PATCH] sync svn path=/trunk/kdenetwork/krfb/; revision=127110 --- Makefile.am | 6 +- configure.in.in | 3 + krfb.kdevprj | 321 ---------------------------- krfb/Makefile.am | 36 ++-- krfb/configuration.cpp | 60 ++++++ krfb/configurationdialog.ui | 379 +++++++++++++++++++++++++++++++++ krfb/connection-side-image.png | Bin 0 -> 21462 bytes krfb/main.cpp | 26 +-- krfb/newconnectiondialog.ui | 324 ++++++++++++++++++++++++++++ krfb/trayicon.cpp | 47 ++++ krfb/trayicon.h | 48 +++++ 11 files changed, 885 insertions(+), 365 deletions(-) delete mode 100644 krfb.kdevprj create mode 100644 krfb/configuration.cpp create mode 100644 krfb/configurationdialog.ui create mode 100644 krfb/connection-side-image.png create mode 100644 krfb/newconnectiondialog.ui create mode 100644 krfb/trayicon.cpp create mode 100644 krfb/trayicon.h diff --git a/Makefile.am b/Makefile.am index b911f57b..c99f5680 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,10 +1,8 @@ -####### kdevelop will overwrite this part!!! (begin)########## -SUBDIRS = krfb po doc lib include +SUBDIRS = krfb po doc include -EXTRA_DIST = krfb.kdevprj admin AUTHORS COPYING ChangeLog INSTALL README TODO krfb.lsm +EXTRA_DIST = admin AUTHORS COPYING ChangeLog INSTALL README TODO krfb.lsm -####### kdevelop will overwrite this part!!! (end)############ # not a GNU package. You can remove this line, if # have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign diff --git a/configure.in.in b/configure.in.in index 257cf7be..9a598b18 100644 --- a/configure.in.in +++ b/configure.in.in @@ -2,3 +2,6 @@ AM_INIT_AUTOMAKE(krfb,0.1) +AC_CHECK_HEADER(X11/extensions/XTest.h, + [], + AC_MSG_ERROR([XTest extension header not found])) diff --git a/krfb.kdevprj b/krfb.kdevprj deleted file mode 100644 index 5043766b..00000000 --- a/krfb.kdevprj +++ /dev/null @@ -1,321 +0,0 @@ -[AUTHORS] -dist=true -install=false -install_location= -type=DATA - -[COPYING] -dist=true -install=false -install_location= -type=DATA - -[ChangeLog] -dist=true -install=false -install_location= -type=DATA - -[Config for BinMakefileAm] -bin_program=krfb -cxxflags=-O0 -g3 -Wall -ldadd=\s$(LIB_QT) $(LIB_KDECORE) $(LIB_KDEUI)\s -ldflags=\s - -[General] -AMChanged=true -author=Tim Jansen -configure_args= -email=tim@tjansen.de -kdevprj_version=1.3 -lfv_open_groups= -makefiles=Makefile.am,krfb/Makefile.am,doc/Makefile.am,doc/en/Makefile.am,po/Makefile.am,lib/Makefile.am,include/Makefile.am -project_name=Krfb -project_type=mini_kde2 -sgml_file=/home/tim/work/krfb/doc/en/index.docbook -sub_dir=krfb/ -version=0.1 -version_control=CVS -workspace=1 - -[INSTALL] -dist=true -install=false -install_location= -type=DATA - -[LFV Groups] -GNU=AUTHORS,COPYING,ChangeLog,INSTALL,README,TODO,NEWS -Headers=*.h,*.hh,*.hxx,*.hpp,*.H -Others=* -Sources=*.cpp,*.c,*.cc,*.C,*.cxx,*.ec,*.ecpp,*.lxx,*.l++,*.ll,*.l -Translations=*.po -User Interface=*.kdevdlg,*.ui,*.rc -groups=Headers,Sources,User Interface,Translations,GNU,Others - -[Makefile.am] -files=krfb.kdevprj,admin,AUTHORS,COPYING,ChangeLog,INSTALL,README,TODO,krfb.lsm -sub_dirs=krfb,po,doc,lib,include -type=normal - -[README] -dist=true -install=false -install_location= -type=DATA - -[TODO] -dist=true -install=false -install_location= -type=DATA - -[admin] -dist=true -install=false -install_location= -type=DATA - -[doc/Makefile.am] -sub_dirs=en -type=normal - -[doc/en/Makefile.am] -files=doc/en/index.docbook -sub_dirs= -type=normal - -[doc/en/index.docbook] -dist=true -install=false -install_location=$$(kde_icondir)/locolor/16x16/apps/krfb.png -type=DATA - -[include/Connection.h] -dist=true -install=false -install_location= -type=HEADER - -[include/Framebuffer.h] -dist=true -install=false -install_location= -type=HEADER - -[include/Makefile.am] -files=include/Connection.h,include/d3des.h,include/Framebuffer.h,include/PixelFormatFramebuffer.h,include/rfb.h,include/rfbClient.h,include/rfbServer.h,include/ScaleFramebuffer.h,include/version.h,include/ZlibConnection.h - -[include/PixelFormatFramebuffer.h] -dist=true -install=false -install_location= -type=HEADER - -[include/ScaleFramebuffer.h] -dist=true -install=false -install_location= -type=HEADER - -[include/ZlibConnection.h] -dist=true -install=false -install_location= -type=HEADER - -[include/d3des.h] -dist=true -install=false -install_location= -type=HEADER - -[include/rfb.h] -dist=true -install=false -install_location= -type=HEADER - -[include/rfbClient.h] -dist=true -install=false -install_location= -type=HEADER - -[include/rfbServer.h] -dist=true -install=false -install_location= -type=HEADER - -[include/version.h] -dist=true -install=false -install_location= -type=HEADER - -[krfb.kdevprj] -dist=true -install=false -install_location= -type=DATA - -[krfb.lsm] -dist=true -install=false -install_location= -type=DATA - -[krfb/Makefile.am] -files=krfb/main.cpp,krfb/krfb.desktop,krfb/lo32-app-krfb.png,krfb/lo16-app-krfb.png,krfb/rfbserver.cpp,krfb/rfbserver.h,krfb/eyes-closed24.png,krfb/eyes-open24.png,krfb/XUpdateScanner.cc,krfb/XUpdateScanner.h -sub_dirs= -type=prog_main - -[krfb/XUpdateScanner.cc] -dist=true -install=false -install_location= -type=SOURCE - -[krfb/XUpdateScanner.h] -dist=true -install=false -install_location= -type=HEADER - -[krfb/eyes-closed24.png] -dist=true -install=false -install_location= -type=DATA - -[krfb/eyes-open24.png] -dist=true -install=false -install_location= -type=DATA - -[krfb/krfb.desktop] -dist=true -install=true -install_location=$$(kde_appsdir)/Applications/krfb.desktop -type=DATA - -[krfb/lo16-app-krfb.png] -dist=true -install=true -install_location=$$(kde_icondir)/locolor/16x16/apps/krfb.png -type=DATA - -[krfb/lo32-app-krfb.png] -dist=true -install=true -install_location=$$(kde_icondir)/locolor/32x32/apps/krfb.png -type=DATA - -[krfb/main.cpp] -dist=true -install=false -install_location= -type=SOURCE - -[krfb/rfbserver.cpp] -dist=true -install=false -install_location= -type=SOURCE - -[krfb/rfbserver.h] -dist=true -install=false -install_location= -type=HEADER - -[lib/Connection.cc] -dist=true -install=false -install_location= -type=SOURCE - -[lib/Framebuffer.cc] -dist=true -install=false -install_location= -type=SOURCE - -[lib/Makefile.am] -files=lib/computeSubrectDimensions.cc,lib/Connection.cc,lib/d3des.cc,lib/encodeRectangleCoRRE.cc,lib/encodeRectangleHextile.cc,lib/encodeRectangleRRE.cc,lib/Framebuffer.cc,lib/PixelFormatFramebuffer.cc,lib/rfb.cc,lib/rfbClient.cc,lib/rfbServer.cc,lib/ScaleFramebuffer.cc,lib/ZlibConnection.cc -sharedlib_LDFLAGS=-version-info 0:0:1 -sharedlib_rootname=lib -sub_dirs= -type=static_library - -[lib/PixelFormatFramebuffer.cc] -dist=true -install=false -install_location= -type=SOURCE - -[lib/ScaleFramebuffer.cc] -dist=true -install=false -install_location= -type=SOURCE - -[lib/ZlibConnection.cc] -dist=true -install=false -install_location= -type=SOURCE - -[lib/computeSubrectDimensions.cc] -dist=true -install=false -install_location= -type=SOURCE - -[lib/d3des.cc] -dist=true -install=false -install_location= -type=SOURCE - -[lib/encodeRectangleCoRRE.cc] -dist=true -install=false -install_location= -type=SOURCE - -[lib/encodeRectangleHextile.cc] -dist=true -install=false -install_location= -type=SOURCE - -[lib/encodeRectangleRRE.cc] -dist=true -install=false -install_location= -type=SOURCE - -[lib/rfb.cc] -dist=true -install=false -install_location= -type=SOURCE - -[lib/rfbClient.cc] -dist=true -install=false -install_location= -type=SOURCE - -[lib/rfbServer.cc] -dist=true -install=false -install_location= -type=SOURCE - -[po/Makefile.am] -sub_dirs= -type=po diff --git a/krfb/Makefile.am b/krfb/Makefile.am index c0b26862..8bff36b5 100644 --- a/krfb/Makefile.am +++ b/krfb/Makefile.am @@ -1,32 +1,30 @@ -####### kdevelop will overwrite this part!!! (begin)########## bin_PROGRAMS = krfb -krfb_SOURCES = XUpdateScanner.cc rfbserver.cpp main.cpp +krfb_SOURCES = trayicon.cpp XUpdateScanner.cc rfbserver.cpp main.cpp configurationdialog.ui newconnectiondialog.ui configuration.cpp krfb_LDADD = ./lib/liblib.a $(LIB_QT) $(LIB_KDECORE) $(LIB_KDEUI) $(LIBSOCKET) SUBDIRS = lib -EXTRA_DIST = main.cpp krfb.desktop lo32-app-krfb.png lo16-app-krfb.png rfbserver.cpp rfbserver.h eyes-closed24.png eyes-open24.png XUpdateScanner.cc XUpdateScanner.h +EXTRA_DIST = main.cpp krfb.desktop lo32-app-krfb.png lo16-app-krfb.png rfbserver.cpp rfbserver.h eyes-closed24.png eyes-open24.png XUpdateScanner.cc XUpdateScanner.h trayicon.cpp trayicon.h install-data-local: - $(mkinstalldirs) $$(kde_appsdir)/Applications/ - $(INSTALL_DATA) $(srcdir)/krfb.desktop $$(kde_appsdir)/Applications/krfb.desktop - $(mkinstalldirs) $$(kde_icondir)/locolor/32x32/apps/ - $(INSTALL_DATA) $(srcdir)/lo32-app-krfb.png $$(kde_icondir)/locolor/32x32/apps/krfb.png - $(mkinstalldirs) $$(kde_icondir)/locolor/16x16/apps/ - $(INSTALL_DATA) $(srcdir)/lo16-app-krfb.png $$(kde_icondir)/locolor/16x16/apps/krfb.png - $(mkinstalldirs) $$(kde_icondir)/hicolor/22x22/apps/ - $(INSTALL_DATA) $(srcdir)/eyes-closed24.png $$(kde_icondir)/hicolor/22x22/apps/krfb.png - $(mkinstalldirs) $$(kde_icondir)/hicolor/22x22/apps/ - $(INSTALL_DATA) $(srcdir)/eyes-open24.png $$(kde_icondir)/hicolor/22x22/apps/krfb.png + $(mkinstalldirs) $(kde_appsdir)/Applications/ + $(INSTALL_DATA) $(srcdir)/krfb.desktop $(kde_appsdir)/Applications/krfb.desktop + $(mkinstalldirs) $(kde_icondir)/locolor/32x32/apps/ + $(INSTALL_DATA) $(srcdir)/lo32-app-krfb.png $(kde_icondir)/locolor/32x32/apps/krfb.png + $(mkinstalldirs) $(kde_icondir)/locolor/16x16/apps/ + $(INSTALL_DATA) $(srcdir)/lo16-app-krfb.png $(kde_icondir)/locolor/16x16/apps/krfb.png + $(mkinstalldirs) $(kde_datadir)/krfb/pics + $(INSTALL_DATA) $(srcdir)/eyes-closed24.png $(kde_datadir)/krfb/pics/eyes-closed24.png + $(mkinstalldirs) $(kde_datadir)/krfb/pics + $(INSTALL_DATA) $(srcdir)/eyes-open24.png $(kde_datadir)/krfb/pics/eyes-open24.png uninstall-local: - -rm -f $$(kde_appsdir)/Applications/krfb.desktop - -rm -f $$(kde_icondir)/locolor/32x32/apps/krfb.png - -rm -f $$(kde_icondir)/locolor/16x16/apps/krfb.png - -rm -f $$(kde_icondir)/hicolor/22x22/apps/krfb.png - -rm -f $$(kde_icondir)/hicolor/22x22/apps/krfb.png + -rm -f $(kde_appsdir)/Applications/krfb.desktop + -rm -f $(kde_icondir)/locolor/32x32/apps/krfb.png + -rm -f $(kde_icondir)/locolor/16x16/apps/krfb.png + -rm -f $(kde_datadir)/krfb/pics + -rm -f $(kde_datadir)/krfb/pics -####### kdevelop will overwrite this part!!! (end)############ # this 10 paths are KDE specific. Use them: # kde_htmldir Where your docs should go to. (contains lang subdirs) # kde_appsdir Where your application file (.kdelnk) should go to. diff --git a/krfb/configuration.cpp b/krfb/configuration.cpp new file mode 100644 index 00000000..0cdeb6bf --- /dev/null +++ b/krfb/configuration.cpp @@ -0,0 +1,60 @@ +/*************************************************************************** + configuration.cpp + ------------------- + begin : Tue Dec 11 2001 + copyright : (C) 2001 by Tim Jansen + email : tim@tjansen.de + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "configuration.h" + +Configuration::Configuration(KConfig *config) : + config(config) +{ + askOnConnect = config->readBoolEntry("askOnConnect", true); + allowDesktopControl = config->readBoolEntry("allowDesktopControl", + false); + showMousePointer = config->readBoolEntry("showMousePointer", + true); + passwordString = config->readEntry("password", ""); + portNumber = config->readNumEntry("port", 0); +} + +Configuration::~Configuration() { +} + +bool Configuration::askOnConnect() { + return askOnConnectFlag; +} + +bool Configuration::allowDesktopControl() { + return allowDesktopControlFlag; +} + +bool Configuration::showMousePointer() { + return showMousePointerFlag; +} + +QString Configuration::password() { + return passwordString; +} + +int Configuration::port() { + return portNumber; +} + +void Configuration::showDialog() { + confDlg.show(); +} + + +#endif diff --git a/krfb/configurationdialog.ui b/krfb/configurationdialog.ui new file mode 100644 index 00000000..4442b908 --- /dev/null +++ b/krfb/configurationdialog.ui @@ -0,0 +1,379 @@ + +ConfigurationDialog + + QDialog + + name + ConfigurationDialog + + + geometry + + 0 + 0 + 390 + 278 + + + + sizePolicy + + 5 + 5 + + + + caption + KRfb configuration + + + + margin + 11 + + + spacing + 6 + + + QFrame + + name + Frame7 + + + sizePolicy + + 5 + 0 + + + + frameShape + NoFrame + + + frameShadow + Plain + + + layoutMargin + + + + margin + 6 + + + spacing + 6 + + + QCheckBox + + name + askOnConnectCB + + + text + ask &before remote client connects + + + whatsThis + If this option is enabled you will be asked whenever a remote user wants to connect to your display. This allows to close windows that the remote user should not see or to deny the request completely. It is highly recommended when you work on this computer. If you do not enable this option your only hint that somebody is connected is the small icon in your panel showing an open eye. + + + + QCheckBox + + name + allowDesktopControlCB + + + text + allow &remote client to control the desktop + + + whatsThis + If you allow this option the remote user can enter keystrokes and use your mouse pointer. This gives him full control over your computer, so be careful. When the option is disabled the remote user can only see what you are doing. + + + + QCheckBox + + name + showMousePointerCB + + + text + &show mouse pointer on remote client + + + whatsThis + If you enable this option the remote client can see the mouse pointer of this display additionally to his own. Especially if you have a slow network connection (modem, ISDN) this will make the remote display appear more sloppy. On the other hand the cursor will let the remote user orienting on the screen because the cursor moves slower on a remote connection. + + + + + + QFrame + + name + Frame5 + + + sizePolicy + + 5 + 0 + + + + frameShape + NoFrame + + + frameShadow + Plain + + + layoutMargin + + + + margin + 6 + + + spacing + 6 + + + QLabel + + name + TextLabel2 + + + sizePolicy + + 1 + 0 + + + + text + Display number: + + + + QLineEdit + + name + displayNumberInput + + + maxLength + 5 + + + toolTip + Display number + + + whatsThis + Enter the display number/port here. Unless you have more than one server running on the machine just enter 0 here. Regular RFB/VNC port number are between 0 and 99. If you enter a higher number it will be used as TCP port. Note that ports below 1024 require root privileges. + + + + + + QFrame + + name + Frame4 + + + sizePolicy + + 5 + 0 + + + + frameShape + NoFrame + + + frameShadow + Plain + + + layoutMargin + + + + margin + 6 + + + spacing + 6 + + + QLabel + + name + TextLabel1 + + + sizePolicy + + 1 + 0 + + + + text + Password: + + + + QLineEdit + + name + passwordInput + + + maxLength + 9 + + + echoMode + Password + + + whatsThis + If you want to protect your system with a password enter one here. It is highly recommended that you either do this or enable "ask before remote client connects". + + + + + + QFrame + + name + Frame6 + + + sizePolicy + + 5 + 0 + + + + frameShape + NoFrame + + + frameShadow + Plain + + + layoutMargin + + + layoutSpacing + + + + margin + 0 + + + spacing + 5 + + + QPushButton + + name + helpButton + + + text + &Help + + + + + name + Spacer2 + + + orientation + Horizontal + + + sizeType + Expanding + + + sizeHint + + 20 + 20 + + + + + QPushButton + + name + applyButton + + + text + &Apply + + + whatsThis + Click this to apply the changes immediately. + + + + QPushButton + + name + okButton + + + text + &Ok + + + whatsThis + Apply changes and close window. + + + + QPushButton + + name + cancelButton + + + text + &Cancel + + + whatsThis + Discard all changes and close window. + + + + + + + diff --git a/krfb/connection-side-image.png b/krfb/connection-side-image.png new file mode 100644 index 0000000000000000000000000000000000000000..8c556230ef5639418b4b3db06c239a0124d60ebe GIT binary patch literal 21462 zcmV+8Kpek`P)IZ#0s=9X_{|pF)k$Y_GUcSpA?!NFir+?6kQ`P??F(3d{kA;0M0&u_qmN$Dp zv>po`h~N%a?fq@N7kd0ad1Hlni9Npi!%%+c<@k<^Kj<6L15(JIVFRFDgL&WI z>2ztIg)D-|A0qgTDYLN8mB)gL{#RDsbbPw+$3EuV{-Bqo%tAdbULaIBMgR^901OZi zu>I;m7UG^Z{y{HGJBn2OflmHO(u{#1m~>(bx)6ajb5T8IyA@?_MU{a24<3Fi+A7kH zL@0m(91ufd01SW%B+!5@&;To7Ew*5LPXiMOpn-vAFu)y*fp{ zW7?EDCZ@m;G@=m~&|JEc=D-|SN)hh6{HuupYy<@wfGDi!8vy#j#TTa?TL^#wsL3OQ zSG3p0x8N(|F*ybd*g!MsTDq1lg)89(HiOn;3L^qolVjk7c0!IpATAkirQ387sr`37 z?Dt8#iZsd41a{8w7qh>b{Y;*bN8|_uv;kJ~Tj*N;(eXj}pintx^o8g!1Bb9v@@MjA z(Auz}mGGHbj)-12N2A^!YTT{)0N&Rip+E zz$xsF@h7vlv~!{+AP{t*0xF;;N6;9USQtt}D7aU^4ItQvJYjfC`xEVr0YL3OW4xeW zkU@TMu&5u5Jb-#qNFb0y+A-~nc1DcSU`r_$?7=V$K%gZ&rZ!aY+MPfHjKL8wA%|pu z01jyrh7mMGGz1>Rk3Cc!Ke+e^_0SmuYj6l2lP5_2iz47a3vUIG2?8gS7&%E?BmyEp zxo*HAI3@=GpqNi?1B4+{tb)T>h{C)iwXuBiApKuXRc;k201zC26Y_|hkVC?NjeG$u zpy;g02{x(B4pU=o+jELJ>?MU<3s-H~<6fP%d_Fx+GWs+pfT%%Z}YoRUXJi z-uoB3()@d-qDTqUurchIb_9-!o)jSXTJcKluZoRq%(!43Au*i5CRFlnM&t?Y1ilt( zz{rwy zm2QNIeRY4!#0baG<@B-O6Xwnbd$4(*Upnhd>Pk2w9!wH?AF4 zpzs0tldWhv;5$R}p#O58e|y84&rO617*GRX0M(S>t$amoKnM}0l8@Py!cG`PxR~RgqOQdqe(GE1+A0Rvh~bFgoYh;}896G7?Sv4Kjsh!6=?{BJG_ylY>aO&9rmQq zAVUmLO$Df%m&)@}-z?o$A%Hb(%8+2sV`9VX{N|t9jOWTUaCcbf?4^CWIB5JH;F6R$P#4S%j&0Jqe{6kW=88;hZ`nrqm!~ zTWa7-`AmLCpNVt$0@%D{-n8NXHiexroY1CZ%}!HrKpw#ap3n^#fMePetjQXvfEH?i zmHa~fPmllO{z<5TBSN5U(HRWL8XA(P;5ozJ%zm+~v;o9CtF?kwvRnCua4Jkaet>S_ zGsKMqAmviVun}#z^`rzy5I_M@1W0lW`-$PN41XrykR#@Df)qQA$x%`A9skZ~KQsJd zd`livf-e*<)qYTX@3;^|Zp1F-nVk7!@HOpc<4@#U;+Uu)0D@ZhOg=-rR(qlNN$rLE zj99-|-n3#38!;R+9KpumAgg&27{f>npa`pS5zSWkT4)WwlV8dI>H2T?_wqY&OuQ1> zB3sFB41pUQyj=%_=lBdFvFoD<72N$I~N=mt~>J6(ih6y-e z3X7C{+T_Z{th%iR-_rhMd`(Vz$dDx*1FVRkRA_<`aZ3Az;Xf?=&FmdHr5su+T*)Si zM2wC`XrZL530B|{`HJDs7XH)h&&G3Nnq$~xM0_bN5bqQ|su??It-Cwr+CeLx&%%lv z!=|(`GxLna-x2`?!ZTE+;y3zQnSU4ZU!{M#-b>fg27+u!U%}VnCS!FR!lv|NCbP=( zGNvVtQ*v%AuqH?F8a5z?@PVub>7)>8V^;52{mrU(49Dakc^8Bv2U#K+FK+NLc}|YV zkU0&{>VXwfnCOJp)RcTp`?H1rF#E;qlo)^lrnHG@;!?Pw-$*MmN)bqa#+3HP!e1@? zhuK?VO4I-V&o;uw)QQ45?MMtz<*SMslcu z&lRubpX49pAB5kW*TNkXz?xb^OKC$TbvmR*z*v}&0EXFyrRP)&H3D+RLjfc>q6M%v z4WxkRAU&)Qj#&N0>c3n43ppiGVnZj=n6^2TlLKp|cxfB$U_S~GfeIQyXXH<`KbgIw z9Rq{n5DdVIwv?UHMnKJI*-u~q2jD5~=ad{JPqG*!4=Y`cH8>!~Km|1xZxyfUGhy|x zzy0MbtYJfNL=MQBBvMwrJYw;QTPea9@P&M)c&&J$_(}RCUdd*{655E#K(3_?wCMq5 z0jPl*5NJdM8X!O|w31d(E7sr$98ooBzz__q0wjw|X=CwD;f&!e!#mm= z@CG#~XaNAMxvh5X(pR0kZ{UzTroEy4WSI>k=1G7&&$g&}M+OYZDeas|uV9>QkW%o_ zWmrNM2^%q-s(QorBjW|V2HM_GKbwW9fQk&IOf-qb28im?1ipkX za3kC)EP=H$!vf?`3u|(Ct`4b8wT;@kO8^js1#}}{iv!pZ0MM9f9#z4P7|s!1S-f-! zHf1=bO>!`^56ocq!%)V0i;eEEgg~fa1K1hu4Z}Oy8Ce%(F#?U$LM!-%{7RZb>A9Gp zDE1-AiYdZTijG=9MFf-MTEoV)Bib~3{(2CV_)-><86`a&9#hfKpGDt*cghVL$*#t@+3V<4EE-Zx#GI9vi>WYtL;0QJX zhu{DlX9zySB?-hy~xkDn<3`5kfS-+#bA&-G7XSubKX3`vf zt@x|^ukssdmGM;!$uaGmd__AY$0cPDp^bb6Z3Kd%nNTs$s~V{giGi?}i7KitMrFb( z3ABhy#E*(s^0|B=UnTtsU&-gtO4N8T#ZgZX2IsHn&UzT_qPW zo8GLol6%rXP2o_Lb#j^+aA+wlq-CCP5KvJ89D|eM@AU5vN$ZM4FldPSh}G)?R-`O< z3oYeW^55j26fYG&I4-1HVUztYj=>Z1oc5MD$tabOOnW+pDZ=goUwKi^d;Mcy%fd8{ zR)8hI39Z#$srg@zm-3mkhHs#a)Iw{h6_b*@H;u^R-zQtrB1J!HAwfyju>}uFXhe@*$3tpZ03 zC#+u6&WK@g;t~r#DgLjwzbbxGybn?N-JVdHJn2?t~+ zB;B)n4{-Wg7NT4%=HX5OyDt^5(SB0Alh(LBpeL+R7r&*1!H%L zH}V;@d6}RPdDs$6Y*~?}0z-D*X^Y1kU-e2HGUp7klAS1L*z%Tn1XJY1PD}$5nkoPd zx@D^H#b(vD$Axfm?p`bJntGpG{VTs(~m4B0^XT2?YsNFk{W20ou+uB_({!s zZ{EwVTx4=|loDIsYu`B&Uy)9<2tQkR%WzIRB9rB7ppCM`cPfW;hoZ27FJW`}QsIcj zT_VQd5qUyPiBZ;jsVUFWR2UMYjPS978fXLEL7yBEKBOw3h5}&8Fu`xs{^rfEiWl+~ z)Vx4Yh%AL(^kmOqu*$mSX|HM5(B!{Unsi5zrmrJpl2gf%Nk2(mz*0Vg-znZI-pQ{O zuhm{D-bxDyv;i#T7q#Qp*@X6rVFL_|0rr~VwQPXb zF;IfLw1!q0TTZ_Hi(uRUDny`75EoM0QOdm7G3|&pmJR9c!lCMk6X z4w$%`)N;Io8ihciM3a^o93y-#w$zn)A-)o)Na;4#uqmpy^riV+zF=%~CuQph2Ctbq zXHjsXglhRx@lNfv+K3q7E>D$n*{cv9_br~uLapH|XeBMB2@+Cj6NDq#32j1-gcb03 za;qOS)3?E55|ktm8Ka5NLh%ZIMn6)h3VIpHTB#7(#@Rt)4V%!8U`IKZX~(cJnTmJn ztSSYehLO4cxLb2WKqJ4C-v|aA=TvsSXNOw2%UhrouE5{iUeS)3ln@LyBF<2+;CB}9 zpoRMiXe7do3ONFnXO$zs4Kc7aHIBGeOddu-JYGud_NY<=pDE6uO-{rhVOqxw$FwOJ zNQ1i4!KaBm&IM*$sFKl@d*@mB4Xd@fEh?70R1l0Zbbpp9@#{w6zdI|7Gh6;tmAM+~n}%^9y4 zuV{0*a^T@zRcb6g%Mdt%&Zq^^KmgWIt8cx|K&6d*MW4%O(ktcwqasJJDL5i)p#tqN z@$bq<%aq^3+yYx@t=OWy^zfQ?oYU@1Q~n$rKpO%@B@VMpWPl@u|6VXW?50dRfWo1r z;+2{YYClSis&OhaAVap$3AFPTYT+ATDPAF7sC^|n5l5gg$+S&ay<&XB_5(}E;8i(ji}NFK9}Dp-YP7_5p9@Yp;Fcmdfwv!#L~K! z8QGyT4&T6+QVSa)zE(J8>ZQuI=ZG8uZPA3Gq$7|$7dg0rJK&1z;teOYf#Ml$5NGmh zHNSfML2)JnP2MZ^9Db-r}Mz%nErSM7NOg54#=8C43(3B+jLEHn4sYx+o z*7;_$YnrURR%i|3)a?iyn1$@uq)8*+)}=8Ncp*Y<8T3tx(v<3qlY;Ho<8#FeHSg8_ z>hW3<_@*GPF=K~nl>P<4)H^T&M@UeB8Yz|pa#vO}Dqd28c~gurhp)kDUZEu&kP36c zslqFUkKTS%dm+D(FQ~Pof+0kpd6{aq3N3sAzgGKRHWuh%NeJz4ik}qkl=DX9-_O>r^oe0XC3L zb2+3U{4TRFUP+BOq|QsteL8<5t)O`ZT~Q;95zei8%jzeFQ(8h>u!RltT}2`F`Z%;g zN}9$S*#ybf7O5qNxjQACF`O%W^mrwo$(Pio%*8c)39W$5*Q(h{4s8%`gxW#)g5iV` z;$@l0D=2Sg!1FrOekn z<2c1^gULY+sn!U7t9UJ62|_r9Hq6=A1Y@-Dx#Aq!0HDh3SRn#%*IIsS;SIwH zIm+pngp~RQS}4xs^UOsp;R$nZpj5PPWJ;)3LKh1zr47`kibZIlc%yhD4gnxuslAY2 zOB(^OF~b|yf3xA=&Cc?|5FF+_d+I8Q*NWHq=G7*U4e>_p2eEcIsu{x>ZHin@5Hc*4 zC31pr3azO%d?Rh3mEwh(Uj;Z^vE5x7^ov=ToW`|WR3qMKYZ6vP6b=tX9oooe`4$x& zM7&hoOtEoBkY(Qa69)KX^oU^PF6<^l%7B3^O7YCQqo|lP$S0- z*;8drEfufX{_3pZx6C*54{tBzOCgdq!W7jx!&`=9CS{XxpOh-OQTx%`kBT?)WtWnZ z8{3brXukA##p*4?YpY(tj*$!IiYI7+9OiXC)G(d7J#)}~L7#&wpnX2xmNONKSt)Z> z3Ie*Zi2D%RV*;6)zO-V>Fu)Nn2qNC9{iyhx;!NI^z&d;`L};maOB)Gw@(T!0Pn*-r z*(kPUGW9N>p&#mz-a+}A@yY@E3hfjCe2(@~@xpxrQi{7Me(`d1WOA+MpKAU`?T4(8 z(m*Q$OGT$z_XXoM<0Y$~p9#1p~}&K*_CFQ=orZypm1HO0=&kqA6Zu%A*p9 z+Y#z#SULlb-8cKs-&t0NFWe>ope5p+{8n1*2GVCa**d;z^22(T-_Dc4#fb19$i$w7Uk|?pXAb!8ETDT14Qo&1pX2#tXG=SCClMUX$`FpZA3~{Gd6}z zXeSIu;FvZ9YIXoqigf)>@mldpzJOL=6;wRMLM!~McBQZ_T-5K9FJDH*`_F=s5Sg}= z-!D^ckAqWc3;F8GoLf{0?>M;D9odl%N1V+VEcl*%Hy!tA^kGcSG@OG zV#p;CUC*L=6(ObOkzIw3cJJ7?Z*qN5+w*(lOB>?^%cZhS?A9NB3z++Wo7qx-rtaR) zbBS5cFq8?~6&SKqE1`ElDrgVv8`^xU58hMv-b;LvD)t+8U0T>=pX+d`J%~D1edDb< zKF`8DS9Ud6TCRl#E3NL2YB2O#vHOSRg2$ZGNS(u}L6wHQ)>kQ^E16+(h*Z(T;^XC_ z@{|tiEOzI8SwU@L)?L~pS4G;e)XXtE%spYv6X9?CRd6IBf?#Dcy{f?X)O2BMJJ)ieYj>`MK%ys&$ci1*9HKHBErVK~SMFL?vX)*;elxDDssX;ek(6nOS zEceCbG3u%mi+))M#gv zQ5uv|8OK^FM)U=It_P&HZ-AdL$&Vc-z;nxyucZ~W1`gg$;7MCZz+eN|3B%6}znHxx zC)5B6sH|8)WA4*Q#$$KpWxcU?SUUZHxnOmY1&ad$&_>DH?XaZBIc(3df4>hu@~-Fu z!~kYc3mYec$6OA}o)v70W=pzvo%!eUU8zmu(5=;mhfFe`JS=&|YxOh9>81|}`JYmx zX~kcTU?;SnE&ScWpNJs=D3n>BT1mPg@GYd9r+>&<+`YqqGN1+7`2564e7zD?uBjeq*#u=}BL6UuscijTcFK(j-54 zSl7kpbG5&z89Ia*^KJs46~xadQZq1+W7sL}4egEP7M3b^$|vt8nVJ4r2{XEyQL5c%=*w_ zU8S0@N`XvQVA1S4d!ADVsZ*7$tVKwxXn8J|b|6)qiP&HJyMqX-9DpVmI`sIh*nU3;fKIG1H*l}94 z#Aj)hEBPG0%!_Aiz3s9{VycLw5Ry48i)D(4LL}N0=X7WTiWie8fPtuFg91Y*UUmzC zv4>zF_gLE)X{j$8GgTu#EVVDBNZU`j!lNr6c|HpXq+!Aax>Y2wcE2D-&@j$5=*|ED zAOJ~3K~(oZ@B0fKI-HCXbI1Y9D_-rz9;wDqtF+_+d?lokS-?|3&0HyyDS{3Y*veIW zALYs9fD_Kr&VL^yDzT;yfJ&^u0WDSchJpu`&^x=YrOm^}OvQ%#Qfs|=mag{o?#z4l z+b<{_{G1|9`CCw~xD+mkAryeXEhdTm&^~qCr-e$KnVsq%R)QfkKnrZZw6@tAY$bvb zj{ngY^a{@mu|~KK3jvvb(b>=s^Xq%2R}5cuUZoSzgly;3!FLUQTyUYF|F6 zxK(O#`P#TJ31Z?RBD5ib(z@HZN2a@pj*;5_P^C*Pc3wvBFs7(LNvdFRyNX7~2H(z# za@t*b@Bu&Thi4zJg&J+u=6xir6ovW#td;fZ5c^WQcgYtB?U8)C1HssbS;+ny<>e)E zWfaRgfY>fBkRDaLsGxP8foyGIrXzaZ|B)oZXejh5e zzc-kh_eS=CXM5;Zd#b|j-FC;bz1QB9?T-8%mE9a5wV$V#&Q(3CNcUbHb(-x#Lv^1Y z9W&J9%43sbSJUiY{SXoCe*UFj{c-657Va_QK_|k?OS@X3FJygjwBDQUegA|H>g2s! zdY&S^uc99`1bip#fQNL+cf-hi7IK$= z_aECIVqv0QVaCqNYj|WFAEQp@_AY%m@9!&;zDDUk$RC}5IM5cN_t+it`t?`Z^{qO~ zw-?Vn#sfa0Nbf7yr@6RiIQJC$-m}DV&wq4AK5Ps39vHj)i@R13y~9en^fOBAJ}34h zPrXZg>G*P&XAe41=?>dnH~0@qpJ!pBz6*1oe|_@a!g`(a(w$`Q4eqg%z1grQBA->H z9rOA;Gj_F2!PyY6-)O`)SrvuqzVGl#zm*c%C zXz%KOIND+1W16Znhlf05|KR>$^}p)7LVMB66B_$Lk-blR=$JjIq5GtJ{XzMMJr?TT zSno*>zJ!qv3hthNi(U7p|HJ1wiVwyudpGdM<<^6=uSokNXb*jU2<-`?c4vAQb)a|7 zz6bk+t^I6JasSPp^6Wl;&`kaj=>c2Vv9L>beAWwnjPC!0Jr?#wO}*h}Pez|7h}hMZ z=qb$mclbxAhgsNZHt&7%rJAkpTlUAUFWl_8Hnz)M_EOx>keIzW(Z3=d(i4ANdO(q; zA&b4C??2}k>C(<$*RD?MLhslc-!2C4i(r3zKdVSP+6#*Ie!J)Qe$jLN4(VYj#Jxd( z-gBzV2JR}fPVCULi*_%-_{xZ_&$GSoqeFV1XCQu8^l)6Lp7iuT{37ZLqW5@)9v4IJ zDtor-zQ8^G?fuXDhOiIk_W9QjZ~mb4R8Pf=Q0EyXy4U9Lu$S@R4fG>9>e?qB@D`G;@K zLhN!;JCaJ^I(NFwveMdhYDm;p@{Z>Egvc{ug^^euBO~j2r)Y z7GgKP#v^G8JkCG#oTI+B!~xjN_s2i{TUeM#JpkeUSD*c@@3Jt_caU~?2L0PunCKZ| zp`O<5v(TRUQKlb?^!GxE4SW3fUcHsi(jStAiS7sf_y2q_botKc5cTs1pa*lg_if~N zX)M1J7Cu3JRQV0lX`DDPp1#IeXr0Az8e-M+CyQitSa8@CcM5g`mPk|9zKUu z6MTO~x9^Mor7-uufcCOc4s4LOBL3=i%zvl!UCq!g8`W=){4D7DN2l+Kg?Omy@H@*6 z-ly+Pk>028n0Y_wJE1RBq<@H=nEsE^!Es@KPmpePxF`2R`$7L2I*f(PI}qjV!MD2- zQXAmlwcLNux1hroc24{oBb?AqXk!5ICH+?MHs|lYX8X49fLL~yW1u9oC9LV{3HCB% z){An!ZU>qJSV+LYA;KxEpIQHG;gkU4jhgokBKo0gxqp|m-Hd3^ZIVVH2c$b&KJ_vt zdEv;I*ONusW$#(N0iS1K+UkcRgmc!v*x>J0y&-`1lVH&L3)XV~{wVJ@HG)lP$FLD| znC3ke?m_Qc#6fD1wmb0^v5}hRaPcr(7+^z&6IO3o|B2y^0buPuW4vIzpojmH0tg_0 zBZL!HKeKvEJ0fdl=fD9kn_R1>NIO~dv~LvJE5!@>9b9Ek<1e9u6e$fHf@!zZA=6GG zHe{I4M&J-%xvlrh)4wG6DeLXCddIzu4fvEF4pwSGHFK zoZSNW`#b2AnrNTNMnWrJ%GY_Ls4t=eSSSFnw0&86RRF*M3$OqN8syp;AMW}${~|s6 zuMd65$uRIh0;z7JO#nbk#yk0~eEtoBALWoh8)z*JDCB)*_LmsgyVc^_ zu!c=(r?eAtq&%u$;?x|#Ld$lgzcV`krPb^W+nY`|hy6F`6|j6mxlEIKfN;v{C)Ph( zI3tL7tM;Q>b4i-LXxcED*cQH2oGD%j00%%tG*A>;2v7^ftVp4<{YBakD&2UEyrIbu zX=Cp%+UEXHMM{=e;V5kTVRu-f`*kb0S8U(!Mtc!r+97O&a8`n!cLWhH#eu7(8lZv4 z7ZXH9$fcHALrZ7{Z4v{NHZ4^$Z=1Z^8wdn)0Gq<5FcQTuu?8#9o)cUj5ErWKKp@b# z-QwFoW7?&Fg*jd16Utg>`Dq`2bqBlvrJZGu7+$mbnbkWZVMA#HpTTdU&w%h6|2QW7<61RF4IS;h&%Im0>an7jc4@}R#2$w88p zYzUjeCVA&f1$YDqt<-+-_Ci_$Nc;n9*l}+kQtu7KXSXG|N1xj*2661E0Tk(e zk$m3@+7^e}Uq9p-T$F=(=X0c;&mph^12usi(Z2qBPAU2zRy#H z6WWwE1*fnHZOj}_Y~)M%9pasQrDp)7I4CY;-n1@1e=L`Y`P=kWc3GdC;_A7e{Zpdn z>Fj;}WyIczJa5ej0B!Nt^)+XIgaobOhIos3;qj9GT6PQ$2!aFH5$%W^3#1LnF*pDR zK$>uC#5?&6p1^^ZWnrGg-A>~LCfzP!*!x@uh<`sM=>*OmVf;PJ=K$(_;*M24MYy5sfygQ$NZ}P)z2$Z2{{oh zq)D`exdRhQ#5(N`55{eZT-q^md-$1l=UhMLeE#F8Y>oSvB2{ni+!v>q6l0#mw2~XQ zj4dcID^m3WR+si%^Dm^&NFf04_FpEj3v&y=h?tVEz%fDsx7N@a*g&ft}JDMObKqFk=g`B~b=vM+24x3@(&^7iyQJ|(~a z4q>m!V^FjPTp`}dZ-kj-^tD0@Jgy--;k$4D7U=4T(e3OSu-oKvFKPp_P0|UkS}a;>aH70<$etalyj&ux~<+EgqCCaSb3}odgnC zGb9I0)fHO97xIO)ehxaC=paSfcWSaJPKBc*atscELH52lA&+Dy;)o4BwjNu#)0dJS z_EWavl;(o0QacgjR~zYA?kb_#D{WE4d8$#ZV&XUixOsxNpS5a-nTV z(@(5cpaaPPOuj|z6=ysP9Zhsl?M%l)rC+4URg(}aVz4zZ93TwH0boE&Z5TK7M!tc! zPeqL#|H3iCIm274e`fWDcAP7ZCHNfiliNSkR7oRHYwc;pl(k1v!hNqH*+nn&sH+ub zuiU7o-=EXruxp8dUBJ`8lonTsR#RTA>8)w}EIO7_ZG|?hE;S7``tGW7-7a73)8<{;So0w(yGK zgdAiWLxZMZ1w{Isen(#l%dIb-++$8)Q`!-2L>lEKr@DkMr4}@xCTrLPoYID=#D>{p zYL!fsmhdHfC9S`Zi|UP7-=nUWG(@N5yR^aA_%b-W2(f=#xeU3d_miQ5Llrn6E0C}e z!Yfv98Lt>`s10IM^xkgSJcqC;!zt^(aPXg2|JB0lZg6{71nh|6wN-D`{>FGkp8;(V zZUYCf3Bw7(32j`m0V$_?CoO~x0Ai%-oZ$__xrJkJn4Jr>N^xym$Zr)d74P5+XmMDd zLuXAoTUabHNgJrc5>?{gq!{F1RY-7fHFpY5YvyY168fZD)LK4+HsXMGtfcf=(~c0{ zF#N`FO<&3y`bsEjGndT|X;Xw#R&TBTE9<{n^@cWOhJ%}|pNZ__*%Wp{o020ilP_pq(_!`S-6tZ4(XV#bq`{%nP3r3pJaw3?eN75K~@0{P~WrkbO@l+R@oR3IoD zF%5S(WA%>lj`5CKiMjrV93z}EoHLx!rVM8YudV)x;WarfDRzgNu1YgcR2n!S2OtT{ z^OpfOh8;7UFr1K+l2dJ<6?`V2$=3qNTH&14pKb8}S^bOIl=-<5|DquJ0`ZN)8EhgB zybX{8OFe}upnz)G0ITcuqVhf4s90z#r3GvFGUuqDT~v3lA`L*zR1mfo!}?0`O6_}( zw+hDutsYQ=(z|tp@Rrpz;}v}_tO0=ogkx4evHpuy?-)*K6WUSEZg*XlDt3YuluGEd zwR}6eeZZ_j&uGUxl_|cI-xZa(NkI#%SFGMJoY98t##95rDS>0y1U4~_#2TP0BH}Y1 z8Ipdg)8c*XnhPbMf{nm&)*Q(f^;L=p^)4rO71^>XQ4FH0+jmWUT>{vn^sXJGB& z$T$K(5H?2jit#nW1>-ff0a6vvDeFJk;O|!dLK_nS9MA?p)n&N~s|17|y3bV8R}cpz z6PP7FyrNCBFPf_2{Z8>lK9?FPf?zIat4jA;_e4%mbf5yKg|#q6Xzgm`@qsXAOUWg! zOBY|A-96S|O<1n=PD)!V_>JPV;vKY>n&`%o6siU7#x(c)tVfMZ4Vud@P*>F;FMSTL+BR(}!IxddI?kH>Cj%U&CjL*YZ1P4LJ~C-Gh{AS?<`)cy(I5;!kC>w zN{NU8Yz&*yMg^`Cl-!7#tdr{ppDW%V)khU6o7&$LZ{$nC#hNx{ie9SM zv?DNVove7Rc&T_JUq~rhU&Ci=lLXAAjSzD<;mPq?NSkeW2!{+O3}+0dv=Lcze;#)f zil;qH?Pu8#66M1IXizJkDPDT~B)^rfpv_nHcpSFwOqb%~?pUYvMJj-Ak)mL~Q@kyO zcoC>lEgm@`$6yUescftLBs&%=Rqqf^c88{{=Am9MnU-ijc=Nw%fAx4JtpMZ}%W%%5 zt2rhO+91xU#mkd;rCxs9}fucQUkz&G++wI9{|L+wY!nS3nQ_gaLRDZ zTpuQ=k>94k&f}GQp`6e`f+*!{s!@roOZF$FtXlwr!HhZ8Py*R)v(|kIS&??-Fo=*9 z6JWVZJ6D`uDgLH-D=qOgj!dG%R=lVR7HZoM6L6{~n~+>pm)BBJZcK@i6Uk{jX7c!X zP0ZzUz|@#fxlLeGvk^Od4y6tyUc+w`Z<4uHd#QM-cq=V{2##S>*fH&toB)=!f-exS z)qYg_Nq#G>cC+@eKuahwNrHB3XjqQ%0g&LizYvgE+85pNJL z)Ltpx$k#8hSkD(?q&<8VDB*Ad5@Ysm(3ZJeq7eWX(ozcIjO_=AP%ED^R^kxhSm8`| ztWdM7s$xY{Vt^XOTeTk)FS85hYiW}L1K5P&jNuqIp$!Q_Q9f6;g4gl|)bt_&&oy}n zv_Xnwl9?BsMrfU`Udr;))a>-_gV8-fOJ%;aF*q)Da<=_d5^2SfiOH4^|AY2~!A> zI?!=KUy_$XlrQ9SCA1pK;k+F&oHBzfCF;m5yzL#|f1(t?mGPU#89RfRwLq$C{g(;T$q~^Ui1kM2Dac@6*yp^wdIyS;rh&O6KDZCa3un_^I79O8Ts~#li@U^gD zdnpdwhF~zjal-5YcBz@(1Lr9}MK~>pTBk)D_`L9MrKI8aDQOF()w0M`*5$dkI|pij zTKG)uM>YTL&9B~Gl{>$O&M+`RYe_fc1e^oLlnnP2L|x=q!WT-Hco8~4ktP=2s{J4i zTn)oH0mLh{|5Wo{e!b)Jsg*C$Uc&zAHU^^E2_VF4HUIGTH^sZ%CI1{+$cff~$|d;5 zs@JfoI3yhLQfb|Yu0SY*+NU`dOpDj$ny|UzO$pl{Tv#wA&8h5*ZJ?B?XyvOC)Gl*K zliaBGgSQ{$cTYNy+E&yT??Le7xIqiW3$?#``^n=qzCIT0(_vEBD9(rvLUg~S9T9-f z6ff0&Qk?C$d}^Qt{94Wb2+`v$!V#nt2&(Utf_|e;IX#ro# zXNot7H`<~$4+@W2`$^6Jc=Hd%Px4hZIxj_s6(L4or6{OXyv+fx z8u%jFoBg?|M)8hv*M{vU*$4o93BOgmlP?~~tt2ig#oaTupJ+$4L2)k=Xt&BHDy{$7 zfnMq7*=4`*Hi4o`Q*2$HCYnwHXGC3l^ngZIAqACDh%VW6*b$dtmE$E=q;ub9yO zrshO~ha-dJn_OntepLHUZ{B-MLF$*USos7UT>jMJ|Fw5+$#EOW8ve6@zK~6c@^Hp9 z+YyWy?O=x5#WB4Lg}jO*YgSy4K9{kw3|H|`LKki+NT3*@Jq z{l@tTXMeCiV?Wi&W5pPMQRd9_Bc@}9_xU?=>&y(y*o#s7ty(1fdo;XQA4luJ3n@hj zFbOucC6RifSwJ(;w6Lo-7hd%i?3rf3SS`h>?U`vjS&Y)Bw20e)gC8S*$FtX*{m#*% z)|@u!J@$$ES_1>%jPnuar<}dzObh}SDk0KJ%aqkpk-_^3<^Lgc)uP4|<_q|77?aGd zUpx7di{JSL-m(R#_{0@%k(b^TRNobjRs|MgEQwa$@0`8n{14X3sxhaci@#S=a%3O_ zU%lA@(KI*EI~cQ5m1KRSN3BiQlI~fLbK{1b!S!u6+>joP4bY(=u}MIoLA=A9CR` zy8%AcB3uA_V8%S9{1kM=JoVXc1Pa~b-`T%szc^-)9BJg-T9^=-=$FA$o%X)Wd0DyE z0{Pkr#R~HV=Q5V~%!*K6XFp*OGKL> zHTEHxNaFC)ZI`IU3fXH9AkS}a?T*i~2tzb9^Q`28F3WW_BEe*R(7Jf0qU1UA1TvQA zSt}o`%Ga*J-J^8Jb^q?tzY!SO?+gcj;r;mb*6#QWix9!cnb%ANOERBi9t^obkkBec zLih{#^Dy*m(`h9ApwmrC|Ax*Eb-p10l*;rg_|w~4yW{gLLg6x5q;tv#aCbt4Swb3~ zBY{{S8a#^&t_4bhxAG2>I})!(fG*|X?vfk8ox{(Vxpn{cs(j8xcqzha1j!w8cY;fg z;4}8;oWEx;;of!URE-#><~HH(I+;G8<4A&AqvRg>zc3$;WeorT6FW&nK~!f1Pq+xf z`5XHtuT+GkNo7Tg?SiKb07@BgOV!Czq!#UyOuA6j*XZIuXa9ly2j&T@Y{Ak?iO7Jv zi*(DSUsL)O(Yp4koGd#sb;tqdL4>#L&k2(oEXAcPa9{rWaL??wbLQ-sv-X-< zGkdS2L2JV_R>Wz>D`$_K^3wBq zj#*`Y=uDLZK7U-a0~jBeVNL?WP#P4_Y4*g;JQ;MuNj98n2HhJG<&cP!ucd%$xm2ek?b zi}yV&&&JjY&l!=Vplit*&pbauB9TtUXSWfbNpq@m!v;5MT!o>-Rxz4{&N1Oj4It|7 zO=xbX1*hDQkRH^+D#0dA@h8R6r1?CIIQrQaDl)spgFcZ5*M4EeirR_(c`{vFx^4x-=#u0#Kr7saOc|v-*8==qq#^mrJ4!0fT+SfBRZ)X_#?Rd)5@2P zn{=IvM}ZSps)&LysuaG;U%|A!PY-J%YF8qwerU+OzDUf(VGoJBWj>SsCtTkv$j?+o z`ezJ$9;lT-coTXg&TVzIEz~096dqTaqOny;kBe24`Yx82%GsSH6WqzJe{snSxJ{`IEnQi_RFG&174Il`P8Q@{@epiF(8Vzp4@)>tYY)HPe$5a zML-f=824`|^-*%j#*uiNI04&gm^pWLV{SM%lWmhZg>hvcm#yPQkHPloGrSzktrl1} z*~z|s%n1zArI@3dHGPi8+A5jYRB#JVbDs8x;3DEF(>&o?# z)QD8t$@+oaYHYH0tNZ6~Z*&P9bD9r66EN?+G1_`nL@BppLPkx~AVw*gX@1VI@MbgV zbJT78nPgT+x^?jBBz)8p*P=*pt}$DhP-~c*iPV)eBDS1~c)q4DTCa5erz&2H(l_sy zU#(#(-f#Q2L3I1wXdE5B)yNMYRiy&|qON>muNBE9W1hlg7$Mwj7*AT-qyly2iViI` zAl2kjZY_%^Hs{P>+r1;vL`4bl`+c)LG`08Du_#f|^ceFVb&--io5OUaM^F;R>}GqR zP;X9L5Up|iWnnm0!zaOke$cbBa7pQ%VF3xbh6XI97Wl*Vi#cIv$;(f_d-r+5zpJyv z)teiZmLx~AkAba%34p(EaVHbKuTv&^bArQi;*8!4HyE_&OLB8j-jJ7!rXu}I_}=W7 zIN=9uUr#l7E)*)wOBIIkdpp8y07*#ItX6>@jmjz&g_JaUyUE#~Ia%@Ed;G{|i3@>q zfIjA4Sci=Twitt&T(&YHmN6oM%;Mv-rByS~WLlgD3l}oD9AEcTvb6@XH~BOuDa&c5 z4%r&4a?ePRriNYrSfq+pggLLHaP_sAcF!o|Wm*zlE&7jJ109lWJ*MxJhQ-o^!JBl$ zsgz)o-LL8~EK~MJR^s(lOtkf`+vB4cx+NhD!Ef85ph(E=#SnhrYjGxmVsVrk@m6!qPW*9mY z8c#!)VqmGrX(hkv#V1=6OrMfh+R|eCham8nms<;KiT_Nv-OgIRCKV{A}Hl>}E31 zr&iJoOY$_AFF<4QV)Om}H&}!+{f`tygC)xRlv^`_OtZ@fyuJ8=-dLL5#u18l5u+t) zT;lGjTb*v~$ZlcM-v1mJP2GwziDjq;rq%0xP3&+dKenn#fZha@MD0h_jD?)bV} z=i}I+J<@J)ENJRPLy_o;L@)^xBw!W|ZMAU$H)m$STePzZgp$HrspsW3dA%|`0D!a( zTIEmHnSdb#XxD&-E74_AU)w}Fa@&Vn1L%-jn6oy1_qQzQ3B zG7;ZMTG{lmjC^Mqh(Z)j>%Oymv5XSoV~_AF1N)VaNp9t7Vt9H8uAG%`)hz}{BB%0* z44{VQB&uyrC;1p90F-X>OPcvQ!KLYw{z)K5JY*fGMcfPbBgts-9N!G*Hi){cdFt}e z?ES<+>G-oVsiWa@8$fr@OSA39)M{l>b+>Tu{#N|?*LS7}))4_DugHgYapHolkS^;c zm8*bC7J+-nkal2tE$1jqbC)-~n~n@PPG>WQ*bMSq1fJ!_j4+JM;W!GYo4Y9{phkA| z-TNw%fwQD$QfCbh4d}7_sQlepG_imcGEE=FF(3~9#jp(Dc{HC@*I5iXIWZbnYueLx zZugOj)aUCAmewf9Dj*_~`S?wII3j9`_eUdShd`~-kM2D!GwUw?y2x1|gs~6Ts3t{G z-kP9Ex5bz}78e9*Lvpz|1=jFM3R*!K-g=o! z6){}Ddvh%xrX8Sf$TidT=?Yc-Iv|}m4_a)Pih2jck+YICJW%N2TM3*T38H$a*sY6} z%moj<$uoUp#aZQ2NC3?x-~IY-7)0!HMBT<>#bC`8nC%iUB0Cy@Ja}k;o>Lo-E@|8d z(RR^)eESNL2rG17Mdg-UI|j9lYnx@o?*uTsY_<={#-Hq*S)7{iWix(xBUIu)igBDd z=XW8@_hIj;n1zSa?Px?~batT;&bO8=$||F3dc8HlJ!MKHEI%Tjz!FZ`Etici=MK}o zz{WyRUJh_AZvBHh6H9tDE(3p=*RQt@z1Qdx=Svi7w`8wNEcw{f{}y>Y4fZzWT4WQB zF`QaM^N=gA%IHP&uwjI2h1M;{c4{9>)2Zmu#E#)S0xRJyaz}u@N=O#D)YTG;g;cRz zGUc>jfAxo7JU&4AhzxMy7NsV%gJI?zzR|F&nlmyk-x&R;0hXvVY$}2Skd_v#tfE6p zlGJ9e4BvqC1gFya9CD6&w>Ys6`qK%ea(^073TX)!@zH37(`cS*O$v$md_o+rYquA+^LYA&Xj}@ z6x_7X9`HXfRbSbW7^$EFpNCzuhB8uue@pNYePS$)XXsEA!GSEpX=$8SeLbHa-GR-q z7F}g)H}KnBnst1dj0%hpgH?C!Da@iHwaNe#{N%Z9e`1^*)1T@TwzBq<;xRcitw zF))S$)|8_giu>ek2RS3LJEDce%TDUjViW@BbwZ8HEu>MjCscL@kY7aAy@>=9zQ8|8^nkI62+V1XHnGP4?9pb-5UJWg&qq*qAm&5w? z@mlR6VUkdsyn8?u3sSi$2k?;0KS1j4SuyZ%P{cpVp74$k)8!t=Um#20$&;Ad-gg+i zq@Y+EeoNmW-~Ks%`X5)8yr$@*$5$c*H<(Kxz#8)?zj!FI290-*B}`#!q)1}6IVa68 zrth5E3J8$8X0ada*NUD@X4yL8ZOm~Z9?jI(>6-hKg1x18$I|uEJ=}p~eMzID^LO{H ztHJ|}Z`X}Pxn<$og*jZ4;0x-nuaB@W=pQsra6rsj_-0Xx9w3DoAa$)>CFdW7#pRTh zx^`1YPEj_tsfONgUqA1sb*r`#OF(UR$RBmi$nS7OR(>MK>>5fVKt zb<`x9EP=-Ps`fiH?)Y0ZX4c}+Tn8AsYMd5;zBs>Md)`PP7TLRZ=9@hBWSdyz^LMCl zprxGQRnZQ2T6-Lee`|gK!3~+Ip(7Y?W#AIvaT>k(Wd}3_<&Q3Wt!at$LGT3M(K_mY z18$!(u1~P!l7nSsOS!DAPM<@0tt5U;KT3jH3#mbZON*@%q0mh7WO5Pdx$lV-=uZd0 zDdL}+Tj78QP`*Qx$QzLVwmILaHDTv3M$+shPlZI51~IxMtiO5&E{*T9s`_?0&YwH= z&o4pc?^>kgJLD_;>g-4_(8?BSV}~(WeizhNH81k8VM4F2Lu+eL<;UT$Myr|Jsydh~ zhf&|OFTH&4{xj_mH>ak^qY@{u9gW`Y^@kb*i5JmnTZ1I69tTa=hC2-6q6!a*I)*Nk z3ga}Q>E&mOY84 z!n;Jr>|~;^b3R4DOfQ1*Ce1hSob-T_Q43T%tdWI{She!F$Gamu>l(;7#KyjR@k_)K z*!KtjB-gqcy6#fd_2-29fl)VrUb=7XbG!04Mk^_^xepHpvG3X(ho%*%+cn-0|Ee0l zn~{DflXG(fu;&l{L-uWlY3Y$f5&t-BxO#5M*d5goHf)gsVo<=j-K*~N4jQH%0zcs= z&9&PKuz!1P7Ekd|#+N$PS57vx&sata`8qVFX9#9oES&zE;2|!3!Zo$Bi>e(zyUHWY zDyz54br9P@B=ro-85P+dn?q{zAPNum`?6U7Zg}aVcT|G%* zL*?7b87gp{B!BU_+uSJ=#~Qxvl&%q|YPW6;U&9r5NTa&qs)AHpp)hr zN+U=lFbfa;meuDIpm%TSO@Dh!Oqn!Gr{6Nel9>$cGS%Tyi`&Fg=-|`6*LJ8r=ogp3 z-VEdHMnQObBECGv39XA7w*!A5z2K)g_@7h30VQmN<~nh{C!^#!H#0mL=@Ght$+wHk x@D&>jQ@*2FPjHVs!~daz|FcH^f9{r`?!USg@E4rQ*a9AwnzHtr%2(E5{{`u=Mx6iv literal 0 HcmV?d00001 diff --git a/krfb/main.cpp b/krfb/main.cpp index 7363539e..11bea913 100644 --- a/krfb/main.cpp +++ b/krfb/main.cpp @@ -15,7 +15,10 @@ * * ***************************************************************************/ +#include "trayicon.h" + #include +#include #include #include #include @@ -33,18 +36,6 @@ static KCmdLineOptions options[] = // INSERT YOUR COMMANDLINE OPTIONS HERE }; -static KPixmap *trayIconOpen; -static KPixmap *trayIconClosed; -static KSystemTray *tray; - -void setOpenIcon() { - tray->setPixmap(*trayIconOpen); -} - -void setClosedIcon() { - tray->setPixmap(*trayIconClosed); -} - int main(int argc, char *argv[]) { KAboutData aboutData( "krfb", I18N_NOOP("Krfb"), @@ -55,14 +46,7 @@ int main(int argc, char *argv[]) KCmdLineArgs::addCmdLineOptions( options ); KApplication app; - - tray = new KSystemTray(); - trayIconOpen = new KPixmap(); - trayIconClosed = new KPixmap(); - trayIconOpen->load("eyes-open24.png"); - trayIconClosed->load("eyes-closed24.png"); - setClosedIcon(); - tray->show(); - + TrayIcon tray; + return app.exec(); } diff --git a/krfb/newconnectiondialog.ui b/krfb/newconnectiondialog.ui new file mode 100644 index 00000000..5b4b3a99 --- /dev/null +++ b/krfb/newconnectiondialog.ui @@ -0,0 +1,324 @@ + +KRFBConnectionDialog + + QDialog + + name + KRFBConnectionDialog + + + geometry + + 0 + 0 + 541 + 471 + + + + caption + New RFB Connection + + + + margin + 11 + + + spacing + 6 + + + QLabel + + name + PixmapLabel1 + + + minimumSize + + 150 + 400 + + + + pixmap + image0 + + + scaledContents + true + + + + QFrame + + name + someframe + + + frameShape + NoFrame + + + frameShadow + Plain + + + layoutSpacing + + + + margin + 11 + + + spacing + 6 + + + QFrame + + name + Frame11 + + + sizePolicy + + 5 + 0 + + + + frameShape + NoFrame + + + frameShadow + Plain + + + layoutMargin + + + layoutSpacing + + + + margin + 0 + + + spacing + 0 + + + QLabel + + name + TextLabel5 + + + sizePolicy + + 1 + 0 + + + + font + + 13 + 1 + + + + text + Attention + + + indent + 0 + + + + QLabel + + name + TextLabel3 + + + sizePolicy + + 0 + 0 + + + + lineWidth + -1 + + + margin + 0 + + + midLineWidth + 5 + + + text + A user on the computer x.x.x.x requests a RFB connection to your computer. +This means that he can see everything on your screen and, if the box below is enabled, he can also control it. Refuse the connection unless you trust the person. + + + textFormat + PlainText + + + alignment + WordBreak|AlignVCenter|AlignLeft + + + indent + 0 + + + wordwrap + + + + + + QCheckBox + + name + allowRemoteControlCB + + + sizePolicy + + 1 + 0 + + + + text + Allow remote user to control keyboard and mouse + + + whatsThis + If you allow this option the remote user can enter keystrokes and use your mouse pointer. This gives him full control over your computer, so be careful. When the option is disabled the remote user can only see what you are doing. + + + + + + QFrame + + name + Frame12 + + + sizePolicy + + 7 + 0 + + + + frameShape + NoFrame + + + frameShadow + Plain + + + layoutMargin + + + layoutSpacing + + + + margin + 4 + + + spacing + 6 + + + QPushButton + + name + PushButton8 + + + text + Help + + + + + name + Spacer2 + + + orientation + Horizontal + + + sizeType + Expanding + + + sizeHint + + 20 + 20 + + + + + QPushButton + + name + acceptConnectionButton + + + text + Accept connection + + + whatsThis + This button grant the request. The remote user can now see everything on your desktop and, if you enabled it, control your computer. + + + + QPushButton + + name + refuseConnectionButton + + + text + Refuse connection + + + whatsThis + This button will refuse the connection. You should chose this unless you trust the requesting user. + + + + + + + + + image0 + 789cecbdd976e3b8b62df87ebf628fcbb7336af05a56ff500fb6255992fbbea9510f24009220d8abb35d3f5f0bc4042d47d88e7064e6ce38676772d8e9195443cc3557031004fecf7ffdebfefce45ffff57ffed762e92d25fb178bbcea5fffc55769fafcfffcbffff7fff7bffe77abbbf3afcececebf5aed76e75fbbfffbfffa5ffffb62f92ff62f67a7fe4f637706dc32980d817771dea971cbbe9e9d01e3f5c10b305ecf97c06dbcbf03dc3158b481bb386f710fef5f01f70dceecf981c18b19f010eff76abc6bafcf57c0b8be3c00b6d7b700c6f5891c18d79797c0b8befc0018d7574c80717de90c18d757ec01e3fa9cb2c1adfafa4360cf9c8f9e1a5c9fcf77817d733edc34d8bcdfbe9e99f3eab8c1f5f9c25e0fc7f5751b6cce2f8185c1ae5fe3b6e54fec02833f770a0cbe58010cbeca1760f055cc81c15772080cbec43d30f8f02e80d17e7e058cf6e63bc0686f211a5c9f2f5bc0681fbf0646fb44061ce0fba4c1d4bc1a47cfc02d839d53e05d839347e036f85b03778017c05dd82706ee815f56e38ee5d7390306bfe123b0f5b74360abcf0760cbf70130f8e617c0e03b780606df72066cfd65b7c186bf25b0e5ff1218fc7317187c3a0530f8ccf17acb673002069ff91c187c56ad06d7f128af80c16f300606bf8b9706d7af970360f05ddd35d89cc7f559fe8bfd069bf339701ffab0af1fe0fb6e81c1d7c201063f2eaf71d7da939f03c39e550a0cfb7931b0b5df0a18f6f32e81613f3f01867d820360f01de0fd96efac030c7ee30130f82c17c0e053e0fa6cfb179b06d7fc78688fe5a390c0b89e62dae0faf5c50b30f891c306d7e72b07187a0ad70d36efaf80e1cfe15383cdf94360f877b669b0390fbe5ac2e07217187c558306d7e75d133f7ad67ee10330ec97dd02c31f450b18f60c6360d8b3b80186fdd25d60f0150f8111efe5b4c1464ff6f3c14fb00f0c3e7cfb7d68bf7f040c7ff47bc0d61f8dbff7ac3ed41818fe18ef01432fd909b08d6f16432f7cb7c1357f4e0e0cfd843e30f492a33dd6fed91a18ede1a3061b7dec00c39e25f8b4f68c36c0b05f8cf693798c5e23e096c1e10a18f1259e03b7f17db0f72ee2816bea837ea307050c3d44d7c0b0771503c37fe37d601b7ff780117ff35b60d407210386fd230f18f68d6e8061dfa80f0cfb4a7c9eb55fb9030cfbb11218f62b2b60d82b2e80612f3500c6f5880418fe299e816dbe150d36fcdaefb3fec781612fc7e8a96fed95f48061af60096cedd50286bd38f8d885fec40b30e2fd62d2e076cd770e0cfb86f6f311df72177860b0b2d78778b630f549bf6deb57a38741532f77816d7d3401c6ebcb08187ac94a60e8a57c06b6f5640fd8e6e32760d8a37804b6f1c19eb7f6d807867e72135f068d7f57c0d043b506467e0c2530f4e164c0f05f760e6cf5003eacfd7dfb7ed83b32f17e60edcdc7c0b05f8ef658fb24e0d3da23bf00b6f6d86b706ddf14dfbf8beb0b170daecfc73bc0b8de68dde0fa7c083e7699c1897d3d3738f381a1e74436d87c3ff8d80d80c13799bfc6aea9ef87562fc511b0adf73830f4e254c0d08bbc03b67af180a117e71c18f125dc01867efc3930e28530d73fb4f1bfec01430f510c8c7a4a580c3da82130f427f1f94dfc5e01237ee72fc0e02fb3df0f7d5446ffc3461f2d60c483b20486bf46b85eab8fd09e87bdf30c18f6cdbac0b0af1a01c3be31aecfda53806f6b4f65fc6b68ed59e0fdd461a8316f03efe2fb05701bdf7f0cdc3178a180119f5cc3afd7f4b74260e8c3390446fd11f9c0b63fb0036cfbd31130f4526d80a107d7be1ef6ab4a60c40f4f0123dfe426de7a4dfde002239ea43d60e847e27aad5e920530ec2d0c9f9e8def9104b6f1dd01467ca8ae8161ffb000463cc89f81616f89eb6decdd0786bd9d6360d83bde0586bd3dd31ff3ac3d430f18f64c3ac0b0677a010c7b6657c03d9c4f1bdca9cf5f02f7cdf968053c803ed206d7aff7a08736e2dd226b707d7e2180d17ed7d8df6ffa973130f4e30c80a19f4801db7ac603867ed27d60c49be80a18f928bb03b67a390446bc290cdf7e539f84c0a84f3c7c5e137f6e81a19fb4058c7812a27d369ea80930f4159a7cefdbf8c10f80a197d89e47be104360e825ed03432f49050cbd940530f412187ff0ad5e78000cfb2f16c0b05f82eb6f235e893d60d8af120d36f69d035b3db71b6cce83ef36ae37ad1a5c9f9719b030b8001fed00d8c407bf83f8b680fda9036f3eff0618e347aef157d6d43f73605bff8c81a1afa0036cf5e503dbf8f4028c7894e2f3ac5e8a7b60dbbfc88051af3a2930ece95b8c7cef9bfe0fb3f5453e02861eaa4360f05f9e0283eff20c18fc96d7c0d00337f504b3f62f7360d8bb8880f1f96a030cfb940c18f6a9bac0565f4e83cdebc1a7b557de6fb0892f4360d82f46fb3bbbc0c7c06d83a32570077a7802eec2feb07707f1cb35fd016eed1f590cfb8b00d88e5ff580617fbf0b6cc77b1f81919faa0b60e423a70f8c7a36d80023de943e30e28d6ff8e1cdf89202b6e3733bc0763ce21cd8eac5f0c36d7e4a96c0563f2930f453e27a9af871040cbde4b83eab97c405b6f505aecfd61751040c3dc51530f28d83cfb7f923df0386dec42d30e20b0f81a11f1f9f6ff5c227c0d04b9901432f027c367ac1f55bbd24f6fdd04bd206865e24ecd7e91b9cdf37b85bdbe31918f96e71d16073fe1418f9ae005f1d0ffeb2dbe0faf5d10b30e267390446bc748d7f8a263f0e81ad7e39b0ada704b01d9f1b03a3deae12603bde7f060c3d4bfb7ee4cb6a0a6cc7b75ac0d0b7370286be13bcdeead9b90046feac22605b7fe1fa9bf1ce3eb0cda73130f4ae70fd367fe6462fc2d65b3ede6feb6dc9806dfd65313e2fbd69b0d1bb7dbff58f0cd8c6d34760eb1fa63e12d61f2af069ebedbc0b6ceb6bf06beb2f6e31ec5f3d0123de5646afc2ea5d810fabe7ec05187acdc0b7d567e601438f2a00861e53fbf9f87eb5db60a367e8c7ea315a0073735e9d020b8333e8b51318ec9af81334f977046cf5cb80ed78c51130f4ec4860e8599c03a3becb62603b3e950043cfe20c187a0ed6c0d0afb800867eab0218f139c4f5dbfe443e01b6f757f0fd4d3d78090c3d3bb89e66bcde9eb7f78f0e806dbd68f41cd8fe457e0d8cfe85df06869e95038cf899cc80ad5efbc0d02bab8011cf25f86efa8b4360e833bd05b6f1fa06187ac82260c46b8ed75b7d06c7c088afd515b0d5eb33b0d55fa7c1b57e923130fc21ea36b83e5f810fabbf2a03b6f5c7bcc1e6f3a00792538d39beafdb423c063fdd5dbcfe05b80dbd437fdd8ec1e902b80b7c08dc337861e245d043fc75ebeb6bbddebfbe03b6fef0086ceb9105b0f58f7b60f807af806d7df2000cff5017c076bcc5be1ffee2f6816d7ffb0918f1de7d06b6fe720a6cc7674e0cb6fe51ee0163bcc67781e12f2a05463e08bbc0f01fa7076cef3f1c00a3fef11260c4ffe2d6e0663c7d088cfe5486f6dafaa85a0263fc35c7e7d97a495c01239f946b60e487f4da601bdf155e6feb1fb10146bc17f6f5b61e9a03a31e62b08fed4fc7d087ad4ffc2930e27905fe6d3cce0e81e10f4568b0d5b7170043df19f8b5faf6f07956df12d76bf51d95c0d077300186be430718f591d807463d54c906f76afec0777708ff3868707dbe60c0a88ff26583ebf339f8ed223ee4f09f2edaefd6f1bbd5ccf7702b60dbdf5b025b7f5a01dbfac907b6f5930b0c7f72d7c0d69f6f81ad3f6d80edfdeafd061bfd67c0c847de04d88e8f7781adffed01c3ffdc17607b3f5b01db7c65ecdbb2fee83bc0f04777006cc7370260eb8f1d60eb8f0b608cafaa4b60e433f7cc60eb7fee39b0bddfbd030cff8a6f80e15f053ecfe633ef1a18fe9eca069b7c86f6d8fa2c7a00b6e3653360e4bb0cdf67fd33c5f5d8fe6d8cefb3f98cdbf3c837ea1018fd5d097dd87a2cca81d1ff88a03feb8f71db60eb8fe931b0cd2f2530fcaf047fd6ff02f06ffd4fd8d7c3ffd40130fc2f7e0686fff10818fe96431fd6bf8aa2c1b57f6547c0f0af6abfc1c6ff4e8119be1ffe60fd2f3f69b0793df4d6457ece8f1a5c9fe7e0b71be0f5e087dcadc6155edf6b19ec9af637f3a5c431b0f5cf03603b5fe70818fe98dc35d8e4975b605b1fb681adffd9cfb7fe77036ce7e3183dee5a7fab38b09d8f330586bf85bbc0d6dff07dd6dfdc93069bfebcfd7cf85f2880515fc61360f8a377088cf1a6386cb0a91773609bef4f81e16f41066cef8fed01a33e758dbfee5a7f8f5260e45bff05d88e975f00a33daec5c8bfd10e30fc3f7a04b6fe7d0f0cff2e1e80e1df11aed7fab73700b6e3d94f0d36fe093e6cbd9a98f8bf6bfd977bc0c8bf01f463eb57be0f8cfe53067b5b7f2f613f5b6f66b0b7f5ff127cd97c9c5f01231e30e8d3fa7f82f658ffcf70bdd6bf32d8c7fa4f01ffe8e1fbb25983ebf38b33607cbf4c1b5c9f57f6fcaec1b207dcc6fb9f81717d45d660733db8de5e17fe3b07ee191cdaf7f70d2eebfe60ab99bf1799fcdfcc6763a7c0f01f7e066ce70b0c80e13fc12eb09dbf760d0cff28ce81ed786c046ce72b4960eb0f3d608c1704f6f36c7cb86ab0e9bf05c0b63f77078cf17f77088cfa551a7db79bf9051b603bbf2006b6e37bb7c0e81f3a13609b6f9f80e15fce25b01d0f54c0c8bf410a8cf810b580e18f4e1718fe58b9c0f0c708ed6bee2f1bfbb61b7fdc07b6e31f07c0e85f2637c0f0573f03467d9cae81d1ff8cf17dcdfd02b4df8e0ffab0bff5bfd2d49b6deb6ff10218fe16c37e4dfe055f4dff0ef6b4f936017f36df720e8c7c9b817feb8f09f46dfd290981e12fc10930fc259e02c35f0af06ffd2585fe7ba8a70bd8af87fa39f5816d3e477b7bc8df15f8ee217e2c4c3c6d0fe07fa5c91fcd7c4f65dad769e6b35d0043bfbe89979da6ff6531f4eb84c0d0677a006cf5b904861e650b187af4f781a1c74001a31ef41f8051cf050930f4ca4e80a1575e02dbfb6346cf1ddb9f8b47c0d06bd106861e1da7c166fc0cdf6fef7ffacfc0b6bf1801dbfad1d4131dab57077cd9fce3e37aedf8497a056cf357008cef777c608cef65e0cfe6a7c2c4ab8ed57b09fe1abdc7c056ef1b60e41b6eb1ad37ede7a17ef44c3dd2b1f9a5e80043efec1e18f943819f46ef8fc0d0bb0fbd587d67e0dbea7bb10286be950486bed51130c3fb970deed7fc431f8dfe4f1b5c9f8fc17f0ff569b16a707d7e3105867fab5683cd79935fc83ca867f71b5c9fcff179fd96c181f1c7aed5bfe30243dfe12930f24fc51a6ce271000cbd0b0fd8eaddbe1f7a0f5ac018ff0b4d3ee9daf13f079f67fdc19b02239e47bbc0f08fc89e47fc0eece7c15f3c1f18f1dbbf0746fbbc1418ed6161838dfe57c0a8d7529cb7fe93ee01e37e8fc381e12f0a7c587f70c09f1d5f94cfc0c827fe0018fd95e20a18f98499fab96bfda93a00b6fef4000c7f2adbc0767c10edb7f943e2fa6cfe500530f4e5a13dd6bf62f065fd29a880e14f05ec67fd271c01c37fe24b60f88fe802dbfc60cfc37fc22130fc25053f8d3fc0be56ef59d660737e1f18f525ef36d8e81fedefefc23fd0fe7edbe0027cf73b060bf0ddef1aaca0877ecfe0cae23e3ecfc4b79ed57b69e245cfeab9ca81a167670c6ce7c728603bff65000c3d4727c0d0b3b36ab0e93fec005b7d47c0f0574734d8f4479e80912f220e6cef871abe7b56ff3200c678443602463e713ac0f08fec01d8f66fd07e9b4f225c8f1d6f4cae81d1bf1168bff507cff853cfd657ec1818fe11cd80e11f5e1f18fe21d6c0f00fb60046bef1c187f58f18edb5fe101e00c31fe27b60f8431602a37e62b7c0f0077e070c7f48c147a3771718f9203d6970adaf04d763f5ee1f0243cf09aecfead9c3fbad9eb37360e83984feac9e9302187ae6d06f7f807c067df687d03bf8eb7b78bf07ecc31f8f80910fab0a18f9af34dfff3a9fdc5c6fdfea3b32f6ed5bbd3957c0d05778036cefffdc01436fce08187af30f80a1b7d49e473d131d02c39fa25360e48770d660a3af3d60e8357d04863f396b60f89377d360f37a532ff4ad9ee519b01d2fc7f7593db300187a96b83eab671fedb7fa0de7c0a89f820218e36912fcdbf13476098c7c1098fabb6ffbf76a0a8cf82ad15e5b7f052530f24102fbd9f89e7780adde8b061bfd64c0d07f1c35b83ecf9e8051ff2813dffb56ffd90418fa2f8f80a1df08df6ff51a803fabd700f6b77ae568afd5ebe2a4c183bafd3130aeafea35b83e9ff58171bd59d1e0fa7c85f303f8b3120d36e76f815b062f609f219e77cc8d7f0e9a78bb036cef7706c0d0afdc0746fd11f41b6cf4710f8c7a449af60eec7892ff080cbd060fc0d06b60cf5bbde2f3ad5e79010cbd86d7c088bfce0130ea95f01818e3c9ec10187a764c7f6160f5c8f1fd4dbdbf04861ea57d3de2b174806d7d7f070cbda64e834dfc0b81ad7e4d3e1a34f53607861ee30e30f4c89e81117ffd1630f419bac088af3202865e19f8b67a2d7681717dc91c187a95d047a3cf3d60e8515e35d8e8cdc49b81d5639234d8e8bd04463d95cd1b5c9f4f86c068bf5a35d89cc7f50ec0473e6cb0f97ee86f807c953b0d36e761df01f88b0f1b5c9f2f61bf410fd8c483e6f90269f2dfb0a91786c0d06b1001db7a610e6ceb05090cbd0657c0d0abd306863e63058c781b9e01433fd111b09d4fb068b0e99fe6c088c78ef197a1ad4718becfea3f7906463ce62930c67fd21760f8073f06467fd8d90746fd22c09ff51f0ebeacff04e0c7fa0ff78151df2779838d9e4e80a14fe70918facca6c0d027377a1ddafa45e2fa6dbd52e2fa9bf88eeb69fc2503c6f7b34d836b7d880ad8e69f0b607b3de0c3fa4762e2f3b089d7bd06d7e7155e6ffd41dd005bfdc3de56fff15383cdeb4b60e83df780a16fd90586be03f04d01c8e41bd89b1cb6c6850b3cc4f7dbebf3f0f96b60f051758019f2cd718387354e8091ff4a63afe6f90ccff0ed7551df70d35ecfea333807b6e3fdbbc0d06778056cf53900b6e3f9f83eab4f9f01439fd11930f4194d80a1cfc07e9e1dbfb96fb0d1877d3de2bf7f0a0c7f553e30f4e919fb7b36fe576360c4477f048c78e8ec01dbfa7c0e0c7dfb1b60c43769df0fbd3bcfc0a8cffd5b60e8df790146fe503bc0f007fe048cf69617c0c81f0cf6b2fec0c1aff587e0b2c1c6fee0cffa476ae2af67fd210881e10f2907863fc83530f49fa4c0e083bd34d8bc1ff6b0fe900e81e10fde3130f49fd8ef83fea30360e83fb49f0ffdc702d8ea7fdde05aff7e000cfd0bd867003e14ec39001ff95383ebf773532f7a43f0933c34b83e5fe1fa87b6de1b37b83e1fa3fd43f0b780bff8f6797993bffd1ddccff24cfbfcc61fdac0f0876a040c7df30418fa768c7ffa56dfe12530f45ddc01db7a670d0c7d87fbc0367ebbc0d0b7770b6cfb9ff7c0d0b773030c7dfb4360e85bac806dbc8f81ad3ff780adbea7c0d037eb0043dfdcc42fdfea571c02db78be00b6f50daedfc673e136d8c463f0d9e8b704867e8b16b0d5ef1130f4ab603fabdf1cf6b37a15689fd56375020c3dc6a65ef1addeb2b306d77a628fc0d0d702d767f555f006d7e7cb2e30da178d1a6cf40bfb0cd15e7fd2e0fa7c760ddc3538b4e77b06273e70df6015010f0c2e4cfc66564f41006cebc104d88e5fcc81a19f780c0cfd8417c0d04f780e0cfd881930f4231c603b7ebf02b6f1f10c18fec3960daef960c69f98ad1f9c56838dbd1f81a1b7681f18f66057c0e03f3c0406dfec0618fa726e81a1a7f412187a927bc08887c91a18fa4ac0878d873e0786de822130f496b6816d7bd70d36f686fdac9e12066cfdc56db089b73bc0d04f2a80ad7e8e80a11f9602433f81fd7ce847768087f83ce861e8e13cae9ffad746efe06f88f89fc05e438e786efab7dcda5b197b736b4fef1918f6f472609bff2e80d1fe7c0c0c7bca0360d8d32f806dfd370346fd975c01c3ded11e30eccd1f80616faf0b0c7bf37b60d89bd9eb81bdfd35b01ddfb0e7adbd4dbdca6d7c896360b4dfbf69b0b1970f0c3d30010cfb3b77c0b03f437b1a7b2b60d89ba13dd6de620a0c7b0716c3de6c0e0c7bab0a18f69697c0d6def6fb04da073e87d0f762d460af3e6ffc857be0233f6b707dbe84bd3cf091761a5c9f5f404f9e8dbf0360f0939bf828acbdc33eb0f5e75360d833ee01c39ece0e30ece99f01c39e313ecfe60ff5d06013cf1f8171fd8100c6f57a4fc0b8de78030c7bf26760f8b3633f0ff695f6fb605fb100b6febc02867d99036ced3b03867d9d7b60d8979f00c3be620c0cfbca0a18f665e0cbda3363c068bf2f1a5cdb2fdc03061f016f707dbe8881c10f9f35d8e807f6f0c0973f6eb0d147000cfed4acc1e6fdf6fa7a0627f67afa06e7e0970a76f379c6df041358afc5f85360ed2396c0b08f77070cfb44e7c0b08f5700c33ebc076cedb302b6f67900867dbc0d30ece3dbd7c33e7e090cfbf8a6be08ac7d7c5c4f639f8b06d7ed65fbc0b007e3c0e0dfc3e75bbe59020c7e790e0c7e590b18fc32060c7ed90878087c00ec199c9d02fb0647636006bd38c0dce0b48eb7242eb45f31836dfb451f18ed577b0d36d7ff028cf67b6b60b49fb9c0567f970d36afef00830f760d0c3ebc1530f8f0dac0e0c3ab80c187bf04061ffe1530f8f0ec79f0e1dbf7838fd85eaf005f3eb08dc7e70df66bff5e18ec231e2faa06d7e70bf0eb83affcbcc1f5f94504bc6bb057c797dd96bd7e6f1718d7ef2f8071fd9ec5b87eaf058cebf71e8171fdde4383cdf7ed186caf5f2e8171bdf14583cdf516c0b077ec34b83e1f7bc06d601fb883f7bbc05d600edc0366c07de0da3f7677a94365b0d1c7aec0f30b17cb7f8e9f3dfee1eb6bc73f7c7dedf887afaf1dfff0f5b5e31fbebe76fcc3d7d78e7ff8fadaf10f5f5f3bfee1eb6bc73f7c7dedf887afaf1ddff2e53a6f8fbffbfa7eb7e32d5fc490e7fa5b8747c73bbcfde732bacd57cd1673b92bdc800e417f71c2ace66d8b999a270f7cfe8731f6ca17d8126ee846aea49fc88de96f05e66a6e9ad7f935afdc72f977b7e26fe2cb27064237715337a39f9c8e849893c49b22ce187c53b325e85fc29a4df19fc5d8377c05a4aad42d7064f5a199d39c053563fae0c453445c26f45b11fa4fe58b51eb253154b8251ddbaca5c48d61ccafd5151387fadf73fa4b2bec3f8e2f442f45bc7ccb97e1cc3026eab8a55568f98a6a16ffe3f822c63c44af0c1c55eea23e96f497614cd27951c72ed9f02509b1ff1c8f7cc397d557e5aedcb5bb719fdc67f7c5dd73f7dd03fa17a3269d2f436229adf91ab96377e21eba5377f677b7e4dfcb57e38f73f788b83a764fdc53f7cc3d772fdc4bf7cabd766fdc5b3a23eb9c6872e89d7bef3eb88fee8edb7277ddb6dbf94fe0ec1bbeba6ecfedbb0377488583e3788eef30873bc2099cd089dc17473aba268b89af11b1b5ef28277152277372a770caff04c6defaa353b98fcec2593a2b67ed6c9c27e7d97971f69c7de7c019396367e22ce8fc615d4b1c115b53f7d2993973e7c839764e9c53cdd8dfdd9e7f175f5a5fce9973ee5c3897ce9573eddc38b7ce9d73ef3c388fce8ed372769db6d371ba4ecfe93b0367486598e3799eef318f7bc20bbcd08b3c495e39b3bd80eddfff73b2c1365f5eec292ff1522ff372aff04aaff216ded25b796b6fe33d79cfde8bb7e7ed7b07dec81b7b13efd09b7a336fee1d79c7de8977ea9d79e7de05457eef83e37f44ef7cdb1fbd4befcabbf66ebc5befcebbf71ebc476fc76b79bb74b4bd8ef3e075bd9ed7f706de908a56c7f77cdf673ef7051d811ffa912ffd987225fbf0f81fd03f7fe5cb577ee2a77ee6e77ee197c4d1a35ff90bcd96bff0979a337fe5affd8dffe43ffb2ffe9ebfef1ff823e7ce2bfdb13ff10ffda93ff3e71401d50787e9b7ff37afd5b6fc71ea1ff9c7fe897fea9ff9e7a4a8caebf8e7fe857fa9fff6af88b3b67feddff8b7fe9d7fef3f7853ff91a2dc5dadaf1dbfe5effa6dbfe377eb1efafb4744b93578bfbff9df65446dcb1fa77ecfeffb037f48b1abed2fc9811ce6f99cf9ce3dc5b2b6668c31c699709e59c0421631c962a6584247ca32963b5daa448ea832fbe8c8eb3ed5773df4ba9631e369cc8e51feddbcfc982f56b092556cc1966c552bea9cadd9863db167f6c2f6d83e7175e05fb1917fc1c66ce2dd382376c8a66cc6f47f7376c48ed9093ba5aa2c7bf7289ab18e08231d4deec4689a19a50c7ec667ffbe3173cb173b7377d939bb6097ecca7960d7ecdab96737ec96ddd171cf1ed823db61ad9ab11671b4cbdafea39fb30eeb92f64ad6653dd627be069efb215f76ac2321af84c29a11dd00a394c667c5678c610cce6b46ccffad8c357c0db9cb1dee71dfeb52b46f7b2b36e38c732e78c0431e71c963ae6a8d2d19f7d73c71da3ce51995ff39cfc973a7bce0251bf0ea0d4bd6135f39d3ffa615665aaad9325c25a43cf3dad791238f9df1055feac3f61cb64677457df0f7c72bff2a160d5fee8caf9c9caff9863ff167fee2b5495f8f7c8feff3033ee2633ee1877cea4ff88cfc71599f9bf3237eccaef8091b79156971c9fafc949fd5fdf20cd1eaf5b09c69c6d2664cc3b0156344d77aad190709f8b917f30b3fe197fc8a7a0e75ffb419335775af2cc2c8afffdddd05e7afaaf8c057875ff31b7ecbeff8bd5fb26bca8c2bfec01ff90e6ff15d62accd3bbceb07a4b016e5cd36eff13e1ff02139cecce84b38bc101e1b089f5a7c27181d5c08ea8dd221829ab16d3e54ad9fb76cbd8eb5e5ae14a188dc1d21452c9448442a32a714b9afa04759eb31c788c9db6868f4f75af1fda9d943f3a5d5250aef4c94a2120b62abf22fc552acc45a6cc49378162f624fec8b033112639eeb3ce93c68bec4441c8aa98e5f62216662ce4f89af2371eceebb7b8ea28ad61527749c8a33714e79f3aef15159e748568fb79991a16fc6269d21b17c212ec595b81637e256dc7991732aeec5437d3f060c8b47f79eacb2235a62b751958fcc616b3e4ee7a67ce176042974dbb3ff005f1d91f11bd1115dd1f3af756e147dd2d9a918d0d50e296539623ff0023f6001e7395516978108023fe76910526664e4bd7a0823e2a77adc879d0632889d65a082847e52671264d48757ee9a72e7dd1bbeec38edf6dd027ddc11bb4f81e465900745500655b0107bc1325879976e170cebd1a4b53709d6c126780a9e5911bc34be1ad98acf89c54eb017ec0707c1c839f524b5f3dafaf6aff3c557c158dc0593e0309832e6eb1ee3269805738f0547c1b1170427c1a918b13937b503771e83b3e0dc9b0517c125eb6a7f247d39c11555b05e701ddc04b7c15d701f3cb07ef018dc3ba36027680571b01bb4497b7788f79c9fbb93a0e31e792ef9f03daf28b31eb947942feedda3a01bf49c20e8070376c5bc6018baa1137aa11fb2906344f3c07d094518f82f611846a1f47bee6e18878afc5b225e8e040b93300db3300f8bb00cab70112ec355b80ec6147d56bfc659fdbccd267c127be173f812eef957d4c7aebc0d7f08f7f96378108ec231750e27016786ac9ccdc2c3701ace823c9cb32c3c2216b9e62b3c0e4fc2536f1adc85673c09cf852366e17978115e8657e1757813de86779e13de53348bc387f0915ab713b61c15ee866dfae9845d5320843daa7aaf88e13e7d4a5fd7365e190ec261e4464ee4453eb171e71e44cc1d86b7118f441444611445328add9d484509fcfbce5db8fb613b4aa32ccaa3c23b8dcaa88a16d1325a45eb68138ca3a75f61ac7ebee4395c462fe2203c622dbfa25ef6d25b3b8fd15eb4cf5ea28368c49556563426b6666ce6dc4693e8309a7a69348be65479b5ea8aec2a3a8a8ea393e8343a6357de135bb15574ce7b54fb3e795de144136f46efb8882ea3abe8da8b83e7e826baf512e752fb2d2fa3bbe83e7a881ea39da815a86897bea11df6fd958ea6e4eff3a81375a35ed4173b14dbd611f3bc68100d7d265d6f2e1de9495f32c9a5208dd6b98362db6db0ebefcbc0bf93a18ca494319f4a251399f28eccc285ccc3cdd7c7ebeae72b0a7127f665292bbf920bb9f476a8877de93cc8153f91955516792af513e55a6e2252917ce2a57c962f4c91e29818cb3d3e94fb413fbc9207dec6eb50146c7b3ad3b6a95abba62aed5e8ee4584ea85587722a67c14acee5913c8e0ee50955ba7d79eaf5d9b13cf36ebc3d6f4f9e875379419f43fd32cd97bc9457f25adec85b79e7f61c25ef831daaffe6ce8e57c8077fcda6f2d1f1e48eef9057eb1879e7b9615bb6c21bb94b958ec7e6f2927edab2c363d925d67ab21fade5c029d9f017f81a462bd98b0ec2bdd88d9dd88b7db9f41754b1269aa558ff6ac55c766241454fe0705e867771e85ef82771144bb6438cedc471b8efb4631527ce23c5bf4ab793febd457cb53477b20a07ec284ee32ccee3420ee232aee245bca4528b3c972de315eb914f9ff3b9771beec76ba7156bd6f5e8c89557c92a7e8a9fe397782fde8faee28378145ec763ef49578ade8abf44e76c191ec7a37842b979497cddbb2feed011fc485ed0398e4842eda08ca5581a1fc6d37816cf45f65585d5cfdb1cc5c7f1497c1a9f45e3f83cbe881d6fc7d36338ab9a2ffa06d9112319c797f1557c1ddfc493f8d6ddf3f7e2bbf83e3a881ff475882955f8a9dc8d57bc578f6d90ba24b593fa9dc4ba57e92b658a5afd283af14edc8a77e376dc6163b1a0f6507ed1de4bffbf8bbb62196fe25e4cbe48bcd77c5185bc03be06f190ca044779caf7cf146566efbef6d76bffcc67c18ee2de84e256e6aec336f536fae1857757d7474b36a2a8515b5effc8b612629fb7654e71ff4b31ac7ebeed45052a5411d5ee15c5aefad05665fb624cf5c2235512a74ac6cf2a564a252a55da7eb72af706aa5065dd4b62aa520b4ef1442dbd3b6f4dfdcf7dea23f9c1900ad799b62f7dda8825c154add45a6dd4931fa967f5e25fe8b6ea16518bf5b85147ede96a59473f6f5d8fbaedea71243156fbea408de4408dd5441daa29c5c80decd2d6158eb3a31f9f367c51ec2275459c0fa86f67d8626a46ca9af11979cb888df84ccdd5513c8b36ea987f595fea449d924f772842516fda1754959e1053b370e01d4bc9bbea4c9dc7c7a1c71d79186cd4451d21d6ea525da96b75c3e66aa666f4fb56dda97b3d92ad19f04bf5a01ed50ecff83d3196181bf33c1aa996da556dd5515de252577ba423ddc7327cf197fadd2b525787d8b837fa71ee552f58a8be1aa821752f17ce337c5133cc9c8778439e5c84b754ffedebba2c71d8893cf16ef9b3fe549da7541530962a1d8d5bc4180b189711d5175ff5c8ba9e584455e225be4fd57bcc139670b94e047b4882240c26b29f4489a47a36f57be18e3bc77c94fb249647894a1255197d25699225796df78ad829bdae77eb9f8697d1bef7a4ab607fa9ed2cdb491155f18ca277c4f688c79a23dde63a97de89a55cc9157390192b1309495fbda44caa64912c9355bc4cd69443e8e02fbce7ecc88b78cd0e1d916cdc1baae61ebd4978973c25cff2c0d723536d96c84b7f22466a1e4eb8aa15c6e4259ff20eb5fcf917f8aa9297c40b48b3c91eb57b3f394846ea20192713ea07dd518df7a42bbce4d08b9bea3a738f926932637709651d5d51d0fb8e92e3e484ea4bdd52d24772aa6b2f3ef70be7915cb6ee37f03c3c0abce42c3e16fbc99ccd6b85acbd82a24fa196ba62735ac24dced99ee967186fa316cf920bfaaecb64196562cde2e85ce7145260915cc56b3f4fae939be436dc4dee74ed1bb683c4bb49ee49bffb5a5dbe0858344a1ea25140d1987c8172986cf369f2422d7f74db5fe52bd9892aaa4dda5a27492bd95567493be924dda41752ce8d9ea9b26ba3afab2c5fbc722e927e32084e59aae342c0922115d58e7029de77d875ea794fc18c6a8baef3586ba5ae0c02ee07a99fb403471d0487141b2977faa57f169e4767b10aafd9a17c4ce90353c1b8e14bbfb3eecf576920ae9d591afa0c234e6db517f7292b1fa4512ad3384cdd3ef5271f837618043bc9b373ebaf74df43fba2eca88ab2d665cce326e2078751952aea95fe025fea9cfa42cc1ffb63d991719aa4697c943caae3edbe563ddfe97566ce91df493376a7df176b7b7588af3c2dd2d2c461ffd2a78c47caa16cafe393f146aa81f4a757622f5d68a6899592b473c526e9325da56b39a11ae3327ea2e832d3714d33af9971ee938b74933ea5cfd161bc16cbbaaebbd6bdb6f425dd1357de95bb93eebb3d7744b1f5263d4847f19a3f531c5c527039a1efa1181beb6abb8e5dec808dd27152a413f1f22bf18b4ade059fa663ddee744c7f1da65399a7b3b77df97adc5860fc25757be93c3d4a8ff5fbb42e292eed2a999ea4a7ce7ded435a53eb3a86b79bfae232e1e9593249cfd38be42538255674df739c5ec6cbf42abd4e6fd2db64e09d8891c9b95489eceb0847f1fa24bd4befd38768377d0c2feaf1f27b6fe53c8487ec32dd495be9ae68d57dc7c47d481caa0faf9d16e97ca5ab65b697b6d91ef940ae470b586dddb4433a3f0b9c6893767f852f752e63a533fe485e2a11958924bffee6739ad150dda395e97eda4bfbf2fa5597c9501da5837448f6ac2b5453b1ead652852f5495b9f153e6641ef5ec9799af4e83d33a028c3296b6e328e39988a2e0d8a72e34d90c3d7bcad294cfa895f3e4c27fd27c65817475f43277abe45e16665126dd5db16bd49fc581cc5470ce1f4c2d4b3de17b9e650955cb7ba9d07ea9635996665996275257f85faf27c24a9d53fcea187d6545e8883b39f8deaf31c3b51e5bcacaac327cd9f725c36c912d039f6ad491ae31355fa4901d36cfdcf0254978375b259364275b671bb2d029975467335d63044ccaec297bce5eb23d3e0dea1e454c519acd8329fdaeb36fb6cf37d9013bc946d1241b93b75f51ed93506098648761198c444e8ce979a28f41963c451345fd74dd47910f6c190c7c964de38edf0a4e292b4ad5ca66e984b7c3f557d565f9d2f584d6899a115ff3ec283bd695ef3b7cd9f9e6228cb31379f39a27c81f87e959ea534fe3811d64a7142328df523bcf4855e7e959fc9c5d6497ea24da844f712bbba28c5c64d731cb4eb353f213ea6e05277e4855cd43dad19f1770e24dfa13d37b207dcde3abec26bec90ec2397dbd8e0123ad3bfaf4595ad575e7c2f5b3dbec2ebbcf1e78923d52de6df317ca2597629eed44226b65bb143f3a7a8c22bb522772a847757ea5ffa8ebd5c4337188abc05767622f7ccaded397618c0ef19075b26ed63375889ac94ed6cf06b2a7fd93b5340bba27959d05a714b15eb2a1178a3b75122e73579dd0d506ea2cebeb0a39767dd22357541dad72873dd6f5519deffd20f7fc408fbaf1195521a74999fbfe71cef87ece3357df49d07568762d5554e64214e23e0fbc58c83c549e37e7cfc457c7dbe4517895cb3cce559ee4a9bcc933ba8a951cea6ce6b6bfca96e12bcf559017e144e790f8c10f544bf63fca1cf65e425ee695d665be08276927ed5025389569becc576a5eb7e540739faf793798903d8fd513f1f514ad62f2847ca38ef8347f4a3bd1582ee482186bc50f01f9749def89073a335222f1b254b6b5b7072c38f582fc3994f94bbe973da11776a06d2246f93ef17f128cf303560407f9c8df553bb2ae54fd553ef6f3e82488f3497e984ff3593e774ef975f4c4575f8b5bdb7c459b78a6a41fe8abf5c72c254d2c2882bde391af075f3aa79a2f1bbf648718384acef2e3cc54b007bad53c0ec7f949b4c886d9906abab39cd41692c78b114bf33376909fc75eecc985195bd39524bd4f7b7225bbbc9b17596a322545381575f38bec243b897a2ae05dead572c318d5555dd9333e991ce697f9737ec5323deeabefa186d4d78ceff2ebfc26bfd5a3d622773b5f57d55bbee430bbe287816fae2d7ec852aa582339a4eaebc3bebbdbd163d8a1931575fca2fa4fc6f95d7ecf3b59c61efdb1f6489d05023f2fe2a93a0b4e6442116b1e8b7042b5f52ca72817bbb14f07f115bbe4bfa4ab3aee91d6c4481cc4d37c9ff475a966daebc401f9c0633ecf77f2567a21f64d5ed0efd2ea4bbc88d44e0adbcde76129afd903eb32ae6b95bc9d77329e7793453e737729c6fdc119909aaf60ac2b0acaef1d5dfbf259f22013dd774fbb1f6b96af487fedbca7d5a4e397aedb7894f7e3e37c900fadb7e8a8ed07811ff885ab7b6ff038fa96c2f1afa2717c5150495bf89a2f932348a997b11007fcb060aa455552475f51a14b8249b8e2d76e3b7ae63754c3f9f93a360a1be95e433c157b72580852fd8277eabe83ce0814f954af088ab088a25ede129968fff1fb43fc3a9e271399a8b9beba98512cea464b7d759ff155c8f4223fc91da34aea5f9c525cbfcc0565ea6ec1298669cf6af9c490ee8b7095d67e6be293e64ccd8a58cda88f3fd3fd56333a1570525f5726c1a45051a5951a33629551d6f4f37e91841bd11659b44922b556a2ae3c742e6e917717b2ef5112247d2d75f6aaf9d25aa5be55962674b1e924bb142f321799bed7a1efaee9e357f263d62e64769c267cca52ad7e312a525dfb7e3c36e4ce9c327c52ed2243846999f191cccf7362b167ab28c4643342ab996ad563500fe9986c12e7eb2ccdbdf830d92f384bf568b11891ca293e259117468bc08b46ba724d3bf4ca81d82b124fa65d4a804bea7fae291b5cebcca23331f51cbc68c16fa2674f8654e5e5fb5489d4235dba17c41565518a866a2dfbd9b178d1778892477d778d5af8c5fb44aff71fb3a13a93b118f901b5bce46d517c5cfbf2a53a8e36d930f5c9131eb486c44826d132cfc375dccafbea4c519c8a1ff435d739a4ee8350fc57e14450752de3224f7dd9cb8f8a225f16a59279c1a53848cfa232a548142e1359288af7d7f4d914fdf321d9a05d54c5a290e1227082893aca87e1849b0c41ea964a05e2a5581682a2f1253f8c0fd1a7aaff2315a868940f8b95d8a7dcbf47b56a95bbf13c7c4a1eb5667f9eb17a3d2f8aec72a04ee299d88fa7d9806ac9285c99d9bb9ff115cf64c21e751522dbd4a2a3ec325c8bac58eb4fa25c49d94dc776f254a6f5943ce46b8a6c925a7a4cac4cf27eb4ca05c540915d169be2a9784edad413bf8b3632978578899614bf26263b7299e5c4e253f11291468a8ccbf8b0d023f1baff3cf2c7d14847dcf828dc147b14c196f4491431a916d1a337bab6199931c3e44109d55267054b5eeabaf5325c92618e7fbecab7f327c28d2cf29ceabe3db1a79ebc2879fc6c76385f869b6c9356d92016698732fb23f9ce2255c1386bebbbbfe152ec2567451678f982fad5144fa8ae205b142ccbf51d407147beb391435904e362df3ba79aff88acbdca367aa42d7a4abbd4678af2e3f8b0e6dbcf068143daa59e417140557157dba1562f33de980fd53abd28a4f62ed24b21eed2497ac6a7946b583da28a1e07a7bca4e6d47b9c279e389009e5ab2179375df5cfc6313b3fc7ed444fd133c586a7f049c7c4cf9f3ea0eaab24171a51bd5a146eb2cf654a94441b7e2dda7ca97358b609175493f429aa74a8d7d429ead147ca064af3a45949bbf577748a095f3925e5e2eb7083f1a38e5312e70b8a368384fc94785661551c16d3a4ab8270ac2b189b397444d7b140f6f39c3ca2a36d9f76c96bab78163aea282bd06718d51978a4e302556ced70925dd39969a6bde2e9e715d6cc5f25c6dc3645f18dbd6a76f6f10c3e7a35e5292f8a56c9593623b25ed28ab2fca3bedb521f6d7e4d2d7ee237ea24a5b6d24f7d275ee6ce29789abdfd3c33cbcb8e209936a7aaa0aa4b058193ec143279a48aefc5f2a533aba93ea8df542467d47f28ccdd44dd12f29601e5f73645fed3807a09b5ca4c2d7c60c60bf5dd0fcad05cdff5888fb49dbfc6d7b757fde619edf7e6a391069c53caec325a69ff0ac90b5f3d585fb36853afe3da93ce69f248754f667a213f978dd890fa2bd7328f36d42f7bd1118d5f17334f461bed8ff1613809273a2a528ffdb0209b912f26afd5a2fe76f37ef1925d51d61e0487a4c176ed99adba17f1a7f0b5c5c6ebcca00fe680eb6b724a91516c1ed2f1ae0713ef9dbad2a97dec6b3389d8d0adf98e9ea93ebdae47c409138314ef65cabb5ce60ba9b22c3f2e9e29732654c9bef9f686b321bd2353e7a9cfa7b1201f24adc9b6ce3f3e65a05ff7c777d8d23383e2fa99f777e7937eefc17ff6d3563a12529b57f4db7c2379b9ae27a892a7b8989c4514e1bc305c92e776dfaf09749cd55ea09ea85a3a2fb27c9ff2ce22380c4e39a5b75f8ff7eff0c5f154688ea744df7de6f8dbb8f3d71eda4ba95e1d682f5527eaa4aea0d6543f6c3eb3958e85b2888f122a10e363155086a6fc93e5c5f8d7eb89eff8da7e46dbce6ffb0d66c5939776742e25efafa3a2c91df4af9f5acb9d89b63aa6ca741daea8ba5faa9370a133d0afd6abeff265560ac8feaaa7da8d32ed2c49d39bb391ae413ae6d5714f1ff69dbf1215eb4f20a6a9ff5347c4e8d9cc36fcb5fed0277c15cd0cdd5f7aaaddfaeb1b3e286e879bb4abaf5a674f7d50757caaeb05ddafd37f99dffa7cf4ac5ba58e33b0f3472ca40fc3f61feb6fbfcb97d85a89423f6350cf42fed2d5d5d9405b547b8fe1430ee8a08c4ad5ec8a2ab245d67d3d921d3a64fd9b8eb0aa8f45b8e437f191a97175eda6e3ffe7fafb6b8f0ff9326b058cea1502eefdae53797131cfcbf7bc4633a3ffdff808b5a9ee2d0c289b536cce5daaead79a0df5548cd28b689556d1329d2467f25a94c1223df682ac1755ea5c9d53e5bb4817fa7730a17e2ce5c0e2399ea5557a51cf4c58e9da450eacfea86696fc5aebcff415fe88fefe105f941f8b23b7e73ea84ccf0d4fa6c5b1bc2d4eb4bf58afd1878e03fa30ff667f536fb92812ea43de6597f171714a1563ae7b45ea3c2a43273f95697aa65a991ea1a4ff44c51ed883bed34579feb0fe4d7febd9937caa7b79bc4b7de9697e124cd2493ccb2e795b3d59fd99a86df42707efe9efe3c8f8fd999fc9f31fd4ab1e3f77aae22cec15e7c58573595c26fdb4affae42fd27a4d5845eb70413f153c0967a82fdd4e2fd2aa50e982ba344745aefb8089a7dbcfa74ae4c3c017a3828747c1545562ca6672c5f65897cd6547d7ecd477a1dfbaa6d4231bd97534628ff93a77f8541c14293f14fbc4dc42731f55599e4e8ae7681938d9657dffe98dfe3e8e8cdf9f714e75b6d575f1e7f1ff237de9d9cbc9344abda9ef47a2b82aaed363791d95fa3ab5bf242fba8ad1aad17f51fdbc3067d47930d11a8aa754834f63ea87841396eaba5a8f07eada9a8e4bdd17c13deca49e1d78c11233b6a7fb84f53c07ea21eade0bf58ee9b57a8c56b6b36b3d2254cfdb8d0dfb521539efaa564abdd8d089166ff56755f87d64fcf68c566aae7b5f0565a04f471adee7cb57c54d7e58dc7a7ef0e8b3e2cebf655932d7de9215da63e8e734f1cc488df1a4d733fac887859b3ca463aef4787d6c6611357c504f7954df6dd5f3293baf7ce9b9346ff8627a3c568f2de8313646efe34a555a815a7bb2a3ff8a48a90517a3c057421c50afa7d19ffead6d1a556f23e37b67b4528be7bccfdbfa3992cf46b23ef0c769ba5bdc170fe932dc8f7bf126de30c5e6fa3aedf5062c9cc88eece87eaf19117c3da3ff45336555a2c7505ef9d26ad1a3d2b2126331d6332f79cf79140b3617d36ffd51ffae47fec1b7199378d59fb6444016d1b37855b5ad3fa3406d4f1d09be8f8c6fcfd0df455ee83bcbe4584722fb78a4f4037f9c168fc58e9f39d7c995daf32f6bfb333d36fcf6aa63dc35fcfeccebbc6a33da547ba2f64762983df2588c125eb4d895d3624b31a3663f89aad87d6d55566485123adac587f95adf5bd2774dd28e1e5fd8e64bb3a5c70cf548ebb7fad33fafdffc6a89efcfe888e14ffc80bcbb9348997f3c12ff195f45fbd7f98a31af9a3dead14ccd41fd538fb4f26eeafb61d15145380f8fc3eb8074cc8ee305bb93d7dbf544e888fdec881f1614a1b854fa3ecf034bf5615bad3990970169ec23fd6d2bfbe3336aa651daa16ba5082887e1e6cb7cf58a7e74e73f1603ed8fcedd3bfe7854fbe3d1f7fea82dc752350f7cd24b976a815e54ea1851ffd4a30a795f6df2bd621865a51bb482c4e9964e9aa57de7d846651d87f50c82ec58576bfade789a90e456e4370b8a998759a17d4ec6a4402716ec51f3f69efefe3d7c3967a557faee6534d0f1de1fe978affd2599cbab64aeffaf6b2653377d1bef134f8f4ce9d171994665e6954cd79af10b72d22277f94dc94bc1cea3dbe832ec3853675a06c9b40c59599ce495cdfa3ad3532d47bd8122e137d19ab7c55e3229c6c47865a2b63ed2841fa66754a329b5fa5e7fff267ff45c5646eea33b4836a534f504cb8beb324e37fa877eab52114eca343d4ecaac27af6d3d612a8d68a182322bf3b228cb4c96151d8b78a02b1d3dd22ab24294cb74573fdb523f8fb6a0df3da72a57c55ccf6fd8ee39e8b17d3d2e993cca3cdbf09b7069fa0a540ba0d6233d64b29f9ce5bd6dfdfd5be37db35293e714e7eed0b98c76a2c7e8217a7066ce4cffd67f5333d6ca496fca8dae64493fd2d632d13abfe0e3c871b22816b27c2a9f83bd30160fe54b7e60c714b07a96441fb57946f9fdabacfb89ab70a3b9f6a4ad3a8dfe0aa9f51756b950edb7fafb77d51366b4304adc7b711cdfbac78e72a6eec01d849db05306e6b7c6eea0dc4ba6e99c1a5a968bbcd2d79f57f93cebf83dffa8dc0f77d2fda0e3ce9be7acb79f1bf6b6675b6f3dd3fdc918881efdfab657c357595beb4f33f7567fffae7a15a3ab219ecb5cd2b112bebb72efe99f2b3cd979afff8fdf3db113ef9707acc84b3d038b74b48aaedd49e41353f6a97fb3c266bdf6e8aff3f5f1f1befefe3dfd21f015e349e1b259fbf1bd15385e9fe7e77882ddcc6f8deb1512d2ad57a7dbeb4e34abff7dc7d7afb0f599fefefafe76335af83d5fdb6bbb6caf2861d62c11f573e666dd8d042b0214cd6becabfcbf8eaf7fc7f10e5f6f23f12b5b79bd42adacd948be5b21c1ac6bf8adaa8aadff5b4e9caff9e3df7fd7e033bede44af57be3244a0b05ea520fcc6dfd27aa5dfa85965f4edfac0af1eb9c5c98ff5d5dc5dffadd65a7b872f33169dbb6f57d088ea0cc7b16e8459b5206f5a6bb4f7fd4a125fe6ebcdba1bdfaebcf11b70f6cefaf7afed785dd9d7ac13ed376beb9975cc6513a36c4c2b3ee06bbbc6fa813f6ead51f2baf246f0f91a447f2b5fdbdef8ba723437abd46cb5f6f5d9abb76b307da4b0747bede477f9b216b179d6f8bd59b5a9b986df8cafed3bb5dbeb6c7fbfc29959cd25ff4659dfb3b6fd49e2d3fcc8ebf92d5655af2b6fa4d0f877d7f11bf0c5beb953fbee8aedcd0c8bd78cf87dbcda66d0a8eb357abdef8f0291317e933dec91fcf9778dff305f6fa3d727d7b8b5b2d4b657beae6295ba6f7d31d99e85f12e5f762def083b156c5726dbf5c8df5aa37dc2d76be5feae0f348c6dafdf95d77e63f49180b7fccd7e03ce77df647341082fccb7984fdff09e7c7c357f075fdf59fd07abb56fddd77dadf44dbb83a657147ddfdbfe505fc1965ad35a61affd04f3e97fbb47bea3af606b75fb4f7703f8aed5af7188bd59c1b19973f743bec2e6bbd3a62ff1eaedbf1f5f6ff3e30fafef9bbee6b7fb56f8e0add947666bd5bcf7f8525b2beb67d86de575f53963bfdf8daf2fed66f2865fdbab96989168197b775dc60ff94ab666056de78ddfd31f1d30b0bd5bce27bd90ad9988e996d748ace3fb3abaf3cd677de08f96af6fab93775622fd3df87ab35ee74fedc6f45d7ff3b536352b089aaaf33bad7ec257f6a6d67dad799b956eff3eb63e18fffac26e5fdf286c9b3189aac2e6da37bef403becaad1d6a5e55abfefe1ed107f71fbfb0d6f09b7529b6c7bcdec69f37b1baf1c7e41bbee237e348e556b51bfd383afc5d7c7dedd85a97627b25d5ec9be37b7dbd566eb6b7f31aef89ab7254d7b1264bdadef6df3e42f167ec97f966258fd76aa978f3ff6f6235fdf53ae3537bde365faf6cd935e04dbefdedc6bffe2063dbfdefb751fbfbf140e3c329a295d19fadbf8a377da4df6a17c03f6b3fd6e6099ad77198576d7d3396b39525acf719fd056fead5ad75b77f0765fdb97c6dad642f50efdab1abfcbd31b4ad9123a3a56f77ceb27dfdbf7d84f0afe20b2c7858632734eb127db4a23d3c32c46a4f8651f10d5f7ffbe8cd5fcdd7d69a311c6314c1f77da186d966b527b025febc3bdeff5df86ab878bdb7f341fc69724480fcc7def4acfe43f4b5c5c60faade376bd5fb18b9ff8fe5eb678e6feec77ec0d7ff7c7ffccab1a5c23f75c6ce5f75fcdd7cbd1e5f9b41f7771dbf0b5f1f8c88fda3af0f8e77f84a7e97a77ab78fdf85afad8adfce3bd37df0e07f767dff478ead71b4ac1c95e37252ea9d4c7fb3bdaa7f2bbe9a592cc4d7b49cfdc3d7e7876bd777d51ad3231b7a4ce39ffcf8e1b1d5f7fc6467b4bff7f89df8da9a57e8fd4e635edbc7efc5973e7efe4ecbdf71fc7e7cfddec78ff9faf7ae91f3bb1f9ff3f5d7afc1f4dfedf88caf9f59e3eb3fedf894af7a0d39bd125476995d26323efafc59b7dfefd0dea1fd236b7fb62ecb57d645f9982fbd0aa127bdc80b79279b6533def142429fac32fa7b1dfa893575ac9fd325ffd047a157e0d95e95453f9d669e4b33ab62fd31bef8327a12056f272f459ea5595ae4c98b5ec5367afaeb57a9f933d872cae8397c5227c5283bce8e79bb1889bb6f5765d1cf3dd6eb230ef44a323fc3d8677ca5dd6893f7d333bdeab5d92124ef7fbe0af7ef73f055f41c6db2cb622cf6f313b52e985ec7c33c736fd765d107efd4eb6fca70add7f2fe237ce95592f3bc780e3c7fa27734f177fcc3ec22cfbfbea7ddd78e3fa37e713bea580ed38bd0c98b7c28bbf1613e54423fbbbdb52e0b9ee80ec7e95996f3b61cfecc5e6a1ff325dacea93a29e7e5113175e15f3877e57179c20ff2f9d77638fa1a577f4efda257878de7b2cfbbd975c0f54a187ad510bd2ec0db7559f49a32923c27cbd2893ad1ebc7fe3a5f14014ef50e1dec8129afe375e4038b8bebf234de1379f31ae7cf7cd6eecfab5ff40ac3e13239e3538a2315f668aa575e55668f3eb32e4fbdae3c1b61dd892b398c9efe185f6a94f592399bd57b98add894f83acb3a96afadbef19fd23bfe7c0ddcaff1e5c93c8f1649918e592bd963a3686c56a879cb57bdd6ef41ccf4ae8166c5ff1fc5fc4ff86a0763352acf8b5dd6357b6c9717e565da2f4ef203b065e76dfaafeb00ff3a6f9fadb1fc75e645162ca365b6285cbda7838ebfe595bca4a363fc517ba359ab88d5fba9e8d5fbd58973fa23eb7c16bfc8bac7c94054cca9f70eecb169ba29af89af127cd9b92541b30ef0166f5f6de3c76b787f5d61eeac98953769a5ceb2b95faf5454de86133f28ef94306bf964457cc863bd93885e5b8b5e31a59cb9fe437ce5f120a9cacbf2de79d0fb303a0f6c593e948fe58ef6c7e60935d53cf31236b34b7e69ced6eb1af1f9faed1af15fdb71d07c56d92a77cdfe0f7a75b6b453de163c9bab96ec897dbd4a4776949e51868ce3877a55b67170a87737342b9cff0a5fae53beb0323d2adb6c4acaaaf5251cb14e3356962ff0c5d7272073cc3335bcbd3e01f385f1d18ff720f86c9f9a8fb98f8fca8e926597b5fc2bf2b933d951aba25b8cbd503da927f2f58e4c0a575eea1d44f4fe4651152e7ebcbbe187eb6d3bfca2ec957db116b3e8dcbff42fa3733113ebb25ff6f805e6df88ad2725cd3dc3d7f9b9eaab3329bfdbe3e2418cd4d18ff65df9982fbd077beac7a73adaeb1d16ca811f2859ef234db997aa87497a56b8d8ada59378c9993af9716df9215f7e189761f4e0cd8453ef78dcd6fa8a66d143198671cd8279322bdd9aa75a6cb16667eafef428fc477ba8e83d66bfce978e85e985d2ebcdb5cd3e50314b7c71500ef30b59e473bd278f4cc4a8de9347ef605414635d8bffe89b3e5c4f949591dfa9dce0313c8fceb53f46e7e1b937ab5cbfe354350b6f9f8bfff679ed144f757cb0baf9bbad5c1532bbca8fb6f6e839d45ef2e3a8f23df7ba02a3bee3a94cf2b5bcb47bd66673b1af9e2a47e6e14251654f3960acd7c24f1e6c3df18b7c91af555e3e0992e0213c174b6fedadc5323c0f1e82c4772bbf9e8dcab766876cb3f5ed53195bebe6fc882fbd0754c1d4ea750fa874a1f798fd7a8f42efaf218a5ca45483e9dd90f4fe1d7a5f9ee024ade23965ddfa7b5e77f4923d2ffc7c47af1ff01544ca1df80f3ee9cb2beabd518bf0dc7fa4e262eaf6ea990d1ff1b53df7fe75dd9c9fb8afaff718534fa1a384d97359ef31169561f5e32cffaec23afcda8b28dfce72c77c1e9f4523cab92fea295a074e3cd5d1cbec66473dc989b893c5aff5872c5fbe1328c357bda778cd97e3569cf80a1bbedeae66b2fd0cf1bbebe67cce9773aaf7d2adf7946ce93dd9f41ec6c9ceaff055f7dba97f90aa689117d89dae552b36a9447655a82c2bea7a35e66a4e7f9f86cb9fd95bfa63be2a9f8acf87b7fe28cfb5be1ce363dff3659ec7785d6de8bb75733e3f443b790c2bb313b05e71d4ec14f86bfe680e9d419248a6b20bcfe374418368a9da544da8c06cfaaab437a65591fc4cddf261bc1791aae3571def757f5bc7fb685805ce54f00ff8caf114dfdb75877e7aa6a0d597dd7399aaa24375feabfa321608c6a1aeb49489ec6483c77c55cef5fedf7abfe17a27c67636cf4fdfdf51f50b7c71a7ca27ec449e0b87995dd257c221e47dc357bac5975933e1fbd575bec497dee3d5ec75aabd27aafe085f6ca88ec315e9a9deddd2d428551895c56976141ceafdc474adcaa714339f64f1ebe385753df15c45544f44dbf52a212f6c8b73c4afb7f597dd55c0aee4f13af3edd3a7e6b7be95d4b0bd17b8d5d7aff4885e3f5314d1aade29ebb25edf964955c974929fc8d846c9ac787f47e82ff04511ac8a2b15ddf142d7ab4d7f681eb4e2499584bc4a9db36625141bbd10d7df3cdff7ddb3431f1fa2e1cbee596af9faf5114a53a3840e6908fbc6e68b7c5965f9b15ad92c9c15c1e467b3f0c7fb0fe9fade99b13e5bdafeb65a3259e5ee55555465baeb5d46d722fc6eb503af9965b3fdecc64f55ac6e47c7fbed3d97b53fea78ffeb23e0ba46d1fbb16bcdea9a8efcb1ca8fa24af64ce5ffd52aef93fef641da8b1ee4e9abbe9c56b5489e78592dfde36a55ada37eb58992862f3ce108beed9357eae7eb7b1dbfecded6a66d669fd55f8f5fc606c94ef252db40efc7decefad92ca0bea3ddf1f06bbd888ff92ae659b5dddfe63d79115ef98fd1a9f2b8573d9545f59cf6aa178afedfcdff7eefa9f91fefeb62ea89ed3d97f385d1d7affbe3f73e5eed1559b51f9fe46bb3b7f7d77aa99f8d7f6527e95175a0c773747e741e92ab70bf1a55637f13778a401d5493eab0d8a9a6eed1b759f0cd1344c456f0f233fb067dbfe7723dca42fafaf53b78750e912687d4abc877aa5935af8ec271755cafcdcf79ac5ac9249effdc28c8a77c75d27e7cc59fc4a2aeef37feda2ff80313accbbad54932f7c3eab43aabceab8b28699e71dc7ec21163fb22377731e223b35752ee7a51213d99b5dfaaecfb3d974d64f973fcd1d4287a1ffaa29b0dec8eb15ce90a56efcffe73a36c9f8d47e77379931eebfb438cb3448cd99e7cf0575e6976e64dc7e14b966587e9913c2c9fc287f7476e743f4e512da877178c677ab562bd427932492fe2b9be9bb16dd3f7f65c36fdc75ff74753d399786f342bcb6c51a44ad4bb41b7ea5149aa56c54ff41d3fe74b7f539e71f2897aaf61523331b6af7769367b8aebde851f5497d555751def8987f746a00d5b662747aa092597fa5e69be50adec28efeb9ddecc9e8d96af426eef3dabf75ce69d54e9486cf7c3ca0fbeb6db928e89355fa7d61f6559dd64cbead66053ad16a39fe96bff88afe8796b2febfa4e14cfd9817f65eee7e93b547a27de6c26f6ca9b42f0c5bb9ceb31c027bde7ac1e2dd77747f58aea7ab77b75561cd4f3573a96dbe8498f47172976d66e22b1278b89de154b64d1737557acf3eae777377ee38fb59eaa7b75a45ab923db765f7abd9bfdcffafce7f7b7a3b5f9a6b8de0f1a3b449b1d4bea7d89d52c9c84e463e22e186fdbc7aa41effe4cd50f656fe2b5defdb9de575a7f52aaedaae7afd8fb65da3eea245a888368a4c70dd28e19c58be7f9bc10c494533d243bc548ef102ceee21dbd7b8e89829f31666a14755e57f3f45f795b3de6fb816747a24d9f2b5affccd8c48ff4b5f54dad5a53f56eea31d3bb64d4fbb413d2bdfbe02470f41e9dc63b5eefe93ba7d926ac0aa564966277cf03bb27b7de455eefede94576d682db967a40f8281f62b48a3e599d2551b553b58ab578f1c26a3774f2a36c961fe91d1baa76b4ccaef88dcc3f9b01636a946042f55747c744d9965db2705175f4d897ee734995e53f73e7f167f84a6430c98754a7607fe17af7f18782c7248bfa4e14b5db9f48a515a67725b0fbe0e96c5824a49655b4487d6a77657640d1bbcec6ccee994dd5d542df63d0add53de398f84bfd58983175d34fa9478f07e1aaeaaa75388e0fc317314af6033f9bf369be9f9f246dcaa84fdfee2efa4d2b7682499d73c91f9316d94e553d3df665f6b21707e984dffcec2c9acfef6f8bbbbc171feaebaff93a30fce89d7eb28218e36634b770e3697c1caef4779a7bfa5ea4b321b1b126edfbb8e3a0774579c03e3b9aaf4b25929770613c41b4e580e2cc1997f5c84b3d169a172a20af5b172fb92858d54fc70afbb993bfd227f9138a4289debdd6ec45fffe0ea3ba15c144c6267ea92aa26b0f7cdda33733018a9551f9cfddb3fbfcfe366ff343f2f499d98db9deeb9af26f7a56b0a2ab445dc11cf8e3ec9a7a30134efea477dfa6a8bc8956f58eb152adc4a8d656cd75da31fb0999990baaa24f98e87bca7abfca70136dc45e36b3b931e6c97e3c4dab6a50dd651b99a9a36a48edbb88bd851b7bb1eb2db3d3648f2b31a2785766577a0fdaf7bc52d728d971c1f4d592ad29d7e8bd9d9287da6aad98e7eb22a3efddfcec3dcecffc5116e9853aa316cfb2d368acf98a59c1b34cefbba54e29fa081dc5f45ef37e50a45a61d173d9d2119e77c4819ad73beb529563de5defeda5e4a5fe1773b746c651a5ab05412ccb41aad249e0f138aefd44c7619d0f168e8e820b6f418a88c6f1c5c25db005cfcf0bdfafeafdb4a93e27c62a130fbeaf2fb2b61c7aa11e61d5778972e2291a250fbaffa0d5851123298b9f9d07f499bec83297e919d982a1c57475b29b1f2551b82026cfa5d299acaec43ba6675c2c28720d495d67f9badebba6a53dd96a53c757cc8b39a833932cc6e1925f1793b41b1fa5153f54ab3a17ebbd6ee6f97ed2cef3625db60ab910f1548c1641e1c7fe82c7be5c44e3685c33565781e4951483beef31b361b8f1f4aeb552cd796d751df1591a3f247bec802a4adc11a648f29377d03f8b5fa494887c8f377c51bda52bc870218a789ee97e85b9b34ab92cf0f9617a41ba3e0dd79a2f3fa86b8e917ea7d1669d614766069166448cd2339d57d5f1229485b8238d1cb047529fde5b4de50e3f8c56e193deb35b16ea4947203dc220178ba8f0759636fb8fd731e29272ea3a177a44f99b7dd03b220b976495314b93bdecd4bfa2aae8213fd3f30d74ad9a156942b151464f7f025f1d99ab76eafb13d6f0c5d2bc8896d1c693bae7124c4c2f434767355732704864e417d4f692aadc34e0e69d5b7c995df7b4875f53567da14a365f847a1693615fcf66602d7f4c513837f38bea7d38337eb390f1098f8bd8af6257df49d4711055e088feff2813ca2f9b6f6398ce8ea9e254935214d573c00e78ee8f35733a4fc542eb52bcfc6cedf523be0a624026d9f56b04caae8b95ccf40c10918997e29977f5bd503d774fe7e5e239cf83b127c3553654674ad499eee0d51b7556abf7336c53363fa55a20a2189f2d427d4f22aaa4223fa97ba62165e09c6a9170ad777a7667593b5c8b3dea0fb8e19eb7f42bedffb11023d9c12ef7fa4e2545bf3cff768c01236a259f96b7c4eb15eabf91c95c322ef45e528553fe2c5b9fc72f51e4fd2c0b273606b116d93dcd2e83b1be7bace71e99b9d30cf77274b5e49d97ad60ac677398114ccd755d8b502ea20c15cb6e364f3c99506fb2ad67c311179b37f7bc5af2324bc94ddaaff7034d8e536baa6cea4a50f72a023f1fea3deeebbd11eb313f3d5fe4db08a67d99fa10fbe477639e9b2bd1718f8dca2b7a37a94b8f7b7d65f4e3b3f8153ec5c781a7efd2197dc58cbea3971deb5a382336b34b75a62398ee29e971119dffe3a3b2e594b288d67aee8218e9286b6a5d5de72ac1bbea2c2a93492ebc2879249dd6334d653fdfd79951f782a211977aa67f216dbed39560e8d57c718a41ba3e99ebaa80e27c27a833b49e8fc43bc67fdff22528c7f3c3dca1ac7015bb7ee55772a1e35f3ace8abca7c7253eef4ffd3c5f7c956da26591eb7e978941d4f6343b4a767445aec7aaa8277714f894fff50c3db27952440bca68a4cc7023873abe61245e47e5ffbfbd2beb6a1c66b2eff33326ef39cd041a38f3c416084ba0934080b724de17d9c4ece7cc7f9fba92e53d8b68e8ed53d7e990d8b22c5d974a55a5529990b3c956205bf72ac49e816793e12df434abecc487588fe0fa24b782c24bb62bb45f39aa122ff1a373fb9d9e0c6960f1d4ef3ddcb091dde5f28e737794d4f90b113f0ee96ee16512d87b02299a61db84f9917f4adcd5518f8e5f8c57eb2126192af98bf7d867315a45d6470f7ab3ffcacedc2d92210742d7b0a6fe737c88d51c58da0e8d57eb42cca092c366f75112cf0247ecab817f15315fc495273286093e42731f735dbe868699270963e6b9a433419f207d15f8879b620e463c12494fdf7c2ff7bebd49b2f4d1b7e2283449736cc5a48708ee22b44fe319dd658d089375f182a6e7777cd739f4045e646b89d91151d7c623b58524a9b42e21dd823bb6c306265ff7e4dea0c7f82d7e122ba5400ca3d633b14b64e2889e89187f4438c446b8297c128cc56fe5580648d284c55bd36edc4a8c2422c45a6ec244241c3c1e06f69ec407981fcb78095b68beeddd4d1e09a909c84d48de8f68a6ea4711dd45317271b9fe1599feb31c71d4977dbc1d3176e1b9016718d7be65b8f0f38ad993e67bc606823366bb885833c7d82262789813843e41232776b7116905498399cf798a844f6243e871ee77d2875f8b1a11691431f1d7161b79d0ee53bc803fb7e2efa0e19345c1e36b720d1ff126905ed1390bed3dafedb59238ba7293e9dc32106f2feea286d6727d02dc1cf7fd0d92da3e2c3592d564ffca270f4fa0b917b3d4bb477da5196b1f9e30319266bbe116cda13facae7d44a6b90fcd1efe00638be63e8e17ee104590f5699cdf0656689d87bc8ee2789c9f260fac4ff610e9f7341e67d16578141e91d4dc8f23b2439fe2a01c490dffa3fd1c386c876abf9cce9379e278342669b48cc8824a42ff23eb028bf10287102f7558144ef1ae44fabc2cce5af02cf917b14f1a5a6877e9d91f8797d24b216a30c8d621ddd60e93681fb33fdea5cd4e8d63ea038d1c9a195fb1c7270c30db43e3f60c31c757bd2bc653d2221bf0bb6752a9abe86a3ae76b93fbf39b6012c56cc7efb3c1c471decada3df0727789dfbfd3938e88bf88e229692373ff29ea233a4e9dbb56ed170db7681e1bb35d277112b66b8eede7702bef09f00cbeb9db64f7b9e134ea3b8fa15ff6832366cd7e353aee363b0ba78cb9016905e751db3aa259bc03bd9d6660e17f3e846f98f4d4efe18f6a4434a3a79424310bf69347b2b9db46144c7d3379a299e3d2dd36f7ec39cde46f355ba8078900ed6bde33fc60cf9b258fde1dc98316cd42bbe67babbf9ec75e01af9ed9c1dacec489e8dfc421fbe8dcec14e50a5ff9798c4c73cfdc333af07556246e0f9893de4b92303e08f8fbeca3362f059f04c937ffcac08cc2352f7017e2d6cae304fd8e0397254fe661ecb1fee411515ce1a5f31efef0be19d7ecc5dd21bdbeb60b04f2cb7933dfbd73ef64be9d3c9336723cff4e4d3973dafe851bad6f33ae8b97e82f23cca83d23ff9cd5f68b35ed8faad720fdadf693774612e5de7ea1198febf5ce13ebc1d3024f8f7368f549131fc20a2afa6530aae9496c5b130796222cd090af7b4f9c9768beec9d8d331a7188ec65bb5697f5486bfd1e900d4733f83bf7056f36f5f8e7f01277c5fa15a473f3ea15f7a8725ad402d480bdc1c688c6f78b58d3016f227a1c7e1af8a8ddcd689734acf3baf56b906e11b5699e4ddc4dbe62319c6fb22499709da4b36c9f24a2a43102bc53739cf86c6874bc6fd663fcfe33fbf67f55be0e68b8c535c3f6266c00b2a84484fc3c7a8e9f9c44ae02549e075f4748577836e0bd892e100fb83c2a4cdc31de7bd898b8eecee48a749217ecd65efd0ed13f01af2a614701a271e37e78c9df5a1c3873f8cfeaf609e9cd1169517de00a7f23691013ee13dd593ca2f2352ae2e297e4f561c379a559a3bb28d2e5cfc74bc47b63f6f5ceb197dadd26e97d6632b366fd9216457a1edb09f6b12285d502684fcbe269aafb4e27aef36a76aad12d7f175e906a581b21bbfc1a6f2a8e2258e0f53dfaed5eb8e59d065d9fac2db1a2c346d624e842e35d28b7e4bed36f6cc886c137e7e5f3f266fc3ebcb87c2179ecbce11dc5ce1bd7316a63857bfc12b1ce865539cbf04f49d7dbe6b662f38a23df77eabcb021d6f3fc67d21c87f04b7e4ede8cdf9adf97afeee20dda5887e3b366ad47b062d33d3203b97705562cf1e5827db7908c64375ed18cbaef1d472d7f8345a4552f79c7fddf825786594a4d6721bde0efc976def1556f6e616e2ea8711356d8c32c798bdb6c4614266f888859275bc29f8fd70a348557c837b6b072841580d8b026f0c42c8a366df7e26ef29eec85dd641ffb4efd5e70e75dc4fd642f798fbbebe57cf98bf1eab83bd88195c6bc70ef6bccfccee26840d2b84cf888928328898de490e82888c3c0dc4bbad1e9cfe7975a0f2f199f54ce6a2424ced7651fc26864052f2dbcafae67b748abdd69d655e5be47ff7ffc0dfbfde1c6deb3f7c2231acb5b5637398e2277c77ef939c4d6c92f07849c5711ad0bb28e827be78d6c59166ec17e13e841bff95cf4301aa376d8cdbdafb37b63abea7d2d92d8579b246ec8421e3f74000dc41df8a7aecff6822efc27a4df375efb397809dd6fe29a3159b7917f21f21a914ef31cfaf623765eda64d3421f806d88f51ee3f173344339379afbbe998f46119bbbc8b7803de07190ae6a1d62e56c3a778e668796619f45adf0d279e4de8f9fd02c56e295c52745db64db47ce1cd90890e58845f1113c34f0e4d8731eed17b8bbd611b88e6b07e998fde8ac04ef02d669b19f9b47caf31556ab8b58d3459623f0f2ce48bbb509e1031163814fc165512b3a739ee027fcf84cb9d29f83cc3d67133b78273b6f62b8c86b24321b458979606c8553ff929d8509629ee3033630c751e4bc0037918bcc79a3d99d6cb7ba9db38aa0172082ce3f333c199f89558aaa7fac8c177258d0351b6ce4f15540198d20d66b8cada03b717e2623d772bc843c407c521c4dad6977da9d21b27286985d8b2c9369d73c6461b46bf5cd03c6e2303a771e7c8bed3a4fe0393166278efd1abbc13d3c687c7e2a65c4333b662d4b9ef88cf75a7d6f23e82627d32ecf7c33278b3b44ac16c9ec851e1cbe163e64bdb84dd2ee406225d6f34444a3ea8ab61a5ec2eb421a7588d5be7013368988a944840bfe23a6cb429c9e611e7ac479511c4e598fa4ce5570c922df0aba2e6383e09b714db2eed98ddd1d91172fb8179fc5bfc533d4ef17e7d9dd4e9e1067f630f45cf32078f7de499e2f9955d2559a23f3c0ee7ab30cab031153164c44aceac7e3f93f8cd721d6e1b14626b0c359a307e4880b2def98c55823c1988df6c34be3d87988fdf860621b1d641711b9f024213b9e9c47f233debb3d494e9dc4ba48cea2e7e43cb9603b6c42679f9d37787ac95a6fc8d5c8d7f17645e609c40da778619d92f08a1216213efdebf8ab793cba1dc4481b3e7645193dc16b225ac94ba354dd8e4d65b1de35bb47ac03e7bb4bc2fdccdcb75bce0372e139f3e012f387b119bc630e0913ab5b3ce35f85817f99f40d777ec3b6cd03f77b703937435fc84737c64e2411852fb1c367dcb58e908d8394d47d3e4f1c480ec3da67dcf74ebf6e3c36c97be30479edd829f2dc45cf86677745e636efce32046a92e3447e32701e62739cc3a94557ecb253df446e3c91192f4a5c5fe4c7334e584cf5c6f99928314e7c93ae08a36716fa4f861b876110fb568b0d0cc445cfa33646397c5cee8e1ccf84626c3f394fcedc9a50fb7cb95340c4a7c33628afc97c265ecdfa04f8c06eb1b3e8dc3b71833822a91047bba4451348e0399ea540e075886f989b3086e9c81c84d902fc477cba6977918f8bb4a51047ab67b01f8468e00ec2236b161b71dbf5684ebe8ccec380e6e4b993b8dbd136d013635c5264bacc4992cb20b6df1159f770e31c46bbe134f69d676414fbb81df9117dd51c9b63ffd5e8b081df711ec3ae33b75bd18577c25830f18ea7566ccc42e409b410d33bf00c11750fd4784ceb8c47976f5806fef2bc097cafcd9233e948078f804f837d91bdd1ea136f4e08bd33e4be0c13399ef1cddc67bdf96972457a7dec3e58c7c995ff1c7402d78d60117d14ad8fda4398e3e0edb55feda7280a7dff95246cc7dd2659744cd27dcb3e727dd70f26349a5ad1f3ec9e341f7f7a64193c367a43192fbed701121bb8f319b9c3a5e86678447c8315138fcb886c3c5bc764a17bf36d77e86c32665dd8ade4071bd0bce9965750bf022f815983bdddc11a5ab8357127ae7514bbf62b495937fc11ceddedf8c8ef0797c1bbb91f9d5917fe86eb47bb9ee99f3a873cc65c613ce20c1d1b609c1b29af89186ba1d5d0acec63840b9d505c0fee0e8f66343158b3f966149bfb2166e197561fb6e3aff04f2c26ac2d02c7d603f68fb93bc0cd7ec2be506809f1211b86f3a04b9ad819dbf15d6be2fa982f40abe5bd3863f5211dbde3e839b8039f223ba8d80122b41a113157e44f81277627607f95b3495cdf21f5c6fd19b9f5597855b023dcb02e8b799e8fdb98b4b717b2407ca313385e2f7ef3fb24a51fc2641d7d429cc15142bb47da08a33993e695a9c546e0494872f01d46f822bcdc0e327b055bf1f347a225be162f41323f6faa4d3ef9e7e116b475b2735fcc77cc18423b5da5afca33985f8c0ed9c90cf2919dc5cc3f8b62d8b1d035e27670370b41f5f128a286d80e22e9d6cb76fc3bf06ac4907003e76197e7c49516d0727ba878067c1a075879039f3a8f64655dfa57c80ced9df81ba4d224c0af28ef8d131ae1aeb1e5863c035ff45959c27fa53fba3c6bacb2b7cb67b0566d8cc4acec9d41b309109b36741969f24718bdf9780e13ff8afb9dfa3cda2989ddcfe2ae3fdd7f5fa6d92e766611a770f928b0a391766d3f86d0430be3f963b9daff35bc0465912b1dd88df60bb0c318af8e67f57701fc9b789549e8334de359fd5d13ebd0df8ed7af268d971a69bcd448e3a5461a2f35d278a991c64b8d345e6aa4f152238d971a69bcd448e3a5461a2f35d278a991c64b8d345e6aa4f152238d971a69bcd448e3a5461a2f35d278a991c64b8d345e6aa4f152238d971a55f142044d7349ec4e6f3aae925df2ef23ec40282252c6cb78e47bcf1baf34e94cd371ff7cbd3bff7a5c173ffbf56b4036c8222265bc18cf47d38c18de84d354a7fdb2debdd7c5f5f3e8e777af0a1e29667928e3257840ecfac4f8933c91e613aae02522a4e535f23cb248481e1625e4b7768ab8c14bd79f49d33deaed907791f7aab728bf8b91d5217b871252b2e4ed301ef39e94f12a649de47537e325327f611797319247abfc85f83ffc057fc912f88b5d7b02f3accf2359aefa549a9e68b9d54ded10f537d5512cc15bdc93c7890346b2047ee577c12fd917512627ec18b65f8c426fcb78213b8ffd22f0321eab68acc6abcd73384acc053fd82f2c2b57bd4bb97540baca61e576e02a5142f4b25a47b9a5c59d093987f277f6f1123c0759da5bb3d2c62a7f35e395f775111aabf12af268b115795b9ae78dd577295e07bc90796e5dbc64ad45bc16b5747dbc9a6b68737e6d577a62a4c7650b50c22cb542949072816575305eba3aab885ed4f9abb91d3cff61a79acb9815e417df5bc7cf8b194e8c5db4c5ec98593b90bf1a71b1ceabd3905d34c74bf6b68c9794a2229239e70596a151ef613b2b6176ca758812395fe4f21edfea7397989d2b19a06bed300b7554e78c628ff3bb94e5bd386776d2123dfc376b7d9375e4c7456fff2dfd3edcfad8758bf0aad3bf85d7d793c64b8d345e6af43378a9581b55dba4983346cc614df5e55755b384b57b225f4ff1bbfc552c59bdaaf8bddc8fc5392dd6c56b95afa27e87c536753dfb6e133acbf06aea5bf59740bd9c45bafebd8acf32bcaaed5cf27e8505be0ad420ecd0fa73844d5d7d9ed5bf20e40b2a5e5be4af45edce6bacf36af15b335ed843b3e8e92cbe6ffdd8b2f705acf25514ef233e65a696559fc8d5d8341e9bfa5a447ab60b44eaefbd2de28532d5e728c66cfdb9579f5abdc4fa78557d155217149a70713cf27ba6be0a69358af3c8d124761eca12bc7c83afa28a97c3dfd454ee0db424ff3cb817c7265778fb236f631f9f78136491bfa0b9a30e711799f58befd5eaa17ee4da41ae006123f0fccc3c7300320f839a396c355e187de116f43993493b1afbea8a78e5560b6c3ac1812899fb2a240fc10380b7cbe59e03fc16b64a55e64b2f823c0e1f03b4f1561f595905266893404de628cf111775c8bf92bf90df0d57a115bcc51de199c375c8692a9fa4a8757df9b5c857215a9ef24f2f7ff212078100b7947a42ca89f7424a5f05bee778c9bb08cec89fa87feebce696608617ff8bab9d57700fb277e337eeefbccaf775169f776e7bcb518c6bf3bfc824c39f3da186b6c096145748ffe6ba782df2550879df2ef103b7607be289151195e3b362bff7eabe8aba9f41de251ff3655f45fee4c19dc8332439488ce2265f45fa84d3a750f455080c81f9225f85ca78fc7a5f4579f6fa7dbe0af416d72d7a57c5b2f7c388cfbfd55751d4053fc357b10aafbf9d3eba1ef59f8ad7d790c64b8d345e6aa4f152238d971a69bcd448e3a5461a2f35d278a991c64b8d345e6aa4f152238d971a69bcd468395ec920192ebb3a19d58e5c2783dfdda7c67e5c7f4e4dcbf04a6e9231d1cd92768c6a4714f0fabc5eacbcd3edb25ea8d052bca8efb24f84dd2d3f729bb5e09a8e8d2ae5af255ee2bc6c2b91fc75c3cbdcf06fc3e44ed487d2b57b67f76ababffc2e8ee78894eba1a3d9d9c2f7dbacb69be2bd799baf4b6da8a1bc14af51724f3448af05af0de8ff3de78c11c66a8e57ca8b383f10e3987fbfe6dfc7fcd788e336268ceef9f75b7efc9e1f13a5b3d6f1dfd7e25e59db8bf7bf4eef3fc0d5fc3cd54b9ff7b9fca01263514670329e2e6fc1903f3351db8873c41057e15af4967fcfef76bd2e5ebc4d7816a3f4d730e3b9dbb48db705bceed05efeb7787eccdbca7b9db6f936c5e35a8ec7ecca7bf137e712f9acaaf7e7e8c87a6ef9ff5bf48dffceeb18a565c6fcec758ac820c57b98b649b46d2439548c19e095f7604dbc24fa237eafeb8ccf06b98c2ae025c76ded7c7646e075c7eb1c17f0127c9272427add7ded48e1fe1c8b81ac876ac4d8e59c25312ab64db4276dc338c541d6268f0bbc449da3a214ae4ae825788dc0057812bc859f83d75df65cafcb9fa53bdf62e494e78e2a5ea57130483119948ed7f0e2f58e52c955c76b5ce03565bcf2b1c6c7f26d092fd99ffbd2781ca62364202485942625bc44bb6f4afc855172c37fdd55b0192cc48b8f3b5ecf2d97489049f7c5d1c89fb72803a925ee3494f2b811af515aff48caa2b23c5c81d75da1ad23cef3c5f6def1273528c9fb617a6c90623cca70c8f1bae525c6a9b4412df7fcef58f42eab0d33c0989f97f371f9fe375c4ea4d23895d7e9532ab57a944a9381182969e9eb46bceeb279e78e8faa21bf436586fc77f5fbba6ea870ed422d52e3d578ed7f205e5f431a2f35d278a9d1527d755cb4e0165149e759614117f5b1f5affa936899bebaeada546329945be507c8ed8ed2d17f002fae2965f67bc1d390f556964831b82ee2955f53a82f2f9b7a12a4b721d3820a57719bf8f6f3fc305f8ed73dd72c6f6b9e866c8c66252a7e00a1eb0b7f44565bc19f91e9da9907a264478e536b75c435c69a7fe077d3f2f158f334dc554b703dfa262b2f7a3e4ef932e7c4823f232d53f040a49a7ff14ee3ccb7f077e1d5683957f1aa96e07622ac0a8957432d450f446aad14cbc83aff38c9f61578a5bf8755fb392f53f640fc4378357a1a56e1955d23f12af9338ae8a4d679e6fdccee34e472ed56fade7e374aebe2f5a3d1d39095e0d2bf01af7bee171816e47dc19f91c9b8cc03918de2fc4ec2db314cfdb0a3df8dd23a78fd4ecac6e6701d8df957d29f8a17f7eddd2d5ffdfc1df467e2f5e792c64b8d345e6aa4f152238d971a69bcd448e3a5461a2f35d278a991c64b8d345e6aa4f152238d971a69bcd448e3a5461a2f35d278a991c64b8d345e6aa4f152238d971a69bcd448e3a5461a2f35d278a991c64b8d345e6aa4f152238d971a69bcd448e3a5461a2f35d278a991c64b8d345e6aa4f152238d971a69bcd448e3a5461a2f35d278a991c64b8d345e6aa4f152238d971a69bcd448e3a5461a2f35d278a991c64b8d345e6aa4f152238d971a69bcd448e3a5461a2f35d278a991c64b8d345e6aa4f152238d971a69bcd448e3a5461a2f35d278a991c64b8d345e6aa4f152238d971a69bcd448e3a5461a2f35d278a991c64b8d345e6aa4f152238d971a69bcd448e3a5461a2f35d278a991c64b8d345e6aa4f152238d971a69bcd448e3a5461a2f35d278a991c64b8d345e6aa4f152238d971a69bcd448e3a546fffd7ffffb5fff0f78651045 + + + diff --git a/krfb/trayicon.cpp b/krfb/trayicon.cpp new file mode 100644 index 00000000..0cfd430a --- /dev/null +++ b/krfb/trayicon.cpp @@ -0,0 +1,47 @@ +/*************************************************************************** + trayicon.cpp - description + ------------------- + begin : Tue Dec 11 2001 + copyright : (C) 2001 by Tim Jansen + email : tim@tjansen.de + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "trayicon.h" +#include +#include +#include +#include + +TrayIcon::TrayIcon() : KSystemTray() { + KIconLoader *loader = KGlobal::iconLoader(); + trayIconOpen = loader->loadIcon("eyes-open24", KIcon::User); + trayIconClosed = loader->loadIcon("eyes-closed24", KIcon::User); + setPixmap(trayIconClosed); + + configureAction = new KAction(i18n("&Configure KRfb")); + configureAction->plug(contextMenu()); + closeConnectionAction = new KAction(i18n("Close connection")); + show(); +} + +TrayIcon::~TrayIcon(){ +} + +void TrayIcon::openConnection(){ + setPixmap(trayIconOpen); + closeConnectionAction->plug(contextMenu()); +} + +void TrayIcon::closeConnection(){ + setPixmap(trayIconClosed); + closeConnectionAction->unplug(contextMenu()); +} diff --git a/krfb/trayicon.h b/krfb/trayicon.h new file mode 100644 index 00000000..dabcf582 --- /dev/null +++ b/krfb/trayicon.h @@ -0,0 +1,48 @@ +/*************************************************************************** + trayicon.h - description + ------------------- + begin : Tue Dec 11 2001 + copyright : (C) 2001 by Tim Jansen + email : tim@tjansen.de + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef TRAYICON_H +#define TRAYICON_H + +#include +#include +#include +#include + +/** + *@author Tim Jansen + */ + +class TrayIcon : public KSystemTray { + Q_OBJECT +public: + TrayIcon(); + ~TrayIcon(); + + void closeConnection(); + void openConnection(); +private: + KPixmap trayIconOpen; + KPixmap trayIconClosed; + KAction* closeConnectionAction; + KAction* configureAction; +signals: + void connectionClosed(); + void showConfigure(); +}; + +#endif