Greasy Fork

Greasy Fork is available in English.

YouTube EXPERIMENT_FLAGS Tamer

Adjust EXPERIMENT_FLAGS

当前为 2023-09-18 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        YouTube EXPERIMENT_FLAGS Tamer
// @namespace   UserScripts
// @match       https://www.youtube.com/*
// @version     1.1.1
// @license     MIT
// @author      CY Fung
// @icon        https://github.com/cyfung1031/userscript-supports/raw/main/icons/yt-engine.png
// @description Adjust EXPERIMENT_FLAGS
// @grant       none
// @unwrap
// @run-at      document-start
// @allFrames   true
// @inject-into page
// ==/UserScript==

((__CONTEXT__) => {

  // Purpose 1: Remove Obsolete Flags
  // Purpose 2: Remove Flags bring no visual difference
  // Purpose 3: Enable Flags bring performance boost

  const DISABLE_CINEMATICS = false; // standard design
  const NO_SerializedExperiment = true;
  const KEEP_PLAYER_QUALITY_STICKY = true; // see http://greasyfork.icu/scripts/471033/
  const DISABLE_serializedExperimentIds = true;
  const DISABLE_serializedExperimentFlags = true;
  const IGNORE_VIDEO_SOURCE_RELATED = true;
  const NO_REFRESH = true;
  const ENABLE_MINOR_CHAT_FEATURE_UPGRADE = true;
  const ENABLE_EMOJI_PICKER_NEW_STYLE = false;
  const ENABLE_BADGE_STYLE = false;

  const ENABLE_EXPERIMENT_FLAGS_MAINTAIN_STABLE_LIST = {
    defaultValue: true, // performance boost
    useExternal: () => typeof localStorage.EXPERIMENT_FLAGS_MAINTAIN_STABLE_LIST !== 'undefined',
    externalValue: () => (+localStorage.EXPERIMENT_FLAGS_MAINTAIN_STABLE_LIST ? true : false)
  };
  const ENABLE_EXPERIMENT_FLAGS_MAINTAIN_REUSE_COMPONENTS = {
    defaultValue: true, // not sure
    useExternal: () => typeof localStorage.EXPERIMENT_FLAGS_MAINTAIN_REUSE_COMPONENTS !== 'undefined',
    externalValue: () => (+localStorage.EXPERIMENT_FLAGS_MAINTAIN_REUSE_COMPONENTS ? true : false)
  };
  const ENABLE_EXPERIMENT_FLAGS_DEFER_DETACH = {
    defaultValue: true, // not sure
    useExternal: () => typeof localStorage.ENABLE_EXPERIMENT_FLAGS_DEFER_DETACH !== 'undefined',
    externalValue: () => (+localStorage.ENABLE_EXPERIMENT_FLAGS_DEFER_DETACH ? true : false)
  };

  const ALLOW_ALL_LIVE_CHATS_FLAGS = false;

  const USE_MAINTAIN_STABLE_LIST_ONLY_WHEN_KS_FLAG_IS_SET = false;



  // TBC
  // kevlar_tuner_should_always_use_device_pixel_ratio
  // kevlar_tuner_should_clamp_device_pixel_ratio
  // kevlar_tuner_clamp_device_pixel_ratio
  // kevlar_tuner_should_use_thumbnail_factor
  // kevlar_tuner_thumbnail_factor
  // kevlar_tuner_min_thumbnail_quality
  // kevlar_tuner_max_thumbnail_quality

  // kevlar_tuner_should_test_visibility_time_between_jobs
  // kevlar_tuner_visibility_time_between_jobs_ms

  // kevlar_tuner_default_comments_delay
  // kevlar_tuner_run_default_comments_delay

  let settled = null;
  // cinematic feature is no longer an experimential feature.
  // It has been officially implemented.
  // To disable cinematics, the user shall use other userscripts or just turn off the option in the video options.

  const getSettingValue = (fm) => fm.useExternal() ? fm.externalValue() : fm.defaultValue;

  const win = this instanceof Window ? this : window;

  // Create a unique key for the script and check if it is already running
  const hkey_script = 'jmimcvowrlzl';
  if (win[hkey_script]) throw new Error('Duplicated Userscript Calling'); // avoid duplicated scripting
  win[hkey_script] = true;

  /** @type {globalThis.PromiseConstructor} */
  const Promise = ((async () => { })()).constructor;

  let isMainWindow = false;
  let mzFlagDetected1 = new Set();
  let mzFlagDetected2 = new Set();
  let zPlayerKevlar = false;
  try {
    isMainWindow = window.document === window.top.document
  } catch (e) { }

  function fixSerializedExperiment(conf) {

    const supportAV1 = window.MediaSource.isTypeSupported('video/webm; codecs=av01.0.05M.08');
    const supportVP9 = window.MediaSource.isTypeSupported('video/webm; codecs=vp09.01.20.08.01.01.01.01.00');

    if (DISABLE_serializedExperimentIds && typeof conf.serializedExperimentIds === 'string') {
      let ids = conf.serializedExperimentIds.split(',');
      let newIds = [];
      for (const id of ids) {
        let keep = false;
        if (keep) {
          newIds.push(id);
        }
      }
      conf.serializedExperimentIds = newIds.join(',');
    }

    const mez = (mRes) => {

      mRes.set('html5_disable_low_pipeline', 'false');
      mRes.set('html5_min_startup_buffered_ad_media_duration_secs', '0')

      if (supportAV1 === false && localStorage['yt-player-av1-pref'] === '-1') {

        mRes.set('html5_disable_av1', 'true');
        mRes.set('html5_disable_av1_hdr', 'true');
        mRes.set('html5_prefer_hbr_vp9_over_av1', 'true');



      } else if (supportAV1 === true && supportVP9 === true && localStorage['yt-player-av1-pref'] === '8192') {

        mRes.set('html5_disable_av1', 'false');
        mRes.set('html5_disable_av1_hdr', 'false');
        mRes.set('html5_prefer_hbr_vp9_over_av1', 'false');
      }


      // html5_perf_cap_override_sticky = true;
      // html5_perserve_av1_perf_cap = true;


      mRes.set('html5_enable_server_format_filter', 'true')
      mRes.set('html5_use_ump', 'true')

      mRes.set('html5_live_defrag_only_h264_playbacks', 'true')
      mRes.set('html5_live_defrag_only_h264_formats', 'true')

      mRes.set('html5_disable_protected_hdr', 'false')
      mRes.set('html5_disable_vp9_encrypted', 'false')
      mRes.set('html5_ignore_h264_framerate_cap', 'true')

      mRes.set('html5_allow_asmjs', 'true')
      mRes.set('html5_defer_modules_on_ads_only', 'true')
      mRes.set('html5_use_drm_retry', 'true')
      mRes.set('html5_delta_encode_fexp', 'true')
      mRes.set('html5_only_send_cas_health_pings', 'true')

      mRes.set('html5_modify_caption_vss_logging', 'true')
      mRes.set('html5_allow_zero_duration_ads_on_timeline', 'true')
      mRes.set('html5_reset_daistate_on_audio_codec_change', 'true')
      mRes.set('html5_enable_safari_fairplay', 'true')

      mRes.set('html5_safari_fairplay_ignore_hdcp', 'true')

      mRes.set('html5_enable_vp9_fairplay', 'true')
      mRes.set('html5_eme_loader_sync', 'true')

      mRes.set('html5_enable_same_language_id_matching', 'true');
      mRes.set('html5_enable_new_hvc_enc', 'true')
      mRes.set('html5_enable_ssap', 'true')
      mRes.set('html5_enable_short_gapless', 'true')
      mRes.set('html5_enable_aac51', 'true')
      mRes.set('html5_enable_ssap_entity_id', 'true')

      mRes.set('html5_high_res_logging_always', 'true')
      mRes.set('html5_local_playsinline', 'true')
      mRes.set('html5_disable_media_element_loop_on_tv', 'true')
      mRes.set('html5_native_audio_track_switching', 'true')

      mRes.set('html5_format_hybridization', 'true')
      mRes.set('html5_disable_encrypted_vp9_live_non_2k_4k', 'false')

      mRes.set('html5_default_ad_gain', 'false')
      mRes.set('html5_use_sabr_requests_for_debugging', 'false')
      mRes.set('html5_enable_sabr_live_streaming_xhr', 'true')
      mRes.set('html5_sabr_live_ultra_low_latency', 'true')

      mRes.set('html5_sabr_live_low_latency', 'true')
      mRes.set('html5_sabr_live', 'true')
      mRes.set('html5_sabr_post_live', 'true')
      mRes.set('html5_sabr_premiere', 'true')

      mRes.set('html5_enable_sabr_live_streaming_xhr', 'true')
      mRes.set('html5_enable_sabr_live_non_streaming_xhr', 'true')



      mRes.set('html5_enable_subsegment_readahead_v3', 'true')
      mRes.set('html5_ultra_low_latency_subsegment_readahead', 'true')
      mRes.set('html5_disable_move_pssh_to_moov', 'true')



      mRes.set('html5_modern_vp9_mime_type', 'true')






    }

    const qrz = (mRes) => {

      const res = [];
      mRes.forEach((value, key) => {
        res.push(`${key}=${value}`);
      });
      return res.join('&');
    }

    if (DISABLE_serializedExperimentFlags && typeof conf.serializedExperimentFlags === 'string') {
      const fg = conf.serializedExperimentFlags;
      const rx = /(^|&)(\w+)=([^=&|\s\{\}\[\]\(\)?]*)/g;

      const mRes = new Map();
      for (let m; m = rx.exec(fg);) {
        let key = m[2];
        let value = m[3];
        let keep = false;


        if (IGNORE_VIDEO_SOURCE_RELATED && key.indexOf('html5_') >= 0) {


          if (key === 'html5_live_use_alternate_bandwidth_window_sizes') {
            keep = true;
          }
          else if (key === 'html5_live_ultra_low_latency_bandwidth_window') {
            keep = true;
          }
          else if (key === 'html5_live_low_latency_bandwidth_window') {
            keep = true;
          }
          else if (key === 'html5_live_normal_latency_bandwidth_window') {
            keep = true;
          } else if (key === 'html5_skip_slow_ad_delay_ms') {
            keep = true;
            if (typeof value === 'string' && +value > 2) {
              keep = true;
              if (+value > 4) value = '4';
            } else {
              keep = false;
            }
          } else if (key === 'html5_player_preload_ad_fix') {
            keep = true;
          } else if (key.includes('_ad_') || key.includes('_ads_')) {
            keep = false;
          } else if (key === 'html5_ssdai_adfetch_dynamic_timeout_ms') {
            keep = false;
          } else if (key === 'html5_log_ssdai_fallback_ads' || key === 'html5_deprecate_adservice') {
            keep = false;
          } else {
            if (!key.includes('deprecat')) keep = true;
          }


        } else if (IGNORE_VIDEO_SOURCE_RELATED && key.indexOf('h5_') >= 0) {
          if (key.startsWith('enable_h5_player_ad_block_')) keep = false;
          else if (key === 'fix_h5_toggle_button_a11y') keep = true;
          else if (key === 'h5_companion_enable_adcpn_macro_substitution_for_click_pings') keep = false;
          else if (key === 'h5_enable_generic_error_logging_event') keep = false;
          else if (key === 'h5_enable_unified_csi_preroll') keep = true;
          else if (key === 'h5_reset_cache_and_filter_before_update_masthead') keep = true;
          else if (key === 'web_player_enable_premium_hbr_in_h5_api') keep = true;
          else {
            if (!key.includes('deprecat')) keep = true;
          }
        }

        // if(key.includes('sticky')){

        // console.log(5599,key)
        // }

        if (key.includes('_timeout') && typeof value === 'string') {
          const valur = (value, k) => {
            if (+value === 0) value = k;
            else if (+value > +k) value = k;
            return value;
          }
          if (key === 'check_navigator_accuracy_timeout_ms') {
            value = valur(value, '4');
            keep = true;
          } else if (key === 'html5_ad_timeout_ms') {
            value = valur(value, '4');
            keep = true;
          } else if (key === 'html5_ads_preroll_lock_timeout_delay_ms') {
            // value = valur(value, '4');
            // keep = true;
            keep = false;
          } else if (key === 'html5_slow_start_timeout_delay_ms') {
            value = valur(value, '4');
            keep = true;
          } else if (key === 'variable_buffer_timeout_ms') {
            // value = valur(value, '4');
            // keep = true;
            keep = false;
          } else {
            if (+value > 3000) value = '3000';
            keep = true;
          }
        }


        if (KEEP_PLAYER_QUALITY_STICKY && key.includes('_sticky')) {


          if (key === 'html5_onesie_sticky_server_side') {
            keep = false;

          } else if (key === 'html5_perf_cap_override_sticky') {
            keep = true;

          } else if (key === 'html5_ustreamer_cap_override_sticky') {
            keep = true;


          } else if (key === 'html5_exponential_memory_for_sticky') {
            keep = true;

          } else {
            keep = true;

          }

        }


        if (key === 'html5_streaming_xhr_time_based_consolidation_ms') keep = true;
        if (key === 'html5_bypass_contention_secs') keep = true;

        if (key === 'vp9_drm_live') keep = true;
        if (key === 'html5_log_rebuffer_reason') keep = false;
        if (key === 'html5_enable_audio_track_log') keep = false;

        if (key.startsWith('h5_expr_')) {
          // by userscript
          keep = true;
        } else if (key.includes('deprecat')) {
          keep = false;
        }

        if (key === 'html5_safari_desktop_eme_min_version') keep = true;

        if (key === 'html5_disable_av1') keep = true;
        if (key === 'html5_disable_av1_hdr') keep = true;
        if (key === 'html5_disable_hfr_when_vp9_encrypted_2k4k_unsupported') keep = true;
        if (key === 'html5_account_onesie_format_selection_during_format_filter') keep = true;
        if (key === 'html5_prefer_hbr_vp9_over_av1') keep = true;

        if (!DISABLE_CINEMATICS && key === 'web_cinematic_watch_settings') {
          keep = true;
        }
        if (keep) mRes.set(key, value);
      }

      mez(mRes);

      conf.serializedExperimentFlags = qrz(mRes);

    }

  }

  const all_live_chat_flags = `live_chat_banner_expansion_fix
  live_chat_enable_mod_view
  live_chat_enable_qna_banner_overflow_menu_actions
  live_chat_enable_qna_channel
  live_chat_enable_send_button_in_slow_mode
  live_chat_filter_emoji_suggestions
  live_chat_increased_min_height
  live_chat_over_playlist
  live_chat_web_enable_command_handler
  live_chat_web_use_emoji_manager_singleton
  live_chat_whole_message_clickable`.trim().split(/\s+/)

  const hLooper = ((fn) => {

    let nativeFnLoaded = false;
    let kc1 = 0;

    const setIntervalW = setInterval;
    const clearIntervalW = clearInterval;
    let microDisconnectFn = null;
    let fStopLooper = false;
    const looperFn = () => {
      if (fStopLooper) return;

      let config_ = null;
      let EXPERIMENT_FLAGS = null;
      try {
        config_ = yt.config_ || ytcfg.data_;
      } catch (e) { }
      if (!config_) return;
      EXPERIMENT_FLAGS = config_.EXPERIMENT_FLAGS || 0;

      if (EXPERIMENT_FLAGS) {


        if (!settled) {
          settled = {
            use_maintain_stable_list: getSettingValue(ENABLE_EXPERIMENT_FLAGS_MAINTAIN_STABLE_LIST),
            use_maintain_reuse_components: getSettingValue(ENABLE_EXPERIMENT_FLAGS_MAINTAIN_REUSE_COMPONENTS),
            use_defer_detach: getSettingValue(ENABLE_EXPERIMENT_FLAGS_DEFER_DETACH),
          }
          if (settled.use_maintain_stable_list) Promise.resolve().then(() => console.debug("use_maintain_stable_list"));
          if (settled.use_maintain_reuse_components) Promise.resolve().then(() => console.debug("use_maintain_reuse_components"));
          if (settled.use_defer_detach) Promise.resolve().then(() => console.debug("use_defer_detach"));
        }

        fn(config_);
      }

      if (EXPERIMENT_FLAGS && microDisconnectFn) {


        let isYtLoaded = false;
        try {
          isYtLoaded = typeof ytcfg.set === 'function';
        } catch (e) { }
        if (isYtLoaded) {
          microDisconnectFn();
        }

      }

      const playerKevlar = (config_.WEB_PLAYER_CONTEXT_CONFIGS || 0).WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_WATCH || 0;


      if (playerKevlar && !zPlayerKevlar) {
        zPlayerKevlar = true;

        if (NO_SerializedExperiment && typeof playerKevlar.serializedExperimentFlags === 'string' && typeof playerKevlar.serializedExperimentIds === 'string') {
          fixSerializedExperiment(playerKevlar);
        }


      }



    };

    const controller = {
      start() {
        kc1 = setIntervalW(looperFn, 1);
        (async () => {
          while (true && !nativeFnLoaded) {
            looperFn();
            if (fStopLooper) break;
            await (new Promise(requestAnimationFrame));
          }
        })();
        looperFn();
      },
      /**
       *
       * @param {Window} __CONTEXT__
       */
      setupForCleanContext(__CONTEXT__) {

        const { requestAnimationFrame, setInterval, clearInterval, setTimeout, clearTimeout } = __CONTEXT__;

        (async () => {
          while (true) {
            looperFn();
            if (fStopLooper) break;
            await (new Promise(requestAnimationFrame));
          }
        })();

        let kc2 = setInterval(looperFn, 1);

        const marcoDisconnectFn = () => {
          if (fStopLooper) return;
          Promise.resolve().then(() => {
            if (kc1 || kc2) {
              kc1 && clearIntervalW(kc1); kc1 = 0;
              kc2 && clearInterval(kc2); kc2 = 0;
              looperFn();
            }
            fStopLooper = true;
          });
          document.removeEventListener('yt-page-data-fetched', marcoDisconnectFn, false);
          document.removeEventListener('yt-navigate-finish', marcoDisconnectFn, false);
          document.removeEventListener('spfdone', marcoDisconnectFn, false);
        };
        document.addEventListener('yt-page-data-fetched', marcoDisconnectFn, false);
        document.addEventListener('yt-navigate-finish', marcoDisconnectFn, false);
        document.addEventListener('spfdone', marcoDisconnectFn, false);


        function onReady() {
          if (!fStopLooper) {
            setTimeout(() => {
              !fStopLooper && marcoDisconnectFn();
            }, 1000);
          }
        }

        Promise.resolve().then(() => {
          if (document.readyState !== 'loading') {
            onReady();
          } else {
            window.addEventListener("DOMContentLoaded", onReady, false);
          }
        });

        nativeFnLoaded = true;

        microDisconnectFn = () => Promise.resolve(marcoDisconnectFn).then(setTimeout);

      }
    };

    return controller;
  })((config_) => {

    if (!config_.EXPERIMENT_FLAGS) return;


    const { use_maintain_stable_list, use_maintain_reuse_components, use_defer_detach } = settled;

    // i don't know why it requires to be extracted function.
    const mex = (EXPERIMENT_FLAGS, mzFlagDetected, fEntries) => {

      for (const [key, value] of fEntries) {


        if (value === true) {
          // if(key.indexOf('modern')>=0 || key.indexOf('enable')>=0 || key.indexOf('theme')>=0 || key.indexOf('skip')>=0  || key.indexOf('ui')>=0 || key.indexOf('observer')>=0 || key.indexOf('polymer')>=0 )continue;

          if (mzFlagDetected.has(key)) continue;
          mzFlagDetected.add(key);
          const kl = key.length;
          const kl7 = kl % 7;
          const kl5 = kl % 5;
          const kl3 = kl % 3;
          const kl2 = kl % 2;

          if (!DISABLE_CINEMATICS) {

            // web_watch_cinematics_disabled_by_default
            // web_watch_cinematics_preferred_reduced_motion_default_disabled

            if (key === 'kevlar_measure_ambient_mode_idle' || key === 'kevlar_watch_cinematics_invisible' || key === 'web_cinematic_theater_mode' || key === 'web_cinematic_fullscreen') {
              continue;
            }


            let cineKey = key === 'enable_cinematic_blur_desktop_loading' ? 1
              : key === 'kevlar_watch_cinematics' ? 2
                : key === 'web_cinematic_masthead' ? 3
                  : key === 'web_watch_cinematics_preferred_reduced_motion_default_disabled' ? 4 : 0;
            if (cineKey > 0) {
              return;
            }
          }

          if (key.indexOf('html5_') === 0) {


            if (IGNORE_VIDEO_SOURCE_RELATED) {
              continue;
            }

            // if(IGNORE_VIDEO_SOURCE_RELATED){
            //   if(key ==='html5_enable_vp9_fairplay') continue;
            //   if(key ==='html5_disable_av1_hdr') continue;
            //   if(key ==='html5_disable_hfr_when_vp9_encrypted_2k4k_unsupported') continue;
            //   if(key ==='html5_account_onesie_format_selection_during_format_filter') continue;
            //   if(key ==='html5_prefer_hbr_vp9_over_av1') continue;
            // }

          } else if (key.indexOf('kevlar_') === 0) {



            if (kl7 === 2 && kl5 === 2 && kl2 === 1 && kl3 === 1) {
              if (key === 'kevlar_rendererstamper_event_listener') continue; // https://github.com/cyfung1031/userscript-supports/issues/11
            }

            if (kl === 22) {
              // kevlar_enable_up_arrow - no use
              // kevlar_help_use_locale - might use
              // kevlar_refresh_gesture - might use
              // kevlar_smart_downloads - might use
              // kevlar_thumbnail_fluid
              // kevlar_ytb_live_badges

              if (key === 'kevlar_ytb_live_badges') continue;

            }


            // if (!use_maintain_stable_list) {

            if (key === 'kevlar_tuner_should_test_maintain_stable_list') continue;
            if (key === 'kevlar_should_maintain_stable_list') continue;
            if (key === 'kevlar_tuner_should_maintain_stable_list') continue; // fallback
            // }
            // if (!use_maintain_reuse_components) {

            if (key === 'kevlar_tuner_should_test_reuse_components') continue;
            if (key === 'kevlar_tuner_should_reuse_components') continue;
            if (key === 'kevlar_should_reuse_components') continue; // fallback
            // }

            if (key === 'kevlar_tuner_should_defer_detach') continue;

            if (kl7 === 5 && kl5 == 4 && kl2 === 1 && kl3 === 1) {
              if (key === 'kevlar_system_icons') continue;
            }

            // if(key==='kevlar_prefetch_data_augments_network_data') continue;

            if (kl7 === 6 && kl5 === 0 && kl3 === 2 && kl2 === 0) { // home page / watch page icons

              if (key === 'kevlar_three_dot_ink') continue;
              if (key === 'kevlar_use_wil_icons') continue;
              if (key === 'kevlar_home_skeleton') continue;
            }

            if (kl7 === 4 && kl5 === 0 && kl3 === 1 && kl2 === 1) {

              if (key === 'kevlar_fluid_touch_scroll') continue;
              if (key === 'kevlar_watch_color_update') continue;
              if (key === 'kevlar_use_vimio_behavior') continue; // home page - channel icon

            }

            if (kl3 === 2 && kl5 === 4 && kl2 < 2) {  // collapsed meta
              // no teaser, use latest collapsed meta design
              if (key === 'kevlar_structured_description_content_inline') continue;
              if (key === 'kevlar_watch_metadata_refresh') continue;

            }


            if (kl5 === 3 && kl3 === 1 && kl2 === 0) {

              if (key === 'kevlar_watch_js_panel_height') continue; // affect Tabview Youtube


            }


          } else {


            if (ALLOW_ALL_LIVE_CHATS_FLAGS && all_live_chat_flags.indexOf(key) >= 0) {
              continue;
              /*
               *
              live_chat_banner_expansion_fix
              live_chat_enable_mod_view
              live_chat_enable_qna_banner_overflow_menu_actions
              live_chat_enable_qna_channel
              live_chat_enable_send_button_in_slow_mode
              live_chat_filter_emoji_suggestions
              live_chat_increased_min_height
              live_chat_over_playlist
              live_chat_web_enable_command_handler
              live_chat_web_use_emoji_manager_singleton
              live_chat_whole_message_clickable

              */
            }

            if (kl7 === 1 && kl5 === 1 && kl2 === 0 && kl3 === 0) {
              if (key === 'live_chat_web_enable_command_handler') continue;

            }
            if (kl7 === 1 && kl5 === 4 && kl3 === 2 && kl2 === 1) {

              if (key === 'shorts_desktop_watch_while_p2') continue;
            }

            if (key === 'web_button_rework') continue;

            if (kl7 === 3 && kl5 == 1 && kl2 === 1 && kl3 === 1) {
              if (key === 'web_darker_dark_theme_live_chat') continue;
            }

            if (kl5 === 1 && kl3 === 0 && kl2 === 1 && kl7 === 0) {
              if (key === 'web_darker_dark_theme') return; // it also affect cinemtaics
            }

            if (kl3 === 0 && kl5 === 2) {  // modern menu

              if (key === 'web_button_rework_with_live') continue;
              if (key === 'web_fix_fine_scrubbing_drag') continue;
            }


            if (kl3 === 1 && kl5 === 4 && kl2 === 1) {  // full screen -buggy
              if (key === 'external_fullscreen') continue;
            }

            if (kl3 === 0 && kl5 === 3 && kl2 === 0) { // minimize menu
              if (key === 'web_modern_buttons') continue;
              if (key === 'web_modern_dialogs') continue;

            }

            if (kl3 === 1 && kl5 === 0 && kl7 === 5 && kl2 === 0) { // Tabview Youtube - multiline transcript
              if (key === 'enable_mixed_direction_formatted_strings') continue;
            }

            if (key === 'enable_unknown_lact_fix_on_html5') continue;

          }

          if (key === 'live_chat_chunk_across_update_interval') continue;

          if (key === 'enable_native_live_chat_on_kevlar') continue;

          if (key === 'live_chat_author_name_color_usernames') continue;
          if (key === 'live_chat_seed_color_usernames') continue;
          if (key === 'live_chat_colored_usernames') continue;
          if (key === 'live_chat_simple_color_usernames') continue;
          if (key === 'web_button_rework_with_live') continue;
          if (key === 'live_chat_hide_avatars') continue;
          if (key === 'live_chat_enable_qna_replay') continue;
          if (key === 'live_chat_aggregation') continue;
          if (key === 'live_chat_web_use_emoji_manager_singleton') continue;
          if (key === 'enable_docked_chat_messages') continue;
          if (key === 'live_chat_taller_emoji_picker') continue;
          if (key === 'live_chat_emoji_picker_restyle') continue;
          if (key === 'live_chat_emoji_picker_restyle_remain_open_on_send') continue;
          if (key === 'live_chat_web_input_update') continue;
          if (key === 'live_chat_enable_send_button_in_slow_mode') continue;

          if (key === 'kevlar_watch_metadata_refresh_no_old_primary_data') continue;
          if (key === 'kevlar_watch_metadata_refresh_no_old_secondary_data') continue;
          if (key === 'enable_web_cosmetic_refresh_hashtag_page') continue;
          if (key === 'kevlar_watch_metadata_refresh_description_lines') continue;




          if (key === 'enable_service_ajax_csn') continue;

          if (key === 'kevlar_use_vimio_behavior') continue;

          if (key === 'web_use_cache_for_image_fallback') continue;
          if (key === 'kevlar_woffle_fallback_image') continue;
          if (key === 'yt_img_shadow_trigger_show_on_visible') continue;
          if (key === 'kevlar_thumbnail_bg') continue;
          if (key === 'web_rounded_thumbnails') continue;



          if (key === 'kevlar_rendererstamper_event_listener') continue;

          if (key === 'dialog_behavior_no_tap_killswitch') continue;

          if (key === 'handle_service_request_actions') continue;

          if (key === 'live_chat_whole_message_clickable') continue;

          if (key === 'live_chat_require_space_for_autocomplete_emoji') continue;

          if (key === 'kevlar_keyboard_button_focus') continue;

          if (key === 'live_chat_emoji_picker_toggle_state') continue;
          if (key === 'super_sticker_emoji_picker_category_button_icon_filled') continue;
          if (key === 'enable_super_chat_buy_flow_revamp_web') continue;


          if (key === 'web_modern_buttons') continue;


          if (key === 'web_modern_dialogs') continue;
          if (key === 'live_chat_disable_chat_feed_animation') continue;
          if (key === 'live_chat_overflow_hide_chat') continue;
          if (key === 'web_darker_dark_theme_live_chat') continue;
          if (key === 'live_chat_channel_activity') continue;
          if (key === 'live_chat_emoji_picker_restyle_remain_open_on_click_to_input_area') continue;
          if (key === 'live_chat_top_chat_sampling_enabled') continue;

          if (key === 'live_chat_enable_mod_view') continue;
          if (key === 'live_chat_web_enable_command_handler_action_handling') continue;
          if (key === 'web_modern_dialogs') continue;
          if (key === 'web_modern_dialog_layout') continue;
          if (key === 'web_modern_typography') continue;

          if (key === 'kevlar_disable_component_resizing_support') continue;
          if (key === 'web_rounded_thumbnails') continue;
          if (key === 'enable_quiz_desktop_animation') continue;
          if (key === 'kevlar_thumbnail_fluid') continue;
          if (key === 'web_enable_playlist_video_lockup_equalizer') continue;
          if (key === 'web_modern_collections_v2') continue;
          if (key === 'animated_live_badge_icon') continue;
          if (key === 'use_color_palettes_modern_collections_v2') continue;
          if (key === 'web_amsterdam_post_mvp_playlists') continue;
          if (key === 'enable_desktop_search_bigger_thumbs') continue;
          if (key === 'web_animated_actions') continue;
          if (key === 'mweb_animated_actions') continue;
          if (key === 'enable_desktop_amsterdam_info_panels') continue;

          if (key === 'kevlar_modern_sd') continue;
          if (key === 'problem_walkthrough_sd') continue;
          if (key === 'polymer_video_renderer_defer_menu') continue;


          if (key === 'enable_html5_teal_ad_badge') continue;
          if (key === 'kevlar_ytb_live_badges') continue;
          if (key === 'live_chat_enable_new_moderator_badge') continue;
          if (key === 'live_chat_prepend_badges') continue;
          if (key === 'live_chat_bold_color_usernames') continue;
          if (key === 'render_custom_emojis_as_small_images') continue;

          if (key === 'web_enable_dynamic_metadata') continue;



          // console.log(key)
          EXPERIMENT_FLAGS[key] = false;
        }
      }
    }

    const mey = (EXPERIMENT_FLAGS, mzFlagDetected) => {

      EXPERIMENT_FLAGS.kevlar_unified_player = true;


      EXPERIMENT_FLAGS.defer_menus = true;
      EXPERIMENT_FLAGS.defer_overlays = true;
      EXPERIMENT_FLAGS.faster_load_overlay = true;
      EXPERIMENT_FLAGS.disable_moving_thumbs_handling = true;
      EXPERIMENT_FLAGS.polymer_video_renderer_defer_menu = true;
      EXPERIMENT_FLAGS.web_announce_stop_seeing_this_ad_text_a11y_bugfix = true;

      EXPERIMENT_FLAGS.disable_chips_intersection_observer = true;

      EXPERIMENT_FLAGS.live_chat_top_chat_sampling_enabled = true;

      EXPERIMENT_FLAGS.kevlar_dropdown_fix = true;

      EXPERIMENT_FLAGS.debug_forward_web_query_parameters = false;
      EXPERIMENT_FLAGS.cancel_pending_navs = true;
      EXPERIMENT_FLAGS.web_no_lock_on_touchstart_killswitch = false;



      // EXPERIMENT_FLAGS.live_chat_author_name_color_usernames = true;
      // EXPERIMENT_FLAGS.live_chat_seed_color_usernames = true;
      // EXPERIMENT_FLAGS.live_chat_colored_usernames = true;
      // EXPERIMENT_FLAGS.live_chat_simple_color_usernames = true;
      // live_chat_hide_avatars
      if (ENABLE_MINOR_CHAT_FEATURE_UPGRADE) {



        // EXPERIMENT_FLAGS.mweb_wiz_skip_render = true;
        // EXPERIMENT_FLAGS.kevlar_wiz_prototype_enable_all_components= true;
        // EXPERIMENT_FLAGS.kevlar_wiz_enable_on_demand_alternative_components= true;

        EXPERIMENT_FLAGS.web_enable_dynamic_metadata = true;

        EXPERIMENT_FLAGS.web_supports_animations_api = true;
        EXPERIMENT_FLAGS.smartimation_background = true;
        EXPERIMENT_FLAGS.register_web_smartimations_component = true;

        EXPERIMENT_FLAGS.enable_native_live_chat_on_kevlar = true;

        EXPERIMENT_FLAGS.live_chat_enable_qna_replay = true;
        EXPERIMENT_FLAGS.live_chat_aggregation = true;
        EXPERIMENT_FLAGS.live_chat_web_use_emoji_manager_singleton = true;
        // EXPERIMENT_FLAGS.enable_docked_chat_messages = true;

        EXPERIMENT_FLAGS.live_chat_mention_regex_update = true;

      }

      // EXPERIMENT_FLAGS.live_chat_taller_emoji_picker = true;
      // EXPERIMENT_FLAGS.live_chat_web_input_update = true;

      if (ENABLE_EMOJI_PICKER_NEW_STYLE) {

        EXPERIMENT_FLAGS.live_chat_emoji_picker_restyle = true;
        EXPERIMENT_FLAGS.live_chat_emoji_picker_restyle_remain_open_on_send = true;
        EXPERIMENT_FLAGS.live_chat_taller_emoji_picker = false;

      }

      if (ENABLE_BADGE_STYLE) {

        EXPERIMENT_FLAGS.enable_html5_teal_ad_badge = true;
        EXPERIMENT_FLAGS.kevlar_ytb_live_badges = true;
        EXPERIMENT_FLAGS.live_chat_enable_new_moderator_badge = true;
        EXPERIMENT_FLAGS.live_chat_prepend_badges = true;

        EXPERIMENT_FLAGS.live_chat_bold_color_usernames = true;
        EXPERIMENT_FLAGS.render_custom_emojis_as_small_images = true;


      }

      // EXPERIMENT_FLAGS.kevlar_wiz_prototype_enable_all_components = true;


      EXPERIMENT_FLAGS.html5_allow_asmjs = true;
      EXPERIMENT_FLAGS.html5_honor_caption_availabilities_in_audio_track = true;
      EXPERIMENT_FLAGS.web_player_hide_nitrate_promo_tooltip = true;
      EXPERIMENT_FLAGS.html5_enable_vod_slar_with_notify_pacf = true;
      EXPERIMENT_FLAGS.html5_recognize_predict_start_cue_point = true;
      EXPERIMENT_FLAGS.enable_player_logging_lr_home_infeed_ads = false;

      EXPERIMENT_FLAGS.log_gel_compression_latency = true;
      EXPERIMENT_FLAGS.log_gel_compression_latency_lr = true;
      EXPERIMENT_FLAGS.log_jspb_serialize_latency = true;

      if (NO_REFRESH) {

        EXPERIMENT_FLAGS.kevlar_watch_metadata_refresh_standardized_body_typography = false;
        EXPERIMENT_FLAGS.kevlar_refresh_gesture = false;


      }

      // EXPERIMENT_FLAGS.kevlar_watch_metadata_refresh_no_old_primary_data = true;
      // EXPERIMENT_FLAGS.kevlar_watch_metadata_refresh_no_old_secondary_data = true;
      // EXPERIMENT_FLAGS.enable_web_cosmetic_refresh_hashtag_page = true;
      // EXPERIMENT_FLAGS.kevlar_watch_metadata_refresh_description_lines = true;




      EXPERIMENT_FLAGS.desktop_delay_player_resizing = false;
      EXPERIMENT_FLAGS.web_animated_like = false;
      EXPERIMENT_FLAGS.web_animated_like_lazy_load = false;

      if (use_maintain_stable_list) {
        if (USE_MAINTAIN_STABLE_LIST_ONLY_WHEN_KS_FLAG_IS_SET ? EXPERIMENT_FLAGS.kevlar_should_maintain_stable_list === true : true) {
          EXPERIMENT_FLAGS.kevlar_tuner_should_test_maintain_stable_list = true;
          EXPERIMENT_FLAGS.kevlar_should_maintain_stable_list = true;
          EXPERIMENT_FLAGS.kevlar_tuner_should_maintain_stable_list = true; // fallback
        }
      }

      if (use_maintain_reuse_components) {
        EXPERIMENT_FLAGS.kevlar_tuner_should_test_reuse_components = true;
        EXPERIMENT_FLAGS.kevlar_tuner_should_reuse_components = true;
        EXPERIMENT_FLAGS.kevlar_should_reuse_components = true; // fallback
      }

      if (use_defer_detach) {
        EXPERIMENT_FLAGS.kevlar_tuner_should_defer_detach = true;
      }

      // EXPERIMENT_FLAGS.kevlar_prefetch_data_augments_network_data = true; // TBC

      EXPERIMENT_FLAGS.kevlar_clear_non_displayable_url_params = true;
      EXPERIMENT_FLAGS.kevlar_clear_duplicate_pref_cookie = true;
      // EXPERIMENT_FLAGS.kevlar_unified_player_clear_watch_next_killswitch = true;
      EXPERIMENT_FLAGS.kevlar_player_playlist_use_local_index = true;
      // EXPERIMENT_FLAGS.kevlar_non_watch_unified_player = true;
      // EXPERIMENT_FLAGS.kevlar_player_update_killswitch = true;

      EXPERIMENT_FLAGS.web_secure_pref_cookie_killswitch = true;
      EXPERIMENT_FLAGS.ytidb_clear_optimizations_killswitch = true;
      // EXPERIMENT_FLAGS.defer_overlays = true;


    }
    const setterFn = (EXPERIMENT_FLAGS, mzFlagDetected) => {

      const fEntries = Object.entries(EXPERIMENT_FLAGS);
      mex(EXPERIMENT_FLAGS, mzFlagDetected, fEntries);
      mey(EXPERIMENT_FLAGS, mzFlagDetected);

    };

    setterFn(config_.EXPERIMENT_FLAGS, mzFlagDetected1);

    if (config_.EXPERIMENTS_FORCED_FLAGS) setterFn(config_.EXPERIMENTS_FORCED_FLAGS, mzFlagDetected2);


  });

  hLooper.start();


  const cleanContext = async (win) => {
    const waitFn = requestAnimationFrame; // shall have been binded to window
    try {
      let mx = 16; // MAX TRIAL
      const frameId = 'vanillajs-iframe-v1'
      let frame = document.getElementById(frameId);
      let removeIframeFn = null;
      if (!frame) {
        frame = document.createElement('iframe');
        frame.id = frameId;
        const blobURL = typeof webkitCancelAnimationFrame === 'function' ? (frame.src = URL.createObjectURL(new Blob([], { type: 'text/html' }))) : null; // avoid Brave Crash
        frame.sandbox = 'allow-same-origin'; // script cannot be run inside iframe but API can be obtained from iframe
        let n = document.createElement('noscript'); // wrap into NOSCRPIT to avoid reflow (layouting)
        n.appendChild(frame);
        while (!document.documentElement && mx-- > 0) await new Promise(waitFn); // requestAnimationFrame here could get modified by YouTube engine
        const root = document.documentElement;
        root.appendChild(n); // throw error if root is null due to exceeding MAX TRIAL
        if (blobURL) Promise.resolve().then(() => URL.revokeObjectURL(blobURL));

        removeIframeFn = (setTimeout) => {
          const removeIframeOnDocumentReady = (e) => {
            e && win.removeEventListener("DOMContentLoaded", removeIframeOnDocumentReady, false);
            win = null;
            const m = n;
            n = null;
            setTimeout(() => m.remove(), 200);
          }
          if (document.readyState !== 'loading') {
            removeIframeOnDocumentReady();
          } else {
            win.addEventListener("DOMContentLoaded", removeIframeOnDocumentReady, false);
          }
        }
      }
      while (!frame.contentWindow && mx-- > 0) await new Promise(waitFn);
      const fc = frame.contentWindow;
      if (!fc) throw "window is not found."; // throw error if root is null due to exceeding MAX TRIAL
      const { requestAnimationFrame, setInterval, setTimeout, clearInterval, clearTimeout } = fc;
      const res = { requestAnimationFrame, setInterval, setTimeout, clearInterval, clearTimeout };
      for (let k in res) res[k] = res[k].bind(win); // necessary
      if (removeIframeFn) Promise.resolve(res.setTimeout).then(removeIframeFn);
      return res;
    } catch (e) {
      console.warn(e);
      return null;
    }
  };

  cleanContext(win).then(__CONTEXT__ => {

    const { requestAnimationFrame, setInterval, clearInterval, setTimeout, clearTimeout } = __CONTEXT__;

    hLooper.setupForCleanContext(__CONTEXT__)

  });


  if (isMainWindow) {

    console.groupCollapsed(
      "%cYouTube EXPERIMENT_FLAGS Tamer",
      "background-color: #EDE43B ; color: #000 ; font-weight: bold ; padding: 4px ;"
    );

    console.log("Script is loaded.");
    console.log("This might affect the new features when YouTube rolls them out to general users.");
    console.log("If you found any issue in using YouTube, please disable this script to check whether the issue is due to this script or not.");

    console.groupEnd();

  }

})(null);