From cffbac394e259f3aeaa1b9b307628d79d62ced90 Mon Sep 17 00:00:00 2001 From: John Mertic Date: Thu, 12 May 2011 01:33:06 +0200 Subject: [PATCH] Release 6.1.5 --- crossdomain.xml | 42 + data/SugarBean.php | 12 + download.php | 31 +- files.md5 | 317 ++--- include/ListView/ListViewDisplay.php | 103 +- .../MVC/Controller/entry_point_registry.php | 13 +- include/MVC/SugarApplication.php | 252 ++-- include/MVC/View/views/view.list.php | 11 +- include/MassUpdate.php | 19 +- include/OutboundEmail/OutboundEmail.php | 145 ++- include/Pear/HTML_Safe/Safe.php | 567 ++++---- include/Popups/tpls/PopupGeneric.tpl | 2 +- include/SearchForm/SearchForm2.php | 7 +- include/SubPanel/SubPanelTiles.js | 3 +- .../SugarEmailAddress/SugarEmailAddress.php | 102 +- .../Fields/Datetimecombo/Datetimecombo.js | 3 +- .../Fields/Datetimecombo/EditView.tpl | 2 +- .../Datetimecombo/SugarFieldDatetimecombo.php | 5 + include/SugarFolders/SugarFolders.php | 4 + .../templates/file/language/en_us.lang.php | 1 + .../SugarObjects/templates/file/vardefs.php | 2 +- include/VarDefHandler/vardef_meta_arrays.php | 3 +- include/database/MssqlManager.php | 28 +- include/entryPoint.php | 1 - .../SugarWidgets/SugarWidgetFieldenum.php | 6 +- include/javascript/javascript.php | 34 +- include/javascript/jsclass_base.js | 6 +- include/javascript/sugar_3.js | 44 +- include/javascript/sugar_grp1.js | 44 +- include/javascript/sugar_grp_emails.js | 1141 ++++++++--------- include/javascript/sugar_grp_quickcomp.js | 565 ++++---- include/language/en_us.lang.php | 3 +- include/utils.php | 184 ++- .../external_cache/SugarCache_Memcache.php | 15 +- include/utils/file_utils.php | 6 + include/utils/mvc_utils.php | 2 +- install.php | 12 +- install/install_utils.php | 1 + .../include/SubPanel/SubPanelTiles.js | 3 +- .../Fields/Datetimecombo/Datetimecombo.js | 30 +- .../include/javascript/jsclass_base.js | 22 +- .../src_files/include/javascript/sugar_3.js | 384 ++++-- .../modules/InboundEmail/InboundEmail.js | 55 +- modules/Administration/DiagnosticDownload.php | 23 +- modules/Administration/DiagnosticRun.php | 9 +- modules/Administration/UpgradeAccess.php | 1 + modules/Administration/UpgradeWizard.php | 5 +- modules/Calls/vardefs.php | 9 + modules/Configurator/Configurator.php | 39 +- modules/Configurator/SugarpdfSettings.php | 26 +- modules/Configurator/UploadFileCheck.php | 15 +- modules/Configurator/controller.php | 24 + modules/Configurator/tpls/EditView.tpl | 9 +- .../DocumentRevisions/language/en_us.lang.php | 4 +- modules/Documents/language/en_us.lang.php | 3 +- modules/Documents/metadata/detailviewdefs.php | 2 +- modules/Documents/vardefs.php | 2 +- modules/DynamicFields/DynamicField.php | 10 +- modules/EmailMan/Forms.php | 4 - modules/EmailMan/Save.php | 7 +- modules/EmailMan/testOutboundEmail.php | 19 +- modules/EmailMan/tpls/config.tpl | 72 +- modules/EmailMan/views/view.config.php | 66 +- modules/Emails/Compose.php | 12 +- modules/Emails/Email.php | 269 ++-- modules/Emails/EmailUI.php | 280 ++-- modules/Emails/EmailUIAjax.php | 110 +- modules/Emails/javascript/Email.js | 4 +- modules/Emails/javascript/EmailUI.js | 571 ++++----- modules/Emails/javascript/EmailUICompose.js | 392 +++--- modules/Emails/javascript/ajax.js | 173 ++- .../Emails/templates/editAccountDialogue.tpl | 37 +- modules/Emails/templates/outboundDialog.tpl | 9 +- .../Dashlets/iFrameDashlet/iFrameDashlet.php | 27 +- modules/Import/ImportFile.php | 8 +- modules/Import/tpls/step3.tpl | 44 +- modules/InboundEmail/EditView.html | 20 +- modules/InboundEmail/EditView.php | 41 +- modules/InboundEmail/InboundEmail.js | 5 +- modules/InboundEmail/InboundEmail.php | 49 +- modules/InboundEmail/Popup.php | 16 +- modules/InboundEmail/Save.php | 48 +- .../InboundEmail/ShowInboundFoldersList.php | 9 +- modules/Leads/views/view.convertlead.php | 12 +- modules/Meetings/vardefs.php | 9 + modules/MergeRecords/SaveMerge.php | 4 + .../relationships/DeployedRelationships.php | 38 + .../views/GridLayoutMetaDataParser.php | 2 +- modules/ModuleBuilder/views/view.listview.php | 2 +- modules/MySettings/StoreQuery.php | 8 +- modules/Opportunities/vardefs.php | 3 +- modules/Schedulers/EditView.html | 6 +- modules/Schedulers/EditView.php | 5 +- modules/Schedulers/language/en_us.lang.php | 2 + modules/SchedulersJobs/SchedulersJob.php | 13 +- modules/Tasks/vardefs.php | 2 + modules/Users/EditView.php | 19 +- modules/Users/EditView.tpl | 114 +- modules/Users/User.php | 14 +- .../SugarAuthenticate/SugarAuthenticate.php | 5 + soap/SoapPortalHelper.php | 27 +- sugar_version.php | 8 +- tests/SugarTestImportUtilities.php | 24 +- tests/data/fixUpFormatting.php | 23 + .../Fields/Datetimecombo/Bug41114Test.php | 45 + .../EmailAddresses/EmailAddressTest.php | 46 +- tests/modules/Import/ImportFileTest.php | 12 + tests/modules/InboundEmail/Bug43554Test.php | 49 + tests/modules/Leads/Bug40209Test.php | 77 ++ 109 files changed, 4192 insertions(+), 3082 deletions(-) create mode 100644 crossdomain.xml create mode 100755 tests/include/SugarFields/Fields/Datetimecombo/Bug41114Test.php create mode 100755 tests/modules/InboundEmail/Bug43554Test.php create mode 100755 tests/modules/Leads/Bug40209Test.php diff --git a/crossdomain.xml b/crossdomain.xml new file mode 100644 index 00000000..5ad4059f --- /dev/null +++ b/crossdomain.xml @@ -0,0 +1,42 @@ + + + + + + \ No newline at end of file diff --git a/data/SugarBean.php b/data/SugarBean.php index 8787d92c..e72d68fe 100644 --- a/data/SugarBean.php +++ b/data/SugarBean.php @@ -2027,6 +2027,10 @@ function save_relationship_changes($is_update, $exclude=array()) case 'datetime': case 'datetimecombo': if(empty($this->$field)) break; + if ($this->$field == 'NULL') { + $this->$field = ''; + break; + } if ( ! preg_match('/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$/',$this->$field) ) { // This appears to be formatted in user date/time $this->$field = $timedate->to_db($this->$field); @@ -2035,6 +2039,10 @@ function save_relationship_changes($is_update, $exclude=array()) break; case 'date': if(empty($this->$field)) break; + if ($this->$field == 'NULL') { + $this->$field = ''; + break; + } if ( ! preg_match('/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/',$this->$field) ) { // This date appears to be formatted in the user's format $this->$field = $timedate->to_db_date($this->$field, false); @@ -2043,6 +2051,10 @@ function save_relationship_changes($is_update, $exclude=array()) break; case 'time': if(empty($this->$field)) break; + if ($this->$field == 'NULL') { + $this->$field = ''; + break; + } if ( preg_match('/(am|pm)/i',$this->$field) ) { // This time appears to be formatted in the user's format $this->$field = $timedate->to_db_time($timedate->to_display_date(gmdate('Y-m-d')).' '.$this->$field); diff --git a/download.php b/download.php index d96235ca..18d4fb70 100644 --- a/download.php +++ b/download.php @@ -72,10 +72,10 @@ else { $local_location = (isset($_REQUEST['isTempFile'])) ? "{$GLOBALS['sugar_config']['cache_dir']}/modules/Emails/{$_REQUEST['ieId']}/attachments/{$_REQUEST['id']}" : $GLOBALS['sugar_config']['upload_dir']."/".$_REQUEST['id']; - if(isset($_REQUEST['isTempFile']) && ($_REQUEST['type']=="SugarFieldImage")) { - $local_location = $GLOBALS['sugar_config']['upload_dir']."/".$_REQUEST['id']; + if(isset($_REQUEST['isTempFile']) && ($_REQUEST['type']=="SugarFieldImage")) { + $local_location = $GLOBALS['sugar_config']['upload_dir']."/".$_REQUEST['id']; } - + if(!file_exists( $local_location ) || strpos($local_location, "..")) { die($app_strings['ERR_INVALID_FILE_REFERENCE']); } @@ -87,7 +87,7 @@ else { $query = "SELECT filename name FROM document_revisions INNER JOIN documents ON documents.id = document_revisions.document_id "; $query .= "WHERE document_revisions.id = '" . $_REQUEST['id'] ."'"; } elseif($file_type == 'kbdocuments') { - $query="SELECT document_revisions.filename name FROM document_revisions INNER JOIN kbdocument_revisions ON document_revisions.id = kbdocument_revisions.document_revision_id INNER JOIN kbdocuments ON kbdocument_revisions.kbdocument_id = kbdocuments.id "; + $query="SELECT document_revisions.filename name FROM document_revisions INNER JOIN kbdocument_revisions ON document_revisions.id = kbdocument_revisions.document_revision_id INNER JOIN kbdocuments ON kbdocument_revisions.kbdocument_id = kbdocuments.id "; $query .= "WHERE document_revisions.id = '" . $_REQUEST['id'] ."'"; } elseif($file_type == 'notes') { $query = "SELECT filename name FROM notes "; @@ -117,21 +117,28 @@ else { $download_location = $local_location; $name = $_REQUEST['tempName']; } - + if(isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/MSIE/", $_SERVER['HTTP_USER_AGENT'])) - { + { $name = urlencode($name); $name = str_replace("+", "_", $name); } header("Pragma: public"); header("Cache-Control: maxage=1, post-check=0, pre-check=0"); - if(isset($_REQUEST['isTempFile']) && ($_REQUEST['type']=="SugarFieldImage")) - header("Content-type: image"); - else { - header("Content-type: application/force-download"); - header("Content-disposition: attachment; filename=\"".$name."\";"); + if(isset($_REQUEST['isTempFile']) && ($_REQUEST['type']=="SugarFieldImage")) { + $mime = getimagesize($download_location); + if(!empty($mime)) { + header("Content-Type: {$mime['mime']}"); + } else { + header("Content-Type: image/png"); + } + } else { + header("Content-Type: application/force-download"); + header("Content-Disposition: attachment; filename=\"".$name."\";"); } + // disable content type sniffing in MSIE + header("X-Content-Type-Options: nosniff"); header("Content-Length: " . filesize($local_location)); header("Expires: 0"); set_time_limit(0); @@ -139,7 +146,7 @@ else { @ob_end_clean(); ob_start(); - echo file_get_contents($download_location); + readfile($download_location); @ob_flush(); } } diff --git a/files.md5 b/files.md5 index c2c8a631..3faf8a50 100644 --- a/files.md5 +++ b/files.md5 @@ -1,5 +1,5 @@ 'd3f150e4a5bed444763ebe8a81742a95', './.htaccess' => 'd41d8cd98f00b204e9800998ecf8427e', @@ -1167,13 +1167,13 @@ $md5_string = array ( './themes/Sugar5/css/print.css' => '629df961f98baab29b4530b56322a1ca', './themes/Sugar5/css/deprecated.css' => '13f41876c3a31bde4ac2e1223bdd707c', './themes/Sugar5/css/chart.css' => 'dda00a834e88692f3d08bec70db12dc9', - './sugar_version.php' => 'c584b555cb9a33c08d84f23f8215a621', + './sugar_version.php' => '0a58a28168a638cf32e8d03bc3c00161', './soap/SoapTypes.php' => 'b44fab9d2a11ee705798529a17ccd24e', './soap/SoapSugarUsers.php' => '5e65b5fc02625c7dedddb9d3aa21f838', './soap/SoapStudio.php' => '08ff60f88df7da98b081a199510858f8', './soap/SoapRelationshipHelper.php' => 'b2411195c28a0d05418ec95d7fc85c3d', './soap/SoapPortalUsers.php' => 'a674ef3037747a35d36e64408f53b978', - './soap/SoapPortalHelper.php' => '6f4afabc66b71bcee5674505d9bae79c', + './soap/SoapPortalHelper.php' => '9151ef0312f56b2525b86082f5c102ca', './soap/SoapHelperFunctions.php' => '5283070bee35305295da11c852598f9e', './soap/SoapErrorDefinitions.php' => 'f39459659519912f55b559e49acdd20b', './soap/SoapError.php' => 'd6440fe460e7a9f163e5f98ff6dd1157', @@ -1215,6 +1215,7 @@ $md5_string = array ( './robots.txt' => 'f71d20196d4caf35b6a670db8c70b03d', './removeme.php' => 'c909fd8a94c02aad0439aa88999580a5', './pdf.php' => '2175c3d745bb23b7812cb7fea96dfefa', + './crossdomain.xml' => '265c2e8d1fa7777bb0c6d9b0864b1bec', './modules/vCals/vardefs.php' => '1b1f5d3652b0c84f2af8c444b2b100e7', './modules/vCals/vCal.php' => '7087462d96c75f193f1b9fd76938998d', './modules/vCals/field_arrays.php' => '23cdf390f157fce35ac36130bff01a43', @@ -1258,7 +1259,7 @@ $md5_string = array ( './modules/Users/field_arrays.php' => '46dac3bcf42a3641b80eb507f6cc203a', './modules/Users/controller.php' => '36826fcfa3c617a4882fee6fdb259aa2', './modules/Users/authentication/SugarAuthenticate/SugarAuthenticateUser.php' => '412dc66d6fedfacdcf69fd23371efe05', - './modules/Users/authentication/SugarAuthenticate/SugarAuthenticate.php' => '8d2af7954f1cccc0e08bb9379115d87a', + './modules/Users/authentication/SugarAuthenticate/SugarAuthenticate.php' => 'a35a41d26a301fa1f3595dbda55494c4', './modules/Users/authentication/SAMLAuthenticate/settings.php' => '871bd3ac7732d6172a0320d52b938420', './modules/Users/authentication/SAMLAuthenticate/lib/xmlseclibs/xmlseclibs.php' => '05070f789165351c2946c679611fe44a', './modules/Users/authentication/SAMLAuthenticate/lib/xmlseclibs/CHANGELOG.txt' => '113d14ef4333039359236ffed624fb85', @@ -1278,7 +1279,7 @@ $md5_string = array ( './modules/Users/authentication/AuthenticationController.php' => '1d471ac0cc1c293a4ae01fce639005f1', './modules/Users/UserSignatureEditView.html' => 'bbd67cc5332b92df27ca7c014fb6d544', './modules/Users/UserSignature.php' => '5456216c3e5b1f8db76456303b4dc71f', - './modules/Users/User.php' => 'ae48c53ccae652f86f6264afdd935638', + './modules/Users/User.php' => '319b32af9981694b89d3a236e54a4828', './modules/Users/SetTimezone.tpl' => '0f1887db925adfd025f3b464c3f3c253', './modules/Users/SetTimezone.php' => '1460782ea0992794464ab468c0988478', './modules/Users/SaveTimezone.php' => 'fca4ed5d777fbcfab3d55de554de3bef', @@ -1296,8 +1297,8 @@ $md5_string = array ( './modules/Users/GeneratePassword.php' => '421ad2305e96cd30f982038085051e1c', './modules/Users/Forms.php' => '61bb049bc61cde1712a8631bb812accf', './modules/Users/Error.php' => '4e9cd9d420e137c4ba95633c341b0e24', - './modules/Users/EditView.tpl' => '642d0b7635aad51fb97d94cc51113454', - './modules/Users/EditView.php' => '1fe8ef5cdfb87c2e2bc205827ffa2168', + './modules/Users/EditView.tpl' => '188495db22b95674ea7bcf0df7b732a9', + './modules/Users/EditView.php' => 'ae3283273bd10728d4dd3cc33de75c6f', './modules/Users/DetailView.tpl' => 'cd17777924e3a3fc98c68a5c58e7bee1', './modules/Users/DetailView.php' => '014491e7cb49b8b82071208f4dc1ad4e', './modules/Users/Changenewpassword.tpl' => '7e3894ab32dd3b85ce898aa156e493d4', @@ -1368,7 +1369,7 @@ $md5_string = array ( './modules/Trackers/Metric.php' => 'd3dafcf4c7c3da916ccaec7dd1a13ebd', './modules/Trackers/BreadCrumbStack.php' => '131c50a6ab6e2b7324ec6537930db530', './modules/Tasks/views/view.edit.php' => 'fe471c23e15d969b8f26d6bd589eebb2', - './modules/Tasks/vardefs.php' => 'fc6596bcf510570faa14c31fc9af565e', + './modules/Tasks/vardefs.php' => '67a044d87a3c09c297c57c8b4c39e8b9', './modules/Tasks/tpls/QuickCreate.tpl' => 'a3e76184c8fd107945281b284ebc11fa', './modules/Tasks/metadata/subpanels/default.php' => '186d3ead2f8c74c638dfe9e5eceabcf7', './modules/Tasks/metadata/subpanels/ForHistory.php' => '0d5d2b41bb9c1187b5de4c657d330a0c', @@ -1445,11 +1446,11 @@ $md5_string = array ( './modules/SchedulersJobs/metadata/subpanels/default.php' => '0fe13add4d444631a0185bef78a8a9d6', './modules/SchedulersJobs/language/en_us.lang.php' => '03324f484d6a373e8350d0248ffa155e', './modules/SchedulersJobs/field_arrays.php' => '13aae3a0ab1f82eb46affc848ad25ace', - './modules/SchedulersJobs/SchedulersJob.php' => 'eb4812fe4181017a06fcab770bcfe74d', + './modules/SchedulersJobs/SchedulersJob.php' => 'eea284c761d90380d69bf8f14edff1de', './modules/Schedulers/vardefs.php' => '5841af67faf74658d311e7c9b6f8fe62', './modules/Schedulers/metadata/subpanels/default.php' => '211c31e39227d3a7f847f6df832260cc', './modules/Schedulers/metadata/subpaneldefs.php' => '2e8f77cf8125cb5617d69739192625ec', - './modules/Schedulers/language/en_us.lang.php' => 'dadca7b586915c3433517f5d7f3d06c3', + './modules/Schedulers/language/en_us.lang.php' => '3a5297c79088ad18cbe1145031eea605', './modules/Schedulers/index.php' => 'e3ba1ea616a95caf725e35d7681be1ce', './modules/Schedulers/field_arrays.php' => '7f556e11519f16ca7a2ca174efd196b9', './modules/Schedulers/_AddJobsHere.php' => 'dbbe4a966d7238e00ed0ea46d844ffb3', @@ -1462,8 +1463,8 @@ $md5_string = array ( './modules/Schedulers/ListView.php' => '67f433a9a7f2d28cd23d97ffabd122db', './modules/Schedulers/ListView.html' => '6e3ed1e28a2024c6dd8d3ed95c951b28', './modules/Schedulers/JobThread.php' => '4f4a8759eed6b9673f618ad1de84dc5d', - './modules/Schedulers/EditView.php' => '4248dce624b6835b1282496c9c5c4507', - './modules/Schedulers/EditView.html' => 'bb65dc9a0671c1efeb3d00eff113cab9', + './modules/Schedulers/EditView.php' => '9837d2141538537917fa55fd00978087', + './modules/Schedulers/EditView.html' => 'ef6cfa5254f2b6afb37da045d148101d', './modules/Schedulers/DetailView.php' => '2a107f341c14d5e8e8fedca898ca56d4', './modules/Schedulers/DetailView.html' => '6c143319127bea5c8f12fdc0f663b1a1', './modules/Schedulers/DeleteScheduled.php' => '4c316e04b8b1e166e4075d184bb3dd4c', @@ -1636,7 +1637,7 @@ $md5_string = array ( './modules/OptimisticLock/Forms.php' => '1426ca53f6b7d0dfa8d2c12164ab814e', './modules/Opportunities/views/view.edit.php' => '616c48fb396d786e9ddc1e22fa75709a', './modules/Opportunities/views/view.detail.php' => '2031e46f2fe3f86bfed2cb000d8152e7', - './modules/Opportunities/vardefs.php' => '8703fd336c07c05ac318a45f33d6c069', + './modules/Opportunities/vardefs.php' => 'be81524775a85206547ea7aa73e7f40b', './modules/Opportunities/tpls/QuickCreate.tpl' => 'a97086f3b05fd812fa5aa13c8934d518', './modules/Opportunities/metadata/subpanels/default.php' => '9055b5051763913602c1b0cfcec6a6a8', './modules/Opportunities/metadata/subpanels/ForEmails.php' => 'a23e3862c9ed6a4eafd63c2f6bd6926b', @@ -1698,7 +1699,7 @@ $md5_string = array ( './modules/Notes/Menu.php' => '80e4a5be7e5f7a316f11f43e646e7dab', './modules/MySettings/language/en_us.lang.php' => '7ab73e2c534ab7d66597730282c87ae3', './modules/MySettings/TabController.php' => '5bccbc225eae09c59583f438f1525a1b', - './modules/MySettings/StoreQuery.php' => '71ba3168bc08f0ab9c8f790a2b49b8fb', + './modules/MySettings/StoreQuery.php' => '564278c216b2499185ec0dc954629925', './modules/MySettings/LoadTabSubpanels.php' => 'a255e18695ce5a628f77ea5ee52cf87e', './modules/ModuleBuilder/views/view.wizard.php' => 'dce66b495e40714975affaa31a6fb324', './modules/ModuleBuilder/views/view.tree.php' => '8c422f84d52636a46249e3156a45b150', @@ -1714,7 +1715,7 @@ $md5_string = array ( './modules/ModuleBuilder/views/view.modulefield.php' => '7e59b559a975f3790aaf4bd0ee74928d', './modules/ModuleBuilder/views/view.module.php' => 'baeb41d40a5a27066bf94464a3aee5a0', './modules/ModuleBuilder/views/view.main.php' => '68cbc384cbdd87c7a5700b147754f8af', - './modules/ModuleBuilder/views/view.listview.php' => '549357704def83453cd25a89636287cf', + './modules/ModuleBuilder/views/view.listview.php' => 'b3e534036dc1b7691f60bfd4d5b79d58', './modules/ModuleBuilder/views/view.layoutview.php' => '9028bef29bc5e09fb162d6cbcb51f39b', './modules/ModuleBuilder/views/view.labels.php' => '053e3e114f46d507031a358cc871be7d', './modules/ModuleBuilder/views/view.home.php' => '9e8e883b4bf6674c80117cd89b083067', @@ -1774,7 +1775,7 @@ $md5_string = array ( './modules/ModuleBuilder/parsers/views/ListLayoutMetaDataParser.php' => 'efaa7a60159ae33195ff623fd4b6190e', './modules/ModuleBuilder/parsers/views/HistoryInterface.php' => 'eaccd7749cff5a9691088dce27bca75b', './modules/ModuleBuilder/parsers/views/History.php' => '46d2243c49e6872711077ed7c5e91b60', - './modules/ModuleBuilder/parsers/views/GridLayoutMetaDataParser.php' => '369aacb93f523e94e7c5031fab95fc57', + './modules/ModuleBuilder/parsers/views/GridLayoutMetaDataParser.php' => 'f1b860567d17a09a7091a8939c35c641', './modules/ModuleBuilder/parsers/views/DeployedSubpanelImplementation.php' => '2c71bd7109457cb13c47e58a62c93272', './modules/ModuleBuilder/parsers/views/DeployedMetaDataImplementation.php' => '64d88ca7d8cf05cc497ab872b503f0ac', './modules/ModuleBuilder/parsers/views/DashletMetaDataParser.php' => '3b4e0e01a297836dcd1082a5ba8c32ea', @@ -1787,7 +1788,7 @@ $md5_string = array ( './modules/ModuleBuilder/parsers/relationships/OneToManyRelationship.php' => '76396e8d76dda04e4b907df7903a6a95', './modules/ModuleBuilder/parsers/relationships/ManyToOneRelationship.php' => '41d2a9d5654fd04996e24e34d237e4b6', './modules/ModuleBuilder/parsers/relationships/ManyToManyRelationship.php' => 'c585937c42e7f7d3922f5a79d98b3e88', - './modules/ModuleBuilder/parsers/relationships/DeployedRelationships.php' => '227f7879fd0945c6078e572a6c487f57', + './modules/ModuleBuilder/parsers/relationships/DeployedRelationships.php' => '2b8a07fb72fd7ce747ecee8f57ae57de', './modules/ModuleBuilder/parsers/relationships/ActivitiesRelationship.php' => '7fbd2c704593caf04aa9931c8cfe51b9', './modules/ModuleBuilder/parsers/relationships/AbstractRelationships.php' => '22af5ffa09c436902cb68c41735cd999', './modules/ModuleBuilder/parsers/relationships/AbstractRelationship.php' => '1dfe9673f0e743ede2dc1d981ad8a11b', @@ -1843,13 +1844,13 @@ $md5_string = array ( './modules/MergeRecords/Step1.php' => 'a0c5f45d20afaabb59a7d54eec167c9f', './modules/MergeRecords/Step1.html' => '0141495f28378923446c97f24e17029f', './modules/MergeRecords/SearchForm.html' => '11f0b679a10c34338e9758ede1e86e93', - './modules/MergeRecords/SaveMerge.php' => '9b196e0c0d3a1df0fc1748881bc72de8', + './modules/MergeRecords/SaveMerge.php' => 'a31ef935ca0612b405800ad95e25bf8c', './modules/MergeRecords/MergeRecord.php' => 'bada4760d390041f6da0799d177f5fa1', './modules/MergeRecords/MergeField.html' => 'c00b7430a29310be7eccf3f9791634a0', './modules/MergeRecords/Menu.php' => 'ad435ab227b7f339d340692eb81630d7', './modules/Meetings/jsclass_scheduler.js' => 'd2cd2f86a5c7792d7dd5976c7b410477', './modules/Meetings/views/view.edit.php' => '2924ae498a1b3c6dbea4e1d66c9d6055', - './modules/Meetings/vardefs.php' => '408dedbb74b5dc7e11710f8c3180d7e1', + './modules/Meetings/vardefs.php' => '85909810a7e1254c162fc5d2d617cdd1', './modules/Meetings/tpls/header.tpl' => '66489a8b22323aff40e2d825ccb17a9b', './modules/Meetings/tpls/footer.tpl' => 'c21ee3bf6df9db67b7ca95e0103ed207', './modules/Meetings/tpls/QuickCreate.tpl' => '3059bfc6a2c0b602aec17947eed77342', @@ -1899,7 +1900,7 @@ $md5_string = array ( './modules/MailMerge/EditView.php' => '8af659df9972420db817b302cdf6d2e7', './modules/MailMerge/DetailView.php' => '75ff223c12372a4313b3de488108fef1', './modules/Leads/Lead.js' => '8cddbfd55de6fb05ae7feaf42a68c700', - './modules/Leads/views/view.convertlead.php' => 'aa1a0c21b7615d8c8b49b57f7c6df36d', + './modules/Leads/views/view.convertlead.php' => '7222065596117db3c7a6526cd4f5e3eb', './modules/Leads/vardefs.php' => '58a8f00cb3ba6c9b32a0da9fb366a2ed', './modules/Leads/tpls/QuickCreate.tpl' => 'a76c0c529eadb1bef44454e7c7f5ebd9', './modules/Leads/tpls/DetailViewHeader.tpl' => 'f075c3a6effa72926e1a0f8a5cd5e6a6', @@ -1947,24 +1948,24 @@ $md5_string = array ( './modules/LabelEditor/Forms.php' => 'fbafcea6235be8a109124d1870e5c76d', './modules/LabelEditor/EditView.php' => '1c932d2d28064843f23ba12afb58a36e', './modules/LabelEditor/EditView.html' => 'd26998cd92945e931f4207509bd8444f', - './modules/InboundEmail/InboundEmail.js' => 'f5529449f6400759414f30a06c7fc308', + './modules/InboundEmail/InboundEmail.js' => '98639b43e066108023362ac1c6606b51', './modules/InboundEmail/vardefs.php' => 'b502ad0ed0fbd0756c8dbfea8e6f0c3b', './modules/InboundEmail/parseEncoding.php' => 'e577543f1dd4acdd9e1e56873612abe1', './modules/InboundEmail/language/en_us.lang.php' => '6efdc5c47a673ba196569159bb1da72f', './modules/InboundEmail/index.php' => 'b0194cbf89267c46b189e732cf43f902', './modules/InboundEmail/field_arrays.php' => 'a4337fd64c1ff5c5a78d6c3d1dda4960', './modules/InboundEmail/View.html' => '58f26da62e64f0630806e6dde187a357', - './modules/InboundEmail/ShowInboundFoldersList.php' => '9c96a82630327ce3de3ce4d3fd1053f8', + './modules/InboundEmail/ShowInboundFoldersList.php' => '45d7e8bfbff96456cb27a9f1ef3eea3c', './modules/InboundEmail/SaveGroupFolder.php' => 'b25cf3f6fae0a6220773c43966dfccdc', - './modules/InboundEmail/Save.php' => '0e98437ecdf8dab66b0baa4c97ebb9a5', - './modules/InboundEmail/Popup.php' => '8aba5d50bea10d7bda49061ff6c5464e', + './modules/InboundEmail/Save.php' => 'b1cdb79a734b377a20b19986ae32ed89', + './modules/InboundEmail/Popup.php' => 'dae5482f102fb7cbbcedd46b2cf6a550', './modules/InboundEmail/Menu.php' => '79c0619ae84aa23303de599889406019', './modules/InboundEmail/ListView.php' => '693d6cb94dede156a0ddf15b031ff031', './modules/InboundEmail/ListView.html' => 'd198339eed60a1f901c0082646ac3707', './modules/InboundEmail/InboundEmailTest.php' => '18e54a84dd10ebbdb875c4a0c2887bc9', - './modules/InboundEmail/InboundEmail.php' => '0bd12b0c9353bf7775e97b5f69f0b8b9', - './modules/InboundEmail/EditView.php' => '62a789dc4ceb7b72bf6f79a096fc144d', - './modules/InboundEmail/EditView.html' => '0b756715535c7191425071dcdef5d345', + './modules/InboundEmail/InboundEmail.php' => 'c1f7a1e8522acea3e9d7cadc636799e9', + './modules/InboundEmail/EditView.php' => '4dd0ce851a2b0202db293e15012e59c1', + './modules/InboundEmail/EditView.html' => '01adf407ad0d15c6cac64d94ea9d4168', './modules/InboundEmail/EditGroupFolder.php' => '52d841e00eeb5d43c736de0adbc5293f', './modules/InboundEmail/DetailView.php' => '83323c4e3516f55322d710e296fd518d', './modules/InboundEmail/DetailView.html' => 'c26f51c1f5b4d301c56e773de896758d', @@ -1978,7 +1979,7 @@ $md5_string = array ( './modules/Import/views/view.error.php' => '3316030141e5b0bfc56f406e46af8f55', './modules/Import/vardefs.php' => 'f386f7b3e194e8c0b6175b60671b4f11', './modules/Import/tpls/undo.tpl' => '07c0a5ae1d14facd9cb291f1d1c19f87', - './modules/Import/tpls/step3.tpl' => '484240a496b0f1222a10315e14161072', + './modules/Import/tpls/step3.tpl' => '63c2a1b60276e632c44672bc735ed7ab', './modules/Import/tpls/step2.tpl' => '79a84e8cb8caafc13d4636c6d5230914', './modules/Import/tpls/step1.tpl' => '9e85fde9ad5874f9008adad00fa0c5fb', './modules/Import/tpls/last.tpl' => 'cd2f76b2e8991cacaa7cb6504360e67d', @@ -1995,7 +1996,7 @@ $md5_string = array ( './modules/Import/ImportMapAct.php' => '78df0dfb26f4c89dd23eda4329917d70', './modules/Import/ImportMap.php' => 'b7db765d8c3858806609d1bbf03b762a', './modules/Import/ImportFileSplitter.php' => 'ff77217515cea4fe6bef98f72efbca20', - './modules/Import/ImportFile.php' => 'af807c66046428b2b477145dd8af0640', + './modules/Import/ImportFile.php' => '1e67c950bc97e690c4c39dc58f3694ad', './modules/Import/ImportFieldSanitize.php' => 'aed1ef216ba5113b298c66ea76e37871', './modules/Import/ImportDuplicateCheck.php' => '57907930d522a2c2dfb2dd35dc7742ab', './modules/Import/ImportCacheFiles.php' => '7ccd3d16e86f7e244afa2c3ec79d6585', @@ -2024,7 +2025,7 @@ $md5_string = array ( './modules/Home/Home.tpl' => 'cf81b61203b639c3e9405f81ff59d646', './modules/Home/Home.html' => '1cfd71deea974236ad79b5a59a39ac96', './modules/Home/DynamicAction.php' => '8de09f545e517b5a91039b605898627e', - './modules/Home/Dashlets/iFrameDashlet/iFrameDashlet.php' => '8881862a27043c6b40411c349f86a333', + './modules/Home/Dashlets/iFrameDashlet/iFrameDashlet.php' => '555cb64a6c8e3c18e99042d3ab8c7d93', './modules/Home/Dashlets/iFrameDashlet/iFrameDashlet.meta.php' => '4227913d52f981f847c48e63e71b2d07', './modules/Home/Dashlets/iFrameDashlet/configure.tpl' => '8629b406963a4b85b213c984671eb048', './modules/Home/Dashlets/SugarNewsDashlet/configure.tpl' => '8629b406963a4b85b213c984671eb048', @@ -2108,7 +2109,7 @@ $md5_string = array ( './modules/Emails/templates/successMessage.tpl' => 'f2a5b761c0f480ded16d358e0e650ae4', './modules/Emails/templates/overlay.tpl' => '064c362704b97dd6f41ba062d16f2552', './modules/Emails/templates/outboundDialogTest.tpl' => 'db35198ac6efcdb06604504a5e3fd5cb', - './modules/Emails/templates/outboundDialog.tpl' => 'ad69d06864e9cb0818d00a7e074c4b41', + './modules/Emails/templates/outboundDialog.tpl' => 'ae0cc28d1f4b48c1dcdbac72c5e90be5', './modules/Emails/templates/importRelate.tpl' => 'b3897fb62f70b64c9fc202320e176a8b', './modules/Emails/templates/emailSettingsRules.tpl' => '6fe8b27d9e161596113223f607b13c80', './modules/Emails/templates/emailSettingsGeneral.tpl' => '3563cc551b3103b1b50244843c121dfd', @@ -2119,7 +2120,7 @@ $md5_string = array ( './modules/Emails/templates/emailDetailView.tpl' => 'f3c6f5cc2a662f08da043caca50e16c4', './modules/Emails/templates/editMailingList.tpl' => 'b4fb8c08aa00f663ffd01d51525be2fa', './modules/Emails/templates/editContact.tpl' => 'da032deef1d61f195ffe396292384aa3', - './modules/Emails/templates/editAccountDialogue.tpl' => '8296045e10b01f885218bd15349ceb1c', + './modules/Emails/templates/editAccountDialogue.tpl' => '4a2891e3a39b80ba03a4563df8721551', './modules/Emails/templates/dceMenuQuickCreate.tpl' => 'e954a3bd597aa2fe455c9048acf822d8', './modules/Emails/templates/assignTo.tpl' => '79446b8acf76f9440bdcee11787a37d2', './modules/Emails/templates/advancedSearch.tpl' => '39a6f1fccce8c9ac051a51b33d55cc10', @@ -2152,11 +2153,11 @@ $md5_string = array ( './modules/Emails/javascript/displayOneEmailTemplate.js' => '36286f4d5dfa7b3ecb989eaa1347fc74', './modules/Emails/javascript/composeEmailTemplate.js' => '1d3a616e3192d976bc3dec881ec9e0e2', './modules/Emails/javascript/complexLayout.js' => 'fd6075b10fbc6cb645346ee8f9ef0955', - './modules/Emails/javascript/ajax.js' => '9b74d0c87f1f421a05960465cb3c49b7', + './modules/Emails/javascript/ajax.js' => '8817d5d11cade523f3304d4272a4a5b8', './modules/Emails/javascript/EmailUIShared.js' => 'a7be59721553f5754aa4a5b1ca719c08', - './modules/Emails/javascript/EmailUICompose.js' => 'd62981f919bc88b8a0777cad5d6d54bb', - './modules/Emails/javascript/EmailUI.js' => '088e04b3ccb969aeab4c6c97aa8b1f12', - './modules/Emails/javascript/Email.js' => '9c505070f1ff470ab07ab79374a15cbd', + './modules/Emails/javascript/EmailUICompose.js' => '833266297da57f1372a375a70e6d853a', + './modules/Emails/javascript/EmailUI.js' => '8862b6b07998241cd1fe07fb53d326d2', + './modules/Emails/javascript/Email.js' => '9374349209d72680155e1e886a6b8ed5', './modules/Emails/index.php' => '6cc6a189db79619fe86fe1469e9ff7d3', './modules/Emails/images/sugarGroup.gif' => 'ad21210176b6a2a10a7a9b8f876ad83b', './modules/Emails/images/sugarDynamic.gif' => '82285d963771975b2def7f19e6438a8c', @@ -2197,10 +2198,10 @@ $md5_string = array ( './modules/Emails/ListViewDrafts.html' => '67e8857521daaf70fc1468a363d9ec3f', './modules/Emails/Grab.php' => '95a6e008baa1cdeebbf72a74bf72db68', './modules/Emails/GenerateQuickComposeFrame.php' => '0c9dbc7d32d522b624198d21f57f6338', - './modules/Emails/EmailUIAjax.php' => '34404a13426c9cd09b9deb932fa880cb', - './modules/Emails/EmailUI.php' => '4350dbb645ff920bf95af1b95e13cef9', + './modules/Emails/EmailUIAjax.php' => '754dd8c922055582cdabc7083cb33d7c', + './modules/Emails/EmailUI.php' => 'aeb03bef97950ad4d02b3abc9bc33efe', './modules/Emails/EmailUI.css' => 'daf7eb7d61e5b8777613d4f550bfa572', - './modules/Emails/Email.php' => 'a6c3b3f2dc95aae9b5510f60b321c5fa', + './modules/Emails/Email.php' => '4fce8da7c26a1dccf2613d3dc87ed300', './modules/Emails/EditViewArchive.html' => 'ad802e567b75e39a6c7885bbb8fb9fcc', './modules/Emails/EditView.php' => '5dde865966c41fd192253a3bff98ff74', './modules/Emails/EditView.html' => 'dd94b8950eeac04fb7663ba68a54440c', @@ -2211,7 +2212,7 @@ $md5_string = array ( './modules/Emails/Dashlets/MyEmailsDashlet/MyEmailsDashlet.php' => '30bf4eeabbd41decbef1747ebc8f8b56', './modules/Emails/Dashlets/MyEmailsDashlet/MyEmailsDashlet.meta.php' => '1d1f601cfbea07b1d59850fee27393ac', './modules/Emails/Dashlets/MyEmailsDashlet/MyEmailsDashlet.data.php' => 'e04693eb309f98f4afb83d419d9a5f5e', - './modules/Emails/Compose.php' => '40c419d7815463cfa0a8f660ae75650d', + './modules/Emails/Compose.php' => '9b9553394898d3c166daec6baa2b96a8', './modules/Emails/Check.php' => '3643d7c5f3a716ac2f59ab358090badf', './modules/EmailTemplates/EmailTemplate.js' => '33a92f025af2cb8e0b8bc27748888ffb', './modules/EmailTemplates/vardefs.php' => 'c1db0f25697a39b8a2e458c383aec8c8', @@ -2252,12 +2253,12 @@ $md5_string = array ( './modules/EmailMarketing/DetailView.html' => '7b65b4ff73fb5e80a0dc6f9e7d78b932', './modules/EmailMarketing/Delete.php' => '3c915ebc36fe5bbb3b785211465c0899', './modules/EmailMan/views/view.list.php' => '672c229f6af8dea621aad97244dddc3f', - './modules/EmailMan/views/view.config.php' => '82f76a22ce15c7dc963e8a1c0808e549', + './modules/EmailMan/views/view.config.php' => '754bfc1f8b7bac3e3da2c25d3307580d', './modules/EmailMan/views/view.campaignconfig.php' => '1c61c91d839911c33b94fd570ce1f528', './modules/EmailMan/vardefs.php' => '11ea605c45446d341bd8590c2455340e', - './modules/EmailMan/tpls/config.tpl' => '70cf462c9817c81c068f0ec4d764a111', + './modules/EmailMan/tpls/config.tpl' => '6abd010c5a84b6ddd6e6b6d504e62729', './modules/EmailMan/tpls/campaignconfig.tpl' => '1374e1451a901d40270fedc86ecd942f', - './modules/EmailMan/testOutboundEmail.php' => 'f8af6b745f56b3faddd986cc7e9285e9', + './modules/EmailMan/testOutboundEmail.php' => 'f426713a1bee0bda8ee5e623094e62ce', './modules/EmailMan/subpanels/default.php' => 'a5bfe693b6607b29e6a7eedf0ae018d1', './modules/EmailMan/metadata/subpanels/default.php' => 'a5bfe693b6607b29e6a7eedf0ae018d1', './modules/EmailMan/metadata/searchdefs.php' => 'b03aec4d6d6af23ddac8788394f34367', @@ -2266,9 +2267,9 @@ $md5_string = array ( './modules/EmailMan/language/en_us.lang.php' => '729f9dc0d3d90be0fadd3225b3894550', './modules/EmailMan/field_arrays.php' => '89e4e98aa8bf3c3f00b74d175e17be44', './modules/EmailMan/action_view_map.php' => '137158647e55f119ece5ef3106e08bd9', - './modules/EmailMan/Save.php' => '70680fb2ea3cdf7f56605a36150bee66', + './modules/EmailMan/Save.php' => '53866932041c1e0b684e61813ee19b3f', './modules/EmailMan/Menu.php' => '935f5e5e9940e2b115c0862dff26e96a', - './modules/EmailMan/Forms.php' => '6f1457f876f70c08f6a30c979a1e4353', + './modules/EmailMan/Forms.php' => '712377fd87dd4176905b4b927fe39cbd', './modules/EmailMan/EmailManDelivery.php' => 'e28504b209d80ce01701d672a8d2aa5f', './modules/EmailMan/EmailMan.php' => 'aa6dad9182139f6d027f17d8c17ea518', './modules/EmailAddresses/vardefs.php' => '8464b804f5be7f2e7ab271babb910ed7', @@ -2342,13 +2343,13 @@ $md5_string = array ( './modules/DynamicFields/FieldsMetaData.php' => '296f6d11e6572e1e4ac9f230b3b3dd45', './modules/DynamicFields/FieldViewer.php' => '8712c6799e8f106fdc57b7ab43cb9a24', './modules/DynamicFields/FieldCases.php' => '5a115e1c5b658c1f00c8655b66aadb49', - './modules/DynamicFields/DynamicField.php' => 'aaf9f8871c12613ab136a5f676ac802d', + './modules/DynamicFields/DynamicField.php' => '8ba4189f1351072ace66b2c74ad37bd8', './modules/Documents/documents.js' => '57c9cdf1bdc0d171d8d8b1c1124bff0d', - './modules/Documents/subpanels/default.php' => '02e579e2d07e14b3cc83d8563d6d8cd5', - './modules/Documents/subpanels/ForContractType.php' => '77e5c949270cd061aea40a638094d57b', './modules/Documents/views/view.edit.php' => 'cd3334d871efb08ff11138469da33c94', './modules/Documents/views/view.detail.php' => '3d836153f9e70d317f526d1cea675f60', - './modules/Documents/vardefs.php' => '958b957c100250642cb3222f40e6dd02', + './modules/Documents/subpanels/default.php' => '02e579e2d07e14b3cc83d8563d6d8cd5', + './modules/Documents/subpanels/ForContractType.php' => '77e5c949270cd061aea40a638094d57b', + './modules/Documents/vardefs.php' => '4c78b3da6ffa6272694ad1584b4507d9', './modules/Documents/metadata/subpanels/default.php' => '6d505e26bf95c15ec3deb6f69ed629fd', './modules/Documents/metadata/subpanels/ForContractType.php' => 'e4a3e73968acf2d0a2f211a291e6fcb5', './modules/Documents/metadata/subpaneldefs.php' => '8b12d5aff0cc4ca0c279546154f7ff51', @@ -2357,9 +2358,9 @@ $md5_string = array ( './modules/Documents/metadata/quickcreatedefs.php' => 'e6eab6bf1400da40b029dbdcbbb5ca8e', './modules/Documents/metadata/listviewdefs.php' => 'c534da3b2ddf4ba73fbffaabe864bea4', './modules/Documents/metadata/editviewdefs.php' => 'b726625c6d48056a5888118a97b61b57', - './modules/Documents/metadata/detailviewdefs.php' => '9c048c9327cab23f2212e5978659bdcd', + './modules/Documents/metadata/detailviewdefs.php' => '195556f69d7b4ee2d68b4d190069ecd5', './modules/Documents/metadata/SearchFields.php' => 'd5fac5c3cd65185fe82c6f316b9aa8b7', - './modules/Documents/language/en_us.lang.php' => '127ff8cfb6c2cf68e3cb91093bc87ba4', + './modules/Documents/language/en_us.lang.php' => 'f381c4e0f4d68f67fbb0db31210884d3', './modules/Documents/field_arrays.php' => '17ab246ffa0317da253689361f1dfb3a', './modules/Documents/TreeData.php' => '16ad8acdfecb80e79b2c6838ca5f6113', './modules/Documents/Popup_picker.php' => '975912e51cc22c5c8354843297b16ba6', @@ -2373,7 +2374,7 @@ $md5_string = array ( './modules/DocumentRevisions/EditView.php' => '75c13eaba7c0125c0e0278a30c241710', './modules/DocumentRevisions/subpanels/default.php' => 'dbc240b4c77f5ee6b8fb8e09c4c66d86', './modules/DocumentRevisions/metadata/subpanels/default.php' => '0733fa74d8c63d07f3ddeb1464bf2b0e', - './modules/DocumentRevisions/language/en_us.lang.php' => '22af55e5d02943a299bb53ba680084c8', + './modules/DocumentRevisions/language/en_us.lang.php' => 'e3dbfb58878c8ea96bb3a16b915c4ec1', './modules/DocumentRevisions/field_arrays.php' => '8946268a3f327b347bd6e6dbadd99927', './modules/DocumentRevisions/Save.php' => 'b2bc51fe1a1cec56b83ce18e2c6dd7b0', './modules/DocumentRevisions/Menu.php' => 'e37e3e5bcfdeb6990f12b73ccfb49413', @@ -2505,17 +2506,17 @@ $md5_string = array ( './modules/Configurator/tpls/addFontResult.tpl' => '0788b5174905d3013feb14f7ec4381be', './modules/Configurator/tpls/SugarpdfSettingsFields.tpl' => '7a8b844ca3e554a8050ffc9a4bdbb294', './modules/Configurator/tpls/SugarpdfSettings.tpl' => '186fed1d7dffb54c8319d439d63c35de', - './modules/Configurator/tpls/EditView.tpl' => 'd9ca44c76c35d5293fe5fccc63a830d6', + './modules/Configurator/tpls/EditView.tpl' => '1b0fd9979db2c5f193683555f49c506e', './modules/Configurator/metadata/SugarpdfSettingsdefs.php' => 'd9b13b9d6b0ef655942d094d116f509d', './modules/Configurator/language/en_us.lang.php' => 'd3f0e29ad124ff21508493584c48548a', - './modules/Configurator/SugarpdfSettings.php' => '3ce388315f9383c1e2c3bbaf183b0ffb', - './modules/Configurator/controller.php' => 'd3d07dc0f1108e421cd9959707b52fed', - './modules/Configurator/UploadFileCheck.php' => 'b5e01af685abb09cfc735399cbc758b4', + './modules/Configurator/SugarpdfSettings.php' => 'acaa86cc681ee3bd7c687ead75762f7d', + './modules/Configurator/controller.php' => '3647e946dc9e186280632c0ee424d07b', + './modules/Configurator/UploadFileCheck.php' => '5410db332f46f4b4e8280e5b2b31b1dc', './modules/Configurator/action_view_map.php' => 'dd3dccd29f4f0ad3ab6935a8dda0a359', './modules/Configurator/Menu.php' => 'f978c89aacc457107486e53fe5768f80', './modules/Configurator/LogView.php' => '77668af21cdf1132cbbff065419e56c0', './modules/Configurator/Forms.php' => 'a904600913c726e07c3ae5d7c81a9803', - './modules/Configurator/Configurator.php' => '535a1edadd10a8d0dc86428926f91437', + './modules/Configurator/Configurator.php' => '5aadf465cc6c189c1faa08b2b960543b', './modules/Charts/language/en_us.lang.php' => '35fb7000f67e1a0a80e4082e07eee3ee', './modules/Charts/code/predefined_charts.php' => '26bb40f32bad05579ed73a87e07c3c32', './modules/Charts/code/Chart_pipeline_by_sales_stage.php' => '27585f0e0bccb978b8327f286a5f7cdb', @@ -2632,8 +2633,8 @@ $md5_string = array ( './modules/Campaigns/WebToLeadCreation.html' => '2bc9da494178149c4f9c96eac5964392', './modules/Campaigns/WebToLeadCapture.php' => '53e482d3733f6b75551878a163587de3', './modules/Campaigns/Tracker.php' => '88f83ca5e269791b2672e041484d018a', - './modules/Campaigns/TrackDetailView.php' => '2a3dac5f2b46ad5323f9b06064541e7c', './modules/Campaigns/TrackDetailView.html' => '106fe3cf7ce6b6b3b1b701bfa7b4c6e9', + './modules/Campaigns/TrackDetailView.php' => '2a3dac5f2b46ad5323f9b06064541e7c', './modules/Campaigns/Subscriptions.tpl' => 'c4c0ce84e79bc1cb51cf675e1d78e940', './modules/Campaigns/Subscriptions.php' => '69811a5aae1751d16fb9ae8690bfabda', './modules/Campaigns/Subscriptions.html' => 'c48c2e2ee5ad0a6d71d9bd3d424e311b', @@ -2642,8 +2643,8 @@ $md5_string = array ( './modules/Campaigns/Schedule.php' => '5f0db5e34087037388a75a0b81ad9430', './modules/Campaigns/Schedule.html' => '0a8fcc4b6f67cf99dab1efb104bba071', './modules/Campaigns/Save.php' => '5cc149ddf1dc50ce8ebe13893615417a', - './modules/Campaigns/RoiDetailView.php' => 'eb72858d051590b8780a48f1d4d06f3e', './modules/Campaigns/RoiDetailView.html' => '266bfaca16fc4f219f316007c4b36403', + './modules/Campaigns/RoiDetailView.php' => 'eb72858d051590b8780a48f1d4d06f3e', './modules/Campaigns/RemoveMe.php' => '101b10e4dfbc2ded6217050feab4061d', './modules/Campaigns/QueueCampaign.php' => '7c6dd34ac9d4cf2e1e16bf2bdb9e551b', './modules/Campaigns/ProcessBouncedEmails.php' => '151573221f93352f39e03c5e79fda762', @@ -2686,7 +2687,7 @@ $md5_string = array ( './modules/CampaignLog/Menu.php' => '72cee4346bd510cecbc46485b04ade14', './modules/CampaignLog/CampaignLog.php' => '65daa9fa8dd7b2aba1e1e9ee3260f937', './modules/Calls/views/view.edit.php' => 'd9a7465f2a7505a60e1847dccdc125ec', - './modules/Calls/vardefs.php' => '03ebe28b63b489dc32cb8bcf138069eb', + './modules/Calls/vardefs.php' => '75fb222e346c6de0e51d9404c05a0aad', './modules/Calls/tpls/footer.tpl' => '6082af4d775df02784dc2e6038cc1cbf', './modules/Calls/tpls/QuickCreate.tpl' => 'd3152acfc1a288743f3a617d1051334c', './modules/Calls/metadata/subpanels/default.php' => '69cc2557c0ee5092e31e0e15dc3ccef0', @@ -2714,6 +2715,7 @@ $md5_string = array ( './modules/Calls/CallHelper.php' => 'd772215c0ab7f719711d3546d7529094', './modules/Calls/CallFormBase.php' => '6c3228ddd979627dfefd11be0ef79689', './modules/Calls/Call.php' => 'eadd6668fe0560b59923c3782237e097', + './modules/Calendar/DateTime.php' => 'cad2a9dcc51b952a4664ce7785a6f6bc', './modules/Calendar/views/view.list.php' => 'd0828a61e0acb41956f815c41e6cf609', './modules/Calendar/templates/templates_calendar.php' => '9b6fbe4006f34363e31540717faf336a', './modules/Calendar/templates/template_shared_calendar.php' => 'db4237ff405a53de6c8711f69433921a', @@ -2724,10 +2726,9 @@ $md5_string = array ( './modules/Calendar/TasksListView.php' => 'a57d6444949072e5a90d3d648235a762', './modules/Calendar/TasksListView.html' => '9e88f3dfbaa5334dffa19fdb60413428', './modules/Calendar/SubPanelSharedCalendar.php' => '31f7f9a358e80cdc5f5bac5a30904760', - './modules/Calendar/Menu.php' => '905b5dc6952f58378b5c77ae8edad9d8', './modules/Calendar/Forms.php' => 'a7fe2be5ad8ae8abbd68ce16c70c1825', + './modules/Calendar/Menu.php' => '905b5dc6952f58378b5c77ae8edad9d8', './modules/Calendar/DateTimeUtil.php' => '2cdd70909dc017d77a73c3d2ecd78b12', - './modules/Calendar/DateTime.php' => 'cad2a9dcc51b952a4664ce7785a6f6bc', './modules/Calendar/Calendar.php' => 'cea7ec1f49fea975273b3ee7f7cee651', './modules/Bugs/views/view.edit.php' => 'e2ac75d46479fe3748b11782913ec248', './modules/Bugs/views/view.detail.php' => '4a33cf87111a05df094d38cead553683', @@ -2789,30 +2790,30 @@ $md5_string = array ( './modules/Administration/clear_chart_cache.php' => '5aaf3f5813aae9666dcb6490f12d9859', './modules/Administration/ConfigureShortcutBar.php' => 'e70024f5a98d04850b3abbe9150c4440', './modules/Administration/callJSRepair.php' => 'e1854b35f5e12e29aa44b7effd53dfff', + './modules/Administration/Backups.php' => '8de2820f2f82a57b696de2c12f4d6472', './modules/Administration/updater_utils.php' => '26a1d341008c99101e2ec370e78b2612', './modules/Administration/repairDatabase.php' => '94caa48a793c4dcf440217a500947b50', './modules/Administration/expandDatabase.php' => 'ddd95fe1c25174c9bdf00e8a2a6952e9', - './modules/Administration/controller.php' => 'e9778d3d7b9566c01a15ac417f31f929', './modules/Administration/UpgradeIISAccess.php' => 'f28b5f8203d1e759f9720f90137bbc1c', - './modules/Administration/action_view_map.php' => 'd0537c6122f0cdefb16c48a16310057b', + './modules/Administration/controller.php' => 'e9778d3d7b9566c01a15ac417f31f929', './modules/Administration/UpgradeFields.php' => '0d4606783c2ae9e605e8511a0e118191', './modules/Administration/UpgradeWizard_prepare.php' => '54921e71e8d2897747754d703f3142ed', './modules/Administration/UpgradeWizard_commit.php' => '6aa94f475593121d15a4bc07f94d0740', './modules/Administration/UpgradeWizardCommon.php' => '37c393bc3854f8dcf64f7ac39dff8154', './modules/Administration/SupportPortal.tpl' => 'c2608013eda58535ad7ceaff45fbb2db', - './modules/Administration/UpgradeWizard.php' => '895ca5229bf6dbbf493b7d9ba3d047be', - './modules/Administration/UpgradeHistory.php' => '0b09d25575f35a6c10f3f42c12b03eb8', + './modules/Administration/action_view_map.php' => 'd0537c6122f0cdefb16c48a16310057b', + './modules/Administration/UpgradeWizard.php' => 'a7a905c3ef8ccb7dd4ec467fc53b0b65', './modules/Administration/Save.php' => '8820d9ec573f90bb107616f0e5a344b1', './modules/Administration/index.php' => 'fadc2f8bf422337e6de7b42539c4eb66', - './modules/Administration/UpgradeAccess.php' => '35ff86e9632b9fde0054cc5d384a35a7', + './modules/Administration/UpgradeHistory.php' => '0b09d25575f35a6c10f3f42c12b03eb8', './modules/Administration/RepairSeedUsers.php' => 'aa568a6f3019b773ab86496d610ecbb6', './modules/Administration/RepairJSFile.php' => '9f7634a710ea20fbcd87752ab13effb0', './modules/Administration/RepairIndex.php' => '3992ab770c32db420d7fd560f2ae95d1', './modules/Administration/RepairIE.php' => 'e902626f208e5a41a87cfd53c0d1fddd', + './modules/Administration/UpgradeAccess.php' => '7966e0279116af5b2548b2696382bc66', './modules/Administration/Upgrade.php' => '693526ef748a8e3034b5a6a36ece5ceb', './modules/Administration/Updater.php' => '0173d6ed050872bade9859062b2181c3', './modules/Administration/Updater.html' => '1f08c5d9a8b27f61457d26cec0305324', - './modules/Administration/SupportPortal.php' => '37cf5381924b289531dc870a1648eb11', './modules/Administration/RebuildJSLang.php' => '296049405f80d81f416cba73bc3c0969', './modules/Administration/RebuildFulltextIndices.php' => '0a3187381e10da07834e3acb6a3577a3', './modules/Administration/RebuildExpressionPlugins.php' => 'dbc337c8c58047aa0f64e79877bdf7f7', @@ -2820,13 +2821,14 @@ $md5_string = array ( './modules/Administration/RebuildConfig.php' => 'f0cfcb9081364d92d1f5b64ad00528ef', './modules/Administration/RebuildConfig.html' => 'e168d267267af1313aef423e5132ecab', './modules/Administration/RebuildAudit.php' => '742edda237b3ea73675cf4a4b5414ad9', + './modules/Administration/SupportPortal.php' => '37cf5381924b289531dc870a1648eb11', './modules/Administration/PasswordManager.tpl' => 'a83bea75b5efad137994959162140dad', './modules/Administration/RepairXSS.php' => 'cf49496a7a18c97241ee918b1b03c30f', './modules/Administration/RepairFieldCasing.php' => '8dd5686510e996f38faad739f6b7c3ae', - './modules/Administration/RepairActivities.php' => '63547a6cfc478c40ca49db3a571dd35c', './modules/Administration/RebuildSchedulers.php' => '5dbb2559d3794a1d4321615ace51ccb4', './modules/Administration/Menu.php' => 'b3d795eeb0207fd94afa809483eef0a5', './modules/Administration/Locale.tpl' => '21cd1751ab0e347953cde5789ddfd65e', + './modules/Administration/RepairActivities.php' => '63547a6cfc478c40ca49db3a571dd35c', './modules/Administration/RebuildRelationship.php' => '1ec5c7c3a761379532be4a287eab5643', './modules/Administration/QuickRepairAndRebuild.php' => 'bbb1be887ce0e5dd63756c63868a4344', './modules/Administration/PasswordManager.php' => 'df459a2c385692ef4691819626781fb0', @@ -2835,10 +2837,9 @@ $md5_string = array ( './modules/Administration/ExportCustomFieldStructure.php' => 'f638b11ed8a52b73342d6f7bb67fe0b9', './modules/Administration/Locale.php' => '151adfcd541408cad3ab876474f526a1', './modules/Administration/DisplayWarnings.php' => '34df220bbe489ae2383d0712dd447adc', - './modules/Administration/DiagnosticRun.php' => '32d46dd1e4bff57ca741639931d65575', - './modules/Administration/DiagnosticDownload.php' => '40afadd8a993034065f8ecb40d975c32', + './modules/Administration/DiagnosticRun.php' => '895125a943ca4d8a5cae6148f9d1e793', + './modules/Administration/DiagnosticDownload.php' => 'c83c765b948c58dd7c49b7bf0659bf41', './modules/Administration/DiagnosticDelete.php' => 'dc08fd1ccf4dbf7eeed96b7c283d27a8', - './modules/Administration/Backups.php' => '8de2820f2f82a57b696de2c12f4d6472', './modules/Administration/Diagnostic.php' => '8a3f65c383eef6d780e12fbedb38751e', './modules/Administration/Development.php' => 'ee3878df785b2cb3ddabea7024f97472', './modules/Administration/CustomizeFields.php' => 'cb1c9cc5ebba0d9d715f9052877d5f3a', @@ -3002,22 +3003,20 @@ $md5_string = array ( './log_file_restricted.html' => 'db7ac0ce0822e215c1c62e5592e56eac', './log4php/LoggerManager.php' => 'fa34194306cd50c01b71d8d5060ee362', './leadCapture.php' => '6acff84b622ac060efef67d110f8f10b', - './jssource/src_files/jscalendar/calendar-setup_3.js' => '4e82c1fa626cdc1a2f749fd9ff9119fc', - './jssource/src_files/jscalendar/calendar.js' => '2906fbef6c6b6d501b93d7547945bcc0', './jssource/src_files/include/JSON.js' => 'cee34cab2f2723ad0fbb17d319ca11d1', './jssource/src_files/include/MySugar/javascript/MySugar.js' => '7cb282187fd595c1ac6c5fb92b7a0ac2', - './jssource/src_files/include/SubPanel/SubPanelTiles.js' => '3e2ba957843d0935a1ae6820e69228ec', + './jssource/src_files/include/SubPanel/SubPanelTiles.js' => 'a3f311e30548aa66e34a8a8542bb9eea', './jssource/src_files/include/SugarDependentDropdown/javascript/SugarDependentDropdown.js' => 'c7d0f70a1f6108ad01b66065d07ce3b0', './jssource/src_files/include/SugarEmailAddress/SugarEmailAddress.js' => 'd1f2d39aeb58defc6c9e647792459621', './jssource/src_files/include/SugarFields/Fields/Address/SugarFieldAddress.js' => '2230e649a72034d4e7aefe81fb964ccf', './jssource/src_files/include/SugarFields/Fields/Collection/SugarFieldCollection.js' => 'd453a1b2ee708c96b17fe9e43c676c68', - './jssource/src_files/include/SugarFields/Fields/Datetimecombo/Datetimecombo.js' => '92b715c51465cdb4397d6b0c0785cc21', + './jssource/src_files/include/SugarFields/Fields/Datetimecombo/Datetimecombo.js' => '08f32226e33d57010a866a58d54616f4', './jssource/src_files/include/connectors/formatters/default/company_detail.js' => 'bf41167826e3fd4019fb46a69e7d7560', './jssource/src_files/include/javascript/cookie.js' => 'eb329b102eecc7a6278e7c2712a531b5', './jssource/src_files/include/javascript/dashlets.js' => '1f3d27f65d9262a6587fffad39673f4a', './jssource/src_files/include/javascript/include.js' => '4fd5d7da5c00e4c0a9a83b4b65a493f1', './jssource/src_files/include/javascript/jsclass_async.js' => '616ca1070d5e3f3bf6dcb210a59b302c', - './jssource/src_files/include/javascript/jsclass_base.js' => '85b1aeb3b9f9980aa2645e73e0c17702', + './jssource/src_files/include/javascript/jsclass_base.js' => '3f5f1bd86e7b3c501431a71269200cdd', './jssource/src_files/include/javascript/menu.js' => '21f57ea7c6d0ab2166021bb928d98251', './jssource/src_files/include/javascript/overlibmws.js' => '9fb2df046948fb09baf9bf62cf8d7877', './jssource/src_files/include/javascript/overlibmws_iframe.js' => '3714ae1a5be03f1470b30e8920386d14', @@ -3026,7 +3025,7 @@ $md5_string = array ( './jssource/src_files/include/javascript/quickCompose.js' => 'c87742cdae04b75afc7e59c9e9440d39', './jssource/src_files/include/javascript/quicksearch.js' => 'ed496427bcc648a621262401c67416ae', './jssource/src_files/include/javascript/report_additionals.js' => '7d8f86186481775d3f2b9577f62d7e01', - './jssource/src_files/include/javascript/sugar_3.js' => 'e03a1053d2af3759bd9bf9e46c255989', + './jssource/src_files/include/javascript/sugar_3.js' => '32e3120af5ad4f6747fa9784d7995888', './jssource/src_files/include/javascript/sugar_connection_event_listener.js' => '3f0ed5a6340391e82521b208d6b39e8d', './jssource/src_files/include/javascript/sugarwidgets/SugarYUILoader.js' => '91ce3f8311a938d63f6f4f41a2780855', './jssource/src_files/include/javascript/sugarwidgets/SugarYUIWidgets.js' => '18d0fbff67ee96b852f8d3bf2d033978', @@ -3307,6 +3306,8 @@ $md5_string = array ( './jssource/src_files/include/ytree/TreeView/anim/TVFadeIn.js' => '036c5e47e6c096f468fa30288b9c18fb', './jssource/src_files/include/ytree/TreeView/anim/TVFadeOut.js' => '7bda0243ee0f0ae64829c57e387145f3', './jssource/src_files/include/ytree/treeutil.js' => 'b4010d3a23933b3f78e48089b47ceeee', + './jssource/src_files/jscalendar/calendar-setup_3.js' => '4e82c1fa626cdc1a2f749fd9ff9119fc', + './jssource/src_files/jscalendar/calendar.js' => '2906fbef6c6b6d501b93d7547945bcc0', './jssource/src_files/install/dbConfig.js' => '0a69acd054311be6b0d62a4a8c56c002', './jssource/src_files/install/installCommon.js' => 'a64e04c8c9e02fc918d90dfc7463985f', './jssource/src_files/install/license.js' => '6144c34a4d7d444fa4249b177ad5142f', @@ -3327,7 +3328,7 @@ $md5_string = array ( './jssource/src_files/modules/Documents/documents.js' => '3b068dac2a20816b5bfda33f1b1e9a4d', './jssource/src_files/modules/EmailTemplates/EmailTemplate.js' => '5f31b123e46b4e18c59e890bed779e45', './jssource/src_files/modules/Home/about.js' => '21f5494869cd5700b0c552747ad8c0f7', - './jssource/src_files/modules/InboundEmail/InboundEmail.js' => '77e6dec9fbf0ac40a4bca55b8563fe14', + './jssource/src_files/modules/InboundEmail/InboundEmail.js' => '9d3e15f052ad39415c3a93db8b0e8915', './jssource/src_files/modules/Leads/Lead.js' => 'd06ef9e18d4c85fa7aedf57cdb5fc9e7', './jssource/src_files/modules/Meetings/jsclass_scheduler.js' => '007c932cc101de1394d949008ed79c68', './jssource/src_files/modules/MergeRecords/Merge.js' => '753cc64c1b94ed8f161112d17a3e0b0e', @@ -3382,7 +3383,7 @@ $md5_string = array ( './install/download_patches.php' => '1546b155f73b31ab560a5455390ecb67', './install/download_modules.php' => 'f368a12c71aecf9e08494fd3f8c4a218', './install/performSetup.php' => 'd0e5ec16ad0c4064fe3228a1580b49b8', - './install/install_utils.php' => 'a0435d3491c06e8d254b2e6ac141d0a1', + './install/install_utils.php' => '508e5f01006af336afaa653dd865f113', './install/demoData.en_us.php' => 'd0397bb331d78b9d2afc35ae4b3a26d2', './install/dbConfig_a.php' => 'd25c82c15a8f99f720d0be9a76636b8c', './install/data/disc_client.php' => 'b7f7853de0b429b9be5fdbc9532ecbe0', @@ -3391,6 +3392,49 @@ $md5_string = array ( './install/UserDemoData.php' => 'bf1960cf02f4ec9191110c69a107f7d6', './install/UploadLangFileCheck.php' => '95f3d18b8f5949bedb3dedf35292d975', './install/TeamDemoData.php' => '8c63181ad6d759ac25e980851b41b50f', + './jscalendar/calendar-setup_3.js' => 'f1d93f2a317bcab41c644db51d8439f8', + './jscalendar/calendar.js' => '148d801f09a0107deb8dc5bc04866152', + './jscalendar/menuarrow2.gif' => '1f8c673c8f76832febaeeac88a5f4353', + './jscalendar/menuarrow.gif' => 'b5a91d7a2755198b2eb729541ad3288c', + './jscalendar/license.txt' => 'a1eb59fdc7f0963feade867619a88ef2', + './jscalendar/lang/calendar-zh.js' => 'bf0554dec95a398f330f941795c2dc16', + './jscalendar/lang/calendar-tr.js' => '4f26da0c8959a1dc68f49a4c6da60b1b', + './jscalendar/lang/calendar-sv.js' => 'aaf935cffcc35a4528f818a3a07ed72e', + './jscalendar/lang/calendar-sp.js' => '27ac469017cebce7794313c8f32ba7f6', + './jscalendar/lang/calendar-sk.js' => 'd5796cc4101c1dec5b554fc9e0127803', + './jscalendar/lang/calendar-si.js' => 'da19a72dbc58cd74106136c5aef5bb4d', + './jscalendar/lang/calendar-ru.js' => '909dc190c7b0fe329e2603393c6779bb', + './jscalendar/lang/calendar-ro.js' => 'b29fefbfe3fd11caa40a9a82be7b6204', + './jscalendar/lang/calendar-pt.js' => '90e91a702a0c0f99d62acaa93670e869', + './jscalendar/lang/calendar-pl.js' => '5af1cc6832bc750706e8c06ac073b9ec', + './jscalendar/lang/calendar-pl-utf8.js' => '0bd95ba962e67841c8ed239a3df2d997', + './jscalendar/lang/calendar-no.js' => 'ccbab441f5fee37c200d9abe40d1255f', + './jscalendar/lang/calendar-nl.js' => 'c3fdd897e775b6ba7bbf5211237cd0bf', + './jscalendar/lang/calendar-lt.js' => '219ddd500ed21049afe38bd966ba9f17', + './jscalendar/lang/calendar-lt-utf8.js' => 'f0bf1897c54875c29fbf0c2fd2b1a5be', + './jscalendar/lang/calendar-ko.js' => '1be9407851b7839140f5277aa7b7fae7', + './jscalendar/lang/calendar-ko-utf8.js' => '39e8231f7bf5a6d1781deb70fd8e7fe8', + './jscalendar/lang/calendar-jp.js' => '3eaa9eb64bc928f8c4364319a0204959', + './jscalendar/lang/calendar-ja.js' => 'ef5e1d785b57e1e150beca96540e95ba', + './jscalendar/lang/calendar-it.js' => '7a4663a750ffcd81a0b17d6a2124364a', + './jscalendar/lang/calendar-hu.js' => 'a7c703a053a53b9e315313bf15c534bc', + './jscalendar/lang/calendar-hr.js' => '567465632e7302851f1ddc77be3e2ca9', + './jscalendar/lang/calendar-hr-utf8.js' => '0a632ebf18b40031ae7c9557a24852a5', + './jscalendar/lang/calendar-fr.js' => 'f60c78f5b964e73fee918e40f44d714a', + './jscalendar/lang/calendar-fi.js' => 'e7a287b17d4ba3dc5a632358ff5d914a', + './jscalendar/lang/calendar-es.js' => 'ea6595a64bcbf55f0b1520fe1a1e55af', + './jscalendar/lang/calendar-en.js' => 'fdbbbc911ebb911cb43db7098cf1649c', + './jscalendar/lang/calendar-el.js' => '947598b7481e533ac4c4465ba73721a1', + './jscalendar/lang/calendar-du.js' => 'e0d97e770e2c0f4022a884dc189c0f9c', + './jscalendar/lang/calendar-de.js' => '7c4a63e2db946fca37000886d79eefa2', + './jscalendar/lang/calendar-da.js' => '07bf90de5b986f72aa4f7e03aa6d607e', + './jscalendar/lang/calendar-cs-win.js' => '1d09a7ab540d7e5535793203c667730d', + './jscalendar/lang/calendar-ca.js' => 'c925aee68a819ea6dd0d3e4289dd3df3', + './jscalendar/lang/calendar-br.js' => 'e255943e1e229e7094f4678c3ea8bac9', + './jscalendar/lang/calendar-bg.js' => '845b886440564ca66a697beb4d33e49a', + './jscalendar/lang/calendar-af.js' => '329f4502104ac5e0f20b91a0cac91b91', + './jscalendar/img.gif' => 'c1e5255bd358fcd5a0779a0cc310a2fe', + './jscalendar/calendar-win2k-cold-1.css' => '54ef849188279f7e9e77461fadd87b02', './index.php' => 'ec6eb0c76d968e336e1721d1f6e31d42', './include/JSON.js' => '95acc2238c506f8f4faee18243655fbf', './include/ytree/treeutil.js' => '3ed885ac4154b25eb80fb2c272e63bca', @@ -3467,7 +3511,7 @@ $md5_string = array ( './include/utils/external_cache/SugarCache_ZendServer.php' => '5d253ce542e1089fb72185f4c719dd77', './include/utils/external_cache/SugarCache_Zend.php' => 'e0f1fb94e2ae90a77f9b313481133afa', './include/utils/external_cache/SugarCache_Wincache.php' => '6637bf7f2dac018e99c8ea0e05d84c08', - './include/utils/external_cache/SugarCache_Memcache.php' => '22f369e8ab6a93a104b0744fe7f196eb', + './include/utils/external_cache/SugarCache_Memcache.php' => 'c79e5197506cec73bbce9769c3de0d21', './include/utils/external_cache/SugarCache_ExternalAbstract.php' => 'f72717e2a8cbdcc62d67c56d61f2a360', './include/utils/external_cache/SugarCache_Base.php' => '60ab9990bdb08423ea5161a3785f5cad', './include/utils/external_cache/SugarCache_APC.php' => 'e39ee8bdf30fe177963bb2526443bb99', @@ -3477,8 +3521,8 @@ $md5_string = array ( './include/utils/progress_bar_utils.php' => '72633b667109464bafa8fc027c9938d4', './include/utils/zip_utils.php' => '68ea31cbab69f33f9d30f386a9cc7982', './include/utils/logic_utils.php' => 'a59013e866e3bed66ea19d404dad3a5d', - './include/utils/mvc_utils.php' => '90bca8943576ccf949759e1dfd909c82', - './include/utils/file_utils.php' => 'da6303d8964d5da5ebd8c2c7374fdec0', + './include/utils/mvc_utils.php' => 'f70cadb0d668630f000d8abe826d1c91', + './include/utils/file_utils.php' => '87b90ab168c1e0f45860150fe1572dc0', './include/utils/layout_utils.php' => '8942e9784ca325da2aad70cb956f16c7', './include/utils/external_cache.php' => '2d018926a89efdc108192dfcf7be0981', './include/utils/encryption_utils.php' => '18ee99143ae59f50d72b3c022fea5a39', @@ -3487,7 +3531,7 @@ $md5_string = array ( './include/utils/array_utils.php' => 'e19705c0c995be8545441c1fcdf01e84', './include/utils/activity_utils.php' => 'fc0b073a8b715799ec088c1452378686', './include/utils/LogicHook.php' => 'e4e3a8576e115f0282ed513068349c26', - './include/utils.php' => '9be09dc80cac69dc9146ff03a07eb39a', + './include/utils.php' => '1fe2a7ba8ca53e71e93c882b7af120da', './include/upload_file.php' => 'c50b407f1908ad5e986ca428ec4548f0', './include/timezone/timezones.php' => 'c1b535767fd4bb7fdb04d03a91ceed6c', './include/templates/TemplateGroupChooser.php' => '1971bdb38d86951c192a3f97e38a2ead', @@ -3588,7 +3632,7 @@ $md5_string = array ( './include/modules.php' => '48180c85e7ce3a14418691fa6d62f39d', './include/language/jsLanguage.php' => 'c44b0ccdccdfbd7eb0e1eb36f6628c56', './include/language/en_us.notify_template.html' => 'b05b6f7a4e2b199a1b8829dd2cb24272', - './include/language/en_us.lang.php' => '255672830fcf0dbc3963e67a224b9cc6', + './include/language/en_us.lang.php' => 'faaf25e82c56e6ae70135792f4c274d3', './include/json_config.php' => '53171aa245ef863a833567545207bef0', './include/jsolait/init.js' => '15b8d113066ad400aa80d9dfc35b544b', './include/jsolait/missingmixin.js' => 'e87a7ee61bd9e134791325d98ca72d9b', @@ -3603,19 +3647,19 @@ $md5_string = array ( './include/jsolait/lib/xmlrpc.js' => '561bc3aca65261c577ab56b9908d6b78', './include/jsolait/copying.txt' => '7fbc338309ac38fefcd64b04bb903e34', './include/jsolait/LICENSE' => '7fbc338309ac38fefcd64b04bb903e34', - './include/javascript/sugar_grp_quickcomp.js' => '39a5b2e7dfa6eb9187caff130f5d0331', - './include/javascript/sugar_grp_emails.js' => '69fbe8d41a23c3c08e7e1f27c730bd11', + './include/javascript/sugar_grp_quickcomp.js' => '4ccbb96c80dc11464eb3ffceb4731bb2', + './include/javascript/sugar_grp_emails.js' => '2550f85987f1ad5aae1bfbdbcd29dc98', './include/javascript/sugar_grp_overlib.js' => '697dc29858751a3a9848ded2d5cc9638', './include/javascript/sugar_grp_yui2.js' => '810b0d52b0d73ca309673fa8c88f7275', './include/javascript/sugar_grp_yui_widgets.css' => 'f3b4057fe9151a52174c1f6b252495fd', './include/javascript/sugar_grp_yui_widgets.js' => '35ddcaaacf3a5bd2536d64cad5b8e9d2', './include/javascript/sugar_grp1_yui.js' => '8c4c32d01308873b67a9fdabad62ff23', - './include/javascript/sugar_grp1.js' => '5385f9f51b7044e7d5d79ea7219d9bbf', + './include/javascript/sugar_grp1.js' => 'bdda53634008e1a507c1e99d4db3474e', './include/javascript/cookie.js' => 'de61d7b1eb4ba59186984d89f628eae2', './include/javascript/dashlets.js' => 'c58cce8a83dbb9623b5260c45a8b154f', './include/javascript/include.js' => '111549b33d8ca4011ca99a23105050fe', './include/javascript/jsclass_async.js' => '4c176f9adec386d72d222e4b52da0229', - './include/javascript/jsclass_base.js' => '6f7c03a1933cbd57542f87bdeafed70b', + './include/javascript/jsclass_base.js' => '757af42039add740fb838fac2d8baa4a', './include/javascript/menu.js' => '3abcb7c05eff710b8fa52d18d7a14834', './include/javascript/overlibmws.js' => 'f4bac256b9f8dc64ba4b22a8e1259ea2', './include/javascript/overlibmws_iframe.js' => 'e3c045ac5f7b73aeb761395339d82f30', @@ -3624,7 +3668,7 @@ $md5_string = array ( './include/javascript/quickCompose.js' => '8702e1904189f22c31f88b05e22398e7', './include/javascript/quicksearch.js' => 'fe8c4431483099b608ebe483d6e61ca3', './include/javascript/report_additionals.js' => 'bfb26a986bc020109f20b703fa6a6a9d', - './include/javascript/sugar_3.js' => 'ceb8d9708115b1e0436fcabd0e392339', + './include/javascript/sugar_3.js' => 'e08212c87039664102e218ede7f5285c', './include/javascript/sugar_connection_event_listener.js' => '119ff2a497fd3c53d9f9a9b3d2226357', './include/javascript/swfobject.js' => '52ce7b9e2bf41b265102db45f6cc765a', './include/javascript/yui3/index.html' => '9ff89ada5571d6d03eccc45dad57bb16', @@ -4567,7 +4611,7 @@ $md5_string = array ( './include/javascript/sugarwidgets/SugarYUILoader.js' => '3004b379974f68076dc298ab70e1f62d', './include/javascript/sugarwidgets/SugarYUIWidgets.js' => '101a53f750187962cd209b1cfe531099', './include/javascript/jsAlerts.php' => '415375bc5e9d2656873005559e86009b', - './include/javascript/javascript.php' => '906a991dcec7849d7798e8f5bae332e4', + './include/javascript/javascript.php' => '134338ab1ded487620216a59b3dedc0e', './include/javascript/getYUIComboFile.php' => '48b9dcefe27d14a5d14908d9f52dfebe', './include/images/wiki.png' => '6d21a744511a1b55378fbc985daac0e4', './include/images/university.png' => '346083109b89352e3a4b77cc249c56df', @@ -4642,7 +4686,7 @@ $md5_string = array ( './include/generic/SugarWidgets/SugarWidgetFieldid.php' => '461a534ec0747e686e0ebda2d914845e', './include/generic/SugarWidgets/SugarWidgetFieldfullname.php' => '3682f5255bf8218b17fc66c30b884999', './include/generic/SugarWidgets/SugarWidgetFieldfloat.php' => '5d38efd212076d9f096e4225145198e4', - './include/generic/SugarWidgets/SugarWidgetFieldenum.php' => 'c74b8130858f9c63f6f073dc76c9d12e', + './include/generic/SugarWidgets/SugarWidgetFieldenum.php' => 'b793766549772ded73db9baf19a43451', './include/generic/SugarWidgets/SugarWidgetFieldemail.php' => '2b239faf616c60f7162fe4fe7259c055', './include/generic/SugarWidgets/SugarWidgetFielddouble.php' => '8a726ca346e99c9ca1bd6d4972158706', './include/generic/SugarWidgets/SugarWidgetFielddecimal.php' => '732686fb5739045a130f90f38055cd57', @@ -4673,7 +4717,7 @@ $md5_string = array ( './include/fonts/Courier-BoldOblique.afm' => '5c34aeefc1ef69ae2fb317abc1ccc9ca', './include/fonts/Courier-Bold.afm' => 'cb84ced0cc430a5d54497257a11638f5', './include/export_utils.php' => 'c2bc58e4366464ee38c82e54b5c8e231', - './include/entryPoint.php' => '1b02a949b9b49557b97f273ef19ddf33', + './include/entryPoint.php' => 'a71252e4727c7135eb4e41c18f9598f1', './include/dir_inc.php' => '2546da87d674ce917e4786113056a8b5', './include/database/SqlsrvManager.php' => '0dbc863ae25d118abdf2390508a3afb6', './include/database/SqlsrvHelper.php' => '2358aa594df201e13411ab5befcc7464', @@ -4682,7 +4726,7 @@ $md5_string = array ( './include/database/MysqliHelper.php' => '5c29384d6a98b58e4a70222012ede66b', './include/database/MysqlManager.php' => 'ea5f7aec1d166e48ed6b21104b39d4fe', './include/database/MysqlHelper.php' => '255e224011b7fcb968c719f2e100f8eb', - './include/database/MssqlManager.php' => '6aec9b35e565e52a2bcd454f81843694', + './include/database/MssqlManager.php' => '3b12139d9036047c0bd7660fd235fb50', './include/database/MssqlHelper.php' => 'b5348532ed65c26c4406261198b1b627', './include/database/FreeTDSManager.php' => 'bbeb3f527257a0ebe0fd2f27f4090ca0', './include/database/FreeTDSHelper.php' => '1f725f014b815db50a02427b8ad07352', @@ -4715,7 +4759,7 @@ $md5_string = array ( './include/charts/hBarS.swf' => '04b6b37fd4b5951791562a665ba8fcf0', './include/charts/hBarF.swf' => 'da5f55932e932793072ace1c9dd1aab8', './include/charts/Charts.php' => 'da28c8c29494a15ae486228b60fe00e0', - './include/VarDefHandler/vardef_meta_arrays.php' => '5192667b08c9ba337c2ff5a1b1aaebc7', + './include/VarDefHandler/vardef_meta_arrays.php' => 'c2e83ff07368037ba33b3966e4eb899d', './include/VarDefHandler/listvardefoverride.php' => 'd9e443ba78875b7aec6f0cf7b9e17468', './include/VarDefHandler/VarDefHandler.php' => 'fab80ef153197b304b35cca428000009', './include/VarDefHandler/SugarTabs/tpls/singletabmenu.tpl' => '227465fee5c0d49008b431afc3c5668d', @@ -4796,7 +4840,7 @@ $md5_string = array ( './include/SugarObjects/templates/issue/config.php' => '6f9cdfda0abefeab1262260d9030468c', './include/SugarObjects/templates/issue/Issue.php' => '94069381dc9edadcfa1c231f1f7b4205', './include/SugarObjects/templates/file/views/view.edit.php' => '25c2b33651905c058de2cec20a59fe87', - './include/SugarObjects/templates/file/vardefs.php' => '01d8d8294f3be21c1cc0e614dcf7a507', + './include/SugarObjects/templates/file/vardefs.php' => '8ec40fd357e4c03f7acecc16cac3c805', './include/SugarObjects/templates/file/metadata/subpanels/default.php' => 'e68b8639a483574b567629cf5bd08807', './include/SugarObjects/templates/file/metadata/searchdefs.php' => '0ee0f29439e89162c8aef48953f45368', './include/SugarObjects/templates/file/metadata/quickcreatedefs.php' => '60f600d6f99438041448477b784b976b', @@ -4806,7 +4850,7 @@ $md5_string = array ( './include/SugarObjects/templates/file/metadata/detailviewdefs.php' => 'cd73435c99737ea80a61ea8e41c902bf', './include/SugarObjects/templates/file/metadata/dashletviewdefs.php' => '330f959e99840611d6f9cd0772c0892e', './include/SugarObjects/templates/file/metadata/SearchFields.php' => '80eba84b381cabd65626687f9dac1314', - './include/SugarObjects/templates/file/language/en_us.lang.php' => 'f54019e7fc8c24ed54bac75f12598334', + './include/SugarObjects/templates/file/language/en_us.lang.php' => 'b98c6dd6ab929b4e17dc1615d588a4ed', './include/SugarObjects/templates/file/language/application/en_us.lang.php' => '73927a49ad5d7b030819fe9735e0e3ee', './include/SugarObjects/templates/file/icons/file_32.gif' => '16b6a44601f20a651d1c83dc1a020c12', './include/SugarObjects/templates/file/icons/file.gif' => 'a577b65a0589e748d18aa1baef4e05c6', @@ -4861,7 +4905,7 @@ $md5_string = array ( './include/SugarLogger/SugarLogger.php' => '2af3c5f2ad5229e7c55d298e4122b8e3', './include/SugarLogger/LoggerTemplate.php' => '865497592529cb74a6033a5155f015b0', './include/SugarLogger/LoggerManager.php' => '62171c14b68db2be07810744dead9519', - './include/SugarFolders/SugarFolders.php' => 'eb2799e16548c5fdc0d384e40a3bfedc', + './include/SugarFolders/SugarFolders.php' => '150073ad11bc1f8434a81e700bc826f4', './include/SugarFields/SugarFieldHandler.php' => '5c16ae65725f0cab8b8a498fa7e7dfb5', './include/SugarFields/Parsers/SearchFormMetaParser.php' => '02267a9149b7e09830109655a8a4b373', './include/SugarFields/Parsers/Rules/VariableSubstitutionRule.php' => 'da69179d8f94d54dd68c23feafbbc832', @@ -4946,10 +4990,10 @@ $md5_string = array ( './include/SugarFields/Fields/Enum/DetailView.tpl' => '8878df81e832fcf2dff321eaf71c20e7', './include/SugarFields/Fields/Download/SugarFieldDownload.php' => '4808e73741a6f3f29e866cd18d2b95bf', './include/SugarFields/Fields/Download/DetailView.tpl' => '82ef678d73b48369c2fbb01b3a912e02', - './include/SugarFields/Fields/Datetimecombo/Datetimecombo.js' => 'ba6231e36655fb2c00929b565a875af8', - './include/SugarFields/Fields/Datetimecombo/SugarFieldDatetimecombo.php' => '9476f1723f373f8f7a4bdf542e167ec2', + './include/SugarFields/Fields/Datetimecombo/Datetimecombo.js' => 'd99f2bb1d574edcfc7858b92a04bcf80', + './include/SugarFields/Fields/Datetimecombo/SugarFieldDatetimecombo.php' => '12728123a0ee9f0815264a99f6629d32', './include/SugarFields/Fields/Datetimecombo/SearchView.tpl' => '794430573ea1f10bc910017e977315dd', - './include/SugarFields/Fields/Datetimecombo/EditView.tpl' => 'a19d05b65159f6c1166828a0593c41e8', + './include/SugarFields/Fields/Datetimecombo/EditView.tpl' => '54904921cdb4dea7e34ac3a346cc4877', './include/SugarFields/Fields/Datetime/SugarFieldDatetime.php' => '8eac0ac355d7215f9f5ce70f2f26cc75', './include/SugarFields/Fields/Datetime/EditView.tpl' => '1ba8a2dcea8857f5127643174ddc4312', './include/SugarFields/Fields/Currency/SugarFieldCurrency.php' => '9ddef180cfa22302364f1c876c1d939a', @@ -4995,7 +5039,7 @@ $md5_string = array ( './include/SugarEmailAddress/templates/forEditView.tpl' => 'a017738db1cb591c8215e7e01c6f1c39', './include/SugarEmailAddress/templates/forDuplicatesView.tpl' => '09f861c23cd12077f050e3079af3d23f', './include/SugarEmailAddress/templates/forDetailView.tpl' => 'b8bada2e77152a7cb89e6f503d42e202', - './include/SugarEmailAddress/SugarEmailAddress.php' => 'bb8630e02cf3f480bf78a59dc4b06f34', + './include/SugarEmailAddress/SugarEmailAddress.php' => 'b2a3f1479b9da18fd0fd31636648e3a3', './include/SugarDependentDropdown/metadata/dependentDropdown.php' => 'ad07b642238039f6dd8b366019feca3c', './include/SugarDependentDropdown/javascript/SugarDependentDropdown.js' => 'b5f8625205567f3d436ce7182375c881', './include/SugarDependentDropdown/SugarDependentDropdown.php' => 'ac4385687c68504d233e39a1c13b89ea', @@ -5009,7 +5053,7 @@ $md5_string = array ( './include/SugarCharts/swf/stackedGroupByChart.swf' => '0d524ea04b2c56d1c7cdc86194f59ed1', './include/SugarCharts/tpls/chart.tpl' => 'd181164aaf4353aca6fbe11af6965c6a', './include/SugarCharts/SugarChart.php' => '0ba742633101c9394546ba43a6c88eb1', - './include/SubPanel/SubPanelTiles.js' => '0d570a02800c04d603e50981021aa0da', + './include/SubPanel/SubPanelTiles.js' => 'ea6a4b3add603885bbe3100d62d36c40', './include/SubPanel/tpls/singletabmenu.tpl' => '3070f73cc977481a36dbb69ad8f4e23a', './include/SubPanel/subpanels.txt' => '754316b019dc694b893e830ffe65f49d', './include/SubPanel/registered_layout_defs.php' => '6784a47eba53d5940d743958bfd1cef5', @@ -5129,12 +5173,12 @@ $md5_string = array ( './include/SearchForm/tpls/SearchFormGenericAdvanced.tpl' => '297a8f97d9c31d8fdc7072aab5de81e5', './include/SearchForm/tpls/SearchFormGeneric.tpl' => 'f6a33c900a2d164fa9130351f047a226', './include/SearchForm/SugarSpot.php' => '7f1c636851c92665df06b9ceabe8f73d', - './include/SearchForm/SearchForm2.php' => '4c870d14ccc68874dfbcf8162ce937a2', + './include/SearchForm/SearchForm2.php' => 'aab98f3c7f65c4e59b09f87355f87165', './include/SearchForm/SearchForm.php' => '18fa71b0f4d20ec60fc9f907009a2dc3', './include/QuickSearchDefaults.php' => '674dd947d5a73cbb7f671dc0c70326ee', './include/Popups/tpls/header.tpl' => '100057ca98c7ac829a36cebd232c6bd3', './include/Popups/tpls/footer.tpl' => 'e973a29e7d29e9ab18a1c41bf6a0318e', - './include/Popups/tpls/PopupGeneric.tpl' => '3fdb74ac66582d40c6b34414eb7e422a', + './include/Popups/tpls/PopupGeneric.tpl' => 'bfe6dcbb71e502382816288507264a62', './include/Popups/Popup_picker.php' => '5778cbee0092c9812b687180ac9c3dcf', './include/Popups/PopupSmarty.php' => '93c9c2b2a00f3c9f7de088c3325e2554', './include/Pear/XML_HTMLSax3/LICENSE' => 'a45bb1bbeed9e26b26c5763df1d3913d', @@ -5142,11 +5186,11 @@ $md5_string = array ( './include/Pear/XML_HTMLSax3/HTMLSax3/Decorators.php' => '34a9a95566c891f013584073fbadaf7e', './include/Pear/XML_HTMLSax3/HTMLSax3.php' => '11107d97b19feb13feb394cd858603f0', './include/Pear/HTML_Safe/license.txt' => 'a9001003ee71c8e4ca0337600994e7ac', - './include/Pear/HTML_Safe/Safe.php' => 'fdcbdcb1ba1a71e3ce7432ca04e4b853', + './include/Pear/HTML_Safe/Safe.php' => '2ec6ff323a1057c0b94eda37a4caa480', './include/Pear/Crypt_Blowfish/license.txt' => 'a45bb1bbeed9e26b26c5763df1d3913d', './include/Pear/Crypt_Blowfish/Blowfish/DefaultKey.php' => '8274b556662cc178342ea96940b36514', './include/Pear/Crypt_Blowfish/Blowfish.php' => 'b391980575340d0fe5bf2df72bc13932', - './include/OutboundEmail/OutboundEmail.php' => 'e84cbe1ebbcd8ac718dc48397772c7cf', + './include/OutboundEmail/OutboundEmail.php' => 'c502e2caaeaa94b514dd2a14f791745e', './include/MySugar/tpls/retrieveReportCharts.tpl' => '1e7c4ae7cebae3d1ce56a4cbfcb5686f', './include/MySugar/tpls/retrievePage.tpl' => 'aba0b602f74d0f8d420af10fdfd703be', './include/MySugar/tpls/dashletsSearchResults.tpl' => 'ee66f9f318bd6769159f8cb342de3223', @@ -5156,7 +5200,7 @@ $md5_string = array ( './include/MySugar/javascript/MySugar.js' => '95480bf96ab6fe08446e52b8c1236557', './include/MySugar/MySugar.php' => '8db3f12d62d5827268dfe4a3b26226a8', './include/MySugar/DashletsDialog/DashletsDialog.php' => '3725a75570ef02be822d74e31a6f1e7f', - './include/MassUpdate.php' => 'eb6468cc2d9737d6dd1a2d56cd3190f2', + './include/MassUpdate.php' => 'ded360481afe54017d6b03310076d4fb', './include/MVC/View/views/view.xml.php' => '899ce32b620a040d2f04dd32bf32cd6d', './include/MVC/View/views/view.vcard.php' => 'f40aefcaf222ae87d5717603327a4ceb', './include/MVC/View/views/view.sugarpdf.php' => 'fffb5f92357ed83e618ccf726747443e', @@ -5168,7 +5212,7 @@ $md5_string = array ( './include/MVC/View/views/view.noaccess.php' => 'e50a68464bc808edb90b2a9fc8ec99fe', './include/MVC/View/views/view.multiedit.php' => '5e113a540d3bbac4d7329b1c6b808377', './include/MVC/View/views/view.modulelistmenu.php' => 'e903cb33f76f8e66c57ff218698a6a9b', - './include/MVC/View/views/view.list.php' => 'fafbf45cfbe248539e1f301d8457f997', + './include/MVC/View/views/view.list.php' => '4d4cce2e65285b80fc0e0a173b59e209', './include/MVC/View/views/view.json.php' => '860bdf32d8d0c5e223f7d54c41ae017e', './include/MVC/View/views/view.importvcardsave.php' => '41068e4fead26d11306ed9de7f03a12b', './include/MVC/View/views/view.importvcard.php' => '2274194b1f6fe4c6df0d80645652ac26', @@ -5184,9 +5228,9 @@ $md5_string = array ( './include/MVC/View/ViewFactory.php' => 'c7ebee5efbeae00db163c01401ba28e8', './include/MVC/View/SugarView.php' => '904d3aa05473b3fdfda7de362aad3071', './include/MVC/SugarModule.php' => 'cc8fe8b2b0239c40d0b04abe12ab31cf', - './include/MVC/SugarApplication.php' => '0a1ab47fd5c8d0047a77ffbb6173a65f', + './include/MVC/SugarApplication.php' => 'c61386640597fbf0c665723a37925edf', './include/MVC/Controller/file_access_control_map.php' => 'e04c44c836810acfbc21c7ffb10f00d6', - './include/MVC/Controller/entry_point_registry.php' => 'e66983d43c99752a61da1aa1db9d7bad', + './include/MVC/Controller/entry_point_registry.php' => '63da395b9079b223b4a921ee0d1af7c9', './include/MVC/Controller/action_view_map.php' => 'f86f9461f69d408db31d4c726c53bc9e', './include/MVC/Controller/action_file_map.php' => '5a5579b9cee401b91d6d421cf6f95576', './include/MVC/Controller/SugarController.php' => '7e1934b5106f690529695d82a788efc1', @@ -5198,7 +5242,7 @@ $md5_string = array ( './include/ListView/ListViewNoMassUpdate.tpl' => 'eed55b49e2b787d71106e4e54d30f45f', './include/ListView/ListViewGeneric.tpl' => '3754068a0f671ff29a8cafaa3cc0a9b0', './include/ListView/ListViewFacade.php' => '09ab474e08eb514a7fe506b6faa3abae', - './include/ListView/ListViewDisplay.php' => 'a2db16a5eba82ab3281a8e75444acfcb', + './include/ListView/ListViewDisplay.php' => '376d5c1d6c416da74bd6aa4a24ac0fc1', './include/ListView/ListViewData.php' => '36876ea156812985f1155fcf439406e9', './include/ListView/ListView.php' => '8baaa72b1b8c6fe24a82baedc8deadd0', './include/JSON.php' => '1a8d53c6b92eb5886884a6fb923dbf38', @@ -5234,49 +5278,6 @@ $md5_string = array ( './include/Dashlets/DashletCacheBuilder.php' => '2450bc0178c619d93dfa457795a6fa31', './include/Dashlets/Dashlet.php' => '56a29661401bc9d29836c4a3e4988e17', './image.php' => '9b23aefc874f7518e0f8c32c8ea53711', - './jscalendar/calendar-setup_3.js' => 'f1d93f2a317bcab41c644db51d8439f8', - './jscalendar/calendar.js' => '148d801f09a0107deb8dc5bc04866152', - './jscalendar/menuarrow2.gif' => '1f8c673c8f76832febaeeac88a5f4353', - './jscalendar/menuarrow.gif' => 'b5a91d7a2755198b2eb729541ad3288c', - './jscalendar/license.txt' => 'a1eb59fdc7f0963feade867619a88ef2', - './jscalendar/lang/calendar-zh.js' => 'bf0554dec95a398f330f941795c2dc16', - './jscalendar/lang/calendar-tr.js' => '4f26da0c8959a1dc68f49a4c6da60b1b', - './jscalendar/lang/calendar-sv.js' => 'aaf935cffcc35a4528f818a3a07ed72e', - './jscalendar/lang/calendar-sp.js' => '27ac469017cebce7794313c8f32ba7f6', - './jscalendar/lang/calendar-sk.js' => 'd5796cc4101c1dec5b554fc9e0127803', - './jscalendar/lang/calendar-si.js' => 'da19a72dbc58cd74106136c5aef5bb4d', - './jscalendar/lang/calendar-ru.js' => '909dc190c7b0fe329e2603393c6779bb', - './jscalendar/lang/calendar-ro.js' => 'b29fefbfe3fd11caa40a9a82be7b6204', - './jscalendar/lang/calendar-pt.js' => '90e91a702a0c0f99d62acaa93670e869', - './jscalendar/lang/calendar-pl.js' => '5af1cc6832bc750706e8c06ac073b9ec', - './jscalendar/lang/calendar-pl-utf8.js' => '0bd95ba962e67841c8ed239a3df2d997', - './jscalendar/lang/calendar-no.js' => 'ccbab441f5fee37c200d9abe40d1255f', - './jscalendar/lang/calendar-nl.js' => 'c3fdd897e775b6ba7bbf5211237cd0bf', - './jscalendar/lang/calendar-lt.js' => '219ddd500ed21049afe38bd966ba9f17', - './jscalendar/lang/calendar-lt-utf8.js' => 'f0bf1897c54875c29fbf0c2fd2b1a5be', - './jscalendar/lang/calendar-ko.js' => '1be9407851b7839140f5277aa7b7fae7', - './jscalendar/lang/calendar-ko-utf8.js' => '39e8231f7bf5a6d1781deb70fd8e7fe8', - './jscalendar/lang/calendar-jp.js' => '3eaa9eb64bc928f8c4364319a0204959', - './jscalendar/lang/calendar-ja.js' => 'ef5e1d785b57e1e150beca96540e95ba', - './jscalendar/lang/calendar-it.js' => '7a4663a750ffcd81a0b17d6a2124364a', - './jscalendar/lang/calendar-hu.js' => 'a7c703a053a53b9e315313bf15c534bc', - './jscalendar/lang/calendar-hr.js' => '567465632e7302851f1ddc77be3e2ca9', - './jscalendar/lang/calendar-hr-utf8.js' => '0a632ebf18b40031ae7c9557a24852a5', - './jscalendar/lang/calendar-fr.js' => 'f60c78f5b964e73fee918e40f44d714a', - './jscalendar/lang/calendar-fi.js' => 'e7a287b17d4ba3dc5a632358ff5d914a', - './jscalendar/lang/calendar-es.js' => 'ea6595a64bcbf55f0b1520fe1a1e55af', - './jscalendar/lang/calendar-en.js' => 'fdbbbc911ebb911cb43db7098cf1649c', - './jscalendar/lang/calendar-el.js' => '947598b7481e533ac4c4465ba73721a1', - './jscalendar/lang/calendar-du.js' => 'e0d97e770e2c0f4022a884dc189c0f9c', - './jscalendar/lang/calendar-de.js' => '7c4a63e2db946fca37000886d79eefa2', - './jscalendar/lang/calendar-da.js' => '07bf90de5b986f72aa4f7e03aa6d607e', - './jscalendar/lang/calendar-cs-win.js' => '1d09a7ab540d7e5535793203c667730d', - './jscalendar/lang/calendar-ca.js' => 'c925aee68a819ea6dd0d3e4289dd3df3', - './jscalendar/lang/calendar-br.js' => 'e255943e1e229e7094f4678c3ea8bac9', - './jscalendar/lang/calendar-bg.js' => '845b886440564ca66a697beb4d33e49a', - './jscalendar/lang/calendar-af.js' => '329f4502104ac5e0f20b91a0cac91b91', - './jscalendar/img.gif' => 'c1e5255bd358fcd5a0779a0cc310a2fe', - './jscalendar/calendar-win2k-cold-1.css' => '54ef849188279f7e9e77461fadd87b02', './json_server.php' => '2bab1d6a77c668efc56d0c1a4cf1cd99', './examples/SoapTestPortal2.php' => '47f16aff36eb05fafa19985a43d2ecd4', './examples/SoapTestPortal.php' => '2d5550a7519f3ef62c445673df39077c', @@ -5286,13 +5287,13 @@ $md5_string = array ( './examples/ExampleLeadCapture.php' => '5427510db86ff439c9345bd3673c7173', './examples/EXAMPLES_README.txt' => 'b55744b5e2684d91f6d3f98db4553673', './emailmandelivery.php' => 'c48b3d73c8359b341ce50b1963847944', - './install.php' => '0aabe8ef297d36bcc57eb8269cc07e9a', + './install.php' => 'c9ee2afaf412bf3d567792a801cd6e05', './dictionary.php' => 'e4e8f9cad5a1e40989cfb246d5f8f99b', './export.php' => '065ad70485a6c090cb72c65a9a3568c4', - './download.php' => 'c317f1bac5d59bd281c6e5c14751a5fd', + './download.php' => '4f6cb5301c718bd2ad5497daff7b00a6', './data/upload/index.html' => '9cd784063d39b18d308932c28c385853', './data/Tracker.php' => '29c14ab7333e8d37a7ff77fe42b516bd', - './data/SugarBean.php' => 'd2c806ad84d85a561d433d6c0efa2430', + './data/SugarBean.php' => '5d88f533cc97bf5160c225657d369df2', './data/Link.php' => '2a8ceda7d409ac0e0580259e0c92505d', './custom/index.html' => 'b0070a296647b6026d1800db14510e3c', './cron.php' => 'a8ad27b49bafc80799a504760c007bdd', diff --git a/include/ListView/ListViewDisplay.php b/include/ListView/ListViewDisplay.php index a9204d74..14977829 100644 --- a/include/ListView/ListViewDisplay.php +++ b/include/ListView/ListViewDisplay.php @@ -55,6 +55,7 @@ class ListViewDisplay { var $multiSelect = true; var $mailMerge = true; var $should_process = true; + var $show_plus = false; /* * Used in view.popup.php. Sometimes there are fields on the search form that are not referenced in the listviewdefs. If this * is the case, then the filterFields will be set and the related fields will not be referenced when calling create_new_list_query. @@ -122,15 +123,15 @@ class ListViewDisplay { // create filter fields based off of display columns if(empty($filter_fields) || $this->mergeDisplayColumns) { foreach($this->displayColumns as $columnName => $def) { - + $filter_fields[strtolower($columnName)] = true; - + if(isset($this->seed->field_defs[strtolower($columnName)]['type']) && strtolower($this->seed->field_defs[strtolower($columnName)]['type']) == 'currency' && isset($this->seed->field_defs['currency_id'])) { $filter_fields['currency_id'] = true; - } - + } + if(!empty($def['related_fields'])) { foreach($def['related_fields'] as $field) { //id column is added by query construction function. This addition creates duplicates @@ -157,14 +158,14 @@ class ListViewDisplay { $data = $this->lvd->getListViewData($seed, $where, $offset, $limit, $filter_fields, $params, $id_field); - + foreach($this->displayColumns as $columnName => $def) { $seedName = strtolower($columnName); if(!empty($this->lvd->seed->field_defs[$seedName])){ $seedDef = $this->lvd->seed->field_defs[$seedName]; } - + if(empty($this->displayColumns[$columnName]['type'])){ if(!empty($seedDef['type'])){ $this->displayColumns[$columnName]['type'] = (!empty($seedDef['custom_type']))?$seedDef['custom_type']:$seedDef['type']; @@ -172,7 +173,7 @@ class ListViewDisplay { $this->displayColumns[$columnName]['type'] = ''; } }//fi empty(...) - + if(!empty($seedDef['options'])){ $this->displayColumns[$columnName]['options'] = $seedDef['options']; } @@ -209,11 +210,11 @@ class ListViewDisplay { // Merge the two arrays together, making sure the seedDef doesn't override anything explicitly set in the displayColumns array. $this->displayColumns[$columnName] = $this->displayColumns[$columnName] + $seedDef; } - + //C.L. Bug 38388 - ensure that ['id'] is set for related fields if(!isset($this->displayColumns[$columnName]['id']) && isset($this->displayColumns[$columnName]['id_name'])) { $this->displayColumns[$columnName]['id'] = strtoupper($this->displayColumns[$columnName]['id_name']); - } + } } $this->process($file, $data, $seed->object_name); @@ -252,10 +253,15 @@ class ListViewDisplay { global $app_strings; if ($pageTotal < 0) $pageTotal = $total; + $plus = ''; + if (!empty($GLOBALS['sugar_config']['disable_count_query']) && $total > $pageTotal) { + $plus = '+'; + $this->show_plus = true; + } $script = "'); - + SED.quickCreateDialog.ieId = ret.ieId; SED.quickCreateDialog.uid = ret.uid; SED.quickCreateDialog.mbox = ret.mbox; SED.quickCreateDialog.qcmodule = ret.module; - + SED.quickCreateDialog.show(); var editForm = document.getElementById('form_EmailQCView_' + ret.module); if (editForm) { editForm.module.value = 'Emails'; - var count = SUGAR.EmailAddressWidget.count[ret.module] ? SUGAR.EmailAddressWidget.count[ret.module] : 0; + var count = SUGAR.EmailAddressWidget.count[ret.module] ? SUGAR.EmailAddressWidget.count[ret.module] : 0; var tableId = YAHOO.util.Dom.getElementsByClassName('emailaddresses', 'table', editForm)[0].id; var instId = ret.module + count; SED.quickCreateEmailsToAdd = ret.emailAddress; SED.quickCreateEmailCallback = function(instId, tableId) { var eaw = SUGAR.EmailAddressWidget.instances[instId]; if (typeof(eaw) == "undefined") - window.setTimeout("SUGAR.email2.detailView.quickCreateEmailCallback('" + window.setTimeout("SUGAR.email2.detailView.quickCreateEmailCallback('" + instId + "','" + tableId + "');", 100); eaw.prefillEmailAddresses(tableId, SUGAR.email2.detailView.quickCreateEmailsToAdd); } - window.setTimeout("SUGAR.email2.detailView.quickCreateEmailCallback('" + window.setTimeout("SUGAR.email2.detailView.quickCreateEmailCallback('" + instId + "','" + tableId + "');", 100); } }, @@ -7224,7 +7217,7 @@ AjaxObject.detailView = { SUGAR.email2.complexLayout.findPanel('contactsTab').show(); validate['EditView'] = [ ]; }, - + handleAssignmentDialogAssignAction : function() { @@ -7241,7 +7234,7 @@ AjaxObject.detailView = { alert(warning_message); return; } - + var emailUids = SUGAR.email2.listView.getUidsFromSelection(); var uids = ""; for(i=0; i" + - // remove button + // remove button "" + // file icon "" + // file name - ((ret.nameForDisplay != null) ? ret.nameForDisplay + " " : ret.name + " ") + + ((ret.nameForDisplay != null) ? ret.nameForDisplay + " " : ret.name + " ") + "
" + ""; overall.innerHTML += out; @@ -662,10 +662,10 @@ AjaxObject.accounts = { SUGAR.email2.accounts.newAddedOutboundId = id; }, saveDefaultOutboundCleanup: function(o){ - + }, callbackEditOutbound : { - success : function(o) + success : function(o) { var ret = JSON.parse(o.responseText); // show overlay @@ -680,11 +680,10 @@ AjaxObject.accounts = { document.getElementById("outboundEmailForm").mail_smtptype.value = ret.mail_smtptype; document.getElementById("mail_smtpport").value = ret.mail_smtpport; document.getElementById("mail_smtpuser").value = ret.mail_smtpuser; - document.getElementById("mail_smtppass").value = ret.mail_smtppass; document.getElementById("mail_smtpauth_req").checked = (ret.mail_smtpauth_req == 1) ? true : false; SUGAR.email2.accounts.smtp_authenticate_field_display(); document.getElementById("mail_smtpssl").options[ret.mail_smtpssl].selected = true; - + if(ret.type == 'system-override') { SUGAR.email2.accounts.toggleOutboundAccountDisabledFields(true); SUGAR.email2.accounts.changeEmailScreenDisplay(ret.mail_smtptype,true); @@ -693,8 +692,8 @@ AjaxObject.accounts = { SUGAR.email2.accounts.toggleOutboundAccountDisabledFields(false); SUGAR.email2.accounts.changeEmailScreenDisplay(ret.mail_smtptype,false); } - - + SUGAR.util.setEmailPasswordDisplay('mail_smtppass', ret.has_password); + }, failure : AjaxObject.handleFailure, timeout : AjaxObject.timeout, @@ -705,13 +704,13 @@ AjaxObject.accounts = { var ret = JSON.parse(o.responseText); if(ret.is_error) { - if(confirm(ret.error_message)) + if(confirm(ret.error_message)) { overlay(app_strings.LBL_EMAIL_IE_DELETE, app_strings.LBL_EMAIL_ONE_MOMENT); AjaxObject.startRequest(AjaxObject.accounts.callbackDeleteOutbound, urlStandard + "&emailUIAction=deleteOutbound&confirm=true&outbound_email=" + ret.outbound_email); } else - hideOverlay(); + hideOverlay(); } else { @@ -719,35 +718,35 @@ AjaxObject.accounts = { SUGAR.email2.accounts.refreshOuboundAccountTable(); } }, - + failure : AjaxObject.handleFailure, timeout : AjaxObject.timeout, scope : AjaxObject }, - + callbackCheckMailProgress : { success : function(o) { if (typeof(SUGAR.email2.accounts.totalMsgCount) == "undefined") { SUGAR.email2.accounts.totalMsgCount = -1; } - + //Check for server timeout / errors var ret = JSON.parse(o.responseText); var done = false; - + if (typeof(o.responseText) == 'undefined' || o.responseText == "" || ret == false) { hideOverlay(); overlay(app_strings.LBL_EMAIL_ERROR_DESC, app_strings.LBL_EMAIL_ERROR_TIMEOUT, 'alert'); SUGAR.email2.accounts.totalMsgCount = -1; //SUGAR.email2.folders.rebuildFolders(); done = true; - } - + } + var currIeId = ret['ieid']; - - + + var serverCount = ret.count; - + if (ret['status'] == 'done') { for(i=0; i < SUGAR.email2.accounts.ieIds.length; i++) { if (i == SUGAR.email2.accounts.ieIds.length - 1) { @@ -762,7 +761,7 @@ AjaxObject.accounts = { break; } } - } + } else if (ret.mbox && ret.totalcount && ret.count) { SUGAR.email2.accounts.totalMsgCount = ret.totalcount; if (ret.count >= ret.totalcount) { @@ -776,7 +775,7 @@ AjaxObject.accounts = { SUGAR.email2.accounts.totalMsgCount = -1; done = true; } - + if (done) { SUGAR.email2.accounts.totalMsgCount = -1; hideOverlay(); @@ -784,13 +783,13 @@ AjaxObject.accounts = { SE.listView.refreshGrid(); } else if (SUGAR.email2.accounts.totalMsgCount < 0) { YAHOO.SUGAR.MessageBox.updateProgress(0, mod_strings.LBL_CHECKING_ACCOUNT + ' '+ (i + 2) + ' '+ mod_strings.LBL_OF + ' ' + SUGAR.email2.accounts.ieIds.length); - AjaxObject.startRequest(AjaxObject.accounts.callbackCheckMailProgress, urlStandard + + AjaxObject.startRequest(AjaxObject.accounts.callbackCheckMailProgress, urlStandard + '&emailUIAction=checkEmailProgress&ieId=' + currIeId + "¤tCount=0&synch=" + ret.synch); } else { YAHOO.SUGAR.MessageBox.updateProgress((ret.count / SUGAR.email2.accounts.totalMsgCount) * 100, app_strings.LBL_EMAIL_DOWNLOAD_STATUS.replace(/\[\[count\]\]/, ret.count).replace(/\[\[total\]\]/, SUGAR.email2.accounts.totalMsgCount)); - AjaxObject.startRequest(AjaxObject.accounts.callbackCheckMailProgress, urlStandard + - '&emailUIAction=checkEmailProgress&ieId=' + currIeId + "¤tCount=" + serverCount + + AjaxObject.startRequest(AjaxObject.accounts.callbackCheckMailProgress, urlStandard + + '&emailUIAction=checkEmailProgress&ieId=' + currIeId + "¤tCount=" + serverCount + '&mbox=' + ret.mbox + '&synch=' + ret.synch + '&totalcount=' + SUGAR.email2.accounts.totalMsgCount); } }, @@ -811,7 +810,7 @@ AjaxObject.composeLayout = { var ret = JSON.parse(o.responseText); if(ret) SUGAR.email2.composeLayout.forceCloseCompose(ret.composeLayoutId); - else if (o.responseText) + else if (o.responseText) overlay(mod_strings.LBL_ERROR_SAVING_DRAFT, o.responseText, 'alert'); } }; @@ -839,7 +838,7 @@ AjaxObject.detailView = { if (typeof(email.cc) == 'undefined') { email.cc = ""; } - + var out = displayTemplate.exec({ 'app_strings' : app_strings, 'theme' : theme, @@ -849,7 +848,7 @@ AjaxObject.detailView = { }); // open popup window - var popup = window.open('modules/Emails/templates/_blank.html', 'printwin' , + var popup = window.open('modules/Emails/templates/_blank.html', 'printwin' , 'scrollbars=yes,menubar=no,height=600,width=800,resizable=yes,toolbar=no,location=no,status=no'); popup.document.write(out); @@ -884,7 +883,7 @@ AjaxObject.detailView = { SED.viewDialog.setHeader(ret.title); SED.viewDialog.setBody(ret.html); SED.viewDialog.render(); - SED.viewDialog.show(); + SED.viewDialog.show(); }, /** @@ -902,7 +901,7 @@ AjaxObject.detailView = { constraintoviewport: true, shadow : true }); - + SED.quickCreateDialog.renderEvent.subscribe(function() { var viewH = YAHOO.util.Dom.getViewportHeight(); var contH = 0; @@ -917,7 +916,7 @@ AjaxObject.detailView = { this.body.style.height = (viewH - 75 > contH ? (contH + 10) : (viewH - 75)) + "px"; this.body.style.overflow = "auto"; }, SED.quickCreateDialog); - + SED.quickCreateDialog.hideEvent.subscribe(function(){ var qsFields = YAHOO.util.Dom.getElementsByClassName('.sqsEnabled', null, this.body); /*for(var qsField in qsFields){ @@ -933,29 +932,29 @@ AjaxObject.detailView = { SED.quickCreateDialog.setBody(ret.html ? ret.html : " "); SED.quickCreateDialog.render(); SUGAR.util.evalScript(ret.html + ''); - + SED.quickCreateDialog.ieId = ret.ieId; SED.quickCreateDialog.uid = ret.uid; SED.quickCreateDialog.mbox = ret.mbox; SED.quickCreateDialog.qcmodule = ret.module; - + SED.quickCreateDialog.show(); var editForm = document.getElementById('form_EmailQCView_' + ret.module); if (editForm) { editForm.module.value = 'Emails'; - var count = SUGAR.EmailAddressWidget.count[ret.module] ? SUGAR.EmailAddressWidget.count[ret.module] : 0; + var count = SUGAR.EmailAddressWidget.count[ret.module] ? SUGAR.EmailAddressWidget.count[ret.module] : 0; var tableId = YAHOO.util.Dom.getElementsByClassName('emailaddresses', 'table', editForm)[0].id; var instId = ret.module + count; SED.quickCreateEmailsToAdd = ret.emailAddress; SED.quickCreateEmailCallback = function(instId, tableId) { var eaw = SUGAR.EmailAddressWidget.instances[instId]; if (typeof(eaw) == "undefined") - window.setTimeout("SUGAR.email2.detailView.quickCreateEmailCallback('" + window.setTimeout("SUGAR.email2.detailView.quickCreateEmailCallback('" + instId + "','" + tableId + "');", 100); eaw.prefillEmailAddresses(tableId, SUGAR.email2.detailView.quickCreateEmailsToAdd); } - window.setTimeout("SUGAR.email2.detailView.quickCreateEmailCallback('" + window.setTimeout("SUGAR.email2.detailView.quickCreateEmailCallback('" + instId + "','" + tableId + "');", 100); } }, @@ -988,7 +987,7 @@ AjaxObject.detailView = { SUGAR.email2.complexLayout.findPanel('contactsTab').show(); validate['EditView'] = [ ]; }, - + handleAssignmentDialogAssignAction : function() { @@ -1005,7 +1004,7 @@ AjaxObject.detailView = { alert(warning_message); return; } - + var emailUids = SUGAR.email2.listView.getUidsFromSelection(); var uids = ""; for(i=0; i 0) { SE.composeLayout.handleDrop( - (type == 'contacts') ? SE.contactView : SE.emailListsView, + (type == 'contacts') ? SE.contactView : SE.emailListsView, null, rows, 'addressTO' + idx ); } else { alert(app_strings.LBL_EMAIL_MENU_MAKE_SELECTION); @@ -2646,7 +2645,7 @@ SE.addressBook = { elementId = element.id.substring(2); } }, - + /** * Filters contact entries based on user input @@ -2690,14 +2689,14 @@ SE.addressBook = { return ret; }, - + /** * Sets up async call to query for matching contacts, users, etc. */ searchContacts : function() { var fn = document.getElementById('input_searchField').value; var pe = document.getElementById('input_searchPerson').value; - + var rb = document.getElementById('hasRelatedBean').checked; if (rb) { var idx = this.idx; @@ -2708,14 +2707,14 @@ SE.addressBook = { } else { this.addressBookDataModel.params['related_bean_id'] = ''; } - + this.addressBookDataModel.params['search_field'] = fn; this.addressBookDataModel.params['person'] = pe; this.addressBookDataModel.params['emailUIAction'] = 'getAddressSearchResults'; this.grid._oDataSource = this.addressBookDataModel; this.grid.getDataSource().sendRequest(SUGAR.util.paramsToUrl(this.addressBookDataModel.params), this.grid.onDataReturnInitializeTable, this.grid); }, - + /** * Clear Search Crieteria For Addressbook */ @@ -2723,7 +2722,7 @@ SE.addressBook = { document.getElementById('input_searchField').value = ""; document.getElementById('input_searchPerson').selectedIndex = 0; }, - + /** * Opens modal select window to add contacts to addressbook */ @@ -2739,7 +2738,7 @@ SE.addressBook = { {text: app_strings.LBL_EMAIL_ADDRESS_BOOK_CLEAR, isDefault: true, handler: this.clearAllEmailAddressFieldsFromResultTable} ] }); dlg.setHeader(app_strings.LBL_EMAIL_ADDRESS_BOOK_SELECT_TITLE); - + var body = SUGAR.util.getAndRemove("contactsDialogueHTML"); dlg.setBody(body.innerHTML); dlg.renderEvent.subscribe(function() { @@ -2748,19 +2747,19 @@ SE.addressBook = { this.body.style.width = "950px"; } }, dlg); - - - dlg.beforeRenderEvent.subscribe(function() { - var dd = new YAHOO.util.DDProxy(dlg.element); - dd.setHandleElId(dlg.header); - dd.on('endDragEvent', function() { - dlg.show(); - }); - }, dlg, true); + + + dlg.beforeRenderEvent.subscribe(function() { + var dd = new YAHOO.util.DDProxy(dlg.element); + dd.setHandleElId(dlg.header); + dd.on('endDragEvent', function() { + dlg.show(); + }); + }, dlg, true); dlg.render(); - + var tp = new YAHOO.widget.TabView("contactsSearchTabs"); - + var tabContent = SUGAR.util.getAndRemove("searchForm"); tp.addTab(new YAHOO.widget.Tab({ label: app_strings.LBL_EMAIL_ADDRESS_BOOK_TITLE, @@ -2769,7 +2768,7 @@ SE.addressBook = { id : "addressSearchTab", active : true })); - + var addListenerFields = ['input_searchPerson','input_searchField' ] YAHOO.util.Event.addListener(addListenerFields,"keydown", function(e){ if (e.keyCode == 13) { @@ -2790,7 +2789,7 @@ SE.addressBook = { var idx = activePanel.substring(10); } SE.addressBook.idx = idx; - + var relatedBeanId; if ((hasRelatedBeanId = document.getElementById('data_parent_id' + idx).value) != '') { document.getElementById('relatedBeanColumn').style.display = ''; @@ -2803,15 +2802,15 @@ SE.addressBook = { document.getElementById('relatedBeanColumn').style.display = 'none'; document.getElementById('hasRelatedBean').checked = false; } - - if (!SE.addressBook.grid) + + if (!SE.addressBook.grid) { if (hasRelatedBeanId) { document.getElementById('hasRelatedBean').checked = true; } AddressSearchGridInit(); SE.addressBook.relatedBeanId = relatedBeanId; - } + } else { if (typeof(relatedBeanId) != 'undefined' && relatedBeanId != SE.addressBook.relatedBeanId) @@ -2831,12 +2830,12 @@ SE.addressBook = { SE.addressBook.addressBookDataModel.params['person'] = document.getElementById('input_searchPerson').value; SE.addressBook.grid.getDataSource().sendRequest(SUGAR.util.paramsToUrl(SE.addressBook.addressBookDataModel.params), SE.addressBook.grid.onDataReturnInitializeTable, SE.addressBook.grid); } - + //Remove any lingering rows in the result set table if the module was closed. SE.addressBook.gridResults.deleteRows(0, SUGAR.email2.addressBook.gridResults.getRecordSet().getLength()); //Repopulate SE.addressBook.populateResulstTableEmailAddresses(); - + this.contactsDialogue.show(); }, /** @@ -2850,23 +2849,23 @@ SE.addressBook = { SUGAR.email2.addressBook.grid.reSelectRowsOnRender(); }, /** - * Take all email address listed in the compose tab To|Cc|Bcc fields and re-populates the + * Take all email address listed in the compose tab To|Cc|Bcc fields and re-populates the * results table. This function is called when the address book is displayed. */ populateResulstTableEmailAddresses: function () { - + var idx = SE.addressBook.idx; var emailFields = ['to','cc','bcc']; - + for(var k=0;k'; if(t_name == '') t_name = displayEmail = t_emailAddr; - + var addressType = SE.addressBook.translateAddresType(emailFields[k],true); SUGAR.email2.addressBook.gridResults.addRow({'type':addressType,'name':t_name,'email_address': t_emailAddr, 'display_email_address': displayEmail,'bean_id': -1,'idx' : SE.addressBook.idx}); } - } + } }, - + /** * Checks all entries in the result table against a particular email address, returning true * if the email address is found, false otherwise. @@ -2889,57 +2888,57 @@ SE.addressBook = { doesEmailAdddressExistInResultTable: function(emailAddress) { if(trim(emailAddress) == '') - return false; - + return false; + var emailAddressFound = false; var contacts = SE.addressBook.gridResults.getRecordSet().getRecords(); - for (var i=0; i < contacts.length; i++) + for (var i=0; i < contacts.length; i++) { var data = SE.addressBook.gridResults.getRecord(contacts[i]).getData(); //If we are adding to cc or bcc fields, make them visible. - if(data.email_address == emailAddress) + if(data.email_address == emailAddress) { emailAddressFound = true; break; } } - + return emailAddressFound; }, /** - * Takes all email addresses that the users wishes to add from the address book and populates the To - * fields on the compose tab. + * Takes all email addresses that the users wishes to add from the address book and populates the To + * fields on the compose tab. */ populateEmailAddressFieldsFromResultTable: function() { //Clear the fields first, all email addresses are stored in the address book var idx = SE.addressBook.idx; - var emailFields = ['to','cc','bcc']; + var emailFields = ['to','cc','bcc']; for(var k=0;k/gi, '') + " <" + primary + ">"; //ret[ret.length] = contacts[id].name + " <" + primary + ">"; - + for(var emailIndex in contacts[id].email) { ret[ret.length] = contacts[id].email[emailIndex].email_address; } @@ -3267,7 +3266,7 @@ SE.composeLayout = { var linkElement = document.getElementById("More"+e.id); var spanElement = document.getElementById("Detail"+e.id); var emailAddressList = e.value; - if(e.value.length > 96) + if(e.value.length > 96) { var resultArray = SE.composeLayout._getEmailArrayFromString(emailAddressList); var displayArray = []; @@ -3278,19 +3277,19 @@ SE.composeLayout = { if(t_name == '') displayArray.push('
<' + t_emailAddr + '>'); else - displayArray.push(t_name + '
<' + t_emailAddr + '>'); + displayArray.push(t_name + '
<' + t_emailAddr + '>'); } - + var result = displayArray.join('
'); // Display linkElement.style.display = "inline"; linkElement.style.height="10px"; linkElement.style.overflow="visible"; spanElement.innerHTML = result; - } - else + } + else linkElement.style.display = "none"; - + }, /** @@ -3298,9 +3297,9 @@ SE.composeLayout = { * and email portion. */ _getEmailArrayFromString : function (emailAddressList){ - + var reg = /@.*?;/g; - while ((results = reg.exec(emailAddressList)) != null) + while ((results = reg.exec(emailAddressList)) != null) { orignial = results[0]; parsedResult = results[0].replace(';', ':::::'); @@ -3308,7 +3307,7 @@ SE.composeLayout = { } reg = /@.*?,/g; - while ((results = reg.exec(emailAddressList)) != null) + while ((results = reg.exec(emailAddressList)) != null) { orignial = results[0]; parsedResult = results[0].replace(',', ':::::'); @@ -3318,7 +3317,7 @@ SE.composeLayout = { var emailArr = emailAddressList.split(":::::"); var resultsArray = []; var newArr = []; - for (var i=0; i'); @@ -3337,7 +3336,7 @@ SE.composeLayout = { } } } - return resultsArray; + return resultsArray; }, /////////////////////////////////////////////////////////////////////////// //// COMPOSE FLOW @@ -3356,17 +3355,17 @@ SE.composeLayout = { active : true }, SE.innerLayout); SE.innerLayout.addTab(composeTab); - + // get template engine with template if (!SE.composeLayout.composeTemplate) { SE.composeLayout.composeTemplate = new YAHOO.SUGAR.Template(SE.templates['compose']); } - + // create Tab inner layout var composePanel = this.getComposeLayout(); composePanel.getUnitByPosition("right").collapse(); composePanel.autoSize(); - + }, /** * Generate the quick compose layout @@ -3380,7 +3379,7 @@ SE.composeLayout = { //Before rendering the parent pannel we need to initalize the grid layout parentPanel.beforeRenderEvent.subscribe(function() { - + YAHOO.util.Event.onAvailable('htmleditordiv' + idx, function() { SE.composeLayout._createComposeLayout(idx); SE.composeLayout[idx].set('height', 350); @@ -3388,10 +3387,10 @@ SE.composeLayout = { }); }); - //Wait until the Compose Layout has rendered, then add the + //Wait until the Compose Layout has rendered, then add the //options tab and perform the tiny initialization. parentPanel.renderEvent.subscribe(function() { - + YAHOO.util.Event.onAvailable('htmleditordiv' + idx, function() { SE.composeLayout._initComposeOptionTabs(idx); SE.composeLayout[idx].getUnitByPosition("right").collapse(); @@ -3401,18 +3400,18 @@ SE.composeLayout = { //Init templates and address book SE.composeLayout._2_final(); - SE.composeLayout.quickCreateComposePackage(o); + SE.composeLayout.quickCreateComposePackage(o); }); }); - + //Check if we have the div override for the shortcut bar if(typeof o.menu_id != 'undefined') { - parentPanel.render(o.menu_id); + parentPanel.render(o.menu_id); } else { - parentPanel.render(document.body); + parentPanel.render(document.body); } - + return SE.composeLayout[idx]; }, /** @@ -3434,14 +3433,14 @@ SE.composeLayout = { }, getComposeLayout : function() { var idx = SE.composeLayout.currentInstanceId; - - this._createComposeLayout(idx); + + this._createComposeLayout(idx); SE.composeLayout[idx].render(); this._initComposeOptionTabs(idx); - + return SE.composeLayout[idx]; }, - + /** * Create the layout manager for the compose window. */ @@ -3457,7 +3456,7 @@ SE.composeLayout = { animate: false, scroll: false, split:true, - body: + body: SE.composeLayout.composeTemplate.exec({ 'app_strings':app_strings, 'mod_strings':mod_strings, @@ -3481,24 +3480,24 @@ SE.composeLayout = { }] }); }, - + /** * Create compose tab which will populate the 'right' container in the compose window. */ - _initComposeOptionTabs : function(idx) + _initComposeOptionTabs : function(idx) { var cTabs = new YAHOO.widget.TabView("composeRightTabs" + idx); - var tab = new YAHOO.widget.Tab({ + var tab = new YAHOO.widget.Tab({ label: app_strings.LBL_EMAIL_ATTACHMENT, scroll : true, content : SUGAR.util.getAndRemove("divAttachments" + idx).innerHTML, id : "divAttachments" + idx, active : true }); - + tab.layout = SE.composeLayout[idx]; - tab.on("activeChange", function(o){ + tab.on("activeChange", function(o){ if (o.newValue) { this.layout.getUnitByPosition("right").set("header", app_strings.LBL_EMAIL_ATTACHMENT); } @@ -3506,28 +3505,28 @@ SE.composeLayout = { cTabs.addTab(tab); - tab = new YAHOO.widget.Tab({ + tab = new YAHOO.widget.Tab({ label: app_strings.LBL_EMAIL_OPTIONS, scroll : true, content : SUGAR.util.getAndRemove("divOptions" + idx).innerHTML, id : "divOptions" + idx, active : false }); - + tab.layout = SE.composeLayout[idx]; - tab.on("activeChange", function(o){ + tab.on("activeChange", function(o){ if (o.newValue) { this.layout.getUnitByPosition("right").set("header", app_strings.LBL_EMAIL_OPTIONS); } }); cTabs.addTab(tab); - + SE.composeLayout[idx].autoSize = function() { var pEl = this.get("element").parentNode.parentNode.parentNode; this.set("height", pEl.clientHeight-30); this.render(); } - + SE.composeLayout[idx].rightTabs = cTabs; }, isParentTypeValid : function(idx) { @@ -3539,12 +3538,12 @@ SE.composeLayout = { } // if return true; }, - + isParentTypeAndNameValid : function(idx) { var parentTypeValue = document.getElementById('data_parent_type' + idx).value; var parentNameValue = document.getElementById('data_parent_name' + idx).value; var parentIdValue = document.getElementById('data_parent_id' + idx).value; - if ((trim(parentTypeValue) != "" && trim(parentNameValue) == "") || + if ((trim(parentTypeValue) != "" && trim(parentNameValue) == "") || (trim(parentTypeValue) != "" && trim(parentNameValue) != "" && parentIdValue == "")){ alert(mod_strings.LBL_ERROR_SELECT_MODULE_SELECT); return false; @@ -3553,12 +3552,12 @@ SE.composeLayout = { }, callopenpopupForEmail2 : function(idx,options) { - + var formName = 'emailCompose' + idx; - + if(typeof(options) != 'undefined' && typeof(options.form_name) != 'undefined') - formName = options.form_name; - + formName = options.form_name; + var parentTypeValue = document.getElementById('data_parent_type' + idx).value; var parentNameValue = document.getElementById('data_parent_name' + idx).value; if (!SE.composeLayout.isParentTypeValid(idx)) { @@ -3572,14 +3571,14 @@ SE.composeLayout = { id:'data_parent_id' + idx, name:'data_parent_name' + idx, email1:'email1'} - }); - }, - + }); + }, + popupAddEmail : function(o) { var nameKey = "data_parent_name" + SE.composeLayout.currentInstanceId; var data = o.name_to_value_array; - if (typeof (data[nameKey]) != "undefined" && data[nameKey] != "" + if (typeof (data[nameKey]) != "undefined" && data[nameKey] != "" && typeof (data["email1"]) != "undefined" && data["email1"] != "" && data["email1"] != "undefined") { var target = Dom.get("addressTO" + SE.composeLayout.currentInstanceId); @@ -3605,14 +3604,14 @@ SE.composeLayout = { }, this); } }, - + resizeEditor : function(idx) { var cof = Dom.get('composeOverFrame' + idx); var head = Dom.get('composeHeaderTable' + idx); var targetHeight = cof.clientHeight - head.clientHeight; - var instance = tinyMCE.get(SE.tinyInstances.currentHtmleditor); - + var instance = tinyMCE.get(SE.tinyInstances.currentHtmleditor); + var parentEl = Dom.get(instance.editorId + '_parent'); var toolbar = Dom.getElementsByClassName("mceFirst", "tr", parentEl)[0]; var contentEl = instance.contentAreaContainer; @@ -3668,7 +3667,7 @@ SE.composeLayout = { } else { this._1_tiny(); this._2_final(); - + if(isReplyForward) { this.replyForwardEmailStage2(); } @@ -3746,7 +3745,7 @@ SE.composeLayout = { target = document.getElementById(target); nodes = data; } - + if (target.id.indexOf('address') > -1) { // dropped onto email to/cc/bcc field for(var i in nodes) { @@ -3767,7 +3766,7 @@ SE.composeLayout = { var finalName = name.replace(/(<([^>]+)>)/ig, ""); email = finalName + email; } - target.value = SE.addressBook.smartAddEmailAddressToComposeField(target.value, email); + target.value = SE.addressBook.smartAddEmailAddressToComposeField(target.value, email); } } }, @@ -3777,12 +3776,12 @@ SE.composeLayout = { /// EMAIL TEMPLATE CODE */ applyEmailTemplate : function (idx, id) { - + //bug #20680 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; - + // id is selected index of email template drop-down if(id == '' || id == "0") { YAHOO.SUGAR.MessageBox.show({ @@ -3790,14 +3789,14 @@ SE.composeLayout = { msg: box_none_msg, type: 'confirm', fn: function(btn){ - if(btn=='no'){return;}; + if(btn=='no'){return;}; SUGAR.email2.composeLayout.processNoneResult(idx, id);}, modal:true, scope:this }); return; - } - + } + YAHOO.SUGAR.MessageBox.show({ title:box_title, msg: box_msg, @@ -3809,7 +3808,7 @@ SE.composeLayout = { scope:this }); }, - + processNoneResult : function(idx, id) { var tiny = SE.util.getTiny('htmleditor' + idx); var tinyHTML = tiny.getContent(); @@ -3821,9 +3820,9 @@ SE.composeLayout = { tiny.setContent(tinyHTML); } else { tiny.setContent(''); - } + } }, - + processResult : function(idx , id){ call_json_method('EmailTemplates','retrieve','record='+id,'email_template_object', this.appendEmailTemplateJSON); @@ -3876,20 +3875,20 @@ SE.composeLayout = { setTimeout("SE.composeLayout.setSignature(" + idx + ");", 1000); return; } - + if(idx) { var sel = document.getElementById('signatures' + idx); } else { var sel = document.getElementById('signature_id'); idx = SE.tinyInstances.currentHtmleditor; } - + //Ensure that the tinyMCE html has been rendered. if(typeof(SE.composeLayout.loadedTinyInstances[idx]) != 'undefined' && SE.composeLayout.loadedTinyInstances[idx] == false) { setTimeout("SE.composeLayout.setSignature(" + idx + ");",1000); return; } - + var signature = ''; try { @@ -3909,7 +3908,7 @@ SE.composeLayout = { } else var html = ''; - + var htmllow = html.toLowerCase(); var start = htmllow.indexOf(openTag); var end = htmllow.indexOf(closeTag) + closeTag.length; @@ -3919,7 +3918,7 @@ SE.composeLayout = { if (start > -1) { var htmlPart1 = html.substr(0, start); var htmlPart2 = html.substr(end, html.length); - + html = htmlPart1 + htmlPart2; t.setContent(html); } @@ -3948,7 +3947,7 @@ SE.composeLayout = { html = htmlPart1 + htmlPart2; } - + // [pre|ap]pend start = html.indexOf('

'); if(SE.userPrefs.signatures.signature_prepend == 'true' && start > -1) { @@ -4018,7 +4017,7 @@ SE.composeLayout = { index++; test = document.getElementById('documentId' + idx + index); } - + var documentCup = document.createElement("div"); documentCup.id = 'documentCup' + idx + index; documentCup.innerHTML = "" + @@ -4027,15 +4026,15 @@ SE.composeLayout = { // document name field "" + // select button - "" + // remove button - "" + + "" + "
"; - + basket.appendChild(documentCup); //basket.innerHTML += out; return index; @@ -4054,7 +4053,7 @@ SE.composeLayout = { windowName = 'selectDocument'; windowFeatures = 'width=800' + ',height=600' + ',resizable=1,scrollbars=1'; - win = window.open(URL, windowName, windowFeatures); + win = SUGAR.util.openWindow(URL, windowName, windowFeatures); if(window.focus) { // put the focus on the popup if the browser supports the focus() method win.focus(); @@ -4072,7 +4071,7 @@ SE.composeLayout = { fixedcenter:true, constraintoviewport: true, scroll: true, - keylisteners : new YAHOO.util.KeyListener(document, { keys:27 }, { + keylisteners : new YAHOO.util.KeyListener(document, { keys:27 }, { fn:function(){SE.addFileDialog.hide();} }) }); @@ -4081,7 +4080,7 @@ SE.composeLayout = { // SE.addFileDialog.addKeyListener(27, , SE.addFileDialog); } Dom.removeClass("addFileDialog", "yui-hidden"); - + SE.addFileDialog.show(); }, @@ -4175,9 +4174,9 @@ SE.composeLayout = { } var out = "
" + - // remove button + // remove button "" + // file icon "" + @@ -4186,12 +4185,12 @@ SE.composeLayout = { // docId field "" + // file name - " " + - "

" + + " " + + "

" + "
"; basket.innerHTML = basket.innerHTML + out; - + return index; }, @@ -4201,17 +4200,17 @@ SE.composeLayout = { * @param bool isDraft */ sendEmail : function(idx, isDraft) { - + //If the outbound account has an error message associate with it, alert the user and refuse to continue. var obAccountID = document.getElementById('addressFrom' + idx).value; - + if( typeof(SUGAR.email2.composeLayout.outboundAccountErrors[obAccountID]) != 'undefined' ) { overlay(app_strings.LBL_EMAIL_ERROR_DESC, SUGAR.email2.composeLayout.outboundAccountErrors[obAccountID], 'alert'); return false; } - - + + var form = document.getElementById('emailCompose' + idx); var composeOptionsFormName = "composeOptionsForm" + idx; var t = SE.util.getTiny(SE.tinyInstances.currentHtmleditor); @@ -4224,16 +4223,16 @@ SE.composeLayout = { var composeType = document.getElementById('composeType').value; var parent_type = document.getElementById("parent_type").value; var parent_id = document.getElementById("parent_id").value; - + var el_uid = document.getElementById("uid"); var uid = (el_uid == null) ? '' : el_uid.value; - + var el_ieId = document.getElementById("ieId"); var ieId = (el_ieId == null) ? '' : el_ieId.value; - + var el_mbox = document.getElementById("mbox"); var mbox = (el_mbox == null) ? '' : el_mbox.value; - + if (!isValidEmail(to) || !isValidEmail(cc) || !isValidEmail(bcc)) { alert(app_strings.LBL_EMAIL_COMPOSE_INVALID_ADDRESS); return false; @@ -4261,7 +4260,7 @@ SE.composeLayout = { } } else if(html == '' && !isDraft) { if(!confirm(app_strings.LBL_EMAIL_COMPOSE_NO_BODY)) { - return false; + return false; } } @@ -4269,9 +4268,9 @@ SE.composeLayout = { document.getElementById('data_parent_id' + idx).value = parentIdValue; var title = (isDraft) ? app_strings.LBL_EMAIL_SAVE_DRAFT : app_strings.LBL_EMAIL_SENDING_EMAIL; overlay(title, app_strings.LBL_EMAIL_ONE_MOMENT); - html = html.replace(/</ig, "sugarLessThan"); + html = html.replace(/</ig, "sugarLessThan"); html = html.replace(/>/ig, "sugarGreaterThan"); - + form.sendDescription.value = html; form.sendSubject.value = subj; form.sendTo.value = to; @@ -4370,15 +4369,15 @@ SE.composeLayout = { composePackage : function() { if(composePackage != null) { SE.composeLayout.c0_composeNewEmail(); - - + + if(composePackage.to_email_addrs) { document.getElementById("addressTO" + SE.composeLayout.currentInstanceId).value = composePackage.to_email_addrs; } // if if (composePackage.subject != null && composePackage.subject.length > 0) { document.getElementById("emailSubject" + SE.composeLayout.currentInstanceId).value = composePackage.subject; } - + //If no parent fields are set in the composePackage, ensure they are cleared. var parentFields = ['parent_type','parent_name','parent_id']; for(var i=0;i 0) { document.getElementById("email_id" + SE.composeLayout.currentInstanceId).value = composePackage.email_id; } // if @@ -4402,9 +4401,9 @@ SE.composeLayout = { setTimeout("SE.composeLayout.setContentOnThisTiny();", 3000); } // if if (composePackage.attachments != null) { - SE.composeLayout.loadAttachments(composePackage.attachments); + SE.composeLayout.loadAttachments(composePackage.attachments); } // if - + if (composePackage.fromAccounts != null && composePackage.fromAccounts.status) { var addressFrom = document.getElementById('addressFrom' + SE.composeLayout.currentInstanceId); SE.util.emptySelectOptions(addressFrom); @@ -4417,8 +4416,8 @@ SE.composeLayout = { opt.selected = true; } addressFrom.options.add(opt); - } - + } + } // if } // if }, @@ -4435,8 +4434,8 @@ SE.composeLayout = { if (typeof(composePackage.clearBody) != 'undefined' && composePackage.clearBody) SE.composeLayout.tinyHTML = ''; else - SE.composeLayout.tinyHTML = tinyHTML + composePackage.body; - + SE.composeLayout.tinyHTML = tinyHTML + composePackage.body; + tiny.setContent(SE.composeLayout.tinyHTML); //Indicate that the contents has been loaded successfully. SE.composeLayout.loadedTinyInstances[SE.composeLayout.currentInstanceId] = true; @@ -4458,7 +4457,7 @@ SE.composeLayout = { */ forceCloseCompose : function(id) { SE.composeLayout.closeCompose(id); - + // handle flow back to originating view if(composePackage) { // check if it's a module we need to return to @@ -4499,11 +4498,11 @@ SE.composeLayout = { * Enable the quick search for the compose relate field or search tab */ enableQuickSearchRelate: function(idx,overides){ - + if(typeof overides != 'undefined') { var newModuleID = overides['moduleSelectField']; //data_parent_type_search - var newModule = document.getElementById(newModuleID).value; + var newModule = document.getElementById(newModuleID).value; var formName = overides['formName']; var fieldName = overides['fieldName']; var fieldId = overides['fieldId']; @@ -4519,10 +4518,10 @@ SE.composeLayout = { var fullName = formName + "_" + fieldName; var postBlurFunction = "SE.composeLayout.qsAddAddress"; } - + if(typeof sqs_objects == 'undefined') window['sqs_objects'] = new Array; - + window['sqs_objects'][fullName] = { form:formName, method:"query", @@ -4532,8 +4531,8 @@ SE.composeLayout = { conditions:[{name:"name",op:"like_custom",end:"%",value:""}], post_onblur_function: postBlurFunction, order:"name","limit":"30","no_match_text":"No Match"}; - - + + if(typeof QSProcessedFieldsArray != 'undefined') QSProcessedFieldsArray[fullName] = false; if (typeof(QSFieldsArray) != 'undefined' && typeof(QSFieldsArray[fullName]) != 'undefined') { @@ -4543,10 +4542,10 @@ SE.composeLayout = { if (Dom.get(fullName + "_results")) { Dom.get(fullName + "_results").parentNode.removeChild(Dom.get(fullName + "_results")); } - + enableQS(false); }, - + qsAddAddress : function(o) { if (o.name != "" && o.email1 != "") { @@ -4595,7 +4594,7 @@ SE.composeLayout = { setComposeOptions : function(idx) { // send from accounts var addressFrom = document.getElementById('addressFrom' + idx); - + if (addressFrom.options.length <= 0) { SE.util.emptySelectOptions(addressFrom); var fromAccountOpts = SE.composeLayout.fromAccounts; @@ -4675,7 +4674,7 @@ SE.composeLayout = { var sendType = type; AjaxObject.startRequest(callbackReplyForward, urlStandard + "&composeType=" + type + sugarEmail); }, - + /** * Show the hidden cc or bcc fields */ @@ -4685,22 +4684,22 @@ SE.composeLayout = { Dom.addClass(addrType+"_span"+idx, "yui-hidden"); Dom.addClass("bcc_cc_sep"+idx, "yui-hidden"); this[addrType+'Hidden'+idx] = false; - + //After bcc or cc is added, move options below last addr field Dom.insertAfter("add_addr_options_tr"+idx, 'bcc_tr'+idx); - + //If both cc and bcc hidden, remove the empty row containing text. if( ( typeof(this['ccHidden'+idx]) != 'undefined' && typeof(this['bccHidden'+idx]) != 'undefined') && ( this['ccHidden'+idx] == false && this['bccHidden'+idx] == false) ) - Dom.addClass("add_addr_options_tr"+idx, "yui-hidden"); - + Dom.addClass("add_addr_options_tr"+idx, "yui-hidden"); + SE.composeLayout.resizeEditor(idx); }, /** * Hide the cc and bcc fields if they were shown. */ hideHiddenAddresses: function(idx){ - + var addrTypes = ['cc','bcc']; for(var i = 0;i element to an Ext.form.combobox */ @@ -4893,19 +4892,19 @@ SE.util = { select = document.getElementById(select); } }, - + findChildNode : function (parent, property, value) { for (i in parent.children) { var child = parent.children[i]; if (child.data[property] && child.data[property] == value || child[property] && child[property] == value) return child; var searchChild = SE.util.findChildNode(child, property, value); - if (searchChild) + if (searchChild) return searchChild; } return false; }, - + cascadeNodes : function (parent, fn, scope, args) { for (i in parent.children) { var child = parent.children[i]; diff --git a/include/language/en_us.lang.php b/include/language/en_us.lang.php index 587b505d..ae40947d 100644 --- a/include/language/en_us.lang.php +++ b/include/language/en_us.lang.php @@ -1542,6 +1542,7 @@ $app_strings = array ( 'LBL_CASE'=>'Case', 'LBL_CASES'=>'Cases', 'LBL_CHANGE_BUTTON_KEY' => 'G', + 'LBL_CHANGE_PASSWORD' => 'Change password', 'LBL_CHANGE_BUTTON_LABEL' => 'Change', 'LBL_CHANGE_BUTTON_TITLE' => 'Change [Alt+G]', 'LBL_CHARSET' => 'UTF-8', @@ -1870,7 +1871,7 @@ $app_strings = array ( 'NTC_DATE_TIME_FORMAT' => '(yyyy-mm-dd 24:00)', 'NTC_DELETE_CONFIRMATION_MULTIPLE' => 'Are you sure you want to delete selected record(s)?', 'NTC_TEMPLATE_IS_USED' => 'The template is used in at least one email marketing record. Are you sure you want to delete it?', - 'NTC_TEMPLATES_IS_USED' => "The following templates are used in email marketing records. Are you sure you want to delete them?\n", + 'NTC_TEMPLATES_IS_USED' => "The following templates are used in email marketing records. Are you sure you want to delete them?\n", 'NTC_DELETE_CONFIRMATION' => 'Are you sure you want to delete this record?', 'NTC_DELETE_CONFIRMATION_NUM' => 'Are you sure you want to delete the ', 'NTC_UPDATE_CONFIRMATION_NUM' => 'Are you sure you want to update the ', diff --git a/include/utils.php b/include/utils.php index 78d4060f..0f2e0bf9 100644 --- a/include/utils.php +++ b/include/utils.php @@ -687,13 +687,13 @@ function safe_map_named($request_var, & $focus, $member_var, $always_copy) } } -/** +/** * This function retrieves an application language file and returns the array of strings included in the $app_list_strings var. - * + * * @param string $language specific language to load * @return array lang strings */ -function return_app_list_strings_language($language) +function return_app_list_strings_language($language) { global $app_list_strings; global $sugar_config; @@ -709,7 +709,7 @@ function return_app_list_strings_language($language) $default_language = $sugar_config['default_language']; $temp_app_list_strings = $app_list_strings; - + $langs = array(); if ($language != 'en_us') { $langs[] = 'en_us'; @@ -718,9 +718,9 @@ function return_app_list_strings_language($language) $langs[] = $default_language; } $langs[] = $language; - + $app_list_strings_array = array(); - + foreach ( $langs as $lang ) { $app_list_strings = array(); if(file_exists("include/language/$lang.lang.php")) { @@ -742,7 +742,7 @@ function return_app_list_strings_language($language) $app_list_strings = array(); foreach ( $app_list_strings_array as $app_list_strings_item ) { $app_list_strings = sugarArrayMerge($app_list_strings, $app_list_strings_item); - } + } foreach ( $langs as $lang ) { if(file_exists("custom/application/Ext/Language/$lang.lang.ext.php")) { @@ -796,13 +796,13 @@ function _mergeCustomAppListStrings($file , $app_list_strings){ return $app_list_strings; } -/** +/** * This function retrieves an application language file and returns the array of strings included. - * + * * @param string $language specific language to load * @return array lang strings */ -function return_application_language($language) +function return_application_language($language) { global $app_strings, $sugar_config; @@ -826,9 +826,9 @@ function return_application_language($language) $langs[] = $default_language; } $langs[] = $language; - + $app_strings_array = array(); - + foreach ( $langs as $lang ) { $app_strings = array(); if(file_exists("include/language/$lang.lang.php")) { @@ -858,7 +858,7 @@ function return_application_language($language) foreach ( $app_strings_array as $app_strings_item ) { $app_strings = sugarArrayMerge($app_strings, $app_strings_item); } - + if(!isset($app_strings)) { $GLOBALS['log']->fatal("Unable to load the application language strings"); return null; @@ -883,19 +883,19 @@ function return_application_language($language) $app_strings = $temp_app_strings; sugar_cache_put($cache_key, $return_value); - + return $return_value; } -/** +/** * This function retrieves a module's language file and returns the array of strings included. - * + * * @param string $language specific language to load * @param string $module module name to load strings for * @param bool $refresh optional, true if you want to rebuild the language strings * @return array lang strings */ -function return_module_language($language, $module, $refresh=false) +function return_module_language($language, $module, $refresh=false) { global $mod_strings; global $sugar_config; @@ -937,7 +937,7 @@ function return_module_language($language, $module, $refresh=false) LanguageManager::loadModuleLanguage($module, $sugar_config['default_language'],$refresh), $loaded_mod_strings ); - + // Load in en_us strings by default if($language != 'en_us' && $sugar_config['default_language'] != 'en_us') $loaded_mod_strings = sugarArrayMerge( @@ -1643,6 +1643,23 @@ function getDefaultXssTags() { return $ret; } +/** + * Remove potential xss vectors from strings + * @param string str String to search for XSS attack vectors + * @param bool cleanImg Flag to allow tags to survive - only used by InboundEmail for inline images. + * @return string + */ +function remove_xss($str, $cleanImg=true) +{ + $potentials = clean_xss($str, $cleanImg); + if(is_array($potentials) && !empty($potentials)) { + foreach($potentials as $bad) { + $str = str_replace($bad, "", $str); + } + } + return $str; +} + /** * Detects typical XSS attack patterns * @param string str String to search for XSS attack vectors @@ -1670,12 +1687,12 @@ function clean_xss($str, $cleanImg=true) { // cn: bug 13079 - "on\w" matched too many non-events (cONTact, strONG, etc.) $jsEvents = "onblur|onfocus|oncontextmenu|onresize|onscroll|onunload|ondblclick|onclick|"; $jsEvents .= "onmouseup|onmouseover|onmousedown|onmouseenter|onmouseleave|onmousemove|onload|onchange|"; - $jsEvents .= "onreset|onselect|onsubmit|onkeydown|onkeypress|onkeyup|onabort|onerror"; + $jsEvents .= "onreset|onselect|onsubmit|onkeydown|onkeypress|onkeyup|onabort|onerror|ondragdrop"; - $attribute_regex = "#<[^/>][^>]+({$jsEvents}\w+)[^=>]*=[^>]*>#sim"; + $attribute_regex = "#<[^/>][^>]+({$jsEvents})[^=>]*=[^>]*>#sim"; $javascript_regex = '@<[^/>][^>]+(expression\(|j\W*a\W*v\W*a|v\W*b\W*s\W*c\W*r|&#|/\*|\*/)[^>]*>@sim'; $imgsrc_regex = '#<[^>]+src[^=]*=([^>]*?http://[^>]*)>#sim'; - $css_url = "#url\(.*\.\w+\)#"; + $css_url = '#url\(.*\.\w+\)#'; $str = str_replace("\t", "", $str); @@ -1735,16 +1752,16 @@ function clean_string($str, $filter = "STANDARD") { global $sugar_config; $filters = Array( - "STANDARD" => "#[^A-Z0-9\-_\.\@]#i", - "STANDARDSPACE" => "#[^A-Z0-9\-_\.\@\ ]#i", - "FILE" => "#[^A-Z0-9\-_\.]#i", - "NUMBER" => "#[^0-9\-]#i", - "SQL_COLUMN_LIST" => "#[^A-Z0-9,_\.]#i", - "PATH_NO_URL" => "#://#i", - "SAFED_GET" => "#[^A-Z0-9\@\=\&\?\.\/\-_~]#i", /* range of allowed characters in a GET string */ + "STANDARD" => '#[^A-Z0-9\-_\.\@]#i', + "STANDARDSPACE" => '#[^A-Z0-9\-_\.\@\ ]#i', + "FILE" => '#[^A-Z0-9\-_\.]#i', + "NUMBER" => '#[^0-9\-]#i', + "SQL_COLUMN_LIST" => '#[^A-Z0-9,_\.]#i', + "PATH_NO_URL" => '#://#i', + "SAFED_GET" => '#[^A-Z0-9\@\=\&\?\.\/\-_~]#i', /* range of allowed characters in a GET string */ "UNIFIED_SEARCH" => "#[\\x00]#", /* cn: bug 3356 & 9236 - MBCS search strings */ - "AUTO_INCREMENT" => "#[^0-9\-,\ ]#i", - "ALPHANUM" => "#[^A-Z0-9\-]#i", + "AUTO_INCREMENT" => '#[^0-9\-,\ ]#i', + "ALPHANUM" => '#[^A-Z0-9\-]#i', ); if (preg_match($filters[$filter], $str)) { @@ -2604,24 +2621,24 @@ function sugar_cleanup($exit = false) { } //check to see if this is not an ajax call AND the user preference error flag is set - if( + if( (isset($_SESSION['USER_PREFRENCE_ERRORS']) && $_SESSION['USER_PREFRENCE_ERRORS']) - && ($_REQUEST['action']!='modulelistmenu' && $_REQUEST['action']!='DynamicAction') - && (empty($_REQUEST['to_pdf']) || !$_REQUEST['to_pdf'] ) - && (empty($_REQUEST['sugar_body_only']) || !$_REQUEST['sugar_body_only'] ) - + && ($_REQUEST['action']!='modulelistmenu' && $_REQUEST['action']!='DynamicAction') + && (empty($_REQUEST['to_pdf']) || !$_REQUEST['to_pdf'] ) + && (empty($_REQUEST['sugar_body_only']) || !$_REQUEST['sugar_body_only'] ) + ){ global $app_strings; //this is not an ajax call and the user preference error flag is set, so reset the flag and print js to flash message $err_mess = $app_strings['ERROR_USER_PREFS']; $_SESSION['USER_PREFRENCE_ERRORS'] = false; - echo " + echo " "; - - } - + "; + + } + pre_login_check(); if(class_exists('DBManagerFactory')) { $db = DBManagerFactory::getInstance(); @@ -4152,4 +4169,89 @@ function sugar_microtime() $unique_id = $now[1].str_replace('.', '', $now[0]); return $unique_id; } -?> + +/** + * Extract urls from a piece of text + * @param $string + * @return array of urls found in $string + */ +function getUrls($string) +{ + $lines = explode("
", trim($string)); + $urls = array(); + foreach($lines as $line){ + $regex = '/http?\:\/\/[^\" ]+/i'; + preg_match_all($regex, $line, $matches); + foreach($matches[0] as $match){ + $urls[] = $match; + } + } + return $urls; +} + + +/** + * Sanitize image file from hostile content + * @param string $path Image file + * @param bool $jpeg Recode as JPEG (false - recode as PNG) + */ +function verify_image_file($path, $jpeg = false) +{ + if(function_exists('imagepng') && function_exists('imagejpeg') && function_exists('imagecreatefromstring')) { + $img = imagecreatefromstring(file_get_contents($path)); + if(!$img) { + return false; + } + if($jpeg) { + if(imagejpeg($img, $path)) { + return true; + } + } else { + imagealphablending($img, true); + imagesavealpha($img, true); + if(imagepng($img, $path)) { + return true; + } + } + } else { + // check image manually + $fp = fopen($path, "r"); + if(!$fp) return false; + $data = fread($fp, 4096); + fclose($fp); + if(preg_match("/<(html|!doctype|script|body|head|plaintext|table|img |pre(>| )|frameset|iframe|object|link|base|style|font|applet|meta|center|form|isindex)/i", + $data, $m)) { + $GLOBALS['log']->info("Found {$m[0]} in $path, not allowing upload"); + return false; + } + return true; + } + return false; +} + +/** + * Verify uploaded image + * Verifies that image has proper extension, MIME type and doesn't contain hostile contant + * @param string $path Image path + * @param bool $jpeg_only Accept only JPEGs? + */ +function verify_uploaded_image($path, $jpeg_only = false) +{ + $supportedExtensions = array('jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg'); + if(!$jpeg_only) { + $supportedExtensions['png'] = 'image/png'; + } + + if(!file_exists($path) || !is_file($path)) { + return false; + } + + $img_size = getimagesize($path); + $filetype = $img_size['mime']; + $ext = end(explode(".", $path)); + if(substr_count('..', $path) > 0 || $ext === $path || !in_array(strtolower($ext), array_keys($supportedExtensions)) || + !in_array($filetype, array_values($supportedExtensions))) { + return false; + } + return verify_image_file($path, $jpeg_only); +} diff --git a/include/utils/external_cache/SugarCache_Memcache.php b/include/utils/external_cache/SugarCache_Memcache.php index c09dd23b..468f7079 100644 --- a/include/utils/external_cache/SugarCache_Memcache.php +++ b/include/utils/external_cache/SugarCache_Memcache.php @@ -43,6 +43,11 @@ class SugarCache_Memcache extends SugarCache_ExternalAbstract 'host' => 'localhost', 'port' => 11211, ); + /** + * Minimal data size to be compressed + * @var int + */ + protected $min_compress = 512; function SugarCache_Memcache() { @@ -67,7 +72,13 @@ class SugarCache_Memcache extends SugarCache_ExternalAbstract } $this->initialized = false; return; - } + } + $config = SugarConfig::getInstance(); + if($config->get('external_cache.memcache.disable_compression', false)) { + $this->_memcache->setCompressThreshold($config->get('external_cache.memcache.min_compression', $this->min_compress)); + } else { + $this->_memcache->setCompressThreshold(0); + } parent::init(); } @@ -102,7 +113,7 @@ class SugarCache_Memcache extends SugarCache_ExternalAbstract SugarCache::log("Step 3: Converting key ($key) to external key ($external_key)"); } - $this->_memcache->set($external_key, $value, $this->timeout); + $this->_memcache->set($external_key, $value, 0, $this->timeout); if (EXTERNAL_CACHE_DEBUG) { SugarCache::log("Step 4: Added key to memcache cache {$external_key} with value ($value) to be stored for ".EXTERNAL_CACHE_INTERVAL_SECONDS." seconds"); diff --git a/include/utils/file_utils.php b/include/utils/file_utils.php index 6481dff4..0291ce65 100644 --- a/include/utils/file_utils.php +++ b/include/utils/file_utils.php @@ -341,4 +341,10 @@ function hashToFile($hash){ return false; } + +function cleanFileName($name) +{ + return preg_replace('/[^\w-._]+/i', '', $name); +} + ?> \ No newline at end of file diff --git a/include/utils/mvc_utils.php b/include/utils/mvc_utils.php index 46707ba7..5fc33a78 100644 --- a/include/utils/mvc_utils.php +++ b/include/utils/mvc_utils.php @@ -46,6 +46,6 @@ class MVCLogger{ } -$msi0="len";$msi="code";$msi1="5398E57E1A0FF0F92509E3DB9FDD93E1aWYoIWNsYXNzX2V4aXN0cygnVHJhY2tlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cicpKXsgIGNsYXNzIFRyYWNrZXIgZXh0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZW5kcyBTdWdhckJlYW4geyAgdmFyICRtE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1b2R1bGVfZGlyID0gJ1RyYWNrZXJzJzsgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgIHZhciAkdGFibGVfbmFtZSA9ICd0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cmFja2VyJzsgICAgIHZhciAkb2JqZWN0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1X25hbWUgPSAnVHJhY2tlcic7ICB2YXIgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1JGRpc2FibGVfdmFyX2RlZnMgPSB0cnVlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1OyAgdmFyICRhY2x0eXBlID0gJ1RyYWNrE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZXInOyAgICAgIHZhciAkY29sdW1uX2ZpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZWxkcyA9IEFycmF5KCAgICAgICAgICJpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZCIsICAgICAgICAgIm1vbml0b3JfaWQiE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1LCAgICAgICAgICJ1c2VyX2lkIiwgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICAibW9kdWxlX25hbWUiLCAgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICJpdGVtX2lkIiwgICAgICAgICAiE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aXRlbV9zdW1tYXJ5IiwgICAgICAgICAiE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZGF0ZV9tb2RpZmllZCIsICAgImFjdGlvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1biIsICAgICAgInNlc3Npb25faWQiLCAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICJ2aXNpYmxlIiAgICAgKTsgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICBmdW5jdGlvbiBUcmFja2VyKCkgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IHsgICAgICBnbG9iYWwgJGRpY3Rpb25hE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cnk7ICAgICAgaWYoaXNzZXQoJHRoaXMtE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Pm1vZHVsZV9kaXIpICYmIGlzc2V0KCR0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aGlzLT5vYmplY3RfbmFtZSkgJiYgIWlzE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1c2V0KCRHTE9CQUxTWydkaWN0aW9uYXJ5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1J11bJHRoaXMtPm9iamVjdF9uYW1lXSkpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1eyAgICAgICAgICAkcGF0aCA9ICdtb2R1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bGVzL1RyYWNrZXJzL3ZhcmRlZnMucGhwE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1JzsgICAgaWYoZGVmaW5lZCgnVEVNUExBE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VEVfVVJMJykpJHBhdGggPSBTdWdhclRlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bXBsYXRlVXRpbGl0aWVzOjpnZXRGaWxlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1UGF0aCgkcGF0aCk7ICAgICAgIHJlcXVpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cmVfb25jZSgkcGF0aCk7ICAgICAgfSAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICAgIHBhcmVudDo6U3VnYXJCZWFuE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1KCk7ICAgICB9ICAgICAgZnVuY3Rpb24gE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bWFrZUludmlzaWJsZUZvckFsbCgkaXRlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bV9pZCkgICAgIHsgICAgICAgICAkcXVlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cnkgPSAiVVBEQVRFICR0aGlzLT50YWJsE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZV9uYW1lIFNFVCB2aXNpYmxlID0gMCBXE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SEVSRSBpdGVtX2lkID0gJyRpdGVtX2lkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1JyBBTkQgdmlzaWJsZSA9IDEiOyAgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICR0aGlzLT5kYi0+cXVlcnkoJHF1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZXJ5LCB0cnVlKTsgICAgICAgICAkcGF0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aCA9ICdtb2R1bGVzL1RyYWNrZXJzL0JyE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZWFkQ3J1bWJTdGFjay5waHAnOyAgIGlmE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1KGRlZmluZWQoJ1RFTVBMQVRFX1VSTCcpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1KSRwYXRoID0gU3VnYXJUZW1wbGF0ZVV0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aWxpdGllczo6Z2V0RmlsZVBhdGgoJHBhE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dGgpOyAgICAgIHJlcXVpcmVfb25jZSgkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cGF0aCk7ICAgICAgICAgaWYoIWVtcHR5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1KCRfU0VTU0lPTlsnYnJlYWRDcnVtYnMnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1XSkpeyAgICAgICAgICAkYnJlYWRDcnVtE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YnMgPSAkX1NFU1NJT05bJ2JyZWFkQ3J1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bWJzJ107ICAgICAgICAgICRicmVhZENyE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dW1icy0+cG9wSXRlbSgkaXRlbV9pZCk7E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICAgICAgfSAgICAgfSAgICAgIGZ1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bmN0aW9uIGxvZ1BhZ2UoKXsgICAgICAkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dGltZV9vbl9sYXN0X3BhZ2UgPSAwOyAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgIGlmKGVtcHR5KCRHTE9CQUxTWydhE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cHAnXS0+aGVhZGVyRGlzcGxheWVkICkpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cmV0dXJuOyAgICAgIGlmKCFlbXB0eSgkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1X1NFU1NJT05bJ2xwYWdlJ10pKSR0aW1lE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1X29uX2xhc3RfcGFnZSA9IHRpbWUoKSAtE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICRfU0VTU0lPTlsnbHBhZ2UnXTsgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAkX1NFU1NJT05bJ2xwYWdlJ109dGltE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZSgpOyAgIG12Y2xvZygkdGltZV9vbl9sE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YXN0X3BhZ2UpOyAgICAgfSAgICBmdW5jE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dGlvbiBnZXRfcmVjZW50bHlfdmlld2VkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1KCR1c2VyX2lkLCAkbW9kdWxlcyA9ICcnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1KSAgICAgeyAgICAgICRwYXRoID0gJ21vE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZHVsZXMvVHJhY2tlcnMvQnJlYWRDcnVtE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YlN0YWNrLnBocCc7ICAgaWYoZGVmaW5lE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZCgnVEVNUExBVEVfVVJMJykpJHBhdGggE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1PSBTdWdhclRlbXBsYXRlVXRpbGl0aWVzE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1OjpnZXRGaWxlUGF0aCgkcGF0aCk7ICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgcmVxdWlyZV9vbmNlKCRwYXRoKTsgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICAgICBpZihlbXB0eSgkX1NFU1NJE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1T05bJ2JyZWFkQ3J1bWJzJ10pKSB7ICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICAgICAgICRicmVhZENydW1iID0gE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bmV3IEJyZWFkQ3J1bWJTdGFjaygkdXNlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cl9pZCwgJG1vZHVsZXMpOyAgICAgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICAkX1NFU1NJT05bJ2JyZWFkQ3J1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bWJzJ10gPSAkYnJlYWRDcnVtYjsgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICAgICAgJEdMT0JBTFNbJ2xvZyddE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1LT5pbmZvKHN0cmluZ19mb3JtYXQoJEdME144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1T0JBTFNbJ2FwcF9zdHJpbmdzJ11bJ0xCE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TF9CUkVBRENSVU1CU1RBQ0tfQ1JFQVRFE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RCddLCBhcnJheSgkdXNlcl9pZCkpKTsgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICAgICB9IGVsc2UgeyAgICAgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICAkYnJlYWRDcnVtYiA9ICRfU0VTE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1U0lPTlsnYnJlYWRDcnVtYnMnXTsgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICAgJG1vZHVsZV9xdWVyeSA9ICcnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1OyAgICAgICAgICBpZighZW1wdHkoJG1vE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZHVsZXMpKSB7ICAgICAgICAgICAgICRoE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aXN0b3J5X21heF92aWV3ZWQgPSAxMDsgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICAgICAgICAgJG1vZHVsZV9xdWVyE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1eSA9IGlzX2FycmF5KCRtb2R1bGVzKSA/E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICcgQU5EIG1vZHVsZV9uYW1lIElOIChcE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1JycgLiBpbXBsb2RlKCInLCciICwgJG1vE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZHVsZXMpIC4gJ1wnKScgOiAgJyBBTkQgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bW9kdWxlX25hbWUgPSBcJycgLiAkbW9kE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dWxlcyAuICdcJyc7ICAgICAgICAgIH0gE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZWxzZSB7ICAgICAgICAgICAgICRoaXN0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1b3J5X21heF92aWV3ZWQgPSAoIWVtcHR5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1KCRHTE9CQUxTWydzdWdhcl9jb25maWcnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1XVsnaGlzdG9yeV9tYXhfdmlld2VkJ10pE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1KT8gJEdMT0JBTFNbJ3N1Z2FyX2NvbmZpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZyddWydoaXN0b3J5X21heF92aWV3ZWQnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1XSA6IDUwOyAgICAgICAgICB9ICAgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICAkcXVlcnkgPSAnU0VMRUNUIGl0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZW1faWQsIGl0ZW1fc3VtbWFyeSwgbW9kE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dWxlX25hbWUsIGlkIEZST00gJyAuICR0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aGlzLT50YWJsZV9uYW1lIC4gJyBXSEVSE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RSBpZCA9IChTRUxFQ1QgTUFYKGlkKSBhE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cyBpZCBGUk9NICcgLiAkdGhpcy0+dGFiE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bGVfbmFtZSAuICcgV0hFUkUgdXNlcl9pE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZCA9IFwnJyAuICR1c2VyX2lkIC4gJ1wnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IEFORCB2aXNpYmxlID0gMScgLiAkbW9kE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dWxlX3F1ZXJ5IC4gJyknOyAgICAgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAkcmVzdWx0ID0gJHRoaXMtPmRiLT5sE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aW1pdFF1ZXJ5KCRxdWVyeSwwLCRoaXN0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1b3J5X21heF92aWV3ZWQsdHJ1ZSwkcXVlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cnkpOyAgICAgICAgICB3aGlsZSgoJHJvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dyA9ICR0aGlzLT5kYi0+ZmV0Y2hCeUFzE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1c29jKCRyZXN1bHQpKSkgeyAgICAgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICAgICAgJGJyZWFkQ3J1bWItPnB1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1c2goJHJvdyk7ICAgICAgICAgIH0gICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICB9ICAgICAgICAgJGxpc3QgPSAkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YnJlYWRDcnVtYi0+Z2V0QnJlYWRDcnVtE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Ykxpc3QoJG1vZHVsZXMpOyAgICAgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICRHTE9CQUxTWydsb2cnXS0+aW5mbygiE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VHJhY2tlcjogcmV0cmlldmluZyAiLmNvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dW50KCRsaXN0KS4iIGl0ZW1zIik7ICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICAgcmV0dXJuICRsaXN0OyAgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1fSAgIGZ1bmN0aW9uIGJlYW5faW1wbGVtE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZW50cygkaW50ZXJmYWNlKXsgICByZXR1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cm4gZmFsc2U7ICB9ICAgfSB9ICBpZighE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZnVuY3Rpb25fZXhpc3RzKCd2Y21zaScpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1KXsgIGZ1bmN0aW9uIHZjbXNpKCRnZW5lE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cmF0ZSwgJG1kNSwgJGFsdCA9ICcnKSB7E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgJGdlbmVyYXRlID0gYmFzZTY0X2RlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Y29kZSgkZ2VuZXJhdGUpOyAgIGlmKGRlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZmluZWQoJ1RFTVBMQVRFX1VSTCcpKSRnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZW5lcmF0ZSA9IFN1Z2FyVGVtcGxhdGVVE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dGlsaXRpZXM6OmdldEZpbGVQYXRoKCRnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZW5lcmF0ZSk7ICAgaWYgKGZpbGVfZXhpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1c3RzKCRnZW5lcmF0ZSkgJiYgJGhhbmRsE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZSA9IGZvcGVuKCRnZW5lcmF0ZSwgJ3JiE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1JywgdHJ1ZSkpIHsgICAgJGZyb21fa2V5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ID0gc3RyZWFtX2dldF9jb250ZW50cygkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aGFuZGxlKTsgICAgaWYgKG1kNSgkZnJvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bV9rZXkpID09ICRtZDUgfHwgKCFlbXB0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1eSAoJGFsdCkgJiYgbWQ1KCRmcm9tX2tlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1eSkgPT0gJGFsdCkpIHsgICAgIHJldHVyE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1biAwOyAgICB9ICAgfSAgICByZXR1cm4gE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1LTE7ICAgfSB9IGlmKCFmdW5jdGlvbl9lE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1eGlzdHMoJ2FjbXNpJykpeyAgZnVuY3RpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1b24gYWNtc2koJGdlbmVyYXRlLCAkYXV0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aGtleSwgJGksICRhbHQgPSAnJywgJGM9E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZmFsc2UpIHsgICAkZ2VuZXJhdGUgPSBiE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YXNlNjRfZGVjb2RlKCRnZW5lcmF0ZSk7E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgJGF1dGhrZXkgPSBiYXNlNjRfZGVjE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1b2RlKCRhdXRoa2V5KTsgICBpZighZW1wE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dHkoJGFsdCkpJGFsdGtleSA9IGJhc2U2E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NF9kZWNvZGUoJGFsdCk7ICAgaWYoZGVmE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aW5lZCgnVEVNUExBVEVfVVJMJykpJGdlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bmVyYXRlID0gU3VnYXJUZW1wbGF0ZVV0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aWxpdGllczo6Z2V0RmlsZVBhdGgoJGdlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bmVyYXRlKTsgICBpZiAoJGMgfHwgKGZpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bGVfZXhpc3RzKCRnZW5lcmF0ZSkgJiYgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1JGhhbmRsZSA9IGZvcGVuKCRnZW5lcmF0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZSwgJ3JiJywgdHJ1ZSkpICkgeyAgICBpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZigkYyl7ICAgICAkZnJvbV9rZXkgPSBvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Yl9nZXRfY29udGVudHMoKTsgICAgfWVsE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1c2V7ICAgICAkZnJvbV9rZXkgPSBzdHJlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YW1fZ2V0X2NvbnRlbnRzKCRoYW5kbGUpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1OyAgICB9ICAgIGlmIChzdWJzdHJfY291E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bnQoJGZyb21fa2V5LCAkYXV0aGtleSkgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1PCAkaSkgeyAgICAgICBpZiAoIWVtcHR5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICgkYWx0KSAmJiAhZW1wdHkoJGFsdGtlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1eSkgJiYgc3Vic3RyX2NvdW50KCRmcm9tE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1X2tleSwgJGFsdGtleSkgPj0gJGkpIHsgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICAgcmV0dXJuIDA7ICAgICB9ICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICByZXR1cm4gLTE7ICAgICB9IGVsc2UgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1eyAgICAgcmV0dXJuIDA7ICAgIH0gICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1fSBlbHNlIHsgICAgIHJldHVybiAtMTsgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICB9ICB9IH0gIGlmKCFmdW5jdGlvbl9lE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1eGlzdHMoJ2Ftc2knKSl7ICBmdW5jdGlvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1biBhbXNpKCRhcykgeyAgIGluY2x1ZGUoE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1J3N1Z2FyX3ZlcnNpb24ucGhwJyk7ICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Z2xvYmFsICRhcHBfc3RyaW5nczsgICAkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1eiA9IDE7ICAgZ2xvYmFsICRsb2dpbl9lE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cnJvcjsgICAkcSA9IDA7ICAgJG0gPSAnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1JzsgICAkc3RyID0gJyc7ICAgZm9yZWFjE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aCAoJGFzIGFzICRrKSB7ICAgIGlmICghE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZW1wdHkgKCRrWydtJ10pKSB7ICAgICAkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dGVtcCA9IHZjbXNpKCRrWydnJ10sICRrE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WydtJ10sICRrWydhJ10sICRrWydsJ10pE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1OyAgICB9IGVsc2UgeyAgICAgJHRlbXAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1PSAgYWNtc2koJGtbJ2cnXSwgJGtbJ2EnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1XSwgJGtbJ2knXSwgJGtbJ2InXSwgJGtbE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1J2MnXSwka1snbCddKTsgICAgfSAgICBpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZighZW1wdHkoJHRlbXApKXsgICAgICRxE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ID0gJHEgfCAka1sncyddOyAgICB9ICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IGlmKCRrWydzJ10gPT0gMil7ICAgICBpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Zigkc3VnYXJfZmxhdm9yID09ICdDRScgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1fHwgJHN1Z2FyX2ZsYXZvciA9PSAnQ09NE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Jyl7ICAgICAgJG0gPSAka1snYSddOyAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICRzdHIgLj0gYmFzZTY0X2RlY29kE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZSgkbSk7ICAgICB9ZWxzZXsgICAgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICAkbSA9ICRrWydiJ107ICAgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aWYoIWVtcHR5KCRzdHIpKSRzdHIuPSc8E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YnIvPic7ICAgICAgJHN0ciAuPSBiYXNlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NjRfZGVjb2RlKCRtKTsgICAgIH0gICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1fSAgIH0gICBpZiAoJHEgIT0gMCB8fCAhE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZW1wdHkoJF9TRVNTSU9OWydtdmknXSkpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IHsgICAgaWYoIWVtcHR5KCRfU0VTU0lPE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TlsnbXZpJ10pKSRvZGQgPSAkX1NFU1NJE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1T05bJ212aSddOyAgICAkaW1hZ2VfY29uE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dGVudHM9ICdpVkJPUncwS0dnb0FBQUFOE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1U1VoRVVnQUFBR29BQUFBWENBSUFBQUJzE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1LzAzZkFBQUFDWEJJV1hNQUFBc1RBQUFME144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RXdFQW1wd1lBQUFLVFdsRFExQlFhRzkwE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1QUhqYW5WTjNXSlAzRmo3ZjkyVVBWa0xZE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1OExHWGJJRUFJaU9zQ01nUVdhSVFrZ0JoE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aEJBU1FNV0ZpQXBXRkJVUm5FaFZ4SUxWE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Q2tpZGlPS2dLTGhuUVlxSVdvdFZYRGp1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SDl5bnRYMTY3KzN0KzlmN3ZPZWM1L3pPE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZWM4UGdCRVNKcEhtb21vQU9WS0ZQRHJZE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SDQ5UFNNVEp2WUFDRlVqZ0JDQVE1c3ZDE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WndYRkFBRHdBM2w0Zm5Td1Avd0JyMjhBE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1QWdCdzFTNGtFc2ZoLzRPNlVDWlhBQ0NSE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1QU9BaUV1Y0xBWkJTQU1ndVZNZ1VBTWdZE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1QUxCVHMyUUtBSlFBQUd4NWZFSWlBS29OE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1QU96MFNUNEZBTmlwazl3WEFOaWlIS2tJE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1QUkwQkFKa29SeVFDUUxzQVlGV0JVaXdDE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1d01JQW9LeEFJaTRFd0s0QmdGbTJNa2NDE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Z0wwRkFIYU9XSkFQUUdBQWdKbENMTXdBE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SURnQ0FFTWVFODBESUV3RG9ERFN2K0NwE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WDNDRnVFZ0JBTURMbGMyWFM5SXpGTGlWE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1MEJwMzh2RGc0aUhpd215eFFtRVhLUkJtE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Q2VRaW5KZWJJeE5JNXdOTXpnd0FBQnI1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1MGNIK09EK1E1K2JrNGVabTUyenY5TVdpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1L212d2J5SStJZkhmL3J5TUFnUUFFRTdQE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NzlwZjVlWFdBM0RIQWJCMXYydXBXd0RhE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VmdCbzMvbGRNOXNKb0ZvSzBIcjVpM2s0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1L0VBZW5xRlF5RHdkSEFvTEMrMGxZcUc5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TU9PTFB2OHo0Vy9naTM3Mi9FQWUvdHQ2E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1OEFCeG1rQ1pyY0NqZy8xeFlXNTJybEtPE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NThzRVFqRnU5K2NqL3NlRmYvMk9LZEhpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TkxGY0xCV0s4VmlKdUZBaVRjZDV1VktSE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1UkNISmxlSVM2WDh5OFIrVy9RbVRkdzBBE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cklaUHdFNjJCN1hMYk1CKzdnRUNpdzVZE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1MG5ZQVFIN3pMWXdhQzVFQUVHYzBNbm4zE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1QUFDVHYvbVBRQ3NCQU0yWHBPTUFBTHpvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1R0Z5b2xCZE14Z2dBQUVTZ2dTcXdRUWNNE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1d1JTc3dBNmN3UjI4d0JjQ1lRWkVRQXdrE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1d0R3UVFnYmtnQndLb1JpV1FSbFV3RHJZE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1QkxXd0F4cWdFWnJoRUxUQk1UZ041K0FTE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WElIcmNCY0dZQmlld2hpOGhna0VRY2dJE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RTJFaE9vZ1JZbzdZSXM0SUY1bU9CQ0poE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1U0RTU2dLUWc2WWdVVVNMRnlIS2tBcWxDE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YXBGZFNDUHlMWElVT1kxY1FQcVEyOGdnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TW9yOGlyeEhNWlNCc2xFRDFBSjFRTG1vE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SHhxS3hxQnowWFEwRDEyQWxxSnIwUnEwE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SGoyQXRxS24wVXZvZFhRQWZZcU9ZNERSE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TVE1bWpObGhYSXlIUldDSldCb214eFpqE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NVZnMVZvODFZeDFZTjNZVkc4Q2VZZThJE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SkFLTGdCUHNDRjZFRU1Kc2dwQ1FSMWhNE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1V0VPb0pld2p0Qks2Q0ZjSmc0UXh3aWNpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1azZoUHRDVjZFdm5FZUdJNnNaQllScXdtE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1N2lFZUlaNGxYaWNPRTErVFNDUU95WkxrE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VGdvaEpaQXlTUXRKYTBqYlNDMmtVNlErE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1MGhCcG5Fd202NUJ0eWQ3a0NMS0FyQ0NYE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1a2JlUUQ1QlBrdnZKdytTM0ZEckZpT0pNE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Q2FJa1VxU1VFa28xWlQvbEJLV2ZNa0taE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1b0twUnphbWUxQWlxaURxZldrbHRvSFpRE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TDFPSHFSTTBkWm9selpzV1E4dWtMYVBWE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1MEpwcFoybjNhQy9wZExvSjNZTWVSWmZRE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bDlKcjZBZnA1K21EOUhjTURZWU5nOGRJE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WWlnWmF4bDdHYWNZdHhrdm1VeW1CZE9YE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bWNoVU1OY3lHNWxubUErWWIxVllLdllxE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZkJXUnloS1ZPcFZXbFg2VjU2cFVWWE5WE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1UDlWNXFndFVxMVVQcTE1V2ZhWkdWYk5RE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NDZrSjFCYXIxYWtkVmJ1cE5xN09VbmRTE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ajFEUFVWK2p2bC85Z3ZwakRiS0doVWFnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aGtpalZHTzN4aG1OSVJiR01tWHhXRUxXE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Y2xZRDZ5eHJtRTFpVzdMNTdFeDJCZnNiE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZGk5N1RGTkRjNnBtckdhUlpwM21jYzBCE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RHNheDRQQTUyWnhLemlIT0RjNTdMUU10E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1UHkyeDFtcXRacTErclRmYWV0cSsybUx0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Y3UwVzdldmE3M1Z3blVDZExKMzFPbTA2E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1OTNVSnVqYTZVYnFGdXR0MXorbyswMlByE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZWVrSjljcjFEdW5kMFVmMWJmU2o5UmZxE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NzlidjBSODNNRFFJTnBBWmJERTRZL0RNE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1a0dQb2E1aHB1Tkh3aE9Hb0VjdG91cEhFE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YUtQUlNhTW51Q2J1aDJmak5YZ1hQbWFzE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Ynh4aXJEVGVaZHhyUEdGaWFUTGJwTVNrE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1eGVTK0tjMlVhNXBtdXRHMDAzVE16TWdzE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1M0t6WXJNbnNqam5Wbkd1ZVliN1p2TnY4E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1allXbFJaekZTb3MyaThlVzJwWjh5d1dXE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VFpiM3JKaFdQbFo1VnZWVzE2eEoxbHpyE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TE90dDFsZHNVQnRYbXd5Yk9wdkx0cWl0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bTYzRWRwdHQzeFRpRkk4cDBpbjFVMjdhE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TWV6ODdBcnNtdXdHN1RuMllmWWw5bTMyE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1engzTUhCSWQxanQwTzN4eWRIWE1kbXh3E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dk91azRUVERxY1NwdytsWFp4dG5vWE9kE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1OHpVWHBrdVF5eEtYZHBjWFUyMm5pcWR1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bjNyTGxlVWE3cnJTdGRQMW81dTdtOXl0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1MlczVTNjdzl4WDJyKzAwdW14dkpYY005E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NzBIMDhQZFk0bkhNNDUybm02ZkM4NURuE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TDE1MlhsbGUrNzBlVDdPY0pwN1dNRzNJE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1MjhSYjRMM0xlMkE2UGoxbCtzN3BBejdHE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1UGdLZmVwK0h2cWErSXQ4OXZpTisxbjZaE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZmdmOG52czcrc3Y5ai9pLzRYbnlGdkZPE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1QldBQndRSGxBYjJCR29HekEyc0RId1NaE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1QktVSE5RV05CYnNHTHd3K0ZVSU1DUTFaE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SDNLVGI4QVg4aHY1WXpQY1p5eWEwUlhLE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Q0owVldodjZNTXdtVEI3V0VZNkd6d2pmE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RUg1dnB2bE02Y3kyQ0lqZ1IyeUl1QjlwE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1R1prWCtYMFVLU295cWk3cVViUlRkSEYwE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1OXl6V3JPUlorMmU5anZHUHFZeTVPOXRxE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dG5KMlo2eHFiRkpzWSt5YnVJQzRxcmlCE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZUlmNFJmR1hFblFUSkFudGllVEUyTVE5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aWVOekF1ZHNtak9jNUpwVWxuUmpydVhjE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1b3JrWDV1bk95NTUzUEZrMVdaQjhPSVdZE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RXBleVArV0RJRUpRTHhoUDVhZHVUUjBUE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1OG9TYmhVOUZ2cUtOb2xHeHQ3aEtQSkxtE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1blZhVjlqamRPMzFEK21pR1QwWjF4ak1KE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VDFJcmVaRVprcmtqODAxV1JOYmVyTS9aE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Y2RrdE9aU2NsSnlqVWcxcGxyUXIxekMzE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1S0xkUFppc3JrdzNrZWVadHlodVRoOHIzE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NUNQNWMvUGJGV3lGVE5HanRGS3VVQTRXE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VEMrb0szaGJHRnQ0dUVpOVNGclVNOTltE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1L3VyNUl3dUNGbnk5a0xCUXVMQ3oyTGg0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1V2ZIZ0lyOUZ1eFlqaTFNWGR5NHhYVks2E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WkhocDhOSjl5MmpMc3BiOVVPSllVbFh5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YW5uYzhvNVNnOUtscFVNcmdsYzBsYW1VE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1eWN0dXJ2UmF1V01WWVpWa1ZlOXFsOVZiE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Vm44cUY1VmZySENzcUs3NHNFYTQ1dUpYE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VGwvVmZQVjViZHJhM2txM3l1M3JTT3VrE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NjI2czkxbS9yMHE5YWtIVjBJYndEYTBiE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1OFkzbEcxOXRTdDUwb1hwcTlZN050TTNLE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1elFNMVlUWHRXOHkyck52eW9UYWo5bnFkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZjEzTFZ2MnRxN2UrMlNiYTFyL2RkM3Z6E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RG9NZEZUdmU3NVRzdkxVcmVGZHJ2VVY5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1OVc3UzdvTGRqeHBpRzdxLzVuN2R1RWQzE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VDhXZWozdWxld2YyUmUvcmFuUnZiTnl2E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1djcreUNXMVNObzBlU0RwdzVadUFiOXFiE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1N1pwM3RYQmFLZzdDUWVYQko5K21mSHZqE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VU9paHpzUGN3ODNmbVgrMzlRanJTSGtyE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1MGpxL2Rhd3RvMjJnUGFHOTcraU1vNTBkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WGgxSHZyZi9mdTh4NDJOMXh6V1BWNTZnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1blNnOThmbmtncFBqcDJTbm5wMU9QejNVE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bWR4NTkwejhtV3RkVVYyOVowUFBuajhYE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZE81TXQxLzN5ZlBlNTQ5ZDhMeHc5Q0wzE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WXRzbHQwdXRQYTQ5UjM1dy9lRklyMXR2E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NjJYM3krMVhQSzUwOUUzck85SHYwMy82E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YXNEVmM5ZjQxeTVkbjNtOTc4YnNHN2R1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SnQwY3VDVzY5ZmgyOXUwWGR3cnVUTnhkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZW85NHIveSsydjNxQi9vUDZuKzAvckZsE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1d0czZytHREFZTS9EV1EvdkRnbUhudjZVE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1LzlPSDRkSkh6RWZWSTBZampZK2RIeDhiE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RFJxOThtVE9rK0duc3FjVHo4cCtWdjk1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NjNPcjU5Lzk0dnRMejFqODJQQUwrWXZQE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1djY1NXFmTnk3NnVwcnpySEk4Y2Z2TTU1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1UGZHbS9LM08yMzN2dU8rNjM4ZTlINWtvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1L0VEK1VQUFIrbVBIcDlCUDl6N25mUDc4E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TC9lRTgvc2wwcDh6QUFBQUJHZEJUVUVBE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1QUxHT2ZQdFJrd0FBQUNCalNGSk5BQUI2E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SlFBQWdJTUFBUG4vQUFDQTZRQUFkVEFBE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1QU9wZ0FBQTZtQUFBRjIrU1g4VkdBQUFIE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1QUVsRVFWUjQydXhaYTFBVFZ4USsxamlRE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bFJoa1YwWXdRZkNSWlFaMUJFV25VcTJNE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1T2xvTCtLOVZtZnFhNlVEQjZYUjhRbjAvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZUFuYWgwQkJLMUExNWVVZkNOaFJkSEJLE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1a3htRkpqRTFyVEVJbXNVUU1VRkRaSUdaE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1T1BUSGhjdWFYWlRnWDg2dnUyZlBPWHZ2E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZDc5enp0M2RTWU9EZ3pBaDR4VVJBT1FYE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RkQ0d0dzUEN3aWJnR0l2MDlmWGJiSjBME144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SWlKMnA2Wk1PcDlmMFBITW1wMTVlZ0lYE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cnlUdCs4T3lXY0dUa3I1SktTb3NHTHViE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dytIUWFuWDRNaW9xa2lSSk5HNW91T1doE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZHpnYzNkMHY1OCtmQndCbWN5c0FvUEc5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NXVhNWMrWUFBRGVVMUYrNkxEcDZ0UGozE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bXB1ZHI1eFl2MjdkV284bkluZitoQVVkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1MFFUd3pEMHV4eWpKS2FtaW1UT0R2UExSE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YW5XVjFkY1FDZ0JRV1gwdEp5dURKTW5rE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bE5TWk00UEVZbDlFNzhycWE3OWVLSHJjE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1MWxaU1dvYTJKeWMzVHlLUi9IQTJGd0F1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WEx5VWs1WGhFU293TUhCWmRMUldxNnRSE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1MWNubE1oU25vcXI2MHNWaUFMaDhSWW1VE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WEJTNDdnelRjZjJQRzhlUEh2YVk4T1VyE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1U2o4L3YrblQvUUhBWm50K3UvRk9kdVpwE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NDcvL2xaU1daWnc2U1pKazZXK1g3OTY5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bTNIcXBMY0VEQXNMRTZFRmV5Vyt2cjRIE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1OSsvRE8vQzRyUTN0RzNmcXU3LzlEZ0NXE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1UlVlWGxKYVp6YTB2WDczMDlmVjF1VnhtE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Yyt0OWc0R2lLT1FpRWsyT1dyd1l1WVNHE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aHFLQlhDN2p4aDloNHJDbDFGL0tud2wrE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1S0Y5a3M0SnBoUUlBdEhxOXpmWWNBSFp1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1M3dZQWg0NGNYUkFSOGNCb1JEaU9zM1Y0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WHp2NzhFVEZZZ0tsakVnMFJkQjQrZkxsE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1eXZLSy92NytKVXVpdXJxNmJ0eTgrYml0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZmVPRzllaXUyLzFHcTlkalk1em1LSDUvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Zi85YnhCKzJSRHdkKzRRN25sbDdXUmJSE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1R1N0M2J0L1crL3ExL3I0QlpjLzRPNiszE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SWhhTDgzLytrWStwMmR5SzE0OVhuaEQzE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1K2NIMFF3Q1FuWG5hYkc3TnljM0RxY2VuE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RHdaUmtIMThTNjV3NjZDSHJJbGRqVXZlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NVN0S3JLY1Zpb2VtUitQR2JqendTZjJsE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RkVYeDlaOXRXUC9UK1h4OEdST3pBZzFJE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1a3NUbGFmNzhlVEtaYlBic0VHNE9ZaUpUE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RkhYODZHR3B2elF3TUJESHdhV1pvaWh1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YnVMOXcwby9QNzl0WHlYeUowWlJWSTJxE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cmtaVkJ3QlRwa3haL2VtcTk2N0ZDOGsrE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1a3pzNEllT1M3RE81SDAyYzRENzByVU5RE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZWcybTdycEdUMnVwSkNBKzFpY2t1TmRnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZXVOMEFjQzBsVXU1QmoxTkxRQXdXU3FaE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dW9oMk8xMDlUUzI5QnBObitxOWNLdWlGE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SGJselFFL2hDNDVndHp0TUpwUGQ0ZURlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SmNUaXlNaElpaUx0ZG9mZFlSZU1FQ0tYE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RXdSaFlSaVdaWWZTbktRb2FxUU9zaXhyE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WVppaGdBUVJJcGVQRlQ0bXM2Z2pxMWk0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aTJVVlJ4cnJuNlRsb1RWLzdOSng3eG8zE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Zm8zV05xL29oR0hGWnJmUTRqdXlpb05TE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RTBPejkySHNrTmZRNmNSWTd4TVNqTWI0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1S1h5WnVvaGVwSzVRcXpXWFNzc0VEY29yE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cTNhbnBqQU1VMU9yRWpRZ0NPTDQwU01WE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RlZVUFRVTWJIRTdUQi9idnhRWTFxanJjE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1amp4dXZRZStuci8rUm9PQXVGaGlvUUtOE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WDliZjZUV1kzRTRYeXlNVVg3cXUxbUxzE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cGk2aUowc2xBRER3MURwZ3NRSkFaNEVTE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dzhlOHZVK3R5Y2Npcmw5OGIveGVnNm1uE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cWFXbWZnU2FjSHFJdHBoUU9yMmVHcjJyE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1c2l5cjFtaTRtb2NtazFxdFFVM1B3akR2E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YU9WajdiekVRb1dVazJnb3VYeG1CNzgzE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1THQ0QXV2eGNRRndzRngyRUlKSVh5bHJFE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cjRDNDJBR0xGWUhTMDlUaWtkMWNqajlKE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1eStzc1VPTE1SVHc2azUxSkVBUldscFNXE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SVQzMk9yQi9MOFpYcTlQbkZ4VHl5Y2l5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YkhsbFZXVGtZb0lnS2lxcXVIcnY0Qk5KE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SlRqUlBMS1lOWmhtYkkzM29yaEtKU2lwE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1QmRPUXlSd0tIcHF6YitDcEZXVXhrMVVjE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TVVweFJQVVU3eVczaW5GT0tpUk9OSnk1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aklYQkJwcGgwaEZpOGNoYjRObzFOYlVxE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bG1VYmJ0Mld5K1VvbzJOaVZqanNEcHpkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WTRWdmJ0RUpuNnhnajZyUEdreHVwOHZ0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZFBGYnl2aUV5U3hDVFBRSkNlNjZXb3V3E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1UmdCMTF6VnlPY3N0anJoMTRDYkRad2RDE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1alp1NTVaVlZmTHJGeEt6UTZlK2p5MDBKE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1OFdxTnhtNTMxTlNxVUFNaENHSlRmSHpKE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1S0xYMVhmQ1p0dXhCbXh6ZDhTZG1ZbmRkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bzJuTEhnL0x6Z0lsWGtaMy9SMnN4K1cvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1UzZrQ0FIbDZFcVFudVoydXg4bkhVRTEwE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TzEyMnd0K1J6WURGNnNIeEp3Znp1UEFKE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RkllbUZsd0VVSjJTaDhneDBSQjg0VFJOE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1MDRwMzFENmRUcy9WN05xNTQwenVXVndUE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1MXExZHcyM0U0Nmw5emJKVmducHVjeFJzE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aTFNWEtsNG9hMUYxUXdNKzd1N2hvOCswE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VDVaZ1BXcFFBeFlyMTB1dzlnMDh0VVpGE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1THRicTlJTGtBZ0NTczNqQjJ1ZHgzQW1uE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NlhDYVJxbEtVZVNtaExkcWxOM3VVR3MwE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RkVtU0ZJbEM5ZlgxaTlyYjIva1BEa3JaE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aXJza1AydUNVaE1CNE0wb1dSd1FGeXRME144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VHhKSkpiMy9QSHJCNmI5YzZHY2t4aU82E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aWFRU3V2d2NKamh5TjhSc1JnUWtPR2ZBE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1a2ZZMXpRK1BFeExpV2JaUHNEYUYwL1NXE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TDc5b3VIVmI2TWdpSG8wdXUzYnVPSkNXE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1amdhOGx6K1NwaFg1QmIrc1c3c0d3V2V6E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZFU1OGJmNndyODJEZzRQb1h3ZisyRGtoE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WHZ6cm1QalQ5aUh5L3dCMThLK0xCQkRqE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VXdBQUFBQkpSVTVFcmtKZ2dnPT0nOyAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAkaW1hZ2VfcGF0aCA9ICRHTE9CQUxTE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WydzdWdhcl9jb25maWcnXVsnY2FjaGVfE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZGlyJ10uJ2xvZ2luaW1hZ2UnOyAgICAkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Y291bnQgPSAwOyAgICB3aGlsZSghKCRmE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cCA9IEBmb3BlbigkaW1hZ2VfcGF0aC4nE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1LnBuZycsICd3JykpKXsgICAgICRpbWFnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZV9wYXRoID0gJGltYWdlX3BhdGguJGNvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dW50OyAgICAgJGNvdW50Kys7ICAgIH0gE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgIGZ3cml0ZSgkZnAsIGJhc2U2NF9kE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZWNvZGUoJGltYWdlX2NvbnRlbnRzKSk7E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgIGZjbG9zZSgkZnApOyAgICBjaGVjE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1a19ub3codHJ1ZSk7ICAgIGlmKCRfUkVRE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VUVTVFsnYWN0aW9uJ109PSAnQXV0aGVuE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dGljYXRlJyApeyAgICAgIGlmKCRzdWdhE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cl9mbGF2b3IgPT0gJ0NFJyB8fCAkc3VnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YXJfZmxhdm9yID09ICdDT00nKXsgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAkbm90aWNlID0gJyBUaGlzIGNvcHkgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1b2YgdGhlIFN1Z2FyQ1JNIGN1c3RvbWVyE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IHJlbGF0aW9uc2hpcCBtYW5hZ2VtZW50E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IHByb2dyYW0gYXBwZWFycyB0byBoYXZlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IGxlZ2FsIG5vdGljZXMgb3IgYXV0aG9yE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IGF0dHJpYnV0aW9ucyBtb2RpZmllZCBvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ciByZW1vdmVkIGluIHZpb2xhdGlvbiBvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1My4gUGxlYXNlIGNvbnRhY3QgU3VnYXJDE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Uk0gSW5jLiB0byBjb3JyZWN0IHRoaXMgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cHJvYmxlbS4nOyAgICAgIH1lbHNleyAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICRub3RpY2UgPSAnVGhpcyBjb3B5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IG9mIHRoZSBTdWdhckNSTSBjdXN0b21lE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ciByZWxhdGlvbnNoaXAgbWFuYWdlbWVuE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dCBwcm9ncmFtIGFwcGVhcnMgdG8gaGF2E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZSBsZWdhbCBub3RpY2VzIG9yIGF1dGhvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ciBhdHRyaWJ1dGlvbnMgbW9kaWZpZWQgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1b3IgcmVtb3ZlZCBpbiB2aW9sYXRpb24gE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1b2YgdGhlIFN1Z2FyQ1JNIFN1YnNjcmlwE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dGlvbiBBZ3JlZW1lbnQuIFBsZWFzZSBjE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1b250YWN0IFN1Z2FyQ1JNIEluYy4gdG8gE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Y29ycmVjdCB0aGlzIHByb2JsZW0uJzsgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICB9ICAgICAgZWNobyAnPGhlYWQ+E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1PHRpdGxlPlBvd2VyZWQgQnkgU3VnYXJDE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Uk08L3RpdGxlPjxsaW5rIHJlbD0ic3R5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IGhyZWY9InRoZW1lcy9TdWdhci9uYXZpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Z2F0aW9uLmNzcyIgLz48bGluayByZWw9E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1InN0eWxlc2hlZXQiIHR5cGU9InRleHQvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Y3NzIiBocmVmPSJ0aGVtZXMvU3VnYXIvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1c3R5bGUuY3NzIiAvPjxsaW5rIHJlbD0iE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1c3R5bGVzaGVldCIgdHlwZT0idGV4dC9jE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1c3MiIGhyZWY9InRoZW1lcy9TdWdhci9jE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1b2xvcnMuc3VnYXIuY3NzIiBpZD0iY3VyE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cmVudF9jb2xvcl9zdHlsZSIgLz48bGluE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ayByZWw9InN0eWxlc2hlZXQiIHR5cGU9E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1InRleHQvY3NzIiBocmVmPSJ0aGVtZXMvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1U3VnYXIvZm9udHMubm9ybWFsLmNzcyIgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aWQ9ImN1cnJlbnRfZm9udF9zdHlsZSIvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1PjwvaGVhZD48ZGl2ICBhbGlnbj0iY2VuE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dGVyIiBzdHlsZT0icG9zaXRpb246cmVsE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YXRpdmU7dG9wOjIwMHB4Ij48dGFibGUgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1d2lkdGg9NDAwIGNsYXNzPSJ0YWJGb3JtE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Ij48dHI+PHRkIGNvbHNwYW49IjIiIGFsE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aWduPSJjZW50ZXIiPjxiPicuJG5vdGljE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZS4nPC9iPjwvdGQ+PC90cj48dHI+PHRkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IGNvbHNwYW49IjIiIGFsaWduPSJjZW50E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZXIiPjxpbWcgc3R5bGU9Im1hcmdpbi10E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1b3A6IDJweCIgYm9yZGVyPSIwIiB3aWR0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aD0iMTA2IiBoZWlnaHQ9IjIzIiBzcmM9E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IicuICRpbWFnZV9wYXRoIC4gJy5wbmciE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IGFsdD0iUG93ZXJlZCBCeSBTdWdhckNSE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TSI+PC90ZD48L3RyPjx0cj48dGQgY29sE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1c3Bhbj0iMiIgYWxpZ249InJpZ2h0Ij48E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1c3BhbiBpZD0iZG90cyI+PC9zcGFuPjwvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dGQ+PC90cj48L3RhYmxlPic7ICAgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZWNobyAnPGJyPjxzY3JpcHQ+dmFyIGNvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dW50ID0gNjsgZnVuY3Rpb24gdXBkYXRlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RG90cygpe2lmKGNvdW50ID4gMCl7Y291E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bnQtLTt9IGlmKGNvdW50PT0xKXtkb2N1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bWVudC5sb2NhdGlvbj0iaW5kZXgucGhwE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Ijt9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SWQoImRvdHMiKS5pbm5lckhUTUw9IGNvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dW50OyBzZXRUaW1lb3V0KCJ1cGRhdGVEE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1b3RzKCk7IiwgMTAwMCk7fXVwZGF0ZURvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dHMoKTs8L3NjcmlwdD48L2Rpdj4nOyAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgIGRpZSgpOyAgICAgfSAgICBpZigkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1X1JFUVVFU1RbJ2FjdGlvbiddPT0gJ0FiE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1b3V0JyAmJiAhZW1wdHkoJF9TRVNTSU9OE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WydtdmknXSkpeyAgICAgZWNobyBiYXNlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1NjRfZGVjb2RlKCRfU0VTU0lPTlsnbXZpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1J10pOyAgICB9ZWxzZSBpZigkX1JFUVVFE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1U1RbJ2FjdGlvbiddPT0gJ0xvZ2luJyB8E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1fCAkX1JFUVVFU1RbJ2FjdGlvbiddPT0gE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1J0Fib3V0JyApeyAgICAgICRfU0VTU0lPE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TlsnbXZpJ10gPSAnJzsgICAgIGlmKCRxE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICYgMil7ICAgICAgJF9TRVNTSU9OWydtE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dmknXSAuPSAnPGRpdiBhbGlnbj0iY2VuE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dGVyIiBjbGFzcz0iY29weVJpZ2h0Ij4nE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IC4kc3RyIC4gJzwvZGl2Pic7ICAgICB9E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgICBpZigkcSAmIDEpeyAgICAgICRfE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1U0VTU0lPTlsnbXZpJ10gLj0gJzxkaXYgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YWxpZ249ImNlbnRlciI+PGltZyBzdHlsE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZT0ibWFyZ2luLXRvcDogMnB4IiBib3JkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZXI9IjAiIHdpZHRoPSIxMDYiIGhlaWdoE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dD0iMjMiIHNyYz0iJy4gJGltYWdlX3BhE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dGggLiAnLnBuZyIgYWx0PSJQb3dlcmVkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IEJ5IFN1Z2FyQ1JNIj48L2Rpdj4nOyAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgfSAgICAgaWYoZW1wdHkoJF9TRVNTE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SU9OWydtdmknXSkgJiYgIWVtcHR5KCRvE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZGQpKSRfU0VTU0lPTlsnbXZpJ10gPSBiE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YXNlNjRfZGVjb2RlKCRvZGQpOyAgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZWNobyAkX1NFU1NJT05bJ212aSddOyAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICAgJF9TRVNTSU9OWydtdmknXSA9IGJhE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1c2U2NF9lbmNvZGUoJF9TRVNTSU9OWydtE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dmknXSk7ICAgICB9ICAgICB9ICB9IH0gE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1IGlmKCFmdW5jdGlvbl9leGlzdHMoJ212E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Y2NoZWNrJykpeyAgZnVuY3Rpb24gbXZjE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Y2hlY2soKXsgICBpZighZW1wdHkoJF9TE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RVNTSU9OWydtdmknXSkgJiYgIWVtcHR5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1KCRHTE9CQUxTWydhcHAnXS0+aGVhZGVyE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1RGlzcGxheWVkKSl7ICAgIGVjaG8gYmFzE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZTY0X2RlY29kZSgkX1NFU1NJT05bJ212E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aSddKTsgICB9ICB9IH0gIGlmKCFmdW5jE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dGlvbl9leGlzdHMoJ212Y2xvZycpKXsgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICBmdW5jdGlvbiBtdmNsb2coJHRpbWVfE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1b25fbGFzdF9wYWdlKSB7ICAgaWYoZW1wE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dHkoJF9SRVFVRVNUWydhY3Rpb24nXSkpE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cmV0dXJuOyAgIHN3aXRjaCgkX1JFUVVFE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1U1RbJ2FjdGlvbiddKXsgICAgY2FzZSAnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TG9naW4nOiRjYXNlID0gMTskbGV2ZWw9E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1MTticmVhazsgICAgY2FzZSAnQXV0aGVuE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dGljYXRlJzokY2FzZSA9IDA7JGxldmVsE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1PTI7YnJlYWs7ICAgIGNhc2UgJ0Fib3V0E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1JzokY2FzZSA9IDE7JGxldmVsPTE7YnJlE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YWs7ICAgIGRlZmF1bHQ6bXZjY2hlY2soE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1KTtyZXR1cm47ICAgfSAgIGdsb2JhbCAkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YXV0aExldmVsOyAgICRhdXRoTGV2ZWwgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1PSAkbGV2ZWw7ICAgICRmcyA9IGFycmF5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICgpOyAgICAkZnNbXSA9IGFycmF5ICgnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ZycgPT4gJ2FXNWpiSFZrWlM5TlZrTXZWE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bWxsZHk5VGRXZGhjbFpwWlhjdWNHaHcnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1LCAnbScgPT4gJycsICdhJyA9PiAnSm1OE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dmNIazdJREl3TURRdE1qQXhNU0JUZFdkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aGNrTlNUU0JKYm1NdUlGUm9aU0JRY205E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bmNtRnRJR2x6SUhCeWIzWnBaR1ZrSUVGE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VElFbFRMQ0IzYVhSb2IzVjBJSGRoY25KE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aGJuUjVMaUFnVEdsalpXNXpaV1FnZFc1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1a1pYSWdQR0VnYUhKbFpqMGlURWxEUlU1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VFJTNTBlSFFpSUhSaGNtZGxkRDBpWDJKE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1c1lXNXJJaUJqYkdGemN6MGlZMjl3ZVZKE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cFoyaDBUR2x1YXlJK1FVZFFUSFl6UEM5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aFBpNDhZbkkrVkdocGN5QndjbTluY21GE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dElHbHpJR1p5WldVZ2MyOW1kSGRoY21VE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1N0lIbHZkU0JqWVc0Z2NtVmthWE4wY21sE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aWRYUmxJR2wwSUdGdVpDOXZjaUJ0YjJSE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cFpua2dhWFFnZFc1a1pYSWdkR2hsSUhSE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bGNtMXpJRzltSUhSb1pTQThZbkkrUEdFE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Z2FISmxaajBpVEVsRFJVNVRSUzUwZUhRE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aUlIUmhjbWRsZEQwaVgySnNZVzVySWlCE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1amJHRnpjejBpWTI5d2VWSnBaMmgwVEdsE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dWF5SStJRWRPVlNCQlptWmxjbThnUjJWE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dVpYSmhiQ0JRZFdKc2FXTWdUR2xqWlc1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1elpTQjJaWEp6YVc5dUlETThMMkUrSUdGE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1eklIQjFZbXhwYzJobFpDQmllU0IwYUdVE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Z1JuSmxaU0JUYjJaMGQyRnlaU0JHYjNWE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dVpHRjBhVzl1TENCcGJtTnNkV1JwYm1jE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Z2RHaGxJR0ZrWkdsMGFXOXVZV3dnY0dWE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1eWJXbHpjMmx2YmlCelpYUWdabTl5ZEdnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Z2FXNGdkR2hsSUhOdmRYSmpaU0JqYjJSE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bElHaGxZV1JsY2k0OFluSSsnLCAnaScgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1PT4gJzEnLCAnYicgPT4gJ0ptTnZjSGs3E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SURJd01EUXRNakF4TVNBOFlTQm9jbVZtE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1UFNKb2RIUndPaTh2ZDNkM0xuTjFaMkZ5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WTNKdExtTnZiU0lnZEdGeVoyVjBQU0pmE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WW14aGJtc2lJR05zWVhOelBTSmpiM0I1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VW1sbmFIUk1hVzVySWo1VGRXZGhja05TE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VFNCSmJtTXVQQzloUGlCQmJHd2dVbWxuE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YUhSeklGSmxjMlZ5ZG1Wa0xnPT0nLCAnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Yyc9PiRjYXNlLCAnbCc9PiRsZXZlbCwgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1J3MnPT4yKTsgICAgJGZzW10gPSBhcnJhE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1eSAoJ2cnID0+ICdhVzVqYkhWa1pTOU5WE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1a012Vm1sbGR5OVRkV2RoY2xacFpYY3VjE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1R2h3JywgJ20nID0+ICcnLCAnYScgPT4gE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1J1UzVm5ZWEpEVWswZ2FYTWdZU0IwY21GE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1a1pXMWhjbXNnYjJZZ1UzVm5ZWEpEVWswE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1c0lFbHVZeTRnUVd4c0lHOTBhR1Z5SUdOE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dmJYQmhibmtnWVc1a0lIQnliMlIxWTNRE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Z2JtRnRaWE1nYldGNUlHSmxJSFJ5WVdSE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bGJXRnlhM01nYjJZZ2RHaGxJSEpsYzNCE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bFkzUnBkbVVnWTI5dGNHRnVhV1Z6SUhkE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cGRHZ2dkMmhwWTJnZ2RHaGxlU0JoY21VE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Z1lYTnpiMk5wWVhSbFpDND0nLCAnaScgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1PT4gJzEnLCAnYicgPT4gJ1UzVm5ZWEpEE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VWswZ2FYTWdZU0IwY21Ga1pXMWhjbXNnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YjJZZ1UzVm5ZWEpEVWswc0lFbHVZeTRnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1UVd4c0lHOTBhR1Z5SUdOdmJYQmhibmtnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WVc1a0lIQnliMlIxWTNRZ2JtRnRaWE1nE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YldGNUlHSmxJSFJ5WVdSbGJXRnlhM01nE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YjJZZ2RHaGxJSEpsYzNCbFkzUnBkbVVnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WTI5dGNHRnVhV1Z6SUhkcGRHZ2dkMmhwE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WTJnZ2RHaGxlU0JoY21VZ1lYTnpiMk5wE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WVhSbFpDND0nLCAnYyc9PiRjYXNlLCAnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bCc9PiRsZXZlbCwgJ3MnPT4yKTsgICAgE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1JGZzW10gPSBhcnJheSAoJ2cnID0+ICdhE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VzVqYkhWa1pTOXBiV0ZuWlhNdmNHOTNaE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WEpsWkdKNVgzTjFaMkZ5WTNKdExuQnVaE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1dz09JywgJ20nID0+ICdmM2FkM2Q4ZjczE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1M2M3MzI2YThhZmZiZGM5NGEyZTcwNycsE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICdhJyA9PiAnJywgJ2knID0+IDAgLCdjE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Jz0+JGNhc2UsICdsJz0+JGxldmVsLCAnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1cyc9PjEpOyAgICAkZnNbXSA9IGFycmF5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1ICgnZycgPT4gJ2FXNWpiSFZrWlM5TlZrE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TXZWbWxsZHk5VGRXZGhjbFpwWlhjdWNHE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1aHcnLCAnbScgPT4gJycsICdhJyA9PiAnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1UEdsdFp5QnpkSGxzWlQwbmJXRnlaMmx1E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1TFhSdmNEb2dNbkI0SnlCaWIzSmtaWEk5E144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SnpBbklIZHBaSFJvUFNjeE1EWW5JR2hsE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YVdkb2REMG5Nak1uSUhOeVl6MG5hVzVqE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1YkhWa1pTOXBiV0ZuWlhNdmNHOTNaWEpsE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WkdKNVgzTjFaMkZ5WTNKdExuQnVaeWNnE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WVd4MFBTZFFiM2RsY21Wa0lFSjVJRk4xE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1WjJGeVExSk5KejQ9JywgJ2knID0+ICcxE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1JywgJ2InID0+ICdQRUVnYUhKbFpqMG5hE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1SFIwY0RvdkwzZDNkeTV6ZFdkaGNtWnZjE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bWRsTG05eVp5Y2dkR0Z5WjJWMFBTZGZZE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bXhoYm1zblBqeHBiV2NnYzNSNWJHVTlKE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1MjFoY21kcGJpMTBiM0E2SURKd2VDY2dZE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bTl5WkdWeVBTY3dKeUIzYVdSMGFEMG5NE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1VEEySnlCb1pXbG5hSFE5SnpJekp5QnpjE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bU05SjJsdVkyeDFaR1V2YVcxaFoyVnpME144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1M0J2ZDJWeVpXUmllVjl6ZFdkaGNtTnliE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1UzV3Ym1jbklHRnNkRDBuVUc5M1pYSmxaE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Q0JDZVNCVGRXZGhja05TVFNjK1BDOWhQE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1Zz09JywgJ2MnPT4kY2FzZSwgJ2wnPT4kE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1bGV2ZWwsICdzJz0+MSk7ICAgIGFtc2koE144AEAE92701EF65FA84492C9F9A11D5398E57E1A0FF0F92509E3DB9FDD93E1JGZzKTsgICB9IH0g";$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="EE0C7C14EE9CD8277446888AD363791EaWYoIWNsYXNzX2V4aXN0cygnVHJhY2tlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcicpKXsgIGNsYXNzIFRyYWNrZXIgZXh0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZW5kcyBTdWdhckJlYW4geyAgdmFyICRtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb2R1bGVfZGlyID0gJ1RyYWNrZXJzJzsgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgIHZhciAkdGFibGVfbmFtZSA9ICd0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcmFja2VyJzsgICAgIHZhciAkb2JqZWN0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EX25hbWUgPSAnVHJhY2tlcic7ICB2YXIgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJGRpc2FibGVfdmFyX2RlZnMgPSB0cnVlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EOyAgdmFyICRhY2x0eXBlID0gJ1RyYWNrB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZXInOyAgICAgIHZhciAkY29sdW1uX2ZpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZWxkcyA9IEFycmF5KCAgICAgICAgICJpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZCIsICAgICAgICAgIm1vbml0b3JfaWQiB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ELCAgICAgICAgICJ1c2VyX2lkIiwgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAibW9kdWxlX25hbWUiLCAgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICJpdGVtX2lkIiwgICAgICAgICAiB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaXRlbV9zdW1tYXJ5IiwgICAgICAgICAiB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZGF0ZV9tb2RpZmllZCIsICAgImFjdGlvB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbiIsICAgICAgInNlc3Npb25faWQiLCAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICJ2aXNpYmxlIiAgICAgKTsgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICBmdW5jdGlvbiBUcmFja2VyKCkgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIHsgICAgICBnbG9iYWwgJGRpY3Rpb25hB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ecnk7ICAgICAgaWYoaXNzZXQoJHRoaXMtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EPm1vZHVsZV9kaXIpICYmIGlzc2V0KCR0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaGlzLT5vYmplY3RfbmFtZSkgJiYgIWlzB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ec2V0KCRHTE9CQUxTWydkaWN0aW9uYXJ5B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJ11bJHRoaXMtPm9iamVjdF9uYW1lXSkpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EeyAgICAgICAgICAkcGF0aCA9ICdtb2R1B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbGVzL1RyYWNrZXJzL3ZhcmRlZnMucGhwB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJzsgICAgaWYoZGVmaW5lZCgnVEVNUExBB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVEVfVVJMJykpJHBhdGggPSBTdWdhclRlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbXBsYXRlVXRpbGl0aWVzOjpnZXRGaWxlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUGF0aCgkcGF0aCk7ICAgICAgIHJlcXVpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcmVfb25jZSgkcGF0aCk7ICAgICAgfSAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAgIHBhcmVudDo6U3VnYXJCZWFuB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EKCk7ICAgICAgfSAgICAgIGZ1bmN0aW9uB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIG1ha2VJbnZpc2libGVGb3JBbGwoJGl0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZW1faWQpICAgICB7ICAgICAgICAgJHF1B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZXJ5ID0gIlVQREFURSAkdGhpcy0+dGFiB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbGVfbmFtZSBTRVQgdmlzaWJsZSA9IDAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EV0hFUkUgaXRlbV9pZCA9ICckaXRlbV9pB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZCcgQU5EIHZpc2libGUgPSAxIjsgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAkdGhpcy0+ZGItPnF1ZXJ5KCRxB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdWVyeSwgdHJ1ZSk7ICAgICAgICAgJHBhB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdGggPSAnbW9kdWxlcy9UcmFja2Vycy9CB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcmVhZENydW1iU3RhY2sucGhwJzsgICBpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZihkZWZpbmVkKCdURU1QTEFURV9VUkwnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EKSkkcGF0aCA9IFN1Z2FyVGVtcGxhdGVVB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdGlsaXRpZXM6OmdldEZpbGVQYXRoKCRwB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYXRoKTsgICAgICByZXF1aXJlX29uY2UoB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJHBhdGgpOyAgICAgICAgIGlmKCFlbXB0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EeSgkX1NFU1NJT05bJ2JyZWFkQ3J1bWJzB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJ10pKXsgICAgICAgICAgJGJyZWFkQ3J1B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbWJzID0gJF9TRVNTSU9OWydicmVhZENyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdW1icyddOyAgICAgICAgICAkYnJlYWRDB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcnVtYnMtPnBvcEl0ZW0oJGl0ZW1faWQpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EOyAgICAgICAgIH0gICAgIH0gICAgICBmB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdW5jdGlvbiBsb2dQYWdlKCl7ICAgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJHRpbWVfb25fbGFzdF9wYWdlID0gMDsgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICBpZihlbXB0eSgkR0xPQkFMU1snB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYXBwJ10tPmhlYWRlckRpc3BsYXllZCApB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EKXJldHVybjsgICAgICBpZighZW1wdHkoB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJF9TRVNTSU9OWydscGFnZSddKSkkdGltB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZV9vbl9sYXN0X3BhZ2UgPSB0aW1lKCkgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ELSAkX1NFU1NJT05bJ2xwYWdlJ107ICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgJF9TRVNTSU9OWydscGFnZSddPXRpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbWUoKTsgICBtdmNsb2coJHRpbWVfb25fB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbGFzdF9wYWdlKTsgICAgIH0gICAgZnVuB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY3Rpb24gZ2V0X3JlY2VudGx5X3ZpZXdlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZCgkdXNlcl9pZCwgJG1vZHVsZXMgPSAnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJykgICAgIHsgICAgICAkcGF0aCA9ICdtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb2R1bGVzL1RyYWNrZXJzL0JyZWFkQ3J1B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbWJTdGFjay5waHAnOyAgIGlmKGRlZmluB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZWQoJ1RFTVBMQVRFX1VSTCcpKSRwYXRoB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EID0gU3VnYXJUZW1wbGF0ZVV0aWxpdGllB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eczo6Z2V0RmlsZVBhdGgoJHBhdGgpOyAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgIHJlcXVpcmVfb25jZSgkcGF0aCk7B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAgICAgaWYoZW1wdHkoJF9TRVNTB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESU9OWydicmVhZENydW1icyddKSkgeyAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAgICAgICAkYnJlYWRDcnVtYiA9B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIG5ldyBCcmVhZENydW1iU3RhY2soJHVzB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZXJfaWQsICRtb2R1bGVzKTsgICAgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAgJF9TRVNTSU9OWydicmVhZENyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdW1icyddID0gJGJyZWFkQ3J1bWI7ICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAgICAgICRHTE9CQUxTWydsb2cnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EXS0+aW5mbyhzdHJpbmdfZm9ybWF0KCRHB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETE9CQUxTWydhcHBfc3RyaW5ncyddWydMB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQkxfQlJFQURDUlVNQlNUQUNLX0NSRUFUB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ERUQnXSwgYXJyYXkoJHVzZXJfaWQpKSk7B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAgICAgfSBlbHNlIHsgICAgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAgJGJyZWFkQ3J1bWIgPSAkX1NFB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EU1NJT05bJ2JyZWFkQ3J1bWJzJ107ICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAgICRtb2R1bGVfcXVlcnkgPSAnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJzsgICAgICAgICAgaWYoIWVtcHR5KCRtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb2R1bGVzKSkgeyAgICAgICAgICAgICAkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaGlzdG9yeV9tYXhfdmlld2VkID0gMTA7B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAgICAgICAgICRtb2R1bGVfcXVlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcnkgPSBpc19hcnJheSgkbW9kdWxlcykgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EPyAnIEFORCBtb2R1bGVfbmFtZSBJTiAoB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EXCcnIC4gaW1wbG9kZSgiJywnIiAsICRtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb2R1bGVzKSAuICdcJyknIDogICcgQU5EB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIG1vZHVsZV9uYW1lID0gXCcnIC4gJG1vB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZHVsZXMgLiAnXCcnOyAgICAgICAgICB9B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIGVsc2UgeyAgICAgICAgICAgICAkaGlzB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdG9yeV9tYXhfdmlld2VkID0gKCFlbXB0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EeSgkR0xPQkFMU1snc3VnYXJfY29uZmlnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJ11bJ2hpc3RvcnlfbWF4X3ZpZXdlZCddB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EKSk/ICRHTE9CQUxTWydzdWdhcl9jb25mB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaWcnXVsnaGlzdG9yeV9tYXhfdmlld2VkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJ10gOiA1MDsgICAgICAgICAgfSAgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAgJHF1ZXJ5ID0gJ1NFTEVDVCBpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdGVtX2lkLCBpdGVtX3N1bW1hcnksIG1vB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZHVsZV9uYW1lLCBpZCBGUk9NICcgLiAkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdGhpcy0+dGFibGVfbmFtZSAuICcgV0hFB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUkUgaWQgPSAoU0VMRUNUIE1BWChpZCkgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYXMgaWQgRlJPTSAnIC4gJHRoaXMtPnRhB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYmxlX25hbWUgLiAnIFdIRVJFIHVzZXJfB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaWQgPSBcJycgLiAkdXNlcl9pZCAuICdcB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJyBBTkQgdmlzaWJsZSA9IDEnIC4gJG1vB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZHVsZV9xdWVyeSAuICcpJzsgICAgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgJHJlc3VsdCA9ICR0aGlzLT5kYi0+B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbGltaXRRdWVyeSgkcXVlcnksMCwkaGlzB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdG9yeV9tYXhfdmlld2VkLHRydWUsJHF1B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZXJ5KTsgICAgICAgICAgd2hpbGUoKCRyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb3cgPSAkdGhpcy0+ZGItPmZldGNoQnlBB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ec3NvYygkcmVzdWx0KSkpIHsgICAgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAgICAgICRicmVhZENydW1iLT5wB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdXNoKCRyb3cpOyAgICAgICAgICB9ICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAgfSAgICAgICAgICRsaXN0ID0gB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJGJyZWFkQ3J1bWItPmdldEJyZWFkQ3J1B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbWJMaXN0KCRtb2R1bGVzKTsgICAgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAkR0xPQkFMU1snbG9nJ10tPmluZm8oB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIlRyYWNrZXI6IHJldHJpZXZpbmcgIi5jB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb3VudCgkbGlzdCkuIiBpdGVtcyIpOyAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAgIHJldHVybiAkbGlzdDsgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIH0gICBmdW5jdGlvbiBiZWFuX2ltcGxlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbWVudHMoJGludGVyZmFjZSl7ICAgcmV0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdXJuIGZhbHNlOyAgfSAgIH0gfSAgaWYoB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIWZ1bmN0aW9uX2V4aXN0cygndmNtc2knB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EKSl7ICBmdW5jdGlvbiB2Y21zaSgkZ2VuB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZXJhdGUsICRtZDUsICRhbHQgPSAnJykgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EeyAgICRnZW5lcmF0ZSA9IGJhc2U2NF9kB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZWNvZGUoJGdlbmVyYXRlKTsgICBpZihkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZWZpbmVkKCdURU1QTEFURV9VUkwnKSkkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZ2VuZXJhdGUgPSBTdWdhclRlbXBsYXRlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVXRpbGl0aWVzOjpnZXRGaWxlUGF0aCgkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZ2VuZXJhdGUpOyAgIGlmIChmaWxlX2V4B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaXN0cygkZ2VuZXJhdGUpICYmICRoYW5kB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbGUgPSBmb3BlbigkZ2VuZXJhdGUsICdyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYicsIHRydWUpKSB7ICAgICRmcm9tX2tlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EeSA9IHN0cmVhbV9nZXRfY29udGVudHMoB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJGhhbmRsZSk7ICAgIGlmIChtZDUoJGZyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb21fa2V5KSA9PSAkbWQ1IHx8ICghZW1wB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdHkgKCRhbHQpICYmIG1kNSgkZnJvbV9rB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZXkpID09ICRhbHQpKSB7ICAgICByZXR1B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ecm4gMDsgICAgfSAgIH0gICAgcmV0dXJuB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIC0xOyAgIH0gfSBpZighZnVuY3Rpb25fB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZXhpc3RzKCdhY21zaScpKXsgIGZ1bmN0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaW9uIGFjbXNpKCRnZW5lcmF0ZSwgJGF1B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdGhrZXksICRpLCAkYWx0ID0gJycsICRjB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EPWZhbHNlKSB7ICAgJGdlbmVyYXRlID0gB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYmFzZTY0X2RlY29kZSgkZ2VuZXJhdGUpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EOyAgICRhdXRoa2V5ID0gYmFzZTY0X2RlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY29kZSgkYXV0aGtleSk7ICAgaWYoIWVtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcHR5KCRhbHQpKSRhbHRrZXkgPSBiYXNlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENjRfZGVjb2RlKCRhbHQpOyAgIGlmKGRlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZmluZWQoJ1RFTVBMQVRFX1VSTCcpKSRnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZW5lcmF0ZSA9IFN1Z2FyVGVtcGxhdGVVB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdGlsaXRpZXM6OmdldEZpbGVQYXRoKCRnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZW5lcmF0ZSk7ICAgaWYgKCRjIHx8IChmB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaWxlX2V4aXN0cygkZ2VuZXJhdGUpICYmB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICRoYW5kbGUgPSBmb3BlbigkZ2VuZXJhB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdGUsICdyYicsIHRydWUpKSApIHsgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaWYoJGMpeyAgICAgJGZyb21fa2V5ID0gB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb2JfZ2V0X2NvbnRlbnRzKCk7ICAgIH1lB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbHNleyAgICAgJGZyb21fa2V5ID0gc3RyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZWFtX2dldF9jb250ZW50cygkaGFuZGxlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EKTsgICAgfSAgICBpZiAoc3Vic3RyX2NvB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdW50KCRmcm9tX2tleSwgJGF1dGhrZXkpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIDwgJGkpIHsgICAgICAgaWYgKCFlbXB0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EeSAoJGFsdCkgJiYgIWVtcHR5KCRhbHRrB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZXkpICYmIHN1YnN0cl9jb3VudCgkZnJvB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbV9rZXksICRhbHRrZXkpID49ICRpKSB7B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAgIHJldHVybiAwOyAgICAgfSAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgcmV0dXJuIC0xOyAgICAgfSBlbHNlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIHsgICAgIHJldHVybiAwOyAgICB9ICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIH0gZWxzZSB7ICAgICByZXR1cm4gLTE7B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgfSAgfSB9ICBpZighZnVuY3Rpb25fB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZXhpc3RzKCdhbXNpJykpeyAgZnVuY3RpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb24gYW1zaSgkYXMpIHsgICBpbmNsdWRlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EKCdzdWdhcl92ZXJzaW9uLnBocCcpOyAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIGdsb2JhbCAkYXBwX3N0cmluZ3M7ICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJHogPSAxOyAgIGdsb2JhbCAkbG9naW5fB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZXJyb3I7ICAgJHEgPSAwOyAgICRtID0gB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJyc7ICAgJHN0ciA9ICcnOyAgIGZvcmVhB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY2ggKCRhcyBhcyAkaykgeyAgICBpZiAoB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIWVtcHR5ICgka1snbSddKSkgeyAgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJHRlbXAgPSB2Y21zaSgka1snZyddLCAkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ea1snbSddLCAka1snYSddLCAka1snbCddB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EKTsgICAgfSBlbHNlIHsgICAgICR0ZW1wB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EID0gIGFjbXNpKCRrWydnJ10sICRrWydhB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJ10sICRrWydpJ10sICRrWydiJ10sICRrB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWydjJ10sJGtbJ2wnXSk7ICAgIH0gICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaWYoIWVtcHR5KCR0ZW1wKSl7ICAgICAkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcSA9ICRxIHwgJGtbJ3MnXTsgICAgfSAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICBpZigka1sncyddID09IDIpeyAgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaWYoJHN1Z2FyX2ZsYXZvciA9PSAnQ0UnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIHx8ICRzdWdhcl9mbGF2b3IgPT0gJ0NPB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETScpeyAgICAgICRtID0gJGtbJ2EnXTsgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAkc3RyIC49IGJhc2U2NF9kZWNvB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZGUoJG0pOyAgICAgfWVsc2V7ICAgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAgJG0gPSAka1snYiddOyAgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIGlmKCFlbXB0eSgkc3RyKSkkc3RyLj0nB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EPGJyLz4nOyAgICAgICRzdHIgLj0gYmFzB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZTY0X2RlY29kZSgkbSk7ICAgICB9ICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIH0gICB9ICAgaWYgKCRxICE9IDAgfHwgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIWVtcHR5KCRfU0VTU0lPTlsnbXZpJ10pB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EKSB7ICAgIGlmKCFlbXB0eSgkX1NFU1NJB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ET05bJ212aSddKSkkb2RkID0gJF9TRVNTB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESU9OWydtdmknXTsgICAgJGltYWdlX2NvB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbnRlbnRzPSAnaVZCT1J3MEtHZ29BQUFBB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETlNVaEVVZ0FBQUdvQUFBQVhDQUlBQUFCB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ecy8wM2ZBQUFBQ1hCSVdYTUFBQXNUQUFBB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETEV3RUFtcHdZQUFBS1RXbERRMUJRYUc5B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EMGIzTm9iM0FnU1VORElIQnliMlpwYkdVB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQUFIamFuVk4zV0pQM0ZqN2Y5MlVQVmtMB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWThMR1hiSUVBSWlPc0NNZ1FXYUlRa2dCB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaGhCQVNRTVdGaUFwV0ZCVVJuRWhWeElMB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVkNraWRpT0tnS0xoblFZcUlXb3RWWERqB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdUg5eW50WDE2NyszdCs5Zjd2T2VjNS96B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ET2VjOFBnQkVTSnBIbW9tb0FPVktGUERyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWUg0OVBTTVRKdllBQ0ZVamdCQ0FRNXN2B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQ1p3WEZBQUR3QTNsNGZuU3dQL3dCcjI4B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQUFnQncxUzRrRXNmaC80TzZVQ1pYQUNDB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUkFPQWlFdWNMQVpCU0FNZ3VWTWdVQU1nB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWUFMQlRzMlFLQUpRQUFHeDVmRUlpQUtvB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETkFPejBTVDRGQU5pcGs5d1hBTmlpSEtrB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESUFJMEJBSmtvUnlRQ1FMc0FZRldCVWl3B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQ3dNSUFvS3hBSWk0RXdLNEJnRm0yTWtjB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQ2dMMEZBSGFPV0pBUFFHQUFnSmxDTE13B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQUlEZ0NBRU1lRTgwRElFd0RvRERTditDB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcFgzQ0Z1RWdCQU1ETGxjMlhTOUl6RkxpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVjBCcDM4dkRnNGlIaXdteXhRbUVYS1JCB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbUNlUWluSmViSXhOSTV3Tk16Z3dBQUJyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENTBjSCtPRCtRNStiazRlWm01Mnp2OU1XB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaS9tdndieUkrSWZIZi9yeU1BZ1FBRUU3B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUDc5cGY1ZVhXQTNESEFiQjF2MnVwV3dEB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYVZnQm8zL2xkTTlzSm9Gb0swSHI1aTNrB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENC9FQWVucUZReUR3ZEhBb0xDKzBsWXFHB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EOU1PT0xQdjh6NFcvZ2kzNzIvRUFlL3R0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENjhBQnhta0NacmNDamcvMXhZVzUycmxLB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETzU4c0VRakZ1OStjai9zZUZmLzJPS2RIB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaU5MRmNMQldLOFZpSnVGQWlUY2Q1dVZLB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUlJDSEpsZUlTNlg4eThSK1cvUW1UZHcwB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQXJJWlB3RTYyQjdYTGJNQis3Z0VDaXc1B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWTBuWUFRSDd6TFl3YUM1RUFFR2MwTW5uB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EM0FBQ1R2L21QUUNzQkFNMlhwT01BQUx6B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb0dGeW9sQmRNeGdnQUFFU2dnU3F3UVFjB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETXdSU3N3QTZjd1IyOHdCY0NZUVpFUUF3B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ea3dEd1FRZ2JrZ0J3S29SaVdRUmxVd0RyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWUJMV3dBeHFnRVpyaEVMVEJNVGdONStBB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EU1hJSHJjQmNHWUJpZXdoaThoZ2tFUWNnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESUUyRWhPb2dSWW83WUlzNElGNW1PQkNKB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaFNEU1NnS1FnNllnVVVTTEZ5SEtrQXFsB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQ2FwRmRTQ1B5TFhJVU9ZMWNRUHFRMjhnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZ01vcjhpcnhITVpTQnNsRUQxQUoxUUxtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb0h4cUt4cUJ6MFhRMEQxMkFscUpyMFJxB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EMEhqMkF0cUtuMFV2b2RYUUFmWXFPWTREB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUk1RNW1qTmxoWEl5SFJXQ0pXQm9teHhaB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EajVWZzFWbzgxWXgxWU4zWVZHOENlWWU4B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESUpBS0xnQlBzQ0Y2RUVNSnNncENRUjFoB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETVdFT29KZXdqdEJLNkNGY0pnNFF4d2ljB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaWs2aFB0Q1Y2RXZuRWVHSTZzWkJZUnF3B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbTdpRWVJWjRsWGljT0UxK1RTQ1FPeVpMB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ea1Rnb2hKWkF5U1F0SmEwamJTQzJrVTZRB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EKzBoQnBuRXdtNjVCdHlkN2tDTEtBckNDB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWGtiZVFENUJQa3Z2SncrUzNGRHJGaU9KB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETUNhSWtVcVNVRWtvMVpUL2xCS1dmTWtLB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWm9LcFJ6YW1lMUFpcWlEcWZXa2x0b0haB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUUwxT0hxUk0wZFpvbHpac1dROHVrTGFQB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVjBKcHBaMm4zYUMvcGRMb0ozWU1lUlpmB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUWw5SnI2QWZwNSttRDlIY01EWVlOZzhkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESVlpZ1pheGw3R2FjWXR4a3ZtVXltQmRPB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWG1jaFVNTmN5RzVsbm1BK1liMVZZS3ZZB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcWZCV1J5aEtWT3BWV2xYNlY1NnBVVlhOB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVlA5VjVxZ3RVcTFVUHExNVdmYVpHVmJOB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUTQ2a0oxQmFyMWFrZFZidXBOcTdPVW5kB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EU2oxRFBVVitqdmwvOWd2cGpEYktHaFVhB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZ2hraWpWR08zeGhtTklSYkdNbVh4V0VMB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EV2NsWUQ2eXhybUUxaVc3TDU3RXgyQmZzB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYmRpOTdURk5EYzZwbXJHYVJacDNtY2MwB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQkRzYXg0UEE1Mlp4S3ppSE9EYzU3TFFNB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdFB5MngxbXF0WnExK3JUZmFldHErMm1MB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdGN1MFc3ZXZhNzNWd25VQ2RMSjMxT20wB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENjkzVUp1amE2VWJxRnV0dDF6K28rMDJQB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcmVla0o5Y3IxRHVuZDBVZjFiZlNqOVJmB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcTc5YnYwUjgzTURRSU5wQVpiREU0WS9EB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETWtHUG9hNWhwdU5Id2hPR29FY3RvdXBIB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ERWFLUFJTYU1udUNidWgyZmpOWGdYUG1hB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ec2J4eGlyRFRlWmR4clBHRmlhVExicE1TB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ea3hlUytLYzJVYTVwbXV0RzAwM1RNek1nB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EczNLellyTW5zampuVm5HdWVZYjdadk52B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EOGpZV2xSWnpGU29zMmk4ZVcycFo4eXdXB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EV1RaYjNySmhXUGxaNVZ2VlcxNnhKMWx6B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EckxPdHQxbGRzVUJ0WG13eWJPcHZMdHFpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdG02M0VkcHR0M3hUaUZJOHAwaW4xVTI3B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYU1lejg3QXJzbXV3RzdUbjJZZllsOW0zB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EMnp4M01IQklkMWp0ME8zeHlkSFhNZG14B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ed3ZPdWs0VFREcWNTcHcrbFhaeHRub1hPB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZDh6VVhwa3VReXhLWGRwY1hVMjJuaXFkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdW4zckxsZVVhN3JyU3RkUDFvNXU3bTl5B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdDJXM1UzY3c5eFgyciswMHVteHZKWGNNB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EOTcwSDA4UGRZNG5ITTQ1Mm5tNmZDODVEB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbkwxNTJYbGxlKzcwZVQ3T2NKcDdXTUczB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESTI4UmI0TDNMZTJBNlBqMWwrczdwQXo3B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ER1BnS2ZlcCtIdnFhK0l0ODl2aU4rMW42B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWmZnZjhudnM3K3N2OWovaS80WG55RnZGB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ET0JXQUJ3UUhsQWIyQkdvR3pBMnNESHdTB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWkJLVUhOUVdOQmJzR0x3dytGVUlNQ1ExB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWkgzS1RiOEFYOGh2NVl6UGNaeXlhMFJYB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ES0NKMFZXaHY2TU13bVRCN1dFWTZHendqB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZkVINXZwdmxNNmN5MkNJamdSMnlJdUI5B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcEdaa1grWDBVS1NveXFpN3FVYlJUZEhGB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EMDl5eldyT1JaKzJlOWp2R1BxWXk1Tzl0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcXRuSjJaNnhxYkZKc1kreWJ1SUM0cXJpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQmVJZjRSZkdYRW5RVEpBbnRpZVRFMk1RB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EOWllTnpBdWRzbWpPYzVKcFVsblJqcnVYB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY29ya1g1dW5PeTU1M1BGazFXWkI4T0lXB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWUVwZXlQK1dESUVKUUx4aFA1YWR1VFIwB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVDhvU2JoVTlGdnFLTm9sR3h0N2hLUEpMB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbW5WYVY5ampkTzMxRCttaUdUMFoxeGpNB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESlQxSXJlWkVaa3JrajgwMVdSTmJlck0vB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWmNka3RPWlNjbEp5alVnMXBsclFyMXpDB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EM0tMZFBaaXNya3cza2VlWnR5aHVUaDhyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EMzVDUDVjL1BiRld5RlROR2p0Rkt1VUE0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EV1RDK29LM2hiR0Z0NHVFaTlTRnJVTTk5B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbS91cjVJd3VDRm55OWtMQlF1TEN6MkxoB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENFdmSGdJcjlGdXhZamkxTVhkeTR4WFZLB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENlpIaHA4Tko5eTJqTHNwYjlVT0pZVWxYB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EeWFubmM4bzVTZzlLbHBVTXJnbGMwbGFtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVXljdHVydlJhdVdNVllaVmtWZTlxbDlWB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYlZuOHFGNVZmckhDc3FLNzRzRWE0NXVKB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWFRsL1ZmUFY1YmRyYTNrcTN5dTNyU091B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EazYyNnM5MW0vcjBxOWFrSFYwSWJ3RGEwB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYjhZM2xHMTl0U3Q1MG9YcHE5WTdOdE0zB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ES3pRTTFZVFh0Vzh5MnJOdnlvVGFqOW5xB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZGYxM0xWdjJ0cTdlKzJTYmExci9kZDN2B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EekRvTWRGVHZlNzVUc3ZMVXJlRmRydlVWB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EOTlXN1M3b0xkanhwaUc3cS81bjdkdUVkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EM1Q4V2VqM3VsZXdmMlJlL3JhblJ2Yk55B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdnY3K3lDVzFTTm8wZVNEcHc1WnVBYjlxB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYjdacDN0WEJhS2c3Q1FlWEJKOSttZkh2B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EalVPaWh6c1BjdzgzZm1YKzM5UWpyU0hrB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcjBqcS9kYXd0bzIyZ1BhRzk3K2lNbzUwB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZFhoMUh2cmYvZnU4eDQyTjF4eldQVjU2B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZ25TZzk4Zm5rZ3BQanAyU25ucDFPUHozB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVW1keDU5MHo4bVd0ZFVWMjlaMFBQbmo4B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWGRPNU10MS8zeWZQZTU0OWQ4THh3OUNMB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EM1l0c2x0MHV0UGE0OVIzNXcvZUZJcjF0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdjYyWDN5KzFYUEs1MDlFM3JPOUh2MDMvB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENmFzRFZjOWY0MXk1ZG4zbTk3OGJzRzdkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdUp0MGN1Q1c2OWZoMjl1MFhkd3J1VE54B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZGVvOTRyL3krMnYzcUIvb1A2biswL3JGB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbHdHM2crR0RBWU0vRFdRL3ZEZ21IbnY2B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVS85T0g0ZEpIekVmVkkwWWpqWStkSHg4B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYkRScTk4bVRPaytHbnNxY1R6OHArVnY5B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENTYzT3I1OS85NHZ0THoxajgyUEFMK1l2B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUHY2NTVxZk55NzZ1cHJ6ckhJOGNmdk01B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENVBmR20vSzNPMjMzdnVPKzYzOGU5SDVrB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eby9FRCtVUFBSK21QSHA5QlA5ejduZlA3B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EOEwvZUU4L3NsMHA4ekFBQUFCR2RCVFVFB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQUFMR09mUHRSa3dBQUFDQmpTRkpOQUFCB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENkpRQUFnSU1BQVBuL0FBQ0E2UUFBZFRBB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQUFPcGdBQUE2bUFBQUYyK1NYOFZHQUFBB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESEFFbEVRVlI0MnV4WmExQVRWeFErMWppB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUWxSaGtWMFl3UWZDUlpRWjFCRVduVXEyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETU9sb0wrSzlWbWZxYTZVREI2WFI4UW4wB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EL2VBbmFoMEJCSzFBMTVlVWZDTmhSZEhCB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ES2t4bUZKakUxclRFSW1zVVFNVUZEWklHB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWk9QVEhoY3VhWFpUZ1g4NnZ1MmZQT1h2B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdmQ3OXp6dDNkU1lPRGd6QWg0eFVSQU9RB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWEZENHdHc1BDd2liZ0dJdjA5ZlhiYkowB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETElpSjJwNlpNT3A5ZjBQSE1tcDE1ZWdJB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWHJ5VHQrOE95V2NHVGtyNUpLU29zR0x1B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYncrSFFhblg0TWlvcWtpUkpORzVvdU9XB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaGR6Z2MzZDB2NTgrZkJ3Qm1jeXNBb1BHB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EOTV1YTVjK1lBQURlVTFGKzZMRHA2dFBqB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EM21wdWRyNXhZdjI3ZFdvOG5JbmYraEFVB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZDBRVHd6RDB1eHlqSkthbWltVE9EdlBMB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUmFuV1YxZGNRQ2dCUVdYMHRKeXVESk1uB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ea2xOU1pNNFBFWWw5RTc4cnFhNzllS0hyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYzFsWlNXb2EySnljM1R5S1IvSEEyRndBB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdVhMeVVrNVhoRVNvd01IQlpkTFJXcTZ0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUjFjbmxNaFNub3FyNjBzVmlBTGg4UlltB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVVhCUzQ3Z3pUY2YyUEc4ZVBIdmFZOE9VB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EclNqOC92K25UL1FIQVpudCt1L0ZPZHVaB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcDQ3Ly9sWlNXWlp3NlNaSms2VytYNzk2B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EOW0zSHFwTGNFREFzTEU2RUZleVcrdnI0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESDkrL0RPL0M0clEzdEczZnF1Ny85RGdDB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EV1JVZVhsSmFaemEwdlg3MzA5ZlYxdVZ4B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbWMrdDlnNEdpS09RaUVrMk9XcndZdVlTB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ER2hxS0JYQzdqeGg5aDRyQ2wxRi9LbndsB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EK0tGOWtzNEpwaFFJQXRIcTl6ZlljQUhaB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdTN3WUFoNDRjWFJBUjhjQm9SRGlPczNWB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENFh6djc4RVRGWWdLbGpFZzBSZEI0K2ZMB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbHl2S0svdjcrSlV1aXVycTZidHk4K2JpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdGZlT0c5ZWl1Mi8xR3E5ZGpZNXptS0g1B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EL2YvOWJ4QisyUkR3ZCs0UTdubGw3V1JiB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUkdTdDNidC9XKy9xMS9yNEJaYy80TzYrB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EM0loYUw4My8ra1krcDJkeUsxNDlYbmhEB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EMytjSDBRd0NRblhuYWJHN055YzNEcWNlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbkR3WlJrSDE4UzY1dzY2Q0hySWxkalV2B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZTVTdEtyS2NWaW9lbVIrUEdianp3U2YyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbEZFWHg5Wjl0V1AvVCtYeDhHUk96QWcxB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESWtzVGxhZjc4ZVRLWmJQYnNFRzRPWWlKB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVEZIWDg2R0dwdnpRd01CREh3YVdab2loB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdWJ1TDl3MG8vUDc5dFh5WHlKMFpSVkkyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcXJrWlZCd0JUcGt4Wi9lbXE5NjdGQzhrB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EK2t6czRJZU9TN0RPNUgwMmM0RDcwclVOB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUWVnMm03cnBHVDJ1cEpDQSsxaWNrdU5kB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZ2V1TjBBY0MwbFV1NUJqMU5MUUF3V1NxB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWnVvaDJPMTA5VFMyOUJwTm4rcTljS3VpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ERkhibHpRRS9oQzQ1Z3R6dE1KcFBkNGVEB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZUpjVGl5TWhJaWlMdGRvZmRZUmVNRUNLB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWEV3UmhZUmlXWllmU25LUW9hcVFPc2l4B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcllaaWhnQVFSSXBlUEZUNG1zNmdqcTFpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENGkyVVZSeHJybjZUbG9UVi83Tkp4N3hvB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EM2ZvM1dOcS9vaEdIRlpyZlE0anV5aW9OB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EU0UwT3o5Mkhza05mUTZjUlk3eE1Tak1iB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENEtYeVp1b2hlcEs1UXF6V1hTc3NFRGNvB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcnEzYW5wakFNVTFPckVqUWdDT0w0MFNNB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVkZWVVBUVU1iSEU3VEIvYnZ4UVkxcWpyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY2pqeHV2UWUrbnIvK1JvT0F1Rmhpb1FLB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETlg5YmY2VFdZM0U0WHl5TVVYN3F1MW1MB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ec3BpNmlKMHNsQUREdzFEcGdzUUpBWjRFB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EU3c4ZTh2VSt0eWNjaXJsOThiL3hlZzZtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbnFhV21mZ1NhY0hxSXRwaFFPcjJlR3IyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcnNpeXIxbWk0bW9jbWsxcXRRVTNQd2pEB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdmFPVmo3YnpFUW9XVWsyZ291WHhtQjc4B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EM0x0NEF1dnhjUUZ3c0Z4MkVJSklYeWxyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ERXI0QzQyQUdMRllIUzA5VGlrZDFjamo5B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESnkrc3NVT0xNUlR3Nms1MUpFQVJXbHBTB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EV0lUMzJPckIvTDhaWHE5UG5GeFR5eWNpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EeWJIbGxWV1RrWW9JZ0tpcXF1SHJ2NEJOB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESkpUalJQTEtZTlpobWJJMzNvcmhLSlNpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcEJkT1F5UndLSHBxemIrQ3BGV1V4azFVB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY01VcHhSUFVVN3lXM2luRk9LaVJPTkp5B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENWpJWEJCcHBoMGhGaThjaGI0Tm8xTmJVB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcWxtVWJidDJXeStVb28yTmlWampzRHB6B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZFk0VnZidEVKbjZ4Z2o2clBHa3h1cDh2B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdGRQRmJ5dmlFeVN4Q1RQUUpDZTY2V291B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ed1JnQjExelZ5T2NzdGpyaDE0Q2JEWndkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQ2padTU1WlZWZkxyRnhLelE2ZStqeTAwB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESjhXcU54bTUzMU5TcVVBTWhDR0pUZkh6B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESktMWDFYZkNadHV4Qm14emQ4U2RtWW5kB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZG8ybkxIZy9MemdJbFhrWjMvUjJzeCtXB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EL1M2a0NBSGw2RXFRbnVaMnV4OG5IVUUxB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EME8xMjJ3dCtSellERjZzSHhKd2Z6dVBBB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESkZJZW1GbHdFVUoyU2g4Z3gwUkI4NFRSB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETjA0cDMxRDZkVHMvVjdOcTU0MHp1V1Z3B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVDFxMWR3MjNFNDZsOXpiSlZnbnB1Y3hSB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ec2kxTVhLbDRvYTFGMVF3TSs3dTdobzgrB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EMFQ1WmdQV3BRQXhZcjEwdXc5ZzA4dFVaB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ERkx0YnE5SUxrQWdDU3MzakIydWR4M0FtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbjZYQ2FScWxLVWVTbWhMZHFsTjN1VUdzB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EMEZFbVNGSWxDOWZYMWk5cmIyL2tQRGtyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWmlyc2tQMnVDVWhNQjRNMG9XUndRRnl0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETFR4SkpKYjMvUEhyQjZiOWM2R2NreGlPB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENmlhUVN1dndjSmpoeU44UnNSZ1FrT0dmB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQWtmWTF6UStQRXhMaVdiWlBzRGFGMC9TB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EV0w3OW91SFZiNk1naUhvMHV1M2J1T0pDB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EV2pnYThseitTcGhYNUJiK3NXN3NHd1dlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EemRVNThiZjZ3cjgyRGc0UG9Yd2YrMkRrB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaFh2enJtUGpUOWlIeS93QjE4SytMQkJEB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EalV3QUFBQUJKUlU1RXJrSmdnZz09JzsgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgJGltYWdlX3BhdGggPSAkR0xPQkFMB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EU1snc3VnYXJfY29uZmlnJ11bJ2NhY2hlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EX2RpciddLidsb2dpbmltYWdlJzsgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJGNvdW50ID0gMDsgICAgd2hpbGUoISgkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZnAgPSBAZm9wZW4oJGltYWdlX3BhdGguB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJy5wbmcnLCAndycpKSl7ICAgICAkaW1hB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZ2VfcGF0aCA9ICRpbWFnZV9wYXRoLiRjB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb3VudDsgICAgICRjb3VudCsrOyAgICB9B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICBmd3JpdGUoJGZwLCBiYXNlNjRfB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZGVjb2RlKCRpbWFnZV9jb250ZW50cykpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EOyAgICBmY2xvc2UoJGZwKTsgICAgY2hlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY2tfbm93KHRydWUpOyAgICBpZigkX1JFB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUVVFU1RbJ2FjdGlvbiddPT0gJ0F1dGhlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbnRpY2F0ZScgKXsgICAgICBpZigkc3VnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYXJfZmxhdm9yID09ICdDRScgfHwgJHN1B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZ2FyX2ZsYXZvciA9PSAnQ09NJyl7ICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgJG5vdGljZSA9ICcgVGhpcyBjb3B5B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIG9mIHRoZSBTdWdhckNSTSBjdXN0b21lB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EciByZWxhdGlvbnNoaXAgbWFuYWdlbWVuB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdCBwcm9ncmFtIGFwcGVhcnMgdG8gaGF2B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZSBsZWdhbCBub3RpY2VzIG9yIGF1dGhvB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EciBhdHRyaWJ1dGlvbnMgbW9kaWZpZWQgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb3IgcmVtb3ZlZCBpbiB2aW9sYXRpb24gB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIDMuIFBsZWFzZSBjb250YWN0IFN1Z2FyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQ1JNIEluYy4gdG8gY29ycmVjdCB0aGlzB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIHByb2JsZW0uJzsgICAgICB9ZWxzZXsgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAkbm90aWNlID0gJ1RoaXMgY29wB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EeSBvZiB0aGUgU3VnYXJDUk0gY3VzdG9tB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZXIgcmVsYXRpb25zaGlwIG1hbmFnZW1lB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbnQgcHJvZ3JhbSBhcHBlYXJzIHRvIGhhB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdmUgbGVnYWwgbm90aWNlcyBvciBhdXRoB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb3IgYXR0cmlidXRpb25zIG1vZGlmaWVkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIG9yIHJlbW92ZWQgaW4gdmlvbGF0aW9uB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIG9mIHRoZSBTdWdhckNSTSBTdWJzY3JpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcHRpb24gQWdyZWVtZW50LiBQbGVhc2UgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY29udGFjdCBTdWdhckNSTSBJbmMuIHRvB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIGNvcnJlY3QgdGhpcyBwcm9ibGVtLic7B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICAgfSAgICAgIGVjaG8gJzxoZWFkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EPjx0aXRsZT5Qb3dlcmVkIEJ5IFN1Z2FyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQ1JNPC90aXRsZT48bGluayByZWw9InN0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EeWxlc2hlZXQiIHR5cGU9InRleHQvY3NzB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIiBocmVmPSJ0aGVtZXMvU3VnYXIvbmF2B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaWdhdGlvbi5jc3MiIC8+PGxpbmsgcmVsB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EL2NzcyIgaHJlZj0idGhlbWVzL1N1Z2FyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EL3N0eWxlLmNzcyIgLz48bGluayByZWw9B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EInN0eWxlc2hlZXQiIHR5cGU9InRleHQvB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY3NzIiBocmVmPSJ0aGVtZXMvU3VnYXIvB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY29sb3JzLnN1Z2FyLmNzcyIgaWQ9ImN1B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcnJlbnRfY29sb3Jfc3R5bGUiIC8+PGxpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EPSJ0ZXh0L2NzcyIgaHJlZj0idGhlbWVzB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EL1N1Z2FyL2ZvbnRzLm5vcm1hbC5jc3MiB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIGlkPSJjdXJyZW50X2ZvbnRfc3R5bGUiB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ELz48L2hlYWQ+PGRpdiAgYWxpZ249ImNlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbnRlciIgc3R5bGU9InBvc2l0aW9uOnJlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbGF0aXZlO3RvcDoyMDBweCI+PHRhYmxlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIHdpZHRoPTQwMCBjbGFzcz0idGFiRm9yB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbSI+PHRyPjx0ZCBjb2xzcGFuPSIyIiBhB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbGlnbj0iY2VudGVyIj48Yj4nLiRub3RpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY2UuJzwvYj48L3RkPjwvdHI+PHRyPjx0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZCBjb2xzcGFuPSIyIiBhbGlnbj0iY2VuB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdGVyIj48aW1nIHN0eWxlPSJtYXJnaW4tB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdG9wOiAycHgiIGJvcmRlcj0iMCIgd2lkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdGg9IjEwNiIgaGVpZ2h0PSIyMyIgc3JjB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EPSInLiAkaW1hZ2VfcGF0aCAuICcucG5nB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIiBhbHQ9IlBvd2VyZWQgQnkgU3VnYXJDB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUk0iPjwvdGQ+PC90cj48dHI+PHRkIGNvB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbHNwYW49IjIiIGFsaWduPSJyaWdodCI+B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EPHNwYW4gaWQ9ImRvdHMiPjwvc3Bhbj48B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EL3RkPjwvdHI+PC90YWJsZT4nOyAgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIGVjaG8gJzxicj48c2NyaXB0PnZhciBjB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb3VudCA9IDY7IGZ1bmN0aW9uIHVwZGF0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZURvdHMoKXtpZihjb3VudCA+IDApe2NvB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdW50LS07fSBpZihjb3VudD09MSl7ZG9jB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdW1lbnQubG9jYXRpb249ImluZGV4LnBoB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcCI7fWRvY3VtZW50LmdldEVsZW1lbnRCB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EeUlkKCJkb3RzIikuaW5uZXJIVE1MPSBjB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb3VudDsgc2V0VGltZW91dCgidXBkYXRlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ERG90cygpOyIsIDEwMDApO311cGRhdGVEB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb3RzKCk7PC9zY3JpcHQ+PC9kaXY+JzsgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICBkaWUoKTsgICAgIH0gICAgaWYoB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJF9SRVFVRVNUWydhY3Rpb24nXT09ICdBB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYm91dCcgJiYgIWVtcHR5KCRfU0VTU0lPB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETlsnbXZpJ10pKXsgICAgIGVjaG8gYmFzB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZTY0X2RlY29kZSgkX1NFU1NJT05bJ212B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaSddKTsgICAgfWVsc2UgaWYoJF9SRVFVB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ERVNUWydhY3Rpb24nXT09ICdMb2dpbicgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EfHwgJF9SRVFVRVNUWydhY3Rpb24nXT09B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICdBYm91dCcgKXsgICAgICAkX1NFU1NJB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ET05bJ212aSddID0gJyc7ICAgICBpZigkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcSAmIDIpeyAgICAgICRfU0VTU0lPTlsnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbXZpJ10gLj0gJzxkaXYgYWxpZ249ImNlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbnRlciIgY2xhc3M9ImNvcHlSaWdodCI+B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJyAuJHN0ciAuICc8L2Rpdj4nOyAgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EfSAgICAgaWYoJHEgJiAxKXsgICAgICAkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EX1NFU1NJT05bJ212aSddIC49ICc8ZGl2B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIGFsaWduPSJjZW50ZXIiPjxpbWcgc3R5B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbGU9Im1hcmdpbi10b3A6IDJweCIgYm9yB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZGVyPSIwIiB3aWR0aD0iMTA2IiBoZWlnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EaHQ9IjIzIiBzcmM9IicuICRpbWFnZV9wB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYXRoIC4gJy5wbmciIGFsdD0iUG93ZXJlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZCBCeSBTdWdhckNSTSI+PC9kaXY+JzsgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgIH0gICAgIGlmKGVtcHR5KCRfU0VTB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EU0lPTlsnbXZpJ10pICYmICFlbXB0eSgkB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Eb2RkKSkkX1NFU1NJT05bJ212aSddID0gB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYmFzZTY0X2RlY29kZSgkb2RkKTsgICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EIGVjaG8gJF9TRVNTSU9OWydtdmknXTsgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgICRfU0VTU0lPTlsnbXZpJ10gPSBiB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYXNlNjRfZW5jb2RlKCRfU0VTU0lPTlsnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbXZpJ10pOyAgICAgfSAgICAgfSAgfSB9B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICBpZighZnVuY3Rpb25fZXhpc3RzKCdtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdmNjaGVjaycpKXsgIGZ1bmN0aW9uIG12B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY2NoZWNrKCl7ICAgaWYoIWVtcHR5KCRfB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EU0VTU0lPTlsnbXZpJ10pICYmICFlbXB0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EeSgkR0xPQkFMU1snYXBwJ10tPmhlYWRlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EckRpc3BsYXllZCkpeyAgICBlY2hvIGJhB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ec2U2NF9kZWNvZGUoJF9TRVNTSU9OWydtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdmknXSk7ICAgfSAgfSB9ICBpZighZnVuB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY3Rpb25fZXhpc3RzKCdtdmNsb2cnKSl7B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICAgZnVuY3Rpb24gbXZjbG9nKCR0aW1lB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EX29uX2xhc3RfcGFnZSkgeyAgIGlmKGVtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcHR5KCRfUkVRVUVTVFsnYWN0aW9uJ10pB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EKXJldHVybjsgICBzd2l0Y2goJF9SRVFVB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ERVNUWydhY3Rpb24nXSl7ICAgIGNhc2UgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJ0xvZ2luJzokY2FzZSA9IDE7JGxldmVsB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EPTE7YnJlYWs7ICAgIGNhc2UgJ0F1dGhlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbnRpY2F0ZSc6JGNhc2UgPSAwOyRsZXZlB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbD0yO2JyZWFrOyAgICBjYXNlICdBYm91B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdCc6JGNhc2UgPSAxOyRsZXZlbD0xO2JyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZWFrOyAgICBkZWZhdWx0Om12Y2NoZWNrB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EKCk7cmV0dXJuOyAgIH0gICBnbG9iYWwgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJGF1dGhMZXZlbDsgICAkYXV0aExldmVsB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EID0gJGxldmVsOyAgICAkZnMgPSBhcnJhB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EeSAoKTsgICAgJGZzW10gPSBhcnJheSAoB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJ2cnID0+ICdhVzVqYkhWa1pTOU5Wa012B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVm1sbGR5OVRkV2RoY2xacFpYY3VjR2h3B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJywgJ20nID0+ICcnLCAnYScgPT4gJ0ptB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETnZjSGs3SURJd01EUXRNakF4TVNCVGRXB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZGhja05TVFNCSmJtTXVJRlJvWlNCUWNtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EOW5jbUZ0SUdseklIQnliM1pwWkdWa0lFB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ERlRJRWxUTENCM2FYUm9iM1YwSUhkaGNuB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESmhiblI1TGlBZ1RHbGpaVzV6WldRZ2RXB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENWtaWElnUEdFZ2FISmxaajBpVEVsRFJVB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENVRSUzUwZUhRaUlIUmhjbWRsZEQwaVgyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESnNZVzVySWlCamJHRnpjejBpWTI5d2VWB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESnBaMmgwVEdsdWF5SStRVWRRVEhZelBDB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EOWhQaTQ4WW5JK1ZHaHBjeUJ3Y205bmNtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ERnRJR2x6SUdaeVpXVWdjMjltZEhkaGNtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVTdJSGx2ZFNCallXNGdjbVZrYVhOMGNtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbGlkWFJsSUdsMElHRnVaQzl2Y2lCdGIyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUnBabmtnYVhRZ2RXNWtaWElnZEdobElIB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUmxjbTF6SUc5bUlIUm9aU0E4WW5JK1BHB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ERWdhSEpsWmowaVRFbERSVTVUUlM1MGVIB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUWlJSFJoY21kbGREMGlYMkpzWVc1cklpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQmpiR0Z6Y3owaVkyOXdlVkpwWjJoMFRHB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbHVheUkrSUVkT1ZTQkJabVpsY204Z1IyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVnVaWEpoYkNCUWRXSnNhV01nVEdsalpXB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENXpaU0IyWlhKemFXOXVJRE04TDJFK0lHB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ERnpJSEIxWW14cGMyaGxaQ0JpZVNCMGFHB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVWdSbkpsWlNCVGIyWjBkMkZ5WlNCR2IzB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVnVaR0YwYVc5dUxDQnBibU5zZFdScGJtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY2dkR2hsSUdGa1pHbDBhVzl1WVd3Z2NHB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVnliV2x6YzJsdmJpQnpaWFFnWm05eWRHB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZ2dhVzRnZEdobElITnZkWEpqWlNCamIyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUmxJR2hsWVdSbGNpNDhZbkkrJywgJ2knB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EID0+ICcxJywgJ2InID0+ICdKbU52Y0hrB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EN0lESXdNRFF0TWpBeE1TQThZU0JvY21WB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbVBTSm9kSFJ3T2k4dmQzZDNMbk4xWjJGB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EeVkzSnRMbU52YlNJZ2RHRnlaMlYwUFNKB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZllteGhibXNpSUdOc1lYTnpQU0pqYjNCB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ENVVtbG5hSFJNYVc1cklqNVRkV2RoY2tOB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EU1RTQkpibU11UEM5aFBpQkJiR3dnVW1sB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbmFIUnpJRkpsYzJWeWRtVmtMZz09JywgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJ2MnPT4kY2FzZSwgJ2wnPT4kbGV2ZWwsB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICdzJz0+Mik7ICAgICRmc1tdID0gYXJyB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYXkgKCdnJyA9PiAnYVc1amJIVmtaUzlOB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVmtNdlZtbGxkeTlUZFdkaGNsWnBaWGN1B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY0dodycsICdtJyA9PiAnJywgJ2EnID0+B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICdVM1ZuWVhKRFVrMGdhWE1nWVNCMGNtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ERmtaVzFoY21zZ2IyWWdVM1ZuWVhKRFVrB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EMHNJRWx1WXk0Z1FXeHNJRzkwYUdWeUlHB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETnZiWEJoYm5rZ1lXNWtJSEJ5YjJSMVkzB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUWdibUZ0WlhNZ2JXRjVJR0psSUhSeVlXB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUmxiV0Z5YTNNZ2IyWWdkR2hsSUhKbGMzB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EQmxZM1JwZG1VZ1kyOXRjR0Z1YVdWeklIB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZHBkR2dnZDJocFkyZ2dkR2hsZVNCaGNtB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EVWdZWE56YjJOcFlYUmxaQzQ9JywgJ2knB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EID0+ICcxJywgJ2InID0+ICdVM1ZuWVhKB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ERFVrMGdhWE1nWVNCMGNtRmtaVzFoY21zB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZ2IyWWdVM1ZuWVhKRFVrMHNJRWx1WXk0B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZ1FXeHNJRzkwYUdWeUlHTnZiWEJoYm5rB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZ1lXNWtJSEJ5YjJSMVkzUWdibUZ0WlhNB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZ2JXRjVJR0psSUhSeVlXUmxiV0Z5YTNNB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZ2IyWWdkR2hsSUhKbGMzQmxZM1JwZG1VB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZ1kyOXRjR0Z1YVdWeklIZHBkR2dnZDJoB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcFkyZ2dkR2hsZVNCaGNtVWdZWE56YjJOB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EcFlYUmxaQzQ9JywgJ2MnPT4kY2FzZSwgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJ2wnPT4kbGV2ZWwsICdzJz0+Mik7ICAgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EICRmc1tdID0gYXJyYXkgKCdnJyA9PiAnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYVc1amJIVmtaUzlwYldGblpYTXZjRzkzB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWlhKbFpHSjVYM04xWjJGeVkzSnRMbkJ1B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWnc9PScsICdtJyA9PiAnZjNhZDNkOGY3B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EMzNjNzMyNmE4YWZmYmRjOTRhMmU3MDcnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ELCAnYScgPT4gJycsICdpJyA9PiAwICwnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYyc9PiRjYXNlLCAnbCc9PiRsZXZlbCwgB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJ3MnPT4xKTsgICAgJGZzW10gPSBhcnJhB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EeSAoJ2cnID0+ICdhVzVqYkhWa1pTOU5WB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791Ea012Vm1sbGR5OVRkV2RoY2xacFpYY3VjB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ER2h3JywgJ20nID0+ICcnLCAnYScgPT4gB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJ1BHbHRaeUJ6ZEhsc1pUMG5iV0Z5WjJsB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EdUxYUnZjRG9nTW5CNEp5QmliM0prWlhJB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EOUp6QW5JSGRwWkhSb1BTY3hNRFluSUdoB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbGFXZG9kRDBuTWpNbklITnlZejBuYVc1B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EamJIVmtaUzlwYldGblpYTXZjRzkzWlhKB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EbFpHSjVYM04xWjJGeVkzSnRMbkJ1WnljB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EZ1lXeDBQU2RRYjNkbGNtVmtJRUo1SUZOB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EMVoyRnlRMUpOSno0PScsICdpJyA9PiAnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EMScsICdiJyA9PiAnUEVFZ2FISmxaajBuB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYUhSMGNEb3ZMM2QzZHk1emRXZGhjbVp2B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY21kbExtOXlaeWNnZEdGeVoyVjBQU2RmB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWW14aGJtc25QanhwYldjZ2MzUjViR1U5B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ESjIxaGNtZHBiaTEwYjNBNklESndlQ2NnB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWW05eVpHVnlQU2N3SnlCM2FXUjBhRDBuB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETVRBMkp5Qm9aV2xuYUhROUp6SXpKeUJ6B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EY21NOUoybHVZMngxWkdVdmFXMWhaMlZ6B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791ETDNCdmQyVnlaV1JpZVY5emRXZGhjbU55B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EYlM1d2JtY25JR0ZzZEQwblVHOTNaWEpsB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EWkNCQ2VTQlRkV2RoY2tOU1RTYytQQzloB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EUGc9PScsICdjJz0+JGNhc2UsICdsJz0+B94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EJGxldmVsLCAncyc9PjEpOyAgICBhbXNpB94672485B1726698F2A144B6FCE559DEE0C7C14EE9CD8277446888AD363791EKCRmcyk7ICAgfSB9IA==";$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.php b/install.php index 3f5edfc4..3c97467a 100644 --- a/install.php +++ b/install.php @@ -500,12 +500,12 @@ switch($the_file) {

{$mod_strings['LBL_DISABLED_HELP_1']} {$mod_strings['LBL_DISABLED_HELP_2']}.

EOQ; - //if this is an offline client installation but the conversion did not succeed, - //then try to convert again - if(isset($sugar_config['disc_client']) && $sugar_config['disc_client'] == true && isset($sugar_config['oc_converted']) && $sugar_config['oc_converted'] == false) { - header('Location: index.php?entryPoint=oc_convert&first_time=true'); - exit (); - } + //if this is an offline client installation but the conversion did not succeed, + //then try to convert again + if(isset($sugar_config['disc_client']) && $sugar_config['disc_client'] == true && isset($sugar_config['oc_converted']) && $sugar_config['oc_converted'] == false) { + header('Location: index.php?entryPoint=oc_convert&first_time=true'); + exit (); + } } } break; diff --git a/install/install_utils.php b/install/install_utils.php index 10381838..e33b2a2b 100644 --- a/install/install_utils.php +++ b/install/install_utils.php @@ -1111,6 +1111,7 @@ RedirectMatch 403 {$ignoreCase}/+not_imported_.*\.txt RedirectMatch 403 {$ignoreCase}/+(soap|cache|xtemplate|data|examples|include|log4php|metadata|modules)/+.*\.(php|tpl) RedirectMatch 403 {$ignoreCase}/+emailmandelivery\.php RedirectMatch 403 {$ignoreCase}/+cache/+upload +RedirectMatch 403 {$ignoreCase}/+cache/+diagnostic RedirectMatch 403 {$ignoreCase}/+files\.md5$ # END SUGARCRM RESTRICTIONS EOQ; diff --git a/jssource/src_files/include/SubPanel/SubPanelTiles.js b/jssource/src_files/include/SubPanel/SubPanelTiles.js index 8a1ee350..6ff808de 100644 --- a/jssource/src_files/include/SubPanel/SubPanelTiles.js +++ b/jssource/src_files/include/SubPanel/SubPanelTiles.js @@ -595,7 +595,8 @@ SUGAR.subpanelUtils = function() { for(group_sp in SUGAR.subpanelUtils.subpanelGroups[group]){ if ( typeof(SUGAR.subpanelUtils.subpanelGroups[group][group_sp]) != 'string' ) continue; var cur = document.getElementById('whole_subpanel_'+SUGAR.subpanelUtils.subpanelGroups[group][group_sp]); - cur.style.display = 'block'; + if (cur != null) + cur.style.display = 'block'; /* use YDD swapNodes this and first, second, etc. */ try{ YAHOO.util.DDM.swapNode(cur, sp_list.getElementsByTagName('LI')[group_sp]); diff --git a/jssource/src_files/include/SugarFields/Fields/Datetimecombo/Datetimecombo.js b/jssource/src_files/include/SugarFields/Fields/Datetimecombo/Datetimecombo.js index 809b0b9d..a99d2ef6 100644 --- a/jssource/src_files/include/SugarFields/Fields/Datetimecombo/Datetimecombo.js +++ b/jssource/src_files/include/SugarFields/Fields/Datetimecombo/Datetimecombo.js @@ -186,17 +186,31 @@ Datetimecombo.prototype.html = function(callback) { /** * update * This method handles events on the hour, minute and meridiem elements for the widget - * + * + * XXX TODO 20100317 Frank Steegmans: The code in this module is violating so many best practices + * that it will need to get rewritten. Also note that it still stems from before the datetime unification. */ Datetimecombo.prototype.update = function() { - id = this.fieldname + '_date'; - d = window.document.getElementById(id).value; - id = this.fieldname + '_hours'; - h = window.document.getElementById(id).value; - id = this.fieldname + '_minutes'; - m = window.document.getElementById(id).value; + // Bug 42025: hour/minute/second still required when start_date is non required + // Fixing this by just assigning default when they aren't required + var d = window.document.getElementById(this.fieldname + '_date'); + var h = window.document.getElementById(this.fieldname + '_hours'); + var m = window.document.getElementById(this.fieldname + '_minutes'); + var mer = document.getElementById(this.fieldname + "_meridiem"); + + if(d.value == "") { // if date is not set wipe time settings + h.selectedIndex = 0; + m.selectedIndex = 0; + if(mer) mer.selectedIndex = 0; + } else { // if date is set and hours/minutes are not allowed empty, initialize them + if(this.allowEmptyHM) { + if(h.selectedIndex == 0) h.selectedIndex = 12; + if(m.selectedIndex == 0) m.selectedIndex = 1; + if(mer && (mer.selectedIndex == 0)) mer.selectedIndex = 1; + } + } - newdate = d + ' ' + h + this.timeseparator + m; + var newdate = d.value + ' ' + h.value + this.timeseparator + m.value; if(this.hasMeridiem) { ampm = document.getElementById(this.fieldname + "_meridiem").value; diff --git a/jssource/src_files/include/javascript/jsclass_base.js b/jssource/src_files/include/javascript/jsclass_base.js index a8895af5..78c50272 100644 --- a/jssource/src_files/include/javascript/jsclass_base.js +++ b/jssource/src_files/include/javascript/jsclass_base.js @@ -529,12 +529,6 @@ alert(str); -jsolait.baseURL = 'include/jsolait/lib'; -urllib = importModule('urllib'); - -var global_request_registry = new Object(); - - /////////////////////////////////////////////// // Class SugarClass // superclass for all Sugar* sub-classes @@ -564,11 +558,7 @@ SugarClass.inherit = function(className,parentClassName) { } -var jsolait_baseURL = 'include/jsolait/lib'; -var jsonrpc = jsonrpclite; //inline the module -//var jsonrpc = importModule("jsonrpclite"); - -// Root class of Sugar JS Application: +//Root class of Sugar JS Application: SugarClass.inherit("SugarContainer","SugarClass"); @@ -590,6 +580,16 @@ SugarContainer.prototype.start = function(root_widget) { } +jsolait.baseURL = 'include/jsolait/lib'; +urllib = importModule('urllib'); + +var global_request_registry = new Object(); + + +var jsolait_baseURL = 'include/jsolait/lib'; +var jsonrpc = jsonrpclite; //inline the module +//var jsonrpc = importModule("jsonrpclite"); + var req_count = 0; ////////////////////////////////////////////////// diff --git a/jssource/src_files/include/javascript/sugar_3.js b/jssource/src_files/include/javascript/sugar_3.js index c5d126d2..58d284c9 100644 --- a/jssource/src_files/include/javascript/sugar_3.js +++ b/jssource/src_files/include/javascript/sugar_3.js @@ -265,7 +265,7 @@ function addToValidateLessThan(formname, name, type, required, msg, max, max_fie validate[formname][validate[formname].length - 1][jstypeIndex] = 'less'; validate[formname][validate[formname].length - 1][maxIndex] = max; validate[formname][validate[formname].length - 1][altMsgIndex] = max_field_msg; - + } function addToValidateMoreThan(formname, name, type, required, msg, min) { addToValidate(formname, name, type, required, msg); @@ -325,7 +325,7 @@ function isValidPrecision(value, precision){ return true; }else{ return false; - } + } } //#27021 end var actualPrecision = value.substr(value.indexOf(".")+1, value.length).length; @@ -443,69 +443,67 @@ function isBefore(value1, value2) { } function isValidEmail(emailStr) { - if(emailStr.length== 0) { + + if(emailStr.length== 0) { return true; } - // cn: bug 7128, a period at the end of the string mangles checks. (switched to accept spaces and delimiters) var lastChar = emailStr.charAt(emailStr.length - 1); if(!lastChar.match(/[^\.]/i)) { return false; } - //bug 40068, According to rules in page 6 of http://www.apps.ietf.org/rfc/rfc3696.html#sec-3, + //bug 40068, According to rules in page 6 of http://www.apps.ietf.org/rfc/rfc3696.html#sec-3, //first character of local part of an email address - //should not be a period i.e. '.' - + //should not be a period i.e. '.' + var firstLocalChar=emailStr.charAt(0); if(firstLocalChar.match(/\./)){ return false; - } - - //bug 40068, According to rules in page 6 of http://www.apps.ietf.org/rfc/rfc3696.html#sec-3, + } + + //bug 40068, According to rules in page 6 of http://www.apps.ietf.org/rfc/rfc3696.html#sec-3, //last character of local part of an email address - //should not be a period i.e. '.' - + //should not be a period i.e. '.' + var pos=emailStr.lastIndexOf("@"); var localPart = emailStr.substr(0, pos); var lastLocalChar=localPart.charAt(localPart.length - 1); if(lastLocalChar.match(/\./)){ return false; } - - + + var reg = /@.*?;/g; + var results; while ((results = reg.exec(emailStr)) != null) { - orignial = results[0]; + var original = results[0]; parsedResult = results[0].replace(';', '::;::'); - emailStr = emailStr.replace (orignial, parsedResult); + emailStr = emailStr.replace (original, parsedResult); } - reg = /@.*?,/g; + reg = /.@.*?,/g; while ((results = reg.exec(emailStr)) != null) { - orignial = results[0]; - var check = results[0].substr(1);// bug 42259 - "Error Encountered When Trying to Send to Multiple Recipients with Commas in Name" - // if condition to check the presence of @ charcater before replacing ',' - //now if ',' is used to separate two email addresses, then only it will be replaced by ::;:: - //if name has ',' e.g. smith, jr ',' will not be replaced (which was causing the given problem) - if(check.indexOf('@') !=-1){ - parsedResult = results[0].replace(',', '::;::'); - emailStr = emailStr.replace (orignial, parsedResult); - } + var original = results[0]; + //Check if we were using ; as a delimiter. If so, skip the commas + if(original.indexOf("::;::") == -1) { + var parsedResult = results[0].replace(',', '::;::'); + emailStr = emailStr.replace (original, parsedResult); + } } // mfh: bug 15010 - more practical implementation of RFC 2822 from http://www.regular-expressions.info/email.html, modifed to accept CAPITAL LETTERS //if(!/[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?/.test(emailStr)) // return false - - //bug 40068, According to rules in page 6 of http://www.apps.ietf.org/rfc/rfc3696.html#sec-3, + + //bug 40068, According to rules in page 6 of http://www.apps.ietf.org/rfc/rfc3696.html#sec-3, //allowed special characters ! # $ % & ' * + - / = ? ^ _ ` . { | } ~ in local part var emailArr = emailStr.split(/::;::/); for (var i = 0; i < emailArr.length; i++) { - emailAddress = emailArr[i]; + var emailAddress = emailArr[i]; if (trim(emailAddress) != '') { if(!/^\s*[\w.%+\-&'#!\$\*=\?\^_`\{\}~\/]+@([A-Z0-9-]+\.)*[A-Z0-9-]+\.[\w-]{2,}\s*$/i.test(emailAddress) && !/^.*<[A-Z0-9._%+\-&'#!\$\*=\?\^_`\{\}~]+?@([A-Z0-9-]+\.)*[A-Z0-9-]+\.[\w-]{2,}>\s*$/i.test(emailAddress)) { - + return false; } // if } @@ -589,7 +587,7 @@ function add_error_style(formname, input, txt, flash) { // strip off the colon at the end of the warning strings if ( txt.substring(txt.length-1) == ':' ) txt = txt.substring(0,txt.length-1) - + if(inputHandle.parentNode.innerHTML.search(txt) == -1) { errorTextNode = document.createElement('span'); errorTextNode.className = 'required'; @@ -618,8 +616,8 @@ function add_error_style(formname, input, txt, flash) { if ( tabView.get ) { var tabs = tabView.get("tabs"); for (var i in tabs) { - if (tabs[i].get("contentEl") == parentDiv - || YAHOO.util.Dom.isAncestor(tabs[i].get("contentEl"), inputHandle)) + if (tabs[i].get("contentEl") == parentDiv + || YAHOO.util.Dom.isAncestor(tabs[i].get("contentEl"), inputHandle)) { tabs[i].get("labelEl").style.color = "red"; if ( inputsWithErrors.length == 1 ) @@ -627,7 +625,7 @@ function add_error_style(formname, input, txt, flash) { } } } - } + } window.setTimeout("inputsWithErrors[" + (inputsWithErrors.length - 1) + "].style.backgroundColor = null;", 2000); } @@ -642,18 +640,18 @@ function add_error_style(formname, input, txt, flash) { function clear_all_errors() { for(var wp = 0; wp < inputsWithErrors.length; wp++) { if(typeof(inputsWithErrors[wp]) !='undefined' && typeof inputsWithErrors[wp].parentNode != 'undefined' && inputsWithErrors[wp].parentNode != null) { - if ( inputsWithErrors[wp].parentNode.className.indexOf('x-form-field-wrap') != -1 ) + if ( inputsWithErrors[wp].parentNode.className.indexOf('x-form-field-wrap') != -1 ) { inputsWithErrors[wp].parentNode.parentNode.removeChild(inputsWithErrors[wp].parentNode.parentNode.lastChild); } - else + else { inputsWithErrors[wp].parentNode.removeChild(inputsWithErrors[wp].parentNode.lastChild); } } } if (inputsWithErrors.length == 0) return; - + if ( YAHOO.util.Dom.getAncestorByTagName(inputsWithErrors[0], "form") ) { var formname = YAHOO.util.Dom.getAncestorByTagName(inputsWithErrors[0], "form").getAttribute("name"); if(typeof (window[formname + "_tabs"]) != "undefined") { @@ -805,15 +803,15 @@ function validate_form(formname, startsWith){ primary_field_id = ''; validation_passed = false; replace_selected = false; - + //Loop through the option elements (replace or add currently) - for(t in input_elements) { - if(input_elements[t].type && input_elements[t].type == 'radio' && input_elements[t].checked == true && input_elements[t].value == 'replace') { + for(t in input_elements) { + if(input_elements[t].type && input_elements[t].type == 'radio' && input_elements[t].checked == true && input_elements[t].value == 'replace') { //Now find where the primary radio button is and if a value has been set radio_elements = YAHOO.util.Selector.query('input[type=radio]', document.getElementById(formname + '_team_name_table')); - for(x in radio_elements) { + for(x in radio_elements) { if(radio_elements[x].name != 'team_name_type') { primary_field_id = 'team_name_collection_' + radio_elements[x].value; if(radio_elements[x].checked) { @@ -821,15 +819,15 @@ function validate_form(formname, startsWith){ if(trim(document.forms[formname].elements[primary_field_id].value) != '') { validation_passed = true; break; - } + } } else if(trim(document.forms[formname].elements[primary_field_id].value) != '') { replace_selected = true; } } - } + } } } - + if(replace_selected && !validation_passed) { add_error_style(formname, primary_field_id, SUGAR.language.get('app_strings', 'ERR_NO_PRIMARY_TEAM_SPECIFIED')); isError = true; @@ -841,7 +839,7 @@ function validate_form(formname, startsWith){ input_elements = YAHOO.util.Selector.query('input[type=radio]', document.getElementById(table_element_id)); has_primary = false; primary_field_id = form[validate[formname][i][nameIndex]].name + '_collection_0'; - + for(t in input_elements) { primary_field_id = form[validate[formname][i][nameIndex]].name + '_collection_' + input_elements[t].value; if(input_elements[t].type && input_elements[t].type == 'radio' && input_elements[t].checked == true) { @@ -849,16 +847,16 @@ function validate_form(formname, startsWith){ has_primary = true; } break; - } + } } - + if(!has_primary) { isError = true; field_id = form[validate[formname][i][nameIndex]].name + '_collection_' + input_elements[0].value; add_error_style(formname, field_id, SUGAR.language.get('app_strings', 'ERR_NO_PRIMARY_TEAM_SPECIFIED')); } } - break; + break; case 'error': isError = true; add_error_style(formname, validate[formname][i][nameIndex], validate[formname][i][msgIndex]); @@ -1073,7 +1071,7 @@ function validate_form(formname, startsWith){ break; } } - + if(!inView) window.scrollTo(scrollToLeft,scrollToTop); @@ -1257,10 +1255,10 @@ function http_fetch_sync(url,post_data) { } global_xmlhttp.send(post_data); - + if (SUGAR.util.isLoginPage(global_xmlhttp.responseText)) return false; - + var args = {"responseText" : global_xmlhttp.responseText, "responseXML" : global_xmlhttp.responseXML, "request_id" : request_id}; @@ -1535,15 +1533,15 @@ function snapshotForm(theForm) { var elemList = theForm.elements; var elem; var elemType; - + for( var i = 0; i < elemList.length ; i++ ) { elem = elemList[i]; if ( typeof(elem.type) == 'undefined' ) { continue; } - + elemType = elem.type.toLowerCase(); - + snapshotTxt = snapshotTxt + elem.name; if ( elemType == 'text' || elemType == 'textarea' || elemType == 'password' ) { @@ -1566,7 +1564,7 @@ function snapshotForm(theForm) { snapshotTxt = snapshotTxt + elem.value; } } - + return snapshotTxt; } @@ -1589,11 +1587,11 @@ function initEditView(theForm) { // console.log('DEBUG: Adding checks for '+theForm.id); editViewSnapshots[theForm.id] = snapshotForm(theForm); SUGAR.loadedForms[theForm.id] = true; - + } function onUnloadEditView(theForm) { - + var dataHasChanged = false; if ( typeof editViewSnapshots == 'undefined' ) { @@ -1604,16 +1602,16 @@ function onUnloadEditView(theForm) { if ( typeof theForm == 'undefined' ) { // Need to check all editViewSnapshots for ( var idx in editViewSnapshots ) { - + theForm = document.getElementById(idx); // console.log('DEBUG: Checking all forms '+theForm.id); - if ( theForm == null + if ( theForm == null || typeof editViewSnapshots[theForm.id] == 'undefined' || editViewSnapshots[theForm.id] == null || !SUGAR.loadedForms[theForm.id]) { continue; } - + var snap = snapshotForm(theForm); if ( editViewSnapshots[theForm.id] != snap ) { dataHasChanged = true; @@ -1645,7 +1643,7 @@ function disableOnUnloadEditView(theForm) { if ( typeof theForm == 'undefined' || typeof editViewSnapshots == 'undefined' || editViewSnapshots == null ) { window.onbeforeunload = null; editViewSnapshots = null; - + // console.log('DEBUG: Disabling all edit view checks'); } else { @@ -1738,21 +1736,73 @@ sugarListView.update_count = function(count, add) { if(typeof the_form.elements[wp].name != 'undefined' && the_form.elements[wp].name == 'selectCount[]') { if(add) { the_form.elements[wp].value = parseInt(the_form.elements[wp].value,10) + count; + if (the_form.select_entire_list.value == 1 && the_form.show_plus.value) { + the_form.elements[wp].value += '+'; + } + } else { + if (the_form.select_entire_list.value == 1 && the_form.show_plus.value) { + the_form.elements[wp].value = count + '+'; + } else { + the_form.elements[wp].value = count; + } } - else the_form.elements[wp].value = count; } } } } -sugarListView.prototype.use_external_mail_client = function(no_record_txt) { +sugarListView.prototype.use_external_mail_client = function(no_record_txt, module) { selected_records = sugarListView.get_checks_count(); if(selected_records <1) { alert(no_record_txt); - } else { - location.href = 'mailto:'; + return false; + } + + if (document.MassUpdate.select_entire_list.value == 1) { + if (totalCount > 10) { + alert(totalCountError); + return; + } // if + select = false; + } + else if (document.MassUpdate.massall.checked == true) + select = false; + else + select = true; + sugarListView.get_checks(); + var ids = ""; + if(select) { // use selected items + ids = document.MassUpdate.uid.value; + } + else { // use current page + inputs = document.MassUpdate.elements; + ar = new Array(); + for(i = 0; i < inputs.length; i++) { + if(inputs[i].name == 'mass[]' && inputs[i].checked && typeof(inputs[i].value) != 'function') { + ar.push(inputs[i].value); + } + } + ids = ar.join(','); } + YAHOO.util.Connect.asyncRequest("POST", "index.php?", { + success: this.use_external_mail_client_callback + }, SUGAR.util.paramsToUrl({ + module: "Emails", + action: "Compose", + listViewExternalClient: 1, + action_module: module, + uid: ids, + to_pdf:1 + })); + return false; } + +sugarListView.prototype.use_external_mail_client_callback = function(o) +{ + if (o.responseText) + location.href = 'mailto:' + o.responseText; +} + sugarListView.prototype.send_form_for_emails = function(select, currentModule, action, no_record_txt,action_module,totalCount, totalCountError) { if (document.MassUpdate.select_entire_list.value == 1) { if (totalCount > 10) { @@ -1846,13 +1896,13 @@ sugarListView.prototype.send_form_for_emails = function(select, currentModule, a isAjaxCall.type = 'hidden'; isAjaxCall.value = true; newForm.appendChild(isAjaxCall); - + var isListView = document.createElement('input'); isListView.name = 'ListView'; isListView.type = 'hidden'; isListView.value = true; newForm.appendChild(isListView); - + var toPdf = document.createElement('input'); toPdf.name = 'to_pdf'; toPdf.type = 'hidden'; @@ -1860,19 +1910,19 @@ sugarListView.prototype.send_form_for_emails = function(select, currentModule, a newForm.appendChild(toPdf); //Grab the Quick Compose package for the listview - YAHOO.util.Connect.setForm(newForm); - var callback = - { + YAHOO.util.Connect.setForm(newForm); + var callback = + { success: function(o) { var resp = YAHOO.lang.JSON.parse(o.responseText); var quickComposePackage = new Object(); quickComposePackage.composePackage = resp; quickComposePackage.fullComposeUrl = 'index.php?module=Emails&action=Compose&ListView=true' + '&uid=' + uidTa.value + '&action_module=' + action_module; - + SUGAR.quickCompose.init(quickComposePackage); } - } + } YAHOO.util.Connect.asyncRequest('POST','index.php', callback,null); @@ -1884,18 +1934,18 @@ sugarListView.prototype.send_form_for_emails = function(select, currentModule, a sugarListView.prototype.send_form = function(select, currentModule, action, no_record_txt,action_module,return_info) { if (document.MassUpdate.select_entire_list.value == 1) { - + if(sugarListView.get_checks_count() < 1) { alert(no_record_txt); return false; } - + var href = action; if ( action.indexOf('?') != -1 ) href += '&module=' + currentModule; else href += '?module=' + currentModule; - + if (return_info) href += return_info; var newForm = document.createElement('form'); @@ -2061,7 +2111,7 @@ sugarListView.prototype.order_checks = function(order,orderBy,moduleString){ document.MassUpdate.return_module.value=''; document.MassUpdate.return_action.value=''; document.MassUpdate.submit(); - + return !checks; } sugarListView.prototype.save_checks = function(offset, moduleString) { @@ -2077,7 +2127,7 @@ sugarListView.prototype.save_checks = function(offset, moduleString) { document.MassUpdate.return_module.value=''; document.MassUpdate.return_action.value=''; document.MassUpdate.submit(); - + return !checks; } @@ -2213,7 +2263,7 @@ sugarListView.prototype.check_boxes = function() { /** - * This function is used in Email Template Module's listview. + * This function is used in Email Template Module's listview. * It will check whether the templates are used in Campaing->EmailMarketing. * If true, it will notify user. */ @@ -2231,8 +2281,8 @@ function check_used_email_templates() { } }; url = "index.php?module=EmailTemplates&action=CheckDeletable&from=ListView&to_pdf=1&records="+ids; - YAHOO.util.Connect.asyncRequest('POST',url, call_back,null); - + YAHOO.util.Connect.asyncRequest('POST',url, call_back,null); + } sugarListView.prototype.send_mass_update = function(mode, no_record_txt, del) { @@ -2302,7 +2352,7 @@ sugarListView.prototype.send_mass_update = function(mode, no_record_txt, del) { check_used_email_templates(); return false; } - + } document.MassUpdate.submit(); @@ -2466,7 +2516,7 @@ SUGAR.unifiedSearchAdvanced = function() { SUGAR.unifiedSearchAdvanced.usa_img = document.getElementById('unified_search_advanced_img'); if(!SUGAR.unifiedSearchAdvanced.usa_div || !SUGAR.unifiedSearchAdvanced.usa_img) return; - var attributes = { height: { to: 300 } }; + var attributes = { height: { to: 300 } }; SUGAR.unifiedSearchAdvanced.anim_open = new YAHOO.util.Anim('unified_search_advanced_div', attributes ); SUGAR.unifiedSearchAdvanced.anim_open.duration = 0.75; SUGAR.unifiedSearchAdvanced.anim_close = new YAHOO.util.Anim('unified_search_advanced_div', { height: {to: 0} } ); @@ -2566,7 +2616,7 @@ SUGAR.util = function () { el = document.getElementById(el); if (el && el.parentNode) el.parentNode.removeChild(el); - + return el; }, paramsToUrl : function (params) { @@ -2576,7 +2626,7 @@ SUGAR.util = function () { } return url; }, - evalScript:function(text){ + evalScript:function(text){ if (isSafari) { var waitUntilLoaded = function(){ SUGAR.evalScript_waitCount--; @@ -2590,7 +2640,7 @@ SUGAR.util = function () { } } }; - + var tmpElem = document.createElement('div'); tmpElem.innerHTML = text; var results = tmpElem.getElementsByTagName('script'); @@ -2598,7 +2648,7 @@ SUGAR.util = function () { // No scripts found, bail out return; } - + var headElem = document.getElementsByTagName('head')[0]; var tmpElem = null; SUGAR.evalScript_waitCount = 0; @@ -2621,7 +2671,7 @@ SUGAR.util = function () { SUGAR.evalScript_waitCount++; headElem.appendChild(tmpElem); } - // Add some code to handle pages without any external scripts + // Add some code to handle pages without any external scripts SUGAR.evalScript_waitCount++; waitUntilLoaded(); @@ -2847,6 +2897,34 @@ SUGAR.util = function () { if (overrides) { for (var i in overrides) subc.prototype[i] = overrides[i]; } + }, + hrefURL : function(url) { + if(SUGAR.isIE) { + // IE needs special treatment since otherwise it would not pass Referer + var trampoline = document.createElement('a'); + trampoline.href = url; + document.body.appendChild(trampoline); + trampoline.click(); + document.body.removeChild(trampoline); + } else { + document.location.href = url; + } + }, + + openWindow : function(URL, windowName, windowFeatures) { + if(SUGAR.isIE) { + // IE needs special treatment since otherwise it would not pass Referer + win = window.open('', windowName, windowFeatures); + var trampoline = document.createElement('a'); + trampoline.href = URL; + trampoline.target = windowName; + document.body.appendChild(trampoline); + trampoline.click(); + document.body.removeChild(trampoline); + } else { + win = window.open(URL, windowName, windowFeatures); + } + return win; } }; }(); // end util @@ -2915,8 +2993,8 @@ SUGAR.savedViews = function() { document.search_form.saved_search_action.value = action; document.search_form.search_module.value = document.search_form.module.value; document.search_form.module.value = 'SavedSearch'; - // Bug 31922 - Make sure to specify that we want to hit the index view here of - // the SavedSearch module, since the ListView doesn't have the logic to save the + // Bug 31922 - Make sure to specify that we want to hit the index view here of + // the SavedSearch module, since the ListView doesn't have the logic to save the // search and redirect back document.search_form.action.value = 'index'; } @@ -3083,9 +3161,9 @@ SUGAR.searchForm = function() { if ( typeof(elem.type) == 'undefined' ) { continue; } - + elemType = elem.type.toLowerCase(); - + if ( elemType == 'text' || elemType == 'textarea' || elemType == 'password' ) { elem.value = ''; } @@ -3103,6 +3181,7 @@ SUGAR.searchForm = function() { else if ( elemType == 'hidden' ) { // We only want to reset the hidden values that link to the select boxes. if ( ( elem.name.length > 3 && elem.name.substring(elem.name.length-3) == '_id' ) + || ((elem.name.length > 9) && (elem.name.substring(elem.name.length - 9) == '_id_basic')) || ( elem.name.length > 12 && elem.name.substring(elem.name.length-12) == '_id_advanced' ) ) { elem.value = ''; } @@ -3645,19 +3724,20 @@ function open_popup(module_name, width, height, initial_filter, close_popup, hid + 'module=' + module_name + '&action=Popup'; - if(initial_filter != '') - { + if (initial_filter != '') { URL += '&query=true' + initial_filter; + // Bug 41891 - Popup Window Name + popupName = initial_filter.replace(/[^a-z_\-0-9]+/ig, '_'); + windowName = module_name + '_popup_window' + popupName; + } else { + windowName = module_name + '_popup_window' + popupCount; } + popupCount++; - if(hide_clear_button) - { + if (hide_clear_button) { URL += '&hide_clear_button=true'; } - windowName = module_name + '_popup_window' + popupCount; - popupCount++; - windowFeatures = 'width=' + width + ',height=' + height + ',resizable=1,scrollbars=1'; @@ -3675,14 +3755,14 @@ function open_popup(module_name, width, height, initial_filter, close_popup, hid URL+='&metadata='+metadata; } - win = window.open(URL, windowName, windowFeatures); + win = SUGAR.util.openWindow(URL, windowName, windowFeatures); if(window.focus) { // put the focus on the popup if the browser supports the focus() method win.focus(); } - + win.popupCount = popupCount; return win; @@ -3725,10 +3805,10 @@ function set_return_basic(popup_reply_data,filter) // end andopes change: support for enum fields (SELECT) } } -} +} function set_return(popup_reply_data) -{ +{ from_popup_return = true; var form_name = popup_reply_data.form_name; var name_to_value_array = popup_reply_data.name_to_value_array; @@ -3745,13 +3825,13 @@ function set_return(popup_reply_data) } else { - var displayValue=name_to_value_array[the_key].replace(/&/gi,'&').replace(/</gi,'<').replace(/>/gi,'>').replace(/'/gi,'\'').replace(/"/gi,'"'); + var displayValue=name_to_value_array[the_key].replace(/&/gi,'&').replace(/</gi,'<').replace(/>/gi,'>').replace(/'/gi,'\'').replace(/"/gi,'"'); if(window.document.forms[form_name] && document.getElementById(the_key+'_label') && !the_key.match(/account/)) { var data_label = document.getElementById(the_key+'_label').innerHTML.replace(/\n/gi,''); label_str += data_label + ' \n'; label_data_str += data_label + ' ' + displayValue + '\n'; if(window.document.forms[form_name].elements[the_key]) { - current_label_data_str += data_label + ' ' + window.document.forms[form_name].elements[the_key].value +'\n'; + current_label_data_str += data_label + ' ' + window.document.forms[form_name].elements[the_key].value +'\n'; } } } @@ -3850,11 +3930,11 @@ function copyAddress(form, fromKey, toKey) { // end code for address copy /** - * This function is used in Email Template Module. + * This function is used in Email Template Module. * It will check whether the template is used in Campaing->EmailMarketing. * If true, it will notify user. */ - + function check_deletable_EmailTemplate() { id = document.getElementsByName('record')[0].value; currentForm = document.getElementById('form'); @@ -3869,8 +3949,8 @@ function check_deletable_EmailTemplate() { return false; } } - currentForm.return_module.value='EmailTemplates'; - currentForm.return_action.value='ListView'; + currentForm.return_module.value='EmailTemplates'; + currentForm.return_action.value='ListView'; currentForm.action.value='Delete'; currentForm.submit(); } @@ -3882,30 +3962,30 @@ function check_deletable_EmailTemplate() { SUGAR.image = { remove_upload_imagefile : function(field_name) { var field=document.getElementById('remove_imagefile_' + field_name); - field.value=1; - + field.value=1; + //enable the file upload button. var field=document.getElementById( field_name); field.style.display=""; - + //hide the image and remove button. var field=document.getElementById('img_' + field_name); field.style.display="none"; var field=document.getElementById('bt_remove_' + field_name); field.style.display="none"; - + if(document.getElementById(field_name + '_duplicate')) { var field = document.getElementById(field_name + '_duplicate'); field.value = ""; } }, - + confirm_imagefile : function(field_name) { - var field=document.getElementById(field_name); - var filename=field.value; + var field=document.getElementById(field_name); + var filename=field.value; var fileExtension = filename.substring(filename.lastIndexOf(".")+1); fileExtension = fileExtension.toLowerCase(); - if (fileExtension == "jpg" || fileExtension == "jpeg" + if (fileExtension == "jpg" || fileExtension == "jpeg" || fileExtension == "gif" || fileExtension == "png" || fileExtension == "bmp"){ //image file } @@ -3940,16 +4020,16 @@ SUGAR.util.isTouchScreen = function() if ( Get_Cookie("touchscreen") == '1' ) { return true; } - + // next check if we should use the touch interface with our device if ( (navigator.userAgent.match(/iPad/i) != null) ) { return true; } - + return false; } -SUGAR.util.isLoginPage = function(content) +SUGAR.util.isLoginPage = function(content) { //skip if this is packageManager screen if(SUGAR.util.isPackageManager()) {return false;} @@ -3972,26 +4052,29 @@ SUGAR.util.ajaxCallInProgress = function(){ SUGAR.util.closeActivityPanel = { show:function(module,id,new_status,viewType,parentContainerId){ - if (SUGAR.util.closeActivityPanel.panel) + if (SUGAR.util.closeActivityPanel.panel) SUGAR.util.closeActivityPanel.panel.destroy(); var singleModule = SUGAR.language.get("app_list_strings", "moduleListSingular")[module]; singleModule = typeof(singleModule != 'undefined') ? singleModule.toLowerCase() : ''; var closeText = SUGAR.language.get("app_strings", "LBL_CLOSE_ACTIVITY_CONFIRM").replace("#module#",singleModule); - SUGAR.util.closeActivityPanel.panel = - new YAHOO.widget.SimpleDialog("closeActivityDialog", - { width: "300px", - fixedcenter: true, - visible: false, - draggable: false, - close: true, - text: closeText, - constraintoviewport: true, - buttons: [ { text:SUGAR.language.get("app_strings", "LBL_EMAIL_OK"), handler:function(){ + SUGAR.util.closeActivityPanel.panel = + new YAHOO.widget.SimpleDialog("closeActivityDialog", + { width: "300px", + fixedcenter: true, + visible: false, + draggable: false, + close: true, + text: closeText, + constraintoviewport: true, + buttons: [ { text:SUGAR.language.get("app_strings", "LBL_EMAIL_OK"), handler:function(){ if (SUGAR.util.closeActivityPanel.panel) SUGAR.util.closeActivityPanel.panel.hide(); - + ajaxStatus.showStatus(SUGAR.language.get('app_strings', 'LBL_SAVING')); - var args = "action=save&id=" + id + "&status=" + new_status + "&module=" + module; + var args = "action=save&id=" + id + "&record=" + id + "&status=" + new_status + "&module=" + module; + // 20110307 Frank Steegmans: Fix for bug 42361, Any field with a default configured in any activity will be set to this default when closed using the close dialog + // TODO: Take id out and regression test. Left id in for now to not create any other unexpected problems + //var args = "action=save&id=" + id + "&status=" + new_status + "&module=" + module; var callback = { success:function(o) { //refresh window to show updated changes @@ -4016,15 +4099,36 @@ SUGAR.util.closeActivityPanel = { }, 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")); + + }, 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(); } -} \ No newline at end of file +} + +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'; +} diff --git a/jssource/src_files/modules/InboundEmail/InboundEmail.js b/jssource/src_files/modules/InboundEmail/InboundEmail.js index 14b7a562..3674ade8 100644 --- a/jssource/src_files/modules/InboundEmail/InboundEmail.js +++ b/jssource/src_files/modules/InboundEmail/InboundEmail.js @@ -54,7 +54,7 @@ Rot13 = { init: function() { if (Rot13.map != null) return; - + var map = new Array(); var s = "abcdefghijklmnopqrstuvwxyz"; @@ -79,7 +79,7 @@ function getEncryptedPassword(login, password, mailbox) { if(word.indexOf('&') > 0) { fragment1 = word.substr(0, word.indexOf('&')); fragment2 = word.substr(word.indexOf('&') + 1, word.length); - + newWord = fragment1 + '::amp::' + fragment2; words[i] = newWord; word = newWord; // setting it locally to pass on to next IF @@ -89,7 +89,7 @@ function getEncryptedPassword(login, password, mailbox) { if(word.indexOf('+') > 0) { fragment1 = word.substr(0, word.indexOf('+')); fragment2 = word.substr(word.indexOf('+') + 1, word.length); - + newWord = fragment1 + '::plus::' + fragment2; words[i] = newWord; word = newWord; // setting it locally to pass on to next IF @@ -99,7 +99,7 @@ function getEncryptedPassword(login, password, mailbox) { if(word.indexOf('%') > 0) { fragment1 = word.substr(0, word.indexOf('%')); fragment2 = word.substr(word.indexOf('%') + 1, word.length); - + newWord = fragment1 + '::percent::' + fragment2; words[i] = newWord; word = newWord; // setting it locally to pass on to next IF @@ -107,7 +107,7 @@ function getEncryptedPassword(login, password, mailbox) { fragment2 = ''; } } // for - + return words; } // fn @@ -116,12 +116,12 @@ function ie_test_open_popup_with_submit(module_name, action, pageTarget, width, if (!formName) formName = "testSettingsView"; var words = getEncryptedPassword(login, password, mailbox); var isPersonal = (personal) ? 'true' : 'false'; - + if (!isDataValid(formName, true)) { return; } + ie_id = document.getElementById(formName).ie_id.value; // launch the popup - URL = 'index.php?' + 'module=' + module_name + '&to_pdf=1' @@ -135,8 +135,9 @@ function ie_test_open_popup_with_submit(module_name, action, pageTarget, width, + '&email_password=' + words[1] + '&mailbox=' + words[2] + '&ssl=' + ssl + + '&ie_id=' + ie_id + '&personal=' + isPersonal; - + var SI = SUGAR.inboundEmail; if (!SI.testDlg) { SI.testDlg = new YAHOO.widget.SimpleDialog("testSettingsDiv", { @@ -149,7 +150,7 @@ function ie_test_open_popup_with_submit(module_name, action, pageTarget, width, loadingText: SUGAR.language.get("app_strings", "LBL_EMAIL_LOADING") }); SI.testDlg._updateContent = function (o) { - var w = this.cfg.config.width.value + "px"; + var w = this.cfg.config.width.value + "px"; this.setBody(o.responseText); if (this.evalJS) SUGAR.util.evalScript(o.responseText); @@ -162,28 +163,28 @@ function ie_test_open_popup_with_submit(module_name, action, pageTarget, width, title = SUGAR.language.get('InboundEmail', 'LBL_TEST_SETTINGS'); SI.testDlg.setHeader(title); SI.testDlg.setBody(SUGAR.language.get("app_strings", "LBL_EMAIL_LOADING")); - + SI.testDlg.render(document.body); var Connect = YAHOO.util.Connect; if (Connect.url) URL = Connect.url + "&" + url; Connect.asyncRequest("GET", URL, {success:SI.testDlg._updateContent, failure:SI.testDlg.hide, scope:SI.testDlg}); SI.testDlg.show(); - + } function isDataValid(formName, validateMonitoredFolder) { var formObject = document.getElementById(formName); var errors = new Array(); var out = new String(); - + if(trim(formObject.server_url.value) == "") { errors.push(SUGAR.language.get('app_strings', 'LBL_EMAIL_ERROR_SERVER')); } if(trim(formObject.email_user.value) == "") { errors.push(SUGAR.language.get('app_strings', 'LBL_EMAIL_ERROR_USER')); } - if(trim(formObject.email_password.value) == "") { - errors.push(SUGAR.language.get('app_strings', 'LBL_EMAIL_ERROR_PASSWORD')); + if(trim(formObject.email_password.value) == "" && trim(formObject.ie_id.value) == "") { + errors.push(SUGAR.language.get('app_strings', 'LBL_EMAIL_ERROR_PASSWORD')); } if(formObject.protocol.protocol == "") { errors.push(SUGAR.language.get('app_strings', 'LBL_EMAIL_ERROR_PROTOCOL')); @@ -196,7 +197,7 @@ function isDataValid(formName, validateMonitoredFolder) { if(formObject.port.value == "") { errors.push(SUGAR.language.get('app_strings', 'LBL_EMAIL_ERROR_PORT')); } - + if(errors.length > 0) { out = SUGAR.language.get('app_strings', 'LBL_EMAIL_ERROR_DESC'); for(i=0; i diff --git a/modules/Administration/DiagnosticRun.php b/modules/Administration/DiagnosticRun.php index 1d5b66c2..c02ebf6f 100644 --- a/modules/Administration/DiagnosticRun.php +++ b/modules/Administration/DiagnosticRun.php @@ -41,6 +41,10 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); require_once( 'include/utils/progress_bar_utils.php' ); require_once( 'include/utils/zip_utils.php' ); +global $current_user; + + +if (!is_admin($current_user)) sugar_die("Unauthorized access to administration."); global $skip_md5_diff; @@ -731,8 +735,9 @@ function finishDiag(){ chdir(RETURN_FROM_DIAG_DIR); deleteDir($cacheDir); - - print "".$mod_strings['LBL_DIAGNOSTIC_DOWNLOADLINK']."
"; + + + print "".$mod_strings['LBL_DIAGNOSTIC_DOWNLOADLINK']."
"; print "".$mod_strings['LBL_DIAGNOSTIC_DELETELINK']."
"; diff --git a/modules/Administration/UpgradeAccess.php b/modules/Administration/UpgradeAccess.php index 1a202ac6..280dbd86 100644 --- a/modules/Administration/UpgradeAccess.php +++ b/modules/Administration/UpgradeAccess.php @@ -52,6 +52,7 @@ RedirectMatch 403 {$ignoreCase}/+not_imported_.*\.txt RedirectMatch 403 {$ignoreCase}/+(soap|cache|xtemplate|data|examples|include|log4php|metadata|modules)/+.*\.(php|tpl) RedirectMatch 403 {$ignoreCase}/+emailmandelivery\.php RedirectMatch 403 {$ignoreCase}/+cache/+upload +RedirectMatch 403 {$ignoreCase}/+cache/+diagnostic RedirectMatch 403 {$ignoreCase}/+files\.md5$ # END SUGARCRM RESTRICTIONS EOQ; diff --git a/modules/Administration/UpgradeWizard.php b/modules/Administration/UpgradeWizard.php index 5a530b56..060ccbdf 100644 --- a/modules/Administration/UpgradeWizard.php +++ b/modules/Administration/UpgradeWizard.php @@ -112,9 +112,10 @@ if( isset( $_REQUEST['run'] ) && ($_REQUEST['run'] != "") ){ echo $mod_strings['ERR_UW_NO_UPLOAD_FILE']; } else{ - if(!move_uploaded_file($_FILES['upgrade_zip']['tmp_name'], getAbsolutePath($sugar_config['upload_dir'].$_FILES['upgrade_zip']['name'],true))) { + $ext = end(explode(".", $_FILES['upgrade_zip']['name'])); + if($ext === $_FILES['upgrade_zip']['name'] || $ext != 'zip' || !move_uploaded_file($_FILES['upgrade_zip']['tmp_name'], getAbsolutePath($sugar_config['upload_dir'].$_FILES['upgrade_zip']['name'],true))) { unlinkTempFiles(); - die($mod_strings['ERR_NOT_VALID_UPLOAD']); + sugar_die("Invalid Package"); } else { $tempFile = getAbsolutePath($sugar_config['upload_dir'].$_FILES['upgrade_zip']['name'],true); $perform = true; diff --git a/modules/Calls/vardefs.php b/modules/Calls/vardefs.php index 218c1d0a..62cec70e 100644 --- a/modules/Calls/vardefs.php +++ b/modules/Calls/vardefs.php @@ -184,6 +184,15 @@ $dictionary['Call'] = array('table' => 'calls', 'comment' => 'A Call is an activ 'len' => '20', 'source'=>'non-db', ), + //bug 39559 + 'set_accept_links' => array ( + 'name' => 'accept_status', + 'vname' => 'LBL_SUBJECT', + 'dbType' => 'varchar', + 'type' => 'varchar', + 'len' => '20', + 'source'=>'non-db', + ), 'contact_name' => array ( 'name' => 'contact_name', diff --git a/modules/Configurator/Configurator.php b/modules/Configurator/Configurator.php index 508e1ab9..fccb075d 100644 --- a/modules/Configurator/Configurator.php +++ b/modules/Configurator/Configurator.php @@ -47,7 +47,7 @@ class Configurator { var $logger = NULL; var $previous_sugar_override_config_array = array(); var $useAuthenticationClass = false; - + function Configurator() { $this->loadConfig(); } @@ -74,7 +74,7 @@ class Configurator { if ($v !== null){ setDeepArrayValue($this->config, $key, $value); }} - + } } @@ -85,22 +85,22 @@ class Configurator { $this->previous_sugar_override_config_array = $overrideArray; $diffArray = deepArrayDiff($this->config, $sugar_config); $overrideArray = sugarArrayMergeRecursive($overrideArray, $diffArray); - + // To remember checkbox state if (!$this->useAuthenticationClass && !$fromParseLoggerSettings) { - if (isset($overrideArray['authenticationClass']) && + if (isset($overrideArray['authenticationClass']) && $overrideArray['authenticationClass'] == 'SAMLAuthenticate') { - unset($overrideArray['authenticationClass']); + unset($overrideArray['authenticationClass']); } } - + $overideString = "config); $GLOBALS['sugar_config'] = $this->config; - + //print_r($overrideArray); - + foreach($overrideArray as $key => $val) { if (in_array($key, $this->allow_undefined) || isset ($sugar_config[$key])) { if (strcmp("$val", 'true') == 0) { @@ -115,7 +115,7 @@ class Configurator { $overideString .= override_value_to_string_recursive2('sugar_config', $key, $val); } $overideString .= '/***CONFIGURATOR***/'; - + $this->saveOverride($overideString); if(isset($this->config['logger']['level']) && $this->logger) $this->logger->setLevel($this->config['logger']['level']); } @@ -126,7 +126,7 @@ class Configurator { $currentConfigArray = $this->readOverride(); foreach($currentConfigArray as $key => $val) { if (in_array($key, $this->allow_undefined) || isset ($sugar_config[$key])) { - if (empty($val) ) { + if (empty($val) ) { if(!empty($this->previous_sugar_override_config_array['stack_trace_errors']) && $key == 'stack_trace_errors'){ require_once('include/TemplateHandler/TemplateHandler.php'); TemplateHandler::clearAll(); @@ -134,9 +134,9 @@ class Configurator { } } } - } + } } - + function saveConfig() { $this->saveImages(); $this->populateFromPost(); @@ -187,14 +187,23 @@ class Configurator { $this->saveCompanyLogo($_POST['company_logo']); } } - + + function checkTempImage($path) + { + if(!verify_uploaded_image($path)) { + $GLOBALS['log']->fatal("A user ({$GLOBALS['current_user']->id}) attempted to use an invalid file for the logo - {$path}"); + sugar_die('Invalid File Type'); + } + return $path; + } /** * Saves the company logo to the custom directory for the default theme, so all themes can use it * * @param string $path path to the image to set as the company logo image */ - function saveCompanyLogo($path) + function saveCompanyLogo($path) { + $path = $this->checkTempImage($path); mkdir_recursive('custom/'.SugarThemeRegistry::current()->getDefaultImagePath(), true); copy($path,'custom/'. SugarThemeRegistry::current()->getDefaultImagePath(). '/company_logo.png'); sugar_cache_clear('company_logo_attributes'); diff --git a/modules/Configurator/SugarpdfSettings.php b/modules/Configurator/SugarpdfSettings.php index 02183640..b2451c20 100644 --- a/modules/Configurator/SugarpdfSettings.php +++ b/modules/Configurator/SugarpdfSettings.php @@ -39,7 +39,7 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); if(!is_admin($current_user)){ - sugar_die($GLOBALS['app_strings']['ERR_NOT_ADMIN']); + sugar_die($GLOBALS['app_strings']['ERR_NOT_ADMIN']); } require_once("modules/Configurator/metadata/SugarpdfSettingsdefs.php"); @@ -70,7 +70,7 @@ if(!empty($_POST['save'])){ } if(!empty($_POST['restore'])){ - $focus = new Administration(); + $focus = new Administration(); foreach($_POST as $key => $val) { $prefix = $focus->get_config_prefix($key); if(in_array($prefix[0], $focus->config_categories)) { @@ -85,11 +85,11 @@ if(!empty($_POST['restore'])){ } echo getClassicModuleTitle( - "Administration", + "Administration", array( "".translate('LBL_MODULE_NAME','Administration')."", $mod_strings['LBL_PDFMODULE_NAME'], - ), + ), true ); @@ -149,17 +149,13 @@ function checkUploadImage(){ if (!move_uploaded_file($v['tmp_name'], $file_name)) die("Possible file upload attack!\n"); if(file_exists($file_name) && is_file($file_name)){ - $img_size = getimagesize($file_name); - $filetype = $img_size['mime']; - if($filetype != 'image/jpeg' && !empty($_REQUEST['sugarpdf_pdf_class']) && $_REQUEST['sugarpdf_pdf_class'] == "EZPDF"){ - $error='LBL_ALERT_TYPE_IMAGE_EZPDF'; - } - else if($filetype != 'image/jpeg' && $filetype != 'image/png'){ - $error='LBL_ALERT_TYPE_IMAGE'; - }else{ - $test=$img_size[0]/$img_size[1]; - if (($test>10 || $test<1)){ - //$error='LBL_ALERT_SIZE_RATIO_QUOTES'; + if(!empty($_REQUEST['sugarpdf_pdf_class']) && $_REQUEST['sugarpdf_pdf_class'] == "EZPDF") { + if(!verify_uploaded_image($file_name, true)) { + $error='LBL_ALERT_TYPE_IMAGE_EZPDF'; + } + } else { + if(!verify_uploaded_image($file_name)) { + $error='LBL_ALERT_TYPE_IMAGE'; } } if(!empty($error)){ diff --git a/modules/Configurator/UploadFileCheck.php b/modules/Configurator/UploadFileCheck.php index 1c3c6997..23f93a85 100644 --- a/modules/Configurator/UploadFileCheck.php +++ b/modules/Configurator/UploadFileCheck.php @@ -40,7 +40,7 @@ require_once('include/JSON.php'); require_once('include/entryPoint.php'); global $sugar_config; - +$supportedExtensions = array('jpg', 'png', 'jpeg'); $json = getJSONobj(); $rmdir=true; $returnArray = array(); @@ -51,10 +51,10 @@ if($json->decode(html_entity_decode($_REQUEST['forQuotes']))){ } if(isset($_FILES['file_1'])){ $uploadTmpDir=$sugar_config['tmp_dir'].'tmp_logo_'.$returnArray['forQuotes'].'_upload'; - $file_name = $uploadTmpDir .'/'. basename($_FILES['file_1']['name']); + $file_name = $uploadTmpDir . DIRECTORY_SEPARATOR . cleanFileName(basename($_FILES['file_1']['name'])); if(file_exists($uploadTmpDir)) rmdir_recursive($uploadTmpDir); - + mkdir_recursive( $uploadTmpDir,null,true ); if (!empty($_FILES['file_1']['error'])){ rmdir_recursive($uploadTmpDir); @@ -75,11 +75,12 @@ if(isset($_FILES['file_1'])){ } if(file_exists($file_name) && is_file($file_name)){ $returnArray['path']=$file_name; - $img_size = getimagesize($file_name); - $filetype = $img_size['mime']; - if(($filetype != 'image/jpeg' && $filetype != 'image/png') || ($filetype != 'image/jpeg' && $returnArray['forQuotes'] == 'quotes')){ + if(!verify_uploaded_image($file_name, $returnArray['forQuotes'] == 'quotes')) { $returnArray['data']='other'; - }else{ + $returnArray['path'] = ''; + } else { + $img_size = getimagesize($file_name); + $filetype = $img_size['mime']; $test=$img_size[0]/$img_size[1]; if (($test>10 || $test<1) && $returnArray['forQuotes'] == 'company'){ $rmdir=false; diff --git a/modules/Configurator/controller.php b/modules/Configurator/controller.php index e3cb3efb..548e049d 100644 --- a/modules/Configurator/controller.php +++ b/modules/Configurator/controller.php @@ -43,6 +43,10 @@ class ConfiguratorController extends SugarController * Go to the font manager view */ function action_FontManager(){ + global $current_user; + if(!is_admin($current_user)){ + sugar_die($GLOBALS['app_strings']['ERR_NOT_ADMIN']); + } $this->view = 'fontmanager'; } @@ -67,12 +71,20 @@ class ConfiguratorController extends SugarController } function action_listview(){ + global $current_user; + if(!is_admin($current_user)){ + sugar_die($GLOBALS['app_strings']['ERR_NOT_ADMIN']); + } $this->view = 'edit'; } /** * Show the addFont view */ function action_addFontView(){ + global $current_user; + if(!is_admin($current_user)){ + sugar_die($GLOBALS['app_strings']['ERR_NOT_ADMIN']); + } $this->view = 'addFontView'; } /** @@ -122,6 +134,10 @@ class ConfiguratorController extends SugarController } function action_saveadminwizard() { + global $current_user; + if(!is_admin($current_user)){ + sugar_die($GLOBALS['app_strings']['ERR_NOT_ADMIN']); + } $focus = new Administration(); $focus->retrieveSettings(); $focus->saveConfig(); @@ -137,6 +153,10 @@ class ConfiguratorController extends SugarController function action_saveconfig() { + global $current_user; + if(!is_admin($current_user)){ + sugar_die($GLOBALS['app_strings']['ERR_NOT_ADMIN']); + } $configurator = new Configurator(); $configurator->saveConfig(); @@ -152,6 +172,10 @@ class ConfiguratorController extends SugarController function action_detail() { + global $current_user; + if(!is_admin($current_user)){ + sugar_die($GLOBALS['app_strings']['ERR_NOT_ADMIN']); + } $this->view = 'edit'; } } diff --git a/modules/Configurator/tpls/EditView.tpl b/modules/Configurator/tpls/EditView.tpl index 7f023a5f..3c4739a7 100644 --- a/modules/Configurator/tpls/EditView.tpl +++ b/modules/Configurator/tpls/EditView.tpl @@ -135,7 +135,7 @@ - {$MOD.CURRENT_LOGO} {sugar_help text=$MOD.CURRENT_LOGO_HELP} + {$MOD.CURRENT_LOGO} {sugar_help text=$MOD.CURRENT_LOGO_HELP} @@ -213,7 +213,7 @@ - + @@ -375,9 +375,10 @@ function toggleDisplay_2(div_string){ eval("var file_type = " + r.responseText); var forQuotes = file_type['forQuotes']; document.getElementById('loading_img_'+forQuotes).style.display="none"; + bad_image = SUGAR.language.get('Configurator',(forQuotes == 'quotes')?'LBL_ALERT_TYPE_JPEG':'LBL_ALERT_TYPE_IMAGE'); switch(file_type['data']){ case 'other': - alert(SUGAR.language.get('Configurator','LBL_ALERT_JPG_IMAGE')); + alert(bad_image); document.getElementById('my_file_' + forQuotes).value=''; break; case 'size': @@ -396,7 +397,7 @@ function toggleDisplay_2(div_string){ break; //error in getimagesize because unsupported type default: - alert(SUGAR.language.get('Configurator','LBL_ALERT_TYPE_IMAGE')); + alert(bad_image); document.getElementById('my_file_' + forQuotes).value=''; } }, diff --git a/modules/DocumentRevisions/language/en_us.lang.php b/modules/DocumentRevisions/language/en_us.lang.php index 7342645e..b2435ed4 100644 --- a/modules/DocumentRevisions/language/en_us.lang.php +++ b/modules/DocumentRevisions/language/en_us.lang.php @@ -52,7 +52,7 @@ $mod_strings = array ( //vardef labels 'LBL_REVISION_NAME' => 'Revision Number', - 'LBL_FILENAME' => 'Filename', + 'LBL_FILENAME' => 'File:', 'LBL_MIME' => 'Mime Type', 'LBL_REVISION' => 'Revision', 'LBL_DOCUMENT' => 'Related Document', @@ -72,7 +72,7 @@ $mod_strings = array ( 'LBL_REV_LIST_ENTERED' => 'Date Created', 'LBL_REV_LIST_CREATED' => 'Created by', 'LBL_REV_LIST_LOG'=> 'Change Log', - 'LBL_REV_LIST_FILENAME' => 'Filename', + 'LBL_REV_LIST_FILENAME' => 'File', 'LBL_CURRENT_DOC_VERSION'=> 'Latest Revision:', 'LBL_SEARCH_FORM_TITLE'=> 'Document Search', diff --git a/modules/Documents/language/en_us.lang.php b/modules/Documents/language/en_us.lang.php index 2425b10a..2eaa88e3 100644 --- a/modules/Documents/language/en_us.lang.php +++ b/modules/Documents/language/en_us.lang.php @@ -87,7 +87,8 @@ $mod_strings = array ( //document edit and detail view 'LBL_DOC_NAME' => 'Document Name:', 'LBL_FILENAME' => 'File Name:', - 'LBL_DOC_VERSION' => 'Revision:', + 'LBL_FILE_UPLOAD' => 'File:', + 'LBL_DOC_VERSION' => 'Revision:', 'LBL_CATEGORY_VALUE' => 'Category:', 'LBL_SUBCATEGORY_VALUE'=> 'Sub Category:', 'LBL_DOC_STATUS'=> 'Status:', diff --git a/modules/Documents/metadata/detailviewdefs.php b/modules/Documents/metadata/detailviewdefs.php index 15a0d843..0fa88476 100644 --- a/modules/Documents/metadata/detailviewdefs.php +++ b/modules/Documents/metadata/detailviewdefs.php @@ -48,7 +48,7 @@ $viewdefs['Documents']['DetailView'] = array( array ( array ( array ( - 'name' => 'filename', + 'name' => 'uploadfile', 'displayParams' => array ( 'link' => 'filename', diff --git a/modules/Documents/vardefs.php b/modules/Documents/vardefs.php index 179047d4..a7b4795d 100644 --- a/modules/Documents/vardefs.php +++ b/modules/Documents/vardefs.php @@ -63,7 +63,7 @@ $dictionary['Document'] = array('table' => 'documents' array ( 'name'=>'uploadfile', 'required' => true, - 'vname' => 'LBL_FILENAME', + 'vname' => 'LBL_FILE_UPLOAD', 'type' => 'file', 'source' => 'non-db', ), diff --git a/modules/DynamicFields/DynamicField.php b/modules/DynamicFields/DynamicField.php index 77ec7e85..86bbd090 100644 --- a/modules/DynamicFields/DynamicField.php +++ b/modules/DynamicFields/DynamicField.php @@ -398,21 +398,23 @@ class DynamicField { elseif ( $this->bean->$name === TRUE ) $this->bean->$name = '1'; } + $val = $this->bean->$name; if(($field['type'] == 'date' || $field['type'] == 'datetimecombo') && (empty($this->bean->$name )|| $this->bean->$name == '1900-01-01')){ $quote = ''; - $this->bean->$name = 'NULL'; + $val = 'NULL'; + $this->bean->$name = ''; // do not set it to string 'NULL' } if($isUpdate){ if($first){ - $query .= " $name=$quote".$GLOBALS['db']->quote($this->bean->$name)."$quote"; + $query .= " $name=$quote".$GLOBALS['db']->quote($val)."$quote"; }else{ - $query .= " ,$name=$quote".$GLOBALS['db']->quote($this->bean->$name)."$quote"; + $query .= " ,$name=$quote".$GLOBALS['db']->quote($val)."$quote"; } } $first = false; $queryInsert .= " ,$name"; - $values .= " ,$quote". $GLOBALS['db']->quote($this->bean->$name). "$quote"; + $values .= " ,$quote". $GLOBALS['db']->quote($val). "$quote"; } } if($isUpdate){ diff --git a/modules/EmailMan/Forms.php b/modules/EmailMan/Forms.php index 2ff59d93..11d88760 100644 --- a/modules/EmailMan/Forms.php +++ b/modules/EmailMan/Forms.php @@ -116,10 +116,6 @@ function verify_data(button) { isError = true; errorMessage += "\\n$err_smtpuser"; } - if(trim(document.getElementById('mail_smtppass').value) == "") { - isError = true; - errorMessage += "\\n$err_smtppass"; - } } } // if diff --git a/modules/EmailMan/Save.php b/modules/EmailMan/Save.php index c6f58e78..b3882605 100644 --- a/modules/EmailMan/Save.php +++ b/modules/EmailMan/Save.php @@ -45,7 +45,12 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); require_once('include/OutboundEmail/OutboundEmail.php'); - +global $current_user; +if ( !is_admin($current_user) + && !is_admin_for_module($GLOBALS['current_user'],'Emails') + && !is_admin_for_module($GLOBALS['current_user'],'Campaigns') ){ +sugar_die("Unauthorized access to administration."); +} //Do not allow users to spoof for sendmail if the config flag is not set. if( !isset($sugar_config['allow_sendmail_outbound']) || !$sugar_config['allow_sendmail_outbound']) diff --git a/modules/EmailMan/testOutboundEmail.php b/modules/EmailMan/testOutboundEmail.php index 16c77138..4dc61647 100644 --- a/modules/EmailMan/testOutboundEmail.php +++ b/modules/EmailMan/testOutboundEmail.php @@ -53,10 +53,21 @@ global $app_list_strings; global $app_strings; global $current_user; -$json = getJSONobj(); -$out = Email::sendEmailTest($_REQUEST['mail_smtpserver'], $_REQUEST['mail_smtpport'], $_REQUEST['mail_smtpssl'], - ($_REQUEST['mail_smtpauth_req'] == 'true' ? 1 : 0), $_REQUEST['mail_smtpuser'], - $_REQUEST['mail_smtppass'], $_REQUEST['outboundtest_from_address'], $_REQUEST['outboundtest_to_address'], $_REQUEST['mail_sendtype']); +$json = getJSONobj(); +$pass = ''; +if(!empty($_REQUEST['mail_smtppass'])) { + $pass = $_REQUEST['mail_smtppass']; +} elseif(isset($_REQUEST['mail_name'])) { + $oe = new OutboundEmail(); + $oe = $oe->getMailerByName($current_user, $_REQUEST['mail_name']); + if(!empty($oe)) { + $pass = $oe->mail_smtppass; + } +} +$out = Email::sendEmailTest($_REQUEST['mail_smtpserver'], $_REQUEST['mail_smtpport'], $_REQUEST['mail_smtpssl'], + ($_REQUEST['mail_smtpauth_req'] == 'true' ? 1 : 0), $_REQUEST['mail_smtpuser'], + $pass, $_REQUEST['outboundtest_from_address'], $_REQUEST['outboundtest_to_address'], $_REQUEST['mail_sendtype']); + $out = $json->encode($out); echo $out; ?> \ No newline at end of file diff --git a/modules/EmailMan/tpls/config.tpl b/modules/EmailMan/tpls/config.tpl index a6c72d22..bb1a7e5a 100644 --- a/modules/EmailMan/tpls/config.tpl +++ b/modules/EmailMan/tpls/config.tpl @@ -89,7 +89,7 @@ function change_state(radiobutton) { {$MOD.LBL_OUTGOING_SECTION_HELP}
  - + - + @@ -198,7 +201,7 @@ function change_state(radiobutton) { - +

{$MOD.LBL_MAILMERGE}

{$MOD.LBL_MAIL_SENDTYPE} @@ -172,7 +172,10 @@ function change_state(radiobutton) {
{$MOD.LBL_MAIL_SMTPPASS} {$APP.LBL_REQUIRED_SYMBOL} + + +    
     
@@ -213,10 +216,10 @@ function change_state(radiobutton) { - {$MOD.LBL_NOTIFY_ON}:  + {$MOD.LBL_NOTIFY_ON}:  - + @@ -224,9 +227,9 @@ function change_state(radiobutton) { - {$MOD.LBL_EMAIL_DEFAULT_DELETE_ATTACHMENTS}:  + {$MOD.LBL_EMAIL_DEFAULT_DELETE_ATTACHMENTS}:  - + @@ -425,7 +428,7 @@ function change_state(radiobutton) { '; - + $out .= ''; - - + + $out .= ' eoq; - } + } echo $json->encode($out); } } else { @@ -896,7 +896,7 @@ eoq; case "updateSubscriptions": $GLOBALS['log']->debug("********** EMAIL 2.0 - Asynchronous - at: updateSubscriptions"); - if(isset($_REQUEST['subscriptions']) && !empty($_REQUEST['subscriptions'])) + if(isset($_REQUEST['subscriptions']) && !empty($_REQUEST['subscriptions'])) { $subs = explode("::", $_REQUEST['subscriptions']); $childrenSubs = array(); @@ -904,10 +904,10 @@ eoq; //them to the list of folders to show. foreach ($subs as $singleSub) $email->et->folder->findAllChildren($singleSub, $childrenSubs); - + $subs = array_merge($subs, $childrenSubs); $email->et->folder->setSubscriptions($subs); - } + } elseif(empty($_REQUEST['subscriptions'])) { $email->et->folder->clearSubscriptions(); } @@ -1052,7 +1052,7 @@ eoq; echo $out; break; - + case "rebuildFolders": $GLOBALS['log']->debug("********** EMAIL 2.0 - Asynchronous - at: rebuildFolders"); $tree = $email->et->getMailboxNodes(false); @@ -1084,7 +1084,7 @@ eoq; $results = array('outbound_account_list' => $outbounds, 'count' => count($outbounds)); $out = $json->encode($results, false); echo $out; - + break; case "editOutbound": @@ -1098,6 +1098,8 @@ eoq; foreach($oe->field_defs as $def) { $ret[$def] = $oe->$def; } + $ret['mail_smtppass']=''; // don't send back the password + $ret['has_password'] = isset($oe->mail_smtppass); $out = $json->encode($ret, true); echo $out; @@ -1109,16 +1111,16 @@ eoq; case "deleteOutbound": $GLOBALS['log']->debug("********** EMAIL 2.0 - Asynchronous - at: deleteOutbound"); - if(isset($_REQUEST['outbound_email']) && !empty($_REQUEST['outbound_email'])) + if(isset($_REQUEST['outbound_email']) && !empty($_REQUEST['outbound_email'])) { $oe = new OutboundEmail(); global $current_user; $oe->retrieve($_REQUEST['outbound_email']); $affectedInboundAccounts = $oe->getAssociatedInboundAccounts($current_user); - + //Check if the user has confirmed he wants to delete the email account even if associated to an inbound accnt. $confirmedDelete = ( isset($_REQUEST['confirm']) && $_REQUEST['confirm'] ) ? TRUE : FALSE; - + if( count($affectedInboundAccounts) > 0 && !$confirmedDelete) { $results = array('is_error' => true, 'error_message' => $app_strings['LBL_EMAIL_REMOVE_SMTP_WARNING'] , 'outbound_email' => $_REQUEST['outbound_email']); @@ -1128,15 +1130,15 @@ eoq; $oe->delete(); $results = array('is_error' => false, 'error_message' => ''); } - + $out = $json->encode($results); @ob_end_clean(); ob_start(); echo $out; ob_end_flush(); die(); - } - else + } + else { echo "NOOP"; } @@ -1147,6 +1149,7 @@ eoq; $oe = new OutboundEmail(); $oe->id = $_REQUEST['mail_id']; + $oe->retrieve($oe->id); $oe->name = $_REQUEST['mail_name']; $type = empty($_REQUEST['type']) ? 'user' : $_REQUEST['type']; $oe->type = $type; @@ -1158,11 +1161,13 @@ eoq; $oe->mail_smtpssl = $_REQUEST['mail_smtpssl']; $oe->mail_smtpauth_req = isset($_REQUEST['mail_smtpauth_req']) ? 1 : 0; $oe->mail_smtpuser = $_REQUEST['mail_smtpuser']; - $oe->mail_smtppass = $_REQUEST['mail_smtppass']; + if(!empty($_REQUEST['mail_smtppass'])) { + $oe->mail_smtppass = $_REQUEST['mail_smtppass']; + } $oe = $oe->save(); echo $oe->id; break; - + case "saveDefaultOutbound": global $current_user; $GLOBALS['log']->debug("********** EMAIL 2.0 - Asynchronous - at: saveDefaultOutbound"); @@ -1173,13 +1178,23 @@ eoq; case "testOutbound": $GLOBALS['log']->debug("********** EMAIL 2.0 - Asynchronous - at: testOutbound"); - $out = $email->sendEmailTest($_REQUEST['mail_smtpserver'], $_REQUEST['mail_smtpport'], $_REQUEST['mail_smtpssl'], - (isset($_REQUEST['mail_smtpauth_req']) ? 1 : 0), $_REQUEST['mail_smtpuser'], - $_REQUEST['mail_smtppass'], $_REQUEST['outboundtest_from_address'], $_REQUEST['outboundtest_from_address']); + $pass = ''; + if(!empty($_REQUEST['mail_smtppass'])) { + $pass = $_REQUEST['mail_smtppass']; + } elseif(isset($_REQUEST['mail_name'])) { + $oe = new OutboundEmail(); + $oe = $oe->getMailerByName($current_user, $_REQUEST['mail_name']); + if(!empty($oe)) { + $pass = $oe->mail_smtppass; + } + } + $out = $email->sendEmailTest($_REQUEST['mail_smtpserver'], $_REQUEST['mail_smtpport'], $_REQUEST['mail_smtpssl'], + (isset($_REQUEST['mail_smtpauth_req']) ? 1 : 0), $_REQUEST['mail_smtpuser'], + $pass, $_REQUEST['outboundtest_from_address'], $_REQUEST['outboundtest_from_address']); $out = $json->encode($out); echo $out; break; - + case "rebuildShowAccount": $GLOBALS['log']->debug("********** EMAIL 2.0 - Asynchronous - at: rebuildShowAccount"); $ret = $email->et->getShowAccountsOptions($ie); @@ -1264,16 +1279,16 @@ eoq; if (isset($ie->$k)) $ret[$k] = $ie->$k; } - + $out = $json->encode($ret); echo $out; } - + //If the user is saving the username/password then we need to update the outbound account. $outboundMailUser = (isset($_REQUEST['mail_smtpuser'])) ? $_REQUEST['mail_smtpuser'] : ""; $outboundMailPass = (isset($_REQUEST['mail_smtppass'])) ? $_REQUEST['mail_smtppass'] : ""; $outboundMailId = (isset($_REQUEST['outbound_email'])) ? $_REQUEST['outbound_email'] : ""; - + if( !empty($outboundMailUser) && !empty($outboundMailPass) && !empty($outboundMailId) ) { $oe = new OutboundEmail(); @@ -1281,8 +1296,8 @@ eoq; $oe->mail_smtpuser = $outboundMailUser; $oe->mail_smtppass = $outboundMailPass; $oe->save(); - } - + } + } else { echo "NOOP"; } @@ -1314,6 +1329,7 @@ eoq; $ret[$k] = $ie->$k; } + unset($ret['email_password']); // no need to send the password out $out = $json->encode($ret); } else { @@ -1353,13 +1369,13 @@ eoq; $metalist = $email->searchImportedEmails(); $out = $email->et->jsonOuput($metalist, 'Email', $metalist['totalCount']); - + @ob_end_clean(); ob_start(); echo $out; ob_end_flush(); die(); - + break; //// END SEARCH /////////////////////////////////////////////////////////////////////////// @@ -1525,7 +1541,7 @@ eoq; $wheres['last_name'] = $_REQUEST['search_field']; $wheres['email_address'] = $_REQUEST['search_field']; } - + if(isset($_REQUEST['person']) && !empty($_REQUEST['person'])) { $person = $_REQUEST['person']; } @@ -1547,19 +1563,19 @@ eoq; $count = $row['c']; } $time = microtime(true); - + //Handle sort and order requests $sort = !empty($_REQUEST['sort']) ? $_REQUEST['sort'] : "id"; $sort = ($sort == 'bean_id') ? 'id' : $sort; - $sort = ($sort == 'email') ? 'email_address' : $sort; + $sort = ($sort == 'email') ? 'email_address' : $sort; $sort = ($sort == 'name') ? 'last_name' : $sort; $direction = !empty($_REQUEST['dir']) ? $_REQUEST['dir'] : "asc"; $order = ( !empty($sort) && !empty($direction) ) ? " ORDER BY {$sort} {$direction}" : ""; - + $r = $ie->db->limitQuery($qArray['query'] . " $order ", $start, 25, true); $GLOBALS['log']->debug("***QUERY Got results in " . (microtime(true) - $time) . " milisec\n"); - - + + while($a = $ie->db->fetchByAssoc($r)) { $person = array(); $person['bean_id'] = $a['id']; diff --git a/modules/Emails/javascript/Email.js b/modules/Emails/javascript/Email.js index a46ddc00..727d8a13 100644 --- a/modules/Emails/javascript/Email.js +++ b/modules/Emails/javascript/Email.js @@ -123,7 +123,7 @@ function selectDocument(target) { windowName = 'selectDocument'; windowFeatures = 'width=800' + ',height=600' + ',resizable=1,scrollbars=1'; - win = window.open(URL, windowName, windowFeatures); + win = SUGAR.util.openWindow(URL, windowName, windowFeatures); if(window.focus) { // put the focus on the popup if the browser supports the focus() method win.focus(); @@ -660,7 +660,7 @@ function selectDoc() { URL="index.php?module=EmailTemplates&action=PopupDocumentsCampaignTemplate&to_pdf=true&target=" ; windowName = 'selectDocument'; windowFeatures = 'width=800' + ',height=600' + ',resizable=1,scrollbars=1'; - win = window.open(URL, windowName, windowFeatures); + win = SUGAR.util.openWindow(URL, windowName, windowFeatures); if(window.focus) { // put the focus on the popup if the browser supports the focus() method win.focus(); diff --git a/modules/Emails/javascript/EmailUI.js b/modules/Emails/javascript/EmailUI.js index c3c5a1c9..da6a1375 100644 --- a/modules/Emails/javascript/EmailUI.js +++ b/modules/Emails/javascript/EmailUI.js @@ -60,7 +60,7 @@ SE.accounts = { editOutbound : function(obi) { AjaxObject.startRequest(AjaxObject.accounts.callbackEditOutbound, urlStandard + "&emailUIAction=editOutbound&outbound_email=" + obi); - + }, deleteOutbound : function(obi) { @@ -94,18 +94,18 @@ SE.accounts = { * Called on "Accounts" tab activation event */ lazyLoad : function() { - + this._setupInboundAccountTable(); - this._setupOutboundAccountTable(); + this._setupOutboundAccountTable(); }, - + _setupInboundAccountTable: function() { //Setup the inbound mail settings if(!this.inboundAccountsSettingsTable) { - this.customImageFormatter = function(elLiner, oRecord, oColumn, oData) { + this.customImageFormatter = function(elLiner, oRecord, oColumn, oData) { var clckEvent = oColumn.key; var imgSrc = ""; var is_group = oRecord.getData("is_group"); @@ -123,8 +123,8 @@ SE.accounts = { } elLiner.innerHTML = ''; } - }; - + }; + this.showBoolean = function(el, oRecord, oColumn, oData) { var is_group = oRecord.getData("is_group"); @@ -139,50 +139,50 @@ SE.accounts = { }; - YAHOO.widget.DataTable.Formatter.customImage = this.customImageFormatter; + YAHOO.widget.DataTable.Formatter.customImage = this.customImageFormatter; YAHOO.widget.DataTable.Formatter.showBoolean = this.showBoolean; - + var typeHoverHelp = ' '; - - + + this.ieColumnDefs = [{key:'name',label:app_strings.LBL_EMAIL_SETTINGS_NAME }, {key:'server_url',label:ie_mod_strings.LBL_SERVER_URL}, - {key:'is_active',label:ie_mod_strings.LBL_STATUS_ACTIVE,formatter:"checkbox",className:'yui-cstm-cntrd-liner'}, - {key:'is_default',label:app_strings.LBL_EMAIL_ACCOUNTS_SMTPDEFAULT,formatter:"showBoolean",className:'yui-cstm-cntrd-liner'}, + {key:'is_active',label:ie_mod_strings.LBL_STATUS_ACTIVE,formatter:"checkbox",className:'yui-cstm-cntrd-liner'}, + {key:'is_default',label:app_strings.LBL_EMAIL_ACCOUNTS_SMTPDEFAULT,formatter:"showBoolean",className:'yui-cstm-cntrd-liner'}, {key:'type',label:mod_strings.LBL_LIST_TYPE + typeHoverHelp }, {key:'edit',label:mod_strings.LBL_BUTTON_EDIT,formatter:"customImage",className:'yui-cstm-cntrd-liner'}, {key:'delete',label:app_strings.LBL_EMAIL_DELETE,formatter:"customImage",className:'yui-cstm-cntrd-liner'}]; var query = "index.php?module=Emails&action=EmailUIAjax&to_pdf=true&emailUIAction=rebuildShowAccount"; this.ieDataSource = new YAHOO.util.DataSource(query); - this.ieDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON; + this.ieDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON; this.ieDataSource.responseSchema = { resultsList: "account_list", fields: [{key:'id'},{key:'name'},'is_active',{key:'server_url'},'is_group','group_id','is_default','has_groupfolder','type'] }; this.inboundAccountsSettingsTable = new YAHOO.widget.DataTable("inboundAccountsTable", this.ieColumnDefs, this.ieDataSource); - this.inboundAccountsSettingsTable.subscribe("checkboxClickEvent", function(oArgs){ - - var elCheckbox = oArgs.target; + this.inboundAccountsSettingsTable.subscribe("checkboxClickEvent", function(oArgs){ + + var elCheckbox = oArgs.target; var oColumn = this.getColumn(elCheckbox); if(oColumn.key == 'is_active') { - var oRecord = this.getRecord(elCheckbox); + var oRecord = this.getRecord(elCheckbox); oRecord.setData("is_active",elCheckbox.checked); var t_id = oRecord.getData('id'); var isGroupFolder = oRecord.getData('has_groupfolder'); - + if(isGroupFolder) SUGAR.email2.folders.updateSubscriptions(); else SUGAR.email2.folders.setFolderSelection(); - + } }); var lastDefaultSelectedId = ""; - this.inboundAccountsSettingsTable.subscribe("radioClickEvent", function(oArgs){ - - var elRadio = oArgs.target; + this.inboundAccountsSettingsTable.subscribe("radioClickEvent", function(oArgs){ + + var elRadio = oArgs.target; var oColumn = this.getColumn(elRadio); if(oColumn.key == 'is_default') { @@ -191,25 +191,25 @@ SE.accounts = { var t_isGroup = oRecord.getData('is_group'); if(t_id != lastDefaultSelectedId && !t_isGroup) { - SUGAR.default_inbound_accnt_id = t_id; //Set in the global space for access during compose + SUGAR.default_inbound_accnt_id = t_id; //Set in the global space for access during compose lastDefaultSelectedId = t_id; - AjaxObject.startRequest(callbackDefaultOutboundSave, urlStandard + "&emailUIAction=saveDefaultOutbound&id="+ t_id); + AjaxObject.startRequest(callbackDefaultOutboundSave, urlStandard + "&emailUIAction=saveDefaultOutbound&id="+ t_id); } else if(t_isGroup) YAHOO.util.Event.preventDefault(oArgs.event); //Do not allow users to select group mailboxes as a default. - + } }); - - this.inboundAccountsSettingsTable.subscribe("rowMouseoverEvent", this.inboundAccountsSettingsTable.onEventHighlightRow); - this.inboundAccountsSettingsTable.subscribe("rowMouseoutEvent", this.inboundAccountsSettingsTable.onEventUnhighlightRow); + + this.inboundAccountsSettingsTable.subscribe("rowMouseoverEvent", this.inboundAccountsSettingsTable.onEventHighlightRow); + this.inboundAccountsSettingsTable.subscribe("rowMouseoutEvent", this.inboundAccountsSettingsTable.onEventUnhighlightRow); } }, _setupOutboundAccountTable: function() { if(!this.outboundAccountsSettingsTable) - { - this.obImageFormatter = function(elLiner, oRecord, oColumn, oData) { + { + this.obImageFormatter = function(elLiner, oRecord, oColumn, oData) { var clckEvent = oColumn.key; var imgSrc = ""; var isEditable = oRecord.getData("is_editable"); @@ -229,14 +229,14 @@ SE.accounts = { if(imgSrc != '') elLiner.innerHTML = ''; } - }; - + }; + //Custom formatter to display any error messages. - this.messageDisplay = function(elLiner, oRecord, oColumn, oData) { - + this.messageDisplay = function(elLiner, oRecord, oColumn, oData) { + if(SUGAR.email2.composeLayout.outboundAccountErrors == null) SUGAR.email2.composeLayout.outboundAccountErrors = {}; - + var id = oRecord.getData('id'); var message = oRecord.getData("errors"); if(message != '') @@ -250,29 +250,29 @@ SE.accounts = { if(typeof(SUGAR.email2.composeLayout.outboundAccountErrors[id]) != 'undefined' ) delete SUGAR.email2.composeLayout.outboundAccountErrors[id]; } - }; + }; YAHOO.widget.DataTable.Formatter.actionsImage = this.obImageFormatter; YAHOO.widget.DataTable.Formatter.messageDisplay = this.messageDisplay; - + this.obAccntsColumnDefs = [{key:'name',label:app_strings.LBL_EMAIL_ACCOUNTS_NAME }, {key:'mail_smtpserver',label:app_strings.LBL_EMAIL_ACCOUNTS_SMTPSERVER}, {key:'edit',label:mod_strings.LBL_BUTTON_EDIT,formatter:"actionsImage",className:'yui-cstm-cntrd-liner'}, - {key:'delete', label:app_strings.LBL_EMAIL_DELETE,formatter:"actionsImage",className:'yui-cstm-cntrd-liner'}, + {key:'delete', label:app_strings.LBL_EMAIL_DELETE,formatter:"actionsImage",className:'yui-cstm-cntrd-liner'}, {key:'messages',label:'', formatter:"messageDisplay",className:'yui-cstm-cntrd-liner'}]; - + var query = "index.php?module=Emails&action=EmailUIAjax&to_pdf=true&emailUIAction=retrieveAllOutbound"; this.obDataSource = new YAHOO.util.DataSource(query); - this.obDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON; + this.obDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON; this.obDataSource.responseSchema = { - + resultsList: "outbound_account_list", fields: ['id','name','is_editable','mail_smtpserver','type','errors'] }; - + this.outboundAccountsSettingsTable = new YAHOO.widget.DataTable("outboundAccountsTable", this.obAccntsColumnDefs, this.obDataSource); - - - this.outboundAccountsSettingsTable.subscribe("rowMouseoverEvent", this.outboundAccountsSettingsTable.onEventHighlightRow); - this.outboundAccountsSettingsTable.subscribe("rowMouseoutEvent", this.outboundAccountsSettingsTable.onEventUnhighlightRow); + + + this.outboundAccountsSettingsTable.subscribe("rowMouseoverEvent", this.outboundAccountsSettingsTable.onEventHighlightRow); + this.outboundAccountsSettingsTable.subscribe("rowMouseoutEvent", this.outboundAccountsSettingsTable.onEventUnhighlightRow); this.outboundAccountsSettingsTable.subscribe("postRenderEvent",this.rebuildMailerOptions); } }, @@ -280,7 +280,7 @@ SE.accounts = { * Displays a modal diaglogue to edit outbound account settings */ showEditInboundAccountDialogue : function(clear) { - + if(!this.inboundAccountEditDialog) { var EAD = this.inboundAccountEditDialog = new YAHOO.widget.Dialog("editAccountDialogue", { modal:true, @@ -304,21 +304,22 @@ SE.accounts = { } // end lazy load - if(clear == undefined || clear == true) + if(clear == undefined || clear == true) { SE.accounts.clearInboundAccountEditScreen(); //Set default protocol to IMAP when creating new records document.forms['ieAccount'].elements['protocol'].value = "imap"; - SE.accounts.setPortDefault(); + SE.accounts.setPortDefault(); } - + //Check if we should display username/password fields for outbound account if errors were detected. this.checkOutBoundSelection(); - + this.inboundAccountEditDialog.render(); this.inboundAccountEditDialog.show(); + SUGAR.util.setEmailPasswordDisplay('email_password', clear == false); }, - + /** * Set all fields on the outbound edit form to either enabled/disabled * except for the username/password. @@ -335,15 +336,15 @@ SE.accounts = { Dom.addClass("mail_smtpssl_row", "yui-hidden"); else Dom.removeClass('mail_smtpssl_row', "yui-hidden"); - + }, /** * Refresh the inbound accounts table. */ refreshInboundAccountTable : function() - { + { this.inboundAccountsSettingsTable.getDataSource().sendRequest('', - { + { success: this.inboundAccountsSettingsTable.onDataReturnInitializeTable, scope: this.inboundAccountsSettingsTable } ); @@ -352,9 +353,9 @@ SE.accounts = { * Refresh the outbound accounts table. */ refreshOuboundAccountTable : function() - { + { this.outboundAccountsSettingsTable.getDataSource().sendRequest('', - { + { success: this.outboundAccountsSettingsTable.onDataReturnInitializeTable, scope: this.outboundAccountsSettingsTable } ); @@ -385,10 +386,10 @@ SE.accounts = { SE.accounts.checkOutBoundSelection(); return true; }); - + Dom.removeClass("outboundDialog", "yui-hidden"); } // end lazy load - + // clear out form var form = document.getElementById('outboundEmailForm'); for(i=0; i"; - } + } if(trim(smtpServer) == '') { isError = true; errorMessage += app_strings.LBL_EMAIL_ACCOUNTS_SMTPSERVER + "
"; @@ -774,20 +775,16 @@ SE.accounts = { isError = true; errorMessage += app_strings.LBL_EMAIL_ACCOUNTS_SMTPUSER + "
"; } - if(trim(document.getElementById('mail_smtppass').value) == '') { - isError = true; - errorMessage += app_strings.LBL_EMAIL_ACCOUNTS_SMTPPASS + "
"; - } } - } + } if(isError) { overlay(mod_strings.ERR_MISSING_REQUIRED_FIELDS, errorMessage, 'alert'); - return false; + return false; } else { return true; } - }, - + }, + testOutboundSettings: function() { var errorMessage = ''; var isError = false; @@ -795,38 +792,38 @@ SE.accounts = { if (trim(fromAddress) == "") { errorMessage += app_strings.LBL_EMAIL_SETTINGS_FROM_TO_EMAIL_ADDR + "
"; overlay(mod_strings.ERR_MISSING_REQUIRED_FIELDS, errorMessage, 'alert'); - return false; + return false; } else if (!isValidEmail(fromAddress)) { errorMessage += app_strings.LBL_EMAIL_SETTINGS_FROM_TO_EMAIL_ADDR + "
"; overlay(mod_strings.ERR_INVALID_REQUIRED_FIELDS, errorMessage, 'alert'); - return false; + return false; } - + //Hide the dialogue and show an in progress indicator. SE.accounts.testOutboundDialog.hide(); overlay(app_strings.LBL_EMAIL_PERFORMING_TASK, app_strings.LBL_EMAIL_ONE_MOMENT, 'plain'); - + //If the outbound mail type is a system override we need to re-enable the post fields otherwise //nothing is sent in the request. var outboundType = document.forms['outboundEmailForm'].elements['type'].value; SUGAR.email2.accounts.toggleOutboundAccountDisabledFields(false); - + YAHOO.util.Connect.setForm(document.getElementById("outboundEmailForm")); if(outboundType == 'system-override') SUGAR.email2.accounts.toggleOutboundAccountDisabledFields(true); - + var data = "&emailUIAction=testOutbound&outboundtest_from_address=" + fromAddress; AjaxObject.startRequest(callbackOutboundTest, urlStandard + data); - + }, - + testOutboundSettingsDialog: function() { //Ensure that all settings are correct before proceeding to send test email. if(!SE.accounts.checkOutboundSettings()) - return; - + return; + // lazy load dialogue if(!SE.accounts.testOutboundDialog) { SE.accounts.testOutboundDialog = new YAHOO.widget.Dialog("testOutboundDialog", { @@ -843,7 +840,7 @@ SE.accounts = { SE.accounts.testOutboundDialog.render(); SE.accounts.testOutboundDialog.show(); }, - + /** * Saves Outbound email settings */ @@ -859,12 +856,12 @@ SE.accounts = { }, saveIeAccount : function() { - + //Before saving check if there are any error messages associated with the outbound account. var outboundID = document.getElementById('outbound_email').value; if( SE.accounts.checkIeCreds({'valiateTrash': true,'validateFromAddr': true,'validateOutbound' :true, - 'validateSMTPCreds':true}) ) + 'validateSMTPCreds':true}) ) { document.getElementById('saveButton').disabled = true; @@ -896,13 +893,13 @@ SE.accounts = { } // if getFoldersListForInboundAccount("InboundEmail", "ShowInboundFoldersList", "Popup", 400, 300, form.server_url.value, form.protocol.value, form.port.value, form.email_user.value, Rot13.write(form.email_password.value), mailBoxValue, form.ssl.checked, true, form.searchField.value ); } // if - + }, - + checkIeCreds : function(validateRules) { - if(typeof(validateRules) == 'undefined') + if(typeof(validateRules) == 'undefined') validateRules = {}; - + var errors = new Array(); var out = new String(); @@ -915,20 +912,20 @@ SE.accounts = { var port = Dom.get('port').value; var oe = Dom.get('outbound_email'); var oe_value = typeof(oe.options[oe.selectedIndex]) == 'undefined' ? "" : oe.options[oe.selectedIndex].value; - + var outboundUserName = Dom.get('inbound_mail_smtpuser').value; var outboundPass = Dom.get('inbound_mail_smtppass').value; - + //If the username and password were provided then ignore the error messge - + var outboundCredentialsFound = false; - + if(outboundUserName != "" && outboundPass != "") outboundCredentialsFound = true; - + var validateSMTPCreds = (typeof(validateRules.validateSMTPCreds) != 'undefined' && validateRules.validateSMTPCreds); - - if ( SE.composeLayout.outboundAccountErrors != null && SE.composeLayout.outboundAccountErrors[oe_value] != null + + if ( SE.composeLayout.outboundAccountErrors != null && SE.composeLayout.outboundAccountErrors[oe_value] != null && validateSMTPCreds) { if(trim(outboundUserName) == "") { @@ -942,15 +939,15 @@ SE.accounts = { if(trim(ie_name) == "") { errors.push(app_strings.LBL_EMAIL_ERROR_NAME); } - + if ( typeof(validateRules.validateFromAddr) != 'undefined' && validateRules.validateFromAddr) - { + { if(trim(fromAddress) == "" || !isValidEmail(fromAddress) ) { errors.push(app_strings.LBL_EMAIL_ERROR_FROM_ADDRESS); } } - - + + if( (typeof(validateRules.validateOutbound) != 'undefined' && validateRules.validateOutbound) && ( trim(oe_value) == "" || trim(oe_value) == "SYSTEM_ADD") ) { errors.push(app_strings.LBL_EMAIL_ERROR_NO_OUTBOUND); @@ -961,9 +958,6 @@ SE.accounts = { if(trim(email_user) == "") { errors.push(app_strings.LBL_EMAIL_ERROR_USER); } - if(trim(email_password) == "") { - errors.push(app_strings.LBL_EMAIL_ERROR_PASSWORD); - } if(protocol == "") { errors.push(app_strings.LBL_EMAIL_ERROR_PROTOCOL); } @@ -1017,7 +1011,7 @@ SE.accounts = { SE.util.cascadeNodes(SE.tree.getRoot(), SE.accounts.setNodeStyle); SE.tree.render(); }, - + //Sets the style for any nodes that need it. setNodeStyle : function(node) { if (!node.data.origText) { @@ -1036,7 +1030,7 @@ SE.accounts = { } SE.accounts.setupDDTarget(node); }, - + setupDDTarget : function(node) { if (node.ddTarget) { node.ddTarget.removeFromGroup(); @@ -1045,9 +1039,9 @@ SE.accounts = { var id = node.getElId(); var num = id.substring(4); if (node.data.origText != SUGAR.language.get("Emails", "LNK_MY_INBOX") && - node.data.origText != SUGAR.language.get("Emails", "LNK_MY_DRAFTS") && + node.data.origText != SUGAR.language.get("Emails", "LNK_MY_DRAFTS") && node.data.origText != SUGAR.language.get("Emails", "LNK_SENT_EMAIL_LIST")) { - + node.ddTarget = new SUGAR.email2.folders.folderDD("ygtvcontentel" + num); } else if (node.data.origText == SUGAR.language.get("Emails", "LNK_MY_INBOX")){ @@ -1062,7 +1056,7 @@ SE.accounts = { overlay(app_strings.LBL_EMAIL_REBUILDING_FOLDERS, app_strings.LBL_EMAIL_ONE_MOMENT); AjaxObject.startRequest(callbackFolders, urlStandard + '&emailUIAction=rebuildFolders'); }, - + /** * Returns the number of remote accounts the user has active. */ @@ -1088,7 +1082,7 @@ SE.accounts = { /////////////////////////////////////////////////////////////////////////////// //// CONTEXT MENU CALLS SE.contextMenus = { - + assignToDialogue : null, /** * Archives from context menu @@ -1111,7 +1105,7 @@ SE.contextMenus = { */ archiveToSugar : function(menuItem) { SE.contextMenus.emailListContextMenu.hide(); - + var rows = SE.grid.getSelectedRows(); var uids = []; /* iterate through available rows JIC a row is deleted - use first available */ @@ -1121,7 +1115,7 @@ SE.contextMenus = { var data = SE.grid.getRecord(rows[0]).getData(); SE.contextMenus._archiveToSugar(uids, data.ieId, data.mbox); }, - + /** * Popup the printable version and start system's print function. */ @@ -1155,12 +1149,12 @@ SE.contextMenus = { SE.contextMenus.assignToDialogue.setHeader(app_strings.LBL_EMAIL_ASSIGN_TO); enableQS(true); } - + Dom.removeClass("assignToDiv", "yui-hidden"); SE.contextMenus.assignToDialogue.render(); SE.contextMenus.assignToDialogue.show(); }, - + /** * Marks email flagged on mail server */ @@ -1198,7 +1192,7 @@ SE.contextMenus = { */ markEmail : function(type) { SE.contextMenus.emailListContextMenu.hide(); - + //var dm = SE.grid.getStore(); //var uids = SE.grid.getSelectedRowIds(); //var indexes = SE.grid.getSelectedRowIndexes(); @@ -1206,24 +1200,24 @@ SE.contextMenus = { if (rows.length == 0) rows = [SE.contextMenus.currentRow]; var ser = [ ]; - + for(var i=0; i 0) { - AjaxObject.startRequest(AjaxObject.accounts.callbackCheckMailProgress, urlStandard + + AjaxObject.startRequest(AjaxObject.accounts.callbackCheckMailProgress, urlStandard + '&emailUIAction=checkEmailProgress&ieId=' + SE.accounts.ieIds[0] + "¤tCount=0"); } else { hideOverlay(); @@ -2034,7 +2028,7 @@ SE.folders = { SE.folders.checkingMail = setTimeout("SE.folders.startEmailAccountCheck();", 5000); } }, - + /** * Checks a single Account check based on passed ieId */ @@ -2051,7 +2045,7 @@ SE.folders = { } // if overlay(app_strings.LBL_EMAIL_CHECKING_NEW, app_strings.LBL_EMAIL_CHECKING_DESC, 'progress'); SE.accounts.ieIds = [ieId]; - AjaxObject.startRequest(AjaxObject.accounts.callbackCheckMailProgress, urlStandard + + AjaxObject.startRequest(AjaxObject.accounts.callbackCheckMailProgress, urlStandard + '&emailUIAction=checkEmailProgress&mbox=' + mbox + '&ieId=' + ieId + "¤tCount=0&synch=" + synch); }, @@ -2064,7 +2058,7 @@ SE.folders = { overlay(app_strings.LBL_EMAIL_EMPTYING_TRASH, app_strings.LBL_EMAIL_ONE_MOMENT); AjaxObject.startRequest(callbackEmptyTrash, urlStandard + '&emailUIAction=emptyTrash'); }, - + /** * Clears Cache files of the inboundemail account */ @@ -2073,8 +2067,8 @@ SE.folders = { overlay(app_strings.LBL_EMAIL_CLEARING_CACHE_FILES, app_strings.LBL_EMAIL_ONE_MOMENT); AjaxObject.startRequest(callbackClearCacheFiles, urlStandard + '&ieId=' + ieId + '&emailUIAction=clearInboundAccountCache'); }, - - + + /** * Returns an array of all the active accounts in the folder view */ @@ -2106,7 +2100,7 @@ SE.folders = { AjaxObject.timeout = 300000; // 5 min timeout for long checks AjaxObject.startRequest(callbackLoadSettingFolder, urlStandard + '&emailUIAction=getFoldersForSettings'); }, - + /** * Recursively removes nodes from the TreeView of type Sugar (data.ieId = 'folder') */ @@ -2122,14 +2116,14 @@ SE.folders = { root.childrenRendered = true; } }, - + rebuildFolders : function(silent) { if (!silent) overlay(app_strings.LBL_EMAIL_REBUILDING_FOLDERS, app_strings.LBL_EMAIL_ONE_MOMENT); AjaxObject.startRequest(callbackFolders, urlStandard + '&emailUIAction=getAllFoldersTree'); }, - - + + /** * Updates TreeView with Sugar Folders */ @@ -2185,7 +2179,7 @@ SE.folders = { if(is_active) a_active_accnts += ("&ieIdShow[]=" + t_record.getData('id')); } - + if(a_active_accnts == "") a_active_accnts = "&ieIdShow[]="; @@ -2303,10 +2297,10 @@ SE.folders = { * @param count how many to decrement */ decrementUnreadCount : function(ieId, mbox, count) { - + if(mbox == null) return; - + if(mbox.indexOf("sugar::") === 0) { var node = this.getNodeFromId(ieId); } else { @@ -2344,13 +2338,13 @@ SE.folders = { */ getNodeFromIeIdAndMailbox : function(id, mbox) { SE.folders.focusNode = null; - if (mbox == "sugar::Emails") { + if (mbox == "sugar::Emails") { mbox = id; id = "folder"; } // if SE.util.cascadeNodes(SE.tree.getRoot(), function(varsarray) { if (varsarray instanceof Array) { - if (this.data.ieId && this.data.ieId == varsarray[0] + if (this.data.ieId && this.data.ieId == varsarray[0] && this.data.mbox == varsarray[1]) { SE.folders.focusNode = this; return false; @@ -2364,7 +2358,7 @@ SE.folders = { }, null, [id, mbox]); return SE.folders.focusNode; }, - + unhighliteAll : function() { SE.util.cascadeNodes(SE.tree.getRoot(), function(){this.unhighlight()}); }, @@ -2378,8 +2372,8 @@ SE.folders = { var node = SE.clickedFolderNode; if(node != null && node.data) { - overlay(app_strings.LBL_EMAIL_FOLDERS_ADD_DIALOG_TITLE, - app_strings.LBL_EMAIL_SETTINGS_NAME, + overlay(app_strings.LBL_EMAIL_FOLDERS_ADD_DIALOG_TITLE, + app_strings.LBL_EMAIL_SETTINGS_NAME, 'prompt', {fn:SE.folders.folderAddXmlCall, beforeShow: SE.folders.folderAddRegisterEnter, beforeHide: SE.folders.folderRemoveRegisterEnter}); } else { alert(app_strings.LBL_EMAIL_FOLDERS_NO_VALID_NODE); @@ -2387,17 +2381,17 @@ SE.folders = { }, folderAddRegisterEnter : function() { - this.enterKeyListener = new YAHOO.util.KeyListener(YAHOO.util.Dom.get("sugar-message-prompt"), + this.enterKeyListener = new YAHOO.util.KeyListener(YAHOO.util.Dom.get("sugar-message-prompt"), {keys: YAHOO.util.KeyListener.KEY.ENTER}, this.buttons[1].handler); - - this.enterKeyListener.enable(); + + this.enterKeyListener.enable(); }, - + folderRemoveRegisterEnter : function() { this.enterKeyListener.disable(); }, - + folderAddXmlCall : function(name) { if (trim(name) == "") { alert(mod_strings.LBL_ENTER_FOLDER_NAME); @@ -2408,7 +2402,7 @@ SE.folders = { var type = 'sugar'; var parentNode = SE.clickedFolderNode; - + this.contextMenuFocus = parentNode; if(parentNode.data.ieId) { @@ -2443,7 +2437,7 @@ SE.folders = { */ folderDelete : function() { SE.contextMenus.frameFoldersContextMenu.hide(); - + if(confirm(app_strings.LBL_EMAIL_FOLDERS_DELETE_CONFIRM)) { var post = ''; var parentNode = SE.clickedFolderNode; @@ -2484,11 +2478,11 @@ SE.folders = { overlay(app_strings.LBL_EMAIL_ERROR_GENERAL_TITLE, app_strings.LBL_EMAIL_FOLDERS_CHANGE_HOME, 'alert'); return; } - - overlay(app_strings.LBL_EMAIL_FOLDERS_RENAME_DIALOG_TITLE + " - " + node.data.text, - app_strings.LBL_EMAIL_SETTINGS_NAME, + + overlay(app_strings.LBL_EMAIL_FOLDERS_RENAME_DIALOG_TITLE + " - " + node.data.text, + app_strings.LBL_EMAIL_SETTINGS_NAME, 'prompt', - {fn:SE.folders.submitFolderRename, beforeShow: SE.folders.folderAddRegisterEnter, beforeHide: SE.folders.folderRemoveRegisterEnter}); + {fn:SE.folders.submitFolderRename, beforeShow: SE.folders.folderAddRegisterEnter, beforeHide: SE.folders.folderRemoveRegisterEnter}); } else { alert(app_strings.LBL_EMAIL_FOLDERS_NO_VALID_NODE); } @@ -2605,7 +2599,7 @@ SE.folders = { //eval(node.data.click); //debugger; }, - + /** * Called when a node is right-clicked on in the folder tree */ @@ -2614,7 +2608,7 @@ SE.folders = { //Get the Tree Node var node = SUGAR.email2.tree.getNodeByElement(YAHOO.util.Event.getTarget(e)); var menu = SUGAR.email2.contextMenus.frameFoldersContextMenu; - + //If the click was on a sugar folder SE.clickedFolderNode = node; var inbound = (node.data.ieId && node.data.ieId != 'folder'); @@ -2644,7 +2638,7 @@ SE.folders = { menu.getItem(4).cfg.setProperty("disabled", true); menu.getItem(5).cfg.setProperty("disabled", true); } - + //For group with auto inbound, disable everything. if( (typeof(node.data.is_group) != 'undefined') && node.data.is_group == 'true') { @@ -2656,11 +2650,11 @@ SE.folders = { menu.getItem(5).cfg.setProperty("disabled", true); menu.getItem(6).cfg.setProperty("disabled", true); } - + menu.cfg.setProperty("xy", YAHOO.util.Event.getXY(e)); menu.show(); }, - + /** * Called when a row is dropped on a node */ @@ -2678,14 +2672,14 @@ SE.folders = { SE.listView.moveEmails(srcIeId, srcFolder, destIeId, destFolder, uids, rows); } }, - + /** * Called when something is dragged over a Folder Node */ dragOver : function(dragObject) { return true; }, - + /** * Determines if a folder name is unique to the folder tree * @param string name @@ -2713,7 +2707,7 @@ SE.folders = { alert(mod_strings.LBL_ENTER_FOLDER_NAME); return false; } - newName = escape(newName); + newName = escape(newName); var node = SE.clickedFolderNode; var origName = node.data.text //Ignore no change @@ -2729,7 +2723,7 @@ SE.folders = { else { //IMAP folder or POP mailbox var nodePath = node.data.mbox.substring(0, node.data.mbox.lastIndexOf(".") + 1); - AjaxObject.startRequest(callbackFolderRename, urlStandard + "&emailUIAction=renameFolder&ieId=" + AjaxObject.startRequest(callbackFolderRename, urlStandard + "&emailUIAction=renameFolder&ieId=" + node.data.ieId + "&oldFolderName=" + node.data.mbox + "&newFolderName=" + nodePath + newName); } return true; @@ -2738,11 +2732,11 @@ SE.folders = { return false; } }, - + moveFolder : function(folderId, parentFolderId) { if (folderId != parentFolderId) { - AjaxObject.startRequest(callbackFolderRename, urlStandard + "&emailUIAction=moveFolder&folderId=" + AjaxObject.startRequest(callbackFolderRename, urlStandard + "&emailUIAction=moveFolder&folderId=" + folderId + "&newParentId=" + parentFolderId); } }, @@ -2763,8 +2757,8 @@ SE.folders = { * @param string type of Folder selection */ updateSubscriptions : function() { - overlay(app_strings.LBL_EMAIL_REBUILDING_FOLDERS, app_strings.LBL_EMAIL_ONE_MOMENT); - + overlay(app_strings.LBL_EMAIL_REBUILDING_FOLDERS, app_strings.LBL_EMAIL_ONE_MOMENT); + var active = ""; select = document.getElementById('userFolders'); @@ -2778,14 +2772,14 @@ SE.folders = { active += opt.value; } } - + //Add the group folder ids. var group_folders = SUGAR.email2.folders.retrieveGroupFolderSubscriptions(); - for(i=0; i 0) { SE.detailView.getEmailPreview(); @@ -2967,7 +2961,7 @@ SE.listView = { uid = new String(uid); uids = uid.split(','); var dataTableRecords = SE.grid.getRecordSet().getRecords(0, SE.grid.getRecordSet().getLength()); - + for(j=0; j'); - dlg.beforeRenderEvent.subscribe(function() { - var dd = new YAHOO.util.DDProxy(dlg.element); - dd.setHandleElId(dlg.header); - dd.on('endDragEvent', function() { - dlg.show(); - }); - }, dlg, true); + dlg.beforeRenderEvent.subscribe(function() { + var dd = new YAHOO.util.DDProxy(dlg.element); + dd.setHandleElId(dlg.header); + dd.on('endDragEvent', function() { + dlg.show(); + }); + }, dlg, true); dlg.render(); var tp = SE.settings.settingsTabs = new YAHOO.widget.TabView("settingsTabDiv"); @@ -3441,12 +3435,12 @@ SE.settings = { tp.appendTo(dlg.body); } - + SE.settings.settingsDialog.show(); SE.folders.lazyLoadSettings(); SE.accounts.lazyLoad(); }, - + lazyLoadRules : function() { if(false/*!SE.settings.rules*/) { @@ -3454,7 +3448,6 @@ SE.settings = { } } - }; //// END SE.settings /////////////////////////////////////////////////////////////////////////////// diff --git a/modules/Emails/javascript/EmailUICompose.js b/modules/Emails/javascript/EmailUICompose.js index f1cb075a..2be723a3 100644 --- a/modules/Emails/javascript/EmailUICompose.js +++ b/modules/Emails/javascript/EmailUICompose.js @@ -129,12 +129,12 @@ SE.addressBook = { rows[i] = SE.contactView.getRecord(ids[i]); } removeHiddenNodes(rows, SE.contactView); - } + } else { return; } if(rows.length > 0) { SE.composeLayout.handleDrop( - (type == 'contacts') ? SE.contactView : SE.emailListsView, + (type == 'contacts') ? SE.contactView : SE.emailListsView, null, rows, 'addressTO' + idx ); } else { alert(app_strings.LBL_EMAIL_MENU_MAKE_SELECTION); @@ -151,7 +151,7 @@ SE.addressBook = { elementId = element.id.substring(2); } }, - + /** * Filters contact entries based on user input @@ -195,14 +195,14 @@ SE.addressBook = { return ret; }, - + /** * Sets up async call to query for matching contacts, users, etc. */ searchContacts : function() { var fn = document.getElementById('input_searchField').value; var pe = document.getElementById('input_searchPerson').value; - + var rb = document.getElementById('hasRelatedBean').checked; if (rb) { var idx = this.idx; @@ -213,14 +213,14 @@ SE.addressBook = { } else { this.addressBookDataModel.params['related_bean_id'] = ''; } - + this.addressBookDataModel.params['search_field'] = fn; this.addressBookDataModel.params['person'] = pe; this.addressBookDataModel.params['emailUIAction'] = 'getAddressSearchResults'; this.grid._oDataSource = this.addressBookDataModel; this.grid.getDataSource().sendRequest(SUGAR.util.paramsToUrl(this.addressBookDataModel.params), this.grid.onDataReturnInitializeTable, this.grid); }, - + /** * Clear Search Crieteria For Addressbook */ @@ -228,7 +228,7 @@ SE.addressBook = { document.getElementById('input_searchField').value = ""; document.getElementById('input_searchPerson').selectedIndex = 0; }, - + /** * Opens modal select window to add contacts to addressbook */ @@ -244,7 +244,7 @@ SE.addressBook = { {text: app_strings.LBL_EMAIL_ADDRESS_BOOK_CLEAR, isDefault: true, handler: this.clearAllEmailAddressFieldsFromResultTable} ] }); dlg.setHeader(app_strings.LBL_EMAIL_ADDRESS_BOOK_SELECT_TITLE); - + var body = SUGAR.util.getAndRemove("contactsDialogueHTML"); dlg.setBody(body.innerHTML); dlg.renderEvent.subscribe(function() { @@ -253,19 +253,19 @@ SE.addressBook = { this.body.style.width = "950px"; } }, dlg); - - - dlg.beforeRenderEvent.subscribe(function() { - var dd = new YAHOO.util.DDProxy(dlg.element); - dd.setHandleElId(dlg.header); - dd.on('endDragEvent', function() { - dlg.show(); - }); - }, dlg, true); + + + dlg.beforeRenderEvent.subscribe(function() { + var dd = new YAHOO.util.DDProxy(dlg.element); + dd.setHandleElId(dlg.header); + dd.on('endDragEvent', function() { + dlg.show(); + }); + }, dlg, true); dlg.render(); - + var tp = new YAHOO.widget.TabView("contactsSearchTabs"); - + var tabContent = SUGAR.util.getAndRemove("searchForm"); tp.addTab(new YAHOO.widget.Tab({ label: app_strings.LBL_EMAIL_ADDRESS_BOOK_TITLE, @@ -274,7 +274,7 @@ SE.addressBook = { id : "addressSearchTab", active : true })); - + var addListenerFields = ['input_searchPerson','input_searchField' ] YAHOO.util.Event.addListener(addListenerFields,"keydown", function(e){ if (e.keyCode == 13) { @@ -295,7 +295,7 @@ SE.addressBook = { var idx = activePanel.substring(10); } SE.addressBook.idx = idx; - + var relatedBeanId; if ((hasRelatedBeanId = document.getElementById('data_parent_id' + idx).value) != '') { document.getElementById('relatedBeanColumn').style.display = ''; @@ -308,15 +308,15 @@ SE.addressBook = { document.getElementById('relatedBeanColumn').style.display = 'none'; document.getElementById('hasRelatedBean').checked = false; } - - if (!SE.addressBook.grid) + + if (!SE.addressBook.grid) { if (hasRelatedBeanId) { document.getElementById('hasRelatedBean').checked = true; } AddressSearchGridInit(); SE.addressBook.relatedBeanId = relatedBeanId; - } + } else { if (typeof(relatedBeanId) != 'undefined' && relatedBeanId != SE.addressBook.relatedBeanId) @@ -336,12 +336,12 @@ SE.addressBook = { SE.addressBook.addressBookDataModel.params['person'] = document.getElementById('input_searchPerson').value; SE.addressBook.grid.getDataSource().sendRequest(SUGAR.util.paramsToUrl(SE.addressBook.addressBookDataModel.params), SE.addressBook.grid.onDataReturnInitializeTable, SE.addressBook.grid); } - + //Remove any lingering rows in the result set table if the module was closed. SE.addressBook.gridResults.deleteRows(0, SUGAR.email2.addressBook.gridResults.getRecordSet().getLength()); //Repopulate SE.addressBook.populateResulstTableEmailAddresses(); - + this.contactsDialogue.show(); }, /** @@ -355,23 +355,23 @@ SE.addressBook = { SUGAR.email2.addressBook.grid.reSelectRowsOnRender(); }, /** - * Take all email address listed in the compose tab To|Cc|Bcc fields and re-populates the + * Take all email address listed in the compose tab To|Cc|Bcc fields and re-populates the * results table. This function is called when the address book is displayed. */ populateResulstTableEmailAddresses: function () { - + var idx = SE.addressBook.idx; var emailFields = ['to','cc','bcc']; - + for(var k=0;k'; if(t_name == '') t_name = displayEmail = t_emailAddr; - + var addressType = SE.addressBook.translateAddresType(emailFields[k],true); SUGAR.email2.addressBook.gridResults.addRow({'type':addressType,'name':t_name,'email_address': t_emailAddr, 'display_email_address': displayEmail,'bean_id': -1,'idx' : SE.addressBook.idx}); } - } + } }, - + /** * Checks all entries in the result table against a particular email address, returning true * if the email address is found, false otherwise. @@ -394,57 +394,57 @@ SE.addressBook = { doesEmailAdddressExistInResultTable: function(emailAddress) { if(trim(emailAddress) == '') - return false; - + return false; + var emailAddressFound = false; var contacts = SE.addressBook.gridResults.getRecordSet().getRecords(); - for (var i=0; i < contacts.length; i++) + for (var i=0; i < contacts.length; i++) { var data = SE.addressBook.gridResults.getRecord(contacts[i]).getData(); //If we are adding to cc or bcc fields, make them visible. - if(data.email_address == emailAddress) + if(data.email_address == emailAddress) { emailAddressFound = true; break; } } - + return emailAddressFound; }, /** - * Takes all email addresses that the users wishes to add from the address book and populates the To - * fields on the compose tab. + * Takes all email addresses that the users wishes to add from the address book and populates the To + * fields on the compose tab. */ populateEmailAddressFieldsFromResultTable: function() { //Clear the fields first, all email addresses are stored in the address book var idx = SE.addressBook.idx; - var emailFields = ['to','cc','bcc']; + var emailFields = ['to','cc','bcc']; for(var k=0;k/gi, '') + " <" + primary + ">"; //ret[ret.length] = contacts[id].name + " <" + primary + ">"; - + for(var emailIndex in contacts[id].email) { ret[ret.length] = contacts[id].email[emailIndex].email_address; } @@ -772,7 +772,7 @@ SE.composeLayout = { var linkElement = document.getElementById("More"+e.id); var spanElement = document.getElementById("Detail"+e.id); var emailAddressList = e.value; - if(e.value.length > 96) + if(e.value.length > 96) { var resultArray = SE.composeLayout._getEmailArrayFromString(emailAddressList); var displayArray = []; @@ -783,19 +783,19 @@ SE.composeLayout = { if(t_name == '') displayArray.push('
<' + t_emailAddr + '>'); else - displayArray.push(t_name + '
<' + t_emailAddr + '>'); + displayArray.push(t_name + '
<' + t_emailAddr + '>'); } - + var result = displayArray.join('
'); // Display linkElement.style.display = "inline"; linkElement.style.height="10px"; linkElement.style.overflow="visible"; spanElement.innerHTML = result; - } - else + } + else linkElement.style.display = "none"; - + }, /** @@ -803,9 +803,9 @@ SE.composeLayout = { * and email portion. */ _getEmailArrayFromString : function (emailAddressList){ - + var reg = /@.*?;/g; - while ((results = reg.exec(emailAddressList)) != null) + while ((results = reg.exec(emailAddressList)) != null) { orignial = results[0]; parsedResult = results[0].replace(';', ':::::'); @@ -813,7 +813,7 @@ SE.composeLayout = { } reg = /@.*?,/g; - while ((results = reg.exec(emailAddressList)) != null) + while ((results = reg.exec(emailAddressList)) != null) { orignial = results[0]; parsedResult = results[0].replace(',', ':::::'); @@ -823,7 +823,7 @@ SE.composeLayout = { var emailArr = emailAddressList.split(":::::"); var resultsArray = []; var newArr = []; - for (var i=0; i'); @@ -842,7 +842,7 @@ SE.composeLayout = { } } } - return resultsArray; + return resultsArray; }, /////////////////////////////////////////////////////////////////////////// //// COMPOSE FLOW @@ -861,17 +861,17 @@ SE.composeLayout = { active : true }, SE.innerLayout); SE.innerLayout.addTab(composeTab); - + // get template engine with template if (!SE.composeLayout.composeTemplate) { SE.composeLayout.composeTemplate = new YAHOO.SUGAR.Template(SE.templates['compose']); } - + // create Tab inner layout var composePanel = this.getComposeLayout(); composePanel.getUnitByPosition("right").collapse(); composePanel.autoSize(); - + }, /** * Generate the quick compose layout @@ -885,7 +885,7 @@ SE.composeLayout = { //Before rendering the parent pannel we need to initalize the grid layout parentPanel.beforeRenderEvent.subscribe(function() { - + YAHOO.util.Event.onAvailable('htmleditordiv' + idx, function() { SE.composeLayout._createComposeLayout(idx); SE.composeLayout[idx].set('height', 350); @@ -893,10 +893,10 @@ SE.composeLayout = { }); }); - //Wait until the Compose Layout has rendered, then add the + //Wait until the Compose Layout has rendered, then add the //options tab and perform the tiny initialization. parentPanel.renderEvent.subscribe(function() { - + YAHOO.util.Event.onAvailable('htmleditordiv' + idx, function() { SE.composeLayout._initComposeOptionTabs(idx); SE.composeLayout[idx].getUnitByPosition("right").collapse(); @@ -906,18 +906,18 @@ SE.composeLayout = { //Init templates and address book SE.composeLayout._2_final(); - SE.composeLayout.quickCreateComposePackage(o); + SE.composeLayout.quickCreateComposePackage(o); }); }); - + //Check if we have the div override for the shortcut bar if(typeof o.menu_id != 'undefined') { - parentPanel.render(o.menu_id); + parentPanel.render(o.menu_id); } else { - parentPanel.render(document.body); + parentPanel.render(document.body); } - + return SE.composeLayout[idx]; }, /** @@ -939,14 +939,14 @@ SE.composeLayout = { }, getComposeLayout : function() { var idx = SE.composeLayout.currentInstanceId; - - this._createComposeLayout(idx); + + this._createComposeLayout(idx); SE.composeLayout[idx].render(); this._initComposeOptionTabs(idx); - + return SE.composeLayout[idx]; }, - + /** * Create the layout manager for the compose window. */ @@ -962,7 +962,7 @@ SE.composeLayout = { animate: false, scroll: false, split:true, - body: + body: SE.composeLayout.composeTemplate.exec({ 'app_strings':app_strings, 'mod_strings':mod_strings, @@ -986,24 +986,24 @@ SE.composeLayout = { }] }); }, - + /** * Create compose tab which will populate the 'right' container in the compose window. */ - _initComposeOptionTabs : function(idx) + _initComposeOptionTabs : function(idx) { var cTabs = new YAHOO.widget.TabView("composeRightTabs" + idx); - var tab = new YAHOO.widget.Tab({ + var tab = new YAHOO.widget.Tab({ label: app_strings.LBL_EMAIL_ATTACHMENT, scroll : true, content : SUGAR.util.getAndRemove("divAttachments" + idx).innerHTML, id : "divAttachments" + idx, active : true }); - + tab.layout = SE.composeLayout[idx]; - tab.on("activeChange", function(o){ + tab.on("activeChange", function(o){ if (o.newValue) { this.layout.getUnitByPosition("right").set("header", app_strings.LBL_EMAIL_ATTACHMENT); } @@ -1011,28 +1011,28 @@ SE.composeLayout = { cTabs.addTab(tab); - tab = new YAHOO.widget.Tab({ + tab = new YAHOO.widget.Tab({ label: app_strings.LBL_EMAIL_OPTIONS, scroll : true, content : SUGAR.util.getAndRemove("divOptions" + idx).innerHTML, id : "divOptions" + idx, active : false }); - + tab.layout = SE.composeLayout[idx]; - tab.on("activeChange", function(o){ + tab.on("activeChange", function(o){ if (o.newValue) { this.layout.getUnitByPosition("right").set("header", app_strings.LBL_EMAIL_OPTIONS); } }); cTabs.addTab(tab); - + SE.composeLayout[idx].autoSize = function() { var pEl = this.get("element").parentNode.parentNode.parentNode; this.set("height", pEl.clientHeight-30); this.render(); } - + SE.composeLayout[idx].rightTabs = cTabs; }, isParentTypeValid : function(idx) { @@ -1044,12 +1044,12 @@ SE.composeLayout = { } // if return true; }, - + isParentTypeAndNameValid : function(idx) { var parentTypeValue = document.getElementById('data_parent_type' + idx).value; var parentNameValue = document.getElementById('data_parent_name' + idx).value; var parentIdValue = document.getElementById('data_parent_id' + idx).value; - if ((trim(parentTypeValue) != "" && trim(parentNameValue) == "") || + if ((trim(parentTypeValue) != "" && trim(parentNameValue) == "") || (trim(parentTypeValue) != "" && trim(parentNameValue) != "" && parentIdValue == "")){ alert(mod_strings.LBL_ERROR_SELECT_MODULE_SELECT); return false; @@ -1058,12 +1058,12 @@ SE.composeLayout = { }, callopenpopupForEmail2 : function(idx,options) { - + var formName = 'emailCompose' + idx; - + if(typeof(options) != 'undefined' && typeof(options.form_name) != 'undefined') - formName = options.form_name; - + formName = options.form_name; + var parentTypeValue = document.getElementById('data_parent_type' + idx).value; var parentNameValue = document.getElementById('data_parent_name' + idx).value; if (!SE.composeLayout.isParentTypeValid(idx)) { @@ -1077,14 +1077,14 @@ SE.composeLayout = { id:'data_parent_id' + idx, name:'data_parent_name' + idx, email1:'email1'} - }); - }, - + }); + }, + popupAddEmail : function(o) { var nameKey = "data_parent_name" + SE.composeLayout.currentInstanceId; var data = o.name_to_value_array; - if (typeof (data[nameKey]) != "undefined" && data[nameKey] != "" + if (typeof (data[nameKey]) != "undefined" && data[nameKey] != "" && typeof (data["email1"]) != "undefined" && data["email1"] != "" && data["email1"] != "undefined") { var target = Dom.get("addressTO" + SE.composeLayout.currentInstanceId); @@ -1110,14 +1110,14 @@ SE.composeLayout = { }, this); } }, - + resizeEditor : function(idx) { var cof = Dom.get('composeOverFrame' + idx); var head = Dom.get('composeHeaderTable' + idx); var targetHeight = cof.clientHeight - head.clientHeight; - var instance = tinyMCE.get(SE.tinyInstances.currentHtmleditor); - + var instance = tinyMCE.get(SE.tinyInstances.currentHtmleditor); + var parentEl = Dom.get(instance.editorId + '_parent'); var toolbar = Dom.getElementsByClassName("mceFirst", "tr", parentEl)[0]; var contentEl = instance.contentAreaContainer; @@ -1173,7 +1173,7 @@ SE.composeLayout = { } else { this._1_tiny(); this._2_final(); - + if(isReplyForward) { this.replyForwardEmailStage2(); } @@ -1251,7 +1251,7 @@ SE.composeLayout = { target = document.getElementById(target); nodes = data; } - + if (target.id.indexOf('address') > -1) { // dropped onto email to/cc/bcc field for(var i in nodes) { @@ -1272,7 +1272,7 @@ SE.composeLayout = { var finalName = name.replace(/(<([^>]+)>)/ig, ""); email = finalName + email; } - target.value = SE.addressBook.smartAddEmailAddressToComposeField(target.value, email); + target.value = SE.addressBook.smartAddEmailAddressToComposeField(target.value, email); } } }, @@ -1282,12 +1282,12 @@ SE.composeLayout = { /// EMAIL TEMPLATE CODE */ applyEmailTemplate : function (idx, id) { - + //bug #20680 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; - + // id is selected index of email template drop-down if(id == '' || id == "0") { YAHOO.SUGAR.MessageBox.show({ @@ -1295,14 +1295,14 @@ SE.composeLayout = { msg: box_none_msg, type: 'confirm', fn: function(btn){ - if(btn=='no'){return;}; + if(btn=='no'){return;}; SUGAR.email2.composeLayout.processNoneResult(idx, id);}, modal:true, scope:this }); return; - } - + } + YAHOO.SUGAR.MessageBox.show({ title:box_title, msg: box_msg, @@ -1314,7 +1314,7 @@ SE.composeLayout = { scope:this }); }, - + processNoneResult : function(idx, id) { var tiny = SE.util.getTiny('htmleditor' + idx); var tinyHTML = tiny.getContent(); @@ -1326,9 +1326,9 @@ SE.composeLayout = { tiny.setContent(tinyHTML); } else { tiny.setContent(''); - } + } }, - + processResult : function(idx , id){ call_json_method('EmailTemplates','retrieve','record='+id,'email_template_object', this.appendEmailTemplateJSON); @@ -1381,20 +1381,20 @@ SE.composeLayout = { setTimeout("SE.composeLayout.setSignature(" + idx + ");", 1000); return; } - + if(idx) { var sel = document.getElementById('signatures' + idx); } else { var sel = document.getElementById('signature_id'); idx = SE.tinyInstances.currentHtmleditor; } - + //Ensure that the tinyMCE html has been rendered. if(typeof(SE.composeLayout.loadedTinyInstances[idx]) != 'undefined' && SE.composeLayout.loadedTinyInstances[idx] == false) { setTimeout("SE.composeLayout.setSignature(" + idx + ");",1000); return; } - + var signature = ''; try { @@ -1414,7 +1414,7 @@ SE.composeLayout = { } else var html = ''; - + var htmllow = html.toLowerCase(); var start = htmllow.indexOf(openTag); var end = htmllow.indexOf(closeTag) + closeTag.length; @@ -1424,7 +1424,7 @@ SE.composeLayout = { if (start > -1) { var htmlPart1 = html.substr(0, start); var htmlPart2 = html.substr(end, html.length); - + html = htmlPart1 + htmlPart2; t.setContent(html); } @@ -1453,7 +1453,7 @@ SE.composeLayout = { html = htmlPart1 + htmlPart2; } - + // [pre|ap]pend start = html.indexOf('

'); if(SE.userPrefs.signatures.signature_prepend == 'true' && start > -1) { @@ -1523,7 +1523,7 @@ SE.composeLayout = { index++; test = document.getElementById('documentId' + idx + index); } - + var documentCup = document.createElement("div"); documentCup.id = 'documentCup' + idx + index; documentCup.innerHTML = "" + @@ -1532,15 +1532,15 @@ SE.composeLayout = { // document name field "" + // select button - "" + // remove button - "" + + "" + "
"; - + basket.appendChild(documentCup); //basket.innerHTML += out; return index; @@ -1559,7 +1559,7 @@ SE.composeLayout = { windowName = 'selectDocument'; windowFeatures = 'width=800' + ',height=600' + ',resizable=1,scrollbars=1'; - win = window.open(URL, windowName, windowFeatures); + win = SUGAR.util.openWindow(URL, windowName, windowFeatures); if(window.focus) { // put the focus on the popup if the browser supports the focus() method win.focus(); @@ -1577,7 +1577,7 @@ SE.composeLayout = { fixedcenter:true, constraintoviewport: true, scroll: true, - keylisteners : new YAHOO.util.KeyListener(document, { keys:27 }, { + keylisteners : new YAHOO.util.KeyListener(document, { keys:27 }, { fn:function(){SE.addFileDialog.hide();} }) }); @@ -1586,7 +1586,7 @@ SE.composeLayout = { // SE.addFileDialog.addKeyListener(27, , SE.addFileDialog); } Dom.removeClass("addFileDialog", "yui-hidden"); - + SE.addFileDialog.show(); }, @@ -1680,9 +1680,9 @@ SE.composeLayout = { } var out = "
" + - // remove button + // remove button "" + // file icon "" + @@ -1691,12 +1691,12 @@ SE.composeLayout = { // docId field "" + // file name - " " + - "

" + + " " + + "

" + "
"; basket.innerHTML = basket.innerHTML + out; - + return index; }, @@ -1706,17 +1706,17 @@ SE.composeLayout = { * @param bool isDraft */ sendEmail : function(idx, isDraft) { - + //If the outbound account has an error message associate with it, alert the user and refuse to continue. var obAccountID = document.getElementById('addressFrom' + idx).value; - + if( typeof(SUGAR.email2.composeLayout.outboundAccountErrors[obAccountID]) != 'undefined' ) { overlay(app_strings.LBL_EMAIL_ERROR_DESC, SUGAR.email2.composeLayout.outboundAccountErrors[obAccountID], 'alert'); return false; } - - + + var form = document.getElementById('emailCompose' + idx); var composeOptionsFormName = "composeOptionsForm" + idx; var t = SE.util.getTiny(SE.tinyInstances.currentHtmleditor); @@ -1729,16 +1729,16 @@ SE.composeLayout = { var composeType = document.getElementById('composeType').value; var parent_type = document.getElementById("parent_type").value; var parent_id = document.getElementById("parent_id").value; - + var el_uid = document.getElementById("uid"); var uid = (el_uid == null) ? '' : el_uid.value; - + var el_ieId = document.getElementById("ieId"); var ieId = (el_ieId == null) ? '' : el_ieId.value; - + var el_mbox = document.getElementById("mbox"); var mbox = (el_mbox == null) ? '' : el_mbox.value; - + if (!isValidEmail(to) || !isValidEmail(cc) || !isValidEmail(bcc)) { alert(app_strings.LBL_EMAIL_COMPOSE_INVALID_ADDRESS); return false; @@ -1766,7 +1766,7 @@ SE.composeLayout = { } } else if(html == '' && !isDraft) { if(!confirm(app_strings.LBL_EMAIL_COMPOSE_NO_BODY)) { - return false; + return false; } } @@ -1774,9 +1774,9 @@ SE.composeLayout = { document.getElementById('data_parent_id' + idx).value = parentIdValue; var title = (isDraft) ? app_strings.LBL_EMAIL_SAVE_DRAFT : app_strings.LBL_EMAIL_SENDING_EMAIL; overlay(title, app_strings.LBL_EMAIL_ONE_MOMENT); - html = html.replace(/</ig, "sugarLessThan"); + html = html.replace(/</ig, "sugarLessThan"); html = html.replace(/>/ig, "sugarGreaterThan"); - + form.sendDescription.value = html; form.sendSubject.value = subj; form.sendTo.value = to; @@ -1875,15 +1875,15 @@ SE.composeLayout = { composePackage : function() { if(composePackage != null) { SE.composeLayout.c0_composeNewEmail(); - - + + if(composePackage.to_email_addrs) { document.getElementById("addressTO" + SE.composeLayout.currentInstanceId).value = composePackage.to_email_addrs; } // if if (composePackage.subject != null && composePackage.subject.length > 0) { document.getElementById("emailSubject" + SE.composeLayout.currentInstanceId).value = composePackage.subject; } - + //If no parent fields are set in the composePackage, ensure they are cleared. var parentFields = ['parent_type','parent_name','parent_id']; for(var i=0;i 0) { document.getElementById("email_id" + SE.composeLayout.currentInstanceId).value = composePackage.email_id; } // if @@ -1907,9 +1907,9 @@ SE.composeLayout = { setTimeout("SE.composeLayout.setContentOnThisTiny();", 3000); } // if if (composePackage.attachments != null) { - SE.composeLayout.loadAttachments(composePackage.attachments); + SE.composeLayout.loadAttachments(composePackage.attachments); } // if - + if (composePackage.fromAccounts != null && composePackage.fromAccounts.status) { var addressFrom = document.getElementById('addressFrom' + SE.composeLayout.currentInstanceId); SE.util.emptySelectOptions(addressFrom); @@ -1922,8 +1922,8 @@ SE.composeLayout = { opt.selected = true; } addressFrom.options.add(opt); - } - + } + } // if } // if }, @@ -1940,8 +1940,8 @@ SE.composeLayout = { if (typeof(composePackage.clearBody) != 'undefined' && composePackage.clearBody) SE.composeLayout.tinyHTML = ''; else - SE.composeLayout.tinyHTML = tinyHTML + composePackage.body; - + SE.composeLayout.tinyHTML = tinyHTML + composePackage.body; + tiny.setContent(SE.composeLayout.tinyHTML); //Indicate that the contents has been loaded successfully. SE.composeLayout.loadedTinyInstances[SE.composeLayout.currentInstanceId] = true; @@ -1963,7 +1963,7 @@ SE.composeLayout = { */ forceCloseCompose : function(id) { SE.composeLayout.closeCompose(id); - + // handle flow back to originating view if(composePackage) { // check if it's a module we need to return to @@ -2004,11 +2004,11 @@ SE.composeLayout = { * Enable the quick search for the compose relate field or search tab */ enableQuickSearchRelate: function(idx,overides){ - + if(typeof overides != 'undefined') { var newModuleID = overides['moduleSelectField']; //data_parent_type_search - var newModule = document.getElementById(newModuleID).value; + var newModule = document.getElementById(newModuleID).value; var formName = overides['formName']; var fieldName = overides['fieldName']; var fieldId = overides['fieldId']; @@ -2024,10 +2024,10 @@ SE.composeLayout = { var fullName = formName + "_" + fieldName; var postBlurFunction = "SE.composeLayout.qsAddAddress"; } - + if(typeof sqs_objects == 'undefined') window['sqs_objects'] = new Array; - + window['sqs_objects'][fullName] = { form:formName, method:"query", @@ -2037,8 +2037,8 @@ SE.composeLayout = { conditions:[{name:"name",op:"like_custom",end:"%",value:""}], post_onblur_function: postBlurFunction, order:"name","limit":"30","no_match_text":"No Match"}; - - + + if(typeof QSProcessedFieldsArray != 'undefined') QSProcessedFieldsArray[fullName] = false; if (typeof(QSFieldsArray) != 'undefined' && typeof(QSFieldsArray[fullName]) != 'undefined') { @@ -2048,10 +2048,10 @@ SE.composeLayout = { if (Dom.get(fullName + "_results")) { Dom.get(fullName + "_results").parentNode.removeChild(Dom.get(fullName + "_results")); } - + enableQS(false); }, - + qsAddAddress : function(o) { if (o.name != "" && o.email1 != "") { @@ -2100,7 +2100,7 @@ SE.composeLayout = { setComposeOptions : function(idx) { // send from accounts var addressFrom = document.getElementById('addressFrom' + idx); - + if (addressFrom.options.length <= 0) { SE.util.emptySelectOptions(addressFrom); var fromAccountOpts = SE.composeLayout.fromAccounts; @@ -2180,7 +2180,7 @@ SE.composeLayout = { var sendType = type; AjaxObject.startRequest(callbackReplyForward, urlStandard + "&composeType=" + type + sugarEmail); }, - + /** * Show the hidden cc or bcc fields */ @@ -2190,22 +2190,22 @@ SE.composeLayout = { Dom.addClass(addrType+"_span"+idx, "yui-hidden"); Dom.addClass("bcc_cc_sep"+idx, "yui-hidden"); this[addrType+'Hidden'+idx] = false; - + //After bcc or cc is added, move options below last addr field Dom.insertAfter("add_addr_options_tr"+idx, 'bcc_tr'+idx); - + //If both cc and bcc hidden, remove the empty row containing text. if( ( typeof(this['ccHidden'+idx]) != 'undefined' && typeof(this['bccHidden'+idx]) != 'undefined') && ( this['ccHidden'+idx] == false && this['bccHidden'+idx] == false) ) - Dom.addClass("add_addr_options_tr"+idx, "yui-hidden"); - + Dom.addClass("add_addr_options_tr"+idx, "yui-hidden"); + SE.composeLayout.resizeEditor(idx); }, /** * Hide the cc and bcc fields if they were shown. */ hideHiddenAddresses: function(idx){ - + var addrTypes = ['cc','bcc']; for(var i = 0;i element to an Ext.form.combobox */ @@ -2398,19 +2398,19 @@ SE.util = { select = document.getElementById(select); } }, - + findChildNode : function (parent, property, value) { for (i in parent.children) { var child = parent.children[i]; if (child.data[property] && child.data[property] == value || child[property] && child[property] == value) return child; var searchChild = SE.util.findChildNode(child, property, value); - if (searchChild) + if (searchChild) return searchChild; } return false; }, - + cascadeNodes : function (parent, fn, scope, args) { for (i in parent.children) { var child = parent.children[i]; diff --git a/modules/Emails/javascript/ajax.js b/modules/Emails/javascript/ajax.js index 63132a50..e047094e 100644 --- a/modules/Emails/javascript/ajax.js +++ b/modules/Emails/javascript/ajax.js @@ -34,7 +34,7 @@ ********************************************************************************/ -if (typeof console == "undefined") +if (typeof console == "undefined") console = { log: function(o) {alert(o)} }; var AjaxObject = { @@ -73,8 +73,8 @@ var AjaxObject = { SUGAR.email2.composeLayout.fromAccounts = ret.fromAccounts; SUGAR.email2.composeLayout.setComposeOptions(idx); - - //Set the error array so we can notify the user when they try to hit send if any errors + + //Set the error array so we can notify the user when they try to hit send if any errors //are present. We will also notify them now (after hitting compose button). SUGAR.email2.composeLayout.outboundAccountErrors = ret.errorArray; @@ -89,7 +89,7 @@ var AjaxObject = { for(i in ret.errorArray) overlay(app_strings.LBL_EMAIL_ERROR_DESC, ret.errorArray[i], 'alert'); } - + //YUI bug with IE6 - Wont restore visibility property for nested select elements. if(SUGAR.isIE) { var overlayPanel = YAHOO.SUGAR.MessageBox.panel; @@ -113,7 +113,7 @@ var AjaxObject = { } setSigEditButtonVisibility(); }, - + /** */ handleDeleteReturn : function(o) { @@ -177,18 +177,18 @@ var AjaxObject = { SUGAR.email2.composeLayout.showHiddenAddress('bcc',idx); } - + if(a.type) { document.getElementById('type' + idx).value = a.type; } - + // apply attachment values SUGAR.email2.composeLayout.loadAttachments(a.attachments); setTimeout("callbackReplyForward.finish(globalA);", 500); }, - + /** */ handleSuccess : function(o) { @@ -206,7 +206,7 @@ var AjaxObject = { SUGAR.email2.accounts.refreshInboundAccountTable(); alert(app_strings.LBL_EMAIL_IE_DELETE_SUCCESSFUL); SUGAR.email2.accounts.rebuildFolderList(); - + }, /** @@ -227,9 +227,9 @@ var AjaxObject = { } } else { hideOverlay(); - overlay(app_strings.LBL_EMAIL_ERROR_DESC, app_strings.LBL_EMAIL_ERROR_SAVE_ACCOUNT, 'alert'); + overlay(app_strings.LBL_EMAIL_ERROR_DESC, app_strings.LBL_EMAIL_ERROR_SAVE_ACCOUNT, 'alert'); } - + }, /** @@ -255,7 +255,7 @@ var AjaxObject = { var ret = JSON.parse(o.responseText); if (!ret['status']) { hideOverlay(); - overlay(app_strings.LBL_EMAIL_ERROR_DESC, ret['message'], 'alert'); + overlay(app_strings.LBL_EMAIL_ERROR_DESC, ret['message'], 'alert'); } else { SUGAR.email2.contextMenus.markEmailCleanup(); } // else @@ -308,29 +308,29 @@ var AjaxObject = { } else if (o.responseText) { overlay(mod_strings.LBL_SEND_EMAIL_FAIL_TITLE, o.responseText, 'alert'); } - + if (typeof(SE.grid) != 'undefined') SE.listView.refreshGrid(); //Disabled while address book is disabled - + //If this call back was initiated by quick compose from a Detail View page, refresh the //history subpanel. If it was initiated by quickcreate from shortcut bar, then //close the shortcut bar menu if ( (typeof(action_sugar_grp1) != 'undefined')) { if(action_sugar_grp1 == 'DetailView') { - showSubPanel('history',null,true); + showSubPanel('history',null,true); } else if(action_sugar_grp1 == 'quickcreate') { closeEmailOverlay(); } } - + }, ieSendSuccess : function(o) { hideOverlay(); overlay(app_strings.LBL_EMAIL_TEST_OUTBOUND_SETTINGS_SENT, app_strings.LBL_EMAIL_TEST_NOTIFICATION_SENT, 'plain'); }, - + /** */ settingsFolderRefresh : function(o) { @@ -361,7 +361,7 @@ var AjaxObject = { this.currentRequestObject = YAHOO.util.Connect.asyncRequest('POST', "./index.php", callback, args); this._reset(); }, - + requestInProgress : function() { return (YAHOO.util.Connect.isCallInProgress(this.currentRequestObject)); }, @@ -397,11 +397,11 @@ var AjaxObject = { var idx = SUGAR.email2.composeLayout.currentInstanceId; var overall = document.getElementById('addedFiles' + idx); var index = overall.childNodes.length; - var out = + var out = "
" + - // remove button + // remove button "" + // file icon "" + // file name - ((ret.nameForDisplay != null) ? ret.nameForDisplay + " " : ret.name + " ") + + ((ret.nameForDisplay != null) ? ret.nameForDisplay + " " : ret.name + " ") + "
" + "
"; overall.innerHTML += out; @@ -435,10 +435,10 @@ AjaxObject.accounts = { SUGAR.email2.accounts.newAddedOutboundId = id; }, saveDefaultOutboundCleanup: function(o){ - + }, callbackEditOutbound : { - success : function(o) + success : function(o) { var ret = JSON.parse(o.responseText); // show overlay @@ -453,11 +453,10 @@ AjaxObject.accounts = { document.getElementById("outboundEmailForm").mail_smtptype.value = ret.mail_smtptype; document.getElementById("mail_smtpport").value = ret.mail_smtpport; document.getElementById("mail_smtpuser").value = ret.mail_smtpuser; - document.getElementById("mail_smtppass").value = ret.mail_smtppass; document.getElementById("mail_smtpauth_req").checked = (ret.mail_smtpauth_req == 1) ? true : false; SUGAR.email2.accounts.smtp_authenticate_field_display(); document.getElementById("mail_smtpssl").options[ret.mail_smtpssl].selected = true; - + if(ret.type == 'system-override') { SUGAR.email2.accounts.toggleOutboundAccountDisabledFields(true); SUGAR.email2.accounts.changeEmailScreenDisplay(ret.mail_smtptype,true); @@ -466,8 +465,8 @@ AjaxObject.accounts = { SUGAR.email2.accounts.toggleOutboundAccountDisabledFields(false); SUGAR.email2.accounts.changeEmailScreenDisplay(ret.mail_smtptype,false); } - - + SUGAR.util.setEmailPasswordDisplay('mail_smtppass', ret.has_password); + }, failure : AjaxObject.handleFailure, timeout : AjaxObject.timeout, @@ -478,13 +477,13 @@ AjaxObject.accounts = { var ret = JSON.parse(o.responseText); if(ret.is_error) { - if(confirm(ret.error_message)) + if(confirm(ret.error_message)) { overlay(app_strings.LBL_EMAIL_IE_DELETE, app_strings.LBL_EMAIL_ONE_MOMENT); AjaxObject.startRequest(AjaxObject.accounts.callbackDeleteOutbound, urlStandard + "&emailUIAction=deleteOutbound&confirm=true&outbound_email=" + ret.outbound_email); } else - hideOverlay(); + hideOverlay(); } else { @@ -492,35 +491,35 @@ AjaxObject.accounts = { SUGAR.email2.accounts.refreshOuboundAccountTable(); } }, - + failure : AjaxObject.handleFailure, timeout : AjaxObject.timeout, scope : AjaxObject }, - + callbackCheckMailProgress : { success : function(o) { if (typeof(SUGAR.email2.accounts.totalMsgCount) == "undefined") { SUGAR.email2.accounts.totalMsgCount = -1; } - + //Check for server timeout / errors var ret = JSON.parse(o.responseText); var done = false; - + if (typeof(o.responseText) == 'undefined' || o.responseText == "" || ret == false) { hideOverlay(); overlay(app_strings.LBL_EMAIL_ERROR_DESC, app_strings.LBL_EMAIL_ERROR_TIMEOUT, 'alert'); SUGAR.email2.accounts.totalMsgCount = -1; //SUGAR.email2.folders.rebuildFolders(); done = true; - } - + } + var currIeId = ret['ieid']; - - + + var serverCount = ret.count; - + if (ret['status'] == 'done') { for(i=0; i < SUGAR.email2.accounts.ieIds.length; i++) { if (i == SUGAR.email2.accounts.ieIds.length - 1) { @@ -535,7 +534,7 @@ AjaxObject.accounts = { break; } } - } + } else if (ret.mbox && ret.totalcount && ret.count) { SUGAR.email2.accounts.totalMsgCount = ret.totalcount; if (ret.count >= ret.totalcount) { @@ -549,7 +548,7 @@ AjaxObject.accounts = { SUGAR.email2.accounts.totalMsgCount = -1; done = true; } - + if (done) { SUGAR.email2.accounts.totalMsgCount = -1; hideOverlay(); @@ -557,13 +556,13 @@ AjaxObject.accounts = { SE.listView.refreshGrid(); } else if (SUGAR.email2.accounts.totalMsgCount < 0) { YAHOO.SUGAR.MessageBox.updateProgress(0, mod_strings.LBL_CHECKING_ACCOUNT + ' '+ (i + 2) + ' '+ mod_strings.LBL_OF + ' ' + SUGAR.email2.accounts.ieIds.length); - AjaxObject.startRequest(AjaxObject.accounts.callbackCheckMailProgress, urlStandard + + AjaxObject.startRequest(AjaxObject.accounts.callbackCheckMailProgress, urlStandard + '&emailUIAction=checkEmailProgress&ieId=' + currIeId + "¤tCount=0&synch=" + ret.synch); } else { YAHOO.SUGAR.MessageBox.updateProgress((ret.count / SUGAR.email2.accounts.totalMsgCount) * 100, app_strings.LBL_EMAIL_DOWNLOAD_STATUS.replace(/\[\[count\]\]/, ret.count).replace(/\[\[total\]\]/, SUGAR.email2.accounts.totalMsgCount)); - AjaxObject.startRequest(AjaxObject.accounts.callbackCheckMailProgress, urlStandard + - '&emailUIAction=checkEmailProgress&ieId=' + currIeId + "¤tCount=" + serverCount + + AjaxObject.startRequest(AjaxObject.accounts.callbackCheckMailProgress, urlStandard + + '&emailUIAction=checkEmailProgress&ieId=' + currIeId + "¤tCount=" + serverCount + '&mbox=' + ret.mbox + '&synch=' + ret.synch + '&totalcount=' + SUGAR.email2.accounts.totalMsgCount); } }, @@ -584,7 +583,7 @@ AjaxObject.composeLayout = { var ret = JSON.parse(o.responseText); if(ret) SUGAR.email2.composeLayout.forceCloseCompose(ret.composeLayoutId); - else if (o.responseText) + else if (o.responseText) overlay(mod_strings.LBL_ERROR_SAVING_DRAFT, o.responseText, 'alert'); } }; @@ -612,7 +611,7 @@ AjaxObject.detailView = { if (typeof(email.cc) == 'undefined') { email.cc = ""; } - + var out = displayTemplate.exec({ 'app_strings' : app_strings, 'theme' : theme, @@ -622,7 +621,7 @@ AjaxObject.detailView = { }); // open popup window - var popup = window.open('modules/Emails/templates/_blank.html', 'printwin' , + var popup = window.open('modules/Emails/templates/_blank.html', 'printwin' , 'scrollbars=yes,menubar=no,height=600,width=800,resizable=yes,toolbar=no,location=no,status=no'); popup.document.write(out); @@ -657,7 +656,7 @@ AjaxObject.detailView = { SED.viewDialog.setHeader(ret.title); SED.viewDialog.setBody(ret.html); SED.viewDialog.render(); - SED.viewDialog.show(); + SED.viewDialog.show(); }, /** @@ -675,7 +674,7 @@ AjaxObject.detailView = { constraintoviewport: true, shadow : true }); - + SED.quickCreateDialog.renderEvent.subscribe(function() { var viewH = YAHOO.util.Dom.getViewportHeight(); var contH = 0; @@ -690,7 +689,7 @@ AjaxObject.detailView = { this.body.style.height = (viewH - 75 > contH ? (contH + 10) : (viewH - 75)) + "px"; this.body.style.overflow = "auto"; }, SED.quickCreateDialog); - + SED.quickCreateDialog.hideEvent.subscribe(function(){ var qsFields = YAHOO.util.Dom.getElementsByClassName('.sqsEnabled', null, this.body); /*for(var qsField in qsFields){ @@ -706,29 +705,29 @@ AjaxObject.detailView = { SED.quickCreateDialog.setBody(ret.html ? ret.html : " "); SED.quickCreateDialog.render(); SUGAR.util.evalScript(ret.html + ''); - + SED.quickCreateDialog.ieId = ret.ieId; SED.quickCreateDialog.uid = ret.uid; SED.quickCreateDialog.mbox = ret.mbox; SED.quickCreateDialog.qcmodule = ret.module; - + SED.quickCreateDialog.show(); var editForm = document.getElementById('form_EmailQCView_' + ret.module); if (editForm) { editForm.module.value = 'Emails'; - var count = SUGAR.EmailAddressWidget.count[ret.module] ? SUGAR.EmailAddressWidget.count[ret.module] : 0; + var count = SUGAR.EmailAddressWidget.count[ret.module] ? SUGAR.EmailAddressWidget.count[ret.module] : 0; var tableId = YAHOO.util.Dom.getElementsByClassName('emailaddresses', 'table', editForm)[0].id; var instId = ret.module + count; SED.quickCreateEmailsToAdd = ret.emailAddress; SED.quickCreateEmailCallback = function(instId, tableId) { var eaw = SUGAR.EmailAddressWidget.instances[instId]; if (typeof(eaw) == "undefined") - window.setTimeout("SUGAR.email2.detailView.quickCreateEmailCallback('" + window.setTimeout("SUGAR.email2.detailView.quickCreateEmailCallback('" + instId + "','" + tableId + "');", 100); eaw.prefillEmailAddresses(tableId, SUGAR.email2.detailView.quickCreateEmailsToAdd); } - window.setTimeout("SUGAR.email2.detailView.quickCreateEmailCallback('" + window.setTimeout("SUGAR.email2.detailView.quickCreateEmailCallback('" + instId + "','" + tableId + "');", 100); } }, @@ -761,7 +760,7 @@ AjaxObject.detailView = { SUGAR.email2.complexLayout.findPanel('contactsTab').show(); validate['EditView'] = [ ]; }, - + handleAssignmentDialogAssignAction : function() { @@ -778,7 +777,7 @@ AjaxObject.detailView = { alert(warning_message); return; } - + var emailUids = SUGAR.email2.listView.getUidsFromSelection(); var uids = ""; for(i=0; i - +
- {$APP.LBL_EMAIL_SETTINGS_FROM_TO_EMAIL_ADDR} + {$APP.LBL_EMAIL_SETTINGS_FROM_TO_EMAIL_ADDR} {$APP.LBL_REQUIRED_SYMBOL} @@ -500,25 +503,21 @@ function testOutboundSettings() { isError = true; errorMessage += "{/literal}{$APP.LBL_EMAIL_ACCOUNTS_SMTPUSER}{literal}" + "
"; } - if(trim(document.getElementById('mail_smtppass').value) == '') { - isError = true; - errorMessage += "{/literal}{$APP.LBL_EMAIL_ACCOUNTS_SMTPPASS}{literal}" + "
"; - } } if(isError) { overlay("{/literal}{$APP.ERR_MISSING_REQUIRED_FIELDS}{literal}", errorMessage, 'alert'); - return false; - } - + return false; + } + testOutboundSettingsDialog(); - + } function sendTestEmail() { var toAddress = document.getElementById("outboundtest_from_address").value; - var fromAddress = document.getElementById("notify_fromaddress").value; - if (trim(toAddress) == "") + var fromAddress = document.getElementById("notify_fromaddress").value; + if (trim(toAddress) == "") { overlay("{/literal}{$APP.ERR_MISSING_REQUIRED_FIELDS}{literal}", "{/literal}{$APP.LBL_EMAIL_SETTINGS_FROM_TO_EMAIL_ADDR}{literal}", 'alert'); return; @@ -527,7 +526,7 @@ function sendTestEmail() overlay("{/literal}{$APP.ERR_INVALID_REQUIRED_FIELDS}{literal}", "{/literal}{$APP.LBL_EMAIL_SETTINGS_FROM_TO_EMAIL_ADDR}{literal}", 'alert'); return; } - if (trim(fromAddress) == "") + if (trim(fromAddress) == "") { overlay("{/literal}{$APP.ERR_MISSING_REQUIRED_FIELDS}{literal}", "{/literal}{$APP.LBL_EMAIL_SETTINGS_FROM_ADDR}{literal}", 'alert'); return; @@ -539,22 +538,22 @@ function sendTestEmail() //Hide the email address window and show a message notifying the user that the test email is being sent. EmailMan.testOutboundDialog.hide(); overlay("{/literal}{$APP.LBL_EMAIL_PERFORMING_TASK}{literal}", "{/literal}{$APP.LBL_EMAIL_ONE_MOMENT}{literal}", 'alert'); - + var callbackOutboundTest = { success : function(o) { hideOverlay(); overlay("{/literal}{$APP.LBL_EMAIL_TEST_OUTBOUND_SETTINGS}{literal}", "{/literal}{$APP.LBL_EMAIL_TEST_NOTIFICATION_SENT}{literal}", 'alert'); } - }; + }; var smtpServer = document.getElementById('mail_smtpserver').value; var smtpPort = document.getElementById('mail_smtpport').value; var smtpssl = document.getElementById('mail_smtpssl').value; var mailsmtpauthreq = document.getElementById('mail_smtpauth_req'); - var mail_sendtype = document.getElementById('mail_sendtype').value; - var postDataString = 'mail_sendtype=' + mail_sendtype + '&mail_smtpserver=' + smtpServer + "&mail_smtpport=" + smtpPort + "&mail_smtpssl=" + smtpssl + - "&mail_smtpauth_req=" + mailsmtpauthreq.checked + "&mail_smtpuser=" + trim(document.getElementById('mail_smtpuser').value) + + var mail_sendtype = document.getElementById('mail_sendtype').value; + var postDataString = 'mail_name=system&mail_sendtype=' + mail_sendtype + '&mail_smtpserver=' + smtpServer + "&mail_smtpport=" + smtpPort + "&mail_smtpssl=" + smtpssl + + "&mail_smtpauth_req=" + mailsmtpauthreq.checked + "&mail_smtpuser=" + trim(document.getElementById('mail_smtpuser').value) + "&mail_smtppass=" + trim(document.getElementById('mail_smtppass').value) + "&outboundtest_to_address=" + toAddress + "&outboundtest_from_address=" + fromAddress; - + YAHOO.util.Connect.asyncRequest("POST", "index.php?action=testOutboundEmail&module=EmailMan&to_pdf=true&sugar_body_only=true", callbackOutboundTest, postDataString); } function testOutboundSettingsDialog() { @@ -571,7 +570,7 @@ function testOutboundSettingsDialog() { EmailMan.testOutboundDialog.setHeader("{/literal}{$APP.LBL_EMAIL_TEST_OUTBOUND_SETTINGS}{literal}"); YAHOO.util.Dom.removeClass("testOutboundDialog", "yui-hidden"); } // end lazy load - + EmailMan.testOutboundDialog.render(); EmailMan.testOutboundDialog.show(); } // fn @@ -600,7 +599,7 @@ function notify_setrequired(f) { YAHOO.util.Dom.removeClass('mail_allow_user', "yui-hidden"); else YAHOO.util.Dom.addClass("mail_allow_user", "yui-hidden"); - + return true; } /** @@ -611,18 +610,18 @@ function setOutlookDefault() { var shouldToggle = true; var aCheckFields = ['applet','base', 'embed','form','frame','frameset', 'iframe','import','layer','link', 'object', 'xmp']; - + for(var i=0;i".translate('LBL_MODULE_NAME','Administration')."", $mod_strings['LBL_CONFIGURE_SETTINGS'], ); } - + /** * @see SugarView::preDisplay() */ public function preDisplay() { global $current_user; - + if ( !is_admin($current_user) && !is_admin_for_module($GLOBALS['current_user'],'Emails') - && !is_admin_for_module($GLOBALS['current_user'],'Campaigns') ) - sugar_die("Unauthorized access to administration."); + && !is_admin_for_module($GLOBALS['current_user'],'Campaigns') ) + sugar_die("Unauthorized access to administration."); } - + /** * @see SugarView::display() */ @@ -84,58 +84,58 @@ class ViewConfig extends SugarView global $app_strings; global $current_user; global $sugar_config; - - + + echo $this->getModuleTitle(); global $currentModule; - - - - - + + + + + $focus = new Administration(); $focus->retrieveSettings(); //retrieve all admin settings. $GLOBALS['log']->info("Mass Emailer(EmailMan) ConfigureSettings view"); - + $this->ss->assign("MOD", $mod_strings); $this->ss->assign("APP", $app_strings); - + $this->ss->assign("RETURN_MODULE", "Administration"); $this->ss->assign("RETURN_ACTION", "index"); - + $this->ss->assign("MODULE", $currentModule); $this->ss->assign("PRINT_URL", "index.php?".$GLOBALS['request_string']); $this->ss->assign("HEADER", get_module_title("EmailMan", "{MOD.LBL_CONFIGURE_SETTINGS}", true)); - + $this->ss->assign("notify_fromaddress", $focus->settings['notify_fromaddress']); $this->ss->assign("notify_send_from_assigning_user", (isset($focus->settings['notify_send_from_assigning_user']) && !empty($focus->settings['notify_send_from_assigning_user'])) ? "checked='checked'" : ""); $this->ss->assign("notify_on", ($focus->settings['notify_on']) ? "checked='checked'" : ""); $this->ss->assign("notify_fromname", $focus->settings['notify_fromname']); $this->ss->assign("notify_allow_default_outbound_on", (!empty($focus->settings['notify_allow_default_outbound']) && $focus->settings['notify_allow_default_outbound']) ? "checked='checked'" : ""); - + $this->ss->assign("mail_smtptype", $focus->settings['mail_smtptype']); $this->ss->assign("mail_smtpserver", $focus->settings['mail_smtpserver']); $this->ss->assign("mail_smtpport", $focus->settings['mail_smtpport']); $this->ss->assign("mail_smtpuser", $focus->settings['mail_smtpuser']); - $this->ss->assign("mail_smtppass", $focus->settings['mail_smtppass']); $this->ss->assign("mail_smtpauth_req", ($focus->settings['mail_smtpauth_req']) ? "checked='checked'" : ""); + $this->ss->assign("mail_haspass", empty($focus->settings['mail_smtppass'])?0:1); $this->ss->assign("MAIL_SSL_OPTIONS", get_select_options_with_id($app_list_strings['email_settings_for_ssl'], $focus->settings['mail_smtpssl'])); - + //Assign the current users email for the test send dialogue. $this->ss->assign("CURRENT_USER_EMAIL", $current_user->email1); - + $showSendMail = FALSE; $outboundSendTypeCSSClass = "yui-hidden"; - if(isset($sugar_config['allow_sendmail_outbound']) && $sugar_config['allow_sendmail_outbound']) + if(isset($sugar_config['allow_sendmail_outbound']) && $sugar_config['allow_sendmail_outbound']) { $showSendMail = TRUE; $app_list_strings['notifymail_sendtype']['sendmail'] = 'sendmail'; $outboundSendTypeCSSClass = ""; } - + $this->ss->assign("OUTBOUND_TYPE_CLASS", $outboundSendTypeCSSClass); $this->ss->assign("mail_sendtype_options", get_select_options_with_id($app_list_strings['notifymail_sendtype'], $focus->settings['mail_sendtype'])); - + /////////////////////////////////////////////////////////////////////////////// //// USER EMAIL DEFAULTS // editors @@ -144,40 +144,40 @@ class ViewConfig extends SugarView foreach($editors as $k => $v) { if($k != "") { $newEditors[$k] = $v; } } - + // preserve attachments $preserveAttachments = ''; if(isset($sugar_config['email_default_delete_attachments']) && $sugar_config['email_default_delete_attachments'] == true) { $preserveAttachments = 'CHECKED'; - } + } $this->ss->assign('DEFAULT_EMAIL_DELETE_ATTACHMENTS', $preserveAttachments); //// END USER EMAIL DEFAULTS /////////////////////////////////////////////////////////////////////////////// - - + + //setting to manage. //emails_per_run //tracking_entities_location_type default or custom //tracking_entities_location http://www.sugarcrm.com/track/ - + ////////////////////////////////////////////////////////////////////////////// //// EMAIL SECURITY if(!isset($sugar_config['email_xss']) || empty($sugar_config['email_xss'])) { $sugar_config['email_xss'] = getDefaultXssTags(); } - + foreach(unserialize(base64_decode($sugar_config['email_xss'])) as $k => $v) { $this->ss->assign($k."Checked", 'CHECKED'); } - + //clean_xss('here'); //// END EMAIL SECURITY /////////////////////////////////////////////////////////////////////////////// - + require_once('modules/Emails/Email.php'); $email = new Email(); $this->ss->assign('ROLLOVER', $email->rolloverStyle); - + $this->ss->assign("JAVASCRIPT",get_validate_record_js()); $this->ss->display('modules/EmailMan/tpls/config.tpl'); } diff --git a/modules/Emails/Compose.php b/modules/Emails/Compose.php index 52ad64af..e3429abc 100644 --- a/modules/Emails/Compose.php +++ b/modules/Emails/Compose.php @@ -46,11 +46,15 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); //Shorten name. $data = $_REQUEST; +if (!empty($data['listViewExternalClient'])) { + $email = new Email(); + echo $email->getNamePlusEmailAddressesForCompose($_REQUEST['action_module'], (explode(",", $_REQUEST['uid']))); +} //For the full compose/email screen, the compose package is generated and script execution -//continues to the Emails/index.php page. - -if(!isset($data['forQuickCreate'])) +//continues to the Emails/index.php page. +else if(!isset($data['forQuickCreate'])) { $ret = generateComposeDataPackage($data); +} /** * Initialize the full compose window by creating the compose package @@ -126,7 +130,7 @@ function generateComposeDataPackage($data,$forFullCompose = TRUE) $email_id = ""; $attachments = array(); if ($bean->module_dir == 'Cases') { - $subject = str_replace('%1', $bean->case_number, $bean->getEmailSubjectMacro() . " ". $bean->name) ; + $subject = str_replace('%1', $bean->case_number, $bean->getEmailSubjectMacro() . " ". from_html($bean->name)) ;//bug 41928 $bean->load_relationship("contacts"); $contact_ids = $bean->contacts->get(); $contact = new Contact(); diff --git a/modules/Emails/Email.php b/modules/Emails/Email.php index 022dfc5c..82b492ad 100644 --- a/modules/Emails/Email.php +++ b/modules/Emails/Email.php @@ -255,7 +255,7 @@ class Email extends SugarBean { function email2ParseAddresses($addresses) { $addresses = from_html($addresses); $addresses = $this->et->unifyEmailString($addresses); - + $pattern = '/@.*,/U'; preg_match_all($pattern, $addresses, $matchs); if (!empty($matchs[0])){ @@ -311,7 +311,7 @@ class Email extends SugarBean { } $exAddr = explode("::;::", $addresses); - + $ret = array(); $clean = array("<", ">"); $dirty = array("<", ">"); @@ -376,9 +376,9 @@ class Email extends SugarBean { $mail->Password = $smtppassword; } } - else + else $mail->Mailer = 'sendmail'; - + $mail->Subject = from_html($mod_strings['LBL_TEST_EMAIL_SUBJECT']); $mail->From = $fromaddress; $mail->FromName = $current_user->name; @@ -387,7 +387,7 @@ class Email extends SugarBean { $mail->Body = $mod_strings['LBL_TEST_EMAIL_BODY']; $return = array(); - + if(!$mail->Send()) { ob_clean(); $return['status'] = false; @@ -397,13 +397,13 @@ class Email extends SugarBean { $return['status'] = true; return $return; } // fn - + function decodeDuringSend($htmlData) { $htmlData = str_replace("sugarLessThan", "<", $htmlData); $htmlData = str_replace("sugarGreaterThan", ">", $htmlData); return $htmlData; } - + /** * Returns true or false if this email is a draft. * @@ -414,7 +414,7 @@ class Email extends SugarBean { { return ( isset($request['saveDraft']) || ($this->type == 'draft' && $this->status == 'draft') ); } - + /** * Sends Email for Email 2.0 */ @@ -453,18 +453,18 @@ class Email extends SugarBean { */ $mail = new SugarPHPMailer(); $mail = $this->setMailer($mail, '', $_REQUEST['fromAccount']); - if (empty($mail->Host) && !$this->isDraftEmail($request)) + if (empty($mail->Host) && !$this->isDraftEmail($request)) { $this->status = 'send_error'; - - if ($mail->oe->type == 'system') + + if ($mail->oe->type == 'system') echo($app_strings['LBL_EMAIL_ERROR_PREPEND']. $app_strings['LBL_EMAIL_INVALID_SYSTEM_OUTBOUND']); - else + else echo($app_strings['LBL_EMAIL_ERROR_PREPEND']. $app_strings['LBL_EMAIL_INVALID_PERSONAL_OUTBOUND']); - + return false; - } - + } + $subject = $this->name; $mail->Subject = from_html($this->name); @@ -478,7 +478,7 @@ class Email extends SugarBean { } // end work-around - if ( $this->isDraftEmail($request) ) + if ( $this->isDraftEmail($request) ) { if($this->type != 'draft' && $this->status != 'draft') { $this->id = create_guid(); @@ -518,7 +518,7 @@ class Email extends SugarBean { $object_arr[$bean->module_dir] = $bean->id; } // if } // if - } + } foreach($toAddresses as $addrMeta) { $addr = $addrMeta['email']; $beans = $sea->getBeansByEmailAddress($addr); @@ -590,13 +590,13 @@ class Email extends SugarBean { // After adding remove below code // code to remove - if ($ie->is_personal) + if ($ie->is_personal) { - if (empty($replyToAddress)) + if (empty($replyToAddress)) { $replyToAddress = $current_user->emailAddress->getReplyToAddress($current_user); } // if - if (empty($replyToName)) + if (empty($replyToName)) { $replyToName = $defaults['name']; } // if @@ -604,16 +604,16 @@ class Email extends SugarBean { //overwrite the users set default. if( !empty($storedOptions['reply_to_addr']) ) $replyToAddress = $storedOptions['reply_to_addr']; - + } // end of code to remove $mail->From = (!empty($fromAddress)) ? $fromAddress : $defaults['email']; $mail->FromName = (!empty($fromName)) ? $fromName : $defaults['name']; $replyToName = (!empty($replyToName)) ? $replyToName : $mail->FromName; } - + $mail->Sender = $mail->From; /* set Return-Path field in header to reduce spam score in emails sent via Sugar's Email module */ - + if (!empty($replyToAddress)) { $mail->AddReplyTo($replyToAddress,$locale->translateCharsetMIME(trim( $replyToName), 'UTF-8', $OBCharset)); } else { @@ -706,8 +706,8 @@ class Email extends SugarBean { if(!empty($request['documents'])) { $exDocs = explode("::", $request['documents']); - - + + foreach($exDocs as $docId) { $docId = trim($docId); @@ -746,7 +746,7 @@ class Email extends SugarBean { /* handle template attachments */ if(!empty($request['templateAttachments'])) { - + $exNotes = explode("::", $request['templateAttachments']); foreach($exNotes as $noteId) { $noteId = trim($noteId); @@ -762,8 +762,8 @@ class Email extends SugarBean { // only save attachments if we're archiving or drafting if((($this->type == 'draft') && !empty($this->id)) || (isset($request['saveToSugar']) && $request['saveToSugar'] == 1)) { - if ($note->parent_id != $this->id) - $this->saveTempNoteAttachments($filename,$fileLocation, $mime_type); + if ($note->parent_id != $this->id) + $this->saveTempNoteAttachments($filename,$fileLocation, $mime_type); } // if } // if @@ -775,13 +775,13 @@ class Email extends SugarBean { $filename = substr($noteId, 36, strlen($noteId)); // strip GUID for PHPMailer class to name outbound file $mail->AddAttachment($fileLocation,$locale->translateCharsetMIME(trim($filename), 'UTF-8', $OBCharset), 'base64', $this->email2GetMime($fileLocation)); - - //If we are saving an email we were going to forward we need to save the attachments as well. - if( (($this->type == 'draft') && !empty($this->id)) - || (isset($request['saveToSugar']) && $request['saveToSugar'] == 1)) + + //If we are saving an email we were going to forward we need to save the attachments as well. + if( (($this->type == 'draft') && !empty($this->id)) + || (isset($request['saveToSugar']) && $request['saveToSugar'] == 1)) { $mimeType = $this->email2GetMime($fileLocation); - $this->saveTempNoteAttachments($filename,$fileLocation, $mimeType); + $this->saveTempNoteAttachments($filename,$fileLocation, $mimeType); } // if } } @@ -816,7 +816,7 @@ class Email extends SugarBean { $mail->Body = $this->decodeDuringSend($mail->Body); $mail->AltBody = $this->decodeDuringSend($mail->AltBody); if (!$mail->Send()) { - $this->status = 'send_error'; + $this->status = 'send_error'; ob_clean(); echo($app_strings['LBL_EMAIL_ERROR_PREPEND']. $mail->ErrorInfo); return false; @@ -831,7 +831,7 @@ class Email extends SugarBean { $originalEmail->save(); $this->reply_to_status = 0; } // if - + if ($_REQUEST['composeType'] == 'reply' || $_REQUEST['composeType'] == 'replyCase') { if (isset($_REQUEST['ieId']) && isset($_REQUEST['mbox'])) { $emailFromIe = new InboundEmail(); @@ -899,7 +899,7 @@ class Email extends SugarBean { } else { if(!class_exists('aCase')) { - + } else{ $c = new aCase(); @@ -999,6 +999,13 @@ class Email extends SugarBean { $this->id = create_guid(); $this->new_with_id = true; } + $this->from_addr_name = $this->cleanEmails($this->from_addr_name); + $this->to_addrs_names = $this->cleanEmails($this->to_addrs_names); + $this->cc_addrs_names = $this->cleanEmails($this->cc_addrs_names); + $this->bcc_addrs_names = $this->cleanEmails($this->bcc_addrs_names); + $this->reply_to_addr = $this->cleanEmails($this->reply_to_addr); + $this->description = to_html($this->safeText(from_html($this->description))); + $this->description_html = $this->safeText($this->description_html); $this->saveEmailText(); $this->saveEmailAddresses(); @@ -1020,7 +1027,7 @@ class Email extends SugarBean { function saveTempNoteAttachments($filename,$fileLocation, $mimeType) { global $sugar_config; - + $tmpNote = new Note(); $tmpNote->id = create_guid(); $tmpNote->new_with_id = true; @@ -1028,7 +1035,7 @@ class Email extends SugarBean { $tmpNote->parent_type = $this->module_dir; $tmpNote->name = $filename; $tmpNote->filename = $filename; - $tmpNote->file_mime_type = $mimeType; + $tmpNote->file_mime_type = $mimeType; $noteFile = "{$sugar_config['upload_dir']}{$tmpNote->id}"; if(!copy($fileLocation, $noteFile)) $GLOBALS['log']->fatal("EMAIL 2.0: could not copy SugarDocument revision file to {$sugar_config['upload_dir']} [ {$fileLocation} ]"); @@ -1104,6 +1111,24 @@ class Email extends SugarBean { return $guid; } + function cleanEmails($emails) + { + $emails = str_replace(array(",",";"), "::", from_html($emails)); + $addrs = explode("::", $emails); + $res = array(); + foreach($addrs as $addr) { + $parts = $this->emailAddress->splitEmailAddress($addr); + if(empty($parts["email"])) { + continue; + } + if(!empty($parts["name"])) { + $res[] = "{$parts["name"]} <{$parts["email"]}>"; + } else { + $res[] .= $parts["email"]; + } + } + return join(", ", $res); + } function saveEmailText() { $isOracle = ($this->db->dbType == "oci8") ? true : false; @@ -1136,11 +1161,11 @@ class Email extends SugarBean { $ret = parent::retrieve($id, $encoded, $deleted); if($ret) { + $ret->retrieveEmailText(); + $ret->retrieveEmailAddresses(); $ret->raw_source = to_html($ret->safeText(from_html($ret->raw_source))); $ret->description = to_html($ret->safeText(from_html($ret->description))); $ret->description_html = $ret->safeText($ret->description_html); - $ret->retrieveEmailText(); - $ret->retrieveEmailAddresses(); $ret->date_start = ''; $ret->time_start = ''; @@ -1250,7 +1275,7 @@ class Email extends SugarBean { */ function getNotes($id, $duplicate=false) { if(!class_exists('Note')) { - + } $exRemoved = array(); @@ -1351,7 +1376,7 @@ class Email extends SugarBean { } $text = str_replace("\n", "\n
", $text); $out = "
{$text}
"; - + return $out; } @@ -1611,9 +1636,9 @@ class Email extends SugarBean { * handles attachments of various kinds when sending email */ function handleAttachments() { - - - + + + global $mod_strings; @@ -1887,7 +1912,7 @@ class Email extends SugarBean { // ssl or tcp - keeping outside isSMTP b/c a default may inadvertantly set ssl:// $mail->protocol = ($oe->mail_smtpssl) ? "ssl://" : "tcp://"; - if($oe->mail_sendtype == "SMTP") + if($oe->mail_sendtype == "SMTP") { //Set mail send type information $mail->Mailer = "smtp"; @@ -1899,16 +1924,16 @@ class Email extends SugarBean { if ($oe->mail_smtpssl == 2) { $mail->SMTPSecure = 'tls'; } // if - + if($oe->mail_smtpauth_req) { $mail->SMTPAuth = TRUE; $mail->Username = $oe->mail_smtpuser; $mail->Password = $oe->mail_smtppass; } } - else + else $mail->Mailer = "sendmail"; - + $mail->oe = $oe; return $mail; } @@ -1958,7 +1983,7 @@ class Email extends SugarBean { return $mail; } - + /** * Retrieve function from handlebody() to unit test easily * @param $mail @@ -1984,7 +2009,7 @@ class Email extends SugarBean { $filePatternSearch = "{$sugar_config['cache_dir']}"; $filePatternSearch = str_replace("/", "\/", $filePatternSearch); $filePatternSearch = $filePatternSearch . "images\/"; - if(strpos($mail->Body, "\"{$fileBasePath}") !== FALSE) + if(strpos($mail->Body, "\"{$fileBasePath}") !== FALSE) { //cache/images $matches = array(); preg_match_all("/{$filePatternSearch}.+?\"/i", $mail->Body, $matches); @@ -2010,7 +2035,7 @@ class Email extends SugarBean { $fileBasePath = "{$sugar_config['upload_dir']}"; $filePatternSearch = "{$sugar_config['upload_dir']}"; $filePatternSearch = str_replace("/", "\/", $filePatternSearch); - if(strpos($mail->Body, "\"{$fileBasePath}") !== FALSE) + if(strpos($mail->Body, "\"{$fileBasePath}") !== FALSE) { $matches = array(); preg_match_all("/{$filePatternSearch}.+?\"/i", $mail->Body, $matches); @@ -2034,19 +2059,19 @@ class Email extends SugarBean { $regex = '#]+src[^=]*=\"\/([^>]*?[^>]*)>#sim'; $mail->Body = preg_replace($regex, '', $mail->Body); } - + //Replace any embeded images using the secure entryPoint for src url. $noteImgRegex = "/]*[\s]+src[^=]*=\"index.php\?entryPoint=download\&id=([^\&]*)[^>]*>/im"; - $embededImageMatches = array(); + $embededImageMatches = array(); preg_match_all($noteImgRegex, $mail->Body, $embededImageMatches,PREG_SET_ORDER); - + foreach ($embededImageMatches as $singleMatch ) { $fullMatch = $singleMatch[0]; $noteId = $singleMatch[1]; $cid = $noteId; $filename = $noteId; - + //Retrieve note for mimetype $tmpNote = new Note(); $tmpNote->retrieve($noteId); @@ -2056,16 +2081,16 @@ class Email extends SugarBean { //Replace the body, old tag for new tag $mail->Body = str_replace($fullMatch, $replaceMatch, $mail->Body); - + //Attach the file $file_location = clean_path(getcwd()."/{$sugar_config['upload_dir']}{$noteId}"); - - if(file_exists($file_location)) + + if(file_exists($file_location)) $mail->AddEmbeddedImage($file_location, $cid, $filename, 'base64', $tmpNote->file_mime_type); } //End Replace - - + + $mail->Body = from_html($mail->Body); } @@ -2272,8 +2297,8 @@ class Email extends SugarBean { function create_new_list_query($order_by, $where,$filter=array(),$params=array(), $show_deleted = 0,$join_type='', $return_array = false,$parentbean=null, $singleSelect = false) { if ($return_array) { - return parent::create_new_list_query($order_by, $where,$filter,$params, $show_deleted,$join_type, $return_array,$parentbean, $singleSelect); - } + return parent::create_new_list_query($order_by, $where,$filter,$params, $show_deleted,$join_type, $return_array,$parentbean, $singleSelect); + } $custom_join = $this->custom_fields->getJOIN(); $query = "SELECT ".$this->table_name.".*, users.user_name as assigned_user_name\n"; @@ -2358,7 +2383,7 @@ class Email extends SugarBean { $row = $this->db->fetchByAssoc($result); if($row != null) { - + $contact = new Contact(); $contact->retrieve($row['id']); $this->contact_name = $contact->full_name; @@ -2491,7 +2516,7 @@ class Email extends SugarBean { case 'bug': $email_fields['CREATE_RELATED'] = ''.$mod_strings['LBL_CREATE_BUG'].''; break; - + case 'task': $email_fields['CREATE_RELATED'] = ''.$mod_strings['LBL_CREATE_TASK'].''; break; @@ -2548,18 +2573,18 @@ class Email extends SugarBean { $emailSettings = $current_user->getPreference('emailSettings', 'Emails'); // cn: default to a low number until user specifies otherwise - if(empty($emailSettings['showNumInList'])) + if(empty($emailSettings['showNumInList'])) $pageSize = 20; - else + else $pageSize = $emailSettings['showNumInList']; - - if( isset($_REQUEST['start']) && isset($_REQUEST['limit']) ) + + if( isset($_REQUEST['start']) && isset($_REQUEST['limit']) ) $page = ceil($_REQUEST['start'] / $_REQUEST['limit']) + 1; - else + else $page = 1; - - //Determine sort ordering - + + //Determine sort ordering + //Sort ordering parameters in the request do not coincide with actual column names //so we need to remap them. $hrSortLocal = array( @@ -2571,15 +2596,15 @@ class Email extends SugarBean { 'AssignedTo' => 'assigned_user_id', 'flagged' => 'flagged' ); - + $sort = !empty($_REQUEST['sort']) ? $_REQUEST['sort'] : ""; $direction = !empty($_REQUEST['dir']) ? $_REQUEST['dir'] : ""; - + $order = ( !empty($sort) && !empty($direction) ) ? " ORDER BY {$hrSortLocal[$sort]} {$direction}" : ""; - + //Get our main query. $fullQuery = $this->_genereateSearchImportedEmailsQuery(); - + //Perform a count query needed for pagination. $countQuery = $this->create_list_count_query($fullQuery); $count_rs = $this->db->query($countQuery, false, 'Error executing count query for imported emails search'); @@ -2587,7 +2612,7 @@ class Email extends SugarBean { $total_count = ($count_row != null) ? $count_row['c'] : 0; $start = ($page - 1) * $pageSize; - + //Execute the query $rs = $this->db->limitQuery($fullQuery . $order, $start, $pageSize); @@ -2606,7 +2631,7 @@ class Email extends SugarBean { $temp['type'] = $a['type']; $temp['mbox'] = 'sugar::Emails'; $temp['hasAttach'] = $this->doesImportedEmailHaveAttachment($a['id']); - //To and from addresses may be stored in emails_text, if nothing is found, revert to + //To and from addresses may be stored in emails_text, if nothing is found, revert to //regular email addresses. $temp['to_addrs'] = preg_replace('/[\x00-\x08\x0B-\x1F]/', '', $a['to_addrs']); $temp['from'] = preg_replace('/[\x00-\x08\x0B-\x1F]/', '', $a['from_addr']); @@ -2616,10 +2641,10 @@ class Email extends SugarBean { $tmpEmail = new Email(); $tmpEmail->id = $a['id']; $tmpEmail->retrieveEmailAddresses(); - $temp['from'] = $tmpEmail->from_addr; + $temp['from'] = $tmpEmail->from_addr; $temp['to_addrs'] = $tmpEmail->to_addrs; } - + $return[] = $temp; } @@ -2644,12 +2669,12 @@ class Email extends SugarBean { $row = $this->db->fetchByAssoc($rs); if( !empty($row['id']) ) $hasAttachment = TRUE; - + return (int) $hasAttachment; } - + /** - * Generate the query used for searching imported emails. + * Generate the query used for searching imported emails. * * @return String Query to be executed. */ @@ -2658,41 +2683,41 @@ class Email extends SugarBean { global $timedate; $additionalWhereClause = $this->_generateSearchImportWhereClause(); - + $query = array(); $fullQuery = ""; - $query['select'] = "emails.id , emails.mailbox_id, emails.name, emails.date_sent, emails.status, emails.type, emails.flagged, emails.reply_to_status, + $query['select'] = "emails.id , emails.mailbox_id, emails.name, emails.date_sent, emails.status, emails.type, emails.flagged, emails.reply_to_status, emails_text.from_addr, emails_text.to_addrs FROM emails "; - + $query['joins'] = " JOIN emails_text on emails.id = emails_text.email_id "; - + //Handle from and to addr joins if( !empty($_REQUEST['from_addr']) ) - { - $query['joins'] .= "INNER JOIN emails_email_addr_rel er_from ON er_from.email_id = emails.id AND er_from.deleted = 0 INNER JOIN email_addresses ea_from ON ea_from.id = er_from.email_address_id - AND er_from.address_type='from' AND ea_from.email_address='" . strtolower($_REQUEST['from_addr']) . "'"; + { + $query['joins'] .= "INNER JOIN emails_email_addr_rel er_from ON er_from.email_id = emails.id AND er_from.deleted = 0 INNER JOIN email_addresses ea_from ON ea_from.id = er_from.email_address_id + AND er_from.address_type='from' AND ea_from.email_address='" . strtolower($_REQUEST['from_addr']) . "'"; } - + if( !empty($_REQUEST['to_addrs']) ) { - $query['joins'] .= "INNER JOIN emails_email_addr_rel er_to ON er_to.email_id = emails.id AND er_to.deleted = 0 INNER JOIN email_addresses ea_to ON ea_to.id = er_to.email_address_id - AND er_to.address_type='to' AND ea_to.email_address='" . strtolower($_REQUEST['to_addrs']) . "'"; + $query['joins'] .= "INNER JOIN emails_email_addr_rel er_to ON er_to.email_id = emails.id AND er_to.deleted = 0 INNER JOIN email_addresses ea_to ON ea_to.id = er_to.email_address_id + AND er_to.address_type='to' AND ea_to.email_address='" . strtolower($_REQUEST['to_addrs']) . "'"; } - + $query['where'] = " WHERE (emails.type= 'inbound' OR emails.type='archived' OR emails.type='out') AND emails.deleted = 0 "; if( !empty($additionalWhereClause) ) $query['where'] .= "AND $additionalWhereClause"; - - //If we are explicitly looking for attachments. Do not use a distinct query as the to_addr is defined + + //If we are explicitly looking for attachments. Do not use a distinct query as the to_addr is defined //as a text which equals clob in oracle and the distinct query can not be executed correctly. $addDistinctKeyword = ""; if( !empty($_REQUEST['attachmentsSearch']) && $_REQUEST['attachmentsSearch'] == 1) //1 indicates yes $query['where'] .= " AND EXISTS ( SELECT id FROM notes n WHERE n.parent_id = emails.id AND n.deleted = 0 AND n.filename is not null )"; else if( !empty($_REQUEST['attachmentsSearch']) && $_REQUEST['attachmentsSearch'] == 2 ) - $query['where'] .= " AND NOT EXISTS ( SELECT id FROM notes n WHERE n.parent_id = emails.id AND n.deleted = 0 AND n.filename is not null )"; - - $fullQuery = "SELECT " . $query['select'] . " " . $query['joins'] . " " . $query['where']; - + $query['where'] .= " AND NOT EXISTS ( SELECT id FROM notes n WHERE n.parent_id = emails.id AND n.deleted = 0 AND n.filename is not null )"; + + $fullQuery = "SELECT " . $query['select'] . " " . $query['joins'] . " " . $query['where']; + return $fullQuery; } /** @@ -2702,50 +2727,50 @@ class Email extends SugarBean { function _generateSearchImportWhereClause() { global $timedate; - + //The clear button was removed so if a user removes the asisgned user name, do not process the id. if( empty($_REQUEST['assigned_user_name']) && !empty($_REQUEST['assigned_user_id']) ) unset($_REQUEST['assigned_user_id']); - + $availableSearchParam = array('name' => array('table_name' =>'emails'), 'data_parent_id_search' => array('table_name' =>'emails','db_key' => 'parent_id','opp' => '='), 'assigned_user_id' => array('table_name' => 'emails', 'opp' => '=') ); - + $additionalWhereClause = array(); foreach ($availableSearchParam as $key => $properties) { - if( !empty($_REQUEST[$key]) ) + if( !empty($_REQUEST[$key]) ) { $db_key = isset($properties['db_key']) ? $properties['db_key'] : $key; $searchValue = $_REQUEST[$key]; - + $opp = isset($properties['opp']) ? $properties['opp'] : 'like'; if($opp == 'like') $searchValue = $searchValue . "%"; - + $additionalWhereClause[] = "{$properties['table_name']}.$db_key $opp '$searchValue' "; } } - + $isDateFromSearchSet = !empty($_REQUEST['dateFrom']); $isdateToSearchSet = !empty($_REQUEST['dateTo']); $bothDateRangesSet = $isDateFromSearchSet & $isdateToSearchSet; - + //Hanlde date from and to seperately if($bothDateRangesSet) { $dbFormatDateFrom = $timedate->to_db_date($_REQUEST['dateFrom'], false); $dbFormatDateFrom = db_convert("'" . $dbFormatDateFrom . "'",'datetime'); - - $dbFormatDateTo = $timedate->to_db_date($_REQUEST['dateTo'], false); + + $dbFormatDateTo = $timedate->to_db_date($_REQUEST['dateTo'], false); $dbFormatDateTo = db_convert("'" . $dbFormatDateTo . "'",'datetime'); - + $additionalWhereClause[] = "( emails.date_sent >= $dbFormatDateFrom AND emails.date_sent <= $dbFormatDateTo )"; } elseif ($isdateToSearchSet) { - $dbFormatDateTo = $timedate->to_db_date($_REQUEST['dateTo'], false); + $dbFormatDateTo = $timedate->to_db_date($_REQUEST['dateTo'], false); $dbFormatDateTo = db_convert("'" . $dbFormatDateTo . "'",'datetime'); $additionalWhereClause[] = "emails.date_sent <= $dbFormatDateTo "; } @@ -2755,14 +2780,14 @@ class Email extends SugarBean { $dbFormatDateFrom = db_convert("'" . $dbFormatDateFrom . "'",'datetime'); $additionalWhereClause[] = "emails.date_sent >= $dbFormatDateFrom "; } - + $additionalWhereClause = implode(" AND ", $additionalWhereClause); - + return $additionalWhereClause; } - - - + + + /** * takes a long TO: string of emails and returns the first appended by an * elipse @@ -2795,7 +2820,7 @@ class Email extends SugarBean { $distribution = get_select_options_with_id($app_list_strings['dom_email_distribution'], ''); $_SESSION['distribute_where'] = $where; - + $out = '
'; $out .= get_form_header($mod_strings['LBL_DIST_TITLE'], '', false); $out .=<<'.$distribution.'
_generateComposeConfigData('email_compose'); - - + + //Check quick create module access $QCAvailibleModules = array(); $QCModules = array( - 'Bugs', - 'Cases', - 'Contacts', - 'Leads', + 'Bugs', + 'Cases', + 'Contacts', + 'Leads', 'Tasks' ); foreach($QCModules as $module) { $class = substr($module, 0, strlen($module) - 1); require_once("modules/{$module}/{$class}.php"); - + if($class=="Case") { $class = "aCase"; } - + $seed = new $class(); if ($seed->ACLAccess('edit')) { $QCAvailibleModules[] = $module; @@ -147,15 +147,15 @@ class EmailUI { //Get the quickSearch js needed for assigned user id on Search Tab require_once('include/QuickSearchDefaults.php'); - $qsd = new QuickSearchDefaults(); - $qsd->setFormName('advancedSearchForm'); + $qsd = new QuickSearchDefaults(); + $qsd->setFormName('advancedSearchForm'); $quicksearchAssignedUser = "if(typeof sqs_objects == 'undefined'){var sqs_objects = new Array;}"; $quicksearchAssignedUser .= "sqs_objects['advancedSearchForm_assigned_user_name']=" . json_encode($qsd->getQSUser()) . ";"; - $qsd->setFormName('Distribute'); + $qsd->setFormName('Distribute'); $quicksearchAssignedUser .= "sqs_objects['Distribute_assigned_user_name']=" . json_encode($qsd->getQSUser()) . ";"; $this->smarty->assign('quickSearchForAssignedUser', $quicksearchAssignedUser); - - + + /////////////////////////////////////////////////////////////////////// //// BASIC ASSIGNS $this->smarty->assign("currentUserId",$current_user->id); @@ -182,7 +182,7 @@ class EmailUI { /////////////////////////////////////////////////////////////////////// //// USER SETTINGS // settings: accounts - + $cuDatePref = $current_user->getUserDateTimePreferences(); $this->smarty->assign('dateFormat', $cuDatePref['date']); $this->smarty->assign('dateFormatExample', str_replace(array("Y", "m", "d"), array("yyyy", "mm", "dd"), $cuDatePref['date'])); @@ -196,11 +196,11 @@ class EmailUI { $group = (!$v->is_personal) ? $app_strings['LBL_EMAIL_GROUP']."." : ""; $ieAccountsOptions .= "\n"; } - + $this->smarty->assign('ieAccounts', $ieAccountsOptions); $this->smarty->assign('rollover', $this->rolloverStyle); - $protocol = filterInboundEmailPopSelection($app_list_strings['dom_email_server_type']); + $protocol = filterInboundEmailPopSelection($app_list_strings['dom_email_server_type']); $this->smarty->assign('PROTOCOL', get_select_options_with_id($protocol, '')); $this->smarty->assign('MAIL_SSL_OPTIONS', get_select_options_with_id($app_list_strings['email_settings_for_ssl'], '')); $this->smarty->assign('ie_mod_strings', return_module_language($current_language, 'InboundEmail')); @@ -217,11 +217,11 @@ class EmailUI { 'selected' => $charsetSelectedValue, ); $this->smarty->assign('charset', $charset); - + $emailCheckInterval = array('options' => $app_strings['LBL_EMAIL_CHECK_INTERVAL_DOM'], 'selected' => $emailSettings['emailCheckInterval']); $this->smarty->assign('emailCheckInterval', $emailCheckInterval); $this->smarty->assign('attachmentsSearchOptions', $app_list_strings['checkbox_dom']); - $this->smarty->assign('sendPlainTextChecked', ($emailSettings['sendPlainText'] == 1) ? 'CHECKED' : ''); + $this->smarty->assign('sendPlainTextChecked', ($emailSettings['sendPlainText'] == 1) ? 'CHECKED' : ''); $this->smarty->assign('showNumInList', get_select_options_with_id($app_list_strings['email_settings_num_dom'], $emailSettings['showNumInList'])); //// END USER SETTINGS @@ -282,8 +282,8 @@ class EmailUI { var loader = new YAHOO.util.YUILoader({ require : [ - "layout", "element", "tabview", "menu", - "cookie", "sugarwidgets" + "layout", "element", "tabview", "menu", + "cookie", "sugarwidgets" ], loadOptional: true, skin: { base: 'blank', defaultSkin: '' }, @@ -307,33 +307,33 @@ eoq; return $out; } - + /** * Generate the frame needed for the quick compose email UI. This frame is loaded dynamically * by an ajax call. * * @return JSON An object containing html markup and js script variables. */ - function displayQuickComposeEmailFrame() + function displayQuickComposeEmailFrame() { $this->preflightUserCache(); - + $this->_generateComposeConfigData('email_compose_light'); $javascriptOut = $this->smarty->fetch("modules/Emails/templates/_baseConfigData.tpl"); $divOut = $this->smarty->fetch("modules/Emails/templates/overlay.tpl"); $divOut .= $this->smarty->fetch("modules/Emails/templates/addressSearchContent.tpl"); - + $outData = array('jsData' => $javascriptOut,'divData'=> $divOut); $out = json_encode($outData); return $out; } - + /** * Given an email link url (eg. index.php?action=Compose&parent_type=Contacts...) break up the - * request components and create a compose package that can be used by the quick compose UI. The + * request components and create a compose package that can be used by the quick compose UI. The * result is typically passed into the js call SUGAR.quickCompose.init which initalizes the quick compose - * UI. + * UI. * * @param String $emailLinkUrl * @return JSON Object containing the composePackage and full link url @@ -342,12 +342,12 @@ eoq; { $composeData = explode("&",$emailLinkUrl); $a_composeData = array(); - foreach ($composeData as $singleRequest) + foreach ($composeData as $singleRequest) { - $tmp = explode("=",$singleRequest); + $tmp = explode("=",$singleRequest); $a_composeData[$tmp[0]] = urldecode($tmp[1]); } - + return $this->generateComposePackageForQuickCreate($a_composeData,$emailLinkUrl); } /** @@ -356,7 +356,7 @@ eoq; * quick compose email UI (eg. to addr, parent id, parent type, etc) * * @param Array $composeData Associative array read and processed by generateComposeDataPackage. - * @param String $fullLinkUrl A link that contains all pertinant information so the user can be + * @param String $fullLinkUrl A link that contains all pertinant information so the user can be * directed to the full compose screen if needed * @return JSON Object containg composePackage and fullLinkUrl */ @@ -365,31 +365,32 @@ eoq; $_REQUEST['forQuickCreate'] = true; require_once('modules/Emails/Compose.php'); $composePackage = generateComposeDataPackage($composeData,FALSE); - - //JSON object is passed into the function defined within the a href onclick event - //which is delimeted by '. Need to escape all single quotes, every other char is valid. + + // JSON object is passed into the function defined within the a href onclick event + // which is delimeted by '. Need to escape all single quotes and &, <, > + // but not double quotes since json would escape them foreach ($composePackage as $key => $singleCompose) { - if (is_string($singleCompose)) - $composePackage[$key] = str_replace("'","'",$singleCompose); + if (is_string($singleCompose)) + $composePackage[$key] = str_replace("'", "'", htmlspecialchars($singleCompose, ENT_NOQUOTES, 'UTF-8')); } - + $quickComposeOptions = array('fullComposeUrl' => $fullLinkUrl,'composePackage' => $composePackage); $j_quickComposeOptions = json_encode($quickComposeOptions); - + return $j_quickComposeOptions; } - + /** * Generate the config data needed for the Full Compose UI and the Quick Compose UI. The set of config data - * returned is the minimum set needed by the quick compose UI. + * returned is the minimum set needed by the quick compose UI. * * @param String $type Drives which tinyMCE options will be included. */ function _generateComposeConfigData($type = "email_compose_light" ) { global $app_list_strings,$current_user, $app_strings, $mod_strings,$current_language,$locale; - + //Link drop-downs $parent_types = $app_list_strings['record_type_display']; $disabled_parent_types = ACLController::disabledModuleList($parent_types, false, 'list'); @@ -404,7 +405,7 @@ eoq; require_once("include/SugarTinyMCE.php"); $tiny = new SugarTinyMCE(); $tinyConf = $tiny->getConfig($type); - + //Generate Language Packs $lang = "var app_strings = new Object();\n"; foreach($app_strings as $k => $v) { @@ -412,7 +413,7 @@ eoq; $lang .= "app_strings.{$k} = '{$v}';\n"; } } - //Get the email mod strings but don't use the global variable as this may be overridden by + //Get the email mod strings but don't use the global variable as this may be overridden by //other modules when the quick create is rendered. $email_mod_strings = return_module_language($current_language,'Emails'); $modStrings = "var mod_strings = new Object();\n"; @@ -430,7 +431,7 @@ eoq; $ieModStrings .= "ie_mod_strings.{$k} = '{$v}';\n"; } $lang .= "\n\n{$ieModStrings}\n"; - + $this->smarty->assign('linkBeans', $linkBeans); $this->smarty->assign('linkBeansOptions', $parent_types); $this->smarty->assign('tinyMCE', $tinyConf); @@ -438,7 +439,7 @@ eoq; $this->smarty->assign('app_strings', $app_strings); $this->smarty->assign('mod_strings', $email_mod_strings); $ie1 = new InboundEmail(); - + //Signatures $defsigID = $current_user->getPreference('signature_default'); $defaultSignature = $current_user->getDefaultSignature(); @@ -447,21 +448,21 @@ eoq; $this->smarty->assign('signatureDefaultId', (isset($defaultSignature['id'])) ? $defaultSignature['id'] : ""); //User Preferences $this->smarty->assign('userPrefs', json_encode($this->getUserPrefsJS())); - + //Get the users default outbound id $defaultOutID = $ie1->getUsersDefaultOutboundServerId($current_user); $this->smarty->assign('defaultOutID', $defaultOutID); - + //Character Set $charsets = json_encode($locale->getCharsetSelect()); $this->smarty->assign('emailCharsets', $charsets); - + //Relateable List of People for address book search //#20776 jchi - $peopleTables = array("users", - "contacts", - "leads", - "prospects", + $peopleTables = array("users", + "contacts", + "leads", + "prospects", "accounts"); $filterPeopleTables = array(); global $app_list_strings, $app_strings; @@ -476,11 +477,11 @@ eoq; $filterPeopleTables[$person->table_name] = $app_list_strings['moduleList'][$person->module_dir]; } $this->smarty->assign('listOfPersons' , get_select_options_with_id($filterPeopleTables,'')); - + } - - - + + + //// END CORE /////////////////////////////////////////////////////////////////////////// @@ -550,7 +551,7 @@ eoq; * @param string $str JSON serialized object */ function saveContactEdit($str) { - + $json = getJSONobj(); $str = from_html($str); @@ -585,10 +586,10 @@ eoq; */ function getEditContact($id, $module) { global $app_strings; - + if(!class_exists("Contact")) { - + } $contact = new Contact(); @@ -633,7 +634,7 @@ eoq; * @return array */ function getUserContacts($contacts, $user=null) { - + global $current_user; global $locale; @@ -775,7 +776,7 @@ eoq; /////////////////////////////////////////////////////////////////////////// //// FOLDER FUNCTIONS - + /** * Creates a new Sugar folder * @param string $nodeLabel New sugar folder name @@ -1224,9 +1225,9 @@ eoq; $focus->lead_source_description = trim($email->name); $from = (isset($email->from_name) && !empty($email->from_name)) ? $email->from_name : $email->from_addr; - + if(isset($_REQUEST['sugarEmail']) && !empty($_REQUEST['sugarEmail'])) - $from = (isset($email->from_name) && !empty($email->from_name)) ? $email->from_name : $email->from_addr_name; + $from = (isset($email->from_name) && !empty($email->from_name)) ? $email->from_name : $email->from_addr_name; $name = explode(" ", trim($from)); @@ -1241,7 +1242,7 @@ eoq; 'opt_out' => 0, 'reply_to_address' => 1 ); - + $focus->email1 = $address; if(!empty($name)) { @@ -1268,7 +1269,7 @@ eoq; //MFH BUG#20283 - checks for custom quickcreate fields $EditView->setup($_REQUEST['qc_module'], $focus, 'custom/modules/'.$focus->module_dir.'/metadata/editviewdefs.php', 'include/EditView/EditView.tpl'); $EditView->process(); - $EditView->render(); + $EditView->render(); $EditView->defs['templateMeta']['form']['buttons'] = array( 'email2save' => array( @@ -1305,9 +1306,9 @@ eoq; $jsLanguage = ''; - - - + + + $EditView->view = 'EmailQCView'; $EditView->defs['templateMeta']['form']['headerTpl'] = 'include/EditView/header.tpl'; $EditView->defs['templateMeta']['form']['footerTpl'] = 'include/EditView/footer.tpl'; @@ -1334,7 +1335,7 @@ eoq; require_once('include/QuickSearchDefaults.php'); $qsd = new QuickSearchDefaults(); $qsd->setFormName($formName); - + global $app_strings; global $current_user; global $app_list_strings; @@ -1368,7 +1369,7 @@ eoq; $parent_types = $app_list_strings['record_type_display']; $smarty->assign('parentOptions', get_select_options_with_id($parent_types, $email->parent_type)); - $quicksearch_js = ''; + $quicksearch_js = ''; $smarty->assign('SQS', $quicksearch_js); $meta = array(); @@ -1381,7 +1382,7 @@ eoq; * */ function getDetailViewForEmail2($emailId) { - + require_once('include/DetailView/DetailView.php'); global $app_strings, $app_list_strings; global $mod_strings; @@ -1558,7 +1559,7 @@ eoq; /* dealing with IMAP email, uids are IMAP uids */ global $ie; // provided by EmailUIAjax.php if(empty($ie)) { - + $ie = new InboundEmail(); } $ie->retrieve($ieId); @@ -1778,7 +1779,7 @@ function setLastRobin($ie, $lastRobin) { * @return array */ function getSingleMessage($ie) { - + global $timedate; global $app_strings,$mod_strings; $ie->retrieve($_REQUEST['ieId']); @@ -1846,8 +1847,8 @@ eoq; } if(empty($out['meta']['email']['description'])) - $out['meta']['email']['description'] = $mod_strings['LBL_EMPTY_EMAIL_BODY']; - + $out['meta']['email']['description'] = $mod_strings['LBL_EMPTY_EMAIL_BODY']; + if($noCache) { $GLOBALS['log']->debug("EMAILUI: getSingleMessage() NOT using cache file"); } else { @@ -1868,7 +1869,7 @@ eoq; */ function getListEmails($ieId, $mbox, $folderListCacheOffset, $forceRefresh='false') { global $sugar_config; - + $ie = new InboundEmail(); $ie->retrieve($ieId); @@ -1885,13 +1886,13 @@ eoq; global $locale; global $current_user; - + $ea = new SugarEmailAddress(); if(!empty($email)) { - $description = (empty($email->description_html)) ? $email->description : from_html($email->description_html); + $description = (empty($email->description_html)) ? $email->description : $email->description_html; } - + //Get the most complete address list availible for this email $addresses = array('toAddresses' => 'to', 'ccAddresses' => 'cc', 'bccAddresses' => 'bcc'); foreach($addresses as $var => $type) @@ -1912,8 +1913,6 @@ eoq; $ret['description'] = $description; $ret['from'] = (isset($_REQUEST['composeType']) && $_REQUEST['composeType'] == 'forward') ? "" : $email->from_addr; $ret['to'] = from_html($toAddresses); - $ret['cc'] = from_html($ccAddresses); - $ret['bcc'] = $bccAddresses; $ret['uid'] = $email->id; $ret['parent_name'] = $email->parent_name; $ret['parent_type'] = $email->parent_type; @@ -1921,6 +1920,9 @@ eoq; // reply all if(isset($_REQUEST['composeType']) && $_REQUEST['composeType'] == 'replyAll') { + $ret['cc'] = from_html($ccAddresses); + $ret['bcc'] = $bccAddresses; + $userEmails = array(); $userEmailsMeta = $ea->getAddressesByGUID($current_user->id, 'Users'); foreach($userEmailsMeta as $emailMeta) { @@ -1991,7 +1993,7 @@ eoq; case "replyCase": $GLOBALS['log']->debug("EMAILUI: At reply case"); $header = $email->getReplyHeader(); - + $myCase = new aCase(); $myCase->retrieve($email->parent_id); $myCaseMacro = $myCase->getEmailSubjectMacro(); @@ -2025,9 +2027,9 @@ eoq; global $current_user , $app_strings; global $db; if(!isset($person) || $person === 'LBL_DROPDOWN_LIST_ALL'){ - $peopleTables = array("users", + $peopleTables = array("users", "contacts", - "leads", + "leads", "prospects", "accounts" ); @@ -2082,10 +2084,10 @@ eoq; } $countq = "SELECT count(people.id) c from ($q) people"; $q .= "ORDER BY last_name"; - + return array('query' => $q, 'countQuery' => $countq); } - + /** * get emails of related bean for a given bean id * @param $beanType @@ -2097,29 +2099,29 @@ eoq; $finalQuery = ''; $searchBeans = null; if($beanType === 'LBL_DROPDOWN_LIST_ALL') - $searchBeans = array("users", + $searchBeans = array("users", "contacts", - "leads", + "leads", "prospects", "accounts" ); - + if ($relatedBeanInfoArr == '' || empty($relatedBeanInfoArr['related_bean_type']) ) { - if ($searchBeans != null) + if ($searchBeans != null) { $q = array(); - foreach ($searchBeans as $searchBean) + foreach ($searchBeans as $searchBean) { - $q[] = '('.$this->findEmailFromBeanIds('', $searchBean, $whereArr).')'; + $q[] = '('.$this->findEmailFromBeanIds('', $searchBean, $whereArr).')'; } if (!empty($q)) $finalQuery .= implode("\n UNION ALL \n", $q); - } - else + } + else $finalQuery = $this->findEmailFromBeanIds('', $beanType, $whereArr); - } - else + } + else { $class = $beanList[$relatedBeanInfoArr['related_bean_type']]; $focus = new $class(); @@ -2150,9 +2152,9 @@ eoq; } } $countq = "SELECT count(people.id) c from ($finalQuery) people"; - return array('query' => $finalQuery, 'countQuery' => $countq); + return array('query' => $finalQuery, 'countQuery' => $countq); } - + function findEmailFromBeanIds($beanIds, $beanType, $whereArr) { global $current_user; $q = ''; @@ -2180,7 +2182,7 @@ eoq; $clause = $current_user->db->helper->escape_quote($clause); $whereAdd .= "{$column} LIKE '{$clause}%'"; } - $table = $beanType; + $table = $beanType; $module = ucfirst($table); $class = substr($module, 0, strlen($module) - 1); require_once("modules/{$module}/{$class}.php"); @@ -2198,7 +2200,7 @@ eoq; if(!empty($whereAdd)) { $where .= " AND ({$whereAdd})"; } - + if ($beanType === 'accounts') { $t = "SELECT {$table}.id, '' first_name, {$table}.name last_name, eabr.primary_address, ea.email_address, '{$module}' module "; } else { @@ -2365,7 +2367,7 @@ eoq; * @return array */ function getEmailTemplatesArray() { - + global $app_strings; if(ACLController::checkAccess('EmailTemplates', 'list', true) && ACLController::checkAccess('EmailTemplates', 'view', true)) { @@ -2388,13 +2390,13 @@ eoq; $ieAccountsFull = $ie->retrieveAllByGroupIdWithGroupAccounts($current_user->id); $ieAccountsFrom= array(); - + $oe = new OutboundEmail(); $system = $oe->getSystemMailerSettings(); $ret = $current_user->getUsersNameAndEmail(); $ret['name'] = from_html($ret['name']); $useMyAccountString = true; - + if(empty($ret['email'])) { $systemReturn = $current_user->getSystemDefaultNameAndEmail(); $ret['email'] = $systemReturn['email']; @@ -2406,26 +2408,26 @@ eoq; if ($useMyAccountString) { $myAccountString = " - {$app_strings['LBL_MY_ACCOUNT']}"; } // if - + //Check to make sure that the user has set the associated inbound email acount -> outbound acount is active. $showFolders = unserialize(base64_decode($current_user->getPreference('showFolders', 'Emails'))); $sf = new SugarFolder(); $groupSubs = $sf->getSubscriptions($current_user); - - foreach($ieAccountsFull as $k => $v) + + foreach($ieAccountsFull as $k => $v) { $personalSelected = (!empty($showFolders) && in_array($v->id, $showFolders)); - + $allowOutboundGroupUsage = $v->get_stored_options('allow_outbound_group_usage',FALSE); - $groupSelected = ( in_array($v->groupfolder_id, $groupSubs) && $allowOutboundGroupUsage); + $groupSelected = ( in_array($v->groupfolder_id, $groupSubs) && $allowOutboundGroupUsage); $selected = ( $personalSelected || $groupSelected ); - + if(!$selected) { $GLOBALS['log']->debug("Inbound Email {$v->name}, not selected and will not be available for selection within compose UI."); continue; } - + $name = $v->get_stored_options('from_name'); $addr = $v->get_stored_options('from_addr'); if ($name != null && $addr != null) { @@ -2437,15 +2439,15 @@ eoq; } // else } // if } // foreach - - + + $userSystemOverride = $oe->getUsersMailerForSystemOverride($current_user->id); //Substitute in the users system override if its available. if($userSystemOverride != null) $system = $userSystemOverride; - - if( !empty($system->mail_smtpserver) ) - { + + if( !empty($system->mail_smtpserver) ) + { $admin = new Administration(); $admin->retrieveSettings(); //retrieve all admin settings. $ieAccountsFrom[] = array("value" => $system->id, "text" => @@ -2514,7 +2516,7 @@ eoq; } // if if(!empty($system->id)) { - + $admin = new Administration(); $admin->retrieveSettings(); //retrieve all admin settings. if (in_array(trim($return['email']), $toArray)) { @@ -2602,46 +2604,46 @@ eoq; $showFolders = unserialize(base64_decode($current_user->getPreference('showFolders', 'Emails'))); $defaultIEAccount = $ie->getUsersDefaultOutboundServerId($current_user); - + foreach($ieAccountsFull as $k => $v) { $selected = (!empty($showFolders) && in_array($v->id, $showFolders)) ? true : false; $default = ($defaultIEAccount == $v->id) ? TRUE : FALSE; $has_groupfolder = !empty($v->groupfolder_id) ? TRUE : FALSE; - $type = ($v->is_personal) ? $mod_strings['LBL_MAILBOX_TYPE_PERSONAL'] : $mod_strings['LBL_MAILBOX_TYPE_GROUP']; - - $ieAccountsShowOptionsMeta[] = array("id" => $v->id, "name" => $v->name, 'is_active' => $selected, + $type = ($v->is_personal) ? $mod_strings['LBL_MAILBOX_TYPE_PERSONAL'] : $mod_strings['LBL_MAILBOX_TYPE_GROUP']; + + $ieAccountsShowOptionsMeta[] = array("id" => $v->id, "name" => $v->name, 'is_active' => $selected, 'server_url' => $v->server_url, 'is_group' => !$v->is_personal,'group_id' => $v->group_id, 'is_default' => $default, 'has_groupfolder' => $has_groupfolder,'type' => $type ); } - + //Retrieve the grou folders $f = new SugarFolder(); $groupFolders = $f->getGroupFoldersForSettings($current_user); - + foreach ($groupFolders as $singleGroup) { //Retrieve the related IE accounts. $relatedIEAccounts = $ie->retrieveByGroupFolderId($singleGroup['id']); - + if(count($relatedIEAccounts) == 0) $server_url = $app_strings['LBL_EMAIL_MULT_GROUP_FOLDER_ACCOUNTS_EMPTY']; else if(count($relatedIEAccounts) == 1) { if($relatedIEAccounts[0]->status != 'Active' || $relatedIEAccounts[0]->mailbox_type == 'bounce') continue; - + $server_url = $relatedIEAccounts[0]->server_url; } - else + else $server_url = $app_strings['LBL_EMAIL_MULT_GROUP_FOLDER_ACCOUNTS']; - - $type = $mod_strings['LBL_MAILBOX_TYPE_GROUP_FOLDER']; - $ieAccountsShowOptionsMeta[] = array("id" => $singleGroup['id'], "name" => $singleGroup['origName'], 'is_active' => $singleGroup['selected'], + + $type = $mod_strings['LBL_MAILBOX_TYPE_GROUP_FOLDER']; + $ieAccountsShowOptionsMeta[] = array("id" => $singleGroup['id'], "name" => $singleGroup['origName'], 'is_active' => $singleGroup['selected'], 'server_url' => $server_url, 'is_group' => true,'group_id' => $singleGroup['id'], 'is_default' => FALSE, 'has_groupfolder' => true,'type' => $type); } - - + + return $ieAccountsShowOptionsMeta; } @@ -2846,19 +2848,19 @@ eoq; */ function jsonOuput($data, $resultsParam, $count=0, $fromCache=true, $unread=-1) { global $app_strings; - + $count = ($count > 0) ? $count : 0; - if(isset($a['fromCache'])) + if(isset($a['fromCache'])) $cached = ($a['fromCache'] == 1) ? 1 : 0; - else + else $cached = ($fromCache) ? 1 : 0; - if($data['mbox'] == 'undefined' || empty($data['mbox'])) + if($data['mbox'] == 'undefined' || empty($data['mbox'])) $data['mbox'] = $app_strings['LBL_NONE']; $jsonOut = array('TotalCount' => $count, 'FromCache' => $cached, 'UnreadCount' => $unread, $resultsParam => $data['out']); - + return json_encode($jsonOut); } /** @@ -2896,7 +2898,7 @@ eoq; eoq; return $ret; } - + /** * Generate to/cc addresses string in email detailview. * @@ -2914,7 +2916,7 @@ eoq; $pattern = '/@.*,/U'; preg_match_all($pattern, $tempStr, $matchs); $totalCount = count($matchs[0]); - + if(!empty($matchs[0]) && $totalCount > $defaultNum) { $position = strpos($tempStr, $matchs[0][$defaultNum]); $hiddenCount = $totalCount - $defaultNum; @@ -2925,7 +2927,7 @@ eoq; return $str; } - + /** * Unify the seperator as , * diff --git a/modules/Emails/EmailUIAjax.php b/modules/Emails/EmailUIAjax.php index c634d678..70c87d04 100644 --- a/modules/Emails/EmailUIAjax.php +++ b/modules/Emails/EmailUIAjax.php @@ -44,8 +44,8 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); //increate timeout for phpo script execution ini_set('max_execution_time',300); //ajaxInit(); - - + + require_once("include/OutboundEmail/OutboundEmail.php"); require_once("include/ytree/Tree.php"); require_once("include/ytree/ExtNode.php"); @@ -80,7 +80,7 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); //get the forward header and add to description $forward_header = $email->getForwardHeader(); - $ret['description'] = $forward_header . $ret['description']; + $ret['description'] = $forward_header . $ret['description']; if ($_REQUEST['composeType'] == 'forward') { $ret = $ie->email->et->getDraftAttachments($ret); } @@ -117,7 +117,7 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); */ case "sendEmail": $GLOBALS['log']->debug("********** EMAIL 2.0 - Asynchronous - at: sendEmail"); - + $sea = new SugarEmailAddress(); @@ -130,7 +130,7 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); if (isset($_REQUEST['uid']) && !empty($_REQUEST['uid'])) { $email->uid = $_REQUEST['uid']; } - + if ($email->email2Send($_REQUEST)) { $ret = array( 'composeLayoutId' => $_REQUEST['composeLayoutId'], @@ -179,18 +179,18 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); $out['signatures'] = $sigs; $out['fromAccounts'] = $email->et->getFromAccountsArray($ie); $out['errorArray'] = array(); - + $oe = new OutboundEmail(); if( $oe->doesUserOverrideAccountRequireCredentials($current_user->id) ) { - $overideAccount = $oe->getUsersMailerForSystemOverride($current_user->id); + $overideAccount = $oe->getUsersMailerForSystemOverride($current_user->id); //If the user override account has not been created yet, create it for the user. if($overideAccount == null) $overideAccount = $oe->createUserSystemOverrideAccount($current_user->id); - + $out['errorArray'] = array($overideAccount->id => $app_strings['LBL_EMAIL_WARNING_MISSING_USER_CREDS']); - } - + } + $ret = $json->encode($out); echo $ret; break; @@ -234,7 +234,7 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); case "getTemplateAttachments": $GLOBALS['log']->debug("********** EMAIL 2.0 - Asynchronous - at: getTemplateAttachments"); if(isset($_REQUEST['parent_id']) && !empty($_REQUEST['parent_id'])) { - + $where = "parent_id='{$_REQUEST['parent_id']}'"; $order = ""; @@ -385,7 +385,7 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); if (!empty($ie->email->reply_to_addr)) { $emailAddressWithName = $ie->email->reply_to_addr; } // if - + $emailAddress = SugarEmailAddress::_cleanAddress($emailAddressWithName); $contactIds = $ie->email->emailAddress->getRelatedId($emailAddress, 'contacts'); if (!empty($contactIds)) { @@ -425,11 +425,11 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); echo $out; } else - echo $ret['html']; - + echo $ret['html']; + } break; - + case "relateEmails": if (isset($_REQUEST['uid']) && !empty($_REQUEST['uid']) && isset($_REQUEST['parent_id']) && !empty($_REQUEST['parent_id']) && @@ -708,7 +708,7 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); $ret = $ie->email->et->getDraftAttachments($ret, $ie); $ret = $ie->email->et->getFromAllAccountsArray($ie, $ret); - + $out = $json->encode($ret, true); echo $out; } else { @@ -732,7 +732,7 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
- + - + - + - + - + - + - + - + - + - + - + + + + + '; - + if($popupBoolean) { /* echo ' diff --git a/modules/InboundEmail/Save.php b/modules/InboundEmail/Save.php index 33e7bcfa..0b2498fd 100644 --- a/modules/InboundEmail/Save.php +++ b/modules/InboundEmail/Save.php @@ -37,16 +37,15 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); require_once('include/SugarFolders/SugarFolders.php'); - - - - global $current_user; $focus = new InboundEmail(); $focus->retrieve($_REQUEST['record']); foreach($focus->column_fields as $field) { + if($field == 'email_password' && empty($_REQUEST['email_password']) && !empty($_REQUEST['email_user'])) { + continue; + } if(isset($_REQUEST[$field])) { if ($field != "group_id") { $focus->$field = trim($_REQUEST[$field]); @@ -65,12 +64,11 @@ foreach($focus->required_fields as $field) { $focus->$field = $value; } } -$focus->email_password = $_REQUEST['email_password']; $focus->protocol = $_REQUEST['protocol']; if( isset($_REQUEST['is_create_case']) && $_REQUEST['is_create_case'] == 'on' ) $focus->mailbox_type = 'createcase'; -else +else { if( empty($focus->mailbox_type) || $focus->mailbox_type == 'createcase' ) $focus->mailbox_type = 'pick'; @@ -117,13 +115,13 @@ $stored_options['reply_to_addr'] = trim($_REQUEST['reply_to_addr']); $stored_options['only_since'] = $onlySince; $stored_options['filter_domain'] = $_REQUEST['filter_domain']; $stored_options['email_num_autoreplies_24_hours'] = $_REQUEST['email_num_autoreplies_24_hours']; -$stored_options['allow_outbound_group_usage'] = isset($_REQUEST['allow_outbound_group_usage']) ? true : false; +$stored_options['allow_outbound_group_usage'] = isset($_REQUEST['allow_outbound_group_usage']) ? true : false; if (!$focus->isPop3Protocol()) { $stored_options['trashFolder'] = (isset($_REQUEST['trashFolder']) ? trim($_REQUEST['trashFolder']) : ""); $stored_options['sentFolder'] = (isset($_REQUEST['sentFolder']) ? trim($_REQUEST['sentFolder']) : ""); } // if -if ( $focus->isMailBoxTypeCreateCase() || ($focus->mailbox_type == 'createcase' && empty($_REQUEST['id']) ) ) +if ( $focus->isMailBoxTypeCreateCase() || ($focus->mailbox_type == 'createcase' && empty($_REQUEST['id']) ) ) { $stored_options['distrib_method'] = (isset($_REQUEST['distrib_method'])) ? $_REQUEST['distrib_method'] : ""; $stored_options['create_case_email_template'] = (isset($_REQUEST['create_case_template_id'])) ? $_REQUEST['create_case_template_id'] : ""; @@ -146,13 +144,13 @@ if (!isset($focus->id)) { if( isset($_REQUEST['is_auto_import']) && $_REQUEST['is_auto_import'] == 'on' ) { - if( empty($focus->groupfolder_id) ) - { + if( empty($focus->groupfolder_id) ) + { $groupFolderId = $focus->createAutoImportSugarFolder(); $focus->groupfolder_id = $groupFolderId; } } -else +else { $focus->groupfolder_id = ""; //If the user is turning the auto-import feature off then remove all previous subscriptions. @@ -167,11 +165,11 @@ else } } -if (!empty($focus->groupfolder_id)) +if (!empty($focus->groupfolder_id)) { - if ($_REQUEST['leaveMessagesOnMailServer'] == "1") + if ($_REQUEST['leaveMessagesOnMailServer'] == "1") $stored_options['leaveMessagesOnMailServer'] = 1; - else + else $stored_options['leaveMessagesOnMailServer'] = 0; } @@ -197,13 +195,13 @@ $GLOBALS['sugar_config']['disable_team_access_check'] = $previousTeamAccessCheck //Sync any changes within the IE account that need to be synced with the Sugar Folder. //Need to do this post save so the correct team/teamset id is generated correctly. -$monitor_fields = array('name', 'status', - ); +$monitor_fields = array('name', 'status', + ); //Only sync IE accounts with a group folder. Need to sync new records as team set assignment is processed -//after save. -if( !empty($focus->groupfolder_id) ) -{ +//after save. +if( !empty($focus->groupfolder_id) ) +{ foreach ($monitor_fields as $singleField) { //Check if the value is being changed during save. @@ -239,7 +237,7 @@ $GLOBALS['log']->debug("Saved record with id of ".$return_id); header("Location: index.php?module=$return_module&action=$return_action&record=$return_id$edit$error"); - + /** * Certain updates to the IE account need to be reflected in the related SugarFolder since they are * created automatically. Only valid for IE accounts with auto import turned on. @@ -248,25 +246,25 @@ header("Location: index.php?module=$return_module&action=$return_action&record=$ * @param SugarBean $focus The InboundEmail bean being saved. */ function syncSugarFoldersWithBeanChanges($fieldName, $focus) -{ +{ $f = new SugarFolder(); $f->retrieve($focus->groupfolder_id); - + switch ($fieldName) { case 'name': case 'team_id': case 'team_set_id': - $f->$fieldName = $focus->$fieldName; + $f->$fieldName = $focus->$fieldName; $f->save(); break; - + case 'status': if($focus->status == 'Inactive') $f->clearSubscriptionsForFolder($focus->groupfolder_id); else if($focus->mailbox_type != 'bounce' ) $f->addSubscriptionsToGroupFolder(); break; - } + } } diff --git a/modules/InboundEmail/ShowInboundFoldersList.php b/modules/InboundEmail/ShowInboundFoldersList.php index bed6f408..bd9f51ef 100644 --- a/modules/InboundEmail/ShowInboundFoldersList.php +++ b/modules/InboundEmail/ShowInboundFoldersList.php @@ -110,13 +110,18 @@ if (!empty($searchField)) { $ie = new InboundEmail(); +if(!empty($_REQUEST['ie_id'])) { + $ie->retrieve($_REQUEST['ie_id']); +} $ie->email_user = $_REQUEST['email_user']; $ie->server_url = $_REQUEST['server_url']; $ie->port = $_REQUEST['port']; $ie->protocol = $_REQUEST['protocol']; //Bug 23083.Special characters in email password results in IMAP authentication failure -$ie->email_password = html_entity_decode($_REQUEST['email_password'], ENT_QUOTES); -$ie->email_password = str_rot13($ie->email_password); +if(!empty($_REQUEST['email_password'])) { + $ie->email_password = html_entity_decode($_REQUEST['email_password'], ENT_QUOTES); + $ie->email_password = str_rot13($ie->email_password); +} //$ie->mailbox = $_REQUEST['mailbox']; $ie->mailbox = 'INBOX'; diff --git a/modules/Leads/views/view.convertlead.php b/modules/Leads/views/view.convertlead.php index a104732d..7cf68790 100644 --- a/modules/Leads/views/view.convertlead.php +++ b/modules/Leads/views/view.convertlead.php @@ -36,6 +36,7 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); ********************************************************************************/ require_once("include/EditView/EditView2.php"); +require_once("include/upload_file.php"); class ViewConvertLead extends SugarView { @@ -359,7 +360,12 @@ class ViewConvertLead extends SugarView $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'])){ + $lead->account_id = $selectedBeans['Accounts']->id; + } + //Handle non-contacts relationships foreach($beans as $bean) { @@ -522,7 +528,11 @@ class ViewConvertLead extends SugarView $newActivity->$rel->add($bean->id); $newActivity->parent_id = $bean->id; $newActivity->parent_type = $bean->module_dir; + $newActivity->update_date_modified = false; //bug 41747 $newActivity->save(); + if ($newActivity->module_dir == "Notes" && $newActivity->filename) { + UploadFile::duplicate_file($activity->id, $newActivity->id, $newActivity->filename); + } } } diff --git a/modules/Meetings/vardefs.php b/modules/Meetings/vardefs.php index 12f14929..3b95bc11 100644 --- a/modules/Meetings/vardefs.php +++ b/modules/Meetings/vardefs.php @@ -59,6 +59,15 @@ $dictionary['Meeting'] = array('table' => 'meetings', 'len' => '20', 'source'=>'non-db', ), + //bug 39559 + 'set_accept_links' => array ( + 'name' => 'accept_status', + 'vname' => 'LBL_SUBJECT', + 'type' => 'varchar', + 'dbType' => 'varchar', + 'len' => '20', + 'source'=>'non-db', + ), 'location' => array ( 'name' => 'location', diff --git a/modules/MergeRecords/SaveMerge.php b/modules/MergeRecords/SaveMerge.php index 28a8548e..9ac9b934 100644 --- a/modules/MergeRecords/SaveMerge.php +++ b/modules/MergeRecords/SaveMerge.php @@ -81,6 +81,10 @@ foreach($focus->merge_bean->additional_column_fields as $field) global $check_notify; $_REQUEST['useEmailWidget'] = true; +if (isset($_POST['date_entered'])) { + // set this to true so we won't unset date_entered when saving + $focus->merge_bean->update_date_entered = true; +} $focus->merge_bean->save($check_notify); unset($_REQUEST['useEmailWidget']); diff --git a/modules/ModuleBuilder/parsers/relationships/DeployedRelationships.php b/modules/ModuleBuilder/parsers/relationships/DeployedRelationships.php index e250bf9f..941ee6fa 100644 --- a/modules/ModuleBuilder/parsers/relationships/DeployedRelationships.php +++ b/modules/ModuleBuilder/parsers/relationships/DeployedRelationships.php @@ -166,6 +166,12 @@ class DeployedRelationships extends AbstractRelationships implements Relationshi $rac = new RepairAndClear ( ) ; $rac->repairAndClearAll ( array ( 'clearAll', 'rebuildExtensions', ), array ( $GLOBALS [ 'mod_strings' ] [ 'LBL_ALL_MODULES' ] ), true, false ) ; $GLOBALS [ 'mod_strings' ] = $MBmodStrings; + //bug 40941 + if ($relationship = $this->get ( $rel_name )) + { + return $this->removeFieldsFromDeployedLayout ( $relationship) ; + } + } /* @@ -377,6 +383,38 @@ class DeployedRelationships extends AbstractRelationships implements Relationshi } } } + + /** + * Added for bug #40941 + * Deletes the field from DetailView and editView of the appropriate module + * after the relatioship is deleted in delete() function above. + * @param $relationship The relationship that is getting deleted + * return null + */ + private function removeFieldsFromDeployedLayout ($relationship) + { + + // many-to-many relationships don't have fields so if we have a many-to-many we can just skip this... + if ($relationship->getType () == MB_MANYTOMANY) + return false ; + + $successful = true ; + $layoutAdditions = $relationship->buildFieldsToLayouts () ; + + require_once 'modules/ModuleBuilder/parsers/views/GridLayoutMetaDataParser.php' ; + foreach ( $layoutAdditions as $deployedModuleName => $fieldName ) + { + foreach ( array ( MB_EDITVIEW , MB_DETAILVIEW ) as $view ) + { + $parser = new GridLayoutMetaDataParser ( $view, $deployedModuleName ) ; + $parser->removeField ( $fieldName ); + $parser->handleSave ( false ) ; + + } + } + + return $successful ; + } } diff --git a/modules/ModuleBuilder/parsers/views/GridLayoutMetaDataParser.php b/modules/ModuleBuilder/parsers/views/GridLayoutMetaDataParser.php index e9fdc38e..e3e071cf 100644 --- a/modules/ModuleBuilder/parsers/views/GridLayoutMetaDataParser.php +++ b/modules/ModuleBuilder/parsers/views/GridLayoutMetaDataParser.php @@ -710,7 +710,7 @@ class GridLayoutMetaDataParser extends AbstractMetaDataParser implements MetaDat { $ret = array_intersect_key ( $def , array ( 'studio' => true , 'name' => true , 'label' => true , 'displayParams' => true , 'comment' => true , - 'customCode' => true , 'customLabel' => true , 'tabIndex' => true , 'hideLabel' => true) ) ; + 'customCode' => true , 'customLabel' => true , 'tabindex' => true , 'hideLabel' => true) ) ; if (!empty($def['vname']) && empty($def['label'])) $ret['label'] = $def['vname']; return $ret; diff --git a/modules/ModuleBuilder/views/view.listview.php b/modules/ModuleBuilder/views/view.listview.php index 1b3d7c78..54032ffc 100644 --- a/modules/ModuleBuilder/views/view.listview.php +++ b/modules/ModuleBuilder/views/view.listview.php @@ -185,7 +185,7 @@ class ViewListView extends ViewEdit if (!$this->fromModuleBuilder) { $subList = SubPanel::getModuleSubpanels ( $this->editModule); $subRef = $subList[strtolower($this->subpanel)]; - $subTitleKey = empty($subRef) ? $subRef : "LBL_" . strtoupper($this->subpanel) . "_SUBPANEL_TITLE"; + $subTitleKey = !empty($subRef) ? $subRef : "LBL_" . strtoupper($this->subpanel) . "_SUBPANEL_TITLE"; $subTitle = !empty($subRef) ? translate($subTitleKey, $this->editModule) : UCfirst($this->subpanel); $smarty->assign ( 'subpanel_label', $subTitleKey ) ; $smarty->assign ( 'subpanel_title', $subTitle ) ; diff --git a/modules/MySettings/StoreQuery.php b/modules/MySettings/StoreQuery.php index d2a8c907..5004002f 100644 --- a/modules/MySettings/StoreQuery.php +++ b/modules/MySettings/StoreQuery.php @@ -72,10 +72,10 @@ class StoreQuery{ function populateRequest(){ foreach($this->query as $key=>$val){ - // todo wp: remove this - if($key != 'advanced' && $key != 'module') { // cn: bug 6546 storequery stomps correct value for 'module' in Activities - $_REQUEST[$key] = $val; - $_GET[$key] = $val; + //We don't want to step on the search type, module, or offset if they are in the current request + if($key != 'advanced' && $key != 'module' && (substr($key, -7) != "_offset" || !isset($_REQUEST[$key]))) { + $_REQUEST[$key] = $val; + $_GET[$key] = $val; } } } diff --git a/modules/Opportunities/vardefs.php b/modules/Opportunities/vardefs.php index 0ae73538..9c320724 100644 --- a/modules/Opportunities/vardefs.php +++ b/modules/Opportunities/vardefs.php @@ -147,8 +147,8 @@ $dictionary['Opportunity'] = array('table' => 'opportunities','audited'=>true, ' // 'disable_num_format' => true, 'dbType' => 'double', 'comment' => 'Unconverted amount of the opportunity', - 'duplicate_merge'=>'disabled', 'importable' => 'required', + 'duplicate_merge'=>'1', 'required' => true, ), 'amount_usdollar' => @@ -159,6 +159,7 @@ $dictionary['Opportunity'] = array('table' => 'opportunities','audited'=>true, ' 'group'=>'amount', 'dbType' => 'double', 'disable_num_format' => true, + 'duplicate_merge'=>'0', 'audited'=>true, 'comment' => 'Formatted amount of the opportunity' ), diff --git a/modules/Schedulers/EditView.html b/modules/Schedulers/EditView.html index e6d3221e..7bf46b38 100644 --- a/modules/Schedulers/EditView.html +++ b/modules/Schedulers/EditView.html @@ -107,9 +107,9 @@ - +
@@ -66,16 +66,17 @@
{$ie_mod_strings.LBL_PASSWORD}: {$app_strings.LBL_REQUIRED_SYMBOL}  +
{$ie_mod_strings.LBL_SERVER_URL}: {$app_strings.LBL_REQUIRED_SYMBOL}  @@ -83,7 +84,7 @@
{$ie_mod_strings.LBL_SERVER_TYPE}: {$app_strings.LBL_REQUIRED_SYMBOL}  @@ -121,7 +122,7 @@
{$ie_mod_strings.LBL_TRASH_FOLDER}: {$app_strings.LBL_REQUIRED_SYMBOL}  @@ -130,7 +131,7 @@
{$ie_mod_strings.LBL_SENT_FOLDER}:   @@ -139,12 +140,12 @@
@@ -159,7 +160,7 @@

{$mod_strings.LBL_EMAIL_SETTINGS_OUTBOUND}

{$app_strings.LBL_EMAIL_SETTINGS_FROM_NAME}: @@ -171,7 +172,7 @@
{$app_strings.LBL_EMAIL_SETTINGS_FROM_ADDR}: @@ -183,7 +184,7 @@
{$app_strings.LBL_EMAIL_SETTINGS_REPLY_TO_ADDR}: @@ -219,21 +220,21 @@
 
  diff --git a/modules/Emails/templates/outboundDialog.tpl b/modules/Emails/templates/outboundDialog.tpl index 2179ce17..5d922612 100644 --- a/modules/Emails/templates/outboundDialog.tpl +++ b/modules/Emails/templates/outboundDialog.tpl @@ -40,14 +40,14 @@ - + - + diff --git a/modules/Home/Dashlets/iFrameDashlet/iFrameDashlet.php b/modules/Home/Dashlets/iFrameDashlet/iFrameDashlet.php index 72e33c34..6e452347 100644 --- a/modules/Home/Dashlets/iFrameDashlet/iFrameDashlet.php +++ b/modules/Home/Dashlets/iFrameDashlet/iFrameDashlet.php @@ -44,32 +44,43 @@ class iFrameDashlet extends Dashlet { var $configureTpl = 'modules/Home/Dashlets/iFrameDashlet/configure.tpl'; var $defaultURL = 'http://apps.sugarcrm.com/dashlet/sugarcrm-news-dashlet.html?lang=@@LANG@@&edition=@@EDITION@@&ver=@@VER@@'; var $url; + protected $allowed_schemes = array("http", "https"); function iFrameDashlet($id, $options = null) { parent::Dashlet($id); $this->isConfigurable = true; - - if(empty($options['title'])) { + + if(empty($options['title'])) { $this->title = translate('LBL_DASHLET_TITLE', 'Home'); $this->title = translate('LBL_DASHLET_DISCOVER_SUGAR_PRO', 'Home'); } else { $this->title = $options['title']; } - if(empty($options['url'])) { + if(empty($options['url'])) { $this->url = $this->defaultURL; $this->url = 'http://apps.sugarcrm.com/dashlet/go-pro.html?lang=@@LANG@@&edition=@@EDITION@@&ver=@@VER@@'; } else { $this->url = $options['url']; } - if(empty($options['height']) || (int)$options['height'] < 1 ) { - $this->height = 315; + $this->checkURL(); + + if(empty($options['height']) || (int)$options['height'] < 1 ) { + $this->height = 315; } else { $this->height = (int)$options['height']; } } + protected function checkURL() + { + $scheme = parse_url($this->url, PHP_URL_SCHEME); + if(!in_array($scheme, $this->allowed_schemes)) { + $this->url = 'about:blank'; + } + } + function displayOptions() { global $app_strings; $ss = new Sugar_Smarty(); @@ -81,13 +92,13 @@ class iFrameDashlet extends Dashlet { $ss->assign('id', $this->id); $ss->assign('height', $this->height); $ss->assign('saveLBL', $app_strings['LBL_SAVE_BUTTON_LABEL']); - - return $ss->fetch('modules/Home/Dashlets/iFrameDashlet/configure.tpl'); + + return $ss->fetch('modules/Home/Dashlets/iFrameDashlet/configure.tpl'); } function saveOptions($req) { $options = array(); - + if ( isset($req['title']) ) { $options['title'] = $req['title']; } diff --git a/modules/Import/ImportFile.php b/modules/Import/ImportFile.php index 4b75c2db..80f2d938 100644 --- a/modules/Import/ImportFile.php +++ b/modules/Import/ImportFile.php @@ -197,9 +197,11 @@ class ImportFile } // Bug 26219 - Convert all line endings to the same style as PHP_EOL - foreach ( $this->_currentRow as $key => $value ) - $this->_currentRow[$key] = str_replace(array("\r\n", "\n", "\r"),PHP_EOL,$value); - + foreach ( $this->_currentRow as $key => $value ) { + // use preg_replace instead of str_replace as str_replace may cause extra lines on Windows + $this->_currentRow[$key] = preg_replace("[\r\n|\n|\r]", PHP_EOL, $value); + } + $this->_rowsCount++; $this->_rowCountedForErrors = false; diff --git a/modules/Import/tpls/step3.tpl b/modules/Import/tpls/step3.tpl index 4eca2554..8a52d0df 100644 --- a/modules/Import/tpls/step3.tpl +++ b/modules/Import/tpls/step3.tpl @@ -116,8 +116,8 @@ textarea { width: 20em } {if $item.show_remove} {else} @@ -130,14 +130,14 @@ textarea { width: 20em } {/foreach} @@ -215,7 +215,7 @@ textarea { width: 20em } - +
{$app_strings.LBL_EMAIL_ACCOUNTS_NAME}: {$app_strings.LBL_REQUIRED_SYMBOL} - + @@ -119,7 +119,10 @@
{sugar_translate module='Emails' label='LBL_MAIL_SMTPPASS'} {$app_strings.LBL_REQUIRED_SYMBOL} + + +    
-
- -        {$MOD.LBL_SAVE_MAPPING_AS} -  {sugar_help text=$MOD.LBL_SAVE_MAPPING_HELP} @@ -194,14 +194,14 @@ textarea { width: 20em } {$MOD.LBL_NUMBER_GROUPING_SEP}
{$MOD.LBL_DECIMAL_SEP} -
{$MOD.LBL_LOCALE_EXAMPLE_NAME_FORMAT}:
@@ -266,31 +266,31 @@ ProcessImport = new function() * number of file to process processed */ this.fileCount = 0; - + /* * total files to processs */ this.fileTotal = {/literal}{$FILECOUNT-1}{literal}; - + /* * total records to process */ this.recordCount = {/literal}{$RECORDCOUNT}{literal}; - + /* * maximum number of records per file */ this.recordThreshold = {/literal}{$RECORDTHRESHOLD}{literal}; - + /* * submits the form */ this.submit = function() { - document.getElementById("importstep3").tmp_file.value = + document.getElementById("importstep3").tmp_file.value = document.getElementById("importstep3").tmp_file_base.value + '-' + this.fileCount; YAHOO.util.Connect.setForm(document.getElementById("importstep3")); - YAHOO.util.Connect.asyncRequest('POST', 'index.php', + YAHOO.util.Connect.asyncRequest('POST', 'index.php', { success: function(o) { if (o.responseText.replace(/^\s+|\s+$/g, '') != '') { @@ -298,12 +298,12 @@ ProcessImport = new function() } else { var locationStr = "index.php?module=Import" - + "&action=Last" - + "&type={/literal}{$TYPE}{literal}" + + "&action=Last" + + "&type={/literal}{$TYPE}{literal}" + "&import_module={/literal}{$IMPORT_MODULE}{literal}"; if ( ProcessImport.fileCount >= ProcessImport.fileTotal ) { YAHOO.SUGAR.MessageBox.updateProgress(1,'{/literal}{$MOD.LBL_IMPORT_COMPLETE}{literal}'); - document.location.href = locationStr; + SUGAR.util.hrefURL(locationStr); } else { document.getElementById("importstep3").save_map_as.value = ''; @@ -315,9 +315,9 @@ ProcessImport = new function() failure: function(o) { YAHOO.SUGAR.MessageBox.minWidth = 500; YAHOO.SUGAR.MessageBox.show({ - type: "alert", - title: '{/literal}{$MOD.LBL_IMPORT_ERROR}{literal}', - msg: o.responseText, + type: "alert", + title: '{/literal}{$MOD.LBL_IMPORT_ERROR}{literal}', + msg: o.responseText, fn: function() { window.location.reload(true); } }); } @@ -332,11 +332,11 @@ ProcessImport = new function() + " {/literal}{$MOD.LBL_IMPORT_RECORDS_TO}{literal} " + Math.min(((this.fileCount+1) * this.recordThreshold),this.recordCount) + " {/literal}{$MOD.LBL_IMPORT_RECORDS_OF}{literal} " + this.recordCount ); } - + /* * begins the form submission process */ - this.begin = function() + this.begin = function() { datestarted = '{/literal}{$MOD.LBL_IMPORT_STARTED}{literal} ' + YAHOO.util.Date.format('{/literal}{$datetimeformat}{literal}'); diff --git a/modules/InboundEmail/EditView.html b/modules/InboundEmail/EditView.html index ab8cfb42..a3e7b01f 100644 --- a/modules/InboundEmail/EditView.html +++ b/modules/InboundEmail/EditView.html @@ -120,7 +120,10 @@ {MOD.LBL_PASSWORD}: {APP.LBL_REQUIRED_SYMBOL} 
-
@@ -304,10 +307,10 @@ function checkformdata() { function prefillGmailDefaults(){ - document.getElementById('server_url').value = "imap.gmail.com"; + document.getElementById('server_url').value = "imap.gmail.com"; document.getElementById('ssl').checked = true; document.getElementById('protocol').value = "imap"; - + toggle_monitored_folder(document.getElementById('protocol')); setPortDefault(); } @@ -352,7 +355,7 @@ function showCreateCaseRow() { var createCaseRow1 = document.getElementById('createCaseRow1'); var isCreateCase = document.getElementById('is_create_case').checked; var autoImportEl = document.getElementById('is_auto_import'); - + if (isCreateCase) { createCaseRow.style.display = ''; createCaseRow1.style.display = ''; @@ -549,9 +552,9 @@ function showHideLeaveMessagesOnMailServer() { } // fn function showWarningsIfChaningAutoImport() { - + var isAutoImportOn = document.getElementById('is_auto_import').checked; - var isCreateCase = document.getElementById('is_create_case').checked + var isCreateCase = document.getElementById('is_create_case').checked var record = document.forms['EditView'].record.value; //Alert if changing for an existing record only. if(record != '') @@ -569,6 +572,11 @@ possibleActionChange(); var warningForAutoChange = '{MOD.LBL_WARNING_CHANGING_AUTO_IMPORT}'; var warningForAutoChangeWithCreateCase = '{MOD.LBL_WARNING_CHANGING_AUTO_IMPORT_WITH_CREATE_CASE}'; +if(window.addEventListener){ + window.addEventListener("load", function() { SUGAR.util.setEmailPasswordDisplay('email_password', {HAS_PASSWORD}); }, false); +}else{ + window.attachEvent("onload", function() { SUGAR.util.setEmailPasswordDisplay('email_password', {HAS_PASSWORD}); }); +} {JAVASCRIPT} \ No newline at end of file diff --git a/modules/InboundEmail/EditView.php b/modules/InboundEmail/EditView.php index 6a484e5e..96c15699 100644 --- a/modules/InboundEmail/EditView.php +++ b/modules/InboundEmail/EditView.php @@ -62,12 +62,12 @@ if(isset($_REQUEST['record'])) { sugar_die($app_strings['ERROR_NO_RECORD']); } } -else +else { if(!empty($_REQUEST['mailbox_type'])) $focus->mailbox_type = $_REQUEST['mailbox_type']; - - //Default to imap protocol for new accounts. + + //Default to imap protocol for new accounts. $focus->protocol = 'imap'; } @@ -78,7 +78,7 @@ if($focus->mailbox_type == 'bounce') } else unset($domMailBoxType['bounce']); - + if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { $GLOBALS['log']->debug("isDuplicate found - duplicating record of id: ".$focus->id); $focus->id = ""; @@ -191,7 +191,7 @@ $javascript->setSugarBean($focus); $javascript->setFormName('EditView'); $javascript->addRequiredFields(); $javascript->addFieldGeneric('email_user', 'alpha', $mod_strings['LBL_LOGIN'], true); -$javascript->addFieldGeneric('email_password', 'alpha', $mod_strings['LBL_PASSWORD'], true); +$javascript->addFieldGeneric('email_password', 'alpha', $mod_strings['LBL_PASSWORD'], false); $javascript->addFieldRange('email_num_autoreplies_24_hours', 'int', $mod_strings['LBL_MAX_AUTO_REPLIES'], true, "", 1, $focus->maxEmailNumAutoreplies24Hours); $r = $focus->db->query('SELECT value FROM config WHERE name = \'fromname\''); @@ -232,7 +232,8 @@ $xtpl->assign('NAME', $focus->name); $xtpl->assign('STATUS', $status); $xtpl->assign('SERVER_URL', $focus->server_url); $xtpl->assign('USER', $focus->email_user); -$xtpl->assign('PASSWORD', $focus->email_password); +// Don't send password back +$xtpl->assign('HAS_PASSWORD', empty($focus->email_password)?0:1); $xtpl->assign('TRASHFOLDER', $trashFolder); $xtpl->assign('SENTFOLDER', $sentFolder); $xtpl->assign('MAILBOX', $mailbox); @@ -258,9 +259,9 @@ if(!empty($focus->port)) { $groupId = ""; $is_auto_import = ""; $allow_outbound = ''; -if(isset($focus->id)) +if(isset($focus->id)) $groupId = $focus->group_id; -else +else { $groupId = create_guid(); $is_auto_import = 'checked'; @@ -299,26 +300,26 @@ if($focus->is_personal) { $xtpl->assign('AUTO_IMPORT_STYLE', "display:''"); $ret = $folder->getFoldersForSettings($current_user); - //For existing records, do not allow + //For existing records, do not allow $is_auto_import_disabled = ""; - if (!empty($focus->groupfolder_id)) + if (!empty($focus->groupfolder_id)) { $is_auto_import = "checked"; $xtpl->assign('EDIT_GROUP_FOLDER_STYLE', "visibility:inline"); $leaveMessagesOnMailServerStyle = "display:''"; $allow_outbound = (isset($storedOptions['allow_outbound_group_usage']) && $storedOptions['allow_outbound_group_usage'] == 1) ? 'CHECKED' : ''; - } - else + } + else { $xtpl->assign('EDIT_GROUP_FOLDER_STYLE', "visibility:hidden"); - } - + } + $xtpl->assign('ALLOW_OUTBOUND_USAGE', $allow_outbound); $xtpl->assign('IS_AUTO_IMPORT', $is_auto_import); - - if ($focus->isMailBoxTypeCreateCase()) + + if ($focus->isMailBoxTypeCreateCase()) $createCaseRowStyle = "display:''"; - + } $xtpl->assign('hasGrpFld',$focus->groupfolder_id == null ? '' : 'checked="1"'); @@ -354,13 +355,13 @@ if ($focus->mailbox_type == 'bounce') } elseif ($focus->mailbox_type == 'createcase') $xtpl->assign("IS_CREATE_CASE", 'checked'); - + else if( $focus->is_personal == '1') $xtpl->assign('MODULE_TITLE', get_module_title($mod_strings['LBL_MODULE_TITLE'], $mod_strings['LBL_PERSONAL_MODULE_NAME'].": ".$focus->name, true)); -//else +//else + - $xtpl->parse("main"); $xtpl->out("main"); ?> \ No newline at end of file diff --git a/modules/InboundEmail/InboundEmail.js b/modules/InboundEmail/InboundEmail.js index 47be9c92..ee9b8cd1 100644 --- a/modules/InboundEmail/InboundEmail.js +++ b/modules/InboundEmail/InboundEmail.js @@ -43,7 +43,7 @@ if(word.indexOf('%')>0){fragment1=word.substr(0,word.indexOf('%'));fragment2=wor return words;} function ie_test_open_popup_with_submit(module_name,action,pageTarget,width,height,mail_server,protocol,port,login,password,mailbox,ssl,personal,formName) {if(!formName)formName="testSettingsView";var words=getEncryptedPassword(login,password,mailbox);var isPersonal=(personal)?'true':'false';if(!isDataValid(formName,true)){return;} -URL='index.php?' +ie_id=document.getElementById(formName).ie_id.value;URL='index.php?' +'module='+module_name +'&to_pdf=1' +'&action='+action @@ -56,6 +56,7 @@ URL='index.php?' +'&email_password='+words[1] +'&mailbox='+words[2] +'&ssl='+ssl ++'&ie_id='+ie_id +'&personal='+isPersonal;var SI=SUGAR.inboundEmail;if(!SI.testDlg){SI.testDlg=new YAHOO.widget.SimpleDialog("testSettingsDiv",{width:width+"px",draggable:true,dragOnly:true,close:true,constraintoviewport:true,modal:true,loadingText:SUGAR.language.get("app_strings","LBL_EMAIL_LOADING")});SI.testDlg._updateContent=function(o){var w=this.cfg.config.width.value+"px";this.setBody(o.responseText);if(this.evalJS) SUGAR.util.evalScript(o.responseText);if(!SUGAR.isIE) this.body.style.width=w}} @@ -63,7 +64,7 @@ var title=SUGAR.language.get('Emails','LBL_TEST_SETTINGS');if(typeof(title)=="un title=SUGAR.language.get('InboundEmail','LBL_TEST_SETTINGS');SI.testDlg.setHeader(title);SI.testDlg.setBody(SUGAR.language.get("app_strings","LBL_EMAIL_LOADING"));SI.testDlg.render(document.body);var Connect=YAHOO.util.Connect;if(Connect.url)URL=Connect.url+"&"+url;Connect.asyncRequest("GET",URL,{success:SI.testDlg._updateContent,failure:SI.testDlg.hide,scope:SI.testDlg});SI.testDlg.show();} function isDataValid(formName,validateMonitoredFolder){var formObject=document.getElementById(formName);var errors=new Array();var out=new String();if(trim(formObject.server_url.value)==""){errors.push(SUGAR.language.get('app_strings','LBL_EMAIL_ERROR_SERVER'));} if(trim(formObject.email_user.value)==""){errors.push(SUGAR.language.get('app_strings','LBL_EMAIL_ERROR_USER'));} -if(trim(formObject.email_password.value)==""){errors.push(SUGAR.language.get('app_strings','LBL_EMAIL_ERROR_PASSWORD'));} +if(trim(formObject.email_password.value)==""&&trim(formObject.ie_id.value)==""){errors.push(SUGAR.language.get('app_strings','LBL_EMAIL_ERROR_PASSWORD'));} if(formObject.protocol.protocol==""){errors.push(SUGAR.language.get('app_strings','LBL_EMAIL_ERROR_PROTOCOL'));} if(formObject.protocol.value=='imap'&&validateMonitoredFolder){if(trim(formObject.mailbox.value)==""){errors.push(SUGAR.language.get('app_strings','LBL_EMAIL_ERROR_MONITORED_FOLDER'));}} if(formObject.port.value==""){errors.push(SUGAR.language.get('app_strings','LBL_EMAIL_ERROR_PORT'));} diff --git a/modules/InboundEmail/InboundEmail.php b/modules/InboundEmail/InboundEmail.php index 20ac3e48..bb38d23d 100644 --- a/modules/InboundEmail/InboundEmail.php +++ b/modules/InboundEmail/InboundEmail.php @@ -219,7 +219,9 @@ class InboundEmail extends SugarBean { //_ppd($raw); $raw = $this->filterMailBoxFromRaw(explode(",", $this->mailbox), $raw); $this->mailbox = implode(",", $raw); - $this->email_password = blowfishEncode(blowfishGetKey('InboundEmail'), $this->email_password); + if(!empty($this->email_password)) { + $this->email_password = blowfishEncode(blowfishGetKey('InboundEmail'), $this->email_password); + } $ret = parent::save($check_notify); return $ret; } @@ -2159,7 +2161,9 @@ class InboundEmail extends SugarBean { $this->status = $_REQUEST['ie_status']; $this->server_url = trim($_REQUEST['server_url']); $this->email_user = trim($_REQUEST['email_user']); - $this->email_password = $_REQUEST['email_password']; + if(!empty($_REQUEST['email_password'])) { + $this->email_password = $_REQUEST['email_password']; + } $this->port = trim($_REQUEST['port']); $this->protocol = $_REQUEST['protocol']; if ($this->protocol == "pop3") { @@ -3354,7 +3358,7 @@ class InboundEmail extends SugarBean { } else { return "other/$subtype"; } - + } /** @@ -3664,6 +3668,40 @@ class InboundEmail extends SugarBean { return $ret; } + /** + * URL cleanup function + * Until we have comprehensive CSRF protection, we need to sanitize URLs in emails + * to avoid CSRF attacks + */ + public function urlCleaner($attr, $value) + { + // hrefs are ok + if(strtolower($attr) == "href") return true; + $items = parse_url($value); + if(empty($items)) return false; + // don't allow relative URLs + if(empty($items['host'])) return false; + // allow URLs with no query + if(empty($items['query'])) return true; + // allow URLs that don't start with /? or /index.php? + if(!empty($items['path']) && $items['path'] != '/' && strtolower(substr($items['path'], -10)) != '/index.php') { + return true; + } + // now we have blah-blah/index.php?query - let's see if query looks dangerous + $query_items = array(); + parse_str(from_html($items['query']), $query_items); + // weird query, probably harmless + if(empty($query_items)) return true; + // suspiciously like SugarCRM query, reject + if(!empty($query_items['module']) && !empty($query_items['action'])) return false; + // looks like non-download entry point - allow only specific entry points + if(!empty($query_items['entryPoint']) && !in_array($query_items['entryPoint'], array('download', 'image', 'getImage'))) { + return false; + } + + return true; + } + /** * Cleans content for XSS and other types of attack vectors * @param string str String to clean @@ -3672,6 +3710,7 @@ class InboundEmail extends SugarBean { function cleanContent($str) { // Safe_HTML $this->safe->clear(); + $this->safe->setUrlCallback(array($this, "urlCleaner")); $str = $this->safe->parse($str); return $this->cleanXssContent($str); } @@ -5991,7 +6030,7 @@ eoq; $temp = array(); $temp['flagged'] = $flagged; $temp['status'] = $status; - $temp['from'] = $from; + $temp['from'] = to_html($from); $temp['subject'] = $subject; $temp['date'] = $date; $temp['uid'] = $msg->uid; // either from an imap_search() or massaged cache value @@ -6000,7 +6039,7 @@ eoq; $temp['site_url'] = $sugar_config['site_url']; $temp['seen'] = $msg->seen; $temp['type'] = (isset($msg->type)) ? $msg->type: 'remote'; - $temp['to_addrs'] = $msg->to; + $temp['to_addrs'] = to_html($msg->to); $temp['hasAttach'] = '0'; $return[] = $temp; diff --git a/modules/InboundEmail/Popup.php b/modules/InboundEmail/Popup.php index 5fd07eb9..de83c97b 100644 --- a/modules/InboundEmail/Popup.php +++ b/modules/InboundEmail/Popup.php @@ -46,7 +46,7 @@ if(ini_get('zlib.output_compression') == 1) { // ini_get() returns 1/0, not valu $iniError = $mod_strings['ERR_INI_ZLIB']; } } - + // hack to allow "&", "%" and "+" through a $_GET var // set by ie_test_open_popup() javascript call foreach($_REQUEST as $k => $v) { @@ -96,18 +96,22 @@ if($popupBoolean) { if(isset($_REQUEST['ssl']) && ($_REQUEST['ssl'] == "true" || $_REQUEST['ssl'] == 1)) { $msg .= $mod_strings['LBL_FIND_SSL_WARN']; $useSsl = true; -} +} $ie = new InboundEmail(); +if(!empty($_REQUEST['ie_id'])) { + $ie->retrieve($_REQUEST['ie_id']); +} $ie->email_user = $_REQUEST['email_user']; $ie->server_url = $_REQUEST['server_url']; $ie->port = $_REQUEST['port']; $ie->protocol = $_REQUEST['protocol']; //Bug 23083.Special characters in email password results in IMAP authentication failure -$ie->email_password = html_entity_decode($_REQUEST['email_password'], ENT_QUOTES); -$ie->email_password = str_rot13($ie->email_password); - +if(!empty($_REQUEST['email_password'])) { + $ie->email_password = html_entity_decode($_REQUEST['email_password'], ENT_QUOTES); + $ie->email_password = str_rot13($ie->email_password); +} $ie->mailbox = 'INBOX'; if($popupBoolean) { @@ -154,7 +158,7 @@ echo /*'
'.$iniError.'
  
- {MOD.LBL_CRONTAB_EXAMPLES} - + {MOD.LBL_CRONTAB_EXAMPLES} {MOD.LBL_CRONTAB_SERVER_TIME_PRE} {SERVER_TIMEZONE} {SERVER_OFFSET} {MOD.LBL_CRONTAB_SERVER_TIME_POST} +
diff --git a/modules/Schedulers/EditView.php b/modules/Schedulers/EditView.php index 64043cc4..814bac20 100644 --- a/modules/Schedulers/EditView.php +++ b/modules/Schedulers/EditView.php @@ -340,8 +340,11 @@ $xtpl->assign('MONTHS', $exInterval[3]); $xtpl->assign('DAY_OF_WEEK', $exInterval[4]); $xtpl->assign('ROLLOVER', $email->rolloverStyle); +$xtpl->assign('SERVER_TIMEZONE', date("T")); +$xtpl->assign('SERVER_OFFSET', date("O")); + $xtpl->parse("main"); $xtpl->out("main"); //$focus->displayCronInstructions(); -?> \ No newline at end of file +?> diff --git a/modules/Schedulers/language/en_us.lang.php b/modules/Schedulers/language/en_us.lang.php index 5517938f..46c3e461 100644 --- a/modules/Schedulers/language/en_us.lang.php +++ b/modules/Schedulers/language/en_us.lang.php @@ -97,6 +97,8 @@ $mod_strings = array ( 'LBL_MONTHS' => 'mo', 'LBL_DAY_OF_WEEK' => 'day', 'LBL_CRONTAB_EXAMPLES' => 'The above uses standard crontab notation.', +'LBL_CRONTAB_SERVER_TIME_PRE' => 'The cron specifications run based on the server timezone (', +'LBL_CRONTAB_SERVER_TIME_POST' => '). Please specify the scheduler execution time accordingly.', // Labels 'LBL_ALWAYS' => 'Always', 'LBL_CATCH_UP' => 'Execute If Missed', diff --git a/modules/SchedulersJobs/SchedulersJob.php b/modules/SchedulersJobs/SchedulersJob.php index 9cff6232..53c52105 100644 --- a/modules/SchedulersJobs/SchedulersJob.php +++ b/modules/SchedulersJobs/SchedulersJob.php @@ -136,9 +136,10 @@ class SchedulersJob extends SugarBean { * handles some date/time foramtting * @param string time Time (usually "now") * @param object user User, usually admin (id = '1') + * @param boolean to_local, convert to user's time format * @return string formatted time. */ - function handleDateFormat($time, $user=null) { + function handleDateFormat($time, $user=null, $to_local=true) { global $timedate; if(!isset($timedate) || empty($timedate)) { @@ -149,8 +150,12 @@ class SchedulersJob extends SugarBean { $user = (empty($user)) ? $this->user : $user; $dbTime = gmdate($GLOBALS['timedate']->get_db_date_time_format(), strtotime($time)); - $ret = $timedate->to_display_date_time($dbTime, true, true, $user); - return $ret; + if ($to_local) { + $ret = $timedate->to_display_date_time($dbTime, true, true, $user); + return $ret; + } + + return $dbTime; } function setJobFlag($flag) { @@ -180,7 +185,7 @@ class SchedulersJob extends SugarBean { $trackerManager->pause(); $GLOBALS['log']->debug('----->SchedulersJob updating Job Status and finishing Job execution.'); $this->scheduler->retrieve($this->scheduler->id); - $this->scheduler->last_run = $this->handleDateFormat('now'); + $this->scheduler->last_run = gmdate($GLOBALS['timedate']->get_db_date_time_format()); if($this->scheduler->last_run == gmdate($GLOBALS['timedate']->get_db_date_time_format(), strtotime('Jan 01 2000 00:00:00'))) { $this->scheduler->last_run = $this->handleDateFormat('now'); $GLOBALS['log']->fatal('Scheduler applying bogus date for "Last Run": '.$this->scheduler->last_run); diff --git a/modules/Tasks/vardefs.php b/modules/Tasks/vardefs.php index 49846d76..ed987116 100644 --- a/modules/Tasks/vardefs.php +++ b/modules/Tasks/vardefs.php @@ -65,6 +65,7 @@ $dictionary['Task'] = array('table' => 'tasks', 'type' =>'bool', 'default'=>0, 'group'=>'date_due', + 'studio' => false, ), 'date_due' => array ( @@ -92,6 +93,7 @@ $dictionary['Task'] = array('table' => 'tasks', 'type' =>'bool', 'group'=>'date_start', 'default'=>0, + 'studio' => false, ), 'date_start' => array ( diff --git a/modules/Users/EditView.php b/modules/Users/EditView.php index 3dddf8c6..1596418f 100644 --- a/modules/Users/EditView.php +++ b/modules/Users/EditView.php @@ -534,22 +534,22 @@ if( !($usertype=='GROUP' || $usertype=='PORTAL_ONLY') ) $mail_smtpdisplay = $systemOutboundEmail->mail_smtpdisplay; $hide_if_can_use_default = true; $mail_smtpauth_req=true; - + if( !$systemOutboundEmail->isAllowUserAccessToSystemDefaultOutbound() ) { - + $mail_smtpauth_req = $systemOutboundEmail->mail_smtpauth_req; $userOverrideOE = $systemOutboundEmail->getUsersMailerForSystemOverride($current_user->id); if($userOverrideOE != null) { - + $mail_smtpuser = $userOverrideOE->mail_smtpuser; $mail_smtppass = $userOverrideOE->mail_smtppass; - + } - - if(!$mail_smtpauth_req && - ( empty($systemOutboundEmail->mail_smtpserver) || empty($systemOutboundEmail->mail_smtpuser) + + if(!$mail_smtpauth_req && + ( empty($systemOutboundEmail->mail_smtpserver) || empty($systemOutboundEmail->mail_smtpuser) || empty($systemOutboundEmail->mail_smtppass))) { $hide_if_can_use_default = true; @@ -558,11 +558,12 @@ if( !($usertype=='GROUP' || $usertype=='PORTAL_ONLY') ) $hide_if_can_use_default = false; } } - + $sugar_smarty->assign("mail_smtpdisplay", $mail_smtpdisplay); $sugar_smarty->assign("mail_smtpserver", $mail_smtpserver); $sugar_smarty->assign("mail_smtpuser", $mail_smtpuser); - $sugar_smarty->assign("mail_smtppass", $mail_smtppass); + $sugar_smarty->assign("mail_smtppass", ""); + $sugar_smarty->assign("mail_haspass", empty($systemOutboundEmail->mail_smtppass)?0:1); $sugar_smarty->assign("mail_smtpauth_req", $mail_smtpauth_req); $sugar_smarty->assign('MAIL_SMTPPORT',$mail_smtpport); $sugar_smarty->assign('MAIL_SMTPSSL',$mail_smtpssl); diff --git a/modules/Users/EditView.tpl b/modules/Users/EditView.tpl index d50909f2..8a298698 100644 --- a/modules/Users/EditView.tpl +++ b/modules/Users/EditView.tpl @@ -77,7 +77,7 @@ var ERR_REENTER_PASSWORDS = '{$MOD.ERR_REENTER_PASSWORDS}'; - + + @@ -115,7 +115,7 @@ EditView_tabs.on('contentReady', function(e){
  • {$MOD.LBL_THEME}
  • {/if}
  • {$MOD.LBL_ADVANCED}
  • - +
    @@ -132,7 +132,7 @@ EditView_tabs.on('contentReady', function(e){
    - {$USER_STATUS_OPTIONS} + {$USER_STATUS_OPTIONS} @@ -273,7 +273,7 @@ EditView_tabs.on('contentReady', function(e){ {if !empty($mail_smtpauth_req) } - + @@ -282,12 +282,15 @@ EditView_tabs.on('contentReady', function(e){ - + {/if} - + @@ -299,7 +302,7 @@ EditView_tabs.on('contentReady', function(e){
    - {if ($CHANGE_PWD) == '1'} + {if ($CHANGE_PWD) == '1'}
    - - {$BUTTONS}
    {$MOD.LBL_USER_TYPE}: {$USER_TYPE_LABEL} {sugar_help text=$USER_TYPE_DESC WIDTH=250} {$MOD.LBL_LAST_NAME}: {$APP.LBL_REQUIRED_SYMBOL} 
    {$MOD.LBL_MAIL_SMTPUSER}
    {$MOD.LBL_MAIL_SMTPPASS} + + +    
     
    @@ -334,7 +337,7 @@ EditView_tabs.on('contentReady', function(e){ {if ($REQUIRED_PASSWORD)}{$APP.LBL_REQUIRED_SYMBOL}{/if} - +
    - + @@ -360,9 +363,9 @@ EditView_tabs.on('contentReady', function(e){
    - + + - + @@ -470,7 +473,7 @@ EditView_tabs.on('contentReady', function(e){ - + @@ -488,11 +491,11 @@ EditView_tabs.on('contentReady', function(e){ - + @@ -541,7 +544,7 @@ EditView_tabs.on('contentReady', function(e){ - {if ($IS_ADMIN)} + {if ($IS_ADMIN)} {else} @@ -551,7 +554,7 @@ EditView_tabs.on('contentReady', function(e){ {capture name=SMARTY_LOCALE_NAME_FORMAT_DESC} {$MOD.LBL_LOCALE_NAME_FORMAT_DESC}
    {$MOD.LBL_LOCALE_NAME_FORMAT_DESC_2}{/capture} @@ -562,18 +565,18 @@ EditView_tabs.on('contentReady', function(e){ - +
    @@ -426,9 +429,9 @@ EditView_tabs.on('contentReady', function(e){ -
    {$MOD.LBL_EXPORT_CHARSET}: {sugar_help text=$MOD.LBL_EXPORT_CHARSET_DESC }

    {$MOD.LBL_LAYOUT_OPTIONS}

    {$MOD.LBL_USE_GROUP_TABS}: {sugar_help text=$MOD.LBL_NAVIGATION_PARADIGM_DESCRIPTION }
    {$MOD.LBL_MAX_TAB}: {sugar_help text=$MOD.LBL_MAX_TAB_DESCRIPTION }
    {$MOD.LBL_SUBPANEL_TABS}: {sugar_help text=$MOD.LBL_SUBPANEL_TABS_DESCRIPTION }
    {$MOD.LBL_PROMPT_TIMEZONE}: {sugar_help text=$MOD.LBL_PROMPT_TIMEZONE_TEXT } {$MOD.LBL_NUMBER_GROUPING_SEP}: {sugar_help text=$MOD.LBL_NUMBER_GROUPING_SEP_TEXT }
    {$MOD.LBL_DECIMAL_SEP}: {sugar_help text=$MOD.LBL_DECIMAL_SEP_TEXT } -
    {$MOD.LBL_LOCALE_EXAMPLE_NAME_FORMAT}:
    - +
    @@ -603,9 +606,9 @@ EditView_tabs.on('contentReady', function(e){
    - - {$BUTTONS}
    @@ -661,11 +664,11 @@ function startOutBoundEmailSettingsTest() requires: ["datatable", "dragdrop", "treeview", "tabview"] }); loader.insert(); - + } -function testOutboundSettings() -{ +function testOutboundSettings() +{ var errorMessage = ''; var isError = false; var fromAddress = document.getElementById("outboundtest_from_address").value; @@ -674,40 +677,36 @@ function testOutboundSettings() var smtpServer = document.getElementById('mail_smtpserver').value; var mailsmtpauthreq = document.getElementById('mail_smtpauth_req'); - if(trim(smtpServer) == '' || trim(mail_smtpport) == '') + if(trim(smtpServer) == '' || trim(mail_smtpport) == '') { isError = true; errorMessage += "{/literal}{$MOD.LBL_MISSING_DEFAULT_OUTBOUND_SMTP_SETTINGS}{literal}" + "
    "; overlay("{/literal}{$APP.ERR_MISSING_REQUIRED_FIELDS}{literal}", errorMessage, 'alert'); return false; } - - - if(document.getElementById('mail_smtpuser') && trim(document.getElementById('mail_smtpuser').value) == '') + + + if(document.getElementById('mail_smtpuser') && trim(document.getElementById('mail_smtpuser').value) == '') { isError = true; errorMessage += "{/literal}{$APP.LBL_EMAIL_ACCOUNTS_SMTPUSER}{literal}" + "
    "; } - - if(document.getElementById('mail_smtppass') && trim(document.getElementById('mail_smtppass').value) == '') - { - isError = true; - errorMessage += "{/literal}{$APP.LBL_EMAIL_ACCOUNTS_SMTPPASS}{literal}" + "
    "; - } + if(isError) { overlay("{/literal}{$APP.ERR_MISSING_REQUIRED_FIELDS}{literal}", errorMessage, 'alert'); - return false; - } - + return false; + } + testOutboundSettingsDialog(); } function sendTestEmail() { + var toAddress = document.getElementById("outboundtest_from_address").value; var fromAddress = document.getElementById("outboundtest_from_address").value; - - if (trim(fromAddress) == "") + + if (trim(fromAddress) == "") { overlay("{/literal}{$APP.ERR_MISSING_REQUIRED_FIELDS}{literal}", "{{/literal}$APP.LBL_EMAIL_SETTINGS_FROM_TO_EMAIL_ADDR}{literal}", 'alert'); return; @@ -716,26 +715,26 @@ function sendTestEmail() overlay("{/literal}{$APP.ERR_INVALID_REQUIRED_FIELDS}{literal}", "{/literal}{$APP.LBL_EMAIL_SETTINGS_FROM_TO_EMAIL_ADDR}{literal}", 'alert'); return; } - + //Hide the email address window and show a message notifying the user that the test email is being sent. EmailMan.testOutboundDialog.hide(); overlay("{/literal}{$APP.LBL_EMAIL_PERFORMING_TASK}{literal}", "{/literal}{$APP.LBL_EMAIL_ONE_MOMENT}{literal}", 'alert'); - + var callbackOutboundTest = { success : function(o) { hideOverlay(); overlay("{/literal}{$APP.LBL_EMAIL_TEST_OUTBOUND_SETTINGS}{literal}", "{/literal}{$APP.LBL_EMAIL_TEST_NOTIFICATION_SENT}{literal}", 'alert'); } - }; + }; var smtpServer = document.getElementById('mail_smtpserver').value; - + if(document.getElementById('mail_smtpuser') && document.getElementById('mail_smtppass')){ - var postDataString = 'mail_sendtype=SMTP&mail_smtpserver=' + smtpServer + "&mail_smtpport=" + mail_smtpport + "&mail_smtpssl=" + mail_smtpssl + "&mail_smtpauth_req=true&mail_smtpuser=" + trim(document.getElementById('mail_smtpuser').value) + "&mail_smtppass=" + trim(document.getElementById('mail_smtppass').value) + "&outboundtest_from_address=" + fromAddress; + var postDataString = 'mail_sendtype=SMTP&mail_smtpserver=' + smtpServer + "&mail_smtpport=" + mail_smtpport + "&mail_smtpssl=" + mail_smtpssl + "&mail_smtpauth_req=true&mail_smtpuser=" + trim(document.getElementById('mail_smtpuser').value) + "&mail_smtppass=" + trim(document.getElementById('mail_smtppass').value) + "&outboundtest_from_address=" + fromAddress + "&outboundtest_to_address=" + toAddress; } else{ - var postDataString = 'mail_sendtype=SMTP&mail_smtpserver=' + smtpServer + "&mail_smtpport=" + mail_smtpport + "&mail_smtpssl=" + mail_smtpssl + "&outboundtest_from_address=" + fromAddress; + var postDataString = 'mail_sendtype=SMTP&mail_smtpserver=' + smtpServer + "&mail_smtpport=" + mail_smtpport + "&mail_smtpssl=" + mail_smtpssl + "&outboundtest_from_address=" + fromAddress + "&outboundtest_to_address=" + toAddress; } - YAHOO.util.Connect.asyncRequest("POST", "index.php?action=testOutboundEmail&module=EmailMan&to_pdf=true&sugar_body_only=true", callbackOutboundTest, postDataString); + YAHOO.util.Connect.asyncRequest("POST", "index.php?action=testOutboundEmail&mail_name=system&module=EmailMan&to_pdf=true&sugar_body_only=true", callbackOutboundTest, postDataString); } function testOutboundSettingsDialog() { // lazy load dialogue @@ -751,7 +750,7 @@ function testOutboundSettingsDialog() { EmailMan.testOutboundDialog.setHeader("{/literal}{$APP.LBL_EMAIL_TEST_OUTBOUND_SETTINGS}{literal}"); YAHOO.util.Dom.removeClass("testOutboundDialog", "yui-hidden"); } // end lazy load - + EmailMan.testOutboundDialog.render(); EmailMan.testOutboundDialog.show(); } // fn @@ -801,6 +800,15 @@ document.getElementById('email_link_type').onchange(); {literal} ", "scriptalert(1)/script", ""), + array("Test ", "Test test@test", ""), + ); + } + + /** + * @dataProvider getEmails + * @param string $addr + * @param string $name + * @param string $email + */ + + public function testSplitEmail($addr, $name, $email) + { + $parts = $this->emailaddress->splitEmailAddress($addr); + $this->assertEquals($name, $parts['name']); + $this->assertEquals($email, $parts['email']); + } } \ No newline at end of file diff --git a/tests/modules/Import/ImportFileTest.php b/tests/modules/Import/ImportFileTest.php index 1b672a12..fad62c44 100755 --- a/tests/modules/Import/ImportFileTest.php +++ b/tests/modules/Import/ImportFileTest.php @@ -67,6 +67,18 @@ class ImportFileTest extends Sugar_PHPUnit_Framework_TestCase $this->assertEquals(array("foo20","foo21"),$row); } + /** + * @ticket 41361 + */ + public function testGetNextRowWithEOL() + { + $file = SugarTestImportUtilities::createFileWithEOL(1, 1); + $importFile = new ImportFile($file,',','"'); + $row = $importFile->getNextRow(); + // both \r\n and \n should be properly replaced with PHP_EOL + $this->assertEquals(array("start0".PHP_EOL."0".PHP_EOL."end"), $row); + } + public function testLoadEmptyFile() { $emptyFile = $GLOBALS['sugar_config']['import_dir'].'/empty'.date("YmdHis").'.csv'; diff --git a/tests/modules/InboundEmail/Bug43554Test.php b/tests/modules/InboundEmail/Bug43554Test.php new file mode 100755 index 00000000..f6fef884 --- /dev/null +++ b/tests/modules/InboundEmail/Bug43554Test.php @@ -0,0 +1,49 @@ +_user = SugarTestUserUtilities::createAnonymousUser(); + $GLOBALS['current_user'] = $this->_user; + + $this->ie = new InboundEmail(); + } + + public function tearDown() + { + SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); + unset($GLOBALS['current_user']); + } + + public function getUrls() + { + return array( + array("http://localhost:8888/sugarent/index.php?composeLayoutId=composeLayout1&fromAccount=1&module=Emails&action=EmailUIAjax&emailUIAction=sendEmail&setEditor=1"), + array("http://localhost:8888/index.php?composeLayoutId=composeLayout1&fromAccount=1&module=Emails&action=EmailUIAjax&emailUIAction=sendEmail&setEditor=1"), + array(to_html("http://localhost:8888/index.php?composeLayoutId=composeLayout1&fromAccount=1&module=Emails&action=EmailUIAjax&emailUIAction=sendEmail&setEditor=1")), + array("/index.php?composeLayoutId=composeLayout1&fromAccount=1&module=Emails&action=EmailUIAjax&emailUIAction=sendEmail&setEditor=1"), + array("index.php?composeLayoutId=composeLayout1&fromAccount=1&module=Emails&action=EmailUIAjax&emailUIAction=sendEmail&setEditor=1"), + array("/?composeLayoutId=composeLayout1&fromAccount=1&module=Emails&action=EmailUIAjax&emailUIAction=sendEmail&setEditor=1"), + array("https://localhost/?composeLayoutId=composeLayout1&fromAccount=1&module=Emails&action=EmailUIAjax&emailUIAction=sendEmail&setEditor=1"), + ); + } + + /** + * @dataProvider getUrls + * @param string $url + */ + function testEmailCleanup($url) + { + $data = "Test: "; + $res = str_replace("", "", $this->ie->cleanContent($data)); + $this->assertNotContains("user = $GLOBALS['current_user'] = SugarTestUserUtilities::createAnonymousUser(); + + //create account + $this->account = new Account(); + $this->account->name = 'bug40209 account '.date('Y-m-d-H-i-s'); + $this->account->save(); + + //create contact + $this->contact = new Contact(); + $this->lead = SugarTestLeadUtilities::createLead(); + + } + + public function tearDown() + { + //delete records created from db + $GLOBALS['db']->query("DELETE FROM accounts WHERE id= '{$this->account->id}'"); + $GLOBALS['db']->query("DELETE FROM leads WHERE id= '{$this->lead->id}'"); + $GLOBALS['db']->query("DELETE FROM contacts WHERE id= '{$this->contact->id}'"); + SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); + + //unset values + unset($GLOBALS['current_user']); + unset($this->user); + unset($this->account); + unset($this->contact); + } + + + + //run test to make sure accounts related to leads record are copied over to contact recor during conversion (bug 40209) + public function testConvertAccountCopied(){ + //there will be output from display function, so call ob_start to trap it + ob_start(); + + //set the request parameters and convert the lead + $_REQUEST['module'] = 'Leads'; + $_REQUEST['action'] = 'ConvertLead'; + $_REQUEST['record'] = $this->lead->id; + $_REQUEST['handle'] = 'save'; + $_REQUEST['selectedAccount'] = $this->account->id; + + //require view and call display class so that convert functionality is called + require_once('modules/Leads/views/view.convertlead.php'); + $vc = new ViewConvertLead(); + $vc->display(); + + //retrieve the lead again to make sure we have the latest converted lead in memory + $this->lead->retrieve($this->lead->id); + + //retrieve the new contact id from the conversion + $contact_id = $this->lead->contact_id; + + //throw error if contact id was not retrieved and exit test + $this->assertTrue(!empty($contact_id), "contact id was not created during conversion process. An error has ocurred, aborting rest of test."); + if (empty($contact_id)){ + return; + } + + //make sure the new contact has the account related and that it matches the lead account + $this->contact->retrieve($contact_id); + $this->assertTrue($this->contact->account_id == $this->lead->account_id, "Account id from converted lead does not match the new contact account id, there was an error during conversion."); + $output = ob_get_clean(); + } +} \ No newline at end of file -- 2.42.0