chromium/chrome/browser/about_flags.cc

// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifdef UNSAFE_BUFFERS_BUILD
// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
#pragma allow_unsafe_buffers
#endif

// Instructions for adding new entries to this file:
// https://chromium.googlesource.com/chromium/src/+/main/docs/how_to_add_your_feature_flag.md#step-2_adding-the-feature-flag-to-the-chrome_flags-ui

#include "chrome/browser/about_flags.h"

#include <iterator>
#include <map>
#include <memory>
#include <set>
#include <utility>

#include "base/base_switches.h"
#include "base/command_line.h"
#include "base/feature_list.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/i18n/base_i18n_switches.h"
#include "base/memory/singleton.h"
#include "base/metrics/histogram_functions.h"
#include "base/no_destructor.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/task_features.h"
#include "base/values.h"
#include "build/branding_buildflags.h"
#include "build/build_config.h"
#include "cc/base/features.h"
#include "cc/base/switches.h"
#include "chrome/browser/apps/app_discovery_service/app_discovery_service.h"
#include "chrome/browser/apps/link_capturing/link_capturing_features.h"
#include "chrome/browser/browser_features.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/companion/core/features.h"
#include "chrome/browser/file_system_access/file_system_access_features.h"
#include "chrome/browser/flag_descriptions.h"
#include "chrome/browser/ip_protection/ip_protection_switches.h"
#include "chrome/browser/login_detection/login_detection_util.h"
#include "chrome/browser/media/router/discovery/access_code/access_code_cast_constants.h"
#include "chrome/browser/media/router/discovery/access_code/access_code_cast_feature.h"
#include "chrome/browser/navigation_predictor/navigation_predictor_features.h"
#include "chrome/browser/navigation_predictor/search_engine_preconnector.h"
#include "chrome/browser/net/stub_resolver_config_reader.h"
#include "chrome/browser/net/system_network_context_manager.h"
#include "chrome/browser/notifications/scheduler/public/features.h"
#include "chrome/browser/page_info/page_info_features.h"
#include "chrome/browser/permissions/notifications_permission_revocation_config.h"
#include "chrome/browser/permissions/quiet_notification_permission_ui_config.h"
#include "chrome/browser/predictors/loading_predictor_config.h"
#include "chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h"
#include "chrome/browser/preloading/preloading_features.h"
#include "chrome/browser/resource_coordinator/tab_manager_features.h"
#include "chrome/browser/sharing_hub/sharing_hub_features.h"
#include "chrome/browser/site_isolation/about_flags.h"
#include "chrome/browser/tpcd/experiment/tpcd_experiment_features.h"
#include "chrome/browser/ui/browser_navigator_params.h"
#include "chrome/browser/ui/toasts/toast_features.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/unexpire_flags.h"
#include "chrome/browser/unexpire_flags_gen.h"
#include "chrome/browser/web_applications/features.h"
#include "chrome/browser/webauthn/webauthn_switches.h"
#include "chrome/common/buildflags.h"
#include "chrome/common/channel_info.h"
#include "chrome/common/chrome_content_client.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/companion/visual_query/features.h"
#include "chromeos/constants/chromeos_features.h"
#include "components/assist_ranker/predictor_config_definitions.h"
#include "components/autofill/content/common/content_autofill_features.h"
#include "components/autofill/core/browser/autofill_experiments.h"
#include "components/autofill/core/common/autofill_features.h"
#include "components/autofill/core/common/autofill_payments_features.h"
#include "components/autofill/core/common/autofill_switches.h"
#include "components/autofill/core/common/autofill_util.h"
#include "components/browser_sync/browser_sync_switches.h"
#include "components/commerce/core/commerce_feature_list.h"
#include "components/commerce/core/flag_descriptions.h"
#include "components/component_updater/component_updater_command_line_config_policy.h"
#include "components/component_updater/component_updater_switches.h"
#include "components/compose/buildflags.h"
#include "components/compose/core/browser/compose_features.h"
#include "components/content_settings/core/common/features.h"
#include "components/contextual_search/core/browser/contextual_search_field_trial.h"
#include "components/contextual_search/core/browser/public.h"
#include "components/data_sharing/public/features.h"
#include "components/dom_distiller/core/dom_distiller_features.h"
#include "components/dom_distiller/core/dom_distiller_switches.h"
#include "components/download/public/common/download_features.h"
#include "components/error_page/common/error_page_switches.h"
#include "components/feature_engagement/public/feature_constants.h"
#include "components/feature_engagement/public/feature_list.h"
#include "components/feed/feed_feature_list.h"
#include "components/fingerprinting_protection_filter/common/fingerprinting_protection_filter_features.h"
#include "components/flags_ui/feature_entry.h"
#include "components/flags_ui/feature_entry_macros.h"
#include "components/flags_ui/flags_state.h"
#include "components/flags_ui/flags_storage.h"
#include "components/flags_ui/flags_ui_metrics.h"
#include "components/flags_ui/flags_ui_switches.h"
#include "components/flags_ui/pref_service_flags_storage.h"
#include "components/heavy_ad_intervention/heavy_ad_features.h"
#include "components/history/core/browser/features.h"
#include "components/history_clusters/core/config.h"
#include "components/history_clusters/core/features.h"
#include "components/history_clusters/core/on_device_clustering_features.h"
#include "components/history_embeddings/history_embeddings_features.h"
#include "components/invalidation/impl/invalidation_switches.h"
#include "components/language/core/common/language_experiments.h"
#include "components/lens/buildflags.h"
#include "components/lens/lens_features.h"
#include "components/manta/features.h"
#include "components/mirroring/service/mirroring_features.h"
#include "components/nacl/common/buildflags.h"
#include "components/nacl/common/nacl_switches.h"
#include "components/network_session_configurator/common/network_features.h"
#include "components/network_session_configurator/common/network_switches.h"
#include "components/no_state_prefetch/browser/no_state_prefetch_field_trial.h"
#include "components/ntp_tiles/features.h"
#include "components/offline_pages/core/offline_page_feature.h"
#include "components/omnibox/browser/omnibox_feature_configs.h"
#include "components/omnibox/browser/omnibox_field_trial.h"
#include "components/omnibox/common/omnibox_features.h"
#include "components/open_from_clipboard/clipboard_recent_content_features.h"
#include "components/optimization_guide/core/model_execution/model_execution_features.h"
#include "components/optimization_guide/core/optimization_guide_features.h"
#include "components/optimization_guide/core/optimization_guide_switches.h"
#include "components/page_content_annotations/core/page_content_annotations_features.h"
#include "components/page_content_annotations/core/page_content_annotations_switches.h"
#include "components/page_image_service/features.h"
#include "components/page_info/core/features.h"
#include "components/paint_preview/buildflags/buildflags.h"
#include "components/paint_preview/features/features.h"
#include "components/password_manager/core/browser/features/password_features.h"
#include "components/password_manager/core/common/password_manager_features.h"
#include "components/payments/core/features.h"
#include "components/performance_manager/public/features.h"
#include "components/permissions/features.h"
#include "components/power_bookmarks/core/power_bookmark_features.h"
#include "components/privacy_sandbox/privacy_sandbox_features.h"
#include "components/reading_list/features/reading_list_switches.h"
#include "components/safe_browsing/core/common/features.h"
#include "components/saved_tab_groups/features.h"
#include "components/search/ntp_features.h"
#include "components/search_engines/search_engines_switches.h"
#include "components/security_interstitials/content/stateful_ssl_host_state_delegate.h"
#include "components/security_state/core/security_state.h"
#include "components/segmentation_platform/public/features.h"
#include "components/send_tab_to_self/features.h"
#include "components/sensitive_content/features.h"
#include "components/services/heap_profiling/public/cpp/switches.h"
#include "components/services/storage/public/cpp/buckets/bucket_info.h"
#include "components/shared_highlighting/core/common/shared_highlighting_features.h"
#include "components/sharing_message/features.h"
#include "components/signin/core/browser/dice_account_reconcilor_delegate.h"
#include "components/signin/public/base/signin_buildflags.h"
#include "components/signin/public/base/signin_switches.h"
#include "components/site_isolation/features.h"
#include "components/soda/soda_features.h"
#include "components/spellcheck/common/spellcheck_features.h"
#include "components/spellcheck/spellcheck_buildflags.h"
#include "components/supervised_user/core/common/features.h"
#include "components/supervised_user/core/common/supervised_user_constants.h"
#include "components/sync/base/command_line_switches.h"
#include "components/sync/base/features.h"
#include "components/tracing/common/tracing_switches.h"
#include "components/translate/core/browser/translate_prefs.h"
#include "components/translate/core/browser/translate_ranker_impl.h"
#include "components/translate/core/common/translate_util.h"
#include "components/trusted_vault/features.h"
#include "components/ui_devtools/switches.h"
#include "components/variations/variations_switches.h"
#include "components/version_info/channel.h"
#include "components/version_info/version_info.h"
#include "components/visited_url_ranking/public/features.h"
#include "components/viz/common/features.h"
#include "components/viz/common/switches.h"
#include "components/webapps/browser/features.h"
#include "components/webapps/common/switches.h"
#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
#include "device/base/features.h"
#include "device/bluetooth/bluez/bluez_features.h"
#include "device/bluetooth/chromeos_platform_features.h"
#include "device/bluetooth/floss/floss_features.h"
#include "device/fido/features.h"
#include "device/gamepad/public/cpp/gamepad_features.h"
#include "device/vr/buildflags/buildflags.h"
#include "extensions/buildflags/buildflags.h"
#include "flag_descriptions.h"
#include "gpu/config/gpu_finch_features.h"
#include "gpu/config/gpu_switches.h"
#include "media/audio/audio_features.h"
#include "media/base/media_switches.h"
#include "media/capture/capture_switches.h"
#include "media/media_buildflags.h"
#include "media/midi/midi_switches.h"
#include "media/webrtc/webrtc_features.h"
#include "mojo/core/embedder/features.h"
#include "net/base/features.h"
#include "net/net_buildflags.h"
#include "net/nqe/effective_connection_type.h"
#include "net/nqe/network_quality_estimator_params.h"
#include "net/websockets/websocket_basic_handshake_stream.h"
#include "pdf/buildflags.h"
#include "ppapi/buildflags/buildflags.h"
#include "printing/buildflags/buildflags.h"
#include "sandbox/policy/features.h"
#include "sandbox/policy/switches.h"
#include "services/device/public/cpp/device_features.h"
#include "services/media_session/public/cpp/features.h"
#include "services/network/public/cpp/features.h"
#include "services/network/public/cpp/network_switches.h"
#include "services/tracing/public/cpp/tracing_features.h"
#include "services/webnn/public/mojom/features.mojom-features.h"
#include "storage/browser/quota/quota_features.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/public/common/features_generated.h"
#include "third_party/blink/public/common/forcedark/forcedark_switches.h"
#include "third_party/blink/public/common/switches.h"
#include "ui/accessibility/accessibility_features.h"
#include "ui/accessibility/accessibility_switches.h"
#include "ui/base/ozone_buildflags.h"
#include "ui/base/ui_base_features.h"
#include "ui/base/ui_base_switches.h"
#include "ui/compositor/compositor_switches.h"
#include "ui/display/display_features.h"
#include "ui/display/display_switches.h"
#include "ui/events/blink/blink_features.h"
#include "ui/events/event_switches.h"
#include "ui/gfx/switches.h"
#include "ui/gl/buildflags.h"
#include "ui/gl/gl_features.h"
#include "ui/gl/gl_switches.h"
#include "ui/native_theme/native_theme_features.h"
#include "ui/ui_features.h"
#include "url/url_features.h"

#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
#include "base/allocator/buildflags.h"
#endif

#if BUILDFLAG(IS_CHROMEOS)
#include "base/process/process.h"
#include "chromeos/constants/chromeos_features.h"
#endif

#if BUILDFLAG(IS_ANDROID)
#include "chrome/browser/flags/android/chrome_feature_list.h"
#include "chrome/browser/notifications/chime/android/features.h"
#include "chrome/browser/push_messaging/push_messaging_features.h"
#include "components/browser_ui/photo_picker/android/features.h"
#include "components/browsing_data/core/features.h"
#include "components/external_intents/android/external_intents_features.h"
#include "components/facilitated_payments/core/features/features.h"
#include "components/messages/android/messages_feature.h"
#include "components/translate/content/android/translate_message.h"
#include "ui/android/ui_android_features.h"
#else  // BUILDFLAG(IS_ANDROID)
#include "chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service.h"
#include "chrome/browser/media/router/media_router_feature.h"
#include "chrome/browser/ui/tabs/features.h"
#include "chrome/browser/web_applications/preinstalled_app_install_features.h"
#include "components/user_notes/user_notes_features.h"
#endif  // BUILDFLAG(IS_ANDROID)

#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "ash/components/arc/arc_features.h"
#include "ash/components/arc/arc_util.h"
#include "ash/constants/ash_features.h"
#include "ash/constants/ash_switches.h"
#include "ash/public/cpp/app_list/app_list_features.h"
#include "ash/public/cpp/keyboard/keyboard_switches.h"
#include "chrome/browser/ash/app_list/search/search_features.h"
#include "chrome/browser/ash/crosapi/browser_manager.h"
#include "chrome/browser/ash/crosapi/browser_util.h"
#include "chrome/browser/ash/crostini/crostini_util.h"
#include "chrome/browser/ash/file_suggest/item_suggest_cache.h"
#include "chrome/browser/ash/ownership/owner_settings_service_ash.h"
#include "chrome/browser/ash/ownership/owner_settings_service_ash_factory.h"
#include "chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.h"
#include "chrome/browser/ash/settings/about_flags.h"
#include "chrome/browser/component_updater/cros_component_installer_chromeos.h"
#include "chrome/browser/nearby_sharing/common/nearby_share_features.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/webui_url_constants.h"
#include "chromeos/ash/components/assistant/buildflags.h"
#include "chromeos/ash/components/memory/swap_configuration.h"
#include "chromeos/ash/components/standalone_browser/channel_util.h"
#include "chromeos/ash/components/standalone_browser/lacros_availability.h"
#include "chromeos/ash/components/standalone_browser/lacros_selection.h"
#include "chromeos/ash/components/standalone_browser/standalone_browser_features.h"
#include "chromeos/ash/services/assistant/public/cpp/features.h"
#include "chromeos/constants/chromeos_switches.h"
#include "components/app_restore/features.h"
#include "components/cross_device/nearby/nearby_features.h"
#include "components/metrics/structured/structured_metrics_features.h"  // nogncheck
#include "media/capture/video/chromeos/video_capture_features_chromeos.h"
#include "remoting/host/chromeos/features.h"
#include "third_party/cros_system_api/switches/chrome_switches.h"
#include "ui/events/ozone/features.h"
#endif  // BUILDFLAG(IS_CHROMEOS_ASH)

#if BUILDFLAG(IS_CHROMEOS_LACROS)
#include "chrome/browser/lacros/lacros_url_handling.h"
#include "chrome/common/webui_url_constants.h"
#endif

#if BUILDFLAG(IS_MAC)
#include "chrome/browser/enterprise/platform_auth/platform_auth_features.h"
#include "chrome/browser/ui/browser_dialogs.h"
#endif  // BUILDFLAG(IS_MAC)

#if BUILDFLAG(ENABLE_EXTENSIONS)
#include "chrome/browser/extensions/cws_info_service.h"
#include "extensions/common/extension_features.h"
#include "extensions/common/switches.h"
#endif  // BUILDFLAG(ENABLE_EXTENSIONS)

#if BUILDFLAG(ENABLE_PDF)
#include "pdf/pdf_features.h"
#endif

#if BUILDFLAG(ENABLE_PRINTING)
#include "printing/printing_features.h"
#endif

#if BUILDFLAG(ENABLE_VR)
#include "device/vr/public/cpp/features.h"
#endif

#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
#include "ui/ozone/public/ozone_switches.h"
#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)

#if BUILDFLAG(IS_WIN)
#include "chrome/browser/enterprise/platform_auth/platform_auth_features.h"
#include "chrome/browser/win/mica_titlebar.h"
#endif

#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
#include "chrome/browser/enterprise/profile_management/profile_management_features.h"
#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)

#if !BUILDFLAG(IS_ANDROID)
// This causes a gn error on Android builds, because gn does not understand
// buildflags.
#include "components/user_education/common/user_education_features.h"  // nogncheck
#endif

#if BUILDFLAG(IS_LINUX)
#include "chrome/browser/ui/ui_features.h"
#include "ui/base/ui_base_features.h"
#endif

#if defined(TOOLKIT_VIEWS)
#include "ui/views/views_features.h"
#include "ui/views/views_switches.h"
#endif  // defined(TOOLKIT_VIEWS)

#if BUILDFLAG(ENABLE_BOUND_SESSION_CREDENTIALS)
#include "components/unexportable_keys/features.h"  // nogncheck
#endif

FeatureEntry;
kDeprecated;
kOsAndroid;
kOsCrOS;
kOsCrOSOwnerOnly;
kOsLacros;
kOsLinux;
kOsMac;
kOsWin;

