/** * Astra Addon Updates * * Functions for updating data, used by the background updater. * * @package Astra Addon * @version 2.1.3 */ defined( 'ABSPATH' ) || exit; /** * Do not apply new default colors to the Elementor & Gutenberg Buttons for existing users. * * @since 2.1.4 * * @return void */ function astra_addon_page_builder_button_color_compatibility() { $theme_options = get_option( 'astra-settings', array() ); // Set flag to not load button specific CSS. if ( ! isset( $theme_options['pb-button-color-compatibility-addon'] ) ) { $theme_options['pb-button-color-compatibility-addon'] = false; error_log( 'Astra Addon: Page Builder button compatibility: false' ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log update_option( 'astra-settings', $theme_options ); } } /** * Apply Desktop + Mobile to parallax device. * * @since 2.3.0 * * @return bool */ function astra_addon_page_header_parallax_device() { $posts = get_posts( array( 'post_type' => 'astra_adv_header', 'numberposts' => -1, ) ); foreach ( $posts as $post ) { $ids = $post->ID; if ( false == $ids ) { return false; } $settings = get_post_meta( $ids, 'ast-advanced-headers-design', true ); if ( isset( $settings['parallax'] ) && $settings['parallax'] ) { $settings['parallax-device'] = 'both'; } else { $settings['parallax-device'] = 'none'; } update_post_meta( $ids, 'ast-advanced-headers-design', $settings ); } } /** * Migrate option data from Content background option to its desktop counterpart. * * @since 2.4.0 * * @return void */ function astra_responsive_content_background_option() { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound $theme_options = get_option( 'astra-settings', array() ); if ( false === get_option( 'content-bg-obj-responsive', false ) && isset( $theme_options['content-bg-obj'] ) ) { $theme_options['content-bg-obj-responsive']['desktop'] = $theme_options['content-bg-obj']; $theme_options['content-bg-obj-responsive']['tablet'] = array( 'background-color' => '', 'background-image' => '', 'background-repeat' => 'repeat', 'background-position' => 'center center', 'background-size' => 'auto', 'background-attachment' => 'scroll', ); $theme_options['content-bg-obj-responsive']['mobile'] = array( 'background-color' => '', 'background-image' => '', 'background-repeat' => 'repeat', 'background-position' => 'center center', 'background-size' => 'auto', 'background-attachment' => 'scroll', ); } update_option( 'astra-settings', $theme_options ); } /** * Migrate multisite css file generation option to sites indiviually. * * @since 2.3.3 * * @return void */ function astra_addon_css_gen_multi_site_fix() { if ( is_multisite() ) { $is_css_gen_enabled = get_site_option( '_astra_file_generation', 'disable' ); if ( 'enable' === $is_css_gen_enabled ) { update_option( '_astra_file_generation', $is_css_gen_enabled ); error_log( 'Astra Addon: CSS file generation: enable' ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log } } } /** * Check if we need to change the default value for tablet breakpoint. * * @since 2.4.0 * @return void */ function astra_addon_update_theme_tablet_breakpoint() { $theme_options = get_option( 'astra-settings' ); if ( ! isset( $theme_options['can-update-addon-tablet-breakpoint'] ) ) { // Set a flag to check if we need to change the addon tablet breakpoint value. $theme_options['can-update-addon-tablet-breakpoint'] = false; } update_option( 'astra-settings', $theme_options ); } /** * Apply missing editor_type post meta to having code enabled custom layout posts. * * @since 2.5.0 * * @return bool */ function custom_layout_compatibility_having_code_posts() { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound $posts = get_posts( array( 'post_type' => 'astra-advanced-hook', 'numberposts' => -1, ) ); foreach ( $posts as $post ) { $post_id = $post->ID; if ( ! $post_id ) { return; } $post_with_code_editor = get_post_meta( $post_id, 'ast-advanced-hook-with-php', true ); if ( isset( $post_with_code_editor ) && 'enabled' === $post_with_code_editor ) { update_post_meta( $post_id, 'editor_type', 'code_editor' ); } else { update_post_meta( $post_id, 'editor_type', 'wordpress_editor' ); } } } /** * Added new submenu color options for Page Headers. * * @since 2.5.0 * * @return bool */ function astra_addon_page_header_submenu_color_options() { $posts = get_posts( array( 'post_type' => 'astra_adv_header', 'numberposts' => -1, ) ); foreach ( $posts as $post ) { $id = $post->ID; if ( false == $id ) { return false; } $settings = get_post_meta( $id, 'ast-advanced-headers-design', true ); if ( ( isset( $settings['primary-menu-h-color'] ) && $settings['primary-menu-h-color'] ) && ! isset( $settings['primary-menu-a-color'] ) ) { $settings['primary-menu-a-color'] = $settings['primary-menu-h-color']; } if ( ( isset( $settings['above-header-h-color'] ) && $settings['above-header-h-color'] ) && ! isset( $settings['above-header-a-color'] ) ) { $settings['above-header-a-color'] = $settings['above-header-h-color']; } if ( ( isset( $settings['below-header-h-color'] ) && $settings['below-header-h-color'] ) && ! isset( $settings['below-header-a-color'] ) ) { $settings['below-header-a-color'] = $settings['below-header-h-color']; } update_post_meta( $id, 'ast-advanced-headers-design', $settings ); } } /** * Manage flags & run backward compatibility process for following cases. * * 1. Sticky header inheriting colors in normal headers as well. * * @since 2.6.0 * @return void */ function astra_addon_header_css_optimizations() { $theme_options = get_option( 'astra-settings' ); if ( ! isset( $theme_options['can-inherit-sticky-colors-in-header'] ) && ( ( isset( $theme_options['header-above-stick'] ) && $theme_options['header-above-stick'] ) || ( isset( $theme_options['header-main-stick'] ) && $theme_options['header-main-stick'] ) || ( isset( $theme_options['header-below-stick'] ) && $theme_options['header-below-stick'] ) ) && ( ( ( isset( $theme_options['sticky-above-header-megamenu-heading-color'] ) && '' !== $theme_options['sticky-above-header-megamenu-heading-color'] ) || ( isset( $theme_options['sticky-above-header-megamenu-heading-h-color'] ) && '' !== $theme_options['sticky-above-header-megamenu-heading-h-color'] ) ) || ( ( isset( $theme_options['sticky-primary-header-megamenu-heading-color'] ) && '' !== $theme_options['sticky-primary-header-megamenu-heading-color'] ) || ( isset( $theme_options['sticky-primary-header-megamenu-heading-h-color'] ) && '' !== $theme_options['sticky-primary-header-megamenu-heading-h-color'] ) ) || ( ( isset( $theme_options['sticky-below-header-megamenu-heading-color'] ) && '' !== $theme_options['sticky-below-header-megamenu-heading-color'] ) || ( isset( $theme_options['sticky-below-header-megamenu-heading-h-color'] ) && '' !== $theme_options['sticky-below-header-megamenu-heading-h-color'] ) ) ) ) { // Set a flag to inherit sticky colors in the normal header as well. $theme_options['can-inherit-sticky-colors-in-header'] = true; } update_option( 'astra-settings', $theme_options ); } /** * Page Header's color options compatibility with new Header builder layout. * * @since 3.5.0 * @return void */ function astra_addon_page_headers_support_to_builder_layout() { $theme_options = get_option( 'astra-settings' ); if ( ! isset( $theme_options['can-update-page-header-compatibility-to-header-builder'] ) ) { // Set a flag to avoid direct changes on frontend. $theme_options['can-update-page-header-compatibility-to-header-builder'] = true; } update_option( 'astra-settings', $theme_options ); } /** * Do not apply new font-weight heading support CSS in editor/frontend directly. * * 1. Adding Font-weight support to widget titles. * 2. Customizer font CSS not supporting in editor. * * @since 3.5.1 * * @return void */ function astra_addon_headings_font_support() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['can-support-widget-and-editor-fonts'] ) ) { $theme_options['can-support-widget-and-editor-fonts'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Cart color not working in old header > cart widget. As this change can reflect on frontend directly, adding this backward compatibility. * * @since 3.5.1 * @return void */ function astra_addon_cart_color_not_working_in_old_header() { $theme_options = get_option( 'astra-settings' ); if ( ! isset( $theme_options['can-reflect-cart-color-in-old-header'] ) ) { // Set a flag to avoid direct changes on frontend. $theme_options['can-reflect-cart-color-in-old-header'] = false; } update_option( 'astra-settings', $theme_options ); } /** * Till now "Header Sections" addon has dependency conflict with new header builder, unless & until this addon activate dynamic CSS does load for new header layouts. * As we deprecate "Header Sections" for new header builder layout, conflict appears here. * * Adding backward compatibility as changes can directly reflect on frontend. * * @since 3.5.7 * @return void */ function astra_addon_remove_header_sections_deps_new_builder() { $theme_options = get_option( 'astra-settings' ); if ( ! isset( $theme_options['remove-header-sections-deps-in-new-header'] ) ) { // Set a flag to avoid direct changes on frontend. $theme_options['remove-header-sections-deps-in-new-header'] = false; } update_option( 'astra-settings', $theme_options ); } /** * In old header for Cart widget we have background: #ffffff; for outline cart, whereas this CSS missed in new HFB > Cart element. Adding it now as per support requests. This case is only for new header builder > WooCommerce cart. * * @since 3.5.7 * @return void */ function astra_addon_outline_cart_bg_color_support() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['add-outline-cart-bg-new-header'] ) ) { $theme_options['add-outline-cart-bg-new-header'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Swap section on Mobile Device not working in old header. As this change can reflect on frontend directly, adding this backward compatibility. * * @since 3.5.7 * @return void */ function astra_addon_swap_section_not_working_in_old_header() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['support-swap-mobile-header-sections'] ) ) { $theme_options['support-swap-mobile-header-sections'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Do not apply default header site title and tag line color to sticky header for existing users. * * @since 3.5.8 * * @return void */ function astra_sticky_header_site_title_tagline_css() { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['sticky-header-default-site-title-tagline-css'] ) ) { $theme_options['sticky-header-default-site-title-tagline-css'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Migrating Builder > Account > resonsive menu color options to single color options. * Because we do not show menu on resonsive devices, whereas we trigger login link on responsive devices instead of showing menu. * * @since 3.5.9 * * @return void */ function astra_addon_remove_responsive_account_menu_colors_support() { $theme_options = get_option( 'astra-settings', array() ); $account_menu_colors = array( 'header-account-menu-color', // Menu color. 'header-account-menu-h-color', // Menu hover color. 'header-account-menu-a-color', // Menu active color. 'header-account-menu-bg-obj', // Menu background color. 'header-account-menu-h-bg-color', // Menu background hover color. 'header-account-menu-a-bg-color', // Menu background active color. 'sticky-header-account-menu-color', // Sticky menu color. 'sticky-header-account-menu-h-color', // Sticky menu hover color. 'sticky-header-account-menu-a-color', // Sticky menu active color. 'sticky-header-account-menu-bg-obj', // Sticky menu background color. 'sticky-header-account-menu-h-bg-color', // Sticky menu background hover color. 'sticky-header-account-menu-a-bg-color', // Sticky menu background active color. ); foreach ( $account_menu_colors as $color_option ) { if ( ! isset( $theme_options[ $color_option ] ) && isset( $theme_options[ $color_option . '-responsive' ]['desktop'] ) ) { $theme_options[ $color_option ] = $theme_options[ $color_option . '-responsive' ]['desktop']; } } update_option( 'astra-settings', $theme_options ); } /** * Check if old user and keep the existing product gallery layouts. * * @since 3.9.0 * @return void */ function astra_addon_update_product_gallery_layout() { $theme_options = get_option( 'astra-settings' ); if ( ! isset( $theme_options['astra-product-gallery-layout-flag'] ) ) { $theme_options['astra-product-gallery-layout-flag'] = false; } update_option( 'astra-settings', $theme_options ); } /** * Migrate old user data to new responsive format for shop's cart button padding. * * @since 3.9.0 * @return void */ function astra_addon_responsive_shop_button_padding() { $theme_options = get_option( 'astra-settings', array() ); $vertical_button_padding = isset( $theme_options['shop-button-v-padding'] ) ? $theme_options['shop-button-v-padding'] : ''; $horizontal_button_padding = isset( $theme_options['shop-button-h-padding'] ) ? $theme_options['shop-button-h-padding'] : ''; if ( ! isset( $theme_options['shop-button-padding'] ) ) { $theme_options['shop-button-padding'] = array( 'desktop' => array( 'top' => $vertical_button_padding, 'right' => $horizontal_button_padding, 'bottom' => $vertical_button_padding, 'left' => $horizontal_button_padding, ), 'tablet' => array( 'top' => '', 'right' => '', 'bottom' => '', 'left' => '', ), 'mobile' => array( 'top' => '', 'right' => '', 'bottom' => '', 'left' => '', ), 'desktop-unit' => 'px', 'tablet-unit' => 'px', 'mobile-unit' => 'px', ); update_option( 'astra-settings', $theme_options ); } } /** * Migrate old box shadow user data to new simplyfy box-shadow controls shop items shadow. * * @since 3.9.0 * @return void */ function astra_addon_shop_box_shadow_migration() { // For shop products box-shadow. $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['shop-item-box-shadow-control'] ) && isset( $theme_options['shop-product-shadow'] ) ) { $normal_shadow_x = ''; $normal_shadow_y = ''; $normal_shadow_blur = ''; $normal_shadow_spread = ''; $normal_shadow_color = 'rgba(0,0,0,.1)'; switch ( $theme_options['shop-product-shadow'] ) { case 1: $normal_shadow_x = '0'; $normal_shadow_y = '1'; $normal_shadow_blur = '3'; $normal_shadow_spread = '-2'; break; case 2: $normal_shadow_x = '0'; $normal_shadow_y = '3'; $normal_shadow_blur = '6'; $normal_shadow_spread = '-5'; break; case 3: $normal_shadow_x = '0'; $normal_shadow_y = '10'; $normal_shadow_blur = '20'; $normal_shadow_spread = ''; break; case 4: $normal_shadow_x = '0'; $normal_shadow_y = '14'; $normal_shadow_blur = '28'; $normal_shadow_spread = ''; break; case 5: $normal_shadow_x = '0'; $normal_shadow_y = '20'; $normal_shadow_blur = '30'; $normal_shadow_spread = '0'; break; default: break; } $theme_options['shop-item-box-shadow-control'] = array( 'x' => $normal_shadow_x, 'y' => $normal_shadow_y, 'blur' => $normal_shadow_blur, 'spread' => $normal_shadow_spread, ); $theme_options['shop-item-box-shadow-position'] = 'outline'; $theme_options['shop-item-box-shadow-color'] = $normal_shadow_color; update_option( 'astra-settings', $theme_options ); } // For shop products hover box-shadow. $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['shop-item-hover-box-shadow-control'] ) && isset( $theme_options['shop-product-shadow-hover'] ) ) { $normal_shadow_x = ''; $normal_shadow_y = ''; $normal_shadow_blur = ''; $normal_shadow_spread = ''; $normal_shadow_color = 'rgba(0,0,0,.1)'; switch ( $theme_options['shop-product-shadow-hover'] ) { case 1: $normal_shadow_x = '0'; $normal_shadow_y = '1'; $normal_shadow_blur = '3'; $normal_shadow_spread = '-2'; break; case 2: $normal_shadow_x = '0'; $normal_shadow_y = '3'; $normal_shadow_blur = '6'; $normal_shadow_spread = '-5'; break; case 3: $normal_shadow_x = '0'; $normal_shadow_y = '10'; $normal_shadow_blur = '20'; $normal_shadow_spread = ''; break; case 4: $normal_shadow_x = '0'; $normal_shadow_y = '14'; $normal_shadow_blur = '28'; $normal_shadow_spread = ''; break; case 5: $normal_shadow_x = '0'; $normal_shadow_y = '20'; $normal_shadow_blur = '30'; $normal_shadow_spread = '0'; break; default: break; } $theme_options['shop-item-hover-box-shadow-control'] = array( 'x' => $normal_shadow_x, 'y' => $normal_shadow_y, 'blur' => $normal_shadow_blur, 'spread' => $normal_shadow_spread, ); $theme_options['shop-item-hover-box-shadow-position'] = 'outline'; $theme_options['shop-item-hover-box-shadow-color'] = $normal_shadow_color; update_option( 'astra-settings', $theme_options ); } } /** * If old user then it keeps then default cart icon. * * @since 3.9.0 * @return void */ function astra_addon_update_woocommerce_cart_icons() { $theme_options = get_option( 'astra-settings' ); if ( ! isset( $theme_options['astra-woocommerce-cart-icons-flag'] ) ) { $theme_options['astra-woocommerce-cart-icons-flag'] = false; update_option( 'astra-settings', $theme_options ); } } /** * If old user then it keeps then default cart icon. * * @since 3.9.0 * @return void */ function astra_addon_update_toolbar_seperations() { $theme_options = get_option( 'astra-settings' ); $shop_toolbar_display = isset( $theme_options['shop-toolbar-display'] ) ? $theme_options['shop-toolbar-display'] : true; if ( ! isset( $theme_options['shop-toolbar-structure'] ) ) { if ( true === $shop_toolbar_display ) { if ( isset( $theme_options['shop-off-canvas-trigger-type'] ) && 'disable' !== $theme_options['shop-off-canvas-trigger-type'] && 'custom-class' !== $theme_options['shop-off-canvas-trigger-type'] ) { $theme_options['shop-toolbar-structure'] = array( 'filters', 'results', 'sorting', ); $theme_options['shop-toolbar-structure-with-hiddenset'] = array( 'filters' => true, 'results' => true, 'sorting' => true, 'easy_view' => false, ); } else { $theme_options['shop-toolbar-structure'] = array( 'results', 'sorting', ); $theme_options['shop-toolbar-structure-with-hiddenset'] = array( 'results' => true, 'filters' => false, 'sorting' => true, 'easy_view' => false, ); } } else { if ( isset( $theme_options['shop-off-canvas-trigger-type'] ) && 'disable' !== $theme_options['shop-off-canvas-trigger-type'] && 'custom-class' !== $theme_options['shop-off-canvas-trigger-type'] ) { $theme_options['shop-toolbar-structure'] = array( 'filters', ); $theme_options['shop-toolbar-structure-with-hiddenset'] = array( 'filters' => true, 'results' => false, 'sorting' => false, 'easy_view' => false, ); } else { $theme_options['shop-toolbar-structure'] = array(); $theme_options['shop-toolbar-structure-with-hiddenset'] = array( 'results' => false, 'filters' => false, 'sorting' => false, 'easy_view' => false, ); } } update_option( 'astra-settings', $theme_options ); } } /** * Restrict direct changes on users end so make it filterable. * * @since 3.9.0 * @return void */ function astra_addon_apply_modern_ecommerce_setup() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['modern-ecommerce-setup'] ) ) { $theme_options['modern-ecommerce-setup'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Improve active/selected variant for WooCommerce single product. * * @since 3.9.3 * @return void */ function astra_addon_update_variant_active_state() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['can-update-variant-active-style'] ) ) { $theme_options['can-update-variant-active-style'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Version 4.0.0 backward handle. * * 1. Migrating Post Structure & Meta options in title area meta parts. * 2. Migrate existing setting & do required onboarding for new admin dashboard v4.0.0 app. * * @since 4.0.0 * @return void */ function astra_addon_background_updater_4_0_0() { // Dynamic customizer migration setup starts here. $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['addon-dynamic-customizer-support'] ) ) { $theme_options['addon-dynamic-customizer-support'] = true; update_option( 'astra-settings', $theme_options ); } // Admin dashboard migration starts here. $admin_dashboard_settings = get_option( 'astra_admin_settings', array() ); if ( ! isset( $admin_dashboard_settings['addon-setup-admin-migrated'] ) ) { // Insert fallback whitelabel icon for agency users to maintain their branding. if ( is_multisite() ) { $branding = get_site_option( '_astra_ext_white_label' ); } else { $branding = get_option( '_astra_ext_white_label' ); } if ( ( isset( $branding['astra-agency']['hide_branding'] ) && true === (bool) $branding['astra-agency']['hide_branding'] ) && ! isset( $branding['astra']['icon'] ) ) { $branding['astra']['icon'] = ASTRA_EXT_URI . 'admin/core/assets/images/whitelabel-branding.svg'; if ( is_multisite() ) { update_site_option( '_astra_ext_white_label', $branding ); } else { update_option( '_astra_ext_white_label', $branding ); } } // Consider admin part from addon side migrated. $admin_dashboard_settings['addon-setup-admin-migrated'] = true; update_option( 'astra_admin_settings', $admin_dashboard_settings ); } } namespace Google\Site_Kit_Dependencies\GuzzleHttp\Psr7; use Google\Site_Kit_Dependencies\Psr\Http\Message\MessageInterface; use Google\Site_Kit_Dependencies\Psr\Http\Message\RequestInterface; use Google\Site_Kit_Dependencies\Psr\Http\Message\StreamInterface; use Google\Site_Kit_Dependencies\Psr\Http\Message\UriInterface; /** * Returns the string representation of an HTTP message. * * @param MessageInterface $message Message to convert to a string. * * @return string * * @deprecated str will be removed in guzzlehttp/psr7:2.0. Use Message::toString instead. */ function str(\Google\Site_Kit_Dependencies\Psr\Http\Message\MessageInterface $message) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Message::toString($message); } /** * Returns a UriInterface for the given value. * * This function accepts a string or UriInterface and returns a * UriInterface for the given value. If the value is already a * UriInterface, it is returned as-is. * * @param string|UriInterface $uri * * @return UriInterface * * @throws \InvalidArgumentException * * @deprecated uri_for will be removed in guzzlehttp/psr7:2.0. Use Utils::uriFor instead. */ function uri_for($uri) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Utils::uriFor($uri); } /** * Create a new stream based on the input type. * * Options is an associative array that can contain the following keys: * - metadata: Array of custom metadata. * - size: Size of the stream. * * This method accepts the following `$resource` types: * - `Psr\Http\Message\StreamInterface`: Returns the value as-is. * - `string`: Creates a stream object that uses the given string as the contents. * - `resource`: Creates a stream object that wraps the given PHP stream resource. * - `Iterator`: If the provided value implements `Iterator`, then a read-only * stream object will be created that wraps the given iterable. Each time the * stream is read from, data from the iterator will fill a buffer and will be * continuously called until the buffer is equal to the requested read size. * Subsequent read calls will first read from the buffer and then call `next` * on the underlying iterator until it is exhausted. * - `object` with `__toString()`: If the object has the `__toString()` method, * the object will be cast to a string and then a stream will be returned that * uses the string value. * - `NULL`: When `null` is passed, an empty stream object is returned. * - `callable` When a callable is passed, a read-only stream object will be * created that invokes the given callable. The callable is invoked with the * number of suggested bytes to read. The callable can return any number of * bytes, but MUST return `false` when there is no more data to return. The * stream object that wraps the callable will invoke the callable until the * number of requested bytes are available. Any additional bytes will be * buffered and used in subsequent reads. * * @param resource|string|int|float|bool|StreamInterface|callable|\Iterator|null $resource Entity body data * @param array $options Additional options * * @return StreamInterface * * @throws \InvalidArgumentException if the $resource arg is not valid. * * @deprecated stream_for will be removed in guzzlehttp/psr7:2.0. Use Utils::streamFor instead. */ function stream_for($resource = '', array $options = []) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Utils::streamFor($resource, $options); } /** * Parse an array of header values containing ";" separated data into an * array of associative arrays representing the header key value pair data * of the header. When a parameter does not contain a value, but just * contains a key, this function will inject a key with a '' string value. * * @param string|array $header Header to parse into components. * * @return array Returns the parsed header values. * * @deprecated parse_header will be removed in guzzlehttp/psr7:2.0. Use Header::parse instead. */ function parse_header($header) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Header::parse($header); } /** * Converts an array of header values that may contain comma separated * headers into an array of headers with no comma separated values. * * @param string|array $header Header to normalize. * * @return array Returns the normalized header field values. * * @deprecated normalize_header will be removed in guzzlehttp/psr7:2.0. Use Header::normalize instead. */ function normalize_header($header) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Header::normalize($header); } /** * Clone and modify a request with the given changes. * * This method is useful for reducing the number of clones needed to mutate a * message. * * The changes can be one of: * - method: (string) Changes the HTTP method. * - set_headers: (array) Sets the given headers. * - remove_headers: (array) Remove the given headers. * - body: (mixed) Sets the given body. * - uri: (UriInterface) Set the URI. * - query: (string) Set the query string value of the URI. * - version: (string) Set the protocol version. * * @param RequestInterface $request Request to clone and modify. * @param array $changes Changes to apply. * * @return RequestInterface * * @deprecated modify_request will be removed in guzzlehttp/psr7:2.0. Use Utils::modifyRequest instead. */ function modify_request(\Google\Site_Kit_Dependencies\Psr\Http\Message\RequestInterface $request, array $changes) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Utils::modifyRequest($request, $changes); } /** * Attempts to rewind a message body and throws an exception on failure. * * The body of the message will only be rewound if a call to `tell()` returns a * value other than `0`. * * @param MessageInterface $message Message to rewind * * @throws \RuntimeException * * @deprecated rewind_body will be removed in guzzlehttp/psr7:2.0. Use Message::rewindBody instead. */ function rewind_body(\Google\Site_Kit_Dependencies\Psr\Http\Message\MessageInterface $message) { \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Message::rewindBody($message); } /** * Safely opens a PHP stream resource using a filename. * * When fopen fails, PHP normally raises a warning. This function adds an * error handler that checks for errors and throws an exception instead. * * @param string $filename File to open * @param string $mode Mode used to open the file * * @return resource * * @throws \RuntimeException if the file cannot be opened * * @deprecated try_fopen will be removed in guzzlehttp/psr7:2.0. Use Utils::tryFopen instead. */ function try_fopen($filename, $mode) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Utils::tryFopen($filename, $mode); } /** * Copy the contents of a stream into a string until the given number of * bytes have been read. * * @param StreamInterface $stream Stream to read * @param int $maxLen Maximum number of bytes to read. Pass -1 * to read the entire stream. * * @return string * * @throws \RuntimeException on error. * * @deprecated copy_to_string will be removed in guzzlehttp/psr7:2.0. Use Utils::copyToString instead. */ function copy_to_string(\Google\Site_Kit_Dependencies\Psr\Http\Message\StreamInterface $stream, $maxLen = -1) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Utils::copyToString($stream, $maxLen); } /** * Copy the contents of a stream into another stream until the given number * of bytes have been read. * * @param StreamInterface $source Stream to read from * @param StreamInterface $dest Stream to write to * @param int $maxLen Maximum number of bytes to read. Pass -1 * to read the entire stream. * * @throws \RuntimeException on error. * * @deprecated copy_to_stream will be removed in guzzlehttp/psr7:2.0. Use Utils::copyToStream instead. */ function copy_to_stream(\Google\Site_Kit_Dependencies\Psr\Http\Message\StreamInterface $source, \Google\Site_Kit_Dependencies\Psr\Http\Message\StreamInterface $dest, $maxLen = -1) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Utils::copyToStream($source, $dest, $maxLen); } /** * Calculate a hash of a stream. * * This method reads the entire stream to calculate a rolling hash, based on * PHP's `hash_init` functions. * * @param StreamInterface $stream Stream to calculate the hash for * @param string $algo Hash algorithm (e.g. md5, crc32, etc) * @param bool $rawOutput Whether or not to use raw output * * @return string Returns the hash of the stream * * @throws \RuntimeException on error. * * @deprecated hash will be removed in guzzlehttp/psr7:2.0. Use Utils::hash instead. */ function hash(\Google\Site_Kit_Dependencies\Psr\Http\Message\StreamInterface $stream, $algo, $rawOutput = \false) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Utils::hash($stream, $algo, $rawOutput); } /** * Read a line from the stream up to the maximum allowed buffer length. * * @param StreamInterface $stream Stream to read from * @param int|null $maxLength Maximum buffer length * * @return string * * @deprecated readline will be removed in guzzlehttp/psr7:2.0. Use Utils::readLine instead. */ function readline(\Google\Site_Kit_Dependencies\Psr\Http\Message\StreamInterface $stream, $maxLength = null) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Utils::readLine($stream, $maxLength); } /** * Parses a request message string into a request object. * * @param string $message Request message string. * * @return Request * * @deprecated parse_request will be removed in guzzlehttp/psr7:2.0. Use Message::parseRequest instead. */ function parse_request($message) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Message::parseRequest($message); } /** * Parses a response message string into a response object. * * @param string $message Response message string. * * @return Response * * @deprecated parse_response will be removed in guzzlehttp/psr7:2.0. Use Message::parseResponse instead. */ function parse_response($message) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Message::parseResponse($message); } /** * Parse a query string into an associative array. * * If multiple values are found for the same key, the value of that key value * pair will become an array. This function does not parse nested PHP style * arrays into an associative array (e.g., `foo[a]=1&foo[b]=2` will be parsed * into `['foo[a]' => '1', 'foo[b]' => '2'])`. * * @param string $str Query string to parse * @param int|bool $urlEncoding How the query string is encoded * * @return array * * @deprecated parse_query will be removed in guzzlehttp/psr7:2.0. Use Query::parse instead. */ function parse_query($str, $urlEncoding = \true) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Query::parse($str, $urlEncoding); } /** * Build a query string from an array of key value pairs. * * This function can use the return value of `parse_query()` to build a query * string. This function does not modify the provided keys when an array is * encountered (like `http_build_query()` would). * * @param array $params Query string parameters. * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986 * to encode using RFC3986, or PHP_QUERY_RFC1738 * to encode using RFC1738. * * @return string * * @deprecated build_query will be removed in guzzlehttp/psr7:2.0. Use Query::build instead. */ function build_query(array $params, $encoding = \PHP_QUERY_RFC3986) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Query::build($params, $encoding); } /** * Determines the mimetype of a file by looking at its extension. * * @param string $filename * * @return string|null * * @deprecated mimetype_from_filename will be removed in guzzlehttp/psr7:2.0. Use MimeType::fromFilename instead. */ function mimetype_from_filename($filename) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\MimeType::fromFilename($filename); } /** * Maps a file extensions to a mimetype. * * @param $extension string The file extension. * * @return string|null * * @link http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types * @deprecated mimetype_from_extension will be removed in guzzlehttp/psr7:2.0. Use MimeType::fromExtension instead. */ function mimetype_from_extension($extension) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\MimeType::fromExtension($extension); } /** * Parses an HTTP message into an associative array. * * The array contains the "start-line" key containing the start line of * the message, "headers" key containing an associative array of header * array values, and a "body" key containing the body of the message. * * @param string $message HTTP request or response to parse. * * @return array * * @internal * * @deprecated _parse_message will be removed in guzzlehttp/psr7:2.0. Use Message::parseMessage instead. */ function _parse_message($message) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Message::parseMessage($message); } /** * Constructs a URI for an HTTP request message. * * @param string $path Path from the start-line * @param array $headers Array of headers (each value an array). * * @return string * * @internal * * @deprecated _parse_request_uri will be removed in guzzlehttp/psr7:2.0. Use Message::parseRequestUri instead. */ function _parse_request_uri($path, array $headers) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Message::parseRequestUri($path, $headers); } /** * Get a short summary of the message body. * * Will return `null` if the response is not printable. * * @param MessageInterface $message The message to get the body summary * @param int $truncateAt The maximum allowed size of the summary * * @return string|null * * @deprecated get_message_body_summary will be removed in guzzlehttp/psr7:2.0. Use Message::bodySummary instead. */ function get_message_body_summary(\Google\Site_Kit_Dependencies\Psr\Http\Message\MessageInterface $message, $truncateAt = 120) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Message::bodySummary($message, $truncateAt); } /** * Remove the items given by the keys, case insensitively from the data. * * @param iterable $keys * * @return array * * @internal * * @deprecated _caseless_remove will be removed in guzzlehttp/psr7:2.0. Use Utils::caselessRemove instead. */ function _caseless_remove($keys, array $data) { return \Google\Site_Kit_Dependencies\GuzzleHttp\Psr7\Utils::caselessRemove($keys, $data); } /*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Supprimez "+t+" caractère"+(t>1)?"s":""},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Saisissez au moins "+t+" caractère"+(t>1)?"s":""},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1)?"s":""},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),{define:e.define,require:e.require}})(); ᐈ Tomb Raider Condition 95 22% RTP Yachting real money casino Real cash Games - Trickie Tech
Search
Close this search box.
Search
Close this search box.

ᐈ Tomb Raider Condition 95 22% RTP Yachting real money casino Real cash Games

The bottom game signs is the cards reviews, away from ten in order to ace. Three or higher scatters unlocks the newest 100 percent free Revolves added bonus round. For many who hit four scatters, you winnings 400x. If you strike two, your earn 2x your own bet. Although this games ‘s been around to discover the best part of 20 years, it nevertheless includes each other a crazy and an excellent scatter.

Games historian Matt Barton go to my site determined that “the online game put other first for it form of region-to play game, and discovered just how much place is largely leftover for advancement”. Educated advantages tend to familiarizes you with the brand new paytable, the fresh gameplay, symbol program, special features, RTP, volatility, and you can everything linked to your favorite demonstration reputation. Put a timekeeper for taking holidays and stay clear, otherwise make use of the casino’s in control gambling procedures to keep the fresh free slots fun. Conventional hosts work with straightforward step, while you are modern movies harbors introduce multiple reels, inspired photo, and you will superimposed incentive features. For individuals who’re a fan of the online game franchise, you’ll surely love this particular position twist-from.

Yachting real money casino – Tomb Raider Cellular Position

  • Microgaming’s Tomb Raider slot video game was launched inside the 2004 36 months following the film and you will is actually a hit experience that have state-of-the-ways picture.
  • Without a large amount, that is decent for a non-modern jackpot slot with a higher chance of victory that every larger jackpots offered.
  • Considering the enough time-online game facet of the head incentive element, it slot machine game has the lowest difference and you will an extraordinary RTP away from 95.23%.
  • There are two extra game, which are one another very simple and give you the chance to home huge victories.
  • I am at the least 18 years of age and you will legally permitted to gamble within the a casino
  • Once you play online slots for real money, we want to win, and you may Lara Croft will assist you to do as often.

The newest Crazy icon ‘s the Tomb Raider signal as well as the on the web slot’s jackpot from the 400x your own total choice. You have scatters, wilds, 100 percent free games, and you may a plus bullet. There’s also a good Tomb Incentive, as a result of around three or even more incentive signs to your an active payline.

Yachting real money casino

Tomb Raider slots is a leading position video game from gambling establishment builders, Microgaming. The fresh soundtrack is far more of a refined cinch strike and a good mechanized voice will likely be read when players spin. The initial thing people have a tendency to notice on the Tomb Driver try an excellent extremely committed image and heavy symbols. Why are the newest Tomb Raider Slots games thus unique isn’t precisely the photos but also the more added bonus game that is triggered in the event the around three of one’s bonus idol signs appear on the new display. Five of the image icons award players 7500 gold coins, five of one’s logo designs honor people 2000 gold coins, three of the logos award participants 2 hundred gold coins and players receive 5 coins if the two of the logos property for the an energetic payline.

Tomb Raider Screenshots

Despite becoming in the industry for over 15 years, the new Microgaming position is Yachting real money casino still a great and satisfying video game to help you play. At the same time, all winnings from the 100 percent free spins round are tripled. High rollers and you can relaxed participants the same can also enjoy it low volatility position by wide bet limits. Along with, the brand new developer offers higher features, for instance the Car Play option, which helps people fulfil betting criteria.

Where Do i need to Play Tomb Raider For real Currency?

Just before i keep subsequent with this Tomb Raider slot opinion, we’d want to encourage your it absolutely was released more than a great decade back. Microgaming application is outstanding which designer is one of the most trusted and you can known video game developers available to choose from. Moving forward, there are important info to the video game. Develop one viewing the newest Tomb Raider casinos demonstrated in 2 different ways features aided the thing is that the one for your requirements.

If you’d like step-thrill templates with vintage position enjoy, Tomb Raider Slots serves up an excellent movie, reward-centered sense. Some other function regarding the games notices the fresh jackpot well worth improve the newest expanded your gamble and whenever the new jackpot mode is basically triggered, indeed five jackpots is provided ahead of resetting. Having gameplay that delivers one thing apart from some thing inside the new the newest straight, Unit try optimistic concerning your its applicants. Microgaming the most common online game company thanks to the newest detailed listing of game it’s delivered. The newest position have 15 paylines which can be modified so you can match a player’s money and you will liking.

Yachting real money casino

Mobile gamble have supported the organization out of position gambling enterprises, making it possible for profiles to access totally free slot game, incentives and you will a real income play anywhere. Very slot casinos enable it to be professionals to switch effortlessly between to play demonstration harbors and you will real money models of the identical online casino slot games, so it’s an easy task to try rather than economic risk. Tomb Raider may not have the brand new gleaming graphics of the latest on line harbors however it is however a good video game to play, due to the extra have as well as the rather epic prizes. You could retrigger the newest free games by landing a lot more book signs, that have one the brand new spins extra to the prevent of your newest bullet. It’s not really by far the most interesting added bonus video game ever before offered at an on-line position, but it can lead to honors as much as 2,500x the wager for each and every payline, therefore try well worth to try out.

Greatest Gambling enterprises to own Tomb Raider Secret of your Blade

The newest slot doesn’t come with both fixed otherwise modern jackpots. Colour pallets away from brown, light blue and you will light green provide the records graphics to this totally free slot machine game. As an alternative, bettors can also enjoy the video game on the cellphones running on the sometimes Android os or apple’s ios operating system. Separate position opinion program run because of the playing industry experts.

Tomb Added bonus Games

For many who struck various other set of Lara Pastime Scatters, you will then immediately be granted far more 100 percent free revolves. But there is stop a bit to enjoy in terms to your genuine gameplay. Having 96.56% mediocre win rate, it slot is an easy means to fix make money. This really is a fundamental build for most video game, needless to say.

Tomb Raider are enhanced to have mobile gamble, allowing you to adore it to the cellphones and you may tablets without the difficulty. Incorporating movie cut scenes within the added bonus rounds adds a supplementary covering of adventure—almost like to experience a small-motion picture inside games! The newest gaming range are flexible, starting from as little as $0.01 around $0.5 for each line—the best fit for each other cautious participants and you will highest-rollers the same. For gameplay provides, Tomb Raider will not let you down. Yes, Microgaming has completely optimized the newest Tomb Raider position video game for cellular enjoy using a web browser. Yes, there have been two fun series what are the Tomb as well as the 100 percent free revolves have.

Yachting real money casino

The new Tomb Raider slot try reducing-border if it was initially released in the 2004, and you will due to a renovate within the HTML5, now it nonetheless feels and looks very smooth. Lara Croft might have been available for a little while, but so it slot is actually cutting-boundary in some suggests. So it extra will be re also-brought about Indefinitely (sure, i manage mean forever) when by the landing three or maybe more of the scatters again.

Is All of our Appeared Game

Discover best casinos to try out and you can exclusive incentives to own February 2026. You could potentially win 10 100 percent free spins should you get about three otherwise far more scatters, as well, which have people awards you earn inside the function tripled. The new playing range initiate from the a great nickel and you can climbs to help you $37.50, and earn as much as $18,750 in a single spin! Among the better online casinos, including Mr Environmentally friendly and you will Casumo enables you to gamble. Click through and you can gamble Tomb Raider slots today. With this bullet, you have the opportunity to winnings ranging from 36 and you may 2500 extra points depending on the level of idols your strike.