# CiviCRM 5.46.0 Released February 3, 2022 - **[Synopsis](#synopsis)** - **[Features](#features)** - **[Bugs resolved](#bugs)** - **[Miscellany](#misc)** - **[Credits](#credits)** - **[Feedback](#feedback)** ## Synopsis | *Does this version...?* | | |:--------------------------------------------------------------- |:-------:| | Fix security vulnerabilities? | no | | **Change the database schema?** | **yes** | | **Alter the API?** | **yes** | | **Require attention to configuration options?** | **yes** | | **Fix problems installing or upgrading to a previous version?** | **yes** | | **Introduce features?** | **yes** | | **Fix bugs?** | **yes** | ## Features ### Core CiviCRM - **re-jig demo roles to add restricted user ([dev/core#2773](https://lab.civicrm.org/dev/core/-/issues/2773): [22377](https://github.com/civicrm/civicrm-core/pull/22377))** Adds an ACL to demo data. - **When adding custom data set change default selected option ([dev/core#2977](https://lab.civicrm.org/dev/core/-/issues/2977): [22244](https://github.com/civicrm/civicrm-core/pull/22244))** Changes the defaults when adding custom data sets to make them more user friendly. - **Expose email on hold as filter for reports ([dev/core#3012](https://lab.civicrm.org/dev/core/-/issues/3012): [22357](https://github.com/civicrm/civicrm-core/pull/22357))** Adds a email on hold filter to reports. - **Increment recommended PHP version ([dev/core#2996](https://lab.civicrm.org/dev/core/-/issues/2996): [22265](https://github.com/civicrm/civicrm-core/pull/22265))** Changes the minimum PHP version to 7.3 and the recommended PHP version to 7.4. - **APIv4 Explorer - Make selected language and format bookmarkable ([22233](https://github.com/civicrm/civicrm-core/pull/22233))** The APIv4 explorer already places params in the URL for easy bookmarking. This extends it to work for the selected language tab and the selected output format. - **SearchKit - Contextual "View" button ([dev/core#3016](https://lab.civicrm.org/dev/core/-/issues/3016): [22367](https://github.com/civicrm/civicrm-core/pull/22367))** Improves the SearchKit user interface - **SearchKit - Add links for CustomField and CustomGroup entities ([22302](https://github.com/civicrm/civicrm-core/pull/22302))** Improves SearchKit user interface by adding links to custom field and custom group entities. - **SearchKit - Allow functions in the WHERE clause ([22241](https://github.com/civicrm/civicrm-core/pull/22241))** Adds an advanced feature for SearchKit which allows SQL functions in the WHERE clause. - **SearchKit - Import/Export saved search configuration ([22229](https://github.com/civicrm/civicrm-core/pull/22229))** Provides a UI for importing and exporting SavedSearches in JSON format. This allows power-users to copy and paste their Searches between sites. For extension developers, includes a direct link to generate a .mgd.php file from the API Explorer. - **SearchKit - Facilitate popup forms ([22490](https://github.com/civicrm/civicrm-core/pull/22490))** This adds two bits of utility code to facilitate adding a popup form to an Afform containing a Search Display. - **SearchKit - Allow aggregate columns to be links ([22356](https://github.com/civicrm/civicrm-core/pull/22356))** Allows aggregate columns to be rendered as a link in SearchKit Displays - **CustomGroup - Add pseudoconstant for extends column ([22282](https://github.com/civicrm/civicrm-core/pull/22282))** Adds missing pseudoconstant to schema, which will allow a SearchKit-based display of custom groups. - **Afform - UI and contextual titles for search displays ([22319](https://github.com/civicrm/civicrm-core/pull/22319))** Makes it easy to create drilldown search displays, passing in a URL arg to specify a category/container. E.g. "Custom fields in group X", "Option values for Individual Prefix", "Email addresses for Bob Smith". - **Add system status warning to display scheduled job failures ([21762](https://github.com/civicrm/civicrm-core/pull/21762))** Adds a system status message to display scheduled job errors. - **Add system status check for missing dedupe rules ([22369](https://github.com/civicrm/civicrm-core/pull/22369))** Adds a system status check to alert system administrators when an unsupervised and/or supervised dedupe rule is missing. - **Extensions - Add dependency status check ([22640](https://github.com/civicrm/civicrm-core/pull/22640))** Adds a extensions dependency status check. - **Improve accessibility - associate label and fields ([22361](https://github.com/civicrm/civicrm-core/pull/22361))** Associates the labels on the event location form with the relevant inputs to improve accessibility for screen reader users. - **Add state name to export fields ([22318](https://github.com/civicrm/civicrm-core/pull/22318))** Adds the ability to export the state name when exporting contacts. - **Add authx_login() API for backend script authentication (alt) ([22292](https://github.com/civicrm/civicrm-core/pull/22292))** Adds a function to login as a user. It is cross-platform; accepts contact ID, user ID, or username; and it updates relevant services (eg Civi session; Drupal $user; MySQL @civicrm_user_id). ### CiviContribute - **Payments - Where do we store IDs from payment processor? (Work Towards [dev/financial#57](https://lab.civicrm.org/dev/financial/-/issues/57): [21916](https://github.com/civicrm/civicrm-core/pull/21916))** Hides the recur trxn_id if it matches the processor_id. - **Financial entity permissions (Work Towards [dev/core#2752](https://lab.civicrm.org/dev/core/-/issues/2752): [21178](https://github.com/civicrm/civicrm-core/pull/21178) and [21181](https://github.com/civicrm/civicrm-core/pull/21181))** Allows financial_trxns to be viewed and use ACL, not blanket permissions on FinancialAccount, FinancialType, EntityFinancialAccount. - **Demo sample data - Add in some mixed currency contributions ([22307](https://github.com/civicrm/civicrm-core/pull/22307))** Improves contribution sample data by adding some mixed currency contributions. - **Add recurring conributions to sample data ([22296](https://github.com/civicrm/civicrm-core/pull/22296))** Improves contributions sample data by adding recurring contributions. ## Bugs resolved ### Core CiviCRM - **"Open in new tab" on .crm-summary-link icons should open contact page, not summary content. ([dev/core#2926](https://lab.civicrm.org/dev/core/-/issues/2926): [22303](https://github.com/civicrm/civicrm-core/pull/22303))** - **Separate membership payment on contribution form with auto renewal not get processed (Work Towards [dev/core#567](https://lab.civicrm.org/dev/core/-/issues/567): [22275](https://github.com/civicrm/civicrm-core/pull/22275))** Adds a test shell to ensure membership payments with auto renewal get processed. - **Avoid warnings for is_dir() when open_basedir is in effect ([dev/core#2927](https://lab.civicrm.org/dev/core/-/issues/2927): [22107](https://github.com/civicrm/civicrm-core/pull/22107))** - **Removes the limit of 15 max values for multiple values can also be retrieved from URL in reports ([dev/core#2979](https://lab.civicrm.org/dev/core/-/issues/2979): [22214](https://github.com/civicrm/civicrm-core/pull/22214))** - **Fatal error when merging Housholds (getTemplateForGreeting) ([dev/core#3028](https://lab.civicrm.org/dev/core/-/issues/3028): [22650](https://github.com/civicrm/civicrm-core/pull/22650))** - **TypeError when trying to replace tokens for custom fields that don't exist ([dev/core#3029](https://lab.civicrm.org/dev/core/-/issues/3029): [22537](https://github.com/civicrm/civicrm-core/pull/22537))** - **Escape single quotes in token html output ([dev/core#3001](https://lab.civicrm.org/dev/core/-/issues/3001): [22387](https://github.com/civicrm/civicrm-core/pull/22387) and [22285](https://github.com/civicrm/civicrm-core/pull/22285))** - **APIv4 - Rename 'ReadOnly' trait to 'ReadOnlyEntity' to avoid PHP error ([22626](https://github.com/civicrm/civicrm-core/pull/22626))** - **APIv4 - Fix saving NULL as custom field value ([22328](https://github.com/civicrm/civicrm-core/pull/22328))** - **APIv4 GroupContact create indicates user is added but are not ([dev/core#2924](https://lab.civicrm.org/dev/core/-/issues/2924): [22322](https://github.com/civicrm/civicrm-core/pull/22322))** - **APIv4 - Make Groups a managed entity, fix 'null' bugs in BAO_Group ([22228](https://github.com/civicrm/civicrm-core/pull/22228))** - **APIv4 - Set 'activity_type_id' to required ([22359](https://github.com/civicrm/civicrm-core/pull/22359))** - **Use api for entityRole - addresses save issue on the form ([22589](https://github.com/civicrm/civicrm-core/pull/22589))** - **SearchKit - Fix editable dates on standalone form ([22366](https://github.com/civicrm/civicrm-core/pull/22366))** - **SearchKit - Fix running searches for anonymous users ([22597](https://github.com/civicrm/civicrm-core/pull/22597))** - **SearchKit - Fix token selector to use expression alias ([22539](https://github.com/civicrm/civicrm-core/pull/22539))** - **SearchKit - Fix UI for configuring display pager limit ([22321](https://github.com/civicrm/civicrm-core/pull/22321))** - **SearchKit - Fix column headers for custom fields in default display ([22331](https://github.com/civicrm/civicrm-core/pull/22331))** - **SearchKit/Form: exposing a Date custom field has invalid year range ([dev/report#84](https://lab.civicrm.org/dev/report/-/issues/84): [22234](https://github.com/civicrm/civicrm-core/pull/22234))** - **SearchKit: URLs to external sites no longer render ([dev/report#93](https://lab.civicrm.org/dev/report/-/issues/93): [22437](https://github.com/civicrm/civicrm-core/pull/22437))** - **SearchKit: Chicken-and-egg problem upgrading from 5.35.2 to 5.44.0 ([dev/report#90](https://lab.civicrm.org/dev/report/-/issues/90): [22375](https://github.com/civicrm/civicrm-core/pull/22375))** Don't crash SearchKit on upgrade from 5.35. - **DedupeRules - Translate contact type labels, respect enabled contact types ([22383](https://github.com/civicrm/civicrm-core/pull/22383))** Fixes up the Dedupe Rules page to properly handle contact types. - **Allow chart dropdown labels to be translatable. ([22349](https://github.com/civicrm/civicrm-core/pull/22349))** - **SqlParallel - Enable more tests. Fix compatiblity with `release_time` ([22326](https://github.com/civicrm/civicrm-core/pull/22326))** - **Use JS escaping for {ts} calls in a JS context ([22348](https://github.com/civicrm/civicrm-core/pull/22348))** - **Find Activities Search, default search option for Activity Status will exclude Activities by default which do not have a status of Scheduled or Completed. Confuses and frustrates End Users. ([21596](https://github.com/civicrm/civicrm-core/pull/21596))** - **Wrap another set of hardcoded strings in {ts} ([22315](https://github.com/civicrm/civicrm-core/pull/22315))** - **Display label before input elements on SMTP settings page ([22304](https://github.com/civicrm/civicrm-core/pull/22304))** - **ExtensionUpgrades - Skip trying to upgrade missing dependencies ([22623](https://github.com/civicrm/civicrm-core/pull/22623))** - **Fix input type for Smarty number formatting (more forgiving) ([22429](https://github.com/civicrm/civicrm-core/pull/22429))** - **Ensure getDuplicateContacts always returns an array ([22394](https://github.com/civicrm/civicrm-core/pull/22394))** - **Ensure dashboardLinks assigned to prevent e-notice ([22378](https://github.com/civicrm/civicrm-core/pull/22378))** - **enotice fix (with default modifiers) ([22372](https://github.com/civicrm/civicrm-core/pull/22372))** - **Fix "Import Multi-Value Custom Data" ([22365](https://github.com/civicrm/civicrm-core/pull/22365))** - **Do not escape showHideBlocks by default ([22371](https://github.com/civicrm/civicrm-core/pull/22371))** - **Fix notices on ACL page ([22370](https://github.com/civicrm/civicrm-core/pull/22370))** - **Fix PropertyBag setRecurInstallments to accept 0 ([21517](https://github.com/civicrm/civicrm-core/pull/21517))** - **Fix over-escaping when default escaping is on ([22363](https://github.com/civicrm/civicrm-core/pull/22363))** - **Fix escape-by-default ([22362](https://github.com/civicrm/civicrm-core/pull/22362))** - **Fix params passed to setStatus method ([22338](https://github.com/civicrm/civicrm-core/pull/22338))** - **Fix Profile helptext menu reference to reCaptcha (by r4zoli) ([22333](https://github.com/civicrm/civicrm-core/pull/22333))** - **Fix inaccuracies and mistakes in comments (especially phpdoc comments) ([22334](https://github.com/civicrm/civicrm-core/pull/22334))** - **Correctly mark updateStatusMessage method as static ([22335](https://github.com/civicrm/civicrm-core/pull/22335))** - **Fix typo. CRM_Core_Execption should be CRM_Core_Exception ([22336](https://github.com/civicrm/civicrm-core/pull/22336))** - **APIv3 - Fix overzealous pseudoconstant matching ([22298](https://github.com/civicrm/civicrm-core/pull/22298))** - **Allow text to be translated and fix URL paths in calls to docURL() function. ([22311](https://github.com/civicrm/civicrm-core/pull/22311))** - **Fix char-set for default escaping ([22306](https://github.com/civicrm/civicrm-core/pull/22306))** - **Crash when adding a relationship when CiviMember is disabled ([22451](https://github.com/civicrm/civicrm-core/pull/22451))** - **Resources: set language-specific cacheCode, fixes AngularJS translation with multilingual ([22236](https://github.com/civicrm/civicrm-core/pull/22236))** - **Do not default-escape weight field on order ([22256](https://github.com/civicrm/civicrm-core/pull/22256))** - **Move require_once for Smarty modifier due to order issues ([22252](https://github.com/civicrm/civicrm-core/pull/22252))** - **Contact/BAO/Query.php: fix searching for whitespace ([22240](https://github.com/civicrm/civicrm-core/pull/22240))** - **Use new money formatting util for Smarty formatting ([22309](https://github.com/civicrm/civicrm-core/pull/22309))** - **Smarty variables] Remove another isset - deferredFinancialType ([22183](https://github.com/civicrm/civicrm-core/pull/22183))** - **Smarty variables] Another isset bites the dust ([22186](https://github.com/civicrm/civicrm-core/pull/22186))** - **Smarty variables] Remove isset from batch form ([22187](https://github.com/civicrm/civicrm-core/pull/22187))** - **[Smarty variables] remove isset from merge screen ([22193](https://github.com/civicrm/civicrm-core/pull/22193))** - **[Smarty variables] Fix overzealous escaping with Smarty default escaping ([22194](https://github.com/civicrm/civicrm-core/pull/22194))** - **[Smarty variables] Remove issets relating to auto_renew ([22195](https://github.com/civicrm/civicrm-core/pull/22195))** - **[Smarty variables] Remove issets from payment processor form ([22192](https://github.com/civicrm/civicrm-core/pull/22192))** - **Smarty modifier - stop using isset to check taxTerm ([22323](https://github.com/civicrm/civicrm-core/pull/22323))** - **E-notice fix (Smarty) ([22308](https://github.com/civicrm/civicrm-core/pull/22308))** ## CiviCampaign - **Cleanup Smarty e-notices on campaign dashboard ([22283](https://github.com/civicrm/civicrm-core/pull/22283))** - **Fix campaign dashboard to work with default escaping ([22364](https://github.com/civicrm/civicrm-core/pull/22364))** ## CiviCase - **Case activity won't open without a source ([dev/core#2825](https://lab.civicrm.org/dev/core/-/issues/2825): [22243](https://github.com/civicrm/civicrm-core/pull/22243))** - **APIv4: Confusing error when calling CaseType API ([dev/core#2984](https://lab.civicrm.org/dev/core/-/issues/2984): [22231](https://github.com/civicrm/civicrm-core/pull/22231))** ## CiviContribution - **Repeat Contributions CiviReport warnings: Formatting non-numeric values is no longer supported ([dev/core#2982](https://lab.civicrm.org/dev/core/-/issues/2982): [22217](https://github.com/civicrm/civicrm-core/pull/22217))** - **Do not apply default escaping to multiselects on currency form ([22294](https://github.com/civicrm/civicrm-core/pull/22294))** - **Fix broken links in default modifier mode on manage contributions ([22290](https://github.com/civicrm/civicrm-core/pull/22290))** - **Enotice fixes on ContributionPage dash ([22289](https://github.com/civicrm/civicrm-core/pull/22289))** - **Fix E_WARNING access array offset on null when creating new contribution page ([22373](https://github.com/civicrm/civicrm-core/pull/22373))** - **Ensure we don't get previously set honoree values in receipts ([21483](https://github.com/civicrm/civicrm-core/pull/21483))** - **Follow up fix on recur data ([22301](https://github.com/civicrm/civicrm-core/pull/22301))** ## CiviEvent - **Event Registration: initialize array ([22312](https://github.com/civicrm/civicrm-core/pull/22312))** Minor code nitpick to avoid a PHP fatal on PHP 8.0 in certain unusual circumstances. - **Fix JS Error for Free event with multiple participant on registration ([22310](https://github.com/civicrm/civicrm-core/pull/22310))** ## Drupal Integration - **Deprecated function drupal_get_installed_schema_version() in 9.3, but with a twist ([dev/drupal#172](https://lab.civicrm.org/dev/drupal/-/issues/172): [22337](https://github.com/civicrm/civicrm-core/pull/22337) and [22350](https://github.com/civicrm/civicrm-core/pull/22350))** - **"Your browser session has expired and we are unable to complete your form submission" on all D9.2 anonymous sessions ([dev/drupal#169](https://lab.civicrm.org/dev/drupal/-/issues/169): [338](https://github.com/civicrm/civicrm-packages/pull/338))** Fixes an error when uploading images to CKEditor via KCFinder. - **Fix unreplaced template vars in civicrm.settings.php when using drush installer ([67](https://github.com/civicrm/civicrm-drupal-8/pull/67))** - **Drupal Full-Text Search block session time out error ([dev/core#3026](https://lab.civicrm.org/dev/core/-/issues/3026): [22479](https://github.com/civicrm/civicrm-core/pull/22479))** ## WordPress Integration - **Migrate installers to "setup" API (Work Towards [dev/core#1615](https://lab.civicrm.org/dev/core/-/issues/1615): [264](https://github.com/civicrm/civicrm-wordpress/pull/264))** Perform CLI installations using Civi\Setup. ## Miscellany - **Add workflow template for recurring cancelled ([21611](https://github.com/civicrm/civicrm-core/pull/21611))** - **Add workflow template classes for contributions ([22340](https://github.com/civicrm/civicrm-core/pull/22340))** - **Use field value function to get html signature ([22445](https://github.com/civicrm/civicrm-core/pull/22445))** - **SearchKit - Tweak export explorer link icon + format ([22300](https://github.com/civicrm/civicrm-core/pull/22300))** - **Expose contact ID in getContactInfo method in CRM/Mailing/Event/BAO/Queue.php ([dev/core#2962](https://lab.civicrm.org/dev/core/-/issues/2962): [22096](https://github.com/civicrm/civicrm-core/pull/22096))** - **APIv4 Explorer - Format array params using add methods instead of set ([22382](https://github.com/civicrm/civicrm-core/pull/22382))** - **Update Brick/Money to 0.5.3 ([22246](https://github.com/civicrm/civicrm-core/pull/22246))** - **Simplify autogenerated boilerplate upgrader class ([22225](https://github.com/civicrm/civicrm-core/pull/22225))** - **Upgrade - Bump minimum upgradable version to 4.6.12 ([22238](https://github.com/civicrm/civicrm-core/pull/22238))** - **Move two more functions to financialProcessor ([21927](https://github.com/civicrm/civicrm-core/pull/21927))** - **Formatting cleanup ([22374](https://github.com/civicrm/civicrm-core/pull/22374))** - **Rename protected function ([22259](https://github.com/civicrm/civicrm-core/pull/22259))** - **Contributor key: Add Matt Trim ([22248](https://github.com/civicrm/civicrm-core/pull/22248))** - **5.45.0 release notes: added late changes ([22386](https://github.com/civicrm/civicrm-core/pull/22386))** - **Remove handling for always-truthy var being false ([22260](https://github.com/civicrm/civicrm-core/pull/22260))** - **Remove unnecessary ID attribute. ([22347](https://github.com/civicrm/civicrm-core/pull/22347))** - **Remove never passed variables ([22258](https://github.com/civicrm/civicrm-core/pull/22258))** - **Remove unused function ([22388](https://github.com/civicrm/civicrm-core/pull/22388))** - **Initial refactor of createProfileContact groups ([18158](https://github.com/civicrm/civicrm-core/pull/18158))** - **Deprecated function drupal_get_path() ([69](https://github.com/civicrm/civicrm-drupal-8/pull/69))** - **Update jquery.tokeninput.js to 1.6.1 ([336](https://github.com/civicrm/civicrm-packages/pull/336))** - **Privatise function ([22392](https://github.com/civicrm/civicrm-core/pull/22392))** - **Remove unnecessary pass-by-ref ([22393](https://github.com/civicrm/civicrm-core/pull/22393))** - **Remove unused function CRM/Utils/Mail/EmailProcessor::cleanupDir ([22278](https://github.com/civicrm/civicrm-core/pull/22278))** - **Remove unused method getGrantStatusOptGroup ([22332](https://github.com/civicrm/civicrm-core/pull/22332))** - **Remove unnecessary pass-by-ref ([22279](https://github.com/civicrm/civicrm-core/pull/22279))** - **(REF) CRM/Upgrade - Remove unused entrypoint `verifyPreDBstate()` ([22237](https://github.com/civicrm/civicrm-core/pull/22237))** - **(REF) Remove more params that are unused now function is not shared ([22261](https://github.com/civicrm/civicrm-core/pull/22261))** - **(REF) Duplicate function to allow us to work it out of the code ([22254](https://github.com/civicrm/civicrm-core/pull/22254))** - **(REF) Minor parameter simplification ([22253](https://github.com/civicrm/civicrm-core/pull/22253))** - **(REF) Add in getVersion override for Drupal 8/9 to support cv testing and also cv vars:show picking up the right CMS version ([22220](https://github.com/civicrm/civicrm-core/pull/22220))** - **(REF) Add getter for priceSetID and use full form flow ([22267](https://github.com/civicrm/civicrm-core/pull/22267))** - **(REF) Afform - Use APIv4 for managed dashboard ([22213](https://github.com/civicrm/civicrm-core/pull/22213))** - **(REF) Remove handling for relationshipID ([22391](https://github.com/civicrm/civicrm-core/pull/22391))** - **(REF) Use `CRM_Contact_BAO_ContactType::basicTypes()` instead of hardcoded lists ([22389](https://github.com/civicrm/civicrm-core/pull/22389))** - **(REF) Move code into the function ([22288](https://github.com/civicrm/civicrm-core/pull/22288))** - **(REF) Remove now non-variable variables from previously shared code ([22284](https://github.com/civicrm/civicrm-core/pull/22284))** - **(REF) Duplicate & unshare processFormContribution ([22276](https://github.com/civicrm/civicrm-core/pull/22276))** - **(REF) Stop passing this as form, set in function ([22287](https://github.com/civicrm/civicrm-core/pull/22287))** - **(REF) Deprecated old getContributionStatuses ([22345](https://github.com/civicrm/civicrm-core/pull/22345))** - **(REF) Simplify getContributionStatuses ([22280](https://github.com/civicrm/civicrm-core/pull/22280))** - **(REF) Upgrade jQuery UI to 1.13.0 ([22583](https://github.com/civicrm/civicrm-core/pull/22583))** - **(REF) Further cleanup on employer create ([22390](https://github.com/civicrm/civicrm-core/pull/22390))** - **HookTest - Fix execution on PHP 8 ([266](https://github.com/civicrm/civicrm-wordpress/pull/266))** - **Fix membership test fail for Dec 31 ([22351](https://github.com/civicrm/civicrm-core/pull/22351))** - **Fix tests that fail after 2021 ([22352](https://github.com/civicrm/civicrm-core/pull/22352))** - **Fix test to use full form flow ([22266](https://github.com/civicrm/civicrm-core/pull/22266))** - **Cleanup test class ([22493](https://github.com/civicrm/civicrm-core/pull/22493))** - **(NFC) Cleanup test class ([22384](https://github.com/civicrm/civicrm-core/pull/22384))** - **(NFC) Try to work around failing tests ([22269](https://github.com/civicrm/civicrm-core/pull/22269))** - **(NFC) Cleanup in Authorize.net test class ([22272](https://github.com/civicrm/civicrm-core/pull/22272))** - **(NFC) isDir unit test fails on PHP 7 'min' matrix ([22418](https://github.com/civicrm/civicrm-core/pull/22418))** - **(NFC) APIv4: Add help info for multi-record custom field sets ([22257](https://github.com/civicrm/civicrm-core/pull/22257))** - **(NFC) Test cleanup ([22251](https://github.com/civicrm/civicrm-core/pull/22251))** - **(NFC) Minor cleanup in test class ([22249](https://github.com/civicrm/civicrm-core/pull/22249))** - **(NFC) Cleanup messy boilerplate ([22224](https://github.com/civicrm/civicrm-core/pull/22224))** - **(NFC) Delete boilerplate comments and empty functions from upgrade classes ([22226](https://github.com/civicrm/civicrm-core/pull/22226))** - **(NFC) CRM_Core_Exception incorrectly called without message ([22339](https://github.com/civicrm/civicrm-core/pull/22339))** - **(NFC) Docblock improvements to Import_Field classes ([22360](https://github.com/civicrm/civicrm-core/pull/22360))** ## Credits This release was developed by the following code authors: AGH Strategies - Alice Frumin, Andie Hunt; Agileware - Justin Freeman; BrightMinded Ltd - Bradley Taylor; Circle Interactive - Matt Trim; CiviCRM - Coleman Watts, Tim Otten; CiviDesk - Yashodha Chaku; Coop SymbioTIC - Mathieu Lutfy; Dave D; Jens Schuppe; JMA Consulting - Seamus Lee; Megaphone Technology Consulting - Jon Goldberg; Miguel Almeida; MJW Consulting - Matthew Wire; Progressive Technology Project - Jamie McClelland; Skvare - Sunil Pawar; Squiffle Consulting - Aidan Saunders; Wikimedia Foundation - Eileen McNaughton Most authors also reviewed code for this release; in addition, the following reviewers contributed their comments: Artful Robot - Rich Lott; Ben Mango; Betty Dolfing; Christian Wach; CiviCoop - Jaap Jansma, Klaas Eikelboom; Coop SymbioTIC - Samuel Vanhove; Freeform Solutions - Herb van den Dool; Fuzion - Jitendra Purohit, Peter Davis; Greenpeace Central and Eastern Europe - Patrick Figel; JMA Consulting - Joe Murray, Monish Deb; Lighthouse Consulting and Design - Brian Shaughnessy; Mikey O'Toole; Semper IT - Karin Gerritsen; Tadpole Collective - Kevin Cristiano; tapashdatta; Third Sector Design - William Mortada; Wikimedia Foundation - Elliott Eggleston