namespace about_flags {

namespace {

const unsigned kOsAll =;
const unsigned kOsDesktop =;

#if defined(USE_AURA)
const unsigned kOsAura =;
#endif  // USE_AURA

#if defined(USE_AURA)
const FeatureEntry::Choice kPullToRefreshChoices[] =;
#endif  // USE_AURA

const FeatureEntry::Choice kEnableBenchmarkingChoices[] =;

const FeatureEntry::Choice kOverlayStrategiesChoices[] =;

const FeatureEntry::Choice kTouchTextSelectionStrategyChoices[] =;

#if BUILDFLAG(IS_WIN)
const FeatureEntry::FeatureParam kMediaFoundationClearStrategyUseFrameServer[] =
    {{"strategy", "frame-server"}};

const FeatureEntry::FeatureParam
    kMediaFoundationClearStrategyUseDirectComposition[] = {
        {"strategy", "direct-composition"}};

const FeatureEntry::FeatureParam kMediaFoundationClearStrategyUseDynamic[] = {
    {"strategy", "dynamic"}};

const FeatureEntry::FeatureVariation kMediaFoundationClearStrategyVariations[] =
    {{"Direct Composition", kMediaFoundationClearStrategyUseDirectComposition,
      std::size(kMediaFoundationClearStrategyUseDirectComposition), nullptr},
     {"Frame Server", kMediaFoundationClearStrategyUseFrameServer,
      std::size(kMediaFoundationClearStrategyUseFrameServer), nullptr},
     {"Dynamic", kMediaFoundationClearStrategyUseDynamic,
      std::size(kMediaFoundationClearStrategyUseDynamic), nullptr}};

const FeatureEntry::Choice kUseAngleChoicesWindows[] = {
    {flag_descriptions::kUseAngleDefault, "", ""},
    {flag_descriptions::kUseAngleGL, switches::kUseANGLE,
     gl::kANGLEImplementationOpenGLName},
    {flag_descriptions::kUseAngleD3D11, switches::kUseANGLE,
     gl::kANGLEImplementationD3D11Name},
    {flag_descriptions::kUseAngleD3D9, switches::kUseANGLE,
     gl::kANGLEImplementationD3D9Name},
    {flag_descriptions::kUseAngleD3D11on12, switches::kUseANGLE,
     gl::kANGLEImplementationD3D11on12Name}};
#elif BUILDFLAG(IS_MAC)
const FeatureEntry::Choice kUseAngleChoicesMac[] = {
    {flag_descriptions::kUseAngleDefault, "", ""},
    {flag_descriptions::kUseAngleGL, switches::kUseANGLE,
     gl::kANGLEImplementationOpenGLName},
    {flag_descriptions::kUseAngleMetal, switches::kUseANGLE,
     gl::kANGLEImplementationMetalName}};
#endif

#if BUILDFLAG(ENABLE_EXTENSIONS)
const FeatureEntry::Choice kExtensionsToolbarZeroStateChoices[] =;
#endif  // ENABLE_EXTENSIONS

#if BUILDFLAG(IS_WIN)
const FeatureEntry::FeatureParam kDXGIWaitableSwapChain1Frame = {
    "DXGIWaitableSwapChainMaxQueuedFrames", "1"};

const FeatureEntry::FeatureParam kDXGIWaitableSwapChain2Frames = {
    "DXGIWaitableSwapChainMaxQueuedFrames", "2"};

const FeatureEntry::FeatureParam kDXGIWaitableSwapChain3Frames = {
    "DXGIWaitableSwapChainMaxQueuedFrames", "3"};

const FeatureEntry::FeatureVariation kDXGIWaitableSwapChainVariations[] = {
    {"Max 1 Frame", &kDXGIWaitableSwapChain1Frame, 1, nullptr},
    {"Max 2 Frames", &kDXGIWaitableSwapChain2Frames, 1, nullptr},
    {"Max 3 Frames", &kDXGIWaitableSwapChain3Frames, 1, nullptr}};
#endif

#if BUILDFLAG(IS_LINUX)
const FeatureEntry::Choice kOzonePlatformHintRuntimeChoices[] =;
#endif

#if BUILDFLAG(ENABLE_VR)
const FeatureEntry::Choice kWebXrForceRuntimeChoices[] =;
#endif  // ENABLE_VR

#if BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kAndroidDefaultFontFamilyDevTesting[] = {
    {"dev_testing", "true"}};

const FeatureEntry::FeatureVariation kAndroidDefaultFontFamilyVariations[] = {
    {"Use dev testing font families", kAndroidDefaultFontFamilyDevTesting,
     std::size(kAndroidDefaultFontFamilyDevTesting), nullptr}};

const FeatureEntry::FeatureParam kCCTMinimizedDefaultIcon[] = {
    {"icon_variant", "0"}};
const FeatureEntry::FeatureParam kCCTMinimizedAlternativeIcon[] = {
    {"icon_variant", "1"}};

const FeatureEntry::FeatureVariation kCCTMinimizedIconVariations[] = {
    {"Use default minimize icon", kCCTMinimizedDefaultIcon,
     std::size(kCCTMinimizedDefaultIcon), nullptr},
    {"Use alternative minimize icon", kCCTMinimizedAlternativeIcon,
     std::size(kCCTMinimizedAlternativeIcon), nullptr}};

const FeatureEntry::FeatureParam kCCTResizablePolicyParamUseAllowlist[] = {
    {"default_policy", "use-allowlist"}};
const FeatureEntry::FeatureParam kCCTResizablePolicyParamUseDenylist[] = {
    {"default_policy", "use-denylist"}};

const FeatureEntry::FeatureVariation
    kCCTResizableThirdPartiesDefaultPolicyVariations[] = {
        {"Use Allowlist", kCCTResizablePolicyParamUseAllowlist,
         std::size(kCCTResizablePolicyParamUseAllowlist), nullptr},
        {"Use Denylist", kCCTResizablePolicyParamUseDenylist,
         std::size(kCCTResizablePolicyParamUseDenylist), nullptr}};

const FeatureEntry::FeatureParam kCCTBottomBarButtonBalancedWithHomeParam[] = {
    {"google_bottom_bar_button_list", "0,10,3,2"}};
const FeatureEntry::FeatureParam kCCTBottomBarButtonsBalancedWithCustomParam[] =
    {{"google_bottom_bar_button_list", "0,3,8,2"}};
const FeatureEntry::FeatureParam kCCTBottomBarButtonsBalancedWithSearchParam[] =
    {{"google_bottom_bar_button_list", "0,3,9,2"}};
const FeatureEntry::FeatureParam kCCTBottomBarHomeInSpotlightParam[] = {
    {"google_bottom_bar_button_list", "10,10,3,2"}};
const FeatureEntry::FeatureParam kCCTBottomBarCustomInSpotlightParam[] = {
    {"google_bottom_bar_button_list", "8,8,3,2"}};
const FeatureEntry::FeatureParam kCCTBottomBarSearchInSpotlightParam[] = {
    {"google_bottom_bar_button_list", "9,9,3,2"}};

const FeatureEntry::FeatureVariation kCCTGoogleBottomBarVariations[] = {
    {"Balanced with home button", kCCTBottomBarButtonBalancedWithHomeParam,
     std::size(kCCTBottomBarButtonBalancedWithHomeParam), nullptr},
    {"Balanced with custom button", kCCTBottomBarButtonsBalancedWithCustomParam,
     std::size(kCCTBottomBarButtonsBalancedWithCustomParam), nullptr},
    {"Balanced with search button", kCCTBottomBarButtonsBalancedWithSearchParam,
     std::size(kCCTBottomBarButtonsBalancedWithSearchParam), nullptr},
    {"home button in spotlight", kCCTBottomBarHomeInSpotlightParam,
     std::size(kCCTBottomBarHomeInSpotlightParam), nullptr},
    {"custom button in spotlight", kCCTBottomBarCustomInSpotlightParam,
     std::size(kCCTBottomBarCustomInSpotlightParam), nullptr},
    {"search button in spotlight", kCCTBottomBarSearchInSpotlightParam,
     std::size(kCCTBottomBarSearchInSpotlightParam), nullptr},
};

const FeatureEntry::FeatureParam kCCTDoubleDeckerBottomBarParam[] = {
    {"google_bottom_bar_variant_layout", "1"}};
const FeatureEntry::FeatureParam kCCTSingleDeckerBottomBarParam[] = {
    {"google_bottom_bar_variant_layout", "2"}};
const FeatureEntry::FeatureParam
    kCCTSingleDeckerBottomBarWithButtonsOnRightParam[] = {
        {"google_bottom_bar_variant_layout", "3"}};

const FeatureEntry::FeatureVariation
    kCCTGoogleBottomBarVariantLayoutsVariations[] = {
        {"Double decker", kCCTDoubleDeckerBottomBarParam,
         std::size(kCCTDoubleDeckerBottomBarParam), nullptr},
        {"Single decker", kCCTSingleDeckerBottomBarParam,
         std::size(kCCTSingleDeckerBottomBarParam), nullptr},
        {"Single decker with button(s) on right",
         kCCTSingleDeckerBottomBarWithButtonsOnRightParam,
         std::size(kCCTSingleDeckerBottomBarWithButtonsOnRightParam), nullptr},
};

const FeatureEntry::Choice kReaderModeHeuristicsChoices[] = {
    {flags_ui::kGenericExperimentChoiceDefault, "", ""},
    {flag_descriptions::kReaderModeHeuristicsMarkup,
     switches::kReaderModeHeuristics,
     switches::reader_mode_heuristics::kOGArticle},
    {flag_descriptions::kReaderModeHeuristicsAdaboost,
     switches::kReaderModeHeuristics,
     switches::reader_mode_heuristics::kAdaBoost},
    {flag_descriptions::kReaderModeHeuristicsAlwaysOn,
     switches::kReaderModeHeuristics,
     switches::reader_mode_heuristics::kAlwaysTrue},
    {flag_descriptions::kReaderModeHeuristicsAlwaysOff,
     switches::kReaderModeHeuristics, switches::reader_mode_heuristics::kNone},
    {flag_descriptions::kReaderModeHeuristicsAllArticles,
     switches::kReaderModeHeuristics,
     switches::reader_mode_heuristics::kAllArticles},
};

const FeatureEntry::Choice kForceUpdateMenuTypeChoices[] = {
    {flags_ui::kGenericExperimentChoiceDefault, "", ""},
    {flag_descriptions::kUpdateMenuTypeNone, switches::kForceUpdateMenuType,
     "none"},
    {flag_descriptions::kUpdateMenuTypeUpdateAvailable,
     switches::kForceUpdateMenuType, "update_available"},
    {flag_descriptions::kUpdateMenuTypeUnsupportedOSVersion,
     switches::kForceUpdateMenuType, "unsupported_os_version"},
};

const FeatureEntry::FeatureParam kOmahaMinSdkVersionAndroidMinSdk1[] = {
    {"min_sdk_version", "1"}};
const FeatureEntry::FeatureParam kOmahaMinSdkVersionAndroidMinSdk1000[] = {
    {"min_sdk_version", "1000"}};
const FeatureEntry::FeatureVariation kOmahaMinSdkVersionAndroidVariations[] = {
    {flag_descriptions::kOmahaMinSdkVersionAndroidMinSdk1Description,
     kOmahaMinSdkVersionAndroidMinSdk1,
     std::size(kOmahaMinSdkVersionAndroidMinSdk1), nullptr},
    {flag_descriptions::kOmahaMinSdkVersionAndroidMinSdk1000Description,
     kOmahaMinSdkVersionAndroidMinSdk1000,
     std::size(kOmahaMinSdkVersionAndroidMinSdk1000), nullptr},
};

const FeatureEntry::FeatureParam
    kOptimizationGuidePersonalizedFetchingAllowPageInsights[] = {
        {"allowed_contexts", "CONTEXT_PAGE_INSIGHTS_HUB"}};
const FeatureEntry::FeatureVariation
    kOptimizationGuidePersonalizedFetchingAllowPageInsightsVariations[] = {
        {"for Page Insights",
         kOptimizationGuidePersonalizedFetchingAllowPageInsights,
         std::size(kOptimizationGuidePersonalizedFetchingAllowPageInsights),
         nullptr}};

const FeatureEntry::FeatureParam kAccessibilityPageZoomNoOSAdjustment[] = {
    {"AdjustForOSLevel", "false"},
};
const FeatureEntry::FeatureParam kAccessibilityPageZoomWithOSAdjustment[] = {
    {"AdjustForOSLevel", "true"},
};

const FeatureEntry::FeatureVariation kAccessibilityPageZoomVariations[] = {
    {"- With OS Adjustment", kAccessibilityPageZoomWithOSAdjustment,
     std::size(kAccessibilityPageZoomWithOSAdjustment), nullptr},
    {"- No OS Adjustment (default)", kAccessibilityPageZoomNoOSAdjustment,
     std::size(kAccessibilityPageZoomNoOSAdjustment), nullptr},
};

#endif  // BUILDFLAG(IS_ANDROID)

#if !BUILDFLAG(IS_CHROMEOS_ASH)
const FeatureEntry::FeatureParam kForceDark_SimpleHsl[] =;

const FeatureEntry::FeatureParam kForceDark_SimpleCielab[] =;

const FeatureEntry::FeatureParam kForceDark_SimpleRgb[] =;

// Keep in sync with the kForceDark_SelectiveImageInversion
// in aw_feature_entries.cc if you tweak these parameters.
const FeatureEntry::FeatureParam kForceDark_SelectiveImageInversion[] =;

const FeatureEntry::FeatureParam kForceDark_SelectiveElementInversion[] =;

const FeatureEntry::FeatureParam kForceDark_SelectiveGeneralInversion[] =;

const FeatureEntry::FeatureParam kForceDark_TransparencyAndNumColors[] =;

const FeatureEntry::FeatureVariation kForceDarkVariations[] =;
#endif  // !BUILDFLAG(IS_CHROMEOS)

const FeatureEntry::FeatureParam kSearchEngineChoiceEnabledWithForcedEea[] =;
const FeatureEntry::FeatureVariation kSearchEngineChoiceVariations[] =;

const FeatureEntry::FeatureParam
    kWebIdentityDigitalIdentityCredentialNoDialogParam[] =;
const FeatureEntry::FeatureParam
    kWebIdentityDigitalIdentityCredentialDefaultParam[] =;
const FeatureEntry::FeatureParam
    kWebIdentityDigitalIdentityCredentialLowRiskDialogParam[] =;
const FeatureEntry::FeatureParam
    kWebIdentityDigitalIdentityCredentialHighRiskDialogParam[] =;
const FeatureEntry::FeatureVariation
    kWebIdentityDigitalIdentityCredentialVariations[] =;

const FeatureEntry::FeatureParam kClipboardMaximumAge60Seconds[] =;
const FeatureEntry::FeatureParam kClipboardMaximumAge90Seconds[] =;
const FeatureEntry::FeatureParam kClipboardMaximumAge120Seconds[] =;
const FeatureEntry::FeatureParam kClipboardMaximumAge150Seconds[] =;
const FeatureEntry::FeatureParam kClipboardMaximumAge180Seconds[] =;

const FeatureEntry::FeatureVariation kClipboardMaximumAgeVariations[] =;

const FeatureEntry::FeatureParam kMBIModeLegacy[] =;
const FeatureEntry::FeatureParam kMBIModeEnabledPerRenderProcessHost[] =;
const FeatureEntry::FeatureParam kMBIModeEnabledPerSiteInstance[] =;

const FeatureEntry::FeatureVariation kMBIModeVariations[] =;

const FeatureEntry::FeatureParam kSearchPrefetchWithoutHoldback[] =;
const FeatureEntry::FeatureParam kSearchPrefetchWithHoldback[] =;

const FeatureEntry::FeatureVariation
    kSearchPrefetchServicePrefetchingVariations[] =;

#if BUILDFLAG(IS_CHROMEOS_ASH)
const FeatureEntry::FeatureParam kArcVmMemorySizeShift_200[] = {
    {"shift_mib", "-200"}};
const FeatureEntry::FeatureParam kArcVmMemorySizeShift_500[] = {
    {"shift_mib", "-500"}};
const FeatureEntry::FeatureParam kArcVmMemorySizeShift_800[] = {
    {"shift_mib", "-800"}};

const FeatureEntry::FeatureVariation kArcVmMemorySizeVariations[] = {
    {"shift -200MiB", kArcVmMemorySizeShift_200,
     std::size(kArcVmMemorySizeShift_200), nullptr},
    {"shift -500MiB", kArcVmMemorySizeShift_500,
     std::size(kArcVmMemorySizeShift_500), nullptr},
    {"shift -800MiB", kArcVmMemorySizeShift_800,
     std::size(kArcVmMemorySizeShift_800), nullptr},
};
#endif  // BUILDFLAG(IS_CHROMEOS_ASH)

const FeatureEntry::Choice kEnableGpuRasterizationChoices[] =;

const FeatureEntry::Choice kTopChromeTouchUiChoices[] =;

#if !BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kToastWith8Seconds[] =;
const FeatureEntry::FeatureParam kToastWith10Seconds[] =;
const FeatureEntry::FeatureParam kToastWith12Seconds[] =;

const FeatureEntry::FeatureVariation kToastVariations[] =;
#endif

#if BUILDFLAG(IS_CHROMEOS_ASH)

const FeatureEntry::FeatureParam kRoundedWindowRadius8 = {
    chromeos::features::kRoundedWindowsRadius, "8"};

const FeatureEntry::FeatureParam kRoundedWindowRadius10 = {
    chromeos::features::kRoundedWindowsRadius, "10"};

const FeatureEntry::FeatureParam kRoundedWindowRadius12 = {
    chromeos::features::kRoundedWindowsRadius, "12"};

const FeatureEntry::FeatureParam kRoundedWindowRadius14 = {
    chromeos::features::kRoundedWindowsRadius, "14"};

const FeatureEntry::FeatureParam kRoundedWindowRadius16 = {
    chromeos::features::kRoundedWindowsRadius, "16"};

const FeatureEntry::FeatureParam kRoundedWindowRadius18 = {
    chromeos::features::kRoundedWindowsRadius, "18"};

const FeatureEntry::FeatureVariation kRoundedWindowsRadiusVariation[] = {
    {"8", &kRoundedWindowRadius8, 1, nullptr},
    {"10", &kRoundedWindowRadius10, 1, nullptr},
    {"12", &kRoundedWindowRadius12, 1, nullptr},
    {"14", &kRoundedWindowRadius14, 1, nullptr},
    {"16", &kRoundedWindowRadius16, 1, nullptr},
    {"18", &kRoundedWindowRadius18, 1, nullptr},
};

const FeatureEntry::FeatureParam
    kArcRoundedWindowCompatStrategyLeftRightBottomGesture = {
        arc::kRoundedWindowCompatStrategy,
        arc::kRoundedWindowCompatStrategy_LeftRightBottomGesture};

const FeatureEntry::FeatureParam
    kArcRoundedWindowCompatStrategyBottomOnlyGesture = {
        arc::kRoundedWindowCompatStrategy,
        arc::kRoundedWindowCompatStrategy_BottomOnlyGesture};

const FeatureEntry::FeatureVariation kArcRoundedWindowCompatVariation[] = {
    {"Left-Right-Bottom Gesture Exclusion",
     &kArcRoundedWindowCompatStrategyLeftRightBottomGesture, 1, nullptr},
    {"Bottom-only Gesture Exclusion",
     &kArcRoundedWindowCompatStrategyBottomOnlyGesture, 1, nullptr},
};

const FeatureEntry::FeatureParam kZinkEnableRecommended[] = {
    {"BorealisZinkGlDriverParam", "ZinkEnableRecommended"}};
const FeatureEntry::FeatureParam kZinkEnableAll[] = {
    {"BorealisZinkGlDriverParam", "ZinkEnableAll"}};

const FeatureEntry::FeatureVariation kBorealisZinkGlDriverVariations[] = {
    {"for recommended apps", kZinkEnableRecommended,
     std::size(kZinkEnableRecommended), nullptr},
    {"for all apps", kZinkEnableAll, std::size(kZinkEnableAll), nullptr}};

const char kPreferDcheckInternalName[] = "prefer-dcheck";

const char kLacrosAvailabilityIgnoreInternalName[] =
    "lacros-availability-ignore";
const char kLacrosStabilityInternalName[] = "lacros-stability";
const char kLacrosWaylandLoggingInternalName[] = "lacros-wayland-logging";
const char kArcEnableVirtioBlkForDataInternalName[] =
    "arc-enable-virtio-blk-for-data";

const FeatureEntry::Choice kPreferDcheckChoices[] = {
    {flags_ui::kGenericExperimentChoiceDefault, "", ""},
    {component_updater::kPreferDcheckOptIn,
     component_updater::kPreferDcheckSwitch,
     component_updater::kPreferDcheckOptIn},
    {component_updater::kPreferDcheckOptOut,
     component_updater::kPreferDcheckSwitch,
     component_updater::kPreferDcheckOptOut},
};

const FeatureEntry::Choice kLacrosStabilityChoices[] = {
    {flags_ui::kGenericExperimentChoiceDefault, "", ""},
    {ash::standalone_browser::kLacrosStabilityChannelCanary,
     ash::standalone_browser::kLacrosStabilitySwitch,
     ash::standalone_browser::kLacrosStabilityChannelCanary},
    {ash::standalone_browser::kLacrosStabilityChannelDev,
     ash::standalone_browser::kLacrosStabilitySwitch,
     ash::standalone_browser::kLacrosStabilityChannelDev},
    {ash::standalone_browser::kLacrosStabilityChannelBeta,
     ash::standalone_browser::kLacrosStabilitySwitch,
     ash::standalone_browser::kLacrosStabilityChannelBeta},
    {ash::standalone_browser::kLacrosStabilityChannelStable,
     ash::standalone_browser::kLacrosStabilitySwitch,
     ash::standalone_browser::kLacrosStabilityChannelStable},
};

const char kLacrosSelectionInternalName[] = "lacros-selection";
const char kProjectorServerSideSpeechRecognition[] =
    "enable-projector-server-side-speech-recognition";

const FeatureEntry::Choice kLacrosSelectionChoices[] = {
    {flags_ui::kGenericExperimentChoiceDefault, "", ""},
    {flag_descriptions::kLacrosSelectionStatefulDescription,
     ash::standalone_browser::kLacrosSelectionSwitch,
     ash::standalone_browser::kLacrosSelectionStateful},
    {flag_descriptions::kLacrosSelectionRootfsDescription,
     ash::standalone_browser::kLacrosSelectionSwitch,
     ash::standalone_browser::kLacrosSelectionRootfs},
};

const char kLacrosSelectionPolicyIgnoreInternalName[] =
    "lacros-selection-ignore";

const FeatureEntry::Choice kLacrosAvailabilityPolicyChoices[] = {
    {flags_ui::kGenericExperimentChoiceDefault, "", ""},
    {ash::standalone_browser::kLacrosAvailabilityPolicyUserChoice,
     ash::standalone_browser::kLacrosAvailabilityPolicySwitch,
     ash::standalone_browser::kLacrosAvailabilityPolicyUserChoice},
    {ash::standalone_browser::kLacrosAvailabilityPolicyLacrosDisabled,
     ash::standalone_browser::kLacrosAvailabilityPolicySwitch,
     ash::standalone_browser::kLacrosAvailabilityPolicyLacrosDisabled},
    {ash::standalone_browser::kLacrosAvailabilityPolicyLacrosOnly,
     ash::standalone_browser::kLacrosAvailabilityPolicySwitch,
     ash::standalone_browser::kLacrosAvailabilityPolicyLacrosOnly},
};

const FeatureEntry::Choice kLacrosDataBackwardMigrationModePolicyChoices[] = {
    {flags_ui::kGenericExperimentChoiceDefault, "", ""},
    {crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyNone,
     crosapi::browser_util::kLacrosDataBackwardMigrationModePolicySwitch,
     crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyNone},
    {crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyKeepNone,
     crosapi::browser_util::kLacrosDataBackwardMigrationModePolicySwitch,
     crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyKeepNone},
    {crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyKeepSafeData,
     crosapi::browser_util::kLacrosDataBackwardMigrationModePolicySwitch,
     crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyKeepSafeData},
    {crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyKeepAll,
     crosapi::browser_util::kLacrosDataBackwardMigrationModePolicySwitch,
     crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyKeepAll},
};

#endif  // BUILDFLAG(IS_CHROMEOS_ASH)

const FeatureEntry::Choice kForceUIDirectionChoices[] =;

const FeatureEntry::Choice kForceTextDirectionChoices[] =;

const FeatureEntry::Choice kIpProtectionProxyOptOutChoices[] =;

#if BUILDFLAG(IS_CHROMEOS_ASH)
const FeatureEntry::Choice kSchedulerConfigurationChoices[] = {
    {flags_ui::kGenericExperimentChoiceDefault, "", ""},
    {flag_descriptions::kSchedulerConfigurationConservative,
     switches::kSchedulerConfiguration,
     switches::kSchedulerConfigurationConservative},
    {flag_descriptions::kSchedulerConfigurationPerformance,
     switches::kSchedulerConfiguration,
     switches::kSchedulerConfigurationPerformance},
};
#endif  // BUILDFLAG(IS_CHROMEOS_ASH)

#if BUILDFLAG(IS_CHROMEOS_ASH)
const FeatureEntry::FeatureParam kDynamicSearchUpdateAnimationDuration_50[] = {
    {"search_result_translation_duration", "50"}};
const FeatureEntry::FeatureParam kDynamicSearchUpdateAnimationDuration_100[] = {
    {"search_result_translation_duration", "100"}};
const FeatureEntry::FeatureParam kDynamicSearchUpdateAnimationDuration_150[] = {
    {"search_result_translation_duration", "150"}};

const FeatureEntry::FeatureVariation kDynamicSearchUpdateAnimationVariations[] =
    {{"50ms", kDynamicSearchUpdateAnimationDuration_50,
      std::size(kDynamicSearchUpdateAnimationDuration_50), nullptr},
     {"100ms", kDynamicSearchUpdateAnimationDuration_100,
      std::size(kDynamicSearchUpdateAnimationDuration_100), nullptr},
     {"150ms", kDynamicSearchUpdateAnimationDuration_150,
      std::size(kDynamicSearchUpdateAnimationDuration_150), nullptr}};
#endif  // BUILDFLAG(IS_CHROMEOS_ASH)

#if BUILDFLAG(ENABLE_NACL)
// Note: This needs to be kept in sync with parsing in
// content/common/zygote/zygote_communication_linux.cc
const FeatureEntry::Choice kVerboseLoggingInNaclChoices[] = {
    {flag_descriptions::kVerboseLoggingInNaclChoiceDefault, "", ""},
    {flag_descriptions::kVerboseLoggingInNaclChoiceLow,
     switches::kVerboseLoggingInNacl, switches::kVerboseLoggingInNaclChoiceLow},
    {flag_descriptions::kVerboseLoggingInNaclChoiceMedium,
     switches::kVerboseLoggingInNacl,
     switches::kVerboseLoggingInNaclChoiceMedium},
    {flag_descriptions::kVerboseLoggingInNaclChoiceHigh,
     switches::kVerboseLoggingInNacl,
     switches::kVerboseLoggingInNaclChoiceHigh},
    {flag_descriptions::kVerboseLoggingInNaclChoiceHighest,
     switches::kVerboseLoggingInNacl,
     switches::kVerboseLoggingInNaclChoiceHighest},
    {flag_descriptions::kVerboseLoggingInNaclChoiceDisabled,
     switches::kVerboseLoggingInNacl,
     switches::kVerboseLoggingInNaclChoiceDisabled},
};
#endif  // ENABLE_NACL

const FeatureEntry::Choice kSiteIsolationOptOutChoices[] =;

const FeatureEntry::Choice kForceColorProfileChoices[] =;

const FeatureEntry::Choice kMemlogModeChoices[] =;

const FeatureEntry::Choice kMemlogStackModeChoices[] =;

const FeatureEntry::Choice kMemlogSamplingRateChoices[] =;

const FeatureEntry::FeatureParam
    kOptimizationGuideOnDeviceModelBypassPerfParams[] =;
const FeatureEntry::FeatureVariation
    kOptimizationGuideOnDeviceModelVariations[] =;

const FeatureEntry::FeatureParam kPageContentAnnotationsContentParams[] =;
const FeatureEntry::FeatureParam kPageContentAnnotationsTitleParams[] =;
const FeatureEntry::FeatureVariation kPageContentAnnotationsVariations[] =;

#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
    BUILDFLAG(IS_WIN)
const FeatureEntry::FeatureParam kHistoryEmbeddingsAtKeywordAcceleration[]{};
const FeatureEntry::FeatureVariation kHistoryEmbeddingsVariations[] =;

#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) ||
        // BUILDFLAG(IS_WIN)

const FeatureEntry::FeatureParam kJourneysShowAllVisitsParams[] =;
const FeatureEntry::FeatureParam kJourneysAllLocalesParams[] =;
const FeatureEntry::FeatureVariation kJourneysVariations[] =;

const FeatureEntry::FeatureVariation
    kImageServiceOptimizationGuideSalientImagesVariations[] =;

const FeatureEntry::FeatureParam kSidePanelJourneysOpensFromOmniboxParams[] =;
const FeatureEntry::FeatureVariation
    kSidePanelJourneysOpensFromOmniboxVariations[] =;

#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
    BUILDFLAG(IS_WIN)
const FeatureEntry::FeatureParam kShortcutBoostSingleUrl[] =;
const FeatureEntry::FeatureParam kShortcutBoostMultipleUrls[] =;
const FeatureEntry::FeatureParam kShortcutBoostMultipleSearchesAndUrls[] =;

const FeatureEntry::FeatureVariation kOmniboxShortcutBoostVariations[] =;

// A limited number of combinations of the rich autocompletion params.
const FeatureEntry::FeatureParam
    kOmniboxRichAutocompletionConservativeModerate[] =;
const FeatureEntry::FeatureParam
    kOmniboxRichAutocompletionConservativeModerate2[] =;
const FeatureEntry::FeatureParam kOmniboxRichAutocompletionAggressive2[] =;
const FeatureEntry::FeatureParam kOmniboxRichAutocompletionAggressive3[] =;
const FeatureEntry::FeatureParam kOmniboxRichAutocompletionAggressive4[] =;

const FeatureEntry::FeatureVariation
    kOmniboxRichAutocompletionPromisingVariations[] =;

const FeatureEntry::FeatureParam
    kOmniboxDriveSuggestionsIgnoreWhenDebouncing[] =;
const FeatureEntry::FeatureVariation kOmniboxDriveSuggestionsVariations[] =;

const FeatureEntry::FeatureParam kOmniboxStarterPackExpansionPreProdUrl[] =;
const FeatureEntry::FeatureParam kOmniboxStarterPackExpansionStagingUrl[] =;
const FeatureEntry::FeatureVariation kOmniboxStarterPackExpansionVariations[] =;
#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) ||
        // BUILDFLAG(IS_WIN)

const FeatureEntry::FeatureParam kOmniboxMlUrlScoringEnabledWithFixes[] =;
const FeatureEntry::FeatureParam kOmniboxMlUrlScoringUnlimitedNumCandidates[] =;
// Sets Bookmark(1), History Quick(4), History URL(8), Shortcuts(64),
// Document(512), and History Fuzzy(65536) providers max matches to 10.
const FeatureEntry::FeatureParam kOmniboxMlUrlScoringMaxMatchesByProvider10[] =;
// Enables ML scoring for Search suggestions.
const FeatureEntry::FeatureParam kOmniboxMlUrlScoringWithSearches[] =;
// Enables ML scoring for verbatim URL suggestions.
const FeatureEntry::FeatureParam kOmniboxMlUrlScoringWithVerbatimURLs[] =;
// Enables ML scoring for both Search and verbatim URL suggestions.
const FeatureEntry::FeatureParam
    kOmniboxMlUrlScoringWithSearchesAndVerbatimURLs[] =;

const FeatureEntry::FeatureVariation kOmniboxMlUrlScoringVariations[] =;

const FeatureEntry::FeatureParam
    kMlUrlPiecewiseMappedSearchBlendingAdjustedBy0[] =;
const FeatureEntry::FeatureParam
    kMlUrlPiecewiseMappedSearchBlendingDemotedBy50[] =;
const FeatureEntry::FeatureParam
    kMlUrlPiecewiseMappedSearchBlendingPromotedBy50[] =;
const FeatureEntry::FeatureParam
    kMlUrlPiecewiseMappedSearchBlendingPromotedBy100[] =;
const FeatureEntry::FeatureParam
    kMlUrlPiecewiseMappedSearchBlendingMobileMapping[] =;

const FeatureEntry::FeatureVariation
    kMlUrlPiecewiseMappedSearchBlendingVariations[] =;

const FeatureEntry::FeatureParam kMlUrlSearchBlendingStable[] =;
const FeatureEntry::FeatureParam kMlUrlSearchBlendingMappedConservativeUrls[] =;
const FeatureEntry::FeatureParam kMlUrlSearchBlendingMappedModerateUrls[] =;
const FeatureEntry::FeatureParam kMlUrlSearchBlendingMappedAggressiveUrls[] =;

const FeatureEntry::FeatureVariation kMlUrlSearchBlendingVariations[] =;

const FeatureEntry::FeatureVariation kUrlScoringModelVariations[] =;

const FeatureEntry::FeatureParam
    kOmniboxZeroSuggestPrefetchDebouncingMinimalFromLastRun[] =;
const FeatureEntry::FeatureParam
    kOmniboxZeroSuggestPrefetchDebouncingMinimalFromLastRequest[] =;
const FeatureEntry::FeatureParam
    kOmniboxZeroSuggestPrefetchDebouncingModerateFromLastRun[] =;
const FeatureEntry::FeatureParam
    kOmniboxZeroSuggestPrefetchDebouncingModerateFromLastRequest[] =;
const FeatureEntry::FeatureParam
    kOmniboxZeroSuggestPrefetchDebouncingAggressiveFromLastRun[] =;
const FeatureEntry::FeatureParam
    kOmniboxZeroSuggestPrefetchDebouncingAggressiveFromLastRequest[] =;

const FeatureEntry::FeatureVariation
    kOmniboxZeroSuggestPrefetchDebouncingVariations[] =;

#if BUILDFLAG(IS_ANDROID)
constexpr FeatureEntry::FeatureParam kOmniboxActionsInSuggestTreatment1[] = {
    {OmniboxFieldTrial::kActionsInSuggestPromoteEntitySuggestion.name, "true"},
    {OmniboxFieldTrial::kActionsInSuggestPromoteReviewsAction.name, "true"},
    {OmniboxFieldTrial::kActionsInSuggestRemoveActionTypes.name, ""}};
constexpr FeatureEntry::FeatureParam kOmniboxActionsInSuggestTreatment2[] = {
    {OmniboxFieldTrial::kActionsInSuggestPromoteEntitySuggestion.name, "false"},
    {OmniboxFieldTrial::kActionsInSuggestPromoteReviewsAction.name, "true"},
    {OmniboxFieldTrial::kActionsInSuggestRemoveActionTypes.name, ""}};
constexpr FeatureEntry::FeatureParam kOmniboxActionsInSuggestTreatment3[] = {
    {OmniboxFieldTrial::kActionsInSuggestPromoteEntitySuggestion.name, "true"},
    {OmniboxFieldTrial::kActionsInSuggestPromoteReviewsAction.name, "false"},
    {OmniboxFieldTrial::kActionsInSuggestRemoveActionTypes.name, ""}};
constexpr FeatureEntry::FeatureParam kOmniboxActionsInSuggestTreatment4[] = {
    {OmniboxFieldTrial::kActionsInSuggestPromoteEntitySuggestion.name, "true"},
    {OmniboxFieldTrial::kActionsInSuggestPromoteReviewsAction.name, "true"},
    {OmniboxFieldTrial::kActionsInSuggestRemoveActionTypes.name, "reviews"}};
constexpr FeatureEntry::FeatureParam kOmniboxActionsInSuggestTreatment5[] = {
    {OmniboxFieldTrial::kActionsInSuggestPromoteEntitySuggestion.name, "true"},
    {OmniboxFieldTrial::kActionsInSuggestPromoteReviewsAction.name, "true"},
    {OmniboxFieldTrial::kActionsInSuggestRemoveActionTypes.name, "call"}};
constexpr FeatureEntry::FeatureParam kOmniboxActionsInSuggestTreatment6[] = {
    {OmniboxFieldTrial::kActionsInSuggestPromoteEntitySuggestion.name, "true"},
    {OmniboxFieldTrial::kActionsInSuggestPromoteReviewsAction.name, "true"},
    {OmniboxFieldTrial::kActionsInSuggestRemoveActionTypes.name, "directions"}};
constexpr FeatureEntry::FeatureParam kOmniboxActionsInSuggestTreatment7[] = {
    {OmniboxFieldTrial::kActionsInSuggestPromoteEntitySuggestion.name, "true"},
    {OmniboxFieldTrial::kActionsInSuggestPromoteReviewsAction.name, "false"},
    {OmniboxFieldTrial::kActionsInSuggestRemoveActionTypes.name, "call"}};
constexpr FeatureEntry::FeatureParam kOmniboxActionsInSuggestTreatment8[] = {
    {OmniboxFieldTrial::kActionsInSuggestPromoteEntitySuggestion.name, "false"},
    {OmniboxFieldTrial::kActionsInSuggestPromoteReviewsAction.name, "false"},
    {OmniboxFieldTrial::kActionsInSuggestRemoveActionTypes.name, "call"}};

constexpr FeatureEntry::FeatureVariation kOmniboxActionsInSuggestVariants[] = {
    {"T1: Promote, Reviews, Directions, Calls",
     kOmniboxActionsInSuggestTreatment1,
     std::size(kOmniboxActionsInSuggestTreatment1), "t3366528"},
    {"T2: Reviews, Directions, Calls", kOmniboxActionsInSuggestTreatment2,
     std::size(kOmniboxActionsInSuggestTreatment2), "t3366528"},
    {"T3: Promote, Calls, Directions, Reviews",
     kOmniboxActionsInSuggestTreatment3,
     std::size(kOmniboxActionsInSuggestTreatment3), "t3366528"},
    {"T4: Promote, Directions, Calls", kOmniboxActionsInSuggestTreatment4,
     std::size(kOmniboxActionsInSuggestTreatment4), "t3366528"},
    {"T5: Promote, Reviews, Directions", kOmniboxActionsInSuggestTreatment5,
     std::size(kOmniboxActionsInSuggestTreatment5), "t3366528"},
    {"T6: Promote, Reviews, Calls", kOmniboxActionsInSuggestTreatment6,
     std::size(kOmniboxActionsInSuggestTreatment6), "t3366528"},
    {"T7: Promote, Directions, Reviews", kOmniboxActionsInSuggestTreatment7,
     std::size(kOmniboxActionsInSuggestTreatment7), "t3366528"},
    {"T8: Directions, Reviews", kOmniboxActionsInSuggestTreatment8,
     std::size(kOmniboxActionsInSuggestTreatment8), "t3366528"},
};

constexpr FeatureEntry::FeatureParam kOmniboxAnswerActionsCounterfactual[] = {
    {OmniboxFieldTrial::kAnswerActionsCounterfactual.name, "true"}};
constexpr FeatureEntry::FeatureParam kOmniboxAnswerActionsTreatment1[] = {
    {OmniboxFieldTrial::kAnswerActionsShowAboveKeyboard.name, "true"},
    {OmniboxFieldTrial::kAnswerActionsShowIfUrlsPresent.name, "false"},
    {OmniboxFieldTrial::kAnswerActionsShowRichCard.name, "false"}};

constexpr FeatureEntry::FeatureParam kOmniboxAnswerActionsTreatment2[] = {
    {OmniboxFieldTrial::kAnswerActionsShowAboveKeyboard.name, "false"},
    {OmniboxFieldTrial::kAnswerActionsShowIfUrlsPresent.name, "true"},
    {OmniboxFieldTrial::kAnswerActionsShowRichCard.name, "false"}};

constexpr FeatureEntry::FeatureParam kOmniboxAnswerActionsTreatment3[] = {
    {OmniboxFieldTrial::kAnswerActionsShowAboveKeyboard.name, "false"},
    {OmniboxFieldTrial::kAnswerActionsShowIfUrlsPresent.name, "false"},
    {OmniboxFieldTrial::kAnswerActionsShowRichCard.name, "false"}};

constexpr FeatureEntry::FeatureParam kOmniboxAnswerActionsTreatment4[] = {
    {OmniboxFieldTrial::kAnswerActionsShowAboveKeyboard.name, "true"},
    {OmniboxFieldTrial::kAnswerActionsShowIfUrlsPresent.name, "false"},
    {OmniboxFieldTrial::kAnswerActionsShowRichCard.name, "true"}};

constexpr FeatureEntry::FeatureParam kOmniboxAnswerActionsTreatment5[] = {
    {OmniboxFieldTrial::kAnswerActionsShowAboveKeyboard.name, "false"},
    {OmniboxFieldTrial::kAnswerActionsShowIfUrlsPresent.name, "false"},
    {OmniboxFieldTrial::kAnswerActionsShowRichCard.name, "true"}};

constexpr FeatureEntry::FeatureVariation kOmniboxAnswerActionsVariants[] = {
    {"Counterfactual: fetch without rendering ",
     kOmniboxAnswerActionsCounterfactual,
     std::size(kOmniboxAnswerActionsCounterfactual), "t3379046"},
    {"T1: Show chips above keyboard when there are no url matches",
     kOmniboxAnswerActionsTreatment1,
     std::size(kOmniboxAnswerActionsTreatment1), "t3379047"},
    {"T2: Show chips at position 0", kOmniboxAnswerActionsTreatment2,
     std::size(kOmniboxAnswerActionsTreatment2), "t3379048"},
    {"T3: Show chips at position 0 when there are no url matches",
     kOmniboxAnswerActionsTreatment3,
     std::size(kOmniboxAnswerActionsTreatment3), "t3379049"},
    {"T4: Show rich card above keyboard when there are no url matches",
     kOmniboxAnswerActionsTreatment4,
     std::size(kOmniboxAnswerActionsTreatment4), "t3379050"},
    {"T5: Show rich card at position 0 when there are no url matches",
     kOmniboxAnswerActionsTreatment5,
     std::size(kOmniboxAnswerActionsTreatment5), "t3379051"},
};

#endif  // BUILDFLAG(IS_ANDROID)

const FeatureEntry::FeatureParam kOmniboxSquareSuggestionIconFavicons[] =;
const FeatureEntry::FeatureParam kOmniboxSquareSuggestionIconAnswers[] =;
const FeatureEntry::FeatureParam
    kOmniboxSquareSuggestionIconFaviconsAndAnswers[] =;
const FeatureEntry::FeatureParam kOmniboxSquareSuggestionIconEntities[] =;
const FeatureEntry::FeatureParam kOmniboxSquareSuggestionIconWeather[] =;
const FeatureEntry::FeatureParam kOmniboxSquareSuggestionIconAll[] =;
const FeatureEntry::FeatureParam kOmniboxSquareSuggestionIconAllFullEntity[] =;

const FeatureEntry::FeatureVariation kOmniboxSquareSuggestionIconVariations[] =;

const FeatureEntry::FeatureParam kMaxZeroSuggestMatches5[] =;
const FeatureEntry::FeatureParam kMaxZeroSuggestMatches6[] =;
const FeatureEntry::FeatureParam kMaxZeroSuggestMatches7[] =;
const FeatureEntry::FeatureParam kMaxZeroSuggestMatches8[] =;
const FeatureEntry::FeatureParam kMaxZeroSuggestMatches9[] =;
const FeatureEntry::FeatureParam kMaxZeroSuggestMatches10[] =;
const FeatureEntry::FeatureParam kMaxZeroSuggestMatches11[] =;
const FeatureEntry::FeatureParam kMaxZeroSuggestMatches12[] =;
const FeatureEntry::FeatureParam kMaxZeroSuggestMatches13[] =;
const FeatureEntry::FeatureParam kMaxZeroSuggestMatches14[] =;
const FeatureEntry::FeatureParam kMaxZeroSuggestMatches15[] =;

const FeatureEntry::FeatureVariation kMaxZeroSuggestMatchesVariations[] =;

const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches3[] =;
const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches4[] =;
const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches5[] =;
const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches6[] =;
const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches7[] =;
const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches8[] =;
const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches9[] =;
const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches10[] =;
const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches12[] =;

const FeatureEntry::FeatureVariation
    kOmniboxUIMaxAutocompleteMatchesVariations[] =;

const FeatureEntry::FeatureParam kOmniboxMaxURLMatches2[] =;
const FeatureEntry::FeatureParam kOmniboxMaxURLMatches3[] =;
const FeatureEntry::FeatureParam kOmniboxMaxURLMatches4[] =;
const FeatureEntry::FeatureParam kOmniboxMaxURLMatches5[] =;
const FeatureEntry::FeatureParam kOmniboxMaxURLMatches6[] =;

const FeatureEntry::FeatureVariation kOmniboxMaxURLMatchesVariations[] =;

const FeatureEntry::FeatureParam kOmniboxDynamicMaxAutocomplete90[] =;
const FeatureEntry::FeatureParam kOmniboxDynamicMaxAutocomplete91[] =;
const FeatureEntry::FeatureParam kOmniboxDynamicMaxAutocomplete92[] =;
const FeatureEntry::FeatureParam kOmniboxDynamicMaxAutocomplete100[] =;
const FeatureEntry::FeatureParam kOmniboxDynamicMaxAutocomplete101[] =;
const FeatureEntry::FeatureParam kOmniboxDynamicMaxAutocomplete102[] =;

const FeatureEntry::FeatureVariation
    kOmniboxDynamicMaxAutocompleteVariations[] =;

const FeatureEntry::FeatureParam kOmniboxUniformRowHeight36[] =;
const FeatureEntry::FeatureParam kOmniboxUniformRowHeight40[] =;

const FeatureEntry::FeatureVariation kOmniboxSuggestionHeightVariations[] =;

const FeatureEntry::FeatureParam kOmniboxFontSize12[] =;
const FeatureEntry::FeatureParam kOmniboxFontSize13[] =;
const FeatureEntry::FeatureParam kOmniboxFontSize14[] =;

const FeatureEntry::FeatureVariation kOmniboxFontSizeVariations[] =;

const FeatureEntry::FeatureParam kRepeatableQueries_6Searches_90Days[] =;
const FeatureEntry::FeatureParam kRepeatableQueries_12Searches_90Days[] =;
const FeatureEntry::FeatureParam kRepeatableQueries_6Searches_7Days[] =;
const FeatureEntry::FeatureParam kRepeatableQueries_12Searches_7Days[] =;

const FeatureEntry::FeatureVariation kOrganicRepeatableQueriesVariations[] =;
#if !BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kMinimumTabWidthSettingPinned[] =;
const FeatureEntry::FeatureParam kMinimumTabWidthSettingMedium[] =;
const FeatureEntry::FeatureParam kMinimumTabWidthSettingLarge[] =;
const FeatureEntry::FeatureParam kMinimumTabWidthSettingFull[] =;

const FeatureEntry::FeatureVariation kTabScrollingVariations[] =;
#endif
const FeatureEntry::FeatureParam kTabScrollingButtonPositionRight[] =;
const FeatureEntry::FeatureParam kTabScrollingButtonPositionLeft[] =;
const FeatureEntry::FeatureParam kTabScrollingButtonPositionSplit[] =;

const FeatureEntry::FeatureVariation kTabScrollingButtonPositionVariations[] =;

#if !BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kTabScrollingWithDraggingWithConstantSpeed[] =;
const FeatureEntry::FeatureParam kTabScrollingWithDraggingWithVariableSpeed[] =;

const FeatureEntry::FeatureVariation kTabScrollingWithDraggingVariations[] =;

const FeatureEntry::FeatureParam kScrollableTabStripOverflowDivider[] =;
const FeatureEntry::FeatureParam kScrollableTabStripOverflowFade[] =;
const FeatureEntry::FeatureParam kScrollableTabStripOverflowShadow[] =;

const FeatureEntry::FeatureVariation kScrollableTabStripOverflowVariations[] =;
#endif

const FeatureEntry::FeatureParam kChromeLabsEnabledInFlags[] =;

const FeatureEntry::FeatureVariation kChromeLabsVariations[] =;

#if !BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kNtpCalendarModuleFakeData[] =;
const FeatureEntry::FeatureVariation kNtpCalendarModuleVariations[] =;

const FeatureEntry::FeatureParam kNtpChromeCartModuleFakeData[] =;
const FeatureEntry::FeatureParam kNtpChromeCartModuleAbandonedCartDiscount[] =;
const FeatureEntry::FeatureParam kNtpChromeCartModuleHeuristicsImprovement[] =;
const FeatureEntry::FeatureParam kNtpChromeCartModuleRBDAndCouponDiscount[] =;
const FeatureEntry::FeatureVariation kNtpChromeCartModuleVariations[] =;

// The following are consent v2 variations in the Chrome Cart module.
const flags_ui::FeatureEntry::FeatureParam kDiscountConsentNtpDialog[] =;
const flags_ui::FeatureEntry::FeatureParam kDiscountConsentNtpNativeDialog[] =;

const FeatureEntry::FeatureVariation kDiscountConsentV2Variations[] =;

// The following is Code-based RBD variation.
const flags_ui::FeatureEntry::FeatureParam kCodeBasedRBDEnabled[] =;

const FeatureEntry::FeatureVariation kCodeBasedRBDVariations[] =;

const FeatureEntry::FeatureParam kNtpDriveModuleFakeData[] =;
const FeatureEntry::FeatureParam kNtpDriveModuleManagedUsersOnly[] =;
const FeatureEntry::FeatureVariation kNtpDriveModuleVariations[] =;

const FeatureEntry::FeatureParam kNtpMiddleSlotPromoDismissalFakeData[] =;
const FeatureEntry::FeatureVariation kNtpMiddleSlotPromoDismissalVariations[] =;

const FeatureEntry::FeatureParam
    kNtpRealboxCr23NoShadowExpandedStateBgMatchesSteadyState[]{};
const FeatureEntry::FeatureParam
    kNtpRealboxCr23ShadowExpandedStateBgMatchesOmnibox[]{};
const FeatureEntry::FeatureParam
    kNtpRealboxCr23ShadowExpandedStateBgMatchesSteadyState[]{};

const FeatureEntry::FeatureVariation kNtpRealboxCr23ThemingVariations[] =;

const FeatureEntry::FeatureParam kNtpSafeBrowsingModuleFastCooldown[] =;
const FeatureEntry::FeatureVariation kNtpSafeBrowsingModuleVariations[] =;

const FeatureEntry::FeatureParam kNtpMostRelevantTabResumptionModuleFakeData[] =;
const FeatureEntry::FeatureParam
    kNtpMostRelevantTabResumptionModuleFakeDataMostRecent[] =;
const FeatureEntry::FeatureParam
    kNtpMostRelevantTabResumptionModuleFakeDataFrequentlyVisitedAtTime[] =;
const FeatureEntry::FeatureParam kNtpMostRelevantTabResumptionModuleTabData[] =;
const FeatureEntry::FeatureParam
    kNtpMostRelevantTabResumptionModuleRemoteTabData[] =;
const FeatureEntry::FeatureParam
    kNtpMostRelevantTabResumptionModuleVisitData[] =;
// Most relevant tab resumption module data params may be expressed as a comma
// separated value consisting of the integer representations of the
// `FetchOptions::URLType` enumeration, to specify what URL types should be
// provided as options to the Visited URL Ranking Service's APIs.
const FeatureEntry::FeatureVariation
    kNtpMostRelevantTabResumptionModuleVariations[] =;
#endif  // !BUILDFLAG(IS_ANDROID)

#if !BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kPerformanceInterventionStringVersion1[] =;
const FeatureEntry::FeatureParam kPerformanceInterventionStringVersion2[] =;
const FeatureEntry::FeatureParam kPerformanceInterventionStringVersion3[] =;

const FeatureEntry::FeatureVariation
    kPerformanceInterventionStringVariations[] =;
#endif  // !BUILDFLAG(IS_ANDROID)

#if BUILDFLAG(IS_ANDROID)

const FeatureEntry::FeatureParam kContextualSearchSuppressShortViewWith300Dp[] =
    {{"contextual_search_minimum_page_height_dp", "300"}};
const FeatureEntry::FeatureParam kContextualSearchSuppressShortViewWith400Dp[] =
    {{"contextual_search_minimum_page_height_dp", "400"}};
const FeatureEntry::FeatureParam kContextualSearchSuppressShortViewWith500Dp[] =
    {{"contextual_search_minimum_page_height_dp", "500"}};
const FeatureEntry::FeatureParam kContextualSearchSuppressShortViewWith600Dp[] =
    {{"contextual_search_minimum_page_height_dp", "600"}};
const FeatureEntry::FeatureVariation
    kContextualSearchSuppressShortViewVariations[] = {
        {"(300 dp)", kContextualSearchSuppressShortViewWith300Dp,
         std::size(kContextualSearchSuppressShortViewWith300Dp), nullptr},
        {"(400 dp)", kContextualSearchSuppressShortViewWith400Dp,
         std::size(kContextualSearchSuppressShortViewWith400Dp), nullptr},
        {"(500 dp)", kContextualSearchSuppressShortViewWith500Dp,
         std::size(kContextualSearchSuppressShortViewWith500Dp), nullptr},
        {"(600 dp)", kContextualSearchSuppressShortViewWith600Dp,
         std::size(kContextualSearchSuppressShortViewWith600Dp), nullptr},
};

const FeatureEntry::FeatureParam kRichAutocompletionFullUrlThreeMinChar[] = {
    {"rich_autocomplete_full_url", "true"},
    {"rich_autocomplete_minimum_characters", "3"}};
const FeatureEntry::FeatureParam kRichAutocompletionNoFullUrlThreeMinChar[] = {
    {"rich_autocomplete_full_url", "false"},
    {"rich_autocomplete_minimum_characters", "3"}};
const FeatureEntry::FeatureParam kRichAutocompletionFullUrlFourMinChar[] = {
    {"rich_autocomplete_full_url", "true"},
    {"rich_autocomplete_minimum_characters", "4"}};
const FeatureEntry::FeatureParam kRichAutocompletionNoFullUrlFourMinChar[] = {
    {"rich_autocomplete_full_url", "false"},
    {"rich_autocomplete_minimum_characters", "4"}};
const FeatureEntry::FeatureVariation kRichAutocompletionAndroidVariations[] = {
    {"(full url, 3 chars at least)", kRichAutocompletionFullUrlThreeMinChar,
     std::size(kRichAutocompletionFullUrlThreeMinChar), nullptr},
    {"(no full url, 3 chars at least)",
     kRichAutocompletionNoFullUrlThreeMinChar,
     std::size(kRichAutocompletionNoFullUrlThreeMinChar), nullptr},
    {"(full url, 4 chars at least)", kRichAutocompletionFullUrlFourMinChar,
     std::size(kRichAutocompletionFullUrlFourMinChar), nullptr},
    {"(no full url, 4 chars at least)", kRichAutocompletionNoFullUrlFourMinChar,
     std::size(kRichAutocompletionNoFullUrlFourMinChar), nullptr},
};

#endif  // BUILDFLAG(IS_ANDROID)

const FeatureEntry::FeatureParam
    kResamplingScrollEventsPredictionTimeBasedEnabled[] =;
const FeatureEntry::FeatureParam
    kResamplingScrollEventsPredictionFramesBasedEnabled[] =;
const FeatureEntry::FeatureVariation
    kResamplingScrollEventsExperimentalPredictionVariations[] =;

#if BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kStartSurfaceReturnTime_Immediate[] = {
    {"start_surface_return_time_seconds", "0"},
    {"start_surface_return_time_on_tablet_seconds", "0"}};
