From 78a744ef06fea2ff78bf87ec035c6458b9f9a21a Mon Sep 17 00:00:00 2001 From: "Hanson.xyz Dev" Date: Fri, 28 Nov 2025 17:16:24 -0600 Subject: [PATCH] Phase 6: WebP image conversion - Converter for Media plugin with Nginx rewrite rules --- DEPENDENCIES.md | 55 ++ .../site_analysis/IMPLEMENTATION-PLAN.md | 26 +- db-snapshots/db-snapshot.sql | 6 +- wp-content/.htaccess | 50 ++ .../assets/build/css/styles.css | 1 + .../assets/build/js/scripts.js | 2 + .../assets/build/js/scripts.js.LICENSE.txt | 8 + .../assets/fonts/icons/icomoon.woff | Bin 0 -> 4808 bytes .../assets/img/author.png | Bin 0 -> 15888 bytes .../assets/img/debug-htaccess/.htaccess | 1 + .../assets/img/debug-htaccess/icon-test.png2 | Bin 0 -> 21586 bytes .../assets/img/icon-test.avif | Bin 0 -> 3016 bytes .../assets/img/icon-test.png | Bin 0 -> 22104 bytes .../assets/img/icon-test.webp | Bin 0 -> 6026 bytes .../assets/img/logo-bg.png | Bin 0 -> 947 bytes .../assets/img/logo-headline.png | Bin 0 -> 10441 bytes .../webp-converter-for-media/changelog.txt | 702 ++++++++++++++++++ .../includes/passthru.php | 140 ++++ .../webp-converter-for-media/readme.txt | 367 +++++++++ .../src/Action/ConvertAttachmentAction.php | 49 ++ .../src/Action/ConvertPathsAction.php | 67 ++ .../src/Action/DeleteFileHandler.php | 31 + .../src/Action/DeletePathsAction.php | 86 +++ .../src/Action/UploadFileHandler.php | 192 +++++ .../Conversion/AttachmentPathsGenerator.php | 84 +++ .../src/Conversion/CrashedFilesOperator.php | 38 + .../Conversion/Cron/CronEventGenerator.php | 70 ++ .../src/Conversion/Cron/CronInitiator.php | 151 ++++ .../Cron/CronSchedulesGenerator.php | 36 + .../src/Conversion/Cron/CronStatusManager.php | 105 +++ .../src/Conversion/Cron/CronStatusViewer.php | 80 ++ .../Directory/DirectoryAbstract.php | 53 ++ .../Conversion/Directory/DirectoryFactory.php | 126 ++++ .../Directory/DirectoryIntegrator.php | 148 ++++ .../Directory/DirectoryInterface.php | 58 ++ .../Conversion/Directory/SourceDirectory.php | 38 + .../Conversion/Directory/UploadsDirectory.php | 48 ++ .../Directory/UploadsWebpcDirectory.php | 46 ++ .../src/Conversion/DirectoryFilesFinder.php | 99 +++ .../Endpoint/CronConversionEndpoint.php | 102 +++ .../Conversion/Endpoint/EndpointAbstract.php | 53 ++ .../Endpoint/EndpointIntegrator.php | 80 ++ .../Conversion/Endpoint/EndpointInterface.php | 70 ++ .../Endpoint/FilesStatsEndpoint.php | 70 ++ .../src/Conversion/Endpoint/PathsEndpoint.php | 103 +++ .../Endpoint/RegenerateAttachmentEndpoint.php | 82 ++ .../Endpoint/RegenerateEndpoint.php | 121 +++ .../src/Conversion/ExcludedPathsOperator.php | 105 +++ .../src/Conversion/FilesTreeFinder.php | 222 ++++++ .../src/Conversion/Format/AvifFormat.php | 64 ++ .../src/Conversion/Format/FormatAbstract.php | 36 + .../src/Conversion/Format/FormatFactory.php | 114 +++ .../src/Conversion/Format/FormatInterface.php | 39 + .../src/Conversion/Format/WebpFormat.php | 32 + .../src/Conversion/LargerFilesOperator.php | 44 ++ .../src/Conversion/Method/GdMethod.php | 229 ++++++ .../src/Conversion/Method/ImagickMethod.php | 168 +++++ .../Method/LibraryMethodAbstract.php | 64 ++ .../Method/LibraryMethodInterface.php | 32 + .../src/Conversion/Method/MethodAbstract.php | 207 ++++++ .../src/Conversion/Method/MethodFactory.php | 123 +++ .../Conversion/Method/MethodIntegrator.php | 105 +++ .../src/Conversion/Method/MethodInterface.php | 95 +++ .../src/Conversion/Method/RemoteMethod.php | 433 +++++++++++ .../src/Conversion/OutputPathGenerator.php | 148 ++++ .../src/Conversion/PathsFinder.php | 275 +++++++ .../Detector/CloudflareStatusDetector.php | 40 + .../Error/Detector/CurlLibraryDetector.php | 28 + .../src/Error/Detector/DetectorInterface.php | 16 + .../Detector/LibsNotInstalledDetector.php | 41 + .../LibsWithoutWebpSupportDetector.php | 43 ++ .../Detector/PassthruExecutionDetector.php | 88 +++ .../Error/Detector/PathsErrorsDetector.php | 78 ++ .../Error/Detector/RewritesErrorsDetector.php | 317 ++++++++ .../Detector/SettingsIncorrectDetector.php | 70 ++ .../Error/Detector/TokenStatusDetector.php | 66 ++ .../Detector/UnsupportedServerDetector.php | 22 + .../src/Error/ErrorDetectorAggregator.php | 211 ++++++ .../Error/Notice/AccessTokenInvalidNotice.php | 40 + .../Error/Notice/ApiLimitExceededNotice.php | 33 + .../Error/Notice/BypassingApacheNotice.php | 82 ++ .../CloudflareSettingsIncorrectNotice.php | 40 + .../Notice/CurlFunctionDisabledNotice.php | 41 + .../Error/Notice/LibsNotInstalledNotice.php | 45 ++ .../Notice/LibsWithoutWebpSupportNotice.php | 45 ++ .../src/Error/Notice/NoticeInterface.php | 19 + .../Error/Notice/PassthruExecutionNotice.php | 36 + .../Error/Notice/PassthruNotWorkingNotice.php | 31 + .../Notice/PathHtaccessNotWritableNotice.php | 31 + .../Notice/PathUploadsUnavailableNotice.php | 34 + .../Error/Notice/PathWebpDuplicatedNotice.php | 32 + .../Notice/PathWebpNotWritableNotice.php | 34 + .../src/Error/Notice/RewritesCachedNotice.php | 77 ++ .../Notice/RewritesNotExecutedNotice.php | 85 +++ .../Error/Notice/RewritesNotWorkingNotice.php | 33 + .../Notice/RewritesUploadsBlockedNotice.php | 37 + .../Error/Notice/SettingsIncorrectNotice.php | 47 ++ .../UnsupportedPlaygroundServerNotice.php | 31 + .../Exception/ConversionErrorException.php | 26 + .../src/Exception/ExceptionAbstract.php | 17 + .../src/Exception/ExceptionInterface.php | 30 + .../ExtensionUnsupportedException.php | 26 + .../Exception/FilesizeOversizeException.php | 31 + .../FunctionUnavailableException.php | 26 + .../src/Exception/ImageAnimatedException.php | 26 + .../src/Exception/ImageInvalidException.php | 26 + .../ImagickNotSupportWebpException.php | 26 + .../Exception/ImagickUnavailableException.php | 26 + .../Exception/LargerThanOriginalException.php | 30 + .../src/Exception/OutputPathException.php | 26 + .../RemoteErrorResponseException.php | 26 + .../src/Exception/RemoteRequestException.php | 26 + .../Exception/ResolutionOversizeException.php | 26 + .../ServerConfigurationException.php | 26 + .../src/Exception/SourcePathException.php | 26 + .../src/HookableInterface.php | 16 + .../src/Loader/HtaccessBypassingLoader.php | 109 +++ .../src/Loader/HtaccessLoader.php | 437 +++++++++++ .../src/Loader/LoaderAbstract.php | 57 ++ .../src/Loader/LoaderIntegrator.php | 77 ++ .../src/Loader/LoaderInterface.php | 51 ++ .../src/Loader/PassthruLoader.php | 161 ++++ .../src/Model/Token.php | 84 +++ .../src/Notice/BlackFridayNotice.php | 99 +++ .../src/Notice/CloudflareNotice.php | 105 +++ .../src/Notice/NoticeAbstract.php | 30 + .../src/Notice/NoticeIntegrator.php | 101 +++ .../src/Notice/NoticeInterface.php | 65 ++ .../src/Notice/ThanksNotice.php | 78 ++ .../src/Notice/TokenInactiveNotice.php | 99 +++ .../src/Notice/UpgradeNotice.php | 97 +++ .../src/Notice/WelcomeNotice.php | 77 ++ .../Activation/OutputDirectoryGenerator.php | 21 + .../Activation/PluginSettingsManager.php | 51 ++ .../src/Plugin/ActivationHandler.php | 47 ++ .../src/Plugin/Deactivation/CronManager.php | 20 + .../Deactivation/PluginSettingsManager.php | 32 + .../src/Plugin/DeactivationHandler.php | 44 ++ .../src/Plugin/PluginLinksGenerator.php | 111 +++ .../Plugin/Uninstall/DebugFilesRemover.php | 27 + .../Plugin/Uninstall/OutputFilesRemover.php | 90 +++ .../Uninstall/PluginSettingsManager.php | 70 ++ .../src/Plugin/UninstallHandler.php | 43 ++ .../src/PluginData.php | 126 ++++ .../src/PluginInfo.php | 70 ++ .../src/Repository/TokenRepository.php | 71 ++ .../src/Service/BackupExcluder.php | 78 ++ .../src/Service/CacheIntegrator.php | 86 +++ .../src/Service/CloudflareConfigurator.php | 159 ++++ .../src/Service/DeactivationModalLoader.php | 235 ++++++ .../src/Service/EnvDetector.php | 18 + .../src/Service/FileLoader.php | 186 +++++ .../src/Service/MediaStatusViewer.php | 551 ++++++++++++++ .../src/Service/OptionsAccessManager.php | 50 ++ .../src/Service/PathsGenerator.php | 69 ++ .../src/Service/RestApiUnlocker.php | 73 ++ .../src/Service/ServerConfigurator.php | 29 + .../src/Service/SiteHealthDetector.php | 90 +++ .../src/Service/StatsManager.php | 154 ++++ .../src/Service/TokenValidator.php | 86 +++ .../src/Service/ViewLoader.php | 37 + .../src/Service/WpCliManager.php | 233 ++++++ .../src/Settings/AdminAssetsLoader.php | 65 ++ .../src/Settings/Option/AccessTokenOption.php | 114 +++ .../Settings/Option/AutoConversionOption.php | 74 ++ .../Option/CloudflareApiTokenOption.php | 91 +++ .../Option/CloudflareZoneIdOption.php | 102 +++ .../Option/ConversionMethodOption.php | 130 ++++ .../Option/ExcludedDirectoriesOption.php | 103 +++ .../Settings/Option/ExtraFeaturesOption.php | 126 ++++ .../Option/HtaccessRewriteOutputOption.php | 69 ++ .../Option/HtaccessRewritePathOption.php | 69 ++ .../Option/HtaccessRewriteRootOption.php | 69 ++ .../src/Settings/Option/ImageResizeOption.php | 168 +++++ .../Settings/Option/ImagesQualityOption.php | 124 ++++ .../src/Settings/Option/LoaderTypeOption.php | 142 ++++ .../src/Settings/Option/MediaStatsOption.php | 79 ++ .../src/Settings/Option/OptionAbstract.php | 71 ++ .../src/Settings/Option/OptionIntegrator.php | 56 ++ .../src/Settings/Option/OptionInterface.php | 118 +++ .../src/Settings/Option/OptionsAggregator.php | 103 +++ .../Settings/Option/OutputFormatsOption.php | 158 ++++ .../Option/RewriteInheritanceOption.php | 82 ++ .../src/Settings/Option/ServiceModeOption.php | 78 ++ .../Option/SupportedDirectoriesOption.php | 113 +++ .../Option/SupportedExtensionsOption.php | 116 +++ .../src/Settings/OptionsManager.php | 131 ++++ .../Settings/Page/AdvancedSettingsPage.php | 41 + .../Settings/Page/BulkOptimizationPage.php | 57 ++ .../src/Settings/Page/CdnSettingsPage.php | 45 ++ .../src/Settings/Page/DebugPage.php | 125 ++++ .../src/Settings/Page/ExpertSettingsPage.php | 55 ++ .../src/Settings/Page/GeneralSettingsPage.php | 147 ++++ .../src/Settings/Page/PageAbstract.php | 30 + .../src/Settings/Page/PageIntegrator.php | 176 +++++ .../src/Settings/Page/PageInterface.php | 54 ++ .../src/Settings/SettingsManager.php | 88 +++ .../src/WebpConverter.php | 75 ++ .../src/WebpConverterConstants.php | 20 + .../templates/components/fields/checkbox.php | 32 + .../components/fields/image_size.php | 61 ++ .../templates/components/fields/input.php | 27 + .../templates/components/fields/quality.php | 71 ++ .../templates/components/fields/radio.php | 39 + .../templates/components/fields/toggle.php | 26 + .../templates/components/fields/token.php | 42 ++ .../components/notices/clear-cache.php | 50 ++ .../components/notices/discount-coupon.php | 61 ++ .../templates/components/notices/thanks.php | 54 ++ .../components/notices/token-invalid.php | 49 ++ .../templates/components/notices/upgrade.php | 66 ++ .../templates/components/notices/welcome.php | 60 ++ .../templates/components/server/debug.php | 96 +++ .../templates/components/server/filters.php | 79 ++ .../templates/components/server/gd.php | 18 + .../templates/components/server/imagick.php | 18 + .../templates/components/server/options.php | 122 +++ .../templates/components/server/php.php | 47 ++ .../templates/components/server/sub-sizes.php | 34 + .../templates/components/server/wordpress.php | 71 ++ .../templates/components/widgets/about.php | 41 + .../templates/components/widgets/errors.php | 46 ++ .../templates/components/widgets/menu.php | 30 + .../components/widgets/options-sidebar.php | 62 ++ .../templates/components/widgets/options.php | 54 ++ .../components/widgets/regenerate-popup.php | 211 ++++++ .../components/widgets/regenerate.php | 228 ++++++ .../templates/components/widgets/server.php | 64 ++ .../templates/components/widgets/support.php | 35 + .../templates/views/settings-debug.php | 67 ++ .../templates/views/settings.php | 98 +++ .../vendor/autoload.php | 22 + .../vendor/composer/ClassLoader.php | 579 +++++++++++++++ .../vendor/composer/InstalledVersions.php | 396 ++++++++++ .../vendor/composer/LICENSE | 21 + .../vendor/composer/autoload_classmap.php | 203 +++++ .../vendor/composer/autoload_namespaces.php | 9 + .../vendor/composer/autoload_psr4.php | 10 + .../vendor/composer/autoload_real.php | 36 + .../vendor/composer/autoload_static.php | 229 ++++++ .../vendor/composer/installed.json | 75 ++ .../vendor/composer/installed.php | 32 + .../assets/build/css/styles.css | 1 + .../assets/build/js/scripts.js | 1 + .../DuplicatedFormOptionKeyException.php | 10 + .../DuplicatedFormValueKeyException.php | 10 + .../UnknownFormOptionKeyException.php | 10 + .../vendor_prefixed/src/Hookable.php | 13 + .../vendor_prefixed/src/Modal.php | 49 ++ .../vendor_prefixed/src/Model/FormOption.php | 104 +++ .../vendor_prefixed/src/Model/FormOptions.php | 73 ++ .../src/Model/FormTemplate.php | 86 +++ .../vendor_prefixed/src/Model/FormValue.php | 35 + .../vendor_prefixed/src/Model/FormValues.php | 37 + .../vendor_prefixed/src/Model/RequestData.php | 75 ++ .../src/Service/AssetsPrinterService.php | 55 ++ .../src/Service/TemplateGeneratorService.php | 52 ++ .../vendor_prefixed/templates/modal.php | 164 ++++ .../webp-converter-for-media.php | 21 + wp-content/uploads-webpc/.htaccess | 14 + 260 files changed, 21138 insertions(+), 5 deletions(-) create mode 100644 DEPENDENCIES.md create mode 100644 wp-content/.htaccess create mode 100755 wp-content/plugins/webp-converter-for-media/assets/build/css/styles.css create mode 100755 wp-content/plugins/webp-converter-for-media/assets/build/js/scripts.js create mode 100755 wp-content/plugins/webp-converter-for-media/assets/build/js/scripts.js.LICENSE.txt create mode 100755 wp-content/plugins/webp-converter-for-media/assets/fonts/icons/icomoon.woff create mode 100755 wp-content/plugins/webp-converter-for-media/assets/img/author.png create mode 100755 wp-content/plugins/webp-converter-for-media/assets/img/debug-htaccess/.htaccess create mode 100755 wp-content/plugins/webp-converter-for-media/assets/img/debug-htaccess/icon-test.png2 create mode 100755 wp-content/plugins/webp-converter-for-media/assets/img/icon-test.avif create mode 100755 wp-content/plugins/webp-converter-for-media/assets/img/icon-test.png create mode 100755 wp-content/plugins/webp-converter-for-media/assets/img/icon-test.webp create mode 100755 wp-content/plugins/webp-converter-for-media/assets/img/logo-bg.png create mode 100755 wp-content/plugins/webp-converter-for-media/assets/img/logo-headline.png create mode 100755 wp-content/plugins/webp-converter-for-media/changelog.txt create mode 100755 wp-content/plugins/webp-converter-for-media/includes/passthru.php create mode 100755 wp-content/plugins/webp-converter-for-media/readme.txt create mode 100755 wp-content/plugins/webp-converter-for-media/src/Action/ConvertAttachmentAction.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Action/ConvertPathsAction.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Action/DeleteFileHandler.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Action/DeletePathsAction.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Action/UploadFileHandler.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/AttachmentPathsGenerator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/CrashedFilesOperator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronEventGenerator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronInitiator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronSchedulesGenerator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronStatusManager.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronStatusViewer.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/DirectoryAbstract.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/DirectoryFactory.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/DirectoryIntegrator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/DirectoryInterface.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/SourceDirectory.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/UploadsDirectory.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/UploadsWebpcDirectory.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/DirectoryFilesFinder.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/CronConversionEndpoint.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/EndpointAbstract.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/EndpointIntegrator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/EndpointInterface.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/FilesStatsEndpoint.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/PathsEndpoint.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/RegenerateAttachmentEndpoint.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/RegenerateEndpoint.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/ExcludedPathsOperator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/FilesTreeFinder.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Format/AvifFormat.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Format/FormatAbstract.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Format/FormatFactory.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Format/FormatInterface.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Format/WebpFormat.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/LargerFilesOperator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Method/GdMethod.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Method/ImagickMethod.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Method/LibraryMethodAbstract.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Method/LibraryMethodInterface.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Method/MethodAbstract.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Method/MethodFactory.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Method/MethodIntegrator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Method/MethodInterface.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/Method/RemoteMethod.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/OutputPathGenerator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Conversion/PathsFinder.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Detector/CloudflareStatusDetector.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Detector/CurlLibraryDetector.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Detector/DetectorInterface.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Detector/LibsNotInstalledDetector.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Detector/LibsWithoutWebpSupportDetector.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Detector/PassthruExecutionDetector.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Detector/PathsErrorsDetector.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Detector/RewritesErrorsDetector.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Detector/SettingsIncorrectDetector.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Detector/TokenStatusDetector.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Detector/UnsupportedServerDetector.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/ErrorDetectorAggregator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/AccessTokenInvalidNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/ApiLimitExceededNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/BypassingApacheNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/CloudflareSettingsIncorrectNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/CurlFunctionDisabledNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/LibsNotInstalledNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/LibsWithoutWebpSupportNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/NoticeInterface.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/PassthruExecutionNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/PassthruNotWorkingNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/PathHtaccessNotWritableNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/PathUploadsUnavailableNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/PathWebpDuplicatedNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/PathWebpNotWritableNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/RewritesCachedNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/RewritesNotExecutedNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/RewritesNotWorkingNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/RewritesUploadsBlockedNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/SettingsIncorrectNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Error/Notice/UnsupportedPlaygroundServerNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/ConversionErrorException.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/ExceptionAbstract.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/ExceptionInterface.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/ExtensionUnsupportedException.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/FilesizeOversizeException.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/FunctionUnavailableException.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/ImageAnimatedException.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/ImageInvalidException.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/ImagickNotSupportWebpException.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/ImagickUnavailableException.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/LargerThanOriginalException.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/OutputPathException.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/RemoteErrorResponseException.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/RemoteRequestException.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/ResolutionOversizeException.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/ServerConfigurationException.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Exception/SourcePathException.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/HookableInterface.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Loader/HtaccessBypassingLoader.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Loader/HtaccessLoader.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Loader/LoaderAbstract.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Loader/LoaderIntegrator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Loader/LoaderInterface.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Loader/PassthruLoader.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Model/Token.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Notice/BlackFridayNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Notice/CloudflareNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Notice/NoticeAbstract.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Notice/NoticeIntegrator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Notice/NoticeInterface.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Notice/ThanksNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Notice/TokenInactiveNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Notice/UpgradeNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Notice/WelcomeNotice.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Plugin/Activation/OutputDirectoryGenerator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Plugin/Activation/PluginSettingsManager.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Plugin/ActivationHandler.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Plugin/Deactivation/CronManager.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Plugin/Deactivation/PluginSettingsManager.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Plugin/DeactivationHandler.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Plugin/PluginLinksGenerator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Plugin/Uninstall/DebugFilesRemover.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Plugin/Uninstall/OutputFilesRemover.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Plugin/Uninstall/PluginSettingsManager.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Plugin/UninstallHandler.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/PluginData.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/PluginInfo.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Repository/TokenRepository.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Service/BackupExcluder.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Service/CacheIntegrator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Service/CloudflareConfigurator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Service/DeactivationModalLoader.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Service/EnvDetector.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Service/FileLoader.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Service/MediaStatusViewer.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Service/OptionsAccessManager.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Service/PathsGenerator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Service/RestApiUnlocker.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Service/ServerConfigurator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Service/SiteHealthDetector.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Service/StatsManager.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Service/TokenValidator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Service/ViewLoader.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Service/WpCliManager.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/AdminAssetsLoader.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/AccessTokenOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/AutoConversionOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/CloudflareApiTokenOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/CloudflareZoneIdOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/ConversionMethodOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/ExcludedDirectoriesOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/ExtraFeaturesOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/HtaccessRewriteOutputOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/HtaccessRewritePathOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/HtaccessRewriteRootOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/ImageResizeOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/ImagesQualityOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/LoaderTypeOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/MediaStatsOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/OptionAbstract.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/OptionIntegrator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/OptionInterface.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/OptionsAggregator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/OutputFormatsOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/RewriteInheritanceOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/ServiceModeOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/SupportedDirectoriesOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Option/SupportedExtensionsOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/OptionsManager.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Page/AdvancedSettingsPage.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Page/BulkOptimizationPage.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Page/CdnSettingsPage.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Page/DebugPage.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Page/ExpertSettingsPage.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Page/GeneralSettingsPage.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Page/PageAbstract.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Page/PageIntegrator.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/Page/PageInterface.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/Settings/SettingsManager.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/WebpConverter.php create mode 100755 wp-content/plugins/webp-converter-for-media/src/WebpConverterConstants.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/fields/checkbox.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/fields/image_size.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/fields/input.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/fields/quality.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/fields/radio.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/fields/toggle.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/fields/token.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/notices/clear-cache.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/notices/discount-coupon.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/notices/thanks.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/notices/token-invalid.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/notices/upgrade.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/notices/welcome.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/server/debug.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/server/filters.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/server/gd.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/server/imagick.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/server/options.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/server/php.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/server/sub-sizes.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/server/wordpress.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/widgets/about.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/widgets/errors.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/widgets/menu.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/widgets/options-sidebar.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/widgets/options.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/widgets/regenerate-popup.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/widgets/regenerate.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/widgets/server.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/components/widgets/support.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/views/settings-debug.php create mode 100755 wp-content/plugins/webp-converter-for-media/templates/views/settings.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor/autoload.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor/composer/ClassLoader.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor/composer/InstalledVersions.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor/composer/LICENSE create mode 100755 wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_classmap.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_namespaces.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_psr4.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_real.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_static.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor/composer/installed.json create mode 100755 wp-content/plugins/webp-converter-for-media/vendor/composer/installed.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor_prefixed/assets/build/css/styles.css create mode 100755 wp-content/plugins/webp-converter-for-media/vendor_prefixed/assets/build/js/scripts.js create mode 100755 wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Exception/DuplicatedFormOptionKeyException.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Exception/DuplicatedFormValueKeyException.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Exception/UnknownFormOptionKeyException.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Hookable.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Modal.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormOption.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormOptions.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormTemplate.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormValue.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormValues.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/RequestData.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Service/AssetsPrinterService.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Service/TemplateGeneratorService.php create mode 100755 wp-content/plugins/webp-converter-for-media/vendor_prefixed/templates/modal.php create mode 100755 wp-content/plugins/webp-converter-for-media/webp-converter-for-media.php create mode 100644 wp-content/uploads-webpc/.htaccess diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md new file mode 100644 index 00000000..35b09a42 --- /dev/null +++ b/DEPENDENCIES.md @@ -0,0 +1,55 @@ +# HomeProz Server Dependencies + +This document tracks server-side dependencies required for the HomeProz WordPress site. + +## PHP Extensions + +| Extension | Purpose | Status | +|-----------|---------|--------| +| `gd` | Image manipulation, WebP conversion | Pre-installed | +| `imagick` | Image manipulation, WebP conversion (alternative to GD) | Pre-installed | + +Both extensions include WebP support, verified with: +```bash +php -r "echo 'GD WebP: ' . (function_exists('imagewebp') ? 'Yes' : 'No') . PHP_EOL;" +php -r "echo 'Imagick WebP: ' . (in_array('WEBP', Imagick::queryFormats()) ? 'Yes' : 'No') . PHP_EOL;" +``` + +## Nginx Configuration + +### WebP Serving Rules + +Added to `/etc/nginx/sites-available/default` on 2025-11-28: + +```nginx +# WebP Converter for Media - serve WebP when available +location ~ /wp-content/(?.+)\.(?jpe?g|png|gif|webp)$ { + add_header Vary Accept; + expires 1y; + add_header Cache-Control "public, immutable"; + access_log off; + + if ($http_accept !~* "image/webp") { + break; + } + try_files /wp-content/uploads-webpc/$path.$ext.webp $uri =404; +} +``` + +**Purpose:** When a browser requests an image from wp-content and sends `Accept: image/webp`, Nginx checks for a WebP version in `/wp-content/uploads-webpc/` and serves it instead. Falls back to original if WebP not available. + +**After changes:** Run `nginx -t && service nginx reload` + +## WordPress Plugins (Image Processing) + +| Plugin | Version | Purpose | +|--------|---------|---------| +| Converter for Media | 6.3.2 | Converts uploaded images to WebP locally using PHP GD/Imagick | + +The plugin stores converted WebP files in `/wp-content/uploads-webpc/` mirroring the structure of `/wp-content/uploads/`. + +## Notes + +- No external APIs or services are used for image processing +- All image conversion happens locally on the server +- WordPress core handles thumbnail generation for all registered image sizes diff --git a/contract/Contracts/WordPress-Website/_scratch/site_analysis/IMPLEMENTATION-PLAN.md b/contract/Contracts/WordPress-Website/_scratch/site_analysis/IMPLEMENTATION-PLAN.md index 0ebd2e9c..05c2d079 100644 --- a/contract/Contracts/WordPress-Website/_scratch/site_analysis/IMPLEMENTATION-PLAN.md +++ b/contract/Contracts/WordPress-Website/_scratch/site_analysis/IMPLEMENTATION-PLAN.md @@ -785,12 +785,34 @@ This implementation plan is a draft for review. Please confirm: - Editor styles match frontend design tokens - Placeholder images use via.placeholder.com (to be replaced with real images) -### Phase 5: Content & SEO - PENDING +### Phase 5: Content & SEO - COMPLETED +- [x] Yoast SEO plugin installed and configured +- [x] SEO titles and meta descriptions configured for all post types +- [x] Schema.org structured data markup implemented: + - RealEstateAgent/LocalBusiness schema (sitewide) + - RealEstateListing schema (single property pages) + - WebSite schema with SearchAction (homepage) + - BreadcrumbList schema (all pages except homepage) +- [x] Open Graph and Twitter Card meta tags configured via Yoast +- [x] Favicon/site icon support enabled (uses WordPress Customizer) +- [x] Theme color meta tags for mobile browsers +- [x] XML sitemap enabled and accessible at /sitemap_index.xml +- [x] Rewrite rules flushed for proper URL handling + +**Files Created:** +- inc/schema-markup.php (custom Schema.org JSON-LD output) + +**Technical Decisions:** +- Using Yoast SEO free version for SEO management +- Custom Schema.org markup in addition to Yoast's schema (more specific real estate types) +- Site icon/favicon managed via WordPress Customizer (Appearance > Customize > Site Identity) +- Theme color set to #0A0A0A (background dark) for mobile browser chrome + ### Phase 6: Performance & Security - PENDING ### Phase 7: Testing & Launch - PENDING --- -*Document Version: 1.3* +*Document Version: 1.4* *Last Updated: November 28, 2025* *Prepared by: Hanson.xyz Development Team* diff --git a/db-snapshots/db-snapshot.sql b/db-snapshots/db-snapshot.sql index f54ea250..869c10b0 100644 --- a/db-snapshots/db-snapshot.sql +++ b/db-snapshots/db-snapshot.sql @@ -134,7 +134,7 @@ CREATE TABLE `wp_options` ( PRIMARY KEY (`option_id`), UNIQUE KEY `option_name` (`option_name`), KEY `autoload` (`autoload`) -) ENGINE=InnoDB AUTO_INCREMENT=172 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +) ENGINE=InnoDB AUTO_INCREMENT=179 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -143,7 +143,7 @@ CREATE TABLE `wp_options` ( LOCK TABLES `wp_options` WRITE; /*!40000 ALTER TABLE `wp_options` DISABLE KEYS */; -INSERT INTO `wp_options` VALUES (1,'cron','a:10:{i:1764363747;a:1:{s:32:\"recovery_mode_clean_expired_keys\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1764363748;a:1:{s:34:\"wp_privacy_delete_old_export_files\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"hourly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:3600;}}}i:1764367344;a:1:{s:16:\"wp_version_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1764369115;a:1:{s:30:\"wp_delete_temp_updater_backups\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}i:1764369116;a:1:{s:27:\"acf_update_site_health_data\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}i:1764369144;a:1:{s:17:\"wp_update_plugins\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1764370944;a:1:{s:16:\"wp_update_themes\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1764371307;a:1:{s:31:\"wpseo_permalink_structure_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1764450148;a:1:{s:30:\"wp_site_health_scheduled_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}s:7:\"version\";i:2;}','on'),(2,'siteurl','https://homeproz.dev.hanson.xyz','on'),(3,'home','https://homeproz.dev.hanson.xyz','on'),(4,'blogname','HomeProz','on'),(5,'blogdescription','','on'),(6,'users_can_register','0','on'),(7,'admin_email','brian@hanson.xyz','on'),(8,'start_of_week','1','on'),(9,'use_balanceTags','0','on'),(10,'use_smilies','1','on'),(11,'require_name_email','1','on'),(12,'comments_notify','1','on'),(13,'posts_per_rss','10','on'),(14,'rss_use_excerpt','0','on'),(15,'mailserver_url','mail.example.com','on'),(16,'mailserver_login','login@example.com','on'),(17,'mailserver_pass','','on'),(18,'mailserver_port','110','on'),(19,'default_category','1','on'),(20,'default_comment_status','open','on'),(21,'default_ping_status','open','on'),(22,'default_pingback_flag','1','on'),(23,'posts_per_page','10','on'),(24,'date_format','F j, Y','on'),(25,'time_format','g:i a','on'),(26,'links_updated_date_format','F j, Y g:i a','on'),(27,'comment_moderation','0','on'),(28,'moderation_notify','1','on'),(29,'permalink_structure','/%postname%/','on'),(30,'rewrite_rules','a:133:{s:11:\"^wp-json/?$\";s:22:\"index.php?rest_route=/\";s:14:\"^wp-json/(.*)?\";s:33:\"index.php?rest_route=/$matches[1]\";s:21:\"^index.php/wp-json/?$\";s:22:\"index.php?rest_route=/\";s:24:\"^index.php/wp-json/(.*)?\";s:33:\"index.php?rest_route=/$matches[1]\";s:17:\"^wp-sitemap\\.xml$\";s:23:\"index.php?sitemap=index\";s:17:\"^wp-sitemap\\.xsl$\";s:36:\"index.php?sitemap-stylesheet=sitemap\";s:23:\"^wp-sitemap-index\\.xsl$\";s:34:\"index.php?sitemap-stylesheet=index\";s:48:\"^wp-sitemap-([a-z]+?)-([a-z\\d_-]+?)-(\\d+?)\\.xml$\";s:75:\"index.php?sitemap=$matches[1]&sitemap-subtype=$matches[2]&paged=$matches[3]\";s:34:\"^wp-sitemap-([a-z]+?)-(\\d+?)\\.xml$\";s:47:\"index.php?sitemap=$matches[1]&paged=$matches[2]\";s:13:\"properties/?$\";s:28:\"index.php?post_type=property\";s:43:\"properties/feed/(feed|rdf|rss|rss2|atom)/?$\";s:45:\"index.php?post_type=property&feed=$matches[1]\";s:38:\"properties/(feed|rdf|rss|rss2|atom)/?$\";s:45:\"index.php?post_type=property&feed=$matches[1]\";s:30:\"properties/page/([0-9]{1,})/?$\";s:46:\"index.php?post_type=property&paged=$matches[1]\";s:47:\"category/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?category_name=$matches[1]&feed=$matches[2]\";s:42:\"category/(.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?category_name=$matches[1]&feed=$matches[2]\";s:23:\"category/(.+?)/embed/?$\";s:46:\"index.php?category_name=$matches[1]&embed=true\";s:35:\"category/(.+?)/page/?([0-9]{1,})/?$\";s:53:\"index.php?category_name=$matches[1]&paged=$matches[2]\";s:17:\"category/(.+?)/?$\";s:35:\"index.php?category_name=$matches[1]\";s:44:\"tag/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?tag=$matches[1]&feed=$matches[2]\";s:39:\"tag/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?tag=$matches[1]&feed=$matches[2]\";s:20:\"tag/([^/]+)/embed/?$\";s:36:\"index.php?tag=$matches[1]&embed=true\";s:32:\"tag/([^/]+)/page/?([0-9]{1,})/?$\";s:43:\"index.php?tag=$matches[1]&paged=$matches[2]\";s:14:\"tag/([^/]+)/?$\";s:25:\"index.php?tag=$matches[1]\";s:45:\"type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?post_format=$matches[1]&feed=$matches[2]\";s:40:\"type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?post_format=$matches[1]&feed=$matches[2]\";s:21:\"type/([^/]+)/embed/?$\";s:44:\"index.php?post_format=$matches[1]&embed=true\";s:33:\"type/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?post_format=$matches[1]&paged=$matches[2]\";s:15:\"type/([^/]+)/?$\";s:33:\"index.php?post_format=$matches[1]\";s:38:\"properties/[^/]+/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:48:\"properties/[^/]+/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:68:\"properties/[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:63:\"properties/[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:63:\"properties/[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:44:\"properties/[^/]+/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:27:\"properties/([^/]+)/embed/?$\";s:41:\"index.php?property=$matches[1]&embed=true\";s:31:\"properties/([^/]+)/trackback/?$\";s:35:\"index.php?property=$matches[1]&tb=1\";s:51:\"properties/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?property=$matches[1]&feed=$matches[2]\";s:46:\"properties/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?property=$matches[1]&feed=$matches[2]\";s:39:\"properties/([^/]+)/page/?([0-9]{1,})/?$\";s:48:\"index.php?property=$matches[1]&paged=$matches[2]\";s:46:\"properties/([^/]+)/comment-page-([0-9]{1,})/?$\";s:48:\"index.php?property=$matches[1]&cpage=$matches[2]\";s:35:\"properties/([^/]+)(?:/([0-9]+))?/?$\";s:47:\"index.php?property=$matches[1]&page=$matches[2]\";s:27:\"properties/[^/]+/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\"properties/[^/]+/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\"properties/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"properties/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"properties/[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\"properties/[^/]+/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:54:\"property-type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?property_type=$matches[1]&feed=$matches[2]\";s:49:\"property-type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?property_type=$matches[1]&feed=$matches[2]\";s:30:\"property-type/([^/]+)/embed/?$\";s:46:\"index.php?property_type=$matches[1]&embed=true\";s:42:\"property-type/([^/]+)/page/?([0-9]{1,})/?$\";s:53:\"index.php?property_type=$matches[1]&paged=$matches[2]\";s:24:\"property-type/([^/]+)/?$\";s:35:\"index.php?property_type=$matches[1]\";s:56:\"property-status/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:54:\"index.php?property_status=$matches[1]&feed=$matches[2]\";s:51:\"property-status/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:54:\"index.php?property_status=$matches[1]&feed=$matches[2]\";s:32:\"property-status/([^/]+)/embed/?$\";s:48:\"index.php?property_status=$matches[1]&embed=true\";s:44:\"property-status/([^/]+)/page/?([0-9]{1,})/?$\";s:55:\"index.php?property_status=$matches[1]&paged=$matches[2]\";s:26:\"property-status/([^/]+)/?$\";s:37:\"index.php?property_status=$matches[1]\";s:49:\"location/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:56:\"index.php?property_location=$matches[1]&feed=$matches[2]\";s:44:\"location/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:56:\"index.php?property_location=$matches[1]&feed=$matches[2]\";s:25:\"location/([^/]+)/embed/?$\";s:50:\"index.php?property_location=$matches[1]&embed=true\";s:37:\"location/([^/]+)/page/?([0-9]{1,})/?$\";s:57:\"index.php?property_location=$matches[1]&paged=$matches[2]\";s:19:\"location/([^/]+)/?$\";s:39:\"index.php?property_location=$matches[1]\";s:12:\"robots\\.txt$\";s:18:\"index.php?robots=1\";s:13:\"favicon\\.ico$\";s:19:\"index.php?favicon=1\";s:12:\"sitemap\\.xml\";s:24:\"index.php??sitemap=index\";s:48:\".*wp-(atom|rdf|rss|rss2|feed|commentsrss2)\\.php$\";s:18:\"index.php?feed=old\";s:20:\".*wp-app\\.php(/.*)?$\";s:19:\"index.php?error=403\";s:18:\".*wp-register.php$\";s:23:\"index.php?register=true\";s:32:\"feed/(feed|rdf|rss|rss2|atom)/?$\";s:27:\"index.php?&feed=$matches[1]\";s:27:\"(feed|rdf|rss|rss2|atom)/?$\";s:27:\"index.php?&feed=$matches[1]\";s:8:\"embed/?$\";s:21:\"index.php?&embed=true\";s:20:\"page/?([0-9]{1,})/?$\";s:28:\"index.php?&paged=$matches[1]\";s:27:\"comment-page-([0-9]{1,})/?$\";s:39:\"index.php?&page_id=10&cpage=$matches[1]\";s:41:\"comments/feed/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?&feed=$matches[1]&withcomments=1\";s:36:\"comments/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?&feed=$matches[1]&withcomments=1\";s:17:\"comments/embed/?$\";s:21:\"index.php?&embed=true\";s:44:\"search/(.+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:40:\"index.php?s=$matches[1]&feed=$matches[2]\";s:39:\"search/(.+)/(feed|rdf|rss|rss2|atom)/?$\";s:40:\"index.php?s=$matches[1]&feed=$matches[2]\";s:20:\"search/(.+)/embed/?$\";s:34:\"index.php?s=$matches[1]&embed=true\";s:32:\"search/(.+)/page/?([0-9]{1,})/?$\";s:41:\"index.php?s=$matches[1]&paged=$matches[2]\";s:14:\"search/(.+)/?$\";s:23:\"index.php?s=$matches[1]\";s:47:\"author/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?author_name=$matches[1]&feed=$matches[2]\";s:42:\"author/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?author_name=$matches[1]&feed=$matches[2]\";s:23:\"author/([^/]+)/embed/?$\";s:44:\"index.php?author_name=$matches[1]&embed=true\";s:35:\"author/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?author_name=$matches[1]&paged=$matches[2]\";s:17:\"author/([^/]+)/?$\";s:33:\"index.php?author_name=$matches[1]\";s:69:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:80:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]\";s:64:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$\";s:80:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]\";s:45:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/embed/?$\";s:74:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&embed=true\";s:57:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$\";s:81:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&paged=$matches[4]\";s:39:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$\";s:63:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]\";s:56:\"([0-9]{4})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:64:\"index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]\";s:51:\"([0-9]{4})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$\";s:64:\"index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]\";s:32:\"([0-9]{4})/([0-9]{1,2})/embed/?$\";s:58:\"index.php?year=$matches[1]&monthnum=$matches[2]&embed=true\";s:44:\"([0-9]{4})/([0-9]{1,2})/page/?([0-9]{1,})/?$\";s:65:\"index.php?year=$matches[1]&monthnum=$matches[2]&paged=$matches[3]\";s:26:\"([0-9]{4})/([0-9]{1,2})/?$\";s:47:\"index.php?year=$matches[1]&monthnum=$matches[2]\";s:43:\"([0-9]{4})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?year=$matches[1]&feed=$matches[2]\";s:38:\"([0-9]{4})/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?year=$matches[1]&feed=$matches[2]\";s:19:\"([0-9]{4})/embed/?$\";s:37:\"index.php?year=$matches[1]&embed=true\";s:31:\"([0-9]{4})/page/?([0-9]{1,})/?$\";s:44:\"index.php?year=$matches[1]&paged=$matches[2]\";s:13:\"([0-9]{4})/?$\";s:26:\"index.php?year=$matches[1]\";s:27:\".?.+?/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\".?.+?/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\".?.+?/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\".?.+?/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\".?.+?/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\".?.+?/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:16:\"(.?.+?)/embed/?$\";s:41:\"index.php?pagename=$matches[1]&embed=true\";s:20:\"(.?.+?)/trackback/?$\";s:35:\"index.php?pagename=$matches[1]&tb=1\";s:40:\"(.?.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?pagename=$matches[1]&feed=$matches[2]\";s:35:\"(.?.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?pagename=$matches[1]&feed=$matches[2]\";s:28:\"(.?.+?)/page/?([0-9]{1,})/?$\";s:48:\"index.php?pagename=$matches[1]&paged=$matches[2]\";s:35:\"(.?.+?)/comment-page-([0-9]{1,})/?$\";s:48:\"index.php?pagename=$matches[1]&cpage=$matches[2]\";s:24:\"(.?.+?)(?:/([0-9]+))?/?$\";s:47:\"index.php?pagename=$matches[1]&page=$matches[2]\";s:27:\"[^/]+/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\"[^/]+/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\"[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\"[^/]+/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:16:\"([^/]+)/embed/?$\";s:37:\"index.php?name=$matches[1]&embed=true\";s:20:\"([^/]+)/trackback/?$\";s:31:\"index.php?name=$matches[1]&tb=1\";s:40:\"([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?name=$matches[1]&feed=$matches[2]\";s:35:\"([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?name=$matches[1]&feed=$matches[2]\";s:28:\"([^/]+)/page/?([0-9]{1,})/?$\";s:44:\"index.php?name=$matches[1]&paged=$matches[2]\";s:35:\"([^/]+)/comment-page-([0-9]{1,})/?$\";s:44:\"index.php?name=$matches[1]&cpage=$matches[2]\";s:24:\"([^/]+)(?:/([0-9]+))?/?$\";s:43:\"index.php?name=$matches[1]&page=$matches[2]\";s:16:\"[^/]+/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:26:\"[^/]+/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:46:\"[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:41:\"[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:41:\"[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:22:\"[^/]+/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";}','on'),(31,'hack_file','0','on'),(32,'blog_charset','UTF-8','on'),(33,'moderation_keys','','off'),(34,'active_plugins','a:3:{i:0;s:30:\"advanced-custom-fields/acf.php\";i:1;s:36:\"contact-form-7/wp-contact-form-7.php\";i:2;s:24:\"wordpress-seo/wp-seo.php\";}','on'),(35,'category_base','','on'),(36,'ping_sites','https://rpc.pingomatic.com/','on'),(37,'comment_max_links','2','on'),(38,'gmt_offset','0','on'),(39,'default_email_category','1','on'),(40,'recently_edited','','off'),(41,'template','homeproz','on'),(42,'stylesheet','homeproz','on'),(43,'comment_registration','0','on'),(44,'html_type','text/html','on'),(45,'use_trackback','0','on'),(46,'default_role','subscriber','on'),(47,'db_version','60421','on'),(48,'uploads_use_yearmonth_folders','1','on'),(49,'upload_path','','on'),(50,'blog_public','1','on'),(51,'default_link_category','2','on'),(52,'show_on_front','page','on'),(53,'tag_base','','on'),(54,'show_avatars','1','on'),(55,'avatar_rating','G','on'),(56,'upload_url_path','','on'),(57,'thumbnail_size_w','150','on'),(58,'thumbnail_size_h','150','on'),(59,'thumbnail_crop','1','on'),(60,'medium_size_w','300','on'),(61,'medium_size_h','300','on'),(62,'avatar_default','mystery','on'),(63,'large_size_w','1024','on'),(64,'large_size_h','1024','on'),(65,'image_default_link_type','none','on'),(66,'image_default_size','','on'),(67,'image_default_align','','on'),(68,'close_comments_for_old_posts','0','on'),(69,'close_comments_days_old','14','on'),(70,'thread_comments','1','on'),(71,'thread_comments_depth','5','on'),(72,'page_comments','0','on'),(73,'comments_per_page','50','on'),(74,'default_comments_page','newest','on'),(75,'comment_order','asc','on'),(76,'sticky_posts','a:0:{}','on'),(77,'widget_categories','a:0:{}','on'),(78,'widget_text','a:0:{}','on'),(79,'widget_rss','a:0:{}','on'),(80,'uninstall_plugins','a:1:{s:24:\"wordpress-seo/wp-seo.php\";s:14:\"__return_false\";}','off'),(81,'timezone_string','','on'),(82,'page_for_posts','9','on'),(83,'page_on_front','10','on'),(84,'default_post_format','0','on'),(85,'link_manager_enabled','0','on'),(86,'finished_splitting_shared_terms','1','on'),(87,'site_icon','0','on'),(88,'medium_large_size_w','768','on'),(89,'medium_large_size_h','0','on'),(90,'wp_page_for_privacy_policy','3','on'),(91,'show_comments_cookies_opt_in','1','on'),(92,'admin_email_lifespan','1779915744','on'),(93,'disallowed_keys','','off'),(94,'comment_previously_approved','1','on'),(95,'auto_plugin_theme_update_emails','a:0:{}','off'),(96,'auto_update_core_dev','enabled','on'),(97,'auto_update_core_minor','enabled','on'),(98,'auto_update_core_major','enabled','on'),(99,'wp_force_deactivated_plugins','a:0:{}','on'),(100,'wp_attachment_pages_enabled','1','on'),(101,'initial_db_version','60421','on'),(102,'wp_user_roles','a:7:{s:13:\"administrator\";a:2:{s:4:\"name\";s:13:\"Administrator\";s:12:\"capabilities\";a:62:{s:13:\"switch_themes\";b:1;s:11:\"edit_themes\";b:1;s:16:\"activate_plugins\";b:1;s:12:\"edit_plugins\";b:1;s:10:\"edit_users\";b:1;s:10:\"edit_files\";b:1;s:14:\"manage_options\";b:1;s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:6:\"import\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:8:\"level_10\";b:1;s:7:\"level_9\";b:1;s:7:\"level_8\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:12:\"delete_users\";b:1;s:12:\"create_users\";b:1;s:17:\"unfiltered_upload\";b:1;s:14:\"edit_dashboard\";b:1;s:14:\"update_plugins\";b:1;s:14:\"delete_plugins\";b:1;s:15:\"install_plugins\";b:1;s:13:\"update_themes\";b:1;s:14:\"install_themes\";b:1;s:11:\"update_core\";b:1;s:10:\"list_users\";b:1;s:12:\"remove_users\";b:1;s:13:\"promote_users\";b:1;s:18:\"edit_theme_options\";b:1;s:13:\"delete_themes\";b:1;s:6:\"export\";b:1;s:20:\"wpseo_manage_options\";b:1;}}s:6:\"editor\";a:2:{s:4:\"name\";s:6:\"Editor\";s:12:\"capabilities\";a:36:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:15:\"wpseo_bulk_edit\";b:1;s:28:\"wpseo_edit_advanced_metadata\";b:1;}}s:6:\"author\";a:2:{s:4:\"name\";s:6:\"Author\";s:12:\"capabilities\";a:10:{s:12:\"upload_files\";b:1;s:10:\"edit_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;s:22:\"delete_published_posts\";b:1;}}s:11:\"contributor\";a:2:{s:4:\"name\";s:11:\"Contributor\";s:12:\"capabilities\";a:5:{s:10:\"edit_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;}}s:10:\"subscriber\";a:2:{s:4:\"name\";s:10:\"Subscriber\";s:12:\"capabilities\";a:2:{s:4:\"read\";b:1;s:7:\"level_0\";b:1;}}s:13:\"wpseo_manager\";a:2:{s:4:\"name\";s:11:\"SEO Manager\";s:12:\"capabilities\";a:38:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:15:\"wpseo_bulk_edit\";b:1;s:28:\"wpseo_edit_advanced_metadata\";b:1;s:20:\"wpseo_manage_options\";b:1;s:23:\"view_site_health_checks\";b:1;}}s:12:\"wpseo_editor\";a:2:{s:4:\"name\";s:10:\"SEO Editor\";s:12:\"capabilities\";a:36:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:15:\"wpseo_bulk_edit\";b:1;s:28:\"wpseo_edit_advanced_metadata\";b:1;}}}','on'),(103,'fresh_site','0','off'),(104,'user_count','1','off'),(105,'widget_block','a:6:{i:2;a:1:{s:7:\"content\";s:19:\"\";}i:3;a:1:{s:7:\"content\";s:154:\"

Recent Posts

\";}i:4;a:1:{s:7:\"content\";s:227:\"

Recent Comments

\";}i:5;a:1:{s:7:\"content\";s:146:\"

Archives

\";}i:6;a:1:{s:7:\"content\";s:150:\"

Categories

\";}s:12:\"_multiwidget\";i:1;}','auto'),(106,'sidebars_widgets','a:2:{s:19:\"wp_inactive_widgets\";a:5:{i:0;s:7:\"block-2\";i:1;s:7:\"block-3\";i:2;s:7:\"block-4\";i:3;s:7:\"block-5\";i:4;s:7:\"block-6\";}s:13:\"array_version\";i:3;}','auto'),(107,'widget_pages','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(108,'widget_calendar','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(109,'widget_archives','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(110,'widget_media_audio','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(111,'widget_media_image','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(112,'widget_media_gallery','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(113,'widget_media_video','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(114,'widget_meta','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(115,'widget_search','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(116,'widget_recent-posts','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(117,'widget_recent-comments','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(118,'widget_tag_cloud','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(119,'widget_nav_menu','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(120,'widget_custom_html','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(121,'_transient_wp_core_block_css_files','a:2:{s:7:\"version\";s:5:\"6.8.3\";s:5:\"files\";a:536:{i:0;s:23:\"archives/editor-rtl.css\";i:1;s:27:\"archives/editor-rtl.min.css\";i:2;s:19:\"archives/editor.css\";i:3;s:23:\"archives/editor.min.css\";i:4;s:22:\"archives/style-rtl.css\";i:5;s:26:\"archives/style-rtl.min.css\";i:6;s:18:\"archives/style.css\";i:7;s:22:\"archives/style.min.css\";i:8;s:20:\"audio/editor-rtl.css\";i:9;s:24:\"audio/editor-rtl.min.css\";i:10;s:16:\"audio/editor.css\";i:11;s:20:\"audio/editor.min.css\";i:12;s:19:\"audio/style-rtl.css\";i:13;s:23:\"audio/style-rtl.min.css\";i:14;s:15:\"audio/style.css\";i:15;s:19:\"audio/style.min.css\";i:16;s:19:\"audio/theme-rtl.css\";i:17;s:23:\"audio/theme-rtl.min.css\";i:18;s:15:\"audio/theme.css\";i:19;s:19:\"audio/theme.min.css\";i:20;s:21:\"avatar/editor-rtl.css\";i:21;s:25:\"avatar/editor-rtl.min.css\";i:22;s:17:\"avatar/editor.css\";i:23;s:21:\"avatar/editor.min.css\";i:24;s:20:\"avatar/style-rtl.css\";i:25;s:24:\"avatar/style-rtl.min.css\";i:26;s:16:\"avatar/style.css\";i:27;s:20:\"avatar/style.min.css\";i:28;s:21:\"button/editor-rtl.css\";i:29;s:25:\"button/editor-rtl.min.css\";i:30;s:17:\"button/editor.css\";i:31;s:21:\"button/editor.min.css\";i:32;s:20:\"button/style-rtl.css\";i:33;s:24:\"button/style-rtl.min.css\";i:34;s:16:\"button/style.css\";i:35;s:20:\"button/style.min.css\";i:36;s:22:\"buttons/editor-rtl.css\";i:37;s:26:\"buttons/editor-rtl.min.css\";i:38;s:18:\"buttons/editor.css\";i:39;s:22:\"buttons/editor.min.css\";i:40;s:21:\"buttons/style-rtl.css\";i:41;s:25:\"buttons/style-rtl.min.css\";i:42;s:17:\"buttons/style.css\";i:43;s:21:\"buttons/style.min.css\";i:44;s:22:\"calendar/style-rtl.css\";i:45;s:26:\"calendar/style-rtl.min.css\";i:46;s:18:\"calendar/style.css\";i:47;s:22:\"calendar/style.min.css\";i:48;s:25:\"categories/editor-rtl.css\";i:49;s:29:\"categories/editor-rtl.min.css\";i:50;s:21:\"categories/editor.css\";i:51;s:25:\"categories/editor.min.css\";i:52;s:24:\"categories/style-rtl.css\";i:53;s:28:\"categories/style-rtl.min.css\";i:54;s:20:\"categories/style.css\";i:55;s:24:\"categories/style.min.css\";i:56;s:19:\"code/editor-rtl.css\";i:57;s:23:\"code/editor-rtl.min.css\";i:58;s:15:\"code/editor.css\";i:59;s:19:\"code/editor.min.css\";i:60;s:18:\"code/style-rtl.css\";i:61;s:22:\"code/style-rtl.min.css\";i:62;s:14:\"code/style.css\";i:63;s:18:\"code/style.min.css\";i:64;s:18:\"code/theme-rtl.css\";i:65;s:22:\"code/theme-rtl.min.css\";i:66;s:14:\"code/theme.css\";i:67;s:18:\"code/theme.min.css\";i:68;s:22:\"columns/editor-rtl.css\";i:69;s:26:\"columns/editor-rtl.min.css\";i:70;s:18:\"columns/editor.css\";i:71;s:22:\"columns/editor.min.css\";i:72;s:21:\"columns/style-rtl.css\";i:73;s:25:\"columns/style-rtl.min.css\";i:74;s:17:\"columns/style.css\";i:75;s:21:\"columns/style.min.css\";i:76;s:33:\"comment-author-name/style-rtl.css\";i:77;s:37:\"comment-author-name/style-rtl.min.css\";i:78;s:29:\"comment-author-name/style.css\";i:79;s:33:\"comment-author-name/style.min.css\";i:80;s:29:\"comment-content/style-rtl.css\";i:81;s:33:\"comment-content/style-rtl.min.css\";i:82;s:25:\"comment-content/style.css\";i:83;s:29:\"comment-content/style.min.css\";i:84;s:26:\"comment-date/style-rtl.css\";i:85;s:30:\"comment-date/style-rtl.min.css\";i:86;s:22:\"comment-date/style.css\";i:87;s:26:\"comment-date/style.min.css\";i:88;s:31:\"comment-edit-link/style-rtl.css\";i:89;s:35:\"comment-edit-link/style-rtl.min.css\";i:90;s:27:\"comment-edit-link/style.css\";i:91;s:31:\"comment-edit-link/style.min.css\";i:92;s:32:\"comment-reply-link/style-rtl.css\";i:93;s:36:\"comment-reply-link/style-rtl.min.css\";i:94;s:28:\"comment-reply-link/style.css\";i:95;s:32:\"comment-reply-link/style.min.css\";i:96;s:30:\"comment-template/style-rtl.css\";i:97;s:34:\"comment-template/style-rtl.min.css\";i:98;s:26:\"comment-template/style.css\";i:99;s:30:\"comment-template/style.min.css\";i:100;s:42:\"comments-pagination-numbers/editor-rtl.css\";i:101;s:46:\"comments-pagination-numbers/editor-rtl.min.css\";i:102;s:38:\"comments-pagination-numbers/editor.css\";i:103;s:42:\"comments-pagination-numbers/editor.min.css\";i:104;s:34:\"comments-pagination/editor-rtl.css\";i:105;s:38:\"comments-pagination/editor-rtl.min.css\";i:106;s:30:\"comments-pagination/editor.css\";i:107;s:34:\"comments-pagination/editor.min.css\";i:108;s:33:\"comments-pagination/style-rtl.css\";i:109;s:37:\"comments-pagination/style-rtl.min.css\";i:110;s:29:\"comments-pagination/style.css\";i:111;s:33:\"comments-pagination/style.min.css\";i:112;s:29:\"comments-title/editor-rtl.css\";i:113;s:33:\"comments-title/editor-rtl.min.css\";i:114;s:25:\"comments-title/editor.css\";i:115;s:29:\"comments-title/editor.min.css\";i:116;s:23:\"comments/editor-rtl.css\";i:117;s:27:\"comments/editor-rtl.min.css\";i:118;s:19:\"comments/editor.css\";i:119;s:23:\"comments/editor.min.css\";i:120;s:22:\"comments/style-rtl.css\";i:121;s:26:\"comments/style-rtl.min.css\";i:122;s:18:\"comments/style.css\";i:123;s:22:\"comments/style.min.css\";i:124;s:20:\"cover/editor-rtl.css\";i:125;s:24:\"cover/editor-rtl.min.css\";i:126;s:16:\"cover/editor.css\";i:127;s:20:\"cover/editor.min.css\";i:128;s:19:\"cover/style-rtl.css\";i:129;s:23:\"cover/style-rtl.min.css\";i:130;s:15:\"cover/style.css\";i:131;s:19:\"cover/style.min.css\";i:132;s:22:\"details/editor-rtl.css\";i:133;s:26:\"details/editor-rtl.min.css\";i:134;s:18:\"details/editor.css\";i:135;s:22:\"details/editor.min.css\";i:136;s:21:\"details/style-rtl.css\";i:137;s:25:\"details/style-rtl.min.css\";i:138;s:17:\"details/style.css\";i:139;s:21:\"details/style.min.css\";i:140;s:20:\"embed/editor-rtl.css\";i:141;s:24:\"embed/editor-rtl.min.css\";i:142;s:16:\"embed/editor.css\";i:143;s:20:\"embed/editor.min.css\";i:144;s:19:\"embed/style-rtl.css\";i:145;s:23:\"embed/style-rtl.min.css\";i:146;s:15:\"embed/style.css\";i:147;s:19:\"embed/style.min.css\";i:148;s:19:\"embed/theme-rtl.css\";i:149;s:23:\"embed/theme-rtl.min.css\";i:150;s:15:\"embed/theme.css\";i:151;s:19:\"embed/theme.min.css\";i:152;s:19:\"file/editor-rtl.css\";i:153;s:23:\"file/editor-rtl.min.css\";i:154;s:15:\"file/editor.css\";i:155;s:19:\"file/editor.min.css\";i:156;s:18:\"file/style-rtl.css\";i:157;s:22:\"file/style-rtl.min.css\";i:158;s:14:\"file/style.css\";i:159;s:18:\"file/style.min.css\";i:160;s:23:\"footnotes/style-rtl.css\";i:161;s:27:\"footnotes/style-rtl.min.css\";i:162;s:19:\"footnotes/style.css\";i:163;s:23:\"footnotes/style.min.css\";i:164;s:23:\"freeform/editor-rtl.css\";i:165;s:27:\"freeform/editor-rtl.min.css\";i:166;s:19:\"freeform/editor.css\";i:167;s:23:\"freeform/editor.min.css\";i:168;s:22:\"gallery/editor-rtl.css\";i:169;s:26:\"gallery/editor-rtl.min.css\";i:170;s:18:\"gallery/editor.css\";i:171;s:22:\"gallery/editor.min.css\";i:172;s:21:\"gallery/style-rtl.css\";i:173;s:25:\"gallery/style-rtl.min.css\";i:174;s:17:\"gallery/style.css\";i:175;s:21:\"gallery/style.min.css\";i:176;s:21:\"gallery/theme-rtl.css\";i:177;s:25:\"gallery/theme-rtl.min.css\";i:178;s:17:\"gallery/theme.css\";i:179;s:21:\"gallery/theme.min.css\";i:180;s:20:\"group/editor-rtl.css\";i:181;s:24:\"group/editor-rtl.min.css\";i:182;s:16:\"group/editor.css\";i:183;s:20:\"group/editor.min.css\";i:184;s:19:\"group/style-rtl.css\";i:185;s:23:\"group/style-rtl.min.css\";i:186;s:15:\"group/style.css\";i:187;s:19:\"group/style.min.css\";i:188;s:19:\"group/theme-rtl.css\";i:189;s:23:\"group/theme-rtl.min.css\";i:190;s:15:\"group/theme.css\";i:191;s:19:\"group/theme.min.css\";i:192;s:21:\"heading/style-rtl.css\";i:193;s:25:\"heading/style-rtl.min.css\";i:194;s:17:\"heading/style.css\";i:195;s:21:\"heading/style.min.css\";i:196;s:19:\"html/editor-rtl.css\";i:197;s:23:\"html/editor-rtl.min.css\";i:198;s:15:\"html/editor.css\";i:199;s:19:\"html/editor.min.css\";i:200;s:20:\"image/editor-rtl.css\";i:201;s:24:\"image/editor-rtl.min.css\";i:202;s:16:\"image/editor.css\";i:203;s:20:\"image/editor.min.css\";i:204;s:19:\"image/style-rtl.css\";i:205;s:23:\"image/style-rtl.min.css\";i:206;s:15:\"image/style.css\";i:207;s:19:\"image/style.min.css\";i:208;s:19:\"image/theme-rtl.css\";i:209;s:23:\"image/theme-rtl.min.css\";i:210;s:15:\"image/theme.css\";i:211;s:19:\"image/theme.min.css\";i:212;s:29:\"latest-comments/style-rtl.css\";i:213;s:33:\"latest-comments/style-rtl.min.css\";i:214;s:25:\"latest-comments/style.css\";i:215;s:29:\"latest-comments/style.min.css\";i:216;s:27:\"latest-posts/editor-rtl.css\";i:217;s:31:\"latest-posts/editor-rtl.min.css\";i:218;s:23:\"latest-posts/editor.css\";i:219;s:27:\"latest-posts/editor.min.css\";i:220;s:26:\"latest-posts/style-rtl.css\";i:221;s:30:\"latest-posts/style-rtl.min.css\";i:222;s:22:\"latest-posts/style.css\";i:223;s:26:\"latest-posts/style.min.css\";i:224;s:18:\"list/style-rtl.css\";i:225;s:22:\"list/style-rtl.min.css\";i:226;s:14:\"list/style.css\";i:227;s:18:\"list/style.min.css\";i:228;s:22:\"loginout/style-rtl.css\";i:229;s:26:\"loginout/style-rtl.min.css\";i:230;s:18:\"loginout/style.css\";i:231;s:22:\"loginout/style.min.css\";i:232;s:25:\"media-text/editor-rtl.css\";i:233;s:29:\"media-text/editor-rtl.min.css\";i:234;s:21:\"media-text/editor.css\";i:235;s:25:\"media-text/editor.min.css\";i:236;s:24:\"media-text/style-rtl.css\";i:237;s:28:\"media-text/style-rtl.min.css\";i:238;s:20:\"media-text/style.css\";i:239;s:24:\"media-text/style.min.css\";i:240;s:19:\"more/editor-rtl.css\";i:241;s:23:\"more/editor-rtl.min.css\";i:242;s:15:\"more/editor.css\";i:243;s:19:\"more/editor.min.css\";i:244;s:30:\"navigation-link/editor-rtl.css\";i:245;s:34:\"navigation-link/editor-rtl.min.css\";i:246;s:26:\"navigation-link/editor.css\";i:247;s:30:\"navigation-link/editor.min.css\";i:248;s:29:\"navigation-link/style-rtl.css\";i:249;s:33:\"navigation-link/style-rtl.min.css\";i:250;s:25:\"navigation-link/style.css\";i:251;s:29:\"navigation-link/style.min.css\";i:252;s:33:\"navigation-submenu/editor-rtl.css\";i:253;s:37:\"navigation-submenu/editor-rtl.min.css\";i:254;s:29:\"navigation-submenu/editor.css\";i:255;s:33:\"navigation-submenu/editor.min.css\";i:256;s:25:\"navigation/editor-rtl.css\";i:257;s:29:\"navigation/editor-rtl.min.css\";i:258;s:21:\"navigation/editor.css\";i:259;s:25:\"navigation/editor.min.css\";i:260;s:24:\"navigation/style-rtl.css\";i:261;s:28:\"navigation/style-rtl.min.css\";i:262;s:20:\"navigation/style.css\";i:263;s:24:\"navigation/style.min.css\";i:264;s:23:\"nextpage/editor-rtl.css\";i:265;s:27:\"nextpage/editor-rtl.min.css\";i:266;s:19:\"nextpage/editor.css\";i:267;s:23:\"nextpage/editor.min.css\";i:268;s:24:\"page-list/editor-rtl.css\";i:269;s:28:\"page-list/editor-rtl.min.css\";i:270;s:20:\"page-list/editor.css\";i:271;s:24:\"page-list/editor.min.css\";i:272;s:23:\"page-list/style-rtl.css\";i:273;s:27:\"page-list/style-rtl.min.css\";i:274;s:19:\"page-list/style.css\";i:275;s:23:\"page-list/style.min.css\";i:276;s:24:\"paragraph/editor-rtl.css\";i:277;s:28:\"paragraph/editor-rtl.min.css\";i:278;s:20:\"paragraph/editor.css\";i:279;s:24:\"paragraph/editor.min.css\";i:280;s:23:\"paragraph/style-rtl.css\";i:281;s:27:\"paragraph/style-rtl.min.css\";i:282;s:19:\"paragraph/style.css\";i:283;s:23:\"paragraph/style.min.css\";i:284;s:35:\"post-author-biography/style-rtl.css\";i:285;s:39:\"post-author-biography/style-rtl.min.css\";i:286;s:31:\"post-author-biography/style.css\";i:287;s:35:\"post-author-biography/style.min.css\";i:288;s:30:\"post-author-name/style-rtl.css\";i:289;s:34:\"post-author-name/style-rtl.min.css\";i:290;s:26:\"post-author-name/style.css\";i:291;s:30:\"post-author-name/style.min.css\";i:292;s:26:\"post-author/editor-rtl.css\";i:293;s:30:\"post-author/editor-rtl.min.css\";i:294;s:22:\"post-author/editor.css\";i:295;s:26:\"post-author/editor.min.css\";i:296;s:25:\"post-author/style-rtl.css\";i:297;s:29:\"post-author/style-rtl.min.css\";i:298;s:21:\"post-author/style.css\";i:299;s:25:\"post-author/style.min.css\";i:300;s:33:\"post-comments-form/editor-rtl.css\";i:301;s:37:\"post-comments-form/editor-rtl.min.css\";i:302;s:29:\"post-comments-form/editor.css\";i:303;s:33:\"post-comments-form/editor.min.css\";i:304;s:32:\"post-comments-form/style-rtl.css\";i:305;s:36:\"post-comments-form/style-rtl.min.css\";i:306;s:28:\"post-comments-form/style.css\";i:307;s:32:\"post-comments-form/style.min.css\";i:308;s:26:\"post-content/style-rtl.css\";i:309;s:30:\"post-content/style-rtl.min.css\";i:310;s:22:\"post-content/style.css\";i:311;s:26:\"post-content/style.min.css\";i:312;s:23:\"post-date/style-rtl.css\";i:313;s:27:\"post-date/style-rtl.min.css\";i:314;s:19:\"post-date/style.css\";i:315;s:23:\"post-date/style.min.css\";i:316;s:27:\"post-excerpt/editor-rtl.css\";i:317;s:31:\"post-excerpt/editor-rtl.min.css\";i:318;s:23:\"post-excerpt/editor.css\";i:319;s:27:\"post-excerpt/editor.min.css\";i:320;s:26:\"post-excerpt/style-rtl.css\";i:321;s:30:\"post-excerpt/style-rtl.min.css\";i:322;s:22:\"post-excerpt/style.css\";i:323;s:26:\"post-excerpt/style.min.css\";i:324;s:34:\"post-featured-image/editor-rtl.css\";i:325;s:38:\"post-featured-image/editor-rtl.min.css\";i:326;s:30:\"post-featured-image/editor.css\";i:327;s:34:\"post-featured-image/editor.min.css\";i:328;s:33:\"post-featured-image/style-rtl.css\";i:329;s:37:\"post-featured-image/style-rtl.min.css\";i:330;s:29:\"post-featured-image/style.css\";i:331;s:33:\"post-featured-image/style.min.css\";i:332;s:34:\"post-navigation-link/style-rtl.css\";i:333;s:38:\"post-navigation-link/style-rtl.min.css\";i:334;s:30:\"post-navigation-link/style.css\";i:335;s:34:\"post-navigation-link/style.min.css\";i:336;s:27:\"post-template/style-rtl.css\";i:337;s:31:\"post-template/style-rtl.min.css\";i:338;s:23:\"post-template/style.css\";i:339;s:27:\"post-template/style.min.css\";i:340;s:24:\"post-terms/style-rtl.css\";i:341;s:28:\"post-terms/style-rtl.min.css\";i:342;s:20:\"post-terms/style.css\";i:343;s:24:\"post-terms/style.min.css\";i:344;s:24:\"post-title/style-rtl.css\";i:345;s:28:\"post-title/style-rtl.min.css\";i:346;s:20:\"post-title/style.css\";i:347;s:24:\"post-title/style.min.css\";i:348;s:26:\"preformatted/style-rtl.css\";i:349;s:30:\"preformatted/style-rtl.min.css\";i:350;s:22:\"preformatted/style.css\";i:351;s:26:\"preformatted/style.min.css\";i:352;s:24:\"pullquote/editor-rtl.css\";i:353;s:28:\"pullquote/editor-rtl.min.css\";i:354;s:20:\"pullquote/editor.css\";i:355;s:24:\"pullquote/editor.min.css\";i:356;s:23:\"pullquote/style-rtl.css\";i:357;s:27:\"pullquote/style-rtl.min.css\";i:358;s:19:\"pullquote/style.css\";i:359;s:23:\"pullquote/style.min.css\";i:360;s:23:\"pullquote/theme-rtl.css\";i:361;s:27:\"pullquote/theme-rtl.min.css\";i:362;s:19:\"pullquote/theme.css\";i:363;s:23:\"pullquote/theme.min.css\";i:364;s:39:\"query-pagination-numbers/editor-rtl.css\";i:365;s:43:\"query-pagination-numbers/editor-rtl.min.css\";i:366;s:35:\"query-pagination-numbers/editor.css\";i:367;s:39:\"query-pagination-numbers/editor.min.css\";i:368;s:31:\"query-pagination/editor-rtl.css\";i:369;s:35:\"query-pagination/editor-rtl.min.css\";i:370;s:27:\"query-pagination/editor.css\";i:371;s:31:\"query-pagination/editor.min.css\";i:372;s:30:\"query-pagination/style-rtl.css\";i:373;s:34:\"query-pagination/style-rtl.min.css\";i:374;s:26:\"query-pagination/style.css\";i:375;s:30:\"query-pagination/style.min.css\";i:376;s:25:\"query-title/style-rtl.css\";i:377;s:29:\"query-title/style-rtl.min.css\";i:378;s:21:\"query-title/style.css\";i:379;s:25:\"query-title/style.min.css\";i:380;s:25:\"query-total/style-rtl.css\";i:381;s:29:\"query-total/style-rtl.min.css\";i:382;s:21:\"query-total/style.css\";i:383;s:25:\"query-total/style.min.css\";i:384;s:20:\"query/editor-rtl.css\";i:385;s:24:\"query/editor-rtl.min.css\";i:386;s:16:\"query/editor.css\";i:387;s:20:\"query/editor.min.css\";i:388;s:19:\"quote/style-rtl.css\";i:389;s:23:\"quote/style-rtl.min.css\";i:390;s:15:\"quote/style.css\";i:391;s:19:\"quote/style.min.css\";i:392;s:19:\"quote/theme-rtl.css\";i:393;s:23:\"quote/theme-rtl.min.css\";i:394;s:15:\"quote/theme.css\";i:395;s:19:\"quote/theme.min.css\";i:396;s:23:\"read-more/style-rtl.css\";i:397;s:27:\"read-more/style-rtl.min.css\";i:398;s:19:\"read-more/style.css\";i:399;s:23:\"read-more/style.min.css\";i:400;s:18:\"rss/editor-rtl.css\";i:401;s:22:\"rss/editor-rtl.min.css\";i:402;s:14:\"rss/editor.css\";i:403;s:18:\"rss/editor.min.css\";i:404;s:17:\"rss/style-rtl.css\";i:405;s:21:\"rss/style-rtl.min.css\";i:406;s:13:\"rss/style.css\";i:407;s:17:\"rss/style.min.css\";i:408;s:21:\"search/editor-rtl.css\";i:409;s:25:\"search/editor-rtl.min.css\";i:410;s:17:\"search/editor.css\";i:411;s:21:\"search/editor.min.css\";i:412;s:20:\"search/style-rtl.css\";i:413;s:24:\"search/style-rtl.min.css\";i:414;s:16:\"search/style.css\";i:415;s:20:\"search/style.min.css\";i:416;s:20:\"search/theme-rtl.css\";i:417;s:24:\"search/theme-rtl.min.css\";i:418;s:16:\"search/theme.css\";i:419;s:20:\"search/theme.min.css\";i:420;s:24:\"separator/editor-rtl.css\";i:421;s:28:\"separator/editor-rtl.min.css\";i:422;s:20:\"separator/editor.css\";i:423;s:24:\"separator/editor.min.css\";i:424;s:23:\"separator/style-rtl.css\";i:425;s:27:\"separator/style-rtl.min.css\";i:426;s:19:\"separator/style.css\";i:427;s:23:\"separator/style.min.css\";i:428;s:23:\"separator/theme-rtl.css\";i:429;s:27:\"separator/theme-rtl.min.css\";i:430;s:19:\"separator/theme.css\";i:431;s:23:\"separator/theme.min.css\";i:432;s:24:\"shortcode/editor-rtl.css\";i:433;s:28:\"shortcode/editor-rtl.min.css\";i:434;s:20:\"shortcode/editor.css\";i:435;s:24:\"shortcode/editor.min.css\";i:436;s:24:\"site-logo/editor-rtl.css\";i:437;s:28:\"site-logo/editor-rtl.min.css\";i:438;s:20:\"site-logo/editor.css\";i:439;s:24:\"site-logo/editor.min.css\";i:440;s:23:\"site-logo/style-rtl.css\";i:441;s:27:\"site-logo/style-rtl.min.css\";i:442;s:19:\"site-logo/style.css\";i:443;s:23:\"site-logo/style.min.css\";i:444;s:27:\"site-tagline/editor-rtl.css\";i:445;s:31:\"site-tagline/editor-rtl.min.css\";i:446;s:23:\"site-tagline/editor.css\";i:447;s:27:\"site-tagline/editor.min.css\";i:448;s:26:\"site-tagline/style-rtl.css\";i:449;s:30:\"site-tagline/style-rtl.min.css\";i:450;s:22:\"site-tagline/style.css\";i:451;s:26:\"site-tagline/style.min.css\";i:452;s:25:\"site-title/editor-rtl.css\";i:453;s:29:\"site-title/editor-rtl.min.css\";i:454;s:21:\"site-title/editor.css\";i:455;s:25:\"site-title/editor.min.css\";i:456;s:24:\"site-title/style-rtl.css\";i:457;s:28:\"site-title/style-rtl.min.css\";i:458;s:20:\"site-title/style.css\";i:459;s:24:\"site-title/style.min.css\";i:460;s:26:\"social-link/editor-rtl.css\";i:461;s:30:\"social-link/editor-rtl.min.css\";i:462;s:22:\"social-link/editor.css\";i:463;s:26:\"social-link/editor.min.css\";i:464;s:27:\"social-links/editor-rtl.css\";i:465;s:31:\"social-links/editor-rtl.min.css\";i:466;s:23:\"social-links/editor.css\";i:467;s:27:\"social-links/editor.min.css\";i:468;s:26:\"social-links/style-rtl.css\";i:469;s:30:\"social-links/style-rtl.min.css\";i:470;s:22:\"social-links/style.css\";i:471;s:26:\"social-links/style.min.css\";i:472;s:21:\"spacer/editor-rtl.css\";i:473;s:25:\"spacer/editor-rtl.min.css\";i:474;s:17:\"spacer/editor.css\";i:475;s:21:\"spacer/editor.min.css\";i:476;s:20:\"spacer/style-rtl.css\";i:477;s:24:\"spacer/style-rtl.min.css\";i:478;s:16:\"spacer/style.css\";i:479;s:20:\"spacer/style.min.css\";i:480;s:20:\"table/editor-rtl.css\";i:481;s:24:\"table/editor-rtl.min.css\";i:482;s:16:\"table/editor.css\";i:483;s:20:\"table/editor.min.css\";i:484;s:19:\"table/style-rtl.css\";i:485;s:23:\"table/style-rtl.min.css\";i:486;s:15:\"table/style.css\";i:487;s:19:\"table/style.min.css\";i:488;s:19:\"table/theme-rtl.css\";i:489;s:23:\"table/theme-rtl.min.css\";i:490;s:15:\"table/theme.css\";i:491;s:19:\"table/theme.min.css\";i:492;s:24:\"tag-cloud/editor-rtl.css\";i:493;s:28:\"tag-cloud/editor-rtl.min.css\";i:494;s:20:\"tag-cloud/editor.css\";i:495;s:24:\"tag-cloud/editor.min.css\";i:496;s:23:\"tag-cloud/style-rtl.css\";i:497;s:27:\"tag-cloud/style-rtl.min.css\";i:498;s:19:\"tag-cloud/style.css\";i:499;s:23:\"tag-cloud/style.min.css\";i:500;s:28:\"template-part/editor-rtl.css\";i:501;s:32:\"template-part/editor-rtl.min.css\";i:502;s:24:\"template-part/editor.css\";i:503;s:28:\"template-part/editor.min.css\";i:504;s:27:\"template-part/theme-rtl.css\";i:505;s:31:\"template-part/theme-rtl.min.css\";i:506;s:23:\"template-part/theme.css\";i:507;s:27:\"template-part/theme.min.css\";i:508;s:30:\"term-description/style-rtl.css\";i:509;s:34:\"term-description/style-rtl.min.css\";i:510;s:26:\"term-description/style.css\";i:511;s:30:\"term-description/style.min.css\";i:512;s:27:\"text-columns/editor-rtl.css\";i:513;s:31:\"text-columns/editor-rtl.min.css\";i:514;s:23:\"text-columns/editor.css\";i:515;s:27:\"text-columns/editor.min.css\";i:516;s:26:\"text-columns/style-rtl.css\";i:517;s:30:\"text-columns/style-rtl.min.css\";i:518;s:22:\"text-columns/style.css\";i:519;s:26:\"text-columns/style.min.css\";i:520;s:19:\"verse/style-rtl.css\";i:521;s:23:\"verse/style-rtl.min.css\";i:522;s:15:\"verse/style.css\";i:523;s:19:\"verse/style.min.css\";i:524;s:20:\"video/editor-rtl.css\";i:525;s:24:\"video/editor-rtl.min.css\";i:526;s:16:\"video/editor.css\";i:527;s:20:\"video/editor.min.css\";i:528;s:19:\"video/style-rtl.css\";i:529;s:23:\"video/style-rtl.min.css\";i:530;s:15:\"video/style.css\";i:531;s:19:\"video/style.min.css\";i:532;s:19:\"video/theme-rtl.css\";i:533;s:23:\"video/theme-rtl.min.css\";i:534;s:15:\"video/theme.css\";i:535;s:19:\"video/theme.min.css\";}}','on'),(124,'_transient_doing_cron','1764371370.1489911079406738281250','on'),(125,'theme_mods_twentytwentyfive','a:2:{s:18:\"custom_css_post_id\";i:-1;s:16:\"sidebars_widgets\";a:2:{s:4:\"time\";i:1764367183;s:4:\"data\";a:3:{s:19:\"wp_inactive_widgets\";a:0:{}s:9:\"sidebar-1\";a:3:{i:0;s:7:\"block-2\";i:1;s:7:\"block-3\";i:2;s:7:\"block-4\";}s:9:\"sidebar-2\";a:2:{i:0;s:7:\"block-5\";i:1;s:7:\"block-6\";}}}}','off'),(126,'_transient_wp_styles_for_blocks','a:2:{s:4:\"hash\";s:32:\"64ad95698215776f80fa1e80f2eb5417\";s:6:\"blocks\";a:7:{s:11:\"core/button\";s:0:\"\";s:14:\"core/site-logo\";s:0:\"\";s:18:\"core/post-template\";s:0:\"\";s:12:\"core/columns\";s:0:\"\";s:14:\"core/pullquote\";s:121:\":root :where(.wp-block-pullquote){font-size: clamp(0.984em, 0.984rem + ((1vw - 0.2em) * 0.938), 1.5em);line-height: 1.6;}\";s:15:\"core/site-title\";s:89:\":root :where(.wp-block-site-title){font-family: var(--wp--preset--font-family--display);}\";s:15:\"core/navigation\";s:86:\":root :where(.wp-block-navigation){font-family: var(--wp--preset--font-family--body);}\";}}','on'),(129,'category_children','a:0:{}','auto'),(132,'_site_transient_update_themes','O:8:\"stdClass\":5:{s:12:\"last_checked\";i:1764371303;s:7:\"checked\";a:4:{s:8:\"homeproz\";s:5:\"1.0.0\";s:16:\"twentytwentyfive\";s:3:\"1.3\";s:16:\"twentytwentyfour\";s:3:\"1.3\";s:17:\"twentytwentythree\";s:3:\"1.6\";}s:8:\"response\";a:0:{}s:9:\"no_update\";a:3:{s:16:\"twentytwentyfive\";a:6:{s:5:\"theme\";s:16:\"twentytwentyfive\";s:11:\"new_version\";s:3:\"1.3\";s:3:\"url\";s:46:\"https://wordpress.org/themes/twentytwentyfive/\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/theme/twentytwentyfive.1.3.zip\";s:8:\"requires\";s:3:\"6.7\";s:12:\"requires_php\";s:3:\"7.2\";}s:16:\"twentytwentyfour\";a:6:{s:5:\"theme\";s:16:\"twentytwentyfour\";s:11:\"new_version\";s:3:\"1.3\";s:3:\"url\";s:46:\"https://wordpress.org/themes/twentytwentyfour/\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/theme/twentytwentyfour.1.3.zip\";s:8:\"requires\";s:3:\"6.4\";s:12:\"requires_php\";s:3:\"7.0\";}s:17:\"twentytwentythree\";a:6:{s:5:\"theme\";s:17:\"twentytwentythree\";s:11:\"new_version\";s:3:\"1.6\";s:3:\"url\";s:47:\"https://wordpress.org/themes/twentytwentythree/\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/theme/twentytwentythree.1.6.zip\";s:8:\"requires\";s:3:\"6.1\";s:12:\"requires_php\";s:3:\"5.6\";}}s:12:\"translations\";a:0:{}}','off'),(133,'current_theme','HomeProz','auto'),(134,'theme_switched','','auto'),(135,'theme_mods_homeproz','a:2:{s:18:\"nav_menu_locations\";a:1:{s:7:\"primary\";i:15;}s:18:\"custom_css_post_id\";i:-1;}','auto'),(141,'property_type_children','a:0:{}','auto'),(144,'property_status_children','a:0:{}','auto'),(150,'property_location_children','a:0:{}','auto'),(152,'_site_transient_update_core','O:8:\"stdClass\":4:{s:7:\"updates\";a:1:{i:0;O:8:\"stdClass\":10:{s:8:\"response\";s:6:\"latest\";s:8:\"download\";s:59:\"https://downloads.wordpress.org/release/wordpress-6.8.3.zip\";s:6:\"locale\";s:5:\"en_US\";s:8:\"packages\";O:8:\"stdClass\":5:{s:4:\"full\";s:59:\"https://downloads.wordpress.org/release/wordpress-6.8.3.zip\";s:10:\"no_content\";s:70:\"https://downloads.wordpress.org/release/wordpress-6.8.3-no-content.zip\";s:11:\"new_bundled\";s:71:\"https://downloads.wordpress.org/release/wordpress-6.8.3-new-bundled.zip\";s:7:\"partial\";s:0:\"\";s:8:\"rollback\";s:0:\"\";}s:7:\"current\";s:5:\"6.8.3\";s:7:\"version\";s:5:\"6.8.3\";s:11:\"php_version\";s:6:\"7.2.24\";s:13:\"mysql_version\";s:5:\"5.5.5\";s:11:\"new_bundled\";s:3:\"6.7\";s:15:\"partial_version\";s:0:\"\";}}s:12:\"last_checked\";i:1764371303;s:15:\"version_checked\";s:5:\"6.8.3\";s:12:\"translations\";a:0:{}}','off'),(156,'acf_first_activated_version','6.6.2','on'),(157,'acf_site_health','{\"event_first_activated\":1764369116,\"last_updated\":1764369116}','off'),(158,'_site_transient_timeout_wp_theme_files_patterns-2aae27f1f26ef7a6be8ebee5c8a6a86b','1764372438','off'),(159,'_site_transient_wp_theme_files_patterns-2aae27f1f26ef7a6be8ebee5c8a6a86b','a:2:{s:7:\"version\";s:5:\"1.0.0\";s:8:\"patterns\";a:0:{}}','off'),(162,'wpcf7','a:2:{s:7:\"version\";s:5:\"6.1.3\";s:13:\"bulk_validate\";a:4:{s:9:\"timestamp\";i:1764370639;s:7:\"version\";s:5:\"6.1.3\";s:11:\"count_valid\";i:1;s:13:\"count_invalid\";i:0;}}','auto'),(165,'_site_transient_timeout_theme_roots','1764373103','off'),(166,'_site_transient_theme_roots','a:4:{s:8:\"homeproz\";s:7:\"/themes\";s:16:\"twentytwentyfive\";s:7:\"/themes\";s:16:\"twentytwentyfour\";s:7:\"/themes\";s:17:\"twentytwentythree\";s:7:\"/themes\";}','off'),(167,'yoast_migrations_free','a:1:{s:7:\"version\";s:4:\"26.4\";}','auto'),(168,'wpseo','a:120:{s:8:\"tracking\";b:0;s:16:\"toggled_tracking\";b:0;s:22:\"license_server_version\";b:0;s:15:\"ms_defaults_set\";b:0;s:40:\"ignore_search_engines_discouraged_notice\";b:0;s:19:\"indexing_first_time\";b:1;s:16:\"indexing_started\";b:0;s:15:\"indexing_reason\";s:24:\"attachments_made_enabled\";s:29:\"indexables_indexing_completed\";b:0;s:13:\"index_now_key\";s:0:\"\";s:7:\"version\";s:4:\"26.4\";s:16:\"previous_version\";s:0:\"\";s:20:\"disableadvanced_meta\";b:1;s:30:\"enable_headless_rest_endpoints\";b:1;s:17:\"ryte_indexability\";b:0;s:11:\"baiduverify\";s:0:\"\";s:12:\"googleverify\";s:0:\"\";s:8:\"msverify\";s:0:\"\";s:12:\"yandexverify\";s:0:\"\";s:12:\"ahrefsverify\";s:0:\"\";s:9:\"site_type\";s:0:\"\";s:20:\"has_multiple_authors\";s:0:\"\";s:16:\"environment_type\";s:0:\"\";s:23:\"content_analysis_active\";b:1;s:23:\"keyword_analysis_active\";b:1;s:34:\"inclusive_language_analysis_active\";b:0;s:21:\"enable_admin_bar_menu\";b:1;s:26:\"enable_cornerstone_content\";b:1;s:18:\"enable_xml_sitemap\";b:1;s:24:\"enable_text_link_counter\";b:1;s:16:\"enable_index_now\";b:1;s:19:\"enable_ai_generator\";b:1;s:22:\"ai_enabled_pre_default\";b:0;s:22:\"show_onboarding_notice\";b:1;s:18:\"first_activated_on\";i:1764371307;s:13:\"myyoast-oauth\";b:0;s:26:\"semrush_integration_active\";b:1;s:14:\"semrush_tokens\";a:0:{}s:20:\"semrush_country_code\";s:2:\"us\";s:19:\"permalink_structure\";s:0:\"\";s:8:\"home_url\";s:0:\"\";s:18:\"dynamic_permalinks\";b:0;s:17:\"category_base_url\";s:0:\"\";s:12:\"tag_base_url\";s:0:\"\";s:21:\"custom_taxonomy_slugs\";a:0:{}s:29:\"enable_enhanced_slack_sharing\";b:1;s:23:\"enable_metabox_insights\";b:1;s:23:\"enable_link_suggestions\";b:1;s:26:\"algolia_integration_active\";b:0;s:14:\"import_cursors\";a:0:{}s:13:\"workouts_data\";a:1:{s:13:\"configuration\";a:1:{s:13:\"finishedSteps\";a:0:{}}}s:28:\"configuration_finished_steps\";a:0:{}s:36:\"dismiss_configuration_workout_notice\";b:0;s:34:\"dismiss_premium_deactivated_notice\";b:0;s:19:\"importing_completed\";a:0:{}s:26:\"wincher_integration_active\";b:1;s:14:\"wincher_tokens\";a:0:{}s:36:\"wincher_automatically_add_keyphrases\";b:0;s:18:\"wincher_website_id\";s:0:\"\";s:18:\"first_time_install\";b:1;s:34:\"should_redirect_after_install_free\";b:0;s:34:\"activation_redirect_timestamp_free\";i:1764371307;s:18:\"remove_feed_global\";b:0;s:27:\"remove_feed_global_comments\";b:0;s:25:\"remove_feed_post_comments\";b:0;s:19:\"remove_feed_authors\";b:0;s:22:\"remove_feed_categories\";b:0;s:16:\"remove_feed_tags\";b:0;s:29:\"remove_feed_custom_taxonomies\";b:0;s:22:\"remove_feed_post_types\";b:0;s:18:\"remove_feed_search\";b:0;s:21:\"remove_atom_rdf_feeds\";b:0;s:17:\"remove_shortlinks\";b:0;s:21:\"remove_rest_api_links\";b:0;s:20:\"remove_rsd_wlw_links\";b:0;s:19:\"remove_oembed_links\";b:0;s:16:\"remove_generator\";b:0;s:20:\"remove_emoji_scripts\";b:0;s:24:\"remove_powered_by_header\";b:0;s:22:\"remove_pingback_header\";b:0;s:28:\"clean_campaign_tracking_urls\";b:0;s:16:\"clean_permalinks\";b:0;s:32:\"clean_permalinks_extra_variables\";s:0:\"\";s:14:\"search_cleanup\";b:0;s:20:\"search_cleanup_emoji\";b:0;s:23:\"search_cleanup_patterns\";b:0;s:22:\"search_character_limit\";i:50;s:20:\"deny_search_crawling\";b:0;s:21:\"deny_wp_json_crawling\";b:0;s:20:\"deny_adsbot_crawling\";b:0;s:19:\"deny_ccbot_crawling\";b:0;s:29:\"deny_google_extended_crawling\";b:0;s:20:\"deny_gptbot_crawling\";b:0;s:27:\"redirect_search_pretty_urls\";b:0;s:29:\"least_readability_ignore_list\";a:0:{}s:27:\"least_seo_score_ignore_list\";a:0:{}s:23:\"most_linked_ignore_list\";a:0:{}s:24:\"least_linked_ignore_list\";a:0:{}s:28:\"indexables_page_reading_list\";a:5:{i:0;b:0;i:1;b:0;i:2;b:0;i:3;b:0;i:4;b:0;}s:25:\"indexables_overview_state\";s:21:\"dashboard-not-visited\";s:28:\"last_known_public_post_types\";a:0:{}s:28:\"last_known_public_taxonomies\";a:0:{}s:23:\"last_known_no_unindexed\";a:0:{}s:14:\"new_post_types\";a:0:{}s:14:\"new_taxonomies\";a:0:{}s:34:\"show_new_content_type_notification\";b:0;s:44:\"site_kit_configuration_permanently_dismissed\";b:0;s:18:\"site_kit_connected\";b:0;s:37:\"site_kit_tracking_setup_widget_loaded\";s:2:\"no\";s:41:\"site_kit_tracking_first_interaction_stage\";s:0:\"\";s:40:\"site_kit_tracking_last_interaction_stage\";s:0:\"\";s:52:\"site_kit_tracking_setup_widget_temporarily_dismissed\";s:2:\"no\";s:52:\"site_kit_tracking_setup_widget_permanently_dismissed\";s:2:\"no\";s:31:\"google_site_kit_feature_enabled\";b:0;s:25:\"ai_free_sparks_started_on\";N;s:15:\"enable_llms_txt\";b:0;s:15:\"last_updated_on\";b:0;s:17:\"default_seo_title\";a:0:{}s:21:\"default_seo_meta_desc\";a:0:{}s:18:\"first_activated_by\";i:0;}','auto'),(169,'wpseo_titles','a:173:{s:17:\"forcerewritetitle\";b:0;s:9:\"separator\";s:7:\"sc-dash\";s:16:\"title-home-wpseo\";s:47:\"HomeProz Real Estate | Albert Lea MN Properties\";s:18:\"title-author-wpseo\";s:41:\"%%name%%, Author at %%sitename%% %%page%%\";s:19:\"title-archive-wpseo\";s:38:\"%%date%% %%page%% %%sep%% %%sitename%%\";s:18:\"title-search-wpseo\";s:63:\"You searched for %%searchphrase%% %%page%% %%sep%% %%sitename%%\";s:15:\"title-404-wpseo\";s:35:\"Page not found %%sep%% %%sitename%%\";s:25:\"social-title-author-wpseo\";s:8:\"%%name%%\";s:26:\"social-title-archive-wpseo\";s:8:\"%%date%%\";s:31:\"social-description-author-wpseo\";s:0:\"\";s:32:\"social-description-archive-wpseo\";s:0:\"\";s:29:\"social-image-url-author-wpseo\";s:0:\"\";s:30:\"social-image-url-archive-wpseo\";s:0:\"\";s:28:\"social-image-id-author-wpseo\";i:0;s:29:\"social-image-id-archive-wpseo\";i:0;s:19:\"metadesc-home-wpseo\";s:120:\"HomeProz Real Estate - Your trusted partner for buying and selling homes in Albert Lea, Minnesota and surrounding areas.\";s:21:\"metadesc-author-wpseo\";s:0:\"\";s:22:\"metadesc-archive-wpseo\";s:0:\"\";s:9:\"rssbefore\";s:0:\"\";s:8:\"rssafter\";s:53:\"The post %%POSTLINK%% appeared first on %%BLOGLINK%%.\";s:20:\"noindex-author-wpseo\";b:0;s:28:\"noindex-author-noposts-wpseo\";b:0;s:21:\"noindex-archive-wpseo\";b:0;s:14:\"disable-author\";b:0;s:12:\"disable-date\";b:0;s:19:\"disable-post_format\";b:0;s:18:\"disable-attachment\";b:0;s:20:\"breadcrumbs-404crumb\";s:25:\"Error 404: Page not found\";s:29:\"breadcrumbs-display-blog-page\";b:0;s:20:\"breadcrumbs-boldlast\";b:0;s:25:\"breadcrumbs-archiveprefix\";s:12:\"Archives for\";s:18:\"breadcrumbs-enable\";b:0;s:16:\"breadcrumbs-home\";s:4:\"Home\";s:18:\"breadcrumbs-prefix\";s:0:\"\";s:24:\"breadcrumbs-searchprefix\";s:16:\"You searched for\";s:15:\"breadcrumbs-sep\";s:2:\"»\";s:12:\"website_name\";s:0:\"\";s:11:\"person_name\";s:0:\"\";s:11:\"person_logo\";s:0:\"\";s:22:\"alternate_website_name\";s:0:\"\";s:12:\"company_logo\";s:0:\"\";s:12:\"company_name\";s:0:\"\";s:22:\"company_alternate_name\";s:0:\"\";s:17:\"company_or_person\";s:7:\"company\";s:25:\"company_or_person_user_id\";b:0;s:17:\"stripcategorybase\";b:0;s:26:\"open_graph_frontpage_title\";s:12:\"%%sitename%%\";s:25:\"open_graph_frontpage_desc\";s:0:\"\";s:26:\"open_graph_frontpage_image\";s:0:\"\";s:24:\"publishing_principles_id\";i:0;s:25:\"ownership_funding_info_id\";i:0;s:29:\"actionable_feedback_policy_id\";i:0;s:21:\"corrections_policy_id\";i:0;s:16:\"ethics_policy_id\";i:0;s:19:\"diversity_policy_id\";i:0;s:28:\"diversity_staffing_report_id\";i:0;s:15:\"org-description\";s:0:\"\";s:9:\"org-email\";s:0:\"\";s:9:\"org-phone\";s:0:\"\";s:14:\"org-legal-name\";s:0:\"\";s:17:\"org-founding-date\";s:0:\"\";s:20:\"org-number-employees\";s:0:\"\";s:10:\"org-vat-id\";s:0:\"\";s:10:\"org-tax-id\";s:0:\"\";s:7:\"org-iso\";s:0:\"\";s:8:\"org-duns\";s:0:\"\";s:11:\"org-leicode\";s:0:\"\";s:9:\"org-naics\";s:0:\"\";s:10:\"title-post\";s:39:\"%%title%% %%page%% %%sep%% %%sitename%%\";s:13:\"metadesc-post\";s:0:\"\";s:12:\"noindex-post\";b:0;s:23:\"display-metabox-pt-post\";b:0;s:23:\"post_types-post-maintax\";i:0;s:21:\"schema-page-type-post\";s:7:\"WebPage\";s:24:\"schema-article-type-post\";s:7:\"Article\";s:17:\"social-title-post\";s:9:\"%%title%%\";s:23:\"social-description-post\";s:0:\"\";s:21:\"social-image-url-post\";s:0:\"\";s:20:\"social-image-id-post\";i:0;s:10:\"title-page\";s:39:\"%%title%% %%page%% %%sep%% %%sitename%%\";s:13:\"metadesc-page\";s:0:\"\";s:12:\"noindex-page\";b:0;s:23:\"display-metabox-pt-page\";b:0;s:23:\"post_types-page-maintax\";i:0;s:21:\"schema-page-type-page\";s:7:\"WebPage\";s:24:\"schema-article-type-page\";s:4:\"None\";s:17:\"social-title-page\";s:9:\"%%title%%\";s:23:\"social-description-page\";s:0:\"\";s:21:\"social-image-url-page\";s:0:\"\";s:20:\"social-image-id-page\";i:0;s:16:\"title-attachment\";s:39:\"%%title%% %%page%% %%sep%% %%sitename%%\";s:19:\"metadesc-attachment\";s:0:\"\";s:18:\"noindex-attachment\";b:0;s:29:\"display-metabox-pt-attachment\";b:0;s:29:\"post_types-attachment-maintax\";i:0;s:27:\"schema-page-type-attachment\";s:7:\"WebPage\";s:30:\"schema-article-type-attachment\";s:4:\"None\";s:18:\"title-tax-category\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:21:\"metadesc-tax-category\";s:0:\"\";s:28:\"display-metabox-tax-category\";b:0;s:20:\"noindex-tax-category\";b:0;s:25:\"social-title-tax-category\";s:23:\"%%term_title%% Archives\";s:31:\"social-description-tax-category\";s:0:\"\";s:29:\"social-image-url-tax-category\";s:0:\"\";s:28:\"social-image-id-tax-category\";i:0;s:26:\"taxonomy-category-ptparent\";i:0;s:18:\"title-tax-post_tag\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:21:\"metadesc-tax-post_tag\";s:0:\"\";s:28:\"display-metabox-tax-post_tag\";b:0;s:20:\"noindex-tax-post_tag\";b:0;s:25:\"social-title-tax-post_tag\";s:23:\"%%term_title%% Archives\";s:31:\"social-description-tax-post_tag\";s:0:\"\";s:29:\"social-image-url-tax-post_tag\";s:0:\"\";s:28:\"social-image-id-tax-post_tag\";i:0;s:26:\"taxonomy-post_tag-ptparent\";i:0;s:21:\"title-tax-post_format\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:24:\"metadesc-tax-post_format\";s:0:\"\";s:31:\"display-metabox-tax-post_format\";b:0;s:23:\"noindex-tax-post_format\";b:0;s:28:\"social-title-tax-post_format\";s:23:\"%%term_title%% Archives\";s:34:\"social-description-tax-post_format\";s:0:\"\";s:32:\"social-image-url-tax-post_format\";s:0:\"\";s:31:\"social-image-id-tax-post_format\";i:0;s:29:\"taxonomy-post_format-ptparent\";i:0;s:14:\"title-property\";s:30:\"%%title%% %%sep%% %%sitename%%\";s:17:\"metadesc-property\";s:106:\"View property details, photos, and features for %%title%%. Contact HomeProz Real Estate in Albert Lea, MN.\";s:16:\"noindex-property\";b:0;s:27:\"display-metabox-pt-property\";b:0;s:27:\"post_types-property-maintax\";i:0;s:25:\"schema-page-type-property\";s:7:\"WebPage\";s:28:\"schema-article-type-property\";s:4:\"None\";s:21:\"social-title-property\";s:9:\"%%title%%\";s:27:\"social-description-property\";s:0:\"\";s:25:\"social-image-url-property\";s:0:\"\";s:24:\"social-image-id-property\";i:0;s:24:\"title-ptarchive-property\";s:49:\"Properties For Sale %%page%% %%sep%% %%sitename%%\";s:27:\"metadesc-ptarchive-property\";s:126:\"Browse all properties for sale in Albert Lea, Minnesota and surrounding areas. Find your dream home with HomeProz Real Estate.\";s:26:\"bctitle-ptarchive-property\";s:0:\"\";s:26:\"noindex-ptarchive-property\";b:0;s:31:\"social-title-ptarchive-property\";s:21:\"%%pt_plural%% Archive\";s:37:\"social-description-ptarchive-property\";s:0:\"\";s:35:\"social-image-url-ptarchive-property\";s:0:\"\";s:34:\"social-image-id-ptarchive-property\";i:0;s:23:\"title-tax-property_type\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:26:\"metadesc-tax-property_type\";s:0:\"\";s:33:\"display-metabox-tax-property_type\";b:0;s:25:\"noindex-tax-property_type\";b:0;s:30:\"social-title-tax-property_type\";s:23:\"%%term_title%% Archives\";s:36:\"social-description-tax-property_type\";s:0:\"\";s:34:\"social-image-url-tax-property_type\";s:0:\"\";s:33:\"social-image-id-tax-property_type\";i:0;s:31:\"taxonomy-property_type-ptparent\";i:0;s:25:\"title-tax-property_status\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:28:\"metadesc-tax-property_status\";s:0:\"\";s:35:\"display-metabox-tax-property_status\";b:0;s:27:\"noindex-tax-property_status\";b:0;s:32:\"social-title-tax-property_status\";s:23:\"%%term_title%% Archives\";s:38:\"social-description-tax-property_status\";s:0:\"\";s:36:\"social-image-url-tax-property_status\";s:0:\"\";s:35:\"social-image-id-tax-property_status\";i:0;s:33:\"taxonomy-property_status-ptparent\";i:0;s:27:\"title-tax-property_location\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:30:\"metadesc-tax-property_location\";s:0:\"\";s:37:\"display-metabox-tax-property_location\";b:0;s:29:\"noindex-tax-property_location\";b:0;s:34:\"social-title-tax-property_location\";s:23:\"%%term_title%% Archives\";s:40:\"social-description-tax-property_location\";s:0:\"\";s:38:\"social-image-url-tax-property_location\";s:0:\"\";s:37:\"social-image-id-tax-property_location\";i:0;s:35:\"taxonomy-property_location-ptparent\";i:0;s:14:\"person_logo_id\";i:0;s:15:\"company_logo_id\";i:0;s:29:\"open_graph_frontpage_image_id\";i:0;}','auto'),(170,'wpseo_social','a:20:{s:13:\"facebook_site\";s:0:\"\";s:13:\"instagram_url\";s:0:\"\";s:12:\"linkedin_url\";s:0:\"\";s:11:\"myspace_url\";s:0:\"\";s:16:\"og_default_image\";s:0:\"\";s:19:\"og_default_image_id\";s:0:\"\";s:18:\"og_frontpage_title\";s:47:\"HomeProz Real Estate | Albert Lea MN Properties\";s:17:\"og_frontpage_desc\";s:97:\"Your trusted partner for buying and selling homes in Albert Lea, Minnesota and surrounding areas.\";s:18:\"og_frontpage_image\";s:0:\"\";s:21:\"og_frontpage_image_id\";s:0:\"\";s:9:\"opengraph\";b:1;s:13:\"pinterest_url\";s:0:\"\";s:15:\"pinterestverify\";s:0:\"\";s:7:\"twitter\";b:1;s:12:\"twitter_site\";s:0:\"\";s:17:\"twitter_card_type\";s:19:\"summary_large_image\";s:11:\"youtube_url\";s:0:\"\";s:13:\"wikipedia_url\";s:0:\"\";s:17:\"other_social_urls\";a:0:{}s:12:\"mastodon_url\";s:0:\"\";}','auto'),(171,'wpseo_llmstxt','a:7:{s:23:\"llms_txt_selection_mode\";s:4:\"auto\";s:13:\"about_us_page\";i:0;s:12:\"contact_page\";i:0;s:10:\"terms_page\";i:0;s:19:\"privacy_policy_page\";i:0;s:9:\"shop_page\";i:0;s:20:\"other_included_pages\";a:0:{}}','auto'); +INSERT INTO `wp_options` VALUES (1,'cron','a:10:{i:1764363747;a:1:{s:32:\"recovery_mode_clean_expired_keys\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1764363748;a:1:{s:34:\"wp_privacy_delete_old_export_files\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"hourly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:3600;}}}i:1764367344;a:1:{s:16:\"wp_version_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1764369115;a:1:{s:30:\"wp_delete_temp_updater_backups\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}i:1764369116;a:1:{s:27:\"acf_update_site_health_data\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}i:1764369144;a:1:{s:17:\"wp_update_plugins\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1764370944;a:1:{s:16:\"wp_update_themes\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1764371307;a:1:{s:31:\"wpseo_permalink_structure_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1764450148;a:1:{s:30:\"wp_site_health_scheduled_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}s:7:\"version\";i:2;}','on'),(2,'siteurl','https://homeproz.dev.hanson.xyz','on'),(3,'home','https://homeproz.dev.hanson.xyz','on'),(4,'blogname','HomeProz','on'),(5,'blogdescription','','on'),(6,'users_can_register','0','on'),(7,'admin_email','brian@hanson.xyz','on'),(8,'start_of_week','1','on'),(9,'use_balanceTags','0','on'),(10,'use_smilies','1','on'),(11,'require_name_email','1','on'),(12,'comments_notify','1','on'),(13,'posts_per_rss','10','on'),(14,'rss_use_excerpt','0','on'),(15,'mailserver_url','mail.example.com','on'),(16,'mailserver_login','login@example.com','on'),(17,'mailserver_pass','','on'),(18,'mailserver_port','110','on'),(19,'default_category','1','on'),(20,'default_comment_status','open','on'),(21,'default_ping_status','open','on'),(22,'default_pingback_flag','1','on'),(23,'posts_per_page','10','on'),(24,'date_format','F j, Y','on'),(25,'time_format','g:i a','on'),(26,'links_updated_date_format','F j, Y g:i a','on'),(27,'comment_moderation','0','on'),(28,'moderation_notify','1','on'),(29,'permalink_structure','/%postname%/','on'),(30,'rewrite_rules','a:133:{s:11:\"^wp-json/?$\";s:22:\"index.php?rest_route=/\";s:14:\"^wp-json/(.*)?\";s:33:\"index.php?rest_route=/$matches[1]\";s:21:\"^index.php/wp-json/?$\";s:22:\"index.php?rest_route=/\";s:24:\"^index.php/wp-json/(.*)?\";s:33:\"index.php?rest_route=/$matches[1]\";s:17:\"^wp-sitemap\\.xml$\";s:23:\"index.php?sitemap=index\";s:17:\"^wp-sitemap\\.xsl$\";s:36:\"index.php?sitemap-stylesheet=sitemap\";s:23:\"^wp-sitemap-index\\.xsl$\";s:34:\"index.php?sitemap-stylesheet=index\";s:48:\"^wp-sitemap-([a-z]+?)-([a-z\\d_-]+?)-(\\d+?)\\.xml$\";s:75:\"index.php?sitemap=$matches[1]&sitemap-subtype=$matches[2]&paged=$matches[3]\";s:34:\"^wp-sitemap-([a-z]+?)-(\\d+?)\\.xml$\";s:47:\"index.php?sitemap=$matches[1]&paged=$matches[2]\";s:13:\"properties/?$\";s:28:\"index.php?post_type=property\";s:43:\"properties/feed/(feed|rdf|rss|rss2|atom)/?$\";s:45:\"index.php?post_type=property&feed=$matches[1]\";s:38:\"properties/(feed|rdf|rss|rss2|atom)/?$\";s:45:\"index.php?post_type=property&feed=$matches[1]\";s:30:\"properties/page/([0-9]{1,})/?$\";s:46:\"index.php?post_type=property&paged=$matches[1]\";s:47:\"category/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?category_name=$matches[1]&feed=$matches[2]\";s:42:\"category/(.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?category_name=$matches[1]&feed=$matches[2]\";s:23:\"category/(.+?)/embed/?$\";s:46:\"index.php?category_name=$matches[1]&embed=true\";s:35:\"category/(.+?)/page/?([0-9]{1,})/?$\";s:53:\"index.php?category_name=$matches[1]&paged=$matches[2]\";s:17:\"category/(.+?)/?$\";s:35:\"index.php?category_name=$matches[1]\";s:44:\"tag/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?tag=$matches[1]&feed=$matches[2]\";s:39:\"tag/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?tag=$matches[1]&feed=$matches[2]\";s:20:\"tag/([^/]+)/embed/?$\";s:36:\"index.php?tag=$matches[1]&embed=true\";s:32:\"tag/([^/]+)/page/?([0-9]{1,})/?$\";s:43:\"index.php?tag=$matches[1]&paged=$matches[2]\";s:14:\"tag/([^/]+)/?$\";s:25:\"index.php?tag=$matches[1]\";s:45:\"type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?post_format=$matches[1]&feed=$matches[2]\";s:40:\"type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?post_format=$matches[1]&feed=$matches[2]\";s:21:\"type/([^/]+)/embed/?$\";s:44:\"index.php?post_format=$matches[1]&embed=true\";s:33:\"type/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?post_format=$matches[1]&paged=$matches[2]\";s:15:\"type/([^/]+)/?$\";s:33:\"index.php?post_format=$matches[1]\";s:38:\"properties/[^/]+/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:48:\"properties/[^/]+/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:68:\"properties/[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:63:\"properties/[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:63:\"properties/[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:44:\"properties/[^/]+/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:27:\"properties/([^/]+)/embed/?$\";s:41:\"index.php?property=$matches[1]&embed=true\";s:31:\"properties/([^/]+)/trackback/?$\";s:35:\"index.php?property=$matches[1]&tb=1\";s:51:\"properties/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?property=$matches[1]&feed=$matches[2]\";s:46:\"properties/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?property=$matches[1]&feed=$matches[2]\";s:39:\"properties/([^/]+)/page/?([0-9]{1,})/?$\";s:48:\"index.php?property=$matches[1]&paged=$matches[2]\";s:46:\"properties/([^/]+)/comment-page-([0-9]{1,})/?$\";s:48:\"index.php?property=$matches[1]&cpage=$matches[2]\";s:35:\"properties/([^/]+)(?:/([0-9]+))?/?$\";s:47:\"index.php?property=$matches[1]&page=$matches[2]\";s:27:\"properties/[^/]+/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\"properties/[^/]+/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\"properties/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"properties/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"properties/[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\"properties/[^/]+/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:54:\"property-type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?property_type=$matches[1]&feed=$matches[2]\";s:49:\"property-type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?property_type=$matches[1]&feed=$matches[2]\";s:30:\"property-type/([^/]+)/embed/?$\";s:46:\"index.php?property_type=$matches[1]&embed=true\";s:42:\"property-type/([^/]+)/page/?([0-9]{1,})/?$\";s:53:\"index.php?property_type=$matches[1]&paged=$matches[2]\";s:24:\"property-type/([^/]+)/?$\";s:35:\"index.php?property_type=$matches[1]\";s:56:\"property-status/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:54:\"index.php?property_status=$matches[1]&feed=$matches[2]\";s:51:\"property-status/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:54:\"index.php?property_status=$matches[1]&feed=$matches[2]\";s:32:\"property-status/([^/]+)/embed/?$\";s:48:\"index.php?property_status=$matches[1]&embed=true\";s:44:\"property-status/([^/]+)/page/?([0-9]{1,})/?$\";s:55:\"index.php?property_status=$matches[1]&paged=$matches[2]\";s:26:\"property-status/([^/]+)/?$\";s:37:\"index.php?property_status=$matches[1]\";s:49:\"location/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:56:\"index.php?property_location=$matches[1]&feed=$matches[2]\";s:44:\"location/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:56:\"index.php?property_location=$matches[1]&feed=$matches[2]\";s:25:\"location/([^/]+)/embed/?$\";s:50:\"index.php?property_location=$matches[1]&embed=true\";s:37:\"location/([^/]+)/page/?([0-9]{1,})/?$\";s:57:\"index.php?property_location=$matches[1]&paged=$matches[2]\";s:19:\"location/([^/]+)/?$\";s:39:\"index.php?property_location=$matches[1]\";s:12:\"robots\\.txt$\";s:18:\"index.php?robots=1\";s:13:\"favicon\\.ico$\";s:19:\"index.php?favicon=1\";s:12:\"sitemap\\.xml\";s:24:\"index.php??sitemap=index\";s:48:\".*wp-(atom|rdf|rss|rss2|feed|commentsrss2)\\.php$\";s:18:\"index.php?feed=old\";s:20:\".*wp-app\\.php(/.*)?$\";s:19:\"index.php?error=403\";s:18:\".*wp-register.php$\";s:23:\"index.php?register=true\";s:32:\"feed/(feed|rdf|rss|rss2|atom)/?$\";s:27:\"index.php?&feed=$matches[1]\";s:27:\"(feed|rdf|rss|rss2|atom)/?$\";s:27:\"index.php?&feed=$matches[1]\";s:8:\"embed/?$\";s:21:\"index.php?&embed=true\";s:20:\"page/?([0-9]{1,})/?$\";s:28:\"index.php?&paged=$matches[1]\";s:27:\"comment-page-([0-9]{1,})/?$\";s:39:\"index.php?&page_id=10&cpage=$matches[1]\";s:41:\"comments/feed/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?&feed=$matches[1]&withcomments=1\";s:36:\"comments/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?&feed=$matches[1]&withcomments=1\";s:17:\"comments/embed/?$\";s:21:\"index.php?&embed=true\";s:44:\"search/(.+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:40:\"index.php?s=$matches[1]&feed=$matches[2]\";s:39:\"search/(.+)/(feed|rdf|rss|rss2|atom)/?$\";s:40:\"index.php?s=$matches[1]&feed=$matches[2]\";s:20:\"search/(.+)/embed/?$\";s:34:\"index.php?s=$matches[1]&embed=true\";s:32:\"search/(.+)/page/?([0-9]{1,})/?$\";s:41:\"index.php?s=$matches[1]&paged=$matches[2]\";s:14:\"search/(.+)/?$\";s:23:\"index.php?s=$matches[1]\";s:47:\"author/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?author_name=$matches[1]&feed=$matches[2]\";s:42:\"author/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?author_name=$matches[1]&feed=$matches[2]\";s:23:\"author/([^/]+)/embed/?$\";s:44:\"index.php?author_name=$matches[1]&embed=true\";s:35:\"author/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?author_name=$matches[1]&paged=$matches[2]\";s:17:\"author/([^/]+)/?$\";s:33:\"index.php?author_name=$matches[1]\";s:69:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:80:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]\";s:64:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$\";s:80:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]\";s:45:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/embed/?$\";s:74:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&embed=true\";s:57:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$\";s:81:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&paged=$matches[4]\";s:39:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$\";s:63:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]\";s:56:\"([0-9]{4})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:64:\"index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]\";s:51:\"([0-9]{4})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$\";s:64:\"index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]\";s:32:\"([0-9]{4})/([0-9]{1,2})/embed/?$\";s:58:\"index.php?year=$matches[1]&monthnum=$matches[2]&embed=true\";s:44:\"([0-9]{4})/([0-9]{1,2})/page/?([0-9]{1,})/?$\";s:65:\"index.php?year=$matches[1]&monthnum=$matches[2]&paged=$matches[3]\";s:26:\"([0-9]{4})/([0-9]{1,2})/?$\";s:47:\"index.php?year=$matches[1]&monthnum=$matches[2]\";s:43:\"([0-9]{4})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?year=$matches[1]&feed=$matches[2]\";s:38:\"([0-9]{4})/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?year=$matches[1]&feed=$matches[2]\";s:19:\"([0-9]{4})/embed/?$\";s:37:\"index.php?year=$matches[1]&embed=true\";s:31:\"([0-9]{4})/page/?([0-9]{1,})/?$\";s:44:\"index.php?year=$matches[1]&paged=$matches[2]\";s:13:\"([0-9]{4})/?$\";s:26:\"index.php?year=$matches[1]\";s:27:\".?.+?/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\".?.+?/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\".?.+?/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\".?.+?/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\".?.+?/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\".?.+?/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:16:\"(.?.+?)/embed/?$\";s:41:\"index.php?pagename=$matches[1]&embed=true\";s:20:\"(.?.+?)/trackback/?$\";s:35:\"index.php?pagename=$matches[1]&tb=1\";s:40:\"(.?.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?pagename=$matches[1]&feed=$matches[2]\";s:35:\"(.?.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?pagename=$matches[1]&feed=$matches[2]\";s:28:\"(.?.+?)/page/?([0-9]{1,})/?$\";s:48:\"index.php?pagename=$matches[1]&paged=$matches[2]\";s:35:\"(.?.+?)/comment-page-([0-9]{1,})/?$\";s:48:\"index.php?pagename=$matches[1]&cpage=$matches[2]\";s:24:\"(.?.+?)(?:/([0-9]+))?/?$\";s:47:\"index.php?pagename=$matches[1]&page=$matches[2]\";s:27:\"[^/]+/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\"[^/]+/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\"[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\"[^/]+/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:16:\"([^/]+)/embed/?$\";s:37:\"index.php?name=$matches[1]&embed=true\";s:20:\"([^/]+)/trackback/?$\";s:31:\"index.php?name=$matches[1]&tb=1\";s:40:\"([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?name=$matches[1]&feed=$matches[2]\";s:35:\"([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?name=$matches[1]&feed=$matches[2]\";s:28:\"([^/]+)/page/?([0-9]{1,})/?$\";s:44:\"index.php?name=$matches[1]&paged=$matches[2]\";s:35:\"([^/]+)/comment-page-([0-9]{1,})/?$\";s:44:\"index.php?name=$matches[1]&cpage=$matches[2]\";s:24:\"([^/]+)(?:/([0-9]+))?/?$\";s:43:\"index.php?name=$matches[1]&page=$matches[2]\";s:16:\"[^/]+/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:26:\"[^/]+/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:46:\"[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:41:\"[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:41:\"[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:22:\"[^/]+/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";}','on'),(31,'hack_file','0','on'),(32,'blog_charset','UTF-8','on'),(33,'moderation_keys','','off'),(34,'active_plugins','a:4:{i:0;s:30:\"advanced-custom-fields/acf.php\";i:1;s:36:\"contact-form-7/wp-contact-form-7.php\";i:2;s:53:\"webp-converter-for-media/webp-converter-for-media.php\";i:3;s:24:\"wordpress-seo/wp-seo.php\";}','on'),(35,'category_base','','on'),(36,'ping_sites','https://rpc.pingomatic.com/','on'),(37,'comment_max_links','2','on'),(38,'gmt_offset','0','on'),(39,'default_email_category','1','on'),(40,'recently_edited','','off'),(41,'template','homeproz','on'),(42,'stylesheet','homeproz','on'),(43,'comment_registration','0','on'),(44,'html_type','text/html','on'),(45,'use_trackback','0','on'),(46,'default_role','subscriber','on'),(47,'db_version','60421','on'),(48,'uploads_use_yearmonth_folders','1','on'),(49,'upload_path','','on'),(50,'blog_public','1','on'),(51,'default_link_category','2','on'),(52,'show_on_front','page','on'),(53,'tag_base','','on'),(54,'show_avatars','1','on'),(55,'avatar_rating','G','on'),(56,'upload_url_path','','on'),(57,'thumbnail_size_w','150','on'),(58,'thumbnail_size_h','150','on'),(59,'thumbnail_crop','1','on'),(60,'medium_size_w','300','on'),(61,'medium_size_h','300','on'),(62,'avatar_default','mystery','on'),(63,'large_size_w','1024','on'),(64,'large_size_h','1024','on'),(65,'image_default_link_type','none','on'),(66,'image_default_size','','on'),(67,'image_default_align','','on'),(68,'close_comments_for_old_posts','0','on'),(69,'close_comments_days_old','14','on'),(70,'thread_comments','1','on'),(71,'thread_comments_depth','5','on'),(72,'page_comments','0','on'),(73,'comments_per_page','50','on'),(74,'default_comments_page','newest','on'),(75,'comment_order','asc','on'),(76,'sticky_posts','a:0:{}','on'),(77,'widget_categories','a:0:{}','on'),(78,'widget_text','a:0:{}','on'),(79,'widget_rss','a:0:{}','on'),(80,'uninstall_plugins','a:2:{s:24:\"wordpress-seo/wp-seo.php\";s:14:\"__return_false\";s:53:\"webp-converter-for-media/webp-converter-for-media.php\";a:2:{i:0;s:37:\"WebpConverter\\Plugin\\UninstallHandler\";i:1;s:22:\"load_uninstall_actions\";}}','off'),(81,'timezone_string','','on'),(82,'page_for_posts','9','on'),(83,'page_on_front','10','on'),(84,'default_post_format','0','on'),(85,'link_manager_enabled','0','on'),(86,'finished_splitting_shared_terms','1','on'),(87,'site_icon','0','on'),(88,'medium_large_size_w','768','on'),(89,'medium_large_size_h','0','on'),(90,'wp_page_for_privacy_policy','3','on'),(91,'show_comments_cookies_opt_in','1','on'),(92,'admin_email_lifespan','1779915744','on'),(93,'disallowed_keys','','off'),(94,'comment_previously_approved','1','on'),(95,'auto_plugin_theme_update_emails','a:0:{}','off'),(96,'auto_update_core_dev','enabled','on'),(97,'auto_update_core_minor','enabled','on'),(98,'auto_update_core_major','enabled','on'),(99,'wp_force_deactivated_plugins','a:0:{}','on'),(100,'wp_attachment_pages_enabled','1','on'),(101,'initial_db_version','60421','on'),(102,'wp_user_roles','a:7:{s:13:\"administrator\";a:2:{s:4:\"name\";s:13:\"Administrator\";s:12:\"capabilities\";a:62:{s:13:\"switch_themes\";b:1;s:11:\"edit_themes\";b:1;s:16:\"activate_plugins\";b:1;s:12:\"edit_plugins\";b:1;s:10:\"edit_users\";b:1;s:10:\"edit_files\";b:1;s:14:\"manage_options\";b:1;s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:6:\"import\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:8:\"level_10\";b:1;s:7:\"level_9\";b:1;s:7:\"level_8\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:12:\"delete_users\";b:1;s:12:\"create_users\";b:1;s:17:\"unfiltered_upload\";b:1;s:14:\"edit_dashboard\";b:1;s:14:\"update_plugins\";b:1;s:14:\"delete_plugins\";b:1;s:15:\"install_plugins\";b:1;s:13:\"update_themes\";b:1;s:14:\"install_themes\";b:1;s:11:\"update_core\";b:1;s:10:\"list_users\";b:1;s:12:\"remove_users\";b:1;s:13:\"promote_users\";b:1;s:18:\"edit_theme_options\";b:1;s:13:\"delete_themes\";b:1;s:6:\"export\";b:1;s:20:\"wpseo_manage_options\";b:1;}}s:6:\"editor\";a:2:{s:4:\"name\";s:6:\"Editor\";s:12:\"capabilities\";a:36:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:15:\"wpseo_bulk_edit\";b:1;s:28:\"wpseo_edit_advanced_metadata\";b:1;}}s:6:\"author\";a:2:{s:4:\"name\";s:6:\"Author\";s:12:\"capabilities\";a:10:{s:12:\"upload_files\";b:1;s:10:\"edit_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;s:22:\"delete_published_posts\";b:1;}}s:11:\"contributor\";a:2:{s:4:\"name\";s:11:\"Contributor\";s:12:\"capabilities\";a:5:{s:10:\"edit_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;}}s:10:\"subscriber\";a:2:{s:4:\"name\";s:10:\"Subscriber\";s:12:\"capabilities\";a:2:{s:4:\"read\";b:1;s:7:\"level_0\";b:1;}}s:13:\"wpseo_manager\";a:2:{s:4:\"name\";s:11:\"SEO Manager\";s:12:\"capabilities\";a:38:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:15:\"wpseo_bulk_edit\";b:1;s:28:\"wpseo_edit_advanced_metadata\";b:1;s:20:\"wpseo_manage_options\";b:1;s:23:\"view_site_health_checks\";b:1;}}s:12:\"wpseo_editor\";a:2:{s:4:\"name\";s:10:\"SEO Editor\";s:12:\"capabilities\";a:36:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:15:\"wpseo_bulk_edit\";b:1;s:28:\"wpseo_edit_advanced_metadata\";b:1;}}}','on'),(103,'fresh_site','0','off'),(104,'user_count','1','off'),(105,'widget_block','a:6:{i:2;a:1:{s:7:\"content\";s:19:\"\";}i:3;a:1:{s:7:\"content\";s:154:\"

Recent Posts

\";}i:4;a:1:{s:7:\"content\";s:227:\"

Recent Comments

\";}i:5;a:1:{s:7:\"content\";s:146:\"

Archives

\";}i:6;a:1:{s:7:\"content\";s:150:\"

Categories

\";}s:12:\"_multiwidget\";i:1;}','auto'),(106,'sidebars_widgets','a:2:{s:19:\"wp_inactive_widgets\";a:5:{i:0;s:7:\"block-2\";i:1;s:7:\"block-3\";i:2;s:7:\"block-4\";i:3;s:7:\"block-5\";i:4;s:7:\"block-6\";}s:13:\"array_version\";i:3;}','auto'),(107,'widget_pages','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(108,'widget_calendar','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(109,'widget_archives','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(110,'widget_media_audio','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(111,'widget_media_image','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(112,'widget_media_gallery','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(113,'widget_media_video','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(114,'widget_meta','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(115,'widget_search','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(116,'widget_recent-posts','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(117,'widget_recent-comments','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(118,'widget_tag_cloud','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(119,'widget_nav_menu','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(120,'widget_custom_html','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(121,'_transient_wp_core_block_css_files','a:2:{s:7:\"version\";s:5:\"6.8.3\";s:5:\"files\";a:536:{i:0;s:23:\"archives/editor-rtl.css\";i:1;s:27:\"archives/editor-rtl.min.css\";i:2;s:19:\"archives/editor.css\";i:3;s:23:\"archives/editor.min.css\";i:4;s:22:\"archives/style-rtl.css\";i:5;s:26:\"archives/style-rtl.min.css\";i:6;s:18:\"archives/style.css\";i:7;s:22:\"archives/style.min.css\";i:8;s:20:\"audio/editor-rtl.css\";i:9;s:24:\"audio/editor-rtl.min.css\";i:10;s:16:\"audio/editor.css\";i:11;s:20:\"audio/editor.min.css\";i:12;s:19:\"audio/style-rtl.css\";i:13;s:23:\"audio/style-rtl.min.css\";i:14;s:15:\"audio/style.css\";i:15;s:19:\"audio/style.min.css\";i:16;s:19:\"audio/theme-rtl.css\";i:17;s:23:\"audio/theme-rtl.min.css\";i:18;s:15:\"audio/theme.css\";i:19;s:19:\"audio/theme.min.css\";i:20;s:21:\"avatar/editor-rtl.css\";i:21;s:25:\"avatar/editor-rtl.min.css\";i:22;s:17:\"avatar/editor.css\";i:23;s:21:\"avatar/editor.min.css\";i:24;s:20:\"avatar/style-rtl.css\";i:25;s:24:\"avatar/style-rtl.min.css\";i:26;s:16:\"avatar/style.css\";i:27;s:20:\"avatar/style.min.css\";i:28;s:21:\"button/editor-rtl.css\";i:29;s:25:\"button/editor-rtl.min.css\";i:30;s:17:\"button/editor.css\";i:31;s:21:\"button/editor.min.css\";i:32;s:20:\"button/style-rtl.css\";i:33;s:24:\"button/style-rtl.min.css\";i:34;s:16:\"button/style.css\";i:35;s:20:\"button/style.min.css\";i:36;s:22:\"buttons/editor-rtl.css\";i:37;s:26:\"buttons/editor-rtl.min.css\";i:38;s:18:\"buttons/editor.css\";i:39;s:22:\"buttons/editor.min.css\";i:40;s:21:\"buttons/style-rtl.css\";i:41;s:25:\"buttons/style-rtl.min.css\";i:42;s:17:\"buttons/style.css\";i:43;s:21:\"buttons/style.min.css\";i:44;s:22:\"calendar/style-rtl.css\";i:45;s:26:\"calendar/style-rtl.min.css\";i:46;s:18:\"calendar/style.css\";i:47;s:22:\"calendar/style.min.css\";i:48;s:25:\"categories/editor-rtl.css\";i:49;s:29:\"categories/editor-rtl.min.css\";i:50;s:21:\"categories/editor.css\";i:51;s:25:\"categories/editor.min.css\";i:52;s:24:\"categories/style-rtl.css\";i:53;s:28:\"categories/style-rtl.min.css\";i:54;s:20:\"categories/style.css\";i:55;s:24:\"categories/style.min.css\";i:56;s:19:\"code/editor-rtl.css\";i:57;s:23:\"code/editor-rtl.min.css\";i:58;s:15:\"code/editor.css\";i:59;s:19:\"code/editor.min.css\";i:60;s:18:\"code/style-rtl.css\";i:61;s:22:\"code/style-rtl.min.css\";i:62;s:14:\"code/style.css\";i:63;s:18:\"code/style.min.css\";i:64;s:18:\"code/theme-rtl.css\";i:65;s:22:\"code/theme-rtl.min.css\";i:66;s:14:\"code/theme.css\";i:67;s:18:\"code/theme.min.css\";i:68;s:22:\"columns/editor-rtl.css\";i:69;s:26:\"columns/editor-rtl.min.css\";i:70;s:18:\"columns/editor.css\";i:71;s:22:\"columns/editor.min.css\";i:72;s:21:\"columns/style-rtl.css\";i:73;s:25:\"columns/style-rtl.min.css\";i:74;s:17:\"columns/style.css\";i:75;s:21:\"columns/style.min.css\";i:76;s:33:\"comment-author-name/style-rtl.css\";i:77;s:37:\"comment-author-name/style-rtl.min.css\";i:78;s:29:\"comment-author-name/style.css\";i:79;s:33:\"comment-author-name/style.min.css\";i:80;s:29:\"comment-content/style-rtl.css\";i:81;s:33:\"comment-content/style-rtl.min.css\";i:82;s:25:\"comment-content/style.css\";i:83;s:29:\"comment-content/style.min.css\";i:84;s:26:\"comment-date/style-rtl.css\";i:85;s:30:\"comment-date/style-rtl.min.css\";i:86;s:22:\"comment-date/style.css\";i:87;s:26:\"comment-date/style.min.css\";i:88;s:31:\"comment-edit-link/style-rtl.css\";i:89;s:35:\"comment-edit-link/style-rtl.min.css\";i:90;s:27:\"comment-edit-link/style.css\";i:91;s:31:\"comment-edit-link/style.min.css\";i:92;s:32:\"comment-reply-link/style-rtl.css\";i:93;s:36:\"comment-reply-link/style-rtl.min.css\";i:94;s:28:\"comment-reply-link/style.css\";i:95;s:32:\"comment-reply-link/style.min.css\";i:96;s:30:\"comment-template/style-rtl.css\";i:97;s:34:\"comment-template/style-rtl.min.css\";i:98;s:26:\"comment-template/style.css\";i:99;s:30:\"comment-template/style.min.css\";i:100;s:42:\"comments-pagination-numbers/editor-rtl.css\";i:101;s:46:\"comments-pagination-numbers/editor-rtl.min.css\";i:102;s:38:\"comments-pagination-numbers/editor.css\";i:103;s:42:\"comments-pagination-numbers/editor.min.css\";i:104;s:34:\"comments-pagination/editor-rtl.css\";i:105;s:38:\"comments-pagination/editor-rtl.min.css\";i:106;s:30:\"comments-pagination/editor.css\";i:107;s:34:\"comments-pagination/editor.min.css\";i:108;s:33:\"comments-pagination/style-rtl.css\";i:109;s:37:\"comments-pagination/style-rtl.min.css\";i:110;s:29:\"comments-pagination/style.css\";i:111;s:33:\"comments-pagination/style.min.css\";i:112;s:29:\"comments-title/editor-rtl.css\";i:113;s:33:\"comments-title/editor-rtl.min.css\";i:114;s:25:\"comments-title/editor.css\";i:115;s:29:\"comments-title/editor.min.css\";i:116;s:23:\"comments/editor-rtl.css\";i:117;s:27:\"comments/editor-rtl.min.css\";i:118;s:19:\"comments/editor.css\";i:119;s:23:\"comments/editor.min.css\";i:120;s:22:\"comments/style-rtl.css\";i:121;s:26:\"comments/style-rtl.min.css\";i:122;s:18:\"comments/style.css\";i:123;s:22:\"comments/style.min.css\";i:124;s:20:\"cover/editor-rtl.css\";i:125;s:24:\"cover/editor-rtl.min.css\";i:126;s:16:\"cover/editor.css\";i:127;s:20:\"cover/editor.min.css\";i:128;s:19:\"cover/style-rtl.css\";i:129;s:23:\"cover/style-rtl.min.css\";i:130;s:15:\"cover/style.css\";i:131;s:19:\"cover/style.min.css\";i:132;s:22:\"details/editor-rtl.css\";i:133;s:26:\"details/editor-rtl.min.css\";i:134;s:18:\"details/editor.css\";i:135;s:22:\"details/editor.min.css\";i:136;s:21:\"details/style-rtl.css\";i:137;s:25:\"details/style-rtl.min.css\";i:138;s:17:\"details/style.css\";i:139;s:21:\"details/style.min.css\";i:140;s:20:\"embed/editor-rtl.css\";i:141;s:24:\"embed/editor-rtl.min.css\";i:142;s:16:\"embed/editor.css\";i:143;s:20:\"embed/editor.min.css\";i:144;s:19:\"embed/style-rtl.css\";i:145;s:23:\"embed/style-rtl.min.css\";i:146;s:15:\"embed/style.css\";i:147;s:19:\"embed/style.min.css\";i:148;s:19:\"embed/theme-rtl.css\";i:149;s:23:\"embed/theme-rtl.min.css\";i:150;s:15:\"embed/theme.css\";i:151;s:19:\"embed/theme.min.css\";i:152;s:19:\"file/editor-rtl.css\";i:153;s:23:\"file/editor-rtl.min.css\";i:154;s:15:\"file/editor.css\";i:155;s:19:\"file/editor.min.css\";i:156;s:18:\"file/style-rtl.css\";i:157;s:22:\"file/style-rtl.min.css\";i:158;s:14:\"file/style.css\";i:159;s:18:\"file/style.min.css\";i:160;s:23:\"footnotes/style-rtl.css\";i:161;s:27:\"footnotes/style-rtl.min.css\";i:162;s:19:\"footnotes/style.css\";i:163;s:23:\"footnotes/style.min.css\";i:164;s:23:\"freeform/editor-rtl.css\";i:165;s:27:\"freeform/editor-rtl.min.css\";i:166;s:19:\"freeform/editor.css\";i:167;s:23:\"freeform/editor.min.css\";i:168;s:22:\"gallery/editor-rtl.css\";i:169;s:26:\"gallery/editor-rtl.min.css\";i:170;s:18:\"gallery/editor.css\";i:171;s:22:\"gallery/editor.min.css\";i:172;s:21:\"gallery/style-rtl.css\";i:173;s:25:\"gallery/style-rtl.min.css\";i:174;s:17:\"gallery/style.css\";i:175;s:21:\"gallery/style.min.css\";i:176;s:21:\"gallery/theme-rtl.css\";i:177;s:25:\"gallery/theme-rtl.min.css\";i:178;s:17:\"gallery/theme.css\";i:179;s:21:\"gallery/theme.min.css\";i:180;s:20:\"group/editor-rtl.css\";i:181;s:24:\"group/editor-rtl.min.css\";i:182;s:16:\"group/editor.css\";i:183;s:20:\"group/editor.min.css\";i:184;s:19:\"group/style-rtl.css\";i:185;s:23:\"group/style-rtl.min.css\";i:186;s:15:\"group/style.css\";i:187;s:19:\"group/style.min.css\";i:188;s:19:\"group/theme-rtl.css\";i:189;s:23:\"group/theme-rtl.min.css\";i:190;s:15:\"group/theme.css\";i:191;s:19:\"group/theme.min.css\";i:192;s:21:\"heading/style-rtl.css\";i:193;s:25:\"heading/style-rtl.min.css\";i:194;s:17:\"heading/style.css\";i:195;s:21:\"heading/style.min.css\";i:196;s:19:\"html/editor-rtl.css\";i:197;s:23:\"html/editor-rtl.min.css\";i:198;s:15:\"html/editor.css\";i:199;s:19:\"html/editor.min.css\";i:200;s:20:\"image/editor-rtl.css\";i:201;s:24:\"image/editor-rtl.min.css\";i:202;s:16:\"image/editor.css\";i:203;s:20:\"image/editor.min.css\";i:204;s:19:\"image/style-rtl.css\";i:205;s:23:\"image/style-rtl.min.css\";i:206;s:15:\"image/style.css\";i:207;s:19:\"image/style.min.css\";i:208;s:19:\"image/theme-rtl.css\";i:209;s:23:\"image/theme-rtl.min.css\";i:210;s:15:\"image/theme.css\";i:211;s:19:\"image/theme.min.css\";i:212;s:29:\"latest-comments/style-rtl.css\";i:213;s:33:\"latest-comments/style-rtl.min.css\";i:214;s:25:\"latest-comments/style.css\";i:215;s:29:\"latest-comments/style.min.css\";i:216;s:27:\"latest-posts/editor-rtl.css\";i:217;s:31:\"latest-posts/editor-rtl.min.css\";i:218;s:23:\"latest-posts/editor.css\";i:219;s:27:\"latest-posts/editor.min.css\";i:220;s:26:\"latest-posts/style-rtl.css\";i:221;s:30:\"latest-posts/style-rtl.min.css\";i:222;s:22:\"latest-posts/style.css\";i:223;s:26:\"latest-posts/style.min.css\";i:224;s:18:\"list/style-rtl.css\";i:225;s:22:\"list/style-rtl.min.css\";i:226;s:14:\"list/style.css\";i:227;s:18:\"list/style.min.css\";i:228;s:22:\"loginout/style-rtl.css\";i:229;s:26:\"loginout/style-rtl.min.css\";i:230;s:18:\"loginout/style.css\";i:231;s:22:\"loginout/style.min.css\";i:232;s:25:\"media-text/editor-rtl.css\";i:233;s:29:\"media-text/editor-rtl.min.css\";i:234;s:21:\"media-text/editor.css\";i:235;s:25:\"media-text/editor.min.css\";i:236;s:24:\"media-text/style-rtl.css\";i:237;s:28:\"media-text/style-rtl.min.css\";i:238;s:20:\"media-text/style.css\";i:239;s:24:\"media-text/style.min.css\";i:240;s:19:\"more/editor-rtl.css\";i:241;s:23:\"more/editor-rtl.min.css\";i:242;s:15:\"more/editor.css\";i:243;s:19:\"more/editor.min.css\";i:244;s:30:\"navigation-link/editor-rtl.css\";i:245;s:34:\"navigation-link/editor-rtl.min.css\";i:246;s:26:\"navigation-link/editor.css\";i:247;s:30:\"navigation-link/editor.min.css\";i:248;s:29:\"navigation-link/style-rtl.css\";i:249;s:33:\"navigation-link/style-rtl.min.css\";i:250;s:25:\"navigation-link/style.css\";i:251;s:29:\"navigation-link/style.min.css\";i:252;s:33:\"navigation-submenu/editor-rtl.css\";i:253;s:37:\"navigation-submenu/editor-rtl.min.css\";i:254;s:29:\"navigation-submenu/editor.css\";i:255;s:33:\"navigation-submenu/editor.min.css\";i:256;s:25:\"navigation/editor-rtl.css\";i:257;s:29:\"navigation/editor-rtl.min.css\";i:258;s:21:\"navigation/editor.css\";i:259;s:25:\"navigation/editor.min.css\";i:260;s:24:\"navigation/style-rtl.css\";i:261;s:28:\"navigation/style-rtl.min.css\";i:262;s:20:\"navigation/style.css\";i:263;s:24:\"navigation/style.min.css\";i:264;s:23:\"nextpage/editor-rtl.css\";i:265;s:27:\"nextpage/editor-rtl.min.css\";i:266;s:19:\"nextpage/editor.css\";i:267;s:23:\"nextpage/editor.min.css\";i:268;s:24:\"page-list/editor-rtl.css\";i:269;s:28:\"page-list/editor-rtl.min.css\";i:270;s:20:\"page-list/editor.css\";i:271;s:24:\"page-list/editor.min.css\";i:272;s:23:\"page-list/style-rtl.css\";i:273;s:27:\"page-list/style-rtl.min.css\";i:274;s:19:\"page-list/style.css\";i:275;s:23:\"page-list/style.min.css\";i:276;s:24:\"paragraph/editor-rtl.css\";i:277;s:28:\"paragraph/editor-rtl.min.css\";i:278;s:20:\"paragraph/editor.css\";i:279;s:24:\"paragraph/editor.min.css\";i:280;s:23:\"paragraph/style-rtl.css\";i:281;s:27:\"paragraph/style-rtl.min.css\";i:282;s:19:\"paragraph/style.css\";i:283;s:23:\"paragraph/style.min.css\";i:284;s:35:\"post-author-biography/style-rtl.css\";i:285;s:39:\"post-author-biography/style-rtl.min.css\";i:286;s:31:\"post-author-biography/style.css\";i:287;s:35:\"post-author-biography/style.min.css\";i:288;s:30:\"post-author-name/style-rtl.css\";i:289;s:34:\"post-author-name/style-rtl.min.css\";i:290;s:26:\"post-author-name/style.css\";i:291;s:30:\"post-author-name/style.min.css\";i:292;s:26:\"post-author/editor-rtl.css\";i:293;s:30:\"post-author/editor-rtl.min.css\";i:294;s:22:\"post-author/editor.css\";i:295;s:26:\"post-author/editor.min.css\";i:296;s:25:\"post-author/style-rtl.css\";i:297;s:29:\"post-author/style-rtl.min.css\";i:298;s:21:\"post-author/style.css\";i:299;s:25:\"post-author/style.min.css\";i:300;s:33:\"post-comments-form/editor-rtl.css\";i:301;s:37:\"post-comments-form/editor-rtl.min.css\";i:302;s:29:\"post-comments-form/editor.css\";i:303;s:33:\"post-comments-form/editor.min.css\";i:304;s:32:\"post-comments-form/style-rtl.css\";i:305;s:36:\"post-comments-form/style-rtl.min.css\";i:306;s:28:\"post-comments-form/style.css\";i:307;s:32:\"post-comments-form/style.min.css\";i:308;s:26:\"post-content/style-rtl.css\";i:309;s:30:\"post-content/style-rtl.min.css\";i:310;s:22:\"post-content/style.css\";i:311;s:26:\"post-content/style.min.css\";i:312;s:23:\"post-date/style-rtl.css\";i:313;s:27:\"post-date/style-rtl.min.css\";i:314;s:19:\"post-date/style.css\";i:315;s:23:\"post-date/style.min.css\";i:316;s:27:\"post-excerpt/editor-rtl.css\";i:317;s:31:\"post-excerpt/editor-rtl.min.css\";i:318;s:23:\"post-excerpt/editor.css\";i:319;s:27:\"post-excerpt/editor.min.css\";i:320;s:26:\"post-excerpt/style-rtl.css\";i:321;s:30:\"post-excerpt/style-rtl.min.css\";i:322;s:22:\"post-excerpt/style.css\";i:323;s:26:\"post-excerpt/style.min.css\";i:324;s:34:\"post-featured-image/editor-rtl.css\";i:325;s:38:\"post-featured-image/editor-rtl.min.css\";i:326;s:30:\"post-featured-image/editor.css\";i:327;s:34:\"post-featured-image/editor.min.css\";i:328;s:33:\"post-featured-image/style-rtl.css\";i:329;s:37:\"post-featured-image/style-rtl.min.css\";i:330;s:29:\"post-featured-image/style.css\";i:331;s:33:\"post-featured-image/style.min.css\";i:332;s:34:\"post-navigation-link/style-rtl.css\";i:333;s:38:\"post-navigation-link/style-rtl.min.css\";i:334;s:30:\"post-navigation-link/style.css\";i:335;s:34:\"post-navigation-link/style.min.css\";i:336;s:27:\"post-template/style-rtl.css\";i:337;s:31:\"post-template/style-rtl.min.css\";i:338;s:23:\"post-template/style.css\";i:339;s:27:\"post-template/style.min.css\";i:340;s:24:\"post-terms/style-rtl.css\";i:341;s:28:\"post-terms/style-rtl.min.css\";i:342;s:20:\"post-terms/style.css\";i:343;s:24:\"post-terms/style.min.css\";i:344;s:24:\"post-title/style-rtl.css\";i:345;s:28:\"post-title/style-rtl.min.css\";i:346;s:20:\"post-title/style.css\";i:347;s:24:\"post-title/style.min.css\";i:348;s:26:\"preformatted/style-rtl.css\";i:349;s:30:\"preformatted/style-rtl.min.css\";i:350;s:22:\"preformatted/style.css\";i:351;s:26:\"preformatted/style.min.css\";i:352;s:24:\"pullquote/editor-rtl.css\";i:353;s:28:\"pullquote/editor-rtl.min.css\";i:354;s:20:\"pullquote/editor.css\";i:355;s:24:\"pullquote/editor.min.css\";i:356;s:23:\"pullquote/style-rtl.css\";i:357;s:27:\"pullquote/style-rtl.min.css\";i:358;s:19:\"pullquote/style.css\";i:359;s:23:\"pullquote/style.min.css\";i:360;s:23:\"pullquote/theme-rtl.css\";i:361;s:27:\"pullquote/theme-rtl.min.css\";i:362;s:19:\"pullquote/theme.css\";i:363;s:23:\"pullquote/theme.min.css\";i:364;s:39:\"query-pagination-numbers/editor-rtl.css\";i:365;s:43:\"query-pagination-numbers/editor-rtl.min.css\";i:366;s:35:\"query-pagination-numbers/editor.css\";i:367;s:39:\"query-pagination-numbers/editor.min.css\";i:368;s:31:\"query-pagination/editor-rtl.css\";i:369;s:35:\"query-pagination/editor-rtl.min.css\";i:370;s:27:\"query-pagination/editor.css\";i:371;s:31:\"query-pagination/editor.min.css\";i:372;s:30:\"query-pagination/style-rtl.css\";i:373;s:34:\"query-pagination/style-rtl.min.css\";i:374;s:26:\"query-pagination/style.css\";i:375;s:30:\"query-pagination/style.min.css\";i:376;s:25:\"query-title/style-rtl.css\";i:377;s:29:\"query-title/style-rtl.min.css\";i:378;s:21:\"query-title/style.css\";i:379;s:25:\"query-title/style.min.css\";i:380;s:25:\"query-total/style-rtl.css\";i:381;s:29:\"query-total/style-rtl.min.css\";i:382;s:21:\"query-total/style.css\";i:383;s:25:\"query-total/style.min.css\";i:384;s:20:\"query/editor-rtl.css\";i:385;s:24:\"query/editor-rtl.min.css\";i:386;s:16:\"query/editor.css\";i:387;s:20:\"query/editor.min.css\";i:388;s:19:\"quote/style-rtl.css\";i:389;s:23:\"quote/style-rtl.min.css\";i:390;s:15:\"quote/style.css\";i:391;s:19:\"quote/style.min.css\";i:392;s:19:\"quote/theme-rtl.css\";i:393;s:23:\"quote/theme-rtl.min.css\";i:394;s:15:\"quote/theme.css\";i:395;s:19:\"quote/theme.min.css\";i:396;s:23:\"read-more/style-rtl.css\";i:397;s:27:\"read-more/style-rtl.min.css\";i:398;s:19:\"read-more/style.css\";i:399;s:23:\"read-more/style.min.css\";i:400;s:18:\"rss/editor-rtl.css\";i:401;s:22:\"rss/editor-rtl.min.css\";i:402;s:14:\"rss/editor.css\";i:403;s:18:\"rss/editor.min.css\";i:404;s:17:\"rss/style-rtl.css\";i:405;s:21:\"rss/style-rtl.min.css\";i:406;s:13:\"rss/style.css\";i:407;s:17:\"rss/style.min.css\";i:408;s:21:\"search/editor-rtl.css\";i:409;s:25:\"search/editor-rtl.min.css\";i:410;s:17:\"search/editor.css\";i:411;s:21:\"search/editor.min.css\";i:412;s:20:\"search/style-rtl.css\";i:413;s:24:\"search/style-rtl.min.css\";i:414;s:16:\"search/style.css\";i:415;s:20:\"search/style.min.css\";i:416;s:20:\"search/theme-rtl.css\";i:417;s:24:\"search/theme-rtl.min.css\";i:418;s:16:\"search/theme.css\";i:419;s:20:\"search/theme.min.css\";i:420;s:24:\"separator/editor-rtl.css\";i:421;s:28:\"separator/editor-rtl.min.css\";i:422;s:20:\"separator/editor.css\";i:423;s:24:\"separator/editor.min.css\";i:424;s:23:\"separator/style-rtl.css\";i:425;s:27:\"separator/style-rtl.min.css\";i:426;s:19:\"separator/style.css\";i:427;s:23:\"separator/style.min.css\";i:428;s:23:\"separator/theme-rtl.css\";i:429;s:27:\"separator/theme-rtl.min.css\";i:430;s:19:\"separator/theme.css\";i:431;s:23:\"separator/theme.min.css\";i:432;s:24:\"shortcode/editor-rtl.css\";i:433;s:28:\"shortcode/editor-rtl.min.css\";i:434;s:20:\"shortcode/editor.css\";i:435;s:24:\"shortcode/editor.min.css\";i:436;s:24:\"site-logo/editor-rtl.css\";i:437;s:28:\"site-logo/editor-rtl.min.css\";i:438;s:20:\"site-logo/editor.css\";i:439;s:24:\"site-logo/editor.min.css\";i:440;s:23:\"site-logo/style-rtl.css\";i:441;s:27:\"site-logo/style-rtl.min.css\";i:442;s:19:\"site-logo/style.css\";i:443;s:23:\"site-logo/style.min.css\";i:444;s:27:\"site-tagline/editor-rtl.css\";i:445;s:31:\"site-tagline/editor-rtl.min.css\";i:446;s:23:\"site-tagline/editor.css\";i:447;s:27:\"site-tagline/editor.min.css\";i:448;s:26:\"site-tagline/style-rtl.css\";i:449;s:30:\"site-tagline/style-rtl.min.css\";i:450;s:22:\"site-tagline/style.css\";i:451;s:26:\"site-tagline/style.min.css\";i:452;s:25:\"site-title/editor-rtl.css\";i:453;s:29:\"site-title/editor-rtl.min.css\";i:454;s:21:\"site-title/editor.css\";i:455;s:25:\"site-title/editor.min.css\";i:456;s:24:\"site-title/style-rtl.css\";i:457;s:28:\"site-title/style-rtl.min.css\";i:458;s:20:\"site-title/style.css\";i:459;s:24:\"site-title/style.min.css\";i:460;s:26:\"social-link/editor-rtl.css\";i:461;s:30:\"social-link/editor-rtl.min.css\";i:462;s:22:\"social-link/editor.css\";i:463;s:26:\"social-link/editor.min.css\";i:464;s:27:\"social-links/editor-rtl.css\";i:465;s:31:\"social-links/editor-rtl.min.css\";i:466;s:23:\"social-links/editor.css\";i:467;s:27:\"social-links/editor.min.css\";i:468;s:26:\"social-links/style-rtl.css\";i:469;s:30:\"social-links/style-rtl.min.css\";i:470;s:22:\"social-links/style.css\";i:471;s:26:\"social-links/style.min.css\";i:472;s:21:\"spacer/editor-rtl.css\";i:473;s:25:\"spacer/editor-rtl.min.css\";i:474;s:17:\"spacer/editor.css\";i:475;s:21:\"spacer/editor.min.css\";i:476;s:20:\"spacer/style-rtl.css\";i:477;s:24:\"spacer/style-rtl.min.css\";i:478;s:16:\"spacer/style.css\";i:479;s:20:\"spacer/style.min.css\";i:480;s:20:\"table/editor-rtl.css\";i:481;s:24:\"table/editor-rtl.min.css\";i:482;s:16:\"table/editor.css\";i:483;s:20:\"table/editor.min.css\";i:484;s:19:\"table/style-rtl.css\";i:485;s:23:\"table/style-rtl.min.css\";i:486;s:15:\"table/style.css\";i:487;s:19:\"table/style.min.css\";i:488;s:19:\"table/theme-rtl.css\";i:489;s:23:\"table/theme-rtl.min.css\";i:490;s:15:\"table/theme.css\";i:491;s:19:\"table/theme.min.css\";i:492;s:24:\"tag-cloud/editor-rtl.css\";i:493;s:28:\"tag-cloud/editor-rtl.min.css\";i:494;s:20:\"tag-cloud/editor.css\";i:495;s:24:\"tag-cloud/editor.min.css\";i:496;s:23:\"tag-cloud/style-rtl.css\";i:497;s:27:\"tag-cloud/style-rtl.min.css\";i:498;s:19:\"tag-cloud/style.css\";i:499;s:23:\"tag-cloud/style.min.css\";i:500;s:28:\"template-part/editor-rtl.css\";i:501;s:32:\"template-part/editor-rtl.min.css\";i:502;s:24:\"template-part/editor.css\";i:503;s:28:\"template-part/editor.min.css\";i:504;s:27:\"template-part/theme-rtl.css\";i:505;s:31:\"template-part/theme-rtl.min.css\";i:506;s:23:\"template-part/theme.css\";i:507;s:27:\"template-part/theme.min.css\";i:508;s:30:\"term-description/style-rtl.css\";i:509;s:34:\"term-description/style-rtl.min.css\";i:510;s:26:\"term-description/style.css\";i:511;s:30:\"term-description/style.min.css\";i:512;s:27:\"text-columns/editor-rtl.css\";i:513;s:31:\"text-columns/editor-rtl.min.css\";i:514;s:23:\"text-columns/editor.css\";i:515;s:27:\"text-columns/editor.min.css\";i:516;s:26:\"text-columns/style-rtl.css\";i:517;s:30:\"text-columns/style-rtl.min.css\";i:518;s:22:\"text-columns/style.css\";i:519;s:26:\"text-columns/style.min.css\";i:520;s:19:\"verse/style-rtl.css\";i:521;s:23:\"verse/style-rtl.min.css\";i:522;s:15:\"verse/style.css\";i:523;s:19:\"verse/style.min.css\";i:524;s:20:\"video/editor-rtl.css\";i:525;s:24:\"video/editor-rtl.min.css\";i:526;s:16:\"video/editor.css\";i:527;s:20:\"video/editor.min.css\";i:528;s:19:\"video/style-rtl.css\";i:529;s:23:\"video/style-rtl.min.css\";i:530;s:15:\"video/style.css\";i:531;s:19:\"video/style.min.css\";i:532;s:19:\"video/theme-rtl.css\";i:533;s:23:\"video/theme-rtl.min.css\";i:534;s:15:\"video/theme.css\";i:535;s:19:\"video/theme.min.css\";}}','on'),(124,'_transient_doing_cron','1764371701.4586930274963378906250','on'),(125,'theme_mods_twentytwentyfive','a:2:{s:18:\"custom_css_post_id\";i:-1;s:16:\"sidebars_widgets\";a:2:{s:4:\"time\";i:1764367183;s:4:\"data\";a:3:{s:19:\"wp_inactive_widgets\";a:0:{}s:9:\"sidebar-1\";a:3:{i:0;s:7:\"block-2\";i:1;s:7:\"block-3\";i:2;s:7:\"block-4\";}s:9:\"sidebar-2\";a:2:{i:0;s:7:\"block-5\";i:1;s:7:\"block-6\";}}}}','off'),(126,'_transient_wp_styles_for_blocks','a:2:{s:4:\"hash\";s:32:\"64ad95698215776f80fa1e80f2eb5417\";s:6:\"blocks\";a:7:{s:11:\"core/button\";s:0:\"\";s:14:\"core/site-logo\";s:0:\"\";s:18:\"core/post-template\";s:0:\"\";s:12:\"core/columns\";s:0:\"\";s:14:\"core/pullquote\";s:121:\":root :where(.wp-block-pullquote){font-size: clamp(0.984em, 0.984rem + ((1vw - 0.2em) * 0.938), 1.5em);line-height: 1.6;}\";s:15:\"core/site-title\";s:89:\":root :where(.wp-block-site-title){font-family: var(--wp--preset--font-family--display);}\";s:15:\"core/navigation\";s:86:\":root :where(.wp-block-navigation){font-family: var(--wp--preset--font-family--body);}\";}}','on'),(129,'category_children','a:0:{}','auto'),(132,'_site_transient_update_themes','O:8:\"stdClass\":5:{s:12:\"last_checked\";i:1764371702;s:7:\"checked\";a:4:{s:8:\"homeproz\";s:5:\"1.0.0\";s:16:\"twentytwentyfive\";s:3:\"1.3\";s:16:\"twentytwentyfour\";s:3:\"1.3\";s:17:\"twentytwentythree\";s:3:\"1.6\";}s:8:\"response\";a:0:{}s:9:\"no_update\";a:3:{s:16:\"twentytwentyfive\";a:6:{s:5:\"theme\";s:16:\"twentytwentyfive\";s:11:\"new_version\";s:3:\"1.3\";s:3:\"url\";s:46:\"https://wordpress.org/themes/twentytwentyfive/\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/theme/twentytwentyfive.1.3.zip\";s:8:\"requires\";s:3:\"6.7\";s:12:\"requires_php\";s:3:\"7.2\";}s:16:\"twentytwentyfour\";a:6:{s:5:\"theme\";s:16:\"twentytwentyfour\";s:11:\"new_version\";s:3:\"1.3\";s:3:\"url\";s:46:\"https://wordpress.org/themes/twentytwentyfour/\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/theme/twentytwentyfour.1.3.zip\";s:8:\"requires\";s:3:\"6.4\";s:12:\"requires_php\";s:3:\"7.0\";}s:17:\"twentytwentythree\";a:6:{s:5:\"theme\";s:17:\"twentytwentythree\";s:11:\"new_version\";s:3:\"1.6\";s:3:\"url\";s:47:\"https://wordpress.org/themes/twentytwentythree/\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/theme/twentytwentythree.1.6.zip\";s:8:\"requires\";s:3:\"6.1\";s:12:\"requires_php\";s:3:\"5.6\";}}s:12:\"translations\";a:0:{}}','off'),(133,'current_theme','HomeProz','auto'),(134,'theme_switched','','auto'),(135,'theme_mods_homeproz','a:2:{s:18:\"nav_menu_locations\";a:1:{s:7:\"primary\";i:15;}s:18:\"custom_css_post_id\";i:-1;}','auto'),(141,'property_type_children','a:0:{}','auto'),(144,'property_status_children','a:0:{}','auto'),(150,'property_location_children','a:0:{}','auto'),(152,'_site_transient_update_core','O:8:\"stdClass\":4:{s:7:\"updates\";a:1:{i:0;O:8:\"stdClass\":10:{s:8:\"response\";s:6:\"latest\";s:8:\"download\";s:59:\"https://downloads.wordpress.org/release/wordpress-6.8.3.zip\";s:6:\"locale\";s:5:\"en_US\";s:8:\"packages\";O:8:\"stdClass\":5:{s:4:\"full\";s:59:\"https://downloads.wordpress.org/release/wordpress-6.8.3.zip\";s:10:\"no_content\";s:70:\"https://downloads.wordpress.org/release/wordpress-6.8.3-no-content.zip\";s:11:\"new_bundled\";s:71:\"https://downloads.wordpress.org/release/wordpress-6.8.3-new-bundled.zip\";s:7:\"partial\";s:0:\"\";s:8:\"rollback\";s:0:\"\";}s:7:\"current\";s:5:\"6.8.3\";s:7:\"version\";s:5:\"6.8.3\";s:11:\"php_version\";s:6:\"7.2.24\";s:13:\"mysql_version\";s:5:\"5.5.5\";s:11:\"new_bundled\";s:3:\"6.7\";s:15:\"partial_version\";s:0:\"\";}}s:12:\"last_checked\";i:1764371702;s:15:\"version_checked\";s:5:\"6.8.3\";s:12:\"translations\";a:0:{}}','off'),(156,'acf_first_activated_version','6.6.2','on'),(157,'acf_site_health','{\"event_first_activated\":1764369116,\"last_updated\":1764369116}','off'),(158,'_site_transient_timeout_wp_theme_files_patterns-2aae27f1f26ef7a6be8ebee5c8a6a86b','1764372438','off'),(159,'_site_transient_wp_theme_files_patterns-2aae27f1f26ef7a6be8ebee5c8a6a86b','a:2:{s:7:\"version\";s:5:\"1.0.0\";s:8:\"patterns\";a:0:{}}','off'),(162,'wpcf7','a:2:{s:7:\"version\";s:5:\"6.1.3\";s:13:\"bulk_validate\";a:4:{s:9:\"timestamp\";i:1764370639;s:7:\"version\";s:5:\"6.1.3\";s:11:\"count_valid\";i:1;s:13:\"count_invalid\";i:0;}}','auto'),(165,'_site_transient_timeout_theme_roots','1764373103','off'),(166,'_site_transient_theme_roots','a:4:{s:8:\"homeproz\";s:7:\"/themes\";s:16:\"twentytwentyfive\";s:7:\"/themes\";s:16:\"twentytwentyfour\";s:7:\"/themes\";s:17:\"twentytwentythree\";s:7:\"/themes\";}','off'),(167,'yoast_migrations_free','a:1:{s:7:\"version\";s:4:\"26.4\";}','auto'),(168,'wpseo','a:120:{s:8:\"tracking\";b:0;s:16:\"toggled_tracking\";b:0;s:22:\"license_server_version\";b:0;s:15:\"ms_defaults_set\";b:0;s:40:\"ignore_search_engines_discouraged_notice\";b:0;s:19:\"indexing_first_time\";b:1;s:16:\"indexing_started\";b:0;s:15:\"indexing_reason\";s:24:\"attachments_made_enabled\";s:29:\"indexables_indexing_completed\";b:0;s:13:\"index_now_key\";s:0:\"\";s:7:\"version\";s:4:\"26.4\";s:16:\"previous_version\";s:0:\"\";s:20:\"disableadvanced_meta\";b:1;s:30:\"enable_headless_rest_endpoints\";b:1;s:17:\"ryte_indexability\";b:0;s:11:\"baiduverify\";s:0:\"\";s:12:\"googleverify\";s:0:\"\";s:8:\"msverify\";s:0:\"\";s:12:\"yandexverify\";s:0:\"\";s:12:\"ahrefsverify\";s:0:\"\";s:9:\"site_type\";s:0:\"\";s:20:\"has_multiple_authors\";s:0:\"\";s:16:\"environment_type\";s:0:\"\";s:23:\"content_analysis_active\";b:1;s:23:\"keyword_analysis_active\";b:1;s:34:\"inclusive_language_analysis_active\";b:0;s:21:\"enable_admin_bar_menu\";b:1;s:26:\"enable_cornerstone_content\";b:1;s:18:\"enable_xml_sitemap\";b:1;s:24:\"enable_text_link_counter\";b:1;s:16:\"enable_index_now\";b:1;s:19:\"enable_ai_generator\";b:1;s:22:\"ai_enabled_pre_default\";b:0;s:22:\"show_onboarding_notice\";b:1;s:18:\"first_activated_on\";i:1764371307;s:13:\"myyoast-oauth\";b:0;s:26:\"semrush_integration_active\";b:1;s:14:\"semrush_tokens\";a:0:{}s:20:\"semrush_country_code\";s:2:\"us\";s:19:\"permalink_structure\";s:0:\"\";s:8:\"home_url\";s:0:\"\";s:18:\"dynamic_permalinks\";b:0;s:17:\"category_base_url\";s:0:\"\";s:12:\"tag_base_url\";s:0:\"\";s:21:\"custom_taxonomy_slugs\";a:0:{}s:29:\"enable_enhanced_slack_sharing\";b:1;s:23:\"enable_metabox_insights\";b:1;s:23:\"enable_link_suggestions\";b:1;s:26:\"algolia_integration_active\";b:0;s:14:\"import_cursors\";a:0:{}s:13:\"workouts_data\";a:1:{s:13:\"configuration\";a:1:{s:13:\"finishedSteps\";a:0:{}}}s:28:\"configuration_finished_steps\";a:0:{}s:36:\"dismiss_configuration_workout_notice\";b:0;s:34:\"dismiss_premium_deactivated_notice\";b:0;s:19:\"importing_completed\";a:0:{}s:26:\"wincher_integration_active\";b:1;s:14:\"wincher_tokens\";a:0:{}s:36:\"wincher_automatically_add_keyphrases\";b:0;s:18:\"wincher_website_id\";s:0:\"\";s:18:\"first_time_install\";b:1;s:34:\"should_redirect_after_install_free\";b:0;s:34:\"activation_redirect_timestamp_free\";i:1764371307;s:18:\"remove_feed_global\";b:0;s:27:\"remove_feed_global_comments\";b:0;s:25:\"remove_feed_post_comments\";b:0;s:19:\"remove_feed_authors\";b:0;s:22:\"remove_feed_categories\";b:0;s:16:\"remove_feed_tags\";b:0;s:29:\"remove_feed_custom_taxonomies\";b:0;s:22:\"remove_feed_post_types\";b:0;s:18:\"remove_feed_search\";b:0;s:21:\"remove_atom_rdf_feeds\";b:0;s:17:\"remove_shortlinks\";b:0;s:21:\"remove_rest_api_links\";b:0;s:20:\"remove_rsd_wlw_links\";b:0;s:19:\"remove_oembed_links\";b:0;s:16:\"remove_generator\";b:0;s:20:\"remove_emoji_scripts\";b:0;s:24:\"remove_powered_by_header\";b:0;s:22:\"remove_pingback_header\";b:0;s:28:\"clean_campaign_tracking_urls\";b:0;s:16:\"clean_permalinks\";b:0;s:32:\"clean_permalinks_extra_variables\";s:0:\"\";s:14:\"search_cleanup\";b:0;s:20:\"search_cleanup_emoji\";b:0;s:23:\"search_cleanup_patterns\";b:0;s:22:\"search_character_limit\";i:50;s:20:\"deny_search_crawling\";b:0;s:21:\"deny_wp_json_crawling\";b:0;s:20:\"deny_adsbot_crawling\";b:0;s:19:\"deny_ccbot_crawling\";b:0;s:29:\"deny_google_extended_crawling\";b:0;s:20:\"deny_gptbot_crawling\";b:0;s:27:\"redirect_search_pretty_urls\";b:0;s:29:\"least_readability_ignore_list\";a:0:{}s:27:\"least_seo_score_ignore_list\";a:0:{}s:23:\"most_linked_ignore_list\";a:0:{}s:24:\"least_linked_ignore_list\";a:0:{}s:28:\"indexables_page_reading_list\";a:5:{i:0;b:0;i:1;b:0;i:2;b:0;i:3;b:0;i:4;b:0;}s:25:\"indexables_overview_state\";s:21:\"dashboard-not-visited\";s:28:\"last_known_public_post_types\";a:0:{}s:28:\"last_known_public_taxonomies\";a:0:{}s:23:\"last_known_no_unindexed\";a:0:{}s:14:\"new_post_types\";a:0:{}s:14:\"new_taxonomies\";a:0:{}s:34:\"show_new_content_type_notification\";b:0;s:44:\"site_kit_configuration_permanently_dismissed\";b:0;s:18:\"site_kit_connected\";b:0;s:37:\"site_kit_tracking_setup_widget_loaded\";s:2:\"no\";s:41:\"site_kit_tracking_first_interaction_stage\";s:0:\"\";s:40:\"site_kit_tracking_last_interaction_stage\";s:0:\"\";s:52:\"site_kit_tracking_setup_widget_temporarily_dismissed\";s:2:\"no\";s:52:\"site_kit_tracking_setup_widget_permanently_dismissed\";s:2:\"no\";s:31:\"google_site_kit_feature_enabled\";b:0;s:25:\"ai_free_sparks_started_on\";N;s:15:\"enable_llms_txt\";b:0;s:15:\"last_updated_on\";b:0;s:17:\"default_seo_title\";a:0:{}s:21:\"default_seo_meta_desc\";a:0:{}s:18:\"first_activated_by\";i:0;}','auto'),(169,'wpseo_titles','a:173:{s:17:\"forcerewritetitle\";b:0;s:9:\"separator\";s:7:\"sc-dash\";s:16:\"title-home-wpseo\";s:47:\"HomeProz Real Estate | Albert Lea MN Properties\";s:18:\"title-author-wpseo\";s:41:\"%%name%%, Author at %%sitename%% %%page%%\";s:19:\"title-archive-wpseo\";s:38:\"%%date%% %%page%% %%sep%% %%sitename%%\";s:18:\"title-search-wpseo\";s:63:\"You searched for %%searchphrase%% %%page%% %%sep%% %%sitename%%\";s:15:\"title-404-wpseo\";s:35:\"Page not found %%sep%% %%sitename%%\";s:25:\"social-title-author-wpseo\";s:8:\"%%name%%\";s:26:\"social-title-archive-wpseo\";s:8:\"%%date%%\";s:31:\"social-description-author-wpseo\";s:0:\"\";s:32:\"social-description-archive-wpseo\";s:0:\"\";s:29:\"social-image-url-author-wpseo\";s:0:\"\";s:30:\"social-image-url-archive-wpseo\";s:0:\"\";s:28:\"social-image-id-author-wpseo\";i:0;s:29:\"social-image-id-archive-wpseo\";i:0;s:19:\"metadesc-home-wpseo\";s:120:\"HomeProz Real Estate - Your trusted partner for buying and selling homes in Albert Lea, Minnesota and surrounding areas.\";s:21:\"metadesc-author-wpseo\";s:0:\"\";s:22:\"metadesc-archive-wpseo\";s:0:\"\";s:9:\"rssbefore\";s:0:\"\";s:8:\"rssafter\";s:53:\"The post %%POSTLINK%% appeared first on %%BLOGLINK%%.\";s:20:\"noindex-author-wpseo\";b:0;s:28:\"noindex-author-noposts-wpseo\";b:0;s:21:\"noindex-archive-wpseo\";b:0;s:14:\"disable-author\";b:0;s:12:\"disable-date\";b:0;s:19:\"disable-post_format\";b:0;s:18:\"disable-attachment\";b:0;s:20:\"breadcrumbs-404crumb\";s:25:\"Error 404: Page not found\";s:29:\"breadcrumbs-display-blog-page\";b:0;s:20:\"breadcrumbs-boldlast\";b:0;s:25:\"breadcrumbs-archiveprefix\";s:12:\"Archives for\";s:18:\"breadcrumbs-enable\";b:0;s:16:\"breadcrumbs-home\";s:4:\"Home\";s:18:\"breadcrumbs-prefix\";s:0:\"\";s:24:\"breadcrumbs-searchprefix\";s:16:\"You searched for\";s:15:\"breadcrumbs-sep\";s:2:\"»\";s:12:\"website_name\";s:0:\"\";s:11:\"person_name\";s:0:\"\";s:11:\"person_logo\";s:0:\"\";s:22:\"alternate_website_name\";s:0:\"\";s:12:\"company_logo\";s:0:\"\";s:12:\"company_name\";s:0:\"\";s:22:\"company_alternate_name\";s:0:\"\";s:17:\"company_or_person\";s:7:\"company\";s:25:\"company_or_person_user_id\";b:0;s:17:\"stripcategorybase\";b:0;s:26:\"open_graph_frontpage_title\";s:12:\"%%sitename%%\";s:25:\"open_graph_frontpage_desc\";s:0:\"\";s:26:\"open_graph_frontpage_image\";s:0:\"\";s:24:\"publishing_principles_id\";i:0;s:25:\"ownership_funding_info_id\";i:0;s:29:\"actionable_feedback_policy_id\";i:0;s:21:\"corrections_policy_id\";i:0;s:16:\"ethics_policy_id\";i:0;s:19:\"diversity_policy_id\";i:0;s:28:\"diversity_staffing_report_id\";i:0;s:15:\"org-description\";s:0:\"\";s:9:\"org-email\";s:0:\"\";s:9:\"org-phone\";s:0:\"\";s:14:\"org-legal-name\";s:0:\"\";s:17:\"org-founding-date\";s:0:\"\";s:20:\"org-number-employees\";s:0:\"\";s:10:\"org-vat-id\";s:0:\"\";s:10:\"org-tax-id\";s:0:\"\";s:7:\"org-iso\";s:0:\"\";s:8:\"org-duns\";s:0:\"\";s:11:\"org-leicode\";s:0:\"\";s:9:\"org-naics\";s:0:\"\";s:10:\"title-post\";s:39:\"%%title%% %%page%% %%sep%% %%sitename%%\";s:13:\"metadesc-post\";s:0:\"\";s:12:\"noindex-post\";b:0;s:23:\"display-metabox-pt-post\";b:0;s:23:\"post_types-post-maintax\";i:0;s:21:\"schema-page-type-post\";s:7:\"WebPage\";s:24:\"schema-article-type-post\";s:7:\"Article\";s:17:\"social-title-post\";s:9:\"%%title%%\";s:23:\"social-description-post\";s:0:\"\";s:21:\"social-image-url-post\";s:0:\"\";s:20:\"social-image-id-post\";i:0;s:10:\"title-page\";s:39:\"%%title%% %%page%% %%sep%% %%sitename%%\";s:13:\"metadesc-page\";s:0:\"\";s:12:\"noindex-page\";b:0;s:23:\"display-metabox-pt-page\";b:0;s:23:\"post_types-page-maintax\";i:0;s:21:\"schema-page-type-page\";s:7:\"WebPage\";s:24:\"schema-article-type-page\";s:4:\"None\";s:17:\"social-title-page\";s:9:\"%%title%%\";s:23:\"social-description-page\";s:0:\"\";s:21:\"social-image-url-page\";s:0:\"\";s:20:\"social-image-id-page\";i:0;s:16:\"title-attachment\";s:39:\"%%title%% %%page%% %%sep%% %%sitename%%\";s:19:\"metadesc-attachment\";s:0:\"\";s:18:\"noindex-attachment\";b:0;s:29:\"display-metabox-pt-attachment\";b:0;s:29:\"post_types-attachment-maintax\";i:0;s:27:\"schema-page-type-attachment\";s:7:\"WebPage\";s:30:\"schema-article-type-attachment\";s:4:\"None\";s:18:\"title-tax-category\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:21:\"metadesc-tax-category\";s:0:\"\";s:28:\"display-metabox-tax-category\";b:0;s:20:\"noindex-tax-category\";b:0;s:25:\"social-title-tax-category\";s:23:\"%%term_title%% Archives\";s:31:\"social-description-tax-category\";s:0:\"\";s:29:\"social-image-url-tax-category\";s:0:\"\";s:28:\"social-image-id-tax-category\";i:0;s:26:\"taxonomy-category-ptparent\";i:0;s:18:\"title-tax-post_tag\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:21:\"metadesc-tax-post_tag\";s:0:\"\";s:28:\"display-metabox-tax-post_tag\";b:0;s:20:\"noindex-tax-post_tag\";b:0;s:25:\"social-title-tax-post_tag\";s:23:\"%%term_title%% Archives\";s:31:\"social-description-tax-post_tag\";s:0:\"\";s:29:\"social-image-url-tax-post_tag\";s:0:\"\";s:28:\"social-image-id-tax-post_tag\";i:0;s:26:\"taxonomy-post_tag-ptparent\";i:0;s:21:\"title-tax-post_format\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:24:\"metadesc-tax-post_format\";s:0:\"\";s:31:\"display-metabox-tax-post_format\";b:0;s:23:\"noindex-tax-post_format\";b:0;s:28:\"social-title-tax-post_format\";s:23:\"%%term_title%% Archives\";s:34:\"social-description-tax-post_format\";s:0:\"\";s:32:\"social-image-url-tax-post_format\";s:0:\"\";s:31:\"social-image-id-tax-post_format\";i:0;s:29:\"taxonomy-post_format-ptparent\";i:0;s:14:\"title-property\";s:30:\"%%title%% %%sep%% %%sitename%%\";s:17:\"metadesc-property\";s:106:\"View property details, photos, and features for %%title%%. Contact HomeProz Real Estate in Albert Lea, MN.\";s:16:\"noindex-property\";b:0;s:27:\"display-metabox-pt-property\";b:0;s:27:\"post_types-property-maintax\";i:0;s:25:\"schema-page-type-property\";s:7:\"WebPage\";s:28:\"schema-article-type-property\";s:4:\"None\";s:21:\"social-title-property\";s:9:\"%%title%%\";s:27:\"social-description-property\";s:0:\"\";s:25:\"social-image-url-property\";s:0:\"\";s:24:\"social-image-id-property\";i:0;s:24:\"title-ptarchive-property\";s:49:\"Properties For Sale %%page%% %%sep%% %%sitename%%\";s:27:\"metadesc-ptarchive-property\";s:126:\"Browse all properties for sale in Albert Lea, Minnesota and surrounding areas. Find your dream home with HomeProz Real Estate.\";s:26:\"bctitle-ptarchive-property\";s:0:\"\";s:26:\"noindex-ptarchive-property\";b:0;s:31:\"social-title-ptarchive-property\";s:21:\"%%pt_plural%% Archive\";s:37:\"social-description-ptarchive-property\";s:0:\"\";s:35:\"social-image-url-ptarchive-property\";s:0:\"\";s:34:\"social-image-id-ptarchive-property\";i:0;s:23:\"title-tax-property_type\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:26:\"metadesc-tax-property_type\";s:0:\"\";s:33:\"display-metabox-tax-property_type\";b:0;s:25:\"noindex-tax-property_type\";b:0;s:30:\"social-title-tax-property_type\";s:23:\"%%term_title%% Archives\";s:36:\"social-description-tax-property_type\";s:0:\"\";s:34:\"social-image-url-tax-property_type\";s:0:\"\";s:33:\"social-image-id-tax-property_type\";i:0;s:31:\"taxonomy-property_type-ptparent\";i:0;s:25:\"title-tax-property_status\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:28:\"metadesc-tax-property_status\";s:0:\"\";s:35:\"display-metabox-tax-property_status\";b:0;s:27:\"noindex-tax-property_status\";b:0;s:32:\"social-title-tax-property_status\";s:23:\"%%term_title%% Archives\";s:38:\"social-description-tax-property_status\";s:0:\"\";s:36:\"social-image-url-tax-property_status\";s:0:\"\";s:35:\"social-image-id-tax-property_status\";i:0;s:33:\"taxonomy-property_status-ptparent\";i:0;s:27:\"title-tax-property_location\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:30:\"metadesc-tax-property_location\";s:0:\"\";s:37:\"display-metabox-tax-property_location\";b:0;s:29:\"noindex-tax-property_location\";b:0;s:34:\"social-title-tax-property_location\";s:23:\"%%term_title%% Archives\";s:40:\"social-description-tax-property_location\";s:0:\"\";s:38:\"social-image-url-tax-property_location\";s:0:\"\";s:37:\"social-image-id-tax-property_location\";i:0;s:35:\"taxonomy-property_location-ptparent\";i:0;s:14:\"person_logo_id\";i:0;s:15:\"company_logo_id\";i:0;s:29:\"open_graph_frontpage_image_id\";i:0;}','auto'),(170,'wpseo_social','a:20:{s:13:\"facebook_site\";s:0:\"\";s:13:\"instagram_url\";s:0:\"\";s:12:\"linkedin_url\";s:0:\"\";s:11:\"myspace_url\";s:0:\"\";s:16:\"og_default_image\";s:0:\"\";s:19:\"og_default_image_id\";s:0:\"\";s:18:\"og_frontpage_title\";s:47:\"HomeProz Real Estate | Albert Lea MN Properties\";s:17:\"og_frontpage_desc\";s:97:\"Your trusted partner for buying and selling homes in Albert Lea, Minnesota and surrounding areas.\";s:18:\"og_frontpage_image\";s:0:\"\";s:21:\"og_frontpage_image_id\";s:0:\"\";s:9:\"opengraph\";b:1;s:13:\"pinterest_url\";s:0:\"\";s:15:\"pinterestverify\";s:0:\"\";s:7:\"twitter\";b:1;s:12:\"twitter_site\";s:0:\"\";s:17:\"twitter_card_type\";s:19:\"summary_large_image\";s:11:\"youtube_url\";s:0:\"\";s:13:\"wikipedia_url\";s:0:\"\";s:17:\"other_social_urls\";a:0:{}s:12:\"mastodon_url\";s:0:\"\";}','auto'),(171,'wpseo_llmstxt','a:7:{s:23:\"llms_txt_selection_mode\";s:4:\"auto\";s:13:\"about_us_page\";i:0;s:12:\"contact_page\";i:0;s:10:\"terms_page\";i:0;s:19:\"privacy_policy_page\";i:0;s:9:\"shop_page\";i:0;s:20:\"other_included_pages\";a:0:{}}','auto'),(174,'webpc_is_new_installation','1','auto'),(175,'webpc_notice_thanks','1765581302','auto'),(176,'webpc_notice_pro_version','1764976502','auto'),(177,'webpc_stats_installation_date','2025-11-28 23:15:02','auto'),(178,'webpc_stats_first_version','6.3.2','auto'); /*!40000 ALTER TABLE `wp_options` ENABLE KEYS */; UNLOCK TABLES; @@ -606,4 +606,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025-11-28 17:10:23 +-- Dump completed on 2025-11-28 17:16:24 diff --git a/wp-content/.htaccess b/wp-content/.htaccess new file mode 100644 index 00000000..02dcb900 --- /dev/null +++ b/wp-content/.htaccess @@ -0,0 +1,50 @@ + +# BEGIN Converter for Media +# ! --- DO NOT EDIT PREVIOUS LINE --- ! + + RewriteEngine On + RewriteOptions Inherit + + RewriteCond %{QUERY_STRING} original$ + RewriteCond %{REQUEST_FILENAME} -f + RewriteRule . - [L] + + RewriteCond %{HTTP_ACCEPT} image/avif + RewriteCond %{REQUEST_FILENAME} -f + RewriteCond %{DOCUMENT_ROOT}/wp-content/uploads-webpc/$1.jpg.avif -f + RewriteRule (.+)\.jpg$ /wp-content/uploads-webpc/$1.jpg.avif [NC,T=image/avif,L] + RewriteCond %{HTTP_ACCEPT} image/avif + RewriteCond %{REQUEST_FILENAME} -f + RewriteCond %{DOCUMENT_ROOT}/wp-content/uploads-webpc/$1.jpeg.avif -f + RewriteRule (.+)\.jpeg$ /wp-content/uploads-webpc/$1.jpeg.avif [NC,T=image/avif,L] + RewriteCond %{HTTP_ACCEPT} image/avif + RewriteCond %{REQUEST_FILENAME} -f + RewriteCond %{DOCUMENT_ROOT}/wp-content/uploads-webpc/$1.png.avif -f + RewriteRule (.+)\.png$ /wp-content/uploads-webpc/$1.png.avif [NC,T=image/avif,L] + RewriteCond %{HTTP_ACCEPT} image/avif + RewriteCond %{REQUEST_FILENAME} -f + RewriteCond %{DOCUMENT_ROOT}/wp-content/uploads-webpc/$1.webp.avif -f + RewriteRule (.+)\.webp$ /wp-content/uploads-webpc/$1.webp.avif [NC,T=image/avif,L] + + RewriteCond %{HTTP_ACCEPT} image/webp + RewriteCond %{REQUEST_FILENAME} -f + RewriteCond %{DOCUMENT_ROOT}/wp-content/uploads-webpc/$1.jpg.webp -f + RewriteRule (.+)\.jpg$ /wp-content/uploads-webpc/$1.jpg.webp [NC,T=image/webp,L] + RewriteCond %{HTTP_ACCEPT} image/webp + RewriteCond %{REQUEST_FILENAME} -f + RewriteCond %{DOCUMENT_ROOT}/wp-content/uploads-webpc/$1.jpeg.webp -f + RewriteRule (.+)\.jpeg$ /wp-content/uploads-webpc/$1.jpeg.webp [NC,T=image/webp,L] + RewriteCond %{HTTP_ACCEPT} image/webp + RewriteCond %{REQUEST_FILENAME} -f + RewriteCond %{DOCUMENT_ROOT}/wp-content/uploads-webpc/$1.png.webp -f + RewriteRule (.+)\.png$ /wp-content/uploads-webpc/$1.png.webp [NC,T=image/webp,L] + + + + Header always set Cache-Control "private" + Header always set X-LiteSpeed-Cache-Control "no-cache" + Header append Vary "Accept" + + +# ! --- DO NOT EDIT NEXT LINE --- ! +# END Converter for Media diff --git a/wp-content/plugins/webp-converter-for-media/assets/build/css/styles.css b/wp-content/plugins/webp-converter-for-media/assets/build/css/styles.css new file mode 100755 index 00000000..11cf0cb6 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/assets/build/css/styles.css @@ -0,0 +1 @@ +@charset "UTF-8";@keyframes dotsLoading{0%,to{content:"..."}25%{content:" .."}50%{content:". ."}75%{content:".. "}}@font-face{font-family:webpc-icomoon;font-style:normal;font-weight:400;src:url(../../fonts/icons/icomoon.woff?ver=13194411) format("woff")}.webpcPage{color:#101517;margin:0;overflow:hidden}.webpcPage *,.webpcPage :after,.webpcPage :before{box-sizing:border-box;margin:0;padding:0}.webpcPage [hidden]{display:none!important}.webpcPage__headline{background-color:#11f3af;line-height:0;margin-bottom:30px;margin-top:10px;padding:20px 30px;position:relative;width:100%;z-index:1}.webpcPage__headline img{max-width:100%}.webpcPage__headline:before{background-image:url(../../img/logo-bg.png);background-position:0 0;background-repeat:repeat;content:"";height:100%;left:0;opacity:.05;position:absolute;top:0;width:100%;z-index:-1}.webpcPage__alert{background-color:#00a32a;color:#fff;font-size:14px;line-height:1.5714285714;margin-bottom:30px;padding:15px 20px}.webpcPage__columns{display:flex;margin:0 -30px;overflow:hidden}.webpcPage__column{padding:0 30px}.webpcPage__column--large{width:66.666%}.webpcPage__column--small{width:33.333%}.webpcPage__widget{background-color:#fff}.webpcPage__widget+.webpcPage__widget{margin-top:60px}.webpcPage__widget--border{border:1px solid #11f3af;border-top:0}.webpcPage__widgetTitle{border-bottom:1px solid #dcdcde;font-size:16px;font-weight:600;line-height:1.5;padding:13px 30px;position:relative;z-index:1}.webpcMenu+.webpcPage__widget .webpcPage__widgetTitle{display:none}.webpcPage__widgetTitle--error{background-color:#d63638;border-color:transparent;color:#fff;font-weight:400}.webpcPage__widgetTitle--logo{background-color:#11f3af;border-color:transparent}.webpcPage__widgetTitle--logo:before{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\e902"!important;font-family:webpc-icomoon!important;font-size:30px;font-style:normal;font-variant:normal;font-weight:400;line-height:1;position:absolute;right:30px;text-transform:none;top:10px}html[dir=rtl] .webpcPage__widgetTitle--logo:before{left:30px;right:auto}.webpcPage__widgetTitle--logo:after{background-image:url(../../img/logo-bg.png);background-position:0 0;background-repeat:repeat;content:"";height:100%;left:0;opacity:.05;position:absolute;top:0;width:100%;z-index:-1}.webpcPage__widgetRow{padding-bottom:10px}.webpcPage__widgetRow:last-child{padding-bottom:0}.webpcPage__widgetRow>.webpcButton{margin:10px 0}.webpcPage__widgetRow--option+.webpcPage__widgetRow--option{border-top:1px solid #f0f0f1;padding-top:10px}.webpcPage__widgetRow--option+.webpcPage__widgetRow--noBorder{border-top:0;margin-top:-10px;padding-top:0}.webpcPage__widgetColumns{display:flex;flex-wrap:wrap;margin:0 -10px}.webpcPage__widgetColumn{padding:0 10px;width:50%}.webpcPage__widgetColumn:first-child:last-child{flex:1}.webpcPage__widgetNotice{background-color:#2271b1;margin:10px 0;padding:10px 20px}.webpcPage__widgetNotice p{color:#fff;font-size:1.2rem}.webpcPage__widgetNotice p+p{margin-top:0}.webpcPage__widgetNotice p a{color:inherit;font-weight:600;letter-spacing:1px;text-decoration:none;text-transform:uppercase}.webpcPage__footer{margin-top:30px}.webpcPage__footerLogo{text-align:center}.webpcPage__footerLogo:before{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#dcdcde;content:"\e902"!important;font-family:webpc-icomoon!important;font-size:50px;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.webpcPage__footerContent{font-size:14px;line-height:1.5714285714;padding:14px 20px;text-align:center}.webpcPage__footerContent a{text-decoration:none}.webpcPage__footerIcon{padding:0 3px}.webpcPage__footerIcon--heart{color:#d63638}.webpcPage__footerIcon--heart:before{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\e901"!important;font-family:webpc-icomoon!important;font-style:normal;font-variant:normal;font-weight:400;text-transform:none}.webpcPage__footerIcon--stars{color:#f0c33c}.webpcPage__footerIcon--stars:before{content:"\e903"!important}#wp-admin-bar-webpc-menu .ab-icon:before,.webpcPage__footerIcon--stars:before{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:webpc-icomoon!important;font-style:normal;font-variant:normal;font-weight:400;text-transform:none}#wp-admin-bar-webpc-menu .ab-icon:before{content:"\e900"!important}.spinner[id*=webpc-attachment-trigger-]{display:none}.spinner[id*=webpc-attachment-trigger-].is-active{display:block}td.webpc_status select{max-width:100%}.notice[data-notice=webp-converter-for-media]{padding:0 8px 0 0!important;z-index:1}html[dir=rtl] .notice[data-notice=webp-converter-for-media]{padding:0 0 0 8px!important}.notice[data-notice=webp-converter-for-media]~.notice[data-notice=webp-converter-for-media]{display:none!important}.notice[data-notice=webp-converter-for-media] .notice-dismiss{z-index:1}body.settings_page_webpc_admin_page .wrap>.notice{display:none}body.settings_page_webpc_admin_page .wrap>.notice[data-notice=webp-converter-for-media]{display:block}.mattDeactivationModal[data-matt-deactivation-modal=webp-converter-for-media] .mattDeactivationModal__headline{background-image:url(https://mattplugins.com/images/matt-plugins-gray.png);background-position:100% 0;background-repeat:no-repeat;background-size:auto 30px}html[dir=rtl] .mattDeactivationModal[data-matt-deactivation-modal=webp-converter-for-media] .mattDeactivationModal__headline{background-position:0 0}.webpcButton{background-color:#fff;border:1px solid transparent;box-shadow:none!important;box-sizing:border-box;cursor:pointer;display:inline-block;font-size:14px;line-height:1.5714285714;min-width:180px;opacity:1!important;outline:none!important;padding:9px 30px;position:relative;text-align:center;text-decoration:none!important;transition:color .3s!important;z-index:10}p>.webpcButton{margin:6px 0}.webpcButton:after{content:"";height:100%;left:0;position:absolute;top:0;transition:width .3s;width:0;z-index:-1}html[dir=rtl] .webpcButton:after{left:auto;right:0}.webpcButton:hover:after{width:100%}.webpcButton[disabled]{opacity:.5!important;pointer-events:none}.webpcButton--small{font-size:12px;line-height:1.6666666667;min-width:auto;padding:4px 20px}.webpcButton--blue:hover,.webpcButton--gray:hover,.webpcButton--red:hover{color:#fff!important}.webpcButton--blue{border-color:#2271b1;color:#2271b1!important}.webpcButton--blue.webpcButton--bg,.webpcButton--blue:after{background-color:#2271b1}.webpcButton--blue.webpcButton--bg:after{background-color:#135e96}.webpcButton--red{border-color:#d63638;color:#d63638!important}.webpcButton--red.webpcButton--bg,.webpcButton--red:after{background-color:#d63638}.webpcButton--red.webpcButton--bg:after{background-color:#b32d2e}.webpcButton--gray{border-color:#c3c4c7;color:#c3c4c7!important}.webpcButton--gray.webpcButton--bg,.webpcButton--gray:after{background-color:#c3c4c7}.webpcButton--gray.webpcButton--bg:after{background-color:#a7aaad}.webpcButton--bg{color:#fff!important}.webpcContent{padding:20px 30px}.webpcContent p{font-size:14px;line-height:1.5714285714;max-width:800px}.webpcContent p.center{text-align:center}.webpcContent--wide p{max-width:100%}.webpcContent--quotes em{background-color:#f0f0f1;border-left:1px solid #c3c4c7;display:block;margin:6px 0;padding:24px 20px}html[dir=rtl] .webpcContent--quotes em{border-left:0;border-right:1px solid #c3c4c7}.webpcContent--quotes em:first-child strong{font-style:normal}.webpcContent--quotes em+em{margin-top:-36px}.webpcContent a{box-shadow:none;color:#2271b1;outline:none;text-decoration:underline;transition:opacity .3s}.webpcContent a:hover{opacity:.5}.webpcContent h1,.webpcContent h2,.webpcContent h3,.webpcContent h4,.webpcContent h5,.webpcContent h6{font-size:16px;font-weight:600;line-height:1.5}.webpcContent h1,.webpcContent h2,.webpcContent h3,.webpcContent h4,.webpcContent h5,.webpcContent h6,.webpcContent p{margin:10px 0 0;padding:4px 0}.webpcContent h1:first-child,.webpcContent h2:first-child,.webpcContent h3:first-child,.webpcContent h4:first-child,.webpcContent h5:first-child,.webpcContent h6:first-child,.webpcContent p:first-child,.webpcContent p>p{margin-top:0}.webpcContent .dashicons[title]{cursor:help;font-size:16px;width:16px}.webpcInput+p{background-color:#f0f0f1;margin:0 0 10px;max-width:none;padding:14px 20px}.webpcContent h1+p,.webpcContent h2+p,.webpcContent h3+p,.webpcContent h4+p,.webpcContent h5+p,.webpcContent h6+p{font-size:12px;line-height:1.75;margin-top:0}.webpcContent__tip{background-color:#00a32a;color:#fff;display:inline;font-weight:400;margin:-2px 0;padding:2px 5px}.webpcContent--notice{position:relative}.webpcContent--notice h1+p,.webpcContent--notice h2+p,.webpcContent--notice h3+p,.webpcContent--notice h4+p,.webpcContent--notice h5+p,.webpcContent--notice h6+p{font-size:14px;line-height:1.5714285714}.webpcContent--notice img{bottom:30px;display:block;position:absolute;right:30px;z-index:-1}html[dir=rtl] .webpcContent--notice img{left:30px;right:auto}.webpcContent--notice code{font-weight:700;letter-spacing:1px;padding:5px 10px}.webpcContent__buttons{display:flex;margin-top:-10px;overflow:hidden;padding:10px 0}.webpcContent__button{margin:20px 20px 0 0}html[dir=rtl] .webpcContent__button{margin-left:20px;margin-right:0}.webpcContent__button:last-child{margin-right:0}html[dir=rtl] .webpcContent__button:last-child{margin-left:0}.webpcContent__loader:after{animation:dotsLoading 1s linear infinite;content:"...";font-family:monospace;line-height:1;margin-left:5px}html[dir=rtl] .webpcContent__loader:after{margin-left:0;margin-right:5px}.webpcField{display:flex;padding:10px 0}.webpcField--center{align-items:center}.webpcField+.webpcField{margin-top:-12px}.webpcField__input{display:none!important}.webpcField__input+label{display:inline-block;position:relative}.webpcField__input[disabled]+label{pointer-events:none}.webpcField__input[disabled]+label:after,.webpcField__input[disabled]+label:before{opacity:.25}.webpcField__input--checkbox+label,.webpcField__input--radio+label{cursor:pointer;height:22px;width:22px}.webpcField__input--checkbox+label:after,.webpcField__input--checkbox+label:before,.webpcField__input--radio+label:after,.webpcField__input--radio+label:before{align-items:center;content:"";display:flex;height:22px;justify-content:center;left:0;position:absolute;top:0;width:22px}.webpcField__input--checkbox+label:before,.webpcField__input--radio+label:before{border:1px solid #c3c4c7}.webpcField__input--checkbox+label:after,.webpcField__input--radio+label:after{position:absolute;transform:scale(0);transition:transform .3s}.webpcField__input--checkbox:checked+label:after,.webpcField__input--radio:checked+label:after{transform:scale(1)}.webpcField__input--checkbox+label:after{color:#00a32a;content:"\f147";font-family:dashicons;font-size:20px;line-height:1}.webpcField__input--radio+label:before{border-radius:50%}.webpcField__input--radio+label:after{background-color:#00a32a;border-radius:50%;content:"";height:8px;left:7px;top:7px;width:8px}.webpcField__input--toggle+label{cursor:pointer;height:22px;width:44px}.webpcField__input--toggle+label:after,.webpcField__input--toggle+label:before{content:"";position:absolute}.webpcField__input--toggle+label:before{background-color:#dcdcde;border:1px solid #c3c4c7;border-radius:11px;height:22px;left:0;top:0;transition:background-color .3s;width:44px}.webpcField__input--toggle+label:after{background-color:#fff;border-radius:50%;height:16px;left:3px;position:absolute;top:3px;transition:transform .3s;width:16px}.webpcField__input--toggle:checked+label:before{background-color:#00a32a}.webpcField__input--toggle:checked+label:after{transform:translateX(22px)}.webpcField__label{display:block;font-size:14px;line-height:1.5714285714;max-width:650px;position:relative}.webpcField__input~.webpcField__label{margin-left:20px}html[dir=rtl] .webpcField__input~.webpcField__label{margin-left:0;margin-right:20px}.webpcField__labelWarning{border:1px solid #d63638;color:#d63638;display:none;font-size:12px;line-height:1.75;margin-top:4px;padding:4px 10px}.webpcField__input:checked~.webpcField__label .webpcField__labelWarning{display:block}.webpcInput{align-items:center;display:flex;padding:10px 0}.webpcInput__field{border:1px solid #c3c4c7!important;border-radius:0!important;box-shadow:none!important;flex:1;font-size:14px!important;line-height:1.5714285714!important;padding:9px 15px!important}.webpcInput__field::-webkit-input-placeholder{color:inherit;opacity:.5}.webpcInput__field::-moz-placeholder{color:inherit;opacity:.5}.webpcInput__field:-ms-input-placeholder{color:inherit;opacity:.5}.webpcInput__field:-moz-placeholder{color:inherit;opacity:.5}.webpcInput__field--small{margin:0 10px;max-width:80px;padding:4px 10px!important;width:80px}.webpcInput__field[readonly]{background-color:#f0f0f1}.webpcLoader__columns{display:flex;justify-content:center;margin:-30px -30px 0;padding:10px 0;text-align:center}.webpcLoader__column{line-height:0;margin-top:30px;padding:0 30px}.webpcLoader__columnInner{display:inline-block;position:relative}.webpcLoader__columnInner:before{background-color:#f0f0f1;border-radius:50%;content:"";height:calc(100% - 10px);left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:calc(100% - 10px)}.webpcLoader__columnCircle{fill:none;stroke:#00a32a;stroke-width:10px;stroke-dasharray:596.90248;stroke-dashoffset:596.90248;height:200px;transform:rotate(-90deg);transition:stroke-dashoffset 2.5s;width:200px}.webpcLoader__column[data-percent="1"] .webpcLoader__columnCircle{stroke-dashoffset:590.9334552}.webpcLoader__column[data-percent="2"] .webpcLoader__columnCircle{stroke-dashoffset:584.9644304}.webpcLoader__column[data-percent="3"] .webpcLoader__columnCircle{stroke-dashoffset:578.9954056}.webpcLoader__column[data-percent="4"] .webpcLoader__columnCircle{stroke-dashoffset:573.0263808}.webpcLoader__column[data-percent="5"] .webpcLoader__columnCircle{stroke-dashoffset:567.057356}.webpcLoader__column[data-percent="6"] .webpcLoader__columnCircle{stroke-dashoffset:561.0883312}.webpcLoader__column[data-percent="7"] .webpcLoader__columnCircle{stroke-dashoffset:555.1193064}.webpcLoader__column[data-percent="8"] .webpcLoader__columnCircle{stroke-dashoffset:549.1502816}.webpcLoader__column[data-percent="9"] .webpcLoader__columnCircle{stroke-dashoffset:543.1812568}.webpcLoader__column[data-percent="10"] .webpcLoader__columnCircle{stroke-dashoffset:537.212232}.webpcLoader__column[data-percent="11"] .webpcLoader__columnCircle{stroke-dashoffset:531.2432072}.webpcLoader__column[data-percent="12"] .webpcLoader__columnCircle{stroke-dashoffset:525.2741824}.webpcLoader__column[data-percent="13"] .webpcLoader__columnCircle{stroke-dashoffset:519.3051576}.webpcLoader__column[data-percent="14"] .webpcLoader__columnCircle{stroke-dashoffset:513.3361328}.webpcLoader__column[data-percent="15"] .webpcLoader__columnCircle{stroke-dashoffset:507.367108}.webpcLoader__column[data-percent="16"] .webpcLoader__columnCircle{stroke-dashoffset:501.3980832}.webpcLoader__column[data-percent="17"] .webpcLoader__columnCircle{stroke-dashoffset:495.4290584}.webpcLoader__column[data-percent="18"] .webpcLoader__columnCircle{stroke-dashoffset:489.4600336}.webpcLoader__column[data-percent="19"] .webpcLoader__columnCircle{stroke-dashoffset:483.4910088}.webpcLoader__column[data-percent="20"] .webpcLoader__columnCircle{stroke-dashoffset:477.521984}.webpcLoader__column[data-percent="21"] .webpcLoader__columnCircle{stroke-dashoffset:471.5529592}.webpcLoader__column[data-percent="22"] .webpcLoader__columnCircle{stroke-dashoffset:465.5839344}.webpcLoader__column[data-percent="23"] .webpcLoader__columnCircle{stroke-dashoffset:459.6149096}.webpcLoader__column[data-percent="24"] .webpcLoader__columnCircle{stroke-dashoffset:453.6458848}.webpcLoader__column[data-percent="25"] .webpcLoader__columnCircle{stroke-dashoffset:447.67686}.webpcLoader__column[data-percent="26"] .webpcLoader__columnCircle{stroke-dashoffset:441.7078352}.webpcLoader__column[data-percent="27"] .webpcLoader__columnCircle{stroke-dashoffset:435.7388104}.webpcLoader__column[data-percent="28"] .webpcLoader__columnCircle{stroke-dashoffset:429.7697856}.webpcLoader__column[data-percent="29"] .webpcLoader__columnCircle{stroke-dashoffset:423.8007608}.webpcLoader__column[data-percent="30"] .webpcLoader__columnCircle{stroke-dashoffset:417.831736}.webpcLoader__column[data-percent="31"] .webpcLoader__columnCircle{stroke-dashoffset:411.8627112}.webpcLoader__column[data-percent="32"] .webpcLoader__columnCircle{stroke-dashoffset:405.8936864}.webpcLoader__column[data-percent="33"] .webpcLoader__columnCircle{stroke-dashoffset:399.9246616}.webpcLoader__column[data-percent="34"] .webpcLoader__columnCircle{stroke-dashoffset:393.9556368}.webpcLoader__column[data-percent="35"] .webpcLoader__columnCircle{stroke-dashoffset:387.986612}.webpcLoader__column[data-percent="36"] .webpcLoader__columnCircle{stroke-dashoffset:382.0175872}.webpcLoader__column[data-percent="37"] .webpcLoader__columnCircle{stroke-dashoffset:376.0485624}.webpcLoader__column[data-percent="38"] .webpcLoader__columnCircle{stroke-dashoffset:370.0795376}.webpcLoader__column[data-percent="39"] .webpcLoader__columnCircle{stroke-dashoffset:364.1105128}.webpcLoader__column[data-percent="40"] .webpcLoader__columnCircle{stroke-dashoffset:358.141488}.webpcLoader__column[data-percent="41"] .webpcLoader__columnCircle{stroke-dashoffset:352.1724632}.webpcLoader__column[data-percent="42"] .webpcLoader__columnCircle{stroke-dashoffset:346.2034384}.webpcLoader__column[data-percent="43"] .webpcLoader__columnCircle{stroke-dashoffset:340.2344136}.webpcLoader__column[data-percent="44"] .webpcLoader__columnCircle{stroke-dashoffset:334.2653888}.webpcLoader__column[data-percent="45"] .webpcLoader__columnCircle{stroke-dashoffset:328.296364}.webpcLoader__column[data-percent="46"] .webpcLoader__columnCircle{stroke-dashoffset:322.3273392}.webpcLoader__column[data-percent="47"] .webpcLoader__columnCircle{stroke-dashoffset:316.3583144}.webpcLoader__column[data-percent="48"] .webpcLoader__columnCircle{stroke-dashoffset:310.3892896}.webpcLoader__column[data-percent="49"] .webpcLoader__columnCircle{stroke-dashoffset:304.4202648}.webpcLoader__column[data-percent="50"] .webpcLoader__columnCircle{stroke-dashoffset:298.45124}.webpcLoader__column[data-percent="51"] .webpcLoader__columnCircle{stroke-dashoffset:292.4822152}.webpcLoader__column[data-percent="52"] .webpcLoader__columnCircle{stroke-dashoffset:286.5131904}.webpcLoader__column[data-percent="53"] .webpcLoader__columnCircle{stroke-dashoffset:280.5441656}.webpcLoader__column[data-percent="54"] .webpcLoader__columnCircle{stroke-dashoffset:274.5751408}.webpcLoader__column[data-percent="55"] .webpcLoader__columnCircle{stroke-dashoffset:268.606116}.webpcLoader__column[data-percent="56"] .webpcLoader__columnCircle{stroke-dashoffset:262.6370912}.webpcLoader__column[data-percent="57"] .webpcLoader__columnCircle{stroke-dashoffset:256.6680664}.webpcLoader__column[data-percent="58"] .webpcLoader__columnCircle{stroke-dashoffset:250.6990416}.webpcLoader__column[data-percent="59"] .webpcLoader__columnCircle{stroke-dashoffset:244.7300168}.webpcLoader__column[data-percent="60"] .webpcLoader__columnCircle{stroke-dashoffset:238.760992}.webpcLoader__column[data-percent="61"] .webpcLoader__columnCircle{stroke-dashoffset:232.7919672}.webpcLoader__column[data-percent="62"] .webpcLoader__columnCircle{stroke-dashoffset:226.8229424}.webpcLoader__column[data-percent="63"] .webpcLoader__columnCircle{stroke-dashoffset:220.8539176}.webpcLoader__column[data-percent="64"] .webpcLoader__columnCircle{stroke-dashoffset:214.8848928}.webpcLoader__column[data-percent="65"] .webpcLoader__columnCircle{stroke-dashoffset:208.915868}.webpcLoader__column[data-percent="66"] .webpcLoader__columnCircle{stroke-dashoffset:202.9468432}.webpcLoader__column[data-percent="67"] .webpcLoader__columnCircle{stroke-dashoffset:196.9778184}.webpcLoader__column[data-percent="68"] .webpcLoader__columnCircle{stroke-dashoffset:191.0087936}.webpcLoader__column[data-percent="69"] .webpcLoader__columnCircle{stroke-dashoffset:185.0397688}.webpcLoader__column[data-percent="70"] .webpcLoader__columnCircle{stroke-dashoffset:179.070744}.webpcLoader__column[data-percent="71"] .webpcLoader__columnCircle{stroke-dashoffset:173.1017192}.webpcLoader__column[data-percent="72"] .webpcLoader__columnCircle{stroke-dashoffset:167.1326944}.webpcLoader__column[data-percent="73"] .webpcLoader__columnCircle{stroke-dashoffset:161.1636696}.webpcLoader__column[data-percent="74"] .webpcLoader__columnCircle{stroke-dashoffset:155.1946448}.webpcLoader__column[data-percent="75"] .webpcLoader__columnCircle{stroke-dashoffset:149.22562}.webpcLoader__column[data-percent="76"] .webpcLoader__columnCircle{stroke-dashoffset:143.2565952}.webpcLoader__column[data-percent="77"] .webpcLoader__columnCircle{stroke-dashoffset:137.2875704}.webpcLoader__column[data-percent="78"] .webpcLoader__columnCircle{stroke-dashoffset:131.3185456}.webpcLoader__column[data-percent="79"] .webpcLoader__columnCircle{stroke-dashoffset:125.3495208}.webpcLoader__column[data-percent="80"] .webpcLoader__columnCircle{stroke-dashoffset:119.380496}.webpcLoader__column[data-percent="81"] .webpcLoader__columnCircle{stroke-dashoffset:113.4114712}.webpcLoader__column[data-percent="82"] .webpcLoader__columnCircle{stroke-dashoffset:107.4424464}.webpcLoader__column[data-percent="83"] .webpcLoader__columnCircle{stroke-dashoffset:101.4734216}.webpcLoader__column[data-percent="84"] .webpcLoader__columnCircle{stroke-dashoffset:95.5043968}.webpcLoader__column[data-percent="85"] .webpcLoader__columnCircle{stroke-dashoffset:89.535372}.webpcLoader__column[data-percent="86"] .webpcLoader__columnCircle{stroke-dashoffset:83.5663472}.webpcLoader__column[data-percent="87"] .webpcLoader__columnCircle{stroke-dashoffset:77.5973224}.webpcLoader__column[data-percent="88"] .webpcLoader__columnCircle{stroke-dashoffset:71.6282976}.webpcLoader__column[data-percent="89"] .webpcLoader__columnCircle{stroke-dashoffset:65.6592728}.webpcLoader__column[data-percent="90"] .webpcLoader__columnCircle{stroke-dashoffset:59.690248}.webpcLoader__column[data-percent="91"] .webpcLoader__columnCircle{stroke-dashoffset:53.7212232}.webpcLoader__column[data-percent="92"] .webpcLoader__columnCircle{stroke-dashoffset:47.7521984}.webpcLoader__column[data-percent="93"] .webpcLoader__columnCircle{stroke-dashoffset:41.7831736}.webpcLoader__column[data-percent="94"] .webpcLoader__columnCircle{stroke-dashoffset:35.8141488}.webpcLoader__column[data-percent="95"] .webpcLoader__columnCircle{stroke-dashoffset:29.845124}.webpcLoader__column[data-percent="96"] .webpcLoader__columnCircle{stroke-dashoffset:23.8760992}.webpcLoader__column[data-percent="97"] .webpcLoader__columnCircle{stroke-dashoffset:17.9070744}.webpcLoader__column[data-percent="98"] .webpcLoader__columnCircle{stroke-dashoffset:11.9380496}.webpcLoader__column[data-percent="99"] .webpcLoader__columnCircle{stroke-dashoffset:5.9690248}.webpcLoader__column[data-percent="100"] .webpcLoader__columnCircle{stroke-dashoffset:0}.webpcLoader__columnOverlay{left:0;position:absolute;text-align:center;top:50%;transform:translateY(-50%);width:100%}.webpcLoader__columnOverlayTitle{font-size:14px;font-weight:600;line-height:1.5714285714;padding:4px 15px}.webpcLoader__columnOverlayTitle strong{display:block;font-size:24px;line-height:1.2083333333}.webpcLoader__columnOverlayDesc{font-size:14px;line-height:1.5714285714;min-height:52px;padding:4px 20px}.webpcLoader__columnOverlayDesc--active{display:none}.webpcLoader__column[data-percent] .webpcLoader__columnOverlayDesc--active{display:block}.webpcLoader__column[data-percent] .webpcLoader__columnOverlayDesc--loading{display:none}.webpcLoader__columnOverlayDesc--loading:after{animation:dotsLoading 1s linear infinite;content:"...";font-family:monospace;line-height:1}.webpcLoader__statusProgress--error .webpcLoader__columnOverlayDesc--loading:after,.webpcLoader__statusProgress[data-percent="100"] .webpcLoader__columnOverlayDesc--loading:after{display:none}.webpcLoader__columnDesc{font-size:14px;line-height:1.5714285714;margin-bottom:-10px;margin-top:10px;padding:4px 0;text-align:center}.webpcLoader__status{margin-top:10px;padding-top:10px}.webpcLoader__statusProgress{font-size:0;height:31px;line-height:0;margin:10px 0;position:relative}.webpcLoader__statusProgress:before{background-color:#00a32a;content:"";height:100%;left:0;position:absolute;top:0;transition:width .3s;width:0}html[dir=rtl] .webpcLoader__statusProgress:before{left:auto;right:0}.webpcLoader__statusProgress--error:before{background-color:#d63638}.webpcLoader__statusProgress[data-percent="0"]:before{width:0}.webpcLoader__statusProgress[data-percent="1"]:before{width:1%}.webpcLoader__statusProgress[data-percent="2"]:before{width:2%}.webpcLoader__statusProgress[data-percent="3"]:before{width:3%}.webpcLoader__statusProgress[data-percent="4"]:before{width:4%}.webpcLoader__statusProgress[data-percent="5"]:before{width:5%}.webpcLoader__statusProgress[data-percent="6"]:before{width:6%}.webpcLoader__statusProgress[data-percent="7"]:before{width:7%}.webpcLoader__statusProgress[data-percent="8"]:before{width:8%}.webpcLoader__statusProgress[data-percent="9"]:before{width:9%}.webpcLoader__statusProgress[data-percent="10"]:before{width:10%}.webpcLoader__statusProgress[data-percent="11"]:before{width:11%}.webpcLoader__statusProgress[data-percent="12"]:before{width:12%}.webpcLoader__statusProgress[data-percent="13"]:before{width:13%}.webpcLoader__statusProgress[data-percent="14"]:before{width:14%}.webpcLoader__statusProgress[data-percent="15"]:before{width:15%}.webpcLoader__statusProgress[data-percent="16"]:before{width:16%}.webpcLoader__statusProgress[data-percent="17"]:before{width:17%}.webpcLoader__statusProgress[data-percent="18"]:before{width:18%}.webpcLoader__statusProgress[data-percent="19"]:before{width:19%}.webpcLoader__statusProgress[data-percent="20"]:before{width:20%}.webpcLoader__statusProgress[data-percent="21"]:before{width:21%}.webpcLoader__statusProgress[data-percent="22"]:before{width:22%}.webpcLoader__statusProgress[data-percent="23"]:before{width:23%}.webpcLoader__statusProgress[data-percent="24"]:before{width:24%}.webpcLoader__statusProgress[data-percent="25"]:before{width:25%}.webpcLoader__statusProgress[data-percent="26"]:before{width:26%}.webpcLoader__statusProgress[data-percent="27"]:before{width:27%}.webpcLoader__statusProgress[data-percent="28"]:before{width:28%}.webpcLoader__statusProgress[data-percent="29"]:before{width:29%}.webpcLoader__statusProgress[data-percent="30"]:before{width:30%}.webpcLoader__statusProgress[data-percent="31"]:before{width:31%}.webpcLoader__statusProgress[data-percent="32"]:before{width:32%}.webpcLoader__statusProgress[data-percent="33"]:before{width:33%}.webpcLoader__statusProgress[data-percent="34"]:before{width:34%}.webpcLoader__statusProgress[data-percent="35"]:before{width:35%}.webpcLoader__statusProgress[data-percent="36"]:before{width:36%}.webpcLoader__statusProgress[data-percent="37"]:before{width:37%}.webpcLoader__statusProgress[data-percent="38"]:before{width:38%}.webpcLoader__statusProgress[data-percent="39"]:before{width:39%}.webpcLoader__statusProgress[data-percent="40"]:before{width:40%}.webpcLoader__statusProgress[data-percent="41"]:before{width:41%}.webpcLoader__statusProgress[data-percent="42"]:before{width:42%}.webpcLoader__statusProgress[data-percent="43"]:before{width:43%}.webpcLoader__statusProgress[data-percent="44"]:before{width:44%}.webpcLoader__statusProgress[data-percent="45"]:before{width:45%}.webpcLoader__statusProgress[data-percent="46"]:before{width:46%}.webpcLoader__statusProgress[data-percent="47"]:before{width:47%}.webpcLoader__statusProgress[data-percent="48"]:before{width:48%}.webpcLoader__statusProgress[data-percent="49"]:before{width:49%}.webpcLoader__statusProgress[data-percent="50"]:before{width:50%}.webpcLoader__statusProgress[data-percent="51"]:before{width:51%}.webpcLoader__statusProgress[data-percent="52"]:before{width:52%}.webpcLoader__statusProgress[data-percent="53"]:before{width:53%}.webpcLoader__statusProgress[data-percent="54"]:before{width:54%}.webpcLoader__statusProgress[data-percent="55"]:before{width:55%}.webpcLoader__statusProgress[data-percent="56"]:before{width:56%}.webpcLoader__statusProgress[data-percent="57"]:before{width:57%}.webpcLoader__statusProgress[data-percent="58"]:before{width:58%}.webpcLoader__statusProgress[data-percent="59"]:before{width:59%}.webpcLoader__statusProgress[data-percent="60"]:before{width:60%}.webpcLoader__statusProgress[data-percent="61"]:before{width:61%}.webpcLoader__statusProgress[data-percent="62"]:before{width:62%}.webpcLoader__statusProgress[data-percent="63"]:before{width:63%}.webpcLoader__statusProgress[data-percent="64"]:before{width:64%}.webpcLoader__statusProgress[data-percent="65"]:before{width:65%}.webpcLoader__statusProgress[data-percent="66"]:before{width:66%}.webpcLoader__statusProgress[data-percent="67"]:before{width:67%}.webpcLoader__statusProgress[data-percent="68"]:before{width:68%}.webpcLoader__statusProgress[data-percent="69"]:before{width:69%}.webpcLoader__statusProgress[data-percent="70"]:before{width:70%}.webpcLoader__statusProgress[data-percent="71"]:before{width:71%}.webpcLoader__statusProgress[data-percent="72"]:before{width:72%}.webpcLoader__statusProgress[data-percent="73"]:before{width:73%}.webpcLoader__statusProgress[data-percent="74"]:before{width:74%}.webpcLoader__statusProgress[data-percent="75"]:before{width:75%}.webpcLoader__statusProgress[data-percent="76"]:before{width:76%}.webpcLoader__statusProgress[data-percent="77"]:before{width:77%}.webpcLoader__statusProgress[data-percent="78"]:before{width:78%}.webpcLoader__statusProgress[data-percent="79"]:before{width:79%}.webpcLoader__statusProgress[data-percent="80"]:before{width:80%}.webpcLoader__statusProgress[data-percent="81"]:before{width:81%}.webpcLoader__statusProgress[data-percent="82"]:before{width:82%}.webpcLoader__statusProgress[data-percent="83"]:before{width:83%}.webpcLoader__statusProgress[data-percent="84"]:before{width:84%}.webpcLoader__statusProgress[data-percent="85"]:before{width:85%}.webpcLoader__statusProgress[data-percent="86"]:before{width:86%}.webpcLoader__statusProgress[data-percent="87"]:before{width:87%}.webpcLoader__statusProgress[data-percent="88"]:before{width:88%}.webpcLoader__statusProgress[data-percent="89"]:before{width:89%}.webpcLoader__statusProgress[data-percent="90"]:before{width:90%}.webpcLoader__statusProgress[data-percent="91"]:before{width:91%}.webpcLoader__statusProgress[data-percent="92"]:before{width:92%}.webpcLoader__statusProgress[data-percent="93"]:before{width:93%}.webpcLoader__statusProgress[data-percent="94"]:before{width:94%}.webpcLoader__statusProgress[data-percent="95"]:before{width:95%}.webpcLoader__statusProgress[data-percent="96"]:before{width:96%}.webpcLoader__statusProgress[data-percent="97"]:before{width:97%}.webpcLoader__statusProgress[data-percent="98"]:before{width:98%}.webpcLoader__statusProgress[data-percent="99"]:before{width:99%}.webpcLoader__statusProgress[data-percent="100"]:before{width:100%}.webpcLoader__statusProgressCount{background-color:#00a32a;color:#fff;display:inline-block;font-family:monospace;font-size:12px;line-height:1.75;padding:5px 10px;position:relative}.webpcLoader__statusProgress--error .webpcLoader__statusProgressCount{background-color:#d63638}.webpcLoader__statusProgressCount:after{animation:dotsLoading 1s linear infinite;content:"...";margin-left:5px}html[dir=rtl] .webpcLoader__statusProgressCount:after{margin-left:0;margin-right:5px}.webpcLoader__statusProgress--error .webpcLoader__statusProgressCount:after,.webpcLoader__statusProgress[data-percent="100"] .webpcLoader__statusProgressCount:after{display:none}.webpcLoader__statusProgress[data-percent="0"] .webpcLoader__statusProgressCount:before{content:"0%"}.webpcLoader__statusProgress[data-percent="1"] .webpcLoader__statusProgressCount:before{content:"1%"}.webpcLoader__statusProgress[data-percent="2"] .webpcLoader__statusProgressCount:before{content:"2%"}.webpcLoader__statusProgress[data-percent="3"] .webpcLoader__statusProgressCount:before{content:"3%"}.webpcLoader__statusProgress[data-percent="4"] .webpcLoader__statusProgressCount:before{content:"4%"}.webpcLoader__statusProgress[data-percent="5"] .webpcLoader__statusProgressCount:before{content:"5%"}.webpcLoader__statusProgress[data-percent="6"] .webpcLoader__statusProgressCount:before{content:"6%"}.webpcLoader__statusProgress[data-percent="7"] .webpcLoader__statusProgressCount:before{content:"7%"}.webpcLoader__statusProgress[data-percent="8"] .webpcLoader__statusProgressCount:before{content:"8%"}.webpcLoader__statusProgress[data-percent="9"] .webpcLoader__statusProgressCount:before{content:"9%"}.webpcLoader__statusProgress[data-percent="10"] .webpcLoader__statusProgressCount:before{content:"10%"}.webpcLoader__statusProgress[data-percent="11"] .webpcLoader__statusProgressCount:before{content:"11%"}.webpcLoader__statusProgress[data-percent="12"] .webpcLoader__statusProgressCount:before{content:"12%"}.webpcLoader__statusProgress[data-percent="13"] .webpcLoader__statusProgressCount:before{content:"13%"}.webpcLoader__statusProgress[data-percent="14"] .webpcLoader__statusProgressCount:before{content:"14%"}.webpcLoader__statusProgress[data-percent="15"] .webpcLoader__statusProgressCount:before{content:"15%"}.webpcLoader__statusProgress[data-percent="16"] .webpcLoader__statusProgressCount:before{content:"16%"}.webpcLoader__statusProgress[data-percent="17"] .webpcLoader__statusProgressCount:before{content:"17%"}.webpcLoader__statusProgress[data-percent="18"] .webpcLoader__statusProgressCount:before{content:"18%"}.webpcLoader__statusProgress[data-percent="19"] .webpcLoader__statusProgressCount:before{content:"19%"}.webpcLoader__statusProgress[data-percent="20"] .webpcLoader__statusProgressCount:before{content:"20%"}.webpcLoader__statusProgress[data-percent="21"] .webpcLoader__statusProgressCount:before{content:"21%"}.webpcLoader__statusProgress[data-percent="22"] .webpcLoader__statusProgressCount:before{content:"22%"}.webpcLoader__statusProgress[data-percent="23"] .webpcLoader__statusProgressCount:before{content:"23%"}.webpcLoader__statusProgress[data-percent="24"] .webpcLoader__statusProgressCount:before{content:"24%"}.webpcLoader__statusProgress[data-percent="25"] .webpcLoader__statusProgressCount:before{content:"25%"}.webpcLoader__statusProgress[data-percent="26"] .webpcLoader__statusProgressCount:before{content:"26%"}.webpcLoader__statusProgress[data-percent="27"] .webpcLoader__statusProgressCount:before{content:"27%"}.webpcLoader__statusProgress[data-percent="28"] .webpcLoader__statusProgressCount:before{content:"28%"}.webpcLoader__statusProgress[data-percent="29"] .webpcLoader__statusProgressCount:before{content:"29%"}.webpcLoader__statusProgress[data-percent="30"] .webpcLoader__statusProgressCount:before{content:"30%"}.webpcLoader__statusProgress[data-percent="31"] .webpcLoader__statusProgressCount:before{content:"31%"}.webpcLoader__statusProgress[data-percent="32"] .webpcLoader__statusProgressCount:before{content:"32%"}.webpcLoader__statusProgress[data-percent="33"] .webpcLoader__statusProgressCount:before{content:"33%"}.webpcLoader__statusProgress[data-percent="34"] .webpcLoader__statusProgressCount:before{content:"34%"}.webpcLoader__statusProgress[data-percent="35"] .webpcLoader__statusProgressCount:before{content:"35%"}.webpcLoader__statusProgress[data-percent="36"] .webpcLoader__statusProgressCount:before{content:"36%"}.webpcLoader__statusProgress[data-percent="37"] .webpcLoader__statusProgressCount:before{content:"37%"}.webpcLoader__statusProgress[data-percent="38"] .webpcLoader__statusProgressCount:before{content:"38%"}.webpcLoader__statusProgress[data-percent="39"] .webpcLoader__statusProgressCount:before{content:"39%"}.webpcLoader__statusProgress[data-percent="40"] .webpcLoader__statusProgressCount:before{content:"40%"}.webpcLoader__statusProgress[data-percent="41"] .webpcLoader__statusProgressCount:before{content:"41%"}.webpcLoader__statusProgress[data-percent="42"] .webpcLoader__statusProgressCount:before{content:"42%"}.webpcLoader__statusProgress[data-percent="43"] .webpcLoader__statusProgressCount:before{content:"43%"}.webpcLoader__statusProgress[data-percent="44"] .webpcLoader__statusProgressCount:before{content:"44%"}.webpcLoader__statusProgress[data-percent="45"] .webpcLoader__statusProgressCount:before{content:"45%"}.webpcLoader__statusProgress[data-percent="46"] .webpcLoader__statusProgressCount:before{content:"46%"}.webpcLoader__statusProgress[data-percent="47"] .webpcLoader__statusProgressCount:before{content:"47%"}.webpcLoader__statusProgress[data-percent="48"] .webpcLoader__statusProgressCount:before{content:"48%"}.webpcLoader__statusProgress[data-percent="49"] .webpcLoader__statusProgressCount:before{content:"49%"}.webpcLoader__statusProgress[data-percent="50"] .webpcLoader__statusProgressCount:before{content:"50%"}.webpcLoader__statusProgress[data-percent="51"] .webpcLoader__statusProgressCount:before{content:"51%"}.webpcLoader__statusProgress[data-percent="52"] .webpcLoader__statusProgressCount:before{content:"52%"}.webpcLoader__statusProgress[data-percent="53"] .webpcLoader__statusProgressCount:before{content:"53%"}.webpcLoader__statusProgress[data-percent="54"] .webpcLoader__statusProgressCount:before{content:"54%"}.webpcLoader__statusProgress[data-percent="55"] .webpcLoader__statusProgressCount:before{content:"55%"}.webpcLoader__statusProgress[data-percent="56"] .webpcLoader__statusProgressCount:before{content:"56%"}.webpcLoader__statusProgress[data-percent="57"] .webpcLoader__statusProgressCount:before{content:"57%"}.webpcLoader__statusProgress[data-percent="58"] .webpcLoader__statusProgressCount:before{content:"58%"}.webpcLoader__statusProgress[data-percent="59"] .webpcLoader__statusProgressCount:before{content:"59%"}.webpcLoader__statusProgress[data-percent="60"] .webpcLoader__statusProgressCount:before{content:"60%"}.webpcLoader__statusProgress[data-percent="61"] .webpcLoader__statusProgressCount:before{content:"61%"}.webpcLoader__statusProgress[data-percent="62"] .webpcLoader__statusProgressCount:before{content:"62%"}.webpcLoader__statusProgress[data-percent="63"] .webpcLoader__statusProgressCount:before{content:"63%"}.webpcLoader__statusProgress[data-percent="64"] .webpcLoader__statusProgressCount:before{content:"64%"}.webpcLoader__statusProgress[data-percent="65"] .webpcLoader__statusProgressCount:before{content:"65%"}.webpcLoader__statusProgress[data-percent="66"] .webpcLoader__statusProgressCount:before{content:"66%"}.webpcLoader__statusProgress[data-percent="67"] .webpcLoader__statusProgressCount:before{content:"67%"}.webpcLoader__statusProgress[data-percent="68"] .webpcLoader__statusProgressCount:before{content:"68%"}.webpcLoader__statusProgress[data-percent="69"] .webpcLoader__statusProgressCount:before{content:"69%"}.webpcLoader__statusProgress[data-percent="70"] .webpcLoader__statusProgressCount:before{content:"70%"}.webpcLoader__statusProgress[data-percent="71"] .webpcLoader__statusProgressCount:before{content:"71%"}.webpcLoader__statusProgress[data-percent="72"] .webpcLoader__statusProgressCount:before{content:"72%"}.webpcLoader__statusProgress[data-percent="73"] .webpcLoader__statusProgressCount:before{content:"73%"}.webpcLoader__statusProgress[data-percent="74"] .webpcLoader__statusProgressCount:before{content:"74%"}.webpcLoader__statusProgress[data-percent="75"] .webpcLoader__statusProgressCount:before{content:"75%"}.webpcLoader__statusProgress[data-percent="76"] .webpcLoader__statusProgressCount:before{content:"76%"}.webpcLoader__statusProgress[data-percent="77"] .webpcLoader__statusProgressCount:before{content:"77%"}.webpcLoader__statusProgress[data-percent="78"] .webpcLoader__statusProgressCount:before{content:"78%"}.webpcLoader__statusProgress[data-percent="79"] .webpcLoader__statusProgressCount:before{content:"79%"}.webpcLoader__statusProgress[data-percent="80"] .webpcLoader__statusProgressCount:before{content:"80%"}.webpcLoader__statusProgress[data-percent="81"] .webpcLoader__statusProgressCount:before{content:"81%"}.webpcLoader__statusProgress[data-percent="82"] .webpcLoader__statusProgressCount:before{content:"82%"}.webpcLoader__statusProgress[data-percent="83"] .webpcLoader__statusProgressCount:before{content:"83%"}.webpcLoader__statusProgress[data-percent="84"] .webpcLoader__statusProgressCount:before{content:"84%"}.webpcLoader__statusProgress[data-percent="85"] .webpcLoader__statusProgressCount:before{content:"85%"}.webpcLoader__statusProgress[data-percent="86"] .webpcLoader__statusProgressCount:before{content:"86%"}.webpcLoader__statusProgress[data-percent="87"] .webpcLoader__statusProgressCount:before{content:"87%"}.webpcLoader__statusProgress[data-percent="88"] .webpcLoader__statusProgressCount:before{content:"88%"}.webpcLoader__statusProgress[data-percent="89"] .webpcLoader__statusProgressCount:before{content:"89%"}.webpcLoader__statusProgress[data-percent="90"] .webpcLoader__statusProgressCount:before{content:"90%"}.webpcLoader__statusProgress[data-percent="91"] .webpcLoader__statusProgressCount:before{content:"91%"}.webpcLoader__statusProgress[data-percent="92"] .webpcLoader__statusProgressCount:before{content:"92%"}.webpcLoader__statusProgress[data-percent="93"] .webpcLoader__statusProgressCount:before{content:"93%"}.webpcLoader__statusProgress[data-percent="94"] .webpcLoader__statusProgressCount:before{content:"94%"}.webpcLoader__statusProgress[data-percent="95"] .webpcLoader__statusProgressCount:before{content:"95%"}.webpcLoader__statusProgress[data-percent="96"] .webpcLoader__statusProgressCount:before{content:"96%"}.webpcLoader__statusProgress[data-percent="97"] .webpcLoader__statusProgressCount:before{content:"97%"}.webpcLoader__statusProgress[data-percent="98"] .webpcLoader__statusProgressCount:before{content:"98%"}.webpcLoader__statusProgress[data-percent="99"] .webpcLoader__statusProgressCount:before{content:"99%"}.webpcLoader__statusProgress[data-percent="100"] .webpcLoader__statusProgressCount:before{content:"100%"}.webpcLoader__statusContent{font-size:14px;line-height:1.5714285714;max-width:800px;padding:4px 0}.webpcLoader__statusContent--small{font-size:12px;line-height:1.75}.webpcLoader__statusContent strong{font-weight:600}.webpcLoader__success{padding:10px 0}.webpcLoader__successInner{border-left:2px solid #00a32a;padding:0 20px}html[dir=rtl] .webpcLoader__successInner{border-left:0;border-right:2px solid #00a32a}.webpcLoader__successContent{color:#00a32a;font-size:14px;font-weight:600;line-height:1.5714285714;padding:4px 0}.webpcLoader__successContent a{color:inherit}.webpcLoader__errors{margin-top:10px;padding:10px 0}.webpcLoader__errorsInner{border-left:2px solid #c3c4c7}html[dir=rtl] .webpcLoader__errorsInner{border-left:0;border-right:2px solid #c3c4c7}.webpcLoader__errorsTitle{background-color:#c3c4c7;color:#fff;display:inline-block;font-size:14px;line-height:1.5714285714;padding:4px 20px}.webpcLoader__errorsContent{padding:10px 0 10px 20px}html[dir=rtl] .webpcLoader__errorsContent{padding-left:0;padding-right:20px}.webpcLoader__errorsContent>p{font-size:12px;line-height:1.75;margin:0;max-width:100%}.webpcLoader__errorsContent>p.webpcLoader__errorsContentError{color:#d63638;font-size:14px;font-weight:600;line-height:1.5714285714}.webpcLoader__errorsContent pre{font-size:12px;line-height:1.75;white-space:normal}.webpcLoader__button--disabled{opacity:.25!important;pointer-events:none}.webpcMediaStat{display:inline-block;margin:.4em 0 .8em;max-width:100%}.webpcMediaStat__button,.webpcMediaStat__buttonLabel{display:none!important}.webpcMediaStat__buttonLabel--unchecked{display:inline-block!important}.webpcMediaStat__button:checked~.webpcMediaStat__buttonLabel{display:none!important}.webpcMediaStat__button:checked~.webpcMediaStat__buttonLabel--checked{display:inline-block!important}.webpcMediaStat__wrapper{display:none;margin-top:1.2em}.webpcMediaStat__button:checked~.webpcMediaStat__wrapper{display:block}.webpcMediaStat__notice{background-color:#2271b1;color:#fff;margin-bottom:1em;padding:10px 20px}.webpcMediaStat__notice a{border-bottom:1px solid #fff;color:inherit;font-weight:600;letter-spacing:1px;text-decoration:none;text-transform:uppercase;transition:opacity .3s}.webpcMediaStat__notice a:hover{opacity:.5}.webpcMediaStat__item{display:block;font-size:.9em}.webpcMediaStat__item *{direction:ltr}.webpcMediaStat__item+.webpcMediaStat__item{margin-top:1em}.webpcMediaStat__itemLink{direction:rtl;display:inline-block;margin-bottom:-.5em;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap;width:100%}.webpcMediaStat__itemProgress{border:1px solid #11f3af;display:block;height:3px;text-align:center;width:100%;z-index:1}.webpcMediaStat__itemProgressInner{background-color:#11f3af;display:block;height:100%;max-width:100%;width:100%}.webpcMenu{margin-top:30px}.webpcMenu:first-child{margin-top:0}.webpcMenu__wrapper{border-bottom:1px solid #dcdcde}.webpcMenu__items{display:flex;font-size:0}.webpcMenu__itemLink{box-shadow:none!important;display:block;font-size:16px;line-height:1.5;outline:none!important;padding:13px 30px;text-align:center;text-decoration:none!important;transition:color .3s}.webpcMenu__itemLink:focus,.webpcMenu__itemLink:hover{color:rgba(34,113,177,.5)}.webpcMenu__itemLink--active{background-color:#fff;color:#101517;font-weight:600}.webpcMenu__itemLink--active:focus,.webpcMenu__itemLink--active:hover{color:inherit}.webpcPopup[hidden]{display:none}.webpcPopup__wrapper{align-items:center;background-color:rgba(0,0,0,.75);display:flex;height:100%;justify-content:center;left:0;position:fixed;top:0;width:100%;z-index:99999}.webpcPopup__inner{background-color:#fff;box-sizing:border-box;display:flex;font-size:0;max-height:calc(100vh - 40px);max-width:calc(100vw - 40px);overflow-y:auto;padding:30px 40px;position:relative;width:750px}.webpcPopup__close{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:none;cursor:pointer;font-size:20px;height:40px;position:absolute;right:0;top:0;transition:opacity .3s;width:40px}html[dir=rtl] .webpcPopup__close{left:0;right:auto}.webpcPopup__close:hover{opacity:.5}.webpcPopup__sidebar{line-height:0;max-width:100%;padding:10px 0;width:200px}.webpcPopup__sidebarInner{position:relative}.webpcPopup__sidebarImage{height:auto;max-width:100%}.webpcPopup__sidebarCover{background-repeat:no-repeat;background-size:100% 100%;height:100%;left:0;position:absolute;top:0;width:100%}.webpcPopup__content{flex:1;margin-left:30px}.webpcPopup__contentText p{color:#101517;font-size:14px;line-height:1.5714285714;padding:4px 0}.webpcPopup__contentButtons{display:flex;flex-wrap:wrap;justify-content:space-between;margin-top:10px;padding-bottom:10px}.webpcPopup__input+.webpcPopup__contentButtons{margin-top:0}.webpcPopup__contentButton{margin-top:10px}.webpcQuality__items{display:flex;flex-wrap:wrap;justify-content:space-between}.webpcQuality__item{display:flex;flex:1;justify-content:center;position:relative}.webpcQuality__item:before{background-color:#c3c4c7;content:"";height:1px;left:0;position:absolute;top:50%;width:100%}html[dir=rtl] .webpcQuality__item:before{left:auto;right:0}.webpcQuality__item:first-child:before{left:50%}html[dir=rtl] .webpcQuality__item:first-child:before{left:auto;right:50%}.webpcQuality__item:last-child:before{width:50%}.webpcQuality__itemInput{display:none!important}.webpcQuality__itemLabel{display:block;height:42px;position:relative;width:42px}.webpcQuality__itemLabel:after,.webpcQuality__itemLabel:before{border-radius:50%;content:"";height:22px;position:absolute;width:22px}.webpcQuality__itemLabel:before{background-color:#fff;border:1px solid #c3c4c7;cursor:pointer;left:10px;top:10px}.webpcQuality__itemLabel:after{background-color:#00a32a;height:8px;left:17px;top:17px;transform:scale(0);transition:transform .3s;width:8px}.webpcQuality__itemInput:checked+.webpcQuality__itemLabel:after{transform:scale(1)}.webpcQuality__texts{display:flex;flex-wrap:wrap}.webpcQuality__text{flex:1;font-size:12px;line-height:1.75;padding:4px 0;text-align:center}.webpcQuality__text strong{font-size:14px;line-height:1.5714285714}.webpcServerInfo{color:#222;text-align:center}.webpcServerInfo pre{font-family:monospace;margin:0}.webpcServerInfo h1,.webpcServerInfo h2{display:none}.webpcServerInfo p{max-width:100%}.webpcServerInfo table{border:0;border-collapse:collapse;margin:10px auto;width:100%}.webpcServerInfo td,.webpcServerInfo th{border:1px solid #666;font-family:monospace;font-size:12px;line-height:1.75;padding:4px 5px;text-align:center;vertical-align:baseline}.webpcServerInfo .p{text-align:left}.webpcServerInfo .e{background-color:#ccf;font-weight:700;width:300px}.webpcServerInfo .h{background-color:#99c;font-weight:700}.webpcServerInfo .v{word-wrap:break-word;background-color:#ddd;max-width:300px;overflow-x:auto}.webpcServerInfo .v i{color:#999}.webpcServerInfo img{border:0;float:right}.webpcTree{background-color:#f6f7f7;max-height:75vh;overflow-y:auto;padding:10px 20px}.webpcTree__headline{display:flex;font-weight:600;justify-content:space-between;margin-left:-10px!important;margin-right:-10px!important;max-width:none!important}.webpcTree__headlineButton,.webpcTree__headlineTitle{padding:0 10px}.webpcTree__output{white-space:nowrap}.webpcTree__items{font-size:0;margin-left:20px;padding:4px 0}html[dir=rtl] .webpcTree__items{margin-left:0;margin-right:20px}.webpcTree__items .webpcTree__items{display:none;padding:0}.webpcTree__itemCheckbox{display:none!important}.webpcTree__itemLabel{color:#101517;display:inline-block;font-size:14px;line-height:1.5714285714;padding-left:20px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}html[dir=rtl] .webpcTree__itemLabel{padding-left:0;padding-right:20px}.webpcTree__itemLabel:before{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#f0c33c;content:"\e906"!important;font-family:webpc-icomoon!important;font-size:14px;font-style:normal;font-variant:normal;font-weight:400;left:0;line-height:1;position:absolute;text-transform:none;top:4px}html[dir=rtl] .webpcTree__itemLabel:before{left:auto;right:0}.webpcTree__itemLabel:after{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#101517;content:"\e905"!important;font-family:webpc-icomoon!important;font-size:10px;font-style:normal;font-variant:normal;font-weight:400;left:-25px;line-height:1;padding:5px;position:absolute;text-transform:none;top:1px}html[dir=rtl] .webpcTree__itemLabel:after{left:auto;right:-25px}.webpcTree__itemLabel strong{color:#101517;font-weight:600}.webpcTree__itemLabel:hover{color:#787c82}.webpcTree__itemCheckbox:checked+.webpcTree__itemLabel:after{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\e904"!important;font-family:webpc-icomoon!important;font-style:normal;font-variant:normal;font-weight:400;text-transform:none}.webpcTree__itemCheckbox:checked~.webpcTree__items{display:block}.webpcTree__itemName{display:block;font-size:12px;line-height:1.6666666667;padding-left:20px;position:relative}html[dir=rtl] .webpcTree__itemName{padding-left:0;padding-right:20px}.webpcTree__itemName:before{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#4f94d4;content:"\e907"!important;font-family:webpc-icomoon!important;font-size:14px;font-style:normal;font-variant:normal;font-weight:400;left:0;line-height:1;position:absolute;text-transform:none;top:3px}html[dir=rtl] .webpcTree__itemName:before{left:auto;right:0}.webpcTree__itemName--text:before{display:none}.webpcTree__error{text-wrap:initial;color:#d63638;font-size:14px;font-weight:600;line-height:1.5714285714;padding:4px 0}@media screen and (max-width:1600px){.webpcPage__columns{margin:0 -15px}.webpcPage__column{padding:0 15px}.webpcPage__widget+.webpcPage__widget{margin-top:30px}}@media screen and (max-width:1279px){.webpcPage__columns{display:block}.webpcPage__column--large{width:100%}.webpcPage__column--small{margin-top:30px;width:100%}}@media screen and (max-width:1024px){.webpcPage__widgetColumns{display:block}.webpcPage__widgetColumn{width:100%}}@media screen and (max-width:782px){.webpcPage{padding-right:0}.webpcContent--notice img{bottom:auto;margin:20px 0 10px;position:relative;right:auto}html[dir=rtl] .webpcContent--notice img{left:auto}.webpcInput{display:block}.webpcInput__field{width:100%}.webpcInput__field--small{width:calc(100% - 20px)}.webpcLoader__columns,.webpcMenu__items,.webpcPopup__inner{display:block}.webpcPopup__content{margin-left:0}}@media screen and (max-height:540px){.webpcTree{max-height:400px}} diff --git a/wp-content/plugins/webp-converter-for-media/assets/build/js/scripts.js b/wp-content/plugins/webp-converter-for-media/assets/build/js/scripts.js new file mode 100755 index 00000000..a6754842 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/assets/build/js/scripts.js @@ -0,0 +1,2 @@ +/*! For license information please see scripts.js.LICENSE.txt */ +!function(){var t,e={251:function(t,e){e.read=function(t,e,r,n,s){var i,o,a=8*s-n-1,u=(1<>1,l=-7,h=r?s-1:0,f=r?-1:1,p=t[e+h];for(h+=f,i=p&(1<<-l)-1,p>>=-l,l+=a;l>0;i=256*i+t[e+h],h+=f,l-=8);for(o=i&(1<<-l)-1,i>>=-l,l+=n;l>0;o=256*o+t[e+h],h+=f,l-=8);if(0===i)i=1-c;else{if(i===u)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,n),i-=c}return(p?-1:1)*o*Math.pow(2,i-n)},e.write=function(t,e,r,n,s,i){var o,a,u,c=8*i-s-1,l=(1<>1,f=23===s?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:i-1,d=n?1:-1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,o=l):(o=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-o))<1&&(o--,u*=2),(e+=o+h>=1?f/u:f*Math.pow(2,1-h))*u>=2&&(o++,u/=2),o+h>=l?(a=0,o=l):o+h>=1?(a=(e*u-1)*Math.pow(2,s),o+=h):(a=e*Math.pow(2,h-1)*Math.pow(2,s),o=0));s>=8;t[r+p]=255&a,p+=d,a/=256,s-=8);for(o=o<0;t[r+p]=255&o,p+=d,o/=256,c-=8);t[r+p-d]|=128*g}},287:function(t,e,r){"use strict";var n=r(526),s=r(251),i=r(634);function o(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(t,e){if(o()=o())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o().toString(16)+" bytes");return 0|t}function d(t,e){if(u.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var r=t.length;if(0===r)return 0;for(var n=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return M(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return z(t).length;default:if(n)return M(t).length;e=(""+e).toLowerCase(),n=!0}}function g(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return B(this,e,r);case"utf8":case"utf-8":return R(this,e,r);case"ascii":return x(this,e,r);case"latin1":case"binary":return P(this,e,r);case"base64":return T(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return U(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function _(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function b(t,e,r,n,s){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=s?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(s)return-1;r=t.length-1}else if(r<0){if(!s)return-1;r=0}if("string"==typeof e&&(e=u.from(e,n)),u.isBuffer(e))return 0===e.length?-1:m(t,e,r,n,s);if("number"==typeof e)return e&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?s?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):m(t,[e],r,n,s);throw new TypeError("val must be string, number or Buffer")}function m(t,e,r,n,s){var i,o=1,a=t.length,u=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;o=2,a/=2,u/=2,r/=2}function c(t,e){return 1===o?t[e]:t.readUInt16BE(e*o)}if(s){var l=-1;for(i=r;ia&&(r=a-u),i=r;i>=0;i--){for(var h=!0,f=0;fs&&(n=s):n=s;var i=e.length;if(i%2!=0)throw new TypeError("Invalid hex string");n>i/2&&(n=i/2);for(var o=0;o>8,s=r%256,i.push(s),i.push(n);return i}(e,t.length-r),t,r,n)}function T(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function R(t,e,r){r=Math.min(t.length,r);for(var n=[],s=e;s239?4:c>223?3:c>191?2:1;if(s+h<=r)switch(h){case 1:c<128&&(l=c);break;case 2:128==(192&(i=t[s+1]))&&(u=(31&c)<<6|63&i)>127&&(l=u);break;case 3:i=t[s+1],o=t[s+2],128==(192&i)&&128==(192&o)&&(u=(15&c)<<12|(63&i)<<6|63&o)>2047&&(u<55296||u>57343)&&(l=u);break;case 4:i=t[s+1],o=t[s+2],a=t[s+3],128==(192&i)&&128==(192&o)&&128==(192&a)&&(u=(15&c)<<18|(63&i)<<12|(63&o)<<6|63&a)>65535&&u<1114112&&(l=u)}null===l?(l=65533,h=1):l>65535&&(l-=65536,n.push(l>>>10&1023|55296),l=56320|1023&l),n.push(l),s+=h}return function(t){var e=t.length;if(e<=O)return String.fromCharCode.apply(String,t);var r="",n=0;for(;n0&&(t=this.toString("hex",0,r).match(/.{2}/g).join(" "),this.length>r&&(t+=" ... ")),""},u.prototype.compare=function(t,e,r,n,s){if(!u.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===s&&(s=this.length),e<0||r>t.length||n<0||s>this.length)throw new RangeError("out of range index");if(n>=s&&e>=r)return 0;if(n>=s)return-1;if(e>=r)return 1;if(this===t)return 0;for(var i=(s>>>=0)-(n>>>=0),o=(r>>>=0)-(e>>>=0),a=Math.min(i,o),c=this.slice(n,s),l=t.slice(e,r),h=0;hs)&&(r=s),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var i=!1;;)switch(n){case"hex":return y(this,t,e,r);case"utf8":case"utf-8":return w(this,t,e,r);case"ascii":return v(this,t,e,r);case"latin1":case"binary":return E(this,t,e,r);case"base64":return A(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,t,e,r);default:if(i)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),i=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var O=4096;function x(t,e,r){var n="";r=Math.min(t.length,r);for(var s=e;sn)&&(r=n);for(var s="",i=e;ir)throw new RangeError("Trying to access beyond buffer length")}function L(t,e,r,n,s,i){if(!u.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>s||et.length)throw new RangeError("Index out of range")}function k(t,e,r,n){e<0&&(e=65535+e+1);for(var s=0,i=Math.min(t.length-r,2);s>>8*(n?s:1-s)}function j(t,e,r,n){e<0&&(e=4294967295+e+1);for(var s=0,i=Math.min(t.length-r,4);s>>8*(n?s:3-s)&255}function N(t,e,r,n,s,i){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function q(t,e,r,n,i){return i||N(t,0,r,4),s.write(t,e,r,n,23,4),r+4}function D(t,e,r,n,i){return i||N(t,0,r,8),s.write(t,e,r,n,52,8),r+8}u.prototype.slice=function(t,e){var r,n=this.length;if((t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(e=void 0===e?n:~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),e0&&(s*=256);)n+=this[t+--e]*s;return n},u.prototype.readUInt8=function(t,e){return e||C(t,1,this.length),this[t]},u.prototype.readUInt16LE=function(t,e){return e||C(t,2,this.length),this[t]|this[t+1]<<8},u.prototype.readUInt16BE=function(t,e){return e||C(t,2,this.length),this[t]<<8|this[t+1]},u.prototype.readUInt32LE=function(t,e){return e||C(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},u.prototype.readUInt32BE=function(t,e){return e||C(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},u.prototype.readIntLE=function(t,e,r){t|=0,e|=0,r||C(t,e,this.length);for(var n=this[t],s=1,i=0;++i=(s*=128)&&(n-=Math.pow(2,8*e)),n},u.prototype.readIntBE=function(t,e,r){t|=0,e|=0,r||C(t,e,this.length);for(var n=e,s=1,i=this[t+--n];n>0&&(s*=256);)i+=this[t+--n]*s;return i>=(s*=128)&&(i-=Math.pow(2,8*e)),i},u.prototype.readInt8=function(t,e){return e||C(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},u.prototype.readInt16LE=function(t,e){e||C(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt16BE=function(t,e){e||C(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt32LE=function(t,e){return e||C(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},u.prototype.readInt32BE=function(t,e){return e||C(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},u.prototype.readFloatLE=function(t,e){return e||C(t,4,this.length),s.read(this,t,!0,23,4)},u.prototype.readFloatBE=function(t,e){return e||C(t,4,this.length),s.read(this,t,!1,23,4)},u.prototype.readDoubleLE=function(t,e){return e||C(t,8,this.length),s.read(this,t,!0,52,8)},u.prototype.readDoubleBE=function(t,e){return e||C(t,8,this.length),s.read(this,t,!1,52,8)},u.prototype.writeUIntLE=function(t,e,r,n){(t=+t,e|=0,r|=0,n)||L(this,t,e,r,Math.pow(2,8*r)-1,0);var s=1,i=0;for(this[e]=255&t;++i=0&&(i*=256);)this[e+s]=t/i&255;return e+r},u.prototype.writeUInt8=function(t,e,r){return t=+t,e|=0,r||L(this,t,e,1,255,0),u.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},u.prototype.writeUInt16LE=function(t,e,r){return t=+t,e|=0,r||L(this,t,e,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):k(this,t,e,!0),e+2},u.prototype.writeUInt16BE=function(t,e,r){return t=+t,e|=0,r||L(this,t,e,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):k(this,t,e,!1),e+2},u.prototype.writeUInt32LE=function(t,e,r){return t=+t,e|=0,r||L(this,t,e,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):j(this,t,e,!0),e+4},u.prototype.writeUInt32BE=function(t,e,r){return t=+t,e|=0,r||L(this,t,e,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):j(this,t,e,!1),e+4},u.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e|=0,!n){var s=Math.pow(2,8*r-1);L(this,t,e,r,s-1,-s)}var i=0,o=1,a=0;for(this[e]=255&t;++i=0&&(o*=256);)t<0&&0===a&&0!==this[e+i+1]&&(a=1),this[e+i]=(t/o|0)-a&255;return e+r},u.prototype.writeInt8=function(t,e,r){return t=+t,e|=0,r||L(this,t,e,1,127,-128),u.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},u.prototype.writeInt16LE=function(t,e,r){return t=+t,e|=0,r||L(this,t,e,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):k(this,t,e,!0),e+2},u.prototype.writeInt16BE=function(t,e,r){return t=+t,e|=0,r||L(this,t,e,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):k(this,t,e,!1),e+2},u.prototype.writeInt32LE=function(t,e,r){return t=+t,e|=0,r||L(this,t,e,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):j(this,t,e,!0),e+4},u.prototype.writeInt32BE=function(t,e,r){return t=+t,e|=0,r||L(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):j(this,t,e,!1),e+4},u.prototype.writeFloatLE=function(t,e,r){return q(this,t,e,!0,r)},u.prototype.writeFloatBE=function(t,e,r){return q(this,t,e,!1,r)},u.prototype.writeDoubleLE=function(t,e,r){return D(this,t,e,!0,r)},u.prototype.writeDoubleBE=function(t,e,r){return D(this,t,e,!1,r)},u.prototype.copy=function(t,e,r,n){if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e=0;--s)t[s+e]=this[s+r];else if(i<1e3||!u.TYPED_ARRAY_SUPPORT)for(s=0;s>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(i=e;i55295&&r<57344){if(!s){if(r>56319){(e-=3)>-1&&i.push(239,191,189);continue}if(o+1===n){(e-=3)>-1&&i.push(239,191,189);continue}s=r;continue}if(r<56320){(e-=3)>-1&&i.push(239,191,189),s=r;continue}r=65536+(s-55296<<10|r-56320)}else s&&(e-=3)>-1&&i.push(239,191,189);if(s=null,r<128){if((e-=1)<0)break;i.push(r)}else if(r<2048){if((e-=2)<0)break;i.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;i.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;i.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return i}function z(t){return n.toByteArray(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(F,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function Y(t,e,r,n){for(var s=0;s=e.length||s>=t.length);++s)e[s+r]=t[s];return s}},434:function(t,e,r){"use strict";var n={};function s(t,e){return function(){return t.apply(e,arguments)}}r.r(n),r.d(n,{hasBrowserEnv:function(){return dt},hasStandardBrowserEnv:function(){return _t},hasStandardBrowserWebWorkerEnv:function(){return bt},navigator:function(){return gt},origin:function(){return mt}});var i=r(606);const{toString:o}=Object.prototype,{getPrototypeOf:a}=Object,{iterator:u,toStringTag:c}=Symbol,l=(h=Object.create(null),t=>{const e=o.call(t);return h[e]||(h[e]=e.slice(8,-1).toLowerCase())});var h;const f=t=>(t=t.toLowerCase(),e=>l(e)===t),p=t=>e=>typeof e===t,{isArray:d}=Array,g=p("undefined");const _=f("ArrayBuffer");const b=p("string"),m=p("function"),y=p("number"),w=t=>null!==t&&"object"==typeof t,v=t=>{if("object"!==l(t))return!1;const e=a(t);return!(null!==e&&e!==Object.prototype&&null!==Object.getPrototypeOf(e)||c in t||u in t)},E=f("Date"),A=f("File"),S=f("Blob"),T=f("FileList"),R=f("URLSearchParams"),[O,x,P,B]=["ReadableStream","Request","Response","Headers"].map(f);function U(t,e,{allOwnKeys:r=!1}={}){if(null==t)return;let n,s;if("object"!=typeof t&&(t=[t]),d(t))for(n=0,s=t.length;n0;)if(n=r[s],e===n.toLowerCase())return n;return null}const L="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,k=t=>!g(t)&&t!==L;const j=(N="undefined"!=typeof Uint8Array&&a(Uint8Array),t=>N&&t instanceof N);var N;const q=f("HTMLFormElement"),D=(({hasOwnProperty:t})=>(e,r)=>t.call(e,r))(Object.prototype),F=f("RegExp"),I=(t,e)=>{const r=Object.getOwnPropertyDescriptors(t),n={};U(r,((r,s)=>{let i;!1!==(i=e(r,s,t))&&(n[s]=i||r)})),Object.defineProperties(t,n)};const M=f("AsyncFunction"),z=(Y="function"==typeof setImmediate,H=m(L.postMessage),Y?setImmediate:H?(J=`axios@${Math.random()}`,W=[],L.addEventListener("message",(({source:t,data:e})=>{t===L&&e===J&&W.length&&W.shift()()}),!1),t=>{W.push(t),L.postMessage(J,"*")}):t=>setTimeout(t));var Y,H,J,W;const V="undefined"!=typeof queueMicrotask?queueMicrotask.bind(L):void 0!==i&&i.nextTick||z;var K={isArray:d,isArrayBuffer:_,isBuffer:function(t){return null!==t&&!g(t)&&null!==t.constructor&&!g(t.constructor)&&m(t.constructor.isBuffer)&&t.constructor.isBuffer(t)},isFormData:t=>{let e;return t&&("function"==typeof FormData&&t instanceof FormData||m(t.append)&&("formdata"===(e=l(t))||"object"===e&&m(t.toString)&&"[object FormData]"===t.toString()))},isArrayBufferView:function(t){let e;return e="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(t):t&&t.buffer&&_(t.buffer),e},isString:b,isNumber:y,isBoolean:t=>!0===t||!1===t,isObject:w,isPlainObject:v,isReadableStream:O,isRequest:x,isResponse:P,isHeaders:B,isUndefined:g,isDate:E,isFile:A,isBlob:S,isRegExp:F,isFunction:m,isStream:t=>w(t)&&m(t.pipe),isURLSearchParams:R,isTypedArray:j,isFileList:T,forEach:U,merge:function t(){const{caseless:e}=k(this)&&this||{},r={},n=(n,s)=>{const i=e&&C(r,s)||s;v(r[i])&&v(n)?r[i]=t(r[i],n):v(n)?r[i]=t({},n):d(n)?r[i]=n.slice():r[i]=n};for(let t=0,e=arguments.length;t(U(e,((e,n)=>{r&&m(e)?t[n]=s(e,r):t[n]=e}),{allOwnKeys:n}),t),trim:t=>t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""),stripBOM:t=>(65279===t.charCodeAt(0)&&(t=t.slice(1)),t),inherits:(t,e,r,n)=>{t.prototype=Object.create(e.prototype,n),t.prototype.constructor=t,Object.defineProperty(t,"super",{value:e.prototype}),r&&Object.assign(t.prototype,r)},toFlatObject:(t,e,r,n)=>{let s,i,o;const u={};if(e=e||{},null==t)return e;do{for(s=Object.getOwnPropertyNames(t),i=s.length;i-- >0;)o=s[i],n&&!n(o,t,e)||u[o]||(e[o]=t[o],u[o]=!0);t=!1!==r&&a(t)}while(t&&(!r||r(t,e))&&t!==Object.prototype);return e},kindOf:l,kindOfTest:f,endsWith:(t,e,r)=>{t=String(t),(void 0===r||r>t.length)&&(r=t.length),r-=e.length;const n=t.indexOf(e,r);return-1!==n&&n===r},toArray:t=>{if(!t)return null;if(d(t))return t;let e=t.length;if(!y(e))return null;const r=new Array(e);for(;e-- >0;)r[e]=t[e];return r},forEachEntry:(t,e)=>{const r=(t&&t[u]).call(t);let n;for(;(n=r.next())&&!n.done;){const r=n.value;e.call(t,r[0],r[1])}},matchAll:(t,e)=>{let r;const n=[];for(;null!==(r=t.exec(e));)n.push(r);return n},isHTMLForm:q,hasOwnProperty:D,hasOwnProp:D,reduceDescriptors:I,freezeMethods:t=>{I(t,((e,r)=>{if(m(t)&&-1!==["arguments","caller","callee"].indexOf(r))return!1;const n=t[r];m(n)&&(e.enumerable=!1,"writable"in e?e.writable=!1:e.set||(e.set=()=>{throw Error("Can not rewrite read-only method '"+r+"'")}))}))},toObjectSet:(t,e)=>{const r={},n=t=>{t.forEach((t=>{r[t]=!0}))};return d(t)?n(t):n(String(t).split(e)),r},toCamelCase:t=>t.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(t,e,r){return e.toUpperCase()+r})),noop:()=>{},toFiniteNumber:(t,e)=>null!=t&&Number.isFinite(t=+t)?t:e,findKey:C,global:L,isContextDefined:k,isSpecCompliantForm:function(t){return!!(t&&m(t.append)&&"FormData"===t[c]&&t[u])},toJSONObject:t=>{const e=new Array(10),r=(t,n)=>{if(w(t)){if(e.indexOf(t)>=0)return;if(!("toJSON"in t)){e[n]=t;const s=d(t)?[]:{};return U(t,((t,e)=>{const i=r(t,n+1);!g(i)&&(s[e]=i)})),e[n]=void 0,s}}return t};return r(t,0)},isAsyncFn:M,isThenable:t=>t&&(w(t)||m(t))&&m(t.then)&&m(t.catch),setImmediate:z,asap:V,isIterable:t=>null!=t&&m(t[u])};function X(t,e,r,n,s){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=t,this.name="AxiosError",e&&(this.code=e),r&&(this.config=r),n&&(this.request=n),s&&(this.response=s,this.status=s.status?s.status:null)}K.inherits(X,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:K.toJSONObject(this.config),code:this.code,status:this.status}}});const $=X.prototype,G={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((t=>{G[t]={value:t}})),Object.defineProperties(X,G),Object.defineProperty($,"isAxiosError",{value:!0}),X.from=(t,e,r,n,s,i)=>{const o=Object.create($);return K.toFlatObject(t,o,(function(t){return t!==Error.prototype}),(t=>"isAxiosError"!==t)),X.call(o,t.message,e,r,n,s),o.cause=t,o.name=t.name,i&&Object.assign(o,i),o};var Q=X,Z=r(287).hp;function tt(t){return K.isPlainObject(t)||K.isArray(t)}function et(t){return K.endsWith(t,"[]")?t.slice(0,-2):t}function rt(t,e,r){return t?t.concat(e).map((function(t,e){return t=et(t),!r&&e?"["+t+"]":t})).join(r?".":""):e}const nt=K.toFlatObject(K,{},null,(function(t){return/^is[A-Z]/.test(t)}));var st=function(t,e,r){if(!K.isObject(t))throw new TypeError("target must be an object");e=e||new FormData;const n=(r=K.toFlatObject(r,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(t,e){return!K.isUndefined(e[t])}))).metaTokens,s=r.visitor||c,i=r.dots,o=r.indexes,a=(r.Blob||"undefined"!=typeof Blob&&Blob)&&K.isSpecCompliantForm(e);if(!K.isFunction(s))throw new TypeError("visitor must be a function");function u(t){if(null===t)return"";if(K.isDate(t))return t.toISOString();if(!a&&K.isBlob(t))throw new Q("Blob is not supported. Use a Buffer instead.");return K.isArrayBuffer(t)||K.isTypedArray(t)?a&&"function"==typeof Blob?new Blob([t]):Z.from(t):t}function c(t,r,s){let a=t;if(t&&!s&&"object"==typeof t)if(K.endsWith(r,"{}"))r=n?r:r.slice(0,-2),t=JSON.stringify(t);else if(K.isArray(t)&&function(t){return K.isArray(t)&&!t.some(tt)}(t)||(K.isFileList(t)||K.endsWith(r,"[]"))&&(a=K.toArray(t)))return r=et(r),a.forEach((function(t,n){!K.isUndefined(t)&&null!==t&&e.append(!0===o?rt([r],n,i):null===o?r:r+"[]",u(t))})),!1;return!!tt(t)||(e.append(rt(s,r,i),u(t)),!1)}const l=[],h=Object.assign(nt,{defaultVisitor:c,convertValue:u,isVisitable:tt});if(!K.isObject(t))throw new TypeError("data must be an object");return function t(r,n){if(!K.isUndefined(r)){if(-1!==l.indexOf(r))throw Error("Circular reference detected in "+n.join("."));l.push(r),K.forEach(r,(function(r,i){!0===(!(K.isUndefined(r)||null===r)&&s.call(e,r,K.isString(i)?i.trim():i,n,h))&&t(r,n?n.concat(i):[i])})),l.pop()}}(t),e};function it(t){const e={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(t).replace(/[!'()~]|%20|%00/g,(function(t){return e[t]}))}function ot(t,e){this._pairs=[],t&&st(t,this,e)}const at=ot.prototype;at.append=function(t,e){this._pairs.push([t,e])},at.toString=function(t){const e=t?function(e){return t.call(this,e,it)}:it;return this._pairs.map((function(t){return e(t[0])+"="+e(t[1])}),"").join("&")};var ut=ot;function ct(t){return encodeURIComponent(t).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function lt(t,e,r){if(!e)return t;const n=r&&r.encode||ct;K.isFunction(r)&&(r={serialize:r});const s=r&&r.serialize;let i;if(i=s?s(e,r):K.isURLSearchParams(e)?e.toString():new ut(e,r).toString(n),i){const e=t.indexOf("#");-1!==e&&(t=t.slice(0,e)),t+=(-1===t.indexOf("?")?"?":"&")+i}return t}var ht=class{constructor(){this.handlers=[]}use(t,e,r){return this.handlers.push({fulfilled:t,rejected:e,synchronous:!!r&&r.synchronous,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){K.forEach(this.handlers,(function(e){null!==e&&t(e)}))}},ft={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},pt={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:ut,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]};const dt="undefined"!=typeof window&&"undefined"!=typeof document,gt="object"==typeof navigator&&navigator||void 0,_t=dt&&(!gt||["ReactNative","NativeScript","NS"].indexOf(gt.product)<0),bt="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,mt=dt&&window.location.href||"http://localhost";var yt={...n,...pt};var wt=function(t){function e(t,r,n,s){let i=t[s++];if("__proto__"===i)return!0;const o=Number.isFinite(+i),a=s>=t.length;if(i=!i&&K.isArray(n)?n.length:i,a)return K.hasOwnProp(n,i)?n[i]=[n[i],r]:n[i]=r,!o;n[i]&&K.isObject(n[i])||(n[i]=[]);return e(t,r,n[i],s)&&K.isArray(n[i])&&(n[i]=function(t){const e={},r=Object.keys(t);let n;const s=r.length;let i;for(n=0;n{e(function(t){return K.matchAll(/\w+|\[(\w*)]/g,t).map((t=>"[]"===t[0]?"":t[1]||t[0]))}(t),n,r,0)})),r}return null};const vt={transitional:ft,adapter:["xhr","http","fetch"],transformRequest:[function(t,e){const r=e.getContentType()||"",n=r.indexOf("application/json")>-1,s=K.isObject(t);s&&K.isHTMLForm(t)&&(t=new FormData(t));if(K.isFormData(t))return n?JSON.stringify(wt(t)):t;if(K.isArrayBuffer(t)||K.isBuffer(t)||K.isStream(t)||K.isFile(t)||K.isBlob(t)||K.isReadableStream(t))return t;if(K.isArrayBufferView(t))return t.buffer;if(K.isURLSearchParams(t))return e.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let i;if(s){if(r.indexOf("application/x-www-form-urlencoded")>-1)return function(t,e){return st(t,new yt.classes.URLSearchParams,Object.assign({visitor:function(t,e,r,n){return yt.isNode&&K.isBuffer(t)?(this.append(e,t.toString("base64")),!1):n.defaultVisitor.apply(this,arguments)}},e))}(t,this.formSerializer).toString();if((i=K.isFileList(t))||r.indexOf("multipart/form-data")>-1){const e=this.env&&this.env.FormData;return st(i?{"files[]":t}:t,e&&new e,this.formSerializer)}}return s||n?(e.setContentType("application/json",!1),function(t,e,r){if(K.isString(t))try{return(e||JSON.parse)(t),K.trim(t)}catch(t){if("SyntaxError"!==t.name)throw t}return(r||JSON.stringify)(t)}(t)):t}],transformResponse:[function(t){const e=this.transitional||vt.transitional,r=e&&e.forcedJSONParsing,n="json"===this.responseType;if(K.isResponse(t)||K.isReadableStream(t))return t;if(t&&K.isString(t)&&(r&&!this.responseType||n)){const r=!(e&&e.silentJSONParsing)&&n;try{return JSON.parse(t)}catch(t){if(r){if("SyntaxError"===t.name)throw Q.from(t,Q.ERR_BAD_RESPONSE,this,null,this.response);throw t}}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:yt.classes.FormData,Blob:yt.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};K.forEach(["delete","get","head","post","put","patch"],(t=>{vt.headers[t]={}}));var Et=vt;const At=K.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]);const St=Symbol("internals");function Tt(t){return t&&String(t).trim().toLowerCase()}function Rt(t){return!1===t||null==t?t:K.isArray(t)?t.map(Rt):String(t)}function Ot(t,e,r,n,s){return K.isFunction(n)?n.call(this,e,r):(s&&(e=r),K.isString(e)?K.isString(n)?-1!==e.indexOf(n):K.isRegExp(n)?n.test(e):void 0:void 0)}class xt{constructor(t){t&&this.set(t)}set(t,e,r){const n=this;function s(t,e,r){const s=Tt(e);if(!s)throw new Error("header name must be a non-empty string");const i=K.findKey(n,s);(!i||void 0===n[i]||!0===r||void 0===r&&!1!==n[i])&&(n[i||e]=Rt(t))}const i=(t,e)=>K.forEach(t,((t,r)=>s(t,r,e)));if(K.isPlainObject(t)||t instanceof this.constructor)i(t,e);else if(K.isString(t)&&(t=t.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(t.trim()))i((t=>{const e={};let r,n,s;return t&&t.split("\n").forEach((function(t){s=t.indexOf(":"),r=t.substring(0,s).trim().toLowerCase(),n=t.substring(s+1).trim(),!r||e[r]&&At[r]||("set-cookie"===r?e[r]?e[r].push(n):e[r]=[n]:e[r]=e[r]?e[r]+", "+n:n)})),e})(t),e);else if(K.isObject(t)&&K.isIterable(t)){let r,n,s={};for(const e of t){if(!K.isArray(e))throw TypeError("Object iterator must return a key-value pair");s[n=e[0]]=(r=s[n])?K.isArray(r)?[...r,e[1]]:[r,e[1]]:e[1]}i(s,e)}else null!=t&&s(e,t,r);return this}get(t,e){if(t=Tt(t)){const r=K.findKey(this,t);if(r){const t=this[r];if(!e)return t;if(!0===e)return function(t){const e=Object.create(null),r=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let n;for(;n=r.exec(t);)e[n[1]]=n[2];return e}(t);if(K.isFunction(e))return e.call(this,t,r);if(K.isRegExp(e))return e.exec(t);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,e){if(t=Tt(t)){const r=K.findKey(this,t);return!(!r||void 0===this[r]||e&&!Ot(0,this[r],r,e))}return!1}delete(t,e){const r=this;let n=!1;function s(t){if(t=Tt(t)){const s=K.findKey(r,t);!s||e&&!Ot(0,r[s],s,e)||(delete r[s],n=!0)}}return K.isArray(t)?t.forEach(s):s(t),n}clear(t){const e=Object.keys(this);let r=e.length,n=!1;for(;r--;){const s=e[r];t&&!Ot(0,this[s],s,t,!0)||(delete this[s],n=!0)}return n}normalize(t){const e=this,r={};return K.forEach(this,((n,s)=>{const i=K.findKey(r,s);if(i)return e[i]=Rt(n),void delete e[s];const o=t?function(t){return t.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,((t,e,r)=>e.toUpperCase()+r))}(s):String(s).trim();o!==s&&delete e[s],e[o]=Rt(n),r[o]=!0})),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const e=Object.create(null);return K.forEach(this,((r,n)=>{null!=r&&!1!==r&&(e[n]=t&&K.isArray(r)?r.join(", "):r)})),e}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map((([t,e])=>t+": "+e)).join("\n")}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...e){const r=new this(t);return e.forEach((t=>r.set(t))),r}static accessor(t){const e=(this[St]=this[St]={accessors:{}}).accessors,r=this.prototype;function n(t){const n=Tt(t);e[n]||(!function(t,e){const r=K.toCamelCase(" "+e);["get","set","has"].forEach((n=>{Object.defineProperty(t,n+r,{value:function(t,r,s){return this[n].call(this,e,t,r,s)},configurable:!0})}))}(r,t),e[n]=!0)}return K.isArray(t)?t.forEach(n):n(t),this}}xt.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),K.reduceDescriptors(xt.prototype,(({value:t},e)=>{let r=e[0].toUpperCase()+e.slice(1);return{get:()=>t,set(t){this[r]=t}}})),K.freezeMethods(xt);var Pt=xt;function Bt(t,e){const r=this||Et,n=e||r,s=Pt.from(n.headers);let i=n.data;return K.forEach(t,(function(t){i=t.call(r,i,s.normalize(),e?e.status:void 0)})),s.normalize(),i}function Ut(t){return!(!t||!t.__CANCEL__)}function Ct(t,e,r){Q.call(this,null==t?"canceled":t,Q.ERR_CANCELED,e,r),this.name="CanceledError"}K.inherits(Ct,Q,{__CANCEL__:!0});var Lt=Ct;function kt(t,e,r){const n=r.config.validateStatus;r.status&&n&&!n(r.status)?e(new Q("Request failed with status code "+r.status,[Q.ERR_BAD_REQUEST,Q.ERR_BAD_RESPONSE][Math.floor(r.status/100)-4],r.config,r.request,r)):t(r)}var jt=function(t,e){t=t||10;const r=new Array(t),n=new Array(t);let s,i=0,o=0;return e=void 0!==e?e:1e3,function(a){const u=Date.now(),c=n[o];s||(s=u),r[i]=a,n[i]=u;let l=o,h=0;for(;l!==i;)h+=r[l++],l%=t;if(i=(i+1)%t,i===o&&(o=(o+1)%t),u-s{s=i,r=null,n&&(clearTimeout(n),n=null),t.apply(null,e)};return[(...t)=>{const e=Date.now(),a=e-s;a>=i?o(t,e):(r=t,n||(n=setTimeout((()=>{n=null,o(r)}),i-a)))},()=>r&&o(r)]};const qt=(t,e,r=3)=>{let n=0;const s=jt(50,250);return Nt((r=>{const i=r.loaded,o=r.lengthComputable?r.total:void 0,a=i-n,u=s(a);n=i;t({loaded:i,total:o,progress:o?i/o:void 0,bytes:a,rate:u||void 0,estimated:u&&o&&i<=o?(o-i)/u:void 0,event:r,lengthComputable:null!=o,[e?"download":"upload"]:!0})}),r)},Dt=(t,e)=>{const r=null!=t;return[n=>e[0]({lengthComputable:r,total:t,loaded:n}),e[1]]},Ft=t=>(...e)=>K.asap((()=>t(...e)));var It=yt.hasStandardBrowserEnv?((t,e)=>r=>(r=new URL(r,yt.origin),t.protocol===r.protocol&&t.host===r.host&&(e||t.port===r.port)))(new URL(yt.origin),yt.navigator&&/(msie|trident)/i.test(yt.navigator.userAgent)):()=>!0,Mt=yt.hasStandardBrowserEnv?{write(t,e,r,n,s,i){const o=[t+"="+encodeURIComponent(e)];K.isNumber(r)&&o.push("expires="+new Date(r).toGMTString()),K.isString(n)&&o.push("path="+n),K.isString(s)&&o.push("domain="+s),!0===i&&o.push("secure"),document.cookie=o.join("; ")},read(t){const e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove(t){this.write(t,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function zt(t,e,r){let n=!/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e);return t&&(n||0==r)?function(t,e){return e?t.replace(/\/?\/$/,"")+"/"+e.replace(/^\/+/,""):t}(t,e):e}const Yt=t=>t instanceof Pt?{...t}:t;function Ht(t,e){e=e||{};const r={};function n(t,e,r,n){return K.isPlainObject(t)&&K.isPlainObject(e)?K.merge.call({caseless:n},t,e):K.isPlainObject(e)?K.merge({},e):K.isArray(e)?e.slice():e}function s(t,e,r,s){return K.isUndefined(e)?K.isUndefined(t)?void 0:n(void 0,t,0,s):n(t,e,0,s)}function i(t,e){if(!K.isUndefined(e))return n(void 0,e)}function o(t,e){return K.isUndefined(e)?K.isUndefined(t)?void 0:n(void 0,t):n(void 0,e)}function a(r,s,i){return i in e?n(r,s):i in t?n(void 0,r):void 0}const u={url:i,method:i,data:i,baseURL:o,transformRequest:o,transformResponse:o,paramsSerializer:o,timeout:o,timeoutMessage:o,withCredentials:o,withXSRFToken:o,adapter:o,responseType:o,xsrfCookieName:o,xsrfHeaderName:o,onUploadProgress:o,onDownloadProgress:o,decompress:o,maxContentLength:o,maxBodyLength:o,beforeRedirect:o,transport:o,httpAgent:o,httpsAgent:o,cancelToken:o,socketPath:o,responseEncoding:o,validateStatus:a,headers:(t,e,r)=>s(Yt(t),Yt(e),0,!0)};return K.forEach(Object.keys(Object.assign({},t,e)),(function(n){const i=u[n]||s,o=i(t[n],e[n],n);K.isUndefined(o)&&i!==a||(r[n]=o)})),r}var Jt=t=>{const e=Ht({},t);let r,{data:n,withXSRFToken:s,xsrfHeaderName:i,xsrfCookieName:o,headers:a,auth:u}=e;if(e.headers=a=Pt.from(a),e.url=lt(zt(e.baseURL,e.url,e.allowAbsoluteUrls),t.params,t.paramsSerializer),u&&a.set("Authorization","Basic "+btoa((u.username||"")+":"+(u.password?unescape(encodeURIComponent(u.password)):""))),K.isFormData(n))if(yt.hasStandardBrowserEnv||yt.hasStandardBrowserWebWorkerEnv)a.setContentType(void 0);else if(!1!==(r=a.getContentType())){const[t,...e]=r?r.split(";").map((t=>t.trim())).filter(Boolean):[];a.setContentType([t||"multipart/form-data",...e].join("; "))}if(yt.hasStandardBrowserEnv&&(s&&K.isFunction(s)&&(s=s(e)),s||!1!==s&&It(e.url))){const t=i&&o&&Mt.read(o);t&&a.set(i,t)}return e};var Wt="undefined"!=typeof XMLHttpRequest&&function(t){return new Promise((function(e,r){const n=Jt(t);let s=n.data;const i=Pt.from(n.headers).normalize();let o,a,u,c,l,{responseType:h,onUploadProgress:f,onDownloadProgress:p}=n;function d(){c&&c(),l&&l(),n.cancelToken&&n.cancelToken.unsubscribe(o),n.signal&&n.signal.removeEventListener("abort",o)}let g=new XMLHttpRequest;function _(){if(!g)return;const n=Pt.from("getAllResponseHeaders"in g&&g.getAllResponseHeaders());kt((function(t){e(t),d()}),(function(t){r(t),d()}),{data:h&&"text"!==h&&"json"!==h?g.response:g.responseText,status:g.status,statusText:g.statusText,headers:n,config:t,request:g}),g=null}g.open(n.method.toUpperCase(),n.url,!0),g.timeout=n.timeout,"onloadend"in g?g.onloadend=_:g.onreadystatechange=function(){g&&4===g.readyState&&(0!==g.status||g.responseURL&&0===g.responseURL.indexOf("file:"))&&setTimeout(_)},g.onabort=function(){g&&(r(new Q("Request aborted",Q.ECONNABORTED,t,g)),g=null)},g.onerror=function(){r(new Q("Network Error",Q.ERR_NETWORK,t,g)),g=null},g.ontimeout=function(){let e=n.timeout?"timeout of "+n.timeout+"ms exceeded":"timeout exceeded";const s=n.transitional||ft;n.timeoutErrorMessage&&(e=n.timeoutErrorMessage),r(new Q(e,s.clarifyTimeoutError?Q.ETIMEDOUT:Q.ECONNABORTED,t,g)),g=null},void 0===s&&i.setContentType(null),"setRequestHeader"in g&&K.forEach(i.toJSON(),(function(t,e){g.setRequestHeader(e,t)})),K.isUndefined(n.withCredentials)||(g.withCredentials=!!n.withCredentials),h&&"json"!==h&&(g.responseType=n.responseType),p&&([u,l]=qt(p,!0),g.addEventListener("progress",u)),f&&g.upload&&([a,c]=qt(f),g.upload.addEventListener("progress",a),g.upload.addEventListener("loadend",c)),(n.cancelToken||n.signal)&&(o=e=>{g&&(r(!e||e.type?new Lt(null,t,g):e),g.abort(),g=null)},n.cancelToken&&n.cancelToken.subscribe(o),n.signal&&(n.signal.aborted?o():n.signal.addEventListener("abort",o)));const b=function(t){const e=/^([-+\w]{1,25})(:?\/\/|:)/.exec(t);return e&&e[1]||""}(n.url);b&&-1===yt.protocols.indexOf(b)?r(new Q("Unsupported protocol "+b+":",Q.ERR_BAD_REQUEST,t)):g.send(s||null)}))};var Vt=(t,e)=>{const{length:r}=t=t?t.filter(Boolean):[];if(e||r){let r,n=new AbortController;const s=function(t){if(!r){r=!0,o();const e=t instanceof Error?t:this.reason;n.abort(e instanceof Q?e:new Lt(e instanceof Error?e.message:e))}};let i=e&&setTimeout((()=>{i=null,s(new Q(`timeout ${e} of ms exceeded`,Q.ETIMEDOUT))}),e);const o=()=>{t&&(i&&clearTimeout(i),i=null,t.forEach((t=>{t.unsubscribe?t.unsubscribe(s):t.removeEventListener("abort",s)})),t=null)};t.forEach((t=>t.addEventListener("abort",s)));const{signal:a}=n;return a.unsubscribe=()=>K.asap(o),a}};const Kt=function*(t,e){let r=t.byteLength;if(!e||r{const s=async function*(t,e){for await(const r of Xt(t))yield*Kt(r,e)}(t,e);let i,o=0,a=t=>{i||(i=!0,n&&n(t))};return new ReadableStream({async pull(t){try{const{done:e,value:n}=await s.next();if(e)return a(),void t.close();let i=n.byteLength;if(r){let t=o+=i;r(t)}t.enqueue(new Uint8Array(n))}catch(t){throw a(t),t}},cancel(t){return a(t),s.return()}},{highWaterMark:2})},Gt="function"==typeof fetch&&"function"==typeof Request&&"function"==typeof Response,Qt=Gt&&"function"==typeof ReadableStream,Zt=Gt&&("function"==typeof TextEncoder?(te=new TextEncoder,t=>te.encode(t)):async t=>new Uint8Array(await new Response(t).arrayBuffer()));var te;const ee=(t,...e)=>{try{return!!t(...e)}catch(t){return!1}},re=Qt&&ee((()=>{let t=!1;const e=new Request(yt.origin,{body:new ReadableStream,method:"POST",get duplex(){return t=!0,"half"}}).headers.has("Content-Type");return t&&!e})),ne=Qt&&ee((()=>K.isReadableStream(new Response("").body))),se={stream:ne&&(t=>t.body)};var ie;Gt&&(ie=new Response,["text","arrayBuffer","blob","formData","stream"].forEach((t=>{!se[t]&&(se[t]=K.isFunction(ie[t])?e=>e[t]():(e,r)=>{throw new Q(`Response type '${t}' is not supported`,Q.ERR_NOT_SUPPORT,r)})})));const oe=async(t,e)=>{const r=K.toFiniteNumber(t.getContentLength());return null==r?(async t=>{if(null==t)return 0;if(K.isBlob(t))return t.size;if(K.isSpecCompliantForm(t)){const e=new Request(yt.origin,{method:"POST",body:t});return(await e.arrayBuffer()).byteLength}return K.isArrayBufferView(t)||K.isArrayBuffer(t)?t.byteLength:(K.isURLSearchParams(t)&&(t+=""),K.isString(t)?(await Zt(t)).byteLength:void 0)})(e):r};const ae={http:null,xhr:Wt,fetch:Gt&&(async t=>{let{url:e,method:r,data:n,signal:s,cancelToken:i,timeout:o,onDownloadProgress:a,onUploadProgress:u,responseType:c,headers:l,withCredentials:h="same-origin",fetchOptions:f}=Jt(t);c=c?(c+"").toLowerCase():"text";let p,d=Vt([s,i&&i.toAbortSignal()],o);const g=d&&d.unsubscribe&&(()=>{d.unsubscribe()});let _;try{if(u&&re&&"get"!==r&&"head"!==r&&0!==(_=await oe(l,n))){let t,r=new Request(e,{method:"POST",body:n,duplex:"half"});if(K.isFormData(n)&&(t=r.headers.get("content-type"))&&l.setContentType(t),r.body){const[t,e]=Dt(_,qt(Ft(u)));n=$t(r.body,65536,t,e)}}K.isString(h)||(h=h?"include":"omit");const s="credentials"in Request.prototype;p=new Request(e,{...f,signal:d,method:r.toUpperCase(),headers:l.normalize().toJSON(),body:n,duplex:"half",credentials:s?h:void 0});let i=await fetch(p);const o=ne&&("stream"===c||"response"===c);if(ne&&(a||o&&g)){const t={};["status","statusText","headers"].forEach((e=>{t[e]=i[e]}));const e=K.toFiniteNumber(i.headers.get("content-length")),[r,n]=a&&Dt(e,qt(Ft(a),!0))||[];i=new Response($t(i.body,65536,r,(()=>{n&&n(),g&&g()})),t)}c=c||"text";let b=await se[K.findKey(se,c)||"text"](i,t);return!o&&g&&g(),await new Promise(((e,r)=>{kt(e,r,{data:b,headers:Pt.from(i.headers),status:i.status,statusText:i.statusText,config:t,request:p})}))}catch(e){if(g&&g(),e&&"TypeError"===e.name&&/Load failed|fetch/i.test(e.message))throw Object.assign(new Q("Network Error",Q.ERR_NETWORK,t,p),{cause:e.cause||e});throw Q.from(e,e&&e.code,t,p)}})};K.forEach(ae,((t,e)=>{if(t){try{Object.defineProperty(t,"name",{value:e})}catch(t){}Object.defineProperty(t,"adapterName",{value:e})}}));const ue=t=>`- ${t}`,ce=t=>K.isFunction(t)||null===t||!1===t;var le=t=>{t=K.isArray(t)?t:[t];const{length:e}=t;let r,n;const s={};for(let i=0;i`adapter ${t} `+(!1===e?"is not supported by the environment":"is not available in the build")));let r=e?t.length>1?"since :\n"+t.map(ue).join("\n"):" "+ue(t[0]):"as no adapter specified";throw new Q("There is no suitable adapter to dispatch the request "+r,"ERR_NOT_SUPPORT")}return n};function he(t){if(t.cancelToken&&t.cancelToken.throwIfRequested(),t.signal&&t.signal.aborted)throw new Lt(null,t)}function fe(t){he(t),t.headers=Pt.from(t.headers),t.data=Bt.call(t,t.transformRequest),-1!==["post","put","patch"].indexOf(t.method)&&t.headers.setContentType("application/x-www-form-urlencoded",!1);return le(t.adapter||Et.adapter)(t).then((function(e){return he(t),e.data=Bt.call(t,t.transformResponse,e),e.headers=Pt.from(e.headers),e}),(function(e){return Ut(e)||(he(t),e&&e.response&&(e.response.data=Bt.call(t,t.transformResponse,e.response),e.response.headers=Pt.from(e.response.headers))),Promise.reject(e)}))}const pe="1.9.0",de={};["object","boolean","number","function","string","symbol"].forEach(((t,e)=>{de[t]=function(r){return typeof r===t||"a"+(e<1?"n ":" ")+t}}));const ge={};de.transitional=function(t,e,r){return(n,s,i)=>{if(!1===t)throw new Q(function(t,e){return"[Axios v1.9.0] Transitional option '"+t+"'"+e+(r?". "+r:"")}(s," has been removed"+(e?" in "+e:"")),Q.ERR_DEPRECATED);return e&&!ge[s]&&(ge[s]=!0),!t||t(n,s,i)}},de.spelling=function(t){return(t,e)=>!0};var _e={assertOptions:function(t,e,r){if("object"!=typeof t)throw new Q("options must be an object",Q.ERR_BAD_OPTION_VALUE);const n=Object.keys(t);let s=n.length;for(;s-- >0;){const i=n[s],o=e[i];if(o){const e=t[i],r=void 0===e||o(e,i,t);if(!0!==r)throw new Q("option "+i+" must be "+r,Q.ERR_BAD_OPTION_VALUE)}else if(!0!==r)throw new Q("Unknown option "+i,Q.ERR_BAD_OPTION)}},validators:de};const be=_e.validators;class me{constructor(t){this.defaults=t||{},this.interceptors={request:new ht,response:new ht}}async request(t,e){try{return await this._request(t,e)}catch(t){if(t instanceof Error){let e={};Error.captureStackTrace?Error.captureStackTrace(e):e=new Error;const r=e.stack?e.stack.replace(/^.+\n/,""):"";try{t.stack?r&&!String(t.stack).endsWith(r.replace(/^.+\n.+\n/,""))&&(t.stack+="\n"+r):t.stack=r}catch(t){}}throw t}}_request(t,e){"string"==typeof t?(e=e||{}).url=t:e=t||{},e=Ht(this.defaults,e);const{transitional:r,paramsSerializer:n,headers:s}=e;void 0!==r&&_e.assertOptions(r,{silentJSONParsing:be.transitional(be.boolean),forcedJSONParsing:be.transitional(be.boolean),clarifyTimeoutError:be.transitional(be.boolean)},!1),null!=n&&(K.isFunction(n)?e.paramsSerializer={serialize:n}:_e.assertOptions(n,{encode:be.function,serialize:be.function},!0)),void 0!==e.allowAbsoluteUrls||(void 0!==this.defaults.allowAbsoluteUrls?e.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:e.allowAbsoluteUrls=!0),_e.assertOptions(e,{baseUrl:be.spelling("baseURL"),withXsrfToken:be.spelling("withXSRFToken")},!0),e.method=(e.method||this.defaults.method||"get").toLowerCase();let i=s&&K.merge(s.common,s[e.method]);s&&K.forEach(["delete","get","head","post","put","patch","common"],(t=>{delete s[t]})),e.headers=Pt.concat(i,s);const o=[];let a=!0;this.interceptors.request.forEach((function(t){"function"==typeof t.runWhen&&!1===t.runWhen(e)||(a=a&&t.synchronous,o.unshift(t.fulfilled,t.rejected))}));const u=[];let c;this.interceptors.response.forEach((function(t){u.push(t.fulfilled,t.rejected)}));let l,h=0;if(!a){const t=[fe.bind(this),void 0];for(t.unshift.apply(t,o),t.push.apply(t,u),l=t.length,c=Promise.resolve(e);h{if(!r._listeners)return;let e=r._listeners.length;for(;e-- >0;)r._listeners[e](t);r._listeners=null})),this.promise.then=t=>{let e;const n=new Promise((t=>{r.subscribe(t),e=t})).then(t);return n.cancel=function(){r.unsubscribe(e)},n},t((function(t,n,s){r.reason||(r.reason=new Lt(t,n,s),e(r.reason))}))}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){this.reason?t(this.reason):this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const e=this._listeners.indexOf(t);-1!==e&&this._listeners.splice(e,1)}toAbortSignal(){const t=new AbortController,e=e=>{t.abort(e)};return this.subscribe(e),t.signal.unsubscribe=()=>this.unsubscribe(e),t.signal}static source(){let t;return{token:new we((function(e){t=e})),cancel:t}}}var ve=we;const Ee={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Ee).forEach((([t,e])=>{Ee[e]=t}));var Ae=Ee;const Se=function t(e){const r=new ye(e),n=s(ye.prototype.request,r);return K.extend(n,ye.prototype,r,{allOwnKeys:!0}),K.extend(n,r,null,{allOwnKeys:!0}),n.create=function(r){return t(Ht(e,r))},n}(Et);Se.Axios=ye,Se.CanceledError=Lt,Se.CancelToken=ve,Se.isCancel=Ut,Se.VERSION=pe,Se.toFormData=st,Se.AxiosError=Q,Se.Cancel=Se.CanceledError,Se.all=function(t){return Promise.all(t)},Se.spread=function(t){return function(e){return t.apply(null,e)}},Se.isAxiosError=function(t){return K.isObject(t)&&!0===t.isAxiosError},Se.mergeConfig=Ht,Se.AxiosHeaders=Pt,Se.formToJSON=t=>wt(K.isHTMLForm(t)?new FormData(t):t),Se.getAdapter=le,Se.HttpStatusCode=Ae,Se.default=Se;var Te=Se;class Re{constructor(t){this.notice=t,this.set_vars()&&this.set_events()}set_vars(){return this.settings={ajax_action:this.notice.getAttribute("data-notice-action"),ajax_url:this.notice.getAttribute("data-notice-url"),button_close_class:".notice-dismiss",button_hide_class:"[data-permanently]"},this.events={click_on_close:this.click_on_close.bind(this)},!0}set_events(){this.notice.addEventListener("click",this.events.click_on_close)}click_on_close(t){const{button_close_class:e,button_hide_class:r}=this.settings;t.target.matches(e)?(this.notice.removeEventListener("click",this.events.click_on_close),this.hide_notice(!1)):t.target.matches(r)&&(this.notice.removeEventListener("click",this.events.click_on_close),this.hide_notice(!0))}hide_notice(t){const{button_close_class:e}=this.settings;this.send_request(t),t&&this.notice.querySelector(e).click()}send_request(t){const{ajax_url:e}=this.settings;Te({method:"POST",url:e,data:this.get_data_for_request(t)})}get_data_for_request(t){const{ajax_action:e}=this.settings,r=new FormData;return r.append("action",e),r.append("is_permanently",t?1:0),r}}class Oe{constructor(){const t=document.querySelectorAll('.notice[data-notice="webp-converter-for-media"][data-notice-action]'),{length:e}=t;for(let r=0;r{t.data&&t.data.output_html&&(s.innerHTML=t.data.output_html)})).catch((t=>{}))}}class Pe{constructor(){this.status=this.set_vars()}set_vars(){if(this.counter_webp=document.querySelector('[data-counter="webp"]'),this.counter_avif=document.querySelector('[data-counter="avif"]'),this.counter_webp&&this.counter_avif)return this.counter_webp_percent=this.counter_webp.querySelector("[data-counter-percent]"),this.counter_webp_images=this.counter_webp.querySelector("[data-counter-left]"),this.counter_webp_loader=this.counter_webp.querySelector("[data-counter-loader]"),this.counter_avif_percent=this.counter_avif.querySelector("[data-counter-percent]"),this.counter_avif_images=this.counter_avif.querySelector("[data-counter-left]"),this.counter_avif_loader=this.counter_avif.querySelector("[data-counter-loader]"),this.data={webp_converted:0,webp_unconverted:0,webp_all:0,avif_converted:0,avif_unconverted:0,avif_all:0},this.atts={counter_percent:"data-percent"},!0}set_files_webp(t,e){this.status&&(this.data.webp_converted+=t,this.data.webp_unconverted=e-t,this.data.webp_all=e||this.data.webp_all,this.refresh_stats())}reset_files_webp(){this.status&&(this.data.webp_converted=0,this.data.webp_unconverted=this.data.webp_all,this.refresh_stats())}set_files_avif(t,e){this.status&&(this.data.avif_converted+=t,this.data.avif_unconverted=e-t,this.data.avif_all=e,this.refresh_stats())}set_error(){this.counter_webp_loader.setAttribute("hidden","hidden"),this.counter_avif_loader.setAttribute("hidden","hidden")}reset_files_avif(){this.status&&(this.data.avif_converted=0,this.data.avif_unconverted=this.data.avif_all,this.refresh_stats())}add_files_webp(t){this.status&&(this.data.webp_converted+=t,this.data.webp_unconverted-=t,this.refresh_stats())}add_files_avif(t){this.status&&(this.data.avif_converted+=t,this.data.avif_unconverted-=t,this.refresh_stats())}refresh_stats(){const{webp_converted:t,webp_unconverted:e,webp_all:r,avif_converted:n,avif_unconverted:s,avif_all:i}=this.data,{counter_percent:o}=this.atts,a=r>0?Math.floor(t/r*100):0,u=i>0?Math.floor(n/i*100):0;this.counter_webp.setAttribute(o,a),this.counter_webp_percent.innerText=a,this.counter_webp_images.innerText=Math.max(e,0).toString().replace(/\B(?=(\d{3})+(?!\d))/g," "),this.counter_avif.setAttribute(o,u),this.counter_avif_percent.innerText=u,this.counter_avif_images.innerText=Math.max(s,0).toString().replace(/\B(?=(\d{3})+(?!\d))/g," ")}}class Be{constructor(){this.set_vars()&&this.set_events()}set_vars(){return this.triggers=document.querySelectorAll("[data-toggle-trigger]"),!!this.triggers.length&&(this.outputs=document.querySelectorAll("[data-toggle-output-values]"),!0)}set_events(){const{length:t}=this.triggers;for(let e=0;e=0)return!0;return!1}}class Ue{constructor(t){this.conversion_stats_manager=t,this.set_vars()&&this.set_events()}set_vars(){if(this.section=document.querySelector(".webpcLoader"),this.section&&(this.wrapper_status=this.section.querySelector("[data-status]"),this.wrapper_status))return this.progress=this.wrapper_status.querySelector("[data-status-progress]"),this.progress_size=this.section.querySelector("[data-status-count-size]"),this.progress_success=this.section.querySelector("[data-status-count-success]"),this.progress_failed=this.section.querySelector("[data-status-count-error]"),this.wrapper_errors=this.section.querySelector("[data-errors]"),this.errors_output=this.wrapper_errors.querySelector("[data-errors-output]"),this.wrapper_success=this.section.querySelector("[data-success]"),this.option_force=this.section.querySelector('input[name="regenerate_force"]'),this.submit_button=this.section.querySelector("[data-submit]"),this.data={count:0,max:0,items:[],size:{before:0,after:0},files_counter:{all:0,converted:0},errors:0},this.settings={is_disabled:!1,ajax:{url_paths:this.section.getAttribute("data-api-paths").split("|")[0],url_paths_nonce:this.section.getAttribute("data-api-paths").split("|")[1],url_regenerate:this.section.getAttribute("data-api-regenerate").split("|")[0],url_regenerate_nonce:this.section.getAttribute("data-api-regenerate").split("|")[1],error_message:this.section.getAttribute("data-api-error-message")},units:["kB","MB","GB"],max_errors:1e3,connection_timeout:6e4},this.atts={progress:"data-percent",counter_percent:"data-percent"},this.classes={progress_error:"webpcLoader__statusProgress--error",button_disabled:"webpcLoader__button--disabled",error_message:"webpcLoader__errorsContentError"},!0}set_events(){this.submit_button.addEventListener("click",this.init_regeneration.bind(this))}init_regeneration(t){t.preventDefault(),this.settings.is_disabled||(this.settings.is_disabled=!0,this.submit_button.classList.add(this.classes.button_disabled),this.option_force.setAttribute("disabled","disabled"),this.wrapper_status.removeAttribute("hidden"),this.send_request_for_paths())}send_request_for_paths(){const{url_paths:t,url_paths_nonce:e}=this.settings.ajax;Te({method:"POST",url:t,data:{regenerate_force:this.option_force.checked?1:0},headers:{"X-WP-Nonce":e}}).then((t=>{const e=this.parse_files_paths(t.data);this.data.items=e,this.data.max=e.length,this.option_force.checked&&(this.conversion_stats_manager.reset_files_webp(),this.conversion_stats_manager.reset_files_avif()),this.regenerate_next_images()})).catch((t=>{this.catch_request_error(t,!0)}))}parse_files_paths(t){const e=[];for(const r in t){const{length:n}=t[r].files;for(let s=0;s0&&void 0!==arguments[0]?arguments[0]:0;if(0===this.data.max&&this.update_progress(),this.data.count>=this.data.max)return;t>=3?t=0:t>0&&this.data.count--;const e=this.data.items[this.data.count];this.data.count++,this.send_request_for_regeneration(e,t)}send_request_for_regeneration(t,e){const{url_regenerate:r,url_regenerate_nonce:n}=this.settings.ajax;Te({method:"POST",url:r,data:{regenerate_force:this.option_force.checked?1:0,paths:t},headers:{"X-WP-Nonce":n},timeout:this.settings.connection_timeout}).then((t=>{const{is_fatal_error:e}=t.data;this.update_errors(t.data.errors,e),e||(this.update_size(t.data),this.update_files_count(t.data),this.update_progress(),this.regenerate_next_images())})).catch((r=>{r.response?(this.catch_request_error(r,!1,t),setTimeout(this.regenerate_next_images.bind(this),1e3)):setTimeout(this.regenerate_next_images.bind(this,e+1),1e3)}))}update_errors(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this.data.errors>this.settings.max_errors&&(this.data.errors=0,this.errors_output.innerHTML="");const r=this.get_date();for(let n=0;n2&&void 0!==arguments[2]?arguments[2]:null;e&&(this.print_error_message([this.settings.ajax.error_message],!0,!1),this.set_fatal_error());const n=null!==r?'["'.concat(r.join('", "'),'"]'):"";this.print_error_message("".concat(t.response.status," - ").concat(t.response.statusText," (").concat(t.response.config.url,") ").concat(n),!0,!0)}print_error_message(t,e,r){let n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;const s=document.createElement("p"),i=n||this.get_date();if(r){const e=document.createElement("pre");e.innerText=t,s.appendChild(e)}else s.innerHTML="".concat(i," - ").concat(t);e&&s.classList.add(this.classes.error_message),this.wrapper_errors.removeAttribute("hidden"),this.errors_output.appendChild(s)}update_size(t){const{size:e}=this.data;e.before+=t.size.before,e.after+=t.size.after;let r=e.before-e.after;if(r<0&&(r=0),0===r)return;let n=Math.round(100*(1-e.after/e.before));n<0&&(n=0);let s=-1;do{s++,r/=1024}while(r>1024);const i=r.toFixed(2),o=this.settings.units[s];this.progress_size.innerHTML="".concat(i," ").concat(o," (").concat(n,"%)")}update_files_count(t){const{files_counter:e}=this.data,{files:r}=t;this.conversion_stats_manager.add_files_webp(r.webp_available),this.conversion_stats_manager.add_files_avif(r.avif_available),e.converted+=r.webp_converted+r.avif_converted,e.all+=r.webp_available+r.avif_available,this.progress_success.innerText=e.converted.toString().replace(/\B(?=(\d{3})+(?!\d))/g," "),this.progress_failed.innerText=(e.all-e.converted).toString().replace(/\B(?=(\d{3})+(?!\d))/g," ")}update_progress(){let t=this.data.max>0?Math.floor(this.data.count/this.data.max*100):100;t>100&&(t=100),100===t&&this.wrapper_success.removeAttribute("hidden"),this.progress.setAttribute(this.atts.progress,t.toString())}}class Ce{constructor(t,e,r){this.conversion_stats_manager=t,this.images_tree_generator=e,this.plans_button_generator=r,this.set_vars()&&this.send_request()}set_vars(){if(this.section=document.querySelector("[data-api-stats]"),this.section)return this.error_output=this.section.querySelector("[data-api-stats-error]"),this.settings={ajax_url:this.section.getAttribute("data-api-stats").split("|")[0],ajax_nonce:this.section.getAttribute("data-api-stats").split("|")[1]},!0}send_request(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;if(t>=3)return this.conversion_stats_manager.set_error(),this.images_tree_generator.set_error(),void this.plans_button_generator.set_error();const e=new Date;Te({method:"GET",url:this.settings.ajax_url,headers:{"X-WP-Nonce":this.settings.ajax_nonce}}).then((r=>{if(r.data){const t=r.data.value_webp_all||0,e=r.data.value_webp_converted||0,n=r.data.value_avif_all||0,s=r.data.value_avif_converted||0;this.conversion_stats_manager.set_files_webp(e,t),this.conversion_stats_manager.set_files_avif(s,n),this.images_tree_generator.generate_tree(r.data.tree),this.plans_button_generator.show_button(t-e,n-s)}else this.send_request(t+1),this.show_request_error(e,r)})).catch((r=>{this.send_request(t+1),r.response&&this.show_request_error(e,r.response)}))}show_request_error(t,e){const r=(new Date-t)/1e3,n=e.status,s=JSON.stringify(e.data);this.error_output.innerText="HTTP Error ".concat(n," (").concat(r,"s): ").concat(s),this.error_output.removeAttribute("hidden")}}class Le{constructor(){this.status=this.set_vars()}set_vars(){if(this.section=document.querySelector("[data-tree]"),this.section)return this.loader=this.section.querySelector("[data-tree-loader]"),this.toggle_button=document.querySelector("[data-tree-toggle-button]"),this.settings={max_items:1e3,message_files_count:this.section.getAttribute("data-tree-files-count"),message_input_tooltip:this.section.getAttribute("data-tree-input-tooltip")},!0}generate_tree(t){if(!this.status)return;this.loader=null,this.section.innerHTML=this.draw_tree(t);const e=this.section.querySelectorAll(".webpcTree__itemCheckbox");for(let t=0;t1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"tree",n="";const{length:s}=t;if(!s)return n;0===e&&(n+='
    ');for(let i=0;i',n+=''),n+='",n+='
      ',a&&(n+=this.draw_tree(t[i].items,e+1,s));for(let e=0;e',n+=''.concat(t[i].files[e],""),n+="";if(o>this.settings.max_items){const t=(o-this.settings.max_items).toString().replace(/\B(?=(\d{3})+(?!\d))/g," ");n+='
    • ',n+=''.concat(this.settings.message_files_count.replace("%s",t),""),n+="
    • "}n+="
    ",n+=""}return 0===e&&(n+="
"),n}hide_child_items(t){if(t.currentTarget.checked)return;const e=t.currentTarget.parentNode.querySelectorAll(".webpcTree__itemCheckbox");for(let t=0;t{this.button.click()}),0)}set_content_page(t){for(let t=0;t0?o-4:o;for(r=0;r>16&255,c[l++]=e>>8&255,c[l++]=255&e;2===u&&(e=n[t.charCodeAt(r)]<<2|n[t.charCodeAt(r+1)]>>4,c[l++]=255&e);1===u&&(e=n[t.charCodeAt(r)]<<10|n[t.charCodeAt(r+1)]<<4|n[t.charCodeAt(r+2)]>>2,c[l++]=e>>8&255,c[l++]=255&e);return c},e.fromByteArray=function(t){for(var e,n=t.length,s=n%3,i=[],o=16383,a=0,c=n-s;ac?c:a+o));1===s?(e=t[n-1],i.push(r[e>>2]+r[e<<4&63]+"==")):2===s&&(e=(t[n-2]<<8)+t[n-1],i.push(r[e>>10]+r[e>>4&63]+r[e<<2&63]+"="));return i.join("")};for(var r=[],n=[],s="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0;o<64;++o)r[o]=i[o],n[i.charCodeAt(o)]=o;function a(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function u(t,e,n){for(var s,i,o=[],a=e;a>18&63]+r[i>>12&63]+r[i>>6&63]+r[63&i]);return o.join("")}n["-".charCodeAt(0)]=62,n["_".charCodeAt(0)]=63},606:function(t){var e,r,n=t.exports={};function s(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function o(t){if(e===setTimeout)return setTimeout(t,0);if((e===s||!e)&&setTimeout)return e=setTimeout,setTimeout(t,0);try{return e(t,0)}catch(r){try{return e.call(null,t,0)}catch(r){return e.call(this,t,0)}}}!function(){try{e="function"==typeof setTimeout?setTimeout:s}catch(t){e=s}try{r="function"==typeof clearTimeout?clearTimeout:i}catch(t){r=i}}();var a,u=[],c=!1,l=-1;function h(){c&&a&&(c=!1,a.length?u=a.concat(u):l=-1,u.length&&f())}function f(){if(!c){var t=o(h);c=!0;for(var e=u.length;e;){for(a=u,u=[];++l1)for(var r=1;r=i)&&Object.keys(n.O).every((function(t){return n.O[t](r[u])}))?r.splice(u--,1):(a=!1,i0&&t[l-1][2]>i;l--)t[l]=t[l-1];t[l]=[r,s,i]},n.d=function(t,e){for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},function(){var t={671:0,2:0};n.O.j=function(e){return 0===t[e]};var e=function(e,r){var s,i,o=r[0],a=r[1],u=r[2],c=0;if(o.some((function(e){return 0!==t[e]}))){for(s in a)n.o(a,s)&&(n.m[s]=a[s]);if(u)var l=u(n)}for(e&&e(r);c + * @license MIT + */ + +/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ diff --git a/wp-content/plugins/webp-converter-for-media/assets/fonts/icons/icomoon.woff b/wp-content/plugins/webp-converter-for-media/assets/fonts/icons/icomoon.woff new file mode 100755 index 0000000000000000000000000000000000000000..69aee61b20bc2f6d7a3d9ea63d813b0038fb4454 GIT binary patch literal 4808 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 Qoe99l?)qQ-Sw0Q_8{1WY761SM literal 0 HcmV?d00001 diff --git a/wp-content/plugins/webp-converter-for-media/assets/img/author.png b/wp-content/plugins/webp-converter-for-media/assets/img/author.png new file mode 100755 index 0000000000000000000000000000000000000000..0426343e92d4b2c04c24b17e08eb83932db68913 GIT binary patch literal 15888 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

U>|C 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 VOki1atTF%q002ovPDHLkV1l30sqX*) literal 0 HcmV?d00001 diff --git a/wp-content/plugins/webp-converter-for-media/assets/img/logo-headline.png b/wp-content/plugins/webp-converter-for-media/assets/img/logo-headline.png new file mode 100755 index 0000000000000000000000000000000000000000..fc6aca9bef2ad7ff60a3a5e7c2f285f41b52aa9a GIT binary patch literal 10441 zcmX|nbx@S=`!(H-gmkPRy>v)7>yj!+gLH#*ce^ywAT8p8bh97`OM`SHDdiH93+xX+ z-+ABbk7u5ld*+(CuXCNd&WYF2QX?jyBS1q#Bi2w?)PkQ{9#>091dU%*NqoJ{& zX(%ha_RBvm@XZIjDd>UK>c#HI=aFHuXuQVi3%5Yi1>+8TsD59~IZ-C^OZX+PrK1dF z42S^fX#obG?R^O2efdNqVPp7D|9J72wfocRrJAamKRJs91=zLSMcSc0l^yN3Z)O7# zS0SfW#m`3k&>M&rs2AuKa2B2{V7ga)Lw_z=4foN_xK4_WZMA3RU&*j-s6nApU;RydcM<@(|Tr-zxxmb>N2>^jW z!|S*LSiPy(mpE(5a|qoS!4e|Oa%HLO!q~mG((XOE;$XL#^RAN1&VgdeEUqGiaHTdYXIU2j}>3DDK9H4>je7C5+=EXX=5OH%Ed&%m^#

t4oC&Q;qj z)_E71-)(;!CtNg(xzIJ0)vtRc74J)Nq_c*0QA5BFS=Zfm$Zok-L4NLkbBP{5*L8Qs zWk3&_0fLF9d#-|WAp^tuT_Ktcx}or^&NpGW*}Wr}biLKood><^Ogch*PVjNtTbX$k zpNe8O;J-b>0k_m4Q=dP zO8JYKyA#>)UdWJ6T&PAODjz3QHk!H@xuMfz+2c#x_d3R5Lo6?}Dsu$pD(2{G53QC* z2Zqh|6os8G7OwaR{Us(T&RANxx|b!sHglpX$^4h#F$088q8W2sALQa@L|wS2mBCS| z<@%auB(j-Lk>h%uRnbc8ZITk|1P`qn0b2rU2F(Z0UEL3c58s)p{sRcbELO2`Eo8*( z_ErqU<+$^+ZC3Bp8rnq2`wAozuGdoRt>h%LHB|Dvk0lGio{mt$T)IMEE756%&T(%z z=rODPOCnV#h&9M^0_!pRxV6#tr=ff(9?_Hw2@K1^DDAv*z1}lhA4l}_ z=gh>JVVev+d+5;i*&|fpb0rSoJT2fc9IAnkb-2lN;5gDM_c=^n_B__!O7aVBnAt)IyFihiSVPqfUQ_?!H}B72v{ z2y&aOOOPRj?MHt?wSf=4nD}we`lhn}1|ugZT)$MSOOG{uBy#TBW%@PNz1U+@+B#vg zZP?nKgESsv-=aBU>xX?XL}>JwX!?^G)C60i!UbVZx0@nFWb@prN>$*^iN1(mA>lic z_nDT~yvr44&=sBB{A(N|0qnD$n>NMboG}_5(ETG#1lY=zNzfl~r<`lhwJ;tqOqj&f zogjJ%U@12h<0K6-n!DcTedzCabcqL z;hFxc!`WfCu&k2TMV7RZeL$M06{l>|_2$mmwlItlul!Z2VL_s45peq1cE7e`=9wG$ z^h{|_LQrv$3F^~M;95>MB9tuNYl)_n`})`^Tq&HHmE^*d9EwBstGLqPDWf9hhJ2q0 zc-~vh7&3rJsRwZVi$gd#VvEr}INWCO-bleCXv`9-x}{|yyy4L}ep{GzE`!i8TF_y} zEgaoGi(SY$dO=O4BDvexDPkRiC%B+oRq7&h1j}sX;O%JcJ zJ?VMVNWhM1_)Iv#Q0_-l-}jQ>K8e1eOGb;g9Ig$gUJmd6juak3SdrEyj*D6j7S@8G zDpTo+E+SeSSB$kt05X_S0w-HBYACYDq4&_L$1N<_);}2eyl+7PDGPDjp#~6%kFBde zwt^vPJAM-7-9psp-i4mQHArE1CI1r2e?;Kj@nM1Ha)~}yfq71@G?U*`iZ4jy_er3ZSmNbHsN*`y$352#Z5`5N z>2QK5>`{VOXuj$_l;1$#c-2GMa}{8+jKpKOxNy9%wa`4tHHgV_6`E#MQhyk>?Md6{ znuXtYCVD?FPfM$3IwA=|U&Pa#B6%`|wypsFE&%w*+7T>9A?um)Bs^!}t=v0u4T5Q3 zvX^l4`BKQa2D*b2rXk!e)hUSIXN9%L4xPU4Cxc`WB#s~nedC=CZHIBQW|K+#Cm~UP zqI$l=zMlJE;rD%s?)8R26PSK&h<5Sk(?K~lhQ*Y3MAk3oUxW|#ZOP2bPzj2o-w9K! z(W{`d_o9k$^s#9e&xpRsxj#+QJ|p`keLCFukmj)5n0wJ-47n}f?TkNAisQHdZTv7z z@+WC)fuW5Xeex;4L+zM{nO|H7`4!U%CEt-50>m8D2A^ANGtnD<>LNGv^Vx!>o-WCM zWnoFLCmHu3tq%*9J(1nmQwN2sVm*}isIdOp=&GdCryO&T&{KAWw2N{V{}HIAgiR0{}=5ViXZ(O@>= zREoc?ppcu_7FADm_;PztA@&3L;>Y&d5kcWxD(V#Jg82@K%d0%f?km?_U3c1^<;h#w zzQ$$|qG=w@4@|n%851f8s-|kd-n@^Rs1vp$XR*<#YoL3i!{Yt(gdcUYMQ(FWEv%HN zog5R_*~zr>w_3ZIg?ly19D~Tz*l$FBL=vp_gO@#S;pS}PSF*}3YfUdZCeX%}ag7s}us3Al7V)v%eS6fd?;f@I)GdQ@{ zKptb6OY`2F{Op>~LS*0h46A74-=G2Unl&TklzDmdje7n5o zedpOh*E6&WbfKT{?&C8d>_J4XuW(&orN<>((O8#jy4MA=R+k2or_WBOUefj4s7utS z9tG<%4|ezThPNGObtB{;3lid93QF{b#Zvf1GGPk7HmEj9Kv#KY(=_%|{6&#U&;B z?P7pi>jNY95yPFS+Iwy^_lWP|OXkM$m$5y?J{(G=`p961cSk_z1+ZjoRq%MUUN!JZ z&UUQ|$HX9+=S-GEwHEG_KDK8sEcxeCmnN*K2p?6Bjjpgj_9D0FIk`H9Sk*2cr!J#z z4*MTPyYH3eQb{pUDJKu9aPNL6t9x|vk8-#nXm?IW=MyaBs5-;DOOCkJ21Pq-6$(}N zPMW)QcFA08ERRl^STL^#HT&hS$zpq!9g_g)cx=SFE9<3KbjB1y|HY_c<1BB(JOh%9 z(@lcQC~lWQ{LK=)%b3wbiFzsyh1vG!IeV`^Ze(+kPy=}3Koay{PUsUKhNOa(Bw}{ z3e--arOdS+VnX~w;=sgP@&P_d06%lqf~HLL!GL1>ccJ8`w6ua zk2N0oPs|>y{p^k3i7$w@pBjZZv0Q$Gv7}vcp!GHWW@ah|0%@t}I5A_Fl9alPy2>SF zZ~dVc@2qveG<4H#B!Vx(7e2HoGmXO7pKifQ86%cmfZfy{VTcdekv?NG^s^gu2D9kECIRuj51626;VE+EN3@Ny^>7$OTqHVo+^uk{vT0!CyTOh z?`T*{=yyS_6JxvSq#7dR@;zMfBv>W{1@$tU4@sTyRjN7s6*Vyz{VYyCG3nmMivTYL zUv?=g$Xb>`L!z06S(%rW6bBYa`ab!O(&&K)aWnlg>-hkvA{j>Mkhh#h?cs6B!VBc7 z9SlPqy?3^6!rzNPMmk+HxUhOt9^182wDu~Nxxb|+=mS22G*B-TPHBRfU#x?h-K+^U z=`NENJvFtSZ4k2G0N*_^)C{7^kv2>G+N|^)hhsG(ILtF8Hi-IX+ty$~aYkKfF;NA_ zK=&5X41X$ux}+2S$4gaEIy@t_h;JR6KcTCIMo3c4Uq(pBJkLET#F`>Rl+DXkjbq9$ zV-Brgw+@=J=O<8*wDBy?;)X?NKPH-kxzaPNi^jiO<0yObPi%Ifu@yVzbvXX|1UshF z3xMpsJzx|#?ylHDjg2ad%Em2?TKXYoxbQZA) zhIFO+^V0{0;{V)}i{X{FrR>r9gp^4>)7&t|UpGy-?z~i{7PtqKve4%5^1g~uK*8UE zM+VM~!t{H}K~Hg=U4h5+u5VA%jOzs_^-g%;ga>bTZ=mLk@}V4_`@K`n}Gl zqO3wHGHyTHEWS=imvfnQ@@3l%kKLVYzW8F(cD9hKP!2Mk%u|jYbe1m1!r)mCf(zCB=exct3QA*2Y+brQE8j9@k z>}1mp`2b3IBs_whU*wa^_gpBZw8)6cjpWedsP<%=dYJXtUwrEyOf+=geqCkU;FiIj z;X?pxkys7=oDXG(0ciW49>wVAo~9aeF=ZxSuA89pqav6M*AVjUhfxj~d+diS*I;YH zGVT6o)eItc?sw3fDxE`TwpyRkSC2b4eVs)=WhG~YP0|%9#KK6QR#Fttq*$kewnD|< z@vPsd&5Ph&M;Fsu7b71XY#Dhc9RkiQLQuZ%iQqQJaeOwL;;h6Iwy8_ybnGjoD6M>} z@QLhZr6!S!JeDhKtkY=TC(9h2;xyp|Lana9Pun0^6aeUetFrUJ%an048z<}fP$Us7 zl(r%97qc?QIx`#Q5nBZ(lS_OQn>jVIP@@w6GhROZ4N?a%Cp}K7Ub&t>jvoBHMAckc zsbd{GsBFZ}l2n#q%5g2pdR6s?do#-@Y9XvNB9+!3h%!skfPCDSK1x-TU)f-H~9dl6HWUn!F=`m zWrMV<90m0oC(eWJ2Xvt}>28Fj5w+1F^G#t3VTFSK`@0v9_jBoOTNBI=Ht+p!ad32P zox61jj@#LSUJqV~ro7p|SBPX%bq*_T+u+*9F-s!4oP~of#;@Ze5W%zcE{;2!(V3ew z@o^33U&;tq!}`o9Wq5lNj_s@6Sfo(h-pL8M(+udd0G)hJ}|H?Go# zpL7;of>1(IobjYnToP*$UboMEStxnpCSR~!-U!1lOk@A%@r4Os6eTlW@hQLBzZgv} z3p8zZPivLBZc(V*kSN;6uV&>gUS-;Zy&&~S;a6(>yhXVbOtNWyG*Iki9(@T4NIX+M z3BWFh*wRho5eUlBnqK9LTYW+IrJcUSR1LYTMy7eD-+oTqf0wE(j+!!g8#T(Ox%3^; z)Qg-7OZUrmr41ID?!U7Iuy72s$Dy^7?3bXn6WQ z+ju?_0y_vQn1&Ul_q^}-0;TkZq;-88$+g%!y>>hgfLsFj4k15Eh)j{TNJj5=l_a?U z`TOh89G1f!?Tbe$I5pMJ`C2cN?pKu?>-;)z3VH^~S;h}QLo zgt)NmPX+i7u?uw?HsT*sR!G;uc39)Z>MR;?Pk2|b#^gha>=FsWHR`HgW#GrbM$l91 zyV2-p_=uej26|r~gOm^|ZMF{lse$ptE|kDuY6jinx_lo-$-Fjm1B$*l{cE&M8muXO z-w*lgmhFr4l?5olX&*|D1}EZElnU}ECY;R?dm8iQrTndXtNl{WxSeo3Z$2WS3r2DJ z4C)qx;`cJ!VkUd3BXV}oxzQqpA;^n%jLfK%;^xl()C9BZ4n1*cQ$$rBfiKO15P-h= zIv3n|mtYK9-3tFsAtJ$7P?d0pUu}F|^}8N2^+J+_rehExyahB<3tUTXl>lUEtH zUymhbhRb<|(lW-@83J+2c{sA@OBY*M%rRwg5Rp`c1-5s;0WEZ z4uek$Z~|*lWDmo#IQ@5xQ=g>>%>G&mf+PdM;174`Idb)*(t?AcnJ|{`>}%#D@V5|x zB-Z{@2FF&7ia)RRpU|<)74rOM(Dr;bbc1qA>+?=l87-gYI5kUa(&N$!o&t^u3oqVP zXF#=HgJial5AWw)LS7bkSAo;@8~ho&L)|LfC&RwS<<&3cLnN$V@z;PexTZ|_K2O7M zNfb@_Ws7s3QI(&^ zW4B59^_}Z+p+kfV8%JvNSMz4Bg57zu^gyb8w<*Mv6xpAAr_C{M8Fvo|^ZAM;_k5PB z(12Yoj6CQhBYjLIskJo z-j~OpDnWkCIec`1EjTr4$yZI3&J79;(JPxq>EdzMc7`yA#L7+fV3Kc($;SZ)UbXArsB)2 zrP_Tdpq!r>jq+69&lF|Q&LxO8h99dBCd9;cr#H7bYD+POiVr*_IoXSr_2t$fxVM>9 zqD?~Godw2i`)0Tkm-l71+Z?0@KWf``*nv(uGou9pazr@)f*2ylAEwnh82l+(>VHM4 zX87%=elFtUm-ue-g{Ui-L9D>4DuFlZXu-Fy{=#xyI3t4M>~q$>@$XQf?S)@D&Z zQpb;=0w!Ygt^)92-Is#_Zr@iC?A z?M!rJYF-FuL9<>8eK6y<2Fu*niRrMfA765^bFYayGn~K9INTpyT)@?}v#X8?%^$}q z2kv%8ODvaGN70PAcef5~O$TlsmFG@8ITlP%7FB6V8cTWpah)~k^!YR8m+=&&9DWJS zwSWht&2G2bT_>WCf~*ChHMzDV5u)uh+Vxc}&D=&Q-OJ7H!0q%dnQq8(o%P%dgI!gk zRwfbL_-nh9{XJjx@4uSS%c^g^CT7vwC#@Un-^>hV zzNWqwlk6`RmJQBd%oH#*(5jp^X~M1l6o*6~uk>U~&H^nmt5)etTQ|*9;+pM$ZsY|pz_7+&ddDovK`?Rq-Z1icd!*d6c z!_2S+r=y9FW!PZx&}AV0P=#vEr1o9rG0)fFo!eWV2~rZ%qM=(cUhQ}GqMGRT2f+STU8C$~2-bx@%)X8YqjgrpIlP!~^wQ#Ap6uH0uiXFevo)`+_UGPrO|M+S^*H61Kl)VD-}AdB-502x zai?7iZc0nj4`E6|w4fa0CQ@c;F|(S#2iRww)6yvvK(hJaSW)@0jW4P?hrlk2lNrB9 z!~JARR5(vHq+E7|XP+3u4->MK0wjOJN}la9m-0ynjdo79%3WUZq(1KfjH{I#jVn>7 zR|>7FrCBGe6j>8*?DWWuO*Sv4G-gB8Tx0I&@grtVWRjU`lbdqK=qDfEP0l`Yr84(o zNwY_m6x zzhDp_#rq)s5|umJsgF#`?>5pm7v=iAs^}*Y(c&YnrQWree#rilRMs`9k>Sr*l^>?P z2WZDF2rPfCUgPw!EIJ5(D0qQR5ZyT%Jba37R5|^(Nfv;Oe?)foa0w44(PZWMJ*u-t zLr%8Ls^}@Kj2DupRZ|dq>57*|VLzcdPPDibSsTPIy$W2*@0qfR2RNZ3qWyOy05RCJWF@8rm!N5&0s*vD?a8q-BV+$Iw_TtF^w&LuXXl0|b#! zNRVAbe%@FpC4V)+0jS-sDe+W+u}b9Z8|mmpEJXthPWV{;rRCzgP&NR8O)hJB4&sBY z{chv!_LMTye3d|+pF(H6eN+d!UXHrBSha(xdud(*<2J73ZwZI+;UHl;?p!6I)npa@ zud8=VFk8!n#7j0Q{MDhqCZ+RJk~iaT+@(JNhE+=CsD!9tF@Fc4?Lk+x6?vCMN?+au zvH7fM#c{|bjQXGJ_VH|M^b1f5w70pP+|pBMEMAxazI=$WWT?*Yh&r~m7dyPtgd~S7 zT}e~Y3J?*m1M8jBLq&+rJLqJrvnf;#kRh+_t>3oXCu-}t=Wkiti_())59%|QH8F{U zJ?paDG7jc;_t4(}9PENAvXj`_5^RWv0yXMy^5PbO``yw>Sj@_cIzH#dWPD#}V1G^* zwKZxs9N8j)Rg~+hmHG|c((;w6^bk;@+PI10GBcGOPg?XqQ4SNwZBS`K)Ch;erPylp zK%}(XWomp<^tUr#cn#QmqcOV>Q^YuQK^L$`620U>QS2b9C4SBk=R-pP!6`u>eX=7) zAF{I5plQDzd-(h78pJZ2dfKc+<#`|Qv%!b~^`NR;b#N$}UsiyQ z)6%)@!spqOV7UVroQ0>+qYvmK3Qj+vy5**z#i=m>1uuCq9Lx?we$Ca3 zrIBdVZL@lW4grUZinQIv21Hi-tKOu{ns;%VGo=6>EQS(A%h$nL-vwf^0B z6GAnlmaAEnlb5FSXTY+X*eU~~-(&AiX+;R`x9@shrnvBF;iOtso^&saxcxFzg7p z0jBvqsS6AV^SS>5tXUx*N4`*Y_vQI}4cPqb#FFmM+(k(+p-}Hw-HUj=U#Rw;j?F$7 zocv{oeW};^yDq8f(LRzrB#nXXv-DC&$9>G7d0$eY>}q(|A9hK?7Md*fE1%GQ-pul@ zc+Jf1x3{IK$XopF98#7mp3xWnc!C=Fi#y_|{=a*A79qhb)hTC8n%hP=an4I~(V20f zd-DCMD97zw@RH?b3;Vpccb2Cz(wJ6LjM+v-kzXO|4R#LwdoO~H>C`=HbL;Kjyb{;E zLLuK}p4EH#ULxUdgT#Lt_^1r{W#7G3pnh2?d|t8-ux4QTfajd(qjv&{%K<9 zm*>$BjvPgDBQ8y{&XOc!Mi$J?<}iCQG1(InJ{~(CA|EnARb$WA-yLill?U-} z-f^Kjl{T}DpZk_x_*d9m6carjLDn5-zRa^IZgFe~-1o6R3M%g9A4>BsmewD~I_g7S zI6=$RTs0nbdk~0*cRC^W?-L{Bb)hj%jc>iAo5fU`>@iZ@4?6efShR{hbcJm`Rop13j{TpxLiGpU$Y&?MR9#w} zM<#p)?=nJdgUf|xY-1e6URpVkR2z(BvBV2!5%HU~4-f4myBkAaIS&@kIu(u)isCSqY5ze9nBCr44~fE?jlV_UC(Jhfn@y zHj644!g?T^#n2&0f9?LyXyW`@s?@4+z;`tny>h7;a_Q~w=sZTVsxQ1?WmF*CYR&a= zD}TyyhV+~8)7++|uJZW02@JmFA!j!`A>*+7>ImVp$Nlorje&8EXH;bSR(}roAMVu# zJbP?U=dS9+thEGz(h&t?n{E8^%toQ=T+x=frx=0%sq}Z3$o zuUp64am+v(#K32+)L>?=n@fxQGA9)qrMosGSC2R1BfID*y5_nlmRVIb{rIXBul{|6 zV54^F3T2c_`{JGZ=}(j(*i(4I8)cDQVPhmV7I3`wC}O1=9clNebDc`57gPtK(0puN zo?eP$($IcvQsz=|a6bC2+7*CH@v3XGyyDeA#{@=(joL{2^Tx~bZp3}{T!8e#EP{L^ zWW?hUEpUU`vQ}>n)OPDY6&k>$N3a?2&W4$HQ1ZR|R2oVsg3r48$L9X*dqLj52VM#k zu{=jsWvD&Y`c)r8a;UOcaoiGZE2Ossk%+Gu6(NgX=UtVfMpu=EM1|X=gCmvf*GW0g z`lfE}r<+fWpp}V~Rus)m39*-zwR6@h+fdK zu`2`jGGbx$12u7CXe<}CzPaIIZ%AhZWZ5i>aPJ&~(kWxvZK0LFc?p36WfAO;4lbKN zynb5B&mW~T` zmJ0(w%a)$4LC8Nd-ZLBaZ@t*DdI{YMi!DD~MEhD~rtAM%hF)%!7F`9KvwE*(x&6NU zN8GZn%=9a-%ZaR9W>@i^_KA@G?1rg29b;-ww>=%g;S_!I&ssNH05NnB8$I<4%enfp f#`6D)bH^-YnOtcgDwF$YQAE>F(NeBaw21gW59Nb_ literal 0 HcmV?d00001 diff --git a/wp-content/plugins/webp-converter-for-media/changelog.txt b/wp-content/plugins/webp-converter-for-media/changelog.txt new file mode 100755 index 00000000..95b129f8 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/changelog.txt @@ -0,0 +1,702 @@ +== Changelog == + += 6.3.2 (2025-11-24) = +* `[Added]` Support for WordPress 6.9 + += 6.3.1 (2025-11-09) = +* `[Fixed]` Support for Bunny CDN and BunnyCDN plugin +* `[Fixed]` Support for QUIC.cloud CDN + += 6.3.0 (2025-10-28) = +* `[Changed]` Message about rewrites_uploads_blocked server configuration error +* `[Added]` Support for WordPress 6.9 + += 6.2.4 (2025-09-09) = +* `[Fixed]` Deprecated notice for implicitly nullable parameter when converting images + += 6.2.3 (2025-09-02) = +* `[Fixed]` Unknown error when converting images when file is unavailable or file size verification failed + += 6.2.2 (2025-04-29) = +* `[Security]` Update of Axios HTTP client + += 6.2.1 (2025-04-01) = +* `[Fixed]` Handling of excluded directories when uploading new images +* `[Added]` Error detection of required functions in disable_functions list in PHP configuration +* `[Added]` Support for WordPress 6.8 + += 6.2.0 (2024-12-18) = +* `[Changed]` Minimum required PHP version from 7.0 to 7.1 +* `[Added]` Compatibility with PHP 8.4 + += 6.1.3 (2024-11-19) = +* `[Fixed]` Translations in command registration for WP-CLI +* `[Added]` Support for WordPress 6.7 + += 6.1.2 (2024-10-26) = +* `[Fixed]` Removing converted files after uninstalling plugin + += 6.1.1 (2024-10-02) = +* `[Changed]` Bulk Optimization of Images section + += 6.1.0 (2024-09-13) = +* `[Removed]` Filter `webpc_supported_source_directory` +* `[Fixed]` Handling of excluded directories when uploading new images +* `[Fixed]` Handling of excluded filenames when uploading new images +* `[Fixed]` Adding support for custom directories using webpc_source_directories filter +* `[Fixed]` Verification of rewrites_not_working server configuration error when HTTP referer is required + += 6.0.0 (2024-08-28) = +* `[Fixed]` Generating statistics on plugin settings page when WebP format is unchecked +* `[Fixed]` Restoring original images in Media Library +* `[Changed]` Optimization statistics in Media Library +* `[Added]` Warnings with explanations in plugin settings field: Image loading mode + += 5.13.1 (2024-08-04) = +* `[Changed]` Optimization statistics in Media Library + += 5.13.0 (2024-06-27) = +* `[Fixed]` Filter `webpc_option_quality_levels` to change conversion quality levels +* `[Added]` Support for WordPress 6.6 + += 5.12.5 (2024-04-15) = +* `[Fixed]` Modification of plugin settings via filters + += 5.12.4 (2024-04-12) = +* `[Fixed]` Support for changed upload directory path based on absolute path from upload_path option +* `[Fixed]` UX of plugin settings page +* `[Changed]` Error message for rewrites_not_executed error in server configuration + += 5.12.3 (2024-03-19) = +* `[Fixed]` Support for changed upload directory path based on upload_path option + += 5.12.2 (2024-03-14) = +* `[Changed]` Verification of rewrites_not_executed server configuration error +* `[Added]` Support for changed upload directory path based on upload_path option +* `[Added]` Support for WordPress 6.5 + += 5.12.1 (2024-02-15) = +* `[Fixed]` Verification of rewrites_not_executed server configuration error when there is also a problem with the Gd or Imagick libraries +* `[Changed]` Error message for bypassing_apache error in server configuration +* `[Added]` Possibility to add directory paths in the Excluded directories field in Advanced Settings + += 5.12.0 (2024-01-18) = +* `[Changed]` Statistics about bulk optimization process +* `[Added]` Expert settings to overwrite paths for rewrite rules +* `[Added]` Improvement in verifying operation of redirections + += 5.11.5 (2023-12-07) = +* `[Added]` Compatibility with PHP 8.3 +* `[Changed]` Error message for rewrites_not_executed error in server configuration +* `[Changed]` Error message for bypassing_apache error in server configuration + += 5.11.4 (2023-11-13) = +* `[Fixed]` Removing WebP files converted for AVIF format from /uploads-webpc directory after uninstalling plugin +* `[Fixed]` Statistics of conversion progress in WP-CLI +* `[Changed]` Error message for rewrites_not_executed error in server configuration +* `[Changed]` Error message for bypassing_apache error in server configuration +* `[Changed]` Error message for rewrites_cached error in server configuration + += 5.11.3 (2023-11-09) = +* `[Fixed]` Automatically conversion of images from /uploads directory, but not from Media Library +* `[Added]` Support for WordPress 6.4 + += 5.11.2 (2023-10-16) = +* `[Added]` Button to expand/collapse list of directories to optimize in Bulk Optimization of Images section +* `[Added]` Notification about plugin requirements in WordPress Playground environment + += 5.11.1 (2023-10-02) = +* `[Fixed]` Duplicated rewrite rules for .jpeg files +* `[Changed]` Error message for rewrites_not_executed error in server configuration + += 5.11.0 (2023-09-27) = +* `[Added]` Ability to manually optimize selected images in Media Library +* `[Added]` Ability to manually undo optimization of selected images in Media Library + += 5.10.1 (2023-09-10) = +* `[Fixed]` Detection of bypassing_apache error in server configuration + += 5.10.0 (2023-09-09) = +* `[Fixed]` Removing files from /uploads-webpc directory after uninstalling plugin +* `[Changed]` Error message for rewrites_not_working error in server configuration +* `[Changed]` Verification of correct operation of rewrites from .htaccess file +* `[Added]` Changes to improve performance of plugin +* `[Added]` Changes to improve loading time of plugin settings + += 5.9.6 (2023-08-25) = +* `[Changed]` Maximum weight of supported files from 25 MB to 32 MB +* `[Added]` Displaying image in its original format by adding "?original" suffix to image URL +* `[Added]` Removing converted WebP files after deleting WebP format from "Supported output formats" list + += 5.9.5 (2023-07-31) = +* `[Changed]` Error message for bypassing_apache error in server configuration +* `[Added]` Clearing Cloudflare cache when activating and deactivating plugin + += 5.9.4 (2023-07-12) = +* `[Added]` Support for Bunny CDN and BunnyCDN plugin +* `[Added]` Support for WordPress 6.3 + += 5.9.3 (2023-07-04) = +* `[Fixed]` Corrupted filenames in image URLs using Bypassing Nginx loading mode + += 5.9.2 (2023-07-03) = +* `[Fixed]` Suffix "-optimized" in image URLs using Bypassing Nginx loading mode +* `[Fixed]` Right-to-left styling of plugin settings page +* `[Added]` Error message when using WP-CLI when Conversion method is not available + += 5.9.1 (2023-05-24) = +* `[Changed]` Error message for rewrites_not_executed error in server configuration + += 5.9.0 (2023-05-20) = +* `[Fixed]` Conversion of images in WP-CLI using force flag +* `[Changed]` Error messages on plugin settings page +* `[Added]` Skipping backup files generated by other image optimization plugins + += 5.8.6 (2023-04-29) = +* `[Fixed]` Generating XML files using Pass Thru loading mode + += 5.8.5 (2023-04-07) = +* `[Added]` Skipping .jpg.webp, .jpeg.webp, .png.webp, and .gif.webp files generated by other image optimization plugins +* `[Added]` New parameter (to force reconversion) for webpc_convert_paths hook +* `[Added]` New parameter (to force reconversion) for webpc_convert_attachment hook + += 5.8.4 (2023-03-20) = +* `[Fixed]` Generating rules in .htaccess file when real DOCUMENT_ROOT path is different from WordPress root directory + += 5.8.3 (2023-03-09) = +* `[Fixed]` Converting images without EXIF data support using GD method +* `[Added]` Exception for blocked REST API endpoints by JWT Auth plugin + += 5.8.2 (2023-03-02) = +* `[Changed]` Written content in plugin settings +* `[Added]` Support for WordPress 6.2 + += 5.8.1 (2023-02-27) = +* `[Fixed]` Converting using GD method without `exif_read_data` function available +* `[Fixed]` Redirects of images using Bypassing Nginx loading mode + += 5.8.0 (2023-02-20) = +* `[Fixed]` Generating output paths in WordPress Multisite Network +* `[Fixed]` Replacing URLs in Pass Thru loading mode for themes without get_header hook +* `[Changed]` Automatic clearing of cache generated by LiteSpeed Cache plugin +* `[Changed]` Error message for bypassing_apache error in server configuration +* `[Added]` Image loading mode: `Bypassing Nginx` (use when you have a problem with the bypassing_apache error) +* `[Added]` Support for defined /uploads directory using UPLOADS constant +* `[Added]` Support for Orientation parameter in EXIF data +* `[Added]` Automatic clearing of cache generated by Breeze plugin +* `[Added]` Automatic clearing of cache generated by Cache Enabler plugin +* `[Added]` Automatic clearing of cache generated by Hummingbird plugin +* `[Added]` Automatic clearing of cache generated by SiteGround Optimizer plugin +* `[Added]` Automatic clearing of cache generated by W3 Total Cache plugin +* `[Added]` Automatic clearing of cache generated by WP Fastest Cache plugin +* `[Added]` Automatic clearing of cache generated by WP-Optimize plugin +* `[Added]` Automatic clearing of cache generated by WP Super Cache plugin +* `[Added]` Support for defined value of WP_HOME for testing rewrites + += 5.7.1 (2023-02-04) = +* `[Changed]` Verification of rewrites_not_executed server configuration error + += 5.7.0 (2023-02-01) = +* `[Fixed]` Compatibility with PHP 8.2 +* `[Changed]` Layout of settings in Advanced Settings tab +* `[Added]` Error detection of blocked rewrites for images from /uploads directory +* `[Added]` Exception for blocked REST API endpoints by external plugins + += 5.6.4 (2023-01-21) = +* `[Fixed]` Error detection of cached redirects of images to WebP files + += 5.6.3 (2023-01-10) = +* `[Changed]` Error message for bypassing_apache error in server configuration +* `[Changed]` Error message for rewrites_not_executed error in server configuration +* `[Changed]` Error message for rewrites_cached error in server configuration +* `[Changed]` Error message for rewrites_not_working error in server configuration +* `[Changed]` Error message for token_invalid error in server configuration +* `[Changed]` Error message for token_limit error in server configuration + += 5.6.2 (2023-01-05) = +* `[Changed]` List of extra features in Advanced settings +* `[Changed]` Notification about Cloudflare cache +* `[Added]` Ability to disable exclusion of converted images in backups generated by other plugins +* `[Added]` Error message for incorrect configuration of Cloudflare CDN cache +* `[Added]` Warning about unconverted images when deactivating plugin +* `[Added]` Warning when forcing all images to be reconverted + += 5.6.1 (2022-12-28) = +* `[Fixed]` No support for .jpeg files in default plugin settings +* `[Added]` Ability to auto clear Cloudflare CDN cache (beta version) + += 5.6.0 (2022-12-21) = +* `[Added]` Ability to convert images from /cache directory +* `[Added]` Automatic cleaning of LiteSpeed Cache +* `[Added]` Exception for blocked REST API endpoints by Disable REST API plugin +* `[Added]` Exception for blocked REST API endpoints by Disable WP REST API plugin +* `[Added]` Exception for blocked REST API endpoints by WordPress REST API Authentication plugin + += 5.5.1 (2022-11-29) = +* `[Fixed]` Cache for REST API responses using LiteSpeed Cache plugin +* `[Changed]` Authorization method for REST API endpoints + += 5.5.0 (2022-11-22) = +* `[Removed]` Error logging to debug.log file +* `[Changed]` Content of welcome notice after plugin installation +* `[Added]` Exclusion of directories from converting images in plugin settings +* `[Added]` Instruction in "Conversion strategy" field in plugin settings +* `[Added]` Possibility to disable rewrite inheritance in .htaccess files in plugin settings + += 5.4.2 (2022-11-14) = +* `[Added]` Possibility to re-convert files that have not been successfully converted (service mode must be active) + += 5.4.1 (2022-11-13) = +* `[Fixed]` Forcing images larger than original to be re-converted + += 5.4.0 (2022-11-12) = +* `[Fixed]` Converting using a Remote server when response is empty +* `[Changed]` URLs for REST API endpoints +* `[Added]` Conversion of missing images after selecting "Automatic removal of files in output formats larger than original" option +* `[Added]` Exclusion of files conversion from /wpmc-trash directory generated by Media Cleaner plugin +* `[Added]` Exclusion of files conversion from /__MACOSX directory + += 5.3.1 (2022-10-12) = +* `[Added]` Error handling while connecting to REST API + += 5.3.0 (2022-10-11) = +* `[Removed]` Action `webpc_convert_dir` +* `[Removed]` Filter `webpc_dir_files` +* `[Fixed]` Support for WordPress older than version 5.3 +* `[Added]` List of files for optimization in tree form +* `[Added]` Handling unknown errors while converting with Imagick method + += 5.2.4 (2022-09-27) = +* `[Changed]` Messages displayed during bulk optimization of images +* `[Added]` Debug information about registered image sub-sizes + += 5.2.3 (2022-09-23) = +* `[Added]` Debug information about disabled functions + += 5.2.2 (2022-09-15) = +* `[Fixed]` Closing of admin notice + += 5.2.1 (2022-09-14) = +* `[Fixed]` Deleting converted files during plugin uninstallation + += 5.2.0 (2022-09-10) = +* `[Fixed]` Re-conversion of images modified after previous conversion +* `[Added]` Optimization statistics in Media Upload Popup +* `[Added]` Filter `webpc_source_directories` to add support for custom directories + += 5.1.0 (2022-08-28) = +* `[Fixed]` Exclusion of converted files from backup generated by UpdraftPlus plugin +* `[Added]` Optimization statistics in Media Library + += 5.0.1 (2022-08-26) = +* `[Removed]` Filter `webpc_uploads_prefix` +* `[Fixed]` Calculating number of images to convert in WP-CLI +* `[Fixed]` Converting files that contain plus sign in filename +* `[Changed]` Notification asking to clear cache for LiteSpeed +* `[Added]` Exclusion of converted files from backup generated by All-in-One WP Migration plugin +* `[Added]` Exclusion of converted files from backup generated by UpdraftPlus plugin +* `[Added]` Exclusion of converted files from backup generated by BackWPup plugin + += 5.0.0 (2022-08-20) = +* `[Changed]` Information about plugin operation and technical support on plugin settings page +* `[Changed]` Labels of options in plugin settings +* `[Changed]` Option field for configuration of quality level +* `[Changed]` Widget for conversion process +* `[Added]` Filter `webpc_htaccess_cache_control_private` to disable Cache-Control as private +* `[Added]` Statistics on number of converted images +* `[Added]` Tabs for plugin settings + += 4.5.1 (2022-07-22) = +* `[Removed]` Notification asking to clear cache for Cloudways +* `[Changed]` Error message for bypassing_apache error in server configuration + += 4.5.0 (2022-07-15) = +* `[Changed]` Plugin name from "WebP Converter to Media" to "Converter for Media" +* `[Removed]` "Browser Caching for files in output formats" option in plugin settings (will be active always) +* `[Removed]` "Force redirections to output formats for all domains" option in plugin settings (will be active always) +* `[Fixed]` Error handling about unreadable source or output path +* `[Changed]` Error message for bypassing_apache error in server configuration +* `[Changed]` Error message for rewrites_not_executed error in server configuration +* `[Added]` Limit of 3 attempts to image regeneration to avoid infinity loops +* `[Added]` Debug information about saved plugin data +* `[Added]` Notification asking to clear cache for Cloudways +* `[Added]` Action `webpc_after_conversion` to operation on output path after image conversion +* `[Added]` Filter `webpc_htaccess_mod_rewrite_inherit` to disable mod_rewrite inheritance +* `[Added]` Filter `webpc_htaccess_mod_rewrite_referer` to disable redirections to output formats for other domains + += 4.4.1 (2022-06-30) = +* `[Added]` Inheritance of mod_rewrite rules from parent directories +* `[Added]` Support for custom /wp-content directory name + += 4.4.0 (2022-06-19) = +* `[Changed]` Calculation of number of images to be converted +* `[Added]` Resizing of images before conversion +* `[Added]` Notification asking to clear cache for LiteSpeed + += 4.3.6 (2022-06-03) = +* `[Fixed]` Notification about Cloudflare cache + += 4.3.5 (2022-06-02) = +* `[Changed]` Generating rewrite rules for via .htaccess loading mode (applies to rewrites_not_working server configuration error) + += 4.3.4 (2022-05-10) = +* `[Changed]` Generating rewrite rules for via .htaccess loading mode (applies to rewrites_not_working server configuration error) +* `[Changed]` Message about rewrites_not_executed server configuration error + += 4.3.3 (2022-05-08) = +* `[Fixed]` Calculation of number of images to be converted +* `[Added]` Filter `webpc_option_quality_levels` to change conversion quality levels + += 4.3.2 (2022-04-20) = +* `[Added]` Conversion skip for animated GIF images +* `[Added]` New information about status of image conversion +* `[Added]` Ability to convert only to AVIF format + += 4.3.1 (2022-04-05) = +* `[Fixed]` Generating rewrite rules for via .htaccess loading mode + += 4.3.0 (2022-04-01) = +* `[Fixed]` Authorization of access to REST API +* `[Changed]` Description of plugin operation in plugin settings +* `[Added]` Command "wp webp-converter calculate" for WP-CLI +* `[Added]` Command "wp webp-converter regenerate" for WP-CLI +* `[Added]` Converting .webp files to AVIF format +* `[Added]` Support for environments where DOCUMENT_ROOT is different from WordPress installation directory + += 4.2.4 (2022-03-01) = +* `[Fixed]` Generating paths for via .htaccess loading mode + += 4.2.3 (2022-02-27) = +* `[Fixed]` Closing of admin notice + += 4.2.2 (2022-02-21) = +* `[Changed]` Error message for bypassing_apache error in server configuration +* `[Added]` Automatic continuation of conversion process after connection lost +* `[Added]` ICC/ICM profile support for conversion using Imagick +* `[Added]` Notification asking to clear cache for Cloudflare + += 4.2.1 (2022-02-17) = +* `[Fixed]` Cache settings for .htaccess rewrites +* `[Added]` Limit for error messages displayed while converting +* `[Added]` Support for plain permalink structure + += 4.2.0 (2022-02-13) = +* `[Removed]` Action `webpc_regenerate_all` +* `[Fixed]` Issue with plugin settings after changing Gd or Imagick library configuration +* `[Fixed]` Server configuration error detection when cURL is disabled +* `[Fixed]` URL for the server configuration tab +* `[Changed]` Automatically conversion of images after upload +* `[Changed]` Automatically conversion of images from outside the Media Library +* `[Changed]` Message for conversion error when converted file is larger than original +* `[Added]` List of allowed file extensions for cache rules in .htaccess file +* `[Added]` Status of automatic image conversion on the top bar in the WordPress Dashboard +* `[Added]` Debug information about plugin settings + += 4.1.2 (2022-01-29) = +* `[Fixed]` Validation of authorization token when images regeneration +* `[Fixed]` Validation of loaded images using Pass Thru method + += 4.1.1 (2022-01-19) = +* `[Fixed]` Loading images with special character in filename using Pass Thru method +* `[Changed]` Error messages on plugin settings page +* `[Added]` Value hiding for access token in plugin settings + += 4.1.0 (2022-01-12) = +* `[Fixed]` Auto-generation of rewrite rules for Multisite Network +* `[Fixed]` Detection of server configuration error related to non-working rewrites +* `[Fixed]` URL validation for Pass Thru loading mode +* `[Fixed]` Verification of supported formats by Imagick +* `[Changed]` Error messages on plugin settings page +* `[Changed]` Styles for plugin settings page +* `[Added]` Debug information about PHP configuration + += 4.0.5 (2022-01-04) = +* `[Changed]` Modal when deactivating plugin + += 4.0.4 (2021-12-30) = +* `[Changed]` Message after successfully completing conversion of images + += 4.0.3 (2021-12-20) = +* `[Security]` Added URL validation for Pass Thru loading mode ([CVE-2021-25074](https://wpscan.com/vulnerability/f3c0a155-9563-4533-97d4-03b9bac83164/)) +* `[Fixed]` Auto-conversion images with unsupported extensions when uploading files +* `[Fixed]` Generating directory paths when ABSPATH constant is invalid + += 4.0.2 (2021-12-17) = +* `[Fixed]` Fetching large list of files to conversion +* `[Fixed]` Rewrites caching for some servers +* `[Changed]` Connection when converting using remote server + += 4.0.1 (2021-12-10) = +* `[Added]` Informational banners on plugin settings page + += 4.0.0 (2021-12-04) = +* `[Added]` Converting images using remote server +* `[Added]` Converting images to AVIF format +* `[Added]` Error detection for invalid permalinks structure + += 3.2.4 (2021-11-21) = +* `[Fixed]` Automatic image conversion when /uploads directory is not organized into monthly and yearly folders +* `[Fixed]` Displaying errors when converting images + += 3.2.3 (2021-10-15) = +* `[Added]` Exclusion of re-converting images that caused regeneration error + += 3.2.2 (2021-09-26) = +* `[Changed]` Option "Force redirections to WebP for all domains" as default +* `[Added]` Debug information for regeneration error + += 3.2.1 (2021-09-12) = +* `[Fixed]` Skipping converted images when converting all images + += 3.2.0 (2021-09-12) = +* `[Removed]` Filter `webpc_files_paths` +* `[Removed]` Filter `webpc_dir_excluded` +* `[Changed]` Error handling when converting images +* `[Added]` Filter `webpc_supported_source_file` to exclude paths to files from converting +* `[Added]` Filter `webpc_supported_source_directory` to exclude paths to directories from converting +* `[Added]` Modifications to appearance of plugin settings page + += 3.1.1 (2021-09-08) = +* `[Fixed]` Generating .htaccess files for multisite websites +* `[Changed]` Fields on plugin settings page +* `[Changed]` Server configuration error detection + += 3.1.0 (2021-09-02) = +* `[Fixed]` Default state of notice displaying +* `[Added]` Error detection for server that does not supports using .htaccess files from custom locations + += 3.0.8 (2021-07-25) = +* `[Fixed]` Compatibility of plugin settings for multisite websites + += 3.0.7 (2021-07-19) = +* `[Added]` Changes to improve performance of plugin + += 3.0.6 (2021-06-20) = +* `[Fixed]` Generating URLs for images using Pass Thru method +* `[Added]` Filter `webpc_passthru_url_nocache` to remove nocache param from URL using Pass Thru method + += 3.0.5 (2021-06-09) = +* `[Fixed]` Handling of filters for changing directory paths +* `[Fixed]` Converting using Imagick method for 100% image quality +* `[Changed]` Default conversion method from Gd to Imagick + += 3.0.4 (2021-05-28) = +* `[Fixed]` Caching rewrites on CDN and Proxy servers + += 3.0.3 (2021-05-22) = +* `[Fixed]` Rewrite rules for via .htaccess loading mode + += 3.0.2 (2021-05-22) = +* `[Fixed]` Rewrite rules for servers where DOCUMENT_ROOT is different from ABSPATH + += 3.0.1 (2021-05-09) = +* `[Fixed]` Filters using for change server paths +* `[Added]` Excluding directories when uploading images to Media Library + += 3.0.0 (2021-05-02) = +* `[Removed]` Filter `webpc_get_values` +* `[Removed]` Filter `webpc_get_options` +* `[Removed]` Filter `webpc_get_methods` +* `[Changed]` Error messages on plugin settings page +* `[Added]` Conversion of images to multiple output formats +* `[Added]` Compatibility with NextGEN Gallery plugin +* `[Added]` Data displayed on "Server configuration" tab on plugin settings page +* `[Added]` Changes to improve performance of plugin + += 2.4.0 (2021-02-28) = +* `[Fixed]` Error detection of redirects without .png as supported file extension +* `[Fixed]` Pass Thru loading mode for servers not supporting `getallheaders()` function +* `[Changed]` Level of error for cached redirects of images to WebP files +* `[Added]` Skip re-converting images that were larger than original after converting to WebP + += 2.3.0 (2021-01-31) = +* `[Fixed]` Encoding paths to files +* `[Fixed]` Retaining PNG transparency using Gd method +* `[Added]` Cron to convert images uploaded to Media Library + += 2.2.0 (2021-01-13) = +* `[Added]` Support for WordPress Multisite + += 2.1.3 (2020-12-28) = +* `[Fixed]` Regex for Pass Thru loading mode + += 2.1.2 (2020-12-27) = +* `[Fixed]` Converting images using Imagick method + += 2.1.1 (2020-12-21) = +* `[Fixed]` Modal when deactivating plugin + += 2.1.0 (2020-12-21) = +* `[Changed]` Structure of conversion methods +* `[Changed]` Structure of error detection methods + += 2.0.1 (2020-12-16) = +* `[Fixed]` Actions initiated after plugin update + += 2.0.0 (2020-12-16) = +* `[Removed]` Filter `webpc_uploads_path` +* `[Removed]` Filter `webpc_uploads_webp` +* `[Removed]` Filter `webpc_uploads_dir` +* `[Removed]` Filter `webpc_uploads_root` +* `[Changed]` Error messages in administration panel +* `[Added]` Image loading mode: `Pass Thru` (without rewrites in .htacces files or Nginx configuration) +* `[Added]` Filter `webpc_dir_name` to change default directory paths +* `[Added]` Filter `webpc_site_root` to change path for root installation directory of WordPress +* `[Added]` Filter `webpc_site_url` to change Site URL of WordPress + += 1.6.0 (2020-12-12) = +* `[Added]` Escaping functions for translated phrases +* `[Added]` Error codes in error messages on plugin settings page +* `[Added]` Modal when deactivating plugin + += 1.5.1 (2020-11-02) = +* `[Changed]` Error messages related to non-working redirects from .htaccess file + += 1.5.0 (2020-10-28) = +* `[Added]` Filter `webpc_files_paths` to modify paths of images to be converted +* `[Added]` Filter `webpc_convert_error` to management of errors content displayed during conversion +* `[Added]` Filter `webpc_convert_errors` to management of errors displayed during conversion + += 1.4.6 (2020-10-23) = +* `[Fixed]` Error detection of non-working redirects without .png as supported file extension + += 1.4.5 (2020-10-19) = +* `[Fixed]` Content for translations + += 1.4.4 (2020-10-18) = +* `[Changed]` Information after conversion process is completed + += 1.4.3 (2020-09-30) = +* `[Changed]` Directory for error detection of non-working redirects of images to WebP files +* `[Changed]` Button for `Server configuration` tab +* `[Added]` Information about error detection in `Server configuration` tab + += 1.4.2 (2020-08-24) = +* `[Fixed]` Cache-Control for redirects of images to WebP files +* `[Added]` Error detection of cached redirects of images to WebP files + += 1.4.1 (2020-08-19) = +* `[Changed]` Error detection method on plugin settings page +* `[Added]` Error detection of non-working redirects of images to WebP files + += 1.4.0 (2020-08-13) = +* `[Security]` Added validation of saved settings values +* `[Removed]` Filter `webpc_notice_url` +* `[Changed]` Error messages for server requirements +* `[Changed]` Loading CSS and JS files only on plugin settings page +* `[Changed]` Minor changes for plugin settings page +* `[Added]` Blocking redirects to WebP when displaying images on other domains +* `[Added]` Cron to automatically regenerate new images outside of Media Library +* `[Added]` Filter `webpc_cron_interval` to change cron interval +* `[Added]` Error message for incorrect plugin settings +* `[Added]` Error when converting when WebP file is larger than original and has been deleted +* `[Added]` Notice after plugin installation with description of first steps +* `[Added]` Option to log errors while converting to debug.log file +* `[Added]` Option to preserve metadata for WebP files *(available for Imagick library)* +* `[Added]` Value of `ABSPATH` in `Server configuration` tab + += 1.3.1 (2020-07-03) = +* `[Fixed]` Text Domain for Internationalization + += 1.3.0 (2020-06-12) = +* `[Removed]` Ability to skip converting existing images when `Regenerate All` +* `[Fixed]` Creating `/uploads-webpc` directory webpc after re-activation plugin +* `[Fixed]` Error message about not supporting old PHP version +* `[Fixed]` Ignoring case sensitivity when verifying image extensions +* `[Changed]` Error messages when converting images +* `[Changed]` New argument for filter `webpc_htaccess_mod_rewrite` and support for multiple .htaccess files +* `[Added]` Converting all images from `/uploads` directory *(also other than from Media Library)*. +* `[Added]` Converting images from `/plugins` directory +* `[Added]` Converting images from `/themes` directory +* `[Added]` Information about used filters in `Server configuration` tab +* `[Added]` Option to force all images to be converted again when `Regenerate All` + += 1.2.7 (2020-06-11) = +* `[Changed]` Moving converted WebP files to `/uploads-webpc/uploads` directory from `/uploads-webpc` directory *(**required manual configuration change for Nginx and WordPress Multisite**)* +* `[Changed]` Validation when converting images + += 1.2.6 (2020-05-28) = +* `[Fixed]` Removal of WebP files larger than original during upload + += 1.2.5 (2020-05-10) = +* `[Removed]` Link to plugin settings on Network Admin Screen for WordPress Multisite +* `[Fixed]` Path in RewriteRule for WordPress Multisite +* `[Changed]` Error messages in administration panel +* `[Added]` Support for `disable_functions` setting for using `set_time_limit` function +* `[Added]` Support for blocked function `file_get_contents` + += 1.2.4 (2020-04-24) = +* `[Changed]` Error messages in administration panel +* `[Added]` Action `webpc_delete_paths` to delete images by paths + += 1.2.3 (2020-04-15) = +* `[Added]` Blocking server cache for rewrite rules +* `[Added]` Detecting whether requests to images are processed by server bypassing Apache + += 1.2.2 (2020-04-08) = +* `[Changed]` Moving rules for modules `mod_mime` and `mod_expires` to `/uploads-webpc/.htaccess` file +* `[Changed]` New argument for filter `webpc_htaccess_rules` with server path of file + += 1.2.1 (2020-04-07) = +* `[Removed]` Filter `webpc_option_disabled` +* `[Fixed]` Converting images multiple times when uploading to Media Library +* `[Added]` Action `webpc_convert_paths` to convert images by paths +* `[Added]` Action `webpc_convert_attachment` to convert images by Post ID + += 1.2.0 (2020-04-05) = +* `[Changed]` Moving rules from .htaccess file in root directory of WordPress to `/wp-content/uploads` directory +* `[Added]` Ability to disable automatic removal of WebP files larger than original +* `[Added]` Error validation for a non-writable .htaccess file +* `[Added]` Filter `webpc_uploads_root` to change path for root installation directory of WordPress + += 1.1.2 (2020-03-03) = +* `[Added]` Zero padding at end for odd-sized WebP files using `GD` library + += 1.1.1 (2020-02-13) = +* `[Changed]` Unknown error handling when converting images +* `[Added]` Ability to skip converting existing images when `Regenerate All` +* `[Added]` Button for simple checking of server configuration + += 1.1.0 (2020-02-10) = +* `[Fixed]` Support for WordPress installation in subdirectory +* `[Fixed]` Error detecting WebP support by Imagick + += 1.0.9 (2020-01-03) = +* `[Added]` Limit of maximum image resolution limit using `GD` library + += 1.0.8 (2019-12-19) = +* `[Fixed]` File deletion for custom paths with converted WebP files +* `[Changed]` Rules management in .htaccess file when activating or deactivating plugin +* `[Added]` Error detection system in server configuration +* `[Added]` Blocking image conversion when `GD` or `Imagick` libraries are unavailable + += 1.0.7 (2019-12-17) = +* `[Changed]` Rewrite rules in .htaccess file +* `[Added]` Custom path support for original uploads files +* `[Added]` Custom path support for saving converted WebP files +* `[Added]` Filter `webpc_uploads_path` to change path for original uploads files +* `[Added]` Filter `webpc_uploads_webp` to change path for saving converted WebP files + += 1.0.6 (2019-11-06) = +* `[Changed]` Way of generating file path _(without `ABSPATH`)_ +* `[Added]` Automatic deletion of converted files larger than original + += 1.0.5 (2019-09-16) = +* `[Added]` Information on available FAQ + += 1.0.4 (2019-07-11) = +* `[Changed]` Limits of maximum execution time + += 1.0.3 (2019-06-26) = +* `[Security]` Fixed CSRF vulnerability when saving plugin settings ([CVE-2019-15834](https://wpscan.com/vulnerability/65483794-f22f-41c7-b286-fd70c38ae160/)) + += 1.0.2 (2019-06-25) = +* `[Changed]` Error messages +* `[Added]` Tab in Settings page about server configuration + += 1.0.1 (2019-06-23) = +* `[Security]` Added permission check for endpoints in REST API +* `[Added]` Error handler for undefined `GD` extension + += 1.0.0 (2019-06-16) = +* The first stable release diff --git a/wp-content/plugins/webp-converter-for-media/includes/passthru.php b/wp-content/plugins/webp-converter-for-media/includes/passthru.php new file mode 100755 index 00000000..d0c1c79d --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/includes/passthru.php @@ -0,0 +1,140 @@ +validate_src_param( $image_url ) ) { + return; + } + + $this->load_converted_image( $image_url ); + } + + private function validate_src_param( string $image_url ): bool { + $url_path = parse_url( $image_url, PHP_URL_PATH ) ?: ''; + $encoded_path = array_map( 'urlencode', explode( '/', $url_path ) ); + $encoded_url = str_replace( $url_path, implode( '/', $encoded_path ), $image_url ); + + if ( filter_var( $encoded_url, FILTER_VALIDATE_URL ) === false ) { + return false; + } + + $image_host = parse_url( $image_url, PHP_URL_HOST ); + if ( $image_host !== ( $_SERVER['HTTP_HOST'] ?? '' ) ) { // phpcs:ignore WordPress.Security + return false; + } + + $image_extension = strtolower( pathinfo( $image_url, PATHINFO_EXTENSION ) ); + if ( ! in_array( $image_extension, [ 'jpg', 'jpeg', 'png', 'gif', 'png2' ] ) ) { + return false; + } + + return true; + } + + /** + * Initializes loading of image in supported output format. + * + * @param string $image_url URL of source image. + * + * @return void + */ + private function load_converted_image( string $image_url ) { + $mime_types = json_decode( self::MIME_TYPES, true ) ?: []; + $headers = array_change_key_case( + array_merge( ( function_exists( 'getallheaders' ) ) ? getallheaders() : [], $_SERVER ), + CASE_UPPER + ); + $accept_header = $headers['ACCEPT'] ?? ( $headers['HTTP_ACCEPT'] ?? '' ); + + foreach ( $mime_types as $extension => $mime_type ) { + if ( ( strpos( $accept_header, $mime_type ) !== false ) + && ( $source = $this->load_image_source( $image_url, $extension ) ) ) { + header( 'Content-Type: ' . $mime_type ); + echo $source; // phpcs:ignore + exit; + } + } + $this->load_image_default( $image_url ); + } + + /** + * Loads image output format. + * + * @param string $image_url URL of source image. + * @param string $extension Extension of output format. + * + * @return string|null Content of image in output format. + */ + private function load_image_source( string $image_url, string $extension ) { + $url = $this->generate_source_url( $image_url, $extension ); + $ch = curl_init( $url ); + if ( $ch === false ) { + return null; + } + + curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false ); + curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 ); + curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); + + $response = curl_exec( $ch ); + $code = curl_getinfo( $ch, CURLINFO_HTTP_CODE ); + curl_close( $ch ); + + if ( ( $code !== 200 ) || ! $response ) { + return null; + } else { + return ( is_string( $response ) ) ? $response : null; + } + } + + /** + * Returns URL of output image by replacing URL of source image. + * + * @param string $image_url URL of source image. + * @param string $extension Extension of output format. + * + * @return string URL of image in output format. + */ + private function generate_source_url( string $image_url, string $extension ): string { + return sprintf( + '%1$s.%2$s', + str_replace( self::PATH_UPLOADS, self::PATH_UPLOADS_WEBP, $image_url ), + $extension + ); + } + + /** + * Redirects to source image. + * + * @param string $image_url URL of source image. + * + * @return void + */ + private function load_image_default( string $image_url ) { + header( 'Location: ' . $image_url ); + } +} + +new PassthruLoader(); diff --git a/wp-content/plugins/webp-converter-for-media/readme.txt b/wp-content/plugins/webp-converter-for-media/readme.txt new file mode 100755 index 00000000..7a4a6a1e --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/readme.txt @@ -0,0 +1,367 @@ +=== Converter for Media - Optimize images | Convert WebP & AVIF === +Contributors: mateuszgbiorczyk +Donate link: https://url.mattplugins.com/converter-readme-donate-link +Tags: convert webp, webp, optimize images, image optimization, compress images +Requires at least: 4.9 +Tested up to: 6.9 +Requires PHP: 7.1 +Stable tag: 6.3.2 +License: GPLv2 or later +License URI: https://www.gnu.org/licenses/gpl-2.0.html + +Speed up your website by using our WebP & AVIF Converter. Optimize images and serve WebP and AVIF images instead of standard formats! + +== Description == + +**Speed up your website using our ease image optimizer by serving WebP and AVIF images.** By replacing files in standard JPEG, PNG and GIF formats with WebP and AVIF formats, you can save over a half of the page weight without losing quality. + +[youtube https://www.youtube.com/watch?v=Ls2h38avpRw] + +After installing the plugin, you can optimize your entire Media Library with a single click — no further action required. When image optimization finishes, every visitor will automatically receive new images with significantly reduced file sizes. + +As of today, over 95% of users use browsers that support the WebP format. The loading time of your website depends to a large extent on its weight and the level of image optimization. **Using our WebP Converter, now you can and speed up it in a few seconds without much effort!** + +This will be a profit both for your users who will not have to download so much data, but also for a server that will be less loaded. Remember that a better optimized website also affects your Google ranking. Image optimization is very important. + +#### AVIF support + +Now in [the PRO version](https://url.mattplugins.com/converter-readme-avif-support-upgrade) you can use AVIF as the output format for your images. The AVIF format is a new extension — is the successor to WebP. **Images converted to the AVIF format weigh about 50% less than images converted only to the WebP format**, while maintaining better image quality. + +Enjoy peace of mind knowing that AVIF is supported by over 90% of browsers. And if any visitor has an older browser, our plugin will automatically fall back to WebP — so every user gets fast, high-quality images without a hitch. + +Unlock the magic of AVIF in our PRO version — [upgrade today](https://url.mattplugins.com/converter-readme-avif-support-upgrade-2) for unparalleled image performance. + +#### How does this work? + +When a browser tries to load an image file, the plugin checks if it supports the AVIF format (if enabled in the plugin settings). If so, the browser will receive the equivalent of the original image in the AVIF format. If it does not support AVIF, but supports the WebP format, the browser will receive the equivalent of the original image in WebP format. In case the browser does not support either WebP or AVIF, the original image is loaded. **This means full support for all browsers.** + +A guide on how to test whether the plugin is working properly can be found [here](https://mattplugins.com/docs/how-to-test-converter-for-media-plugin). + +#### Additional information +- If you have just installed the plugin, you can optimize images with **one click**. Image size will be smaller after generate AVIF and WebP! +- New images that will be added to the Media Library will be converted **automatically**. +- Our image optimizer does not modify your original images in any way. **This means security for you and your files.** Files converted to AVIF and WebP format are saved in a separate directory: /wp-content/uploads-webpc/. +- **You lose nothing** - if you had to remove the plugin, it will remove everything after itself. It does not leave any trace, so you can check it with ease. + +#### Convert WebP and AVIF - it is the future of image optimization! + +Optimize images and raise your website to a new level now! Install the plugin and enjoy the website that loads faster by image optimization. Surely you and your users will appreciate it. + +Converting images to WebP and AVIF simultaneously guarantees the lowest weight of your images and compatibility with all browsers. By using [the AVIF format](https://url.mattplugins.com/converter-readme-both-formats-upgrade) you will reduce the weight of your images even more compared to WebP. + +#### Support for additional directories + +You can convert WebP and AVIF, and optimize images not only from `/uploads` directory but also from `/plugins` and `/themes` directories. This allows full integration with WebP and AVIF formats! + +#### Development of the plugin + +If you love our plugin, [leave a ★★★★★ review on WordPress.org](https://url.mattplugins.com/converter-readme-development-support-review) — it really makes our day and helps others discover it! + +#### Please also read the FAQ below. Thank you for being with us! + +== Installation == + +1. Upload the plugin files to the `/wp-content/plugins/webp-converter-for-media` directory, or install the plugin through the WordPress plugins screen directly. +2. Activate the plugin through the `Plugins` screen in WordPress Admin Panel. +3. Use the `Settings -> Settings -> Converter for Media` screen to configure the plugin. +4. Click on the `Start Bulk Optimization` button and wait. +5. Check if everything works fine using [this tutorial](https://url.mattplugins.com/converter-readme-installation-instruction). + +That's all! Your website is already loading faster! + +== Frequently Asked Questions == + += How can I report security bugs? = + +You can report security bugs through the Patchstack Vulnerability Disclosure Program. The Patchstack team help validate, triage and handle any security vulnerabilities. + +[Report a security vulnerability](https://patchstack.com/database/vdp/webp-converter-for-media) + += How to get technical support? (before you ask for help) = + +Before you add a new thread, **read all other questions in this FAQ and other threads in [the support forum](https://url.mattplugins.com/converter-plugin-faq-technical-support-forum) first**. Perhaps someone had a similar problem and it has been resolved. + +When adding a thread, follow these steps and reply to each of them: + +**1.** Do you have any errors on the plugin settings page? Please read [this thread](https://url.mattplugins.com/converter-plugin-faq-technical-support-error-instruction) if you have any errors. + +**2.** URL of your website. + +**3.** Screenshot of the Help Center tab on the plugin settings screen - please take a screenshot of the ENTIRE page. + +**4.** Please do the test, which is described in the FAQ in the question "How to check if the plugin works?". Please send a screenshot of Devtools with the test results. + +Please remember to include the answers to all questions by adding a thread. It is much easier and accelerates the solution of your problem. + += Configuration for Nginx = + +If you are using a Nginx server that does not support .htaccess rules, additional Nginx server configuration is required for the plugin to work properly. + +Please read [this tutorial](https://url.mattplugins.com/converter-plugin-faq-nginx-configuration-instruction) for more information. + += Configuration for Nginx Proxy = + +If you are using a Nginx server that supports .htaccess rules, but you still have a server configuration error on the plugin settings page, additional Nginx server configuration is required for the plugin to work properly. + +Please read [this tutorial](https://url.mattplugins.com/converter-plugin-faq-nginx-proxy-configuration-instruction) for more information. + += Error on plugin settings screen? = + +If you have an error on the plugin settings screen, first of all, please read it carefully. They are displayed when there is a problem with the configuration of your server or website. + +The messages are designed to reduce the number of support requests that are repeated. It saves your and our time. Please read [this thread](https://url.mattplugins.com/converter-plugin-faq-configuration-error-instruction) for more information. + += Error while converting? = + +You can get several types of errors when converting. First of all, carefully read their content. For the most part, you can solve this problem yourself. Try to do this or contact the server administrator. + +If you get an error: `File "%s" does not exist. Please check file path.` means that the [file_exists()](https://www.php.net/manual/en/function.file-exists.php) function in PHP returned `false` using the file path given in the error message. Check this path and make sure it is correct. + +If you get an error: `File "%s" is unreadable. Please check file permissions.` means that the [is_readable()](https://www.php.net/manual/en/function.is-readable.php) function in PHP returned `false` using the file path given in the error message. Check the permissions for the file and the directory in which the file is located. + +If you get an error: `"%s" is not a valid image file.` means that the file is damaged in some way. Download the file to disk, save it again using any graphics program and add it again to the page. If the error applies to individual images then you can ignore it - just the original images will load, not WebP. + +If you get an error: `Image "%s" converted to .webp is larger than original and converted .webp file has been deleted.` means the original image weighed less than WebP. This happens when images have been compressed before. Disable the *"Automatic removal of files in output formats larger than original"* option in plugin settings to force always using WebP. + += What are requirements of plugin? = + +Practically every hosting meets these requirements. You must use PHP at least 7.0 and have the `GD` or `Imagick` extension installed. **The extension must support `WebP format`.** If you have an error saying that the GD or Imagick library is not installed, but you have it installed then they are probably incorrectly configured and do not have WebP support. + +They are required native PHP extensions, used among others by WordPress to generate thumbnails. Your server must also have the modules `mod_mime`, `mod_rewrite` and `mod_expires` enabled. + +An example of the correct server configuration can be found [here](https://url.mattplugins.com/converter-plugin-faq-plugin-requirements-configuration-image). The link to your current configuration can be found in the Help Center tab on plugin settings screen. + +**Note the items marked in red.** If the values marked in red do not appear in your case, it means that your server does not meet the technical requirements. Pay attention to the **WebP Support** value for the GD library and **WEBP in the list of supported extensions** for the Imagick library. + +In a situation where your server does not meet the technical requirements, please contact your server Administrator. We are not able to help you. Please do not contact us about this matter, because this is a server configuration problem, not a plugin. + +Also, REST API must be enabled and work without additional restrictions. If you have a problem with it, please contact the Developer who created your website. He should easily find the issue with the REST API not working. + += How to check if the plugin works? = + +You can find more information on how the plugin works in [our manual](https://url.mattplugins.com/converter-plugin-faq-plugin-check-instruction). + += How to change the path to uploads? = + +This is possible using the following types of filters to change default paths. It is a solution for advanced users. If you are not, please skip this question. + +Path to the root installation directory of WordPress *(`ABSPATH` by default)*: + +`add_filter( 'webpc_site_root', function( $path ) { + return ABSPATH; +} );` + +Paths to directories *(relative to the root directory)*: + +`add_filter( 'webpc_dir_name', function( $path, $directory ) { + switch ( $directory ) { + case 'uploads': + return 'wp-content/uploads'; + case 'webp': + return 'wp-content/uploads-webpc'; + case 'plugins': + return 'wp-content/plugins'; + case 'themes': + return 'wp-content/themes'; + } + return $path; +}, 10, 2 );` + +**Note that the `/uploads-webpc` directory must be at the same nesting level as the `/uploads`, `/plugins` and `/themes` directories.** + +Prefix in URL of `/wp-content/` directory or equivalent *(used in .htaccess)*: + +`add_filter( 'webpc_htaccess_rewrite_path', function( $prefix ) { + return '/'; +} );` + +For the following sample custom WordPress structure: + +`... +├── web + ... + ├── app + │ ├── mu-plugins + │ ├── plugins + │ ├── themes + │ └── uploads + ├── wp-config.php + ...` + +Use the following filters: + +`add_filter( 'webpc_site_root', function( $path ) { + return 'C:/WAMP/www/project/web'; // your valid path to root +} ); +add_filter( 'webpc_htaccess_rewrite_path', function( $prefix ) { + return '/'; +} ); +add_filter( 'webpc_dir_name', function( $path, $directory ) { + switch ( $directory ) { + case 'uploads': + return 'app/uploads'; + case 'webp': + return 'app/uploads-webpc'; + case 'plugins': + return 'app/plugins'; + case 'themes': + return 'app/themes'; + } + return $path; +}, 10, 2 );` + +After setting the filters go to `Settings -> Converter for Media` in the admin panel and click the `Save Changes` button. `.htaccess` files with appropriate rules should be created in the directories `/uploads` and `/uploads-webpc`. + += How to exclude paths from converting? = + +To exclude selected directories, provide them in the `Excluded directories` field in the Advanced Settings tab in the plugin settings. + +In this field, you can enter a directory name or path. Here are examples: +- `2023` +- `2024/01` +- `2023,2024/01` + +To exclude selected files, use the following filter *(in this case with the suffix "-skipped" in a filename, e.g. image-skipped.png)*: + +`add_filter( 'webpc_supported_source_file', function( bool $status, string $file_name, string $server_path ): bool { + $excluded_suffix = '-skipped'; + if ( strpos( $file_name, $excluded_suffix . '.' ) !== false ) { + return false; + } + return $status; +}, 10, 3 );` + +Argument `$server_path` is the absolute server path to a directory or file. Inside the filters, you can apply more complicated rules as needed. + +Changes to excluded directories and files take effect before images are converted - they do not affect already converted images. These images must be manually removed from the directory: `/wp-content/uploads-webpc/`. + += Support for custom directories = + +The plugin supports the following directories by default: +- `/gallery` +- `/plugins` +- `/themes` +- `/uploads` + +If you want to add support for a custom directory, add the following code to the functions.php file in your theme directory *(use a correct directory name instead of `custom-directory`)*: + +`add_filter( 'webpc_source_directories', function ( $directories ) { + $directories[] = 'custom-directory'; + return $directories; +} );` + +Remember that this directory must be located in the `/wp-content` directory. + += How to run manually conversion? = + +By default, all images are converted when you click on the `Start Bulk Optimization ` button. In addition, conversion is automatic when you add new files to your Media Library. + +Remember that our plugin takes into account images generated by WordPress. There are many plugins that generate, for example, images of a different size or in a different version. + +If you would like to integrate with your plugin, which generates images by yourself, you can do it. Our plugin provides the possibility of this type of integration. This works for all images in the `/wp-content` directory. + +It is a solution for advanced users. If you would like to integrate with another plugin, it's best to contact the author of that plugin and give him information about the actions available in our plugin. This will help you find a solution faster. + +You can manually run converting selected files, you can use the action to which you will pass an array with a list of paths *(they must be absolute server paths)*: + +`do_action( 'webpc_convert_paths', $paths, true );` + +An alternative method is to manually start converting the selected attachment by passing the post ID from the Media Library. Remember to run this action after registering all image sizes *(i.e. after running the `add_image_size` function)*: + +`do_action( 'webpc_convert_attachment', $post_id, true );` + +To delete manually converted files, use the following action, providing as an argument an array of absolute server paths to the files *(this will delete manually converted files)*: + +`do_action( 'webpc_delete_paths', $paths );` + += Support for WP-CLI = + +The plugin supports WP-CLI, which enables faster image conversion from the server level. More information on how to get started with WP-CLI can be found in [the Handbook](https://make.wordpress.org/cli/handbook/guides/quick-start/). The supported commands are described below. + +Checking how many maximum images for conversion are on website: + +`wp converter-for-media calculate` + +Converting all images: + +`wp converter-for-media regenerate` + +Converting all images (with "Force convert all images again" option): + +`wp converter-for-media regenerate --force` + += Does plugin support CDN? = + +The website files (WordPress files) and the images from the Media Library must be on the same server. If they are, everything should work fine. + +If only your images are on another CDN server, unfortunately correct operation is impossible, because such images are managed by another server. + +Current list of supported CDN servers: +- BunnyCDN (refer to [the instructions](https://url.mattplugins.com/converter-plugin-faq-cdn-bunny-instruction) before use) + +== Screenshots == + +1. General tab of the plugin settings +2. Advanced tab of the plugin settings +3. Bulk optimization of images +4. Optimization statistics of Media Library +5. Ability to manually undo optimization of selected image + +== Changelog == + += 6.3.2 (2025-11-24) = +* `[Added]` Support for WordPress 6.9 + += 6.3.1 (2025-11-09) = +* `[Fixed]` Support for Bunny CDN and BunnyCDN plugin +* `[Fixed]` Support for QUIC.cloud CDN + += 6.3.0 (2025-10-28) = +* `[Changed]` Message about rewrites_uploads_blocked server configuration error + += 6.2.4 (2025-09-09) = +* `[Fixed]` Deprecated notice for implicitly nullable parameter when converting images + += 6.2.3 (2025-09-02) = +* `[Fixed]` Unknown error when converting images when file is unavailable or file size verification failed + += 6.2.2 (2025-04-29) = +* `[Security]` Update of Axios HTTP client + += 6.2.1 (2025-04-01) = +* `[Fixed]` Handling of excluded directories when uploading new images +* `[Added]` Error detection of required functions in disable_functions list in PHP configuration +* `[Added]` Support for WordPress 6.8 + += 6.2.0 (2024-12-18) = +* `[Changed]` Minimum required PHP version from 7.0 to 7.1 +* `[Added]` Compatibility with PHP 8.4 + += 6.1.3 (2024-11-19) = +* `[Fixed]` Translations in command registration for WP-CLI +* `[Added]` Support for WordPress 6.7 + += 6.1.2 (2024-10-26) = +* `[Fixed]` Removing converted files after uninstalling plugin + += 6.1.1 (2024-10-02) = +* `[Changed]` Bulk Optimization of Images section + += 6.1.0 (2024-09-13) = +* `[Removed]` Filter `webpc_supported_source_directory` +* `[Fixed]` Handling of excluded directories when uploading new images +* `[Fixed]` Handling of excluded filenames when uploading new images +* `[Fixed]` Adding support for custom directories using webpc_source_directories filter +* `[Fixed]` Verification of rewrites_not_working server configuration error when HTTP referer is required + += 6.0.0 (2024-08-28) = +* `[Fixed]` Generating statistics on plugin settings page when WebP format is unchecked +* `[Fixed]` Restoring original images in Media Library +* `[Changed]` Optimization statistics in Media Library +* `[Added]` Warnings with explanations in plugin settings field: Image loading mode + +See [changelog.txt](https://url.mattplugins.com/converter-readme-changelog) for previous versions. + +== Upgrade Notice == + +None. diff --git a/wp-content/plugins/webp-converter-for-media/src/Action/ConvertAttachmentAction.php b/wp-content/plugins/webp-converter-for-media/src/Action/ConvertAttachmentAction.php new file mode 100755 index 00000000..fdccf15e --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Action/ConvertAttachmentAction.php @@ -0,0 +1,49 @@ +plugin_data = $plugin_data; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'webpc_convert_attachment', [ $this, 'convert_files_by_attachment' ], 10, 3 ); + } + + /** + * Converts all sizes of attachment to output formats. + * + * @param int $post_id ID of attachment. + * @param bool $regenerate_force . + * @param int|null $quality_level . + * + * @return void + * @internal + */ + public function convert_files_by_attachment( int $post_id, bool $regenerate_force = false, ?int $quality_level = null ) { + $attachment = new AttachmentPathsGenerator( $this->plugin_data ); + + if ( $quality_level === 0 ) { + do_action( 'webpc_delete_paths', $attachment->get_attachment_paths( $post_id ), true ); + } else { + do_action( 'webpc_convert_paths', $attachment->get_attachment_paths( $post_id ), $regenerate_force, $quality_level ); + } + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Action/ConvertPathsAction.php b/wp-content/plugins/webp-converter-for-media/src/Action/ConvertPathsAction.php new file mode 100755 index 00000000..842b1d94 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Action/ConvertPathsAction.php @@ -0,0 +1,67 @@ +plugin_data = $plugin_data; + $this->method_factory = $method_factory; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'webpc_convert_paths', [ $this, 'convert_files_by_paths' ], 10, 3 ); + } + + /** + * Converts all given images to output formats. + * + * @param string[] $paths Server paths of images. + * @param bool $regenerate_force . + * @param int|null $quality_level . + * + * @return void + * @internal + */ + public function convert_files_by_paths( array $paths, bool $regenerate_force = false, ?int $quality_level = null ) { + ( new MethodIntegrator( $this->plugin_data, $this->method_factory ) ) + ->init_conversion( $this->remove_paths_from_excluded_paths( $paths ), $regenerate_force, false, $quality_level ); + } + + /** + * Removes paths of source images from excluded paths. + * + * @param string[] $source_paths Server paths of images. + * + * @return string[] + */ + private function remove_paths_from_excluded_paths( array $source_paths ): array { + foreach ( $source_paths as $path_index => $path ) { + if ( ! apply_filters( 'webpc_supported_source_file', true, basename( $path ), $path ) ) { + unset( $source_paths[ $path_index ] ); + } + } + return $source_paths; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Action/DeleteFileHandler.php b/wp-content/plugins/webp-converter-for-media/src/Action/DeleteFileHandler.php new file mode 100755 index 00000000..e53ea439 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Action/DeleteFileHandler.php @@ -0,0 +1,31 @@ +output_path = $output_path ?: new OutputPathGenerator( $format_factory ); + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'webpc_delete_paths', [ $this, 'delete_files_by_paths' ], 10, 2 ); + } + + /** + * Deletes images from output directory. + * + * @param string[] $paths Server paths of output images. + * @param bool $set_skipped_flag . + * + * @return void + * @internal + */ + public function delete_files_by_paths( array $paths, bool $set_skipped_flag = false ) { + foreach ( $paths as $path ) { + $this->delete_file_by_path( $path, $set_skipped_flag ); + } + } + + /** + * Deletes image from output directory. + * + * @param string $path Server path of output image. + * @param bool $set_skipped_flag . + * + * @return void + */ + private function delete_file_by_path( string $path, bool $set_skipped_flag ) { + $output_formats = ( $set_skipped_flag ) ? [ AvifFormat::FORMAT_EXTENSION, WebpFormat::FORMAT_EXTENSION ] : null; + + if ( ! ( $output_paths = $this->output_path->get_paths( $path, $set_skipped_flag, $output_formats ) ) ) { + return; + } + + foreach ( $output_paths as $output_path ) { + if ( is_writable( $output_path ) ) { + unlink( $output_path ); + } + + if ( is_writable( $output_path . '.' . CrashedFilesOperator::CRASHED_FILE_EXTENSION ) ) { + unlink( $output_path . '.' . CrashedFilesOperator::CRASHED_FILE_EXTENSION ); + } + + if ( $set_skipped_flag ) { + $file = fopen( $output_path . '.' . LargerFilesOperator::DELETED_FILE_EXTENSION, 'w' ); + if ( $file !== false ) { + fclose( $file ); + } + } elseif ( is_writable( $output_path . '.' . LargerFilesOperator::DELETED_FILE_EXTENSION ) ) { + unlink( $output_path . '.' . LargerFilesOperator::DELETED_FILE_EXTENSION ); + } + } + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Action/UploadFileHandler.php b/wp-content/plugins/webp-converter-for-media/src/Action/UploadFileHandler.php new file mode 100755 index 00000000..d3b5a074 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Action/UploadFileHandler.php @@ -0,0 +1,192 @@ +plugin_data = $plugin_data; + $this->cron_initiator = $cron_initiator ?: new CronInitiator( $plugin_data, $token_repository, $format_factory ); + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'init', [ $this, 'init_hooks_after_setup' ] ); + } + + /** + * @return void + * @internal + */ + public function init_hooks_after_setup() { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + if ( ! $plugin_settings[ AutoConversionOption::OPTION_NAME ] ) { + return; + } + + add_filter( 'wp_update_attachment_metadata', [ $this, 'init_attachment_conversion' ], 10, 2 ); + add_filter( 'image_make_intermediate_size', [ $this, 'init_image_conversion' ] ); + } + + /** + * Initializes converting attachment images while attachment is uploaded. + * + * @param mixed[]|null $data Updated attachment meta data. + * @param int|null $attachment_id ID of attachment. + * + * @return mixed[]|null Attachment meta data. + * @internal + */ + public function init_attachment_conversion( ?array $data = null, ?int $attachment_id = null ): ?array { + if ( ( $data === null ) || ( $attachment_id === null ) + || ! isset( $data['file'] ) || ! isset( $data['sizes'] ) ) { + return $data; + } + + $plugin_settings = $this->plugin_data->get_plugin_settings(); + $file_extension = strtolower( pathinfo( $data['file'], PATHINFO_EXTENSION ) ); + if ( ! in_array( $file_extension, $plugin_settings[ SupportedExtensionsOption::OPTION_NAME ] ) ) { + return $data; + } + + $paths = $this->get_sizes_paths( $data ); + $paths = apply_filters( 'webpc_attachment_paths', $paths, $attachment_id ); + + $this->uploaded_paths = array_merge( $this->uploaded_paths, $paths ); + add_action( 'shutdown', [ $this, 'save_paths_to_conversion' ] ); + + return $data; + } + + /** + * Initializes converting attachment images after file is saved by Image Editor. + * + * @param string $filename Path of image. + * + * @return string + * @internal + */ + public function init_image_conversion( string $filename ): string { + $upload = wp_upload_dir(); + if ( strpos( $filename, $upload['basedir'] ) !== 0 ) { + return $filename; + } + + $plugin_settings = $this->plugin_data->get_plugin_settings(); + $file_extension = strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) ); + if ( ! in_array( $file_extension, $plugin_settings[ SupportedExtensionsOption::OPTION_NAME ] ) ) { + return $filename; + } elseif ( ! apply_filters( 'webpc_supported_source_directory', true, basename( dirname( $filename ) ), $filename ) ) { + return $filename; + } elseif ( ! apply_filters( 'webpc_supported_source_file', true, basename( $filename ), $filename ) ) { + return $filename; + } + + $this->uploaded_paths[] = str_replace( '\\', '/', $filename ); + + add_action( 'shutdown', [ $this, 'save_paths_to_conversion' ] ); + + return $filename; + } + + /** + * Returns server paths of attachment image sizes. + * + * @param mixed[] $data Updated attachment meta data. + * + * @return string[] Server paths of source images. + */ + private function get_sizes_paths( array $data ): array { + $directory = $this->get_attachment_directory( $data['file'] ); + $list = []; + + if ( ! apply_filters( 'webpc_supported_source_directory', true, basename( $directory ), $directory ) ) { + return $list; + } + + if ( isset( $data['original_image'] ) ) { + $list[] = $directory . $data['original_image']; + } + + $list[] = $directory . basename( $data['file'] ); + foreach ( $data['sizes'] as $size ) { + $path = $directory . $size['file']; + if ( ! in_array( $path, $list ) ) { + $list[] = $path; + } + } + + foreach ( $list as $index => $path ) { + if ( ! apply_filters( 'webpc_supported_source_file', true, basename( $path ), $path ) ) { + unset( $list[ $index ] ); + } + } + + return array_values( array_unique( $list ) ); + } + + /** + * Returns server path of source image. + * + * @param string $path Relative path of source image. + * + * @return string Server path of source image. + */ + private function get_attachment_directory( string $path ): string { + $upload = wp_upload_dir(); + $path_directory = rtrim( dirname( $path ), '/\\.' ); + $source = rtrim( $upload['basedir'], '/\\' ) . '/' . $path_directory . '/'; + + return str_replace( '\\', '/', $source ); + } + + /** + * @return void + * + * @internal + */ + public function save_paths_to_conversion() { + $paths = array_unique( $this->uploaded_paths ); + if ( ! $paths ) { + return; + } + + $this->cron_initiator->add_paths_to_conversion( $paths, true ); + $this->cron_initiator->init_async_conversion( true ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/AttachmentPathsGenerator.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/AttachmentPathsGenerator.php new file mode 100755 index 00000000..88473d40 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/AttachmentPathsGenerator.php @@ -0,0 +1,84 @@ +plugin_data = $plugin_data; + $this->upload_dir = wp_upload_dir(); + } + + /** + * Returns server paths to source images of attachment. + * + * @param int $attachment_id ID of attachment. + * + * @return string[] Server paths of source images. + */ + public function get_attachment_paths( int $attachment_id ): array { + $settings = $this->plugin_data->get_plugin_settings(); + return $this->get_paths_by_attachment( $attachment_id, $settings ); + } + + /** + * Returns server paths to source images of attachment by file extensions. + * + * @param int $post_id ID of attachment. + * @param mixed[] $settings Plugin settings. + * + * @return string[] Server paths of source images. + */ + private function get_paths_by_attachment( int $post_id, array $settings ): array { + $list = []; + $metadata = wp_get_attachment_metadata( $post_id ); + if ( ! $metadata || ! isset( $metadata['file'] ) ) { + return $list; + } + + $extension = strtolower( pathinfo( $metadata['file'], PATHINFO_EXTENSION ) ); + if ( ! in_array( $extension, $settings[ SupportedExtensionsOption::OPTION_NAME ] ) ) { + return $list; + } + + $paths = $this->get_paths_by_sizes( $post_id, $metadata ); + return apply_filters( 'webpc_attachment_paths', $paths, $post_id ); + } + + /** + * Returns unique server paths to source images of attachment. + * + * @param int $post_id ID of attachment. + * @param mixed[] $metadata Data of attachment. + * + * @return string[] Server paths of source images. + */ + private function get_paths_by_sizes( int $post_id, array $metadata ): array { + $main_file = str_replace( '\\', '/', ( $this->upload_dir['basedir'] . '/' . $metadata['file'] ) ); + $file_path = dirname( $main_file ) . '/'; + $list = [ $main_file ]; + + foreach ( $metadata['sizes'] ?? [] as $size => $size_data ) { + $list[] = $file_path . $size_data['file']; + } + return array_values( array_unique( $list ) ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/CrashedFilesOperator.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/CrashedFilesOperator.php new file mode 100755 index 00000000..4299910f --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/CrashedFilesOperator.php @@ -0,0 +1,38 @@ +plugin_data = $plugin_data; + $this->cron_initiator = $cron_initiator ?: new CronInitiator( $plugin_data, $token_repository, $format_factory ); + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'init', [ $this, 'add_cron_event' ] ); + add_action( self::CRON_PATHS_ACTION, [ $this, 'get_paths_to_conversion' ] ); + } + + /** + * Initializes cron event to convert all images. + * + * @return void + * @internal + */ + public function add_cron_event() { + if ( wp_next_scheduled( self::CRON_PATHS_ACTION ) + || ! ( $settings = $this->plugin_data->get_plugin_settings() ) + || ! in_array( ExtraFeaturesOption::OPTION_VALUE_CRON_ENABLED, $settings[ ExtraFeaturesOption::OPTION_NAME ] ) ) { + return; + } + + wp_schedule_event( time(), CronSchedulesGenerator::CRON_PATHS_SCHEDULE, self::CRON_PATHS_ACTION ); + } + + /** + * @return void + * @internal + */ + public function get_paths_to_conversion() { + $this->cron_initiator->refresh_paths_to_conversion(); + $this->cron_initiator->init_conversion(); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronInitiator.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronInitiator.php new file mode 100755 index 00000000..3f2c2e6f --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronInitiator.php @@ -0,0 +1,151 @@ +plugin_data = $plugin_data; + $this->cron_status_manager = $cron_status_manager ?: new CronStatusManager(); + $this->paths_finder = $paths_finder ?: new PathsFinder( $plugin_data, $token_repository, $format_factory ); + } + + public function refresh_paths_to_conversion( bool $force_init = false ): bool { + $saved_request_id = $this->cron_status_manager->get_conversion_request_id(); + if ( $this->cron_status_manager->is_conversion_locked() + || ( ! $force_init && ( $saved_request_id !== null ) ) ) { + return false; + } + + $plugin_settings = $this->plugin_data->get_plugin_settings(); + $cron_enabled = in_array( ExtraFeaturesOption::OPTION_VALUE_CRON_ENABLED, $plugin_settings[ ExtraFeaturesOption::OPTION_NAME ] ); + + $this->cron_status_manager->set_conversion_status_locked( true, true ); + + $paths = $this->paths_finder->get_paths( true ); + $this->cron_status_manager->set_paths_to_conversion( $paths, $cron_enabled ); + $this->cron_status_manager->set_paths_skipped( ( $cron_enabled ) ? $paths : [] ); + + $this->cron_status_manager->set_conversion_status_locked( false ); + + return (bool) $paths; + } + + /** + * @param string[] $new_paths . + * @param bool $force_convert_modified . + * + * @return void + */ + public function add_paths_to_conversion( array $new_paths, bool $force_convert_modified = false ) { + $paths = $this->cron_status_manager->get_paths_to_conversion(); + $valid_new_paths = $this->paths_finder->skip_converted_paths( $new_paths, null, $force_convert_modified ); + + $this->cron_status_manager->set_paths_to_conversion( array_merge( $valid_new_paths, $paths ) ); + } + + /** + * @param string|null $request_id . + * + * @return void + */ + public function init_conversion( ?string $request_id = null ) { + $saved_request_id = $this->cron_status_manager->get_conversion_request_id(); + if ( $this->cron_status_manager->is_conversion_locked() + || ( ( $saved_request_id !== null ) && ( $request_id !== $saved_request_id ) ) ) { + return; + } + + $paths = $this->cron_status_manager->get_paths_to_conversion(); + if ( ! $paths ) { + $this->try_restart_conversion(); + return; + } + + $this->cron_status_manager->set_paths_to_conversion( array_slice( $paths, 1 ) ); + do_action( 'webpc_convert_paths', array_slice( $paths, 0, 1 ) ); + + $this->init_async_conversion(); + } + + /** + * @param bool $upload_request . + * + * @return void + */ + public function init_async_conversion( bool $upload_request = false ) { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + $service_mode = ( $plugin_settings[ ServiceModeOption::OPTION_NAME ] === 'yes' ); + + $headers = [ + CronConversionEndpoint::ROUTE_NONCE_HEADER => CronConversionEndpoint::get_route_nonce(), + ]; + if ( isset( $_SERVER['PHP_AUTH_USER'] ) && isset( $_SERVER['PHP_AUTH_PW'] ) ) { + $headers['Authorization'] = 'Basic ' . base64_encode( $_SERVER['PHP_AUTH_USER'] . ':' . $_SERVER['PHP_AUTH_PW'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput + } + + $args = [ + 'timeout' => 0.01, + 'blocking' => false, + 'sslverify' => apply_filters( 'https_local_ssl_verify', false ), + 'headers' => $headers, + ]; + if ( $service_mode && $upload_request ) { + unset( $args['timeout'] ); + unset( $args['blocking'] ); + } + + $response = wp_remote_post( CronConversionEndpoint::get_route_url(), $args ); + if ( $service_mode && $upload_request ) { + $this->cron_status_manager->set_conversion_request_response( $response ); + } + } + + /** + * @return void + */ + private function try_restart_conversion() { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + $cron_enabled = in_array( ExtraFeaturesOption::OPTION_VALUE_CRON_ENABLED, $plugin_settings[ ExtraFeaturesOption::OPTION_NAME ] ); + + $this->cron_status_manager->reset_conversion_request_id(); + if ( ! $cron_enabled || ! $this->cron_status_manager->get_paths_counter() ) { + return; + } + + $this->refresh_paths_to_conversion( true ); + $this->init_async_conversion(); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronSchedulesGenerator.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronSchedulesGenerator.php new file mode 100755 index 00000000..156573a2 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronSchedulesGenerator.php @@ -0,0 +1,36 @@ + apply_filters( 'webpc_cron_paths_interval', 3600 ), + 'display' => 'Converter for Media', + ]; + return $schedules; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronStatusManager.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronStatusManager.php new file mode 100755 index 00000000..7bdac180 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronStatusManager.php @@ -0,0 +1,105 @@ +get_paths_to_conversion() ); + $paths_skipped = get_site_transient( self::CRON_PATHS_SKIPPED_TRANSIENT ) ?: 0; + return ( $paths_count + $paths_skipped ); + } + + /** + * @param bool $new_status . + * @param bool $is_long_expiration . + * + * @return void + */ + public function set_conversion_status_locked( bool $new_status = true, bool $is_long_expiration = false ) { + set_site_transient( + self::CRON_STATUS_LOCKED_TRANSIENT, + ( $new_status ) ? 'yes' : null, + ( $is_long_expiration ) ? 900 : 60 + ); + if ( $new_status === true ) { + $this->reset_conversion_request_id(); + } + } + + public function is_conversion_locked(): bool { + return ( get_site_transient( self::CRON_STATUS_LOCKED_TRANSIENT ) === 'yes' ); + } + + public function refresh_conversion_request_id(): string { + $request_id = uniqid( '', true ); + set_site_transient( self::CRON_REQUEST_ID_TRANSIENT, $request_id, 60 ); + return $request_id; + } + + /** + * @return void + */ + public function reset_conversion_request_id() { + set_site_transient( self::CRON_REQUEST_ID_TRANSIENT, null ); + } + + /** + * @return string|null + */ + public function get_conversion_request_id() { + $request_id = get_site_transient( self::CRON_REQUEST_ID_TRANSIENT ); + return $request_id ?: null; + } + + /** + * @param mixed[]|\WP_Error $response . + * + * @return void + */ + public function set_conversion_request_response( $response ) { + set_site_transient( self::CRON_REQUEST_RESPONSE_TRANSIENT, $response ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronStatusViewer.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronStatusViewer.php new file mode 100755 index 00000000..f473dceb --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Cron/CronStatusViewer.php @@ -0,0 +1,80 @@ +cron_status_manager = $cron_status_manager ?: new CronStatusManager(); + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'admin_init', [ $this, 'init_status_preview' ] ); + } + + /** + * @return void + * @internal + */ + public function init_status_preview() { + if ( $this->cron_status_manager->get_conversion_request_id() === null ) { + return; + } + + $this->paths_preview_count = $this->cron_status_manager->get_paths_counter(); + if ( ! $this->paths_preview_count ) { + return; + } + + add_action( 'admin_bar_menu', [ $this, 'add_menu_to_top_bar' ], 1000 ); + } + + /** + * @param \WP_Admin_Bar $wp_admin_bar . + * + * @return void + * @internal + */ + public function add_menu_to_top_bar( \WP_Admin_Bar $wp_admin_bar ) { + $count = number_format( $this->paths_preview_count, 0, '', ' ' ); + $menu_parent = [ + 'id' => 'webpc-menu', + 'href' => PageIntegrator::get_settings_page_url(), + 'title' => sprintf( + '%1$s', + $count + ), + ]; + $menu_child = [ + 'id' => 'webpc-menu-message', + 'title' => sprintf( + /* translators: %1$s: progress percent */ + __( 'Converting images (%s) is in progress.', 'webp-converter-for-media' ), + $count + ), + 'parent' => $menu_parent['id'], + ]; + + $wp_admin_bar->add_menu( $menu_parent ); + $wp_admin_bar->add_menu( $menu_child ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/DirectoryAbstract.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/DirectoryAbstract.php new file mode 100755 index 00000000..465275cb --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/DirectoryAbstract.php @@ -0,0 +1,53 @@ +get_type(); + } + + /** + * {@inheritdoc} + */ + public function is_available(): bool { + return ( file_exists( $this->get_server_path() ) ); + } + + /** + * {@inheritdoc} + */ + public function is_output_directory(): bool { + return false; + } + + /** + * {@inheritdoc} + */ + public function get_server_path(): string { + $directory_name = apply_filters( 'webpc_dir_name', $this->get_relative_path(), $this->get_type() ); + return sprintf( + '%1$s/%2$s', + rtrim( PathsGenerator::get_wordpress_root_path(), DIRECTORY_SEPARATOR ), + $directory_name + ); + } + + /** + * {@inheritdoc} + */ + public function get_path_url(): string { + $source_url = PathsGenerator::get_site_url(); + $directory_name = apply_filters( 'webpc_dir_name', $this->get_relative_path(), $this->get_type() ); + return sprintf( '%1$s/%2$s', $source_url, $directory_name ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/DirectoryFactory.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/DirectoryFactory.php new file mode 100755 index 00000000..e065e590 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/DirectoryFactory.php @@ -0,0 +1,126 @@ +format_factory = $format_factory; + + $this->set_integration( new SourceDirectory( 'cache' ) ); + $this->set_integration( new SourceDirectory( 'gallery' ) ); + $this->set_integration( new SourceDirectory( 'plugins' ) ); + $this->set_integration( new SourceDirectory( 'themes' ) ); + $this->set_integration( new UploadsDirectory() ); + $this->set_integration( new UploadsWebpcDirectory() ); + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'init', [ $this, 'init_hooks_after_setup' ], 0 ); + add_action( 'webpc_settings_updated', [ $this, 'remove_unused_output_directories' ], 10, 2 ); + add_action( 'webpc_settings_updated', [ $this, 'remove_unused_output_format' ], 10, 2 ); + $this->directories_integration->init_hooks(); + } + + /** + * Loads hooks before other init_hooks_after_setup() functions. + * + * @return void + * @internal + */ + public function init_hooks_after_setup() { + foreach ( apply_filters( 'webpc_source_directories', [] ) as $directory_name ) { + $this->set_integration( new SourceDirectory( $directory_name ) ); + } + } + + /** + * Sets integration for directory. + * + * @param DirectoryInterface $directory . + * + * @return void + */ + private function set_integration( DirectoryInterface $directory ) { + if ( $this->directories_integration === null ) { + $this->directories_integration = new DirectoryIntegrator( $this->format_factory ); + } + $this->directories_integration->add_directory( $directory ); + } + + /** + * Returns list of source directories. + * + * @return string[] Types of directories with labels. + */ + public function get_directories(): array { + return $this->directories_integration->get_source_directories(); + } + + /** + * @param mixed[] $plugin_settings . + * @param mixed[] $previous_plugin_settings . + * + * @return void + * @internal + */ + public function remove_unused_output_directories( array $plugin_settings, array $previous_plugin_settings ) { + if ( $plugin_settings[ SupportedDirectoriesOption::OPTION_NAME ] === $previous_plugin_settings[ SupportedDirectoriesOption::OPTION_NAME ] ) { + return; + } + + $all_dirs = $this->directories_integration->get_output_directories(); + foreach ( $all_dirs as $output_dir => $output_path ) { + if ( in_array( $output_dir, $plugin_settings[ SupportedDirectoriesOption::OPTION_NAME ] ) ) { + continue; + } + + $paths = OutputFilesRemover::get_paths_from_location( $output_path ); + $paths[] = $output_path; + OutputFilesRemover::remove_files( $paths ); + } + } + + /** + * @param mixed[] $plugin_settings . + * @param mixed[] $previous_plugin_settings . + * + * @return void + * @internal + */ + public function remove_unused_output_format( array $plugin_settings, array $previous_plugin_settings ) { + if ( ( $plugin_settings[ OutputFormatsOption::OPTION_NAME ] === $previous_plugin_settings[ OutputFormatsOption::OPTION_NAME ] ) + || in_array( WebpFormat::FORMAT_EXTENSION, $plugin_settings[ OutputFormatsOption::OPTION_NAME ] ) ) { + return; + } + + $path = apply_filters( 'webpc_dir_path', '', 'webp' ); + $paths = OutputFilesRemover::get_paths_from_location( $path ); + OutputFilesRemover::remove_files( $paths, [ WebpFormat::FORMAT_EXTENSION ] ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/DirectoryIntegrator.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/DirectoryIntegrator.php new file mode 100755 index 00000000..f35343b7 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/DirectoryIntegrator.php @@ -0,0 +1,148 @@ +output_path = $output_path ?: new OutputPathGenerator( $format_factory ); + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_filter( 'webpc_dir_name', [ $this, 'get_dir_as_name' ], 0, 2 ); + add_filter( 'webpc_dir_path', [ $this, 'get_dir_as_path' ], 0, 2 ); + add_filter( 'webpc_dir_url', [ $this, 'get_dir_as_url' ], 0, 2 ); + } + + /** + * Adds support of directory, if available. + * + * @param DirectoryInterface $directory . + * + * @return self + */ + public function add_directory( DirectoryInterface $directory ): self { + $this->directories[ $directory->get_type() ] = $directory; + return $this; + } + + /** + * Returns list of source directories. + * + * @return string[] Types of directories with labels. + */ + public function get_source_directories(): array { + $values = []; + foreach ( $this->directories as $directory ) { + if ( ! $directory->is_output_directory() && $directory->is_available() ) { + $values[ $directory->get_type() ] = $directory->get_label(); + } + } + return $values; + } + + /** + * Returns list of output directories. + * + * @return string[] Types of directories with labels. + */ + public function get_output_directories(): array { + $values = []; + foreach ( $this->directories as $directory ) { + if ( ! $directory->is_output_directory() + && ( $output_path = $this->output_path->get_directory_path( $directory->get_server_path() ) ) + && ( $output_path !== $directory->get_server_path() ) ) { + $values[ $directory->get_type() ] = $output_path; + } + } + return $values; + } + + /** + * Returns server path of directory relative to WordPress root directory. + * + * @param string $value Default value. + * @param string $directory_type Type of directory. + * + * @return string Relative server path of directory. + * @internal + */ + public function get_dir_as_name( $value, string $directory_type ): string { + if ( isset( $this->directories[ $directory_type ] ) ) { + $value = $this->directories[ $directory_type ]->get_relative_path(); + } + return str_replace( '\\', '/', $value ); + } + + /** + * Returns server path of directory. + * + * @param string $value Default value. + * @param string $directory_type Type of directory. + * + * @return string Server path of directory. + * @internal + */ + public function get_dir_as_path( $value, string $directory_type ): string { + $directory_name = apply_filters( 'webpc_dir_name', '', $directory_type ); + if ( $directory_name === '' ) { + if ( isset( $this->directories[ $directory_type ] ) ) { + return $this->directories[ $directory_type ]->get_server_path(); + } else { + return $value; + } + } + + return sprintf( + '%1$s/%2$s', + rtrim( PathsGenerator::get_wordpress_root_path(), DIRECTORY_SEPARATOR ), + $directory_name + ); + } + + /** + * Returns URL of directory. + * + * @param string $value Default value. + * @param string $directory_type Type of directory. + * + * @return string URL of directory. + * @internal + */ + public function get_dir_as_url( $value, string $directory_type ): string { + $directory_name = apply_filters( 'webpc_dir_name', '', $directory_type ); + if ( $directory_name === '' ) { + if ( isset( $this->directories[ $directory_type ] ) ) { + return $this->directories[ $directory_type ]->get_path_url(); + } else { + return $value; + } + } + + $source_url = PathsGenerator::get_site_url(); + return sprintf( '%1$s/%2$s', $source_url, $directory_name ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/DirectoryInterface.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/DirectoryInterface.php new file mode 100755 index 00000000..177ba8b7 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/DirectoryInterface.php @@ -0,0 +1,58 @@ +directory_type = trim( $directory_name, '/\\' ); + $this->directory_path = '%s/' . $this->directory_type; + } + + /** + * {@inheritdoc} + */ + public function get_type(): string { + return $this->directory_type; + } + + /** + * {@inheritdoc} + */ + public function get_relative_path(): string { + return sprintf( $this->directory_path, basename( WP_CONTENT_DIR ) ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/UploadsDirectory.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/UploadsDirectory.php new file mode 100755 index 00000000..a733b019 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Directory/UploadsDirectory.php @@ -0,0 +1,48 @@ +plugin_data = $plugin_data; + $this->server_configurator = $server_configurator ?: new ServerConfigurator(); + } + + /** + * Returns list of source images for directory. + * + * @param string $dir_path Server path of source directory. + * + * @return string[] Server paths of source images. + * @internal + */ + public function get_files_by_directory( string $dir_path ): array { + if ( ! file_exists( $dir_path ) ) { + return []; + } + + $this->server_configurator->set_memory_limit(); + $this->server_configurator->set_execution_time( 900 ); + + $settings = $this->plugin_data->get_plugin_settings(); + return $this->find_files_in_directory( + $dir_path, + $settings[ SupportedExtensionsOption::OPTION_NAME ] + ); + } + + /** + * Returns list of source images for directory. + * + * @param string $dir_path Server path of source directory. + * @param string[] $allowed_source_exts File extensions to find. + * @param string $path_prefix File path related to directory path. + * + * @return string[] Server paths of source images. + */ + private function find_files_in_directory( string $dir_path, array $allowed_source_exts, string $path_prefix = '' ): array { + $paths = scandir( $dir_path ); + $list = []; + if ( ! is_array( $paths ) ) { + return $list; + } + + if ( $path_prefix === '' ) { + $paths = array_diff( $paths, [ basename( RewritesErrorsDetector::PATH_OUTPUT_FILE_PNG ) ] ); + } + + rsort( $paths ); + foreach ( $paths as $path ) { + $current_path = $dir_path . '/' . $path; + + if ( is_dir( $current_path ) ) { + if ( apply_filters( 'webpc_supported_source_directory', true, basename( $current_path ), $current_path ) ) { + $list = array_merge( + $list, + $this->find_files_in_directory( $current_path, $allowed_source_exts, trim( $path_prefix . '/' . $path, '/' ) ) + ); + } + } else { + $filename = basename( $current_path ); + $parts = array_reverse( explode( '.', $filename ) ); + if ( in_array( strtolower( $parts[0] ), $allowed_source_exts ) && ! in_array( strtolower( $parts[1] ?? '' ), ExcludedPathsOperator::EXCLUDED_SUB_EXTENSIONS ) ) { + if ( apply_filters( 'webpc_supported_source_file', true, $filename, $current_path ) ) { + $list[] = trim( $path_prefix . '/' . $path, '/' ); + } + } + } + } + return $list; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/CronConversionEndpoint.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/CronConversionEndpoint.php new file mode 100755 index 00000000..e444068b --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/CronConversionEndpoint.php @@ -0,0 +1,102 @@ +cron_initiator = $cron_initiator ?: new CronInitiator( $plugin_data, $token_repository, $format_factory ); + $this->cron_status_manager = $cron_status_manager ?: new CronStatusManager(); + } + + /** + * {@inheritdoc} + */ + public static function get_route_name(): string { + return 'cron-conversion'; + } + + /** + * {@inheritdoc} + */ + public function get_http_methods(): string { + return \WP_REST_Server::CREATABLE; + } + + /** + * {@inheritdoc} + */ + public function is_valid_request( string $request_nonce ): bool { + $nonce_value = $this->cron_status_manager->get_conversion_request_id(); + if ( $nonce_value === null ) { + return false; + } + + return ( $request_nonce === $nonce_value ); + } + + /** + * {@inheritdoc} + */ + public static function get_route_url(): string { + return get_rest_url( + null, + sprintf( + '%1$s/%2$s', + EndpointIntegrator::ROUTE_NAMESPACE, + self::get_route_name() + ) + ); + } + + /** + * {@inheritdoc} + */ + public static function get_route_nonce(): string { + return ( new CronStatusManager() )->refresh_conversion_request_id(); + } + + /** + * {@inheritdoc} + */ + public function get_route_nonce_header(): string { + return self::ROUTE_NONCE_HEADER; + } + + /** + * {@inheritdoc} + */ + public function get_route_response( \WP_REST_Request $request ) { + $request_id = $request->get_header( $this->get_route_nonce_header() ) ?: ''; + $this->cron_initiator->init_conversion( $request_id ); + + return new \WP_REST_Response( null, 200 ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/EndpointAbstract.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/EndpointAbstract.php new file mode 100755 index 00000000..14a16490 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/EndpointAbstract.php @@ -0,0 +1,53 @@ +endpoint_object = $endpoint_object; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'rest_api_init', [ $this, 'register_rest_route' ] ); + } + + /** + * Registers new endpoint in REST API. + * + * @return void + * @internal + */ + public function register_rest_route() { + register_rest_route( + self::ROUTE_NAMESPACE, + $this->endpoint_object->get_route_name(), + [ + 'methods' => $this->endpoint_object->get_http_methods(), + 'permission_callback' => function ( \WP_REST_Request $request ) { + $header_value = $request->get_header( $this->endpoint_object->get_route_nonce_header() ); + if ( $header_value === null ) { + return new \WP_Error( + 'webpc_rest_token_not_found', + __( 'Sorry, you do not have permission to do that.', 'webp-converter-for-media' ), + [ 'status' => rest_authorization_required_code() ] + ); + } elseif ( ! $this->endpoint_object->is_valid_request( $header_value ) ) { + return new \WP_Error( + 'webpc_rest_token_invalid', + __( 'Sorry, you do not have permission to do that.', 'webp-converter-for-media' ), + [ 'status' => rest_authorization_required_code() ] + ); + } + + return true; + }, + 'callback' => [ $this, 'get_route_response' ], + 'args' => $this->endpoint_object->get_route_args(), + ] + ); + } + + /** + * @param \WP_REST_Request $request . + * + * @return \WP_REST_Response|\WP_Error + * @internal + */ + public function get_route_response( \WP_REST_Request $request ) { + nocache_headers(); + do_action( 'litespeed_control_set_nocache', 'Converter for Media' ); + + return $this->endpoint_object->get_route_response( $request ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/EndpointInterface.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/EndpointInterface.php new file mode 100755 index 00000000..26512a68 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/EndpointInterface.php @@ -0,0 +1,70 @@ +plugin_data = $plugin_data; + $this->format_factory = $format_factory; + } + + /** + * {@inheritdoc} + */ + public static function get_route_name(): string { + return 'images-stats'; + } + + /** + * {@inheritdoc} + */ + public function get_http_methods(): string { + return \WP_REST_Server::READABLE; + } + + /** + * {@inheritdoc} + */ + public function get_route_response( \WP_REST_Request $request ) { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + $allowed_formats = $plugin_settings[ OutputFormatsOption::OPTION_NAME ]; + if ( ! in_array( AvifFormat::FORMAT_EXTENSION, $allowed_formats ) ) { + $allowed_formats[] = AvifFormat::FORMAT_EXTENSION; + } + + $stats_data = ( new FilesTreeFinder( $this->plugin_data, $this->format_factory ) ) + ->get_tree( $allowed_formats ); + + return new \WP_REST_Response( + [ + 'value_webp_all' => ( ( $stats_data['files_converted'][ WebpFormat::FORMAT_EXTENSION ] ?? 0 ) + ( $stats_data['files_unconverted'][ WebpFormat::FORMAT_EXTENSION ] ?? 0 ) ), + 'value_webp_converted' => $stats_data['files_converted'][ WebpFormat::FORMAT_EXTENSION ] ?? 0, + 'value_avif_all' => ( ( $stats_data['files_converted'][ AvifFormat::FORMAT_EXTENSION ] ?? 0 ) + ( $stats_data['files_unconverted'][ AvifFormat::FORMAT_EXTENSION ] ?? 0 ) ), + 'value_avif_converted' => $stats_data['files_converted'][ AvifFormat::FORMAT_EXTENSION ] ?? 0, + 'tree' => $stats_data['files_tree'], + ], + 200 + ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/PathsEndpoint.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/PathsEndpoint.php new file mode 100755 index 00000000..c9b2042c --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/PathsEndpoint.php @@ -0,0 +1,103 @@ +plugin_data = $plugin_data; + $this->token_repository = $token_repository; + $this->format_factory = $format_factory; + $this->cron_status_manager = $cron_status_manager ?: new CronStatusManager(); + } + + /** + * {@inheritdoc} + */ + public static function get_route_name(): string { + return 'paths'; + } + + /** + * {@inheritdoc} + */ + public function get_http_methods(): string { + return \WP_REST_Server::CREATABLE; + } + + /** + * {@inheritdoc} + */ + public function get_route_args(): array { + return array_merge( + parent::get_route_args(), + [ + 'regenerate_force' => [ + 'description' => 'Option to force all images to be converted again (set `1` to enable)', + 'required' => false, + 'default' => false, + 'sanitize_callback' => function ( $value ) { + return ( (string) $value === '1' ); + }, + ], + ] + ); + } + + /** + * {@inheritdoc} + */ + public function get_route_response( \WP_REST_Request $request ) { + $this->cron_status_manager->set_conversion_status_locked( true, true ); + $this->cron_status_manager->set_paths_to_conversion( [] ); + $this->cron_status_manager->set_paths_skipped( [] ); + + $params = $request->get_params(); + $skip_converted = ( $params['regenerate_force'] !== true ); + $paths = ( new PathsFinder( $this->plugin_data, $this->token_repository, $this->format_factory ) ) + ->get_paths_by_chunks( $skip_converted ); + + if ( ! $paths ) { + $this->cron_status_manager->set_conversion_status_locked( false ); + } + + return new \WP_REST_Response( + $paths, + 200 + ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/RegenerateAttachmentEndpoint.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/RegenerateAttachmentEndpoint.php new file mode 100755 index 00000000..8905b0e4 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/RegenerateAttachmentEndpoint.php @@ -0,0 +1,82 @@ + [ + 'description' => 'Attachment ID', + 'required' => true, + 'validate_callback' => function ( $value ) { + return is_int( $value ); + }, + ], + 'quality_level' => [ + 'description' => 'Conversion strategy', + 'required' => true, + 'validate_callback' => function ( $value ) { + return in_array( + $value, + array_merge( + apply_filters( 'webpc_option_quality_levels', [ 75, 80, 85, 90, 95 ] ), + [ 0 ] + ) + ); + }, + ], + ] + ); + } + + /** + * {@inheritdoc} + */ + public function get_route_response( \WP_REST_Request $request ) { + $params = $request->get_params(); + + return new \WP_REST_Response( + [ + 'output_html' => $this->convert_images( $params['post_id'], $params['quality_level'] ), + ], + 200 + ); + } + + /** + * Initializes image conversion to output formats. + * + * @param int $post_id . + * @param int $quality_level . + * + * @return string|false Status of conversion. + */ + public function convert_images( int $post_id, int $quality_level ) { + do_action( 'webpc_convert_attachment', $post_id, true, $quality_level ); + + return apply_filters( 'webpc_attachment_stats', '', $post_id, $quality_level ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/RegenerateEndpoint.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/RegenerateEndpoint.php new file mode 100755 index 00000000..20ae428d --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Endpoint/RegenerateEndpoint.php @@ -0,0 +1,121 @@ +plugin_data = $plugin_data; + $this->method_factory = $method_factory; + $this->cron_status_manager = $cron_status_manager ?: new CronStatusManager(); + } + + /** + * {@inheritdoc} + */ + public static function get_route_name(): string { + return 'regenerate'; + } + + /** + * {@inheritdoc} + */ + public function get_http_methods(): string { + return \WP_REST_Server::CREATABLE; + } + + /** + * {@inheritdoc} + */ + public function get_route_args(): array { + return array_merge( + parent::get_route_args(), + [ + 'regenerate_force' => [ + 'description' => 'Option to force all images to be converted again (set `1` to enable)', + 'required' => false, + 'default' => false, + 'sanitize_callback' => function ( $value ) { + return ( (string) $value === '1' ); + }, + ], + 'paths' => [ + 'description' => 'Array of file paths (server paths)', + 'required' => true, + 'default' => [], + 'validate_callback' => function ( $value ) { + return ( is_array( $value ) && $value ); + }, + ], + ] + ); + } + + /** + * {@inheritdoc} + */ + public function get_route_response( \WP_REST_Request $request ) { + $this->cron_status_manager->set_conversion_status_locked(); + + $params = $request->get_params(); + $data = $this->convert_images( $params['paths'], $params['regenerate_force'] ); + + if ( $data !== false ) { + return new \WP_REST_Response( + $data, + 200 + ); + } else { + return new \WP_Error( + 'webpc_rest_api_error', + '', + [ + 'status' => 405, + ] + ); + } + } + + /** + * Initializes image conversion to output formats. + * + * @param string[] $paths Server paths of source images. + * @param bool $regenerate_force . + * + * @return mixed[]|false Status of conversion. + */ + public function convert_images( array $paths, bool $regenerate_force ) { + $response = ( new MethodIntegrator( $this->plugin_data, $this->method_factory ) )->init_conversion( $paths, $regenerate_force ); + if ( $response === null ) { + return false; + } + return $response; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/ExcludedPathsOperator.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/ExcludedPathsOperator.php new file mode 100755 index 00000000..fe6f4de0 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/ExcludedPathsOperator.php @@ -0,0 +1,105 @@ +plugin_data = $plugin_data; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'init', [ $this, 'load_excluded_directories_from_plugin_settings' ] ); + add_filter( 'webpc_supported_source_directory', [ $this, 'skip_excluded_directory' ], 0, 3 ); + } + + /** + * @return void + * @internal + */ + public function load_excluded_directories_from_plugin_settings() { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + $saved_dirs = ( $plugin_settings[ ExcludedDirectoriesOption::OPTION_NAME ] !== '' ) + ? explode( ',', $plugin_settings[ ExcludedDirectoriesOption::OPTION_NAME ] ) + : []; + + foreach ( $saved_dirs as $saved_dir ) { + if ( ! preg_match( '/(\/|\\\)/', $saved_dir ) ) { + $this->excluded_dirs[] = $saved_dir; + } + $this->excluded_paths[] = '/' . str_replace( '\\', '/', $saved_dir ) . '/'; + } + } + + /** + * Returns the status if the given directory path should be converted. + * + * @param bool $path_status . + * @param string $dirname . + * @param string $server_path . + * + * @return bool Status if the given path is not excluded. + * @internal + */ + public function skip_excluded_directory( bool $path_status, string $dirname, string $server_path ): bool { + if ( in_array( $dirname, $this->excluded_dirs ) ) { + return false; + } + + $valid_server_path = str_replace( '\\', '/', $server_path ) . '/'; + foreach ( $this->excluded_paths as $excluded_path ) { + if ( strpos( $valid_server_path, $excluded_path ) !== false ) { + return false; + } + } + + return $path_status; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/FilesTreeFinder.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/FilesTreeFinder.php new file mode 100755 index 00000000..d3ef8323 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/FilesTreeFinder.php @@ -0,0 +1,222 @@ +plugin_data = $plugin_data; + $this->server_configurator = $server_configurator ?: new ServerConfigurator(); + $this->stats_manager = $stats_manager ?: new StatsManager(); + $this->output_path = $output_path ?: new OutputPathGenerator( $format_factory ); + } + + /** + * Returns list of source images for directory. + * + * @param string[] $output_formats Allowed extensions. + * + * @return mixed[] { + * @type int[] $files_converted . + * @type int[] $files_unconverted . + * @type mixed[] $files_tree . + * } + * @internal + */ + public function get_tree( array $output_formats ): array { + $this->server_configurator->set_memory_limit(); + $this->server_configurator->set_execution_time( 900 ); + + foreach ( $output_formats as $output_format ) { + $this->files_converted[ $output_format ] = 0; + $this->files_unconverted[ $output_format ] = 0; + } + + $plugin_settings = $this->plugin_data->get_plugin_settings(); + $force_convert_deleted = ( ! in_array( ExtraFeaturesOption::OPTION_VALUE_ONLY_SMALLER, $plugin_settings[ ExtraFeaturesOption::OPTION_NAME ] ) ); + $force_convert_crashed = ( $plugin_settings[ ServiceModeOption::OPTION_NAME ] === 'yes' ); + + $values = []; + foreach ( $plugin_settings[ SupportedDirectoriesOption::OPTION_NAME ] as $dir_name ) { + $source_dir = apply_filters( 'webpc_dir_path', '', $dir_name ); + $values[] = $this->find_tree_in_directory( + $source_dir, + $plugin_settings[ SupportedExtensionsOption::OPTION_NAME ], + $output_formats, + $force_convert_deleted, + $force_convert_crashed + ); + } + + $this->stats_manager->set_images_webp_all( ( $this->files_converted[ WebpFormat::FORMAT_EXTENSION ] ?? 0 ) + ( $this->files_unconverted[ WebpFormat::FORMAT_EXTENSION ] ?? 0 ) ); + $this->stats_manager->set_images_webp_unconverted( $this->files_unconverted[ WebpFormat::FORMAT_EXTENSION ] ?? 0 ); + $this->stats_manager->set_images_avif_all( ( $this->files_converted[ AvifFormat::FORMAT_EXTENSION ] ?? 0 ) + ( $this->files_unconverted[ AvifFormat::FORMAT_EXTENSION ] ?? 0 ) ); + $this->stats_manager->set_images_avif_unconverted( $this->files_unconverted[ AvifFormat::FORMAT_EXTENSION ] ?? 0 ); + + return [ + 'files_converted' => $this->files_converted, + 'files_unconverted' => $this->files_unconverted, + 'files_tree' => $values, + ]; + } + + /** + * Returns list of source images as tree. + * + * @param string $dir_path Server path of source directory. + * @param string[] $source_formats Allowed extensions. + * @param string[] $output_formats Allowed extensions. + * @param bool $force_convert_deleted Skip .deleted files. + * @param bool $force_convert_crashed Skip .crashed files. + * @param int $nesting_level . + * + * @return mixed[] + */ + private function find_tree_in_directory( + string $dir_path, + array $source_formats, + array $output_formats, + bool $force_convert_deleted, + bool $force_convert_crashed, + int $nesting_level = 0 + ): array { + $paths = scandir( $dir_path ); + $list = [ + 'name' => basename( $dir_path ), + 'items' => [], + 'files' => [], + 'count' => 0, + ]; + if ( ! is_array( $paths ) ) { + return $list; + } + + if ( $nesting_level === 0 ) { + $paths = array_diff( $paths, [ basename( RewritesErrorsDetector::PATH_OUTPUT_FILE_PNG ) ] ); + } + + sort( $paths, SORT_NATURAL | SORT_FLAG_CASE ); + foreach ( $paths as $path ) { + $current_path = $dir_path . '/' . $path; + + if ( is_dir( $current_path ) ) { + if ( apply_filters( 'webpc_supported_source_directory', true, basename( $current_path ), $current_path ) ) { + $children = $this->find_tree_in_directory( $current_path, $source_formats, $output_formats, $force_convert_deleted, $force_convert_crashed, ( $nesting_level + 1 ) ); + if ( $children['items'] || $children['files'] ) { + $list['items'][] = $children; + } + } + } else { + $filename = basename( $current_path ); + $parts = array_reverse( explode( '.', $filename ) ); + if ( in_array( strtolower( $parts[0] ), $source_formats ) && ! in_array( strtolower( $parts[1] ?? '' ), ExcludedPathsOperator::EXCLUDED_SUB_EXTENSIONS ) ) { + if ( apply_filters( 'webpc_supported_source_file', true, $filename, $current_path ) + && ! $this->is_converted_file( $current_path, $output_formats, $force_convert_deleted, $force_convert_crashed ) ) { + $list['files'][] = $path; + } + } + } + } + + $list['count'] = $this->calculate_tree_count( $list ); + return $list; + } + + /** + * @param string $source_path . + * @param string[] $output_formats . + * @param bool $force_convert_deleted Skip .deleted files. + * @param bool $force_convert_crashed Skip .crashed files. + * + * @return bool + */ + private function is_converted_file( string $source_path, array $output_formats, bool $force_convert_deleted, bool $force_convert_crashed ): bool { + $is_not_converted = false; + + foreach ( $output_formats as $output_format ) { + $output_path = $this->output_path->get_path( $source_path, false, $output_format ); + if ( $output_path === null ) { + continue; + } + + if ( file_exists( $output_path ) ) { + $this->files_converted[ $output_format ]++; + } elseif ( ! $force_convert_deleted && file_exists( $output_path . '.' . LargerFilesOperator::DELETED_FILE_EXTENSION ) ) { + $this->files_converted[ $output_format ]++; + } elseif ( ! $force_convert_crashed && file_exists( $output_path . '.' . CrashedFilesOperator::CRASHED_FILE_EXTENSION ) ) { + $this->files_converted[ $output_format ]++; + } else { + $this->files_unconverted[ $output_format ]++; + $is_not_converted = true; + } + } + + return ! $is_not_converted; + } + + /** + * @param mixed[] $tree . + * + * @return int + */ + private function calculate_tree_count( array $tree ): int { + $count = count( $tree['files'] ); + + foreach ( $tree['items'] as $tree_item ) { + $count += $this->calculate_tree_count( $tree_item ); + } + + return $count; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Format/AvifFormat.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Format/AvifFormat.php new file mode 100755 index 00000000..63c4160d --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Format/AvifFormat.php @@ -0,0 +1,64 @@ +token_repository = $token_repository; + } + + /** + * {@inheritdoc} + */ + public function get_extension(): string { + return self::FORMAT_EXTENSION; + } + + /** + * {@inheritdoc} + */ + public function get_mime_type(): string { + return 'image/avif'; + } + + /** + * {@inheritdoc} + */ + public function get_label(): string { + if ( $this->token_repository->get_token()->get_valid_status() ) { + return 'AVIF'; + } + + return sprintf( + '%1$s (%2$s)', + 'AVIF', + sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + __( 'available in %1$sthe PRO version%2$s', 'webp-converter-for-media' ), + '', + '' + ) + ); + } + + /** + * {@inheritdoc} + */ + public function is_available( string $conversion_method ): bool { + return ( $this->token_repository->get_token()->get_valid_status() && ( $conversion_method === RemoteMethod::METHOD_NAME ) ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Format/FormatAbstract.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Format/FormatAbstract.php new file mode 100755 index 00000000..33c4b537 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Format/FormatAbstract.php @@ -0,0 +1,36 @@ +get_extension() ); + } + + /** + * {@inheritdoc} + */ + public function is_available( string $conversion_method ): bool { + switch ( $conversion_method ) { + case ImagickMethod::METHOD_NAME: + return ImagickMethod::is_method_active( $this->get_extension() ); + case GdMethod::METHOD_NAME: + return GdMethod::is_method_active( $this->get_extension() ); + case RemoteMethod::METHOD_NAME: + return RemoteMethod::is_method_active( $this->get_extension() ); + } + + return false; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Format/FormatFactory.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Format/FormatFactory.php new file mode 100755 index 00000000..38e434d5 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Format/FormatFactory.php @@ -0,0 +1,114 @@ +set_integration( new AvifFormat( $token_repository ) ); + $this->set_integration( new WebpFormat() ); + } + + /** + * Sets integration for format. + * + * @param FormatInterface $format . + * + * @return void + */ + private function set_integration( FormatInterface $format ) { + $this->formats[] = $format; + } + + /** + * Returns list of output formats. + * + * @return string[] Extensions of output formats with labels. + */ + public function get_formats(): array { + $values = []; + foreach ( $this->formats as $format ) { + $values[ $format->get_extension() ] = $format->get_label(); + } + return $values; + } + + /** + * Returns list of available output formats. + * + * @param string|null $conversion_method Name of conversion method. + * + * @return string[] Extensions of output formats with labels. + */ + public function get_available_formats( ?string $conversion_method = null ): array { + if ( $conversion_method === null ) { + return []; + } elseif ( isset( $this->available_formats[ $conversion_method ] ) ) { + return $this->available_formats[ $conversion_method ]; + } + + $this->available_formats[ $conversion_method ] = []; + foreach ( $this->formats as $format ) { + if ( ! $format->is_available( $conversion_method ) ) { + continue; + } + $this->available_formats[ $conversion_method ][ $format->get_extension() ] = $format->get_label(); + } + return $this->available_formats[ $conversion_method ]; + } + + /** + * @return void + */ + public function reset_available_formats() { + $this->available_formats = []; + } + + /** + * Returns extensions of output formats. + * + * @return string[] Extensions of output formats. + */ + public function get_format_extensions(): array { + $values = []; + foreach ( $this->formats as $format ) { + $values[] = $format->get_extension(); + } + return $values; + } + + /** + * Returns mime types of output formats. + * + * @param string[]|null $output_formats Extensions of output formats. + * + * @return string[] Mime types of output formats. + */ + public function get_mime_types( ?array $output_formats = null ): array { + $values = []; + foreach ( $this->formats as $format ) { + if ( ( $output_formats !== null ) && ! in_array( $format->get_extension(), $output_formats ) ) { + continue; + } + $values[ $format->get_extension() ] = $format->get_mime_type(); + } + return $values; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Format/FormatInterface.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Format/FormatInterface.php new file mode 100755 index 00000000..7662b1d8 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Format/FormatInterface.php @@ -0,0 +1,39 @@ + [ 'jpg', 'jpeg' ], + 'imagecreatefrompng' => [ 'png' ], + 'imagecreatefromgif' => [ 'gif' ], + ] + ); + + if ( ( $extension === 'gif' ) && $this->is_animated( $source_path ) ) { + throw new ImageAnimatedException( $source_path ); + } + + foreach ( $methods as $method => $extensions ) { + if ( ! in_array( $extension, $plugin_settings[ SupportedExtensionsOption::OPTION_NAME ] ) + || ! in_array( $extension, $extensions ) ) { + continue; + } elseif ( ! function_exists( $method ) ) { + throw new FunctionUnavailableException( $method ); + } elseif ( ! $image = @$method( $source_path ) ) { // phpcs:ignore + throw new ImageInvalidException( $source_path ); + } + } + + if ( ! isset( $image ) ) { + throw new ExtensionUnsupportedException( [ $extension, $source_path ] ); + } + + $exif = ( function_exists( 'exif_read_data' ) ) + ? ( @exif_read_data( $source_path ) ?: [] ) // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged + : []; + + switch ( $exif['Orientation'] ?? '' ) { + case 2: + imageflip( $image, IMG_FLIP_HORIZONTAL ); + break; + case 3: + $image = imagerotate( $image, 180, 0 ); + break; + case 4: + imageflip( $image, IMG_FLIP_HORIZONTAL ); + $image = imagerotate( $image, 180, 0 ); + break; + case 5: + imageflip( $image, IMG_FLIP_VERTICAL ); + $image = imagerotate( $image, -90, 0 ); + break; + case 6: + $image = imagerotate( $image, -90, 0 ); + break; + case 7: + imageflip( $image, IMG_FLIP_VERTICAL ); + $image = imagerotate( $image, 90, 0 ); + break; + case 8: + $image = imagerotate( $image, 90, 0 ); + break; + } + + return $this->update_image_resource( $image, $extension ); + } + + /** + * Updates image object before converting to output format. + * + * @param resource $image Image object. + * @param string $extension Extension of output format. + * + * @return resource Image object. + * @throws FunctionUnavailableException + */ + private function update_image_resource( $image, string $extension ) { + if ( ! function_exists( 'imageistruecolor' ) ) { + throw new FunctionUnavailableException( 'imageistruecolor' ); + } + + if ( ! imageistruecolor( $image ) ) { + if ( ! function_exists( 'imagepalettetotruecolor' ) ) { + throw new FunctionUnavailableException( 'imagepalettetotruecolor' ); + } + imagepalettetotruecolor( $image ); + } + + switch ( $extension ) { + case 'png': + if ( ! function_exists( 'imagealphablending' ) ) { + throw new FunctionUnavailableException( 'imagealphablending' ); + } + imagealphablending( $image, false ); + + if ( ! function_exists( 'imagesavealpha' ) ) { + throw new FunctionUnavailableException( 'imagesavealpha' ); + } + imagesavealpha( $image, true ); + break; + } + + return $image; + } + + /** + * {@inheritdoc} + * + * @throws ConversionErrorException + * @throws FunctionUnavailableException + * @throws ResolutionOversizeException + */ + public function convert_image_to_output( $image, string $source_path, string $output_path, string $format, array $plugin_settings ) { + $function = self::get_format_function( $format ); + if ( $function === null ) { + return; + } + + $image = apply_filters( 'webpc_gd_before_saving', $image, $source_path ); + $output_quality = min( $plugin_settings[ ImagesQualityOption::OPTION_NAME ], self::MAX_METHOD_QUALITY ); + + if ( ! function_exists( $function ) ) { + throw new FunctionUnavailableException( $function ); + } elseif ( ( imagesx( $image ) > 8192 ) || ( imagesy( $image ) > 8192 ) ) { + throw new ResolutionOversizeException( $source_path ); + } elseif ( is_callable( $function ) && ! $function( $image, $output_path, $output_quality ) ) { + throw new ConversionErrorException( $source_path ); + } + + if ( filesize( $output_path ) % 2 === 1 ) { + file_put_contents( $output_path, "\0", FILE_APPEND ); + } + } + + /** + * @param string $source_path . + * + * @link https://www.php.net/manual/en/function.imagecreatefromgif.php#104473 + */ + private function is_animated( string $source_path ): bool { + if ( ! ( $fh = @fopen( $source_path, 'rb' ) ) ) { // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged + return false; + } + + $count = 0; + while ( ! feof( $fh ) && ( $count < 2 ) ) { + $chunk = fread( $fh, 1024 * 100 ); + $count = $count + preg_match_all( '#\x00\x21\xF9\x04.{4}\x00(\x2C|\x21)#s', $chunk ?: '', $matches ); + } + + fclose( $fh ); + return ( $count > 1 ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/ImagickMethod.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/ImagickMethod.php new file mode 100755 index 00000000..5ca94d3b --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/ImagickMethod.php @@ -0,0 +1,168 @@ +identifyFormat( '%n' ) > 1 ) ) { + throw new ImageAnimatedException( $source_path ); + } + + switch ( $imagick->getImageProperty( 'exif:Orientation' ) ) { + case 2: + $imagick->flopImage(); + break; + case 3: + $imagick->rotateImage( '#000000', 180 ); + break; + case 4: + $imagick->flopImage(); + $imagick->rotateImage( '#000000', 180 ); + break; + case 5: + $imagick->flopImage(); + $imagick->rotateImage( '#000000', -90 ); + break; + case 6: + $imagick->rotateImage( '#000000', 90 ); + break; + case 7: + $imagick->flopImage(); + $imagick->rotateImage( '#000000', 90 ); + break; + case 8: + $imagick->rotateImage( '#000000', -90 ); + break; + } + + return $imagick; + } catch ( \ImagickException $e ) { + throw new ImageInvalidException( $source_path ); + } + } + + /** + * {@inheritdoc} + * + * @throws ConversionErrorException + * @throws ImagickNotSupportWebpException + */ + public function convert_image_to_output( $image, string $source_path, string $output_path, string $format, array $plugin_settings ) { + $extension = self::get_format_extension( $format ); + $image = apply_filters( 'webpc_imagick_before_saving', $image, $source_path ); + $output_quality = min( $plugin_settings[ ImagesQualityOption::OPTION_NAME ], self::MAX_METHOD_QUALITY ); + + if ( ! in_array( $extension, $image->queryFormats() ) ) { + throw new ImagickNotSupportWebpException(); + } + + $image->setImageFormat( $extension ); + if ( ! in_array( ExtraFeaturesOption::OPTION_VALUE_KEEP_METADATA, $plugin_settings[ ExtraFeaturesOption::OPTION_NAME ] ) ) { + $image_profiles = $image->getImageProfiles( '*', true ); + foreach ( $image_profiles as $profile_name => $image_profile ) { + if ( ! in_array( $profile_name, self::PROTECTED_IMAGE_PROFILES ) ) { + try { + $image->removeImageProfile( $profile_name ); + } catch ( \ImagickException $e ) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedCatch + } + } + } + } + $image->setImageCompressionQuality( $output_quality ); + $blob = $image->getImageBlob(); + + if ( ! file_put_contents( $output_path, $blob ) ) { + throw new ConversionErrorException( $source_path ); + } + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/LibraryMethodAbstract.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/LibraryMethodAbstract.php new file mode 100755 index 00000000..9ae3f0f6 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/LibraryMethodAbstract.php @@ -0,0 +1,64 @@ +files_statuses[ $output_format ][ $path ] = false; + $this->convert_path( $path, $output_format, $plugin_settings ); + } + } + } + + /** + * Converts source path to output formats. + * + * @param string $source_path Server path of source image. + * @param string $output_format Extension of output format. + * @param mixed[] $plugin_settings . + * + * @return void + */ + private function convert_path( string $source_path, string $output_format, array $plugin_settings ) { + $this->server_configurator->set_memory_limit(); + $this->server_configurator->set_execution_time(); + + try { + $output_path = $this->get_image_output_path( $source_path, $output_format ); + $this->check_image_source_path( $source_path ); + + $image = $this->create_image_by_path( $source_path, $plugin_settings ); + $this->convert_image_to_output( $image, $source_path, $output_path, $output_format, $plugin_settings ); + do_action( 'webpc_after_conversion', $output_path, $source_path ); + + $this->skip_crashed->delete_crashed_file( $output_path ); + $this->skip_larger->remove_image_if_is_larger( $output_path, $source_path, $plugin_settings ); + $this->update_conversion_stats( $source_path, $output_path, $output_format ); + + $this->files_statuses[ $output_format ][ $source_path ] = true; + } catch ( OutputPathException $e ) { + $this->save_conversion_error( $e->getMessage(), $plugin_settings ); + } catch ( SourcePathException|FilesizeOversizeException $e ) { + $this->save_conversion_error( $e->getMessage(), $plugin_settings ); + $this->skip_crashed->create_crashed_file( $output_path ); + } catch ( LargerThanOriginalException $e ) { + return; + } + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/LibraryMethodInterface.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/LibraryMethodInterface.php new file mode 100755 index 00000000..c1ce5534 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/LibraryMethodInterface.php @@ -0,0 +1,32 @@ +skip_crashed = $skip_crashed; + $this->skip_larger = $skip_larger; + $this->server_configurator = $server_configurator; + $this->output_path = $output_path ?: new OutputPathGenerator( $format_factory ); + } + + /** + * @var bool + */ + protected $is_fatal_error = false; + + /** + * Messages of errors that occurred during conversion. + * + * @var string[] + */ + protected $errors = []; + + /** + * Sum of size of source images before conversion. + * + * @var int + */ + protected $size_before = 0; + + /** + * Sum of size of output images after conversion. + * + * @var int + */ + protected $size_after = 0; + + /** + * @var mixed[] + */ + protected $files_statuses = [ + WebpFormat::FORMAT_EXTENSION => [], + AvifFormat::FORMAT_EXTENSION => [], + ]; + + /** + * @return bool + */ + public static function is_pro_feature(): bool { + return false; + } + + /** + * {@inheritdoc} + */ + public function is_fatal_error(): bool { + return $this->is_fatal_error; + } + + /** + * {@inheritdoc} + */ + public function get_errors(): array { + return $this->errors; + } + + /** + * {@inheritdoc} + */ + public function get_size_before(): int { + return $this->size_before; + } + + /** + * {@inheritdoc} + */ + public function get_files_available( string $output_format ): int { + return count( $this->files_statuses[ $output_format ] ); + } + + /** + * {@inheritdoc} + */ + public function get_files_converted( string $output_format ): int { + return count( + array_filter( + $this->files_statuses[ $output_format ], + function ( $value ) { + return ( $value === true ); + } + ) + ); + } + + /** + * {@inheritdoc} + */ + public function get_size_after(): int { + return $this->size_after; + } + + /** + * Checks server path of source image. + * + * @param string $source_path Server path of source image. + * @param int|null $max_filesize Maximum allowed filesize in bytes. + * + * @throws Exception\SourcePathException + * @throws Exception\FilesizeOversizeException + */ + protected function check_image_source_path( string $source_path, ?int $max_filesize = null ): void { + if ( ! is_readable( $source_path ) ) { + throw new Exception\SourcePathException( $source_path ); + } elseif ( ( $max_filesize !== null ) && ( filesize( $source_path ) > $max_filesize ) ) { + throw new Exception\FilesizeOversizeException( [ $max_filesize, $source_path ] ); + } + } + + /** + * Returns server path for output image. + * + * @param string $source_path Server path of source image. + * @param string $format Extension of output format. + * + * @return string Server path of output image. + * + * @throws Exception\OutputPathException + */ + protected function get_image_output_path( string $source_path, string $format ): string { + if ( ! $output_path = $this->output_path->get_path( $source_path, true, $format ) ) { + throw new Exception\OutputPathException( $source_path ); + } + + return $output_path; + } + + /** + * @param string $source_path Server path of source image. + * @param string $output_path Server path of output image. + * @param string $output_format . + * + * @return void + */ + protected function update_conversion_stats( string $source_path, string $output_path, string $output_format ) { + $output_exist = file_exists( $output_path ); + $size_before = filesize( $source_path ); + $size_after = ( $output_exist ) ? filesize( $output_path ) : $size_before; + + $this->size_before += $size_before ?: 0; + $this->size_after += $size_after ?: 0; + } + + /** + * @param string $error_message . + * @param mixed[] $plugin_settings . + * @param bool $is_fatal_error . + * + * @return void + */ + protected function save_conversion_error( string $error_message, array $plugin_settings, bool $is_fatal_error = false ) { + if ( $is_fatal_error ) { + $this->is_fatal_error = true; + } + + $this->errors[] = $error_message; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/MethodFactory.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/MethodFactory.php new file mode 100755 index 00000000..3b941502 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/MethodFactory.php @@ -0,0 +1,123 @@ +token_repository = $token_repository; + $this->format_factory = $format_factory; + $this->skip_crashed = $skip_crashed ?: new CrashedFilesOperator(); + $this->skip_larger = $skip_larger ?: new LargerFilesOperator(); + $this->server_configurator = $server_configurator ?: new ServerConfigurator(); + + $this->set_integration( new ImagickMethod( $format_factory, $this->skip_crashed, $this->skip_larger, $this->server_configurator ) ); + $this->set_integration( new GdMethod( $format_factory, $this->skip_crashed, $this->skip_larger, $this->server_configurator ) ); + $this->set_integration( new RemoteMethod( $this->token_repository, $format_factory, $this->skip_crashed, $this->skip_larger, $this->server_configurator ) ); + } + + /** + * Sets integration for method. + * + * @param MethodInterface $method . + * + * @return void + */ + private function set_integration( MethodInterface $method ) { + $this->methods[ $method->get_name() ] = $method; + } + + /** + * Returns objects of conversion methods. + * + * @return MethodInterface[] . + */ + public function get_methods_objects(): array { + $values = []; + foreach ( $this->methods as $method ) { + $values[ $method->get_name() ] = $method; + } + return $values; + } + + /** + * Returns list of conversion methods. + * + * @return string[] Names of conversion methods with labels. + */ + public function get_methods(): array { + $values = []; + foreach ( $this->get_methods_objects() as $method_name => $method ) { + $values[ $method_name ] = $method->get_label(); + } + return $values; + } + + /** + * Returns list of installed conversion methods. + * + * @return string[] Names of conversion methods with labels. + */ + public function get_available_methods(): array { + $token_status = $this->token_repository->get_token()->get_valid_status(); + $values = []; + foreach ( $this->get_methods_objects() as $method_name => $method ) { + if ( ! $method::is_method_installed() + || ( ! $this->format_factory->get_available_formats( $method_name ) ) ) { + continue; + } + + if ( ( $token_status && $method::is_pro_feature() ) || ( ! $token_status && ! $method::is_pro_feature() ) ) { + $values[ $method_name ] = $method->get_label(); + } + } + return $values; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/MethodIntegrator.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/MethodIntegrator.php new file mode 100755 index 00000000..11964e3a --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/MethodIntegrator.php @@ -0,0 +1,105 @@ +plugin_data = $plugin_data; + $this->method_factory = $method_factory; + $this->stats_manager = $stats_manager ?: new StatsManager(); + } + + /** + * Initializes converting source images using active and set conversion method. + * + * @param string[] $paths Server paths for source images. + * @param bool $regenerate_force . + * @param bool $skip_server_errors . + * @param int|null $quality_level . + * + * @return mixed[]|null Results data of conversion. + */ + public function init_conversion( array $paths, bool $regenerate_force, bool $skip_server_errors = false, ?int $quality_level = null ): ?array { + if ( ! $skip_server_errors && apply_filters( 'webpc_server_errors', [], true ) ) { + return null; + } + + $method = $this->get_method_used(); + if ( $method === null ) { + return null; + } + + $plugin_settings = $this->plugin_data->get_plugin_settings(); + if ( $quality_level !== null ) { + $plugin_settings[ ImagesQualityOption::OPTION_NAME ] = $quality_level; + } + + $this->stats_manager->set_images_webp_unconverted(); + $this->stats_manager->set_images_avif_unconverted(); + + $method->convert_paths( $paths, $plugin_settings, $regenerate_force ); + return [ + 'is_fatal_error' => $method->is_fatal_error(), + 'errors' => apply_filters( 'webpc_convert_errors', $method->get_errors() ), + 'files' => [ + 'webp_available' => $method->get_files_available( WebpFormat::FORMAT_EXTENSION ), + 'webp_converted' => $method->get_files_converted( WebpFormat::FORMAT_EXTENSION ), + 'avif_available' => $method->get_files_available( AvifFormat::FORMAT_EXTENSION ), + 'avif_converted' => $method->get_files_converted( AvifFormat::FORMAT_EXTENSION ), + ], + 'size' => [ + 'before' => $method->get_size_before(), + 'after' => $method->get_size_after(), + ], + ]; + } + + /** + * Returns active and set conversion method. + * + * @return MethodInterface|null Object of conversion method. + */ + public function get_method_used(): ?MethodInterface { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + $output_formats = $plugin_settings[ OutputFormatsOption::OPTION_NAME ] ?? null; + if ( ! $output_formats ) { + return null; + } + + $method_key = $plugin_settings[ ConversionMethodOption::OPTION_NAME ] ?? null; + $methods = $this->method_factory->get_methods_objects(); + foreach ( $methods as $method_name => $method ) { + if ( $method_key === $method_name ) { + return $method; + } + } + return null; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/MethodInterface.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/MethodInterface.php new file mode 100755 index 00000000..d45fdc29 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/Method/MethodInterface.php @@ -0,0 +1,95 @@ +token_repository = $token_repository; + } + + /** + * {@inheritdoc} + */ + public function get_name(): string { + return self::METHOD_NAME; + } + + /** + * {@inheritdoc} + */ + public function get_label(): string { + if ( $this->token_repository->get_token()->get_valid_status() ) { + return __( 'Remote server', 'webp-converter-for-media' ); + } + + return sprintf( + '%1$s (%2$s)', + __( 'Remote server', 'webp-converter-for-media' ), + sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + __( 'available in %1$sthe PRO version%2$s', 'webp-converter-for-media' ), + '', + '' + ) + ); + } + + /** + * @return bool + */ + public static function is_pro_feature(): bool { + return true; + } + + /** + * {@inheritdoc} + */ + public static function is_method_installed(): bool { + return true; + } + + /** + * {@inheritdoc} + */ + public static function is_method_active( string $format ): bool { + return true; + } + + /** + * {@inheritdoc} + */ + public function convert_paths( array $paths, array $plugin_settings, bool $regenerate_force ) { + $this->server_configurator->set_memory_limit(); + $this->server_configurator->set_execution_time(); + + $output_formats = $plugin_settings[ OutputFormatsOption::OPTION_NAME ]; + $force_convert_deleted = ( ! in_array( ExtraFeaturesOption::OPTION_VALUE_ONLY_SMALLER, $plugin_settings[ ExtraFeaturesOption::OPTION_NAME ] ) ); + + $source_paths = []; + $output_paths = []; + $this->token = $this->token_repository->get_token(); + + foreach ( $output_formats as $output_format ) { + try { + $file_paths = $this->get_source_paths( $paths, $plugin_settings, $output_format ); + if ( ! $file_paths ) { + continue; + } + + foreach ( $file_paths as $file_path ) { + $this->files_statuses[ $output_format ][ $file_path ] = false; + } + + $output_paths[ $output_format ] = $this->get_output_paths( $file_paths, $output_format ); + $source_paths[ $output_format ] = $file_paths; + } catch ( ExceptionInterface $e ) { + $this->save_conversion_error( $e->getMessage(), $plugin_settings ); + } + } + + if ( ! $regenerate_force ) { + foreach ( $source_paths as $output_format => $extensions_paths ) { + foreach ( $extensions_paths as $path_index => $extensions_path ) { + if ( file_exists( $output_paths[ $output_format ][ $path_index ] ) + || ( ! $force_convert_deleted && file_exists( $output_paths[ $output_format ][ $path_index ] . '.' . LargerFilesOperator::DELETED_FILE_EXTENSION ) ) ) { + unset( $source_paths[ $output_format ][ $path_index ] ); + unset( $output_paths[ $output_format ][ $path_index ] ); + + unset( $this->files_statuses[ $output_format ][ $extensions_path ] ); + } + } + } + } + + try { + $converted_files = $this->init_connections( $source_paths, $plugin_settings, $output_paths ); + $this->save_converted_files( $converted_files, $source_paths, $output_paths, $plugin_settings ); + + if ( $this->failed_converted_source_files ) { + $converted_files = $this->init_connections( $this->failed_converted_source_files, $plugin_settings, $output_paths ); + $this->save_converted_files( $converted_files, $source_paths, $output_paths, $plugin_settings ); + } + } catch ( RemoteErrorResponseException $e ) { + $this->save_conversion_error( $e->getMessage(), $plugin_settings, true ); + } + + $this->token_repository->save_token( $this->token ); + } + + /** + * @param mixed[] $converted_files . + * @param mixed[] $source_paths . + * @param mixed[] $output_paths . + * @param mixed[] $plugin_settings . + * + * @return void + */ + private function save_converted_files( array $converted_files, array $source_paths, array $output_paths, array $plugin_settings ) { + foreach ( $converted_files as $output_format => $format_converted_files ) { + foreach ( $format_converted_files as $path_index => $converted_file ) { + $source_path = $source_paths[ $output_format ][ $path_index ]; + $output_path = $output_paths[ $output_format ][ $path_index ]; + + file_put_contents( $output_path, $converted_file ); + do_action( 'webpc_after_conversion', $output_path, $source_path ); + + try { + $this->skip_crashed->delete_crashed_file( $output_path ); + $this->skip_larger->remove_image_if_is_larger( $output_path, $source_path, $plugin_settings ); + $this->update_conversion_stats( $source_path, $output_path, $output_format ); + + $this->files_statuses[ $output_format ][ $source_path ] = true; + if ( ( $output_format === AvifFormat::FORMAT_EXTENSION ) && isset( $this->files_statuses[ WebpFormat::FORMAT_EXTENSION ][ $source_path ] ) ) { + $this->files_statuses[ WebpFormat::FORMAT_EXTENSION ][ $source_path ] = true; + } + } catch ( LargerThanOriginalException $e ) { + continue; + } + } + } + } + + /** + * @param string[] $paths . + * @param mixed[] $plugin_settings . + * @param string $output_format . + * + * @return string[] + * + * @throws OutputPathException + */ + private function get_source_paths( array $paths, array $plugin_settings, string $output_format ): array { + $max_filesize = apply_filters( 'webpc_remote_max_filesize', self::MAX_FILESIZE_BYTES ); + $source_paths = []; + + foreach ( $paths as $source_path ) { + try { + $this->check_image_source_path( $source_path, $max_filesize ); + $path_extension = strtolower( pathinfo( $source_path, PATHINFO_EXTENSION ) ); + if ( $path_extension === $output_format ) { + continue; + } + + $source_paths[] = $source_path; + } catch ( SourcePathException|FilesizeOversizeException $e ) { + $this->save_conversion_error( $e->getMessage(), $plugin_settings ); + $this->skip_crashed->create_crashed_file( $this->get_image_output_path( $source_path, $output_format ) ); + } + } + + return $source_paths; + } + + /** + * @param string[] $source_paths . + * @param string $output_format . + * + * @return string[] + * + * @throws OutputPathException + */ + private function get_output_paths( array $source_paths, string $output_format ): array { + $output_path = []; + foreach ( $source_paths as $path ) { + $output_path[] = $this->get_image_output_path( $path, $output_format ); + } + + return $output_path; + } + + /** + * @param mixed[] $source_paths . + * @param mixed[] $plugin_settings . + * @param mixed[] $output_paths . + * + * @return mixed[] + * + * @throws RemoteErrorResponseException + */ + private function init_connections( array $source_paths, array $plugin_settings, array $output_paths ): array { + $mh_items = []; + $values = []; + + $mh = curl_multi_init(); + if ( ! $mh ) { + return $values; + } + + foreach ( $source_paths as $output_format => $format_source_paths ) { + foreach ( $format_source_paths as $resource_id => $source_path ) { + $connect = $this->get_curl_connection( $source_path, $output_format, $plugin_settings ); + if ( ! $connect ) { + continue; + } + + curl_multi_add_handle( $mh, $connect ); + $mh_items[ $output_format ] = $mh_items[ $output_format ] ?? []; + $mh_items[ $output_format ][ $resource_id ] = $connect; + } + } + + $running = null; + do { + curl_multi_exec( $mh, $running ); + curl_multi_select( $mh ); + } while ( $running > 0 ); + + foreach ( $mh_items as $output_format => $format_mh_items ) { + foreach ( $format_mh_items as $resource_id => $mh_item ) { + $http_code = curl_getinfo( $mh_item, CURLINFO_HTTP_CODE ); + $response = curl_multi_getcontent( $mh_item ); + + if ( ( $http_code === 200 ) && ( strlen( $response ?: '' ) > 10 ) ) { + $values[ $output_format ] = $values[ $output_format ] ?? []; + $values[ $output_format ][ $resource_id ] = $response; + } else { + $this->handle_request_error( + $source_paths[ $output_format ][ $resource_id ], + $output_paths[ $output_format ][ $resource_id ], + $output_format, + (int) $resource_id, + $plugin_settings, + $http_code, + $response + ); + } + curl_multi_remove_handle( $mh, $mh_item ); + } + } + + curl_multi_close( $mh ); + return $values; + } + + /** + * @param string $source_path . + * @param string $output_format . + * @param mixed[] $plugin_settings . + * + * @return resource|null + */ + private function get_curl_connection( string $source_path, string $output_format, array $plugin_settings ) { + $connect = curl_init( WebpConverterConstants::API_CONVERSION_URL ); + if ( ! $connect ) { + return null; + } + + curl_setopt( $connect, CURLOPT_SSL_VERIFYPEER, false ); + curl_setopt( $connect, CURLOPT_RETURNTRANSFER, true ); + curl_setopt( $connect, CURLOPT_TIMEOUT, apply_filters( 'webpc_remote_timeout', 30 ) ); + curl_setopt( $connect, CURLOPT_POST, true ); + curl_setopt( + $connect, + CURLOPT_POSTFIELDS, + [ + 'access_token' => $plugin_settings[ AccessTokenOption::OPTION_NAME ], + 'domain_host' => parse_url( get_site_url(), PHP_URL_HOST ), + 'source_file' => curl_file_create( $source_path ), + 'output_format' => $output_format, + 'quality_level' => $plugin_settings[ ImagesQualityOption::OPTION_NAME ], + 'strip_metadata' => ( ! in_array( ExtraFeaturesOption::OPTION_VALUE_KEEP_METADATA, $plugin_settings[ ExtraFeaturesOption::OPTION_NAME ] ) ), + 'max_width' => ( $plugin_settings[ ImageResizeOption::OPTION_NAME ][0] === 'yes' ) + ? $plugin_settings[ ImageResizeOption::OPTION_NAME ][1] + : 0, + 'max_height' => ( $plugin_settings[ ImageResizeOption::OPTION_NAME ][0] === 'yes' ) + ? $plugin_settings[ ImageResizeOption::OPTION_NAME ][2] + : 0, + ] + ); + curl_setopt( + $connect, + CURLOPT_HTTPHEADER, + [ + 'Content-Type: multipart/form-data', + 'Expect:', + ] + ); + curl_setopt( $connect, CURLOPT_RETURNTRANSFER, true ); + curl_setopt( $connect, CURLOPT_HEADERFUNCTION, [ $this, 'handle_request_header' ] ); + + return $connect; + } + + /** + * @param resource $curl . + * @param string $header . + * + * @return int + */ + public function handle_request_header( $curl, string $header ): int { + $header_length = strlen( $header ); + $header_data = explode( ':', $header ); + if ( count( $header_data ) > 2 ) { + return $header_length; + } + + $header_key = strtolower( trim( $header_data[0] ) ); + if ( $header_key === WebpConverterConstants::API_RESPONSE_VALUE_LIMIT_USAGE ) { + $this->token->set_images_usage( intval( $header_data[1] ) ); + } elseif ( $header_key === WebpConverterConstants::API_RESPONSE_VALUE_LIMIT_MAX ) { + $this->token->set_images_limit( intval( $header_data[1] ) ); + } elseif ( $header_key === WebpConverterConstants::API_RESPONSE_VALUE_SUBSCRIPTION_ACTIVE ) { + $this->token->set_valid_status( ( trim( $header_data[1] ) === '1' ) ); + } + + return $header_length; + } + + /** + * @param string $source_path . + * @param string $output_path . + * @param string $output_format . + * @param int $resource_id . + * @param mixed[] $plugin_settings . + * @param int $http_code . + * @param string|null $response . + * + * @return void + * + * @throws RemoteErrorResponseException + */ + private function handle_request_error( + string $source_path, + string $output_path, + string $output_format, + int $resource_id, + array $plugin_settings, + int $http_code, + ?string $response = null + ) { + $response_value = ( $response ) ? json_decode( $response, true ) : []; + $error_message = $response_value[ WebpConverterConstants::API_RESPONSE_VALUE_ERROR_MESSAGE ] ?? ''; + $error_fatal_status = $response_value[ WebpConverterConstants::API_RESPONSE_VALUE_ERROR_FATAL_STATUS ] ?? false; + + if ( $error_message && $error_fatal_status ) { + throw new RemoteErrorResponseException( $error_message ); + } elseif ( $error_message ) { + $this->save_conversion_error( $error_message, $plugin_settings ); + } elseif ( $http_code === 200 ) { + $this->skip_crashed->create_crashed_file( $output_path ); + + if ( ! isset( $this->failed_converted_source_files[ $output_format ] ) ) { + $this->failed_converted_source_files[ $output_format ] = []; + } + $this->failed_converted_source_files[ $output_format ][ $resource_id ] = $source_path; + } else { + $this->save_conversion_error( + ( new RemoteRequestException( [ $http_code, $source_path ] ) )->getMessage(), + $plugin_settings + ); + } + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/OutputPathGenerator.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/OutputPathGenerator.php new file mode 100755 index 00000000..8b77d96a --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/OutputPathGenerator.php @@ -0,0 +1,148 @@ +format_factory = $format_factory; + } + + /** + * Generates output path from path of source image. + * + * @param string $path Server path of source image. + * @param bool $create_dir Create output directory structure? + * @param string $file_extension Output format extension. + * + * @return string|null Server path for output image. + */ + public function get_path( string $path, bool $create_dir = false, string $file_extension = '' ): ?string { + $paths = $this->get_paths( $path, $create_dir, [ $file_extension ] ); + return $paths[0] ?? null; + } + + /** + * Generates output paths from paths of source image for all output formats. + * Creates directory structure of output path, if it does not exist. + * + * @param string $path Server path of source image. + * @param bool $create_dir Create output directory structure? + * @param string[]|null $file_extensions Output format extensions. + * + * @return string[] Server paths for output images. + */ + public function get_paths( string $path, bool $create_dir = false, ?array $file_extensions = null ): array { + $new_path = $this->get_directory_path( $path ); + if ( ! $new_path || ( $create_dir && ! $this->make_directories( $this->check_directories( $new_path ) ) ) ) { + return []; + } + + $extensions = $this->format_factory->get_format_extensions(); + $path_extension = strtolower( pathinfo( $new_path, PATHINFO_EXTENSION ) ); + $paths = []; + foreach ( $extensions as $extension ) { + if ( $extension === $path_extension ) { + continue; + } + + if ( ( $file_extensions === null ) || in_array( $extension, $file_extensions, true ) ) { + $paths[] = sprintf( '%1$s.%2$s', $new_path, $extension ); + } + } + return $paths; + } + + /** + * Generates output path from path of source directory. + * + * @param string $path Server path of source directory. + * + * @return string|null Server paths for output directory. + */ + public function get_directory_path( string $path ): ?string { + $webp_root = $this->get_output_dir(); + $wp_content = $this->get_wp_content_dir(); + $output_path = str_replace( + preg_replace( '/(\/|\\\\)/', DIRECTORY_SEPARATOR, $wp_content ) ?: '', + '', + preg_replace( '/(\/|\\\\)/', DIRECTORY_SEPARATOR, $path ) ?: '' + ); + $output_path = trim( $output_path, '\/' ); + + if ( ! $output_path ) { + return null; + } + + return sprintf( '%1$s/%2$s', $webp_root, $output_path ); + } + + /** + * Checks if directories for output path exist. + * + * @param string $path Server path of output. + * + * @return string[] Directory paths to be created. + */ + private function check_directories( string $path ): array { + $current = dirname( $path ); + $paths = []; + while ( ! file_exists( $current ) ) { + $paths[] = $current; + $current = dirname( $current ); + } + return $paths; + } + + /** + * Creates new directories. + * + * @param string[] $paths Output directory paths to be created. + * + * @return bool Paths created successfully? + */ + private function make_directories( array $paths ): bool { + $paths = array_reverse( $paths ); + foreach ( $paths as $path ) { + if ( ! is_writable( dirname( $path ) ) ) { + return false; + } + mkdir( $path ); + } + return true; + } + + private function get_wp_content_dir(): string { + if ( $this->path_wp_content_dir === null ) { + $this->path_wp_content_dir = dirname( apply_filters( 'webpc_dir_path', '', 'uploads' ) ); + } + return $this->path_wp_content_dir; + } + + private function get_output_dir(): string { + if ( $this->path_output_dir === null ) { + $this->path_output_dir = apply_filters( 'webpc_dir_path', '', 'webp' ); + } + return $this->path_output_dir; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Conversion/PathsFinder.php b/wp-content/plugins/webp-converter-for-media/src/Conversion/PathsFinder.php new file mode 100755 index 00000000..69fa4a98 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Conversion/PathsFinder.php @@ -0,0 +1,275 @@ +plugin_data = $plugin_data; + $this->token_repository = $token_repository; + $this->stats_manager = $stats_manager ?: new StatsManager(); + $this->output_path = $output_path ?: new OutputPathGenerator( $format_factory ); + $this->files_finder = new DirectoryFilesFinder( $plugin_data ); + } + + /** + * Returns list of chunked server paths of source images to be converted. + * + * @param bool $skip_converted Skip converted images? + * @param string[]|null $allowed_output_formats List of extensions or use selected in plugin settings. + * + * @return mixed[] { + * @type string $path Directory path. + * @type string[] $files Files paths. + * } + */ + public function get_paths_by_chunks( bool $skip_converted = false, ?array $allowed_output_formats = null ): array { + $allowed_output_formats = $allowed_output_formats + ?: $this->plugin_data->get_plugin_settings()[ OutputFormatsOption::OPTION_NAME ]; + + $paths_chunks = $this->find_source_paths(); + $paths_chunks = $this->skip_converted_paths_chunks( $paths_chunks, $skip_converted, $allowed_output_formats ); + + $count = 0; + foreach ( $paths_chunks as $dir_data ) { + $count += count( $dir_data['files'] ); + } + + $chunk_size = $this->get_paths_chunk_size( $count ); + foreach ( $paths_chunks as $dir_name => $dir_data ) { + $paths_chunks[ $dir_name ]['files'] = array_chunk( $dir_data['files'], $chunk_size ); + } + + $this->stats_manager->set_regeneration_images( $count ); + + return $paths_chunks; + } + + /** + * @param bool $skip_converted Skip converted images? + * @param string[]|null $allowed_output_formats List of extensions or use selected in plugin settings. + * + * @return string[] Server paths of source images to be converted. + */ + public function get_paths( bool $skip_converted = false, ?array $allowed_output_formats = null ): array { + $allowed_output_formats = $allowed_output_formats + ?: $this->plugin_data->get_plugin_settings()[ OutputFormatsOption::OPTION_NAME ]; + + $paths_chunks = $this->find_source_paths(); + $paths_chunks = $this->skip_converted_paths_chunks( $paths_chunks, $skip_converted, $allowed_output_formats ); + + $paths = []; + foreach ( $paths_chunks as $dir_data ) { + foreach ( $dir_data['files'] as $source_path ) { + $paths[] = $dir_data['path'] . '/' . $source_path; + } + } + + return $paths; + } + + /** + * @param string[] $source_paths Server paths of source images. + * @param string[]|null $allowed_output_formats List of extensions or use selected in plugin settings. + * @param bool $force_convert_modified Force re-conversion of images modified after previous conversion. + * + * @return string[] Server paths of source images. + */ + public function skip_converted_paths( + array $source_paths, + ?array $allowed_output_formats = null, + bool $force_convert_modified = false + ): array { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + $allowed_output_formats = $allowed_output_formats ?: $plugin_settings[ OutputFormatsOption::OPTION_NAME ]; + $force_convert_deleted = ( ! in_array( ExtraFeaturesOption::OPTION_VALUE_ONLY_SMALLER, $plugin_settings[ ExtraFeaturesOption::OPTION_NAME ] ) ); + + foreach ( $source_paths as $path_index => $source_path ) { + $is_converted = true; + foreach ( $allowed_output_formats as $output_format ) { + $output_path = $this->output_path->get_path( $source_path, false, $output_format ); + + if ( $output_path && ! $this->is_converted_file( $source_path, $output_path, $force_convert_deleted, false, $force_convert_modified ) ) { + $is_converted = false; + break; + } + } + if ( $is_converted ) { + unset( $source_paths[ $path_index ] ); + } + } + + return $source_paths; + } + + /** + * @param mixed[] $source_dirs Server paths of source images. + * @param bool $skip_converted Skip converted images? + * @param string[]|null $allowed_output_formats List of extensions or use selected in plugin settings. + * + * @return mixed[] Server paths of source images. + */ + private function skip_converted_paths_chunks( + array $source_dirs, + bool $skip_converted, + ?array $allowed_output_formats = null + ): array { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + $allowed_output_formats = $allowed_output_formats ?: $plugin_settings[ OutputFormatsOption::OPTION_NAME ]; + $force_convert_deleted = ( ! in_array( ExtraFeaturesOption::OPTION_VALUE_ONLY_SMALLER, $plugin_settings[ ExtraFeaturesOption::OPTION_NAME ] ) ); + $force_convert_crashed = ( $plugin_settings[ ServiceModeOption::OPTION_NAME ] === 'yes' ); + + foreach ( $source_dirs as $dir_name => $dir_data ) { + foreach ( $dir_data['files'] as $path_index => $source_file ) { + $source_path = $dir_data['path'] . '/' . $source_file; + $is_converted = true; + foreach ( $allowed_output_formats as $output_format ) { + $output_path = $this->output_path->get_path( $source_path, false, $output_format ); + + if ( $output_path && ( ! $skip_converted || ! $this->is_converted_file( $source_path, $output_path, $force_convert_deleted, $force_convert_crashed ) ) ) { + $is_converted = false; + break; + } + } + if ( $is_converted ) { + unset( $source_dirs[ $dir_name ]['files'][ $path_index ] ); + } + } + } + + return $source_dirs; + } + + /** + * Returns list of server paths of source images to be converted. + * + * @return mixed[] { + * @type string $path Directory path. + * @type string[] $files Files paths. + * } + */ + private function find_source_paths(): array { + $settings = $this->plugin_data->get_plugin_settings(); + + $source_dirs = []; + foreach ( $settings[ SupportedDirectoriesOption::OPTION_NAME ] as $dir_name ) { + $source_dirs[ $dir_name ] = apply_filters( 'webpc_dir_path', '', $dir_name ); + } + + $list = []; + foreach ( $source_dirs as $dir_name => $dir_path ) { + $list[ $dir_name ] = [ + 'path' => $dir_path, + 'files' => $this->files_finder->get_files_by_directory( $dir_path ), + ]; + } + + return $list; + } + + /** + * @param string $source_path . + * @param string $output_path . + * @param bool $force_convert_deleted Skip .deleted files. + * @param bool $force_convert_crashed Skip .crashed files. + * @param bool $force_convert_modified . + * + * @return bool + */ + private function is_converted_file( + string $source_path, + string $output_path, + bool $force_convert_deleted, + bool $force_convert_crashed, + bool $force_convert_modified = false + ): bool { + if ( file_exists( $output_path ) ) { + return ( $force_convert_modified ) ? ( filemtime( $source_path ) <= filemtime( $output_path ) ) : true; + } elseif ( ! $force_convert_deleted && file_exists( $output_path . '.' . LargerFilesOperator::DELETED_FILE_EXTENSION ) ) { + return true; + } elseif ( ! $force_convert_crashed && file_exists( $output_path . '.' . CrashedFilesOperator::CRASHED_FILE_EXTENSION ) ) { + return true; + } + + return false; + } + + /** + * @param int $paths_count . + * + * @return int<1, max> + */ + private function get_paths_chunk_size( int $paths_count ): int { + $settings = $this->plugin_data->get_plugin_settings(); + if ( $settings[ ServiceModeOption::OPTION_NAME ] === 'yes' ) { + return ( self::PATHS_PER_REQUEST_REMOTE_LARGE * 2 ); + } + + if ( $settings[ ConversionMethodOption::OPTION_NAME ] !== RemoteMethod::METHOD_NAME ) { + return self::PATHS_PER_REQUEST_LOCAL; + } + + $output_formats = count( $settings[ OutputFormatsOption::OPTION_NAME ] ) ?: 1; + $images_count = $paths_count * $output_formats; + $images_limit = $this->token_repository->get_token()->get_images_limit(); + $images_to_conversion = min( $images_count, $images_limit ); + + if ( $images_to_conversion <= 10000 ) { + return self::PATHS_PER_REQUEST_REMOTE_SMALL; + } elseif ( $images_to_conversion <= 120000 ) { + return self::PATHS_PER_REQUEST_REMOTE_MEDIUM; + } else { + return self::PATHS_PER_REQUEST_REMOTE_LARGE; + } + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Detector/CloudflareStatusDetector.php b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/CloudflareStatusDetector.php new file mode 100755 index 00000000..a974fe24 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/CloudflareStatusDetector.php @@ -0,0 +1,40 @@ +plugin_data = $plugin_data; + } + + /** + * {@inheritdoc} + */ + public function get_error() { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + if ( ! $plugin_settings[ CloudflareZoneIdOption::OPTION_NAME ] ) { + return null; + } + + if ( OptionsAccessManager::get_option( CloudflareConfigurator::REQUEST_CACHE_PURGE_OPTION, 'yes' ) !== 'yes' ) { + return new CloudflareSettingsIncorrectNotice(); + } + + return null; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Detector/CurlLibraryDetector.php b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/CurlLibraryDetector.php new file mode 100755 index 00000000..10e11aa2 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/CurlLibraryDetector.php @@ -0,0 +1,28 @@ +plugin_data = $plugin_data; + } + + /** + * {@inheritdoc} + */ + public function get_error() { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + if ( $plugin_settings[ ConversionMethodOption::OPTION_NAME ] === RemoteMethod::METHOD_NAME ) { + return null; + } + + if ( GdMethod::is_method_installed() || ImagickMethod::is_method_installed() ) { + return null; + } + + return new LibsNotInstalledNotice(); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Detector/LibsWithoutWebpSupportDetector.php b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/LibsWithoutWebpSupportDetector.php new file mode 100755 index 00000000..24da73a6 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/LibsWithoutWebpSupportDetector.php @@ -0,0 +1,43 @@ +plugin_data = $plugin_data; + } + + /** + * {@inheritdoc} + */ + public function get_error() { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + if ( $plugin_settings[ ConversionMethodOption::OPTION_NAME ] === RemoteMethod::METHOD_NAME ) { + return null; + } + + if ( GdMethod::is_method_active( WebpFormat::FORMAT_EXTENSION ) + || ImagickMethod::is_method_active( WebpFormat::FORMAT_EXTENSION ) ) { + return null; + } + + return new LibsWithoutWebpSupportNotice(); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Detector/PassthruExecutionDetector.php b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/PassthruExecutionDetector.php new file mode 100755 index 00000000..6e2c8bdd --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/PassthruExecutionDetector.php @@ -0,0 +1,88 @@ +plugin_info = $plugin_info; + $this->plugin_data = $plugin_data; + $this->format_factory = $format_factory; + } + + /** + * {@inheritdoc} + */ + public function get_error() { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + if ( $plugin_settings[ LoaderTypeOption::OPTION_NAME ] !== PassthruLoader::LOADER_TYPE ) { + return null; + } + + do_action( LoaderAbstract::ACTION_NAME, true, true ); + + $has_error = false; + if ( $this->if_passthru_execution_allowed() !== true ) { + $has_error = true; + } + + do_action( LoaderAbstract::ACTION_NAME, true ); + + return ( $has_error ) ? new PassthruExecutionNotice() : null; + } + + /** + * Checks if PHP file required for Passthru loader is available. + * + * @return bool Verification status. + */ + private function if_passthru_execution_allowed(): bool { + $loader = new PassthruLoader( $this->plugin_info, $this->plugin_data, $this->format_factory ); + if ( $loader->is_active_loader() !== true ) { + return true; + } + + $url = $loader::get_loader_url() . '?nocache=1'; + $ch = curl_init( $url ); + if ( $ch === false ) { + return false; + } + + curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); + curl_setopt( $ch, CURLOPT_NOBODY, true ); + curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false ); + curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 ); + curl_setopt( $ch, CURLOPT_TIMEOUT, 3 ); + curl_exec( $ch ); + $code = curl_getinfo( $ch, CURLINFO_HTTP_CODE ); + curl_close( $ch ); + + return ( $code === 200 ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Detector/PathsErrorsDetector.php b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/PathsErrorsDetector.php new file mode 100755 index 00000000..8a855ccd --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/PathsErrorsDetector.php @@ -0,0 +1,78 @@ +if_uploads_path_exists() !== true ) { + return new PathUploadsUnavailableNotice(); + } elseif ( $this->if_htaccess_is_writeable() !== true ) { + return new PathHtaccessNotWritableNotice(); + } elseif ( $this->if_paths_are_different() !== true ) { + return new PathWebpDuplicatedNotice(); + } elseif ( $this->if_webp_path_is_writeable() !== true ) { + return new PathWebpNotWritableNotice(); + } + + return null; + } + + /** + * Checks if path of uploads directory is exists. + * + * @return bool Verification status. + */ + private function if_uploads_path_exists(): bool { + $path = apply_filters( 'webpc_dir_path', '', 'uploads' ); + return ( is_dir( $path ) && ( $path !== PathsGenerator::get_wordpress_root_path() ) ); + } + + /** + * Checks if paths of wp-content and uploads directories are writable. + * + * @return bool Verification status. + */ + private function if_htaccess_is_writeable(): bool { + $path_dir = apply_filters( 'webpc_dir_path', '', 'uploads' ); + $path_file = $path_dir . '/.htaccess'; + if ( file_exists( $path_file ) ) { + return ( is_readable( $path_file ) && is_writable( $path_file ) ); + } else { + return is_writable( $path_dir ); + } + } + + /** + * Checks if uploads directory path and output directory are different. + * + * @return bool Verification status. + */ + private function if_paths_are_different(): bool { + $path_uploads = apply_filters( 'webpc_dir_path', '', 'uploads' ); + $path_webp = apply_filters( 'webpc_dir_path', '', 'webp' ); + return ( $path_uploads !== $path_webp ); + } + + /** + * Checks if path of output directory is writable. + * + * @return bool Verification status. + */ + private function if_webp_path_is_writeable(): bool { + $path = apply_filters( 'webpc_dir_path', '', 'webp' ); + return ( is_dir( $path ) || is_writable( dirname( $path ) ) ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Detector/RewritesErrorsDetector.php b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/RewritesErrorsDetector.php new file mode 100755 index 00000000..48736f1c --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/RewritesErrorsDetector.php @@ -0,0 +1,317 @@ +plugin_info = $plugin_info; + $this->plugin_data = $plugin_data; + $this->file_loader = $file_loader ?: new FileLoader(); + $this->output_path = $output_path ?: new OutputPathGenerator( $format_factory ); + $this->test_version = uniqid(); + } + + /** + * {@inheritdoc} + */ + public function get_error() { + $this->convert_images_for_debug(); + + do_action( LoaderAbstract::ACTION_NAME, true, true ); + $error = $this->detect_rewrites_error(); + do_action( LoaderAbstract::ACTION_NAME, true ); + + return $error; + } + + /** + * @return NoticeInterface|null + */ + private function detect_rewrites_error() { + $settings = $this->plugin_data->get_plugin_settings(); + $loader_type = $settings[ LoaderTypeOption::OPTION_NAME ] ?? ''; + + switch ( $loader_type ) { + case HtaccessLoader::LOADER_TYPE: + case HtaccessBypassingLoader::LOADER_TYPE: + if ( $this->if_redirects_are_works() === true ) { + break; + } + + if ( $this->if_htaccess_can_be_overwritten() !== true ) { + return new RewritesNotExecutedNotice(); + } elseif ( $this->if_bypassing_apache_is_active() === true ) { + return new BypassingApacheNotice(); + } elseif ( $this->if_redirects_for_plugins_are_works() === true ) { + return new RewritesUploadsBlockedNotice(); + } + + return new RewritesNotWorkingNotice(); + case PassthruLoader::LOADER_TYPE: + if ( $this->if_redirects_are_works() === true ) { + break; + } + + return new PassthruNotWorkingNotice(); + } + + $this->test_version = uniqid(); + if ( $this->if_redirects_are_cached() === true ) { + return new RewritesCachedNotice(); + } + + return null; + } + + /** + * Converts and saves files needed for testing. + * + * @return void + */ + private function convert_images_for_debug() { + $uploads_dir = apply_filters( 'webpc_dir_path', '', 'uploads' ); + if ( ! is_writable( $uploads_dir ) ) { + return; + } + + $path_file_png = $uploads_dir . self::PATH_OUTPUT_FILE_PNG; + $path_file_png2 = $uploads_dir . self::PATH_OUTPUT_FILE_PNG2; + $path_file_plugins = apply_filters( 'webpc_dir_path', '', 'plugins' ) . self::PATH_OUTPUT_FILE_PLUGINS; + $file_statuses = []; + + if ( ! file_exists( $path_file_png ) || ! file_exists( $path_file_png2 ) ) { + $file_statuses[] = copy( $this->plugin_info->get_plugin_directory_path() . self::PATH_SOURCE_FILE_PNG, $path_file_png ); + $file_statuses[] = copy( $this->plugin_info->get_plugin_directory_path() . self::PATH_SOURCE_FILE_PNG, $path_file_png2 ); + } else { + $file_statuses[] = true; + $file_statuses[] = true; + } + + if ( ( $output_path = $this->output_path->get_path( $path_file_png, true, WebpFormat::FORMAT_EXTENSION ) ) + && ! file_exists( $output_path ) ) { + $file_statuses[] = copy( $this->plugin_info->get_plugin_directory_path() . self::PATH_SOURCE_FILE_WEBP, $output_path ); + } else { + $file_statuses[] = true; + } + if ( ( $output_path = $this->output_path->get_path( $path_file_png, true, AvifFormat::FORMAT_EXTENSION ) ) + && ! file_exists( $output_path ) ) { + $file_statuses[] = copy( $this->plugin_info->get_plugin_directory_path() . self::PATH_SOURCE_FILE_AVIF, $output_path ); + } else { + $file_statuses[] = true; + } + if ( ( $output_path = $this->output_path->get_path( $path_file_png2, true, WebpFormat::FORMAT_EXTENSION ) ) + && ! file_exists( $output_path ) ) { + $file_statuses[] = copy( $this->plugin_info->get_plugin_directory_path() . self::PATH_SOURCE_FILE_WEBP, $output_path ); + } else { + $file_statuses[] = true; + } + + if ( ( $output_path = $this->output_path->get_path( $path_file_plugins, true, WebpFormat::FORMAT_EXTENSION ) ) + && ! file_exists( $output_path ) ) { + $file_statuses[] = copy( $this->plugin_info->get_plugin_directory_path() . self::PATH_SOURCE_FILE_WEBP, $output_path ); + } else { + $file_statuses[] = true; + } + + if ( in_array( false, $file_statuses, true ) ) { + $GLOBALS[ FileLoader::GLOBAL_LOGS_VARIABLE ][] = [ + 'context' => __FUNCTION__, + 'status' => $file_statuses, + ]; + } + } + + /** + * Checks if redirects to output images are works. + * + * @return bool + */ + private function if_redirects_are_works(): bool { + $uploads_dir = apply_filters( 'webpc_dir_path', '', 'uploads' ); + $uploads_url = apply_filters( 'webpc_dir_url', '', 'uploads' ); + + $file_size = $this->file_loader->get_file_size_by_path( + $uploads_dir . self::PATH_OUTPUT_FILE_PNG + ); + $file_webp = $this->file_loader->get_file_size_by_url( + $uploads_url . self::PATH_OUTPUT_FILE_PNG, + true, + $this->test_version, + __FUNCTION__ + ); + if ( $file_webp > 0 ) { + return ( $file_webp < $file_size ); + } + + $file_png_status = $this->file_loader->get_file_status_by_url( + $uploads_url . self::PATH_OUTPUT_FILE_PNG, + false, + $this->test_version, + __FUNCTION__ + ); + if ( $file_png_status === 500 ) { + return false; + } + + $file_webp_status = $this->file_loader->get_file_status_by_url( + $uploads_url . self::PATH_OUTPUT_FILE_PNG, + true, + $this->test_version, + __FUNCTION__ + ); + if ( ( $file_png_status === 200 ) && ( $file_webp_status === 404 ) ) { + return false; + } + + return true; + } + + /** + * Checks if server supports using .htaccess files from custom locations. + * + * @return bool + */ + private function if_htaccess_can_be_overwritten(): bool { + $file_status = $this->file_loader->get_file_status_by_url( + $this->plugin_info->get_plugin_directory_url() . self::URL_DEBUG_HTACCESS_FILE, + true, + $this->test_version, + __FUNCTION__ + ); + + return ( in_array( $file_status, [ 403, 404 ] ) ); + } + + /** + * Checks if bypassing of redirects to output images is exists. + * + * @return bool + */ + private function if_bypassing_apache_is_active(): bool { + $uploads_url = apply_filters( 'webpc_dir_url', '', 'uploads' ); + + $file_png = $this->file_loader->get_file_size_by_url( + $uploads_url . self::PATH_OUTPUT_FILE_PNG, + true, + $this->test_version, + __FUNCTION__ + ); + $file_png2 = $this->file_loader->get_file_size_by_url( + $uploads_url . self::PATH_OUTPUT_FILE_PNG2, + true, + $this->test_version, + __FUNCTION__ + ); + + return ( $file_png > $file_png2 ); + } + + /** + * Checks if redirects to output images from /plugins directory are works. + * + * @return bool + */ + private function if_redirects_for_plugins_are_works(): bool { + $uploads_dir = apply_filters( 'webpc_dir_path', '', 'plugins' ); + $uploads_url = apply_filters( 'webpc_dir_url', '', 'plugins' ); + + $file_size = $this->file_loader->get_file_size_by_path( + $uploads_dir . self::PATH_OUTPUT_FILE_PLUGINS + ); + $file_webp = $this->file_loader->get_file_size_by_url( + $uploads_url . self::PATH_OUTPUT_FILE_PLUGINS, + true, + $this->test_version, + __FUNCTION__ + ); + + return ( ( $file_webp < $file_size ) && ( $file_webp !== 0 ) ); + } + + /** + * Checks if redirects to output images are cached. + * + * @return bool + */ + private function if_redirects_are_cached(): bool { + $uploads_url = apply_filters( 'webpc_dir_url', '', 'uploads' ); + + $file_webp = $this->file_loader->get_file_size_by_url( + $uploads_url . self::PATH_OUTPUT_FILE_PNG, + true, + $this->test_version, + __FUNCTION__ + ); + $file_original = $this->file_loader->get_file_size_by_url( + $uploads_url . self::PATH_OUTPUT_FILE_PNG, + false, + $this->test_version, + __FUNCTION__ + ); + + return ( ( $file_webp > 0 ) && ( $file_webp === $file_original ) ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Detector/SettingsIncorrectDetector.php b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/SettingsIncorrectDetector.php new file mode 100755 index 00000000..da9a391b --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/SettingsIncorrectDetector.php @@ -0,0 +1,70 @@ +plugin_data = $plugin_data; + } + + /** + * {@inheritdoc} + */ + public function get_error() { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + + if ( ! $plugin_settings[ ImagesQualityOption::OPTION_NAME ] ) { + return new SettingsIncorrectNotice( + ImagesQualityOption::get_label(), + GeneralSettingsPage::get_label() + ); + } elseif ( ! $plugin_settings[ OutputFormatsOption::OPTION_NAME ] ) { + return new SettingsIncorrectNotice( + OutputFormatsOption::get_label(), + GeneralSettingsPage::get_label() + ); + } elseif ( ! $plugin_settings[ SupportedDirectoriesOption::OPTION_NAME ] ) { + return new SettingsIncorrectNotice( + SupportedDirectoriesOption::get_label(), + GeneralSettingsPage::get_label() + ); + } elseif ( ! $plugin_settings[ SupportedExtensionsOption::OPTION_NAME ] ) { + return new SettingsIncorrectNotice( + SupportedExtensionsOption::get_label(), + AdvancedSettingsPage::get_label() + ); + } elseif ( ! $plugin_settings[ ConversionMethodOption::OPTION_NAME ] ) { + return new SettingsIncorrectNotice( + ConversionMethodOption::get_label(), + AdvancedSettingsPage::get_label() + ); + } elseif ( ! $plugin_settings[ LoaderTypeOption::OPTION_NAME ] ) { + return new SettingsIncorrectNotice( + LoaderTypeOption::get_label(), + AdvancedSettingsPage::get_label() + ); + } + + return null; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Detector/TokenStatusDetector.php b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/TokenStatusDetector.php new file mode 100755 index 00000000..f5723629 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/TokenStatusDetector.php @@ -0,0 +1,66 @@ +plugin_data = $plugin_data; + $this->token_repository = $token_repository ?: new TokenRepository(); + $this->token_validator = $token_validator ?: new TokenValidator( $token_repository ); + } + + /** + * {@inheritdoc} + */ + public function get_error() { + $settings = $this->plugin_data->get_plugin_settings(); + if ( ! isset( $settings[ AccessTokenOption::OPTION_NAME ] ) || ! $settings[ AccessTokenOption::OPTION_NAME ] ) { + return null; + } + + $token = $this->token_repository->get_token(); + if ( ! $token->get_valid_status() ) { + return new AccessTokenInvalidNotice(); + } + + if ( ! $token->is_active() ) { + $token = $this->token_validator->validate_token( $token->get_token_value() ); + } + + if ( ! $token->is_active() ) { + return new ApiLimitExceededNotice(); + } + + return null; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Detector/UnsupportedServerDetector.php b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/UnsupportedServerDetector.php new file mode 100755 index 00000000..f01546fd --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Detector/UnsupportedServerDetector.php @@ -0,0 +1,22 @@ +plugin_info = $plugin_info; + $this->plugin_data = $plugin_data; + $this->format_factory = $format_factory; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_filter( 'webpc_server_errors', [ $this, 'get_server_errors' ], 10, 2 ); + add_filter( 'webpc_server_errors_messages', [ $this, 'get_server_errors_messages' ], 10, 1 ); + } + + /** + * Returns list of errors codes for server configuration. + * + * @param string[] $values Default value of filter. + * @param bool $only_errors Only errors, no warnings? + * + * @return string[] + */ + public function get_server_errors( array $values, bool $only_errors = false ): array { + $error_codes = $this->get_cached_error_codes(); + + return array_filter( + $error_codes, + function ( $error ) use ( $only_errors ) { + return ( ! $only_errors || ! in_array( $error, $this->not_fatal_errors ) ); + } + ); + } + + /** + * Returns list of errors messages for server configuration. + * + * @param string[] $values Default value of filter. + * + * @return string[][] + */ + public function get_server_errors_messages( array $values ): array { + $detected_errors = $this->get_errors_list(); + $this->cache_errors( $detected_errors ); + + $error_messages = []; + foreach ( $detected_errors as $error ) { + $error_messages[] = $error->get_message(); + } + return $error_messages; + } + + /** + * @return string[] + */ + private function get_cached_error_codes(): array { + $error_codes = []; + + if ( $this->cached_errors !== null ) { + foreach ( $this->cached_errors as $error ) { + $error_codes[] = $error->get_key(); + } + } else { + $error_codes = OptionsAccessManager::get_option( self::ERRORS_CACHE_OPTION, [] ); + } + + return $error_codes; + } + + /** + * @param NoticeInterface[] $detected_errors . + * + * @return void + */ + private function cache_errors( array $detected_errors ) { + $error_codes = []; + foreach ( $detected_errors as $error ) { + $error_codes[] = $error->get_key(); + } + + OptionsAccessManager::update_option( self::ERRORS_CACHE_OPTION, $error_codes ); + } + + /** + * Checks for configuration errors according to specified logic. + * Saves errors to cache. + * + * @return NoticeInterface[] + */ + private function get_errors_list(): array { + if ( $this->cached_errors !== null ) { + return $this->cached_errors; + } + + $this->pause_duplicated_detection(); + $this->cached_errors = []; + + if ( $new_error = ( new UnsupportedServerDetector() )->get_error() ) { + $this->cached_errors[] = $new_error; + return $this->cached_errors; + } + + if ( $new_error = ( new TokenStatusDetector( $this->plugin_data ) )->get_error() ) { + $this->cached_errors[] = $new_error; + } elseif ( $new_error = ( new LibsNotInstalledDetector( $this->plugin_data ) )->get_error() ) { + $this->cached_errors[] = $new_error; + } elseif ( $new_error = ( new LibsWithoutWebpSupportDetector( $this->plugin_data ) )->get_error() ) { + $this->cached_errors[] = $new_error; + } + + if ( $new_error = ( new PathsErrorsDetector() )->get_error() ) { + $this->cached_errors[] = $new_error; + } + + if ( $new_error = ( new PassthruExecutionDetector( $this->plugin_info, $this->plugin_data, $this->format_factory ) )->get_error() ) { + $this->cached_errors[] = $new_error; + } elseif ( $new_error = ( new RewritesErrorsDetector( $this->plugin_info, $this->plugin_data, $this->format_factory ) )->get_error() ) { + $this->cached_errors[] = $new_error; + } elseif ( $new_error = ( new CurlLibraryDetector() )->get_error() ) { + $this->cached_errors[] = $new_error; + } + + if ( $this->cached_errors ) { + return $this->cached_errors; + } + + if ( $new_error = ( new SettingsIncorrectDetector( $this->plugin_data ) )->get_error() ) { + $this->cached_errors[] = $new_error; + } + if ( $new_error = ( new CloudflareStatusDetector( $this->plugin_data ) )->get_error() ) { + $this->cached_errors[] = $new_error; + } + + return $this->cached_errors; + } + + /** + * @return void + */ + private function pause_duplicated_detection() { + $current_date = ( new \DateTime() )->format( 'Uv' ); + $cached_date = get_site_transient( self::ERROR_DETECTOR_DATE_TRANSIENT ); + if ( $cached_date && ( $cached_date >= ( $current_date - 1000 ) ) ) { + sleep( 1 ); + $current_date = ( new \DateTime() )->format( 'Uv' ); + } + + set_site_transient( self::ERROR_DETECTOR_DATE_TRANSIENT, $current_date ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/AccessTokenInvalidNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/AccessTokenInvalidNotice.php new file mode 100755 index 00000000..000b0767 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/AccessTokenInvalidNotice.php @@ -0,0 +1,40 @@ +', + '' + ), + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/ApiLimitExceededNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/ApiLimitExceededNotice.php new file mode 100755 index 00000000..875277c1 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/ApiLimitExceededNotice.php @@ -0,0 +1,33 @@ +', + '' + ), + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/BypassingApacheNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/BypassingApacheNotice.php new file mode 100755 index 00000000..f4f7e326 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/BypassingApacheNotice.php @@ -0,0 +1,82 @@ +' . __( 'Please check %1$sour instruction%2$s which should help you solve your problem. This will allow the plugin to function properly.', 'webp-converter-for-media' ) . '', + '', + '' + ), + __( 'If you have trouble solving this problem, please, contact your hosting\'s technical support and provide them with the following message:', 'webp-converter-for-media' ), + ] + ), + implode( + '', + [ + '' . implode( + ' ', + [ + sprintf( + /* translators: %1$s: setting name, %2$s: setting name, %3$s: home URL */ + __( 'I would like to disable %1$s (or %2$s) for static content files like .jpg, .jpeg, .png, .gif and .webp on my website - %3$s. These files should have been handled by the Apache server instead of Nginx.', 'webp-converter-for-media' ), + 'Nginx Caching / Nginx Reverse Proxy', + 'Nginx Direct Delivery', + get_home_url() + ), + sprintf( + /* translators: %s: anchor tag */ + __( 'You can find more information in the instruction: %s', 'webp-converter-for-media' ), + 'https://url.mattplugins.com/converter-error-bypassing-apache-message' + ), + ] + ) . '', + ] + ), + sprintf( + /* translators: %1$s: open strong tag, %2$s: close strong tag */ + __( '%1$sPlease, copy the above message and send it to the technical support of your hosting.%2$s They should help you in this matter.', 'webp-converter-for-media' ), + '', + '' + ), + sprintf( + /* translators: %1$s: open strong tag, %2$s: close strong tag, %3$s: field value, %4$s: field label, %5$s: open anchor tag, %6$s: settings tab label, %7$s: close anchor tag */ + __( '%1$sThe alternative solution to avoid this problem%2$s may be to set the %3$s option for the %4$s field in %5$sthe %6$s tab%7$s.', 'webp-converter-for-media' ), + '', + '', + '"' . __( 'Bypassing Nginx', 'webp-converter-for-media' ) . '"', + '"' . LoaderTypeOption::get_label() . '"', + '', + AdvancedSettingsPage::get_label(), + '' + ), + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/CloudflareSettingsIncorrectNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/CloudflareSettingsIncorrectNotice.php new file mode 100755 index 00000000..4bf2a1cc --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/CloudflareSettingsIncorrectNotice.php @@ -0,0 +1,40 @@ +', + '' + ), + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/CurlFunctionDisabledNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/CurlFunctionDisabledNotice.php new file mode 100755 index 00000000..56766414 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/CurlFunctionDisabledNotice.php @@ -0,0 +1,41 @@ +disabled_function = $disabled_function; + } + + /** + * {@inheritdoc} + */ + public function get_key(): string { + return self::ERROR_KEY; + } + + /** + * {@inheritdoc} + */ + public function get_message(): array { + return [ + sprintf( + /* translators: %s: PHP function name */ + __( 'It appears that either the %s function is disabled on your server (it is listed in the disable_functions list in your PHP configuration) or the cURL library in PHP is not available on your server. This PHP function is required for the plugin to function properly.', 'webp-converter-for-media' ), + $this->disabled_function + ), + __( 'In this case, please, contact your server administrator.', 'webp-converter-for-media' ), + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/LibsNotInstalledNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/LibsNotInstalledNotice.php new file mode 100755 index 00000000..4c5d363d --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/LibsNotInstalledNotice.php @@ -0,0 +1,45 @@ +', + '' + ), + ]; + + if ( function_exists( 'curl_init' ) ) { + $message[] = sprintf( + /* translators: %1$s: open strong tag, %2$s: close strong tag, %3$s: open anchor tag, %4$s: close anchor tag */ + __( '%1$sHowever, we have a solution for you!%2$s You can activate %3$sthe PRO version%4$s of the plugin that allows you to convert images using a remote server. This will allow you to convert images without any problems and speed up your website now.', 'webp-converter-for-media' ), + '', + '', + '', + '' + ); + } + + return $message; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/LibsWithoutWebpSupportNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/LibsWithoutWebpSupportNotice.php new file mode 100755 index 00000000..70d804db --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/LibsWithoutWebpSupportNotice.php @@ -0,0 +1,45 @@ +', + '' + ), + ]; + + if ( function_exists( 'curl_init' ) ) { + $message[] = sprintf( + /* translators: %1$s: open strong tag, %2$s: close strong tag, %3$s: open anchor tag, %4$s: close anchor tag */ + __( '%1$sHowever, we have a solution for you!%2$s You can activate %3$sthe PRO version%4$s of the plugin that allows you to convert images using a remote server. This will allow you to convert images without any problems and speed up your website now.', 'webp-converter-for-media' ), + '', + '', + '', + '' + ); + } + + return $message; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/NoticeInterface.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/NoticeInterface.php new file mode 100755 index 00000000..870e6071 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/NoticeInterface.php @@ -0,0 +1,19 @@ +' . $passthru_url . '', + '

' + ), + __( 'In this case, please, contact your server administrator.', 'webp-converter-for-media' ), + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/PassthruNotWorkingNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/PassthruNotWorkingNotice.php new file mode 100755 index 00000000..a3217dc8 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/PassthruNotWorkingNotice.php @@ -0,0 +1,31 @@ +' . apply_filters( 'webpc_dir_path', '', 'uploads' ) . '/.htaccess' + ), + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/PathUploadsUnavailableNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/PathUploadsUnavailableNotice.php new file mode 100755 index 00000000..44c70eb6 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/PathUploadsUnavailableNotice.php @@ -0,0 +1,34 @@ +webpc_dir_path', + '' . apply_filters( 'webpc_dir_path', '', 'uploads' ) . '', + '', + '' + ), + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/PathWebpDuplicatedNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/PathWebpDuplicatedNotice.php new file mode 100755 index 00000000..5ec91f0b --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/PathWebpDuplicatedNotice.php @@ -0,0 +1,32 @@ +webpc_dir_path', + '' . apply_filters( 'webpc_dir_path', '', 'uploads' ) . '' + ), + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/PathWebpNotWritableNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/PathWebpNotWritableNotice.php new file mode 100755 index 00000000..e346d83b --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/PathWebpNotWritableNotice.php @@ -0,0 +1,34 @@ +webpc_dir_path', + '' . apply_filters( 'webpc_dir_path', '', 'webp' ) . '', + '', + '' + ), + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/RewritesCachedNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/RewritesCachedNotice.php new file mode 100755 index 00000000..c95623aa --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/RewritesCachedNotice.php @@ -0,0 +1,77 @@ +', + 'BunnyCDN', + '', + '', + '' + ); + } + + $message[] = implode( + '', + [ + '' . __( 'Please, contact your hosting\'s technical support or CDN\'s support and send them the following message:', 'webp-converter-for-media' ) . '', + '' . implode( + '
', + [ + sprintf( + /* translators: %1$s: home URL */ + __( 'I have a problem with the cache for HTTP requests on my website - %1$s. This prevents JPEG or PNG files from being dynamically redirected to WebP or AVIF, depending on whether the browser supports the format. Here are potential sources of this issue:', 'webp-converter-for-media' ), + get_home_url() + ), + sprintf( + /* translators: %1$s: header name, %2$s: additional information */ + __( '- the server or CDN server does not support the %1$s HTTP header or handles it incorrectly (%2$s)', 'webp-converter-for-media' ), + '"Vary: Accept"', + __( 'the cache for redirects should be based not only on the URL to the file, but also on the value of the Accept header sent by the browser', 'webp-converter-for-media' ) + ), + sprintf( + /* translators: %1$s: header name, %2$s: additional information */ + __( '- the server or CDN server does not support the %1$s HTTP header or handles it incorrectly (%2$s)', 'webp-converter-for-media' ), + '"Cache-Control: private"', + __( 'this header should be able to disable caching for static files on the CDN server or proxy server', 'webp-converter-for-media' ) + ), + sprintf( + /* translators: %s: anchor tag */ + __( '- the website is running on the Nginx server without support for .htaccess files and not all the steps described in our instruction (%s) have been followed correctly', 'webp-converter-for-media' ), + 'https://url.mattplugins.com/converter-error-rewrites-cached-nginx-instruction' + ), + ] + ) . '
', + ] + ); + + return $message; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/RewritesNotExecutedNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/RewritesNotExecutedNotice.php new file mode 100755 index 00000000..4f8d687b --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/RewritesNotExecutedNotice.php @@ -0,0 +1,85 @@ +get_nginx_server_name(); + $message = []; + + if ( $server_name === null ) { + $message[] = __( 'It appears that your server does not support using .htaccess files from custom locations, or it requires additional configuration for the plugin to function properly.', 'webp-converter-for-media' ); + $message[] = sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + __( 'Please check %1$sour instruction%2$s which should help you solve your problem. This will allow the plugin to function properly.', 'webp-converter-for-media' ), + '', + '' + ); + } else { + $message[] = sprintf( + /* translators: %1$s: server name */ + __( 'For the %1$s server, please contact your hosting\'s technical support to allow the plugin to function properly. Your server needs additional configuration, but your hosting\'s technical support will take care of it for you. Please, send them the following message:', 'webp-converter-for-media' ), + $server_name + ); + $message[] = implode( + '', + [ + '', + sprintf( + /* translators: %1$s: plugin name, %2$s: home URL */ + __( 'I am trying to configure the %1$s plugin that supports the WebP and AVIF format. I need your help in adding the required rules to the Nginx configuration of my website - %2$s.', 'webp-converter-for-media' ), + 'Converter for Media', + get_home_url() + ), + ' ', + sprintf( + /* translators: %s: anchor tag */ + __( 'You can find more information in the instruction: %s', 'webp-converter-for-media' ), + 'https://url.mattplugins.com/converter-error-rewrites-not-executed-message', + 'Configuration for Nginx' + ), + '', + ] + ); + $message[] = sprintf( + /* translators: %1$s: open strong tag, %2$s: close strong tag */ + __( '%1$sPlease, copy the above message and send it to the technical support of your hosting.%2$s They should help you in this matter.', 'webp-converter-for-media' ), + '', + '' + ); + } + + return $message; + } + + /** + * @return string|null + */ + private function get_nginx_server_name() { + if ( getenv( 'IS_WPE' ) ) { + return 'WP Engine'; + } elseif ( strpos( strtolower( $_SERVER['SERVER_SOFTWARE'] ?? '' ), 'nginx' ) !== false ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput + return 'Nginx'; + } elseif ( strpos( strtolower( $_SERVER['SERVER_SOFTWARE'] ?? '' ), 'flywheel' ) !== false ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput + return 'Flywheel'; + } + + return null; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/RewritesNotWorkingNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/RewritesNotWorkingNotice.php new file mode 100755 index 00000000..12e0ed15 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/RewritesNotWorkingNotice.php @@ -0,0 +1,33 @@ +', + '' + ), + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/RewritesUploadsBlockedNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/RewritesUploadsBlockedNotice.php new file mode 100755 index 00000000..bd03ceaa --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/RewritesUploadsBlockedNotice.php @@ -0,0 +1,37 @@ +', + '' + ), + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/SettingsIncorrectNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/SettingsIncorrectNotice.php new file mode 100755 index 00000000..beb1ddf5 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/SettingsIncorrectNotice.php @@ -0,0 +1,47 @@ +field_label = $field_label; + $this->settings_tab_label = $settings_tab_label; + } + + /** + * {@inheritdoc} + */ + public function get_key(): string { + return self::ERROR_KEY; + } + + /** + * {@inheritdoc} + */ + public function get_message(): array { + return [ + sprintf( + /* translators: %1$s: field label, %2$s: close anchor tag */ + __( 'The %1$s field in the %2$s tab is required. Please select at least one option. Please review these settings and save again.', 'webp-converter-for-media' ), + '"' . $this->field_label . '"', + '"' . $this->settings_tab_label . '"' + ), + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Error/Notice/UnsupportedPlaygroundServerNotice.php b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/UnsupportedPlaygroundServerNotice.php new file mode 100755 index 00000000..13dbdae1 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Error/Notice/UnsupportedPlaygroundServerNotice.php @@ -0,0 +1,31 @@ +code = $this->get_error_status(); + parent::__construct( $this->get_error_message( (array) $value ) ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Exception/ExceptionInterface.php b/wp-content/plugins/webp-converter-for-media/src/Exception/ExceptionInterface.php new file mode 100755 index 00000000..bf2433ec --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Exception/ExceptionInterface.php @@ -0,0 +1,30 @@ +update_image_urls( $buffer ); + } + ); + } + + /** + * Replaces URLs to source images in output buffer. + * + * @param string $buffer Contents of output buffer. + * + * @return string Contents of output buffer. + * @internal + */ + public function update_image_urls( string $buffer ): string { + $settings = $this->plugin_data->get_plugin_settings(); + $extensions = implode( '|', $settings[ SupportedExtensionsOption::OPTION_NAME ] ); + if ( ! $extensions ) { + return $buffer; + } + + $path_dir_uploads = apply_filters( 'webpc_dir_name', '', 'uploads' ); + return preg_replace_callback( + '/((?:\/' . str_replace( '/', '\\/', $path_dir_uploads ) . '\/)(?:.*?))\.(' . $extensions . ')/', + function ( $matches ) { + return str_replace( self::FILENAME_SUFFIX, '', $matches[1] ) . self::FILENAME_SUFFIX . '.' . $matches[2]; + }, + $buffer + ) ?: $buffer; + } + + /** + * @param mixed[] $settings Plugin settings. + * + * @return string[] + */ + protected function get_rules_to_wp_content( array $settings ): array { + return [ + $this->get_suffix_redirect_rules( $settings ), + $this->get_mod_rewrite_rules( $settings ), + $this->get_mod_headers_rules( $settings ), + ]; + } + + /** + * Generates redirects for suffixed URLs. + * + * @param mixed[] $settings Plugin settings. + * + * @return string Rules for .htaccess file. + */ + private function get_suffix_redirect_rules( array $settings ): string { + $content = ''; + $extensions = implode( '|', $settings[ SupportedExtensionsOption::OPTION_NAME ] ) ?: '.+'; + + $content .= '' . PHP_EOL; + $content .= ' RewriteEngine On' . PHP_EOL; + $content .= ' RewriteCond %{REQUEST_FILENAME} !-f' . PHP_EOL; + $content .= ' RewriteRule ^(.+)' . self::FILENAME_SUFFIX . '\.(' . $extensions . ')$ $1.$2 [NC]' . PHP_EOL; + $content .= ''; + + return $content; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Loader/HtaccessLoader.php b/wp-content/plugins/webp-converter-for-media/src/Loader/HtaccessLoader.php new file mode 100755 index 00000000..be4024db --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Loader/HtaccessLoader.php @@ -0,0 +1,437 @@ +plugin_data->get_plugin_settings() : $this->plugin_data->get_plugin_settings_debug(); + + $this->deactivate_loader(); + + $this->add_rewrite_rules_to_wp_content( true, $settings ); + $this->add_rewrite_rules_to_uploads( true, $settings ); + $this->add_rewrite_rules_to_uploads_webp( true, $settings ); + } + + /** + * {@inheritdoc} + */ + public function deactivate_loader() { + $settings = $this->plugin_data->get_plugin_settings(); + + $this->add_rewrite_rules_to_wp_content( false, $settings ); + $this->add_rewrite_rules_to_uploads( false, $settings ); + $this->add_rewrite_rules_to_uploads_webp( false, $settings ); + } + + /** + * @param string $original_path . + * + * @return string + * @internal + */ + public function modify_document_root_path( string $original_path ): string { + if ( isset( $_SERVER['SERVER_ADMIN'] ) && strpos( $_SERVER['SERVER_ADMIN'], '.home.pl' ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput + return '%{DOCUMENT_ROOT}' . str_replace( '//', '/', ABSPATH ); + } + + return $original_path; + } + + /** + * @param string $output_path . + * @param string $root_path . + * + * @return string + * @internal + */ + public function modify_output_root_path( string $output_path, string $root_path ): string { + if ( $output_path === $root_path ) { + return '/'; + } + + return $output_path; + } + + /** + * @param string $path . + * + * @return string + * @internal + */ + public function overwrite_htaccess_rewrite_root( string $path ): string { + $settings = $this->plugin_data->get_plugin_settings(); + $terms = [ + 'ABSPATH' => ABSPATH, + ]; + + return ( $settings[ HtaccessRewriteRootOption::OPTION_NAME ] !== '' ) + ? str_replace( array_keys( $terms ), array_values( $terms ), $settings[ HtaccessRewriteRootOption::OPTION_NAME ] ) + : $path; + } + + /** + * @param string $path . + * + * @return string + * @internal + */ + public function overwrite_htaccess_rewrite_path( string $path ): string { + $settings = $this->plugin_data->get_plugin_settings(); + + return ( $settings[ HtaccessRewritePathOption::OPTION_NAME ] !== '' ) ? $settings[ HtaccessRewritePathOption::OPTION_NAME ] : $path; + } + + /** + * @param string $path . + * + * @return string + * @internal + */ + public function overwrite_htaccess_rewrite_output( string $path ): string { + $settings = $this->plugin_data->get_plugin_settings(); + + return ( $settings[ HtaccessRewriteOutputOption::OPTION_NAME ] !== '' ) ? $settings[ HtaccessRewriteOutputOption::OPTION_NAME ] : $path; + } + + /** + * @param string $url . + * + * @return string + * @internal + */ + public function update_image_urls_to_bunny_cdn( string $url ): string { + if ( ! class_exists( '\BunnyCDN' ) || ! EnvDetector::is_cdn_bunny() ) { + return $url; + } + $options = \BunnyCDN::getOptions(); + + return str_replace( $options['site_url'], ( is_ssl() ? 'https://' : 'http://' ) . $options['cdn_domain_name'], $url ); + } + + /** + * Saves rules to .htaccess file in /wp-content directory. + * + * @param bool $is_active Is loader active? + * @param mixed[] $settings Plugin settings. + * + * @return void + */ + private function add_rewrite_rules_to_wp_content( bool $is_active, array $settings ) { + $path = dirname( apply_filters( 'webpc_dir_path', '', 'uploads' ) ); + if ( ! $is_active ) { + $this->save_rewrites_in_htaccesss( $path ); + return; + } + + $content = $this->add_comments_to_rules( $this->get_rules_to_wp_content( $settings ) ); + + $content = apply_filters( 'webpc_htaccess_rules', $content, $path . '/.htaccess' ); + $this->save_rewrites_in_htaccesss( $path, $content ); + } + + /** + * @param mixed[] $settings Plugin settings. + * + * @return string[] + */ + protected function get_rules_to_wp_content( array $settings ): array { + return [ + $this->get_mod_rewrite_rules( $settings ), + $this->get_mod_headers_rules( $settings ), + ]; + } + + /** + * Saves rules to .htaccess file in /uploads directory. + * + * @param bool $is_active Is loader active? + * @param mixed[] $settings Plugin settings. + * + * @return void + */ + private function add_rewrite_rules_to_uploads( bool $is_active, array $settings ) { + $path = apply_filters( 'webpc_dir_path', '', 'uploads' ); + if ( ! $is_active ) { + $this->save_rewrites_in_htaccesss( $path ); + return; + } + + $path_parts = explode( '/', apply_filters( 'webpc_dir_name', '', 'uploads' ) ); + $content = $this->add_comments_to_rules( + [ + $this->get_mod_rewrite_rules( $settings, end( $path_parts ) ), + ] + ); + + $content = apply_filters( 'webpc_htaccess_rules', $content, $path . '/.htaccess' ); + $this->save_rewrites_in_htaccesss( $path, $content ); + } + + /** + * Saves rules to .htaccess file in /uploads-webpc directory. + * + * @param bool $is_active Is loader active? + * @param mixed[] $settings Plugin settings. + * + * @return void + */ + private function add_rewrite_rules_to_uploads_webp( bool $is_active, array $settings ) { + $path = apply_filters( 'webpc_dir_path', '', 'webp' ); + if ( ! $is_active ) { + $this->save_rewrites_in_htaccesss( $path ); + return; + } + + $content = $this->add_comments_to_rules( + [ + $this->get_mod_mime_rules( $settings ), + $this->get_mod_expires_rules(), + ] + ); + + $content = apply_filters( 'webpc_htaccess_rules', $content, $path . '/.htaccess' ); + $this->save_rewrites_in_htaccesss( $path, $content ); + } + + /** + * Generates rules for rewriting source images to output images. + * + * @param mixed[] $settings Plugin settings. + * @param string|null $output_path_suffix Location of .htaccess file. + * + * @return string Rules for .htaccess file. + */ + protected function get_mod_rewrite_rules( array $settings, ?string $output_path_suffix = null ): string { + $content = ''; + if ( ! $settings[ SupportedExtensionsOption::OPTION_NAME ] ) { + return $content; + } + + $document_root = PathsGenerator::get_rewrite_root(); + $root_suffix = PathsGenerator::get_rewrite_path(); + $root_suffix_output = apply_filters( 'webpc_htaccess_rewrite_output', $root_suffix, $document_root ); + $output_path = apply_filters( 'webpc_dir_name', '', 'webp' ); + if ( $output_path_suffix !== null ) { + $output_path .= '/' . $output_path_suffix; + } + + $content .= '' . PHP_EOL; + $content .= ' RewriteEngine On' . PHP_EOL; + if ( apply_filters( 'webpc_htaccess_mod_rewrite_inherit', ! $settings[ RewriteInheritanceOption::OPTION_NAME ] ) === true ) { + $content .= ' RewriteOptions Inherit' . PHP_EOL; + } + + $content .= PHP_EOL; + $content .= ' ' . apply_filters( 'webpc_htaccess_original_cond', 'RewriteCond %{QUERY_STRING} original$' ) . PHP_EOL; + $content .= ' RewriteCond %{REQUEST_FILENAME} -f' . PHP_EOL; + $content .= ' RewriteRule . - [L]' . PHP_EOL; + + foreach ( $this->format_factory->get_mime_types() as $format => $mime_type ) { + $content .= PHP_EOL; + foreach ( $settings[ SupportedExtensionsOption::OPTION_NAME ] as $ext ) { + if ( $format === $ext ) { + continue; + } + + $content .= " RewriteCond %{HTTP_ACCEPT} {$mime_type}" . PHP_EOL; + if ( in_array( ExtraFeaturesOption::OPTION_VALUE_ONLY_SMALLER, $settings[ ExtraFeaturesOption::OPTION_NAME ] ) ) { + $content .= " RewriteCond %{REQUEST_FILENAME} -f" . PHP_EOL; + } + + if ( $document_root === '%{DOCUMENT_ROOT}/' ) { + $content .= " RewriteCond %{DOCUMENT_ROOT}/{$output_path}/$1.{$ext}.{$format} -f" . PHP_EOL; + } elseif ( strpos( $document_root, '%{DOCUMENT_ROOT}' ) !== false ) { + $content .= " RewriteCond {$document_root}{$output_path}/$1.{$ext}.{$format} -f [OR]" . PHP_EOL; + $content .= " RewriteCond %{DOCUMENT_ROOT}/{$output_path}/$1.{$ext}.{$format} -f" . PHP_EOL; + } else { + $content .= " RewriteCond {$document_root}{$output_path}/$1.{$ext}.{$format} -f [OR]" . PHP_EOL; + $content .= " RewriteCond %{DOCUMENT_ROOT}{$root_suffix}{$output_path}/$1.{$ext}.{$format} -f" . PHP_EOL; + } + + if ( apply_filters( 'webpc_htaccess_mod_rewrite_referer', false ) === true ) { + $content .= " RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} ^([^@]*)@@https?://\\1/.*" . PHP_EOL; + } + $content .= " RewriteRule (.+)\.{$ext}$ {$root_suffix_output}{$output_path}/$1.{$ext}.{$format} [NC,T={$mime_type},L]" . PHP_EOL; + } + } + + $content .= '' . PHP_EOL; + + return apply_filters( 'webpc_htaccess_mod_rewrite', trim( $content ), $output_path ); + } + + /** + * Generates rules for mod_headers. + * + * @param mixed[] $settings Plugin settings. + * + * @return string Rules for .htaccess file. + */ + protected function get_mod_headers_rules( array $settings ): string { + $content = ''; + $extensions = implode( '|', $settings[ SupportedExtensionsOption::OPTION_NAME ] ); + + $cache_control = true; + if ( $settings[ CloudflareZoneIdOption::OPTION_NAME ] && $settings[ CloudflareApiTokenOption::OPTION_NAME ] + && OptionsAccessManager::get_option( CloudflareConfigurator::REQUEST_CACHE_CONFIG_OPTION ) === 'yes' ) { + $cache_control = false; + } elseif ( EnvDetector::is_cdn_bunny() ) { + $cache_control = false; + } + + $content .= '' . PHP_EOL; + if ( $extensions ) { + $content .= ' ' . PHP_EOL; + } + if ( apply_filters( 'webpc_htaccess_cache_control_private', $cache_control ) ) { + $content .= ' Header always set Cache-Control "private"' . PHP_EOL; + $content .= ' Header always set X-LiteSpeed-Cache-Control "no-cache"' . PHP_EOL; + } + $content .= ' Header append Vary "Accept"' . PHP_EOL; + if ( $extensions ) { + $content .= ' ' . PHP_EOL; + } + $content .= ''; + + return apply_filters( 'webpc_htaccess_mod_headers', $content ); + } + + /** + * Generates rules for mod_expires. + * + * @return string Rules for .htaccess file. + */ + private function get_mod_expires_rules(): string { + $content = ''; + + $content .= '' . PHP_EOL; + $content .= ' ExpiresActive On' . PHP_EOL; + foreach ( $this->format_factory->get_mime_types() as $format => $mime_type ) { + $content .= " ExpiresByType {$mime_type} \"access plus 1 year\"" . PHP_EOL; + } + $content .= ''; + + return apply_filters( 'webpc_htaccess_mod_expires', $content ); + } + + /** + * Generates rules that add support for output formats. + * + * @param mixed[] $settings Plugin settings. + * + * @return string Rules for .htaccess file. + */ + private function get_mod_mime_rules( array $settings ): string { + $content = ''; + if ( ! $settings[ SupportedExtensionsOption::OPTION_NAME ] ) { + return $content; + } + + $content .= '' . PHP_EOL; + foreach ( $this->format_factory->get_mime_types() as $format => $mime_type ) { + $content .= " AddType {$mime_type} .{$format}" . PHP_EOL; + } + $content .= ''; + + return apply_filters( 'webpc_htaccess_mod_mime', $content ); + } + + /** + * Adds comments before and after rules for .htaccess file. + * + * @param string[] $rules Rules for .htaccess file. + * + * @return string Rules for .htaccess file. + */ + private function add_comments_to_rules( array $rules ): string { + if ( ! $rules ) { + return ''; + } + + $rows = []; + $rows[] = ''; + $rows[] = '# BEGIN Converter for Media'; + $rows[] = '# ! --- DO NOT EDIT PREVIOUS LINE --- !'; + $rows = array_merge( $rows, array_filter( $rules ) ); + $rows[] = '# ! --- DO NOT EDIT NEXT LINE --- !'; + $rows[] = '# END Converter for Media'; + $rows[] = ''; + + return implode( PHP_EOL, $rows ); + } + + /** + * Saves rules to .htaccess file in selected location. + * + * @param string $path_dir Location of .htaccess file. + * @param string $rules Rules for .htaccess file. + * + * @return void + */ + private function save_rewrites_in_htaccesss( string $path_dir, string $rules = '' ) { + $path_file = $path_dir . '/.htaccess'; + + $code = ( is_readable( $path_file ) ) ? file_get_contents( $path_file ) ?: '' : ''; + $code = preg_replace( + '/((:?[\r\n|\r|\n]?)# BEGIN (Converter for Media|WebP Converter)(.*?)# END (Converter for Media|WebP Converter)(:?(:?[\r\n|\r|\n]+)?))/s', + '', + $code + ); + if ( $rules && $code ) { + $code = PHP_EOL . $code; + } + $code = $rules . $code; + + if ( is_writable( $path_dir ) ) { + file_put_contents( $path_file, $code ); + } + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Loader/LoaderAbstract.php b/wp-content/plugins/webp-converter-for-media/src/Loader/LoaderAbstract.php new file mode 100755 index 00000000..43a1e5dc --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Loader/LoaderAbstract.php @@ -0,0 +1,57 @@ +plugin_info = $plugin_info; + $this->plugin_data = $plugin_data; + $this->format_factory = $format_factory; + } + + /** + * {@inheritdoc} + */ + public function is_active_loader(): bool { + $settings = $this->plugin_data->get_plugin_settings(); + return ( $settings[ LoaderTypeOption::OPTION_NAME ] === $this->get_type() ); + } + + /** + * {@inheritdoc} + */ + public function init_admin_hooks() { + } + + /** + * {@inheritdoc} + */ + public function init_front_end_hooks() { + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Loader/LoaderIntegrator.php b/wp-content/plugins/webp-converter-for-media/src/Loader/LoaderIntegrator.php new file mode 100755 index 00000000..dad3be94 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Loader/LoaderIntegrator.php @@ -0,0 +1,77 @@ +loader = $loader; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( LoaderAbstract::ACTION_NAME, [ $this, 'refresh_active_loader' ], 20, 2 ); + add_action( LoaderAbstract::ACTION_NAME, [ $this, 'refresh_inactive_loader' ] ); + add_action( 'webpc_settings_page_loaded', [ $this, 'load_admin_actions' ], 0 ); + add_action( 'init', [ $this, 'load_front_end_actions' ], 0 ); + } + + /** + * @param bool $is_active . + * @param bool $is_debug . + * + * @return void + * @internal + */ + public function refresh_active_loader( bool $is_active, bool $is_debug = false ) { + if ( $is_active && $this->loader->is_active_loader() ) { + $this->loader->activate_loader( $is_debug ); + } + } + + /** + * @param bool $is_active . + * + * @return void + * @internal + */ + public function refresh_inactive_loader( bool $is_active ) { + if ( ! $is_active || ! $this->loader->is_active_loader() ) { + $this->loader->deactivate_loader(); + } + } + + /** + * @return void + * @internal + */ + public function load_admin_actions() { + if ( $this->loader->is_active_loader() ) { + $this->loader->init_admin_hooks(); + } + } + + /** + * @return void + * @internal + */ + public function load_front_end_actions() { + if ( $this->loader->is_active_loader() && ( apply_filters( 'webpc_server_errors', [], true ) === [] ) ) { + $this->loader->init_front_end_hooks(); + } + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Loader/LoaderInterface.php b/wp-content/plugins/webp-converter-for-media/src/Loader/LoaderInterface.php new file mode 100755 index 00000000..93877580 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Loader/LoaderInterface.php @@ -0,0 +1,51 @@ +plugin_data->get_plugin_settings() : $this->plugin_data->get_plugin_settings_debug(); + $path_source = $this->plugin_info->get_plugin_directory_path() . self::LOADER_SOURCE; + $source_code = ( is_readable( $path_source ) ) ? file_get_contents( $path_source ) ?: '' : ''; + if ( ! $source_code ) { + return; + } + + $path_dir_uploads = apply_filters( 'webpc_dir_name', '', 'uploads' ); + $path_dir_webp = apply_filters( 'webpc_dir_name', '', 'webp' ); + $upload_suffix = implode( '/', array_diff( explode( '/', $path_dir_uploads ), explode( '/', $path_dir_webp ) ) ); + $mime_types = $this->format_factory->get_mime_types( $settings[ OutputFormatsOption::OPTION_NAME ] ); + + $source_code = preg_replace( + '/(PATH_UPLOADS(?:\s+)= \')(\')/', + '$1/' . $path_dir_uploads . '/$2', + $source_code + ); + $source_code = preg_replace( + '/(PATH_UPLOADS_WEBP(?:\s+)= \')(\')/', + '$1/' . $path_dir_webp . '/' . $upload_suffix . '/$2', + $source_code ?: '' + ); + $source_code = preg_replace( + '/(MIME_TYPES(?:\s+)= \')(\')/', + '$1' . json_encode( $mime_types ) . '$2', + $source_code ?: '' + ); + + $dir_output = dirname( apply_filters( 'webpc_dir_path', '', 'uploads' ) ); + if ( is_writable( $dir_output ) ) { + file_put_contents( $dir_output . self::PATH_LOADER, $source_code ); + } + } + + /** + * {@inheritdoc} + */ + public function deactivate_loader() { + $dir_output = dirname( apply_filters( 'webpc_dir_path', '', 'uploads' ) ) . self::PATH_LOADER; + if ( is_writable( $dir_output ) ) { + unlink( $dir_output ); + } + } + + /** + * @return void + * @internal + */ + public function start_buffering() { + if ( ! ( ( defined( 'DOING_AJAX' ) && DOING_AJAX ) || ( ! is_admin() && ! is_network_admin() ) ) ) { + return; + } + + ob_start( + function ( $buffer ) { + return $this->update_image_urls( $buffer ); + } + ); + } + + /** + * Replaces URLs to source images in output buffer. + * + * @param string $buffer Contents of output buffer. + * @param bool $is_debug Is debugging? + * + * @return string Contents of output buffer. + * @internal + */ + public function update_image_urls( string $buffer, bool $is_debug = false ): string { + $settings = ( ! $is_debug ) ? $this->plugin_data->get_plugin_settings() : $this->plugin_data->get_plugin_settings_debug(); + $extensions = implode( '|', $settings[ SupportedExtensionsOption::OPTION_NAME ] ); + if ( ! $extensions ) { + return $buffer; + } + + $source_dir = $this->get_loader_url(); + $allowed_dirs = $this->get_allowed_dirs( $settings ); + if ( ! $source_dir || ! $allowed_dirs ) { + return $buffer; + } + + $dir_paths = str_replace( '/', '\\/', implode( '|', $allowed_dirs ) ); + $has_nocache = apply_filters( 'webpc_passthru_url_nocache', true ); + + return preg_replace( + '/(https?:\/\/(?:[^\s()"\']+)(?:' . $dir_paths . ')(?:[^\s()"\']+)\.(?:' . $extensions . '))/', + $source_dir . '?src=$1' . ( ( $has_nocache ) ? '&nocache=1' : '' ), + $buffer + ) ?: ''; + } + + /** + * Returns URL for Passthru loader. + * + * @return string|null URL of source PHP file. + */ + public static function get_loader_url() { + if ( ! $source_dir = dirname( apply_filters( 'webpc_dir_url', '', 'uploads' ) ) ) { + return null; + } + return $source_dir . self::PATH_LOADER; + } + + /** + * Returns list of directories for which redirection from source images to output images. + * + * @param mixed[] $settings Plugin settings. + * + * @return string[] List of directories names. + */ + private function get_allowed_dirs( array $settings ): array { + $dirs = []; + foreach ( $settings[ SupportedDirectoriesOption::OPTION_NAME ] as $dir ) { + $dirs[] = apply_filters( 'webpc_dir_name', '', $dir ); + } + return array_filter( $dirs ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Model/Token.php b/wp-content/plugins/webp-converter-for-media/src/Model/Token.php new file mode 100755 index 00000000..4ef864be --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Model/Token.php @@ -0,0 +1,84 @@ +token_value = $token_value; + $this->valid_status = $valid_status; + $this->images_usage = $images_usage; + $this->images_limit = $images_limit; + } + + public function set_token_value( ?string $token_value = null ): self { + $this->token_value = $token_value; + return $this; + } + + /** + * @return string|null + */ + public function get_token_value(): ?string { + return $this->token_value; + } + + public function set_valid_status( bool $status ): self { + $this->valid_status = $status; + return $this; + } + + public function get_valid_status(): bool { + return $this->valid_status; + } + + public function set_images_usage( int $count ): self { + $this->images_usage = $count; + return $this; + } + + public function get_images_usage(): int { + return $this->images_usage; + } + + public function set_images_limit( int $count ): self { + $this->images_limit = $count; + return $this; + } + + public function get_images_limit(): int { + return $this->images_limit; + } + + public function is_active(): bool { + return ( $this->get_valid_status() && ( $this->get_images_usage() < $this->get_images_limit() ) ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Notice/BlackFridayNotice.php b/wp-content/plugins/webp-converter-for-media/src/Notice/BlackFridayNotice.php new file mode 100755 index 00000000..37aa35ee --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Notice/BlackFridayNotice.php @@ -0,0 +1,99 @@ +plugin_data = $plugin_data; + } + + /** + * {@inheritdoc} + */ + public function get_option_name(): string { + return self::NOTICE_OPTION; + } + + /** + * {@inheritdoc} + */ + public function is_available(): bool { + return ( ( basename( $_SERVER['PHP_SELF'] ) === 'index.php' ) // phpcs:ignore WordPress.Security + || ( ( $_GET['page'] ?? '' ) === PageIntegrator::SETTINGS_MENU_PAGE ) ); // phpcs:ignore WordPress.Security + } + + /** + * {@inheritdoc} + */ + public function is_active(): bool { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + if ( $plugin_settings[ AccessTokenOption::OPTION_NAME ] ) { + return false; + } + + $option_value = OptionsAccessManager::get_option( $this->get_option_name() ); + if ( $option_value === 'yes' ) { + return false; + } + + $current_date = gmdate( 'Ymd' ); + return ( ( $current_date >= str_replace( '-', '', self::NOTICE_DATE_START ) ) + && ( $current_date <= str_replace( '-', '', self::NOTICE_DATE_END ) ) ); + } + + /** + * {@inheritdoc} + */ + public function get_disable_value(): string { + return 'yes'; + } + + /** + * {@inheritdoc} + */ + public function get_output_path(): string { + return self::NOTICE_VIEW_PATH; + } + + /** + * {@inheritdoc} + * + * @return mixed[] + */ + public function get_vars_for_view(): array { + return [ + 'ajax_url' => admin_url( 'admin-ajax.php' ), + 'close_action' => self::NOTICE_OPTION, + 'coupon_code' => 'BF2025', + 'discount_value' => '50%', + 'button_url' => 'https://url.mattplugins.com/converter-notice-bf2025-button-read', + 'promotion_date' => self::NOTICE_DATE_END, + ]; + } + + /** + * {@inheritdoc} + */ + public function get_ajax_action_to_disable(): string { + return self::NOTICE_OPTION; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Notice/CloudflareNotice.php b/wp-content/plugins/webp-converter-for-media/src/Notice/CloudflareNotice.php new file mode 100755 index 00000000..a7ca2947 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Notice/CloudflareNotice.php @@ -0,0 +1,105 @@ +get_option_name() ); + return ( $option_value !== 'yes' ); + } + + /** + * {@inheritdoc} + */ + public function get_disable_value(): string { + return 'yes'; + } + + /** + * {@inheritdoc} + */ + public function get_output_path(): string { + return self::NOTICE_VIEW_PATH; + } + + /** + * {@inheritdoc} + * + * @return mixed[] + */ + public function get_vars_for_view(): array { + return [ + 'ajax_url' => admin_url( 'admin-ajax.php' ), + 'close_action' => self::NOTICE_OPTION, + 'service_name' => 'Cloudflare', + 'steps' => [ + sprintf( + /* translators: %1$s: service name */ + __( 'Log in to your %1$s dashboard.', 'webp-converter-for-media' ), + 'Cloudflare' + ), + sprintf( + /* translators: %1$s: button label */ + __( 'Click %1$s.', 'webp-converter-for-media' ), + '"Caching > Configuration"' + ), + sprintf( + /* translators: %1$s: section label, %2$s: button label */ + __( 'Under %1$s, click %2$s. A warning window will appear.', 'webp-converter-for-media' ), + '"Purge Cache"', + '"Purge Everything"' + ), + sprintf( + /* translators: %1$s: button label */ + __( 'If you agree, click %1$s.', 'webp-converter-for-media' ), + '"Purge Everything"' + ), + ], + ]; + } + + /** + * {@inheritdoc} + */ + public function get_ajax_action_to_disable(): string { + return self::NOTICE_OPTION; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Notice/NoticeAbstract.php b/wp-content/plugins/webp-converter-for-media/src/Notice/NoticeAbstract.php new file mode 100755 index 00000000..0fa9c5b0 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Notice/NoticeAbstract.php @@ -0,0 +1,30 @@ +plugin_info = $plugin_info; + $this->notice = $notice; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'admin_init', [ $this, 'init_notice_hooks' ] ); + + if ( $ajax_action = $this->notice->get_ajax_action_to_disable() ) { + add_action( 'wp_ajax_' . $ajax_action, [ $this, 'set_disable_value' ] ); + } + } + + /** + * Initializes displaying notice in administration panel. + * + * @return void + * @internal + */ + public function init_notice_hooks() { + if ( ! $this->notice->is_available() || ! $this->notice->is_active() ) { + return; + } + + if ( ! is_multisite() ) { + add_action( 'admin_notices', [ $this, 'load_notice' ], 0 ); + } else { + add_action( 'network_admin_notices', [ $this, 'load_notice' ], 0 ); + } + } + + /** + * Loads view template for notice. + * + * @return void + * @internal + */ + public function load_notice() { + $view_vars = $this->notice->get_vars_for_view(); + if ( $view_vars === null ) { + return; + } + + ( new ViewLoader( $this->plugin_info ) )->load_view( + $this->notice->get_output_path(), + $view_vars + ); + } + + /** + * Sets value for option that specifies whether to display notice. + * + * @param string $notice_name . + * @param string $default_value . + * + * @return void + */ + public static function set_default_value( string $notice_name, string $default_value ) { + if ( OptionsAccessManager::get_option( $notice_name ) !== null ) { + return; + } + + OptionsAccessManager::update_option( $notice_name, $default_value ); + } + + /** + * Sets options to disable notice. + * + * @return void + */ + public function set_disable_value() { + OptionsAccessManager::update_option( $this->notice->get_option_name(), $this->notice->get_disable_value() ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Notice/NoticeInterface.php b/wp-content/plugins/webp-converter-for-media/src/Notice/NoticeInterface.php new file mode 100755 index 00000000..eb55759e --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Notice/NoticeInterface.php @@ -0,0 +1,65 @@ +get_option_name() ); + return ( ( $option_value !== null ) && ( $option_value < time() ) ); + } + + /** + * {@inheritdoc} + */ + public function get_disable_value(): string { + $is_permanent = ( isset( $_REQUEST['is_permanently'] ) && $_REQUEST['is_permanently'] ); // phpcs:ignore + return (string) strtotime( ( $is_permanent ) ? '+10 years' : '+ 1 month' ); + } + + /** + * {@inheritdoc} + */ + public function get_output_path(): string { + return self::NOTICE_VIEW_PATH; + } + + /** + * {@inheritdoc} + * + * @return mixed[] + */ + public function get_vars_for_view(): array { + return [ + 'ajax_url' => admin_url( 'admin-ajax.php' ), + 'close_action' => self::NOTICE_OPTION, + ]; + } + + /** + * {@inheritdoc} + */ + public function get_ajax_action_to_disable(): string { + return self::NOTICE_OPTION; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Notice/TokenInactiveNotice.php b/wp-content/plugins/webp-converter-for-media/src/Notice/TokenInactiveNotice.php new file mode 100755 index 00000000..2d75e3d4 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Notice/TokenInactiveNotice.php @@ -0,0 +1,99 @@ +plugin_data = $plugin_data; + $this->token_repository = $token_repository; + } + + /** + * {@inheritdoc} + */ + public function get_option_name(): string { + return self::NOTICE_OPTION; + } + + /** + * {@inheritdoc} + */ + public function is_available(): bool { + return ( ! in_array( + ( $_GET['page'] ?? '' ), // phpcs:ignore WordPress.Security + [ PageIntegrator::SETTINGS_MENU_PAGE, PageIntegrator::UPLOAD_MENU_PAGE ] + ) ); + } + + /** + * {@inheritdoc} + */ + public function is_active(): bool { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + if ( ! $plugin_settings[ AccessTokenOption::OPTION_NAME ] ) { + return false; + } elseif ( $this->token_repository->get_token()->is_active() ) { + return false; + } + + $option_value = OptionsAccessManager::get_option( $this->get_option_name() ); + return ( $option_value !== 'yes' ); + } + + /** + * {@inheritdoc} + */ + public function get_disable_value(): string { + return 'yes'; + } + + /** + * {@inheritdoc} + */ + public function get_output_path(): string { + return self::NOTICE_VIEW_PATH; + } + + /** + * {@inheritdoc} + * + * @return mixed[] + */ + public function get_vars_for_view(): array { + return [ + 'ajax_url' => admin_url( 'admin-ajax.php' ), + 'close_action' => self::NOTICE_OPTION, + 'settings_url' => PageIntegrator::get_settings_page_url(), + ]; + } + + /** + * {@inheritdoc} + */ + public function get_ajax_action_to_disable(): string { + return self::NOTICE_OPTION; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Notice/UpgradeNotice.php b/wp-content/plugins/webp-converter-for-media/src/Notice/UpgradeNotice.php new file mode 100755 index 00000000..95cffd19 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Notice/UpgradeNotice.php @@ -0,0 +1,97 @@ +plugin_data = $plugin_data; + } + + /** + * {@inheritdoc} + */ + public function get_option_name(): string { + return self::NOTICE_OPTION; + } + + /** + * {@inheritdoc} + */ + public static function get_default_value(): string { + return (string) strtotime( '+ 1 week' ); + } + + /** + * {@inheritdoc} + */ + public function is_available(): bool { + return ( basename( $_SERVER['PHP_SELF'] ) === 'index.php' ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput + } + + /** + * {@inheritdoc} + */ + public function is_active(): bool { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + if ( $plugin_settings[ AccessTokenOption::OPTION_NAME ] ) { + return false; + } + + $option_value = OptionsAccessManager::get_option( $this->get_option_name() ); + if ( $option_value === null ) { + NoticeIntegrator::set_default_value( self::NOTICE_OPTION, self::get_default_value() ); + } + + return ( ( $option_value !== null ) && ( $option_value < time() ) ); + } + + /** + * {@inheritdoc} + */ + public function get_disable_value(): string { + $is_permanent = ( isset( $_REQUEST['is_permanently'] ) && $_REQUEST['is_permanently'] ); // phpcs:ignore + return (string) strtotime( ( $is_permanent ) ? '+1 year' : '+ 1 month' ); + } + + /** + * {@inheritdoc} + */ + public function get_output_path(): string { + return self::NOTICE_VIEW_PATH; + } + + /** + * {@inheritdoc} + * + * @return mixed[] + */ + public function get_vars_for_view(): array { + return [ + 'ajax_url' => admin_url( 'admin-ajax.php' ), + 'close_action' => self::NOTICE_OPTION, + ]; + } + + /** + * {@inheritdoc} + */ + public function get_ajax_action_to_disable(): string { + return self::NOTICE_OPTION; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Notice/WelcomeNotice.php b/wp-content/plugins/webp-converter-for-media/src/Notice/WelcomeNotice.php new file mode 100755 index 00000000..076a7fea --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Notice/WelcomeNotice.php @@ -0,0 +1,77 @@ +get_option_name() ) === $this->get_default_value() ); + } + + /** + * {@inheritdoc} + */ + public function get_disable_value(): string { + return '0'; + } + + /** + * {@inheritdoc} + */ + public function get_output_path(): string { + return self::NOTICE_VIEW_PATH; + } + + /** + * {@inheritdoc} + * + * @return mixed[] + */ + public function get_vars_for_view(): array { + return [ + 'ajax_url' => admin_url( 'admin-ajax.php' ), + 'close_action' => self::NOTICE_OPTION, + 'settings_url' => PageIntegrator::get_settings_page_url(), + ]; + } + + /** + * {@inheritdoc} + */ + public function get_ajax_action_to_disable(): string { + return self::NOTICE_OPTION; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Plugin/Activation/OutputDirectoryGenerator.php b/wp-content/plugins/webp-converter-for-media/src/Plugin/Activation/OutputDirectoryGenerator.php new file mode 100755 index 00000000..dade23d3 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Plugin/Activation/OutputDirectoryGenerator.php @@ -0,0 +1,21 @@ +plugin_info = $plugin_info; + $this->stats_manager = $stats_manager ?: new StatsManager(); + } + + /** + * @return void + */ + public function add_default_notices_values() { + NoticeIntegrator::set_default_value( WelcomeNotice::NOTICE_OPTION, WelcomeNotice::get_default_value() ); + NoticeIntegrator::set_default_value( ThanksNotice::NOTICE_OPTION, ThanksNotice::get_default_value() ); + NoticeIntegrator::set_default_value( UpgradeNotice::NOTICE_OPTION, UpgradeNotice::get_default_value() ); + } + + /** + * @return void + */ + public function add_default_stats_values() { + $this->stats_manager->set_plugin_installation_date(); + $this->stats_manager->set_plugin_first_version( $this->plugin_info->get_plugin_version() ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Plugin/ActivationHandler.php b/wp-content/plugins/webp-converter-for-media/src/Plugin/ActivationHandler.php new file mode 100755 index 00000000..c813a546 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Plugin/ActivationHandler.php @@ -0,0 +1,47 @@ +plugin_info = $plugin_info; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + register_activation_hook( $this->plugin_info->get_plugin_file(), [ $this, 'load_activation_actions' ] ); + } + + /** + * Initializes actions when plugin is activated. + * + * @return void + * @internal + */ + public function load_activation_actions() { + ( new OutputDirectoryGenerator() )->create_directory_for_uploads_webp(); + + $default_settings = new PluginSettingsManager( $this->plugin_info ); + $default_settings->add_default_notices_values(); + $default_settings->add_default_stats_values(); + + do_action( LoaderAbstract::ACTION_NAME, true ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Plugin/Deactivation/CronManager.php b/wp-content/plugins/webp-converter-for-media/src/Plugin/Deactivation/CronManager.php new file mode 100755 index 00000000..3e0d3055 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Plugin/Deactivation/CronManager.php @@ -0,0 +1,20 @@ +plugin_info = $plugin_info; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + register_deactivation_hook( $this->plugin_info->get_plugin_file(), [ $this, 'load_deactivation_actions' ] ); + } + + /** + * Initializes actions when plugin is deactivated. + * + * @return void + * @internal + */ + public function load_deactivation_actions() { + ( new CronManager() )->reset_cron_event(); + ( new PluginSettingsManager() )->remove_plugin_settings(); + + do_action( LoaderAbstract::ACTION_NAME, false ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Plugin/PluginLinksGenerator.php b/wp-content/plugins/webp-converter-for-media/src/Plugin/PluginLinksGenerator.php new file mode 100755 index 00000000..a1357a51 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Plugin/PluginLinksGenerator.php @@ -0,0 +1,111 @@ +plugin_info = $plugin_info; + $this->token_repository = $token_repository; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_filter( + 'plugin_action_links_' . $this->plugin_info->get_plugin_basename(), + [ $this, 'add_plugin_links_for_admin' ] + ); + add_filter( + 'network_admin_plugin_action_links_' . $this->plugin_info->get_plugin_basename(), + [ $this, 'add_plugin_links_for_network' ] + ); + } + + /** + * Adds new links to list of plugin actions for non-multisite websites. + * + * @param string[] $links Plugin action links. + * + * @return string[] Plugin action links. + * @internal + */ + public function add_plugin_links_for_admin( array $links ): array { + if ( is_multisite() ) { + return $links; + } + + $links = $this->add_link_to_settings( $links ); + return $this->add_link_to_pro_upgrade( $links ); + } + + /** + * Adds new links to list of plugin actions for multisite websites. + * + * @param string[] $links Plugin action links. + * + * @return string[] Plugin action links. + * @internal + */ + public function add_plugin_links_for_network( array $links ): array { + $links = $this->add_link_to_settings( $links ); + return $this->add_link_to_pro_upgrade( $links ); + } + + /** + * @param string[] $links Plugin action links. + * + * @return string[] Plugin action links. + */ + private function add_link_to_settings( array $links ): array { + array_unshift( + $links, + sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + esc_html( __( '%1$sSettings%2$s', 'webp-converter-for-media' ) ), + '', + '' + ) + ); + return $links; + } + + /** + * @param string[] $links Plugin action links. + * + * @return string[] Plugin action links. + * @internal + */ + private function add_link_to_pro_upgrade( array $links ): array { + if ( $this->token_repository->get_token()->get_valid_status() ) { + return $links; + } + + $links[] = sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + esc_html( __( '%1$sUpgrade to PRO%2$s', 'webp-converter-for-media' ) ), + '', + '' + ); + return $links; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Plugin/Uninstall/DebugFilesRemover.php b/wp-content/plugins/webp-converter-for-media/src/Plugin/Uninstall/DebugFilesRemover.php new file mode 100755 index 00000000..2df53933 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Plugin/Uninstall/DebugFilesRemover.php @@ -0,0 +1,27 @@ +plugin_info = $plugin_info; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + register_uninstall_hook( $this->plugin_info->get_plugin_file(), [ self::class, 'load_uninstall_actions' ] ); + } + + /** + * Initializes actions when plugin is uninstalled. + * + * @return void + * @internal + */ + public static function load_uninstall_actions() { + PluginSettingsManager::remove_plugin_settings(); + OutputFilesRemover::remove_webp_files(); + DebugFilesRemover::remove_debug_files(); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/PluginData.php b/wp-content/plugins/webp-converter-for-media/src/PluginData.php new file mode 100755 index 00000000..b14f90be --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/PluginData.php @@ -0,0 +1,126 @@ +settings_object = new OptionsManager( $token_repository, $method_factory, $format_factory, $directory_factory ); + } + + /** + * @return mixed[] + */ + public function get_plugin_settings(): array { + if ( $this->plugin_settings === null ) { + $this->plugin_settings = $this->settings_object->get_values(); + } + return $this->plugin_settings; + } + + /** + * Returns settings of plugin without sensitive data. + * + * @return mixed[] + */ + public function get_plugin_settings_public(): array { + if ( $this->plugin_public_settings === null ) { + $this->plugin_public_settings = $this->settings_object->get_public_values(); + } + return $this->plugin_public_settings; + } + + /** + * Returns settings of plugin for debug. + * + * @return mixed[] + */ + public function get_plugin_settings_debug(): array { + if ( $this->debug_settings === null ) { + $this->debug_settings = $this->settings_object->get_values( true ); + } + return $this->debug_settings; + } + + /** + * @param string|null $form_name . + * + * @return mixed[] + */ + public function get_settings_fields( ?string $form_name = null ): array { + return $this->settings_object->get_fields( $form_name ); + } + + /** + * Clears cache for settings of plugin. + * + * @return void + */ + public function invalidate_plugin_settings() { + $this->plugin_settings = null; + $this->plugin_public_settings = null; + $this->debug_settings = null; + } + + /** + * Retrieves and validates plugin settings submitted via POST. + * + * @return mixed[]|null Validated plugin settings values. Returns null if form submission has not been verified. + */ + public function get_validated_posted_data(): ?array { + return $this->settings_object->get_validated_posted_values(); + } + + /** + * Validates provided plugin settings data. + * + * @param mixed[] $form_data Plugin settings data to validate. + * + * @return mixed[] Validated plugin settings values. + */ + public function get_validated_form_data( array $form_data ): array { + return $this->settings_object->get_validated_form_values( $form_data ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/PluginInfo.php b/wp-content/plugins/webp-converter-for-media/src/PluginInfo.php new file mode 100755 index 00000000..613ef30b --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/PluginInfo.php @@ -0,0 +1,70 @@ +plugin_file = $plugin_file; + $this->plugin_version = $plugin_version; + $this->plugin_basename = plugin_basename( $plugin_file ); + $this->plugin_directory_path = plugin_dir_path( $plugin_file ); + $this->plugin_directory_url = plugin_dir_url( $plugin_file ); + } + + public function get_plugin_file(): string { + return $this->plugin_file; + } + + public function get_plugin_version(): string { + return $this->plugin_version; + } + + public function get_plugin_basename(): string { + return $this->plugin_basename; + } + + public function get_plugin_slug(): string { + return dirname( $this->plugin_basename ); + } + + public function get_plugin_directory_path(): string { + return $this->plugin_directory_path; + } + + public function get_plugin_directory_url(): string { + return $this->plugin_directory_url; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Repository/TokenRepository.php b/wp-content/plugins/webp-converter-for-media/src/Repository/TokenRepository.php new file mode 100755 index 00000000..e725877d --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Repository/TokenRepository.php @@ -0,0 +1,71 @@ +token ) { + return $this->token; + } + + $values = OptionsAccessManager::get_option( self::TOKEN_OPTION, null ); + $settings = OptionsAccessManager::get_option( SettingsManager::SETTINGS_OPTION, [] ); + if ( ( $values === null ) || ( ! $token_value && ! ( $settings[ AccessTokenOption::OPTION_NAME ] ?? null ) ) ) { + $this->token = new Token(); + } else { + $this->token = new Token( + $values[ self::TOKEN_VALUE_ACCESS_VALUE ] ?? null, + $values[ self::TOKEN_VALUE_VALID_STATUS ] ?? false, + $values[ self::TOKEN_VALUE_IMAGES_USAGE ] ?? 0, + $values[ self::TOKEN_VALUE_IMAGES_LIMIT ] ?? 0 + ); + } + + return $this->token; + } + + /** + * @param Token $token . + * + * @return void + */ + public function save_token( Token $token ) { + OptionsAccessManager::update_option( + self::TOKEN_OPTION, + [ + self::TOKEN_VALUE_ACCESS_VALUE => $token->get_token_value(), + self::TOKEN_VALUE_VALID_STATUS => $token->get_valid_status(), + self::TOKEN_VALUE_IMAGES_USAGE => $token->get_images_usage(), + self::TOKEN_VALUE_IMAGES_LIMIT => $token->get_images_limit(), + ] + ); + } + + /** + * @return void + */ + public function remove_token() { + $this->save_token( new Token() ); + $this->token = null; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Service/BackupExcluder.php b/wp-content/plugins/webp-converter-for-media/src/Service/BackupExcluder.php new file mode 100755 index 00000000..9f5abf8a --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Service/BackupExcluder.php @@ -0,0 +1,78 @@ +plugin_data = $plugin_data; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'init', [ $this, 'init_hooks_after_setup' ] ); + } + + /** + * @return void + * @internal + */ + public function init_hooks_after_setup() { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + if ( in_array( ExtraFeaturesOption::OPTION_VALUE_BACKUP_ENABLED, $plugin_settings[ ExtraFeaturesOption::OPTION_NAME ] ) ) { + return; + } + + add_filter( 'ai1wm_exclude_content_from_export', [ $this, 'ai1wm_exclude_content_from_export' ], 10, 1 ); + add_filter( 'updraftplus_exclude_directory', [ $this, 'updraftplus_exclude_directory' ], 10, 2 ); + add_filter( 'backwpup_content_exclude_dirs', [ $this, 'backwpup_content_exclude_dirs' ], 10, 1 ); + } + + /** + * @param string[] $exclude_dirs . + * + * @return string[] + * @internal + */ + public function ai1wm_exclude_content_from_export( $exclude_dirs ) { + $exclude_dirs[] = UploadsWebpcDirectory::DIRECTORY_NAME; + return $exclude_dirs; + } + + /** + * @param bool $status . + * @param string $directory . + * + * @return bool + * @internal + */ + public function updraftplus_exclude_directory( $status, $directory ) { + return ( $directory === UploadsWebpcDirectory::DIRECTORY_NAME ) ? true : $status; + } + + /** + * @param string[] $exclude_dirs . + * + * @return string[] + * @internal + */ + public function backwpup_content_exclude_dirs( $exclude_dirs ) { + $exclude_dirs[] = UploadsWebpcDirectory::DIRECTORY_NAME; + return $exclude_dirs; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Service/CacheIntegrator.php b/wp-content/plugins/webp-converter-for-media/src/Service/CacheIntegrator.php new file mode 100755 index 00000000..351bf72e --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Service/CacheIntegrator.php @@ -0,0 +1,86 @@ +plugin_info = $plugin_info; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'webpc_settings_updated', [ $this, 'clear_after_settings_save' ], 10, 2 ); + register_activation_hook( $this->plugin_info->get_plugin_file(), [ $this, 'clear_cache' ] ); + register_deactivation_hook( $this->plugin_info->get_plugin_file(), [ $this, 'clear_cache' ] ); + } + + /** + * @param mixed[] $current_settings . + * @param mixed[] $previous_settings . + * + * @return void + * @internal + */ + public function clear_after_settings_save( array $current_settings, array $previous_settings ) { + if ( $previous_settings[ LoaderTypeOption::OPTION_NAME ] === $current_settings[ LoaderTypeOption::OPTION_NAME ] ) { + return; + } + + $this->clear_cache(); + } + + /** + * @return void + * @internal + */ + public function clear_cache() { + if ( ! function_exists( 'is_plugin_active' ) ) { + include_once ABSPATH . '/wp-admin/includes/plugin.php'; + } + + if ( is_plugin_active( 'breeze/breeze.php' ) ) { + do_action( 'breeze_clear_all_cache' ); + } + if ( is_plugin_active( 'cache-enabler/cache-enabler.php' ) ) { + do_action( 'cache_enabler_clear_complete_cache' ); + } + if ( is_plugin_active( 'hummingbird-performance/wp-hummingbird.php' ) ) { + do_action( 'wphb_clear_page_cache' ); + } + if ( is_plugin_active( 'litespeed-cache/litespeed-cache.php' ) ) { + do_action( 'litespeed_purge', '*' ); + } + if ( is_plugin_active( 'sg-cachepress/sg-cachepress.php' ) && function_exists( 'sg_cachepress_purge_cache' ) ) { + sg_cachepress_purge_cache(); + } + if ( is_plugin_active( 'w3-total-cache/w3-total-cache.php' ) && function_exists( 'w3tc_flush_posts' ) ) { + w3tc_flush_posts(); + } + if ( is_plugin_active( 'wp-fastest-cache/wpFastestCache.php' ) ) { + do_action( 'wpfc_clear_all_cache' ); + } + if ( is_plugin_active( 'wp-optimize/wp-optimize.php' ) && function_exists( 'wpo_cache_flush' ) ) { + wpo_cache_flush(); + } + if ( is_plugin_active( 'wp-super-cache/wp-cache.php' ) && function_exists( 'wp_cache_clear_cache' ) ) { + wp_cache_clear_cache(); + } + + wp_cache_delete( 'alloptions', 'options' ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Service/CloudflareConfigurator.php b/wp-content/plugins/webp-converter-for-media/src/Service/CloudflareConfigurator.php new file mode 100755 index 00000000..66faf852 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Service/CloudflareConfigurator.php @@ -0,0 +1,159 @@ +plugin_info = $plugin_info; + $this->plugin_data = $plugin_data; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'webpc_settings_updated', [ $this, 'clear_after_settings_save' ], 10, 2 ); + register_activation_hook( $this->plugin_info->get_plugin_file(), [ $this, 'purge_cache' ] ); + register_deactivation_hook( $this->plugin_info->get_plugin_file(), [ $this, 'purge_cache' ] ); + } + + /** + * @param mixed[] $current_settings . + * @param mixed[] $previous_settings . + * + * @return void + * @internal + */ + public function clear_after_settings_save( array $current_settings, array $previous_settings ) { + if ( ( $previous_settings[ CloudflareZoneIdOption::OPTION_NAME ] === $current_settings[ CloudflareZoneIdOption::OPTION_NAME ] ) + && ( $previous_settings[ CloudflareApiTokenOption::OPTION_NAME ] === $current_settings[ CloudflareApiTokenOption::OPTION_NAME ] ) ) { + return; + } + + $this->set_cache_config(); + $this->purge_cache(); + } + + /** + * @return bool + * @internal + */ + public function set_cache_config(): bool { + $this->send_request( self::API_CACHE_CONFIG_URL, 'DELETE' ); + + $response_code = $this->send_request( + self::API_CACHE_CONFIG_URL, + 'PATCH', + [ + 'value' => [ + 'jpeg' => [ 'image/jpeg', 'image/webp', 'image/avif' ], + 'jpg' => [ 'image/jpeg', 'image/webp', 'image/avif' ], + 'png' => [ 'image/png', 'image/webp', 'image/avif' ], + 'gif' => [ 'image/gif', 'image/webp', 'image/avif' ], + 'webp' => [ 'image/webp', 'image/avif' ], + ], + ] + ); + if ( $response_code === null ) { + return false; + } + + OptionsAccessManager::update_option( + self::REQUEST_CACHE_CONFIG_OPTION, + ( $response_code === 200 ) ? 'yes' : $response_code + ); + + return ( $response_code === 200 ); + } + + /** + * @return bool + * @internal + */ + public function purge_cache(): bool { + $response_code = $this->send_request( + self::API_CACHE_PURGE_URL, + 'POST', + [ + 'purge_everything' => true, + ] + ); + if ( $response_code === null ) { + return false; + } + + OptionsAccessManager::update_option( + self::REQUEST_CACHE_PURGE_OPTION, + ( $response_code === 200 ) ? 'yes' : $response_code + ); + + return ( $response_code === 200 ); + } + + /** + * @param string $api_url . + * @param string $request_method . + * @param mixed[] $request_data . + * + * @return int|null + */ + private function send_request( string $api_url, string $request_method, array $request_data = [] ): ?int { + $plugin_setting = $this->plugin_data->get_plugin_settings(); + if ( ! $plugin_setting[ CloudflareZoneIdOption::OPTION_NAME ] || ! $plugin_setting[ CloudflareApiTokenOption::OPTION_NAME ] ) { + return null; + } + + $connect = curl_init( sprintf( $api_url, $plugin_setting[ CloudflareZoneIdOption::OPTION_NAME ] ) ); + if ( ! $connect ) { + return null; + } + + curl_setopt( $connect, CURLOPT_SSL_VERIFYPEER, false ); + curl_setopt( $connect, CURLOPT_SSL_VERIFYHOST, 0 ); + curl_setopt( $connect, CURLOPT_RETURNTRANSFER, true ); + curl_setopt( $connect, CURLOPT_TIMEOUT, 10 ); + curl_setopt( $connect, CURLOPT_CUSTOMREQUEST, $request_method ?: 'POST' ); + if ( $request_data !== [] ) { + curl_setopt( $connect, CURLOPT_POSTFIELDS, json_encode( $request_data ) ?: '' ); + } + curl_setopt( + $connect, + CURLOPT_HTTPHEADER, + [ + 'Content-Type: application/json', + 'Authorization: Bearer ' . $plugin_setting[ CloudflareApiTokenOption::OPTION_NAME ], + ] + ); + + curl_exec( $connect ); + $request_info = curl_getinfo( $connect ); + curl_close( $connect ); + + return $request_info['http_code']; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Service/DeactivationModalLoader.php b/wp-content/plugins/webp-converter-for-media/src/Service/DeactivationModalLoader.php new file mode 100755 index 00000000..8f011e69 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Service/DeactivationModalLoader.php @@ -0,0 +1,235 @@ +plugin_info = $plugin_info; + $this->plugin_data = $plugin_data; + $this->stats_manager = $stats_manager ?: new StatsManager(); + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'load-plugins.php', [ $this, 'load_modal' ] ); + } + + /** + * @return void + * @throws DeactivationModal\Exception\DuplicatedFormOptionKeyException + * @throws DeactivationModal\Exception\DuplicatedFormValueKeyException + * @internal + */ + public function load_modal() { + new DeactivationModal\Modal( + $this->plugin_info->get_plugin_slug(), + new DeactivationModal\Model\FormTemplate( + sprintf( self::API_URL, $this->plugin_info->get_plugin_slug() ), + sprintf( + /* translators: %s: plugin name */ + __( 'We are sorry that you are leaving our %s plugin', 'webp-converter-for-media' ), + 'Converter for Media' + ), + __( 'Can you, please, take a moment to tell us why you are deactivating this plugin (anonymous answer)?', 'webp-converter-for-media' ), + __( 'Submit and Deactivate', 'webp-converter-for-media' ), + __( 'Skip and Deactivate', 'webp-converter-for-media' ), + $this->load_notice_message() + ), + ( new DeactivationModal\Model\FormOptions() ) + ->set_option( + new DeactivationModal\Model\FormOption( + 'server_config', + 10, + sprintf( + /* translators: %s: notice title */ + __( 'I have the %s notice in the plugin settings', 'webp-converter-for-media' ), + __( 'Server configuration error', 'webp-converter-for-media' ) + ), + function () { + $errors = apply_filters( 'webpc_server_errors', [] ); + if ( ! in_array( + $errors, + [ [ LibsWithoutWebpSupportNotice::ERROR_KEY ], [ LibsNotInstalledNotice::ERROR_KEY ] ] + ) ) { + return null; + } + + return sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + __( 'If your server does not meet the technical requirements, you can use "Remote server" as "Conversion method", in %1$sthe plugin settings%2$s.', 'webp-converter-for-media' ), + '', + '' + ); + }, + __( 'What is your error? Have you been looking for a solution to this issue?', 'webp-converter-for-media' ) + ) + ) + ->set_option( + new DeactivationModal\Model\FormOption( + 'misunderstanding', + 20, + __( 'Images are not displayed in the WebP format', 'webp-converter-for-media' ), + function () { + return sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + __( 'Check out %1$sour instructions%2$s and see how to check if the plugin is working properly.', 'webp-converter-for-media' ), + '', + '' + ); + }, + __( 'Did you check the operation of the plugin in accordance with the instructions?', 'webp-converter-for-media' ) + ) + ) + ->set_option( + new DeactivationModal\Model\FormOption( + 'website_broken', + 30, + __( 'This plugin broke my website', 'webp-converter-for-media' ), + function () { + return sprintf( + /* translators: %1$s: option label, %2$s: open anchor tag, %3$s: close anchor tag */ + __( 'Check the %1$s option in %2$sthe plugin settings%3$s - this should solve the problem.', 'webp-converter-for-media' ), + __( 'Disable rewrite inheritance in .htaccess files', 'webp-converter-for-media' ), + '', + '' + ); + }, + __( 'What exactly happened?', 'webp-converter-for-media' ) + ) + ) + ->set_option( + new DeactivationModal\Model\FormOption( + 'better_plugin', + 40, + __( 'I found a better plugin', 'webp-converter-for-media' ), + null, + __( 'What is the name of this plugin? Why is it better?', 'webp-converter-for-media' ) + ) + ) + ->set_option( + new DeactivationModal\Model\FormOption( + 'temporary_deactivation', + 50, + __( 'This is a temporary deactivation', 'webp-converter-for-media' ), + null, + null + ) + ) + ->set_option( + new DeactivationModal\Model\FormOption( + 'other', + 60, + __( 'Other reason', 'webp-converter-for-media' ), + null, + __( 'What is the reason? What can we improve for you?', 'webp-converter-for-media' ) + ) + ), + ( new DeactivationModal\Model\FormValues() ) + ->set_value( + new DeactivationModal\Model\FormValue( + 'request_error_codes', + function () { + return implode( ',', apply_filters( 'webpc_server_errors', [] ) ); + } + ) + ) + ->set_value( + new DeactivationModal\Model\FormValue( + 'request_plugin_settings', + function () { + $settings_json = json_encode( $this->plugin_data->get_plugin_settings_public() ); + return base64_encode( $settings_json ?: '' ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions + } + ) + ) + ->set_value( + new DeactivationModal\Model\FormValue( + 'request_plugin_stats', + function () { + $stats_data = [ + 'usage_time' => $this->stats_manager->get_plugin_usage_time(), + 'first_version' => $this->stats_manager->get_plugin_first_version(), + 'regeneration_images' => $this->stats_manager->get_regeneration_images(), + 'webp_all' => $this->stats_manager->get_images_webp_all(), + 'webp_unconverted' => $this->stats_manager->get_images_webp_unconverted(), + 'avif_all' => $this->stats_manager->get_images_avif_all(), + 'avif_unconverted' => $this->stats_manager->get_images_avif_unconverted(), + 'rewrite_root' => PathsGenerator::get_rewrite_root(), + 'rewrite_path' => PathsGenerator::get_rewrite_path(), + ]; + + $stats_json = json_encode( $stats_data ); + return base64_encode( $stats_json ?: '' ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions + } + ) + ) + ->set_value( + new DeactivationModal\Model\FormValue( + 'request_plugin_version', + function () { + return $this->plugin_info->get_plugin_version(); + } + ) + ) + ); + } + + /** + * @return string|null + */ + private function load_notice_message(): ?string { + if ( ( apply_filters( 'webpc_server_errors', [] ) !== [] ) || is_multisite() ) { + return null; + } + + $images_all = $this->stats_manager->get_images_webp_all() ?: 0; + $images_left = $this->stats_manager->get_images_webp_unconverted() ?: 0; + if ( ( $images_all === 0 ) || ( $images_left === 0 ) ) { + return null; + } + + return sprintf( + /* translators: %1$s: button label, %2$s: open anchor tag, %3$s: close anchor tag */ + __( 'You have unconverted images on your website - click the %1$s button in %2$sthe plugin settings%3$s. This is all you need to do after installing the plugin.', 'webp-converter-for-media' ), + '"' . __( 'Start Bulk Optimization', 'webp-converter-for-media' ) . '"', + '', + '' + ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Service/EnvDetector.php b/wp-content/plugins/webp-converter-for-media/src/Service/EnvDetector.php new file mode 100755 index 00000000..4e70dfc6 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Service/EnvDetector.php @@ -0,0 +1,18 @@ +get_curl_url( $url, $ver_param ); + $request_headers = $this->get_curl_headers( $set_headers ); + $connect = $this->get_curl_connection( $request_url, $request_headers ); + if ( $connect === null ) { + return 0; + } + + $response = curl_exec( $connect ); + if ( ! is_string( $response ) ) { + $response = ''; + } + + $http_code = curl_getinfo( $connect, CURLINFO_HTTP_CODE ); + $curl_error = curl_error( $connect ); + curl_close( $connect ); + + if ( $debug_context !== null ) { + $this->log_request( $debug_context, $request_url, $set_headers, $http_code, $curl_error, strlen( $response ) ); + } + + return ( $http_code === 200 ) ? strlen( $response ) : 0; + } + + /** + * Checks HTTP status of file by sending request using active image loader. + * + * @param string $url URL of image. + * @param bool $set_headers Whether to send headers to confirm that browser supports WebP? + * @param string|null $ver_param Additional GET param. + * @param string|null $debug_context . + * + * @return int + */ + public function get_file_status_by_url( string $url, bool $set_headers = true, ?string $ver_param = null, ?string $debug_context = null ): int { + $request_url = $this->get_curl_url( $url, $ver_param ); + $request_headers = $this->get_curl_headers( $set_headers ); + $connect = $this->get_curl_connection( $request_url, $request_headers ); + if ( $connect === null ) { + return 0; + } + + curl_exec( $connect ); + $http_code = curl_getinfo( $connect, CURLINFO_HTTP_CODE ); + $curl_error = curl_error( $connect ); + curl_close( $connect ); + + if ( $debug_context !== null ) { + $this->log_request( $debug_context, $request_url, $set_headers, $http_code, $curl_error, null ); + } + + return $http_code; + } + + /** + * Returns size of file. + * + * @param string $path Server path of file. + * + * @return int Size of file. + */ + public function get_file_size_by_path( string $path ): int { + return ( file_exists( $path ) ) ? ( filesize( $path ) ?: 0 ) : 0; + } + + /** + * @param string $url URL of image. + * @param string|null $ver_param Additional GET param. + * + * @return string + */ + private function get_curl_url( string $url, ?string $ver_param = null ): string { + $image_url = $url; + if ( $ver_param !== null ) { + $image_url = add_query_arg( 'ver', $ver_param, $image_url ); + } + if ( function_exists( 'is_plugin_active' ) && is_plugin_active( 'wccp-pro/preventer-index.php' ) ) { + $image_url = add_query_arg( 'wccp_pro_watermark_pass', '', $image_url ); + } + + return apply_filters( 'webpc_debug_image_url', $image_url ); + } + + /** + * @param bool $set_headers Whether to send headers to confirm that browser supports WebP? + * + * @return string[] + */ + private function get_curl_headers( bool $set_headers ): array { + $headers = ( $set_headers ) + ? [ 'Accept: image/webp,image/*' ] + : [ 'Accept: image/*' ]; + + foreach ( wp_get_nocache_headers() as $header_key => $header_value ) { + $headers[] = sprintf( '%s: %s', $header_key, $header_value ); + } + return $headers; + } + + /** + * @param string $url . + * @param string[] $headers . + * + * @return resource|null + */ + private function get_curl_connection( string $url, array $headers ) { + if ( ! function_exists( 'curl_init' ) ) { + return null; + } + + $ch = curl_init( $url ); + if ( $ch === false ) { + return null; + } + + if ( isset( $_SERVER['PHP_AUTH_USER'] ) && isset( $_SERVER['PHP_AUTH_PW'] ) ) { + curl_setopt( $ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ); + curl_setopt( $ch, CURLOPT_USERPWD, sprintf( '%1$s:%2$s', $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'] ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput + } + + curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); + curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false ); + curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 ); + curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true ); + curl_setopt( $ch, CURLOPT_FRESH_CONNECT, true ); + curl_setopt( $ch, CURLOPT_TIMEOUT, 10 ); + curl_setopt( $ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' ); + curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers ); + curl_setopt( $ch, CURLOPT_REFERER, PathsGenerator::get_site_url() ); + + return $ch; + } + + /** + * @param string $debug_context . + * @param string $url . + * @param bool $is_webp_request . + * @param int $response_code . + * @param string|null $curl_error . + * @param int|null $response_length . + * + * @return void + */ + private function log_request( + string $debug_context, + string $url, + bool $is_webp_request, + int $response_code, + ?string $curl_error = null, + ?int $response_length = null + ) { + if ( ! isset( $GLOBALS[ self::GLOBAL_LOGS_VARIABLE ] ) ) { + $GLOBALS[ self::GLOBAL_LOGS_VARIABLE ] = []; + } + + $GLOBALS[ self::GLOBAL_LOGS_VARIABLE ][] = [ + 'context' => $debug_context, + 'url' => $url, + 'is_webp' => $is_webp_request, + 'http_code' => $response_code, + 'response' => $response_length, + 'curl_error' => ( $curl_error === '' ) ? null : $curl_error, + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Service/MediaStatusViewer.php b/wp-content/plugins/webp-converter-for-media/src/Service/MediaStatusViewer.php new file mode 100755 index 00000000..cbef9421 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Service/MediaStatusViewer.php @@ -0,0 +1,551 @@ +plugin_data = $plugin_data; + $this->token_repository = $token_repository; + $this->output_path = $output_path ?: new OutputPathGenerator( $format_factory ); + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'admin_init', [ $this, 'init_hooks_after_setup' ] ); + add_filter( 'webpc_attachment_stats', [ $this, 'get_conversion_stats_for_attachment' ], 10, 3 ); + } + + /** + * @return void + * @internal + */ + public function init_hooks_after_setup() { + $plugin_settings = $this->plugin_data->get_plugin_settings(); + if ( ! $plugin_settings[ MediaStatsOption::OPTION_NAME ] ) { + return; + } + + add_filter( 'manage_media_columns', [ $this, 'add_custom_table_column' ] ); + add_action( 'manage_media_custom_column', [ $this, 'print_table_column_value' ], 10, 2 ); + add_action( 'attachment_submitbox_misc_actions', [ $this, 'print_attachment_sidebar_value' ], 20 ); + add_filter( 'wp_prepare_attachment_for_js', [ $this, 'add_status_for_attachment_data' ], 10, 2 ); + } + + /** + * @param string $current_value . + * @param int $post_id . + * @param int|null $strategy_level . + * + * @return string|null + * @internal + */ + public function get_conversion_stats_for_attachment( string $current_value, int $post_id, ?int $strategy_level = null ): ?string { + $conversion_status = $this->get_conversion_status( $post_id, $strategy_level ); + if ( $conversion_status === null ) { + return null; + } + + return wp_kses( implode( PHP_EOL, $conversion_status ), $this->get_allowed_html_tags() ); + } + + /** + * @param string[] $columns . + * + * @return string[] + * @internal + */ + public function add_custom_table_column( array $columns ): array { + $columns['webpc_status'] = 'Converter for Media'; + return $columns; + } + + /** + * @param string $column_name . + * @param int $post_id . + * + * @return void + * @internal + */ + public function print_table_column_value( string $column_name, int $post_id ) { + if ( $column_name !== 'webpc_status' ) { + return; + } + + $conversion_stats = $this->get_conversion_stats_for_attachment( '', $post_id ); + if ( $conversion_stats === null ) { + return; + } + + printf( + '

%2$s
', + esc_attr( (string) $post_id ), + wp_kses( $conversion_stats, $this->get_allowed_html_tags() ) + ); + } + + /** + * @param \WP_Post $post . + * + * @return void + * @internal + */ + public function print_attachment_sidebar_value( \WP_Post $post ) { + $conversion_stats = $this->get_conversion_stats_for_attachment( '', $post->ID ); + if ( $conversion_stats === null ) { + return; + } + + ?> +
+
+ get_allowed_html_tags() ); ?> +
+ + %2$s', esc_attr( PageIntegrator::get_settings_page_url() ), 'Converter for Media' ) + ) + ); + ?> + +
+ get_conversion_stats_for_attachment( '', $attachment->ID ); + if ( $conversion_stats === null ) { + return $response; + } + + $response['compat'] = $response['compat'] ?? []; + $response['compat']['meta'] = $response['compat']['meta'] ?? ''; + + $response['compat']['meta'] .= sprintf( + '
%2$s
%3$s', + $attachment->ID, + $conversion_stats, + wp_kses_post( + sprintf( + /* translators: %s: plugin name */ + __( 'Optimized by: %s', 'webp-converter-for-media' ), + sprintf( '%2$s', esc_attr( PageIntegrator::get_settings_page_url() ), 'Converter for Media' ) + ) + ) + ); + + return $response; + } + + /** + * @param int $post_id . + * @param int|null $strategy_level . + * + * @return string[]|null + */ + private function get_conversion_status( int $post_id, ?int $strategy_level = null ): ?array { + $this->attachment = $this->attachment ?: new AttachmentPathsGenerator( $this->plugin_data ); + $this->token = $this->token ?: $this->token_repository->get_token(); + + $source_paths = $this->attachment->get_attachment_paths( $post_id ); + if ( ! $source_paths ) { + return null; + } + + $images_stats = $this->get_images_stats( $source_paths, $post_id ); + if ( ! $images_stats ) { + return null; + } + + $percent_values = array_filter( + array_column( $images_stats, 'optimized_percent' ), + function ( $value ) { + return ! is_null( $value ); + } + ); + $percent_average = ( $percent_values ) + ? -( 100 - round( array_sum( $percent_values ) / count( $percent_values ) ) ) + : null; + + $rows = [ + sprintf( + /* translators: %s: percent value */ + __( 'Average image size reduction: %s', 'webp-converter-for-media' ), + ( $percent_average !== null ) + ? + sprintf( + '%2$s', + esc_html__( 'File size reduction of all thumbnails compared to the original ones.', 'webp-converter-for-media' ), + ( '' . ( ( $percent_average > 0 ) ? ( '+' . $percent_average ) : $percent_average ) . '%' ) + ) + : '—' + ), + '
', + '
', + sprintf( + '', + $post_id + ), + sprintf( + '', + $post_id, + sprintf( + /* translators: %s: files count */ + __( 'Show stats for all thumbnails (%s)', 'webp-converter-for-media' ), + count( $images_stats ) + ) + ), + sprintf( + '', + $post_id, + __( 'Hide stats', 'webp-converter-for-media' ) + ), + '
', + ]; + + if ( ! $this->token->get_valid_status() ) { + $rows[] = '
'; + $rows[] = sprintf( + /* translators: %1$s: call to action, %2$s: format name, %3$s: percent value, %4$s: format name */ + __( '%1$s and convert your images to the %2$s format, making them weigh about %3$s less than images converted only to the %4$s format.', 'webp-converter-for-media' ), + sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + __( '%1$sUpgrade to PRO%2$s', 'webp-converter-for-media' ), + '', + ' ' + ), + 'AVIF', + '50%', + 'WebP' + ); + $rows[] = '
'; + } + + foreach ( $images_stats as $images_stat ) { + $percent_value = -( 100 - $images_stat['optimized_percent'] ); + + $rows[] = sprintf( + '
+
+
+
+ %2$s +
+ %3$s +
+ %4$s +
', + $images_stat['file_url'], + basename( $images_stat['file_url'] ), + sprintf( + /* translators: %s: file size */ + __( 'Original file size: %s', 'webp-converter-for-media' ), + sprintf( '%s', size_format( $images_stat['original_size'] ) ) + ), + ( $images_stat['output_format'] ) + ? + sprintf( + /* translators: %1$s: format name, %2$s: file size */ + __( 'Optimized file size in the %1$s format: %2$s', 'webp-converter-for-media' ), + $images_stat['output_format'], + sprintf( + '%1$s (%3$s)', + size_format( $images_stat['optimized_size'] ), + sprintf( + /* translators: %s: format name */ + __( 'Image size reduction after conversion to the %s format compared to the original one.', 'webp-converter-for-media' ), + $images_stat['output_format'] + ), + ( $percent_value > 0 ) + ? sprintf( '+%s%%', $percent_value ) + : sprintf( '%s%%', $percent_value ) + ) + ) + : + sprintf( + /* translators: %s: file size */ + __( 'Optimized file size: %s', 'webp-converter-for-media' ), + '-' + ), + ( $images_stat['output_format'] ) + ? $images_stat['optimized_percent'] + : 0 + ); + } + + $rows[] = '
'; + $rows[] = '
'; + + $quality_levels = apply_filters( 'webpc_option_quality_levels', [ 75, 80, 85, 90, 95 ] ); + $quality_levels = [ + intval( $quality_levels[0] ?? 75 ), + intval( $quality_levels[1] ?? 80 ), + intval( $quality_levels[2] ?? 85 ), + intval( $quality_levels[3] ?? 90 ), + intval( $quality_levels[4] ?? 95 ), + 0, + ]; + + $rows[] = '
'; + $rows[] = sprintf( + '', + $post_id, + RegenerateAttachmentEndpoint::get_route_url(), + RegenerateAttachmentEndpoint::get_route_nonce(), + implode( + '', + [ + sprintf( + '', + '', + ( $strategy_level === null ) ? 'selected' : '', + ( $percent_average !== null ) + ? __( 'Re-optimize Now', 'webp-converter-for-media' ) + : __( 'Optimize Now', 'webp-converter-for-media' ) + ), + sprintf( + '', + $quality_levels[0], + ( $strategy_level === $quality_levels[0] ) ? 'selected' : '', + sprintf( + /* translators: %s: strategy level */ + '— ' . __( 'using Strategy %s', 'webp-converter-for-media' ), + sprintf( '%1$s (%2$s)', '#1', __( 'Lossy', 'webp-converter-for-media' ) ) + ) + ), + sprintf( + '', + $quality_levels[1], + ( $strategy_level === $quality_levels[1] ) ? 'selected' : '', + sprintf( + /* translators: %s: strategy level */ + '— ' . __( 'using Strategy %s', 'webp-converter-for-media' ), + '#2' + ) + ), + sprintf( + '', + $quality_levels[2], + ( $strategy_level === $quality_levels[2] ) ? 'selected' : '', + sprintf( + /* translators: %s: strategy level */ + '— ' . __( 'using Strategy %s', 'webp-converter-for-media' ), + sprintf( '%1$s (%2$s)', '#3', __( 'Optimal', 'webp-converter-for-media' ) ) + ) + ), + sprintf( + '', + $quality_levels[3], + ( $strategy_level === $quality_levels[3] ) ? 'selected' : '', + sprintf( + /* translators: %s: strategy level */ + '— ' . __( 'using Strategy %s', 'webp-converter-for-media' ), + '#4' + ) + ), + sprintf( + '', + $quality_levels[4], + ( $strategy_level === $quality_levels[4] ) ? 'selected' : '', + sprintf( + /* translators: %s: strategy level */ + '— ' . __( 'using Strategy %s', 'webp-converter-for-media' ), + sprintf( '%1$s (%2$s)', '#5', __( 'Lossless', 'webp-converter-for-media' ) ) + ) + ), + ( $percent_average !== null ) + ? + sprintf( + '', + $quality_levels[5], + ( $strategy_level === $quality_levels[5] ) ? 'selected' : '', + __( 'Restore Originals', 'webp-converter-for-media' ) + ) + : '', + ] + ) + ); + + return $rows; + } + + /** + * @param string[] $source_paths . + * @param int $attachment_id . + * + * @return mixed[] { + * @type int $original_size . + * @type int|null $optimized_size . + * @type int|null $optimized_percent Size of optimized file compared to the original one (from >0 to <=100). + * @type string|null $output_format . + * @type string $file_url . + * } + */ + private function get_images_stats( array $source_paths, int $attachment_id ): array { + $file_url = wp_get_attachment_url( $attachment_id ) ?: null; + if ( $file_url ) { + $file_url = dirname( $file_url ); + } + + $items = []; + foreach ( $source_paths as $source_path ) { + $filesize_original = ( file_exists( $source_path ) ) ? ( filesize( $source_path ) ?: null ) : null; + if ( $filesize_original === null ) { + continue; + } + + $output_path_webp = $this->output_path->get_path( $source_path, false, WebpFormat::FORMAT_EXTENSION ); + $output_path_avif = $this->output_path->get_path( $source_path, false, AvifFormat::FORMAT_EXTENSION ); + + $filesize_avif = ( $output_path_avif ) + ? ( ( file_exists( $output_path_avif ) ) ? ( filesize( $output_path_avif ) ?: null ) : null ) + : null; + $filesize_webp = ( $output_path_webp ) + ? ( ( file_exists( $output_path_webp ) ) ? ( filesize( $output_path_webp ) ?: null ) : null ) + : null; + + $status_avif = ( ( $filesize_avif !== null ) || file_exists( $output_path_avif . '.' . LargerFilesOperator::DELETED_FILE_EXTENSION ) ); + $status_webp = ( ( $filesize_webp !== null ) || file_exists( $output_path_webp . '.' . LargerFilesOperator::DELETED_FILE_EXTENSION ) ); + + $items[] = [ + 'original_size' => $filesize_original, + 'optimized_size' => ( $filesize_avif !== null ) + ? $filesize_avif + : ( ( $filesize_webp !== null ) + ? $filesize_webp + : ( ( $status_avif || $status_webp ) ? $filesize_original : null ) + ), + 'optimized_percent' => ( $filesize_avif !== null ) + ? round( $filesize_avif / $filesize_original * 100 ) + : ( ( $filesize_webp !== null ) + ? round( $filesize_webp / $filesize_original * 100 ) + : ( ( $status_avif || $status_webp ) ? 100 : null ) + ), + 'output_format' => ( $filesize_avif !== null ) + ? 'AVIF' + : ( ( ( $filesize_webp !== null ) || $status_webp ) + ? 'WebP' + : null + ), + 'file_url' => sprintf( '%1$s/%2$s', $file_url, basename( $source_path ) ), + ]; + } + + return $items; + } + + /** + * @return mixed[] + */ + private function get_allowed_html_tags(): array { + return [ + 'a' => [ + 'href' => [], + 'class' => [], + 'target' => [], + ], + 'abbr' => [ + 'title' => [], + ], + 'br' => [], + 'div' => [ + 'id' => [], + 'class' => [], + 'style' => [], + ], + 'input' => [ + 'id' => [], + 'type' => [], + 'class' => [], + ], + 'label' => [ + 'for' => [], + 'class' => [], + ], + 'option' => [ + 'value' => [], + 'selected' => [], + 'disabled' => [], + ], + 'select' => [ + 'id' => [], + 'onchange' => [], + 'data-api-path' => [], + ], + 'span' => [ + 'id' => [], + 'class' => [], + 'hidden' => [], + ], + 'strong' => [ + 'class' => [], + 'titleyik mnb ' => [], + ], + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Service/OptionsAccessManager.php b/wp-content/plugins/webp-converter-for-media/src/Service/OptionsAccessManager.php new file mode 100755 index 00000000..0b85f0a4 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Service/OptionsAccessManager.php @@ -0,0 +1,50 @@ +query_vars['rest_route'] ?? '' ); + if ( strpos( $current_route, '/' . EndpointIntegrator::ROUTE_NAMESPACE . '/' ) === 0 ) { + return true; + } + + return $result; + } + + /** + * @param array|mixed $all_routes . + * + * @return array|mixed + * @internal + */ + public function handle_wp_rest_api_authentication_plugin( $all_routes ) { + if ( ! is_array( $all_routes ) ) { + return $all_routes; + } + + foreach ( $all_routes as $route_key => $route_path ) { + if ( strpos( $route_path, '/' . EndpointIntegrator::ROUTE_NAMESPACE . '/' ) === 0 ) { + unset( $all_routes[ $route_key ] ); + } + } + return $all_routes; + } + + /** + * @param array|mixed $white_routes . + * + * @return array|mixed + * @internal + */ + public function handle_jwt_auth_plugin( $white_routes ) { + if ( ! is_array( $white_routes ) ) { + return $white_routes; + } + + $all_routes[] = '/wp-json/' . EndpointIntegrator::ROUTE_NAMESPACE . '/*'; + return $all_routes; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Service/ServerConfigurator.php b/wp-content/plugins/webp-converter-for-media/src/Service/ServerConfigurator.php new file mode 100755 index 00000000..bcdb9218 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Service/ServerConfigurator.php @@ -0,0 +1,29 @@ +plugin_data = $plugin_data; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_filter( 'site_status_tests', [ $this, 'add_test_to_check_avif_format' ] ); + } + + /** + * @param mixed[][] $tests . + * + * @return mixed[][] + * @internal + */ + public function add_test_to_check_avif_format( array $tests ): array { + $settings = $this->plugin_data->get_plugin_settings(); + if ( isset( $settings[ AccessTokenOption::OPTION_NAME ] ) && $settings[ AccessTokenOption::OPTION_NAME ] ) { + return $tests; + } + + $tests['direct'] = array_merge( + [ + self::SITE_HEALTH_TEST_AVIF_FORMAT => [ + 'label' => __( 'Serve images in the AVIF format', 'webp-converter-for-media' ), + 'test' => [ $this, 'perform_avif_format_test' ], + ], + ], + $tests['direct'] + ); + return $tests; + } + + /** + * @return mixed[] + * @internal + */ + public function perform_avif_format_test(): array { + return [ + 'label' => __( 'Serve images in the AVIF format', 'webp-converter-for-media' ), + 'status' => 'recommended', + 'badge' => [ + 'label' => __( 'Performance' ), // phpcs:ignore WordPress.WP.I18n.MissingArgDomain + 'color' => 'blue', + ], + 'description' => __( 'The AVIF format is the successor to the WebP format. Images converted to the AVIF format weigh about 50% less than images converted only to the WebP format, while maintaining better image quality.', 'webp-converter-for-media' ), + 'actions' => sprintf( + '

%1$s

%2$s

%3$s

%4$s

', + sprintf( + /* translators: %1$s: plugin name, %2$s: format name */ + __( 'The %1$s plugin you are using allows you to convert your images to the %2$s format.', 'webp-converter-for-media' ), + 'Converter for Media', + 'AVIF' + ), + __( 'How does the plugin work?', 'webp-converter-for-media' ), + __( 'When a browser tries to load an image file, the plugin checks if it supports the AVIF format (if enabled in the plugin settings). If so, the browser will receive the equivalent of the original image in the AVIF format. If it does not support AVIF, but supports the WebP format, the browser will receive the equivalent of the original image in WebP format. In case the browser does not support either WebP or AVIF, the original image is loaded. This means full support for all browsers.', 'webp-converter-for-media' ), + sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + __( '%1$sUpgrade to PRO%2$s', 'webp-converter-for-media' ), + '', + ' ' + ) + ), + 'test' => self::SITE_HEALTH_TEST_AVIF_FORMAT, + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Service/StatsManager.php b/wp-content/plugins/webp-converter-for-media/src/Service/StatsManager.php new file mode 100755 index 00000000..3b4acd9f --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Service/StatsManager.php @@ -0,0 +1,154 @@ +token_repository = $token_repository ?: new TokenRepository(); + } + + public function validate_token( ?string $token_value = null ): Token { + $this->token = $this->token_repository->get_token( $token_value ); + $status = ( $token_value && $this->check_access_token( $token_value ) ); + + if ( $status ) { + $this->token_repository->save_token( + $this->token + ->set_token_value( $token_value ) + ->set_valid_status( true ) + ); + } else { + $this->token_repository->remove_token(); + } + + return $this->token_repository->get_token( $token_value ); + } + + private function check_access_token( string $token_value ): bool { + $connect = curl_init( sprintf( WebpConverterConstants::API_TOKEN_VALIDATION_URL, $token_value ) ); + if ( ! $connect ) { + return false; + } + + curl_setopt( $connect, CURLOPT_SSL_VERIFYPEER, false ); + curl_setopt( $connect, CURLOPT_SSL_VERIFYHOST, 0 ); + curl_setopt( $connect, CURLOPT_RETURNTRANSFER, true ); + curl_setopt( $connect, CURLOPT_TIMEOUT, 10 ); + curl_setopt( $connect, CURLOPT_POST, true ); + curl_setopt( + $connect, + CURLOPT_POSTFIELDS, + [ + 'domain_host' => parse_url( get_site_url(), PHP_URL_HOST ), + ] + ); + + $response = curl_exec( $connect ); + $request_info = curl_getinfo( $connect ); + curl_close( $connect ); + + if ( $request_info['http_code'] !== self::API_TOKEN_SUCCESS_CODE ) { + OptionsAccessManager::update_option( self::REQUEST_INFO_OPTION, $request_info ); + return false; + } + + $response_json = ( $response && is_string( $response ) ) ? json_decode( $response, true ) : null; + if ( ! $response_json ) { + return false; + } + + $this->token->set_images_usage( $response_json[ WebpConverterConstants::API_RESPONSE_VALUE_LIMIT_USAGE ] ); + $this->token->set_images_limit( $response_json[ WebpConverterConstants::API_RESPONSE_VALUE_LIMIT_MAX ] ); + + return true; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Service/ViewLoader.php b/wp-content/plugins/webp-converter-for-media/src/Service/ViewLoader.php new file mode 100755 index 00000000..cb131d98 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Service/ViewLoader.php @@ -0,0 +1,37 @@ +plugin_info = $plugin_info; + } + + /** + * Loads view with given variables. + * + * @param string $path Server path relative to plugin root directory. + * @param mixed[] $params Variables for view. + * + * @return void + */ + public function load_view( string $path, array $params = [] ) { + extract( $params ); // phpcs:ignore + $view_path = sprintf( '%1$s/templates/%2$s', $this->plugin_info->get_plugin_directory_path(), $path ); + if ( file_exists( $view_path ) ) { + /** @noinspection PhpIncludeInspection */ // phpcs:ignore + require_once $view_path; + } + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Service/WpCliManager.php b/wp-content/plugins/webp-converter-for-media/src/Service/WpCliManager.php new file mode 100755 index 00000000..aa86fce6 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Service/WpCliManager.php @@ -0,0 +1,233 @@ +plugin_data = $plugin_data; + $this->token_repository = $token_repository; + $this->method_factory = $method_factory; + $this->format_factory = $format_factory; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'cli_init', [ $this, 'init_hooks_after_setup' ] ); + } + + /** + * @return void + * @internal + */ + public function init_hooks_after_setup() { + if ( ! class_exists( '\WP_CLI' ) ) { + return; + } + + \WP_CLI::add_command( + 'converter-for-media calculate', + [ $this, 'calculate_images' ], + [] + ); + \WP_CLI::add_command( + 'converter-for-media regenerate', + [ $this, 'regenerate_images' ], + [ + 'synopsis' => [ + 'type' => 'flag', + 'name' => 'force', + 'description' => __( 'Force the conversion of all images again', 'webp-converter-for-media' ), + ], + ] + ); + + \WP_CLI::add_command( 'webp-converter calculate', [ $this, 'calculate_images' ] ); + \WP_CLI::add_command( 'webp-converter regenerate', [ $this, 'regenerate_images' ] ); + } + + /** + * @return void + */ + public function calculate_images() { + \WP_Cli::log( + __( 'How many images to convert are remaining on my website?', 'webp-converter-for-media' ) + ); + + $stats_data = ( new FilesTreeFinder( $this->plugin_data, $this->format_factory ) ) + ->get_tree( [ WebpFormat::FORMAT_EXTENSION, AvifFormat::FORMAT_EXTENSION ] ); + + \WP_CLI::success( + sprintf( + /* translators: %1$s: images count, %2$s: images count */ + __( '%1$s for AVIF and %2$s for WebP', 'webp-converter-for-media' ), + number_format( $stats_data['files_unconverted'][ AvifFormat::FORMAT_EXTENSION ], 0, '', ' ' ), + number_format( $stats_data['files_unconverted'][ WebpFormat::FORMAT_EXTENSION ], 0, '', ' ' ) + ) + ); + } + + /** + * @param string[] $args . + * @param string[] $assoc_args . + * + * @return void + */ + public function regenerate_images( array $args, array $assoc_args = [] ) { + $force_flag = ( isset( $assoc_args['force'] ) || in_array( '-force', $args ) ); + $conversion_method = ( new MethodIntegrator( $this->plugin_data, $this->method_factory ) ); + $method_used = $conversion_method->get_method_used(); + + if ( $method_used === null ) { + \WP_CLI::error( + sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + __( 'GD or Imagick library is not installed on your server.', 'webp-converter-for-media' ) . ' ' . __( 'This means that you cannot convert images to the WebP format on your server, because it does not meet the plugin requirements described in %1$sthe plugin FAQ%2$s. This issue is not dependent on the plugin.', 'webp-converter-for-media' ), + '', + '' + ) + ); + } + + $paths_chunks = ( new PathsFinder( $this->plugin_data, $this->token_repository, $this->format_factory ) ) + ->get_paths_by_chunks( ! $force_flag ); + + $count = 0; + foreach ( $paths_chunks as $chunk_data ) { + $count += count( $chunk_data['files'] ); + } + + $progress = \WP_CLI\Utils\make_progress_bar( + __( 'Bulk Optimization', 'webp-converter-for-media' ), + $count + ); + $size_before = 0; + $size_after = 0; + $files_all = 0; + $files_converted = 0; + + foreach ( $paths_chunks as $chunk_data ) { + foreach ( $chunk_data['files'] as $images_paths ) { + $response = $conversion_method->init_conversion( + $this->parse_files_paths( $images_paths, $chunk_data['path'] ), + $force_flag, + true + ); + + if ( $response !== null ) { + foreach ( $response['errors'] as $error_message ) { + if ( ! $response['is_fatal_error'] ) { + \WP_CLI::warning( $error_message ); + } else { + \WP_CLI::error( $error_message ); + } + } + + if ( $response['is_fatal_error'] ) { + return; + } + + $size_before = $response['size']['before']; + $size_after = $response['size']['after']; + $files_all = $response['files']['webp_available'] + $response['files']['avif_available']; + $files_converted = $response['files']['webp_converted'] + $response['files']['avif_converted']; + } + + $progress->tick(); + } + } + + $progress->finish(); + \WP_CLI::success( + __( 'The process was completed successfully. Your images have been converted!', 'webp-converter-for-media' ) + ); + + if ( $size_before > $size_after ) { + \WP_CLI::log( + sprintf( + /* translators: %s progress value */ + __( 'Saving the weight of your images: %s', 'webp-converter-for-media' ), + $this->format_bytes( $size_before - $size_after ) + ) + ); + } + \WP_CLI::log( + sprintf( + /* translators: %s images count */ + __( 'Successfully converted files: %s', 'webp-converter-for-media' ), + $files_converted + ) + ); + \WP_CLI::log( + sprintf( + /* translators: %s images count */ + __( 'Failed or skipped file conversion attempts: %s', 'webp-converter-for-media' ), + ( $files_all - $files_converted ) + ) + ); + } + + /** + * @param string[] $paths . + * @param string $path_prefix . + * + * @return string[] + */ + private function parse_files_paths( array $paths, string $path_prefix ): array { + $items = []; + foreach ( $paths as $path ) { + $items[] = $path_prefix . '/' . $path; + } + return $items; + } + + private function format_bytes( int $size ): string { + $suffixes = [ 'B', 'KB', 'MB', 'GB' ]; + $base = floor( log( $size ) / log( 1024 ) ); + + return sprintf( '%.2f ' . $suffixes[ $base ], ( $size / pow( 1024, floor( $base ) ) ) ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/AdminAssetsLoader.php b/wp-content/plugins/webp-converter-for-media/src/Settings/AdminAssetsLoader.php new file mode 100755 index 00000000..73eb69ee --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/AdminAssetsLoader.php @@ -0,0 +1,65 @@ +plugin_info = $plugin_info; + } + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'admin_enqueue_scripts', [ $this, 'load_styles' ] ); + add_action( 'admin_enqueue_scripts', [ $this, 'load_scripts' ] ); + } + + /** + * Loads CSS assets. + * + * @return void + * @internal + */ + public function load_styles() { + wp_register_style( + 'converter-for-media', + $this->plugin_info->get_plugin_directory_url() . self::CSS_FILE_PATH, + [], + $this->plugin_info->get_plugin_version() + ); + wp_enqueue_style( 'converter-for-media' ); + } + + /** + * Loads JavaScript assets. + * + * @return void + * @internal + */ + public function load_scripts() { + wp_register_script( + 'converter-for-media', + $this->plugin_info->get_plugin_directory_url() . self::JS_FILE_PATH, + [], + $this->plugin_info->get_plugin_version(), + true + ); + wp_enqueue_script( 'converter-for-media' ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/AccessTokenOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/AccessTokenOption.php new file mode 100755 index 00000000..155f6c11 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/AccessTokenOption.php @@ -0,0 +1,114 @@ +token_repository = $token_repository; + } + + /** + * {@inheritdoc} + */ + public function get_name(): string { + return self::OPTION_NAME; + } + + /** + * {@inheritdoc} + */ + public function get_form_name(): string { + return OptionAbstract::FORM_TYPE_SIDEBAR; + } + + /** + * {@inheritdoc} + */ + public function get_type(): string { + return OptionAbstract::OPTION_TYPE_TOKEN; + } + + /** + * {@inheritdoc} + */ + public static function get_label(): string { + return __( 'Access Token', 'webp-converter-for-media' ); + } + + /** + * {@inheritdoc} + */ + public function get_info(): string { + if ( $this->token_repository->get_token()->get_valid_status() ) { + return sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + __( 'To manage your subscriptions, please visit %1$sour website%2$s.', 'webp-converter-for-media' ), + '', + '' + ); + } + + return sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag, %3$s: open anchor tag, %4$s: close anchor tag */ + __( 'Provide a valid token to access %1$sthe PRO functionalities%2$s. You can find out more about it %3$shere%4$s.', 'webp-converter-for-media' ), + '', + '', + '', + '' + ); + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_available_values( array $settings ): array { + return []; + } + + /** + * {@inheritdoc} + */ + public function get_default_value(): string { + return ''; + } + + /** + * {@inheritdoc} + */ + public function validate_value( $current_value, ?array $available_values = null, ?array $disabled_values = null ): string { + return sanitize_text_field( $current_value ); + } + + /** + * {@inheritdoc} + */ + public function sanitize_value( $current_value ): string { + return $this->validate_value( $current_value ); + } + + /** + * {@inheritdoc} + */ + public function get_public_value( $current_value = null ) { + if ( $current_value === null ) { + return $current_value; + } + + return substr( $current_value, 0, 32 ) . str_repeat( '*', max( ( strlen( $current_value ) - 32 ), 0 ) ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/AutoConversionOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/AutoConversionOption.php new file mode 100755 index 00000000..2ec0e40c --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/AutoConversionOption.php @@ -0,0 +1,74 @@ +validate_value( $current_value ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/CloudflareApiTokenOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/CloudflareApiTokenOption.php new file mode 100755 index 00000000..a589c167 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/CloudflareApiTokenOption.php @@ -0,0 +1,91 @@ +validate_value( $current_value ); + } + + /** + * {@inheritdoc} + */ + public function get_public_value( $current_value = null ) { + if ( $current_value === null ) { + return $current_value; + } + + return str_repeat( '*', max( strlen( $current_value ), 0 ) ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/CloudflareZoneIdOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/CloudflareZoneIdOption.php new file mode 100755 index 00000000..e44c8e55 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/CloudflareZoneIdOption.php @@ -0,0 +1,102 @@ +', + '' + ), + ] + ); + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_available_values( array $settings ): array { + return []; + } + + /** + * {@inheritdoc} + */ + public function get_default_value(): string { + return ''; + } + + /** + * {@inheritdoc} + */ + public function validate_value( $current_value, ?array $available_values = null, ?array $disabled_values = null ): string { + return sanitize_text_field( $current_value ); + } + + /** + * {@inheritdoc} + */ + public function sanitize_value( $current_value ): string { + return $this->validate_value( $current_value ); + } + + /** + * {@inheritdoc} + */ + public function get_public_value( $current_value = null ) { + if ( $current_value === null ) { + return $current_value; + } + + return str_repeat( '*', max( strlen( $current_value ), 0 ) ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ConversionMethodOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ConversionMethodOption.php new file mode 100755 index 00000000..0c61fd1f --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ConversionMethodOption.php @@ -0,0 +1,130 @@ +token_repository = $token_repository; + $this->method_factory = $method_factory; + } + + /** + * {@inheritdoc} + */ + public function get_name(): string { + return self::OPTION_NAME; + } + + /** + * {@inheritdoc} + */ + public function get_form_name(): string { + return OptionAbstract::FORM_TYPE_ADVANCED; + } + + /** + * {@inheritdoc} + */ + public function get_type(): string { + return OptionAbstract::OPTION_TYPE_RADIO; + } + + /** + * {@inheritdoc} + */ + public static function get_label(): string { + return __( 'Conversion method', 'webp-converter-for-media' ); + } + + /** + * {@inheritdoc} + */ + public function get_notice_lines(): ?array { + $notice = [ + __( 'The remote server allows you to reduce the server load, because your images are converted by our server. This option is also useful when the server does not meet all the technical requirements of the plugin.', 'webp-converter-for-media' ), + ]; + + if ( $this->token_repository->get_token()->get_token_value() === null ) { + $notice[] = sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + __( '%1$sUpgrade to PRO%2$s', 'webp-converter-for-media' ), + '', + ' ' + ); + } + return $notice; + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_available_values( array $settings ): array { + return $this->method_factory->get_methods(); + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_disabled_values( array $settings ): array { + $methods = $this->method_factory->get_methods(); + $methods_available = $this->method_factory->get_available_methods(); + return array_keys( array_diff( $methods, $methods_available ) ); + } + + /** + * {@inheritdoc} + */ + public function get_default_value(): string { + $methods_available = $this->method_factory->get_available_methods(); + return array_keys( $methods_available )[0] ?? ''; + } + + /** + * {@inheritdoc} + */ + public function validate_value( $current_value, ?array $available_values = null, ?array $disabled_values = null ) { + if ( ! array_key_exists( $current_value, $available_values ?: [] ) ) { + return null; + } + + return $current_value; + } + + /** + * {@inheritdoc} + */ + public function sanitize_value( $current_value ) { + $values = [ ImagickMethod::METHOD_NAME, GdMethod::METHOD_NAME, RemoteMethod::METHOD_NAME ]; + + return $this->validate_value( + $current_value, + array_combine( $values, $values ) + ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ExcludedDirectoriesOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ExcludedDirectoriesOption.php new file mode 100755 index 00000000..a5b451aa --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ExcludedDirectoriesOption.php @@ -0,0 +1,103 @@ +validate_value( $current_value ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ExtraFeaturesOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ExtraFeaturesOption.php new file mode 100755 index 00000000..c6ef23aa --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ExtraFeaturesOption.php @@ -0,0 +1,126 @@ + __( + 'Automatic removal of files in output formats larger than the original ones', + 'webp-converter-for-media' + ), + self::OPTION_VALUE_KEEP_METADATA => sprintf( + '%1$s (%2$s)', + __( 'Keep images metadata stored in EXIF or XMP formats', 'webp-converter-for-media' ), + __( 'unavailable for the GD conversion method', 'webp-converter-for-media' ) + ), + self::OPTION_VALUE_CRON_ENABLED => sprintf( + '%1$s (%2$s)', + __( 'Convert automatically images from custom directories', 'webp-converter-for-media' ), + __( 'e.g. from /themes or non-standard in /uploads', 'webp-converter-for-media' ) + ), + self::OPTION_VALUE_BACKUP_ENABLED => __( + 'Save converted images in backups generated by other plugins', + 'webp-converter-for-media' + ), + ]; + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_default_value(): array { + return [ + self::OPTION_VALUE_ONLY_SMALLER, + ]; + } + + /** + * {@inheritdoc} + */ + public function validate_value( $current_value, ?array $available_values = null, ?array $disabled_values = null ) { + $valid_values = []; + if ( ! $current_value ) { + return $valid_values; + } + + foreach ( $current_value as $option_value ) { + if ( array_key_exists( $option_value, $available_values ?: [] ) + && ! in_array( $option_value, $disabled_values ?: [] ) ) { + $valid_values[] = $option_value; + } + } + + return $valid_values; + } + + /** + * {@inheritdoc} + */ + public function sanitize_value( $current_value ) { + $values = [ + self::OPTION_VALUE_ONLY_SMALLER, + self::OPTION_VALUE_KEEP_METADATA, + self::OPTION_VALUE_CRON_ENABLED, + self::OPTION_VALUE_BACKUP_ENABLED, + ]; + + return $this->validate_value( + $current_value, + array_combine( $values, $values ) + ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/HtaccessRewriteOutputOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/HtaccessRewriteOutputOption.php new file mode 100755 index 00000000..576f23d7 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/HtaccessRewriteOutputOption.php @@ -0,0 +1,69 @@ +validate_value( $current_value ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/HtaccessRewritePathOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/HtaccessRewritePathOption.php new file mode 100755 index 00000000..351c85a7 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/HtaccessRewritePathOption.php @@ -0,0 +1,69 @@ +validate_value( $current_value ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/HtaccessRewriteRootOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/HtaccessRewriteRootOption.php new file mode 100755 index 00000000..4105c7e6 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/HtaccessRewriteRootOption.php @@ -0,0 +1,69 @@ +validate_value( $current_value ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ImageResizeOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ImageResizeOption.php new file mode 100755 index 00000000..d4507646 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ImageResizeOption.php @@ -0,0 +1,168 @@ +token_repository = $token_repository; + } + + /** + * {@inheritdoc} + */ + public function get_name(): string { + return self::OPTION_NAME; + } + + /** + * {@inheritdoc} + */ + public function get_form_name(): string { + return OptionAbstract::FORM_TYPE_GENERAL; + } + + /** + * {@inheritdoc} + */ + public function get_type(): string { + return OptionAbstract::OPTION_TYPE_IMAGE_SIZE; + } + + /** + * {@inheritdoc} + */ + public static function get_label(): string { + return __( 'Maximum image dimensions', 'webp-converter-for-media' ); + } + + /** + * {@inheritdoc} + */ + public function get_info(): string { + $message = __( 'Resize large images to maximum dimensions in pixels during image conversion, keeping the original aspect ratio', 'webp-converter-for-media' ); + + if ( ! $this->token_repository->get_token()->get_valid_status() ) { + return sprintf( + '%1$s (%2$s)', + $message, + sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + __( 'available in %1$sthe PRO version%2$s', 'webp-converter-for-media' ), + '', + '' + ) + ); + } + return $message; + } + + /** + * {@inheritdoc} + */ + public function get_notice_lines(): ?array { + $size = $this->get_max_image_size(); + $notice = [ + sprintf( + /* translators: %1$s: width value, %2$s: height value */ + __( 'You can further decrease the size of converted images (and thus their weight) that exceed the maximum image size (thumbnail size) used in your theme. The recommended value for you is %1$s x %2$s pixels.', 'webp-converter-for-media' ), + $size['width'], + $size['height'] + ), + ]; + + if ( $this->token_repository->get_token()->get_token_value() === null ) { + $notice[] = sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + __( '%1$sUpgrade to PRO%2$s', 'webp-converter-for-media' ), + '', + ' ' + ); + } + return $notice; + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_available_values( array $settings ): array { + return []; + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_disabled_values( array $settings ): array { + if ( ! $this->token_repository->get_token()->get_valid_status() ) { + return [ 'yes' ]; + } + return []; + } + + /** + * {@inheritdoc} + * + * @return mixed[] + */ + public function get_default_value(): array { + return [ '', '', '' ]; + } + + /** + * {@inheritdoc} + */ + public function validate_value( $current_value, ?array $available_values = null, ?array $disabled_values = null ) { + if ( ! is_array( $current_value ) ) { + return [ '', '', '' ]; + } + + $value_min = intval( $current_value[1] ?? '' ); + $value_max = intval( $current_value[2] ?? '' ); + + return [ + ( ( $current_value[0] ?? '' ) === 'yes' ) ? 'yes' : '', + ( $value_min <= 1 ) ? '' : (string) $value_min, + ( $value_max <= 1 ) ? '' : (string) $value_max, + ]; + } + + /** + * {@inheritdoc} + */ + public function sanitize_value( $current_value ) { + return $this->validate_value( $current_value ); + } + + /** + * @return int[] + */ + private function get_max_image_size(): array { + $sizes = ( function_exists( 'wp_get_registered_image_subsizes' ) ) + ? wp_get_registered_image_subsizes() + : wp_get_additional_image_sizes(); + + $column_width = array_column( $sizes, 'width' ); + $column_height = array_column( $sizes, 'height' ); + + return [ + 'width' => ( $column_width ) ? max( $column_width ) : 0, + 'height' => ( $column_height ) ? max( $column_height ) : 0, + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ImagesQualityOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ImagesQualityOption.php new file mode 100755 index 00000000..d746e5d0 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ImagesQualityOption.php @@ -0,0 +1,124 @@ +', + esc_attr( + sprintf( + /* translators: %1$s: button label, %2$s: option label */ + __( 'After saving the change to this setting, remember to click the "%1$s" button with the "%2$s" option checked if you want to apply the change to already converted images.', 'webp-converter-for-media' ), + __( 'Start Bulk Optimization', 'webp-converter-for-media' ), + __( 'Force the conversion of all images again', 'webp-converter-for-media' ) + ) + ) + ), + ] + ); + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_available_values( array $settings ): array { + $levels = apply_filters( 'webpc_option_quality_levels', [ 75, 80, 85, 90, 95 ] ); + $levels = [ + intval( $levels[0] ?? 75 ), + intval( $levels[1] ?? 80 ), + intval( $levels[2] ?? 85 ), + intval( $levels[3] ?? 90 ), + intval( $levels[4] ?? 95 ), + ]; + + $values = []; + foreach ( $levels as $level ) { + if ( ( $level > 0 ) && ( $level <= 100 ) ) { + $values[ $level ] = sprintf( '%s%%', $level ); + } + } + ksort( $values ); + return $values; + } + + /** + * {@inheritdoc} + */ + public function get_default_value(): string { + return '85'; + } + + /** + * {@inheritdoc} + */ + public function validate_value( $current_value, ?array $available_values = null, ?array $disabled_values = null ) { + if ( $current_value === '100' ) { + return '95'; + } elseif ( ! array_key_exists( $current_value, $available_values ?: [] ) + || in_array( $current_value, $disabled_values ?: [] ) ) { + return $this->get_default_value(); + } + + return $current_value; + } + + /** + * {@inheritdoc} + */ + public function sanitize_value( $current_value ): string { + $values = apply_filters( 'webpc_option_quality_levels', [ 75, 80, 85, 90, 95 ] ); + + return $this->validate_value( + $current_value, + array_combine( $values, $values ) + ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/LoaderTypeOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/LoaderTypeOption.php new file mode 100755 index 00000000..a422be15 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/LoaderTypeOption.php @@ -0,0 +1,142 @@ +', + '' + ), + ] + ); + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_available_values( array $settings ): array { + return [ + HtaccessLoader::LOADER_TYPE => sprintf( + /* translators: %s: loader type */ + __( '%s (recommended)', 'webp-converter-for-media' ), + __( 'via .htaccess', 'webp-converter-for-media' ) . ' / Nginx' + ), + HtaccessBypassingLoader::LOADER_TYPE => sprintf( + /* translators: %1$s: loader type, %2$S: error name */ + __( '%1$s (use when you have a problem with the %2$s error)', 'webp-converter-for-media' ), + __( 'Bypassing Nginx', 'webp-converter-for-media' ), + BypassingApacheNotice::ERROR_KEY + ), + PassthruLoader::LOADER_TYPE => sprintf( + /* translators: %s: loader type */ + __( '%s (without rewrites in .htaccess files or the Nginx configuration)', 'webp-converter-for-media' ), + 'Pass Thru' + ), + ]; + } + + /** + * {@inheritdoc} + * + * @return mixed[] + */ + public function get_values_warnings( array $settings ): array { + return [ + HtaccessLoader::LOADER_TYPE => null, + HtaccessBypassingLoader::LOADER_TYPE => sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + __( 'If you are using this alternative setting, please read %1$sour guide%2$s which explains how it works.', 'webp-converter-for-media' ), + '', + '' + ), + PassthruLoader::LOADER_TYPE => sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + __( 'If you are using this alternative setting, please read %1$sour guide%2$s which explains how it works.', 'webp-converter-for-media' ), + '', + '' + ), + ]; + } + + /** + * {@inheritdoc} + */ + public function get_default_value(): string { + return HtaccessLoader::LOADER_TYPE; + } + + /** + * {@inheritdoc} + */ + public function validate_value( $current_value, ?array $available_values = null, ?array $disabled_values = null ) { + if ( ! array_key_exists( $current_value, $available_values ?: [] ) + || in_array( $current_value, $disabled_values ?: [] ) ) { + return null; + } + + return $current_value; + } + + /** + * {@inheritdoc} + */ + public function sanitize_value( $current_value ) { + $values = [ HtaccessLoader::LOADER_TYPE, HtaccessBypassingLoader::LOADER_TYPE, PassthruLoader::LOADER_TYPE ]; + + return $this->validate_value( + $current_value, + array_combine( $values, $values ) + ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/MediaStatsOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/MediaStatsOption.php new file mode 100755 index 00000000..0ac0680c --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/MediaStatsOption.php @@ -0,0 +1,79 @@ +', + '' + ); + } + + /** + * {@inheritdoc} + */ + public function get_available_values( array $settings ): ?array { + return null; + } + + /** + * {@inheritdoc} + */ + public function get_default_value(): string { + return 'yes'; + } + + /** + * {@inheritdoc} + */ + public function validate_value( $current_value, ?array $available_values = null, ?array $disabled_values = null ): string { + return ( $current_value === 'yes' ) ? 'yes' : ''; + } + + /** + * {@inheritdoc} + */ + public function sanitize_value( $current_value ): string { + return $this->validate_value( $current_value ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/OptionAbstract.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/OptionAbstract.php new file mode 100755 index 00000000..37ecb141 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/OptionAbstract.php @@ -0,0 +1,71 @@ +get_default_value(); + } + + /** + * {@inheritdoc} + */ + public function get_public_value( $current_value = null ) { + return $current_value; + } + + /** + * {@inheritdoc} + */ + public function get_disabled_values( array $settings ): ?array { + return null; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/OptionIntegrator.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/OptionIntegrator.php new file mode 100755 index 00000000..dcb2cd7f --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/OptionIntegrator.php @@ -0,0 +1,56 @@ +option = $option; + } + + /** + * Returns data of option based on plugin settings. + * + * @param mixed[] $settings Plugin settings. + * + * @return mixed[] Associative array containing field data. + */ + public function get_option_data( array $settings ): array { + $option_name = $this->option->get_name(); + $option_type = $this->option->get_type(); + $values = $this->option->get_available_values( $settings ); + $disabled_values = $this->option->get_disabled_values( $settings ); + $value = $this->option->validate_value( + ( $settings[ $option_name ] ?? $this->option->get_default_value() ), + $values, + $disabled_values + ); + + return [ + 'name' => $this->option->get_name(), + 'type' => $option_type, + 'label' => $this->option->get_label(), + 'notice_lines' => $this->option->get_notice_lines(), + 'info' => $this->option->get_info(), + 'placeholder' => $this->option->get_placeholder(), + 'values' => $values, + 'values_warnings' => $this->option->get_values_warnings( $settings ), + 'disabled' => $disabled_values ?: [], + 'value' => $value, + 'value_public' => $this->option->get_public_value( $value ), + ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/OptionInterface.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/OptionInterface.php new file mode 100755 index 00000000..2e2ad502 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/OptionInterface.php @@ -0,0 +1,118 @@ +set_option( new ImagesQualityOption() ); + $this->set_option( new OutputFormatsOption( $token_repository, $format_factory, $conversion_method ) ); + $this->set_option( new SupportedDirectoriesOption( $directory_factory ) ); + $this->set_option( new ImageResizeOption( $token_repository ) ); + $this->set_option( new AutoConversionOption() ); + + $this->set_option( new AccessTokenOption( $token_repository ) ); + + $this->set_option( new SupportedExtensionsOption() ); + $this->set_option( $conversion_method ); + $this->set_option( new LoaderTypeOption() ); + $this->set_option( new RewriteInheritanceOption() ); + $this->set_option( new ExcludedDirectoriesOption() ); + $this->set_option( new ExtraFeaturesOption() ); + $this->set_option( new MediaStatsOption() ); + + $this->set_option( new CloudflareZoneIdOption() ); + $this->set_option( new CloudflareApiTokenOption() ); + + $this->set_option( new ServiceModeOption() ); + $this->set_option( new HtaccessRewriteRootOption() ); + $this->set_option( new HtaccessRewritePathOption() ); + $this->set_option( new HtaccessRewriteOutputOption() ); + } + + /** + * @param string|null $form_name . + * + * @return OptionInterface[] + */ + public function get_options( ?string $form_name = null ): array { + $options = []; + foreach ( $this->options as $option ) { + if ( ( $form_name === null ) || ( $form_name === $option->get_form_name() ) ) { + $options[] = $option; + } + } + + return apply_filters( 'webpc_settings_options', $options ); + } + + /** + * @param string $option_name . + * + * @return OptionInterface|null + */ + public function get_option( string $option_name ) { + $options = $this->get_options(); + + foreach ( $options as $option ) { + if ( $option->get_name() === $option_name ) { + return $option; + } + } + + return null; + } + + /** + * @param OptionInterface $new_option . + * + * @return void + */ + private function set_option( OptionInterface $new_option ) { + foreach ( $this->options as $option_index => $option ) { + if ( $option->get_name() === $new_option->get_name() ) { + $this->options[ $option_index ] = $new_option; + return; + } + } + + $this->options[] = $new_option; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/OutputFormatsOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/OutputFormatsOption.php new file mode 100755 index 00000000..157da366 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/OutputFormatsOption.php @@ -0,0 +1,158 @@ +token_repository = $token_repository; + $this->conversion_method_option = $conversion_method_option; + $this->format_factory = $format_factory; + } + + /** + * {@inheritdoc} + */ + public function get_name(): string { + return self::OPTION_NAME; + } + + /** + * {@inheritdoc} + */ + public function get_form_name(): string { + return OptionAbstract::FORM_TYPE_GENERAL; + } + + /** + * {@inheritdoc} + */ + public function get_type(): string { + return OptionAbstract::OPTION_TYPE_CHECKBOX; + } + + /** + * {@inheritdoc} + */ + public static function get_label(): string { + return __( 'Supported output formats', 'webp-converter-for-media' ); + } + + /** + * {@inheritdoc} + */ + public function get_notice_lines(): ?array { + $notice = [ + __( 'The AVIF format is the successor to the WebP format. Images converted to the AVIF format weigh about 50% less than images converted only to the WebP format, while maintaining better image quality.', 'webp-converter-for-media' ), + ]; + + if ( $this->token_repository->get_token()->get_token_value() === null ) { + $notice[] = sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + __( '%1$sUpgrade to PRO%2$s', 'webp-converter-for-media' ), + '', + ' ' + ); + } + return $notice; + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_available_values( array $settings ): array { + return $this->format_factory->get_formats(); + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_disabled_values( array $settings ): array { + $method = $settings[ ConversionMethodOption::OPTION_NAME ] ?? null; + if ( ! $method || in_array( $method, $this->conversion_method_option->get_disabled_values( $settings ) ) ) { + $method = $this->conversion_method_option->get_default_value(); + } + $formats = $this->format_factory->get_formats(); + $formats_available = $this->format_factory->get_available_formats( $method ); + + return array_keys( array_diff( $formats, $formats_available ) ); + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_default_value(): array { + return [ WebpFormat::FORMAT_EXTENSION ]; + } + + /** + * {@inheritdoc} + */ + public function validate_value( $current_value, ?array $available_values = null, ?array $disabled_values = null ) { + $valid_values = []; + if ( ! $current_value ) { + return $valid_values; + } + + foreach ( $current_value as $option_value ) { + if ( array_key_exists( $option_value, $available_values ?: [] ) + && ! in_array( $option_value, $disabled_values ?: [] ) ) { + $valid_values[] = $option_value; + } + } + + return $valid_values; + } + + /** + * {@inheritdoc} + */ + public function sanitize_value( $current_value ) { + $values = [ WebpFormat::FORMAT_EXTENSION, AvifFormat::FORMAT_EXTENSION ]; + + return $this->validate_value( + $current_value, + array_combine( $values, $values ) + ); + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_debug_value( array $settings ): array { + return [ WebpFormat::FORMAT_EXTENSION, AvifFormat::FORMAT_EXTENSION ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/RewriteInheritanceOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/RewriteInheritanceOption.php new file mode 100755 index 00000000..b5d55878 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/RewriteInheritanceOption.php @@ -0,0 +1,82 @@ +validate_value( $current_value ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ServiceModeOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ServiceModeOption.php new file mode 100755 index 00000000..013d064a --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/ServiceModeOption.php @@ -0,0 +1,78 @@ +validate_value( $current_value ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/SupportedDirectoriesOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/SupportedDirectoriesOption.php new file mode 100755 index 00000000..a22e9966 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/SupportedDirectoriesOption.php @@ -0,0 +1,113 @@ +directory_factory = $directory_factory; + } + + /** + * {@inheritdoc} + */ + public function get_name(): string { + return self::OPTION_NAME; + } + + /** + * {@inheritdoc} + */ + public function get_form_name(): string { + return OptionAbstract::FORM_TYPE_GENERAL; + } + + /** + * {@inheritdoc} + */ + public function get_type(): string { + return OptionAbstract::OPTION_TYPE_CHECKBOX; + } + + /** + * {@inheritdoc} + */ + public static function get_label(): string { + return __( 'Supported directories', 'webp-converter-for-media' ); + } + + /** + * {@inheritdoc} + */ + public function get_info(): string { + return __( 'Files from these directories will be converted to output formats.', 'webp-converter-for-media' ); + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_available_values( array $settings ): array { + return $this->directory_factory->get_directories(); + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_default_value(): array { + return [ 'uploads' ]; + } + + /** + * {@inheritdoc} + */ + public function validate_value( $current_value, ?array $available_values = null, ?array $disabled_values = null ) { + $valid_values = []; + if ( ! $current_value ) { + return $valid_values; + } + + foreach ( $current_value as $option_value ) { + if ( array_key_exists( $option_value, $available_values ?: [] ) + && ! in_array( $option_value, $disabled_values ?: [] ) ) { + $valid_values[] = $option_value; + } + } + + return $valid_values; + } + + /** + * {@inheritdoc} + */ + public function sanitize_value( $current_value ) { + return $this->validate_value( + $current_value, + $this->get_available_values( [] ) + ); + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_debug_value( array $settings ): array { + return [ 'uploads' ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Option/SupportedExtensionsOption.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/SupportedExtensionsOption.php new file mode 100755 index 00000000..9138b904 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Option/SupportedExtensionsOption.php @@ -0,0 +1,116 @@ + '.jpg / .jpeg', + 'png' => '.png', + 'gif' => '.gif', + 'webp' => sprintf( + /* translators: %s: file extension */ + __( '%s (converting to AVIF only)', 'webp-converter-for-media' ), + '.webp' + ), + ]; + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_default_value(): array { + return [ 'jpg', 'jpeg', 'png', 'webp' ]; + } + + /** + * {@inheritdoc} + */ + public function validate_value( $current_value, ?array $available_values = null, ?array $disabled_values = null ) { + $valid_values = []; + if ( ! $current_value ) { + return $valid_values; + } + + foreach ( $current_value as $option_value ) { + if ( array_key_exists( $option_value, $available_values ?: [] ) + && ! in_array( $option_value, $disabled_values ?: [] ) ) { + $valid_values[] = $option_value; + } + } + if ( in_array( 'jpg', $current_value ) ) { + $valid_values[] = 'jpeg'; + } + + return array_unique( $valid_values ); + } + + /** + * {@inheritdoc} + */ + public function sanitize_value( $current_value ) { + $values = [ 'jpg', 'jpeg', 'png', 'gif', 'webp', 'png2' ]; + + return $this->validate_value( + $current_value, + array_combine( $values, $values ) + ); + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function get_debug_value( array $settings ): array { + return [ 'png2', 'png' ]; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/OptionsManager.php b/wp-content/plugins/webp-converter-for-media/src/Settings/OptionsManager.php new file mode 100755 index 00000000..6a03ef6b --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/OptionsManager.php @@ -0,0 +1,131 @@ +options_aggregator = new OptionsAggregator( $token_repository, $method_factory, $format_factory, $directory_factory ); + } + + /** + * @param string|null $form_name . + * + * @return mixed[] Fields of plugin settings. + */ + public function get_fields( ?string $form_name = null ): array { + $settings = OptionsAccessManager::get_option( SettingsManager::SETTINGS_OPTION, [] ); + + $options = []; + foreach ( $this->options_aggregator->get_options( $form_name ) as $option_object ) { + $options[] = ( new OptionIntegrator( $option_object ) )->get_option_data( $settings ); + } + return $options; + } + + /** + * @param bool $is_debug . + * + * @return mixed[] Associative array of setting names and their values. + */ + public function get_values( bool $is_debug = false ): array { + $settings = OptionsAccessManager::get_option( SettingsManager::SETTINGS_OPTION, [] ); + + $values = []; + foreach ( $this->options_aggregator->get_options() as $option_object ) { + $values[ $option_object->get_name() ] = $option_object->sanitize_value( + ( ! $is_debug ) + ? ( $settings[ $option_object->get_name() ] ?? $option_object->get_default_value() ) + : $option_object->get_debug_value( $settings ) + ); + } + return $values; + } + + /** + * @return mixed[] Values of plugin settings. + */ + public function get_public_values(): array { + $settings = $this->get_values(); + + $values = []; + foreach ( $this->options_aggregator->get_options() as $option_object ) { + $values[ $option_object->get_name() ] = $option_object->get_public_value( + $settings[ $option_object->get_name() ] + ); + } + return $values; + } + + /** + * Retrieves and validates submitted plugin setting values from POST data. + * + * @return mixed[]|null Array of validated setting names and their values. + * Returns null if form submission verification fails. + */ + public function get_validated_posted_values(): ?array { + $nonce_value = sanitize_text_field( wp_unslash( $_POST[ SettingsManager::NONCE_PARAM_KEY ] ?? '' ) ); + if ( ! wp_verify_nonce( $nonce_value, SettingsManager::NONCE_PARAM_VALUE ) ) { + return null; + } + + $form_type = ( isset( $_POST[ SettingsManager::FORM_TYPE_PARAM_KEY ] ) ) + ? sanitize_text_field( wp_unslash( $_POST[ SettingsManager::FORM_TYPE_PARAM_KEY ] ?? '' ) ) + : ''; + if ( $form_type === '' ) { + return []; + } + + $settings = OptionsAccessManager::get_option( SettingsManager::SETTINGS_OPTION, [] ); + + $values = []; + foreach ( $this->options_aggregator->get_options( $form_type ) as $option_object ) { + $values[ $option_object->get_name() ] = $option_object->validate_value( + ( isset( $_POST[ $option_object->get_name() ] ) ) ? wp_unslash( $_POST[ $option_object->get_name() ] ) : null, // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $option_object->get_available_values( $settings ), + $option_object->get_disabled_values( $settings ) + ); + } + return $values; + } + + /** + * Validates provided plugin setting values. + * + * @param mixed[] $form_data Plugin settings data to validate. + * + * @return mixed[] Array of validated setting names and their values. + */ + public function get_validated_form_values( array $form_data ): array { + $values = []; + foreach ( $this->options_aggregator->get_options() as $option_object ) { + $values[ $option_object->get_name() ] = $option_object->validate_value( + $form_data[ $option_object->get_name() ] ?? $option_object->get_default_value(), + $option_object->get_available_values( $form_data ), + $option_object->get_disabled_values( $form_data ) + ); + } + return $values; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Page/AdvancedSettingsPage.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/AdvancedSettingsPage.php new file mode 100755 index 00000000..6fb8973f --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/AdvancedSettingsPage.php @@ -0,0 +1,41 @@ + $this->plugin_data->get_settings_fields( OptionAbstract::FORM_TYPE_ADVANCED ), + 'form_input_value' => OptionAbstract::FORM_TYPE_ADVANCED, + ] + ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Page/BulkOptimizationPage.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/BulkOptimizationPage.php new file mode 100755 index 00000000..7dc77159 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/BulkOptimizationPage.php @@ -0,0 +1,57 @@ + null, + 'form_input_value' => null, + ] + ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Page/CdnSettingsPage.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/CdnSettingsPage.php new file mode 100755 index 00000000..82b25032 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/CdnSettingsPage.php @@ -0,0 +1,45 @@ + $this->plugin_data->get_settings_fields( OptionAbstract::FORM_TYPE_CDN ), + 'form_input_value' => OptionAbstract::FORM_TYPE_CDN, + 'api_paths_url' => null, + 'api_paths_nonce' => null, + 'api_regenerate_url' => null, + 'api_regenerate_nonce' => null, + ] + ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Page/DebugPage.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/DebugPage.php new file mode 100755 index 00000000..fde99e60 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/DebugPage.php @@ -0,0 +1,125 @@ +plugin_info = $plugin_info; + $this->plugin_data = $plugin_data; + $this->file_loader = $file_loader ?: new FileLoader(); + } + + /** + * {@inheritdoc} + */ + public function get_slug(): string { + return self::PAGE_SLUG; + } + + /** + * {@inheritdoc} + */ + public static function get_label(): string { + return __( 'Help Center', 'webp-converter-for-media' ); + } + + /** + * {@inheritdoc} + */ + public function get_template_path(): string { + return self::PAGE_VIEW_PATH; + } + + /** + * {@inheritdoc} + */ + public function get_template_vars(): array { + $uploads_url = apply_filters( 'webpc_dir_url', '', 'uploads' ); + $uploads_path = apply_filters( 'webpc_dir_path', '', 'uploads' ); + $ver_param = uniqid(); + + $errors_messages = apply_filters( 'webpc_server_errors_messages', [] ); + $errors_codes = apply_filters( 'webpc_server_errors', [] ); + + do_action( LoaderAbstract::ACTION_NAME, true, true ); + return [ + 'logo_url' => $this->plugin_info->get_plugin_directory_url() . 'assets/img/logo-headline.png', + 'size_png_path' => $this->file_loader->get_file_size_by_path( + $uploads_path . RewritesErrorsDetector::PATH_OUTPUT_FILE_PNG + ), + 'size_png2_path' => $this->file_loader->get_file_size_by_path( + $uploads_path . RewritesErrorsDetector::PATH_OUTPUT_FILE_PNG2 + ), + 'size_png_url' => $this->file_loader->get_file_size_by_url( + $uploads_url . RewritesErrorsDetector::PATH_OUTPUT_FILE_PNG, + false, + $ver_param + ), + 'size_png2_url' => $this->file_loader->get_file_size_by_url( + $uploads_url . RewritesErrorsDetector::PATH_OUTPUT_FILE_PNG2, + false, + $ver_param + ), + 'size_png_as_webp_url' => $this->file_loader->get_file_size_by_url( + $uploads_url . RewritesErrorsDetector::PATH_OUTPUT_FILE_PNG, + true, + $ver_param + ), + 'size_png2_as_webp_url' => $this->file_loader->get_file_size_by_url( + $uploads_url . RewritesErrorsDetector::PATH_OUTPUT_FILE_PNG2, + true, + $ver_param + ), + 'plugin_settings' => $this->plugin_data->get_plugin_settings_public(), + 'url_debug_page' => PageIntegrator::get_settings_page_url( self::PAGE_SLUG ), + 'errors_messages' => $errors_messages, + 'errors_codes' => $errors_codes, + ]; + } + + /** + * {@inheritdoc} + */ + public function do_action_before_load() { + } + + /** + * {@inheritdoc} + */ + public function do_action_after_load() { + do_action( LoaderAbstract::ACTION_NAME, true ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Page/ExpertSettingsPage.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/ExpertSettingsPage.php new file mode 100755 index 00000000..ad5520a2 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/ExpertSettingsPage.php @@ -0,0 +1,55 @@ + $this->plugin_data->get_settings_fields( OptionAbstract::FORM_TYPE_EXPERT ), + 'form_input_value' => OptionAbstract::FORM_TYPE_EXPERT, + 'api_paths_url' => null, + 'api_paths_nonce' => null, + 'api_regenerate_url' => null, + 'api_regenerate_nonce' => null, + ] + ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Page/GeneralSettingsPage.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/GeneralSettingsPage.php new file mode 100755 index 00000000..4ff7b87b --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/GeneralSettingsPage.php @@ -0,0 +1,147 @@ +plugin_info = $plugin_info; + $this->plugin_data = $plugin_data; + $this->token_repository = $token_repository; + $this->format_factory = $format_factory; + } + + /** + * {@inheritdoc} + */ + public function get_slug(): ?string { + return self::PAGE_SLUG; + } + + /** + * {@inheritdoc} + */ + public static function get_label(): string { + return __( 'General Settings', 'webp-converter-for-media' ); + } + + /** + * {@inheritdoc} + */ + public function get_template_path(): string { + return self::PAGE_VIEW_PATH; + } + + /** + * {@inheritdoc} + */ + public function get_template_vars(): array { + $token = $this->token_repository->get_token(); + + return [ + 'logo_url' => $this->plugin_info->get_plugin_directory_url() . 'assets/img/logo-headline.png', + 'author_image_url' => $this->plugin_info->get_plugin_directory_url() . 'assets/img/author.png', + 'form_options' => $this->plugin_data->get_settings_fields( OptionAbstract::FORM_TYPE_GENERAL ), + 'form_sidebar_options' => $this->plugin_data->get_settings_fields( OptionAbstract::FORM_TYPE_SIDEBAR ), + 'form_input_name' => SettingsManager::FORM_TYPE_PARAM_KEY, + 'form_input_value' => OptionAbstract::FORM_TYPE_GENERAL, + 'form_sidebar_input_value' => OptionAbstract::FORM_TYPE_SIDEBAR, + 'nonce_input_name' => SettingsManager::NONCE_PARAM_KEY, + 'nonce_input_value' => wp_create_nonce( SettingsManager::NONCE_PARAM_VALUE ), + 'token_valid_status' => $token->get_valid_status(), + 'token_active_status' => $token->is_active(), + 'api_paths_url' => PathsEndpoint::get_route_url(), + 'api_paths_nonce' => PathsEndpoint::get_route_nonce(), + 'api_regenerate_url' => RegenerateEndpoint::get_route_url(), + 'api_regenerate_nonce' => RegenerateEndpoint::get_route_nonce(), + 'api_stats_url' => FilesStatsEndpoint::get_route_url(), + 'api_stats_nonce' => FilesStatsEndpoint::get_route_nonce(), + 'url_debug_page' => PageIntegrator::get_settings_page_url( DebugPage::PAGE_SLUG ), + 'output_formats' => [ + 'webp' => [ + 'label' => 'WebP', + 'desc' => ( ! $token->get_valid_status() ) + ? __( 'available in the free version', 'webp-converter-for-media' ) + : null, + ], + 'avif' => [ + 'label' => 'AVIF', + 'desc' => ( ! $token->get_valid_status() ) + ? sprintf( + /* translators: %1$s: open anchor tag, %2$s: close anchor tag */ + __( 'available in %1$sthe PRO version%2$s', 'webp-converter-for-media' ), + '', + '' + ) + : null, + ], + ], + 'errors_messages' => apply_filters( 'webpc_server_errors_messages', [] ), + 'errors_codes' => apply_filters( 'webpc_server_errors', [] ), + ]; + } + + /** + * {@inheritdoc} + */ + public function do_action_before_load() { + ( new SettingsManager( $this->plugin_data, $this->token_repository, $this->format_factory ) )->save_settings(); + ( new NoticeIntegrator( $this->plugin_info, new WelcomeNotice() ) )->set_disable_value(); + + do_action( LoaderAbstract::ACTION_NAME, true ); + wp_clear_scheduled_hook( CronEventGenerator::CRON_PATHS_ACTION ); + } + + /** + * {@inheritdoc} + */ + public function do_action_after_load() { + do_action( LoaderAbstract::ACTION_NAME, true ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Page/PageAbstract.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/PageAbstract.php new file mode 100755 index 00000000..bfa7290e --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/PageAbstract.php @@ -0,0 +1,30 @@ +get_slug() ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Page/PageIntegrator.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/PageIntegrator.php new file mode 100755 index 00000000..81296fe7 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/PageIntegrator.php @@ -0,0 +1,176 @@ +view_loader = $view_loader ?: new ViewLoader( $plugin_info ); + } + + /** + * Objects of supported plugin settings pages. + * + * @var PageInterface[] + */ + private $pages = []; + + /** + * {@inheritdoc} + */ + public function init_hooks() { + add_action( 'admin_menu', [ $this, 'add_settings_page_for_admin' ] ); + add_action( 'network_admin_menu', [ $this, 'add_settings_page_for_network' ] ); + } + + /** + * @return PageInterface|null + */ + private function get_current_page() { + $page_name = $_GET['page'] ?? null; // phpcs:ignore WordPress.Security + $tab_name = $_GET[ self::SETTINGS_PAGE_TYPE ] ?? null; // phpcs:ignore WordPress.Security + + foreach ( $this->pages as $page ) { + if ( ( $page->get_menu_parent() === $page_name ) && ( $page->get_slug() === $tab_name ) ) { + return $page; + } + } + return null; + } + + /** + * Sets integration for page. + * + * @param PageInterface $page . + * + * @return self + */ + public function set_page_integration( PageInterface $page ) { + $this->pages[] = $page; + + return $this; + } + + /** + * Returns URL of plugin settings page. + * + * @param string|null $action . + * + * @return string + */ + public static function get_settings_page_url( ?string $action = null ): string { + if ( ! is_multisite() ) { + $page_url = admin_url( 'options-general.php?page=' . self::SETTINGS_MENU_PAGE ); + } else { + $page_url = network_admin_url( 'settings.php?page=' . self::SETTINGS_MENU_PAGE ); + } + + if ( $action !== null ) { + $page_url .= '&' . self::SETTINGS_PAGE_TYPE . '=' . $action; + } + return $page_url; + } + + /** + * Adds settings page to menu for non-multisite websites. + * + * @return void + * @internal + */ + public function add_settings_page_for_admin() { + if ( is_multisite() ) { + return; + } + $this->add_settings_page( 'options-general.php', self::SETTINGS_MENU_PAGE ); + $this->add_settings_page( 'upload.php', self::UPLOAD_MENU_PAGE ); + } + + /** + * Adds settings page to menu for multisite websites. + * + * @return void + * @internal + */ + public function add_settings_page_for_network() { + $this->add_settings_page( 'settings.php', self::SETTINGS_MENU_PAGE ); + } + + /** + * Creates plugin settings page in WordPress Admin Dashboard. + * + * @param string $parent_page Parent menu page. + * @param string $menu_page . + * + * @return void + */ + private function add_settings_page( string $parent_page, string $menu_page ) { + add_submenu_page( + $parent_page, + 'Converter for Media', + 'Converter for Media', + 'manage_options', + $menu_page, + [ $this, 'load_plugin_page' ] + ); + } + + /** + * @return void + * @internal + */ + public function load_plugin_page() { + if ( ! current_user_can( 'manage_options' ) ) { + wp_die( esc_html__( 'Sorry, you do not have permission to do that.', 'webp-converter-for-media' ) ); + } + + $page = $this->get_current_page(); + if ( $page === null ) { + return; + } + + $page->do_action_before_load(); + do_action( 'webpc_settings_page_loaded', $page->get_menu_parent(), $page->get_slug() ); + + $this->view_loader->load_view( + $page->get_template_path(), + array_merge( + $page->get_template_vars(), + [ + 'menu_items' => array_map( + function ( PageInterface $settings_page ) use ( $page ) { + return [ + 'url' => $settings_page->get_menu_url(), + 'title' => $settings_page->get_label(), + 'is_active' => ( $settings_page === $page ), + ]; + }, + array_filter( + $this->pages, + function ( $page ) { + return ( $page->is_available() ); + } + ) + ), + ] + ) + ); + + $page->do_action_after_load(); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/Settings/Page/PageInterface.php b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/PageInterface.php new file mode 100755 index 00000000..39c30abd --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/Settings/Page/PageInterface.php @@ -0,0 +1,54 @@ +plugin_data = $plugin_data; + $this->format_factory = $format_factory; + $this->token_validator = $token_validator ?: new TokenValidator( $token_repository ); + } + + /** + * @return void + */ + public function save_settings() { + $posted_settings = $this->plugin_data->get_validated_posted_data(); + if ( $posted_settings === null ) { + return; + } + + $previous_settings = $this->plugin_data->get_plugin_settings(); + $plugin_settings = array_merge( $previous_settings, $posted_settings ); + $token = $this->token_validator->validate_token( $plugin_settings[ AccessTokenOption::OPTION_NAME ] ); + + $this->format_factory->reset_available_formats(); + + if ( $token->get_valid_status() ) { + $plugin_settings[ ConversionMethodOption::OPTION_NAME ] = RemoteMethod::METHOD_NAME; + + if ( isset( $posted_settings[ AccessTokenOption::OPTION_NAME ] ) || ! $plugin_settings[ OutputFormatsOption::OPTION_NAME ] ) { + $plugin_settings[ OutputFormatsOption::OPTION_NAME ] = [ + AvifFormat::FORMAT_EXTENSION, + WebpFormat::FORMAT_EXTENSION, + ]; + } + } elseif ( ( $plugin_settings[ ConversionMethodOption::OPTION_NAME ] === RemoteMethod::METHOD_NAME ) + && ! $plugin_settings[ AccessTokenOption::OPTION_NAME ] ) { + $plugin_settings[ ConversionMethodOption::OPTION_NAME ] = null; + } + + $plugin_settings = $this->plugin_data->get_validated_form_data( $plugin_settings ); + OptionsAccessManager::update_option( self::SETTINGS_OPTION, $plugin_settings ); + $this->plugin_data->invalidate_plugin_settings(); + + do_action( 'webpc_settings_updated', $plugin_settings, $previous_settings ); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/WebpConverter.php b/wp-content/plugins/webp-converter-for-media/src/WebpConverter.php new file mode 100755 index 00000000..5db3c7ed --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/WebpConverter.php @@ -0,0 +1,75 @@ +init_hooks(); + ( new Action\ConvertPathsAction( $plugin_data, $method_factory ) )->init_hooks(); + ( new Action\DeleteFileHandler() )->init_hooks(); + ( new Action\DeletePathsAction( $format_factory ) )->init_hooks(); + ( new Action\UploadFileHandler( $plugin_data, $token_repository, $format_factory ) )->init_hooks(); + $directory_factory->init_hooks(); + ( new Endpoint\EndpointIntegrator( new Endpoint\CronConversionEndpoint( $plugin_data, $token_repository, $format_factory ) ) )->init_hooks(); + ( new Endpoint\EndpointIntegrator( new Endpoint\FilesStatsEndpoint( $plugin_data, $format_factory ) ) )->init_hooks(); + ( new Endpoint\EndpointIntegrator( new Endpoint\PathsEndpoint( $plugin_data, $token_repository, $format_factory ) ) )->init_hooks(); + ( new Endpoint\EndpointIntegrator( new Endpoint\RegenerateEndpoint( $plugin_data, $method_factory ) ) )->init_hooks(); + ( new Endpoint\EndpointIntegrator( new Endpoint\RegenerateAttachmentEndpoint() ) )->init_hooks(); + ( new Conversion\ExcludedPathsOperator( $plugin_data ) )->init_hooks(); + ( new Cron\CronEventGenerator( $plugin_data, $token_repository, $format_factory ) )->init_hooks(); + ( new Cron\CronSchedulesGenerator() )->init_hooks(); + ( new Cron\CronStatusViewer() )->init_hooks(); + ( new ErrorDetectorAggregator( $plugin_info, $plugin_data, $format_factory ) )->init_hooks(); + ( new Notice\NoticeIntegrator( $plugin_info, new Notice\WelcomeNotice() ) )->init_hooks(); + ( new Notice\NoticeIntegrator( $plugin_info, new Notice\ThanksNotice() ) )->init_hooks(); + ( new Notice\NoticeIntegrator( $plugin_info, new Notice\CloudflareNotice() ) )->init_hooks(); + ( new Notice\NoticeIntegrator( $plugin_info, new Notice\TokenInactiveNotice( $plugin_data, $token_repository ) ) )->init_hooks(); + ( new Notice\NoticeIntegrator( $plugin_info, new Notice\BlackFridayNotice( $plugin_data ) ) )->init_hooks(); + ( new Notice\NoticeIntegrator( $plugin_info, new Notice\UpgradeNotice( $plugin_data ) ) )->init_hooks(); + ( new Loader\LoaderIntegrator( new Loader\HtaccessLoader( $plugin_info, $plugin_data, $format_factory ) ) )->init_hooks(); + ( new Loader\LoaderIntegrator( new Loader\HtaccessBypassingLoader( $plugin_info, $plugin_data, $format_factory ) ) )->init_hooks(); + ( new Loader\LoaderIntegrator( new Loader\PassthruLoader( $plugin_info, $plugin_data, $format_factory ) ) )->init_hooks(); + ( new Plugin\ActivationHandler( $plugin_info ) )->init_hooks(); + ( new Plugin\DeactivationHandler( $plugin_info ) )->init_hooks(); + ( new Plugin\PluginLinksGenerator( $plugin_info, $token_repository ) )->init_hooks(); + ( new Plugin\UninstallHandler( $plugin_info ) )->init_hooks(); + ( new Page\PageIntegrator( $plugin_info ) ) + ->set_page_integration( new Page\GeneralSettingsPage( $plugin_info, $plugin_data, $token_repository, $format_factory ) ) + ->set_page_integration( new Page\AdvancedSettingsPage( $plugin_info, $plugin_data, $token_repository, $format_factory ) ) + ->set_page_integration( new Page\CdnSettingsPage( $plugin_info, $plugin_data, $token_repository, $format_factory ) ) + ->set_page_integration( new Page\DebugPage( $plugin_info, $plugin_data ) ) + ->set_page_integration( new Page\BulkOptimizationPage( $plugin_info, $plugin_data, $token_repository, $format_factory ) ) + ->set_page_integration( new Page\ExpertSettingsPage( $plugin_info, $plugin_data, $token_repository, $format_factory ) ) + ->init_hooks(); + ( new Service\BackupExcluder( $plugin_data ) )->init_hooks(); + ( new Service\CacheIntegrator( $plugin_info ) )->init_hooks(); + ( new Service\CloudflareConfigurator( $plugin_info, $plugin_data ) )->init_hooks(); + ( new Service\DeactivationModalLoader( $plugin_info, $plugin_data ) )->init_hooks(); + ( new Service\MediaStatusViewer( $plugin_data, $token_repository, $format_factory ) )->init_hooks(); + ( new Service\SiteHealthDetector( $plugin_data ) )->init_hooks(); + ( new Service\RestApiUnlocker() )->init_hooks(); + ( new Service\WpCliManager( $plugin_data, $token_repository, $method_factory, $format_factory ) )->init_hooks(); + ( new Settings\AdminAssetsLoader( $plugin_info ) )->init_hooks(); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/src/WebpConverterConstants.php b/wp-content/plugins/webp-converter-for-media/src/WebpConverterConstants.php new file mode 100755 index 00000000..3d0db33d --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/src/WebpConverterConstants.php @@ -0,0 +1,20 @@ + + +

+ + $label ) : ?> +
+ + + > + + +
+ diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/fields/image_size.php b/wp-content/plugins/webp-converter-for-media/templates/components/fields/image_size.php new file mode 100755 index 00000000..aa49c9de --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/fields/image_size.php @@ -0,0 +1,61 @@ + +
+ + + > + + +
+ +
+ + + +
+ + > +
+ + + +
+ + > +
+
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/fields/input.php b/wp-content/plugins/webp-converter-for-media/templates/components/fields/input.php new file mode 100755 index 00000000..2fe0e359 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/fields/input.php @@ -0,0 +1,27 @@ + + +

+ +
+ +
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/fields/quality.php b/wp-content/plugins/webp-converter-for-media/templates/components/fields/quality.php new file mode 100755 index 00000000..216a2a7d --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/fields/quality.php @@ -0,0 +1,71 @@ + + +

+ +
+
+ $label ) : ?> +
+ > + +
+ +
+
+
+ ' . __( 'Lossy', 'webp-converter-for-media' ) . '' + ) + ); + ?> +
+
+
+ ' . __( 'Optimal', 'webp-converter-for-media' ) . '' + ) + ); + ?> +
+
+
+ ' . __( 'Lossless', 'webp-converter-for-media' ) . '' + ) + ); + ?> +
+
+
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/fields/radio.php b/wp-content/plugins/webp-converter-for-media/templates/components/fields/radio.php new file mode 100755 index 00000000..3c8f2197 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/fields/radio.php @@ -0,0 +1,39 @@ + + +

+ + $label ) : ?> +
+ + + > + + + + + + + + + +
+ diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/fields/toggle.php b/wp-content/plugins/webp-converter-for-media/templates/components/fields/toggle.php new file mode 100755 index 00000000..156e8cec --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/fields/toggle.php @@ -0,0 +1,26 @@ + +
+ + > + + +
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/fields/token.php b/wp-content/plugins/webp-converter-for-media/templates/components/fields/token.php new file mode 100755 index 00000000..7bab9d73 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/fields/token.php @@ -0,0 +1,42 @@ + + +

+ +
+ + > +
+ +

+ +
+ + + + +

+ diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/notices/clear-cache.php b/wp-content/plugins/webp-converter-for-media/templates/components/notices/clear-cache.php new file mode 100755 index 00000000..738f2cd7 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/notices/clear-cache.php @@ -0,0 +1,50 @@ + +
+
+

+ +

+
    + $step_message ) : ?> +
  • + +
  • + +
+
+ +
+
+
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/notices/discount-coupon.php b/wp-content/plugins/webp-converter-for-media/templates/components/notices/discount-coupon.php new file mode 100755 index 00000000..19fb10ee --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/notices/discount-coupon.php @@ -0,0 +1,61 @@ + +
+
+

+ +

+

+ ' . $coupon_code . '', + $discount_value, + wp_date( get_option( 'date_format' ), strtotime( $promotion_date ) ?: 0 ) + ) + ); + ?> +

+
+ + + +
+
+
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/notices/thanks.php b/wp-content/plugins/webp-converter-for-media/templates/components/notices/thanks.php new file mode 100755 index 00000000..844f736b --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/notices/thanks.php @@ -0,0 +1,54 @@ + +
+
+

+ +

+

+ +

+
+ + + + +
+
+
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/notices/token-invalid.php b/wp-content/plugins/webp-converter-for-media/templates/components/notices/token-invalid.php new file mode 100755 index 00000000..c05ffaf7 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/notices/token-invalid.php @@ -0,0 +1,49 @@ + +
+
+

+ +

+

+ +

+
+ + + +
+
+
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/notices/upgrade.php b/wp-content/plugins/webp-converter-for-media/templates/components/notices/upgrade.php new file mode 100755 index 00000000..413f5363 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/notices/upgrade.php @@ -0,0 +1,66 @@ + +
+
+

+ +

+

+ + ', + '20%', + '', + '20D4FD7814' + ) + ); + ?> +

+
+ + + + +
+
+
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/notices/welcome.php b/wp-content/plugins/webp-converter-for-media/templates/components/notices/welcome.php new file mode 100755 index 00000000..6bda50a0 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/notices/welcome.php @@ -0,0 +1,60 @@ + +
+
+

+ +

+

+ ' + ) + ); + ?> +

+ + +
+
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/server/debug.php b/wp-content/plugins/webp-converter-for-media/templates/components/server/debug.php new file mode 100755 index 00000000..4189e687 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/server/debug.php @@ -0,0 +1,96 @@ + +

Errors debug

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Size of PNG (by server path) + +
Size of PNG2 (by server path) + +
Size of PNG as WEBP (by URL) + +
Size of PNG as PNG (by URL) + +
Size of PNG2 as WEBP (by URL) + +
Size of PNG2 as PNG2 (by URL) + +
Plugin settings + +
Error codes + +
Token validation request + +
Error detection logs + + +
+ +
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/server/filters.php b/wp-content/plugins/webp-converter-for-media/templates/components/server/filters.php new file mode 100755 index 00000000..2d7ec2b4 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/server/filters.php @@ -0,0 +1,79 @@ + +

Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
webpc_site_url + +
webpc_site_root + +
webpc_dir_path (plugins) + +
webpc_dir_path (themes) + +
webpc_dir_path (uploads) + +
webpc_dir_path (webp) + +
webpc_source_directories + +
webpc_htaccess_rewrite_root + +
webpc_htaccess_rewrite_path + +
webpc_htaccess_rewrite_output + +
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/server/gd.php b/wp-content/plugins/webp-converter-for-media/templates/components/server/gd.php new file mode 100755 index 00000000..e168b06f --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/server/gd.php @@ -0,0 +1,18 @@ + +

gd

+ +

-

+ + info(); ?> + diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/server/imagick.php b/wp-content/plugins/webp-converter-for-media/templates/components/server/imagick.php new file mode 100755 index 00000000..303d2c86 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/server/imagick.php @@ -0,0 +1,18 @@ + +

imagick

+ +

-

+ + info(); ?> + diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/server/options.php b/wp-content/plugins/webp-converter-for-media/templates/components/server/options.php new file mode 100755 index 00000000..7b031f3c --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/server/options.php @@ -0,0 +1,122 @@ + +

Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/server/php.php b/wp-content/plugins/webp-converter-for-media/templates/components/server/php.php new file mode 100755 index 00000000..b7655df3 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/server/php.php @@ -0,0 +1,47 @@ + +

PHP

+ + + + + + + + + + + + + + + + + + + + + + + +
Version + +
memory_limit + +
max_execution_time + +
disable_functions + +
SERVER_SOFTWARE + +
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/server/sub-sizes.php b/wp-content/plugins/webp-converter-for-media/templates/components/server/sub-sizes.php new file mode 100755 index 00000000..b0ef902e --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/server/sub-sizes.php @@ -0,0 +1,34 @@ + +

+ +

+ + + $size_data ) : ?> + + + + + +
+ +
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/server/wordpress.php b/wp-content/plugins/webp-converter-for-media/templates/components/server/wordpress.php new file mode 100755 index 00000000..f03a9598 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/server/wordpress.php @@ -0,0 +1,71 @@ + +

WordPress

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ABSPATH + +
DOCUMENT_ROOT + +
DOCUMENT_ROOT (realpath) + +
WP_CONTENT_DIR + +
UPLOADS + +
get_option (upload_path) + +
wp_upload_dir (basedir) + +
home_url + +
site_url + +
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/widgets/about.php b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/about.php new file mode 100755 index 00000000..e261abf3 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/about.php @@ -0,0 +1,41 @@ + +
+

+ +

+
+

+ +

+

+ +

+

+ + + +

+
+
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/widgets/errors.php b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/errors.php new file mode 100755 index 00000000..d73f0ff6 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/errors.php @@ -0,0 +1,46 @@ + + +
+

+ +

+
+ $error_lines ) : ?> + 0 ) : ?> +

---

+ + +

+ + +

---

+

+ ', + '', + implode( ', ', $errors_codes ) + ) + ); + ?> +

+
+
+ diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/widgets/menu.php b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/menu.php new file mode 100755 index 00000000..45c1f7a4 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/menu.php @@ -0,0 +1,30 @@ + +
+
+
+ + +
+ + + +
+ + +
+
+
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/widgets/options-sidebar.php b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/options-sidebar.php new file mode 100755 index 00000000..efb9aa37 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/options-sidebar.php @@ -0,0 +1,62 @@ + +
+ +
+ + + $option ) : ?> +
+
    +
  • + +

    + + +
  • + +
  • +
    + +

    + +
    +
  • + +
+
+ +
+ + + + + +
+
+
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/widgets/options.php b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/options.php new file mode 100755 index 00000000..f476f40c --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/options.php @@ -0,0 +1,54 @@ + +
+
+ + + $option ) : ?> +
+
    +
  • + +

    + + +
  • + +
  • +
    + +

    + +
    +
  • + +
+
+ +
+ +
+
+
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/widgets/regenerate-popup.php b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/regenerate-popup.php new file mode 100755 index 00000000..bc4bf76f --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/regenerate-popup.php @@ -0,0 +1,211 @@ + + + + diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/widgets/regenerate.php b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/regenerate.php new file mode 100755 index 00000000..facf8c8e --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/regenerate.php @@ -0,0 +1,228 @@ + +
+

+ +

+
+
+

+ ', + '' + ) + ); + ?> +

+
+
+
+

+ + + + +

+
+

+ +

+ +
+
+
+
+
+

+ +

+
+
+
+
+ $format_data ) : ?> +
+
+ + + + + +
+
+ 0%', + esc_html( $format_data['label'] ) + ); + ?> +
+
+ 0' + ); + ?> +
+
+ ' + ); + ?> +
+
+
+ +
+ +
+ +
+ +
+
+ +
+
+ + + + + + + + +
+ + + + +
+ +
+ +

+ ', + '' + ) + ); + ?> +

+
+ +
+
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/widgets/server.php b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/server.php new file mode 100755 index 00000000..3e368faf --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/server.php @@ -0,0 +1,64 @@ + +
+
+
+

+ ', + '', + '', + '', + '', + '' + ) + ); + ?> +

+

+ +

+
+
+
+ +
+
+
+
diff --git a/wp-content/plugins/webp-converter-for-media/templates/components/widgets/support.php b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/support.php new file mode 100755 index 00000000..602d9ba1 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/components/widgets/support.php @@ -0,0 +1,35 @@ + +
+

+ +

+
+

+ +

+

+ + + +

+
+
diff --git a/wp-content/plugins/webp-converter-for-media/templates/views/settings-debug.php b/wp-content/plugins/webp-converter-for-media/templates/views/settings-debug.php new file mode 100755 index 00000000..52ee324d --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/views/settings-debug.php @@ -0,0 +1,67 @@ + +
+
+
+
+ <?php echo esc_attr( 'Converter for Media' ); ?> +
+
+
    +
  • + +
  • +
  • + +
  • +
+
+ +
+
diff --git a/wp-content/plugins/webp-converter-for-media/templates/views/settings.php b/wp-content/plugins/webp-converter-for-media/templates/views/settings.php new file mode 100755 index 00000000..27622e1d --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/templates/views/settings.php @@ -0,0 +1,98 @@ + +
+
+
+
+ <?php echo esc_attr( 'Converter for Media' ); ?> +
+
+
    +
  • + +
    + +
    + +
    + +
    + + +
  • +
  • + +
  • +
+
+ + +
+
diff --git a/wp-content/plugins/webp-converter-for-media/vendor/autoload.php b/wp-content/plugins/webp-converter-for-media/vendor/autoload.php new file mode 100755 index 00000000..02c76ea8 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor/autoload.php @@ -0,0 +1,22 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + /** @var \Closure(string):void */ + private static $includeFile; + + /** @var string|null */ + private $vendorDir; + + // PSR-4 + /** + * @var array> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array> + */ + private $prefixDirsPsr4 = array(); + /** + * @var list + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * List of PSR-0 prefixes + * + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) + * + * @var array>> + */ + private $prefixesPsr0 = array(); + /** + * @var list + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var array + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var array + */ + private $missingClasses = array(); + + /** @var string|null */ + private $apcuPrefix; + + /** + * @var array + */ + private static $registeredLoaders = array(); + + /** + * @param string|null $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + self::initializeIncludeClosure(); + } + + /** + * @return array> + */ + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + /** + * @return array> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return list + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return list + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return array Array of classname => path + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + * + * @return void + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void + */ + public function add($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 base directories + * + * @return void + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + * + * @return void + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + * + * @return void + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + * + * @return void + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } + } + + /** + * Unregisters this instance as an autoloader. + * + * @return void + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return true|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + $includeFile = self::$includeFile; + $includeFile($file); + + return true; + } + + return null; + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + /** + * Returns the currently registered loaders keyed by their corresponding vendor directories. + * + * @return array + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } + + /** + * @return void + */ + private static function initializeIncludeClosure() + { + if (self::$includeFile !== null) { + return; + } + + /** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + */ + self::$includeFile = \Closure::bind(static function($file) { + include $file; + }, null, null); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/vendor/composer/InstalledVersions.php b/wp-content/plugins/webp-converter-for-media/vendor/composer/InstalledVersions.php new file mode 100755 index 00000000..2052022f --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor/composer/InstalledVersions.php @@ -0,0 +1,396 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer; + +use Composer\Autoload\ClassLoader; +use Composer\Semver\VersionParser; + +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final + */ +class InstalledVersions +{ + /** + * @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to + * @internal + */ + private static $selfDir = null; + + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null + */ + private static $installed; + + /** + * @var bool + */ + private static $installedIsLocalDir; + + /** + * @var bool|null + */ + private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array}> + */ + private static $installedByVendor = array(); + + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + + if (1 === \count($packages)) { + return $packages[0]; + } + + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + + return $packagesByType; + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints((string) $constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} + */ + public static function getRawData() + { + @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = include __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + + return self::$installed; + } + + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + + // when using reload, we disable the duplicate protection to ensure that self::$installed data is + // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, + // so we have to assume it does not, and that may result in duplicate data being returned when listing + // all installed packages for example + self::$installedIsLocalDir = false; + } + + /** + * @return string + */ + private static function getSelfDir() + { + if (self::$selfDir === null) { + self::$selfDir = strtr(__DIR__, '\\', '/'); + } + + return self::$selfDir; + } + + /** + * @return array[] + * @psalm-return list}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + $copiedLocalDir = false; + + if (self::$canGetVendors) { + $selfDir = self::getSelfDir(); + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + $vendorDir = strtr($vendorDir, '\\', '/'); + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require $vendorDir.'/composer/installed.php'; + self::$installedByVendor[$vendorDir] = $required; + $installed[] = $required; + if (self::$installed === null && $vendorDir.'/composer' === $selfDir) { + self::$installed = $required; + self::$installedIsLocalDir = true; + } + } + if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) { + $copiedLocalDir = true; + } + } + } + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require __DIR__ . '/installed.php'; + self::$installed = $required; + } else { + self::$installed = array(); + } + } + + if (self::$installed !== array() && !$copiedLocalDir) { + $installed[] = self::$installed; + } + + return $installed; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/vendor/composer/LICENSE b/wp-content/plugins/webp-converter-for-media/vendor/composer/LICENSE new file mode 100755 index 00000000..f27399a0 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_classmap.php b/wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_classmap.php new file mode 100755 index 00000000..9a3da3ce --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_classmap.php @@ -0,0 +1,203 @@ + $vendorDir . '/composer/InstalledVersions.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Exception\\DuplicatedFormOptionKeyException' => $baseDir . '/vendor_prefixed/src/Exception/DuplicatedFormOptionKeyException.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Exception\\DuplicatedFormValueKeyException' => $baseDir . '/vendor_prefixed/src/Exception/DuplicatedFormValueKeyException.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Exception\\UnknownFormOptionKeyException' => $baseDir . '/vendor_prefixed/src/Exception/UnknownFormOptionKeyException.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Hookable' => $baseDir . '/vendor_prefixed/src/Hookable.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Modal' => $baseDir . '/vendor_prefixed/src/Modal.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Model\\FormOption' => $baseDir . '/vendor_prefixed/src/Model/FormOption.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Model\\FormOptions' => $baseDir . '/vendor_prefixed/src/Model/FormOptions.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Model\\FormTemplate' => $baseDir . '/vendor_prefixed/src/Model/FormTemplate.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Model\\FormValue' => $baseDir . '/vendor_prefixed/src/Model/FormValue.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Model\\FormValues' => $baseDir . '/vendor_prefixed/src/Model/FormValues.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Model\\RequestData' => $baseDir . '/vendor_prefixed/src/Model/RequestData.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Service\\AssetsPrinterService' => $baseDir . '/vendor_prefixed/src/Service/AssetsPrinterService.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Service\\TemplateGeneratorService' => $baseDir . '/vendor_prefixed/src/Service/TemplateGeneratorService.php', + 'WebpConverter\\Action\\ConvertAttachmentAction' => $baseDir . '/src/Action/ConvertAttachmentAction.php', + 'WebpConverter\\Action\\ConvertPathsAction' => $baseDir . '/src/Action/ConvertPathsAction.php', + 'WebpConverter\\Action\\DeleteFileHandler' => $baseDir . '/src/Action/DeleteFileHandler.php', + 'WebpConverter\\Action\\DeletePathsAction' => $baseDir . '/src/Action/DeletePathsAction.php', + 'WebpConverter\\Action\\UploadFileHandler' => $baseDir . '/src/Action/UploadFileHandler.php', + 'WebpConverter\\Conversion\\AttachmentPathsGenerator' => $baseDir . '/src/Conversion/AttachmentPathsGenerator.php', + 'WebpConverter\\Conversion\\CrashedFilesOperator' => $baseDir . '/src/Conversion/CrashedFilesOperator.php', + 'WebpConverter\\Conversion\\Cron\\CronEventGenerator' => $baseDir . '/src/Conversion/Cron/CronEventGenerator.php', + 'WebpConverter\\Conversion\\Cron\\CronInitiator' => $baseDir . '/src/Conversion/Cron/CronInitiator.php', + 'WebpConverter\\Conversion\\Cron\\CronSchedulesGenerator' => $baseDir . '/src/Conversion/Cron/CronSchedulesGenerator.php', + 'WebpConverter\\Conversion\\Cron\\CronStatusManager' => $baseDir . '/src/Conversion/Cron/CronStatusManager.php', + 'WebpConverter\\Conversion\\Cron\\CronStatusViewer' => $baseDir . '/src/Conversion/Cron/CronStatusViewer.php', + 'WebpConverter\\Conversion\\DirectoryFilesFinder' => $baseDir . '/src/Conversion/DirectoryFilesFinder.php', + 'WebpConverter\\Conversion\\Directory\\DirectoryAbstract' => $baseDir . '/src/Conversion/Directory/DirectoryAbstract.php', + 'WebpConverter\\Conversion\\Directory\\DirectoryFactory' => $baseDir . '/src/Conversion/Directory/DirectoryFactory.php', + 'WebpConverter\\Conversion\\Directory\\DirectoryIntegrator' => $baseDir . '/src/Conversion/Directory/DirectoryIntegrator.php', + 'WebpConverter\\Conversion\\Directory\\DirectoryInterface' => $baseDir . '/src/Conversion/Directory/DirectoryInterface.php', + 'WebpConverter\\Conversion\\Directory\\SourceDirectory' => $baseDir . '/src/Conversion/Directory/SourceDirectory.php', + 'WebpConverter\\Conversion\\Directory\\UploadsDirectory' => $baseDir . '/src/Conversion/Directory/UploadsDirectory.php', + 'WebpConverter\\Conversion\\Directory\\UploadsWebpcDirectory' => $baseDir . '/src/Conversion/Directory/UploadsWebpcDirectory.php', + 'WebpConverter\\Conversion\\Endpoint\\CronConversionEndpoint' => $baseDir . '/src/Conversion/Endpoint/CronConversionEndpoint.php', + 'WebpConverter\\Conversion\\Endpoint\\EndpointAbstract' => $baseDir . '/src/Conversion/Endpoint/EndpointAbstract.php', + 'WebpConverter\\Conversion\\Endpoint\\EndpointIntegrator' => $baseDir . '/src/Conversion/Endpoint/EndpointIntegrator.php', + 'WebpConverter\\Conversion\\Endpoint\\EndpointInterface' => $baseDir . '/src/Conversion/Endpoint/EndpointInterface.php', + 'WebpConverter\\Conversion\\Endpoint\\FilesStatsEndpoint' => $baseDir . '/src/Conversion/Endpoint/FilesStatsEndpoint.php', + 'WebpConverter\\Conversion\\Endpoint\\PathsEndpoint' => $baseDir . '/src/Conversion/Endpoint/PathsEndpoint.php', + 'WebpConverter\\Conversion\\Endpoint\\RegenerateAttachmentEndpoint' => $baseDir . '/src/Conversion/Endpoint/RegenerateAttachmentEndpoint.php', + 'WebpConverter\\Conversion\\Endpoint\\RegenerateEndpoint' => $baseDir . '/src/Conversion/Endpoint/RegenerateEndpoint.php', + 'WebpConverter\\Conversion\\ExcludedPathsOperator' => $baseDir . '/src/Conversion/ExcludedPathsOperator.php', + 'WebpConverter\\Conversion\\FilesTreeFinder' => $baseDir . '/src/Conversion/FilesTreeFinder.php', + 'WebpConverter\\Conversion\\Format\\AvifFormat' => $baseDir . '/src/Conversion/Format/AvifFormat.php', + 'WebpConverter\\Conversion\\Format\\FormatAbstract' => $baseDir . '/src/Conversion/Format/FormatAbstract.php', + 'WebpConverter\\Conversion\\Format\\FormatFactory' => $baseDir . '/src/Conversion/Format/FormatFactory.php', + 'WebpConverter\\Conversion\\Format\\FormatInterface' => $baseDir . '/src/Conversion/Format/FormatInterface.php', + 'WebpConverter\\Conversion\\Format\\WebpFormat' => $baseDir . '/src/Conversion/Format/WebpFormat.php', + 'WebpConverter\\Conversion\\LargerFilesOperator' => $baseDir . '/src/Conversion/LargerFilesOperator.php', + 'WebpConverter\\Conversion\\Method\\GdMethod' => $baseDir . '/src/Conversion/Method/GdMethod.php', + 'WebpConverter\\Conversion\\Method\\ImagickMethod' => $baseDir . '/src/Conversion/Method/ImagickMethod.php', + 'WebpConverter\\Conversion\\Method\\LibraryMethodAbstract' => $baseDir . '/src/Conversion/Method/LibraryMethodAbstract.php', + 'WebpConverter\\Conversion\\Method\\LibraryMethodInterface' => $baseDir . '/src/Conversion/Method/LibraryMethodInterface.php', + 'WebpConverter\\Conversion\\Method\\MethodAbstract' => $baseDir . '/src/Conversion/Method/MethodAbstract.php', + 'WebpConverter\\Conversion\\Method\\MethodFactory' => $baseDir . '/src/Conversion/Method/MethodFactory.php', + 'WebpConverter\\Conversion\\Method\\MethodIntegrator' => $baseDir . '/src/Conversion/Method/MethodIntegrator.php', + 'WebpConverter\\Conversion\\Method\\MethodInterface' => $baseDir . '/src/Conversion/Method/MethodInterface.php', + 'WebpConverter\\Conversion\\Method\\RemoteMethod' => $baseDir . '/src/Conversion/Method/RemoteMethod.php', + 'WebpConverter\\Conversion\\OutputPathGenerator' => $baseDir . '/src/Conversion/OutputPathGenerator.php', + 'WebpConverter\\Conversion\\PathsFinder' => $baseDir . '/src/Conversion/PathsFinder.php', + 'WebpConverter\\Error\\Detector\\CloudflareStatusDetector' => $baseDir . '/src/Error/Detector/CloudflareStatusDetector.php', + 'WebpConverter\\Error\\Detector\\CurlLibraryDetector' => $baseDir . '/src/Error/Detector/CurlLibraryDetector.php', + 'WebpConverter\\Error\\Detector\\DetectorInterface' => $baseDir . '/src/Error/Detector/DetectorInterface.php', + 'WebpConverter\\Error\\Detector\\LibsNotInstalledDetector' => $baseDir . '/src/Error/Detector/LibsNotInstalledDetector.php', + 'WebpConverter\\Error\\Detector\\LibsWithoutWebpSupportDetector' => $baseDir . '/src/Error/Detector/LibsWithoutWebpSupportDetector.php', + 'WebpConverter\\Error\\Detector\\PassthruExecutionDetector' => $baseDir . '/src/Error/Detector/PassthruExecutionDetector.php', + 'WebpConverter\\Error\\Detector\\PathsErrorsDetector' => $baseDir . '/src/Error/Detector/PathsErrorsDetector.php', + 'WebpConverter\\Error\\Detector\\RewritesErrorsDetector' => $baseDir . '/src/Error/Detector/RewritesErrorsDetector.php', + 'WebpConverter\\Error\\Detector\\SettingsIncorrectDetector' => $baseDir . '/src/Error/Detector/SettingsIncorrectDetector.php', + 'WebpConverter\\Error\\Detector\\TokenStatusDetector' => $baseDir . '/src/Error/Detector/TokenStatusDetector.php', + 'WebpConverter\\Error\\Detector\\UnsupportedServerDetector' => $baseDir . '/src/Error/Detector/UnsupportedServerDetector.php', + 'WebpConverter\\Error\\ErrorDetectorAggregator' => $baseDir . '/src/Error/ErrorDetectorAggregator.php', + 'WebpConverter\\Error\\Notice\\AccessTokenInvalidNotice' => $baseDir . '/src/Error/Notice/AccessTokenInvalidNotice.php', + 'WebpConverter\\Error\\Notice\\ApiLimitExceededNotice' => $baseDir . '/src/Error/Notice/ApiLimitExceededNotice.php', + 'WebpConverter\\Error\\Notice\\BypassingApacheNotice' => $baseDir . '/src/Error/Notice/BypassingApacheNotice.php', + 'WebpConverter\\Error\\Notice\\CloudflareSettingsIncorrectNotice' => $baseDir . '/src/Error/Notice/CloudflareSettingsIncorrectNotice.php', + 'WebpConverter\\Error\\Notice\\CurlFunctionDisabledNotice' => $baseDir . '/src/Error/Notice/CurlFunctionDisabledNotice.php', + 'WebpConverter\\Error\\Notice\\LibsNotInstalledNotice' => $baseDir . '/src/Error/Notice/LibsNotInstalledNotice.php', + 'WebpConverter\\Error\\Notice\\LibsWithoutWebpSupportNotice' => $baseDir . '/src/Error/Notice/LibsWithoutWebpSupportNotice.php', + 'WebpConverter\\Error\\Notice\\NoticeInterface' => $baseDir . '/src/Error/Notice/NoticeInterface.php', + 'WebpConverter\\Error\\Notice\\PassthruExecutionNotice' => $baseDir . '/src/Error/Notice/PassthruExecutionNotice.php', + 'WebpConverter\\Error\\Notice\\PassthruNotWorkingNotice' => $baseDir . '/src/Error/Notice/PassthruNotWorkingNotice.php', + 'WebpConverter\\Error\\Notice\\PathHtaccessNotWritableNotice' => $baseDir . '/src/Error/Notice/PathHtaccessNotWritableNotice.php', + 'WebpConverter\\Error\\Notice\\PathUploadsUnavailableNotice' => $baseDir . '/src/Error/Notice/PathUploadsUnavailableNotice.php', + 'WebpConverter\\Error\\Notice\\PathWebpDuplicatedNotice' => $baseDir . '/src/Error/Notice/PathWebpDuplicatedNotice.php', + 'WebpConverter\\Error\\Notice\\PathWebpNotWritableNotice' => $baseDir . '/src/Error/Notice/PathWebpNotWritableNotice.php', + 'WebpConverter\\Error\\Notice\\RewritesCachedNotice' => $baseDir . '/src/Error/Notice/RewritesCachedNotice.php', + 'WebpConverter\\Error\\Notice\\RewritesNotExecutedNotice' => $baseDir . '/src/Error/Notice/RewritesNotExecutedNotice.php', + 'WebpConverter\\Error\\Notice\\RewritesNotWorkingNotice' => $baseDir . '/src/Error/Notice/RewritesNotWorkingNotice.php', + 'WebpConverter\\Error\\Notice\\RewritesUploadsBlockedNotice' => $baseDir . '/src/Error/Notice/RewritesUploadsBlockedNotice.php', + 'WebpConverter\\Error\\Notice\\SettingsIncorrectNotice' => $baseDir . '/src/Error/Notice/SettingsIncorrectNotice.php', + 'WebpConverter\\Error\\Notice\\UnsupportedPlaygroundServerNotice' => $baseDir . '/src/Error/Notice/UnsupportedPlaygroundServerNotice.php', + 'WebpConverter\\Exception\\ConversionErrorException' => $baseDir . '/src/Exception/ConversionErrorException.php', + 'WebpConverter\\Exception\\ExceptionAbstract' => $baseDir . '/src/Exception/ExceptionAbstract.php', + 'WebpConverter\\Exception\\ExceptionInterface' => $baseDir . '/src/Exception/ExceptionInterface.php', + 'WebpConverter\\Exception\\ExtensionUnsupportedException' => $baseDir . '/src/Exception/ExtensionUnsupportedException.php', + 'WebpConverter\\Exception\\FilesizeOversizeException' => $baseDir . '/src/Exception/FilesizeOversizeException.php', + 'WebpConverter\\Exception\\FunctionUnavailableException' => $baseDir . '/src/Exception/FunctionUnavailableException.php', + 'WebpConverter\\Exception\\ImageAnimatedException' => $baseDir . '/src/Exception/ImageAnimatedException.php', + 'WebpConverter\\Exception\\ImageInvalidException' => $baseDir . '/src/Exception/ImageInvalidException.php', + 'WebpConverter\\Exception\\ImagickNotSupportWebpException' => $baseDir . '/src/Exception/ImagickNotSupportWebpException.php', + 'WebpConverter\\Exception\\ImagickUnavailableException' => $baseDir . '/src/Exception/ImagickUnavailableException.php', + 'WebpConverter\\Exception\\LargerThanOriginalException' => $baseDir . '/src/Exception/LargerThanOriginalException.php', + 'WebpConverter\\Exception\\OutputPathException' => $baseDir . '/src/Exception/OutputPathException.php', + 'WebpConverter\\Exception\\RemoteErrorResponseException' => $baseDir . '/src/Exception/RemoteErrorResponseException.php', + 'WebpConverter\\Exception\\RemoteRequestException' => $baseDir . '/src/Exception/RemoteRequestException.php', + 'WebpConverter\\Exception\\ResolutionOversizeException' => $baseDir . '/src/Exception/ResolutionOversizeException.php', + 'WebpConverter\\Exception\\ServerConfigurationException' => $baseDir . '/src/Exception/ServerConfigurationException.php', + 'WebpConverter\\Exception\\SourcePathException' => $baseDir . '/src/Exception/SourcePathException.php', + 'WebpConverter\\HookableInterface' => $baseDir . '/src/HookableInterface.php', + 'WebpConverter\\Loader\\HtaccessBypassingLoader' => $baseDir . '/src/Loader/HtaccessBypassingLoader.php', + 'WebpConverter\\Loader\\HtaccessLoader' => $baseDir . '/src/Loader/HtaccessLoader.php', + 'WebpConverter\\Loader\\LoaderAbstract' => $baseDir . '/src/Loader/LoaderAbstract.php', + 'WebpConverter\\Loader\\LoaderIntegrator' => $baseDir . '/src/Loader/LoaderIntegrator.php', + 'WebpConverter\\Loader\\LoaderInterface' => $baseDir . '/src/Loader/LoaderInterface.php', + 'WebpConverter\\Loader\\PassthruLoader' => $baseDir . '/src/Loader/PassthruLoader.php', + 'WebpConverter\\Model\\Token' => $baseDir . '/src/Model/Token.php', + 'WebpConverter\\Notice\\BlackFridayNotice' => $baseDir . '/src/Notice/BlackFridayNotice.php', + 'WebpConverter\\Notice\\CloudflareNotice' => $baseDir . '/src/Notice/CloudflareNotice.php', + 'WebpConverter\\Notice\\NoticeAbstract' => $baseDir . '/src/Notice/NoticeAbstract.php', + 'WebpConverter\\Notice\\NoticeIntegrator' => $baseDir . '/src/Notice/NoticeIntegrator.php', + 'WebpConverter\\Notice\\NoticeInterface' => $baseDir . '/src/Notice/NoticeInterface.php', + 'WebpConverter\\Notice\\ThanksNotice' => $baseDir . '/src/Notice/ThanksNotice.php', + 'WebpConverter\\Notice\\TokenInactiveNotice' => $baseDir . '/src/Notice/TokenInactiveNotice.php', + 'WebpConverter\\Notice\\UpgradeNotice' => $baseDir . '/src/Notice/UpgradeNotice.php', + 'WebpConverter\\Notice\\WelcomeNotice' => $baseDir . '/src/Notice/WelcomeNotice.php', + 'WebpConverter\\PluginData' => $baseDir . '/src/PluginData.php', + 'WebpConverter\\PluginInfo' => $baseDir . '/src/PluginInfo.php', + 'WebpConverter\\Plugin\\ActivationHandler' => $baseDir . '/src/Plugin/ActivationHandler.php', + 'WebpConverter\\Plugin\\Activation\\OutputDirectoryGenerator' => $baseDir . '/src/Plugin/Activation/OutputDirectoryGenerator.php', + 'WebpConverter\\Plugin\\Activation\\PluginSettingsManager' => $baseDir . '/src/Plugin/Activation/PluginSettingsManager.php', + 'WebpConverter\\Plugin\\DeactivationHandler' => $baseDir . '/src/Plugin/DeactivationHandler.php', + 'WebpConverter\\Plugin\\Deactivation\\CronManager' => $baseDir . '/src/Plugin/Deactivation/CronManager.php', + 'WebpConverter\\Plugin\\Deactivation\\PluginSettingsManager' => $baseDir . '/src/Plugin/Deactivation/PluginSettingsManager.php', + 'WebpConverter\\Plugin\\PluginLinksGenerator' => $baseDir . '/src/Plugin/PluginLinksGenerator.php', + 'WebpConverter\\Plugin\\UninstallHandler' => $baseDir . '/src/Plugin/UninstallHandler.php', + 'WebpConverter\\Plugin\\Uninstall\\DebugFilesRemover' => $baseDir . '/src/Plugin/Uninstall/DebugFilesRemover.php', + 'WebpConverter\\Plugin\\Uninstall\\OutputFilesRemover' => $baseDir . '/src/Plugin/Uninstall/OutputFilesRemover.php', + 'WebpConverter\\Plugin\\Uninstall\\PluginSettingsManager' => $baseDir . '/src/Plugin/Uninstall/PluginSettingsManager.php', + 'WebpConverter\\Repository\\TokenRepository' => $baseDir . '/src/Repository/TokenRepository.php', + 'WebpConverter\\Service\\BackupExcluder' => $baseDir . '/src/Service/BackupExcluder.php', + 'WebpConverter\\Service\\CacheIntegrator' => $baseDir . '/src/Service/CacheIntegrator.php', + 'WebpConverter\\Service\\CloudflareConfigurator' => $baseDir . '/src/Service/CloudflareConfigurator.php', + 'WebpConverter\\Service\\DeactivationModalLoader' => $baseDir . '/src/Service/DeactivationModalLoader.php', + 'WebpConverter\\Service\\EnvDetector' => $baseDir . '/src/Service/EnvDetector.php', + 'WebpConverter\\Service\\FileLoader' => $baseDir . '/src/Service/FileLoader.php', + 'WebpConverter\\Service\\MediaStatusViewer' => $baseDir . '/src/Service/MediaStatusViewer.php', + 'WebpConverter\\Service\\OptionsAccessManager' => $baseDir . '/src/Service/OptionsAccessManager.php', + 'WebpConverter\\Service\\PathsGenerator' => $baseDir . '/src/Service/PathsGenerator.php', + 'WebpConverter\\Service\\RestApiUnlocker' => $baseDir . '/src/Service/RestApiUnlocker.php', + 'WebpConverter\\Service\\ServerConfigurator' => $baseDir . '/src/Service/ServerConfigurator.php', + 'WebpConverter\\Service\\SiteHealthDetector' => $baseDir . '/src/Service/SiteHealthDetector.php', + 'WebpConverter\\Service\\StatsManager' => $baseDir . '/src/Service/StatsManager.php', + 'WebpConverter\\Service\\TokenValidator' => $baseDir . '/src/Service/TokenValidator.php', + 'WebpConverter\\Service\\ViewLoader' => $baseDir . '/src/Service/ViewLoader.php', + 'WebpConverter\\Service\\WpCliManager' => $baseDir . '/src/Service/WpCliManager.php', + 'WebpConverter\\Settings\\AdminAssetsLoader' => $baseDir . '/src/Settings/AdminAssetsLoader.php', + 'WebpConverter\\Settings\\Option\\AccessTokenOption' => $baseDir . '/src/Settings/Option/AccessTokenOption.php', + 'WebpConverter\\Settings\\Option\\AutoConversionOption' => $baseDir . '/src/Settings/Option/AutoConversionOption.php', + 'WebpConverter\\Settings\\Option\\CloudflareApiTokenOption' => $baseDir . '/src/Settings/Option/CloudflareApiTokenOption.php', + 'WebpConverter\\Settings\\Option\\CloudflareZoneIdOption' => $baseDir . '/src/Settings/Option/CloudflareZoneIdOption.php', + 'WebpConverter\\Settings\\Option\\ConversionMethodOption' => $baseDir . '/src/Settings/Option/ConversionMethodOption.php', + 'WebpConverter\\Settings\\Option\\ExcludedDirectoriesOption' => $baseDir . '/src/Settings/Option/ExcludedDirectoriesOption.php', + 'WebpConverter\\Settings\\Option\\ExtraFeaturesOption' => $baseDir . '/src/Settings/Option/ExtraFeaturesOption.php', + 'WebpConverter\\Settings\\Option\\HtaccessRewriteOutputOption' => $baseDir . '/src/Settings/Option/HtaccessRewriteOutputOption.php', + 'WebpConverter\\Settings\\Option\\HtaccessRewritePathOption' => $baseDir . '/src/Settings/Option/HtaccessRewritePathOption.php', + 'WebpConverter\\Settings\\Option\\HtaccessRewriteRootOption' => $baseDir . '/src/Settings/Option/HtaccessRewriteRootOption.php', + 'WebpConverter\\Settings\\Option\\ImageResizeOption' => $baseDir . '/src/Settings/Option/ImageResizeOption.php', + 'WebpConverter\\Settings\\Option\\ImagesQualityOption' => $baseDir . '/src/Settings/Option/ImagesQualityOption.php', + 'WebpConverter\\Settings\\Option\\LoaderTypeOption' => $baseDir . '/src/Settings/Option/LoaderTypeOption.php', + 'WebpConverter\\Settings\\Option\\MediaStatsOption' => $baseDir . '/src/Settings/Option/MediaStatsOption.php', + 'WebpConverter\\Settings\\Option\\OptionAbstract' => $baseDir . '/src/Settings/Option/OptionAbstract.php', + 'WebpConverter\\Settings\\Option\\OptionIntegrator' => $baseDir . '/src/Settings/Option/OptionIntegrator.php', + 'WebpConverter\\Settings\\Option\\OptionInterface' => $baseDir . '/src/Settings/Option/OptionInterface.php', + 'WebpConverter\\Settings\\Option\\OptionsAggregator' => $baseDir . '/src/Settings/Option/OptionsAggregator.php', + 'WebpConverter\\Settings\\Option\\OutputFormatsOption' => $baseDir . '/src/Settings/Option/OutputFormatsOption.php', + 'WebpConverter\\Settings\\Option\\RewriteInheritanceOption' => $baseDir . '/src/Settings/Option/RewriteInheritanceOption.php', + 'WebpConverter\\Settings\\Option\\ServiceModeOption' => $baseDir . '/src/Settings/Option/ServiceModeOption.php', + 'WebpConverter\\Settings\\Option\\SupportedDirectoriesOption' => $baseDir . '/src/Settings/Option/SupportedDirectoriesOption.php', + 'WebpConverter\\Settings\\Option\\SupportedExtensionsOption' => $baseDir . '/src/Settings/Option/SupportedExtensionsOption.php', + 'WebpConverter\\Settings\\OptionsManager' => $baseDir . '/src/Settings/OptionsManager.php', + 'WebpConverter\\Settings\\Page\\AdvancedSettingsPage' => $baseDir . '/src/Settings/Page/AdvancedSettingsPage.php', + 'WebpConverter\\Settings\\Page\\BulkOptimizationPage' => $baseDir . '/src/Settings/Page/BulkOptimizationPage.php', + 'WebpConverter\\Settings\\Page\\CdnSettingsPage' => $baseDir . '/src/Settings/Page/CdnSettingsPage.php', + 'WebpConverter\\Settings\\Page\\DebugPage' => $baseDir . '/src/Settings/Page/DebugPage.php', + 'WebpConverter\\Settings\\Page\\ExpertSettingsPage' => $baseDir . '/src/Settings/Page/ExpertSettingsPage.php', + 'WebpConverter\\Settings\\Page\\GeneralSettingsPage' => $baseDir . '/src/Settings/Page/GeneralSettingsPage.php', + 'WebpConverter\\Settings\\Page\\PageAbstract' => $baseDir . '/src/Settings/Page/PageAbstract.php', + 'WebpConverter\\Settings\\Page\\PageIntegrator' => $baseDir . '/src/Settings/Page/PageIntegrator.php', + 'WebpConverter\\Settings\\Page\\PageInterface' => $baseDir . '/src/Settings/Page/PageInterface.php', + 'WebpConverter\\Settings\\SettingsManager' => $baseDir . '/src/Settings/SettingsManager.php', + 'WebpConverter\\WebpConverter' => $baseDir . '/src/WebpConverter.php', + 'WebpConverter\\WebpConverterConstants' => $baseDir . '/src/WebpConverterConstants.php', +); diff --git a/wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_namespaces.php b/wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_namespaces.php new file mode 100755 index 00000000..15a2ff3a --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($baseDir . '/src'), +); diff --git a/wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_real.php b/wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_real.php new file mode 100755 index 00000000..07604a4a --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_real.php @@ -0,0 +1,36 @@ +register(true); + + return $loader; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_static.php b/wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_static.php new file mode 100755 index 00000000..19e42da3 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor/composer/autoload_static.php @@ -0,0 +1,229 @@ + + array ( + 'WebpConverter\\' => 14, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'WebpConverter\\' => + array ( + 0 => __DIR__ . '/../..' . '/src', + ), + ); + + public static $classMap = array ( + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Exception\\DuplicatedFormOptionKeyException' => __DIR__ . '/../..' . '/vendor_prefixed/src/Exception/DuplicatedFormOptionKeyException.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Exception\\DuplicatedFormValueKeyException' => __DIR__ . '/../..' . '/vendor_prefixed/src/Exception/DuplicatedFormValueKeyException.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Exception\\UnknownFormOptionKeyException' => __DIR__ . '/../..' . '/vendor_prefixed/src/Exception/UnknownFormOptionKeyException.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Hookable' => __DIR__ . '/../..' . '/vendor_prefixed/src/Hookable.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Modal' => __DIR__ . '/../..' . '/vendor_prefixed/src/Modal.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Model\\FormOption' => __DIR__ . '/../..' . '/vendor_prefixed/src/Model/FormOption.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Model\\FormOptions' => __DIR__ . '/../..' . '/vendor_prefixed/src/Model/FormOptions.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Model\\FormTemplate' => __DIR__ . '/../..' . '/vendor_prefixed/src/Model/FormTemplate.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Model\\FormValue' => __DIR__ . '/../..' . '/vendor_prefixed/src/Model/FormValue.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Model\\FormValues' => __DIR__ . '/../..' . '/vendor_prefixed/src/Model/FormValues.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Model\\RequestData' => __DIR__ . '/../..' . '/vendor_prefixed/src/Model/RequestData.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Service\\AssetsPrinterService' => __DIR__ . '/../..' . '/vendor_prefixed/src/Service/AssetsPrinterService.php', + 'WebpConverterVendor\\MattPlugins\\DeactivationModal\\Service\\TemplateGeneratorService' => __DIR__ . '/../..' . '/vendor_prefixed/src/Service/TemplateGeneratorService.php', + 'WebpConverter\\Action\\ConvertAttachmentAction' => __DIR__ . '/../..' . '/src/Action/ConvertAttachmentAction.php', + 'WebpConverter\\Action\\ConvertPathsAction' => __DIR__ . '/../..' . '/src/Action/ConvertPathsAction.php', + 'WebpConverter\\Action\\DeleteFileHandler' => __DIR__ . '/../..' . '/src/Action/DeleteFileHandler.php', + 'WebpConverter\\Action\\DeletePathsAction' => __DIR__ . '/../..' . '/src/Action/DeletePathsAction.php', + 'WebpConverter\\Action\\UploadFileHandler' => __DIR__ . '/../..' . '/src/Action/UploadFileHandler.php', + 'WebpConverter\\Conversion\\AttachmentPathsGenerator' => __DIR__ . '/../..' . '/src/Conversion/AttachmentPathsGenerator.php', + 'WebpConverter\\Conversion\\CrashedFilesOperator' => __DIR__ . '/../..' . '/src/Conversion/CrashedFilesOperator.php', + 'WebpConverter\\Conversion\\Cron\\CronEventGenerator' => __DIR__ . '/../..' . '/src/Conversion/Cron/CronEventGenerator.php', + 'WebpConverter\\Conversion\\Cron\\CronInitiator' => __DIR__ . '/../..' . '/src/Conversion/Cron/CronInitiator.php', + 'WebpConverter\\Conversion\\Cron\\CronSchedulesGenerator' => __DIR__ . '/../..' . '/src/Conversion/Cron/CronSchedulesGenerator.php', + 'WebpConverter\\Conversion\\Cron\\CronStatusManager' => __DIR__ . '/../..' . '/src/Conversion/Cron/CronStatusManager.php', + 'WebpConverter\\Conversion\\Cron\\CronStatusViewer' => __DIR__ . '/../..' . '/src/Conversion/Cron/CronStatusViewer.php', + 'WebpConverter\\Conversion\\DirectoryFilesFinder' => __DIR__ . '/../..' . '/src/Conversion/DirectoryFilesFinder.php', + 'WebpConverter\\Conversion\\Directory\\DirectoryAbstract' => __DIR__ . '/../..' . '/src/Conversion/Directory/DirectoryAbstract.php', + 'WebpConverter\\Conversion\\Directory\\DirectoryFactory' => __DIR__ . '/../..' . '/src/Conversion/Directory/DirectoryFactory.php', + 'WebpConverter\\Conversion\\Directory\\DirectoryIntegrator' => __DIR__ . '/../..' . '/src/Conversion/Directory/DirectoryIntegrator.php', + 'WebpConverter\\Conversion\\Directory\\DirectoryInterface' => __DIR__ . '/../..' . '/src/Conversion/Directory/DirectoryInterface.php', + 'WebpConverter\\Conversion\\Directory\\SourceDirectory' => __DIR__ . '/../..' . '/src/Conversion/Directory/SourceDirectory.php', + 'WebpConverter\\Conversion\\Directory\\UploadsDirectory' => __DIR__ . '/../..' . '/src/Conversion/Directory/UploadsDirectory.php', + 'WebpConverter\\Conversion\\Directory\\UploadsWebpcDirectory' => __DIR__ . '/../..' . '/src/Conversion/Directory/UploadsWebpcDirectory.php', + 'WebpConverter\\Conversion\\Endpoint\\CronConversionEndpoint' => __DIR__ . '/../..' . '/src/Conversion/Endpoint/CronConversionEndpoint.php', + 'WebpConverter\\Conversion\\Endpoint\\EndpointAbstract' => __DIR__ . '/../..' . '/src/Conversion/Endpoint/EndpointAbstract.php', + 'WebpConverter\\Conversion\\Endpoint\\EndpointIntegrator' => __DIR__ . '/../..' . '/src/Conversion/Endpoint/EndpointIntegrator.php', + 'WebpConverter\\Conversion\\Endpoint\\EndpointInterface' => __DIR__ . '/../..' . '/src/Conversion/Endpoint/EndpointInterface.php', + 'WebpConverter\\Conversion\\Endpoint\\FilesStatsEndpoint' => __DIR__ . '/../..' . '/src/Conversion/Endpoint/FilesStatsEndpoint.php', + 'WebpConverter\\Conversion\\Endpoint\\PathsEndpoint' => __DIR__ . '/../..' . '/src/Conversion/Endpoint/PathsEndpoint.php', + 'WebpConverter\\Conversion\\Endpoint\\RegenerateAttachmentEndpoint' => __DIR__ . '/../..' . '/src/Conversion/Endpoint/RegenerateAttachmentEndpoint.php', + 'WebpConverter\\Conversion\\Endpoint\\RegenerateEndpoint' => __DIR__ . '/../..' . '/src/Conversion/Endpoint/RegenerateEndpoint.php', + 'WebpConverter\\Conversion\\ExcludedPathsOperator' => __DIR__ . '/../..' . '/src/Conversion/ExcludedPathsOperator.php', + 'WebpConverter\\Conversion\\FilesTreeFinder' => __DIR__ . '/../..' . '/src/Conversion/FilesTreeFinder.php', + 'WebpConverter\\Conversion\\Format\\AvifFormat' => __DIR__ . '/../..' . '/src/Conversion/Format/AvifFormat.php', + 'WebpConverter\\Conversion\\Format\\FormatAbstract' => __DIR__ . '/../..' . '/src/Conversion/Format/FormatAbstract.php', + 'WebpConverter\\Conversion\\Format\\FormatFactory' => __DIR__ . '/../..' . '/src/Conversion/Format/FormatFactory.php', + 'WebpConverter\\Conversion\\Format\\FormatInterface' => __DIR__ . '/../..' . '/src/Conversion/Format/FormatInterface.php', + 'WebpConverter\\Conversion\\Format\\WebpFormat' => __DIR__ . '/../..' . '/src/Conversion/Format/WebpFormat.php', + 'WebpConverter\\Conversion\\LargerFilesOperator' => __DIR__ . '/../..' . '/src/Conversion/LargerFilesOperator.php', + 'WebpConverter\\Conversion\\Method\\GdMethod' => __DIR__ . '/../..' . '/src/Conversion/Method/GdMethod.php', + 'WebpConverter\\Conversion\\Method\\ImagickMethod' => __DIR__ . '/../..' . '/src/Conversion/Method/ImagickMethod.php', + 'WebpConverter\\Conversion\\Method\\LibraryMethodAbstract' => __DIR__ . '/../..' . '/src/Conversion/Method/LibraryMethodAbstract.php', + 'WebpConverter\\Conversion\\Method\\LibraryMethodInterface' => __DIR__ . '/../..' . '/src/Conversion/Method/LibraryMethodInterface.php', + 'WebpConverter\\Conversion\\Method\\MethodAbstract' => __DIR__ . '/../..' . '/src/Conversion/Method/MethodAbstract.php', + 'WebpConverter\\Conversion\\Method\\MethodFactory' => __DIR__ . '/../..' . '/src/Conversion/Method/MethodFactory.php', + 'WebpConverter\\Conversion\\Method\\MethodIntegrator' => __DIR__ . '/../..' . '/src/Conversion/Method/MethodIntegrator.php', + 'WebpConverter\\Conversion\\Method\\MethodInterface' => __DIR__ . '/../..' . '/src/Conversion/Method/MethodInterface.php', + 'WebpConverter\\Conversion\\Method\\RemoteMethod' => __DIR__ . '/../..' . '/src/Conversion/Method/RemoteMethod.php', + 'WebpConverter\\Conversion\\OutputPathGenerator' => __DIR__ . '/../..' . '/src/Conversion/OutputPathGenerator.php', + 'WebpConverter\\Conversion\\PathsFinder' => __DIR__ . '/../..' . '/src/Conversion/PathsFinder.php', + 'WebpConverter\\Error\\Detector\\CloudflareStatusDetector' => __DIR__ . '/../..' . '/src/Error/Detector/CloudflareStatusDetector.php', + 'WebpConverter\\Error\\Detector\\CurlLibraryDetector' => __DIR__ . '/../..' . '/src/Error/Detector/CurlLibraryDetector.php', + 'WebpConverter\\Error\\Detector\\DetectorInterface' => __DIR__ . '/../..' . '/src/Error/Detector/DetectorInterface.php', + 'WebpConverter\\Error\\Detector\\LibsNotInstalledDetector' => __DIR__ . '/../..' . '/src/Error/Detector/LibsNotInstalledDetector.php', + 'WebpConverter\\Error\\Detector\\LibsWithoutWebpSupportDetector' => __DIR__ . '/../..' . '/src/Error/Detector/LibsWithoutWebpSupportDetector.php', + 'WebpConverter\\Error\\Detector\\PassthruExecutionDetector' => __DIR__ . '/../..' . '/src/Error/Detector/PassthruExecutionDetector.php', + 'WebpConverter\\Error\\Detector\\PathsErrorsDetector' => __DIR__ . '/../..' . '/src/Error/Detector/PathsErrorsDetector.php', + 'WebpConverter\\Error\\Detector\\RewritesErrorsDetector' => __DIR__ . '/../..' . '/src/Error/Detector/RewritesErrorsDetector.php', + 'WebpConverter\\Error\\Detector\\SettingsIncorrectDetector' => __DIR__ . '/../..' . '/src/Error/Detector/SettingsIncorrectDetector.php', + 'WebpConverter\\Error\\Detector\\TokenStatusDetector' => __DIR__ . '/../..' . '/src/Error/Detector/TokenStatusDetector.php', + 'WebpConverter\\Error\\Detector\\UnsupportedServerDetector' => __DIR__ . '/../..' . '/src/Error/Detector/UnsupportedServerDetector.php', + 'WebpConverter\\Error\\ErrorDetectorAggregator' => __DIR__ . '/../..' . '/src/Error/ErrorDetectorAggregator.php', + 'WebpConverter\\Error\\Notice\\AccessTokenInvalidNotice' => __DIR__ . '/../..' . '/src/Error/Notice/AccessTokenInvalidNotice.php', + 'WebpConverter\\Error\\Notice\\ApiLimitExceededNotice' => __DIR__ . '/../..' . '/src/Error/Notice/ApiLimitExceededNotice.php', + 'WebpConverter\\Error\\Notice\\BypassingApacheNotice' => __DIR__ . '/../..' . '/src/Error/Notice/BypassingApacheNotice.php', + 'WebpConverter\\Error\\Notice\\CloudflareSettingsIncorrectNotice' => __DIR__ . '/../..' . '/src/Error/Notice/CloudflareSettingsIncorrectNotice.php', + 'WebpConverter\\Error\\Notice\\CurlFunctionDisabledNotice' => __DIR__ . '/../..' . '/src/Error/Notice/CurlFunctionDisabledNotice.php', + 'WebpConverter\\Error\\Notice\\LibsNotInstalledNotice' => __DIR__ . '/../..' . '/src/Error/Notice/LibsNotInstalledNotice.php', + 'WebpConverter\\Error\\Notice\\LibsWithoutWebpSupportNotice' => __DIR__ . '/../..' . '/src/Error/Notice/LibsWithoutWebpSupportNotice.php', + 'WebpConverter\\Error\\Notice\\NoticeInterface' => __DIR__ . '/../..' . '/src/Error/Notice/NoticeInterface.php', + 'WebpConverter\\Error\\Notice\\PassthruExecutionNotice' => __DIR__ . '/../..' . '/src/Error/Notice/PassthruExecutionNotice.php', + 'WebpConverter\\Error\\Notice\\PassthruNotWorkingNotice' => __DIR__ . '/../..' . '/src/Error/Notice/PassthruNotWorkingNotice.php', + 'WebpConverter\\Error\\Notice\\PathHtaccessNotWritableNotice' => __DIR__ . '/../..' . '/src/Error/Notice/PathHtaccessNotWritableNotice.php', + 'WebpConverter\\Error\\Notice\\PathUploadsUnavailableNotice' => __DIR__ . '/../..' . '/src/Error/Notice/PathUploadsUnavailableNotice.php', + 'WebpConverter\\Error\\Notice\\PathWebpDuplicatedNotice' => __DIR__ . '/../..' . '/src/Error/Notice/PathWebpDuplicatedNotice.php', + 'WebpConverter\\Error\\Notice\\PathWebpNotWritableNotice' => __DIR__ . '/../..' . '/src/Error/Notice/PathWebpNotWritableNotice.php', + 'WebpConverter\\Error\\Notice\\RewritesCachedNotice' => __DIR__ . '/../..' . '/src/Error/Notice/RewritesCachedNotice.php', + 'WebpConverter\\Error\\Notice\\RewritesNotExecutedNotice' => __DIR__ . '/../..' . '/src/Error/Notice/RewritesNotExecutedNotice.php', + 'WebpConverter\\Error\\Notice\\RewritesNotWorkingNotice' => __DIR__ . '/../..' . '/src/Error/Notice/RewritesNotWorkingNotice.php', + 'WebpConverter\\Error\\Notice\\RewritesUploadsBlockedNotice' => __DIR__ . '/../..' . '/src/Error/Notice/RewritesUploadsBlockedNotice.php', + 'WebpConverter\\Error\\Notice\\SettingsIncorrectNotice' => __DIR__ . '/../..' . '/src/Error/Notice/SettingsIncorrectNotice.php', + 'WebpConverter\\Error\\Notice\\UnsupportedPlaygroundServerNotice' => __DIR__ . '/../..' . '/src/Error/Notice/UnsupportedPlaygroundServerNotice.php', + 'WebpConverter\\Exception\\ConversionErrorException' => __DIR__ . '/../..' . '/src/Exception/ConversionErrorException.php', + 'WebpConverter\\Exception\\ExceptionAbstract' => __DIR__ . '/../..' . '/src/Exception/ExceptionAbstract.php', + 'WebpConverter\\Exception\\ExceptionInterface' => __DIR__ . '/../..' . '/src/Exception/ExceptionInterface.php', + 'WebpConverter\\Exception\\ExtensionUnsupportedException' => __DIR__ . '/../..' . '/src/Exception/ExtensionUnsupportedException.php', + 'WebpConverter\\Exception\\FilesizeOversizeException' => __DIR__ . '/../..' . '/src/Exception/FilesizeOversizeException.php', + 'WebpConverter\\Exception\\FunctionUnavailableException' => __DIR__ . '/../..' . '/src/Exception/FunctionUnavailableException.php', + 'WebpConverter\\Exception\\ImageAnimatedException' => __DIR__ . '/../..' . '/src/Exception/ImageAnimatedException.php', + 'WebpConverter\\Exception\\ImageInvalidException' => __DIR__ . '/../..' . '/src/Exception/ImageInvalidException.php', + 'WebpConverter\\Exception\\ImagickNotSupportWebpException' => __DIR__ . '/../..' . '/src/Exception/ImagickNotSupportWebpException.php', + 'WebpConverter\\Exception\\ImagickUnavailableException' => __DIR__ . '/../..' . '/src/Exception/ImagickUnavailableException.php', + 'WebpConverter\\Exception\\LargerThanOriginalException' => __DIR__ . '/../..' . '/src/Exception/LargerThanOriginalException.php', + 'WebpConverter\\Exception\\OutputPathException' => __DIR__ . '/../..' . '/src/Exception/OutputPathException.php', + 'WebpConverter\\Exception\\RemoteErrorResponseException' => __DIR__ . '/../..' . '/src/Exception/RemoteErrorResponseException.php', + 'WebpConverter\\Exception\\RemoteRequestException' => __DIR__ . '/../..' . '/src/Exception/RemoteRequestException.php', + 'WebpConverter\\Exception\\ResolutionOversizeException' => __DIR__ . '/../..' . '/src/Exception/ResolutionOversizeException.php', + 'WebpConverter\\Exception\\ServerConfigurationException' => __DIR__ . '/../..' . '/src/Exception/ServerConfigurationException.php', + 'WebpConverter\\Exception\\SourcePathException' => __DIR__ . '/../..' . '/src/Exception/SourcePathException.php', + 'WebpConverter\\HookableInterface' => __DIR__ . '/../..' . '/src/HookableInterface.php', + 'WebpConverter\\Loader\\HtaccessBypassingLoader' => __DIR__ . '/../..' . '/src/Loader/HtaccessBypassingLoader.php', + 'WebpConverter\\Loader\\HtaccessLoader' => __DIR__ . '/../..' . '/src/Loader/HtaccessLoader.php', + 'WebpConverter\\Loader\\LoaderAbstract' => __DIR__ . '/../..' . '/src/Loader/LoaderAbstract.php', + 'WebpConverter\\Loader\\LoaderIntegrator' => __DIR__ . '/../..' . '/src/Loader/LoaderIntegrator.php', + 'WebpConverter\\Loader\\LoaderInterface' => __DIR__ . '/../..' . '/src/Loader/LoaderInterface.php', + 'WebpConverter\\Loader\\PassthruLoader' => __DIR__ . '/../..' . '/src/Loader/PassthruLoader.php', + 'WebpConverter\\Model\\Token' => __DIR__ . '/../..' . '/src/Model/Token.php', + 'WebpConverter\\Notice\\BlackFridayNotice' => __DIR__ . '/../..' . '/src/Notice/BlackFridayNotice.php', + 'WebpConverter\\Notice\\CloudflareNotice' => __DIR__ . '/../..' . '/src/Notice/CloudflareNotice.php', + 'WebpConverter\\Notice\\NoticeAbstract' => __DIR__ . '/../..' . '/src/Notice/NoticeAbstract.php', + 'WebpConverter\\Notice\\NoticeIntegrator' => __DIR__ . '/../..' . '/src/Notice/NoticeIntegrator.php', + 'WebpConverter\\Notice\\NoticeInterface' => __DIR__ . '/../..' . '/src/Notice/NoticeInterface.php', + 'WebpConverter\\Notice\\ThanksNotice' => __DIR__ . '/../..' . '/src/Notice/ThanksNotice.php', + 'WebpConverter\\Notice\\TokenInactiveNotice' => __DIR__ . '/../..' . '/src/Notice/TokenInactiveNotice.php', + 'WebpConverter\\Notice\\UpgradeNotice' => __DIR__ . '/../..' . '/src/Notice/UpgradeNotice.php', + 'WebpConverter\\Notice\\WelcomeNotice' => __DIR__ . '/../..' . '/src/Notice/WelcomeNotice.php', + 'WebpConverter\\PluginData' => __DIR__ . '/../..' . '/src/PluginData.php', + 'WebpConverter\\PluginInfo' => __DIR__ . '/../..' . '/src/PluginInfo.php', + 'WebpConverter\\Plugin\\ActivationHandler' => __DIR__ . '/../..' . '/src/Plugin/ActivationHandler.php', + 'WebpConverter\\Plugin\\Activation\\OutputDirectoryGenerator' => __DIR__ . '/../..' . '/src/Plugin/Activation/OutputDirectoryGenerator.php', + 'WebpConverter\\Plugin\\Activation\\PluginSettingsManager' => __DIR__ . '/../..' . '/src/Plugin/Activation/PluginSettingsManager.php', + 'WebpConverter\\Plugin\\DeactivationHandler' => __DIR__ . '/../..' . '/src/Plugin/DeactivationHandler.php', + 'WebpConverter\\Plugin\\Deactivation\\CronManager' => __DIR__ . '/../..' . '/src/Plugin/Deactivation/CronManager.php', + 'WebpConverter\\Plugin\\Deactivation\\PluginSettingsManager' => __DIR__ . '/../..' . '/src/Plugin/Deactivation/PluginSettingsManager.php', + 'WebpConverter\\Plugin\\PluginLinksGenerator' => __DIR__ . '/../..' . '/src/Plugin/PluginLinksGenerator.php', + 'WebpConverter\\Plugin\\UninstallHandler' => __DIR__ . '/../..' . '/src/Plugin/UninstallHandler.php', + 'WebpConverter\\Plugin\\Uninstall\\DebugFilesRemover' => __DIR__ . '/../..' . '/src/Plugin/Uninstall/DebugFilesRemover.php', + 'WebpConverter\\Plugin\\Uninstall\\OutputFilesRemover' => __DIR__ . '/../..' . '/src/Plugin/Uninstall/OutputFilesRemover.php', + 'WebpConverter\\Plugin\\Uninstall\\PluginSettingsManager' => __DIR__ . '/../..' . '/src/Plugin/Uninstall/PluginSettingsManager.php', + 'WebpConverter\\Repository\\TokenRepository' => __DIR__ . '/../..' . '/src/Repository/TokenRepository.php', + 'WebpConverter\\Service\\BackupExcluder' => __DIR__ . '/../..' . '/src/Service/BackupExcluder.php', + 'WebpConverter\\Service\\CacheIntegrator' => __DIR__ . '/../..' . '/src/Service/CacheIntegrator.php', + 'WebpConverter\\Service\\CloudflareConfigurator' => __DIR__ . '/../..' . '/src/Service/CloudflareConfigurator.php', + 'WebpConverter\\Service\\DeactivationModalLoader' => __DIR__ . '/../..' . '/src/Service/DeactivationModalLoader.php', + 'WebpConverter\\Service\\EnvDetector' => __DIR__ . '/../..' . '/src/Service/EnvDetector.php', + 'WebpConverter\\Service\\FileLoader' => __DIR__ . '/../..' . '/src/Service/FileLoader.php', + 'WebpConverter\\Service\\MediaStatusViewer' => __DIR__ . '/../..' . '/src/Service/MediaStatusViewer.php', + 'WebpConverter\\Service\\OptionsAccessManager' => __DIR__ . '/../..' . '/src/Service/OptionsAccessManager.php', + 'WebpConverter\\Service\\PathsGenerator' => __DIR__ . '/../..' . '/src/Service/PathsGenerator.php', + 'WebpConverter\\Service\\RestApiUnlocker' => __DIR__ . '/../..' . '/src/Service/RestApiUnlocker.php', + 'WebpConverter\\Service\\ServerConfigurator' => __DIR__ . '/../..' . '/src/Service/ServerConfigurator.php', + 'WebpConverter\\Service\\SiteHealthDetector' => __DIR__ . '/../..' . '/src/Service/SiteHealthDetector.php', + 'WebpConverter\\Service\\StatsManager' => __DIR__ . '/../..' . '/src/Service/StatsManager.php', + 'WebpConverter\\Service\\TokenValidator' => __DIR__ . '/../..' . '/src/Service/TokenValidator.php', + 'WebpConverter\\Service\\ViewLoader' => __DIR__ . '/../..' . '/src/Service/ViewLoader.php', + 'WebpConverter\\Service\\WpCliManager' => __DIR__ . '/../..' . '/src/Service/WpCliManager.php', + 'WebpConverter\\Settings\\AdminAssetsLoader' => __DIR__ . '/../..' . '/src/Settings/AdminAssetsLoader.php', + 'WebpConverter\\Settings\\Option\\AccessTokenOption' => __DIR__ . '/../..' . '/src/Settings/Option/AccessTokenOption.php', + 'WebpConverter\\Settings\\Option\\AutoConversionOption' => __DIR__ . '/../..' . '/src/Settings/Option/AutoConversionOption.php', + 'WebpConverter\\Settings\\Option\\CloudflareApiTokenOption' => __DIR__ . '/../..' . '/src/Settings/Option/CloudflareApiTokenOption.php', + 'WebpConverter\\Settings\\Option\\CloudflareZoneIdOption' => __DIR__ . '/../..' . '/src/Settings/Option/CloudflareZoneIdOption.php', + 'WebpConverter\\Settings\\Option\\ConversionMethodOption' => __DIR__ . '/../..' . '/src/Settings/Option/ConversionMethodOption.php', + 'WebpConverter\\Settings\\Option\\ExcludedDirectoriesOption' => __DIR__ . '/../..' . '/src/Settings/Option/ExcludedDirectoriesOption.php', + 'WebpConverter\\Settings\\Option\\ExtraFeaturesOption' => __DIR__ . '/../..' . '/src/Settings/Option/ExtraFeaturesOption.php', + 'WebpConverter\\Settings\\Option\\HtaccessRewriteOutputOption' => __DIR__ . '/../..' . '/src/Settings/Option/HtaccessRewriteOutputOption.php', + 'WebpConverter\\Settings\\Option\\HtaccessRewritePathOption' => __DIR__ . '/../..' . '/src/Settings/Option/HtaccessRewritePathOption.php', + 'WebpConverter\\Settings\\Option\\HtaccessRewriteRootOption' => __DIR__ . '/../..' . '/src/Settings/Option/HtaccessRewriteRootOption.php', + 'WebpConverter\\Settings\\Option\\ImageResizeOption' => __DIR__ . '/../..' . '/src/Settings/Option/ImageResizeOption.php', + 'WebpConverter\\Settings\\Option\\ImagesQualityOption' => __DIR__ . '/../..' . '/src/Settings/Option/ImagesQualityOption.php', + 'WebpConverter\\Settings\\Option\\LoaderTypeOption' => __DIR__ . '/../..' . '/src/Settings/Option/LoaderTypeOption.php', + 'WebpConverter\\Settings\\Option\\MediaStatsOption' => __DIR__ . '/../..' . '/src/Settings/Option/MediaStatsOption.php', + 'WebpConverter\\Settings\\Option\\OptionAbstract' => __DIR__ . '/../..' . '/src/Settings/Option/OptionAbstract.php', + 'WebpConverter\\Settings\\Option\\OptionIntegrator' => __DIR__ . '/../..' . '/src/Settings/Option/OptionIntegrator.php', + 'WebpConverter\\Settings\\Option\\OptionInterface' => __DIR__ . '/../..' . '/src/Settings/Option/OptionInterface.php', + 'WebpConverter\\Settings\\Option\\OptionsAggregator' => __DIR__ . '/../..' . '/src/Settings/Option/OptionsAggregator.php', + 'WebpConverter\\Settings\\Option\\OutputFormatsOption' => __DIR__ . '/../..' . '/src/Settings/Option/OutputFormatsOption.php', + 'WebpConverter\\Settings\\Option\\RewriteInheritanceOption' => __DIR__ . '/../..' . '/src/Settings/Option/RewriteInheritanceOption.php', + 'WebpConverter\\Settings\\Option\\ServiceModeOption' => __DIR__ . '/../..' . '/src/Settings/Option/ServiceModeOption.php', + 'WebpConverter\\Settings\\Option\\SupportedDirectoriesOption' => __DIR__ . '/../..' . '/src/Settings/Option/SupportedDirectoriesOption.php', + 'WebpConverter\\Settings\\Option\\SupportedExtensionsOption' => __DIR__ . '/../..' . '/src/Settings/Option/SupportedExtensionsOption.php', + 'WebpConverter\\Settings\\OptionsManager' => __DIR__ . '/../..' . '/src/Settings/OptionsManager.php', + 'WebpConverter\\Settings\\Page\\AdvancedSettingsPage' => __DIR__ . '/../..' . '/src/Settings/Page/AdvancedSettingsPage.php', + 'WebpConverter\\Settings\\Page\\BulkOptimizationPage' => __DIR__ . '/../..' . '/src/Settings/Page/BulkOptimizationPage.php', + 'WebpConverter\\Settings\\Page\\CdnSettingsPage' => __DIR__ . '/../..' . '/src/Settings/Page/CdnSettingsPage.php', + 'WebpConverter\\Settings\\Page\\DebugPage' => __DIR__ . '/../..' . '/src/Settings/Page/DebugPage.php', + 'WebpConverter\\Settings\\Page\\ExpertSettingsPage' => __DIR__ . '/../..' . '/src/Settings/Page/ExpertSettingsPage.php', + 'WebpConverter\\Settings\\Page\\GeneralSettingsPage' => __DIR__ . '/../..' . '/src/Settings/Page/GeneralSettingsPage.php', + 'WebpConverter\\Settings\\Page\\PageAbstract' => __DIR__ . '/../..' . '/src/Settings/Page/PageAbstract.php', + 'WebpConverter\\Settings\\Page\\PageIntegrator' => __DIR__ . '/../..' . '/src/Settings/Page/PageIntegrator.php', + 'WebpConverter\\Settings\\Page\\PageInterface' => __DIR__ . '/../..' . '/src/Settings/Page/PageInterface.php', + 'WebpConverter\\Settings\\SettingsManager' => __DIR__ . '/../..' . '/src/Settings/SettingsManager.php', + 'WebpConverter\\WebpConverter' => __DIR__ . '/../..' . '/src/WebpConverter.php', + 'WebpConverter\\WebpConverterConstants' => __DIR__ . '/../..' . '/src/WebpConverterConstants.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit977a71a7bb63d9fc0c8d6b8913a12a29::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit977a71a7bb63d9fc0c8d6b8913a12a29::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit977a71a7bb63d9fc0c8d6b8913a12a29::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/vendor/composer/installed.json b/wp-content/plugins/webp-converter-for-media/vendor/composer/installed.json new file mode 100755 index 00000000..1b8397bc --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor/composer/installed.json @@ -0,0 +1,75 @@ +{ + "packages": [ + { + "name": "matt-plugins/deactivation-modal", + "version": "1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://gitlab.com/matt-plugins/deactivation-modal.git", + "reference": "5f85cb93f2260c7c2626a86ab44e9a4f735664dc" + }, + "dist": { + "type": "zip", + "url": "https://gitlab.com/api/v4/projects/matt-plugins%2Fdeactivation-modal/repository/archive.zip?sha=5f85cb93f2260c7c2626a86ab44e9a4f735664dc", + "reference": "5f85cb93f2260c7c2626a86ab44e9a4f735664dc", + "shasum": "" + }, + "require-dev": { + "10up/wp_mock": "*", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "<7", + "wp-coding-standards/wpcs": "^2.3" + }, + "time": "2024-12-18T21:32:31+00:00", + "type": "library", + "extra": { + "assets-values": { + "plugin-slug": { + "search": "{__PLUGIN_SLUG__}", + "replace": "" + } + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "MattPlugins\\DeactivationModal\\": "src" + } + }, + "scripts": { + "build": [ + "npm install && npm run prod" + ], + "phpcs": [ + "phpcs" + ], + "phpunit-unit": [ + "phpunit --configuration phpunit-unit.xml --coverage-text --colors=never --coverage-html=build-coverage" + ], + "phpunit-unit-fast": [ + "phpunit --configuration phpunit-unit.xml --no-coverage" + ], + "post-install-cmd": [ + "echo #!/bin/sh > .git/hooks/pre-commit", + "echo:>> .git/hooks/pre-commit", + "echo echo \"Building assets...\" >> .git/hooks/pre-commit", + "echo composer run build >> .git/hooks/pre-commit", + "echo git add assets/ >> .git/hooks/pre-commit" + ] + }, + "authors": [ + { + "name": "Mateusz Gbiorczyk", + "email": "mateusz@gbiorczyk.pl" + } + ], + "support": { + "source": "https://gitlab.com/matt-plugins/deactivation-modal/-/tree/1.1.0" + }, + "install-path": "../matt-plugins/deactivation-modal" + } + ], + "dev": false, + "dev-package-names": [] +} diff --git a/wp-content/plugins/webp-converter-for-media/vendor/composer/installed.php b/wp-content/plugins/webp-converter-for-media/vendor/composer/installed.php new file mode 100755 index 00000000..9e76caad --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor/composer/installed.php @@ -0,0 +1,32 @@ + array( + 'name' => 'gbiorczyk/webp-converter-for-media', + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => 'ce2723372b8386c8e62e0ba89fe02680a0c41fd2', + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev' => false, + ), + 'versions' => array( + 'gbiorczyk/webp-converter-for-media' => array( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => 'ce2723372b8386c8e62e0ba89fe02680a0c41fd2', + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'matt-plugins/deactivation-modal' => array( + 'pretty_version' => '1.1.0', + 'version' => '1.1.0.0', + 'reference' => '5f85cb93f2260c7c2626a86ab44e9a4f735664dc', + 'type' => 'library', + 'install_path' => __DIR__ . '/../matt-plugins/deactivation-modal', + 'aliases' => array(), + 'dev_requirement' => false, + ), + ), +); diff --git a/wp-content/plugins/webp-converter-for-media/vendor_prefixed/assets/build/css/styles.css b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/assets/build/css/styles.css new file mode 100755 index 00000000..48ea7a2f --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/assets/build/css/styles.css @@ -0,0 +1 @@ +.mattDeactivationModal[data-matt-deactivation-modal=""] *,.mattDeactivationModal[data-matt-deactivation-modal=""] :after,.mattDeactivationModal[data-matt-deactivation-modal=""] :before{box-sizing:border-box;margin:0;padding:0}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__wrapper{align-items:center;background-color:rgba(0,0,0,.75);display:flex;height:100%;justify-content:center;left:0;position:fixed;top:0;width:100%;z-index:99999}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__form{background-color:#fff;font-size:0;max-height:calc(100vh - 40px);max-width:calc(100vw - 40px);overflow-y:auto;padding:20px 30px;position:relative;width:750px}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__close{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:none;cursor:pointer;font-size:20px;height:40px;position:absolute;right:0;top:0;transition:opacity .3s;width:40px}html[dir=rtl] .mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__close{left:0;right:auto}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__close:hover{opacity:.5}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__headline{align-items:center;background-position:100% 0;background-repeat:no-repeat;background-size:auto 30px;color:#101517;display:flex;font-size:16px;font-weight:600;line-height:1.5;padding:4px 80px 4px 0}html[dir=rtl] .mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__headline{background-position:0 0;padding-left:80px;padding-right:0}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__desc{color:#101517;font-size:14px;line-height:1.5714285714;padding:4px 0}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__notice{border:1px solid #d63638;color:#d63638;font-size:14px;line-height:1.5714285714;margin-bottom:10px;padding:4px 10px}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__options{padding:10px 0}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionInput{display:none}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionLabel{color:#101517;display:inline-block;font-size:14px;line-height:1.5714285714;padding:4px 0 4px 40px;position:relative}html[dir=rtl] .mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionLabel{padding-left:0;padding-right:40px}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionLabel:before{border:1px solid #c3c4c7;border-radius:50%;content:"";height:20px;left:0;position:absolute;top:5px;width:20px}html[dir=rtl] .mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionLabel:before{left:auto;right:0}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionLabel:after{background-color:#2271b1;border-radius:50%;content:"";height:8px;left:6px;position:absolute;top:11px;transform:scale(0);transition:transform .3s;width:8px}html[dir=rtl] .mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionLabel:after{left:auto;right:6px}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionInput:checked+.mattDeactivationModal__optionLabel:after{transform:scale(1)}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionExtra{display:none}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionInput:checked~.mattDeactivationModal__optionExtra{display:block;margin-left:40px}html[dir=rtl] .mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionInput:checked~.mattDeactivationModal__optionExtra{margin-left:0;margin-right:40px}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionMessage{background-color:#f0f0f1;color:#101517;font-size:14px;line-height:1.5714285714;margin:10px 0;padding:9px 15px}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionMessage:last-child{margin-bottom:0}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionBox{background-color:#2271b1;line-height:0;margin:10px 0;padding:0 1px 1px}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionBoxLabel{color:#fff;display:inline-block;font-size:14px;line-height:1.5714285714;margin:0 -1px;padding:9px 15px}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionBoxTextarea{border:1px solid #fff;border-radius:0;box-shadow:none;color:#101517;font-size:14px;line-height:1.5714285714;padding:4px 10px;resize:vertical;width:100%}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionBoxTextarea:-ms-input-placeholder{color:rgba(16,21,23,.75);opacity:1}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionBoxTextarea::placeholder{color:rgba(16,21,23,.75);opacity:1}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__optionBoxTextarea:last-child{margin-bottom:0}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__buttons{display:flex;flex-wrap:wrap;margin:0 -10px}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__button{flex:1;padding:10px}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__buttonInner{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;color:#fff;cursor:pointer;display:block;font-size:14px;line-height:1.5714285714;padding:9px 20px;position:relative;width:100%;z-index:1}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__buttonInner:before{content:"";height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .3s;width:100%;z-index:-1}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__buttonInner:hover:before{opacity:1}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__buttonInner--blue{background-color:#2271b1}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__buttonInner--blue:before{background-color:#135e96}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__buttonInner--gray{background-color:#c3c4c7}.mattDeactivationModal[data-matt-deactivation-modal=""] .mattDeactivationModal__buttonInner--gray:before{background-color:#a7aaad} diff --git a/wp-content/plugins/webp-converter-for-media/vendor_prefixed/assets/build/js/scripts.js b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/assets/build/js/scripts.js new file mode 100755 index 00000000..06faeb9b --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/assets/build/js/scripts.js @@ -0,0 +1 @@ +!function(){"use strict";var t,e={808:function(){function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(e,n){for(var i=0;i"] a[href*="action=deactivate"]'),this.modal_wrapper=document.querySelector('[data-matt-deactivation-modal=""]'),this.button_open&&this.modal_wrapper)return this.button_close=this.modal_wrapper.querySelector("[data-matt-deactivation-modal-button-close]"),this.button_submit=this.modal_wrapper.querySelector("[data-matt-deactivation-modal-button-submit]"),this.button_skip=this.modal_wrapper.querySelector("[data-matt-deactivation-modal-button-skip]"),this.form_wrapper=this.modal_wrapper.querySelector("[data-matt-deactivation-modal-form]"),this.events={open_modal:this.open_modal.bind(this)},this.settings={delay_click_deactivate:10},this.status={is_sent:!1},!0}},{key:"set_events",value:function(){this.button_open.addEventListener("click",this.events.open_modal),this.modal_wrapper.addEventListener("click",this.close_modal.bind(this,!1)),this.button_close.addEventListener("click",this.close_modal.bind(this,!1)),this.button_skip.addEventListener("click",this.close_modal.bind(this,!0)),this.form_wrapper.addEventListener("click",(function(t){t.stopPropagation()})),this.form_wrapper.addEventListener("submit",this.init_form_submission.bind(this))}},{key:"open_modal",value:function(t){t.preventDefault(),this.button_open.removeEventListener("click",this.events.open_modal),this.modal_wrapper.removeAttribute("hidden")}},{key:"close_modal",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;n&&n.preventDefault();var i=this.settings.delay_click_deactivate;this.modal_wrapper.setAttribute("hidden","hidden"),t&&setTimeout((function(){e.button_open.click()}),i)}},{key:"init_form_submission",value:function(t){t.preventDefault(),this.form_wrapper.removeEventListener("submit",this.events.submit_form),this.close_modal(!0),setTimeout(this.submit_form.bind(this),0)}},{key:"submit_form",value:function(){if(!this.status.is_sent){this.status.is_sent=!0;var t=this.form_wrapper.getAttribute("action"),e=new XMLHttpRequest;e.open("POST",t,!0),e.send(new FormData(this.form_wrapper))}}}],i&&e(n.prototype,i),o&&e(n,o),Object.defineProperty(n,"prototype",{writable:!1}),t}();function i(t){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i(t)}function o(t,e){for(var n=0;n=r)&&Object.keys(i.O).every((function(t){return i.O[t](n[u])}))?n.splice(u--,1):(s=!1,r0&&t[c-1][2]>r;c--)t[c]=t[c-1];t[c]=[n,o,r]},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},function(){var t={861:0,33:0};i.O.j=function(e){return 0===t[e]};var e=function(e,n){var o,r,a=n[0],s=n[1],u=n[2],l=0;if(a.some((function(e){return 0!==t[e]}))){for(o in s)i.o(s,o)&&(i.m[o]=s[o]);if(u)var c=u(i)}for(e&&e(n);lplugin_slug = $plugin_slug; + $this->form_template = $form_template; + $this->form_options = $form_options; + $this->form_values = $form_values; + (new AssetsPrinterService($this->plugin_slug))->hooks(); + (new TemplateGeneratorService($this->plugin_slug, $this->form_template, $this->form_options, $this->form_values))->hooks(); + } +} diff --git a/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormOption.php b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormOption.php new file mode 100755 index 00000000..51d0d1b5 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormOption.php @@ -0,0 +1,104 @@ +key = $key; + $this->priority = $priority; + $this->label = $label; + $this->message = $message; + $this->question = $question; + } + public function get_key() : string + { + return $this->key; + } + public function get_priority() : int + { + return $this->priority; + } + /** + * @param int $priority Order priority (ascending). + */ + public function set_priority(int $priority) : self + { + $this->priority = $priority; + return $this; + } + public function get_label() : string + { + return $this->label; + } + /** + * @param string $label Label of the reason option. + */ + public function set_label(string $label) : self + { + $this->label = $label; + return $this; + } + /** + * @return callable|null + */ + public function get_message() + { + return $this->message; + } + /** + * @param string|null $message Message visible after selecting the reason in the form (may contain HTML). + */ + public function set_message(?string $message = null) : self + { + $this->message = $message; + return $this; + } + /** + * @return string|null + */ + public function get_question() + { + return $this->question; + } + /** + * @param string|null $question Label of additional question (visible after selecting the reason in the form). + */ + public function set_question(?string $question = null) : self + { + $this->question = $question; + return $this; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormOptions.php b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormOptions.php new file mode 100755 index 00000000..dd87cc82 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormOptions.php @@ -0,0 +1,73 @@ +options as $option) { + if ($option->get_key() === $new_option->get_key()) { + throw new DuplicatedFormOptionKeyException($new_option->get_key()); + } + } + $this->options[] = $new_option; + return $this; + } + /** + * @param string $option_key . + * + * @throws UnknownFormOptionKeyException + */ + public function delete_option(string $option_key) : self + { + foreach ($this->options as $option_index => $option) { + if ($option->get_key() === $option_key) { + unset($this->options[$option_index]); + return $this; + } + } + throw new UnknownFormOptionKeyException($option_key); + } + /** + * @param string $option_key . + * @param callable $update_callback Example: "function ( FormOption $option ) { }". + * + * @throws UnknownFormOptionKeyException + */ + public function update_option(string $option_key, callable $update_callback) : self + { + foreach ($this->options as $option) { + if ($option->get_key() === $option_key) { + \call_user_func($update_callback, $option); + return $this; + } + } + throw new UnknownFormOptionKeyException($option_key); + } + /** + * @return FormOption[] + */ + public function get_options() : array + { + $options = $this->options; + \usort($options, function (FormOption $option_a, FormOption $option_b) { + return $option_a->get_priority() <=> $option_b->get_priority(); + }); + return $options; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormTemplate.php b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormTemplate.php new file mode 100755 index 00000000..2ed77f41 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormTemplate.php @@ -0,0 +1,86 @@ +api_url = $api_url; + $this->form_title = $form_title; + $this->form_desc = $form_desc; + $this->button_submit_label = $button_submit_label; + $this->button_skip_label = $button_skip_label; + $this->notice_message = $notice_message; + } + public function get_api_url() : string + { + return $this->api_url; + } + public function get_form_title() : string + { + return $this->form_title; + } + public function get_form_desc() : string + { + return $this->form_desc; + } + public function get_button_submit_label() : string + { + return $this->button_submit_label; + } + public function get_button_skip_label() : string + { + return $this->button_skip_label; + } + /** + * @return string|null + */ + public function get_notice_message() + { + return $this->notice_message; + } + public function get_field_name_reason() : string + { + return $this->field_name_reason; + } + public function get_field_name_comment() : string + { + return $this->field_name_comment; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormValue.php b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormValue.php new file mode 100755 index 00000000..4ac76cc2 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormValue.php @@ -0,0 +1,35 @@ +key = $key; + $this->value_callback = $value_callback; + } + public function get_key() : string + { + return $this->key; + } + public function get_value_callback() : callable + { + return $this->value_callback; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormValues.php b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormValues.php new file mode 100755 index 00000000..b6af8c12 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/FormValues.php @@ -0,0 +1,37 @@ +values as $value) { + if ($value->get_key() === $new_value->get_key()) { + throw new DuplicatedFormValueKeyException($new_value->get_key()); + } + } + $this->values[] = $new_value; + return $this; + } + /** + * @return FormValue[] + */ + public function get_values() : array + { + return $this->values; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/RequestData.php b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/RequestData.php new file mode 100755 index 00000000..8f59a4de --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Model/RequestData.php @@ -0,0 +1,75 @@ +plugin_slug = $plugin_slug; + } + public function get_plugin_slug() : string + { + return $this->plugin_slug; + } + public function set_reason_key(?string $reason_key = null) : self + { + $this->reason_key = $reason_key; + return $this; + } + /** + * @return string|null + */ + public function get_reason_key() + { + return $this->reason_key; + } + public function set_additional_info(?string $additional_info = null) : self + { + $this->additional_info = $additional_info; + return $this; + } + /** + * @return string|null + */ + public function get_additional_info() + { + return $this->additional_info; + } + public function set_additional_data(array $additional_data) : self + { + $this->additional_data = $additional_data; + return $this; + } + public function set_additional_data_item(string $data_key, string $data_value) : self + { + $this->additional_data[$data_key] = $data_value; + return $this; + } + public function get_additional_data() : array + { + return $this->additional_data; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Service/AssetsPrinterService.php b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Service/AssetsPrinterService.php new file mode 100755 index 00000000..140587d1 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/src/Service/AssetsPrinterService.php @@ -0,0 +1,55 @@ +plugin_slug = $plugin_slug; + } + /** + * {@inheritdoc} + */ + public function hooks() + { + add_action('admin_print_styles-plugins.php', [$this, 'load_styles']); + add_action('admin_print_footer_scripts-plugins.php', [$this, 'load_scripts']); + } + public function load_styles() + { + ?> + + + + plugin_slug = $plugin_slug; + $this->form_template = $form_template; + $this->form_options = $form_options; + $this->form_values = $form_values; + } + /** + * {@inheritdoc} + */ + public function hooks() + { + add_action('admin_print_footer_scripts-plugins.php', [$this, 'load_template'], 0); + } + public function load_template() + { + $params = ['plugin_slug' => $this->plugin_slug, 'form_template' => $this->form_template, 'form_options' => $this->form_options, 'form_values' => $this->form_values]; + \extract($params); + // phpcs:ignore WordPress.PHP.DontExtract.extract_extract + require_once Modal::MODAL_TEMPLATE_PATH; + } +} diff --git a/wp-content/plugins/webp-converter-for-media/vendor_prefixed/templates/modal.php b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/templates/modal.php new file mode 100755 index 00000000..71bdc411 --- /dev/null +++ b/wp-content/plugins/webp-converter-for-media/vendor_prefixed/templates/modal.php @@ -0,0 +1,164 @@ + + + + + AddType image/avif .avif + AddType image/webp .webp + + + ExpiresActive On + ExpiresByType image/avif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + +# ! --- DO NOT EDIT NEXT LINE --- ! +# END Converter for Media