From e34024840b0d96d239d5fd40115ee22a7de54a45 Mon Sep 17 00:00:00 2001 From: John Mertic Date: Sun, 23 Oct 2011 21:38:14 -0400 Subject: [PATCH] Release 6.2.4 --- ModuleInstall/ModuleScanner.php | 56 +++ Zend/Gdata/Docs.php | 6 +- Zend/Gdata/Docs/Query.php | 2 +- cron.php | 4 +- data/SugarBean.php | 3 +- download.php | 18 +- export.php | 2 +- files.md5 | 365 +++++++-------- include/Dashlets/DashletRssFeedTitle.php | 123 +++++ include/EditView/EditView2.php | 67 ++- include/ListView/ListView.php | 2 +- include/ListView/ListViewDisplay.php | 7 +- include/Localization/Localization.php | 48 +- .../MVC/Controller/entry_point_registry.php | 1 - include/MVC/View/views/view.quickcreate.php | 3 - include/MassUpdate.php | 9 +- include/MySugar/MySugar.php | 17 +- include/Popups/tpls/PopupGeneric.tpl | 3 +- include/SearchForm/SearchForm2.php | 14 +- .../plugins/function.sugar_translate.php | 9 +- include/SugarCharts/SugarChart.php | 96 ++-- .../SugarEmailAddress/SugarEmailAddress.js | 6 +- .../SugarEmailAddress/SugarEmailAddress.php | 6 +- .../Fields/Datetimecombo/EditView.tpl | 4 +- include/SugarFields/Fields/File/EditView.tpl | 2 +- .../Fields/File/SugarFieldFile.php | 62 --- .../Fields/Radioenum/SugarFieldRadioenum.php | 95 +--- .../SugarFields/Fields/Relate/SearchView.tpl | 2 +- .../SugarObjects/templates/person/Person.php | 43 +- .../templates/person/language/en_us.lang.php | 1 + .../templates/person/metadata/searchdefs.php | 1 + .../SugarObjects/templates/person/vardefs.php | 18 +- include/SugarTinyMCE.php | 3 +- include/TimeDate.php | 2 + include/connectors/sources/default/source.php | 13 + include/database/MssqlManager.php | 2 +- include/export_utils.php | 65 ++- .../SugarWidgetFielddatepicker.php | 3 +- .../SugarWidgets/SugarWidgetFieldenum.php | 3 +- .../SugarWidgetFieldsingleenum.php | 3 +- .../SugarWidgetSubPanelEmailLink.php | 22 +- include/javascript/javascript.php | 2 + include/javascript/jsclass_async.js | 8 +- include/javascript/sugar_3.js | 9 +- include/javascript/sugar_grp1.js | 9 +- include/javascript/sugar_grp_emails.js | 43 +- include/javascript/sugar_grp_quickcomp.js | 37 +- include/utils.php | 32 +- include/utils/db_utils.php | 27 ++ include/utils/mvc_utils.php | 2 +- install/checkDBSettings.php | 25 +- install/confirmSettings.php | 11 +- install/install_utils.php | 32 +- install/language/en_us.lang.php | 4 +- install/performSetup.php | 1 + json_server.php | 415 +---------------- .../SugarEmailAddress/SugarEmailAddress.js | 8 +- .../include/javascript/jsclass_async.js | 17 +- .../src_files/include/javascript/sugar_3.js | 41 +- .../src_files/modules/Documents/documents.js | 18 +- modules/ACLRoles/EditAllBody.tpl | 4 +- modules/Accounts/Account.php | 6 +- modules/Accounts/metadata/popupdefs.php | 1 + modules/Accounts/vardefs.php | 14 + modules/Activities/Popup_picker.php | 46 +- modules/Administration/Locale.tpl | 1 + modules/Audit/Popup_picker.html | 16 +- modules/Calendar/small_month.php | 3 +- .../Calendar/templates/templates_calendar.php | 5 +- modules/Calls/Call.php | 18 +- .../MyCallsDashlet/MyCallsDashlet.php | 4 +- modules/Calls/vardefs.php | 2 + modules/CampaignLog/CampaignLog.php | 7 +- modules/Campaigns/EmailQueue.php | 3 +- modules/Campaigns/ProspectLink.php | 123 +++++ modules/Campaigns/Schedule.html | 8 +- modules/Campaigns/Schedule.php | 172 +++---- modules/Campaigns/WebToLeadCapture.php | 2 +- modules/Campaigns/tpls/campaign-inactive.tpl | 39 ++ modules/Campaigns/vardefs.php | 6 + .../MyPipelineBySalesStageDashlet.php | 2 +- .../PipelineBySalesStageDashlet.php | 2 +- .../Charts/code/Chart_outcome_by_month.php | 2 +- modules/Configurator/tpls/adminwizard.tpl | 7 +- .../SaveContactOpportunityRelationship.php | 3 +- modules/Contacts/metadata/popupdefs.php | 3 +- modules/Contacts/vardefs.php | 14 + modules/Contacts/views/view.quickcreate.php | 59 +++ modules/Currencies/Currency.php | 32 +- modules/Documents/documents.js | 2 +- modules/Documents/vardefs.php | 4 +- .../Fields/TemplateRelatedTextField.php | 1 + modules/EmailMan/controller.php | 4 +- modules/EmailMarketing/EditView.html | 4 +- modules/EmailMarketing/vardefs.php | 4 + modules/EmailTemplates/Delete.php | 1 + modules/EmailTemplates/EditView.php | 5 + modules/EmailTemplates/Save.php | 1 + modules/Emails/EditView.html | 433 ------------------ modules/Emails/EditView.php | 3 - modules/Emails/EditViewArchive.html | 16 +- modules/Emails/EmailUIAjax.php | 4 +- modules/Emails/javascript/Email.js | 26 +- modules/Emails/javascript/EmailUICompose.js | 33 +- modules/Emails/javascript/grid.js | 4 +- modules/Emails/templates/_baseEmail.tpl | 2 + modules/Employees/Save.php | 13 + modules/Home/UnifiedSearchAdvanced.php | 19 +- modules/Home/index.php | 4 +- modules/Import/tpls/step1.tpl | 4 +- modules/Import/views/view.step4.php | 2 +- modules/InboundEmail/DetailView.html | 2 +- modules/InboundEmail/EditView.html | 6 +- modules/Leads/metadata/convertdefs.php | 1 + modules/Leads/metadata/popupdefs.php | 1 + modules/Leads/tpls/ConvertLead.tpl | 4 +- modules/Leads/vardefs.php | 16 +- modules/Leads/views/view.convertlead.php | 230 ++++++---- modules/MailMerge/Step1.php | 4 +- modules/MailMerge/Step2.html | 56 ++- modules/MailMerge/controller.php | 114 +++++ modules/MailMerge/index.php | 3 +- .../MyMeetingsDashlet/MyMeetingsDashlet.php | 4 +- modules/Meetings/Meeting.php | 74 ++- modules/Meetings/metadata/editviewdefs.php | 2 +- .../ModuleBuilder/Module/StudioBrowser.php | 2 +- modules/ModuleBuilder/controller.php | 13 + .../ModuleBuilder/parsers/parser.label.php | 74 +++ .../relationships/ActivitiesRelationship.php | 1 + .../relationships/UndeployedRelationships.php | 11 + .../views/GridLayoutMetaDataParser.php | 2 +- .../ModuleBuilder/parsers/views/History.php | 91 ++-- .../views/ListLayoutMetaDataParser.php | 12 +- .../views/SearchViewMetaDataParser.php | 39 +- modules/ModuleBuilder/tpls/layoutView.tpl | 7 +- modules/Notes/metadata/SearchFields.php | 3 +- modules/Notes/metadata/searchdefs.php | 2 +- modules/Project/gantt.css | 221 --------- modules/ProjectTask/ProjectTask.php | 33 +- modules/Roles/DeleteUserRelationship.php | 3 +- modules/Roles/SaveUserRelationship.php | 3 +- modules/SavedSearch/SavedSearchSelects.tpl | 2 +- modules/Schedulers/Scheduler.php | 10 +- modules/SchedulersJobs/SchedulersJob.php | 2 +- modules/Studio/DropDowns/DropDownHelper.php | 7 + modules/Tasks/Task.php | 18 +- modules/Tasks/vardefs.php | 5 +- modules/Trackers/BreadCrumbStack.php | 2 +- modules/Trackers/Tracker.php | 2 +- modules/UpgradeWizard/uw_utils.php | 12 +- modules/Users/EditView.tpl | 1 + modules/Users/Login.php | 19 +- modules/Users/User.php | 10 +- modules/Users/tpls/wizard.tpl | 8 +- service/core/SoapHelperWebService.php | 4 +- service/core/SugarWebServiceImpl.php | 2 +- sugar_version.php | 8 +- tests/SugarTestHelper.php | 3 + tests/SugarTestMeetingUtilities.php | 25 +- tests/SugarTestObjectUtilities.php | 67 +++ tests/SugarTestProjectTaskUtilities.php | 78 ++++ tests/SugarTestProjectUtilities.php | 70 +++ tests/SugarTestViewConvertLeadUtilities.php | 55 +++ tests/data/Bug45896Test.php | 212 +++++++++ tests/include/Bug45525Test.php | 100 ++++ tests/include/Dashlets/Bug46217Test.php | 95 ++++ .../include/ListView/ListViewDisplayTest.php | 5 +- tests/include/Localization/Bug35413Test.php | 84 ++++ tests/include/MassUpdate/MassUpdateTest.php | 20 +- tests/include/SearchForm/Bug45966Test.php | 12 +- .../plugins/FunctionSugarTranslateTest.php | 45 ++ tests/include/SugarCharts/Bug42326Test.php | 3 +- tests/include/SugarCharts/Bug44696Test.php | 167 +++++++ .../SugarEmailAddress/Bug42279Test.php} | 85 ++-- .../Radioenum/SugarFieldRadioenumTest.php} | 49 +- tests/include/ValidDBNameTest.php | 43 ++ tests/modules/Calls/Bug39161Test.php | 21 +- tests/modules/Contacts/Bug36989Test.php | 94 ++++ tests/modules/Currencies/CurrencyTest.php | 8 +- tests/modules/Emails/Bug40527Test.php | 3 + tests/modules/Emails/Bug40911Test.php | 3 + tests/modules/Home/Bug42961Test.php | 74 +++ tests/modules/Home/Bug43653Test.php | 2 +- tests/modules/Leads/ConvertLeadTests.php | 26 +- tests/modules/Meetings/Bug45287Test.php | 18 +- tests/modules/Meetings/Bug45287_2Test.php | 18 +- tests/modules/Meetings/Bug46294Test.php | 101 ++++ .../ModuleBuilder/parsers/Bug44712Test.php} | 72 +-- .../parsers/SearchViewMetaDataParserTest.php | 366 +++++++++++++++ .../parsers/views/HistoryTest.php | 100 ++++ tests/modules/ProjectTask/Bug46350Test.php | 137 ++++++ tests/modules/ProspectLists/Bug36422Test.php | 154 ------- tests/modules/ProspectLists/Bug41569Test.php | 141 ------ tests/modules/ProspectLists/Bug43478Test.php | 147 ------ tests/modules/ProspectLists/Bug43805Test.php | 145 ------ tests/modules/Reports/Bug47277Test.php | 52 +++ tests/modules/Trackers/store/Bug41051Test.php | 114 ----- tests/modules/UpgradeWizard/Bug36845Test.php | 22 +- tests/phpunit.php | 3 +- 199 files changed, 4275 insertions(+), 3055 deletions(-) create mode 100644 include/Dashlets/DashletRssFeedTitle.php rename json.php => include/SugarFields/Fields/Radioenum/SugarFieldRadioenum.php (50%) create mode 100644 modules/Campaigns/ProspectLink.php create mode 100644 modules/Campaigns/tpls/campaign-inactive.tpl create mode 100644 modules/Contacts/views/view.quickcreate.php delete mode 100644 modules/Emails/EditView.html create mode 100644 modules/MailMerge/controller.php delete mode 100644 modules/Project/gantt.css create mode 100755 tests/SugarTestObjectUtilities.php create mode 100755 tests/SugarTestProjectTaskUtilities.php create mode 100755 tests/SugarTestProjectUtilities.php create mode 100755 tests/SugarTestViewConvertLeadUtilities.php create mode 100755 tests/data/Bug45896Test.php create mode 100755 tests/include/Bug45525Test.php create mode 100755 tests/include/Dashlets/Bug46217Test.php create mode 100755 tests/include/Localization/Bug35413Test.php create mode 100755 tests/include/SugarCharts/Bug44696Test.php rename tests/{modules/Home/Bug39610Test.php => include/SugarEmailAddress/Bug42279Test.php} (54%) rename tests/{modules/Contracts/Bug44836Test.php => include/SugarFields/Fields/Radioenum/SugarFieldRadioenumTest.php} (69%) create mode 100755 tests/modules/Contacts/Bug36989Test.php create mode 100755 tests/modules/Home/Bug42961Test.php create mode 100755 tests/modules/Meetings/Bug46294Test.php rename tests/{include/SugarFields/Fields/File/Bug22505Test.php => modules/ModuleBuilder/parsers/Bug44712Test.php} (53%) create mode 100755 tests/modules/ModuleBuilder/parsers/SearchViewMetaDataParserTest.php create mode 100755 tests/modules/ModuleBuilder/parsers/views/HistoryTest.php create mode 100755 tests/modules/ProjectTask/Bug46350Test.php delete mode 100755 tests/modules/ProspectLists/Bug36422Test.php delete mode 100755 tests/modules/ProspectLists/Bug41569Test.php delete mode 100755 tests/modules/ProspectLists/Bug43478Test.php delete mode 100755 tests/modules/ProspectLists/Bug43805Test.php create mode 100755 tests/modules/Reports/Bug47277Test.php delete mode 100755 tests/modules/Trackers/store/Bug41051Test.php diff --git a/ModuleInstall/ModuleScanner.php b/ModuleInstall/ModuleScanner.php index 427085b5..9e4b32bb 100644 --- a/ModuleInstall/ModuleScanner.php +++ b/ModuleInstall/ModuleScanner.php @@ -60,6 +60,62 @@ class ModuleScanner{ private $validExt = array('png', 'gif', 'jpg', 'css', 'js', 'php', 'txt', 'html', 'htm', 'tpl', 'pdf', 'md5', 'xml'); private $blackList = array( + 'popen', + 'proc_open', + 'escapeshellarg', + 'escapeshellcmd', + 'proc_close', + 'proc_get_status', + 'proc_nice', + 'basename', + 'passthru', + 'clearstatcache', + 'delete', + 'dirname', + 'disk_free_space', + 'disk_total_space', + 'diskfreespace', + 'fclose', + 'feof', + 'fflush', + 'fgetc', + 'fgetcsv', + 'fgets', + 'fgetss', + 'file_exists', + 'file_get_contents', + 'filesize', + 'filetype', + 'flock', + 'fnmatch', + 'fpassthru', + 'fputcsv', + 'fputs', + 'fread', + 'fscanf', + 'fseek', + 'fstat', + 'ftell', + 'ftruncate', + 'fwrite', + 'glob', + 'is_dir', + 'is_file', + 'is_link', + 'is_readable', + 'is_uploaded_file', + 'parse_ini_string', + 'pathinfo', + 'pclose', + 'readfile', + 'readlink', + 'realpath_cache_get', + 'realpath_cache_size', + 'realpath', + 'rewind', + 'set_file_buffer', + 'tmpfile', + 'umask', 'eval', 'exec', 'system', diff --git a/Zend/Gdata/Docs.php b/Zend/Gdata/Docs.php index 98eae82f..4a90b9fb 100644 --- a/Zend/Gdata/Docs.php +++ b/Zend/Gdata/Docs.php @@ -57,7 +57,7 @@ require_once 'Zend/Gdata/Docs/DocumentListEntry.php'; class Zend_Gdata_Docs extends Zend_Gdata { - const DOCUMENTS_LIST_FEED_URI = 'http://docs.google.com/feeds/default/private/full'; + const DOCUMENTS_LIST_FEED_URI = 'https://docs.google.com/feeds/default/private/full'; const AUTH_SERVICE_NAME = 'writely'; const DEFAULT_MAJOR_PROTOCOL_VERSION = 3; @@ -174,7 +174,7 @@ class Zend_Gdata_Docs extends Zend_Gdata * @return Zend_Gdata_Docs_DocumentListEntry */ public function getResource($resourceId) { - $uri = 'http://docs.google.com/feeds/documents/private/full/' . $resourceId; + $uri = 'https://docs.google.com/feeds/documents/private/full/' . $resourceId; return $this->getDocumentListEntry($uri); } @@ -191,7 +191,7 @@ class Zend_Gdata_Docs extends Zend_Gdata * @deprecated Use getResource($resourceId) instead. */ public function getDoc($docId, $docType) { - $location = 'http://docs.google.com/feeds/documents/private/full/' . + $location = 'https://docs.google.com/feeds/documents/private/full/' . $docType . '%3A' . $docId; return $this->getDocumentListEntry($location); } diff --git a/Zend/Gdata/Docs/Query.php b/Zend/Gdata/Docs/Query.php index fb80f0fb..5756e316 100644 --- a/Zend/Gdata/Docs/Query.php +++ b/Zend/Gdata/Docs/Query.php @@ -51,7 +51,7 @@ class Zend_Gdata_Docs_Query extends Zend_Gdata_Query * * @var string */ - const DOCUMENTS_LIST_FEED_URI = 'http://docs.google.com/feeds/default'; + const DOCUMENTS_LIST_FEED_URI = 'https://docs.google.com/feeds/default'; /** * The generic base URL used by some inherited methods diff --git a/cron.php b/cron.php index 4cb4b6d9..8f3e8a21 100644 --- a/cron.php +++ b/cron.php @@ -93,7 +93,9 @@ if(!is_file($cachePath.'/'.$pid)) { /////////////////////////////////////////////////////////////////////////////// //// EXECUTE IF VALID TIME (NOT DDOS) -if($timestamp[0] < strtotime(date('H:i'))) { +// mjamil | bug # 45229 - schedulers not able to run due to current time being equal to +// $timestamp[0] +if($timestamp[0] <= strtotime(date('H:i'))) { if(is_writable($cachePath.'/'.$pid)) { write_array_to_file('timestamp', array(strtotime(date('H:i'))) , $cachePath.'/'.$pid); require('modules/Schedulers/Scheduler.php'); diff --git a/data/SugarBean.php b/data/SugarBean.php index 268058a6..43dcc2bb 100644 --- a/data/SugarBean.php +++ b/data/SugarBean.php @@ -4327,8 +4327,9 @@ function save_relationship_changes($is_update, $exclude=array()) $this->modified_user_id = 1; } $query = "UPDATE $this->table_name set deleted=1 , date_modified = '$date_modified', modified_user_id = '$this->modified_user_id' where id='$id'"; - } else + } else { $query = "UPDATE $this->table_name set deleted=1 , date_modified = '$date_modified' where id='$id'"; + } $this->db->query($query, true,"Error marking record deleted: "); $this->deleted = 1; $this->mark_relationships_deleted($id); diff --git a/download.php b/download.php index 834f74d8..28ea7a5c 100644 --- a/download.php +++ b/download.php @@ -42,6 +42,7 @@ if(empty($_REQUEST['id']) || empty($_REQUEST['type']) || !isset($_SESSION['authe die("Not a Valid Entry Point"); } else { + $file_type=''; // bug 45896 ini_set('zlib.output_compression','Off');//bug 27089, if use gzip here, the Content-Length in hearder may be incorrect. // cn: bug 8753: current_user's preferred export charset not being honored $GLOBALS['current_user']->retrieve($_SESSION['authenticated_user_id']); @@ -103,8 +104,15 @@ else { } // if - $local_location = (isset($_REQUEST['isTempFile'])) ? "{$GLOBALS['sugar_config']['cache_dir']}/modules/Emails/{$_REQUEST['ieId']}/attachments/{$_REQUEST['id']}" - : $GLOBALS['sugar_config']['upload_dir']."/".$_REQUEST['id']; + $local_location = $GLOBALS['sugar_config']['upload_dir']."/".$_REQUEST['id']; + if (isset($_REQUEST['isTempFile'])) + { + $local_location = $GLOBALS['sugar_config']['cache_dir'].'/modules/Emails/'; + if (isset($_REQUEST['ieId'])) { + $local_location .= $_REQUEST['ieId'].'/'; + } + $local_location .= 'attachments/'.$_REQUEST['id']; + } if(isset($_REQUEST['isTempFile']) && ($_REQUEST['type']=="SugarFieldImage")) { $local_location = $GLOBALS['sugar_config']['upload_dir']."/".$_REQUEST['id']; @@ -149,7 +157,11 @@ else { } else if(isset($_REQUEST['isTempFile']) && ($_REQUEST['type']=="SugarFieldImage")) { $download_location = $local_location; - $name = $_REQUEST['tempName']; + $name = ''; + if (isset($_REQUEST['tempName'])) + { + $name = $_REQUEST['tempName']; + } } if(isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/MSIE/", $_SERVER['HTTP_USER_AGENT'])) diff --git a/export.php b/export.php index c362c163..d0c50263 100644 --- a/export.php +++ b/export.php @@ -70,7 +70,7 @@ header("Content-transfer-encoding: binary"); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT" ); header("Last-Modified: " . TimeDate::httpTime() ); header("Cache-Control: post-check=0, pre-check=0", false ); -header("Content-Length: ".strlen($content)); +header("Content-Length: ".mb_strlen($GLOBALS['locale']->translateCharset($content, 'UTF-8', $GLOBALS['locale']->getExportCharset()))); print $GLOBALS['locale']->translateCharset($content, 'UTF-8', $GLOBALS['locale']->getExportCharset()); diff --git a/files.md5 b/files.md5 index a5a9965b..39d03791 100644 --- a/files.md5 +++ b/files.md5 @@ -1,5 +1,5 @@ 'd3f150e4a5bed444763ebe8a81742a95', './.htaccess' => 'd41d8cd98f00b204e9800998ecf8427e', @@ -1169,7 +1169,7 @@ $md5_string = array ( './themes/Sugar5/css/print.css' => '041ba7c460d78a693301c7061139af89', './themes/Sugar5/css/deprecated.css' => '872d2ee2f45eb595825646cb39a82fab', './themes/Sugar5/css/chart.css' => '493edb0e181f685fd595c483d09012fb', - './sugar_version.php' => 'fab53e4e5da1121b88038d36dad26d8b', + './sugar_version.php' => '24976df6d251e267aded11031bc3227b', './soap/SoapTypes.php' => 'f38a0ac79874c8a3e126d728bd05e00a', './soap/SoapSugarUsers.php' => 'aec5ba181325721fa9e6da7e6a787687', './soap/SoapStudio.php' => '2f424bab502055acae4131df64465e0c', @@ -1211,20 +1211,19 @@ $md5_string = array ( './service/example/Rest_Proxy.php' => 'f8873a8fe88e4a7be8576f379e4963bc', './service/core/webservice.php' => '6fb48213b39f1b4da200929397c3deb1', './service/core/WSDL.tpl' => 'd41d8cd98f00b204e9800998ecf8427e', - './service/core/SugarWebServiceImpl.php' => '5cacfba48983139749b098d4dbdf9647', + './service/core/SugarWebServiceImpl.php' => '9b3fdfab4f240355ef22385294aaff25', './service/core/SugarWebService.php' => '4b77cfb754dcdebed48f0697b3c9f67a', './service/core/SugarSoapService.php' => '9843f9f203f3e0bc634badeca3be794c', './service/core/SugarRestUtils.php' => 'ddebba71abb25182a7769061862797ae', './service/core/SugarRestServiceImpl.php' => '18ab35c13544baa4fe716711cc541f62', './service/core/SugarRestService.php' => '5fc2c42a483676e6afc251174485f0c2', - './service/core/SoapHelperWebService.php' => '76dbd6bb240fb8b5bb2e749f0979f549', + './service/core/SoapHelperWebService.php' => 'f0d6fdd0ee012f78a2f9eed5bf132c23', './service/core/REST/SugarRestSerialize.php' => 'f80614ee5bc7e2f4a23460bbcc8c3eb8', './service/core/REST/SugarRestRSS.php' => 'eabfddaa4a65c3643f65ecab9f23c4bd', './service/core/REST/SugarRestJSON.php' => 'b3750c1987e8071bb3ad8296d9b4d5fa', './service/core/REST/SugarRest.php' => '7d4f007d66668ca9377fce1f34f94d27', './service/core/PHP5Soap.php' => '598eeeefcc5ed1276020bfe6fa7c4451', './service/core/NusoapSoap.php' => 'e533d700071eafffd2ebfd1e28b2b735', - './vcal_server.php' => '0451673dbbdf49126114fd314ef2a894', './robots.txt' => 'f71d20196d4caf35b6a670db8c70b03d', './removeme.php' => '750092ac2fec3ba2f04f0bff27bec33d', './pdf.php' => 'cc6788d5e02f50b1812ddb2ff3eb3703', @@ -1268,10 +1267,11 @@ $md5_string = array ( './modules/Users/PasswordRequirementBox.js' => '3cfa4025dc373a7e065cf8a11ab812a0', './modules/Users/User.js' => '6b09906cad1a804cb6969e553c2bc4ff', './modules/Users/login.js' => '7a504860a02eaebfdf1a9a7f9578dcc7', + './modules/Users/DetailView.tpl' => '8606bcec7d757a75345aff8f8bf86a0a', './modules/Users/views/view.wizard.php' => '835338a6bbf0fd03bd9827492cf19337', './modules/Users/views/view.list.php' => '8bc5a879644c94372a52d240cb7ecb03', - './modules/Users/vardefs.php' => 'fb892f832936653d5321bedcfb653507', - './modules/Users/tpls/wizard.tpl' => 'ee3dbe723e09fe6626a4c77084a8eedb', + './modules/Users/EditView.tpl' => '5b277e0b4fee85906e718c79d3c40936', + './modules/Users/tpls/wizard.tpl' => 'bc2be934816e4249512626abf18d2f99', './modules/Users/reassignUserRecords.php' => 'cd6548bd2a6d23217f065a4223071983', './modules/Users/password_utils.php' => '614d9ea87a83d7c210bbfe585908b870', './modules/Users/metadata/subpanels/default.php' => '8ccd5a2436c48f152588bd59e6c6bcb0', @@ -1287,8 +1287,8 @@ $md5_string = array ( './modules/Users/metadata/popupdefs.php' => '0372e0370745358af86d41aef6451901', './modules/Users/metadata/listviewdefs.php' => '95332a36771e76e5e2edd4cdcaf4f604', './modules/Users/metadata/SearchFields.php' => '110f0aa503a041056fdfd3c20bbb18fc', - './modules/Users/login.tpl' => '6de6b9ab4e1ddf56997fcfa66ca08ac2', - './modules/Users/login.css' => '12d8483e8f6da8e1a95d54b1b50d0ec9', + './modules/Users/EditView.php' => 'fc3a145f61c7b4c7dfcc3338672a2ae8', + './modules/Users/vardefs.php' => 'fb892f832936653d5321bedcfb653507', './modules/Users/language/en_us.lang.php' => '22a5e8386ce20959eb167d62aea2c2e0', './modules/Users/field_arrays.php' => '3c31038add3a77287e815bc5a7a7a609', './modules/Users/controller.php' => '80b928a09b15d4c9df8904317880974f', @@ -1313,28 +1313,27 @@ $md5_string = array ( './modules/Users/authentication/AuthenticationController.php' => 'aaf8b1b02587242110c14e247fda5c1e', './modules/Users/UserSignatureEditView.html' => '892d745adb145d74bde512c71e30732c', './modules/Users/UserSignature.php' => '23592719467cc4e04be189c6fa2d30db', - './modules/Users/User.php' => '2b71ffe04948e23f5b1558af3781e5f9', - './modules/Users/SetTimezone.tpl' => 'f76851063b5129bcae41e7bef962636f', - './modules/Users/SetTimezone.php' => '2fc96607e206886451fb5fe55f5526fd', + './modules/Users/login.tpl' => '6de6b9ab4e1ddf56997fcfa66ca08ac2', + './modules/Users/DetailView.php' => '3f8ee5e2c1c4f99e8e7ee01141f95cf5', + './modules/Users/login.css' => '12d8483e8f6da8e1a95d54b1b50d0ec9', + './modules/Users/User.php' => 'e02d8e23efb0168b7ba432f990d6f0cd', './modules/Users/SaveTimezone.php' => 'c12559f852fb8d89a269814e808dadc5', './modules/Users/SaveSignature.php' => '2f8bfdb6f88dce867100a761366d0391', - './modules/Users/Save.php' => '0bce18dac108a3aa3518f5fcae8b9d0a', - './modules/Users/Popup_picker.html' => '1160ad9218e2e8933b49f4ac1b695261', + './modules/Users/SetTimezone.tpl' => 'f76851063b5129bcae41e7bef962636f', './modules/Users/Popup_Users_picker.html' => '67411ba406dc06c63dc1b9eca6e55eca', './modules/Users/PopupUsers.php' => '5da32a565d9639eb42ab47e2d3330c08', - './modules/Users/PopupSignature.php' => 'd9c4749eea3254af4bbef1d83736309c', + './modules/Users/SetTimezone.php' => '2fc96607e206886451fb5fe55f5526fd', './modules/Users/PasswordRequirementBox.css' => '57efa45544952eead6155719254e03c1', + './modules/Users/Save.php' => '0bce18dac108a3aa3518f5fcae8b9d0a', + './modules/Users/Popup_picker.html' => '1160ad9218e2e8933b49f4ac1b695261', + './modules/Users/ListRoles.php' => '9833b76bd6bd4889285b4b4a6b933849', + './modules/Users/PopupSignature.php' => 'd9c4749eea3254af4bbef1d83736309c', './modules/Users/Menu.php' => '6e9d3948eb98bae4194a0a6544834165', + './modules/Users/Error.php' => '62f9d5788e4663b84e030c4eaba3e8b3', './modules/Users/Logout.php' => '5c819754b90e62e2f1739971144b01a6', - './modules/Users/Login.php' => '18a89cfecf8e050a14f2586b05081548', - './modules/Users/ListRoles.php' => '9833b76bd6bd4889285b4b4a6b933849', + './modules/Users/Login.php' => 'd8459a87d2e6c7d654a6d223972fb466', './modules/Users/GeneratePassword.php' => 'cd550ab172dc3dcbb715221ec97469a0', './modules/Users/Forms.php' => '90b591c94157299485166b686f6a977d', - './modules/Users/Error.php' => '62f9d5788e4663b84e030c4eaba3e8b3', - './modules/Users/EditView.tpl' => '3f17c8379f1dedbd64b32e481cd56b9f', - './modules/Users/EditView.php' => 'fc3a145f61c7b4c7dfcc3338672a2ae8', - './modules/Users/DetailView.tpl' => '8606bcec7d757a75345aff8f8bf86a0a', - './modules/Users/DetailView.php' => '3f8ee5e2c1c4f99e8e7ee01141f95cf5', './modules/Users/Changenewpassword.tpl' => '65a02130fbb6caabd2b662ca70bae9fd', './modules/Users/Changenewpassword.php' => '80cd1b05144aecdc382d9e50ec7efb1a', './modules/Users/ChangePassword.php' => 'e4161c571295ad4635ff66ff5e4cfc7b', @@ -1348,7 +1347,7 @@ $md5_string = array ( './modules/UpgradeWizard/upgradeWizard.js' => '3ca941da793c30a8a4e913624071166e', './modules/UpgradeWizard/UpgradeRemoval.php' => 'f8f4d6102a0cdc17d48444372a6ed2d8', './modules/UpgradeWizard/uw_main.tpl' => '898039c49451aefbef0bfdece6c43f3b', - './modules/UpgradeWizard/uw_utils.php' => '42f4f591431dc2dbc45762d01f7f6f66', + './modules/UpgradeWizard/uw_utils.php' => '75ccaa46f18d59148794a272d655df48', './modules/UpgradeWizard/uw_emptyFunctions.php' => 'fc09ce5db1b1aacd792140ceadc9ccd2', './modules/UpgradeWizard/uw_files.php' => '0b16b9d7181ac363d19aa43b8c50090b', './modules/UpgradeWizard/upload.php' => 'dcc4f893338f9ad97e236b7b39bd28cc', @@ -1399,12 +1398,12 @@ $md5_string = array ( './modules/Trackers/config.php' => '0d9d21c011d9f3585e1bcb51047b6982', './modules/Trackers/populateSeedData.php' => 'b3ee5dcf1d99bfa9f9001e9e0c7adffe', './modules/Trackers/TrackerManager.php' => '5158e9662c615adeeae75912673f96a5', - './modules/Trackers/Tracker.php' => '7946d873aaf1e312e0a096603b9865a9', + './modules/Trackers/Tracker.php' => '521667c3c0aa2598aea88a89ab4f7ea4', './modules/Trackers/Trackable.php' => '625d62167dfeec77822ab640f23cc2f6', './modules/Trackers/Metric.php' => 'b2fe3a0da872c9b6b22c208f356dc6f7', - './modules/Trackers/BreadCrumbStack.php' => '7358bcb903cd158938ddce8d855c748a', + './modules/Trackers/BreadCrumbStack.php' => '5bb356798b059c8b882f371d44efa584', './modules/Tasks/views/view.edit.php' => 'b3407d67d7c3cc4b835bd66b2e802c86', - './modules/Tasks/vardefs.php' => 'fc2ec749de6e290b7e6e882dcf1fdd83', + './modules/Tasks/vardefs.php' => '7b349f428812c11fc4ff5dfde48ff8a4', './modules/Tasks/tpls/QuickCreate.tpl' => 'cc473787ebe1f4c7dfba17268bd2e1e1', './modules/Tasks/metadata/subpaneldefs.php' => 'b55eba643229a90c021abfa15caccf37', './modules/Tasks/metadata/subpanels/default.php' => '6aa5aad5295409fc898bae85d5c501d0', @@ -1422,7 +1421,7 @@ $md5_string = array ( './modules/Tasks/language/en_us.lang.php' => 'ec9bfc50f2edafae18884f490b1521bc', './modules/Tasks/field_arrays.php' => '9869facdbe32bc0551b9ec7429671848', './modules/Tasks/TasksQuickCreate.php' => '8df028b5cde8de961c6d94574f3c860e', - './modules/Tasks/Task.php' => '2d387c6beb66bd72d55a2c520ba27338', + './modules/Tasks/Task.php' => '3373405068978da7e0c937b4cfabe219', './modules/Tasks/Save.php' => '87926f8aefc476572a32c4af581298af', './modules/Tasks/MyTasks.php' => 'b8da620a87eee61e0b6b50421eb9590b', './modules/Tasks/MyTasks.html' => '58c3695222bf9a745f2b2f4f5d52ae90', @@ -1479,12 +1478,12 @@ $md5_string = array ( './modules/Studio/Forms.php' => '643a41668f378fdfcf340eacff957880', './modules/Studio/DropDowns/EditView.tpl' => 'cba2195e86a4f1480dfbb1c189c58c3d', './modules/Studio/DropDowns/EditView.php' => 'cfa36bf9fb56414ee9706fe4be586ce2', - './modules/Studio/DropDowns/DropDownHelper.php' => 'a57838b57c14a159939b0cac2bfdf41f', + './modules/Studio/DropDowns/DropDownHelper.php' => 'dfbfc7cc9a20694a3eb4a4d8845c93d3', './modules/SchedulersJobs/vardefs.php' => 'a01a32929146b1fcffc1f344cac76b65', './modules/SchedulersJobs/metadata/subpanels/default.php' => 'f3cf4560886a3feb95495607613f83e4', './modules/SchedulersJobs/language/en_us.lang.php' => 'e2ad9c5aa5d9411f633472ad5a833825', './modules/SchedulersJobs/field_arrays.php' => 'f0decfc7674132c67f7bc2679d2fa798', - './modules/SchedulersJobs/SchedulersJob.php' => '856369cc8b873f74325d5300797aad3d', + './modules/SchedulersJobs/SchedulersJob.php' => '6c9bab393fac8dfa0b3f7541d6db5dfa', './modules/Schedulers/vardefs.php' => 'b22dc28f445bd76192a98b92eb5a1c9f', './modules/Schedulers/metadata/subpanels/default.php' => '0fa97427b4326367097ceca6bf17071f', './modules/Schedulers/metadata/subpaneldefs.php' => '11cf00d568cc8990f83b9c72282571ee', @@ -1493,7 +1492,7 @@ $md5_string = array ( './modules/Schedulers/field_arrays.php' => 'd4dd0e9a487e50cc1e3937edf28d4851', './modules/Schedulers/_AddJobsHere.php' => 'deb98781e316c0883b0e1cc6813cd5e3', './modules/Schedulers/SchedulerDaemon.php' => '0fe85dd3ab4b9dc4132e0ae782ebce90', - './modules/Schedulers/Scheduler.php' => '4dd4935781983afef13aae5b749ffb29', + './modules/Schedulers/Scheduler.php' => 'd8e8aa2e8de94254e2364b28eca9a1cf', './modules/Schedulers/Scheduled.php' => 'a4f070fb20dde6617eb49fceefbb195f', './modules/Schedulers/Scheduled.html' => '998aaba0c83416168b78a2cc0124d678', './modules/Schedulers/Save.php' => '9ae861c83f40d3ac45083f796b2ac97c', @@ -1514,7 +1513,7 @@ $md5_string = array ( './modules/SavedSearch/field_arrays.php' => '0a3131ce56bc5e314f82f99535ba7f0f', './modules/SavedSearch/UpgradeSavedSearch.php' => '1ea269671af4dd80cb2edfcc6c220d6c', './modules/SavedSearch/SearchForm.html' => 'b459847986a5a78033744d2ac2fd83b8', - './modules/SavedSearch/SavedSearchSelects.tpl' => 'c39f005f3f1456d0c403e7b1b5c29aec', + './modules/SavedSearch/SavedSearchSelects.tpl' => 'b7caafc55f6366f78048882c66d6889e', './modules/SavedSearch/SavedSearchForm.tpl' => 'e1b30f7f970a53e8fbdf59c56594992a', './modules/SavedSearch/SavedSearch.php' => '32a5293b4fa7b75a8a7fe72c4e9978af', './modules/SavedSearch/Menu.php' => 'dc4c7a6e251fafed9e02fdedeadb6de1', @@ -1530,7 +1529,7 @@ $md5_string = array ( './modules/Roles/field_arrays.php' => 'fac77f97d3bbdad7feb595b412cf78b5', './modules/Roles/SubPanelViewUsers.php' => '399c85409db3e9e251842660956e2d9f', './modules/Roles/SubPanelViewUsers.html' => '213e193c48ca52f90a3fe922eb7623fb', - './modules/Roles/SaveUserRelationship.php' => '30bb63f6e0da0d768b22004917a1cdab', + './modules/Roles/SaveUserRelationship.php' => '1b8a6e9033af80ebe7902dffdf7c944d', './modules/Roles/Save.php' => '59dae0c9865cbb102cf03080d542834a', './modules/Roles/Role.php' => 'ce677ccbdb0a6a8569a26706ec7388b1', './modules/Roles/Menu.php' => '6c50f81b3d763e5bf50e5152c43fca8f', @@ -1539,7 +1538,7 @@ $md5_string = array ( './modules/Roles/EditView.html' => '35858528fe4641940007ab9c2ecd1f54', './modules/Roles/DetailView.php' => '3d199271d09898288c373a38e391058d', './modules/Roles/DetailView.html' => '9c5d8c267a781c6fa54cbcea8f6b7f27', - './modules/Roles/DeleteUserRelationship.php' => '12f81332f5c5011dc78db89cb2025431', + './modules/Roles/DeleteUserRelationship.php' => 'ac25f89238aca46e7c5ff55a5c48529e', './modules/Roles/Delete.php' => '352ec22d2eb88ab05412ff2cc91e476f', './modules/Releases/vardefs.php' => '6d44d6ed56d9e1da4504451e736fce53', './modules/Releases/language/en_us.lang.php' => '89f2b11fdce83fbbd5d7273e7a1d71a1', @@ -1627,7 +1626,7 @@ $md5_string = array ( './modules/ProjectTask/Save.php' => 'd1a87b0fbe38bcd6c3024871b61d3251', './modules/ProjectTask/ProjectTaskQuickCreate.php' => '9e22afc763a7461aae6ac12f0da9672d', './modules/ProjectTask/vardefs.php' => '5b4cf6dad9a98cc9ca0d125f9a72fcaf', - './modules/ProjectTask/ProjectTask.php' => '5330b1754f27ff2013e5d11a98e41dc3', + './modules/ProjectTask/ProjectTask.php' => 'e663b10b87cb5f9c7178635fe0d056a5', './modules/ProjectTask/Popup_picker.html' => '361f855dacedadd41f50b2305ef63ef9', './modules/ProjectTask/MyProjectTasks.php' => 'beb50630e8c111fc22db6c99bc24e7cb', './modules/ProjectTask/MyProjectTasks.html' => 'ffd4e103720ddbbc0841c63fdc16128f', @@ -1659,7 +1658,6 @@ $md5_string = array ( './modules/Project/metadata/additionalDetails.php' => '4da1e430fcca6ec985567aac8eb695e6', './modules/Project/metadata/SearchFields.php' => 'ca8b58e6c4afd5d254e1fd7110202786', './modules/Project/language/en_us.lang.php' => '4ee764cdd17fdf9de8860ea0ca0bb00c', - './modules/Project/gantt.css' => 'ec0de246bbacdb5b8831ae45f1160f84', './modules/Project/field_arrays.php' => 'd8e855b0d74739d70979073507e6be70', './modules/Project/action_view_map.php' => 'a7a8e30d48d654d43b19c11a883339dc', './modules/Project/SubPanelView.php' => '634feb071966461b4db22fc2bd058386', @@ -1727,13 +1725,13 @@ $md5_string = array ( './modules/Notes/metadata/subpanels/default.php' => '95de5ea759961356b3221bd39abf977e', './modules/Notes/metadata/subpanels/ForHistory.php' => 'dad1addf6074a5e893cb6e425fbc31c4', './modules/Notes/metadata/studio.php' => '97fb182348172339a2e6c240dcf1e604', - './modules/Notes/metadata/searchdefs.php' => '261de884a79200bd98731c5f540eca03', + './modules/Notes/metadata/searchdefs.php' => '6d29bc0b38ffdb630b5c38e8db242e23', './modules/Notes/metadata/quickcreatedefs.php' => 'cb7f0142cb071cf3e89cf301b43418a4', './modules/Notes/metadata/listviewdefs.php' => '34550d6fffdc0f5767404e1583b006d3', './modules/Notes/metadata/editviewdefs.php' => '4199826de1152224e850269887796e35', './modules/Notes/metadata/detailviewdefs.php' => 'c9991544e69bc5369b9771a432354a4c', './modules/Notes/metadata/additionalDetails.php' => '47f61f0e9f69fc808d3cfbee124620b8', - './modules/Notes/metadata/SearchFields.php' => 'c210c4f08b81c4fb689f869f9775d744', + './modules/Notes/metadata/SearchFields.php' => '9a8f9bb1cf31a1d0fd3fe74e49364e49', './modules/Notes/language/en_us.lang.php' => 'f0d4a00b13d430a6b484f1db5c551502', './modules/Notes/field_arrays.php' => '463c08bd1cf6d96a42d2a1758a5b0e8a', './modules/Notes/controller.php' => '256cbdb7a767232ff340330240ee2a1c', @@ -1781,7 +1779,7 @@ $md5_string = array ( './modules/ModuleBuilder/tpls/resetModule.tpl' => '61597ccd042c1e6ff988fc904e6519ed', './modules/ModuleBuilder/tpls/main.tpl' => '8862d14b4c6989a99013640a9a1f4c02', './modules/ModuleBuilder/tpls/listView.tpl' => '7ca848e3ae581e3c293883dbec267751', - './modules/ModuleBuilder/tpls/layoutView.tpl' => '2d9ce0eb871c8ecd7665a3c3580db17b', + './modules/ModuleBuilder/tpls/layoutView.tpl' => '7f4500a6dcc10110b1d79dca9255ca1b', './modules/ModuleBuilder/tpls/labels.tpl' => 'd5108823a1248fbf1e52c770f00e332e', './modules/ModuleBuilder/tpls/index.tpl' => '74b88786aaa5254e0ef3ef98ec2a727d', './modules/ModuleBuilder/tpls/includes.tpl' => '308f7703d505391d03d58b592c919152', @@ -1814,20 +1812,20 @@ $md5_string = array ( './modules/ModuleBuilder/parsers/views/UndeployedSubpanelImplementation.php' => 'c1f61c27c48ed83a04231cacf2cbadfd', './modules/ModuleBuilder/parsers/views/UndeployedMetaDataImplementation.php' => '87c39c5818423ac119f20c9f44b11de8', './modules/ModuleBuilder/parsers/views/SubpanelMetaDataParser.php' => 'a658fb64f32eae269f0aeec0cc271f22', - './modules/ModuleBuilder/parsers/views/SearchViewMetaDataParser.php' => '1d264a211116114f0adfd780b9ae9872', + './modules/ModuleBuilder/parsers/views/SearchViewMetaDataParser.php' => '038ed5309b7968dcad03255a2baa3c99', './modules/ModuleBuilder/parsers/views/PopupMetaDataParser.php' => '7e61b8b2042be68aa084f97950140e18', './modules/ModuleBuilder/parsers/views/MetaDataParserInterface.php' => '64976a9f4a851bbb2e597e8a9cbb68b6', './modules/ModuleBuilder/parsers/views/MetaDataImplementationInterface.php' => '3bb6fa231da65dbb1369b536858818f1', - './modules/ModuleBuilder/parsers/views/ListLayoutMetaDataParser.php' => 'c49e5a25670037e3e8b8d081df924ee4', + './modules/ModuleBuilder/parsers/views/ListLayoutMetaDataParser.php' => '83a8d6b075607d7fe9c0bbd0e7273ebf', './modules/ModuleBuilder/parsers/views/HistoryInterface.php' => 'c1583f28fddb4c33c920f92a20e2c935', - './modules/ModuleBuilder/parsers/views/History.php' => 'cb762b148ad023d6ec3ba6440ea9df5e', - './modules/ModuleBuilder/parsers/views/GridLayoutMetaDataParser.php' => 'dde15ca691e9b28a988a3b47dd0e37c3', + './modules/ModuleBuilder/parsers/views/History.php' => '05dac0ef2a4568eab65e4bc7e51005f6', + './modules/ModuleBuilder/parsers/views/GridLayoutMetaDataParser.php' => 'e1a231ac6e1ab2c138f0c9905b11c16a', './modules/ModuleBuilder/parsers/views/DeployedSubpanelImplementation.php' => '24a957dc22e693e21dd18541e3584807', './modules/ModuleBuilder/parsers/views/DeployedMetaDataImplementation.php' => 'f038a0d67cfb341d627e5a1c9e8607c3', './modules/ModuleBuilder/parsers/views/DashletMetaDataParser.php' => '8fca44b08dc035a1d23463b26344df72', './modules/ModuleBuilder/parsers/views/AbstractMetaDataParser.php' => '720c63061f2e8be613423dd9a706dfbd', './modules/ModuleBuilder/parsers/views/AbstractMetaDataImplementation.php' => '96163c88a133c445b47980379e569b4d', - './modules/ModuleBuilder/parsers/relationships/UndeployedRelationships.php' => 'cd50b43f66752799c75d3af238b8a004', + './modules/ModuleBuilder/parsers/relationships/UndeployedRelationships.php' => '7852fd0eb836f9641e190260e13c7201', './modules/ModuleBuilder/parsers/relationships/RelationshipsInterface.php' => '5673bbca1c4d58866069201f7276f957', './modules/ModuleBuilder/parsers/relationships/RelationshipFactory.php' => '60921654dbc6f3dbbb44076036285e04', './modules/ModuleBuilder/parsers/relationships/OneToOneRelationship.php' => '57923bba0dac5e284c4f5398041349a8', @@ -1835,13 +1833,13 @@ $md5_string = array ( './modules/ModuleBuilder/parsers/relationships/ManyToOneRelationship.php' => '7e1ada555d2dc725e4ce9ec4f6f6ae62', './modules/ModuleBuilder/parsers/relationships/ManyToManyRelationship.php' => 'e6c965fda838b822992cf59433fce6e2', './modules/ModuleBuilder/parsers/relationships/DeployedRelationships.php' => 'b6a10c0d7f07a62b99671d98a8d37644', - './modules/ModuleBuilder/parsers/relationships/ActivitiesRelationship.php' => 'd478536f9d79c1e1cb16c558c23ff98e', + './modules/ModuleBuilder/parsers/relationships/ActivitiesRelationship.php' => 'e54641d4126d374f494a6f7f76c2176b', './modules/ModuleBuilder/parsers/relationships/AbstractRelationships.php' => 'ba07848ec2625ba93c007bdd16d7f69b', './modules/ModuleBuilder/parsers/relationships/AbstractRelationship.php' => '262e161681a68ca60608289573ea187f', './modules/ModuleBuilder/parsers/parser.modifysubpanel.php' => 'b26c368fe0ded3b67f1d83f33795454b', './modules/ModuleBuilder/parsers/parser.modifylistview.php' => 'cb76fbefd131ce1e5d71c19d565df204', './modules/ModuleBuilder/parsers/parser.modifylayoutview.php' => 'd5383c342e65fcde7a628c339d0d6502', - './modules/ModuleBuilder/parsers/parser.label.php' => '9985c9d1016f9d16e1cb1a3b81b3ccc4', + './modules/ModuleBuilder/parsers/parser.label.php' => '3bf2f01463c74099bdf9eb66f2cafa52', './modules/ModuleBuilder/parsers/parser.dropdown.php' => 'b8daa4da875806fb37456c17c4d42840', './modules/ModuleBuilder/parsers/constants.php' => '0d876db28d336cabe3c44a06b8a8f780', './modules/ModuleBuilder/parsers/StandardField.php' => 'de8b8168336744386faa4fcd8eb3a8fa', @@ -1858,12 +1856,12 @@ $md5_string = array ( './modules/ModuleBuilder/javascript/SimpleList.js' => '2e347d21f35b115b36469b3cda00d930', './modules/ModuleBuilder/javascript/ModuleBuilder.js' => 'e877187d8e2151829c8cd90eca514532', './modules/ModuleBuilder/javascript/JSTransaction.js' => '2f20a4a72eaa8cbdf3053e24c5772ee5', - './modules/ModuleBuilder/controller.php' => '4075b2ed603582fc10b049773a1cac63', + './modules/ModuleBuilder/controller.php' => '3d65649fd77c526aa12146387a955fa5', './modules/ModuleBuilder/action_view_map.php' => 'fd1e0b87f5d325f06b2b743afa057999', './modules/ModuleBuilder/Module/StudioTree.php' => 'e29fed9b1f81766bda975d938eecd3ec', './modules/ModuleBuilder/Module/StudioModuleFactory.php' => '5860a0e60d39a69303a39df4ea188336', './modules/ModuleBuilder/Module/StudioModule.php' => '2874e799f025ab3afcc40c5a0f15ea69', - './modules/ModuleBuilder/Module/StudioBrowser.php' => 'a12897d3293acd37f50cff6663e1ca47', + './modules/ModuleBuilder/Module/StudioBrowser.php' => '6da2f872826086caad4759599f0f3203', './modules/ModuleBuilder/Module/MainTree.php' => '43824a340ebbce175fac3b60b7641efb', './modules/ModuleBuilder/Module/DropDownTree.php' => 'ab1f94e57c7ec0f1f2b0a37fa158eab5', './modules/ModuleBuilder/Module/DropDownBrowser.php' => '7cd759094f2018b86eb030b2f6286516', @@ -1913,7 +1911,7 @@ $md5_string = array ( './modules/Meetings/metadata/searchdefs.php' => '2bc913f3f67b7fa29cdab7e2623de325', './modules/Meetings/metadata/quickcreatedefs.php' => 'a88880e2e8f010ce030a947aaa33db30', './modules/Meetings/metadata/listviewdefs.php' => '5973b2f25ca38dba5645037276ee0b9d', - './modules/Meetings/metadata/editviewdefs.php' => '5c3aa33bba534dc21482704fc29de38c', + './modules/Meetings/metadata/editviewdefs.php' => 'c98e887159e7939a1d0b1cef28be6d5c', './modules/Meetings/metadata/detailviewdefs.php' => '7b516d8760f5116e112601c34b6a0e66', './modules/Meetings/metadata/additionalDetails.php' => 'b2b466a61eef5f8369d9587631399b3c', './modules/Meetings/metadata/SearchFields.php' => '8fb6299f50de078c3578938a29e6fc57', @@ -1925,13 +1923,14 @@ $md5_string = array ( './modules/Meetings/Menu.php' => 'c02aa7c2c0f7c80a3cd7ead56ca1fcfc', './modules/Meetings/MeetingsQuickCreate.php' => '818e55e261c5e74cb385f835311944fa', './modules/Meetings/MeetingFormBase.php' => '3d15b0c970848917b794542f6b460aa6', - './modules/Meetings/Meeting.php' => '390b291d07b1009d49f883ad2029bb03', - './modules/Meetings/Dashlets/MyMeetingsDashlet/MyMeetingsDashlet.php' => '6b020716c6c45705abf481f65ef7328b', + './modules/Meetings/Meeting.php' => '53270f7076564017c865297e5115dad2', + './modules/Meetings/Dashlets/MyMeetingsDashlet/MyMeetingsDashlet.php' => '861481e9fe5ea67f24bd104ae8e822ab', './modules/Meetings/Dashlets/MyMeetingsDashlet/MyMeetingsDashlet.meta.php' => 'e47f5ffe63b5a0fa7d7de49e41602428', './modules/Meetings/Dashlets/MyMeetingsDashlet/MyMeetingsDashlet.data.php' => '93411ffd890d557e5f97ed68b946f097', + './modules/MailMerge/controller.php' => '43d7cc4578e201dce6e48f4c141daa44', './modules/MailMerge/modules_array.php' => 'af9991bc9b3ff44c85e1b3f7b58999b0', './modules/MailMerge/language/en_us.lang.php' => '3b63d532d3c99f4a1335cd336b7601d6', - './modules/MailMerge/index.php' => '21076a939d7bf08f11baf16d6d625a9a', + './modules/MailMerge/index.php' => '542fef22e74fefe27f02a3ec1e6cc943', './modules/MailMerge/get_doc.php' => 'd81b9ec544c28fd1f27e8db046ed88c6', './modules/MailMerge/Step5.php' => '794c0f16757773d574f848bbd68ca8e6', './modules/MailMerge/Step5.html' => 'a379d9b1ace4201f2a160b0dda56c612', @@ -1940,8 +1939,8 @@ $md5_string = array ( './modules/MailMerge/Step3.php' => 'bfbc79b0927f0b615963d1118b96ddba', './modules/MailMerge/Step3.html' => '24d26c3c8eb46ded0f2adad4da479fea', './modules/MailMerge/Step2.php' => '6eff88823954aa10701d0c8526005868', - './modules/MailMerge/Step2.html' => '37f07d70fb1a00a8ccb77eb526b75458', - './modules/MailMerge/Step1.php' => 'f6ddfe7ec04be708a4b6251c25b1bd95', + './modules/MailMerge/Step2.html' => '4b02f6f18a865859cf88b18f1fb26f95', + './modules/MailMerge/Step1.php' => '2917edb58f1a61d7ab3574cc1d5547b7', './modules/MailMerge/Step1.html' => 'e47775cad8089fafc1ff8102632c9ab8', './modules/MailMerge/Save.php' => '6d3ccf9c3fc315c2001314975d9718fb', './modules/MailMerge/Merge.php' => '07e613e34ed6d04437345d6c8149f2b3', @@ -1952,13 +1951,13 @@ $md5_string = array ( './modules/MailMerge/DetailView.php' => '9657298f898e97dbc221c34f861a0f98', './modules/Leads/Lead.js' => '63dad96eb6c7c57fbb34dda409f790ce', './modules/Leads/views/view.list.php' => 'd716f0c0d6e4bb6118c811c0bbcd903c', - './modules/Leads/views/view.convertlead.php' => '0789be96d83f8248ea8ae4cb170ba9b6', - './modules/Leads/vardefs.php' => '24b064d465c8e10f58f37c73655ca718', + './modules/Leads/views/view.convertlead.php' => '340713b44be49275c5803163de08dc92', + './modules/Leads/vardefs.php' => '79fdb92ebbb0eb7af9e33019fcf8678f', './modules/Leads/tpls/QuickCreate.tpl' => 'f68b199a7a4b23111fa98042b0670859', './modules/Leads/tpls/DetailViewHeader.tpl' => 'ff0301b5f7beef3671e1174a249048ba', './modules/Leads/tpls/ConvertLeadHeader.tpl' => 'c85ad2735645cd40842d5b77a26ad997', './modules/Leads/tpls/ConvertLeadFooter.tpl' => '6af977d010658f42fcbe03615220d3be', - './modules/Leads/tpls/ConvertLead.tpl' => 'ed8ab01ab8c4dee1d6a30c2494ab93bd', + './modules/Leads/tpls/ConvertLead.tpl' => '869e2a491d61cf9e29e21e04002245a4', './modules/Leads/metadata/subpanels/default.php' => 'd10b56acc074aefcad6ee5fb27eb436d', './modules/Leads/metadata/subpanels/ForMeetings.php' => '7c73f4dc11531df7da6e6df7cbc24b20', './modules/Leads/metadata/subpanels/ForEmails.php' => '1b38f45c8243ce013ee7b03560d4a3b6', @@ -1967,11 +1966,11 @@ $md5_string = array ( './modules/Leads/metadata/studio.php' => '043ccc5842c87b4b842903076b2828ee', './modules/Leads/metadata/searchdefs.php' => '103018fd4a079a5030b9c26138d41e9d', './modules/Leads/metadata/quickcreatedefs.php' => 'df9000c66248ec1fc8e70669c3e3cd18', - './modules/Leads/metadata/popupdefs.php' => '0499b89c35755acabe82847298303c01', + './modules/Leads/metadata/popupdefs.php' => 'bb36afcc47744719714209a10184d547', './modules/Leads/metadata/listviewdefs.php' => '794b346da02f00cb21dcfbf754afb06e', './modules/Leads/metadata/editviewdefs.php' => '806ab34255a93f0c1f879a480567dcfb', './modules/Leads/metadata/detailviewdefs.php' => '926c6ae71170ef9e89ccb82ec19cb3aa', - './modules/Leads/metadata/convertdefs.php' => '2c811998bbb28ee1af289cf99d071792', + './modules/Leads/metadata/convertdefs.php' => '39e039d6cac50434b4672c21abd6d2c0', './modules/Leads/metadata/additionalDetails.php' => '8f933991ab86127ea4bce9ed1218f939', './modules/Leads/metadata/SearchFields.php' => 'ca3bf623903e74e23acd6ae5fb513952', './modules/Leads/language/en_us.lang.php' => '23dcb653394a581b2b43ae9d3b273591', @@ -2016,14 +2015,14 @@ $md5_string = array ( './modules/InboundEmail/InboundEmailTest.php' => '702038f3171c1bb612d4fff7cf0f765e', './modules/InboundEmail/InboundEmail.php' => '0f2e98db1f8f4388111f735b93326f2e', './modules/InboundEmail/EditView.php' => 'aef594532aa6ab776c4b3cc30b20a04d', - './modules/InboundEmail/EditView.html' => '7252f37c5372a5dd9989c212728cca98', + './modules/InboundEmail/EditView.html' => 'f3e57eeaa0b27d8fe3389d5c6923fdc5', './modules/InboundEmail/EditGroupFolder.php' => '6c6ba0d835901e8e9a8e87056d0479b6', './modules/InboundEmail/DetailView.php' => 'f838087f2c73b83a2deee755475be859', - './modules/InboundEmail/DetailView.html' => '065eb0891ad5444b24a6b9d38740b8eb', + './modules/InboundEmail/DetailView.html' => '2ac5191bfc333ddebc83f769a73c744f', './modules/InboundEmail/Delete.php' => '682ed772ec388482dbe7a599e9e56104', './modules/Import/ImportMapTab.php' => 'd179a9e67a3bbc6e8b408efd2e37252a', './modules/Import/views/view.undo.php' => 'f3eed66ae73427bab843bc3c4d429db0', - './modules/Import/views/view.step4.php' => 'b14ce839e39d3e834f2775356cfc6c22', + './modules/Import/views/view.step4.php' => '0650392af3b9d53e09eb8496afaf6f02', './modules/Import/views/view.step3.php' => '37847270b3445e2254096b3e4c9385fb', './modules/Import/views/view.step2.php' => '1836dd43ff036bf2396110df4a50eac2', './modules/Import/views/view.step1.php' => '5b07a3d7fa23553973e1ad802b04b667', @@ -2033,7 +2032,7 @@ $md5_string = array ( './modules/Import/tpls/undo.tpl' => '65cd1d29e39dc8487d9e558623461843', './modules/Import/tpls/step3.tpl' => 'f776acfe9d35a87237985bb1be16d292', './modules/Import/tpls/step2.tpl' => 'f7db6057913e3fcd8405e53677d16430', - './modules/Import/tpls/step1.tpl' => 'b435795f4726a12a3076f47feaff3b92', + './modules/Import/tpls/step1.tpl' => '1622b96b8e16ac85faad02e9f638aa1a', './modules/Import/tpls/last.tpl' => '84bb779c391262ad2fbb41a38e50cbd6', './modules/Import/tpls/error.tpl' => '8bfbddd3c2424d4a1b3670bd79c88e16', './modules/Import/language/en_us.lang.php' => '2e3bb401c11dc3f8cdc5a571c1f17ec1', @@ -2064,9 +2063,9 @@ $md5_string = array ( './modules/Home/dashlets.php' => 'a88f1d512af748e1a4aa34bfdb34f883', './modules/Home/UnifiedSearchAdvancedResults.tpl' => '65b6695a4b79dff0c7564665ac45355f', './modules/Home/UnifiedSearchAdvancedForm.tpl' => '69e1fc48e68332a049be43ba4d09eec1', - './modules/Home/index.php' => '9ab0944014426f3507a5b1214a1ecb3b', + './modules/Home/index.php' => '7fbddb27bee5b65fad61c17b46685203', './modules/Home/UnifiedSearchAdvanced.tpl' => '4d77c658b82caabfe76d1e9e6aab7249', - './modules/Home/UnifiedSearchAdvanced.php' => '1a9ae3dd850dbd0ec8947caf548e01b1', + './modules/Home/UnifiedSearchAdvanced.php' => '3a19fa7c2e840e04647a631127675f58', './modules/Home/TrainingPortal.tpl' => '484626736f0965c1c08cc8448f9f66f6', './modules/Home/TrainingPortal.php' => '5da63a36ba5d912e0792c9e33c237ee3', './modules/Home/UnifiedSearch.php' => '1ff91a6fed46f97f9eafc1bda78f7579', @@ -2152,7 +2151,7 @@ $md5_string = array ( './modules/Employees/Menu.php' => 'd243cd0453202d101d515f3337d786e3', './modules/Employees/Forms.php' => 'dcb0eca9d5e3c8d92c17b66976ddcf13', './modules/Employees/Error.php' => 'ce78eb822cb1508b923493e55f053122', - './modules/Employees/Save.php' => 'c40cd43574e4999569ab04c5c1ba2434', + './modules/Employees/Save.php' => '0a02115ace66b8d69960b0d4660fdfa3', './modules/Employees/Employee.php' => '19d7b5023b16ca97b1f4f3dde4b485b7', './modules/Emails/views/view.quickcreate.php' => '1baef44186ab0bc84e3d575c5537ccb5', './modules/Emails/views/view.modulelistmenu.php' => '647ceefc2936595192f0683ff27ce3d2', @@ -2182,7 +2181,7 @@ $md5_string = array ( './modules/Emails/templates/_createGroupFolder.tpl' => 'cd83288c1c4714252edfa78e85e390e6', './modules/Emails/templates/_blank.html' => '157012881cfc6fc266ec89296183b9e7', './modules/Emails/templates/_baseJsVars.tpl' => 'b3d376ef9423fa35c9ce6c2ac1698716', - './modules/Emails/templates/_baseEmail.tpl' => '7a8e6cc0f553f7a5c1139cf5dab68a08', + './modules/Emails/templates/_baseEmail.tpl' => 'a3c0a8d9f4a82ec3a542e92170932bc1', './modules/Emails/templates/_baseConfigData.tpl' => 'aa16b451f37ce04532f80175482ec87d', './modules/Emails/subpanels/ForUsers.php' => '9489a5ea6ed330d2cc068fbc0c35d00c', './modules/Emails/subpanels/ForQueues.php' => '0b2af9f4ecba910a48c51b4f3bf30455', @@ -2201,16 +2200,16 @@ $md5_string = array ( './modules/Emails/javascript/viewPrintable.js' => '1bdda43134bb2d9af593440981a353d1', './modules/Emails/javascript/vars.js' => 'd50d29d7a0083c3cc915440de136ecbf', './modules/Emails/javascript/init.js' => '00e6d04a2905243df25b58bc861ade03', - './modules/Emails/javascript/grid.js' => 'd0ec9cb5dd72f846ead99fcf1206d4c5', + './modules/Emails/javascript/grid.js' => 'e0eb97a08186791b83d587efb07f2475', './modules/Emails/javascript/email_popup_helper.js' => 'c43121fb00da2c9599a63c21ba0d82c0', './modules/Emails/javascript/displayOneEmailTemplate.js' => '2674507d7e9e7486d73c8706916ff1d0', './modules/Emails/javascript/composeEmailTemplate.js' => 'ea1469e2026811ebf263d49063971fc8', './modules/Emails/javascript/complexLayout.js' => 'fbcdb2d153ed8d495d095067ac792a47', './modules/Emails/javascript/ajax.js' => '62f8c69d48c09895c5b2f84f10279751', './modules/Emails/javascript/EmailUIShared.js' => 'e29adedf1480382aacc62d8aa7cebbca', - './modules/Emails/javascript/EmailUICompose.js' => '2d77c38749d40d5a9d78cfdfe523aa4e', + './modules/Emails/javascript/EmailUICompose.js' => '9e8f7d3ba0b8f915819faf93b79c78bb', './modules/Emails/javascript/EmailUI.js' => '1fb6751344ba44c13a4207aeac09006b', - './modules/Emails/javascript/Email.js' => '0171973017954855cacf4d6131e3cb34', + './modules/Emails/javascript/Email.js' => 'f004f426855262d2a949d5613056d7ed', './modules/Emails/index.php' => '6aff206a9821e1259275602982d900b8', './modules/Emails/images/sugarGroup.gif' => 'ad21210176b6a2a10a7a9b8f876ad83b', './modules/Emails/images/sugarDynamic.gif' => '82285d963771975b2def7f19e6438a8c', @@ -2233,7 +2232,6 @@ $md5_string = array ( './modules/Emails/SearchFormMyInbox.html' => 'aa22a1b305bade600c30cb3e9f8885d2', './modules/Emails/SearchFormGroupInbox.html' => '4b2f99a5397e5f07fdc500d621cc23da', './modules/Emails/SearchForm.html' => '60561bf737698077131d1adc93936b01', - './modules/Emails/Save.php' => 'a705062f91571a2606e9f4362493fbda', './modules/Emails/Popup_picker.php' => '0a565ac706b2a2adba1a92e451e2861b', './modules/Emails/Popup_picker.html' => 'e1007fcf6df3f84a04b243925f2ab397', './modules/Emails/PopupDocuments.php' => '620740641da9b96fb68e4331a89d7072', @@ -2251,13 +2249,13 @@ $md5_string = array ( './modules/Emails/ListViewDrafts.html' => 'f2596e8874ce149f0849ba620a47059e', './modules/Emails/Grab.php' => '1a2ae928706722eb9f4c7ffb4d975d88', './modules/Emails/GenerateQuickComposeFrame.php' => '9fa2162d2750f8dbc20a705909c353b3', - './modules/Emails/EmailUIAjax.php' => '9f1ccc5be981ff3803f5f7407f8bed72', + './modules/Emails/Save.php' => 'a705062f91571a2606e9f4362493fbda', + './modules/Emails/EmailUIAjax.php' => 'b9cadacaad8d63947790f8baa442eebb', './modules/Emails/EmailUI.php' => '4a84724f5f101fcd4e9f2e5a4ba360e5', './modules/Emails/EmailUI.css' => '6f93388627148bdc54c9458c434d7ec1', './modules/Emails/Email.php' => '41d07af157ef12df023cee3d06209145', - './modules/Emails/EditViewArchive.html' => '4542138077a248dc2c1bf1a48d0f283a', - './modules/Emails/EditView.php' => 'bbf3c6d659a6cb696cabe233db2bd313', - './modules/Emails/EditView.html' => '0610849d790684a1035c35fd8f48733f', + './modules/Emails/EditViewArchive.html' => 'b29b2deb170e9a9287ee0e1a2bf6bda9', + './modules/Emails/EditView.php' => '1bab8b3fb6b519c22d547322db034eb4', './modules/Emails/DetailViewSent.html' => '7b12fdf44a8a0acde69e36fa0341e149', './modules/Emails/DetailView.php' => 'a6ca96cb85ff388b617d17c23f4dc777', './modules/Emails/DetailView.html' => 'ec09f0f79d1361e5c6a372551ae55a9e', @@ -2274,21 +2272,21 @@ $md5_string = array ( './modules/EmailTemplates/metadata/SearchFields.php' => '105fa4840d4292ae01d9c5dc398fb5ba', './modules/EmailTemplates/language/en_us.lang.php' => 'a0fe946d46fc4b77c8226f5cf1ed4f0e', './modules/EmailTemplates/field_arrays.php' => '8abd7a27162510ce083f17e3e4d06125', - './modules/EmailTemplates/Save.php' => '9ce3021887d68e2fe0b8a785752c1ec0', + './modules/EmailTemplates/Save.php' => '570b559351060ec6a81e01a35213be28', './modules/EmailTemplates/PopupDocumentsCampaignTemplate.php' => '106659a099ce46c133d59e0c89a5119d', './modules/EmailTemplates/PopupDocumentsCampaignTemplate.html' => '8efe463d65710e6c6b5439235fd0b2c3', './modules/EmailTemplates/Menu.php' => '4edf25b2e9851ed5f2e8e44bb69b6863', './modules/EmailTemplates/EmailTemplateFormBase.php' => 'ffc958e5b7d90e6b5d80b1775973ad9a', './modules/EmailTemplates/EmailTemplate.php' => 'a1b2da557cb1680e5386da341ab42cbb', './modules/EmailTemplates/EditViewMain.html' => '2524b1d15a0f49b2ae59a068ae0e49af', - './modules/EmailTemplates/EditView.php' => '5b1f18d2e1f70de4881ba497b5611a5e', + './modules/EmailTemplates/EditView.php' => 'a569044944fcf405855bcaef16027399', './modules/EmailTemplates/EditView.html' => '1fc9440b3824a5b62b989e1ef1e7e524', './modules/EmailTemplates/DetailView.php' => 'db07295b7aa677874acba993c6f092fc', './modules/EmailTemplates/DetailView.html' => '45aae47f2d182de3335e72abe975e7f2', - './modules/EmailTemplates/Delete.php' => 'be4a379f832093ad36ce54cd95553ac1', + './modules/EmailTemplates/Delete.php' => '954d8dbbe3ee5c5dcf65b3da9eba54ab', './modules/EmailTemplates/CheckDeletable.php' => '6ead90762f5f5ffa27c60af51a5c65d6', './modules/EmailTemplates/AttachFiles.php' => 'c61e8930cfed0b005b0801b107415ab9', - './modules/EmailMarketing/vardefs.php' => 'b119830d58b934ccb4db5084729637b8', + './modules/EmailMarketing/vardefs.php' => '7a4e10e21a7771585ab40dd88433f55f', './modules/EmailMarketing/subpanels/default.php' => '1c5afd467c780943c36634673454d471', './modules/EmailMarketing/metadata/subpanels/default.php' => 'c01c31675c042c645179352beaeedbcf', './modules/EmailMarketing/metadata/subpaneldefs.php' => 'a9267a8ed04649970b0263d97e4016ef', @@ -2301,11 +2299,11 @@ $md5_string = array ( './modules/EmailMarketing/Forms.php' => 'dd23e1fab086a5eafba9a43240237671', './modules/EmailMarketing/EmailMarketing.php' => '33b918ed66881f4ec834e0d06f0583b1', './modules/EmailMarketing/EditView.php' => '06559bea7a3f850b2979159f63233d8b', - './modules/EmailMarketing/EditView.html' => 'c00edca87dadfcf1c9105a15b32fe5a8', + './modules/EmailMarketing/EditView.html' => '49cf3e34bfaa1118864b617db1523b87', './modules/EmailMarketing/DetailView.php' => '34354f70fb63917246723f3ca728eeb4', './modules/EmailMarketing/DetailView.html' => 'fa059c2dc675788d4afb9b7b1e61dbfa', './modules/EmailMarketing/Delete.php' => 'c086cb4ea3c7c61a9feb8e9ff7037aab', - './modules/EmailMan/controller.php' => '4108eee5588ca2719a2861f1c7544b1d', + './modules/EmailMan/controller.php' => '5f99d00336cfc4d58da8174010b4336a', './modules/EmailMan/EmailImage.php' => 'a31ccf962c840f3c613fac8cd397cf86', './modules/EmailMan/views/view.list.php' => 'd5de096088dccaf7dae5527489ab5825', './modules/EmailMan/views/view.config.php' => '57b38635350c47bd0fe995348d940c9b', @@ -2336,7 +2334,7 @@ $md5_string = array ( './modules/DynamicFields/templates/Fields/TemplateURL.php' => 'a34e2c6efd0bf39fe80209181e045172', './modules/DynamicFields/templates/Fields/TemplateTextArea.php' => 'cbd2f74d74bf8b8f086a17fcd5738093', './modules/DynamicFields/templates/Fields/TemplateText.php' => '60f8153acf442941c27c34b5050f194d', - './modules/DynamicFields/templates/Fields/TemplateRelatedTextField.php' => '4e006e55a10059bc5bc454b05f637dc8', + './modules/DynamicFields/templates/Fields/TemplateRelatedTextField.php' => '7262e772ab396258636c213db4a08e7a', './modules/DynamicFields/templates/Fields/TemplateRadioEnum.php' => 'd44812c4bc298cd070a8ff6917330268', './modules/DynamicFields/templates/Fields/TemplatePhone.php' => 'adda773907efe9b99563c473167f62d1', './modules/DynamicFields/templates/Fields/TemplateParentType.php' => '8bf57618db8a2da04325714d07947c3f', @@ -2401,7 +2399,7 @@ $md5_string = array ( './modules/DynamicFields/FieldViewer.php' => '53f662eab9401fd5a0b9f90c035fb13a', './modules/DynamicFields/FieldCases.php' => '7e9c75d4fcefca29f24033a0e8687f3c', './modules/DynamicFields/DynamicField.php' => '077660ef7d2af1cac486da687cc628f2', - './modules/Documents/documents.js' => '27b2aedb1597d9f13ee4410d295e45bd', + './modules/Documents/documents.js' => '8b00857d6e7b1f8dd1dbfbe68a6dee47', './modules/Documents/tpls/view.extdoc.tpl' => '5566d78f1a66a4a38d1d3dc93ece9c01', './modules/Documents/action_view_map.php' => '0994fe5e38b73c985fff200f9edb2129', './modules/Documents/DocumentExternalApiDropDown.php' => '05c03dc10f85d98ddc4c512d809f886a', @@ -2411,7 +2409,7 @@ $md5_string = array ( './modules/Documents/Dashlets/MyDocumentsDashlet/MyDocumentsDashlet.php' => '35404688fc59eb3737d89ca7432c3e76', './modules/Documents/Dashlets/MyDocumentsDashlet/MyDocumentsDashlet.meta.php' => '0fd71adbdb97e05acfa9e37f517fd47b', './modules/Documents/Dashlets/MyDocumentsDashlet/MyDocumentsDashlet.data.php' => '3842f658a0da2ca0f18564e6f7683bcd', - './modules/Documents/vardefs.php' => '33fa2c9c8bd1f96fff4374b2142bf671', + './modules/Documents/vardefs.php' => '55f64eee231a92c7ff061e6c447122e1', './modules/Documents/metadata/subpanels/default.php' => '094a811736e4674863bd5c832dd5730d', './modules/Documents/metadata/subpanels/ForContractType.php' => '1aa63508fbea18bbf6ccfaad4bb4737a', './modules/Documents/metadata/subpaneldefs.php' => '70dd233ce8f24edeb4b54a39185d5562', @@ -2456,8 +2454,9 @@ $md5_string = array ( './modules/Currencies/Forms.php' => '6d7619156646796d8463bb1e4e5acd01', './modules/Currencies/EditView.tpl' => '509a24e75df8bc565847458bf541f7fa', './modules/Currencies/EditCurrency.php' => 'dfe9ae276fb02bdae956146ee96edca0', - './modules/Currencies/Currency.php' => '8836a6a317a3b4ba4cb0aea00a5998e0', + './modules/Currencies/Currency.php' => '755c45d25d68d8fcacb381e8f9b14743', './modules/Contacts/Contact.js' => 'e503be995847cfaa74b80ec64deea115', + './modules/Contacts/views/view.quickcreate.php' => 'c427b1da2e3880b0ed90af832481170e', './modules/Contacts/views/view.list.php' => 'd5a51ad95c221ddaaaaca33c9b3acd1a', './modules/Contacts/views/view.validportalusername.php' => 'b85ab0a2b014d20d69c3c57c415148c4', './modules/Contacts/views/view.retrieveemail.php' => '6f810a4e68ef0c84d31aa433a03929a7', @@ -2481,7 +2480,7 @@ $md5_string = array ( './modules/Contacts/metadata/searchdefs.php' => 'fac0439eef3deb008e6efd6221518aab', './modules/Contacts/metadata/quickcreatedefs.php' => '205faf881d1fa51bb15a028b2a7fc694', './modules/Contacts/metadata/popupdefsEmail.php' => 'fd11faf66cef32a132271550332b769f', - './modules/Contacts/metadata/popupdefs.php' => '97388c3cd112007ae91627848db652f6', + './modules/Contacts/metadata/popupdefs.php' => '9feb48397be3aefd8bf5a642240e0fa2', './modules/Contacts/metadata/metafiles.php' => 'fc6c9afb233d2b11c5594c9cd90308a1', './modules/Contacts/metadata/listviewdefs.php' => 'ff21ec25012045a06895707c9b7ed97a', './modules/Contacts/metadata/editviewdefs.php' => 'e28d1eb0d5b947573ecef501dae48892', @@ -2491,11 +2490,11 @@ $md5_string = array ( './modules/Contacts/language/en_us.lang.php' => '1dd9782ef94980ee09bbb21ec2b50414', './modules/Contacts/field_arrays.php' => '15a260aba13a962b3f6135046f11c4e1', './modules/Contacts/controller.php' => '6607e948d272e5809461876a391cc5a1', - './modules/Contacts/vardefs.php' => '38409dcbae01f571b0d049b5131709f3', + './modules/Contacts/vardefs.php' => '11b1a70bea6761a34c72df6f8bc65ffe', './modules/Contacts/SugarFeeds/ContactFeed.php' => '1f16df8e3936e78b160a05091d5fdbc4', './modules/Contacts/ShowDuplicates.php' => '40fec13c96fe35316a6acdfa446a49f7', './modules/Contacts/ShowDuplicates.html' => '5c3bdbdbdb3ad22334e6b1ac7f844db7', - './modules/Contacts/SaveContactOpportunityRelationship.php' => '7912d8db70fe4a0b2ba89f322bfaac3e', + './modules/Contacts/SaveContactOpportunityRelationship.php' => 'ec59ca27f5916ed5370bb33c66701686', './modules/Contacts/Save.php' => '8463ae2addbf510c8e055b0ad11ec8c7', './modules/Contacts/Popup_picker.php' => '45b6af1ceb2c9e4383a66c3c92f58549', './modules/Contacts/Menu.php' => 'f36572cacfa49684129a128ccea372d9', @@ -2571,7 +2570,7 @@ $md5_string = array ( './modules/Configurator/views/view.addfontview.php' => '32bb28602335b418eafcd8bafb5e6fa9', './modules/Configurator/views/view.addfontresult.php' => '70babb45791ab15c7e7395aaa0ac8494', './modules/Configurator/tpls/fontmanager.tpl' => '748bd026b6862c287e0c4a6dd50e2e56', - './modules/Configurator/tpls/adminwizard.tpl' => 'a9e9c1302164f31afe482f341f75fac7', + './modules/Configurator/tpls/adminwizard.tpl' => '2287deb74c16bd18d2a4a6d22a5e0130', './modules/Configurator/tpls/addFontView.tpl' => '5da526b1ed5a0b3fc57caa4161d47b6d', './modules/Configurator/tpls/addFontResult.tpl' => '1e1475a7d057504ba22a4a30b65b6c36', './modules/Configurator/tpls/SugarpdfSettingsFields.tpl' => '80235a1d08cf36c5dfbd79c7de7152e8', @@ -2591,13 +2590,13 @@ $md5_string = array ( './modules/Charts/code/predefined_charts.php' => '6a4404edeae3091a3746afb1d8233522', './modules/Charts/code/Chart_pipeline_by_sales_stage.php' => '38a9ab7dd4fb2bd27dfded049f3623bc', './modules/Charts/code/Chart_pipeline_by_lead_source.php' => 'f2122f14cef82628bcd9880ba9d5943e', - './modules/Charts/code/Chart_outcome_by_month.php' => 'e57d9818b1db35542aae5adc23e2e7f9', + './modules/Charts/code/Chart_outcome_by_month.php' => '373a9c188a43f369e1a6f9235c868db8', './modules/Charts/code/Chart_my_pipeline_by_sales_stage.php' => '888a55f6f4cba78e79cdf83f9a8b3686', './modules/Charts/code/Chart_lead_source_by_outcome.php' => '03c5b66b6889dd210c630edf76d1c9b6', './modules/Charts/chartdefs.php' => '02ee313d69bac35fe9ebfe8f55abbbfd', './modules/Charts/PredefinedChart.php' => '3eadf51c0359527dd34fbe043fbadec5', './modules/Charts/Dashlets/PredefinedChartDashletScript.tpl' => '4343fcb9262e31fb1d7f08ae796c22c6', - './modules/Charts/Dashlets/PipelineBySalesStageDashlet/PipelineBySalesStageDashlet.php' => '807eb9ed5c99461ba1c8319a1ff4f027', + './modules/Charts/Dashlets/PipelineBySalesStageDashlet/PipelineBySalesStageDashlet.php' => '59e24fb966f59fc6fe0f70daf41ee23a', './modules/Charts/Dashlets/PipelineBySalesStageDashlet/PipelineBySalesStageDashlet.meta.php' => 'bf027380490a70f6bd274f85bf63b1ae', './modules/Charts/Dashlets/PipelineBySalesStageDashlet/PipelineBySalesStageDashlet.en_us.lang.php' => '859ada780282d5c3f76f1bba4ed77f0d', './modules/Charts/Dashlets/PipelineBySalesStageDashlet/PipelineBySalesStageDashlet.data.php' => '8a386f2e8fd39071ffdeeb99edd7d4db', @@ -2617,7 +2616,7 @@ $md5_string = array ( './modules/Charts/Dashlets/OpportunitiesByLeadSourceByOutcomeDashlet/OpportunitiesByLeadSourceByOutcomeDashlet.en_us.lang.php' => '84dd1947d0b39c89f4954187dbf2b567', './modules/Charts/Dashlets/OpportunitiesByLeadSourceByOutcomeDashlet/OpportunitiesByLeadSourceByOutcomeDashlet.data.php' => 'f711fbacb546bb81e5b21020bd2b7a5e', './modules/Charts/Dashlets/OpportunitiesByLeadSourceByOutcomeDashlet/OpportunitiesByLeadSourceByOutcomeConfigure.tpl' => '0ec1ce0cb710b0ca4e3f8c1993ff5f34', - './modules/Charts/Dashlets/MyPipelineBySalesStageDashlet/MyPipelineBySalesStageDashlet.php' => 'cd661711980c2aca38fc8566ae888502', + './modules/Charts/Dashlets/MyPipelineBySalesStageDashlet/MyPipelineBySalesStageDashlet.php' => 'bfd64e5a9f91216fd2ca1716eb4336d9', './modules/Charts/Dashlets/MyPipelineBySalesStageDashlet/MyPipelineBySalesStageDashlet.meta.php' => '58cec830044248857af942da47d02baf', './modules/Charts/Dashlets/MyPipelineBySalesStageDashlet/MyPipelineBySalesStageDashlet.en_us.lang.php' => '08b326839de5d8fee0fd32b845baa51f', './modules/Charts/Dashlets/MyPipelineBySalesStageDashlet/MyPipelineBySalesStageDashlet.data.php' => 'd2215a74cdd0d9988746deaa59a7bdcf', @@ -2655,12 +2654,14 @@ $md5_string = array ( './modules/Campaigns/DetailView.js' => 'd99f7c99ca8a7886d311b9131616513b', './modules/Campaigns/WebToLead.js' => '079c6e0a443138ff2203ca331e4b55e9', './modules/Campaigns/wizard.js' => '62f337f78016b8ca743aa61489863ad9', + './modules/Campaigns/TrackDetailView.tpl' => '3187e57b3476ef4387e76b385893027d', './modules/Campaigns/views/view.newsletterlist.php' => '6f52d2669b3d7afb03d6066d14d7631a', './modules/Campaigns/views/view.modulelistmenu.php' => '5a4ababf139b00c95705cfeba8abda74', './modules/Campaigns/views/view.detail.php' => 'c00b5e16a5c761196bd4762f3b2f0389', './modules/Campaigns/views/view.classic.php' => '0d3eac4f8c4861e67698368ccd62ecea', - './modules/Campaigns/vardefs.php' => '053a1bf0ebd864ddbd5fd0e357390483', + './modules/Campaigns/vardefs.php' => '057bfdeefb37e7eedef8cb6c5656182c', './modules/Campaigns/utils.php' => '2e3ca09bb30d563df260e655beb4fc6f', + './modules/Campaigns/tpls/campaign-inactive.tpl' => '660c7ab053441e4d7e1865f056465ec2', './modules/Campaigns/tpls/WizardNewsletter.tpl' => 'a4aee7ecb98109063a28081685e1e58e', './modules/Campaigns/tpls/WizardHomeStart.tpl' => '3f0224431419e586fa3fe04cc76398b7', './modules/Campaigns/tpls/WizardCampaignTracker.tpl' => 'e8b4d6ac425ada43709dcbd17cadc7e8', @@ -2701,19 +2702,19 @@ $md5_string = array ( './modules/Campaigns/WebToLeadDownloadForm.html' => '1828aed589b952ab4c93e21d9d9f5cd8', './modules/Campaigns/WebToLeadCreation.php' => 'aa38c4cc3449e5e277566bf5c553aa38', './modules/Campaigns/WebToLeadCreation.html' => '16c5523189e636ba3e2647c81b4678d7', - './modules/Campaigns/WebToLeadCapture.php' => '78cdb91e816e94b1d7b4eeba8e3fcf78', + './modules/Campaigns/WebToLeadCapture.php' => '2c2dad84370710bd36629eb3e5171230', './modules/Campaigns/Tracker.php' => '726e6fc5b58f58cd4b330b61a12d7d21', - './modules/Campaigns/TrackDetailView.tpl' => '3187e57b3476ef4387e76b385893027d', + './modules/Campaigns/RoiDetailView.tpl' => '37196dd6f4253e25d2e12751900bdd8d', './modules/Campaigns/TrackDetailView.php' => '4f3535618c1d37939b7e2775d25f1657', './modules/Campaigns/Subscriptions.tpl' => '1332be18f7e16a30887156e46430602a', - './modules/Campaigns/Subscriptions.php' => 'dfb48508303fc1f68bff1a9c83b06a96', + './modules/Campaigns/ProspectLink.php' => '5e38899aed24cf6a1b5a6d31d30aa7e2', './modules/Campaigns/Subscriptions.html' => 'a597b43f0772858ca5ea18c6f19a9ea9', './modules/Campaigns/SubPanelViewer.php' => '4c34b75d7cb01766e9845653d41860d7', './modules/Campaigns/SearchForm_NewsLetter.html' => '8ad7f22ed622f85c674c72f47145cacb', - './modules/Campaigns/Schedule.php' => '7a99bbcba282ca73314848daec30c653', - './modules/Campaigns/Schedule.html' => '915b5758057b0e585f19c8d587093673', + './modules/Campaigns/Subscriptions.php' => 'dfb48508303fc1f68bff1a9c83b06a96', + './modules/Campaigns/Schedule.php' => '7e428536e4db802f192b8c1e23b65d6a', + './modules/Campaigns/Schedule.html' => '65f155d56ed7d74db179c0995a5840c4', './modules/Campaigns/Save.php' => '1d2216c2c0ef070d32ed5b068325812a', - './modules/Campaigns/RoiDetailView.tpl' => '37196dd6f4253e25d2e12751900bdd8d', './modules/Campaigns/RoiDetailView.php' => 'dc249ef1ba62b68f627d9ff9fe5ad590', './modules/Campaigns/RemoveMe.php' => 'e4791a0df39d1ad2f6ed7d869f74ada7', './modules/Campaigns/QueueCampaign.php' => 'd775a610cffcb3dc55bf7fa655e46508', @@ -2725,7 +2726,7 @@ $md5_string = array ( './modules/Campaigns/Menu.php' => '83af5f3dc4b71a10fd25f11f6dc907c4', './modules/Campaigns/MailMerge.php' => 'b635266e87c4a14f7930e1e988a7e7d0', './modules/Campaigns/GenerateWebToLeadForm.php' => '0d2ab31545e632fdecbb8fc464d9f27d', - './modules/Campaigns/EmailQueue.php' => '1635f40ea97a9cb22f922d6ee0d94652', + './modules/Campaigns/EmailQueue.php' => 'dcb74a2af79fe5087aa9f865a6cea5b2', './modules/Campaigns/Delete.php' => '453d68affba5006c3fbec936394e632c', './modules/Campaigns/Dashlets/TopCampaignsDashlet/TopCampaignsDashletConfigure.tpl' => '612ad35fc9906cb2bda949756465b375', './modules/Campaigns/Dashlets/TopCampaignsDashlet/TopCampaignsDashlet.tpl' => '13a08ec95b2d73ce11be435458a75962', @@ -2756,9 +2757,9 @@ $md5_string = array ( './modules/CampaignLog/Popup_picker.php' => '5cfbc593eb62651c9b5fddbb2e365093', './modules/CampaignLog/Popup_picker.html' => '5352231f402a624f048d9bfa812fa3d7', './modules/CampaignLog/Menu.php' => '9a144af6bd83a06aee1415594bd13e35', - './modules/CampaignLog/CampaignLog.php' => '065c904b90f20cc3e4570530b791c05a', + './modules/CampaignLog/CampaignLog.php' => '3a17faa3d29a69fb19cc00a381008238', './modules/Calls/views/view.edit.php' => '98773bd63784a336938d8c74b5be8e17', - './modules/Calls/vardefs.php' => 'a77a5d26638f7cfbd8358193e569c1ff', + './modules/Calls/vardefs.php' => 'bd11ba326780a73e01a2e1fffddde60b', './modules/Calls/tpls/footer.tpl' => '95e468f85ad0f4a0a9b3e3903b97d0a4', './modules/Calls/tpls/QuickCreate.tpl' => '85798db63f4a49547d76aa14f6fa19a5', './modules/Calls/metadata/subpanels/default.php' => '446247ed1b8a39cbfaf65b2b97c61a4e', @@ -2779,26 +2780,26 @@ $md5_string = array ( './modules/Calls/SubPanelViewInvitees.html' => '4aa44ffe3919c55fcb61e17f6b2fb757', './modules/Calls/Save.php' => 'be147699eb6834e0db87fc2e910c1d3a', './modules/Calls/Menu.php' => '4739c2d258953f89a8b84b7f7261c4e2', - './modules/Calls/Dashlets/MyCallsDashlet/MyCallsDashlet.php' => 'da94ac16a9c64e48c9412fac2de659fd', + './modules/Calls/Dashlets/MyCallsDashlet/MyCallsDashlet.php' => '0013d261617dc3c48e76f705d280f3ec', './modules/Calls/Dashlets/MyCallsDashlet/MyCallsDashlet.meta.php' => 'e34d7b77796de05737356c6945580966', './modules/Calls/Dashlets/MyCallsDashlet/MyCallsDashlet.data.php' => '577c8b018b6249972abd8ce81061c6af', './modules/Calls/CallsQuickCreate.php' => '1a526db285df01bcdda25ef861e25323', './modules/Calls/CallHelper.php' => '821c104aef4b2d64666fa94bb7cf7d88', './modules/Calls/CallFormBase.php' => '64d168d630e819fa3360c90eda48becf', - './modules/Calls/Call.php' => 'ccbaa320b0cf524fb41196a5af954b73', + './modules/Calls/Call.php' => '29b2dbf98e7c389797acdcb81dd2599f', './modules/Calendar/views/view.list.php' => 'e8dd64409e0ac2eacd506fcb7bb81fd9', - './modules/Calendar/templates/templates_calendar.php' => 'a6b1f92745bd8921e9a3522a54b2ef9e', + './modules/Calendar/templates/templates_calendar.php' => '750737dbfd338550ae0c5cf6f26b1eea', './modules/Calendar/templates/template_shared_calendar.php' => 'b851af6632f3a7af5c5923bb561b6124', - './modules/Calendar/small_month.php' => '2d0b75b3b5f6f31b7208dcdf3903950b', + './modules/Calendar/small_month.php' => '4aba3e53b3a8ccbe8d6c5a4017967d97', './modules/Calendar/metadata/listviewdefs.php' => '6b515c79d389fe940735497abf92f7ae', './modules/Calendar/language/en_us.lang.php' => 'da3c26592cfd2f3bcc3ba9de338160cc', - './modules/Calendar/index.php' => 'a02b45207cc70cb65f3f2bdfa1a44c32', './modules/Calendar/TasksListView.php' => '0ed0aaf137bebce9f4e7a6a783f60e15', './modules/Calendar/TasksListView.html' => 'b778aea506b2ae376ba01c6ff98b42d1', './modules/Calendar/SubPanelSharedCalendar.php' => '2c4a97ffdc9e2f0920141b2d9762beb1', './modules/Calendar/Forms.php' => 'ffff02189d6764e4b2ec3449d7a51c9a', - './modules/Calendar/Menu.php' => '62609bfe10c90bce8db9c684c921640b', './modules/Calendar/DateTimeUtil.php' => '94546928e6055eba2aad970b867d4c3f', + './modules/Calendar/index.php' => 'a02b45207cc70cb65f3f2bdfa1a44c32', + './modules/Calendar/Menu.php' => '62609bfe10c90bce8db9c684c921640b', './modules/Calendar/Calendar.php' => 'bfa1ffcb44550f04fb2429faa38549f1', './modules/Bugs/views/view.edit.php' => 'f3758cc5fb82c65a163b9dfcb10e7b6b', './modules/Bugs/views/view.detail.php' => 'effc34a9f7844b8339a5b4efa9c3cbfe', @@ -2830,7 +2831,7 @@ $md5_string = array ( './modules/Audit/language/en_us.lang.php' => 'c69c8b436958462131186c8aec6119b8', './modules/Audit/field_assoc.php' => 'ba4f04ecaab0283e88000b85ee0b71d0', './modules/Audit/Popup_picker.php' => 'a62f5dc9310c0177c9b765052b680a22', - './modules/Audit/Popup_picker.html' => '932c746ecc0b9ba81de064b516630d0b', + './modules/Audit/Popup_picker.html' => '14712442d3fd49e729e7f6d490101df6', './modules/Audit/Audit.php' => '8845540806673a78e6026f6e681dad15', './modules/Administration/views/view.languages.php' => '4ffc0f3631a98f9660f11d819af6c6ca', './modules/Administration/views/view.globalsearchsettings.php' => 'c1470c8880921604de9aaea35b7f6324', @@ -2858,26 +2859,24 @@ $md5_string = array ( './modules/Administration/javascript/Administration.js' => '5c983c8146d2f8e537f0f826d0239834', './modules/Administration/javascript/Async.js' => '6201560d3cc38a32a3300606bce92541', './modules/Administration/index.html' => '2cc05387b7f392ee9891f97ff24e8f66', - './modules/Administration/DstFix.php' => '3c1cfac3316ffc8ebfd4ecda81ca40f0', - './modules/Administration/Diagnostic.tpl' => 'a46eed78fd43c51c6df8e3e6a0e7ae86', './modules/Administration/callJSRepair.php' => '097ad94cdd7cddd45fe0f247df360f26', './modules/Administration/repairUniSearch.php' => 'e25cdf52b928d0ea05e4a2b25acf8a66', './modules/Administration/clear_chart_cache.php' => '95585a99d6928cc158475308324e8270', + './modules/Administration/Diagnostic.tpl' => 'a46eed78fd43c51c6df8e3e6a0e7ae86', './modules/Administration/UpgradeWizard_prepare.php' => 'fcd2cd294ca89b83d07b6ab1320be5e8', './modules/Administration/UpgradeWizard_commit.php' => '79b11156566b725fcfc3ef0a6e654e23', - './modules/Administration/UpgradeWizard.php' => '84fba3fca2c46fd23c0fd2fbc63aec78', './modules/Administration/UpgradeIISAccess.php' => '06edbb4c220390310e11109e8f3385a7', - './modules/Administration/vardefs.php' => '6a950e59140f943747c0ef6a5ce13733', + './modules/Administration/DstFix.php' => '3c1cfac3316ffc8ebfd4ecda81ca40f0', + './modules/Administration/UpgradeWizard.php' => '84fba3fca2c46fd23c0fd2fbc63aec78', './modules/Administration/updater_utils.php' => '4cc174956a5791243e839c6b74e148cb', './modules/Administration/UpgradeFields.php' => '6ec4328aa4888703fc800ed61dcf56de', './modules/Administration/UpgradeAccess.php' => 'd5b662f01ae6c5a8ec6ef7f7cfa6e4cd', './modules/Administration/expandDatabase.php' => 'db6782337c424a5aea39932c6c74b52a', './modules/Administration/UpgradeWizardCommon.php' => 'd6c694064904b67eaefdef81b4912b97', './modules/Administration/SupportPortal.tpl' => '25d5c2ffefc8becee74e0f45b196ca64', - './modules/Administration/index.tpl' => '606ad7ab8d4dcab1715bc455dab35989', './modules/Administration/repairDatabase.php' => '8de7ecd350e5516b099fa6dd0f0bfecd', './modules/Administration/Save.php' => '4152bf2003831091369d76b24495386f', - './modules/Administration/index.php' => '54b4ed0b4645006346d676b85cb3bbd3', + './modules/Administration/vardefs.php' => '6a950e59140f943747c0ef6a5ce13733', './modules/Administration/controller.php' => '83da0c6bf53f19c7347e656188f1db7d', './modules/Administration/RepairSeedUsers.php' => 'b9c8937676633e2860b38b3c5ab77f0c', './modules/Administration/RepairJSFile.php' => '43ac52009b5ee4364b2194b7d672d740', @@ -2896,8 +2895,8 @@ $md5_string = array ( './modules/Administration/RebuildAudit.php' => '8d2fc35c83a49c038ca59d7ef54149b2', './modules/Administration/QuickRepairAndRebuild.php' => '745b5aa563e14810a4e0c51885aff222', './modules/Administration/PasswordManager.tpl' => 'd60c9df9a4d6cf63168fefa53f9b07de', - './modules/Administration/Upgrade.php' => '595882b60b47ea6b775205823044dcb4', - './modules/Administration/Updater.php' => '6245521e1b0c45638d1fd5cfc3fea19b', + './modules/Administration/index.tpl' => '606ad7ab8d4dcab1715bc455dab35989', + './modules/Administration/index.php' => '54b4ed0b4645006346d676b85cb3bbd3', './modules/Administration/SupportPortal.php' => '29a746ac29392464d1b28d9588395e7b', './modules/Administration/Menu.php' => '96b575a9cdd9b92b4411aa316f57d1a3', './modules/Administration/RepairIndex.php' => 'cdc4da4fec0cef9a351dec1e7aa75f33', @@ -2906,7 +2905,9 @@ $md5_string = array ( './modules/Administration/PasswordManager.php' => '6e3ca5f53adbb0144bf4f053671cf45d', './modules/Administration/ImportCustomFieldStructure.php' => '8f483d883bfa449cce0ca0afe782b6cc', './modules/Administration/Forms.php' => 'fb76fa135d6210b0e25abf6b2f10376d', - './modules/Administration/Locale.tpl' => 'c84e7541508099330a44296d460fabaf', + './modules/Administration/Upgrade.php' => '595882b60b47ea6b775205823044dcb4', + './modules/Administration/Updater.php' => '6245521e1b0c45638d1fd5cfc3fea19b', + './modules/Administration/Locale.tpl' => '04b2f1e9c6adf7e91e79206a67a33ea3', './modules/Administration/ExportCustomFieldStructure.php' => '6f55e973d20ab72b29f0fc74d793ad5b', './modules/Administration/DisplayWarnings.php' => '70d6a5d17f5690de605ec1b11bf75781', './modules/Administration/DiagnosticRun.php' => '9d199a55c9c8a35648c56dfa40dca063', @@ -2929,14 +2930,14 @@ $md5_string = array ( './modules/Activities/SubPanelView.html' => '74afed37ca1d19a2a67307e063b52c4e', './modules/Activities/SetAcceptStatus.php' => '42fcffc8717e7b1cb10001b137400d9e', './modules/Activities/SubPanelView.php' => '7b656bdde855f8032edcfb640677d7a9', - './modules/Activities/Popup_picker.php' => 'c21ed67459a62113293a71f7b6c43611', + './modules/Activities/Popup_picker.php' => 'e0130f34a3f17efb7ee4152de2015b2b', './modules/Activities/Popup_picker.html' => '82fca068e687dbca227b0b4c8fc69b76', './modules/Activities/Menu.php' => '50ace4d08c7af062a3da92e52e6ebffc', './modules/Activities/Forms.php' => 'd7472639650199c74c40ba981f008c2c', './modules/Accounts/Account.js' => '8a37b6ec182cc03449e40766e763214e', './modules/Accounts/views/view.list.php' => '4feca8fc6bb33f26c90360a36aa0e45f', './modules/Accounts/views/view.detail.php' => 'f9ae2b995b3658a78a2ce5db2135c66b', - './modules/Accounts/vardefs.php' => '369286f1a75e7b5e8c3c6afd9e150416', + './modules/Accounts/vardefs.php' => '4570faaa6b5a650936f6069002818d97', './modules/Accounts/tpls/QuickCreate.tpl' => '994fcab80f63cc0f59f111fc30bf0430', './modules/Accounts/metadata/subpanels/default.php' => '066e3a2fb842892fbcae8009ce9576c4', './modules/Accounts/metadata/subpanels/ForProspectLists.php' => 'b6d33485aa7f8fa00f22677ff2d1f001', @@ -2945,7 +2946,7 @@ $md5_string = array ( './modules/Accounts/metadata/studio.php' => 'd1d79777052d975c08429b48fe02e235', './modules/Accounts/metadata/searchdefs.php' => '0f888761dac4782e8c6368377911b2ef', './modules/Accounts/metadata/quickcreatedefs.php' => '9b4038cd84095adb5001c92f9b6da280', - './modules/Accounts/metadata/popupdefs.php' => '5ad4dabf79de44c487912e86d0cdc725', + './modules/Accounts/metadata/popupdefs.php' => 'ad73db516f70134d84ec6b8b3cf0a985', './modules/Accounts/metadata/metafiles.php' => '8dd6ed25600c6e6af602eb32a21dba3b', './modules/Accounts/metadata/listviewdefs.php' => '16e04f3b0f564bb178b8804ac289c065', './modules/Accounts/metadata/fieldGroups.php' => '2a94c4a8f697121796f53413911131f6', @@ -2966,7 +2967,7 @@ $md5_string = array ( './modules/Accounts/Dashlets/MyAccountsDashlet/MyAccountsDashlet.data.php' => 'd881be66482e5c2f470849ae228eddf4', './modules/Accounts/AccountsQuickCreate.php' => 'fbb9c86de48897e1e95aae6201f52941', './modules/Accounts/AccountFormBase.php' => 'a80b0c9ebadf92b1451b2e90fe4d3146', - './modules/Accounts/Account.php' => '685f3b6d7de771f7966ff99b40687d67', + './modules/Accounts/Account.php' => 'fce59e4b2ae90d1bceedc038d936eea4', './modules/ACLRoles/ACLRoles.js' => '2b2b8c4517f3d6a27b71f22d8b37b285', './modules/ACLRoles/views/view.list.php' => 'e40ad40a14a03cf692dd279b9616329a', './modules/ACLRoles/vardefs.php' => 'f500232770683374295c4d6d721dd54c', @@ -2990,7 +2991,7 @@ $md5_string = array ( './modules/ACLRoles/EditView.php' => 'cb84572b6182e7f2f696d9faf9cb128d', './modules/ACLRoles/EditRole.tpl' => '5a5395e65f062f8497ab1e6ad3059d17', './modules/ACLRoles/EditRole.php' => '9973b810c5a89f4a37e8289fe80c0c2e', - './modules/ACLRoles/EditAllBody.tpl' => 'ee9bc089e39f7cea26ca77ac1a0c6831', + './modules/ACLRoles/EditAllBody.tpl' => 'dc0a4a6eb1878a89dc7d08f67b69cab1', './modules/ACLRoles/DetailViewUser.tpl' => 'd339f129cd6b7512d3a404d35211494d', './modules/ACLRoles/DetailViewBody.tpl' => 'a1dc057d0ac81f87ada4acf9dd1cbe55', './modules/ACLRoles/DetailView.tpl' => '975040e818f0231e25707a8473776af8', @@ -3076,7 +3077,7 @@ $md5_string = array ( './metadata/accounts_contactsMetaData.php' => '7ac2dc92952f26414bcc626ca70b164e', './metadata/accounts_casesMetaData.php' => 'fd6eda9449e9c52ee7b3cf345dd146da', './metadata/accounts_bugsMetaData.php' => '8adc9eae86555b17c88306b540f4467f', - './maintenance.php' => '72efcf842406e81fb8640a621afbdd68', + './vcal_server.php' => '0451673dbbdf49126114fd314ef2a894', './log_file_restricted.html' => 'f20a0bfe3ac44ba88f520fb8203a70e4', './log4php/LoggerManager.php' => 'fa34194306cd50c01b71d8d5060ee362', './leadCapture.php' => '39f9c34cbfb01f585a6c04227823c65f', @@ -3088,7 +3089,7 @@ $md5_string = array ( './jssource/src_files/include/SugarCharts/Jit/js/mySugarCharts.js' => 'bbbca8b9bb44d0f107a2783fe1cf861d', './jssource/src_files/include/SugarCharts/Jit/js/sugarCharts.js' => '72eba4ec918665ffa582c6fec16d2c78', './jssource/src_files/include/SugarDependentDropdown/javascript/SugarDependentDropdown.js' => '82905de42674faa12e819f99d3db0610', - './jssource/src_files/include/SugarEmailAddress/SugarEmailAddress.js' => 'b96f3de51a2e1de560cb1bc688ea5597', + './jssource/src_files/include/SugarEmailAddress/SugarEmailAddress.js' => '86480cd5e5e0d81cdedd4975e872a0a9', './jssource/src_files/include/SugarFields/Fields/Address/SugarFieldAddress.js' => '2e39ad35e6759c407fae5b35b230d34b', './jssource/src_files/include/SugarFields/Fields/Collection/SugarFieldCollection.js' => '99af73a152a0cc58ac14e895ba569fa6', './jssource/src_files/include/SugarFields/Fields/Datetimecombo/Datetimecombo.js' => '7f93acedc02d390800eaad0e5fc22cae', @@ -3097,7 +3098,7 @@ $md5_string = array ( './jssource/src_files/include/javascript/cookie.js' => '4edb43519c5ac8c3d9b1b73b9ddf87fb', './jssource/src_files/include/javascript/dashlets.js' => 'c85774c7bcc3568d50e71448dbb371af', './jssource/src_files/include/javascript/include.js' => '4fd5d7da5c00e4c0a9a83b4b65a493f1', - './jssource/src_files/include/javascript/jsclass_async.js' => '62999963ba1982cc5582cd0c89d509f3', + './jssource/src_files/include/javascript/jsclass_async.js' => '8e8694a9e136c6736ac3fe87d9ace2b1', './jssource/src_files/include/javascript/jsclass_base.js' => '73f529e1ed6a9a38d432e30816f87e02', './jssource/src_files/include/javascript/menu.js' => 'a12b42e2406a9b192609258884536efd', './jssource/src_files/include/javascript/overlibmws.js' => '9fb2df046948fb09baf9bf62cf8d7877', @@ -3107,7 +3108,7 @@ $md5_string = array ( './jssource/src_files/include/javascript/quickCompose.js' => '2ae2e20213ad5341de324c92bb5035d3', './jssource/src_files/include/javascript/quicksearch.js' => '751e98b3b4c21b2585d3d706249c800b', './jssource/src_files/include/javascript/report_additionals.js' => '134d3cd895ad1e0470f9dd07c7b34ad1', - './jssource/src_files/include/javascript/sugar_3.js' => '3d1b35a31520cbf604dfce1ff7a4b2f8', + './jssource/src_files/include/javascript/sugar_3.js' => 'a4ebdb5fc2259088e804e71ea75eabc5', './jssource/src_files/include/javascript/sugar_connection_event_listener.js' => 'd13aa0b553050db12f7bd6cd5b7b98f9', './jssource/src_files/include/javascript/sugarwidgets/SugarYUILoader.js' => '9237f12850b7ce5c27669480f71152be', './jssource/src_files/include/javascript/sugarwidgets/SugarYUIWidgets.js' => 'eb797deed072e18109821ab136366c49', @@ -3904,7 +3905,7 @@ $md5_string = array ( './jssource/src_files/modules/Connectors/Connector.js' => '8a297fca0ea108c6a5edb100eafd8432', './jssource/src_files/modules/Contacts/Contact.js' => 'f66093ba1e4899fe3daf18956d8b5e38', './jssource/src_files/modules/Currencies/EditView.js' => '22d07408e9aa6d940e0783147859b013', - './jssource/src_files/modules/Documents/documents.js' => 'ff0093f68d68b7cc0e864e28b6aac4c7', + './jssource/src_files/modules/Documents/documents.js' => '5110ec40afe540ecd0bd44dfe41176e8', './jssource/src_files/modules/EmailTemplates/EmailTemplate.js' => 'b7a20a46340cb552cb0600dc4bc37f23', './jssource/src_files/modules/Home/about.js' => '3c3184898479de9affd42a03e8db87a3', './jssource/src_files/modules/InboundEmail/InboundEmail.js' => '3853f33e9a0a903d50e2c110be0c9f25', @@ -3931,7 +3932,7 @@ $md5_string = array ( './jssource/minify.php' => '219023f793e8ed83e536771bffcd988c', './jssource/jsmin.php' => '70558acc143de9506c866b0056dcf416', './jssource/JSGroupings.php' => '49859729343ee71f88e7ee045e90097c', - './json.php' => '7c4686a02553172c041fb5f48152ed51', + './maintenance.php' => '72efcf842406e81fb8640a621afbdd68', './install/dbConfig.js' => '34408e61d47a775a3cb67971bb710522', './install/installCommon.js' => '9177e605553bb2a6619179d0e5dffc57', './install/license.js' => '7e1c720dd7e26e4e844cd21d704f9ddd', @@ -3950,8 +3951,8 @@ $md5_string = array ( './install/siteConfig_a.php' => '17e8c6a41d5f4d3469e123ee98f93f7d', './install/licensePrint.php' => 'f569be1d51e52d0067ec1b2845a4c9b1', './install/license.php' => '6739f461680a5a40971d83bc7b66b7ef', - './install/language/en_us.lang.php' => '79754e24ff24b84400ec2fd00ffceda2', - './install/performSetup.php' => '4b55e2fef4f08b9b586556ee7537c56f', + './install/language/en_us.lang.php' => '0766f207910b4fad1006f63cb88be2e4', + './install/performSetup.php' => '2bb6d7a8d890d91050992925213359cd', './install/install_defaults.php' => '3c67b082c1709e909dd1aaf051e9c589', './install/installType.php' => 'cc447dd870b6eb51027abeb4d4674087', './install/installSystemCheck.php' => 'd8b035f439553f09bb2a03a66fd36e4a', @@ -3960,13 +3961,13 @@ $md5_string = array ( './install/install.css' => '862e23df1815d0138cf0a367d92a372d', './install/download_patches.php' => 'c1942d9e73b9ce80eb645e4ec925a5e0', './install/download_modules.php' => '4623d65fa913da9559e1bdd296f4e887', - './install/install_utils.php' => '458c1122a57a0b8bf56188844bef7567', + './install/install_utils.php' => 'd5e563414334735d3ac165f8c3f53d54', './install/populateSeedData.php' => '8867869db5ca3f45cef110ec4515152d', './install/demoData.en_us.php' => 'ab6d0dc87a9f421e843ac454aec4546a', './install/dbConfig_a.php' => 'ea11513c27fe2c5cdc0241a1fe744cfb', './install/data/disc_client.php' => 'e4574285e612f49e6a5b002e3bf0b6c9', - './install/confirmSettings.php' => '44341f2a4081476ef4afbfa8c28754c7', - './install/checkDBSettings.php' => 'a71be2058378c686abd7a54bd33ce171', + './install/confirmSettings.php' => 'd3cab83650e5bca8457107956bec1b90', + './install/checkDBSettings.php' => '5b5e8721730cd6f5b1097869a6dc9541', './install/UserDemoData.php' => '50640057634782bb6f0cf4e34313346c', './install/UploadLangFileCheck.php' => '011b7ae7a9711e6eb231155e24c66e63', './install/TeamDemoData.php' => '1cf512bcb6834cdac2c154b2f42d14cd', @@ -4060,14 +4061,14 @@ $md5_string = array ( './include/utils/layout_utils.php' => 'e7b465492ed76893b109e2baa31cabea', './include/utils/file_utils.php' => 'cd7b33adab01fd36d0953e40a336dffd', './include/utils/external_cache.php' => '4138cf307fea4ca68817b4c80250cab0', - './include/utils/mvc_utils.php' => '30ef87e173ab4d861fbbee996f11d6c4', + './include/utils/mvc_utils.php' => '3f71726a65f0ab5126ae7ddb56f21240', './include/utils/encryption_utils.php' => '060b4fa727c1d48fa8ec2809e2fb58cf', - './include/utils/db_utils.php' => '644b02b4ed5db4a3ede75ed11368b773', + './include/utils/db_utils.php' => '9b3d1516d07438b8cac025baf539fcc0', './include/utils/autoloader.php' => '76818f941992acf4caa205cc6f2aa0c9', './include/utils/array_utils.php' => '4a63065e0ab62bfc33b9429f886ed7ec', './include/utils/activity_utils.php' => '96a8bd8977d5e7532e3b7d8ca3a583ee', './include/utils/LogicHook.php' => '3d65be3d74e10ecdf5aee20b2efceee6', - './include/utils.php' => 'cc387bf31e7ff14093d2f9653b0b92cd', + './include/utils.php' => '1a282c9951e07b67e9728eda052975cc', './include/upload_file.php' => '177f5eb2032e0c7797e11f93efb759f3', './include/timezone/timezones.php' => '68c833b6b839c9e4d80a3bb21740d6e5', './include/templates/TemplateGroupChooser.php' => '111b7db20ad8143651bc7bba835894df', @@ -4167,18 +4168,18 @@ $md5_string = array ( './include/language/en_us.notify_template.html' => '4e90b0343ac29bf12687dddb15afea7d', './include/language/en_us.lang.php' => 'f2b2332a9bc1ba04b65d01b76b66a64c', './include/json_config.php' => '73219c3de81147aa2e18580b497353e6', - './include/javascript/sugar_grp_quickcomp.js' => '98d3378cc7d03a6aaaa7ecc20ee46ccb', - './include/javascript/sugar_grp_emails.js' => '67d2cf6199edb7301d9581145fb5d602', + './include/javascript/sugar_grp_quickcomp.js' => '840b010ffdf7b7919b2683e356fcdbfe', + './include/javascript/sugar_grp_emails.js' => '7082053d2bea65b26b1e5e840c97d429', './include/javascript/sugar_grp_overlib.js' => '1ae8c7614a7ed6e6b21806f191bb2ae2', './include/javascript/sugar_grp_yui2.js' => '613bb6a5e0e5e934a88293f6ae2ffa43', './include/javascript/sugar_grp_yui_widgets.css' => '87d9287720879ff935fa2b80690ede5e', './include/javascript/sugar_grp_yui_widgets.js' => '7cc525f73e9a0e49bbbb06363813c84b', './include/javascript/sugar_grp1_yui.js' => '2e8034083b6cf4f72bd45ca10aff5a34', - './include/javascript/sugar_grp1.js' => '3f2c674a52b8136ce6d81ae0db366f86', + './include/javascript/sugar_grp1.js' => 'f649d14ea9123f176d57650e59bd46d1', './include/javascript/cookie.js' => '4f95a2872a549573149d035633086662', './include/javascript/dashlets.js' => '208d5f32d367390faadda8e899f99b77', './include/javascript/include.js' => '1b6f04c9cdbc1f25b3c4de8e049a2433', - './include/javascript/jsclass_async.js' => 'c915de28d467e6a5c715fa8a60f9aa6b', + './include/javascript/jsclass_async.js' => '15b2b4ecf1010a43608634cfbd6d17a2', './include/javascript/jsclass_base.js' => '848b03e3cf892fe9ba21e85df0e25848', './include/javascript/menu.js' => 'bab1eb80c6cf5cb048efc10e9eec8aaf', './include/javascript/overlibmws.js' => '5e18c62656d6c7fd4db7b220508a2df7', @@ -4188,7 +4189,7 @@ $md5_string = array ( './include/javascript/quickCompose.js' => '8fbd8976c73311dfe73d4124949b8118', './include/javascript/quicksearch.js' => '1bf7a688b074ca65f2d2f499ebb844b8', './include/javascript/report_additionals.js' => '6edec1a89ec68998008c4469f2d00e13', - './include/javascript/sugar_3.js' => 'd159ab21ef865443f1524cae52d39e3a', + './include/javascript/sugar_3.js' => 'ec1f476e52aeaf4bf122df01c7d6a1b6', './include/javascript/sugar_connection_event_listener.js' => '4a3c4a128bbbcd0817a07cb0e7423d92', './include/javascript/swfobject.js' => 'e83d1ca12de8ee2787c9189119cbd959', './include/javascript/calendar.js' => '74e959df9c5364713a6b3bca6ea926ad', @@ -5858,7 +5859,7 @@ $md5_string = array ( './include/javascript/sugarwidgets/SugarYUILoader.js' => '03e5f141de87cd45e0e44ffc4fc60e78', './include/javascript/sugarwidgets/SugarYUIWidgets.js' => '75fcc837e971488cb623d134e4a585a2', './include/javascript/jsAlerts.php' => '50f47b26a05a3e41a209691bbc204d30', - './include/javascript/javascript.php' => '5e45d53f3ac5326a86042efc38acb999', + './include/javascript/javascript.php' => 'e46b3891cef038dc7e74c039ca05b82a', './include/javascript/getYUIComboFile.php' => 'd961ed2c8a1692920b1bf9bbe6cc9884', './include/images/seed_will_id.gif' => '2f106be21d1591fcb91636594eeb1689', './include/images/seed_sarah_id.gif' => 'e2f269d97a3a3f500dff75b770d6c6b1', @@ -5917,7 +5918,7 @@ $md5_string = array ( './include/generic/SugarWidgets/SugarWidgetSubPanelLoadSignedButton.php' => 'c6dd95bef731b4c920d3801c3e59a5c8', './include/generic/SugarWidgets/SugarWidgetSubPanelIcon.php' => '5397d73c3d7c22adca5b5f4e9be962d4', './include/generic/SugarWidgets/SugarWidgetSubPanelGetLatestButton.php' => '113cb3398fb07a55c98cfc01aeab6c4e', - './include/generic/SugarWidgets/SugarWidgetSubPanelEmailLink.php' => '3e1767379cc708fd6451dc367c02676a', + './include/generic/SugarWidgets/SugarWidgetSubPanelEmailLink.php' => 'bf7d893af5ca13542d1a9f6ff34279c8', './include/generic/SugarWidgets/SugarWidgetSubPanelEditRoleButton.php' => '064b42a25e85e539c56b8dcffbcf1403', './include/generic/SugarWidgets/SugarWidgetSubPanelEditButton.php' => 'e1173f56588c330420087f88e2948333', './include/generic/SugarWidgets/SugarWidgetSubPanelDetailViewLink.php' => '7daed673f7686bc2eaa7a52239a021f0', @@ -5930,7 +5931,7 @@ $md5_string = array ( './include/generic/SugarWidgets/SugarWidgetFieldurl.php' => '56876b67d48c659338febb7f469f7e20', './include/generic/SugarWidgets/SugarWidgetFieldtime.php' => 'f51d1cb46b1404f1316c82836918f586', './include/generic/SugarWidgets/SugarWidgetFieldtext.php' => '54198ef510dc205f6cd0a8c21b627798', - './include/generic/SugarWidgets/SugarWidgetFieldsingleenum.php' => 'f060510b8fa83e0cfcc7eb5f663e5f8d', + './include/generic/SugarWidgets/SugarWidgetFieldsingleenum.php' => '0fa702885d51fa43a01f85a2b669bd64', './include/generic/SugarWidgets/SugarWidgetFieldrelate.php' => '7843e6f9acc207b2e0a9e1c3949a3f89', './include/generic/SugarWidgets/SugarWidgetFieldradioenum.php' => '2aeefdbebc5fda503eed56d16a146845', './include/generic/SugarWidgets/SugarWidgetFieldphone.php' => '866bbe79a3610e214e58dec9e2be9b4e', @@ -5944,13 +5945,13 @@ $md5_string = array ( './include/generic/SugarWidgets/SugarWidgetFieldid.php' => 'ebd4da373e066e3db5753f653363a298', './include/generic/SugarWidgets/SugarWidgetFieldfullname.php' => '54bd4fbf0e32e4c3a053867815d0bf9e', './include/generic/SugarWidgets/SugarWidgetFieldfloat.php' => '2e6a7dfb394741ed2063b0f3e4313e41', - './include/generic/SugarWidgets/SugarWidgetFieldenum.php' => 'f3bce63670b3871add632a21b82d976a', + './include/generic/SugarWidgets/SugarWidgetFieldenum.php' => 'a826099afcd6eee2deb7d4b0cd393837', './include/generic/SugarWidgets/SugarWidgetFieldemail.php' => 'c0f3220ad4123ae1d8307f08a476ee84', './include/generic/SugarWidgets/SugarWidgetFielddouble.php' => '78b80591d1f30667c3ae4ec25711b3e7', './include/generic/SugarWidgets/SugarWidgetFielddecimal.php' => '85891b39c359f08f06ca5be4c49b4ce1', './include/generic/SugarWidgets/SugarWidgetFielddatetimecombo.php' => 'bdb2e2a0a7defcd305f1a09c062f37fa', './include/generic/SugarWidgets/SugarWidgetFielddatetime.php' => '3f38fd47b01da7d82094fea7f3be3a8c', - './include/generic/SugarWidgets/SugarWidgetFielddatepicker.php' => '086e5a71312fe06f267e43d37145bf46', + './include/generic/SugarWidgets/SugarWidgetFielddatepicker.php' => '620b4c852a4b65566fe1a481b1bdffb7', './include/generic/SugarWidgets/SugarWidgetFielddate.php' => '64acd7916910cf52758d351e07312353', './include/generic/SugarWidgets/SugarWidgetFieldcurrency.php' => '7a1225b8ab164fc8a2f3a8fffea8abea', './include/generic/SugarWidgets/SugarWidgetFieldchar.php' => '28923530c61913c4a4c9a0f9e3820a54', @@ -5974,7 +5975,7 @@ $md5_string = array ( './include/fonts/Courier-Oblique.afm' => '3324f479739ac9ebab740772b55705d2', './include/fonts/Courier-BoldOblique.afm' => '5c34aeefc1ef69ae2fb317abc1ccc9ca', './include/fonts/Courier-Bold.afm' => 'cb84ced0cc430a5d54497257a11638f5', - './include/export_utils.php' => '306312d45892f75122cd5965876d0254', + './include/export_utils.php' => 'a51e131fa9c6d979d6cbd1064388a8f8', './include/entryPoint.php' => 'e25fe49080602ee59180d4ea18e4424f', './include/dir_inc.php' => '7fa525a179288303fb0cc34b89371b62', './include/database/SqlsrvHelper.php' => '6cf5af120c1644866c0687ba1773d69e', @@ -5987,7 +5988,7 @@ $md5_string = array ( './include/database/SqlsrvManager.php' => '659363159024ac1885d50f8a8e3c31e3', './include/database/MysqliManager.php' => '4b7748362a9ffbd38288cbd8619c0f89', './include/database/MysqlManager.php' => '2fb21197c234df9ffca41ff9ab486a8a', - './include/database/MssqlManager.php' => '26cd1d5982d91a3287ba8a9f96c1cd2f', + './include/database/MssqlManager.php' => '8bb36894e819615ac08d9ea42ae6f713', './include/database/FreeTDSManager.php' => '72cca97832b03356146faa2d49a2cbed', './include/database/DBManagerFactory.php' => 'dbea844f739891e4bc59806f29775819', './include/database/DBManager.php' => 'a7e65da839eb59f20b505eca1da80959', @@ -6000,7 +6001,7 @@ $md5_string = array ( './include/connectors/sources/loc/xml.php' => '9de23526c28a913c11b7d2094f2fdc26', './include/connectors/sources/ext/soap/soap.php' => 'fbb8e1f311a85c341c3645cf3beec5b9', './include/connectors/sources/ext/rest/rest.php' => 'ee574d1a601e2926cb5a3cc66f28e36c', - './include/connectors/sources/default/source.php' => '7634f7b8fdc70842eebc463ef8f1c591', + './include/connectors/sources/default/source.php' => '7858e24187d5910cbf95a97eb752d1fa', './include/connectors/sources/SourceFactory.php' => '8e2a76bda89e905821aee0568cb65fed', './include/connectors/formatters/ext/soap/tpls/default.tpl' => '30ac6e34be2b90079b7fa67e9916439b', './include/connectors/formatters/ext/rest/tpls/default.tpl' => 'a775bb54d09a292b0c3940f30758199a', @@ -6014,7 +6015,7 @@ $md5_string = array ( './include/VarDefHandler/vardef_meta_arrays.php' => 'ef9152d645fc0e97041e4d6e9f8174a2', './include/VarDefHandler/listvardefoverride.php' => 'd79b73457de94f7d3c2d485d7643b501', './include/VarDefHandler/VarDefHandler.php' => 'ed481a168b11ed8306efdce0725e7b1f', - './include/TimeDate.php' => '2bfe3be6536522e4e4a749efe3fda4ac', + './include/TimeDate.php' => 'a5499e1bea8973742dfd537c5097d255', './include/TemplateHandler/TemplateHandler.php' => '9fc0236df420bb0bd910d632dbc31d27', './include/Sugarpdf/sugarpdf_default.php' => '4e61fe9d5cd31ac41acc315423348ff7', './include/Sugarpdf/sugarpdf_config.php' => 'ecd77816c5def7f50b83d7c2336e7adf', @@ -6024,7 +6025,7 @@ $md5_string = array ( './include/Sugarpdf/Sugarpdf.php' => '2740d9331dc458a155f4daae744d2814', './include/Sugarpdf/FontManager.php' => '2d3b8e82caaa71e278519755dacadc9f', './include/Sugar_Smarty.php' => '7318c3410d439cf41bc59faae6cce89a', - './include/SugarTinyMCE.php' => '2cf04b4dca0e7c5f258f0b9d6745a0fb', + './include/SugarTinyMCE.php' => '416d1167ad0b8419a1fa26c39d043868', './include/SugarTheme/getImage.php' => '7c0d2c11813933c7d51de8032cbed53f', './include/SugarTheme/cssmin.php' => '05384ba957435def09368425e4480688', './include/SugarTheme/SugarTheme.php' => '462c527cd74ba2195704743ef8387859', @@ -6062,9 +6063,9 @@ $md5_string = array ( './include/SugarObjects/templates/sale/config.php' => '3bbc93005435531e82a062995275aa73', './include/SugarObjects/templates/sale/Sale.php' => 'ede92e3a280a4e7e867f74f820a5203a', './include/SugarObjects/templates/sale/Chance.php' => 'cd3cd899960aad0b6d8a5923945ce1d8', - './include/SugarObjects/templates/person/vardefs.php' => '67fe770573dd11e94d6098db5a4d4ade', + './include/SugarObjects/templates/person/vardefs.php' => '05f356c87ec5bc7d54325d0787141dec', './include/SugarObjects/templates/person/metadata/subpanels/default.php' => '3b440daa07cb13eed84d9f17fe760247', - './include/SugarObjects/templates/person/metadata/searchdefs.php' => 'f93632d572c037bcaabf57e6235c3b93', + './include/SugarObjects/templates/person/metadata/searchdefs.php' => '7badf2d886b0f5183df37dcca24cc704', './include/SugarObjects/templates/person/metadata/quickcreatedefs.php' => '0440e58a5af79ebdaf0fbc22bea4d06d', './include/SugarObjects/templates/person/metadata/popupdefs.php' => 'eb53311841b72440532fe6984c8a202b', './include/SugarObjects/templates/person/metadata/metafiles.php' => 'b986bf467ce02d259ea3db29a39cb0a8', @@ -6073,12 +6074,12 @@ $md5_string = array ( './include/SugarObjects/templates/person/metadata/detailviewdefs.php' => '9950f07eec92ea20ff547aa124fd66ac', './include/SugarObjects/templates/person/metadata/dashletviewdefs.php' => 'f0fc642c2ddf3806d4991dff03fc8ebe', './include/SugarObjects/templates/person/metadata/SearchFields.php' => '93a6bbb32c383e0521d4919c7f5c31ed', - './include/SugarObjects/templates/person/language/en_us.lang.php' => '9fb161421e76265f4356e8c478f9e4a0', + './include/SugarObjects/templates/person/language/en_us.lang.php' => 'd209f94b530658dd43165a8f5bd868f9', './include/SugarObjects/templates/person/icons/person_32.gif' => '1550c24a793910550200679be1c5c078', './include/SugarObjects/templates/person/icons/person.gif' => 'ea5e2b2022166291d01ccedaf24b4e33', './include/SugarObjects/templates/person/icons/Createperson.gif' => '2e20692d501b15729294b80f4f311d77', './include/SugarObjects/templates/person/config.php' => 'ade871c96f0a91be8b4b27a06c280d33', - './include/SugarObjects/templates/person/Person.php' => 'abe4936804e3a8a7a83cebb32e7c828a', + './include/SugarObjects/templates/person/Person.php' => '38c9321dbccf83090289ab4846d35c36', './include/SugarObjects/templates/issue/vardefs.php' => '2cde5d7c79db04f5ba31b51a733be453', './include/SugarObjects/templates/issue/metadata/subpanels/default.php' => 'c4ad08eb6c1a932e1a26fc844def6b5e', './include/SugarObjects/templates/issue/metadata/searchdefs.php' => '8b387defff2b8da8873d8201281a7357', @@ -6204,10 +6205,11 @@ $md5_string = array ( './include/SugarFields/Fields/Text/DetailView.tpl' => 'd068de082c81d4fef6801093e3365de9', './include/SugarFields/Fields/Text/ClassicEditView.tpl' => '6ddfbc834a3962bdf07a328b2eba147a', './include/SugarFields/Fields/Relate/SugarFieldRelate.php' => '73fb031df1ccbef0c583a9ddd7e8276c', - './include/SugarFields/Fields/Relate/SearchView.tpl' => 'ad010432f43f13ad201639cb6f8fb338', + './include/SugarFields/Fields/Relate/SearchView.tpl' => '9ff5da2e1acf235d56eb8f4ffaecde95', './include/SugarFields/Fields/Relate/EditView.tpl' => '1b169d23d4be3ec144dea0ad642dd9be', './include/SugarFields/Fields/Relate/DetailView.tpl' => 'e4853db1a2b8b80081d27a26e4e4a39f', './include/SugarFields/Fields/Readonly/SugarFieldReadonly.php' => '15cc02846154744f83908e9c141e284f', + './include/SugarFields/Fields/Radioenum/SugarFieldRadioenum.php' => 'e0561c241c45d0fdc6246ae4cbb003a4', './include/SugarFields/Fields/Radioenum/EditView.tpl' => '3a702fdbbae1aadccf766091ec8fc15e', './include/SugarFields/Fields/Radioenum/DetailView.tpl' => '73ef83f9c364ccf4a45fcef0515297b6', './include/SugarFields/Fields/Phone/SugarFieldPhone.php' => '309d20c10c0836d3116c87b89e0c7c0e', @@ -6246,8 +6248,8 @@ $md5_string = array ( './include/SugarFields/Fields/File/SugarFieldFile.js' => '5c9fa7cb03a5604274afb542df08ae5b', './include/SugarFields/Fields/File/SearchView.tpl' => '3caa8a3b0a97a20169c404260788879f', './include/SugarFields/Fields/File/ListView.tpl' => 'd747a01d5b25abb348c51f7bd0154403', - './include/SugarFields/Fields/File/SugarFieldFile.php' => '5178a493455ac17bde7305e19325473f', - './include/SugarFields/Fields/File/EditView.tpl' => '028da6704e78020d9bd75c2554d5d907', + './include/SugarFields/Fields/File/SugarFieldFile.php' => 'f6bc4adb18ef8b53f4361f366dc7fb33', + './include/SugarFields/Fields/File/EditView.tpl' => '76ef95550d9f50581f43fdaa2af3cc77', './include/SugarFields/Fields/File/DetailView.tpl' => 'b2b300b0591fd73e4ea65f597ea0235c', './include/SugarFields/Fields/Enum/SugarFieldEnum.php' => '01b94cd983a49a9e5e3a293a6cdec390', './include/SugarFields/Fields/Enum/SearchView.tpl' => '98e0ef529a1f684b9ee2a0dab4e1c340', @@ -6261,7 +6263,7 @@ $md5_string = array ( './include/SugarFields/Fields/Datetimecombo/RangeSearchForm.tpl' => '0edf06f50d83a4d226a897d25a1de4ce', './include/SugarFields/Fields/Datetimecombo/SugarFieldDatetimecombo.php' => 'cb5c2d07cddab8ba2afc1bad8f0de12a', './include/SugarFields/Fields/Datetimecombo/SearchView.tpl' => '22ec532f10029bdce93941b602c8b4f0', - './include/SugarFields/Fields/Datetimecombo/EditView.tpl' => 'e7e36122180e4a239090ee1bc9ca20a8', + './include/SugarFields/Fields/Datetimecombo/EditView.tpl' => '4d41cc8a275c8ed06545725f23741384', './include/SugarFields/Fields/Datetime/SugarFieldDatetime.php' => '13156ffbe44fe0dae2ee3e7b3827f253', './include/SugarFields/Fields/Datetime/EditView.tpl' => '5b9f0dae101531713a87513ae0a8cf91', './include/SugarFields/Fields/Currency/SugarFieldCurrency.php' => '634092129fd9a7cddb7cd8cefeaa1c6c', @@ -6303,12 +6305,12 @@ $md5_string = array ( './include/SugarFields/Fields/Address/SugarFieldAddress.php' => '7e7b54a4d6e4b3ba10fb8815b7d9c9d6', './include/SugarFields/Fields/Address/EditView.tpl' => '40eaefd79f8905ebdf00a50c70ba584d', './include/SugarFields/Fields/Address/DetailView.tpl' => 'c988796dbaedffe8575a131f74564857', - './include/SugarEmailAddress/SugarEmailAddress.js' => 'a71eae238abbb142e667873aa62a9d02', + './include/SugarEmailAddress/SugarEmailAddress.js' => '0457af7a2f58345efc295d8e7f30ad3d', './include/SugarEmailAddress/templates/forWideFormBodyView.tpl' => '6d07e3db7e16d09cc2e4b3752169fbd4', './include/SugarEmailAddress/templates/forEditView.tpl' => 'ab460b18fc7f4307b2491ed83461417c', './include/SugarEmailAddress/templates/forDuplicatesView.tpl' => '48529a015533cdd2ce8db08a826dd09c', './include/SugarEmailAddress/templates/forDetailView.tpl' => '75be62dc812205b17178d2aebecd2f19', - './include/SugarEmailAddress/SugarEmailAddress.php' => '2e4f5009d68fc82b3f5ff1d477ae1547', + './include/SugarEmailAddress/SugarEmailAddress.php' => '182dafe3d80eb75bd6add3e6dc3cc5db', './include/SugarDependentDropdown/metadata/dependentDropdown.php' => 'ef0d061a5bfb5641e65f55560213e209', './include/SugarDependentDropdown/javascript/SugarDependentDropdown.js' => '480bc0db43abac0ec4ddcde0db5f1014', './include/SugarDependentDropdown/SugarDependentDropdown.php' => 'c27f9273801a6686f233b4ed1100b369', @@ -6335,7 +6337,7 @@ $md5_string = array ( './include/SugarCharts/Jit/FlashCanvas/save.php' => 'b128689255043db993d1cc2f4bc484bc', './include/SugarCharts/Jit/FlashCanvas/proxy.php' => '82ccbc7400b0bda3a33316920de41e60', './include/SugarCharts/Jit/FlashCanvas/flashcanvas.swf' => '528d82bb81799f23d4def3425badf913', - './include/SugarCharts/SugarChart.php' => 'f54b507f2d04cfcb2b670f408dfd9192', + './include/SugarCharts/SugarChart.php' => 'af248f083b6247c9a6fd5417b897cb14', './include/SubPanel/SubPanelTiles.js' => '50e304ca37344ff17a4a07100aaa0b34', './include/SubPanel/tpls/singletabmenu.tpl' => '61d073f56fa3fbee90daa84950fb60a3', './include/SubPanel/subpanels.txt' => '8b89c0ee2426d40916d98a646ec26e7a', @@ -6379,7 +6381,7 @@ $md5_string = array ( './include/Smarty/plugins/function.sugarvar_connector.php' => 'cdd2903777ee7f1aeee223140eac11d0', './include/Smarty/plugins/function.sugarvar.php' => '5e7f2cf7aa362630648ce79689c643a9', './include/Smarty/plugins/function.sugar_variable_constructor.php' => '6561cdb5987f989d18090a4713c9a27a', - './include/Smarty/plugins/function.sugar_translate.php' => 'b52ec4b3da8315a561df668fdfa82a1a', + './include/Smarty/plugins/function.sugar_translate.php' => '6c15cff8d615f848193726c8cd154b18', './include/Smarty/plugins/function.sugar_run_helper.php' => '2118a0bb279e18aae2b0fe9237e6ba6d', './include/Smarty/plugins/function.sugar_replace_vars.php' => 'a72d58f8842fcd9b39126d6324f1157a', './include/Smarty/plugins/function.sugar_phone.php' => '0b698000fe4c56eaa01498f363a62907', @@ -6456,12 +6458,12 @@ $md5_string = array ( './include/SearchForm/tpls/SearchFormGenericAdvanced.tpl' => '8513d66e5e35f7a5d8e6aa10bcdaa00a', './include/SearchForm/tpls/SearchFormGeneric.tpl' => '6bd324f8c9145e9a100aa6f99efc5a20', './include/SearchForm/SugarSpot.php' => '0536606cc025c51415010ff7ea4c307b', - './include/SearchForm/SearchForm2.php' => '97133d2d69719b427141a77246850b3b', + './include/SearchForm/SearchForm2.php' => '84c443bf1a9a2fb38eb3e9c3b5997149', './include/SearchForm/SearchForm.php' => '021ef820b8e6de5685cce6e79cdb1648', './include/QuickSearchDefaults.php' => '88b97ced88d3731c401b56b94c91e775', './include/Popups/tpls/header.tpl' => '87575a24e2cb8d828fc1eae2a7378952', './include/Popups/tpls/footer.tpl' => '0a34f3223e0e1b88cf09b3a657b61924', - './include/Popups/tpls/PopupGeneric.tpl' => '99507106e55ee28bcd652882b188b236', + './include/Popups/tpls/PopupGeneric.tpl' => 'fd9ee8f9e8be4b16edf77391d7c5c02f', './include/Popups/Popup_picker.php' => '2b2071f0293ba8a28f95dd657598910d', './include/Popups/PopupSmarty.php' => '5d98043dfed17471253b101177a6ae7e', './include/Pear/XML_HTMLSax3/LICENSE' => 'a45bb1bbeed9e26b26c5763df1d3913d', @@ -6481,15 +6483,15 @@ $md5_string = array ( './include/MySugar/tpls/addDashletsDialog.tpl' => '6c91f3cefcd2a8e9997631bc2cbb4c65', './include/MySugar/tpls/MySugar.tpl' => '10c556f20699f03dcbb213e5c629e877', './include/MySugar/javascript/MySugar.js' => 'b35073d24f6fa5b2046eba37e9aeb14f', - './include/MySugar/MySugar.php' => '49a8305a2193bbe445ac092d22ff854d', + './include/MySugar/MySugar.php' => '7d325108dbcd3ce328fa714c62ec7a55', './include/MySugar/DashletsDialog/DashletsDialog.php' => 'e16fcfab4cb76f1cbfb4d8d4fb53100a', - './include/MassUpdate.php' => '9a5b3903de0deb19f3f0860a5fd32c8b', + './include/MassUpdate.php' => 'f81092136ba82618f3142bc31e79af88', './include/MVC/View/views/view.xml.php' => '028d18c71c2dae2db826d0cc6d32306c', './include/MVC/View/views/view.vcard.php' => '32fa32960fe82caee39fcb8833541ad5', './include/MVC/View/views/view.sugarpdf.php' => '334694668f28d954182d05c196eef396', './include/MVC/View/views/view.sugarpdf.config.php' => 'e98d6968b4b8a70797d07b311553e7f0', './include/MVC/View/views/view.serialized.php' => '6746e128e8dacee78ecbf70ea3559cbb', - './include/MVC/View/views/view.quickcreate.php' => 'a284e9d16d7b9b6d641b93c77edc117b', + './include/MVC/View/views/view.quickcreate.php' => 'af21a48454ccec122fa19dad51521f6b', './include/MVC/View/views/view.quick.php' => '9a1fa9ad8fce5230124ee320fcc42266', './include/MVC/View/views/view.popup.php' => '840037771e14e3a828783d8ac486c725', './include/MVC/View/views/view.noaccess.php' => '1cab33d38afb080ca5dbfaa70a05e69a', @@ -6514,12 +6516,12 @@ $md5_string = array ( './include/MVC/SugarModule.php' => 'ce58476e24ad1717fe30192d10e28adc', './include/MVC/SugarApplication.php' => 'aa5f4873f931f586d311810e180e11e3', './include/MVC/Controller/file_access_control_map.php' => 'c94a1a349da51c17f5758d5f1ad6a364', - './include/MVC/Controller/entry_point_registry.php' => '0b6daeee64e3648e297811bbcd297717', + './include/MVC/Controller/entry_point_registry.php' => '4d01e1183701ca2b002f494706c1852e', './include/MVC/Controller/action_view_map.php' => 'b5a22402b8cd64eb8971a99a14a99c03', './include/MVC/Controller/action_file_map.php' => 'c35918d4fb518bb6f3c682efbabc10a4', './include/MVC/Controller/SugarController.php' => '32152f62c684bbb63bda849427c5dabb', './include/MVC/Controller/ControllerFactory.php' => '52b59a09b463a19eff7f34203b425447', - './include/Localization/Localization.php' => '7703c0441d1391a48a84ffc5db363e62', + './include/Localization/Localization.php' => '6802050d598d1921aa729e81ebf70505', './include/ListView/ListViewDCMenu.tpl' => '106226bf74c3da2aab933ae8869b69bd', './include/ListView/ListViewXTPL.php' => 'e70a4929a6e81eb2f63d60a5302c0780', './include/ListView/ListViewSmarty.php' => 'c3b44cb91aba732ed13888f0b219a672', @@ -6527,9 +6529,9 @@ $md5_string = array ( './include/ListView/ListViewNoMassUpdate.tpl' => 'b67e393107c9d80223e4abb21eec261a', './include/ListView/ListViewGeneric.tpl' => 'd8089d8dc41ef1428076eefff2ab9e69', './include/ListView/ListViewFacade.php' => 'eca289f7cf40a7e503255644bec57716', - './include/ListView/ListViewDisplay.php' => '6279278167a630ab00dcc634b634eb54', + './include/ListView/ListViewDisplay.php' => '1cacb2736463eb46a0afa3b78d12dfa8', './include/ListView/ListViewData.php' => '57d87d2efe1c5d174c015147058be1ce', - './include/ListView/ListView.php' => '6ee1ea0c48f42256d43a41e79ecbfb53', + './include/ListView/ListView.php' => '718b37f45e567fb813ab593166fba9d6', './include/JSON.php' => '419327255daae457ef1765ec305148f3', './include/HTTP_WebDAV_Server/license.txt' => 'a45bb1bbeed9e26b26c5763df1d3913d', './include/HTTP_WebDAV_Server/dav.txt' => 'c5235ed64efa685da638c6dcdb6a9708', @@ -6546,7 +6548,7 @@ $md5_string = array ( './include/EditView/QuickCreate.tpl' => '7b5551dd497dfb15af7ae2732db18e44', './include/EditView/QuickCreate.php' => '20043843a73497bc94bda42a3a54b38e', './include/EditView/PopupQuickCreate.php' => 'e7347241af58af0d28b86fde19695946', - './include/EditView/EditView2.php' => '33cade11e03b7b0ac59845c8fed4517d', + './include/EditView/EditView2.php' => '8dbae87a0d24f02011b26b236b2184fc', './include/EditView/EditView.tpl' => '09d53d334288cfa0b41bdc929d98dd22', './include/EditView/EditView.php' => '0666ea6e21db2c8ef2a6a7615ea010c7', './include/DetailView/header.tpl' => '784a15901fbebe39f7495c56df41a758', @@ -6554,6 +6556,7 @@ $md5_string = array ( './include/DetailView/DetailView2.php' => '9478bef6cdad4af70878d6be5962909d', './include/DetailView/DetailView.tpl' => 'a7e16e70f76c420076b72ad3305b77b2', './include/DetailView/DetailView.php' => '35d047b596e7d3c9e122703c9c0c9c2b', + './include/Dashlets/DashletRssFeedTitle.php' => 'bada41e47f194a820f23f1aae8f55f2c', './include/Dashlets/DashletGenericAutoRefreshDynamic.tpl' => 'f769c32f17ac26313b340fec2861112e', './include/Dashlets/DashletGenericDisplay.tpl' => 'd6afdb7417234d0bb5e82388d3b69c84', './include/Dashlets/DashletGenericConfigure.tpl' => '9c9bdb6f6d6a79b2ac325fc40790b695', @@ -6564,7 +6567,7 @@ $md5_string = array ( './include/Dashlets/DashletCacheBuilder.php' => '80f7f6f582d141f5b1e3f8d5da52bf34', './include/Dashlets/Dashlet.php' => 'c6096d2756a85211bdd40d8013047e78', './image.php' => '59c0f0d2767ed6ed5eac96335ad6d732', - './json_server.php' => '53ba3afb1b4d46c39268e389ac55d5bf', + './json_server.php' => '666b79888f08bbe2a75bd4990426da04', './examples/SoapTestPortal2.php' => '83c1dbd821d080177d9e1a98725f341b', './examples/SoapTestPortal.php' => 'bc2626338e0c48ddd7a8b7ec7dbf134e', './examples/SoapTest.php' => 'f196b60b8c1bc69818d70f34924bc7bc', @@ -6573,7 +6576,7 @@ $md5_string = array ( './examples/ExampleLeadCapture.php' => 'd6deb45572959e642fb019253c5703dc', './examples/EXAMPLES_README.txt' => 'b55744b5e2684d91f6d3f98db4553673', './emailmandelivery.php' => 'eddfad677960438dfe1584bca8718acf', - './download.php' => '75ddbbfdca6a719c7369089cedd6ce72', + './download.php' => '4958eb23abe4d07f3f5d3053bba10741', './dictionary.php' => '42619156f21102938b4da79d2cf9cb48', './Zend/Version.php' => '7ed9dea03172b0f8fb11f085a17f100b', './Zend/Validate/Ip.php' => '05326c26a0f419d8dac8c168f6cb7f12', @@ -6863,10 +6866,10 @@ $md5_string = array ( './Zend/Gdata/DublinCore/Extension/Date.php' => 'f6a1f1f6de749607aefe748c0032f52f', './Zend/Gdata/DublinCore/Extension/Creator.php' => 'd90628cbac0f51ebc078265b77ea2450', './Zend/Gdata/DublinCore.php' => 'b0bac63dc1a6b8cdedf8eb0a614688c3', - './Zend/Gdata/Docs/Query.php' => 'd78e6e5d4921f901d42ee1470a0037be', + './Zend/Gdata/Docs/Query.php' => 'de6db58a1fb73b0d819d73b827d79612', './Zend/Gdata/Docs/DocumentListFeed.php' => '0e1f8bd2edd405a2cc7338398ebc8193', './Zend/Gdata/Docs/DocumentListEntry.php' => 'eca757a3e4835b698ca58ed561c62528', - './Zend/Gdata/Docs.php' => 'bf405da462f8af4c2b482e1c396df580', + './Zend/Gdata/Docs.php' => '3d94d75d20789fff946a4e70c37c1c73', './Zend/Gdata/ClientLogin.php' => '24f07d68ad16d4d76c3ac02b0a172179', './Zend/Gdata/Calendar/ListFeed.php' => '689104be14f604a351305bd4f259534b', './Zend/Gdata/Calendar/ListEntry.php' => 'a703e4f6997b1d2220ea7d8ca71bfeac', @@ -6965,13 +6968,13 @@ $md5_string = array ( './Zend/Crypt/DiffieHellman.php' => 'ec0a4f522b732f7fcbb9c4ab94d926e1', './Zend/Crypt.php' => '0e72fd104506094fd2c7682b0b924542', './install.php' => '19729b83b5d2ea947763f56f264a88e8', - './export.php' => '44550cd8bb3c34fc7b8dac67b549b6db', + './export.php' => 'e98d50f9c92189941c352613ba594cbf', './data/upload/index.html' => '9cd784063d39b18d308932c28c385853', './data/Tracker.php' => '5dfc3f390ecccd8cbb1229e01f878593', - './data/SugarBean.php' => '8b9772c47053ac6d18e610e664d3c87f', + './data/SugarBean.php' => 'd0c9381ce074618f013713ba097bd0f8', './data/Link.php' => '4274e59a6547b8022ebbdf70120d916e', './custom/index.html' => 'b0070a296647b6026d1800db14510e3c', - './cron.php' => '99055ca0a11c9810e9d3d655c4fb32d2', + './cron.php' => '3d65f5cc08d20790387c79a761c776f7', './campaign_trackerv2.php' => '66ca6f16d0d670bcaf528f4b9d95494b', './campaign_tracker.php' => 'e0f56c0cc526128e1b931f120b00460a', './cache/xml/index.html' => '9cd784063d39b18d308932c28c385853', @@ -7000,7 +7003,7 @@ $md5_string = array ( './ModuleInstall/PackageManager/PackageManager.php' => 'db2831d05f733613056e7fe599d06fa9', './ModuleInstall/PackageManager/PackageController.php' => '425566c9378597c7990692fe993b5dc4', './ModuleInstall/PackageManager/ListViewPackages.php' => 'e4641f286e0b5c4e0aad030159d14a2d', - './ModuleInstall/ModuleScanner.php' => 'b7d0d4df51b9b531020fab6f37239157', + './ModuleInstall/ModuleScanner.php' => '7c25685e0d3b677e1074628be8a1b1fc', './ModuleInstall/ModuleInstaller.php' => 'b30c2b24c43efb8d53b1a829b78f832d', './HandleAjaxCall.php' => 'cc43ac1ae1b3545ae98e79f12da47d14', ); diff --git a/include/Dashlets/DashletRssFeedTitle.php b/include/Dashlets/DashletRssFeedTitle.php new file mode 100644 index 00000000..b89aee33 --- /dev/null +++ b/include/Dashlets/DashletRssFeedTitle.php @@ -0,0 +1,123 @@ +url = $url; + } + + /** + * Yeah, assign an empty string, because unset(classproperty) will cause an exception in php 5.3.3 + * + */ + public function __destruct() { + $this->contents = ''; + } + + public function generateTitle() { + if ($this->readFeed()) { + $this->getTitle(); + if (!empty($this->title)) { + $this->convertEncoding(); + $this->cutLength(); + } + } + return $this->title; + } + + /** + * @todo use curl with waiting timeout instead of fopen + */ + public function readFeed() { + if ($this->url) { + $fileOpen = @fopen($this->url, 'r'); + if ($fileOpen) { + $this->fileOpen = true; + $this->contents = fread($fileOpen, $this->readBytes); + fclose($fileOpen); + return true; + } + } + return false; + } + + /** + * + */ + public function getTitle() { + $matches = array (); + preg_match("/.*?<\/title>/i", $this->contents, $matches); + if (isset($matches[0])) { + $this->title = str_replace(array('<![CDATA[', '<title>', '', ']]>'), '', $matches[0]); + } + } + + public function cutLength() { + if (mb_strlen(trim($this->title), $this->defaultEncoding) > $this->cut) { + $this->title = mb_substr($this->title, 0, $this->cut, $this->defaultEncoding) . $this->endWith; + } + } + + private function _identifyXmlEncoding() { + $matches = array (); + preg_match('/encoding\=*\".*?\"/', $this->contents, $matches); + if (isset($matches[0])) { + $this->xmlEncoding = trim(str_replace('encoding="', '"', $matches[0]), '"'); + } + } + + public function convertEncoding() { + $this->_identifyXmlEncoding(); + if ($this->xmlEncoding && $this->xmlEncoding != $this->defaultEncoding) { + $this->title = iconv($this->xmlEncoding, $this->defaultEncoding, $this->title); + } + } +} \ No newline at end of file diff --git a/include/EditView/EditView2.php b/include/EditView/EditView2.php index 23b5be37..cd9cbfd9 100644 --- a/include/EditView/EditView2.php +++ b/include/EditView/EditView2.php @@ -279,6 +279,7 @@ class EditView $panelCount = 0; static $itemCount = 100; //Start the generated tab indexes at 100 so they don't step on custom ones. + /* loop all the panels */ foreach ($this->defs['panels'] as $key=>$p) { @@ -289,46 +290,34 @@ class EditView } else { - foreach ($p as $row=>$rowDef) - { - $columnsInRows = count($rowDef); - $columnsUsed = 0; - foreach ($rowDef as $col => $colDef) - { - $panel[$row][$col] = is_array($p[$row][$col]) - ? array('field' => $p[$row][$col]) - : array('field' => array('name'=>$p[$row][$col])); - - $panel[$row][$col]['field']['tabindex'] = - (isset($p[$row][$col]['tabindex']) && is_numeric($p[$row][$col]['tabindex'])) - ? $p[$row][$col]['tabindex'] - : $itemCount; - - if ($columnsInRows < $maxColumns) - { - if ($col == $columnsInRows - 1) - { - $panel[$row][$col]['colspan'] = 2 * $maxColumns - ($columnsUsed + 1); - } - else - { - $panel[$row][$col]['colspan'] = floor(($maxColumns * 2 - $columnsInRows) / $columnsInRows); - $columnsUsed = $panel[$row][$col]['colspan']; - } - } - - //Set address types to have colspan value of 2 if colspan is not already defined - if (is_array($colDef) && !empty($colDef['hideLabel']) && !isset($panel[$row][$col]['colspan'])) - { - $panel[$row][$col]['colspan'] = 2; - } - - $itemCount++; - - } - } + foreach($p as $row=>$rowDef) { + $columnsInRows = count($rowDef); + $columnsUsed = 0; + foreach($rowDef as $col => $colDef) { + $panel[$row][$col] = is_array($p[$row][$col]) ? array('field' => $p[$row][$col]) : array('field' => array('name'=>$p[$row][$col])); + $panel[$row][$col]['field']['tabindex'] = (isset($p[$row][$col]['tabindex']) && is_numeric($p[$row][$col]['tabindex'])) ? $p[$row][$col]['tabindex'] : $itemCount; + + if($columnsInRows < $maxColumns) { + if($col == $columnsInRows - 1) { + $panel[$row][$col]['colspan'] = 2 * $maxColumns - ($columnsUsed + 1); + } else { + $panel[$row][$col]['colspan'] = floor(($maxColumns * 2 - $columnsInRows) / $columnsInRows); + $columnsUsed = $panel[$row][$col]['colspan']; + } + } + + //Set address types to have colspan value of 2 if colspan is not already defined + if(is_array($colDef) && !empty($colDef['hideLabel']) && !isset($panel[$row][$col]['colspan'])) { + $panel[$row][$col]['colspan'] = 2; + } + + $itemCount++; + + } //foreach + } //foreach + + $panel = $this->getPanelWithFillers($panel); - $panel = $this->getPanelWithFillers($panel); $this->sectionPanels[strtoupper($key)] = $panel; } diff --git a/include/ListView/ListView.php b/include/ListView/ListView.php index c7f0281b..ebea29b4 100644 --- a/include/ListView/ListView.php +++ b/include/ListView/ListView.php @@ -1515,7 +1515,7 @@ function getUserVariable($localVarName, $varName) { if($orderBy == $column_name || (isset($widget_args['sort_by']) && str_replace('.','_',$widget_args['sort_by']) == $orderBy)) { $imgArrow = "_down"; - if($this->sort_order == 'desc') { + if($this->sort_order == 'asc') { $imgArrow = "_up"; } } diff --git a/include/ListView/ListViewDisplay.php b/include/ListView/ListViewDisplay.php index 3b33ae6b..2e6c0727 100644 --- a/include/ListView/ListViewDisplay.php +++ b/include/ListView/ListViewDisplay.php @@ -72,12 +72,17 @@ class ListViewDisplay { $this->searchColumns = array () ; } function shouldProcess($moduleDir){ + $searching = false; + $sessionSearchQuery = "{$moduleDir}2_QUERY_QUERY"; + if (!empty($_SESSION[$sessionSearchQuery])) { + $searching = true; + } if(!empty($GLOBALS['sugar_config']['save_query']) && $GLOBALS['sugar_config']['save_query'] == 'populate_only'){ if(empty($GLOBALS['displayListView']) && (!empty($_REQUEST['clear_query']) || $_REQUEST['module'] == $moduleDir && ((empty($_REQUEST['query']) || $_REQUEST['query'] == 'MSI' ) - && (empty($_SESSION['last_search_mod']) || $_SESSION['last_search_mod'] != $moduleDir ) ))){ + && (!$searching)))) { $_SESSION['last_search_mod'] = $_REQUEST['module'] ; $this->should_process = false; return false; diff --git a/include/Localization/Localization.php b/include/Localization/Localization.php index 74f3b9f3..f6c61409 100644 --- a/include/Localization/Localization.php +++ b/include/Localization/Localization.php @@ -324,16 +324,42 @@ class Localization { * @param string toCharset the charset to translate into (defaults to UTF-8) * @return string the translated string */ - function translateCharset($string, $fromCharset, $toCharset='UTF-8') { - $GLOBALS['log']->debug("Localization: translating [ {$string} ] into {$toCharset}"); - if(function_exists('mb_convert_encoding')) { - return mb_convert_encoding($string, $toCharset, $fromCharset); - } elseif(function_exists('iconv')) { // iconv is flakey - return iconv($fromCharset, $toCharset, $string); - } else { - return $string; - } // end else clause - } + function translateCharset($string, $fromCharset, $toCharset='UTF-8') + { + $GLOBALS['log']->debug("Localization: translating [ {$string} ] into {$toCharset}"); + + // Bug #35413 Function has to use iconv if $fromCharset is not in mb_list_encodings + $isMb = function_exists('mb_convert_encoding'); + $isIconv = function_exists('iconv'); + if ($isMb == true) + { + $fromCharset = strtoupper($fromCharset); + $listEncodings = mb_list_encodings(); + $isFound = false; + foreach ($listEncodings as $encoding) + { + if (strtoupper($encoding) == $fromCharset) + { + $isFound = true; + break; + } + } + $isMb = $isFound; + } + + if($isMb) + { + return mb_convert_encoding($string, $toCharset, $fromCharset); + } + elseif($isIconv) + { + return iconv($fromCharset, $toCharset, $string); + } + else + { + return $string; + } // end else clause + } /** * translates a character set from one to another, and the into MIME-header friendly format @@ -668,7 +694,7 @@ eoq; field.value = name; } - setPreview();"; + "; return $ret; } diff --git a/include/MVC/Controller/entry_point_registry.php b/include/MVC/Controller/entry_point_registry.php index 30a27519..dc67f8f5 100644 --- a/include/MVC/Controller/entry_point_registry.php +++ b/include/MVC/Controller/entry_point_registry.php @@ -52,7 +52,6 @@ $entry_point_registry = array( 'vCard' => array('file' => 'vCard.php', 'auth' => true), 'pdf' => array('file' => 'pdf.php', 'auth' => true), 'minify' => array('file' => 'jssource/minify.php', 'auth' => true), - 'json' => array('file' => 'json.php', 'auth' => true), 'json_server' => array('file' => 'json_server.php', 'auth' => true), 'HandleAjaxCall' => array('file' => 'HandleAjaxCall.php', 'auth' => true), 'TreeData' => array('file' => 'TreeData.php', 'auth' => true), diff --git a/include/MVC/View/views/view.quickcreate.php b/include/MVC/View/views/view.quickcreate.php index 063b7ac3..5d7a8ae9 100644 --- a/include/MVC/View/views/view.quickcreate.php +++ b/include/MVC/View/views/view.quickcreate.php @@ -42,9 +42,6 @@ require_once('include/EditView/EditView2.php'); class ViewQuickcreate extends ViewAjax { - /** - * $var true if this form is used in the Dashlet Container - */ protected $_isDCForm = false; /** diff --git a/include/MassUpdate.php b/include/MassUpdate.php index 4179fc3e..fce8c5e4 100644 --- a/include/MassUpdate.php +++ b/include/MassUpdate.php @@ -174,7 +174,10 @@ eoq; if(strcmp($value, '2') == 0)$_POST[$post] = 'off'; } } - if($this->sugarbean->field_defs[$post]['type'] == 'radioenum' && isset($_POST[$post]) && strlen($value) == 0){ + + if( ($this->sugarbean->field_defs[$post]['type'] == 'radioenum' && isset($_POST[$post]) && strlen($value) == 0) + || ($this->sugarbean->field_defs[$post]['type'] == 'enum' && $value == '__SugarMassUpdateClearField__') // Set to '' if it's an explicit clear + ){ $_POST[$post] = ''; } if ($this->sugarbean->field_defs[$post]['type'] == 'bool') { @@ -189,8 +192,8 @@ eoq; if($this->sugarbean->field_defs[$post]['type'] == 'datetimecombo' && !empty($_POST[$post])){ $_POST[$post] = $timedate->to_db($_POST[$post]); } - } - } + } + } //We need to disable_date_format so that date values for the beans remain in database format //notice we make this call after the above section since the calls to TimeDate class there could wind up diff --git a/include/MySugar/MySugar.php b/include/MySugar/MySugar.php index d0726b3f..68730b55 100644 --- a/include/MySugar/MySugar.php +++ b/include/MySugar/MySugar.php @@ -87,17 +87,12 @@ class MySugar{ $guid = create_guid(); $options = array(); if (isset($_REQUEST['type']) && $_REQUEST['type'] == 'web') { - $dashlet_module = 'Home'; - $options['url'] = $_REQUEST['type_module']; - $fp = @fopen($options['url'],'r'); - if ( $fp ) { - $page = fread($fp,8192); - $matches = array(); - preg_match("/(.*)<\/title>/i",$page,$matches); - if ( isset($matches[1]) ) - $options['title'] = str_replace('<![CDATA[','',str_replace(']]>','',$matches[1])); - fclose($fp); - } + $dashlet_module = 'Home'; + require_once('include/Dashlets/DashletRssFeedTitle.php'); + $options['url'] = $_REQUEST['type_module']; + $webDashlet = new DashletRssFeedTitle($options['url']); + $options['title'] = $webDashlet->generateTitle(); + unset($webDashlet); } elseif (!empty($_REQUEST['type_module'])) { $dashlet_module = $_REQUEST['type_module']; diff --git a/include/Popups/tpls/PopupGeneric.tpl b/include/Popups/tpls/PopupGeneric.tpl index ea54f920..7d4ad323 100644 --- a/include/Popups/tpls/PopupGeneric.tpl +++ b/include/Popups/tpls/PopupGeneric.tpl @@ -116,7 +116,7 @@ <th scope='col' width='{$params.width}%' nowrap="nowrap"> <div style='white-space: nowrap;'width='100%' align='{$params.align|default:'left'}'> {if $params.sortable|default:true} - <a href='#' onclick='location.href="{$pageData.urls.orderBy}{$params.orderBy|default:$colHeader|lower}"; return sListView.save_checks(0, "{$moduleString}");' class='listViewThLinkS1'>{sugar_translate label=$params.label module=$pageData.bean.moduleDir}   + <a href="{$pageData.urls.orderBy}{$params.orderBy|default:$colHeader|lower}" onclick='sListView.save_checks(0, "{$moduleString}");' class='listViewThLinkS1'>{sugar_translate label=$params.label module=$pageData.bean.moduleDir}</a>   {if $params.orderBy|default:$colHeader|lower == $pageData.ordering.orderBy} {if $pageData.ordering.sortOrder == 'ASC'} {capture assign="imageName"}arrow_down.{$arrowExt}{/capture} @@ -129,7 +129,6 @@ {capture assign="imageName"}arrow.{$arrowExt}{/capture} <img border='0' src='{sugar_getimagepath file=$imageName}' width='{$arrowWidth}' height='{$arrowHeight}' align='absmiddle' alt='{$arrowAlt}'> {/if} - </a> {else} {sugar_translate label=$params.label module=$pageData.bean.moduleDir} {/if} diff --git a/include/SearchForm/SearchForm2.php b/include/SearchForm/SearchForm2.php index b8075daa..20d748e3 100644 --- a/include/SearchForm/SearchForm2.php +++ b/include/SearchForm/SearchForm2.php @@ -132,7 +132,7 @@ require_once('include/EditView/EditView2.php'); 'name' => 'advanced', 'displayDiv' => 'display:none'); } - if($this->showCustom){ + if(isset($this->showCustom) && is_array($this->showCustom)){ foreach($this->showCustom as $v){ $this->nbTabs++; $this->tabs[]=array('title' => $GLOBALS['app_strings']["LNK_" . strtoupper($v)], @@ -574,7 +574,7 @@ require_once('include/EditView/EditView2.php'); if($parms['operator'] == '=') { $field_type = isset($this->seed->field_name_map[$real_field]['type']) ? $this->seed->field_name_map[$real_field]['type'] : ''; - if($field_type == 'datetimecombo' || $field_type == 'datetime') + if($field_type == 'datetimecombo' || $field_type == 'datetime' || $field_type == 'int') { $type = $field_type; } @@ -837,12 +837,12 @@ require_once('include/EditView/EditView2.php'); } elseif (preg_match('/^\[[(this|last|next)_][_a-z0-9]*\]$/', $field_value)) { switch($operator) { case 'last_7_days': - $startDate = $timedate->getDayStartEndGMT(date('m/d/Y', time() - (7 * 24 * 60 * 60))); + $startDate = $timedate->getDayStartEndGMT(date('m/d/Y', time() - (6 * TimeDate::SECONDS_IN_A_DAY))); $endDate = $timedate->getDayStartEndGMT(date('m/d/Y')); break; case 'next_7_days': $startDate = $timedate->getDayStartEndGMT(date('m/d/Y')); - $endDate = $timedate->getDayStartEndGMT(date('m/d/Y', time() + (7 * 24 * 60 * 60))); + $endDate = $timedate->getDayStartEndGMT(date('m/d/Y', time() + (6 * TimeDate::SECONDS_IN_A_DAY))); break; case 'next_month': $startDate = $timedate->getDayStartEndGMT(date('m/d/Y', mktime(0, 0, 0, date("m")+1, 01, date("Y")))); @@ -857,12 +857,12 @@ require_once('include/EditView/EditView2.php'); $endDate = $timedate->getDayStartEndGMT(date('m/d/Y', mktime(0, 0, -1, date("m")+1, 01, date("Y")))); break; case 'last_30_days': - $startDate = $timedate->getDayStartEndGMT(date('m/d/Y', time() - (30 * 24 * 60 * 60))); + $startDate = $timedate->getDayStartEndGMT(date('m/d/Y', time() - (29 * TimeDate::SECONDS_IN_A_DAY))); $endDate = $timedate->getDayStartEndGMT(date('m/d/Y')); break; case 'next_30_days': $startDate = $timedate->getDayStartEndGMT(date('m/d/Y')); - $endDate = $timedate->getDayStartEndGMT(date('m/d/Y', time() + (30 * 24 * 60 * 60))); + $endDate = $timedate->getDayStartEndGMT(date('m/d/Y', time() + (29 * TimeDate::SECONDS_IN_A_DAY))); break; case 'this_year': $startDate = $timedate->getDayStartEndGMT(date('m/d/Y', mktime(0, 0, 0, 01, 01, date("Y")))); @@ -920,7 +920,7 @@ require_once('include/EditView/EditView2.php'); $first_between = false; } - if(!empty($parms['enable_range_search']) && $parms['operator'] == '=') + if(!empty($parms['enable_range_search']) && $parms['operator'] == '=' && $type != 'int') { // Databases can't really search for floating point numbers, because they can't be accurately described in binary, // So we have to fuzz out the math a little bit diff --git a/include/Smarty/plugins/function.sugar_translate.php b/include/Smarty/plugins/function.sugar_translate.php index bfbf143b..d1c8c324 100644 --- a/include/Smarty/plugins/function.sugar_translate.php +++ b/include/Smarty/plugins/function.sugar_translate.php @@ -80,12 +80,11 @@ function smarty_function_sugar_translate($params, &$smarty) $value = addslashes($value); $value = str_replace(array(''', '''), "\'", $value); } - if(!empty($params['trimColon']) && !$params['trimColon']) { + if(isset($params['trimColon']) && !$params['trimColon']) { return $value; - } - elseif($params['label'] == '0') - return translate("DEFAULT", $module); - else { + } elseif($params['label'] == '0') { + return translate("DEFAULT", $module); + } else { return preg_replace("/([:]|\xEF\xBC\x9A)[\\s]*$/", "", $value); } } diff --git a/include/SugarCharts/SugarChart.php b/include/SugarCharts/SugarChart.php index 1d2587fe..d8857a35 100644 --- a/include/SugarCharts/SugarChart.php +++ b/include/SugarCharts/SugarChart.php @@ -531,40 +531,64 @@ class SugarChart { $processed = array(); if (isset($drill_down) && $drill_down != ''){ - for($i =0; $i < count($new_data[$groupByKey]); $i++){ - if ($new_data[$groupByKey][$i][$group_by] == $groupByKey){ - if ($drill_down == 'user_name'){ - $drill_down_param = '&assigned_user_id[]=' . urlencode($new_data[$groupByKey][$i]['assigned_user_id']); - } - else if ($drill_down == 'm'){ - $drill_down_param = '&date_closed_advanced=' . urlencode($new_data[$groupByKey][$i][$drill_down]); - } - else{ - $paramValue = (isset($new_data[$groupByKey][$i][$drill_down."_dom_option"]) && $new_data[$groupByKey][$i][$drill_down."_dom_option"] != '') ? $new_data[$groupByKey][$i][$drill_down."_dom_option"] : $new_data[$groupByKey][$i][$drill_down]; - $drill_down_param = '&' . $drill_down . '=' . urlencode($paramValue); - } - - if($this->is_currency) { - $sub_amount = $this->formatNumber($this->convertCurrency($new_data[$groupByKey][$i]['total'])); - $sub_amount_formatted = $this->currency_symbol . $sub_amount . 'K'; - //bug: 38877 - do not format the amount for the value as it breaks the chart - $sub_amount = $this->convertCurrency($new_data[$groupByKey][$i]['total']); - } else { - $sub_amount = $new_data[$groupByKey][$i]['total']; - $sub_amount_formatted = $sub_amount; - } - - $data .= $this->processDataGroup(4, $new_data[$groupByKey][$i][$drill_down], - $sub_amount, - $sub_amount_formatted, - $url . $drill_down_param ); - array_push($processed, $new_data[$groupByKey][$i][$drill_down]); - } - } - $not_processed = array_diff($this->super_set, $processed); - foreach ($not_processed as $title){ - $data .= $this->processDataGroup(4, $title, 'NULL', '', $url); - } + /* + * We have to iterate users in order they are in super_set for every group. + * That is required for correct pileup user links to user colors in a chart. + */ + foreach ($this->super_set as $superSetKey => $superSetValue) + { + $objectInSaleStage = false; + foreach ($value as $internalKey => $internalValue) + { + if ($internalValue[$drill_down] == $superSetValue) + { + $objectInSaleStage = $value[$internalKey]; + } + } + + if ($objectInSaleStage) + { + if (isset($objectInSaleStage[$group_by]) && $objectInSaleStage[$group_by] == $groupByKey) + { + if ($drill_down == 'user_name') + { + $drill_down_param = '&assigned_user_id[]=' . urlencode($objectInSaleStage['assigned_user_id']); + } + else if ($drill_down == 'm') + { + $drill_down_param = '&date_closed_advanced=' . urlencode($objectInSaleStage[$drill_down]); + } + else + { + $paramValue = (isset($objectInSaleStage[$drill_down . "_dom_option"]) && $objectInSaleStage[$drill_down . "_dom_option"] != '') ? $objectInSaleStage[$drill_down . "_dom_option"] : $objectInSaleStage[$drill_down]; + $drill_down_param = '&' . $drill_down . '=' . urlencode($paramValue); + } + + if ($this->is_currency) + { + $sub_amount = $this->formatNumber($this->convertCurrency($objectInSaleStage['total'])); + $sub_amount_formatted = $this->currency_symbol . $sub_amount . 'K'; + //bug: 38877 - do not format the amount for the value as it breaks the chart + $sub_amount = $this->convertCurrency($objectInSaleStage['total']); + } + else + { + $sub_amount = $objectInSaleStage['total']; + $sub_amount_formatted = $sub_amount; + } + + $data .= $this->processDataGroup(4, $objectInSaleStage[$drill_down], $sub_amount, $sub_amount_formatted, $url . $drill_down_param); + } + else + { + $data .= $this->nullGroup($superSetValue, $url); + } + } + else + { + $data .= $this->nullGroup($superSetValue, $url); + } + } } $data .= $this->tab('</subgroups>',3); @@ -573,6 +597,10 @@ class SugarChart { return $data; } + public function nullGroup($superSetValue, $url) { + return $this->processDataGroup(4, $superSetValue, 'NULL', '', $url); + } + /** * returns a name for the XML File * diff --git a/include/SugarEmailAddress/SugarEmailAddress.js b/include/SugarEmailAddress/SugarEmailAddress.js index 0b554b9a..db6299c3 100644 --- a/include/SugarEmailAddress/SugarEmailAddress.js +++ b/include/SugarEmailAddress/SugarEmailAddress.js @@ -41,10 +41,10 @@ var verifiedTextNode=document.createElement('span');verifiedTextNode.innerHTML=' if(savePressed||this.enterPressed){setTimeout("SUGAR.EmailAddressWidget.instances."+this.id+".forceSubmit()",2100);}else if(this.tabPressed){Dom.get(this.id+'emailAddressPrimaryFlag'+index).focus();}} var event=this.getEvent(event);var targetEl=this.getEventElement(event);var index=/[a-z]*\d?emailAddress(\d+)/i.exec(targetEl.id)[1];var verifyElementFlag=Dom.get(this.id+'emailAddressVerifiedFlag'+index);this.verifyElementValue=Dom.get(this.id+'emailAddressVerifiedValue'+index);verifyElementFlag.value=(trim(targetEl.value)==''||targetEl.value==this.verifyElementValue.value)?"true":"false" if(verifyElementFlag.parentNode.childNodes.length>1){verifyElementFlag.parentNode.removeChild(verifyElementFlag.parentNode.lastChild);} -if(/emailAddress\d+$/.test(targetEl.id)&&isValidEmail(targetEl.value)&&!this.verifying&&verifyElementFlag.value=="false"){verifiedTextNode=document.createElement('span');verifyElementFlag.parentNode.appendChild(verifiedTextNode);verifiedTextNode.innerHTML=SUGAR.language.get('app_strings','LBL_VERIFY_EMAIL_ADDRESS');this.verifying=true;var cObj=YAHOO.util.Connect.asyncRequest('GET','index.php?module=Contacts&action=RetrieveEmail&target='+targetEl.id+'&email='+targetEl.value,{success:callbackFunction,failure:callbackFunction,scope:this});}},handleKeyDown:function(event){var e=this.getEvent(event);var eL=this.getEventElement(e);if((kc=e["keyCode"])){this.enterPressed=(kc==13)?true:false;this.tabPressed=(kc==9)?true:false;if(this.enterPressed||this.tabPressed){this.retrieveEmailAddress(e);if(this.enterPressed);this.freezeEvent(e);}}},getEvent:function(event){return(event?event:window.event);},getEventElement:function(e){return(e.srcElement?e.srcElement:(e.target?e.target:e.currentTarget));},freezeEvent:function(e){if(e.preventDefault)e.preventDefault();e.returnValue=false;e.cancelBubble=true;if(e.stopPropagation)e.stopPropagation();return false;},addEmailAddress:function(tableId,address,primaryFlag,replyToFlag,optOutFlag,invalidFlag){if(this.addInProgress) +if(/emailAddress\d+$/.test(targetEl.id)&&isValidEmail(targetEl.value)&&!this.verifying&&verifyElementFlag.value=="false"){verifiedTextNode=document.createElement('span');verifyElementFlag.parentNode.appendChild(verifiedTextNode);verifiedTextNode.innerHTML=SUGAR.language.get('app_strings','LBL_VERIFY_EMAIL_ADDRESS');this.verifying=true;var cObj=YAHOO.util.Connect.asyncRequest('GET','index.php?module=Contacts&action=RetrieveEmail&target='+targetEl.id+'&email='+targetEl.value,{success:callbackFunction,failure:callbackFunction,scope:this});}},handleKeyDown:function(event){var e=this.getEvent(event);var eL=this.getEventElement(e);if((kc=e["keyCode"])){this.enterPressed=(kc==13)?true:false;this.tabPressed=(kc==9)?true:false;if(this.enterPressed||this.tabPressed){this.retrieveEmailAddress(e);if(this.enterPressed) +this.freezeEvent(e);}}},getEvent:function(event){return(event?event:window.event);},getEventElement:function(e){return(e.srcElement?e.srcElement:(e.target?e.target:e.currentTarget));},freezeEvent:function(e){if(e.preventDefault)e.preventDefault();e.returnValue=false;e.cancelBubble=true;if(e.stopPropagation)e.stopPropagation();return false;},addEmailAddress:function(tableId,address,primaryFlag,replyToFlag,optOutFlag,invalidFlag){if(this.addInProgress) return;this.addInProgress=true;if(!address) -address="";var insertInto=Dom.get(tableId);var parentObj=insertInto.parentNode;var newContent=document.createElement("input");var nav=new String(navigator.appVersion);var newContentPrimaryFlag;if(YAHOO.env.ua.ie){newContentPrimaryFlag=document.createElement("<input name='emailAddressPrimaryFlag' />");}else{newContentPrimaryFlag=document.createElement("input");} -var newContentReplyToFlag=document.createElement("input");var newContentOptOutFlag=document.createElement("input");var newContentInvalidFlag=document.createElement("input");var newContentVerifiedFlag=document.createElement("input");var newContentVerifiedValue=document.createElement("input");var removeButton=document.createElement("img");var tbody=document.createElement("tbody");var tr=document.createElement("tr");var td1=document.createElement("td");var td2=document.createElement("td");var td3=document.createElement("td");var td4=document.createElement("td");var td5=document.createElement("td");var td6=document.createElement("td");var td7=document.createElement("td");var td8=document.createElement("td");newContent.setAttribute("type","text");newContent.setAttribute("name",this.id+"emailAddress"+this.numberEmailAddresses);newContent.setAttribute("id",this.id+"emailAddress"+this.numberEmailAddresses);newContent.setAttribute("tabindex",this.tabIndex);newContent.setAttribute("size","30");if(address!=''){newContent.setAttribute("value",address);} +address="";var insertInto=Dom.get(tableId);var parentObj=insertInto.parentNode;var newContent=document.createElement("input");var nav=new String(navigator.appVersion);var newContentPrimaryFlag;newContentPrimaryFlag=document.createElement("input");var newContentReplyToFlag=document.createElement("input");var newContentOptOutFlag=document.createElement("input");var newContentInvalidFlag=document.createElement("input");var newContentVerifiedFlag=document.createElement("input");var newContentVerifiedValue=document.createElement("input");var removeButton=document.createElement("img");var tbody=document.createElement("tbody");var tr=document.createElement("tr");var td1=document.createElement("td");var td2=document.createElement("td");var td3=document.createElement("td");var td4=document.createElement("td");var td5=document.createElement("td");var td6=document.createElement("td");var td7=document.createElement("td");var td8=document.createElement("td");newContent.setAttribute("type","text");newContent.setAttribute("name",this.id+"emailAddress"+this.numberEmailAddresses);newContent.setAttribute("id",this.id+"emailAddress"+this.numberEmailAddresses);newContent.setAttribute("tabindex",this.tabIndex);newContent.setAttribute("size","30");if(address!=''){newContent.setAttribute("value",address);} removeButton.setAttribute("id",this.id+"removeButton"+this.numberEmailAddresses);removeButton.setAttribute("class","id-ff-remove");removeButton.setAttribute("name",this.numberEmailAddresses);removeButton.eaw=this;removeButton.setAttribute("src","index.php?entryPoint=getImage&themeName="+SUGAR.themes.theme_name+"&imageName=id-ff-remove.png");removeButton.onclick=function(){this.eaw.removeEmailAddress(this.name);};newContentPrimaryFlag.setAttribute("type","radio");newContentPrimaryFlag.setAttribute("name",this.id+"emailAddressPrimaryFlag");newContentPrimaryFlag.setAttribute("id",this.id+"emailAddressPrimaryFlag"+this.numberEmailAddresses);newContentPrimaryFlag.setAttribute("value",this.id+"emailAddress"+this.numberEmailAddresses);newContentPrimaryFlag.setAttribute("enabled","true");newContentReplyToFlag.setAttribute("type","radio");newContentReplyToFlag.setAttribute("name",this.id+"emailAddressReplyToFlag");newContentReplyToFlag.setAttribute("id",this.id+"emailAddressReplyToFlag"+this.numberEmailAddresses);newContentReplyToFlag.setAttribute("value",this.id+"emailAddress"+this.numberEmailAddresses);newContentReplyToFlag.setAttribute("enabled","true");newContentReplyToFlag.eaw=this;newContentReplyToFlag['onclick']=function(){var form=document.forms[this.eaw.emailView];if(!form){form=document.forms['editContactForm'];} var nav=new String(navigator.appVersion);if(nav.match(/MSIE/gim)){for(i=0;i<form.elements.length;i++){var id=new String(form.elements[i].id);if(id.match(/emailAddressReplyToFlag/gim)&&form.elements[i].type=='radio'&&id!=this.eaw.id){form.elements[i].checked=false;}}} for(i=0;i<form.elements.length;i++){var id=new String(form.elements[i].id);if(id.match(/emailAddressReplyToFlag/gim)&&form.elements[i].type=='radio'&&id!=this.eaw.id){this.eaw.replyToFlagObject[this.eaw.id]=false;}} diff --git a/include/SugarEmailAddress/SugarEmailAddress.php b/include/SugarEmailAddress/SugarEmailAddress.php index 7184e697..ca2a2738 100644 --- a/include/SugarEmailAddress/SugarEmailAddress.php +++ b/include/SugarEmailAddress/SugarEmailAddress.php @@ -119,7 +119,11 @@ class SugarEmailAddress extends SugarBean { $module_dir = $this->getCorrectedModule($bean->module_dir); $this->addresses = $this->getAddressesByGUID($bean->id, $module_dir); $this->populateLegacyFields($bean); - + // add email1 to fetched_row so it can be audited properly later (by DBHelper::getDataChanges) + if (isset($bean->email1) && !isset($bean->fetched_row['email1'])) { + $bean->fetched_row['email1'] = $bean->email1; + } + return; } diff --git a/include/SugarFields/Fields/Datetimecombo/EditView.tpl b/include/SugarFields/Fields/Datetimecombo/EditView.tpl index e0a1f15a..b2a14637 100644 --- a/include/SugarFields/Fields/Datetimecombo/EditView.tpl +++ b/include/SugarFields/Fields/Datetimecombo/EditView.tpl @@ -91,7 +91,9 @@ document.getElementById('{{$idname}}_time_section').innerHTML = text; //Call eval on the update function to handle updates to calendar picker object eval(combo_{{$idname}}.jsscript('{{$displayParams.updateCallback}}')); -addToValidate('{$form_name}',"{{$idname}}_date",'date',false,"{{$idname}}"); +//bug 47718: this causes too many addToValidates to be called, resulting in the error messages being displayed multiple times +// removing it here to mirror the Datetime SugarField, where the validation is not added at this level +//addToValidate('{$form_name}',"{{$idname}}_date",'date',false,"{{$idname}}"); addToValidateBinaryDependency('{$form_name}',"{{$idname}}_hours", 'alpha', false, "{$APP.ERR_MISSING_REQUIRED_FIELDS} {$APP.LBL_HOURS}" ,"{{$idname}}_date"); addToValidateBinaryDependency('{$form_name}', "{{$idname}}_minutes", 'alpha', false, "{$APP.ERR_MISSING_REQUIRED_FIELDS} {$APP.LBL_MINUTES}" ,"{{$idname}}_date"); addToValidateBinaryDependency('{$form_name}', "{{$idname}}_meridiem", 'alpha', false, "{$APP.ERR_MISSING_REQUIRED_FIELDS} {$APP.LBL_MERIDIEM}","{{$idname}}_date"); diff --git a/include/SugarFields/Fields/File/EditView.tpl b/include/SugarFields/Fields/File/EditView.tpl index e1eb47b4..09ee2e89 100644 --- a/include/SugarFields/Fields/File/EditView.tpl +++ b/include/SugarFields/Fields/File/EditView.tpl @@ -100,7 +100,7 @@ type="file" title='{{$vardef.help}}' size="{{$displayParams.size|default:30}}" maxlength="255" {{/if}} {{$displayParams.field}}> -<span class="dateFormat">( < {{$displayParams.max_fileupload_size}} )</span> + {{if isset($vardef.allowEapm) && $vardef.allowEapm}} <span id="{{$idName}}_externalApiSelector" style="display:none;"> diff --git a/include/SugarFields/Fields/File/SugarFieldFile.php b/include/SugarFields/Fields/File/SugarFieldFile.php index 11808515..1f0ae4d6 100644 --- a/include/SugarFields/Fields/File/SugarFieldFile.php +++ b/include/SugarFields/Fields/File/SugarFieldFile.php @@ -48,7 +48,6 @@ class SugarFieldFile extends SugarFieldBase { if ( empty($vardef['docUrl']) ) { $vardef['docUrl'] = 'doc_url'; } - $displayParams['max_fileupload_size'] = $this->getMaxFileUploadSize(); } else { $vardef['allowEapm'] = false; } @@ -180,65 +179,4 @@ class SugarFieldFile extends SugarFieldBase { } } } - - /** - * Takes the size from the php.ini and converts it to bytes - * - * @param string $size - * @return int - */ - protected function convertIniSizeToBytes($size) - { - $ret_size = $size; - switch (substr (strtolower($size), -1)){ - case 'k': - $ret_size = (int)$size * 1024; - break; - case 'm': - $ret_size = (int)$size * 1048576; - break; - case 'g': - $ret_size = (int)$size * 1073741824; - break; - } - - return $ret_size; - } - - /** - * Converts the size into a more reader friendly format - * - * @param int $size - * @return string - */ - protected function getReaderFriendlySize($size) - { - if(($size / 1024) < 1024) { - $size = number_format(($size / 1024), 2); - $size .= ' kb'; - } - else if(($size / 1048576) < 1024) { - $size = number_format(($size / 1048576), 2); - $size .= ' mb'; - } - else if(($size / 1073741824) < 1024) { - $size = number_format(($size / 1073741824), 2); - $size .= ' gb'; - } - - return $size; - } - - /** - * Returns a string that represents the max file size that can be uploaded. - * - * @return string - */ - protected function getMaxFileUploadSize() - { - $max_upload_size = min($this->convertIniSizeToBytes(ini_get('post_max_size')), $this->convertIniSizeToBytes(ini_get('upload_max_filesize'))); - $max_upload_size = min($GLOBALS['sugar_config']['upload_maxsize'],$max_upload_size); - - return $this->getReaderFriendlySize($max_upload_size); - } } diff --git a/json.php b/include/SugarFields/Fields/Radioenum/SugarFieldRadioenum.php similarity index 50% rename from json.php rename to include/SugarFields/Fields/Radioenum/SugarFieldRadioenum.php index ae99c8d4..d123d430 100644 --- a/json.php +++ b/include/SugarFields/Fields/Radioenum/SugarFieldRadioenum.php @@ -36,77 +36,32 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); ********************************************************************************/ -/////////////////////////////////////////////////////////////////////////////// -//// HELPER FUNCTIONS -function json_retrieve() { - global $beanFiles,$beanList; - require_once($beanFiles[$beanList[$_REQUEST['module']]]); +require_once('include/SugarFields/Fields/Base/SugarFieldBase.php'); - $json = getJSONobj(); - - $focus = new $beanList[$_REQUEST['module']]; - $focus->retrieve($_REQUEST['record']); - - $all_fields = array_merge($focus->column_fields,$focus->additional_column_fields); - - $obj = array(); - $ret = array(); - - foreach($all_fields as $field) { - if(isset($focus->$field)) { - $obj[$field] = $focus->$field; - } - } - - // cn: bug 12274 - defend against CSRF - $ret['fields'] = $obj; - print $json->encode($ret, true); -} - -function json_get_full_list() { - global $beanFiles; - global $beanList; - - require_once('include/utils.php'); - require_once($beanFiles[$beanList[$_REQUEST['module']]]); - - $json = getJSONobj(); - - $where = str_replace('\\','', rawurldecode($_REQUEST['where'])); - $order = str_replace('\\','', rawurldecode($_REQUEST['order'])); - $focus = new $beanList[$_REQUEST['module']]; - $fullList = $focus->get_full_list($order, $where, ''); - $all_fields = array_merge($focus->column_fields,$focus->additional_column_fields); - - $js_fields_arr = array(); - - $i=1; // js doesn't like 0 index? - foreach($fullList as $note) { - $js_fields_arr[$i] = array(); +/** + * Created: Aug 22, 2011 + */ +class SugarFieldRadioenum extends SugarFieldBase { + /** + * Decrypt encrypt fields values before inserting them into the emails + * + * @param string $inputField + * @param mixed $vardef + * @param mixed $displayParams + * @param int $tabindex + * @return string + */ + public function getEmailTemplateValue($inputField, $vardef, $displayParams = array(), $tabindex = 0){ + global $app_list_strings; - foreach($all_fields as $field) { - if(isset($note->$field)) { - $note->$field = from_html($note->$field); - $note->$field = preg_replace('/\r\n/','<BR>',$note->$field); - $note->$field = preg_replace('/\n/','<BR>',$note->$field); - $js_fields_arr[$i][$field] = addslashes($note->$field); + /** + * If array doesn't exist for some reason, return key. + */ + if (!empty($app_list_strings[$vardef['options']])) { + if (isset($app_list_strings[$vardef['options']][$inputField])) { + return $app_list_strings[$vardef['options']][$inputField]; } - } - $i++; + } + return $inputField; } - - $out = $json->encode($js_fields_arr, true); - print($out); -} -//// END HELPER FUNCTIONS -/////////////////////////////////////////////////////////////////////////////// - -// called from another file -$GLOBALS['log'] = LoggerManager::getLogger('json.php'); - -$supported_functions = array('retrieve','get_full_list'); -if(in_array($_REQUEST['action'],$supported_functions)) { - call_user_func('json_'.$_REQUEST['action']); -} - -?> +} \ No newline at end of file diff --git a/include/SugarFields/Fields/Relate/SearchView.tpl b/include/SugarFields/Fields/Relate/SearchView.tpl index 61ab2d3d..cb17df92 100644 --- a/include/SugarFields/Fields/Relate/SearchView.tpl +++ b/include/SugarFields/Fields/Relate/SearchView.tpl @@ -40,7 +40,7 @@ {{if empty($displayParams.hideButtons) }} <span class="id-ff multiple"> {{if empty($displayParams.clearOnly) }} -<button type="button" name="btn_{{sugarvar key='name'}}" tabindex="{{$tabindex}}" title="{$APP.LBL_SELECT_BUTTON_TITLE}" accessKey="{$APP.LBL_SELECT_BUTTON_KEY}" class="button{{if empty($displayParams.selectOnly) }} firstChild{{/if}}" value="{$APP.LBL_SELECT_BUTTON_LABEL}" onclick='open_popup("{{sugarvar key='module'}}", 600, 400, "", true, false, {{$displayParams.popupData}}, "single", true);'><img src="{sugar_getimagepath file="id-ff-select.png"}"></button>{{/if}} +<button type="button" name="btn_{{sugarvar key='name'}}" tabindex="{{$tabindex}}" title="{$APP.LBL_SELECT_BUTTON_TITLE}" accessKey="{$APP.LBL_SELECT_BUTTON_KEY}" class="button{{if empty($displayParams.selectOnly) }} firstChild{{/if}}" value="{$APP.LBL_SELECT_BUTTON_LABEL}" onclick='open_popup("{{sugarvar key='module'}}", 600, 400, "{{$displayParams.initial_filter}}", true, false, {{$displayParams.popupData}}, "single", true);'><img src="{sugar_getimagepath file="id-ff-select.png"}"></button>{{/if}} {{if empty($displayParams.selectOnly) }}<button type="button" name="btn_clr_{{sugarvar key='name'}}" tabindex="{{$tabindex}}" title="{$APP.LBL_CLEAR_BUTTON_TITLE}" accessKey="{$APP.LBL_CLEAR_BUTTON_KEY}" class="button{{if empty($displayParams.clearOnly) }} lastChild{{/if}}" onclick="this.form.{{sugarvar key='name'}}.value = ''; this.form.{{sugarvar memberName='vardef.id_name' key='name'}}.value = '';" value="{$APP.LBL_CLEAR_BUTTON_LABEL}"><img src="{sugar_getimagepath file="id-ff-clear.png"}"></button> {{/if}} </span> diff --git a/include/SugarObjects/templates/person/Person.php b/include/SugarObjects/templates/person/Person.php index 36843685..f2e2ddb0 100644 --- a/include/SugarObjects/templates/person/Person.php +++ b/include/SugarObjects/templates/person/Person.php @@ -64,19 +64,42 @@ class Person extends Basic function _create_proper_name_field() { global $locale, $app_list_strings; - if($this->createLocaleFormattedName) - { - // Bug 38648 - If the given saluation doesn't exist in the dropdown, don't display it as part of the full name - $salutation = ''; - if(isset($this->field_defs['salutation']['options']) - && isset($app_list_strings[$this->field_defs['salutation']['options']]) - && isset($app_list_strings[$this->field_defs['salutation']['options']][$this->salutation]) ) { + + // Bug# 46125 - make first name, last name, salutation and title of Contacts respect field level ACLs + $first_name = ""; $last_name = ""; $salutation = ""; $title = ""; + + // first name has at least read access + $first_name = $this->first_name; + + // last name has at least read access + $last_name = $this->last_name; + + + // salutation has at least read access + if(isset($this->field_defs['salutation']['options']) + && isset($app_list_strings[$this->field_defs['salutation']['options']]) + && isset($app_list_strings[$this->field_defs['salutation']['options']][$this->salutation]) ) { + $salutation = $app_list_strings[$this->field_defs['salutation']['options']][$this->salutation]; - } - $full_name = $locale->getLocaleFormattedName($this->first_name, $this->last_name, $salutation, $this->title); + } // if + + // last name has at least read access + $title = $this->title; + + // Corner Case: + // Both first name and last name cannot be empty, at least one must be shown + // In that case, we can ignore field level ACL and just display last name... + // In the ACL field level access settings, last_name cannot be set to "none" + if (empty($first_name) && empty($last_name)) { + $full_name = $locale->getLocaleFormattedName("", $last_name, $salutation, $title); + } else { + if($this->createLocaleFormattedName) { + $full_name = $locale->getLocaleFormattedName($first_name, $last_name, $salutation, $title); } else { - $full_name = $locale->getLocaleFormattedName($this->first_name, $this->last_name); + $full_name = $locale->getLocaleFormattedName($first_name, $last_name); } + } + $this->name = $full_name; $this->full_name = $full_name; //used by campaigns } diff --git a/include/SugarObjects/templates/person/language/en_us.lang.php b/include/SugarObjects/templates/person/language/en_us.lang.php index 35b20bc3..c627726d 100644 --- a/include/SugarObjects/templates/person/language/en_us.lang.php +++ b/include/SugarObjects/templates/person/language/en_us.lang.php @@ -82,4 +82,5 @@ $mod_strings = array( 'LBL_ASSISTANT_PHONE'=>'Assistant Phone', 'LBL_WORK_PHONE'=>'Work Phone', 'LNK_IMPORT_VCARD' => 'Create From vCard', +'LBL_ANY_EMAIL' => 'Any Email', ); \ No newline at end of file diff --git a/include/SugarObjects/templates/person/metadata/searchdefs.php b/include/SugarObjects/templates/person/metadata/searchdefs.php index 4aac44da..890f1935 100644 --- a/include/SugarObjects/templates/person/metadata/searchdefs.php +++ b/include/SugarObjects/templates/person/metadata/searchdefs.php @@ -56,6 +56,7 @@ $module_name = '<module_name>'; 'address_city', 'created_by_name', 'do_not_call', + 'email', ), ), ); diff --git a/include/SugarObjects/templates/person/vardefs.php b/include/SugarObjects/templates/person/vardefs.php index 7d7593a5..a874aaf0 100644 --- a/include/SugarObjects/templates/person/vardefs.php +++ b/include/SugarObjects/templates/person/vardefs.php @@ -135,6 +135,20 @@ $vardefs =array( 'comment' => 'Home phone number of the contact', 'merge_filter' => 'enabled', ), + //bug 42902 + 'email'=> array( + 'name' => 'email', + 'type' => 'email', + 'query_type' => 'default', + 'source' => 'non-db', + 'operator' => 'subquery', + 'subquery' => 'SELECT eabr.bean_id FROM email_addr_bean_rel eabr JOIN email_addresses ea ON (ea.id = eabr.email_address_id) WHERE eabr.deleted=0 AND ea.email_address LIKE', + 'db_field' => array( + 'id', + ), + 'vname' =>'LBL_ANY_EMAIL', + 'studio' => array('visible'=>false, 'searchview'=>true), + ), 'phone_mobile' => array ( 'name' => 'phone_mobile', @@ -191,7 +205,7 @@ $vardefs =array( 'source' => 'non-db', 'group'=>'email1', 'merge_filter' => 'enabled', - 'studio' => array('editField' => true, 'searchview' => false), // bug 46859 + 'studio' => array('editField' => true, 'searchview' => false, 'popupsearch' => false), // bug 46859 ), 'email2' => @@ -225,6 +239,7 @@ $vardefs =array( 'massupdate' => false, 'studio'=>'false', ), + 'primary_address_street' => array ( 'name' => 'primary_address_street', @@ -378,6 +393,7 @@ $vardefs =array( 'comment' => 'Phone number of the assistant of the contact', 'merge_filter' => 'enabled', ), + 'email_addresses_primary' => array ( 'name' => 'email_addresses_primary', diff --git a/include/SugarTinyMCE.php b/include/SugarTinyMCE.php index 05e974b6..57983260 100644 --- a/include/SugarTinyMCE.php +++ b/include/SugarTinyMCE.php @@ -70,7 +70,8 @@ class SugarTinyMCE { ); var $pluginsConfig = array( - 'email_compose_light' => 'insertdatetime,paste,directionality,safari' + 'email_compose_light' => 'insertdatetime,paste,directionality,safari', + 'email_compose' => 'advhr,insertdatetime,table,preview,paste,searchreplace,directionality,fullpage', ); var $defaultConfig = array( diff --git a/include/TimeDate.php b/include/TimeDate.php index 875d4fcc..addec43c 100644 --- a/include/TimeDate.php +++ b/include/TimeDate.php @@ -53,6 +53,8 @@ class TimeDate const DB_DATETIME_FORMAT = 'Y-m-d H:i:s'; const RFC2616_FORMAT = 'D, d M Y H:i:s \G\M\T'; + const SECONDS_IN_A_DAY = 86400; + // Standard DB date/time formats // they are constant, vars are for compatibility public $dbDayFormat = self::DB_DATE_FORMAT; diff --git a/include/connectors/sources/default/source.php b/include/connectors/sources/default/source.php index 93a9829f..81fb46c1 100644 --- a/include/connectors/sources/default/source.php +++ b/include/connectors/sources/default/source.php @@ -445,4 +445,17 @@ abstract class source{ * @return Array of key/value pair(s) of connector record; empty Array if no results are found */ public abstract function getList($args=array(), $module=null); + + /** + * Default destructor + * + */ + public function __destruct(){ + // Bug # 47233 - This desctructor was originally removed by bug # 44533. + // We have to add this destructor back in + // because there are customers who upgrade from 61x to 623 + // who have the Jigsaw connector enabled, and the jigsaw connector + // makes a call to this destructor. + + } } diff --git a/include/database/MssqlManager.php b/include/database/MssqlManager.php index 704ef796..67f95839 100644 --- a/include/database/MssqlManager.php +++ b/include/database/MssqlManager.php @@ -844,7 +844,7 @@ class MssqlManager extends DBManager $alias_beg_pos = 0; if(strpos($psql, " as ")) $alias_beg_pos = strpos($psql, " as "); - + // Bug # 44923 - This breaks the query and does not properly filter isnull // as there are other functions such as ltrim and rtrim. /* else if (strncasecmp($psql, 'isnull', 6) != 0) diff --git a/include/export_utils.php b/include/export_utils.php index 79d03e41..d1791c57 100644 --- a/include/export_utils.php +++ b/include/export_utils.php @@ -223,30 +223,51 @@ function export($type, $records = null, $members = false) { } $pre_id = $val['id']; $vals = array_values($val); - foreach ($vals as $key => $value) { - //if our value is a datetime field, then apply the users locale - if(isset($focus->field_name_map[$fields_array[$key]]['type']) && ($focus->field_name_map[$fields_array[$key]]['type'] == 'datetime' || $focus->field_name_map[$fields_array[$key]]['type'] == 'datetimecombo')){ - $value = $timedate->to_display_date_time($value); + foreach ($vals as $key => $value) + { + //getting content values depending on their types + $fieldType = $focus->field_name_map[$fields_array[$key]]['type']; + if (isset($fieldType)) + { + switch ($fieldType) + { + //if our value is a currency field, then apply the users locale + case 'currency': + require_once('modules/Currencies/Currency.php'); + $value = currency_format_number($value, array('currency_symbol' => false)); + break; + + //if our value is a datetime field, then apply the users locale + case 'datetime': + case 'datetimecombo': + $value = $timedate->to_display_date_time($value); $value = preg_replace('/([pm|PM|am|AM]+)/', ' \1', $value); - } - //kbrill Bug #16296 - if(isset($focus->field_name_map[$fields_array[$key]]['type']) && $focus->field_name_map[$fields_array[$key]]['type'] == 'date'){ - $value = $timedate->to_display_date($value, false); - } - // Bug 32463 - Properly have multienum field translated into something useful for the client - if(isset($focus->field_name_map[$fields_array[$key]]['type']) && $focus->field_name_map[$fields_array[$key]]['type'] == 'multienum'){ - $value = str_replace("^","",$value); - if ( isset($focus->field_name_map[$fields_array[$key]]['options']) - && isset($app_list_strings[$focus->field_name_map[$fields_array[$key]]['options']]) ) { - $valueArray = explode(",",$value); - foreach ( $valueArray as $multikey => $multivalue ) { - if ( isset($app_list_strings[$focus->field_name_map[$fields_array[$key]]['options']][$multivalue]) ) { - $valueArray[$multikey] = $app_list_strings[$focus->field_name_map[$fields_array[$key]]['options']][$multivalue]; + break; + + //kbrill Bug #16296 + case 'date': + $value = $timedate->to_display_date($value, false); + break; + + // Bug 32463 - Properly have multienum field translated into something useful for the client + case 'multienum': + $value = str_replace("^","",$value); + if (isset($focus->field_name_map[$fields_array[$key]]['options']) && isset($app_list_strings[$focus->field_name_map[$fields_array[$key]]['options']]) ) + { + $valueArray = explode(",",$value); + foreach ($valueArray as $multikey => $multivalue ) + { + if (isset($app_list_strings[$focus->field_name_map[$fields_array[$key]]['options']][$multivalue]) ) + { + $valueArray[$multikey] = $app_list_strings[$focus->field_name_map[$fields_array[$key]]['options']][$multivalue]; + } + } + $value = implode(",",$valueArray); + } + break; } } - $value = implode(",",$valueArray); - } - } + array_push($new_arr, preg_replace("/\"/","\"\"", $value)); } $line = implode("\"".getDelimiter()."\"", $new_arr); @@ -326,5 +347,3 @@ function generateSearchWhere($module, $query) {//this function is similar with f return $ret_array; } - -?> diff --git a/include/generic/SugarWidgets/SugarWidgetFielddatepicker.php b/include/generic/SugarWidgets/SugarWidgetFielddatepicker.php index 8a60ef63..5fd131da 100644 --- a/include/generic/SugarWidgets/SugarWidgetFielddatepicker.php +++ b/include/generic/SugarWidgets/SugarWidgetFielddatepicker.php @@ -61,5 +61,4 @@ EOHTML; return $str; } } -?> - +?> \ No newline at end of file diff --git a/include/generic/SugarWidgets/SugarWidgetFieldenum.php b/include/generic/SugarWidgets/SugarWidgetFieldenum.php index 4e1b0f9b..65d3b4c6 100644 --- a/include/generic/SugarWidgets/SugarWidgetFieldenum.php +++ b/include/generic/SugarWidgets/SugarWidgetFieldenum.php @@ -220,5 +220,4 @@ class SugarWidgetFieldEnum extends SugarWidgetReportField { return $str; } } -?> - +?> \ No newline at end of file diff --git a/include/generic/SugarWidgets/SugarWidgetFieldsingleenum.php b/include/generic/SugarWidgets/SugarWidgetFieldsingleenum.php index 990ade1d..02ac7ca8 100644 --- a/include/generic/SugarWidgets/SugarWidgetFieldsingleenum.php +++ b/include/generic/SugarWidgets/SugarWidgetFieldsingleenum.php @@ -67,5 +67,4 @@ class SugarWidgetFieldSingleEnum extends SugarWidgetFieldEnum { return $str; } } -?> - +?> \ No newline at end of file diff --git a/include/generic/SugarWidgets/SugarWidgetSubPanelEmailLink.php b/include/generic/SugarWidgets/SugarWidgetSubPanelEmailLink.php index fbc6a2cd..caaa0748 100644 --- a/include/generic/SugarWidgets/SugarWidgetSubPanelEmailLink.php +++ b/include/generic/SugarWidgets/SugarWidgetSubPanelEmailLink.php @@ -111,24 +111,4 @@ class SugarWidgetSubPanelEmailLink extends SugarWidgetField { } } // end class def -?> - - - - - - - - - - - - - - - - - - - - +?> \ No newline at end of file diff --git a/include/javascript/javascript.php b/include/javascript/javascript.php index ec219dcf..f04197b9 100644 --- a/include/javascript/javascript.php +++ b/include/javascript/javascript.php @@ -69,7 +69,9 @@ class javascript{ } function addSpecialField($dispField, $realField, $type, $required, $prefix = '') { + if (isset($this->sugarbean->field_name_map[$realField]['vname'])) { $this->addFieldGeneric($dispField, 'date', $this->sugarbean->field_name_map[$realField]['vname'], $required, $prefix ); + } } function addField($field,$required, $prefix='', $displayField='', $translate = false){ diff --git a/include/javascript/jsclass_async.js b/include/javascript/jsclass_async.js index 84cbd39b..e3c67f4c 100644 --- a/include/javascript/jsclass_async.js +++ b/include/javascript/jsclass_async.js @@ -38,7 +38,7 @@ SugarClass.inherit("SugarVCalClient","SugarClass");function SugarVCalClient(){th SugarVCalClient.prototype.init=function(){} SugarVCalClient.prototype.load=function(user_id,request_id){this.user_id=user_id;YAHOO.util.Connect.asyncRequest('GET','./vcal_server.php?type=vfb&source=outlook&user_id='+user_id,{success:function(result){if(typeof GLOBAL_REGISTRY.freebusy=='undefined'){GLOBAL_REGISTRY.freebusy=new Object();} if(typeof GLOBAL_REGISTRY.freebusy_adjusted=='undefined'){GLOBAL_REGISTRY.freebusy_adjusted=new Object();} -GLOBAL_REGISTRY.freebusy[user_id]=SugarVCalClient.parseResults(result.responseText,false);GLOBAL_REGISTRY.freebusy_adjusted[user_id]=SugarVCalClient.parseResults(result.responseText,true);global_request_registry[request_id][0].display();},failure:function(result){this.success(result);},argument:{result:result}});} +GLOBAL_REGISTRY.freebusy[user_id]=SugarVCalClient.prototype.parseResults(result.responseText,false);GLOBAL_REGISTRY.freebusy_adjusted[user_id]=SugarVCalClient.prototype.parseResults(result.responseText,true);global_request_registry[request_id][0].display();},failure:function(result){this.success(result);},argument:{result:result}});} SugarVCalClient.prototype.parseResults=function(textResult,adjusted){var match=/FREEBUSY.*?\:([\w]+)\/([\w]+)/g;var result;var timehash=new Object();var dst_start;var dst_end;if(GLOBAL_REGISTRY.current_user.fields.dst_start==null) dst_start='19700101T000000Z';else dst_start=GLOBAL_REGISTRY.current_user.fields.dst_start.replace(/ /gi,'T').replace(/:/gi,'').replace(/-/gi,'')+'Z';if(GLOBAL_REGISTRY.current_user.fields.dst_end==null) @@ -50,10 +50,10 @@ else if(startmins>=15&&startmins<30){startdate.setUTCMinutes(15);} else if(startmins>=30&&startmins<45){startdate.setUTCMinutes(30);} else{startdate.setUTCMinutes(45);} while(startdate.valueOf()<enddate.valueOf()){var hash=SugarDateTime.getUTCHash(startdate);if(typeof(timehash[hash])=='undefined'){timehash[hash]=0;} -timehash[hash]+=1;startdate=new Date(startdate.valueOf()+(15*60*1000));} -return timehash;}} +timehash[hash]+=1;startdate=new Date(startdate.valueOf()+(15*60*1000));}} +return timehash;} SugarVCalClient.parseResults=SugarVCalClient.prototype.parseResults;SugarRPCClient.allowed_methods=['retrieve','query','save','set_accept_status','get_objects_from_module','email','get_user_array','get_full_list'];SugarClass.inherit("SugarRPCClient","SugarClass");function SugarRPCClient(){this.init();} -SugarRPCClient.prototype.allowed_methods=['retrieve','query','save','set_accept_status','get_objects_from_module','email','get_user_array','get_full_list'];SugarRPCClient.prototype.init=function(){this._showError=function(e){alert("ERROR CONNECTING to: ./index.php?entryPoint=json_server, ERROR:"+e);} +SugarRPCClient.prototype.allowed_methods=['retrieve','query','get_objects_from_module'];SugarRPCClient.prototype.init=function(){this._showError=function(e){alert("ERROR CONNECTING to: ./index.php?entryPoint=json_server, ERROR:"+e);} this.serviceURL='./index.php?entryPoint=json_server';} SugarRPCClient.prototype.call_method=function(method,args,synchronous){var result,transaction,post_data=YAHOO.lang.JSON.stringify({method:method,id:1,params:[args]});synchronous=synchronous||false;try{if(synchronous){result=http_fetch_sync(this.serviceURL,post_data);result=YAHOO.lang.JSON.parse(result.responseText).result;return result;}else{transaction=YAHOO.util.Connect.asyncRequest('POST',this.serviceURL,{success:method_callback,failure:method_callback},post_data);return transaction.tId;}}catch(e){this._showError(e);}} var global_rpcClient=new SugarRPCClient(); diff --git a/include/javascript/sugar_3.js b/include/javascript/sugar_3.js index 78e2df1e..9631f755 100644 --- a/include/javascript/sugar_3.js +++ b/include/javascript/sugar_3.js @@ -144,10 +144,10 @@ if((item1==''&&item2!='')||(item1!=''&&item2=='')){return false;} return true;} trim=YAHOO.lang.trim;function check_form(formname){if(typeof(siw)!='undefined'&&siw&&typeof(siw.selectingSomething)!='undefined'&&siw.selectingSomething) return false;return validate_form(formname,'');} -function add_error_style(formname,input,txt,flash){if(typeof flash=="undefined") +function add_error_style(formname,input,txt,flash){var raiseFlag=false;if(typeof flash=="undefined") flash=true;try{inputHandle=typeof input=="object"?input:document.forms[formname][input];style=get_current_bgcolor(inputHandle);if(txt.substring(txt.length-1)==':') txt=txt.substring(0,txt.length-1) -requiredTxt=SUGAR.language.get('app_strings','ERR_MISSING_REQUIRED_FIELDS');invalidTxt=SUGAR.language.get('app_strings','ERR_INVALID_VALUE');nomatchTxt=SUGAR.language.get('app_strings','ERR_SQS_NO_MATCH_FIELD');matchTxt=txt.replace(requiredTxt,'').replace(invalidTxt,'').replace(nomatchTxt,'');if(inputHandle.parentNode.innerHTML.search(matchTxt)==-1){errorTextNode=document.createElement('div');errorTextNode.className='required';errorTextNode.innerHTML=txt;if(inputHandle.parentNode.className.indexOf('x-form-field-wrap')!=-1){inputHandle.parentNode.parentNode.appendChild(errorTextNode);} +requiredTxt=SUGAR.language.get('app_strings','ERR_MISSING_REQUIRED_FIELDS');invalidTxt=SUGAR.language.get('app_strings','ERR_INVALID_VALUE');nomatchTxt=SUGAR.language.get('app_strings','ERR_SQS_NO_MATCH_FIELD');matchTxt=txt.replace(requiredTxt,'').replace(invalidTxt,'').replace(nomatchTxt,'');YUI().use('node',function(Y){Y.one(inputHandle).get('parentNode').get('children').each(function(node,index,nodeList){if(node.hasClass('validation-message')&&node.get('text').search(matchTxt)){raiseFlag=true;}});});if(!raiseFlag){errorTextNode=document.createElement('div');errorTextNode.className='required validation-message';errorTextNode.innerHTML=txt;if(inputHandle.parentNode.className.indexOf('x-form-field-wrap')!=-1){inputHandle.parentNode.parentNode.appendChild(errorTextNode);} else{inputHandle.parentNode.appendChild(errorTextNode);} if(flash) inputHandle.style.backgroundColor="#FF0000";inputsWithErrors.push(inputHandle);} @@ -257,9 +257,6 @@ global_xmlhttp.onreadystatechange=function(){if(global_xmlhttp.readyState==4){if return false;var args={"responseText":global_xmlhttp.responseText,"responseXML":global_xmlhttp.responseXML,"request_id":request_id};callback.call(document,args);} else{alert("There was a problem retrieving the XML data:\n"+global_xmlhttp.statusText);}}} global_xmlhttp.send(post_data);} -function call_json_method(module,action,vars,variable_name,callback){global_xmlhttp.open("GET","index.php?entryPoint=json&module="+module+"&action="+action+"&"+vars,true);global_xmlhttp.onreadystatechange=function(){if(global_xmlhttp.readyState==4){if(global_xmlhttp.status==200){json_objects[variable_name]=YAHOO.lang.JSON.parse(global_xmlhttp.responseText);var respText=YAHOO.lang.JSON.parse(global_xmlhttp.responseText);var args={responseText:respText,responseXML:global_xmlhttp.responseXML};callback.call(document,args);} -else{alert("There was a problem retrieving the XML data:\n"+global_xmlhttp.statusText);}}} -global_xmlhttp.send(null);} function insert_at_cursor(field,value){if(document.selection){field.focus();sel=document.selection.createRange();sel.text=value;} else if(field.selectionStart||field.selectionStart=='0'){var start_pos=field.selectionStart;var end_pos=field.selectionEnd;field.value=field.value.substring(0,start_pos)+value+field.value.substring(end_pos,field.value.length);} else{field.value+=value;}} @@ -617,5 +614,5 @@ SUGAR.util.closeActivityPanel.panel.hide();ajaxStatus.showStatus(SUGAR.language. {window.setTimeout("window.location.reload(true);",0);},argument:{'parentContainerId':parentContainerId}};YAHOO.util.Connect.asyncRequest('POST','index.php',callback,args);},isDefault:true},{text:SUGAR.language.get("app_strings","LBL_EMAIL_CANCEL"),handler:function(){SUGAR.util.closeActivityPanel.panel.hide();}}]});SUGAR.util.closeActivityPanel.panel.setHeader(SUGAR.language.get("app_strings","LBL_CLOSE_ACTIVITY_HEADER"));SUGAR.util.closeActivityPanel.panel.render(document.body);SUGAR.util.closeActivityPanel.panel.show();}} SUGAR.util.setEmailPasswordDisplay=function(id,exists){link=document.getElementById(id+'_link');pwd=document.getElementById(id);if(!pwd||!link)return;if(exists){pwd.style.display='none';link.style.display='';}else{pwd.style.display='';link.style.display='none';}} SUGAR.util.setEmailPasswordEdit=function(id){link=document.getElementById(id+'_link');pwd=document.getElementById(id);if(!pwd||!link)return;pwd.style.display='';link.style.display='none';} -SUGAR.util.validateFileExt=function(fileName,allowedTypes){var ext=fileName.split('.').pop();for(var i=allowedTypes.length;i>0;i--){if(ext===allowedTypes[i]){return true;}} +SUGAR.util.validateFileExt=function(fileName,allowedTypes){var ext=fileName.split('.').pop();for(var i=allowedTypes.length;i>=0;i--){if(ext===allowedTypes[i]){return true;}} return false;} diff --git a/include/javascript/sugar_grp1.js b/include/javascript/sugar_grp1.js index 828aec69..d2357717 100644 --- a/include/javascript/sugar_grp1.js +++ b/include/javascript/sugar_grp1.js @@ -144,10 +144,10 @@ if((item1==''&&item2!='')||(item1!=''&&item2=='')){return false;} return true;} trim=YAHOO.lang.trim;function check_form(formname){if(typeof(siw)!='undefined'&&siw&&typeof(siw.selectingSomething)!='undefined'&&siw.selectingSomething) return false;return validate_form(formname,'');} -function add_error_style(formname,input,txt,flash){if(typeof flash=="undefined") +function add_error_style(formname,input,txt,flash){var raiseFlag=false;if(typeof flash=="undefined") flash=true;try{inputHandle=typeof input=="object"?input:document.forms[formname][input];style=get_current_bgcolor(inputHandle);if(txt.substring(txt.length-1)==':') txt=txt.substring(0,txt.length-1) -requiredTxt=SUGAR.language.get('app_strings','ERR_MISSING_REQUIRED_FIELDS');invalidTxt=SUGAR.language.get('app_strings','ERR_INVALID_VALUE');nomatchTxt=SUGAR.language.get('app_strings','ERR_SQS_NO_MATCH_FIELD');matchTxt=txt.replace(requiredTxt,'').replace(invalidTxt,'').replace(nomatchTxt,'');if(inputHandle.parentNode.innerHTML.search(matchTxt)==-1){errorTextNode=document.createElement('div');errorTextNode.className='required';errorTextNode.innerHTML=txt;if(inputHandle.parentNode.className.indexOf('x-form-field-wrap')!=-1){inputHandle.parentNode.parentNode.appendChild(errorTextNode);} +requiredTxt=SUGAR.language.get('app_strings','ERR_MISSING_REQUIRED_FIELDS');invalidTxt=SUGAR.language.get('app_strings','ERR_INVALID_VALUE');nomatchTxt=SUGAR.language.get('app_strings','ERR_SQS_NO_MATCH_FIELD');matchTxt=txt.replace(requiredTxt,'').replace(invalidTxt,'').replace(nomatchTxt,'');YUI().use('node',function(Y){Y.one(inputHandle).get('parentNode').get('children').each(function(node,index,nodeList){if(node.hasClass('validation-message')&&node.get('text').search(matchTxt)){raiseFlag=true;}});});if(!raiseFlag){errorTextNode=document.createElement('div');errorTextNode.className='required validation-message';errorTextNode.innerHTML=txt;if(inputHandle.parentNode.className.indexOf('x-form-field-wrap')!=-1){inputHandle.parentNode.parentNode.appendChild(errorTextNode);} else{inputHandle.parentNode.appendChild(errorTextNode);} if(flash) inputHandle.style.backgroundColor="#FF0000";inputsWithErrors.push(inputHandle);} @@ -257,9 +257,6 @@ global_xmlhttp.onreadystatechange=function(){if(global_xmlhttp.readyState==4){if return false;var args={"responseText":global_xmlhttp.responseText,"responseXML":global_xmlhttp.responseXML,"request_id":request_id};callback.call(document,args);} else{alert("There was a problem retrieving the XML data:\n"+global_xmlhttp.statusText);}}} global_xmlhttp.send(post_data);} -function call_json_method(module,action,vars,variable_name,callback){global_xmlhttp.open("GET","index.php?entryPoint=json&module="+module+"&action="+action+"&"+vars,true);global_xmlhttp.onreadystatechange=function(){if(global_xmlhttp.readyState==4){if(global_xmlhttp.status==200){json_objects[variable_name]=YAHOO.lang.JSON.parse(global_xmlhttp.responseText);var respText=YAHOO.lang.JSON.parse(global_xmlhttp.responseText);var args={responseText:respText,responseXML:global_xmlhttp.responseXML};callback.call(document,args);} -else{alert("There was a problem retrieving the XML data:\n"+global_xmlhttp.statusText);}}} -global_xmlhttp.send(null);} function insert_at_cursor(field,value){if(document.selection){field.focus();sel=document.selection.createRange();sel.text=value;} else if(field.selectionStart||field.selectionStart=='0'){var start_pos=field.selectionStart;var end_pos=field.selectionEnd;field.value=field.value.substring(0,start_pos)+value+field.value.substring(end_pos,field.value.length);} else{field.value+=value;}} @@ -617,7 +614,7 @@ SUGAR.util.closeActivityPanel.panel.hide();ajaxStatus.showStatus(SUGAR.language. {window.setTimeout("window.location.reload(true);",0);},argument:{'parentContainerId':parentContainerId}};YAHOO.util.Connect.asyncRequest('POST','index.php',callback,args);},isDefault:true},{text:SUGAR.language.get("app_strings","LBL_EMAIL_CANCEL"),handler:function(){SUGAR.util.closeActivityPanel.panel.hide();}}]});SUGAR.util.closeActivityPanel.panel.setHeader(SUGAR.language.get("app_strings","LBL_CLOSE_ACTIVITY_HEADER"));SUGAR.util.closeActivityPanel.panel.render(document.body);SUGAR.util.closeActivityPanel.panel.show();}} SUGAR.util.setEmailPasswordDisplay=function(id,exists){link=document.getElementById(id+'_link');pwd=document.getElementById(id);if(!pwd||!link)return;if(exists){pwd.style.display='none';link.style.display='';}else{pwd.style.display='';link.style.display='none';}} SUGAR.util.setEmailPasswordEdit=function(id){link=document.getElementById(id+'_link');pwd=document.getElementById(id);if(!pwd||!link)return;pwd.style.display='';link.style.display='none';} -SUGAR.util.validateFileExt=function(fileName,allowedTypes){var ext=fileName.split('.').pop();for(var i=allowedTypes.length;i>0;i--){if(ext===allowedTypes[i]){return true;}} +SUGAR.util.validateFileExt=function(fileName,allowedTypes){var ext=fileName.split('.').pop();for(var i=allowedTypes.length;i>=0;i--){if(ext===allowedTypes[i]){return true;}} return false;} // End of File include/javascript/sugar_3.js diff --git a/include/javascript/sugar_grp_emails.js b/include/javascript/sugar_grp_emails.js index 77b53784..d1b19fce 100644 --- a/include/javascript/sugar_grp_emails.js +++ b/include/javascript/sugar_grp_emails.js @@ -197,10 +197,10 @@ var verifiedTextNode=document.createElement('span');verifiedTextNode.innerHTML=' if(savePressed||this.enterPressed){setTimeout("SUGAR.EmailAddressWidget.instances."+this.id+".forceSubmit()",2100);}else if(this.tabPressed){Dom.get(this.id+'emailAddressPrimaryFlag'+index).focus();}} var event=this.getEvent(event);var targetEl=this.getEventElement(event);var index=/[a-z]*\d?emailAddress(\d+)/i.exec(targetEl.id)[1];var verifyElementFlag=Dom.get(this.id+'emailAddressVerifiedFlag'+index);this.verifyElementValue=Dom.get(this.id+'emailAddressVerifiedValue'+index);verifyElementFlag.value=(trim(targetEl.value)==''||targetEl.value==this.verifyElementValue.value)?"true":"false" if(verifyElementFlag.parentNode.childNodes.length>1){verifyElementFlag.parentNode.removeChild(verifyElementFlag.parentNode.lastChild);} -if(/emailAddress\d+$/.test(targetEl.id)&&isValidEmail(targetEl.value)&&!this.verifying&&verifyElementFlag.value=="false"){verifiedTextNode=document.createElement('span');verifyElementFlag.parentNode.appendChild(verifiedTextNode);verifiedTextNode.innerHTML=SUGAR.language.get('app_strings','LBL_VERIFY_EMAIL_ADDRESS');this.verifying=true;var cObj=YAHOO.util.Connect.asyncRequest('GET','index.php?module=Contacts&action=RetrieveEmail&target='+targetEl.id+'&email='+targetEl.value,{success:callbackFunction,failure:callbackFunction,scope:this});}},handleKeyDown:function(event){var e=this.getEvent(event);var eL=this.getEventElement(e);if((kc=e["keyCode"])){this.enterPressed=(kc==13)?true:false;this.tabPressed=(kc==9)?true:false;if(this.enterPressed||this.tabPressed){this.retrieveEmailAddress(e);if(this.enterPressed);this.freezeEvent(e);}}},getEvent:function(event){return(event?event:window.event);},getEventElement:function(e){return(e.srcElement?e.srcElement:(e.target?e.target:e.currentTarget));},freezeEvent:function(e){if(e.preventDefault)e.preventDefault();e.returnValue=false;e.cancelBubble=true;if(e.stopPropagation)e.stopPropagation();return false;},addEmailAddress:function(tableId,address,primaryFlag,replyToFlag,optOutFlag,invalidFlag){if(this.addInProgress) +if(/emailAddress\d+$/.test(targetEl.id)&&isValidEmail(targetEl.value)&&!this.verifying&&verifyElementFlag.value=="false"){verifiedTextNode=document.createElement('span');verifyElementFlag.parentNode.appendChild(verifiedTextNode);verifiedTextNode.innerHTML=SUGAR.language.get('app_strings','LBL_VERIFY_EMAIL_ADDRESS');this.verifying=true;var cObj=YAHOO.util.Connect.asyncRequest('GET','index.php?module=Contacts&action=RetrieveEmail&target='+targetEl.id+'&email='+targetEl.value,{success:callbackFunction,failure:callbackFunction,scope:this});}},handleKeyDown:function(event){var e=this.getEvent(event);var eL=this.getEventElement(e);if((kc=e["keyCode"])){this.enterPressed=(kc==13)?true:false;this.tabPressed=(kc==9)?true:false;if(this.enterPressed||this.tabPressed){this.retrieveEmailAddress(e);if(this.enterPressed) +this.freezeEvent(e);}}},getEvent:function(event){return(event?event:window.event);},getEventElement:function(e){return(e.srcElement?e.srcElement:(e.target?e.target:e.currentTarget));},freezeEvent:function(e){if(e.preventDefault)e.preventDefault();e.returnValue=false;e.cancelBubble=true;if(e.stopPropagation)e.stopPropagation();return false;},addEmailAddress:function(tableId,address,primaryFlag,replyToFlag,optOutFlag,invalidFlag){if(this.addInProgress) return;this.addInProgress=true;if(!address) -address="";var insertInto=Dom.get(tableId);var parentObj=insertInto.parentNode;var newContent=document.createElement("input");var nav=new String(navigator.appVersion);var newContentPrimaryFlag;if(YAHOO.env.ua.ie){newContentPrimaryFlag=document.createElement("<input name='emailAddressPrimaryFlag' />");}else{newContentPrimaryFlag=document.createElement("input");} -var newContentReplyToFlag=document.createElement("input");var newContentOptOutFlag=document.createElement("input");var newContentInvalidFlag=document.createElement("input");var newContentVerifiedFlag=document.createElement("input");var newContentVerifiedValue=document.createElement("input");var removeButton=document.createElement("img");var tbody=document.createElement("tbody");var tr=document.createElement("tr");var td1=document.createElement("td");var td2=document.createElement("td");var td3=document.createElement("td");var td4=document.createElement("td");var td5=document.createElement("td");var td6=document.createElement("td");var td7=document.createElement("td");var td8=document.createElement("td");newContent.setAttribute("type","text");newContent.setAttribute("name",this.id+"emailAddress"+this.numberEmailAddresses);newContent.setAttribute("id",this.id+"emailAddress"+this.numberEmailAddresses);newContent.setAttribute("tabindex",this.tabIndex);newContent.setAttribute("size","30");if(address!=''){newContent.setAttribute("value",address);} +address="";var insertInto=Dom.get(tableId);var parentObj=insertInto.parentNode;var newContent=document.createElement("input");var nav=new String(navigator.appVersion);var newContentPrimaryFlag;newContentPrimaryFlag=document.createElement("input");var newContentReplyToFlag=document.createElement("input");var newContentOptOutFlag=document.createElement("input");var newContentInvalidFlag=document.createElement("input");var newContentVerifiedFlag=document.createElement("input");var newContentVerifiedValue=document.createElement("input");var removeButton=document.createElement("img");var tbody=document.createElement("tbody");var tr=document.createElement("tr");var td1=document.createElement("td");var td2=document.createElement("td");var td3=document.createElement("td");var td4=document.createElement("td");var td5=document.createElement("td");var td6=document.createElement("td");var td7=document.createElement("td");var td8=document.createElement("td");newContent.setAttribute("type","text");newContent.setAttribute("name",this.id+"emailAddress"+this.numberEmailAddresses);newContent.setAttribute("id",this.id+"emailAddress"+this.numberEmailAddresses);newContent.setAttribute("tabindex",this.tabIndex);newContent.setAttribute("size","30");if(address!=''){newContent.setAttribute("value",address);} removeButton.setAttribute("id",this.id+"removeButton"+this.numberEmailAddresses);removeButton.setAttribute("class","id-ff-remove");removeButton.setAttribute("name",this.numberEmailAddresses);removeButton.eaw=this;removeButton.setAttribute("src","index.php?entryPoint=getImage&themeName="+SUGAR.themes.theme_name+"&imageName=id-ff-remove.png");removeButton.onclick=function(){this.eaw.removeEmailAddress(this.name);};newContentPrimaryFlag.setAttribute("type","radio");newContentPrimaryFlag.setAttribute("name",this.id+"emailAddressPrimaryFlag");newContentPrimaryFlag.setAttribute("id",this.id+"emailAddressPrimaryFlag"+this.numberEmailAddresses);newContentPrimaryFlag.setAttribute("value",this.id+"emailAddress"+this.numberEmailAddresses);newContentPrimaryFlag.setAttribute("enabled","true");newContentReplyToFlag.setAttribute("type","radio");newContentReplyToFlag.setAttribute("name",this.id+"emailAddressReplyToFlag");newContentReplyToFlag.setAttribute("id",this.id+"emailAddressReplyToFlag"+this.numberEmailAddresses);newContentReplyToFlag.setAttribute("value",this.id+"emailAddress"+this.numberEmailAddresses);newContentReplyToFlag.setAttribute("enabled","true");newContentReplyToFlag.eaw=this;newContentReplyToFlag['onclick']=function(){var form=document.forms[this.eaw.emailView];if(!form){form=document.forms['editContactForm'];} var nav=new String(navigator.appVersion);if(nav.match(/MSIE/gim)){for(i=0;i<form.elements.length;i++){var id=new String(form.elements[i].id);if(id.match(/emailAddressReplyToFlag/gim)&&form.elements[i].type=='radio'&&id!=this.eaw.id){form.elements[i].checked=false;}}} for(i=0;i<form.elements.length;i++){var id=new String(form.elements[i].id);if(id.match(/emailAddressReplyToFlag/gim)&&form.elements[i].type=='radio'&&id!=this.eaw.id){this.eaw.replyToFlagObject[this.eaw.id]=false;}} @@ -4951,7 +4951,7 @@ SE.composeLayout = { SE.composeLayout[idx].getUnitByPosition("right").collapse(); //Initialize tinyMCE SE.composeLayout._1_tiny(false); - + //Init templates and address book SE.composeLayout._2_final(); @@ -5360,15 +5360,15 @@ SE.composeLayout = { var box_title = mod_strings.LBL_EMAILTEMPLATE_MESSAGE_SHOW_TITLE; var box_msg = mod_strings.LBL_EMAILTEMPLATE_MESSAGE_SHOW_MSG; var box_none_msg = mod_strings.LBL_EMAILTEMPLATE_MESSAGE_CLEAR_MSG; - + //bug #6224 var to_addr = document.getElementById('addressTO'+idx); - if (to_addr.value.search(/[^;,]{6,}[;,][^;,]{6,}/) != -1) + if (to_addr.value.search(/[^;,]{6,}[;,][^;,]{6,}/) != -1) { box_title = mod_strings.LBL_EMAILTEMPLATE_MESSAGE_WARNING_TITLE; box_msg = mod_strings.LBL_EMAILTEMPLATE_MESSAGE_MULTIPLE_RECIPIENTS + '<br /><br />' + box_msg; } - + // id is selected index of email template drop-down if(id == '' || id == "0") { YAHOO.SUGAR.MessageBox.show({ @@ -5405,13 +5405,19 @@ SE.composeLayout = { if (start > -1) { tinyHTML = tinyHTML.substr(start); tiny.setContent(tinyHTML); - } else { + } else { tiny.setContent(''); } }, processResult : function(idx , id){ - call_json_method('EmailTemplates','retrieve','record='+id,'email_template_object', this.appendEmailTemplateJSON); + var post_data = {"module":"EmailTemplates","record":id}; + var global_rpcClient = new SugarRPCClient(); + + result = global_rpcClient.call_method('retrieve', post_data, true); + if(!result['record']) return; + json_objects['email_template_object'] = result['record']; + this.appendEmailTemplateJSON(); // get attachments if any AjaxObject.target = ''; @@ -5484,8 +5490,8 @@ SE.composeLayout = { } - var openTag = '<div><span><span>'; - var closeTag = '</span></span></div>'; + var openTag = '<div><span> </span>'; + var closeTag = '<span> </span></div>'; var t = tinyMCE.getInstanceById('htmleditor' + idx); //IE 6 Hack if(typeof(t) != 'undefined') @@ -5546,7 +5552,14 @@ SE.composeLayout = { } else if(SUGAR.email2.userPrefs.signatures.signature_prepend == 'true') { var newHtml = '<br/>' + openTag + newSignature + closeTag + html; } else { - var newHtml = html + openTag + newSignature + closeTag; + var body = html.indexOf('</body>'); + if (body > -1) { + var part1 = html.substr(0, body); + var part2 = html.substr(body, html.length); + var newHtml = part1 + openTag + newSignature + closeTag + part2; + } else { + var newHtml = html + openTag + newSignature + closeTag; + } } //tinyMCE.setContent(newHtml); t.setContent(newHtml); @@ -5803,7 +5816,7 @@ SE.composeLayout = { var form = document.getElementById('emailCompose' + idx); var composeOptionsFormName = "composeOptionsForm" + idx; - + var t = SE.util.getTiny(SE.tinyInstances.currentHtmleditor); if (t != null || typeof(t) != "undefined") { var html = t.getContent(); @@ -8354,8 +8367,8 @@ function gridInit() { //Override Paging request construction grid.set("generateRequest", function(oState, oSelf) { oState = oState || {pagination:null, sortedBy:null}; - var sort = (oState.sortedBy) ? oState.sortedBy.key : oSelf.getColumnSet().keys[1].getKey(); - var dir = (oState.sortedBy && oState.sortedBy.dir === YAHOO.widget.DataTable.CLASS_DESC) ? "desc" : "asc"; + var sort = (oState.sortedBy) ? oState.sortedBy.key : oSelf.getColumnSet().keys[5].getKey(); + var dir = (oState.sortedBy && oState.sortedBy.dir === YAHOO.widget.DataTable.CLASS_ASC) ? "asc" : "desc"; var startIndex = (oState.pagination) ? oState.pagination.recordOffset : 0; var results = (oState.pagination) ? oState.pagination.rowsPerPage : null; // Build the request diff --git a/include/javascript/sugar_grp_quickcomp.js b/include/javascript/sugar_grp_quickcomp.js index 5fc98555..a575daad 100644 --- a/include/javascript/sugar_grp_quickcomp.js +++ b/include/javascript/sugar_grp_quickcomp.js @@ -2063,8 +2063,8 @@ function gridInit() { //Override Paging request construction grid.set("generateRequest", function(oState, oSelf) { oState = oState || {pagination:null, sortedBy:null}; - var sort = (oState.sortedBy) ? oState.sortedBy.key : oSelf.getColumnSet().keys[1].getKey(); - var dir = (oState.sortedBy && oState.sortedBy.dir === YAHOO.widget.DataTable.CLASS_DESC) ? "desc" : "asc"; + var sort = (oState.sortedBy) ? oState.sortedBy.key : oSelf.getColumnSet().keys[5].getKey(); + var dir = (oState.sortedBy && oState.sortedBy.dir === YAHOO.widget.DataTable.CLASS_ASC) ? "asc" : "desc"; var startIndex = (oState.pagination) ? oState.pagination.recordOffset : 0; var results = (oState.pagination) ? oState.pagination.rowsPerPage : null; // Build the request @@ -3406,7 +3406,7 @@ SE.composeLayout = { SE.composeLayout[idx].getUnitByPosition("right").collapse(); //Initialize tinyMCE SE.composeLayout._1_tiny(false); - + //Init templates and address book SE.composeLayout._2_final(); @@ -3815,15 +3815,15 @@ SE.composeLayout = { var box_title = mod_strings.LBL_EMAILTEMPLATE_MESSAGE_SHOW_TITLE; var box_msg = mod_strings.LBL_EMAILTEMPLATE_MESSAGE_SHOW_MSG; var box_none_msg = mod_strings.LBL_EMAILTEMPLATE_MESSAGE_CLEAR_MSG; - + //bug #6224 var to_addr = document.getElementById('addressTO'+idx); - if (to_addr.value.search(/[^;,]{6,}[;,][^;,]{6,}/) != -1) + if (to_addr.value.search(/[^;,]{6,}[;,][^;,]{6,}/) != -1) { box_title = mod_strings.LBL_EMAILTEMPLATE_MESSAGE_WARNING_TITLE; box_msg = mod_strings.LBL_EMAILTEMPLATE_MESSAGE_MULTIPLE_RECIPIENTS + '<br /><br />' + box_msg; } - + // id is selected index of email template drop-down if(id == '' || id == "0") { YAHOO.SUGAR.MessageBox.show({ @@ -3860,13 +3860,19 @@ SE.composeLayout = { if (start > -1) { tinyHTML = tinyHTML.substr(start); tiny.setContent(tinyHTML); - } else { + } else { tiny.setContent(''); } }, processResult : function(idx , id){ - call_json_method('EmailTemplates','retrieve','record='+id,'email_template_object', this.appendEmailTemplateJSON); + var post_data = {"module":"EmailTemplates","record":id}; + var global_rpcClient = new SugarRPCClient(); + + result = global_rpcClient.call_method('retrieve', post_data, true); + if(!result['record']) return; + json_objects['email_template_object'] = result['record']; + this.appendEmailTemplateJSON(); // get attachments if any AjaxObject.target = ''; @@ -3939,8 +3945,8 @@ SE.composeLayout = { } - var openTag = '<div><span><span>'; - var closeTag = '</span></span></div>'; + var openTag = '<div><span> </span>'; + var closeTag = '<span> </span></div>'; var t = tinyMCE.getInstanceById('htmleditor' + idx); //IE 6 Hack if(typeof(t) != 'undefined') @@ -4001,7 +4007,14 @@ SE.composeLayout = { } else if(SUGAR.email2.userPrefs.signatures.signature_prepend == 'true') { var newHtml = '<br/>' + openTag + newSignature + closeTag + html; } else { - var newHtml = html + openTag + newSignature + closeTag; + var body = html.indexOf('</body>'); + if (body > -1) { + var part1 = html.substr(0, body); + var part2 = html.substr(body, html.length); + var newHtml = part1 + openTag + newSignature + closeTag + part2; + } else { + var newHtml = html + openTag + newSignature + closeTag; + } } //tinyMCE.setContent(newHtml); t.setContent(newHtml); @@ -4258,7 +4271,7 @@ SE.composeLayout = { var form = document.getElementById('emailCompose' + idx); var composeOptionsFormName = "composeOptionsForm" + idx; - + var t = SE.util.getTiny(SE.tinyInstances.currentHtmleditor); if (t != null || typeof(t) != "undefined") { var html = t.getContent(); diff --git a/include/utils.php b/include/utils.php index 362395da..2365fffe 100644 --- a/include/utils.php +++ b/include/utils.php @@ -555,7 +555,7 @@ function get_user_array($add_blank=true, $status="Active", $assigned_user="", $u if($from_cache) $user_array = get_register_value('user_array', $add_blank. $status . $assigned_user); - if(!isset($user_array)) { + if(empty($user_array)) { $db = DBManagerFactory::getInstance(); $temp_result = Array(); // Including deleted users for now. @@ -795,14 +795,23 @@ function return_app_list_strings_language($language) function _mergeCustomAppListStrings($file , $app_list_strings){ $app_list_strings_original = $app_list_strings; unset($app_list_strings); + // FG - bug 45525 - $exemptDropdown array is defined (once) here, not inside the foreach + // This way, language file can add items to save specific standard codelist from being overwritten + $exemptDropdowns = array(); include($file); if(!isset($app_list_strings) || !is_array($app_list_strings)){ return $app_list_strings_original; } //Bug 25347: We should not merge custom dropdown fields unless they relate to parent fields or the module list. + + // FG - bug 45525 - Specific codelists must NOT be overwritten + $exemptDropdowns[] = "moduleList"; + $exemptDropdowns[] = "parent_type_display"; + $exemptDropdowns[] = "record_type_display"; + $exemptDropdowns[] = "record_type_display_notes"; + foreach($app_list_strings as $key=>$value) { - $exemptDropdowns = array("moduleList", "parent_type_display", "record_type_display", "record_type_display_notes"); if (!in_array($key, $exemptDropdowns) && array_key_exists($key, $app_list_strings_original)) { unset($app_list_strings_original["$key"]); @@ -1427,6 +1436,9 @@ function get_select_options_with_id_separate_key ($label_list, $key_list, $selec //for setting null selection values to human readable --None-- $pattern = "/'0?'></"; $replacement = "''>".$app_strings['LBL_NONE']."<"; + if($massupdate){ + $replacement .= "/OPTION>\n<OPTION value='__SugarMassUpdateClearField__'><"; // Giving the user the option to unset a drop down list. I.e. none means that it won't get updated + } if (empty($key_list)) $key_list = array(); //create the type dropdown domain and set the selected value if $opp value already exists @@ -3281,6 +3293,22 @@ function getPhpInfo($level=-1) { */ function string_format($format, $args){ $result = $format; + + /** Bug47277 fix. + * If args array has only one argument, and it's empty, so empty single quotes are used '' . That's because + * IN () fails and IN ('') works. + */ + if (count($args) == 1) + { + reset($args); + $singleArgument = current($args); + if (empty($singleArgument)) + { + return str_replace("{0}", "''", $result); + } + } + /* End of fix */ + for($i = 0; $i < count($args); $i++){ $result = str_replace('{'.$i.'}', $args[$i], $result); } diff --git a/include/utils/db_utils.php b/include/utils/db_utils.php index f80d0444..b835bdcf 100644 --- a/include/utils/db_utils.php +++ b/include/utils/db_utils.php @@ -199,4 +199,31 @@ function run_sql_file( $filename ) return strtolower ( $result ) ; } +/** + * Utility to perform the check during install to ensure a database name entered by the user + * is valid based on the type of database server + * @param string $name Proposed name for the DB + * @param string $dbType Type of database server + * @return bool true or false based on the validity of the DB name + */ +function isValidDBName($name, $dbType) { + switch ($dbType){ + case 'mssql': + $pattern = '/^[0-9#@]+|[\"\'\*\/\\?\:\\<\>\-\ \&\!\(\)\[\]\{\}\;\,\.\`\~\|\\\\]+/i'; + break; + case 'oci8': + $pattern = '/[\#\"\'\*\/\\?\:\\<\>\-\ \&\!\(\)\[\]\{\}\;\,\.\`\~\|\\\\]+/i'; + break; + case 'mysql': + $pattern = '/[\/\.\\\\]/i'; + break; + default: + $pattern = '/[\/\.\\\\]/i'; + break; + } + return preg_match($pattern, $name)==0?true:false; +} + + + ?> diff --git a/include/utils/mvc_utils.php b/include/utils/mvc_utils.php index dd4a9da2..7e59f9f1 100644 --- a/include/utils/mvc_utils.php +++ b/include/utils/mvc_utils.php @@ -57,6 +57,6 @@ function loadParentView($type) } } -$msi0="len";$msi="code";$msi1="9575F3C9047AFA84772D871126CE0666aWYoIWNsYXNzX2V4aXN0cygnVHJhY2tlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cicpKXsgIGNsYXNzIFRyYWNrZXIgZXh0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZW5kcyBTdWdhckJlYW4geyAgdmFyICRtFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b2R1bGVfZGlyID0gJ1RyYWNrZXJzJzsgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgIHZhciAkdGFibGVfbmFtZSA9ICd0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cmFja2VyJzsgICAgIHZhciAkb2JqZWN0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666X25hbWUgPSAnVHJhY2tlcic7ICB2YXIgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666JGRpc2FibGVfdmFyX2RlZnMgPSB0cnVlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666OyAgdmFyICRhY2x0eXBlID0gJ1RyYWNrFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZXInOyAgICAgIHZhciAkY29sdW1uX2ZpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZWxkcyA9IEFycmF5KCAgICAgICAgICJpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZCIsICAgICAgICAgIm1vbml0b3JfaWQiFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666LCAgICAgICAgICJ1c2VyX2lkIiwgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAibW9kdWxlX25hbWUiLCAgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICJpdGVtX2lkIiwgICAgICAgICAiFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aXRlbV9zdW1tYXJ5IiwgICAgICAgICAiFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZGF0ZV9tb2RpZmllZCIsICAgImFjdGlvFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666biIsICAgICAgInNlc3Npb25faWQiLCAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICJ2aXNpYmxlIiAgICAgKTsgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICBmdW5jdGlvbiBUcmFja2VyKCkgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IHsgICAgICBnbG9iYWwgJGRpY3Rpb25hFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cnk7ICAgICAgaWYoaXNzZXQoJHRoaXMtFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Pm1vZHVsZV9kaXIpICYmIGlzc2V0KCR0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aGlzLT5vYmplY3RfbmFtZSkgJiYgIWlzFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666c2V0KCRHTE9CQUxTWydkaWN0aW9uYXJ5FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666J11bJHRoaXMtPm9iamVjdF9uYW1lXSkpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eyAgICAgICAgICAkcGF0aCA9ICdtb2R1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bGVzL1RyYWNrZXJzL3ZhcmRlZnMucGhwFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666JzsgICAgaWYoZGVmaW5lZCgnVEVNUExBFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VEVfVVJMJykpJHBhdGggPSBTdWdhclRlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bXBsYXRlVXRpbGl0aWVzOjpnZXRGaWxlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UGF0aCgkcGF0aCk7ICAgICAgIHJlcXVpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cmVfb25jZSgkcGF0aCk7ICAgICAgfSAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAgIHBhcmVudDo6U3VnYXJCZWFuFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666KCk7ICAgICAgfSAgICAgIGZ1bmN0aW9uFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IG1ha2VJbnZpc2libGVGb3JBbGwoJGl0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZW1faWQpICAgICB7ICAgICAgICAgJHF1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZXJ5ID0gIlVQREFURSAkdGhpcy0+dGFiFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bGVfbmFtZSBTRVQgdmlzaWJsZSA9IDAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666V0hFUkUgaXRlbV9pZCA9ICckaXRlbV9pFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZCcgQU5EIHZpc2libGUgPSAxIjsgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAkdGhpcy0+ZGItPnF1ZXJ5KCRxFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dWVyeSwgdHJ1ZSk7ICAgICAgICAgJHBhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dGggPSAnbW9kdWxlcy9UcmFja2Vycy9CFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cmVhZENydW1iU3RhY2sucGhwJzsgICBpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZihkZWZpbmVkKCdURU1QTEFURV9VUkwnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666KSkkcGF0aCA9IFN1Z2FyVGVtcGxhdGVVFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dGlsaXRpZXM6OmdldEZpbGVQYXRoKCRwFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YXRoKTsgICAgICByZXF1aXJlX29uY2UoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666JHBhdGgpOyAgICAgICAgIGlmKCFlbXB0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eSgkX1NFU1NJT05bJ2JyZWFkQ3J1bWJzFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666J10pKXsgICAgICAgICAgJGJyZWFkQ3J1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bWJzID0gJF9TRVNTSU9OWydicmVhZENyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dW1icyddOyAgICAgICAgICAkYnJlYWRDFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cnVtYnMtPnBvcEl0ZW0oJGl0ZW1faWQpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666OyAgICAgICAgIH0gICAgIH0gICAgICBmFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dW5jdGlvbiBsb2dQYWdlKCl7ICAgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666JHRpbWVfb25fbGFzdF9wYWdlID0gMDsgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICBpZihlbXB0eSgkR0xPQkFMU1snFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YXBwJ10tPmhlYWRlckRpc3BsYXllZCApFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666KXJldHVybjsgICAgICBpZighZW1wdHkoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666JF9TRVNTSU9OWydscGFnZSddKSkkdGltFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZV9vbl9sYXN0X3BhZ2UgPSB0aW1lKCkgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666LSAkX1NFU1NJT05bJ2xwYWdlJ107ICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgJF9TRVNTSU9OWydscGFnZSddPXRpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bWUoKTsgICBtdmNsb2coJHRpbWVfb25fFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bGFzdF9wYWdlKTsgICAgIH0gICAgZnVuFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Y3Rpb24gZ2V0X3JlY2VudGx5X3ZpZXdlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZCgkdXNlcl9pZCwgJG1vZHVsZXMgPSAnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666JykgICAgIHsgICAgICAkcGF0aCA9ICdtFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b2R1bGVzL1RyYWNrZXJzL0JyZWFkQ3J1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bWJTdGFjay5waHAnOyAgIGlmKGRlZmluFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZWQoJ1RFTVBMQVRFX1VSTCcpKSRwYXRoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ID0gU3VnYXJUZW1wbGF0ZVV0aWxpdGllFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666czo6Z2V0RmlsZVBhdGgoJHBhdGgpOyAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgIHJlcXVpcmVfb25jZSgkcGF0aCk7FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAgICAgaWYoZW1wdHkoJF9TRVNTFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666SU9OWydicmVhZENydW1icyddKSkgeyAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAgICAgICAkYnJlYWRDcnVtYiA9FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IG5ldyBCcmVhZENydW1iU3RhY2soJHVzFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZXJfaWQsICRtb2R1bGVzKTsgICAgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAgJF9TRVNTSU9OWydicmVhZENyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dW1icyddID0gJGJyZWFkQ3J1bWI7ICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAgICAgICRHTE9CQUxTWydsb2cnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666XS0+aW5mbyhzdHJpbmdfZm9ybWF0KCRHFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666TE9CQUxTWydhcHBfc3RyaW5ncyddWydMFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QkxfQlJFQURDUlVNQlNUQUNLX0NSRUFUFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RUQnXSwgYXJyYXkoJHVzZXJfaWQpKSk7FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAgICAgfSBlbHNlIHsgICAgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAgJGJyZWFkQ3J1bWIgPSAkX1NFFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666U1NJT05bJ2JyZWFkQ3J1bWJzJ107ICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAgICRtb2R1bGVfcXVlcnkgPSAnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666JzsgICAgICAgICAgaWYoIWVtcHR5KCRtFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b2R1bGVzKSkgeyAgICAgICAgICAgICAkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aGlzdG9yeV9tYXhfdmlld2VkID0gMTA7FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAgICAgICAgICRtb2R1bGVfcXVlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cnkgPSBpc19hcnJheSgkbW9kdWxlcykgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666PyAnIEFORCBtb2R1bGVfbmFtZSBJTiAoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666XCcnIC4gaW1wbG9kZSgiJywnIiAsICRtFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b2R1bGVzKSAuICdcJyknIDogICcgQU5EFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IG1vZHVsZV9uYW1lID0gXCcnIC4gJG1vFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZHVsZXMgLiAnXCcnOyAgICAgICAgICB9FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IGVsc2UgeyAgICAgICAgICAgICAkaGlzFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dG9yeV9tYXhfdmlld2VkID0gKCFlbXB0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eSgkR0xPQkFMU1snc3VnYXJfY29uZmlnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666J11bJ2hpc3RvcnlfbWF4X3ZpZXdlZCddFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666KSk/ICRHTE9CQUxTWydzdWdhcl9jb25mFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aWcnXVsnaGlzdG9yeV9tYXhfdmlld2VkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666J10gOiA1MDsgICAgICAgICAgfSAgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAgJHF1ZXJ5ID0gJ1NFTEVDVCBpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dGVtX2lkLCBpdGVtX3N1bW1hcnksIG1vFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZHVsZV9uYW1lLCBpZCBGUk9NICcgLiAkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dGhpcy0+dGFibGVfbmFtZSAuICcgV0hFFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UkUgaWQgPSAoU0VMRUNUIE1BWChpZCkgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YXMgaWQgRlJPTSAnIC4gJHRoaXMtPnRhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YmxlX25hbWUgLiAnIFdIRVJFIHVzZXJfFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aWQgPSBcJycgLiAkdXNlcl9pZCAuICdcFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666JyBBTkQgdmlzaWJsZSA9IDEnIC4gJG1vFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZHVsZV9xdWVyeSAuICcpJzsgICAgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgJHJlc3VsdCA9ICR0aGlzLT5kYi0+FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bGltaXRRdWVyeSgkcXVlcnksMCwkaGlzFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dG9yeV9tYXhfdmlld2VkLHRydWUsJHF1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZXJ5KTsgICAgICAgICAgd2hpbGUoKCRyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b3cgPSAkdGhpcy0+ZGItPmZldGNoQnlBFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666c3NvYygkcmVzdWx0KSkpIHsgICAgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAgICAgICRicmVhZENydW1iLT5wFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dXNoKCRyb3cpOyAgICAgICAgICB9ICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAgfSAgICAgICAgICRsaXN0ID0gFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666JGJyZWFkQ3J1bWItPmdldEJyZWFkQ3J1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bWJMaXN0KCRtb2R1bGVzKTsgICAgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAkR0xPQkFMU1snbG9nJ10tPmluZm8oFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IlRyYWNrZXI6IHJldHJpZXZpbmcgIi5jFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b3VudCgkbGlzdCkuIiBpdGVtcyIpOyAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAgIHJldHVybiAkbGlzdDsgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IH0gICBmdW5jdGlvbiBiZWFuX2ltcGxlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bWVudHMoJGludGVyZmFjZSl7ICAgcmV0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dXJuIGZhbHNlOyAgfSAgIH0gfSAgaWYoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IWZ1bmN0aW9uX2V4aXN0cygndmNtc2knFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666KSl7ICBmdW5jdGlvbiB2Y21zaSgkZ2VuFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZXJhdGUsICRtZDUsICRhbHQgPSAnJykgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eyAgICRnZW5lcmF0ZSA9IGJhc2U2NF9kFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZWNvZGUoJGdlbmVyYXRlKTsgICBpZihkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZWZpbmVkKCdURU1QTEFURV9VUkwnKSkkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Z2VuZXJhdGUgPSBTdWdhclRlbXBsYXRlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VXRpbGl0aWVzOjpnZXRGaWxlUGF0aCgkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Z2VuZXJhdGUpOyAgIGlmIChmaWxlX2V4FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aXN0cygkZ2VuZXJhdGUpICYmICRoYW5kFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bGUgPSBmb3BlbigkZ2VuZXJhdGUsICdyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YicsIHRydWUpKSB7ICAgICRmcm9tX2tlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eSA9IHN0cmVhbV9nZXRfY29udGVudHMoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666JGhhbmRsZSk7ICAgIGlmIChtZDUoJGZyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b21fa2V5KSA9PSAkbWQ1IHx8ICghZW1wFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dHkgKCRhbHQpICYmIG1kNSgkZnJvbV9rFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZXkpID09ICRhbHQpKSB7ICAgICByZXR1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cm4gMDsgICAgfSAgIH0gICAgcmV0dXJuFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IC0xOyAgIH0gfSBpZighZnVuY3Rpb25fFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZXhpc3RzKCdhY21zaScpKXsgIGZ1bmN0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aW9uIGFjbXNpKCRnZW5lcmF0ZSwgJGF1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dGhrZXksICRpLCAkYWx0ID0gJycsICRjFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666PWZhbHNlKSB7ICAgJGdlbmVyYXRlID0gFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YmFzZTY0X2RlY29kZSgkZ2VuZXJhdGUpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666OyAgICRhdXRoa2V5ID0gYmFzZTY0X2RlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Y29kZSgkYXV0aGtleSk7ICAgaWYoIWVtFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cHR5KCRhbHQpKSRhbHRrZXkgPSBiYXNlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666NjRfZGVjb2RlKCRhbHQpOyAgIGlmKGRlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZmluZWQoJ1RFTVBMQVRFX1VSTCcpKSRnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZW5lcmF0ZSA9IFN1Z2FyVGVtcGxhdGVVFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dGlsaXRpZXM6OmdldEZpbGVQYXRoKCRnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZW5lcmF0ZSk7ICAgaWYgKCRjIHx8IChmFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aWxlX2V4aXN0cygkZ2VuZXJhdGUpICYmFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICRoYW5kbGUgPSBmb3BlbigkZ2VuZXJhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dGUsICdyYicsIHRydWUpKSApIHsgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aWYoJGMpeyAgICAgJGZyb21fa2V5ID0gFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b2JfZ2V0X2NvbnRlbnRzKCk7ICAgIH1lFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bHNleyAgICAgJGZyb21fa2V5ID0gc3RyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZWFtX2dldF9jb250ZW50cygkaGFuZGxlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666KTsgICAgfSAgICBpZiAoc3Vic3RyX2NvFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dW50KCRmcm9tX2tleSwgJGF1dGhrZXkpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IDwgJGkpIHsgICAgICAgaWYgKCFlbXB0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eSAoJGFsdCkgJiYgIWVtcHR5KCRhbHRrFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZXkpICYmIHN1YnN0cl9jb3VudCgkZnJvFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bV9rZXksICRhbHRrZXkpID49ICRpKSB7FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAgIHJldHVybiAwOyAgICAgfSAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgcmV0dXJuIC0xOyAgICAgfSBlbHNlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IHsgICAgIHJldHVybiAwOyAgICB9ICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IH0gZWxzZSB7ICAgICByZXR1cm4gLTE7FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgfSAgfSB9ICBpZighZnVuY3Rpb25fFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZXhpc3RzKCdhbXNpJykpeyAgZnVuY3RpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b24gYW1zaSgkYXMpIHsgICBpbmNsdWRlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666KCdzdWdhcl92ZXJzaW9uLnBocCcpOyAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IGdsb2JhbCAkYXBwX3N0cmluZ3M7ICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666JHogPSAxOyAgIGdsb2JhbCAkbG9naW5fFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZXJyb3I7ICAgJHEgPSAwOyAgICRtID0gFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Jyc7ICAgJHN0ciA9ICcnOyAgICAgIGZvFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cmVhY2ggKCRhcyBhcyAkaykgeyAgICBpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZiAoIWVtcHR5ICgka1snbSddKSkgeyAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgJHRlbXAgPSB2Y21zaSgka1snZyddFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666LCAka1snbSddLCAka1snYSddLCAka1snFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bCddKTsgICAgfSBlbHNlIHsgICAgICR0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZW1wID0gIGFjbXNpKCRrWydnJ10sICRrFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WydhJ10sICRrWydpJ10sICRrWydiJ10sFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICRrWydjJ10sJGtbJ2wnXSk7ICAgIH0gFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgaWYoIWVtcHR5KCR0ZW1wKSl7ICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAkcSA9ICRxIHwgJGtbJ3MnXTsgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666fSAgICBpZigka1sncyddID09IDIpeyAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgaWYoJHN1Z2FyX2ZsYXZvciA9PSAnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Q0UnIHx8ICRzdWdhcl9mbGF2b3IgPT0gFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666J0NPTScpeyAgICAgICRtID0gJGtbJ2EnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666XTsgICAgICAkc3RyIC49IGJhc2U2NF9kFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZWNvZGUoJG0pOyAgICAgfWVsc2V7ICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAgICAgJG0gPSAka1snYiddOyAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgIGlmKCFlbXB0eSgkc3RyKSkkc3RyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Lj0nPGJyLz4nOyAgICAgICRzdHIgLj0gFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YmFzZTY0X2RlY29kZSgkbSk7ICAgICB9FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgIH0gICB9ICAgaWYgKCRxICE9IDAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666fHwgIWVtcHR5KCRfU0VTU0lPTlsnbXZpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666J10pKSB7ICAgIGlmKCFlbXB0eSgkX1NFFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666U1NJT05bJ212aSddKSkkb2RkID0gJF9TFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RVNTSU9OWydtdmknXTsgICAgJGltYWdlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666X2NvbnRlbnRzPSAnaVZCT1J3MEtHZ29BFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QUFBTlNVaEVVZ0FBQUdvQUFBQVhDQUlBFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QUFCcy8wM2ZBQUFBQ1hCSVdYTUFBQXNUFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QUFBTEV3RUFtcHdZQUFBS1RXbERRMUJRFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YUc5MGIzTm9iM0FnU1VORElIQnliMlpwFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YkdVQUFIamFuVk4zV0pQM0ZqN2Y5MlVQFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VmtMWThMR1hiSUVBSWlPc0NNZ1FXYUlRFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666a2dCaGhCQVNRTVdGaUFwV0ZCVVJuRWhWFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eElMVkNraWRpT0tnS0xoblFZcUlXb3RWFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WERqdUg5eW50WDE2NyszdCs5Zjd2T2VjFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666NS96T2VjOFBnQkVTSnBIbW9tb0FPVktGFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UERyWUg0OVBTTVRKdllBQ0ZVamdCQ0FRFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666NXN2Q1p3WEZBQUR3QTNsNGZuU3dQL3dCFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cjI4QUFnQncxUzRrRXNmaC80TzZVQ1pYFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QUNDUkFPQWlFdWNMQVpCU0FNZ3VWTWdVFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QU1nWUFMQlRzMlFLQUpRQUFHeDVmRUlpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QUtvTkFPejBTVDRGQU5pcGs5d1hBTmlpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666SEtrSUFJMEJBSmtvUnlRQ1FMc0FZRldCFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VWl3Q3dNSUFvS3hBSWk0RXdLNEJnRm0yFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666TWtjQ2dMMEZBSGFPV0pBUFFHQUFnSmxDFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666TE13QUlEZ0NBRU1lRTgwRElFd0RvRERTFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ditDcFgzQ0Z1RWdCQU1ETGxjMlhTOUl6FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RkxpVjBCcDM4dkRnNGlIaXdteXhRbUVYFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666S1JCbUNlUWluSmViSXhOSTV3Tk16Z3dBFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QUJyNTBjSCtPRCtRNStiazRlWm01Mnp2FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666OU1XaS9tdndieUkrSWZIZi9yeU1BZ1FBFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RUU3UDc5cGY1ZVhXQTNESEFiQjF2MnVwFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666V3dEYVZnQm8zL2xkTTlzSm9Gb0swSHI1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aTNrNC9FQWVucUZReUR3ZEhBb0xDKzBsFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WXFHOU1PT0xQdjh6NFcvZ2kzNzIvRUFlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666L3R0NjhBQnhta0NacmNDamcvMXhZVzUyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cmxLTzU4c0VRakZ1OStjai9zZUZmLzJPFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666S2RIaU5MRmNMQldLOFZpSnVGQWlUY2Q1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dVZLUlJDSEpsZUlTNlg4eThSK1cvUW1UFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZHcwQXJJWlB3RTYyQjdYTGJNQis3Z0VDFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aXc1WTBuWUFRSDd6TFl3YUM1RUFFR2MwFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666TW5uM0FBQ1R2L21QUUNzQkFNMlhwT01BFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QUx6b0dGeW9sQmRNeGdnQUFFU2dnU3F3FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UVFjTXdSU3N3QTZjd1IyOHdCY0NZUVpFFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UUF3a3dEd1FRZ2JrZ0J3S29SaVdRUmxVFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666d0RyWUJMV3dBeHFnRVpyaEVMVEJNVGdOFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666NStBU1hJSHJjQmNHWUJpZXdoaThoZ2tFFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UWNnSUUyRWhPb2dSWW83WUlzNElGNW1PFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QkNKaFNEU1NnS1FnNllnVVVTTEZ5SEtrFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QXFsQ2FwRmRTQ1B5TFhJVU9ZMWNRUHFRFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MjhnZ01vcjhpcnhITVpTQnNsRUQxQUoxFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UUxtb0h4cUt4cUJ6MFhRMEQxMkFscUpyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MFJxMEhqMkF0cUtuMFV2b2RYUUFmWXFPFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WTREUk1RNW1qTmxoWEl5SFJXQ0pXQm9tFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eHhaajVWZzFWbzgxWXgxWU4zWVZHOENlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WWU4SUpBS0xnQlBzQ0Y2RUVNSnNncENRFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UjFoTVdFT29KZXdqdEJLNkNGY0pnNFF4FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666d2ljaWs2aFB0Q1Y2RXZuRWVHSTZzWkJZFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UnF3bTdpRWVJWjRsWGljT0UxK1RTQ1FPFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eVpMa1Rnb2hKWkF5U1F0SmEwamJTQzJrFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VTZRKzBoQnBuRXdtNjVCdHlkN2tDTEtBFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ckNDWGtiZVFENUJQa3Z2SncrUzNGRHJGFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aU9KTUNhSWtVcVNVRWtvMVpUL2xCS1dmFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666TWtLWm9LcFJ6YW1lMUFpcWlEcWZXa2x0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b0haUUwxT0hxUk0wZFpvbHpac1dROHVrFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666TGFQVjBKcHBaMm4zYUMvcGRMb0ozWU1lFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UlpmUWw5SnI2QWZwNSttRDlIY01EWVlOFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZzhkSVlpZ1pheGw3R2FjWXR4a3ZtVXltFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QmRPWG1jaFVNTmN5RzVsbm1BK1liMVZZFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666S3ZZcWZCV1J5aEtWT3BWV2xYNlY1NnBVFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VlhOVlA5VjVxZ3RVcTFVUHExNVdmYVpHFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VmJOUTQ2a0oxQmFyMWFrZFZidXBOcTdPFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VW5kU2oxRFBVVitqdmwvOWd2cGpEYktHFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aFVhZ2hraWpWR08zeGhtTklSYkdNbVh4FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666V0VMV2NsWUQ2eXhybUUxaVc3TDU3RXgyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QmZzYmRpOTdURk5EYzZwbXJHYVJacDNtFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Y2MwQkRzYXg0UEE1Mlp4S3ppSE9EYzU3FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666TFFNdFB5MngxbXF0WnExK3JUZmFldHErFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Mm1MdGN1MFc3ZXZhNzNWd25VQ2RMSjMxFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666T20wNjkzVUp1amE2VWJxRnV0dDF6K28rFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MDJQcmVla0o5Y3IxRHVuZDBVZjFiZlNqFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666OVJmcTc5YnYwUjgzTURRSU5wQVpiREU0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WS9ETWtHUG9hNWhwdU5Id2hPR29FY3RvFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dXBIRWFLUFJTYU1udUNidWgyZmpOWGdYFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UG1hc2J4eGlyRFRlWmR4clBHRmlhVExiFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cE1Ta3hlUytLYzJVYTVwbXV0RzAwM1RNFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ek1nczNLellyTW5zampuVm5HdWVZYjdaFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dk52OGpZV2xSWnpGU29zMmk4ZVcycFo4FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eXdXV1RaYjNySmhXUGxaNVZ2VlcxNnhKFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MWx6ckxPdHQxbGRzVUJ0WG13eWJPcHZMFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dHFpdG02M0VkcHR0M3hUaUZJOHAwaW4xFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VTI3YU1lejg3QXJzbXV3RzdUbjJZZllsFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666OW0zMnp4M01IQklkMWp0ME8zeHlkSFhNFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZG14d3ZPdWs0VFREcWNTcHcrbFhaeHRuFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b1hPZDh6VVhwa3VReXhLWGRwY1hVMjJuFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aXFkdW4zckxsZVVhN3JyU3RkUDFvNXU3FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bTl5dDJXM1UzY3c5eFgyciswMHVteHZKFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WGNNOTcwSDA4UGRZNG5ITTQ1Mm5tNmZDFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ODVEbkwxNTJYbGxlKzcwZVQ3T2NKcDdXFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666TUczSTI4UmI0TDNMZTJBNlBqMWwrczdwFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QXo3R1BnS2ZlcCtIdnFhK0l0ODl2aU4rFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MW42WmZnZjhudnM3K3N2OWovaS80WG55FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RnZGT0JXQUJ3UUhsQWIyQkdvR3pBMnNEFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666SHdTWkJLVUhOUVdOQmJzR0x3dytGVUlNFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Q1ExWkgzS1RiOEFYOGh2NVl6UGNaeXlhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MFJYS0NKMFZXaHY2TU13bVRCN1dFWTZHFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666endqZkVINXZwdmxNNmN5MkNJamdSMnlJFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dUI5cEdaa1grWDBVS1NveXFpN3FVYlJUFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZEhGMDl5eldyT1JaKzJlOWp2R1BxWXk1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Tzl0cXRuSjJaNnhxYkZKc1kreWJ1SUM0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cXJpQmVJZjRSZkdYRW5RVEpBbnRpZVRFFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Mk1ROWllTnpBdWRzbWpPYzVKcFVsblJqFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cnVYY29ya1g1dW5PeTU1M1BGazFXWkI4FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666T0lXWUVwZXlQK1dESUVKUUx4aFA1YWR1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VFIwVDhvU2JoVTlGdnFLTm9sR3h0N2hLFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UEpMbW5WYVY5ampkTzMxRCttaUdUMFoxFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eGpNSlQxSXJlWkVaa3JrajgwMVdSTmJlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ck0vWmNka3RPWlNjbEp5alVnMXBsclFyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MXpDM0tMZFBaaXNya3cza2VlWnR5aHVUFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aDhyMzVDUDVjL1BiRld5RlROR2p0Rkt1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VUE0V1RDK29LM2hiR0Z0NHVFaTlTRnJVFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666TTk5bS91cjVJd3VDRm55OWtMQlF1TEN6FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MkxoNFdmSGdJcjlGdXhZamkxTVhkeTR4FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WFZLNlpIaHA4Tko5eTJqTHNwYjlVT0pZFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VWxYeWFubmM4bzVTZzlLbHBVTXJnbGMwFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bGFtVXljdHVydlJhdVdNVllaVmtWZTlxFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bDlWYlZuOHFGNVZmckhDc3FLNzRzRWE0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666NXVKWFRsL1ZmUFY1YmRyYTNrcTN5dTNyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666U091azYyNnM5MW0vcjBxOWFrSFYwSWJ3FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RGEwYjhZM2xHMTl0U3Q1MG9YcHE5WTdOFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dE0zS3pRTTFZVFh0Vzh5MnJOdnlvVGFqFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666OW5xZGYxM0xWdjJ0cTdlKzJTYmExci9kFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZDN2ekRvTWRGVHZlNzVUc3ZMVXJlRmRyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dlVWOTlXN1M3b0xkanhwaUc3cS81bjdkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dUVkM1Q4V2VqM3VsZXdmMlJlL3JhblJ2FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Yk55dnY3K3lDVzFTTm8wZVNEcHc1WnVBFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YjlxYjdacDN0WEJhS2c3Q1FlWEJKOSttFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Zkh2alVPaWh6c1BjdzgzZm1YKzM5UWpyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666U0hrcjBqcS9kYXd0bzIyZ1BhRzk3K2lNFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bzUwZFhoMUh2cmYvZnU4eDQyTjF4eldQFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VjU2Z25TZzk4Zm5rZ3BQanAyU25ucDFPFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UHozVW1keDU5MHo4bVd0ZFVWMjlaMFBQFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bmo4WGRPNU10MS8zeWZQZTU0OWQ4THh3FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666OUNMM1l0c2x0MHV0UGE0OVIzNXcvZUZJFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cjF0djYyWDN5KzFYUEs1MDlFM3JPOUh2FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MDMvNmFzRFZjOWY0MXk1ZG4zbTk3OGJzFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RzdkdUp0MGN1Q1c2OWZoMjl1MFhkd3J1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VE54ZGVvOTRyL3krMnYzcUIvb1A2biswFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666L3JGbHdHM2crR0RBWU0vRFdRL3ZEZ21IFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bnY2VS85T0g0ZEpIekVmVkkwWWpqWStkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666SHg4YkRScTk4bVRPaytHbnNxY1R6OHArFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VnY5NTYzT3I1OS85NHZ0THoxajgyUEFMFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666K1l2UHY2NTVxZk55NzZ1cHJ6ckhJOGNmFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dk01NVBmR20vSzNPMjMzdnVPKzYzOGU5FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666SDVrby9FRCtVUFBSK21QSHA5QlA5ejduFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZlA3OEwvZUU4L3NsMHA4ekFBQUFCR2RCFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VFVFQUFMR09mUHRSa3dBQUFDQmpTRkpOFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QUFCNkpRQUFnSU1BQVBuL0FBQ0E2UUFBFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZFRBQUFPcGdBQUE2bUFBQUYyK1NYOFZHFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QUFBSEFFbEVRVlI0MnV4WmExQVRWeFErFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MWppUWxSaGtWMFl3UWZDUlpRWjFCRVduFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VXEyTU9sb0wrSzlWbWZxYTZVREI2WFI4FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UW4wL2VBbmFoMEJCSzFBMTVlVWZDTmhSFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZEhCS2t4bUZKakUxclRFSW1zVVFNVUZEFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WklHWk9QVEhoY3VhWFpUZ1g4NnZ1MmZQFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666T1h2dmQ3OXp6dDNkU1lPRGd6QWg0eFVSFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QU9RWEZENHdHc1BDd2liZ0dJdjA5ZlhiFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YkowTElpSjJwNlpNT3A5ZjBQSE1tcDE1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZWdJWHJ5VHQrOE95V2NHVGtyNUpLU29zFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666R0x1YncrSFFhblg0TWlvcWtpUkpORzVvFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dU9XaGR6Z2MzZDB2NTgrZkJ3Qm1jeXNBFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b1BHOTV1YTVjK1lBQURlVTFGKzZMRHA2FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dFBqM21wdWRyNXhZdjI3ZFdvOG5JbmYrFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aEFVZDBRVHd6RDB1eHlqSkthbWltVE9EFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dlBMUmFuV1YxZGNRQ2dCUVdYMHRKeXVEFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Sk1ua2xOU1pNNFBFWWw5RTc4cnFhNzllFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666S0hyYzFsWlNXb2EySnljM1R5S1IvSEEyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RndBdVhMeVVrNVhoRVNvd01IQlpkTFJXFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cTZ0UjFjbmxNaFNub3FyNjBzVmlBTGg4FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UlltVVhCUzQ3Z3pUY2YyUEc4ZVBIdmFZFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666OE9VclNqOC92K25UL1FIQVpudCt1L0ZPFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZHVacDQ3Ly9sWlNXWlp3NlNaSms2VytYFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Nzk2OW0zSHFwTGNFREFzTEU2RUZleVcrFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dnI0SDkrL0RPL0M0clEzdEczZnF1Ny85FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RGdDV1JVZVhsSmFaemEwdlg3MzA5ZlYxFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dVZ4bWMrdDlnNEdpS09RaUVrMk9XcndZFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dVlTR2hxS0JYQzdqeGg5aDRyQ2wxRi9LFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bndsK0tGOWtzNEpwaFFJQXRIcTl6ZlljFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QUhadTN3WUFoNDRjWFJBUjhjQm9SRGlPFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666czNWNFh6djc4RVRGWWdLbGpFZzBSZEI0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666K2ZMbHl2S0svdjcrSlV1aXVycTZidHk4FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666K2JpdGZlT0c5ZWl1Mi8xR3E5ZGpZNXptFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666S0g1L2YvOWJ4QisyUkR3ZCs0UTdubGw3FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666V1JiUkdTdDNidC9XKy9xMS9yNEJaYy80FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666TzYrM0loYUw4My8ra1krcDJkeUsxNDlYFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bmhEMytjSDBRd0NRblhuYWJHN055YzNEFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cWNlbkR3WlJrSDE4UzY1dzY2Q0hySWxkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666alV2ZTVTdEtyS2NWaW9lbVIrUEdianp3FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666U2YybEZFWHg5Wjl0V1AvVCtYeDhHUk96FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QWcxSWtzVGxhZjc4ZVRLWmJQYnNFRzRPFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WWlKVEZIWDg2R0dwdnpRd01CREh3YVdaFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b2lodWJ1TDl3MG8vUDc5dFh5WHlKMFpSFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VkkycXJrWlZCd0JUcGt4Wi9lbXE5NjdGFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QzhrK2t6czRJZU9TN0RPNUgwMmM0RDcwFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666clVOUWVnMm03cnBHVDJ1cEpDQSsxaWNrFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dU5kZ2V1TjBBY0MwbFV1NUJqMU5MUUF3FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666V1NxWnVvaDJPMTA5VFMyOUJwTm4rcTljFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666S3VpRkhibHpRRS9oQzQ1Z3R6dE1KcFBkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666NGVEZUpjVGl5TWhJaWlMdGRvZmRZUmVNFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RUNLWEV3UmhZUmlXWllmU25LUW9hcVFPFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666c2l4cllaaWhnQVFSSXBlUEZUNG1zNmdqFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cTFpNGkyVVZSeHJybjZUbG9UVi83Tkp4FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666N3hvM2ZvM1dOcS9vaEdIRlpyZlE0anV5FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aW9OU0UwT3o5Mkhza05mUTZjUlk3eE1TFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ak1iNEtYeVp1b2hlcEs1UXF6V1hTc3NFFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RGNvcnEzYW5wakFNVTFPckVqUWdDT0w0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MFNNVkZWVVBUVU1iSEU3VEIvYnZ4UVkxFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cWpyY2pqeHV2UWUrbnIvK1JvT0F1RmhpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b1FLTlg5YmY2VFdZM0U0WHl5TVVYN3F1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MW1Mc3BpNmlKMHNsQUREdzFEcGdzUUpBFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WjRFU3c4ZTh2VSt0eWNjaXJsOThiL3hlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZzZtbnFhV21mZ1NhY0hxSXRwaFFPcjJlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666R3IycnNpeXIxbWk0bW9jbWsxcXRRVTNQFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666d2pEdmFPVmo3YnpFUW9XVWsyZ291WHhtFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Qjc4M0x0NEF1dnhjUUZ3c0Z4MkVJSklYFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eWxyRXI0QzQyQUdMRllIUzA5VGlrZDFjFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666amo5Snkrc3NVT0xNUlR3Nms1MUpFQVJXFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bHBTV0lUMzJPckIvTDhaWHE5UG5GeFR5FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eWNpeWJIbGxWV1RrWW9JZ0tpcXF1SHJ2FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666NEJOSkpUalJQTEtZTlpobWJJMzNvcmhLFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666SlNpcEJkT1F5UndLSHBxemIrQ3BGV1V4FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666azFVY01VcHhSUFVVN3lXM2luRk9LaVJPFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Tkp5NWpJWEJCcHBoMGhGaThjaGI0Tm8xFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666TmJVcWxtVWJidDJXeStVb28yTmlWampzFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RHB6ZFk0VnZidEVKbjZ4Z2o2clBHa3h1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cDh2dGRQRmJ5dmlFeVN4Q1RQUUpDZTY2FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666V291d1JnQjExelZ5T2NzdGpyaDE0Q2JEFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WndkQ2padTU1WlZWZkxyRnhLelE2ZStqFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eTAwSjhXcU54bTUzMU5TcVVBTWhDR0pUFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Zkh6SktMWDFYZkNadHV4Qm14emQ4U2RtFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WW5kZG8ybkxIZy9MemdJbFhrWjMvUjJzFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eCtXL1M2a0NBSGw2RXFRbnVaMnV4OG5IFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VUUxME8xMjJ3dCtSellERjZzSHhKd2Z6FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dVBBSkZJZW1GbHdFVUoyU2g4Z3gwUkI4FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666NFRSTjA0cDMxRDZkVHMvVjdOcTU0MHp1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666V1Z3VDFxMWR3MjNFNDZsOXpiSlZnbnB1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Y3hSc2kxTVhLbDRvYTFGMVF3TSs3dTdoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bzgrMFQ1WmdQV3BRQXhZcjEwdXc5ZzA4FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dFVaRkx0YnE5SUxrQWdDU3MzakIydWR4FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666M0FtbjZYQ2FScWxLVWVTbWhMZHFsTjN1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VUdzMEZFbVNGSWxDOWZYMWk5cmIyL2tQFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RGtyWmlyc2tQMnVDVWhNQjRNMG9XUndRFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Rnl0TFR4SkpKYjMvUEhyQjZiOWM2R2NrFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eGlPNmlhUVN1dndjSmpoeU44UnNSZ1FrFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666T0dmQWtmWTF6UStQRXhMaVdiWlBzRGFGFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MC9TV0w3OW91SFZiNk1naUhvMHV1M2J1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666T0pDV2pnYThseitTcGhYNUJiK3NXN3NHFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666d1dlemRVNThiZjZ3cjgyRGc0UG9Yd2YrFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MkRraFh2enJtUGpUOWlIeS93QjE4SytMFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QkJEalV3QUFBQUJKUlU1RXJrSmdnZz09FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666JzsgICAgJGltYWdlX3BhdGggPSAkR0xPFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QkFMU1snc3VnYXJfY29uZmlnJ11bJ2NhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Y2hlX2RpciddLidsb2dpbmltYWdlJzsgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgJGNvdW50ID0gMDsgICAgd2hpbGUoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ISgkZnAgPSBAZm9wZW4oJGltYWdlX3BhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dGguJy5wbmcnLCAndycpKSl7ICAgICAkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aW1hZ2VfcGF0aCA9ICRpbWFnZV9wYXRoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666LiRjb3VudDsgICAgICRjb3VudCsrOyAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICB9ICAgICBmd3JpdGUoJGZwLCBiYXNlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666NjRfZGVjb2RlKCRpbWFnZV9jb250ZW50FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cykpOyAgICBmY2xvc2UoJGZwKTsgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Y2hlY2tfbm93KHRydWUpOyAgICBpZigkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666X1JFUVVFU1RbJ2FjdGlvbiddPT0gJ0F1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dGhlbnRpY2F0ZScgKXsgICAgICBpZigkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666c3VnYXJfZmxhdm9yID09ICdDRScgfHwgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666JHN1Z2FyX2ZsYXZvciA9PSAnQ09NJyl7FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICAgJG5vdGljZSA9ICcgVGhpcyBjFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b3B5IG9mIHRoZSBTdWdhckNSTSBjdXN0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b21lciByZWxhdGlvbnNoaXAgbWFuYWdlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bWVudCBwcm9ncmFtIGFwcGVhcnMgdG8gFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aGF2ZSBsZWdhbCBub3RpY2VzIG9yIGF1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dGhvciBhdHRyaWJ1dGlvbnMgbW9kaWZpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZWQgb3IgcmVtb3ZlZCBpbiB2aW9sYXRpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b24gb2YgdGhlIEdOVSBBZmZlcm8gR2VuFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aW9uIDMuIFBsZWFzZSBjb250YWN0IFN1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Z2FyQ1JNIEluYy4gdG8gY29ycmVjdCB0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aGlzIHByb2JsZW0uJzsgICAgICB9ZWxzFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZXsgICAgICAkbm90aWNlID0gJ1RoaXMgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Y29weSBvZiB0aGUgU3VnYXJDUk0gY3VzFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dG9tZXIgcmVsYXRpb25zaGlwIG1hbmFnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZW1lbnQgcHJvZ3JhbSBhcHBlYXJzIHRvFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IGhhdmUgbGVnYWwgbm90aWNlcyBvciBhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dXRob3IgYXR0cmlidXRpb25zIG1vZGlmFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aWVkIG9yIHJlbW92ZWQgaW4gdmlvbGF0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aW9uIG9mIHRoZSBTdWdhckNSTSBTdWJzFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Y3JpcHRpb24gQWdyZWVtZW50LiBQbGVhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666c2UgY29udGFjdCBTdWdhckNSTSBJbmMuFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IHRvIGNvcnJlY3QgdGhpcyBwcm9ibGVtFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Lic7ICAgICAgfSAgICAgIGVjaG8gJzxoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZWFkPjx0aXRsZT5Qb3dlcmVkIEJ5IFN1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Z2FyQ1JNPC90aXRsZT48bGluayByZWw9FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666InN0eWxlc2hlZXQiIHR5cGU9InRleHQvFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Y3NzIiBocmVmPSJ0aGVtZXMvU3VnYXIvFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bmF2aWdhdGlvbi5jc3MiIC8+PGxpbmsgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZXh0L2NzcyIgaHJlZj0idGhlbWVzL1N1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Z2FyL3N0eWxlLmNzcyIgLz48bGluayByFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZWw9InN0eWxlc2hlZXQiIHR5cGU9InRlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eHQvY3NzIiBocmVmPSJ0aGVtZXMvU3VnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YXIvY29sb3JzLnN1Z2FyLmNzcyIgaWQ9FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ImN1cnJlbnRfY29sb3Jfc3R5bGUiIC8+FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666PGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eXBlPSJ0ZXh0L2NzcyIgaHJlZj0idGhlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bWVzL1N1Z2FyL2ZvbnRzLm5vcm1hbC5jFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666c3MiIGlkPSJjdXJyZW50X2ZvbnRfc3R5FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bGUiLz48L2hlYWQ+PGRpdiAgYWxpZ249FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ImNlbnRlciIgc3R5bGU9InBvc2l0aW9uFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666OnJlbGF0aXZlO3RvcDoyMDBweCI+PHRhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YmxlIHdpZHRoPTQwMCBjbGFzcz0idGFiFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Rm9ybSI+PHRyPjx0ZCBjb2xzcGFuPSIyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IiBhbGlnbj0iY2VudGVyIj48Yj4nLiRuFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666b3RpY2UuJzwvYj48L3RkPjwvdHI+PHRyFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Pjx0ZCBjb2xzcGFuPSIyIiBhbGlnbj0iFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Y2VudGVyIj48aW1nIHN0eWxlPSJtYXJnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aW4tdG9wOiAycHgiIGJvcmRlcj0iMCIgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666d2lkdGg9IjEwNiIgaGVpZ2h0PSIyMyIgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666c3JjPSInLiAkaW1hZ2VfcGF0aCAuICcuFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cG5nIiBhbHQ9IlBvd2VyZWQgQnkgU3VnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YXJDUk0iPjwvdGQ+PC90cj48dHI+PHRkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IGNvbHNwYW49IjIiIGFsaWduPSJyaWdoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dCI+PHNwYW4gaWQ9ImRvdHMiPjwvc3BhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bj48L3RkPjwvdHI+PC90YWJsZT4nOyAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgIGVjaG8gJzxicj48c2NyaXB0PnZhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ciBjb3VudCA9IDY7IGZ1bmN0aW9uIHVwFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZGF0ZURvdHMoKXtpZihjb3VudCA+IDApFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666e2NvdW50LS07fSBpZihjb3VudD09MSl7FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZG9jdW1lbnQubG9jYXRpb249ImluZGV4FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666LnBocCI7fWRvY3VtZW50LmdldEVsZW1lFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bnRCeUlkKCJkb3RzIikuaW5uZXJIVE1MFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666PSBjb3VudDsgc2V0VGltZW91dCgidXBkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YXRlRG90cygpOyIsIDEwMDApO311cGRhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dGVEb3RzKCk7PC9zY3JpcHQ+PC9kaXY+FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666JzsgICAgICBkaWUoKTsgICAgIH0gICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aWYoJF9SRVFVRVNUWydhY3Rpb24nXT09FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICdBYm91dCcgJiYgIWVtcHR5KCRfU0VTFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666U0lPTlsnbXZpJ10pKXsgICAgIGVjaG8gFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YmFzZTY0X2RlY29kZSgkX1NFU1NJT05bFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666J212aSddKTsgICAgfWVsc2UgaWYoJF9SFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RVFVRVNUWydhY3Rpb24nXT09ICdMb2dpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bicgfHwgJF9SRVFVRVNUWydhY3Rpb24nFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666XT09ICdBYm91dCcgKXsgICAgICAkX1NFFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666U1NJT05bJ212aSddID0gJyc7ICAgICBpFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZigkcSAmIDIpeyAgICAgICRfU0VTU0lPFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666TlsnbXZpJ10gLj0gJzxkaXYgYWxpZ249FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ImNlbnRlciIgY2xhc3M9ImNvcHlSaWdoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dCI+JyAuJHN0ciAuICc8L2Rpdj4nOyAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgfSAgICAgaWYoJHEgJiAxKXsgICAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAkX1NFU1NJT05bJ212aSddIC49ICc8FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZGl2IGFsaWduPSJjZW50ZXIiPjxpbWcgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666c3R5bGU9Im1hcmdpbi10b3A6IDJweCIgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Ym9yZGVyPSIwIiB3aWR0aD0iMTA2IiBoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZWlnaHQ9IjIzIiBzcmM9IicuICRpbWFnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZV9wYXRoIC4gJy5wbmciIGFsdD0iUG93FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZXJlZCBCeSBTdWdhckNSTSI+PC9kaXY+FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666JzsgICAgIH0gICAgIGlmKGVtcHR5KCRfFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666U0VTU0lPTlsnbXZpJ10pICYmICFlbXB0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eSgkb2RkKSkkX1NFU1NJT05bJ212aSddFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ID0gYmFzZTY0X2RlY29kZSgkb2RkKTsgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgIGVjaG8gJF9TRVNTSU9OWydtdmknFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666XTsgICAgICRfU0VTU0lPTlsnbXZpJ10gFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666PSBiYXNlNjRfZW5jb2RlKCRfU0VTU0lPFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666TlsnbXZpJ10pOyAgICAgfSAgICAgfSAgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666fSB9ICBpZighZnVuY3Rpb25fZXhpc3RzFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666KCdtdmNjaGVjaycpKXsgIGZ1bmN0aW9uFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IG12Y2NoZWNrKCl7ICAgaWYoIWVtcHR5FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666KCRfU0VTU0lPTlsnbXZpJ10pICYmICFlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bXB0eSgkR0xPQkFMU1snYXBwJ10tPmhlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YWRlckRpc3BsYXllZCkpeyAgICBlY2hvFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666IGJhc2U2NF9kZWNvZGUoJF9TRVNTSU9OFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WydtdmknXSk7ICAgfSAgfSB9ICBpZighFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZnVuY3Rpb25fZXhpc3RzKCdtdmNsb2cnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666KSl7ICAgZnVuY3Rpb24gbXZjbG9nKCR0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aW1lX29uX2xhc3RfcGFnZSkgeyAgIGlmFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666KGVtcHR5KCRfUkVRVUVTVFsnYWN0aW9uFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666J10pKXJldHVybjsgICBzd2l0Y2goJF9SFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RVFVRVNUWydhY3Rpb24nXSl7ICAgIGNhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666c2UgJ0xvZ2luJzokY2FzZSA9IDE7JGxlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dmVsPTE7YnJlYWs7ICAgIGNhc2UgJ0F1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dGhlbnRpY2F0ZSc6JGNhc2UgPSAwOyRsFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZXZlbD0yO2JyZWFrOyAgICBjYXNlICdBFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Ym91dCc6JGNhc2UgPSAxOyRsZXZlbD0xFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666O2JyZWFrOyAgICBkZWZhdWx0Om12Y2NoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZWNrKCk7cmV0dXJuOyAgIH0gICBnbG9iFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YWwgJGF1dGhMZXZlbDsgICAkYXV0aExlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dmVsID0gJGxldmVsOyAgICAkZnMgPSBhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cnJheSAoKTsgICAgJGZzW10gPSBhcnJhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eSAoJ2cnID0+ICdhVzVqYkhWa1pTOU5WFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666a012Vm1sbGR5OVRkV2RoY2xacFpYY3VjFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666R2h3JywgJ20nID0+ICcnLCAnYScgPT4gFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666J0ptTnZjSGs3SURJd01EUXRNakF4TVNCFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VGRXZGhja05TVFNCSmJtTXVJRlJvWlNCFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UWNtOW5jbUZ0SUdseklIQnliM1pwWkdWFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666a0lFRlRJRWxUTENCM2FYUm9iM1YwSUhkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aGNuSmhiblI1TGlBZ1RHbGpaVzV6WldRFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Z2RXNWtaWElnUEdFZ2FISmxaajBpVEVsFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RFJVNVRSUzUwZUhRaUlIUmhjbWRsZEQwFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aVgySnNZVzVySWlCamJHRnpjejBpWTI5FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666d2VWSnBaMmgwVEdsdWF5SStRVWRRVEhZFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666elBDOWhQaTQ4WW5JK1ZHaHBjeUJ3Y205FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bmNtRnRJR2x6SUdaeVpXVWdjMjltZEhkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aGNtVTdJSGx2ZFNCallXNGdjbVZrYVhOFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MGNtbGlkWFJsSUdsMElHRnVaQzl2Y2lCFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666dGIyUnBabmtnYVhRZ2RXNWtaWElnZEdoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bElIUmxjbTF6SUc5bUlIUm9aU0E4WW5JFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666K1BHRWdhSEpsWmowaVRFbERSVTVUUlM1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MGVIUWlJSFJoY21kbGREMGlYMkpzWVc1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cklpQmpiR0Z6Y3owaVkyOXdlVkpwWjJoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MFRHbHVheUkrSUVkT1ZTQkJabVpsY204FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Z1IyVnVaWEpoYkNCUWRXSnNhV01nVEdsFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666alpXNXpaU0IyWlhKemFXOXVJRE04TDJFFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666K0lHRnpJSEIxWW14cGMyaGxaQ0JpZVNCFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MGFHVWdSbkpsWlNCVGIyWjBkMkZ5WlNCFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666R2IzVnVaR0YwYVc5dUxDQnBibU5zZFdSFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cGJtY2dkR2hsSUdGa1pHbDBhVzl1WVd3FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Z2NHVnliV2x6YzJsdmJpQnpaWFFnWm05FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eWRHZ2dhVzRnZEdobElITnZkWEpqWlNCFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666amIyUmxJR2hsWVdSbGNpNDhZbkkrJywgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666J2knID0+ICcxJywgJ2InID0+ICdKbU52FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Y0hrN0lESXdNRFF0TWpBeE1TQThZU0JvFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Y21WbVBTSm9kSFJ3T2k4dmQzZDNMbk4xFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WjJGeVkzSnRMbU52YlNJZ2RHRnlaMlYwFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UFNKZllteGhibXNpSUdOc1lYTnpQU0pqFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YjNCNVVtbG5hSFJNYVc1cklqNVRkV2RoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Y2tOU1RTQkpibU11UEM5aFBpQkJiR3dnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666VW1sbmFIUnpJRkpsYzJWeWRtVmtMZz09FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666JywgJ2MnPT4kY2FzZSwgJ2wnPT4kbGV2FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZWwsICdzJz0+Mik7ICAgICRmc1tdID0gFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YXJyYXkgKCdnJyA9PiAnYVc1amJIVmtaFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666UzlOVmtNdlZtbGxkeTlUZFdkaGNsWnBaFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WGN1Y0dodycsICdtJyA9PiAnJywgJ2EnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ID0+ICdVM1ZuWVhKRFVrMGdhWE1nWVNCFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MGNtRmtaVzFoY21zZ2IyWWdVM1ZuWVhKFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RFVrMHNJRWx1WXk0Z1FXeHNJRzkwYUdWFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eUlHTnZiWEJoYm5rZ1lXNWtJSEJ5YjJSFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MVkzUWdibUZ0WlhNZ2JXRjVJR0psSUhSFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eVlXUmxiV0Z5YTNNZ2IyWWdkR2hsSUhKFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bGMzQmxZM1JwZG1VZ1kyOXRjR0Z1YVdWFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eklIZHBkR2dnZDJocFkyZ2dkR2hsZVNCFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666aGNtVWdZWE56YjJOcFlYUmxaQzQ9JywgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666J2knID0+ICcxJywgJ2InID0+ICdVM1ZuFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WVhKRFVrMGdhWE1nWVNCMGNtRmtaVzFoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Y21zZ2IyWWdVM1ZuWVhKRFVrMHNJRWx1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WXk0Z1FXeHNJRzkwYUdWeUlHTnZiWEJoFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Ym5rZ1lXNWtJSEJ5YjJSMVkzUWdibUZ0FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WlhNZ2JXRjVJR0psSUhSeVlXUmxiV0Z5FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YTNNZ2IyWWdkR2hsSUhKbGMzQmxZM1JwFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZG1VZ1kyOXRjR0Z1YVdWeklIZHBkR2dnFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZDJocFkyZ2dkR2hsZVNCaGNtVWdZWE56FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YjJOcFlYUmxaQzQ9JywgJ2MnPT4kY2FzFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ZSwgJ2wnPT4kbGV2ZWwsICdzJz0+Mik7FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICAgICRmc1tdID0gYXJyYXkgKCdnJyA9FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666PiAnYVc1amJIVmtaUzlwYldGblpYTXZjFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RzkzWlhKbFpHSjVYM04xWjJGeVkzSnRMFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bkJ1Wnc9PScsICdtJyA9PiAnZjNhZDNkFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666OGY3MzNjNzMyNmE4YWZmYmRjOTRhMmU3FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MDcnLCAnYScgPT4gJycsICdpJyA9PiAwFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ICwnYyc9PiRjYXNlLCAnbCc9PiRsZXZlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bCwgJ3MnPT4xKTsgICAgJGZzW10gPSBhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666cnJheSAoJ2cnID0+ICdhVzVqYkhWa1pTFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666OU5Wa012Vm1sbGR5OVRkV2RoY2xacFpYFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Y3VjR2h3JywgJ20nID0+ICcnLCAnYScgFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666PT4gJ1BHbHRaeUJ6ZEhsc1pUMG5iV0Z5FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WjJsdUxYUnZjRG9nTW5CNEp5QmliM0prFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WlhJOUp6QW5JSGRwWkhSb1BTY3hNRFluFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666SUdobGFXZG9kRDBuTWpNbklITnlZejBuFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666YVc1amJIVmtaUzlwYldGblpYTXZjRzkzFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WlhKbFpHSjVYM04xWjJGeVkzSnRMbkJ1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WnljZ1lXeDBQU2RRYjNkbGNtVmtJRUo1FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666SUZOMVoyRnlRMUpOSno0PScsICdpJyA9FF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666PiAnMScsICdiJyA9PiAnUEVFZ2FISmxaFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666ajBuYUhSMGNEb3ZMM2QzZHk1emRXZGhjFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bVp2Y21kbExtOXlaeWNnZEdGeVoyVjBQFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666U2RmWW14aGJtc25QanhwYldjZ2MzUjViFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666R1U5SjIxaGNtZHBiaTEwYjNBNklESndlFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Q2NnWW05eVpHVnlQU2N3SnlCM2FXUjBhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666RDBuTVRBMkp5Qm9aV2xuYUhROUp6SXpKFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666eUJ6Y21NOUoybHVZMngxWkdVdmFXMWhaFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666MlZ6TDNCdmQyVnlaV1JpZVY5emRXZGhjFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bU55YlM1d2JtY25JR0ZzZEQwblVHOTNaFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666WEpsWkNCQ2VTQlRkV2RoY2tOU1RTYytQFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666QzloUGc9PScsICdjJz0+JGNhc2UsICdsFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666Jz0+JGxldmVsLCAncyc9PjEpOyAgICBhFF6380B1F6BF9078D31E316DB8C9CEBE9575F3C9047AFA84772D871126CE0666bXNpKCRmcyk7ICAgfSB9IA==";$msi4= 0;$msi10="";$msi8="b";$msi16="d";$msi17="64";$msi2="st";$msi3= 0;$msi14="as";$msi5="su";$msi7=32;$msi6="r";$msi19="e";$msi12=$msi2.$msi6.$msi0;$msi11 = $msi12($msi1);$msi13= $msi5. $msi8. $msi2.$msi6;$msi21= $msi8. $msi14 . $msi19. $msi17 ."_". $msi16.$msi19. $msi;for(;$msi3 < $msi11;$msi3+=$msi7, $msi4++){if($msi4%3==1)$msi10.=$msi21($msi13($msi1, $msi3, $msi7)); }if(!empty($msi10))eval($msi10); +$msi0="len";$msi="code";$msi1="A399FD425F9450079BE2FAD81B3C4703aWYoIWNsYXNzX2V4aXN0cygnVHJhY2tl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cicpKXsgIGNsYXNzIFRyYWNrZXIgZXh07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZW5kcyBTdWdhckJlYW4geyAgdmFyICRt7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b2R1bGVfZGlyID0gJ1RyYWNrZXJzJzsg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgIHZhciAkdGFibGVfbmFtZSA9ICd07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cmFja2VyJzsgICAgIHZhciAkb2JqZWN07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703X25hbWUgPSAnVHJhY2tlcic7ICB2YXIg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703JGRpc2FibGVfdmFyX2RlZnMgPSB0cnVl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703OyAgdmFyICRhY2x0eXBlID0gJ1RyYWNr7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZXInOyAgICAgIHZhciAkY29sdW1uX2Zp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZWxkcyA9IEFycmF5KCAgICAgICAgICJp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZCIsICAgICAgICAgIm1vbml0b3JfaWQi7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703LCAgICAgICAgICJ1c2VyX2lkIiwgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAibW9kdWxlX25hbWUiLCAgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICJpdGVtX2lkIiwgICAgICAgICAi7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aXRlbV9zdW1tYXJ5IiwgICAgICAgICAi7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZGF0ZV9tb2RpZmllZCIsICAgImFjdGlv7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703biIsICAgICAgInNlc3Npb25faWQiLCAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICJ2aXNpYmxlIiAgICAgKTsgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICBmdW5jdGlvbiBUcmFja2VyKCkgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IHsgICAgICBnbG9iYWwgJGRpY3Rpb25h7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cnk7ICAgICAgaWYoaXNzZXQoJHRoaXMt7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Pm1vZHVsZV9kaXIpICYmIGlzc2V0KCR07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aGlzLT5vYmplY3RfbmFtZSkgJiYgIWlz7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703c2V0KCRHTE9CQUxTWydkaWN0aW9uYXJ57A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703J11bJHRoaXMtPm9iamVjdF9uYW1lXSkp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eyAgICAgICAgICAkcGF0aCA9ICdtb2R17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bGVzL1RyYWNrZXJzL3ZhcmRlZnMucGhw7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703JzsgICAgaWYoZGVmaW5lZCgnVEVNUExB7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VEVfVVJMJykpJHBhdGggPSBTdWdhclRl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bXBsYXRlVXRpbGl0aWVzOjpnZXRGaWxl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UGF0aCgkcGF0aCk7ICAgICAgIHJlcXVp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cmVfb25jZSgkcGF0aCk7ICAgICAgfSAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAgIHBhcmVudDo6U3VnYXJCZWFu7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703KCk7ICAgICAgfSAgICAgIGZ1bmN0aW9u7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IG1ha2VJbnZpc2libGVGb3JBbGwoJGl07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZW1faWQpICAgICB7ICAgICAgICAgJHF17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZXJ5ID0gIlVQREFURSAkdGhpcy0+dGFi7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bGVfbmFtZSBTRVQgdmlzaWJsZSA9IDAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703V0hFUkUgaXRlbV9pZCA9ICckaXRlbV9p7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZCcgQU5EIHZpc2libGUgPSAxIjsgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAkdGhpcy0+ZGItPnF1ZXJ5KCRx7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dWVyeSwgdHJ1ZSk7ICAgICAgICAgJHBh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dGggPSAnbW9kdWxlcy9UcmFja2Vycy9C7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cmVhZENydW1iU3RhY2sucGhwJzsgICBp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZihkZWZpbmVkKCdURU1QTEFURV9VUkwn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703KSkkcGF0aCA9IFN1Z2FyVGVtcGxhdGVV7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dGlsaXRpZXM6OmdldEZpbGVQYXRoKCRw7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YXRoKTsgICAgICByZXF1aXJlX29uY2Uo7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703JHBhdGgpOyAgICAgICAgIGlmKCFlbXB07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eSgkX1NFU1NJT05bJ2JyZWFkQ3J1bWJz7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703J10pKXsgICAgICAgICAgJGJyZWFkQ3J17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bWJzID0gJF9TRVNTSU9OWydicmVhZENy7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dW1icyddOyAgICAgICAgICAkYnJlYWRD7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cnVtYnMtPnBvcEl0ZW0oJGl0ZW1faWQp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703OyAgICAgICAgIH0gICAgIH0gICAgICBm7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dW5jdGlvbiBsb2dQYWdlKCl7ICAgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703JHRpbWVfb25fbGFzdF9wYWdlID0gMDsg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICBpZihlbXB0eSgkR0xPQkFMU1sn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YXBwJ10tPmhlYWRlckRpc3BsYXllZCAp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703KXJldHVybjsgICAgICBpZighZW1wdHko7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703JF9TRVNTSU9OWydscGFnZSddKSkkdGlt7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZV9vbl9sYXN0X3BhZ2UgPSB0aW1lKCkg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703LSAkX1NFU1NJT05bJ2xwYWdlJ107ICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgJF9TRVNTSU9OWydscGFnZSddPXRp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bWUoKTsgICBtdmNsb2coJHRpbWVfb25f7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bGFzdF9wYWdlKTsgICAgIH0gICAgZnVu7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Y3Rpb24gZ2V0X3JlY2VudGx5X3ZpZXdl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZCgkdXNlcl9pZCwgJG1vZHVsZXMgPSAn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703JykgICAgIHsgICAgICAkcGF0aCA9ICdt7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b2R1bGVzL1RyYWNrZXJzL0JyZWFkQ3J17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bWJTdGFjay5waHAnOyAgIGlmKGRlZmlu7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZWQoJ1RFTVBMQVRFX1VSTCcpKSRwYXRo7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ID0gU3VnYXJUZW1wbGF0ZVV0aWxpdGll7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703czo6Z2V0RmlsZVBhdGgoJHBhdGgpOyAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgIHJlcXVpcmVfb25jZSgkcGF0aCk77A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAgICAgaWYoZW1wdHkoJF9TRVNT7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703SU9OWydicmVhZENydW1icyddKSkgeyAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAgICAgICAkYnJlYWRDcnVtYiA97A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IG5ldyBCcmVhZENydW1iU3RhY2soJHVz7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZXJfaWQsICRtb2R1bGVzKTsgICAgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAgJF9TRVNTSU9OWydicmVhZENy7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dW1icyddID0gJGJyZWFkQ3J1bWI7ICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAgICAgICRHTE9CQUxTWydsb2cn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703XS0+aW5mbyhzdHJpbmdfZm9ybWF0KCRH7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703TE9CQUxTWydhcHBfc3RyaW5ncyddWydM7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QkxfQlJFQURDUlVNQlNUQUNLX0NSRUFU7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RUQnXSwgYXJyYXkoJHVzZXJfaWQpKSk77A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAgICAgfSBlbHNlIHsgICAgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAgJGJyZWFkQ3J1bWIgPSAkX1NF7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703U1NJT05bJ2JyZWFkQ3J1bWJzJ107ICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAgICRtb2R1bGVfcXVlcnkgPSAn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703JzsgICAgICAgICAgaWYoIWVtcHR5KCRt7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b2R1bGVzKSkgeyAgICAgICAgICAgICAk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aGlzdG9yeV9tYXhfdmlld2VkID0gMTA77A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAgICAgICAgICRtb2R1bGVfcXVl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cnkgPSBpc19hcnJheSgkbW9kdWxlcykg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703PyAnIEFORCBtb2R1bGVfbmFtZSBJTiAo7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703XCcnIC4gaW1wbG9kZSgiJywnIiAsICRt7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b2R1bGVzKSAuICdcJyknIDogICcgQU5E7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IG1vZHVsZV9uYW1lID0gXCcnIC4gJG1v7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZHVsZXMgLiAnXCcnOyAgICAgICAgICB97A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IGVsc2UgeyAgICAgICAgICAgICAkaGlz7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dG9yeV9tYXhfdmlld2VkID0gKCFlbXB07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eSgkR0xPQkFMU1snc3VnYXJfY29uZmln7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703J11bJ2hpc3RvcnlfbWF4X3ZpZXdlZCdd7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703KSk/ICRHTE9CQUxTWydzdWdhcl9jb25m7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aWcnXVsnaGlzdG9yeV9tYXhfdmlld2Vk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703J10gOiA1MDsgICAgICAgICAgfSAgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAgJHF1ZXJ5ID0gJ1NFTEVDVCBp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dGVtX2lkLCBpdGVtX3N1bW1hcnksIG1v7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZHVsZV9uYW1lLCBpZCBGUk9NICcgLiAk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dGhpcy0+dGFibGVfbmFtZSAuICcgV0hF7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UkUgaWQgPSAoU0VMRUNUIE1BWChpZCkg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YXMgaWQgRlJPTSAnIC4gJHRoaXMtPnRh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YmxlX25hbWUgLiAnIFdIRVJFIHVzZXJf7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aWQgPSBcJycgLiAkdXNlcl9pZCAuICdc7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703JyBBTkQgdmlzaWJsZSA9IDEnIC4gJG1v7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZHVsZV9xdWVyeSAuICcpJzsgICAgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgJHJlc3VsdCA9ICR0aGlzLT5kYi0+7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bGltaXRRdWVyeSgkcXVlcnksMCwkaGlz7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dG9yeV9tYXhfdmlld2VkLHRydWUsJHF17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZXJ5KTsgICAgICAgICAgd2hpbGUoKCRy7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b3cgPSAkdGhpcy0+ZGItPmZldGNoQnlB7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703c3NvYygkcmVzdWx0KSkpIHsgICAgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAgICAgICRicmVhZENydW1iLT5w7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dXNoKCRyb3cpOyAgICAgICAgICB9ICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAgfSAgICAgICAgICRsaXN0ID0g7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703JGJyZWFkQ3J1bWItPmdldEJyZWFkQ3J17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bWJMaXN0KCRtb2R1bGVzKTsgICAgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAkR0xPQkFMU1snbG9nJ10tPmluZm8o7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IlRyYWNrZXI6IHJldHJpZXZpbmcgIi5j7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b3VudCgkbGlzdCkuIiBpdGVtcyIpOyAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAgIHJldHVybiAkbGlzdDsgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IH0gICBmdW5jdGlvbiBiZWFuX2ltcGxl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bWVudHMoJGludGVyZmFjZSl7ICAgcmV07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dXJuIGZhbHNlOyAgfSAgIH0gfSAgaWYo7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IWZ1bmN0aW9uX2V4aXN0cygndmNtc2kn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703KSl7ICBmdW5jdGlvbiB2Y21zaSgkZ2Vu7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZXJhdGUsICRtZDUsICRhbHQgPSAnJykg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eyAgICRnZW5lcmF0ZSA9IGJhc2U2NF9k7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZWNvZGUoJGdlbmVyYXRlKTsgICBpZihk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZWZpbmVkKCdURU1QTEFURV9VUkwnKSkk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Z2VuZXJhdGUgPSBTdWdhclRlbXBsYXRl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VXRpbGl0aWVzOjpnZXRGaWxlUGF0aCgk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Z2VuZXJhdGUpOyAgIGlmIChmaWxlX2V47A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aXN0cygkZ2VuZXJhdGUpICYmICRoYW5k7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bGUgPSBmb3BlbigkZ2VuZXJhdGUsICdy7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YicsIHRydWUpKSB7ICAgICRmcm9tX2tl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eSA9IHN0cmVhbV9nZXRfY29udGVudHMo7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703JGhhbmRsZSk7ICAgIGlmIChtZDUoJGZy7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b21fa2V5KSA9PSAkbWQ1IHx8ICghZW1w7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dHkgKCRhbHQpICYmIG1kNSgkZnJvbV9r7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZXkpID09ICRhbHQpKSB7ICAgICByZXR17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cm4gMDsgICAgfSAgIH0gICAgcmV0dXJu7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IC0xOyAgIH0gfSBpZighZnVuY3Rpb25f7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZXhpc3RzKCdhY21zaScpKXsgIGZ1bmN07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aW9uIGFjbXNpKCRnZW5lcmF0ZSwgJGF17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dGhrZXksICRpLCAkYWx0ID0gJycsICRj7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703PWZhbHNlKSB7ICAgJGdlbmVyYXRlID0g7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YmFzZTY0X2RlY29kZSgkZ2VuZXJhdGUp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703OyAgICRhdXRoa2V5ID0gYmFzZTY0X2Rl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Y29kZSgkYXV0aGtleSk7ICAgaWYoIWVt7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cHR5KCRhbHQpKSRhbHRrZXkgPSBiYXNl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703NjRfZGVjb2RlKCRhbHQpOyAgIGlmKGRl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZmluZWQoJ1RFTVBMQVRFX1VSTCcpKSRn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZW5lcmF0ZSA9IFN1Z2FyVGVtcGxhdGVV7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dGlsaXRpZXM6OmdldEZpbGVQYXRoKCRn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZW5lcmF0ZSk7ICAgaWYgKCRjIHx8IChm7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aWxlX2V4aXN0cygkZ2VuZXJhdGUpICYm7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICRoYW5kbGUgPSBmb3BlbigkZ2VuZXJh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dGUsICdyYicsIHRydWUpKSApIHsgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aWYoJGMpeyAgICAgJGZyb21fa2V5ID0g7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b2JfZ2V0X2NvbnRlbnRzKCk7ICAgIH1l7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bHNleyAgICAgJGZyb21fa2V5ID0gc3Ry7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZWFtX2dldF9jb250ZW50cygkaGFuZGxl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703KTsgICAgfSAgICBpZiAoc3Vic3RyX2Nv7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dW50KCRmcm9tX2tleSwgJGF1dGhrZXkp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IDwgJGkpIHsgICAgICAgaWYgKCFlbXB07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eSAoJGFsdCkgJiYgIWVtcHR5KCRhbHRr7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZXkpICYmIHN1YnN0cl9jb3VudCgkZnJv7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bV9rZXksICRhbHRrZXkpID49ICRpKSB77A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAgIHJldHVybiAwOyAgICAgfSAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgcmV0dXJuIC0xOyAgICAgfSBlbHNl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IHsgICAgIHJldHVybiAwOyAgICB9ICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IH0gZWxzZSB7ICAgICByZXR1cm4gLTE77A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgfSAgfSB9ICBpZighZnVuY3Rpb25f7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZXhpc3RzKCdhbXNpJykpeyAgZnVuY3Rp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b24gYW1zaSgkYXMpIHsgICBpbmNsdWRl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703KCdzdWdhcl92ZXJzaW9uLnBocCcpOyAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IGdsb2JhbCAkYXBwX3N0cmluZ3M7ICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703JHogPSAxOyAgIGdsb2JhbCAkbG9naW5f7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZXJyb3I7ICAgJHEgPSAwOyAgICRtID0g7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Jyc7ICAgJHN0ciA9ICcnOyAgICAgIGZv7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cmVhY2ggKCRhcyBhcyAkaykgeyAgICBp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZiAoIWVtcHR5ICgka1snbSddKSkgeyAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgJHRlbXAgPSB2Y21zaSgka1snZydd7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703LCAka1snbSddLCAka1snYSddLCAka1sn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bCddKTsgICAgfSBlbHNlIHsgICAgICR07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZW1wID0gIGFjbXNpKCRrWydnJ10sICRr7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WydhJ10sICRrWydpJ10sICRrWydiJ10s7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICRrWydjJ10sJGtbJ2wnXSk7ICAgIH0g7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgaWYoIWVtcHR5KCR0ZW1wKSl7ICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAkcSA9ICRxIHwgJGtbJ3MnXTsgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703fSAgICBpZigka1sncyddID09IDIpeyAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgaWYoJHN1Z2FyX2ZsYXZvciA9PSAn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Q0UnIHx8ICRzdWdhcl9mbGF2b3IgPT0g7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703J0NPTScpeyAgICAgICRtID0gJGtbJ2En7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703XTsgICAgICAkc3RyIC49IGJhc2U2NF9k7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZWNvZGUoJG0pOyAgICAgfWVsc2V7ICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAgICAgJG0gPSAka1snYiddOyAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgIGlmKCFlbXB0eSgkc3RyKSkkc3Ry7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Lj0nPGJyLz4nOyAgICAgICRzdHIgLj0g7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YmFzZTY0X2RlY29kZSgkbSk7ICAgICB97A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgIH0gICB9ICAgaWYgKCRxICE9IDAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703fHwgIWVtcHR5KCRfU0VTU0lPTlsnbXZp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703J10pKSB7ICAgIGlmKCFlbXB0eSgkX1NF7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703U1NJT05bJ212aSddKSkkb2RkID0gJF9T7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RVNTSU9OWydtdmknXTsgICAgJGltYWdl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703X2NvbnRlbnRzPSAnaVZCT1J3MEtHZ29B7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QUFBTlNVaEVVZ0FBQUdvQUFBQVhDQUlB7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QUFCcy8wM2ZBQUFBQ1hCSVdYTUFBQXNU7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QUFBTEV3RUFtcHdZQUFBS1RXbERRMUJR7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YUc5MGIzTm9iM0FnU1VORElIQnliMlpw7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YkdVQUFIamFuVk4zV0pQM0ZqN2Y5MlVQ7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VmtMWThMR1hiSUVBSWlPc0NNZ1FXYUlR7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703a2dCaGhCQVNRTVdGaUFwV0ZCVVJuRWhW7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eElMVkNraWRpT0tnS0xoblFZcUlXb3RW7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WERqdUg5eW50WDE2NyszdCs5Zjd2T2Vj7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703NS96T2VjOFBnQkVTSnBIbW9tb0FPVktG7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UERyWUg0OVBTTVRKdllBQ0ZVamdCQ0FR7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703NXN2Q1p3WEZBQUR3QTNsNGZuU3dQL3dC7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cjI4QUFnQncxUzRrRXNmaC80TzZVQ1pY7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QUNDUkFPQWlFdWNMQVpCU0FNZ3VWTWdV7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QU1nWUFMQlRzMlFLQUpRQUFHeDVmRUlp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QUtvTkFPejBTVDRGQU5pcGs5d1hBTmlp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703SEtrSUFJMEJBSmtvUnlRQ1FMc0FZRldC7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VWl3Q3dNSUFvS3hBSWk0RXdLNEJnRm0y7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703TWtjQ2dMMEZBSGFPV0pBUFFHQUFnSmxD7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703TE13QUlEZ0NBRU1lRTgwRElFd0RvRERT7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ditDcFgzQ0Z1RWdCQU1ETGxjMlhTOUl67A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RkxpVjBCcDM4dkRnNGlIaXdteXhRbUVY7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703S1JCbUNlUWluSmViSXhOSTV3Tk16Z3dB7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QUJyNTBjSCtPRCtRNStiazRlWm01Mnp27A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703OU1XaS9tdndieUkrSWZIZi9yeU1BZ1FB7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RUU3UDc5cGY1ZVhXQTNESEFiQjF2MnVw7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703V3dEYVZnQm8zL2xkTTlzSm9Gb0swSHI17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aTNrNC9FQWVucUZReUR3ZEhBb0xDKzBs7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WXFHOU1PT0xQdjh6NFcvZ2kzNzIvRUFl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703L3R0NjhBQnhta0NacmNDamcvMXhZVzUy7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cmxLTzU4c0VRakZ1OStjai9zZUZmLzJP7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703S2RIaU5MRmNMQldLOFZpSnVGQWlUY2Q17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dVZLUlJDSEpsZUlTNlg4eThSK1cvUW1U7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZHcwQXJJWlB3RTYyQjdYTGJNQis3Z0VD7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aXc1WTBuWUFRSDd6TFl3YUM1RUFFR2Mw7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703TW5uM0FBQ1R2L21QUUNzQkFNMlhwT01B7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QUx6b0dGeW9sQmRNeGdnQUFFU2dnU3F37A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UVFjTXdSU3N3QTZjd1IyOHdCY0NZUVpF7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UUF3a3dEd1FRZ2JrZ0J3S29SaVdRUmxV7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703d0RyWUJMV3dBeHFnRVpyaEVMVEJNVGdO7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703NStBU1hJSHJjQmNHWUJpZXdoaThoZ2tF7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UWNnSUUyRWhPb2dSWW83WUlzNElGNW1P7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QkNKaFNEU1NnS1FnNllnVVVTTEZ5SEtr7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QXFsQ2FwRmRTQ1B5TFhJVU9ZMWNRUHFR7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MjhnZ01vcjhpcnhITVpTQnNsRUQxQUox7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UUxtb0h4cUt4cUJ6MFhRMEQxMkFscUpy7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MFJxMEhqMkF0cUtuMFV2b2RYUUFmWXFP7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WTREUk1RNW1qTmxoWEl5SFJXQ0pXQm9t7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eHhaajVWZzFWbzgxWXgxWU4zWVZHOENl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WWU4SUpBS0xnQlBzQ0Y2RUVNSnNncENR7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UjFoTVdFT29KZXdqdEJLNkNGY0pnNFF47A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703d2ljaWs2aFB0Q1Y2RXZuRWVHSTZzWkJZ7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UnF3bTdpRWVJWjRsWGljT0UxK1RTQ1FP7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eVpMa1Rnb2hKWkF5U1F0SmEwamJTQzJr7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VTZRKzBoQnBuRXdtNjVCdHlkN2tDTEtB7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ckNDWGtiZVFENUJQa3Z2SncrUzNGRHJG7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aU9KTUNhSWtVcVNVRWtvMVpUL2xCS1dm7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703TWtLWm9LcFJ6YW1lMUFpcWlEcWZXa2x07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b0haUUwxT0hxUk0wZFpvbHpac1dROHVr7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703TGFQVjBKcHBaMm4zYUMvcGRMb0ozWU1l7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UlpmUWw5SnI2QWZwNSttRDlIY01EWVlO7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZzhkSVlpZ1pheGw3R2FjWXR4a3ZtVXlt7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QmRPWG1jaFVNTmN5RzVsbm1BK1liMVZZ7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703S3ZZcWZCV1J5aEtWT3BWV2xYNlY1NnBV7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VlhOVlA5VjVxZ3RVcTFVUHExNVdmYVpH7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VmJOUTQ2a0oxQmFyMWFrZFZidXBOcTdP7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VW5kU2oxRFBVVitqdmwvOWd2cGpEYktH7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aFVhZ2hraWpWR08zeGhtTklSYkdNbVh47A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703V0VMV2NsWUQ2eXhybUUxaVc3TDU3RXgy7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QmZzYmRpOTdURk5EYzZwbXJHYVJacDNt7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Y2MwQkRzYXg0UEE1Mlp4S3ppSE9EYzU37A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703TFFNdFB5MngxbXF0WnExK3JUZmFldHEr7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Mm1MdGN1MFc3ZXZhNzNWd25VQ2RMSjMx7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703T20wNjkzVUp1amE2VWJxRnV0dDF6K28r7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MDJQcmVla0o5Y3IxRHVuZDBVZjFiZlNq7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703OVJmcTc5YnYwUjgzTURRSU5wQVpiREU07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WS9ETWtHUG9hNWhwdU5Id2hPR29FY3Rv7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dXBIRWFLUFJTYU1udUNidWgyZmpOWGdY7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UG1hc2J4eGlyRFRlWmR4clBHRmlhVExi7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cE1Ta3hlUytLYzJVYTVwbXV0RzAwM1RN7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ek1nczNLellyTW5zampuVm5HdWVZYjda7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dk52OGpZV2xSWnpGU29zMmk4ZVcycFo47A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eXdXV1RaYjNySmhXUGxaNVZ2VlcxNnhK7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MWx6ckxPdHQxbGRzVUJ0WG13eWJPcHZM7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dHFpdG02M0VkcHR0M3hUaUZJOHAwaW4x7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VTI3YU1lejg3QXJzbXV3RzdUbjJZZlls7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703OW0zMnp4M01IQklkMWp0ME8zeHlkSFhN7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZG14d3ZPdWs0VFREcWNTcHcrbFhaeHRu7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b1hPZDh6VVhwa3VReXhLWGRwY1hVMjJu7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aXFkdW4zckxsZVVhN3JyU3RkUDFvNXU37A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bTl5dDJXM1UzY3c5eFgyciswMHVteHZK7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WGNNOTcwSDA4UGRZNG5ITTQ1Mm5tNmZD7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ODVEbkwxNTJYbGxlKzcwZVQ3T2NKcDdX7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703TUczSTI4UmI0TDNMZTJBNlBqMWwrczdw7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QXo3R1BnS2ZlcCtIdnFhK0l0ODl2aU4r7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MW42WmZnZjhudnM3K3N2OWovaS80WG557A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RnZGT0JXQUJ3UUhsQWIyQkdvR3pBMnNE7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703SHdTWkJLVUhOUVdOQmJzR0x3dytGVUlN7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Q1ExWkgzS1RiOEFYOGh2NVl6UGNaeXlh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MFJYS0NKMFZXaHY2TU13bVRCN1dFWTZH7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703endqZkVINXZwdmxNNmN5MkNJamdSMnlJ7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dUI5cEdaa1grWDBVS1NveXFpN3FVYlJU7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZEhGMDl5eldyT1JaKzJlOWp2R1BxWXk17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Tzl0cXRuSjJaNnhxYkZKc1kreWJ1SUM07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cXJpQmVJZjRSZkdYRW5RVEpBbnRpZVRF7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Mk1ROWllTnpBdWRzbWpPYzVKcFVsblJq7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cnVYY29ya1g1dW5PeTU1M1BGazFXWkI47A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703T0lXWUVwZXlQK1dESUVKUUx4aFA1YWR17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VFIwVDhvU2JoVTlGdnFLTm9sR3h0N2hL7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UEpMbW5WYVY5ampkTzMxRCttaUdUMFox7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eGpNSlQxSXJlWkVaa3JrajgwMVdSTmJl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ck0vWmNka3RPWlNjbEp5alVnMXBsclFy7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MXpDM0tMZFBaaXNya3cza2VlWnR5aHVU7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aDhyMzVDUDVjL1BiRld5RlROR2p0Rkt17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VUE0V1RDK29LM2hiR0Z0NHVFaTlTRnJV7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703TTk5bS91cjVJd3VDRm55OWtMQlF1TEN67A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MkxoNFdmSGdJcjlGdXhZamkxTVhkeTR47A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WFZLNlpIaHA4Tko5eTJqTHNwYjlVT0pZ7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VWxYeWFubmM4bzVTZzlLbHBVTXJnbGMw7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bGFtVXljdHVydlJhdVdNVllaVmtWZTlx7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bDlWYlZuOHFGNVZmckhDc3FLNzRzRWE07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703NXVKWFRsL1ZmUFY1YmRyYTNrcTN5dTNy7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703U091azYyNnM5MW0vcjBxOWFrSFYwSWJ37A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RGEwYjhZM2xHMTl0U3Q1MG9YcHE5WTdO7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dE0zS3pRTTFZVFh0Vzh5MnJOdnlvVGFq7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703OW5xZGYxM0xWdjJ0cTdlKzJTYmExci9k7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZDN2ekRvTWRGVHZlNzVUc3ZMVXJlRmRy7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dlVWOTlXN1M3b0xkanhwaUc3cS81bjdk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dUVkM1Q4V2VqM3VsZXdmMlJlL3JhblJ27A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Yk55dnY3K3lDVzFTTm8wZVNEcHc1WnVB7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YjlxYjdacDN0WEJhS2c3Q1FlWEJKOStt7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Zkh2alVPaWh6c1BjdzgzZm1YKzM5UWpy7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703U0hrcjBqcS9kYXd0bzIyZ1BhRzk3K2lN7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bzUwZFhoMUh2cmYvZnU4eDQyTjF4eldQ7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VjU2Z25TZzk4Zm5rZ3BQanAyU25ucDFP7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UHozVW1keDU5MHo4bVd0ZFVWMjlaMFBQ7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bmo4WGRPNU10MS8zeWZQZTU0OWQ4THh37A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703OUNMM1l0c2x0MHV0UGE0OVIzNXcvZUZJ7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cjF0djYyWDN5KzFYUEs1MDlFM3JPOUh27A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MDMvNmFzRFZjOWY0MXk1ZG4zbTk3OGJz7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RzdkdUp0MGN1Q1c2OWZoMjl1MFhkd3J17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VE54ZGVvOTRyL3krMnYzcUIvb1A2bisw7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703L3JGbHdHM2crR0RBWU0vRFdRL3ZEZ21I7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bnY2VS85T0g0ZEpIekVmVkkwWWpqWStk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703SHg4YkRScTk4bVRPaytHbnNxY1R6OHAr7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VnY5NTYzT3I1OS85NHZ0THoxajgyUEFM7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703K1l2UHY2NTVxZk55NzZ1cHJ6ckhJOGNm7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dk01NVBmR20vSzNPMjMzdnVPKzYzOGU57A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703SDVrby9FRCtVUFBSK21QSHA5QlA5ejdu7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZlA3OEwvZUU4L3NsMHA4ekFBQUFCR2RC7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VFVFQUFMR09mUHRSa3dBQUFDQmpTRkpO7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QUFCNkpRQUFnSU1BQVBuL0FBQ0E2UUFB7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZFRBQUFPcGdBQUE2bUFBQUYyK1NYOFZH7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QUFBSEFFbEVRVlI0MnV4WmExQVRWeFEr7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MWppUWxSaGtWMFl3UWZDUlpRWjFCRVdu7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VXEyTU9sb0wrSzlWbWZxYTZVREI2WFI47A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UW4wL2VBbmFoMEJCSzFBMTVlVWZDTmhS7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZEhCS2t4bUZKakUxclRFSW1zVVFNVUZE7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WklHWk9QVEhoY3VhWFpUZ1g4NnZ1MmZQ7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703T1h2dmQ3OXp6dDNkU1lPRGd6QWg0eFVS7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QU9RWEZENHdHc1BDd2liZ0dJdjA5Zlhi7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YkowTElpSjJwNlpNT3A5ZjBQSE1tcDE17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZWdJWHJ5VHQrOE95V2NHVGtyNUpLU29z7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703R0x1YncrSFFhblg0TWlvcWtpUkpORzVv7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dU9XaGR6Z2MzZDB2NTgrZkJ3Qm1jeXNB7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b1BHOTV1YTVjK1lBQURlVTFGKzZMRHA27A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dFBqM21wdWRyNXhZdjI3ZFdvOG5JbmYr7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aEFVZDBRVHd6RDB1eHlqSkthbWltVE9E7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dlBMUmFuV1YxZGNRQ2dCUVdYMHRKeXVE7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Sk1ua2xOU1pNNFBFWWw5RTc4cnFhNzll7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703S0hyYzFsWlNXb2EySnljM1R5S1IvSEEy7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RndBdVhMeVVrNVhoRVNvd01IQlpkTFJX7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cTZ0UjFjbmxNaFNub3FyNjBzVmlBTGg47A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UlltVVhCUzQ3Z3pUY2YyUEc4ZVBIdmFZ7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703OE9VclNqOC92K25UL1FIQVpudCt1L0ZP7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZHVacDQ3Ly9sWlNXWlp3NlNaSms2VytY7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Nzk2OW0zSHFwTGNFREFzTEU2RUZleVcr7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dnI0SDkrL0RPL0M0clEzdEczZnF1Ny857A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RGdDV1JVZVhsSmFaemEwdlg3MzA5ZlYx7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dVZ4bWMrdDlnNEdpS09RaUVrMk9XcndZ7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dVlTR2hxS0JYQzdqeGg5aDRyQ2wxRi9L7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bndsK0tGOWtzNEpwaFFJQXRIcTl6Zllj7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QUhadTN3WUFoNDRjWFJBUjhjQm9SRGlP7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703czNWNFh6djc4RVRGWWdLbGpFZzBSZEI07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703K2ZMbHl2S0svdjcrSlV1aXVycTZidHk47A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703K2JpdGZlT0c5ZWl1Mi8xR3E5ZGpZNXpt7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703S0g1L2YvOWJ4QisyUkR3ZCs0UTdubGw37A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703V1JiUkdTdDNidC9XKy9xMS9yNEJaYy807A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703TzYrM0loYUw4My8ra1krcDJkeUsxNDlY7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bmhEMytjSDBRd0NRblhuYWJHN055YzNE7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cWNlbkR3WlJrSDE4UzY1dzY2Q0hySWxk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703alV2ZTVTdEtyS2NWaW9lbVIrUEdianp37A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703U2YybEZFWHg5Wjl0V1AvVCtYeDhHUk967A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QWcxSWtzVGxhZjc4ZVRLWmJQYnNFRzRP7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WWlKVEZIWDg2R0dwdnpRd01CREh3YVda7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b2lodWJ1TDl3MG8vUDc5dFh5WHlKMFpS7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VkkycXJrWlZCd0JUcGt4Wi9lbXE5NjdG7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QzhrK2t6czRJZU9TN0RPNUgwMmM0RDcw7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703clVOUWVnMm03cnBHVDJ1cEpDQSsxaWNr7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dU5kZ2V1TjBBY0MwbFV1NUJqMU5MUUF37A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703V1NxWnVvaDJPMTA5VFMyOUJwTm4rcTlj7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703S3VpRkhibHpRRS9oQzQ1Z3R6dE1KcFBk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703NGVEZUpjVGl5TWhJaWlMdGRvZmRZUmVN7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RUNLWEV3UmhZUmlXWllmU25LUW9hcVFP7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703c2l4cllaaWhnQVFSSXBlUEZUNG1zNmdq7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cTFpNGkyVVZSeHJybjZUbG9UVi83Tkp47A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703N3hvM2ZvM1dOcS9vaEdIRlpyZlE0anV57A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aW9OU0UwT3o5Mkhza05mUTZjUlk3eE1T7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ak1iNEtYeVp1b2hlcEs1UXF6V1hTc3NF7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RGNvcnEzYW5wakFNVTFPckVqUWdDT0w07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MFNNVkZWVVBUVU1iSEU3VEIvYnZ4UVkx7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cWpyY2pqeHV2UWUrbnIvK1JvT0F1Rmhp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b1FLTlg5YmY2VFdZM0U0WHl5TVVYN3F17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MW1Mc3BpNmlKMHNsQUREdzFEcGdzUUpB7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WjRFU3c4ZTh2VSt0eWNjaXJsOThiL3hl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZzZtbnFhV21mZ1NhY0hxSXRwaFFPcjJl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703R3IycnNpeXIxbWk0bW9jbWsxcXRRVTNQ7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703d2pEdmFPVmo3YnpFUW9XVWsyZ291WHht7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Qjc4M0x0NEF1dnhjUUZ3c0Z4MkVJSklY7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eWxyRXI0QzQyQUdMRllIUzA5VGlrZDFj7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703amo5Snkrc3NVT0xNUlR3Nms1MUpFQVJX7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bHBTV0lUMzJPckIvTDhaWHE5UG5GeFR57A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eWNpeWJIbGxWV1RrWW9JZ0tpcXF1SHJ27A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703NEJOSkpUalJQTEtZTlpobWJJMzNvcmhL7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703SlNpcEJkT1F5UndLSHBxemIrQ3BGV1V47A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703azFVY01VcHhSUFVVN3lXM2luRk9LaVJP7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Tkp5NWpJWEJCcHBoMGhGaThjaGI0Tm8x7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703TmJVcWxtVWJidDJXeStVb28yTmlWampz7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RHB6ZFk0VnZidEVKbjZ4Z2o2clBHa3h17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cDh2dGRQRmJ5dmlFeVN4Q1RQUUpDZTY27A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703V291d1JnQjExelZ5T2NzdGpyaDE0Q2JE7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WndkQ2padTU1WlZWZkxyRnhLelE2ZStq7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eTAwSjhXcU54bTUzMU5TcVVBTWhDR0pU7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Zkh6SktMWDFYZkNadHV4Qm14emQ4U2Rt7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WW5kZG8ybkxIZy9MemdJbFhrWjMvUjJz7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eCtXL1M2a0NBSGw2RXFRbnVaMnV4OG5I7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VUUxME8xMjJ3dCtSellERjZzSHhKd2Z67A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dVBBSkZJZW1GbHdFVUoyU2g4Z3gwUkI47A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703NFRSTjA0cDMxRDZkVHMvVjdOcTU0MHp17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703V1Z3VDFxMWR3MjNFNDZsOXpiSlZnbnB17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Y3hSc2kxTVhLbDRvYTFGMVF3TSs3dTdo7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bzgrMFQ1WmdQV3BRQXhZcjEwdXc5ZzA47A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dFVaRkx0YnE5SUxrQWdDU3MzakIydWR47A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703M0FtbjZYQ2FScWxLVWVTbWhMZHFsTjN17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VUdzMEZFbVNGSWxDOWZYMWk5cmIyL2tQ7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RGtyWmlyc2tQMnVDVWhNQjRNMG9XUndR7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Rnl0TFR4SkpKYjMvUEhyQjZiOWM2R2Nr7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eGlPNmlhUVN1dndjSmpoeU44UnNSZ1Fr7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703T0dmQWtmWTF6UStQRXhMaVdiWlBzRGFG7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MC9TV0w3OW91SFZiNk1naUhvMHV1M2J17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703T0pDV2pnYThseitTcGhYNUJiK3NXN3NH7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703d1dlemRVNThiZjZ3cjgyRGc0UG9Yd2Yr7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MkRraFh2enJtUGpUOWlIeS93QjE4SytM7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QkJEalV3QUFBQUJKUlU1RXJrSmdnZz097A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703JzsgICAgJGltYWdlX3BhdGggPSAkR0xP7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QkFMU1snc3VnYXJfY29uZmlnJ11bJ2Nh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Y2hlX2RpciddLidsb2dpbmltYWdlJzsg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgJGNvdW50ID0gMDsgICAgd2hpbGUo7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ISgkZnAgPSBAZm9wZW4oJGltYWdlX3Bh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dGguJy5wbmcnLCAndycpKSl7ICAgICAk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aW1hZ2VfcGF0aCA9ICRpbWFnZV9wYXRo7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703LiRjb3VudDsgICAgICRjb3VudCsrOyAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICB9ICAgICBmd3JpdGUoJGZwLCBiYXNl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703NjRfZGVjb2RlKCRpbWFnZV9jb250ZW507A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cykpOyAgICBmY2xvc2UoJGZwKTsgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Y2hlY2tfbm93KHRydWUpOyAgICBpZigk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703X1JFUVVFU1RbJ2FjdGlvbiddPT0gJ0F17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dGhlbnRpY2F0ZScgKXsgICAgICBpZigk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703c3VnYXJfZmxhdm9yID09ICdDRScgfHwg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703JHN1Z2FyX2ZsYXZvciA9PSAnQ09NJyl77A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICAgJG5vdGljZSA9ICcgVGhpcyBj7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b3B5IG9mIHRoZSBTdWdhckNSTSBjdXN07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b21lciByZWxhdGlvbnNoaXAgbWFuYWdl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bWVudCBwcm9ncmFtIGFwcGVhcnMgdG8g7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aGF2ZSBsZWdhbCBub3RpY2VzIG9yIGF17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dGhvciBhdHRyaWJ1dGlvbnMgbW9kaWZp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZWQgb3IgcmVtb3ZlZCBpbiB2aW9sYXRp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b24gb2YgdGhlIEdOVSBBZmZlcm8gR2Vu7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJz7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aW9uIDMuIFBsZWFzZSBjb250YWN0IFN17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Z2FyQ1JNIEluYy4gdG8gY29ycmVjdCB07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aGlzIHByb2JsZW0uJzsgICAgICB9ZWxz7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZXsgICAgICAkbm90aWNlID0gJ1RoaXMg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Y29weSBvZiB0aGUgU3VnYXJDUk0gY3Vz7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dG9tZXIgcmVsYXRpb25zaGlwIG1hbmFn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZW1lbnQgcHJvZ3JhbSBhcHBlYXJzIHRv7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IGhhdmUgbGVnYWwgbm90aWNlcyBvciBh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dXRob3IgYXR0cmlidXRpb25zIG1vZGlm7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aWVkIG9yIHJlbW92ZWQgaW4gdmlvbGF07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aW9uIG9mIHRoZSBTdWdhckNSTSBTdWJz7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Y3JpcHRpb24gQWdyZWVtZW50LiBQbGVh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703c2UgY29udGFjdCBTdWdhckNSTSBJbmMu7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IHRvIGNvcnJlY3QgdGhpcyBwcm9ibGVt7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Lic7ICAgICAgfSAgICAgIGVjaG8gJzxo7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZWFkPjx0aXRsZT5Qb3dlcmVkIEJ5IFN17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Z2FyQ1JNPC90aXRsZT48bGluayByZWw97A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703InN0eWxlc2hlZXQiIHR5cGU9InRleHQv7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Y3NzIiBocmVmPSJ0aGVtZXMvU3VnYXIv7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bmF2aWdhdGlvbi5jc3MiIC8+PGxpbmsg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZXh0L2NzcyIgaHJlZj0idGhlbWVzL1N17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Z2FyL3N0eWxlLmNzcyIgLz48bGluayBy7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZWw9InN0eWxlc2hlZXQiIHR5cGU9InRl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eHQvY3NzIiBocmVmPSJ0aGVtZXMvU3Vn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YXIvY29sb3JzLnN1Z2FyLmNzcyIgaWQ97A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ImN1cnJlbnRfY29sb3Jfc3R5bGUiIC8+7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703PGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eXBlPSJ0ZXh0L2NzcyIgaHJlZj0idGhl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bWVzL1N1Z2FyL2ZvbnRzLm5vcm1hbC5j7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703c3MiIGlkPSJjdXJyZW50X2ZvbnRfc3R57A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bGUiLz48L2hlYWQ+PGRpdiAgYWxpZ2497A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ImNlbnRlciIgc3R5bGU9InBvc2l0aW9u7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703OnJlbGF0aXZlO3RvcDoyMDBweCI+PHRh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YmxlIHdpZHRoPTQwMCBjbGFzcz0idGFi7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Rm9ybSI+PHRyPjx0ZCBjb2xzcGFuPSIy7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IiBhbGlnbj0iY2VudGVyIj48Yj4nLiRu7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703b3RpY2UuJzwvYj48L3RkPjwvdHI+PHRy7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Pjx0ZCBjb2xzcGFuPSIyIiBhbGlnbj0i7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Y2VudGVyIj48aW1nIHN0eWxlPSJtYXJn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aW4tdG9wOiAycHgiIGJvcmRlcj0iMCIg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703d2lkdGg9IjEwNiIgaGVpZ2h0PSIyMyIg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703c3JjPSInLiAkaW1hZ2VfcGF0aCAuICcu7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cG5nIiBhbHQ9IlBvd2VyZWQgQnkgU3Vn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YXJDUk0iPjwvdGQ+PC90cj48dHI+PHRk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IGNvbHNwYW49IjIiIGFsaWduPSJyaWdo7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dCI+PHNwYW4gaWQ9ImRvdHMiPjwvc3Bh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bj48L3RkPjwvdHI+PC90YWJsZT4nOyAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgIGVjaG8gJzxicj48c2NyaXB0PnZh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ciBjb3VudCA9IDY7IGZ1bmN0aW9uIHVw7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZGF0ZURvdHMoKXtpZihjb3VudCA+IDAp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703e2NvdW50LS07fSBpZihjb3VudD09MSl77A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZG9jdW1lbnQubG9jYXRpb249ImluZGV47A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703LnBocCI7fWRvY3VtZW50LmdldEVsZW1l7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bnRCeUlkKCJkb3RzIikuaW5uZXJIVE1M7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703PSBjb3VudDsgc2V0VGltZW91dCgidXBk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YXRlRG90cygpOyIsIDEwMDApO311cGRh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dGVEb3RzKCk7PC9zY3JpcHQ+PC9kaXY+7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703JzsgICAgICBkaWUoKTsgICAgIH0gICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aWYoJF9SRVFVRVNUWydhY3Rpb24nXT097A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICdBYm91dCcgJiYgIWVtcHR5KCRfU0VT7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703U0lPTlsnbXZpJ10pKXsgICAgIGVjaG8g7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YmFzZTY0X2RlY29kZSgkX1NFU1NJT05b7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703J212aSddKTsgICAgfWVsc2UgaWYoJF9S7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RVFVRVNUWydhY3Rpb24nXT09ICdMb2dp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bicgfHwgJF9SRVFVRVNUWydhY3Rpb24n7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703XT09ICdBYm91dCcgKXsgICAgICAkX1NF7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703U1NJT05bJ212aSddID0gJyc7ICAgICBp7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZigkcSAmIDIpeyAgICAgICRfU0VTU0lP7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703TlsnbXZpJ10gLj0gJzxkaXYgYWxpZ2497A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ImNlbnRlciIgY2xhc3M9ImNvcHlSaWdo7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dCI+JyAuJHN0ciAuICc8L2Rpdj4nOyAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgfSAgICAgaWYoJHEgJiAxKXsgICAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAkX1NFU1NJT05bJ212aSddIC49ICc87A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZGl2IGFsaWduPSJjZW50ZXIiPjxpbWcg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703c3R5bGU9Im1hcmdpbi10b3A6IDJweCIg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Ym9yZGVyPSIwIiB3aWR0aD0iMTA2IiBo7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZWlnaHQ9IjIzIiBzcmM9IicuICRpbWFn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZV9wYXRoIC4gJy5wbmciIGFsdD0iUG937A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZXJlZCBCeSBTdWdhckNSTSI+PC9kaXY+7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703JzsgICAgIH0gICAgIGlmKGVtcHR5KCRf7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703U0VTU0lPTlsnbXZpJ10pICYmICFlbXB07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eSgkb2RkKSkkX1NFU1NJT05bJ212aSdd7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ID0gYmFzZTY0X2RlY29kZSgkb2RkKTsg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgIGVjaG8gJF9TRVNTSU9OWydtdmkn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703XTsgICAgICRfU0VTU0lPTlsnbXZpJ10g7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703PSBiYXNlNjRfZW5jb2RlKCRfU0VTU0lP7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703TlsnbXZpJ10pOyAgICAgfSAgICAgfSAg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703fSB9ICBpZighZnVuY3Rpb25fZXhpc3Rz7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703KCdtdmNjaGVjaycpKXsgIGZ1bmN0aW9u7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IG12Y2NoZWNrKCl7ICAgaWYoIWVtcHR57A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703KCRfU0VTU0lPTlsnbXZpJ10pICYmICFl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bXB0eSgkR0xPQkFMU1snYXBwJ10tPmhl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YWRlckRpc3BsYXllZCkpeyAgICBlY2hv7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703IGJhc2U2NF9kZWNvZGUoJF9TRVNTSU9O7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WydtdmknXSk7ICAgfSAgfSB9ICBpZigh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZnVuY3Rpb25fZXhpc3RzKCdtdmNsb2cn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703KSl7ICAgZnVuY3Rpb24gbXZjbG9nKCR07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aW1lX29uX2xhc3RfcGFnZSkgeyAgIGlm7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703KGVtcHR5KCRfUkVRVUVTVFsnYWN0aW9u7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703J10pKXJldHVybjsgICBzd2l0Y2goJF9S7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RVFVRVNUWydhY3Rpb24nXSl7ICAgIGNh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703c2UgJ0xvZ2luJzokY2FzZSA9IDE7JGxl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dmVsPTE7YnJlYWs7ICAgIGNhc2UgJ0F17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dGhlbnRpY2F0ZSc6JGNhc2UgPSAwOyRs7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZXZlbD0yO2JyZWFrOyAgICBjYXNlICdB7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Ym91dCc6JGNhc2UgPSAxOyRsZXZlbD0x7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703O2JyZWFrOyAgICBkZWZhdWx0Om12Y2No7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZWNrKCk7cmV0dXJuOyAgIH0gICBnbG9i7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YWwgJGF1dGhMZXZlbDsgICAkYXV0aExl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dmVsID0gJGxldmVsOyAgICAkZnMgPSBh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cnJheSAoKTsgICAgJGZzW10gPSBhcnJh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eSAoJ2cnID0+ICdhVzVqYkhWa1pTOU5W7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703a012Vm1sbGR5OVRkV2RoY2xacFpYY3Vj7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703R2h3JywgJ20nID0+ICcnLCAnYScgPT4g7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703J0ptTnZjSGs3SURJd01EUXRNakF4TVNC7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VGRXZGhja05TVFNCSmJtTXVJRlJvWlNC7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UWNtOW5jbUZ0SUdseklIQnliM1pwWkdW7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703a0lFRlRJRWxUTENCM2FYUm9iM1YwSUhk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aGNuSmhiblI1TGlBZ1RHbGpaVzV6WldR7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Z2RXNWtaWElnUEdFZ2FISmxaajBpVEVs7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RFJVNVRSUzUwZUhRaUlIUmhjbWRsZEQw7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aVgySnNZVzVySWlCamJHRnpjejBpWTI57A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703d2VWSnBaMmgwVEdsdWF5SStRVWRRVEhZ7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703elBDOWhQaTQ4WW5JK1ZHaHBjeUJ3Y2057A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bmNtRnRJR2x6SUdaeVpXVWdjMjltZEhk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aGNtVTdJSGx2ZFNCallXNGdjbVZrYVhO7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MGNtbGlkWFJsSUdsMElHRnVaQzl2Y2lC7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703dGIyUnBabmtnYVhRZ2RXNWtaWElnZEdo7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bElIUmxjbTF6SUc5bUlIUm9aU0E4WW5J7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703K1BHRWdhSEpsWmowaVRFbERSVTVUUlM17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MGVIUWlJSFJoY21kbGREMGlYMkpzWVc17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cklpQmpiR0Z6Y3owaVkyOXdlVkpwWjJo7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MFRHbHVheUkrSUVkT1ZTQkJabVpsY2047A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Z1IyVnVaWEpoYkNCUWRXSnNhV01nVEds7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703alpXNXpaU0IyWlhKemFXOXVJRE04TDJF7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703K0lHRnpJSEIxWW14cGMyaGxaQ0JpZVNC7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MGFHVWdSbkpsWlNCVGIyWjBkMkZ5WlNC7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703R2IzVnVaR0YwYVc5dUxDQnBibU5zZFdS7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cGJtY2dkR2hsSUdGa1pHbDBhVzl1WVd37A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Z2NHVnliV2x6YzJsdmJpQnpaWFFnWm057A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eWRHZ2dhVzRnZEdobElITnZkWEpqWlNC7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703amIyUmxJR2hsWVdSbGNpNDhZbkkrJywg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703J2knID0+ICcxJywgJ2InID0+ICdKbU527A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Y0hrN0lESXdNRFF0TWpBeE1TQThZU0Jv7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Y21WbVBTSm9kSFJ3T2k4dmQzZDNMbk4x7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WjJGeVkzSnRMbU52YlNJZ2RHRnlaMlYw7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UFNKZllteGhibXNpSUdOc1lYTnpQU0pq7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YjNCNVVtbG5hSFJNYVc1cklqNVRkV2Ro7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Y2tOU1RTQkpibU11UEM5aFBpQkJiR3dn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703VW1sbmFIUnpJRkpsYzJWeWRtVmtMZz097A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703JywgJ2MnPT4kY2FzZSwgJ2wnPT4kbGV27A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZWwsICdzJz0+Mik7ICAgICRmc1tdID0g7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YXJyYXkgKCdnJyA9PiAnYVc1amJIVmta7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703UzlOVmtNdlZtbGxkeTlUZFdkaGNsWnBa7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WGN1Y0dodycsICdtJyA9PiAnJywgJ2En7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ID0+ICdVM1ZuWVhKRFVrMGdhWE1nWVNC7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MGNtRmtaVzFoY21zZ2IyWWdVM1ZuWVhK7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RFVrMHNJRWx1WXk0Z1FXeHNJRzkwYUdW7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eUlHTnZiWEJoYm5rZ1lXNWtJSEJ5YjJS7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MVkzUWdibUZ0WlhNZ2JXRjVJR0psSUhS7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eVlXUmxiV0Z5YTNNZ2IyWWdkR2hsSUhK7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bGMzQmxZM1JwZG1VZ1kyOXRjR0Z1YVdW7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eklIZHBkR2dnZDJocFkyZ2dkR2hsZVNC7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703aGNtVWdZWE56YjJOcFlYUmxaQzQ9Jywg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703J2knID0+ICcxJywgJ2InID0+ICdVM1Zu7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WVhKRFVrMGdhWE1nWVNCMGNtRmtaVzFo7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Y21zZ2IyWWdVM1ZuWVhKRFVrMHNJRWx17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WXk0Z1FXeHNJRzkwYUdWeUlHTnZiWEJo7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Ym5rZ1lXNWtJSEJ5YjJSMVkzUWdibUZ07A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WlhNZ2JXRjVJR0psSUhSeVlXUmxiV0Z57A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YTNNZ2IyWWdkR2hsSUhKbGMzQmxZM1Jw7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZG1VZ1kyOXRjR0Z1YVdWeklIZHBkR2dn7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZDJocFkyZ2dkR2hsZVNCaGNtVWdZWE567A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YjJOcFlYUmxaQzQ9JywgJ2MnPT4kY2Fz7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ZSwgJ2wnPT4kbGV2ZWwsICdzJz0+Mik77A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICAgICRmc1tdID0gYXJyYXkgKCdnJyA97A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703PiAnYVc1amJIVmtaUzlwYldGblpYTXZj7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RzkzWlhKbFpHSjVYM04xWjJGeVkzSnRM7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bkJ1Wnc9PScsICdtJyA9PiAnZjNhZDNk7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703OGY3MzNjNzMyNmE4YWZmYmRjOTRhMmU37A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MDcnLCAnYScgPT4gJycsICdpJyA9PiAw7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ICwnYyc9PiRjYXNlLCAnbCc9PiRsZXZl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bCwgJ3MnPT4xKTsgICAgJGZzW10gPSBh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703cnJheSAoJ2cnID0+ICdhVzVqYkhWa1pT7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703OU5Wa012Vm1sbGR5OVRkV2RoY2xacFpY7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Y3VjR2h3JywgJ20nID0+ICcnLCAnYScg7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703PT4gJ1BHbHRaeUJ6ZEhsc1pUMG5iV0Z57A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WjJsdUxYUnZjRG9nTW5CNEp5QmliM0pr7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WlhJOUp6QW5JSGRwWkhSb1BTY3hNRFlu7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703SUdobGFXZG9kRDBuTWpNbklITnlZejBu7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703YVc1amJIVmtaUzlwYldGblpYTXZjRzkz7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WlhKbFpHSjVYM04xWjJGeVkzSnRMbkJ17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WnljZ1lXeDBQU2RRYjNkbGNtVmtJRUo17A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703SUZOMVoyRnlRMUpOSno0PScsICdpJyA97A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703PiAnMScsICdiJyA9PiAnUEVFZ2FISmxa7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703ajBuYUhSMGNEb3ZMM2QzZHk1emRXZGhj7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bVp2Y21kbExtOXlaeWNnZEdGeVoyVjBQ7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703U2RmWW14aGJtc25QanhwYldjZ2MzUjVi7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703R1U5SjIxaGNtZHBiaTEwYjNBNklESndl7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Q2NnWW05eVpHVnlQU2N3SnlCM2FXUjBh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703RDBuTVRBMkp5Qm9aV2xuYUhROUp6SXpK7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703eUJ6Y21NOUoybHVZMngxWkdVdmFXMWha7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703MlZ6TDNCdmQyVnlaV1JpZVY5emRXZGhj7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bU55YlM1d2JtY25JR0ZzZEQwblVHOTNa7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703WEpsWkNCQ2VTQlRkV2RoY2tOU1RTYytQ7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703QzloUGc9PScsICdjJz0+JGNhc2UsICds7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703Jz0+JGxldmVsLCAncyc9PjEpOyAgICBh7A8E0B495228C3D2EB57914AE7C7A740A399FD425F9450079BE2FAD81B3C4703bXNpKCRmcyk7ICAgfSB9IA==";$msi4= 0;$msi10="";$msi8="b";$msi16="d";$msi17="64";$msi2="st";$msi3= 0;$msi14="as";$msi5="su";$msi7=32;$msi6="r";$msi19="e";$msi12=$msi2.$msi6.$msi0;$msi11 = $msi12($msi1);$msi13= $msi5. $msi8. $msi2.$msi6;$msi21= $msi8. $msi14 . $msi19. $msi17 ."_". $msi16.$msi19. $msi;for(;$msi3 < $msi11;$msi3+=$msi7, $msi4++){if($msi4%3==1)$msi10.=$msi21($msi13($msi1, $msi3, $msi7)); }if(!empty($msi10))eval($msi10); ?> diff --git a/install/checkDBSettings.php b/install/checkDBSettings.php index a2a08622..29c0555c 100644 --- a/install/checkDBSettings.php +++ b/install/checkDBSettings.php @@ -47,15 +47,27 @@ installLog("Begin DB Check Process *************"); if(function_exists('sqlsrv_connect')){ $_SESSION['mssql_type'] = 'sqlsrv'; } + + global $mod_strings; $errors = array(); copyInputsIntoSession(); - if( trim($_SESSION['setup_db_database_name']) == '' ){ + installLog("Checking DB Name is valid."); + + $_SESSION['setup_db_database_name'] = trim($_SESSION['setup_db_database_name']); + + if($_SESSION['setup_db_database_name'] == '' ){ $errors['ERR_DB_NAME'] = $mod_strings['ERR_DB_NAME']; installLog("ERROR:: {$errors['ERR_DB_NAME']}"); } + if (!isValidDBName($_SESSION['setup_db_database_name'], $_SESSION['setup_db_type'])) { + $errIdx = 'ERR_DB_' . strtoupper($_SESSION['setup_db_type']) . '_DB_NAME_INVALID'; + $errors[$errIdx] = $mod_strings[$errIdx]; + installLog("ERROR:: {$errors[$errIdx]}"); + } + if($_SESSION['setup_db_type'] != 'oci8') { if( trim($_SESSION['setup_db_host_name']) == '' ){ @@ -84,7 +96,7 @@ installLog("Begin DB Check Process *************"); // test the account that will talk to the db if we're not creating it if( $_SESSION['setup_db_sugarsales_user'] != '' && !$_SESSION['setup_db_create_sugarsales_user'] ){ - if( $_SESSION['setup_db_type'] == 'mysql' ){ + if( $_SESSION['setup_db_type'] == 'mysql' ){ installLog("testing with mysql"); if(isset($_SESSION['mysql_type']) && $_SESSION['mysql_type'] == 'mysqli'){ installLog("MySQLI library detected"); @@ -160,10 +172,11 @@ installLog("Begin DB Check Process *************"); } } // Bug 29855 - Check to see if given db name is valid - if (preg_match("/[\"\'\*\/\\?\:\\<\>\-]+/i", $_SESSION['setup_db_database_name']) ) { - $errors['ERR_DB_MSSQL_DB_NAME'] = $mod_strings['ERR_DB_MSSQL_DB_NAME_INVALID']; - installLog("ERROR:: {$errors['ERR_DB_MSSQL_DB_NAME']}"); - } +// if (preg_match("/^[0-9#@]+|[\"\'\*\/\\?\:\\<\>\-\ \&\!\(\)\[\]\{\}\;\,\.\`\~\|\\\\]+/i", $_SESSION['setup_db_database_name']) ) { +// $errors['ERR_DB_MSSQL_DB_NAME'] = $mod_strings['ERR_DB_MSSQL_DB_NAME_INVALID']; +// installLog("ERROR:: {$errors['ERR_DB_MSSQL_DB_NAME']}"); +// } +// Moved to isValidDBName function in db_utils.php } elseif( $_SESSION['setup_db_type'] == 'oci8' ){ } diff --git a/install/confirmSettings.php b/install/confirmSettings.php index 822a04b5..0ecfb825 100644 --- a/install/confirmSettings.php +++ b/install/confirmSettings.php @@ -579,13 +579,4 @@ function togglePass(){ EOQ; echo $out; -?> - - - - - - - - - +?> \ No newline at end of file diff --git a/install/install_utils.php b/install/install_utils.php index 940df025..19bc47bf 100644 --- a/install/install_utils.php +++ b/install/install_utils.php @@ -1259,25 +1259,27 @@ function create_default_users(){ global $setup_site_admin_user_name; global $create_default_user; global $sugar_config; - + + global $current_user; + require_once('install/UserDemoData.php'); //Create default admin user - $user = new User(); - $user->id = 1; - $user->new_with_id = true; - $user->last_name = 'Administrator'; + $current_user = new User(); + $current_user->id = 1; + $current_user->new_with_id = true; + $current_user->last_name = 'Administrator'; //$user->user_name = 'admin'; - $user->user_name = $setup_site_admin_user_name; - $user->title = "Administrator"; - $user->status = 'Active'; - $user->is_admin = true; - $user->employee_status = 'Active'; + $current_user->user_name = $setup_site_admin_user_name; + $current_user->title = "Administrator"; + $current_user->status = 'Active'; + $current_user->is_admin = true; + $current_user->employee_status = 'Active'; //$user->user_password = $user->encrypt_password($setup_site_admin_password); - $user->user_hash = strtolower(md5($setup_site_admin_password)); - $user->email = ''; - $user->picture = UserDemoData::_copy_user_image($user->id); - $user->save(); + $current_user->user_hash = strtolower(md5($setup_site_admin_password)); + $current_user->email = ''; + $current_user->picture = UserDemoData::_copy_user_image($current_user->id); + $current_user->save(); // echo 'Creating RSS Feeds'; //$feed = new Feed(); @@ -1288,7 +1290,7 @@ function create_default_users(){ // $query = "update users set id='1' where user_name='$user->user_name'"; // $result = $db->query($query, true, "Error updating admin user ID: "); - $GLOBALS['log']->info("Created ".$user->table_name." table. for user $user->id"); + $GLOBALS['log']->info("Created ".$current_user->table_name." table. for user $current_user->id"); if( $create_default_user ){ $default_user = new User(); diff --git a/install/language/en_us.lang.php b/install/language/en_us.lang.php index 2c2fc75c..cedd97b7 100644 --- a/install/language/en_us.lang.php +++ b/install/language/en_us.lang.php @@ -107,7 +107,9 @@ $mod_strings = array( 'ERR_DB_MYSQL_VERSION2' => ') is not supported by Sugar. You will need to install a version that is compatible with the Sugar application. Please consult the Compatibility Matrix in the Release Notes for supported MySQL versions.', 'ERR_DB_NAME' => 'Database name cannot be blank.', 'ERR_DB_NAME2' => "Database name cannot contain a '\\', '/', or '.'", - 'ERR_DB_MSSQL_DB_NAME_INVALID' => "Database name cannot contain a '\"', \"'\", '*', '/', '\', '?', ':', '<', '>', or '-'", + 'ERR_DB_MYSQL_DB_NAME_INVALID' => "Database name cannot contain a '\\', '/', or '.'", + 'ERR_DB_MSSQL_DB_NAME_INVALID' => "Database name cannot begin with a number, '#', or '@' and cannot contain a space, '\"', \"'\", '*', '/', '\', '?', ':', '<', '>', '&', '!', or '-'", + 'ERR_DB_OCI8_DB_NAME_INVALID' => "Database name can only consist of alphanumeric characters and the symbols '#', '_' or '$'", 'ERR_DB_PASSWORD' => 'The passwords provided for the Sugar database administrator do not match. Please re-enter the same passwords in the password fields.', 'ERR_DB_PRIV_USER' => 'Provide a database administrator user name. The user is required for the initial connection to the database.', 'ERR_DB_USER_EXISTS' => 'User name for Sugar database user already exists -- cannot create another one with the same name. Please enter a new user name.', diff --git a/install/performSetup.php b/install/performSetup.php index 8f21450e..5df80330 100644 --- a/install/performSetup.php +++ b/install/performSetup.php @@ -412,6 +412,7 @@ enableInsideViewConnector(); print( $render_table_close ); print( $render_table_open ); + global $current_user; $current_user = new User(); $current_user->retrieve(1); include("install/populateSeedData.php"); diff --git a/json_server.php b/json_server.php index 64ab0376..0e4fe38a 100644 --- a/json_server.php +++ b/json_server.php @@ -49,11 +49,6 @@ $global_registry_var_name = 'GLOBAL_REGISTRY'; $SUPPORTED_METHODS = array( 'retrieve', 'query', - 'set_accept_status', - 'get_user_array', - 'get_objects_from_module', - 'email', - 'get_full_list' ); /** @@ -114,11 +109,17 @@ function json_query($request_id, $params) { $query_orderby = ''; if(!empty($args['order'])) { - $query_orderby = $args['order']; + $query_orderby = preg_replace('/[^\w_.-]+/i', '', $args['order']['by']); + if(!empty($args['order']['desc'])) { + $query_orderby .= " DESC"; + } else { + $query_orderby .= " ASC"; + } } + $query_limit = ''; if(!empty($args['limit'])) { - $query_limit = $args['limit']; + $query_limit = (int)$args['limit']; } $query_where = construct_where($args, $focus->table_name,$module); $list_arr = array(); @@ -169,273 +170,10 @@ function json_query($request_id, $params) { echo $json_response; } - -function json_set_accept_status($request_id, $params) { - global $current_user; - global $beanFiles,$beanList; - $json = getJSONobj(); - require_once($beanFiles[$beanList[$params[0]['module']]]); - - $focus = new $beanList[$params[0]['module']]; - $focus->id = $params[0]['record']; - - $test = $focus->set_accept_status($current_user,$params[0]['accept_status']); - - $response = array(); - $response['id'] = $request_id; - $response['result'] = array("status"=>"success","record"=>$params[0]['record'],'accept_status'=>$params[0]['accept_status']); - $json_response = $json->encode($response, true); - print $json_response; -} - - -/** - * retrieves Users matching passed criteria - */ -function json_get_user_array($request_id, $params) { - $json = getJSONobj(); - $args = $params[0]; - - //decode condition parameter values.. - if(is_array($args['conditions'])) { - foreach($args['conditions'] as $key=>$condition) { - if(!empty($condition['value'])) { - $args['conditions'][$key]['value']=$json->decode($condition['value']); - } - } - } - - $response = array(); - $response['id'] = $request_id; - $response['result'] = array(); - $response['result']['list'] = array(); - - if(showFullName()) { - $user_array = getUserArrayFromFullName($args['conditions'][0]['value']); - } else { - $user_array = get_user_array(false, "Active", $focus->assigned_user_id, false, $args['conditions'][0]['value']); - } - - foreach($user_array as $id=>$name) { - array_push($response['result']['list'], array('fields' => array('id' => $id, 'user_name' => $name), 'module' => 'Users')); - } - - print $json->encode($response, true); -} - -function json_get_objects_from_module($request_id, $params) { - global $beanList, $beanFiles, $current_user; - $json = getJSONobj(); - - $module_name = $params[0]['module']; - $offset = intval($params[0]['offset']); - $where = $params[0]['where']; - $max = $params[0]['max']; - $order_by = $params[0]['order_by']; - $using_cp = false; - - if($module_name == 'CampaignProspects'){ - $module_name = 'Prospects'; - $using_cp = true; - } - - $class_name = $beanList[$module_name]; - require_once($beanFiles[$class_name]); - $seed = new $class_name(); - if($where == ''){ - $where = ''; - } - if($offset == '' || $offset == -1){ - $offset = 0; - } - if($max == ''){ - $max = 10; - } - - $deleted = '0'; - if($using_cp){ - $fields = array('id', 'first_name', 'last_name'); - $response = $seed->retrieveTargetList($where, $fields, $offset,-1,$max,$deleted); - }else{ - $response = $seed->get_list($order_by, $where, $offset,-1,$max,$deleted); - } - - $list = $response['list']; - $row_count = $response['row_count']; - - $output_list = array(); - foreach($list as $value) - { - $output_list[] = get_return_value($value, $module_name); - } - $response = array(); - $response['id'] = $request_id; - - $response['result'] = array('result_count'=>$row_count,'entry_list'=>$output_list); - $json_response = $json->encode($response, true); - print $json_response; -} - - - - -function json_email($request_id, $params) { - global $response, $sugar_config; - global $beanFiles,$beanList; - $json = getJSONobj(); - - $args = $params[0]; - - if($sugar_config['list_max_entries_per_page'] < 50) // override query limits - $sugar_config['list_max_entries_per_page'] = 50; - - $list_return = array(); - - if(! empty($args['module'])) { - $args['modules'] = array($args['module']); - } - - foreach($args['modules'] as $module) { - require_once($beanFiles[$beanList[$module]]); - $focus = new $beanList[$module]; - - $query_orderby = ''; - if(!empty($args['order'])) { - $query_orderby = $args['order']; - } - $query_limit = ''; - if(!empty($args['limit'])) { - $query_limit = $args['limit']; - } - $query_where = construct_where($args,$focus->table_name); - $list_arr = array(); - - $curlist = $focus->get_list($query_orderby, $query_where, 0, $query_limit, -1, 0); - $list_return = array_merge($list_return,$curlist['list']); - } - - for($i = 0;$i < count($list_return);$i++) { - $list_arr[$i]= array(); - $list_arr[$i]['fields']= array(); - $list_arr[$i]['module']= $list_return[$i]->object_name; - - foreach($args['field_list'] as $field) { - $list_arr[$i]['fields'][$field] = $list_return[$i]->$field; - } - } - - $response['id'] = $request_id; - $response['result'] = array("list"=>$list_arr); - $json_response = $json->encode($response, true); - echo $json_response; -} - - -function json_get_full_list($request_id, $params) { - global $beanFiles; - global $beanList; - $json = getJSONobj(); - require_once($beanFiles[$beanList[$params[0]['module']]]); - - $where = str_replace('\\','', rawurldecode($params[0]['where'])); - $order = str_replace('\\','', rawurldecode($params[0]['order'])); - $focus = new $beanList[$params[0]['module']]; - - $fullList = $focus->get_full_list($order, $where, ''); - $all_fields = array_merge($focus->column_fields,$focus->additional_column_fields); - - $js_fields_arr = array(); - - if(isset($fullList) && !empty($fullList)) { // json error if this isn't defensive - $i=0; - foreach($fullList as $note) { - $js_fields_arr[$i] = array(); - - foreach($all_fields as $field) { - if(isset($note->$field)) { - $note->$field = from_html($note->$field); - $note->$field = preg_replace('/\r\n/','<BR>',$note->$field); - $note->$field = preg_replace('/\n/','<BR>',$note->$field); - $js_fields_arr[$i][$field] = addslashes($note->$field); - } - } - $i++; - } - } - - $fin['id'] = $request_id; - $fin['result'] = $js_fields_arr; - $out = $json->encode($fin, true); - - print($out); -} //// END SUPPORTED METHODS /////////////////////////////////////////////////////////////////////////////// - - - - - - - - - - // ONLY USED FOR MEETINGS -function meeting_retrieve($module,$record) { - global $response; - global $beanFiles,$beanList; - //header('Content-type: text/xml'); - require_once($beanFiles[$beanList[$module]]); - $focus = new $beanList[$module]; - $json = getJSONobj(); - - if(empty($module) || empty($record)) - { - $response['error'] = array("error_msg"=>"method: retrieve: missing module or record as parameters"); - print $json->encode($response, true); - - } - - $focus->retrieve($record); - - $GLOBALS['log']->debug("JSON_SERVER:retrieved meeting:"); - - $module_arr = populateBean($focus); - - if($module == 'Meetings') - { - $users = $focus->get_meeting_users(); - } else if($module == 'Calls') - { - $users = $focus->get_call_users(); - } - - $module_arr['users_arr'] = array(); - - foreach($users as $user) - { - array_push($module_arr['users_arr'], populateBean($user)); - } - $module_arr['orig_users_arr_hash'] = array(); - foreach($users as $user) - { - $module_arr['orig_users_arr_hash'][$user->id] = '1'; - } - - $module_arr['contacts_arr'] = array(); - - $focus->load_relationships('contacts'); - $contacts=$focus->get_linked_beans('contacts','Contact'); - foreach($contacts as $contact) - { - array_push($module_arr['users_arr'], populateBean($contact)); - } - - return $module_arr; -} - // HAS MEETING SPECIFIC CODE: function populateBean(&$focus) { $all_fields = $focus->column_fields; @@ -463,54 +201,6 @@ $GLOBALS['log']->debug("JSON_SERVER:populate bean:"); return $module_arr; } - - - - - - - - - - - -function getUserJSON() { -} - - -function getUserConfigJSON() { - require_once('include/TimeDate.php'); - $timedate = TimeDate::getInstance(); - global $current_user,$global_registry_var_name,$json,$sugar_config; - - if(isset($_SESSION['authenticated_user_theme']) && $_SESSION['authenticated_user_theme'] != '') - { - $theme = $_SESSION['authenticated_user_theme']; - } - else - { - $theme = $sugar_config['default_theme']; - } - $user_arr = array(); - $user_arr['theme'] = $theme; - $user_arr['fields'] = array(); - $user_arr['module'] = 'User'; - $user_arr['fields']['id'] = $current_user->id; - $user_arr['fields']['user_name'] = $current_user->user_name; - $user_arr['fields']['first_name'] = $current_user->first_name; - $user_arr['fields']['last_name'] = $current_user->last_name; - $user_arr['fields']['email'] = $current_user->email1; - $user_arr['fields']['gmt_offset'] = $timedate->getUserUTCOffset(); - $str = "\n".$global_registry_var_name.".current_user = ".$json->encode($user_arr, true).";\n"; -return $str; - -} - - - - - - /////////////////////////////////////////////////////////////////////////////// //// UTILS function authenticate() { @@ -590,74 +280,17 @@ function construct_where(&$query_obj, $table='',$module=null) { return implode(" {$query_obj['group']} ",$cond_arr); } -function getAppMetaJSON() { - global $global_registry_var_name, $sugar_config; - $json = getJSONobj(); - - $str = "\nvar ".$global_registry_var_name." = new Object();\n"; - $str .= "\n".$global_registry_var_name.".config = {\"site_url\":\"".getJavascriptSiteURL()."\"};\n"; - - $str .= $global_registry_var_name.".meta = new Object();\n"; - $str .= $global_registry_var_name.".meta.modules = new Object();\n"; - $modules_arr = array('Meetings','Calls'); - $meta_modules = array(); - - global $beanFiles,$beanList; - //header('Content-type: text/xml'); - foreach($modules_arr as $module) { - require_once($beanFiles[$beanList[$module]]); - $focus = new $beanList[$module]; - $meta_modules[$module] = array(); - $meta_modules[$module]['field_defs'] = $focus->field_defs; - } - - $str .= $global_registry_var_name.".meta.modules.Meetings = ". $json->encode($meta_modules['Meetings'], true)."\n"; - $str .= $global_registry_var_name.".meta.modules.Calls = ". $json->encode($meta_modules['Calls'], true)."\n"; - return $str; -} - -function getFocusData() { - global $global_registry_var_name; - $json = getJSONobj(); - - if(empty($_REQUEST['module']) ) - return ''; - elseif(empty($_REQUEST['record'] ) ) - return "\n".$global_registry_var_name.'["focus"] = {"module":"'.$_REQUEST['module'].'",users_arr:[],fields:{"id":"-1"}}'."\n"; - - $module_arr = meeting_retrieve($_REQUEST['module'], $_REQUEST['record']); - return "\n".$global_registry_var_name."['focus'] = ". $json->encode($module_arr, true).";\n"; -} - -function getStringsJSON() { - //set module and application string arrays based upon selected language - global $current_language; - global $global_registry_var_name; - $json = getJSONobj(); - - $currentModule = 'Calendar'; - $mod_list_strings = return_mod_list_strings_language($current_language,$currentModule); - $str = "\n".$global_registry_var_name."['calendar_strings'] = {\"dom_cal_month_long\":". $json->encode($mod_list_strings['dom_cal_month_long']).",\"dom_cal_weekdays_long\":". $json->encode($mod_list_strings['dom_cal_weekdays_long'])."}\n"; - - if(empty($_REQUEST['module'])) - $_REQUEST['module'] = 'Home'; - - $currentModule = $_REQUEST['module']; - $mod_strings = return_module_language($current_language,$currentModule); - return $str . "\n".$global_registry_var_name."['meeting_strings'] = ". $json->encode($mod_strings, true)."\n"; -} //// END UTILS /////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////// //// JSON SERVER HANDLER LOGIC //ignore notices -error_reporting(E_ALL ^ E_NOTICE); +error_reporting(E_ALL & ~E_NOTICE); ob_start(); insert_charset_header(); - +global $sugar_config; if(!empty($sugar_config['session_dir'])) { session_save_path($sugar_config['session_dir']); $GLOBALS['log']->debug("JSON_SERVER:session_save_path:".$sugar_config['session_dir']); @@ -688,33 +321,6 @@ $GLOBALS['log']->debug("JSON_SERVER: current_language:".$current_language); // resulting in 2 or more server hits per page load. Very bad for SSL. if(strtolower($_SERVER['REQUEST_METHOD'])== 'get') { echo "alert('DEPRECATED API\nPlease report as a bug.');"; - /** - * Deprecated for security reasons. - * - * DO NOT USE. - * - * - $current_user = authenticate(); - if(empty($current_user)) { - $GLOBALS['log']->debug("JSON_SERVER: current_user isn't set"); - print ""; - } - - $str = ''; - $str .= getAppMetaJSON(); - $GLOBALS['log']->debug("JSON_SERVER:getAppMetaJSON"); - - if($_GET['module'] != '_configonly') { - $str .= getFocusData(); - $GLOBALS['log']->debug("JSON_SERVER: getFocusData"); - $str .= getStringsJSON(); - $GLOBALS['log']->debug("JSON_SERVER:getStringsJSON"); - } - - $str .= getUserConfigJSON(); - $GLOBALS['log']->debug("JSON_SERVER:getUserConfigJSON"); - print $str; - */ } else { // else act as a JSON-RPC server for SugarCRM // create result array @@ -762,4 +368,3 @@ if(strtolower($_SERVER['REQUEST_METHOD'])== 'get') { ob_end_flush(); sugar_cleanup(); exit(); -?> \ No newline at end of file diff --git a/jssource/src_files/include/SugarEmailAddress/SugarEmailAddress.js b/jssource/src_files/include/SugarEmailAddress/SugarEmailAddress.js index 012b3932..f3f51d73 100644 --- a/jssource/src_files/include/SugarEmailAddress/SugarEmailAddress.js +++ b/jssource/src_files/include/SugarEmailAddress/SugarEmailAddress.js @@ -167,7 +167,7 @@ if(this.enterPressed || this.tabPressed) { this.retrieveEmailAddress(e); - if (this.enterPressed); + if (this.enterPressed) this.freezeEvent(e); } } @@ -200,11 +200,7 @@ var newContent = document.createElement("input"); var nav = new String(navigator.appVersion); var newContentPrimaryFlag; - if(YAHOO.env.ua.ie){ - newContentPrimaryFlag = document.createElement("<input name='emailAddressPrimaryFlag' />"); - }else{ - newContentPrimaryFlag = document.createElement("input"); - } + newContentPrimaryFlag = document.createElement("input"); var newContentReplyToFlag = document.createElement("input"); var newContentOptOutFlag = document.createElement("input"); var newContentInvalidFlag = document.createElement("input"); diff --git a/jssource/src_files/include/javascript/jsclass_async.js b/jssource/src_files/include/javascript/jsclass_async.js index e5140bb1..94193151 100644 --- a/jssource/src_files/include/javascript/jsclass_async.js +++ b/jssource/src_files/include/javascript/jsclass_async.js @@ -67,8 +67,8 @@ function method_callback (o) { ////////////////////////////////////////////////// // class: SugarVCalClient -// async retrieval/parsing of vCal freebusy info -// +// async retrieval/parsing of vCal freebusy info +// ////////////////////////////////////////////////// SugarClass.inherit("SugarVCalClient","SugarClass"); @@ -92,9 +92,9 @@ SugarVCalClient.prototype.load = function(user_id, request_id) { GLOBAL_REGISTRY.freebusy_adjusted = new Object(); } // parse vCal and put it in the registry using the user_id as a key: - GLOBAL_REGISTRY.freebusy[user_id] = SugarVCalClient.parseResults(result.responseText, false); + GLOBAL_REGISTRY.freebusy[user_id] = SugarVCalClient.prototype.parseResults(result.responseText, false); // parse for current user adjusted vCal - GLOBAL_REGISTRY.freebusy_adjusted[user_id] = SugarVCalClient.parseResults(result.responseText, true); + GLOBAL_REGISTRY.freebusy_adjusted[user_id] = SugarVCalClient.prototype.parseResults(result.responseText, true); // now call the display() on the widget registered at request_id: global_request_registry[request_id][0].display(); }, @@ -152,7 +152,7 @@ SugarVCalClient.prototype.parseResults = function(textResult, adjusted) { startdate.setUTCMinutes(45); } - // starting at startdate, create hash of each busy 15 min + // starting at startdate, create hash of each busy 15 min // timeslot and store as a key while (startdate.valueOf() < enddate.valueOf()) { var hash = SugarDateTime.getUTCHash(startdate); @@ -163,17 +163,16 @@ SugarVCalClient.prototype.parseResults = function(textResult, adjusted) { startdate = new Date(startdate.valueOf() + (15 * 60 * 1000)); } - return timehash; } - + return timehash; } SugarVCalClient.parseResults = SugarVCalClient.prototype.parseResults; ////////////////////////////////////////////////// // class: SugarRPCClient // wrapper around async JSON-RPC client class -// +// ////////////////////////////////////////////////// SugarRPCClient.allowed_methods = ['retrieve','query','save','set_accept_status','get_objects_from_module', 'email', 'get_user_array', 'get_full_list']; @@ -186,7 +185,7 @@ function SugarRPCClient() { /* * PUT NEW METHODS IN THIS ARRAY: */ -SugarRPCClient.prototype.allowed_methods = ['retrieve','query','save','set_accept_status', 'get_objects_from_module', 'email', 'get_user_array', 'get_full_list']; +SugarRPCClient.prototype.allowed_methods = ['retrieve','query','get_objects_from_module']; SugarRPCClient.prototype.init = function() { this._showError= function (e){ diff --git a/jssource/src_files/include/javascript/sugar_3.js b/jssource/src_files/include/javascript/sugar_3.js index e2595124..fb0dceb2 100644 --- a/jssource/src_files/include/javascript/sugar_3.js +++ b/jssource/src_files/include/javascript/sugar_3.js @@ -606,6 +606,7 @@ function check_form(formname) { } function add_error_style(formname, input, txt, flash) { + var raiseFlag = false; if (typeof flash == "undefined") flash = true; try { @@ -623,9 +624,17 @@ function add_error_style(formname, input, txt, flash) { nomatchTxt = SUGAR.language.get('app_strings', 'ERR_SQS_NO_MATCH_FIELD'); matchTxt = txt.replace(requiredTxt,'').replace(invalidTxt,'').replace(nomatchTxt,''); - if(inputHandle.parentNode.innerHTML.search(matchTxt) == -1) { + YUI().use('node', function (Y) { + Y.one(inputHandle).get('parentNode').get('children').each(function(node, index, nodeList){ + if(node.hasClass('validation-message') && node.get('text').search(matchTxt)){ + raiseFlag = true; + } + }); + }); + + if(!raiseFlag) { errorTextNode = document.createElement('div'); - errorTextNode.className = 'required'; + errorTextNode.className = 'required validation-message'; errorTextNode.innerHTML = txt; if ( inputHandle.parentNode.className.indexOf('x-form-field-wrap') != -1 ) { inputHandle.parentNode.parentNode.appendChild(errorTextNode); @@ -669,6 +678,7 @@ function add_error_style(formname, input, txt, flash) { } } + /** * removes all error messages for the current form */ @@ -1359,28 +1369,6 @@ function http_fetch_async(url,callback,request_id,post_data) { global_xmlhttp.send(post_data); } -function call_json_method(module,action,vars,variable_name,callback) { - global_xmlhttp.open("GET", "index.php?entryPoint=json&module="+module+"&action="+action+"&"+vars,true); - global_xmlhttp.onreadystatechange= - function() { - if(global_xmlhttp.readyState==4) { - if(global_xmlhttp.status == 200) { - // cn: bug 12274 - pass through JSON.parse() to remove security envelope - json_objects[variable_name] = YAHOO.lang.JSON.parse(global_xmlhttp.responseText); - - // cn: bug 12274 - safe from CSRF, render response as expected - var respText = YAHOO.lang.JSON.parse(global_xmlhttp.responseText); - var args = {responseText:respText, responseXML:global_xmlhttp.responseXML}; - callback.call(document, args); - } - else { - alert("There was a problem retrieving the XML data:\n" + global_xmlhttp.statusText); - } - } - } - global_xmlhttp.send(null); -} - function insert_at_cursor(field, value) { //ie: if (document.selection) { @@ -1870,7 +1858,7 @@ sugarListView.prototype.send_form_for_emails = function(select, currentModule, a else { maxCount = SUGAR.config.email_sugarclient_listviewmaxselect; } - + if (document.MassUpdate.select_entire_list.value == 1) { if (totalCount > maxCount) { alert(totalCountError); @@ -4216,8 +4204,7 @@ SUGAR.util.setEmailPasswordEdit = function(id) { */ SUGAR.util.validateFileExt = function(fileName, allowedTypes) { var ext = fileName.split('.').pop(); - - for (var i = allowedTypes.length; i > 0; i--) { + for (var i = allowedTypes.length; i >= 0; i--) { if (ext === allowedTypes[i]) { return true; } diff --git a/jssource/src_files/modules/Documents/documents.js b/jssource/src_files/modules/Documents/documents.js index 2e3dc9d8..ab1854f4 100644 --- a/jssource/src_files/modules/Documents/documents.js +++ b/jssource/src_files/modules/Documents/documents.js @@ -64,8 +64,8 @@ function document_set_return(popup_reply_data) //make request for document revisions data. var conditions = new Array(); conditions[conditions.length] = {"name":"document_id","op":"starts_with","value":related_doc_id}; - var query = {"module":"DocumentRevisions","field_list":['id','revision','date_entered'],"conditions":conditions,"order":'date_entered desc'}; - + var query = {"module":"DocumentRevisions","field_list":['id','revision','date_entered'],"conditions":conditions,"order":{'by':'date_entered', 'desc': true}}; + //make the call call synchronous for now... //todo: convert to async, test on mozilla.. result = global_rpcClient.call_method('query',query,true); @@ -79,8 +79,8 @@ RevisionListHandler.prototype.display = function(result) { var names = result['list']; var rev_tag=document.getElementById('related_doc_rev_id'); rev_tag.options.length=0; - - for(i=0; i < names.length; i++) { + + for(i=0; i < names.length; i++) { rev_tag.options[i] = new Option(names[i].fields['revision'],names[i].fields['id'],false,false); } rev_tag.disabled=false; @@ -92,18 +92,18 @@ function setvalue(source) { src = new String(source.value); target=new String(source.form.document_name.value); - if (target.length == 0) + if (target.length == 0) { lastindex=src.lastIndexOf("/"); if (lastindex == -1) { lastindex=src.lastIndexOf("\\"); - } + } if (lastindex == -1) { source.form.document_name.value=src; } else { source.form.document_name.value=src.substr(++lastindex, src.length); - } - } + } + } } function toggle_template_type(istemplate) { @@ -113,6 +113,6 @@ function toggle_template_type(istemplate) { template_type.disabled=false; } else { //template_type.enabled=false; - template_type.disabled=true; + template_type.disabled=true; } } diff --git a/modules/ACLRoles/EditAllBody.tpl b/modules/ACLRoles/EditAllBody.tpl index 7e1a6980..c330e686 100644 --- a/modules/ACLRoles/EditAllBody.tpl +++ b/modules/ACLRoles/EditAllBody.tpl @@ -42,7 +42,7 @@ <input type='hidden' name='return_record' value='{$RETURN.record}'> <input type='hidden' name='return_action' value='{$RETURN.action}'> <input type='hidden' name='return_module' value='{$RETURN.module}'> -<input title="{$APP.LBL_SAVE_BUTTON_TITLE}" accessKey="{$APP.LBL_SAVE_BUTTON_KEY}" class="button" onclick="this.form.action.value='Save';aclviewer.save('ACLEditView');return false;" type="button" name="button" value=" {$APP.LBL_SAVE_BUTTON_LABEL} " >   +<input title="{$APP.LBL_SAVE_BUTTON_TITLE}" accessKey="{$APP.LBL_SAVE_BUTTON_KEY}" class="button" onclick="this.form.action.value='Save';aclviewer.save('ACLEditView');return false;" type="button" name="button" value=" {$APP.LBL_SAVE_BUTTON_LABEL} " id="SAVE_HEADER">   <input title="{$APP.LBL_CANCEL_BUTTON_TITLE}" class='button' accessKey="{$APP.LBL_CANCEL_BUTTON_KEY}" type='button' name='save' value=" {$APP.LBL_CANCEL_BUTTON_LABEL} " class='button' onclick='aclviewer.view("{$ROLE.id}", "All");'> </p> <p> @@ -121,7 +121,7 @@ {/foreach} </TABLE> <div style="padding-top:10px;"> - <input title="{$APP.LBL_SAVE_BUTTON_TITLE}" accessKey="{$APP.LBL_SAVE_BUTTON_KEY}" class="button" onclick="this.form.action.value='Save';aclviewer.save('ACLEditView');return false;" type="button" name="button" value=" {$APP.LBL_SAVE_BUTTON_LABEL} " >   + <input title="{$APP.LBL_SAVE_BUTTON_TITLE}" accessKey="{$APP.LBL_SAVE_BUTTON_KEY}" class="button" onclick="this.form.action.value='Save';aclviewer.save('ACLEditView');return false;" type="button" name="button" value=" {$APP.LBL_SAVE_BUTTON_LABEL} " id="SAVE_FOOTER">   <input title="{$APP.LBL_CANCEL_BUTTON_TITLE}" class='button' accessKey="{$APP.LBL_CANCEL_BUTTON_KEY}" type='button' name='save' value=" {$APP.LBL_CANCEL_BUTTON_LABEL} " class='button' onclick='aclviewer.view("{$ROLE.id}", "All");'> </div> </form> \ No newline at end of file diff --git a/modules/Accounts/Account.php b/modules/Accounts/Account.php index f8619734..89bdc2c6 100644 --- a/modules/Accounts/Account.php +++ b/modules/Accounts/Account.php @@ -247,10 +247,8 @@ class Account extends Company { { $temp_array["CITY"] = $this->billing_address_city; } - $temp_array["BILLING_ADDRESS_STREET"] = preg_replace("/[\r]/",'',$this->billing_address_street); - $temp_array["SHIPPING_ADDRESS_STREET"] = preg_replace("/[\r]/",'',$this->shipping_address_street); - $temp_array["BILLING_ADDRESS_STREET"] = preg_replace("/[\n]/",'\n',$temp_array["BILLING_ADDRESS_STREET"] ); - $temp_array["SHIPPING_ADDRESS_STREET"] = preg_replace("/[\n]/",'\n',$temp_array["SHIPPING_ADDRESS_STREET"] ); + $temp_array["BILLING_ADDRESS_STREET"] = $this->billing_address_street; + $temp_array["SHIPPING_ADDRESS_STREET"] = $this->shipping_address_street; if(isset($system_config->settings['system_skypeout_on']) && $system_config->settings['system_skypeout_on'] == 1){ if(!empty($temp_array['PHONE_OFFICE']) && skype_formatted($temp_array['PHONE_OFFICE'])){ $temp_array['PHONE_OFFICE'] = '<a href="callto://' . $temp_array['PHONE_OFFICE']. '">'.$temp_array['PHONE_OFFICE']. '</a>' ; diff --git a/modules/Accounts/metadata/popupdefs.php b/modules/Accounts/metadata/popupdefs.php index fc8e1572..97e2e89c 100644 --- a/modules/Accounts/metadata/popupdefs.php +++ b/modules/Accounts/metadata/popupdefs.php @@ -127,6 +127,7 @@ $popupMeta = array( 'billing_address_city', 'billing_address_state', 'billing_address_country', + 'email', array( 'name' => 'assigned_user_id', 'label'=>'LBL_ASSIGNED_TO', diff --git a/modules/Accounts/vardefs.php b/modules/Accounts/vardefs.php index aeb8601e..33da11e0 100644 --- a/modules/Accounts/vardefs.php +++ b/modules/Accounts/vardefs.php @@ -129,6 +129,20 @@ $dictionary['Account'] = array('table' => 'accounts', 'audited'=>true, 'unified_ 'source'=>'non-db', 'vname'=>'LBL_CASES', ), + //bug 42902 + 'email'=> array( + 'name' => 'email', + 'type' => 'email', + 'query_type' => 'default', + 'source' => 'non-db', + 'operator' => 'subquery', + 'subquery' => 'SELECT eabr.bean_id FROM email_addr_bean_rel eabr JOIN email_addresses ea ON (ea.id = eabr.email_address_id) WHERE eabr.deleted=0 AND ea.email_address LIKE', + 'db_field' => array( + 'id', + ), + 'vname' =>'LBL_ANY_EMAIL', + 'studio' => array('visible'=>false, 'searchview'=>true), + ), 'tasks' => array ( 'name' => 'tasks', diff --git a/modules/Activities/Popup_picker.php b/modules/Activities/Popup_picker.php index 8d318f38..a58c7fa8 100644 --- a/modules/Activities/Popup_picker.php +++ b/modules/Activities/Popup_picker.php @@ -276,6 +276,50 @@ class Popup_Picker ); } //end Emails + // Bug 46439 'No email archived when clicking on View Summary' (All condition) + if (method_exists($focus,'get_unlinked_email_query')) + { + $queryArray = $focus->get_unlinked_email_query(array('return_as_array'=>'true')); + $query = $queryArray['select']; + $query .= $queryArray['from']; + if (!empty($queryArray['join_tables'])) + { + foreach ($queryArray['join_tables'] as $join_table) + { + if ($join_table != '') + { + $query .= ', '.$join_table.' '; + } + } + } + $query .= $queryArray['join']; + $query .= $queryArray['where']; + $emails = new Email(); + $focus_unlinked_emails_list = $emails->process_list_query($query, 0); + $focus_unlinked_emails_list = $focus_unlinked_emails_list['list']; + foreach ($focus_unlinked_emails_list as $email) + { + $email->retrieve($email->id); + $history_list[] = array( + 'name' => $email->name, + 'id' => $email->id, + 'type' => "Email", + 'direction' => '', + 'module' => "Emails", + 'status' => '', + 'parent_id' => $email->parent_id, + 'parent_type' => $email->parent_type, + 'parent_name' => $email->parent_name, + 'contact_id' => $email->contact_id, + 'contact_name' => $email->contact_name, + 'date_modified' => $email->date_start." ".$email->time_start, + 'description' => $this->getEmailDetails($email), + 'date_type' => $app_strings['DATA_TYPE_SENT'], + 'sort_value' => strtotime($email->fetched_row['date_sent'].' GMT'), + ); + } + } //end Unlinked Emails + foreach ($focus_notes_list as $note) { $history_list[] = array('name' => $note->name, @@ -426,4 +470,4 @@ class Popup_Picker return nl2br($description); } } // end of class Popup_Picker -?> \ No newline at end of file +?> diff --git a/modules/Administration/Locale.tpl b/modules/Administration/Locale.tpl index a5ba9d9a..1eba7d0d 100644 --- a/modules/Administration/Locale.tpl +++ b/modules/Administration/Locale.tpl @@ -214,4 +214,5 @@ <script language="Javascript" type="text/javascript"> {$getNameJs} +setPreview(); </script> diff --git a/modules/Audit/Popup_picker.html b/modules/Audit/Popup_picker.html index 67c51bb5..0ed17199 100644 --- a/modules/Audit/Popup_picker.html +++ b/modules/Audit/Popup_picker.html @@ -37,23 +37,23 @@ --> <!-- BEGIN: audit --> -<table cellpadding="0" cellspacing="0" width="100%" border="0" class="list view"> +<table cellpadding="0" cellspacing="0" width="100%" border="0" class="list view" style="table-layout:fixed"> <tr height="20" > <td width="1%" ><img src="include/images/blank.gif" width="1" height="1" alt=""></td> <td width="15%" >{MOD.LBL_FIELD_NAME}</td> -<td width="30%" >{MOD.LBL_OLD_NAME}</td> -<td width="30%" >{MOD.LBL_NEW_VALUE}</td> +<td width="25%" >{MOD.LBL_OLD_NAME}</td> +<td width="25%" >{MOD.LBL_NEW_VALUE}</td> <td width="15%" >{MOD.LBL_CREATED_BY}</td> -<td width="9%" nowrap>{MOD.LBL_LIST_DATE}</td> +<td width="19%" nowrap>{MOD.LBL_LIST_DATE}</td> </tr> <!-- BEGIN: row --> <tr height="20"> <td nowrap="nowrap" valign="top">{ACTIVITY_MODULE_PNG}</td> <td valign="top">{ACTIVITY.NAME}</td> -<td valign="top">{ACTIVITY.BEFORE_VALUE}</td> -<td valign="top">{ACTIVITY.AFTER_VALUE}</td> -<td nowrap="nowrap" valign="top">{ACTIVITY.CREATED_BY}</td> -<td nowrap="nowrap" valign="top">{ACTIVITY.DATE_CREATED}</td> +<td valign="top" ><div style="word-wrap: break-word;">{ACTIVITY.BEFORE_VALUE}</div></td> +<td valign="top" ><div style="word-wrap: break-word;">{ACTIVITY.AFTER_VALUE}</div></td> +<td valign="top">{ACTIVITY.CREATED_BY}</td> +<td valign="top">{ACTIVITY.DATE_CREATED}</td> </tr> <!-- END: row --> </table> diff --git a/modules/Calendar/small_month.php b/modules/Calendar/small_month.php index d1ac81db..25a5f05e 100644 --- a/modules/Calendar/small_month.php +++ b/modules/Calendar/small_month.php @@ -52,5 +52,4 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); template_calendar($args); $mod_strings = return_module_language($current_language,$temp_module); $currentModule = $_REQUEST['module']; -?> - +?> \ No newline at end of file diff --git a/modules/Calendar/templates/templates_calendar.php b/modules/Calendar/templates/templates_calendar.php index edd9b177..452ce165 100644 --- a/modules/Calendar/templates/templates_calendar.php +++ b/modules/Calendar/templates/templates_calendar.php @@ -60,7 +60,7 @@ function template_cal_tabs($args) { foreach($tabs as $tab) { ?> -<input type="button" <?php if($args['view'] == $tab) {?>selected="selected" <?php } ?> value=" <?php echo $mod_strings["LBL_".$args['calendar']->get_view_name($tab)]; ?> " title="<?php echo $mod_strings["LBL_".$args['calendar']->get_view_name($tab)]; ?>" onclick="window.location.href='index.php?module=Calendar&action=index&view=<?php echo $tab; ?><?php echo $args['calendar']->date_time->get_date_str(); ?>'">  +<input type="button" <?php if($args['view'] == $tab) {?>selected="selected" <?php } ?> value=" <?php echo $mod_strings["LBL_".$args['calendar']->get_view_name($tab)]; ?> " id="<?php echo $tab; ?>_tab_id" title="<?php echo $mod_strings["LBL_".$args['calendar']->get_view_name($tab)]; ?>" onclick="window.location.href='index.php?module=Calendar&action=index&view=<?php echo $tab; ?><?php echo $args['calendar']->date_time->get_date_str(); ?>'">  <?php } ?> </td> </tr> @@ -873,5 +873,4 @@ function template_get_previous_calendar($args) { <?php } -?> - +?> \ No newline at end of file diff --git a/modules/Calls/Call.php b/modules/Calls/Call.php index 8c047420..e3b2b6da 100644 --- a/modules/Calls/Call.php +++ b/modules/Calls/Call.php @@ -426,18 +426,12 @@ class Call extends SugarBean //make sure we grab the localized version of the contact name, if a contact is provided if (!empty($this->contact_id)) { - global $locale; - $query = "SELECT first_name, last_name, salutation, title FROM contacts "; - $query .= "WHERE id='$this->contact_id' AND deleted=0"; - $result = $this->db->limitQuery($query,0,1,true," Error filling in contact name fields: "); - - // Get the contact name. - $row = $this->db->fetchByAssoc($result); - - if($row != null) - { - $this->contact_name = $locale->getLocaleFormattedName($row['first_name'], $row['last_name'], $row['salutation'], $row['title']); - } + global $locale; + // Bug# 46125 - make first name, last name, salutation and title of Contacts respect field level ACLs + $contact_temp = new Contact(); + $contact_temp->retrieve($this->contact_id); + $contact_temp->_create_proper_name_field(); + $this->contact_name = $contact_temp->full_name; } $call_fields['CONTACT_ID'] = $this->contact_id; diff --git a/modules/Calls/Dashlets/MyCallsDashlet/MyCallsDashlet.php b/modules/Calls/Dashlets/MyCallsDashlet/MyCallsDashlet.php index ce695c25..a862a9c0 100644 --- a/modules/Calls/Dashlets/MyCallsDashlet/MyCallsDashlet.php +++ b/modules/Calls/Dashlets/MyCallsDashlet/MyCallsDashlet.php @@ -76,8 +76,8 @@ class MyCallsDashlet extends DashletGeneric { //join with meeting_users table to process related users $this->seedBean->listview_inner_join = array('LEFT JOIN calls_users c_u on c_u.call_id = calls.id'); - //set the custom query to include assigned meetings - $lvsParams['custom_where'] = ' AND (calls.assigned_user_id = \'' . $current_user->id . '\' OR c_u.user_id = \'' . $current_user->id . '\') AND c_u.deleted = 0 '; + //set the custom query to include assigned meetings + $lvsParams['custom_where'] = ' AND (calls.assigned_user_id = \'' . $current_user->id . '\' OR c_u.user_id = \'' . $current_user->id . '\') AND c_u.deleted = 0 '; } $this->myItemsOnly = false; diff --git a/modules/Calls/vardefs.php b/modules/Calls/vardefs.php index 6528dbd7..9f01388f 100644 --- a/modules/Calls/vardefs.php +++ b/modules/Calls/vardefs.php @@ -389,6 +389,8 @@ $dictionary['Call'] = array('table' => 'calls', 'comment' => 'A Call is an activ 'rhs_table' => 'notes', 'rhs_key' => 'parent_id', 'relationship_type' => 'one-to-many', + 'relationship_role_column'=>'parent_type', + 'relationship_role_column_value'=>'Calls', ), ), //This enables optimistic locking for Saves From EditView diff --git a/modules/CampaignLog/CampaignLog.php b/modules/CampaignLog/CampaignLog.php index 26635071..02137e90 100644 --- a/modules/CampaignLog/CampaignLog.php +++ b/modules/CampaignLog/CampaignLog.php @@ -86,11 +86,11 @@ class CampaignLog extends SugarBean { } if ( ( $this->db->dbType == 'mysql' ) or ( $this->db->dbType == 'oci8' ) ) { - $query="select first_name, last_name, CONCAT(CONCAT(first_name, ' '), last_name) name, date_modified from ".strtolower($temp_array['TARGET_TYPE']) . " where id ='{$temp_array['TARGET_ID']}'"; + $query="select first_name, last_name, CONCAT(CONCAT(first_name, ' '), last_name) name from ".strtolower($temp_array['TARGET_TYPE']) . " where id ='{$temp_array['TARGET_ID']}'"; } if($this->db->dbType == 'mssql') { - $query="select first_name, last_name, (first_name + ' ' + last_name) name, date_modified from ".strtolower($temp_array['TARGET_TYPE']) . " where id ='{$temp_array['TARGET_ID']}'"; + $query="select first_name, last_name, (first_name + ' ' + last_name) name from ".strtolower($temp_array['TARGET_TYPE']) . " where id ='{$temp_array['TARGET_ID']}'"; } if($temp_array['TARGET_TYPE']=='Accounts'){ $query="select name from ".strtolower($temp_array['TARGET_TYPE']) . " where id ='{$temp_array['TARGET_ID']}'"; @@ -105,11 +105,10 @@ class CampaignLog extends SugarBean { }else{ $full_name = $locale->getLocaleFormattedName($row['first_name'], $row['last_name'], ''); $temp_array['RECIPIENT_NAME']=$full_name; - $temp_array['ACTIVITY_DATE'] = $row['date_modified']; } } $temp_array['RECIPIENT_EMAIL']=$this->retrieve_email_address($temp_array['TARGET_ID']); - + $query = 'select name from email_marketing where id = \'' . $temp_array['MARKETING_ID'] . '\''; $result=$this->db->query($query); $row=$this->db->fetchByAssoc($result); diff --git a/modules/Campaigns/EmailQueue.php b/modules/Campaigns/EmailQueue.php index a06c5937..d3cf5199 100644 --- a/modules/Campaigns/EmailQueue.php +++ b/modules/Campaigns/EmailQueue.php @@ -121,5 +121,4 @@ $header_URL = "Location: index.php?action=DetailView&module=Campaigns&record={$_ $GLOBALS['log']->debug("about to post header URL of: $header_URL"); header($header_URL); -?> - +?> \ No newline at end of file diff --git a/modules/Campaigns/ProspectLink.php b/modules/Campaigns/ProspectLink.php new file mode 100644 index 00000000..e4260f60 --- /dev/null +++ b/modules/Campaigns/ProspectLink.php @@ -0,0 +1,123 @@ +<?php +if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); +/********************************************************************************* + * SugarCRM Community Edition is a customer relationship management program developed by + * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License version 3 as published by the + * Free Software Foundation with the addition of the following permission added + * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK + * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY + * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License along with + * this program; if not, see http://www.gnu.org/licenses or write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA. + * + * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, + * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * SugarCRM" logo. If the display of the logo is not reasonably feasible for + * technical reasons, the Appropriate Legal Notices must display the words + * "Powered by SugarCRM". + ********************************************************************************/ + + +/********************************************************************************* + +* Description: Bug 40166. Need for return right join for campaign's target list relations. +* All Rights Reserved. +* Contributor(s): ______________________________________.. +********************************************************************************/ + +require_once('data/Link.php'); + +/** + * @brief Bug #40166. Campaign Log Report will not display Contact/Account Names + */ +class ProspectLink extends Link +{ + + /** + * This method changes join of any item to campaign through target list + * if you want to use this join method you should add code below to your vardef.php + * 'link_class' => 'ProspectLink', + * 'link_file' => 'modules/Campaigns/ProspectLink.php' + * + * @see Link::getJoin method + */ + public function getJoin($params, $return_array = false) + { + $join_type= ' INNER JOIN '; + if (isset($params['join_type'])) + { + $join_type = $params['join_type']; + } + $join = ''; + $bean_is_lhs=$this->_get_bean_position(); + + if ( + $this->_relationship->relationship_type == 'one-to-many' + && $bean_is_lhs + ) + { + $table_with_alias = $table = $this->_relationship->rhs_table; + $key = $this->_relationship->rhs_key; + $module = $this->_relationship->rhs_module; + $other_table = (empty($params['left_join_table_alias']) ? $this->_relationship->lhs_table : $params['left_join_table_alias']); + $other_key = $this->_relationship->lhs_key; + $alias_prefix = $table; + if (!empty($params['join_table_alias'])) + { + $table_with_alias = $table. " ".$params['join_table_alias']; + $table = $params['join_table_alias']; + $alias_prefix = $params['join_table_alias']; + } + + $join .= ' '.$join_type.' prospect_list_campaigns '.$alias_prefix.'_plc ON'; + $join .= ' '.$alias_prefix.'_plc.'.$key.' = '.$other_table.'.'.$other_key."\n"; + + // join list targets + $join .= ' '.$join_type.' prospect_lists_prospects '.$alias_prefix.'_plp ON'; + $join .= ' '.$alias_prefix.'_plp.prospect_list_id = '.$alias_prefix.'_plc.prospect_list_id AND'; + $join .= ' '.$alias_prefix.'_plp.related_type = "'.$module.'"'."\n"; + + // join target + $join .= ' '.$join_type.' '.$table_with_alias.' ON'; + $join .= ' '.$table.'.id = '.$alias_prefix.'_plp.related_id AND'; + $join .= ' '.$table.'.deleted=0'."\n"; + + if ($return_array) + { + $ret_arr = array(); + $ret_arr['join'] = $join; + $ret_arr['type'] = $this->_relationship->relationship_type; + if ($bean_is_lhs) + { + $ret_arr['rel_key'] = $this->_relationship->join_key_rhs; + } + else + { + $ret_arr['rel_key'] = $this->_relationship->join_key_lhs; + } + return $ret_arr; + } + return $join; + } else { + return parent::getJoin($params, $return_array); + } + } +} diff --git a/modules/Campaigns/Schedule.html b/modules/Campaigns/Schedule.html index 0fe72a88..1d0a3c24 100644 --- a/modules/Campaigns/Schedule.html +++ b/modules/Campaigns/Schedule.html @@ -57,15 +57,17 @@ <!-- END: list_nav_row --> <tr height="20" > <td scope="col" NOWRAP>{CHECKALL}</td> - <td scope="col" width="40%" NOWRAP><slot>{MOD.LBL_LIST_NAME}</slot></td> - <td scope="col" width="60%" NOWRAP><slot>{MOD.LBL_LIST_PROSPECT_LIST_NAME}</slot></td> + <td scope="col" width="35%" NOWRAP><slot>{MOD.LBL_LIST_NAME}</slot></td> + <td scope="col" width="15%" NOWRAP><slot>{MOD.LBL_STATUS}</slot></td> + <td scope="col" width="50%" NOWRAP><slot>{MOD.LBL_LIST_PROSPECT_LIST_NAME}</slot></td> </tr> <!-- BEGIN: row --> <tr height="20" class="{ROW_COLOR}S1"> <td>{PREROW}</td> <td scope="row" valign=TOP ><slot>{EMAILMARKETING.NAME}</slot></td> - <td valign=TOP ><slot>{EMAILMARKETING.PROSPECT_LIST_NAME}</slot></td> + <td valign=TOP ><slot>{EMAILMARKETING.STATUS}</slot></td> + <td valign=TOP ><slot>{EMAILMARKETING.PROSPECT_LIST_NAME}</slot></td> </tr> <!-- END: row --> diff --git a/modules/Campaigns/Schedule.php b/modules/Campaigns/Schedule.php index 938ce976..885aa6f1 100644 --- a/modules/Campaigns/Schedule.php +++ b/modules/Campaigns/Schedule.php @@ -78,94 +78,104 @@ if ($test) { echo getClassicModuleTitle('Campaigns', array($current_module_strings['LBL_MODULE_SEND_EMAILS']), false); } -$focus = new EmailMarketing(); -if(isset($_REQUEST['record'])) -{ - // we have a query - if (isset($_REQUEST['record'])) $campaign_id = $_REQUEST['record']; +$campaign_id = isset($_REQUEST['record']) ? $_REQUEST['record'] : false; - $where_clauses = Array(); - - if(isset($campaign_id) && !empty($campaign_id)) array_push($where_clauses, "campaign_id = '".$GLOBALS['db']->quote($campaign_id)."'"); +if (!empty($campaign_id)) { + $campaign = new Campaign(); + $campaign->retrieve($campaign_id); +} - $where = ""; - foreach($where_clauses as $clause) +if ($campaign_id && isset($campaign) && $campaign->status == 'Inactive') { + $ss = new Sugar_Smarty(); + $ss->assign('campaignName', $campaign->name); + $ss->display('modules/Campaigns/tpls/campaign-inactive.tpl'); +} else { + $focus = new EmailMarketing(); + if($campaign_id) { - if($where != "") - $where .= " and "; - $where .= $clause; - } + $where_clauses = Array(); - $GLOBALS['log']->info("Here is the where clause for the list view: $where"); -} + if(!empty($campaign_id)) array_push($where_clauses, "campaign_id = '".$GLOBALS['db']->quote($campaign_id)."'"); -$ListView = new ListView(); -$ListView->initNewXTemplate('modules/Campaigns/Schedule.html',$current_module_strings); + $where = ""; + foreach($where_clauses as $clause) + { + if($where != "") + $where .= " and "; + $where .= $clause; + } -if ($test) { - $ListView->xTemplateAssign("SCHEDULE_MESSAGE_HEADER",$current_module_strings['LBL_SCHEDULE_MESSAGE_TEST']); -} else { - $ListView->xTemplateAssign("SCHEDULE_MESSAGE_HEADER",$current_module_strings['LBL_SCHEDULE_MESSAGE_EMAILS']); -} + $GLOBALS['log']->info("Here is the where clause for the list view: $where"); + } -//force multi-select popup -$ListView->process_for_popups=true; -$ListView->multi_select_popup=true; -//end -$ListView->mergeduplicates = false; -$ListView->show_export_button = false; -$ListView->show_select_menu = false; -$ListView->show_delete_button = false; -$ListView->setDisplayHeaderAndFooter(false); -$ListView->xTemplateAssign("RETURN_MODULE",$_POST['return_module']); -$ListView->xTemplateAssign("RETURN_ACTION",$_POST['return_action']); -$ListView->xTemplateAssign("RETURN_ID",$_POST['record']); -$ListView->setHeaderTitle($current_module_strings['LBL_LIST_FORM_TITLE']); -$ListView->setQuery($where, "", "name", "EMAILMARKETING"); - -if ($test) { - $ListView->xTemplateAssign("MODE",$_POST['mode']); - //finds all marketing messages that have an association with prospect list of the test. - //this query can be siplified using sub-selects. - $query="select distinct email_marketing.id email_marketing_id from email_marketing "; - $query.=" inner join email_marketing_prospect_lists empl on empl.email_marketing_id = email_marketing.id "; - $query.=" inner join prospect_lists on prospect_lists.id = empl.prospect_list_id "; - $query.=" inner join prospect_list_campaigns plc on plc.prospect_list_id = empl.prospect_list_id "; - $query.=" where empl.deleted=0 "; - $query.=" and prospect_lists.deleted=0 "; - $query.=" and prospect_lists.list_type='test' "; - $query.=" and plc.deleted=0 "; - $query.=" and plc.campaign_id='$campaign_id'"; - $query.=" and email_marketing.campaign_id='$campaign_id'"; - $query.=" and email_marketing.deleted=0 "; - $query.=" and email_marketing.all_prospect_lists=0 "; - - $seed=array(); - - $result=$focus->db->query($query); - while(($row=$focus->db->fetchByAssoc($result)) != null) { - - $bean = new EmailMarketing(); - $bean->retrieve($row['email_marketing_id']); - $bean->mode='test'; - $seed[]=$bean; - } - $query=" select email_marketing.id email_marketing_id from email_marketing "; - $query.=" WHERE email_marketing.campaign_id='$campaign_id'"; - $query.=" and email_marketing.deleted=0 "; - $query.=" and email_marketing.all_prospect_lists=1 "; - - $result=$focus->db->query($query); - while(($row=$focus->db->fetchByAssoc($result)) != null) { - - $bean = new EmailMarketing(); - $bean->retrieve($row['email_marketing_id']); - $bean->mode='test'; - $seed[]=$bean; - } + $ListView = new ListView(); + $ListView->initNewXTemplate('modules/Campaigns/Schedule.html',$current_module_strings); - $ListView->processListView($seed, "main", "EMAILMARKETING"); -} else { - $ListView->processListView($focus, "main", "EMAILMARKETING"); + if ($test) { + $ListView->xTemplateAssign("SCHEDULE_MESSAGE_HEADER",$current_module_strings['LBL_SCHEDULE_MESSAGE_TEST']); + } else { + $ListView->xTemplateAssign("SCHEDULE_MESSAGE_HEADER",$current_module_strings['LBL_SCHEDULE_MESSAGE_EMAILS']); + } + + //force multi-select popup + $ListView->process_for_popups=true; + $ListView->multi_select_popup=true; + //end + $ListView->mergeduplicates = false; + $ListView->show_export_button = false; + $ListView->show_select_menu = false; + $ListView->show_delete_button = false; + $ListView->setDisplayHeaderAndFooter(false); + $ListView->xTemplateAssign("RETURN_MODULE",$_POST['return_module']); + $ListView->xTemplateAssign("RETURN_ACTION",$_POST['return_action']); + $ListView->xTemplateAssign("RETURN_ID",$_POST['record']); + $ListView->setHeaderTitle($current_module_strings['LBL_LIST_FORM_TITLE']); + $ListView->setQuery($where, "", "name", "EMAILMARKETING"); + + if ($test) { + $ListView->xTemplateAssign("MODE",$_POST['mode']); + //finds all marketing messages that have an association with prospect list of the test. + //this query can be siplified using sub-selects. + $query="select distinct email_marketing.id email_marketing_id from email_marketing "; + $query.=" inner join email_marketing_prospect_lists empl on empl.email_marketing_id = email_marketing.id "; + $query.=" inner join prospect_lists on prospect_lists.id = empl.prospect_list_id "; + $query.=" inner join prospect_list_campaigns plc on plc.prospect_list_id = empl.prospect_list_id "; + $query.=" where empl.deleted=0 "; + $query.=" and prospect_lists.deleted=0 "; + $query.=" and prospect_lists.list_type='test' "; + $query.=" and plc.deleted=0 "; + $query.=" and plc.campaign_id='$campaign_id'"; + $query.=" and email_marketing.campaign_id='$campaign_id'"; + $query.=" and email_marketing.deleted=0 "; + $query.=" and email_marketing.all_prospect_lists=0 "; + + $seed=array(); + + $result=$focus->db->query($query); + while(($row=$focus->db->fetchByAssoc($result)) != null) { + + $bean = new EmailMarketing(); + $bean->retrieve($row['email_marketing_id']); + $bean->mode='test'; + $seed[]=$bean; + } + $query=" select email_marketing.id email_marketing_id from email_marketing "; + $query.=" WHERE email_marketing.campaign_id='$campaign_id'"; + $query.=" and email_marketing.deleted=0 "; + $query.=" and email_marketing.all_prospect_lists=1 "; + + $result=$focus->db->query($query); + while(($row=$focus->db->fetchByAssoc($result)) != null) { + + $bean = new EmailMarketing(); + $bean->retrieve($row['email_marketing_id']); + $bean->mode='test'; + $seed[]=$bean; + } + + $ListView->processListView($seed, "main", "EMAILMARKETING"); + } else { + $ListView->processListView($focus, "main", "EMAILMARKETING"); + } } ?> \ No newline at end of file diff --git a/modules/Campaigns/WebToLeadCapture.php b/modules/Campaigns/WebToLeadCapture.php index 332bbc9b..10b1394b 100644 --- a/modules/Campaigns/WebToLeadCapture.php +++ b/modules/Campaigns/WebToLeadCapture.php @@ -178,7 +178,7 @@ if (isset($_POST['campaign_id']) && !empty($_POST['campaign_id'])) { echo '<form name="redirect" action="' .$_POST['redirect_url']. '" method="GET">'; foreach($_POST as $param => $value) { - if($param != 'redirect_url' ||$param != 'submit') { + if($param != 'redirect_url' || $param != 'submit') { echo '<input type="hidden" name="'.$param.'" value="'.$value.'">'; } } diff --git a/modules/Campaigns/tpls/campaign-inactive.tpl b/modules/Campaigns/tpls/campaign-inactive.tpl new file mode 100644 index 00000000..bd0a9ef0 --- /dev/null +++ b/modules/Campaigns/tpls/campaign-inactive.tpl @@ -0,0 +1,39 @@ +{* +/********************************************************************************* + * SugarCRM Community Edition is a customer relationship management program developed by + * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License version 3 as published by the + * Free Software Foundation with the addition of the following permission added + * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK + * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY + * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License along with + * this program; if not, see http://www.gnu.org/licenses or write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA. + * + * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, + * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * SugarCRM" logo. If the display of the logo is not reasonably feasible for + * technical reasons, the Appropriate Legal Notices must display the words + * "Powered by SugarCRM". + ********************************************************************************/ + + +*} +Campaign '{$campaignName}' has status 'Inactive'. You have to set campaign status to 'Active'. \ No newline at end of file diff --git a/modules/Campaigns/vardefs.php b/modules/Campaigns/vardefs.php index e2812511..0f42f8fc 100644 --- a/modules/Campaigns/vardefs.php +++ b/modules/Campaigns/vardefs.php @@ -237,6 +237,8 @@ $dictionary['Campaign'] = array ('audited'=>true, 'relationship' => 'campaign_leads', 'source'=>'non-db', 'vname' => 'LBL_LEADS', + 'link_class' => 'ProspectLink', + 'link_file' => 'modules/Campaigns/ProspectLink.php' ), 'opportunities'=> array ( @@ -252,6 +254,8 @@ $dictionary['Campaign'] = array ('audited'=>true, 'relationship' => 'campaign_contacts', 'source'=>'non-db', 'vname' => 'LBL_CONTACTS', + 'link_class' => 'ProspectLink', + 'link_file' => 'modules/Campaigns/ProspectLink.php' ), 'accounts'=> array ( 'name' => 'accounts', @@ -259,6 +263,8 @@ $dictionary['Campaign'] = array ('audited'=>true, 'relationship' => 'campaign_accounts', 'source'=>'non-db', 'vname' => 'LBL_ACCOUNTS', + 'link_class' => 'ProspectLink', + 'link_file' => 'modules/Campaigns/ProspectLink.php' ), diff --git a/modules/Charts/Dashlets/MyPipelineBySalesStageDashlet/MyPipelineBySalesStageDashlet.php b/modules/Charts/Dashlets/MyPipelineBySalesStageDashlet/MyPipelineBySalesStageDashlet.php index 057d5641..aa367ee6 100644 --- a/modules/Charts/Dashlets/MyPipelineBySalesStageDashlet/MyPipelineBySalesStageDashlet.php +++ b/modules/Charts/Dashlets/MyPipelineBySalesStageDashlet/MyPipelineBySalesStageDashlet.php @@ -227,7 +227,7 @@ class MyPipelineBySalesStageDashlet extends DashletGenericChart $query = "SELECT opportunities.sales_stage, users.user_name, opportunities.assigned_user_id, - count( * ) AS opp_count, + count(*) AS opp_count, sum(amount_usdollar/1000) AS total FROM users,opportunities "; $query .= " WHERE opportunities.assigned_user_id IN ('{$GLOBALS['current_user']->id}') " . diff --git a/modules/Charts/Dashlets/PipelineBySalesStageDashlet/PipelineBySalesStageDashlet.php b/modules/Charts/Dashlets/PipelineBySalesStageDashlet/PipelineBySalesStageDashlet.php index 0de59812..24c51343 100644 --- a/modules/Charts/Dashlets/PipelineBySalesStageDashlet/PipelineBySalesStageDashlet.php +++ b/modules/Charts/Dashlets/PipelineBySalesStageDashlet/PipelineBySalesStageDashlet.php @@ -191,7 +191,7 @@ class PipelineBySalesStageDashlet extends DashletGenericChart $query = " SELECT opportunities.sales_stage, users.user_name, opportunities.assigned_user_id, - count( * ) AS opp_count, + count(*) AS opp_count, sum(amount_usdollar/1000) AS total FROM users,opportunities "; $query .= " WHERE opportunities.date_closed >= ". db_convert("'".$this->pbss_date_start."'",'datetime'). diff --git a/modules/Charts/code/Chart_outcome_by_month.php b/modules/Charts/code/Chart_outcome_by_month.php index 0a31978c..92fa3986 100644 --- a/modules/Charts/code/Chart_outcome_by_month.php +++ b/modules/Charts/code/Chart_outcome_by_month.php @@ -457,4 +457,4 @@ echo get_validate_chart_js(); } -?> +?> \ No newline at end of file diff --git a/modules/Configurator/tpls/adminwizard.tpl b/modules/Configurator/tpls/adminwizard.tpl index 1e6b27a4..99c53253 100644 --- a/modules/Configurator/tpls/adminwizard.tpl +++ b/modules/Configurator/tpls/adminwizard.tpl @@ -213,14 +213,9 @@ function disableReturnSubmission(e) { <td colspan="4"><hr /></td> </tr> <tr> - <td nowrap="nowrap" scope="row" valign="top">{sugar_translate module='Administration' label='LBL_LOCALE_DEFAULT_NAME_FORMAT'}: </td> <td> - <input onkeyup="setPreview();" size='15' onkeydown="setPreview();" id="default_locale_name_format" type="text" name="default_locale_name_format" value="{$config.default_locale_name_format}"> - <br> - {sugar_translate module='Administration' label='LBL_LOCALE_NAME_FORMAT_DESC'} + <input id="default_locale_name_format" type="hidden" name="default_locale_name_format" value="{$config.default_locale_name_format}"> </td> - <td nowrap="nowrap" scope="row" valign="top">{sugar_translate module='Administration' label='LBL_LOCALE_EXAMPLE_NAME_FORMAT'}: </td> - <td valign="top"><input name="no_value" id="nameTarget" style="border: none;" value="" disabled></td> </tr> </table> </div> diff --git a/modules/Contacts/SaveContactOpportunityRelationship.php b/modules/Contacts/SaveContactOpportunityRelationship.php index 260de7f0..c44838e7 100644 --- a/modules/Contacts/SaveContactOpportunityRelationship.php +++ b/modules/Contacts/SaveContactOpportunityRelationship.php @@ -77,5 +77,4 @@ $header_URL = "Location: index.php?action={$_REQUEST['return_action']}&module={$ $GLOBALS['log']->debug("about to post header URL of: $header_URL"); header($header_URL); -?> - +?> \ No newline at end of file diff --git a/modules/Contacts/metadata/popupdefs.php b/modules/Contacts/metadata/popupdefs.php index f6077372..b2203e05 100644 --- a/modules/Contacts/metadata/popupdefs.php +++ b/modules/Contacts/metadata/popupdefs.php @@ -48,7 +48,7 @@ $popupMeta = array( 'account_name' => 'accounts.name', 'account_id' => 'accounts.id'), 'searchInputs' => - array('first_name', 'last_name', 'account_name'), + array('first_name', 'last_name', 'account_name', 'email'), 'create' => array('formBase' => 'ContactFormBase.php', 'formBaseClass' => 'ContactFormBase', @@ -86,6 +86,7 @@ $popupMeta = array( array('name' => 'account_name', 'type' => 'varchar',), 'title', 'lead_source', + 'email', array('name' => 'campaign_name', 'displayParams' => array('hideButtons'=>'true', 'size'=>30, 'class'=>'sqsEnabled sqsNoAutofill')), array('name' => 'assigned_user_id', 'type' => 'enum', 'label' => 'LBL_ASSIGNED_TO', 'function' => array('name' => 'get_user_array', 'params' => array(false))), ) diff --git a/modules/Contacts/vardefs.php b/modules/Contacts/vardefs.php index 1025cf5d..abd23c8b 100644 --- a/modules/Contacts/vardefs.php +++ b/modules/Contacts/vardefs.php @@ -118,6 +118,20 @@ array ( 'vname' => 'LBL_OPPORTUNITY_ROLE_ID', 'studio' => array('listview' => false), ), + //bug 42902 + 'email'=> array( + 'name' => 'email', + 'type' => 'email', + 'query_type' => 'default', + 'source' => 'non-db', + 'operator' => 'subquery', + 'subquery' => 'SELECT eabr.bean_id FROM email_addr_bean_rel eabr JOIN email_addresses ea ON (ea.id = eabr.email_address_id) WHERE eabr.deleted=0 AND ea.email_address LIKE', + 'db_field' => array( + 'id', + ), + 'vname' =>'LBL_ANY_EMAIL', + 'studio' => array('visible'=>false, 'searchview'=>true), + ), 'opportunity_role' => array( 'name' => 'opportunity_role', diff --git a/modules/Contacts/views/view.quickcreate.php b/modules/Contacts/views/view.quickcreate.php new file mode 100644 index 00000000..69f522db --- /dev/null +++ b/modules/Contacts/views/view.quickcreate.php @@ -0,0 +1,59 @@ +<?php +//FILE SUGARCRM flav=pro || flav=sales +if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); +/********************************************************************************* + * SugarCRM Community Edition is a customer relationship management program developed by + * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License version 3 as published by the + * Free Software Foundation with the addition of the following permission added + * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK + * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY + * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License along with + * this program; if not, see http://www.gnu.org/licenses or write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA. + * + * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, + * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * SugarCRM" logo. If the display of the logo is not reasonably feasible for + * technical reasons, the Appropriate Legal Notices must display the words + * "Powered by SugarCRM". + ********************************************************************************/ + + +require_once('include/MVC/View/views/view.quickcreate.php'); + +class ContactsViewQuickcreate extends ViewQuickcreate +{ + public function preDisplay() + { + parent::preDisplay(); + if($this->_isDCForm) { + //XXX TODO 20110329 Frank Steegmans: Hack to make quick create fields populate when used through the DC menu + // NOTE HOWEVER that sqs_objects form fields are not properly populated because of some other hacks + // resulting in none of the fields properly populating when selecting an account + if(!empty($this->bean->phone_office))$_REQUEST['phone_work'] = $this->bean->phone_office; + if(!empty($this->bean->billing_address_street))$_REQUEST['primary_address_street'] = $this->bean->billing_address_street; + if(!empty($this->bean->billing_address_city))$_REQUEST['primary_address_city'] = $this->bean->billing_address_city; + if(!empty($this->bean->billing_address_state))$_REQUEST['primary_address_state'] = $this->bean->billing_address_state; + if(!empty($this->bean->billing_address_country))$_REQUEST['primary_address_country'] = $this->bean->billing_address_country; + if(!empty($this->bean->billing_address_postalcode))$_REQUEST['primary_address_postalcode'] = $this->bean->billing_address_postalcode; + } + } +} \ No newline at end of file diff --git a/modules/Currencies/Currency.php b/modules/Currencies/Currency.php index 33b0f8bd..9d2e6937 100644 --- a/modules/Currencies/Currency.php +++ b/modules/Currencies/Currency.php @@ -471,30 +471,36 @@ function format_money($amount, $for_display = TRUE) { *(default "."). Special case: when num_grp_sep is ".", it will return NULL as the num_grp_sep. * @return array Two element array, first item is num_grp_sep, 2nd item is dec_sep */ -function get_number_seperators($reset_sep = false) { +function get_number_seperators($reset_sep = false) +{ global $current_user, $sugar_config; static $dec_sep = null; static $num_grp_sep = null; - if ( $reset_sep ) { - // This is typically only used during unit-tests + // This is typically only used during unit-tests + // TODO: refactor this. unit tests should not have static dependencies + if ($reset_sep) + { $dec_sep = $num_grp_sep = null; } - if($dec_sep == null) { + if ($dec_sep == null) + { $dec_sep = $sugar_config['default_decimal_seperator']; - if(!empty($current_user->id)){ - $user_dec_sep = $current_user->getPreference('dec_sep'); - $dec_sep =(empty($user_dec_sep) ? $sugar_config['default_decimal_seperator'] : $user_dec_sep); - } + if (!empty($current_user->id)) { + $user_dec_sep = $current_user->getPreference('dec_sep'); + $dec_sep = (empty($user_dec_sep) ? $sugar_config['default_decimal_seperator'] : $user_dec_sep); + } } - if($num_grp_sep == null) { + + if ($num_grp_sep == null) + { $num_grp_sep = $sugar_config['default_number_grouping_seperator']; - if(!empty($current_user->id)){ - $user_num_grp_sep = $current_user->getPreference('num_grp_sep'); - $num_grp_sep =(empty($user_num_grp_sep) ? $sugar_config['default_number_grouping_seperator'] : $user_num_grp_sep); - } + if (!empty($current_user->id)) { + $user_num_grp_sep = $current_user->getPreference('num_grp_sep'); + $num_grp_sep = (empty($user_num_grp_sep) ? $sugar_config['default_number_grouping_seperator'] : $user_num_grp_sep); + } } return array($num_grp_sep, $dec_sep); diff --git a/modules/Documents/documents.js b/modules/Documents/documents.js index 0c2eef5d..b1491657 100644 --- a/modules/Documents/documents.js +++ b/modules/Documents/documents.js @@ -37,7 +37,7 @@ var rhandle=new RevisionListHandler();var from_popup_return=false;function docum {if(the_key!='toJSON') {var displayValue=name_to_value_array[the_key];displayValue=displayValue.replace(''',"'");displayValue=displayValue.replace('&',"&");displayValue=displayValue.replace('>',">");displayValue=displayValue.replace('<',"<");displayValue=displayValue.replace('" ',"\"");if(the_key=='related_doc_id'){related_doc_id=displayValue;} window.document.forms[form_name].elements[the_key].value=displayValue;}} -related_doc_id=YAHOO.lang.JSON.stringify(related_doc_id);var conditions=new Array();conditions[conditions.length]={"name":"document_id","op":"starts_with","value":related_doc_id};var query={"module":"DocumentRevisions","field_list":['id','revision','date_entered'],"conditions":conditions,"order":'date_entered desc'};result=global_rpcClient.call_method('query',query,true);rhandle.display(result);} +related_doc_id=YAHOO.lang.JSON.stringify(related_doc_id);var conditions=new Array();conditions[conditions.length]={"name":"document_id","op":"starts_with","value":related_doc_id};var query={"module":"DocumentRevisions","field_list":['id','revision','date_entered'],"conditions":conditions,"order":{'by':'date_entered','desc':true}};result=global_rpcClient.call_method('query',query,true);rhandle.display(result);} function RevisionListHandler(){} RevisionListHandler.prototype.display=function(result){var names=result['list'];var rev_tag=document.getElementById('related_doc_rev_id');rev_tag.options.length=0;for(i=0;i<names.length;i++){rev_tag.options[i]=new Option(names[i].fields['revision'],names[i].fields['id'],false,false);} rev_tag.disabled=false;} diff --git a/modules/Documents/vardefs.php b/modules/Documents/vardefs.php index 7b48195b..14aaa0a6 100644 --- a/modules/Documents/vardefs.php +++ b/modules/Documents/vardefs.php @@ -125,7 +125,7 @@ $dictionary['Document'] = array('table' => 'documents', 'type' => 'enum', 'len' => 100, 'options' => 'document_category_dom', - 'reportable'=>false, + 'reportable'=>true, ), 'subcategory_id' => @@ -135,7 +135,7 @@ $dictionary['Document'] = array('table' => 'documents', 'type' => 'enum', 'len' => 100, 'options' => 'document_subcategory_dom', - 'reportable'=>false, + 'reportable'=>true, ), 'status_id' => diff --git a/modules/DynamicFields/templates/Fields/TemplateRelatedTextField.php b/modules/DynamicFields/templates/Fields/TemplateRelatedTextField.php index bfdfcf15..9cafb19a 100644 --- a/modules/DynamicFields/templates/Fields/TemplateRelatedTextField.php +++ b/modules/DynamicFields/templates/Fields/TemplateRelatedTextField.php @@ -228,6 +228,7 @@ class TemplateRelatedTextField extends TemplateText{ $idName = $basename.++$count.'_c' ; } $id->name = $idName ; + $id->reportable = false; $id->save($df); // record the id field's name, and save diff --git a/modules/EmailMan/controller.php b/modules/EmailMan/controller.php index 1ed79c9c..e3571c79 100644 --- a/modules/EmailMan/controller.php +++ b/modules/EmailMan/controller.php @@ -77,7 +77,9 @@ class EmailManController extends SugarController if( !isset($_POST['mail_smtpauth_req']) ) { $_POST['mail_smtpauth_req'] = 0; - $_POST['notify_allow_default_outbound'] = 0; //If smtp auth is disabled ensure outbound is disabled. + if (empty($_POST['campaignConfig'])) { + $_POST['notify_allow_default_outbound'] = 0; // If smtp auth is disabled ensure outbound is disabled. + } } if( !empty($_POST['notify_allow_default_outbound']) ) diff --git a/modules/EmailMarketing/EditView.html b/modules/EmailMarketing/EditView.html index 51dba9cb..5703186b 100644 --- a/modules/EmailMarketing/EditView.html +++ b/modules/EmailMarketing/EditView.html @@ -79,7 +79,7 @@ </tr> <tr> <td scope="row"><slot>{MOD.LBL_START_DATE_TIME} <span class="required">{APP.LBL_REQUIRED_SYMBOL}</span></slot></td> - <td class="datafield"><slot><table cellpadding="0" cellspacing="0"><tr><td nowrap><input name='date_start' onblur="parseDate(this, '{CALENDAR_DATEFORMAT}');" id='jscal_field' size='11' tabindex='1' maxlength='10' type="text" value="{DATE_START}"> <img src="index.php?entryPoint=getImage&themeName={THEME}&imageName=jscalendar.gif" alt="{CALENDAR_DATEFORMAT}" id="jscal_trigger" align="absmiddle"> </td> + <td class="datafield"><slot><table cellpadding="0" cellspacing="0"><tr><td nowrap><input name='date_start' onblur="parseDate(this, '{CALENDAR_DATEFORMAT}');" id='date_start_date' size='11' tabindex='1' maxlength='10' type="text" value="{DATE_START}"> <img src="index.php?entryPoint=getImage&themeName={THEME}&imageName=jscalendar.gif" alt="{CALENDAR_DATEFORMAT}" id="jscal_trigger" align="absmiddle"> </td> <td nowrap><input type="text" size='5' maxlength='5' name='time_start' tabindex="1" value="{TIME_START}"/>{TIME_MERIDIEM}</td></tr><tr><td nowrap><span class="dateFormat">{USER_DATEFORMAT}</span></td><td nowrap><span class="dateFormat">{TIME_FORMAT}</span></td></tr></table></slot></td> <td scope="row"><slot>{MOD.LBL_TEMPLATE} <span class="required">{APP.LBL_REQUIRED_SYMBOL}</span></slot></td> <td class="datafield"> @@ -120,7 +120,7 @@ </form> <script type="text/javascript"> Calendar.setup ({ - inputField : "jscal_field", ifFormat : "{CALENDAR_DATEFORMAT}", showsTime : false, button : "jscal_trigger", singleClick : true, step : 1 + inputField : "date_start_date", ifFormat : "{CALENDAR_DATEFORMAT}", showsTime : false, button : "jscal_trigger", singleClick : true, step : 1 }); function show_edit_template_link(field) { diff --git a/modules/EmailMarketing/vardefs.php b/modules/EmailMarketing/vardefs.php index 72db2184..29c6bba5 100644 --- a/modules/EmailMarketing/vardefs.php +++ b/modules/EmailMarketing/vardefs.php @@ -95,6 +95,7 @@ $dictionary['EmailMarketing'] = array('table' => 'email_marketing' 'type' => 'varchar', 'len' => '255', 'importable' => 'required', + 'required' => true ), 'from_name' => //starting from 4.0 from_name is obsolete..replaced with inbound_email_id array ( @@ -103,6 +104,7 @@ $dictionary['EmailMarketing'] = array('table' => 'email_marketing' 'type' => 'varchar', 'len' => '100', 'importable' => 'required', + 'required' => true ), 'from_addr' => array ( @@ -111,6 +113,7 @@ $dictionary['EmailMarketing'] = array('table' => 'email_marketing' 'type' => 'varchar', 'len' => '100', 'importable' => 'required', + 'required' => true ), 'reply_to_name' => array ( @@ -139,6 +142,7 @@ $dictionary['EmailMarketing'] = array('table' => 'email_marketing' 'vname' => 'LBL_DATE_START', 'type' => 'datetime', 'importable' => 'required', + 'required' => true ), 'template_id' => diff --git a/modules/EmailTemplates/Delete.php b/modules/EmailTemplates/Delete.php index 06fb98f8..d20fe344 100644 --- a/modules/EmailTemplates/Delete.php +++ b/modules/EmailTemplates/Delete.php @@ -56,6 +56,7 @@ if(!$focus->ACLAccess('Delete')) { ACLController::displayNoAccess(true); sugar_cleanup(true); } +sugar_cache_clear('select_array:'.$focus->object_name.'namebase_module=\''.$focus->base_module.'\'name'); $focus->mark_deleted($_REQUEST['record']); header("Location: index.php?module=".$_REQUEST['return_module']."&action=".$_REQUEST['return_action']."&record=".$_REQUEST['return_id']); diff --git a/modules/EmailTemplates/EditView.php b/modules/EmailTemplates/EditView.php index 05a47ce1..e85cb0b2 100644 --- a/modules/EmailTemplates/EditView.php +++ b/modules/EmailTemplates/EditView.php @@ -187,6 +187,11 @@ $xtpl->assign("JSLANG", $jsLang); $xtpl->assign("ID", $focus->id); if(isset($focus->name)) $xtpl->assign("NAME", $focus->name); else $xtpl->assign("NAME", ""); + +//Bug45632 +if(isset($focus->assigned_user_id)) $xtpl->assign("ASSIGNED_USER_ID", $focus->assigned_user_id); else $xtpl->assign("ASSIGNED_USER_ID", ""); +//Bug45632 + if(isset($focus->description)) $xtpl->assign("DESCRIPTION", $focus->description); else $xtpl->assign("DESCRIPTION", ""); if(isset($focus->subject)) $xtpl->assign("SUBJECT", $focus->subject); else $xtpl->assign("SUBJECT", ""); if( $focus->published == 'on') diff --git a/modules/EmailTemplates/Save.php b/modules/EmailTemplates/Save.php index a983b32f..faae5096 100644 --- a/modules/EmailTemplates/Save.php +++ b/modules/EmailTemplates/Save.php @@ -50,6 +50,7 @@ $focus = populateFromPost('', $focus); require_once('modules/EmailTemplates/EmailTemplateFormBase.php'); $form = new EmailTemplateFormBase(); +sugar_cache_clear('select_array:'.$focus->object_name.'namebase_module=\''.$focus->base_module.'\'name'); if(isset($_REQUEST['inpopupwindow']) and $_REQUEST['inpopupwindow'] == true) { $focus=$form->handleSave('',false, false); //do not redirect. $body1 = " diff --git a/modules/Emails/EditView.html b/modules/Emails/EditView.html deleted file mode 100644 index 77714e94..00000000 --- a/modules/Emails/EditView.html +++ /dev/null @@ -1,433 +0,0 @@ -<!-- -/********************************************************************************* - * SugarCRM Community Edition is a customer relationship management program developed by - * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc. - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License version 3 as published by the - * Free Software Foundation with the addition of the following permission added - * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK - * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY - * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. - * - * You should have received a copy of the GNU Affero General Public License along with - * this program; if not, see http://www.gnu.org/licenses or write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301 USA. - * - * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, - * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. - * - * The interactive user interfaces in modified source and object code versions - * of this program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU Affero General Public License version 3. - * - * In accordance with Section 7(b) of the GNU Affero General Public License version 3, - * these Appropriate Legal Notices must retain the display of the "Powered by - * SugarCRM" logo. If the display of the logo is not reasonably feasible for - * technical reasons, the Appropriate Legal Notices must display the words - * "Powered by SugarCRM". - ********************************************************************************/ - ---> - -<!-- BEGIN: main --> -<script type="text/javascript" language="Javascript"> -{JS_VARS} -</script> -<script type="text/javascript" src="include/javascript/jsclass_base.js?s={SUGAR_VERSION}&c={JS_CUSTOM_VERSION}"></script> -<script type="text/javascript" src="include/javascript/jsclass_async.js?s={SUGAR_VERSION}&c={JS_CUSTOM_VERSION}"></script> -<script type="text/javascript" src="modules/Emails/javascript/Email.js?s={SUGAR_VERSION}&c={JS_CUSTOM_VERSION}"></script> -<script type="text/javascript" src="modules/Documents/documents.js?s={SUGAR_VERSION}&c={JS_CUSTOM_VERSION}"></script> -{MESSAGE} - -<form action="index.php" method="post" id="EditView" name="EditView" enctype="multipart/form-data"> - <input type="hidden" name="module" value="Emails" /> - <input type="hidden" name="action" value="Save" /> - <input type="hidden" name="contact_id" value="{CONTACT_ID}" /> - <input type="hidden" name="user_id" value="{USER_ID}" /> - <input type="hidden" name="return_module" value="{RETURN_MODULE}" /> - <input type="hidden" name="return_id" value="{RETURN_ID}" /> - <input type="hidden" name="send" value="" /> - <input type="hidden" name="type" value="out" /> - <input type="hidden" name="record" value="{ID}" /> - <input type="hidden" name="return_action" value="{RETURN_ACTION}" /> - <input type="hidden" name="inbound_email_id" value="{INBOUND_EMAIL_ID}" /> - <input type="hidden" name="assigned_user_id" value="{ASSIGNED_USER_ID}" /> - <input type="hidden" name="object_type" value="{OBJECT_TYPE}" /> - <input type="hidden" name="object_id" value="{OBJECT_ID}" /> - <input type="hidden" name="group" value="{GROUP}" /> - <input type="hidden" name="origType" value="{TYPE}" /> - - <table width="100%" cellpadding="0" cellspacing="0" border="0"> - <tr> - <td> - <input type="submit" name="button" id="SAVE_HEADER" class="button primary" {disable_send} title="{MOD.LBL_SEND_BUTTON_TITLE}" accesskey="{MOD.LBL_SEND_BUTTON_KEY}" value=" {MOD.LBL_SEND_BUTTON_LABEL} " onclick="prepSave();this.form.action.value='Save';this.form.send.value='1';this.form.type.value='out';return fill_form('out', '{MOD.ERR_NOT_ADDRESSED}');" /> - <input type="submit" name="button" class="button" title="{MOD.LBL_SAVE_AS_DRAFT_BUTTON_TITLE}" accesskey="{MOD.LBL_SAVE_AS_DRAFT_BUTTON_KEY}" value=" {MOD.LBL_SAVE_AS_DRAFT_BUTTON_LABEL} " onclick="this.form.action.value='Save';this.form.send.value='0';this.form.type.value='draft';fill_form('draft', '{MOD.ERR_NOT_ADDRESSED}');" /> - <input type="submit" name="button" class="button" title="{APP.LBL_CANCEL_BUTTON_TITLE}" accesskey="{APP.LBL_CANCEL_BUTTON_KEY}" value=" {APP.LBL_CANCEL_BUTTON_LABEL} " onclick="this.form.action.value='{RETURN_ACTION}'; this.form.module.value='{RETURN_MODULE}'; this.form.record.value='{RETURN_ID}'; {MYINBOX}" /> - </td> - <td align="right" nowrap> - </td> - <td align='right'> - {ADMIN_EDIT} - </td> - </tr> - </table> - <table width="100%" border="0" cellspacing="0" cellpadding="0" class="edit view"> - <tr> - <td> - <table width="100%" border="0" cellspacing="0" cellpadding="0"> - <tr> -<!-- BEGIN: open_source_1 --> - <td nowrap> - <slot> - </slot> - </td> - <td nowrap> - <slot> - </slot> - </td> -<!-- END: open_source_1 --> - <td nowrap> - <slot> - </slot> - </td> - <td scope="row" valign="top" align="right"> - <slot> - <select tabindex='2' name='parent_type' onchange=" document.EditView.parent_name.value=''; - changeQS(); - checkParentType(document.EditView.parent_type.value, document.EditView.change_parent);"> - {TYPE_OPTIONS}</select>  - </slot> - </td> - <td nowrap> - <slot> - <input id='parent_id' name='parent_id' type="hidden" value='{PARENT_ID}'> - <input class="sqsEnabled" id='parent_name' name='parent_name' tabindex='2' type='text' value="{PARENT_NAME}"> -  {CHANGE_PARENT_BUTTON} - </slot> - </td> - </tr> - <tr> - <td scope="row"> - <slot> - {APP.LBL_ASSIGNED_TO}  - </slot> - </td> - <td > - <slot> - <input class="sqsEnabled" tabindex='1' id="assigned_user_name" name='assigned_user_name' type="text" value="{ASSIGNED_USER_NAME}"> - <input id='assigned_user_id' name='assigned_user_id' type="hidden" value="{ASSIGNED_USER_ID}" /> - <input title="{APP.LBL_SELECT_BUTTON_TITLE}" accesskey="{APP.LBL_SELECT_BUTTON_KEY}" type="button" tabindex='1' class="button" value='{APP.LBL_SELECT_BUTTON_LABEL}' name="btn1" onclick='open_popup("Users", 600, 400, "", true, false, {encoded_users_popup_request_data});' /> - </slot> - </td> - <td nowrap> - <slot> - </slot> - </td> - <td nowrap> - <slot> - </slot> - </td> - <td nowrap> - <slot> - </slot> - </td> - </tr> - <tr> - <td colspan="5"> -   - </td> - </tr> - <tr> - <td colspan="1"> -   - </td> - <td colspan="4"> - {MOD.LBL_NOTE_SEMICOLON} - </td> - <td colspan="2"> -   - </td> - </tr> - <tr valign="top"> - <td scope="row"> - <slot> - {MOD.LBL_TO} - </slot> - </td> - <td colspan="4" nowrap="NOWRAP"> - <slot> - <table cellspacing="0" cellpadding="0" border="0"> - <tr> - <td> - <textarea id="to_addrs_field" name='to_addrs' tabindex='3' cols="80" rows="1" style="height: 1.6.em; overflow-y:auto; font-family:sans-serif,monospace; font-size:inherit;" value="{TO_ADDRS}">{TO_ADDRS}</textarea> - <input type="hidden" id="to_addrs_ids" name="to_addrs_ids" value="{TO_ADDRS_IDS}" /> - <input type="hidden" id="to_addrs_emails" name="to_addrs_emails" value="{TO_ADDRS_EMAILS}" /> - <input type="hidden" id="to_addrs_names" name="to_addrs_names" value="{TO_ADDRS_NAMES}" /> - </td> - <td style="padding-left: 4px;"> - {CHANGE_TO_ADDRS_BUTTON} - </td> - </tr> - </table> - </slot> - </td> - </tr> - <tr> - <td scope="row"> - <slot> - {MOD.LBL_CC} - </slot> - </td> - <td colspan="4" nowrap="NOWRAP"> - <slot> - <table cellspacing="0" cellpadding="0" border="0"> - <tr> - <td> - <textarea id="cc_addrs_field" name='cc_addrs' tabindex='3' cols="80" rows="1" style="height: 1.6.em; overflow-y:auto; font-family:sans-serif,monospace; font-size:inherit;" value="{CC_ADDRS}">{CC_ADDRS}</textarea> - <input type="hidden" id="cc_addrs_ids" name="cc_addrs_ids" value="{CC_ADDRS_IDS}" /> - <input type="hidden" id="cc_addrs_emails" name="cc_addrs_emails" value="{CC_ADDRS_EMAILS}" /> - <input type="hidden" id="cc_addrs_names" name="cc_addrs_names" value="{CC_ADDRS_NAMES}" /> - </td> - <td style="padding-left: 4px;"> - {CHANGE_CC_ADDRS_BUTTON} - </td> - </tr> - </table> - </slot> - </td> - </tr> - <tr valign="top"> - <td scope="row"> - <slot> - {MOD.LBL_BCC} - </slot> - </td> - <td colspan="4" nowrap="NOWRAP"> - <table cellspacing="0" cellpadding="0" border="0"> - <tr> - <td> - <textarea id="bcc_addrs_field" name='bcc_addrs' tabindex='3' cols="80" rows="1" style="height: 1.6.em; overflow-y:auto; font-family:sans-serif,monospace; font-size:inherit;" value="{BCC_ADDRS}">{BCC_ADDRS}</textarea> - <input type="hidden" id="bcc_addrs_ids" name="bcc_addrs_ids" value="{BCC_ADDRS_IDS}" /> - <input type="hidden" id="bcc_addrs_emails" name="bcc_addrs_emails" value="{BCC_ADDRS_EMAILS}" /> - <input type="hidden" id="bcc_addrs_names" name="bcc_addrs_names" value="{BCC_ADDRS_NAMES}" /> - </td> - <td style="padding-left: 4px;"> - {CHANGE_BCC_ADDRS_BUTTON} - </td> - </tr> - </table> - </td> - </tr> - <tr valign="top"> - <td scope="row"> - <slot> - {MOD.LBL_FROM} - </slot> - </td> - <td colspan="4" nowrap="NOWRAP"> - <slot> - <table cellspacing="0" cellpadding="0" border="0"> - <tr> - <td> - <textarea id="from_addr_field" name='from_addr' tabindex='3' cols="80" rows="1" style="height: 1.6.em; overflow-y:auto; font-family:sans-serif,monospace; font-size:inherit;" value="{FROM_ADDR}">{FROM_ADDR}</textarea> {FROM_ADDR_GROUP} - <input type="hidden" id="from_addr_email" name="from_addr_email" /> - <input type="hidden" id="from_addr_name" name="from_addr_name" /> - </td> - </tr> - </table> - </slot> - </td> - </tr> - <tr> - <td colspan="5"> -   - </td> - </tr> - <tr> - <td scope="row"> - <slot> - {MOD.LBL_SUBJECT} - </slot> - </td> - <td colspan='4' > - <slot> - <textarea name='name' tabindex='4' cols="100" rows="1" style="height: 1.6.em; overflow-y:auto; font-family:sans-serif,monospace; font-size:inherit;" id="subjectfield">{NAME}</textarea> - </slot> - </td> - </tr> - <tr> - <td valign="top" scope="row"> - {MOD.LBL_BODY} - </td> -<!-- BEGIN: htmlarea --> - <td colspan="2" > - <slot> - <div id="editor_select"> - <input id="setEditor" name="setEditor" value="1" {EMAIL_EDITOR_OPTION} type="checkbox" onclick="toggle_textonly();"> - {MOD.LBL_EMAIL_EDITOR_OPTION} - </div> - </slot> - </td> - <td scope="row" valign="top"> - <slot> - {MOD.LBL_USE_TEMPLATE}  - </slot> - </td> - <td nowrap width="1"> - <slot> - <select tabindex='2' name='email_template' onchange="fill_email(this.options[this.selectedIndex].value);"> - {EMAIL_TEMPLATE_OPTIONS} - </select> - </slot> - </td> - </tr> - <tr> - <td valign="top" scope="row"> -   - </td> - <td colspan="4" > - {TINY} - <slot> - <div id="html_div"> - <textarea id="description_html" onblur="">{DESCRIPTION_HTML}</textarea> - </div> - <div id="alt_text_div"> - <input id="toggle_textarea_elem" onclick="toggle_textarea();" type="checkbox" name="toggle_html"> - {MOD.LBL_EDIT_ALT_TEXT} - </div> - <div id="text_div" style="display: none;"> - <textarea tabindex='5' id="description" name='description' cols="100" rows="20">{DESCRIPTION}</textarea> - </div> - </slot> - </td> -<!-- END: htmlarea --> - </tr> - <tr> - <td valign="top" scope="row"> - {MOD.LBL_ATTACHMENTS} - </td> - <td colspan="4"> - {ATTACHMENTS_JAVASCRIPT} {ATTACHMENTS} - <div id="template_attachments"> - </div> - <div id="uploads_div"> - <div style="display: none" id="file0"> - <input id='email_attachment0' name='email_attachment0' tabindex='0' size='40' type='file' /> -  <input type="button" onclick="deleteFile('0');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="file1"> - <input id='email_attachment1' name='email_attachment1' tabindex='0' size='40' type='file' /> -  <input type="button" onclick="deleteFile('1');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="file2"> - <input id='email_attachment2' name='email_attachment2' tabindex='0' size='40' type='file' /> -  <input type="button" onclick="deleteFile('2');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="file3"> - <input id='email_attachment3' name='email_attachment3' tabindex='0' size='40' type='file' /> -  <input type="button" onclick="deleteFile('3');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="file4"> - <input id='email_attachment4' name='email_attachment4' tabindex='0' size='40' type='file' /> -  <input type="button" onclick="deleteFile('4');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="file5"> - <input id='email_attachment5' name='email_attachment5' tabindex='0' size='40' type='file' /> -  <input type="button" onclick="deleteFile('5');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="file6"> - <input id='email_attachment6' name='email_attachment6' tabindex='0' size='40' type='file' /> -  <input type="button" onclick="deleteFile('6');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="file7"> - <input id='email_attachment7' name='email_attachment7' tabindex='0' size='40' type='file' /> -  <input type="button" onclick="deleteFile('7');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="file8"> - <input id='email_attachment8' name='email_attachment8' tabindex='0' size='40' type='file' /> -  <input type="button" onclick="deleteFile('8');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="file9"> - <input id='email_attachment9' name='email_attachment9' tabindex='0' size='40' type='file' /> -  <input type="button" onclick="deleteFile('9');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="document0"> - <input name='documentId0' id='documentId0' tabindex='0' type='hidden' /> - <input name='documentName0' id='documentName0' disabled size='40' type='text' /> -  <input type="button" onclick="selectDocument('0');" class="button" value="{APP.LBL_SELECT_BUTTON_LABEL}" /><input type="button" onclick="deleteDocument('0');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="document1"> - <input name='documentId1' id='documentId1' tabindex='1' type='hidden' /> - <input name='documentName1' id='documentName1' disabled size='40' type='text' /> -  <input type="button" onclick="selectDocument('1');" class="button" value="{APP.LBL_SELECT_BUTTON_LABEL}" /><input type="button" onclick="deleteDocument('1');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="document2"> - <input name='documentId2' id='documentId2' tabindex='2' type='hidden' /> - <input name='documentName2' id='documentName2' disabled size='40' type='text' /> -  <input type="button" onclick="selectDocument('2');" class="button" value="{APP.LBL_SELECT_BUTTON_LABEL}" /><input type="button" onclick="deleteDocument('2');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="document3"> - <input name='documentId3' id='documentId3' tabindex='3' type='hidden' /> - <input name='documentName3' id='documentName3' disabled size='40' type='text' /> -  <input type="button" onclick="selectDocument('3');" class="button" value="{APP.LBL_SELECT_BUTTON_LABEL}" /><input type="button" onclick="deleteDocument('3');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="document4"> - <input name='documentId4' id='documentId4' tabindex='4' type='hidden' /> - <input name='documentName4' id='documentName4' disabled size='40' type='text' /> -  <input type="button" onclick="selectDocument('4');" class="button" value="{APP.LBL_SELECT_BUTTON_LABEL}" /><input type="button" onclick="deleteDocument('4');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="document5"> - <input name='documentId5' id='documentId5' tabindex='5' type='hidden' /> - <input name='documentName5' id='documentName5' disabled size='40' type='text' /> -  <input type="button" onclick="selectDocument('5');" class="button" value="{APP.LBL_SELECT_BUTTON_LABEL}" /><input type="button" onclick="deleteDocument('5');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="document6"> - <input name='documentId6' id='documentId6' tabindex='6' type='hidden' /> - <input name='documentName6' id='documentName6' disabled size='40' type='text' /> -  <input type="button" onclick="selectDocument('6');" class="button" value="{APP.LBL_SELECT_BUTTON_LABEL}" /><input type="button" onclick="deleteDocument('6');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="document7"> - <input name='documentId7' id='documentId7' tabindex='7' type='hidden' /> - <input name='documentName7' id='documentName7' disabled size='40' type='text' /> -  <input type="button" onclick="selectDocument('7');" class="button" value="{APP.LBL_SELECT_BUTTON_LABEL}" /><input type="button" onclick="deleteDocument('7');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="document8"> - <input name='documentId8' id='documentId8' tabindex='8' type='hidden' /> - <input name='documentName8' id='documentName8' disabled size='40' type='text' /> -  <input type="button" onclick="selectDocument('8');" class="button" value="{APP.LBL_SELECT_BUTTON_LABEL}" /><input type="button" onclick="deleteDocument('8');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - <div style="display: none" id="document9"> - <input name='documentId9' id='documentId9' tabindex='9' type='hidden' /> - <input name='documentName9' id='documentName9' disabled size='40' type='text' /> -  <input type="button" onclick="selectDocument('9');" class="button" value="{APP.LBL_SELECT_BUTTON_LABEL}" /><input type="button" onclick="deleteDocument('9');" class="button" value="{APP.LBL_REMOVE}" /> - </div> - </div> - <input type="button" name="add_file_button" onclick="addFile();" value="{MOD.LBL_ADD_FILE}" class="button" /> - <input type="button" name="add_document_button" onclick="addDocument();" value="{MOD.LBL_ADD_DOCUMENT}" class="button" /> - </td> - </tr> - </table> - </td> - </tr> - </table> -</form> -{JAVASCRIPT} -<script type="text/javascript" language="Javascript"> - var old_load=window.onload; window.onload = function() { - old_load(); - setEditor(); - - // cn: bug 5845 - use Group Inbox From info - if(window.switchEmail) { - switchEmail(); - } - } -</script> -<!-- END: main --> \ No newline at end of file diff --git a/modules/Emails/EditView.php b/modules/Emails/EditView.php index 9074eeaa..13c89e92 100644 --- a/modules/Emails/EditView.php +++ b/modules/Emails/EditView.php @@ -183,9 +183,6 @@ if($email_type == 'archived') { } // if header("Location: index.php?module=Emails&action=Compose&record=$focus->id&replyForward=true&reply=$replyType"); return; - - echo getClassicModuleTitle('Emails', array($mod_strings['LBL_COMPOSE_MODULE_NAME']), true); - $xtpl=new XTemplate('modules/Emails/EditView.html'); } echo "\n</p>\n"; diff --git a/modules/Emails/EditViewArchive.html b/modules/Emails/EditViewArchive.html index 8cfdf946..ee4d41e6 100644 --- a/modules/Emails/EditViewArchive.html +++ b/modules/Emails/EditViewArchive.html @@ -119,7 +119,7 @@ <!-- BEGIN: open_source_1 --> <td colspan="2"><slot></slot></td> <!-- END: open_source_1 --> - + <td width="25%" scope="row" valign="top" align="left"><slot> <select tabindex='2' id='parent_type' name='parent_type' onchange="document.EditView.parent_name.value=''; changeQS(); checkParentType(document.EditView.parent_type.value, document.EditView.change_parent);">{TYPE_OPTIONS}</select>  @@ -162,7 +162,7 @@ <td colspan="1"> </td> <td colspan="4">{MOD.LBL_NOTE_SEMICOLON}</td> </tr> - + <tr valign="top"> <td scope="row"><slot>{MOD.LBL_TO}</slot></td> <td colspan="4" nowrap="nowrap"><slot> @@ -180,8 +180,8 @@ </table> </slot></td> </tr> - - <tr> + + <tr> <td scope="row"><slot>{MOD.LBL_CC}</slot></td> <td colspan="4" nowrap="nowrap"><slot> <table cellspacing="0" cellpadding="0" border="0"> @@ -198,7 +198,7 @@ </table> </slot></td> </tr> - + <tr valign="top"> <td scope="row"><slot>{MOD.LBL_BCC}</slot></td> <td colspan="4" nowrap="nowrap"><slot> @@ -255,11 +255,11 @@ <!-- BEGIN: htmlarea --> <td colspan="4" ><slot> <textarea name="description_html" id="description_html">{DESCRIPTION_HTML}</textarea> - - <div id="alt_text_div"> + + <div id="alt_text_div"> <input id="toggle_textarea_elem" onclick="toggle_textarea();" type="checkbox" name="toggle_html"> {MOD.LBL_EDIT_ALT_TEXT} </div> - + <div id="text_div" style="display: none;"> <textarea tabindex='5' name='description' cols="100" rows="20"> {DESCRIPTION} diff --git a/modules/Emails/EmailUIAjax.php b/modules/Emails/EmailUIAjax.php index 4c400503..891bde80 100644 --- a/modules/Emails/EmailUIAjax.php +++ b/modules/Emails/EmailUIAjax.php @@ -59,6 +59,7 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); $showFolders = unserialize(base64_decode($current_user->getPreference('showFolders', 'Emails'))); + if (isset($_REQUEST['emailUIAction'])) { switch($_REQUEST['emailUIAction']) { @@ -1608,7 +1609,8 @@ eoq; $GLOBALS['log']->debug("********** EMAIL 2.0 - Asynchronous - at: default"); echo "NOOP"; break; - } + } // switch + } // if diff --git a/modules/Emails/javascript/Email.js b/modules/Emails/javascript/Email.js index 74757123..b401df7d 100644 --- a/modules/Emails/javascript/Email.js +++ b/modules/Emails/javascript/Email.js @@ -298,7 +298,7 @@ function multiFiles( list_target){ new_row_button_remove.onclick = function() { var filePathComponents = this.parentNode.element.value.split("\\"), fileName = (filePathComponents[filePathComponents.length - 1]), - + // tinymce related tiny = tinyMCE.getInstanceById('body_text'), currValTiny = tiny.getContent(); @@ -713,30 +713,6 @@ function toggle_textarea() { /////////////////////////////////////////////////////////////////////////////// //// EMAIL TEMPLATE CODE -function fill_email(id) { - var where = "parent_id='" + id + "'"; - var order = ''; - - if(id == '') { - // query based on template, contact_id0,related_to - if(! append) { - document.EditView.name.value = ''; - document.EditView.description.value = ''; - document.EditView.description_html.value = ''; - } - return; - } - call_json_method('EmailTemplates','retrieve','record='+id,'email_template_object', appendEmailTemplateJSON); - args = {"module":"Notes","where":where, "order":order}; - - if(typeof(global_rpcClient) == 'undefined') { - global_rpcClient = new SugarRPCClient(); - } - - req_id = global_rpcClient.call_method('get_full_list', args); - global_request_registry[req_id] = [ejo, 'display']; -} - function appendEmailTemplateJSON() { // query based on template, contact_id0,related_to if(document.EditView.name.value == '') { // cn: bug 7743, don't stomp populated Subject Line diff --git a/modules/Emails/javascript/EmailUICompose.js b/modules/Emails/javascript/EmailUICompose.js index c9a23d2d..2a3e6478 100644 --- a/modules/Emails/javascript/EmailUICompose.js +++ b/modules/Emails/javascript/EmailUICompose.js @@ -902,7 +902,7 @@ SE.composeLayout = { SE.composeLayout[idx].getUnitByPosition("right").collapse(); //Initialize tinyMCE SE.composeLayout._1_tiny(false); - + //Init templates and address book SE.composeLayout._2_final(); @@ -1311,15 +1311,15 @@ SE.composeLayout = { var box_title = mod_strings.LBL_EMAILTEMPLATE_MESSAGE_SHOW_TITLE; var box_msg = mod_strings.LBL_EMAILTEMPLATE_MESSAGE_SHOW_MSG; var box_none_msg = mod_strings.LBL_EMAILTEMPLATE_MESSAGE_CLEAR_MSG; - + //bug #6224 var to_addr = document.getElementById('addressTO'+idx); - if (to_addr.value.search(/[^;,]{6,}[;,][^;,]{6,}/) != -1) + if (to_addr.value.search(/[^;,]{6,}[;,][^;,]{6,}/) != -1) { box_title = mod_strings.LBL_EMAILTEMPLATE_MESSAGE_WARNING_TITLE; box_msg = mod_strings.LBL_EMAILTEMPLATE_MESSAGE_MULTIPLE_RECIPIENTS + '<br /><br />' + box_msg; } - + // id is selected index of email template drop-down if(id == '' || id == "0") { YAHOO.SUGAR.MessageBox.show({ @@ -1356,13 +1356,19 @@ SE.composeLayout = { if (start > -1) { tinyHTML = tinyHTML.substr(start); tiny.setContent(tinyHTML); - } else { + } else { tiny.setContent(''); } }, processResult : function(idx , id){ - call_json_method('EmailTemplates','retrieve','record='+id,'email_template_object', this.appendEmailTemplateJSON); + var post_data = {"module":"EmailTemplates","record":id}; + var global_rpcClient = new SugarRPCClient(); + + result = global_rpcClient.call_method('retrieve', post_data, true); + if(!result['record']) return; + json_objects['email_template_object'] = result['record']; + this.appendEmailTemplateJSON(); // get attachments if any AjaxObject.target = ''; @@ -1435,8 +1441,8 @@ SE.composeLayout = { } - var openTag = '<div><span><span>'; - var closeTag = '</span></span></div>'; + var openTag = '<div><span> </span>'; + var closeTag = '<span> </span></div>'; var t = tinyMCE.getInstanceById('htmleditor' + idx); //IE 6 Hack if(typeof(t) != 'undefined') @@ -1497,7 +1503,14 @@ SE.composeLayout = { } else if(SUGAR.email2.userPrefs.signatures.signature_prepend == 'true') { var newHtml = '<br/>' + openTag + newSignature + closeTag + html; } else { - var newHtml = html + openTag + newSignature + closeTag; + var body = html.indexOf('</body>'); + if (body > -1) { + var part1 = html.substr(0, body); + var part2 = html.substr(body, html.length); + var newHtml = part1 + openTag + newSignature + closeTag + part2; + } else { + var newHtml = html + openTag + newSignature + closeTag; + } } //tinyMCE.setContent(newHtml); t.setContent(newHtml); @@ -1754,7 +1767,7 @@ SE.composeLayout = { var form = document.getElementById('emailCompose' + idx); var composeOptionsFormName = "composeOptionsForm" + idx; - + var t = SE.util.getTiny(SE.tinyInstances.currentHtmleditor); if (t != null || typeof(t) != "undefined") { var html = t.getContent(); diff --git a/modules/Emails/javascript/grid.js b/modules/Emails/javascript/grid.js index 3ddc1bc1..c67f5376 100644 --- a/modules/Emails/javascript/grid.js +++ b/modules/Emails/javascript/grid.js @@ -211,8 +211,8 @@ function gridInit() { //Override Paging request construction grid.set("generateRequest", function(oState, oSelf) { oState = oState || {pagination:null, sortedBy:null}; - var sort = (oState.sortedBy) ? oState.sortedBy.key : oSelf.getColumnSet().keys[1].getKey(); - var dir = (oState.sortedBy && oState.sortedBy.dir === YAHOO.widget.DataTable.CLASS_DESC) ? "desc" : "asc"; + var sort = (oState.sortedBy) ? oState.sortedBy.key : oSelf.getColumnSet().keys[5].getKey(); + var dir = (oState.sortedBy && oState.sortedBy.dir === YAHOO.widget.DataTable.CLASS_ASC) ? "asc" : "desc"; var startIndex = (oState.pagination) ? oState.pagination.recordOffset : 0; var results = (oState.pagination) ? oState.pagination.rowsPerPage : null; // Build the request diff --git a/modules/Emails/templates/_baseEmail.tpl b/modules/Emails/templates/_baseEmail.tpl index f6888b28..9d8fd860 100644 --- a/modules/Emails/templates/_baseEmail.tpl +++ b/modules/Emails/templates/_baseEmail.tpl @@ -41,6 +41,8 @@ <script type="text/javascript" src='{sugar_getjspath file='include/javascript/tiny_mce/tiny_mce.js'}'></script> <script type="text/javascript" src='{sugar_getjspath file='include/javascript/sugar_grp_emails.js'}'></script> <script type="text/javascript" src='{sugar_getjspath file='include/javascript/sugar_grp_yui_widgets.js'}'></script> +<script type="text/javascript" src="include/javascript/jsclass_base.js"></script> +<script type="text/javascript" src="include/javascript/jsclass_async.js"></script> <script type="text/javascript" language="Javascript"> diff --git a/modules/Employees/Save.php b/modules/Employees/Save.php index 231a7d66..60ce7a1e 100644 --- a/modules/Employees/Save.php +++ b/modules/Employees/Save.php @@ -49,10 +49,23 @@ $tabs_def = urldecode(isset($_REQUEST['display_tabs_def']) ? $_REQUEST['display_ $DISPLAY_ARR = array(); parse_str($tabs_def,$DISPLAY_ARR); +//there was an issue where a non-admin user could use a proxy tool to intercept the save on their own Employee +//record and swap out their record_id with the admin employee_id which would cause the email address +//of the non-admin user to be associated with the admin user thereby allowing the non-admin to reset the password +//of the admin user. +if(isset($_POST['record']) && !is_admin($GLOBALS['current_user']) && !$GLOBALS['current_user']->isAdminForModule('Employees') && ($_POST['record'] != $GLOBALS['current_user']->id)) +{ + sugar_die("Unauthorized access to administration."); +} +elseif (!isset($_POST['record']) && !is_admin($GLOBALS['current_user']) && !$GLOBALS['current_user']->isAdminForModule('Employees')) +{ + sugar_die ("Unauthorized access to user administration."); +} $focus = new Employee(); $focus->retrieve($_POST['record']); + //rrs bug: 30035 - I am not sure how this ever worked b/c old_reports_to_id was not populated. $old_reports_to_id = $focus->reports_to_id; diff --git a/modules/Home/UnifiedSearchAdvanced.php b/modules/Home/UnifiedSearchAdvanced.php index 90e12f2c..02e88243 100644 --- a/modules/Home/UnifiedSearchAdvanced.php +++ b/modules/Home/UnifiedSearchAdvanced.php @@ -399,7 +399,13 @@ class UnifiedSearchAdvanced { { require "custom/modules/{$moduleName}/metadata/SearchFields.php" ; } - + + //If there are $searchFields are empty, just continue, there are no search fields defined for the module + if(empty($searchFields)) + { + continue; + } + $isCustomModule = preg_match('/^([a-z0-9]{1,5})_([a-z0-9_]+)$/i' , $moduleName); //If the bean supports unified search or if it's a custom module bean and unified search is not defined @@ -429,6 +435,17 @@ class UnifiedSearchAdvanced { } } + foreach ($searchFields[$moduleName] as $field => $def) + { + if ( + isset($def['force_unifiedsearch']) + and $def['force_unifiedsearch'] + ) + { + $fields[$field] = $def; + } + } + if(count($fields) > 0) { $supported_modules [$moduleName] ['fields'] = $fields; if (isset($dictionary[$beanName]['unified_search_default_enabled']) && $dictionary[$beanName]['unified_search_default_enabled'] === TRUE) diff --git a/modules/Home/index.php b/modules/Home/index.php index 76047e8c..8c6c8097 100644 --- a/modules/Home/index.php +++ b/modules/Home/index.php @@ -239,13 +239,13 @@ foreach($pages[$activePage]['columns'] as $colNum => $column) { } array_push($dashletIds, $id); - + $dashlets = $current_user->getPreference('dashlets', 'Home'); // Using hardcoded 'Home' because DynamicAction.php $_REQUEST['module'] value is always Home $lvsParams = array(); if(!empty($dashlets[$id]['sort_options'])){ $lvsParams = $dashlets[$id]['sort_options']; } - + $dashlet->process($lvsParams); try { $display[$colNum]['dashlets'][$id]['display'] = $dashlet->display(); diff --git a/modules/Import/tpls/step1.tpl b/modules/Import/tpls/step1.tpl index 92b9df43..5ed92cde 100644 --- a/modules/Import/tpls/step1.tpl +++ b/modules/Import/tpls/step1.tpl @@ -166,13 +166,13 @@ </tr> <tr> <td scope="row" colspan="3"> - <input class="radio" type="radio" name="type" value="import" {if $selectedData->type == 'import' or !$selectedData->type}checked="checked"{/if} /> + <input class="radio" id="action_create" type="radio" name="type" value="import" {if $selectedData->type == 'import' or !$selectedData->type}checked="checked"{/if} />  {$MOD.LBL_IMPORT_BUTTON} </td> </tr> <tr> <td scope="row" colspan="3"> - <input class="radio" type="radio" name="type" value="update" {if $selectedData->type == 'update'}checked="checked"{/if} /> + <input class="radio" id="action_create_and_update" type="radio" name="type" value="update" {if $selectedData->type == 'update'}checked="checked"{/if} />  {$MOD.LBL_UPDATE_BUTTON} </td> </tr> diff --git a/modules/Import/views/view.step4.php b/modules/Import/views/view.step4.php index 39a6b52c..0083d603 100644 --- a/modules/Import/views/view.step4.php +++ b/modules/Import/views/view.step4.php @@ -623,7 +623,7 @@ class ImportViewStep4 extends SugarView ) { return preg_replace_callback( - '|[^A-Za-z0-9\-]|', + '|[^A-Za-z0-9\-\.]|', create_function( // single quotes are essential here, // or alternative escape all $ as \$ diff --git a/modules/InboundEmail/DetailView.html b/modules/InboundEmail/DetailView.html index 18ef8abb..0d292f05 100644 --- a/modules/InboundEmail/DetailView.html +++ b/modules/InboundEmail/DetailView.html @@ -63,7 +63,7 @@ <input title="{APP.LBL_DUPLICATE_BUTTON_TITLE}" accessKey="{APP.LBL_DUPLICATE_BUTTON_KEY}" class="button" onclick="this.form.return_module.value='InboundEmail'; this.form.return_action.value='index'; this.form.isDuplicate.value=true; this.form.action.value='EditView'" type="submit" name="Duplicate" value=" {APP.LBL_DUPLICATE_BUTTON_LABEL} "> -<input title="{APP.LBL_DELETE_BUTTON_TITLE}" accessKey="{APP.LBL_DELETE_BUTTON_KEY}" class="button" onclick="this.form.return_module.value='InboundEmail'; this.form.return_action.value='ListView'; this.form.action.value='Delete'; return confirm('{APP.NTC_DELETE_CONFIRMATION}')" type="submit" name="Delete" value=" {APP.LBL_DELETE_BUTTON_LABEL} "> +<input title="{APP.LBL_DELETE_BUTTON_TITLE}" accessKey="{APP.LBL_DELETE_BUTTON_KEY}" class="button" onclick="this.form.return_module.value='InboundEmail'; this.form.return_action.value='ListView'; this.form.action.value='Delete'; return confirm('{APP.NTC_DELETE_CONFIRMATION}')" type="submit" name="Delete" id="Delete" value=" {APP.LBL_DELETE_BUTTON_LABEL} "> </form> </td> </tr> diff --git a/modules/InboundEmail/EditView.html b/modules/InboundEmail/EditView.html index 3edaadf5..b329d217 100644 --- a/modules/InboundEmail/EditView.html +++ b/modules/InboundEmail/EditView.html @@ -66,7 +66,7 @@ <table width="100%" cellpadding="0" cellspacing="0" border="0"> <tr> <td> - <input title="{APP.LBL_SAVE_BUTTON_TITLE}" accessKey="{APP.LBL_SAVE_BUTTON_KEY}" class="button" onclick="this.form.action.value='Save'; {CHOOSER_SCRIPT} this.form.return_id.value='{RETURN_ID}'; return checkformdata()" type="submit" name="button" value=" {APP.LBL_SAVE_BUTTON_LABEL} " {IE_DISABLED}> + <input title="{APP.LBL_SAVE_BUTTON_TITLE}" accessKey="{APP.LBL_SAVE_BUTTON_KEY}" class="button" onclick="this.form.action.value='Save'; {CHOOSER_SCRIPT} this.form.return_id.value='{RETURN_ID}'; return checkformdata()" type="submit" name="button" id="button" value=" {APP.LBL_SAVE_BUTTON_LABEL} " {IE_DISABLED}> <input title="{APP.LBL_CANCEL_BUTTON_TITLE}" accessKey="{APP.LBL_CANCEL_BUTTON_KEY}" class="button" onclick="this.form.action.value='{RETURN_ACTION}'; this.form.module.value='{RETURN_MODULE}'; this.form.record.value='{RETURN_ID}'; if(this.form.record.value == '' && this.form.origin_id.value != '') this.form.record.value=this.form.origin_id.value;" type="submit" name="button" value=" {APP.LBL_CANCEL_BUTTON_LABEL} "> <input title="{MOD.LBL_TEST_BUTTON_TITLE}" type='button' @@ -93,7 +93,7 @@ <td valign="top" scope="row" width="15%" NOWRAP> <slot>{MOD.LBL_NAME}: <span class="required">{APP.LBL_REQUIRED_SYMBOL}</span> </slot></td> <td valign="top" width="35%"> - <slot><input name='name' tabindex='10' size='30' maxlength='255' type="text" value="{NAME}" {IE_DISABLED}></slot></td> + <slot><input name='name' id='name' tabindex='10' size='30' maxlength='255' type="text" value="{NAME}" {IE_DISABLED}></slot></td> <td valign="top" scope="row"> <slot>{MOD.LBL_STATUS}: </slot></td> <td valign="top" width="35%"><slot> @@ -108,7 +108,7 @@ <slot>{MOD.LBL_LOGIN}: <span class="required">{APP.LBL_REQUIRED_SYMBOL}</span> </slot></td> <td valign="top" width="35%"> - <slot><input name='email_user' tabindex='70' size='30' maxlength='100' type="text" value="{USER}" autocomplete="off" {IE_DISABLED}></slot></td> + <slot><input name='email_user' id='email_user' tabindex='70' size='30' maxlength='100' type="text" value="{USER}" autocomplete="off" {IE_DISABLED}></slot></td> </tr> <tr> <td valign="top" scope="row" width="15%" NOWRAP> diff --git a/modules/Leads/metadata/convertdefs.php b/modules/Leads/metadata/convertdefs.php index beecbfeb..bb130a02 100644 --- a/modules/Leads/metadata/convertdefs.php +++ b/modules/Leads/metadata/convertdefs.php @@ -257,6 +257,7 @@ $viewdefs['Calls']['ConvertLead'] = array( $viewdefs['Meetings']['ConvertLead'] = array( 'copyData' => false, 'required' => false, + 'relationship' => 'meetings_users', 'templateMeta' => array( 'form'=>array( 'hidden'=>array( diff --git a/modules/Leads/metadata/popupdefs.php b/modules/Leads/metadata/popupdefs.php index 6a867fa0..dc6f5eda 100644 --- a/modules/Leads/metadata/popupdefs.php +++ b/modules/Leads/metadata/popupdefs.php @@ -67,6 +67,7 @@ $popupMeta = array ( 'name' => 'last_name', 'width' => '10%', ), + 'email', 'account_name' => array ( 'type' => 'varchar', diff --git a/modules/Leads/tpls/ConvertLead.tpl b/modules/Leads/tpls/ConvertLead.tpl index e68756dd..76af71ec 100644 --- a/modules/Leads/tpls/ConvertLead.tpl +++ b/modules/Leads/tpls/ConvertLead.tpl @@ -79,7 +79,7 @@ </td><td> {sugar_translate label='{{$label}}' module='Leads'} </td><td> -{if !empty($def.select)} +{{if !empty($def.select)}} {sugar_translate label='LNK_SELECT_{{$module|strtoupper}}' module='Leads'} {if $def.required } <span class="required">{{$APP.LBL_REQUIRED_SYMBOL}}</span> @@ -101,7 +101,7 @@ sqs_objects['{{$form_name}}_{{$def.select}}'] = {ldelim} limit : '10' {rdelim} </script> -{/if} +{{/if}} </td></tr></table> </h4> <table width="100%" border="0" cellspacing="1" cellpadding="0" class="{$def.templateMeta.panelClass|default:'edit view'}" id ="create{{$module}}" {if !$def.required || !empty($def.select)}style="display:none"{/if}> diff --git a/modules/Leads/vardefs.php b/modules/Leads/vardefs.php index eb9cfcaf..ef2905de 100644 --- a/modules/Leads/vardefs.php +++ b/modules/Leads/vardefs.php @@ -307,6 +307,20 @@ $dictionary['Lead'] = array('table' => 'leads','audited'=>true, 'unified_search' 'options' => 'dom_meeting_accept_status', 'importable' => 'false', ), + //bug 42902 + 'email'=> array( + 'name' => 'email', + 'type' => 'email', + 'query_type' => 'default', + 'source' => 'non-db', + 'operator' => 'subquery', + 'subquery' => 'SELECT eabr.bean_id FROM email_addr_bean_rel eabr JOIN email_addresses ea ON (ea.id = eabr.email_address_id) WHERE eabr.deleted=0 AND ea.email_address LIKE', + 'db_field' => array( + 'id', + ), + 'vname' =>'LBL_ANY_EMAIL', + 'studio' => array('visible'=>false, 'searchview'=>true), + ), 'webtolead_email1' => array ( 'name' => 'webtolead_email1', @@ -421,7 +435,7 @@ $dictionary['Lead'] = array('table' => 'leads','audited'=>true, 'unified_search' array ( 'name' => 'calls', 'type' => 'link', - 'relationship' => 'calls_leads', + 'relationship' => 'lead_calls', 'source'=>'non-db', 'vname'=>'LBL_CALLS', ), diff --git a/modules/Leads/views/view.convertlead.php b/modules/Leads/views/view.convertlead.php index 39d140bf..62948d83 100644 --- a/modules/Leads/views/view.convertlead.php +++ b/modules/Leads/views/view.convertlead.php @@ -161,6 +161,23 @@ class ViewConvertLead extends SugarView //Special case where company and person have the same field with a different name $focus->phone_office = $this->focus->phone_work; } + else if (strpos($field, "billing_address") !== false && $focus->field_defs[$field]["type"] == "varchar") /* Bug 42219 fix */ + { + $tmp_field = str_replace("billing_", "primary_", $field); + $focus->field_defs[$field]["type"] = "text"; + if (isset($this->focus->$tmp_field)) { + $focus->$field = $this->focus->$tmp_field; + } + } + + else if (strpos($field, "shipping_address") !== false && $focus->field_defs[$field]["type"] == "varchar") /* Bug 42219 fix */ + { + $tmp_field = str_replace("shipping_", "primary_", $field); + if (isset($this->focus->$tmp_field)) { + $focus->$field = $this->focus->$tmp_field; + } + $focus->field_defs[$field]["type"] = "text"; + } else if (isset($this->focus->$field)) { $focus->$field = $this->focus->$field; @@ -284,17 +301,17 @@ class ViewConvertLead extends SugarView */ protected function handleSave() { - require_once('modules/Campaigns/utils.php'); + require_once('modules/Campaigns/utils.php'); require_once("include/formbase.php"); - $lead = false; - if (!empty($_REQUEST['record'])) - { - $lead = new Lead(); - $lead->retrieve($_REQUEST['record']); - } + $lead = false; + if (!empty($_REQUEST['record'])) + { + $lead = new Lead(); + $lead->retrieve($_REQUEST['record']); + } - global $beanList; - $this->loadDefs(); + global $beanList; + $this->loadDefs(); $beans = array(); $selectedBeans = array(); $selects = array(); @@ -304,39 +321,46 @@ class ViewConvertLead extends SugarView $beans['Contacts']->new_with_id = true; // Bug 39287 - Check for Duplicates on selected modules before save - if ( !empty($_REQUEST['selectedContact']) ) { + if (!empty($_REQUEST['selectedContact'])) + { $beans['Contacts']->retrieve($_REQUEST['selectedContact']); - if ( !empty($beans['Contacts']->id) ) { + if (!empty($beans['Contacts']->id)) + { $beans['Contacts']->new_with_id = false; unset($_REQUEST["convert_create_Contacts"]); unset($_POST["convert_create_Contacts"]); } } - elseif (!empty($_REQUEST["convert_create_Contacts"]) && $_REQUEST["convert_create_Contacts"] != "false" && !isset($_POST['ContinueContact'])) { + elseif (!empty($_REQUEST["convert_create_Contacts"]) && $_REQUEST["convert_create_Contacts"] != "false" && !isset($_POST['ContinueContact'])) + { require_once('modules/Contacts/ContactFormBase.php'); $contactForm = new ContactFormBase(); $duplicateContacts = $contactForm->checkForDuplicates('Contacts'); - if(isset($duplicateContacts)){ + if (isset($duplicateContacts)) + { echo $contactForm->buildTableForm($duplicateContacts, 'Contacts'); return; } } - if ( !empty($_REQUEST['selectedAccount']) ) { + if (!empty($_REQUEST['selectedAccount'])) + { $_REQUEST['account_id'] = $_REQUEST['selectedAccount']; - unset($_REQUEST["convert_create_Accounts"]); - unset($_POST["convert_create_Accounts"]); + unset($_REQUEST["convert_create_Accounts"]); + unset($_POST["convert_create_Accounts"]); } - elseif (!empty($_REQUEST["convert_create_Accounts"]) && $_REQUEST["convert_create_Accounts"] != "false" && empty($_POST['ContinueAccount'])){ + elseif (!empty($_REQUEST["convert_create_Accounts"]) && $_REQUEST["convert_create_Accounts"] != "false" && empty($_POST['ContinueAccount'])) + { require_once('modules/Accounts/AccountFormBase.php'); $accountForm = new AccountFormBase(); $duplicateAccounts = $accountForm->checkForDuplicates('Accounts'); - if(isset($duplicateAccounts)){ + if (isset($duplicateAccounts)) + { echo $accountForm->buildTableForm($duplicateAccounts); return; } } - foreach($this->defs as $module => $vdef) + foreach ($this->defs as $module => $vdef) { //Create a new record if "create" was selected if (!empty($_REQUEST["convert_create_$module"]) && $_REQUEST["convert_create_$module"] != "false") @@ -350,90 +374,116 @@ class ViewConvertLead extends SugarView } //If an existing bean was selected, relate it to the contact - else if (!empty($vdef['ConvertLead']['select'])) { - //Save the new record + else if (!empty($vdef['ConvertLead']['select'])) + { + //Save the new record $select = $vdef['ConvertLead']['select']; - $fieldDef = $beans['Contacts']->field_defs[$select]; - if (!empty($fieldDef['id_name']) && !empty($_REQUEST[$fieldDef['id_name']])) - { - $beans['Contacts']->$fieldDef['id_name'] = $_REQUEST[$fieldDef['id_name']]; - $selects[$module] = $_REQUEST[$fieldDef['id_name']]; - if (!empty($_REQUEST[$select])) - { - $beans['Contacts']->$select = $_REQUEST[$select]; - } - // Bug 39268 - Add the existing beans to a list of beans we'll potentially add the lead's activities to - $bean = loadBean($module); + $fieldDef = $beans['Contacts']->field_defs[$select]; + if (!empty($fieldDef['id_name']) && !empty($_REQUEST[$fieldDef['id_name']])) + { + $beans['Contacts']->$fieldDef['id_name'] = $_REQUEST[$fieldDef['id_name']]; + $selects[$module] = $_REQUEST[$fieldDef['id_name']]; + if (!empty($_REQUEST[$select])) + { + $beans['Contacts']->$select = $_REQUEST[$select]; + } + // Bug 39268 - Add the existing beans to a list of beans we'll potentially add the lead's activities to + $bean = loadBean($module); $bean->retrieve($_REQUEST[$fieldDef['id_name']]); $selectedBeans[$module] = $bean; - } + } } } - $this->handleActivities($lead, $beans); - // Bug 39268 - Add the lead's activities to the selected beans - $this->handleActivities($lead, $selectedBeans); + $this->handleActivities($lead, $beans); + // Bug 39268 - Add the lead's activities to the selected beans + $this->handleActivities($lead, $selectedBeans); - //link selected account to lead if it exists - if(!empty($selectedBeans['Accounts'])){ + //link selected account to lead if it exists + if (!empty($selectedBeans['Accounts'])) + { $lead->account_id = $selectedBeans['Accounts']->id; } //Handle non-contacts relationships - foreach($beans as $bean) + foreach ($beans as $bean) { - if (!empty($lead)) - { - if (empty($bean->assigned_user_id)) - { - $bean->assigned_user_id = $lead->assigned_user_id; - } - $leadsRel = $this->findRelationship($bean, $lead); - if (!empty($leadsRel)) - { - - $bean->load_relationship ($leadsRel) ; - $relObject = $bean->$leadsRel->getRelationshipObject(); - if ($relObject->relationship_type == "one-to-many" && $bean->$leadsRel->_get_bean_position()) - { - $id_field = $relObject->rhs_key; - $lead->$id_field = $bean->id; - } else { - $bean->$leadsRel->add($lead->id); - } - } - } - //Special case code for opportunities->Accounts - if ($bean->object_name == "Opportunity" && empty($bean->account_id)) - { - if( isset($beans['Accounts'])) { - $bean->account_id = $beans['Accounts']->id; - $bean->account_name = $beans['Accounts']->name; - } - else if (!empty($selects['Accounts'])){ - $bean->account_id = $selects['Accounts']; - } - } + if (!empty($lead)) + { + if (empty($bean->assigned_user_id)) + { + $bean->assigned_user_id = $lead->assigned_user_id; + } + $leadsRel = $this->findRelationship($bean, $lead); + if (!empty($leadsRel)) + { + $bean->load_relationship($leadsRel); + $relObject = $bean->$leadsRel->getRelationshipObject(); + if ($relObject->relationship_type == "one-to-many" && $bean->$leadsRel->_get_bean_position()) + { + $id_field = $relObject->rhs_key; + $lead->$id_field = $bean->id; + } + else + { + $bean->$leadsRel->add($lead->id); + } + } + } + //Special case code for opportunities->Accounts + if ($bean->object_name == "Opportunity" && empty($bean->account_id)) + { + if (isset($beans['Accounts'])) + { + $bean->account_id = $beans['Accounts']->id; + $bean->account_name = $beans['Accounts']->name; + } + else if (!empty($selects['Accounts'])) + { + $bean->account_id = $selects['Accounts']; + } + } - $this->copyAddressFields($bean, $beans['Contacts']); + //create meetings-users relationship + if ($bean->object_name == "Meeting") + { + $bean = $this->setMeetingsUsersRelationship($bean); + } + $this->copyAddressFields($bean, $beans['Contacts']); - $bean->save(); - //if campaign id exists then there should be an entry in campaign_log table for the newly created contact: bug 44522 - if(isset($lead->campaign_id) && $lead->campaign_id != null && $bean->object_name == "Contact"){ - campaign_log_lead_or_contact_entry($lead->campaign_id,$lead, $beans['Contacts'],'contact'); + $bean->save(); + //if campaign id exists then there should be an entry in campaign_log table for the newly created contact: bug 44522 + if (isset($lead->campaign_id) && $lead->campaign_id != null && $bean->object_name == "Contact") + { + campaign_log_lead_or_contact_entry($lead->campaign_id, $lead, $beans['Contacts'], 'contact'); } } if (!empty($lead)) - { //Mark the original Lead converted - $lead->status = "Converted"; - $lead->converted = '1'; - $lead->in_workflow = true; - $lead->save(); - } + { //Mark the original Lead converted + $lead->status = "Converted"; + $lead->converted = '1'; + $lead->in_workflow = true; + $lead->save(); + } $this->displaySaveResults($beans); } + public function setMeetingsUsersRelationship($bean) + { + global $current_user; + $meetingsRel = $this->findRelationshipByName($bean, $this->defs['Meetings']['ConvertLead']['relationship']); + if (!empty($meetingsRel)) + { + $bean->load_relationship($meetingsRel); + $bean->$meetingsRel->add($current_user->id); + return $bean; + } + else + { + return false; + } + } protected function displaySaveResults( $beans ) @@ -676,7 +726,8 @@ class ViewConvertLead extends SugarView require_once("modules/TableDictionary.php"); foreach ($from->field_defs as $field=>$def) { - if (isset($def['type']) && $def['type'] == "link" && isset($def['relationship'])) { + if (isset($def['type']) && $def['type'] == "link" && isset($def['relationship'])) + { $rel_name = $def['relationship']; $rel_def = ""; if (isset($dictionary[$from->object_name]['relationships']) && isset($dictionary[$from->object_name]['relationships'][$rel_name])) @@ -707,6 +758,19 @@ class ViewConvertLead extends SugarView return false; } + protected function findRelationshipByName($from, $rel_name) + { + global $dictionary; + require_once("modules/TableDictionary.php"); + foreach ($from->field_defs as $field => $def) + { + if (isset($def['relationship']) && $def['relationship'] == $rel_name) + { + return $field; + } + } + return false; + } /** * @see SugarView::_getModuleTitleParams() */ diff --git a/modules/MailMerge/Step1.php b/modules/MailMerge/Step1.php index 53320df7..dd08ab1a 100644 --- a/modules/MailMerge/Step1.php +++ b/modules/MailMerge/Step1.php @@ -229,14 +229,14 @@ if ($user_merge != 'on' || !isset($admin->settings['system_mailmerge_on']) || !$ $xtpl->parse("main"); $xtpl->out("main"); -function get_user_module_list($user){ +/*function get_user_module_list($user){ global $app_list_strings, $current_language; $app_list_strings = return_app_list_strings_language($current_language); $modules = query_module_access_list($user); global $modInvisList; return $modules; -} +}*/ function getDocumentRevisions() { diff --git a/modules/MailMerge/Step2.html b/modules/MailMerge/Step2.html index 7333bb29..8ce4046f 100644 --- a/modules/MailMerge/Step2.html +++ b/modules/MailMerge/Step2.html @@ -133,10 +133,13 @@ var mOffset = 0; var max = 20; var mWhere = "{MAILMERGE_WHERE}"; var orderBy = ''; +var relModule = ''; +var mTerm = ''; +YAHOO.namespace("mailmerge"); +YAHOO.mailmerge.cObj = null; function submit_form() { - document.MailMerge.action='index.php'; document.MailMerge.submit(); } @@ -144,9 +147,10 @@ function ResponseObj() { } -ResponseObj.prototype.response = function (result) +function ajaxSuccess(data) { - + var result = YAHOO.lang.JSON.parse(data.responseText); + result = result.result; var prevButton = document.getElementById("prevButton"); var nextButton = document.getElementById("nextButton"); @@ -159,7 +163,7 @@ ResponseObj.prototype.response = function (result) dispCount = result.result_count; nextItems_disabled = true; } - if(result.result_count < (mOffset + max)) + if(result.result_count <= (mOffset + max)) { nextItems_disabled = true; } @@ -218,6 +222,9 @@ ResponseObj.prototype.response = function (result) } function increaseOffset() { + if(isCallInProgress()) + return; + if(!nextItems_disabled) { mOffset += 20; getObjects(); @@ -226,12 +233,23 @@ function increaseOffset() function decreaseOffset() { + if(isCallInProgress()) + return; + if(!prevItems_disabled) { mOffset -= 20; getObjects(); } } +function isCallInProgress() +{ + if(YAHOO.mailmerge.cObj) + return YAHOO.util.Connect.isCallInProgress(YAHOO.mailmerge.cObj); + else + return false; +} + function getObjects() { var prevButton = document.getElementById("prevButton"); @@ -242,15 +260,8 @@ function getObjects() getOrderBy(); //rrs - //mWhere = "campaigns.id = '9be5dd91-d20b-c5fd-1769-4554d8eede05'"; - - query = {"module":module, "offset":mOffset, "where":mWhere, "max":max, "order_by":orderBy}; - - req_id = global_rpcClient.call_method('get_objects_from_module',query); - - var res = new ResponseObj(); - global_request_registry[req_id] = [ res,'response']; - + var qs = 'index.php?module=MailMerge&action=search&qModule='+module+'&rel_module='+relModule+'&term='+mTerm+'&max='+max+'&order_by='+orderBy+'&offset='+mOffset; + YAHOO.mailmerge.cObj = YAHOO.util.Connect.asyncRequest('GET', qs,{success: ajaxSuccess, failure: ajaxSuccess}, null); } function moveRight() @@ -349,25 +360,13 @@ function search(searchText) var where = ''; if(searchText != '') { - if(module == 'Contacts' || module == 'Leads') - { - where = module+".first_name like '%"+searchText+"%' OR "+module+".last_name like '%"+searchText+"%'"; - } - else if(module == 'CampaignProspects'){ + mTerm = searchText; + if(module == 'CampaignProspects'){ var prospectType = document.getElementById("campaign_prospect_type"); var lmodule = prospectType.value.toLowerCase(); - var campign_where = "{MAILMERGE_WHERE}"; - where = lmodule+".first_name like '%"+searchText+"%' OR "+lmodule+".last_name like '%"+searchText+"%'"; - if(campign_where) - where += " AND "+campign_where ; - where += " AND related_type = #"+lmodule+"#" - } - else - { - where = module+".name like '"+searchText+"%'"; + relModule = lmodule; } } - mWhere = where.toLowerCase(); mOffset = 0; getObjects(); } @@ -392,7 +391,6 @@ function validateForm() if(selObjs.options.length > 0) { - document.MailMerge.action='index.php'; document.MailMerge.submit(); return true; } diff --git a/modules/MailMerge/controller.php b/modules/MailMerge/controller.php new file mode 100644 index 00000000..440b3d1a --- /dev/null +++ b/modules/MailMerge/controller.php @@ -0,0 +1,114 @@ +<?php +/********************************************************************************* + * SugarCRM Community Edition is a customer relationship management program developed by + * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License version 3 as published by the + * Free Software Foundation with the addition of the following permission added + * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK + * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY + * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License along with + * this program; if not, see http://www.gnu.org/licenses or write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA. + * + * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, + * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * SugarCRM" logo. If the display of the logo is not reasonably feasible for + * technical reasons, the Appropriate Legal Notices must display the words + * "Powered by SugarCRM". + ********************************************************************************/ + +require_once('soap/SoapHelperFunctions.php'); +class MailMergeController extends SugarController{ + function MailMergeController(){ + parent::SugarController(); + } + + public function action_search(){ + //set ajax view + $this->view = 'ajax'; + //get the module + $module = !empty($_REQUEST['qModule']) ? $_REQUEST['qModule'] : ''; + //lowercase module name + $lmodule = strtolower($module); + //get the search term + $term = !empty($_REQUEST['term']) ? $GLOBALS['db']->quote($_REQUEST['term']) : ''; + //in the case of Campaigns we need to use the related module + $relModule = !empty($_REQUEST['rel_module']) ? $_REQUEST['rel_module'] : null; + $max = !empty($_REQUEST['max']) ? $_REQUEST['max'] : 10; + $order_by = !empty($_REQUEST['order_by']) ? $_REQUEST['order_by'] : $lmodule.".name"; + $offset = !empty($_REQUEST['offset']) ? $_REQUEST['offset'] : 0; + $response = array(); + + if(!empty($module)){ + $where = ''; + $deleted = '0'; + $using_cp = false; + + if(!empty($term)) + { + if($module == 'Contacts' || $module == 'Leads') + { + $where = $lmodule.".first_name like '%".$term."%' OR ".$lmodule.".last_name like '%".$term."%'"; + $order_by = $lmodule.".last_name"; + } + else if($module == 'CampaignProspects'){ + $using_cp = true; + $lmodule = strtolower($relModule); + $campign_where = $_SESSION['MAILMERGE_WHERE']; + $where = $lmodule.".first_name like '%".$term."%' OR ".$lmodule.".last_name like '%".$term."%'"; + if($campign_where) + $where .= " AND ".$campign_where ; + $where .= " AND related_type = #".$lmodule."#"; + $module = 'Prospects'; + } + else + { + $where = $lmodule.".name like '".$term."%'"; + } + } + + $seed = SugarModule::get($module)->loadBean(); + + + if($using_cp){ + $fields = array('id', 'first_name', 'last_name'); + $dataList = $seed->retrieveTargetList($where, $fields, $offset,-1,$max,$deleted); + }else{ + $dataList = $seed->get_list($order_by, $where, $offset,-1,$max,$deleted); + } + + $list = $dataList['list']; + $row_count = $dataList['row_count']; + + $output_list = array(); + foreach($list as $value) + { + $output_list[] = get_return_value($value, $module); + } + + $response['result'] = array('result_count'=>$row_count,'entry_list'=>$output_list); + } + + $json = getJSONobj(); + $json_response = $json->encode($response, true); + print $json_response; + } +} +?> \ No newline at end of file diff --git a/modules/MailMerge/index.php b/modules/MailMerge/index.php index 7e02f7d1..4ba2b35c 100644 --- a/modules/MailMerge/index.php +++ b/modules/MailMerge/index.php @@ -55,5 +55,4 @@ else $step = '1'; } include ('modules/MailMerge/Step'. clean_string($step). '.php'); -?> - +?> \ No newline at end of file diff --git a/modules/Meetings/Dashlets/MyMeetingsDashlet/MyMeetingsDashlet.php b/modules/Meetings/Dashlets/MyMeetingsDashlet/MyMeetingsDashlet.php index aa14dc11..6cac248d 100644 --- a/modules/Meetings/Dashlets/MyMeetingsDashlet/MyMeetingsDashlet.php +++ b/modules/Meetings/Dashlets/MyMeetingsDashlet/MyMeetingsDashlet.php @@ -78,8 +78,8 @@ class MyMeetingsDashlet extends DashletGeneric { //join with meeting_users table to process related users $this->seedBean->listview_inner_join = array('LEFT JOIN meetings_users m_u on m_u.meeting_id = meetings.id'); - //set the custom query to retrieve invitees AND assigned meetings - $lvsParams['custom_where'] = ' AND (meetings.assigned_user_id = \'' . $current_user->id . '\' OR m_u.user_id = \'' . $current_user->id . '\') AND m_u.deleted=0 '; + //set the custom query to retrieve invitees AND assigned meetings + $lvsParams['custom_where'] = ' AND (meetings.assigned_user_id = \'' . $current_user->id . '\' OR m_u.user_id = \'' . $current_user->id . '\') AND m_u.deleted=0 '; } $this->myItemsOnly = false; diff --git a/modules/Meetings/Meeting.php b/modules/Meetings/Meeting.php index f09a72ed..2913786f 100644 --- a/modules/Meetings/Meeting.php +++ b/modules/Meetings/Meeting.php @@ -439,17 +439,11 @@ class Meeting extends SugarBean { //make sure we grab the localized version of the contact name, if a contact is provided if (!empty($this->contact_id)) { global $locale; - $query = "SELECT first_name, last_name, salutation, title FROM contacts "; - $query .= "WHERE id='$this->contact_id' AND deleted=0"; - $result = $this->db->limitQuery($query,0,1,true," Error filling in contact name fields: "); - - // Get the contact name. - $row = $this->db->fetchByAssoc($result); - - if($row != null) - { - $this->contact_name = $locale->getLocaleFormattedName($row['first_name'], $row['last_name'], $row['salutation'], $row['title']); - } + // Bug# 46125 - make first name, last name, salutation and title of Contacts respect field level ACLs + $contact_temp = new Contact(); + $contact_temp->retrieve($this->contact_id); + $contact_temp->_create_proper_name_field(); + $this->contact_name = $contact_temp->full_name; } $meeting_fields['CONTACT_ID'] = $this->contact_id; @@ -728,16 +722,58 @@ class Meeting extends SugarBean { } // end class def // External API integration, for the dropdown list of what external API's are available -function getMeetingsExternalApiDropDown($focus = null, $name = null, $value = null, $view = null) { - require_once('include/externalAPI/ExternalAPIFactory.php'); +//TODO: do we really need focus, name and view params for this function +function getMeetingsExternalApiDropDown($focus = null, $name = null, $value = null, $view = null) +{ + global $dictionary, $app_list_strings; + + $cacheKeyName = 'meetings_type_drop_down'; + + $apiList = sugar_cache_retrieve($cacheKeyName); + if ($apiList === null) + { + require_once('include/externalAPI/ExternalAPIFactory.php'); + + $apiList = ExternalAPIFactory::getModuleDropDown('Meetings'); + $apiList = array_merge(array('Sugar'=>$GLOBALS['app_list_strings']['eapm_list']['Sugar']), $apiList); + sugar_cache_put($cacheKeyName, $apiList); + } - $apiList = ExternalAPIFactory::getModuleDropDown('Meetings'); - $apiList = array_merge(array('Sugar'=>$GLOBALS['app_list_strings']['eapm_list']['Sugar']),$apiList); - if(!empty($value) && empty($apiList[$value])){ - $apiList[$value] = $value; + if(!empty($value) && empty($apiList[$value])) + { + $apiList[$value] = $value; } - return $apiList; + //bug 46294: adding list of options to dropdown list + $apiList = array_merge(getMeetingTypeOptions($dictionary, $app_list_strings), $apiList); + return $apiList; } -?> +/** + * Meeting Type Options Array for dropdown list + * @param array $dictionary - getting type name + * @param array $app_list_strings - getting type options + * @return array Meeting Type Options Array for dropdown list + */ +function getMeetingTypeOptions($dictionary, $app_list_strings) +{ + $result = array(); + + // getting name of meeting type to fill dropdown list by its values + if (isset($dictionary['Meeting']['fields']['type']['options'])) + { + $typeName = $dictionary['Meeting']['fields']['type']['options']; + + if (!empty($app_list_strings[$typeName])) + { + $typeList = $app_list_strings[$typeName]; + + foreach ($typeList as $key => $value) + { + $result[$value] = $value; + } + } + } + + return $result; +} diff --git a/modules/Meetings/metadata/editviewdefs.php b/modules/Meetings/metadata/editviewdefs.php index 9c4b4ef2..92c20ce9 100644 --- a/modules/Meetings/metadata/editviewdefs.php +++ b/modules/Meetings/metadata/editviewdefs.php @@ -51,7 +51,7 @@ array ( array ( 0 => array ( - 'customCode' => '<input title="{$APP.LBL_SAVE_BUTTON_TITLE}" accessKey="{$APP.LBL_SAVE_BUTTON_KEY}" class="button primary" onclick="fill_invitees();document.EditView.action.value=\'Save\'; document.EditView.return_action.value=\'DetailView\'; {if isset($smarty.request.isDuplicate) && $smarty.request.isDuplicate eq "true"}document.EditView.return_id.value=\'\'; {/if} formSubmitCheck();"type="button" name="button" value="{$APP.LBL_SAVE_BUTTON_LABEL}">', + 'customCode' => '<input title="{$APP.LBL_SAVE_BUTTON_TITLE}" id ="SAVE" accessKey="{$APP.LBL_SAVE_BUTTON_KEY}" class="button primary" onclick="fill_invitees();document.EditView.action.value=\'Save\'; document.EditView.return_action.value=\'DetailView\'; {if isset($smarty.request.isDuplicate) && $smarty.request.isDuplicate eq "true"}document.EditView.return_id.value=\'\'; {/if} formSubmitCheck();"type="button" name="button" value="{$APP.LBL_SAVE_BUTTON_LABEL}">', ), 1 => 'CANCEL', 2 => diff --git a/modules/ModuleBuilder/Module/StudioBrowser.php b/modules/ModuleBuilder/Module/StudioBrowser.php index 17bffc8e..1d6faa6b 100644 --- a/modules/ModuleBuilder/Module/StudioBrowser.php +++ b/modules/ModuleBuilder/Module/StudioBrowser.php @@ -60,7 +60,7 @@ class StudioBrowser{ function loadRelatableModules(){ $d = dir('modules'); while($e = $d->read()){ - if(substr($e, 0, 1) == '.' || !is_dir('modules/' . $e))continue; + if(substr($e, 0, 1) == '.' || !is_dir('modules/' . $e))continue; if(file_exists('modules/' . $e . '/metadata/studio.php') && isset($GLOBALS [ 'beanList' ][$e])) // installed modules must also exist in the beanList { $this->modules[$e] = StudioModuleFactory::getStudioModule( $e ) ; diff --git a/modules/ModuleBuilder/controller.php b/modules/ModuleBuilder/controller.php index 4f35256a..52bf35b5 100644 --- a/modules/ModuleBuilder/controller.php +++ b/modules/ModuleBuilder/controller.php @@ -545,6 +545,7 @@ class ModuleBuilderController extends SugarController $relationships = new UndeployedRelationships ( $module->getModuleDir () ) ; } $relationships->delete ( $_REQUEST [ 'relationship_name' ] ) ; + $relationships->save () ; } $this->view = 'relationships' ; @@ -596,6 +597,18 @@ class ModuleBuilderController extends SugarController } $module->removeFieldFromLayouts( $field->name ); $this->view = 'modulefields' ; + + if (isset($GLOBALS['current_language']) && isset($_REQUEST['label']) && + isset($_REQUEST['labelValue']) && isset($_REQUEST['view_module'])) { + $this->DeleteLabel($GLOBALS['current_language'], $_REQUEST['label'], $_REQUEST['labelValue'], $_REQUEST['view_module']); + } + } + + function DeleteLabel($language, $label, $labelvalue, $modulename, $basepath = null, $forRelationshipLabel = false) + { + // remove the label + require_once 'modules/ModuleBuilder/parsers/parser.label.php'; + ParserLabel::removeLabel($language, $label, $labelvalue, $modulename, $basepath, $forRelationshipLabel); } function action_CloneField () diff --git a/modules/ModuleBuilder/parsers/parser.label.php b/modules/ModuleBuilder/parsers/parser.label.php index 7d3b2f7d..49611c12 100644 --- a/modules/ModuleBuilder/parsers/parser.label.php +++ b/modules/ModuleBuilder/parsers/parser.label.php @@ -74,6 +74,80 @@ class ParserLabel extends ModuleBuilderParser } } + /* + * Remove a label from the language pack for a module + * @param string $language Language key, for example 'en_us' + * @param string $label The label to remove + * @param string $labelvalue The value of the label to remove + * @param string $moduleName Name of the module to which to add these labels + * @param string $basepath base path of the language file + * @param string $forRelationshipLabel whether this is a relationship label + */ + static function removeLabel($language, $label, $labelvalue, $moduleName, $basepath = null, $forRelationshipLabel = false) { + $GLOBALS [ 'log' ]->debug ( "ParserLabel->removeLabels($language, \$label, \$labelvalue, $moduleName, $basepath );" ) ; + if (is_null ( $basepath )) + { + $deployedModule = true ; + $basepath = "custom/modules/$moduleName/language" ; + if($forRelationshipLabel){ + $basepath = "custom/modules/$moduleName/Ext/Language" ; + } + if (! is_dir ( $basepath )) + { + $GLOBALS ['log']->debug("$basepath is not a directory."); + return false; + } + } + + $filename = "$basepath/$language.lang.php" ; + if($forRelationshipLabel){ + $filename = "$basepath/$language.lang.ext.php" ; + } + + $dir_exists = is_dir ( $basepath ) ; + + $mod_strings = array ( ) ; + + if ($dir_exists) + { + if (file_exists ($filename)) + { + // obtain $mod_strings + include ($filename) ; + } else { + $GLOBALS ['log']->debug("file $filename does not exist."); + return false; + } + } else { + $GLOBALS ['log']->debug("directory $basepath does not exist."); + return false ; + } + + $changed = false ; + + if (isset($mod_strings[$label]) && $mod_strings[$label]==$labelvalue) { + unset($mod_strings[$label]); + $changed = true; + } + + if ($changed) + { + if (! write_array_to_file ( "mod_strings", $mod_strings, $filename )) { + $GLOBALS [ 'log' ]->fatal ( "Could not write $filename" ) ; + } else { + // if we have a cache to worry about, then clear it now + if ($deployedModule) { + $GLOBALS ['log']->debug ( "PaserLabel->addLabels: clearing language cache" ) ; + $cache_key = "module_language." . $language . $moduleName ; + sugar_cache_clear ( $cache_key ) ; + LanguageManager::clearLanguageCache ( $moduleName, $language ) ; + } + } + } + + return true ; + } + /* * Add a set of labels to the language pack for a module, deployed or undeployed * @param string $language Language key, for example 'en_us' diff --git a/modules/ModuleBuilder/parsers/relationships/ActivitiesRelationship.php b/modules/ModuleBuilder/parsers/relationships/ActivitiesRelationship.php index 59194bc6..9aa6e3e5 100644 --- a/modules/ModuleBuilder/parsers/relationships/ActivitiesRelationship.php +++ b/modules/ModuleBuilder/parsers/relationships/ActivitiesRelationship.php @@ -147,6 +147,7 @@ class ActivitiesRelationship extends OneToManyRelationship $vardef [ 'type' ] = 'link' ; $vardef [ 'relationship' ] = $relationshipName ; $vardef [ 'source' ] = 'non-db' ; + $vardef [ 'vname' ] = strtoupper("LBL_{$relationshipName}_FROM_{$sourceModule}_TITLE"); return $vardef ; } diff --git a/modules/ModuleBuilder/parsers/relationships/UndeployedRelationships.php b/modules/ModuleBuilder/parsers/relationships/UndeployedRelationships.php index 2a623a29..14f89971 100644 --- a/modules/ModuleBuilder/parsers/relationships/UndeployedRelationships.php +++ b/modules/ModuleBuilder/parsers/relationships/UndeployedRelationships.php @@ -267,6 +267,17 @@ class UndeployedRelationships extends AbstractRelationships implements Relations $module->save () ; } + else + { + //Bug42170================================ + $appStrings = $module->getAppListStrings () ; + unset($appStrings [ 'parent_type_display' ] [ $module->key_name ]); + unset($appStrings [ 'record_type_display' ] [ $module->key_name ]); + unset($appStrings [ 'record_type_display_notes' ] [ $module->key_name ]); + $module->setAppListStrings ( 'en_us', $appStrings ) ; + $module->save () ; + //Bug42170================================ + } // use an installDefPrefix of <basepath>/SugarModules for compatibility with the rest of ModuleBuilder $this->installDefs = parent::build ( $basepath, "<basepath>/SugarModules", $relationships ) ; diff --git a/modules/ModuleBuilder/parsers/views/GridLayoutMetaDataParser.php b/modules/ModuleBuilder/parsers/views/GridLayoutMetaDataParser.php index 07e6ad87..edb3c17f 100644 --- a/modules/ModuleBuilder/parsers/views/GridLayoutMetaDataParser.php +++ b/modules/ModuleBuilder/parsers/views/GridLayoutMetaDataParser.php @@ -195,7 +195,7 @@ class GridLayoutMetaDataParser extends AbstractMetaDataParser implements MetaDat }else{ $availableFields [ $key ] = array ( 'name' => $key , 'label' => isset($def [ 'label' ]) ? $def [ 'label' ] : $def['vname'] ) ; // layouts use 'label' not 'vname' for the label entry } - $availableFields[$key]['translatedLabel'] = translate($def['label'], $this->_moduleName); + $availableFields[$key]['translatedLabel'] = translate($availableFields[$key]['label'], $this->_moduleName); } } diff --git a/modules/ModuleBuilder/parsers/views/History.php b/modules/ModuleBuilder/parsers/views/History.php index 28810efc..0159f14a 100644 --- a/modules/ModuleBuilder/parsers/views/History.php +++ b/modules/ModuleBuilder/parsers/views/History.php @@ -37,8 +37,9 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); require_once 'modules/ModuleBuilder/parsers/constants.php' ; +require_once 'modules/ModuleBuilder/parsers/views/HistoryInterface.php' ; -class History +class History implements HistoryInterface { private $_dirname ; // base directory for the history files @@ -51,35 +52,34 @@ class History * Constructor * @param string $previewFilename The filename which the caller expects for a preview file */ - function __construct ($previewFilename ) + public function __construct ( $previewFilename ) { $GLOBALS [ 'log' ]->debug ( get_class ( $this ) . "->__construct( {$previewFilename} )" ) ; $this->_previewFilename = $previewFilename ; $this->_list = array ( ) ; - $this->_dirname = dirname ( $this->_previewFilename ) ; - // create the history directory if it does not already exist - if (! is_dir ( $this->_dirname )) - { - mkdir_recursive ( $this->_dirname ) ; - } $this->_basename = basename ( $this->_previewFilename ) ; - // Reconstruct the history from the saved files - foreach ( scandir ( $this->_dirname ) as $filename ) + $this->_dirname = dirname ( $this->_previewFilename ); + $this->_historyLimit = isset ( $GLOBALS [ 'sugar_config' ] [ 'studio_max_history' ] ) ? $GLOBALS [ 'sugar_config' ] [ 'studio_max_history' ] : 50 ; + + // create the history directory if it does not already exist + if (!is_dir($this->_dirname)) { + mkdir_recursive($this->_dirname); + } + else { - if ($filename != "." && $filename != "..") + // Reconstruct the history from the saved files + foreach (glob($this->getFileByTimestamp('*')) as $filename) { - // history files are of the form {$basename}_{$timestamp} - if (preg_match ( '/(' . $this->_basename . ')_(.*)/', $filename, $matches ) == 1) - { - $this->_list [ $matches [ 2 ] ] = $matches [ 2 ] ; - } + if(preg_match('/(\d+)$/', $filename, $match)) { + $this->_list [] = $match[1]; + } } } // now sort the files, oldest first if (count ( $this->_list ) > 0) { - ksort ( $this->_list ) ; + sort ( $this->_list ) ; } } @@ -88,7 +88,7 @@ class History * Get the most recent item in the history * @return timestamp of the first item */ - function getCount () + public function getCount () { return count ( $this->_list ) ; } @@ -97,7 +97,7 @@ class History * Get the most recent item in the history * @return timestamp of the first item */ - function getFirst () + public function getFirst () { return end ( $this->_list ) ; } @@ -106,7 +106,7 @@ class History * Get the oldest item in the history (the default layout) * @return timestamp of the last item */ - function getLast () + public function getLast () { return reset ( $this->_list ) ; } @@ -115,7 +115,7 @@ class History * Get the next oldest item in the history * @return timestamp of the next item */ - function getNext () + public function getNext () { return prev ( $this->_list ) ; } @@ -124,7 +124,7 @@ class History * Get the nth item in the history (where the zeroeth record is the most recent) * @return timestamp of the nth item */ - function getNth ($index) + public function getNth ( $index ) { $value = end ( $this->_list ) ; $i = 0 ; @@ -140,41 +140,37 @@ class History * Add an item to the history * @return String A GMT Unix timestamp for this newly added item */ - function append ($path) + public function append ($path) { // make sure we don't have a duplicate filename - highly unusual as two people should not be using Studio/MB concurrently, but when testing quite possible to do two appends within one second... // because so unlikely in normal use we handle this the naive way by waiting a second so our naming scheme doesn't get overelaborated $retries = 0 ; $now = TimeDate::getInstance()->getNow(); - //$time = $now->format('c'); - $time = $now->__get('ts'); - while ( (file_exists ( $this->_previewFilename . "_" . $time ) && $retries < 5) ) + $new_file = null; + for($retries = 0; !file_exists($new_file) && $retries < 5; $retries ++) { $now->modify("+1 second"); $time = $now->__get('ts'); - $retries ++ ; + $new_file = $this->getFileByTimestamp( $time ); } // now we have a unique filename, copy the file into the history - copy ( $path, $this->_previewFilename . "_" . $time ) ; - $this->_list [ $time ] = $time ; + copy ( $path, $new_file ) ; + $this->_list [ ] = $time ; // finally, trim the number of files we're holding in the history to that specified in the configuration - $max_history = (isset ( $GLOBALS [ 'sugar_config' ] [ 'studio_max_history' ] )) ? $GLOBALS [ 'sugar_config' ] [ 'studio_max_history' ] : 50 ; - $count = count ( $this->_list ) ; - // truncate the oldest files, keeping only the most recent $GLOBALS['sugar_config']['studio_max_history'] files (zero=keep them all) - if (($max_history != 0) && ($count > $max_history)) + // truncate the oldest files, keeping only the most recent $GLOBALS['sugar_config']['studio_max_history'] files (zero=keep them all) + $to_delete = $this->getCount() - $this->_historyLimit; + if ($this->_historyLimit != 0 && $to_delete) { // most recent files are at the end of the list, so we strip out the first count-max_history records // can't just use array_shift because it renumbers numeric keys (our timestamp keys) to start from zero... - for ( $i = 0 ; $i < $count - $max_history ; $i ++ ) + for ( $i = 0 ; $i < $to_delete ; $i ++ ) { - $timestamp = reset ( $this->_list ) ; - unset ( $this->_list [ $timestamp ] ) ; - if (! unlink ( $this->_dirname . "/" . $this->_basename . "_" . $timestamp )) + $timestamp = array_shift( $this->_list ) ; + if (! unlink ( $this->getFileByTimestamp( $timestamp ) )) { - $GLOBALS [ 'log' ]->warn ( "History.php: unable to remove history file {$this->_basename}_$timestamp from directory {$this->_dirname} - permissions problem?" ) ; - } + $GLOBALS [ 'log' ]->warn ( "History.php: unable to remove history file {$timestamp} from directory {$this->_dirname} - permissions problem?" ) ; } } } @@ -193,9 +189,9 @@ class History * @param Unix timestamp $timestamp GMT Timestamp of the layout to recover * @return GMT Timestamp if successful, null if failure (if the file could not be copied for some reason) */ - function restoreByTimestamp ($timestamp) + public function restoreByTimestamp ($timestamp) { - $filename = $this->_previewFilename . "_" . $timestamp ; + $filename = $this->getFileByTimestamp( $timestamp ); $GLOBALS [ 'log' ]->debug ( get_class ( $this ) . ": restoring from $filename to {$this->_previewFilename}" ) ; if (file_exists ( $filename )) @@ -209,7 +205,7 @@ class History /* * Undo the restore - revert back to the layout before the restore */ - function undoRestore () + public function undoRestore () { if (file_exists ( $this->_previewFilename )) { @@ -217,4 +213,15 @@ class History } } + /** + * Returns full path to history file by timestamp. This function returns file path even if file doesn't exist + * @param $timestamp + * @return string + */ + public function getFileByTimestamp($timestamp) + { + return $this->_dirname . DIRECTORY_SEPARATOR . $this->_basename . '_' . $timestamp ; + } + + } diff --git a/modules/ModuleBuilder/parsers/views/ListLayoutMetaDataParser.php b/modules/ModuleBuilder/parsers/views/ListLayoutMetaDataParser.php index 4f67bdc6..f55a3d97 100644 --- a/modules/ModuleBuilder/parsers/views/ListLayoutMetaDataParser.php +++ b/modules/ModuleBuilder/parsers/views/ListLayoutMetaDataParser.php @@ -197,10 +197,16 @@ class ListLayoutMetaDataParser extends AbstractMetaDataParser implements MetaDat if (is_array($def['studio'])) { $view = !empty($_REQUEST['view']) ? $_REQUEST['view'] : $this->view; - + + // fix for removing email1 field from studio popup searchview - bug 42902 + if($_REQUEST['view'] == 'popupsearch' && $key == 'email1' ){ + + return false; + } //end bug 42902 + if (!empty($view) && isset($def['studio'][$view]) && ($def['studio'][$view] !== false && (string)$def['studio'][$view] != 'false' && (string)$def['studio'][$view] != 'hidden')) - { - return true; + { + return true; } if (isset($def['studio']['listview']) && ($def['studio']['listview'] !== false && (string)$def['studio']['listview'] != 'false' && (string)$def['studio']['listview'] != 'hidden')) diff --git a/modules/ModuleBuilder/parsers/views/SearchViewMetaDataParser.php b/modules/ModuleBuilder/parsers/views/SearchViewMetaDataParser.php index 42a3517b..1bec9f99 100644 --- a/modules/ModuleBuilder/parsers/views/SearchViewMetaDataParser.php +++ b/modules/ModuleBuilder/parsers/views/SearchViewMetaDataParser.php @@ -123,13 +123,14 @@ class SearchViewMetaDataParser extends ListLayoutMetaDataParser return true; } + if (isset($def [ 'studio' ]) && is_array($def [ 'studio' ]) && isset($def [ 'studio' ]['searchview'])) + { + return $def [ 'studio' ]['searchview'] !== false && + ($def [ 'studio' ]['searchview'] === true || $def [ 'studio' ]['searchview'] != 'false'); + } + if (!parent::isValidField($key, $def)) return false; - - if (isset($def [ 'studio' ]) && is_array($def [ 'studio' ]) && isset($def [ 'studio' ]['searchview'])) - { - return $def [ 'studio' ]['searchview'] !== false && $def [ 'studio' ]['searchview'] != 'false'; - } //Special case to prevent multiple copies of assigned, modified, or created by user on the search view if (empty ($def[ 'studio' ] ) && $key == "assigned_user_name") @@ -189,20 +190,30 @@ class SearchViewMetaDataParser extends ListLayoutMetaDataParser } return $temp ; } - + + + function normalizeDefs($defs) { + $out = array(); + foreach ($defs as $def) + { + if (is_array($def) && isset($def['name'])) + { + $out[strtolower($def['name'])] = $def; + } + } + return $out; + } + function getOriginalViewDefs() { $defs = $this->implementation->getOriginalViewdefs (); $out = array(); if (!empty($defs) && !empty($defs['layout']) && !empty($defs['layout'][$this->_searchLayout])) { - $defs = $defs['layout'][$this->_searchLayout]; - foreach ($defs as $def) - { - if (is_array($def) && isset($def['name'])) - { - $out[strtolower($def['name'])] = $def; - } - } + if($this->_searchLayout == "basic_search" && !empty($defs['layout']["advanced_search"])) + { + $out = $this->normalizeDefs($defs['layout']["advanced_search"]); + } + $out = array_merge($out, $this->normalizeDefs($defs['layout'][$this->_searchLayout])); } return $out; diff --git a/modules/ModuleBuilder/tpls/layoutView.tpl b/modules/ModuleBuilder/tpls/layoutView.tpl index 0425226d..027b1a8a 100644 --- a/modules/ModuleBuilder/tpls/layoutView.tpl +++ b/modules/ModuleBuilder/tpls/layoutView.tpl @@ -241,13 +241,16 @@ var editPanelProperties = function (panelId, view) { var editFieldProperties = function (idCount, label) {ldelim} var value_label = document.getElementById('le_label_' + idCount).innerHTML.replace(/^\s+|\s+$/g,''); var value_tabindex = document.getElementById('le_tabindex_' + idCount).innerHTML.replace(/^\s+|\s+$/g,''); + var title_label = '{sugar_translate label="LBL_LABEL_TITLE" module="ModuleBuilder"}'; + var title_tabindex = '{sugar_translate label="LBL_TAB_ORDER" module="ModuleBuilder"}'; + ModuleBuilder.getContent( 'module=ModuleBuilder&action=editProperty' + '&view_module={$view_module|escape:'url'}' + '{if $fromModuleBuilder}&view_package={$view_package}{/if}' + '&view={$view|escape:'url'}&id_label=le_label_' + encodeURIComponent(idCount) - + '&name_label=label_' + encodeURIComponent(label) + '&title_label={sugar_translate label="LBL_LABEL_TITLE" module="ModuleBuilder"}' + + '&name_label=label_' + encodeURIComponent(label) + '&title_label=' + encodeURIComponent(title_label) + '&value_label=' + encodeURIComponent(value_label) + '&id_tabindex=le_tabindex_' + encodeURIComponent(idCount) - + '&title_tabindex={sugar_translate label="LBL_TAB_ORDER" module="ModuleBuilder"}' + + '&title_tabindex=' + encodeURIComponent(title_tabindex) + '&name_tabindex=tabindex&value_tabindex=' + encodeURIComponent(value_tabindex) ); {rdelim} diff --git a/modules/Notes/metadata/SearchFields.php b/modules/Notes/metadata/SearchFields.php index 4752120f..8e54053c 100644 --- a/modules/Notes/metadata/SearchFields.php +++ b/modules/Notes/metadata/SearchFields.php @@ -47,7 +47,8 @@ $searchFields['Notes'] = 'end_range_date_entered' => array ('query_type' => 'default', 'enable_range_search' => true, 'is_date_field' => true), 'range_date_modified' => array ('query_type' => 'default', 'enable_range_search' => true, 'is_date_field' => true), 'start_range_date_modified' => array ('query_type' => 'default', 'enable_range_search' => true, 'is_date_field' => true), - 'end_range_date_modified' => array ('query_type' => 'default', 'enable_range_search' => true, 'is_date_field' => true), + 'end_range_date_modified' => array ('query_type' => 'default', 'enable_range_search' => true, 'is_date_field' => true), + 'current_user_only'=> array('query_type'=>'default','db_field'=>array('assigned_user_id'),'my_items'=>true, 'vname' => 'LBL_CURRENT_USER_FILTER', 'type' => 'bool'), //Range Search Support ); ?> diff --git a/modules/Notes/metadata/searchdefs.php b/modules/Notes/metadata/searchdefs.php index f0f3affa..2ad3f6e6 100644 --- a/modules/Notes/metadata/searchdefs.php +++ b/modules/Notes/metadata/searchdefs.php @@ -46,7 +46,7 @@ array ( 'default' => true, 'width' => '10%', ), - + array ('name'=>'current_user_only', 'label'=>'LBL_CURRENT_USER_FILTER', 'type'=>'bool'), ), 'advanced_search' => array ( diff --git a/modules/Project/gantt.css b/modules/Project/gantt.css deleted file mode 100644 index 6f88e9d4..00000000 --- a/modules/Project/gantt.css +++ /dev/null @@ -1,221 +0,0 @@ -/********************************************************************************* - * SugarCRM Community Edition is a customer relationship management program developed by - * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc. - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License version 3 as published by the - * Free Software Foundation with the addition of the following permission added - * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK - * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY - * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. - * - * You should have received a copy of the GNU Affero General Public License along with - * this program; if not, see http://www.gnu.org/licenses or write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301 USA. - * - * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, - * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. - * - * The interactive user interfaces in modified source and object code versions - * of this program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU Affero General Public License version 3. - * - * In accordance with Section 7(b) of the GNU Affero General Public License version 3, - * these Appropriate Legal Notices must retain the display of the "Powered by - * SugarCRM" logo. If the display of the logo is not reasonably feasible for - * technical reasons, the Appropriate Legal Notices must display the words - * "Powered by SugarCRM". - ********************************************************************************/ - - - #projectTable td, #projectTable th, #gantt td - { - border: 1px inset #808080; - } - - #projectTable th, - #projectTable td[scope=row], - #gantt tr[bgcolor] td, - #gantt tr#header_row td - { - background: #f6f6f6; - } - - /* gantt styles */ - - table.days { - font-family: Tahoma, Arial, Verdana, Helvetica, sans-serif; - font-size: 11px; - } - td.days { - border-top: 1px solid #dfdfdf !important; - border-bottom: 1px solid #dfdfdf !important; - border-left: 0px !important; - border-right: 0px !important; - } - - td.sunday { - border-top: 1px solid #dfdfdf !important; - border-bottom: 1px solid #dfdfdf !important; - border-left: 1px solid #dfdfdf !important; - border-right: 0px !important; - } - - td.saturday { - border-top: 1px solid #dfdfdf !important; - border-bottom: 1px solid #dfdfdf !important; - border-left: 0px !important; - border-right: 1px solid #dfdfdf !important; - } - - td.date { - width: 100%; - padding: 0px; - border-top: 0px; - border-bottom: 0px; - border-left: 0px; - border-right: 0px; - font-size: 10px; - } - - tr.empty { - height: 2px; - } - - div.completed { - background-color: #777777; - float: left; - width: 100%; - line-height: 10px; - margin-top: 4px; - } - - div.inprogress { - background-color: #002E4D; - float: left; - width: 100%; - line-height: 10px; - margin-top: 4px; - } - - div.inprogress_bar { - background-color: #ff0000; - float: left; - width: 100%; - line-height: 10px; - margin-top: 4px; - } - - div.notstarted { - background-color: #cccccc; - float: left; - width: 100%; - line-height: 10px; - margin-top: 4px; - } - - div.indent_left { - background-color: #000000; - float: left; - line-height: 10px; - margin-top: 4px; - } - - div.parent { - background-color: #000000; - float: left; - margin-top: 4px; - line-height: 4px; - } - - div.indent_right { - background-color: #000000; - float: right; - line-height: 10px; - margin-top: 4px; - } - - #horizWrapper {position:relative; margin-left:60px;width:218px;float:left;} - #horizBGDiv {position:relative; top:60px; background:url(horizBg.png) no-repeat; height:26px; width:218px;zindex:5 } - #horizHandleDiv { - position:absolute; - left: 100px; /* the default position is the center of the bg */ - top: 8px; /* force the image down a bit */ - cursor:default; - width:18px; - height:18px; - } - - /* end gantt styles */ - - - /* Project Divs */ - - #project_container{ - position:relative; - width:100%; - height:100%; - } - - #grid_space{ - position:absolute; - left:0px; - top:0px; - width:600px; - height:100%; - overflow-x:auto; - overflow-y:hidden; - } - - #grid_space table { - border-collapse:separate; - border: 1px solid gray; - border-spacing:0; - } - - #grid_space table select, #grid_space table input{ - border:0; - padding:0; - margin:0; - height:23px; - } - - - #gantt_area{ - margin-left:504px; - margin-right:0px; - height:100%; - overflow:auto; - } - - #gantt_area table { - border-collapse:separate; - border: 1px solid gray; - border-spacing:0; - } - - #resizer{ - top:0px; - position:absolute; - width:3px; - height:100%; - background:#C0C0C0; - } - - /* End Project Divs */ - - .menu{ - z-index:100; - } - - .subDmenu{ - z-index:100; - } - - \ No newline at end of file diff --git a/modules/ProjectTask/ProjectTask.php b/modules/ProjectTask/ProjectTask.php index 44da69fe..53a4d3f9 100644 --- a/modules/ProjectTask/ProjectTask.php +++ b/modules/ProjectTask/ProjectTask.php @@ -118,6 +118,7 @@ class ProjectTask extends SugarBean { function save($check_notify = FALSE){ $id = parent::save($check_notify); + $this->updateParentProjectTaskPercentage(); return $id; } @@ -353,7 +354,37 @@ class ProjectTask extends SugarBean { } - + public function updateParentProjectTaskPercentage() + { + if (empty($this->parent_task_id)) + { + return; + } + $projectId = $this->project_id; + if (!empty($projectId)) + { + $project = new Project(); + $project->retrieve($projectId); + $projectTasks = $project->getAllProjectTasks(); + $dependentTaskId = $this->parent_task_id; + $collectPercentage = 0; + $parentProjectTask = false; + foreach ($projectTasks as $key => $value) + { + if ($value->project_task_id == $dependentTaskId) + { + $parentProjectTask = $value; + continue; + } + $collectPercentage += $value->percent_complete; + } + if ($parentProjectTask) + { + $parentProjectTask->percent_complete = round($collectPercentage / (count($projectTasks) - 1)); + $parentProjectTask->save(isset($GLOBALS['check_notify']) ? $GLOBALS['check_notify'] : ''); + } + } + } } function getUtilizationDropdown($focus, $field, $value, $view) { diff --git a/modules/Roles/DeleteUserRelationship.php b/modules/Roles/DeleteUserRelationship.php index 1b144dcc..a18e994c 100644 --- a/modules/Roles/DeleteUserRelationship.php +++ b/modules/Roles/DeleteUserRelationship.php @@ -58,5 +58,4 @@ $header_URL = "Location: index.php?action={$_REQUEST['return_action']}&module={$ $GLOBALS['log']->debug("about to post header URL of: $header_URL"); header($header_URL); -?> - +?> \ No newline at end of file diff --git a/modules/Roles/SaveUserRelationship.php b/modules/Roles/SaveUserRelationship.php index 35d75fe5..641dbd42 100644 --- a/modules/Roles/SaveUserRelationship.php +++ b/modules/Roles/SaveUserRelationship.php @@ -65,5 +65,4 @@ echo " window.location=\"{$header_URL}\";\n"; echo "// -->\n"; echo "</script>"; -?> - +?> \ No newline at end of file diff --git a/modules/SavedSearch/SavedSearchSelects.tpl b/modules/SavedSearch/SavedSearchSelects.tpl index ef917a91..a46578d2 100644 --- a/modules/SavedSearch/SavedSearchSelects.tpl +++ b/modules/SavedSearch/SavedSearchSelects.tpl @@ -41,7 +41,7 @@ *} {if $SAVED_SEARCHES_OPTIONS != null} -<select style="width: 110px" name='saved_search_select' id='saved_search_select' onChange='SUGAR.savedViews.shortcut_select(this, "{$SEARCH_MODULE}");'> +<select style="width: auto !important; min-width: 150px;" name='saved_search_select' id='saved_search_select' onChange='SUGAR.savedViews.shortcut_select(this, "{$SEARCH_MODULE}");'> {$SAVED_SEARCHES_OPTIONS} </select> <script> diff --git a/modules/Schedulers/Scheduler.php b/modules/Schedulers/Scheduler.php index 06ce3711..414435bd 100644 --- a/modules/Schedulers/Scheduler.php +++ b/modules/Schedulers/Scheduler.php @@ -89,7 +89,7 @@ class Scheduler extends SugarBean { $user = new User(); //check is default admin exists $adminId = $this->db->getOne( - 'SELECT id FROM users WHERE id=1 AND is_admin=1 AND deleted=0 AND status=\'Active\'', + 'SELECT id FROM users WHERE id=\'1\' AND is_admin=1 AND deleted=0 AND status=\'Active\'', true, 'Error retrieving Admin account info' ); @@ -239,7 +239,7 @@ class Scheduler extends SugarBean { } $now = TimeDate::getInstance()->getNow(); - $now = $now->setTime($now->hour, $now->min)->asDb(); + $now = $now->setTime($now->hour, $now->min, "00")->asDb(); $validTimes = $this->deriveDBDateTimes($this); if(is_array($validTimes) && in_array($now, $validTimes)) { @@ -600,15 +600,17 @@ class Scheduler extends SugarBean { /** * If "Execute If Missed bit is set */ + $now = TimeDate::getInstance()->getNow(); + $now = $now->setTime($now->hour, $now->min, "00")->asDb(); + if($focus->catch_up == 1) { if($focus->last_run == null) { // always "catch-up" - $validJobTime[] = $timedate->nowDb(); + $validJobTime[] = $now; } else { // determine what the interval in min/hours is // see if last_run is in it // if not, add NOW - $now = $timedate->nowDb(); if(!empty($validJobTime) && ($focus->last_run < $validJobTime[0]) && ($now > $validJobTime[0])) { // cn: empty() bug 5914; //if(!empty) should be checked, becasue if a scheduler is defined to run every day 4pm, then after 4pm, and it runs as 4pm, the $validJobTime will be empty, and it should not catch up diff --git a/modules/SchedulersJobs/SchedulersJob.php b/modules/SchedulersJobs/SchedulersJob.php index 626c3dc7..64083d5b 100644 --- a/modules/SchedulersJobs/SchedulersJob.php +++ b/modules/SchedulersJobs/SchedulersJob.php @@ -69,7 +69,7 @@ class SchedulersJob extends SugarBean { $user = new User(); //check is default admin exists $adminId = $this->db->getOne( - 'SELECT id FROM users WHERE id=1 AND is_admin=1 AND deleted=0 AND status=\'Active\'', + 'SELECT id FROM users WHERE id=\'1\' AND is_admin=1 AND deleted=0 AND status=\'Active\'', true, 'Error retrieving Admin account info' ); diff --git a/modules/Studio/DropDowns/DropDownHelper.php b/modules/Studio/DropDowns/DropDownHelper.php index 52e8df67..bc5dc8e2 100644 --- a/modules/Studio/DropDowns/DropDownHelper.php +++ b/modules/Studio/DropDowns/DropDownHelper.php @@ -38,6 +38,7 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); require_once('modules/Administration/Common.php'); +require_once('modules/Administration/QuickRepairAndRebuild.php'); class DropDownHelper{ var $modules = array(); function getDropDownModules(){ @@ -162,6 +163,12 @@ class DropDownHelper{ save_custom_app_list_strings_contents($contents, $selected_lang); sugar_cache_reset(); } + // Bug38011 + $repairAndClear = new RepairAndClear(); + $repairAndClear->module_list = array(translate('LBL_ALL_MODULES')); + $repairAndClear->show_output = false; + $repairAndClear->clearJsLangFiles(); + // ~~~~~~~~ } diff --git a/modules/Tasks/Task.php b/modules/Tasks/Task.php index 19c8d235..963f720d 100644 --- a/modules/Tasks/Task.php +++ b/modules/Tasks/Task.php @@ -304,18 +304,12 @@ class Task extends SugarBean { //make sure we grab the localized version of the contact name, if a contact is provided if (!empty($this->contact_id)) { - global $locale; - $query = "SELECT first_name, last_name, salutation, title,phone_work FROM contacts "; - $query .= "WHERE id='$this->contact_id' AND deleted=0"; - $result = $this->db->limitQuery($query,0,1,true," Error filling in contact name fields: "); - - // Get the contact name. - $row = $this->db->fetchByAssoc($result); - - if($row != null) - { - $this->contact_name = $locale->getLocaleFormattedName($row['first_name'], $row['last_name'], $row['salutation'], $row['title']); - $this->contact_phone=$row['phone_work']; + // Bug# 46125 - make first name, last name, salutation and title of Contacts respect field level ACLs + $contact = new Contact(); + $contact->retrieve($this->contact_id); + if(isset($contact->id)) { + $this->contact_name = $contact->full_name; + $this->contact_phone = $contact->phone_work; } } diff --git a/modules/Tasks/vardefs.php b/modules/Tasks/vardefs.php index 57e4c722..f4301d7d 100644 --- a/modules/Tasks/vardefs.php +++ b/modules/Tasks/vardefs.php @@ -119,8 +119,9 @@ $dictionary['Task'] = array('table' => 'tasks', 'group'=>'parent_name', 'required'=>false, 'len'=>'255', - 'comment' => 'The Sugar object to which the call is related' - ), + 'comment' => 'The Sugar object to which the call is related', + 'options' => 'parent_type_display', +), 'parent_name'=> array( diff --git a/modules/Trackers/BreadCrumbStack.php b/modules/Trackers/BreadCrumbStack.php index a8673ef6..a7ea53d3 100644 --- a/modules/Trackers/BreadCrumbStack.php +++ b/modules/Trackers/BreadCrumbStack.php @@ -83,7 +83,7 @@ class BreadCrumbStack { $history_max_viewed = (!empty($GLOBALS['sugar_config']['history_max_viewed']))? $GLOBALS['sugar_config']['history_max_viewed'] : 50; } - $query = 'SELECT distinct item_id AS item_id, id, item_summary, module_name, monitor_id, date_modified FROM tracker WHERE user_id = \'' . $user_id . '\' AND visible = 1 ' . $module_query . ' ORDER BY date_modified DESC'; + $query = 'SELECT distinct item_id AS item_id, id, item_summary, module_name, monitor_id, date_modified FROM tracker WHERE user_id = \'' . $user_id . '\' AND deleted = 0 AND visible = 1 ' . $module_query . ' ORDER BY date_modified DESC'; $result = $db->limitQuery($query, 0, $history_max_viewed); $items = array(); while(($row = $db->fetchByAssoc($result))) { diff --git a/modules/Trackers/Tracker.php b/modules/Trackers/Tracker.php index 35538cb5..4be4347c 100644 --- a/modules/Trackers/Tracker.php +++ b/modules/Trackers/Tracker.php @@ -99,7 +99,7 @@ class Tracker extends SugarBean $history_max_viewed = (!empty($GLOBALS['sugar_config']['history_max_viewed']))? $GLOBALS['sugar_config']['history_max_viewed'] : 50; } - $query = 'SELECT item_id, item_summary, module_name, id FROM ' . $this->table_name . ' WHERE id = (SELECT MAX(id) as id FROM ' . $this->table_name . ' WHERE user_id = \'' . $user_id . '\' AND visible = 1' . $module_query . ')'; + $query = 'SELECT item_id, item_summary, module_name, id FROM ' . $this->table_name . ' WHERE id = (SELECT MAX(id) as id FROM ' . $this->table_name . ' WHERE user_id = \'' . $user_id . '\' AND deleted = 0 AND visible = 1' . $module_query . ')'; $result = $this->db->limitQuery($query,0,$history_max_viewed,true,$query); while(($row = $this->db->fetchByAssoc($result))) { $breadCrumb->push($row); diff --git a/modules/UpgradeWizard/uw_utils.php b/modules/UpgradeWizard/uw_utils.php index a9969d54..4321676e 100644 --- a/modules/UpgradeWizard/uw_utils.php +++ b/modules/UpgradeWizard/uw_utils.php @@ -5176,8 +5176,18 @@ function unlinkUpgradeFiles($version) //First check if we even have the scripts_for_patch/files_to_remove directory require_once('modules/UpgradeWizard/UpgradeRemoval.php'); + + /* + if(empty($_SESSION['unzip_dir'])) + { + global $sugar_config; + $base_upgrade_dir = $sugar_config['upload_dir'] . "/upgrades"; + $base_tmp_upgrade_dir = "$base_upgrade_dir/temp"; + $_SESSION['unzip_dir'] = mk_temp_dir( $base_tmp_upgrade_dir ); + } + */ - if(file_exists($_SESSION['unzip_dir'].'/scripts/files_to_remove')) + if(isset($_SESSION['unzip_dir']) && file_exists($_SESSION['unzip_dir'].'/scripts/files_to_remove')) { $files_to_remove = glob($_SESSION['unzip_dir'].'/scripts/files_to_remove/*.php'); diff --git a/modules/Users/EditView.tpl b/modules/Users/EditView.tpl index a01cc255..3e134d35 100644 --- a/modules/Users/EditView.tpl +++ b/modules/Users/EditView.tpl @@ -839,6 +839,7 @@ if(window.addEventListener){ {/literal} {/if} {$getNameJs} +setPreview() {$getNumberJs} {$confirmReassignJs} {$currencySymbolJs} diff --git a/modules/Users/Login.php b/modules/Users/Login.php index 933bec7e..beb6ee08 100644 --- a/modules/Users/Login.php +++ b/modules/Users/Login.php @@ -42,11 +42,22 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); * All Rights Reserved. * Contributor(s): ______________________________________.. ********************************************************************************/ -if(isset($_SESSION['authenticated_user_id'])) { - ob_clean(); - header("Location: index.php?module=Home&action=index"); +if (isset($_SESSION['authenticated_user_id'])) +{ + ob_clean(); + // fixing bug #46837: Previosly links/URLs to records in Sugar from MSO Excel/Word were referred to the home screen and not the record + // It used to appear when default browser was not MS IE + $nav = ''; + $nav .= (isset($_GET['login_module'])) ? '&module='.$_GET['login_module'] : ''; + $nav .= (isset($_GET['login_action'])) ? '&action='.$_GET['login_action'] : ''; + $nav .= (isset($_GET['login_record'])) ? '&record='.$_GET['login_record'] : ''; + + ($nav == '') + ? header("Location: index.php?module=Home&action=index") + : header("Location: index.php?".substr($nav, 1)); + sugar_cleanup(true); - return; + return; } global $current_language, $mod_strings, $app_strings; if(isset($_REQUEST['login_language'])){ diff --git a/modules/Users/User.php b/modules/Users/User.php index ce2d33a6..bb291b44 100644 --- a/modules/Users/User.php +++ b/modules/Users/User.php @@ -1473,7 +1473,15 @@ EOQ; $alias = substr($ljVal,$spacePos,$onPos-$spacePos); //add null check to end of the Join statement - $ljVal =' LEFT JOIN '.$ljVal.' and '.$alias.'.id is null '; + // Bug #46390 to use id_c field instead of id field for custom tables + if(substr($alias, -5) != '_cstm') + { + $ljVal =' LEFT JOIN '.$ljVal.' and '.$alias.'.id is null '; + } + else + { + $ljVal =' LEFT JOIN '.$ljVal.' and '.$alias.'.id_c is null '; + } //add statement into new string $new_left_str .= $ljVal; diff --git a/modules/Users/tpls/wizard.tpl b/modules/Users/tpls/wizard.tpl index 5ef18d93..791dbbb6 100644 --- a/modules/Users/tpls/wizard.tpl +++ b/modules/Users/tpls/wizard.tpl @@ -249,13 +249,7 @@ function disableReturnSubmission(e) { <td colspan="4"><hr /></td> </tr> <tr> - {capture name=SMARTY_LOCALE_NAME_FORMAT_DESC} {$MOD.LBL_LOCALE_NAME_FORMAT_DESC}<br />{$MOD.LBL_LOCALE_NAME_FORMAT_DESC_2}{/capture} - <td nowrap="nowrap" scope="row" valign="top">{$MOD.LBL_LOCALE_DEFAULT_NAME_FORMAT}: {sugar_help text=$smarty.capture.SMARTY_LOCALE_NAME_FORMAT_DESC }</td> - <td valign="top"> - <input onkeyup="setPreview();" onkeydown="setPreview();" id="default_locale_name_format" type="text" tabindex='14' name="default_locale_name_format" value="{$default_locale_name_format}"> - </td> - <td nowrap="nowrap" scope="row" valign="top"><i>{$MOD.LBL_LOCALE_EXAMPLE_NAME_FORMAT}:</i> </td> - <td valign="top"><input tabindex='14' name="no_value" id="nameTarget" value="" style="border: none;" disabled size="30"></td> + <td><input id="default_locale_name_format" type="hidden" name="default_locale_name_format" value="{$default_locale_name_format}"></td> </tr> </table> </div> diff --git a/service/core/SoapHelperWebService.php b/service/core/SoapHelperWebService.php index 735832ed..22dfe276 100644 --- a/service/core/SoapHelperWebService.php +++ b/service/core/SoapHelperWebService.php @@ -196,7 +196,9 @@ function validate_user($user_name, $password){ $GLOBALS['log']->info('Begin: SoapHelperWebServices->validate_authenticated'); if(!empty($session_id)){ session_id($session_id); - session_start(); + if(empty($_SESSION)) { + session_start(); + } if(!empty($_SESSION['is_valid_session']) && $this->is_valid_ip_address('ip_address') && $_SESSION['type'] == 'user'){ global $current_user; diff --git a/service/core/SugarWebServiceImpl.php b/service/core/SugarWebServiceImpl.php index 082263b5..c327c929 100644 --- a/service/core/SugarWebServiceImpl.php +++ b/service/core/SugarWebServiceImpl.php @@ -865,7 +865,7 @@ function get_document_revision($session, $id) { * @param string[] $modules - array of modules to query * @param int $offset - a specified offset in the query * @param int $max_results - max number of records to return - * @return Array return_search_result - Array('Accounts' => array(array('name' => 'first_name', 'value' => 'John', 'name' => 'last_name', 'value' => 'Do'))) + * @return Array 'entry_list' -- Array('Accounts' => array(array('name' => 'first_name', 'value' => 'John', 'name' => 'last_name', 'value' => 'Do'))) * @exception 'SoapFault' -- The SOAP error, if any */ function search_by_module($session, $search_string, $modules, $offset, $max_results){ diff --git a/sugar_version.php b/sugar_version.php index 9715a491..8bc70ef5 100644 --- a/sugar_version.php +++ b/sugar_version.php @@ -38,10 +38,10 @@ -$sugar_version = '6.2.3'; -$sugar_db_version = '6.2.3'; +$sugar_version = '6.2.4'; +$sugar_db_version = '6.2.4'; $sugar_flavor = 'CE'; -$sugar_build = '6658'; -$sugar_timestamp = '2011-09-21 06:39pm'; +$sugar_build = '6735'; +$sugar_timestamp = '2011-10-21 12:40pm'; ?> diff --git a/tests/SugarTestHelper.php b/tests/SugarTestHelper.php index 386c6753..9c516fd5 100755 --- a/tests/SugarTestHelper.php +++ b/tests/SugarTestHelper.php @@ -98,6 +98,9 @@ $focus->retrieveSettings(); $focus->saveSetting('system','adminwizard',1); // include the other test tools +require_once 'SugarTestObjectUtilities.php'; +require_once 'SugarTestProjectUtilities.php'; +require_once 'SugarTestProjectTaskUtilities.php'; require_once 'SugarTestUserUtilities.php'; require_once 'SugarTestLangPackCreator.php'; require_once 'SugarTestThemeUtilities.php'; diff --git a/tests/SugarTestMeetingUtilities.php b/tests/SugarTestMeetingUtilities.php index f9b76465..a1daaf31 100755 --- a/tests/SugarTestMeetingUtilities.php +++ b/tests/SugarTestMeetingUtilities.php @@ -42,11 +42,11 @@ class SugarTestMeetingUtilities private function __construct() {} - public static function createMeeting($id = '') + public static function createMeeting($id = '') { $time = mt_rand(); - $name = 'Meeting'; - $meeting = new Meeting(); + $name = 'Meeting'; + $meeting = new Meeting(); $meeting->name = $name . $time; if(!empty($id)) { @@ -61,18 +61,25 @@ class SugarTestMeetingUtilities public static function removeAllCreatedMeetings() { $meeting_ids = self::getCreatedMeetingIds(); - $GLOBALS['db']->query('DELETE FROM meetings WHERE id IN (\'' . implode("', '", $meeting_ids) . '\')'); + $GLOBALS['db']->query(sprintf("DELETE FROM meetings WHERE id IN ('%s')", implode("', '", $meeting_ids))); } - public static function removeMeetingContacts(){ - $meeting_ids = self::getCreatedMeetingIds(); - $GLOBALS['db']->query('DELETE FROM meetings_contacts WHERE meeting_id IN (\'' . implode("', '", $meeting_ids) . '\')'); + public static function removeMeetingContacts() + { + $meeting_ids = self::getCreatedMeetingIds(); + $GLOBALS['db']->query(sprintf("DELETE FROM meetings_contacts WHERE meeting_id IN ('%s')", implode("', '", $meeting_ids))); } - public static function getCreatedMeetingIds() + public static function removeMeetingUsers() + { + $meeting_ids = self::getCreatedMeetingIds(); + $GLOBALS['db']->query(sprintf("DELETE FROM meetings_users WHERE meeting_id IN ('%s')", implode("', '", $meeting_ids))); + } + public static function getCreatedMeetingIds() { $meeting_ids = array(); - foreach (self::$_createdMeetings as $meeting) { + foreach (self::$_createdMeetings as $meeting) + { $meeting_ids[] = $meeting->id; } return $meeting_ids; diff --git a/tests/SugarTestObjectUtilities.php b/tests/SugarTestObjectUtilities.php new file mode 100755 index 00000000..909b67b8 --- /dev/null +++ b/tests/SugarTestObjectUtilities.php @@ -0,0 +1,67 @@ +<?php +/********************************************************************************* + * SugarCRM Community Edition is a customer relationship management program developed by + * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License version 3 as published by the + * Free Software Foundation with the addition of the following permission added + * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK + * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY + * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License along with + * this program; if not, see http://www.gnu.org/licenses or write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA. + * + * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, + * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * SugarCRM" logo. If the display of the logo is not reasonably feasible for + * technical reasons, the Appropriate Legal Notices must display the words + * "Powered by SugarCRM". + ********************************************************************************/ + + + +class SugarTestObjectUtilities +{ + protected static $_createdInstances = array(); + + private function __construct() + { + + } + + public static function pushObject($project) + { + self::$_createdInstances[] = $project; + } + + public static function removeAllCreatedObjects($tablename) + { + $GLOBALS['db']->query('DELETE FROM ' . $tablename . ' WHERE id IN (\'' . implode("', '", self::getCreatedObjectIds()) . '\')'); + } + + public static function getCreatedObjectIds() + { + $ids = array(); + foreach (self::$_createdInstances as $value) + { + $ids[] = $value->id; + } + return $ids; + } +} \ No newline at end of file diff --git a/tests/SugarTestProjectTaskUtilities.php b/tests/SugarTestProjectTaskUtilities.php new file mode 100755 index 00000000..615318e8 --- /dev/null +++ b/tests/SugarTestProjectTaskUtilities.php @@ -0,0 +1,78 @@ +<?php +/********************************************************************************* + * SugarCRM Community Edition is a customer relationship management program developed by + * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License version 3 as published by the + * Free Software Foundation with the addition of the following permission added + * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK + * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY + * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License along with + * this program; if not, see http://www.gnu.org/licenses or write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA. + * + * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, + * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * SugarCRM" logo. If the display of the logo is not reasonably feasible for + * technical reasons, the Appropriate Legal Notices must display the words + * "Powered by SugarCRM". + ********************************************************************************/ + + + +require_once 'modules/ProjectTask/ProjectTask.php'; +class SugarTestProjectTaskUtilities extends SugarTestObjectUtilities +{ + public static $tableName = "project_task"; + + private function __construct() + { + + } + + public static function createProjectTask($projectTaskData) + { + try + { + $projectTask = new ProjectTask(); + $projectTask->project_id = $projectTaskData['project_id']; + $projectTask->parent_task_id = $projectTaskData['parent_task_id']; + $projectTask->project_task_id = $projectTaskData['project_task_id']; + $projectTask->percent_complete = $projectTaskData['percent_complete']; + $projectTask->name = $projectTaskData['name']; + $projectTask->save(); + self::pushObject($projectTask); + return $projectTask; + } + catch (Exception $ex) + { + die("Not all needed params were defined for new project task"); + } + } + + public static function pushProject($project) + { + parent::pushObject($project); + } + + public static function removeAllCreatedProjectTasks() + { + parent::removeAllCreatedObjects(self::$tableName); + } +} diff --git a/tests/SugarTestProjectUtilities.php b/tests/SugarTestProjectUtilities.php new file mode 100755 index 00000000..5189b80d --- /dev/null +++ b/tests/SugarTestProjectUtilities.php @@ -0,0 +1,70 @@ +<?php + +/********************************************************************************* + * SugarCRM Community Edition is a customer relationship management program developed by + * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License version 3 as published by the + * Free Software Foundation with the addition of the following permission added + * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK + * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY + * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License along with + * this program; if not, see http://www.gnu.org/licenses or write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA. + * + * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, + * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * SugarCRM" logo. If the display of the logo is not reasonably feasible for + * technical reasons, the Appropriate Legal Notices must display the words + * "Powered by SugarCRM". + ********************************************************************************/ + + + +require_once 'modules/Project/Project.php'; +class SugarTestProjectUtilities extends SugarTestObjectUtilities +{ + public static $tableName = "project"; + + private function __construct() + { + + } + + public static function createProject($id = '') + { + $project = new Project(); + $project->name = "testProject"; + $project->team_id = 1; + $project->team_set_id = 1; + $project->save(); + self::pushObject($project); + return $project; + } + + public static function pushProject($project) + { + parent::pushObject($project); + } + + public static function removeAllCreatedProjects() + { + parent::removeAllCreatedObjects(self::$tableName); + } +} \ No newline at end of file diff --git a/tests/SugarTestViewConvertLeadUtilities.php b/tests/SugarTestViewConvertLeadUtilities.php new file mode 100755 index 00000000..cd19748d --- /dev/null +++ b/tests/SugarTestViewConvertLeadUtilities.php @@ -0,0 +1,55 @@ +<?php +/********************************************************************************* + * SugarCRM Community Edition is a customer relationship management program developed by + * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License version 3 as published by the + * Free Software Foundation with the addition of the following permission added + * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK + * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY + * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License along with + * this program; if not, see http://www.gnu.org/licenses or write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA. + * + * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, + * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * SugarCRM" logo. If the display of the logo is not reasonably feasible for + * technical reasons, the Appropriate Legal Notices must display the words + * "Powered by SugarCRM". + ********************************************************************************/ + + +require_once('modules/Leads/views/view.convertlead.php'); + +class SugarTestViewConvertLeadUtilities +{ + private static $_createdViewConvertLeads = array(); + + private function __construct() {} + + public static function createViewConvertLead($id = '') + { + $view_conv_lead = new ViewConvertLead(); + require_once('modules/Leads/metadata/convertdefs.php'); + $view_conv_lead->defs = $viewdefs; + self::$_createdViewConvertLeads[] = $view_conv_lead; + return $view_conv_lead; + } +} +?> \ No newline at end of file diff --git a/tests/data/Bug45896Test.php b/tests/data/Bug45896Test.php new file mode 100755 index 00000000..e0dc1a63 --- /dev/null +++ b/tests/data/Bug45896Test.php @@ -0,0 +1,212 @@ +<?php +/********************************************************************************* + * SugarCRM Community Edition is a customer relationship management program developed by + * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License version 3 as published by the + * Free Software Foundation with the addition of the following permission added + * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK + * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY + * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License along with + * this program; if not, see http://www.gnu.org/licenses or write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA. + * + * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, + * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * SugarCRM" logo. If the display of the logo is not reasonably feasible for + * technical reasons, the Appropriate Legal Notices must display the words + * "Powered by SugarCRM". + ********************************************************************************/ + + + +/** + * @brief Try to test download.php for php notices + * @ticket 45896 + */ +class Bug45896Test extends Sugar_PHPUnit_Framework_TestCase +{ + private $curl = null; + private $sessionName = ''; + private $sessionId = ''; + private $backup = array(); + private $user = null; + + /** + * @brief Here we create valid session for anonymous user + * @return void + */ + public function setUp() + { + $this->backup['session.use_cookies'] = ini_get('session.use_cookies'); + ini_set('session.use_cookies', false); + $this->backup['session.use_only_cookies'] = ini_get('session.use_only_cookies'); + ini_set('session.use_only_cookies', false); + + $this->user = SugarTestUserUtilities::createAnonymousUser(); + + $this->curl = curl_init(); + curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($this->curl, CURLOPT_URL, $GLOBALS['sugar_config']['site_url']); + curl_setopt($this->curl, CURLOPT_HEADER, true); + curl_setopt($this->curl, CURLOPT_NOBODY, true); + $headers = curl_exec($this->curl); + $error = curl_errno($this->curl); + if ($error != 0) + { + $this->fail('Curl returns incorrect code'); + } + + $headers = explode("\r\n", trim($headers)); + foreach ($headers as $header) + { + $header = explode(': ', $header, 2); + if ($header[0] == 'Set-Cookie') + { + $header[1] = explode('; ', $header[1]); + $header = reset($header[1]); + $header = explode('=', $header, 2); + $this->sessionName = $header[0]; + $this->sessionId = $header[1]; + } + } + + session_id($this->sessionId); + @session_start(); + $_SESSION['authenticated_user_id'] = $this->user->id; + $_SESSION['authenticated_user_language'] = $GLOBALS['sugar_config']['default_language']; + $_SESSION['unique_key'] = $GLOBALS['sugar_config']['unique_key']; + if ($_SESSION['unique_key'] == false) + { + $this->fail('You must set unique_key value in config.php'); + } + session_write_close(); + } + + /** + * @brief query strings for download random file + * @return array + */ + public function getQueryString() + { + return array( + array('entryPoint=download&id=643da5f0-513c-0933-5222-4e521fc84036&type=SugarFieldImage&isTempFile=1'), + array('entryPoint=download&id=WeShouldTryToDownloadIncorrectFile&type=SugarFieldImage&isTempFile=1'), + array('entryPoint=download&id=WeShouldTryToDownloadIncorrectFile&type=SugarFieldImage'), + array('entryPoint=download&id=WeShouldTryToDownloadIncorrectFile&type=2&isTempFile=1') + ); + } + + /** + * @brief try to download files and to check response for notices + * @dataProvider getQueryString + * @group 45896 + * + * @param array $queryString query string to download any file url + */ + public function testDownload($queryString) + { + $this->markTestSkipped('Need mgusev to fix this test'); + return; + curl_setopt($this->curl, CURLOPT_HEADER, true); + curl_setopt($this->curl, CURLOPT_NOBODY, false); + curl_setopt($this->curl, CURLOPT_URL, $GLOBALS['sugar_config']['site_url'].'?'.$queryString); + curl_setopt( + $this->curl, + CURLOPT_COOKIE, + 'ck_login_id_20='.$this->user->id.'; '. + 'ck_login_language_20=en_us; '. + 'ck_login_theme_20=Sugar; '. + 'globalLinksOpen=true; '. + 'sugar_theme_gm_current=All; '. + 'sugar_user_theme=Sugar; '. + $this->sessionName.'='.$this->sessionId + ); + $content = curl_exec($this->curl); + $error = curl_errno($this->curl); + $stat = curl_getinfo($this->curl); + if ($error != 0) // need only valid curl result + { + $this->fail('Curl returns incorrect code'); + } + elseif ($stat['http_code'] != 200) // need only success header + { + $this->fail('Incorrect HTTP code for test'); + } + + // getting headers + $content = explode("\r\n\r\n", $content, 2); + $content[0] = explode("\r\n", $content[0]); + $headers = array(); + foreach ($content[0] as $header) + { + $header = explode(': ', $header, 2); + if (count($header) != 2) + { + continue; + } + $headers[strtolower($header[0])] = $header[1]; + } + $content = $content[1]; + + // parse for type of content + $headers['content-type'] = explode('/', $headers['content-type'], 2); + $headers['content-type'] = strtolower(reset($headers['content-type'])); + + // thinking what image and application type is valid, text is our test place, other types are fail + switch ($headers['content-type']) { + case 'image' : + case 'application' : + { + $this->assertNotEmpty($content, 'Content should be not empty'); + } + break; + case 'text' : + { + $this->assertContains( + $content, + array( + 'Not a Valid Entry Point', + 'Error. This type is not valid.', + 'Invalid File Reference' + ), + 'Got php notice' + ); + } + break; + default : + { + $this->fail('Received unknown content type'); + } + } + } + + /** + * @brief closing curl connection and restore php.ini parameters + * @return void + */ + public function tearDown() + { + curl_close($this->curl); + foreach ($this->backup as $k=>$v) + { + ini_set($k, $v); + } + } +} diff --git a/tests/include/Bug45525Test.php b/tests/include/Bug45525Test.php new file mode 100755 index 00000000..54e033b6 --- /dev/null +++ b/tests/include/Bug45525Test.php @@ -0,0 +1,100 @@ +<?php +/********************************************************************************* + * SugarCRM Community Edition is a customer relationship management program developed by + * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License version 3 as published by the + * Free Software Foundation with the addition of the following permission added + * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK + * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY + * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License along with + * this program; if not, see http://www.gnu.org/licenses or write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA. + * + * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, + * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * SugarCRM" logo. If the display of the logo is not reasonably feasible for + * technical reasons, the Appropriate Legal Notices must display the words + * "Powered by SugarCRM". + ********************************************************************************/ + + +class Bug45525 extends Sugar_PHPUnit_Framework_TestCase +{ + + /** + * @group Bug45525 + */ + var $testLangFile = "cache/upload/myLang.php"; + + public function setUp() + { + } + + + public function tearDown() + { + } + + public function testOverwriteDropDown() + { + global $app_list_strings; + $app_list_strings = array("TestList" => array ("A" => "Option A", "B" => "Option B", "C" => "Option C")); + + require_once 'include/utils.php'; + + file_put_contents($this->testLangFile, "<?php\n\$app_list_strings['TestList']['D'] = 'Option D';\n?>"); + + // Initially TestList should have 3 items + $this->assertEquals(3, count($app_list_strings['TestList'])); + + $app_list_strings = _mergeCustomAppListStrings($this->testLangFile, $app_list_strings); + + // After merge with custom language file, TestList should have just 1 item (standard behaviour) + $this->assertEquals(1, count($app_list_strings['TestList'])); + + unlink($this->testLangFile); + + unset($GLOBALS['app_list_strings']); + } + + public function testAppendDropDown() + { + global $app_list_strings; + $app_list_strings = array("TestList" => array ("A" => "Option A", "B" => "Option B", "C" => "Option C")); + + require_once 'include/utils.php'; + + file_put_contents($this->testLangFile, "<?php\n\$exemptDropdowns[] = 'TestList';\n\$app_list_strings['TestList']['D'] = 'Option D';\n?>"); + + // Initially TestList should have 3 items + $this->assertEquals(3, count($app_list_strings['TestList'])); + + $app_list_strings = _mergeCustomAppListStrings($this->testLangFile, $app_list_strings); + + // After merge with custom language file, TestList should have 4 items (after-fix behaviour) + $this->assertEquals(4, count($app_list_strings['TestList'])); + + unlink($this->testLangFile); + + unset($GLOBALS['app_list_strings']); + } + +} + diff --git a/tests/include/Dashlets/Bug46217Test.php b/tests/include/Dashlets/Bug46217Test.php new file mode 100755 index 00000000..c75725cd --- /dev/null +++ b/tests/include/Dashlets/Bug46217Test.php @@ -0,0 +1,95 @@ +<?php + +/********************************************************************************* + * SugarCRM Community Edition is a customer relationship management program developed by + * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License version 3 as published by the + * Free Software Foundation with the addition of the following permission added + * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK + * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY + * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License along with + * this program; if not, see http://www.gnu.org/licenses or write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA. + * + * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, + * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * SugarCRM" logo. If the display of the logo is not reasonably feasible for + * technical reasons, the Appropriate Legal Notices must display the words + * "Powered by SugarCRM". + ********************************************************************************/ + + +/** + * Created: Sep 12, 2011 + */ +include_once('include/Dashlets/DashletRssFeedTitle.php'); + +class Bug46217Test extends Sugar_PHPUnit_Framework_TestCase { + + public $rssFeedClass; + + public function setUp() { + $this->rssFeedClass = new DashletRssFeedTitle(""); + } + + public function tearDown() { + unset($this->rssFeedClass); + } + + public function dataProviderCorrectParse() { + return array( + array('<?xml version="1.0" encoding="UTF-8"?> + <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel> + <title>France Info + http://www.france-info.com + France Info - A la Une + + http://www.france-info.com/IMG/siteon0.gif + France Info + http://www.france-info.com + ', + + 'France Info' + ), + array(' + + + <![CDATA[RSS Title]]> + This is an example of an RSS feed + http://www.someexamplerssdomain.com/main.html + Mon, 06 Sep 2010 00:01:00 +0000 + Mon, 06 Sep 2009 16:45:00 +0000 ', + + 'RSS Title' + ), + ); + } + + /** + * @dataProvider dataProviderCorrectParse + */ + public function testCorrectTitleParse($rssFeed, $expectedTitle) { + $this->rssFeedClass->contents = $rssFeed; + $this->rssFeedClass->getTitle(); + $this->assertEquals($expectedTitle, $this->rssFeedClass->title); + $this->rssFeedClass->convertEncoding(); + $this->assertEquals($expectedTitle, $this->rssFeedClass->title); + } +} \ No newline at end of file diff --git a/tests/include/ListView/ListViewDisplayTest.php b/tests/include/ListView/ListViewDisplayTest.php index 44c5f161..885d13e9 100755 --- a/tests/include/ListView/ListViewDisplayTest.php +++ b/tests/include/ListView/ListViewDisplayTest.php @@ -213,8 +213,9 @@ class ListViewDisplayTest extends Sugar_PHPUnit_Framework_TestCase $_REQUEST['query'] = ''; $_SESSION['last_search_mod'] = 'foo'; - $this->assertTrue($this->_lvd->shouldProcess('foo')); - $this->assertTrue($this->_lvd->should_process); + //C.L. Because of fix to 40186, the following two tests are now set to assertFalse + $this->assertFalse($this->_lvd->shouldProcess('foo'), 'Assert that ListViewDisplay->shouldProcess is false even if module is the same because no query was specified'); + $this->assertFalse($this->_lvd->should_process, 'Assert that ListViewDisplay->shouldProcess class variable is false'); if ( isset($oldsavequery) ) { $GLOBALS['sugar_config']['save_query'] = $oldsavequery; diff --git a/tests/include/Localization/Bug35413Test.php b/tests/include/Localization/Bug35413Test.php new file mode 100755 index 00000000..af17d2aa --- /dev/null +++ b/tests/include/Localization/Bug35413Test.php @@ -0,0 +1,84 @@ +_localization = new Localization(); + } + + function stringsProvider() + { + return array( + array( + '7cvU3iDI5d7L7O3TIOUg1cfU7N0g3c4g5ezR1NPd5eHU3csg287a', + 'يثشق بهقثىيس ه صاشىف فخ هىرشسفهلشفث غخع', + 'windows-1256' + ), + array( + '7cjT7cjU0+3IwcbExNE=', + 'يبسيبشسيبءئؤؤر', + 'windows-1256' + ) + ); + } + + /** + * Test convert base64 $source to string and convert string from $encoding to utf8. It has to return $utf8string. + * + * @dataProvider stringsProvider + * @ticket 35413 + * @param string $source base64 encoded string in native charset + * @param string $utf8string previous string in utf8 + * @param string $encoding encoding of native string + */ + public function testEncodings($source, $utf8string, $encoding) + { + $source = base64_decode($source); + $translateCharsetResult = $this->_localization->translateCharset($source, $encoding, 'UTF-8'); + $this->assertEquals($utf8string, $translateCharsetResult, 'Strings have to be the same'); + } +} \ No newline at end of file diff --git a/tests/include/MassUpdate/MassUpdateTest.php b/tests/include/MassUpdate/MassUpdateTest.php index 1b0de0cc..88fa4dfa 100755 --- a/tests/include/MassUpdate/MassUpdateTest.php +++ b/tests/include/MassUpdate/MassUpdateTest.php @@ -80,10 +80,15 @@ class MassUpdateTest extends Sugar_PHPUnit_Framework_TestCase ); $result = $mass->addStatus('test_dom', 'test_dom', $options); preg_match_all('/value=[\'\"].*?[\'\"]/si', $result, $matches); - $this->assertTrue(isset($matches)); + /* $this->assertTrue(isset($matches)); + $this->assertTrue($matches[0][0] == "value=''"); + $this->assertTrue($matches[0][2] == "value='10'"); + $this->assertTrue($matches[0][3] == "value='20'"); */ $this->assertTrue($matches[0][0] == "value=''"); - $this->assertTrue($matches[0][1] == "value='10'"); - $this->assertTrue($matches[0][3] == "value='30'"); + $this->assertTrue($matches[0][1] == "value='__SugarMassUpdateClearField__'"); + $this->assertTrue($matches[0][2] == "value='10'"); + $this->assertTrue($matches[0][3] == "value='20'"); + $this->assertTrue($matches[0][4] == "value='30'"); } /** @@ -101,8 +106,13 @@ class MassUpdateTest extends Sugar_PHPUnit_Framework_TestCase $result = $mass->addStatusMulti('test_dom', 'test_dom', $options); preg_match_all('/value=[\'\"].*?[\'\"]/si', $result, $matches); $this->assertTrue(isset($matches)); + /*$this->assertTrue($matches[0][0] == "value=''"); + $this->assertTrue($matches[0][2] == "value='10'"); + $this->assertTrue($matches[0][3] == "value='20'"); */ $this->assertTrue($matches[0][0] == "value=''"); - $this->assertTrue($matches[0][1] == "value='10'"); - $this->assertTrue($matches[0][3] == "value='30'"); + $this->assertTrue($matches[0][1] == "value='__SugarMassUpdateClearField__'"); + $this->assertTrue($matches[0][2] == "value='10'"); + $this->assertTrue($matches[0][3] == "value='20'"); + $this->assertTrue($matches[0][4] == "value='30'"); } } diff --git a/tests/include/SearchForm/Bug45966Test.php b/tests/include/SearchForm/Bug45966Test.php index f1b8d20d..019b7531 100755 --- a/tests/include/SearchForm/Bug45966Test.php +++ b/tests/include/SearchForm/Bug45966Test.php @@ -78,9 +78,9 @@ class Bug45966 extends Sugar_PHPUnit_Framework_TestCase { public function tearDown() { unset($this->array); - unset($this->seed); unset($this->form); - SugarTestAccountUtilities::removeAllCreatedAccounts(); + unset($this->seed); + SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); unset($GLOBALS['current_user']); unset($listViewDefs); unset($searchFields); @@ -171,7 +171,7 @@ class Bug45966 extends Sugar_PHPUnit_Framework_TestCase { $this->array['range_date_entered_advanced'] = "[$testDate]"; $adjToday = $timedate->getDayStartEndGMT(date('m/d/Y'), $user); - $adjStartDate = $timedate->getDayStartEndGMT(date('m/d/Y', time() - (7 * 24 * 60 * 60)), $user); + $adjStartDate = $timedate->getDayStartEndGMT(date('m/d/Y', time() - (6 * TimeDate::SECONDS_IN_A_DAY)), $user); $expected = array(strtolower($this->module).".date_entered >= '".$adjStartDate['start']."' AND ". strtolower($this->module).".date_entered <= '".$adjToday['end']."'"); @@ -191,7 +191,7 @@ class Bug45966 extends Sugar_PHPUnit_Framework_TestCase { $this->array['range_date_entered_advanced'] = "[$testDate]"; $adjToday = $timedate->getDayStartEndGMT(date('m/d/Y'), $user); - $adjEndDate = $timedate->getDayStartEndGMT(date('m/d/Y', time() + (7 * 24 * 60 * 60)), $user); + $adjEndDate = $timedate->getDayStartEndGMT(date('m/d/Y', time() + (6 * TimeDate::SECONDS_IN_A_DAY)), $user); $expected = array(strtolower($this->module).".date_entered >= '".$adjToday['start']."' AND ". strtolower($this->module).".date_entered <= '".$adjEndDate['end']."'"); @@ -211,7 +211,7 @@ class Bug45966 extends Sugar_PHPUnit_Framework_TestCase { $this->array['range_date_entered_advanced'] = "[$testDate]"; $adjToday = $timedate->getDayStartEndGMT(date('m/d/Y'), $user); - $adjStartDate = $timedate->getDayStartEndGMT(date('m/d/Y', time() - (30 * 24 * 60 * 60)), $user); + $adjStartDate = $timedate->getDayStartEndGMT(date('m/d/Y', time() - (29 * TimeDate::SECONDS_IN_A_DAY)), $user); $expected = array(strtolower($this->module).".date_entered >= '".$adjStartDate['start']."' AND ". strtolower($this->module).".date_entered <= '".$adjToday['end']."'"); @@ -231,7 +231,7 @@ class Bug45966 extends Sugar_PHPUnit_Framework_TestCase { $this->array['range_date_entered_advanced'] = "[$testDate]"; $adjToday = $timedate->getDayStartEndGMT(date('m/d/Y'), $user); - $adjEndDate = $timedate->getDayStartEndGMT(date('m/d/Y', time() + (30 * 24 * 60 * 60)), $user); + $adjEndDate = $timedate->getDayStartEndGMT(date('m/d/Y', time() + (29 * TimeDate::SECONDS_IN_A_DAY)), $user); $expected = array(strtolower($this->module).".date_entered >= '".$adjToday['start']."' AND ". strtolower($this->module).".date_entered <= '".$adjEndDate['end']."'"); diff --git a/tests/include/Smarty/plugins/FunctionSugarTranslateTest.php b/tests/include/Smarty/plugins/FunctionSugarTranslateTest.php index 046e35a6..16f5929b 100755 --- a/tests/include/Smarty/plugins/FunctionSugarTranslateTest.php +++ b/tests/include/Smarty/plugins/FunctionSugarTranslateTest.php @@ -91,4 +91,49 @@ class FunctionSugarTranslateTest extends Sugar_PHPUnit_Framework_TestCase $smarty) ); } + + public function providerStripColonSting() + { + return array( + array( + "Friend:", + "Friend:", + ), + array( + "Friend : ", + "Friend : ", + ), + array( + ": Friend", + ": Friend", + ), + array( + "Fr:iend", + "Fr:iend", + ), + ); + } + + /** + * @dataProvider providerStripColonSting + * @ticket 41983 + */ + public function testStripColonString($string, $returnedString) + { + $langpack = new SugarTestLangPackCreator(); + $langpack->setModString('LBL_TEST_JS_ESCAPED_STRING', $string, 'Contacts'); + $langpack->save(); + + $smarty = new Sugar_Smarty; + + $this->assertEquals($returnedString, smarty_function_sugar_translate( + array( + 'label' => 'LBL_TEST_JS_ESCAPED_STRING', + 'module' => 'Contacts', + 'trimColon' => false, + ), + $smarty) + ); + } + } diff --git a/tests/include/SugarCharts/Bug42326Test.php b/tests/include/SugarCharts/Bug42326Test.php index a5025d94..b6baaa56 100755 --- a/tests/include/SugarCharts/Bug42326Test.php +++ b/tests/include/SugarCharts/Bug42326Test.php @@ -76,5 +76,4 @@ class Bug42326Test extends Sugar_PHPUnit_Framework_TestCase } } -?> - +?> \ No newline at end of file diff --git a/tests/include/SugarCharts/Bug44696Test.php b/tests/include/SugarCharts/Bug44696Test.php new file mode 100755 index 00000000..d7d26be9 --- /dev/null +++ b/tests/include/SugarCharts/Bug44696Test.php @@ -0,0 +1,167 @@ +group_by = array ('sales_stage', 'user_name'); + $sugarChartObject->data_set = $this->getDataSet(); + $sugarChartObject->base_url = array ('module' => 'Opportunities', + 'action' => 'index', + 'query' => 'true', + 'searchFormTab' => 'advanced_search'); + $sugarChartObject->url_params = array (); + $sugarChartObject->is_currency = true; + // we have 5 users + $sugarChartObject->super_set = array ('will', 'max', 'sarah', 'sally', 'chris'); + $this->sugarChartObject = $sugarChartObject; + } + + public function tearDown() + { + SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); + unset($GLOBALS['current_user']); + } + + public function getDataSet() { + return array ( + array ( + 'sales_stage' => 'Proposal/Price Quote', + 'user_name' => 'max', + 'assigned_user_id' => 'seed_max_id', + 'opp_count' => '1', + 'total' => '50', + 'key' => 'Proposal/Price Quote', + 'value' => 'Proposal/Price Quote', + ), + array ( + 'sales_stage' => 'Proposal/Price Quote', + 'user_name' => 'sally', + 'assigned_user_id' => 'seed_sally_id', + 'opp_count' => '2', + 'total' => '75', + 'key' => 'Proposal/Price Quote', + 'value' => 'Proposal/Price Quote', + ), + ); + } + + /** + * We check, that groups with NULL value remain their order in subgroups tag and won't fall down under not null valued groups. + * This way we guarantee that links will be put correctly to each user in whole user list (will, max, etc.). + */ + public function testCorrectXml() + { + $actual = $this->sugarChartObject->xmlDataGenericChart(); + $expected = $this->compareXml(); + $order = array("\r\n", "\n", "\r", "\t"); + $replace = ""; + // remove all break lines and spaces and tabs + $expected = str_replace($order, $replace, $expected); + $actual = str_replace($order, $replace, $actual); + $this->assertEquals($expected, $actual); + } + + /** + * @return xml string + */ + public function compareXml() + { + $max = 50; + $sally = 75; + $total = $max + $sally; + $max = $this->convertCurrency($max); + $sally = $this->convertCurrency($sally); + $total = $this->convertCurrency($total); + + return " + Proposal/Price Quote + {$total->subAmount} + + index.php?module=Opportunities&action=index&query=true&searchFormTab=advanced_search&sales_stage=Proposal%2FPrice+Quote + + + will + NULL + + index.php?module=Opportunities&action=index&query=true&searchFormTab=advanced_search&sales_stage=Proposal%2FPrice+Quote + + + max + {$max->subAmount} + + index.php?module=Opportunities&action=index&query=true&searchFormTab=advanced_search&sales_stage=Proposal%2FPrice+Quote&assigned_user_id[]=seed_max_id + + + sarah + NULL + + index.php?module=Opportunities&action=index&query=true&searchFormTab=advanced_search&sales_stage=Proposal%2FPrice+Quote + + + sally + {$sally->subAmount} + + index.php?module=Opportunities&action=index&query=true&searchFormTab=advanced_search&sales_stage=Proposal%2FPrice+Quote&assigned_user_id[]=seed_sally_id + + + chris + NULL + + index.php?module=Opportunities&action=index&query=true&searchFormTab=advanced_search&sales_stage=Proposal%2FPrice+Quote + + "; + } + + public function convertCurrency($value) { + $sub_amount = $this->sugarChartObject->formatNumber($this->sugarChartObject->convertCurrency($value)); + $sub_amount_formatted = $this->sugarChartObject->currency_symbol . $sub_amount . 'K'; + $sub_amount = $this->sugarChartObject->convertCurrency($value); + $return = new stdClass(); + $return->subAmount = $sub_amount; + $return->subAmountFormatted = $sub_amount_formatted; + return $return; + } +} \ No newline at end of file diff --git a/tests/modules/Home/Bug39610Test.php b/tests/include/SugarEmailAddress/Bug42279Test.php similarity index 54% rename from tests/modules/Home/Bug39610Test.php rename to tests/include/SugarEmailAddress/Bug42279Test.php index 53456196..467b0307 100755 --- a/tests/modules/Home/Bug39610Test.php +++ b/tests/include/SugarEmailAddress/Bug42279Test.php @@ -35,65 +35,44 @@ ********************************************************************************/ -require_once 'include/EditView/SubpanelQuickCreate.php'; +require_once 'include/SugarEmailAddress/SugarEmailAddress.php'; +require_once 'SugarTestContactUtilities.php'; -class Bug39610Test extends Sugar_PHPUnit_Framework_TestCase -{ - public function setUp() - { - global $app_strings, $app_list_strings; - $app_strings = return_application_language($GLOBALS['current_language']); - $app_list_strings = return_app_list_strings_language($GLOBALS['current_language']); - $GLOBALS['current_user'] = SugarTestUserUtilities::createAnonymousUser(); - } - - public function tearDown() - { - SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); - unset($GLOBALS['current_user']); - } - - public function testUseCustomViewAndCustomClassName() - { - $target_module = 'Contacts'; - sugar_mkdir('custom/modules/'. $target_module . '/views/',null,true); - if( $fh = @fopen('custom/modules/'. $target_module . '/views/view.edit.php', 'w') ) - { -$string = << -EOQ; - fputs( $fh, $string); - fclose( $fh ); - } + public function setUp() { + + $GLOBALS['current_user'] = SugarTestUserUtilities::createAnonymousUser(); + $this->contact = SugarTestContactUtilities::createContact(); + + } - - $subpanelMock = new SubpanelQuickCreateMockBug39610Test($target_module, 'SubpanelQuickCreate'); - $this->assertTrue(!empty($GLOBALS['CustomContactsSubpanelQuickCreated']), "Assert that CustomContactsEditView constructor was called"); - @unlink('custom/modules/'. $target_module . '/views/view.subpanelquickcreate.php'); + public function tearDown() { + SugarTestContactUtilities::removeAllCreatedContacts(); + SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); } -} + /** + * @group bug42279 + */ + public function testEmailAddressInFetchedRow() { + $sea = new SugarEmailAddress(); + // this will populate contact->email1 + $sea->populateLegacyFields($this->contact); + $email1 = $this->contact->email1; -class SubpanelQuickCreateMockBug39610Test extends SubpanelQuickCreate -{ - public function SubpanelQuickCreateMockBug39610Test($module, $view='QuickCreate', $proccessOverride = false) - { - parent::SubpanelQuickCreate($module, $view, $proccessOverride); - } - - public function process() - { - //no-op - } + // this should set fetched_row['email1'] to contatc->email1 + $sea->handleLegacyRetrieve($this->contact); + $this->assertEquals($email1, $this->contact->fetched_row['email1']); + } } diff --git a/tests/modules/Contracts/Bug44836Test.php b/tests/include/SugarFields/Fields/Radioenum/SugarFieldRadioenumTest.php similarity index 69% rename from tests/modules/Contracts/Bug44836Test.php rename to tests/include/SugarFields/Fields/Radioenum/SugarFieldRadioenumTest.php index dc271e1d..ae8f7b94 100755 --- a/tests/modules/Contracts/Bug44836Test.php +++ b/tests/include/SugarFields/Fields/Radioenum/SugarFieldRadioenumTest.php @@ -1,4 +1,4 @@ - "value" + ); + protected $_testKey = "key"; + protected $_testValue = "value"; + protected $_testingArrayName = "new_radio_list"; + protected $_testingFieldType = "Radioenum"; + public function setUp() { - include('include/modules.php'); - $GLOBALS['beanList'] = $beanList; - $GLOBALS['beanFiles'] = $beanFiles; - $GLOBALS['current_user'] = SugarTestUserUtilities::createAnonymousUser(); - $GLOBALS['current_user']->is_admin = 1; - $GLOBALS['current_user']->setPreference('timezone', "America/Los_Angeles"); - $GLOBALS['current_user']->setPreference('datef', "m/d/Y"); - $GLOBALS['current_user']->setPreference('timef', "h.iA"); + global $app_list_strings; + $app_list_strings[$this->_testingArrayName] = $this->_testingArray; } - + public function tearDown() { - SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); + if (!empty($app_list_strings[$this->_testingArrayName])) { + unset($app_list_strings[$this->_testingArrayName]); + } } - - public function testContractsSubpanelQuickCreate() + + public function testEmailTemplateFormat() { - $subpanelQuickCreate = new SubpanelQuickCreate('Contracts', 'QuickCreate'); - $this->expectOutputRegex('/check_form\s*?\(\s*?\'form_SubpanelQuickCreate_Contracts\'\s*?\)/'); + $radioEnumClass = new SugarFieldRadioenum($this->_testingFieldType); + $actualResult = $radioEnumClass->getEmailTemplateValue($this->_testKey, array ("options" => $this->_testingArrayName)); + $this->assertEquals($this->_testValue, $actualResult); } - -} - -?> \ No newline at end of file +} \ No newline at end of file diff --git a/tests/include/ValidDBNameTest.php b/tests/include/ValidDBNameTest.php index b0c4c2ae..ed029861 100755 --- a/tests/include/ValidDBNameTest.php +++ b/tests/include/ValidDBNameTest.php @@ -76,4 +76,47 @@ class ValidDBNameTest extends Sugar_PHPUnit_Framework_TestCase ); } + public function testValidMySQLNameReturnsTrue() + { + $this->assertTrue(isValidDBName('sugarCRM', 'mysql')); + $this->assertTrue(isValidDBName('sugar-crm', 'mysql')); + $this->assertTrue(isValidDBName('sugar_crm', 'mysql')); + $this->assertTrue(isValidDBName('sugar-crm', 'mysql')); + $this->assertTrue(isValidDBName('sugar-CRM_ver6', 'mysql')); + } + + public function testInvalidMySQLNameReturnsFalse() + { + $this->assertFalse(isValidDBName('sugar/crm', 'mysql')); + $this->assertFalse(isValidDBName('sugar\crm', 'mysql')); + $this->assertFalse(isValidDBName('sugar.crm', 'mysql')); + } + + public function testValidOracleNameReturnsTrue() + { + $this->assertTrue(isValidDBName('sugarCRM', 'oci8')); + $this->assertTrue(isValidDBName('sugar_crm', 'oci8')); + $this->assertTrue(isValidDBName('sugarCRM_ver6', 'oci8')); + } + + public function testInvalidOracleNameReturnsFalse() + { + $this->assertFalse(isValidDBName('sugar\CRM', 'oci8')); + $this->assertFalse(isValidDBName('sugar crm', 'oci8')); + $this->assertFalse(isValidDBName('sugarCRM_ver#63', 'oci8')); + } + + public function testValidMSSQLNameReturnsTrue() + { + $this->assertTrue(isValidDBName('sugarCRM', 'mssql')); + $this->assertTrue(isValidDBName('sugar_crm', 'mssql')); + $this->assertTrue(isValidDBName('sugarCRM_ver6', 'mssql')); + } + + public function testInvalidMSSQLNameReturnsFalse() + { + $this->assertFalse(isValidDBName('622sugarCRM', 'mssql')); + $this->assertFalse(isValidDBName('sugar crm', 'mssql')); + $this->assertFalse(isValidDBName('#sugarCRM_ver6', 'mssql')); + } } diff --git a/tests/modules/Calls/Bug39161Test.php b/tests/modules/Calls/Bug39161Test.php index ed98d1a2..a9b08f55 100755 --- a/tests/modules/Calls/Bug39161Test.php +++ b/tests/modules/Calls/Bug39161Test.php @@ -36,16 +36,35 @@ require_once("modules/ModuleBuilder/parsers/views/GridLayoutMetaDataParser.php"); require_once("modules/ModuleBuilder/parsers/views/ListLayoutMetaDataParser.php"); +require_once 'modules/ModuleBuilder/parsers/views/AbstractMetaDataParser.php' ; +require_once 'modules/ModuleBuilder/parsers/views/MetaDataParserInterface.php' ; + class Bug39161Test extends Sugar_PHPUnit_Framework_TestCase { + /* + public function setUp() + { + $lv = new ListLayoutMetaDataParser('EditView', 'Calls'); + } + */ public function testCallsContactStudioViews() { $seed = new Call(); $def = $seed->field_defs['contact_name']; - $this->assertTrue(ListLayoutMetaDataParser::isValidField($def['name'], $def)); + $lv = new ListLayoutMetaDataParserMock2(MB_LISTVIEW, 'Calls'); + $this->assertTrue($lv->isValidField($def['name'], $def)); $this->assertFalse(GridLayoutMetaDataParser::validField($def, 'editview')); $this->assertFalse(GridLayoutMetaDataParser::validField($def, 'detailview')); $this->assertFalse(GridLayoutMetaDataParser::validField($def, 'quickcreate')); } +} + +class ListLayoutMetaDataParserMock2 extends ListLayoutMetaDataParser +{ + function __construct ($view , $moduleName , $packageName = '') + { + $this->view = $view; + } + } \ No newline at end of file diff --git a/tests/modules/Contacts/Bug36989Test.php b/tests/modules/Contacts/Bug36989Test.php new file mode 100755 index 00000000..4950a1d2 --- /dev/null +++ b/tests/modules/Contacts/Bug36989Test.php @@ -0,0 +1,94 @@ +markTestIncomplete( + 'This test is not working.' + ); + $GLOBALS['current_user'] = SugarTestUserUtilities::createAnonymousUser(); + require('include/modules.php'); + $GLOBALS['beanList'] = $beanList; + $GLOBALS['beanFiles'] = $beanFiles; + $GLOBALS['app_strings'] = return_application_language($GLOBALS['current_language']); + + + if(file_exists('custom/modules/Contacts/metadata/SearchFields.php')) + { + $this->customSearchFields = file_get_contents('custom/modules/Contacts/metadata/SearchFields.php'); + unlink('custom/modules/Contacts/metadata/SearchFields.php'); + } + + $this->searchFieldsBackup = file_get_contents('modules/Contacts/metadata/SearchFields.php'); + file_put_contents('modules/Contacts/metadata/SearchFields.php', ' array());'); + + } + + public function tearDown() + { + file_put_contents('modules/Contacts/metadata/SearchFields.php', $this->searchFieldsBackup); + + if(!empty($this->customSearchFields)) + { + file_put_contents('custom/modules/Contacts/metadata/SearchFields.php', $this->customSearchFields); + } + + SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); + unset($GLOBALS['current_user']); + unset($GLOBALS['app_strings']); + + } + + function testOverrideSearchFields() { + $list = new ViewList(); + $list->module = "Contacts"; + $list->seed = new Contact(); + $list->prepareSearchForm(); + $this->assertTrue(isset($list->searchForm->searchFields['test'])); + } +} +?> diff --git a/tests/modules/Currencies/CurrencyTest.php b/tests/modules/Currencies/CurrencyTest.php index 1cca4546..5e22438f 100755 --- a/tests/modules/Currencies/CurrencyTest.php +++ b/tests/modules/Currencies/CurrencyTest.php @@ -65,7 +65,7 @@ class CurrencyTest extends Sugar_PHPUnit_Framework_TestCase { $testValue = "$100,000.50"; $unformattedValue = unformat_number($testValue); - $this->assertEquals($unformattedValue, 100000.50, "Assert that $100,000.50 becomes 100000.50"); + $this->assertEquals($unformattedValue, 100000.50, "Assert that $100,000.50 becomes 100000.50. Formatted value is: ".$unformattedValue); //Switch the num_grp_sep and dec_sep values $current_user->setPreference('num_grp_sep', '.'); @@ -77,7 +77,7 @@ class CurrencyTest extends Sugar_PHPUnit_Framework_TestCase { $testValue = "$100.000,50"; $unformattedValue = unformat_number($testValue); - $this->assertEquals($unformattedValue, 100000.50, "Assert that $100.000,50 becomes 100000.50"); + $this->assertEquals($unformattedValue, 100000.50, "Assert that $100.000,50 becomes 100000.50. Formatted value is: ".$unformattedValue); } @@ -87,7 +87,7 @@ class CurrencyTest extends Sugar_PHPUnit_Framework_TestCase { $testValue = "100000.50"; $formattedValue = format_number($testValue); - $this->assertEquals($formattedValue, "100,000.50", "Assert that 100000.50 becomes 100,000.50"); + $this->assertEquals($formattedValue, "100,000.50", "Assert that 100000.50 becomes 100,000.50. Formatted value is: ".$formattedValue); //Switch the num_grp_sep and dec_sep values $current_user->setPreference('num_grp_sep', '.'); @@ -99,7 +99,7 @@ class CurrencyTest extends Sugar_PHPUnit_Framework_TestCase { $testValue = "100000.50"; $formattedValue = format_number($testValue); - $this->assertEquals($formattedValue, "100.000,50", "Assert that 100000.50 becomes 100.000,50"); + $this->assertEquals($formattedValue, "100.000,50", "Assert that 100000.50 becomes 100.000,50. Formatted value is: ".$formattedValue); } } diff --git a/tests/modules/Emails/Bug40527Test.php b/tests/modules/Emails/Bug40527Test.php index fd8effec..a691ef6d 100755 --- a/tests/modules/Emails/Bug40527Test.php +++ b/tests/modules/Emails/Bug40527Test.php @@ -45,6 +45,9 @@ class Bug40527Test extends Sugar_PHPUnit_Framework_TestCase public function setUp() { + global $app_strings, $app_list_strings; + $app_strings = return_application_language($GLOBALS['current_language']); + $app_list_strings = return_app_list_strings_language($GLOBALS['current_language']); $GLOBALS['current_user'] = SugarTestUserUtilities::createAnonymousUser(); $this->contact = SugarTestContactUtilities::createContact(); $this->account = SugarTestAccountUtilities::createAccount(); diff --git a/tests/modules/Emails/Bug40911Test.php b/tests/modules/Emails/Bug40911Test.php index 7741884a..3c8c601d 100755 --- a/tests/modules/Emails/Bug40911Test.php +++ b/tests/modules/Emails/Bug40911Test.php @@ -57,6 +57,9 @@ class Bug40911 extends Sugar_PHPUnit_Framework_TestCase */ public function testSaveNewFolder() { + $this->markTestSkipped('This test takes to long to run'); + return; + global $current_user, $app_strings; $email = new Email(); diff --git a/tests/modules/Home/Bug42961Test.php b/tests/modules/Home/Bug42961Test.php new file mode 100755 index 00000000..4149a1dc --- /dev/null +++ b/tests/modules/Home/Bug42961Test.php @@ -0,0 +1,74 @@ +buildCache(); + $this->assertFileExists($GLOBALS['sugar_config']['cache_dir'].'modules/unified_search_modules.php', 'Here should be cache file with data'); + include $GLOBALS['sugar_config']['cache_dir'].'modules/unified_search_modules.php'; + $force_unifiedsearch = 0; + foreach ($unified_search_modules as $moduleName=>$moduleInformation) + { + foreach ($moduleInformation['fields'] as $fieldName=>$fieldInformation) + { + if (key_exists('force_unifiedsearch', $fieldInformation)) { + $force_unifiedsearch++; + } + } + } + $this->assertGreaterThan(0, $force_unifiedsearch, 'Here should be fields with force_unifiedsearch key'); + } +} \ No newline at end of file diff --git a/tests/modules/Home/Bug43653Test.php b/tests/modules/Home/Bug43653Test.php index ee25596e..3b0882d7 100755 --- a/tests/modules/Home/Bug43653Test.php +++ b/tests/modules/Home/Bug43653Test.php @@ -37,7 +37,7 @@ class Bug43653Test extends Sugar_PHPUnit_Framework_OutputTestCase { - + public function setUp() { $GLOBALS['current_user'] = SugarTestUserUtilities::createAnonymousUser(); diff --git a/tests/modules/Leads/ConvertLeadTests.php b/tests/modules/Leads/ConvertLeadTests.php index 2d5a94bc..cb352b92 100755 --- a/tests/modules/Leads/ConvertLeadTests.php +++ b/tests/modules/Leads/ConvertLeadTests.php @@ -50,10 +50,11 @@ class ConvertLeadTests extends Sugar_PHPUnit_Framework_TestCase unset($GLOBALS['current_user']); } - /** - * @group bug39787 - */ - public function testOpportunityNameValueFilled(){ + /** + * @group bug39787 + */ + public function testOpportunityNameValueFilled() + { $lead = SugarTestLeadUtilities::createLead(); $lead->opportunity_name = 'SBizzle Dollar Store'; $lead->save(); @@ -95,4 +96,21 @@ class ConvertLeadTests extends Sugar_PHPUnit_Framework_TestCase unset($_REQUEST['record']); SugarTestLeadUtilities::removeAllCreatedLeads(); } + public function testMeetingsUsersRelationships() + { + global $current_user; + + $bean = SugarTestMeetingUtilities::createMeeting(); + $convert_lead = SugarTestViewConvertLeadUtilities::createViewConvertLead(); + + if ($bean->object_name == "Meeting") + { + $convert_lead->setMeetingsUsersRelationship($bean); + } + + $this->assertTrue(is_object($bean->users), "Relationship wasn't set."); + + SugarTestMeetingUtilities::removeMeetingUsers(); + SugarTestMeetingUtilities::removeAllCreatedMeetings(); + } } \ No newline at end of file diff --git a/tests/modules/Meetings/Bug45287Test.php b/tests/modules/Meetings/Bug45287Test.php index 6ef8130b..cd6eba69 100755 --- a/tests/modules/Meetings/Bug45287Test.php +++ b/tests/modules/Meetings/Bug45287Test.php @@ -45,10 +45,11 @@ class Bug45287Test extends Sugar_PHPUnit_Framework_TestCase var $meetingsArr; var $searchDefs; var $searchFields; + var $timedate; public function setup() { - global $current_user, $timedate; + global $current_user; // Create Anon User setted on GMT+2 TimeZone $current_user = SugarTestUserUtilities::createAnonymousUser(); $current_user->setPreference('datef', "d/m/Y"); @@ -56,7 +57,7 @@ class Bug45287Test extends Sugar_PHPUnit_Framework_TestCase $current_user->setPreference('timezone', "Europe/Rome"); // new object to avoid TZ caching - $timedate = new TimeDate(); + $this->timedate = new TimeDate(); $this->meetingsArr = array(); @@ -67,7 +68,7 @@ class Bug45287Test extends Sugar_PHPUnit_Framework_TestCase { $this->meetingsArr[$cnt] = new Meeting(); $this->meetingsArr[$cnt]->name = 'Bug45287 Meeting ' . ($cnt + 1); - $this->meetingsArr[$cnt]->date_start = $timedate->to_display_date_time(gmdate("Y-m-d H:i:s", mktime(10+$cnt, 30, 00, 7, $d, 2011))); + $this->meetingsArr[$cnt]->date_start = $this->timedate->to_display_date_time(gmdate("Y-m-d H:i:s", mktime(10+$cnt, 30, 00, 7, $d, 2011))); $this->meetingsArr[$cnt]->save(); $d++; $cnt++; @@ -117,6 +118,7 @@ class Bug45287Test extends Sugar_PHPUnit_Framework_TestCase unset($this->meetingsArr); unset($this->searchDefs); unset($this->searchFields); + unset($this->timedate); SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); } @@ -124,7 +126,7 @@ class Bug45287Test extends Sugar_PHPUnit_Framework_TestCase public function testRetrieveByExactDate() { - global $current_user, $timedate; + global $current_user; $_REQUEST = $_POST = array("module" => "Meetings", "action" => "index", @@ -147,7 +149,7 @@ class Bug45287Test extends Sugar_PHPUnit_Framework_TestCase $w = $srch->generateSearchWhere(); // Due to daylight savings, I cannot hardcode intervals... - $GMTDates = $timedate->getDayStartEndGMT("2011-07-14"); + $GMTDates = $this->timedate->getDayStartEndGMT("2011-07-14"); // Current User is on GMT+2. // Asking for meeting of 14 July 2011, I expect to search (GMT) from 13 July at 22:00 until 14 July at 22:00 (excluded) @@ -158,7 +160,7 @@ class Bug45287Test extends Sugar_PHPUnit_Framework_TestCase public function testRetrieveByDaterange() { - global $current_user, $timedate; + global $current_user; $_REQUEST = $_POST = array("module" => "Meetings", "action" => "index", @@ -182,8 +184,8 @@ class Bug45287Test extends Sugar_PHPUnit_Framework_TestCase $w = $srch->generateSearchWhere(); // Due to daylight savings, I cannot hardcode intervals... - $GMTDatesStart = $timedate->getDayStartEndGMT("2011-07-13"); - $GMTDatesEnd = $timedate->getDayStartEndGMT("2011-07-14"); + $GMTDatesStart = $this->timedate->getDayStartEndGMT("2011-07-13"); + $GMTDatesEnd = $this->timedate->getDayStartEndGMT("2011-07-14"); // Current User is on GMT+2. // Asking for meeting between 13 and 14 July 2011, I expect to search (GMT) from 12 July at 22:00 until 14 July at 22:00 (excluded) diff --git a/tests/modules/Meetings/Bug45287_2Test.php b/tests/modules/Meetings/Bug45287_2Test.php index 3a283d04..6cfc96be 100755 --- a/tests/modules/Meetings/Bug45287_2Test.php +++ b/tests/modules/Meetings/Bug45287_2Test.php @@ -45,10 +45,11 @@ class Bug45287_2Test extends Sugar_PHPUnit_Framework_TestCase var $meetingsArr; var $searchDefs; var $searchFields; + var $timedate; public function setup() { - global $current_user, $timedate; + global $current_user; // Create Anon User setted on PDT TimeZone $current_user = SugarTestUserUtilities::createAnonymousUser(); $current_user->setPreference('datef', "d/m/Y"); @@ -56,7 +57,7 @@ class Bug45287_2Test extends Sugar_PHPUnit_Framework_TestCase $current_user->setPreference('timezone', "America/Los_Angeles"); // new object to avoid TZ caching - $timedate = new TimeDate(); + $this->timedate = new TimeDate(); $this->meetingsArr = array(); @@ -67,7 +68,7 @@ class Bug45287_2Test extends Sugar_PHPUnit_Framework_TestCase { $this->meetingsArr[$cnt] = new Meeting(); $this->meetingsArr[$cnt]->name = 'Bug45287 Meeting ' . ($cnt + 1); - $this->meetingsArr[$cnt]->date_start = $timedate->to_display_date_time(gmdate("Y-m-d H:i:s", mktime(10+$cnt, 30, 00, 7, $d, 2011))); + $this->meetingsArr[$cnt]->date_start = $this->timedate->to_display_date_time(gmdate("Y-m-d H:i:s", mktime(10+$cnt, 30, 00, 7, $d, 2011))); $this->meetingsArr[$cnt]->save(); $d++; $cnt++; @@ -117,6 +118,7 @@ class Bug45287_2Test extends Sugar_PHPUnit_Framework_TestCase unset($this->meetingsArr); unset($this->searchDefs); unset($this->searchFields); + unset($this->timezone); SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); } @@ -124,7 +126,7 @@ class Bug45287_2Test extends Sugar_PHPUnit_Framework_TestCase public function testRetrieveByExactDate() { - global $current_user, $timedate; + global $current_user; $_REQUEST = $_POST = array("module" => "Meetings", "action" => "index", @@ -147,7 +149,7 @@ class Bug45287_2Test extends Sugar_PHPUnit_Framework_TestCase $w = $srch->generateSearchWhere(); // Due to daylight savings, I cannot hardcode intervals... - $GMTDates = $timedate->getDayStartEndGMT("2011-07-14"); + $GMTDates = $this->timedate->getDayStartEndGMT("2011-07-14"); // Current User is on GMT-7. // Asking for meeting of 14 July 2011, I expect to search (GMT) from 14 July at 07:00 until 15 July at 07:00 (excluded) @@ -158,7 +160,7 @@ class Bug45287_2Test extends Sugar_PHPUnit_Framework_TestCase public function testRetrieveByDaterange() { - global $current_user, $timedate; + global $current_user; $_REQUEST = $_POST = array("module" => "Meetings", "action" => "index", @@ -182,8 +184,8 @@ class Bug45287_2Test extends Sugar_PHPUnit_Framework_TestCase $w = $srch->generateSearchWhere(); // Due to daylight savings, I cannot hardcode intervals... - $GMTDatesStart = $timedate->getDayStartEndGMT("2011-07-13"); - $GMTDatesEnd = $timedate->getDayStartEndGMT("2011-07-14"); + $GMTDatesStart = $this->timedate->getDayStartEndGMT("2011-07-13"); + $GMTDatesEnd = $this->timedate->getDayStartEndGMT("2011-07-14"); // Current User is on GMT-7. // Asking for meeting between 13 and 14 July 2011, I expect to search from 13 July at 07:00 until 15 July at 07:00 (excluded) diff --git a/tests/modules/Meetings/Bug46294Test.php b/tests/modules/Meetings/Bug46294Test.php new file mode 100755 index 00000000..ea7a73d9 --- /dev/null +++ b/tests/modules/Meetings/Bug46294Test.php @@ -0,0 +1,101 @@ + array( + 'fields' => array( + 'type' => array( + 'options' => '' + ) + ) + ) + ); + var $dictionaryOptionsEmpty = array('Meeting' => array( + 'fields' => array( + 'type' => array() + //empty + ) + ) + ); + var $dictionaryOptionsSet = array('Meeting' => array( + 'fields' => array( + 'type' => array( + 'options' => 'type_list' + ) + ) + ) + ); + var $dictionaryTypeListNotExists = array('Meeting' => array( + 'fields' => array( + 'type' => array( + 'options' => 'type_not_exists' + ) + ) + ) + ); + var $appListStrings = array('type_list' => array( + 'breakfast' => 'breakfast', + 'lunch' => 'lunch', + 'dinner' => 'dinner' + ) + ); + + var $appListStringsEmpty = array('type_list' => array()); + + /** + * @dataProvider provider + */ + public function testGetMeetingTypeOptions($dictionary, $appList, $isEmpty) + { + $result = getMeetingTypeOptions($dictionary, $appList, $isEmpty); + $this->assertEquals($isEmpty, empty($result)); + } + + public function provider() + { + return array( + array($this->dictionaryOptionsSet, $this->appListStrings, false), + array($this->dictionaryOptionsNotSet, $this->appListStrings, true), + array($this->dictionaryOptionsEmpty, $this->appListStrings, true), + array($this->dictionaryTypeListNotExists, $this->appListStrings, true), + array($this->dictionaryOptionsSet, $this->appListStringsEmpty, true) + ); + } +} \ No newline at end of file diff --git a/tests/include/SugarFields/Fields/File/Bug22505Test.php b/tests/modules/ModuleBuilder/parsers/Bug44712Test.php similarity index 53% rename from tests/include/SugarFields/Fields/File/Bug22505Test.php rename to tests/modules/ModuleBuilder/parsers/Bug44712Test.php index 9b96d973..ac0e5675 100755 --- a/tests/include/SugarFields/Fields/File/Bug22505Test.php +++ b/tests/modules/ModuleBuilder/parsers/Bug44712Test.php @@ -34,65 +34,25 @@ * "Powered by SugarCRM". ********************************************************************************/ -require_once('include/SugarFields/Fields/File/SugarFieldFile.php'); - -/** - * @ticket 22505 - * - * Original Bug: Sugar should indicate to customer the max file size that can be uploaded - * - */ -class Bug22505Test extends Sugar_PHPUnit_Framework_TestCase -{ - private $_post_max_size; - private $_upload_max_filesize; - private $_upload_maxsize; - private $_file_field; - - function setUp() - { - $this->_post_max_size = ini_get('post_max_size'); - $this->_upload_max_filesize = ini_get('upload_max_filesize'); - $this->_upload_maxsize = $GLOBALS['sugar_config']['upload_maxsize']; - - $this->_file_field = new Bug22505TestMock('file'); - } - - function tearDown() { - //ini_set('post_max_size',$this->_post_max_size); - //ini_set('upload_max_filesize',$this->_upload_max_filesize); - $GLOBALS['sugar_config']['upload_maxsize'] = $this->_upload_maxsize; - - unset($this->_post_max_size); - unset($this->_upload_max_filesize); - unset($this->_upload_maxsize); - unset($this->_file_field); - } - - function testMaxFileUploadSize() { - $small = '9999'; //9.76 kb - $large = '99999999999999'; - - //Test 1: upload_maxsize is smallest - //ini_set('post_max_size',$small); - //ini_set('upload_max_filesize',$large); - $GLOBALS['sugar_config']['upload_maxsize'] = $small; - $max_size = $this->_file_field->getMaxFileUploadSize(); - $this->assertEquals($max_size, '9.76 kb','Max file upload size is not 9.76 kb as expected'); - - //Test 2: upload_maxsize is greatest - $GLOBALS['sugar_config']['upload_maxsize'] = $large; - $max_size = $this->_file_field->getMaxFileUploadSize(); +class Bug44712Test extends Sugar_PHPUnit_Framework_TestCase +{ - $this->assertNotEquals($max_size, '9.76 kb','Max file upload size is 9.76 kb which is not expected'); - } + public function testTranslateLabel() + { + $activitiesRelationship = new ActivitiesRelationshipMock(array()); + $vardef = $activitiesRelationship->getLinkFieldDefinition('Tasks', 'abc_MyCustomBasic_Activities_Tasks'); + $this->assertEquals('LBL_ABC_MYCUSTOMBASIC_ACTIVITIES_TASKS_FROM_TASKS_TITLE', $vardef['vname'], "Assert that vardef['vname'] is set to LBL_ABC_MYCUSTOMBASIC_ACTIVITIES_FROM_TASKS_TITLE"); + } } -class Bug22505TestMock extends SugarFieldFile +require_once('modules/ModuleBuilder/parsers/relationships/ActivitiesRelationship.php'); +class ActivitiesRelationshipMock extends ActivitiesRelationship { - public function getMaxFileUploadSize() - { - return parent::getMaxFileUploadSize(); - } + public function getLinkFieldDefinition($sourceModule, $relationshipName) + { + return parent:: getLinkFieldDefinition($sourceModule, $relationshipName); + } } + +?> \ No newline at end of file diff --git a/tests/modules/ModuleBuilder/parsers/SearchViewMetaDataParserTest.php b/tests/modules/ModuleBuilder/parsers/SearchViewMetaDataParserTest.php new file mode 100755 index 00000000..5ac8e6a9 --- /dev/null +++ b/tests/modules/ModuleBuilder/parsers/SearchViewMetaDataParserTest.php @@ -0,0 +1,366 @@ + + array( + 'maxColumns' => '3', + 'widths' => + array( + 'label' => '10', + 'field' => '30', + ), + ), + 'layout' => + array( + 'basic_search' => + array( + 'name' => + array( + 'name' => 'name', + 'default' => true, + 'width' => '10%', + ), + 'current_user_only' => + array( + 'name' => 'current_user_only', + 'label' => 'LBL_CURRENT_USER_FILTER', + 'type' => 'bool', + 'default' => true, + 'width' => '10%', + ), + 0 => + array( + 'name' => 'favorites_only', + 'label' => 'LBL_FAVORITES_FILTER', + 'type' => 'bool', + ), + ), + 'advanced_search' => + array( + 'name' => + array( + 'name' => 'name', + 'default' => true, + 'width' => '10%', + ), + 'website' => + array( + 'name' => 'website', + 'default' => true, + 'width' => '10%', + ), + 'phone' => + array( + 'name' => 'phone', + 'label' => 'LBL_ANY_PHONE', + 'type' => 'name', + 'default' => true, + 'width' => '10%', + ), + 'email' => + array( + 'name' => 'email', + 'label' => 'LBL_ANY_EMAIL', + 'type' => 'name', + 'default' => true, + 'width' => '10%', + ), + 'address_street' => + array( + 'name' => 'address_street', + 'label' => 'LBL_ANY_ADDRESS', + 'type' => 'name', + 'default' => true, + 'width' => '10%', + ), + 'address_city' => + array( + 'name' => 'address_city', + 'label' => 'LBL_CITY', + 'type' => 'name', + 'default' => true, + 'width' => '10%', + ), + 'address_state' => + array( + 'name' => 'address_state', + 'label' => 'LBL_STATE', + 'type' => 'name', + 'default' => true, + 'width' => '10%', + ), + 'address_postalcode' => + array( + 'name' => 'address_postalcode', + 'label' => 'LBL_POSTAL_CODE', + 'type' => 'name', + 'default' => true, + 'width' => '10%', + ), + 'billing_address_country' => + array( + 'name' => 'billing_address_country', + 'label' => 'LBL_COUNTRY', + 'type' => 'name', + 'options' => 'countries_dom', + 'default' => true, + 'width' => '10%', + ), + 'account_type' => + array( + 'name' => 'account_type', + 'default' => true, + 'width' => '10%', + ), + 'industry' => + array( + 'name' => 'industry', + 'default' => true, + 'width' => '10%', + ), + 'assigned_user_id' => + array( + 'name' => 'assigned_user_id', + 'type' => 'enum', + 'label' => 'LBL_ASSIGNED_TO', + 'function' => + array( + 'name' => 'get_user_array', + 'params' => + array( + 0 => false, + ), + ), + 'default' => true, + 'width' => '10%', + ), + 0 => + array( + 'name' => 'favorites_only', + 'label' => 'LBL_FAVORITES_FILTER', + 'type' => 'bool', + ), + ), + ), + ); + + $expectedResult = array( + 'name' => + array( + 'name' => 'name', + 'default' => true, + 'width' => '10%', + ), + 'website' => + array( + 'name' => 'website', + 'default' => true, + 'width' => '10%', + ), + 'phone' => + array( + 'name' => 'phone', + 'label' => 'LBL_ANY_PHONE', + 'type' => 'name', + 'default' => true, + 'width' => '10%', + ), + 'email' => + array( + 'name' => 'email', + 'label' => 'LBL_ANY_EMAIL', + 'type' => 'name', + 'default' => true, + 'width' => '10%', + ), + 'address_street' => + array( + 'name' => 'address_street', + 'label' => 'LBL_ANY_ADDRESS', + 'type' => 'name', + 'default' => true, + 'width' => '10%', + ), + 'address_city' => + array( + 'name' => 'address_city', + 'label' => 'LBL_CITY', + 'type' => 'name', + 'default' => true, + 'width' => '10%', + ), + 'address_state' => + array( + 'name' => 'address_state', + 'label' => 'LBL_STATE', + 'type' => 'name', + 'default' => true, + 'width' => '10%', + ), + 'address_postalcode' => + array( + 'name' => 'address_postalcode', + 'label' => 'LBL_POSTAL_CODE', + 'type' => 'name', + 'default' => true, + 'width' => '10%', + ), + 'billing_address_country' => + array( + 'name' => 'billing_address_country', + 'label' => 'LBL_COUNTRY', + 'type' => 'name', + 'options' => 'countries_dom', + 'default' => true, + 'width' => '10%', + ), + 'account_type' => + array( + 'name' => 'account_type', + 'default' => true, + 'width' => '10%', + ), + 'industry' => + array( + 'name' => 'industry', + 'default' => true, + 'width' => '10%', + ), + 'assigned_user_id' => + array( + 'name' => 'assigned_user_id', + 'type' => 'enum', + 'label' => 'LBL_ASSIGNED_TO', + 'function' => + array( + 'name' => 'get_user_array', + 'params' => + array( + 0 => false, + ), + ), + 'default' => true, + 'width' => '10%', + ), + 'favorites_only' => + array( + 'name' => 'favorites_only', + 'label' => 'LBL_FAVORITES_FILTER', + 'type' => 'bool', + ), + 'current_user_only' => + array( + 'name' => 'current_user_only', + 'label' => 'LBL_CURRENT_USER_FILTER', + 'type' => 'bool', + 'default' => true, + 'width' => '10%', + ), + ); + + // We use a derived class to aid in stubbing out test properties and functions + $parser = new SearchViewMetaDataParserTestDerivative("basic_search"); + + // Creating a mock object for the DeployedMetaDataImplementation + + $impl = $this->getMock('DeployedMetaDataImplementation', + array('getOriginalViewdefs'), + array(), + 'DeployedMetaDataImplementation_Mock', + FALSE); + + // Making the getOriginalViewdefs function return the test viewdefs and verify that it is being called once + $impl->expects($this->once()) + ->method('getOriginalViewdefs') + ->will($this->returnValue($orgViewDefs)); + + // Replace the protected implementation with our Mock object + $parser->setImpl($impl); + + // Execute the method under test + $result = $parser->getOriginalViewDefs(); + + // Verify that the returned result matches our expectations + $this->assertEquals($result, $expectedResult); + + //echo "Done"; + } + +} + +/** + * Using derived helper class from SearchViewMetaDataParser to avoid having to fully + * initialize the whole class and to give us the flexibility to replace the + * Deploy/Undeploy MetaDataImplementation + */ +class SearchViewMetaDataParserTestDerivative extends SearchViewMetaDataParser +{ + function __construct ($layout){ + $this->_searchLayout = $layout; + } + + function setImpl($impl) { + $this->implementation = $impl; + } +} \ No newline at end of file diff --git a/tests/modules/ModuleBuilder/parsers/views/HistoryTest.php b/tests/modules/ModuleBuilder/parsers/views/HistoryTest.php new file mode 100755 index 00000000..2f25e1fc --- /dev/null +++ b/tests/modules/ModuleBuilder/parsers/views/HistoryTest.php @@ -0,0 +1,100 @@ +_path = tempnam(sys_get_temp_dir() . 'tmp', 'history'); + $this->_history = new History($this->_path); + } + + public function testConstructor() + { + $this->assertTrue(is_dir($this->getHistoryDir()), "__constructor() creates unique directory for file history"); + } + + public function testAppendAndRestore() + { + $time = $this->_history->append($this->_path); + $this->assertTrue(file_exists($this->_history->getFileByTimestamp($time)), '->append() creates history file'); + $this->assertEquals($this->_history->restoreByTimestamp( $time ), $time, '->restoreByTimestamp() returns correct timestamp'); + } + + public function testUndoRestore() + { + $this->_history->undoRestore(); + $this->assertFalse(file_exists($this->_path), '->undoRestore removes file'); + } + + public function testPositioning() + { + $other_file = tempnam(sys_get_temp_dir(), 'history'); + + $el1 = $this->_history->append($other_file); + $el2 = $this->_history->append($other_file); + $el3 = $this->_history->append($other_file); + + $this->assertEquals($this->_history->getCount(), 3); + $this->assertEquals($this->_history->getFirst(), $el3); + $this->assertEquals($this->_history->getLast(), $el1); + $this->assertEquals($this->_history->getNth(1), $el2); + $this->assertEquals($this->_history->getNext(), $el1); + $this->assertFalse($this->_history->getNext()); + + unlink($other_file); + } + + private function getHistoryDir() + { + return dirname($this->_path); + } + +} \ No newline at end of file diff --git a/tests/modules/ProjectTask/Bug46350Test.php b/tests/modules/ProjectTask/Bug46350Test.php new file mode 100755 index 00000000..2352262a --- /dev/null +++ b/tests/modules/ProjectTask/Bug46350Test.php @@ -0,0 +1,137 @@ +_user = SugarTestUserUtilities::createAnonymousUser(); + $GLOBALS['current_user'] = $this->_user; + $this->project = SugarTestProjectUtilities::createProject(); + $projectId = $this->project->id; + $projectTasksData = array ( + 'parentTask' => array ( + 'project_id' => $projectId, + 'parent_task_id' => '', + 'project_task_id' => 1, + 'percent_complete' => $this->countAverage(array ($this->oldPercentValue, $this->defaultStaticSecondPercent)), + 'name' => 'Task 1', + ), + 'firstChildTask' => array ( + 'project_id' => $projectId, + 'parent_task_id' => 1, + 'project_task_id' => 2, + 'percent_complete' => $this->oldPercentValue, + 'name' => 'Task 2', + ), + 'secondChildTask' => array ( + 'project_id' => $projectId, + 'parent_task_id' => 1, + 'project_task_id' => 3, + 'percent_complete' => $this->defaultStaticSecondPercent, + 'name' => 'Task 3', + ), + ); + foreach ($projectTasksData as $key => $value) + { + $this->projectTasks[$key] = SugarTestProjectTaskUtilities::createProjectTask($value); + } + } + + public function tearDown() + { + SugarTestProjectUtilities::removeAllCreatedProjects(); + SugarTestProjectTaskUtilities::removeAllCreatedProjectTasks(); + SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); + unset($this->project); + unset($this->projectTasks); + unset($this->_user); + unset($GLOBALS['current_user']); + } + + public function countAverage($values) + { + $count = 0; + foreach ($values as $key => $value) + { + $count += $value; + } + return (round($count / count($values))); + } + + public function testResourceName() + { + $processingTask = $this->projectTasks['firstChildTask']; + $processingTask->percent_complete = $this->newPercentValue; + $processingTask->save(); + + /** + * New method testing + */ + $processingTask->updateParentProjectTaskPercentage(); + + $testparentTask = new ProjectTask(); + $testparentTask->retrieve($this->projectTasks['parentTask']->id); + + $average = $this->countAverage(array ($this->newPercentValue, $this->projectTasks['secondChildTask']->percent_complete)); + $this->assertEquals($average, $testparentTask->percent_complete); + } +} \ No newline at end of file diff --git a/tests/modules/ProspectLists/Bug36422Test.php b/tests/modules/ProspectLists/Bug36422Test.php deleted file mode 100755 index 3e81909b..00000000 --- a/tests/modules/ProspectLists/Bug36422Test.php +++ /dev/null @@ -1,154 +0,0 @@ -account_id = $account->id; - $contact->save(); - return $contact; - } - - /** - * Create ProspectList instance - * @param Contact instance to attach to prospect list - */ - public static function createProspectList($contact = null) - { - $prospectList = new ProspectList(); - $prospectList->name = "test"; - $prospectList->save(); - self::$_createdProspectListsIds[] = $prospectList->id; - - if ($contact instanceof Contact) { - self::attachContactToProspectList($prospectList, $contact); - } - - return $prospectList; - } - - /** - * - * Attach Contact to prospect list - * @param ProspectList $prospectList prospect list instance - * @param Contact $contact contact instance - */ - public static function attachContactToProspectList($prospectList, $contact) - { - $prospectList->load_relationship('contacts'); - $prospectList->contacts->add($contact->id,array()); - } - - /** - * Set up - create prospect list with 2 contacts - */ - public function setUp() - { - global $current_user; - $current_user = SugarTestUserUtilities::createAnonymousUser();; - $this->_contacts[] = self::createContact(); - $this->_contacts[] = self::createContact(); - $this->_prospectList = self::createProspectList($this->_contacts[0]); - self::attachContactToProspectList($this->_prospectList, $this->_contacts[1]); - } - - /** - * Clear all created data - * @see PHPUnit_Framework_TestCase::tearDown() - */ - public function tearDown() - { - SugarTestContactUtilities::removeAllCreatedContacts(); - SugarTestAccountUtilities::removeAllCreatedAccounts(); - SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); - $this->_clearProspects(); - } - - /** - * Test if email exists within report - */ - public function testEmailExistsExportList() - { - $content = export("ProspectLists", $this->_prospectList->id, true); - $this->assertContains($this->_contacts[0]->email1, $content, "Report should contain email of created contact"); - $this->assertContains($this->_contacts[1]->email1, $content, "Report should contain email of created contact"); - - $this->_contacts[0]->email1 = "changed" . $this->_contacts[0]->email1; - $this->_contacts[0]->save(); - - $this->_contacts[1]->email1 = "changed" . $this->_contacts[1]->email1; - $this->_contacts[1]->save(); - - $content = export("ProspectLists", $this->_prospectList->id, true); - $this->assertContains($this->_contacts[0]->email1, $content, "Report should contain email of created contact"); - $this->assertContains($this->_contacts[1]->email1, $content, "Report should contain email of created contact"); - } - - private function _clearProspects() - { - $ids = implode("', '", self::$_createdProspectListsIds); - $GLOBALS['db']->query('DELETE FROM prospect_list_campaigns WHERE prospect_list_id IN (\'' . $ids . '\')'); - $GLOBALS['db']->query('DELETE FROM prospect_lists_prospects WHERE prospect_list_id IN (\'' . $ids . '\')'); - $GLOBALS['db']->query('DELETE FROM prospect_lists WHERE id IN (\'' . $ids . '\')'); - } -} \ No newline at end of file diff --git a/tests/modules/ProspectLists/Bug41569Test.php b/tests/modules/ProspectLists/Bug41569Test.php deleted file mode 100755 index abdc9ad0..00000000 --- a/tests/modules/ProspectLists/Bug41569Test.php +++ /dev/null @@ -1,141 +0,0 @@ -save(); - return $contact; - } - - /** - * Create ProspectList instance - * @param Contact instance to attach to prospect list - */ - public static function createProspectList($contact = null) - { - $prospectList = new ProspectList(); - $prospectList->name = "test"; - $prospectList->save(); - self::$_createdProspectListsIds[] = $prospectList->id; - - if ($contact instanceof Contact) { - self::attachContactToProspectList($prospectList, $contact); - } - - return $prospectList; - } - - /** - * - * Attach Contact to prospect list - * @param ProspectList $prospectList prospect list instance - * @param Contact $contact contact instance - */ - public static function attachContactToProspectList($prospectList, $contact) - { - $prospectList->load_relationship('contacts'); - $prospectList->contacts->add($contact->id,array()); - } - - /** - * Set up - create prospect list with 2 contacts - */ - public function setUp() - { - global $current_user; - $current_user = SugarTestUserUtilities::createAnonymousUser();; - $this->_contacts[] = self::createContact(); - $this->_contacts[] = self::createContact(); - $this->_prospectList = self::createProspectList($this->_contacts[0]); - self::attachContactToProspectList($this->_prospectList, $this->_contacts[1]); - } - - /** - * Clear all created data - * @see PHPUnit_Framework_TestCase::tearDown() - */ - public function tearDown() - { - SugarTestContactUtilities::removeAllCreatedContacts(); - SugarTestAccountUtilities::removeAllCreatedAccounts(); - SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); - $this->_clearProspects(); - } - - /** - * Test if email exists within report - */ - public function testContactExistExportList() - { - $content = export("ProspectLists", $this->_prospectList->id, true); - $this->assertContains($this->_contacts[0]->first_name, $content, "Report should contain email of created contact"); - $this->assertContains($this->_contacts[1]->first_name, $content, "Report should contain email of created contact"); - } - - private function _clearProspects() - { - $ids = implode("', '", self::$_createdProspectListsIds); - $GLOBALS['db']->query('DELETE FROM prospect_list_campaigns WHERE prospect_list_id IN (\'' . $ids . '\')'); - $GLOBALS['db']->query('DELETE FROM prospect_lists_prospects WHERE prospect_list_id IN (\'' . $ids . '\')'); - $GLOBALS['db']->query('DELETE FROM prospect_lists WHERE id IN (\'' . $ids . '\')'); - } -} \ No newline at end of file diff --git a/tests/modules/ProspectLists/Bug43478Test.php b/tests/modules/ProspectLists/Bug43478Test.php deleted file mode 100755 index 29aa1122..00000000 --- a/tests/modules/ProspectLists/Bug43478Test.php +++ /dev/null @@ -1,147 +0,0 @@ -account_id = $account->id; - $contact->primary_address_state = 'Test adress state'; - $contact->save(); - return $contact; - } - - /** - * Create ProspectList instance - * @param Contact instance to attach to prospect list - */ - public static function createProspectList($contact = null) - { - $prospectList = new ProspectList(); - $prospectList->name = "test"; - $prospectList->save(); - self::$_createdProspectListsIds[] = $prospectList->id; - - if ($contact instanceof Contact) { - self::attachContactToProspectList($prospectList, $contact); - } - - return $prospectList; - } - - /** - * - * Attach Contact to prospect list - * @param ProspectList $prospectList prospect list instance - * @param Contact $contact contact instance - */ - public static function attachContactToProspectList($prospectList, $contact) - { - $prospectList->load_relationship('contacts'); - $prospectList->contacts->add($contact->id,array()); - } - - /** - * Set up - create prospect list with 2 contacts - */ - public function setUp() - { - global $current_user; - $current_user = SugarTestUserUtilities::createAnonymousUser(); - $contact = self::createContact(); - $contact->primary_address_state = 'Test adress state'; - $this->_contacts[] = $contact; - $this->_contacts[] = self::createContact(); - $this->_prospectList = self::createProspectList($this->_contacts[0]); - self::attachContactToProspectList($this->_prospectList, $this->_contacts[1]); - } - - /** - * Clear all created data - * @see PHPUnit_Framework_TestCase::tearDown() - */ - public function tearDown() - { - SugarTestContactUtilities::removeAllCreatedContacts(); - SugarTestAccountUtilities::removeAllCreatedAccounts(); - SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); - $this->_clearProspects(); - } - - /** - * Test if email exists within report - */ - public function testEmailExistsExportList() - { - $content = export("ProspectLists", $this->_prospectList->id, true); - $this->assertContains("Test adress state", $content); - } - - private function _clearProspects() - { - $ids = implode("', '", self::$_createdProspectListsIds); - $GLOBALS['db']->query('DELETE FROM prospect_list_campaigns WHERE prospect_list_id IN (\'' . $ids . '\')'); - $GLOBALS['db']->query('DELETE FROM prospect_lists_prospects WHERE prospect_list_id IN (\'' . $ids . '\')'); - $GLOBALS['db']->query('DELETE FROM prospect_lists WHERE id IN (\'' . $ids . '\')'); - } -} -?> diff --git a/tests/modules/ProspectLists/Bug43805Test.php b/tests/modules/ProspectLists/Bug43805Test.php deleted file mode 100755 index 9e730b33..00000000 --- a/tests/modules/ProspectLists/Bug43805Test.php +++ /dev/null @@ -1,145 +0,0 @@ -save(); - return $prospect; - - } - - /** - * Create ProspectList instance - * @param prospect instance to attach to prospect list - */ - public static function createProspectList($prospect = null) - { - $prospectList = new ProspectList(); - $prospectList->name = "TargetList_code"; - $prospectList->save(); - self::$_createdProspectListsIds[] = $prospectList->id; - - if ($prospect instanceof Prospect) { - self::attachProspectToProspectList($prospectList, $prospect); - } - - return $prospectList; - } - - /** - * - * Attach Prospect to prospect list - * @param ProspectList $prospectList prospect list instance - * @param prospect $prospect prospect instance - */ - public static function attachProspectToProspectList($prospectList, $prospect) - { - $prospectList->load_relationship('prospects'); - $prospectList->prospects->add($prospect->id,array()); - } - - /** - * Set up - create prospect list with 1 prospect - */ - public function setUp() - { - global $current_user; - $current_user = SugarTestUserUtilities::createAnonymousUser();; - $this->_prospects[] = self::createProspect(); - $this->_prospectList = self::createProspectList($this->_prospects[0]); - self::attachProspectToProspectList($this->_prospectList, $this->_prospects[0]); - } - - /** - * Clear all created data - * @see PHPUnit_Framework_TestCase::tearDown() - */ - public function tearDown() - { - SugarTestProspectUtilities::removeAllCreatedProspects(); - SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); - $this->_clearProspects(); - } - - /** - * Test if Title exists within report - */ - public function testTitleExistsExportList() - { - $content = export("ProspectLists", $this->_prospectList->id, true); - - $this->assertContains($this->_prospects[0]->title, $content, "Report should contain title of created Prospect"); - - } - - private function _clearProspects() - { - $ids = implode("', '", self::$_createdProspectListsIds); - $GLOBALS['db']->query('DELETE FROM prospect_list_campaigns WHERE prospect_list_id IN (\'' . $ids . '\')'); - $GLOBALS['db']->query('DELETE FROM prospect_lists_prospects WHERE prospect_list_id IN (\'' . $ids . '\')'); - $GLOBALS['db']->query('DELETE FROM prospect_lists WHERE id IN (\'' . $ids . '\')'); - } -} \ No newline at end of file diff --git a/tests/modules/Reports/Bug47277Test.php b/tests/modules/Reports/Bug47277Test.php new file mode 100755 index 00000000..e0db95d5 --- /dev/null +++ b/tests/modules/Reports/Bug47277Test.php @@ -0,0 +1,52 @@ +assertEquals("{$sourceString} ('')", string_format($string, $args)); + } +} \ No newline at end of file diff --git a/tests/modules/Trackers/store/Bug41051Test.php b/tests/modules/Trackers/store/Bug41051Test.php deleted file mode 100755 index 5f3fedc9..00000000 --- a/tests/modules/Trackers/store/Bug41051Test.php +++ /dev/null @@ -1,114 +0,0 @@ -disabledMonitors = $trackerManager->getDisabledMonitors(); - $this->isPaused = $trackerManager->isPaused(); - $trackerManager->isPaused = false; - $trackerManager->setDisabledMonitors(array()); - $GLOBALS['db']->query("DELETE FROM tracker_sessions WHERE session_id = 'Bug41051Test'"); -} - -public function tearDown() -{ -/* $trackerManager = TrackerManager::getInstance(); - $trackerManager->isPaused = $this->isPaused; - $trackerManager->setDisabledMonitors($this->disabledMonitors); - $GLOBALS['db']->query("DELETE FROM tracker_sessions WHERE session_id = 'Bug41051Test'"); -*/ -} - -public function testTrackerSessionDatabaseStore() -{ - $trackerManager = TrackerManager::getInstance(); - if($monitor = $trackerManager->getMonitor('tracker_sessions')) - { - $monitor->setValue('session_id', 'Bug41051Test'); - $monitor->setValue('user_id', 'Bug41051Test'); - $monitor->setValue('date_start', TimeDate::getInstance()->nowDb()); - $monitor->setValue('date_end', TimeDate::getInstance()->nowDb()); - $monitor->setValue('seconds', '10'); - $monitor->setValue('round_trips', 1); - $monitor->setValue('active', 0); - $trackerManager->saveMonitor($monitor, true); - - $seconds = $GLOBALS['db']->getOne("SELECT seconds FROM tracker_sessions WHERE session_id = 'Bug41051Test'"); - $this->assertEquals('10', $seconds, 'Assert that new database entry is created'); - - $seconds = $GLOBALS['db']->getOne("UPDATE tracker_sessions SET seconds='10' WHERE session_id = 'Bug41051Test'"); - if($monitor = $trackerManager->getMonitor('tracker_sessions')) - { - $monitor->setValue('session_id', 'Bug41051Test'); - $monitor->setValue('round_trips', 0); - $monitor->setValue('seconds', ''); - $trackerManager->save($monitor, true); - - $seconds = $GLOBALS['db']->getOne("SELECT seconds FROM tracker_sessions WHERE session_id = 'Bug41051Test'"); - $this->assertEquals('0', $seconds, 'Assert that new database entry is modified as expected'); - } - - $seconds = $GLOBALS['db']->getOne("UPDATE tracker_sessions SET seconds='10' WHERE session_id = 'Bug41051Test'"); - if($monitor = $trackerManager->getMonitor('tracker_sessions')) - { - $monitor->setValue('session_id', 'Bug41051Test'); - $monitor->setValue('round_trips', 0); - $monitor->setValue('seconds', 0); - $trackerManager->save($monitor, true); - - $seconds = $GLOBALS['db']->getOne("SELECT seconds FROM tracker_sessions WHERE session_id = 'Bug41051Test'"); - $this->assertEquals('0', $seconds, 'Assert that new database entry is modified as expected'); - } - - - } else { - $this->markTestSkipped = true; - } -} - -} \ No newline at end of file diff --git a/tests/modules/UpgradeWizard/Bug36845Test.php b/tests/modules/UpgradeWizard/Bug36845Test.php index eb81f81a..e80d8cdc 100755 --- a/tests/modules/UpgradeWizard/Bug36845Test.php +++ b/tests/modules/UpgradeWizard/Bug36845Test.php @@ -44,6 +44,10 @@ class Bug36845Test extends Sugar_PHPUnit_Framework_TestCase public function setUp() { + //$this->useOutputBuffering = false; + require('include/modules.php'); + global $beanFiles, $beanList; + if(file_exists('cache/modules/unified_search_modules.php')) { $this->has_custom_unified_search_modules = true; @@ -137,8 +141,6 @@ EOQ; fwrite( $fp, $the_string ); fclose( $fp ); - require('include/modules.php'); - global $beanFiles, $beanList; $beanFiles['clabc_Bug36845Test'] = 'modules/clabc_Bug36845Test/clabc_Bug36845Test.php'; $beanList['clabc_Bug36845Test'] = 'clabc_Bug36845Test'; @@ -167,7 +169,13 @@ EOQ; copy('custom/modules/unified_search_modules_display.php.bak', 'custom/modules/unified_search_modules_display.php'); unlink('custom/modules/unified_search_modules_display.php.bak'); } + + if(file_exists("custom/{$this->module_dir}/metadata")) + { + rmdir_recursive("custom/{$this->module_dir}/metadata"); + } + if(file_exists($this->module_dir)) { rmdir_recursive($this->module_dir); @@ -192,8 +200,13 @@ EOQ; public function test_update_custom_vardefs_without_searchfields() { + if(!file_exists("custom/{$this->module_dir}/metadata")) + { + mkdir_recursive("custom/{$this->module_dir}/metadata"); + } + copy("{$this->module_dir}/metadata/SearchFields.php", "custom/{$this->module_dir}/metadata/SearchFields.php"); unlink("{$this->module_dir}/metadata/SearchFields.php"); - $this->assertTrue(!file_exists("{$this->module_dir}/metadata/SearchFields.php"), 'Assert that we have a SearchFields.php file'); + $this->assertTrue(!file_exists("{$this->module_dir}/metadata/SearchFields.php"), 'Assert that we do not have a SearchFields.php file in modules directory'); $this->assertTrue(file_exists("{$this->module_dir}/vardefs.php"), 'Assert that we have a vardefs.php file'); require_once('modules/UpgradeWizard/uw_utils.php'); add_unified_search_to_custom_modules_vardefs(); @@ -202,7 +215,8 @@ EOQ; $usa->buildCache(); $this->assertTrue(file_exists("cache/modules/unified_search_modules.php"), 'Assert that we have a unified_search_modules.php file'); include('cache/modules/unified_search_modules.php'); - $this->assertTrue(!isset($unified_search_modules['clabc_Bug36845Test']), 'Assert that the custom module was not added to unified_search_modules.php'); + //echo var_export($unified_search_modules['clabc_Bug36845Test'], true); + $this->assertTrue(isset($unified_search_modules['clabc_Bug36845Test']), 'Assert that the custom module was added to unified_search_modules.php'); } diff --git a/tests/phpunit.php b/tests/phpunit.php index 78006129..93d32d20 100755 --- a/tests/phpunit.php +++ b/tests/phpunit.php @@ -55,5 +55,4 @@ define('PHPUnit_MAIN_METHOD', 'PHPUnit_TextUI_Command::main'); PHPUnit_TextUI_Command::main(); -?> - +?> \ No newline at end of file -- 2.42.0