const FeatureEntry::FeatureParam kStartSurfaceReturnTime_10Seconds[] = {
    {"start_surface_return_time_seconds", "10"},
    {"start_surface_return_time_on_tablet_seconds", "10"}};
const FeatureEntry::FeatureParam kStartSurfaceReturnTime_1Minute[] = {
    {"start_surface_return_time_seconds", "60"},
    {"start_surface_return_time_on_tablet_seconds", "60"}};
const FeatureEntry::FeatureParam kStartSurfaceReturnTime_5Minute[] = {
    {"start_surface_return_time_seconds", "300"},
    {"start_surface_return_time_on_tablet_seconds", "300"}};
const FeatureEntry::FeatureParam kStartSurfaceReturnTime_60Minute[] = {
    {"start_surface_return_time_seconds", "3600"},
    {"start_surface_return_time_on_tablet_seconds", "3600"}};
const FeatureEntry::FeatureVariation kStartSurfaceReturnTimeVariations[] = {
    {"Immediate", kStartSurfaceReturnTime_Immediate,
     std::size(kStartSurfaceReturnTime_Immediate), nullptr},
    {"10 seconds", kStartSurfaceReturnTime_10Seconds,
     std::size(kStartSurfaceReturnTime_10Seconds), nullptr},
    {"1 minute", kStartSurfaceReturnTime_1Minute,
     std::size(kStartSurfaceReturnTime_1Minute), nullptr},
    {"5 minute", kStartSurfaceReturnTime_5Minute,
     std::size(kStartSurfaceReturnTime_5Minute), nullptr},
    {"60 minute", kStartSurfaceReturnTime_60Minute,
     std::size(kStartSurfaceReturnTime_60Minute), nullptr},
};

