From b3f5bd53aeef90618aad7f46402322a2918aad0d Mon Sep 17 00:00:00 2001 From: John Mertic Date: Wed, 31 Aug 2011 21:20:03 -0400 Subject: [PATCH] Release 6.3.0beta4 --- ModuleInstall/ModuleInstaller.php | 3 +- data/Relationships/M2MRelationship.php | 8 +- data/Relationships/One2MBeanRelationship.php | 4 +- files.md5 | 196 +++++++-------- include/MySugar/tpls/MySugar.tpl | 6 - include/Popups/PopupSmarty.php | 8 - include/Popups/tpls/PopupGeneric.tpl | 4 +- include/Popups/tpls/header.tpl | 2 - .../Fields/Collection/SugarFieldCollection.js | 3 +- include/SugarFields/Fields/Enum/EditView.tpl | 2 +- include/TimeDate.php | 8 +- include/database/SqlsrvManager.php | 2 +- include/images/poweredby_sugarcrm.png | Bin 4579 -> 4750 bytes include/javascript/calendar.js | 3 +- include/javascript/quicksearch.js | 2 +- include/javascript/sugar_3.js | 15 +- include/javascript/sugar_grp1.js | 62 +---- include/javascript/sugar_grp1_yui.js | 2 +- include/javascript/sugar_grp_emails.js | 9 +- include/javascript/sugar_grp_quickcomp.js | 7 +- include/modules.php | 13 + include/utils.php | 28 ++- include/utils/mvc_utils.php | 2 +- install.php | 3 +- install/checkDBSettings.php | 2 +- install/language/en_us.lang.php | 5 - jssource/JSGroupings.php | 1 - .../Fields/Collection/SugarFieldCollection.js | 6 + .../src_files/include/javascript/calendar.js | 2 + .../include/javascript/quicksearch.js | 7 +- .../src_files/include/javascript/sugar_3.js | 31 ++- .../modules/Studio/studiotabgroups.js | 2 +- modules/Accounts/Menu.php | 2 +- modules/Activities/Menu.php | 8 +- .../metadata/adminpaneldefs.php | 2 +- modules/Bugs/Menu.php | 2 +- modules/Calls/Menu.php | 2 +- modules/Cases/Menu.php | 2 +- .../rest/insideview/InsideViewLogicHook.php | 3 +- modules/Contacts/Menu.php | 2 +- modules/DynamicFields/DynamicField.php | 9 + .../templates/Fields/TemplateMultiEnum.php | 4 +- modules/Emails/javascript/EmailUICompose.js | 4 +- .../sources/ExternalSourceEAPMAdapter.php | 14 +- modules/Import/tpls/confirm.tpl | 12 +- modules/Import/tpls/dupcheck.tpl | 10 + modules/Import/tpls/last.tpl | 16 ++ modules/Import/tpls/step1.tpl | 6 + modules/Import/tpls/step2.tpl | 17 ++ modules/Import/tpls/step3.tpl | 12 + modules/Import/tpls/wizardWrapper.tpl | 29 ++- modules/Import/views/ImportView.php | 3 - modules/Import/views/view.confirm.php | 70 +----- modules/Import/views/view.dupcheck.php | 44 +--- modules/Import/views/view.last.php | 64 +---- modules/Import/views/view.step1.php | 43 +--- modules/Import/views/view.step2.php | 67 +---- modules/Import/views/view.step3.php | 53 +--- modules/Leads/Menu.php | 2 +- modules/Meetings/Meeting.php | 2 +- modules/Meetings/Menu.php | 2 +- .../ModuleBuilder/javascript/ModuleBuilder.js | 7 + .../ModuleBuilder/javascript/SimpleList.js | 7 +- modules/ModuleBuilder/javascript/studio2.js | 81 +++++- .../javascript/studio2FieldDD.js | 5 + .../ModuleBuilder/javascript/studio2ListDD.js | 6 +- .../javascript/studio2PanelDD.js | 40 +-- .../ModuleBuilder/javascript/studio2RowDD.js | 26 +- .../javascript/studiotabgroups.js | 2 +- .../ModuleBuilder/parsers/parser.dropdown.php | 11 +- .../ModuleBuilder/parsers/parser.label.php | 1 + modules/ModuleBuilder/tpls/LayoutEditor.css | 2 +- modules/ModuleBuilder/tpls/MBModule/Menu.tpl | 2 +- modules/ModuleBuilder/tpls/editProperty.tpl | 2 +- modules/ModuleBuilder/tpls/index.tpl | 4 +- modules/ModuleBuilder/tpls/listView.tpl | 6 + modules/ModuleBuilder/views/view.main.php | 2 +- .../ModuleBuilder/views/view.modulefield.php | 15 +- modules/Notes/Menu.php | 2 +- modules/Opportunities/Menu.php | 2 +- modules/Prospects/Menu.php | 2 +- modules/Studio/DropDowns/EditView.tpl | 6 +- modules/Studio/studiotabgroups.js | 2 +- modules/Studio/wizards/RenameModules.php | 237 +++++++++++++++--- modules/Tasks/Menu.php | 2 +- modules/Tasks/Task.php | 3 +- modules/UpgradeWizard/uw_utils.php | 7 +- modules/Users/GeneratePassword.php | 1 - modules/Users/Menu.php | 2 +- .../SAMLAuthenticate/settings.php | 2 +- modules/Users/tpls/wizard.tpl | 2 + service/core/SoapHelperWebService.php | 5 +- soap/SoapHelperFunctions.php | 7 +- sugar_version.php | 8 +- tests/ModuleInstall/ExtTest.php | 189 ++++++++++++++ tests/SugarTestHelper.php | 12 + tests/SugarTestImportUtilities.php | 11 +- tests/SugarTestMeetingUtilities.php | 18 +- tests/data/Bug39780Test.php | 10 +- tests/data/Bug40989Test.php | 10 +- tests/include/Bug33806.php | 92 +++++++ .../include/ListView/ListViewDisplayTest.php | 5 +- tests/include/MVC/SugarApplicationTest.php | 37 +-- .../Smarty/plugins/FunctionSugarLinkTest.php | 10 +- .../include/SugarFolders/SugarFoldersTest.php | 11 +- tests/include/TimeDateTest.php | 33 ++- .../generic/SugarWidgets/Bug44272Test.php | 14 +- tests/include/javascript/JSAlertsTest.php | 6 + tests/modules/Administration/Bug36978Test.php | 2 +- tests/modules/Home/Bug43653Test.php | 28 +-- tests/modules/Import/Bug45963Test.php | 64 +++++ tests/modules/Import/CsvAutoDetectTest.php | 107 ++++++++ .../Import/ImportDuplicateCheckTest.php | 4 +- .../Import/ImportFieldSanitizeTest.php | 2 +- tests/modules/Import/ImportFileLimitTest.php | 81 ++++++ .../modules/Import/ImportFileSplitterTest.php | 4 +- tests/modules/Import/ImportFileTest.php | 44 ++-- tests/modules/Import/ImportFormsTest.php | 3 +- tests/modules/Import/ImportMapTest.php | 2 +- tests/modules/Import/ImporterTest.php | 122 +++++++++ tests/modules/Leads/Bug40209Test.php | 23 +- tests/modules/Leads/ConvertLeadTests.php | 197 ++++++++++++++- .../ModuleBuilder/Module/StudioModuleTest.php | 2 + .../ModuleBuilder/parsers/Bug45645Test.php | 64 +++++ tests/modules/Notes/Bug40263Test.php | 14 +- tests/modules/ProspectLists/Bug36422Test.php | 6 +- tests/modules/SNIP/SampleEvent.ics | 29 +++ tests/modules/Studio/RenameModulesTest.php | 168 +++++++++++++ .../UpgradeCustomTemplateMetaTest.php | 50 ++-- .../Documents/metadata/editviewdefs.php | 4 +- .../modules/Calls/metadata/editviewdefs.php | 5 +- .../Documents/metadata/editviewdefs.php | 5 +- .../Documents/metadata/quickcreatedefs.php | 5 +- .../modules/Calls/metadata/editviewdefs.php | 9 +- tests/service/Bug31003Test.php | 4 +- tests/service/Bug41296Test.php | 95 +++++++ tests/service/OAuthTest.php | 209 +++++++++++++++ tests/service/RESTAPI3Test.php | 20 +- tests/service/RESTAPI4Test.php | 92 +++++++ tests/tests/SugarTestLangPackCreatorTest.php | 8 + themes/default/css/style.css | 3 + 141 files changed, 2590 insertions(+), 806 deletions(-) create mode 100755 tests/ModuleInstall/ExtTest.php create mode 100755 tests/include/Bug33806.php create mode 100755 tests/modules/Import/Bug45963Test.php create mode 100755 tests/modules/Import/CsvAutoDetectTest.php create mode 100755 tests/modules/Import/ImportFileLimitTest.php create mode 100755 tests/modules/Import/ImporterTest.php create mode 100755 tests/modules/ModuleBuilder/parsers/Bug45645Test.php create mode 100755 tests/modules/SNIP/SampleEvent.ics create mode 100755 tests/modules/Studio/RenameModulesTest.php create mode 100755 tests/service/Bug41296Test.php create mode 100755 tests/service/OAuthTest.php diff --git a/ModuleInstall/ModuleInstaller.php b/ModuleInstall/ModuleInstaller.php index 9c4ec7e2..21bb062e 100644 --- a/ModuleInstall/ModuleInstaller.php +++ b/ModuleInstall/ModuleInstaller.php @@ -1574,6 +1574,7 @@ class ModuleInstaller{ $this->tab_modules[] = $module; }else{ $str .= "\$modules_exempt_from_availability_check['$module'] = '$module';\n"; + $str .= "\$report_include_modules['$module'] = '$module';\n"; $str .= "\$modInvisList[] = '$module';\n"; } $this->installed_modules[] = $module; @@ -1607,7 +1608,7 @@ class ModuleInstaller{ if(is_subclass_of($mod, 'SugarBean') && $mod->disable_vardefs == false ){ $GLOBALS['log']->debug( "Creating Tables Bean : $bean"); $mod->create_tables(); - SugarBean::createRelationshipMeta($mod->getObjectName(), $mod->db,$mod->table_name,'',$mod->module_dir); + SugarBean::createRelationshipMeta($mod->getObjectName(), $mod->db,$mod->table_name,'',$mod->module_dir); } }else{ $GLOBALS['log']->debug( "File Does Not Exist:" . $beanFiles[$class] ); diff --git a/data/Relationships/M2MRelationship.php b/data/Relationships/M2MRelationship.php index 5c8a8931..fd81974a 100644 --- a/data/Relationships/M2MRelationship.php +++ b/data/Relationships/M2MRelationship.php @@ -320,8 +320,8 @@ class M2MRelationship extends SugarRelationship { $join1 = "($startingTable.$startingKey=$joinTable.{$this->def['join_key_rhs']} OR $startingTable.$startingKey=$joinTable.{$this->def['join_key_rhs']})"; $join2 = "($targetTable.$targetKey=$joinTable.{$this->def['join_key_rhs']} OR $targetTable.$targetKey=$joinTable.{$this->def['join_key_rhs']})"; - $where = "($startingTable.$startingKey=$joinTable.{$this->def['join_key_rhs']} AND $joinTable.{$this->def['join_key_lhs']}='{$link->getFocus()->$targetKey}') OR " - . "($startingTable.$startingKey=$joinTable.{$this->def['join_key_lhs']} AND $joinTable.{$this->def['join_key_rhs']}='{$link->getFocus()->$targetKey}')"; + $where = "(($startingTable.$startingKey=$joinTable.{$this->def['join_key_rhs']} AND $joinTable.{$this->def['join_key_lhs']}='{$link->getFocus()->$targetKey}') OR " + . "($startingTable.$startingKey=$joinTable.{$this->def['join_key_lhs']} AND $joinTable.{$this->def['join_key_rhs']}='{$link->getFocus()->$targetKey}'))"; } @@ -380,8 +380,8 @@ class M2MRelationship extends SugarRelationship } else { - $where = "($startingTable.$startingKey=$joinTable.{$this->def['join_key_rhs']} AND $joinTable.{$this->def['join_key_lhs']}='{$link->getFocus()->$targetKey}') OR " - . "($startingTable.$startingKey=$joinTable.{$this->def['join_key_lhs']} AND $joinTable.{$this->def['join_key_rhs']}='{$link->getFocus()->$targetKey}')"; + $where = "(($startingTable.$startingKey=$joinTable.{$this->def['join_key_rhs']} AND $joinTable.{$this->def['join_key_lhs']}='{$link->getFocus()->$targetKey}') OR " + . "($startingTable.$startingKey=$joinTable.{$this->def['join_key_lhs']} AND $joinTable.{$this->def['join_key_rhs']}='{$link->getFocus()->$targetKey}'))"; } //First join the relationship table diff --git a/data/Relationships/One2MBeanRelationship.php b/data/Relationships/One2MBeanRelationship.php index dc989b6b..3f664ca5 100644 --- a/data/Relationships/One2MBeanRelationship.php +++ b/data/Relationships/One2MBeanRelationship.php @@ -127,8 +127,10 @@ class One2MBeanRelationship extends One2MRelationship $rhs->$rhsID = ''; if ($save) + { + $rhs->in_relationship_update = TRUE; $rhs->save(); - + } $rhsID = $this->def['rhs_key']; $rhs->$rhsID = ''; diff --git a/files.md5 b/files.md5 index c7836b03..dee89ec2 100644 --- a/files.md5 +++ b/files.md5 @@ -1,5 +1,5 @@ 'd3f150e4a5bed444763ebe8a81742a95', './.htaccess' => 'd41d8cd98f00b204e9800998ecf8427e', @@ -585,7 +585,7 @@ $md5_string = array ( './themes/default/images/ActivitiesReports.gif' => 'ad890a0190fedffa6bcb73557060fa9b', './themes/default/images/Accounts.gif' => 'e081de07d0263b270d0d306642375901', './themes/default/css/wizard.css' => '6cc4a0f407dc82309cc78f6b138c6d21', - './themes/default/css/style.css' => 'd41d8cd98f00b204e9800998ecf8427e', + './themes/default/css/style.css' => '47a12cae4fc92e9991341df7da4b4366', './themes/default/css/print.css' => '166d6dff04138c56325ff31e7eeecab0', './themes/default/css/deprecated.css' => '872d2ee2f45eb595825646cb39a82fab', './themes/default/css/chart.css' => '493edb0e181f685fd595c483d09012fb', @@ -1170,14 +1170,14 @@ $md5_string = array ( './themes/Sugar5/css/print.css' => '041ba7c460d78a693301c7061139af89', './themes/Sugar5/css/deprecated.css' => '872d2ee2f45eb595825646cb39a82fab', './themes/Sugar5/css/chart.css' => '493edb0e181f685fd595c483d09012fb', - './sugar_version.php' => 'f938e440aa764a1b8550cadbd1249c2a', + './sugar_version.php' => '343a589d7a71c105f6a52400a1523680', './soap/SoapTypes.php' => 'f38a0ac79874c8a3e126d728bd05e00a', './soap/SoapSugarUsers.php' => 'aec5ba181325721fa9e6da7e6a787687', './soap/SoapStudio.php' => '2f424bab502055acae4131df64465e0c', './soap/SoapRelationshipHelper.php' => '4d84e017ea0ebe080809c9099ab5ec30', './soap/SoapPortalUsers.php' => 'e333fe9ad228db47711d1f506b69f079', './soap/SoapPortalHelper.php' => '75ee76c6f6663e49b5c9a029412f7bed', - './soap/SoapHelperFunctions.php' => '9b2c76bdac36b6bf2224e94a146fec41', + './soap/SoapHelperFunctions.php' => '08513a10e12d78fe4b1333f26c56462d', './soap/SoapErrorDefinitions.php' => '33fda5814773de4025739ab9024f063a', './soap/SoapError.php' => 'b2759317cb609e41ffca9da3274b8142', './soap/SoapDeprecated.php' => '20cfa68a1138e39de3a3c210df7909eb', @@ -1218,7 +1218,7 @@ $md5_string = array ( './service/core/SugarRestUtils.php' => 'ddebba71abb25182a7769061862797ae', './service/core/SugarRestServiceImpl.php' => '18ab35c13544baa4fe716711cc541f62', './service/core/SugarRestService.php' => '5fc2c42a483676e6afc251174485f0c2', - './service/core/SoapHelperWebService.php' => 'd735be6dc909b093926a5fbdb1f90b8a', + './service/core/SoapHelperWebService.php' => 'e2028299b03197f866241071e0581af0', './service/core/REST/SugarRestSerialize.php' => 'f80614ee5bc7e2f4a23460bbcc8c3eb8', './service/core/REST/SugarRestRSS.php' => 'eabfddaa4a65c3643f65ecab9f23c4bd', './service/core/REST/SugarRestJSON.php' => 'b3750c1987e8071bb3ad8296d9b4d5fa', @@ -1293,7 +1293,7 @@ $md5_string = array ( './modules/Users/views/view.wizard.php' => 'ebca3034f84c4d68394299775506ed2c', './modules/Users/views/view.list.php' => 'baadbcbf2f349a8c39b8976a323e7f03', './modules/Users/vardefs.php' => 'a45b56f0c47d7eab3b51d6cd49cc37bd', - './modules/Users/tpls/wizard.tpl' => 'b0ec5570ed453baaa555e47d86f001e2', + './modules/Users/tpls/wizard.tpl' => '2355eecb4948f55f59ea06a4824d07b5', './modules/Users/reassignUserRecords.php' => '454d3c28f332ccdcdf25d563f4f7b9ca', './modules/Users/password_utils.php' => '614d9ea87a83d7c210bbfe585908b870', './modules/Users/metadata/subpanels/default.php' => '8ccd5a2436c48f152588bd59e6c6bcb0', @@ -1316,7 +1316,7 @@ $md5_string = array ( './modules/Users/controller.php' => '80b928a09b15d4c9df8904317880974f', './modules/Users/authentication/SugarAuthenticate/SugarAuthenticateUser.php' => '406f625eb707435e7710880c7aec779e', './modules/Users/authentication/SugarAuthenticate/SugarAuthenticate.php' => '8cdea5361fff4c312147d2d8334e2f4a', - './modules/Users/authentication/SAMLAuthenticate/settings.php' => '59100a0b5557c457b5b317014090086b', + './modules/Users/authentication/SAMLAuthenticate/settings.php' => 'aac61ea76cd0f3d13cdfcfc5e83d18b1', './modules/Users/authentication/SAMLAuthenticate/lib/xmlseclibs/xmlseclibs.php' => '76623791faf895bcbbd016d9945e8c48', './modules/Users/authentication/SAMLAuthenticate/lib/xmlseclibs/CHANGELOG.txt' => '113d14ef4333039359236ffed624fb85', './modules/Users/authentication/SAMLAuthenticate/lib/onelogin/saml/xmlsec.php' => '0804d079f7dd5b88a810d3b2f13b54a1', @@ -1346,11 +1346,11 @@ $md5_string = array ( './modules/Users/PopupUsers.php' => '5da32a565d9639eb42ab47e2d3330c08', './modules/Users/PopupSignature.php' => 'd9c4749eea3254af4bbef1d83736309c', './modules/Users/PasswordRequirementBox.css' => '57efa45544952eead6155719254e03c1', - './modules/Users/Menu.php' => 'eb9182f1f47e0a987df812c625173f9c', + './modules/Users/Menu.php' => '6e9d3948eb98bae4194a0a6544834165', './modules/Users/Logout.php' => '5c819754b90e62e2f1739971144b01a6', './modules/Users/Login.php' => '18a89cfecf8e050a14f2586b05081548', './modules/Users/ListRoles.php' => '9833b76bd6bd4889285b4b4a6b933849', - './modules/Users/GeneratePassword.php' => 'c4cb127355f481546965b868e2b3b003', + './modules/Users/GeneratePassword.php' => 'cd550ab172dc3dcbb715221ec97469a0', './modules/Users/Forms.php' => '90b591c94157299485166b686f6a977d', './modules/Users/Error.php' => '62f9d5788e4663b84e030c4eaba3e8b3', './modules/Users/EditView.tpl' => '3f17c8379f1dedbd64b32e481cd56b9f', @@ -1370,7 +1370,7 @@ $md5_string = array ( './modules/UpgradeWizard/upgradeWizard.js' => '3ca941da793c30a8a4e913624071166e', './modules/UpgradeWizard/UpgradeRemoval.php' => 'f8f4d6102a0cdc17d48444372a6ed2d8', './modules/UpgradeWizard/uw_main.tpl' => '898039c49451aefbef0bfdece6c43f3b', - './modules/UpgradeWizard/uw_utils.php' => '4e90b9aa3355cbf4866e63a22095dba1', + './modules/UpgradeWizard/uw_utils.php' => 'b9a168d289d529941ca35fb8399194fe', './modules/UpgradeWizard/uw_emptyFunctions.php' => 'fc09ce5db1b1aacd792140ceadc9ccd2', './modules/UpgradeWizard/uw_files.php' => '0b16b9d7181ac363d19aa43b8c50090b', './modules/UpgradeWizard/upload.php' => 'dcc4f893338f9ad97e236b7b39bd28cc', @@ -1443,11 +1443,11 @@ $md5_string = array ( './modules/Tasks/language/en_us.lang.php' => '6f700ddefbbb7c5bcebcded361238e0b', './modules/Tasks/field_arrays.php' => '9869facdbe32bc0551b9ec7429671848', './modules/Tasks/TasksQuickCreate.php' => '8df028b5cde8de961c6d94574f3c860e', - './modules/Tasks/Task.php' => 'ac39df8ffab83e9de5b43a9f14e18b4a', + './modules/Tasks/Task.php' => 'e86984cf2af09480e9111bdb1e62351a', './modules/Tasks/Save.php' => '87926f8aefc476572a32c4af581298af', './modules/Tasks/MyTasks.php' => 'b8da620a87eee61e0b6b50421eb9590b', './modules/Tasks/MyTasks.html' => '58c3695222bf9a745f2b2f4f5d52ae90', - './modules/Tasks/Menu.php' => 'd7970d42d2d7c7a2ca5ed84df05e8a91', + './modules/Tasks/Menu.php' => '3060a3ed23131a88e1fb628e1797e901', './modules/Tasks/Dashlets/MyTasksDashlet/MyTasksDashlet.php' => '03df49cfe18a8bedb7e751204ac1f33c', './modules/Tasks/Dashlets/MyTasksDashlet/MyTasksDashlet.meta.php' => 'aee8b2e51d869bdc6e9ec4bded092817', './modules/Tasks/Dashlets/MyTasksDashlet/MyTasksDashlet.data.php' => '584b9d697e36804740c9c51806bac305', @@ -1483,10 +1483,10 @@ $md5_string = array ( './modules/Studio/JSTransaction.js' => 'ddc1671e785fd003c42414b14b8a746e', './modules/Studio/studio.js' => '6f9c6e0614b8331727c96a41bda6c29b', './modules/Studio/studiodd.js' => '6122b82ee5480cb0c105ae13ed2d2b3e', - './modules/Studio/studiotabgroups.js' => '0da7c6f629d020446fda406a48155b90', + './modules/Studio/studiotabgroups.js' => '0914ad3b4384826e6a49bf231b2e4495', './modules/Studio/ygDDListStudio.js' => '2d3316c51f34ee87cc887b41e6d3539f', './modules/Studio/wizards/RenameModules.tpl' => '86d6ed59baae599792ab4765b6d18655', - './modules/Studio/wizards/RenameModules.php' => 'ba1e65d0e6c53053f420e5ea4bb0c651', + './modules/Studio/wizards/RenameModules.php' => '96325e0e8a7b6ddad819fc548a9914a8', './modules/Studio/wizards/StudioWizard.php' => '4309aae3b3614cf7cf2d160d52c3944f', './modules/Studio/wizards/EditDropDownWizard.php' => '47997b18f2d0eed6613e4e8ee3bec245', './modules/Studio/wizard.php' => '1eb1fe073c5a846796636d94ce0a246c', @@ -1500,7 +1500,7 @@ $md5_string = array ( './modules/Studio/TabGroups.php' => '028fd651b7e45ce986fb653eeff5cd88', './modules/Studio/SaveTabs.php' => 'f70c1415779c3d9745151aedb3b63c72', './modules/Studio/Forms.php' => '643a41668f378fdfcf340eacff957880', - './modules/Studio/DropDowns/EditView.tpl' => '493d98da287b2b8343cb92e0c5d6ba1b', + './modules/Studio/DropDowns/EditView.tpl' => 'ddcdaab3f4908ef226f9fb914b06536d', './modules/Studio/DropDowns/EditView.php' => 'cfa36bf9fb56414ee9706fe4be586ce2', './modules/Studio/DropDowns/DropDownHelper.php' => 'af220484b3ddf0e8236a764e2237d0bc', './modules/SchedulersJobs/vardefs.php' => '23f57bde247519a289ce85fbb6a0d917', @@ -1606,7 +1606,7 @@ $md5_string = array ( './modules/Prospects/ProspectFormBase.php' => '72b52d25d6cec57f62aeb5b22a2f1d11', './modules/Prospects/Prospect.php' => '82e124f5609d2e95675b5e7abcbd3d93', './modules/Prospects/Popup_picker.html' => '95a7cb67f4ab07776998dfa256006f63', - './modules/Prospects/Menu.php' => 'fb14dec8b59f305d5e5a88fd17709a57', + './modules/Prospects/Menu.php' => '7b9014e6b0c640f4f844e9547d9e91e1', './modules/Prospects/Import.php' => '41811673320c34629e81991794d41215', './modules/Prospects/Delete.php' => '73e1368420f1c644eb309e81c24bc17d', './modules/ProspectLists/vardefs.php' => 'f7741a3c29481cbfaa666a6c9381b6fc', @@ -1731,7 +1731,7 @@ $md5_string = array ( './modules/Opportunities/OpportunityFormBase.php' => '7f81a326c17dd3a34e83577d6fe33ae1', './modules/Opportunities/Opportunity.php' => 'cb982375e35f4baa0d9461f200c2d587', './modules/Opportunities/OpportunitiesQuickCreate.php' => '25dcf755055937cba784ca069ea5de13', - './modules/Opportunities/Menu.php' => 'e259ae7025c2ca8100f63b3a916c7374', + './modules/Opportunities/Menu.php' => '14e601ef555d917fc7d2ac5cc88ab4ca', './modules/Opportunities/ListViewTop.php' => '4562f0c199e8ad381c30f0609ba7c5c0', './modules/Opportunities/ListViewTop.html' => 'aa3f031d26f868a40a51743e9a079f27', './modules/Opportunities/Dashlets/MyOpportunitiesDashlet/MyOpportunitiesDashlet.php' => 'b05d4a498a721e356b4b2f8d4eb503bf', @@ -1768,7 +1768,7 @@ $md5_string = array ( './modules/Notes/NotesQuickCreate.php' => '07542708b10fe2eefafeaf2956ff58aa', './modules/Notes/NoteSoap.php' => 'f6dcc32555dcd7fd515b6624667a3702', './modules/Notes/Note.php' => 'ab0bebee88bdb4436cc3617c41a4e8e2', - './modules/Notes/Menu.php' => '8fa291909749533dc410c42590275df1', + './modules/Notes/Menu.php' => '9048d5be4a279901fb6e7b6120b58af9', './modules/MySettings/language/en_us.lang.php' => '562f4a6065b8ae50ee724823f5738043', './modules/MySettings/TabController.php' => 'addcc612e2526020690c888df738dd5d', './modules/MySettings/StoreQuery.php' => '705d71936244a25ea8343d71883fda0b', @@ -1784,9 +1784,9 @@ $md5_string = array ( './modules/ModuleBuilder/views/view.package.php' => '94886f989c71b501e16733aa6f635ab7', './modules/ModuleBuilder/views/view.modulelabels.php' => '946ac2cafcfcac5d20265ffab8f0805a', './modules/ModuleBuilder/views/view.modulefields.php' => '13771ba7d654c9e7ad9c38e85235a562', - './modules/ModuleBuilder/views/view.modulefield.php' => '6849d83c2f8a07a30c6bc2f6a79aefcf', + './modules/ModuleBuilder/views/view.modulefield.php' => '7b5961de975c17b6bb296660a490f47e', './modules/ModuleBuilder/views/view.module.php' => 'e87f77f4bb936006ad94103cd0f1c453', - './modules/ModuleBuilder/views/view.main.php' => '88123a5ca806fadac53f609b09959e25', + './modules/ModuleBuilder/views/view.main.php' => '4dc14264211be02eed4a77b0f226fb9e', './modules/ModuleBuilder/views/view.listview.php' => 'dc91490cc2381300c65ec6cc6f45e2b6', './modules/ModuleBuilder/views/view.layoutview.php' => '8924b7ed186d75872c6cf061bc5e2fe1', './modules/ModuleBuilder/views/view.labels.php' => 'e528ce648ca02258f6aa71be1e3f1337', @@ -1806,14 +1806,14 @@ $md5_string = array ( './modules/ModuleBuilder/tpls/studioRelationship.tpl' => 'fae1108003263300d4442ee5c8b30ef6', './modules/ModuleBuilder/tpls/resetModule.tpl' => '61597ccd042c1e6ff988fc904e6519ed', './modules/ModuleBuilder/tpls/main.tpl' => '8862d14b4c6989a99013640a9a1f4c02', - './modules/ModuleBuilder/tpls/listView.tpl' => '7ca848e3ae581e3c293883dbec267751', + './modules/ModuleBuilder/tpls/listView.tpl' => '8c8d71e7bfdf1009b443bd2b1a2d4d63', './modules/ModuleBuilder/tpls/layoutView.tpl' => '7f4500a6dcc10110b1d79dca9255ca1b', './modules/ModuleBuilder/tpls/labels.tpl' => '61817dbfb8f5e2f55b1d1f32d0fd1e4f', - './modules/ModuleBuilder/tpls/index.tpl' => '74b88786aaa5254e0ef3ef98ec2a727d', + './modules/ModuleBuilder/tpls/index.tpl' => 'f8702ebe45250bb9e72e534e63294b07', './modules/ModuleBuilder/tpls/includes.tpl' => '308f7703d505391d03d58b592c919152', './modules/ModuleBuilder/tpls/history.tpl' => '39442d3ac52f747e0b6773e7e6dc72f3', './modules/ModuleBuilder/tpls/exportcustomizations.tpl' => '2dde77f71b619c7843dfdc4170f93c91', - './modules/ModuleBuilder/tpls/editProperty.tpl' => 'aea87bad9704c38ea60c582de3ce2dd3', + './modules/ModuleBuilder/tpls/editProperty.tpl' => 'af1bbf8eadaecd07967e0e3814d6138d', './modules/ModuleBuilder/tpls/assistantJavascript.tpl' => '62a402e5a5b27917742ab3ad4145a5f8', './modules/ModuleBuilder/tpls/Preview/listView.tpl' => '3add2c0f2cc966e8dc0f1df4db386915', './modules/ModuleBuilder/tpls/Preview/layoutView.tpl' => '9090119ad46afd4059eb6651c72bd1c6', @@ -1831,12 +1831,12 @@ $md5_string = array ( './modules/ModuleBuilder/tpls/MBModule/dropdown.tpl' => 'ab700d554f3cc79ad5a70365f4ec26bb', './modules/ModuleBuilder/tpls/MBModule/dropdown.css' => '81912532da99fd1480fd72e7326bef6a', './modules/ModuleBuilder/tpls/MBModule/Studio.tpl' => '443a93ba34b0eaa946d342e618c9e6e7', - './modules/ModuleBuilder/tpls/MBModule/Menu.tpl' => '61e1911357def76e9f29b2b1b11ac6d0', + './modules/ModuleBuilder/tpls/MBModule/Menu.tpl' => 'fd135ae7421be28ee6bc26501605c331', './modules/ModuleBuilder/tpls/MBModule/DeveloperClass.tpl' => 'ed1e172230ac4a0f89fc4046fd39fa06', './modules/ModuleBuilder/tpls/MBModule/Class.tpl' => '8c8f94e1ca2d39dcc903d4c7c566a4bb', './modules/ModuleBuilder/tpls/MB.css' => '1c5449cdd8167137f9b0bcde4f595822', './modules/ModuleBuilder/tpls/ListEditor.css' => 'b60cccd225a86e6b7b48aa3d547b58dc', - './modules/ModuleBuilder/tpls/LayoutEditor.css' => 'e732c3d8df29cc2833514ed5db878684', + './modules/ModuleBuilder/tpls/LayoutEditor.css' => 'ef1c9fed0b1d1146247dac2916a3f771', './modules/ModuleBuilder/parsers/views/UndeployedSubpanelImplementation.php' => 'c1f61c27c48ed83a04231cacf2cbadfd', './modules/ModuleBuilder/parsers/views/UndeployedMetaDataImplementation.php' => '87c39c5818423ac119f20c9f44b11de8', './modules/ModuleBuilder/parsers/views/SubpanelMetaDataParser.php' => '5306a647fd32a766d36bd6cf634c063f', @@ -1867,22 +1867,22 @@ $md5_string = array ( './modules/ModuleBuilder/parsers/parser.modifysubpanel.php' => 'b26c368fe0ded3b67f1d83f33795454b', './modules/ModuleBuilder/parsers/parser.modifylistview.php' => '313ad7db0d401aac07bf5428975a6e65', './modules/ModuleBuilder/parsers/parser.modifylayoutview.php' => 'd5383c342e65fcde7a628c339d0d6502', - './modules/ModuleBuilder/parsers/parser.label.php' => '9985c9d1016f9d16e1cb1a3b81b3ccc4', - './modules/ModuleBuilder/parsers/parser.dropdown.php' => '6294fd147a2127ec3bc1bfa867f85302', + './modules/ModuleBuilder/parsers/parser.label.php' => 'dad85a204ca813eb4de0836e190ca62e', + './modules/ModuleBuilder/parsers/parser.dropdown.php' => '2c15e411a528ae234414bc49f70d5277', './modules/ModuleBuilder/parsers/constants.php' => '0d876db28d336cabe3c44a06b8a8f780', './modules/ModuleBuilder/parsers/StandardField.php' => 'de8b8168336744386faa4fcd8eb3a8fa', './modules/ModuleBuilder/parsers/ParserFactory.php' => 'f0fad2af770157777e4088e174233de0', './modules/ModuleBuilder/parsers/ModuleBuilderParser.php' => 'ddd1051f921589202f29110c732e60c9', './modules/ModuleBuilder/language/en_us.lang.php' => 'e82eeb9e95aba26e9c0d6df7cc990edc', './modules/ModuleBuilder/javascript/wizardTemplate.js' => 'df71a4a5eaf77a126a7eaef07287c511', - './modules/ModuleBuilder/javascript/studiotabgroups.js' => 'ae5991387773fd603c35516c6cb34a57', - './modules/ModuleBuilder/javascript/studio2RowDD.js' => 'e29e6fc44695cbd29d8d88eef513f6f1', - './modules/ModuleBuilder/javascript/studio2PanelDD.js' => '4fda42cbfe44390b3a9f646fce1604ad', - './modules/ModuleBuilder/javascript/studio2ListDD.js' => '36cb4715391ded751fd2f30ab41b76e5', - './modules/ModuleBuilder/javascript/studio2FieldDD.js' => 'd776d412e631abf40c5b9227989669a7', - './modules/ModuleBuilder/javascript/studio2.js' => 'a3d19505c924a863ab7656b50d9bb466', - './modules/ModuleBuilder/javascript/SimpleList.js' => 'e76da07ce7414a220f4bd3a1768d7752', - './modules/ModuleBuilder/javascript/ModuleBuilder.js' => '2edabc112129c6a57b8f2a550ab847c5', + './modules/ModuleBuilder/javascript/studiotabgroups.js' => 'ea1fb38daeb99b01ba07c9904e2b4f2c', + './modules/ModuleBuilder/javascript/studio2RowDD.js' => 'e72f8ac51ff0f4c5896a13cb04714871', + './modules/ModuleBuilder/javascript/studio2PanelDD.js' => 'a8d42da9d4a542f0a6499f74a822a63a', + './modules/ModuleBuilder/javascript/studio2ListDD.js' => '64b2484158a737a736096da06d12946d', + './modules/ModuleBuilder/javascript/studio2FieldDD.js' => '9aefd0fb1b42a3f1c42eff166bf0020b', + './modules/ModuleBuilder/javascript/studio2.js' => '6e80e268f2d2186c2c7ff015c28d7cf8', + './modules/ModuleBuilder/javascript/SimpleList.js' => '2ad0e64a2f93f73583edc63092a6ed6a', + './modules/ModuleBuilder/javascript/ModuleBuilder.js' => '67073655d7641ee0b829468f5ad6280e', './modules/ModuleBuilder/javascript/JSTransaction.js' => '2f20a4a72eaa8cbdf3053e24c5772ee5', './modules/ModuleBuilder/controller.php' => 'c8685c8f6c68cc47a7652523ae2e76e9', './modules/ModuleBuilder/action_view_map.php' => 'fd1e0b87f5d325f06b2b743afa057999', @@ -1948,10 +1948,10 @@ $md5_string = array ( './modules/Meetings/SubPanelViewInvitees.php' => 'eb9e848e7686ab8ef26c07fee3c8a269', './modules/Meetings/SubPanelViewInvitees.html' => 'f3f1c069759034d89adefd17350a31ed', './modules/Meetings/Save.php' => '5e6ee92cd4d33c083492e54940b58264', - './modules/Meetings/Menu.php' => '72a8dbdfd55f668cc86389fcac2894e2', + './modules/Meetings/Menu.php' => '0d870e1dff0f49a2a84f4b65d50bbc89', './modules/Meetings/MeetingsQuickCreate.php' => '818e55e261c5e74cb385f835311944fa', './modules/Meetings/MeetingFormBase.php' => '3d15b0c970848917b794542f6b460aa6', - './modules/Meetings/Meeting.php' => 'bec7b7228a760b91933d4ffc5e4df16d', + './modules/Meetings/Meeting.php' => 'bef7ab954e9880ba77e9ce5350454758', './modules/Meetings/Dashlets/MyMeetingsDashlet/MyMeetingsDashlet.php' => '69a1851fcaf2526a9e4027ddef29bf6a', './modules/Meetings/Dashlets/MyMeetingsDashlet/MyMeetingsDashlet.meta.php' => 'e47f5ffe63b5a0fa7d7de49e41602428', './modules/Meetings/Dashlets/MyMeetingsDashlet/MyMeetingsDashlet.data.php' => 'da144e46c3f9a91f6bf149ebdf644e94', @@ -2011,7 +2011,7 @@ $md5_string = array ( './modules/Leads/Popup_picker.html' => '5d8aea39ecdb32f2feb627da18c6d1af', './modules/Leads/MyLeads.php' => '69dbcc67a3b97979bf63a7897db3d74e', './modules/Leads/MyLeads.html' => '4405e61344262cb85243c148d748a465', - './modules/Leads/Menu.php' => 'e0579ef468b7b817e35f998308f79c91', + './modules/Leads/Menu.php' => '80008b8d1fbe777e77848179b9b3dea0', './modules/Leads/LeadsQuickCreate.php' => '2483d2f18680dba279b25a833f720758', './modules/Leads/LeadFormBase.php' => 'cfe9c53f698795fe2292db848f5e4c96', './modules/Leads/Lead.php' => '23d65676c6363f07092a9ba59c6f06ea', @@ -2048,35 +2048,35 @@ $md5_string = array ( './modules/InboundEmail/DetailView.html' => '065eb0891ad5444b24a6b9d38740b8eb', './modules/InboundEmail/Delete.php' => '682ed772ec388482dbe7a599e9e56104', './modules/Import/views/view.extdupcheck.php' => 'ef219a2512d7a56af80c76eec96e20fa', - './modules/Import/views/view.dupcheck.php' => '770c5b1f2b16090ac0041534cbae7c18', - './modules/Import/views/view.confirm.php' => 'dbfd5931087c530c9887b210e7a1e053', - './modules/Import/views/ImportView.php' => '42e89c8aa4f9f350373e15c645ed0cbf', + './modules/Import/views/view.dupcheck.php' => '5fa4c8d17dfd4e93938b86710538e158', + './modules/Import/views/view.confirm.php' => 'e69d7182b65a85243517e2d26e0830e1', + './modules/Import/views/ImportView.php' => '7e92da5cb2b4650fa5c930c430b81ab8', './modules/Import/views/ImportListView.php' => 'a32043e7ebcfbc532c975e878a869ab8', './modules/Import/views/view.undo.php' => '8facf1f560dd2266312313f869d923bf', './modules/Import/views/view.step4.php' => 'b2122f1b864b581d5fe48e0da0ccc8a4', - './modules/Import/views/view.step3.php' => 'ce3b269c11dbaa5f950ab7c4dc99d04a', - './modules/Import/views/view.step2.php' => 'dc12f6b90baafd0c9c3ecd4b04903224', - './modules/Import/views/view.step1.php' => '78b0739118e08d4888eb0256dd8a9f99', - './modules/Import/views/view.last.php' => 'a35fdddead8456fd3bada4544d5388ff', + './modules/Import/views/view.step3.php' => 'd6377006753d58cadf2523c12ce9b645', + './modules/Import/views/view.step2.php' => '4412435bc97fe7a7373927248237e18b', + './modules/Import/views/view.step1.php' => '988e5aaa9fba84d7bfc377888e89e237', + './modules/Import/views/view.last.php' => '213cd3cf58ebbdec3191bfc8a11a2b52', './modules/Import/views/view.error.php' => '4a9ef123c90511298bac72b55405f2f1', './modules/Import/vardefs.php' => 'f091139c8e775f0208605ed6a832463b', - './modules/Import/tpls/wizardWrapper.tpl' => '9f5877b8f4eb7ee8de16085df38413a8', + './modules/Import/tpls/wizardWrapper.tpl' => '3f3ec18b1119c0a7b97de1da039f05eb', './modules/Import/tpls/listviewpaginator.tpl' => '25bfd42725efe26095baeab56c8b6602', './modules/Import/tpls/listview.tpl' => 'cebe4901ea1347fe9bddb2ff06a575a6', - './modules/Import/tpls/dupcheck.tpl' => '6944d7fd6dc96b1a6b776244fc211456', + './modules/Import/tpls/dupcheck.tpl' => '1d119256d0e06064ae4cee07ec13a432', './modules/Import/tpls/confirm_table.tpl' => '6012db9ad8184206fba3840a43018f41', - './modules/Import/tpls/confirm.tpl' => '1c7182677f8c11fd5c6aa7840e87ad25', + './modules/Import/tpls/confirm.tpl' => 'b1da3cef2b4eeada784579e0cd54e9fe', './modules/Import/tpls/undo.tpl' => '6b90b8827915bb8992713b537e958ff1', - './modules/Import/tpls/step3.tpl' => '84694a52c6b6cceda704c41c968c48bd', - './modules/Import/tpls/step2.tpl' => 'f678e3bd1031d669631ce007b0def249', - './modules/Import/tpls/step1.tpl' => '4d1d20af1c463f76678e4ebc77144bfa', - './modules/Import/tpls/last.tpl' => '19c8546be6088c8faf831cf5f0991a12', + './modules/Import/tpls/step3.tpl' => 'e6ac3444b8ea69b0c774678e251fb8d4', + './modules/Import/tpls/step2.tpl' => '9c47dfa9b5109535e2577542427812f6', + './modules/Import/tpls/step1.tpl' => 'e85679c51c730c67f11f47d6cf81792b', + './modules/Import/tpls/last.tpl' => '519fee4941a46ba99a999965678bb4e6', './modules/Import/tpls/error.tpl' => 'f9f628179eff6935668cac662c15bce1', './modules/Import/language/en_us.lang.php' => '3102c52369d6fd97b4f7b949cfecbdd8', './modules/Import/Menu.php' => '923e16d2066f8577f847d2db148cd7ab', './modules/Import/sources/ImportFile.php' => '6e156a8b4650e22f2987f70a5eab9880', './modules/Import/sources/ImportDataSource.php' => 'bee00883801c9b876a14b6ea82e39199', - './modules/Import/sources/ExternalSourceEAPMAdapter.php' => '7b85d4bc49d9e0cc295202a03a789115', + './modules/Import/sources/ExternalSourceEAPMAdapter.php' => 'f0f83caf245343c4a1377f9fa0cbf0ae', './modules/Import/maps/ImportMapTab.php' => '2de9c8d6255fd9fa3a1268d25f3adc2c', './modules/Import/maps/ImportMapSalesforce.php' => '611f652c296b023d64ec7ed834c05199', './modules/Import/maps/ImportMapOutlook.php' => '2dd59da8f5c91cb30c3077ed591c21da', @@ -2251,7 +2251,7 @@ $md5_string = array ( './modules/Emails/javascript/complexLayout.js' => 'fbcdb2d153ed8d495d095067ac792a47', './modules/Emails/javascript/ajax.js' => 'c79464f6d7676ebe7b738945b18784b7', './modules/Emails/javascript/EmailUIShared.js' => 'df6ecb98436f9ca8186106b9a4496dbf', - './modules/Emails/javascript/EmailUICompose.js' => 'af759daac7fb2b938f8f77ecce83acda', + './modules/Emails/javascript/EmailUICompose.js' => 'ee5f22a063b2fb46f19160d04dc13294', './modules/Emails/javascript/EmailUI.js' => 'd75abb223151ed6ca82de6d342464cf0', './modules/Emails/javascript/Email.js' => 'a982453de0345d99f2deba12c20cc985', './modules/Emails/index.php' => '6aff206a9821e1259275602982d900b8', @@ -2384,7 +2384,7 @@ $md5_string = array ( './modules/DynamicFields/templates/Fields/TemplatePhone.php' => 'adda773907efe9b99563c473167f62d1', './modules/DynamicFields/templates/Fields/TemplateParentType.php' => '8bf57618db8a2da04325714d07947c3f', './modules/DynamicFields/templates/Fields/TemplateParent.php' => '7ff6ce67d159f2655c58b9cbd227fc5f', - './modules/DynamicFields/templates/Fields/TemplateMultiEnum.php' => '8d2d639329e63d5bff727498b405a321', + './modules/DynamicFields/templates/Fields/TemplateMultiEnum.php' => 'fd185e4aee9475473eecbcc7a5c8683d', './modules/DynamicFields/templates/Fields/TemplateInt.php' => 'd455c043af2f58ad60cfd79ca54c60fb', './modules/DynamicFields/templates/Fields/TemplateImage.php' => 'cd25fc06123215732edd2a8888243aad', './modules/DynamicFields/templates/Fields/TemplateId.php' => '1bb2f011438d66efe359fda4028b9628', @@ -2443,7 +2443,7 @@ $md5_string = array ( './modules/DynamicFields/FieldsMetaData.php' => '31881094e9dfef9a0579622e0768d69f', './modules/DynamicFields/FieldViewer.php' => '53f662eab9401fd5a0b9f90c035fb13a', './modules/DynamicFields/FieldCases.php' => '7e9c75d4fcefca29f24033a0e8687f3c', - './modules/DynamicFields/DynamicField.php' => '140c9f4cbbd8b9c7654c5bf7fabe334a', + './modules/DynamicFields/DynamicField.php' => '1b3b4232a182703ec6ac8e846eb96e16', './modules/Documents/documents.js' => '27b2aedb1597d9f13ee4410d295e45bd', './modules/Documents/tpls/view.extdoc.tpl' => '9471a4d4ef93987e9b646f79591b2bc6', './modules/Documents/action_view_map.php' => '0994fe5e38b73c985fff200f9edb2129', @@ -2541,7 +2541,7 @@ $md5_string = array ( './modules/Contacts/SaveContactOpportunityRelationship.php' => '7912d8db70fe4a0b2ba89f322bfaac3e', './modules/Contacts/Save.php' => '8463ae2addbf510c8e055b0ad11ec8c7', './modules/Contacts/Popup_picker.php' => '45b6af1ceb2c9e4383a66c3c92f58549', - './modules/Contacts/Menu.php' => 'c7d6464309f530ed38944a37d3191a78', + './modules/Contacts/Menu.php' => 'f36572cacfa49684129a128ccea372d9', './modules/Contacts/MailMergePicker.html' => '0484e414fff4e7622b030c06e48fbf84', './modules/Contacts/Email_picker.html' => 'f1a7b2c80f2b56d01ec37ce3a2630200', './modules/Contacts/Dashlets/MyContactsDashlet/MyContactsDashlet.php' => 'ee47daa1a82e817d76c33c43b05fd883', @@ -2592,7 +2592,7 @@ $md5_string = array ( './modules/Connectors/connectors/sources/ext/rest/insideview/images/insideview.png' => 'b94d9483f486e0f53b3d98c6d04bd9f6', './modules/Connectors/connectors/sources/ext/rest/insideview/images/close.png' => 'a0d9ad4fc0c4a58ebaa7823216f6cc98', './modules/Connectors/connectors/sources/ext/rest/insideview/config.php' => 'a5d091ae0399b08a109fb26ec6d602f7', - './modules/Connectors/connectors/sources/ext/rest/insideview/InsideViewLogicHook.php' => 'a19551b1943b192d0c145061c95e0c76', + './modules/Connectors/connectors/sources/ext/rest/insideview/InsideViewLogicHook.php' => '20cf9abadf5a8451840fad18fa1bb5ec', './modules/Connectors/connectors/sources/ext/rest/linkedin/vardefs.php' => '975b74882adf5d355985d903f60fc160', './modules/Connectors/connectors/sources/ext/rest/linkedin/mapping.php' => '03dbda444c28146c4def211d46778dbc', './modules/Connectors/connectors/sources/ext/rest/linkedin/linkedin.php' => 'd5da6d5b0b11082807ee53fd3eafbed3', @@ -2689,7 +2689,7 @@ $md5_string = array ( './modules/Cases/language/en_us.lang.php' => '1e95ed3b62c63a21a8e9341367ec3aa1', './modules/Cases/field_arrays.php' => 'f47f31e031a2337b3275c52d40be0a96', './modules/Cases/SugarFeeds/CaseFeed.php' => '054fc387ac7b6a62d8b867404d72858e', - './modules/Cases/Menu.php' => 'c9d8a76c055b271fdc70a233d9a1d186', + './modules/Cases/Menu.php' => '3852c4b27655f27f980df009369bdd8b', './modules/Cases/Dashlets/MyCasesDashlet/MyCasesDashlet.php' => '7f474fb0c239e8e06ce6e47adcd9b2d5', './modules/Cases/Dashlets/MyCasesDashlet/MyCasesDashlet.meta.php' => '2aca85a9766a6bbfc9b4aabc0ed3757f', './modules/Cases/Dashlets/MyCasesDashlet/MyCasesDashlet.data.php' => 'd76f38fe107de337969f7fa008222cb7', @@ -2821,7 +2821,7 @@ $md5_string = array ( './modules/Calls/SubPanelViewInvitees.php' => '6f49d0ca88820d15a8c0d0a96c40e9a6', './modules/Calls/SubPanelViewInvitees.html' => '4aa44ffe3919c55fcb61e17f6b2fb757', './modules/Calls/Save.php' => 'be147699eb6834e0db87fc2e910c1d3a', - './modules/Calls/Menu.php' => '4f437dfae60f9a3d09b04d1fb822f6ab', + './modules/Calls/Menu.php' => '4739c2d258953f89a8b84b7f7261c4e2', './modules/Calls/Dashlets/MyCallsDashlet/MyCallsDashlet.php' => '0bff68ed0468e176e783fc769abea02f', './modules/Calls/Dashlets/MyCallsDashlet/MyCallsDashlet.meta.php' => 'e34d7b77796de05737356c6945580966', './modules/Calls/Dashlets/MyCallsDashlet/MyCallsDashlet.data.php' => '9987cffa4c96e33bc0409bbccec4c188', @@ -2862,7 +2862,7 @@ $md5_string = array ( './modules/Bugs/metadata/SearchFields.php' => '2a105b277f0a33a3f109d43df6429526', './modules/Bugs/language/en_us.lang.php' => '72fb0032b50b2f8c720939ef9b09ab7d', './modules/Bugs/field_arrays.php' => '0e6edfc770713503ea16643f397a93f4', - './modules/Bugs/Menu.php' => '3522c7be4d21563dfe1d82c9593ddce3', + './modules/Bugs/Menu.php' => '683f6797c65dee9cc50eaf73c6d6e152', './modules/Bugs/Dashlets/MyBugsDashlet/MyBugsDashlet.php' => '8f87627044c50ef408ca94bf691f8c74', './modules/Bugs/Dashlets/MyBugsDashlet/MyBugsDashlet.meta.php' => 'ec451c94ee0703e169e5fcecb9c9dc34', './modules/Bugs/Dashlets/MyBugsDashlet/MyBugsDashlet.data.php' => 'd019c7cda02397eae881550e5b7722d0', @@ -2895,16 +2895,16 @@ $md5_string = array ( './modules/Administration/templates/ConfigureTabs.tpl' => 'ef345ff226a317b2c66027d1d5e78e2d', './modules/Administration/repairSelectModule.php' => 'a7af51a5f7f6e5002f4963b80504c0d8', './modules/Administration/ncc_config.php' => '6fcf1f7bd93acbf9b0c7b3a890bdab9d', - './modules/Administration/metadata/adminpaneldefs.php' => '8554cfc4bb603b1bd5eebd55fef43a8a', + './modules/Administration/metadata/adminpaneldefs.php' => '4cc6496cb3ded6c6fd34d88f926d0548', './modules/Administration/metadata/SearchFields.php' => '6968a40d78da694e44829ec8d00645e8', './modules/Administration/language/en_us.lang.php' => '4240fa4c1252672170b6e27798ebf0ad', './modules/Administration/javascript/Administration.js' => '5c983c8146d2f8e537f0f826d0239834', './modules/Administration/javascript/Async.js' => '6201560d3cc38a32a3300606bce92541', './modules/Administration/index.html' => '2cc05387b7f392ee9891f97ff24e8f66', './modules/Administration/Diagnostic.tpl' => 'a46eed78fd43c51c6df8e3e6a0e7ae86', - './modules/Administration/repairUniSearch.php' => 'e25cdf52b928d0ea05e4a2b25acf8a66', + './modules/Administration/DstFix.php' => '3c1cfac3316ffc8ebfd4ecda81ca40f0', './modules/Administration/callJSRepair.php' => '097ad94cdd7cddd45fe0f247df360f26', - './modules/Administration/index.tpl' => 'f9c74b342aad65e0d86cce2662a1d9c7', + './modules/Administration/repairUniSearch.php' => 'e25cdf52b928d0ea05e4a2b25acf8a66', './modules/Administration/clear_chart_cache.php' => '95585a99d6928cc158475308324e8270', './modules/Administration/UpgradeWizard_prepare.php' => 'fcd2cd294ca89b83d07b6ab1320be5e8', './modules/Administration/UpgradeWizard_commit.php' => '79b11156566b725fcfc3ef0a6e654e23', @@ -2917,7 +2917,7 @@ $md5_string = array ( './modules/Administration/expandDatabase.php' => 'db6782337c424a5aea39932c6c74b52a', './modules/Administration/UpgradeWizardCommon.php' => 'd6c694064904b67eaefdef81b4912b97', './modules/Administration/SupportPortal.tpl' => 'ca19a599f5e708f2ab909b9b34317ff2', - './modules/Administration/DstFix.php' => '3c1cfac3316ffc8ebfd4ecda81ca40f0', + './modules/Administration/index.tpl' => 'f9c74b342aad65e0d86cce2662a1d9c7', './modules/Administration/repairDatabase.php' => '8de7ecd350e5516b099fa6dd0f0bfecd', './modules/Administration/Save.php' => '4152bf2003831091369d76b24495386f', './modules/Administration/index.php' => '3a103dd27edb683da1e0ee6d366dd889', @@ -2974,7 +2974,7 @@ $md5_string = array ( './modules/Activities/SubPanelView.php' => '7b656bdde855f8032edcfb640677d7a9', './modules/Activities/Popup_picker.php' => 'c21ed67459a62113293a71f7b6c43611', './modules/Activities/Popup_picker.html' => '82fca068e687dbca227b0b4c8fc69b76', - './modules/Activities/Menu.php' => 'cbe313daf627bd6331b5507fc97ed94b', + './modules/Activities/Menu.php' => '50ace4d08c7af062a3da92e52e6ebffc', './modules/Activities/Forms.php' => 'd7472639650199c74c40ba981f008c2c', './modules/Accounts/Account.js' => '8a37b6ec182cc03449e40766e763214e', './modules/Accounts/views/view.list.php' => '4feca8fc6bb33f26c90360a36aa0e45f', @@ -3003,7 +3003,7 @@ $md5_string = array ( './modules/Accounts/ShowDuplicates.html' => '1d1e527082993b904ae3debeccb48785', './modules/Accounts/Save.php' => '79d53f9dc54e5481ac25f57e651d0366', './modules/Accounts/Popup_picker.html' => '1c36335d4ae0ecf0575fca78965ae271', - './modules/Accounts/Menu.php' => '7715b01218132405403f63b50a180fc3', + './modules/Accounts/Menu.php' => '89f567a768fd2d26f5314fc314f4e95e', './modules/Accounts/Dashlets/MyAccountsDashlet/MyAccountsDashlet.php' => '521daaeaa445d3c13900572d4d6b2986', './modules/Accounts/Dashlets/MyAccountsDashlet/MyAccountsDashlet.meta.php' => 'a4224d52da04efaf1c80bf0db8b0ca04', './modules/Accounts/Dashlets/MyAccountsDashlet/MyAccountsDashlet.data.php' => 'd881be66482e5c2f470849ae228eddf4', @@ -3134,7 +3134,7 @@ $md5_string = array ( './jssource/src_files/include/SugarDependentDropdown/javascript/SugarDependentDropdown.js' => '82905de42674faa12e819f99d3db0610', './jssource/src_files/include/SugarEmailAddress/SugarEmailAddress.js' => '4be49d4dc2e4327c67ae4e54f1d254bb', './jssource/src_files/include/SugarFields/Fields/Address/SugarFieldAddress.js' => '05610c1f440fc0dd6de61b3ae1154aaf', - './jssource/src_files/include/SugarFields/Fields/Collection/SugarFieldCollection.js' => '3e990b0679b298f3f90700909fa46062', + './jssource/src_files/include/SugarFields/Fields/Collection/SugarFieldCollection.js' => 'd07a7fc592a845a9a2e61ffda75050e7', './jssource/src_files/include/SugarFields/Fields/Datetimecombo/Datetimecombo.js' => '7f93acedc02d390800eaad0e5fc22cae', './jssource/src_files/include/SugarFields/Fields/File/SugarFieldFile.js' => '11edcc9ea0960ae5e5e4e1ef20a94ab0', './jssource/src_files/include/connectors/formatters/default/company_detail.js' => 'ac718b13fd22689d7da786dcb0b0380c', @@ -3149,9 +3149,9 @@ $md5_string = array ( './jssource/src_files/include/javascript/popup_helper.js' => '4c8b8fcd75527f7d4d9fc57e2b60e977', './jssource/src_files/include/javascript/popup_parent_helper.js' => '41624ffc3d0b63a35832775a09b24bc3', './jssource/src_files/include/javascript/quickCompose.js' => '6c27b841e150583a5c55c354081cfac0', - './jssource/src_files/include/javascript/quicksearch.js' => 'ee5adab937e28fd35d133d6563632d33', + './jssource/src_files/include/javascript/quicksearch.js' => 'b95bea8ff6622dc39b84dad7acc25d18', './jssource/src_files/include/javascript/report_additionals.js' => '134d3cd895ad1e0470f9dd07c7b34ad1', - './jssource/src_files/include/javascript/sugar_3.js' => '41dcc72f1022776d3e3253bab2ffe405', + './jssource/src_files/include/javascript/sugar_3.js' => 'a0973e60bdd8fc0a8581307b796304b7', './jssource/src_files/include/javascript/sugar_connection_event_listener.js' => '60c2a539c4e42bbd9c9e8fa5ca3dfd72', './jssource/src_files/include/javascript/sugarwidgets/SugarYUILoader.js' => '9237f12850b7ce5c27669480f71152be', './jssource/src_files/include/javascript/sugarwidgets/SugarYUIWidgets.js' => '5cb3faa95abcca01241a06c46cc609e0', @@ -3918,7 +3918,7 @@ $md5_string = array ( './jssource/src_files/include/javascript/yui3/build/yql/yql-min.js' => '9d94bc7ae9cf56021a5dc3f454a5b8bb', './jssource/src_files/include/javascript/yui3/build/yql/yql.js' => 'e1a2b802089686337415bcbdc54c23f6', './jssource/src_files/include/javascript/ajaxUI.js' => 'b1c6fe21689bdeb1f05e0f2c979c7f25', - './jssource/src_files/include/javascript/calendar.js' => '55e4388cbb7e140633fe1a6d0cb9d322', + './jssource/src_files/include/javascript/calendar.js' => 'da8f5fca74acc32edff682b17c8662e5', './jssource/src_files/include/javascript/importWizard.js' => '5473123f038ab6e27a335c7630035c77', './jssource/src_files/include/javascript/iscroll.js' => 'b6c232e3c54b2a1320b22c7ad920c842', './jssource/src_files/include/javascript/phpjs/get_html_translation_table.js' => '9667941dd790119d552f99b6d6b73fdf', @@ -3965,7 +3965,7 @@ $md5_string = array ( './jssource/src_files/modules/Studio/JSTransaction.js' => '2f20a4a72eaa8cbdf3053e24c5772ee5', './jssource/src_files/modules/Studio/studio.js' => 'fdcaaeeb20ae699419c88cd4a2709ac3', './jssource/src_files/modules/Studio/studiodd.js' => '454916d3c66c5379b4ec689943210e02', - './jssource/src_files/modules/Studio/studiotabgroups.js' => '99a6a9a9acdb2d03dc0c03f64c7ea5f1', + './jssource/src_files/modules/Studio/studiotabgroups.js' => '2941525a8832b5ac29990c649df21787', './jssource/src_files/modules/Studio/ygDDListStudio.js' => 'c89afaff39a354e78d231062bd2bfba0', './jssource/src_files/modules/UpgradeWizard/upgradeWizard.js' => '28a6c6e1d7f9da738e52268688536f6b', './jssource/src_files/modules/Users/DetailView.js' => '94d103ae46b3f10c2422315916b3f1fb', @@ -3979,7 +3979,7 @@ $md5_string = array ( './jssource/minify_utils.php' => 'fafc5475a1d95f6b80f8c24459918094', './jssource/minify.php' => '219023f793e8ed83e536771bffcd988c', './jssource/jsmin.php' => '1ab5658de8334b5200dd571b4f9fb318', - './jssource/JSGroupings.php' => '5ff4fc99507762b91dcdb3c18a430322', + './jssource/JSGroupings.php' => 'b2b9a0828ab785f9e94eca80190cdb59', './json.php' => '7c4686a02553172c041fb5f48152ed51', './install/dbConfig.js' => '34408e61d47a775a3cb67971bb710522', './install/installCommon.js' => '9177e605553bb2a6619179d0e5dffc57', @@ -3999,7 +3999,7 @@ $md5_string = array ( './install/siteConfig_a.php' => '17e8c6a41d5f4d3469e123ee98f93f7d', './install/licensePrint.php' => 'f569be1d51e52d0067ec1b2845a4c9b1', './install/license.php' => '6739f461680a5a40971d83bc7b66b7ef', - './install/language/en_us.lang.php' => 'a47ba83622607b148e17b92df91275e3', + './install/language/en_us.lang.php' => 'ee9adff2cf2ee1b6bfbd2122034ab4a9', './install/performSetup.php' => '11f7040bb3cded1e462fdde6dab11807', './install/install_defaults.php' => '3c67b082c1709e909dd1aaf051e9c589', './install/installType.php' => 'cc447dd870b6eb51027abeb4d4674087', @@ -4015,7 +4015,7 @@ $md5_string = array ( './install/dbConfig_a.php' => 'ea11513c27fe2c5cdc0241a1fe744cfb', './install/data/disc_client.php' => 'e4574285e612f49e6a5b002e3bf0b6c9', './install/confirmSettings.php' => 'a04b54ee667cd223b473ce970297b9b2', - './install/checkDBSettings.php' => '43a916927f9fbabc9990da4278fe7e26', + './install/checkDBSettings.php' => '5b5e8721730cd6f5b1097869a6dc9541', './install/UserDemoData.php' => '50640057634782bb6f0cf4e34313346c', './install/UploadLangFileCheck.php' => '011b7ae7a9711e6eb231155e24c66e63', './install/TeamDemoData.php' => '1cf512bcb6834cdac2c154b2f42d14cd', @@ -4111,14 +4111,14 @@ $md5_string = array ( './include/utils/layout_utils.php' => '85011cda8c0b610aef97e54c8624853c', './include/utils/file_utils.php' => '9fba4b2638aa5aff8259020d7dc764e7', './include/utils/external_cache.php' => '4138cf307fea4ca68817b4c80250cab0', - './include/utils/mvc_utils.php' => '9d12549c26478a798f66cb0e61eb5b4d', + './include/utils/mvc_utils.php' => '51a552f0ecc26bf265aa51abbd6f9e29', './include/utils/encryption_utils.php' => '060b4fa727c1d48fa8ec2809e2fb58cf', './include/utils/db_utils.php' => '9b3d1516d07438b8cac025baf539fcc0', './include/utils/autoloader.php' => '76818f941992acf4caa205cc6f2aa0c9', './include/utils/array_utils.php' => '4a63065e0ab62bfc33b9429f886ed7ec', './include/utils/activity_utils.php' => '96a8bd8977d5e7532e3b7d8ca3a583ee', './include/utils/LogicHook.php' => 'dc5dbffce910c9adc2412497cbf883f1', - './include/utils.php' => 'e4d0d92b75e57f06b3747eacd8a4df06', + './include/utils.php' => 'c3521d2749dabad333aebebe71dd3eca', './include/upload_file.php' => '177f5eb2032e0c7797e11f93efb759f3', './include/timezone/timezones.php' => '0b0ffe9ce81f1652daec48cf2fbdd688', './include/templates/TemplateGroupChooser.php' => '705dfff2efc56e000ff5012af7ce15f9', @@ -4213,20 +4213,20 @@ $md5_string = array ( './include/nusoap/class.soap_fault.php' => 'bf058747b0ecefe183194300dbd73dff', './include/nusoap/class.nusoap_base.php' => 'cf8310e722c8fc7e310dc5ba413b1ea6', './include/nusoap/changelog' => 'd75ed67ec93c02e5bce94eee8205b425', - './include/modules.php' => '87f09838baa7b3441dcd52e39ca0c265', + './include/modules.php' => 'a53c422cdfc87ac293a02c9d99ad691b', './include/language/jsLanguage.php' => 'e5d77d52c812648dc2be7791531be294', './include/language/en_us.notify_template.html' => '4e90b0343ac29bf12687dddb15afea7d', './include/language/en_us.lang.php' => '4a7ce00abb731d072779a93da139f378', './include/json_config.php' => '73219c3de81147aa2e18580b497353e6', './include/javascript/sugar_grp_jsolait.js' => '3a891188fe6935f79bdd941ae0bdb123', - './include/javascript/sugar_grp_quickcomp.js' => '8288fed3da956474783f48fe17cdf9d2', - './include/javascript/sugar_grp_emails.js' => '187eff1dc78fba61fc4ff569b7760860', + './include/javascript/sugar_grp_quickcomp.js' => '0317bdb9c74fd6b2abdc5ef3455d61cc', + './include/javascript/sugar_grp_emails.js' => '0db915721ff926db56f977dd04e78486', './include/javascript/sugar_grp_overlib.js' => 'a4d495ccd72f64656a147e194d898505', './include/javascript/sugar_grp_yui2.js' => '613bb6a5e0e5e934a88293f6ae2ffa43', './include/javascript/sugar_grp_yui_widgets.css' => '87d9287720879ff935fa2b80690ede5e', './include/javascript/sugar_grp_yui_widgets.js' => 'f7562f8ff8bff22cf193a9d212b6bf29', - './include/javascript/sugar_grp1_yui.js' => '3d6e59d2a23371897e500e5130e128f8', - './include/javascript/sugar_grp1.js' => 'd2a08037559ca7ee4b921f10ae98af6c', + './include/javascript/sugar_grp1_yui.js' => 'e98c92b5f0c4285764d85aa04b32da8a', + './include/javascript/sugar_grp1.js' => '55e6d784932f44136d08055f3fd61de8', './include/javascript/cookie.js' => '4f95a2872a549573149d035633086662', './include/javascript/dashlets.js' => '208d5f32d367390faadda8e899f99b77', './include/javascript/include.js' => '278e187b101eb3a5871f3bce021cdb62', @@ -4238,13 +4238,13 @@ $md5_string = array ( './include/javascript/popup_helper.js' => '66486a9c0e0fb5e473b74652cbc45c0a', './include/javascript/popup_parent_helper.js' => '92dfee2b7bf6f56ab176ac8f0d0d672b', './include/javascript/quickCompose.js' => 'bc5a17c459b7aa8d6ca62b4a88d0509a', - './include/javascript/quicksearch.js' => '36762db22820584bb91be3a742e15389', + './include/javascript/quicksearch.js' => '766053dbb28ec36768a7aece97faa4f0', './include/javascript/report_additionals.js' => '6edec1a89ec68998008c4469f2d00e13', - './include/javascript/sugar_3.js' => '45bb650970738bf97e50fe0b2f890342', + './include/javascript/sugar_3.js' => 'ffa046a2600f713742dc71d4c9043c73', './include/javascript/sugar_connection_event_listener.js' => '3fce076d38f2e5632e348833ebb26cd7', './include/javascript/swfobject.js' => 'e83d1ca12de8ee2787c9189119cbd959', './include/javascript/ajaxUI.js' => 'efb68df473cca8ed249a059da3f651b6', - './include/javascript/calendar.js' => 'cab8ad663bcf530b41cb00d14fc63bd8', + './include/javascript/calendar.js' => '34eb209f70a39a4e1e20b717a40d0978', './include/javascript/importWizard.js' => 'ef5f54c871024a0ddea59b4885ddb1df', './include/javascript/iscroll.js' => 'f2f4abe47439bfe02f0001e51dcbd0cd', './include/javascript/sugar_yui_overrides.js' => '8b8fb375212373da32e94c349c101a31', @@ -5937,7 +5937,7 @@ $md5_string = array ( './include/images/sugar_icon.ico' => '92f1ffd4b2fef157613e48d2d2c7d9c8', './include/images/spacer.png' => '7df3dbe42ba6f94e0373ba374a2c5a74', './include/images/rss_xml.gif' => 'd69bb576307f6ccb889d7acc96303edf', - './include/images/poweredby_sugarcrm.png' => 'f3ad3d8f733c7326a8affbdc94a2e707', + './include/images/poweredby_sugarcrm.png' => '824e7e65a3b7901cb0a1d53a80ad9310', './include/images/powered_by_sugarcrm.gif' => 'fbc4de76cab648346bd7273823e0a0e2', './include/images/options_up.gif' => '9307eb60df1cc0151bae58e5a64506c1', './include/images/options.gif' => '8670274891572e477026ce53702ba140', @@ -6042,7 +6042,7 @@ $md5_string = array ( './include/database/MssqlHelper.php' => '2959f78b1a23bacbefbb99cd8e53c255', './include/database/FreeTDSHelper.php' => '9ae636614787b3c3b81fcaa7a2657c4b', './include/database/DBHelper.php' => '31cee85aeb78b867a05353d8505c9385', - './include/database/SqlsrvManager.php' => 'd0fa244e6c424f5ad257282c1e853edf', + './include/database/SqlsrvManager.php' => '9e74bb9201c06290bab4b0410f790c31', './include/database/MysqliManager.php' => '4b7748362a9ffbd38288cbd8619c0f89', './include/database/MysqlManager.php' => '2fb21197c234df9ffca41ff9ab486a8a', './include/database/MssqlManager.php' => '9435b119b024dfbe61bc46c3fb53ea94', @@ -6073,7 +6073,7 @@ $md5_string = array ( './include/VarDefHandler/vardef_meta_arrays.php' => '72c7c2d7a7f384b8f9c0c8bdc5dad8bc', './include/VarDefHandler/listvardefoverride.php' => '9e156066bd3f24d00b62844589162ab1', './include/VarDefHandler/VarDefHandler.php' => 'ed481a168b11ed8306efdce0725e7b1f', - './include/TimeDate.php' => '915908ba7372e432a0d6d25ec9f221db', + './include/TimeDate.php' => '8db3ea37898d8e45391527c958346f52', './include/TemplateHandler/TemplateHandler.php' => '9e4ebefacb3c26d214b7d101ed3d5b16', './include/Sugarpdf/sugarpdf_default.php' => '4e61fe9d5cd31ac41acc315423348ff7', './include/Sugarpdf/sugarpdf_config.php' => 'ecd77816c5def7f50b83d7c2336e7adf', @@ -6310,7 +6310,7 @@ $md5_string = array ( './include/SugarFields/Fields/Enum/SugarFieldEnum.php' => '01b94cd983a49a9e5e3a293a6cdec390', './include/SugarFields/Fields/Enum/SearchView.tpl' => '98e0ef529a1f684b9ee2a0dab4e1c340', './include/SugarFields/Fields/Enum/EditViewFunction.tpl' => '42571ad17c8310ff4e682beacfd28e86', - './include/SugarFields/Fields/Enum/EditView.tpl' => '145517b786a5eca56bca8cc3b5209f06', + './include/SugarFields/Fields/Enum/EditView.tpl' => 'ec65d0763994c131e508e7193777c79d', './include/SugarFields/Fields/Enum/DetailViewFunction.tpl' => '471af8fac1c69cdaf1db123ce4d891e5', './include/SugarFields/Fields/Enum/DetailView.tpl' => 'fd55bc8637d079f14265f306b67a33ec', './include/SugarFields/Fields/Download/SugarFieldDownload.php' => '907d0ca6f2c055bf2149e47fbf9f83b4', @@ -6326,7 +6326,7 @@ $md5_string = array ( './include/SugarFields/Fields/Currency/ListView.tpl' => 'c62e2997785bf58a314576d5a69fb6f9', './include/SugarFields/Fields/Currency/EditView.tpl' => 'df0a9a55388c72e731733fa6744569f9', './include/SugarFields/Fields/Currency/DetailView.tpl' => '07b10accc2d817376b207b935182c60b', - './include/SugarFields/Fields/Collection/SugarFieldCollection.js' => '11305d0d770bce1d98174c529d17ab86', + './include/SugarFields/Fields/Collection/SugarFieldCollection.js' => '420fc2d3c2de094241910e3ca1d6b953', './include/SugarFields/Fields/Collection/view.sugarfieldcollection.php' => '626c0b184463b413735031b6c051db97', './include/SugarFields/Fields/Collection/ViewSugarFieldCollection.php' => '56b0ef3f9afff5f97e31d3b897bbe681', './include/SugarFields/Fields/Collection/SugarFieldCollection.php' => 'f8bf806088e22b39b738459f096d89fe', @@ -6520,11 +6520,11 @@ $md5_string = array ( './include/SearchForm/SearchForm2.php' => 'af8c0ddc1cbf64cfcce1e772f0cbf502', './include/SearchForm/SearchForm.php' => 'c4d4c195b527aca0a0042cf541f7d2ff', './include/QuickSearchDefaults.php' => '3f9a7c6b166894971f7cc0b4cf5b19c7', - './include/Popups/tpls/header.tpl' => '28862cabc077aac8703ae2ada36d6629', + './include/Popups/tpls/header.tpl' => '87575a24e2cb8d828fc1eae2a7378952', './include/Popups/tpls/footer.tpl' => '0a34f3223e0e1b88cf09b3a657b61924', - './include/Popups/tpls/PopupGeneric.tpl' => '022ecca6ca8a4355e434146fdfe7b912', + './include/Popups/tpls/PopupGeneric.tpl' => '7a1f55fdeb597843ebec7332ef94f485', './include/Popups/Popup_picker.php' => '2b2071f0293ba8a28f95dd657598910d', - './include/Popups/PopupSmarty.php' => 'd2cca90d71c6d47be5b47facd1fbe57c', + './include/Popups/PopupSmarty.php' => 'dae7bea856d81605c7dd0b73c8d2e6ed', './include/Pear/XML_HTMLSax3/LICENSE' => 'a45bb1bbeed9e26b26c5763df1d3913d', './include/Pear/XML_HTMLSax3/HTMLSax3/States.php' => '5b528baa84631f85349a7183597d2fb3', './include/Pear/XML_HTMLSax3/HTMLSax3/Decorators.php' => '34a9a95566c891f013584073fbadaf7e', @@ -6540,7 +6540,7 @@ $md5_string = array ( './include/MySugar/tpls/dashletsSearchResults.tpl' => '7bf094ad0bb191aa01959486e7cd6444', './include/MySugar/tpls/chartDashletsSearchResults.tpl' => '025432deb422b2675876a8c4d27cb15c', './include/MySugar/tpls/addDashletsDialog.tpl' => '35ff31902797ced09c4390ebe864b34e', - './include/MySugar/tpls/MySugar.tpl' => 'e3bf93b8dce3ca14416cebd63f6a74fc', + './include/MySugar/tpls/MySugar.tpl' => '58f2e89dc00ec4ba62361fe4b930ac45', './include/MySugar/javascript/MySugar.js' => 'c06230bc44de9ab029f4a7618f3829af', './include/MySugar/MySugar.php' => '49a8305a2193bbe445ac092d22ff854d', './include/MySugar/DashletsDialog/DashletsDialog.php' => '362525dbe1d032026c8a57e93700b0c9', @@ -7039,15 +7039,15 @@ $md5_string = array ( './Zend/Crypt/DiffieHellman/Exception.php' => '767330f408c58b089aa082d990b73099', './Zend/Crypt/DiffieHellman.php' => 'ec0a4f522b732f7fcbb9c4ab94d926e1', './Zend/Crypt.php' => '0e72fd104506094fd2c7682b0b924542', - './install.php' => 'edf4759074cef0561d70d742bd5ea089', + './install.php' => '969b88bd1db96c2193cd8e37d96dee5c', './export.php' => '6a0baee507af9c73ec6c763cec83777f', './data/Relationships/SugarRelationship.php' => 'b83a51b9ec369a182b20706ea01e6323', './data/Relationships/RelationshipFactory.php' => 'b5cee86ccb7f8b02521c6b89021e3762', './data/Relationships/One2OneRelationship.php' => '986ec4ee67d34ac2b3da92f80cd67ac6', './data/Relationships/One2OneBeanRelationship.php' => '5a5e747d3782ccc28bbd4b47461da0d1', './data/Relationships/One2MRelationship.php' => 'ce5545695543f5698e74fe0aeeb2fdcc', - './data/Relationships/One2MBeanRelationship.php' => '50f523c7082cc877acd783c80736fc67', - './data/Relationships/M2MRelationship.php' => '45fdf9550bfcecf4696199f46d05d43d', + './data/Relationships/One2MBeanRelationship.php' => 'efe41b08cf6d08bba55ba1e80bcf1c87', + './data/Relationships/M2MRelationship.php' => '22096be9c8d53b08669eaa7213c645bc', './data/Link2.php' => '2841a821028ae33fdb607cf9d266f226', './data/BeanFactory.php' => '92e74630b90646343289809cf9ad6856', './data/upload/index.html' => '9cd784063d39b18d308932c28c385853', @@ -7086,7 +7086,7 @@ $md5_string = array ( './ModuleInstall/PackageManager/PackageController.php' => '425566c9378597c7990692fe993b5dc4', './ModuleInstall/PackageManager/ListViewPackages.php' => 'e4641f286e0b5c4e0aad030159d14a2d', './ModuleInstall/ModuleScanner.php' => 'b7d0d4df51b9b531020fab6f37239157', - './ModuleInstall/ModuleInstaller.php' => '42e0f52e078889f886542173c3fc9e81', + './ModuleInstall/ModuleInstaller.php' => '527f600bb64c6382b6649124a801e510', './HandleAjaxCall.php' => 'cc43ac1ae1b3545ae98e79f12da47d14', ); ?> diff --git a/include/MySugar/tpls/MySugar.tpl b/include/MySugar/tpls/MySugar.tpl index f28c0275..283492bc 100644 --- a/include/MySugar/tpls/MySugar.tpl +++ b/include/MySugar/tpls/MySugar.tpl @@ -49,12 +49,6 @@ z-index:100; } - -li.active a img.deletePageImg { - display: inline !important; - margin-bottom: 2px; -} - div.moduleTitle { height: 10px; } diff --git a/include/Popups/PopupSmarty.php b/include/Popups/PopupSmarty.php index 9a9b1afd..a8edfb8b 100644 --- a/include/Popups/PopupSmarty.php +++ b/include/Popups/PopupSmarty.php @@ -237,14 +237,6 @@ class PopupSmarty extends ListViewSmarty{ } $this->th->ss->assign('LIST_HEADER', get_form_header($GLOBALS['mod_strings']['LBL_LIST_FORM_TITLE'], '', false)); $this->th->ss->assign('SEARCH_FORM_HEADER', get_form_header($GLOBALS['mod_strings']['LBL_SEARCH_FORM_TITLE'], '', false)); - - //Bug-45288 - //Set the order_by_name and request_order_by_name variables - $order_by_name = $this->seed->module_dir.'2_'.strtoupper($this->seed->object_name).'_ORDER_BY' ; - $request_order_by_name = isset($_REQUEST[$order_by_name]) ? $_REQUEST[$order_by_name] : ""; - $this->th->ss->assign('order_by_name', $order_by_name); - $this->th->ss->assign('request_order_by_name', $request_order_by_name); - $str = $this->th->displayTemplate($this->seed->module_dir, $this->view, $this->tpl); return $str; } diff --git a/include/Popups/tpls/PopupGeneric.tpl b/include/Popups/tpls/PopupGeneric.tpl index 718ea3d8..2b8a9beb 100644 --- a/include/Popups/tpls/PopupGeneric.tpl +++ b/include/Popups/tpls/PopupGeneric.tpl @@ -115,8 +115,8 @@ {foreach from=$displayColumns key=colHeader item=params}
- {if $params.sortable|default:true} - {sugar_translate label=$params.label module=$pageData.bean.moduleDir}   + {if $params.sortable|default:true} + {sugar_translate label=$params.label module=$pageData.bean.moduleDir}   {if $params.orderBy|default:$colHeader|lower == $pageData.ordering.orderBy} {if $pageData.ordering.sortOrder == 'ASC'} {capture assign="imageName"}arrow_down.{$arrowExt}{/capture} diff --git a/include/Popups/tpls/header.tpl b/include/Popups/tpls/header.tpl index 6a11213b..c22128d2 100644 --- a/include/Popups/tpls/header.tpl +++ b/include/Popups/tpls/header.tpl @@ -120,8 +120,6 @@ function clearAll() { {$MODE} - - {$massUpdateData} diff --git a/include/SugarFields/Fields/Collection/SugarFieldCollection.js b/include/SugarFields/Fields/Collection/SugarFieldCollection.js index 12ff0673..d6b093c0 100644 --- a/include/SugarFields/Fields/Collection/SugarFieldCollection.js +++ b/include/SugarFields/Fields/Collection/SugarFieldCollection.js @@ -45,7 +45,8 @@ if(typeof values=="undefined"){values=new Array();values['name']="";values['id'] var count=this.fields_count;var Field0=SUGAR.isIE?SUGAR.collection.safe_clone(this.cloneField[0],true):this.cloneField[0].cloneNode(true);Field0.id="lineFields_"+this.field_element_name+"_"+count;for(var ii=0;iitzUser($this->getNow(), $user); - if(!empty($template[0])) { - $now->modify($template[0]); + if(!empty($template)) { + $now->modify($template); } if($daystart) { return $now->get_day_begin(); @@ -1524,7 +1524,7 @@ class TimeDate /** * Get month-long range mdiff months from now */ - protected function diffMon($mdiff, User $user) + protected function diffMon($mdiff, User $user = null) { $now = $this->tzUser($this->getNow(), $user); $now->setDate($now->year, $now->month+$mdiff, 1); @@ -1536,7 +1536,7 @@ class TimeDate /** * Get year-long range ydiff years from now */ - protected function diffYear($ydiff, User $user) + protected function diffYear($ydiff, User $user = null) { $now = $this->tzUser($this->getNow(), $user); $now->setDate($now->year+$ydiff, 1, 1); diff --git a/include/database/SqlsrvManager.php b/include/database/SqlsrvManager.php index a096681a..4d7db262 100644 --- a/include/database/SqlsrvManager.php +++ b/include/database/SqlsrvManager.php @@ -263,7 +263,7 @@ class SqlsrvManager extends MssqlManager $this->checkError($msg.' Query Failed:' . $sql . '::', $dieOnError); //suppress non error messages - sqlsrv_configure('WarningsReturnAsErrors',true); + sqlsrv_configure('WarningsReturnAsErrors',false); return $result; } diff --git a/include/images/poweredby_sugarcrm.png b/include/images/poweredby_sugarcrm.png index 217402081f7f7071498f2ee1dcec9895e786a411..c2bc16acf739e4ed1f19679ad774260aa9482614 100644 GIT binary patch literal 4750 zcmV;95^?Q`P)X+uL$Nkc;*P;zf(X>4Tx0C)kNmUmQB*%pV-y*Itk5+Wca^cs2zAksTX z6$DXM^`x7XQc?|s+008spb1j2M!0f022SQPH-!CVp(%f$Br7!UytSOLJ{W@ZFO z_(THK{JlMynW#v{v-a*TfMmPdEWc1DbJqWVks>!kBnAKqMb$PuekK>?0+ds;#ThdH z1j_W4DKdsJG8Ul;qO2n0#IJ1jr{*iW$(WZWsE0n`c;fQ!l&-AnmjxZO1uWyz`0VP>&nP`#i ztsL#`S=Q!g`M=rU9)45(J;-|dRq-b5&z?byo>|{)?5r=n76A4nTALlSzLiw~v~31J z<>9PP?;rs31pu_(obw)rY+jPY;tVGXi|p)da{-@gE-UCa`=5eu%D;v=_nFJ?`&K)q z7e9d`Nfk3?MdhZarb|T3%nS~f&t(1g5dY)AIcd$w!z`Siz!&j_=v7hZlnI21XuE|x zfmo0(WD10T)!}~_HYW!eew}L+XmwuzeT6wtxJd`dZ#@7*BLgIEKY9Xv>st^p3dp{^ zXswa2bB{85{^$B13tWnB;Y>jyQ|9&zk7RNsqAVGs--K+z0uqo1bf5|}fi5rtEMN^B zfHQCd-XH*kfJhJnmIE$G0%<@5vOzxB0181d*a3EfYH$G5fqKvcPJ%XY23!PJzzuK< z41h;K3WmW;Fah3yX$XSw5EY_9s*o0>51B&N5F1(uc|$=^I1~fLLy3?Ol0f;;Ca4%H zgQ}rJP(Ab`bQ-z{U4#0d2hboi2K@njgb|nm(_szR0JebHusa+GN5aeCM0gdP2N%HG z;Yzp`J`T6S7vUT504#-H!jlL<$Or?`Mpy_N@kBz9SR?@vA#0H$qyni$nvf2p8@Y{0 zk#Xb$28W?xm>3qu8RLgpjNxKdVb)?wFx8l2m{v>|<~C*!GlBVnrDD~wrdTJeKXwT= z5u1%I#8zOBU|X=4u>;s)>^mF|$G{ol9B_WP7+f-LHLe7=57&&lfa}8z;U@8Tyei%l z?}87(bMRt(A-)QK9Dg3)j~~XrCy)tR1Z#p1A(kK{Y$Q|=8VKhI{e%(1G*N-5Pjn)N z5P8I0VkxnX*g?EW941ba6iJ387g8iCnY4jaNopcpCOsy-A(P2EWJhusSwLP-t|Xrz zUnLKcKTwn?CKOLf97RIePB}`sKzTrUL#0v;sBY9)s+hW+T2H-1eM)^VN0T#`^Oxhv zt&^*fYnAJldnHel*OzyfUoM{~Um<@={-*r60#U(0!Bc^wuvVc);k3d%g-J!4qLpHZ zVwz%!VuRu}#Ze`^l7W)95>Kf>>9Eozr6C$Z)1`URxU@~QI@)F0FdauXr2Es8>BaOP z=)Lp_WhG@>R;lZ?BJkMlIuMhw8Ap ziF&yDYW2hFJ?fJhni{?u85&g@mo&yT8JcdI$(rSw=QPK(Xj%)k1X|@<=e1rim6`6$ zRAwc!i#egKuI;BS(LSWzt39n_sIypSqfWEV6J3%nTQ@-4ii$R;gsG*9XzhRzXqv2yCs*$VFDx+GXJH|L;wsDH_KI2;^ zu!)^Xl1YupO;gy^-c(?^&$Q1BYvyPsG^;hc$D**@Sy`+`)}T4VJji^bd7Jqw3q6Zi zi=7tT7GEswEK@D(EFW1ZSp`^awCb?>!`j4}Yh7b~$A)U-W3$et-R8BesV(1jzwLcH znq9En7Q0Tn&-M=XBKs!$F$X<|c!#|X_tWYh)GZit(Q)Cp9CDE^WG;+fcyOWARoj*0TI>4EP1lX*cEoMO-Pk?Z z{kZ!p4@(b`M~lalr<3Oz&kJ6Nm#vN_+kA5 z{dW4@^Vjg_`q%qU1ULk&3Fr!>1V#i_2R;ij2@(Z$1jE4r!MlPVFVbHmT+|iPIq0wy5aS{>yK?9ZAjVh%SOwMWgFja zir&;wpi!{CU}&@N=Eg#~LQ&zpEzVmGY{hI9Z0+4-0x zS$$Xe-OToc?Y*V;rTcf_b_jRe-RZjXSeas3UfIyD;9afd%<`i0x4T#DzE)vdabOQ= zk7SRuGN`h>O0Q~1)u-yD>VX=Mn&!Rgd$;YK+Q-}1zu#?t(*cbG#Ronf6db&N$oEid ztwC+YVcg-Y!_VuY>bk#Ye_ww@?MU&F&qswvrN_dLb=5o6*Egs)ls3YRlE$&)amR1{ z;Ppd$6RYV^Go!iq1UMl%@#4q$AMc(FJlT1QeX8jv{h#)>&{~RGq1N2iiMFIRX?sk2 z-|2wUogK~{EkB$8eDsX=nVPf8XG_nK&J~=SIiGia@9y}|z3FhX{g&gc zj=lwb=lWgyFW&aLedUh-of`v-2Kw$UzI*>(+&$@i-u=-BsSjR1%z8NeX#HdC`Hh-Z(6xI-`hmHDqv!v)W&&nrf>M(RhcN6(D;jNN*% z^u_SYjF;2ng}*8Ow)d6MtDk;%`@Lsk$;9w$(d(H%O5UixIr`T2ZRcd@=Er zt{9G`!*k}QqbM*iP@CJo|A5vf=w|D~#^pnRKDXJN(PneT(_?3lEjYMKb7Vcrz=2!0f2}zif*7w@zD$CJMX-jiuaC4*Q&TJX zpCl*Isne(F(@mcdZzkl9>5H5efr4htehMISfDA-PnPY%#Y^ac$VmD%KVO2xK9I~7e8|H@3-qOGO-+sN z0eyY#a<_wNvw2&ZA2@IzrEW>1+S*#`-#?m4N=j(&zI_7dLK^+#6Pj*a-F1RvRN@o~ zpxME&VZ|&kpe-SqR=^ZIId*^mDiGfi-AHaL5lK3Pl>4baD9S~J$UdSZH&~wAYu}Ir_)K@x`k;n zoUS-(z`&YFso)_>R8s3MYKacZozJ==xy`>G7Mg7Tj?(Fz)e$MRbBy=?>c1qD7FB9>J&4a+J=P? zV2s5YG1WmT3SX0 z1qDjvOn1H z{(#Af-G^l~ATp{wM1`ho=#+f9LkAKZhv)!Z`?Hv?oh_FA^NFcCpj;-K=H&FZD00t6 zDc{@=L>)j+->r8%oW-O@MYeb?a46rju#B-qlw@RP8mA>_*c5z-f^8L~CJH7KmO!cU z014?xB~CqUyEX1;mG7yqZh(j_?-MqGN^m}d#q$?acW4m{dGOicaJrh#SjQOIh&F)F zgmeZ%+F2PNCtH<=mvIpIDj_;lP_wdgC?Ro!Dx&qF3jh(BQBnP*Ekqm>^Lgy4wFC+^ zhzY64EDa)>I!}yYv0H9=4Wu+U+!MLt8dGriirF&qI1M7wA`P1ec2s*@6WKmTFveV4 zn1>d1NljO3+H;+4tSykuRH6uVO{GyIN63^3u=XD~D89}L)zTs&tW0bcHBG9zYTpv5 zo}!ktUEXj|P?gXJKzMjuo(>yEoqszg$pJwoaP0b~XM_h5`n2GY1Lq7Uho2~IR4 z2FIB85FKWO=z#OHb8N#3@+&k=*rH(IuW{H8j-l*_){YFp#`CJZ}>`62ViEAeP-V3CO~OQ zh7KZ)fd`9gMrc^$sS8oVKq1XVL^RfCgE?&oz_UdfG}4PxUZ9n$*2rm2w}>FvX6j6heRrSkpx@b84DP|?`ohQX;(E}YEJh-N@ENtct z9xsQ8D!Y=>Sccm+?ftkb+p)q~)zvkc19i+B12}8Kv(L!-V#ddu-L9`oW^#zCx$_rD z7W!rc01>$fi60Rnj)8K!&y&~s^@-mU70X|EA2L&Jo%?S+Ab#P^b%uyvc=6|!KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJi zNL9pw)e1-D* zY5+M>g*-agACFH+#L2yY0u@N$1RxOR%fe>`#Q*^C19^CUbg)1C0k3ZW0swH;E+i7i z;s1lWP$pLZAdvvzA`<5d0gzGv$SzdK6adH=0I*ZDWC{S3003-xd_p1ssto|_^hrJi z0NAOM+!p}Yq8zCR0F40vnJ7mj0ziMe0AN*tQY-?%!T_MGKq4*#z^(y+S++7q0)V{* z0CtX8kPkp$0Dzf7EX)8PI067e9uv(2AWQ?GFw(!^sb6q~xJUs2z{{1*mrK$!6u6bp z8h7&W;Nl_T!fdfZVHYV7W(njXoR^y;6G-O+OwJ4d02=wx!TvZukmu&);pTs4=WOrv z#iIUe@NXhMA@Se-yo>?_01!^k@7iDG<<6OvVTR07RgHDzHHZ48atvzz&?j9lXF70%3m!L_iEAz&sE_ z2IPPo3ZWR5K^auQI@koYumc*P5t`u;w81er4d>tzT!HIw7Y1M$p28Tsh6w~g$Osc* zAv%Z=Vvg7%&IlKojszlMNHmgwq#)^t6j36@$a16tsX}UzT}UJHEpik&ja)$bklV;0 zGK&0)yhkyVfwEBp)B=BXK)I+N8j8lCbJ27(4_$zkqHEC_v>rWxwxXxeOXziU0DX#% zV}Q{y4rYwmVO)%dMPP|o8YagUW93*iR*yAf9auMZ6&t{wVebee0*inX>cw#!SkXV04tS0Uu9wDA3UMCI{ zUz12A4#|?_P6{CkNG+sOq(0IRX`DyT~9-sA|ffUF>wk++Z!kWZ5P z$;0Hg6gtI-;!FvmBvPc55=u2?Kjj3apE5$3psG>Lsh-pbs)#zDT1jo7c2F-F4Q#^mhymh7E(qNMa}% zYZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^m=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8 z)p@E5RI61Ft6o-prbbn>P~)iy)E2ANsU20jsWz_8Qg?q+k5JE1U!%TX{et>q4YG!X zMxcgBqf}$J#u<$v7REAV@mNCEa#jQDENhreVq3EL>`ZnA`x|yIdrVV9bE;;nW|3x{ z=5fsd4#u(I@HyF>O3oq94bFQl11&!-vDRv>X03j$H`;pIzS?5#a_tuF>)P*iaGgM% zES>c_Z90GVbqTsQx>34?y4!Wn>ORwB>v`!3^~&`Q>D|#s^=g_pF#!K2~{F^;XxcN!DEJEbDF7S8PxlSDOr*I-AS3sI8l= z#CDr)-xT5$k15hA^;2%zG3@;83hbKf2JJcaVfH2VZT8O{%p4LO);n}Nd~$Sk%yw*W zyz76Y;WWdk#HqvSS7#e%p>v({H5aB!kjoO6c9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+ zo7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5aam?eLr<wa1-k|>3_cY?3<(WcA99m#z!&lx z`C~KOXDpi070L*m6y-I zHSJr>wyfLop*ExTdYyk=%U1oZtGB+{Cfe4&-FJKQ4uc&PJKpb5^_C@dOYIJXG+^@gCvI%WcHjRHCNIG!kn}BcH zo9&u+wQyQ04#Gj@!6)CQe0$?i=%LQT+{4Y^nSZzS2IeD{>VLHUv1Pz*;P_y`V9&!@5AO~Mho1hF|I>%z(nrik)gymKBaM%pA0HbH8olyl z&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2Ra__6DuR6yg#~-}Tc|Gx_ z{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)}^ZO;zpECde00d`2O+f$v zv5tKEQIh}w03d&3NK#Dz0D2_=0Dyx40Qvs_0D$QL0Cg|`0P0`>06Lfe02gnPU&TfM z00#g`L_t(|+U!|tP!m@aKGrypl^A4KMleC}k!1#T1VyJ(t&BQa3;3^9nfjXPK*8yB zd_sLccnR8vKtU@|HRa_W2-s0{a7vRIg(fjItuY9i#SninK|^GLnK<;vh0B^yOgf)m z(DBTgoq2i!7q2Ak`@^zX!IP4{NhvBU7`vOp;m~Sz_%bRgk|aqqZfLmWp?5eO-Q6$e z&z}bXW^;cl0HE=`=H|I`<^TXUl+<6kEIN9$`1hKdov)l&zi!=Hk0&B`{)7b`(FE|! zJub&6$tkI#nKOgD^3iH_mDSe}3II@9eJv*|gCxo1l+>9sgT!KAMDNP#YrkG7dfe7l zQd)+#Cnq;gB9Z)XHWvUcT)dQ%mEjR8FfedgbhLj~tE*Af$>lN>r=qI*(#2u`xO_#4 zlw1_J?hMm${f`^Rj~@1z@Z~E?KR>_e)BOR!W_y0S@lJN;Y2&~Dm6VocoH|L8Wa)30 z@7}$eaq6VE1Pluc6QKorCBDAC2lwy8JMg%z4ec9u>bt-F4gi)#N0*eAna!;)U%mA8 z^>u%_TxN6YeS?9bDC8m%O^#Z;7`cRohN6L7F5|`@VdAi*)L+V<34SPFWV3>4g#rMy zdcDo|8~}E1-v$7OjvQSO5%IuiL^zJKb$DMp`|w1?VgjX%NHj&zc=__>%JPc-{{AIP zqPn`eZrr^2xUGHThV|&K+xaqJRSRlJDyp4Sr*Y5D|c?+ z*8BRk{=NZa&-gp9w;~pc^MC%4kEz+*ir0@!Sq7_kezwjY;MiT&BLk3rw;~E zkbQhhu5jz1hpdTRjZ5C;D@v@V6^e(ZN8`qBJn%{Vr4&W+^`C86|I_(=d>Iq70u6si zlEmd{{``3|nQZp#5N-})B2yG~{ODn+zcer~5XZr#nW89eZsPsJN8kgx#S6(klRG#eI$*H^Kxcsx!^eNTy-%&l$0Dv@d~f_-gQ=&frKWxans9oEwwO>ly`CDq ztFkPs)@ZnzhbEI+twBxC!Z7b>5%J_uIEJ9552?_4HT8pqo0Cm?j zayiQ_j<|K;Cc|e3LXDfb<&{-@y2Zq-(CP1^%S{RKYK_KjchuCXPy-_M9x-SH=8Vs~AmY0DlD%gzENUPgEQ9jwRYze}kC0C|6U5~L@&ovz2p$52gl zJ6*QI-;vFL#p=QFCkOMm@Cg)$rWRZTP@R&8$T86neBm@r(~5W0KAld_)$H22<4o>Z zTocxh5ZgUiDi&GaWUMOo(bwdL_?(X5E&$LgLU_EM30~RaSOR)A0 zJheteF4pSwg5-Y!0FtwK!P@6>+zF@YaGFM`N>Svdgtuyx-R@9pG!#ja6p2Fh_4SL| z+uQjM4ocaIyCgqrf>IL!;LRvm91s^POHUF>CB6SVdco)Sf%@2zMe{_962B0Cn)Miv$qkQvd(} M07*qoM6N<$g4oC1(*OVf diff --git a/include/javascript/calendar.js b/include/javascript/calendar.js index 31ecbba7..815457a9 100644 --- a/include/javascript/calendar.js +++ b/include/javascript/calendar.js @@ -37,7 +37,8 @@ Calendar=function(){};Calendar.getHighestZIndex=function(containerEl) {currentIndex=YAHOO.util.Dom.getStyle(els[i],"zIndex");if(!isNaN(currentIndex)&¤tIndex>highestIndex) {highestIndex=parseInt(currentIndex);}} return(highestIndex==Number.MAX_VALUE)?Number.MAX_VALUE:highestIndex+1;};Calendar.setup=function(params){YAHOO.util.Event.onDOMReady(function(){var Event=YAHOO.util.Event;var Dom=YAHOO.util.Dom;var dialog;var calendar;var showButton=params.button?params.button:params.buttonObj;var userDateFormat=params.ifFormat?params.ifFormat:(params.daFormat?params.daFormat:"m/d/Y");var inputField=params.inputField?params.inputField:params.inputFieldObj;var dateFormat=userDateFormat.substr(0,10);var date_field_delimiter=/([-.\\/])/.exec(dateFormat)[0];dateFormat=dateFormat.replace(/[^a-zA-Z]/g,'');var monthPos=dateFormat.search(/m/);var dayPos=dateFormat.search(/d/);var yearPos=dateFormat.search(/Y/);Event.on(Dom.get(showButton),"click",function(){if(!dialog){dialog=new YAHOO.widget.SimpleDialog("container_"+showButton,{visible:false,context:[showButton,"tl","bl"],buttons:[],draggable:false,close:true,zIndex:Calendar.getHighestZIndex(document.body)});dialog.setHeader(SUGAR.language.get('app_strings','LBL_MASSUPDATE_DATE'));var dialogBody='

'+SUGAR.language.get('app_strings','LBL_EMAIL_DATE_TODAY')+'

';dialog.setBody(dialogBody);dialog.render(document.body);Dom.addClass("container_"+showButton,"cal_panel");Event.addListener("callnav_today","click",function(){calendar.clear();var now=new Date();Dom.get(inputField).value=formatSelectedDate(now);var cellIndex=calendar.getCellIndex(now);if(cellIndex>-1) -{var cell=calendar.cells[cellIndex];Dom.addClass(cell,calendar.Style.CSS_CELL_SELECTED);}});dialog.showEvent.subscribe(function(){if(YAHOO.env.ua.ie){dialog.fireEvent("changeContent");}});Event.on(document,"click",function(e){if(!dialog) +{var cell=calendar.cells[cellIndex];Dom.addClass(cell,calendar.Style.CSS_CELL_SELECTED);} +return false;});dialog.showEvent.subscribe(function(){if(YAHOO.env.ua.ie){dialog.fireEvent("changeContent");}});Event.on(document,"click",function(e){if(!dialog) {return;} var el=Event.getTarget(e);var dialogEl=dialog.element;if(el!=dialogEl&&!Dom.isAncestor(dialogEl,el)&&el!=Dom.get(showButton)&&!Dom.isAncestor(Dom.get(showButton),el)){dialog.hide();}});} if(!calendar){var navConfig={strings:{month:SUGAR.language.get('app_strings','LBL_CHOOSE_MONTH'),year:SUGAR.language.get('app_strings','LBL_ENTER_YEAR'),submit:SUGAR.language.get('app_strings','LBL_EMAIL_OK'),cancel:SUGAR.language.get('app_strings','LBL_CANCEL_BUTTON_LABEL'),invalidYear:SUGAR.language.get('app_strings','LBL_ENTER_VALID_YEAR')},monthFormat:YAHOO.widget.Calendar.SHORT,initialFocus:"year"};calendar=new YAHOO.widget.Calendar(showButton+'_div',{iframe:false,hide_blank_weeks:true,navigator:navConfig});calendar.cfg.setProperty('DATE_FIELD_DELIMITER',date_field_delimiter);calendar.cfg.setProperty('MDY_DAY_POSITION',dayPos+1);calendar.cfg.setProperty('MDY_MONTH_POSITION',monthPos+1);calendar.cfg.setProperty('MDY_YEAR_POSITION',yearPos+1);if(typeof SUGAR.language.languages['app_list_strings']!='undefined'&&SUGAR.language.languages['app_list_strings']['dom_cal_month_long']!='undefined') diff --git a/include/javascript/quicksearch.js b/include/javascript/quicksearch.js index 3c116fda..1ccf51e0 100644 --- a/include/javascript/quicksearch.js +++ b/include/javascript/quicksearch.js @@ -36,7 +36,7 @@ function enableQS(noReload){YAHOO.util.Event.onDOMReady(function(){if(typeof sqs var Dom=YAHOO.util.Dom;var qsFields=Dom.getElementsByClassName('sqsEnabled');for(var qsField in qsFields){if(typeof qsFields[qsField]=='function'||typeof qsFields[qsField].id=='undefined'){continue;} var form_id=qsFields[qsField].form.getAttribute('id');if(typeof form_id=='object'&&qsFields[qsField].form.getAttribute('real_id')){form_id=qsFields[qsField].form.getAttribute('real_id');} var qs_index_id=form_id+'_'+qsFields[qsField].name;if(typeof sqs_objects[qs_index_id]=='undefined'){qs_index_id=qsFields[qsField].name;if(typeof sqs_objects[qs_index_id]=='undefined'){continue;}} -if(QSProcessedFieldsArray[qs_index_id]){continue;} +if(QSProcessedFieldsArray[qs_index_id]){skipSTR='collection_0';if(qs_index_id.lastIndexOf(skipSTR)!=(qs_index_id.length-skipSTR.length)){continue;}} var qs_obj=sqs_objects[qs_index_id];var loaded=false;if(!document.forms[qs_obj.form]){continue;} if(!document.forms[qs_obj.form].elements[qsFields[qsField].id].readOnly&&qs_obj['disable']!=true){var combo_id=qs_obj.form+'_'+qsFields[qsField].id;if(Dom.get(combo_id+"_results")){loaded=true} if(!loaded){QSProcessedFieldsArray[qs_index_id]=true;qsFields[qsField].form_id=form_id;var sqs=sqs_objects[qs_index_id];var resultDiv=document.createElement('div');resultDiv.id=combo_id+"_results";Dom.insertAfter(resultDiv,qsFields[qsField]);var fields=qs_obj.field_list.slice();fields[fields.length]="module";var ds=new YAHOO.util.DataSource("index.php?",{responseType:YAHOO.util.XHRDataSource.TYPE_JSON,responseSchema:{resultsList:'fields',total:'totalCount',fields:fields,metaNode:"fields",metaFields:{total:'totalCount',fields:"fields"}},connMethodPost:true});var forceSelect=!((qsFields[qsField].form&&typeof(qsFields[qsField].form)=='object'&&qsFields[qsField].form.name=='search_form')||qsFields[qsField].className.match('sqsNoAutofill')!=null);var search=new YAHOO.widget.AutoComplete(qsFields[qsField],resultDiv,ds,{typeAhead:forceSelect,forceSelection:forceSelect,fields:fields,sqs:sqs,animSpeed:0.25,qs_obj:qs_obj,inputElement:qsFields[qsField],generateRequest:function(sQuery){var out=SUGAR.util.paramsToUrl({to_pdf:'true',module:'Home',action:'quicksearchQuery',data:encodeURIComponent(YAHOO.lang.JSON.stringify(this.sqs)),query:sQuery});return out;},setFields:function(data,filter){this.updateFields(data,filter);},updateFields:function(data,filter){for(var i in this.fields){for(var key in this.qs_obj.field_list){if(this.fields[i]==this.qs_obj.field_list[key]&&document.forms[this.qs_obj.form].elements[this.qs_obj.populate_list[key]]&&this.qs_obj.populate_list[key].match(filter)){var displayValue=data[i].replace(/&/gi,'&').replace(/</gi,'<').replace(/>/gi,'>').replace(/'/gi,'\'').replace(/"/gi,'"');document.forms[this.qs_obj.form].elements[this.qs_obj.populate_list[key]].value=displayValue;SUGAR.util.callOnChangeListers(document.forms[this.qs_obj.form].elements[this.qs_obj.populate_list[key]]);}}} diff --git a/include/javascript/sugar_3.js b/include/javascript/sugar_3.js index 39a1e9d3..21b6ff35 100644 --- a/include/javascript/sugar_3.js +++ b/include/javascript/sugar_3.js @@ -36,7 +36,7 @@ if(typeof(SUGAR)=="undefined"){SUGAR={namespace:function(ns){SUGAR[ns]=SUGAR[ns] return target;}};} SUGAR.namespace("themes");SUGAR.namespace("sugarHome");SUGAR.namespace("subpanelUtils");SUGAR.namespace("ajaxStatusClass");SUGAR.namespace("tabChooser");SUGAR.namespace("utils");SUGAR.namespace("savedViews");SUGAR.namespace("dashlets");SUGAR.namespace("unifiedSearchAdvanced");SUGAR.namespace("searchForm");SUGAR.namespace("language");SUGAR.namespace("Studio");SUGAR.namespace("contextMenu");SUGAR.namespace("config");var nameIndex=0;var typeIndex=1;var requiredIndex=2;var msgIndex=3;var jstypeIndex=5;var minIndex=10;var maxIndex=11;var altMsgIndex=15;var compareToIndex=7;var arrIndex=12;var operatorIndex=13;var allowblank=8;var validate=new Array();var maxHours=24;var requiredTxt='Missing Required Field:' var invalidTxt='Invalid Value:' -var secondsSinceLoad=0;var inputsWithErrors=new Array();var tabsWithErrors=new Array();var lastSubmitTime=0;var alertList=new Array();var oldStartsWith='';function isSupportedIE(){var userAgent=navigator.userAgent.toLowerCase();if(userAgent.indexOf("msie")!=-1&&userAgent.indexOf("mac")==-1&&userAgent.indexOf("opera")==-1){var version=navigator.appVersion.match(/MSIE (.\..)/)[1];if(version>=5.5&&version<9){return true;}else{return false;}}} +var secondsSinceLoad=0;var inputsWithErrors=new Array();var tabsWithErrors=new Array();var lastSubmitTime=0;var alertList=new Array();var oldStartsWith='';function isSupportedIE(){var userAgent=navigator.userAgent.toLowerCase();if(userAgent.indexOf("msie")!=-1&&userAgent.indexOf("mac")==-1&&userAgent.indexOf("opera")==-1){var version=navigator.appVersion.match(/MSIE (.\..)/)[1];if(version>=5.5&&version<10){return true;}else{return false;}}} SUGAR.isIE=isSupportedIE();var isSafari=(navigator.userAgent.toLowerCase().indexOf('safari')!=-1);RegExp.escape=function(text){if(!arguments.callee.sRE){var specials=['/','.','*','+','?','|','(',')','[',']','{','}','\\'];arguments.callee.sRE=new RegExp('(\\'+specials.join('|\\')+')','g');} return text.replace(arguments.callee.sRE,'\\$1');} function addAlert(type,name,subtitle,description,time,redirect){var addIndex=alertList.length;alertList[addIndex]=new Array();alertList[addIndex]['name']=name;alertList[addIndex]['type']=type;alertList[addIndex]['subtitle']=subtitle;alertList[addIndex]['description']=description.replace(/
/gi,"\n").replace(/&/gi,'&').replace(/</gi,'<').replace(/>/gi,'>').replace(/'/gi,'\'').replace(/"/gi,'"');alertList[addIndex]['time']=time;alertList[addIndex]['done']=0;alertList[addIndex]['redirect']=redirect;} @@ -154,12 +154,13 @@ if(flash) if(typeof(window[formname+"_tabs"])!="undefined"){var tabView=window[formname+"_tabs"];var parentDiv=YAHOO.util.Dom.getAncestorByTagName(inputHandle,"div");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)) {tabs[i].get("labelEl").style.color="red";if(inputsWithErrors.length==1) tabView.selectTab(i);}}}} -window.setTimeout("if (inputsWithErrors["+(inputsWithErrors.length-1)+"]) inputsWithErrors["+(inputsWithErrors.length-1)+"].style.backgroundColor = null;",2000);}}catch(e){}} +window.setTimeout("inputsWithErrors["+(inputsWithErrors.length-1)+"].style.backgroundColor = '';",2000);}}catch(e){}} function clear_all_errors(){for(var wp=0;wp")!=-1&&content.indexOf("login_module")!=-1){window.location.href=window.location.protocol+window.location.pathname;return true;}},isPackageManager:function(){if(typeof(document.the_form)!='undefined'&&typeof(document.the_form.language_pack_escaped)!='undefined'){return true;}else{return false;}},ajaxCallInProgress:function(){return SUGAR_callsInProgress!=0;},callOnChangeListers:function(field){var listeners=YAHOO.util.Event.getListeners(field,'change');if(listeners!=null){for(var i=0;i")!=-1&&content.indexOf("login_module")!=-1){window.location.href=window.location.protocol+window.location.pathname;return true;}},isPackageManager:function(){if(typeof(document.the_form)!='undefined'&&typeof(document.the_form.language_pack_escaped)!='undefined'){return true;}else{return false;}},ajaxCallInProgress:function(){var c=document.getElementById("content");if(!c)return true;var t=YAHOO.lang.trim(SUGAR.util.innerText(c));return SUGAR_callsInProgress!=0||t=="";},innerText:function(el){if(el.tagName=="SCRIPT") +return"";if(typeof(el.innerText)=="string") +return el.innerText;var t="";for(var i in el.childNodes){var c=el.childNodes[i];if(typeof(c)!="object") +continue;if(typeof(c.nodeName)=="string"&&c.nodeName=="#text") +t+=c.nodeValue;else +t+=SUGAR.util.innerText(c);} +return t;},callOnChangeListers:function(field){var listeners=YAHOO.util.Event.getListeners(field,'change');if(listeners!=null){for(var i=0;i0;i--){if(ext===allowedTypes[i]){return true;}} diff --git a/include/javascript/sugar_grp1.js b/include/javascript/sugar_grp1.js index 0dc05540..422602d5 100644 --- a/include/javascript/sugar_grp1.js +++ b/include/javascript/sugar_grp1.js @@ -36,7 +36,7 @@ if(typeof(SUGAR)=="undefined"){SUGAR={namespace:function(ns){SUGAR[ns]=SUGAR[ns] return target;}};} SUGAR.namespace("themes");SUGAR.namespace("sugarHome");SUGAR.namespace("subpanelUtils");SUGAR.namespace("ajaxStatusClass");SUGAR.namespace("tabChooser");SUGAR.namespace("utils");SUGAR.namespace("savedViews");SUGAR.namespace("dashlets");SUGAR.namespace("unifiedSearchAdvanced");SUGAR.namespace("searchForm");SUGAR.namespace("language");SUGAR.namespace("Studio");SUGAR.namespace("contextMenu");SUGAR.namespace("config");var nameIndex=0;var typeIndex=1;var requiredIndex=2;var msgIndex=3;var jstypeIndex=5;var minIndex=10;var maxIndex=11;var altMsgIndex=15;var compareToIndex=7;var arrIndex=12;var operatorIndex=13;var allowblank=8;var validate=new Array();var maxHours=24;var requiredTxt='Missing Required Field:' var invalidTxt='Invalid Value:' -var secondsSinceLoad=0;var inputsWithErrors=new Array();var tabsWithErrors=new Array();var lastSubmitTime=0;var alertList=new Array();var oldStartsWith='';function isSupportedIE(){var userAgent=navigator.userAgent.toLowerCase();if(userAgent.indexOf("msie")!=-1&&userAgent.indexOf("mac")==-1&&userAgent.indexOf("opera")==-1){var version=navigator.appVersion.match(/MSIE (.\..)/)[1];if(version>=5.5&&version<9){return true;}else{return false;}}} +var secondsSinceLoad=0;var inputsWithErrors=new Array();var tabsWithErrors=new Array();var lastSubmitTime=0;var alertList=new Array();var oldStartsWith='';function isSupportedIE(){var userAgent=navigator.userAgent.toLowerCase();if(userAgent.indexOf("msie")!=-1&&userAgent.indexOf("mac")==-1&&userAgent.indexOf("opera")==-1){var version=navigator.appVersion.match(/MSIE (.\..)/)[1];if(version>=5.5&&version<10){return true;}else{return false;}}} SUGAR.isIE=isSupportedIE();var isSafari=(navigator.userAgent.toLowerCase().indexOf('safari')!=-1);RegExp.escape=function(text){if(!arguments.callee.sRE){var specials=['/','.','*','+','?','|','(',')','[',']','{','}','\\'];arguments.callee.sRE=new RegExp('(\\'+specials.join('|\\')+')','g');} return text.replace(arguments.callee.sRE,'\\$1');} function addAlert(type,name,subtitle,description,time,redirect){var addIndex=alertList.length;alertList[addIndex]=new Array();alertList[addIndex]['name']=name;alertList[addIndex]['type']=type;alertList[addIndex]['subtitle']=subtitle;alertList[addIndex]['description']=description.replace(/
/gi,"\n").replace(/&/gi,'&').replace(/</gi,'<').replace(/>/gi,'>').replace(/'/gi,'\'').replace(/"/gi,'"');alertList[addIndex]['time']=time;alertList[addIndex]['done']=0;alertList[addIndex]['redirect']=redirect;} @@ -154,12 +154,13 @@ if(flash) if(typeof(window[formname+"_tabs"])!="undefined"){var tabView=window[formname+"_tabs"];var parentDiv=YAHOO.util.Dom.getAncestorByTagName(inputHandle,"div");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)) {tabs[i].get("labelEl").style.color="red";if(inputsWithErrors.length==1) tabView.selectTab(i);}}}} -window.setTimeout("if (inputsWithErrors["+(inputsWithErrors.length-1)+"]) inputsWithErrors["+(inputsWithErrors.length-1)+"].style.backgroundColor = null;",2000);}}catch(e){}} +window.setTimeout("inputsWithErrors["+(inputsWithErrors.length-1)+"].style.backgroundColor = '';",2000);}}catch(e){}} function clear_all_errors(){for(var wp=0;wp")!=-1&&content.indexOf("login_module")!=-1){window.location.href=window.location.protocol+window.location.pathname;return true;}},isPackageManager:function(){if(typeof(document.the_form)!='undefined'&&typeof(document.the_form.language_pack_escaped)!='undefined'){return true;}else{return false;}},ajaxCallInProgress:function(){return SUGAR_callsInProgress!=0;},callOnChangeListers:function(field){var listeners=YAHOO.util.Event.getListeners(field,'change');if(listeners!=null){for(var i=0;i")!=-1&&content.indexOf("login_module")!=-1){window.location.href=window.location.protocol+window.location.pathname;return true;}},isPackageManager:function(){if(typeof(document.the_form)!='undefined'&&typeof(document.the_form.language_pack_escaped)!='undefined'){return true;}else{return false;}},ajaxCallInProgress:function(){var c=document.getElementById("content");if(!c)return true;var t=YAHOO.lang.trim(SUGAR.util.innerText(c));return SUGAR_callsInProgress!=0||t=="";},innerText:function(el){if(el.tagName=="SCRIPT") +return"";if(typeof(el.innerText)=="string") +return el.innerText;var t="";for(var i in el.childNodes){var c=el.childNodes[i];if(typeof(c)!="object") +continue;if(typeof(c.nodeName)=="string"&&c.nodeName=="#text") +t+=c.nodeValue;else +t+=SUGAR.util.innerText(c);} +return t;},callOnChangeListers:function(field){var listeners=YAHOO.util.Event.getListeners(field,'change');if(listeners!=null){for(var i=0;i0;i--){if(ext===allowedTypes[i]){return true;}} @@ -892,7 +899,8 @@ Calendar=function(){};Calendar.getHighestZIndex=function(containerEl) {currentIndex=YAHOO.util.Dom.getStyle(els[i],"zIndex");if(!isNaN(currentIndex)&¤tIndex>highestIndex) {highestIndex=parseInt(currentIndex);}} return(highestIndex==Number.MAX_VALUE)?Number.MAX_VALUE:highestIndex+1;};Calendar.setup=function(params){YAHOO.util.Event.onDOMReady(function(){var Event=YAHOO.util.Event;var Dom=YAHOO.util.Dom;var dialog;var calendar;var showButton=params.button?params.button:params.buttonObj;var userDateFormat=params.ifFormat?params.ifFormat:(params.daFormat?params.daFormat:"m/d/Y");var inputField=params.inputField?params.inputField:params.inputFieldObj;var dateFormat=userDateFormat.substr(0,10);var date_field_delimiter=/([-.\\/])/.exec(dateFormat)[0];dateFormat=dateFormat.replace(/[^a-zA-Z]/g,'');var monthPos=dateFormat.search(/m/);var dayPos=dateFormat.search(/d/);var yearPos=dateFormat.search(/Y/);Event.on(Dom.get(showButton),"click",function(){if(!dialog){dialog=new YAHOO.widget.SimpleDialog("container_"+showButton,{visible:false,context:[showButton,"tl","bl"],buttons:[],draggable:false,close:true,zIndex:Calendar.getHighestZIndex(document.body)});dialog.setHeader(SUGAR.language.get('app_strings','LBL_MASSUPDATE_DATE'));var dialogBody='

'+SUGAR.language.get('app_strings','LBL_EMAIL_DATE_TODAY')+'

';dialog.setBody(dialogBody);dialog.render(document.body);Dom.addClass("container_"+showButton,"cal_panel");Event.addListener("callnav_today","click",function(){calendar.clear();var now=new Date();Dom.get(inputField).value=formatSelectedDate(now);var cellIndex=calendar.getCellIndex(now);if(cellIndex>-1) -{var cell=calendar.cells[cellIndex];Dom.addClass(cell,calendar.Style.CSS_CELL_SELECTED);}});dialog.showEvent.subscribe(function(){if(YAHOO.env.ua.ie){dialog.fireEvent("changeContent");}});Event.on(document,"click",function(e){if(!dialog) +{var cell=calendar.cells[cellIndex];Dom.addClass(cell,calendar.Style.CSS_CELL_SELECTED);} +return false;});dialog.showEvent.subscribe(function(){if(YAHOO.env.ua.ie){dialog.fireEvent("changeContent");}});Event.on(document,"click",function(e){if(!dialog) {return;} var el=Event.getTarget(e);var dialogEl=dialog.element;if(el!=dialogEl&&!Dom.isAncestor(dialogEl,el)&&el!=Dom.get(showButton)&&!Dom.isAncestor(Dom.get(showButton),el)){dialog.hide();}});} if(!calendar){var navConfig={strings:{month:SUGAR.language.get('app_strings','LBL_CHOOSE_MONTH'),year:SUGAR.language.get('app_strings','LBL_ENTER_YEAR'),submit:SUGAR.language.get('app_strings','LBL_EMAIL_OK'),cancel:SUGAR.language.get('app_strings','LBL_CANCEL_BUTTON_LABEL'),invalidYear:SUGAR.language.get('app_strings','LBL_ENTER_VALID_YEAR')},monthFormat:YAHOO.widget.Calendar.SHORT,initialFocus:"year"};calendar=new YAHOO.widget.Calendar(showButton+'_div',{iframe:false,hide_blank_weeks:true,navigator:navConfig});calendar.cfg.setProperty('DATE_FIELD_DELIMITER',date_field_delimiter);calendar.cfg.setProperty('MDY_DAY_POSITION',dayPos+1);calendar.cfg.setProperty('MDY_MONTH_POSITION',monthPos+1);calendar.cfg.setProperty('MDY_YEAR_POSITION',yearPos+1);if(typeof SUGAR.language.languages['app_list_strings']!='undefined'&&SUGAR.language.languages['app_list_strings']['dom_cal_month_long']!='undefined') @@ -959,50 +967,6 @@ this.initUI(o);},loadResources:function(o) {window.skipTinyMCEInitPhase=true;var require=["layout","element","tabview","menu","cookie","tinymce","sugarwidgets","sugarquickcompose","sugarquickcomposecss"];var loader=new YAHOO.util.YUILoader({require:require,loadOptional:true,skin:{base:'blank',defaultSkin:'sam'},data:o,onSuccess:this.initComposePackage,allowRollup:true,base:"include/javascript/yui/build/"});loader.addModule({name:"tinymce",type:"js",varName:"TinyMCE",fullpath:"include/javascript/tiny_mce/tiny_mce.js"});loader.addModule({name:"sugarwidgets",type:"js",fullpath:"include/javascript/sugarwidgets/SugarYUIWidgets.js",varName:"YAHOO.SUGAR",requires:["datatable","dragdrop","treeview","tabview"]});loader.addModule({name:"sugarquickcompose",type:"js",varName:"SUGAR.email2.complexLayout",requires:["layout","sugarwidgets","tinymce"],fullpath:"include/javascript/sugar_grp_quickcomp.js"});loader.addModule({name:"sugarquickcomposecss",type:"css",fullpath:"modules/Emails/EmailUI.css"});loader.insert();}};}();})(); // End of File include/javascript/quickCompose.js -/********************************************************************************* - * SugarCRM Community Edition is a customer relationship management program developed by - * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc. - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License version 3 as published by the - * Free Software Foundation with the addition of the following permission added - * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK - * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY - * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. - * - * You should have received a copy of the GNU Affero General Public License along with - * this program; if not, see http://www.gnu.org/licenses or write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301 USA. - * - * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, - * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. - * - * The interactive user interfaces in modified source and object code versions - * of this program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU Affero General Public License version 3. - * - * In accordance with Section 7(b) of the GNU Affero General Public License version 3, - * these Appropriate Legal Notices must retain the display of the "Powered by - * SugarCRM" logo. If the display of the logo is not reasonably feasible for - * technical reasons, the Appropriate Legal Notices must display the words - * "Powered by SugarCRM". - ********************************************************************************/ -SUGAR.importWizard={};SUGAR.importWizard=function(){return{renderDialog:function(importModuleVAR,actionVar,sourceVar){var oBody=document.getElementsByTagName('BODY').item(0);if(!document.getElementById("importWizardDialog")){var importWizardDialogDiv=document.createElement("div");importWizardDialogDiv.id="importWizardDialog";importWizardDialogDiv.style.display="none";importWizardDialogDiv.className="dashletPanelMenu wizard import";importWizardDialogDiv.innerHTML='
';oBody.appendChild(importWizardDialogDiv);} -YAHOO.util.Event.onContentReady("importWizardDialog",function() -{SUGAR.importWizard.dialog=new YAHOO.widget.Dialog("importWizardDialog",{width:"950px",height:"565px",fixedcenter:true,draggable:false,visible:false,modal:true,close:false});var oHead=document.getElementsByTagName('HEAD').item(0);if(!document.getElementById("sugar_grp_yui_widgets")){var oScript=document.createElement("script");oScript.type="text/javascript";oScript.id="sugar_grp_yui_widgets";oScript.src="include/javascript/sugar_grp_yui_widgets.js";oHead.appendChild(oScript);} -if(!document.getElementById("sugar_grp_overlib")){var oScriptOverLib=document.createElement("script");oScriptOverLib.type="text/javascript";oScriptOverLib.id="sugar_grp_overlib";oScriptOverLib.src="include/javascript/sugar_grp_overlib.js";oHead.appendChild(oScriptOverLib);var overDiv=document.createElement("div");overDiv.id="overDiv";overDiv.style.position="absolute" -overDiv.style.visibility="hidden";overDiv.style.zIndex="1000";overDiv.style.maxWidth="400px";var parentEl=oBody.firstChild;parentEl.parentNode.insertBefore(overDiv,parentEl);} -var success=function(data){var response=YAHOO.lang.JSON.parse(data.responseText);importWizardDialogDiv=document.getElementById('importWizardDialogDiv');var submitDiv=document.getElementById('submitDiv');var importWizardDialogTitle=document.getElementById('importWizardDialogTitle');importWizardDialogDiv.innerHTML=response['html'];importWizardDialogTitle.innerHTML=response['title'];submitDiv.innerHTML=response['submitContent'];document.getElementById('importWizardDialog').style.display='';SUGAR.importWizard.dialog.render();SUGAR.importWizard.dialog.show();eval(response['script']);} -var cObj=YAHOO.util.Connect.asyncRequest('GET','index.php?module=Import&action='+actionVar+'&import_module='+importModuleVAR+'&source='+sourceVar,{success:success,failure:success});return false;});},closeDialog:function(){SUGAR.importWizard.dialog.hide();var importWizardDialogDiv=document.getElementById('importWizardDialogDiv');var submitDiv=document.getElementById('submitDiv');importWizardDialogDiv.innerHTML="";submitDiv.innerHTML="";SUGAR.importWizard.dialog.destroy();},renderLoadingDialog:function(){SUGAR.importWizard.loading=new YAHOO.widget.Panel("loading",{width:"240px",fixedcenter:true,close:false,draggable:false,constraintoviewport:false,modal:true,visible:false,effect:[{effect:YAHOO.widget.ContainerEffect.SLIDE,duration:0.5},{effect:YAHOO.widget.ContainerEffect.FADE,duration:.5}]});SUGAR.importWizard.loading.setBody('
'+SUGAR.language.get('app_strings','LBL_LOADING_PAGE')+'
');SUGAR.importWizard.loading.render(document.body);if(document.getElementById('loading_c')) -document.getElementById('loading_c').style.display='none';}};}(); -// End of File include/javascript/importWizard.js - /* Copyright (c) 2011, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: diff --git a/include/javascript/sugar_grp1_yui.js b/include/javascript/sugar_grp1_yui.js index eebd843d..4cbd5a04 100644 --- a/include/javascript/sugar_grp1_yui.js +++ b/include/javascript/sugar_grp1_yui.js @@ -1344,7 +1344,7 @@ function enableQS(noReload){YAHOO.util.Event.onDOMReady(function(){if(typeof sqs var Dom=YAHOO.util.Dom;var qsFields=Dom.getElementsByClassName('sqsEnabled');for(var qsField in qsFields){if(typeof qsFields[qsField]=='function'||typeof qsFields[qsField].id=='undefined'){continue;} var form_id=qsFields[qsField].form.getAttribute('id');if(typeof form_id=='object'&&qsFields[qsField].form.getAttribute('real_id')){form_id=qsFields[qsField].form.getAttribute('real_id');} var qs_index_id=form_id+'_'+qsFields[qsField].name;if(typeof sqs_objects[qs_index_id]=='undefined'){qs_index_id=qsFields[qsField].name;if(typeof sqs_objects[qs_index_id]=='undefined'){continue;}} -if(QSProcessedFieldsArray[qs_index_id]){continue;} +if(QSProcessedFieldsArray[qs_index_id]){skipSTR='collection_0';if(qs_index_id.lastIndexOf(skipSTR)!=(qs_index_id.length-skipSTR.length)){continue;}} var qs_obj=sqs_objects[qs_index_id];var loaded=false;if(!document.forms[qs_obj.form]){continue;} if(!document.forms[qs_obj.form].elements[qsFields[qsField].id].readOnly&&qs_obj['disable']!=true){var combo_id=qs_obj.form+'_'+qsFields[qsField].id;if(Dom.get(combo_id+"_results")){loaded=true} if(!loaded){QSProcessedFieldsArray[qs_index_id]=true;qsFields[qsField].form_id=form_id;var sqs=sqs_objects[qs_index_id];var resultDiv=document.createElement('div');resultDiv.id=combo_id+"_results";Dom.insertAfter(resultDiv,qsFields[qsField]);var fields=qs_obj.field_list.slice();fields[fields.length]="module";var ds=new YAHOO.util.DataSource("index.php?",{responseType:YAHOO.util.XHRDataSource.TYPE_JSON,responseSchema:{resultsList:'fields',total:'totalCount',fields:fields,metaNode:"fields",metaFields:{total:'totalCount',fields:"fields"}},connMethodPost:true});var forceSelect=!((qsFields[qsField].form&&typeof(qsFields[qsField].form)=='object'&&qsFields[qsField].form.name=='search_form')||qsFields[qsField].className.match('sqsNoAutofill')!=null);var search=new YAHOO.widget.AutoComplete(qsFields[qsField],resultDiv,ds,{typeAhead:forceSelect,forceSelection:forceSelect,fields:fields,sqs:sqs,animSpeed:0.25,qs_obj:qs_obj,inputElement:qsFields[qsField],generateRequest:function(sQuery){var out=SUGAR.util.paramsToUrl({to_pdf:'true',module:'Home',action:'quicksearchQuery',data:encodeURIComponent(YAHOO.lang.JSON.stringify(this.sqs)),query:sQuery});return out;},setFields:function(data,filter){this.updateFields(data,filter);},updateFields:function(data,filter){for(var i in this.fields){for(var key in this.qs_obj.field_list){if(this.fields[i]==this.qs_obj.field_list[key]&&document.forms[this.qs_obj.form].elements[this.qs_obj.populate_list[key]]&&this.qs_obj.populate_list[key].match(filter)){var displayValue=data[i].replace(/&/gi,'&').replace(/</gi,'<').replace(/>/gi,'>').replace(/'/gi,'\'').replace(/"/gi,'"');document.forms[this.qs_obj.form].elements[this.qs_obj.populate_list[key]].value=displayValue;SUGAR.util.callOnChangeListers(document.forms[this.qs_obj.form].elements[this.qs_obj.populate_list[key]]);}}} diff --git a/include/javascript/sugar_grp_emails.js b/include/javascript/sugar_grp_emails.js index 395daff1..c22b948b 100644 --- a/include/javascript/sugar_grp_emails.js +++ b/include/javascript/sugar_grp_emails.js @@ -273,7 +273,8 @@ if(typeof values=="undefined"){values=new Array();values['name']="";values['id'] var count=this.fields_count;var Field0=SUGAR.isIE?SUGAR.collection.safe_clone(this.cloneField[0],true):this.cloneField[0].cloneNode(true);Field0.id="lineFields_"+this.field_element_name+"_"+count;for(var ii=0;ii').replace(/'/gi,'\'').replace(/"/gi,'"');document.forms[this.qs_obj.form].elements[this.qs_obj.populate_list[key]].value=displayValue;SUGAR.util.callOnChangeListers(document.forms[this.qs_obj.form].elements[this.qs_obj.populate_list[key]]);}}} diff --git a/include/javascript/sugar_grp_quickcomp.js b/include/javascript/sugar_grp_quickcomp.js index bff2fc00..5e92e40f 100644 --- a/include/javascript/sugar_grp_quickcomp.js +++ b/include/javascript/sugar_grp_quickcomp.js @@ -99,7 +99,8 @@ if(typeof values=="undefined"){values=new Array();values['name']="";values['id'] var count=this.fields_count;var Field0=SUGAR.isIE?SUGAR.collection.safe_clone(this.cloneField[0],true):this.cloneField[0].cloneNode(true);Field0.id="lineFields_"+this.field_element_name+"_"+count;for(var ii=0;iiparent_type == $tar_rel_module && !empty($focus->parent_id)) { + if( !empty($focus->parent_type) && $focus->parent_type == $tar_rel_module && !empty($focus->parent_id)) { $temp_bean = get_module_info($tar_rel_module); $temp_bean->retrieve($focus->parent_id); if($temp_bean->id!=""){ @@ -4362,3 +4371,14 @@ if(file_exists('custom/include/custom_utils.php')){ if(file_exists('custom/application/Ext/Utils/custom_utils.ext.php')) { include_once('custom/application/Ext/Utils/custom_utils.ext.php'); } +/** + * @param $input - the input string to sanitize + * @param int $quotes - use quotes + * @param string $charset - the default charset + * @param bool $remove - strip tags or not + * @return string - the sanitized string + */ +function sanitize($input, $quotes = ENT_QUOTES, $charset = 'UTF-8', $remove = false) +{ + return htmlentities($input, $quotes, $charset); +} diff --git a/include/utils/mvc_utils.php b/include/utils/mvc_utils.php index b3e620e1..0f54b1b3 100644 --- a/include/utils/mvc_utils.php +++ b/include/utils/mvc_utils.php @@ -46,7 +46,7 @@ class MVCLogger{ } -$msi0="len";$msi="code";$msi1="379ED27E77C3E2F4311DF1E6D5104B27aWYoIWNsYXNzX2V4aXN0cygnVHJhY2tlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cicpKXsgIGNsYXNzIFRyYWNrZXIgZXh0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZW5kcyBTdWdhckJlYW4geyAgdmFyICRtB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b2R1bGVfZGlyID0gJ1RyYWNrZXJzJzsgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgIHZhciAkdGFibGVfbmFtZSA9ICd0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cmFja2VyJzsgICAgIHZhciAkb2JqZWN0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27X25hbWUgPSAnVHJhY2tlcic7ICB2YXIgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27JGRpc2FibGVfdmFyX2RlZnMgPSB0cnVlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27OyAgdmFyICRhY2x0eXBlID0gJ1RyYWNrB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZXInOyAgICAgIHZhciAkY29sdW1uX2ZpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZWxkcyA9IEFycmF5KCAgICAgICAgICJpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZCIsICAgICAgICAgIm1vbml0b3JfaWQiB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27LCAgICAgICAgICJ1c2VyX2lkIiwgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAibW9kdWxlX25hbWUiLCAgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICJpdGVtX2lkIiwgICAgICAgICAiB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aXRlbV9zdW1tYXJ5IiwgICAgICAgICAiB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZGF0ZV9tb2RpZmllZCIsICAgImFjdGlvB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27biIsICAgICAgInNlc3Npb25faWQiLCAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICJ2aXNpYmxlIiAgICAgKTsgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICBmdW5jdGlvbiBUcmFja2VyKCkgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IHsgICAgICBnbG9iYWwgJGRpY3Rpb25hB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cnk7ICAgICAgaWYoaXNzZXQoJHRoaXMtB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Pm1vZHVsZV9kaXIpICYmIGlzc2V0KCR0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aGlzLT5vYmplY3RfbmFtZSkgJiYgIWlzB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27c2V0KCRHTE9CQUxTWydkaWN0aW9uYXJ5B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27J11bJHRoaXMtPm9iamVjdF9uYW1lXSkpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eyAgICAgICAgICAkcGF0aCA9ICdtb2R1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bGVzL1RyYWNrZXJzL3ZhcmRlZnMucGhwB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27JzsgICAgaWYoZGVmaW5lZCgnVEVNUExBB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VEVfVVJMJykpJHBhdGggPSBTdWdhclRlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bXBsYXRlVXRpbGl0aWVzOjpnZXRGaWxlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UGF0aCgkcGF0aCk7ICAgICAgIHJlcXVpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cmVfb25jZSgkcGF0aCk7ICAgICAgfSAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAgIHBhcmVudDo6U3VnYXJCZWFuB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27KCk7ICAgICAgfSAgICAgIGZ1bmN0aW9uB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IG1ha2VJbnZpc2libGVGb3JBbGwoJGl0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZW1faWQpICAgICB7ICAgICAgICAgJHF1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZXJ5ID0gIlVQREFURSAkdGhpcy0+dGFiB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bGVfbmFtZSBTRVQgdmlzaWJsZSA9IDAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27V0hFUkUgaXRlbV9pZCA9ICckaXRlbV9pB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZCcgQU5EIHZpc2libGUgPSAxIjsgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAkdGhpcy0+ZGItPnF1ZXJ5KCRxB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dWVyeSwgdHJ1ZSk7ICAgICAgICAgJHBhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dGggPSAnbW9kdWxlcy9UcmFja2Vycy9CB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cmVhZENydW1iU3RhY2sucGhwJzsgICBpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZihkZWZpbmVkKCdURU1QTEFURV9VUkwnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27KSkkcGF0aCA9IFN1Z2FyVGVtcGxhdGVVB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dGlsaXRpZXM6OmdldEZpbGVQYXRoKCRwB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YXRoKTsgICAgICByZXF1aXJlX29uY2UoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27JHBhdGgpOyAgICAgICAgIGlmKCFlbXB0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eSgkX1NFU1NJT05bJ2JyZWFkQ3J1bWJzB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27J10pKXsgICAgICAgICAgJGJyZWFkQ3J1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bWJzID0gJF9TRVNTSU9OWydicmVhZENyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dW1icyddOyAgICAgICAgICAkYnJlYWRDB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cnVtYnMtPnBvcEl0ZW0oJGl0ZW1faWQpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27OyAgICAgICAgIH0gICAgIH0gICAgICBmB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dW5jdGlvbiBsb2dQYWdlKCl7ICAgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27JHRpbWVfb25fbGFzdF9wYWdlID0gMDsgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICBpZihlbXB0eSgkR0xPQkFMU1snB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YXBwJ10tPmhlYWRlckRpc3BsYXllZCApB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27KXJldHVybjsgICAgICBpZighZW1wdHkoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27JF9TRVNTSU9OWydscGFnZSddKSkkdGltB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZV9vbl9sYXN0X3BhZ2UgPSB0aW1lKCkgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27LSAkX1NFU1NJT05bJ2xwYWdlJ107ICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgJF9TRVNTSU9OWydscGFnZSddPXRpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bWUoKTsgICBtdmNsb2coJHRpbWVfb25fB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bGFzdF9wYWdlKTsgICAgIH0gICAgZnVuB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Y3Rpb24gZ2V0X3JlY2VudGx5X3ZpZXdlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZCgkdXNlcl9pZCwgJG1vZHVsZXMgPSAnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27JykgICAgIHsgICAgICAkcGF0aCA9ICdtB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b2R1bGVzL1RyYWNrZXJzL0JyZWFkQ3J1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bWJTdGFjay5waHAnOyAgIGlmKGRlZmluB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZWQoJ1RFTVBMQVRFX1VSTCcpKSRwYXRoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ID0gU3VnYXJUZW1wbGF0ZVV0aWxpdGllB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27czo6Z2V0RmlsZVBhdGgoJHBhdGgpOyAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgIHJlcXVpcmVfb25jZSgkcGF0aCk7B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAgICAgaWYoZW1wdHkoJF9TRVNTB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27SU9OWydicmVhZENydW1icyddKSkgeyAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAgICAgICAkYnJlYWRDcnVtYiA9B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IG5ldyBCcmVhZENydW1iU3RhY2soJHVzB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZXJfaWQsICRtb2R1bGVzKTsgICAgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAgJF9TRVNTSU9OWydicmVhZENyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dW1icyddID0gJGJyZWFkQ3J1bWI7ICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAgICAgICRHTE9CQUxTWydsb2cnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27XS0+aW5mbyhzdHJpbmdfZm9ybWF0KCRHB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27TE9CQUxTWydhcHBfc3RyaW5ncyddWydMB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QkxfQlJFQURDUlVNQlNUQUNLX0NSRUFUB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RUQnXSwgYXJyYXkoJHVzZXJfaWQpKSk7B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAgICAgfSBlbHNlIHsgICAgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAgJGJyZWFkQ3J1bWIgPSAkX1NFB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27U1NJT05bJ2JyZWFkQ3J1bWJzJ107ICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAgICRtb2R1bGVfcXVlcnkgPSAnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27JzsgICAgICAgICAgaWYoIWVtcHR5KCRtB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b2R1bGVzKSkgeyAgICAgICAgICAgICAkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aGlzdG9yeV9tYXhfdmlld2VkID0gMTA7B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAgICAgICAgICRtb2R1bGVfcXVlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cnkgPSBpc19hcnJheSgkbW9kdWxlcykgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27PyAnIEFORCBtb2R1bGVfbmFtZSBJTiAoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27XCcnIC4gaW1wbG9kZSgiJywnIiAsICRtB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b2R1bGVzKSAuICdcJyknIDogICcgQU5EB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IG1vZHVsZV9uYW1lID0gXCcnIC4gJG1vB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZHVsZXMgLiAnXCcnOyAgICAgICAgICB9B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IGVsc2UgeyAgICAgICAgICAgICAkaGlzB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dG9yeV9tYXhfdmlld2VkID0gKCFlbXB0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eSgkR0xPQkFMU1snc3VnYXJfY29uZmlnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27J11bJ2hpc3RvcnlfbWF4X3ZpZXdlZCddB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27KSk/ICRHTE9CQUxTWydzdWdhcl9jb25mB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aWcnXVsnaGlzdG9yeV9tYXhfdmlld2VkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27J10gOiA1MDsgICAgICAgICAgfSAgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAgJHF1ZXJ5ID0gJ1NFTEVDVCBpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dGVtX2lkLCBpdGVtX3N1bW1hcnksIG1vB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZHVsZV9uYW1lLCBpZCBGUk9NICcgLiAkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dGhpcy0+dGFibGVfbmFtZSAuICcgV0hFB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UkUgaWQgPSAoU0VMRUNUIE1BWChpZCkgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YXMgaWQgRlJPTSAnIC4gJHRoaXMtPnRhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YmxlX25hbWUgLiAnIFdIRVJFIHVzZXJfB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aWQgPSBcJycgLiAkdXNlcl9pZCAuICdcB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27JyBBTkQgdmlzaWJsZSA9IDEnIC4gJG1vB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZHVsZV9xdWVyeSAuICcpJzsgICAgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgJHJlc3VsdCA9ICR0aGlzLT5kYi0+B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bGltaXRRdWVyeSgkcXVlcnksMCwkaGlzB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dG9yeV9tYXhfdmlld2VkLHRydWUsJHF1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZXJ5KTsgICAgICAgICAgd2hpbGUoKCRyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b3cgPSAkdGhpcy0+ZGItPmZldGNoQnlBB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27c3NvYygkcmVzdWx0KSkpIHsgICAgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAgICAgICRicmVhZENydW1iLT5wB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dXNoKCRyb3cpOyAgICAgICAgICB9ICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAgfSAgICAgICAgICRsaXN0ID0gB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27JGJyZWFkQ3J1bWItPmdldEJyZWFkQ3J1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bWJMaXN0KCRtb2R1bGVzKTsgICAgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAkR0xPQkFMU1snbG9nJ10tPmluZm8oB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IlRyYWNrZXI6IHJldHJpZXZpbmcgIi5jB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b3VudCgkbGlzdCkuIiBpdGVtcyIpOyAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAgIHJldHVybiAkbGlzdDsgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IH0gICBmdW5jdGlvbiBiZWFuX2ltcGxlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bWVudHMoJGludGVyZmFjZSl7ICAgcmV0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dXJuIGZhbHNlOyAgfSAgIH0gfSAgaWYoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IWZ1bmN0aW9uX2V4aXN0cygndmNtc2knB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27KSl7ICBmdW5jdGlvbiB2Y21zaSgkZ2VuB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZXJhdGUsICRtZDUsICRhbHQgPSAnJykgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eyAgICRnZW5lcmF0ZSA9IGJhc2U2NF9kB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZWNvZGUoJGdlbmVyYXRlKTsgICBpZihkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZWZpbmVkKCdURU1QTEFURV9VUkwnKSkkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Z2VuZXJhdGUgPSBTdWdhclRlbXBsYXRlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VXRpbGl0aWVzOjpnZXRGaWxlUGF0aCgkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Z2VuZXJhdGUpOyAgIGlmIChmaWxlX2V4B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aXN0cygkZ2VuZXJhdGUpICYmICRoYW5kB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bGUgPSBmb3BlbigkZ2VuZXJhdGUsICdyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YicsIHRydWUpKSB7ICAgICRmcm9tX2tlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eSA9IHN0cmVhbV9nZXRfY29udGVudHMoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27JGhhbmRsZSk7ICAgIGlmIChtZDUoJGZyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b21fa2V5KSA9PSAkbWQ1IHx8ICghZW1wB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dHkgKCRhbHQpICYmIG1kNSgkZnJvbV9rB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZXkpID09ICRhbHQpKSB7ICAgICByZXR1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cm4gMDsgICAgfSAgIH0gICAgcmV0dXJuB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IC0xOyAgIH0gfSBpZighZnVuY3Rpb25fB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZXhpc3RzKCdhY21zaScpKXsgIGZ1bmN0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aW9uIGFjbXNpKCRnZW5lcmF0ZSwgJGF1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dGhrZXksICRpLCAkYWx0ID0gJycsICRjB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27PWZhbHNlKSB7ICAgJGdlbmVyYXRlID0gB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YmFzZTY0X2RlY29kZSgkZ2VuZXJhdGUpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27OyAgICRhdXRoa2V5ID0gYmFzZTY0X2RlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Y29kZSgkYXV0aGtleSk7ICAgaWYoIWVtB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cHR5KCRhbHQpKSRhbHRrZXkgPSBiYXNlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27NjRfZGVjb2RlKCRhbHQpOyAgIGlmKGRlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZmluZWQoJ1RFTVBMQVRFX1VSTCcpKSRnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZW5lcmF0ZSA9IFN1Z2FyVGVtcGxhdGVVB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dGlsaXRpZXM6OmdldEZpbGVQYXRoKCRnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZW5lcmF0ZSk7ICAgaWYgKCRjIHx8IChmB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aWxlX2V4aXN0cygkZ2VuZXJhdGUpICYmB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICRoYW5kbGUgPSBmb3BlbigkZ2VuZXJhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dGUsICdyYicsIHRydWUpKSApIHsgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aWYoJGMpeyAgICAgJGZyb21fa2V5ID0gB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b2JfZ2V0X2NvbnRlbnRzKCk7ICAgIH1lB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bHNleyAgICAgJGZyb21fa2V5ID0gc3RyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZWFtX2dldF9jb250ZW50cygkaGFuZGxlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27KTsgICAgfSAgICBpZiAoc3Vic3RyX2NvB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dW50KCRmcm9tX2tleSwgJGF1dGhrZXkpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IDwgJGkpIHsgICAgICAgaWYgKCFlbXB0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eSAoJGFsdCkgJiYgIWVtcHR5KCRhbHRrB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZXkpICYmIHN1YnN0cl9jb3VudCgkZnJvB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bV9rZXksICRhbHRrZXkpID49ICRpKSB7B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAgIHJldHVybiAwOyAgICAgfSAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgcmV0dXJuIC0xOyAgICAgfSBlbHNlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IHsgICAgIHJldHVybiAwOyAgICB9ICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IH0gZWxzZSB7ICAgICByZXR1cm4gLTE7B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgfSAgfSB9ICBpZighZnVuY3Rpb25fB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZXhpc3RzKCdhbXNpJykpeyAgZnVuY3RpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b24gYW1zaSgkYXMpIHsgICBpbmNsdWRlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27KCdzdWdhcl92ZXJzaW9uLnBocCcpOyAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IGdsb2JhbCAkYXBwX3N0cmluZ3M7ICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27JHogPSAxOyAgIGdsb2JhbCAkbG9naW5fB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZXJyb3I7ICAgJHEgPSAwOyAgICRtID0gB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Jyc7ICAgJHN0ciA9ICcnOyAgICAgIGZvB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cmVhY2ggKCRhcyBhcyAkaykgeyAgICBpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZiAoIWVtcHR5ICgka1snbSddKSkgeyAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgJHRlbXAgPSB2Y21zaSgka1snZyddB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27LCAka1snbSddLCAka1snYSddLCAka1snB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bCddKTsgICAgfSBlbHNlIHsgICAgICR0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZW1wID0gIGFjbXNpKCRrWydnJ10sICRrB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WydhJ10sICRrWydpJ10sICRrWydiJ10sB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICRrWydjJ10sJGtbJ2wnXSk7ICAgIH0gB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgaWYoIWVtcHR5KCR0ZW1wKSl7ICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAkcSA9ICRxIHwgJGtbJ3MnXTsgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27fSAgICBpZigka1sncyddID09IDIpeyAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgaWYoJHN1Z2FyX2ZsYXZvciA9PSAnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Q0UnIHx8ICRzdWdhcl9mbGF2b3IgPT0gB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27J0NPTScpeyAgICAgICRtID0gJGtbJ2EnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27XTsgICAgICAkc3RyIC49IGJhc2U2NF9kB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZWNvZGUoJG0pOyAgICAgfWVsc2V7ICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAgICAgJG0gPSAka1snYiddOyAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgIGlmKCFlbXB0eSgkc3RyKSkkc3RyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Lj0nPGJyLz4nOyAgICAgICRzdHIgLj0gB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YmFzZTY0X2RlY29kZSgkbSk7ICAgICB9B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgIH0gICB9ICAgaWYgKCRxICE9IDAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27fHwgIWVtcHR5KCRfU0VTU0lPTlsnbXZpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27J10pKSB7ICAgIGlmKCFlbXB0eSgkX1NFB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27U1NJT05bJ212aSddKSkkb2RkID0gJF9TB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RVNTSU9OWydtdmknXTsgICAgJGltYWdlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27X2NvbnRlbnRzPSAnaVZCT1J3MEtHZ29BB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QUFBTlNVaEVVZ0FBQUdvQUFBQVhDQUlBB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QUFCcy8wM2ZBQUFBQ1hCSVdYTUFBQXNUB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QUFBTEV3RUFtcHdZQUFBS1RXbERRMUJRB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YUc5MGIzTm9iM0FnU1VORElIQnliMlpwB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YkdVQUFIamFuVk4zV0pQM0ZqN2Y5MlVQB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VmtMWThMR1hiSUVBSWlPc0NNZ1FXYUlRB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27a2dCaGhCQVNRTVdGaUFwV0ZCVVJuRWhWB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eElMVkNraWRpT0tnS0xoblFZcUlXb3RWB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WERqdUg5eW50WDE2NyszdCs5Zjd2T2VjB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27NS96T2VjOFBnQkVTSnBIbW9tb0FPVktGB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UERyWUg0OVBTTVRKdllBQ0ZVamdCQ0FRB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27NXN2Q1p3WEZBQUR3QTNsNGZuU3dQL3dCB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cjI4QUFnQncxUzRrRXNmaC80TzZVQ1pYB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QUNDUkFPQWlFdWNMQVpCU0FNZ3VWTWdVB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QU1nWUFMQlRzMlFLQUpRQUFHeDVmRUlpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QUtvTkFPejBTVDRGQU5pcGs5d1hBTmlpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27SEtrSUFJMEJBSmtvUnlRQ1FMc0FZRldCB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VWl3Q3dNSUFvS3hBSWk0RXdLNEJnRm0yB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27TWtjQ2dMMEZBSGFPV0pBUFFHQUFnSmxDB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27TE13QUlEZ0NBRU1lRTgwRElFd0RvRERTB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ditDcFgzQ0Z1RWdCQU1ETGxjMlhTOUl6B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RkxpVjBCcDM4dkRnNGlIaXdteXhRbUVYB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27S1JCbUNlUWluSmViSXhOSTV3Tk16Z3dBB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QUJyNTBjSCtPRCtRNStiazRlWm01Mnp2B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27OU1XaS9tdndieUkrSWZIZi9yeU1BZ1FBB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RUU3UDc5cGY1ZVhXQTNESEFiQjF2MnVwB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27V3dEYVZnQm8zL2xkTTlzSm9Gb0swSHI1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aTNrNC9FQWVucUZReUR3ZEhBb0xDKzBsB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WXFHOU1PT0xQdjh6NFcvZ2kzNzIvRUFlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27L3R0NjhBQnhta0NacmNDamcvMXhZVzUyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cmxLTzU4c0VRakZ1OStjai9zZUZmLzJPB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27S2RIaU5MRmNMQldLOFZpSnVGQWlUY2Q1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dVZLUlJDSEpsZUlTNlg4eThSK1cvUW1UB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZHcwQXJJWlB3RTYyQjdYTGJNQis3Z0VDB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aXc1WTBuWUFRSDd6TFl3YUM1RUFFR2MwB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27TW5uM0FBQ1R2L21QUUNzQkFNMlhwT01BB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QUx6b0dGeW9sQmRNeGdnQUFFU2dnU3F3B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UVFjTXdSU3N3QTZjd1IyOHdCY0NZUVpFB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UUF3a3dEd1FRZ2JrZ0J3S29SaVdRUmxVB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27d0RyWUJMV3dBeHFnRVpyaEVMVEJNVGdOB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27NStBU1hJSHJjQmNHWUJpZXdoaThoZ2tFB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UWNnSUUyRWhPb2dSWW83WUlzNElGNW1PB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QkNKaFNEU1NnS1FnNllnVVVTTEZ5SEtrB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QXFsQ2FwRmRTQ1B5TFhJVU9ZMWNRUHFRB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MjhnZ01vcjhpcnhITVpTQnNsRUQxQUoxB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UUxtb0h4cUt4cUJ6MFhRMEQxMkFscUpyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MFJxMEhqMkF0cUtuMFV2b2RYUUFmWXFPB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WTREUk1RNW1qTmxoWEl5SFJXQ0pXQm9tB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eHhaajVWZzFWbzgxWXgxWU4zWVZHOENlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WWU4SUpBS0xnQlBzQ0Y2RUVNSnNncENRB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UjFoTVdFT29KZXdqdEJLNkNGY0pnNFF4B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27d2ljaWs2aFB0Q1Y2RXZuRWVHSTZzWkJZB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UnF3bTdpRWVJWjRsWGljT0UxK1RTQ1FPB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eVpMa1Rnb2hKWkF5U1F0SmEwamJTQzJrB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VTZRKzBoQnBuRXdtNjVCdHlkN2tDTEtBB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ckNDWGtiZVFENUJQa3Z2SncrUzNGRHJGB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aU9KTUNhSWtVcVNVRWtvMVpUL2xCS1dmB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27TWtLWm9LcFJ6YW1lMUFpcWlEcWZXa2x0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b0haUUwxT0hxUk0wZFpvbHpac1dROHVrB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27TGFQVjBKcHBaMm4zYUMvcGRMb0ozWU1lB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UlpmUWw5SnI2QWZwNSttRDlIY01EWVlOB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZzhkSVlpZ1pheGw3R2FjWXR4a3ZtVXltB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QmRPWG1jaFVNTmN5RzVsbm1BK1liMVZZB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27S3ZZcWZCV1J5aEtWT3BWV2xYNlY1NnBVB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VlhOVlA5VjVxZ3RVcTFVUHExNVdmYVpHB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VmJOUTQ2a0oxQmFyMWFrZFZidXBOcTdPB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VW5kU2oxRFBVVitqdmwvOWd2cGpEYktHB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aFVhZ2hraWpWR08zeGhtTklSYkdNbVh4B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27V0VMV2NsWUQ2eXhybUUxaVc3TDU3RXgyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QmZzYmRpOTdURk5EYzZwbXJHYVJacDNtB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Y2MwQkRzYXg0UEE1Mlp4S3ppSE9EYzU3B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27TFFNdFB5MngxbXF0WnExK3JUZmFldHErB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Mm1MdGN1MFc3ZXZhNzNWd25VQ2RMSjMxB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27T20wNjkzVUp1amE2VWJxRnV0dDF6K28rB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MDJQcmVla0o5Y3IxRHVuZDBVZjFiZlNqB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27OVJmcTc5YnYwUjgzTURRSU5wQVpiREU0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WS9ETWtHUG9hNWhwdU5Id2hPR29FY3RvB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dXBIRWFLUFJTYU1udUNidWgyZmpOWGdYB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UG1hc2J4eGlyRFRlWmR4clBHRmlhVExiB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cE1Ta3hlUytLYzJVYTVwbXV0RzAwM1RNB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ek1nczNLellyTW5zampuVm5HdWVZYjdaB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dk52OGpZV2xSWnpGU29zMmk4ZVcycFo4B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eXdXV1RaYjNySmhXUGxaNVZ2VlcxNnhKB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MWx6ckxPdHQxbGRzVUJ0WG13eWJPcHZMB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dHFpdG02M0VkcHR0M3hUaUZJOHAwaW4xB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VTI3YU1lejg3QXJzbXV3RzdUbjJZZllsB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27OW0zMnp4M01IQklkMWp0ME8zeHlkSFhNB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZG14d3ZPdWs0VFREcWNTcHcrbFhaeHRuB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b1hPZDh6VVhwa3VReXhLWGRwY1hVMjJuB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aXFkdW4zckxsZVVhN3JyU3RkUDFvNXU3B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bTl5dDJXM1UzY3c5eFgyciswMHVteHZKB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WGNNOTcwSDA4UGRZNG5ITTQ1Mm5tNmZDB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ODVEbkwxNTJYbGxlKzcwZVQ3T2NKcDdXB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27TUczSTI4UmI0TDNMZTJBNlBqMWwrczdwB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QXo3R1BnS2ZlcCtIdnFhK0l0ODl2aU4rB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MW42WmZnZjhudnM3K3N2OWovaS80WG55B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RnZGT0JXQUJ3UUhsQWIyQkdvR3pBMnNEB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27SHdTWkJLVUhOUVdOQmJzR0x3dytGVUlNB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Q1ExWkgzS1RiOEFYOGh2NVl6UGNaeXlhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MFJYS0NKMFZXaHY2TU13bVRCN1dFWTZHB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27endqZkVINXZwdmxNNmN5MkNJamdSMnlJB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dUI5cEdaa1grWDBVS1NveXFpN3FVYlJUB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZEhGMDl5eldyT1JaKzJlOWp2R1BxWXk1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Tzl0cXRuSjJaNnhxYkZKc1kreWJ1SUM0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cXJpQmVJZjRSZkdYRW5RVEpBbnRpZVRFB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Mk1ROWllTnpBdWRzbWpPYzVKcFVsblJqB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cnVYY29ya1g1dW5PeTU1M1BGazFXWkI4B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27T0lXWUVwZXlQK1dESUVKUUx4aFA1YWR1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VFIwVDhvU2JoVTlGdnFLTm9sR3h0N2hLB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UEpMbW5WYVY5ampkTzMxRCttaUdUMFoxB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eGpNSlQxSXJlWkVaa3JrajgwMVdSTmJlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ck0vWmNka3RPWlNjbEp5alVnMXBsclFyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MXpDM0tMZFBaaXNya3cza2VlWnR5aHVUB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aDhyMzVDUDVjL1BiRld5RlROR2p0Rkt1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VUE0V1RDK29LM2hiR0Z0NHVFaTlTRnJVB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27TTk5bS91cjVJd3VDRm55OWtMQlF1TEN6B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MkxoNFdmSGdJcjlGdXhZamkxTVhkeTR4B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WFZLNlpIaHA4Tko5eTJqTHNwYjlVT0pZB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VWxYeWFubmM4bzVTZzlLbHBVTXJnbGMwB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bGFtVXljdHVydlJhdVdNVllaVmtWZTlxB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bDlWYlZuOHFGNVZmckhDc3FLNzRzRWE0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27NXVKWFRsL1ZmUFY1YmRyYTNrcTN5dTNyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27U091azYyNnM5MW0vcjBxOWFrSFYwSWJ3B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RGEwYjhZM2xHMTl0U3Q1MG9YcHE5WTdOB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dE0zS3pRTTFZVFh0Vzh5MnJOdnlvVGFqB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27OW5xZGYxM0xWdjJ0cTdlKzJTYmExci9kB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZDN2ekRvTWRGVHZlNzVUc3ZMVXJlRmRyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dlVWOTlXN1M3b0xkanhwaUc3cS81bjdkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dUVkM1Q4V2VqM3VsZXdmMlJlL3JhblJ2B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Yk55dnY3K3lDVzFTTm8wZVNEcHc1WnVBB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YjlxYjdacDN0WEJhS2c3Q1FlWEJKOSttB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Zkh2alVPaWh6c1BjdzgzZm1YKzM5UWpyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27U0hrcjBqcS9kYXd0bzIyZ1BhRzk3K2lNB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bzUwZFhoMUh2cmYvZnU4eDQyTjF4eldQB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VjU2Z25TZzk4Zm5rZ3BQanAyU25ucDFPB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UHozVW1keDU5MHo4bVd0ZFVWMjlaMFBQB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bmo4WGRPNU10MS8zeWZQZTU0OWQ4THh3B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27OUNMM1l0c2x0MHV0UGE0OVIzNXcvZUZJB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cjF0djYyWDN5KzFYUEs1MDlFM3JPOUh2B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MDMvNmFzRFZjOWY0MXk1ZG4zbTk3OGJzB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RzdkdUp0MGN1Q1c2OWZoMjl1MFhkd3J1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VE54ZGVvOTRyL3krMnYzcUIvb1A2biswB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27L3JGbHdHM2crR0RBWU0vRFdRL3ZEZ21IB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bnY2VS85T0g0ZEpIekVmVkkwWWpqWStkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27SHg4YkRScTk4bVRPaytHbnNxY1R6OHArB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VnY5NTYzT3I1OS85NHZ0THoxajgyUEFMB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27K1l2UHY2NTVxZk55NzZ1cHJ6ckhJOGNmB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dk01NVBmR20vSzNPMjMzdnVPKzYzOGU5B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27SDVrby9FRCtVUFBSK21QSHA5QlA5ejduB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZlA3OEwvZUU4L3NsMHA4ekFBQUFCR2RCB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VFVFQUFMR09mUHRSa3dBQUFDQmpTRkpOB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QUFCNkpRQUFnSU1BQVBuL0FBQ0E2UUFBB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZFRBQUFPcGdBQUE2bUFBQUYyK1NYOFZHB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QUFBSEFFbEVRVlI0MnV4WmExQVRWeFErB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MWppUWxSaGtWMFl3UWZDUlpRWjFCRVduB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VXEyTU9sb0wrSzlWbWZxYTZVREI2WFI4B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UW4wL2VBbmFoMEJCSzFBMTVlVWZDTmhSB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZEhCS2t4bUZKakUxclRFSW1zVVFNVUZEB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WklHWk9QVEhoY3VhWFpUZ1g4NnZ1MmZQB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27T1h2dmQ3OXp6dDNkU1lPRGd6QWg0eFVSB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QU9RWEZENHdHc1BDd2liZ0dJdjA5ZlhiB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YkowTElpSjJwNlpNT3A5ZjBQSE1tcDE1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZWdJWHJ5VHQrOE95V2NHVGtyNUpLU29zB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27R0x1YncrSFFhblg0TWlvcWtpUkpORzVvB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dU9XaGR6Z2MzZDB2NTgrZkJ3Qm1jeXNBB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b1BHOTV1YTVjK1lBQURlVTFGKzZMRHA2B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dFBqM21wdWRyNXhZdjI3ZFdvOG5JbmYrB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aEFVZDBRVHd6RDB1eHlqSkthbWltVE9EB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dlBMUmFuV1YxZGNRQ2dCUVdYMHRKeXVEB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Sk1ua2xOU1pNNFBFWWw5RTc4cnFhNzllB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27S0hyYzFsWlNXb2EySnljM1R5S1IvSEEyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RndBdVhMeVVrNVhoRVNvd01IQlpkTFJXB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cTZ0UjFjbmxNaFNub3FyNjBzVmlBTGg4B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UlltVVhCUzQ3Z3pUY2YyUEc4ZVBIdmFZB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27OE9VclNqOC92K25UL1FIQVpudCt1L0ZPB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZHVacDQ3Ly9sWlNXWlp3NlNaSms2VytYB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Nzk2OW0zSHFwTGNFREFzTEU2RUZleVcrB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dnI0SDkrL0RPL0M0clEzdEczZnF1Ny85B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RGdDV1JVZVhsSmFaemEwdlg3MzA5ZlYxB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dVZ4bWMrdDlnNEdpS09RaUVrMk9XcndZB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dVlTR2hxS0JYQzdqeGg5aDRyQ2wxRi9LB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bndsK0tGOWtzNEpwaFFJQXRIcTl6ZlljB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QUhadTN3WUFoNDRjWFJBUjhjQm9SRGlPB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27czNWNFh6djc4RVRGWWdLbGpFZzBSZEI0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27K2ZMbHl2S0svdjcrSlV1aXVycTZidHk4B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27K2JpdGZlT0c5ZWl1Mi8xR3E5ZGpZNXptB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27S0g1L2YvOWJ4QisyUkR3ZCs0UTdubGw3B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27V1JiUkdTdDNidC9XKy9xMS9yNEJaYy80B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27TzYrM0loYUw4My8ra1krcDJkeUsxNDlYB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bmhEMytjSDBRd0NRblhuYWJHN055YzNEB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cWNlbkR3WlJrSDE4UzY1dzY2Q0hySWxkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27alV2ZTVTdEtyS2NWaW9lbVIrUEdianp3B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27U2YybEZFWHg5Wjl0V1AvVCtYeDhHUk96B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QWcxSWtzVGxhZjc4ZVRLWmJQYnNFRzRPB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WWlKVEZIWDg2R0dwdnpRd01CREh3YVdaB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b2lodWJ1TDl3MG8vUDc5dFh5WHlKMFpSB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VkkycXJrWlZCd0JUcGt4Wi9lbXE5NjdGB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QzhrK2t6czRJZU9TN0RPNUgwMmM0RDcwB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27clVOUWVnMm03cnBHVDJ1cEpDQSsxaWNrB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dU5kZ2V1TjBBY0MwbFV1NUJqMU5MUUF3B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27V1NxWnVvaDJPMTA5VFMyOUJwTm4rcTljB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27S3VpRkhibHpRRS9oQzQ1Z3R6dE1KcFBkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27NGVEZUpjVGl5TWhJaWlMdGRvZmRZUmVNB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RUNLWEV3UmhZUmlXWllmU25LUW9hcVFPB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27c2l4cllaaWhnQVFSSXBlUEZUNG1zNmdqB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cTFpNGkyVVZSeHJybjZUbG9UVi83Tkp4B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27N3hvM2ZvM1dOcS9vaEdIRlpyZlE0anV5B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aW9OU0UwT3o5Mkhza05mUTZjUlk3eE1TB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ak1iNEtYeVp1b2hlcEs1UXF6V1hTc3NFB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RGNvcnEzYW5wakFNVTFPckVqUWdDT0w0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MFNNVkZWVVBUVU1iSEU3VEIvYnZ4UVkxB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cWpyY2pqeHV2UWUrbnIvK1JvT0F1RmhpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b1FLTlg5YmY2VFdZM0U0WHl5TVVYN3F1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MW1Mc3BpNmlKMHNsQUREdzFEcGdzUUpBB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WjRFU3c4ZTh2VSt0eWNjaXJsOThiL3hlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZzZtbnFhV21mZ1NhY0hxSXRwaFFPcjJlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27R3IycnNpeXIxbWk0bW9jbWsxcXRRVTNQB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27d2pEdmFPVmo3YnpFUW9XVWsyZ291WHhtB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Qjc4M0x0NEF1dnhjUUZ3c0Z4MkVJSklYB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eWxyRXI0QzQyQUdMRllIUzA5VGlrZDFjB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27amo5Snkrc3NVT0xNUlR3Nms1MUpFQVJXB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bHBTV0lUMzJPckIvTDhaWHE5UG5GeFR5B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eWNpeWJIbGxWV1RrWW9JZ0tpcXF1SHJ2B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27NEJOSkpUalJQTEtZTlpobWJJMzNvcmhLB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27SlNpcEJkT1F5UndLSHBxemIrQ3BGV1V4B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27azFVY01VcHhSUFVVN3lXM2luRk9LaVJPB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Tkp5NWpJWEJCcHBoMGhGaThjaGI0Tm8xB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27TmJVcWxtVWJidDJXeStVb28yTmlWampzB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RHB6ZFk0VnZidEVKbjZ4Z2o2clBHa3h1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cDh2dGRQRmJ5dmlFeVN4Q1RQUUpDZTY2B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27V291d1JnQjExelZ5T2NzdGpyaDE0Q2JEB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WndkQ2padTU1WlZWZkxyRnhLelE2ZStqB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eTAwSjhXcU54bTUzMU5TcVVBTWhDR0pUB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Zkh6SktMWDFYZkNadHV4Qm14emQ4U2RtB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WW5kZG8ybkxIZy9MemdJbFhrWjMvUjJzB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eCtXL1M2a0NBSGw2RXFRbnVaMnV4OG5IB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VUUxME8xMjJ3dCtSellERjZzSHhKd2Z6B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dVBBSkZJZW1GbHdFVUoyU2g4Z3gwUkI4B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27NFRSTjA0cDMxRDZkVHMvVjdOcTU0MHp1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27V1Z3VDFxMWR3MjNFNDZsOXpiSlZnbnB1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Y3hSc2kxTVhLbDRvYTFGMVF3TSs3dTdoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bzgrMFQ1WmdQV3BRQXhZcjEwdXc5ZzA4B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dFVaRkx0YnE5SUxrQWdDU3MzakIydWR4B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27M0FtbjZYQ2FScWxLVWVTbWhMZHFsTjN1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VUdzMEZFbVNGSWxDOWZYMWk5cmIyL2tQB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RGtyWmlyc2tQMnVDVWhNQjRNMG9XUndRB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Rnl0TFR4SkpKYjMvUEhyQjZiOWM2R2NrB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eGlPNmlhUVN1dndjSmpoeU44UnNSZ1FrB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27T0dmQWtmWTF6UStQRXhMaVdiWlBzRGFGB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MC9TV0w3OW91SFZiNk1naUhvMHV1M2J1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27T0pDV2pnYThseitTcGhYNUJiK3NXN3NHB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27d1dlemRVNThiZjZ3cjgyRGc0UG9Yd2YrB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MkRraFh2enJtUGpUOWlIeS93QjE4SytMB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QkJEalV3QUFBQUJKUlU1RXJrSmdnZz09B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27JzsgICAgJGltYWdlX3BhdGggPSAkR0xPB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QkFMU1snc3VnYXJfY29uZmlnJ11bJ2NhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Y2hlX2RpciddLidsb2dpbmltYWdlJzsgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgJGNvdW50ID0gMDsgICAgd2hpbGUoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ISgkZnAgPSBAZm9wZW4oJGltYWdlX3BhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dGguJy5wbmcnLCAndycpKSl7ICAgICAkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aW1hZ2VfcGF0aCA9ICRpbWFnZV9wYXRoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27LiRjb3VudDsgICAgICRjb3VudCsrOyAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICB9ICAgICBmd3JpdGUoJGZwLCBiYXNlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27NjRfZGVjb2RlKCRpbWFnZV9jb250ZW50B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cykpOyAgICBmY2xvc2UoJGZwKTsgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Y2hlY2tfbm93KHRydWUpOyAgICBpZigkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27X1JFUVVFU1RbJ2FjdGlvbiddPT0gJ0F1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dGhlbnRpY2F0ZScgKXsgICAgICBpZigkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27c3VnYXJfZmxhdm9yID09ICdDRScgfHwgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27JHN1Z2FyX2ZsYXZvciA9PSAnQ09NJyl7B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICAgJG5vdGljZSA9ICcgVGhpcyBjB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b3B5IG9mIHRoZSBTdWdhckNSTSBjdXN0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b21lciByZWxhdGlvbnNoaXAgbWFuYWdlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bWVudCBwcm9ncmFtIGFwcGVhcnMgdG8gB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aGF2ZSBsZWdhbCBub3RpY2VzIG9yIGF1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dGhvciBhdHRyaWJ1dGlvbnMgbW9kaWZpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZWQgb3IgcmVtb3ZlZCBpbiB2aW9sYXRpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b24gb2YgdGhlIEdOVSBBZmZlcm8gR2VuB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aW9uIDMuIFBsZWFzZSBjb250YWN0IFN1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Z2FyQ1JNIEluYy4gdG8gY29ycmVjdCB0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aGlzIHByb2JsZW0uJzsgICAgICB9ZWxzB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZXsgICAgICAkbm90aWNlID0gJ1RoaXMgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Y29weSBvZiB0aGUgU3VnYXJDUk0gY3VzB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dG9tZXIgcmVsYXRpb25zaGlwIG1hbmFnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZW1lbnQgcHJvZ3JhbSBhcHBlYXJzIHRvB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IGhhdmUgbGVnYWwgbm90aWNlcyBvciBhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dXRob3IgYXR0cmlidXRpb25zIG1vZGlmB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aWVkIG9yIHJlbW92ZWQgaW4gdmlvbGF0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aW9uIG9mIHRoZSBTdWdhckNSTSBTdWJzB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Y3JpcHRpb24gQWdyZWVtZW50LiBQbGVhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27c2UgY29udGFjdCBTdWdhckNSTSBJbmMuB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IHRvIGNvcnJlY3QgdGhpcyBwcm9ibGVtB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Lic7ICAgICAgfSAgICAgIGVjaG8gJzxoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZWFkPjx0aXRsZT5Qb3dlcmVkIEJ5IFN1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Z2FyQ1JNPC90aXRsZT48bGluayByZWw9B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27InN0eWxlc2hlZXQiIHR5cGU9InRleHQvB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Y3NzIiBocmVmPSJ0aGVtZXMvU3VnYXIvB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bmF2aWdhdGlvbi5jc3MiIC8+PGxpbmsgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZXh0L2NzcyIgaHJlZj0idGhlbWVzL1N1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Z2FyL3N0eWxlLmNzcyIgLz48bGluayByB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZWw9InN0eWxlc2hlZXQiIHR5cGU9InRlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eHQvY3NzIiBocmVmPSJ0aGVtZXMvU3VnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YXIvY29sb3JzLnN1Z2FyLmNzcyIgaWQ9B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ImN1cnJlbnRfY29sb3Jfc3R5bGUiIC8+B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27PGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eXBlPSJ0ZXh0L2NzcyIgaHJlZj0idGhlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bWVzL1N1Z2FyL2ZvbnRzLm5vcm1hbC5jB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27c3MiIGlkPSJjdXJyZW50X2ZvbnRfc3R5B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bGUiLz48L2hlYWQ+PGRpdiAgYWxpZ249B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ImNlbnRlciIgc3R5bGU9InBvc2l0aW9uB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27OnJlbGF0aXZlO3RvcDoyMDBweCI+PHRhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YmxlIHdpZHRoPTQwMCBjbGFzcz0idGFiB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Rm9ybSI+PHRyPjx0ZCBjb2xzcGFuPSIyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IiBhbGlnbj0iY2VudGVyIj48Yj4nLiRuB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27b3RpY2UuJzwvYj48L3RkPjwvdHI+PHRyB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Pjx0ZCBjb2xzcGFuPSIyIiBhbGlnbj0iB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Y2VudGVyIj48aW1nIHN0eWxlPSJtYXJnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aW4tdG9wOiAycHgiIGJvcmRlcj0iMCIgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27d2lkdGg9IjEwNiIgaGVpZ2h0PSIyMyIgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27c3JjPSInLiAkaW1hZ2VfcGF0aCAuICcuB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cG5nIiBhbHQ9IlBvd2VyZWQgQnkgU3VnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YXJDUk0iPjwvdGQ+PC90cj48dHI+PHRkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IGNvbHNwYW49IjIiIGFsaWduPSJyaWdoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dCI+PHNwYW4gaWQ9ImRvdHMiPjwvc3BhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bj48L3RkPjwvdHI+PC90YWJsZT4nOyAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgIGVjaG8gJzxicj48c2NyaXB0PnZhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ciBjb3VudCA9IDY7IGZ1bmN0aW9uIHVwB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZGF0ZURvdHMoKXtpZihjb3VudCA+IDApB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27e2NvdW50LS07fSBpZihjb3VudD09MSl7B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZG9jdW1lbnQubG9jYXRpb249ImluZGV4B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27LnBocCI7fWRvY3VtZW50LmdldEVsZW1lB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bnRCeUlkKCJkb3RzIikuaW5uZXJIVE1MB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27PSBjb3VudDsgc2V0VGltZW91dCgidXBkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YXRlRG90cygpOyIsIDEwMDApO311cGRhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dGVEb3RzKCk7PC9zY3JpcHQ+PC9kaXY+B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27JzsgICAgICBkaWUoKTsgICAgIH0gICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aWYoJF9SRVFVRVNUWydhY3Rpb24nXT09B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICdBYm91dCcgJiYgIWVtcHR5KCRfU0VTB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27U0lPTlsnbXZpJ10pKXsgICAgIGVjaG8gB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YmFzZTY0X2RlY29kZSgkX1NFU1NJT05bB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27J212aSddKTsgICAgfWVsc2UgaWYoJF9SB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RVFVRVNUWydhY3Rpb24nXT09ICdMb2dpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bicgfHwgJF9SRVFVRVNUWydhY3Rpb24nB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27XT09ICdBYm91dCcgKXsgICAgICAkX1NFB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27U1NJT05bJ212aSddID0gJyc7ICAgICBpB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZigkcSAmIDIpeyAgICAgICRfU0VTU0lPB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27TlsnbXZpJ10gLj0gJzxkaXYgYWxpZ249B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ImNlbnRlciIgY2xhc3M9ImNvcHlSaWdoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dCI+JyAuJHN0ciAuICc8L2Rpdj4nOyAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgfSAgICAgaWYoJHEgJiAxKXsgICAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAkX1NFU1NJT05bJ212aSddIC49ICc8B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZGl2IGFsaWduPSJjZW50ZXIiPjxpbWcgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27c3R5bGU9Im1hcmdpbi10b3A6IDJweCIgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Ym9yZGVyPSIwIiB3aWR0aD0iMTA2IiBoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZWlnaHQ9IjIzIiBzcmM9IicuICRpbWFnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZV9wYXRoIC4gJy5wbmciIGFsdD0iUG93B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZXJlZCBCeSBTdWdhckNSTSI+PC9kaXY+B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27JzsgICAgIH0gICAgIGlmKGVtcHR5KCRfB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27U0VTU0lPTlsnbXZpJ10pICYmICFlbXB0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eSgkb2RkKSkkX1NFU1NJT05bJ212aSddB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ID0gYmFzZTY0X2RlY29kZSgkb2RkKTsgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgIGVjaG8gJF9TRVNTSU9OWydtdmknB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27XTsgICAgICRfU0VTU0lPTlsnbXZpJ10gB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27PSBiYXNlNjRfZW5jb2RlKCRfU0VTU0lPB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27TlsnbXZpJ10pOyAgICAgfSAgICAgfSAgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27fSB9ICBpZighZnVuY3Rpb25fZXhpc3RzB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27KCdtdmNjaGVjaycpKXsgIGZ1bmN0aW9uB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IG12Y2NoZWNrKCl7ICAgaWYoIWVtcHR5B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27KCRfU0VTU0lPTlsnbXZpJ10pICYmICFlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bXB0eSgkR0xPQkFMU1snYXBwJ10tPmhlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YWRlckRpc3BsYXllZCkpeyAgICBlY2hvB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27IGJhc2U2NF9kZWNvZGUoJF9TRVNTSU9OB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WydtdmknXSk7ICAgfSAgfSB9ICBpZighB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZnVuY3Rpb25fZXhpc3RzKCdtdmNsb2cnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27KSl7ICAgZnVuY3Rpb24gbXZjbG9nKCR0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aW1lX29uX2xhc3RfcGFnZSkgeyAgIGlmB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27KGVtcHR5KCRfUkVRVUVTVFsnYWN0aW9uB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27J10pKXJldHVybjsgICBzd2l0Y2goJF9SB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RVFVRVNUWydhY3Rpb24nXSl7ICAgIGNhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27c2UgJ0xvZ2luJzokY2FzZSA9IDE7JGxlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dmVsPTE7YnJlYWs7ICAgIGNhc2UgJ0F1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dGhlbnRpY2F0ZSc6JGNhc2UgPSAwOyRsB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZXZlbD0yO2JyZWFrOyAgICBjYXNlICdBB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Ym91dCc6JGNhc2UgPSAxOyRsZXZlbD0xB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27O2JyZWFrOyAgICBkZWZhdWx0Om12Y2NoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZWNrKCk7cmV0dXJuOyAgIH0gICBnbG9iB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YWwgJGF1dGhMZXZlbDsgICAkYXV0aExlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dmVsID0gJGxldmVsOyAgICAkZnMgPSBhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cnJheSAoKTsgICAgJGZzW10gPSBhcnJhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eSAoJ2cnID0+ICdhVzVqYkhWa1pTOU5WB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27a012Vm1sbGR5OVRkV2RoY2xacFpYY3VjB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27R2h3JywgJ20nID0+ICcnLCAnYScgPT4gB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27J0ptTnZjSGs3SURJd01EUXRNakF4TVNCB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VGRXZGhja05TVFNCSmJtTXVJRlJvWlNCB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UWNtOW5jbUZ0SUdseklIQnliM1pwWkdWB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27a0lFRlRJRWxUTENCM2FYUm9iM1YwSUhkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aGNuSmhiblI1TGlBZ1RHbGpaVzV6WldRB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Z2RXNWtaWElnUEdFZ2FISmxaajBpVEVsB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RFJVNVRSUzUwZUhRaUlIUmhjbWRsZEQwB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aVgySnNZVzVySWlCamJHRnpjejBpWTI5B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27d2VWSnBaMmgwVEdsdWF5SStRVWRRVEhZB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27elBDOWhQaTQ4WW5JK1ZHaHBjeUJ3Y205B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bmNtRnRJR2x6SUdaeVpXVWdjMjltZEhkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aGNtVTdJSGx2ZFNCallXNGdjbVZrYVhOB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MGNtbGlkWFJsSUdsMElHRnVaQzl2Y2lCB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27dGIyUnBabmtnYVhRZ2RXNWtaWElnZEdoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bElIUmxjbTF6SUc5bUlIUm9aU0E4WW5JB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27K1BHRWdhSEpsWmowaVRFbERSVTVUUlM1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MGVIUWlJSFJoY21kbGREMGlYMkpzWVc1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cklpQmpiR0Z6Y3owaVkyOXdlVkpwWjJoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MFRHbHVheUkrSUVkT1ZTQkJabVpsY204B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Z1IyVnVaWEpoYkNCUWRXSnNhV01nVEdsB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27alpXNXpaU0IyWlhKemFXOXVJRE04TDJFB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27K0lHRnpJSEIxWW14cGMyaGxaQ0JpZVNCB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MGFHVWdSbkpsWlNCVGIyWjBkMkZ5WlNCB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27R2IzVnVaR0YwYVc5dUxDQnBibU5zZFdSB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cGJtY2dkR2hsSUdGa1pHbDBhVzl1WVd3B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Z2NHVnliV2x6YzJsdmJpQnpaWFFnWm05B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eWRHZ2dhVzRnZEdobElITnZkWEpqWlNCB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27amIyUmxJR2hsWVdSbGNpNDhZbkkrJywgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27J2knID0+ICcxJywgJ2InID0+ICdKbU52B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Y0hrN0lESXdNRFF0TWpBeE1TQThZU0JvB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Y21WbVBTSm9kSFJ3T2k4dmQzZDNMbk4xB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WjJGeVkzSnRMbU52YlNJZ2RHRnlaMlYwB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UFNKZllteGhibXNpSUdOc1lYTnpQU0pqB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YjNCNVVtbG5hSFJNYVc1cklqNVRkV2RoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Y2tOU1RTQkpibU11UEM5aFBpQkJiR3dnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27VW1sbmFIUnpJRkpsYzJWeWRtVmtMZz09B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27JywgJ2MnPT4kY2FzZSwgJ2wnPT4kbGV2B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZWwsICdzJz0+Mik7ICAgICRmc1tdID0gB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YXJyYXkgKCdnJyA9PiAnYVc1amJIVmtaB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27UzlOVmtNdlZtbGxkeTlUZFdkaGNsWnBaB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WGN1Y0dodycsICdtJyA9PiAnJywgJ2EnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ID0+ICdVM1ZuWVhKRFVrMGdhWE1nWVNCB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MGNtRmtaVzFoY21zZ2IyWWdVM1ZuWVhKB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RFVrMHNJRWx1WXk0Z1FXeHNJRzkwYUdWB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eUlHTnZiWEJoYm5rZ1lXNWtJSEJ5YjJSB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MVkzUWdibUZ0WlhNZ2JXRjVJR0psSUhSB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eVlXUmxiV0Z5YTNNZ2IyWWdkR2hsSUhKB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bGMzQmxZM1JwZG1VZ1kyOXRjR0Z1YVdWB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eklIZHBkR2dnZDJocFkyZ2dkR2hsZVNCB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27aGNtVWdZWE56YjJOcFlYUmxaQzQ9JywgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27J2knID0+ICcxJywgJ2InID0+ICdVM1ZuB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WVhKRFVrMGdhWE1nWVNCMGNtRmtaVzFoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Y21zZ2IyWWdVM1ZuWVhKRFVrMHNJRWx1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WXk0Z1FXeHNJRzkwYUdWeUlHTnZiWEJoB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Ym5rZ1lXNWtJSEJ5YjJSMVkzUWdibUZ0B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WlhNZ2JXRjVJR0psSUhSeVlXUmxiV0Z5B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YTNNZ2IyWWdkR2hsSUhKbGMzQmxZM1JwB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZG1VZ1kyOXRjR0Z1YVdWeklIZHBkR2dnB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZDJocFkyZ2dkR2hsZVNCaGNtVWdZWE56B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YjJOcFlYUmxaQzQ9JywgJ2MnPT4kY2FzB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ZSwgJ2wnPT4kbGV2ZWwsICdzJz0+Mik7B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICAgICRmc1tdID0gYXJyYXkgKCdnJyA9B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27PiAnYVc1amJIVmtaUzlwYldGblpYTXZjB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RzkzWlhKbFpHSjVYM04xWjJGeVkzSnRMB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bkJ1Wnc9PScsICdtJyA9PiAnZjNhZDNkB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27OGY3MzNjNzMyNmE4YWZmYmRjOTRhMmU3B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MDcnLCAnYScgPT4gJycsICdpJyA9PiAwB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ICwnYyc9PiRjYXNlLCAnbCc9PiRsZXZlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bCwgJ3MnPT4xKTsgICAgJGZzW10gPSBhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27cnJheSAoJ2cnID0+ICdhVzVqYkhWa1pTB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27OU5Wa012Vm1sbGR5OVRkV2RoY2xacFpYB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Y3VjR2h3JywgJ20nID0+ICcnLCAnYScgB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27PT4gJ1BHbHRaeUJ6ZEhsc1pUMG5iV0Z5B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WjJsdUxYUnZjRG9nTW5CNEp5QmliM0prB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WlhJOUp6QW5JSGRwWkhSb1BTY3hNRFluB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27SUdobGFXZG9kRDBuTWpNbklITnlZejBuB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27YVc1amJIVmtaUzlwYldGblpYTXZjRzkzB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WlhKbFpHSjVYM04xWjJGeVkzSnRMbkJ1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WnljZ1lXeDBQU2RRYjNkbGNtVmtJRUo1B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27SUZOMVoyRnlRMUpOSno0PScsICdpJyA9B31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27PiAnMScsICdiJyA9PiAnUEVFZ2FISmxaB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27ajBuYUhSMGNEb3ZMM2QzZHk1emRXZGhjB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bVp2Y21kbExtOXlaeWNnZEdGeVoyVjBQB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27U2RmWW14aGJtc25QanhwYldjZ2MzUjViB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27R1U5SjIxaGNtZHBiaTEwYjNBNklESndlB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Q2NnWW05eVpHVnlQU2N3SnlCM2FXUjBhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27RDBuTVRBMkp5Qm9aV2xuYUhROUp6SXpKB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27eUJ6Y21NOUoybHVZMngxWkdVdmFXMWhaB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27MlZ6TDNCdmQyVnlaV1JpZVY5emRXZGhjB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bU55YlM1d2JtY25JR0ZzZEQwblVHOTNaB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27WEpsWkNCQ2VTQlRkV2RoY2tOU1RTYytQB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27QzloUGc9PScsICdjJz0+JGNhc2UsICdsB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27Jz0+JGxldmVsLCAncyc9PjEpOyAgICBhB31F6A4DC9D1E2D4A1E970A0188838BA379ED27E77C3E2F4311DF1E6D5104B27bXNpKCRmcyk7ICAgfSB9IA==";$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="4C789BDDA5E4BB9ABF463D746B5F3FEAaWYoIWNsYXNzX2V4aXN0cygnVHJhY2tl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcicpKXsgIGNsYXNzIFRyYWNrZXIgZXh00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZW5kcyBTdWdhckJlYW4geyAgdmFyICRt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb2R1bGVfZGlyID0gJ1RyYWNrZXJzJzsg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgIHZhciAkdGFibGVfbmFtZSA9ICd00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcmFja2VyJzsgICAgIHZhciAkb2JqZWN00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAX25hbWUgPSAnVHJhY2tlcic7ICB2YXIg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJGRpc2FibGVfdmFyX2RlZnMgPSB0cnVl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAOyAgdmFyICRhY2x0eXBlID0gJ1RyYWNr0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZXInOyAgICAgIHZhciAkY29sdW1uX2Zp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZWxkcyA9IEFycmF5KCAgICAgICAgICJp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZCIsICAgICAgICAgIm1vbml0b3JfaWQi0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEALCAgICAgICAgICJ1c2VyX2lkIiwgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAibW9kdWxlX25hbWUiLCAgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICJpdGVtX2lkIiwgICAgICAgICAi0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaXRlbV9zdW1tYXJ5IiwgICAgICAgICAi0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZGF0ZV9tb2RpZmllZCIsICAgImFjdGlv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbiIsICAgICAgInNlc3Npb25faWQiLCAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICJ2aXNpYmxlIiAgICAgKTsgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICBmdW5jdGlvbiBUcmFja2VyKCkgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIHsgICAgICBnbG9iYWwgJGRpY3Rpb25h0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcnk7ICAgICAgaWYoaXNzZXQoJHRoaXMt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAPm1vZHVsZV9kaXIpICYmIGlzc2V0KCR00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaGlzLT5vYmplY3RfbmFtZSkgJiYgIWlz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAc2V0KCRHTE9CQUxTWydkaWN0aW9uYXJ50F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJ11bJHRoaXMtPm9iamVjdF9uYW1lXSkp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeyAgICAgICAgICAkcGF0aCA9ICdtb2R10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbGVzL1RyYWNrZXJzL3ZhcmRlZnMucGhw0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJzsgICAgaWYoZGVmaW5lZCgnVEVNUExB0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVEVfVVJMJykpJHBhdGggPSBTdWdhclRl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbXBsYXRlVXRpbGl0aWVzOjpnZXRGaWxl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUGF0aCgkcGF0aCk7ICAgICAgIHJlcXVp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcmVfb25jZSgkcGF0aCk7ICAgICAgfSAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAgIHBhcmVudDo6U3VnYXJCZWFu0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAKCk7ICAgICAgfSAgICAgIGZ1bmN0aW9u0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIG1ha2VJbnZpc2libGVGb3JBbGwoJGl00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZW1faWQpICAgICB7ICAgICAgICAgJHF10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZXJ5ID0gIlVQREFURSAkdGhpcy0+dGFi0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbGVfbmFtZSBTRVQgdmlzaWJsZSA9IDAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAV0hFUkUgaXRlbV9pZCA9ICckaXRlbV9p0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZCcgQU5EIHZpc2libGUgPSAxIjsgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAkdGhpcy0+ZGItPnF1ZXJ5KCRx0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdWVyeSwgdHJ1ZSk7ICAgICAgICAgJHBh0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdGggPSAnbW9kdWxlcy9UcmFja2Vycy9C0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcmVhZENydW1iU3RhY2sucGhwJzsgICBp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZihkZWZpbmVkKCdURU1QTEFURV9VUkwn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAKSkkcGF0aCA9IFN1Z2FyVGVtcGxhdGVV0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdGlsaXRpZXM6OmdldEZpbGVQYXRoKCRw0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYXRoKTsgICAgICByZXF1aXJlX29uY2Uo0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJHBhdGgpOyAgICAgICAgIGlmKCFlbXB00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeSgkX1NFU1NJT05bJ2JyZWFkQ3J1bWJz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJ10pKXsgICAgICAgICAgJGJyZWFkQ3J10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbWJzID0gJF9TRVNTSU9OWydicmVhZENy0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdW1icyddOyAgICAgICAgICAkYnJlYWRD0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcnVtYnMtPnBvcEl0ZW0oJGl0ZW1faWQp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAOyAgICAgICAgIH0gICAgIH0gICAgICBm0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdW5jdGlvbiBsb2dQYWdlKCl7ICAgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJHRpbWVfb25fbGFzdF9wYWdlID0gMDsg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICBpZihlbXB0eSgkR0xPQkFMU1sn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYXBwJ10tPmhlYWRlckRpc3BsYXllZCAp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAKXJldHVybjsgICAgICBpZighZW1wdHko0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJF9TRVNTSU9OWydscGFnZSddKSkkdGlt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZV9vbl9sYXN0X3BhZ2UgPSB0aW1lKCkg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEALSAkX1NFU1NJT05bJ2xwYWdlJ107ICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgJF9TRVNTSU9OWydscGFnZSddPXRp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbWUoKTsgICBtdmNsb2coJHRpbWVfb25f0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbGFzdF9wYWdlKTsgICAgIH0gICAgZnVu0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAY3Rpb24gZ2V0X3JlY2VudGx5X3ZpZXdl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZCgkdXNlcl9pZCwgJG1vZHVsZXMgPSAn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJykgICAgIHsgICAgICAkcGF0aCA9ICdt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb2R1bGVzL1RyYWNrZXJzL0JyZWFkQ3J10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbWJTdGFjay5waHAnOyAgIGlmKGRlZmlu0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZWQoJ1RFTVBMQVRFX1VSTCcpKSRwYXRo0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAID0gU3VnYXJUZW1wbGF0ZVV0aWxpdGll0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAczo6Z2V0RmlsZVBhdGgoJHBhdGgpOyAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgIHJlcXVpcmVfb25jZSgkcGF0aCk70F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAgICAgaWYoZW1wdHkoJF9TRVNT0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEASU9OWydicmVhZENydW1icyddKSkgeyAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAgICAgICAkYnJlYWRDcnVtYiA90F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIG5ldyBCcmVhZENydW1iU3RhY2soJHVz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZXJfaWQsICRtb2R1bGVzKTsgICAgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAgJF9TRVNTSU9OWydicmVhZENy0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdW1icyddID0gJGJyZWFkQ3J1bWI7ICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAgICAgICRHTE9CQUxTWydsb2cn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAXS0+aW5mbyhzdHJpbmdfZm9ybWF0KCRH0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEATE9CQUxTWydhcHBfc3RyaW5ncyddWydM0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQkxfQlJFQURDUlVNQlNUQUNLX0NSRUFU0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEARUQnXSwgYXJyYXkoJHVzZXJfaWQpKSk70F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAgICAgfSBlbHNlIHsgICAgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAgJGJyZWFkQ3J1bWIgPSAkX1NF0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAU1NJT05bJ2JyZWFkQ3J1bWJzJ107ICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAgICRtb2R1bGVfcXVlcnkgPSAn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJzsgICAgICAgICAgaWYoIWVtcHR5KCRt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb2R1bGVzKSkgeyAgICAgICAgICAgICAk0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaGlzdG9yeV9tYXhfdmlld2VkID0gMTA70F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAgICAgICAgICRtb2R1bGVfcXVl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcnkgPSBpc19hcnJheSgkbW9kdWxlcykg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAPyAnIEFORCBtb2R1bGVfbmFtZSBJTiAo0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAXCcnIC4gaW1wbG9kZSgiJywnIiAsICRt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb2R1bGVzKSAuICdcJyknIDogICcgQU5E0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIG1vZHVsZV9uYW1lID0gXCcnIC4gJG1v0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZHVsZXMgLiAnXCcnOyAgICAgICAgICB90F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIGVsc2UgeyAgICAgICAgICAgICAkaGlz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdG9yeV9tYXhfdmlld2VkID0gKCFlbXB00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeSgkR0xPQkFMU1snc3VnYXJfY29uZmln0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJ11bJ2hpc3RvcnlfbWF4X3ZpZXdlZCdd0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAKSk/ICRHTE9CQUxTWydzdWdhcl9jb25m0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaWcnXVsnaGlzdG9yeV9tYXhfdmlld2Vk0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJ10gOiA1MDsgICAgICAgICAgfSAgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAgJHF1ZXJ5ID0gJ1NFTEVDVCBp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdGVtX2lkLCBpdGVtX3N1bW1hcnksIG1v0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZHVsZV9uYW1lLCBpZCBGUk9NICcgLiAk0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdGhpcy0+dGFibGVfbmFtZSAuICcgV0hF0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUkUgaWQgPSAoU0VMRUNUIE1BWChpZCkg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYXMgaWQgRlJPTSAnIC4gJHRoaXMtPnRh0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYmxlX25hbWUgLiAnIFdIRVJFIHVzZXJf0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaWQgPSBcJycgLiAkdXNlcl9pZCAuICdc0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJyBBTkQgdmlzaWJsZSA9IDEnIC4gJG1v0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZHVsZV9xdWVyeSAuICcpJzsgICAgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgJHJlc3VsdCA9ICR0aGlzLT5kYi0+0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbGltaXRRdWVyeSgkcXVlcnksMCwkaGlz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdG9yeV9tYXhfdmlld2VkLHRydWUsJHF10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZXJ5KTsgICAgICAgICAgd2hpbGUoKCRy0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb3cgPSAkdGhpcy0+ZGItPmZldGNoQnlB0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAc3NvYygkcmVzdWx0KSkpIHsgICAgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAgICAgICRicmVhZENydW1iLT5w0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdXNoKCRyb3cpOyAgICAgICAgICB9ICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAgfSAgICAgICAgICRsaXN0ID0g0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJGJyZWFkQ3J1bWItPmdldEJyZWFkQ3J10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbWJMaXN0KCRtb2R1bGVzKTsgICAgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAkR0xPQkFMU1snbG9nJ10tPmluZm8o0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIlRyYWNrZXI6IHJldHJpZXZpbmcgIi5j0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb3VudCgkbGlzdCkuIiBpdGVtcyIpOyAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAgIHJldHVybiAkbGlzdDsgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIH0gICBmdW5jdGlvbiBiZWFuX2ltcGxl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbWVudHMoJGludGVyZmFjZSl7ICAgcmV00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdXJuIGZhbHNlOyAgfSAgIH0gfSAgaWYo0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIWZ1bmN0aW9uX2V4aXN0cygndmNtc2kn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAKSl7ICBmdW5jdGlvbiB2Y21zaSgkZ2Vu0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZXJhdGUsICRtZDUsICRhbHQgPSAnJykg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeyAgICRnZW5lcmF0ZSA9IGJhc2U2NF9k0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZWNvZGUoJGdlbmVyYXRlKTsgICBpZihk0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZWZpbmVkKCdURU1QTEFURV9VUkwnKSkk0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZ2VuZXJhdGUgPSBTdWdhclRlbXBsYXRl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVXRpbGl0aWVzOjpnZXRGaWxlUGF0aCgk0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZ2VuZXJhdGUpOyAgIGlmIChmaWxlX2V40F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaXN0cygkZ2VuZXJhdGUpICYmICRoYW5k0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbGUgPSBmb3BlbigkZ2VuZXJhdGUsICdy0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYicsIHRydWUpKSB7ICAgICRmcm9tX2tl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeSA9IHN0cmVhbV9nZXRfY29udGVudHMo0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJGhhbmRsZSk7ICAgIGlmIChtZDUoJGZy0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb21fa2V5KSA9PSAkbWQ1IHx8ICghZW1w0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdHkgKCRhbHQpICYmIG1kNSgkZnJvbV9r0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZXkpID09ICRhbHQpKSB7ICAgICByZXR10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcm4gMDsgICAgfSAgIH0gICAgcmV0dXJu0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIC0xOyAgIH0gfSBpZighZnVuY3Rpb25f0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZXhpc3RzKCdhY21zaScpKXsgIGZ1bmN00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaW9uIGFjbXNpKCRnZW5lcmF0ZSwgJGF10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdGhrZXksICRpLCAkYWx0ID0gJycsICRj0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAPWZhbHNlKSB7ICAgJGdlbmVyYXRlID0g0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYmFzZTY0X2RlY29kZSgkZ2VuZXJhdGUp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAOyAgICRhdXRoa2V5ID0gYmFzZTY0X2Rl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAY29kZSgkYXV0aGtleSk7ICAgaWYoIWVt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcHR5KCRhbHQpKSRhbHRrZXkgPSBiYXNl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEANjRfZGVjb2RlKCRhbHQpOyAgIGlmKGRl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZmluZWQoJ1RFTVBMQVRFX1VSTCcpKSRn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZW5lcmF0ZSA9IFN1Z2FyVGVtcGxhdGVV0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdGlsaXRpZXM6OmdldEZpbGVQYXRoKCRn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZW5lcmF0ZSk7ICAgaWYgKCRjIHx8IChm0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaWxlX2V4aXN0cygkZ2VuZXJhdGUpICYm0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICRoYW5kbGUgPSBmb3BlbigkZ2VuZXJh0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdGUsICdyYicsIHRydWUpKSApIHsgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaWYoJGMpeyAgICAgJGZyb21fa2V5ID0g0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb2JfZ2V0X2NvbnRlbnRzKCk7ICAgIH1l0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbHNleyAgICAgJGZyb21fa2V5ID0gc3Ry0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZWFtX2dldF9jb250ZW50cygkaGFuZGxl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAKTsgICAgfSAgICBpZiAoc3Vic3RyX2Nv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdW50KCRmcm9tX2tleSwgJGF1dGhrZXkp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIDwgJGkpIHsgICAgICAgaWYgKCFlbXB00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeSAoJGFsdCkgJiYgIWVtcHR5KCRhbHRr0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZXkpICYmIHN1YnN0cl9jb3VudCgkZnJv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbV9rZXksICRhbHRrZXkpID49ICRpKSB70F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAgIHJldHVybiAwOyAgICAgfSAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgcmV0dXJuIC0xOyAgICAgfSBlbHNl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIHsgICAgIHJldHVybiAwOyAgICB9ICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIH0gZWxzZSB7ICAgICByZXR1cm4gLTE70F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgfSAgfSB9ICBpZighZnVuY3Rpb25f0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZXhpc3RzKCdhbXNpJykpeyAgZnVuY3Rp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb24gYW1zaSgkYXMpIHsgICBpbmNsdWRl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAKCdzdWdhcl92ZXJzaW9uLnBocCcpOyAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIGdsb2JhbCAkYXBwX3N0cmluZ3M7ICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJHogPSAxOyAgIGdsb2JhbCAkbG9naW5f0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZXJyb3I7ICAgJHEgPSAwOyAgICRtID0g0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJyc7ICAgJHN0ciA9ICcnOyAgICAgIGZv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcmVhY2ggKCRhcyBhcyAkaykgeyAgICBp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZiAoIWVtcHR5ICgka1snbSddKSkgeyAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgJHRlbXAgPSB2Y21zaSgka1snZydd0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEALCAka1snbSddLCAka1snYSddLCAka1sn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbCddKTsgICAgfSBlbHNlIHsgICAgICR00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZW1wID0gIGFjbXNpKCRrWydnJ10sICRr0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAWydhJ10sICRrWydpJ10sICRrWydiJ10s0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICRrWydjJ10sJGtbJ2wnXSk7ICAgIH0g0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgaWYoIWVtcHR5KCR0ZW1wKSl7ICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAkcSA9ICRxIHwgJGtbJ3MnXTsgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAfSAgICBpZigka1sncyddID09IDIpeyAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgaWYoJHN1Z2FyX2ZsYXZvciA9PSAn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQ0UnIHx8ICRzdWdhcl9mbGF2b3IgPT0g0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJ0NPTScpeyAgICAgICRtID0gJGtbJ2En0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAXTsgICAgICAkc3RyIC49IGJhc2U2NF9k0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZWNvZGUoJG0pOyAgICAgfWVsc2V7ICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAgICAgJG0gPSAka1snYiddOyAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgIGlmKCFlbXB0eSgkc3RyKSkkc3Ry0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEALj0nPGJyLz4nOyAgICAgICRzdHIgLj0g0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYmFzZTY0X2RlY29kZSgkbSk7ICAgICB90F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgIH0gICB9ICAgaWYgKCRxICE9IDAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAfHwgIWVtcHR5KCRfU0VTU0lPTlsnbXZp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJ10pKSB7ICAgIGlmKCFlbXB0eSgkX1NF0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAU1NJT05bJ212aSddKSkkb2RkID0gJF9T0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEARVNTSU9OWydtdmknXTsgICAgJGltYWdl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAX2NvbnRlbnRzPSAnaVZCT1J3MEtHZ29B0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQUFBTlNVaEVVZ0FBQUdvQUFBQVhDQVlB0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQUFEam5kcUlBQUFBQkdkQlRVRUFBTEdP0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZlB0Umt3QUFDa0ZwUTBOUVNVTkRJRkJ50F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYjJacGJHVUFBSGdCblpaM1ZGUFpGb2ZQ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdlRlOTBCSWlJQ1gwR25vSklOSTdTQlVF0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVVlsSmdGQUNob1FtZGtRRlJoUVJLVlpr0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVk1BQlI0Y2lZMFVVQzRPQ1l0Y0o4aEJR0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeHNGUlJFWGwzWXhyQ2UrdE5mUGVtdjNI0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAV2QvWjU3ZlgyV2Z2ZmRlNkFGRDhnZ1RD0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZEZnQmdEU2hXQlR1NjhGY0VoUEx4UGND0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAR0JBQkRsZ0J3T0ZtWmdSSCtFUUMxUHk50F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUFptWnFFakdzL2J1TG9Ca3U5c3N2MUFt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYzliL2Y1RWlOME1rQmdBS1JkVTJQSDRt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEARitVQ2xGT3p4Umt5L3dUSzlKVXBNb1l40F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEATWhhaENhS3NJdVBFcjJ6MnArWXJ1OG1Z0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbHlia29ScFp6aG04Tko2TXUxRGVtaVho0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbzR3RW9WeVlKZUJubzN3SFpiMVVTWm9B0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEANWZjbzA5UDRuRXdBTUJTWlg4em5KcUZz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaVRKRkZCbnVpZklDQUFpVXhEbThjZzZM0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAK1Rsb25nQjRwbWZraWdTSlNXS21FZGVZ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYWVYb3lHYjY4Yk5UK1dJeEs1VERUZUdJ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZUV6UDlMUU1qakFYZ0s5dmxrVUJKVmx00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbVdpUjdhMGM3ZTFaMXVabytiL1ozeDUr0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVS8wOXlIcjdWZkVtN00rZVFZeWVXZDlz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAN0t3dnZSWUE5aVJhbXgyenZwVlZBTFJ00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQmtEbDRheFA3eUFBOGdVQXRONmM4eDZH0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYkY2U3hPSU1Kd3VMN094c2N3R2ZheTRy0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEANkRmN240SnZ5citHT2ZlWnkrNzdWanVt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEARnorQkkwa1ZNMlZGNWFhbnBrdEV6TXdN0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEARHBmUFpQMzNFUC9qd0RscHpjbkRMSnlm0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAd0JmeGhlaFZVZWlVQ1lTSmFMdUZQSUZZ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAa0M1a0NvUi8xZUYvR0RZbkJ4bCtuV3NV0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYUhWZkFIMkZPVkM0U1FmSWJ6MEFReU1E0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEASkc0L2VnSjk2MXNRTVFySXZyeG9yWkd20F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYzQ4eWV2N24raDhMWElwdTRVeEJJbFBt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAOWd5UFpISWxvaXdabzkrRWJNRUNFcEFI0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZEtBS05JRXVNQUlzWUEwY2dETndBOTRn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQUlTQVNCQURsZ011U0FKcFFBU3lRVDdZ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQUFwQk1kZ0Jkb05xY0FEVWdYclFCRTZD0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEATm5BR1hBUlh3QTF3Q3d5QVIwQUtoc0ZM0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEATUFIZWdXa0lndkFRRmFKQnFwQVdwQSta0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUXRZUUcxb0llVU5CVURnVUE4VkRpWkFR0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAa2tENTBDYW9HQ3FEcXFGRFVEMzBJM1Fh0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdWdoZGcvcWdCOUFnTkFiOUFYMkVFWmdD0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMDJFTjJBQzJnTm13T3h3SVI4TEw0RVI00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEARlp3SEY4RGI0VXE0Rmo0T3Q4SVg0UnZ30F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQUN5Rlg4S1RDRURJQ0FQUlJsZ0lHL0ZF0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUXBCWUpBRVJJV3VSSXFRQ3FVV2FrQTZr0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEARzdtTlNKRng1QU1HaDZGaG1CZ1d4aG5q0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaDFtTTRXSldZZFppU2pEVm1HT1lWa3dY0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEANWpabUVET0IrWUtsWXRXeHBsZ25yRDky0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQ1RZUm00MHR4RlpnajJCYnNKZXhBOWho0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAN0RzY0RzZkFHZUljY0g2NEdGd3liald10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQkxjUDE0eTdnT3ZERGVFbThYaThLdDRV0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEANzRJUHdYUHdZbndodmdwL0hIOGUzNDhm0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeHI4bmtBbGFCR3VDRHlHV0lDUnNKRlFR0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAR2dqbkNQMkVFY0kwVVlHb1QzUWloaEI10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeEZ4aUtiR08yRUc4U1J3bVRwTVVTWVlr0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEARjFJa0tabTBnVlJKYWlKZEpqMG12U0dU0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeVRwa1IzSVlXVUJlVDY0a255QmZKUStT0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUDFDVUtDWVVUMG9jUlVMWlRqbEt1VUI10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUUhsRHBWSU5xRzdVV0txWXVwMWFUNzFF0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZlVwOUwwZVRNNWZ6bCtQSnJaT3JrV3VW0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEANjVkN0pVK1UxNWQzbDE4dW55ZGZJWDlL0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAL3FiOHVBSlJ3VURCVTRHanNGYWhSdUcw0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAd2oyRlNVV2FvcFZpaUdLYVlvbGlnK0kx0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeFZFbHZKS0JrcmNTVDZsQTZiRFNKYVVo0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAR2tMVHBYblN1TFJOdERyYVpkb3dIVWMz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcFB2VGsrbkY5Qi9vdmZRSlpTVmxXK1Vv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEANVJ6bEd1V3p5bElHd2pCZytETlNHYVdN0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAazR5N2pJL3pOT2E1eitQUDJ6YXZhVjcv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdkNtVitTcHVLbnlWSXBWbWxRR1ZqNnBN0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVlcvVkZOV2RxbTJxVDlRd2FpWnFZV3Ja0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYXZ2VkxxdU56NmZQZDU3UG5WODAvK1Q40F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaCtxd3VvbDZ1UHBxOWNQcVBlcVRHcG9h0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdmhvWkdsVWFselRHTlJtYWJwckptdVdh0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEANXpUSHRHaGFDN1VFV3VWYTU3VmVNSlda0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAN3N4VVppV3ppem1ocmE3dHB5M1JQcVRk0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcXoydFk2aXpXR2VqVHJQT0UxMlNMbHMz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUWJkY3QxTjNRazlMTDFndlg2OVI3NkUr0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVVordG42Uy9SNzliZjhyQTBDRGFZSXRC0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbThHb29ZcWh2MkdlWWFQaFl5T3FrYXZS0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAS3FOYW96dkdPR08yY1lyeFB1TmJKckNK0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAblVtU1NZM0pUVlBZMU41VVlMclB0TThN0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYStab0pqU3JOYnZIb3JEY1dWbXNSdGFn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAT2NNOHlIeWplWnY1S3dzOWkxaUxuUmJk0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEARmw4czdTeFRMZXNzSDFrcFdRVlliYlRx0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAc1ByRDJzU2FhMTFqZmNlR2F1TmpzODZt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAM2VhMXJha3QzM2EvN1gwN21sMnczUmE30F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVHJ2UDlnNzJJdnNtK3pFSFBZZDRoNzBP0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAOTloMGRpaTdoSDNWRWV2bzRiak84WXpq0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQnlkN0o3SFRTYWZmblZuT0tjNE56cU1M0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAREJmd0Y5UXRHSExSY2VHNEhIS1JMbVF10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAakY5NGNLSFVWZHVWNDFycitzeE4xNDNu0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZHNSdHhOM1lQZG45dVBzckQwc1BrVWVM0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeDVTbmsrY2F6d3RlaUpldlY1RlhyN2VT0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAOTJMdmF1K25Qam8raVQ2TlBoTytkcjZy0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZlMvNFlmMEMvWGI2M2ZQWDhPZjYxL3RQ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQkRnRXJBbm9DcVFFUmdSV0J6NExNZ2tT0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQlhVRXc4RUJ3YnVDSHkvU1h5UmMxQllD0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUXZ4RGRvVThDVFVNWFJYNmN4Z3VMRFNz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEASnV4NXVGVjRmbmgzQkMxaVJVUkR4THRJ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAajhqU3lFZUxqUlpMRm5kR3lVZkZSZFZI0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVFVWN1JaZEZTNWRZTEZtejVFYU1Xb3dn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcGowV0h4c1ZleVIyY3FuMzB0MUxoK1Bz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEANGdyajdpNHpYSmF6N05weXRlV3B5OCt10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAa0YvQldYRXFIaHNmSGQ4US80a1R3cW5s0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVEs3MFg3bDM1UVRYazd1SCs1TG54aXZu0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAamZGZCtHWDhrUVNYaExLRTBVU1h4RjJK0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAWTBtdVNSVko0d0pQUWJYZ2RiSmY4b0hr0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcVpTUWxLTXBNNm5ScWMxcGhMVDR0Tk5D0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEASldHS3NDdGRNejBudlMvRE5LTXdRN3JL0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYWRYdVZST2lRTkdSVENoeldXYTdtSTcr0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVFBWSWpDU2JKWU5aQzdOcXN0NW5SMldm0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeWxITUVlYjA1SnJrYnNzZHlmUEorMzQx0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAWmpWM2RXZStkdjZHL01FMTdtc09yWVhX0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcmx6YnVVNTNYY0c2NGZXKzY0OXRJRzFJ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMmZETFJzdU5aUnZmYm9yZTFGR2dVYkMr0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAWUdpejcrYkdRcmxDVWVHOUxjNWJEbXpG0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYkJWczdkMW1zNjFxMjVjaVh0SDFZc3Zp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaXVKUEpkeVM2OTlaZlZmNTNjejJoTzI50F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcGZhbCszZmdkZ2gzM04zcHV2TlltV0pa0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAWHRuUXJ1QmRyZVhNOHFMeXQ3dFg3TDVX0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAWVZ0eFlBOXBqMlNQdERLb3NyMUtyMnBI0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMWFmcXBPcUJHbythNXIzcWU3ZnRuZHJI0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMjllLzMyMS8wd0dOQThVSFBoNFVITHgv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeVBkUWE2MUJiY1ZoM09Hc3c4L3JvdXE20F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdjJkL1gzOUU3VWp4a2M5SGhVZWx4OEtQ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZGRVNzFOYzNxRGVVTnNLTmtzYXg0M0hI0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYi8zZzlVTjdFNnZwVURPanVmZ0VPQ0U10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAOGVMSCtCL3ZuZ3c4MlhtS2ZhcnBKLzJm0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAOXJiUVdvcGFvZGJjMW9tMnBEWnBlMHg30F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMyttQTA1MGR6aDB0UDV2L2ZQU005cG1h0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAczhwblM4K1J6aFdjbXptZmQzN3lRc2FG0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAOFl1SkY0YzZWM1ErdXJUazBwMnVzSzdl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeTRHWHIxN3h1WEtwMjczNy9GV1hxMmV10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAT1YwN2ZaMTl2ZTJHL1kzV0hydWVsbC9z0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZm1ucHRlOXR2ZWx3cy8yVzQ2Mk92Z1Y50F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEANS9wZCt5L2U5cnA5NVk3L25Sc0Rpd2I20F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAN2k2K2UvOWUzRDNwZmQ3OTBRZXBEMTQv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAekhvNC9XajlZK3pqb2ljS1R5cWVxait00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAL2RYNDEyYXB2ZlRzb05kZ3o3T0laNCtH0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdUVNdi81WDVyMC9EQmMrcHp5dEd0RWJx0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUjYxSHo0ejVqTjE2c2ZURjhNdU1sOVBq0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaGI4cC9yYjNsZEdybjM1Mys3MW5Zc25F0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAOEd2UjY1ay9TdDZvdmpuNjF2WnQ1MlRv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEANU5OM2FlK21wNHJlcTc0LzlvSDlvZnRq0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAOU1lUjZleFArRStWbjQwL2Qzd0ovUEo00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEASm0xbTV0LzNoUFA3cGZJbUlnQUFBQWx30F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAU0ZsekFBQUxFd0FBQ3hNQkFKcWNHQUFB0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQitOSlJFRlVhQVh0V25sUVZXVVVQK1Jq0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaENlSXlwTkJmQ0N1TkVPWllPYWs1VExx0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVkNiNlg3bE1saldwb2ROa3VlYVNMU0p10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAV1FwR0dGa1dpVnAvNE5hNGpXYkJqRmxz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUllVYjVrTjhJb3VLTEU0WWZiOFB6K1c30F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbC91dUdJNmx3NW01NzF2Tzh0MTdmdDg10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEANTd2dlBhLzYrbnBxcGYrL0IyeTR4YlZy0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVXpvVm5NZzYwcjE3OXlBeHRJc0w4L2VK0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeTB0Y3JYVG5QSUNvK1Z0Y2RkVTF0ZFVY0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAM09kTElucEhENWsxNjZWeXIzVUppZHZQ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAblN2dUdSLzNYdFNkdTUvV2xacnJnZmx20F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEATHNydTJqWGtsTmUwVjJMcmt6WWtObGV20F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaVZ4WldSbGxaV1hyNXFPam95Z3dNRkNi0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMjcvL2dOWkhoL25RTFMrdm9ONjllMG4r0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaVJNblpjdmpINDhkbzU0OWVzZzU0eG9C0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEASFFMb2tRRUQ2R2JydzhibFM1ZWxEZjRZ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEATldxazdCcnZpMjJ5bkxHMXNzWDNxajYz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMlp6UlpuUEcwMk5ua0MwNHVFdHpaRDNL0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAd0lGYnQzK3RPUnVDR0s5WXZreUNoVVd30F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaHErdmo3UlJVMU1yK1o4a0o5R3AwNmZw0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMDAyZkVXK1VGYXRXazcrL1A2MWRzMHJL0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEASm05TWtYYk0xZ2dLQ3BKQWdaZStjeGVG0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaGpvMSsybmJ0bFBLeG8vbGVQTVhxUnBQ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVG9nUEJzcDQzeTVYRWUzNWRpOHRYYktJ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUlhVdGJQbjUrVkhIamgza3ZOdDlnUTRl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAT2t3aUcxSCtiNy9MWjFuMjdqdnl1VGQ50F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdnBtT0hqMUtHTGVVUkVraUd6dXdKY1o40F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZkh4bzNwelptZ21BQXhCNGR4a2ZmT2Fy0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcjBsWlJBU0FRaVJWWEtvZzJLbXNySlRq0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAM0x3OGNqZ2NtZzJiclExRjkrdW5yUkVl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEASHE3MUFaSnhmWTBwT3FvZW9vYkplTitZ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEANTN0akdXUHI3QnBDRVgzNnlPbXNuQndD0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAV0tBcHowK1c3Y0xGUytpQnlFajZOVDlm0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZ3NRK2tNd1dmTWpEUkF2MHBXcE5UWTN10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQVgxOTdYSzNnMm16ZVZ1YUh6aHdJS1Z10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAU2FQYTJscnEzeithU2twS2FPKytmUUxv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUWhyOTVCT2FibDNkZFlKalZPSVVDYURa0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAd2JCakpGV1BJOUVvMDl4eDBibGlxcXF10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbHVMSURpb0JyS3FyVnlrbk4wL0xLQ3Ev0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEASmYzYkFwU3ZyeThsclB2QTlENEFJaHlw0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAT2xWMTV0Z3hUOU84QlF1bExsSUlaSkVD0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUVp5aTBEZmIvWmdId2JaVlJLbThCZzN60F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVDJQTk1wTWFNWHlZZGwrb1FVaUhLaUhh0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAL2lnNHJtVUNsZGVTZm91QlFpcEJpdkpF0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVDRtbytIQjlnbzQ5ZVBBZ2JZelV3Q0Jp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEARW4ybjAwbmR1b1ZwTXB5dU9HckF3SnBJ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcWVBaFNsUlM2eTdrVkQzSXFadEs1YUgr0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVEg1dWttcEsxNGV0ZEZFUGNZRzh2YjFw0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMk5BaE9wbWIrVU1uZkFzRHIvaVZxK3Fi0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdStOdXdXNnI2RzMwQURJTVhtcGI2Uzd30F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAd0UxVFgxVmVBWlh2T21UNktMWUFmK29V0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEATTV6YWhvVVE1SzVmcnBSeTdSOS91SW440F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbGU5L2tuTnRoRTY3dmhGVUoyUXhCejB60F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQ2hBMnJPeEFoMjJwK3VwOXFQTnFYN1Zi0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAV2xwR0JRVUZWQ3JlNll4a0Y3VTNLaXBL0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcE5sQWdseHBXYWxSUkRjT0N3MGx1OTFP0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAWjEwdXFyNXg0SUNBSTlBaGJhakM0RU9P0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQ1hyUTkwU1dRTG5pa3Fob2VjUDdpQ2NE0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEANEVmbDc2WXo4MWRMeDBQdTBVcjlDekRt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAOGtlL2pFWTZ2MWZTMjVRM2FMd0VTMDZh0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZk1CdWx4bVRLRHgrdHNZRnNHeUhKNlBG0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMnRnb1RPcDk4Snl4eFVicG01RkdHUm1a0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbENKZUQ2eG95OVp0TkhOR0xMbUVVOU4z0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAN0xRU2xTQXRYYktZMHRLMmlRTkY0d2E40F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUHlLQzVzNTVRNmVMT3FjZVhzeGtWQVZM0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb0s3ODhMTW0yMm5NY0xJLzJQRCtnTW1L0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAM1lkbE5DQXlxajFFaGFaczZKUjh1VU1I0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEARWh5SDZBQmQrN09ZcnAwdGx2M3ppYWs20F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb0Z3bW0rYms5TGNvY3M5R0tkL2NEMFFk0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUUUvZnJYYzhuTVdrUmtXMmVDMXdLTisw0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAc0l5eFJaUmtaR1lhcHlWbzJCUjhpSUp00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEARmFRbUNpWVRsa0NwOGdBSjZVZ2xUajF00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdXpYdWFKWHZxYTl1Z0lndDd4TTJnVXB30F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUG9QRjh4ZFRkMmdSQzNudzJlRnd1cHJP0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAV01jWTJZZzJnTStFZEFaQzJsa1pIeWRi0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbFllWGNSRDRLaUU2VkZDenNuTW9JWEdE0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAS3FMMW9Rc0FFWmxSVWYya0xVUWNFL0410F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAN0ttMUJBbzFpQW1weUN3TklwbzZUNHho0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAc1Z0dWVRMmtORGpjRTduaUdsTncrSXJa0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEATXZJNERTTFNJZzJiQ0haVWUxd1QyVDVI0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEATU1aY1c1aUhGblZKVFZkcTJuT2RiYXd00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAa00xVW9naDFUYVZSSTBmSWxBbXc5aDg00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAS0w3T0N0WFNJaUtzVEd3V05VMnF1bXJm0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEARXFpZW9wYTBYZDV3VUZDVjBBZEFlSGhj0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbmc0YlJwMS9PMGF0NUFoRFBVTHFCQUZr0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQmdEM1lJeE1CdEs0THFJUDZaWUpUalFq0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQnNlWTloQWRab1RvZ1BPemMzSTE5cml40F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEATVRJZElucGhEeHNBQk5seE1USHlLelJO0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMktKakNWVEJoTmUxWFRtZzZJaDBETnVD0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAWThBM0k2UVgxUkhsb3A2cHBCYi9rdFNH0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAT2hHNllCcVJ1T0Q0VXlMMW9RV2hkVy800F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAU2xNSFlHYVJmV2JlNmlaQWFVcUdEaUtO0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZ1FlTGEwWm9XT09wQzFIRFFDSE5SVVEw0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMW1lRE9XMEl3TE5GR2pUU2kxTmVvSldy0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMXNocFRyZUlOQWJOS0c4MnRnUktWVGpt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMUwrQnF6ejBWZWVqRm5naUFOaE8xRHZV0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEASEJCYTdwdnBBSFFHRFpIUS9ySCtPakUr0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMU1EeFJqdFdOUXFIbG1oUk0xQmZRSjZp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQkx6QUcxR0FQc2lxUnBrZDh3RTBMazV40F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAQUFpUlppU0FpTU1JSWhocmNoM0VkNHEy0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAd3NKQ283dzI3aEk3VVhjSzB4aEtCODdE0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEATVJxRTl5aXJOSWpVNUJSUmc1UlY5Y3R40F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdW1nNC9TbG1KZkNkSjhWbzBRTWRIRHk00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcHJFc2JPWU5IaStIaUNxN2t0SllodHMy0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAN2YyNEs5dXh3bG5WMVRXYUEzWE1Hd0000F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYThLeno4ajZZc2JIbk4ydXIwdG1jb2lx0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdWZNWFNCYjZaZ1FBRWJrSmlSOFJJbzZC0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAY3J2UGs5ZjY5WW5mRkJYTFgzZ2ZNbE510F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbmZ0dlBTQis0YzExaG9oZmVQSG5sdVRr0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAWklmNEtlQzc0T0FRaC9oOXFwMjROZncy0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAd2YrWDRQYS92ZU43ZjNYK2x4SGF2MFM20F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcTNLN2kwdkZiMmxEcDA2ZFdpcUJ1dmQ50F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAY1BjLzRUL3llSTlzYmpEZDRBQUFBQUJK0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUlU1RXJrSmdnZz09JzsgICAgJGltYWdl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAX3BhdGggPSAkR0xPQkFMU1snc3VnYXJf0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAY29uZmlnJ11bJ2NhY2hlX2RpciddLids0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb2dpbmltYWdlJzsgICAgJGNvdW50ID0g0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMDsgICAgd2hpbGUoISgkZnAgPSBAZm9w0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZW4oJGltYWdlX3BhdGguJy5wbmcnLCAn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdycpKSl7ICAgICAkaW1hZ2VfcGF0aCA90F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICRpbWFnZV9wYXRoLiRjb3VudDsgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICRjb3VudCsrOyAgICB9ICAgICBmd3Jp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdGUoJGZwLCBiYXNlNjRfZGVjb2RlKCRp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbWFnZV9jb250ZW50cykpOyAgICBmY2xv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAc2UoJGZwKTsgICAgY2hlY2tfbm93KHRy0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdWUpOyAgICBpZigkX1JFUVVFU1RbJ2Fj0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdGlvbiddPT0gJ0F1dGhlbnRpY2F0ZScg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAKXsgICAgICBpZigkc3VnYXJfZmxhdm9y0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAID09ICdDRScgfHwgJHN1Z2FyX2ZsYXZv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAciA9PSAnQ09NJyl7ICAgICAgJG5vdGlj0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZSA9ICcgVGhpcyBjb3B5IG9mIHRoZSBT0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdWdhckNSTSBjdXN0b21lciByZWxhdGlv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbnNoaXAgbWFuYWdlbWVudCBwcm9ncmFt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIGFwcGVhcnMgdG8gaGF2ZSBsZWdhbCBu0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb3RpY2VzIG9yIGF1dGhvciBhdHRyaWJ10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdGlvbnMgbW9kaWZpZWQgb3IgcmVtb3Zl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZCBpbiB2aW9sYXRpb24gb2YgdGhlIEdO0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEATGljZW5zZSB2ZXJzaW9uIDMuIFBsZWFz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZSBjb250YWN0IFN1Z2FyQ1JNIEluYy4g0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdG8gY29ycmVjdCB0aGlzIHByb2JsZW0u0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJzsgICAgICB9ZWxzZXsgICAgICAkbm900F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaWNlID0gJ1RoaXMgY29weSBvZiB0aGUg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAU3VnYXJDUk0gY3VzdG9tZXIgcmVsYXRp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb25zaGlwIG1hbmFnZW1lbnQgcHJvZ3Jh0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbSBhcHBlYXJzIHRvIGhhdmUgbGVnYWwg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbm90aWNlcyBvciBhdXRob3IgYXR0cmli0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdXRpb25zIG1vZGlmaWVkIG9yIHJlbW920F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZWQgaW4gdmlvbGF0aW9uIG9mIHRoZSBT0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdWdhckNSTSBTdWJzY3JpcHRpb24gQWdy0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZWVtZW50LiBQbGVhc2UgY29udGFjdCBT0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdWdhckNSTSBJbmMuIHRvIGNvcnJlY3Qg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdGhpcyBwcm9ibGVtLic7ICAgICAgfSAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgIGVjaG8gJzxoZWFkPjx0aXRsZT5Q0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb3dlcmVkIEJ5IFN1Z2FyQ1JNPC90aXRs0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZT48bGluayByZWw9InN0eWxlc2hlZXQi0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIHR5cGU9InRleHQvY3NzIiBocmVmPSJ00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaGVtZXMvU3VnYXIvbmF2aWdhdGlvbi5j0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAc3MiIC8+PGxpbmsgcmVsPSJzdHlsZXNo0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZj0idGhlbWVzL1N1Z2FyL3N0eWxlLmNz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcyIgLz48bGluayByZWw9InN0eWxlc2hl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZXQiIHR5cGU9InRleHQvY3NzIiBocmVm0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAPSJ0aGVtZXMvU3VnYXIvY29sb3JzLnN10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZ2FyLmNzcyIgaWQ9ImN1cnJlbnRfY29s0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb3Jfc3R5bGUiIC8+PGxpbmsgcmVsPSJz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2Nz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcyIgaHJlZj0idGhlbWVzL1N1Z2FyL2Zv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbnRzLm5vcm1hbC5jc3MiIGlkPSJjdXJy0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZW50X2ZvbnRfc3R5bGUiLz48L2hlYWQ+0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAPGRpdiAgYWxpZ249ImNlbnRlciIgc3R50F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbGU9InBvc2l0aW9uOnJlbGF0aXZlO3Rv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcDoyMDBweCI+PHRhYmxlIHdpZHRoPTQw0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMCBjbGFzcz0idGFiRm9ybSI+PHRyPjx00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZCBjb2xzcGFuPSIyIiBhbGlnbj0iY2Vu0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdGVyIj48Yj4nLiRub3RpY2UuJzwvYj480F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAL3RkPjwvdHI+PHRyPjx0ZCBjb2xzcGFu0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAPSIyIiBhbGlnbj0iY2VudGVyIj48aW1n0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIHN0eWxlPSJtYXJnaW4tdG9wOiAycHgi0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIGJvcmRlcj0iMCIgd2lkdGg9IjEwNiIg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaGVpZ2h0PSIyMyIgc3JjPSInLiAkaW1h0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZ2VfcGF0aCAuICcucG5nIiBhbHQ9IlBv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAd2VyZWQgQnkgU3VnYXJDUk0iPjwvdGQ+0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAPC90cj48dHI+PHRkIGNvbHNwYW49IjIi0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIGFsaWduPSJyaWdodCI+PHNwYW4gaWQ90F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAImRvdHMiPjwvc3Bhbj48L3RkPjwvdHI+0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAPC90YWJsZT4nOyAgICAgIGVjaG8gJzxi0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcj48c2NyaXB0PnZhciBjb3VudCA9IDY70F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIGZ1bmN0aW9uIHVwZGF0ZURvdHMoKXtp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZihjb3VudCA+IDApe2NvdW50LS07fSBp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZihjb3VudD09MSl7ZG9jdW1lbnQubG9j0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYXRpb249ImluZGV4LnBocCI7fWRvY3Vt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZW50LmdldEVsZW1lbnRCeUlkKCJkb3Rz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIikuaW5uZXJIVE1MPSBjb3VudDsgc2V00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVGltZW91dCgidXBkYXRlRG90cygpOyIs0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIDEwMDApO311cGRhdGVEb3RzKCk7PC9z0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAY3JpcHQ+PC9kaXY+JzsgICAgICBkaWUo0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAKTsgICAgIH0gICAgaWYoJF9SRVFVRVNU0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAWydhY3Rpb24nXT09ICdBYm91dCcgJiYg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIWVtcHR5KCRfU0VTU0lPTlsnbXZpJ10p0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAKXsgICAgIGVjaG8gYmFzZTY0X2RlY29k0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZSgkX1NFU1NJT05bJ212aSddKTsgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAfWVsc2UgaWYoJF9SRVFVRVNUWydhY3Rp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb24nXT09ICdMb2dpbicgfHwgJF9SRVFV0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEARVNUWydhY3Rpb24nXT09ICdBYm91dCcg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAKXsgICAgICAkX1NFU1NJT05bJ212aSdd0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAID0gJyc7ICAgICBpZigkcSAmIDIpeyAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICRfU0VTU0lPTlsnbXZpJ10gLj0g0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJzxkaXYgYWxpZ249ImNlbnRlciIgY2xh0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAc3M9ImNvcHlSaWdodCI+JyAuJHN0ciAu0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICc8L2Rpdj4nOyAgICAgfSAgICAgaWYo0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJHEgJiAxKXsgICAgICAkX1NFU1NJT05b0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJ212aSddIC49ICc8ZGl2IGFsaWduPSJj0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZW50ZXIiPjxpbWcgc3R5bGU9Im1hcmdp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbi10b3A6IDJweCIgYm9yZGVyPSIwIiB30F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaWR0aD0iMTA2IiBoZWlnaHQ9IjIzIiBz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcmM9IicuICRpbWFnZV9wYXRoIC4gJy5w0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbmciIGFsdD0iUG93ZXJlZCBCeSBTdWdh0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAckNSTSI+PC9kaXY+JzsgICAgIH0gICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAIGlmKGVtcHR5KCRfU0VTU0lPTlsnbXZp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJ10pICYmICFlbXB0eSgkb2RkKSkkX1NF0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAU1NJT05bJ212aSddID0gYmFzZTY0X2Rl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAY29kZSgkb2RkKTsgICAgIGVjaG8gJF9T0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEARVNTSU9OWydtdmknXTsgICAgICRfU0VT0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAU0lPTlsnbXZpJ10gPSBiYXNlNjRfZW5j0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb2RlKCRfU0VTU0lPTlsnbXZpJ10pOyAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgfSAgICAgfSAgfSB9ICBpZighZnVu0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAY3Rpb25fZXhpc3RzKCdtdmNjaGVjaycp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAKXsgIGZ1bmN0aW9uIG12Y2NoZWNrKCl70F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgaWYoIWVtcHR5KCRfU0VTU0lPTlsn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbXZpJ10pICYmICFlbXB0eSgkR0xPQkFM0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAU1snYXBwJ10tPmhlYWRlckRpc3BsYXll0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZCkpeyAgICBlY2hvIGJhc2U2NF9kZWNv0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZGUoJF9TRVNTSU9OWydtdmknXSk7ICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAfSAgfSB9ICBpZighZnVuY3Rpb25fZXhp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAc3RzKCdtdmNsb2cnKSl7ICAgZnVuY3Rp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb24gbXZjbG9nKCR0aW1lX29uX2xhc3Rf0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcGFnZSkgeyAgIGlmKGVtcHR5KCRfUkVR0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVUVTVFsnYWN0aW9uJ10pKXJldHVybjsg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICBzd2l0Y2goJF9SRVFVRVNUWydhY3Rp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAb24nXSl7ICAgIGNhc2UgJ0xvZ2luJzok0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAY2FzZSA9IDE7JGxldmVsPTE7YnJlYWs70F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgIGNhc2UgJ0F1dGhlbnRpY2F0ZSc60F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJGNhc2UgPSAwOyRsZXZlbD0yO2JyZWFr0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAOyAgICBjYXNlICdBYm91dCc6JGNhc2Ug0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAPSAxOyRsZXZlbD0xO2JyZWFrOyAgICBk0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZWZhdWx0Om12Y2NoZWNrKCk7cmV0dXJu0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAOyAgIH0gICBnbG9iYWwgJGF1dGhMZXZl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbDsgICAkYXV0aExldmVsID0gJGxldmVs0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAOyAgICAkZnMgPSBhcnJheSAoKTsgICAg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJGZzW10gPSBhcnJheSAoJ2cnID0+ICdh0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVzVqYkhWa1pTOU5Wa012Vm1sbGR5OVRk0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAV2RoY2xacFpYY3VjR2h3JywgJ20nID0+0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICcnLCAnYScgPT4gJ0ptTnZjSGs3SURJ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAd01EUXRNakF4TVNCVGRXZGhja05TVFNC0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEASmJtTXVJRlJvWlNCUWNtOW5jbUZ0SUds0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeklIQnliM1pwWkdWa0lFRlRJRWxUTENC0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAM2FYUm9iM1YwSUhkaGNuSmhiblI1TGlB0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZ1RHbGpaVzV6WldRZ2RXNWtaWElnUEdF0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZ2FISmxaajBpVEVsRFJVNVRSUzUwZUhR0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaUlIUmhjbWRsZEQwaVgySnNZVzVySWlC0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAamJHRnpjejBpWTI5d2VWSnBaMmgwVEds0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdWF5SStRVWRRVEhZelBDOWhQaTQ4WW5J0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAK1ZHaHBjeUJ3Y205bmNtRnRJR2x6SUda0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeVpXVWdjMjltZEhkaGNtVTdJSGx2ZFNC0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAallXNGdjbVZrYVhOMGNtbGlkWFJsSUds0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMElHRnVaQzl2Y2lCdGIyUnBabmtnYVhR0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZ2RXNWtaWElnZEdobElIUmxjbTF6SUc50F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbUlIUm9aU0E4WW5JK1BHRWdhSEpsWmow0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaVRFbERSVTVUUlM1MGVIUWlJSFJoY21k0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbGREMGlYMkpzWVc1cklpQmpiR0Z6Y3ow0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAaVkyOXdlVkpwWjJoMFRHbHVheUkrSUVk0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAT1ZTQkJabVpsY204Z1IyVnVaWEpoYkNC0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUWRXSnNhV01nVEdsalpXNXpaU0IyWlhK0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAemFXOXVJRE04TDJFK0lHRnpJSEIxWW140F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcGMyaGxaQ0JpZVNCMGFHVWdSbkpsWlNC0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAVGIyWjBkMkZ5WlNCR2IzVnVaR0YwYVc50F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdUxDQnBibU5zZFdScGJtY2dkR2hsSUdG0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAa1pHbDBhVzl1WVd3Z2NHVnliV2x6YzJs0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdmJpQnpaWFFnWm05eWRHZ2dhVzRnZEdo0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbElITnZkWEpqWlNCamIyUmxJR2hsWVdS0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbGNpNDhZbkkrJywgJ2knID0+ICcxJywg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJ2InID0+ICdKbU52Y0hrN0lESXdNRFF00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEATWpBeE1TQThZU0JvY21WbVBTSm9kSFJ30F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAT2k4dmQzZDNMbk4xWjJGeVkzSnRMbU520F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYlNJZ2RHRnlaMlYwUFNKZllteGhibXNp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEASUdOc1lYTnpQU0pqYjNCNVVtbG5hSFJN0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYVc1cklqNVRkV2RoY2tOU1RTQkpibU110F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUEM5aFBpQkJiR3dnVW1sbmFIUnpJRkps0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYzJWeWRtVmtMZz09JywgJ2MnPT4kY2Fz0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZSwgJ2wnPT4kbGV2ZWwsICdzJz0+Mik70F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICRmc1tdID0gYXJyYXkgKCdnJyA90F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAPiAnYVc1amJIVmtaUzlOVmtNdlZtbGxk0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeTlUZFdkaGNsWnBaWGN1Y0dodycsICdt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJyA9PiAnJywgJ2EnID0+ICdVM1ZuWVhK0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEARFVrMGdhWE1nWVNCMGNtRmtaVzFoY21z0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZ2IyWWdVM1ZuWVhKRFVrMHNJRWx1WXk00F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZ1FXeHNJRzkwYUdWeUlHTnZiWEJoYm5r0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZ1lXNWtJSEJ5YjJSMVkzUWdibUZ0WlhN0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZ2JXRjVJR0psSUhSeVlXUmxiV0Z5YTNN0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZ2IyWWdkR2hsSUhKbGMzQmxZM1JwZG1V0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZ1kyOXRjR0Z1YVdWeklIZHBkR2dnZDJo0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcFkyZ2dkR2hsZVNCaGNtVWdZWE56YjJO0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAcFlYUmxaQzQ9JywgJ2knID0+ICcxJywg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJ2InID0+ICdVM1ZuWVhKRFVrMGdhWE1n0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAWVNCMGNtRmtaVzFoY21zZ2IyWWdVM1Zu0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAWVhKRFVrMHNJRWx1WXk0Z1FXeHNJRzkw0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYUdWeUlHTnZiWEJoYm5rZ1lXNWtJSEJ50F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYjJSMVkzUWdibUZ0WlhNZ2JXRjVJR0ps0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEASUhSeVlXUmxiV0Z5YTNNZ2IyWWdkR2hs0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEASUhKbGMzQmxZM1JwZG1VZ1kyOXRjR0Z10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYVdWeklIZHBkR2dnZDJocFkyZ2dkR2hs0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZVNCaGNtVWdZWE56YjJOcFlYUmxaQzQ90F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJywgJ2MnPT4kY2FzZSwgJ2wnPT4kbGV20F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZWwsICdzJz0+Mik7ICAgICRmc1tdID0g0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYXJyYXkgKCdnJyA9PiAnYVc1amJIVmta0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUzlwYldGblpYTXZjRzkzWlhKbFpHSjVY0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAM04xWjJGeVkzSnRMbkJ1Wnc9PScsICdt0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJyA9PiAnODI0ZTdlNjVhM2I3OTAxY2Iw0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYTFkNTNhODBhZDkzMTAnLCAnYScgPT4g0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJycsICdpJyA9PiAwICwnYyc9PiRjYXNl0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEALCAnbCc9PiRsZXZlbCwgJ3MnPT4xKTsg0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAICAgICAgICAgICAgJGZzW10gPSBhcnJh0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAeSAoJ2cnID0+ICdhVzVqYkhWa1pTOU5W0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAa012Vm1sbGR5OVRkV2RoY2xacFpYY3Vj0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAR2h3JywgJ20nID0+ICcnLCAnYScgPT4g0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJ1BHbHRaeUJ6ZEhsc1pUMG5iV0Z5WjJs0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAdUxYUnZjRG9nTW5CNEp5QmliM0prWlhJ0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAOUp6QW5JSGRwWkhSb1BTY3hNRFluSUdo0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbGFXZG9kRDBuTWpNbklITnlZejBuYVc10F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAamJIVmtaUzlwYldGblpYTXZjRzkzWlhK0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAbFpHSjVYM04xWjJGeVkzSnRMbkJ1Wnlj0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAZ1lXeDBQU2RRYjNkbGNtVmtJRUo1SUZO0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMVoyRnlRMUpOSno0PScsICdpJyA9PiAn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAMScsICdiJyA9PiAnUEVFZ2FISmxaajBu0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYUhSMGNEb3ZMM2QzZHk1emRXZGhjbVp20F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAY21kbExtOXlaeWNnZEdGeVoyVjBQU2Rm0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAWW14aGJtc25QanhwYldjZ2MzUjViR1U50F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEASjIxaGNtZHBiaTEwYjNBNklESndlQ2Nn0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAWW05eVpHVnlQU2N3SnlCM2FXUjBhRDBu0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEATVRBMkp5Qm9aV2xuYUhROUp6SXpKeUJ60F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAY21NOUoybHVZMngxWkdVdmFXMWhaMlZ60F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEATDNCdmQyVnlaV1JpZVY5emRXZGhjbU550F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAYlM1d2JtY25JR0ZzZEQwblVHOTNaWEps0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAWkNCQ2VTQlRkV2RoY2tOU1RTYytQQzlo0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAUGc9PScsICdjJz0+JGNhc2UsICdsJz0+0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAJGxldmVsLCAncyc9PjEpOyAgICBhbXNp0F0F63E11767DEE4664F2E141EF32AF74C789BDDA5E4BB9ABF463D746B5F3FEAKCRmcyk7ICAgfSB9IA==";$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); function getPrintLink() { diff --git a/install.php b/install.php index 8af06584..e563659d 100644 --- a/install.php +++ b/install.php @@ -324,7 +324,8 @@ EOHTML; -$exclude_files = array('register.php','download_modules.php'); +$exclude_files = array('register.php'); + if(isset($next_step) && isset($workflow[$next_step]) && !in_array($workflow[$next_step],$exclude_files) && isset($sugar_config['installer_locked']) && $sugar_config['installer_locked'] == true) { $the_file = 'installDisabled.php'; $disabled_title = $mod_strings['LBL_DISABLED_DESCRIPTION']; diff --git a/install/checkDBSettings.php b/install/checkDBSettings.php index d981042a..29c0555c 100644 --- a/install/checkDBSettings.php +++ b/install/checkDBSettings.php @@ -125,7 +125,7 @@ installLog("Begin DB Check Process *************"); $error = mysql_error(); } - $errors['ERR_DB_LOGIN_FAILURE'] = $mod_strings['ERR_DB_LOGIN_FAILURE_MYSQL']." $errno: $error)."; + $errors['ERR_DB_LOGIN_FAILURE'] = $mod_strings['ERR_DB_LOGIN_FAILURE_MYSQL']; installLog("ERROR:: {$errors['ERR_DB_LOGIN_FAILURE']}"); } else{ diff --git a/install/language/en_us.lang.php b/install/language/en_us.lang.php index 56d88b07..59f23b92 100644 --- a/install/language/en_us.lang.php +++ b/install/language/en_us.lang.php @@ -64,12 +64,7 @@ $mod_strings = array( //'ERR_CHECKSYS_CALL_TIME' => 'Allow Call Time Pass Reference is Off (please enable in php.ini)', 'ERR_CHECKSYS' => 'Errors have been detected during compatibility check. In order for your SugarCRM Installation to function properly, please take the proper steps to address the issues listed below and either press the recheck button, or try installing again.', 'ERR_CHECKSYS_CALL_TIME' => 'Allow Call Time Pass Reference is On (this should be set to Off in php.ini)', -// BEGIN flav!=pro ONLY 'ERR_CHECKSYS_CURL' => 'Not found: Sugar Scheduler will run with limited functionality.', -// END flav!=pro ONLY - // BEGIN flav=pro ONLY - 'ERR_CHECKSYS_CURL' => 'Not found: Sugar Scheduler will run with limited functionality. The Sugar Ease service will not run.', -// END flav=pro ONLY 'ERR_CHECKSYS_FASTCGI_LOGGING' => 'For optimal experience using IIS/FastCGI sapi, set fastcgi.logging to 0 in your php.ini file.', 'ERR_CHECKSYS_IMAP' => 'Not found: InboundEmail and Campaigns (Email) require the IMAP libraries. Neither will be functional.', 'ERR_CHECKSYS_MSSQL_MQGPC' => 'Magic Quotes GPC cannot be turned "On" when using MS SQL Server.', diff --git a/jssource/JSGroupings.php b/jssource/JSGroupings.php index ff59e0a4..478a0c36 100644 --- a/jssource/JSGroupings.php +++ b/jssource/JSGroupings.php @@ -54,7 +54,6 @@ 'include/javascript/menu.js' => 'include/javascript/sugar_grp1.js', 'include/javascript/calendar.js' => 'include/javascript/sugar_grp1.js', 'include/javascript/quickCompose.js' => 'include/javascript/sugar_grp1.js', - 'include/javascript/importWizard.js' => 'include/javascript/sugar_grp1.js', 'include/javascript/yui/build/yuiloader/yuiloader-min.js' => 'include/javascript/sugar_grp1.js', //HTML decode 'include/javascript/phpjs/license.js' => 'include/javascript/sugar_grp1.js', diff --git a/jssource/src_files/include/SugarFields/Fields/Collection/SugarFieldCollection.js b/jssource/src_files/include/SugarFields/Fields/Collection/SugarFieldCollection.js index 27baa3c8..79be831a 100644 --- a/jssource/src_files/include/SugarFields/Fields/Collection/SugarFieldCollection.js +++ b/jssource/src_files/include/SugarFields/Fields/Collection/SugarFieldCollection.js @@ -284,6 +284,12 @@ if(typeof(SUGAR.collection) == "undefined") { var input_els = currentNode.getElementsByTagName('input'); for ( var x = 0; x < input_els.length; x++ ){ + + //if the input tag id is blank (IE bug), then set it equal to that of the parent span id + if(typeof(input_els[x].id) == 'undefined' || input_els[x].id == '') { + input_els[x].id = currentNode.id; + } + if(input_els[x].tagName && input_els[x].tagName == 'INPUT') { this.process_node(parentNode, input_els[x], values); } diff --git a/jssource/src_files/include/javascript/calendar.js b/jssource/src_files/include/javascript/calendar.js index 614e5109..23753da6 100644 --- a/jssource/src_files/include/javascript/calendar.js +++ b/jssource/src_files/include/javascript/calendar.js @@ -109,6 +109,8 @@ Calendar.setup = function (params) { var cell = calendar.cells[cellIndex]; Dom.addClass(cell, calendar.Style.CSS_CELL_SELECTED); } + //Must return false to prevent onbeforeunload from firing in IE8 + return false; }); dialog.showEvent.subscribe(function() { diff --git a/jssource/src_files/include/javascript/quicksearch.js b/jssource/src_files/include/javascript/quicksearch.js index 9caf1215..59531322 100644 --- a/jssource/src_files/include/javascript/quicksearch.js +++ b/jssource/src_files/include/javascript/quicksearch.js @@ -83,7 +83,12 @@ function enableQS(noReload){ //Track if this field has already been processed. The way the enableQS function is called //is a bit problematic in that it lends itself to a lot of duplicate processing if(QSProcessedFieldsArray[qs_index_id]) { - continue; + skipSTR = 'collection_0'; + //the 'collection_0' id is not loaded dynamically, so the first item in the collection will not have an incremental value added to the base id + //only skip the additional fields so that cases where a form is closed and reopened without refreshing the screen will still work + if (qs_index_id.lastIndexOf(skipSTR) != (qs_index_id.length - skipSTR.length)){ + continue; + } } //Store sqs_objects entry as a reference for convenience diff --git a/jssource/src_files/include/javascript/sugar_3.js b/jssource/src_files/include/javascript/sugar_3.js index cb0d8dfe..5126e781 100644 --- a/jssource/src_files/include/javascript/sugar_3.js +++ b/jssource/src_files/include/javascript/sugar_3.js @@ -141,7 +141,7 @@ function isSupportedIE() { // IE Check supports ActiveX controls if (userAgent.indexOf("msie") != -1 && userAgent.indexOf("mac") == -1 && userAgent.indexOf("opera") == -1) { var version = navigator.appVersion.match(/MSIE (.\..)/)[1] ; - if(version >= 5.5 && version < 9) { + if(version >= 5.5 && version < 10) { return true; } else { return false; @@ -674,7 +674,7 @@ function add_error_style(formname, input, txt, flash) { } } } - window.setTimeout("if (inputsWithErrors[" + (inputsWithErrors.length - 1) + "]) inputsWithErrors[" + (inputsWithErrors.length - 1) + "].style.backgroundColor = null;", 2000); + window.setTimeout("inputsWithErrors[" + (inputsWithErrors.length - 1) + "].style.backgroundColor = '';", 2000); } } catch ( e ) { @@ -707,6 +707,7 @@ function clear_all_errors() { if ( tabView.get ) { var tabs = tabView.get("tabs"); for (var i in tabs) { + if (typeof tabs[i] == "object") tabs[i].get("labelEl").style.color = ""; } } @@ -4263,7 +4264,29 @@ isPackageManager: function(){ }, ajaxCallInProgress: function(){ - return SUGAR_callsInProgress != 0; + //If the page content is blank, it means we are probably still waiting on something + var c = document.getElementById("content"); + if (!c) return true; + var t = YAHOO.lang.trim(SUGAR.util.innerText(c)); + return SUGAR_callsInProgress != 0 || t == ""; +}, +//Firefox doesn't support innerText (textContent includes script content) +innerText : function(el) { + if (el.tagName == "SCRIPT") + return ""; + if(typeof(el.innerText) == "string") + return el.innerText; + var t = ""; + for (var i in el.childNodes){ + var c = el.childNodes[i]; + if (typeof(c) != "object") + continue; + if (typeof(c.nodeName) == "string" && c.nodeName == "#text") + t += c.nodeValue; + else + t += SUGAR.util.innerText(c); + } + return t; }, callOnChangeListers: function(field){ @@ -4445,4 +4468,4 @@ SUGAR.MultiEnumAutoComplete.getMultiSelectValuesFromKeys = function(options_inde } } return final_arr; -} +} \ No newline at end of file diff --git a/jssource/src_files/modules/Studio/studiotabgroups.js b/jssource/src_files/modules/Studio/studiotabgroups.js index 42943245..cfd52d83 100644 --- a/jssource/src_files/modules/Studio/studiotabgroups.js +++ b/jssource/src_files/modules/Studio/studiotabgroups.js @@ -60,7 +60,7 @@ StudioTabGroup.prototype.editTabGroupLabel = function (id, done){ YAHOO.util.DragDropMgr.lock(); }else{ this.lastEditTabGroupLabel = -1; - document.getElementById('tabname_'+id).innerHTML =document.getElementById('tablabel_'+id).value; + document.getElementById('tabname_'+id).innerHTML = escape(document.getElementById('tablabel_'+id).value); document.getElementById('tabname_'+id).style.display = ''; document.getElementById('tablabel_'+id).style.display = 'none'; document.getElementById('tabother_'+id).style.display = ''; diff --git a/modules/Accounts/Menu.php b/modules/Accounts/Menu.php index cfb108fd..7a8950f5 100644 --- a/modules/Accounts/Menu.php +++ b/modules/Accounts/Menu.php @@ -49,5 +49,5 @@ global $mod_strings, $app_strings, $sugar_config; if(ACLController::checkAccess('Accounts', 'edit', true))$module_menu[]=Array("index.php?module=Accounts&action=EditView&return_module=Accounts&return_action=index", $mod_strings['LNK_NEW_ACCOUNT'],"CreateAccounts", 'Accounts'); if(ACLController::checkAccess('Accounts', 'list', true))$module_menu[]=Array("index.php?module=Accounts&action=index&return_module=Accounts&return_action=DetailView", $mod_strings['LNK_ACCOUNT_LIST'],"Accounts", 'Accounts'); -if(ACLController::checkAccess('Accounts', 'import', true))$module_menu[]=Array("javascript:void(SUGAR.importWizard.renderDialog('Accounts','step1',''));", $mod_strings['LNK_IMPORT_ACCOUNTS'],"Import", 'Accounts'); +if(ACLController::checkAccess('Accounts', 'import', true))$module_menu[]=Array("index.php?module=Import&action=Step1&import_module=Accounts&return_module=Accounts&return_action=index", $mod_strings['LNK_IMPORT_ACCOUNTS'],"Import", 'Accounts'); ?> \ No newline at end of file diff --git a/modules/Activities/Menu.php b/modules/Activities/Menu.php index b05185b8..6993e12e 100644 --- a/modules/Activities/Menu.php +++ b/modules/Activities/Menu.php @@ -55,8 +55,8 @@ if(ACLController::checkAccess('Meetings', 'list', true))$module_menu[]=Array("in if(ACLController::checkAccess('Tasks', 'list', true))$module_menu[]=Array("index.php?module=Tasks&action=index&return_module=Tasks&return_action=DetailView", $mod_strings['LNK_TASK_LIST'],"Tasks"); if(ACLController::checkAccess('Notes', 'list', true))$module_menu[]=Array("index.php?module=Notes&action=index&return_module=Notes&return_action=DetailView", $mod_strings['LNK_NOTE_LIST'],"Notes"); if(ACLController::checkAccess('Calendar', 'list', true))$module_menu[]=Array("index.php?module=Calendar&action=index&view=day", $mod_strings['LNK_VIEW_CALENDAR'],"Calendar"); -if(ACLController::checkAccess('Calls', 'import', true))$module_menu[]=Array("javascript:void(SUGAR.importWizard.renderDialog('Calls','step1',''));", $mod_strings['LNK_IMPORT_CALLS'],"Import", 'Calls'); -if(ACLController::checkAccess('Meetings', 'import', true))$module_menu[]=Array("javascript:void(SUGAR.importWizard.renderDialog('Meetings','step1',''));", $mod_strings['LNK_IMPORT_MEETINGS'],"Import", 'Meetings'); -if(ACLController::checkAccess('Tasks', 'import', true))$module_menu[]=Array("javascript:void(SUGAR.importWizard.renderDialog('Tasks','step1',''));", $mod_strings['LNK_IMPORT_TASKS'],"Import", 'Tasks'); -if(ACLController::checkAccess('Notes', 'import', true))$module_menu[]=Array("javascript:void(SUGAR.importWizard.renderDialog('Notes','step1',''));", $mod_strings['LNK_IMPORT_NOTES'],"Import", 'Notes'); +if(ACLController::checkAccess('Calls', 'import', true))$module_menu[]=Array("index.php?module=Import&action=Step1&import_module=Calls&return_module=Calls&return_action=index", $mod_strings['LNK_IMPORT_CALLS'],"Import", 'Calls'); +if(ACLController::checkAccess('Meetings', 'import', true))$module_menu[]=Array("index.php?module=Import&action=Step1&import_module=Meetings&return_module=Meetings&return_action=index", $mod_strings['LNK_IMPORT_MEETINGS'],"Import", 'Meetings'); +if(ACLController::checkAccess('Tasks', 'import', true))$module_menu[]=Array("index.php?module=Import&action=Step1&import_module=Tasks&return_module=Tasks&return_action=index", $mod_strings['LNK_IMPORT_TASKS'],"Import", 'Tasks'); +if(ACLController::checkAccess('Notes', 'import', true))$module_menu[]=Array("index.php?module=Import&action=Step1&import_module=Notes&return_module=Notes&return_action=index", $mod_strings['LNK_IMPORT_NOTES'],"Import", 'Notes'); ?> diff --git a/modules/Administration/metadata/adminpaneldefs.php b/modules/Administration/metadata/adminpaneldefs.php index 20d9bb98..98374678 100644 --- a/modules/Administration/metadata/adminpaneldefs.php +++ b/modules/Administration/metadata/adminpaneldefs.php @@ -80,7 +80,7 @@ $admin_group_header[]= array('LBL_SUGAR_NETWORK_TITLE','',false,$admin_option_de //system. $admin_option_defs=array(); $admin_option_defs['Administration']['configphp_settings']= array('Administration','LBL_CONFIGURE_SETTINGS_TITLE','LBL_CONFIGURE_SETTINGS','./index.php?module=Configurator&action=EditView'); -$admin_option_defs['Administration']['import']= array('Import','LBL_IMPORT_WIZARD','LBL_IMPORT_WIZARD_DESC','javascript:void(0)','','return SUGAR.importWizard.renderDialog("Administration","step1","");'); +$admin_option_defs['Administration']['import']= array('Import','LBL_IMPORT_WIZARD','LBL_IMPORT_WIZARD_DESC','./index.php?module=Import&action=step1&import_module=Administration'); $admin_option_defs['Administration']['locale']= array('Currencies','LBL_MANAGE_LOCALE','LBL_LOCALE','./index.php?module=Administration&action=Locale&view=default'); if(!defined('TEMPLATE_URL')){ diff --git a/modules/Bugs/Menu.php b/modules/Bugs/Menu.php index d1ccdbcf..1703cede 100644 --- a/modules/Bugs/Menu.php +++ b/modules/Bugs/Menu.php @@ -48,6 +48,6 @@ if(ACLController::checkAccess('Bugs', 'edit', true)) $module_menu [] = Array("index.php?module=Bugs&action=EditView&return_module=Bugs&return_action=DetailView", $mod_strings['LNK_NEW_BUG'],"CreateBugs", 'Bugs'); if(ACLController::checkAccess('Bugs', 'list', true)) $module_menu [] = Array("index.php?module=Bugs&action=index&return_module=Bugs&return_action=DetailView", $mod_strings['LNK_BUG_LIST'],"Bugs", 'Bugs'); -if(ACLController::checkAccess('Bugs', 'import', true))$module_menu[] =Array("javascript:void(SUGAR.importWizard.renderDialog('Bugs','step1',''));", $mod_strings['LNK_IMPORT_BUGS'],"Import", 'Bugs'); +if(ACLController::checkAccess('Bugs', 'import', true))$module_menu[] =Array("index.php?module=Import&action=Step1&import_module=Bugs&return_module=Bugs&return_action=index", $mod_strings['LNK_IMPORT_BUGS'],"Import", 'Bugs'); ?> \ No newline at end of file diff --git a/modules/Calls/Menu.php b/modules/Calls/Menu.php index c6f06c67..58ccfa1a 100644 --- a/modules/Calls/Menu.php +++ b/modules/Calls/Menu.php @@ -47,5 +47,5 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); global $mod_strings,$app_strings; if(ACLController::checkAccess('Calls', 'edit', true))$module_menu[]=Array("index.php?module=Calls&action=EditView&return_module=Calls&return_action=DetailView", $mod_strings['LNK_NEW_CALL'],"CreateCalls"); if(ACLController::checkAccess('Calls', 'list', true))$module_menu[]=Array("index.php?module=Calls&action=index&return_module=Calls&return_action=DetailView", $mod_strings['LNK_CALL_LIST'],"Calls"); -if(ACLController::checkAccess('Calls', 'import', true))$module_menu[] =Array("javascript:void(SUGAR.importWizard.renderDialog('Calls','step1',''));", $mod_strings['LNK_IMPORT_CALLS'],"Import", 'Calls'); +if(ACLController::checkAccess('Calls', 'import', true))$module_menu[] =Array("index.php?module=Import&action=Step1&import_module=Calls&return_module=Calls&return_action=index", $mod_strings['LNK_IMPORT_CALLS'],"Import", 'Calls'); ?> diff --git a/modules/Cases/Menu.php b/modules/Cases/Menu.php index b2f9613d..985d3435 100644 --- a/modules/Cases/Menu.php +++ b/modules/Cases/Menu.php @@ -48,7 +48,7 @@ if(ACLController::checkAccess('Cases', 'edit', true)) $module_menu [] = Array("index.php?module=Cases&action=EditView&return_module=Cases&return_action=DetailView", $mod_strings['LNK_NEW_CASE'],"CreateCases"); if(ACLController::checkAccess('Cases', 'list', true)) $module_menu [] = Array("index.php?module=Cases&action=index&return_module=Cases&return_action=DetailView", $mod_strings['LNK_CASE_LIST'],"Cases"); -if(ACLController::checkAccess('Cases', 'import', true))$module_menu[] =Array("javascript:void(SUGAR.importWizard.renderDialog('Cases','step1',''));", $mod_strings['LNK_IMPORT_CASES'],"Import", 'Contacts'); +if(ACLController::checkAccess('Cases', 'import', true))$module_menu[] =Array("index.php?module=Import&action=Step1&import_module=Cases&return_module=Cases&return_action=index", $mod_strings['LNK_IMPORT_CASES'],"Import", 'Cases'); ?> \ No newline at end of file diff --git a/modules/Connectors/connectors/sources/ext/rest/insideview/InsideViewLogicHook.php b/modules/Connectors/connectors/sources/ext/rest/insideview/InsideViewLogicHook.php index c7ccef50..8a5f59bb 100644 --- a/modules/Connectors/connectors/sources/ext/rest/insideview/InsideViewLogicHook.php +++ b/modules/Connectors/connectors/sources/ext/rest/insideview/InsideViewLogicHook.php @@ -182,6 +182,7 @@ class InsideViewLogicHook { // Check if the user should be shown the frame or not $smarty = new Sugar_Smarty(); $tplName = 'modules/Connectors/connectors/sources/ext/rest/insideview/tpls/InsideView.tpl'; + require_once('include/connectors/utils/ConnectorUtils.php'); $connector_language = ConnectorUtils::getConnectorStrings('ext_rest_insideview'); $smarty->assign('connector_language', $connector_language); $smarty->assign('logo',getWebPath('modules/Connectors/connectors/sources/ext/rest/insideview/images/insideview.png')); @@ -204,4 +205,4 @@ class InsideViewLogicHook { echo $smarty->fetch($tplName); } } -} \ No newline at end of file +} diff --git a/modules/Contacts/Menu.php b/modules/Contacts/Menu.php index 98c587e1..db7127ce 100644 --- a/modules/Contacts/Menu.php +++ b/modules/Contacts/Menu.php @@ -48,6 +48,6 @@ global $mod_strings, $app_strings, $sugar_config; if(ACLController::checkAccess('Contacts', 'import', true))$module_menu[] =Array("index.php?module=Contacts&action=ImportVCard", $mod_strings['LNK_IMPORT_VCARD'],"CreateContacts", 'Contacts'); if(ACLController::checkAccess('Contacts', 'list', true))$module_menu[] =Array("index.php?module=Contacts&action=index&return_module=Contacts&return_action=DetailView", $mod_strings['LNK_CONTACT_LIST'],"Contacts", 'Contacts'); - if(ACLController::checkAccess('Contacts', 'import', true))$module_menu[] =Array("javascript:void(SUGAR.importWizard.renderDialog('Contacts','step1',''));", $mod_strings['LNK_IMPORT_CONTACTS'],"Import", 'Contacts'); + if(ACLController::checkAccess('Contacts', 'import', true))$module_menu[] =Array("index.php?module=Import&action=Step1&import_module=Contacts&return_module=Contacts&return_action=index", $mod_strings['LNK_IMPORT_CONTACTS'],"Import", 'Contacts'); ?> \ No newline at end of file diff --git a/modules/DynamicFields/DynamicField.php b/modules/DynamicFields/DynamicField.php index f67a34ff..119e382d 100644 --- a/modules/DynamicFields/DynamicField.php +++ b/modules/DynamicFields/DynamicField.php @@ -550,7 +550,16 @@ class DynamicField { //We do this so that the existing entries in the custom table don't have the default value set $field->default = ''; $field->default_value = ''; + // resetting default and default_value does not work for multienum and causes trouble for mssql + // so using a temporary variable here to indicate that we don't want default for this query + if ($GLOBALS['db']->dbType == 'mssql') { + $field->no_default = 1; + } $query = $field->get_db_add_alter_table($this->bean->table_name . '_cstm'); + // unsetting temporary member variable + if ($GLOBALS['db']->dbType == 'mssql') { + unset($field->no_default); + } if(!empty($query)){ $GLOBALS['db']->query($query); $field->default = $fmd->default_value; diff --git a/modules/DynamicFields/templates/Fields/TemplateMultiEnum.php b/modules/DynamicFields/templates/Fields/TemplateMultiEnum.php index b410e5cd..c80a9171 100644 --- a/modules/DynamicFields/templates/Fields/TemplateMultiEnum.php +++ b/modules/DynamicFields/templates/Fields/TemplateMultiEnum.php @@ -134,13 +134,13 @@ class TemplateMultiEnum extends TemplateEnum{ // if we have a new error, then unserialize must have failed => we don't have a packed ext4 // safe to assume that false means the unpack failed, as ext4 will either contain an imploded string of default values, or an array, not a boolean false value - if ( $unpacked === false ) { + if ( $unpacked === false && !isset($this->no_default) ) { $def [ 'default' ] = $this->ext4 ; } else { // we have a packed representation containing one or both of default and dependency - if ( isset ( $unpacked [ 'default' ] ) ) + if ( isset ( $unpacked [ 'default' ] ) && !isset($this->no_default)) $def [ 'default' ] = $unpacked [ 'default' ] ; if ( isset ( $unpacked [ 'dependency' ] ) ) $def [ 'dependency' ] = $unpacked [ 'dependency' ] ; diff --git a/modules/Emails/javascript/EmailUICompose.js b/modules/Emails/javascript/EmailUICompose.js index aff9c876..2d23b70c 100644 --- a/modules/Emails/javascript/EmailUICompose.js +++ b/modules/Emails/javascript/EmailUICompose.js @@ -1114,7 +1114,7 @@ SE.composeLayout = { var instance = SE.util.getTiny(SE.tinyInstances.currentHtmleditor); if(typeof(instance) == 'undefined' || (typeof(SE.composeLayout.loadedTinyInstances[idx]) != 'undefined' && SE.composeLayout.loadedTinyInstances[idx] == false)) { - setTimeout("SE.composeLayout.resizeEditorSetSignature(" + idx + ",'"+isReplyForward+"');",500); + setTimeout("SE.composeLayout.resizeEditorSetSignature(" + idx + ",'"+setSignature+"');",500); return; } @@ -1688,7 +1688,7 @@ SE.composeLayout = { // make async call to delete cached file AjaxObject.target = ''; - AjaxObject.startRequest(null, urlStandard + "&emailUIAction=removeUploadedAttachment&file="+file); + AjaxObject.startRequest('', urlStandard + "&emailUIAction=removeUploadedAttachment&file="+file); }, /** diff --git a/modules/Import/sources/ExternalSourceEAPMAdapter.php b/modules/Import/sources/ExternalSourceEAPMAdapter.php index fe67abde..12ed6191 100644 --- a/modules/Import/sources/ExternalSourceEAPMAdapter.php +++ b/modules/Import/sources/ExternalSourceEAPMAdapter.php @@ -99,24 +99,16 @@ class ExternalSourceEAPMAdapter extends ImportDataSource $api->loadEAPM($eapmBean); $conn = $api->getConnector(); - $rows = array(); - $feed = $conn->getList(array('maxResults' => $maxResults, 'startIndex' => $this->_offset)); if($feed !== FALSE) { - $this->_totalRecordCount = $feed->totalResults->getText(); - - foreach ($feed->entries as $entry) - { - $rows[] = $entry->toArray(); - } + $this->_totalRecordCount = $feed['totalResults']; + $this->_recordSet = $feed['records']; } else { - throw new Exception('Unable to retrieve google contact feed.'); + throw new Exception("Unable to retrieve {$this->_eapmName} feed."); } - - $this->_recordSet = $rows; } public function getHeaderColumns() diff --git a/modules/Import/tpls/confirm.tpl b/modules/Import/tpls/confirm.tpl index 91ba1a87..af885802 100644 --- a/modules/Import/tpls/confirm.tpl +++ b/modules/Import/tpls/confirm.tpl @@ -173,7 +173,7 @@

{$MOD.LBL_THIRD_PARTY_CSV_SOURCES} {sugar_help text=$MOD.LBL_THIRD_PARTY_CSV_SOURCES_HELP}

-  {$MOD.LBL_NONE} +  {$MOD.LBL_NONE}  {$MOD.LBL_SALESFORCE} @@ -185,3 +185,13 @@   + + + + + +
+   + +
+ \ No newline at end of file diff --git a/modules/Import/tpls/dupcheck.tpl b/modules/Import/tpls/dupcheck.tpl index c214e4c5..dbdf329f 100644 --- a/modules/Import/tpls/dupcheck.tpl +++ b/modules/Import/tpls/dupcheck.tpl @@ -101,6 +101,16 @@
+
+ + + + + +
+   + +
diff --git a/modules/Import/tpls/last.tpl b/modules/Import/tpls/last.tpl index d80be9f6..129a4800 100644 --- a/modules/Import/tpls/last.tpl +++ b/modules/Import/tpls/last.tpl @@ -71,6 +71,22 @@ div.resultsTable { + +
+ + + + + +
+ {if $showUndoButton} + + {/if} + + + {$PROSPECTLISTBUTTON} +

diff --git a/modules/Import/tpls/step1.tpl b/modules/Import/tpls/step1.tpl index 3e1b22ac..64e6bb11 100644 --- a/modules/Import/tpls/step1.tpl +++ b/modules/Import/tpls/step1.tpl @@ -91,4 +91,10 @@

+
+ + + + +
\ No newline at end of file diff --git a/modules/Import/tpls/step2.tpl b/modules/Import/tpls/step2.tpl index b5524e19..2e499b6a 100644 --- a/modules/Import/tpls/step2.tpl +++ b/modules/Import/tpls/step2.tpl @@ -159,3 +159,20 @@ + +
+ + + + + +
+ {if $displayBackBttn} +   + {/if} + +
+ + diff --git a/modules/Import/tpls/step3.tpl b/modules/Import/tpls/step3.tpl index 5798e811..694a6bef 100644 --- a/modules/Import/tpls/step3.tpl +++ b/modules/Import/tpls/step3.tpl @@ -152,3 +152,15 @@ +
+ + + + + +
+   + +
+ +{$QS_JS} \ No newline at end of file diff --git a/modules/Import/tpls/wizardWrapper.tpl b/modules/Import/tpls/wizardWrapper.tpl index ca44a785..9b2bd967 100644 --- a/modules/Import/tpls/wizardWrapper.tpl +++ b/modules/Import/tpls/wizardWrapper.tpl @@ -35,4 +35,31 @@ ********************************************************************************/ *} -{ldelim}"html":{$CONTENT},"submitContent":{$SUBMITCONTENT},"title":{$MODULE_TITLE},"script":{$JS}{rdelim} \ No newline at end of file + +{overlib_includes} +
+
+
+
+
+
+
+
+
+
+ {$MODULE_TITLE} + {$CONTENT} +
+
+
+
+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/modules/Import/views/ImportView.php b/modules/Import/views/ImportView.php index 214d372b..02045746 100644 --- a/modules/Import/views/ImportView.php +++ b/modules/Import/views/ImportView.php @@ -58,9 +58,6 @@ class ImportView extends SugarView } $this->importModule = isset($_REQUEST['import_module']) ? $_REQUEST['import_module'] : ''; - $this->options['show_header'] = false; - $this->options['show_footer'] = false; - $this->options['show_javascript'] = false; } /** diff --git a/modules/Import/views/view.confirm.php b/modules/Import/views/view.confirm.php index a65dd28c..e8ddce04 100644 --- a/modules/Import/views/view.confirm.php +++ b/modules/Import/views/view.confirm.php @@ -62,7 +62,6 @@ class ImportViewConfirm extends ImportView global $mod_strings, $app_strings, $current_user; global $sugar_config, $locale; - //echo "
";print_r($_REQUEST);die();
         $this->ss->assign("IMPORT_MODULE", $_REQUEST['import_module']);
         $this->ss->assign("TYPE",( !empty($_REQUEST['type']) ? $_REQUEST['type'] : "import" ));
         $this->ss->assign("SOURCE_ID", $_REQUEST['source_id']);
@@ -70,7 +69,7 @@ class ImportViewConfirm extends ImportView
         $this->instruction = 'LBL_SELECT_PROPERTY_INSTRUCTION';
         $this->ss->assign('INSTRUCTION', $this->getInstruction());
 
-        $this->ss->assign("MODULE_TITLE", json_encode(htmlentities($this->getModuleTitle(false), ENT_NOQUOTES)));
+        $this->ss->assign("MODULE_TITLE", $this->getModuleTitle(false), ENT_NOQUOTES);
         $this->ss->assign("CURRENT_STEP", $this->currentStep);
         $sugar_config['import_max_records_per_file'] = ( empty($sugar_config['import_max_records_per_file']) ? 1000 : $sugar_config['import_max_records_per_file'] );
         $importSource = isset($_REQUEST['source']) ? $_REQUEST['source'] : 'csv' ;
@@ -211,14 +210,11 @@ class ImportViewConfirm extends ImportView
 
         $this->ss->assign("SAMPLE_ROWS",$rows);
         $JS = $this->_getJS($maxRecordsExceeded, $maxRecordsWarningMessg, $importMappingJS, $importFileMap );
+        $this->ss->assign("JAVASCRIPT", $JS);
         $content = $this->ss->fetch('modules/Import/tpls/confirm.tpl');
-
-        $submitContent = "
"; - $submitContent .= ""; - $submitContent .= ""; - $submitContent .= "
"; - - $this->sendJsonOutput($content, $submitContent,$JS, $encodeOutput); + $this->ss->assign("CONTENT",$content); + $this->ss->display('modules/Import/tpls/wizardWrapper.tpl'); + } private function getEnclosureOptions($enclosure) @@ -458,44 +454,16 @@ eoq; var import_mapping_js = $importMappingJS; -document.getElementById('goback').onclick = function(){ +document.getElementById('goback').onclick = function() +{ document.getElementById('importconfirm').action.value = 'Step2'; - var success = function(data) { - var response = YAHOO.lang.JSON.parse(data.responseText); - importWizardDialogDiv = document.getElementById('importWizardDialogDiv'); - importWizardDialogTitle = document.getElementById('importWizardDialogTitle'); - submitDiv = document.getElementById('submitDiv'); - importWizardDialogDiv.innerHTML = response['html']; - importWizardDialogTitle.innerHTML = response['title']; - submitDiv.innerHTML = response['submitContent']; - eval(response['script']); - } - var formObject = document.getElementById('importconfirm'); - YAHOO.util.Connect.setForm(formObject); - var cObj = YAHOO.util.Connect.asyncRequest('POST', "index.php", {success: success, failure: success}); + return true; } -document.getElementById('gonext').onclick = function(){ +document.getElementById('gonext').onclick = function() +{ document.getElementById('importconfirm').action.value = 'Step3'; - - var success = function(data) { - var response = YAHOO.lang.JSON.parse(data.responseText); - importWizardDialogDiv = document.getElementById('importWizardDialogDiv'); - importWizardDialogTitle = document.getElementById('importWizardDialogTitle'); - submitDiv = document.getElementById('submitDiv'); - importWizardDialogDiv.innerHTML = response['html']; - importWizardDialogTitle.innerHTML = response['title']; - - submitDiv.innerHTML = response['submitContent']; - SUGAR.util.evalScript(response['submitContent']); - eval(response['script']); - - } - - var formObject = document.getElementById('importconfirm'); - YAHOO.util.Connect.setForm(formObject); - var cObj = YAHOO.util.Connect.asyncRequest('POST', "index.php", {success: success, failure: success}); - + return true; } document.getElementById('custom_enclosure').onchange = function() @@ -647,22 +615,8 @@ EOJAVASCRIPT; } $content = $ss->fetch('modules/Import/tpls/error.tpl'); - $nothing =""; - $ss->assign("CONTENT",json_encode($nothing)); - $ss->assign("SUBMITCONTENT",json_encode($nothing)); - $ss->assign("JS",json_encode($content)); - - $this->errorScript .= htmlspecialchars($content, ENT_NOQUOTES); - - if ($display){ - echo json_encode(array( - 'html' => $nothing, - 'submitContent' => $nothing, - 'title' => $this->getModuleTitle(false), - 'script' => $this->errorScript, - )); - } + echo $ss->fetch('modules/Import/tpls/error.tpl'); } } diff --git a/modules/Import/views/view.dupcheck.php b/modules/Import/views/view.dupcheck.php index 775e6d37..0535ffbb 100644 --- a/modules/Import/views/view.dupcheck.php +++ b/modules/Import/views/view.dupcheck.php @@ -66,26 +66,16 @@ class ImportViewDupcheck extends ImportView $this->instruction = 'LBL_SELECT_DUPLICATE_INSTRUCTION'; $this->ss->assign('INSTRUCTION', $this->getInstruction()); - $this->ss->assign("MODULE_TITLE", json_encode($this->getModuleTitle(false))); + $this->ss->assign("MODULE_TITLE", $this->getModuleTitle(false)); $this->ss->assign("DELETE_INLINE_PNG", SugarThemeRegistry::current()->getImage('delete_inline','align="absmiddle" alt="'.$app_strings['LNK_DELETE'].'" border="0"')); $this->ss->assign("PUBLISH_INLINE_PNG", SugarThemeRegistry::current()->getImage('publish_inline','align="absmiddle" alt="'.$mod_strings['LBL_PUBLISH'].'" border="0"')); $this->ss->assign("UNPUBLISH_INLINE_PNG", SugarThemeRegistry::current()->getImage('unpublish_inline','align="absmiddle" alt="'.$mod_strings['LBL_UNPUBLISH'].'" border="0"')); $this->ss->assign("IMPORT_MODULE", $_REQUEST['import_module']); $this->ss->assign("CURRENT_STEP", $this->currentStep); - $this->ss->assign("JS", json_encode($this->_getJS())); - + $this->ss->assign("JAVASCRIPT", $this->_getJS()); $content = $this->ss->fetch('modules/Import/tpls/dupcheck.tpl'); - $this->ss->assign("CONTENT",json_encode($content)); - - - $submitContent = "
"; - $submitContent .= ""; - $submitContent .= ""; - $submitContent .= "
"; - $this->ss->assign("SUBMITCONTENT",json_encode($submitContent)); - - + $this->ss->assign("CONTENT", $content); $this->ss->display('modules/Import/tpls/wizardWrapper.tpl'); } @@ -163,12 +153,8 @@ class ImportViewDupcheck extends ImportView $enabled_dupes = json_encode($dupe_enabled); $disabled_dupes = json_encode($dupe_disabled); - $stepTitle4 = strip_tags(str_replace("\n","",getClassicModuleTitle( - $mod_strings['LBL_MODULE_NAME'], - array($mod_strings['LBL_MODULE_NAME'],$mod_strings['LBL_STEP_4_TITLE']), - false - ))); - + $stepTitle4 = $mod_strings['LBL_IMPORT_RECORDS']; + $dateTimeFormat = $GLOBALS['timedate']->get_cal_date_time_format(); $type = (isset($_REQUEST['type'])) ? $_REQUEST['type'] : ''; $lblUsed = str_replace(":","",$mod_strings['LBL_INDEX_USED']); @@ -226,25 +212,7 @@ ProcessImport = new function() + "&has_header=" + document.getElementById("importstepdup").has_header.value ; if ( ProcessImport.fileCount >= ProcessImport.fileTotal ) { YAHOO.SUGAR.MessageBox.updateProgress(1,'{$mod_strings['LBL_IMPORT_COMPLETED']}'); - //SUGAR.util.hrefURL(locationStr); - var handleSuccess = { - success : function(data) { - var response = YAHOO.lang.JSON.parse(data.responseText); - importWizardDialogDiv = document.getElementById('importWizardDialogDiv'); - importWizardDialogTitle = document.getElementById('importWizardDialogTitle'); - submitDiv = document.getElementById('submitDiv'); - importWizardDialogDiv.innerHTML = response['html']; - importWizardDialogTitle.innerHTML = response['title']; - submitDiv.innerHTML = response['submitContent']; - SUGAR.util.evalScript(response['html']); - eval(response['script']); - - } - }; - - var cObj = YAHOO.util.Connect.asyncRequest('GET', locationStr, handleSuccess); - YAHOO.SUGAR.MessageBox.hide(); - return false; + SUGAR.util.hrefURL(locationStr); } else { document.getElementById("importstepdup").save_map_as.value = ''; diff --git a/modules/Import/views/view.last.php b/modules/Import/views/view.last.php index eaec0436..127fdddf 100644 --- a/modules/Import/views/view.last.php +++ b/modules/Import/views/view.last.php @@ -64,7 +64,7 @@ class ImportViewLast extends ImportView $this->ss->assign("IMPORT_MODULE", $_REQUEST['import_module']); $this->ss->assign("TYPE", $_REQUEST['type']); $this->ss->assign("HEADER", $app_strings['LBL_IMPORT']." ". $mod_strings['LBL_MODULE_NAME']); - $this->ss->assign("MODULE_TITLE", json_encode($this->getModuleTitle(false))); + $this->ss->assign("MODULE_TITLE", $this->getModuleTitle(false)); // lookup this module's $mod_strings to get the correct module name $module_mod_strings = return_module_language($current_language, $_REQUEST['import_module']); @@ -87,10 +87,10 @@ class ImportViewLast extends ImportView } fclose($fp); - $showUndoButton = false; + $this->ss->assign("showUndoButton",FALSE); if($createdCount > 0) { - $showUndoButton = true; + $this->ss->assign("showUndoButton",TRUE); } if ($errorCount > 0 && ($createdCount <= 0 && $updatedCount <= 0)) @@ -100,7 +100,7 @@ class ImportViewLast extends ImportView else $activeTab = 0; - $this->ss->assign("JS", json_encode($this->_getJS($activeTab))); + $this->ss->assign("JAVASCRIPT", $this->_getJS($activeTab)); $this->ss->assign("errorCount",$errorCount); $this->ss->assign("dupeCount",$dupeCount); $this->ss->assign("createdCount",$createdCount); @@ -111,10 +111,10 @@ class ImportViewLast extends ImportView if ( $this->bean->object_name == "Prospect" ) { - $prospectlistbutton = $this->_addToProspectListButton(); + $this->ss->assign("PROSPECTLISTBUTTON", $this->_addToProspectListButton()); } else { - $prospectlistbutton = ""; + $this->ss->assign("PROSPECTLISTBUTTON",""); } $resultsTable = ""; @@ -135,21 +135,8 @@ class ImportViewLast extends ImportView $this->ss->assign("RESULTS_TABLE", $resultsTable); $this->ss->assign("ERROR_TABLE", $this->getListViewTableFromFile(ImportCacheFiles::getErrorRecordsFileName(), 'errors') ); $this->ss->assign("DUP_TABLE", $this->getListViewTableFromFile(ImportCacheFiles::getDuplicateFileDisplayName(), 'dup')); - - $content = $this->ss->fetch('modules/Import/tpls/last.tpl'); - $this->ss->assign("CONTENT",json_encode($content)); - $submitContent = "
"; - $submitContent .= ""; - $submitContent .= ""; - $submitContent .= ""; - - - - $submitContent .= " ".$prospectlistbutton; - - $submitContent .= "
"; - $this->ss->assign("SUBMITCONTENT",json_encode($submitContent)); + $this->ss->assign("CONTENT",$content); $this->ss->display('modules/Import/tpls/wizardWrapper.tpl'); } @@ -209,48 +196,15 @@ class ImportViewLast extends ImportView { return <<ss->assign("MODULE_TITLE", json_encode($this->getModuleTitle(false))); + $this->ss->assign("MODULE_TITLE", $this->getModuleTitle(false) ); $this->ss->assign("DELETE_INLINE_PNG", SugarThemeRegistry::current()->getImage('delete_inline','align="absmiddle" alt="'.$app_strings['LNK_DELETE'].'" border="0"')); $this->ss->assign("PUBLISH_INLINE_PNG", SugarThemeRegistry::current()->getImage('publish_inline','align="absmiddle" alt="'.$mod_strings['LBL_PUBLISH'].'" border="0"')); $this->ss->assign("UNPUBLISH_INLINE_PNG", SugarThemeRegistry::current()->getImage('unpublish_inline','align="absmiddle" alt="'.$mod_strings['LBL_UNPUBLISH'].'" border="0"')); @@ -108,13 +107,10 @@ class ImportViewStep1 extends ImportView $submitContent .= ""; $submitContent .= ""; - $jsLang = jsLanguage::createModuleStringsCache($this->module, $GLOBALS['current_language'], true); - echo json_encode(array( - 'html' => $content, - 'submitContent' => $submitContent, - 'title' => $this->getModuleTitle(false), - 'script' => $jsLang . $this->_getJS(), - )); + $this->ss->assign("JAVASCRIPT",$this->_getJS() ); + $this->ss->assign("CONTENT",$content); + $this->ss->display('modules/Import/tpls/wizardWrapper.tpl'); + } private function getImportablePersonModulesJS() @@ -159,7 +155,7 @@ class ImportViewStep1 extends ImportView //If we are coming from the admin link, get the module list. if($showModuleSelection) { - $importablePersonModules = $this->getImportablePersonModulesJS(); + $importablePersonModules = $this->getImportablePersonModulesJS(); } @@ -176,6 +172,7 @@ document.getElementById('gonext').onclick = function() if( isCsvSource ) { document.getElementById('importstep1').action.value = 'Step2'; + return true; } else { @@ -187,28 +184,12 @@ document.getElementById('gonext').onclick = function() document.getElementById('importstep1').action.value = 'ExtStep1'; document.getElementById('importstep1').external_source.value = selectedExternalSource; - - } - - var success = function(data) { - var response = YAHOO.lang.JSON.parse(data.responseText); - importWizardDialogDiv = document.getElementById('importWizardDialogDiv'); - submitDiv = document.getElementById('submitDiv'); - importWizardDialogTitle = document.getElementById('importWizardDialogTitle'); - importWizardDialogDiv.innerHTML = response['html']; - importWizardDialogTitle.innerHTML = response['title']; - SUGAR.util.evalScript(response['html']); - submitDiv.innerHTML = response['submitContent']; - eval(response['script']); - } - var formObject = document.getElementById('importstep1'); - YAHOO.util.Connect.setForm(formObject); - var cObj = YAHOO.util.Connect.asyncRequest('POST', "index.php", {success: success, failure: success}); + return true; + } } - -YAHOO.util.Event.onContentReady("importstep1", function() { +YAHOO.util.Event.onDOMReady(function(){ var oButtonGroup = new YAHOO.widget.ButtonGroup("smtpButtonGroup"); @@ -294,7 +275,7 @@ YAHOO.util.Event.onContentReady("importstep1", function() { var selectedModule = selectedModuleEl.value; document.getElementById('importstep1').import_module.value = selectedModule; } - //YAHOO.util.Event.addListener('ext_source_sign_in_bttn', "click", openExtAuthWindow); + YAHOO.util.Event.addListener('ext_source_sign_in_bttn', "click", openExtAuthWindow); YAHOO.util.Event.addListener('admin_import_module', "change", setImportModule); @@ -318,8 +299,6 @@ var auth_sources = {$EXTERNAL_AUTHENTICATED_SOURCES} var selectedExternalSource = '{$selectExternalSource}'; var personModules = {$PERSON_MODULE_LIST}; - - EOJAVASCRIPT; } } diff --git a/modules/Import/views/view.step2.php b/modules/Import/views/view.step2.php index 0a7c7bd3..b0d54af9 100644 --- a/modules/Import/views/view.step2.php +++ b/modules/Import/views/view.step2.php @@ -61,7 +61,7 @@ class ImportViewStep2 extends ImportView $this->instruction = 'LBL_SELECT_UPLOAD_INSTRUCTION'; $this->ss->assign('INSTRUCTION', $this->getInstruction()); - $this->ss->assign("MODULE_TITLE", json_encode($this->getModuleTitle(false))); + $this->ss->assign("MODULE_TITLE", $this->getModuleTitle(false)); $this->ss->assign("IMP", $import_mod_strings); $this->ss->assign("CURRENT_STEP", $this->currentStep); $this->ss->assign("TYPE",( !empty($_REQUEST['type']) ? $_REQUEST['type'] : "import" )); @@ -74,7 +74,7 @@ class ImportViewStep2 extends ImportView $this->ss->assign("IMPORT_MODULE", $_REQUEST['import_module']); $this->ss->assign("HEADER", $app_strings['LBL_IMPORT']." ". $mod_strings['LBL_MODULE_NAME']); - $this->ss->assign("JS", json_encode($this->_getJS())); + $this->ss->assign("JAVASCRIPT", $this->_getJS()); $this->ss->assign("SAMPLE_URL", "".$mod_strings['LBL_EXAMPLE_FILE'].""); $displayBackBttn = isset($_REQUEST['return_action']) && $_REQUEST['return_action'] != 'index'? TRUE : FALSE; @@ -147,21 +147,8 @@ class ImportViewStep2 extends ImportView $this->ss->assign("instructions",$instructions); $content = $this->ss->fetch('modules/Import/tpls/step2.tpl'); - - $submitContent = "
"; - $submitContent .= ""; - if ($displayBackBttn) { - $submitContent .= ""; - } - $submitContent .= "
"; - - - echo json_encode(array( - 'html' => $content, - 'submitContent' => $submitContent, - 'title' => $this->getModuleTitle(false), - 'script' => $this->_getJS(), - )); + $this->ss->assign("CONTENT",$content); + $this->ss->display('modules/Import/tpls/wizardWrapper.tpl'); } /** @@ -175,24 +162,10 @@ class ImportViewStep2 extends ImportView if( document.getElementById('goback') ) { - document.getElementById('goback').onclick = function(){ + document.getElementById('goback').onclick = function() + { document.getElementById('importstep2').action.value = 'Step1'; - - var success = function(data) { - var response = YAHOO.lang.JSON.parse(data.responseText); - importWizardDialogDiv = document.getElementById('importWizardDialogDiv'); - importWizardDialogTitle = document.getElementById('importWizardDialogTitle'); - submitDiv = document.getElementById('submitDiv'); - importWizardDialogDiv.innerHTML = response['html']; - importWizardDialogTitle.innerHTML = response['title']; - submitDiv.innerHTML = response['submitContent']; - eval(response['script']); - } - var formObject = document.getElementById('importstep2'); - YAHOO.util.Connect.setForm(formObject); - var cObj = YAHOO.util.Connect.asyncRequest('POST', "index.php", {success: success, failure: success}); - - + return true; } } @@ -213,32 +186,8 @@ document.getElementById('gonext').onclick = function(){ isError = true; } + return !isError; - if (!isError) { - var uploadHandler = { - upload: function(data) { - if (typeof(console) != "undefined" && typeof(console.log) == "function") - console.log(data.responseText); - var response = YAHOO.lang.JSON.parse(data.responseText); - importWizardDialogDiv = document.getElementById('importWizardDialogDiv'); - importWizardDialogTitle = document.getElementById('importWizardDialogTitle'); - submitDiv = document.getElementById('submitDiv'); - if(response['html'] && response['html'] != "") { - importWizardDialogDiv.innerHTML = response['html']; - importWizardDialogTitle.innerHTML = response['title']; - submitDiv.innerHTML = response['submitContent']; - } - - eval(response['script']); - } - }; - var formObject = document.getElementById('importstep2'); - YAHOO.util.Connect.setForm(formObject,true); - var cObj = YAHOO.util.Connect.asyncRequest('POST', "index.php", uploadHandler); - - } else { - return false; - } } function publishMapping(elem, publish, mappingId) diff --git a/modules/Import/views/view.step3.php b/modules/Import/views/view.step3.php index 81e188f3..7732130f 100644 --- a/modules/Import/views/view.step3.php +++ b/modules/Import/views/view.step3.php @@ -173,7 +173,7 @@ class ImportViewStep3 extends ImportView $this->instruction = 'LBL_SELECT_MAPPING_INSTRUCTION'; $this->ss->assign('INSTRUCTION', $this->getInstruction()); - $this->ss->assign("MODULE_TITLE", json_encode($this->getModuleTitle(false))); + $this->ss->assign("MODULE_TITLE", $this->getModuleTitle(false)); $this->ss->assign("STEP4_TITLE", strip_tags(str_replace("\n","",getClassicModuleTitle( $mod_strings['LBL_MODULE_NAME'], @@ -379,24 +379,15 @@ class ImportViewStep3 extends ImportView // include anything needed for quicksearch to work require_once("include/TemplateHandler/TemplateHandler.php"); $quicksearch_js = TemplateHandler::createQuickSearchCode($fields,$fields,'importstep3'); - $this->ss->assign("JS", json_encode($this->_getJS($required))); + + $this->ss->assign("QS_JS", $quicksearch_js); + $this->ss->assign("JAVASCRIPT", $this->_getJS($required)); $this->ss->assign('required_fields',implode(', ',$required)); $this->ss->assign('CSS', $this->_getCSS()); $content = $this->ss->fetch('modules/Import/tpls/step3.tpl'); - $this->ss->assign("CONTENT",json_encode($content)); - - $submitContent = "
"; - $submitContent .= ""; - $submitContent .= ""; - $submitContent .= "
"; - $submitContent .= $quicksearch_js; - $this->ss->assign("SUBMITCONTENT",json_encode($submitContent)); - - - - + $this->ss->assign("CONTENT",$content); $this->ss->display('modules/Import/tpls/wizardWrapper.tpl'); } @@ -454,25 +445,9 @@ EOCSS; $sqsWaitImage = SugarThemeRegistry::current()->getImageURL('sqsWait.gif'); return <<currentFormID}').action.value = '{$this->previousAction}'; - var success = function(data) { - var response = YAHOO.lang.JSON.parse(data.responseText); - importWizardDialogDiv = document.getElementById('importWizardDialogDiv'); - importWizardDialogTitle = document.getElementById('importWizardDialogTitle'); - submitDiv = document.getElementById('submitDiv'); - importWizardDialogDiv.innerHTML = response['html']; - importWizardDialogTitle.innerHTML = response['title']; - submitDiv.innerHTML = response['submitContent']; - eval(response['script']); - - } - - var formObject = document.getElementById('importstep3'); - YAHOO.util.Connect.setForm(formObject); - var cObj = YAHOO.util.Connect.asyncRequest('POST', "index.php", {success: success, failure: success}); + return true; } @@ -534,21 +509,7 @@ if( document.getElementById('gonext') ) { // Move on to next step document.getElementById('{$this->currentFormID}').action.value = '{$this->nextAction}'; - var success = function(data) { - var response = YAHOO.lang.JSON.parse(data.responseText); - importWizardDialogDiv = document.getElementById('importWizardDialogDiv'); - importWizardDialogTitle = document.getElementById('importWizardDialogTitle'); - submitDiv = document.getElementById('submitDiv'); - importWizardDialogDiv.innerHTML = response['html']; - importWizardDialogTitle.innerHTML = response['title']; - submitDiv.innerHTML = response['submitContent']; - eval(response['script']); - - } - - var formObject = document.getElementById('importstep3'); - YAHOO.util.Connect.setForm(formObject); - var cObj = YAHOO.util.Connect.asyncRequest('POST', "index.php", {success: success, failure: success}); + return true; } else return false; diff --git a/modules/Leads/Menu.php b/modules/Leads/Menu.php index ed69400e..9ad4f416 100644 --- a/modules/Leads/Menu.php +++ b/modules/Leads/Menu.php @@ -47,5 +47,5 @@ global $mod_strings, $app_strings, $sugar_config; if(ACLController::checkAccess('Leads', 'edit', true))$module_menu[]=Array("index.php?module=Leads&action=EditView&return_module=Leads&return_action=DetailView", $mod_strings['LNK_NEW_LEAD'],"CreateLeads", 'Leads'); if(ACLController::checkAccess('Leads', 'edit', true))$module_menu[]=Array("index.php?module=Leads&action=ImportVCard", $mod_strings['LNK_IMPORT_VCARD'],"CreateLeads", 'Leads'); if(ACLController::checkAccess('Leads', 'list', true))$module_menu[]=Array("index.php?module=Leads&action=index&return_module=Leads&return_action=DetailView", $mod_strings['LNK_LEAD_LIST'],"Leads", 'Leads'); -if(ACLController::checkAccess('Leads', 'import', true))$module_menu[]=Array("javascript:void(SUGAR.importWizard.renderDialog('Leads','step1',''));", $mod_strings['LNK_IMPORT_LEADS'],"Import", 'Leads'); +if(ACLController::checkAccess('Leads', 'import', true))$module_menu[]=Array("index.php?module=Import&action=Step1&import_module=Leads&return_module=Leads&return_action=index", $mod_strings['LNK_IMPORT_LEADS'],"Import", 'Leads'); ?> \ No newline at end of file diff --git a/modules/Meetings/Meeting.php b/modules/Meetings/Meeting.php index ea6e263f..93187bd9 100644 --- a/modules/Meetings/Meeting.php +++ b/modules/Meetings/Meeting.php @@ -199,7 +199,7 @@ class Meeting extends SugarBean { $this->type = 'Sugar'; } - if ( isset($api) && is_a($api,'WebMeeting') ) { + if ( isset($api) && is_a($api,'WebMeeting') && empty($this->in_relationship_update) ) { // Make sure the API initialized and it supports Web Meetings // Also make suer we have an ID, the external site needs something to reference if ( !isset($this->id) || empty($this->id) ) { diff --git a/modules/Meetings/Menu.php b/modules/Meetings/Menu.php index 02af4409..311fc3df 100644 --- a/modules/Meetings/Menu.php +++ b/modules/Meetings/Menu.php @@ -47,7 +47,7 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); global $mod_strings,$app_strings; if(ACLController::checkAccess('Meetings', 'edit', true))$module_menu[]=Array("index.php?module=Meetings&action=EditView&return_module=Meetings&return_action=DetailView", $mod_strings['LNK_NEW_MEETING'],"CreateMeetings"); if(ACLController::checkAccess('Meetings', 'list', true))$module_menu[]=Array("index.php?module=Meetings&action=index&return_module=Meetings&return_action=DetailView", $mod_strings['LNK_MEETING_LIST'],"Meetings"); -if(ACLController::checkAccess('Meetings', 'import', true))$module_menu[] =Array("javascript:void(SUGAR.importWizard.renderDialog('Meetings','step1',''));", $mod_strings['LNK_IMPORT_MEETINGS'],"Import", 'Contacts'); +if(ACLController::checkAccess('Meetings', 'import', true))$module_menu[] =Array("javascript:void(SUGAR.importWizard.renderDialog('Meetings','step1',''));", $mod_strings['LNK_IMPORT_MEETINGS'],"Import", 'Meetings'); diff --git a/modules/ModuleBuilder/javascript/ModuleBuilder.js b/modules/ModuleBuilder/javascript/ModuleBuilder.js index 9a44967a..88578154 100644 --- a/modules/ModuleBuilder/javascript/ModuleBuilder.js +++ b/modules/ModuleBuilder/javascript/ModuleBuilder.js @@ -159,6 +159,10 @@ if (typeof(ModuleBuilder) == 'undefined') { var w = (this.body.offsetWidth - 7) + "px"; this.body.style.width = w; this.header.style.width = w; + if (typeof Studio2 != "undefined") + Studio2.resizeDivs(); + if (typeof resizeDDLists == "function") + resizeDDLists(); }; mp.getUnitByPosition('right').on("resize", correctW); mp.getUnitByPosition('right').on("collapse", function(){ @@ -223,6 +227,9 @@ if (typeof(ModuleBuilder) == 'undefined') { SUGAR.themes.tempHideLeftCol(); } } + //We need to add ID's to the collapse buttons for automated testing + Dom.getElementsByClassName("collapse", "div", mp.getUnitByPosition('left').header)[0].id = "collapse_tree"; + Dom.getElementsByClassName("collapse", "div", mp.getUnitByPosition('right').header)[0].id = "collapse_help"; }, //Empty layout manager diff --git a/modules/ModuleBuilder/javascript/SimpleList.js b/modules/ModuleBuilder/javascript/SimpleList.js index 0b7e2b3a..7429ec29 100644 --- a/modules/ModuleBuilder/javascript/SimpleList.js +++ b/modules/ModuleBuilder/javascript/SimpleList.js @@ -49,6 +49,11 @@ if(typeof(SimpleList) == 'undefined'){ SimpleList.editImage = editImage; SimpleList.deleteImage = deleteImage; new YAHOO.util.DDTarget("ul1"); + + Studio2.scrollZones = {} + for (var i = 0; Dom.get("ul" + i); i++){ + Studio2.scrollZones["ul" + i] = Studio2.getScrollZones("ul" + i); + } for (i=0;i box[0][0] && xy[0] < box[1][0] && xy[1] > box[0][1] && xy[1] < box[1][1]; + }, + + setScrollObj: function(o){ + Studio2.scrollObj = o; + Studio2.scrollCheck = setInterval(function(){ + var o = Studio2.scrollObj; + for(var i in Studio2.scrollZones) + { + var zone = Studio2.scrollZones[i]; + if (o.goingUp && Studio2.isWithinBox([o.lastX, o.lastY], zone.up)) + { + document.getElementById(i).scrollTop -= 5; + YAHOO.util.DragDropMgr.refreshCache(); + return; + } + else if (!o.goingUp && Studio2.isWithinBox([o.lastX, o.lastY], zone.down)) + { + document.getElementById(i).scrollTop += 5; + YAHOO.util.DragDropMgr.refreshCache(); + return; + } + } + }, 25); + }, + + clearScrollObj: function() { + Studio2.scrollObj = false; + if (Studio2.scrollCheck) + clearInterval(Studio2.scrollCheck); + Studio2.scrollCheck = false; + }, + + onDrag: function(e) { + // Keep track of the direction of the drag for use during onDragOver + var y = e.pageY; + + if (y < this.lastY) { + this.goingUp = true; + } else if (y > this.lastY) { + this.goingUp = false; + } + + this.lastY = y; + this.lastX = e.pageX; + } }; diff --git a/modules/ModuleBuilder/javascript/studio2FieldDD.js b/modules/ModuleBuilder/javascript/studio2FieldDD.js index 82785907..1b33d990 100644 --- a/modules/ModuleBuilder/javascript/studio2FieldDD.js +++ b/modules/ModuleBuilder/javascript/studio2FieldDD.js @@ -58,9 +58,11 @@ YAHOO.extend(Studio2.FieldDD, YAHOO.util.DDProxy, { } else { YAHOO.util.Dom.setStyle(clickEl, "visibility", "hidden"); // want a empty space as we're dragging it away from this place } + Studio2.setScrollObj(this); }, endDrag: function(e) { + Studio2.clearScrollObj(); ModuleBuilder.state.isDirty=true; var srcEl = this.getEl(); var proxy = this.getDragEl(); @@ -85,12 +87,15 @@ YAHOO.extend(Studio2.FieldDD, YAHOO.util.DDProxy, { }, onInvalidDrop: function(e) { + Studio2.clearScrollObj(); var dragEl = this.getDragEl(); dragEl.innerHTML = ''; Studio2.removeCopy(); YAHOO.util.Dom.setStyle(this.getEl(), "display", "block"); }, + onDrag: Studio2.onDrag, + onDragDrop: function(e, id) { var srcEl = this.getEl(); var destEl = YAHOO.util.Dom.get(id); // where this element is being dropped diff --git a/modules/ModuleBuilder/javascript/studio2ListDD.js b/modules/ModuleBuilder/javascript/studio2ListDD.js index 291744f3..8cfe2ad4 100644 --- a/modules/ModuleBuilder/javascript/studio2ListDD.js +++ b/modules/ModuleBuilder/javascript/studio2ListDD.js @@ -88,6 +88,7 @@ YAHOO.extend(Studio2.ListDD, YAHOO.util.DDProxy, { Dom.setStyle(clickEl, "opacity", 0.5); Dom.setStyle(clickEl, "filter", "alpha(opacity=10)"); Dom.setStyle(clickEl, "border", '2px dashed #cccccc'); + Studio2.setScrollObj(this); }, updateTabs: function(){ @@ -110,6 +111,7 @@ YAHOO.extend(Studio2.ListDD, YAHOO.util.DDProxy, { }, endDrag: function(e){ + Studio2.clearScrollObj(); ModuleBuilder.state.isDirty=true; var clickEl = this.getEl(); var clickExEl = new YAHOO.util.Element(clickEl); @@ -147,7 +149,9 @@ YAHOO.extend(Studio2.ListDD, YAHOO.util.DDProxy, { dragEl.innerHTML = ""; }, - + + onDrag: Studio2.onDrag, + onDragOver: function(e, id){ var el; if (this.lastNode) { diff --git a/modules/ModuleBuilder/javascript/studio2PanelDD.js b/modules/ModuleBuilder/javascript/studio2PanelDD.js index bb4bc12c..618dc6f0 100644 --- a/modules/ModuleBuilder/javascript/studio2PanelDD.js +++ b/modules/ModuleBuilder/javascript/studio2PanelDD.js @@ -48,6 +48,7 @@ Studio2.PanelDD = function(id, sGroup) { YAHOO.extend(Studio2.PanelDD, YAHOO.util.DDProxy, { startDrag: function(x, y) { + var Dom = YAHOO.util.Dom; // make the proxy look like the source element var dragEl = this.getDragEl(); var clickEl = this.getEl(); @@ -63,15 +64,18 @@ YAHOO.extend(Studio2.PanelDD, YAHOO.util.DDProxy, { var copy = Studio2.newPanel(); Studio2.setCopy(copy); clickEl.parentNode.insertBefore(copy,clickEl.nextSibling); - YAHOO.util.Dom.setStyle(copy, 'display','block'); // must make it visible - the css sets rows outside of panel to invisible - YAHOO.util.Dom.setStyle(clickEl, "display","none"); - } + // must make it visible - the css sets rows outside of panel to invisible + Dom.setStyle(copy, 'display','block'); + Dom.setStyle(clickEl, "display","none"); + } - YAHOO.util.Dom.setStyle(clickEl, "visibility", "hidden"); + Dom.setStyle(clickEl, "visibility", "hidden"); + Studio2.setScrollObj(this); }, endDrag: function(e) { ModuleBuilder.state.isDirty=true; + Studio2.clearScrollObj(); // alert("endDrag"); var srcEl = this.getEl(); @@ -80,10 +84,17 @@ YAHOO.extend(Studio2.PanelDD, YAHOO.util.DDProxy, { var thisid = this.id; if (this.deletePanel) { - Studio2.removeElement(srcEl); + Studio2.removeElement(srcEl); // If we've just removed the last panel then we need to put an empty panel back in proxy.innerHTML = ''; Studio2.tidyPanels(); + //Check if this is the toolbox panel which must be re-activitated + if (Studio2.isSpecial(srcEl)) + { + Studio2.setSpecial(Studio2.copy()); + Studio2.activateCopy(); + YAHOO.util.Dom.setStyle(Studio2.copy(), "display", "block"); + } } else { // Show the proxy element and animate it to the src element's location @@ -144,6 +155,8 @@ YAHOO.extend(Studio2.PanelDD, YAHOO.util.DDProxy, { var srcEl = this.getEl(); var dragEl = this.getDragEl(); dragEl.innerHTML = ''; + Studio2.clearScrollObj(); + }, onDragDrop: function(e, id) { @@ -159,25 +172,14 @@ YAHOO.extend(Studio2.PanelDD, YAHOO.util.DDProxy, { } }, - onDrag: function(e) { - // Keep track of the direction of the drag for use during onDragOver - var y = e.pageY; - - if (y < this.lastY) { - this.goingUp = true; - } else if (y > this.lastY) { - this.goingUp = false; - } - - this.lastY = y; - }, + onDrag: Studio2.onDrag, onDragOver: function(e, id) { var srcEl = this.getEl(); var destEl = YAHOO.util.Dom.get(id); var dragEl = this.getDragEl(); - - if ((Studio2.establishLocation(destEl) == 'panels') && (destEl.className.indexOf('le_panel') != -1)) { + var loc = Studio2.establishLocation(destEl); + if ((loc == 'panels') && (destEl.className.indexOf('le_panel') != -1)) { YAHOO.util.Dom.setStyle(srcEl, 'visibility','hidden'); YAHOO.util.Dom.setStyle(srcEl, 'display','block'); var orig_p = srcEl.parentNode; diff --git a/modules/ModuleBuilder/javascript/studio2RowDD.js b/modules/ModuleBuilder/javascript/studio2RowDD.js index fb1e681a..05aa86ea 100644 --- a/modules/ModuleBuilder/javascript/studio2RowDD.js +++ b/modules/ModuleBuilder/javascript/studio2RowDD.js @@ -66,9 +66,11 @@ YAHOO.extend(Studio2.RowDD, YAHOO.util.DDProxy, { } YAHOO.util.Dom.setStyle(clickEl,'visibility','hidden'); + Studio2.setScrollObj(this); }, endDrag: function(e) { + Studio2.clearScrollObj(); ModuleBuilder.state.isDirty=true; // alert("endDrag"); @@ -80,6 +82,12 @@ YAHOO.extend(Studio2.RowDD, YAHOO.util.DDProxy, { if (this.deleteRow) { Studio2.removeElement(srcEl); proxy.innerHTML = ''; + //Check if this is the new row el, which must be re-activitated + if (Studio2.isSpecial(srcEl)) { + Studio2.setSpecial(Studio2.copy()); + Studio2.activateCopy(); + YAHOO.util.Dom.setStyle(Studio2.copy(), "display","block"); + } } else { // Show the proxy element and animate it to the src element's location YAHOO.util.Dom.setStyle(proxy, 'visibility',''); @@ -133,6 +141,7 @@ YAHOO.extend(Studio2.RowDD, YAHOO.util.DDProxy, { }, onInvalidDrop: function(e) { + Studio2.clearScrollObj(); this.getDragEl().innerHTML = ''; }, @@ -148,26 +157,15 @@ YAHOO.extend(Studio2.RowDD, YAHOO.util.DDProxy, { } }, - onDrag: function(e) { - // Keep track of the direction of the drag for use during onDragOver - var y = e.pageY; - - if (y < this.lastY) { - this.goingUp = true; - } else if (y > this.lastY) { - this.goingUp = false; - } - - this.lastY = y; - }, + onDrag: Studio2.onDrag, onDragOver: function(e, id) { var srcEl = this.getEl(); var destEl = document.getElementById(id); var srcLoc = Studio2.establishLocation(srcEl); var dstLoc = Studio2.establishLocation(destEl); - if ((Studio2.establishLocation(destEl) == 'panels') && (destEl.className.indexOf('le_row') != -1)) { - + + if ((Studio2.establishLocation(destEl) == 'panels') && (destEl.className.indexOf('le_row') != -1)) { YAHOO.util.Dom.setStyle(srcEl, "visibility","hidden"); YAHOO.util.Dom.setStyle(srcEl, "display" ,"block"); var orig_p = srcEl.parentNode; diff --git a/modules/ModuleBuilder/javascript/studiotabgroups.js b/modules/ModuleBuilder/javascript/studiotabgroups.js index b531739e..e87deaad 100644 --- a/modules/ModuleBuilder/javascript/studiotabgroups.js +++ b/modules/ModuleBuilder/javascript/studiotabgroups.js @@ -62,7 +62,7 @@ StudioTabGroup.prototype.editTabGroupLabel = function (id, done){ //Ext.dd.DragDropMgr.lock(); }else{ this.lastEditTabGroupLabel = -1; - document.getElementById('tabname_'+id).innerHTML =document.getElementById('tablabel_'+id).value; + document.getElementById('tabname_'+id).innerHTML = escape(document.getElementById('tablabel_'+id).value); document.getElementById('tabname_'+id).style.display = ''; document.getElementById('tablabel_'+id).style.display = 'none'; document.getElementById('tabother_'+id).style.display = ''; diff --git a/modules/ModuleBuilder/parsers/parser.dropdown.php b/modules/ModuleBuilder/parsers/parser.dropdown.php index 2d4daa32..27e68abe 100644 --- a/modules/ModuleBuilder/parsers/parser.dropdown.php +++ b/modules/ModuleBuilder/parsers/parser.dropdown.php @@ -61,10 +61,13 @@ require_once('modules/ModuleBuilder/parsers/ModuleBuilderParser.php'); $dropdown = array () ; // dropdown is received as an array of (name,value) pairs - now extract to name=>value format preserving order // we rely here on PHP to preserve the order of the received name=>value pairs - associative arrays in PHP are ordered - foreach ( $temp as $item ) - { - $dropdown[ $item [0] ] = remove_xss(from_html($item [ 1 ])) ; - } + if(is_array($temp)) + { + foreach ( $temp as $item ) + { + $dropdown[ remove_xss(from_html($item [ 0 ])) ] = remove_xss(from_html($item [ 1 ])) ; + } + } if(array_key_exists($emptyMarker, $dropdown)){ $output=array(); diff --git a/modules/ModuleBuilder/parsers/parser.label.php b/modules/ModuleBuilder/parsers/parser.label.php index 7d3b2f7d..7fff1856 100644 --- a/modules/ModuleBuilder/parsers/parser.label.php +++ b/modules/ModuleBuilder/parsers/parser.label.php @@ -149,6 +149,7 @@ class ParserLabel extends ModuleBuilderParser // if we have a cache to worry about, then clear it now if ($deployedModule) { + SugarCache::cleanOpcodes(); $GLOBALS [ 'log' ]->debug ( "PaserLabel->addLabels: clearing language cache" ) ; $cache_key = "module_language." . $language . $moduleName ; sugar_cache_clear ( $cache_key ) ; diff --git a/modules/ModuleBuilder/tpls/LayoutEditor.css b/modules/ModuleBuilder/tpls/LayoutEditor.css index ce0393e6..60cae5ed 100644 --- a/modules/ModuleBuilder/tpls/LayoutEditor.css +++ b/modules/ModuleBuilder/tpls/LayoutEditor.css @@ -48,7 +48,7 @@ #toolbox { float:left; width: 175px; padding:5px; margin:0; border: 1px dotted black;} #panels { float:right; - padding:5px 20px 10px 5px; + padding:5px 10px 5px 5px; margin-left:20px; border: 1px dotted black; } diff --git a/modules/ModuleBuilder/tpls/MBModule/Menu.tpl b/modules/ModuleBuilder/tpls/MBModule/Menu.tpl index 703861de..3440c5ef 100644 --- a/modules/ModuleBuilder/tpls/MBModule/Menu.tpl +++ b/modules/ModuleBuilder/tpls/MBModule/Menu.tpl @@ -41,4 +41,4 @@ global $mod_strings, $app_strings, $sugar_config; if(ACLController::checkAccess('{$moduleName}', 'edit', true))$module_menu[]=Array("index.php?module={$moduleName}&action=EditView&return_module={$moduleName}&return_action=DetailView", $mod_strings['LNK_NEW_RECORD'],"Create{$moduleName}", '{$moduleName}'); {if $showvCard}if(ACLController::checkAccess('{$moduleName}', 'edit', true))$module_menu[]=Array("index.php?module={$moduleName}&action=ImportVCard", $mod_strings['LNK_IMPORT_VCARD'],"Create{$moduleName}", '{$moduleName}');{/if} if(ACLController::checkAccess('{$moduleName}', 'list', true))$module_menu[]=Array("index.php?module={$moduleName}&action=index&return_module={$moduleName}&return_action=DetailView", $mod_strings['LNK_LIST'],"{$moduleName}", '{$moduleName}'); -{if $showimport}if(ACLController::checkAccess('{$moduleName}', 'import', true))$module_menu[]=Array("javascript:void(SUGAR.importWizard.renderDialog('{$moduleName}','step1',''));", $app_strings['LBL_IMPORT'],"Import", '{$moduleName}');{/if} \ No newline at end of file +{if $showimport}if(ACLController::checkAccess('{$moduleName}', 'import', true))$module_menu[]=Array("index.php?module=Import&action=Step1&import_module={$moduleName}&return_module={$moduleName}&return_action=index", $app_strings['LBL_IMPORT'],"Import", '{$moduleName}');{/if} \ No newline at end of file diff --git a/modules/ModuleBuilder/tpls/editProperty.tpl b/modules/ModuleBuilder/tpls/editProperty.tpl index c1e241da..655a05fd 100644 --- a/modules/ModuleBuilder/tpls/editProperty.tpl +++ b/modules/ModuleBuilder/tpls/editProperty.tpl @@ -60,7 +60,7 @@ { var property = field.name.substring('editProperty_'.length); var id = field.id.substring('editProperty_'.length); - document.getElementById(id).innerHTML = field.value; + document.getElementById(id).innerHTML = escape(field.value); } } } diff --git a/modules/ModuleBuilder/tpls/index.tpl b/modules/ModuleBuilder/tpls/index.tpl index 1ba7e513..e3f5a8fe 100644 --- a/modules/ModuleBuilder/tpls/index.tpl +++ b/modules/ModuleBuilder/tpls/index.tpl @@ -90,6 +90,8 @@ MBLoader.insert(); {/if} - + + + {include file='modules/ModuleBuilder/tpls/assistantJavascript.tpl'} \ No newline at end of file diff --git a/modules/ModuleBuilder/tpls/listView.tpl b/modules/ModuleBuilder/tpls/listView.tpl index c942a43a..8db1b3bd 100644 --- a/modules/ModuleBuilder/tpls/listView.tpl +++ b/modules/ModuleBuilder/tpls/listView.tpl @@ -179,6 +179,8 @@ function dragDropInit(){ resizeDDLists = function() { var Dom = YAHOO.util.Dom; + if (!Dom.get('ul0')) + return; var body = document.getElementById('mbtabs'); for(var msi = 0; msi < studiotabs.slotCount ; msi++){ var targetHeight = body.offsetHeight - (Dom.getY("ul" + msi) - Dom.getY(body)) - 20; @@ -189,6 +191,10 @@ resizeDDLists = function() { if (targetHeight > 0 ) Dom.setStyle("ul" + msi, "height", targetHeight + "px"); } + Studio2.scrollZones = {} + for (var i = 0; Dom.get("ul" + i); i++){ + Studio2.scrollZones["ul" + i] = Studio2.getScrollZones("ul" + i); + } }; function countListFields() { diff --git a/modules/ModuleBuilder/views/view.main.php b/modules/ModuleBuilder/views/view.main.php index 51cfe076..14658338 100644 --- a/modules/ModuleBuilder/views/view.main.php +++ b/modules/ModuleBuilder/views/view.main.php @@ -38,7 +38,7 @@ class ViewMain extends SugarView { function ViewMain(){ - $this->options['show_footer'] = true; + $this->options['show_footer'] = false; parent::SugarView(); } diff --git a/modules/ModuleBuilder/views/view.modulefield.php b/modules/ModuleBuilder/views/view.modulefield.php index b9371ac3..14135e83 100644 --- a/modules/ModuleBuilder/views/view.modulefield.php +++ b/modules/ModuleBuilder/views/view.modulefield.php @@ -126,12 +126,23 @@ class ViewModulefield extends SugarView 'ID', 'ID_C', ); + + //C.L. - Add support to mark related module id columns as reserved keywords + require_once 'modules/ModuleBuilder/parsers/relationships/DeployedRelationships.php'; + $relatedModules = array_keys(DeployedRelationships::findRelatableModules()) ; + global $beanList; + foreach($relatedModules as $relModule) + { + if(isset($beanList[$relModule])) + { + $field_name_exceptions[] = strtoupper($beanList[$relModule]) . '_ID'; + } + } + if(! isset($_REQUEST['view_package']) || $_REQUEST['view_package'] == 'studio' || empty ( $_REQUEST [ 'view_package' ] ) ) { $module = new stdClass; $moduleName = $_REQUEST['view_module']; - global $beanList; - $objectName = $beanList[$moduleName]; $className = $objectName; if($objectName == 'aCase') // Bug 17614 - renamed aCase as Case in vardefs for backwards compatibililty with 451 modules diff --git a/modules/Notes/Menu.php b/modules/Notes/Menu.php index 703384fe..6231e7a2 100644 --- a/modules/Notes/Menu.php +++ b/modules/Notes/Menu.php @@ -47,6 +47,6 @@ global $mod_strings, $app_strings; if(ACLController::checkAccess('Notes', 'edit', true))$module_menu[]=Array("index.php?module=Notes&action=EditView&return_module=Notes&return_action=DetailView", $mod_strings['LNK_NEW_NOTE'],"CreateNotes"); if(ACLController::checkAccess('Notes', 'list', true))$module_menu[]=Array("index.php?module=Notes&action=index&return_module=Notes&return_action=DetailView", $mod_strings['LNK_NOTE_LIST'],"Notes"); -if(ACLController::checkAccess('Notes', 'import', true))$module_menu[]=Array("javascript:void(SUGAR.importWizard.renderDialog('Notes','step1',''));", $mod_strings['LNK_IMPORT_NOTES'],"Import", 'Notes'); +if(ACLController::checkAccess('Notes', 'import', true))$module_menu[]=Array("index.php?module=Import&action=Step1&import_module=Notes&return_module=Notes&return_action=index", $mod_strings['LNK_IMPORT_NOTES'],"Import", 'Notes'); ?> \ No newline at end of file diff --git a/modules/Opportunities/Menu.php b/modules/Opportunities/Menu.php index 26d19196..149b35c6 100644 --- a/modules/Opportunities/Menu.php +++ b/modules/Opportunities/Menu.php @@ -52,7 +52,7 @@ if(ACLController::checkAccess('Opportunities','list',true)){ $module_menu[]= Array("index.php?module=Opportunities&action=index&return_module=Opportunities&return_action=DetailView", $mod_strings['LNK_OPPORTUNITY_LIST'],"Opportunities"); } if(ACLController::checkAccess('Opportunities','import',true)){ - $module_menu[]= Array("javascript:void(SUGAR.importWizard.renderDialog('Opportunities','step1',''));", $mod_strings['LNK_IMPORT_OPPORTUNITIES'],"Import"); + $module_menu[]= Array("index.php?module=Import&action=Step1&import_module=Opportunities&return_module=Opportunities&return_action=index", $mod_strings['LNK_IMPORT_OPPORTUNITIES'],"Import"); } ?> \ No newline at end of file diff --git a/modules/Prospects/Menu.php b/modules/Prospects/Menu.php index 812e00b0..67aae201 100644 --- a/modules/Prospects/Menu.php +++ b/modules/Prospects/Menu.php @@ -47,4 +47,4 @@ global $mod_strings, $app_strings; if(ACLController::checkAccess('Prospects', 'edit', true))$module_menu[]= Array("index.php?module=Prospects&action=EditView&return_module=Prospects&return_action=DetailView", $mod_strings['LNK_NEW_PROSPECT'],"CreateProspects"); if(ACLController::checkAccess('Prospects', 'list', true))$module_menu[]= Array("index.php?module=Prospects&action=index&return_module=Prospects&return_action=index", $mod_strings['LNK_PROSPECT_LIST'],"Prospects"); -if(ACLController::checkAccess('Prospects', 'import', true))$module_menu[]= Array("javascript:void(SUGAR.importWizard.renderDialog('Prospects','step1',''));", $mod_strings['LNK_IMPORT_PROSPECT'],"Import"); \ No newline at end of file +if(ACLController::checkAccess('Prospects', 'import', true))$module_menu[]= Array("index.php?module=Import&action=Step1&import_module=Prospects&return_module=Prospects&return_action=index", $mod_strings['LNK_IMPORT_PROSPECT'],"Import"); \ No newline at end of file diff --git a/modules/Studio/DropDowns/EditView.tpl b/modules/Studio/DropDowns/EditView.tpl index 29caaebd..7d49a9e5 100644 --- a/modules/Studio/DropDowns/EditView.tpl +++ b/modules/Studio/DropDowns/EditView.tpl @@ -217,11 +217,11 @@ if(record){ jstransaction.record('changeDropDownValue', {'row':rowCount, 'new':val, 'old':document.getElementById('value_'+ rowCount).value}); } - document.getElementById('value_' + rowCount).value = val; + document.getElementById('value_' + rowCount).value = escape(val); var text = document.getElementById('slot' + rowCount + '_text'); var textspan = document.getElementById('slot' + rowCount + '_textspan'); var span = document.getElementById('slot' + rowCount + '_value'); - span.innerHTML = val; + span.innerHTML = escape(val); textspan.style.display = 'none'; text.value = ''; span.style.display = 'inline'; @@ -264,7 +264,7 @@ span1.className = 'slot'; var keyspan = document.createElement('span'); keyspan.id = 'slot' + slotCount + '_key' - keyspan.innerHTML = addKey.value; + keyspan.innerHTML = escape(addKey.value); span1.appendChild(keyspan); var span2 = document.createElement('span'); span2.id = 'slot' + slotCount + 'b'; diff --git a/modules/Studio/studiotabgroups.js b/modules/Studio/studiotabgroups.js index 1abaf8dc..06af28c1 100644 --- a/modules/Studio/studiotabgroups.js +++ b/modules/Studio/studiotabgroups.js @@ -34,7 +34,7 @@ ********************************************************************************/ var subtabCount=[];var subtabModules=[];var tabLabelToValue=[];StudioTabGroup=function(){this.lastEditTabGroupLabel=-1;};StudioTabGroup.prototype.editTabGroupLabel=function(id,done){if(!done){if(this.lastEditTabGroupLabel!=-1)StudioTabGroup.prototype.editTabGroupLabel(this.lastEditTabGroupLabel,true);document.getElementById('tabname_'+id).style.display='none';document.getElementById('tablabel_'+id).style.display='';document.getElementById('tabother_'+id).style.display='none';try{document.getElementById('tablabel_'+id).focus();} catch(er){} -this.lastEditTabGroupLabel=id;YAHOO.util.DragDropMgr.lock();}else{this.lastEditTabGroupLabel=-1;document.getElementById('tabname_'+id).innerHTML=document.getElementById('tablabel_'+id).value;document.getElementById('tabname_'+id).style.display='';document.getElementById('tablabel_'+id).style.display='none';document.getElementById('tabother_'+id).style.display='';YAHOO.util.DragDropMgr.unlock();}} +this.lastEditTabGroupLabel=id;YAHOO.util.DragDropMgr.lock();}else{this.lastEditTabGroupLabel=-1;document.getElementById('tabname_'+id).innerHTML=escape(document.getElementById('tablabel_'+id).value);document.getElementById('tabname_'+id).style.display='';document.getElementById('tablabel_'+id).style.display='none';document.getElementById('tabother_'+id).style.display='';YAHOO.util.DragDropMgr.unlock();}} StudioTabGroup.prototype.generateForm=function(formname){var form=document.getElementById(formname);for(var j=0;j array( + array('name' => 'LBL_CAMPAIGNS', 'type' => 'plural'), + array('name' => 'LBL_CAMPAIGN_ID', 'type' => 'singular'), + array('name' => 'LBL_PARENT_ACCOUNT_ID', 'type' => 'singular'), + array('name' => 'LBL_PROSPECT_LIST', 'type' => 'singular'), + ), + 'Bugs' => array( + array('name' => 'LBL_LIST_FORM_TITLE', 'type' => 'singular'), + array('name' => 'LBL_LIST_MY_BUGS', 'type' => 'plural'), + array('name' => 'LBL_SEARCH_FORM_TITLE', 'type' => 'singular'), + array('name' => 'LNK_BUG_LIST', 'type' => 'plural'), + array('name' => 'LNK_BUG_REPORTS', 'type' => 'singular'), + array('name' => 'LNK_IMPORT_BUGS', 'type' => 'plural'), + array('name' => 'LNK_NEW_BUG', 'type' => 'singular'), + ), + 'Calls' => array( + array('name' => 'LBL_LIST_CONTACT', 'type' => 'singular'), + ), + 'Campaigns' => array( + array('name' => 'LBL_ACCOUNTS', 'type' => 'plural'), + array('name' => 'LBL_CONTACTS', 'type' => 'plural'), + array('name' => 'LBL_LIST_CAMPAIGN_NAME', 'type' => 'singular'), + array('name' => 'LBL_LOG_ENTRIES_CONTACT_TITLE', 'type' => 'plural'), + array('name' => 'LBL_LOG_ENTRIES_LEAD_TITLE', 'type' => 'plural'), + array('name' => 'LBL_OPPORTUNITIES', 'type' => 'plural'), + array('name' => 'LBL_PROSPECT_LIST_SUBPANEL_TITLE', 'type' => 'singular'), + ), + 'Cases' => array( + array('name' => 'LBL_BUGS_SUBPANEL_TITLE', 'type' => 'plural'), + array('name' => 'LBL_LIST_ACCOUNT_NAME', 'type' => 'singular'), + ), + 'Contacts' => array( + array('name' => 'LBL_BUGS_SUBPANEL_TITLE', 'type' => 'plural'), + array('name' => 'LBL_CAMPAIGN_LIST_SUBPANEL_TITLE', 'type' => 'plural'), + array('name' => 'LBL_CONTRACTS', 'type' => 'plural'), + array('name' => 'LBL_LIST_ACCOUNT_NAME', 'type' => 'singular'), + array('name' => 'LBL_LEAD_SOURCE', 'type' => 'singular'), + array('name' => 'LBL_OPPORTUNITIES', 'type' => 'singular'), + array('name' => 'LBL_OPPORTUNITY_ROLE', 'type' => 'singular'), + array('name' => 'LBL_OPPORTUNITY_ROLE_ID', 'type' => 'singular'), + array('name' => 'LBL_PRODUCTS_TITLE', 'type' => 'plural'), + array('name' => 'LBL_PROSPECT_LIST', 'type' => 'singular'), + ), + 'Contracts' => array( + array('name' => 'LBL_CONTRACT_NAME', 'type' => 'singular'), + array('name' => 'LBL_CONTRACT_TERM', 'type' => 'singular'), + array('name' => 'LBL_DOCUMENTS', 'type' => 'plural'), + array('name' => 'LBL_LIST_ACCOUNT_NAME', 'type' => 'singular'), + array('name' => 'LBL_LIST_CONTRACT_NAME', 'type' => 'singular'), + array('name' => 'LBL_OPPORTUNITY', 'type' => 'singular'), + array('name' => 'LBL_SEARCH_FORM_TITLE', 'type' => 'singular'), + array('name' => 'LBL_TOTAL_CONTRACT_VALUE', 'type' => 'singular'), + array('name' => 'LBL_TOTAL_CONTRACT_VALUE_USDOLLAR', 'type' => 'singular'), + array('name' => 'LNK_NEW_CONTRACT', 'type' => 'singular'), + ), + 'Documents' => array( + array('name' => 'LBL_BUGS_SUBPANEL_TITLE', 'type' => 'plural'), + array('name' => 'LBL_CONTRACTS', 'type' => 'plural'), + array('name' => 'LBL_CONTRACT_NAME', 'type' => 'singular'), + array('name' => 'LBL_CONTRACT_STATUS', 'type' => 'singular'), + array('name' => 'LBL_DET_RELATED_DOCUMENT_VERSION', 'type' => 'singular'), + array('name' => 'LBL_DET_TEMPLATE_TYPE', 'type' => 'singular'), + array('name' => 'LBL_DOC_ID', 'type' => 'singular'), + array('name' => 'LBL_DOC_NAME', 'type' => 'singular'), + array('name' => 'LBL_DOC_REV_HEADER', 'type' => 'singular'), + array('name' => 'LBL_DOC_URL', 'type' => 'singular'), + array('name' => 'LBL_NAME', 'type' => 'singular'), + array('name' => 'LBL_TEMPLATE_TYPE', 'type' => 'singular'), + ), + 'KBDocuments' => array( + array('name' => 'LBL_CASES', 'type' => 'plural'), + array('name' => 'LBL_CONTRACTS', 'type' => 'plural'), + array('name' => 'LBL_CONTRACT_NAME', 'type' => 'plural'), + ), + 'Leads' => array( + array('name' => 'LNK_NEW_###MODULE_SINGULAR###', 'type' => 'singular'), + array('name' => 'LNK_SELECT_###MODULE_PLURAL###', 'type' => 'singular'), + array('name' => 'LNK_SELECT_###MODULE_SINGULAR###', 'type' => 'singular'), + array('name' => 'LBL_ACCOUNT_DESCRIPTION', 'type' => 'singular'), + array('name' => 'LBL_ACCOUNT_ID', 'type' => 'singular'), + array('name' => 'LBL_ACCOUNT_NAME', 'type' => 'singular'), + array('name' => 'LBL_CAMPAIGN_ID', 'type' => 'singular'), + array('name' => 'LBL_CAMPAIGN_LEAD', 'type' => 'plural'), + array('name' => 'LBL_CAMPAIGN_LIST_SUBPANEL_TITLE', 'type' => 'plural'), + array('name' => 'LBL_CONTACT_ID', 'type' => 'singular'), + array('name' => 'LBL_LEAD_SOURCE', 'type' => 'singular'), + array('name' => 'LBL_LEAD_SOURCE_DESCRIPTION', 'type' => 'singular'), + array('name' => 'LBL_LIST_ACCOUNT_NAME', 'type' => 'singular'), + array('name' => 'LBL_OPPORTUNITY_AMOUNT', 'type' => 'singular'), + array('name' => 'LBL_OPPORTUNITY_ID', 'type' => 'singular'), + array('name' => 'LBL_OPPORTUNITY_NAME', 'type' => 'singular'), + ), + 'Meetings' => array( + array('name' => 'LBL_LIST_CONTACT', 'type' => 'singular'), + array('name' => 'LBL_LIST_JOIN_MEETING', 'type' => 'singular'), + array('name' => 'LBL_PASSWORD', 'type' => 'singular'), + array('name' => 'LBL_TYPE', 'type' => 'singular'), + array('name' => 'LBL_URL', 'type' => 'singular'), + ), + 'Notes' => array( + array('name' => 'LBL_ACCOUNT_ID', 'type' => 'singular'), + array('name' => 'LBL_CASE_ID', 'type' => 'singular'), + array('name' => 'LBL_CONTACT_ID', 'type' => 'singular'), + array('name' => 'LBL_LIST_CONTACT', 'type' => 'singular'), + array('name' => 'LBL_LIST_CONTACT_NAME', 'type' => 'singular'), + array('name' => 'LBL_NOTE_STATUS', 'type' => 'singular'), + array('name' => 'LBL_OPPORTUNITY_ID', 'type' => 'singular'), + array('name' => 'LBL_PRODUCT_ID', 'type' => 'singular'), + array('name' => 'LBL_QUOTE_ID', 'type' => 'singular'), + ), + 'Opportunities' => array( + array('name' => 'LBL_ACCOUNT_ID', 'type' => 'singular'), + array('name' => 'LBL_AMOUNT', 'type' => 'singular'), + array('name' => 'LBL_CAMPAIGN_OPPORTUNITY', 'type' => 'plural'), + array('name' => 'LBL_CONTRACTS', 'type' => 'plural'), + array('name' => 'LBL_LEAD_SOURCE', 'type' => 'singular'), + array('name' => 'LBL_LIST_ACCOUNT_NAME', 'type' => 'singular'), + array('name' => 'LBL_OPPORTUNITY_NAME', 'type' => 'singular'), + ), + 'ProductTemplates' => array( + array('name' => 'LBL_PRODUCT_ID', 'type' => 'singular'), + ), + 'Products' => array( + array('name' => 'LBL_ACCOUNT_ID', 'type' => 'singular'), + array('name' => 'LBL_CONTACT', 'type' => 'singular'), + array('name' => 'LBL_CONTACT_ID', 'type' => 'singular'), + array('name' => 'LBL_CONTRACTS', 'type' => 'plural'), + array('name' => 'LBL_LIST_ACCOUNT_NAME', 'type' => 'singular'), + array('name' => 'LBL_LIST_NAME', 'type' => 'singular'), + array('name' => 'LBL_NAME', 'type' => 'singular'), + array('name' => 'LBL_QUOTE_ID', 'type' => 'singular'), + array('name' => 'LBL_RELATED_PRODUCTS', 'type' => 'plural'), + array('name' => 'LBL_URL', 'type' => 'singular'), + ), + 'ProjectTask' => array( + array('name' => 'LBL_PARENT_NAME', 'type' => 'singular'), + array('name' => 'LBL_PROJECT_ID', 'type' => 'singular'), + array('name' => 'LBL_PROJECT_NAME', 'type' => 'singular'), + array('name' => 'LBL_PROJECT_TASK_ID', 'type' => 'singular'), + ), + 'Project' => array( + array('name' => 'LBL_BUGS_SUBPANEL_TITLE', 'type' => 'plural'), + array('name' => 'LBL_CONTACTS_RESOURCE', 'type' => 'singular'), + array('name' => 'LBL_LIST_FORM_TITLE', 'type' => 'singular'), + array('name' => 'LBL_OPPORTUNITIES', 'type' => 'plural'), + array('name' => 'LBL_PROJECT_HOLIDAYS_TITLE', 'type' => 'singular'), + array('name' => 'LBL_PROJECT_TASKS_SUBPANEL_TITLE', 'type' => 'singular'), + array('name' => 'LBL_SEARCH_FORM_TITLE', 'type' => 'singular'), + array('name' => 'LNK_NEW_PROJECT', 'type' => 'singular'), + array('name' => 'LNK_PROJECT_LIST', 'type' => 'singular'), + ), + 'Quotes' => array( + array('name' => 'LBL_ACCOUNT_ID', 'type' => 'singular'), + array('name' => 'LBL_CONTRACTS', 'type' => 'plural'), + array('name' => 'LBL_LIST_ACCOUNT_NAME', 'type' => 'singular'), + array('name' => 'LBL_QUOTE_NUM', 'type' => 'singular'), + ), + 'Targets' => array( + array('name' => 'LBL_ACCOUNT_NAME', 'type' => 'singular'), + array('name' => 'LBL_CAMPAIGN_ID', 'type' => 'plural'), + array('name' => 'LBL_CAMPAIGN_LIST_SUBPANEL_TITLE', 'type' => 'singular'), + array('name' => 'LBL_PROSPECT_LIST', 'type' => 'singular'), + ), + 'Tasks' => array( + array('name' => 'LBL_CONTACT', 'type' => 'singular'), + array('name' => 'LBL_CONTACT_ID', 'type' => 'singular'), + array('name' => 'LBL_CONTACT_PHONE', 'type' => 'singular'), + ), + ); + + /** * * @param string $options @@ -165,7 +340,11 @@ class RenameModules $this->changedModules = $this->getChangedModules(); //Change module, appStrings, subpanels, and related links. - $this->changeAppStringEntries()->changeAllModuleModStrings()->renameAllRelatedLinks()->renameAllSubpanels()->renameAllDashlets()->renameLeadsModuleModStrings(); + $this->changeAppStringEntries()->changeAllModuleModStrings()->renameAllRelatedLinks()->renameAllSubpanels()->renameAllDashlets(); + + foreach (self::$labelMap as $module=>$labelsArr) { + $this->renameCertainModuleModStrings($module, $labelsArr); + } //Refresh the page again so module tabs are changed as the save process happens after module tabs are already generated. if($redirect) @@ -445,38 +624,37 @@ class RenameModules return $this; } - /** - * Rename all module strings within the leads module. - * - * @return RenameModules - */ - private function renameLeadsModuleModStrings() - { - $GLOBALS['log']->debug("Begining to rename leads module"); - foreach($this->changedModules as $moduleName => $replacementLabels) - { - $this->changeLeadsModuleModStrings($moduleName, $replacementLabels); - } - - return $this; - } + /** + * Rename all module strings within the leads module. + * + * @param string $targetModule The name of the module that owns the labels to be changed. + * @param array $labelKeysToReplace The labels to be changed. + * @return RenameModules + */ + private function renameCertainModuleModStrings($targetModule, $labelKeysToReplace) + { + $GLOBALS['log']->debug("Beginning to rename labels for $targetModule module"); + foreach($this->changedModules as $moduleName => $replacementLabels) + { + $this->changeCertainModuleModStrings($moduleName, $replacementLabels, $targetModule, $labelKeysToReplace); + } + + return $this; + } - /** + /** * For a particular module, rename any relevant module strings that need to be replaced. * * @param string $moduleName The name of the module to be renamed. * @param $replacementLabels + * @param string $targetModule The name of the module that owns the labels to be changed. + * @param array $labelKeysToReplace The labels to be changed. * @return void */ - private function changeLeadsModuleModStrings($moduleName, $replacementLabels) + private function changeCertainModuleModStrings($moduleName, $replacementLabels, $targetModule, $labelKeysToReplace) { - $GLOBALS['log']->debug("Begining to change module labels for Leads: $moduleName"); - $currentModuleStrings = return_module_language($this->selectedLanguage, 'Leads'); - $labelKeysToReplace = array( - array('name' => 'LNK_NEW_###MODULE_SINGULAR###', 'type' => 'singular'), - array('name' => 'LNK_SELECT_###MODULE_PLURAL###', 'type' => 'singular'), - array('name' => 'LNK_SELECT_###MODULE_SINGULAR###', 'type' => 'singular'), - ); + $GLOBALS['log']->debug("Beginning to change module labels for : $moduleName"); + $currentModuleStrings = return_module_language($this->selectedLanguage, $targetModule); $replacedLabels = array(); foreach($labelKeysToReplace as $entry) @@ -487,13 +665,16 @@ class RenameModules if( isset($currentModuleStrings[$formattedLanguageKey]) ) { $oldStringValue = $currentModuleStrings[$formattedLanguageKey]; - $replacedLabels[$formattedLanguageKey] = $this->replaceSingleLabel($oldStringValue, $replacementLabels, $entry); + $newStringValue = $this->replaceSingleLabel($oldStringValue, $replacementLabels, $entry); + if ($oldStringValue != $newStringValue) { + $replacedLabels[$formattedLanguageKey] = $newStringValue; + } } } //Save all entries - ParserLabel::addLabels($this->selectedLanguage, $replacedLabels, 'Leads'); - $this->renamedModules['Leads'] = true; + ParserLabel::addLabels($this->selectedLanguage, $replacedLabels, $targetModule); + $this->renamedModules[$targetModule] = true; } diff --git a/modules/Tasks/Menu.php b/modules/Tasks/Menu.php index 935e8ff2..f5ac1880 100644 --- a/modules/Tasks/Menu.php +++ b/modules/Tasks/Menu.php @@ -39,4 +39,4 @@ if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); global $mod_strings,$app_strings; if(ACLController::checkAccess('Tasks', 'edit', true))$module_menu[]=Array("index.php?module=Tasks&action=EditView&return_module=Tasks&return_action=DetailView", $mod_strings['LNK_NEW_TASK'],"CreateTasks"); if(ACLController::checkAccess('Tasks', 'list', true))$module_menu[]=Array("index.php?module=Tasks&action=index&return_module=Tasks&return_action=DetailView", $mod_strings['LNK_TASK_LIST'],"Tasks"); -if(ACLController::checkAccess('Tasks', 'import', true))$module_menu[] =Array("javascript:void(SUGAR.importWizard.renderDialog('Tasks','step1',''));", $mod_strings['LNK_IMPORT_TASKS'],"Import", 'Contacts'); +if(ACLController::checkAccess('Tasks', 'import', true))$module_menu[] =Array("index.php?module=Import&action=Step1&import_module=Tasks&return_module=Tasks&return_action=index", $mod_strings['LNK_IMPORT_TASKS'],"Import", 'Contacts'); diff --git a/modules/Tasks/Task.php b/modules/Tasks/Task.php index 79439e82..0d833c19 100644 --- a/modules/Tasks/Task.php +++ b/modules/Tasks/Task.php @@ -341,7 +341,8 @@ class Task extends SugarBean { $xtpl->assign("TASK_SUBJECT", $task->name); //MFH #13507 $xtpl->assign("TASK_PRIORITY", (isset($task->priority)?$app_list_strings['task_priority_dom'][$task->priority]:"")); - $xtpl->assign("TASK_DUEDATE", $timedate->to_display_date_time($task->date_due . " " . $task->time_due,true,true,$notifyUser)." ".$prefDate['userGmt']); + $userGMT = !empty($prefDate['userGmt']) ? $prefDate['userGmt'] : ''; + $xtpl->assign("TASK_DUEDATE", $timedate->to_display_date_time($task->date_due . " " . $task->time_due,true,true,$notifyUser)." ".$userGMT); $xtpl->assign("TASK_STATUS", (isset($task->status)?$app_list_strings['task_status_dom'][$task->status]:"")); $xtpl->assign("TASK_DESCRIPTION", $task->description); diff --git a/modules/UpgradeWizard/uw_utils.php b/modules/UpgradeWizard/uw_utils.php index d669b94a..f7937a25 100644 --- a/modules/UpgradeWizard/uw_utils.php +++ b/modules/UpgradeWizard/uw_utils.php @@ -592,7 +592,7 @@ function deleteCache(){ //Clean modules from cache if(is_dir($GLOBALS['sugar_config']['cache_dir'].'modules')){ $allModFiles = array(); - $allModFiles = findAllFiles($GLOBALS['sugar_config']['cache_dir'].'modules',$allModFiles,true); + $allModFiles = findAllFiles($GLOBALS['sugar_config']['cache_dir'].'modules',$allModFiles); foreach($allModFiles as $file) { if(is_file($file)) { @@ -2873,7 +2873,9 @@ function uwFindAllFiles($dir, $the_array, $include_dirs=false, $skip_dirs=array( } } + if (!is_dir($dir)) { return $the_array; } // Bug # 46035, just checking for valid dir $d = dir($dir); + if ($d === false) { return $the_array; } // Bug # 46035, more checking while($f = $d->read()) { if($f == "." || $f == "..") { // skip *nix self/parent @@ -5026,6 +5028,9 @@ function upgradeSugarCache($file) } $allFiles = array(); + if(file_exists(clean_path("{$cacheUploadUpgradesTemp}/{$manifest['copy_files']['from_dir']}/include/database"))) { + $allFiles = findAllFiles(clean_path("{$cacheUploadUpgradesTemp}/{$manifest['copy_files']['from_dir']}/include/database"), $allFiles); + } if(file_exists(clean_path("{$cacheUploadUpgradesTemp}/{$manifest['copy_files']['from_dir']}/include/SugarCache"))) { $allFiles = findAllFiles(clean_path("{$cacheUploadUpgradesTemp}/{$manifest['copy_files']['from_dir']}/include/SugarCache"), $allFiles); } diff --git a/modules/Users/GeneratePassword.php b/modules/Users/GeneratePassword.php index 58e5a1ea..3ac83856 100644 --- a/modules/Users/GeneratePassword.php +++ b/modules/Users/GeneratePassword.php @@ -257,7 +257,6 @@ if (isset($_POST['link']) && $_POST['link'] == '1'){ $now=TimeDate::getInstance()->nowDb(); $query = "UPDATE $usr->table_name SET user_hash='$user_hash', system_generated_password='1', pwd_last_changed='$now' where id='$usr->id'"; $usr->db->query($query, true, "Error setting new password for $usr->user_name: "); - echo $password; } }else{ $new_pwd='4'; diff --git a/modules/Users/Menu.php b/modules/Users/Menu.php index 504fa60a..cc578b48 100644 --- a/modules/Users/Menu.php +++ b/modules/Users/Menu.php @@ -57,7 +57,7 @@ if($GLOBALS['current_user']->isAdminForModule('Users') ); $module_menu[] = Array("index.php?module=Users&action=ListView&return_module=Users&return_action=DetailView", $mod_strings['LNK_USER_LIST'],"Users"); - $module_menu[] = Array("javascript:void(SUGAR.importWizard.renderDialog('Users','step1',''));", $mod_strings['LNK_IMPORT_USERS'],"Import", 'Contacts'); + $module_menu[] = Array("index.php?module=Import&action=Step1&import_module=Users&return_module=Users&return_action=index", $mod_strings['LNK_IMPORT_USERS'],"Import", 'Contacts'); } /* array_push($module_menu, Array("index.php?module=Users&action=EditTabs&return_module=Users&return_action=DetailView", $mod_strings['LNK_EDIT_TABS'],"Users")) diff --git a/modules/Users/authentication/SAMLAuthenticate/settings.php b/modules/Users/authentication/SAMLAuthenticate/settings.php index 64afc64f..24d6f8cd 100644 --- a/modules/Users/authentication/SAMLAuthenticate/settings.php +++ b/modules/Users/authentication/SAMLAuthenticate/settings.php @@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @return SamlSettings object */ -function saml_get_settings() +function get_saml_settings() { // this function should be modified to return the SAML settings for the current user diff --git a/modules/Users/tpls/wizard.tpl b/modules/Users/tpls/wizard.tpl index 75821f5c..bcd96aa0 100644 --- a/modules/Users/tpls/wizard.tpl +++ b/modules/Users/tpls/wizard.tpl @@ -347,6 +347,8 @@ function disableReturnSubmission(e) { {if $IS_ADMIN} {$MOD.LBL_WIZARD_FINISH2}
{$MOD.LBL_WIZARD_FINISH2DESC}
+ {$MOD.LBL_WIZARD_FINISH3}
{$MOD.LBL_WIZARD_FINISH4} +
{$MOD.LBL_WIZARD_FINISH5}
{$MOD.LBL_WIZARD_FINISH6}
{$MOD.LBL_WIZARD_FINISH7}
{$MOD.LBL_WIZARD_FINISH8} diff --git a/service/core/SoapHelperWebService.php b/service/core/SoapHelperWebService.php index 1c38701e..6dcbb89a 100644 --- a/service/core/SoapHelperWebService.php +++ b/service/core/SoapHelperWebService.php @@ -353,7 +353,10 @@ function validate_user($user_name, $password){ } // if $GLOBALS['log']->info('End: SoapHelperWebServices->check_modules_access'); return false; - } + }elseif($action == 'write' && strcmp(strtolower($module_name), 'users') == 0 && !$user->isAdminForModule($module_name)){ + //rrs bug: 46000 - If the client is trying to write to the Users module and is not an admin then we need to stop them + return false; + } $GLOBALS['log']->info('End: SoapHelperWebServices->check_modules_access'); return true; } diff --git a/soap/SoapHelperFunctions.php b/soap/SoapHelperFunctions.php index 7982f60f..6c17b3d8 100644 --- a/soap/SoapHelperFunctions.php +++ b/soap/SoapHelperFunctions.php @@ -327,11 +327,14 @@ function check_modules_access($user, $module_name, $action='write'){ if(!isset($_SESSION['avail_modules'])){ $_SESSION['avail_modules'] = get_user_module_list($user); } - if(isset($_SESSION['avail_modules'][$module_name])){ + if(isset($_SESSION['avail_modules'][$module_name])){ if($action == 'write' && $_SESSION['avail_modules'][$module_name] == 'read_only'){ if(is_admin($user))return true; return false; - } + }elseif($action == 'write' && strcmp(strtolower($module_name), 'users') == 0 && !$user->isAdminForModule($module_name)){ + //rrs bug: 46000 - If the client is trying to write to the Users module and is not an admin then we need to stop them + return false; + } return true; } return false; diff --git a/sugar_version.php b/sugar_version.php index 3f6d0ae6..728189f5 100644 --- a/sugar_version.php +++ b/sugar_version.php @@ -38,10 +38,10 @@ -$sugar_version = '6.3.0beta3'; -$sugar_db_version = '6.3.0beta3'; +$sugar_version = '6.3.0beta4'; +$sugar_db_version = '6.3.0beta4'; $sugar_flavor = 'CE'; -$sugar_build = '6799'; -$sugar_timestamp = '2011-08-24 01:27pm'; +$sugar_build = '6814'; +$sugar_timestamp = '2011-08-31 02:44pm'; ?> diff --git a/tests/ModuleInstall/ExtTest.php b/tests/ModuleInstall/ExtTest.php new file mode 100755 index 00000000..b0a60cd0 --- /dev/null +++ b/tests/ModuleInstall/ExtTest.php @@ -0,0 +1,189 @@ +is_admin = "1"; + $GLOBALS['current_language'] = "en_us"; + $GLOBALS['app_strings'] = return_application_language($GLOBALS['current_language']); + $GLOBALS['mod_strings'] = return_module_language($GLOBALS['current_language'], 'Administration'); + mkdir_recursive("cache/ExtTest"); + } + + public function setUp() + { + $this->module_installer = new ModuleInstaller(); + $this->module_installer->silent = true; + $this->module_installer->base_dir = "cache/ExtTest"; + $this->module_installer->id_name = 'ExtFrameworkTest'; + $this->testvalue = uniqid("ext", true); + file_put_contents($this->module_installer->base_dir."/test.ext.php", "testvalue';"); + } + + public function tearDown() + { + if($this->module_installer) { + $this->module_installer->uninstall_extensions(); + } + if(file_exists($this->module_installer->base_dir."/test.ext.php")) { + @unlink($this->module_installer->base_dir."/test.ext.php"); + } + } + + public static function tearDownAfterClass() + { + SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); + unset($GLOBALS['current_user']); + unset($GLOBALS['current_language']); + unset($GLOBALS['app_strings']); + unset($GLOBALS['mod_strings']); + if(file_exists("cache/ExtTest/test.ext.php")) { + @unlink("cache/ExtTest/test.ext.php"); + } + rmdir_recursive("cache/ExtTest"); + } + + public function getExt() + { + include 'ModuleInstall/extensions.php'; + $params = array(); + foreach($extensions as $name => $ext) { + if($name == 'modules') continue; + $params[] = array($name, $ext['section'], $ext['extdir'], $ext['file'], isset($ext['module'])?$ext['module']:''); + } + return $params; + } + + /** + * @dataProvider getExt + * @param string $extname + * @param string $section + * @param string $dir + * @param string $file + * @param string $module + */ + public function testExtFramework($extname, $section, $extdir, $file, $module = '') + { + if(empty($module)) { + $module = 'application'; + } + $this->module_installer->installdefs[$section] = array( + array("from" => '/test.ext.php', 'to_module' => $module) + ); + $prefix = ''; + $srcFileName = "test.ext.php"; + if($extname == 'languages') { + $this->module_installer->installdefs[$section][0]['language'] = 'en_us'; + $prefix = 'en_us.'; + $file = 'lang.ext.php'; + $srcFileName = "ExtFrameworkTest.php"; + } + if($module == 'application') { + $srcfile = "custom/Extension/application/Ext/$extdir/{$prefix}{$srcFileName}"; + $dstfile = "custom/application/Ext/$extdir/{$prefix}$file"; + } else { + $srcfile = "custom/Extension/modules/$module/Ext/$extdir/{$prefix}{$srcFileName}"; + $dstfile = "custom/modules/$module/Ext/$extdir/{$prefix}$file"; + } + $this->module_installer->install_extensions(); + // check file is there + $this->assertFileExists($srcfile); + $testvalue = null; + // check it works + include($dstfile); + $this->assertEquals($this->testvalue, $testvalue); + $testvalue = null; + // check disable + $this->module_installer->disable_extensions(); + if(file_exists($dstfile)) include($dstfile); + $this->assertNull($testvalue); + // check enable + $this->module_installer->enable_extensions(); + $this->assertFileExists($srcfile); + include($dstfile); + $this->assertEquals($this->testvalue, $testvalue); + $testvalue = null; + // check uninstall + $this->module_installer->uninstall_extensions(); + if(file_exists($dstfile)) include($dstfile); + $this->assertNull($testvalue); + } + + public function testExtModules() + { + $this->module_installer->installdefs['beans'] = array( + array( + 'module' => 'ExtFrameworkTest', + 'class' => 'ExtFrameworkTest', + 'path' => 'ExtFrameworkTest', + 'tab' => true + ) + ); + $srcfile = "custom/Extension/application/Ext/Include/ExtFrameworkTest.php"; + $dstfile = "custom/application/Ext/Include/modules.ext.php"; + $this->module_installer->install_extensions(); + // check file is there + $this->assertFileExists($srcfile); + $beanList = null; + // check it works + include($dstfile); + $this->assertEquals('ExtFrameworkTest', $beanList['ExtFrameworkTest']); + // check disable + $this->module_installer->disable_extensions(); + $beanList = array(); + if(file_exists($dstfile)) include($dstfile); + $this->assertArrayNotHasKey('ExtFrameworkTest', $beanList); + // check enable + $beanList = array(); + $this->module_installer->enable_extensions(); + $this->assertFileExists($srcfile); + include($dstfile); + $this->assertEquals('ExtFrameworkTest', $beanList['ExtFrameworkTest']); + $beanList = array(); + // check uninstall + $this->module_installer->uninstall_extensions(); + if(file_exists($dstfile)) include($dstfile); + $this->assertArrayNotHasKey('ExtFrameworkTest', $beanList); + } +} diff --git a/tests/SugarTestHelper.php b/tests/SugarTestHelper.php index 386c6753..1ef34f68 100755 --- a/tests/SugarTestHelper.php +++ b/tests/SugarTestHelper.php @@ -121,6 +121,13 @@ class Sugar_PHPUnit_Framework_TestCase extends PHPUnit_Framework_TestCase protected $useOutputBuffering = true; + protected function assertPreConditions() + { + if(isset($GLOBALS['log'])) { + $GLOBALS['log']->info("START TEST: {$this->getName(false)}"); + } + } + protected function assertPostConditions() { if(!empty($_REQUEST)) { foreach(array_keys($_REQUEST) as $k) { @@ -139,11 +146,16 @@ class Sugar_PHPUnit_Framework_TestCase extends PHPUnit_Framework_TestCase unset($_GET[$k]); } } + if(isset($GLOBALS['log'])) { + $GLOBALS['log']->info("DONE TEST: {$this->getName(false)}"); + } } public static function tearDownAfterClass() { unset($GLOBALS['disable_date_format']); + unset($GLOBALS['saving_relationships']); + unset($GLOBALS['updating_relationships']); $GLOBALS['timedate']->clearCache(); } } diff --git a/tests/SugarTestImportUtilities.php b/tests/SugarTestImportUtilities.php index 5e8d2e00..fb387b7b 100755 --- a/tests/SugarTestImportUtilities.php +++ b/tests/SugarTestImportUtilities.php @@ -48,12 +48,9 @@ class SugarTestImportUtilities self::removeAllCreatedFiles(); } - public static function createFile( - $lines = 2000, - $columns = 3 - ) + public static function createFile($lines = 2000,$columns = 3, $dir = 'upload_dir') { - $filename = $GLOBALS['sugar_config']['import_dir'].'test'.date("YmdHis"); + $filename = $GLOBALS['sugar_config'][$dir].'test'. uniqid(); $fp = fopen($filename,"w"); for ($i = 0; $i < $lines; $i++) { $line = array(); @@ -73,7 +70,7 @@ class SugarTestImportUtilities $columns = 3 ) { - $filename = $GLOBALS['sugar_config']['import_dir'].'test'.date("YmdHis"); + $filename = $GLOBALS['sugar_config']['upload_dir'].'test'.date("YmdHis"); $fp = fopen($filename,"w"); for ($i = 0; $i < $lines; $i++) { $line = array(); @@ -92,7 +89,7 @@ class SugarTestImportUtilities public static function createFileWithWhiteSpace() { - $filename = $GLOBALS['sugar_config']['import_dir'].'testWhiteSpace'.date("YmdHis"); + $filename = $GLOBALS['sugar_config']['upload_dir'].'testWhiteSpace'.date("YmdHis"); $contents = <<query('DELETE FROM meetings_contacts WHERE meeting_id IN (\'' . implode("', '", $meeting_ids) . '\')'); } - public static function getCreatedMeetingIds() + public static function addMeetingLeadRelation($meeting_id, $lead_id) { + $id = create_guid(); + $GLOBALS['db']->query("INSERT INTO meetings_leads (id, meeting_id, lead_id) values ('{$id}', '{$meeting_id}', '{$lead_id}')"); + return $id; + } + + public static function deleteMeetingLeadRelation($id) { + $GLOBALS['db']->query("delete from meetings_leads where id='{$id}'"); + } + + + public static function addMeetingParent($meeting_id, $lead_id) { + $sql = "update meetings set parent_type='Leads', parent_id='{$lead_id}' where id='{$meeting_id}'"; + $GLOBALS['db']->query($sql); + } + + public static function getCreatedMeetingIds() { $meeting_ids = array(); foreach (self::$_createdMeetings as $meeting) { diff --git a/tests/data/Bug39780Test.php b/tests/data/Bug39780Test.php index 1a6fa8e3..54db5970 100755 --- a/tests/data/Bug39780Test.php +++ b/tests/data/Bug39780Test.php @@ -39,20 +39,22 @@ class Bug39780Test extends Sugar_PHPUnit_Framework_TestCase { protected $contact; - + public function setUp() { $GLOBALS['current_user'] = SugarTestUserUtilities::createAnonymousUser(); $this->contact = SugarTestContactUtilities::createContact(); + $this->defs = $this->contact->field_defs; } - + public function tearDown() { + $this->contact->field_defs = $this->defs; SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); unset($GLOBALS['current_user']); SugarTestContactUtilities::removeAllCreatedContacts(); } - + // Test unPopulateDefaultValues to make sure it doesn't generate any notices /* * @group bug39780 @@ -68,7 +70,7 @@ class Bug39780Test extends Sugar_PHPUnit_Framework_TestCase $this->assertTrue(false, "SugarBean->unPopulateDefaultValues is generating a notice/warning/fatal: " .$e->getMessage()); return; } - + $this->assertTrue(true); } } diff --git a/tests/data/Bug40989Test.php b/tests/data/Bug40989Test.php index 2a203728..2fc782ad 100755 --- a/tests/data/Bug40989Test.php +++ b/tests/data/Bug40989Test.php @@ -63,7 +63,7 @@ class Bug40989 extends Sugar_PHPUnit_Framework_TestCase unset($GLOBALS['current_user']); SugarTestContactUtilities::removeAllCreatedContacts(); } - + /* * @group bug40989 */ @@ -71,7 +71,7 @@ class Bug40989 extends Sugar_PHPUnit_Framework_TestCase { $loadedContact = loadBean('Contacts'); $loadedContact = $loadedContact->retrieve_by_string_fields(array('last_name'=>'SugarContactLast')); - + $this->assertEquals('SugarContactLast', $loadedContact->fetched_row['last_name']); } @@ -80,9 +80,9 @@ class Bug40989 extends Sugar_PHPUnit_Framework_TestCase $loadedContact = loadBean('Contacts'); $loadedContact->disable_row_level_security = true; $contactList = $loadedContact->get_full_list(); - - $exampleContact = array_pop($contactList); - + + $exampleContact = array_shift($contactList); + $this->assertNotNull($exampleContact->fetched_row['last_name']); } } diff --git a/tests/include/Bug33806.php b/tests/include/Bug33806.php new file mode 100755 index 00000000..e89e26ab --- /dev/null +++ b/tests/include/Bug33806.php @@ -0,0 +1,92 @@ + 'Account', 'module' => 'Accounts'), + array( 'singular' => 'Contact', 'module' => 'Contacts'), + ); + } + + /** + * Test the getMime function for the use case where the mime type is already provided. + * + * @dataProvider _moduleNameProvider + */ + public function testGetModuleFromSingular($singular, $expectedName) + { + $GLOBALS['app_list_strings'] = return_app_list_strings_language($GLOBALS['current_language']); + + $module = get_module_from_singular($singular); + + $this->assertEquals($expectedName, $module); + } + + function _moduleNameProvider2() + { + return array( + array( 'renamed' => 'Acct', 'module' => 'Accounts'), + ); + } + + /** + * Test the getMime function for the use case where the mime type is already provided. + * + * @dataProvider _moduleNameProvider2 + */ + public function testGetModuleFromRenamed($renamed, $expectedName) + { + $GLOBALS['app_list_strings'] = return_app_list_strings_language($GLOBALS['current_language']); + + // manually rename the module name to 'Acct' + $GLOBALS['app_list_strings']['moduleList']['Accounts'] = 'Acct'; + + $module = get_module_from_singular($renamed); + + $this->assertEquals($expectedName, $module); + } +} diff --git a/tests/include/ListView/ListViewDisplayTest.php b/tests/include/ListView/ListViewDisplayTest.php index 44c5f161..d5b841bf 100755 --- a/tests/include/ListView/ListViewDisplayTest.php +++ b/tests/include/ListView/ListViewDisplayTest.php @@ -332,8 +332,8 @@ class ListViewDisplayTest extends Sugar_PHPUnit_Framework_TestCase public function testBuildMassUpdateLink() { $output = $this->_lvd->buildMassUpdateLink(); - - $this->assertContains("assertRegExp("/.*document\.getElementById\(['\"]massupdate_form['\"]\)\.style\.display\s*=\s*['\"]['\"].*/", $output); } public function testComposeEmailIfFieldDefsNotAnArray() @@ -391,6 +391,7 @@ class ListViewDisplayTest extends Sugar_PHPUnit_Framework_TestCase $this->_lvd->seed = new stdClass; $this->_lvd->seed->object_name = 'foobar'; $this->_lvd->seed->module_dir = 'foobarfoobar'; + $_REQUEST['module'] = 'foobarfoobar'; $this->_lvd->seed->field_defs = array( 'field1' => array( 'type' => 'link', diff --git a/tests/include/MVC/SugarApplicationTest.php b/tests/include/MVC/SugarApplicationTest.php index 4012d7be..679913a4 100755 --- a/tests/include/MVC/SugarApplicationTest.php +++ b/tests/include/MVC/SugarApplicationTest.php @@ -52,6 +52,12 @@ class SugarApplicationTest extends Sugar_PHPUnit_Framework_TestCase $this->_app = new SugarApplicationMock(); if ( isset($_SESSION['authenticated_user_theme']) ) unset($_SESSION['authenticated_user_theme']); + + if ( isset($GLOBALS['sugar_config']['http_referer']) ) { + $this->prevRefererList = $GLOBALS['sugar_config']['http_referer']; + } + + $GLOBALS['sugar_config']['http_referer'] = array('list' => array(), 'actions' => array()); } private function _loadUser() @@ -66,6 +72,7 @@ class SugarApplicationTest extends Sugar_PHPUnit_Framework_TestCase unset($GLOBALS['current_user']); } + public function tearDown() { unset($GLOBALS['current_user']); @@ -84,6 +91,12 @@ class SugarApplicationTest extends Sugar_PHPUnit_Framework_TestCase unset($GLOBALS['sugar_version']); unset($GLOBALS['sugar_flavor']); $GLOBALS['current_language'] = $GLOBALS['sugar_config']['default_language']; + + if ( isset($this->prevRefererList)) { + $GLOBALS['sugar_config']['http_referer'] = $this->prevRefererList; + } else { + unset ($GLOBALS['sugar_config']['http_referer']); + } } public function testSetupPrint() @@ -259,16 +272,9 @@ class SugarApplicationTest extends Sugar_PHPUnit_Framework_TestCase $_SERVER['SERVER_NAME'] = 'cat'; $this->_app->controller->action = 'index'; - if ( !empty($GLOBALS['sugar_config']['http_referer']['list']) ) { - $prevRefererList = $GLOBALS['sugar_config']['http_referer']['list']; - } - $GLOBALS['sugar_config']['http_referer']['list'][] = 'http://dog'; - + $GLOBALS['sugar_config']['http_referer']['list'][] = 'dog'; + $this->assertTrue($this->_app->checkHTTPReferer()); - - if ( isset($prevRefererList) ) { - $GLOBALS['sugar_config']['http_referer']['list'] = $prevRefererList; - } } public function testCheckHTTPRefererReturnsFalseIfRefererIsNotInWhitelist() @@ -276,7 +282,9 @@ class SugarApplicationTest extends Sugar_PHPUnit_Framework_TestCase $_SERVER['HTTP_REFERER'] = 'http://dog'; $_SERVER['SERVER_NAME'] = 'cat'; $this->_app->controller->action = 'poo'; - + + $GLOBALS['sugar_config']['http_referer']['list'] = array(); + $this->assertFalse($this->_app->checkHTTPReferer()); } @@ -285,7 +293,7 @@ class SugarApplicationTest extends Sugar_PHPUnit_Framework_TestCase $_SERVER['HTTP_REFERER'] = 'http://dog'; $_SERVER['SERVER_NAME'] = 'cat'; $this->_app->controller->action = 'index'; - + $this->assertTrue($this->_app->checkHTTPReferer()); } @@ -295,16 +303,9 @@ class SugarApplicationTest extends Sugar_PHPUnit_Framework_TestCase $_SERVER['SERVER_NAME'] = 'cat'; $this->_app->controller->action = 'poo'; - if ( !empty($GLOBALS['sugar_config']['http_referer']['actions']) ) { - $prevRefererList = $GLOBALS['sugar_config']['http_referer']['actions']; - } $GLOBALS['sugar_config']['http_referer']['actions'][] = 'poo'; $this->assertTrue($this->_app->checkHTTPReferer()); - - if ( isset($prevRefererList) ) { - $GLOBALS['sugar_config']['http_referer']['actions'] = $prevRefererList; - } } } diff --git a/tests/include/Smarty/plugins/FunctionSugarLinkTest.php b/tests/include/Smarty/plugins/FunctionSugarLinkTest.php index 57b956e2..6a6a4415 100755 --- a/tests/include/Smarty/plugins/FunctionSugarLinkTest.php +++ b/tests/include/Smarty/plugins/FunctionSugarLinkTest.php @@ -53,7 +53,7 @@ class FunctionSugarLinkTest extends Sugar_PHPUnit_Framework_TestCase array('module'=>'Dog','link_only'=>'1'), $this->_smarty); - $this->assertContains("index.php?module=Dog&action=index",$output); + $this->assertContains(ajaxLink("index.php?module=Dog&action=index"),$output); } public function testReturnModuleLinkWithAction() @@ -62,7 +62,7 @@ class FunctionSugarLinkTest extends Sugar_PHPUnit_Framework_TestCase array('module'=>'Dog','action'=>'cat','link_only'=>'1'), $this->_smarty); - $this->assertContains("index.php?module=Dog&action=cat",$output); + $this->assertContains(ajaxLink("index.php?module=Dog&action=cat"),$output); } public function testReturnModuleLinkWithActionAndExtraParams() @@ -71,7 +71,7 @@ class FunctionSugarLinkTest extends Sugar_PHPUnit_Framework_TestCase array('module'=>'Dog','action'=>'cat','extraparams'=>'foo=bar','link_only'=>'1'), $this->_smarty); - $this->assertContains("index.php?module=Dog&action=cat&foo=bar",$output); + $this->assertContains(ajaxLink("index.php?module=Dog&action=cat&foo=bar"),$output); } /** @@ -92,7 +92,7 @@ class FunctionSugarLinkTest extends Sugar_PHPUnit_Framework_TestCase array('module'=>'Dog','data'=>$data,'link_only'=>'1'), $this->_smarty); - $this->assertContains("index.php?module=iFrames&action=index&record=63edeacd-6ba5-b658-5e2a-4af9a5d682be&tab=true",$output); + $this->assertContains(ajaxLink("index.php?module=iFrames&action=index&record=63edeacd-6ba5-b658-5e2a-4af9a5d682be&tab=true"),$output); } public function testCreatingFullLink() @@ -112,7 +112,7 @@ class FunctionSugarLinkTest extends Sugar_PHPUnit_Framework_TestCase $this->_smarty); $this->assertContains( - 'foo3',$output); + 'foo3',$output); } } diff --git a/tests/include/SugarFolders/SugarFoldersTest.php b/tests/include/SugarFolders/SugarFoldersTest.php index c700e196..7c27045d 100755 --- a/tests/include/SugarFolders/SugarFoldersTest.php +++ b/tests/include/SugarFolders/SugarFoldersTest.php @@ -55,7 +55,16 @@ class SugarFoldersTest extends Sugar_PHPUnit_Framework_TestCase $this->folder = new SugarFolder(); $this->additionalFolders = array(); $this->emails = array(); - } + $beanList = array(); + $beanFiles = array(); + require('include/modules.php'); + $GLOBALS['beanList'] = $beanList; + $GLOBALS['beanFiles'] = $beanFiles; + if (empty($GLOBALS['current_language'])) { + $GLOBALS['current_language'] = 'en_us'; + } + $GLOBALS['app_strings'] = return_application_language($GLOBALS['current_language']); + } public function tearDown() { diff --git a/tests/include/TimeDateTest.php b/tests/include/TimeDateTest.php index c61b2351..feb8ec29 100755 --- a/tests/include/TimeDateTest.php +++ b/tests/include/TimeDateTest.php @@ -34,7 +34,7 @@ * "Powered by SugarCRM". ********************************************************************************/ - + require_once 'include/TimeDate.php'; class TimeDateTest extends Sugar_PHPUnit_Framework_TestCase @@ -899,4 +899,35 @@ class TimeDateTest extends Sugar_PHPUnit_Framework_TestCase $f = $this->time_date->get_date_time_format($current_user); $this->assertEquals("Y-m-d H:i", $f); } + + public function dateRanges() + { + return array( + array("yesterday", "2011-08-29 00:00:00", "2011-08-29 23:59:59"), + array("today", "2011-08-30 00:00:00", "2011-08-30 23:59:59"), + array("tomorrow", "2011-08-31 00:00:00", "2011-08-31 23:59:59"), + array("last_7_days", "2011-08-24 00:00:00", "2011-08-30 23:59:59"), + array("next_7_days", "2011-08-30 00:00:00", "2011-09-05 23:59:59"), + array("last_30_days", "2011-08-01 00:00:00", "2011-08-30 23:59:59"), + array("next_30_days", "2011-08-30 00:00:00", "2011-09-28 23:59:59"), + array("next_month", "2011-09-01 00:00:00", "2011-09-30 23:59:59"), + array("last_month", "2011-07-01 00:00:00", "2011-07-31 23:59:59"), + array("this_month", "2011-08-01 00:00:00", "2011-08-31 23:59:59"), + array("next_year", "2012-01-01 00:00:00", "2012-12-31 23:59:59"), + array("last_year", "2010-01-01 00:00:00", "2010-12-31 23:59:59"), + array("this_year", "2011-01-01 00:00:00", "2011-12-31 23:59:59"), + ); + } + + /** + * @dataProvider dateRanges + */ + public function testparseDateRange($range, $start, $end) + { + $this->time_date->setNow(SugarDateTime::createFromFormat(TimeDate::DB_DATETIME_FORMAT, "2011-08-30 12:01:02", new DateTimeZone($this->time_date->userTimezone()))); + $this->time_date->allow_cache = true; + $daterage = $this->time_date->parseDateRange($range); + $this->assertEquals($start, $daterage[0]->format(TimeDate::DB_DATETIME_FORMAT), 'Start date is wrong'); + $this->assertEquals($end, $daterage[1]->format(TimeDate::DB_DATETIME_FORMAT), 'End date is wrong'); + } } diff --git a/tests/include/generic/SugarWidgets/Bug44272Test.php b/tests/include/generic/SugarWidgets/Bug44272Test.php index a3d2b02a..26053f14 100755 --- a/tests/include/generic/SugarWidgets/Bug44272Test.php +++ b/tests/include/generic/SugarWidgets/Bug44272Test.php @@ -46,18 +46,18 @@ var $account; public function setUp() { - require('include/modules.php'); - $GLOBALS['beanList'] = $beanList; - $GLOBALS['beanFiles'] = $beanFiles; - $GLOBALS['current_user'] = SugarTestUserUtilities::createAnonymousUser(); - $GLOBALS['current_user']->is_admin = true; + $beanList = array(); + $beanFiles = array(); + require('include/modules.php'); + $GLOBALS['beanList'] = $beanList; + $GLOBALS['beanFiles'] = $beanFiles; + $this->account = SugarTestAccountUtilities::createAccount(); } public function tearDown() { SugarTestAccountUtilities::removeAllCreatedAccounts(); - SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); } public function testSugarWidgetSubpanelTopButtonQuickCreate() @@ -69,7 +69,7 @@ public function testSugarWidgetSubpanelTopButtonQuickCreate() $subpanel_definitions = new SubPanelDefinitions(new Contact()); $contactSubpanelDef = $subpanel_definitions->load_subpanel('contacts'); - + $subpanel = new SubPanel('Accounts', $this->account->id, 'contacts', $contactSubpanelDef, 'Accounts'); $defines['subpanel_definition'] = $subpanel->subpanel_defs; diff --git a/tests/include/javascript/JSAlertsTest.php b/tests/include/javascript/JSAlertsTest.php index c3b678c6..45efbc75 100755 --- a/tests/include/javascript/JSAlertsTest.php +++ b/tests/include/javascript/JSAlertsTest.php @@ -43,6 +43,10 @@ class JSAlertsTest extends Sugar_PHPUnit_Framework_TestCase public function setUp() { + require('include/modules.php'); + $GLOBALS['beanList'] = $beanList; + $GLOBALS['beanFiles'] = $beanFiles; + global $current_user; $this->beans = array(); $this->old_user = $current_user; @@ -61,6 +65,8 @@ class JSAlertsTest extends Sugar_PHPUnit_Framework_TestCase unset($GLOBALS['app_list_strings']); unset($GLOBALS['current_user']); unset($GLOBALS['app_strings']); + unset($GLOBALS['beanList']); + unset($GLOBALS['beanFiles']); } protected function createNewMeeting() diff --git a/tests/modules/Administration/Bug36978Test.php b/tests/modules/Administration/Bug36978Test.php index 0e145795..28d9ab5f 100755 --- a/tests/modules/Administration/Bug36978Test.php +++ b/tests/modules/Administration/Bug36978Test.php @@ -242,7 +242,7 @@ EOQ; $GLOBALS['db']->query($sql); $rel = new Relationship(); - $rel->delete_cache(); + Relationship::delete_cache(); $rel->build_relationship_cache(); $this->moduleList = $GLOBALS['moduleList']; diff --git a/tests/modules/Home/Bug43653Test.php b/tests/modules/Home/Bug43653Test.php index ee25596e..e8abe606 100755 --- a/tests/modules/Home/Bug43653Test.php +++ b/tests/modules/Home/Bug43653Test.php @@ -37,8 +37,8 @@ class Bug43653Test extends Sugar_PHPUnit_Framework_OutputTestCase { - - public function setUp() + + public function setUp() { $GLOBALS['current_user'] = SugarTestUserUtilities::createAnonymousUser(); if(file_exists($GLOBALS['sugar_config']['cache_dir']. 'modules/unified_search_modules.php')) @@ -46,15 +46,15 @@ class Bug43653Test extends Sugar_PHPUnit_Framework_OutputTestCase copy($GLOBALS['sugar_config']['cache_dir']. 'modules/unified_search_modules.php', $GLOBALS['sugar_config']['cache_dir']. 'modules/unified_search_modules.php.bak'); unlink($GLOBALS['sugar_config']['cache_dir']. 'modules/unified_search_modules.php'); } - + if(file_exists('custom/modules/unified_search_modules_display.php')) { copy('custom/modules/unified_search_modules_display.php', 'custom/modules/unified_search_modules_display.php.bak'); unlink('custom/modules/unified_search_modules_display.php'); - } + } } - - public function tearDown() + + public function tearDown() { SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); unset($GLOBALS['current_user']); @@ -64,17 +64,17 @@ class Bug43653Test extends Sugar_PHPUnit_Framework_OutputTestCase copy($GLOBALS['sugar_config']['cache_dir']. 'modules/unified_search_modules.php.bak', $GLOBALS['sugar_config']['cache_dir']. 'modules/unified_search_modules.php'); unlink($GLOBALS['sugar_config']['cache_dir']. 'modules/unified_search_modules.php.bak'); } - + if(file_exists('custom/modules/unified_search_modules_display.php.bak')) { copy('custom/modules/unified_search_modules_display.php.bak', 'custom/modules/unified_search_modules_display.php'); unlink('custom/modules/unified_search_modules_display.php.bak'); - } - + } + SugarTestTaskUtilities::removeAllCreatedTasks(); SugarTestAccountUtilities::removeAllCreatedAccounts(); } - + public function testFisrtUnifiedSearchWithoutUserPreferences() { //Enable the Tasks, Accounts and Contacts modules @@ -82,20 +82,20 @@ class Bug43653Test extends Sugar_PHPUnit_Framework_OutputTestCase $_REQUEST = array(); $_REQUEST['enabled_modules'] = 'Tasks,Accounts,Contacts'; $unifiedSearchAdvanced = new UnifiedSearchAdvanced(); - $unifiedSearchAdvanced->saveGlobalSearchSettings(); - + $unifiedSearchAdvanced->saveGlobalSearchSettings(); + $_REQUEST = array(); $_REQUEST['advanced'] = 'false'; $unifiedSearchAdvanced->query_stirng = 'blah'; - $unifiedSearchAdvanced->search(); + $unifiedSearchAdvanced->search(); global $current_user; $users_modules = $current_user->getPreference('globalSearch', 'search'); $this->assertTrue(!empty($users_modules), 'Assert we have set the user preferences properly'); $this->assertTrue(isset($users_modules['Tasks']), 'Assert that we have added the Tasks module'); $this->assertEquals(count($users_modules), 3, 'Assert that we have 3 modules in user preferences for global search'); } - + } ?> \ No newline at end of file diff --git a/tests/modules/Import/Bug45963Test.php b/tests/modules/Import/Bug45963Test.php new file mode 100755 index 00000000..40dc5464 --- /dev/null +++ b/tests/modules/Import/Bug45963Test.php @@ -0,0 +1,64 @@ +assertEmpty($modules['Groups']); + $this->assertNotEmpty($modules['Contacts']); + $this->assertNotEmpty($modules['Accounts']); + } +} + diff --git a/tests/modules/Import/CsvAutoDetectTest.php b/tests/modules/Import/CsvAutoDetectTest.php new file mode 100755 index 00000000..1afab34a --- /dev/null +++ b/tests/modules/Import/CsvAutoDetectTest.php @@ -0,0 +1,107 @@ + "\"date_entered\",\"description\"\n\"3/26/2011 10:02am\",\"test description\"", + 1 => "\"date_entered\"\t\"description\"\n\"2011-3-26 10:2 am\"\t\"test description\"", + 2 => "\"date_entered\",\"description\"\n\"3.26.2011 15.02\",\"test description\"", + 3 => "\"3/26/2011 10:02am\",\"some text\"\n\"4/26/2011 11:20am\",\"some more text\"", + ); + + public function setUp() + { + // if beanList got unset, set it back + if (!isset($GLOBALS['beanList'])) { + require('include/modules.php'); + $GLOBALS['beanList'] = $beanList; + } + } + + public function tearDown() + { + unlink($GLOBALS['sugar_config']['tmp_dir'].'test.csv'); + } + + public function providerCsvData() + { + return array( + array(0, ',', '"', 'm/d/Y', 'h:ia', true), + array(1, "\t", '"', 'Y-m-d', 'h:i a', true), + array(2, ",", '"', 'm.d.Y', 'H.i', true), + array(3, ',', '"', 'm/d/Y', 'h:ia', false), + ); + } + + /** + * @dataProvider providerCsvData + */ + public function testGetCsvProperties($content_idx, $delimiter, $enclosure, $date, $time, $header) + { + $file = $GLOBALS['sugar_config']['tmp_dir'].'test.csv'; + $ret = file_put_contents($file, self::$CsvContent[$content_idx]); + $this->assertGreaterThan(0, $ret, 'Failed to write to '.$file .' for content '.$content_idx); + + $auto = new CsvAutoDetect($file); + $del = $enc = $hasHeader = false; + $ret = $auto->getCsvSettings($del, $enc); + $this->assertEquals(true, $ret, 'Failed to parse and get csv properties'); + + // delimiter + $this->assertEquals($delimiter, $del, 'Incorrect delimiter'); + + // enclosure + $this->assertEquals($enclosure, $enc, 'Incorrect enclosure'); + + // date format + $date_format = $auto->getDateFormat(); + $this->assertEquals($date, $date_format, 'Incorrect date format'); + + // time format + $time_format = $auto->getTimeFormat(); + $this->assertEquals($time, $time_format, 'Incorrect time format'); + + // header + $auto->hasHeader($hasHeader, 'Contacts'); + $this->assertEquals($header, $hasHeader, 'Incorrect header'); + } + +} diff --git a/tests/modules/Import/ImportDuplicateCheckTest.php b/tests/modules/Import/ImportDuplicateCheckTest.php index 142ff2f7..911e71e8 100755 --- a/tests/modules/Import/ImportDuplicateCheckTest.php +++ b/tests/modules/Import/ImportDuplicateCheckTest.php @@ -104,7 +104,7 @@ class ImportDuplicateCheckTest extends Sugar_PHPUnit_Framework_TestCase $idc = new ImportDuplicateCheck($focus); - $this->assertTrue($idc->isADuplicateRecord(array('idx_contacts_del_last'))); + $this->assertTrue($idc->isADuplicateRecord(array('idx_contacts_del_last::last_name'))); $focus->mark_deleted($id); } @@ -136,7 +136,7 @@ class ImportDuplicateCheckTest extends Sugar_PHPUnit_Framework_TestCase $idc = new ImportDuplicateCheck($focus); - $this->assertFalse($idc->isADuplicateRecord(array('idx_contacts_del_last'))); + $this->assertFalse($idc->isADuplicateRecord(array('idx_contacts_del_last::'.$last_name))); } public function testIsADuplicateRecordEmailNotFound() diff --git a/tests/modules/Import/ImportFieldSanitizeTest.php b/tests/modules/Import/ImportFieldSanitizeTest.php index 1542a5f4..ce684379 100755 --- a/tests/modules/Import/ImportFieldSanitizeTest.php +++ b/tests/modules/Import/ImportFieldSanitizeTest.php @@ -36,7 +36,7 @@ require_once('modules/Import/ImportFieldSanitize.php'); -require_once("modules/Import/ImportFile.php"); +require_once('modules/Import/sources/ImportFile.php'); require_once('tests/SugarTestLangPackCreator.php'); class ImportFieldSanitizeTest extends Sugar_PHPUnit_Framework_TestCase diff --git a/tests/modules/Import/ImportFileLimitTest.php b/tests/modules/Import/ImportFileLimitTest.php new file mode 100755 index 00000000..39b1e79e --- /dev/null +++ b/tests/modules/Import/ImportFileLimitTest.php @@ -0,0 +1,81 @@ +_fileSample1 = SugarTestImportUtilities::createFile( $this->_fileLineCount1, 3, 'upload_dir' ); + $this->_fileSample2 = SugarTestImportUtilities::createFile( $this->_fileLineCount2, 3, 'upload_dir' ); + $this->_fileSample3 = SugarTestImportUtilities::createFile( $this->_fileLineCount3, 3, 'upload_dir' ); + $this->_fileSample4 = SugarTestImportUtilities::createFile( $this->_fileLineCount4, 3, 'upload_dir' ); + } + + public function tearDown() + { + SugarTestImportUtilities::removeAllCreatedFiles(); + SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); + unset($GLOBALS['current_user']); + } + + public function testGetFileRowCount() + { + $if1 = new ImportFile($this->_fileSample1, ',', "\"", FALSE); + $if2 = new ImportFile($this->_fileSample2, ',', "\"", FALSE); + $if3 = new ImportFile($this->_fileSample3, ',', "\"", FALSE); + $if4 = new ImportFile($this->_fileSample4, ',', "\"", FALSE); + + $this->assertEquals($this->_fileLineCount1, $if1->getNumberOfLinesInfile() ); + $this->assertEquals($this->_fileLineCount2, $if2->getNumberOfLinesInfile() ); + $this->assertEquals($this->_fileLineCount3, $if3->getNumberOfLinesInfile() ); + $this->assertEquals($this->_fileLineCount4, $if4->getNumberOfLinesInfile() ); + } +} + diff --git a/tests/modules/Import/ImportFileSplitterTest.php b/tests/modules/Import/ImportFileSplitterTest.php index 097cb8c7..5eadc7ae 100755 --- a/tests/modules/Import/ImportFileSplitterTest.php +++ b/tests/modules/Import/ImportFileSplitterTest.php @@ -35,7 +35,7 @@ ********************************************************************************/ -require_once 'modules/Import/ImportFile.php'; +require_once('modules/Import/sources/ImportFile.php'); require_once 'modules/Import/ImportFileSplitter.php'; class ImportFileSplitterTest extends Sugar_PHPUnit_Framework_TestCase @@ -124,8 +124,6 @@ class ImportFileSplitterTest extends Sugar_PHPUnit_Framework_TestCase $splitter = new ImportFileSplitter($this->_whiteSpaceFile); $splitter->splitSourceFile(',',' ',false); - $csvString = file_get_contents("{$this->_whiteSpaceFile}-0"); - $this->assertEquals( trim(file_get_contents("{$this->_whiteSpaceFile}-0")), trim(file_get_contents("{$this->_whiteSpaceFile}")) diff --git a/tests/modules/Import/ImportFileTest.php b/tests/modules/Import/ImportFileTest.php index 19ee0931..c4c5c474 100755 --- a/tests/modules/Import/ImportFileTest.php +++ b/tests/modules/Import/ImportFileTest.php @@ -35,7 +35,7 @@ ********************************************************************************/ -require_once 'modules/Import/ImportFile.php'; +require_once('modules/Import/sources/ImportFile.php'); class ImportFileTest extends Sugar_PHPUnit_Framework_TestCase { @@ -57,7 +57,7 @@ class ImportFileTest extends Sugar_PHPUnit_Framework_TestCase public function testFileImportNoEnclosers() { $file = SugarTestImportUtilities::createFile(2,1); - $importFile = new ImportFile($file,',',''); + $importFile = new ImportFile($file,',','', TRUE, FALSE); $row = $importFile->getNextRow(); $this->assertEquals($row, array('foo00')); $row = $importFile->getNextRow(); @@ -73,7 +73,7 @@ class ImportFileTest extends Sugar_PHPUnit_Framework_TestCase public function testLoadGoodFile() { $file = SugarTestImportUtilities::createFile(2,1); - $importFile = new ImportFile($file,',','"'); + $importFile = new ImportFile($file,',','"', TRUE, FALSE); $this->assertTrue($importFile->fileExists()); } @@ -82,18 +82,21 @@ class ImportFileTest extends Sugar_PHPUnit_Framework_TestCase */ public function testLoadFileWithByteOrderMark() { - $importFile = new ImportFile('tests/modules/Import/Bug39494ImportFile.txt',"\t",'',false); + $sample_file = $GLOBALS['sugar_config']['upload_dir'].'/Bug39494ImportFile.txt'; + copy('tests/modules/Import/Bug39494ImportFile.txt', $sample_file); + $importFile = new ImportFile($sample_file,"\t",'',false); $this->assertTrue($importFile->fileExists()); $row = $importFile->getNextRow(); $this->assertEquals($row,array('name','city')); $row = $importFile->getNextRow(); $this->assertEquals($row,array('tester1','wuhan')); + unlink($sample_file); } public function testGetNextRow() { $file = SugarTestImportUtilities::createFile(3,2); - $importFile = new ImportFile($file,',','"'); + $importFile = new ImportFile($file,',','"', TRUE, FALSE); $row = $importFile->getNextRow(); $this->assertEquals(array("foo00","foo01"),$row); @@ -109,7 +112,7 @@ class ImportFileTest extends Sugar_PHPUnit_Framework_TestCase public function testGetNextRowWithEOL() { $file = SugarTestImportUtilities::createFileWithEOL(1, 1); - $importFile = new ImportFile($file,',','"'); + $importFile = new ImportFile($file,',','"', TRUE, FALSE); $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); @@ -134,7 +137,7 @@ class ImportFileTest extends Sugar_PHPUnit_Framework_TestCase public function testDeleteFileOnDestroy() { $file = SugarTestImportUtilities::createFile(3,2); - $importFile = new ImportFile($file,',','"',true); + $importFile = new ImportFile($file,',','"',true, FALSE); unset($importFile); @@ -154,16 +157,16 @@ class ImportFileTest extends Sugar_PHPUnit_Framework_TestCase public function testGetFieldCount() { $file = SugarTestImportUtilities::createFile(3,2); - $importFile = new ImportFile($file,',','"'); + $importFile = new ImportFile($file,',','"',TRUE, FALSE); $importFile->getNextRow(); - $this->assertEquals($importFile->getFieldCount(),2); + $this->assertEquals(2,$importFile->getFieldCount()); } public function testMarkRowAsDuplicate() { $file = SugarTestImportUtilities::createFile(3,2); - $importFile = new ImportFile($file,',','"'); + $importFile = new ImportFile($file,',','"', TRUE, FALSE); $row = $importFile->getNextRow(); $importFile->markRowAsDuplicate(); @@ -178,7 +181,7 @@ class ImportFileTest extends Sugar_PHPUnit_Framework_TestCase public function testWriteError() { $file = SugarTestImportUtilities::createFile(3,2); - $importFile = new ImportFile($file,',','"'); + $importFile = new ImportFile($file,',','"', TRUE, FALSE); $row = $importFile->getNextRow(); $importFile->writeError('Some Error','field1','foo'); @@ -189,7 +192,7 @@ class ImportFileTest extends Sugar_PHPUnit_Framework_TestCase $this->assertEquals(array('Some Error','field1','foo',1),$errorrow); - $fp = sugar_fopen(ImportCacheFiles::getErrorRecordsFileName(),'r'); + $fp = sugar_fopen(ImportCacheFiles::getErrorRecordsWithoutErrorFileName(),'r'); $errorrecordrow = fgetcsv($fp); fclose($fp); @@ -199,12 +202,12 @@ class ImportFileTest extends Sugar_PHPUnit_Framework_TestCase public function testWriteErrorRecord() { $file = SugarTestImportUtilities::createFile(3,2); - $importFile = new ImportFile($file,',','"'); + $importFile = new ImportFile($file,',','"', TRUE, FALSE); $row = $importFile->getNextRow(); $importFile->writeErrorRecord(); - $fp = sugar_fopen(ImportCacheFiles::getErrorRecordsFileName(),'r'); + $fp = sugar_fopen(ImportCacheFiles::getErrorRecordsWithoutErrorFileName(),'r'); $errorrecordrow = fgetcsv($fp); fclose($fp); @@ -214,7 +217,7 @@ class ImportFileTest extends Sugar_PHPUnit_Framework_TestCase public function testWriteStatus() { $file = SugarTestImportUtilities::createFile(3,2); - $importFile = new ImportFile($file,',','"'); + $importFile = new ImportFile($file,',','"', TRUE, FALSE); $importFile->getNextRow(); $importFile->writeError('Some Error','field1','foo'); @@ -234,7 +237,7 @@ class ImportFileTest extends Sugar_PHPUnit_Framework_TestCase public function testWriteStatusWithTwoErrorsInOneRow() { $file = SugarTestImportUtilities::createFile(3,2); - $importFile = new ImportFile($file,',','"'); + $importFile = new ImportFile($file,',','"', TRUE, FALSE); $row = $importFile->getNextRow(); $importFile->writeError('Some Error','field1','foo'); @@ -251,10 +254,11 @@ class ImportFileTest extends Sugar_PHPUnit_Framework_TestCase $this->assertEquals(array(3,1,0,2,0,$file),$statusrow); - $fp = sugar_fopen(ImportCacheFiles::getErrorRecordsFileName(),'r'); + $fp = sugar_fopen(ImportCacheFiles::getErrorRecordsWithoutErrorFileName(),'r'); $errorrecordrow = fgetcsv($fp); - + $this->assertEquals($row,$errorrecordrow); + $this->assertFalse(fgetcsv($fp),'Should be only 1 record in the csv file'); fclose($fp); @@ -263,7 +267,7 @@ class ImportFileTest extends Sugar_PHPUnit_Framework_TestCase public function testWriteStatusWithTwoUpdatedRecords() { $file = SugarTestImportUtilities::createFile(3,2); - $importFile = new ImportFile($file,',','"'); + $importFile = new ImportFile($file,',','"', TRUE, FALSE); $row = $importFile->getNextRow(); $importFile->markRowAsImported(false); @@ -276,7 +280,7 @@ class ImportFileTest extends Sugar_PHPUnit_Framework_TestCase $fp = sugar_fopen(ImportCacheFiles::getStatusFileName(),'r'); $statusrow = fgetcsv($fp); fclose($fp); - + $this->assertEquals(array(3,0,0,2,1,$file),$statusrow); } diff --git a/tests/modules/Import/ImportFormsTest.php b/tests/modules/Import/ImportFormsTest.php index 60f85897..5fcb3858 100755 --- a/tests/modules/Import/ImportFormsTest.php +++ b/tests/modules/Import/ImportFormsTest.php @@ -40,6 +40,7 @@ require_once 'include/Sugar_Smarty.php'; require_once 'modules/Import/controller.php'; require_once 'modules/Import/views/view.step3.php'; require_once 'modules/Import/views/view.step4.php'; +require_once 'modules/Import/Importer.php'; class ImportFormsTest extends Sugar_PHPUnit_Framework_OutputTestCase { @@ -117,7 +118,7 @@ class ImportFormsTest extends Sugar_PHPUnit_Framework_OutputTestCase { $old_error_reporting = error_reporting(E_ALL); - ImportViewStep4::handleImportErrors($errno, $errstr, $errfile, $errline); + Importer::handleImportErrors($errno, $errstr, $errfile, $errline); switch ($errno) { case E_USER_WARNING: diff --git a/tests/modules/Import/ImportMapTest.php b/tests/modules/Import/ImportMapTest.php index a4b8dffe..4f630d3c 100755 --- a/tests/modules/Import/ImportMapTest.php +++ b/tests/modules/Import/ImportMapTest.php @@ -35,7 +35,7 @@ ********************************************************************************/ -require_once 'modules/Import/ImportMap.php'; +require_once 'modules/Import/maps/ImportMap.php'; class ImportMapTest extends Sugar_PHPUnit_Framework_TestCase { diff --git a/tests/modules/Import/ImporterTest.php b/tests/modules/Import/ImporterTest.php new file mode 100755 index 00000000..a63b1d80 --- /dev/null +++ b/tests/modules/Import/ImporterTest.php @@ -0,0 +1,122 @@ + "\"3/26/2011 10:02am\",\"Doe\"", + 1 => "\"2011-3-26 10:2 am\",\"Doe\"", + 2 => "\"3.26.2011 10.02\",\"Doe\"", + ); + + public function setUp() + { + $beanList = array(); + $beanFiles = array(); + require('include/modules.php'); + $GLOBALS['beanList'] = $beanList; + $GLOBALS['beanFiles'] = $beanFiles; + + $GLOBALS['current_user'] = SugarTestUserUtilities::createAnonymousUser(); + $this->_importModule = 'Contacts'; + $this->_importObject = 'Contact'; + } + + public function tearDown() + { + $GLOBALS['db']->query("DELETE FROM contacts where created_by='{$GLOBALS['current_user']->id}'"); + + SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); + } + + public function providerCsvData() + { + return array( + array(0, '2011-03-26 10:02:00', 'm/d/Y', 'h:ia'), + array(1, '2011-03-26 10:02:00', 'Y-m-d', 'h:ia'), + array(2, '2011-03-26 10:02:00', 'm.d.Y', 'H.i'), + ); + } + + /** + * @dataProvider providerCsvData + */ + public function testDateTimeImport($content_idx, $expected_datetime, $date_format, $time_format) + { + $file = $GLOBALS['sugar_config']['upload_dir'].'test.csv'; + $ret = file_put_contents($file, self::$CsvContent[$content_idx]); + $this->assertGreaterThan(0, $ret, 'Failed to write to '.$file .' for content '.$content_idx); + + $importSource = new ImportFile($file, ',', '"'); + + $bean = loadBean($this->_importModule); + + $_REQUEST['columncount'] = 2; + $_REQUEST['colnum_0'] = 'date_entered'; + $_REQUEST['colnum_1'] = 'last_name'; + $_REQUEST['import_module'] = 'Contacts'; + $_REQUEST['importlocale_charset'] = 'UTF-8'; + $_REQUEST['importlocale_dateformat'] = $date_format; + $_REQUEST['importlocale_timeformat'] = $time_format; + $_REQUEST['importlocale_timezone'] = 'GMT'; + $_REQUEST['importlocale_default_currency_significant_digits'] = '2'; + $_REQUEST['importlocale_currency'] = '-99'; + $_REQUEST['importlocale_dec_sep'] = '.'; + $_REQUEST['importlocale_currency'] = '-99'; + $_REQUEST['importlocale_default_locale_name_format'] = 's f l'; + $_REQUEST['importlocale_num_grp_sep'] = ','; + + $importer = new Importer($importSource, $bean); + $importer->import(); + + $query = "SELECT date_entered from contacts where created_by='{$GLOBALS['current_user']->id}'"; + $result = $GLOBALS['db']->query($query); + $row = $GLOBALS['db']->fetchByAssoc($result); + + $this->assertEquals($expected_datetime, $row['date_entered'], 'Got incorrect date_entered.'); + + } +} + diff --git a/tests/modules/Leads/Bug40209Test.php b/tests/modules/Leads/Bug40209Test.php index 66452dbe..6e2b9ce9 100755 --- a/tests/modules/Leads/Bug40209Test.php +++ b/tests/modules/Leads/Bug40209Test.php @@ -34,8 +34,8 @@ * "Powered by SugarCRM". ********************************************************************************/ - -class Bug40209Test extends Sugar_PHPUnit_Framework_TestCase + +class Bug40209Test extends Sugar_PHPUnit_Framework_OutputTestCase { var $user; var $account; @@ -44,6 +44,8 @@ class Bug40209Test extends Sugar_PHPUnit_Framework_TestCase public function setUp() { + global $_POST; + $_POST = array(); //create user $this->user = $GLOBALS['current_user'] = SugarTestUserUtilities::createAnonymousUser(); @@ -57,7 +59,7 @@ class Bug40209Test extends Sugar_PHPUnit_Framework_TestCase $this->lead = SugarTestLeadUtilities::createLead(); } - + public function tearDown() { //delete records created from db @@ -72,17 +74,14 @@ class Bug40209Test extends Sugar_PHPUnit_Framework_TestCase 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(); - $_POST = array(); - + //set the request parameters and convert the lead $_REQUEST['module'] = 'Leads'; $_REQUEST['action'] = 'ConvertLead'; @@ -102,14 +101,10 @@ class Bug40209Test extends Sugar_PHPUnit_Framework_TestCase $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; - } + $this->assertNotEmpty($contact_id, "contact id was not created during conversion process. An error has ocurred, aborting rest of test."); //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(); + $this->assertEquals($this->lead->account_id, $this->contact->account_id, "Account id from converted lead does not match the new contact account id, there was an error during conversion."); } } \ No newline at end of file diff --git a/tests/modules/Leads/ConvertLeadTests.php b/tests/modules/Leads/ConvertLeadTests.php index 2d5a94bc..5a818c59 100755 --- a/tests/modules/Leads/ConvertLeadTests.php +++ b/tests/modules/Leads/ConvertLeadTests.php @@ -34,7 +34,10 @@ * "Powered by SugarCRM". ********************************************************************************/ - + +require_once 'modules/Leads/views/view.convertlead.php'; + + class ConvertLeadTests extends Sugar_PHPUnit_Framework_TestCase { public function setUp() @@ -95,4 +98,194 @@ class ConvertLeadTests extends Sugar_PHPUnit_Framework_TestCase unset($_REQUEST['record']); SugarTestLeadUtilities::removeAllCreatedLeads(); } -} \ No newline at end of file + /** + * @group bug44033 + */ + public function testActivityMove() { + // init + $lead = SugarTestLeadUtilities::createLead(); + $contact = SugarTestContactUtilities::createContact(); + $meeting = SugarTestMeetingUtilities::createMeeting(); + SugarTestMeetingUtilities::addMeetingParent($meeting->id, $lead->id); + $relation_id = SugarTestMeetingUtilities::addMeetingLeadRelation($meeting->id, $lead->id); + $_REQUEST['record'] = $lead->id; + + // refresh the meeting to include parent_id and parent_type + $meeting_id = $meeting->id; + $meeting = new Meeting(); + $meeting->retrieve($meeting_id); + + // action: move meeting from lead to contact + $convertObj = new TestViewConvertLead(); + $convertObj->moveActivityWrapper($meeting, $contact); + + // verification 1, parent id should be contact id + $this->assertTrue($meeting->parent_id == $contact->id, 'Meeting parent id is not converted to contact id.'); + + // verification 2, parent type should be "Contacts" + $this->assertTrue($meeting->parent_type == 'Contacts', 'Meeting parent type is not converted to Contacts.'); + + // verification 3, record should be deleted from meetings_leads table + $sql = "select id from meetings_leads where meeting_id='{$meeting->id}' and lead_id='{$lead->id}' and deleted=0"; + $result = $GLOBALS['db']->query($sql); + $row = $GLOBALS['db']->fetchByAssoc($result); + $this->assertNull($row, "Meeting-Lead relationship is not removed."); + + // verification 4, record should be added to meetings_contacts table + $sql = "select id from meetings_contacts where meeting_id='{$meeting->id}' and contact_id='{$contact->id}' and deleted=0"; + $result = $GLOBALS['db']->query($sql); + $row = $GLOBALS['db']->fetchByAssoc($result); + $this->assertFalse(empty($row), "Meeting-Contact relationship is not added."); + + // clean up + unset($_REQUEST['record']); + $GLOBALS['db']->query("delete from meetings_contacts where meeting_id='{$meeting->id}' and contact_id= '{$contact->id}'"); + SugarTestMeetingUtilities::deleteMeetingLeadRelation($relation_id); + SugarTestMeetingUtilities::removeMeetingContacts(); + SugarTestMeetingUtilities::removeAllCreatedMeetings(); + SugarTestContactUtilities::removeAllCreatedContacts(); + SugarTestLeadUtilities::removeAllCreatedLeads(); + } + + public function testActivityCopy() { + // init + $lead = SugarTestLeadUtilities::createLead(); + $contact = SugarTestContactUtilities::createContact(); + $meeting = SugarTestMeetingUtilities::createMeeting(); + SugarTestMeetingUtilities::addMeetingParent($meeting->id, $lead->id); + $relation_id = SugarTestMeetingUtilities::addMeetingLeadRelation($meeting->id, $lead->id); + $_REQUEST['record'] = $lead->id; + + // refresh the meeting to include parent_id and parent_type + $meeting_id = $meeting->id; + $meeting = new Meeting(); + $meeting->retrieve($meeting_id); + + // action: copy meeting from lead to contact + $convertObj = new TestViewConvertLead(); + $convertObj->copyActivityWrapper($meeting, $contact); + + // 1. the original meeting should still have the same parent_type and parent_id + $meeting->retrieve($meeting_id); + $this->assertEquals('Leads', $meeting->parent_type, 'parent_type of the original meeting was changed from Leads to '.$meeting->parent_type); + $this->assertEquals($lead->id, $meeting->parent_id, 'parent_id of the original meeting was changed from '.$lead->id.' to '.$meeting->parent_id); + + // 2. a newly created meeting with parent type=Contatcs and parent_id=$contact->id + $sql = "select id from meetings where parent_id='{$contact->id}' and parent_type= 'Contacts' and deleted=0"; + $result = $GLOBALS['db']->query($sql); + $row = $GLOBALS['db']->fetchByAssoc($result); + $this->assertNotNull($row, 'Could not find the newly created meeting with parent_type=Contacts and parent_id='.$contact->id); + $new_meeting_id = ''; + if ($row) { + $new_meeting_id = $row['id']; + } + + // 3. record should not be deleted from meetings_leads table + $sql = "select id from meetings_leads where meeting_id='{$meeting->id}' and lead_id='{$lead->id}' and deleted=0"; + $result = $GLOBALS['db']->query($sql); + $row = $GLOBALS['db']->fetchByAssoc($result); + $this->assertNotNull($row, "Meeting-Lead relationship was removed."); + + // 4. new meeting record should be added to meetings_contacts table + $sql = "select id from meetings_contacts where meeting_id='{$new_meeting_id}' and contact_id='{$contact->id}' and deleted=0"; + $result = $GLOBALS['db']->query($sql); + $row = $GLOBALS['db']->fetchByAssoc($result); + $this->assertFalse(empty($row), "Meeting-Contact relationship has not been added."); + + // clean up + unset($_REQUEST['record']); + $GLOBALS['db']->query("delete from meetings where parent_id='{$contact->id}' and parent_type= 'Contacts'"); + $GLOBALS['db']->query("delete from meetings where parent_id='{$lead->id}' and parent_type= 'Leads'"); + $GLOBALS['db']->query("delete from meetings_contacts where meeting_id='{$new_meeting_id}' and contact_id= '{$contact->id}'"); + SugarTestMeetingUtilities::deleteMeetingLeadRelation($relation_id); + SugarTestMeetingUtilities::removeMeetingContacts(); + SugarTestMeetingUtilities::removeAllCreatedMeetings(); + SugarTestContactUtilities::removeAllCreatedContacts(); + SugarTestLeadUtilities::removeAllCreatedLeads(); + } + + public function testConversionAndMoveActivities() { + global $sugar_config; + + // init + $lead = SugarTestLeadUtilities::createLead(); + $account = SugarTestAccountUtilities::createAccount(); + $meeting = SugarTestMeetingUtilities::createMeeting(); + SugarTestMeetingUtilities::addMeetingParent($meeting->id, $lead->id); + $relation_id = SugarTestMeetingUtilities::addMeetingLeadRelation($meeting->id, $lead->id); + $_REQUEST['record'] = $lead->id; + + // set the request/post parameters before converting the lead + $_REQUEST['module'] = 'Leads'; + $_REQUEST['action'] = 'ConvertLead'; + $_REQUEST['record'] = $lead->id; + $_REQUEST['handle'] = 'save'; + $_REQUEST['selectedAccount'] = $account->id; + $sugar_config['lead_conv_activity_opt'] = 'move'; + $_POST['lead_conv_ac_op_sel'] = 'Contacts'; + + // call display to trigger conversion + $vc = new ViewConvertLead(); + $vc->display(); + + // refresh meeting + $meeting_id = $meeting->id; + $meeting = new Meeting(); + $meeting->retrieve($meeting_id); + + // refresh lead + $lead_id = $lead->id; + $lead = new Lead(); + $lead->retrieve($lead_id); + + // retrieve the new contact id from the conversion + $contact_id = $lead->contact_id; + + // 1. Lead's contact_id should not be null + $this->assertNotNull($contact_id, 'Lead has null contact id after conversion.'); + + // 2. Lead status should be 'Converted' + $this->assertEquals('Converted', $lead->status, "Lead atatus should be 'Converted'."); + + // 3. new parent_type should be Contacts + $this->assertEquals('Contacts', $meeting->parent_type, 'Meeting parent type has not been set to Contacts'); + + // 4. new parent_id should be contact id + $this->assertEquals($contact_id, $meeting->parent_id, 'Meeting parent id has not been set to contact id.'); + + // 5. record should be deleted from meetings_leads table + $sql = "select id from meetings_leads where meeting_id='{$meeting->id}' and lead_id='{$lead->id}' and deleted=0"; + $result = $GLOBALS['db']->query($sql); + $row = $GLOBALS['db']->fetchByAssoc($result); + $this->assertNull($row, "Meeting-Lead relationship is not removed."); + + // 6. record should be added to meetings_contacts table + $sql = "select id from meetings_contacts where meeting_id='{$meeting->id}' and contact_id='{$contact_id}' and deleted=0"; + $result = $GLOBALS['db']->query($sql); + $row = $GLOBALS['db']->fetchByAssoc($result); + $this->assertFalse(empty($row), "Meeting-Contact relationship is not added."); + + // clean up + unset($_REQUEST['record']); + $GLOBALS['db']->query("delete from meetings where parent_id='{$lead->id}' and parent_type= 'Leads'"); + $GLOBALS['db']->query("delete from meetings where parent_id='{$contact_id}' and parent_type= 'Contacts'"); + $GLOBALS['db']->query("delete from contacts where id='{$contact_id}'"); + $GLOBALS['db']->query("delete from meetings_contacts where meeting_id='{$meeting->id}' and contact_id= '{$contact_id}'"); + SugarTestMeetingUtilities::deleteMeetingLeadRelation($relation_id); + SugarTestMeetingUtilities::removeMeetingContacts(); + SugarTestMeetingUtilities::removeAllCreatedMeetings(); + SugarTestAccountUtilities::removeAllCreatedAccounts(); + SugarTestLeadUtilities::removeAllCreatedLeads(); + } +} + +class TestViewConvertLead extends ViewConvertLead +{ + public function moveActivityWrapper($activity, $bean) { + parent::moveActivity($activity, $bean); + } + + public function copyActivityWrapper($activity, $bean) { + parent::copyActivityAndRelateToBean($activity, $bean); + } +} diff --git a/tests/modules/ModuleBuilder/Module/StudioModuleTest.php b/tests/modules/ModuleBuilder/Module/StudioModuleTest.php index 23ead02e..15cfc000 100755 --- a/tests/modules/ModuleBuilder/Module/StudioModuleTest.php +++ b/tests/modules/ModuleBuilder/Module/StudioModuleTest.php @@ -46,6 +46,7 @@ class StudioModuleTest extends Sugar_PHPUnit_Framework_TestCase require('include/modules.php'); $GLOBALS['beanList'] = $beanList; $GLOBALS['beanFiles'] = $beanFiles; + $GLOBALS['current_user'] = SugarTestUserUtilities::createAnonymousUser(); $GLOBALS['app_list_strings'] = return_app_list_strings_language($GLOBALS['current_language']); } @@ -54,6 +55,7 @@ class StudioModuleTest extends Sugar_PHPUnit_Framework_TestCase { unset($GLOBALS['beanFiles']); unset($GLOBALS['beanList']); + unset($GLOBALS['current_user']); unset($GLOBALS['app_list_strings']); } diff --git a/tests/modules/ModuleBuilder/parsers/Bug45645Test.php b/tests/modules/ModuleBuilder/parsers/Bug45645Test.php new file mode 100755 index 00000000..7256b5fd --- /dev/null +++ b/tests/modules/ModuleBuilder/parsers/Bug45645Test.php @@ -0,0 +1,64 @@ +$new_label), $test_module); + + // read the language file to get the new value + include("custom/modules/$test_module/language/en_us.lang.php"); + + $this->assertEquals($new_label, $mod_strings[$test_label], 'Label not changed.'); + } +} + + +?> diff --git a/tests/modules/Notes/Bug40263Test.php b/tests/modules/Notes/Bug40263Test.php index 8c89bd68..088686c5 100755 --- a/tests/modules/Notes/Bug40263Test.php +++ b/tests/modules/Notes/Bug40263Test.php @@ -46,23 +46,23 @@ class Bug40263Test extends Sugar_PHPUnit_Framework_TestCase var $user; var $note; - public function setUp() + public function setUp() { global $current_user; - + $this->user = SugarTestUserUtilities::createAnonymousUser();//new User(); $this->user->first_name = "test"; $this->user->last_name = "user"; $this->user->user_name = "test_test"; $this->user->save(); $current_user=$this->user; - + $this->note = new Note(); $this->note->name = "Bug40263 test Note"; $this->note->save(); } - public function tearDown() + public function tearDown() { SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); $this->note->mark_deleted($this->note->id); @@ -85,15 +85,15 @@ class Bug40263Test extends Sugar_PHPUnit_Framework_TestCase 'label' => 'LBL_CREATED_BY', 'width' => '10%', 'default' => true, - ), + ), ); $lvd = new ListViewDisplay(); $lvd->displayColumns = $displayColumns; $fields = $lvd->setupFilterFields(); $query = $this->note->create_new_list_query('', 'id="' . $this->note->id . '"', $fields); - $regex = "/select.* created_by_name.*LEFT JOIN\s*users jt\d ON\s*jt\d\.id\s*=\s*notes.created_by.*/si"; + $regex = '/select.* created_by_name.*LEFT JOIN\s*users jt\d ON\s*notes.created_by\s*=\s*jt\d\.id.*/si'; return $this->assertRegExp($regex, $query, "Unable to find the created user in the notes list view query: $query"); } - + } diff --git a/tests/modules/ProspectLists/Bug36422Test.php b/tests/modules/ProspectLists/Bug36422Test.php index 3e81909b..8b274c8e 100755 --- a/tests/modules/ProspectLists/Bug36422Test.php +++ b/tests/modules/ProspectLists/Bug36422Test.php @@ -104,7 +104,11 @@ class Bug36422Test extends Sugar_PHPUnit_Framework_TestCase */ public function setUp() { - global $current_user; + global $current_user, $beanList, $beanFiles; + $beanList = array(); + $beanFiles = array(); + require('include/modules.php'); + $current_user = SugarTestUserUtilities::createAnonymousUser();; $this->_contacts[] = self::createContact(); $this->_contacts[] = self::createContact(); diff --git a/tests/modules/SNIP/SampleEvent.ics b/tests/modules/SNIP/SampleEvent.ics new file mode 100755 index 00000000..deaf2d0a --- /dev/null +++ b/tests/modules/SNIP/SampleEvent.ics @@ -0,0 +1,29 @@ +BEGIN:VCALENDAR +CALSCALE:GREGORIAN +X-WR-TIMEZONE;VALUE=TEXT:US/Pacific +METHOD:PUBLISH +PRODID:-//Apple Computer\, Inc//iCal 1.0//EN +X-WR-CALNAME;VALUE=TEXT:Example +VERSION:2.0 +BEGIN:VEVENT +SEQUENCE:0 +CREATED;TZID=US/Pacific:20021028T140000 +LAST-MODIFIED;TZID=US/Pacific:20021028T140000 +DTSTART;TZID=US/Pacific:20021028T140000 +DTSTAMP:20021028T011706Z +SUMMARY:Coffee with Jason +DESCRIPTION:Event reminder +ORGANIZER:MAILTO:mailtotest@example.com +LOCATION;LANGUAGE=en:Germany +LOCATION;LANGUAGE=no:Tyskland +LOCATION;ALTREP="http://xyzcorp.com/conf-rooms/f123.vcf":Conference Room - F123, Bldg. 002 +LOCATION:Conference Room - F123, Bldg. 002 +ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:testemail@example.com +UID:EC9439B1-FF65-11D6-9973-003065F99D04 +DTEND;TZID=US/Pacific:20021028T150000 +BEGIN:VALARM +TRIGGER;VALUE=DURATION:-P1D +ACTION:DISPLAY +END:VALARM +END:VEVENT +END:VCALENDAR \ No newline at end of file diff --git a/tests/modules/Studio/RenameModulesTest.php b/tests/modules/Studio/RenameModulesTest.php new file mode 100755 index 00000000..a3c9d9f6 --- /dev/null +++ b/tests/modules/Studio/RenameModulesTest.php @@ -0,0 +1,168 @@ +language = 'en_us'; + } + + public function tearDown() + { + SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); + unset($GLOBALS['current_user']); + } + + + public function testGetRenamedModules() + { + $rm = new RenameModules(); + $this->assertEquals(0, count($rm->getRenamedModules()) ); + } + + + public function testRenameContactsModule() + { + $module = 'Accounts'; + $newSingular = 'Company'; + $newPlural = 'Companies'; + + $rm = new RenameModules(); + + $_REQUEST['slot_0'] = 0; + $_REQUEST['key_0'] = $module; + $_REQUEST['svalue_0'] = $newSingular; + $_REQUEST['value_0'] = $newPlural; + $_REQUEST['delete_0'] = ''; + $_REQUEST['dropdown_lang'] = $this->language; + $_REQUEST['dropdown_name'] = 'moduleList'; + + $rm->save(FALSE); + + //Test app list strings + $app_list_string = return_app_list_strings_language('en_us'); + $this->assertEquals($newSingular, $app_list_string['moduleListSingular'][$module] ); + $this->assertEquals($newPlural, $app_list_string['moduleList'][$module] ); + + //Test module strings for account + $accountStrings = return_module_language('en_us',$module, TRUE); + $this->assertEquals('Create Company', $accountStrings['LNK_NEW_ACCOUNT'], "Rename module failed for modules modStrings."); + $this->assertEquals('View Companies', $accountStrings['LNK_ACCOUNT_LIST'], "Rename module failed for modules modStrings."); + $this->assertEquals('Import Companies', $accountStrings['LNK_IMPORT_ACCOUNTS'], "Rename module failed for modules modStrings."); + $this->assertEquals('Company Search', $accountStrings['LBL_SEARCH_FORM_TITLE'], "Rename module failed for modules modStrings."); + + //Test related link renames + $contactStrings = return_module_language('en_us','Contacts', TRUE); + $this->assertEquals('Company Name:', $contactStrings['LBL_ACCOUNT_NAME'], "Rename related links failed for module."); + $this->assertEquals('Company ID:', $contactStrings['LBL_ACCOUNT_ID'], "Rename related links failed for module."); + + //Test subpanel renames + $campaignStrings = return_module_language('en_us','Campaigns', TRUE); + $this->assertEquals('Companies', $campaignStrings['LBL_CAMPAIGN_ACCOUNTS_SUBPANEL_TITLE'], "Renaming subpanels failed for module."); + // bug 45554: ensure labels are changed + $this->assertEquals('Companies', $campaignStrings['LBL_ACCOUNTS'], 'Renaming labels failed for module.'); + + //Ensure we recorded which modules were modified. + $renamedModules = $rm->getRenamedModules(); + $this->assertTrue( count($renamedModules) > 0 ); + + $this->removeCustomAppStrings(); + $this->removeModuleStrings( $renamedModules ); + } + + public function testRenameNonExistantModule() + { + $module = 'UnitTestDNEModule'; + $newSingular = 'UnitTest'; + $newPlural = 'UnitTests'; + + $rm = new RenameModules(); + + $_REQUEST['slot_0'] = 0; + $_REQUEST['key_0'] = $module; + $_REQUEST['svalue_0'] = $newSingular; + $_REQUEST['value_0'] = $newPlural; + $_REQUEST['delete_0'] = ''; + $_REQUEST['dropdown_lang'] = $this->language; + $_REQUEST['dropdown_name'] = 'moduleList'; + $_REQUEST['use_push'] = TRUE; + + $rm->save(FALSE); + + //Ensure no modules were modified + $renamedModules = $rm->getRenamedModules(); + $this->assertTrue( count($renamedModules) == 0 ); + + //Ensure none of the app list strings were modified. + $app_list_string = return_app_list_strings_language('en_us'); + $this->assertNotEquals($newSingular, $app_list_string['moduleListSingular'][$module] ); + $this->assertNotEquals($newPlural, $app_list_string['moduleList'][$module] ); + + } + + + private function removeCustomAppStrings() + { + $fileName = 'custom'. DIRECTORY_SEPARATOR . 'include'. DIRECTORY_SEPARATOR . 'language' . DIRECTORY_SEPARATOR . $this->language . '.lang.php'; + if( file_exists($fileName) ) + { + @unlink($fileName); + } + } + + private function removeModuleStrings($modules) + { + foreach($modules as $module => $v) + { + $fileName = 'custom'. DIRECTORY_SEPARATOR . 'modules'. DIRECTORY_SEPARATOR . $module . DIRECTORY_SEPARATOR . 'language' . DIRECTORY_SEPARATOR . $this->language . '.lang.php'; + if( file_exists($fileName) ) + { + @unlink($fileName); + } + + } + + } + +} diff --git a/tests/modules/UpgradeWizard/SugarMerge/UpgradeCustomTemplateMetaTest.php b/tests/modules/UpgradeWizard/SugarMerge/UpgradeCustomTemplateMetaTest.php index 7c0ee65d..85699815 100755 --- a/tests/modules/UpgradeWizard/SugarMerge/UpgradeCustomTemplateMetaTest.php +++ b/tests/modules/UpgradeWizard/SugarMerge/UpgradeCustomTemplateMetaTest.php @@ -37,44 +37,32 @@ require_once 'include/dir_inc.php'; class UpgradeCustomTemplateMetaTest extends Sugar_PHPUnit_Framework_TestCase { + +var $merge; - var $merge; +function setUp() { + $this->setOutputBuffering = false; + SugarTestMergeUtilities::setupFiles(array('Calls'), array('editviewdefs'), 'tests/modules/UpgradeWizard/SugarMerge/metadata_files'); +} - function setUp() - { - $this->setOutputBuffering = false; - SugarTestMergeUtilities::setupFiles(array('Calls', 'Meetings'), array('editviewdefs'), 'tests/modules/UpgradeWizard/SugarMerge/metadata_files'); - } +function tearDown() { + SugarTestMergeUtilities::teardownFiles(); +} - function tearDown() - { - SugarTestMergeUtilities::teardownFiles(); - } +function testMegreCallsEditviewdefsFor611() { + require_once 'modules/UpgradeWizard/SugarMerge/EditViewMerge.php'; + $this->merge = new EditViewMerge(); + $this->merge->merge('Calls', 'tests/modules/UpgradeWizard/SugarMerge/metadata_files/611/modules/Calls/metadata/editviewdefs.php','modules/Calls/metadata/editviewdefs.php','custom/modules/Calls/metadata/editviewdefs.php'); - function testMergeCallsEditviewdefsFor611() - { - require_once 'modules/UpgradeWizard/SugarMerge/EditViewMerge.php'; - $this->merge = new EditViewMerge(); - $this->merge->merge('Calls', 'tests/modules/UpgradeWizard/SugarMerge/metadata_files/611/modules/Calls/metadata/editviewdefs.php','modules/Calls/metadata/editviewdefs.php','custom/modules/Calls/metadata/editviewdefs.php'); + //Load file + require('custom/modules/Calls/metadata/editviewdefs.php'); - //Load file - require('custom/modules/Calls/metadata/editviewdefs.php'); + //If we comment out EdtiViewMerge mergeTemplateMeta, then we don't see the forms[0] anymore + //echo var_export($viewdefs['Calls'], true); + - $this->assertNotContains('forms[0]', $viewdefs['Calls']['EditView']['templateMeta']['form']['buttons'][0]['customCode'], "forms[0] did not get replaced"); - } - - function testMergeMeetingsEditviewdefsFor611() - { - require_once 'modules/UpgradeWizard/SugarMerge/EditViewMerge.php'; - $this->merge = new EditViewMerge(); - $this->merge->merge('Meetings', 'tests/modules/UpgradeWizard/SugarMerge/metadata_files/611/modules/Meetings/metadata/editviewdefs.php','modules/Meetings/metadata/editviewdefs.php','custom/modules/Meetings/metadata/editviewdefs.php'); - - //Load file - require('custom/modules/Meetings/metadata/editviewdefs.php'); - - $this->assertNotContains('this.form.', $viewdefs['Meetings']['EditView']['templateMeta']['form']['buttons'][0]['customCode'], "this.form did not get replaced"); - } +} } \ No newline at end of file diff --git a/tests/modules/UpgradeWizard/SugarMerge/metadata_files/600/modules/Documents/metadata/editviewdefs.php b/tests/modules/UpgradeWizard/SugarMerge/metadata_files/600/modules/Documents/metadata/editviewdefs.php index eb6f7ebd..b257352a 100755 --- a/tests/modules/UpgradeWizard/SugarMerge/metadata_files/600/modules/Documents/metadata/editviewdefs.php +++ b/tests/modules/UpgradeWizard/SugarMerge/metadata_files/600/modules/Documents/metadata/editviewdefs.php @@ -45,9 +45,7 @@ $viewdefs['Documents']['EditView'] = array( array('label' => '10', 'field' => '30') ), 'javascript' => ' - - - + ', ), diff --git a/tests/modules/UpgradeWizard/SugarMerge/metadata_files/610/modules/Calls/metadata/editviewdefs.php b/tests/modules/UpgradeWizard/SugarMerge/metadata_files/610/modules/Calls/metadata/editviewdefs.php index bb240bb4..977f24ae 100755 --- a/tests/modules/UpgradeWizard/SugarMerge/metadata_files/610/modules/Calls/metadata/editviewdefs.php +++ b/tests/modules/UpgradeWizard/SugarMerge/metadata_files/610/modules/Calls/metadata/editviewdefs.php @@ -83,11 +83,8 @@ array ( ), ), 'javascript' => ' - - - - + ', 'useTabs' => false, diff --git a/tests/modules/UpgradeWizard/SugarMerge/metadata_files/610/modules/Documents/metadata/editviewdefs.php b/tests/modules/UpgradeWizard/SugarMerge/metadata_files/610/modules/Documents/metadata/editviewdefs.php index 92448b1f..5cd1ac82 100755 --- a/tests/modules/UpgradeWizard/SugarMerge/metadata_files/610/modules/Documents/metadata/editviewdefs.php +++ b/tests/modules/UpgradeWizard/SugarMerge/metadata_files/610/modules/Documents/metadata/editviewdefs.php @@ -46,10 +46,7 @@ $viewdefs['Documents']['EditView'] = array( array('label' => '10', 'field' => '30') ), 'javascript' => ' - - - - + ', ), 'panels' =>array ( diff --git a/tests/modules/UpgradeWizard/SugarMerge/metadata_files/610/modules/Documents/metadata/quickcreatedefs.php b/tests/modules/UpgradeWizard/SugarMerge/metadata_files/610/modules/Documents/metadata/quickcreatedefs.php index 2f421c5a..97578380 100755 --- a/tests/modules/UpgradeWizard/SugarMerge/metadata_files/610/modules/Documents/metadata/quickcreatedefs.php +++ b/tests/modules/UpgradeWizard/SugarMerge/metadata_files/610/modules/Documents/metadata/quickcreatedefs.php @@ -49,10 +49,7 @@ $viewdefs['Documents']['QuickCreate'] = array( 'includes' => array ( array('file' => 'include/javascript/popup_parent_helper.js'), - array('file' => 'include/jsolait/init.js'), - array('file' => 'include/jsolait/lib/urllib.js'), - array('file' => 'include/javascript/jsclass_base.js'), - array('file' => 'include/javascript/jsclass_async.js'), + array('file' => 'include/javascript/sugar_grp_jsolait.js'), array('file' => 'modules/Documents/documents.js'), ), ), diff --git a/tests/modules/UpgradeWizard/SugarMerge/metadata_files/611/modules/Calls/metadata/editviewdefs.php b/tests/modules/UpgradeWizard/SugarMerge/metadata_files/611/modules/Calls/metadata/editviewdefs.php index 5aecd4b8..f9ecd735 100755 --- a/tests/modules/UpgradeWizard/SugarMerge/metadata_files/611/modules/Calls/metadata/editviewdefs.php +++ b/tests/modules/UpgradeWizard/SugarMerge/metadata_files/611/modules/Calls/metadata/editviewdefs.php @@ -83,13 +83,10 @@ array ( 'field' => '30', ), ), - 'javascript' => ' - - + 'javascript' => ' - - - + + ', 'useTabs' => false, diff --git a/tests/service/Bug31003Test.php b/tests/service/Bug31003Test.php index fc993279..228e4c98 100755 --- a/tests/service/Bug31003Test.php +++ b/tests/service/Bug31003Test.php @@ -65,8 +65,8 @@ class Bug31003Test extends SOAPTestCase public function tearDown() { parent::tearDown(); - $GLOBALS['db']->query(sprintf("DELETE FROM prospects WHERE id = '%d'", $this->contact->id)); + $GLOBALS['db']->query("DELETE FROM prospects WHERE id = '{$this->contact->id}'"); SugarTestContactUtilities::removeAllCreatedContacts(); } -} \ No newline at end of file +} diff --git a/tests/service/Bug41296Test.php b/tests/service/Bug41296Test.php new file mode 100755 index 00000000..49767b9c --- /dev/null +++ b/tests/service/Bug41296Test.php @@ -0,0 +1,95 @@ +_soapURL = $GLOBALS['sugar_config']['site_url'].'/soap.php'; + $GLOBALS['current_user'] = SugarTestUserUtilities::createAnonymousUser(); + + $unid = uniqid(); + $time = date('Y-m-d H:i:s'); + + $contact = new Contact(); + $contact->id = 'c_'.$unid; + $contact->first_name = 'testfirst'; + $contact->last_name = 'testlast'; + $contact->email1 = 'one@example.com'; + $contact->email2 = 'one_other@example.com'; + $contact->new_with_id = true; + $contact->disable_custom_fields = true; + $contact->save(); + $this->c = $contact; + + parent::setUp(); + } + + public function tearDown() + { + $GLOBALS['db']->query("DELETE FROM contacts WHERE id= '{$this->c->id}'"); + $GLOBALS['db']->query("DELETE FROM contacts WHERE id= '{$this->_resultId}'"); + unset($this->c); + parent::tearDown(); + } + + public function testCreateNewContactWithNoEmail() + { + $this->_login(); + + $contacts_list=array( 'session'=>$this->_sessionId, 'module_name' => 'Contacts', + 'name_value_lists' => array( + array(array('name'=>'assigned_user_id' , 'value'=>$this->_user->id),array('name'=>'first_name' , 'value'=>'testfirst'),array('name'=>'last_name' , 'value'=>'testlast')) + )); + + $result = $this->_soapClient->call('set_entries',$contacts_list); + $this->_resultId = $result['ids'][0]; + $this->assertNotEquals($this->c->id, $result['ids'][0], "Contacts should not match"); + } + +} \ No newline at end of file diff --git a/tests/service/OAuthTest.php b/tests/service/OAuthTest.php new file mode 100755 index 00000000..a19ec7b8 --- /dev/null +++ b/tests/service/OAuthTest.php @@ -0,0 +1,209 @@ +query("DELETE FROM oauth_consumer where c_key='TESTCUSTOMER'"); + $GLOBALS['db']->query("DELETE FROM oauth_nonce where conskey='TESTCUSTOMER'"); + self::$_consumer = new OAuthKey(); + self::$_consumer->c_key = "TESTCUSTOMER"; + self::$_consumer->c_secret = "TESTSECRET"; + self::$_consumer->save(); + } + + public static function tearDownAfterClass() + { + unset($GLOBALS['beanList']); + unset($GLOBALS['beanFiles']); + unset($GLOBALS['app_list_strings']); + unset($GLOBALS['app_strings']); + unset($GLOBALS['mod_strings']); + unset($GLOBALS['current_user']); + $GLOBALS['db']->query("DELETE FROM oauth_consumer where c_key='TESTCUSTOMER'"); + $GLOBALS['db']->query("DELETE FROM oauth_nonce where conskey='TESTCUSTOMER'"); + $GLOBALS['db']->query("DELETE FROM oauth_tokens where consumer='".self::$_consumer->id."'"); + SugarTestUserUtilities::removeAllCreatedAnonymousUsers(); + } + + public function setUp() + { + if(!SugarOAuthServer::enabled() || !extension_loaded('oauth')) { + $this->markTestSkipped("No OAuth support"); + } + $this->oauth = new OAuth('TESTCUSTOMER','TESTSECRET',OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI); + $this->url = $GLOBALS['sugar_config']['site_url'].'service/v4/rest.php'; + $GLOBALS['current_user'] = self::$_user; + } + + protected function _returnLastRawResponse() + { + return "Error in web services call. Response was: {$this->_lastRawResponse}"; + } + + public function testOauthRequestToken() + { + $request_token_info = $this->oauth->getRequestToken($this->url."?method=oauth_request_token"); + $this->assertEquals($GLOBALS['sugar_config']['site_url'].'index.php?module=OAuthTokens&action=authorize', $request_token_info["authorize_url"]); + $this->assertEquals("true", $request_token_info["oauth_callback_confirmed"]); + $this->assertNotEmpty($request_token_info['oauth_token']); + $this->assertNotEmpty($request_token_info['oauth_token_secret']); + $rtoken = OAuthToken::load($request_token_info['oauth_token']); + $this->assertInstanceOf('OAuthToken', $rtoken); + $this->assertEquals(OAuthToken::REQUEST, $rtoken->tstate); + } + + public function testOauthAccessToken() + { + global $current_user; + $request_token_info = $this->oauth->getRequestToken($this->url."?method=oauth_request_token"); + $this->assertNotEmpty($request_token_info['oauth_token']); + $this->assertNotEmpty($request_token_info['oauth_token_secret']); + $token = $request_token_info['oauth_token']; + $secret = $request_token_info['oauth_token_secret']; + + $c_token = OAuthToken::load($token); + $this->assertInstanceOf('OAuthToken', $c_token); + // check token is in the right state + $this->assertEquals(OAuthToken::REQUEST, $c_token->tstate, "Request token has wrong state"); + $verify = $c_token->authorize(array("user" => $current_user->id)); + + $this->oauth->setToken($token, $secret); + $access_token_info = $this->oauth->getAccessToken($this->url."?method=oauth_access_token&oauth_verifier=$verify"); + $this->assertNotEmpty($access_token_info['oauth_token']); + $this->assertNotEmpty($access_token_info['oauth_token_secret']); + + $atoken = OAuthToken::load($access_token_info['oauth_token']); + $this->assertInstanceOf('OAuthToken', $atoken); + $this->assertEquals($current_user->id, $atoken->assigned_user_id); + // check this is an access token + $this->assertEquals(OAuthToken::ACCESS, $atoken->tstate, "Access token has wrong state"); + // check old token was invalidated + $rtoken = OAuthToken::load($token); + $this->assertInstanceOf('OAuthToken', $rtoken); + $this->assertEquals(OAuthToken::INVALID, $rtoken->tstate, "Request token was not invalidated"); + } + + protected function _makeRESTCall($method,$parameters) + { + // specify the REST web service to interact with + $url = $GLOBALS['sugar_config']['site_url'].'/service/v4/rest.php'; + // Open a curl session for making the call + $curl = curl_init($url); + // set URL and other appropriate options + curl_setopt($curl, CURLOPT_URL, $url); + curl_setopt($curl, CURLOPT_POST, 1); + curl_setopt($curl, CURLOPT_HEADER, 0); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 0); + curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0 ); + // build the request URL + $json = json_encode($parameters); + $postArgs = "method=$method&input_type=JSON&response_type=JSON&rest_data=$json"; + curl_setopt($curl, CURLOPT_POSTFIELDS, $postArgs); + // Make the REST call, returning the result + $response = curl_exec($curl); + // Close the connection + curl_close($curl); + + $this->_lastRawResponse = $response; + + // Convert the result from JSON format to a PHP array + return json_decode($response,true); + } + + public function testOauthServiceAccess() + { + global $current_user; + $request_token_info = $this->oauth->getRequestToken($this->url."?method=oauth_request_token"); + $token = $request_token_info['oauth_token']; + $secret = $request_token_info['oauth_token_secret']; + + $c_token = OAuthToken::load($token); + $verify = $c_token->authorize(array("user" => $current_user->id)); + + $this->oauth->setToken($token, $secret); + $access_token_info = $this->oauth->getAccessToken($this->url."?method=oauth_access_token&oauth_verifier=$verify"); + $token = $access_token_info['oauth_token']; + $secret = $access_token_info['oauth_token_secret']; + $this->oauth->setToken($token, $secret); + + $res = $this->oauth->fetch($this->url."?method=oauth_access&input_type=JSON&response_type=JSON"); + $this->assertTrue($res); + $session = json_decode($this->oauth->getLastResponse(), true); + $this->assertNotEmpty($session["id"]); + + // test fetch through OAuth + $res = $this->oauth->fetch($this->url."?method=get_user_id&input_type=JSON&response_type=JSON"); + $this->assertTrue($res); + $id = json_decode($this->oauth->getLastResponse(), true); + $this->assertEquals($current_user->id, $id); + // test fetch through session initiated by OAuth + $id2 = $this->_makeRESTCall('get_user_id', array("session" => $session["id"])); + $this->assertEquals($current_user->id, $id2); + } +} \ No newline at end of file diff --git a/tests/service/RESTAPI3Test.php b/tests/service/RESTAPI3Test.php index 1c5f7467..f5822886 100755 --- a/tests/service/RESTAPI3Test.php +++ b/tests/service/RESTAPI3Test.php @@ -619,6 +619,20 @@ class RESTAPI3Test extends Sugar_PHPUnit_Framework_TestCase $contactId1 = $result['id']; + $result = $this->_makeRESTCall('set_entry', + array( + 'session' => $session, + 'module' => 'Contacts', + 'name_value_list' => array( + array('name' => 'last_name', 'value' => 'New Contact 3'), + array('name' => 'description', 'value' => 'This is a contact created from a REST web services call'), + ), + ) + ); + + $this->assertTrue(!empty($result['id']) && $result['id'] != -1,$this->_returnLastRawResponse()); + $contactId3 = $result['id']; + $result = $this->_makeRESTCall('set_entry', array( 'session' => $session, @@ -641,7 +655,7 @@ class RESTAPI3Test extends Sugar_PHPUnit_Framework_TestCase 'module' => 'Accounts', 'module_id' => $accountId, 'link_field_name' => 'contacts', - 'related_ids' => array($contactId1,$contactId2), + 'related_ids' => array($contactId1,$contactId3,$contactId2), ) ); @@ -665,10 +679,12 @@ class RESTAPI3Test extends Sugar_PHPUnit_Framework_TestCase $GLOBALS['db']->query("DELETE FROM accounts WHERE id= '{$accountId}'"); $GLOBALS['db']->query("DELETE FROM contacts WHERE id= '{$contactId1}'"); $GLOBALS['db']->query("DELETE FROM contacts WHERE id= '{$contactId2}'"); + $GLOBALS['db']->query("DELETE FROM contacts WHERE id= '{$contactId3}'"); $GLOBALS['db']->query("DELETE FROM accounts_contacts WHERE account_id= '{$accountId}'"); - + $this->assertEquals($result['entry_list'][0]['name_value_list']['last_name']['value'],'New Contact 1',$this->_returnLastRawResponse()); $this->assertEquals($result['entry_list'][1]['name_value_list']['last_name']['value'],'New Contact 2',$this->_returnLastRawResponse()); + $this->assertEquals($result['entry_list'][2]['name_value_list']['last_name']['value'],'New Contact 3',$this->_returnLastRawResponse()); } public static function _subpanelLayoutProvider() diff --git a/tests/service/RESTAPI4Test.php b/tests/service/RESTAPI4Test.php index 3f28728f..cf148ed4 100755 --- a/tests/service/RESTAPI4Test.php +++ b/tests/service/RESTAPI4Test.php @@ -290,4 +290,96 @@ class RESTAPI4Test extends Sugar_PHPUnit_Framework_TestCase ) ); } + + + public function testRelateAccountToTwoContacts() + { + $result = $this->_login(); + $this->assertTrue(!empty($result['id']) && $result['id'] != -1,$this->_returnLastRawResponse()); + $session = $result['id']; + + $result = $this->_makeRESTCall('set_entry', + array( + 'session' => $session, + 'module' => 'Accounts', + 'name_value_list' => array( + array('name' => 'name', 'value' => 'New Account'), + array('name' => 'description', 'value' => 'This is an account created from a REST web services call'), + ), + ) + ); + + $this->assertTrue(!empty($result['id']) && $result['id'] != -1,$this->_returnLastRawResponse()); + + $accountId = $result['id']; + + $result = $this->_makeRESTCall('set_entry', + array( + 'session' => $session, + 'module' => 'Contacts', + 'name_value_list' => array( + array('name' => 'last_name', 'value' => 'New Contact 1'), + array('name' => 'description', 'value' => 'This is a contact created from a REST web services call'), + ), + ) + ); + + $this->assertTrue(!empty($result['id']) && $result['id'] != -1,$this->_returnLastRawResponse()); + + $contactId1 = $result['id']; + + $result = $this->_makeRESTCall('set_entry', + array( + 'session' => $session, + 'module' => 'Contacts', + 'name_value_list' => array( + array('name' => 'last_name', 'value' => 'New Contact 2'), + array('name' => 'description', 'value' => 'This is a contact created from a REST web services call'), + ), + ) + ); + + $this->assertTrue(!empty($result['id']) && $result['id'] != -1,$this->_returnLastRawResponse()); + + $contactId2 = $result['id']; + + // now relate them together + $result = $this->_makeRESTCall('set_relationship', + array( + 'session' => $session, + 'module' => 'Accounts', + 'module_id' => $accountId, + 'link_field_name' => 'contacts', + 'related_ids' => array($contactId1,$contactId2), + ) + ); + + $this->assertEquals($result['created'],1,$this->_returnLastRawResponse()); + + // check the relationship + $result = $this->_makeRESTCall('get_relationships', + array( + 'session' => $session, + 'module' => 'Accounts', + 'module_id' => $accountId, + 'link_field_name' => 'contacts', + 'related_module_query' => '', + 'related_fields' => array('last_name','description'), + 'related_module_link_name_to_fields_array' => array(), + 'deleted' => false, + ) + ); + + $returnedValues = array(); + $returnedValues[] = $result['entry_list'][0]['name_value_list']['last_name']['value']; + $returnedValues[] = $result['entry_list'][1]['name_value_list']['last_name']['value']; + + $GLOBALS['db']->query("DELETE FROM accounts WHERE id= '{$accountId}'"); + $GLOBALS['db']->query("DELETE FROM contacts WHERE id= '{$contactId1}'"); + $GLOBALS['db']->query("DELETE FROM contacts WHERE id= '{$contactId2}'"); + $GLOBALS['db']->query("DELETE FROM accounts_contacts WHERE account_id= '{$accountId}'"); + + $this->assertContains('New Contact 1',$returnedValues,$this->_returnLastRawResponse()); + $this->assertContains('New Contact 2',$returnedValues,$this->_returnLastRawResponse()); + } } \ No newline at end of file diff --git a/tests/tests/SugarTestLangPackCreatorTest.php b/tests/tests/SugarTestLangPackCreatorTest.php index 0a549b53..57a5531f 100755 --- a/tests/tests/SugarTestLangPackCreatorTest.php +++ b/tests/tests/SugarTestLangPackCreatorTest.php @@ -37,6 +37,14 @@ class SugarTestLangPackCreatorTest extends Sugar_PHPUnit_Framework_TestCase { + public function setUp() + { + SugarCache::$isCacheReset = false; + + if( empty($GLOBALS['current_language']) ) + $GLOBALS['current_language'] = $GLOBALS['sugar_config']['default_language']; + } + public function testSetAnyLanguageStrings() { $langpack = new SugarTestLangPackCreator(); diff --git a/themes/default/css/style.css b/themes/default/css/style.css index e69de29b..071fd4d9 100644 --- a/themes/default/css/style.css +++ b/themes/default/css/style.css @@ -0,0 +1,3 @@ +.search_form .view .yui-ac-highlight { + text-shadow: none; +} \ No newline at end of file -- 2.45.0