From: Dmitry Shulga Date: May 27 2011 11:43am Subject: bzr commit into mysql-5.5 branch (Dmitry.Shulga:3408) Bug#12546938 List-Archive: http://lists.mysql.com/commits/138315 X-Bug: 12546938 Message-Id: <201105271144.p4RBi6Gb026761@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0300524586625914571==" --===============0300524586625914571== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/shulga/projects/mysql/mysql-5.5/ based on revid:tatjana.nuernberg@stripped 3408 Dmitry Shulga 2011-05-27 [merge] Manual-merge of patch for bug#12546938 from mysql-5.1->mysql-5.5 modified: mysql-test/r/events_bugs.result mysql-test/t/events_bugs.test sql/event_db_repository.cc sql/event_db_repository.h sql/events.cc === modified file 'mysql-test/r/events_bugs.result' --- a/mysql-test/r/events_bugs.result 2011-03-28 15:38:16 +0000 +++ b/mysql-test/r/events_bugs.result 2011-05-27 11:42:28 +0000 @@ -535,6 +535,7 @@ DROP EVENT e3; DROP EVENT e2; DROP EVENT e1; SET TIME_ZONE=@save_time_zone; +SET TIMESTAMP=DEFAULT; drop event if exists new_event; CREATE EVENT new_event ON SCHEDULE EVERY 0 SECOND DO SELECT 1; ERROR HY000: INTERVAL is either not positive or too big @@ -756,6 +757,45 @@ SHOW EVENTS; Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation DROP DATABASE event_test1; DROP DATABASE event_test12; +# +# Bug#12546938 (formerly known as bug#61005): +# CREATE IF NOT EXIST EVENT WILL CREATE MULTIPLE RUNNING EVENTS +# +USE events_test; +SET GLOBAL event_scheduler = ON; +DROP TABLE IF EXISTS table_bug12546938; +DROP EVENT IF EXISTS event_Bug12546938; +CREATE TABLE table_bug12546938 (i INT); +# Create an event which will be executed with a small delay +# and won't be automatically dropped after that. +CREATE EVENT event_Bug12546938 +ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 SECOND ON COMPLETION PRESERVE +ENABLE DO +BEGIN +INSERT INTO table_bug12546938 VALUES(1); +END +| +# Now try to create the same event using CREATE EVENT IF NOT EXISTS. +# A warning should be emitted. A new event should not be created nor +# the old event should be re-executed. +CREATE EVENT IF NOT EXISTS event_bug12546938 +ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 SECOND ON COMPLETION PRESERVE +ENABLE DO +BEGIN +INSERT INTO table_bug12546938 VALUES (1); +END +| +Warnings: +Note 1537 Event 'event_bug12546938' already exists +# Wait until at least one instance of event is executed. +# Check that only one instance of our event was executed. +SELECT COUNT(*) FROM table_bug12546938; +COUNT(*) +1 +# Clean-up. +DROP EVENT IF EXISTS event_Bug12546938; +DROP TABLE table_bug12546938; +SET GLOBAL EVENT_SCHEDULER = OFF; DROP DATABASE events_test; SET GLOBAL event_scheduler= 'ON'; SET @@global.concurrent_insert= @concurrent_insert; === modified file 'mysql-test/t/events_bugs.test' --- a/mysql-test/t/events_bugs.test 2011-03-28 15:38:16 +0000 +++ b/mysql-test/t/events_bugs.test 2011-05-27 11:42:28 +0000 @@ -857,6 +857,7 @@ DROP EVENT e2; DROP EVENT e1; SET TIME_ZONE=@save_time_zone; +SET TIMESTAMP=DEFAULT; # # START - BUG#28666 CREATE EVENT ... EVERY 0 SECOND let server crash @@ -1235,6 +1236,55 @@ SHOW EVENTS; DROP DATABASE event_test1; DROP DATABASE event_test12; +--echo # +--echo # Bug#12546938 (formerly known as bug#61005): +--echo # CREATE IF NOT EXIST EVENT WILL CREATE MULTIPLE RUNNING EVENTS +--echo # +USE events_test; +SET GLOBAL event_scheduler = ON; + +--disable_warnings +DROP TABLE IF EXISTS table_bug12546938; +DROP EVENT IF EXISTS event_Bug12546938; +--enable_warnings +CREATE TABLE table_bug12546938 (i INT); + +delimiter |; + +--echo # Create an event which will be executed with a small delay +--echo # and won't be automatically dropped after that. +CREATE EVENT event_Bug12546938 +ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 SECOND ON COMPLETION PRESERVE +ENABLE DO +BEGIN + INSERT INTO table_bug12546938 VALUES(1); +END +| + +--echo # Now try to create the same event using CREATE EVENT IF NOT EXISTS. +--echo # A warning should be emitted. A new event should not be created nor +--echo # the old event should be re-executed. +CREATE EVENT IF NOT EXISTS event_bug12546938 +ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 SECOND ON COMPLETION PRESERVE +ENABLE DO +BEGIN + INSERT INTO table_bug12546938 VALUES (1); +END +| + +delimiter ;| + +--echo # Wait until at least one instance of event is executed. +let $wait_condition= SELECT COUNT(*) FROM table_bug12546938; +--source include/wait_condition.inc + +--echo # Check that only one instance of our event was executed. +SELECT COUNT(*) FROM table_bug12546938; + +--echo # Clean-up. +DROP EVENT IF EXISTS event_Bug12546938; +DROP TABLE table_bug12546938; +SET GLOBAL EVENT_SCHEDULER = OFF; ########################################################################### # === modified file 'sql/event_db_repository.cc' --- a/sql/event_db_repository.cc 2011-05-04 13:22:38 +0000 +++ b/sql/event_db_repository.cc 2011-05-27 11:42:28 +0000 @@ -620,18 +620,21 @@ Event_db_repository::open_event_table(TH only creates a record on disk. @pre The thread handle has no open tables. - @param[in,out] thd THD - @param[in] parse_data Parsed event definition - @param[in] create_if_not TRUE if IF NOT EXISTS clause was provided - to CREATE EVENT statement - + @param[in,out] thd THD + @param[in] parse_data Parsed event definition + @param[in] create_if_not TRUE if IF NOT EXISTS clause was provided + to CREATE EVENT statement + @param[out] event_already_exists When method is completed successfully + set to true if event already exists else + set to false @retval FALSE success @retval TRUE error */ bool Event_db_repository::create_event(THD *thd, Event_parse_data *parse_data, - my_bool create_if_not) + bool create_if_not, + bool *event_already_exists) { int ret= 1; TABLE *table= NULL; @@ -663,6 +666,7 @@ Event_db_repository::create_event(THD *t { if (create_if_not) { + *event_already_exists= true; push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE, ER_EVENT_ALREADY_EXISTS, ER(ER_EVENT_ALREADY_EXISTS), parse_data->name.str); @@ -670,8 +674,10 @@ Event_db_repository::create_event(THD *t } else my_error(ER_EVENT_ALREADY_EXISTS, MYF(0), parse_data->name.str); + goto end; - } + } else + *event_already_exists= false; DBUG_PRINT("info", ("non-existent, go forward")); === modified file 'sql/event_db_repository.h' --- a/sql/event_db_repository.h 2010-11-11 17:11:05 +0000 +++ b/sql/event_db_repository.h 2011-05-27 11:42:28 +0000 @@ -73,7 +73,8 @@ public: Event_db_repository(){} bool - create_event(THD *thd, Event_parse_data *parse_data, my_bool create_if_not); + create_event(THD *thd, Event_parse_data *parse_data, bool create_if_not, + bool *event_already_exists); bool update_event(THD *thd, Event_parse_data *parse_data, LEX_STRING *new_dbname, === modified file 'sql/events.cc' --- a/sql/events.cc 2011-05-21 08:21:08 +0000 +++ b/sql/events.cc 2011-05-27 11:42:28 +0000 @@ -284,6 +284,7 @@ create_query_string(THD *thd, String *bu return 0; } + /** Create a new event. @@ -304,8 +305,8 @@ bool Events::create_event(THD *thd, Event_parse_data *parse_data, bool if_not_exists) { - int ret; - bool save_binlog_row_based; + bool ret; + bool save_binlog_row_based, event_already_exists; DBUG_ENTER("Events::create_event"); if (check_if_system_tables_error()) @@ -345,28 +346,32 @@ Events::create_event(THD *thd, Event_par DBUG_RETURN(TRUE); /* On error conditions my_error() is called so no need to handle here */ - if (!(ret= db_repository->create_event(thd, parse_data, if_not_exists))) + if (!(ret= db_repository->create_event(thd, parse_data, if_not_exists, + &event_already_exists))) { Event_queue_element *new_element; bool dropped= 0; - if (!(new_element= new Event_queue_element())) - ret= TRUE; // OOM - else if ((ret= db_repository->load_named_event(thd, parse_data->dbname, - parse_data->name, - new_element))) + if (!event_already_exists) { - if (!db_repository->drop_event(thd, parse_data->dbname, parse_data->name, - TRUE)) - dropped= 1; - delete new_element; - } - else - { - /* TODO: do not ignore the out parameter and a possible OOM error! */ - bool created; - if (event_queue) - event_queue->create_event(thd, new_element, &created); + if (!(new_element= new Event_queue_element())) + ret= TRUE; // OOM + else if ((ret= db_repository->load_named_event(thd, parse_data->dbname, + parse_data->name, + new_element))) + { + if (!db_repository->drop_event(thd, parse_data->dbname, parse_data->name, + TRUE)) + dropped= 1; + delete new_element; + } + else + { + /* TODO: do not ignore the out parameter and a possible OOM error! */ + bool created; + if (event_queue) + event_queue->create_event(thd, new_element, &created); + } } /* binlog the create event unless it's been successfully dropped @@ -380,14 +385,14 @@ Events::create_event(THD *thd, Event_par { sql_print_error("Event Error: An error occurred while creating query string, " "before writing it into binary log."); - ret= TRUE; + ret= true; } else - { - /* If the definer is not set or set to CURRENT_USER, the value of CURRENT_USER - will be written into the binary log as the definer for the SQL thread. */ + /* + If the definer is not set or set to CURRENT_USER, the value of CURRENT_USER + will be written into the binary log as the definer for the SQL thread. + */ ret= write_bin_log(thd, TRUE, log_query.c_ptr(), log_query.length()); - } } } /* Restore the state of binlog format */ --===============0300524586625914571== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/dmitry.shulga@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: dmitry.shulga@stripped\ # vx1bqttx302xs2dk # target_branch: file:///Users/shulga/projects/mysql/mysql-5.5/ # testament_sha1: 2687523ec32ac6c0fffe0d7a33c5620a20a911fa # timestamp: 2011-05-27 18:44:01 +0700 # source_branch: file:///Users/shulga/projects/mysql/mysql-5.1-\ # bug11749345/ # base_revision_id: tatjana.nuernberg@stripped\ # ocwi9edbdrlujdwc # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWYsbLdEADC9/gHd4gAV///// f+f/yr////5gFsOx7G+IBiZqxtgAKAAChGAAF2oK6dqyNslsB169L2ZWTALNrG2hRbQ0TSTEn6Jq eTU0AGj1NPUHqNAwjQAAA0AHqMgkkAmmgEBMQmJU/CYo9U0/Uj009SDTQDagaAA2hw0NGTRo0aaG RkMIAyAGQaaAABkDIAkKBEmTEnkTaT1T0nohqabQeoBA0aYACYAJgCSUKabJpqaZB6mhpo0GmgGg DR6TIAAAANAFSSBACaA1TyaZTwmjRDKR6jah6am1NHo2lGmgGnqeptQ8XUeUZECVIgl6TF4ZhSSj QlRDmJs41Vb6iW+a0aNADJ/S9fMXR9sB+gbBiGOAUGqWrBhQxcF9uhEKiLrrUbTq5kHNXGwbt66h YPxvz8+HRgMrfXT2d1UbeRPDPFWYyixjRBxzAFR4PnmEFh9/xWnk0o3MU+MM+UHzMhIveBhz89tv hCEQxMjY48eUEjVjNuTC97BuZJmTmPQ7E3ZQQGXb39MOuNOmCwweM6L8DHameZR0pUlN0avg0i6m dTprK2Omf3+AcwQcu4chILfsYYZIJsH+rYTcgkJMKkyaU440wE8DzZFF31RUGjRHu6ReT+0I5BFc DLpAcCMbbSY02m0DY2Ps/IS7O/tuXMRsX/glPCyN7XMdnhr8PSagM8Yz8GVnonLah5WMr4s3Hmy9 MtN7Yd73oq4zv5UsaM5KOKl63xLW65Gg0Gs1mjFytGT7Nc02rfJ9HuKydc0qweRYf15HxLNxueT2 Fll7xPVP4u/9uL4/IxO/HBNJpw7S4sqfvZlyfvKUpm7PL+XhMBnj21suOR6X4Fxg1I4ne8in0/z8 DJR2GF/vc7FTS+nky4dxg2Gu7/s5e/uydnIj+tvjAh5Si9mvJLy/EUJIkPGGYea4j61IOfl840yV HFbRcXmUdh5B4y8LvyzK+r7ryo33OPPTIe8eTHwYIamLnwG1NQ2Y9CW/sTMQbDSzG3CIiBznn+eh 0u4F1mi2l+DTgW4uFDdJxg+E7k6Ji+pLlAuhP/z6CNa+4lJ80ULNBJlBxycYD3DNwGdNZPsIqEvh WjXTZ5fCvaVQUZRi5NJ2s7chyJS2sXXZNN+8+4Oy6jyGGYIthd0In5m1lu13uUNvE1UL5Yv73EL7 +J6r4y73OaWB0PEgGJ1Oj6tdqzgZpHGcrK3hOtMOTGzW/nDtPM8HpUfb69PVOs6z2jBtD2TmY3T0 wbj5D/Zkmxk9jVryqU4a94gyzgkj/G8Y22xtjbbG31ARL5t/fodQmjcG7p84PNs3a9yX1+bdsZB+ PAZeH7+c+L04ivlOkFTyoTk/PqDfQoGf6mP0/qcLAwvYded+rnZ5c4BNv0PrxSXoi8RyEXe6QnlP s9aWUa/ZuU4WeMW8Y/Uk98Jk2N6lvsjKO2O/Fr7eg8GyZtM3+bTvbs6XaVJGpSTW4vRfy22Q/RQ5 nRk7ufX4+URuNXceYyhU4DNbemLW1REtNNRtcJ5mIvIUPJ6vF+HcjRlpRJEdC06jx6m2225byPJ4 zjuk1JC8hkaOdowxEmA9TBzmcas9D1ClUPVBzkyBUYKMkCeOoeZKKuTIvEMIsJF3yEnlQkOaZR8z 9sVJMhgSKtUHgiY4Q7ERUixQuIxJllZlkkWti09TCzYxhMbKwxZE0qi+LTS0DBHQ5Cx4S5NgeWwN DMONLDNNK3qs3HR0YY3fYHsJorH7SqvV6j+eaQLIkP+nQNvQnatEVC9hJEW5ZwEtFiPLyxciK4Ic k5esPtTCZmGBcnhZS541fjnKOeRQ5lYbhlb9hU+GA+4SvEnj1FMvebG8lL/46vLDin3uLxh8+r3T IDyceekPPhxJlxpIyHndBxGF2IjtwpLkeIl3GHERA5ncUO26SBMWtxqfgeWhTrF6WGTNg21XwfBu MSO9E05G78QhRIuSBN0YURDlvY11iXSusud6RgPR6ZqRCaIiKXIgd1rfFTEaiVxPUSH/gVcxHSOY 81GVwkYmuHMiI6l6Er29VHXphz9hHWICPUuBsXiXALisjR7i/wikpEy1DruNt5kXFyjJ5L5CXtON xeYaJH2oiJMhxbYc7ZolrrVm8dDJ7ZaNebF/kJUJkxIvjgNAittzsgsd6lSM6tlXtLEm97RmXlCN JK57EmVCEEzeehEfK2nn0M0EZuC5kSGqoQFnsuiBuNbNRhJvSZYOQhQzeQzIBTuAyF6zyRAZDzPO 2Ju0eZY5kqRabaAs+Y5EDgUvviJcBjYaxB4WgYTTliQG0nCmlCJM8cEUvvt4zwhihLwpioeYkPzH zm6Q0RDach76spzIUJucdxJjeJUN8zNFDmVHhxLXGxkSRE/ATL4I8/Wh4kYe5HpYro17TZujP3wi 7q7S8O8I7tTjEhvHInSBcNDuweVcQYRwHJCOvWREYLIzGmPPMWWOJKiErLUkiD9jwDseo/e8+Dey GJMMSheWMd8jhmZtM1OLxoFMyxvDnDcdkeskXam9ON15A1LzyMXBkJFyKJ/qGRY7zQlTbTLV6xjp F9+PTcUaUhHIgOEcUMX1Ie4a5oJlsb8bQVwi0iZi+MXuIMZQBViQLTHDi7LlKOcWPabkQLMZTfZ1 mQlEvGI547hGw/N4OBacjAIGFCbECcSPZEEdEeSOSHC7IejHSBw0gYOc5tmW086DlAnlqIe2JVnC RQi5fewlA5m1E4umPq/2o9BdCUqFh3IpqM8cOVRIamY7F0jkMauWxftHo65RMskMZb77uUCQk+45 jDjLUoGuJAwTFDxOiOqPC2lWMAq+rWgls+Ep92TpwZFGgwqpIuJZ5VG+Ayhhl7hU6FXBbnr2VyYi x1SYmNi4e4sPwnzJxVSdxMmZDGMMvGteJdyJJHIoYEeR4QMMT6lzzKG2TosXvaj4InpHKOMpiQ/g X7q5lkJYZkSuuNSw5rDo3lSIxcdnEMiN08AldePdJbGXaU4E+DajGp1TzdqbD8TDD8h2/TuNNd4w FvRWdGyu7klDmGcxxCbAwIhXCKGRCZDREmCys3cqJWRCo4CnOO2WHXSks8lch7z+T4de/uf5hWlH 4Ne6UzFoZAZQn9+teqCxA9C61MqpoNaKL4xqKtcirEfc+d+lHvj3qOz+bI0NK6XpHnKDYbaOM5E/ I9ZRZLzkknO7ZczcqpSqKSoqpXcUfajLA/+T60sXGFpSlKkpaWJ+Owqj9i4z4jFLtL+LafcN0lKS lNT/24qf3STivL5tT/FyF82DQhmS7JUaCjQXn4JcmBsQfr22K/IOdvcbCYcq8uNb8ksH8lyf6GK/ fVUi9PzD/q/qNyj8+U508lG2XLjjbC4yN8XpZLGxvvLkmYUWbmTFFxgkuLIsjXe4HEVtLXM7onIX GczFlxS8aUXHQZCmSjE/74azKSZ03nRNo3JibTQsLKVClLHpXrG6qs3GJcl+2LkqRZ/gw1zkNs3o zGA3Fll9KqTjZ0uTKSXn/nx2mLMZmJd+P7rLmiRQtuajI401ude2m5MmxeZyjYhYvqwe09fsVJzi kfb4rKSqk94WWFSFXFD3fH65MKlUZFBEBKW9sK/89EiPcEjk92tQFQzIUNgWHRTFJaGeGHxKAYRI QE0mlgiHSyTmLdklm5bfraPw5khbS+PNE5ttVmjPw/CIl7hs42+8+PExJSSoFElonXRTfSmJKhYK RP6dk5qg7NIYWMsREcBEbZqkljgynG6pcl6+H3vAu8+jpQcsc1WH6dGu9ppSiV+yNByeOG5z+MzK LPAa8GmhNV0YRwXT77o6+5sXq1Oi5syPrzN3a8Xk+LWvdMeb1PLjje0x5p5HmrTgzdD5GVJGZ4+O 6OJjc4mU4EztMsx6pbUwZmSzzj188Y/U256+OPiHurSfty4+53uGMJahioqoeCJBWZJEjta/RVRh VxAuo9io+V6eV1G96Xg8Hff3T2Tu0zuWaHe1s7S6dGr0mGSoeZysNqfffA2qg0GO+xqeaPjzB0CN iA3Kye7dMF0twbCWaLLKjsjeviJlpjZETiYZdj0LpeU/J/C0Pzps1TPD6Xsljx2rRqKhm2Waomd5 lmMaYVhBlxsH2CM4gt1G/zwOvevkR8sTqZomOJEjzPMzI6IxLyx47jY8RxvQrxbzazcJWMZlQuJF Aj2d4Ds48PvdUgmszvMx9VAb6pj8nl8xI5GfYXgjFHw4HAv4fOcw+BLN8eq/M4JO4pXA/g6UqLQp ZKi3FMvc7p03T44NnU4n1TkSc9/t3R29+y9SrWUpetOtSnkUiHeR5cQiRhQlIZjvgPZUJuR8SZF9 CT7qg6ZRz3JJKySOXGh8jyxGMNfeXEfaNuPax6jgQpyGVr3FvC8mOHlw85bmIHoVMzIkcvARxEQN rG1wbYSf16ULAGVQKJJrlSUMHQcN7ErykT1uVvbmW9TO7iaG+Nv1Q6dy7wWi/dfzwUlJzosOCMHI KMS9Q6HH4LCZyeZ+zWF/d8Cne4l+P6Cpx2A9Z0LpSKdzjPP3D1U93xQ5Zv/2Gbo85uFBdC+X1m68 MY6Mu4VSJVRTtW66i5SQuRRCiGiYqcyi/XOy5w4TP3NNpaa7vSq51uxlNJ9UA4e5hGUzzZPE8ik6 +4WYWQaMhcBoYD7iGL76/j+Hb6cuxlcCPPPSY/W7bhUqyyWstFrm4NkN66YKNdG21rI5UjkcjnT5 6UpR99VU7oT6Hm9z2+x4JTraexZg9zLQveGw83me/lW6vheuZmdc4nFdtayfBkwwZayXR5JZ/sjV 0oqNqMZ+iJ6VwvW7pdodUYK1xsZOmo9YtZaSPe+EdPfMZ3iNXtjkSMLopUG39EaUzR0R2pH0Sozr kvj1NzIKcjsTCO3xeniqf0rrKjgtOiOHhHHfgJjJdFSZkMhWmZgZoyLhIXx7BYrq1TV66oCNGuqK gBPowlnFJ4JHUv5Y9MaI9MWjR+1nIU8ETvZxPmUgy84hWERPUmOB0lrFUR5omIgVNCQSB0WMe3YU ozPKzJN6Rtu+yNcYRoaSGTiLqqN3oVnez8HDxxse3zj8ElY68IamiwYUqxQdfiewqR0RUZlUSoyn TVVy/dXUHmhe5jm5XO35mpIvkkYUs80f5WRy3RPrbjpl0PKOEeUep4t0Xw4GZ7k4cLUGQ/vRFFkS h9PZuFT6nrSWKJo5qHJ6lUdBkdp3DuhExtvqqdIiNHOB1WRxRmCzJgqj11t1LMo63Oa1T5o7vl69 6KlaIiUi6JUkp9DUtVak8o0PC7PyrxHXNDdGK6UAYY9qLiigv0W6seVYpJkNJB3ByHI1gdy4esxJ +jK+SZesnZkgTG5PeVDsTQ8b7EdwdJSc1SOxpkrKYyYMDk56uaNkWnkdgjTO9yJNLD+AVSRYwBS+ aMhTM0Y3ZsqdWVgrdN3FYLBOjKxbBm6UKDLHCi50NIqDHVYK6Ticojjg1J5ANr2tEFRJMiCGgMB4 meN1SVdp3Ud16YZRqDVD7EaK+80yckywkvQiLCwq3pTQkK1h48TMJA+ieKFx08TwBMkceLhQgjBO zZyS+dsdGLD1uWRmj3x4o5ZL23LRETY32e2KtjR1qQulx0+1Yv3SZ0z035OOZUv+2ImMkwvhtuca kS0kc2COVX38freJ1xWGMmxzVHv/Hi0qyj0OniZyGhI2aeM5Fq8VkUk+3u/tvPGsIx0k540OZPYk b46jFPdGXqSNOeOTFPEva1Xt3Mmxm9DCNu5yuaQ6m5O12JNbYpVam+KVValPVcsqlbOfFfP1U76f LkQZhpfJsNWWOtxdaT6HEJpRNqRoycBT6fNS3SfIcCxFghrr+fwN52cpLVA8Wz1oL3i17vdhWAwd Ep6CMs2gbZpzDaFIUKsg0kykFAjBBEPiOqGzwOMjHHAdjXQ8+1qDiRcHwSfD52MWi/CSPFkxYnfJ rNzcx2M8dkcLnOTbAXPdCXXWQfrP4zgjL5k0dWGZGYiiXkEMbbHEHBIuYo+DjOmkVe301fqR5KbL EJCEhCQhCgvOFEw3gadRDMaA3ieipJZ4SVRKVEU4Iue28S1MjbnTmMYGm6BcqU6aqp0554KlClss oZsMrkdCJF2ZmZBExnoejcPIpqjC0ieWGneeiJ4zGTmLjAvIKGxUhdSTFTsIsxHHEsjjl2NGemLK IVxrJlszopBQnNeFLGHOwlKGk4JbDcaBdeRZi7dEXj5vKLRGmV6Uwb6cG9xY8hq48pZbYY3zOzZu 2h6ql1TMyC5nlKClT1O+7EvUpEYGm+0lRUoNdOeKSYGunzJNFnE6EnyRdHEWio2p5xbRjNEXxr7v bG7czURrEJ6hoWwDR742MGNA2NjGataICutI6mqfJGMm1iI5ZxQ7StxzuGpfxvbGmc10ZN16qjgN 1YOJPW+foM7jY3P3VEhRSqdCVFqQ36Xnoa8A9Ee+OEbOSPQ5knzIyDM3Dgeb/G9eI3RdTEuhcIlo TPdtF/1HJpVDvMbuqPr8RKwl0Nxfekc5IpNEBBceAk4SLvBvrrXF0ssVSiqSCyLjKMY7Y8I+Ui4n qijI6I3GYj5IbEoXl5zPr/Ic/2su5437hdyRThQkIsbLdEA= --===============0300524586625914571==--