const FeatureEntry::FeatureParam kMagicStackAndroid_show_all_modules[] = {
    {"show_all_modules", "true"}};

const FeatureEntry::FeatureVariation kMagicStackAndroidVariations[] = {
    {"Show all modules", kMagicStackAndroid_show_all_modules,
     std::size(kMagicStackAndroid_show_all_modules), nullptr},
};

const FeatureEntry::FeatureParam
    kAccountReauthenticationRecentTimeWindow_0Minutes[] = {
        {"account_reauthentication_recent_time_window_minutes", "0"},
};
const FeatureEntry::FeatureParam
    kAccountReauthenticationRecentTimeWindow_1Minutes[] = {
        {"account_reauthentication_recent_time_window_minutes", "1"},
};
const FeatureEntry::FeatureParam
    kAccountReauthenticationRecentTimeWindow_5Minutes[] = {
        {"account_reauthentication_recent_time_window_minutes", "5"},
};
const FeatureEntry::FeatureParam
    kAccountReauthenticationRecentTimeWindow_10Minutes[] = {
        {"account_reauthentication_recent_time_window_minutes", "10"},
};
const FeatureEntry::FeatureVariation
    kAccountReauthenticationRecentTimeWindowVariations[] = {
        {"0 minutes", kAccountReauthenticationRecentTimeWindow_0Minutes,
         std::size(kAccountReauthenticationRecentTimeWindow_0Minutes), nullptr},
        {"1 minutes", kAccountReauthenticationRecentTimeWindow_1Minutes,
         std::size(kAccountReauthenticationRecentTimeWindow_1Minutes), nullptr},
        {"5 minutes", kAccountReauthenticationRecentTimeWindow_5Minutes,
         std::size(kAccountReauthenticationRecentTimeWindow_5Minutes), nullptr},
        {"10 minutes", kAccountReauthenticationRecentTimeWindow_10Minutes,
         std::size(kAccountReauthenticationRecentTimeWindow_10Minutes),
         nullptr},
};
#endif  // BUILDFLAG(IS_ANDROID)
#if BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kLogoPolish_large[] = {
    {"polish_logo_size_large", "true"},
    {"polish_logo_size_medium", "false"}};

