diff --git a/CHANGES b/CHANGES index ef612b9d0e60208a4b4dd80a7b9f99f7042ab628..eb4bc3b8d6b38c998a064302f13ee89d0e1e114c 100644 --- a/CHANGES +++ b/CHANGES @@ -1,7 +1,13 @@ +SFLphone (0.3.1) / 2005-04-21 + * Handle error messages on screen + * Handle refused call + * Notification of remote RINGING event added + * Management of lines updated + SFLphone (0.3) / 2005-04-05 * ALSA driver support added * GSM audio codec support added - * Rings support (just ulaw format) added + * Ringtones support (just ulaw format) added * Notification incoming call added * Apply skin feature added * Volume control added diff --git a/src/audiobuffer.h b/src/audiobuffer.h index 4f925d0e28df9df24f74cd2ea2026e175a35da04..c6607a2eed548a032b6496de6f5a5d1a602d7593 100644 --- a/src/audiobuffer.h +++ b/src/audiobuffer.h @@ -66,8 +66,8 @@ public: void *data; private: - size_t size; size_t realsize; + size_t size; }; #endif // __AUDIOBUFFER_H__ diff --git a/src/audiocodec.cpp b/src/audiocodec.cpp index ce8682c95211c84c1ae6e3154c53f14fdc8e9bb5..208bacbba59231ced1519bb547810e5cd6bdc867 100644 --- a/src/audiocodec.cpp +++ b/src/audiocodec.cpp @@ -169,4 +169,24 @@ AudioCodec::gsmDestroy (void) { gsm_destroy(encode_gsmhandle); } +void +AudioCodec::create (int pt) { + switch (pt) { + case PAYLOAD_CODEC_GSM: + AudioCodec::gsmCreate(); + break; + default: + break; + } +} +void +AudioCodec::destroy (int pt) { + switch (pt) { + case PAYLOAD_CODEC_GSM: + AudioCodec::gsmDestroy(); + break; + default: + break; + } +} diff --git a/src/audiocodec.h b/src/audiocodec.h index 9d927752d1c674f39a0e8b18b736fdb4763f38cd..dabae0928ecc14410ffd0e2277af1421d4dd88c2 100644 --- a/src/audiocodec.h +++ b/src/audiocodec.h @@ -54,6 +54,10 @@ public: void noSupportedCodec (void); static int codecDecode (int, short *, unsigned char *, unsigned int); static int codecEncode (int, unsigned char *, short *, unsigned int); + static void create (int); + static void destroy (int); + +private: static void gsmCreate (void); static void gsmDestroy (void); }; diff --git a/src/audiodrivers.cpp b/src/audiodrivers.cpp index f14d02c6105d40a20f32729609779ecf08cbca40..c104564e8577cbe101cc3bec294cc8b3df48faf7 100644 --- a/src/audiodrivers.cpp +++ b/src/audiodrivers.cpp @@ -25,7 +25,6 @@ AudioDrivers::AudioDrivers (void) { this->devstate = AudioDrivers::DeviceClosed; - } AudioDrivers::~AudioDrivers (void) { diff --git a/src/audiodrivers.h b/src/audiodrivers.h index 4daf9956d3b3c988afe14e525fff1e827e4fd1ec..878ed5c5a32ac80b800cbcd242f04ae139200dcf 100644 --- a/src/audiodrivers.h +++ b/src/audiodrivers.h @@ -29,6 +29,7 @@ class AudioDrivers { public: AudioDrivers (void); virtual ~AudioDrivers (void); + AudioBuffer audio_buf; // Buffer that the application fills enum DeviceState { DeviceOpened, @@ -46,7 +47,6 @@ public: virtual int readBuffer (int) = 0; virtual unsigned int readableBytes (void) = 0; - AudioBuffer audio_buf; // Buffer that the application fills protected: DeviceState devstate; // Current state diff --git a/src/audiortp.cpp b/src/audiortp.cpp index 6adf102b45b93c4d5d9c8ba41962efed79f347dc..9529188602ffca46aa266f5f625dc3c0ab28602d 100644 --- a/src/audiortp.cpp +++ b/src/audiortp.cpp @@ -93,7 +93,6 @@ AudioRtp::closeRtpSession (SipCall *ca) { ca->enable_audio = -1; if (RTXThread != NULL) { - qDebug("RTXThread DELETED"); delete RTXThread; RTXThread = NULL; } @@ -107,6 +106,7 @@ AudioRtp::closeRtpSession (SipCall *ca) { //////////////////////////////////////////////////////////////////////////////// AudioRtpRTX::AudioRtpRTX (SipCall *sipcall, AudioDrivers *driver, AudioDrivers *read_driver, Manager *mngr, bool sym) { + this->time = new Time(); this->manager = mngr; this->ca = sipcall; this->sym =sym; @@ -128,12 +128,10 @@ AudioRtpRTX::AudioRtpRTX (SipCall *sipcall, AudioDrivers *driver, qDebug("Forced port %d", forcedPort); session = new SymmetricRTPSession (local_ip, forcedPort); } - AudioCodec::gsmCreate(); } AudioRtpRTX::~AudioRtpRTX () { this->terminate(); - AudioCodec::gsmDestroy(); if (!sym) { if (sessionRecv != NULL) { @@ -163,7 +161,7 @@ AudioRtpRTX::run (void) { timestamp; int expandedSize; short *data_for_speakers = NULL; - int countTime = 0; + unsigned int countTime = 0; data_for_speakers = new short[2048]; data_from_mic = new short[1024]; data_from_mic_tmp = new short[1024]; @@ -255,6 +253,8 @@ AudioRtpRTX::run (void) { session->startRunning(); } + AudioCodec::create(ca->payload); + while (ca->enable_audio != -1) { //////////////////////////// // Send session @@ -328,9 +328,9 @@ AudioRtpRTX::run (void) { manager->getSpkrVolume()); // Notify (with a bip) an incoming call when there is already a call - countTime += TimerPort::getElapsed(); + countTime += time->getSecond(); if (manager->getNumberPendingCalls() != 1 and manager->ringing()) { - if ((countTime % 2000) <= 10 and (countTime % 2000) >= 0) { + if ((countTime % 2000) <= 10 and (countTime % 2000) > 0) { manager->notificationIncomingCall(); } } @@ -345,6 +345,7 @@ AudioRtpRTX::run (void) { TimerPort::incTimer(frameSize); // 'frameSize' ms } + AudioCodec::destroy(ca->payload); delete[] data_for_speakers; delete[] data_from_mic; delete[] data_from_mic_tmp; diff --git a/src/audiortp.h b/src/audiortp.h index 551461f36e13872e761c6d6c2843120b700b4944..2117669d1a9662dc906e2ae1e5d4a1a0ae84065d 100644 --- a/src/audiortp.h +++ b/src/audiortp.h @@ -23,6 +23,7 @@ #include <cstdlib> #include <ccrtp/rtp.h> +#include <cc++/numbers.h> using namespace ost; @@ -40,6 +41,7 @@ class AudioRtpRTX : public Thread, public TimerPort { public: AudioRtpRTX (SipCall *, AudioDrivers *, AudioDrivers *, Manager *, bool); ~AudioRtpRTX(); + Time *time; // For incoming call notification virtual void run (); private: diff --git a/src/configurationpanel.ui b/src/configurationpanel.ui index 72fdbc9845c440784d51a9eaf6e0e5a4b8a4b1d1..6740a1fc9b56af259ad26e840c13a52823c220cf 100644 --- a/src/configurationpanel.ui +++ b/src/configurationpanel.ui @@ -1231,6 +1231,24 @@ For more information, see http://www.sflphone.org<br> <attribute name="title"> <string>About Savoir-faire Linux inc.</string> </attribute> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="geometry"> + <rect> + <x>85</x> + <y>126</y> + <width>291</width> + <height>131</height> + </rect> + </property> + <property name="text"> + <string><p align="center">Website: http://www.savoirfairelinux.com<br><br> +5505, Saint-Laurent - bureau 3030<br> +Montreal, Quebec H2T 1S6</p></string> + </property> + </widget> <widget class="QLabel"> <property name="name"> <cstring>pixmapLabel2</cstring> @@ -1250,24 +1268,6 @@ For more information, see http://www.sflphone.org<br> <bool>true</bool> </property> </widget> - <widget class="QLabel"> - <property name="name"> - <cstring>textLabel1</cstring> - </property> - <property name="geometry"> - <rect> - <x>85</x> - <y>126</y> - <width>291</width> - <height>131</height> - </rect> - </property> - <property name="text"> - <string><p align="center">Website: http://www.savoirfairelinux.com<br><br> -5505, Saint-Laurent - bureau 3030<br> -Montreal, Quebec H2T 1S6</p></string> - </property> - </widget> </widget> </widget> </vbox> @@ -1279,7 +1279,7 @@ Montreal, Quebec H2T 1S6</p></string> <data format="XPM.GZ" length="58862">789ced5d596fe3b8b27e9f5f114cbd0d0eea6475625cdc878eb3b4b34ca72799e9745f9c07c74b76c776363b07e7bfdf629194488ad49249e4f40151109292488a923e7dac85a2fff9dbc2e9d1e1c26ffffce5fea1f370d95de85e74260bbff51e6f6f67fff7affffdf72fbfae2c2d2f34971696165717967ffdc72fbfe21f0bdd05682c37d61a52ffcc7a87f40eebbb4a6f2a7d47e93da57f17fafa4aa3b7be2274e8487d7d49eab8a4f43575fc96f533d2cf58df547a53e953a5f794fe22f48d95f5de866caf2df58d25a9c34ce96beaf8b9d4cf96cf56f9f890f5333a2edb1b2bbd29757c547a4f1d1f495dd7c78b44efb13e507a43e9db426fae6ef49af27c7da93797943e50fa9ad4f145ea49fd65a577947ea8f5ee1ad7df557a5f1e872dadcbe3f8c47a97daefb2fea0f4a6d2ef95de53faa5d4757de849bdbbacf496d03babcd5e47f6ff52ea9d25a583d2d7a48e7da927f59f125d5ecf27a537947ec47a97eacbfe4c94de51fab1d2fb528767a927f5af94de913a74b5de93e7df577a5f955f14fad96aa7af9ee758eac9f36d28bda1f0b22775dd1e9e28bdaff403a9f79695bece7a2f799e23a5ebe7f9ac74f5fc7045eaba3e7c4af43e1f5f557a43eac0f8eaae25cffb4eeafa7ee354e90da5f7a4aeebe3b5d23baa3d7e3fba3d7d3fe14ee9ea7ee250e9eafec195d4757dfc5debfd06eb6b4aefabf62fb42e8fc367a9f79795ceef5b6f2db99f33a927f7734fe90da57f937a52ff20d1657fba4a6fa8fefc99e8f238bf2fd43b7d3f51e9fa7a6e95aefa8f9b52d7f5e14ce91dd5de86d0fb0d7d7df855eaba7fd854baea0fec285dd587b6d607f2f8b5d2fbaafd2f5a57c7f97dee27fdc153a5ebf6264ad7f5ffd2baac8f37521f2c2bfd4ce90da5ff10fa20391fee4b3d29df52ba2edf49f4019fff46e91da533df0c06fa3882d2d5f1af0f4a1f683d4a94fa24622e4add123117a56e89988b52b744cc45a95b22e6a2d42d117351ea9688b928754bc45c94ba25622e4add123117a56e89988b52b744cc45a95b22e6a2d42d7f177308d821399bf77544f979e4b598c32ef6b08f033cc70bb55de2155ee3cdbcafe8e30bdee210ef7084639ce03d3ee0233ed1df09e9cf38c519decebb87ef2bd53147ac768d2f8cb601612dfbf7136ecefbaa3ea2600bb70855dbb883bbf8b960dbc5366171847bb83fef7ebfbd54c51c1e58dc16da0e3f0eeef81df91dbfbc4bdbfb848b23622d282cf99570f4c7abb6e379dfc1b7962a98c31b1a3ffddce6fb7b52aac53f091107344a5ff2d87c42e8f8eb2daf0fbf25fd7973d4e1293392e0a5eff8a3a0ec6221b785b6a5b7eef7bca53ce6e8e915f39bbd2de7f916c43f57c17a2b7ebb903c966f6447ae166c6b29be08cdbaddde5bdf3b6c187c342a28bbe4e1b0255c278edcc0267e05c42d00e8f8b80ef0ad7b3e5f298b39465c96cb06849b2b42c8359ce1267433c797b1e36d0d88db2e0ab8f2c41db108a56539f602bfa9f324fbe1cd31077d838f724740ea4786bf60e02b07e7597b0fcedfbae7f3957298f372dc00d7ac327f911597e5ac818fb108a7699915dc14c8c40e9cc105f48cba874ead9ea7fdd0c67da3676df8d56f7defc8df4cb928b7751a855deeea602b507694e1bac5b7eef97ca50ce6f08b974baecd32c47321cec93c0db2e0521f37c38364e3ad32838ae3dfac73749df69709bb3d204e931bc915fd774dffabbec14d5e3ffeae900f9a72513ee6006e1d9edb0a9786a1c373776fddf3f94a29cc2dfbb8c4ba4b6730cae19c15abb52fc9fee073a267744163ab331a1242cd7657a13016581fcf6151d99151760727b9656fd9fa53e561f8d6fd9eb714638ec63eafdd649559ceb7afe0dadb5ec5f8b1652f96b2ce98e7743fde97e7c685a587e42734b3f13698900771ef29dfa211f9166790d766618c46956bc2234ee9fca76f7d0f5e234598a3912ec45f3725caa80d9e8c7bfca4f62f57ed2b3c57e5ac6a3c87fb70477e64533c49dcc7198ef101a6f81d66788477d9676ff1dc1fd2d2a7e7fa0c973084195c12b70523bad4b3676a7da6f90c3a30a61acd40e91f7847e567844260940e71421ecc928e1e877009f7e40bbfa49c293816c80dae7ae7df568a30079fcac4df380b96ef4b265137b6d5c4fe4f55fb6ad87307256b54b0e70861a94fd9f1c6ca1c5bdee439e6ba4e12af4bda8147efb9a6b0e9cf3f402bcb4584c5cf057ddbf58dd6701eb80eb204ca32e47b4821cf0d82fc3548fb4dcfd66bf319db956a2fe144c8b1a2037d49ec39b82859a302cf116b14e604888b8c676bf35cb0ceb6739e0d62a6dc3a84310311706ff154f83cb6853d8171ee39a64551ecf7937ccc4149eee2d859418e425bfc894ffa37ecb9b29833edb97c8cc343b9bc00f99f498cc3e539ff465c6322085d2ef46e064e7156a65fcca98955483ed8b0b04e7b5e5c5780b96e0e772dbb1126f20ef2b84e656089add27c43a5ab4eed3928392e97e7395f3e1436c9f619e13d8f50e9fe84e9caf11c6d897f41c8dec91cff4ee36cb64edab359e9dc6ce2e11253da1cb8497bc66401dad7f72131c7fe68c817ddf194ff421e4288eb5655995563ff7295b900863d57d287b0ecb9c3dc92599e3347d16d63ffae1e95b23c0703c2e83159edf6fe84b518a5d639a4f5c6734edaceb199aa93e1397811ef029dcbe52e957f33f2c09f79144d7c06f2904d3bf27b282efdbe92873908fba397e18c395c046cc0849bac5cc33969d7e5f2ef567ceeba548dd7f39ce32fc038cb412ecfe9d82db6c0e226d00c3fb4b8a7a351a5fbca2832b849ed77788ed84af11379d98e1da86a3c18fb3fdb769b7d9daead598fe4610ebf0438ab2036a66c3bb75e12d123241c7a8ef7b1879b79715e279fbb92df0bae61c6e772633336cfd93618f779cb3caef6d93c67645c9969b2e56d2ef5cc0ae051362dc3fce4f09cc54d60e571a1aff6764c4ecc9c636a5c67e6681d928bb96e96af60b7242765e78c185164c2c20a86e6e1898cd6375f9b467c4ee57269cf09b1a42d9be96c1693e7f27d0887e71a9eb34f8de3724434796ed78ec5391cc8c74c5b0ebc36059c5b9cc628b679ce9e1940bd36cb735c86fc629b17ad5929ecc398c7e71025ce1d5bcf325c5421a606570e9739f32838bf15f6750fb3a36726df1afeab50f76a7bce1335b5388547c5bc3c04581c28222c840593af02790b93a3a41de8f09c937b25de73cb8f1c3b8fd80cef69ef049f4c8e53dbccdf8ff7945c9edb7478a56214173edbf5bde7001ac1d788ad2e3dbce7ccb374f2ad79db4dd27aba2f17738e9de3cb45ad1bfcf0cc7bcc7925ce1be5d85a6453c1a3c55781f94966ec0ea6bcc7b6e79cecabe5f34a9e9b94f673c5f6fc1628aa26b93cd7b6b8a354ae8afcd6d574ae0878edb990e00d95bfb238cb9a7f97999f774863ab98a3796d6e84f4c4267c9d3d07de397f8c22cd5b6ced59f69c930720567379cea8af6d35cf3dc8f4c3e1b90da757e30ccfdd67b82c67f3e749de577279cef65bd3b9b7c44df464fd3697f4493fe9a33c37d3f15bf385ce7a62d88f8615e6d873d725be427815cff96d2df23a537e38e23da6cde662ceb60f7f64e6c505ec28b8346d446ec9e63907ab561f183fe4d796e5b85d7a6be610a32b88cfa5398313b56713b59de68d3d305e64fcaec7333121c9af96f0339356560dae4bfc34d39e2b9789b0ecb9f27eab27f2e8f014fb9c16cfb9b195877c9e0bcd37b7da6cf31e8be7dc6cbe555ef2dc83cd6564cd1d1147cf5c216fe263c68493f9bc623612f9142f066f9c786b98b9089e73492894ba971773ceece42fac7c6bc95cadc573b963bbc34b9ef920786c1c67abaa22cfd97c159887697d3721f754e4393cb2ec46af9d305f29c0dcb5b68792586f9abff4320d5c383ee441e29b56fad69ff854b7b39ab49dda732539d3b2e7cef3de6b87973c2c0426dfb0556571cc716e7b82e79a165f79470998581cb5ce67a9ca730dab8dc2797df54b01e63a094f64e36dde6f02c907f5fb92157d5e6c2575137e34f2adaf9957720139b90bc76fcde484a83fd9785b259e7338cc6bd1d9795299d7a8cc73b7561b7e0b08e6397bb370fedc5e300ee6650d62466f79a8b8a289f18d57ea8526f65cd9d62c7bee22ef8b5b273eb7eb8eae3831b84667a52ad9733cea99e7c85eb39527d57da8ca734e1ee2366b27e0a2884e136fcf213627a4107367c118981f7327deb2b93ea3b79d6b6d131afbd2f85cc9595036cfe5f1a39b6fd579247517d0e21a9d4bafca734de71c1607e186fd0dace6daaa3ca7a2d7693b632b5b36219426b6dec7cbf1ababfa1488f5fba3584f5e4eec5a2d7e29c20c8d6487b23e18350d7baee437f98e3d27da7bc26bfe4aec0c76f026b5313df34a1e93f9235bc416296725b9d86af61cd77062678487a9980bcf2b99d8f3eabeeb79ead5790ef7ed6f64a9f777c4a12d7a73d6ad3cc72eeebd359eca4809cc75d03f4fe44f4fd91b1f278215eb861ecab973413f965a39d4fc68bda3697cae24e65c9ef36df024d8cfbf9e08bc40dfcab38a2dc9c556e539f12e79e7cae5e607aaf31cc7654a9c43e639ea9752df1afee9e52e8f756ac5d5923cab3d57c498537268e62cd4d18ecafecbfa16b68cf85ce9b547f025688f5a9c5d7a9ef0d8988d6bd671fc43e215b3debeb17fa9c479ccb97b95798ef717ae8f42e89fd3ecf492dff11f7839c2f10369b4cae44c61e4ceedc41bd8b2ca5c72066b8dc6bc7dec9bf1347b44b66276a5a39999b928be6d10e2b90cefb5cc33e3c4389659338e9ea93e66dd01f12d56ee7976ecd89df33d843b37fbd8386665897196c7a9e4417cd0ef218c2b58f172841127232bed30cb21bed9c41cc53bcce59e174260c6e6c3dfd5f10a1e49609d15fbef75a9ef2176325fd3fc20ab4b1e6b7bce7cac8e7dcfe6f3f1ab9527357dd5a32c16f029e1a6ec9a08a9afbbebe662bf8a6fd9be67cf43e79e8b1da7a5c2ba4c2b7e8e202611ab21f9befbbac89b794e185dc1cb6c7be4b3acf96b243c7a55e50af10b5c65e6d8a5f24d62db89cf6d8ad506f116ce0939c46770e7fff29438eb0e4710f2e167b01d5ef781fcd4291e93bdb8091db21bc70070e79bcfc2e74142cfc8df07f2b7ee704cfdf0f7615f7c718b47d4fe0c0506a7f3febab5e2fa73df8cfc6be15ff2154a45d1e89e7dc12e1c10a20af334342e1f54cba1951587e7d6dfe31c51a4545b67932cfcb273d856e77d65d5c4b1e7fecb57f49daf545f4f18ce3cebcc59f3e4b057cc581f4d2c9efb3ecfafdcfffbe575eba613dfadaa58b1c96dcb7812b2c53eba58f3e7e6f265cacf254994fb156b6cffbddf87c01659619bbcc666096bec230b790c29cfcdbd37957b7f1b9a1bf54ee79b605bcc3026ff7b884fc15253ff4c82f83b385ae025b1e77e8a95cac9537dd4cf148f0803019ff75dcedda7bbb52efa407f3d7122eed30f98fa675245cc6949e69ded64e35c1f51a08f6d9d8703a0ff6bf47b08ed7c6e62b2761073b774ccfbf646cca5c22b03ce7e8e5f01c12631db4b92d53f224ea9317b8adb74be06af36360dadb543e3ee4be4b9aa8220a2baf82c249d394c96df3eaf8ad8247c9a6b81006ee008c5bccb75f5053e582b324d6cfe34d6779af1d7a723dc4a66ac00b5b108e7380cc589517c952884bf06123c074311b9a636c4b70fd64a50740d47b84eef53c1db04f738c6276a690cad74bd46c2ce3936685ba7f6f5fcaa323c774ac7bcbf60103117161abd8e047a080153fdcee20f7a26e24edf132a1e04d7c84c83989706537af6e2c91fd3336b094b3bcd55c13d3dc9699a3d23dc3e0a1c93d5d3a2273862643cc240cdeedc127692380fb5ef99274f3d7a54fd78e49537c56a9a6dfebda60798d179fa12a9544eac43774c489ca2f82e312707c1f938d9c63db5a1381487b84d75c53b764af7635baf6020ed39be2f219e8310f746cc85c5e405badb6da103f38bcea0121bb465665d7872aebf4b8c933c0f40ae97cc04854769f513e2da3ac34a3ca34ac09d6431f20a037379457d3ece7599e7668a5d9b023bb28764a3b6d3160889399683b8428d4a14efceb6ea53bab2a5e895fc46a304cf718b5e8c47cc95131ecbf6388ed74e5732a7777906721d89470fe6c8e6d2775da09339418f4e13815562b7a9594bd86522064123aae0b87e78ee07f1a4e04048eb19ebe22d4aeb9d38746622826c84b66f25163ec69c9a9ffbc73d7d8d65ec3931c3c0bf3f62ae8c306371448a79cef8f681ac37f915ea3a3353c35979eb51e7f84539168dc16dc144b2969e1387fb0223e249499ecbff5d0818a4f612fbad49691a0fd9cee335eddae96a13c2560bc51e39da92fb8d188fad8a87cbf15c287a1331972fbc7afabde4288101c173e69a21642bb5d53aeb6c0d11f7b4d2df39c4b1b4e8041f12beee68ec92df729dca919af889ed3042e494acf47b14489ae9b857becd0f2de2448d6830ed3ee6e24bf9a6703bf41fa1f888da7e0afd2e19db0ea17b704a0c3911f6a8b01f794f097b2e2c117321c1167b09fcf536bde3438939e639e38b6ec154fa7fb27deea43f49a5e52a3a5bd25aa367ced8a3b148f2c4a2fcc2465873f42cd14597e4b982fedda74cc83c675a9fcc73b0adbcd912d11fb6e63c5fe4d01508bbe007db78e2ad929e45299e0b49c45c48c4334d474acef69c2b9e33ec7ab6d2adf71c26621c250e427e4ec2b34cd0c156d8808f4b5d708767652469cf15f58fb84dfb32c29e4b7a21ceca3c37947fcb5e6d766c657b33b100c5fb26cb94b3e7421231e717810ecbba9f04786e94c58688a7249ee391b2e3b46fda521ea9f47685e5e5fb6587923c67d973e6ac7969cf9d9a9e72416b23ee97b326077be3497e83af3df2dcbb094cf819682ff394b5a987e746ca9e33c625b6a75ea4b720d0435c90c6e59e9903d3b89df00492f9bf34864ba40ec379cca4ec84da51dfae727c2ec3733c86bfa4ab7d91b5300dfa98fb6caf6d2719dc0deaa988eebda416204764c6b2d7ca9e1be6d97310f855b388b990f00828be09ddc031fb93722685e00e234a4b969a8c9534e8dd5f17bf8e04d2a6532312790f633342c1f113834f84374825d6a9ddafb00d331561c6222f52fbd26a55b2a30ccfc9d8728bfde545dc00b16eec76deec059cb1cd3aa41a138ef08937e996e37e77e25de0b743c70f5b9263a5671c686f3fe621aa0bee894c02bdef7b34aaece9cc8fbd8616dd5995d1a2e313fe052f61bf19712ef1bcac1a5fed118cd8846a127300e156b10c79230d7745cdac48bb51b02e21d62a0d8f464e6e28fa457d1a17fdde35e1f252bc5d847cd01904eafdb6f88e82aeee2b217028475a7a0ff95706443fc3bf688c81bc47c4dccf2c345abef91783ef3fc721622e4add123117a56e89988b52b744cc45a95b22e6a2d42d117351ea9688b928754bc45c94ba25622e4add123117a56e89988b52b744cc45a95b22e6a2d42d117351ea9688b928754bc45c94ba25622e4add123117a56e89988b52b744cc45a95b7efdcffffcf2ff6d14cd7e</data> </image> <image name="image1"> - <data format="PNG" length="3462">89504e470d0a1a0a0000000d49484452000000ad0000003008060000006357fade00000d4d49444154789ced5d5f681cc71dfe1d38201751cea50f9609450a4d402e84acaa3c9cda04afc84bcf72704ec983a5360f77968ba5f62572f222db41b9f841912fe05697a2546730951210921fe4b30aa63a178553c0ae4e454532382015b54841145908211dc2f0f5616ff6f6dfecceec9d1c39be79f96cedfcf9cdec6fbefde6b7337b04221a22a2b22100ac0000902d20f680b2b753c167164b76d0f4c3550080323805ba0250ef1817d511a0fbce0200e0bbee78059f5ef45570615d23d060220d024057c6a43108203a818a0357501ae50a00506f7833aa2caa23c0ead64e45425450088532624f63443f8c2a83f1e9858ae356d0133d332cacef4049959759dd50199caa48860abaa26b06ac03c127c0b0560c26d215c7ad2017b91716d677104cf860cc641a940268700a9402c237670100638b5a9441b49e60df58e98e0b60607008d1f39d88767416308ae8f94ef427fa0100ababab4f8f2401909e28ef84ded9da417f0288767422744245b423eabffe7db0cf09cbc3b07d9aa1d8826bca2ee189302e76b4f6ea1b15a05143a531c4fd7f4f6ffca960f69edeb86e7fd9ecddb08f47f7fbddbe26f2bed8e780f699b70769861549d1c9595f1ad70fe346cf779a6e44b8258281c12100c0f0c8189000d496b07e5d690c6136377bf01997d95f2e8780d96195c610a21d9d25316d59ede3a0ed0faa0cc316d02b8546b325695cf54656dca12c0c8b3dfe00e2a1665f7a32ed5a3fcb57aa839474ddcdbe551ff601089d506d4f20b77af010be26b6ac7d5ef90343441423a21411c500043e1a273ad44af4580ca34a8e52bf6a205e8afd3547d7e71a84ebe3e1f0a9356a7ff9582065b4d70173b9599c3df73bca539eaaa88a426a1325fb139ee54c08a0b5ad9d96bf59d6eb3162580d5357478cea5e7a21d07442457e3b4f55d55534733743a9402060ac2f339dc5c5cb1769737b9394fa7a6afecb17016667c3970dd474bf99f2db7953fd4a7d3d29af2874e1bd0be6fa12c0f12f1ba88aaae8eaa757a9f9f55f0492834348fd39a5970f1e3d429bdf3ea23ce569f17ece660f4366b753fff472009a4f9dd4eb33e6abaaaea21935436b1d6b5473ac705f04ecabaaaed2fb6b6c27f9798a266f4dd2f2b7cba67682478f50e6addbb4fbce2e1dfee10f0229b2cc3c3f6fb8dc92ac86f57a8326b48701768d166e8968f64c6785663c2b1f3aa16a1d29306df7fbdd3a2385de50811d006f14db0bb784edf69db65fef4f0cd8eddb00a2e73b4df55999cf91111d3429fb7f4f6f9c3f5ee068fe3d68fd32b4c7c66f3637ab8f839eff7489f65919ff74718d1139d3661eef02d3eb4c1b9b98c5f57ff960c41f6708e79a1d59b68b883e93646e378c5f6ea51a0e735899f2f8ab0d3606b132457d7d3d35ffb299dadb5acd8c04203797a386869fdb18fa78a3022323253f4f9191496e4f8c1799c762c7e2fd1cddbe759b2e7d7485f294a7607590ba3abaa8bdfded809bfd8c91928d21b076621d31eafaedd940aca31373737336a66e7ba78d4ebed91218191943fb3f5b29b619233a54450daf3450d7b998ce70c67622a72254f7e125ef7128977da74e52ec5c17b1eb61354cf5fd574cf7f7626f1c93b726294f790abd1aa2a63f7d16d034c45e69f158b617c196d6cbc7b4d2d10400fd89016045308ae0522f6398704bc4541e39e84ce1a4097b7ae376463a5db4677874cc930995c690be9a77b477c3a2e12dfd70ea2f6b1739d8fbe332aeacbfe196b0a93eb68895b50f0fcded47ceb499181dd3b0dd3f00d09816f25ad688a1cbad34e3c8b54457bf5ea6f7efd6958569356dbb4ced2fbf20a75189686d751535353594f96a869abf69a2d6bfd935ab5163757d7081e6eee768737b93cbd82cffa30470bda0e598b65dfe6699dacfc5f4f2f1cb3d74f2cd968095a9799a33339dc585f72ee88c1cfbfb5d0e93453137f740b7abeb1f5fdb986aeddb35a2c7447488a8aafa30253fb9eac8b4367b24c741da3e8127a21183d5419a9ab8ad79bc32583a23baa5fe99f231ae30d30a607a326d628ca14258cca6690babd9e1d1314786c12af80cce34216bd7a1bc97e664e58534a344ff6773b38efdb13224d3b4c67170626859fbaced8bc6cb03ab5b3b38f6c7c32533e0d85b6bd45a5fc3e15ba2f1076bf4f6ad1aa27ce98c8bcbad5c86326931a5c1339f71a647cfe4c8ca98d6f2cd2d6138adce8ddacbc644e773948a69f98c1acf49c3316c3dd306f624583c95a3d487629ad1cab432dadff8a4617f771c074e3969fbbc989e2c4fcac25a81500e064c4eb932ad9e0a6fcc4a6d6f781ec2ab62ec151812007b53c6a2082606380d60da45e3c1b26a76b8eea499f528838b7da6f8271c56cdab4526f3d48c124ccbd3b4c62750e80dd5ccc016fba435adcbfd624f36ddbec2fd626b063d7a10f51b356018bc4de83cc965585e0a7c9e21fa5fb3af76bb2fb7523d6746ee6eede06cd7599a7bf040582b29f5f5f4f1a58fa9eec53ab2c66783478f507e7bd751d3d998a117387ecbacd118e358198e17ff3462ddd13a1af8f42ad5bda469f8d40915cc0e27cd5877b48e22e99b6561da26d51c3f1619879b2d11b038ab937d4c9b5bed30ae0978e351f7621d8d7f3142a940205012d3460a9b61fca69ecc82cf3764f0661440db14c389136285b3e70005666671d38d427c16c5552dd3be26063530032bd79fe877b5333d9936e52f961bb0dbc5f21bec61f6b272d96989378786feb2fe38fedd60171b2f1645b096f3b2cff5cda3437bd1f3da2b654c9bc7997ced7bbd56dcb5556aca2e6d809272ed0713077f734b05f70fc95794c063379774f2a1755db55ae1a445f71d4045f13065e554f0f703c599b64f6c3757a949d41eb78ed572985b4995ced03b8509915dd900c0a9cf703dbbb251d689b2c39978acbdf8f402e2289c922e437b03f796104561d312808575737fd20f57a18e68d7359c421cfecffc2dac6f200e737d114b7d624c9b7c22feaaa75299d66f3921b4d607bb16dc97f8328a7b43944198b5f4161cfb9b5d4149fd1db867af3728d85f42e10927d1bf88cb6e40e3f87933ed1362586b2a8569fd96137a3459eab31ec68c8c66b976ab23008f2945188fdb0fce78c5515a7fe39c7a8d0eb4b307a823fcf1163af307a0f65a9a3b6ed6f29e4cbb1f89ed55482fbae73b884cebc5a05efb9115d67fd9f65dfa915d7166daf8b48f760c189f966070f07709baee197129579b742e476e1e1ef2e79342c978a6ac1fc086c3e22e0267bbbcb4e977c9b422df850826e4b56e7c7a419a69b98e22335164ea85fb97866a9345cddd7d6701bcb5075d71ff1291ab26e1450922370b33b0af90ff860fa7756ab720f6f5c4d16a91511c58a6751b4fa9377b4e0ec4e907b84c5bda7724e2d3ce71747868651e438b6050a07edb0c6618b6bc38e8ce2c80aef1679eb4d3f266a44543476edacf96d91cc5ea58df29d3f235ad134627c4cea6f961da27a16979985dd9903e6ba8a4c434bfeb6a5777b0e494eb0cf1d2a68e4eeb529fad7dc955f141d2b40a80b4f18c19344737ee5f8e8c0a9ca870e9c781d0b40e2873aabb16108ea37399a9e8b07ccdbb2f4c6bd1d4d67cc13e6fc73b489a96c71c3b7b66cdeeb5caeebef314685ac1f24e587b4d7c833f818822a3f6190500247866cc97d30ad4eb37de795034add0296287fab0657074004ef15213a31d304dcbec963d7328fa49acd24f2e3c3f4378b7896493df5d5ed9df3ca2a69ffcc8f5e4c2d92b00affceaef77a9a670aa53e6e403c340ef188cf5c55f5ba48bafff4cafaff9461677ffdb44f4789cd49fb6527bbbd899b6239f8cd3e663f17118ea31ef6f75ba7fc267ea38f80040c2a15eb7fdccbb7bc0e1e788fcfa53f0d0383dfac07dbfb4eec1b52530df93625aa1dd5d44ee4c2b3093cba56945edf5c34cc6f20b9cb37852ed3b606dd2d91eae865d01dcfc4819d4ee7d7c5a0b67f1ea777ce218ef2ffbc7f0fcaa90f6f08a32083bad643b325acaab9e283cf60eb84d08094dab8ec87f4043e48bea4eda9c176ff72b11a213ce5f04728c76408babba45057871e9817b4bdc284330010cdc5bb29523f380fbfb128c74f2f13d0455c2c1fc3c31dc667cda70b2a0ec9ad6d161bcc74786a9551647f7589db3dd713c0674d49c2ef9459f6cd8021497fe32fbcd9a96fc7f6186691c9924fb3d8460752b2d76886b51374deb179986f4d2b4c6ef47086b5a071c995fc2af6ff14f319b34ade1fed5fde136fd7bfb24b79cfafc0c1d79b78994af16895e3b4ef4d52265fe739c36b73334e7b2c6509fcf50e6dd665d6beeee01979e2372d2bca2dad48a3300ae0bd4e7b99a15c19ecc8214d18a4625184abd39a24278a84c4c6b5d855be3b06e4cdb7d47ce6e278de8c440cae0946bbdc3f385712ed39386b7d780cf8c0271671ec25ddb038063c1282435679f76024124c97e3d51f48d9115adfb5efd226f60bdae97f53724ac7649941b9e5f32ed4fe5695f65700aea88f6a243df8febe278c3f3da3eda609f565ebd91450465dac70b4dcbaa23c5dff8a8bd96d67f9b83ab6ddc34060fb34bee0e2bfbfd03bf9ab082df6f74652a3fbfb5c03beca88cc8bd93177ab559c16712bd33fa60dc52d1af24a8e0b381621951d42e7ee2aba2184c681aec200c4c050f2e8a172868ccfd625815e0be01a960058d285d20bbb2e17a2648164b0a8f54f09944ff15408b43d6fa605676f6a7c2ac15f483e5a908c0f0bc16d78b8c666de7e023286e92a8fc066e054bc5ff032cfa164c4d8a1ec30000000049454e44ae426082</data> + <data format="PNG" length="4827">89504e470d0a1a0a0000000d49484452000000ad0000003008060000006357fade000012a249444154789ced5d7f6c1357b6fe06a16a82523446148da36e95414dc584b7153650d58916e161b75a0c415bd33e294efa2a9240d512e989bae8e909684509aad4e0a22725455d48107a8923ed82fb04c43c81b0abac6cafa0b1ab3ec1a080e2885dd9165dc5561a2556feb9ef8fc94c3cf68c7fc5a174ebef9fc4f3f3de3b67cef9ceb9e79ea12ea0b2b0cdcc91682aadda66620d703f475115be5515bf5050cb115ac70221bea938fc5371f8a2294412c9bcc75beb0d301b1958eb8d48bc525715e22aca4259426b79324d5c7f8dc2234691a5548b064303769e83f3750ea10debaa025c45d12849682d4fa649f78d08fc53f9356aa9b0d61b30fca605deb56baac25b45411425b48e05424e7c13862b145dd1c69cb2f230eed85c15dc2af2a2a0d05a9e4c93f6af2305f96aa560620d186dad6add2af49157682d4fa649f3455fd9bcb55c303410382054b96e159ad015dab205763d0dacae517eda5e60d0b1c9080008259270fd452cea3295105c5b2c463cd7bc087f1bccd9c76fe2c137f0306f33c35bf7f38864d8623112fe360ce38b4644cc5b2bd266c7cc1ce93fdf0ff18108f161147c03077b8b1d897d7b4bbefe4ab44f0babb536962cb034d0fb1b33dafe8585f1f91addc38c345db4d0a6d240f3451f024fa649a982eb989923a7cfbab06bdf1edd63429188f2bffde42972ec8813ee679c92f49f1f80e79a070030141e2795108c6e67b76a2c42910868c600f333d23e2de4685ac702217567af94a4612fbfdd84fdbc31ef319d37c218bc5bba23c7d040ecc8fe92262782073b48e683605923f6b7d8c1f33ce27f8b229e88c3ebf72391882bc70cfdf1c28a6a874ac0168b119fdf07e3af384477342fbbaddc5880747fd8adda663199d0e7ea2beb05ae74fbf49023b4c3976e9392425aeb69900ff4351a0098dd41441ec5f31e930fd67a03dadedd55d420081393648f63ffd2b95601e65e97e6b9c2c42409de0d82799ec96b0e858949c2b2ecb234b12d1623f9688869199ac9168b9178225ed24b274c4c92b6439d48cda654db3b5a1d30388fea8e97ef958d65097329edb3c56204802e6d53096dface24e9be112ea9411ddb390cecd63726e56ad86c0cbd6946fad5c203660a8f93f6435dcaef7c42ab076e2c40facff5437ca84d65ac56011f1d3c0cdf2b1ba9819d56929a4d81a965d0f3694f8e86e1c602e4f8c7c7919a4d816fe0611b7153723b0746dc88dc0de7080edfc0c3b2cd84b6d636d5834bba7ac9e0881b00d0f7451fa23b9aa9f4571748fff97ee55c96352a16e4d81127d26ded9a7d97dbad85de8f4f21b16f2fc55ebd4e5c7ffc5265916430b50c04ab80c3073b953616d33ea69651fa2bb7cf3133470647dcb872cd93732fd94a76b43a14a5a1705a99165412c168b222020b00dd37c2882d105288261859354df1fb7d10f7da88cd6a85797b13985abae01b2f9b4ca696c1b10f9d68dcd488e46c1203236ef8fd3ef8fd3e44ee86717b668e0c2cf2e6d46c0a3d9f9f465bd6b57a3e3fad3ca4e48f8b7f5dbdaa178b658de08c2c00407c1885f85084f850c4e0881bbd57af13d90ac8020100a2288206729ccccc872e3e8a82d3e9e3e1839d387dd695b3dd6a1520ec14e00670f4d3134afb9c873e80f145696ce571f05cf3207837a4f4b998f665be28e2a3283a2726c9ae7d7b94ed2c6b44d3760b985a1aa16f23101f8ae83fdf8fe191610c2f6a7a4568bbff375c56686bf06f290ce8ec1b7850b9c988541a70fdf53ef23367c9a4f45ebd4ee40107a4073938e25e1ad46d26c2d432e01b38083b05085641a5d146dd57909c4d2262de4a25bef123b1b8dd0cc0bfcd440069f0c54722da5adb206b924422aea201c2c42471655015e7a10f80431f10d762db985a06870f76aab46113007a7888c80275f4d313e81b0b90523822dfc0a3a3d581c4bebd143d3c4482df45904e4994cfbcad49d15ac732ee0300f6163bb84f4e50ee5e57ee385cf72ae3703c16237ebf4fe973a9d4466e9fb05340b7b35b1158c52a5ef702006c00f893a788e79a47520abd3d6802b00a90b4ac472c53c01249dcff615e7397731b5fde3575e00a89702c1052b049fbf652b7af8ea2a3d501be41bb0da9d914429108e42843faab0bca757daf6ca4321f82293c4ee8e12132bcd79673ef8e5607985a46f9edb9e655fe1f181956fe67592312fbf652ae3f7ea96ccb165819e9b676cade62577e5f59f4c88bc1e18387611b7153b2763e7dd605bfdf87502482502482fef3fd8a87cff3eab1b1b7d854bff5c6a12dc34a948accf625120955e422f1f738b8b1003185c789293c4eb8b100111f2c51b45024025b2c465603c0e077e527be0040fbad08c28ea69ced8d2fd4a0f777661cbd551a4fd6432a0d788ad4dedeba3aca00e96db561c91948cda6218a227cdff8549cb5ff7c3f4617cd0f7bf53af1fec5bfc437f33c24f7da35943d83cb0d8f0ce3f6cc1c492412683bd4a91ce73cf40112d7bd2af36d6fb1c39d734509825550842b72375c74088a7eaf4bf512d85bec88ff7d69cc68c620599622ae55ca38148bccf62567d50ebff85044763423134c2d03a6969138ed406479663c5f64e0238bc4aa2a25b8ae501487cb382fd3fcd39004b9238b4678fd3ec44f9e5299ef63479c10ac02985a069e6b1e4d1ed8d6daa6508fd46c0a5b8566d57e59cb669f273ed28f59cfa7961e285dab1ffb2e04ee93135436aff5f6e6f6211bc1831d2494c1697b3f74c2bccd9c771c960b7b8b1df6165b5e9fc3bd760d56d966e64825f20aae88f905f7f2db4d92b42c13914412b699b9bc1441989824a6f0387114384e762c64cccf2615edc6d432b87d7514e9b676ca5b5747b9d7aea1d26ded14cbe6b26a6f5d9dca9c67637fc63e8bc9a4fc3f30a2a767d54e4dd3764bbe6e541cdc5840897333b50c46dd9791d8b75719877c7d2d05fccb6a7a2258055d8195c36000b0caf320a1754c69584f179c5cd8cf1b117bdf868eed7afe6cf1f04de9b7598ed3b61feac256a119e1a34e420f0f29422c4c4c126e2c40a2274fe578f0e6ed4b144776b464d86231123eea245ae11f40e2a75a606a1974b43a968e7b7fc94ef8fd3e848f3a893031a93c106e2c40bcad0e225317d9597b9ac8d4f20072c6a1fdbde5d30440a256996373fce3e360af5e57c6c2313347d25f5d20033bad64d7be3d90c7697578b95a763d8dd83b4251871a9fafc1c06e333a377168be1501cabc772491849e8bc7b22cf8065ee1ab72882a1ff8061e674ef6e49cdb7ea80bec5e1b49cfcec395674a1858d4b68b9e6e26da5adb54931211f356aa6f2c407a3e3f8d4422bed4bec5a80432381dcb1a31f0459f426d32639cda7d370288e8eecfe97796a633d41a0000c24e01cc172ea4665348cda68a1e87cc18b116321d56e59ecea354c7a24f909a4d4961b6c5b17065d02cbe8107cb4a6141ca5aea0c58066cbfe670e1b77cde7c837cf8c87fbfe85c844c143343c68d0548f86e10e20351e5a1cae01b78f09b78584c2615df74cccc11cf350f7cdf2c093acd18d0b4c5049ee711ba2b9b4d5a72a4320452ce79901d1f7e13af3bbb04488e4e281251394af279e6ed4d391315ecd5ebc473cd039a31e0cc895370af5d43091393a4a7b70700d0f64e67c9d3a7dc588088a208a696564532e4807f669cd5f82207fe652e671ce4f332db77fc8813deba3a55fbf225e2e82537195fe420580555bf289cbc5c308494835a1a97779b0b528262108c26d17c2308fca3f8f005430367fee3ad673a4fa08a95c3aa524fb0fd9a43eca0501181058026ce80d83b024c2f177fbd42e139c70221e93b9344bc394e862fdd26e2cd7192be33498a89f156f1ec43333551133470b9a570365739303e5f83b0a3a96cba908dc673a398ca906c89fe443110292f5c9609c70251a22d0c0dcd7cdfec65f4e24b954b6677e84c65f38fa7896f6a894f9a584345563ca7ef4c92702289683205816361df6454f5999d88115748fdcc048e45e716aeacd5279627d3c4f3200e5f74c9d936d4d0e8fbbd49b95e7142bb9ec6bdb70534be507ebcb0189cb13682a56b961dd39dd251c59508ed355ff4a9ae732f2bdf979d8891bab359a1fb939789d3c2817fa3fcd447dbcc1c693ce745d7675760faea3639fcde12a7b7cdcce5de1340e0f13459ce0b939d40e59f4ac215127126e398c1efa2390b5dfd53499cf08b70de1c27c5f6d9b14048fbff04d1754edb6976bebee43416a6073410d8ddb4e2022be3230b87dedf959382fc74902df89e076a6f79f03bed891a57288ae14bb7cba6289e0709851665b721bb388a8c4ccd5b0e92e9dce9f9545ad286f2efa13f34c15a6fd03cdf158aa2ffabdba4505cddf2649a349e1b854727d6efb4702a6b5550682fb734a189d36e54b9b8ffc33ccceea0ee84c4b32eb8f9909cd727dcfea9249a2ffa540fbde8eb6a08d04f85cc77c4fd1c45b5bdbb8beadb6d06a33179144924d178ce0bfafb49cd3ea7ef4c92e68b3e4deb58cfd0081c10722cd4ea7a86d635a7a6978d2bc2611b5fa841e4511c6f3d8a03eb69f49a1a7396ea7c64e1e04f24e1fdbf5ccd65622bfb123d4d441292e08e2ed3743f6ba05fdb480574566ea7d240fbd761d4ffd775d269e216b7a571458c634a277fdb69e1706aa75973c5ca6a8ea9d1165a1a186d31e56c1e8844e1994ac2fb430a48258134807a23c8bfe526cce4c57a5a0a73fd238da3b7c2387a4bbacebddd26858a5cf82d8fba681c9855b78f3354603ef82784bcfe6de8fb49524c62fbcf05a10deba8c300e263f7c8097fae433d954a436b7b26181a186d1520beb48ed29be45e2570ace60e5b03a7d67cfefba0be1845d7b5b0a4fd128b020bc0f9abdc998e8258adc191a7e2d87cd1abd006e3f335b071b99adec49671bf6710ed5f8711bc3afe4f178633eed84c050e089a74211f4cac01b123fb0b465b56e999da635b24351eff711ed497a352286a569b46582a69aed3c05b7f0ee2cc62351bbb06c917ea2b4f59560a26d680ebad4d98fbcffdb8f0c95bd4bdf7059cb2f2ca031d8c44e1fd53e09f2e862cbeb4ae24c195f96b310b5857e9c5f29a3803e23fcea3eebf7d0567ab5682f71ebd1586d91d4457d6721d86ae6cdc73a511382020f14a1d253f8cd086759471c7662a76643fec8be3e611e3051db454fa29574ca91056a2d0cb2a00cae065a2f3461875e70b0b2cd6af1cbf8c3c8ae724d5d8f9e567893d2d58ebf5ebf2ba9fa328dbbf3653cec57ce3482289cde77c106f8eab4244f2ecde4ad751ab34f8c752ed8c6231954a171d595905a803b73206ef4675e9800ab54fd793efdcb23ca12d14337cdae0dfd84a0dbdb9142e7285a2a83beb45d7c9cba4ebe465b2e6b32b28758574a5508e76772c1022de1c2fab3a911c5949dfd10e8fc9580548e6b6be54d6bc888e179e9e276fad372c9b1a54247fb8c248bfbab12cc74586de799953a1e5402f8eaef70cf8c7d224819e5530b1069cb2f23865e5e1b470d092b9545a5a793d7c497f5242995ce8b13616d18d5c24cae52c654ca9f658734370a5a2fb86e4b1f38fa7493941fe954268c33a2a76647f5931e8d0066da5e39f4a223e76afac3e06af8e13ad50688729d7d2656a57ad734cac018103020ebfb78b32eed84c19776ca6f837b652c7ff7dafeea4847f4a9a94d0d2ba4aee41fad58d65e5d67a7fd04f4ad643305abac05642cbca188c443128af8b2b909a69ad37c069e19f4ab97df77314751892c00c96b86e6fb4b5095a26f9845f84f5d26dd269e260dfc4e5f5ce1d0b84781e4471dc7f1f531af737b106f4fddeac5a8c296b57bd092a39e7422f3a4bbfb691ba3f3347f68c84342725ba6f8461bd749b6416dd5625ccf4ed3661b34ec2822e1249c47f9c2f2911bcd47a080c0da952f8bba535ad12f04f25e19f0aa2d88ae99c815976a5f4a67d5b29e1fb49d2fe75f15c36b4611d1578324df68c04730448ea4312802400861a5a15ebf645a5bc86aecff48bb558eb0d186d5d0a49c985b6bb749c2d8606fa76175715c8bb764dde9755d6ba7d8b933139b5bcca298de4fc0d8f3325d00bea8bd1e29cbc45145b1249867873bca2de766685f2ec5a67810382ca02b01331b27744cabe5f6e6617ff58fa5c40b60632b1066466796583fe5e8a365422abcdce1be17c9dcfb172de3f05885e828bb5de80bedda6b2cab4b21331d2fe7550d7891b7ad3ac5d9fb664f3440381b785a2126b4aadedd561e2d0b4aff4079f99f7ba1c685112feb1c4853986d6cc19752c10924acf57ac9a79b9f9b9b69939e29b4a209a9a579cb2686a5e977732b494bb6a6219985803847aa32e9da0bf9f240311e9c548a5254135d4d0e8d8c22d9b4a39160819fc2e8a2b8b0564fc5349d4333438a606c36f5ab485d6b1404876de6841aca711d89d3f23ec4c285a52ae6c29d512abf8e540b7127859820b6939ceb12d9c4a7883d124ba436249e53eedbc11437f68aa7e34af8a1c14fc5048399eec72512e25a8e29781a23ec994be33498efbcbabaa580a4af138abf8e5a2a8d5b8f46b1ba9fbefdb7497555402d67a03eebf6fab0a6c150551f26746f9c7d3e4b8bf725f6db4d61bd06335fdac32b7aaf86951f6079d2d4fa617c31271ddd9103dd43352ed2fe7eb7cf5237755948c657d855c46663c309248e52cee93637f1c5303a19ead0a6a15cbc2ff03992797031920badc0000000049454e44ae426082</data> </image> </images> <connections> diff --git a/src/configurationpanelui.cpp b/src/configurationpanelui.cpp index eb21349c3d4578bc7698b477aeaaa71befdfdaef..56b43f30a12126971b8df300f2b5ea4334706be1 100644 --- a/src/configurationpanelui.cpp +++ b/src/configurationpanelui.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** Form implementation generated from reading ui file 'configurationpanel.ui' ** -** Created: Tue Apr 12 09:35:08 2005 +** Created: Wed Apr 20 14:48:03 2005 ** by: The User Interface Compiler ($Id$) ** ** WARNING! All changes made in this file will be lost! @@ -322,293 +322,407 @@ static const char* const image0_data[] = { static const unsigned char image1_data[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0x30, - 0x08, 0x06, 0x00, 0x00, 0x00, 0x63, 0x57, 0xfa, 0xde, 0x00, 0x00, 0x0d, - 0x4d, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x5d, 0x5f, 0x68, 0x1c, - 0xc7, 0x1d, 0xfe, 0x1d, 0x38, 0x20, 0x17, 0x51, 0xce, 0xa5, 0x0f, 0x96, - 0x09, 0x45, 0x0a, 0x4d, 0x40, 0x2e, 0x84, 0xac, 0xaa, 0x3c, 0x9c, 0xda, - 0x04, 0xaf, 0xc8, 0x4b, 0xcf, 0x72, 0x70, 0x4e, 0xc9, 0x83, 0xa5, 0x36, - 0x0f, 0x77, 0x96, 0x8b, 0xa5, 0xf6, 0x25, 0x72, 0xf2, 0x22, 0xdb, 0x41, - 0xb9, 0xf8, 0x41, 0x91, 0x2f, 0xe0, 0x56, 0x97, 0xa2, 0x54, 0x67, 0x30, - 0x95, 0x12, 0x10, 0x92, 0x1f, 0xe4, 0xb3, 0x0a, 0xa6, 0x3a, 0x17, 0x85, - 0x53, 0xc0, 0xae, 0x4e, 0x45, 0x45, 0x32, 0x38, 0x20, 0x15, 0xb5, 0x48, - 0x41, 0x14, 0x59, 0x08, 0x21, 0x1d, 0xc2, 0xf0, 0xf5, 0x61, 0x6f, 0xf6, - 0xf6, 0xdf, 0xec, 0xce, 0xec, 0x9d, 0x1c, 0x39, 0xbe, 0x79, 0xf9, 0x6c, - 0xed, 0xfc, 0xf9, 0xcd, 0xec, 0x6f, 0xbe, 0xfd, 0xe6, 0xb7, 0x33, 0x7b, - 0x04, 0x22, 0x1a, 0x22, 0xa2, 0xb2, 0x21, 0x00, 0xac, 0x00, 0x00, 0x90, - 0x2d, 0x20, 0xf6, 0x80, 0xb2, 0xb7, 0x53, 0xc1, 0x67, 0x16, 0x4b, 0x76, - 0xd0, 0xf4, 0xc3, 0x55, 0x00, 0x80, 0x32, 0x38, 0x05, 0xba, 0x02, 0x50, - 0xef, 0x18, 0x17, 0xd5, 0x11, 0xa0, 0xfb, 0xce, 0x02, 0x00, 0xe0, 0xbb, - 0xee, 0x78, 0x05, 0x9f, 0x5e, 0xf4, 0x55, 0x70, 0x61, 0x5d, 0x23, 0xd0, - 0x60, 0x22, 0x0d, 0x02, 0x40, 0x57, 0xc6, 0xa4, 0x31, 0x08, 0x20, 0x3a, - 0x81, 0x8a, 0x03, 0x57, 0x50, 0x1a, 0xe5, 0x0a, 0x00, 0x50, 0x6f, 0x78, - 0x33, 0xaa, 0x2c, 0xaa, 0x23, 0xc0, 0xea, 0xd6, 0x4e, 0x45, 0x42, 0x54, - 0x50, 0x08, 0x85, 0x32, 0x62, 0x4f, 0x63, 0x44, 0x3f, 0x8c, 0x2a, 0x83, - 0xf1, 0xe9, 0x85, 0x8a, 0xe3, 0x56, 0xd0, 0x13, 0x3d, 0x33, 0x2c, 0xac, - 0xef, 0x40, 0x49, 0x95, 0x97, 0x59, 0xdd, 0x50, 0x19, 0x9c, 0xaa, 0x48, - 0x86, 0x0a, 0xba, 0xa2, 0x6b, 0x06, 0xac, 0x03, 0xc1, 0x27, 0xc0, 0xb0, - 0x56, 0x0c, 0x26, 0xd2, 0x15, 0xc7, 0xad, 0x20, 0x17, 0xb9, 0x17, 0x16, - 0xd6, 0x77, 0x10, 0x4c, 0xf8, 0x60, 0xcc, 0x64, 0x1a, 0x94, 0x02, 0x68, - 0x70, 0x0a, 0x94, 0x02, 0xc2, 0x37, 0x67, 0x01, 0x00, 0x63, 0x8b, 0x5a, - 0x94, 0x41, 0xb4, 0x9e, 0x60, 0xdf, 0x58, 0xe9, 0x8e, 0x0b, 0x60, 0x60, - 0x70, 0x08, 0xd1, 0xf3, 0x9d, 0x88, 0x76, 0x74, 0x16, 0x30, 0x8a, 0xe8, - 0xf9, 0x4e, 0xf4, 0x27, 0xfa, 0x01, 0x00, 0xab, 0xab, 0xab, 0x4f, 0x8f, - 0x24, 0x01, 0x90, 0x9e, 0x28, 0xef, 0x84, 0xde, 0xd9, 0xda, 0x41, 0x7f, - 0x02, 0x88, 0x76, 0x74, 0x22, 0x74, 0x42, 0x45, 0xb4, 0x23, 0xea, 0xbf, - 0xfe, 0x7d, 0xb0, 0xcf, 0x09, 0xcb, 0xc3, 0xb0, 0x7d, 0x9a, 0xa1, 0xd8, - 0x82, 0x6b, 0xca, 0x2e, 0xe1, 0x89, 0x30, 0x2e, 0x76, 0xb4, 0xf6, 0xea, - 0x1b, 0x15, 0xa0, 0x51, 0x43, 0xa5, 0x31, 0xc4, 0xfd, 0x7f, 0x4f, 0x6f, - 0xfc, 0xa9, 0x60, 0xf6, 0x9e, 0xde, 0xb8, 0x6e, 0x7f, 0xd9, 0xec, 0xdd, - 0xb0, 0x8f, 0x47, 0xf7, 0xfb, 0xdd, 0xbe, 0x26, 0xf2, 0xbe, 0xd8, 0xe7, - 0x80, 0xf6, 0x99, 0xb7, 0x07, 0x69, 0x86, 0x15, 0x49, 0xd1, 0xc9, 0x59, - 0x5f, 0x1a, 0xd7, 0x0f, 0xe3, 0x46, 0xcf, 0x77, 0x9a, 0x6e, 0x44, 0xb8, - 0x25, 0x82, 0x81, 0xc1, 0x21, 0x00, 0xc0, 0xf0, 0xc8, 0x18, 0x90, 0x00, - 0xd4, 0x96, 0xb0, 0x7e, 0x5d, 0x69, 0x0c, 0x61, 0x36, 0x37, 0x7b, 0xf0, - 0x19, 0x97, 0xd9, 0x5f, 0x2e, 0x87, 0x80, 0xd9, 0x61, 0x95, 0xc6, 0x10, - 0xa2, 0x1d, 0x9d, 0x25, 0x31, 0x6d, 0x59, 0xed, 0xe3, 0xa0, 0xed, 0x0f, - 0xaa, 0x0c, 0xc3, 0x16, 0xd0, 0x2b, 0x85, 0x46, 0xb3, 0x25, 0x69, 0x5c, - 0xf5, 0x46, 0x56, 0xdc, 0xa1, 0x2c, 0x0c, 0x8b, 0x3d, 0xfe, 0x00, 0xe2, - 0xa1, 0x66, 0x5f, 0x7a, 0x32, 0xed, 0x5a, 0x3f, 0xcb, 0x57, 0xaa, 0x83, - 0x94, 0x74, 0xdd, 0xcd, 0xbe, 0x55, 0x1f, 0xf6, 0x01, 0x08, 0x9d, 0x50, - 0x6d, 0x4f, 0x20, 0xb7, 0x7a, 0xf0, 0x10, 0xbe, 0x26, 0xb6, 0xac, 0x7d, - 0x5e, 0xf9, 0x03, 0x43, 0x44, 0x14, 0x23, 0xa2, 0x14, 0x11, 0xc5, 0x00, - 0x04, 0x3e, 0x1a, 0x27, 0x3a, 0xd4, 0x4a, 0xf4, 0x58, 0x0c, 0xa3, 0x4a, - 0x8e, 0x52, 0xbf, 0x6a, 0x20, 0x5e, 0x8a, 0xfd, 0x35, 0x47, 0xd7, 0xe7, - 0x1a, 0x84, 0xeb, 0xe3, 0xe1, 0xf0, 0xa9, 0x35, 0x6a, 0x7f, 0xf9, 0x58, - 0x20, 0x65, 0xb4, 0xd7, 0x01, 0x73, 0xb9, 0x59, 0x9c, 0x3d, 0xf7, 0x3b, - 0xca, 0x53, 0x9e, 0xaa, 0xa8, 0x8a, 0x42, 0x6a, 0x13, 0x25, 0xfb, 0x13, - 0x9e, 0xe5, 0x4c, 0x08, 0xa0, 0xb5, 0xad, 0x9d, 0x96, 0xbf, 0x59, 0xd6, - 0xeb, 0x31, 0x62, 0x58, 0x0d, 0x53, 0x57, 0x47, 0x8c, 0xea, 0x5e, 0x7a, - 0x21, 0xd0, 0x74, 0x42, 0x45, 0x7e, 0x3b, 0x4f, 0x55, 0xd5, 0x55, 0x34, - 0x73, 0x37, 0x43, 0xa9, 0x40, 0x20, 0x60, 0xac, 0x2f, 0x33, 0x9d, 0xc5, - 0xc5, 0xcb, 0x17, 0x69, 0x73, 0x7b, 0x93, 0x94, 0xfa, 0x7a, 0x6a, 0xfe, - 0xcb, 0x17, 0x01, 0x66, 0x67, 0xc3, 0x97, 0x0d, 0xd4, 0x74, 0xbf, 0x99, - 0xf2, 0xdb, 0x79, 0x53, 0xfd, 0x4a, 0x7d, 0x3d, 0x29, 0xaf, 0x28, 0x74, - 0xe1, 0xbd, 0x0b, 0xe6, 0xfa, 0x12, 0xc0, 0xf1, 0x2f, 0x1b, 0xa8, 0x8a, - 0xaa, 0xe8, 0xea, 0xa7, 0x57, 0xa9, 0xf9, 0xf5, 0x5f, 0x04, 0x92, 0x83, - 0x43, 0x48, 0xfd, 0x39, 0xa5, 0x97, 0x0f, 0x1e, 0x3d, 0x42, 0x9b, 0xdf, - 0x3e, 0xa2, 0x3c, 0xe5, 0x69, 0xf1, 0x7e, 0xce, 0x66, 0x0f, 0x43, 0x66, - 0xb7, 0x53, 0xff, 0xf4, 0x72, 0x00, 0x9a, 0x4f, 0x9d, 0xd4, 0xeb, 0x33, - 0xe6, 0xab, 0xaa, 0xae, 0xa2, 0x19, 0x35, 0x43, 0x6b, 0x1d, 0x6b, 0x54, - 0x73, 0xac, 0x70, 0x5f, 0x04, 0xec, 0xab, 0xaa, 0xae, 0xd2, 0xfb, 0x6b, - 0x6c, 0x27, 0xf9, 0x79, 0x8a, 0x26, 0x6f, 0x4d, 0xd2, 0xf2, 0xb7, 0xcb, - 0xa6, 0x76, 0x82, 0x47, 0x8f, 0x50, 0xe6, 0xad, 0xdb, 0xb4, 0xfb, 0xce, - 0x2e, 0x1d, 0xfe, 0xe1, 0x0f, 0x02, 0x29, 0xb2, 0xcc, 0x3c, 0x3f, 0x6f, - 0xb8, 0xdc, 0x92, 0xac, 0x86, 0xf5, 0x7a, 0x83, 0x26, 0xb4, 0x87, 0x01, - 0x76, 0x8d, 0x16, 0x6e, 0x89, 0x68, 0xf6, 0x4c, 0x67, 0x85, 0x66, 0x3c, - 0x2b, 0x1f, 0x3a, 0xa1, 0x6a, 0x1d, 0x29, 0x30, 0x6d, 0xf7, 0xfb, 0xdd, - 0x3a, 0x23, 0x85, 0xde, 0x50, 0x81, 0x1d, 0x00, 0x6f, 0x14, 0xdb, 0x0b, - 0xb7, 0x84, 0xed, 0xf6, 0x9d, 0xb6, 0x5f, 0xef, 0x4f, 0x0c, 0xd8, 0xed, - 0xdb, 0x00, 0xa2, 0xe7, 0x3b, 0x4d, 0xf5, 0x59, 0x99, 0xcf, 0x91, 0x11, - 0x1d, 0x34, 0x29, 0xfb, 0x7f, 0x4f, 0x6f, 0x9c, 0x3f, 0x5e, 0xe0, 0x68, - 0xfe, 0x3d, 0x68, 0xfd, 0x32, 0xb4, 0xc7, 0xc6, 0x6f, 0x36, 0x37, 0xab, - 0x8f, 0x83, 0x9e, 0xff, 0x74, 0x89, 0xf6, 0x59, 0x19, 0xff, 0x74, 0x71, - 0x8d, 0x11, 0x39, 0xd3, 0x66, 0x1e, 0xef, 0x02, 0xd3, 0xeb, 0x4c, 0x1b, - 0x9b, 0x98, 0xc5, 0xf5, 0x7f, 0xf9, 0x60, 0xc4, 0x1f, 0x67, 0x08, 0xe7, - 0x9a, 0x1d, 0x59, 0xb6, 0x8b, 0x88, 0x3e, 0x93, 0x64, 0x6e, 0x37, 0x8c, - 0x5f, 0x6e, 0xa5, 0x1a, 0x0e, 0x73, 0x58, 0x99, 0xf2, 0xf8, 0xab, 0x0d, - 0x36, 0x06, 0xb1, 0x32, 0x45, 0x7d, 0x7d, 0x3d, 0x35, 0xff, 0xb2, 0x99, - 0xda, 0xdb, 0x5a, 0xcd, 0x8c, 0x04, 0x20, 0x37, 0x97, 0xa3, 0x86, 0x86, - 0x9f, 0xdb, 0x18, 0xfa, 0x78, 0xa3, 0x02, 0x23, 0x23, 0x25, 0x3f, 0x4f, - 0x91, 0x91, 0x49, 0x6e, 0x4f, 0x8c, 0x17, 0x99, 0xc7, 0x62, 0xc7, 0xe2, - 0xfd, 0x1c, 0xdd, 0xbe, 0x75, 0x9b, 0x2e, 0x7d, 0x74, 0x85, 0xf2, 0x94, - 0xa7, 0x60, 0x75, 0x90, 0xba, 0x3a, 0xba, 0xa8, 0xbd, 0xfd, 0xed, 0x80, - 0x9b, 0xfd, 0x8c, 0x91, 0x92, 0x8d, 0x21, 0xb0, 0x76, 0x62, 0x1d, 0x31, - 0xea, 0xfa, 0xed, 0xd9, 0x40, 0xac, 0xa3, 0x13, 0x73, 0x73, 0x73, 0x36, - 0xa6, 0x6e, 0x7b, 0xa7, 0x8d, 0x4e, 0xbe, 0xd9, 0x12, 0x18, 0x19, 0x19, - 0x43, 0xfb, 0x3f, 0x5b, 0x29, 0xb6, 0x19, 0x23, 0x3a, 0x54, 0x45, 0x0d, - 0xaf, 0x34, 0x50, 0xd7, 0xb9, 0x98, 0xce, 0x70, 0xc6, 0x76, 0x22, 0xa7, - 0x22, 0x54, 0xf7, 0xe1, 0x25, 0xef, 0x71, 0x28, 0x97, 0x7d, 0xa7, 0x4e, - 0x52, 0xec, 0x5c, 0x17, 0xb1, 0xeb, 0x61, 0x35, 0x4c, 0xf5, 0xfd, 0x57, - 0x4c, 0xf7, 0xf7, 0x62, 0x6f, 0x1c, 0x93, 0xb7, 0x26, 0x29, 0x4f, 0x79, - 0x0a, 0xbd, 0x1a, 0xa2, 0xa6, 0x3f, 0x7d, 0x16, 0xd0, 0x34, 0xc4, 0x5e, - 0x69, 0xf1, 0x58, 0xb6, 0x17, 0xc1, 0x96, 0xd6, 0xcb, 0xc7, 0xb4, 0xd2, - 0xd1, 0x04, 0x00, 0xfd, 0x89, 0x01, 0x60, 0x45, 0x30, 0x8a, 0xe0, 0x52, - 0x2f, 0x63, 0x98, 0x70, 0x4b, 0xc4, 0x54, 0x1e, 0x39, 0xe8, 0x4c, 0xe1, - 0xa4, 0x09, 0x7b, 0x7a, 0xe3, 0x76, 0x46, 0x3a, 0x5d, 0xb4, 0x67, 0x78, - 0x74, 0xcc, 0x93, 0x09, 0x95, 0xc6, 0x90, 0xbe, 0x9a, 0x77, 0xb4, 0x77, - 0xc3, 0xa2, 0xe1, 0x2d, 0xfd, 0x70, 0xea, 0x2f, 0x6b, 0x17, 0x39, 0xd8, - 0xfb, 0xe3, 0x32, 0xae, 0xac, 0xbf, 0xe1, 0x96, 0xb0, 0xa9, 0x3e, 0xb6, - 0x88, 0x95, 0xb5, 0x0f, 0x0f, 0xcd, 0xed, 0x47, 0xce, 0xb4, 0x99, 0x18, - 0x1d, 0xd3, 0xb0, 0xdd, 0x3f, 0x00, 0xd0, 0x98, 0x16, 0xf2, 0x5a, 0xd6, - 0x88, 0xa1, 0xcb, 0xad, 0x34, 0xe3, 0xc8, 0xb5, 0x44, 0x57, 0xbf, 0x5e, - 0xa6, 0xf7, 0xef, 0xd6, 0x95, 0x85, 0x69, 0x35, 0x6d, 0xbb, 0x4c, 0xed, - 0x2f, 0xbf, 0x20, 0xa7, 0x51, 0x89, 0x68, 0x6d, 0x75, 0x15, 0x35, 0x35, - 0x35, 0x94, 0xf9, 0x6a, 0x86, 0x9a, 0xbf, 0x69, 0xa2, 0xd6, 0xbf, 0xd9, - 0x35, 0xab, 0x51, 0x63, 0x75, 0x7d, 0x70, 0x81, 0xe6, 0xee, 0xe7, 0x68, - 0x73, 0x7b, 0x93, 0xcb, 0xd8, 0x2c, 0xff, 0xa3, 0x04, 0x70, 0xbd, 0xa0, - 0xe5, 0x98, 0xb6, 0x5d, 0xfe, 0x66, 0x99, 0xda, 0xcf, 0xc5, 0xf4, 0xf2, - 0xf1, 0xcb, 0x3d, 0x74, 0xf2, 0xcd, 0x96, 0x80, 0x95, 0xa9, 0x79, 0x9a, - 0x33, 0x33, 0x9d, 0xc5, 0x85, 0xf7, 0x2e, 0xe8, 0x8c, 0x1c, 0xfb, 0xfb, - 0x5d, 0x0e, 0x93, 0x45, 0x31, 0x37, 0xf7, 0x40, 0xb7, 0xab, 0xeb, 0x1f, - 0x5f, 0xdb, 0x98, 0x6a, 0xed, 0xdb, 0x35, 0xa2, 0xc7, 0x44, 0x74, 0x88, - 0xa8, 0xaa, 0xfa, 0x30, 0x25, 0x3f, 0xb9, 0xea, 0xc8, 0xb4, 0x36, 0x7b, - 0x24, 0xc7, 0x41, 0xda, 0x3e, 0x81, 0x27, 0xa2, 0x11, 0x83, 0xd5, 0x41, - 0x9a, 0x9a, 0xb8, 0xad, 0x79, 0xbc, 0x32, 0x58, 0x3a, 0x23, 0xba, 0xa5, - 0xfe, 0x99, 0xf2, 0x31, 0xae, 0x30, 0xd3, 0x0a, 0x60, 0x7a, 0x32, 0x6d, - 0x62, 0x8c, 0xa1, 0x42, 0x58, 0xcc, 0xa6, 0x69, 0x0b, 0xab, 0xd9, 0xe1, - 0xd1, 0x31, 0x47, 0x86, 0xc1, 0x2a, 0xf8, 0x0c, 0xce, 0x34, 0x21, 0x6b, - 0xd7, 0xa1, 0xbc, 0x97, 0xe6, 0x64, 0xe5, 0x85, 0x34, 0xa3, 0x44, 0xff, - 0x67, 0x73, 0xb3, 0x8e, 0xfd, 0xb1, 0x32, 0x24, 0xd3, 0xb4, 0xc6, 0x71, - 0x70, 0x62, 0x68, 0x59, 0xfb, 0xac, 0xed, 0x8b, 0xc6, 0xcb, 0x03, 0xab, - 0x5b, 0x3b, 0x38, 0xf6, 0xc7, 0xc3, 0x25, 0x33, 0xe0, 0xd8, 0x5b, 0x6b, - 0xd4, 0x5a, 0x5f, 0xc3, 0xe1, 0x5b, 0xa2, 0xf1, 0x07, 0x6b, 0xf4, 0xf6, - 0xad, 0x1a, 0xa2, 0x7c, 0xe9, 0x8c, 0x8b, 0xcb, 0xad, 0x5c, 0x86, 0x32, - 0x69, 0x31, 0xa5, 0xc1, 0x33, 0x9f, 0x71, 0xa6, 0x47, 0xcf, 0xe4, 0xc8, - 0xca, 0x98, 0xd6, 0xf2, 0xcd, 0x2d, 0x61, 0x38, 0xad, 0xce, 0x8d, 0xda, - 0xcb, 0xc6, 0x44, 0xe7, 0x73, 0x94, 0x8a, 0x69, 0xf9, 0x8c, 0x1a, 0xcf, - 0x49, 0xc3, 0x31, 0x6c, 0x3d, 0xd3, 0x06, 0xf6, 0x24, 0x58, 0x3c, 0x95, - 0xa3, 0xd4, 0x87, 0x62, 0x9a, 0xd1, 0xca, 0xb4, 0x32, 0xda, 0xdf, 0xf8, - 0xa4, 0x61, 0x7f, 0x77, 0x1c, 0x07, 0x4e, 0x39, 0x69, 0xfb, 0xbc, 0x98, - 0x9e, 0x2c, 0x4f, 0xca, 0xc2, 0x5a, 0x81, 0x50, 0x0e, 0x06, 0x4c, 0x4e, - 0xb9, 0x32, 0xad, 0x9e, 0x0a, 0x6f, 0xcc, 0x4a, 0x6d, 0x6f, 0x78, 0x1e, - 0xc2, 0xab, 0x62, 0xec, 0x15, 0x18, 0x12, 0x00, 0x7b, 0x53, 0xc6, 0xa2, - 0x08, 0x26, 0x06, 0x38, 0x0d, 0x60, 0xda, 0x45, 0xe3, 0xc1, 0xb2, 0x6a, - 0x76, 0xb8, 0xee, 0xa4, 0x99, 0xf5, 0x28, 0x83, 0x8b, 0x7d, 0xa6, 0xf8, - 0x27, 0x1c, 0x56, 0xcd, 0xab, 0x45, 0x26, 0xf3, 0xd4, 0x8c, 0x12, 0x4c, - 0xcb, 0xd3, 0xb4, 0xc6, 0x27, 0x50, 0xe8, 0x0d, 0xd5, 0xcc, 0xc0, 0x16, - 0xfb, 0xa4, 0x35, 0xad, 0xcb, 0xfd, 0x62, 0x4f, 0x36, 0xdd, 0xbe, 0xc2, - 0xfd, 0x62, 0x6b, 0x06, 0x3d, 0x7a, 0x10, 0xf5, 0x1b, 0x35, 0x60, 0x18, - 0xbc, 0x4d, 0xe8, 0x3c, 0xc9, 0x65, 0x58, 0x5e, 0x0a, 0x7c, 0x9e, 0x21, - 0xfa, 0x5f, 0xb3, 0xaf, 0x76, 0xbb, 0x2f, 0xb7, 0x52, 0x3d, 0x67, 0x46, - 0xee, 0x6e, 0xed, 0xe0, 0x6c, 0xd7, 0x59, 0x9a, 0x7b, 0xf0, 0x40, 0x58, - 0x2b, 0x29, 0xf5, 0xf5, 0xf4, 0xf1, 0xa5, 0x8f, 0xa9, 0xee, 0xc5, 0x3a, - 0xb2, 0xc6, 0x67, 0x83, 0x47, 0x8f, 0x50, 0x7e, 0x7b, 0xd7, 0x51, 0xd3, - 0xd9, 0x98, 0xa1, 0x17, 0x38, 0x7e, 0xcb, 0xac, 0xd1, 0x18, 0xe3, 0x58, - 0x19, 0x8e, 0x17, 0xff, 0x34, 0x62, 0xdd, 0xd1, 0x3a, 0x1a, 0xf8, 0xf4, - 0x2a, 0xd5, 0xbd, 0xa4, 0x69, 0xf8, 0xd4, 0x09, 0x15, 0xcc, 0x0e, 0x27, - 0xcd, 0x58, 0x77, 0xb4, 0x8e, 0x22, 0xe9, 0x9b, 0x65, 0x61, 0xda, 0x26, - 0xd5, 0x1c, 0x3f, 0x16, 0x19, 0x87, 0x9b, 0x2d, 0x11, 0xb0, 0x38, 0xab, - 0x93, 0x7d, 0x4c, 0x9b, 0x5b, 0xed, 0x30, 0xae, 0x09, 0x78, 0xe3, 0x51, - 0xf7, 0x62, 0x1d, 0x8d, 0x7f, 0x31, 0x42, 0xa9, 0x40, 0x20, 0x50, 0x12, - 0xd3, 0x46, 0x0a, 0x9b, 0x61, 0xfc, 0xa6, 0x9e, 0xcc, 0x82, 0xcf, 0x37, - 0x64, 0xf0, 0x66, 0x14, 0x40, 0xdb, 0x14, 0xc3, 0x89, 0x13, 0x62, 0x85, - 0xb3, 0xe7, 0x00, 0x05, 0x66, 0x66, 0x71, 0xd3, 0x8d, 0x42, 0x7c, 0x16, - 0xc5, 0x55, 0x2d, 0xd3, 0xbe, 0x26, 0x06, 0x35, 0x30, 0x03, 0x2b, 0xd7, - 0x9f, 0xe8, 0x77, 0xb5, 0x33, 0x3d, 0x99, 0x36, 0xe5, 0x2f, 0x96, 0x1b, - 0xb0, 0xdb, 0xc5, 0xf2, 0x1b, 0xec, 0x61, 0xf6, 0xb2, 0x72, 0xd9, 0x69, - 0x89, 0x37, 0x87, 0x86, 0xfe, 0xb2, 0xfe, 0x38, 0xfe, 0xdd, 0x60, 0x17, - 0x1b, 0x2f, 0x16, 0x45, 0xb0, 0x96, 0xf3, 0xb2, 0xcf, 0xf5, 0xcd, 0xa3, - 0x43, 0x7b, 0xd1, 0xf3, 0xda, 0x2b, 0x65, 0x4c, 0x9b, 0xc7, 0x99, 0x7c, - 0xed, 0x7b, 0xbd, 0x56, 0xdc, 0xb5, 0x55, 0x6a, 0xca, 0x2e, 0x6d, 0x80, - 0x92, 0x72, 0xed, 0x07, 0x13, 0x07, 0x7f, 0x73, 0x4b, 0x05, 0xf7, 0x0f, - 0xc9, 0x57, 0x94, 0xc0, 0x63, 0x37, 0x97, 0x74, 0xf2, 0xa1, 0x75, 0x5d, - 0xb5, 0x5a, 0xe1, 0xa4, 0x45, 0xf7, 0x1d, 0x40, 0x45, 0xf1, 0x30, 0x65, - 0xe5, 0x54, 0xf0, 0xf7, 0x03, 0xc5, 0x99, 0xb6, 0x4f, 0x6c, 0x37, 0x57, - 0xa9, 0x49, 0xd4, 0x1e, 0xb7, 0x8e, 0xd5, 0x72, 0x98, 0x5b, 0x49, 0x95, - 0xce, 0xd0, 0x3b, 0x85, 0x09, 0x91, 0x5d, 0xd9, 0x00, 0xc0, 0xa9, 0xcf, - 0x70, 0x3d, 0xbb, 0xb2, 0x51, 0xd6, 0x89, 0xb2, 0xc3, 0x99, 0x78, 0xac, - 0xbd, 0xf8, 0xf4, 0x02, 0xe2, 0x28, 0x9c, 0x92, 0x2e, 0x43, 0x7b, 0x03, - 0xf7, 0x96, 0x10, 0x45, 0x61, 0xd3, 0x12, 0x80, 0x85, 0x75, 0x73, 0x7f, - 0xd2, 0x0f, 0x57, 0xa1, 0x8e, 0x68, 0xd7, 0x35, 0x9c, 0x42, 0x1c, 0xfe, - 0xcf, 0xfc, 0x2d, 0xac, 0x6f, 0x20, 0x0e, 0x73, 0x7d, 0x11, 0x4b, 0x7d, - 0x62, 0x4c, 0x9b, 0x7c, 0x22, 0xfe, 0xaa, 0xa7, 0x52, 0x99, 0xd6, 0x6f, - 0x39, 0x21, 0xb4, 0xd6, 0x07, 0xbb, 0x16, 0xdc, 0x97, 0xf8, 0x32, 0x8a, - 0x7b, 0x43, 0x94, 0x41, 0x98, 0xb5, 0xf4, 0x16, 0x1c, 0xfb, 0x9b, 0x5d, - 0x41, 0x49, 0xfd, 0x1d, 0xb8, 0x67, 0xaf, 0x37, 0x28, 0xd8, 0x5f, 0x42, - 0xe1, 0x09, 0x27, 0xd1, 0xbf, 0x88, 0xcb, 0x6e, 0x40, 0xe3, 0xf8, 0x79, - 0x33, 0xed, 0x13, 0x62, 0x58, 0x6b, 0x2a, 0x85, 0x69, 0xfd, 0x96, 0x13, - 0x7a, 0x34, 0x59, 0xea, 0xb3, 0x1e, 0xc6, 0x8c, 0x8c, 0x66, 0xb9, 0x76, - 0xab, 0x23, 0x00, 0x8f, 0x29, 0x45, 0x18, 0x8f, 0xdb, 0x0f, 0xce, 0x78, - 0xc5, 0x51, 0x5a, 0x7f, 0xe3, 0x9c, 0x7a, 0x8d, 0x0e, 0xb4, 0xb3, 0x07, - 0xa8, 0x23, 0xfc, 0xf1, 0x16, 0x3a, 0xf3, 0x07, 0xa0, 0xf6, 0x5a, 0x9a, - 0x3b, 0x6e, 0xd6, 0xf2, 0x9e, 0x4c, 0xbb, 0x1f, 0x89, 0xed, 0x55, 0x48, - 0x2f, 0xba, 0xe7, 0x3b, 0x88, 0x4c, 0xeb, 0xc5, 0xa0, 0x5e, 0xfb, 0x91, - 0x15, 0xd6, 0x7f, 0xd9, 0xf6, 0x5d, 0xfa, 0x91, 0x5d, 0x71, 0x66, 0xda, - 0xf8, 0xb4, 0x8f, 0x76, 0x0c, 0x18, 0x9f, 0x96, 0x60, 0x70, 0xf0, 0x77, - 0x09, 0xba, 0xee, 0x19, 0x71, 0x29, 0x57, 0x9b, 0x74, 0x2e, 0x47, 0x6e, - 0x1e, 0x1e, 0xf2, 0xe7, 0x93, 0x42, 0xc9, 0x78, 0xa6, 0xac, 0x1f, 0xc0, - 0x86, 0xc3, 0xe2, 0x2e, 0x02, 0x67, 0xbb, 0xbc, 0xb4, 0xe9, 0x77, 0xc9, - 0xb4, 0x22, 0xdf, 0x85, 0x08, 0x26, 0xe4, 0xb5, 0x6e, 0x7c, 0x7a, 0x41, - 0x9a, 0x69, 0xb9, 0x8e, 0x22, 0x33, 0x51, 0x64, 0xea, 0x85, 0xfb, 0x97, - 0x86, 0x6a, 0x93, 0x45, 0xcd, 0xdd, 0x7d, 0x67, 0x01, 0xbc, 0xb5, 0x07, - 0x5d, 0x71, 0xff, 0x12, 0x91, 0xab, 0x26, 0xe1, 0x45, 0x09, 0x22, 0x37, - 0x0b, 0x33, 0xb0, 0xaf, 0x90, 0xff, 0x86, 0x0f, 0xa7, 0x75, 0x6a, 0xb7, - 0x20, 0xf6, 0xf5, 0xc4, 0xd1, 0x6a, 0x91, 0x51, 0x1c, 0x58, 0xa6, 0x75, - 0x1b, 0x4f, 0xa9, 0x37, 0x7b, 0x4e, 0x0e, 0xc4, 0xe9, 0x07, 0xb8, 0x4c, - 0x5b, 0xda, 0x77, 0x24, 0xe2, 0xd3, 0xce, 0x71, 0x74, 0x78, 0x68, 0x65, - 0x1e, 0x43, 0x8b, 0x60, 0x50, 0xa0, 0x7e, 0xdb, 0x0c, 0x66, 0x18, 0xb6, - 0xbc, 0x38, 0xe8, 0xce, 0x2c, 0x80, 0xae, 0xf1, 0x67, 0x9e, 0xb4, 0xd3, - 0xf2, 0x66, 0xa4, 0x45, 0x43, 0x47, 0x6e, 0xda, 0xcf, 0x96, 0xd9, 0x1c, - 0xc5, 0xea, 0x58, 0xdf, 0x29, 0xd3, 0xf2, 0x35, 0xad, 0x13, 0x46, 0x27, - 0xc4, 0xce, 0xa6, 0xf9, 0x61, 0xda, 0x27, 0xa1, 0x69, 0x79, 0x98, 0x5d, - 0xd9, 0x90, 0x3e, 0x6b, 0xa8, 0xa4, 0xc4, 0x34, 0xbf, 0xeb, 0x6a, 0x57, - 0x77, 0xb0, 0xe4, 0x94, 0xeb, 0x0c, 0xf1, 0xd2, 0xa6, 0x8e, 0x4e, 0xeb, - 0x52, 0x9f, 0xad, 0x7d, 0xc9, 0x55, 0xf1, 0x41, 0xd2, 0xb4, 0x0a, 0x80, - 0xb4, 0xf1, 0x8c, 0x19, 0x34, 0x47, 0x37, 0xee, 0x5f, 0x8e, 0x8c, 0x0a, - 0x9c, 0xa8, 0x70, 0xe9, 0xc7, 0x81, 0xd0, 0xb4, 0x0e, 0x28, 0x73, 0xaa, - 0xbb, 0x16, 0x10, 0x8e, 0xa3, 0x73, 0x99, 0xa9, 0xe8, 0xb0, 0x7c, 0xcd, - 0xbb, 0x2f, 0x4c, 0x6b, 0xd1, 0xd4, 0xd6, 0x7c, 0xc1, 0x3e, 0x6f, 0xc7, - 0x3b, 0x48, 0x9a, 0x96, 0xc7, 0x1c, 0x3b, 0x7b, 0x66, 0xcd, 0xee, 0xb5, - 0xca, 0xee, 0xbe, 0xf3, 0x14, 0x68, 0x5a, 0xc1, 0xf2, 0x4e, 0x58, 0x7b, - 0x4d, 0x7c, 0x83, 0x3f, 0x81, 0x88, 0x22, 0xa3, 0xf6, 0x19, 0x05, 0x00, - 0x24, 0x78, 0x66, 0xcc, 0x97, 0xd3, 0x0a, 0xd4, 0xeb, 0x37, 0xde, 0x79, - 0x50, 0x34, 0xad, 0xd0, 0x29, 0x62, 0x87, 0xfa, 0xb0, 0x65, 0x70, 0x74, - 0x00, 0x4e, 0xf1, 0x52, 0x13, 0xa3, 0x1d, 0x30, 0x4d, 0xcb, 0xec, 0x96, - 0x3d, 0x73, 0x28, 0xfa, 0x49, 0xac, 0xd2, 0x4f, 0x2e, 0x3c, 0x3f, 0x43, - 0x78, 0xb7, 0x89, 0x64, 0x93, 0xdf, 0x5d, 0x5e, 0xd9, 0xdf, 0x3c, 0xa2, - 0xa6, 0x9f, 0xfc, 0xc8, 0xf5, 0xe4, 0xc2, 0xd9, 0x2b, 0x00, 0xaf, 0xfc, - 0xea, 0xef, 0x77, 0xa9, 0xa6, 0x70, 0xaa, 0x53, 0xe6, 0xe4, 0x03, 0xc3, - 0x40, 0xef, 0x18, 0x8c, 0xf5, 0xc5, 0x5f, 0x5b, 0xa4, 0x8b, 0xaf, 0xff, - 0x4c, 0xaf, 0xaf, 0xf9, 0x46, 0x16, 0x77, 0xff, 0xdb, 0x44, 0xf4, 0x78, - 0x9c, 0xd4, 0x9f, 0xb6, 0x52, 0x7b, 0xbb, 0xd8, 0x99, 0xb6, 0x23, 0x9f, - 0x8c, 0xd3, 0xe6, 0x63, 0xf1, 0x71, 0x18, 0xea, 0x31, 0xef, 0x6f, 0x75, - 0xba, 0x7f, 0xc2, 0x67, 0xea, 0x38, 0xf8, 0x00, 0x40, 0xc2, 0xa1, 0x5e, - 0xb7, 0xfd, 0xcc, 0xbb, 0x7b, 0xc0, 0xe1, 0xe7, 0x88, 0xfc, 0xfa, 0x53, - 0xf0, 0xd0, 0x38, 0x3d, 0xfa, 0xc0, 0x7d, 0xbf, 0xb4, 0xee, 0xc1, 0xb5, - 0x25, 0x30, 0xdf, 0x93, 0x62, 0x5a, 0xa1, 0xdd, 0x5d, 0x44, 0xee, 0x4c, - 0x2b, 0x30, 0x93, 0xcb, 0xa5, 0x69, 0x45, 0xed, 0xf5, 0xc3, 0x4c, 0xc6, - 0xf2, 0x0b, 0x9c, 0xb3, 0x78, 0x52, 0xed, 0x3b, 0x60, 0x6d, 0xd2, 0xd9, - 0x1e, 0xae, 0x86, 0x5d, 0x01, 0xdc, 0xfc, 0x48, 0x19, 0xd4, 0xee, 0x7d, - 0x7c, 0x5a, 0x0b, 0x67, 0xf1, 0xea, 0x77, 0x7c, 0xe2, 0x18, 0xef, 0x2f, - 0xfb, 0xc7, 0xf0, 0xfc, 0xaa, 0x90, 0xf6, 0xf0, 0x8a, 0x32, 0x08, 0x3b, - 0xad, 0x64, 0x3b, 0x32, 0x5a, 0xca, 0xab, 0x9e, 0x28, 0x3c, 0xf6, 0x0e, - 0xb8, 0x4d, 0x08, 0x09, 0x4d, 0xab, 0x8e, 0xc8, 0x7f, 0x40, 0x43, 0xe4, - 0x8b, 0xea, 0x4e, 0xda, 0x9c, 0x17, 0x6f, 0xf7, 0x2b, 0x11, 0xa2, 0x13, - 0xce, 0x5f, 0x04, 0x72, 0x8c, 0x76, 0x40, 0x8b, 0xab, 0xba, 0x45, 0x05, - 0x78, 0x71, 0xe9, 0x81, 0x7b, 0x4b, 0xdc, 0x28, 0x43, 0x30, 0x01, 0x0c, - 0xdc, 0x5b, 0xb2, 0x95, 0x23, 0xf3, 0x80, 0xfb, 0xfb, 0x12, 0x8c, 0x74, - 0xf2, 0xf1, 0x3d, 0x04, 0x55, 0xc2, 0xc1, 0xfc, 0x3c, 0x31, 0xdc, 0x66, - 0x7c, 0xda, 0x70, 0xb2, 0xa0, 0xec, 0x9a, 0xd6, 0xd1, 0x61, 0xbc, 0xc7, - 0x47, 0x86, 0xa9, 0x55, 0x16, 0x47, 0xf7, 0x58, 0x9d, 0xb3, 0xdd, 0x71, - 0x3c, 0x06, 0x74, 0xd4, 0x9c, 0x2e, 0xf9, 0x45, 0x9f, 0x6c, 0xd8, 0x02, - 0x14, 0x97, 0xfe, 0x32, 0xfb, 0xcd, 0x9a, 0x96, 0xfc, 0x7f, 0x61, 0x86, - 0x69, 0x1c, 0x99, 0x24, 0xfb, 0x3d, 0x84, 0x60, 0x75, 0x2b, 0x2d, 0x76, - 0x88, 0x6b, 0x51, 0x37, 0x4d, 0xeb, 0x17, 0x99, 0x86, 0xf4, 0xd2, 0xb4, - 0xc6, 0xef, 0x47, 0x08, 0x6b, 0x5a, 0x07, 0x1c, 0x99, 0x5f, 0xc2, 0xaf, - 0x6f, 0xf1, 0x4f, 0x31, 0x9b, 0x34, 0xad, 0xe1, 0xfe, 0xd5, 0xfd, 0xe1, - 0x36, 0xfd, 0x7b, 0xfb, 0x24, 0xb7, 0x9c, 0xfa, 0xfc, 0x0c, 0x1d, 0x79, - 0xb7, 0x89, 0x94, 0xaf, 0x16, 0x89, 0x5e, 0x3b, 0x4e, 0xf4, 0xd5, 0x22, - 0x65, 0xfe, 0x73, 0x9c, 0x36, 0xb7, 0x33, 0x34, 0xe7, 0xb2, 0xc6, 0x50, - 0x9f, 0xcf, 0x50, 0xe6, 0xdd, 0x66, 0x5d, 0x6b, 0xee, 0xee, 0x01, 0x97, - 0x9e, 0x23, 0x72, 0xd2, 0xbc, 0xa2, 0xda, 0xd4, 0x8a, 0x33, 0x00, 0xae, - 0x0b, 0xd4, 0xe7, 0xb9, 0x9a, 0x15, 0xc1, 0x9e, 0xcc, 0x82, 0x14, 0xd1, - 0x8a, 0x46, 0x25, 0x18, 0x4a, 0xbd, 0x39, 0xa2, 0x42, 0x78, 0xa8, 0x4c, - 0x4c, 0x6b, 0x5d, 0x85, 0x5b, 0xe3, 0xb0, 0x6e, 0x4c, 0xdb, 0x7d, 0x47, - 0xce, 0x6e, 0x27, 0x8d, 0xe8, 0xc4, 0x40, 0xca, 0xe0, 0x94, 0x6b, 0xbd, - 0xc3, 0xf3, 0x85, 0x71, 0x2e, 0xd3, 0x93, 0x86, 0xb7, 0xd7, 0x80, 0xcf, - 0x8c, 0x02, 0x71, 0x67, 0x1e, 0xc2, 0x5d, 0xdb, 0x03, 0x80, 0x63, 0xc1, - 0x28, 0x24, 0x35, 0x67, 0x9f, 0x76, 0x02, 0x41, 0x24, 0xc9, 0x7e, 0x3d, - 0x51, 0xf4, 0x8d, 0x91, 0x15, 0xad, 0xfb, 0x5e, 0xfd, 0x22, 0x6f, 0x60, - 0xbd, 0xae, 0x97, 0xf5, 0x37, 0x24, 0xac, 0x76, 0x49, 0x94, 0x1b, 0x9e, - 0x5f, 0x32, 0xed, 0x4f, 0xe5, 0x69, 0x5f, 0x65, 0x70, 0x0a, 0xea, 0x88, - 0xf6, 0xa2, 0x43, 0xdf, 0x8f, 0xeb, 0xe2, 0x78, 0xc3, 0xf3, 0xda, 0x3e, - 0xda, 0x60, 0x9f, 0x56, 0x5e, 0xbd, 0x91, 0x45, 0x04, 0x65, 0xda, 0xc7, - 0x0b, 0x4d, 0xcb, 0xaa, 0x23, 0xc5, 0xdf, 0xf8, 0xa8, 0xbd, 0x96, 0xd6, - 0x7f, 0x9b, 0x83, 0xab, 0x6d, 0xdc, 0x34, 0x06, 0x0f, 0xb3, 0x4b, 0xee, - 0x0e, 0x2b, 0xfb, 0xfd, 0x03, 0xbf, 0x9a, 0xb0, 0x82, 0xdf, 0x6f, 0x74, - 0x65, 0x2a, 0x3f, 0xbf, 0xb5, 0xc0, 0x3b, 0xec, 0xa8, 0x8c, 0xc8, 0xbd, - 0x93, 0x17, 0x7a, 0xb5, 0x59, 0xc1, 0x67, 0x12, 0xbd, 0x33, 0xfa, 0x60, - 0xdc, 0x52, 0xd1, 0xaf, 0x24, 0xa8, 0xe0, 0xb3, 0x81, 0x62, 0x19, 0x51, - 0xd4, 0x2e, 0x7e, 0xe2, 0xab, 0xa2, 0x18, 0x4c, 0x68, 0x1a, 0xec, 0x20, - 0x0c, 0x4c, 0x05, 0x0f, 0x2e, 0x8a, 0x17, 0x28, 0x68, 0xcc, 0xfd, 0x62, - 0x58, 0x15, 0xe0, 0xbe, 0x01, 0xa9, 0x60, 0x05, 0x8d, 0x28, 0x5d, 0x20, - 0xbb, 0xb2, 0xe1, 0x7a, 0x26, 0x48, 0x16, 0x4b, 0x0a, 0x8f, 0x54, 0xf0, - 0x99, 0x44, 0xff, 0x15, 0x40, 0x8b, 0x43, 0xd6, 0xfa, 0x60, 0x56, 0x76, - 0xf6, 0xa7, 0xc2, 0xac, 0x15, 0xf4, 0x83, 0xe5, 0xa9, 0x08, 0xc0, 0xf0, - 0xbc, 0x16, 0xd7, 0x8b, 0x8c, 0x66, 0x6d, 0xe7, 0xe0, 0x23, 0x28, 0x6e, - 0x92, 0xa8, 0xfc, 0x06, 0x6e, 0x05, 0x4b, 0xc5, 0xff, 0x03, 0x2c, 0xfa, - 0x16, 0x4c, 0x4d, 0x8a, 0x1e, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, - 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 + 0x08, 0x06, 0x00, 0x00, 0x00, 0x63, 0x57, 0xfa, 0xde, 0x00, 0x00, 0x12, + 0xa2, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x5d, 0x7f, 0x6c, 0x13, + 0x57, 0xb6, 0xfe, 0x06, 0xa1, 0x6a, 0x82, 0x52, 0x34, 0x46, 0x14, 0x8d, + 0xa3, 0x6e, 0x95, 0x41, 0x4d, 0xc5, 0x84, 0xb7, 0x15, 0x36, 0x50, 0xd5, + 0x89, 0x16, 0xe1, 0x61, 0xb7, 0x5a, 0x0c, 0x41, 0x5b, 0xd3, 0x3e, 0x29, + 0x4e, 0xfa, 0x2a, 0x92, 0x40, 0xd5, 0x12, 0xe9, 0x89, 0xba, 0xe8, 0xe9, + 0x09, 0x68, 0x45, 0x09, 0xaa, 0xd4, 0xe0, 0xa2, 0x27, 0x25, 0x45, 0x5d, + 0x48, 0x10, 0x7a, 0x89, 0x23, 0xed, 0x82, 0xfb, 0x04, 0xc4, 0x3c, 0x81, + 0xb0, 0xab, 0xac, 0x6c, 0xaf, 0xa0, 0xb1, 0xab, 0x3e, 0xc1, 0xa0, 0x80, + 0xe2, 0x88, 0x5d, 0xd9, 0x16, 0x5d, 0xc5, 0x56, 0x1a, 0x25, 0x56, 0xfe, + 0xb9, 0xef, 0x8f, 0xc9, 0x4c, 0x3c, 0xf6, 0x8c, 0x7f, 0xc5, 0xa1, 0x74, + 0xeb, 0xef, 0x9f, 0xc4, 0xf3, 0xf3, 0xde, 0x3b, 0x67, 0xce, 0xf9, 0xce, + 0xb9, 0xe7, 0x9e, 0xa1, 0x2e, 0xa0, 0xb2, 0xb0, 0xcd, 0xcc, 0x91, 0x68, + 0x2a, 0xad, 0xda, 0x66, 0x62, 0x0d, 0x70, 0x3f, 0x47, 0x51, 0x15, 0xbe, + 0x55, 0x15, 0xbf, 0x50, 0x50, 0xcb, 0x11, 0x5a, 0xc7, 0x02, 0x21, 0xbe, + 0xa9, 0x38, 0xfc, 0x53, 0x71, 0xf8, 0xa2, 0x29, 0x44, 0x12, 0xc9, 0xbc, + 0xc7, 0x5b, 0xeb, 0x0d, 0x30, 0x1b, 0x19, 0x58, 0xeb, 0x8d, 0x48, 0xbc, + 0x52, 0x57, 0x15, 0xe2, 0x2a, 0xca, 0x42, 0x59, 0x42, 0x6b, 0x79, 0x32, + 0x4d, 0x5c, 0x7f, 0x8d, 0xc2, 0x23, 0x46, 0x91, 0xa5, 0x54, 0x8b, 0x06, + 0x43, 0x03, 0x76, 0x9e, 0x83, 0xf3, 0x75, 0x0e, 0xa1, 0x0d, 0xeb, 0xaa, + 0x02, 0x5c, 0x45, 0xd1, 0x28, 0x49, 0x68, 0x2d, 0x4f, 0xa6, 0x49, 0xf7, + 0x8d, 0x08, 0xfc, 0x53, 0xf9, 0x35, 0x6a, 0xa9, 0xb0, 0xd6, 0x1b, 0x30, + 0xfc, 0xa6, 0x05, 0xde, 0xb5, 0x6b, 0xaa, 0xc2, 0x5b, 0x45, 0x41, 0x14, + 0x25, 0xb4, 0x8e, 0x05, 0x42, 0x4e, 0x7c, 0x13, 0x86, 0x2b, 0x14, 0x5d, + 0xd1, 0xc6, 0x9c, 0xb2, 0xf2, 0x30, 0xee, 0xd8, 0x5c, 0x15, 0xdc, 0x2a, + 0xf2, 0xa2, 0xa0, 0xd0, 0x5a, 0x9e, 0x4c, 0x93, 0xf6, 0xaf, 0x23, 0x05, + 0xf9, 0x6a, 0xa5, 0x60, 0x62, 0x0d, 0x18, 0x6d, 0xad, 0x6a, 0xdd, 0x2a, + 0xf4, 0x91, 0x57, 0x68, 0x2d, 0x4f, 0xa6, 0x49, 0xf3, 0x45, 0x5f, 0xd9, + 0xbc, 0xb5, 0x5c, 0x30, 0x34, 0x10, 0x38, 0x20, 0x54, 0xb9, 0x6e, 0x15, + 0x9a, 0xd0, 0x15, 0xda, 0xb2, 0x05, 0x76, 0x3d, 0x0d, 0xac, 0xae, 0x51, + 0x7e, 0xda, 0x5e, 0x60, 0xd0, 0xb1, 0xc9, 0x08, 0x00, 0x08, 0x25, 0x92, + 0x70, 0xfd, 0x45, 0x2c, 0xea, 0x32, 0x95, 0x10, 0x5c, 0x5b, 0x2c, 0x46, + 0x3c, 0xd7, 0xbc, 0x08, 0x7f, 0x1b, 0xcc, 0xd9, 0xc7, 0x6f, 0xe2, 0xc1, + 0x37, 0xf0, 0x30, 0x6f, 0x33, 0xc3, 0x5b, 0xf7, 0xf3, 0x88, 0x64, 0xd8, + 0x62, 0x31, 0x12, 0xfe, 0x36, 0x0c, 0xe3, 0x8b, 0x46, 0x44, 0xcc, 0x5b, + 0x2b, 0xd2, 0x66, 0xc7, 0xcc, 0x1c, 0xe9, 0x3f, 0xdf, 0x0f, 0xf1, 0x81, + 0x08, 0xf1, 0x61, 0x14, 0x7c, 0x03, 0x07, 0x7b, 0x8b, 0x1d, 0x89, 0x7d, + 0x7b, 0x4b, 0xbe, 0xfe, 0x4a, 0xb4, 0x4f, 0x0b, 0xab, 0xb5, 0x36, 0x96, + 0x2c, 0xb0, 0x34, 0xd0, 0xfb, 0x1b, 0x33, 0xda, 0xfe, 0x85, 0x85, 0xf1, + 0xf9, 0x1a, 0xdd, 0xc3, 0x8c, 0x34, 0x5d, 0xb4, 0xd0, 0xa6, 0xd2, 0x40, + 0xf3, 0x45, 0x1f, 0x02, 0x4f, 0xa6, 0x49, 0xa9, 0x82, 0xeb, 0x98, 0x99, + 0x23, 0xa7, 0xcf, 0xba, 0xb0, 0x6b, 0xdf, 0x1e, 0xdd, 0x63, 0x42, 0x91, + 0x88, 0xf2, 0xbf, 0xfd, 0xe4, 0x29, 0x72, 0xec, 0x88, 0x13, 0xee, 0x67, + 0x9c, 0x92, 0xf4, 0x9f, 0x1f, 0x80, 0xe7, 0x9a, 0x07, 0x00, 0x30, 0x14, + 0x1e, 0x27, 0x95, 0x10, 0x8c, 0x6e, 0x67, 0xb7, 0x6a, 0x2c, 0x42, 0x91, + 0x08, 0x68, 0xc6, 0x00, 0xf3, 0x33, 0xd2, 0x3e, 0x2d, 0xe4, 0x68, 0x5a, + 0xc7, 0x02, 0x21, 0x75, 0x67, 0xaf, 0x94, 0xa4, 0x61, 0x2f, 0xbf, 0xdd, + 0x84, 0xfd, 0xbc, 0x31, 0xef, 0x31, 0x9d, 0x37, 0xc2, 0x18, 0xbc, 0x5b, + 0xba, 0x23, 0xc7, 0xd0, 0x40, 0xec, 0xc8, 0xfe, 0x92, 0x26, 0x27, 0x82, + 0x07, 0x3b, 0x48, 0xe6, 0x83, 0x60, 0x59, 0x23, 0xf6, 0xb7, 0xd8, 0xc1, + 0xf3, 0x3c, 0xe2, 0x7f, 0x8b, 0x22, 0x9e, 0x88, 0xc3, 0xeb, 0xf7, 0x23, + 0x91, 0x88, 0x2b, 0xc7, 0x0c, 0xfd, 0xf1, 0xc2, 0x8a, 0x6a, 0x87, 0x4a, + 0xc0, 0x16, 0x8b, 0x11, 0x9f, 0xdf, 0x07, 0xe3, 0xaf, 0x38, 0x44, 0x77, + 0x34, 0x2f, 0xbb, 0xad, 0xdc, 0x58, 0x80, 0x74, 0x7f, 0xd8, 0xad, 0xda, + 0x66, 0x31, 0x99, 0xd0, 0xe7, 0xea, 0x2b, 0xeb, 0x05, 0xae, 0x74, 0xfb, + 0xf4, 0x90, 0x23, 0xb4, 0xc3, 0x97, 0x6e, 0x93, 0x92, 0x42, 0x5a, 0xeb, + 0x69, 0x90, 0x0f, 0xf4, 0x35, 0x1a, 0x00, 0x98, 0xdd, 0x41, 0x44, 0x1e, + 0xc5, 0xf3, 0x1e, 0x93, 0x0f, 0xd6, 0x7a, 0x03, 0xda, 0xde, 0xdd, 0x55, + 0xd4, 0x20, 0x08, 0x13, 0x93, 0x64, 0x8f, 0x63, 0xff, 0xd2, 0xb9, 0x56, + 0x01, 0xe6, 0x5e, 0x97, 0xe6, 0xb9, 0xc2, 0xc4, 0x24, 0x09, 0xde, 0x0d, + 0x82, 0x79, 0x9e, 0xc9, 0x6b, 0x0e, 0x85, 0x89, 0x49, 0xc2, 0xb2, 0xec, + 0xb2, 0x34, 0xb1, 0x2d, 0x16, 0x23, 0xf9, 0x68, 0x88, 0x69, 0x19, 0x9a, + 0xc9, 0x16, 0x8b, 0x91, 0x78, 0x22, 0x5e, 0xd2, 0x4b, 0x27, 0x4c, 0x4c, + 0x92, 0xb6, 0x43, 0x9d, 0x48, 0xcd, 0xa6, 0x54, 0xdb, 0x3b, 0x5a, 0x1d, + 0x30, 0x38, 0x8f, 0xea, 0x8e, 0x97, 0xef, 0x95, 0x8d, 0x65, 0x09, 0x73, + 0x29, 0xed, 0xb3, 0xc5, 0x62, 0x04, 0x80, 0x2e, 0x6d, 0x53, 0x09, 0x6d, + 0xfa, 0xce, 0x24, 0xe9, 0xbe, 0x11, 0x2e, 0xa9, 0x41, 0x1d, 0xdb, 0x39, + 0x0c, 0xec, 0xd6, 0x37, 0x26, 0xe5, 0x6a, 0xd8, 0x6c, 0x0c, 0xbd, 0x69, + 0x46, 0xfa, 0xd5, 0xc2, 0x03, 0x66, 0x0a, 0x8f, 0x93, 0xf6, 0x43, 0x5d, + 0xca, 0xef, 0x7c, 0x42, 0xab, 0x07, 0x6e, 0x2c, 0x40, 0xfa, 0xcf, 0xf5, + 0x43, 0x7c, 0xa8, 0x4d, 0x65, 0xac, 0x56, 0x01, 0x1f, 0x1d, 0x3c, 0x0c, + 0xdf, 0x2b, 0x1b, 0xa9, 0x81, 0x9d, 0x56, 0x92, 0x9a, 0x4d, 0x81, 0xa9, + 0x65, 0xd0, 0xf3, 0x69, 0x4f, 0x8e, 0x86, 0xe1, 0xc6, 0x02, 0xe4, 0xf8, + 0xc7, 0xc7, 0x91, 0x9a, 0x4d, 0x81, 0x6f, 0xe0, 0x61, 0x1b, 0x71, 0x53, + 0x72, 0x3b, 0x07, 0x46, 0xdc, 0x88, 0xdc, 0x0d, 0xe7, 0x08, 0x0e, 0xdf, + 0xc0, 0xc3, 0xb2, 0xcd, 0x84, 0xb6, 0xd6, 0x36, 0xd5, 0x83, 0x4b, 0xba, + 0x7a, 0xc9, 0xe0, 0x88, 0x1b, 0x00, 0xd0, 0xf7, 0x45, 0x1f, 0xa2, 0x3b, + 0x9a, 0xa9, 0xf4, 0x57, 0x17, 0x48, 0xff, 0xf9, 0x7e, 0xe5, 0x5c, 0x96, + 0x35, 0x2a, 0x16, 0xe4, 0xd8, 0x11, 0x27, 0xd2, 0x6d, 0xed, 0x9a, 0x7d, + 0x97, 0xdb, 0xad, 0x85, 0xde, 0x8f, 0x4f, 0x21, 0xb1, 0x6f, 0x2f, 0xc5, + 0x5e, 0xbd, 0x4e, 0x5c, 0x7f, 0xfc, 0x52, 0x65, 0x91, 0x64, 0x30, 0xb5, + 0x0c, 0x04, 0xab, 0x80, 0xc3, 0x07, 0x3b, 0x95, 0x36, 0x16, 0xd3, 0x3e, + 0xa6, 0x96, 0x51, 0xfa, 0x2b, 0xb7, 0xcf, 0x31, 0x33, 0x47, 0x06, 0x47, + 0xdc, 0xb8, 0x72, 0xcd, 0x93, 0x73, 0x2f, 0xd9, 0x4a, 0x76, 0xb4, 0x3a, + 0x14, 0xa5, 0xa1, 0x70, 0x5a, 0x99, 0x16, 0x54, 0x12, 0xc1, 0x68, 0xb2, + 0x22, 0x02, 0x0b, 0x00, 0xdd, 0x37, 0xc2, 0x88, 0x2d, 0x10, 0x52, 0x88, + 0x26, 0x18, 0x59, 0x35, 0x4d, 0xf1, 0xfb, 0x7d, 0x10, 0xf7, 0xda, 0x88, + 0xcd, 0x6a, 0x85, 0x79, 0x7b, 0x13, 0x98, 0x5a, 0xba, 0xe0, 0x1b, 0x2f, + 0x9b, 0x4c, 0xa6, 0x96, 0xc1, 0xb1, 0x0f, 0x9d, 0x68, 0xdc, 0xd4, 0x88, + 0xe4, 0x6c, 0x12, 0x03, 0x23, 0x6e, 0xf8, 0xfd, 0x3e, 0xf8, 0xfd, 0x3e, + 0x44, 0xee, 0x86, 0x71, 0x7b, 0x66, 0x8e, 0x0c, 0x2c, 0xf2, 0xe6, 0xd4, + 0x6c, 0x0a, 0x3d, 0x9f, 0x9f, 0x46, 0x5b, 0xd6, 0xb5, 0x7a, 0x3e, 0x3f, + 0xad, 0x3c, 0xa4, 0xe4, 0x8f, 0x8b, 0x7f, 0x5d, 0xbd, 0xaa, 0x17, 0x8b, + 0x65, 0x8d, 0xe0, 0x8c, 0x2c, 0x00, 0x40, 0x7c, 0x18, 0x85, 0xf8, 0x50, + 0x84, 0xf8, 0x50, 0xc4, 0xe0, 0x88, 0x1b, 0xbd, 0x57, 0xaf, 0x13, 0xd9, + 0x0a, 0xc8, 0x02, 0x01, 0x00, 0xa2, 0x28, 0x82, 0x06, 0x72, 0x9c, 0xcc, + 0xcc, 0x87, 0x2e, 0x3e, 0x8a, 0x82, 0xd3, 0xe9, 0xe3, 0xe1, 0x83, 0x9d, + 0x38, 0x7d, 0xd6, 0x95, 0xb3, 0xdd, 0x6a, 0x15, 0x20, 0xec, 0x14, 0xe0, + 0x06, 0x70, 0xf4, 0xd3, 0x13, 0x4a, 0xfb, 0x9c, 0x87, 0x3e, 0x80, 0xf1, + 0x45, 0x69, 0x6c, 0xe5, 0x71, 0xf0, 0x5c, 0xf3, 0x20, 0x78, 0x37, 0xa4, + 0xf4, 0xb9, 0x98, 0xf6, 0x65, 0xbe, 0x28, 0xe2, 0xa3, 0x28, 0x3a, 0x27, + 0x26, 0xc9, 0xae, 0x7d, 0x7b, 0x94, 0xed, 0x2c, 0x6b, 0x44, 0xd3, 0x76, + 0x0b, 0x98, 0x5a, 0x1a, 0xa1, 0x6f, 0x23, 0x10, 0x1f, 0x8a, 0xe8, 0x3f, + 0xdf, 0x8f, 0xe1, 0x91, 0x61, 0x0c, 0x2f, 0x6a, 0x7a, 0x45, 0x68, 0xbb, + 0xff, 0x37, 0x5c, 0x56, 0x68, 0x6b, 0xf0, 0x6f, 0x29, 0x0c, 0xe8, 0xec, + 0x1b, 0x78, 0x50, 0xb9, 0xc9, 0x88, 0x54, 0x1a, 0x70, 0xfd, 0xf5, 0x3e, + 0xf2, 0x33, 0x67, 0xc9, 0xa4, 0xf4, 0x5e, 0xbd, 0x4e, 0xe4, 0x01, 0x07, + 0xa4, 0x07, 0x39, 0x38, 0xe2, 0x5e, 0x1a, 0xd4, 0x6d, 0x26, 0xc2, 0xd4, + 0x32, 0xe0, 0x1b, 0x38, 0x08, 0x3b, 0x05, 0x08, 0x56, 0x41, 0xa5, 0xd1, + 0x46, 0xdd, 0x57, 0x90, 0x9c, 0x4d, 0x22, 0x62, 0xde, 0x4a, 0x25, 0xbe, + 0xf1, 0x23, 0xb1, 0xb8, 0xdd, 0x0c, 0xc0, 0xbf, 0xcd, 0x44, 0x00, 0x69, + 0xf0, 0xc5, 0x47, 0x22, 0xda, 0x5a, 0xdb, 0x20, 0x6b, 0x92, 0x44, 0x22, + 0xae, 0xa2, 0x01, 0xc2, 0xc4, 0x24, 0x71, 0x65, 0x50, 0x15, 0xe7, 0xa1, + 0x0f, 0x80, 0x43, 0x1f, 0x10, 0xd7, 0x62, 0xdb, 0x98, 0x5a, 0x06, 0x87, + 0x0f, 0x76, 0xaa, 0xb4, 0x61, 0x13, 0x00, 0x7a, 0x78, 0x88, 0xc8, 0x02, + 0x75, 0xf4, 0xd3, 0x13, 0xe8, 0x1b, 0x0b, 0x90, 0x52, 0x38, 0x22, 0xdf, + 0xc0, 0xa3, 0xa3, 0xd5, 0x81, 0xc4, 0xbe, 0xbd, 0x14, 0x3d, 0x3c, 0x44, + 0x82, 0xdf, 0x45, 0x90, 0x4e, 0x49, 0x94, 0xcf, 0xbc, 0xad, 0x49, 0xd1, + 0x5a, 0xc7, 0x32, 0xee, 0x03, 0x00, 0xf6, 0x16, 0x3b, 0xb8, 0x4f, 0x4e, + 0x50, 0xee, 0x5e, 0x57, 0xee, 0x38, 0x5c, 0xf7, 0x2a, 0xe3, 0x70, 0x3c, + 0x16, 0x23, 0x7e, 0xbf, 0x4f, 0xe9, 0x73, 0xa9, 0xd4, 0x46, 0x6e, 0x9f, + 0xb0, 0x53, 0x40, 0xb7, 0xb3, 0x5b, 0x11, 0x58, 0xc5, 0x2a, 0x5e, 0xf7, + 0x02, 0x00, 0x6c, 0x00, 0xf8, 0x93, 0xa7, 0x88, 0xe7, 0x9a, 0x47, 0x52, + 0x0a, 0xbd, 0x3d, 0x68, 0x02, 0xb0, 0x0a, 0x90, 0xb4, 0xac, 0x47, 0x2c, + 0x53, 0xc0, 0x12, 0x49, 0xdc, 0xff, 0x61, 0x5e, 0x73, 0x97, 0x73, 0x1b, + 0x5f, 0xde, 0x35, 0x75, 0xe0, 0x0a, 0x89, 0x70, 0x2c, 0x10, 0x52, 0xb0, + 0x49, 0xfb, 0xf6, 0x52, 0xb7, 0xaf, 0x8e, 0xa2, 0xa3, 0xd5, 0x01, 0xbe, + 0x41, 0xbb, 0x0d, 0xa9, 0xd9, 0x14, 0x42, 0x91, 0x08, 0xe4, 0x28, 0x43, + 0xfa, 0xab, 0x0b, 0xca, 0x75, 0x7d, 0xaf, 0x6c, 0xa4, 0x32, 0x1f, 0x82, + 0x29, 0x3c, 0x4e, 0xe8, 0xe1, 0x21, 0x32, 0xbc, 0xd7, 0x96, 0x73, 0xef, + 0x8e, 0x56, 0x07, 0x98, 0x5a, 0x46, 0xf9, 0xed, 0xb9, 0xe6, 0x55, 0xfe, + 0x1f, 0x18, 0x19, 0x56, 0xfe, 0x67, 0x59, 0x23, 0x12, 0xfb, 0xf6, 0x52, + 0xae, 0x3f, 0x7e, 0xa9, 0x6c, 0xcb, 0x16, 0x58, 0x19, 0xe9, 0xb6, 0x76, + 0xca, 0xde, 0x62, 0x57, 0x7e, 0x5f, 0x59, 0xf4, 0xc8, 0x8b, 0xc1, 0xe1, + 0x83, 0x87, 0x61, 0x1b, 0x71, 0x53, 0xb2, 0x76, 0x3e, 0x7d, 0xd6, 0x05, + 0xbf, 0xdf, 0x87, 0x50, 0x24, 0x82, 0x50, 0x24, 0x82, 0xfe, 0xf3, 0xfd, + 0x8a, 0x87, 0xcf, 0xf3, 0xea, 0xb1, 0xb1, 0xb7, 0xd8, 0x54, 0xbf, 0xf5, + 0xc6, 0xa1, 0x2d, 0xc3, 0x4a, 0x94, 0x8a, 0xcc, 0xf6, 0x25, 0x12, 0x09, + 0x55, 0xe4, 0x22, 0xf1, 0xf7, 0x38, 0xb8, 0xb1, 0x00, 0x31, 0x85, 0xc7, + 0x89, 0x29, 0x3c, 0x4e, 0xb8, 0xb1, 0x00, 0x11, 0x1f, 0x2c, 0x51, 0xb4, + 0x50, 0x24, 0x02, 0x5b, 0x2c, 0x46, 0x56, 0x03, 0xc0, 0xe0, 0x77, 0xe5, + 0x27, 0xbe, 0x00, 0x40, 0xfb, 0xad, 0x08, 0xc2, 0x8e, 0xa6, 0x9c, 0xed, + 0x8d, 0x2f, 0xd4, 0xa0, 0xf7, 0x77, 0x66, 0x1c, 0xbd, 0x55, 0x1a, 0x4f, + 0xd6, 0x43, 0x2a, 0x0d, 0x78, 0x8a, 0xd4, 0xde, 0xde, 0xba, 0x3a, 0xca, + 0x00, 0xe9, 0x6d, 0xb5, 0x61, 0xc9, 0x19, 0x48, 0xcd, 0xa6, 0x21, 0x8a, + 0x22, 0x7c, 0xdf, 0xf8, 0x54, 0x9c, 0xb5, 0xff, 0x7c, 0x3f, 0x46, 0x17, + 0xcd, 0x0f, 0x7b, 0xf5, 0x3a, 0xf1, 0xfe, 0xc5, 0xbf, 0xc4, 0x37, 0xf3, + 0x3c, 0x24, 0xf7, 0xda, 0x35, 0x94, 0x3d, 0x83, 0xcb, 0x0d, 0x8f, 0x0c, + 0xe3, 0xf6, 0xcc, 0x1c, 0x49, 0x24, 0x12, 0x68, 0x3b, 0xd4, 0xa9, 0x1c, + 0xe7, 0x3c, 0xf4, 0x01, 0x12, 0xd7, 0xbd, 0x2a, 0xf3, 0x6d, 0x6f, 0xb1, + 0xc3, 0x9d, 0x73, 0x45, 0x09, 0x82, 0x55, 0x50, 0x84, 0x2b, 0x72, 0x37, + 0x5c, 0x74, 0x08, 0x8a, 0x7e, 0xaf, 0x4b, 0xf5, 0x12, 0xd8, 0x5b, 0xec, + 0x88, 0xff, 0x7d, 0x69, 0xcc, 0x68, 0xc6, 0x20, 0x59, 0x96, 0x22, 0xae, + 0x55, 0xca, 0x38, 0x14, 0x8b, 0xcc, 0xf6, 0x25, 0x67, 0xd5, 0x0e, 0xbf, + 0xf8, 0x50, 0x44, 0x76, 0x34, 0x23, 0x13, 0x4c, 0x2d, 0x03, 0xa6, 0x96, + 0x91, 0x38, 0xed, 0x40, 0x64, 0x79, 0x66, 0x3c, 0x5f, 0x64, 0xe0, 0x23, + 0x8b, 0xc4, 0xaa, 0x2a, 0x25, 0xb8, 0xae, 0x50, 0x14, 0x87, 0xcb, 0x38, + 0x2f, 0xd3, 0xfc, 0xd3, 0x90, 0x04, 0xb9, 0x23, 0x8b, 0x46, 0x78, 0xfd, + 0x3e, 0xc4, 0x4f, 0x9e, 0x52, 0x99, 0xef, 0x63, 0x47, 0x9c, 0x10, 0xac, + 0x02, 0x98, 0x5a, 0x06, 0x9e, 0x6b, 0x1e, 0x4d, 0x1e, 0xd8, 0xd6, 0xda, + 0xa6, 0x50, 0x8f, 0xd4, 0x6c, 0x0a, 0x5b, 0x85, 0x66, 0xd5, 0x7e, 0x59, + 0xcb, 0x66, 0x9f, 0x27, 0x3e, 0xd2, 0x8f, 0x59, 0xcf, 0xa7, 0x96, 0x1e, + 0x28, 0x5d, 0xab, 0x1f, 0xfb, 0x2e, 0x04, 0xee, 0x93, 0x13, 0x54, 0x36, + 0xaf, 0xf5, 0xf6, 0xe6, 0xf6, 0x21, 0x1b, 0xc1, 0x83, 0x1d, 0x24, 0x94, + 0xc1, 0x69, 0x7b, 0x3f, 0x74, 0xc2, 0xbc, 0xcd, 0x9c, 0x77, 0x1c, 0x96, + 0x0b, 0x7b, 0x8b, 0x1d, 0xf6, 0x16, 0x5b, 0x5e, 0x9f, 0xc3, 0xbd, 0x76, + 0x0d, 0x56, 0xd9, 0x66, 0xe6, 0x48, 0x25, 0xf2, 0x0a, 0xae, 0x88, 0xf9, + 0x05, 0xf7, 0xf2, 0xdb, 0x4d, 0x92, 0xb4, 0x2c, 0x13, 0x91, 0x44, 0x12, + 0xb6, 0x99, 0xb9, 0xbc, 0x14, 0x41, 0x98, 0x98, 0x24, 0xa6, 0xf0, 0x38, + 0x71, 0x14, 0x38, 0x4e, 0x76, 0x2c, 0x64, 0xcc, 0xcf, 0x26, 0x15, 0xed, + 0xc6, 0xd4, 0x32, 0xb8, 0x7d, 0x75, 0x14, 0xe9, 0xb6, 0x76, 0xca, 0x5b, + 0x57, 0x47, 0xb9, 0xd7, 0xae, 0xa1, 0xd2, 0x6d, 0xed, 0x14, 0xcb, 0xe6, + 0xb2, 0x6a, 0x6f, 0x5d, 0x9d, 0xca, 0x9c, 0x67, 0x63, 0x7f, 0xc6, 0x3e, + 0x8b, 0xc9, 0xa4, 0xfc, 0x3f, 0x30, 0xa2, 0xa7, 0x67, 0xd5, 0x4e, 0x4d, + 0xd3, 0x76, 0x4b, 0xbe, 0x6e, 0x54, 0x1c, 0xdc, 0x58, 0x40, 0x89, 0x73, + 0x33, 0xb5, 0x0c, 0x46, 0xdd, 0x97, 0x91, 0xd8, 0xb7, 0x57, 0x19, 0x87, + 0x7c, 0x7d, 0x2d, 0x05, 0xfc, 0xcb, 0x6a, 0x7a, 0x22, 0x58, 0x05, 0x5d, + 0x81, 0x95, 0xc3, 0x60, 0x00, 0xb0, 0xca, 0xf3, 0x20, 0xa1, 0x75, 0x4c, + 0x69, 0x58, 0x4f, 0x17, 0x9c, 0x5c, 0xd8, 0xcf, 0x1b, 0x11, 0x7b, 0xdf, + 0x86, 0x8e, 0xed, 0x7a, 0xfe, 0x6c, 0xf1, 0xf0, 0x4d, 0xe9, 0xb7, 0x59, + 0x8e, 0xd3, 0xb6, 0x1f, 0xea, 0xc2, 0x56, 0xa1, 0x19, 0xe1, 0xa3, 0x4e, + 0x42, 0x0f, 0x0f, 0x29, 0x42, 0x2c, 0x4c, 0x4c, 0x12, 0x6e, 0x2c, 0x40, + 0xa2, 0x27, 0x4f, 0xe5, 0x78, 0xf0, 0xe6, 0xed, 0x4b, 0x14, 0x47, 0x76, + 0xb4, 0x64, 0xd8, 0x62, 0x31, 0x12, 0x3e, 0xea, 0x24, 0x5a, 0xe1, 0x1f, + 0x40, 0xe2, 0xa7, 0x5a, 0x60, 0x6a, 0x19, 0x74, 0xb4, 0x3a, 0x96, 0x8e, + 0x7b, 0x7f, 0xc9, 0x4e, 0xf8, 0xfd, 0x3e, 0x84, 0x8f, 0x3a, 0x89, 0x30, + 0x31, 0xa9, 0x3c, 0x10, 0x6e, 0x2c, 0x40, 0xbc, 0xad, 0x0e, 0x22, 0x53, + 0x17, 0xd9, 0x59, 0x7b, 0x9a, 0xc8, 0xd4, 0xf2, 0x00, 0x72, 0xc6, 0xa1, + 0xfd, 0xbd, 0xe5, 0xd3, 0x04, 0x40, 0xa2, 0x56, 0x99, 0x63, 0x73, 0xfc, + 0xe3, 0xe3, 0x60, 0xaf, 0x5e, 0x57, 0xc6, 0xc2, 0x31, 0x33, 0x47, 0xd2, + 0x5f, 0x5d, 0x20, 0x03, 0x3b, 0xad, 0x64, 0xd7, 0xbe, 0x3d, 0x90, 0xc7, + 0x69, 0x75, 0x78, 0xb9, 0x5a, 0x76, 0x3d, 0x8d, 0xd8, 0x3b, 0x42, 0x51, + 0x87, 0x1a, 0x9f, 0xaf, 0xc1, 0xc0, 0x6e, 0x33, 0x3a, 0x37, 0x71, 0x68, + 0xbe, 0x15, 0x01, 0xca, 0xbc, 0x77, 0x24, 0x91, 0x84, 0x9e, 0x8b, 0xc7, + 0xb2, 0x2c, 0xf8, 0x06, 0x5e, 0xe1, 0xab, 0x72, 0x88, 0x2a, 0x1f, 0xf8, + 0x06, 0x1e, 0x67, 0x4e, 0xf6, 0xe4, 0x9c, 0xdb, 0x7e, 0xa8, 0x0b, 0xec, + 0x5e, 0x1b, 0x49, 0xcf, 0xce, 0xc3, 0x95, 0x67, 0x4a, 0x18, 0x58, 0xd4, + 0xb6, 0x8b, 0x9e, 0x6e, 0x26, 0xda, 0x5a, 0xdb, 0x54, 0x93, 0x12, 0x11, + 0xf3, 0x56, 0xaa, 0x6f, 0x2c, 0x40, 0x7a, 0x3e, 0x3f, 0x8d, 0x44, 0x22, + 0xbe, 0xd4, 0xbe, 0xc5, 0xa8, 0x04, 0x32, 0x38, 0x1d, 0xcb, 0x1a, 0x31, + 0xf0, 0x45, 0x9f, 0x42, 0x6d, 0x32, 0x63, 0x9c, 0xda, 0x7d, 0x37, 0x02, + 0x88, 0xe8, 0xee, 0xcf, 0xe9, 0x77, 0x96, 0xa6, 0x33, 0xd4, 0x1a, 0x00, + 0x00, 0xc2, 0x4e, 0x01, 0xcc, 0x17, 0x2e, 0xa4, 0x66, 0x53, 0x48, 0xcd, + 0xa6, 0x8a, 0x1e, 0x87, 0xcc, 0x18, 0xb1, 0x16, 0x32, 0x1d, 0x56, 0xe5, + 0x9e, 0xce, 0xa3, 0x54, 0xc7, 0xa2, 0x4f, 0x90, 0x9a, 0x4d, 0x49, 0x61, + 0xb6, 0xc5, 0xb1, 0x70, 0x65, 0xd0, 0x2c, 0xbe, 0x81, 0x07, 0xcb, 0x4a, + 0x61, 0x41, 0xca, 0x5a, 0xea, 0x0c, 0x58, 0x06, 0x6c, 0xbf, 0xe6, 0x70, + 0xe1, 0xb7, 0x7c, 0xde, 0x7c, 0x83, 0x7c, 0xf8, 0xc8, 0x7f, 0xbf, 0xe8, + 0x5c, 0x84, 0x4c, 0x14, 0x33, 0x43, 0xc6, 0x8d, 0x05, 0x48, 0xf8, 0x6e, + 0x10, 0xe2, 0x03, 0x51, 0xe5, 0xa1, 0xca, 0xe0, 0x1b, 0x78, 0xf0, 0x9b, + 0x78, 0x58, 0x4c, 0x26, 0x15, 0xdf, 0x74, 0xcc, 0xcc, 0x11, 0xcf, 0x35, + 0x0f, 0x7c, 0xdf, 0x2c, 0x09, 0x3a, 0xcd, 0x18, 0xd0, 0xb4, 0xc5, 0x04, + 0x9e, 0xe7, 0x11, 0xba, 0x2b, 0x9b, 0x4d, 0x5a, 0x72, 0xa4, 0x32, 0x04, + 0x52, 0xce, 0x79, 0x90, 0x1d, 0x1f, 0x7e, 0x13, 0xaf, 0x3b, 0xbb, 0x04, + 0x48, 0x8e, 0x4e, 0x28, 0x12, 0x51, 0x39, 0x4a, 0xf2, 0x79, 0xe6, 0xed, + 0x4d, 0x39, 0x13, 0x15, 0xec, 0xd5, 0xeb, 0xc4, 0x73, 0xcd, 0x03, 0x9a, + 0x31, 0xe0, 0xcc, 0x89, 0x53, 0x70, 0xaf, 0x5d, 0x43, 0x09, 0x13, 0x93, + 0xa4, 0xa7, 0xb7, 0x07, 0x00, 0xd0, 0xf6, 0x4e, 0x67, 0xc9, 0xd3, 0xa7, + 0xdc, 0x58, 0x80, 0x88, 0xa2, 0x08, 0xa6, 0x96, 0x56, 0x45, 0x32, 0xe4, + 0x80, 0x7f, 0x66, 0x9c, 0xd5, 0xf8, 0x22, 0x07, 0xfe, 0x65, 0x2e, 0x67, + 0x1c, 0xe4, 0xf3, 0x32, 0xdb, 0x77, 0xfc, 0x88, 0x13, 0xde, 0xba, 0x3a, + 0x55, 0xfb, 0xf2, 0x25, 0xe2, 0xe8, 0x25, 0x37, 0x19, 0x5f, 0xe4, 0x20, + 0x58, 0x05, 0x55, 0xbf, 0x28, 0x9c, 0xbc, 0x5c, 0x30, 0x84, 0x94, 0x83, + 0x5a, 0x1a, 0x97, 0x77, 0x9b, 0x0b, 0x52, 0x82, 0x62, 0x10, 0x8c, 0x26, + 0xd1, 0x7c, 0x23, 0x08, 0xfc, 0xa3, 0xf8, 0xf0, 0x05, 0x43, 0x03, 0x67, + 0xfe, 0xe3, 0xad, 0x67, 0x3a, 0x4f, 0xa0, 0x8a, 0x95, 0xc3, 0xaa, 0x52, + 0x4f, 0xb0, 0xfd, 0x9a, 0x43, 0xec, 0xa0, 0x50, 0x11, 0x81, 0x05, 0x80, + 0x26, 0xce, 0x80, 0xd8, 0x3b, 0x02, 0x4c, 0x2f, 0x17, 0x7f, 0xbd, 0x42, + 0xe1, 0x39, 0xc7, 0x02, 0x21, 0xe9, 0x3b, 0x93, 0x44, 0xbc, 0x39, 0x4e, + 0x86, 0x2f, 0xdd, 0x26, 0xe2, 0xcd, 0x71, 0x92, 0xbe, 0x33, 0x49, 0x8a, + 0x89, 0xf1, 0x56, 0xf1, 0xec, 0x43, 0x33, 0x35, 0x51, 0x13, 0x34, 0x70, + 0xb9, 0xa5, 0x70, 0x36, 0x57, 0x39, 0x30, 0x3e, 0x5f, 0x83, 0xb0, 0xa3, + 0xa9, 0x6c, 0xba, 0x90, 0x8d, 0xc6, 0x73, 0xa3, 0x98, 0xca, 0x90, 0x6c, + 0x89, 0xfe, 0x44, 0x31, 0x10, 0x29, 0x2f, 0x5c, 0x96, 0x09, 0xc7, 0x02, + 0x51, 0xa2, 0x2d, 0x0c, 0x0d, 0xcd, 0x7c, 0xdf, 0xec, 0x65, 0xf4, 0xe2, + 0x4b, 0x95, 0x4b, 0x66, 0x77, 0xe8, 0x4c, 0x65, 0xf3, 0x8f, 0xa7, 0x89, + 0x6f, 0x6a, 0x89, 0x4f, 0x9a, 0x58, 0x43, 0x45, 0x56, 0x3c, 0xa7, 0xef, + 0x4c, 0x92, 0x70, 0x22, 0x89, 0x68, 0x32, 0x05, 0x81, 0x63, 0x61, 0xdf, + 0x64, 0x54, 0xf5, 0x99, 0x9d, 0x88, 0x11, 0x57, 0x48, 0xfd, 0xcc, 0x04, + 0x8e, 0x45, 0xe7, 0x16, 0xae, 0xac, 0xd5, 0x27, 0x96, 0x27, 0xd3, 0xc4, + 0xf3, 0x20, 0x0e, 0x5f, 0x74, 0xc9, 0xd9, 0x36, 0xd4, 0xd0, 0xe8, 0xfb, + 0xbd, 0x49, 0xb9, 0x5e, 0x71, 0x42, 0xbb, 0x9e, 0xc6, 0xbd, 0xb7, 0x05, + 0x34, 0xbe, 0x50, 0x7e, 0xbc, 0xb0, 0x18, 0x9c, 0xb1, 0x36, 0x82, 0xa5, + 0x6b, 0x96, 0x1d, 0xd3, 0x9d, 0xd2, 0x51, 0xc5, 0x95, 0x08, 0xed, 0x35, + 0x5f, 0xf4, 0xa9, 0xae, 0x73, 0x2f, 0x2b, 0xdf, 0x97, 0x9d, 0x88, 0x91, + 0xba, 0xb3, 0x59, 0xa1, 0xfb, 0x93, 0x97, 0x89, 0xd3, 0xc2, 0x81, 0x7f, + 0xa3, 0xfc, 0xd4, 0x47, 0xdb, 0xcc, 0x1c, 0x69, 0x3c, 0xe7, 0x45, 0xd7, + 0x67, 0x57, 0x60, 0xfa, 0xea, 0x36, 0x39, 0xfc, 0xde, 0x12, 0xa7, 0xb7, + 0xcd, 0xcc, 0xe5, 0xde, 0x13, 0x40, 0xe0, 0xf1, 0x34, 0x59, 0xce, 0x0b, + 0x93, 0x9d, 0x40, 0xe5, 0x9f, 0x4a, 0xc2, 0x15, 0x12, 0x71, 0x26, 0xe3, + 0x98, 0xc1, 0xef, 0xa2, 0x39, 0x0b, 0x5d, 0xfd, 0x53, 0x49, 0x9c, 0xf0, + 0x8b, 0x70, 0xde, 0x1c, 0x27, 0xc5, 0xf6, 0xd9, 0xb1, 0x40, 0x48, 0xfb, + 0xff, 0x04, 0xd1, 0x75, 0x4e, 0xdb, 0x69, 0x76, 0xbe, 0xbe, 0xe4, 0x34, + 0x16, 0xa6, 0x07, 0x34, 0x10, 0xd8, 0xdd, 0xb4, 0xe2, 0x02, 0x2b, 0xe3, + 0x23, 0x0b, 0x87, 0xde, 0xdf, 0x95, 0x93, 0x82, 0xfc, 0x74, 0x90, 0x2d, + 0xf8, 0x9e, 0x07, 0x6a, 0x6f, 0x79, 0xf0, 0x3b, 0xed, 0x89, 0x1a, 0x57, + 0x28, 0x8a, 0xe1, 0x4b, 0xb7, 0xcb, 0xa6, 0x28, 0x9e, 0x07, 0x09, 0x85, + 0x16, 0x65, 0xb7, 0x21, 0xbb, 0x38, 0x8a, 0x8c, 0x4c, 0xcd, 0x5b, 0x0e, + 0x92, 0xe9, 0xdc, 0xe9, 0xf9, 0x54, 0x5a, 0xd2, 0x86, 0xf2, 0xef, 0xa1, + 0x3f, 0x34, 0xc1, 0x5a, 0x6f, 0xd0, 0x3c, 0xdf, 0x15, 0x8a, 0xa2, 0xff, + 0xab, 0xdb, 0xa4, 0x50, 0x5c, 0xdd, 0xf2, 0x64, 0x9a, 0x34, 0x9e, 0x1b, + 0x85, 0x47, 0x27, 0xd6, 0xef, 0xb4, 0x70, 0x2a, 0x6b, 0x55, 0x50, 0x68, + 0x2f, 0xb7, 0x34, 0xa1, 0x89, 0xd3, 0x6e, 0x54, 0xb9, 0xb8, 0xff, 0xc3, + 0x3c, 0xcc, 0xee, 0xa0, 0xee, 0x84, 0xc4, 0xb3, 0x2e, 0xb8, 0xf9, 0x90, + 0x9c, 0xd7, 0x27, 0xdc, 0xfe, 0xa9, 0x24, 0x9a, 0x2f, 0xfa, 0x54, 0x0f, + 0xbd, 0xe8, 0xeb, 0x6a, 0x08, 0xd0, 0x4f, 0x85, 0xcc, 0x77, 0xc4, 0xfd, + 0x1c, 0x45, 0xb5, 0xbd, 0xbb, 0x8b, 0xea, 0xdb, 0x6d, 0x06, 0xa3, 0x31, + 0x79, 0x14, 0x49, 0x24, 0xd1, 0x78, 0xce, 0x0b, 0xfa, 0xfb, 0x49, 0xcd, + 0x3e, 0xa7, 0xef, 0x4c, 0x92, 0xe6, 0x8b, 0x3e, 0x4d, 0xeb, 0x58, 0xcf, + 0xd0, 0x08, 0x1c, 0x10, 0x72, 0x2c, 0xd4, 0xea, 0x7a, 0x86, 0xd6, 0x35, + 0xa7, 0xa6, 0x97, 0x8d, 0x2b, 0xc2, 0x61, 0x1b, 0x5f, 0xa8, 0x41, 0xe4, + 0x51, 0x1c, 0x6f, 0x3d, 0x8a, 0x03, 0xeb, 0x69, 0xf4, 0x9a, 0x1a, 0x73, + 0x96, 0xea, 0x7c, 0x64, 0xe1, 0xe0, 0x4f, 0x24, 0xe1, 0xfd, 0xbf, 0x5c, + 0xcd, 0x65, 0x62, 0x2b, 0xfb, 0x12, 0x3d, 0x4d, 0x44, 0x12, 0x92, 0xe0, + 0x8e, 0x2e, 0xd3, 0x74, 0x3f, 0x6b, 0xa0, 0x5f, 0xdb, 0x48, 0x05, 0x74, + 0x56, 0x6e, 0xa7, 0xd2, 0x40, 0xfb, 0xd7, 0x61, 0xd4, 0xff, 0xd7, 0x75, + 0xd2, 0x69, 0xe2, 0x16, 0xb7, 0xa5, 0x71, 0x45, 0x8c, 0x63, 0x4a, 0x27, + 0x7f, 0xdb, 0x69, 0xe1, 0x70, 0x6a, 0xa7, 0x59, 0x73, 0xc5, 0xca, 0x6a, + 0x8e, 0xa9, 0xd1, 0x16, 0x5a, 0x1a, 0x18, 0x6d, 0x31, 0xe5, 0x6c, 0x1e, + 0x88, 0x44, 0xe1, 0x99, 0x4a, 0xc2, 0xfb, 0x43, 0x0a, 0x48, 0x25, 0x81, + 0x34, 0x80, 0x7a, 0x23, 0xc8, 0xbf, 0xe5, 0x26, 0xcc, 0xe4, 0xc5, 0x7a, + 0x5a, 0x0a, 0x73, 0xfd, 0x23, 0x8d, 0xa3, 0xb7, 0xc2, 0x38, 0x7a, 0x4b, + 0xba, 0xce, 0xbd, 0xdd, 0x26, 0x85, 0x8a, 0x5c, 0xf8, 0x2d, 0x8f, 0xba, + 0x68, 0x1c, 0x98, 0x55, 0xb7, 0x8f, 0x33, 0x54, 0x60, 0x3e, 0xf8, 0x27, + 0x84, 0xbc, 0xfe, 0x6d, 0xe8, 0xfb, 0x49, 0x52, 0x4c, 0x62, 0xfb, 0xcf, + 0x05, 0xa1, 0x0d, 0xeb, 0xa8, 0xc3, 0x00, 0xe2, 0x63, 0xf7, 0xc8, 0x09, + 0x7f, 0xae, 0x43, 0x3d, 0x95, 0x4a, 0x43, 0x6b, 0x7b, 0x26, 0x18, 0x1a, + 0x18, 0x6d, 0x15, 0x20, 0xbe, 0xb4, 0x8e, 0xd2, 0x9b, 0xe4, 0x5e, 0x25, + 0x70, 0xac, 0xe6, 0x0e, 0x5b, 0x03, 0xa7, 0xd6, 0x7c, 0xfe, 0xfb, 0xa0, + 0xbe, 0x18, 0x45, 0xd7, 0xb5, 0xb0, 0xa4, 0xfd, 0x12, 0x8b, 0x02, 0x0b, + 0xc0, 0xf9, 0xab, 0xdc, 0x99, 0x8e, 0x82, 0x58, 0xad, 0xc1, 0x91, 0xa7, + 0xe2, 0xd8, 0x7c, 0xd1, 0xab, 0xd0, 0x06, 0xe3, 0xf3, 0x35, 0xb0, 0x71, + 0xb9, 0x9a, 0xde, 0xc4, 0x96, 0x71, 0xbf, 0x67, 0x10, 0xed, 0x5f, 0x87, + 0x11, 0xbc, 0x3a, 0xfe, 0x4f, 0x17, 0x86, 0x33, 0xee, 0xd8, 0x4c, 0x05, + 0x0e, 0x08, 0x9a, 0x74, 0x21, 0x1f, 0x4c, 0xac, 0x01, 0xb1, 0x23, 0xfb, + 0x0b, 0x46, 0x5b, 0x56, 0xe9, 0x99, 0xda, 0x63, 0x5b, 0x24, 0x35, 0x1e, + 0xff, 0x71, 0x1e, 0xd4, 0x97, 0xa3, 0x52, 0x28, 0x6a, 0x56, 0x9b, 0x46, + 0x58, 0x2a, 0x69, 0xae, 0xd3, 0xc0, 0x5b, 0x7f, 0x0e, 0xe2, 0xcc, 0x62, + 0x35, 0x1b, 0xbb, 0x06, 0xc9, 0x17, 0xea, 0x2b, 0x4f, 0x59, 0x56, 0x0a, + 0x26, 0xd6, 0x80, 0xeb, 0xad, 0x4d, 0x98, 0xfb, 0xcf, 0xfd, 0xb8, 0xf0, + 0xc9, 0x5b, 0xd4, 0xbd, 0xf7, 0x05, 0x9c, 0xb2, 0xf2, 0xca, 0x03, 0x1d, + 0x8c, 0x44, 0xe1, 0xfd, 0x53, 0xe0, 0x9f, 0x2e, 0x86, 0x2c, 0xbe, 0xb4, + 0xae, 0x24, 0xc1, 0x95, 0xf9, 0x6b, 0x31, 0x0b, 0x58, 0x57, 0xe9, 0xc5, + 0xf2, 0x9a, 0x38, 0x03, 0xe2, 0x3f, 0xce, 0xa3, 0xee, 0xbf, 0x7d, 0x05, + 0x67, 0xab, 0x56, 0x82, 0xf7, 0x1e, 0xbd, 0x15, 0x86, 0xd9, 0x1d, 0x44, + 0x57, 0xd6, 0x72, 0x1d, 0x86, 0xae, 0x6c, 0xdc, 0x73, 0xa5, 0x11, 0x38, + 0x20, 0x20, 0xf1, 0x4a, 0x1d, 0x25, 0x3f, 0x8c, 0xd0, 0x86, 0x75, 0x94, + 0x71, 0xc7, 0x66, 0x2a, 0x76, 0x64, 0x3f, 0xec, 0x8b, 0xe3, 0xe6, 0x11, + 0xe3, 0x05, 0x1d, 0xb4, 0x54, 0xfa, 0x29, 0x57, 0x4c, 0xa9, 0x10, 0x56, + 0xa2, 0xd0, 0xcb, 0x2a, 0x00, 0xca, 0xe0, 0x65, 0xa2, 0xf3, 0x46, 0x18, + 0x75, 0xe7, 0x0b, 0x0b, 0x2c, 0xd6, 0xaf, 0x1c, 0xbf, 0x8c, 0x3c, 0x8a, + 0xe7, 0x24, 0xd5, 0xd8, 0xf9, 0xe5, 0x67, 0x89, 0x3d, 0x2d, 0x58, 0xeb, + 0xf5, 0xeb, 0xf2, 0xba, 0x9f, 0xa3, 0x28, 0xdb, 0xbf, 0x36, 0x53, 0xce, + 0xc5, 0x7c, 0xe3, 0x48, 0x22, 0x89, 0xcd, 0xe7, 0x7c, 0x10, 0x6f, 0x8e, + 0xab, 0x42, 0x44, 0xf2, 0xec, 0xde, 0x4a, 0xd7, 0x51, 0xab, 0x34, 0xf8, + 0xc7, 0x52, 0xed, 0x8c, 0x62, 0x31, 0x95, 0x4a, 0x17, 0x1d, 0x59, 0x59, + 0x05, 0xa8, 0x03, 0xb7, 0x32, 0x06, 0xef, 0x46, 0x75, 0xe9, 0x80, 0x0a, + 0xb5, 0x4f, 0xd7, 0x93, 0xef, 0xdc, 0xb2, 0x3c, 0xa1, 0x2d, 0x14, 0x33, + 0x7c, 0xda, 0xe0, 0xdf, 0xd8, 0x4a, 0x0d, 0xbd, 0xb9, 0x14, 0x2e, 0x72, + 0x85, 0xa2, 0xa8, 0x3b, 0xeb, 0x45, 0xd7, 0xc9, 0xcb, 0xa4, 0xeb, 0xe4, + 0x65, 0xb2, 0xe6, 0xb3, 0x2b, 0x28, 0x75, 0x85, 0x74, 0xa5, 0x50, 0x8e, + 0x76, 0x77, 0x2c, 0x10, 0x22, 0xde, 0x1c, 0x2f, 0xab, 0x3a, 0x91, 0x1c, + 0x59, 0x49, 0xdf, 0xd1, 0x0e, 0x8f, 0xc9, 0x58, 0x05, 0x48, 0xe6, 0xb6, + 0xbe, 0x54, 0xd6, 0xbc, 0x88, 0x8e, 0x17, 0x9e, 0x9e, 0x27, 0x6f, 0xad, + 0x37, 0x2c, 0x9b, 0x1a, 0x54, 0x24, 0x7f, 0xb8, 0xc2, 0x48, 0xbf, 0xba, + 0xb1, 0x2c, 0xc7, 0x45, 0x86, 0xde, 0x79, 0x99, 0x53, 0xa1, 0xe5, 0x40, + 0x2f, 0x8e, 0xae, 0xf7, 0x0c, 0xf8, 0xc7, 0xd2, 0x24, 0x81, 0x9e, 0x55, + 0x30, 0xb1, 0x06, 0x9c, 0xb2, 0xf2, 0x38, 0x65, 0xe5, 0xe1, 0xb4, 0x70, + 0xd0, 0x92, 0xb9, 0x54, 0x5a, 0x5a, 0x79, 0x3d, 0x7c, 0x49, 0x7f, 0x52, + 0x42, 0x99, 0x5c, 0xe8, 0xb1, 0x36, 0x16, 0xd1, 0x8d, 0x5c, 0x24, 0xca, + 0xe5, 0x2c, 0x65, 0x4c, 0xa9, 0xf6, 0x58, 0x73, 0x43, 0x70, 0xa5, 0xa2, + 0xfb, 0x86, 0xe4, 0xb1, 0xf3, 0x8f, 0xa7, 0x49, 0x39, 0x41, 0xfe, 0x95, + 0x42, 0x68, 0xc3, 0x3a, 0x2a, 0x76, 0x64, 0x7f, 0x59, 0x31, 0xe8, 0xd0, + 0x06, 0x6d, 0xa5, 0xe3, 0x9f, 0x4a, 0x22, 0x3e, 0x76, 0xaf, 0xac, 0x3e, + 0x06, 0xaf, 0x8e, 0x13, 0xad, 0x50, 0x68, 0x87, 0x29, 0xd7, 0xd2, 0x65, + 0x6a, 0x57, 0xad, 0x73, 0x4c, 0xac, 0x01, 0x81, 0x03, 0x02, 0x0e, 0xbf, + 0xb7, 0x8b, 0x32, 0xee, 0xd8, 0x4c, 0x19, 0x77, 0x6c, 0xa6, 0xf8, 0x37, + 0xb6, 0x52, 0xc7, 0xff, 0x7d, 0xaf, 0xee, 0xa4, 0x84, 0x7f, 0x4a, 0x9a, + 0x94, 0xd0, 0xd2, 0xba, 0x4a, 0xee, 0x41, 0xfa, 0xd5, 0x8d, 0x65, 0xe5, + 0xd6, 0x7a, 0x7f, 0xd0, 0x4f, 0x4a, 0xd6, 0x43, 0x30, 0x5a, 0xba, 0xc0, + 0x56, 0x42, 0xcb, 0xca, 0x18, 0x8c, 0x44, 0x31, 0x28, 0xaf, 0x8b, 0x2b, + 0x90, 0x9a, 0x69, 0xad, 0x37, 0xc0, 0x69, 0xe1, 0x9f, 0x4a, 0xb9, 0x7d, + 0xf7, 0x73, 0x14, 0x75, 0x18, 0x92, 0xc0, 0x0c, 0x96, 0xb8, 0x6e, 0x6f, + 0xb4, 0xb5, 0x09, 0x5a, 0x26, 0xf9, 0x84, 0x5f, 0x84, 0xf5, 0xd2, 0x6d, + 0xd2, 0x69, 0xe2, 0x60, 0xdf, 0xc4, 0xe5, 0xf5, 0xce, 0x1d, 0x0b, 0x84, + 0x78, 0x1e, 0x44, 0x71, 0xdc, 0x7f, 0x1f, 0x53, 0x1a, 0xf7, 0x37, 0xb1, + 0x06, 0xf4, 0xfd, 0xde, 0xac, 0x5a, 0x8c, 0x29, 0x6b, 0x57, 0xbd, 0x09, + 0x2a, 0x39, 0xe7, 0x42, 0x2f, 0x3a, 0x4b, 0xbf, 0xb6, 0x91, 0xba, 0x3f, + 0x33, 0x47, 0xf6, 0x8c, 0x84, 0x34, 0x27, 0x25, 0xba, 0x6f, 0x84, 0x61, + 0xbd, 0x74, 0x9b, 0x64, 0x16, 0xdd, 0x56, 0x25, 0xcc, 0xf4, 0xed, 0x36, + 0x61, 0xb3, 0x4e, 0xc2, 0x82, 0x2e, 0x12, 0x49, 0xc4, 0x7f, 0x9c, 0x2f, + 0x29, 0x11, 0xbc, 0xd4, 0x7a, 0x08, 0x0c, 0x0d, 0xa9, 0x52, 0xf8, 0xbb, + 0xa5, 0x35, 0xad, 0x12, 0xf0, 0x4f, 0x25, 0xe1, 0x9f, 0x0a, 0xa2, 0xd8, + 0x8a, 0xe9, 0x9c, 0x81, 0x59, 0x76, 0xa5, 0xf4, 0xa6, 0x7d, 0x5b, 0x29, + 0xe1, 0xfb, 0x49, 0xd2, 0xfe, 0x75, 0xf1, 0x5c, 0x36, 0xb4, 0x61, 0x1d, + 0x15, 0x78, 0x32, 0x4d, 0xf6, 0x8c, 0x04, 0x73, 0x04, 0x48, 0xea, 0x43, + 0x12, 0x80, 0x24, 0x00, 0x86, 0x1a, 0x5a, 0x15, 0xeb, 0xf6, 0x45, 0xa5, + 0xbc, 0x86, 0xae, 0xcf, 0xf4, 0x8b, 0xb5, 0x58, 0xeb, 0x0d, 0x18, 0x6d, + 0x5d, 0x0a, 0x49, 0xc9, 0x85, 0xb6, 0xbb, 0x74, 0x9c, 0x2d, 0x86, 0x06, + 0xfa, 0x76, 0x17, 0x57, 0x15, 0xc8, 0xbb, 0x76, 0x4d, 0xde, 0x97, 0x55, + 0xd6, 0xba, 0x7d, 0x8b, 0x93, 0x31, 0x39, 0xb5, 0xbc, 0xca, 0x29, 0x8d, + 0xe4, 0xfc, 0x0d, 0x8f, 0x33, 0x25, 0xd0, 0x0b, 0xea, 0x8b, 0xd1, 0xe2, + 0x9c, 0xbc, 0x45, 0x14, 0x5b, 0x12, 0x49, 0x86, 0x78, 0x73, 0xbc, 0xa2, + 0xde, 0x76, 0x66, 0x85, 0xf2, 0xec, 0x5a, 0x67, 0x81, 0x03, 0x82, 0xca, + 0x02, 0xb0, 0x13, 0x31, 0xb2, 0x77, 0x44, 0xca, 0xbe, 0x5f, 0x6e, 0x66, + 0x17, 0xff, 0x58, 0xfa, 0x5c, 0x40, 0xb6, 0x06, 0x32, 0xb1, 0x06, 0x64, + 0x66, 0x79, 0x65, 0x83, 0xfe, 0x5e, 0x8a, 0x36, 0x54, 0x22, 0xab, 0xcd, + 0xce, 0x1b, 0xe1, 0x7c, 0x9d, 0xcf, 0xb1, 0x72, 0xde, 0x3f, 0x05, 0x88, + 0x5e, 0x82, 0x8b, 0xb5, 0xde, 0x80, 0xbe, 0xdd, 0xa6, 0xb2, 0xca, 0xb4, + 0xb2, 0x13, 0x31, 0xd2, 0xfe, 0x75, 0x50, 0xd7, 0x89, 0x1b, 0x7a, 0xd3, + 0xac, 0x5d, 0x9f, 0xb6, 0x64, 0xf3, 0x44, 0x03, 0x81, 0xb7, 0x85, 0xa2, + 0x12, 0x6b, 0x4a, 0xad, 0xed, 0xd5, 0x61, 0xe2, 0xd0, 0xb4, 0xaf, 0xf4, + 0x07, 0x9f, 0x99, 0xf7, 0xba, 0x1c, 0x68, 0x51, 0x12, 0xfe, 0xb1, 0xc4, + 0x85, 0x39, 0x86, 0xd6, 0xcc, 0x19, 0x75, 0x2c, 0x10, 0x92, 0x4a, 0xcf, + 0x57, 0xac, 0x9a, 0x79, 0xb9, 0xf9, 0xb9, 0xb6, 0x99, 0x39, 0xe2, 0x9b, + 0x4a, 0x20, 0x9a, 0x9a, 0x57, 0x9c, 0xb2, 0x68, 0x6a, 0x5e, 0x97, 0x77, + 0x32, 0xb4, 0x94, 0xbb, 0x6a, 0x62, 0x19, 0x98, 0x58, 0x03, 0x84, 0x7a, + 0xa3, 0x2e, 0x9d, 0xa0, 0xbf, 0x9f, 0x24, 0x03, 0x11, 0xe9, 0xc5, 0x48, + 0xa5, 0x25, 0x41, 0x35, 0xd4, 0xd0, 0xe8, 0xd8, 0xc2, 0x2d, 0x9b, 0x4a, + 0x39, 0x16, 0x08, 0x19, 0xfc, 0x2e, 0x8a, 0x2b, 0x8b, 0x05, 0x64, 0xfc, + 0x53, 0x49, 0xd4, 0x33, 0x34, 0x38, 0xa6, 0x06, 0xc3, 0x6f, 0x5a, 0xb4, + 0x85, 0xd6, 0xb1, 0x40, 0x48, 0x76, 0xde, 0x68, 0x41, 0xac, 0xa7, 0x11, + 0xd8, 0x9d, 0x3f, 0x23, 0xec, 0x4c, 0x28, 0x5a, 0x52, 0xae, 0x6c, 0x29, + 0xd5, 0x12, 0xab, 0xf8, 0xe5, 0x40, 0xb7, 0x12, 0x78, 0x59, 0x82, 0x0b, + 0x69, 0x39, 0xce, 0xb1, 0x2d, 0x9c, 0x4a, 0x78, 0x83, 0xd1, 0x24, 0xba, + 0x43, 0x62, 0x49, 0xe5, 0x3e, 0xed, 0xbc, 0x11, 0x43, 0x7f, 0x68, 0xaa, + 0x7e, 0x34, 0xaf, 0x8a, 0x1c, 0x14, 0xfc, 0x50, 0x48, 0x39, 0x9e, 0xec, + 0x72, 0x51, 0x2e, 0x25, 0xa8, 0xe2, 0x97, 0x81, 0xa2, 0x3e, 0xc9, 0x94, + 0xbe, 0x33, 0x49, 0x8e, 0xfb, 0xcb, 0xab, 0xaa, 0x58, 0x0a, 0x4a, 0xf1, + 0x38, 0xab, 0xf8, 0xe5, 0xa2, 0xa8, 0xd5, 0xb8, 0xf4, 0x6b, 0x1b, 0xa9, + 0xfb, 0xef, 0xdb, 0x74, 0x97, 0x55, 0x54, 0x02, 0xd6, 0x7a, 0x03, 0xee, + 0xbf, 0x6f, 0xab, 0x0a, 0x6c, 0x15, 0x05, 0x51, 0xf2, 0x67, 0x46, 0xf9, + 0xc7, 0xd3, 0xe4, 0xb8, 0xbf, 0x72, 0x5f, 0x6d, 0xb4, 0xd6, 0x1b, 0xd0, + 0x63, 0x35, 0xfd, 0xac, 0x32, 0xb7, 0xaa, 0xf8, 0x69, 0x51, 0xf6, 0x07, + 0x9d, 0x2d, 0x4f, 0xa6, 0x17, 0xc3, 0x12, 0x71, 0xdd, 0xd9, 0x10, 0x3d, + 0xd4, 0x33, 0x52, 0xed, 0x2f, 0xe7, 0xeb, 0x7c, 0xf5, 0x23, 0x77, 0x55, + 0x94, 0x8c, 0x65, 0x7d, 0x85, 0x5c, 0x46, 0x66, 0x3c, 0x30, 0x92, 0x48, + 0xe5, 0x2c, 0xee, 0x93, 0x63, 0x7f, 0x1c, 0x53, 0x03, 0xa1, 0x9e, 0xad, + 0x0a, 0x6a, 0x15, 0xcb, 0xc2, 0xff, 0x03, 0x99, 0x27, 0x97, 0x03, 0x19, + 0x20, 0xba, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, + 0x42, 0x60, 0x82 }; @@ -1000,13 +1114,13 @@ ConfigurationPanel::ConfigurationPanel( QWidget* parent, const char* name, bool CodecsPage_4 = new QWidget( Tab_About, "CodecsPage_4" ); + textLabel1 = new QLabel( CodecsPage_4, "textLabel1" ); + textLabel1->setGeometry( QRect( 85, 126, 291, 131 ) ); + pixmapLabel2 = new QLabel( CodecsPage_4, "pixmapLabel2" ); pixmapLabel2->setGeometry( QRect( 130, 50, 173, 48 ) ); pixmapLabel2->setPixmap( image1 ); pixmapLabel2->setScaledContents( TRUE ); - - textLabel1 = new QLabel( CodecsPage_4, "textLabel1" ); - textLabel1->setGeometry( QRect( 85, 126, 291, 131 ) ); Tab_About->insertTab( CodecsPage_4, QString("") ); layout17->addWidget( Tab_About ); diff --git a/src/configurationpanelui.h b/src/configurationpanelui.h index 42d617251d26c1a7453160f614b7a8de4b810252..5e9040333263510d8df36d411a8a7386310da935 100644 --- a/src/configurationpanelui.h +++ b/src/configurationpanelui.h @@ -1,7 +1,7 @@ /**************************************************************************** ** Form interface generated from reading ui file 'configurationpanel.ui' ** -** Created: Tue Apr 12 09:35:08 2005 +** Created: Wed Apr 20 14:48:03 2005 ** by: The User Interface Compiler ($Id$) ** ** WARNING! All changes made in this file will be lost! @@ -120,8 +120,8 @@ public: QLabel* textLabel2_2; QLabel* pixmapLabel1; QWidget* CodecsPage_4; - QLabel* pixmapLabel2; QLabel* textLabel1; + QLabel* pixmapLabel2; public slots: virtual void saveSlot(); diff --git a/src/manager.cpp b/src/manager.cpp index 523bf052e03ec5b0ff539c680f1b52206943f622..b27f3f73eac4f69d75aa3014ad3e0b00894353d4 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -59,6 +59,7 @@ Manager::Manager (QString *Dc = NULL) { exist = createSettingsPath(); + selectAudioDriver(); phonegui = new QtGUIMainWindow (0, 0 , Qt::WDestructiveClose | Qt::WStyle_Customize | @@ -70,7 +71,6 @@ Manager::Manager (QString *Dc = NULL) { error = new Error(this); sip_init(); - selectAudioDriver(); // Init variables b_ringing = false; @@ -142,7 +142,7 @@ Manager::createSettingsPath (void) { void Manager::selectAudioDriver (void) { if (Config::getb("Audio", "Drivers.driverOSS")) { - useAlsa = false; + useAlsa = false; this->audiodriver = new AudioDriversOSS (AudioDrivers::ReadWrite, error); } if (Config::getb("Audio", "Drivers.driverALSA")) { @@ -198,14 +198,27 @@ Manager::ringing (void) { // When IP-phone user receives a call void Manager::ring (bool var) { + if (sip->getNumberPendingCalls() != 1 and tonezone == true + and var == false) { + // If more than one line is ringing + for (int i = 0; i < NUMBER_OF_LINES; i++) { + if (i != getCurrentLineNumber() and phLines[i]->getbRinging()) { + tonezone = false; + tone->playRingtone ((gui()->getRingFile()).ascii()); + } + } + } + if (this->b_ringing != var) { this->b_ringing = var; } tonezone = ringing(); - if (sip->getNumberPendingCalls() == 1) + if (sip->getNumberPendingCalls() == 1) { + // If just one line is ringing tone->playRingtone ((gui()->getRingFile()).ascii()); + } } // When IP-phone user makes call @@ -220,11 +233,15 @@ Manager::ringTone (bool var) { void Manager::congestion (bool var) { - if (this->b_congestion != var) { - this->b_congestion = var; + if (error->getError() == 0) { + if (this->b_congestion != var) { + this->b_congestion = var; + } + tonezone = var; + tone->toneHandle(ZT_TONE_CONGESTION); + } else { + error->errorName(DEVICE_NOT_OPEN, NULL); } - tonezone = var; - tone->toneHandle(ZT_TONE_CONGESTION); } void @@ -267,16 +284,16 @@ Manager::actionHandle (int lineNumber, int action) { sip->manageActions (lineNumber, REFUSE_CALL); this->ring(false); phLines[lineNumber]->setbRinging(false); - gui()->lcd->setStatus("Call refused"); + gui()->lcd->setStatus(REFUSED_CALL_STATUS); break; case ANSWER_CALL: // TODO // Stopper l'etat "ringing" du main (audio, signalisation, gui) - sip->manageActions (lineNumber, ANSWER_CALL); this->ring(false); + sip->manageActions (lineNumber, ANSWER_CALL); phLines[lineNumber]->setbRinging(false); - gui()->lcd->setStatus("Connected"); + gui()->lcd->setStatus(CONNECTED_STATUS); gui()->startCallTimer(lineNumber); break; @@ -292,7 +309,6 @@ Manager::actionHandle (int lineNumber, int action) { case ONHOLD_CALL: if (sip->call[lineNumber] != NULL) { - //gui()->lcd->setStatus(ONHOLD_STATUS); sip->manageActions (lineNumber, ONHOLD_CALL); } break; @@ -341,6 +357,19 @@ Manager::isNotUsedLine (int line) { return false; } +bool +Manager::isUsedLine (int line) { + for (int k = 0; k < NUMBER_OF_LINES; k++) { + if (line == k) { + if (sip->call[line] != NULL) { + return true; + } + } + } + return false; +} + + int Manager::findLineNumberNotUsed (void) { return sip->findLineNumberNotUsed(); @@ -363,26 +392,33 @@ Manager::handleRemoteEvent (int code, char * reason, int remotetype, int line) { switch (remotetype) { // Registration success - case EXOSIP_REGISTRATION_SUCCESS: - gui()->lcd->setStatus("Logged in"); + case EXOSIP_REGISTRATION_SUCCESS: + gui()->lcd->setStatus(LOGGED_IN_STATUS); break; // Registration failure case EXOSIP_REGISTRATION_FAILURE: - gui()->lcd->setStatus("Registration failure"); + gui()->lcd->setStatus(REG_FAIL_STATUS); break; // Remote callee answered case EXOSIP_CALL_ANSWERED: if (!gui()->transfer) - gui()->lcd->setStatus("Connected"); - // Start call timer - gui()->startCallTimer(gui()->currentLineNumber); + gui()->lcd->setStatus(CONNECTED_STATUS); + // Start call timer + gui()->startCallTimer(getCurrentLineNumber()); + phLines[getCurrentLineNumber()]->setbDial(false); break; // Remote callee hangup case EXOSIP_CALL_CLOSED: - //if (getCallInProgress()) { + if (sip->getNumberPendingCalls() == 0 + or !phLines[line]->isOnHold()) { + // Show HUNGUP_STATUS if there's not pending call + // or line is not onhold + gui()->lcd->clear(QString(HUNGUP_STATUS)); + } + if (phLines[line]->getbInProgress()) { this->ring(false); phLines[line]->setbRinging(false); @@ -398,13 +434,14 @@ Manager::handleRemoteEvent (int code, char * reason, int remotetype, int line) { gui()->setCurrentLineNumber(-1); } phLines[line]->setbDial(false); - gui()->lcd->clear(QString("Hung up")); + sip->notUsedLine = -1; break; // Remote call ringing case EXOSIP_CALL_RINGING: - gui()->lcd->setStatus("Ringing"); + gui()->lcd->setStatus(RINGING_STATUS); + phLines[getCurrentLineNumber()]->setbDial(false); break; default: @@ -413,13 +450,13 @@ Manager::handleRemoteEvent (int code, char * reason, int remotetype, int line) { // If dialog is established if (code == 101) { - gui()->lcd->setStatus("Ringing"); - + gui()->lcd->setStatus(RINGING_STATUS); // if error code } else { - if (code == 407) { - gui()->lcd->setStatus("Trying..."); - } else if (code > 399 and code != 407) { + if (code == AUTH_REQUIRED) { + gui()->lcd->setStatus(TRYING_STATUS); + } else if (code > 399 and code != AUTH_REQUIRED and + code != REQ_TERMINATED) { qinfo = QString::number(code, 10) + " " + QString(reason); gui()->lcd->setStatus(qinfo); @@ -427,6 +464,22 @@ Manager::handleRemoteEvent (int code, char * reason, int remotetype, int line) { qinfo = QString(reason); } } + + // Store the status of current line + if(getCurrentLineNumber() != -1) { + phLines[getCurrentLineNumber()]->status = getStatusRender(); + //qDebug("line[%d] status: %s", getCurrentLineNumber(), + // (phLines[getCurrentLineNumber()]->status).ascii()); + } +} + +bool +Manager::tryingState (int line) { + if (phLines[line]->status == TRYING_STATUS) { + return true; + } else { + return false; + } } void @@ -449,6 +502,11 @@ Manager::bufferTextRender (void) { return QString(*gui()->lcd->textBuffer); } +QString +Manager::getStatusRender (void) { + return (gui()->lcd->getStatus()); +} + void Manager::getInfoStun (StunAddress4& stunSvrAddr) { StunAddress4 mappedAddr; @@ -487,12 +545,13 @@ Manager::getFirewallAddress (void) { } /** - * Returs true if the current line replaces another one + * Returns true if the current line replaces another one */ bool Manager::otherLine (void) { if (gui()->busyNum != -1) { - if (gui()->busyNum != gui()->currentLineNumber) { + if (phLines[getCurrentLineNumber()]->status != TRYING_STATUS and + gui()->busyNum != getCurrentLineNumber()) { return true; } } diff --git a/src/manager.h b/src/manager.h index a34e79d6e128eea569eddcdda6b3daf3091f1d5f..8d32d97065fff0d29cd62c935693dcd5927a05a0 100644 --- a/src/manager.h +++ b/src/manager.h @@ -24,6 +24,17 @@ #include "phoneline.h" #include "../stund/stun.h" +// Status list +#define LOGGED_IN_STATUS "Logged in" +#define REG_FAIL_STATUS "Registration failure" +#define CONNECTED_STATUS "Connected" +#define HUNGUP_STATUS "Hung up" +#define RINGING_STATUS "Ringing" +#define TRYING_STATUS "Trying..." +#define REFUSED_CALL_STATUS "Refused call" +#define ENTER_NUMBER_STATUS "Enter Phone Number:" +#define TRANSFER_STATUS "Transfer to:" + #include <string> using namespace std; @@ -73,7 +84,9 @@ public: void closeSound (SipCall *); void selectAudioDriver (void); QString bufferTextRender (void); + QString getStatusRender (void); bool isNotUsedLine (int); + bool isUsedLine (int); bool isRingingLine (int); int newCallLineNumber (void); void getInfoStun (StunAddress4 &); @@ -96,13 +109,15 @@ public: void ringTone (bool); void startDialTone (void); void congestion (bool); + inline bool getbCongestion (void) { return b_congestion; } void notificationIncomingCall(void); void errorDisplay (char*); void nameDisplay (char*); void spkrSoundVolume (int); void micSoundVolume (int); - inline int getSpkrVolume (void) { return spkr_volume; } - inline int getMicVolume (void) { return mic_volume; } + inline int getSpkrVolume (void) { return spkr_volume; } + inline int getMicVolume (void) { return mic_volume; } + bool tryingState (int); private: bool exist; diff --git a/src/phonebookui.cpp b/src/phonebookui.cpp index 10f12d5c1ea286e8be9a8471e5a89f543bfd09e6..453ca1e76c0bfdf6c82a1d80be9e42fff787205f 100644 --- a/src/phonebookui.cpp +++ b/src/phonebookui.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** Form implementation generated from reading ui file 'phonebook.ui' ** -** Created: Tue Apr 12 09:35:07 2005 +** Created: Wed Apr 20 14:48:03 2005 ** by: The User Interface Compiler ($Id$) ** ** WARNING! All changes made in this file will be lost! diff --git a/src/phonebookui.h b/src/phonebookui.h index 2a9affa4f19d57d42fe9b9f8159e605471481c36..9aca7ead9e286d5d44c73cf01d440052d85c6e76 100644 --- a/src/phonebookui.h +++ b/src/phonebookui.h @@ -1,7 +1,7 @@ /**************************************************************************** ** Form interface generated from reading ui file 'phonebook.ui' ** -** Created: Tue Apr 12 09:35:07 2005 +** Created: Wed Apr 20 14:48:03 2005 ** by: The User Interface Compiler ($Id$) ** ** WARNING! All changes made in this file will be lost! diff --git a/src/phoneline.h b/src/phoneline.h index cce069d012b95cfafb6da361ee4c4c2ad208273b..e49064614edbcd60a917841e6c0fed701e3609d9 100644 --- a/src/phoneline.h +++ b/src/phoneline.h @@ -71,9 +71,12 @@ private: JPushButton *jpb; enum line_state state; enum line_state stateLine; - bool b_dial; - bool b_inProgress; - bool b_ringing; + + bool b_dial; // if ok button is clicked (->true) + bool b_inProgress; // if outgoing call, + // before remote callee answers (->true) + bool b_ringing; // if incoming call, + // before IP-phone user answers (->true) }; #endif // __PHONE_LINE_H__ diff --git a/src/qtGUImainwindow.cpp b/src/qtGUImainwindow.cpp index 317f021c6078395a2b721f329de9ae0c26612a37..fa9bdb4232871831c527cedeb5d99b5d15e29d6a 100644 --- a/src/qtGUImainwindow.cpp +++ b/src/qtGUImainwindow.cpp @@ -526,12 +526,15 @@ QtGUIMainWindow::numLineBusy(void) { void QtGUIMainWindow::dialTone (bool var) { - if (this->b_dialtone != var) { - this->b_dialtone = var; + if (callmanager->error->getError() == 0) { + if (this->b_dialtone != var) { + this->b_dialtone = var; + } + callmanager->tonezone = var; + callmanager->tone->toneHandle(ZT_TONE_DIALTONE); + } else { + callmanager->error->errorName(DEVICE_NOT_OPEN, NULL); } - callmanager->tonezone = var; - callmanager->tone->toneHandle(ZT_TONE_DIALTONE); - } /////////////////////////////////////////////////////////////////////////////// // Public Methods implementations // @@ -572,7 +575,7 @@ QtGUIMainWindow::toggleLine (int num_line) { if (callmanager->isNotUsedLine(currentLineNumber) and busyNum == -1) { qDebug("GUI: FIRST LINE IN USED %d", currentLineNumber); - lcd->setStatus("Enter Phone Number:"); + lcd->setStatus(ENTER_NUMBER_STATUS); chosenLine = currentLineNumber; if (!noChoose) { choose = true; @@ -587,7 +590,7 @@ QtGUIMainWindow::toggleLine (int num_line) { if (busyNum != currentLineNumber && busyNum != -1) { if (callmanager->isNotUsedLine(currentLineNumber)) { qDebug("GUI: Line %d replaces another one", currentLineNumber); - lcd->clear(QString("Enter Phone Number:")); + lcd->clear(QString(ENTER_NUMBER_STATUS)); chosenLine = currentLineNumber; lcd->inFunction = false; if (!noChoose) { @@ -599,10 +602,19 @@ QtGUIMainWindow::toggleLine (int num_line) { callmanager->phLines[busyNum]->setStateLine(ONHOLD); callmanager->actionHandle (busyNum, ONHOLD_CALL); if (!callmanager->phLines[currentLineNumber]->getbDial()) { - if (callmanager->sip->call[busyNum] == NULL) { + // If ok-button not clicked before + if (callmanager->sip->call[busyNum] == NULL and + !callmanager->tryingState(busyNum)) { setInactiveLine(busyNum); } - this->dialTone(true); + callmanager->phLines[busyNum]->setbDial(false); + + if (!callmanager->phLines[currentLineNumber]->getbRinging() + and callmanager->sip->call[currentLineNumber] == NULL and + !callmanager->tryingState(currentLineNumber)) { + // If no occured incoming call (not ringing and call[current]=null) + this->dialTone(true); + } } callmanager->phLines[currentLineNumber]->setState(BUSY); qDebug("GUI: state ON-HOLD line busyNum %d", busyNum); @@ -615,38 +627,53 @@ QtGUIMainWindow::toggleLine (int num_line) { callmanager->phLines[currentLineNumber]->button()->setPixmap( TabLinePixmap[currentLineNumber][BUSY]); callmanager->phLines[currentLineNumber]->setState(BUSY); - + // Answer new call - if (callmanager->isRingingLine(currentLineNumber) and + if ((callmanager->isRingingLine(currentLineNumber) || + (callmanager->isUsedLine(currentLineNumber) and + callmanager->phLines[currentLineNumber]->getbRinging())) and callmanager->phLines[currentLineNumber]->getStateLine() != ONHOLD){ + qDebug("GUI: -- New answered call %d --", currentLineNumber); callmanager->actionHandle (currentLineNumber, ANSWER_CALL); callmanager->phLines[currentLineNumber]->setState(BUSY); callmanager->phLines[currentLineNumber]->setStateLine(BUSY); + + lcd->clearBuffer(); + lcd->appendText(callmanager->phLines[currentLineNumber]->text); } else if (callmanager->phLines[currentLineNumber]->getStateLine() - == ONHOLD) { + == ONHOLD + or callmanager->tryingState(currentLineNumber)) { qDebug("GUI: state OFF-HOLD line %d", currentLineNumber); - lcd->clear(QString("Connected")); + lcd->clear(QString(CONNECTED_STATUS)); if (callmanager->sip->call[currentLineNumber] != NULL) { - lcd->inFunction = true; + if (!callmanager->phLines[currentLineNumber]->getbInProgress()){ + // Timer-call function + lcd->inFunction = true; + } else { + // Time function + lcd->inFunction = false; + } } callmanager->phLines[currentLineNumber]->setStateLine(OFFHOLD); callmanager->actionHandle (currentLineNumber, OFFHOLD_CALL); lcd->appendText(callmanager->phLines[currentLineNumber]->text); + lcd->setStatus(callmanager->phLines[currentLineNumber]->status); } } else if (callmanager->phLines[currentLineNumber]->isOnHold()){ // Change state to ONHOLD callmanager->phLines[currentLineNumber]->setState(ONHOLD); callmanager->phLines[currentLineNumber]->setStateLine(ONHOLD); - // Change status to ONHOLD qDebug("GUI: state ON-HOLD line %d", currentLineNumber); lcd->setStatus(ONHOLD_STATUS); callmanager->actionHandle (currentLineNumber, ONHOLD_CALL); - if (callmanager->sip->call[currentLineNumber] == NULL) { + + if (callmanager->sip->call[currentLineNumber] == NULL and + !callmanager->phLines[currentLineNumber]->getbDial()) { setInactiveLine(currentLineNumber); - lcd->setStatus("Enter Phone Number:"); + lcd->clear(QString(ENTER_NUMBER_STATUS)); } } } @@ -690,15 +717,16 @@ QtGUIMainWindow::dial (void) { // If find not used line noChoose = true; currentLineNumber = callmanager->findLineNumberNotUsed(); - qDebug("current line = %d", currentLineNumber); } else { // If choose line currentLineNumber = chosenLine; } callmanager->phLines[currentLineNumber]->text = callmanager->bufferTextRender(); + callmanager->phLines[currentLineNumber]->setbDial(true); toggleLine (currentLineNumber); + callmanager->phLines[currentLineNumber]->setbInProgress(true); // Set used-state pixmap 'currentLineNumber' line callmanager->phLines[currentLineNumber]->button()->setPixmap( @@ -730,34 +758,38 @@ QtGUIMainWindow::hangupLine (void) { } } else if (currentLineNumber != -1 and - !(callmanager->phLines[currentLineNumber]->isOnHold())) { + !(callmanager->phLines[currentLineNumber]->isOnHold()) and + !callmanager->tryingState(currentLineNumber)) { // If there is current line opened and state line not onHold // set free pixmap setFreeStateLine (currentLineNumber); - + callmanager->phLines[currentLineNumber]->setbDial(false); + if (callmanager->phLines[currentLineNumber]->getbInProgress()) { // If call is progressing, cancel the call + lcd->clear(QString(HUNGUP_STATUS)); callmanager->actionHandle (currentLineNumber, CANCEL_CALL); + } else if (b_dialtone + and callmanager->sip->call[currentLineNumber] == NULL){ + // If stop dialtone + this->dialTone(false); + lcd->clear(QString(ENTER_NUMBER_STATUS)); + } else if (callmanager->getbCongestion()){ + // If stop congestion tone + callmanager->congestion(false); + lcd->clear(QString(ENTER_NUMBER_STATUS)); } else { // Hang up the call - this->dialTone(false); callmanager->actionHandle (currentLineNumber, CLOSE_CALL); callmanager->phLines[currentLineNumber]->setbDial(false); + lcd->clear(QString(HUNGUP_STATUS)); } - lcd->clear(QString("Hung up")); + // Make free hung current line setCurrentLineNumber(-1); - } else if (callmanager->sip->call[currentLineNumber] == NULL and - callmanager->phLines[currentLineNumber]->isOnHold()) { - // If there isn't call on the current line and state line onHold - setInactiveLine(currentLineNumber); - // Stop congestion sound - callmanager->congestion(false); - lcd->clear(QString("Hung up")); + choose = false; + noChoose = false; } - choose = false; - noChoose = false; - // Just to test when receive a message #if 0 msgVar = true; @@ -882,13 +914,15 @@ QtGUIMainWindow::button_transfer (void) { if (currentLineNumber != -1) { transfer = true; callmanager->actionHandle (currentLineNumber, ONHOLD_CALL); - lcd->clear(QString("Transfer to:")); + lcd->clear(QString(TRANSFER_STATUS)); } } void QtGUIMainWindow::button_conf (void) { //TODO: This feature is not implemented yet + QMessageBox::information(this, "Conference", + "This feature is not implemented yet", QMessageBox::Yes); } void @@ -947,7 +981,7 @@ QtGUIMainWindow::configuration (void) { void QtGUIMainWindow::addressBook (void) { // TODO: phonebook->show(); - QMessageBox::information(this, "Information", + QMessageBox::information(this, "Directory", "This feature is not implemented yet", QMessageBox::Yes); } @@ -1040,7 +1074,18 @@ QtGUIMainWindow::blinkRingSlot (void) { if ( line == -1 ) return; - //if (callmanager->ringing()) { + // If more than one line is ringing + for (int i = 0; i < NUMBER_OF_LINES; i++) { + if (callmanager->isUsedLine(i) + and callmanager->phLines[i]->getbRinging()) { + if (!isOn) + state = FREE; + callmanager->phLines[i]->button()->setPixmap( + TabLinePixmap[i][state]); + } + } + + //If new line is ringing if (callmanager->phLines[line]->getbRinging()) { // For the line if (!isOn) { @@ -1115,7 +1160,7 @@ QtGUIMainWindow::pressedKeySlot (int id) { char code = 0; int pulselen = 0; int a = 0; - + // Stop dial tone if (b_dialtone) { this->dialTone(false); @@ -1299,6 +1344,8 @@ QtGUIMainWindow::keyPressEvent(QKeyEvent *e) { case Qt::Key_F2: case Qt::Key_F3: case Qt::Key_F4: + case Qt::Key_F5: + case Qt::Key_F6: this->toggleLine(e->key() - Qt::Key_F1); return; break; diff --git a/src/sip.cpp b/src/sip.cpp index 10569b43f2c94bd850ac5966b2c6479981f9d011..94bcc2e52e0d67e21cc027926cc77ccb3b513d0a 100644 --- a/src/sip.cpp +++ b/src/sip.cpp @@ -222,7 +222,7 @@ SIP::getNumberPendingCalls(void) { return pos; } -// Return the first number of line not used +// Return the first line number not used int SIP::findLineNumberNotUsed (void) { int k; @@ -572,7 +572,7 @@ SIP::manageActions (int usedLine, int action) { assert (usedLine >= 0); bzero (tmpbuf, 64); - // Get local port + // Get local port snprintf (tmpbuf, 63, "%d", call[usedLine]->getLocalAudioPort()); switch (action) { @@ -585,7 +585,7 @@ SIP::manageActions (int usedLine, int action) { callmanager->phLines[usedLine]->setbInProgress(false); eXosip_lock(); - i = eXosip_answer_call(call[usedLine]->did, 486, tmpbuf); + i = eXosip_answer_call(call[usedLine]->did, BUSY_HERE, tmpbuf); eXosip_unlock(); callmanager->ringTone(false); @@ -627,7 +627,6 @@ SIP::manageActions (int usedLine, int action) { eXosip_lock(); i = eXosip_terminate_call (call[usedLine]->cid, call[usedLine]->did); eXosip_unlock(); - qDebug ("exosip_terminate_call = %d", i); // Release RTP channels call[usedLine]->closedCall(); @@ -644,7 +643,7 @@ SIP::manageActions (int usedLine, int action) { case ONHOLD_CALL: qDebug("ONHOLD_CALL: cid = %d et did = %d", call[usedLine]->cid, call[usedLine]->did); - + call[usedLine]->usehold = true; eXosip_lock(); @@ -657,6 +656,8 @@ SIP::manageActions (int usedLine, int action) { // IP-Phone user is parking peer OFF HOLD case OFFHOLD_CALL: + qDebug("OFF-HOLD_CALL: cid = %d et did = %d", call[usedLine]->cid, + call[usedLine]->did); call[usedLine]->usehold = true; eXosip_lock(); i = eXosip_off_hold_call(call[usedLine]->did, NULL, 0); @@ -687,6 +688,7 @@ SIP::manageActions (int usedLine, int action) { case CANCEL_CALL: qDebug("SIP: CANCEL_CALL: terminate cid=%d did=%d", call[usedLine]->cid,call[usedLine]->did); + eXosip_lock(); i = eXosip_terminate_call (call[usedLine]->cid, call[usedLine]->did); eXosip_unlock(); @@ -725,7 +727,7 @@ SIP::getEvent (void) { callmanager->handleRemoteEvent(event->status_code, event->reason_phrase, -1); - //qDebug("status-code %d %s", event->status_code, event->reason_phrase); +// qDebug("status-code %d %s", event->status_code, event->reason_phrase); switch (event->type) { // IP-Phone user receives a new call case EXOSIP_CALL_NEW: //13 @@ -776,8 +778,16 @@ SIP::getEvent (void) { // TODO: stop the ringtone callmanager->ringTone(false); + //theline = callmanager->getCurrentLineNumber(); curLine = callmanager->getCurrentLineNumber(); - theline = findLineNumber(event); + + // If we have chosen the line before validating the phone number + if (callmanager->isChosenLine() and !callmanager->otherLine()) { + theline = callmanager->chosenLine(); + } else { + theline = findLineNumber(event); + } + if (call[theline] == NULL) { call[theline] = new SipCall(callmanager); } @@ -791,7 +801,6 @@ SIP::getEvent (void) { if (callmanager->phLines[theline]->getStateLine() == BUSY or callmanager->phLines[theline]->getStateLine() == OFFHOLD or !call[theline]->usehold) { - if (!callmanager->transferedCall()) { if (!call[theline]->usehold) { // Associate an audio port with a call @@ -829,7 +838,7 @@ SIP::getEvent (void) { callmanager->handleRemoteEvent (0, NULL, EXOSIP_CALL_RINGING); // TODO : rajouter tonalite qd ca sonne - //callmanager->ringTone(true); + callmanager->ringTone(true); // If we have chosen the line before validating the phone number if (callmanager->isChosenLine() and !callmanager->otherLine()) { @@ -844,8 +853,11 @@ SIP::getEvent (void) { assert (theline >= 0); assert (theline < NUMBER_OF_LINES); + callmanager->phLines[theline]->setbInProgress(true); + if (call[theline] == NULL) { call[theline] = new SipCall(callmanager); + call[theline]->setLocalAudioPort(local_port); call[theline]->ringingCall(event); } break; @@ -867,11 +879,16 @@ SIP::getEvent (void) { event->did, event->status_code, event->reason_phrase, event->remote_uri); #endif + if (callmanager->isChosenLine() and !callmanager->otherLine()) { + theline = callmanager->chosenLine(); + } else { theline = findLineNumber(event); - assert (theline >= 0); - assert (theline < NUMBER_OF_LINES); - // call[theline]->requestfailureCall(event); - callmanager->phLines[theline]->setbInProgress(false); + } + + assert (theline >= 0); + assert (theline < NUMBER_OF_LINES); + // call[theline]->requestfailureCall(event); + callmanager->phLines[theline]->setbInProgress(false); // Handle 4XX errors switch (event->status_code) { @@ -883,15 +900,10 @@ SIP::getEvent (void) { eXosip_retry_call (event->cid); eXosip_unlock(); break; + case FORBIDDEN: case NOT_FOUND: - // callmanager->setCallInProgress(false); - callmanager->congestion(true); - break; + case REQ_TIMEOUT: case ADDR_INCOMPLETE: - // callmanager->setCallInProgress(false); - callmanager->congestion(true); - break; - case FORBIDDEN: callmanager->congestion(true); break; case REQ_TERMINATED: diff --git a/src/sip.h b/src/sip.h index 57d196326835be8aa11ee846a71f2bb9859b1387..9f9338ce71ab2a01d4931d41c253bcc032d36688 100644 --- a/src/sip.h +++ b/src/sip.h @@ -55,7 +55,9 @@ using namespace ost; #define FORBIDDEN 403 #define NOT_FOUND 404 #define AUTH_REQUIRED 407 +#define REQ_TIMEOUT 408 #define ADDR_INCOMPLETE 484 +#define BUSY_HERE 486 #define REQ_TERMINATED 487 // 5XX errors #define SERVICE_UNAVAILABLE 503 diff --git a/src/sipcall.cpp b/src/sipcall.cpp index e5b88955a75607174d16e0596bfc47b93572b6ff..2a0318e4245e574281994d6b0fcd82d871756983 100644 --- a/src/sipcall.cpp +++ b/src/sipcall.cpp @@ -211,7 +211,7 @@ SipCall::onholdCall (eXosip_event_t *event) { osip_strncpy(ca->reason_phrase, event->reason_phrase, 49); ca->status_code = event->status_code; - + ca->state = event->type; return 0; } diff --git a/src/url_inputui.cpp b/src/url_inputui.cpp index a592ff6732f1533fada4b16b78e06496917682b3..a482b1d295972c58b15e63fbc604accb59560ec5 100644 --- a/src/url_inputui.cpp +++ b/src/url_inputui.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** Form implementation generated from reading ui file 'url_input.ui' ** -** Created: Tue Apr 12 09:35:08 2005 +** Created: Wed Apr 20 14:48:03 2005 ** by: The User Interface Compiler ($Id$) ** ** WARNING! All changes made in this file will be lost! diff --git a/src/url_inputui.h b/src/url_inputui.h index aead30a40c946a8fed05b09f16f0356577b59b66..9b723d719db08ab85bdc10e44d536b5b2cbdb194 100644 --- a/src/url_inputui.h +++ b/src/url_inputui.h @@ -1,7 +1,7 @@ /**************************************************************************** ** Form interface generated from reading ui file 'url_input.ui' ** -** Created: Tue Apr 12 09:35:08 2005 +** Created: Wed Apr 20 14:48:03 2005 ** by: The User Interface Compiler ($Id$) ** ** WARNING! All changes made in this file will be lost!