const FeatureEntry::FeatureParam kLogoPolish_medium[] = {
    {"polish_logo_size_large", "false"},
    {"polish_logo_size_medium", "true"}};

const FeatureEntry::FeatureParam kLogoPolish_small[] = {
    {"polish_logo_size_large", "false"},
    {"polish_logo_size_medium", "false"}};

const FeatureEntry::FeatureVariation kLogoPolishVariations[] = {
    {"Logo height is large", kLogoPolish_large, std::size(kLogoPolish_large),
     nullptr},
    {"Logo height is medium", kLogoPolish_medium, std::size(kLogoPolish_medium),
     nullptr},
    {"Logo height is small", kLogoPolish_small, std::size(kLogoPolish_small),
     nullptr},
};

const FeatureEntry::FeatureParam kFeedPositionAndroid_pull_up_feed[] = {
    {"pull_up_feed", "true"}};

const FeatureEntry::FeatureParam
    kFeedPositionAndroid_push_down_feed_target_feed_active[] = {
        {"feed_active_targeting", "active"}};

const FeatureEntry::FeatureParam
    kFeedPositionAndroid_push_down_feed_target_non_feed_active[] = {
        {"feed_active_targeting", "non-active"}};

const FeatureEntry::FeatureParam
    kFeedPositionAndroid_pull_up_feed_target_feed_active[] = {
        {"pull_up_feed", "true"},
        {"feed_active_targeting", "active"}};

const FeatureEntry::FeatureParam
    kFeedPositionAndroid_pull_up_feed_target_non_feed_active[] = {
        {"pull_up_feed", "true"},
        {"feed_active_targeting", "non-active"}};

const FeatureEntry::FeatureVariation kFeedPositionAndroidVariations[] = {
    {"Pull up Feed", kFeedPositionAndroid_pull_up_feed,
     std::size(kFeedPositionAndroid_pull_up_feed), nullptr},
    {"Push down Feed with targeting Feed active users",
     kFeedPositionAndroid_push_down_feed_target_feed_active,
     std::size(kFeedPositionAndroid_push_down_feed_target_feed_active),
     nullptr},
    {"Push down Feed with targeting non-Feed active users",
     kFeedPositionAndroid_push_down_feed_target_non_feed_active,
     std::size(kFeedPositionAndroid_push_down_feed_target_non_feed_active),
     nullptr},
    {"Pull up Feed with targeting Feed active users",
     kFeedPositionAndroid_pull_up_feed_target_feed_active,
     std::size(kFeedPositionAndroid_pull_up_feed_target_feed_active), nullptr},
    {"Pull up Feed with targeting non-Feed active users",
     kFeedPositionAndroid_pull_up_feed_target_non_feed_active,
     std::size(kFeedPositionAndroid_pull_up_feed_target_non_feed_active),
     nullptr},
};

const FeatureEntry::FeatureParam kSearchResumption_use_new_service[] = {
    {"use_new_service", "true"}};
const FeatureEntry::FeatureVariation
    kSearchResumptionModuleAndroidVariations[] = {
        {"Use New Service", kSearchResumption_use_new_service,
         std::size(kSearchResumption_use_new_service), nullptr},
};

const FeatureEntry::FeatureParam kTabResumptionModule_defaul_app_filter[] = {
    {"show_see_more", "true"},
    {"use_default_app_filter", "true"},
};
const FeatureEntry::FeatureParam kTabResumptionModule_salient_image[] = {
    {"show_see_more", "true"},
    {"use_default_app_filter", "true"},
    {"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam
    kTabResumptionModule_single_tile_with_salient_image[] = {
        {"max_tiles_number", "1"},
        {"show_see_more", "true"},
        {"use_default_app_filter", "true"},
        {"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam
    kTabResumptionModule_single_tile_with_salient_image_show_default_reason[] =
        {
            {"max_tiles_number", "1"},     {"show_default_reason", "true"},
            {"show_see_more", "true"},     {"use_default_app_filter", "true"},
            {"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam
    kTabResumptionModule_combine_tabs_with_salient_image[] = {
        {"show_see_more", "true"},
        {"show_tabs_in_one_module", "true"},
        {"use_default_app_filter", "true"},
        {"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam
    kTabResumptionModule_combine_tabs_with_salient_image_single_tab_show_default_reason
        [] = {
            {"max_tiles_number", "1"},
            {"show_default_reason", "true"},
            {"show_see_more", "true"},
            {"show_tabs_in_one_module", "true"},
            {"use_default_app_filter", "true"},
            {"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam kTabResumptionModule_enable_v2_arm1[] = {
    {"disable_blend", "true"},          {"enable_v2", "true"},
    {"show_see_more", "true"},          {"show_tabs_in_one_module", "true"},
    {"use_default_app_filter", "true"},
};
const FeatureEntry::FeatureParam kTabResumptionModule_enable_v2_arm2[] = {
    {"enable_v2", "true"},
    {"show_see_more", "true"},
    {"show_tabs_in_one_module", "true"},
    {"use_default_app_filter", "true"},
    {"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam kTabResumptionModule_enable_v2_arm3[] = {
    {"disable_blend", "true"},           {"enable_v2", "true"},
    {"max_tiles_number", "1"},           {"show_see_more", "true"},
    {"show_tabs_in_one_module", "true"}, {"use_default_app_filter", "true"},
    {"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam
    kTabResumptionModule_enable_v2_arm3_show_default_reason[] = {
        {"disable_blend", "true"},          {"enable_v2", "true"},
        {"max_tiles_number", "1"},          {"show_default_reason", "true"},
        {"show_see_more", "true"},          {"show_tabs_in_one_module", "true"},
        {"use_default_app_filter", "true"}, {"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam kTabResumptionModule_enable_v2_arm4[] = {
    {"disable_blend", "true"},          {"enable_v2", "true"},
    {"show_see_more", "true"},          {"show_tabs_in_one_module", "true"},
    {"use_default_app_filter", "true"}, {"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam kTabResumptionModule_enable_v2_ml[] = {
    {"enable_v2", "true"},
    {"fetch_history_backend", "true"},
    {"fetch_local_tabs_backend", "true"},
    {"show_see_more", "true"},
    {"show_tabs_in_one_module", "true"},
    {"use_default_app_filter", "true"},
    {"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam
    kTabResumptionModule_enable_v2_ml_show_default_reason[] = {
        {"enable_v2", "true"},
        {"fetch_history_backend", "true"},
        {"fetch_local_tabs_backend", "true"},
        {"max_tiles_number", "1"},
        {"show_default_reason", "true"},
        {"show_see_more", "true"},
        {"show_tabs_in_one_module", "true"},
        {"use_default_app_filter", "true"},
        {"use_salient_image", "true"},
};
const FeatureEntry::FeatureVariation kTabResumptionModuleAndroidVariations[] = {
    {"Default app filter", kTabResumptionModule_defaul_app_filter,
     std::size(kTabResumptionModule_defaul_app_filter), nullptr},
    {"Default app filter + Salient image", kTabResumptionModule_salient_image,
     std::size(kTabResumptionModule_salient_image), nullptr},
    {"Default app filter + Salient image + single tile",
     kTabResumptionModule_single_tile_with_salient_image,
     std::size(kTabResumptionModule_single_tile_with_salient_image), nullptr},
    {"Default app filter + Salient image + one Tab module",
     kTabResumptionModule_combine_tabs_with_salient_image,
     std::size(kTabResumptionModule_combine_tabs_with_salient_image), nullptr},
    {"V2 Arm1", kTabResumptionModule_enable_v2_arm1,
     std::size(kTabResumptionModule_enable_v2_arm1), nullptr},
    {"V2 Arm2", kTabResumptionModule_enable_v2_arm2,
     std::size(kTabResumptionModule_enable_v2_arm2), nullptr},
    {"V2 Arm3", kTabResumptionModule_enable_v2_arm3,
     std::size(kTabResumptionModule_enable_v2_arm3), nullptr},
    {"V2 Arm4", kTabResumptionModule_enable_v2_arm4,
     std::size(kTabResumptionModule_enable_v2_arm4), nullptr},
    {"V2 ML (collect data)", kTabResumptionModule_enable_v2_ml,
     std::size(kTabResumptionModule_enable_v2_ml), nullptr},
    {"Default app filter + Salient image + single tile + default reason",
     kTabResumptionModule_single_tile_with_salient_image_show_default_reason,
     std::size(
         kTabResumptionModule_single_tile_with_salient_image_show_default_reason),
     nullptr},
    {"Default app filter + one Tab module + single tab + default reason",
     kTabResumptionModule_combine_tabs_with_salient_image_single_tab_show_default_reason,
     std::size(
         kTabResumptionModule_combine_tabs_with_salient_image_single_tab_show_default_reason),
     nullptr},
    {"V2 Arm3 with default reason",
     kTabResumptionModule_enable_v2_arm3_show_default_reason,
     std::size(kTabResumptionModule_enable_v2_arm3_show_default_reason),
     nullptr},
    {"V2 ML with default reason",
     kTabResumptionModule_enable_v2_ml_show_default_reason,
     std::size(kTabResumptionModule_enable_v2_ml_show_default_reason), nullptr},
};

const FeatureEntry::FeatureParam
    kMostVitedTilesReselect_enable_partial_match_arm1[] = {
        {"lax_scheme_host", "true"},
        {"lax_ref", "true"},
        {"lax_query", "false"},
        {"lax_path", "false"},
};
const FeatureEntry::FeatureParam
    kMostVitedTilesReselect_enable_partial_match_arm2[] = {
        {"lax_scheme_host", "true"},
        {"lax_ref", "true"},
        {"lax_query", "true"},
        {"lax_path", "false"},
};
const FeatureEntry::FeatureParam
    kMostVitedTilesReselect_enable_partial_match_arm3[] = {
        {"lax_scheme_host", "true"},
        {"lax_ref", "true"},
        {"lax_query", "true"},
        {"lax_path", "true"},
};
const FeatureEntry::FeatureVariation kMostVisitedTilesReselectVariations[] = {
    {"Partial match Arm 1", kMostVitedTilesReselect_enable_partial_match_arm1,
     std::size(kMostVitedTilesReselect_enable_partial_match_arm1), nullptr},
    {"Partial match Arm 2", kMostVitedTilesReselect_enable_partial_match_arm2,
     std::size(kMostVitedTilesReselect_enable_partial_match_arm2), nullptr},
    {"Partial match Arm 3", kMostVitedTilesReselect_enable_partial_match_arm3,
     std::size(kMostVitedTilesReselect_enable_partial_match_arm3), nullptr},
};

const FeatureEntry::FeatureParam
    kNotificationPermissionRationale_show_dialog_next_start[] = {
        {"always_show_rationale_before_requesting_permission", "true"},
        {"permission_request_interval_days", "0"},
};

const FeatureEntry::FeatureVariation
    kNotificationPermissionRationaleVariations[] = {
        {"- Show rationale UI on next startup",
         kNotificationPermissionRationale_show_dialog_next_start,
         std::size(kNotificationPermissionRationale_show_dialog_next_start),
         nullptr},
};

const FeatureEntry::FeatureParam kWebFeedAwareness_new_animation[] = {
    {"awareness_style", "new_animation"}};
const FeatureEntry::FeatureParam kWebFeedAwareness_new_animation_no_limit[] = {
    {"awareness_style", "new_animation_no_limit"}};

const FeatureEntry::FeatureParam kWebFeedAwareness_IPH[] = {
    {"awareness_style", "IPH"}};

const FeatureEntry::FeatureVariation kWebFeedAwarenessVariations[] = {
    {"new animation", kWebFeedAwareness_new_animation,
     std::size(kWebFeedAwareness_new_animation), nullptr},
    {"new animation rate limit off", kWebFeedAwareness_new_animation_no_limit,
     std::size(kWebFeedAwareness_new_animation_no_limit), nullptr},
    {"IPH and dot", kWebFeedAwareness_IPH, std::size(kWebFeedAwareness_IPH),
     nullptr},
};

const FeatureEntry::FeatureParam kFeedCloseRefresh_Open[] = {
    {"require_interaction", "false"}};

const FeatureEntry::FeatureParam kFeedCloseRefresh_Interact[] = {
    {"require_interaction", "true"}};

const FeatureEntry::FeatureVariation kFeedCloseRefreshVariations[] = {
    {"Open", kFeedCloseRefresh_Open, std::size(kFeedCloseRefresh_Open),
     nullptr},
    {"Interact", kFeedCloseRefresh_Interact,
     std::size(kFeedCloseRefresh_Interact), nullptr},
};

#endif  // BUILDFLAG(IS_ANDROID)

const FeatureEntry::Choice kNotificationSchedulerChoices[] =;

#if BUILDFLAG(IS_ANDROID)

const FeatureEntry::FeatureParam kPhotoPickerAdoptionStudyActionGetContent[] = {
    {"use_action_get_content", "true"}};
const FeatureEntry::FeatureParam kPhotoPickerAdoptionStudyActionPickImages[] = {
    {"use_action_pick_images", "true"}};
const FeatureEntry::FeatureParam
    kPhotoPickerAdoptionStudyActionPickImagesPlus[] = {
        {"use_action_pick_images_plus", "true"}};
const FeatureEntry::FeatureParam
    kPhotoPickerAdoptionStudyChromePickerWithoutBrowse[] = {
        {"chrome_picker_suppress_browse", "true"}};

const FeatureEntry::FeatureVariation
    kPhotoPickerAdoptionStudyFeatureVariations[] = {
        {"(Android Picker w/ACTION_GET_CONTENT)",
         kPhotoPickerAdoptionStudyActionGetContent,
         std::size(kPhotoPickerAdoptionStudyActionGetContent), nullptr},
        {"(Android Picker w/ACTION_PICK_IMAGES)",
         kPhotoPickerAdoptionStudyActionPickImages,
         std::size(kPhotoPickerAdoptionStudyActionPickImages), nullptr},
        {"(Android Picker w/ACTION_PICK_IMAGES Plus)",
         kPhotoPickerAdoptionStudyActionPickImagesPlus,
         std::size(kPhotoPickerAdoptionStudyActionPickImagesPlus), nullptr},
        {"(Chrome Picker without Browse)",
         kPhotoPickerAdoptionStudyChromePickerWithoutBrowse,
         std::size(kPhotoPickerAdoptionStudyChromePickerWithoutBrowse),
         nullptr}};

const FeatureEntry::FeatureParam kAuxiliarySearchDonation_MaxDonation_20[] = {
    {chrome::android::kAuxiliarySearchMaxBookmarksCountParam.name, "20"},
    {chrome::android::kAuxiliarySearchMaxTabsCountParam.name, "20"}};
const FeatureEntry::FeatureParam kAuxiliarySearchDonation_MaxDonation_100[] = {
    {chrome::android::kAuxiliarySearchMaxBookmarksCountParam.name, "100"},
    {chrome::android::kAuxiliarySearchMaxTabsCountParam.name, "100"}};
const FeatureEntry::FeatureParam kAuxiliarySearchDonation_MaxDonation_200[] = {
    {chrome::android::kAuxiliarySearchMaxBookmarksCountParam.name, "200"},
    {chrome::android::kAuxiliarySearchMaxTabsCountParam.name, "200"}};
const FeatureEntry::FeatureParam kAuxiliarySearchDonation_MaxDonation_500[] = {
    {chrome::android::kAuxiliarySearchMaxBookmarksCountParam.name, "500"},
    {chrome::android::kAuxiliarySearchMaxTabsCountParam.name, "500"}};
const FeatureEntry::FeatureVariation kAuxiliarySearchDonationVariations[] = {
    {"50 counts", kAuxiliarySearchDonation_MaxDonation_20,
     std::size(kAuxiliarySearchDonation_MaxDonation_20), nullptr},
    {"100 counts", kAuxiliarySearchDonation_MaxDonation_100,
     std::size(kAuxiliarySearchDonation_MaxDonation_100), nullptr},
    {"200 counts", kAuxiliarySearchDonation_MaxDonation_200,
     std::size(kAuxiliarySearchDonation_MaxDonation_200), nullptr},
    {"500 counts", kAuxiliarySearchDonation_MaxDonation_500,
     std::size(kAuxiliarySearchDonation_MaxDonation_500), nullptr},
};

const FeatureEntry::FeatureParam kBoardingPassDetectorUrl_AA[] = {
    {features::kBoardingPassDetectorUrlParamName,
     "https://www.aa.com/checkin/viewMobileBoardingPass"}};
const FeatureEntry::FeatureParam kBoardingPassDetectorUrl_All[] = {
    {features::kBoardingPassDetectorUrlParamName,
     "https://www.aa.com/checkin/viewMobileBoardingPass,https://united.com"}};
const FeatureEntry::FeatureParam kBoardingPassDetectorUrl_Test[] = {
    {features::kBoardingPassDetectorUrlParamName, "http"}};
const FeatureEntry::FeatureVariation kBoardingPassDetectorVariations[] = {
    {"AA", kBoardingPassDetectorUrl_AA, std::size(kBoardingPassDetectorUrl_AA),
     nullptr},
    {"All", kBoardingPassDetectorUrl_All,
     std::size(kBoardingPassDetectorUrl_All), nullptr},
    {"Test", kBoardingPassDetectorUrl_Test,
     std::size(kBoardingPassDetectorUrl_Test), nullptr},
};
#endif  // BUILDFLAG(IS_ANDROID)

// TODO(crbug.com/991082,1015377): Remove after proper support for back/forward
// cache is implemented.
const FeatureEntry::FeatureParam kBackForwardCache_ForceCaching[] =;

const FeatureEntry::FeatureVariation kBackForwardCacheVariations[] =;

const FeatureEntry::FeatureParam kRenderDocument_Subframe[] =;
const FeatureEntry::FeatureParam kRenderDocument_AllFrames[] =;

const FeatureEntry::FeatureVariation kRenderDocumentVariations[] =;

#if BUILDFLAG(IS_ANDROID)
const FeatureEntry::Choice kWebOtpBackendChoices[] = {
    {flags_ui::kGenericExperimentChoiceDefault, "", ""},
    {flag_descriptions::kWebOtpBackendSmsVerification, switches::kWebOtpBackend,
     switches::kWebOtpBackendSmsVerification},
    {flag_descriptions::kWebOtpBackendUserConsent, switches::kWebOtpBackend,
     switches::kWebOtpBackendUserConsent},
    {flag_descriptions::kWebOtpBackendAuto, switches::kWebOtpBackend,
     switches::kWebOtpBackendAuto},
};
#endif  // BUILDFLAG(IS_ANDROID)

// The choices for --enable-download-warning-improvements. This really should
// just be a SINGLE_VALUE_TYPE, but it is misleading to have the choices be
// labeled "Disabled"/"Enabled". So instead this is made to be a
// MULTI_VALUE_TYPE with choices "Default"/"Enabled".
const FeatureEntry::Choice kDownloadWarningImprovementsChoices[] =;

// The choices for --enable-experimental-cookie-features. This really should
// just be a SINGLE_VALUE_TYPE, but it is misleading to have the choices be
// labeled "Disabled"/"Enabled". So instead this is made to be a
// MULTI_VALUE_TYPE with choices "Default"/"Enabled".
const FeatureEntry::Choice kEnableExperimentalCookieFeaturesChoices[] =;

const FeatureEntry::FeatureParam kDrawPredictedPointExperiment1Point12Ms[] =;
const FeatureEntry::FeatureParam kDrawPredictedPointExperiment2Points6Ms[] =;
const FeatureEntry::FeatureParam kDrawPredictedPointExperiment1Point6Ms[] =;
const FeatureEntry::FeatureParam kDrawPredictedPointExperiment2Points3Ms[] =;

const FeatureEntry::FeatureVariation kDrawPredictedPointVariations[] =;

#if BUILDFLAG(IS_CHROMEOS_ASH)
const FeatureEntry::Choice kForceControlFaceAeChoices[] = {
    {"Default", "", ""},
    {"Enable", media::switches::kForceControlFaceAe, "enable"},
    {"Disable", media::switches::kForceControlFaceAe, "disable"}};

const FeatureEntry::Choice kAutoFramingOverrideChoices[] = {
    {"Default", "", ""},
    {"Force enabled", media::switches::kAutoFramingOverride,
     media::switches::kAutoFramingForceEnabled},
    {"Force disabled", media::switches::kAutoFramingOverride,
     media::switches::kAutoFramingForceDisabled}};

const FeatureEntry::Choice kCameraSuperResOverrideChoices[] = {
    {"Default", "", ""},
    {"Enabled", media::switches::kCameraSuperResOverride,
     media::switches::kCameraSuperResForceEnabled},
    {"Disabled", media::switches::kCameraSuperResOverride,
     media::switches::kCameraSuperResForceDisabled}};

const FeatureEntry::Choice kFaceRetouchOverrideChoices[] = {
    {"Default", "", ""},
    {"Enabled with relighting", media::switches::kFaceRetouchOverride,
     media::switches::kFaceRetouchForceEnabledWithRelighting},
    {"Enabled without relighting", media::switches::kFaceRetouchOverride,
     media::switches::kFaceRetouchForceEnabledWithoutRelighting},
    {"Disabled", media::switches::kFaceRetouchOverride,
     media::switches::kFaceRetouchForceDisabled}};

#endif  // BUILDFLAG(IS_CHROMEOS_ASH)

#if BUILDFLAG(IS_CHROMEOS_ASH)
const FeatureEntry::Choice kCrostiniContainerChoices[] = {
    {"Default", "", ""},
    {"Buster", crostini::kCrostiniContainerFlag, "buster"},
    {"Bullseye", crostini::kCrostiniContainerFlag, "bullseye"},
    {"Bookworm", crostini::kCrostiniContainerFlag, "bookworm"},
};
#endif  // BUILDFLAG(IS_CHROMEOS_ASH)

#if !BUILDFLAG(IS_ANDROID)
// SCT Auditing feature variations.
const FeatureEntry::FeatureParam kSCTAuditingSamplingRateNone[] =;
const FeatureEntry::FeatureParam kSCTAuditingSamplingRateAlternativeOne[] =;
const FeatureEntry::FeatureParam kSCTAuditingSamplingRateAlternativeTwo[] =;

const FeatureEntry::FeatureVariation kSCTAuditingVariations[] =;
#endif  // !BUILDFLAG(IS_ANDROID)

#if BUILDFLAG(IS_CHROMEOS_ASH)
const FeatureEntry::FeatureParam kProductivityLauncher_WithoutContinue[] = {
    {"enable_continue", "false"}};

const FeatureEntry::FeatureVariation kProductivityLauncherVariations[] = {
    {"without Continue", kProductivityLauncher_WithoutContinue,
     std::size(kProductivityLauncher_WithoutContinue), nullptr}};

const FeatureEntry::FeatureParam kLauncherItemSuggest_LongDelay10Mins[] = {
    {"long_delay_minutes", "10"}};
const FeatureEntry::FeatureParam kLauncherItemSuggest_LongDelay12Hours[] = {
    {"long_delay_minutes", "720"}};
const FeatureEntry::FeatureParam kLauncherItemSuggest_LongDelay24Hours[] = {
    {"long_delay_minutes", "1440"}};
const FeatureEntry::FeatureParam kLauncherItemSuggest_LongDelay36Hours[] = {
    {"long_delay_minutes", "2160"}};
const FeatureEntry::FeatureParam kLauncherItemSuggest_LongDelay48Hours[] = {
    {"long_delay_minutes", "2880"}};
const FeatureEntry::FeatureParam kLauncherItemSuggest_LongDelay60Hours[] = {
    {"long_delay_minutes", "3600"}};
const FeatureEntry::FeatureParam kLauncherItemSuggest_LongDelay72Hours[] = {
    {"long_delay_minutes", "4320"}};

const FeatureEntry::FeatureVariation kLauncherItemSuggestVariations[] = {
    {"with 10 minute long delay", kLauncherItemSuggest_LongDelay10Mins,
     std::size(kLauncherItemSuggest_LongDelay10Mins), nullptr},
    {"with 12 hour long delay", kLauncherItemSuggest_LongDelay12Hours,
     std::size(kLauncherItemSuggest_LongDelay12Hours), nullptr},
    {"with 24 hour long delay", kLauncherItemSuggest_LongDelay24Hours,
     std::size(kLauncherItemSuggest_LongDelay24Hours), nullptr},
    {"with 36 hour long delay", kLauncherItemSuggest_LongDelay36Hours,
     std::size(kLauncherItemSuggest_LongDelay36Hours), nullptr},
    {"with 48 hour long delay", kLauncherItemSuggest_LongDelay48Hours,
     std::size(kLauncherItemSuggest_LongDelay48Hours), nullptr},
    {"with 60 hour long delay", kLauncherItemSuggest_LongDelay60Hours,
     std::size(kLauncherItemSuggest_LongDelay60Hours), nullptr},
    {"with 72 hour long delay", kLauncherItemSuggest_LongDelay72Hours,
     std::size(kLauncherItemSuggest_LongDelay72Hours), nullptr}};

const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_10[] = {
    {"confidence_threshold", "10"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_20[] = {
    {"confidence_threshold", "20"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_30[] = {
    {"confidence_threshold", "30"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_40[] = {
    {"confidence_threshold", "40"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_50[] = {
    {"confidence_threshold", "50"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_60[] = {
    {"confidence_threshold", "60"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_70[] = {
    {"confidence_threshold", "70"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_80[] = {
    {"confidence_threshold", "80"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_90[] = {
    {"confidence_threshold", "90"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_100[] = {
    {"confidence_threshold", "100"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_110[] = {
    {"confidence_threshold", "110"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_120[] = {
    {"confidence_threshold", "120"}};

const FeatureEntry::FeatureVariation
    kLauncherLocalImageSearchConfidenceVariations[] = {
        {"threshold 10", kLauncherLocalImageSearchConfidence_10,
         std::size(kLauncherLocalImageSearchConfidence_10), nullptr},
        {"threshold 20", kLauncherLocalImageSearchConfidence_20,
         std::size(kLauncherLocalImageSearchConfidence_20), nullptr},
        {"threshold 30", kLauncherLocalImageSearchConfidence_30,
         std::size(kLauncherLocalImageSearchConfidence_30), nullptr},
        {"threshold 40", kLauncherLocalImageSearchConfidence_40,
         std::size(kLauncherLocalImageSearchConfidence_40), nullptr},
        {"threshold 50", kLauncherLocalImageSearchConfidence_50,
         std::size(kLauncherLocalImageSearchConfidence_50), nullptr},
        {"threshold 60", kLauncherLocalImageSearchConfidence_60,
         std::size(kLauncherLocalImageSearchConfidence_60), nullptr},
        {"threshold 70", kLauncherLocalImageSearchConfidence_70,
         std::size(kLauncherLocalImageSearchConfidence_70), nullptr},
        {"threshold 80", kLauncherLocalImageSearchConfidence_80,
         std::size(kLauncherLocalImageSearchConfidence_80), nullptr},
        {"threshold 90", kLauncherLocalImageSearchConfidence_90,
         std::size(kLauncherLocalImageSearchConfidence_90), nullptr},
        {"threshold 100", kLauncherLocalImageSearchConfidence_100,
         std::size(kLauncherLocalImageSearchConfidence_100), nullptr},
        {"threshold 110", kLauncherLocalImageSearchConfidence_110,
         std::size(kLauncherLocalImageSearchConfidence_110), nullptr},
        {"threshold 120", kLauncherLocalImageSearchConfidence_120,
         std::size(kLauncherLocalImageSearchConfidence_120), nullptr}};

const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_10[] = {
    {"relevance_threshold", "0.1"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_20[] = {
    {"relevance_threshold", "0.2"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_30[] = {
    {"relevance_threshold", "0.3"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_40[] = {
    {"relevance_threshold", "0.4"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_50[] = {
    {"relevance_threshold", "0.5"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_60[] = {
    {"relevance_threshold", "0.6"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_70[] = {
    {"relevance_threshold", "0.7"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_80[] = {
    {"relevance_threshold", "0.8"}};
const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_90[] = {
    {"relevance_threshold", "0.9"}};

const FeatureEntry::FeatureVariation
    kLauncherLocalImageSearchRelevanceVariations[] = {
        {"threshold 0.1", kLauncherLocalImageSearchRelevance_10,
         std::size(kLauncherLocalImageSearchRelevance_10), nullptr},
        {"threshold 0.2", kLauncherLocalImageSearchRelevance_20,
         std::size(kLauncherLocalImageSearchRelevance_20), nullptr},
        {"threshold 0.3", kLauncherLocalImageSearchRelevance_30,
         std::size(kLauncherLocalImageSearchRelevance_30), nullptr},
        {"threshold 0.4", kLauncherLocalImageSearchRelevance_40,
         std::size(kLauncherLocalImageSearchRelevance_40), nullptr},
        {"threshold 0.5", kLauncherLocalImageSearchRelevance_50,
         std::size(kLauncherLocalImageSearchRelevance_50), nullptr},
        {"threshold 0.6", kLauncherLocalImageSearchRelevance_60,
         std::size(kLauncherLocalImageSearchRelevance_60), nullptr},
        {"threshold 0.7", kLauncherLocalImageSearchRelevance_70,
         std::size(kLauncherLocalImageSearchRelevance_70), nullptr},
        {"threshold 0.8", kLauncherLocalImageSearchRelevance_80,
         std::size(kLauncherLocalImageSearchRelevance_80), nullptr},
        {"threshold 0.9", kLauncherLocalImageSearchRelevance_90,
         std::size(kLauncherLocalImageSearchRelevance_90), nullptr}};

const FeatureEntry::FeatureParam kEolIncentiveOffer[] = {
    {"incentive_type", "offer"}};
const FeatureEntry::FeatureParam kEolIncentiveNoOffer[] = {
    {"incentive_type", "no_offer"}};

const FeatureEntry::FeatureVariation kEolIncentiveVariations[] = {
    {"with offer", kEolIncentiveOffer, std::size(kEolIncentiveOffer), nullptr},
    {"with no offer", kEolIncentiveNoOffer, std::size(kEolIncentiveNoOffer),
     nullptr}};

const FeatureEntry::FeatureParam kCampbell9dot[] = {{"icon", "9dot"}};
const FeatureEntry::FeatureParam kCampbellHero[] = {{"icon", "hero"}};
const FeatureEntry::FeatureParam kCampbellAction[] = {{"icon", "action"}};
const FeatureEntry::FeatureParam kCampbellText[] = {{"icon", "text"}};

const FeatureEntry::FeatureVariation kCampbellGlyphVariations[] = {
    {"9dot", kCampbell9dot, std::size(kCampbell9dot), nullptr},
    {"hero", kCampbellHero, std::size(kCampbellHero), nullptr},
    {"action", kCampbellAction, std::size(kCampbellAction), nullptr},
    {"text", kCampbellText, std::size(kCampbellText), nullptr}};

const FeatureEntry::FeatureParam kCaptureModeEducationShortcutNudge[] = {
    {"CaptureModeEducationParam", "ShortcutNudge"}};
const FeatureEntry::FeatureParam kCaptureModeEducationShortcutTutorial[] = {
    {"CaptureModeEducationParam", "ShortcutTutorial"}};
const FeatureEntry::FeatureParam kCaptureModeEducationQuickSettingsNudge[] = {
    {"CaptureModeEducationParam", "QuickSettingsNudge"}};

const FeatureEntry::FeatureVariation kCaptureModeEducationVariations[] = {
    {"Shortcut Nudge", kCaptureModeEducationShortcutNudge,
     std::size(kCaptureModeEducationShortcutNudge), nullptr},
    {"Shortcut Tutorial", kCaptureModeEducationShortcutTutorial,
     std::size(kCaptureModeEducationShortcutTutorial), nullptr},
    {"Quick Settings Nudge", kCaptureModeEducationQuickSettingsNudge,
     std::size(kCaptureModeEducationQuickSettingsNudge), nullptr}};

const FeatureEntry::FeatureParam
    kSystemShortcutBehaviorIgnoreCommonVdiShortcuts[] = {
        {"behavior_type", "ignore_common_vdi_shortcuts"}};
const FeatureEntry::FeatureParam
    kSystemShortcutBehaviorIgnoreCommonVdiShortcutsFullscreenOnly[] = {
        {"behavior_type", "ignore_common_vdi_shortcut_fullscreen_only"}};
const FeatureEntry::FeatureParam
    kSystemShortcutBehaviorAllowSearchBasedPassthrough[] = {
        {"behavior_type", "allow_search_based_passthrough"}};
const FeatureEntry::FeatureParam
    kSystemShortcutBehaviorAllowSearchBasedPassthroughFullscreenOnly[] = {
        {"behavior_type", "allow_search_based_passthrough_fullscreen_only"}};

const FeatureEntry::FeatureVariation kSystemShortcutBehaviorVariations[] = {
    {"Ignore Common VDI Shortcuts",
     kSystemShortcutBehaviorIgnoreCommonVdiShortcuts,
     std::size(kSystemShortcutBehaviorIgnoreCommonVdiShortcuts), nullptr},
    {"Ignore Common VDI Shortcuts while Fullscreen",
     kSystemShortcutBehaviorIgnoreCommonVdiShortcutsFullscreenOnly,
     std::size(kSystemShortcutBehaviorIgnoreCommonVdiShortcutsFullscreenOnly),
     nullptr},
    {"Allow Search Based Passthrough",
     kSystemShortcutBehaviorAllowSearchBasedPassthrough,
     std::size(kSystemShortcutBehaviorAllowSearchBasedPassthrough), nullptr},
    {"Allow Search Based Passthrough while Fullscreen",
     kSystemShortcutBehaviorAllowSearchBasedPassthroughFullscreenOnly,
     std::size(
         kSystemShortcutBehaviorAllowSearchBasedPassthroughFullscreenOnly),
     nullptr},
};

#endif  // BUILDFLAG(IS_CHROMEOS_ASH)

#if BUILDFLAG(IS_CHROMEOS)
constexpr char kTaskManagerEndProcessDisabledForExtensionInternalName[] =
    "enable-task-manager-end-process-disabled-for-extension";
#endif  // BUILDFLAG(IS_CHROMEOS)

#if BUILDFLAG(IS_CHROMEOS_ASH)
constexpr char kWallpaperFastRefreshInternalName[] = "wallpaper-fast-refresh";
constexpr char kWallpaperGooglePhotosSharedAlbumsInternalName[] =
    "wallpaper-google-photos-shared-albums";
constexpr char kWallpaperPerDeskName[] = "per-desk-wallpaper";
constexpr char kGlanceablesTimeManagementClassroomStudentViewInternalName[] =
    "glanceables-time-management-classroom-student-view";
constexpr char kGlanceablesTimeManagementTasksViewInternalName[] =
    "glanceables-time-management-tasks-view";
constexpr char kBackgroundListeningName[] = "background-listening";
constexpr char kAppInstallServiceUriBorealisName[] =
    "app-install-service-uri-borealis";
constexpr char kBorealisBigGlInternalName[] = "borealis-big-gl";
constexpr char kBorealisDGPUInternalName[] = "borealis-dgpu";
constexpr char kBorealisEnableUnsupportedHardwareInternalName[] =
    "borealis-enable-unsupported-hardware";
constexpr char kBorealisForceBetaClientInternalName[] =
    "borealis-force-beta-client";
constexpr char kBorealisForceDoubleScaleInternalName[] =
    "borealis-force-double-scale";
constexpr char kBorealisLinuxModeInternalName[] = "borealis-linux-mode";
// This differs slightly from its symbol's name since "enabled" is used
// internally to refer to whether borealis is installed or not.
constexpr char kBorealisPermittedInternalName[] = "borealis-enabled";
constexpr char kBorealisProvisionInternalName[] = "borealis-provision";
constexpr char kBorealisScaleClientByDPIInternalName[] =
    "borealis-scale-client-by-dpi";
constexpr char kBorealisZinkGlDriverInternalName[] = "borealis-zink-gl-driver";
constexpr char kClipboardHistoryLongpressInternalName[] =
    "clipboard-history-longpress";
constexpr char kClipboardHistoryRefreshInternalName[] =
    "clipboard-history-refresh";
constexpr char kClipboardHistoryUrlTitlesInternalName[] =
    "clipboard-history-url-titles";
constexpr char kBluetoothUseFlossInternalName[] = "bluetooth-use-floss";
constexpr char kBluetoothUseLLPrivacyInternalName[] = "bluetooth-use-llprivacy";
constexpr char kSeaPenInternalName[] = "sea-pen";
constexpr char kAssistantIphInternalName[] = "assistant-iph";
constexpr char kGrowthCampaigns[] = "growth-campaigns";
constexpr char kGrowthCampaignsTestTag[] = "campaigns-test-tag";
constexpr char kVcTrayMicIndicatorInternalName[] = "vc-tray-mic-indicator";
constexpr char kVcTrayTitleHeaderInternalName[] = "vc-tray-title-header";
#endif  // BUILDFLAG(IS_CHROMEOS_ASH)

#if !BUILDFLAG(IS_ANDROID) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
constexpr FeatureEntry::FeatureParam kIOSPromoBookmarkBubbleContextual[] = {
    {"activation", "contextual"}};
constexpr FeatureEntry::FeatureParam kIOSPromoBookmarkBubbleAlwaysShow[] = {
    {"activation", "always-show"}};

constexpr FeatureEntry::FeatureVariation kIOSPromoBookmarkBubbleVariations[] = {
    {"contextual activation", kIOSPromoBookmarkBubbleContextual,
     std::size(kIOSPromoBookmarkBubbleContextual), nullptr},
    {"always show activation", kIOSPromoBookmarkBubbleAlwaysShow,
     std::size(kIOSPromoBookmarkBubbleAlwaysShow), nullptr}};
#endif  // !BUILDFLAG(IS_ANDROID) && BUILDFLAG(GOOGLE_CHROME_BRANDING)

#if BUILDFLAG(ENABLE_LENS_DESKTOP_GOOGLE_BRANDED_FEATURES)
constexpr FeatureEntry::FeatureParam kCscStagingEnvVariation[] = {
    {"companion-homepage-url",
     "https://lens-staging.corp.google.com/companion"},
    {"companion-image-upload-url",
     "https://lens-staging.corp.google.com/v2/upload"}};
constexpr FeatureEntry::FeatureParam kCscClobberVariation[] = {
    {"open-links-in-current-tab", "true"},
};
constexpr FeatureEntry::FeatureParam kCscNewTabVariation[] = {
    {"open-links-in-current-tab", "false"},
};

constexpr FeatureEntry::FeatureVariation kSidePanelCompanionVariations[] = {
    {"with staging URL", kCscStagingEnvVariation,
     std::size(kCscStagingEnvVariation), nullptr},
    {"with clobber", kCscClobberVariation, std::size(kCscClobberVariation),
     nullptr},
    {"with new tab", kCscNewTabVariation, std::size(kCscNewTabVariation),
     nullptr},
};

const FeatureEntry::Choice kForceCompanionPinnedStateChoices[] = {
    {flags_ui::kGenericExperimentChoiceDefault, "", ""},
    {"Forced Pinned", companion::switches::kForceCompanionPinnedState,
     "pinned"},
    {"Forced Unpinned", companion::switches::kForceCompanionPinnedState,
     "unpinned"},
};
#endif  // BUILDFLAG(ENABLE_LENS_DESKTOP_GOOGLE_BRANDED_FEATURES)

#if !BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kLensOverlayNoOmniboxEntryPoint[] =;
const FeatureEntry::FeatureParam kLensOverlayResponsiveOmniboxEntryPoint[] =;
const FeatureEntry::FeatureParam kLensOverlayPersistentOmniboxEntryPoint[] =;
const FeatureEntry::FeatureParam kLensOverlaySearchBubble[] =;

const FeatureEntry::FeatureVariation kLensOverlayVariations[] =;
#endif  // !BUILDFLAG(IS_ANDROID)

#if BUILDFLAG(IS_CHROMEOS_ASH)
const FeatureEntry::Choice kAlwaysEnableHdcpChoices[] = {
    {flag_descriptions::kAlwaysEnableHdcpDefault, "", ""},
    {flag_descriptions::kAlwaysEnableHdcpType0,
     ash::switches::kAlwaysEnableHdcp, "type0"},
    {flag_descriptions::kAlwaysEnableHdcpType1,
     ash::switches::kAlwaysEnableHdcp, "type1"},
};

const FeatureEntry::Choice kPrintingPpdChannelChoices[] = {
    {flags_ui::kGenericExperimentChoiceDefault, "", ""},
    {ash::switches::kPrintingPpdChannelProduction,
     ash::switches::kPrintingPpdChannel,
     ash::switches::kPrintingPpdChannelProduction},
    {ash::switches::kPrintingPpdChannelStaging,
     ash::switches::kPrintingPpdChannel,
     ash::switches::kPrintingPpdChannelStaging},
    {ash::switches::kPrintingPpdChannelDev, ash::switches::kPrintingPpdChannel,
     ash::switches::kPrintingPpdChannelDev},
    {ash::switches::kPrintingPpdChannelLocalhost,
     ash::switches::kPrintingPpdChannel,
     ash::switches::kPrintingPpdChannelLocalhost}};
#endif  // BUILDFLAG(IS_CHROMEOS_ASH)

// Feature variations for kIsolateSandboxedIframes.
#if !BUILDFLAG(IS_ANDROID)
// TODO(wjmaclean): Add FeatureParams for a per-frame grouping when support
// for it is added.
const FeatureEntry::FeatureParam kIsolateSandboxedIframesGroupingPerSite{};
const FeatureEntry::FeatureParam kIsolateSandboxedIframesGroupingPerOrigin{};
const FeatureEntry::FeatureParam kIsolateSandboxedIframesGroupingPerDocument{};
const FeatureEntry::FeatureVariation
    kIsolateSandboxedIframesGroupingVariations[] =;
#endif  // !BUILDFLAG(IS_ANDROID)

const FeatureEntry::FeatureParam kWebRtcApmDownmixMethodAverage[] =;
const FeatureEntry::FeatureParam kWebRtcApmDownmixMethodFirstChannel[] =;
const FeatureEntry::FeatureVariation kWebRtcApmDownmixMethodVariations[] =;

const FeatureEntry::FeatureParam
    kSafetyCheckUnusedSitePermissionsNoDelayParam[] =;

const FeatureEntry::FeatureParam
    kSafetyCheckUnusedSitePermissionsWithDelayParam[] =;

const FeatureEntry::FeatureVariation
    kSafetyCheckUnusedSitePermissionsVariations[] =;

const FeatureEntry::FeatureParam kSafetyHub_NoDelay[] =;
const FeatureEntry::FeatureParam kSafetyHub_WithDelay[] =;
const FeatureEntry::FeatureVariation kSafetyHubVariations[] =;

const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingControl1[] =;
const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingLabelOnly[] =;
const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingTreatment[] =;
const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingControl2[] =;
const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingForceControl1[] =;
const FeatureEntry::FeatureParam
    kTPCPhaseOutFacilitatedTestingForceLabelOnly[] =;
const FeatureEntry::FeatureParam
    kTPCPhaseOutFacilitatedTestingForceTreatment[] =;
const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingForceControl2[] =;

const FeatureEntry::FeatureVariation
    kTPCPhaseOutFacilitatedTestingVariations[] =;

#if BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kTabStateFlatBufferMigrateStaleTabs[] = {
    {"migrate_stale_tabs", "true"}};

const FeatureEntry::FeatureVariation kTabStateFlatBufferVariations[] = {
    {"Migrate Stale Tabs", kTabStateFlatBufferMigrateStaleTabs,
     std::size(kTabStateFlatBufferMigrateStaleTabs), nullptr}};
#endif

const FeatureEntry::FeatureParam
    kTpcdHeuristicsGrants_CurrentInteraction_ShortRedirect_MainFrameInitiator
        [] =;
const FeatureEntry::FeatureParam
    kTpcdHeuristicsGrants_CurrentInteraction_LongRedirect_MainFrameInitiator[] =;
const FeatureEntry::FeatureParam
    kTpcdHeuristicsGrants_CurrentInteraction_ShortRedirect_AllFrameInitiator[] =;
const FeatureEntry::FeatureParam
    kTpcdHeuristicsGrants_CurrentInteraction_LongRedirect_AllFrameInitiator[] =;

const FeatureEntry::FeatureVariation kTpcdHeuristicsGrantsVariations[] =;

#if BUILDFLAG(IS_CHROMEOS_ASH)
const FeatureEntry::FeatureParam kVcInferenceBackendAuto[] = {
    {"inference_backend", "AUTO"},
};

const FeatureEntry::FeatureParam kVcInferenceBackendGpu[] = {
    {"inference_backend", "GPU"},
};

const FeatureEntry::FeatureParam kVcInferenceBackendNpu[] = {
    {"inference_backend", "NPU"},
};

const FeatureEntry::FeatureVariation kVcRelightingInferenceBackendVariations[] =
    {{"AUTO", kVcInferenceBackendAuto, std::size(kVcInferenceBackendAuto),
      nullptr},
     {"GPU", kVcInferenceBackendGpu, std::size(kVcInferenceBackendGpu),
      nullptr},
     {"NPU", kVcInferenceBackendNpu, std::size(kVcInferenceBackendNpu),
      nullptr}};

const FeatureEntry::FeatureVariation
    kVcSegmentationInferenceBackendVariations[] = {
        {"AUTO", kVcInferenceBackendAuto, std::size(kVcInferenceBackendAuto),
         nullptr},
        {"GPU", kVcInferenceBackendGpu, std::size(kVcInferenceBackendGpu),
         nullptr},
        {"NPU", kVcInferenceBackendNpu, std::size(kVcInferenceBackendNpu),
         nullptr}};

const FeatureEntry::FeatureParam kVcSegmentationModelHighResolution[] = {
    {"segmentation_model", "high_resolution"},
};

const FeatureEntry::FeatureParam kVcSegmentationModelLowerResolution[] = {
    {"segmentation_model", "lower_resolution"},
};

const FeatureEntry::FeatureVariation kVcSegmentationModelVariations[] = {
    {"High resolution model", kVcSegmentationModelHighResolution,
     std::size(kVcSegmentationModelHighResolution), nullptr},
    {"Lower resolution model", kVcSegmentationModelLowerResolution,
     std::size(kVcSegmentationModelLowerResolution), nullptr},
};

const FeatureEntry::FeatureParam kVcLightIntensity10[] = {
    {"light_intensity", "1.0"},
};

const FeatureEntry::FeatureParam kVcLightIntensity13[] = {
    {"light_intensity", "1.3"},
};

const FeatureEntry::FeatureParam kVcLightIntensity15[] = {
    {"light_intensity", "1.5"},
};

const FeatureEntry::FeatureParam kVcLightIntensity17[] = {
    {"light_intensity", "1.7"},
};

const FeatureEntry::FeatureParam kVcLightIntensity18[] = {
    {"light_intensity", "1.8"},
};

const FeatureEntry::FeatureParam kVcLightIntensity20[] = {
    {"light_intensity", "2.0"},
};

const FeatureEntry::FeatureVariation kVcLightIntensityVariations[] = {
    {"1.0", kVcLightIntensity10, std::size(kVcLightIntensity10), nullptr},
    {"1.3", kVcLightIntensity13, std::size(kVcLightIntensity13), nullptr},
    {"1.5", kVcLightIntensity15, std::size(kVcLightIntensity15), nullptr},
    {"1.7", kVcLightIntensity17, std::size(kVcLightIntensity17), nullptr},
    {"1.8", kVcLightIntensity18, std::size(kVcLightIntensity18), nullptr},
    {"2.0", kVcLightIntensity20, std::size(kVcLightIntensity20), nullptr},
};

#endif  // BUILDFLAG(IS_CHROMEOS_ASH)

#if BUILDFLAG(IS_CHROMEOS_ASH)
const FeatureEntry::FeatureParam
    kCrOSLateBootMissiveDisableStorageDegradation[] = {
        {"controlled_degradation", "false"}};
const FeatureEntry::FeatureParam
    kCrOSLateBootMissiveEnableStorageDegradation[] = {
        {"controlled_degradation", "true"}};
const FeatureEntry::FeatureParam kCrOSLateBootMissiveDisableLegacyStorage[] = {
    {"legacy_storage_enabled",
     "UNDEFINED_PRIORITY"}};  // All others are multi-generation action state.
const FeatureEntry::FeatureParam kCrOSLateBootMissiveEnableLegacyStorage[] = {
    {"legacy_storage_enabled",
     "SECURITY,"
     "IMMEDIATE,"
     "FAST_BATCH,"
     "SLOW_BATCH,"
     "BACKGROUND_BATCH,"
     "MANUAL_BATCH,"
     "MANUAL_BATCH_LACROS,"}};
const FeatureEntry::FeatureParam kCrOSLateBootMissivePartialLegacyStorage[] = {
    {"legacy_storage_enabled",
     "SECURITY,"
     "IMMEDIATE,"}};
const FeatureEntry::FeatureParam kCrOSLateBootMissiveSecurityLegacyStorage[] = {
    {"legacy_storage_enabled", "SECURITY,"}};

const FeatureEntry::FeatureVariation
    kCrOSLateBootMissiveStorageDefaultVariations[] = {
        {"Enable storage degradation",
         kCrOSLateBootMissiveEnableStorageDegradation,
         std::size(kCrOSLateBootMissiveEnableStorageDegradation), nullptr},
        {"Disable storage degradation",
         kCrOSLateBootMissiveDisableStorageDegradation,
         std::size(kCrOSLateBootMissiveDisableStorageDegradation), nullptr},
        {"Enable all queues legacy", kCrOSLateBootMissiveEnableLegacyStorage,
         std::size(kCrOSLateBootMissiveEnableLegacyStorage), nullptr},
        {"Disable all queues legacy", kCrOSLateBootMissiveDisableLegacyStorage,
         std::size(kCrOSLateBootMissiveDisableLegacyStorage), nullptr},
        {"Enable SECURITY and IMMEDIATE queues legacy only",
         kCrOSLateBootMissivePartialLegacyStorage,
         std::size(kCrOSLateBootMissivePartialLegacyStorage), nullptr},
        {"Enable SECURITY queues legacy only",
         kCrOSLateBootMissiveSecurityLegacyStorage,
         std::size(kCrOSLateBootMissiveSecurityLegacyStorage), nullptr},
};
#endif  // BUILDFLAG(IS_CHROMEOS_ASH)

#if !BUILDFLAG(IS_ANDROID)
const FeatureEntry::Choice kCastMirroringTargetPlayoutDelayChoices[] =;

#endif  // !BUILDFLAG(IS_ANDROID)

#if !BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kPasswordGenerationTrustedAdvice[] =;
const FeatureEntry::FeatureParam kPasswordGenerationSafetyFirst[] =;
const FeatureEntry::FeatureParam kPasswordGenerationTrySomethingNew[] =;
const FeatureEntry::FeatureParam kPasswordGenerationConvenience[] =;
const FeatureEntry::FeatureParam kPasswordGenerationCrossDevice[] =;
const FeatureEntry::FeatureParam kPasswordGenerationEditPassword[] =;
const FeatureEntry::FeatureParam kPasswordGenerationChunkPassword[] =;
const FeatureEntry::FeatureParam kPasswordGenerationNudgePassword[] =;

const FeatureEntry::FeatureVariation kPasswordGenerationExperimentVariations[] =;
#endif  // !BUILDFLAG(IS_ANDROID)

#if BUILDFLAG(ENABLE_BOUND_SESSION_CREDENTIALS)
const FeatureEntry::FeatureParam kEnableBoundSessionCredentialsWithDice[] =;

const FeatureEntry::FeatureVariation
    kEnableBoundSessionCredentialsVariations[] =;
#endif  // BUILDFLAG(ENABLE_BOUND_SESSION_CREDENTIALS)

#if BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kWebAuthnAndroidCredManGpmInCredManParam = {
    device::kWebAuthnAndroidGpmInCredMan.name, "true"};
const FeatureEntry::FeatureParam kWebAuthnAndroidCredManGpmNotInCredManParam = {
    device::kWebAuthnAndroidGpmInCredMan.name, "false"};
const FeatureEntry::FeatureVariation kWebAuthnAndroidCredManVariations[] = {
    {"for Google Password Manager and 3rd party passkeys",
     &kWebAuthnAndroidCredManGpmInCredManParam, 1, nullptr},
    {"for 3rd party passkeys", &kWebAuthnAndroidCredManGpmNotInCredManParam, 1,
     nullptr}};

const FeatureEntry::FeatureParam kHubPhase2WithIcons[] = {
    {"supports_other_tabs", "true"}};
const FeatureEntry::FeatureParam kHubPhase2WithText[] = {
    {"pane_switcher_uses_text", "true"},
    {"supports_other_tabs", "true"}};
const FeatureEntry::FeatureParam kHubPhase3[] = {
    {"pane_switcher_uses_text", "true"},
    {"supports_other_tabs", "true"},
    {"supports_search", "true"}};
const FeatureEntry::FeatureParam kHubPhase4[] = {
    {"pane_switcher_uses_text", "true"},
    {"supports_other_tabs", "true"},
    {"supports_search", "true"},
    {"supports_bookmarks", "true"}};

const FeatureEntry::FeatureVariation kAndroidHubV2Variations[] = {
    {"Phase 2 w/ Icons", kHubPhase2WithIcons, std::size(kHubPhase2WithIcons),
     nullptr},
    {"Phase 2 w/ Text", kHubPhase2WithText, std::size(kHubPhase2WithText),
     nullptr},
    {"Phase 3", kHubPhase3, std::size(kHubPhase3), nullptr},
    {"Phase 4", kHubPhase4, std::size(kHubPhase4), nullptr}};

const FeatureEntry::FeatureParam
    kAndroidHubFloatingActionButtonAlternativeColors[] = {
        {"hub_alternative_fab_color", "true"},
};

const FeatureEntry::FeatureVariation
    kAndroidHubFloatingActionButtonVariations[] = {
        {"Alternative colors", kAndroidHubFloatingActionButtonAlternativeColors,
         std::size(kAndroidHubFloatingActionButtonAlternativeColors), nullptr},
};

const FeatureEntry::FeatureParam kTabGroupParityAndroidSkipCreationDialog[] = {
    {"skip_tab_group_creation_dialog", "true"}};

const FeatureEntry::FeatureVariation kTabGroupParityAndroidVariations[] = {
    {"Skip tab group creation dialog", kTabGroupParityAndroidSkipCreationDialog,
     std::size(kTabGroupParityAndroidSkipCreationDialog), nullptr}};

const FeatureEntry::FeatureParam kTabGroupCreationDialogAndroidShowSetting[] = {
    {"show_tab_group_creation_dialog_setting", "true"}};

const FeatureEntry::FeatureVariation
    kTabGroupCreationDialogAndroidVariations[] = {
        {"Show tab group creation dialog setting",
         kTabGroupCreationDialogAndroidShowSetting,
         std::size(kTabGroupCreationDialogAndroidShowSetting), nullptr}};

const FeatureEntry::FeatureParam kGtsCloseTabAnimationUseStandardEasing[] = {
    {"rearrange_standard_easing", "true"}};
const FeatureEntry::FeatureParam
    kGtsCloseTabAnimationCloseAllQuickDeleteAnimation[] = {
        {"rearrange_standard_easing", "true"},
        {"close_all_quick_delete_animation", "true"}};

const FeatureEntry::FeatureVariation kGtsCloseTabAnimationVariations[] = {
    {"Option C use standard easing for rearrange",
     kGtsCloseTabAnimationUseStandardEasing,
     std::size(kGtsCloseTabAnimationUseStandardEasing), nullptr},
    {"Option D close all uses quick delete animation",
     kGtsCloseTabAnimationCloseAllQuickDeleteAnimation,
     std::size(kGtsCloseTabAnimationCloseAllQuickDeleteAnimation), nullptr},
};

const FeatureEntry::FeatureParam kEdgeToEdgeBottomChinDebugFeatureParams[] = {
    {chrome::android::kEdgeToEdgeBottomChinDebugParam.name, "true"}};
const FeatureEntry::FeatureVariation kEdgeToEdgeBottomChinVariations[] = {
    {"debug", kEdgeToEdgeBottomChinDebugFeatureParams,
     std::size(kEdgeToEdgeBottomChinDebugFeatureParams), nullptr},
};

const FeatureEntry::FeatureParam kBottomBrowserControlsRefactorParams[] = {
    {"disable_bottom_controls_stacker_y_offset", "false"}};
const FeatureEntry::FeatureVariation
    kBottomBrowserControlsRefactorVariations[] = {
        {"Dispatch yOffset", kBottomBrowserControlsRefactorParams,
         std::size(kBottomBrowserControlsRefactorParams), nullptr},
};

#endif  // BUILDFLAG(IS_ANDROID)

const flags_ui::FeatureEntry::FeatureParam kParcelTrackingTestDataDelivered[] =;
const flags_ui::FeatureEntry::FeatureParam kParcelTrackingTestDataInProgress[] =;
const flags_ui::FeatureEntry::FeatureParam
    kParcelTrackingTestDataOutForDelivery[] =;
const flags_ui::FeatureEntry::FeatureVariation
    kParcelTrackingTestDataVariations[] =;

#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \
    BUILDFLAG(IS_CHROMEOS)
const flags_ui::FeatureEntry::FeatureParam kPwaNavigationCapturingDefaultOn[] =;
const flags_ui::FeatureEntry::FeatureParam kPwaNavigationCapturingDefaultOff[] =;
const flags_ui::FeatureEntry::FeatureParam
    kPwaNavigationCapturingReimplDefaultOn[] =;
const flags_ui::FeatureEntry::FeatureParam
    kPwaNavigationCapturingReimplDefaultOff[] =;
const flags_ui::FeatureEntry::FeatureVariation
    kPwaNavigationCapturingVariations[] =;
#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) ||
        // BUILDFLAG(IS_CHROMEOS)

#if BUILDFLAG(IS_ANDROID)
const FeatureEntry::Choice kAccountBookmarksAndReadingListBehindOptInChoices[] =
    {
        {"Default", "", ""},
        {"Enabled", switches::kEnableFeatures,
         "SyncEnableBookmarksInTransportMode,"
         "ReadingListEnableSyncTransportModeUponSignIn"},
};

const char kReplaceSyncPromosWithSignInPromosFeatures[] =
    "ReplaceSyncPromosWithSignInPromos,"
    "ReadingListEnableSyncTransportModeUponSignIn,"
    "SyncEnableContactInfoDataTypeInTransportMode,"
    "SyncEnableContactInfoDataTypeForCustomPassphraseUsers,"
    "SyncEnableWalletMetadataInTransportMode,"
    "SyncEnableWalletOfferInTransportMode,"
    "EnablePasswordsAccountStorageForNonSyncingUsers,"
    "HideSettingsSignInPromo,"
    "FeedBottomSyncStringRemoval,"
    "EnableBatchUploadFromSettings";

// The ones above + UnoPhase2FollowUp.
const char kFastFollowFeatures[] =
    "ReplaceSyncPromosWithSignInPromos,"
    "ReadingListEnableSyncTransportModeUponSignIn,"
    "SyncEnableContactInfoDataTypeInTransportMode,"
    "SyncEnableContactInfoDataTypeForCustomPassphraseUsers,"
    "SyncEnableWalletMetadataInTransportMode,"
    "SyncEnableWalletOfferInTransportMode,"
    "EnablePasswordsAccountStorageForNonSyncingUsers,"
    "HideSettingsSignInPromo,"
    "FeedBottomSyncStringRemoval,"
    "EnableBatchUploadFromSettings,"
    "UnoPhase2FollowUp";

const FeatureEntry::Choice kReplaceSyncPromosWithSignInPromosChoices[] = {
    {"Default", "", ""},
    {"Disabled", "disable-features",
     kReplaceSyncPromosWithSignInPromosFeatures},
    {"Enabled", "enable-features", kReplaceSyncPromosWithSignInPromosFeatures},
    {"Enabled with follow-ups", "enable-features", kFastFollowFeatures},
};
#endif  // BUILDFLAG(IS_ANDROID)

#if !BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam
    kUserEducationVersion2ShortIdleSessionCooldownDuration[] =;

const FeatureEntry::FeatureVariation
    kUserEducationExperienceVersion2Variants[] =;
#endif  // BUILDFLAG(IS_ANDROID)

#if !BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kLinkPreviewTriggerTypeAltClick[] =;
const FeatureEntry::FeatureParam kLinkPreviewTriggerTypeAltHover[] =;
const FeatureEntry::FeatureParam kLinkPreviewTriggerTypeLongPress[] =;

const FeatureEntry::FeatureVariation kLinkPreviewTriggerTypeVariations[] =;
#endif  // !BUILDFLAG(IS_ANDROID)

const FeatureEntry::FeatureParam
    kAutofillGranularFillingAvailableVariationWithoutImprovedLabels[] =;

const FeatureEntry::FeatureParam
    kAutofillGranularFillingAvailableVariationWithFillEverythingAtTheTop[] =;

const FeatureEntry::FeatureParam
    kAutofillGranularFillingAvailableVariationWithExpandControlVisibleOnSelectionOnly
        [] =;

const FeatureEntry::FeatureVariation kAutofillGranularFillingAvailableVariations[] =;

#if BUILDFLAG(IS_ANDROID)
inline constexpr flags_ui::FeatureEntry::FeatureParam
    kAutofillVirtualViewStructureAndroidSkipCompatibilityCheck = {
        autofill::features::
            kAutofillVirtualViewStructureAndroidSkipsCompatibilityCheck.name,
        "skip_all_checks"};
inline constexpr flags_ui::FeatureEntry::FeatureParam
    kAutofillVirtualViewStructureAndroidOnlySkipAwgCheck = {
        autofill::features::
            kAutofillVirtualViewStructureAndroidSkipsCompatibilityCheck.name,
        "only_skip_awg_check"};

inline constexpr flags_ui::FeatureEntry::FeatureVariation
    kAutofillVirtualViewStructureVariation[] = {
        {" without any compatibility check",
         &kAutofillVirtualViewStructureAndroidSkipCompatibilityCheck, 1,
         nullptr},
        {" without AwG restriction",
         &kAutofillVirtualViewStructureAndroidOnlySkipAwgCheck, 1, nullptr}};

#endif  // BUILDFLAG(IS_ANDROID)

const FeatureEntry::FeatureParam
    kPrerender2WarmUpCompositorTriggerPointDidCommitLoad[] =;
const FeatureEntry::FeatureParam
    kPrerender2WarmUpCompositorTriggerPointDidDispatchDOMContentLoadedEvent[] =;
const FeatureEntry::FeatureParam
    kPrerender2WarmUpCompositorTriggerPointDidFinishLoad[] =;
const FeatureEntry::FeatureVariation
    kPrerender2WarmUpCompositorTriggerPointVariations[] =;

#if BUILDFLAG(ENABLE_COMPOSE)
// Vatiations of the Compose proactive nudge.
const FeatureEntry::FeatureParam kComposeProactiveNudge_CompactUI_50[] =;

const FeatureEntry::FeatureParam kComposeProactiveNudge_LargeUI_50[] =;

const FeatureEntry::FeatureParam kComposeProactiveNudge_CompactUI_100[] =;

const FeatureEntry::FeatureParam kComposeProactiveNudge_LargeUI_100[] =;

const FeatureEntry::FeatureParam kComposeProactiveNudge_NoFocusDelay_10[] =;

const FeatureEntry::FeatureParam kComposeProactiveNudge_NoFocusDelay_50[] =;

const FeatureEntry::FeatureParam kComposeProactiveNudge_LongFocusDelay_10[] =;

const FeatureEntry::FeatureParam kComposeProactiveNudge_LongFocusDelay_50[] =;

const FeatureEntry::FeatureVariation kComposeProactiveNudgeVariations[] =;

// Variations of the Compose selection nudge.
const FeatureEntry::FeatureParam kComposeSelectionNudge_1[] =;

const FeatureEntry::FeatureParam kComposeSelectionNudge_15[] =;

const FeatureEntry::FeatureParam kComposeSelectionNudge_30[] =;

const FeatureEntry::FeatureParam kComposeSelectionNudge_30_1s[] =;

const FeatureEntry::FeatureParam kComposeSelectionNudge_30_2s[] =;

const FeatureEntry::FeatureParam kComposeSelectionNudge_50[] =;

const FeatureEntry::FeatureParam kComposeSelectionNudge_100[] =;

const FeatureEntry::FeatureVariation kComposeSelectionNudgeVariations[] =;
#endif  // ENABLE_COMPOSE

#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
const FeatureEntry::FeatureParam kLocationProviderManagerModeNetworkOnly[] = {
    {"LocationProviderManagerMode", "NetworkOnly"}};
const FeatureEntry::FeatureParam kLocationProviderManagerModePlatformOnly[] = {
    {"LocationProviderManagerMode", "PlatformOnly"}};
const FeatureEntry::FeatureParam kLocationProviderManagerModeHybridPlatform[] =
    {{"LocationProviderManagerMode", "HybridPlatform"}};

const FeatureEntry::FeatureVariation kLocationProviderManagerVariations[] = {
    {"NetworkOnly", kLocationProviderManagerModeNetworkOnly,
     std::size(kLocationProviderManagerModeNetworkOnly), nullptr},
    {"PlatformOnly", kLocationProviderManagerModePlatformOnly,
     std::size(kLocationProviderManagerModePlatformOnly), nullptr},
    {"HybridPlatform", kLocationProviderManagerModeHybridPlatform,
     std::size(kLocationProviderManagerModeHybridPlatform), nullptr}};
#endif  // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)

#if !BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kWebAuthnEnclaveAuthenticatorEnabledParam =;
const FeatureEntry::FeatureVariation kWebAuthnEnclaveAuthenticatorVariations[] =;
#endif

const FeatureEntry::FeatureParam kAutofillUpstreamUpdatedUi_Security[] =;
const FeatureEntry::FeatureParam kAutofillUpstreamUpdatedUi_Convenience[] =;
const FeatureEntry::FeatureParam kAutofillUpstreamUpdatedUi_Education[] =;

const FeatureEntry::FeatureVariation kAutofillUpstreamUpdatedUiOptions[] =;

const FeatureEntry::FeatureParam
    kDeferRendererTasksAfterInputMinimalTypesPolicyParam[] =;
const FeatureEntry::FeatureParam
    kDeferRendererTasksAfterInputNonUserBlockingDeferrableTypesPolicyParam[] =;
const FeatureEntry::FeatureParam
    kDeferRendererTasksAfterInputAllDeferrableTypesPolicyParam[] =;
const FeatureEntry::FeatureParam
    kDeferRendererTasksAfterInputNonUserBlockingTypesPolicyParam[] =;
const FeatureEntry::FeatureParam
    kDeferRendererTasksAfterInputAllTypesPolicyParam[] =;

const FeatureEntry::FeatureVariation kDeferRendererTasksAfterInputVariations[] =;

// LINT.IfChange(AutofillVcnEnrollRequestTimeouts)
const FeatureEntry::FeatureParam kAutofillVcnEnrollRequestTimeout_5Seconds[] =;
const FeatureEntry::FeatureParam
    kAutofillVcnEnrollRequestTimeout_7Point5Seconds[] =;
const FeatureEntry::FeatureParam kAutofillVcnEnrollRequestTimeout_10Seconds[] =;
const FeatureEntry::FeatureVariation kAutofillVcnEnrollRequestTimeoutOptions[] =;
// LINT.ThenChange(//ios/chrome/browser/flags/about_flags.mm:AutofillVcnEnrollRequestTimeouts)

#if BUILDFLAG(ENABLE_EXTENSIONS)
const FeatureEntry::FeatureParam
    kExtensionTelemetryEnterpriseReportingIntervalSeconds_20Seconds[] =;
const FeatureEntry::FeatureParam
    kExtensionTelemetryEnterpriseReportingIntervalSeconds_60Seconds[] =;
const FeatureEntry::FeatureParam
    kExtensionTelemetryEnterpriseReportingIntervalSeconds_300Seconds[] =;
const FeatureEntry::FeatureVariation
    kExtensionTelemetryEnterpriseReportingIntervalSecondsVariations[] =;
#endif  // BUILDFLAG(ENABLE_EXTENSIONS)

const FeatureEntry::FeatureParam kDiscountOnShoppyPage[] =;
const FeatureEntry::FeatureVariation kDiscountsVariations[] =;

const FeatureEntry::FeatureParam
    kSecurePaymentConfirmationNetworkAndIssuerIcons_Inline[] =;
const FeatureEntry::FeatureParam
    kSecurePaymentConfirmationNetworkAndIssuerIcons_Rows[] =;

const FeatureEntry::FeatureVariation
    kSecurePaymentConfirmationNetworkAndIssuerIconsOptions[] =;

#if BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kClayBlockingWithFakeBackend[] = {
    {"use_fake_backend", "true"}};
const FeatureEntry::FeatureVariation kClayBlockingVariations[] = {
    {"(with fake backend)", kClayBlockingWithFakeBackend,
     std::size(kClayBlockingWithFakeBackend), nullptr}};
#endif

// RECORDING USER METRICS FOR FLAGS:
// -----------------------------------------------------------------------------
// The first line of the entry is the internal name.
//
// To add a new entry, add to the end of kFeatureEntries. There are two
// distinct types of entries:
// . SINGLE_VALUE: entry is either on or off. Use the SINGLE_VALUE_TYPE
//   macro for this type supplying the command line to the macro.
// . MULTI_VALUE: a list of choices, the first of which should correspond to a
//   deactivated state for this lab (i.e. no command line option). To specify
//   this type of entry use the macro MULTI_VALUE_TYPE supplying it the
//   array of choices.
// See the documentation of FeatureEntry for details on the fields.
//
// Usage of about:flags is logged on startup via the "Launch.FlagsAtStartup"
// UMA histogram. This histogram shows the number of startups with a given flag
// enabled. If you'd like to see user counts instead, make sure to switch to
// "count users" view on the dashboard. When adding new entries, the enum
// "LoginCustomFlags" must be updated in histograms/enums.xml. See note in
// enums.xml and don't forget to run AboutFlagsHistogramTest unit test to
// calculate and verify checksum.
//
// When adding a new choice, add it to the end of the list.
const FeatureEntry kFeatureEntries[] =;

class FlagsStateSingleton : public flags_ui::FlagsState::Delegate {};

bool ShouldSkipNonDeprecatedFeatureEntry(const FeatureEntry& entry) {}

}  // namespace

#if BUILDFLAG(IS_CHROMEOS_ASH)
// This method may be invoked both synchronously or asynchronously. Based on
// whether the current user is the owner of the device, generates the
// appropriate flag storage.
void GetStorageAsync(Profile* profile,
                     GetStorageCallback callback,
                     bool current_user_is_owner) {
  // On ChromeOS the owner can set system wide flags and other users can only
  // set flags for their own session.
  if (current_user_is_owner) {
    ash::OwnerSettingsServiceAsh* service =
        ash::OwnerSettingsServiceAshFactory::GetForBrowserContext(profile);
    std::move(callback).Run(
        std::make_unique<ash::about_flags::OwnerFlagsStorage>(
            profile->GetPrefs(), service),
        flags_ui::kOwnerAccessToFlags);
  } else {
    std::move(callback).Run(std::make_unique<flags_ui::PrefServiceFlagsStorage>(
                                profile->GetPrefs()),
                            flags_ui::kGeneralAccessFlagsOnly);
  }
}
#endif

// ash-chrome uses different storage flag storage logic from other desktop
// platforms.
void GetStorage(Profile* profile, GetStorageCallback callback) {}

bool ShouldSkipConditionalFeatureEntry(const flags_ui::FlagsStorage* storage,
                                       const FeatureEntry& entry) {}

void ConvertFlagsToSwitches(flags_ui::FlagsStorage* flags_storage,
                            base::CommandLine* command_line,
                            flags_ui::SentinelsMode sentinels) {}

std::vector<std::string> RegisterAllFeatureVariationParameters(
    flags_ui::FlagsStorage* flags_storage,
    base::FeatureList* feature_list) {}

void GetFlagFeatureEntries(flags_ui::FlagsStorage* flags_storage,
                           flags_ui::FlagAccess access,
                           base::Value::List& supported_entries,
                           base::Value::List& unsupported_entries) {}

void GetFlagFeatureEntriesForDeprecatedPage(
    flags_ui::FlagsStorage* flags_storage,
    flags_ui::FlagAccess access,
    base::Value::List& supported_entries,
    base::Value::List& unsupported_entries) {}

flags_ui::FlagsState* GetCurrentFlagsState() {}

bool IsRestartNeededToCommitChanges() {}

void SetFeatureEntryEnabled(flags_ui::FlagsStorage* flags_storage,
                            const std::string& internal_name,
                            bool enable) {}

void SetOriginListFlag(const std::string& internal_name,
                       const std::string& value,
                       flags_ui::FlagsStorage* flags_storage) {}

void SetStringFlag(const std::string& internal_name,
                   const std::string& value,
                   flags_ui::FlagsStorage* flags_storage) {}

void RemoveFlagsSwitches(base::CommandLine::SwitchMap* switch_list) {}

void ResetAllFlags(flags_ui::FlagsStorage* flags_storage) {}

#if BUILDFLAG(IS_CHROMEOS)
void CrosUrlFlagsRedirect() {
#if BUILDFLAG(IS_CHROMEOS_LACROS)
  lacros_url_handling::NavigateInAsh(GURL(chrome::kChromeUIFlagsURL));
#else
  // Note: This will only be called by the UI when Lacros is available.
  DCHECK(crosapi::BrowserManager::Get());
  crosapi::BrowserManager::Get()->SwitchToTab(
      GURL(chrome::kChromeUIFlagsURL),
      /*path_behavior=*/NavigateParams::RESPECT);
#endif
}
#endif

void RecordUMAStatistics(flags_ui::FlagsStorage* flags_storage,
                         const std::string& histogram_name) {}

namespace testing {

std::vector<FeatureEntry>* GetEntriesForTesting() {}

void SetFeatureEntries(const std::vector<FeatureEntry>& entries) {}

ScopedFeatureEntries::ScopedFeatureEntries(
    const std::vector<flags_ui::FeatureEntry>& entries) {}

ScopedFeatureEntries::~ScopedFeatureEntries() {}

base::span<const FeatureEntry> GetFeatureEntries() {}

}  // namespace testing

}  // namespace about_flags